[
  {
    "path": ".dockerignore",
    "content": ".git\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.idea\n.publish\n*.sublime-workspace\n*.*~\n*.swp\n\n# Node.js package manager\nnode_modules\nnpm-debug.log\ndist\ndist_package\nreleases\nwebogram*.zip\napp/js/templates.js\napp/css\ncldr\ncoverage/\n"
  },
  {
    "path": ".tx/config",
    "content": "[main]\nhost = https://www.transifex.com\n\n[telegram-web.en-usjson]\nfile_filter = app/js/locales/<lang>.json\nlang_map = de:de-de, es:es-es, it:it-it, ru:ru-ru, nl:nl-nl, pt_BR:pt-br\nsource_file = app/js/locales/en-us.json\nsource_lang = en_US\ntype = KEYVALUEJSON\n\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "### 0.7\n* Improved chats search\n* Pinned messages in supergroups and channels\n* Saved messages\n* Improved chat history filters: added audio, links and mentions. Click on message date opens found message in context.\n* Added ability to clean history in private supergroups\n* Supported unread status for video messages\n* Admin badges in supergroups\n* Improved PUSH handling in Chrome\n* [Safari] Voice record is now available\n* [Safari] Improved downloads (files now have names and download automatically)\n\n\n### 0.6.1\n* Fixed networking problems\n* Supported [MTProto v2](https://core.telegram.org/mtproto)\n\n### 0.6.0\n* Voice messages record button\n* Added support for voice messages playback in Safari\n\n### 0.5.7\n* Video messages and Telescope\n* Notifications about new logins\n* Changelog is now received as a message\n\n### 0.5.6\n* Edit the text of your messages after sending them. This works across all Telegram chats, including groups and one-on-one conversations. Select a message and click 'Edit' or just press the up arrow button to edit your last message.\n* Unsend Messages: retract any messages within 48 hours of sending them. Check out the [Telegram Blog](https://telegram.org/blog/unsend-and-usage) for more info.\n* Pinned chats. Check out the [Telegram Blog](https://telegram.org/blog/pin-and-ifttt) for more info.\n* Sticker suggestions by emoji.\n* Search for messages in specific chats.\n* Background notifications in Chrome and Firefox (can be disabled in Settings)\n\n### 0.5.5\n* Introducing Drafts: Seamless syncing for unsent messages on all your devices. Drafts are now visible in your chats list.\n* Mention people in groups by typing @ and selecting them from the list — even if they don't have a username.\n* Share links to specific posts in channels via quick forwarding menu (click on the date in a message to try this out).\n\n### 0.5.4\n* Introducing Bot API 2.0, the biggest update to our bot platform since June 2015.\n* New inline keyboards with callback, 'open URL' or 'switch to inline mode' buttons help create seamless interfaces.\n* Bots can now update existing messages on the fly as you interact with them.\n* Prepare for the rise of location-based bots: all bots can now ask users to share their location.\n* Inline bots can now send all attachments supported in Telegram (videos, music, stickers, files, etc.).\n* Try out these sample bots to see what's coming your way soon: @music, @sticker, @youtube, @foursquare\n* Check out the [Telegram Blog](https://telegram.org/blog/bots-2-0) for more info.\n* New quick forwarding in channels (click on the date in a message to try this out).\n* Improved performance.\n\n### 0.5.3\n* Inline bots: A new way to add bot content to any chat. Type a bot's username and your query in the text field to get instant results and send them to your chat partner. Try typing `@gif dog` in your next chat. Sample bots: @gif, @wiki, @bing, @vid, @bold.\n* Check out the [Telegram Blog](https://telegram.org/blog/inline-bots) for more info.\n* Improved GIFs: 20x faster sending and downloading, nice animated progress\n* Click on message date to reply (or to forward from channels).\n* Preview images before sending when pasting from clipboard.\n* Improved formatting for copy-pasted history fragments (date, time and sender names inserted automatically).\n\n### 0.5.2\n* Unread counters for muted chats now colored in gray.\n* Improved previews for sticker sets: Click on a sticker to view the whole set, click on stickers in a set to send right away, added a 'Share' button.\n* Improved performance.\n\n### 0.5.1\n* Groups that have reached their capacity of 200 users can be upgraded to supergroups of up to 1,000 members.\n* Check out the [Telegram Blog](https://telegram.org/blog/supergroups) for more info\n\n### 0.5.0\n* Removed annoying \"multiple tabs open\" error.\n* Improved message forwarding.\n* Added view counter to messages from channels.\n* Improved image loading in Safari and Firefox.\n\n### 0.4.9\n* New emoji and sticker menu, tabs for sticker packs.\n\n### 0.4.8\n* Introducing Channels – a great new way to broadcast your messages to unlimited audiences.\n* Check out the [Telegram Blog](https://telegram.org/blog/channels) for more info\n* Improved performance in Safari on OS X El Capitan.\n* Added formatting for fixed-width code, surround text with `single backticks` for inline text and ```triple backticks``` for blocks of pre-formatted text.\n\n### 0.4.7\n* New bot API, free for everyone. If you're an engineer, create your own bots for games, services or integrations.\n            \n* Check out [Telegram Blog](https://telegram.org/blog/bot-revolution) for more info\n* Improved Stickers support: now stickers are loading much faster.\n* Click on any custom stickers in chats to view and add sticker sets.\n* [Mobile] Reply to a message easily: tap on any message and select \"Reply\".\n\n### 0.4.6\n* Install and share custom sticker sets like this one: telegram.me/addstickers/Animals\n* If you're an artist, create custom sticker sets using our @Stickers bot.\n* Check out [Telegram Blog](https://telegram.org/blog/stickers-revolution) for more info\n\n### 0.4.5\n* Invite links for group chats:\n  Check out [Telegram Blog](https://telegram.org/blog/invite-links) for more info            \n* Smart notifications\n* 'Listened' status for voice messages\n* Places in locations (venues, landmarks)\n\n### 0.4.4\n* Link Previews:\nGet rich link summaries for tweets, YouTube videos, Instagram photos and other content.\n* Check out [Telegram Blog](https://telegram.org/blog/link-preview) for more info.\n\n### 0.4.3\n* Sessions List:\nView your active Telegram sessions (on desktop, tablet and mobile devices) and close specific sessions remotely.\n\n* Two-step verification:\n  Set up an additional password that will be required to log into your Telegram account.\n* Check out [Telegram Blog](https://telegram.org/blog/sessions-and-2-step-verification) for more info.\n\n### 0.4.2\n* Optimization for screens with smaller Y-resolutions.\n* Supported Spotify URL embeds.\n* Mentions of the current user in group chats are now highlighted.\n\n### 0.4.1\n* Reply to specific messages in groups.\n* Mention @usernames in groups to notify multiple users.\n* Revised notifications in groups: mentioned users and people you reply to will be notified (private chat notification settings apply in this case instead of group settings). Check out <a href=\"https://telegram.org/blog/replies-mentions-hashtags\" target=\"_blank\">Telegram Blog</a> for more info.\n* Setting to disable message preview\n\n### 0.4.0\n* Full stickers support\n* Multisearch box: instantly find chats, usernames and messages\n* Emoji autocomplete: e.g., type **:kiss<** in the message field to see the list. [Full cheat sheet](http://www.emoji-cheat-sheet.com/)\n* Added 'typing' notification in chats list\n* Online members counter in group headers\n\n### 0.3.9\n* [Desktop] Material design completed\n\n### 0.3.8\n* Telegram.me links open right in Telegram Web when authorized\n* @username mentions in messages are clickable and open a conversation with the user\n\n### 0.3.7\n* [Desktop] New material design for modal windows\n* [Desktop] Forward messages to multiple recipients\n\n### 0.3.6\n* New viewer for photos, videos, documents.\n* [FirefoxOS] Improved media downloads.\n\n### 0.3.5\n* Added embedded Soundcloud tracks and playlists.\n* Added global user search to contacts list.\n* Added switch to mobile version on window resize.\n* Migrate to HTTPS notification\n* Bugfixes.\n\n### 0.3.4\n* Added embedded Facebook posts and Vimeo videos.\n* Improved IE10+ support: downloading files and style fixes.\n* Added unsupported media playback warning.\n* Bugfixes.\n\n### 0.3.3\n* Added Native Client module: dramatically improved encryption speed; Download and upload speed is now as high as in native applications.\n* HTTPS. We recommend you to use https://web.telegram.org.\n* Added multiple open tabs warning. Please note, that only one tab with Telegram Web will work.\n* Added embedded Instagram, Twitter, Vine, YouTube links.\n* Jump to selected spot when playing back audio.\n* Bugfixes\n\n### 0.3.2\n* Usernames support.\n* Search can now find public users by username.\n* Most popular emoticons shown in 'recent' when empty\n* [ChromeApp] Added saving window position and size\n* Bugfixes\n\n### 0.3.1\n* New languages: Spanish, German and Italian are now available \n* New custom-made audio player\n* Bad browser page for IE 6-9\n* Perfomance improvements and bugfixes\n\n### 0.3.0\n* Log in codes may be received in other Telegram apps\n* Partner's online status updates automatically\n* Added support for non-english hashtags in messages\n* Fixed invalid scrollbar width bug\n* [Desktop] Added automatic country code detection\n* [FirefoxOS] Improved PUSH-notifications for <= 1.1\n* [FirefoxOS] Fixed emoji in notifications\n* [FirefoxOS] Fixed attachment bug for <= 1.1\n* [FirefoxOS] Added phonebook permissions handling\n* [FirefoxOS] Added ability to share Gallery photos in Telegram\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Contribute\n\nYou can help this project by reporting problems, suggestions, localizing it or contributing to the code.\n\n### Report a problem or suggestion\n\nGo to our [issue tracker](https://github.com/zhukov/webogram/issues) and check if your problem/suggestion is already reported. If not, create a new issue with a descriptive title and detail your suggestion or steps to reproduce the problem.\n\n### Localization\n\nIf you don't see your native language available for Webogram and you can help with translation, please consult the [Telegram Translations Manual](https://core.telegram.org/translating_telegram).\n\nTo test your translation live, use [Localization guide](/app/js/locales/README.md).\n\n### Contribute to the code\n\nIf you know how to code, we welcome you to send fixes and new features, but in order to be efficient we ask you to follow the following procedure:\n\n* Fork this repo using the button at the top.\n* Clone your forked repo locally.\n\n``$ git clone git@github.com:yourname/webogram.git``\n\n* Don't modify or work on the master branch, we'll use it to always be in sync with webogram upstream.\n\n```\n$ git remote add upstream git@github.com:zhukov/webogram.git\n$ git fetch upstream\n```\n\n* Always create a new issue when you plan to work on a bug or new feature and wait for other devs input before start coding.\n* Once the new feature is approved or the problem confirmed, go to your local copy and create a new branch to work on it. Use a descriptive name for it, include the issue number for reference.\n\n``$ git checkout -b improve-contacts-99``\n\n* Do your coding and push it to your fork. Include as few commits as possible (one should be enough) and a good description. Always include a reference to the issue with \"Fix #number\".\n\n```\n$ git add .\n$ git commit -m \"Improved contact list. Fix #99\"\n$ git push origin improve-contacts-99\n```\n\n* Do a new pull request from your \"improve-contacts-99\" branch to webogram \"master\".\n\n#### How to implement changes suggested on a pull request\n\nSometimes when you submit a PR, you will be asked to correct some code. You can make the changes on your work branch and commit normally and the PR will be automatically updated.\n\n``$ git commit -am \"Ops, fixing typo\"``\n\nOnce everything is OK, you will be asked to merge all commit messages into one to keep history clean.\n\n``$ git rebase -i master``\n\nEdit the file and mark as fixup (f) all commits you want to merge with the first one:\n\n```\npick 1c85e07 Improved contact list. Fix #99\nf c595f79 Ops, fixing typo\n```\n\nOnce rebased you can force a push to your fork branch and the PR will be automatically updated.\n\n``$ git push origin improve-contacts-99 --force``\n\n#### How to keep your local branches updated\n\nTo keep your local master branch updated with upstream master, regularly do:\n\n```\n$ git fetch upstream\n$ git checkout master\n$ git pull --rebase upstream master\n```\n\nTo update the branch you are coding in:\n\n```\n$ git checkout improve-contacts-99\n$ git rebase master\n```\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM node\n\nADD . /opt/webogram\nWORKDIR /opt/webogram\n\nRUN npm install -g gulp && npm install\n\nEXPOSE 8000\n\nCMD [\"gulp\", \"watch\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    {one line to give the program's name and a brief idea of what it does.}\n    Copyright (C) {year}  {name of author}\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    {project}  Copyright (C) {year}  {fullname}\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "Makefile",
    "content": "package:\n\trm -rf dist_package\n\t./node_modules/gulp/bin/gulp.js clean\n\t./node_modules/gulp/bin/gulp.js package\n\tcp -r dist dist_package\n\tfind dist_package | grep \"\\.git\\|DS_Store\\|.swp\" | xargs rm -rf\n\tcd dist_package && zip -r ../releases/webogram_v$(version).zip .\n\nghdist:\n\trm -rf dist\n\tmkdir dist\n\tcp -r .git dist/\n\tcd dist && git checkout gh-pages\n\npublish:\n\t\t./node_modules/gulp/bin/gulp.js clean\n\t\tcd dist && git pull origin gh-pages\n\t\t./node_modules/gulp/bin/gulp.js publish\n\t\techo -n \"Please open http://localhost:8000/dist/index.html and check if everything works fine.\" && read -e\n\t\tcd dist && git add --all . && git commit -am \"merged with master\" && git push origin gh-pages\n\nbump:\n\t./node_modules/gulp/bin/gulp.js bump\n\ntxinstall:\n\tcurl -O https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py\n\tsudo python get-pip.py\n\tsudo pip install transifex-client\n\ntxupdate:\n\ttx pull -f\n\ntxupload:\n\ttx pull -f\n\ttx push -s\n"
  },
  {
    "path": "README.md",
    "content": "[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)\n\n## Project is DEPRECATED\n\nThe project was superseeded by 2 new official Telegram Web Apps:\n\n* https://github.com/morethanwords/tweb - Telegram Web K, based on source code of Webogram, rewritten in TypeScript.\n* https://github.com/Ajaxy/telegram-tt - Telegram Web Z, based on its own Teact framework (which re-implements React paradigm), uses a custom version of GramJS as an MTProto implementation. Written also in Typescript.\n\n\n## [Webogram](https://web.telegram.org) — Telegram Web App\n\nTelegram offers great [apps for mobile communication](https://www.telegram.org). It is based on the [MTProto protocol](https://core.telegram.org/mtproto) and has an [Open API](https://core.telegram.org/api). I personally like Telegram for its speed and cloud-support (that makes a web app possible, unlike in the case of WA and others).\n\nMTProto data can be carried over HTTP (SSL is also supported), so this project is my take at creating one.\n\nThat said, I'm using this app myself and I'd like to share its sources, so anyone can contribute to the development. Any help is welcome!\n\n\n### Interface\n\n\nHere are some screenshots of the interface:\n\n\n![Sample screenshot 1](/app/img/screenshot1.png)\n![Mobile screenshot 2](/app/img/screenshot2.png)\n![Mobile screenshot 3](/app/img/screenshot3.png)\n\n\n### Unsupported at the moment\n\n* Secret chats\n* Black list\n* ...\n\n\n### Maintained locations\n\n\n| Description        | URL           | Type  |\n| ------------- |-------------| -----:|\n| Online Web-version (hosted on Telegram servers)      | https://web.telegram.org/ | hosted\n| Online Web-version (hosted on GitHub pages)      | https://zhukov.github.io/webogram | hosted\n| Chrome Web Store      | [https://chrome.google.com/webstore/detail/telegram/ clhhggbfdinjmjhajaheehoeibfljjno](https://chrome.google.com/webstore/detail/telegram/clhhggbfdinjmjhajaheehoeibfljjno) |   packed\n| Firefox & FirefoxOS Marketplace | https://marketplace.firefox.com/app/telegram |    packed\n\n\n\n**Hosted version**: the app is downloaded via HTTPS as a usual website. Will be available offline due to application cache.\n\n**Packed version**: the app is downloaded at once in a package via HTTPS. The package is updated less frequently than the Web-version.\n\nAll of the apps above are submitted and maintained by [@zhukov](https://github.com/zhukov), so feel free to use them and report bugs [here](https://github.com/zhukov/webogram/issues). Please do not report bugs which are only reproducible in different locations.\n\n\n## Technical details\n\nThe app is based on the AngularJS JavaScript framework, and written in pure JavaScript. jQuery is used for DOM manipulations, and Bootstrap as the CSS-framework.\n\n\n### Running locally\n\n\nThe project repository is based on angularjs-seed and includes gulp tasks, so it's easy to launch the app locally on your desktop.\nInstall [node.js](http://nodejs.org/).\n\nInstall dependencies with:\n\n```lang=bash\nnpm install\n```\n\nOptionally, run the following commands in the project directory to install gulp globally:\n\n```lang=bash\nsudo npm install -g gulp\n```\n\nThis will install all the needed dependencies.\n\n\n#### Running web-server\n\n\nJust run `npm start` (`gulp watch`) to start the web server and the livereload task.\nOpen http://localhost:8000/app/index.html in your browser.\n\n\n\n#### Running as Chrome Packaged App\n\nTo run this application in Google Chrome as a packaged app, open this URL (in Chrome): `chrome://extensions/`, then tick \"Developer mode\" and press \"Load unpacked extension...\". Select the downloaded `app` folder and Webogram should appear in the list.\n\nRun `npm start` (`gulp watch`) to watch for file changes and automatically rebuild the app.\n\n\n#### Running as Firefox OS App\n\nTo run this application in Firefox as a packaged app, open \"Menu\" -> \"Developer\" -> \"WebIDE\" (or hit `Shift + F8`). Choose \"Open packaged app\" from the Project menu and select the `app` folder.\n\nRun `npm start` (`gulp watch`) to watch for file changes and automatically rebuild the app.\n\n#### Running in production\n\nRun `npm run clean` (`gulp clean`), then `npm run build` (`gulp publish`) to build the minimized production version of the app. Copy `dist` folder contents to your web server. Don't forget to set `X-Frame-Options SAMEORIGIN` header ([docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options)).\n\n\n### Third party libraries\n\nBesides the frameworks mentioned above, other libraries are used for protocol and UI needs. Here is the short list:\n\n* [JSBN](http://www-cs-students.stanford.edu/~tjw/jsbn/)\n* [CryptoJS](https://code.google.com/p/crypto-js/)\n* [zlib.js](https://github.com/imaya/zlib.js)\n* [UI Bootstrap](http://angular-ui.github.io/bootstrap/)\n* [jQuery Emojiarea](https://github.com/diy/jquery-emojiarea)\n* [nanoScrollerJS](https://github.com/jamesflorentino/nanoScrollerJS)\n* [gemoji](https://github.com/github/gemoji)\n* [emoji-data](https://github.com/iamcal/emoji-data)\n\nMany thanks to all these libraries' authors and contributors. A detailed list with descriptions and licenses is available [here](/app/vendor).\n\n\n### Licensing\n\nThe source code is licensed under GPL v3. License is available [here](/LICENSE).\n\n\n### [Contribute](CONTRIBUTING.md)\n"
  },
  {
    "path": "app/badbrowser.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\" style=\"display:block; overflow: auto; background: #f8f8f8;\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n  <title>Telegram Web</title>\n\n  <!-- build:css css/badbrowser.css -->\n  <link rel=\"stylesheet\" href=\"vendor/bootstrap/css/bootstrap.css\"/>\n  <link rel=\"stylesheet\" href=\"css/app.css\"/>\n  <!-- endbuild -->\n\n  <link rel=\"icon\" href=\"favicon.ico\" type=\"image/x-icon\" />\n\n</head>\n<body class=\"non_osx is_1x\">\n\n  <div class=\"welcome_form\" style=\"padding-bottom: 50px; clear: both;\">\n\n    <div class=\"bad_browser_wrap\">\n\n      <h2>Your browser is outdated!</h2>\n\n      <div class=\"bad_browser_text\">\n        <p>\n          Don't take this personally, but your browser is too old to run <strong>Telegram Web</strong>.<br/>\n          We require HTML5 support for the MTProto secure messaging protocol to work.\n        </p>\n        <p>\n          Unfortunately, your current browser doesn't support HTML5.<br/>\n          Please download a modern browser or update to latest version and come back soon!\n        </p>\n      </div>\n\n\n      <a class=\"btn btn-primary btn-lg pull-right\" href=\"//firefox.com\" target=\"_blank\">Download Mozilla Firefox</a>\n      <a class=\"btn btn-primary btn-lg\" href=\"//google.com/chrome\" target=\"_blank\">Download Google Chrome</a>\n\n    </div>\n\n  </div>\n\n</body>\n</html>"
  },
  {
    "path": "app/index.html",
    "content": "<!doctype html>\n<html lang=\"en\" manifest=\"webogram.appcache\" ng-csp=\"\" xmlns:ng=\"http://angularjs.org\" id=\"ng-app\" style=\"display: none;\">\n<head>\n  <!--[if lte IE 9]>\n  <meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=badbrowser.html\">\n  <![endif]-->\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n  <title>Telegram Web</title>\n\n  <!-- build:css css/app.css -->\n  <link rel=\"stylesheet\" href=\"vendor/angular/angular-csp.css\"/>\n  <link rel=\"stylesheet\" href=\"vendor/bootstrap/css/bootstrap.css\"/>\n  <link rel=\"stylesheet\" href=\"vendor/angularjs-toaster/toaster.css\"/>\n  <link rel=\"stylesheet\" href=\"css/app.css\"/>\n  <!-- endbuild -->\n\n  <link rel=\"manifest\" href=\"manifest.webapp.json\"/>\n\n  <!-- <link rel=\"stylesheet\" href=\"css/font.css\"/> -->\n  <!-- <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:400,600&amp;subset=cyrillic,cyrillic-ext,latin,latin-ext\" rel=\"stylesheet\" type=\"text/css\"> -->\n\n  <link rel=\"icon\" href=\"favicon.ico\" type=\"image/x-icon\" />\n\n  <link rel=\"apple-touch-icon\" href=\"img/iphone_home120.png\">\n  <link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"img/iphone_home120.png\">\n  <link rel=\"apple-touch-startup-image\" media=\"(device-width: 320px)\" href=\"img/iphone_startup.png\">\n\n  <meta name=\"apple-mobile-web-app-title\" content=\"Telegram Web\">\n  <meta name=\"mobile-web-app-capable\" content=\"yes\">\n  <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n  <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">\n  <meta name=\"theme-color\" content=\"#497495\">\n  <meta name=\"google\" content=\"notranslate\">\n\n  <meta property=\"og:title\" content=\"Telegram Web\">\n  <meta property=\"og:url\" content=\"https://web.telegram.org/\">\n  <meta property=\"og:image:width\" content=\"236\">\n  <meta property=\"og:image:height\" content=\"236\">\n  <meta property=\"og:image\" content=\"https://web.telegram.org/img/logo_share.png\">\n  <meta property=\"og:site_name\" content=\"Telegram Web\">\n  <meta property=\"description\" content=\"Welcome to the Web application of Telegram messenger. See https://github.com/zhukov/webogram for more info.\">\n  <meta property=\"og:description\" content=\"Welcome to the Web application of Telegram messenger. See https://github.com/zhukov/webogram for more info.\">\n</head>\n<body>\n\n  <div class=\"page_wrap\" ng-view></div>\n\n  <div id=\"notify_sound\"></div>\n\n  <!-- build:js js/app.js -->\n  <script type=\"text/javascript\" src=\"js/lib/polyfill.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/jquery/jquery.min.js\"></script>\n  <script type=\"text/javascript\" src=\"js/lib/config.js\"></script>\n  <script type=\"text/javascript\" src=\"js/init.js\"></script>\n  <script type=\"text/javascript\" src=\"js/offline_manager.js\"></script>\n\n  <script type=\"text/javascript\" src=\"vendor/jquery.nanoscroller/nanoscroller.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/angular/angular.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/angular/angular-route.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/angular/angular-animate.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/angular/angular-sanitize.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/angular/angular-touch.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/ui-bootstrap/ui-bootstrap-custom-tpls-0.12.0.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/angular-media-player/angular-media-player.js\"></script>\n\n  <script type=\"text/javascript\" src=\"vendor/jsbn/jsbn_combined.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/cryptoJS/crypto.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/rusha/rusha.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/zlib/gunzip.min.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/closure/long.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/leemon_bigint/bigint.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/libwebpjs/libwebp-0.2.0.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/angularjs-toaster/toaster.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/clipboard/clipboard.js\"></script>\n\n  <script type=\"text/javascript\" src=\"vendor/ogv.js/ogv.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/ogv.js/ogv-demuxer-ogg.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/ogv.js/ogv-decoder-audio-opus.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/ogv.js/ogv-decoder-audio-vorbis.js\"></script>\n  <script type=\"text/javascript\" src=\"vendor/ogv.js/ogv-support.js\"></script>\n\n  <script type=\"text/javascript\" src=\"vendor/recorderjs/recorder.min.js\"></script>\n\n  <script type=\"text/javascript\" src=\"js/lib/utils.js\"></script>\n  <script type=\"text/javascript\" src=\"js/lib/bin_utils.js\"></script>\n  <script type=\"text/javascript\" src=\"js/lib/tl_utils.js\"></script>\n  <script type=\"text/javascript\" src=\"js/lib/ng_utils.js\"></script>\n  <script type=\"text/javascript\" src=\"js/lib/i18n.js\"></script>\n  <script type=\"text/javascript\" src=\"js/lib/mtproto.js\"></script>\n  <script type=\"text/javascript\" src=\"js/lib/mtproto_wrapper.js\"></script>\n\n  <script type=\"text/javascript\" src=\"js/app.js\"></script>\n  <script type=\"text/javascript\" src=\"js/services.js\"></script>\n  <script type=\"text/javascript\" src=\"js/controllers.js\"></script>\n  <script type=\"text/javascript\" src=\"js/filters.js\"></script>\n  <script type=\"text/javascript\" src=\"js/messages_manager.js\"></script>\n\n  <!--PRODUCTION_ONLY_BEGIN\n    <script type=\"text/javascript\" src=\"js/templates.js\"></script>\n  PRODUCTION_ONLY_END-->\n\n  <script type=\"text/javascript\" src=\"js/message_composer.js\"></script>\n  <script type=\"text/javascript\" src=\"js/directives.js\"></script>\n  <script type=\"text/javascript\" src=\"js/directives_mobile.js\"></script>\n  <!-- endbuild -->\n\n</body>\n</html>\n"
  },
  {
    "path": "app/js/app.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n/* global Config, templateUrl */\n\nvar extraModules = []\nif (Config.Modes.animations) {\n  extraModules.push('ngAnimate')\n}\n\n// Declare app level module which depends on filters, and services\nangular.module('myApp', [\n  'ngRoute',\n  'ngSanitize',\n  'ngTouch',\n  'ui.bootstrap',\n  'mediaPlayer',\n  'toaster',\n  'izhukov.utils',\n  'izhukov.mtproto',\n  'izhukov.mtproto.wrapper',\n  'myApp.filters',\n  'myApp.services',\n  /*PRODUCTION_ONLY_BEGIN\n  'myApp.templates',\n  PRODUCTION_ONLY_END*/\n  'myApp.directives',\n  'myApp.controllers'\n].concat(extraModules)).config(['$locationProvider', '$routeProvider', '$compileProvider', 'StorageProvider', function ($locationProvider, $routeProvider, $compileProvider, StorageProvider) {\n  $locationProvider.hashPrefix('');\n  $compileProvider.imgSrcSanitizationWhitelist(/^\\s*(https?|ftp|file|blob|filesystem|chrome-extension|app):|data:image\\//)\n  $compileProvider.aHrefSanitizationWhitelist(/^\\s*(https?|ftp|file|tg|mailto|blob|filesystem|chrome-extension|app):|data:/)\n\n  /*PRODUCTION_ONLY_BEGIN\n  $compileProvider.debugInfoEnabled(false)\n  PRODUCTION_ONLY_END*/\n\n  if (Config.Modes.test) {\n    StorageProvider.setPrefix('t_')\n  }\n\n  $routeProvider.when('/', {template: '', controller: 'AppWelcomeController'})\n  $routeProvider.when('/login', {templateUrl: templateUrl('login'), controller: 'AppLoginController'})\n  $routeProvider.when('/im', {templateUrl: templateUrl('im'), controller: 'AppIMController', reloadOnSearch: false})\n  $routeProvider.otherwise({redirectTo: '/'})\n}])\n"
  },
  {
    "path": "app/js/background.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nchrome.app.runtime.onLaunched.addListener(function (launchData) {\n  var isWindows = typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.match(/windows/i) ? true : false\n  chrome.app.window.create('../index.html', {\n    id: 'webogram-chat',\n    innerBounds: {\n      width: 1000,\n      height: 700\n    },\n    minWidth: 320,\n    minHeight: 400,\n    frame: isWindows ? { color: '#5682a3' } : 'chrome'\n  })\n})\n"
  },
  {
    "path": "app/js/controllers.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n/* global Config, location, templateUrl, onContentLoaded, tsNow, cancelEvent, safeReplaceObject, dT, SearchIndexManager, setZeroTimeout, versionCompare, calcImageInBox, getSelectedText, SVGElement, hasOnclick  */\n\n/* Controllers */\n\nangular.module('myApp.controllers', ['myApp.i18n'])\n\n  .controller('AppWelcomeController', function ($scope, $location, MtpApiManager, ChangelogNotifyService, LayoutSwitchService) {\n    MtpApiManager.getUserID().then(function (id) {\n      if (id) {\n        $location.url('/im')\n        return\n      }\n      if (location.protocol == 'http:' &&\n        !Config.Modes.http &&\n        Config.App.domains.indexOf(location.hostname) != -1) {\n        location.href = location.href.replace(/^http:/, 'https:')\n        return\n      }\n      $location.url('/login')\n    })\n\n    ChangelogNotifyService.checkUpdate()\n    LayoutSwitchService.start()\n  })\n\n  .controller('AppLoginController', function ($scope, $rootScope, $location, $timeout, $modal, $modalStack, MtpApiManager, ErrorService, NotificationsManager, PasswordManager, ChangelogNotifyService, IdleManager, LayoutSwitchService, WebPushApiManager, TelegramMeWebService, _) {\n    $modalStack.dismissAll()\n    IdleManager.start()\n\n    MtpApiManager.getUserID().then(function (id) {\n      if (id) {\n        $location.url('/im')\n        return\n      }\n      if (location.protocol == 'http:' &&\n        !Config.Modes.http &&\n        Config.App.domains.indexOf(location.hostname) != -1) {\n        location.href = location.href.replace(/^http:/, 'https:')\n        return\n      }\n      TelegramMeWebService.setAuthorized(false)\n      WebPushApiManager.forceUnsubscribe()\n    })\n\n    var options = {dcID: 2, createNetworker: true}\n    var countryChanged = false\n    var selectedCountry = false\n\n    $scope.credentials = {phone_country: '', phone_country_name: '', phone_number: '', phone_full: ''}\n    $scope.progress = {}\n    $scope.nextPending = {}\n    $scope.about = {}\n\n    $scope.chooseCountry = function () {\n      var modal = $modal.open({\n        templateUrl: templateUrl('country_select_modal'),\n        controller: 'CountrySelectModalController',\n        windowClass: 'countries_modal_window mobile_modal',\n        backdrop: 'single'\n      })\n\n      modal.result.then(selectCountry)\n    }\n\n    function initPhoneCountry () {\n      var langCode = (navigator.language || '').toLowerCase()\n      var countryIso2 = Config.LangCountries[langCode]\n      var shouldPregenerate = !Config.Navigator.mobile\n\n      if (['en', 'en-us', 'en-uk'].indexOf(langCode) == -1) {\n        if (countryIso2 !== undefined) {\n          selectPhoneCountryByIso2(countryIso2)\n        } else if (langCode.indexOf('-') > 0) {\n          selectPhoneCountryByIso2(langCode.split('-')[1].toUpperCase())\n        } else {\n          selectPhoneCountryByIso2('US')\n        }\n      } else {\n        selectPhoneCountryByIso2('US')\n      }\n\n      if (!shouldPregenerate) {\n        return\n      }\n      var wasCountry = $scope.credentials.phone_country\n      MtpApiManager.invokeApi('help.getNearestDc', {}, {dcID: 2, createNetworker: true}).then(function (nearestDcResult) {\n        if (wasCountry == $scope.credentials.phone_country) {\n          selectPhoneCountryByIso2(nearestDcResult.country)\n        }\n        if (nearestDcResult.nearest_dc != nearestDcResult.this_dc) {\n          MtpApiManager.getNetworker(nearestDcResult.nearest_dc, {createNetworker: true})\n        }\n      })\n    }\n\n    function selectPhoneCountryByIso2 (countryIso2) {\n      if (countryIso2) {\n        var i, country\n        for (i = 0; i < Config.CountryCodes.length; i++) {\n          country = Config.CountryCodes[i]\n          if (country[0] == countryIso2) {\n            return selectCountry({name: _(country[1] + '_raw'), code: country[2]})\n          }\n        }\n      }\n      return selectCountry({name: _('country_select_modal_country_us_raw'), code: '+1'})\n    }\n\n    function selectCountry (country) {\n      selectedCountry = country\n      if ($scope.credentials.phone_country != country.code) {\n        $scope.credentials.phone_country = country.code\n      } else {\n        updateCountry()\n      }\n      $scope.$broadcast('country_selected')\n      $scope.$broadcast('value_updated')\n    }\n\n    function updateCountry () {\n      var phoneNumber = (\n        ($scope.credentials.phone_country || '') +\n        ($scope.credentials.phone_number || '')\n          ).replace(/\\D+/g, '')\n      var i, j, code\n      var maxLength = 0\n      var maxName = false\n\n      if (phoneNumber.length) {\n        if (selectedCountry && !phoneNumber.indexOf(selectedCountry.code.replace(/\\D+/g, ''))) {\n          maxName = selectedCountry.name\n        } else {\n          for (i = 0; i < Config.CountryCodes.length; i++) {\n            for (j = 2; j < Config.CountryCodes[i].length; j++) {\n              code = Config.CountryCodes[i][j].replace(/\\D+/g, '')\n              if (code.length > maxLength && !phoneNumber.indexOf(code)) {\n                maxLength = code.length\n                maxName = _(Config.CountryCodes[i][1] + '_raw')\n              }\n            }\n          }\n        }\n      }\n\n      $scope.credentials.phone_full = phoneNumber\n      $scope.credentials.phone_country_name = maxName || _('login_controller_unknown_country_raw')\n    }\n\n    $scope.$watch('credentials.phone_country', updateCountry)\n    $scope.$watch('credentials.phone_number', updateCountry)\n    initPhoneCountry()\n\n    var nextTimeout\n    var updatePasswordTimeout = false\n\n    $scope.try_desktop = {\n      shown: false,\n      domain: Config.Navigator.osX ? 'macos.telegram.org' : 'desktop.telegram.org'\n    }\n    $scope.closeTryDesktop = function() {\n      $scope.try_desktop.shown = false;\n      ConfigStorage.set({try_desktop_hidden: 1})\n    };\n    ConfigStorage.get('try_desktop_hidden', function (td_hidden) {\n      $scope.try_desktop.shown = !Config.Navigator.mobile && !td_hidden;\n    })\n\n    function saveAuth (result) {\n      MtpApiManager.setUserAuth(options.dcID, {\n        id: result.user.id\n      })\n      $timeout.cancel(nextTimeout)\n\n      $location.url('/im')\n    }\n\n    $scope.sendCode = function () {\n      $timeout.cancel(nextTimeout)\n\n      var fullPhone = ($scope.credentials.phone_country || '') + ($scope.credentials.phone_number || '')\n      var badPhone = !fullPhone.match(/^[\\d\\-+\\s]+$/)\n      if (!badPhone) {\n        fullPhone = fullPhone.replace(/\\D/g, '')\n        if (fullPhone.length < 7 || fullPhone.length > 25) {\n          badPhone = true\n        }\n      }\n      if (badPhone) {\n        $scope.progress.enabled = false\n        $scope.error = {field: 'phone'}\n        return\n      }\n\n      ErrorService.confirm({\n        type: 'LOGIN_PHONE_CORRECT',\n        country_code: $scope.credentials.phone_country,\n        phone_number: $scope.credentials.phone_number\n      }).then(function () {\n        $scope.progress.enabled = true\n\n        onContentLoaded(function () {\n          $scope.$broadcast('ui_height')\n        })\n\n        var authKeyStarted = tsNow()\n        MtpApiManager.invokeApi('auth.sendCode', {\n          flags: 0,\n          phone_number: $scope.credentials.phone_full,\n          api_id: Config.App.id,\n          api_hash: Config.App.hash,\n          lang_code: navigator.language || 'en'\n        }, options).then(function (sentCode) {\n          $scope.progress.enabled = false\n\n          $scope.error = {}\n          $scope.about = {}\n          $scope.credentials.phone_code_hash = sentCode.phone_code_hash\n          applySentCode(sentCode)\n        }, function (error) {\n          $scope.progress.enabled = false\n          console.log('sendCode error', error)\n          switch (error.type) {\n            case 'PHONE_NUMBER_INVALID':\n              $scope.error = {field: 'phone'}\n              error.handled = true\n              break\n\n            case 'PHONE_NUMBER_APP_SIGNUP_FORBIDDEN':\n              $scope.error = {field: 'phone'}\n              break\n          }\n        })['finally'](function () {\n          if ($rootScope.idle.isIDLE || tsNow() - authKeyStarted > 60000) {\n            NotificationsManager.notify({\n              title: 'Telegram',\n              message: 'Your authorization key was successfully generated! Open the app to log in.',\n              tag: 'auth_key'\n            })\n          }\n        })\n      })\n    }\n\n    function applySentCode (sentCode) {\n      $scope.credentials.type = sentCode.type\n      $scope.nextPending.type = sentCode.next_type || false\n      $scope.nextPending.remaining = sentCode.timeout || false\n      delete $scope.nextPending.progress\n\n      nextTimeoutCheck()\n\n      onContentLoaded(function () {\n        $scope.$broadcast('ui_height')\n      })\n    }\n\n    $scope.sendNext = function () {\n      if (!$scope.nextPending.type ||\n        $scope.nextPending.remaining > 0) {\n        return\n      }\n      $scope.nextPending.progress = true\n      MtpApiManager.invokeApi('auth.resendCode', {\n        phone_number: $scope.credentials.phone_full,\n        phone_code_hash: $scope.credentials.phone_code_hash\n      }, options).then(applySentCode)\n    }\n\n    function nextTimeoutCheck () {\n      $timeout.cancel(nextTimeout)\n      if (!$scope.nextPending.type ||\n        $scope.nextPending.remaining === false) {\n        return\n      }\n      if ((--$scope.nextPending.remaining) > 0) {\n        nextTimeout = $timeout(nextTimeoutCheck, 1000)\n      }\n    }\n\n    $scope.editPhone = function () {\n      $timeout.cancel(nextTimeout)\n\n      if ($scope.credentials.phone_full &&\n        $scope.credentials.phone_code_hash) {\n        MtpApiManager.invokeApi('auth.cancelCode', {\n          phone_number: $scope.credentials.phone_full,\n          phone_code_hash: $scope.credentials.phone_code_hash\n        }, options)\n      }\n\n      delete $scope.credentials.phone_code_hash\n      delete $scope.credentials.phone_unoccupied\n      delete $scope.credentials.phone_code_valid\n      delete $scope.nextPending.remaining\n    }\n\n    $scope.$watch('credentials.phone_code', function (newVal) {\n      if (newVal &&\n        newVal.match(/^\\d+$/) &&\n        $scope.credentials.type &&\n        $scope.credentials.type.length &&\n        newVal.length == $scope.credentials.type.length) {\n        $scope.logIn()\n      }\n    })\n\n    $scope.logIn = function (forceSignUp) {\n      if ($scope.progress.enabled &&\n          $scope.progress.forceSignUp == forceSignUp) {\n        return\n      }\n      var method = 'auth.signIn'\n      var params = {\n        phone_number: $scope.credentials.phone_full,\n        phone_code_hash: $scope.credentials.phone_code_hash,\n        phone_code: $scope.credentials.phone_code\n      }\n      if (forceSignUp) {\n        method = 'auth.signUp'\n        angular.extend(params, {\n          first_name: $scope.credentials.first_name || '',\n          last_name: $scope.credentials.last_name || ''\n        })\n      }\n\n      $scope.progress.forceSignUp = forceSignUp\n      $scope.progress.enabled = true\n      MtpApiManager.invokeApi(method, params, options).then(saveAuth, function (error) {\n        $scope.progress.enabled = false\n        if (error.code == 400 && error.type == 'PHONE_NUMBER_UNOCCUPIED') {\n          error.handled = true\n          $scope.credentials.phone_code_valid = true\n          $scope.credentials.phone_unoccupied = true\n          $scope.about = {}\n          return\n        } else if (error.code == 400 && error.type == 'PHONE_NUMBER_OCCUPIED') {\n          error.handled = true\n          return $scope.logIn(false)\n        } else if (error.code == 401 && error.type == 'SESSION_PASSWORD_NEEDED') {\n          $scope.progress.enabled = true\n          updatePasswordState().then(function () {\n            $scope.progress.enabled = false\n            $scope.credentials.phone_code_valid = true\n            $scope.credentials.password_needed = true\n            $scope.about = {}\n          })\n          error.handled = true\n          return\n        }\n\n        switch (error.type) {\n          case 'FIRSTNAME_INVALID':\n            $scope.error = {field: 'first_name'}\n            error.handled = true\n            break\n          case 'LASTNAME_INVALID':\n            $scope.error = {field: 'last_name'}\n            error.handled = true\n            break\n          case 'PHONE_CODE_INVALID':\n            $scope.error = {field: 'phone_code'}\n            delete $scope.credentials.phone_code_valid\n            error.handled = true\n            break\n          case 'PHONE_CODE_EXPIRED':\n            $scope.editPhone()\n            error.handled = true\n            break\n        }\n      })\n    }\n\n    $scope.checkPassword = function () {\n      $scope.progress.enabled = true\n      return PasswordManager.check($scope.password, $scope.credentials.password, options).then(saveAuth, function (error) {\n        $scope.progress.enabled = false\n        switch (error.type) {\n          case 'PASSWORD_HASH_INVALID':\n            $scope.error = {field: 'password'}\n            error.handled = true\n            break\n        }\n      })\n    }\n\n    $scope.forgotPassword = function (event) {\n      PasswordManager.requestRecovery($scope.password, options).then(function (emailRecovery) {\n        var scope = $rootScope.$new()\n        scope.recovery = emailRecovery\n        scope.options = options\n        var modal = $modal.open({\n          scope: scope,\n          templateUrl: templateUrl('password_recovery_modal'),\n          controller: 'PasswordRecoveryModalController',\n          windowClass: 'md_simple_modal_window mobile_modal'\n        })\n\n        modal.result.then(function (result) {\n          if (result && result.user) {\n            saveAuth(result)\n          } else {\n            $scope.canReset = true\n          }\n        })\n      }, function (error) {\n        switch (error.type) {\n          case 'PASSWORD_EMPTY':\n            $scope.logIn()\n            error.handled = true\n            break\n          case 'PASSWORD_RECOVERY_NA':\n            $timeout(function () {\n              $scope.canReset = true\n            }, 1000)\n            error.handled = true\n            break\n        }\n      })\n\n      return cancelEvent(event)\n    }\n\n    $scope.resetAccount = function () {\n      ErrorService.confirm({\n        type: 'RESET_ACCOUNT'\n      }).then(function () {\n        $scope.progress.enabled = true\n        MtpApiManager.invokeApi('account.deleteAccount', {\n          reason: 'Forgot password'\n        }, options).then(function () {\n          delete $scope.progress.enabled\n          delete $scope.credentials.password_needed\n          $scope.credentials.phone_unoccupied = true\n        }, function (error) {\n          if (error.type &&\n                   error.type.substr(0, 17) == '2FA_CONFIRM_WAIT_') {\n            error.waitTime = error.type.substr(17)\n            error.type = '2FA_CONFIRM_WAIT_TIME'\n          }\n\n          delete $scope.progress.enabled\n        })\n      })\n    }\n\n    function updatePasswordState () {\n      // $timeout.cancel(updatePasswordTimeout)\n      // updatePasswordTimeout = false\n      return PasswordManager.getState(options).then(function (result) {\n        return $scope.password = result\n      // if (result._ == 'account.noPassword' && result.email_unconfirmed_pattern) {\n      //   updatePasswordTimeout = $timeout(updatePasswordState, 5000)\n      // }\n      })\n    }\n\n    ChangelogNotifyService.checkUpdate()\n    LayoutSwitchService.start()\n  })\n\n  .controller('AppIMController', function ($q, qSync, $scope, $location, $routeParams, $modal, $rootScope, $modalStack, MtpApiManager, AppUsersManager, AppChatsManager, AppMessagesManager, AppPeersManager, ContactsSelectService, ChangelogNotifyService, ErrorService, AppRuntimeManager, HttpsMigrateService, LayoutSwitchService, LocationParamsService, AppStickersManager) {\n    $scope.$on('$routeUpdate', updateCurDialog)\n\n    var pendingParams = false\n    var pendingAttachment = false\n    $scope.$on('history_focus', function (e, peerData) {\n      if (peerData.peerString == $scope.curDialog.peer &&\n          (peerData.messageID ? peerData.messageID == $scope.curDialog.messageID : !$scope.curDialog.messageID) &&\n          !peerData.startParam &&\n          !peerData.attachment) {\n        if (peerData.messageID) {\n          $scope.$broadcast('ui_history_change_scroll', true)\n        } else {\n          $scope.$broadcast('ui_history_focus')\n        }\n        $modalStack.dismissAll()\n      } else {\n        var peerID = AppPeersManager.getPeerID(peerData.peerString)\n        var username = AppPeersManager.getPeer(peerID).username\n        var peer = username ? '@' + username : peerData.peerString\n        if (peerData.messageID || peerData.startParam) {\n          pendingParams = {\n            messageID: peerData.messageID,\n            startParam: peerData.startParam\n          }\n        } else {\n          pendingParams = false\n        }\n        if (peerData.attachment) {\n          pendingAttachment = peerData.attachment\n        }\n        if ($routeParams.p != peer) {\n          $location.url('/im?p=' + peer)\n        } else {\n          updateCurDialog()\n        }\n      }\n    })\n\n    $scope.$on('esc_no_more', function () {\n      $rootScope.$apply(function () {\n        $location.url('/im')\n      })\n    })\n\n    $scope.isLoggedIn = true\n    $scope.isEmpty = {}\n    $scope.search = {}\n    $scope.historyFilter = {mediaType: false}\n    $scope.historyPeer = {}\n    $scope.historyState = {\n      selectActions: false,\n      botActions: false,\n      channelActions: false,\n      canReply: false,\n      canDelete: false,\n      canEdit: false,\n      canReport: false,\n      actions: function () {\n        return $scope.historyState.selectActions ? 'selected' : ($scope.historyState.botActions ? 'bot' : ($scope.historyState.channelActions ? 'channel' : false))\n      },\n      typing: [],\n      missedCount: 0,\n      skipped: false\n    }\n\n    $scope.try_desktop = {\n      shown: false,\n      domain: Config.Navigator.osX ? 'macos.telegram.org' : 'desktop.telegram.org'\n    }\n    $scope.closeTryDesktop = function() {\n      $scope.try_desktop.shown = false;\n      onContentLoaded(function () {\n        $scope.$broadcast('ui_dialogs_update');\n        $scope.$broadcast('ui_panel_update');\n      })\n      ConfigStorage.set({try_desktop_hidden: 1})\n    };\n    ConfigStorage.get('try_desktop_hidden', function (td_hidden) {\n      $scope.try_desktop.shown = !Config.Navigator.mobile && !td_hidden;\n    })\n\n    $scope.openSettings = function () {\n      $modal.open({\n        templateUrl: templateUrl('settings_modal'),\n        controller: 'SettingsModalController',\n        windowClass: 'settings_modal_window mobile_modal',\n        backdrop: 'single'\n      })\n    }\n\n    $scope.isHistoryPeerGroup = function () {\n      return $scope.historyPeer.id < 0 && !AppPeersManager.isBroadcast($scope.historyPeer.id)\n    }\n\n    // setTimeout($scope.openSettings, 1000)\n\n    $scope.openFaq = function () {\n      var url = 'https://telegram.org/faq'\n      switch (Config.I18n.locale) {\n        case 'es-es':\n          url += '/es'\n          break\n        case 'it-it':\n          url += '/it'\n          break\n        case 'de-de':\n          url += '/de'\n          break\n        case 'ko-ko':\n          url += '/ko'\n          break\n        case 'pt-br':\n          url += '/br'\n          break\n      }\n      var popup = window.open(url, '_blank')\n      try {\n        popup.opener = null;\n      } catch (e) {}\n    }\n\n    $scope.openContacts = function () {\n      ContactsSelectService.selectContact().then(function (userID) {\n        $scope.dialogSelect(AppUsersManager.getUserString(userID))\n      })\n    }\n\n    $scope.openGroup = function () {\n      ContactsSelectService.selectContacts({action: 'new_group'}).then(function (userIDs) {\n        if (userIDs && \n            userIDs.length) {\n          var scope = $rootScope.$new()\n          scope.userIDs = userIDs\n\n          $modal.open({\n            templateUrl: templateUrl('chat_create_modal'),\n            controller: 'ChatCreateModalController',\n            scope: scope,\n            windowClass: 'md_simple_modal_window mobile_modal',\n            backdrop: 'single'\n          })\n        }\n      })\n    }\n\n    $scope.importContact = function () {\n      AppUsersManager.openImportContact().then(function (foundContact) {\n        if (foundContact) {\n          $rootScope.$broadcast('history_focus', {\n            peerString: AppUsersManager.getUserString(foundContact)\n          })\n        }\n      })\n    }\n\n    $scope.searchClear = function () {\n      $scope.search.query = ''\n      $scope.$broadcast('search_clear')\n    }\n\n    $scope.dialogSelect = function (peerString, messageID) {\n      var params = {peerString: peerString}\n      if (messageID) {\n        params.messageID = messageID\n      } else if ($scope.search.query) {\n        $scope.searchClear()\n      }\n      var peerID = AppPeersManager.getPeerID(peerString)\n      var converted = AppMessagesManager.convertMigratedPeer(peerID)\n      if (converted) {\n        params.peerString = AppPeersManager.getPeerString(converted)\n      }\n      $rootScope.$broadcast('history_focus', params)\n    }\n\n    $scope.logOut = function () {\n      ErrorService.confirm({type: 'LOGOUT'}).then(function () {\n        MtpApiManager.logOut().then(function () {\n          location.hash = '/login'\n          AppRuntimeManager.reload()\n        })\n      })\n    }\n\n    $scope.openChangelog = function () {\n      ChangelogNotifyService.showChangelog(false)\n    }\n\n    $scope.showPeerInfo = function () {\n      if ($scope.curDialog.peerID > 0) {\n        AppUsersManager.openUser($scope.curDialog.peerID)\n      } else if ($scope.curDialog.peerID < 0) {\n        AppChatsManager.openChat(-$scope.curDialog.peerID)\n      }\n    }\n\n    $scope.toggleEdit = function () {\n      $scope.$broadcast('history_edit_toggle')\n    }\n    $scope.selectedFlush = function () {\n      $scope.$broadcast('history_edit_flush')\n    }\n    $scope.toggleMedia = function (mediaType) {\n      $scope.$broadcast('history_media_toggle', mediaType)\n    }\n    $scope.returnToRecent = function () {\n      $scope.$broadcast('history_return_recent')\n    }\n    $scope.toggleSearch = function () {\n      $scope.$broadcast('dialogs_search_toggle')\n    }\n\n    updateCurDialog()\n\n    function updateCurDialog () {\n      $modalStack.dismissAll()\n      var addParams = pendingParams || {}\n      pendingParams = false\n      addParams.messageID = parseInt(addParams.messageID) || false\n      addParams.startParam = addParams.startParam\n\n      var peerStringPromise\n      if ($routeParams.p && $routeParams.p.charAt(0) == '@') {\n        if ($scope.curDialog === undefined) {\n          $scope.curDialog = {\n            peer: '',\n            peerID: 0\n          }\n        }\n        peerStringPromise = AppPeersManager.resolveUsername($routeParams.p.substr(1)).then(function (peerID) {\n          return qSync.when(AppPeersManager.getPeerString(peerID))\n        })\n      } else {\n        peerStringPromise = qSync.when($routeParams.p)\n      }\n      peerStringPromise.then(function (peerString) {\n        $scope.curDialog = angular.extend({\n          peer: peerString,\n          peerID: AppPeersManager.getPeerID(peerString || '')\n        }, addParams)\n        if (pendingAttachment) {\n          $scope.$broadcast('peer_draft_attachment', pendingAttachment)\n          pendingAttachment = false\n        }\n      })\n    }\n\n    ChangelogNotifyService.checkUpdate()\n    HttpsMigrateService.start()\n    LayoutSwitchService.start()\n    LocationParamsService.start()\n    AppStickersManager.start()\n  })\n\n  .controller('AppImDialogsController', function ($scope, $location, $q, $timeout, $routeParams, MtpApiManager, AppUsersManager, AppChatsManager, AppMessagesManager, AppProfileManager, AppPeersManager, PhonebookContactsService, ErrorService, AppRuntimeManager) {\n    $scope.dialogs = []\n    $scope.myResults = []\n    $scope.foundPeers = []\n    $scope.foundMessages = []\n\n    if ($scope.search === undefined) {\n      $scope.search = {}\n    }\n    if ($scope.isEmpty === undefined) {\n      $scope.isEmpty = {}\n    }\n    $scope.phonebookAvailable = PhonebookContactsService.isAvailable()\n\n    var searchMessages = false\n    var offsetIndex = 0\n    var maxID = 0\n    var hasMore = false\n    var jump = 0\n    var contactsJump = 0\n    var peersInDialogs = {}\n    var typingTimeouts = {}\n    var contactsShown\n\n    $scope.$on('dialogs_need_more', function () {\n      // console.log('on need more')\n      showMoreDialogs()\n    })\n\n    $scope.$on('dialog_unread', function (e, dialog) {\n      angular.forEach($scope.dialogs, function (curDialog) {\n        if (curDialog.peerID == dialog.peerID) {\n          curDialog.unreadCount = dialog.count\n        }\n      })\n    })\n\n    $scope.$on('history_search', function (e, peerID) {\n      $scope.setSearchPeer(peerID)\n    })\n\n    $scope.$on('esc_no_more', function () {\n      $scope.setSearchPeer(false)\n    })\n\n    $scope.$on('dialogs_multiupdate', function (e, dialogsUpdated) {\n      if (searchMessages) {\n        return false\n      }\n      if ($scope.search.query !== undefined &&\n          $scope.search.query.length) {\n        return false\n      }\n\n      var i\n      var dialog\n      var newPeer = false\n      var len = $scope.dialogs.length\n      for (i = 0; i < len; i++) {\n        dialog = $scope.dialogs[i]\n        if (dialogsUpdated[dialog.peerID]) {\n          $scope.dialogs.splice(i, 1)\n          i--\n          len--\n          AppMessagesManager.clearDialogCache(dialog.mid)\n        }\n      }\n\n      angular.forEach(dialogsUpdated, function (dialog, peerID) {\n        if ($scope.noUsers && peerID > 0) {\n          return\n        }\n        if (!peersInDialogs[peerID]) {\n          peersInDialogs[peerID] = true\n          newPeer = true\n        }\n        $scope.dialogs.unshift(\n          AppMessagesManager.wrapForDialog(dialog.top_message, dialog)\n        )\n      })\n\n      sortDialogs()\n\n      if (newPeer) {\n        delete $scope.isEmpty.dialogs\n        if (contactsShown) {\n          showMoreConversations()\n        }\n      }\n    })\n\n    function deleteDialog (peerID) {\n      for (var i = 0; i < $scope.dialogs.length; i++) {\n        if ($scope.dialogs[i].peerID == peerID) {\n          $scope.dialogs.splice(i, 1)\n          break\n        }\n      }\n    }\n\n    function sortDialogs () {\n      var myID = false\n      if ($scope.forPeerSelect) {\n        myID = AppUsersManager.getSelf().id\n      }\n      $scope.dialogs.sort(function (d1, d2) {\n        if (d1.peerID == myID) {\n          return -1\n        }\n        else if (d2.peerID == myID) {\n          return 1\n        }\n        return d2.index - d1.index\n      })\n    }\n\n    $scope.$on('dialog_top', function (e, dialog) {\n      var curDialog, i, wrappedDialog\n      var len = $scope.dialogs.length\n      for (i = 0; i < len; i++) {\n        curDialog = $scope.dialogs[i]\n        if (curDialog.peerID == dialog.peerID) {\n          wrappedDialog = AppMessagesManager.wrapForDialog(dialog.top_message, dialog)\n          $scope.dialogs.splice(i, 1, wrappedDialog)\n          break\n        }\n      }\n      sortDialogs()\n      if (wrappedDialog == $scope.dialogs[len - 1]) {\n        $scope.dialogs.splice(len - 1, 1)\n      }\n    })\n    $scope.$on('dialog_flush', function (e, update) {\n      var curDialog, i\n      for (i = 0; i < $scope.dialogs.length; i++) {\n        curDialog = $scope.dialogs[i]\n        if (curDialog.peerID == update.peerID) {\n          curDialog.deleted = true\n          break\n        }\n      }\n    })\n    $scope.$on('dialog_drop', function (e, dialog) {\n      deleteDialog(dialog.peerID)\n    })\n\n    $scope.$on('dialog_draft', function (e, draftUpdate) {\n      var curDialog, i\n      for (i = 0; i < $scope.dialogs.length; i++) {\n        curDialog = $scope.dialogs[i]\n        if (curDialog.peerID == draftUpdate.peerID) {\n          curDialog.draft = draftUpdate.draft\n          if (draftUpdate.index) {\n            curDialog.index = draftUpdate.index\n          }\n          sortDialogs()\n          break\n        }\n      }\n    })\n\n    $scope.$on('history_delete', function (e, historyUpdate) {\n      for (var i = 0; i < $scope.dialogs.length; i++) {\n        if ($scope.dialogs[i].peerID == historyUpdate.peerID) {\n          if (historyUpdate.msgs[$scope.dialogs[i].mid]) {\n            $scope.dialogs[i].deleted = true\n          }\n          break\n        }\n      }\n    })\n\n    $scope.$on('apiUpdate', function (e, update) {\n      switch (update._) {\n        case 'updateUserTyping':\n        case 'updateChatUserTyping':\n          if (!AppUsersManager.hasUser(update.user_id)) {\n            if (update.chat_id &&\n              AppChatsManager.hasChat(update.chat_id) &&\n              !AppChatsManager.isChannel(update.chat_id)) {\n              AppProfileManager.getChatFull(update.chat_id)\n            }\n            return\n          }\n          var peerID = update._ == 'updateUserTyping' ? update.user_id : -update.chat_id\n          AppUsersManager.forceUserOnline(update.user_id)\n          for (var i = 0; i < $scope.dialogs.length; i++) {\n            if ($scope.dialogs[i].peerID == peerID) {\n              $scope.dialogs[i].typing = update.user_id\n              $timeout.cancel(typingTimeouts[peerID])\n\n              typingTimeouts[peerID] = $timeout(function () {\n                for (var i = 0; i < $scope.dialogs.length; i++) {\n                  if ($scope.dialogs[i].peerID == peerID) {\n                    if ($scope.dialogs[i].typing == update.user_id) {\n                      delete $scope.dialogs[i].typing\n                    }\n                  }\n                }\n              }, 6000)\n              break\n            }\n          }\n          break\n      }\n    })\n\n    $scope.$watchCollection('search', function () {\n      $scope.dialogs = []\n      $scope.foundMessages = []\n      searchMessages = !!$scope.searchPeer\n      contactsJump++\n      loadDialogs()\n    })\n\n    if (Config.Mobile) {\n      $scope.$watch('curDialog.peer', function () {\n        $scope.$broadcast('ui_dialogs_update')\n      })\n    }\n\n    $scope.importPhonebook = function () {\n      PhonebookContactsService.openPhonebookImport()\n    }\n\n    $scope.setSearchPeer = function (peerID) {\n      $scope.searchPeer = peerID || false\n      $scope.searchClear()\n      if (peerID) {\n        $scope.dialogs = []\n        $scope.foundPeers = []\n        searchMessages = true\n        $scope.toggleSearch()\n      } else {\n        searchMessages = false\n      }\n      loadDialogs(true)\n    }\n\n    $scope.$on('contacts_update', function () {\n      if (contactsShown) {\n        showMoreConversations()\n      }\n    })\n\n    $scope.$on('ui_dialogs_search_clear', $scope.searchClear)\n\n    if (!$scope.noMessages) {\n      $scope.$on('dialogs_search', function (e, data) {\n        $scope.search.query = data.query || ''\n        $scope.toggleSearch()\n      })\n    }\n\n    var searchTimeoutPromise\n    function getDialogs (force) {\n      var curJump = ++jump\n\n      if (searchTimeoutPromise) {\n        $timeout.cancel(searchTimeoutPromise)\n      }\n\n      if (searchMessages) {\n        searchTimeoutPromise = (force || maxID) ? $q.when() : $timeout(angular.noop, 500)\n        return searchTimeoutPromise.then(function () {\n          searchTimeoutPromise = false;\n          var searchPeerID = $scope.searchPeer || false\n          return AppMessagesManager.getSearch(searchPeerID, $scope.search.query, {_: 'inputMessagesFilterEmpty'}, maxID).then(function (result) {\n            if (curJump != jump) {\n              return $q.reject()\n            }\n            var dialogs = []\n            angular.forEach(result.history, function (messageID) {\n              var message = AppMessagesManager.getMessage(messageID)\n              var peerID = AppMessagesManager.getMessagePeer(message)\n\n              dialogs.push({\n                peerID: peerID,\n                top_message: messageID,\n                unread_count: -1\n              })\n            })\n\n            return {\n              dialogs: dialogs\n            }\n          })\n        })\n      }\n\n      var query = $scope.search.query || ''\n      if ($scope.noUsers) {\n        query = '%pg ' + query\n      }\n      return AppMessagesManager.getConversations(query, offsetIndex).then(function (result) {\n        if (curJump != jump) {\n          return $q.reject()\n        }\n        if (!query && !offsetIndex && $scope.forPeerSelect) {\n          var myID = AppUsersManager.getSelf().id\n          return AppMessagesManager.getConversation(myID).then(function (dialog) {\n            result.dialogs.unshift(dialog)\n            return result\n          })\n        }\n        return result\n      })\n    }\n\n    function loadDialogs (force) {\n      offsetIndex = 0\n      maxID = 0\n      hasMore = false\n      if (!searchMessages) {\n        peersInDialogs = {}\n        contactsShown = false\n      }\n\n      getDialogs(force).then(function (dialogsResult) {\n        if (!searchMessages) {\n          $scope.dialogs = []\n          $scope.myResults = []\n          $scope.foundPeers = []\n        }\n        $scope.foundMessages = []\n\n        var dialogsList = searchMessages ? $scope.foundMessages : $scope.dialogs\n\n        if (dialogsResult.dialogs.length) {\n          angular.forEach(dialogsResult.dialogs, function (dialog) {\n            if ($scope.canSend &&\n                AppPeersManager.isChannel(dialog.peerID) &&\n                !AppChatsManager.hasRights(-dialog.peerID, 'send')) {\n              return\n            }\n            var wrapDialog = searchMessages ? undefined : dialog\n            var wrappedDialog = AppMessagesManager.wrapForDialog(dialog.top_message, wrapDialog)\n\n            if (searchMessages &&\n                $scope.searchPeer) {\n              var message = AppMessagesManager.getMessage(dialog.top_message)\n              if (message.fromID > 0) {\n                wrappedDialog.peerID = message.fromID\n                wrappedDialog.foundInHistory = true\n              }\n            }\n\n            if (searchMessages) {\n              wrappedDialog.unreadCount = -1\n            } else {\n              if (peersInDialogs[dialog.peerID]) {\n                return\n              } else {\n                peersInDialogs[dialog.peerID] = true\n              }\n            }\n            dialogsList.push(wrappedDialog)\n          })\n\n          if (searchMessages) {\n            maxID = dialogsResult.dialogs[dialogsResult.dialogs.length - 1].top_message\n          } else {\n            offsetIndex = dialogsResult.dialogs[dialogsResult.dialogs.length - 1].index\n            delete $scope.isEmpty.dialogs\n          }\n          hasMore = true\n        } else {\n          hasMore = false\n        }\n\n        $scope.$broadcast('ui_dialogs_change')\n\n        if (!$scope.search.query) {\n          AppMessagesManager.getConversations('', offsetIndex, 100)\n          if (!dialogsResult.dialogs.length) {\n            $scope.isEmpty.dialogs = true\n            showMoreDialogs()\n          }\n        } else {\n          showMoreDialogs()\n        }\n      })\n    }\n\n    function showMoreDialogs () {\n      if (contactsShown && (!hasMore || (!offsetIndex && !maxID))) {\n        return\n      }\n\n      if (!hasMore &&\n        !searchMessages &&\n        !$scope.noUsers &&\n        ($scope.search.query || !$scope.dialogs.length)) {\n        showMoreConversations()\n        return\n      }\n\n      getDialogs().then(function (dialogsResult) {\n        if (dialogsResult.dialogs.length) {\n          var dialogsList = searchMessages ? $scope.foundMessages : $scope.dialogs\n\n          angular.forEach(dialogsResult.dialogs, function (dialog) {\n            if ($scope.canSend &&\n                AppPeersManager.isChannel(dialog.peerID) &&\n                !AppChatsManager.hasRights(-dialog.peerID, 'send')) {\n              return\n            }\n            var wrapDialog = searchMessages ? undefined : dialog\n            var wrappedDialog = AppMessagesManager.wrapForDialog(dialog.top_message, wrapDialog)\n\n            if (searchMessages &&\n                $scope.searchPeer) {\n              var message = AppMessagesManager.getMessage(dialog.top_message)\n              if (message.fromID > 0) {\n                wrappedDialog.peerID = message.fromID\n                wrappedDialog.foundInHistory = true\n              }\n            }\n\n            if (searchMessages) {\n              wrappedDialog.unreadCount = -1\n            } else {\n              if (peersInDialogs[dialog.peerID]) {\n                return\n              } else {\n                peersInDialogs[dialog.peerID] = true\n              }\n            }\n\n            if (searchMessages &&\n                $scope.searchPeer) {\n              var message = AppMessagesManager.getMessage(dialog.top_message)\n              if (message.fromID > 0) {\n                wrappedDialog.peerID = message.fromID\n              }\n            }\n\n            dialogsList.push(wrappedDialog)\n          })\n\n          if (searchMessages) {\n            maxID = dialogsResult.dialogs[dialogsResult.dialogs.length - 1].top_message\n          } else {\n            offsetIndex = dialogsResult.dialogs[dialogsResult.dialogs.length - 1].index\n          }\n\n          $scope.$broadcast('ui_dialogs_append')\n\n          hasMore = true\n        } else {\n          hasMore = false\n        }\n      })\n    }\n\n    function showMoreConversations () {\n      contactsShown = true\n\n      var curJump = ++contactsJump\n      AppUsersManager.getContacts($scope.search.query).then(function (contactsList) {\n        if (curJump != contactsJump) return\n        $scope.myResults = []\n        angular.forEach(contactsList, function (userID) {\n          if (peersInDialogs[userID] === undefined) {\n            $scope.myResults.push({\n              id: userID,\n              peerString: AppUsersManager.getUserString(userID)\n            })\n          }\n        })\n\n        if (contactsList.length) {\n          delete $scope.isEmpty.contacts\n        } else if (!$scope.search.query) {\n          $scope.isEmpty.contacts = true\n        }\n        $scope.$broadcast('ui_dialogs_append')\n      })\n\n      if ($scope.search.query && $scope.search.query.length >= 2) {\n        $timeout(function () {\n          if (curJump != contactsJump) return\n          MtpApiManager.invokeApi('contacts.search', {q: $scope.search.query, limit: 10}).then(function (result) {\n            AppUsersManager.saveApiUsers(result.users)\n            AppChatsManager.saveApiChats(result.chats)\n            if (curJump != contactsJump) return\n            var alreadyPeers = []\n            angular.forEach($scope.myResults, function (peerFound) {\n              alreadyPeers.push(peerFound.id)\n            })\n            angular.forEach(result.my_results, function (peerFound) {\n              var peerID = AppPeersManager.getPeerID(peerFound)\n              if (peersInDialogs[peerID] === undefined &&\n                  alreadyPeers.indexOf(peerID) == -1) {\n                alreadyPeers.push(peerID)\n                if ($scope.canSend &&\n                  AppPeersManager.isChannel(peerID) &&\n                  !AppChatsManager.hasRights(-peerID, 'send')) {\n                  return\n                }\n                $scope.myResults.push({\n                  id: peerID,\n                  peerString: AppPeersManager.getPeerString(peerID)\n                })\n              }\n            })\n\n            $scope.foundPeers = []\n            angular.forEach(result.results, function (peerFound) {\n              var peerID = AppPeersManager.getPeerID(peerFound)\n              if (peersInDialogs[peerID] === undefined &&\n                  alreadyPeers.indexOf(peerID) == -1) {\n                if ($scope.canSend &&\n                  AppPeersManager.isChannel(peerID) &&\n                  !AppChatsManager.hasRights(-peerID, 'send')) {\n                  return\n                }\n                alreadyPeers.push(peerID)\n                $scope.foundPeers.push({\n                  id: peerID,\n                  username: AppPeersManager.getPeer(peerID).username,\n                  peerString: AppUsersManager.getUserString(peerID)\n                })\n              }\n            })\n          }, function (error) {\n            if (error.code == 400) {\n              error.handled = true\n            }\n          })\n        }, 500)\n      }\n\n      if ($scope.search.query && !$scope.noMessages) {\n        searchMessages = true\n        loadDialogs()\n      }\n    }\n  })\n\n  .controller('AppImHistoryController', function ($scope, $location, $timeout, $modal, $rootScope, toaster, _, MtpApiManager, AppUsersManager, AppChatsManager, AppMessagesManager, AppPeersManager, ApiUpdatesManager, PeersSelectService, IdleManager, StatusManager, NotificationsManager, ErrorService, GeoLocationManager) {\n    $scope.$watchCollection('curDialog', applyDialogSelect)\n\n    ApiUpdatesManager.attach()\n    IdleManager.start()\n    StatusManager.start()\n\n    $scope.peerHistories = []\n    $scope.selectedMsgs = {}\n    $scope.selectedCount = 0\n    $scope.historyState.selectActions = false\n    $scope.historyState.botActions = false\n    $scope.historyState.channelActions = false\n    $scope.historyState.canDelete = false\n    $scope.historyState.canReply = false\n    $scope.historyState.missedCount = 0\n    $scope.historyState.skipped = false\n    $scope.state = {}\n\n    $scope.toggleMessage = toggleMessage\n    $scope.selectedDelete = selectedDelete\n    $scope.selectedForward = selectedForward\n    $scope.selectedReply = selectedReply\n    $scope.selectedEdit = selectedEdit\n    $scope.selectedCancel = selectedCancel\n    $scope.selectedFlush = selectedFlush\n    $scope.selectedReport = selectedReport\n    $scope.selectInlineBot = selectInlineBot\n\n    $scope.startBot = startBot\n    $scope.cancelBot = cancelBot\n    $scope.joinChannel = joinChannel\n    $scope.togglePeerMuted = togglePeerMuted\n\n    $scope.toggleEdit = toggleEdit\n    $scope.toggleMedia = toggleMedia\n    $scope.returnToRecent = returnToRecent\n\n    $scope.$on('history_edit_toggle', toggleEdit)\n    $scope.$on('history_edit_flush', selectedFlush)\n    $scope.$on('history_media_toggle', function (e, mediaType) {\n      toggleMedia(mediaType)\n    })\n\n    $scope.$on('history_return_recent', returnToRecent)\n\n    var peerID\n    var peerHistory = false\n    var unreadAfterIdle = false\n    var hasMore = false\n    var hasLess = false\n    var maxID = 0\n    var minID = 0\n    var lastSelectID = false\n    var inputMediaFilters = {\n      photos: 'inputMessagesFilterPhotos',\n      video: 'inputMessagesFilterVideo',\n      documents: 'inputMessagesFilterDocument',\n      audio: 'inputMessagesFilterVoice',\n      round: 'inputMessagesFilterRoundVideo',\n      music: 'inputMessagesFilterMusic',\n      urls: 'inputMessagesFilterUrl',\n      mentions: 'inputMessagesFilterMyMentions'\n    }\n    var jump = 0\n    var moreJump = 0\n    var moreActive = false\n    var morePending = false\n    var lessJump = 0\n    var lessActive = false\n    var lessPending = false\n\n    function applyDialogSelect (newDialog, oldDialog) {\n      peerID = $rootScope.selectedPeerID = newDialog.peerID\n      var migratedToPeer = AppPeersManager.getPeerMigratedTo(peerID)\n      if (migratedToPeer) {\n        $rootScope.$broadcast('history_focus', {\n          peerString: AppPeersManager.getPeerString(migratedToPeer)\n        })\n        return\n      }\n      $scope.historyFilter.mediaType = false\n\n      AppPeersManager.getInputPeer(newDialog.peer || $scope.curDialog.peer || '')\n\n      updateBotActions()\n      selectedCancel(true)\n\n      if (oldDialog.peer &&\n          oldDialog.peer == newDialog.peer &&\n          newDialog.messageID) {\n        messageFocusHistory()\n      } else if (peerID) {\n        updateHistoryPeer(true)\n        loadHistory()\n      } else {\n        showEmptyHistory()\n      }\n    }\n\n    function historiesQueuePush (peerID) {\n      var pos = -1\n      var maxLen = 10\n      var i, history, diff\n\n      for (i = 0; i < $scope.peerHistories.length; i++) {\n        if ($scope.peerHistories[i].peerID == peerID) {\n          pos = i\n          break\n        }\n      }\n      if (pos > -1) {\n        history = $scope.peerHistories[pos]\n        return history\n      }\n      history = {peerID: peerID, messages: [], ids: []}\n      $scope.peerHistories.unshift(history)\n      diff = $scope.peerHistories.length - maxLen\n      if (diff > 0) {\n        $scope.peerHistories.splice(maxLen - 1, diff)\n      }\n\n      return history\n    }\n\n    function historiesQueueFind (peerID) {\n      var i\n      for (i = 0; i < $scope.peerHistories.length; i++) {\n        if ($scope.peerHistories[i].peerID == peerID) {\n          return $scope.peerHistories[i]\n        }\n      }\n      return false\n    }\n\n    function historiesQueuePop (peerID) {\n      var i\n      for (i = 0; i < $scope.peerHistories.length; i++) {\n        if ($scope.peerHistories[i].peerID == peerID) {\n          $scope.peerHistories.splice(i, 1)\n          return true\n        }\n      }\n      return false\n    }\n\n    function updateHistoryPeer (preload) {\n      var peerData = AppPeersManager.getPeer(peerID)\n      // console.log('update', preload, peerData)\n      if (!peerData || peerData.deleted) {\n        safeReplaceObject($scope.state, {loaded: false})\n        return false\n      }\n\n      peerHistory = historiesQueuePush(peerID)\n\n      safeReplaceObject($scope.historyPeer, {\n        id: peerID,\n        data: peerData\n      })\n\n      MtpApiManager.getUserID().then(function (myID) {\n        $scope.ownID = myID\n      })\n\n      if (preload) {\n        $scope.historyState.typing.splice(0, $scope.historyState.typing.length)\n        $scope.$broadcast('ui_peer_change')\n        $scope.$broadcast('ui_history_change')\n        safeReplaceObject($scope.state, {loaded: true, empty: !peerHistory.messages.length, mayBeHasMore: true})\n\n        updateBotActions()\n        updateChannelActions()\n      }\n    }\n\n    function updateBotActions () {\n      var wasBotActions = $scope.historyState.botActions\n      if (!peerID ||\n        peerID < 0 ||\n        !AppUsersManager.isBot(peerID) ||\n        $scope.historyFilter.mediaType ||\n        $scope.curDialog.messageID) {\n        $scope.historyState.botActions = false\n      } else if (\n        $scope.state.empty || (\n        peerHistory &&\n        peerHistory.messages.length == 1 &&\n        peerHistory.messages[0].action &&\n        peerHistory.messages[0].action._ == 'messageActionBotIntro'\n        )\n      ) {\n        $scope.historyState.botActions = 'start'\n      } else if ($scope.curDialog.startParam) {\n        $scope.historyState.botActions = 'param'\n      } else {\n        $scope.historyState.botActions = false\n      }\n      if (wasBotActions != $scope.historyState.botActions) {\n        $scope.$broadcast('ui_panel_update')\n      }\n    }\n\n    function updateChannelActions () {\n      var wasChannelActions = $scope.historyState.channelActions\n      var channel\n      if (peerID &&\n        AppPeersManager.isChannel(peerID) &&\n        (channel = AppChatsManager.getChat(-peerID))) {\n        var canSend = AppChatsManager.hasRights(-peerID, 'send')\n        if (!canSend) {\n          if (channel.pFlags.left) {\n            $scope.historyState.channelActions = 'join'\n          } else {\n            if (!$scope.historyState.channelActions) {\n              $scope.historyState.channelActions = 'mute'\n            }\n            NotificationsManager.getPeerMuted(peerID).then(function (muted) {\n              $scope.historyState.channelActions = muted ? 'unmute' : 'mute'\n            })\n          }\n        } else {\n          $scope.historyState.channelActions = false\n        }\n        $scope.historyState.canReply = canSend\n        $scope.historyState.canDelete = canSend || channel.pFlags.moderator\n      } else {\n        $scope.historyState.channelActions = false\n        $scope.historyState.canReply = true\n        $scope.historyState.canDelete = true\n      }\n      if (wasChannelActions != $scope.historyState.channelActions) {\n        $scope.$broadcast('ui_panel_update')\n      }\n    }\n\n    function messageFocusHistory () {\n      var history = historiesQueueFind(peerID)\n\n      if (history &&\n        history.ids.indexOf($scope.curDialog.messageID) != -1) {\n        $scope.historyUnread = {}\n        var focusedMsgID = $scope.curDialog.messageID || 0\n        $scope.$broadcast('messages_focus', focusedMsgID)\n        $scope.$broadcast('ui_history_change_scroll', true)\n      } else {\n        loadHistory()\n      }\n    }\n\n    function showLessHistory () {\n      if (!hasLess) {\n        return\n      }\n      if (moreActive) {\n        lessPending = true\n        return\n      }\n      lessPending = false\n      $scope.state.lessActive = lessActive = true\n\n      var curJump = jump\n      var curLessJump = ++lessJump\n      var limit = 0\n      var backLimit = 20\n      AppMessagesManager.getHistory($scope.curDialog.peerID, minID, limit, backLimit).then(function (historyResult) {\n        $scope.state.lessActive = lessActive = false\n        if (curJump != jump || curLessJump != lessJump) return\n\n        var i, id\n        for (i = historyResult.history.length - 1; i >= 0; i--) {\n          id = historyResult.history[i]\n          if (id > minID) {\n            peerHistory.messages.push(AppMessagesManager.wrapForHistory(id))\n            peerHistory.ids.push(id)\n          }\n        }\n\n        if (historyResult.history.length) {\n          minID = historyResult.history.length >= backLimit\n            ? historyResult.history[0]\n            : 0\n          if (AppMessagesManager.regroupWrappedHistory(peerHistory.messages, -backLimit)) {\n            $scope.$broadcast('messages_regroup')\n          }\n          delete $scope.state.empty\n          $scope.$broadcast('ui_history_append')\n        } else {\n          minID = 0\n        }\n        $scope.historyState.skipped = hasLess = minID > 0\n\n        if (morePending) {\n          showMoreHistory()\n        }\n      })\n    }\n\n    function showMoreHistory () {\n      if (!hasMore) {\n        return\n      }\n      if (lessActive) {\n        morePending = true\n        return\n      }\n      morePending = false\n      $scope.state.moreActive = moreActive = true\n\n      var curJump = jump\n      var curMoreJump = ++moreJump\n      var inputMediaFilter = $scope.historyFilter.mediaType && {_: inputMediaFilters[$scope.historyFilter.mediaType]}\n      var limit = Config.Mobile ? 20 : 0\n      var getMessagesPromise = inputMediaFilter\n        ? AppMessagesManager.getSearch($scope.curDialog.peerID, '', inputMediaFilter, maxID, limit)\n        : AppMessagesManager.getHistory($scope.curDialog.peerID, maxID, limit)\n\n      getMessagesPromise.then(function (historyResult) {\n        $scope.state.moreActive = moreActive = false\n        if (curJump != jump || curMoreJump != moreJump) return\n\n        angular.forEach(historyResult.history, function (id) {\n          peerHistory.messages.unshift(AppMessagesManager.wrapForHistory(id))\n          peerHistory.ids.unshift(id)\n        })\n\n        hasMore = historyResult.count === null ||\n          (historyResult.history.length && peerHistory.messages.length < historyResult.count)\n\n        if (historyResult.history.length) {\n          delete $scope.state.empty\n          maxID = historyResult.history[historyResult.history.length - 1]\n          $scope.$broadcast('ui_history_prepend')\n          if (AppMessagesManager.regroupWrappedHistory(peerHistory.messages, historyResult.history.length + 1)) {\n            $scope.$broadcast('messages_regroup')\n          }\n        }\n\n        if (lessPending) {\n          showLessHistory()\n        }\n      })\n    }\n\n    function loadHistory (forceRecent) {\n      $scope.historyState.missedCount = 0\n\n      hasMore = false\n      $scope.historyState.skipped = hasLess = false\n      maxID = 0\n      minID = 0\n      peerHistory = historiesQueuePush(peerID)\n\n      var limit = 0\n      var backLimit = 0\n\n      if ($scope.curDialog.messageID) {\n        maxID = parseInt($scope.curDialog.messageID)\n        limit = 20\n        backLimit = 20\n      } else if (forceRecent) {\n        limit = 10\n      }\n\n      $scope.state.moreActive = moreActive = false\n      morePending = false\n      $scope.state.lessActive = lessActive = false\n      lessPending = false\n\n      var prerenderedLen = peerHistory.messages.length\n      if (prerenderedLen && (maxID || backLimit)) {\n        prerenderedLen = 0\n        peerHistory.messages = []\n        peerHistory.ids = []\n        $scope.state.empty = true\n      }\n\n      var curJump = ++jump\n      var inputMediaFilter = $scope.historyFilter.mediaType && {_: inputMediaFilters[$scope.historyFilter.mediaType]}\n      var getMessagesPromise = inputMediaFilter\n        ? AppMessagesManager.getSearch($scope.curDialog.peerID, '', inputMediaFilter, maxID)\n        : AppMessagesManager.getHistory($scope.curDialog.peerID, maxID, limit, backLimit, prerenderedLen)\n\n      $scope.state.mayBeHasMore = true\n      // console.log(dT(), 'start load history', $scope.curDialog)\n      getMessagesPromise.then(function (historyResult) {\n        if (curJump != jump) return\n        // console.log(dT(), 'history loaded', angular.copy(historyResult))\n\n        var fetchedLength = historyResult.history.length\n\n        minID = (historyResult.unreadSkip || (maxID && historyResult.history.indexOf(maxID) >= backLimit - 1))\n          ? historyResult.history[0]\n          : 0\n        maxID = historyResult.history[historyResult.history.length - 1]\n\n        $scope.historyState.skipped = hasLess = minID > 0\n        hasMore = historyResult.count === null ||\n          (fetchedLength && fetchedLength < historyResult.count)\n\n        updateHistoryPeer()\n        safeReplaceObject($scope.state, {loaded: true, empty: !fetchedLength})\n\n        peerHistory.messages = []\n        peerHistory.ids = []\n        angular.forEach(historyResult.history, function (id) {\n          var message = AppMessagesManager.wrapForHistory(id)\n          if ($scope.historyState.skipped) {\n            delete message.pFlags.unread\n          }\n          if (historyResult.unreadOffset) {\n            message.unreadAfter = true\n          }\n          peerHistory.messages.push(message)\n          peerHistory.ids.push(id)\n        })\n        peerHistory.messages.reverse()\n        peerHistory.ids.reverse()\n\n        if (AppMessagesManager.regroupWrappedHistory(peerHistory.messages)) {\n          $scope.$broadcast('messages_regroup')\n        }\n\n        if (historyResult.unreadOffset) {\n          $scope.historyUnreadAfter = historyResult.history[historyResult.unreadOffset - 1]\n        } else if ($scope.historyUnreadAfter) {\n          delete $scope.historyUnreadAfter\n        }\n        $scope.$broadcast('messages_unread_after')\n        var focusedMsgID = $scope.curDialog.messageID || 0\n        onContentLoaded(function () {\n          $scope.$broadcast('messages_focus', focusedMsgID)\n        })\n        $scope.$broadcast('ui_history_change')\n\n        if (!$rootScope.idle.isIDLE) {\n          AppMessagesManager.readHistory($scope.curDialog.peerID)\n        }\n\n        updateBotActions()\n        updateChannelActions()\n      }, function () {\n        safeReplaceObject($scope.state, {error: true, loaded: true})\n      })\n    }\n\n    function showEmptyHistory () {\n      jump++\n      safeReplaceObject($scope.historyPeer, {})\n      safeReplaceObject($scope.state, {notSelected: true})\n      peerHistory = false\n      hasMore = false\n\n      $scope.$broadcast('ui_history_change')\n    }\n\n    function startBot () {\n      AppMessagesManager.startBot(peerID, 0, $scope.curDialog.startParam)\n      $scope.curDialog.startParam = false\n    }\n\n    function cancelBot () {\n      delete $scope.curDialog.startParam\n    }\n\n    function joinChannel () {\n      MtpApiManager.invokeApi('channels.joinChannel', {\n        channel: AppChatsManager.getChannelInput(-peerID)\n      }).then(function (result) {\n        ApiUpdatesManager.processUpdateMessage(result)\n      })\n    }\n\n    function togglePeerMuted (muted) {\n      NotificationsManager.getPeerSettings(peerID).then(function (settings) {\n        settings.mute_until = !muted ? 0 : 2000000000\n        NotificationsManager.updatePeerSettings(peerID, settings)\n      })\n    }\n\n    function toggleMessage (messageID, $event) {\n      if ($scope.historyState.botActions ||\n        $rootScope.idle.afterFocus) {\n        return false\n      }\n      var message = AppMessagesManager.getMessage(messageID)\n      if (message._ == 'messageService') {\n        return false\n      }\n\n      if (!$scope.historyState.selectActions) {\n        if (getSelectedText()) {\n          return false\n        }\n\n        var target = $event.target\n        while (target) {\n          if (target instanceof SVGElement) {\n            target = target.parentNode\n            continue\n          }\n          if (target.className && target.className.indexOf('im_message_outer_wrap') != -1) {\n            if (Config.Mobile) {\n              return false\n            }\n            break\n          }\n          if (target.className &&\n            target.className.indexOf('im_message_date') != -1) {\n            if ($scope.historyFilter.mediaType) {\n              $rootScope.$broadcast('history_focus', {\n                peerString: $scope.curDialog.peer,\n                messageID: messageID\n              })\n              return\n            }\n            if (AppPeersManager.isBroadcast(peerID)) {\n              quickForward(messageID)\n            } else {\n              selectedReply(messageID)\n            }\n            return false\n          }\n          if (Config.Mobile &&\n            target.className &&\n            target.className.indexOf('im_message_body') != -1) {\n            break\n          }\n          if (target.tagName == 'A' || hasOnclick(target)) {\n            return false\n          }\n          target = target.parentNode\n        }\n\n        if (Config.Mobile) {\n          $scope.historyState.canEdit = AppMessagesManager.canEditMessage(messageID)\n          $scope.historyState.canReport = AppMessagesManager.canReportMessage(messageID)\n\n          $modal.open({\n            templateUrl: templateUrl('message_actions_modal'),\n            windowClass: 'message_actions_modal_window',\n            scope: $scope.$new()\n          }).result.then(function (action) {\n            switch (action) {\n              case 'reply':\n                selectedReply(messageID)\n                break\n\n              case 'edit':\n                selectedEdit(messageID)\n                break\n\n              case 'delete':\n                selectedDelete(messageID)\n                break\n\n              case 'forward':\n                selectedForward(messageID)\n                break\n\n              case 'report':\n                selectedReport(messageID)\n                break\n\n              case 'select':\n                $scope.historyState.selectActions = 'selected'\n                $scope.$broadcast('ui_panel_update')\n                toggleMessage(messageID)\n                break\n            }\n          })\n          return false\n        }\n      }\n\n      var shiftClick = $event && $event.shiftKey\n      if (shiftClick) {\n        $scope.$broadcast('ui_selection_clear')\n      }\n\n      if ($scope.selectedMsgs[messageID]) {\n        lastSelectID = false\n        delete $scope.selectedMsgs[messageID]\n        $scope.selectedCount--\n        if (!$scope.selectedCount) {\n          $scope.historyState.selectActions = false\n          $scope.$broadcast('ui_panel_update')\n        }\n      } else {\n        if (!shiftClick) {\n          lastSelectID = messageID\n        } else if (lastSelectID != messageID) {\n          var dir = lastSelectID > messageID\n          var i, startPos, curMessageID\n\n          for (i = 0; i < peerHistory.messages.length; i++) {\n            if (peerHistory.messages[i].mid == lastSelectID) {\n              startPos = i\n              break\n            }\n          }\n\n          i = startPos\n          while (peerHistory.messages[i] &&\n            (curMessageID = peerHistory.messages[i].mid) != messageID) {\n            if (!$scope.selectedMsgs[curMessageID]) {\n              $scope.selectedMsgs[curMessageID] = true\n              $scope.selectedCount++\n            }\n            i += dir ? -1 : +1\n          }\n        }\n\n        $scope.selectedMsgs[messageID] = true\n        $scope.selectedCount++\n        if (!$scope.historyState.selectActions) {\n          $scope.historyState.selectActions = 'selected'\n          $scope.$broadcast('ui_panel_update')\n        }\n      }\n      if ($scope.selectedCount == 1) {\n        angular.forEach($scope.selectedMsgs, function (t, messageID) {\n          $scope.historyState.canEdit = AppMessagesManager.canEditMessage(messageID)\n          $scope.historyState.canReport = AppMessagesManager.canReportMessage(messageID)\n        })\n      } else {\n        $scope.historyState.canEdit = false\n        $scope.historyState.canReport = false\n        angular.forEach($scope.selectedMsgs, function (t, messageID) {\n          if (AppMessagesManager.canReportMessage(messageID)) {\n            $scope.historyState.canReport = true\n          }\n        })\n      }\n      $scope.$broadcast('messages_select')\n    }\n\n    function selectInlineBot (botID, $event) {\n      if ($scope.historyState.canReply) {\n        $scope.$broadcast('inline_bot_select', botID)\n      }\n      return cancelEvent($event)\n    }\n\n    function selectedCancel (noBroadcast) {\n      $scope.selectedMsgs = {}\n      $scope.selectedCount = 0\n      $scope.historyState.selectActions = false\n      lastSelectID = false\n      if (!noBroadcast) {\n        $scope.$broadcast('ui_panel_update')\n      }\n      $scope.$broadcast('messages_select')\n    }\n\n    function selectedFlush () {\n      ErrorService.confirm({type: 'HISTORY_FLUSH'}).then(function () {\n        AppMessagesManager.flushHistory($scope.curDialog.peerID, true).then(function () {\n          selectedCancel()\n        })\n      })\n    }\n\n    function selectedDelete (selectedMessageID) {\n      var selectedMessageIDs = []\n      if (selectedMessageID) {\n        selectedMessageIDs.push(selectedMessageID)\n      } else if ($scope.selectedCount > 0) {\n        angular.forEach($scope.selectedMsgs, function (t, messageID) {\n          selectedMessageIDs.push(messageID)\n        })\n      }\n      if (selectedMessageIDs.length) {\n        var peerID = $scope.curDialog.peerID\n        var isUser = peerID > 0\n        var isChannel = AppPeersManager.isChannel(peerID)\n        var isBroadcast = AppPeersManager.isBroadcast(peerID)\n        var isMegagroup = AppPeersManager.isMegagroup(peerID)\n        var isUsualGroup = !isChannel && !isUser\n        var isSavedMessages = peerID == AppUsersManager.getSelf().id\n\n        var revocable = !isChannel\n        for (var i = 0; revocable && i < selectedMessageIDs.length; i++) {\n          var messageID = selectedMessageIDs[i]\n          if (!AppMessagesManager.canRevokeMessage(messageID)) {\n            revocable = false\n          }\n        }\n\n        ErrorService.confirm({\n          type: 'MESSAGES_DELETE',\n          count: selectedMessageIDs.length,\n          revocable: revocable,\n          isUser: isUser,\n          peerID: peerID,\n          isSavedMessages: isSavedMessages,\n          isChannel: isBroadcast,\n          isSupergroup: isMegagroup,\n          isUsualGroup: isUsualGroup\n        }, {}, { revoke: false }).then(function (data) {\n          AppMessagesManager.deleteMessages(selectedMessageIDs, data.revoke).then(function () {\n            selectedCancel()\n          })\n        })\n      }\n    }\n\n    function quickForward (msgID) {\n      PeersSelectService.selectPeers({\n        canSend: true,\n        confirm_type: 'FORWARD_PEER',\n        shareLinkPromise: AppMessagesManager.getMessageShareLink(msgID)\n      }).then(function (peerStrings) {\n        angular.forEach(peerStrings, function (peerString) {\n          var peerID = AppPeersManager.getPeerID(peerString)\n          AppMessagesManager.forwardMessages(peerID, [msgID])\n        })\n        var toastData = toaster.pop({\n          type: 'info',\n          body: _('confirm_modal_forward_to_peer_success'),\n          bodyOutputType: 'trustedHtml',\n          clickHandler: function () {\n            $rootScope.$broadcast('history_focus', {\n              peerString: peerStrings[0]\n            })\n            toaster.clear(toastData)\n          },\n          showCloseButton: false\n        })\n      })\n    }\n\n    function selectedForward (selectedMessageID) {\n      var selectedMessageIDs = []\n      if (selectedMessageID) {\n        selectedMessageIDs.push(selectedMessageID)\n      } else if ($scope.selectedCount > 0) {\n        angular.forEach($scope.selectedMsgs, function (t, messageID) {\n          selectedMessageIDs.push(messageID)\n        })\n      }\n      if (selectedMessageIDs.length) {\n        PeersSelectService.selectPeer({canSend: true}).then(function (peerStrings) {\n          selectedCancel()\n          if (Array.isArray(peerStrings) && peerStrings.length > 1) {\n            angular.forEach(peerStrings, function (peerString) {\n              var peerID = AppPeersManager.getPeerID(peerString)\n              AppMessagesManager.forwardMessages(peerID, selectedMessageIDs)\n            })\n            var toastData = toaster.pop({\n              type: 'info',\n              body: _('confirm_modal_forward_to_peer_success'),\n              bodyOutputType: 'trustedHtml',\n              clickHandler: function () {\n                $rootScope.$broadcast('history_focus', {\n                  peerString: peerStrings[0]\n                })\n                toaster.clear(toastData)\n              },\n              showCloseButton: false\n            })\n          } else {            \n            $rootScope.$broadcast('history_focus', {\n              peerString: peerStrings,\n              attachment: {\n                _: 'fwd_messages',\n                id: selectedMessageIDs\n              }\n            })\n          }    \n        })\n      }\n    }\n\n    function selectedReport (selectedMessageID) {\n      var selectedMessageIDs = []\n      if (selectedMessageID) {\n        selectedMessageIDs.push(selectedMessageID)\n      } else if ($scope.selectedCount > 0) {\n        angular.forEach($scope.selectedMsgs, function (t, messageID) {\n          selectedMessageIDs.push(messageID)\n        })\n      }\n      if (selectedMessageIDs.length) {\n        $modal.open({\n          templateUrl: templateUrl('report_msgs_modal'),\n          controller: 'ReportMessagesModalController',\n          windowClass: 'md_simple_modal_window mobile_modal',\n          scope: $scope.$new()\n        }).result.then(function (inputReason) {\n          selectedCancel()\n          AppMessagesManager.reportMessages(selectedMessageIDs, inputReason).then(function () {\n            var toastData = toaster.pop({\n              type: 'info',\n              body: _('confirm_modal_report_success'),\n              bodyOutputType: 'trustedHtml',\n              clickHandler: function () {\n                toaster.clear(toastData)\n              },\n              showCloseButton: false\n            })\n          })\n        })\n      }\n    }\n\n    function selectedReply (selectedMessageID) {\n      if (!selectedMessageID && $scope.selectedCount == 1) {\n        angular.forEach($scope.selectedMsgs, function (t, messageID) {\n          selectedMessageID = messageID\n        })\n      }\n      if (selectedMessageID) {\n        selectedCancel()\n        $scope.$broadcast('reply_selected', selectedMessageID)\n      }\n    }\n\n    function selectedEdit (selectedMessageID) {\n      if (!selectedMessageID && $scope.selectedCount == 1) {\n        angular.forEach($scope.selectedMsgs, function (t, messageID) {\n          selectedMessageID = messageID\n        })\n      }\n      if (selectedMessageID) {\n        selectedCancel()\n        $scope.$broadcast('edit_selected', selectedMessageID)\n      }\n    }\n\n    function toggleEdit () {\n      if ($scope.historyState.selectActions) {\n        selectedCancel()\n      } else {\n        $scope.historyState.selectActions = 'selected'\n        $scope.$broadcast('ui_panel_update')\n      }\n    }\n\n    function toggleMedia (mediaType) {\n      if (mediaType == 'search') {\n        $rootScope.$broadcast('history_search', $scope.curDialog.peerID)\n        return\n      }\n      $scope.historyFilter.mediaType = mediaType || false\n      if (mediaType) {\n        $scope.curDialog.messageID = false\n      }\n      peerHistory.messages = []\n      peerHistory.ids = []\n      $scope.state.empty = true\n      loadHistory()\n    }\n\n    function returnToRecent () {\n      if ($scope.historyFilter.mediaType) {\n        toggleMedia()\n      } else {\n        if ($scope.curDialog.messageID) {\n          $rootScope.$broadcast('history_focus', {peerString: $scope.curDialog.peer})\n        } else {\n          loadHistory(true)\n        }\n      }\n    }\n\n    $scope.$on('history_update', angular.noop)\n\n    var loadAfterSync = false\n    $scope.$on('stateSynchronized', function () {\n      if (!loadAfterSync) {\n        return\n      }\n      if (loadAfterSync == $scope.curDialog.peerID) {\n        loadHistory()\n      }\n      loadAfterSync = false\n    })\n\n    $scope.$on('reply_button_press', function (e, button) {\n      var replyKeyboard = $scope.historyState.replyKeyboard\n      if (!replyKeyboard) {\n        return\n      }\n      var sendOptions = {\n        replyToMsgID: peerID < 0 && replyKeyboard.mid\n      }\n      switch (button._) {\n        case 'keyboardButtonRequestPhone':\n          ErrorService.confirm({type: 'BOT_ACCESS_PHONE'}).then(function () {\n            var user = AppUsersManager.getSelf()\n            AppMessagesManager.sendOther(peerID, {\n              _: 'inputMediaContact',\n              phone_number: user.phone,\n              first_name: user.first_name,\n              last_name: user.last_name\n            }, sendOptions)\n          })\n          break\n\n        case 'keyboardButtonRequestGeoLocation':\n          ErrorService.confirm({type: 'BOT_ACCESS_GEO'}).then(function () {\n            return GeoLocationManager.getPosition().then(function (coords) {\n              AppMessagesManager.sendOther(peerID, {\n                _: 'inputMediaGeoPoint',\n                geo_point: {\n                  _: 'inputGeoPoint',\n                  'lat': coords['lat'],\n                  'long': coords['long']\n                }\n              }, sendOptions)\n            }, function (error) {\n              ErrorService.alert(\n                _('error_modal_bad_request_title_raw'),\n                _('error_modal_gelocation_na_raw')\n              )\n            })\n          })\n          break\n\n        default:\n          AppMessagesManager.sendText(peerID, button.text, sendOptions)\n      }\n    })\n\n    $scope.$on('history_reload', function (e, updPeerID) {\n      if (updPeerID == $scope.curDialog.peerID) {\n        loadHistory()\n      }\n    })\n\n    $scope.$on('history_forbidden', function (e, updPeerID) {\n      if (updPeerID == $scope.curDialog.peerID) {\n        $location.url('/im')\n      }\n      historiesQueuePop(updPeerID)\n    })\n\n    $scope.$on('dialog_migrate', function (e, data) {\n      if (data.migrateFrom == $scope.curDialog.peerID) {\n        var peerString = AppPeersManager.getPeerString(data.migrateTo)\n        $rootScope.$broadcast('history_focus', {peerString: peerString})\n      }\n      historiesQueuePop(data.migrateFrom)\n    })\n\n    $scope.$on('notify_settings', function (e, data) {\n      if (data.peerID == $scope.curDialog.peerID) {\n        updateChannelActions()\n      }\n    })\n\n    $scope.$on('channel_settings', function (e, data) {\n      if (data.channelID == -$scope.curDialog.peerID) {\n        updateChannelActions()\n      }\n    })\n\n    var typingTimeouts = {}\n    $scope.$on('history_append', function (e, addedMessage) {\n      var history = historiesQueueFind(addedMessage.peerID)\n      if (!history) {\n        return\n      }\n      var curPeer = addedMessage.peerID == $scope.curDialog.peerID\n      if (curPeer) {\n        if ($scope.historyFilter.mediaType ||\n          $scope.historyState.skipped) {\n          if (addedMessage.my) {\n            returnToRecent()\n          } else {\n            $scope.historyState.missedCount++\n          }\n          return\n        }\n        if ($scope.curDialog.messageID && addedMessage.my) {\n          returnToRecent()\n        }\n        delete $scope.state.empty\n      }\n      // console.log('append', addedMessage)\n      // console.trace()\n      var historyMessage = AppMessagesManager.wrapForHistory(addedMessage.messageID)\n      history.messages.push(historyMessage)\n      history.ids.push(addedMessage.messageID)\n      if (AppMessagesManager.regroupWrappedHistory(history.messages, -3)) {\n        $scope.$broadcast('messages_regroup')\n      }\n\n      if (curPeer) {\n        $scope.historyState.typing.splice(0, $scope.historyState.typing.length)\n        $scope.$broadcast('ui_history_append_new', {\n          my: addedMessage.my,\n          idleScroll: unreadAfterIdle && !historyMessage.pFlags.out && $rootScope.idle.isIDLE\n        })\n        if (addedMessage.my && $scope.historyUnreadAfter) {\n          delete $scope.historyUnreadAfter\n          $scope.$broadcast('messages_unread_after')\n        }\n\n        // console.log('append check', $rootScope.idle.isIDLE, addedMessage.peerID, $scope.curDialog.peerID, historyMessage, history.messages[history.messages.length - 2])\n        if ($rootScope.idle.isIDLE) {\n          if (historyMessage.pFlags.unread &&\n            !historyMessage.pFlags.out &&\n            !(history.messages[history.messages.length - 2] || {}).pFlags.unread) {\n            $scope.historyUnreadAfter = historyMessage.mid\n            unreadAfterIdle = true\n            $scope.$broadcast('messages_unread_after')\n          }\n        } else {\n          $timeout(function () {\n            AppMessagesManager.readHistory($scope.curDialog.peerID)\n          })\n        }\n\n        updateBotActions()\n        updateChannelActions()\n      }\n    })\n\n    $scope.$on('history_multiappend', function (e, historyMultiAdded) {\n      // console.log(dT(), 'multiappend', angular.copy(historyMultiAdded))\n      var regroupped = false\n      var unreadAfterChanged = false\n      var isIDLE = $rootScope.idle.isIDLE\n      angular.forEach(historyMultiAdded, function (msgs, peerID) {\n        var history = historiesQueueFind(peerID)\n        // var history = historiesQueuePush(peerID)\n        if (!history) {\n          return\n        }\n        var curPeer = peerID == $scope.curDialog.peerID\n        var exlen = history.messages.length\n        var len = msgs.length\n\n        if (curPeer) {\n          if ($scope.historyFilter.mediaType ||\n            $scope.historyState.skipped) {\n            $scope.historyState.missedCount += len\n            return\n          }\n          delete $scope.state.empty\n        }\n\n        if ((!curPeer || isIDLE) &&\n          exlen > (len > 10 ? 10 : 100)) {\n          console.warn(dT(), 'Drop too many messages', len, exlen, isIDLE, curPeer, peerID)\n          if (curPeer) {\n            minID = history.messages[exlen - 1].mid\n            $scope.historyState.skipped = hasLess = minID > 0\n            if (hasLess) {\n              loadAfterSync = peerID\n              $scope.$broadcast('ui_history_append')\n            }\n          } else {\n            historiesQueuePop(peerID)\n          }\n          return\n        }\n\n        var messageID, i\n        var hasOut = false\n        var unreadAfterNew = false\n        var historyMessage = history.messages[history.messages.length - 1]\n        var lastIsRead = !historyMessage || !historyMessage.pFlags.unread\n        for (i = 0; i < len; i++) {\n          messageID = msgs[i]\n          if (messageID > 0 && messageID < maxID ||\n              history.ids.indexOf(messageID) !== -1) {\n            continue\n          }\n          historyMessage = AppMessagesManager.wrapForHistory(messageID)\n          history.messages.push(historyMessage)\n          history.ids.push(messageID)\n          if (!unreadAfterNew && isIDLE) {\n            if (historyMessage.pFlags.unread &&\n              !historyMessage.pFlags.out &&\n              lastIsRead) {\n              unreadAfterNew = messageID\n            } else {\n              lastIsRead = !historyMessage.pFlags.unread\n            }\n          }\n          if (!hasOut && historyMessage.pFlags.out) {\n            hasOut = true\n          }\n        }\n        // console.log('after append', angular.copy(history.messages), angular.copy(history.ids))\n\n        if (AppMessagesManager.regroupWrappedHistory(history.messages, -len - 2)) {\n          regroupped = true\n        }\n\n        if (curPeer) {\n          if ($scope.historyState.typing.length) {\n            $scope.historyState.typing.splice(0, $scope.historyState.typing.length)\n          }\n          $scope.$broadcast('ui_history_append_new', {\n            idleScroll: unreadAfterIdle && !hasOut && isIDLE\n          })\n\n          if (isIDLE) {\n            if (unreadAfterNew) {\n              $scope.historyUnreadAfter = unreadAfterNew\n              unreadAfterIdle = true\n              unreadAfterChanged = true\n            }\n          } else {\n            $timeout(function () {\n              AppMessagesManager.readHistory($scope.curDialog.peerID)\n            })\n          }\n\n          updateBotActions()\n          updateChannelActions()\n        }\n      })\n\n      if (regroupped) {\n        $scope.$broadcast('messages_regroup')\n      }\n      if (unreadAfterChanged) {\n        $scope.$broadcast('messages_unread_after')\n      }\n    })\n\n    $scope.$on('history_delete', function (e, historyUpdate) {\n      var history = historiesQueueFind(historyUpdate.peerID)\n      if (!history) {\n        return\n      }\n      var newMessages = []\n      var i\n\n      for (i = 0; i < history.messages.length; i++) {\n        if (!historyUpdate.msgs[history.messages[i].mid]) {\n          newMessages.push(history.messages[i])\n        }\n      }\n      history.messages = newMessages\n      AppMessagesManager.regroupWrappedHistory(history.messages)\n      $scope.$broadcast('messages_regroup')\n      if (historyUpdate.peerID == $scope.curDialog.peerID) {\n        $scope.state.empty = !newMessages.length\n        updateBotActions()\n      }\n    })\n\n    $scope.$on('dialog_flush', function (e, dialog) {\n      var history = historiesQueueFind(dialog.peerID)\n      if (history) {\n        history.messages = []\n        history.ids = []\n        if (dialog.peerID == $scope.curDialog.peerID) {\n          $scope.state.empty = true\n          updateBotActions()\n        }\n      }\n    })\n\n    $scope.$on('history_focus', function (e, peerData) {\n      if ($scope.historyFilter.mediaType) {\n        toggleMedia()\n      }\n    })\n\n    $scope.$on('apiUpdate', function (e, update) {\n      switch (update._) {\n        case 'updateUserTyping':\n        case 'updateChatUserTyping':\n          AppUsersManager.forceUserOnline(update.user_id)\n          if (AppUsersManager.hasUser(update.user_id) &&\n            $scope.curDialog.peerID == (update._ == 'updateUserTyping'\n              ? update.user_id\n              : -update.chat_id\n            )) {\n            if ($scope.historyState.typing.indexOf(update.user_id) == -1) {\n              $scope.historyState.typing.push(update.user_id)\n            }\n            $timeout.cancel(typingTimeouts[update.user_id])\n\n            typingTimeouts[update.user_id] = $timeout(function () {\n              var pos = $scope.historyState.typing.indexOf(update.user_id)\n              if (pos !== -1) {\n                $scope.historyState.typing.splice(pos, 1)\n              }\n            }, 6000)\n          }\n          break\n      }\n    })\n\n    $scope.$on('history_need_less', showLessHistory)\n    $scope.$on('history_need_more', showMoreHistory)\n\n    $rootScope.$watch('idle.isIDLE', function (newVal) {\n      if (!newVal &&\n          $scope.curDialog &&\n          $scope.curDialog.peerID &&\n          !$scope.historyFilter.mediaType &&\n          !$scope.historyState.skipped) {\n        AppMessagesManager.readHistory($scope.curDialog.peerID)\n      }\n      if (!newVal) {\n        unreadAfterIdle = false\n        if (loadAfterSync &&\n          loadAfterSync == $scope.curDialog.peerID) {\n          loadHistory()\n          loadAfterSync = false\n        }\n      }\n    })\n  })\n\n  .controller('AppImPanelController', function ($scope) {\n    $scope.$on('user_update', angular.noop)\n  })\n\n  .controller('AppImSendController', function ($rootScope, $q, $scope, $timeout, MtpApiManager, Storage, AppProfileManager, AppChatsManager, AppUsersManager, AppPeersManager, AppDocsManager, AppStickersManager, AppMessagesManager, AppInlineBotsManager, MtpApiFileManager, DraftsManager, RichTextProcessor) {\n    $scope.$watch('curDialog.peer', resetDraft)\n    $scope.$on('user_update', angular.noop)\n    $scope.$on('peer_draft_attachment', applyDraftAttachment)\n    $scope.$on('reply_selected', function (e, messageID) {\n      replySelect(messageID, true)\n    })\n    $scope.$on('edit_selected', function (e, messageID) {\n      setEditDraft(messageID, true)\n    })\n\n    $scope.$on('ui_typing', onTyping)\n\n    $scope.draftMessage = {\n      text: '',\n      send: submitMessage,\n      replyClear: replyClear,\n      fwdsClear: fwdsClear,\n      toggleSlash: toggleSlash,\n      replyKeyboardToggle: replyKeyboardToggle,\n      type: 'new'\n    }\n    $scope.mentions = {}\n    $scope.commands = {}\n    $scope.$watch('draftMessage.text', onMessageChange)\n    $scope.$watch('draftMessage.files', onFilesSelected)\n    $scope.$watch('draftMessage.sticker', onStickerSelected)\n    $scope.$watch('draftMessage.command', onCommandSelected)\n    $scope.$watch('draftMessage.inlineResultID', onInlineResultSelected)\n\n    $scope.$on('history_reply_markup', function (e, peerData) {\n      if (peerData.peerID == $scope.curDialog.peerID) {\n        updateReplyKeyboard()\n      }\n    })\n\n    $scope.$on('inline_bot_select', function (e, botID) {\n      var bot = AppUsersManager.getUser(botID)\n      $scope.draftMessage.text = '@' + bot.username + ' '\n      $scope.$broadcast('ui_peer_draft', {focus: true})\n    })\n\n    $scope.$on('inline_bots_popular', updateMentions)\n\n    $scope.$on('last_message_edit', setEditLastMessage)\n\n    $rootScope.$watch('idle.isIDLE', function (newVal) {\n      if ($rootScope.idle.initial) {\n        return\n      }\n      if (newVal && $scope.curDialog.peerID) {\n        $scope.$broadcast('ui_message_before_send')\n        $timeout(function () {\n          DraftsManager.syncDraft($scope.curDialog.peerID)\n        })\n      }\n    })\n\n    $scope.$on('draft_updated', function (e, draftUpdate) {\n      if (draftUpdate.peerID == $scope.curDialog.peerID &&\n          !draftUpdate.local &&\n          (!$scope.draftMessage.text || $rootScope.idle.isIDLE)) {\n        getDraft()\n      }\n    })\n\n    var replyToMarkup = false\n    var forceDraft = false\n    var editMessageID = false\n\n    function submitMessage (e) {\n      $scope.$broadcast('ui_message_before_send')\n\n      $timeout(function () {\n        if (editMessageID) {\n          editMessage()\n        } else {\n          sendMessage()\n        }\n      })\n\n      return cancelEvent(e)\n    }\n\n    function sendMessage () {\n      var text = $scope.draftMessage.text\n\n      if (angular.isString(text) && text.length > 0) {\n        text = RichTextProcessor.parseEmojis(text)\n\n        var options = {\n          replyToMsgID: $scope.draftMessage.replyToMsgID,\n          clearDraft: true\n        }\n        do {\n          AppMessagesManager.sendText($scope.curDialog.peerID, text.substr(0, 4096), options)\n          text = text.substr(4096)\n          options = angular.copy(options)\n          delete options.clearDraft\n        } while (text.length)\n      }\n      fwdsSend()\n\n      if (forceDraft == $scope.curDialog.peer) {\n        forceDraft = false\n      }\n\n      resetDraft()\n      $scope.$broadcast('ui_message_send')\n    }\n\n    function editMessage () {\n      var text = $scope.draftMessage.text\n      text = RichTextProcessor.parseEmojis(text)\n\n      AppMessagesManager.editMessage(editMessageID, text).then(function () {\n        editMessageID = false\n\n        resetDraft()\n        $scope.$broadcast('ui_message_send')\n        $timeout(function () {\n          $scope.$broadcast('ui_peer_reply')\n        })\n      })\n    }\n\n    function updateMentions () {\n      var peerID = $scope.curDialog.peerID\n\n      if (!peerID) {\n        safeReplaceObject($scope.mentions, {})\n        $scope.$broadcast('mentions_update')\n        return\n      }\n\n      var mentionUsers = []\n      var mentionIndex = SearchIndexManager.createIndex()\n\n      var inlineBotsPromise = AppInlineBotsManager.getPopularBots().then(function (inlineBots) {\n        var ids = []\n        angular.forEach(inlineBots, function (bot) {\n          ids.push(bot.id)\n        })\n        return ids\n      })\n      var chatParticipantsPromise\n      if (peerID < 0 && !AppPeersManager.isBroadcast(peerID)) {\n        if (AppPeersManager.isChannel(peerID)) {\n          chatParticipantsPromise = AppProfileManager.getChannelParticipants(-peerID)\n        } else {\n          chatParticipantsPromise = AppProfileManager.getChatFull(-peerID).then(function (chatFull) {\n            return (chatFull.participants || {}).participants || []\n          })\n        }\n        chatParticipantsPromise = chatParticipantsPromise.then(function (participantsVector) {\n          var ids = []\n          angular.forEach(participantsVector, function (participant) {\n            ids.push(participant.user_id)\n          })\n          return ids\n        })\n      } else {\n        chatParticipantsPromise = $q.when([])\n      }\n\n      $q.all({pop: inlineBotsPromise, chat: chatParticipantsPromise}).then(function (result) {\n        var done = {}\n        var ids = result.pop.concat(result.chat)\n        angular.forEach(ids, function (userID) {\n          if (done[userID]) {\n            return\n          }\n          done[userID] = true\n          mentionUsers.push(AppUsersManager.getUser(userID))\n          SearchIndexManager.indexObject(userID, AppUsersManager.getUserSearchText(userID), mentionIndex)\n        })\n\n        safeReplaceObject($scope.mentions, {\n          users: mentionUsers,\n          index: mentionIndex\n        })\n        $scope.$broadcast('mentions_update')\n      })\n    }\n\n    function updateCommands () {\n      var peerID = $scope.curDialog.peerID\n      if (!peerID) {\n        safeReplaceObject($scope.commands, {})\n        $scope.$broadcast('mentions_update')\n        return\n      }\n\n      AppProfileManager.getPeerBots(peerID).then(function (peerBots) {\n        if (!peerBots.length) {\n          safeReplaceObject($scope.commands, {})\n          $scope.$broadcast('mentions_update')\n          return\n        }\n\n        var needMentions = peerID < 0\n        var commandsList = []\n        var commandsIndex = SearchIndexManager.createIndex()\n\n        angular.forEach(peerBots, function (peerBot) {\n          var mention = ''\n          if (needMentions) {\n            var bot = AppUsersManager.getUser(peerBot.id)\n            if (bot && bot.username) {\n              mention += '@' + bot.username\n            }\n          }\n          var botSearchText = AppUsersManager.getUserSearchText(peerBot.id)\n          angular.forEach(peerBot.commands, function (description, command) {\n            var value = '/' + command + mention\n            commandsList.push({\n              botID: peerBot.id,\n              value: value,\n              rDescription: RichTextProcessor.wrapRichText(description, {noLinks: true, noLineBreaks: true})\n            })\n            SearchIndexManager.indexObject(value, botSearchText + ' ' + command + ' ' + description, commandsIndex)\n          })\n        })\n\n        safeReplaceObject($scope.commands, {\n          list: commandsList,\n          index: commandsIndex\n        })\n        $scope.$broadcast('mentions_update')\n      })\n    }\n\n    function resetDraft (newPeer, prevPeer) {\n      var prevPeerID = prevPeer ? AppPeersManager.getPeerID(prevPeer) : 0\n      if (newPeer != prevPeer && prevPeerID) {\n        $scope.$broadcast('ui_message_before_send')\n        $timeout(function () {\n          DraftsManager.syncDraft(prevPeerID)\n          resetDraft()\n        })\n        return\n      }\n\n      editMessageID = false\n\n      updateMentions()\n      updateCommands()\n      replyClear()\n      updateReplyKeyboard()\n\n      delete $scope.draftMessage.inlineProgress\n      $scope.$broadcast('inline_results', false)\n\n      // console.log(dT(), 'reset draft', $scope.curDialog.peer, forceDraft)\n      if (forceDraft) {\n        if (forceDraft == $scope.curDialog.peer) {\n          $scope.draftMessage.isBroadcast = AppPeersManager.isBroadcast($scope.curDialog.peerID)\n          $scope.$broadcast('ui_peer_draft')\n          return\n        } else {\n          forceDraft = false\n        }\n      }\n\n      fwdsClear()\n      getDraft()\n    }\n\n    function getDraft () {\n      if ($scope.curDialog.peerID) {\n        var draftDataPromise\n        if (editMessageID) {\n          draftDataPromise = AppMessagesManager.getMessageEditData(editMessageID).then(function (draftData) {\n            draftData.replyToMsgID = editMessageID\n            return draftData\n          }, function (error) {\n            console.warn(error)\n            editMessageID = false\n            getDraft()\n            return $q.reject()\n          })\n        } else {\n          draftDataPromise = DraftsManager.getDraft($scope.curDialog.peerID)\n        }\n        draftDataPromise.then(function (draftData) {\n          $scope.draftMessage.type = editMessageID ? 'edit' : 'new'\n          $scope.draftMessage.text = draftData ? draftData.text : ''\n          $scope.draftMessage.isBroadcast = AppPeersManager.isBroadcast($scope.curDialog.peerID)\n          if (draftData.replyToMsgID) {\n            var replyToMsgID = draftData.replyToMsgID\n            replySelect(replyToMsgID)\n          } else {\n            replyClear()\n          }\n          $scope.$broadcast('ui_peer_draft')\n        })\n      } else {\n        // console.log('Reset peer')\n        $scope.draftMessage.text = ''\n        $scope.$broadcast('ui_peer_draft')\n      }\n    }\n\n    function applyDraftAttachment (e, attachment) {\n      console.log(dT(), 'apply draft attach', attachment)\n      if (!attachment || !attachment._) {\n        return\n      }\n\n      if (attachment._ == 'share_url') {\n        var url = attachment.url\n        var text = attachment.text || ' '\n        forceDraft = $scope.curDialog.peer\n\n        $timeout(function () {\n          $scope.draftMessage.text = url + '\\n' + text\n          $scope.$broadcast('ui_peer_draft', {\n            customSelection: [\n              url + '\\n',\n              text,\n              ''\n            ]\n          })\n        }, 1000)\n      } else if (attachment._ == 'fwd_messages') {\n        forceDraft = $scope.curDialog.peer\n        $timeout(function () {\n          $scope.draftMessage.fwdMessages = attachment.id\n          $scope.$broadcast('ui_peer_reply')\n        }, 100)\n      } else if (attachment._ == 'inline_query') {\n        var mention = attachment.mention\n        var query = attachment.query\n        forceDraft = $scope.curDialog.peer\n\n        $timeout(function () {\n          $scope.draftMessage.text = mention + ' ' + query\n          $scope.$broadcast('ui_peer_draft', {\n            customSelection: [\n              mention + ' ' + query,\n              '',\n              ''\n            ]\n          })\n        }, 1000)\n      }\n    }\n\n    function replySelect (messageID, byUser) {\n      if (editMessageID && byUser) {\n        replyClear()\n        return\n      }\n      $scope.draftMessage.replyToMsgID = messageID\n      $scope.$broadcast('ui_peer_reply')\n      replyToMarkup = false\n\n      if (byUser && !editMessageID) {\n        DraftsManager.changeDraft($scope.curDialog.peerID, {\n          text: $scope.draftMessage.text,\n          replyToMsgID: messageID\n        })\n      }\n    }\n\n    function setEditDraft (messageID) {\n      editMessageID = messageID\n      getDraft()\n    }\n\n    function setEditLastMessage () {\n      if (editMessageID ||\n          !$scope.curDialog.peerID) {\n        return false\n      }\n      AppMessagesManager.getHistory($scope.curDialog.peerID).then(function (historyResult) {\n        for (var i = 0, messageID; i < historyResult.history.length; i++) {\n          messageID = historyResult.history[i]\n          if (AppMessagesManager.canEditMessage(messageID)) {\n            setEditDraft(messageID)\n            break\n          }\n        }\n      })\n    }\n\n    function replyClear (byUser) {\n      if (editMessageID) {\n        editMessageID = false\n        getDraft()\n        return\n      }\n      var mid = $scope.draftMessage.replyToMsgID\n      if (mid &&\n        $scope.historyState.replyKeyboard &&\n        $scope.historyState.replyKeyboard.mid == mid &&\n        !$scope.historyState.replyKeyboard.pFlags.hidden) {\n        $scope.historyState.replyKeyboard.pFlags.hidden = true\n        $scope.$broadcast('ui_keyboard_update')\n      }\n      delete $scope.draftMessage.replyToMsgID\n      $scope.$broadcast('ui_peer_reply')\n\n      if (byUser) {\n        DraftsManager.changeDraft($scope.curDialog.peerID, {\n          text: $scope.draftMessage.text\n        })\n      }\n    }\n\n    function fwdsClear () {\n      if ($scope.draftMessage.fwdMessages &&\n        $scope.draftMessage.fwdMessages.length) {\n        delete $scope.draftMessage.fwdMessages\n        $scope.$broadcast('ui_peer_reply')\n\n        if (forceDraft == $scope.curDialog.peer) {\n          forceDraft = false\n        }\n      }\n    }\n\n    function fwdsSend () {\n      if ($scope.draftMessage.fwdMessages &&\n        $scope.draftMessage.fwdMessages.length) {\n        var ids = $scope.draftMessage.fwdMessages.slice()\n        fwdsClear()\n        setZeroTimeout(function () {\n          AppMessagesManager.forwardMessages($scope.curDialog.peerID, ids)\n        })\n      }\n    }\n\n    function toggleSlash ($event) {\n      if ($scope.draftMessage.text &&\n        $scope.draftMessage.text.charAt(0) == '/') {\n        $scope.draftMessage.text = ''\n      } else {\n        $scope.draftMessage.text = '/'\n      }\n      $scope.$broadcast('ui_peer_draft', {focus: true})\n      return cancelEvent($event)\n    }\n\n    function updateReplyKeyboard () {\n      var peerID = $scope.curDialog.peerID\n      var replyKeyboard = AppMessagesManager.getReplyKeyboard(peerID)\n      if (replyKeyboard) {\n        replyKeyboard = AppMessagesManager.wrapReplyMarkup(replyKeyboard)\n      }\n      // console.log('update reply markup', peerID, replyKeyboard)\n      $scope.historyState.replyKeyboard = replyKeyboard\n\n      var addReplyMessage =\n      replyKeyboard &&\n        !replyKeyboard.pFlags.hidden &&\n        (replyKeyboard._ == 'replyKeyboardForceReply' ||\n        (replyKeyboard._ == 'replyKeyboardMarkup' && peerID < 0))\n\n      if (addReplyMessage) {\n        replySelect(replyKeyboard.mid)\n        replyToMarkup = true\n      } else if (replyToMarkup) {\n        replyClear()\n      }\n      var enabled = replyKeyboard &&\n        !replyKeyboard.pFlags.hidden &&\n        replyKeyboard._ == 'replyKeyboardMarkup'\n      $scope.$broadcast('ui_keyboard_update', {enabled: enabled})\n      $scope.$emit('ui_panel_update', {blur: enabled})\n    }\n\n    function replyKeyboardToggle ($event) {\n      var replyKeyboard = $scope.historyState.replyKeyboard\n      if (replyKeyboard) {\n        replyKeyboard.pFlags.hidden = !replyKeyboard.pFlags.hidden\n        updateReplyKeyboard()\n      }\n      return cancelEvent($event)\n    }\n\n    function onMessageChange (newVal, prevVal, a) {\n      // console.log('ctrl text changed', newVal, prevVal);\n      if (newVal === '' && prevVal === '') {\n        return\n      }\n\n      if (newVal && newVal.length) {\n        if (!$scope.historyFilter.mediaType && !$scope.historyState.skipped) {\n          AppMessagesManager.readHistory($scope.curDialog.peerID)\n        }\n      }\n      if ($scope.curDialog.peerID) {\n        if (!editMessageID) {\n          var replyToMsgID = $scope.draftMessage.replyToMsgID\n          if (replyToMsgID &&\n              $scope.historyState.replyKeyboard &&\n              $scope.historyState.replyKeyboard.mid == replyToMsgID) {\n            replyToMsgID = 0\n          }\n          DraftsManager.changeDraft($scope.curDialog.peerID, {\n            text: newVal,\n            replyToMsgID: replyToMsgID\n          })\n        }\n        checkInlinePattern(newVal)\n      }\n    }\n\n    var inlineUsernameRegex = /^@([a-zA-Z\\d_]{1,32})( | )([\\s\\S]*)$/\n    var inlineStickersEmojiRegex = /^\\s*:(\\S+):\\s*$/\n    var getInlineResultsTO = false\n    var lastInlineBot = false\n    var jump = 0\n\n    function checkInlinePattern (message) {\n      if (getInlineResultsTO) {\n        $timeout.cancel(getInlineResultsTO)\n      }\n      var curJump = ++jump\n      if (!message || !message.length) {\n        delete $scope.draftMessage.inlineProgress\n        $scope.$broadcast('inline_results', false)\n        return\n      }\n      var matches = message.match(inlineUsernameRegex)\n      if (!matches) {\n        matches = message.match(inlineStickersEmojiRegex)\n        if (matches) {\n          var emojiCode = EmojiHelper.shortcuts[matches[1]]\n          if (emojiCode) {\n            $scope.draftMessage.inlineProgress = true\n            AppStickersManager.searchStickers(emojiCode).then(function (docs) {\n              var inlineResults = []\n              angular.forEach(docs, function (doc) {\n                inlineResults.push({\n                  _: 'botInlineMediaResult',\n                  qID: '_sticker_' + doc.id,\n                  pFlags: {sticker: true},\n                  id: doc.id,\n                  type: 'sticker',\n                  document: doc,\n                  send_message: {_: 'botInlineMessageMediaAuto'}\n                })\n              })\n              var botResults = {\n                pFlags: {gallery: true},\n                query_id: 0,\n                results: inlineResults\n              }\n              botResults.text = message\n              $scope.$broadcast('inline_results', botResults)\n              delete $scope.draftMessage.inlineProgress\n            })\n          } else {\n            delete $scope.draftMessage.inlineProgress\n            $scope.$broadcast('inline_results', false)\n            return\n          }\n        }\n        delete $scope.draftMessage.inlineProgress\n        $scope.$broadcast('inline_results', false)\n        return\n      }\n      var username = matches[1]\n      var inlineBotPromise\n      $scope.draftMessage.inlineProgress = true\n      if (lastInlineBot && lastInlineBot.username == username) {\n        inlineBotPromise = $q.when(lastInlineBot)\n      } else {\n        inlineBotPromise = AppInlineBotsManager.resolveInlineMention(username)\n      }\n      inlineBotPromise.then(function (inlineBot) {\n        if (curJump != jump) {\n          return\n        }\n        lastInlineBot = inlineBot\n        $scope.$broadcast('inline_placeholder', {\n          prefix: '@' + username + matches[2],\n          placeholder: inlineBot.placeholder\n        })\n        if (getInlineResultsTO) {\n          $timeout.cancel(getInlineResultsTO)\n        }\n        getInlineResultsTO = $timeout(function () {\n          var query = RichTextProcessor.parseEmojis(matches[3])\n          AppInlineBotsManager.getInlineResults($scope.curDialog.peerID, inlineBot.id, query, inlineBot.geo, '').then(function (botResults) {\n            getInlineResultsTO = false\n            if (curJump != jump) {\n              return\n            }\n            botResults.text = message\n            $scope.$broadcast('inline_results', botResults)\n            delete $scope.draftMessage.inlineProgress\n          }, function () {\n            $scope.$broadcast('inline_results', false)\n            delete $scope.draftMessage.inlineProgress\n          })\n        }, 500)\n      }, function (error) {\n        $scope.$broadcast('inline_results', false)\n        delete $scope.draftMessage.inlineProgress\n      })\n    }\n\n    function onTyping () {\n      if (AppPeersManager.isBroadcast($scope.curDialog.peerID)) {\n        return false\n      }\n      MtpApiManager.invokeApi('messages.setTyping', {\n        peer: AppPeersManager.getInputPeerByID($scope.curDialog.peerID),\n        action: {_: 'sendMessageTypingAction'}\n      })['catch'](function (error) {\n        error.handled = true\n      })\n    }\n\n    function onFilesSelected (newVal) {\n      if (!angular.isArray(newVal) || !newVal.length) {\n        return\n      }\n      var options = {\n        replyToMsgID: $scope.draftMessage.replyToMsgID,\n        isMedia: $scope.draftMessage.isMedia\n      }\n\n      delete $scope.draftMessage.replyToMsgID\n\n      if (newVal[0].lastModified) {\n        newVal.sort(function (file1, file2) {\n          return file1.lastModified - file2.lastModified\n        })\n      }\n\n      for (var i = 0; i < newVal.length; i++) {\n        AppMessagesManager.sendFile($scope.curDialog.peerID, newVal[i], options)\n        $scope.$broadcast('ui_message_send')\n      }\n      fwdsSend()\n    }\n\n    function onStickerSelected (newVal) {\n      if (!newVal) {\n        return\n      }\n\n      var doc = AppDocsManager.getDoc(newVal)\n      if (doc.id && doc.access_hash) {\n        var inputMedia = {\n          _: 'inputMediaDocument',\n          id: {\n            _: 'inputDocument',\n            id: doc.id,\n            access_hash: doc.access_hash\n          }\n        }\n        var options = {\n          replyToMsgID: $scope.draftMessage.replyToMsgID\n        }\n        AppMessagesManager.sendOther($scope.curDialog.peerID, inputMedia, options)\n        $scope.$broadcast('ui_message_send')\n\n        fwdsSend()\n        replyClear(true)\n      }\n      delete $scope.draftMessage.sticker\n    }\n\n    function onCommandSelected (command) {\n      if (!command) {\n        return\n      }\n      AppMessagesManager.sendText($scope.curDialog.peerID, command, {\n        clearDraft: true\n      })\n\n      if (forceDraft == $scope.curDialog.peer) {\n        forceDraft = false\n      }\n\n      fwdsSend()\n      resetDraft()\n      delete $scope.draftMessage.sticker\n      delete $scope.draftMessage.text\n      delete $scope.draftMessage.command\n      delete $scope.draftMessage.inlineResultID\n      $scope.$broadcast('ui_message_send')\n      $scope.$broadcast('ui_peer_draft')\n    }\n\n    function onInlineResultSelected (qID) {\n      if (!qID) {\n        return\n      }\n\n      if (qID.substr(0, 11) == '_switch_pm_') {\n        var botID = lastInlineBot.id\n        var startParam = qID.substr(11)\n        return AppInlineBotsManager.switchToPM($scope.curDialog.peerID, botID, startParam)\n      }\n\n      var options = {\n        replyToMsgID: $scope.draftMessage.replyToMsgID,\n        clearDraft: true\n      }\n\n      if (qID.substr(0, 9) == '_sticker_') {\n        var docID = qID.substr(9)\n        var doc = AppDocsManager.getDoc(docID)\n        if (doc.id && doc.access_hash) {\n          var inputMedia = {\n            _: 'inputMediaDocument',\n            id: {\n              _: 'inputDocument',\n              id: doc.id,\n              access_hash: doc.access_hash\n            }\n          }\n          AppMessagesManager.sendOther($scope.curDialog.peerID, inputMedia, options)\n        }\n      }\n      else {\n        AppInlineBotsManager.sendInlineResult($scope.curDialog.peerID, qID, options)\n      }\n\n\n      if (forceDraft == $scope.curDialog.peer) {\n        forceDraft = false\n      }\n\n      fwdsSend()\n      resetDraft()\n      delete $scope.draftMessage.sticker\n      delete $scope.draftMessage.text\n      delete $scope.draftMessage.command\n      delete $scope.draftMessage.inlineResultID\n      $scope.$broadcast('ui_message_send')\n      $scope.$broadcast('ui_peer_draft')\n    }\n  })\n\n  .controller('AppLangSelectController', function ($scope, _, Storage, ErrorService, AppRuntimeManager) {\n    $scope.supportedLocales = Config.I18n.supported\n    $scope.langNames = Config.I18n.languages\n    $scope.curLocale = Config.I18n.locale\n    $scope.form = {locale: Config.I18n.locale}\n\n    $scope.localeSelect = function localeSelect (newLocale) {\n      newLocale = newLocale || $scope.form.locale\n      if ($scope.curLocale !== newLocale) {\n        ErrorService.confirm({type: 'APPLY_LANG_WITH_RELOAD'}).then(function () {\n          Storage.set({i18n_locale: newLocale}).then(function () {\n            AppRuntimeManager.reload()\n          })\n        }, function () {\n          $scope.form.locale = $scope.curLocale\n        })\n      }\n    }\n  })\n\n  .controller('AppFooterController', function ($scope, LayoutSwitchService) {\n    $scope.switchLayout = function (mobile) {\n      LayoutSwitchService.switchLayout(mobile)\n    }\n  })\n\n  .controller('PhotoModalController', function ($q, $scope, $rootScope, $modalInstance, AppPhotosManager, AppMessagesManager, AppPeersManager, AppWebPagesManager, PeersSelectService, ErrorService) {\n    $scope.photo = AppPhotosManager.wrapForFull($scope.photoID)\n    $scope.nav = {}\n\n    $scope.download = function () {\n      AppPhotosManager.downloadPhoto($scope.photoID)\n    }\n\n    if (!$scope.messageID) {\n      return\n    }\n\n    $scope.forward = function () {\n      var messageID = $scope.messageID\n\n      PeersSelectService.selectPeer({canSend: true}).then(function (peerString) {\n        $rootScope.$broadcast('history_focus', {\n          peerString: peerString,\n          attachment: {\n            _: 'fwd_messages',\n            id: [messageID]\n          }\n        })\n      })\n    }\n\n    $scope.goToMessage = function () {\n      var messageID = $scope.messageID\n      var peerID = AppMessagesManager.getMessagePeer(AppMessagesManager.getMessage(messageID))\n      var peerString = AppPeersManager.getPeerString(peerID)\n      $modalInstance.dismiss()\n      $rootScope.$broadcast('history_focus', {peerString: peerString, messageID: messageID})\n    }\n\n    $scope['delete'] = function () {\n      var messageID = $scope.messageID\n      ErrorService.confirm({type: 'MESSAGE_DELETE'}).then(function () {\n        AppMessagesManager.deleteMessages([messageID])\n      })\n    }\n\n    var peerID = AppMessagesManager.getMessagePeer(AppMessagesManager.getMessage($scope.messageID))\n    var inputPeer = AppPeersManager.getInputPeerByID(peerID)\n    var inputQuery = ''\n    var inputFilter = {_: 'inputMessagesFilterPhotos'}\n    var list = [$scope.messageID]\n    var preloaded = {}\n    var maxID = $scope.messageID\n    var hasMore = true\n\n    preloaded[$scope.messageID] = true\n\n    updatePrevNext()\n\n    function preloadPhotos (sign) {\n      // var preloadOffsets = sign < 0 ? [-1,-2,1,-3,2] : [1,2,-1,3,-2]\n      var preloadOffsets = sign < 0 ? [-1, -2] : [1, 2]\n      var index = list.indexOf($scope.messageID)\n      angular.forEach(preloadOffsets, function (offset) {\n        var messageID = list[index + offset]\n        if (messageID !== undefined && preloaded[messageID] === undefined) {\n          preloaded[messageID] = true\n          var message = AppMessagesManager.getMessage(messageID)\n          var photoID = message.media.photo.id\n          AppPhotosManager.preloadPhoto(photoID)\n        }\n      })\n    }\n\n    function updatePrevNext (count) {\n      var index = list.indexOf($scope.messageID)\n      if (hasMore) {\n        if (count) {\n          $scope.count = Math.max(count, list.length)\n        }\n      } else {\n        $scope.count = list.length\n      }\n      $scope.pos = $scope.count - index\n      $scope.nav.hasNext = index > 0\n      $scope.nav.hasPrev = hasMore || index < list.length - 1\n      $scope.canForward = $scope.canDelete = $scope.messageID > 0\n    }\n\n    $scope.nav.next = function () {\n      if (!$scope.nav.hasNext) {\n        return false\n      }\n\n      movePosition(-1)\n    }\n\n    $scope.nav.prev = function () {\n      if (!$scope.nav.hasPrev) {\n        return false\n      }\n      movePosition(+1)\n    }\n\n    $scope.$on('history_delete', function (e, historyUpdate) {\n      if (historyUpdate.peerID == peerID) {\n        if (historyUpdate.msgs[$scope.messageID]) {\n          if ($scope.nav.hasNext) {\n            $scope.nav.next()\n          } else if ($scope.nav.hasPrev) {\n            $scope.nav.prev()\n          } else {\n            return $modalInstance.dismiss()\n          }\n        }\n        var newList = []\n        for (var i = 0; i < list.length; i++) {\n          if (!historyUpdate.msgs[list[i]]) {\n            newList.push(list[i])\n          }\n        }\n        list = newList\n      }\n    })\n\n    if ($scope.webpageID) {\n      $scope.webpage = AppWebPagesManager.wrapForHistory($scope.webpageID)\n      return\n    }\n\n    AppMessagesManager.getSearch(peerID, inputQuery, inputFilter, 0, 1000).then(function (searchCachedResult) {\n      if (searchCachedResult.history.indexOf($scope.messageID) >= 0) {\n        list = searchCachedResult.history\n        maxID = list[list.length - 1]\n\n        updatePrevNext()\n        preloadPhotos(+1)\n      }\n      loadMore()\n    }, loadMore)\n\n    var jump = 0\n    function movePosition (sign) {\n      var curIndex = list.indexOf($scope.messageID)\n      var index = curIndex >= 0 ? curIndex + sign : 0\n      var curJump = ++jump\n\n      var promise = index >= list.length ? loadMore() : $q.when()\n      promise.then(function () {\n        if (curJump != jump) {\n          return\n        }\n\n        var messageID = list[index]\n        var message = AppMessagesManager.getMessage(messageID)\n        var photoID = message && message.media &&\n          ((message.media.photo && message.media.photo.id) ||\n            (message.media.webpage && message.media.webpage.photo && message.media.webpage.photo.id))\n        if (!photoID) {\n          console.error('Invalid photo message', index, list, messageID, message)\n          return\n        }\n\n        $scope.messageID = messageID\n        $scope.photoID = photoID\n        $scope.photo = AppPhotosManager.wrapForFull($scope.photoID)\n\n        preloaded[$scope.messageID] = true\n\n        updatePrevNext()\n\n        if (sign > 0 && hasMore && list.indexOf(messageID) + 1 >= list.length) {\n          loadMore()\n        } else {\n          preloadPhotos(sign)\n        }\n      })\n    }\n\n    var loadingPromise = false\n    function loadMore () {\n      if (loadingPromise) return loadingPromise\n\n      return loadingPromise = AppMessagesManager.getSearch(peerID, inputQuery, inputFilter, maxID).then(function (searchResult) {\n        if (searchResult.history.length) {\n          maxID = searchResult.history[searchResult.history.length - 1]\n          list = list.concat(searchResult.history)\n          hasMore = list.length < searchResult.count\n        } else {\n          hasMore = false\n        }\n\n        updatePrevNext(searchResult.count)\n        loadingPromise = false\n\n        if (searchResult.history.length) {\n          return $q.reject()\n        }\n\n        preloadPhotos(+1)\n      })\n    }\n  })\n\n  .controller('UserpicModalController', function ($q, $scope, $rootScope, $modalInstance, MtpApiManager, AppPhotosManager, AppUsersManager, AppPeersManager, AppMessagesManager, ApiUpdatesManager, PeersSelectService, ErrorService) {\n    $scope.photo = AppPhotosManager.wrapForFull($scope.photoID)\n    $scope.photo.thumb = {\n      location: AppPhotosManager.choosePhotoSize($scope.photo, 0, 0).location\n    }\n\n    $scope.nav = {}\n    $scope.canForward = true\n\n    var list = [$scope.photoID]\n    var maxID = $scope.photoID\n    var preloaded = {}\n    var myID = 0\n    var hasMore = true\n\n    updatePrevNext()\n\n    AppPhotosManager.getUserPhotos($scope.userID, 0, 1000).then(function (userpicCachedResult) {\n      if (userpicCachedResult.photos.indexOf($scope.photoID) >= 0) {\n        list = userpicCachedResult.photos\n        maxID = list[list.length - 1]\n      }\n      hasMore = list.length < userpicCachedResult.count\n      updatePrevNext()\n    })\n\n    MtpApiManager.getUserID().then(function (id) {\n      myID = id\n      $scope.canDelete = $scope.photo.user_id == myID\n    })\n\n    var jump = 0\n    function movePosition (sign, deleteCurrent) {\n      var curIndex = list.indexOf($scope.photoID)\n      var index = curIndex >= 0 ? curIndex + sign : 0\n      var curJump = ++jump\n\n      var promise = index >= list.length ? loadMore() : $q.when()\n      promise.then(function () {\n        if (curJump != jump) {\n          return\n        }\n\n        $scope.photoID = list[index]\n        $scope.photo = AppPhotosManager.wrapForFull($scope.photoID)\n        $scope.photo.thumb = {\n          location: AppPhotosManager.choosePhotoSize($scope.photo, 0, 0).location\n        }\n\n        var newCount\n        if (deleteCurrent) {\n          list.splice(curIndex, 1)\n          newCount = $scope.count - 1\n        }\n\n        updatePrevNext(newCount)\n\n        preloaded[$scope.photoID] = true\n\n        updatePrevNext()\n\n        if (sign > 0 && hasMore && list.indexOf($scope.photoID) + 1 >= list.length) {\n          loadMore()\n        } else {\n          preloadPhotos(sign)\n        }\n      })\n    }\n\n    function preloadPhotos (sign) {\n      var preloadOffsets = sign < 0 ? [-1, -2] : [1, 2]\n      var index = list.indexOf($scope.photoID)\n      angular.forEach(preloadOffsets, function (offset) {\n        var photoID = list[index + offset]\n        if (photoID !== undefined && preloaded[photoID] === undefined) {\n          preloaded[photoID] = true\n          AppPhotosManager.preloadPhoto(photoID)\n        }\n      })\n    }\n\n    var loadingPromise = false\n    function loadMore () {\n      if (loadingPromise) return loadingPromise\n\n      return loadingPromise = AppPhotosManager.getUserPhotos($scope.userID, maxID).then(function (userpicResult) {\n        if (userpicResult.photos.length) {\n          maxID = userpicResult.photos[userpicResult.photos.length - 1]\n          list = list.concat(userpicResult.photos)\n\n          hasMore = list.length < userpicResult.count\n        } else {\n          hasMore = false\n        }\n\n        updatePrevNext(userpicResult.count)\n        loadingPromise = false\n\n        if (userpicResult.photos.length) {\n          return $q.reject()\n        }\n\n        preloadPhotos(+1)\n      })\n    }\n\n    function updatePrevNext (count) {\n      var index = list.indexOf($scope.photoID)\n      if (hasMore) {\n        if (count) {\n          $scope.count = Math.max(count, list.length)\n        }\n      } else {\n        $scope.count = list.length\n      }\n      $scope.pos = $scope.count - index\n      $scope.nav.hasNext = index > 0\n      $scope.nav.hasPrev = hasMore || index < list.length - 1\n      $scope.canDelete = $scope.photo.user_id == myID\n    }\n\n    $scope.nav.next = function () {\n      if (!$scope.nav.hasNext) {\n        return false\n      }\n\n      movePosition(-1)\n    }\n\n    $scope.nav.prev = function () {\n      if (!$scope.nav.hasPrev) {\n        return false\n      }\n      movePosition(+1)\n    }\n\n    $scope.forward = function () {\n      PeersSelectService.selectPeer({confirm_type: 'FORWARD_PEER', canSend: true}).then(function (peerString) {\n        var peerID = AppPeersManager.getPeerID(peerString)\n        AppMessagesManager.sendOther(peerID, {\n          _: 'inputMediaPhoto',\n          id: {\n            _: 'inputPhoto',\n            id: $scope.photoID,\n            access_hash: $scope.photo.access_hash\n          }\n        })\n        $rootScope.$broadcast('history_focus', {peerString: peerString})\n      })\n    }\n\n    $scope['delete'] = function () {\n      var photoID = $scope.photoID\n      var myUser = AppUsersManager.getUser(myID)\n      var onDeleted = function () {\n        if (!$scope.nav.hasNext && !$scope.nav.hasPrev) {\n          return $modalInstance.dismiss()\n        }\n        movePosition($scope.nav.hasNext ? -1 : +1, true)\n      }\n\n      ErrorService.confirm({type: 'PHOTO_DELETE'}).then(function () {\n        if (myUser && myUser.photo && myUser.photo.photo_id == photoID) {\n          MtpApiManager.invokeApi('photos.updateProfilePhoto', {\n            id: {_: 'inputPhotoEmpty'}\n          }).then(function (updateResult) {\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updateShort',\n              update: {\n                _: 'updateUserPhoto',\n                user_id: myID,\n                date: tsNow(true),\n                photo: updateResult,\n                previous: true\n              }\n            })\n            onDeleted()\n          })\n        } else {\n          MtpApiManager.invokeApi('photos.deletePhotos', {\n            id: [{_: 'inputPhoto', id: photoID, access_hash: 0}]\n          }).then(onDeleted)\n        }\n      })\n    }\n\n    $scope.download = function () {\n      AppPhotosManager.downloadPhoto($scope.photoID)\n    }\n  })\n\n  .controller('ChatpicModalController', function ($q, $scope, $rootScope, $modalInstance, MtpApiManager, AppPhotosManager, AppChatsManager, AppPeersManager, AppMessagesManager, ApiUpdatesManager, PeersSelectService, ErrorService) {\n    $scope.photo = AppPhotosManager.wrapForFull($scope.photoID)\n    $scope.photo.thumb = {\n      location: AppPhotosManager.choosePhotoSize($scope.photo, 0, 0).location\n    }\n\n    var chat = AppChatsManager.getChat($scope.chatID)\n    var isChannel = AppChatsManager.isChannel($scope.chatID)\n\n    $scope.canForward = true\n    $scope.canDelete = isChannel ? chat.pFlags.creator : true\n\n    $scope.forward = function () {\n      PeersSelectService.selectPeer({confirm_type: 'FORWARD_PEER', canSend: true}).then(function (peerString) {\n        var peerID = AppPeersManager.getPeerID(peerString)\n        AppMessagesManager.sendOther(peerID, {\n          _: 'inputMediaPhoto',\n          id: {\n            _: 'inputPhoto',\n            id: $scope.photoID,\n            access_hash: $scope.photo.access_hash\n          }\n        })\n        $rootScope.$broadcast('history_focus', {peerString: peerString})\n      })\n    }\n\n    $scope['delete'] = function () {\n      ErrorService.confirm({type: 'PHOTO_DELETE'}).then(function () {\n        $scope.photo.updating = true\n        var apiPromise\n        if (AppChatsManager.isChannel($scope.chatID)) {\n          apiPromise = MtpApiManager.invokeApi('channels.editPhoto', {\n            channel: AppChatsManager.getChannelInput($scope.chatID),\n            photo: {_: 'inputChatPhotoEmpty'}\n          })\n        } else {\n          apiPromise = MtpApiManager.invokeApi('messages.editChatPhoto', {\n            chat_id: AppChatsManager.getChatInput($scope.chatID),\n            photo: {_: 'inputChatPhotoEmpty'}\n          })\n        }\n        apiPromise.then(function (updates) {\n          ApiUpdatesManager.processUpdateMessage(updates)\n          $modalInstance.dismiss()\n          $rootScope.$broadcast('history_focus', {peerString: AppChatsManager.getChatString($scope.chatID)})\n        })['finally'](function () {\n          $scope.photo.updating = false\n        })\n      })\n    }\n\n    $scope.download = function () {\n      AppPhotosManager.downloadPhoto($scope.photoID)\n    }\n  })\n\n  .controller('VideoModalController', function ($scope, $rootScope, $modalInstance, PeersSelectService, AppMessagesManager, AppDocsManager, AppPeersManager, ErrorService) {\n    $scope.video = AppDocsManager.wrapVideoForFull($scope.docID)\n\n    $scope.progress = {enabled: false}\n    $scope.player = {}\n\n    $scope.forward = function () {\n      var messageID = $scope.messageID\n      PeersSelectService.selectPeer({canSend: true}).then(function (peerString) {\n        $rootScope.$broadcast('history_focus', {\n          peerString: peerString,\n          attachment: {\n            _: 'fwd_messages',\n            id: [messageID]\n          }\n        })\n      })\n    }\n\n    $scope['delete'] = function () {\n      var messageID = $scope.messageID\n      ErrorService.confirm({type: 'MESSAGE_DELETE'}).then(function () {\n        AppMessagesManager.deleteMessages([messageID])\n      })\n    }\n\n    $scope.download = function () {\n      AppDocsManager.saveDocFile($scope.docID)\n    }\n\n    $scope.$on('history_delete', function (e, historyUpdate) {\n      if (historyUpdate && historyUpdate.msgs && historyUpdate.msgs[$scope.messageID]) {\n        $modalInstance.dismiss()\n      }\n    })\n  })\n\n  .controller('DocumentModalController', function ($scope, $rootScope, $modalInstance, PeersSelectService, AppMessagesManager, AppDocsManager, AppPeersManager, ErrorService) {\n    $scope.document = AppDocsManager.wrapForHistory($scope.docID)\n\n    $scope.forward = function () {\n      var messageID = $scope.messageID\n      PeersSelectService.selectPeer({canSend: true}).then(function (peerString) {\n        $rootScope.$broadcast('history_focus', {\n          peerString: peerString,\n          attachment: {\n            _: 'fwd_messages',\n            id: [messageID]\n          }\n        })\n      })\n    }\n\n    $scope['delete'] = function () {\n      var messageID = $scope.messageID\n      ErrorService.confirm({type: 'MESSAGE_DELETE'}).then(function () {\n        AppMessagesManager.deleteMessages([messageID])\n      })\n    }\n\n    $scope.download = function () {\n      AppDocsManager.saveDocFile($scope.docID)\n    }\n\n    $scope.$on('history_delete', function (e, historyUpdate) {\n      if (historyUpdate && historyUpdate.msgs && historyUpdate.msgs[$scope.messageID]) {\n        $modalInstance.dismiss()\n      }\n    })\n  })\n\n  .controller('EmbedModalController', function ($q, $scope, $rootScope, $modalInstance, AppPhotosManager, AppMessagesManager, AppPeersManager, AppWebPagesManager, PeersSelectService, ErrorService) {\n    $scope.webpage = AppWebPagesManager.wrapForFull($scope.webpageID)\n\n    $scope.nav = {}\n\n    $scope.forward = function () {\n      var messageID = $scope.messageID\n      PeersSelectService.selectPeer({canSend: true}).then(function (peerString) {\n        $rootScope.$broadcast('history_focus', {\n          peerString: peerString,\n          attachment: {\n            _: 'fwd_messages',\n            id: [messageID]\n          }\n        })\n      })\n    }\n\n    $scope['delete'] = function () {\n      var messageID = $scope.messageID\n      ErrorService.confirm({type: 'MESSAGE_DELETE'}).then(function () {\n        AppMessagesManager.deleteMessages([messageID])\n      })\n    }\n  })\n\n  .controller('GameModalController', function ($q, $scope, $rootScope, $modalInstance, AppPhotosManager, AppMessagesManager, AppPeersManager, AppGamesManager, PeersSelectService, ErrorService) {\n    $scope.game = AppGamesManager.wrapForFull($scope.gameID, $scope.messageID, $scope.embedUrl)\n    var messageID = $scope.messageID\n\n    var message = AppMessagesManager.getMessage(messageID)\n    $scope.botID = message.viaBotID || message.fromID\n\n    $scope.nav = {}\n\n    $scope.forward = function (withMyScore) {\n      PeersSelectService.selectPeer({canSend: true, confirm_type: 'INVITE_TO_GAME'}).then(function (peerString) {\n        var peerID = AppPeersManager.getPeerID(peerString)\n        AppMessagesManager.forwardMessages(peerID, [messageID], {\n          withMyScore: withMyScore\n        }).then(function () {\n          $rootScope.$broadcast('history_focus', {\n            peerString: peerString\n          })\n        })\n      })\n    }\n\n    $scope.$on('game_frame_event', function (e, eventData) {\n      if (eventData.eventType == 'share_score') {\n        $scope.forward(true)\n      }\n    })\n  })\n\n  .controller('UserModalController', function ($scope, $location, $rootScope, $modalInstance, AppProfileManager, $modal, AppUsersManager, MtpApiManager, NotificationsManager, AppPhotosManager, AppMessagesManager, AppPeersManager, PeersSelectService, ErrorService) {\n    var peerString = AppUsersManager.getUserString($scope.userID)\n\n    $scope.user = AppUsersManager.getUser($scope.userID)\n    $scope.blocked = false\n\n    $scope.settings = {notifications: true}\n\n    var profilePromise = AppProfileManager.getProfile($scope.userID, $scope.override)\n\n    profilePromise.then(function (userFull) {\n      $scope.blocked = userFull.pFlags.blocked\n      $scope.bot_info = userFull.bot_info\n      $scope.rAbout = userFull.rAbout\n\n      NotificationsManager.getPeerMuted($scope.userID).then(function (muted) {\n        $scope.settings.notifications = !muted\n\n        $scope.$watch('settings.notifications', function (newValue, oldValue) {\n          if (newValue === oldValue) {\n            return false\n          }\n          NotificationsManager.getPeerSettings($scope.userID).then(function (settings) {\n            settings.mute_until = newValue ? 0 : 2000000000\n            NotificationsManager.updatePeerSettings($scope.userID, settings)\n          })\n        })\n      })\n    })\n\n    $scope.goToHistory = function () {\n      $rootScope.$broadcast('history_focus', {peerString: peerString})\n    }\n\n    $scope.openUserPic = function () {\n      profilePromise.then(function () {\n        $scope.openPhoto($scope.user.photo.photo_id, {p: $scope.userID})\n      })\n    }\n\n    $scope.flushHistory = function (justClear) {\n      ErrorService.confirm({type: justClear ? 'HISTORY_FLUSH' : 'HISTORY_FLUSH_AND_DELETE'}).then(function () {\n        AppMessagesManager.flushHistory($scope.userID, justClear).then(function () {\n          if (justClear) {\n            $scope.goToHistory()\n          } else {\n            $modalInstance.close()\n            $location.url('/im')\n          }\n        })\n      })\n    }\n\n    $scope.importContact = function (edit) {\n      var scope = $rootScope.$new()\n      scope.importContact = {\n        phone: $scope.user.phone,\n        first_name: $scope.user.first_name,\n        last_name: $scope.user.last_name\n      }\n\n      $modal.open({\n        templateUrl: templateUrl(edit ? 'edit_contact_modal' : 'import_contact_modal'),\n        controller: 'ImportContactModalController',\n        windowClass: 'md_simple_modal_window mobile_modal',\n        scope: scope\n      }).result.then(function (foundUserID) {\n        if ($scope.userID == foundUserID) {\n          $scope.user = AppUsersManager.getUser($scope.userID)\n        }\n      })\n    }\n\n    $scope.deleteContact = function () {\n      AppUsersManager.deleteContacts([$scope.userID]).then(function () {\n        $scope.user = AppUsersManager.getUser($scope.userID)\n      })\n    }\n\n    $scope.inviteToGroup = function () {\n      PeersSelectService.selectPeer({\n        confirm_type: 'INVITE_TO_GROUP',\n        noUsers: true\n      }).then(function (peerString) {\n        var peerID = AppPeersManager.getPeerID(peerString)\n        var chatID = peerID < 0 ? -peerID : 0\n        AppMessagesManager.startBot($scope.user.id, chatID).then(function () {\n          $rootScope.$broadcast('history_focus', {peerString: peerString})\n        })\n      })\n    }\n\n    $scope.sendCommand = function (command) {\n      AppMessagesManager.sendText($scope.userID, '/' + command)\n      $rootScope.$broadcast('history_focus', {\n        peerString: peerString\n      })\n    }\n\n    $scope.toggleBlock = function (block) {\n      MtpApiManager.invokeApi(block ? 'contacts.block' : 'contacts.unblock', {\n        id: AppUsersManager.getUserInput($scope.userID)\n      }).then(function () {\n        $scope.blocked = block\n      })\n    }\n\n    $scope.shareContact = function () {\n      PeersSelectService.selectPeer({confirm_type: 'SHARE_CONTACT_PEER', canSend: true}).then(function (peerString) {\n        var peerID = AppPeersManager.getPeerID(peerString)\n        AppMessagesManager.sendOther(peerID, {\n          _: 'inputMediaContact',\n          phone_number: $scope.user.phone,\n          first_name: $scope.user.first_name,\n          last_name: $scope.user.last_name,\n          user_id: $scope.user.id\n        })\n        $rootScope.$broadcast('history_focus', {peerString: peerString})\n      })\n    }\n  })\n\n  .controller('ChatModalController', function ($scope, $modalInstance, $location, $timeout, $rootScope, $modal, AppUsersManager, AppChatsManager, AppProfileManager, AppPhotosManager, MtpApiManager, MtpApiFileManager, NotificationsManager, AppMessagesManager, AppPeersManager, ApiUpdatesManager, ContactsSelectService, ErrorService) {\n    $scope.chatFull = AppChatsManager.wrapForFull($scope.chatID, {})\n    $scope.settings = {notifications: true}\n\n    $scope.maxParticipants = 200\n\n    AppProfileManager.getChatFull($scope.chatID).then(function (chatFull) {\n      $scope.chatFull = AppChatsManager.wrapForFull($scope.chatID, chatFull)\n      $scope.$broadcast('ui_height')\n\n      $scope.needMigrate = $scope.chatFull &&\n        $scope.chatFull.participants &&\n        $scope.chatFull.participants.participants &&\n        $scope.chatFull.participants.participants.length >= 200\n\n      if (Config.Modes.test || Config.Modes.debug) {\n        $scope.needMigrate = true\n      }\n\n      NotificationsManager.getPeerMuted(-$scope.chatID).then(function (muted) {\n        $scope.settings.notifications = !muted\n\n        $scope.$watch('settings.notifications', function (newValue, oldValue) {\n          if (newValue === oldValue) {\n            return false\n          }\n          NotificationsManager.getPeerSettings(-$scope.chatID).then(function (settings) {\n            if (newValue) {\n              settings.mute_until = 0\n            } else {\n              settings.mute_until = 2000000000\n            }\n            NotificationsManager.updatePeerSettings(-$scope.chatID, settings)\n          })\n        })\n      })\n    })\n\n    function onChatUpdated (updates) {\n      ApiUpdatesManager.processUpdateMessage(updates)\n      $rootScope.$broadcast('history_focus', {peerString: $scope.chatFull.peerString})\n    }\n\n    $scope.leaveGroup = function () {\n      ErrorService.confirm({type: 'HISTORY_LEAVE_AND_FLUSH'}).then(function () {\n        MtpApiManager.invokeApi('messages.deleteChatUser', {\n          chat_id: AppChatsManager.getChatInput($scope.chatID),\n          user_id: {_: 'inputUserSelf'}\n        }).then(function (updates) {\n          ApiUpdatesManager.processUpdateMessage(updates)\n          AppMessagesManager.flushHistory(-$scope.chatID).then(function () {\n            $modalInstance.close()\n            $location.url('/im')\n          })\n        })\n      })\n    }\n\n    $scope.inviteToGroup = function () {\n      var disabled = []\n      angular.forEach($scope.chatFull.participants.participants, function (participant) {\n        disabled.push(participant.user_id)\n      })\n\n      ContactsSelectService.selectContacts({disabled: disabled}).then(function (userIDs) {\n        angular.forEach(userIDs, function (userID) {\n          MtpApiManager.invokeApi('messages.addChatUser', {\n            chat_id: AppChatsManager.getChatInput($scope.chatID),\n            user_id: AppUsersManager.getUserInput(userID),\n            fwd_limit: 100\n          }).then(function (updates) {\n            ApiUpdatesManager.processUpdateMessage(updates)\n          })\n        })\n\n        $rootScope.$broadcast('history_focus', {peerString: $scope.chatFull.peerString})\n      })\n    }\n\n    $scope.migrateToSuperGroup = function () {\n      ErrorService.confirm({type: 'SUPERGROUP_MIGRATE'}).then(function () {\n        MtpApiManager.invokeApi('messages.migrateChat', {\n          chat_id: AppChatsManager.getChatInput($scope.chatID)\n        }).then(onChatUpdated)\n      })\n    }\n\n    $scope.kickFromGroup = function (userID) {\n      MtpApiManager.invokeApi('messages.deleteChatUser', {\n        chat_id: AppChatsManager.getChatInput($scope.chatID),\n        user_id: AppUsersManager.getUserInput(userID)\n      }).then(onChatUpdated)\n    }\n\n    $scope.flushHistory = function (justClear) {\n      ErrorService.confirm({type: justClear ? 'HISTORY_FLUSH' : 'HISTORY_FLUSH_AND_DELETE'}).then(function () {\n        AppMessagesManager.flushHistory(-$scope.chatID, justClear).then(function () {\n          if (justClear) {\n            $rootScope.$broadcast('history_focus', {peerString: $scope.chatFull.peerString})\n          } else {\n            $modalInstance.close()\n            $location.url('/im')\n          }\n        })\n      })\n    }\n\n    $scope.inviteViaLink = function () {\n      var scope = $rootScope.$new()\n      scope.chatID = $scope.chatID\n\n      $modal.open({\n        templateUrl: templateUrl('chat_invite_link_modal'),\n        controller: 'ChatInviteLinkModalController',\n        scope: scope,\n        windowClass: 'md_simple_modal_window'\n      })\n    }\n\n    $scope.photo = {}\n\n    $scope.$watch('photo.file', onPhotoSelected)\n\n    function onPhotoSelected (photo) {\n      if (!photo || !photo.type || photo.type.indexOf('image') !== 0) {\n        return\n      }\n      $scope.photo.updating = true\n      MtpApiFileManager.uploadFile(photo).then(function (inputFile) {\n        return MtpApiManager.invokeApi('messages.editChatPhoto', {\n          chat_id: AppChatsManager.getChatInput($scope.chatID),\n          photo: {\n            _: 'inputChatUploadedPhoto',\n            file: inputFile\n          }\n        }).then(onChatUpdated)\n      })['finally'](function () {\n        $scope.photo.updating = false\n      })\n    }\n\n    $scope.deletePhoto = function () {\n      $scope.photo.updating = true\n      MtpApiManager.invokeApi('messages.editChatPhoto', {\n        chat_id: AppChatsManager.getChatInput($scope.chatID),\n        photo: {_: 'inputChatPhotoEmpty'}\n      }).then(onChatUpdated)['finally'](function () {\n        $scope.photo.updating = false\n      })\n    }\n\n    $scope.editTitle = function () {\n      var scope = $rootScope.$new()\n      scope.chatID = $scope.chatID\n\n      $modal.open({\n        templateUrl: templateUrl('chat_edit_modal'),\n        controller: 'ChatEditModalController',\n        scope: scope,\n        windowClass: 'md_simple_modal_window mobile_modal'\n      })\n    }\n\n    $scope.hasRights = function (action) {\n      return AppChatsManager.hasRights($scope.chatID, action)\n    }\n  })\n\n  .controller('ChannelModalController', function ($scope, $timeout, $rootScope, $modal, AppUsersManager, AppChatsManager, AppProfileManager, AppPhotosManager, MtpApiManager, MtpApiFileManager, NotificationsManager, AppMessagesManager, AppPeersManager, ApiUpdatesManager, ContactsSelectService, ErrorService) {\n    $scope.chatFull = AppChatsManager.wrapForFull($scope.chatID, {})\n    $scope.settings = {notifications: true}\n    $scope.isMegagroup = AppChatsManager.isMegagroup($scope.chatID)\n\n    AppProfileManager.getChannelFull($scope.chatID, true).then(function (chatFull) {\n      $scope.chatFull = AppChatsManager.wrapForFull($scope.chatID, chatFull)\n      $scope.$broadcast('ui_height')\n\n      NotificationsManager.getPeerMuted(-$scope.chatID).then(function (muted) {\n        $scope.settings.notifications = !muted\n\n        $scope.$watch('settings.notifications', function (newValue, oldValue) {\n          if (newValue === oldValue) {\n            return false\n          }\n          NotificationsManager.getPeerSettings(-$scope.chatID).then(function (settings) {\n            if (newValue) {\n              settings.mute_until = 0\n            } else {\n              settings.mute_until = 2000000000\n            }\n            NotificationsManager.updatePeerSettings(-$scope.chatID, settings)\n          })\n        })\n      })\n\n      if ($scope.chatFull.chat &&\n        $scope.chatFull.chat.pFlags.creator &&\n        $scope.chatFull.exported_invite &&\n        $scope.chatFull.exported_invite._ == 'chatInviteEmpty') {\n        AppProfileManager.getChatInviteLink($scope.chatID, true).then(function (link) {\n          $scope.chatFull.exported_invite = {_: 'chatInviteExported', link: link}\n        })\n      }\n    })\n\n    AppProfileManager.getChannelParticipants($scope.chatID).then(function (participants) {\n      $scope.participants = AppChatsManager.wrapParticipants($scope.chatID, participants)\n      $scope.$broadcast('ui_height')\n    })\n\n\n    function onChatUpdated (updates) {\n      ApiUpdatesManager.processUpdateMessage(updates)\n      $rootScope.$broadcast('history_focus', {peerString: $scope.chatFull.peerString})\n      if (updates &&\n          updates.updates &&\n          updates.updates.length &&\n          AppChatsManager.isChannel($scope.chatID)) {\n        AppProfileManager.invalidateChannelParticipants($scope.chatID)\n      }\n    }\n\n    $scope.leaveChannel = function () {\n      return ErrorService.confirm({type: $scope.isMegagroup ? 'MEGAGROUP_LEAVE' : 'CHANNEL_LEAVE'}).then(function () {\n        MtpApiManager.invokeApi('channels.leaveChannel', {\n          channel: AppChatsManager.getChannelInput($scope.chatID)\n        }).then(onChatUpdated)\n      })\n    }\n\n    $scope.deleteChannel = function () {\n      return ErrorService.confirm({type: $scope.isMegagroup ? 'MEGAGROUP_DELETE' : 'CHANNEL_DELETE'}).then(function () {\n        MtpApiManager.invokeApi('channels.deleteChannel', {\n          channel: AppChatsManager.getChannelInput($scope.chatID)\n        }).then(onChatUpdated)\n      })\n    }\n\n    $scope.flushHistory = function () {\n      ErrorService.confirm({type: 'HISTORY_FLUSH'}).then(function () {\n        AppMessagesManager.flushHistory(-$scope.chatID).then(function () {\n          $rootScope.$broadcast('history_focus', {peerString: $scope.chatFull.peerString})\n        })\n      })\n    }\n\n    $scope.joinChannel = function () {\n      MtpApiManager.invokeApi('channels.joinChannel', {\n        channel: AppChatsManager.getChannelInput($scope.chatID)\n      }).then(onChatUpdated)\n    }\n\n    $scope.inviteToChannel = function () {\n      var disabled = []\n      angular.forEach(($scope.chatFull.participants || {}).participants || [], function (participant) {\n        disabled.push(participant.user_id)\n      })\n\n      ContactsSelectService.selectContacts({disabled: disabled}).then(function (userIDs) {\n        var inputUsers = []\n        angular.forEach(userIDs, function (userID) {\n          inputUsers.push(AppUsersManager.getUserInput(userID))\n        })\n        MtpApiManager.invokeApi('channels.inviteToChannel', {\n          channel: AppChatsManager.getChannelInput($scope.chatID),\n          users: inputUsers\n        }).then(onChatUpdated)\n      })\n    }\n\n    $scope.kickFromChannel = function (userID) {\n      MtpApiManager.invokeApi('channels.editBanned', {\n        channel: AppChatsManager.getChannelInput($scope.chatID),\n        user_id: AppUsersManager.getUserInput(userID),\n        banned_rights: {_: 'channelBannedRights', flags: 1, until_date: 0}\n      }).then(onChatUpdated)\n    }\n\n    $scope.shareLink = function ($event) {\n      var scope = $rootScope.$new()\n      scope.chatID = $scope.chatID\n\n      $modal.open({\n        templateUrl: templateUrl('chat_invite_link_modal'),\n        controller: 'ChatInviteLinkModalController',\n        scope: scope,\n        windowClass: 'md_simple_modal_window'\n      })\n\n      return cancelEvent($event)\n    }\n\n    $scope.photo = {}\n\n    $scope.$watch('photo.file', onPhotoSelected)\n\n    function onPhotoSelected (photo) {\n      if (!photo || !photo.type || photo.type.indexOf('image') !== 0) {\n        return\n      }\n      $scope.photo.updating = true\n      MtpApiFileManager.uploadFile(photo).then(function (inputFile) {\n        return MtpApiManager.invokeApi('channels.editPhoto', {\n          channel: AppChatsManager.getChannelInput($scope.chatID),\n          photo: {\n            _: 'inputChatUploadedPhoto',\n            file: inputFile\n          }\n        }).then(onChatUpdated)\n      })['finally'](function () {\n        $scope.photo.updating = false\n      })\n    }\n\n    $scope.deletePhoto = function () {\n      $scope.photo.updating = true\n      MtpApiManager.invokeApi('channels.editPhoto', {\n        channel: AppChatsManager.getChannelInput($scope.chatID),\n        photo: {_: 'inputChatPhotoEmpty'}\n      }).then(onChatUpdated)['finally'](function () {\n        $scope.photo.updating = false\n      })\n    }\n\n    $scope.editChannel = function () {\n      var scope = $rootScope.$new()\n      scope.chatID = $scope.chatID\n\n      $modal.open({\n        templateUrl: templateUrl($scope.isMegagroup ? 'megagroup_edit_modal' : 'channel_edit_modal'),\n        controller: 'ChannelEditModalController',\n        scope: scope,\n        windowClass: 'md_simple_modal_window mobile_modal'\n      })\n    }\n\n    $scope.goToHistory = function () {\n      $rootScope.$broadcast('history_focus', {peerString: $scope.chatFull.peerString})\n    }\n\n    $scope.hasRights = function (action) {\n      return AppChatsManager.hasRights($scope.chatID, action)\n    }\n  })\n\n  .controller('SettingsModalController', function ($rootScope, $scope, $timeout, $modal, AppUsersManager, AppChatsManager, AppPhotosManager, MtpApiManager, Storage, NotificationsManager, MtpApiFileManager, PasswordManager, ApiUpdatesManager, ChangelogNotifyService, LayoutSwitchService, WebPushApiManager, AppRuntimeManager, ErrorService, _) {\n\n    $scope.profile = {}\n    $scope.photo = {}\n    $scope.version = Config.App.version\n\n    MtpApiManager.getUserID().then(function (id) {\n      $scope.profile = AppUsersManager.getUser(id)\n    })\n\n    var profilePromise = MtpApiManager.invokeApi('users.getFullUser', {\n      id: {_: 'inputUserSelf'}\n    }).then(function (userFullResult) {\n      AppUsersManager.saveApiUser(userFullResult.user)\n      if (userFullResult.profile_photo) {\n        AppPhotosManager.savePhoto(userFullResult.profile_photo, {\n          user_id: userFullResult.user.id\n        })\n      }\n    })\n\n    $scope.contentSettings = {notReady: true}\n    var contentSettingsPromise = MtpApiManager.invokeApi('account.getContentSettings', {}).then(function (contentsResult) {\n      $scope.contentSettings = contentsResult\n    })\n\n    $scope.toggleContentSettings = function () {\n      if ($scope.contentSettings.pFlags &&\n          $scope.contentSettings.pFlags.sensitive_enabled) {\n        delete $scope.contentSettings.pFlags.sensitive_enabled\n        MtpApiManager.invokeApi('account.setContentSettings', {flags: 0})\n      } else {\n        return ErrorService.confirm({type: 'CONTENT_SETTINGS_SENSITIVE'}).then(function () {\n          $scope.contentSettings.pFlags.sensitive_enabled = true\n          MtpApiManager.invokeApi('account.setContentSettings', {flags: 1})\n        })\n      }\n    }\n\n    $scope.notify = {volume: 0.5}\n    $scope.send = {}\n\n    $scope.$watch('photo.file', onPhotoSelected)\n\n    $scope.password = {_: 'account.noPassword'}\n    updatePasswordState()\n    var updatePasswordTimeout = false\n    var stopped = false\n\n    $scope.openUserPic = function () {\n      profilePromise.then(function () {\n        $scope.openPhoto($scope.profile.photo.photo_id, {p: $scope.profile.id})\n      })\n    }\n\n    $scope.changePassword = function (options) {\n      options = options || {}\n      if (options.action == 'cancel_email') {\n        return ErrorService.confirm({type: 'PASSWORD_ABORT_SETUP'}).then(function () {\n          PasswordManager.updateSettings($scope.password, {email: ''}).then(updatePasswordState)\n        })\n      }\n      var scope = $rootScope.$new()\n      scope.password = $scope.password\n      angular.extend(scope, options)\n      var modal = $modal.open({\n        scope: scope,\n        templateUrl: templateUrl('password_update_modal'),\n        controller: 'PasswordUpdateModalController',\n        windowClass: 'md_simple_modal_window mobile_modal'\n      })\n\n      modal.result['finally'](updatePasswordState)\n    }\n\n    $scope.showSessions = function () {\n      $modal.open({\n        templateUrl: templateUrl('sessions_list_modal'),\n        controller: 'SessionsListModalController',\n        windowClass: 'md_simple_modal_window mobile_modal'\n      })\n    }\n\n    function updatePasswordState () {\n      $timeout.cancel(updatePasswordTimeout)\n      updatePasswordTimeout = false\n      PasswordManager.getState().then(function (result) {\n        $scope.password = result\n        if (result._ == 'account.noPassword' && result.email_unconfirmed_pattern && !stopped) {\n          updatePasswordTimeout = $timeout(updatePasswordState, 5000)\n        }\n      })\n    }\n\n    $scope.$on('$destroy', function () {\n      $timeout.cancel(updatePasswordTimeout)\n      stopped = true\n    })\n\n    function onPhotoSelected (photo) {\n      if (!photo || !photo.type || photo.type.indexOf('image') !== 0) {\n        return\n      }\n      $scope.photo.updating = true\n      MtpApiFileManager.uploadFile(photo).then(function (inputFile) {\n        MtpApiManager.invokeApi('photos.uploadProfilePhoto', {\n          file: inputFile,\n          caption: '',\n          geo_point: {_: 'inputGeoPointEmpty'}\n        }).then(function (updateResult) {\n          AppUsersManager.saveApiUsers(updateResult.users)\n          MtpApiManager.getUserID().then(function (id) {\n            AppPhotosManager.savePhoto(updateResult.photo, {\n              user_id: id\n            })\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updateShort',\n              update: {\n                _: 'updateUserPhoto',\n                user_id: id,\n                date: tsNow(true),\n                photo: AppUsersManager.getUser(id).photo,\n                previous: true\n              }\n            })\n            $scope.photo = {}\n          })\n        })\n      })['finally'](function () {\n        delete $scope.photo.updating\n      })\n    }\n\n    $scope.deletePhoto = function () {\n      $scope.photo.updating = true\n      MtpApiManager.invokeApi('photos.updateProfilePhoto', {\n        id: {_: 'inputPhotoEmpty'}\n      }).then(function (updateResult) {\n        MtpApiManager.getUserID().then(function (id) {\n          ApiUpdatesManager.processUpdateMessage({\n            _: 'updateShort',\n            update: {\n              _: 'updateUserPhoto',\n              user_id: id,\n              date: tsNow(true),\n              photo: updateResult,\n              previous: true\n            }\n          })\n          $scope.photo = {}\n        })\n      })['finally'](function () {\n        delete $scope.photo.updating\n      })\n    }\n\n    $scope.editProfile = function () {\n      $modal.open({\n        templateUrl: templateUrl('profile_edit_modal'),\n        controller: 'ProfileEditModalController',\n        windowClass: 'md_simple_modal_window mobile_modal'\n      })\n    }\n\n    $scope.changeUsername = function () {\n      $modal.open({\n        templateUrl: templateUrl('username_edit_modal'),\n        controller: 'UsernameEditModalController',\n        windowClass: 'md_simple_modal_window mobile_modal'\n      })\n    }\n\n    $scope.terminateSessions = function () {\n      ErrorService.confirm({type: 'TERMINATE_SESSIONS'}).then(function () {\n        MtpApiManager.invokeApi('auth.resetAuthorizations', {})\n      })\n    }\n\n    Storage.get('notify_nodesktop', 'send_ctrlenter', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush').then(function (settings) {\n      $scope.notify.desktop = !settings[0]\n      $scope.send.enter = settings[1] ? '' : '1'\n\n      $scope.notify.pushAvailable = WebPushApiManager.isAvailable\n      $scope.notify.push = !settings[5]\n\n      if (settings[2] !== false) {\n        $scope.notify.volume = settings[2] > 0 && settings[2] <= 1.0 ? settings[2] : 0\n      } else {\n        $scope.notify.volume = 0.5\n      }\n\n      $scope.notify.canVibrate = NotificationsManager.getVibrateSupport()\n      $scope.notify.vibrate = !settings[3]\n\n      $scope.notify.preview = !settings[4]\n\n      $scope.notify.volumeOf4 = function () {\n        return 1 + Math.ceil(($scope.notify.volume - 0.1) / 0.33)\n      }\n\n      $scope.toggleSound = function () {\n        if ($scope.notify.volume) {\n          $scope.notify.volume = 0\n        } else {\n          $scope.notify.volume = 0.5\n        }\n      }\n\n      var testSoundPromise\n      $scope.$watch('notify.volume', function (newValue, oldValue) {\n        if (newValue !== oldValue) {\n          Storage.set({notify_volume: newValue})\n          $rootScope.$broadcast('settings_changed')\n          NotificationsManager.clear()\n\n          if (testSoundPromise) {\n            $timeout.cancel(testSoundPromise)\n          }\n          testSoundPromise = $timeout(function () {\n            NotificationsManager.testSound(newValue)\n          }, 500)\n        }\n      })\n\n      $scope.toggleDesktop = function () {\n        $scope.notify.desktop = !$scope.notify.desktop\n\n        if ($scope.notify.desktop) {\n          Storage.remove('notify_nodesktop')\n        } else {\n          Storage.set({notify_nodesktop: true})\n        }\n        $rootScope.$broadcast('settings_changed')\n      }\n\n      $scope.togglePush = function () {\n        $scope.notify.push = !$scope.notify.push\n\n        if ($scope.notify.push) {\n          Storage.remove('notify_nopush')\n        } else {\n          Storage.set({notify_nopush: true})\n        }\n        $rootScope.$broadcast('settings_changed')\n      }\n\n      $scope.togglePreview = function () {\n        $scope.notify.preview = !$scope.notify.preview\n\n        if ($scope.notify.preview) {\n          Storage.remove('notify_nopreview')\n        } else {\n          Storage.set({notify_nopreview: true})\n        }\n        $rootScope.$broadcast('settings_changed')\n      }\n\n      $scope.toggleVibrate = function () {\n        $scope.notify.vibrate = !$scope.notify.vibrate\n\n        if ($scope.notify.vibrate) {\n          Storage.remove('notify_novibrate')\n        } else {\n          Storage.set({notify_novibrate: true})\n        }\n        $rootScope.$broadcast('settings_changed')\n      }\n\n      $scope.toggleCtrlEnter = function (newValue) {\n        $scope.send.enter = newValue\n\n        if ($scope.send.enter) {\n          Storage.remove('send_ctrlenter')\n        } else {\n          Storage.set({send_ctrlenter: true})\n        }\n        $rootScope.$broadcast('settings_changed')\n      }\n    })\n\n    $scope.openChangelog = function () {\n      ChangelogNotifyService.showChangelog(false)\n    }\n\n    $scope.logOut = function () {\n      ErrorService.confirm({type: 'LOGOUT'}).then(function () {\n        MtpApiManager.logOut().then(function () {\n          location.hash = '/login'\n          AppRuntimeManager.reload()\n        })\n      })\n    }\n\n    $scope.switchBackToDesktop = Config.Mobile && !Config.Navigator.mobile\n    $scope.switchToDesktop = function () {\n      LayoutSwitchService.switchLayout(false)\n    }\n  })\n\n  .controller('ChangelogModalController', function ($scope, $modal) {\n    $scope.currentVersion = Config.App.version\n    if (!$scope.lastVersion) {\n      var versionParts = $scope.currentVersion.split('.')\n      $scope.lastVersion = versionParts[0] + '.' + versionParts[1] + '.' + Math.max(0, versionParts[2] - 1)\n    }\n\n    $scope.changelogHidden = false\n    $scope.changelogShown = false\n\n    $scope.canShowVersion = function (curVersion) {\n      if ($scope.changelogShown) {\n        return true\n      }\n\n      var show = versionCompare(curVersion, $scope.lastVersion) >= 0\n      if (!show) {\n        $scope.changelogHidden = true\n      }\n\n      return show\n    }\n\n    $scope.showAllVersions = function () {\n      $scope.changelogShown = true\n      $scope.changelogHidden = false\n      $scope.$emit('ui_height')\n      $scope.$broadcast('ui_height')\n    }\n\n    $scope.changeUsername = function () {\n      $modal.open({\n        templateUrl: templateUrl('username_edit_modal'),\n        controller: 'UsernameEditModalController',\n        windowClass: 'md_simple_modal_window mobile_modal'\n      })\n    }\n  })\n\n  .controller('ReportMessagesModalController', function ($scope, $modalInstance) {\n    $scope.reason = {_: 'inputReportReasonSpam', text: ''}\n    $scope.toggleReportReason = function (reason) {\n      $scope.reason = {_: reason}\n      if (reason == 'inputReportReasonOther') {\n        onContentLoaded(function () {\n          $scope.$broadcast('ui_reason_text_focus')\n        })\n      }\n    }\n  })\n\n  .controller('ProfileEditModalController', function ($scope, $modalInstance, AppUsersManager, MtpApiManager) {\n    $scope.profile = {}\n    $scope.error = {}\n\n    MtpApiManager.getUserID().then(function (id) {\n      var user = AppUsersManager.getUser(id)\n      $scope.profile = {\n        first_name: user.first_name,\n        last_name: user.last_name\n      }\n    })\n\n    $scope.updateProfile = function () {\n      $scope.profile.updating = true\n      var flags = (1 << 0) | (1 << 1)\n      MtpApiManager.invokeApi('account.updateProfile', {\n        flags: flags,\n        first_name: $scope.profile.first_name || '',\n        last_name: $scope.profile.last_name || ''\n      }).then(function (user) {\n        $scope.error = {}\n        AppUsersManager.saveApiUser(user)\n        $modalInstance.close()\n      }, function (error) {\n        switch (error.type) {\n          case 'FIRSTNAME_INVALID':\n            $scope.error = {field: 'first_name'}\n            error.handled = true\n            break\n\n          case 'LASTNAME_INVALID':\n            $scope.error = {field: 'last_name'}\n            error.handled = true\n            break\n\n          case 'NAME_NOT_MODIFIED':\n            error.handled = true\n            $modalInstance.close()\n            break\n        }\n      })['finally'](function () {\n        delete $scope.profile.updating\n      })\n    }\n  })\n\n  .controller('UsernameEditModalController', function ($scope, $modalInstance, AppUsersManager, MtpApiManager) {\n    $scope.profile = {}\n    $scope.error = {}\n\n    MtpApiManager.getUserID().then(function (id) {\n      var user = AppUsersManager.getUser(id)\n      $scope.profile = {\n        username: user.username\n      }\n    })\n\n    $scope.updateUsername = function () {\n      $scope.profile.updating = true\n\n      MtpApiManager.invokeApi('account.updateUsername', {\n        username: $scope.profile.username || ''\n      }).then(function (user) {\n        $scope.checked = {}\n        AppUsersManager.saveApiUser(user)\n        $modalInstance.close()\n      }, function (error) {\n        switch (error.type) {\n          case 'USERNAME_NOT_MODIFIED':\n            error.handled = true\n            $modalInstance.close()\n            break\n        }\n      })['finally'](function () {\n        delete $scope.profile.updating\n      })\n    }\n\n    $scope.$watch('profile.username', function (newVal) {\n      if (!newVal || !newVal.length) {\n        $scope.checked = {}\n        return\n      }\n      MtpApiManager.invokeApi('account.checkUsername', {\n        username: newVal\n      }).then(function (valid) {\n        if ($scope.profile.username !== newVal) {\n          return\n        }\n        if (valid) {\n          $scope.checked = {success: true}\n        } else {\n          $scope.checked = {error: true}\n        }\n      }, function (error) {\n        if ($scope.profile.username !== newVal) {\n          return\n        }\n        switch (error.type) {\n          case 'USERNAME_INVALID':\n            $scope.checked = {error: true}\n            error.handled = true\n            break\n        }\n      })\n    })\n  })\n\n  .controller('SessionsListModalController', function ($scope, $q, $timeout, _, MtpApiManager, ErrorService, $modalInstance) {\n    $scope.slice = {limit: 20, limitDelta: 20}\n\n    var updateSessionsTimeout = false\n    var stopped = false\n\n    function updateSessions () {\n      $timeout.cancel(updateSessionsTimeout)\n      MtpApiManager.invokeApi('account.getAuthorizations').then(function (result) {\n        $scope.sessionsLoaded = true\n        $scope.authorizations = result.authorizations\n\n        var authorization\n        for (var i = 0, len = $scope.authorizations.length; i < len; i++) {\n          authorization = $scope.authorizations[i]\n          authorization.current = (authorization.flags & 1) == 1\n        }\n        $scope.authorizations.sort(function (sA, sB) {\n          if (sA.current) {\n            return -1\n          }\n          if (sB.current) {\n            return 1\n          }\n          return sB.date_active - sA.date_active\n        })\n        if (!stopped) {\n          updateSessionsTimeout = $timeout(updateSessions, 5000)\n        }\n      })\n    }\n\n    $scope.terminateSession = function (hash) {\n      ErrorService.confirm({type: 'TERMINATE_SESSION'}).then(function () {\n        MtpApiManager.invokeApi('account.resetAuthorization', {hash: hash}).then(updateSessions)\n      })\n    }\n\n    $scope.terminateAllSessions = function () {\n      ErrorService.confirm({type: 'TERMINATE_SESSIONS'}).then(function () {\n        MtpApiManager.invokeApi('auth.resetAuthorizations', {})\n      })\n    }\n\n    updateSessions()\n\n    $scope.$on('apiUpdate', function (e, update) {\n      if (update._ == 'updateNewAuthorization') {\n        updateSessions()\n      }\n    })\n\n    $scope.$on('$destroy', function () {\n      $timeout.cancel(updateSessionsTimeout)\n      stopped = true\n    })\n  })\n\n  .controller('PasswordUpdateModalController', function ($scope, $q, _, PasswordManager, MtpApiManager, ErrorService, $modalInstance) {\n    $scope.passwordSettings = {}\n\n    $scope.updatePassword = function () {\n      delete $scope.passwordSettings.error_field\n\n      var confirmPromise\n      if ($scope.action == 'disable') {\n        confirmPromise = $q.when()\n      } else {\n        if (!$scope.passwordSettings.new_password) {\n          $scope.passwordSettings.error_field = 'new_password'\n          $scope.$broadcast('new_password_focus')\n          return false\n        }\n        if ($scope.passwordSettings.new_password != $scope.passwordSettings.confirm_password) {\n          $scope.passwordSettings.error_field = 'confirm_password'\n          $scope.$broadcast('confirm_password_focus')\n          return false\n        }\n        confirmPromise = $scope.passwordSettings.email\n          ? $q.when()\n          : ErrorService.confirm({type: 'RECOVERY_EMAIL_EMPTY'})\n      }\n\n      $scope.passwordSettings.loading = true\n\n      confirmPromise.then(function () {\n        PasswordManager.updateSettings($scope.password, {\n          cur_password: $scope.passwordSettings.cur_password || '',\n          new_password: $scope.passwordSettings.new_password,\n          email: $scope.passwordSettings.email,\n          hint: $scope.passwordSettings.hint\n        }).then(function (result) {\n          delete $scope.passwordSettings.loading\n          $modalInstance.close(true)\n          if ($scope.action == 'disable') {\n            ErrorService.alert(\n              _('error_modal_password_disabled_title_raw'),\n              _('error_modal_password_disabled_descripion_raw')\n            )\n          } else {\n            ErrorService.alert(\n              _('error_modal_password_success_title_raw'),\n              _('error_modal_password_success_descripion_raw')\n            )\n          }\n        }, function (error) {\n          switch (error.type) {\n            case 'PASSWORD_HASH_INVALID':\n            case 'NEW_PASSWORD_BAD':\n              $scope.passwordSettings.error_field = 'cur_password'\n              error.handled = true\n              $scope.$broadcast('cur_password_focus')\n              break\n            case 'NEW_PASSWORD_BAD':\n              $scope.passwordSettings.error_field = 'new_password'\n              error.handled = true\n              break\n            case 'EMAIL_INVALID':\n              $scope.passwordSettings.error_field = 'email'\n              error.handled = true\n              break\n            case 'EMAIL_UNCONFIRMED':\n              ErrorService.alert(\n                _('error_modal_email_unconfirmed_title_raw'),\n                _('error_modal_email_unconfirmed_descripion_raw')\n              )\n              $modalInstance.close(true)\n              error.handled = true\n              break\n          }\n          delete $scope.passwordSettings.loading\n        })\n      })\n    }\n\n    switch ($scope.action) {\n      case 'disable':\n        $scope.passwordSettings.new_password = ''\n        break\n      case 'create':\n        onContentLoaded(function () {\n          $scope.$broadcast('new_password_focus')\n        })\n        break\n    }\n\n    $scope.$watch('passwordSettings.new_password', function (newValue) {\n      var len = (newValue && newValue.length) || 0\n      if (!len) {\n        $scope.passwordSettings.hint = ''\n      } else if (len <= 3) {\n        $scope.passwordSettings.hint = '***'\n      } else {\n        $scope.passwordSettings.hint = newValue.charAt(0) + (new Array(len - 1)).join('*') + newValue.charAt(len - 1)\n      }\n      $scope.$broadcast('value_updated')\n    })\n  })\n\n  .controller('PasswordRecoveryModalController', function ($scope, $q, _, PasswordManager, MtpApiManager, ErrorService, $modalInstance) {\n    $scope.checkCode = function () {\n      $scope.recovery.updating = true\n\n      PasswordManager.recover($scope.recovery.code, $scope.options).then(function (result) {\n        ErrorService.alert(\n          _('error_modal_password_disabled_title_raw'),\n          _('error_modal_password_disabled_descripion_raw')\n        )\n        $modalInstance.close(result)\n      }, function (error) {\n        delete $scope.recovery.updating\n        switch (error.type) {\n          case 'CODE_EMPTY':\n          case 'CODE_INVALID':\n            $scope.recovery.error_field = 'code'\n            error.handled = true\n            break\n\n          case 'PASSWORD_EMPTY':\n          case 'PASSWORD_RECOVERY_NA':\n          case 'PASSWORD_RECOVERY_EXPIRED':\n            $modalInstance.dismiss()\n            error.handled = true\n            break\n        }\n      })\n    }\n  })\n\n  .controller('ContactsModalController', function ($scope, $rootScope, $timeout, $modal, $modalInstance, MtpApiManager, AppPeersManager, AppUsersManager, ErrorService) {\n    $scope.contacts = []\n    $scope.foundPeers = []\n    $scope.search = {}\n    $scope.slice = {limit: 20, limitDelta: 20}\n\n    var jump = 0\n    var i\n\n    resetSelected()\n    $scope.disabledContacts = {}\n\n    if ($scope.disabled) {\n      for (i = 0; i < $scope.disabled.length; i++) {\n        $scope.disabledContacts[$scope.disabled[i]] = true\n      }\n    }\n\n    if ($scope.selected) {\n      for (i = 0; i < $scope.selected.length; i++) {\n        if (!$scope.selectedContacts[$scope.selected[i]]) {\n          $scope.selectedContacts[$scope.selected[i]] = true\n          $scope.selectedCount++\n        }\n      }\n    }\n\n    function resetSelected () {\n      $scope.selectedContacts = {}\n      $scope.selectedCount = 0\n    }\n\n    function updateContacts (query) {\n      var curJump = ++jump\n      var doneIDs = []\n      AppUsersManager.getContacts(query).then(function (contactsList) {\n        if (curJump != jump) return\n        $scope.contacts = []\n        $scope.slice.limit = 20\n\n        angular.forEach(contactsList, function (userID) {\n          var contact = {\n            userID: userID,\n            user: AppUsersManager.getUser(userID)\n          }\n          doneIDs.push(userID)\n          $scope.contacts.push(contact)\n        })\n        $scope.contactsEmpty = query ? false : !$scope.contacts.length\n        $scope.$broadcast('contacts_change')\n      })\n\n      if (query && query.length >= 2) {\n        $timeout(function () {\n          if (curJump != jump) return\n          MtpApiManager.invokeApi('contacts.search', {q: query, limit: 10}).then(function (result) {\n            AppUsersManager.saveApiUsers(result.users)\n            if (curJump != jump) return\n            var myPeersLen = result.my_results.length\n            var foundPeers = result.my_results.concat(result.results)\n            angular.forEach(foundPeers, function (peerFound, i) {\n              var peerID = AppPeersManager.getPeerID(peerFound)\n              if (peerID <= 0 ||\n                  doneIDs.indexOf(peerID) != -1) {\n                return\n              }\n              $scope.contacts.push({\n                userID: peerID,\n                user: AppUsersManager.getUser(peerID),\n                peerString: AppUsersManager.getUserString(peerID),\n                found: i >= myPeersLen\n              })\n            })\n          }, function (error) {\n            if (error.code == 400) {\n              error.handled = true\n            }\n          })\n        }, 500)\n      }\n    }\n\n    $scope.$watch('search.query', updateContacts)\n    $scope.$on('contacts_update', function () {\n      updateContacts(($scope.search && $scope.search.query) || '')\n    })\n\n    $scope.toggleEdit = function (enabled) {\n      $scope.action = enabled ? 'edit' : ''\n      $scope.multiSelect = enabled\n      resetSelected()\n    }\n\n    $scope.contactSelect = function (userID) {\n      if ($scope.disabledContacts[userID]) {\n        return false\n      }\n      if (!$scope.multiSelect) {\n        return $modalInstance.close(userID)\n      }\n      if ($scope.selectedContacts[userID]) {\n        delete $scope.selectedContacts[userID]\n        $scope.selectedCount--\n      } else {\n        $scope.selectedContacts[userID] = true\n        $scope.selectedCount++\n      }\n    }\n\n    $scope.submitSelected = function () {\n      if ($scope.selectedCount > 0) {\n        var selectedUserIDs = []\n        angular.forEach($scope.selectedContacts, function (t, userID) {\n          selectedUserIDs.push(userID)\n        })\n        return $modalInstance.close(selectedUserIDs)\n      }\n    }\n\n    $scope.deleteSelected = function () {\n      if ($scope.selectedCount > 0) {\n        var selectedUserIDs = []\n        angular.forEach($scope.selectedContacts, function (t, userID) {\n          selectedUserIDs.push(userID)\n        })\n        AppUsersManager.deleteContacts(selectedUserIDs).then(function () {\n          $scope.toggleEdit(false)\n        })\n      }\n    }\n\n    $scope.importContact = function () {\n      AppUsersManager.openImportContact().then(function (foundContact) {\n        if (foundContact) {\n          $rootScope.$broadcast('history_focus', {\n            peerString: AppUsersManager.getUserString(foundContact)\n          })\n        }\n      })\n    }\n  })\n\n  .controller('PeerSelectController', function ($scope, $modalInstance, $q, AppPeersManager, ErrorService) {\n    $scope.selectedPeers = {}\n    $scope.selectedPeerIDs = []\n    $scope.selectedCount = 0\n\n    if ($scope.shareLinkPromise) {\n      $scope.shareLink = {loading: true}\n      $scope.shareLinkPromise.then(function (url) {\n        $scope.shareLink = {url: url}\n      }, function () {\n        delete $scope.shareLink\n      })\n    }\n\n    $scope.dialogMultiSelect = function(peerString, event) {\n      var peerID = AppPeersManager.getPeerID(peerString)      \n      $scope.multiSelect = $scope.selectedPeers[peerID] == undefined || \n        $scope.selectedPeers[peerID] != undefined && Object.keys($scope.selectedPeers).length > 1\n      if ($scope.selectedPeers[peerID]) {\n        delete $scope.selectedPeers[peerID]\n        $scope.selectedCount--\n        var pos = $scope.selectedPeerIDs.indexOf(peerID)\n        if (pos >= 0) {\n          $scope.selectedPeerIDs.splice(pos, 1)\n        }\n      } else {\n        $scope.selectedPeers[peerID] = AppPeersManager.getPeer(peerID)\n        $scope.selectedCount++\n        $scope.selectedPeerIDs.unshift(peerID)\n      }\n      cancelEvent(event)\n    }\n\n    $scope.isSelected = function(peerString){\n      var peerID = AppPeersManager.getPeerID(peerString)\n      return $scope.selectedPeers[peerID] != undefined\n    }\n\n    $scope.dialogSelect = function (peerString) {\n      var peerID\n      if (!$scope.multiSelect) {\n        var promise\n        if ($scope.confirm_type) {\n          peerID = AppPeersManager.getPeerID(peerString)\n          var peerData = AppPeersManager.getPeer(peerID)\n          promise = ErrorService.confirm({\n            type: $scope.confirm_type,\n            peer_id: peerID,\n            peer_data: peerData\n          })\n        } else {\n          promise = $q.when()\n        }\n        promise.then(function () {\n          $modalInstance.close(peerString)\n        })\n        return\n      }\n\n      peerID = AppPeersManager.getPeerID(peerString)\n      if ($scope.selectedPeers[peerID]) {\n        delete $scope.selectedPeers[peerID]\n        $scope.selectedCount--\n        var pos = $scope.selectedPeerIDs.indexOf(peerID)\n        if (pos >= 0) {\n          $scope.selectedPeerIDs.splice(pos, 1)\n        }\n      } else {\n        $scope.selectedPeers[peerID] = AppPeersManager.getPeer(peerID)\n        $scope.selectedCount++\n        $scope.selectedPeerIDs.unshift(peerID)\n      }\n    }\n\n    $scope.submitSelected = function () {\n      if ($scope.selectedCount > 0) {\n        var selectedPeerStrings = []\n        angular.forEach($scope.selectedPeers, function (t, peerID) {\n          selectedPeerStrings.push(AppPeersManager.getPeerString(peerID))\n        })\n        return $modalInstance.close(selectedPeerStrings)\n      }\n    }\n\n    $scope.toggleSearch = function () {\n      $scope.$broadcast('dialogs_search_toggle')\n    }\n  })\n\n  .controller('ChatCreateModalController', function ($scope, $modalInstance, $rootScope, MtpApiManager, AppUsersManager, AppChatsManager, ApiUpdatesManager) {\n    $scope.group = {name: ''}\n\n    $scope.createGroup = function () {\n      if (!$scope.group.name) {\n        return\n      }\n      $scope.group.creating = true\n      var inputUsers = []\n      angular.forEach($scope.userIDs, function (userID) {\n        inputUsers.push(AppUsersManager.getUserInput(userID))\n      })\n      return MtpApiManager.invokeApi('messages.createChat', {\n        title: $scope.group.name,\n        users: inputUsers\n      }).then(function (updates) {\n        ApiUpdatesManager.processUpdateMessage(updates)\n\n        if (updates.updates && updates.updates.length) {\n          for (var i = 0, len = updates.updates.length, update; i < len; i++) {\n            update = updates.updates[i]\n            if (update._ == 'updateNewMessage') {\n              $rootScope.$broadcast('history_focus', {peerString: AppChatsManager.getChatString(update.message.to_id.chat_id)\n              })\n              break\n            }\n          }\n          $modalInstance.close()\n        }\n      })['finally'](function () {\n        delete $scope.group.creating\n      })\n    }\n  })\n\n  .controller('ChatEditModalController', function ($scope, $modalInstance, $rootScope, MtpApiManager, AppUsersManager, AppChatsManager, ApiUpdatesManager) {\n    var chat = AppChatsManager.getChat($scope.chatID)\n    $scope.group = {name: chat.title}\n\n    $scope.updateGroup = function () {\n      if (!$scope.group.name) {\n        return\n      }\n      if ($scope.group.name == chat.title) {\n        return $modalInstance.close()\n      }\n\n      $scope.group.updating = true\n\n      var apiPromise\n      if (AppChatsManager.isChannel($scope.chatID)) {\n        apiPromise = MtpApiManager.invokeApi('channels.editTitle', {\n          channel: AppChatsManager.getChannelInput($scope.chatID),\n          title: $scope.group.name\n        })\n      } else {\n        apiPromise = MtpApiManager.invokeApi('messages.editChatTitle', {\n          chat_id: AppChatsManager.getChatInput($scope.chatID),\n          title: $scope.group.name\n        })\n      }\n\n      return apiPromise.then(function (updates) {\n        ApiUpdatesManager.processUpdateMessage(updates)\n        var peerString = AppChatsManager.getChatString($scope.chatID)\n        $rootScope.$broadcast('history_focus', {peerString: peerString})\n      })['finally'](function () {\n        delete $scope.group.updating\n      })\n    }\n  })\n\n  .controller('ChannelEditModalController', function ($q, $scope, $modalInstance, $rootScope, MtpApiManager, AppUsersManager, AppChatsManager, AppProfileManager, ApiUpdatesManager) {\n    var channel = AppChatsManager.getChat($scope.chatID)\n    var initial = {title: channel.title}\n    $scope.channel = {title: channel.title}\n\n    AppProfileManager.getChannelFull($scope.chatID).then(function (channelFull) {\n      initial.about = channelFull.about\n      $scope.channel.about = channelFull.about\n    })\n\n    $scope.updateChannel = function () {\n      if (!$scope.channel.title.length) {\n        return\n      }\n      var promises = []\n      if ($scope.channel.title != initial.title) {\n        promises.push(editTitle())\n      }\n      if ($scope.channel.about != initial.about) {\n        promises.push(editAbout())\n      }\n\n      $scope.channel.updating = true\n      return $q.all(promises).then(function () {\n        var peerString = AppChatsManager.getChatString($scope.chatID)\n        $rootScope.$broadcast('history_focus', {peerString: peerString})\n      })['finally'](function () {\n        delete $scope.channel.updating\n      })\n    }\n\n    function editTitle () {\n      return MtpApiManager.invokeApi('channels.editTitle', {\n        channel: AppChatsManager.getChannelInput($scope.chatID),\n        title: $scope.channel.title\n      }).then(function (updates) {\n        ApiUpdatesManager.processUpdateMessage(updates)\n      })\n    }\n\n    function editAbout () {\n      return MtpApiManager.invokeApi('channels.editAbout', {\n        channel: AppChatsManager.getChannelInput($scope.chatID),\n        about: $scope.channel.about\n      })\n    }\n  })\n\n  .controller('ChatInviteLinkModalController', function (_, $scope, $timeout, $modalInstance, AppChatsManager, AppProfileManager, ErrorService) {\n    $scope.exportedInvite = {link: _('group_invite_link_loading_raw')}\n\n    var isChannel = AppChatsManager.isChannel($scope.chatID)\n    var isMegagroup = AppChatsManager.isMegagroup($scope.chatID)\n\n    function selectLink () {\n      $timeout(function () {\n        $scope.$broadcast('ui_invite_select')\n      }, 100)\n    }\n\n    function updateLink (force) {\n      var chat = AppChatsManager.getChat($scope.chatID)\n      if (chat.username) {\n        $scope.exportedInvite = {link: 'https://t.me/' + chat.username, short: true}\n        selectLink()\n        return\n      }\n      if (force) {\n        $scope.exportedInvite.revoking = true\n      }\n      AppProfileManager.getChatInviteLink($scope.chatID, force).then(function (link) {\n        $scope.exportedInvite = {link: link, canRevoke: true}\n        selectLink()\n      })['finally'](function () {\n        delete $scope.exportedInvite.revoking\n      })\n    }\n\n    $scope.revokeLink = function () {\n      ErrorService.confirm({\n        type: isChannel && !isMegagroup ? 'REVOKE_CHANNEL_INVITE_LINK' : 'REVOKE_GROUP_INVITE_LINK'\n      }).then(function () {\n        updateLink(true)\n      })\n    }\n\n    updateLink()\n  })\n\n  .controller('ImportContactModalController', function ($scope, $modalInstance, $rootScope, AppUsersManager, ErrorService, PhonebookContactsService) {\n    if ($scope.importContact === undefined) {\n      $scope.importContact = {}\n    }\n\n    $scope.phonebookAvailable = PhonebookContactsService.isAvailable()\n\n    $scope.doImport = function () {\n      if ($scope.importContact && $scope.importContact.phone) {\n        $scope.progress = {enabled: true}\n        AppUsersManager.importContact(\n          $scope.importContact.phone,\n          $scope.importContact.first_name || '',\n          $scope.importContact.last_name || ''\n        ).then(function (foundUserID) {\n          if (!foundUserID) {\n            ErrorService.show({\n              error: {code: 404, type: 'USER_NOT_USING_TELEGRAM'}\n            })\n          }\n          $modalInstance.close(foundUserID)\n        })['finally'](function () {\n          delete $scope.progress.enabled\n        })\n      }\n    }\n\n    $scope.importPhonebook = function () {\n      PhonebookContactsService.openPhonebookImport().result.then(function (foundContacts) {\n        if (foundContacts) {\n          $modalInstance.close(foundContacts[0])\n        } else {\n          $modalInstance.dismiss()\n        }\n      })\n    }\n  })\n\n  .controller('CountrySelectModalController', function ($scope, $modalInstance, $rootScope, _) {\n    $scope.search = {}\n    $scope.slice = {limit: 20, limitDelta: 20}\n\n    var searchIndex = SearchIndexManager.createIndex()\n\n    for (var i = 0; i < Config.CountryCodes.length; i++) {\n      var searchString = Config.CountryCodes[i][0]\n      searchString += ' ' + _(Config.CountryCodes[i][1] + '_raw')\n      searchString += ' ' + Config.CountryCodes[i].slice(2).join(' ')\n      SearchIndexManager.indexObject(i, searchString, searchIndex)\n    }\n\n    $scope.$watch('search.query', function (newValue) {\n      var filtered = false\n      var results = {}\n\n      if (angular.isString(newValue) && newValue.length) {\n        filtered = true\n        results = SearchIndexManager.search(newValue, searchIndex)\n      }\n\n      $scope.countries = []\n      $scope.slice.limit = 20\n\n      var j\n      for (var i = 0; i < Config.CountryCodes.length; i++) {\n        if (!filtered || results[i]) {\n          for (j = 2; j < Config.CountryCodes[i].length; j++) {\n            $scope.countries.push({name: _(Config.CountryCodes[i][1] + '_raw'), code: Config.CountryCodes[i][j]})\n          }\n        }\n      }\n      if (String.prototype.localeCompare) {\n        $scope.countries.sort(function (a, b) {\n          return a.name.localeCompare(b.name)\n        })\n      }\n    })\n  })\n\n  .controller('PhonebookModalController', function ($scope, $modalInstance, $rootScope, AppUsersManager, PhonebookContactsService, ErrorService) {\n    $scope.search = {}\n    $scope.phonebook = []\n    $scope.selectedContacts = {}\n    $scope.selectedCount = 0\n    $scope.slice = {limit: 20, limitDelta: 20}\n    $scope.progress = {enabled: false}\n    $scope.multiSelect = true\n\n    var searchIndex = SearchIndexManager.createIndex()\n    var phonebookReady = false\n\n    PhonebookContactsService.getPhonebookContacts().then(function (phonebook) {\n      for (var i = 0; i < phonebook.length; i++) {\n        SearchIndexManager.indexObject(i, phonebook[i].first_name + ' ' + phonebook[i].last_name + ' ' + phonebook[i].phones.join(' '), searchIndex)\n      }\n      $scope.phonebook = phonebook\n      $scope.toggleSelection(true)\n      phonebookReady = true\n      updateList()\n    }, function (error) {\n      ErrorService.show({\n        error: {code: 403, type: 'PHONEBOOK_GET_CONTACTS_FAILED', originalError: error}\n      })\n    })\n\n    function updateList () {\n      var filtered = false\n      var results = {}\n\n      if (angular.isString($scope.search.query) && $scope.search.query.length) {\n        filtered = true\n        results = SearchIndexManager.search($scope.search.query, searchIndex)\n\n        $scope.contacts = []\n        delete $scope.contactsEmpty\n        for (var i = 0; i < $scope.phonebook.length; i++) {\n          if (!filtered || results[i]) {\n            $scope.contacts.push($scope.phonebook[i])\n          }\n        }\n      } else {\n        $scope.contacts = $scope.phonebook\n        $scope.contactsEmpty = !$scope.contacts.length\n      }\n\n      $scope.slice.limit = 20\n    }\n\n    $scope.$watch('search.query', function (newValue) {\n      if (phonebookReady) {\n        updateList()\n      }\n    })\n\n    $scope.contactSelect = function (i) {\n      if (!$scope.multiSelect) {\n        return $modalInstance.close($scope.phonebook[i])\n      }\n      if ($scope.selectedContacts[i]) {\n        delete $scope.selectedContacts[i]\n        $scope.selectedCount--\n      } else {\n        $scope.selectedContacts[i] = true\n        $scope.selectedCount++\n      }\n    }\n\n    $scope.toggleSelection = function (fill) {\n      if (!$scope.selectedCount || fill) {\n        $scope.selectedCount = $scope.phonebook.length\n        for (var i = 0; i < $scope.phonebook.length; i++) {\n          $scope.selectedContacts[i] = true\n        }\n      } else {\n        $scope.selectedCount = 0\n        $scope.selectedContacts = {}\n      }\n    }\n\n    $scope.submitSelected = function () {\n      if ($scope.selectedCount <= 0) {\n        $modalInstance.dismiss()\n      }\n\n      var selectedContacts = []\n      angular.forEach($scope.selectedContacts, function (t, i) {\n        selectedContacts.push($scope.phonebook[i])\n      })\n\n      ErrorService.confirm({\n        type: 'CONTACTS_IMPORT_PERFORM'\n      }).then(function () {\n        $scope.progress.enabled = true\n        AppUsersManager.importContacts(selectedContacts).then(function (foundContacts) {\n          if (!foundContacts.length) {\n            ErrorService.show({\n              error: {code: 404, type: 'USERS_NOT_USING_TELEGRAM'}\n            })\n          }\n          $modalInstance.close(foundContacts)\n        })['finally'](function () {\n          $scope.progress.enabled = false\n        })\n      })\n    }\n  })\n\n  .controller('StickersetModalController', function ($scope, $rootScope, $modalInstance, MtpApiManager, RichTextProcessor, AppStickersManager, AppDocsManager, AppMessagesManager, LocationParamsService) {\n    $scope.slice = {limit: 20, limitDelta: 20}\n\n    var fullSet\n\n    AppStickersManager.getStickerset($scope.inputStickerset).then(function (result) {\n      $scope.$broadcast('ui_height')\n      $scope.stickersetLoaded = true\n      fullSet = result\n      $scope.stickerset = result.set\n      $scope.stickersetInstalled = result.set.pFlags.installed == true\n      $scope.documents = result.documents\n\n      $scope.stickerEmojis = {}\n      $scope.stickerDimensions = {}\n      angular.forEach($scope.documents, function (doc) {\n        $scope.stickerEmojis[doc.id] = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {\n          noLinks: true,\n          noLinebreaks: true,\n          emojiIconSize: 26\n        })\n        var dim = calcImageInBox(doc.w, doc.h, 192, 192)\n        $scope.stickerDimensions[doc.id] = {width: dim.w, height: dim.h}\n      })\n    })\n\n    $scope.toggleInstalled = function (installed) {\n      AppStickersManager.installStickerset(fullSet, !installed).then(function () {\n        $scope.stickersetInstalled = installed\n      })\n    }\n\n    $scope.chooseSticker = function (docID) {\n      var doc = AppDocsManager.getDoc(docID)\n      if (!doc.id || !doc.access_hash || !$rootScope.selectedPeerID) {\n        return\n      }\n      var inputMedia = {\n        _: 'inputMediaDocument',\n        id: {\n          _: 'inputDocument',\n          id: doc.id,\n          access_hash: doc.access_hash\n        }\n      }\n      AppMessagesManager.sendOther($rootScope.selectedPeerID, inputMedia)\n      $modalInstance.close(doc.id)\n    }\n\n    $scope.share = function () {\n      LocationParamsService.shareUrl('https://t.me/addstickers/' + $scope.stickerset.short_name, $scope.stickerset.title)\n    }\n  })\n"
  },
  {
    "path": "app/js/directives.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n/* global Config, templateUrl, onContentLoaded, cancelEvent, dT, setZeroTimeout calcImageInBox, getSelectedText,Scroller, setFieldSelection, scrollToNode, EmojiTooltip, EmojiPanel, MessageComposer, checkDragEvent, checkClick, Image, Clipboard, EmojiHelper, encodeEntities, FB, twttr, gapi, isInDOM, hasOnclick */\n\n/* Directives */\n\nangular.module('myApp.directives', ['myApp.filters'])\n\n  .constant('shouldFocusOnInteraction', !Config.Navigator.mobile)\n\n  .directive('myHead', function () {\n    return {\n      restrict: 'AE',\n      templateUrl: templateUrl('head')\n    }\n  })\n\n  .directive('myLangFooter', function () {\n    return {\n      restrict: 'AE',\n      templateUrl: templateUrl('lang_footer')\n    }\n  })\n\n  .directive('myFooter', function () {\n    return {\n      restrict: 'AE',\n      templateUrl: templateUrl('footer')\n    }\n  })\n\n  .directive('myDialog', function () {\n    return {\n      restrict: 'AE',\n      templateUrl: templateUrl('dialog')\n    }\n  })\n\n  .directive('myMessage', function ($filter, _) {\n    var dateFilter = $filter('myDate')\n    var dateSplitHtml = '<div class=\"im_message_date_split im_service_message_wrap\"><div class=\"im_service_message\"><span class=\"copyonly\"><br/>---&nbsp;</span><span class=\"im_message_date_split_text\"></span><span class=\"copyonly\">&nbsp;---</span></div></div>'\n    var unreadSplitHtml = '<div class=\"im_message_unread_split\">' + _('unread_messages_split') + '</div>'\n    var selectedClass = 'im_message_selected'\n    var focusClass = 'im_message_focus'\n    var unreadClass = 'im_message_unread'\n    var errorClass = 'im_message_error'\n    var pendingClass = 'im_message_pending'\n\n    return {\n      templateUrl: templateUrl('message'),\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var selected = false\n      var grouped = false\n      var focused = false\n      var error = false\n      var pending = false\n      var needDate = false\n      var unreadAfter = false\n      var applySelected = function () {\n        if (selected != ($scope.selectedMsgs[$scope.historyMessage.mid] || false)) {\n          selected = !selected\n          element.toggleClass(selectedClass, selected)\n        }\n      }\n      var needDateSplit, unreadAfterSplit\n      var applyGrouped = function () {\n        if (grouped != $scope.historyMessage.grouped) {\n          if (grouped) {\n            element.removeClass(grouped)\n          }\n          grouped = $scope.historyMessage.grouped\n          if (grouped) {\n            element.addClass(grouped)\n          }\n        }\n        if (needDate != ($scope.historyMessage.needDate || false)) {\n          needDate = !needDate\n          if (needDate) {\n            if (needDateSplit) {\n              needDateSplit.show()\n            } else {\n              needDateSplit = $(dateSplitHtml)\n              $('.im_message_date_split_text', needDateSplit).text(dateFilter($scope.historyMessage.date))\n              if (unreadAfterSplit) {\n                needDateSplit.insertBefore(unreadAfterSplit)\n              } else {\n                needDateSplit.prependTo(element)\n              }\n            }\n          } else {\n            needDateSplit.hide()\n          }\n        }\n      }\n\n      applySelected()\n      applyGrouped()\n\n      $scope.$on('messages_select', applySelected)\n      $scope.$on('messages_regroup', applyGrouped)\n\n      $scope.$on('messages_focus', function (e, focusedMsgID) {\n        if ((focusedMsgID == $scope.historyMessage.mid) != focused) {\n          focused = !focused\n          element.toggleClass(focusClass, focused)\n        }\n      })\n\n      var deregisterUnreadAfter\n      if (!$scope.historyMessage.pFlags.out &&\n        ($scope.historyMessage.pFlags.unread || $scope.historyMessage.unreadAfter)) {\n        var applyUnreadAfter = function () {\n          if ($scope.peerHistory.peerID != $scope.historyPeer.id) {\n            return\n          }\n          if (unreadAfter != ($scope.historyUnreadAfter == $scope.historyMessage.mid)) {\n            unreadAfter = !unreadAfter\n            if (unreadAfter) {\n              if (unreadAfterSplit) {\n                unreadAfterSplit.show()\n              } else {\n                unreadAfterSplit = $(unreadSplitHtml).prependTo(element)\n              }\n            } else {\n              unreadAfterSplit.hide()\n              if (deregisterUnreadAfter) {\n                deregisterUnreadAfter()\n              }\n            }\n          }\n        }\n        applyUnreadAfter()\n        deregisterUnreadAfter = $scope.$on('messages_unread_after', applyUnreadAfter)\n      }\n      if ($scope.historyMessage.pFlags.unread && $scope.historyMessage.pFlags.out) {\n        element.addClass(unreadClass)\n        var deregisterUnread = $scope.$on('messages_read', function () {\n          if (!$scope.historyMessage.pFlags.unread) {\n            element.removeClass(unreadClass)\n            deregisterUnread()\n            if (deregisterUnreadAfter && !unreadAfter) {\n              deregisterUnreadAfter()\n            }\n          }\n        })\n      }\n      if ($scope.historyMessage.error || $scope.historyMessage.pending) {\n        var applyPending = function () {\n          if (pending != ($scope.historyMessage.pending || false)) {\n            pending = !pending\n            element.toggleClass(pendingClass, pending)\n          }\n          if (error != ($scope.historyMessage.error || false)) {\n            error = !error\n            element.toggleClass(errorClass, error)\n          }\n          if (!error && !pending) {\n            deregisterPending()\n          }\n        }\n        var deregisterPending = $scope.$on('messages_pending', applyPending)\n\n        applyPending()\n      }\n    }\n  })\n\n  .directive('myMessageBody', function ($compile, AppPeersManager, AppChatsManager, AppUsersManager, AppMessagesManager, AppInlineBotsManager, RichTextProcessor) {\n    var messageMediaCompiled = $compile('<div class=\"im_message_media\" my-message-media=\"media\" message-id=\"messageId\"></div>')\n    var messageKeyboardCompiled = $compile('<div class=\"im_message_keyboard\" my-inline-reply-markup=\"markup\"></div>')\n    var messageSignCompiled = $compile('<div class=\"im_message_sign\"><span class=\"im_message_sign_link\" my-peer-link=\"signID\"></span></div>')\n\n    return {\n      link: link,\n      scope: {\n        message: '=myMessageBody'\n      }\n    }\n\n    function updateMessageText ($scope, element, message) {\n      if ((message.media && message.media.handleMessage) ||\n          typeof message.message !== 'string' ||\n        !message.message.length) {\n        $('.im_message_text', element).hide()\n        return\n      }\n      var html = AppMessagesManager.wrapMessageText(message.mid)\n      $('.im_message_text', element).html(html.valueOf())\n    }\n\n    function updateMessageMedia ($scope, element, message) {\n      if (!message.media) {\n        $('.im_message_media', element).hide()\n        return\n      }\n\n      var scope = $scope.$new(true)\n      scope.media = message.media\n      scope.messageId = message.mid\n      messageMediaCompiled(scope, function (clonedElement) {\n        $('.im_message_media', element).replaceWith(clonedElement)\n      })\n    }\n\n    function updateMessageSignature ($scope, element, message) {\n      var postAuthor = message.post_author || (message.fwd_from && message.fwd_from.post_author)\n      if (!postAuthor) {\n        $('.im_message_sign', element).hide()\n        return\n      }\n\n      var html = RichTextProcessor.wrapRichText(postAuthor, {noLinks: true, noLinebreaks: true})\n      $('.im_message_sign', element).html('<span class=\"im_message_sign_link\">' + html.valueOf() + '</span>')\n    }\n\n    function updateMessageKeyboard ($scope, element, message) {\n      if (!message.reply_markup ||\n        message.reply_markup._ != 'replyInlineMarkup') {\n        $('.im_message_keyboard', element).hide()\n        return\n      }\n\n      var scope = $scope.$new(true)\n      scope.markup = AppMessagesManager.wrapReplyMarkup(message.reply_markup, message.fromID)\n      scope.messageId = message.mid\n      messageKeyboardCompiled(scope, function (clonedElement) {\n        $('.im_message_keyboard', element).replaceWith(clonedElement)\n      })\n\n      scope.$on('reply_inline_button_press', function (e, button) {\n        switch (button._) {\n          case 'keyboardButtonSwitchInline':\n            AppInlineBotsManager.switchInlineButtonClick(message.mid, button)\n            break\n          case 'keyboardButtonCallback':\n            AppInlineBotsManager.callbackButtonClick(message.mid, button)\n            break\n          case 'keyboardButtonGame':\n            AppInlineBotsManager.gameButtonClick(message.mid)\n            break\n        }\n      })\n    }\n\n    function updateMessageBody ($scope, element, message) {\n      updateMessageText($scope, element, message)\n      updateMessageMedia($scope, element, message)\n      updateMessageSignature($scope, element, message)\n      updateMessageKeyboard($scope, element, message)\n    }\n\n    function link ($scope, element, attrs) {\n      var message = $scope.message\n      message.dir = true\n      var msgID = message.mid\n\n      updateMessageBody($scope, element, message)\n\n      if (message.pending) {\n        var unlink = $scope.$on('messages_pending', function () {\n          if (message.mid != msgID) {\n            updateMessageBody($scope, element, message)\n            unlink()\n          }\n        })\n      }\n\n      $scope.$on('message_edit', function (e, data) {\n        if (data.mid == message.mid) {\n          if (data.justMedia) {\n            updateMessageMedia($scope, element, message)\n          } else {\n            updateMessageBody($scope, element, message)\n          }\n        }\n      })\n    }\n  })\n\n  .directive('myMessageViews', function ($filter, AppMessagesManager) {\n    var formatNumberFilter = $filter('formatShortNumber')\n\n    return {\n      link: link\n    }\n\n    function updateHtml (views, element) {\n      element.html(formatNumberFilter(views))\n    }\n\n    function link ($scope, element, attrs) {\n      var mid = $scope.$eval(attrs.myMessageViews)\n      // console.log(element[0], mid)\n      var views = AppMessagesManager.getMessage(mid).views || 0\n\n      updateHtml(views, element)\n\n      $scope.$on('message_views', function (e, viewData) {\n        if (viewData.mid == mid) {\n          updateHtml(viewData.views, element)\n        }\n      })\n    }\n  })\n\n  .directive('myReplyMarkup', function () {\n    return {\n      templateUrl: templateUrl('reply_markup'),\n      scope: {\n        'replyMarkup': '=myReplyMarkup'\n      },\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var scrollable = $('.reply_markup', element)\n      var scroller = new Scroller(scrollable, {\n        classPrefix: 'reply_markup',\n        maxHeight: 170\n      })\n      $scope.buttonClick = function (button) {\n        $scope.$emit('reply_button_press', button)\n      }\n\n      $scope.$on('ui_keyboard_update', function (e, data) {\n        onContentLoaded(function () {\n          scroller.updateHeight()\n          scroller.scrollTo(0)\n          $scope.$emit('ui_panel_update', {blur: data && data.enabled})\n        })\n      })\n      onContentLoaded(function () {\n        scroller.updateHeight()\n        $scope.$emit('ui_panel_update')\n      })\n    }\n  })\n\n  .directive('myMessageMedia', function () {\n    return {\n      scope: {\n        'media': '=myMessageMedia',\n        'messageId': '=messageId'\n      },\n      templateUrl: templateUrl('message_media')\n    }\n  })\n  .directive('myMessagePhoto', function (AppPhotosManager) {\n    return {\n      scope: {\n        'media': '=myMessagePhoto',\n        'messageId': '=messageId'\n      },\n      templateUrl: templateUrl('message_attach_photo'),\n      link: function ($scope, element, attrs) {\n        $scope.openPhoto = AppPhotosManager.openPhoto\n        $scope.preloadPhoto = AppPhotosManager.preloadPhoto\n      }\n    }\n  })\n  .directive('myMessageDocument', function (AppDocsManager) {\n    return {\n      scope: {\n        'media': '=myMessageDocument',\n        'messageId': '=messageId'\n      },\n      templateUrl: templateUrl('message_attach_document'),\n      link: function ($scope, element, attrs) {\n        AppDocsManager.updateDocDownloaded($scope.media.document.id)\n        $scope.docSave = function () {\n          AppDocsManager.saveDocFile($scope.media.document.id)\n        }\n        $scope.docOpen = function () {\n          if (!$scope.media.document.withPreview) {\n            return $scope.docSave()\n          }\n          AppDocsManager.openDoc($scope.media.document.id, $scope.messageId)\n        }\n        $scope.videoOpen = function () {\n          AppDocsManager.openVideo($scope.media.document.id, $scope.messageId)\n        }\n        if ($scope.media.document.file_name) {\n          var fileNameParts = $scope.media.document.file_name.split('.')\n          if (fileNameParts.length > 1) {\n            $scope.media_file_ext = '.' + fileNameParts.pop()\n            $scope.media_file_name_without_ext = fileNameParts.join('.')\n            if (!$scope.media_file_name_without_ext) {\n              $scope.media_file_name_without_ext = $scope.media_file_ext\n              $scope.media_file_ext = ''\n            }\n          } else {\n            $scope.media_file_ext = ''\n            $scope.media_file_name_without_ext = fileNameParts[0]\n          }\n        }\n      }\n    }\n  })\n  .directive('myMessageGeo', function () {\n    return {\n      scope: {\n        'media': '=myMessageGeo'\n      },\n      templateUrl: templateUrl('message_attach_geo')\n    }\n  })\n  .directive('myMessageVenue', function () {\n    return {\n      scope: {\n        'media': '=myMessageVenue'\n      },\n      templateUrl: templateUrl('message_attach_venue')\n    }\n  })\n  .directive('myMessageContact', function () {\n    return {\n      scope: {\n        'media': '=myMessageContact'\n      },\n      templateUrl: templateUrl('message_attach_contact')\n    }\n  })\n  .directive('myMessageWebpage', function (AppWebPagesManager, AppPhotosManager) {\n    return {\n      scope: {\n        'media': '=myMessageWebpage',\n        'messageId': '=messageId'\n      },\n      templateUrl: templateUrl('message_attach_webpage'),\n      link: function ($scope) {\n        $scope.openPhoto = AppPhotosManager.openPhoto\n        $scope.openEmbed = function ($event) {\n          if ($scope.media.webpage &&\n            $scope.media.webpage.embed_url) {\n            AppWebPagesManager.openEmbed($scope.media.webpage.id, $scope.messageId)\n            return cancelEvent($event)\n          }\n        }\n\n        $scope.$on('webpage_updated', function (e, eventData) {\n          if ($scope.media.webpage &&\n            $scope.media.webpage.id == eventData.id) {\n            $scope.$emit('ui_height')\n          }\n        })\n      }\n    }\n  })\n  .directive('myMessageGame', function (AppInlineBotsManager, AppMessagesManager) {\n    return {\n      scope: {\n        'media': '=myMessageGame',\n        'messageId': '=messageId'\n      },\n      templateUrl: templateUrl('message_attach_game'),\n      link: function ($scope, element) {\n        $scope.openGame = function () {\n          AppInlineBotsManager.gameButtonClick($scope.messageId)\n        }\n\n        function updateMessageText (argument) {\n          var message = AppMessagesManager.getMessage($scope.messageId)\n          if (message.message) {\n            var html = AppMessagesManager.wrapMessageText($scope.messageId)\n            $('.im_message_game_message', element).html(html.valueOf()).show()\n            $('.im_message_game_description', element).hide()\n          } else {\n            $('.im_message_game_message', element).html('').hide()\n            $('.im_message_game_description', element).show()\n          }\n        }\n\n        $scope.$on('message_edit', function (e, data) {\n          if (data.mid == $scope.messageId) {\n            updateMessageText()\n          }\n        })\n\n        updateMessageText()\n      }\n    }\n  })\n  .directive('myMessagePending', function () {\n    return {\n      scope: {\n        'media': '=myMessagePending'\n      },\n      templateUrl: templateUrl('message_attach_pending'),\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      if ($scope.media.file_name) {\n        var fileNameParts = $scope.media.file_name.split('.')\n        if (fileNameParts.length > 1) {\n          $scope.media_file_ext = '.' + fileNameParts.pop()\n          $scope.media_file_name_without_ext = fileNameParts.join('.')\n          if (!$scope.media_file_name_without_ext) {\n            $scope.media_file_name_without_ext = $scope.media_file_ext\n            $scope.media_file_ext = ''\n          }\n        } else {\n          $scope.media_file_ext = ''\n          $scope.media_file_name_without_ext = fileNameParts[0]\n        }\n      }\n    }\n  })\n\n  .directive('myInlineReplyMarkup', function () {\n    return {\n      templateUrl: templateUrl('reply_markup'),\n      scope: {\n        'replyMarkup': '=myInlineReplyMarkup'\n      },\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      $scope.buttonClick = function (button) {\n        $scope.$emit('reply_inline_button_press', button)\n      }\n    }\n  })\n\n  .directive('myServiceMessage', function (ErrorService, AppMessagesManager) {\n    return {\n      templateUrl: templateUrl('message_service'),\n      scope: {\n        'historyMessage': '=myServiceMessage'\n      },\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      $scope.phoneCallClick = function (messageID) {\n        var message = AppMessagesManager.getMessage(messageID)\n        var userID = AppMessagesManager.getMessagePeer(message)\n        ErrorService.show({\n          error: {\n            type: 'PHONECALLS_NOT_SUPPORTED',\n            userID: userID\n          }\n        })\n      }\n    }\n  })\n\n  .directive('myShortMessage', function () {\n    return {\n      scope: {\n        message: '=myShortMessage'\n      },\n      templateUrl: templateUrl('short_message')\n    }\n  })\n\n  .directive('myReplyMessage', function (AppMessagesManager, AppPeersManager, $rootScope) {\n    return {\n      templateUrl: templateUrl('reply_message'),\n      scope: {},\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      if (attrs.watch) {\n        $scope.$parent.$watch(attrs.myReplyMessage, function (mid) {\n          var isEdit = $scope.$parent.$eval(attrs.edit)\n          checkMessage($scope, element, mid, isEdit)\n        })\n      } else {\n        var mid = $scope.$parent.$eval(attrs.myReplyMessage)\n        var isEdit = $scope.$parent.$eval(attrs.edit)\n        checkMessage($scope, element, mid, isEdit)\n      }\n    }\n\n    function checkMessage ($scope, element, mid, isEdit) {\n      var message = $scope.replyMessage = AppMessagesManager.wrapSingleMessage(mid)\n      $scope.thumb = false\n      $scope.isEdit = isEdit || false\n      if (message.loading) {\n        var stopWaiting = $scope.$on('messages_downloaded', function (e, mids) {\n          if (mids.indexOf(mid) != -1) {\n            $scope.replyMessage = AppMessagesManager.wrapForDialog(mid)\n            updateMessage($scope, element)\n            stopWaiting()\n          }\n        })\n      } else {\n        updateMessage($scope, element)\n      }\n    }\n\n    function updateMessage ($scope, element) {\n      var message = $scope.replyMessage\n      if (!message || message.deleted || !message.to_id) {\n        $(element).remove()\n        return\n      }\n      $scope.thumb = AppMessagesManager.getMessageThumb(message, 42, 42)\n\n      if (element[0].tagName == 'A') {\n        element.on('click', function () {\n          var peerID = AppMessagesManager.getMessagePeer(message)\n          var peerString = AppPeersManager.getPeerString(peerID)\n\n          $rootScope.$broadcast('history_focus', {peerString: peerString, messageID: message.mid})\n        })\n      }\n\n      onContentLoaded(function () {\n        $scope.$emit('ui_height')\n      })\n    }\n  })\n\n  .directive('myPinnedMessage', function (AppMessagesManager, AppPeersManager, $rootScope) {\n    return {\n      templateUrl: templateUrl('pinned_message'),\n      scope: {},\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var mid = $scope.$parent.$eval(attrs.myPinnedMessage)\n      var message = $scope.pinnedMessage = AppMessagesManager.wrapSingleMessage(mid)\n      if (message.loading) {\n        var stopWaiting = $scope.$on('messages_downloaded', function (e, mids) {\n          if (mids.indexOf(mid) != -1) {\n            $scope.pinnedMessage = AppMessagesManager.wrapForDialog(mid)\n            updateMessage($scope, element)\n            stopWaiting()\n          }\n        })\n      } else {\n        updateMessage($scope, element)\n      }\n    }\n\n    function updateMessage ($scope, element) {\n      var message = $scope.pinnedMessage\n      if (!message || message.deleted || !message.to_id) {\n        $(element).remove()\n        return\n      }\n\n      if (element[0].tagName == 'A') {\n        element.on('click', function () {\n          var peerID = AppMessagesManager.getMessagePeer(message)\n          var peerString = AppPeersManager.getPeerString(peerID)\n\n          $rootScope.$broadcast('history_focus', {peerString: peerString, messageID: message.mid})\n        })\n      }\n\n      onContentLoaded(function () {\n        $scope.$emit('ui_height')\n      })\n    }\n  })\n\n  .directive('myPeerPinnedMessageBar', function (AppMessagesManager, AppPeersManager, AppProfileManager) {\n\n    return {\n      templateUrl: templateUrl('peer_pinned_message_bar'),\n      scope: {},\n      link: link\n    }\n\n    function updatePeerID(peerID, $scope, force) {\n      if (force) {\n        $scope.pinnedMessageID = 0\n        $scope.$emit('ui_height')\n      }\n      var jump = ++$scope.jump\n      if (!AppPeersManager.isChannel(peerID)) {\n        return\n      }\n      var channelID = -peerID\n      AppProfileManager.getChannelPinnedMessage(channelID).then(function (pinnedMessageID) {\n        if (jump != $scope.jump) {\n          return\n        }\n        $scope.pinnedMessageID = pinnedMessageID || 0\n        $scope.$emit('ui_height')\n      })\n    }\n\n    function link ($scope, element, attrs) {\n      $scope.jump = 0\n\n      $scope.$parent.$watch(attrs.myPeerPinnedMessageBar, function (peerID) {\n        $scope.peerID = peerID\n        updatePeerID(peerID, $scope, true)\n      })\n\n      $scope.$on('peer_pinned_message', function (e, updPeerID) {\n        if (updPeerID == $scope.peerID) {\n          updatePeerID($scope.peerID, $scope)\n        }\n      })\n      $scope.$on('chat_full_update', function (e, updChatID) {\n        if (updChatID == -$scope.peerID) {\n          updatePeerID($scope.peerID, $scope)\n        }\n      })\n\n      $scope.hidePinned = function () {\n        AppProfileManager.hideChannelPinnedMessage(-$scope.peerID, $scope.pinnedMessageID)\n        $scope.pinnedMessageID = 0\n        $scope.$emit('ui_height')\n      }\n    }\n  })\n\n  .directive('myForwardedMessages', function (AppPhotosManager, AppMessagesManager, AppPeersManager, $rootScope) {\n    return {\n      templateUrl: templateUrl('forwarded_messages'),\n      scope: {\n        'forwardMessages': '=myForwardedMessages'\n      },\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      if (attrs.watch) {\n        $scope.$watch('forwardMessages', function () {\n          updateMessages($scope, element)\n        })\n      } else {\n        updateMessages($scope, element)\n      }\n    }\n\n    function updateMessages ($scope, element) {\n      var mids = $scope.forwardMessages\n      var length = mids.length\n      var fromID = false\n      var single = length == 1\n      $scope.thumb = false\n      $scope.singleMessage = false\n      angular.forEach(mids, function (mid) {\n        var message = AppMessagesManager.getMessage(mid)\n        if (fromID === false) {\n          fromID = message.fromID\n        } else {\n          if (fromID !== message.fromID) {\n            fromID = AppMessagesManager.getMessagePeer(message)\n          }\n        }\n        if (single) {\n          $scope.thumb = AppMessagesManager.getMessageThumb(message, 42, 42)\n          $scope.singleMessage = AppMessagesManager.wrapForDialog(mid)\n        }\n      })\n      $scope.fromID = fromID\n      $scope.count = length\n\n      onContentLoaded(function () {\n        $scope.$emit('ui_height')\n      })\n    }\n  })\n\n  .directive('myMessageEdited', function (_, $timeout, AppMessagesManager) {\n    var editedLabel = _('message_edited')\n\n    return {\n      scope: {},\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var messageID = $scope.$parent.$eval(attrs.myMessageEdited)\n      if (checkEdited($scope, element, messageID)) {\n        $scope.$on('message_edit', function (e, data) {\n          var messageID = $scope.$parent.$eval(attrs.myMessageEdited)\n          if (data.mid == messageID) {\n            checkEdited($scope, element, messageID)\n          }\n        })\n      }\n    }\n\n    function checkEdited ($scope, element, messageID) {\n      var message = AppMessagesManager.getMessage(messageID)\n      if (!message.canBeEdited) {\n        $timeout(function () {\n          $scope.$destroy()\n          element.remove()\n        })\n        return false\n      }\n      if (message.edit_date) {\n        element.html(editedLabel).show()\n        $timeout(function () {\n          $scope.$destroy()\n        })\n        return false\n      }\n      return true\n    }\n  })\n\n  .directive('myMessageAdminBadge', function (_, AppPeersManager, AppMessagesManager, AppProfileManager) {\n\n    var adminBadgeText = _('message_admin_badge_raw')\n\n    return {\n      scope: {},\n      link: link\n    }\n\n    function link($scope, element, attrs) {\n      var message = $scope.$parent.$eval(attrs.myMessageAdminBadge)\n      var fromID = message && message.fromID\n      var peerID = message && AppMessagesManager.getMessagePeer(message)\n      if (!fromID || !AppPeersManager.isMegagroup(peerID)) {\n        element.hide()\n        return\n      }\n\n      var channelID = -peerID\n\n      AppProfileManager.getChannelParticipants(channelID, {_: 'channelParticipantsAdmins'}).then(function (participants) {\n        var isAdmin = false\n        for (var i = 0, len = participants.length; i < len; i++) {\n          if (participants[i].user_id == fromID) {\n            isAdmin = true\n            break\n          }\n        }\n        if (isAdmin) {\n          element.text(adminBadgeText).show()\n        } else {\n          element.hide()\n        }\n      }, function () {\n        element.hide()\n      })\n    }\n  })\n\n  .directive('myDialogs', function ($modalStack, $transition, $window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var dialogsWrap = $('.im_dialogs_wrap', element)[0]\n      var scrollableWrap = $('.im_dialogs_scrollable_wrap', element)[0]\n      var searchField = $('.im_dialogs_search_field', element)[0]\n      var panelWrap = $('.im_dialogs_panel', element)[0]\n      var searchClear = $('.im_dialogs_search_clear', element)[0]\n      var searchFocused = false\n\n      $(searchField).on('focus blur', function (e) {\n        searchFocused = e.type == 'focus'\n\n        if (!searchFocused) {\n          $(scrollableWrap).find('.im_dialog_selected').removeClass('im_dialog_selected')\n          if (!searchField.value) {\n            $scope.$emit('ui_dialogs_search_clear')\n          }\n        }\n      })\n\n      $scope.$on('dialogs_search_toggle', function () {\n        $(panelWrap).addClass('im_dialogs_panel_search')\n        $scope.$broadcast('ui_dialogs_search')\n        $($window).scrollTop(0)\n        $timeout(function () {\n          setFieldSelection(searchField)\n        })\n      })\n\n      $scope.$on('search_clear', function () {\n        $(panelWrap).removeClass('im_dialogs_panel_search')\n        $scope.$broadcast('ui_dialogs_search')\n      })\n\n      $(document).on('keydown', onKeyDown)\n\n      $scope.$on('$destroy', function () {\n        $(document).off('keydown', onKeyDown)\n      })\n\n      $scope.$on('ui_dialogs_change', function () {\n        onContentLoaded(function () {\n          var selectedDialog = $(scrollableWrap).find('.active a.im_dialog')[0]\n          if (selectedDialog) {\n            scrollToNode(scrollableWrap, selectedDialog.parentNode, dialogsWrap)\n          }\n        })\n      })\n\n      function onKeyDown (e) {\n        if (!searchFocused && $modalStack.getTop()) {\n          return true\n        }\n\n        var currentSelected, nextDialogWrap, dialogWraps\n        if (e.keyCode == 36 && !e.shiftKey && !e.ctrlKey && e.altKey) { // Alt + Home\n          currentSelected = $(scrollableWrap).find('.im_dialog_wrap a')\n          if (currentSelected.length) {\n            $(currentSelected[0]).trigger('mousedown')\n            scrollableWrap.scrollTop = 0\n            $(dialogsWrap).nanoScroller({flash: true})\n          }\n          return cancelEvent(e)\n        }\n\n        if (e.keyCode == 27 || (e.keyCode == 9 && e.shiftKey && !e.ctrlKey && !e.metaKey)) { // ESC or Shift + Tab\n          if (!searchFocused) {\n            setFieldSelection(searchField)\n            if (searchField.value) {\n              searchField.select()\n            }\n          } else if (searchField.value) {\n            $(searchClear).trigger('click')\n          } else {\n            $scope.$emit('esc_no_more')\n            // Strange Chrome bug, when field doesn't get blur, but becomes inactive after location change\n            setTimeout(function () {\n              searchField.blur()\n              setTimeout(function () {\n                searchField.focus()\n              }, 0)\n            }, 100)\n          }\n          return cancelEvent(e)\n        }\n\n        if (searchFocused && e.keyCode == 13 && !Config.Navigator.mobile) { // Enter\n          currentSelected = $(scrollableWrap).find('.im_dialog_selected')[0] || $(scrollableWrap).find('.im_dialog_wrap a')[0]\n          if (currentSelected &&\n              !$(currentSelected).hasClass('disabled')) {\n            $(currentSelected).trigger('mousedown')\n          }\n          return cancelEvent(e)\n        }\n\n        if (\n          (!Config.Navigator.osX && // No Mac users\n              e.altKey && e.shiftKey && !e.ctrlKey && !e.metaKey &&\n              e.keyCode >= 49 && e.keyCode <= 57) || // Alt + Shift + # , switch to conversation # where # is in [1..9]\n          (Config.Navigator.osX && // Mac users only\n          e.ctrlKey && e.shiftKey && !e.metaKey && !e.altKey &&\n          e.keyCode >= 49 && e.keyCode <= 57)) { // Ctrl + Shift + # , switch to conversation # where # is in [1..9]\n          var dialogNumber = e.keyCode - 49\n          dialogWraps = $(scrollableWrap).find('.im_dialog_wrap')\n          nextDialogWrap = dialogWraps[dialogNumber]\n\n          if (nextDialogWrap) {\n            $(nextDialogWrap).find('a').trigger('mousedown')\n            scrollToNode(scrollableWrap, nextDialogWrap, dialogsWrap)\n          }\n\n          return cancelEvent(e)\n        }\n\n        var next\n        var prev, skip\n        var ctrlTabSupported = Config.Modes.packed\n        if (e.keyCode == 40 || e.keyCode == 38) { // UP, DOWN\n          next = e.keyCode == 40\n          prev = !next\n          skip = !e.shiftKey && e.altKey\n        } else if (ctrlTabSupported && e.keyCode == 9 && e.ctrlKey && !e.metaKey) { // Ctrl + Tab, Shift + Ctrl + Tab\n          next = !e.shiftKey\n          prev = !next\n          skip = true\n        }\n\n        if (next || prev) {\n          if (!skip && (!searchFocused || e.metaKey)) {\n            return true\n          }\n\n          currentSelected = (!skip && $(scrollableWrap).find('.im_dialog_selected')[0]) || $(scrollableWrap).find('.active a.im_dialog')[0]\n          var currentSelectedWrap = currentSelected && currentSelected.parentNode\n\n          if (currentSelectedWrap) {\n            nextDialogWrap = currentSelected[next ? 'nextSibling' : 'previousSibling']\n\n            if (!nextDialogWrap || !nextDialogWrap.className || nextDialogWrap.className.indexOf('im_dialog_wrap') == -1) {\n              dialogWraps = $(scrollableWrap).find('.im_dialog_wrap')\n              var pos = dialogWraps.index(currentSelected.parentNode)\n              var nextPos = pos + (next ? 1 : -1)\n\n              nextDialogWrap = dialogWraps[nextPos]\n            }\n          } else {\n            dialogWraps = $(scrollableWrap).find('.im_dialog_wrap')\n            if (next) {\n              nextDialogWrap = dialogWraps[0]\n            } else {\n              nextDialogWrap = dialogWraps[dialogWraps.length - 1]\n            }\n          }\n\n          if (skip) {\n            if (nextDialogWrap) {\n              $(nextDialogWrap).find('a').trigger('mousedown')\n            }\n          } else {\n            if (currentSelectedWrap && nextDialogWrap) {\n              $(currentSelectedWrap).find('a').removeClass('im_dialog_selected')\n            }\n            if (nextDialogWrap) {\n              $(nextDialogWrap).find('a').addClass('im_dialog_selected')\n            }\n          }\n\n          if (nextDialogWrap) {\n            scrollToNode(scrollableWrap, nextDialogWrap, dialogsWrap)\n          }\n\n          return cancelEvent(e)\n        }\n      }\n    }\n  })\n\n  .directive('myDialogsList', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var dialogsWrap = $('.im_dialogs_wrap', element)[0]\n      var dialogsColWrap = $('.im_dialogs_col_wrap')[0]\n      var scrollableWrap = $('.im_dialogs_scrollable_wrap', element)[0]\n      var headWrap = $('.tg_page_head')[0]\n      var panelWrapSelector = Config.Mobile && attrs.modal\n        ? '.mobile_modal_body .im_dialogs_panel'\n        : '.im_dialogs_panel'\n      var panelWrap = $(panelWrapSelector)[0]\n      var footer = $('.footer_wrap')[0]\n      var moreNotified = false\n\n      onContentLoaded(function () {\n        $(dialogsWrap).nanoScroller({preventPageScrolling: true, tabIndex: -1, iOSNativeScrolling: true})\n      })\n\n      var updateScroller = function () {\n        onContentLoaded(function () {\n          $(dialogsWrap).nanoScroller()\n        })\n      }\n\n      $scope.$on('ui_dialogs_prepend', updateScroller)\n      $scope.$on('ui_dialogs_search', updateSizes)\n      $scope.$on('ui_dialogs_update', updateSizes)\n\n      $scope.$on('ui_dialogs_append', function () {\n        onContentLoaded(function () {\n          updateScroller()\n          moreNotified = false\n\n          $timeout(function () {\n            $(scrollableWrap).trigger('scroll')\n          })\n        })\n      })\n\n      $scope.$on('ui_dialogs_change', function () {\n        onContentLoaded(function () {\n          updateScroller()\n          moreNotified = false\n\n          $timeout(function () {\n            $(scrollableWrap).trigger('scroll')\n          })\n        })\n      })\n\n      $(scrollableWrap).on('scroll', function (e) {\n        if (!element.is(':visible')) return\n        // console.log('scroll', moreNotified)\n        if (!moreNotified && scrollableWrap.scrollTop >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) {\n          // console.log('emit need more')\n          $scope.$emit('dialogs_need_more')\n          moreNotified = true\n        }\n      })\n\n      function updateSizes () {\n        if (!panelWrap || !panelWrap.offsetHeight) {\n          panelWrap = $(panelWrapSelector)[0]\n        }\n\n        if (attrs.modal) {\n          var height = $($window).height() -\n          (panelWrap ? panelWrap.offsetHeight : 49) -\n          (Config.Mobile ? 46 : 100)\n          height = Math.min(Config.Mobile ? 350 : 450, height)\n          $(element).css({height: height})\n          updateScroller()\n          return\n        }\n\n        if (!headWrap || !headWrap.offsetHeight) {\n          headWrap = $('.tg_page_head')[0]\n        }\n        if (!footer || !footer.offsetHeight) {\n          footer = $('.footer_wrap')[0]\n        }\n\n        if (!dialogsColWrap || !dialogsColWrap.offsetHeight) {\n          dialogsColWrap = $('.im_dialogs_col_wrap')[0]\n        }\n        var footerHeight = footer ? footer.offsetHeight : 0\n        if (footerHeight) {\n          footerHeight++ // Border bottom\n        }\n        $(element).css({\n          height: $($window).height() -\n            footerHeight -\n            (headWrap ? headWrap.offsetHeight : 48) -\n            (panelWrap ? panelWrap.offsetHeight : 58) -\n            parseInt($(dialogsColWrap).css('paddingBottom') || 0)\n        })\n\n        updateScroller()\n      }\n\n      $($window).on('resize', updateSizes)\n\n      updateSizes()\n      setTimeout(updateSizes, 1000)\n    }\n  })\n\n  .directive('myContactsList', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var searchWrap = $('.contacts_modal_search')[0]\n      var panelWrap = $('.contacts_modal_panel')[0]\n      var contactsWrap = $('.contacts_wrap', element)[0]\n\n      onContentLoaded(function () {\n        $(contactsWrap).nanoScroller({preventPageScrolling: true, tabIndex: -1, iOSNativeScrolling: true})\n        updateSizes()\n      })\n\n      function updateSizes () {\n        $(element).css({\n          height: $($window).height() -\n            ((panelWrap && panelWrap.offsetHeight) || 0) -\n            ((searchWrap && searchWrap.offsetHeight) || 0) -\n            (Config.Mobile ? 64 : 200)\n        })\n        $(contactsWrap).nanoScroller()\n      }\n\n      $($window).on('resize', updateSizes)\n      $scope.$on('contacts_change', function () {\n        onContentLoaded(updateSizes)\n      })\n    }\n  })\n\n  .directive('myCountriesList', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var searchWrap = $('.countries_modal_search')[0]\n      var panelWrap = $('.countries_modal_panel')[0]\n      var countriesWrap = $('.countries_wrap', element)[0]\n\n      onContentLoaded(function () {\n        $(countriesWrap).nanoScroller({preventPageScrolling: true, tabIndex: -1, iOSNativeScrolling: true})\n        updateSizes()\n      })\n\n      function updateSizes () {\n        $(element).css({\n          height: $($window).height() -\n            ((panelWrap && panelWrap.offsetHeight) || 0) -\n            ((searchWrap && searchWrap.offsetHeight) || 0) -\n            (Config.Mobile ? 46 + 18 : 200)\n        })\n        $(countriesWrap).nanoScroller()\n      }\n\n      $($window).on('resize', updateSizes)\n      $scope.$on('contacts_change', function () {\n        onContentLoaded(updateSizes)\n      })\n    }\n  })\n\n  .directive('mySessionsList', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var sessionsWrap = $('.sessions_wrap', element)[0]\n\n      onContentLoaded(function () {\n        $(sessionsWrap).nanoScroller({preventPageScrolling: true, tabIndex: -1, iOSNativeScrolling: true})\n        updateSizes()\n      })\n\n      function updateSizes () {\n        $(element).css({\n          height: Math.min(760, $($window).height() -\n            (Config.Mobile ? 46 + 18 : 200))\n        })\n        $(sessionsWrap).nanoScroller()\n      }\n\n      $($window).on('resize', updateSizes)\n    }\n  })\n\n  .directive('myStickersList', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var stickersWrap = $('.stickerset_wrap', element)[0]\n\n      onContentLoaded(function () {\n        $(stickersWrap).nanoScroller({preventPageScrolling: true, tabIndex: -1, iOSNativeScrolling: true})\n        updateSizes()\n      })\n\n      function updateSizes () {\n        $(element).css({\n          height: Math.min(600, $($window).height() -\n            (Config.Mobile ? 46 + 18 : 200))\n        })\n        $(stickersWrap).nanoScroller()\n      }\n\n      $($window).on('resize', updateSizes)\n    }\n  })\n\n  .directive('myHistory', function ($window, $timeout, $rootScope, $transition) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var historyWrap = $('.im_history_wrap', element)[0]\n      var historyMessagesEl = $('.im_history_messages', element)[0]\n      var historyEl = $('.im_history', element)[0]\n      var scrollableWrap = $('.im_history_scrollable_wrap', element)[0]\n      var scrollable = $('.im_history_scrollable', element)[0]\n      var emptyWrapEl = $('.im_history_empty_wrap', element)[0]\n      var pinnedPanelEl = $('.im_history_pinned_panel', element)[0]\n      var bottomPanelWrap = $('.im_bottom_panel_wrap', element)[0]\n      var sendFormWrap = $('.im_send_form_wrap', element)[0]\n      var headWrap = $('.tg_page_head')[0]\n      var footer = $('.footer_wrap')[0]\n      var sendForm = $('.im_send_form', element)[0]\n      var moreNotified = false\n      var lessNotified = false\n\n      onContentLoaded(function () {\n        scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n      })\n      $(historyWrap).nanoScroller({preventPageScrolling: true, tabIndex: -1, iOSNativeScrolling: true})\n\n      var updateScroller = function (delay) {\n        // console.trace('scroller update', delay)\n        $timeout(function () {\n          if (!$(scrollableWrap).hasClass('im_history_to_bottom')) {\n            $(historyWrap).nanoScroller()\n          }\n        }, delay || 0)\n      }\n\n      var transform = false\n      var trs = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform']\n      var i\n      for (i = 0; i < trs.length; i++) {\n        if (trs[i] in historyMessagesEl.style) {\n          transform = trs[i]\n          break\n        }\n      }\n\n      var animated = transform && false ? true : false // ?\n      var curAnimation = false\n\n      $scope.$on('ui_history_append_new', function (e, options) {\n        if (!atBottom && !options.my) {\n          onContentLoaded(function () {\n            $(historyWrap).nanoScroller()\n          })\n          return\n        }\n        if (options.idleScroll) {\n          onContentLoaded(function () {\n            $(historyWrap).nanoScroller()\n            changeScroll(true)\n          })\n          return\n        }\n        var curAnimated = animated &&\n            !$rootScope.idle.isIDLE &&\n            historyMessagesEl.clientHeight > 0\n        var wasH\n\n        if (curAnimated) {\n          wasH = scrollableWrap.scrollHeight\n        } else {\n          var pr = parseInt($(scrollableWrap).css('paddingRight'))\n          $(scrollable).css({bottom: 0, paddingRight: pr})\n          $(scrollableWrap).addClass('im_history_to_bottom')\n        }\n\n        onContentLoaded(function () {\n          if (curAnimated) {\n            curAnimation = true\n            $(historyMessagesEl).removeClass('im_history_appending')\n            scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n            $(historyMessagesEl).css(transform, 'translate(0px, ' + (scrollableWrap.scrollHeight - wasH) + 'px)')\n            $(historyWrap).nanoScroller()\n            var styles = {}\n            styles[transform] = 'translate(0px, 0px)'\n            $(historyMessagesEl).addClass('im_history_appending')\n            $transition($(historyMessagesEl), styles).then(function () {\n              curAnimation = false\n              $(historyMessagesEl).removeClass('im_history_appending')\n              updateBottomizer()\n            })\n          } else {\n            $(scrollableWrap).removeClass('im_history_to_bottom')\n            $(scrollable).css({bottom: '', paddingRight: 0})\n            scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n            updateBottomizer()\n          }\n        })\n      })\n\n      function changeScroll (noFocus, animated) {\n        var unreadSplit\n        var focusMessage\n\n        var newScrollTop = false\n        var afterScrollAdd\n        // console.trace(dT(), 'change scroll', animated)\n        if (!noFocus &&\n          (focusMessage = $('.im_message_focus:visible', scrollableWrap)[0])) {\n          // console.log(dT(), 'change scroll to focus', focusMessage)\n          var ch = scrollableWrap.clientHeight\n          var st = scrollableWrap.scrollTop\n          var ot = focusMessage.offsetTop\n          var h = focusMessage.clientHeight\n          if (!st || st + ch < ot || st > ot + h || animated) {\n            newScrollTop = Math.max(0, ot - Math.floor(ch / 2) + 26)\n          }\n          atBottom = false\n\n          afterScrollAdd = function () {\n            var unfocusMessagePromise = $(focusMessage).data('unfocus_promise')\n            if (unfocusMessagePromise) {\n              $timeout.cancel(unfocusMessagePromise)\n              $(focusMessage).removeClass('im_message_focus_active')\n            }\n            $timeout(function () {\n              $(focusMessage).addClass('im_message_focus_active')\n              unfocusMessagePromise = $timeout(function () {\n                $(focusMessage).removeClass('im_message_focus_active')\n                $(focusMessage).data('unfocus_promise', false)\n              }, 2800)\n              $(focusMessage).data('unfocus_promise', unfocusMessagePromise)\n            })\n          }\n        } else if (unreadSplit = $('.im_message_unread_split:visible', scrollableWrap)[0]) {\n          // console.log(dT(), 'change scroll unread', unreadSplit.offsetTop)\n          newScrollTop = Math.max(0, unreadSplit.offsetTop - 52)\n          atBottom = false\n        } else {\n          // console.log(dT(), 'change scroll bottom')\n          newScrollTop = scrollableWrap.scrollHeight\n          atBottom = true\n        }\n        if (newScrollTop !== false) {\n          var afterScroll = function () {\n            updateScroller()\n            $timeout(function () {\n              $(scrollableWrap).trigger('scroll')\n              scrollTopInitial = scrollableWrap.scrollTop\n            })\n            if (afterScrollAdd) {\n              afterScrollAdd()\n            }\n          }\n          if (animated) {\n            $(scrollableWrap).animate({scrollTop: newScrollTop}, 200, afterScroll)\n          } else {\n            scrollableWrap.scrollTop = newScrollTop\n            afterScroll()\n          }\n        }\n      }\n\n      $scope.$on('history_direction_key', function (e, data) {\n        var newScrollTop = false\n        console.warn('scroll top', data.keyCode)\n        switch (data.keyCode) {\n          case 33: // page up\n            newScrollTop = scrollableWrap.scrollTop - scrollableWrap.clientHeight\n            break\n          case 34: // page down\n            newScrollTop = scrollableWrap.scrollTop + scrollableWrap.clientHeight\n            break\n          case 36: // home\n            newScrollTop = 0\n            break\n          case 35: // end\n            newScrollTop = scrollableWrap.scrollHeight\n            break\n        }\n        if (newScrollTop !== false) {\n          $(scrollableWrap).stop().animate({scrollTop: newScrollTop}, 200)\n        }\n      })\n\n      $scope.$on('ui_history_change', function () {\n        var pr = parseInt($(scrollableWrap).css('paddingRight'))\n        $(scrollableWrap).addClass('im_history_to_bottom')\n        scrollableWrap.scrollHeight // Some strange Chrome bug workaround\n        $(scrollable).css({bottom: 0, paddingRight: pr})\n        onContentLoaded(function () {\n          $(scrollableWrap).removeClass('im_history_to_bottom')\n          $(scrollable).css({bottom: '', paddingRight: ''})\n          updateSizes(true)\n          moreNotified = false\n          lessNotified = false\n          changeScroll()\n        })\n      })\n\n      $scope.$on('ui_history_change_scroll', function (e, animated) {\n        onContentLoaded(function () {\n          changeScroll(false, animated)\n        })\n      })\n\n      $scope.$on('ui_history_focus', function () {\n        if (!atBottom) {\n          // console.log(dT(), 'scroll history focus')\n          scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n          updateScroller()\n          atBottom = true\n        }\n      })\n\n      $scope.$on('ui_history_prepend', function () {\n        var sh = scrollableWrap.scrollHeight\n        var st = scrollableWrap.scrollTop\n        var pr = parseInt($(scrollableWrap).css('paddingRight'))\n        var ch = scrollableWrap.clientHeight\n\n        $(scrollableWrap).addClass('im_history_to_bottom')\n        scrollableWrap.scrollHeight // Some strange Chrome bug workaround\n        $(scrollable).css({bottom: -(sh - st - ch), paddingRight: pr})\n\n        var upd = function () {\n          $(scrollableWrap).removeClass('im_history_to_bottom')\n          $(scrollable).css({bottom: '', paddingRight: ''})\n          if (scrollTopInitial >= 0) {\n            changeScroll()\n          } else {\n            // console.log('change scroll prepend')\n            scrollableWrap.scrollTop = st + scrollableWrap.scrollHeight - sh\n          }\n\n          updateBottomizer()\n          moreNotified = false\n\n          $timeout(function () {\n            if (scrollableWrap.scrollHeight != sh) {\n              $(scrollableWrap).trigger('scroll')\n            }\n          })\n\n          clearTimeout(timer)\n          unreg()\n        }\n        var timer = setTimeout(upd, 0)\n        var unreg = $scope.$on('$viewContentLoaded', upd)\n      })\n\n      $scope.$on('ui_history_append', function () {\n        var sh = scrollableWrap.scrollHeight\n        onContentLoaded(function () {\n          atBottom = false\n          updateBottomizer()\n          lessNotified = false\n\n          if (scrollTopInitial >= 0) {\n            changeScroll()\n          }\n\n          $timeout(function () {\n            if (scrollableWrap.scrollHeight != sh) {\n              $(scrollableWrap).trigger('scroll')\n            }\n          })\n        })\n      })\n\n      $scope.$on('ui_panel_update', function (e, data) {\n        updateSizes()\n        onContentLoaded(function () {\n          updateSizes()\n          if (data && data.blur) {\n            $scope.$broadcast('ui_message_blur')\n          } else if (!getSelectedText()) {\n            $scope.$broadcast('ui_message_send')\n          }\n\n          $timeout(function () {\n            $(scrollableWrap).trigger('scroll')\n          })\n        })\n      })\n\n      $scope.$on('ui_selection_clear', function () {\n        if (window.getSelection) {\n          if (window.getSelection().empty) { // Chrome\n            window.getSelection().empty()\n          } else if (window.getSelection().removeAllRanges) { // Firefox\n            window.getSelection().removeAllRanges()\n          }\n        } else if (document.selection) { // IE?\n          document.selection.empty()\n        }\n      })\n\n      $scope.$on('ui_editor_resize', updateSizes)\n      $scope.$on('ui_height', function () {\n        onContentLoaded(updateSizes)\n      // updateSizes()\n      })\n\n      var atBottom = true\n      var scrollTopInitial = -1\n      $(scrollableWrap).on('scroll', function (e) {\n        if (!element.is(':visible') ||\n          $(scrollableWrap).hasClass('im_history_to_bottom') ||\n          curAnimation) {\n          return\n        }\n        var st = scrollableWrap.scrollTop\n        atBottom = st >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight\n        if (scrollTopInitial >= 0 && scrollTopInitial != st) {\n          scrollTopInitial = -1\n        }\n\n        if (!moreNotified && st <= 300) {\n          moreNotified = true\n          $scope.$emit('history_need_more')\n        } else if (!lessNotified && st >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) {\n          lessNotified = true\n          $scope.$emit('history_need_less')\n        }\n      })\n\n      function updateSizes (heightOnly) {\n        if (!element.is(':visible') && !$(element[0].parentNode.parentNode).is(':visible')) {\n          return\n        }\n        if ($(sendFormWrap).is(':visible')) {\n          if (!sendForm || !sendForm.offsetHeight) {\n            sendForm = $('.im_send_form', element)[0]\n          }\n          $(sendFormWrap).css({\n            height: $(sendForm).height()\n          })\n        }\n\n        if (!headWrap || !headWrap.offsetHeight) {\n          headWrap = $('.tg_page_head')[0]\n        }\n        if (!footer || !footer.offsetHeight) {\n          footer = $('.footer_wrap')[0]\n        }\n        if (!pinnedPanelEl || !pinnedPanelEl.offsetHeight) {\n          pinnedPanelEl = $('.im_history_pinned_panel', element)[0]\n        }\n\n        var footerHeight = footer ? footer.offsetHeight : 0\n        if (footerHeight) {\n          footerHeight++ // Border bottom\n        }\n        var pinnedHeight = pinnedPanelEl && pinnedPanelEl.offsetHeight || 0\n        var historyH = $($window).height() - bottomPanelWrap.offsetHeight - (headWrap ? headWrap.offsetHeight : 48) - footerHeight - pinnedHeight\n\n        $(historyWrap).css({\n          height: historyH\n        })\n\n        updateBottomizer()\n\n        if (heightOnly === true) return\n        if (atBottom) {\n          onContentLoaded(function () {\n            // console.log('change scroll bottom')\n            scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n            updateScroller()\n          })\n        }\n        updateScroller(100)\n      }\n\n      function updateBottomizer () {\n        $(historyMessagesEl).css({marginTop: 0})\n        var marginTop = scrollableWrap.offsetHeight -\n        historyMessagesEl.offsetHeight -\n        emptyWrapEl.offsetHeight -\n        (Config.Mobile ? 0 : 39)\n\n        if (historyMessagesEl.offsetHeight > 0 && marginTop > 0) {\n          $(historyMessagesEl).css({marginTop: marginTop})\n        }\n        $(historyWrap).nanoScroller()\n      }\n\n      $($window).on('resize', updateSizes)\n\n      updateSizes()\n      onContentLoaded(updateSizes)\n    }\n  })\n\n  .directive('mySendForm', function (_, $q, $timeout, $interval, $window, $compile, $modalStack, $http, $interpolate, Storage, AppStickersManager, AppDocsManager, ErrorService, AppInlineBotsManager, FileManager, shouldFocusOnInteraction) {\n\n    return {\n      link: link,\n      templateUrl: templateUrl('send_form'),\n      scope: {\n        draftMessage: '=',\n        replyKeyboard: '=',\n        mentions: '=',\n        commands: '='\n      }\n    }\n\n    function link ($scope, element, attrs) {\n      var messageFieldWrap = $('.im_send_field_wrap', element)[0]\n      var messageField = $('textarea', element)[0]\n      var emojiButton = $('.composer_emoji_insert_btn', element)[0]\n      var emojiPanel = $('.composer_emoji_panel', element)[0]\n      var fileSelects = $('input', element)\n      var dropbox = $('.im_send_dropbox_wrap', element)[0]\n      var dragStarted\n      var dragTimeout\n      var submitBtn = $('.im_submit', element)[0]\n      var voiceRecorderWrap = $('.im_voice_recorder_wrap', element)[0]\n      var voiceRecordBtn = $('.im_record', element)[0]\n\n      var stickerImageCompiled = $compile('<a class=\"composer_sticker_btn\" data-sticker=\"{{::document.id}}\" my-load-sticker document=\"document\" thumb=\"true\" img-class=\"composer_sticker_image\"></a>')\n      var cachedStickerImages = {}\n\n      var voiceRecorder = null\n      var voiceRecordSupported = Recorder.isRecordingSupported()\n      var voiceRecordDurationInterval = null\n      if (voiceRecordSupported) {\n        element.addClass('im_record_supported')\n      }\n\n      $scope.voiceRecorder = {duration: 0, recording: false, processing: false}\n\n      var emojiTooltip = new EmojiTooltip(emojiButton, {\n        getStickers: function (callback) {\n          AppStickersManager.getStickers().then(callback)\n        },\n        getStickerImage: function (element, docID) {\n          var category = element.attr('data-category')\n          var cached = cachedStickerImages[docID]\n          if (cached && !isInDOM(cached[0])) {\n            cached.attr('data-category', category)\n            element.replaceWith(cached)\n            return\n          }\n          var scope = $scope.$new(true)\n          scope.document = AppDocsManager.getDoc(docID)\n          stickerImageCompiled(scope, function (clonedElement) {\n            cachedStickerImages[docID] = clonedElement\n            clonedElement.attr('data-category', category)\n            element.replaceWith(clonedElement)\n          })\n        },\n        onStickersetSelected: function (stickerset) {\n          AppStickersManager.openStickersetLink(stickerset)\n        },\n        onEmojiSelected: function (code) {\n          $scope.$apply(function () {\n            composer.onEmojiSelected(code)\n          })\n        },\n        onStickerSelected: function (docID) {\n          $scope.$apply(function () {\n            $scope.draftMessage.sticker = docID\n          })\n        },\n        langpack: {\n          im_emoji_tab: _('im_emoji_tab'),\n          im_stickers_tab: _('im_stickers_tab')\n        }\n      })\n\n      $scope.$on('stickers_changed', function () {\n        emojiTooltip.onStickersChanged()\n      })\n\n      var composerEmojiPanel\n      if (emojiPanel) {\n        composerEmojiPanel = new EmojiPanel(emojiPanel, {\n          onEmojiSelected: function (code) {\n            composer.onEmojiSelected(code)\n          }\n        })\n      }\n\n      var composer = new MessageComposer(messageField, {\n        onTyping: function () {\n          $scope.$emit('ui_typing')\n        },\n        getSendOnEnter: function () {\n          return sendOnEnter\n        },\n        dropdownDirective: function (element, callback) {\n          var scope = $scope.$new(true)\n          var clonedElement = $compile('<div><div my-composer-dropdown></div></div>')(scope, function (clonedElement, scope) {\n            element.replaceWith(clonedElement)\n            callback(scope, clonedElement)\n          })\n        },\n        mentions: $scope.mentions,\n        commands: $scope.commands,\n        onMessageSubmit: onMessageSubmit,\n        onDirectionKey: onDirectionKey,\n        onInlineResultSend: onInlineResultSend,\n        onFilePaste: onFilePaste,\n        onCommandSend: function (command) {\n          $scope.$apply(function () {\n            $scope.draftMessage.command = command\n          })\n        }\n      })\n\n      var richTextarea = composer.richTextareaEl && composer.richTextareaEl[0]\n      if (richTextarea) {\n        $(richTextarea).on('keydown keyup', updateHeight)\n      }\n\n      $scope.$on('inline_results', function (e, inlineResults) {\n        var w = Config.Mobile ? $(window).width() : (messageFieldWrap.offsetWidth || 382) - 2\n        var h = 80\n        if (inlineResults) {\n          AppInlineBotsManager.regroupWrappedResults(inlineResults.results, w, h)\n        }\n        setZeroTimeout(function () {\n          composer.setInlineSuggestions(inlineResults)\n        })\n      })\n\n      $scope.$on('inline_placeholder', function (e, data) {\n        composer.setInlinePlaceholder(data.prefix, data.placeholder)\n      })\n\n      fileSelects.on('change', function () {\n        var self = this\n        $scope.$apply(function () {\n          $scope.draftMessage.files = Array.prototype.slice.call(self.files)\n          $scope.draftMessage.isMedia = $(self).hasClass('im_media_attach_input') || Config.Mobile\n          setTimeout(function () {\n            try {\n              self.value = ''\n            } catch (e) {}\n          }, 1000)\n        })\n      })\n\n      $(voiceRecordBtn).on('contextmenu', cancelEvent)\n\n      var voiceRecordTouch = Config.Navigator.touch ? true : false\n      var voiceRecordEvents = {\n        start: voiceRecordTouch ? 'touchstart' : 'mousedown',\n        move: voiceRecordTouch ? 'touchmove' : 'mousemove',\n        stop: voiceRecordTouch ? 'touchend blur' : 'mouseup blur'\n      }\n      var onRecordStart, onRecordStreamReady, onRecordStop\n      var recInited = false\n      var recCancelAfterInit = false\n\n      $(voiceRecordBtn).on(voiceRecordEvents.start, function(event) {\n        if ($scope.voiceRecorder.processing) {\n          return\n        }\n\n        voiceRecorder = new Recorder({\n          monitorGain: 0,\n          numberOfChannels: 1,\n          bitRate: 64000,\n          encoderSampleRate: 48000,\n          encoderPath: 'vendor/recorderjs/encoder_worker.js'\n        })\n\n        recInited = false\n        recCancelAfterInit = false\n\n        onRecordStart = function(e) {\n          var startTime = tsNow(true)\n\n          voiceRecordDurationInterval = $interval(function() {\n            $scope.voiceRecorder.duration = tsNow(true) - startTime\n          }, 1000)\n\n          $scope.$apply(function() {\n            $scope.voiceRecorder.recording = true\n          })\n        }\n        voiceRecorder.addEventListener('start', onRecordStart)\n\n        onRecordStreamReady = function(e) {\n          recInited = true\n          if (recCancelAfterInit) {\n            voiceRecorderStop()\n            return\n          }\n          voiceRecorder.start()\n        }\n        voiceRecorder.addEventListener('streamReady', onRecordStreamReady)\n\n        voiceRecorder.initStream()\n\n        var curHover = false\n        var curBoundaries = {}\n\n        var updateVoiceHoverBoundaries = function () {\n          var boundElement = $('.im_bottom_panel_wrap')\n          var offset = boundElement.offset()\n          curBoundaries = {\n            top: offset.top,\n            left: offset.left,\n            width: boundElement.outerWidth(),\n            height: boundElement.outerHeight(),\n          }\n        }\n\n        var updateVoiceHoveredClass = function (event, returnHover) {\n          var originalEvent = event.originalEvent || event\n          var touch = voiceRecordTouch\n                  ? originalEvent.changedTouches && originalEvent.changedTouches[0]\n                  : originalEvent\n          var isHover = touch &&\n                        touch.pageX >= curBoundaries.left &&\n                        touch.pageX <= curBoundaries.left + curBoundaries.width &&\n                        touch.pageY >= curBoundaries.top &&\n                        touch.pageY <= curBoundaries.top + curBoundaries.height\n\n          if (curHover != isHover) {\n            element.toggleClass('im_send_form_hover', isHover)\n            curHover = isHover\n          }\n          return returnHover && isHover\n        }\n\n        updateVoiceHoverBoundaries()\n        updateVoiceHoveredClass(event)\n\n        onRecordStop = function(event) {\n          $($window).off(voiceRecordEvents.move, updateVoiceHoveredClass)\n          $($window).off(voiceRecordEvents.stop, onRecordStop)\n\n          var isHover = event == 'blur' ? false : updateVoiceHoveredClass(event, true)\n\n          if ($scope.voiceRecorder.duration > 0 && isHover) {\n            $scope.voiceRecorder.processing = true\n            voiceRecorder.addEventListener('dataAvailable', function(e) {\n              var blob = blobConstruct([e.detail], 'audio/ogg')\n              console.warn(dT(), 'got audio', blob)\n\n              $scope.$apply(function () {\n                if (blob.size !== undefined && \n                    blob.size > 1024) {\n                  $scope.draftMessage.files = [blob]\n                  $scope.draftMessage.isMedia = true\n                }\n\n                $scope.voiceRecorder.processing = false\n              })\n            })\n          }\n          cancelRecord()\n        }\n\n        if (!Config.Mobile) {\n          $(voiceRecorderWrap).css({\n            height: messageFieldWrap.offsetHeight,\n            width: messageFieldWrap.offsetWidth\n          })\n        }\n\n        $($window).on(voiceRecordEvents.move, updateVoiceHoveredClass)\n        $($window).one(voiceRecordEvents.stop, onRecordStop)\n      })\n\n      function voiceRecorderStop() {\n        if (!recInited) {\n          recCancelAfterInit = true\n          return\n        }\n        if (voiceRecorder) {\n          voiceRecorder.stop()\n          voiceRecorder.removeEventListener('streamReady', onRecordStreamReady)\n          voiceRecorder.removeEventListener('start', onRecordStart)\n\n\n          if (voiceRecorder.audioContext) {\n            if (voiceRecorder.scriptProcessorNode) {\n              voiceRecorder.scriptProcessorNode.disconnect()\n            }\n            voiceRecorder.clearStream()\n\n            voiceRecorder.audioContext.close()\n            voiceRecorder.audioContext = null\n          }\n        }\n      }\n\n      function cancelRecord() {\n        voiceRecorderStop()\n\n        if ($scope.voiceRecorder.recording) {\n          $interval.cancel(voiceRecordDurationInterval)\n\n          $scope.$apply(function() {\n            $scope.voiceRecorder.recording = false\n            $scope.voiceRecorder.duration = 0\n          })\n        }\n      }\n\n      var sendOnEnter = true\n      function updateSendSettings () {\n        Storage.get('send_ctrlenter').then(function (sendOnCtrl) {\n          sendOnEnter = !sendOnCtrl\n        })\n      }\n      $scope.$on('settings_changed', updateSendSettings)\n      updateSendSettings()\n\n      $(submitBtn).on('mousedown touchstart', onMessageSubmit)\n\n      function onMessageSubmit (e) {\n        $timeout(function () {\n          updateValue()\n          $scope.draftMessage.send()\n          composer.resetTyping()\n          if (composerEmojiPanel) {\n            composerEmojiPanel.update()\n          }\n\n          composer.hideSuggestions()\n        }, shouldFocusOnInteraction ? 0 : 100)\n        return cancelEvent(e)\n      }\n\n      function onInlineResultSend (qID) {\n        $scope.$apply(function () {\n          $scope.draftMessage.inlineResultID = qID\n        })\n      }\n\n      function onDirectionKey (e) {\n        if (e.keyCode == 38) {\n          $scope.$emit('last_message_edit')\n          return cancelEvent(e)\n        }\n        $scope.$emit('history_direction_key', e)\n        return true\n      }\n\n      function updateValue () {\n        if (richTextarea) {\n          composer.onChange()\n          updateHeight()\n        }\n      }\n\n      var height = richTextarea && richTextarea.offsetHeight\n      function updateHeight () {\n        var newHeight = richTextarea.offsetHeight\n        if (height != newHeight) {\n          height = newHeight\n          $scope.$emit('ui_editor_resize')\n        }\n      }\n\n      function onKeyDown (e) {\n        if (e.keyCode == 9 && !e.shiftKey && !e.ctrlKey && !e.metaKey && !$modalStack.getTop()) { // TAB\n          composer.focus()\n          return cancelEvent(e)\n        }\n      }\n      $(document).on('keydown', onKeyDown)\n\n      $('body').on('dragenter dragleave dragover drop', onDragDropEvent)\n      $(document).on('paste', onPasteEvent)\n\n      if (shouldFocusOnInteraction) {\n        $scope.$on('ui_peer_change', focusField)\n        $scope.$on('ui_history_focus', focusField)\n        $scope.$on('ui_history_change', focusField)\n      }\n\n      $scope.$on('ui_peer_change', composer.resetTyping.bind(composer))\n      $scope.$on('ui_peer_draft', function (e, options) {\n        options = options || {}\n        var isBroadcast = $scope.draftMessage.isBroadcast\n        composer.setPlaceholder(_(isBroadcast ? 'im_broadcast_field_placeholder_raw' : 'im_message_field_placeholder_raw'))\n\n        if (options.customSelection) {\n          composer.setFocusedValue(options.customSelection)\n          updateHeight()\n        } else {\n          if (richTextarea) {\n            composer.setValue($scope.draftMessage.text || '')\n            updateHeight()\n          }\n          if (shouldFocusOnInteraction || (options && options.focus)) {\n            composer.focus()\n          }\n        }\n        onContentLoaded(function () {\n          composer.checkAutocomplete(true)\n        })\n        if (emojiTooltip && Config.Mobile) {\n          emojiTooltip.hide()\n        }\n      })\n      $scope.$on('ui_peer_reply', function () {\n        onContentLoaded(function () {\n          $scope.$emit('ui_editor_resize')\n          if (shouldFocusOnInteraction) {\n            composer.focus()\n          }\n        })\n      })\n\n      $scope.$on('mentions_update', function () {\n        composer.onMentionsUpdated()\n      })\n\n      $scope.$on('ui_message_before_send', function () {\n        updateValue()\n      })\n      $scope.$on('ui_message_send', function () {\n        if (shouldFocusOnInteraction) {\n          focusField()\n        }\n      })\n      $scope.$on('ui_message_blur', function () {\n        composer.blur()\n      })\n\n      function focusField () {\n        onContentLoaded(function () {\n          composer.focus()\n        })\n      }\n\n      function onFilePaste (blob) {\n        var mimeType = blob.type || ''\n        var fileUrlPromise = $q.when(false)\n        if (['image/jpeg', 'image/gif', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\n          fileUrlPromise = FileManager.getFileCorrectUrl(blob, mimeType)\n        }\n        fileUrlPromise.then(function (fileUrl) {\n          fileUrl = fileUrl || false\n          ErrorService.confirm({type: 'FILE_CLIPBOARD_PASTE', fileUrl: fileUrl}).then(function () {\n            $scope.draftMessage.files = [blob]\n            $scope.draftMessage.isMedia = true\n          })\n        })\n      }\n\n      function onPasteEvent (e) {\n        var cData = (e.originalEvent || e).clipboardData\n        var items = (cData && cData.items) || []\n        var files = []\n        var i, file\n\n        for (i = 0; i < items.length; i++) {\n          if (items[i].kind == 'file') {\n            file = items[i].getAsFile()\n            files.push(file)\n          }\n        }\n\n        if (files.length > 0) {\n          if (files.length == 1) {\n            return onFilePaste(files[0])\n          }\n          ErrorService.confirm({type: 'FILES_CLIPBOARD_PASTE', files: files}).then(function () {\n            $scope.draftMessage.files = files\n            $scope.draftMessage.isMedia = true\n          })\n        }\n      }\n\n      function onDragDropEvent (e) {\n        var dragStateChanged = false\n        if (!dragStarted || dragStarted == 1) {\n          dragStarted = checkDragEvent(e) ? 2 : 1\n          dragStateChanged = true\n        }\n        if (dragStarted == 2) {\n          if (dragTimeout) {\n            setTimeout(function () {\n              clearTimeout(dragTimeout)\n              dragTimeout = false\n            }, 0)\n          }\n\n          if (e.type == 'dragenter' || e.type == 'dragover') {\n            if (dragStateChanged) {\n              $(dropbox).css({\n                height: messageFieldWrap.offsetHeight,\n                width: messageFieldWrap.offsetWidth\n              })\n              element.addClass('im_send_form_dragging')\n            }\n          } else {\n            if (e.type == 'drop') {\n              $scope.$apply(function () {\n                $scope.draftMessage.files = Array.prototype.slice.call(e.originalEvent.dataTransfer.files)\n                $scope.draftMessage.isMedia = true\n              })\n            }\n            dragTimeout = setTimeout(function () {\n              element.removeClass('im_send_form_dragging')\n              dragStarted = false\n              dragTimeout = false\n            }, 300)\n          }\n        }\n\n        return cancelEvent(e)\n      }\n\n      $scope.$on('$destroy', function cleanup () {\n        $(document).off('paste', onPasteEvent)\n        $(document).off('keydown', onKeyDown)\n        $('body').off('dragenter dragleave dragover drop', onDragDropEvent)\n        $(submitBtn).off('mousedown touchstart')\n        fileSelects.off('change')\n      })\n\n      if (shouldFocusOnInteraction) {\n        focusField()\n      }\n    }\n  })\n\n  .directive('myLoadThumb', function (MtpApiFileManager, FileManager) {\n    return {\n      link: link,\n      scope: {\n        thumb: '='\n      }\n    }\n\n    function link ($scope, element, attrs) {\n      var counter = 0\n\n      var cachedBlob = MtpApiFileManager.getCachedFile(\n        $scope.thumb &&\n        $scope.thumb.location &&\n        !$scope.thumb.location.empty &&\n        $scope.thumb.location\n      )\n\n      if (cachedBlob) {\n        element.attr('src', FileManager.getUrl(cachedBlob, 'image/jpeg'))\n      }\n      if ($scope.thumb && $scope.thumb.width && $scope.thumb.height) {\n        element.attr('width', $scope.thumb.width)\n        element.attr('height', $scope.thumb.height)\n      }\n\n      var stopWatching = $scope.$watchCollection('thumb.location', function (newLocation) {\n        if ($scope.thumb && $scope.thumb.width && $scope.thumb.height) {\n          element.attr('width', $scope.thumb.width)\n          element.attr('height', $scope.thumb.height)\n          $scope.$emit('ui_height')\n        }\n        // console.log('new loc', newLocation, arguments)\n        var counterSaved = ++counter\n        if (!newLocation || newLocation.empty) {\n          element.attr('src', ($scope.thumb && $scope.thumb.placeholder) || 'img/blank.gif')\n          cleanup()\n          return\n        }\n\n        var cachedBlob = MtpApiFileManager.getCachedFile(newLocation)\n        if (cachedBlob) {\n          element.attr('src', FileManager.getUrl(cachedBlob, 'image/jpeg'))\n          cleanup()\n          return\n        }\n\n        if (!element.attr('src')) {\n          element.attr('src', $scope.thumb.placeholder || 'img/blank.gif')\n        }\n\n        MtpApiFileManager.downloadSmallFile($scope.thumb.location).then(function (blob) {\n          if (counterSaved == counter) {\n            element.attr('src', FileManager.getUrl(blob, 'image/jpeg'))\n            cleanup()\n          }\n        }, function (e) {\n          console.log('Download image failed', e, $scope.thumb.location, element[0])\n          if (counterSaved == counter) {\n            element.attr('src', $scope.thumb.placeholder || 'img/blank.gif')\n            cleanup()\n          }\n        })\n      })\n\n      var cleanup = attrs.watch\n        ? angular.noop\n        : function () {\n          setTimeout(function () {\n            $scope.$destroy()\n            stopWatching()\n          }, 0)\n        }\n    }\n  })\n\n  .directive('myLoadFullPhoto', function (MtpApiFileManager, FileManager, _) {\n    return {\n      link: link,\n      transclude: true,\n      templateUrl: templateUrl('full_photo'),\n      scope: {\n        fullPhoto: '=',\n        thumbLocation: '='\n      }\n    }\n\n    function link ($scope, element, attrs) {\n      var imgElement = $('img', element)[0]\n      var resizeElements = $('.img_fullsize_with_progress_wrap', element)\n        .add('.img_fullsize_progress_wrap', element)\n        .add($(imgElement))\n      var resize = function () {\n        resizeElements.css({width: $scope.fullPhoto.width, height: $scope.fullPhoto.height})\n        $scope.$emit('ui_height', true)\n      }\n\n      var jump = 0\n      $scope.$watchCollection('fullPhoto.location', function () {\n        var cachedBlob = MtpApiFileManager.getCachedFile($scope.thumbLocation)\n        var curJump = ++jump\n\n        if (cachedBlob) {\n          imgElement.src = FileManager.getUrl(cachedBlob, 'image/jpeg')\n          resize()\n        } else {\n          imgElement.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'\n        }\n\n        if (!$scope.fullPhoto.location) {\n          return\n        }\n\n        var apiPromise\n        if ($scope.fullPhoto.size) {\n          var inputLocation = {\n            _: 'inputFileLocation',\n            volume_id: $scope.fullPhoto.location.volume_id,\n            local_id: $scope.fullPhoto.location.local_id,\n            secret: $scope.fullPhoto.location.secret\n          }\n          apiPromise = MtpApiFileManager.downloadFile($scope.fullPhoto.location.dc_id, inputLocation, $scope.fullPhoto.size)\n        } else {\n          apiPromise = MtpApiFileManager.downloadSmallFile($scope.fullPhoto.location)\n        }\n\n        $scope.progress = {enabled: true, percent: 0}\n\n        apiPromise.then(function (blob) {\n          if (curJump == jump) {\n            $scope.progress.enabled = false\n            imgElement.src = FileManager.getUrl(blob, 'image/jpeg')\n            resize()\n          }\n        }, function (e) {\n          console.log('Download image failed', e, $scope.fullPhoto.location)\n          $scope.progress.enabled = false\n\n          if (e && e.type == 'FS_BROWSER_UNSUPPORTED') {\n            $scope.error = {html: _('error_browser_no_local_file_system_image_md', {\n              'moz-link': '<a href=\"{0}\" target=\"_blank\">{1}</a>',\n              'chrome-link': '<a href=\"{0}\" target=\"_blank\">{1}</a>',\n              'telegram-link': '<a href=\"{0}\" target=\"_blank\">{1}</a>'\n            })}\n          } else {\n            $scope.error = {text: _('error_image_download_failed'), error: e}\n          }\n        }, function (progress) {\n          $scope.progress.percent = Math.max(1, Math.floor(100 * progress.done / progress.total))\n        })\n      })\n\n      resize()\n    }\n  })\n\n  .directive('myLoadVideo', function ($sce, AppDocsManager, ErrorService, _) {\n    return {\n      link: link,\n      transclude: true,\n      templateUrl: templateUrl('full_video'),\n      scope: {\n        video: '='\n      }\n    }\n\n    function link ($scope, element, attrs) {\n      var downloadPromise = AppDocsManager.downloadDoc($scope.video.id)\n\n      downloadPromise.then(function () {\n        $scope.$emit('ui_height')\n        onContentLoaded(function () {\n          var videoEl = $('video', element)[0]\n          if (videoEl) {\n            var errorAlready = false\n            var onVideoError = function (event) {\n              if (errorAlready) {\n                return\n              }\n              if (!event.target ||\n                !event.target.error ||\n                event.target.error.code == event.target.error.MEDIA_ERR_DECODE ||\n                event.target.error.code == event.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED) {\n                errorAlready = true\n                ErrorService.show({\n                  error: {\n                    type: 'MEDIA_TYPE_NOT_SUPPORTED',\n                    originalError: event.target && event.target.error\n                  }\n                })\n              }\n            }\n\n            videoEl.addEventListener('error', onVideoError, true)\n            $(videoEl).on('$destroy', function () {\n              errorAlready = true\n              videoEl.removeEventListener('error', onVideoError)\n            })\n          }\n        })\n      }, function (e) {\n        console.log('Download video failed', e, $scope.video)\n\n        if (e && e.type == 'FS_BROWSER_UNSUPPORTED') {\n          $scope.error = {html: _('error_browser_no_local_file_system_video_md', {\n            'moz-link': '<a href=\"{0}\" target=\"_blank\">{1}</a>',\n            'chrome-link': '<a href=\"{0}\" target=\"_blank\">{1}</a>',\n            'telegram-link': '<a href=\"{0}\" target=\"_blank\">{1}</a>'\n          })}\n        } else {\n          $scope.error = {text: _('error_video_download_failed'), error: e}\n        }\n      })\n\n      $scope.$emit('ui_height')\n\n      $scope.$on('$destroy', function () {\n        downloadPromise.cancel()\n      })\n    }\n  })\n\n  .directive('myLoadGif', function (AppDocsManager, $timeout) {\n\n    var currentPlayer = false\n    var currentPlayerScope = false\n\n    return {\n      link: link,\n      templateUrl: templateUrl('full_gif'),\n      scope: {\n        document: '='\n      }\n    }\n\n    function checkPlayer(newPlayer, newScope) {\n      if (currentPlayer === newPlayer) {\n        return false\n      }\n      if (currentPlayer) {\n        currentPlayer.pause()\n        currentPlayer.currentTime = 0\n        currentPlayerScope.isActive = false\n      }\n      currentPlayer = newPlayer\n      currentPlayerScope = newScope\n    }\n\n    function toggleVideoPlayer ($scope, element) {\n      var video = $('video', element)[0]\n      if (video) {\n        if (!$scope.isActive) {\n          video.pause()\n          video.currentTime = 0\n        } else {\n          checkPlayer(video, $scope)\n\n          var promise = video.play()\n          if (promise && promise.then) {\n            promise.then(function () {\n              $scope.needClick = false\n            }, function () {\n              $scope.needClick = true\n            })\n          }\n        }\n        return video\n      }\n      return false\n    }\n\n    function link ($scope, element, attrs) {\n      var imgWrap = $('.img_gif_image_wrap', element)\n      imgWrap.css({width: $scope.document.thumb.width, height: $scope.document.thumb.height})\n\n      var downloadPromise = false\n      var peerChanged = false\n\n      $scope.isActive = false\n\n      $scope.toggle = function (e) {\n        if (e && checkClick(e, true)) {\n          AppDocsManager.saveDocFile($scope.document.id)\n          return false\n        }\n\n        if ($scope.document.url) {\n          if ($scope.needClick) {\n            if (toggleVideoPlayer($scope, element)) {\n              return;\n            }\n          }\n          $scope.isActive = !$scope.isActive\n          onContentLoaded(function () {\n            $scope.$emit('ui_height')\n            toggleVideoPlayer($scope, element)\n          })\n          return\n        }\n\n        if (downloadPromise) {\n          downloadPromise.cancel()\n          downloadPromise = false\n          return\n        }\n\n        peerChanged = false\n        downloadPromise = AppDocsManager.downloadDoc($scope.document.id)\n\n        downloadPromise.then(function () {\n          $timeout(function () {\n            if (!peerChanged) {\n              $scope.isActive = true\n            }\n            var video = toggleVideoPlayer($scope, element)\n            if (video) {\n              $(video).on('ended', function () {\n                if ($scope.isActive) {\n                  $scope.toggle()\n                }\n              })\n            }\n          }, 200)\n        })\n      }\n\n      $scope.$on('ui_history_change', function () {\n        if ($scope.isActive) {\n          $scope.toggle()\n        }\n        peerChanged = true\n      })\n\n      $scope.$on('$destroy', function () {\n        if (downloadPromise) {\n          downloadPromise.cancel()\n          downloadPromise = false\n        }\n      })\n    }\n  })\n\n  .directive('myLoadRound', function (AppMessagesManager, AppDocsManager, $timeout) {\n\n    var currentPlayer = false\n    var currentPlayerScope = false\n\n    return {\n      link: link,\n      templateUrl: templateUrl('full_round'),\n      scope: {\n        document: '='\n      }\n    }\n\n    function checkPlayer(newPlayer, newScope) {\n      if (currentPlayer === newPlayer) {\n        return false\n      }\n      if (currentPlayer) {\n        currentPlayer.pause()\n        currentPlayer.currentTime = 0\n        currentPlayerScope.isActive = false\n      }\n      currentPlayer = newPlayer\n      currentPlayerScope = newScope\n    }\n\n    function readVideoMessage($scope) {\n      if ($scope.message &&\n          !$scope.message.pFlags.out &&\n          $scope.message.pFlags.media_unread) {\n        AppMessagesManager.readMessages([$scope.message.mid])\n      }\n    }\n\n    function toggleVideoPlayer ($scope, element) {\n      var video = $('video', element)[0]\n      if (video) {\n        if (!$scope.isActive) {\n          video.pause()\n          video.currentTime = 0\n        } else {\n          checkPlayer(video, $scope)\n\n          var promise = video.play()\n          if (promise && promise.then) {\n            promise.then(function () {\n              $scope.needClick = false\n              readVideoMessage($scope)\n            }, function () {\n              $scope.needClick = true\n            })\n          } else {\n            readVideoMessage($scope)\n          }\n        }\n        return video\n      }\n      return false\n    }\n\n    function link ($scope, element, attrs) {\n      var imgWrap = $('.img_round_image_wrap', element)\n      imgWrap.css({width: $scope.document.thumb.width, height: $scope.document.thumb.height})\n\n      var downloadPromise = false\n      var peerChanged = false\n\n      $scope.isActive = false\n\n      if ($scope.$parent.messageId) {\n        $scope.message = AppMessagesManager.wrapForHistory($scope.$parent.messageId)\n      }\n\n      $scope.toggle = function (e) {\n        if (e && checkClick(e, true)) {\n          AppDocsManager.saveDocFile($scope.document.id)\n          return false\n        }\n\n        if ($scope.document.url) {\n          if ($scope.needClick) {\n            if (toggleVideoPlayer($scope, element)) {\n              return;\n            }\n          }\n          $scope.isActive = !$scope.isActive\n          onContentLoaded(function () {\n            $scope.$emit('ui_height')\n            toggleVideoPlayer($scope, element)\n          })\n          return\n        }\n\n        if (downloadPromise) {\n          downloadPromise.cancel()\n          downloadPromise = false\n          return\n        }\n\n        peerChanged = false\n        downloadPromise = AppDocsManager.downloadDoc($scope.document.id)\n\n        downloadPromise.then(function () {\n          $timeout(function () {\n            if (!peerChanged) {\n              $scope.isActive = true\n            }\n            var video = toggleVideoPlayer($scope, element)\n            if (video) {\n              $(video).on('ended', function () {\n                if ($scope.isActive) {\n                  $scope.toggle()\n                }\n              })\n            }\n          }, 200)\n        })\n      }\n\n      $scope.$on('ui_history_change', function () {\n        if ($scope.isActive) {\n          $scope.toggle()\n        }\n        peerChanged = true\n      })\n\n      $scope.$on('$destroy', function () {\n        if (downloadPromise) {\n          downloadPromise.cancel()\n          downloadPromise = false\n        }\n      })\n    }\n  })\n\n  .directive('myLoadSticker', function (_, MtpApiFileManager, FileManager, AppStickersManager) {\n    var emptySrc = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'\n\n    return {\n      link: link,\n      scope: {\n        document: '='\n      }\n    }\n\n    function link ($scope, element, attrs) {\n      var imgElement = $('<img />').addClass(attrs.imgClass)\n      var wasAdded = false\n\n      imgElement.attr('alt', '[' + ($scope.document.stickerEmojiRaw || '') + ' ' + _('conversation_media_sticker') + ']')\n\n      var dim = (attrs.dim && $scope.$parent.$eval(attrs.dim)) || $scope.document.thumb\n\n      if (attrs.open && $scope.document.stickerSetInput) {\n        element\n          .addClass('clickable')\n          .on('click', function () {\n            AppStickersManager.openStickerset($scope.document.stickerSetInput)\n          })\n      }\n\n      var setSrc = function (blob) {\n        imgElement.attr('src', FileManager.getUrl(blob))\n        if (!wasAdded) {\n          wasAdded = true\n          imgElement.appendTo(element)\n        }\n      }\n\n      imgElement.css({\n        width: dim.width,\n        height: dim.height\n      })\n      element.css({\n        width: dim.width,\n        height: dim.height\n      })\n\n      var smallLocation = false\n      if ($scope.document.thumb.location) {\n        smallLocation = angular.copy($scope.document.thumb.location)\n        smallLocation.sticker = true\n      }\n\n      var fullLocation = {\n        _: 'inputDocumentFileLocation',\n        id: $scope.document.id,\n        access_hash: $scope.document.access_hash,\n        dc_id: $scope.document.dc_id,\n        file_name: $scope.document.file_name,\n        version: $scope.document.version,\n        sticker: true\n      }\n\n      var cachedBlob = MtpApiFileManager.getCachedFile(fullLocation)\n      var fullDone = false\n      if (!cachedBlob) {\n        cachedBlob = MtpApiFileManager.getCachedFile(smallLocation)\n      } else {\n        fullDone = true\n      }\n      if (cachedBlob) {\n        setSrc(cachedBlob)\n        if (fullDone) {\n          return\n        }\n      } else {\n        wasAdded = true\n        imgElement.attr('src', emptySrc).appendTo(element)\n      }\n\n      if (attrs.thumb && smallLocation) {\n        MtpApiFileManager.downloadSmallFile(smallLocation).then(function (blob) {\n          setSrc(blob)\n        }, function (e) {\n          console.log('Download sticker failed', e, fullLocation)\n        })\n      } else {\n        MtpApiFileManager.downloadFile($scope.document.dc_id, fullLocation, $scope.document.size).then(function (blob) {\n          setSrc(blob)\n        }, function (e) {\n          console.log('Download sticker failed', e, fullLocation)\n        })\n      }\n    }\n  })\n\n  .directive('myLoadDocument', function (MtpApiFileManager, AppDocsManager, FileManager) {\n    return {\n      link: link,\n      templateUrl: templateUrl('full_document'),\n      scope: {\n        document: '=myLoadDocument'\n      }\n    }\n\n    function updateModalWidth (element, width) {\n      while (element && !$(element).hasClass('modal-dialog')) {\n        element = element.parentNode\n      }\n      if (element) {\n        $(element).width(width + (Config.Mobile ? 0 : 32))\n      }\n    }\n\n    function link ($scope, element, attrs) {\n      var loaderWrap = $('.document_fullsize_with_progress_wrap', element)\n      var fullSizeWrap = $('.document_fullsize_wrap', element)\n      var fullSizeImage = $('.document_fullsize_img', element)\n\n      var fullWidth = $(window).width() - (Config.Mobile ? 20 : 32)\n      var fullHeight = $(window).height() - 150\n      if (fullWidth > 800) {\n        fullWidth -= 208\n      }\n\n      $scope.imageWidth = fullWidth\n      $scope.imageHeight = fullHeight\n\n      var thumbPhotoSize = $scope.document.thumb\n\n      if (thumbPhotoSize && thumbPhotoSize._ != 'photoSizeEmpty') {\n        var wh = calcImageInBox(thumbPhotoSize.width, thumbPhotoSize.height, fullWidth, fullHeight)\n        $scope.imageWidth = wh.w\n        $scope.imageHeight = wh.h\n\n        var cachedBlob = MtpApiFileManager.getCachedFile(thumbPhotoSize.location)\n        if (cachedBlob) {\n          $scope.thumbSrc = FileManager.getUrl(cachedBlob, 'image/jpeg')\n        }\n      }\n\n      $scope.frameWidth = Math.max($scope.imageWidth, Math.min(600, fullWidth))\n      $scope.frameHeight = $scope.imageHeight\n\n      onContentLoaded(function () {\n        $scope.$emit('ui_height')\n      })\n\n      updateModalWidth(element[0], $scope.frameWidth)\n\n      var checkSizesInt\n      var realImageWidth\n      var realImageHeight\n      AppDocsManager.downloadDoc($scope.document.id).then(function (blob) {\n        var url = FileManager.getUrl(blob, $scope.document.mime_type)\n        var image = new Image()\n        var limit = 100 // 2 sec\n        var checkSizes = function (e) {\n          if ((!image.height || !image.width) && --limit) {\n            return\n          }\n          realImageWidth = image.width\n          realImageHeight = image.height\n          clearInterval(checkSizesInt)\n\n          var defaultWh = calcImageInBox(image.width, image.height, fullWidth, fullHeight, true)\n          var zoomedWh = {w: realImageWidth, h: realImageHeight}\n          if (defaultWh.w >= zoomedWh.w && defaultWh.h >= zoomedWh.h) {\n            zoomedWh.w *= 4\n            zoomedWh.h *= 4\n          }\n\n          var zoomed = true\n          $scope.toggleZoom = function () {\n            zoomed = !zoomed\n            var imageWidth = (zoomed ? zoomedWh : defaultWh).w\n            var imageHeight = (zoomed ? zoomedWh : defaultWh).h\n            fullSizeImage.css({\n              width: imageWidth,\n              height: imageHeight,\n              marginTop: $scope.frameHeight > imageHeight ? Math.floor(($scope.frameHeight - imageHeight) / 2) : 0\n            })\n            fullSizeWrap.toggleClass('document_fullsize_zoomed', zoomed)\n          }\n\n          $scope.toggleZoom(false)\n\n          fullSizeImage.attr('src', url)\n          loaderWrap.hide()\n          fullSizeWrap.css({width: $scope.frameWidth, height: $scope.frameHeight}).show()\n        }\n        checkSizesInt = setInterval(checkSizes, 20)\n        image.onload = checkSizes\n        image.src = url\n        setZeroTimeout(checkSizes)\n      })\n    }\n  })\n\n  .directive('myGeoPointMap', function (ExternalResourcesManager) {\n    return {\n      link: link,\n      scope: {\n        point: '=myGeoPointMap'\n      }\n    }\n\n    function link ($scope, element, attrs) {\n      var width = element.attr('width') || 200\n      var height = element.attr('height') || 200\n      var zoom = width > 200 ? 15 : 13\n      var useGoogle = false\n      var src\n\n      if (useGoogle) {\n        var apiKey = Config.ExtCredentials.gmaps.api_key\n        var useApiKey = true\n        src = 'https://maps.googleapis.com/maps/api/staticmap?sensor=false&center=' + $scope.point['lat'] + ',' + $scope.point['long'] + '&zoom=' + zoom + '&size=' + width + 'x' + height + '&scale=2&markers=color:red|size:big|' + $scope.point['lat'] + ',' + $scope.point['long']\n        if (useApiKey) {\n          src += '&key=' + apiKey\n        }\n      } else {\n        src = 'https://static-maps.yandex.ru/1.x/?l=map&ll=' + $scope.point['long'] + ',' + $scope.point['lat'] + '&z=' + zoom + '&size=' + width + ',' + height + '&scale=1&pt=' + $scope.point['long'] + ',' + $scope.point['lat'] + ',pm2rdm&lang=en_US'\n      }\n\n      element.attr('src', 'img/blank.gif')\n\n      ExternalResourcesManager.downloadByURL(src).then(function (url) {\n        element.attr('src', url.valueOf())\n      })\n    }\n  })\n\n  .directive('myLoadingDots', function ($interval) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      element.html(isAnimationSupported(element[0])\n        ? '<div class=\"loading_dots\"><i></i><i></i><i></i></div>'\n        : '...'\n      )\n    }\n\n    var animationSupported\n    function isAnimationSupported (el) {\n      if (animationSupported === undefined) {\n        animationSupported = el.style.animationName !== undefined\n        if (animationSupported === false) {\n          var domPrefixes = 'Webkit Moz O ms Khtml'.split(' ')\n          var i\n          for (i = 0; i < domPrefixes.length; i++) {\n            if (el.style[domPrefixes[i] + 'AnimationName'] !== undefined) {\n              animationSupported = true\n              break\n            }\n          }\n        }\n      }\n\n      return animationSupported\n    }\n  })\n\n  .directive('myFocused', function (shouldFocusOnInteraction) {\n    return {\n      link: function ($scope, element, attrs) {\n        if (!shouldFocusOnInteraction) {\n          return false\n        }\n        setTimeout(function () {\n          setFieldSelection(element[0])\n        }, 100)\n      }\n    }\n  })\n\n  .directive('myFocusOn', function (shouldFocusOnInteraction) {\n    return {\n      link: function ($scope, element, attrs) {\n        $scope.$on(attrs.myFocusOn, function () {\n          if (!shouldFocusOnInteraction) {\n            return false\n          }\n          onContentLoaded(function () {\n            setFieldSelection(element[0])\n          })\n        })\n      }\n    }\n  })\n\n  .directive('myFileUpload', function () {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      element.on('change', function () {\n        var self = this\n        $scope.$apply(function () {\n          $scope.photo.file = self.files[0]\n          setTimeout(function () {\n            try {\n              self.value = ''\n            } catch (e) {}\n          }, 1000)\n        })\n      })\n    }\n  })\n\n  .directive('myModalWidth', function () {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      attrs.$observe('myModalWidth', function (newW) {\n        $(element[0].parentNode.parentNode).css({width: parseInt(newW) + (Config.Mobile ? 0 : 32)})\n      })\n    }\n  })\n\n  .directive('myModalNav', function () {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var onKeyDown = function (event) {\n        var target = event.target\n        if (target && (target.tagName == 'INPUT' || target.tagName == 'TEXTAREA')) {\n          return\n        }\n\n        switch (event.keyCode) {\n          case 39: // right\n          case 32: // space\n          case 34: // pg down\n          case 40: // down\n            $scope.$eval(attrs.next)\n            break\n\n          case 37: // left\n          case 33: // pg up\n          case 38: // up\n            $scope.$eval(attrs.prev)\n            break\n        }\n      }\n\n      $(document).on('keydown', onKeyDown)\n\n      $scope.$on('$destroy', function () {\n        $(document).off('keydown', onKeyDown)\n      })\n    }\n  })\n\n  .directive('myCustomBackground', function () {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      $('html').css({background: attrs.myCustomBackground})\n\n      $scope.$on('$destroy', function () {\n        $('html').css({background: ''})\n      })\n    }\n  })\n\n  .directive('myInfiniteScroller', function () {\n    return {\n      link: link,\n      scope: true\n    }\n\n    function link ($scope, element, attrs) {\n      var scrollableWrap = $('.nano-content', element)[0]\n      var moreNotified = false\n\n      $(scrollableWrap).on('scroll', function (e) {\n        if (!element.is(':visible')) return\n        if (!moreNotified &&\n          scrollableWrap.scrollTop >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) {\n          moreNotified = true\n          $scope.$apply(function () {\n            $scope.slice.limit += ($scope.slice.limitDelta || 20)\n          })\n\n          onContentLoaded(function () {\n            moreNotified = false\n            $(element).nanoScroller()\n          })\n        }\n      })\n    }\n  })\n\n  .directive('myModalPosition', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var updateMargin = function () {\n        if (Config.Mobile &&\n          $(element[0].parentNode.parentNode.parentNode).hasClass('mobile_modal')) {\n          return\n        }\n        var height = element[0].parentNode.offsetHeight\n        var modal = element[0].parentNode.parentNode.parentNode\n        var bottomPanel = $('.media_modal_bottom_panel_wrap', modal)[0]\n        var contHeight = modal.offsetHeight - ((bottomPanel && bottomPanel.offsetHeight) || 0)\n\n        if (height < contHeight) {\n          $(element[0].parentNode).css('marginTop', (contHeight - height) / 2)\n        } else {\n          $(element[0].parentNode).css('marginTop', '')\n        }\n\n        if (attrs.animation != 'no') {\n          $timeout(function () {\n            $(element[0].parentNode).addClass('modal-content-animated')\n          }, 300)\n        }\n      }\n\n      onContentLoaded(updateMargin)\n\n      $($window).on('resize', updateMargin)\n\n      $scope.$on('ui_height', function (e, sync) {\n        if (sync) {\n          updateMargin()\n        } else {\n          onContentLoaded(updateMargin)\n        }\n      })\n    }\n  })\n\n  .directive('myVerticalPosition', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var usePadding = attrs.padding === 'true'\n      var prevMargin = 0\n\n      var updateMargin = function () {\n        var height = element[0].offsetHeight\n        var fullHeight = height - (height && usePadding ? 2 * prevMargin : 0)\n        var ratio = (attrs.myVerticalPosition && parseFloat(attrs.myVerticalPosition)) || 0.5\n        var contHeight = attrs.contHeight ? $scope.$eval(attrs.contHeight) : $($window).height()\n        var margin = fullHeight < contHeight ? parseInt((contHeight - fullHeight) * ratio) : ''\n        var styles = usePadding\n          ? {paddingTop: margin, paddingBottom: margin}\n          : {marginTop: margin, marginBottom: margin}\n\n        element.css(styles)\n        element.addClass('vertical-aligned')\n\n        if (prevMargin !== margin) {\n          $scope.$emit('ui_height')\n        }\n\n        prevMargin = margin\n      }\n\n      $($window).on('resize', updateMargin)\n\n      onContentLoaded(updateMargin)\n\n      $scope.$on('ui_height', function () {\n        onContentLoaded(updateMargin)\n      })\n    }\n  })\n\n  .directive('myUserStatus', function (_, $filter, $rootScope, AppUsersManager) {\n    var statusFilter = $filter('userStatus')\n    var ind = 0\n    var statuses = {}\n\n    setInterval(updateAll, 90000)\n\n    $rootScope.$on('stateSynchronized', function () {\n      setTimeout(function () {\n        updateAll()\n      }, 100)\n    })\n\n    return {\n      link: link\n    }\n\n    function updateAll () {\n      angular.forEach(statuses, function (update) {\n        update()\n      })\n    }\n\n    function link ($scope, element, attrs) {\n      var userID\n      var curInd = ind++\n      var forDialog = attrs.forDialog && $scope.$eval(attrs.forDialog)\n\n      var update = function () {\n        var user = AppUsersManager.getUser(userID)\n        if (forDialog && user.pFlags.self) {\n          element.html('')\n        } else {\n          element\n            .html(statusFilter(user, attrs.botChatPrivacy))\n            .toggleClass('status_online', (user.status && user.status._ == 'userStatusOnline') || false)\n        }\n        // console.log(dT(), 'update status', element[0], user.status && user.status, tsNow(true), element.html())\n      }\n\n      $scope.$watch(attrs.myUserStatus, function (newUserID) {\n        userID = newUserID\n        update()\n      })\n      $scope.$on('user_update', function (e, updUserID) {\n        if (userID == updUserID) {\n          update()\n        }\n      })\n      statuses[curInd] = update\n      $scope.$on('$destroy', function () {\n        delete statuses[curInd]\n      })\n    }\n  })\n\n  .directive('myChatStatus', function ($rootScope, _, MtpApiManager, AppChatsManager, AppUsersManager, AppProfileManager) {\n    var ind = 0\n    var statuses = {}\n\n    var allPluralize = _.pluralize('group_modal_pluralize_participants')\n    var onlinePluralize = _.pluralize('group_modal_pluralize_online_participants')\n    var subscribersPluralize = _.pluralize('group_modal_pluralize_subscribers')\n\n    var myID = 0\n    MtpApiManager.getUserID().then(function (newMyID) {\n      myID = newMyID\n    })\n\n    setInterval(updateAll, 90000)\n\n    return {\n      link: link\n    }\n\n    function updateAll () {\n      angular.forEach(statuses, function (update) {\n        update()\n      })\n    }\n\n    function link ($scope, element, attrs) {\n      var chatID\n      var curInd = ind++\n      var jump = 0\n      var participantsCount = 0\n      var participants = {}\n\n      var updateParticipants = function () {\n        var curJump = ++jump\n        participantsCount = 0\n        participants = {}\n        var chat = AppChatsManager.getChat(chatID)\n        if (chat.participants_count) {\n          participantsCount = chat.participants_count\n        }\n        update()\n        if (!chatID || AppChatsManager.isChannel(chatID) && participantsCount) {\n          return\n        }\n        AppProfileManager.getChatFull(chatID).then(function (chatFull) {\n          if (curJump != jump) {\n            return\n          }\n          var participantsVector = (chatFull.participants || {}).participants || []\n          participantsCount = participantsVector.length\n          angular.forEach(participantsVector, function (participant) {\n            participants[participant.user_id] = true\n          })\n          if (chatFull.participants_count) {\n            participantsCount = chatFull.participants_count || 0\n          }\n          if (!participantsCount) {\n            var chat = AppChatsManager.getChat(chatID)\n            if (chat.participants_count) {\n              participantsCount = chat.participants_count\n            }\n          }\n          update()\n        })\n      }\n\n      var update = function () {\n        var html = AppChatsManager.isBroadcast(chatID)\n          ? subscribersPluralize(participantsCount)\n          : allPluralize(participantsCount)\n        var onlineCount = 0\n        if (!AppChatsManager.isChannel(chatID)) {\n          var wasMe = false\n          angular.forEach(participants, function (t, userID) {\n            var user = AppUsersManager.getUser(userID)\n            if (user.status && user.status._ == 'userStatusOnline') {\n              if (user.id == myID) {\n                wasMe = true\n              }\n              onlineCount++\n            }\n          })\n          if (onlineCount > 1 || onlineCount == 1 && !wasMe) {\n            html = _('group_modal_participants', {total: html, online: onlinePluralize(onlineCount)})\n          }\n        }\n        if (!onlineCount && !participantsCount) {\n          html = ''\n        }\n        element.html(html)\n      }\n\n      $scope.$watch(attrs.myChatStatus, function (newChatID) {\n        chatID = newChatID\n        updateParticipants()\n      })\n\n      $rootScope.$on('chat_full_update', function (e, updChatID) {\n        if (chatID == updChatID) {\n          updateParticipants()\n        }\n      })\n\n      $rootScope.$on('user_update', function (e, updUserID) {\n        if (participants[updUserID]) {\n          update()\n        }\n      })\n\n      statuses[curInd] = update\n      $scope.$on('$destroy', function () {\n        delete statuses[curInd]\n      })\n    }\n  })\n\n  .directive('myPeerMuted', function ($rootScope, NotificationsManager) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var peerID = $scope.$eval(attrs.myPeerMuted)\n      var className = attrs.mutedClass || 'muted'\n      var unsubscribe = $rootScope.$on('notify_settings', function (e, data) {\n        if (data.peerID == peerID) {\n          updateClass(peerID, element, className)\n        }\n      })\n      updateClass(peerID, element, className)\n\n      $scope.$on('$destroy', unsubscribe)\n    }\n\n    function updateClass (peerID, element, className) {\n      NotificationsManager.getPeerMuted(peerID).then(function (muted) {\n        element.toggleClass(className, muted)\n      })\n    }\n  })\n\n  .directive('myPeerLink', function (_, $rootScope, AppPeersManager, AppChatsManager, AppUsersManager, AppMessagesIDsManager) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var override = attrs.userOverride && $scope.$eval(attrs.userOverride) || {}\n      var short = attrs.short && $scope.$eval(attrs.short)\n      var username = attrs.username && $scope.$eval(attrs.username)\n      var forDialog = attrs.forDialog && $scope.$eval(attrs.forDialog)\n\n      var peerID\n      var update = function () {\n        if (element[0].className.indexOf('user_color_') != -1) {\n          element[0].className = element[0].className.replace(/user_color_\\d+/g, '')\n        }\n        if (peerID > 0) {\n          var user = AppUsersManager.getUser(peerID)\n          if (forDialog && user.pFlags.self) {\n            element.text(_('user_name_saved_msgs_raw'))\n          } else {\n            var prefix = username ? '@' : ''\n            var key = username ? 'username' : (short ? 'rFirstName' : 'rFullName')\n\n            element.html(\n              prefix +\n              (override[key] || user[key] || '').valueOf() +\n              (attrs.verified && user.pFlags && user.pFlags.verified ? ' <i class=\"icon-verified\"></i>' : '')\n            )\n\n            if (attrs.color && $scope.$eval(attrs.color)) {\n              element.addClass('user_color_' + user.num)\n            }\n          }\n        } else {\n          var chat = AppChatsManager.getChat(-peerID)\n\n          element.html(\n            (chat.rTitle || '').valueOf() +\n            (attrs.verified && chat.pFlags && chat.pFlags.verified ? ' <i class=\"icon-verified\"></i>' : '')\n          )\n        }\n      }\n\n      if (element[0].tagName == 'A' && !hasOnclick(element[0])) {\n        element.on('click', function () {\n          if (peerID > 0) {\n            AppUsersManager.openUser(peerID, override)\n          } else {\n            var chatID = -peerID\n            var postID = attrs.postId && $scope.$eval(attrs.postId)\n            var savedFrom = attrs.savedFrom && $scope.$eval(attrs.savedFrom)\n            if (postID) {\n              $rootScope.$broadcast('history_focus', {\n                peerString: AppChatsManager.getChatString(chatID),\n                messageID: AppMessagesIDsManager.getFullMessageID(parseInt(postID), chatID)\n              })\n            } else if (savedFrom) {\n              var peerMid = savedFrom.split('_')\n              $rootScope.$broadcast('history_focus', {\n                peerString: AppPeersManager.getPeerString(peerMid[0]),\n                messageID: peerMid[1]\n              })\n            } else {\n              AppChatsManager.openChat(chatID)\n            }\n          }\n        })\n      }\n\n      if (attrs.peerWatch) { // userWatch, chatWatch\n        $scope.$watch(attrs.myPeerLink, function (newPeerID) {\n          peerID = newPeerID\n          update()\n        })\n      } else {\n        peerID = $scope.$eval(attrs.myPeerLink)\n        update()\n      }\n      if (!attrs.noWatch) {\n        $scope.$on('user_update', function (e, updUserID) {\n          if (peerID == updUserID) {\n            update()\n          }\n        })\n        $scope.$on('chat_update', function (e, updChatID) {\n          if (peerID == -updChatID) {\n            update()\n          }\n        })\n      }\n    }\n  })\n\n  .directive('myPeerPhotolink', function (AppPeersManager, AppUsersManager, AppChatsManager, MtpApiFileManager, FileManager) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      element.addClass('peer_photo_init')\n\n      var peerID, peer\n      var peerPhoto\n      var imgEl = $('<img class=\"' + (attrs.imgClass || '') + '\">')\n      var initEl = $('<span class=\"peer_initials nocopy ' + (attrs.imgClass || '') + '\"></span>')\n      var jump = 0\n      var prevClass = false\n      var forDialog = attrs.forDialog && $scope.$eval(attrs.forDialog)\n\n      var setPeerID = function (newPeerID) {\n        if (peerID == newPeerID) {\n          return false\n        }\n        peerID = newPeerID\n        peer = AppPeersManager.getPeer(peerID)\n\n        var newClass = 'user_bgcolor_' + (peer.num || 1)\n        if (newClass != prevClass) {\n          if (prevClass) {\n            initEl.removeClass(prevClass)\n          }\n          initEl.addClass(newClass)\n          prevClass = newClass\n        }\n\n        updatePeerPhoto()\n\n        return true\n      }\n\n      var updatePeerPhoto = function () {\n        var curJump = ++jump\n\n        peerPhoto = peer.photo && angular.copy(peer.photo.photo_small)\n\n        if (forDialog && peer.pFlags && peer.pFlags.self) {\n          initEl.remove()\n          imgEl.prependTo(element).attr('src', 'img/placeholders/Fave.png')\n          return\n        }\n\n        var hasPhoto = peerPhoto !== undefined\n\n        if (hasPhoto) {\n          var cachedBlob = MtpApiFileManager.getCachedFile(peer.photo.photo_small)\n          if (cachedBlob) {\n            initEl.remove()\n            imgEl.prependTo(element).attr('src', FileManager.getUrl(cachedBlob, 'image/jpeg'))\n            return\n          }\n        }\n\n        initEl.attr('data-content', peer.initials || '').prependTo(element)\n        imgEl.remove()\n\n        if (hasPhoto) {\n          MtpApiFileManager.downloadSmallFile(peer.photo.photo_small).then(function (blob) {\n            if (curJump != jump) {\n              return\n            }\n            initEl.remove()\n            imgEl.prependTo(element).attr('src', FileManager.getUrl(blob, 'image/jpeg'))\n          }, function (e) {\n            console.log('Download image failed', e, peer.photo.photo_small, element[0])\n          })\n        }\n      }\n\n      if (element[0].tagName == 'A' && !attrs.noOpen) {\n        element.on('click', function (e) {\n          if (peerID > 0) {\n            AppUsersManager.openUser(peerID, attrs.userOverride && $scope.$eval(attrs.userOverride))\n          } else {\n            AppChatsManager.openChat(-peerID)\n          }\n        })\n      }\n\n      $scope.$watch(attrs.myPeerPhotolink, setPeerID)\n      setPeerID($scope.$eval(attrs.myPeerPhotolink))\n\n      if (attrs.watch) {\n        $scope.$on('user_update', function (e, updUserID) {\n          if (peerID == updUserID) {\n            peer = AppPeersManager.getPeer(peerID)\n            if (!angular.equals(peer.photo && peer.photo.photo_small, peerPhoto) ||\n                !peerPhoto) {\n              updatePeerPhoto()\n            }\n          }\n        })\n        $scope.$on('chat_update', function (e, updChatID) {\n          if (peerID == -updChatID) {\n            if (!angular.equals(peer.photo && peer.photo.photo_small, peerPhoto)) {\n              updatePeerPhoto()\n            }\n          }\n        })\n      }\n    }\n  })\n\n  .directive('myOgvPlayer', function ($compile) {\n    return {\n      link: function ($scope, $element, $attrs) {\n        var audio = $scope.audio\n        var playerEl\n        if (audio.mime_type == 'audio/ogg' &&\n            // false &&\n            OGVCompat.hasWebAudio() && // we don't want to use Flash\n            OGVCompat.supported('OGVPlayer')) {\n          playerEl = new OGVPlayer({debug: false, worker: false})\n        } else {\n          playerEl = document.createElement('audio')\n        }\n\n        $(playerEl).attr('media-player', $attrs.myOgvPlayer)\n        $(playerEl).attr('src', '{{::' + $attrs.src + '}}')\n\n        $compile(playerEl)($scope)\n        $($element).append(playerEl)\n      }\n    }\n  })\n\n  .directive('myAudioPlayer', function ($timeout, $q, Storage, AppDocsManager, AppMessagesManager, ErrorService) {\n    var currentPlayerScope = false\n    var audioVolume = 0.5\n\n    Storage.get('audio_volume').then(function (newAudioVolume) {\n      if (newAudioVolume > 0 && newAudioVolume <= 1.0) {\n        audioVolume = newAudioVolume\n      }\n    })\n\n    var onAudioError = function (event) {\n      if (!event.target ||\n        !event.target.error ||\n        event.target.error.code == event.target.error.MEDIA_ERR_DECODE ||\n        event.target.error.code == event.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED) {\n        ErrorService.show({\n          error: {\n            type: 'MEDIA_TYPE_NOT_SUPPORTED',\n            originalError: event.target && event.target.error\n          }\n        })\n      }\n    }\n\n    return {\n      link: link,\n      scope: {\n        audio: '='\n      },\n      templateUrl: templateUrl('audio_player')\n    }\n\n    function checkAudioPlayer (newPlayerScope) {\n      if (newPlayerScope === currentPlayerScope) {\n        return false\n      }\n      if (currentPlayerScope) {\n        ;(function ($scope) {\n          setZeroTimeout(function () {\n            $scope.mediaPlayer.player.pause()\n          })\n        })(currentPlayerScope)\n      }\n      currentPlayerScope = newPlayerScope\n    }\n\n    function link ($scope, element, attrs) {\n      AppDocsManager.updateDocDownloaded($scope.audio.id)\n\n      $scope.volume = audioVolume\n      $scope.mediaPlayer = {}\n      if ($scope.$parent.messageId) {\n        $scope.message = AppMessagesManager.wrapForHistory($scope.$parent.messageId)\n      }\n\n      $scope.download = function () {\n        AppDocsManager.saveDocFile($scope.audio.id)\n      }\n\n      $scope.duration = function () {\n        if ($scope.mediaPlayer.player &&\n            $scope.mediaPlayer.player.duration > 0 &&\n            $scope.mediaPlayer.player.duration < Infinity) {\n          return $scope.mediaPlayer.player.duration\n        }\n        return $scope.audio && $scope.audio.duration || 0\n      }\n\n      $scope.togglePlay = function () {\n        if ($scope.audio.url) {\n          checkAudioPlayer($scope)\n          setZeroTimeout(function () {\n            $scope.mediaPlayer.player.playPause()\n          })\n        } else if ($scope.audio.progress && $scope.audio.progress.enabled) {\n        } else {\n          AppDocsManager.downloadDoc($scope.audio.id).then(function () {\n            onContentLoaded(function () {\n              var errorListenerEl = $('audio, ogvjs', element)[0] || element[0]\n              if (errorListenerEl) {\n                var errorAlready = false\n                var onAudioError = function (event) {\n                  if (errorAlready) {\n                    return\n                  }\n                  if (!event.target ||\n                    !event.target.error ||\n                    event.target.error.code == event.target.error.MEDIA_ERR_DECODE ||\n                    event.target.error.code == event.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED) {\n                    errorAlready = true\n                    ErrorService.show({\n                      error: {\n                        type: 'MEDIA_TYPE_NOT_SUPPORTED',\n                        originalError: event.target && event.target.error\n                      }\n                    })\n                  }\n                }\n\n                errorListenerEl.addEventListener('error', onAudioError, true)\n                $scope.$on('$destroy', function () {\n                  errorAlready = true\n                  errorListenerEl.removeEventListener('error', onAudioError)\n                })\n              }\n              setTimeout(function () {\n                checkAudioPlayer($scope)\n                $scope.mediaPlayer.player.setVolume(audioVolume)\n                $scope.mediaPlayer.player.play()\n\n                if ($scope.message &&\n                    !$scope.message.pFlags.out &&\n                    $scope.message.pFlags.media_unread) {\n                  AppMessagesManager.readMessages([$scope.message.mid])\n                }\n              }, 300)\n            })\n          })\n        }\n      }\n\n      $scope.seek = function (position) {\n        if ($scope.mediaPlayer && $scope.mediaPlayer.player) {\n          $scope.mediaPlayer.player.seek(position)\n        } else {\n          $scope.togglePlay()\n        }\n      }\n      $scope.setVolume = function (volume) {\n        audioVolume = volume\n        Storage.set({audio_volume: volume})\n        if ($scope.mediaPlayer && $scope.mediaPlayer.player) {\n          $scope.mediaPlayer.player.setVolume(volume)\n        }\n      }\n    }\n  })\n\n  .directive('mySlider', function ($window) {\n    return {\n      link: link,\n      templateUrl: templateUrl('slider')\n    }\n\n    function link ($scope, element, attrs) {\n      var wrap = $('.tg_slider_wrap', element)\n      var fill = $('.tg_slider_track_fill', element)\n      var thumb = $('.tg_slider_thumb', element)\n      var width = wrap.width()\n      var thumbWidth = Math.ceil(thumb.width())\n      var model = attrs.sliderModel\n      var sliderCallback = attrs.sliderOnchange\n      var minValue = 0.0\n      var maxValue = 1.0\n      var lastUpdValue = false\n      var lastMinPageX = false\n\n      if (attrs.sliderMin) {\n        $scope.$watch(attrs.sliderMin, function (newMinValue) {\n          minValue = newMinValue || 0.0\n        })\n      }\n      if (attrs.sliderMax) {\n        $scope.$watch(attrs.sliderMax, function (newMaxValue) {\n          maxValue = newMaxValue || 1.0\n        })\n      }\n\n      var onSliderMove = function (e) {\n        e = e.originalEvent || e\n\n        var offsetX = (e.touches && e.touches[0] ? e.touches[0].pageX : e.pageX) - lastMinPageX\n        offsetX = Math.min(width, Math.max(0, offsetX))\n        // console.log(e.type, lastMinPageX, e.pageX, offsetX)\n        lastUpdValue = minValue + offsetX / width * (maxValue - minValue)\n        if (sliderCallback) {\n          $scope.$eval(sliderCallback, {value: lastUpdValue})\n        } else {\n          $scope.$eval(model + '=' + lastUpdValue)\n        }\n\n        thumb.css('left', Math.max(0, offsetX - thumbWidth))\n        fill.css('width', offsetX)\n\n        return cancelEvent(e)\n      }\n      var stopSliderTrack = function () {\n        $($window).off('mousemove touchmove', onSliderMove)\n        $($window).off('mouseup touchend touchcancel touchleave', stopSliderTrack)\n      }\n\n      $scope.$watch(model, function (newVal) {\n        if (newVal != lastUpdValue && newVal !== undefined) {\n          var percent = Math.max(0, (newVal - minValue) / (maxValue - minValue))\n          if (width) {\n            var offsetX = Math.ceil(width * percent)\n            offsetX = Math.min(width, Math.max(0, offsetX))\n            thumb.css('left', Math.max(0, offsetX - thumbWidth))\n            fill.css('width', offsetX)\n          } else {\n            thumb.css('left', percent * 100 + '%')\n            fill.css('width', percent * 100 + '%')\n          }\n          lastUpdValue = false\n        }\n      })\n\n      element.on('dragstart selectstart', cancelEvent)\n\n      element.on('mousedown touchstart', function (e) {\n        if (!width) {\n          width = wrap.width()\n          if (!width) {\n            console.error('empty width')\n            return cancelEvent(e)\n          }\n        }\n        stopSliderTrack()\n\n        e = e.originalEvent || e\n\n        var offsetX\n        if (e.touches && e.touches[0]) {\n          lastMinPageX = element.position().left\n          offsetX = e.touches[0].pageX - lastMinPageX\n        } else if (e.offsetX !== undefined) {\n          offsetX = e.offsetX\n          lastMinPageX = e.pageX - offsetX\n        } else if (e.layerX !== undefined) {\n          offsetX = e.layerX\n          lastMinPageX = e.pageX - offsetX\n        } else {\n          return cancelEvent(e)\n        }\n\n        // console.log(e.type, e, lastMinPageX, e.pageX, offsetX)\n        lastUpdValue = minValue + offsetX / width * (maxValue - minValue)\n        if (sliderCallback) {\n          $scope.$eval(sliderCallback, {value: lastUpdValue})\n        } else {\n          $scope.$eval(model + '=' + lastUpdValue)\n        }\n\n        thumb.css('left', Math.max(0, offsetX - thumbWidth))\n        fill.css('width', offsetX)\n\n        $($window).on('mousemove touchmove', onSliderMove)\n        $($window).on('mouseup touchend touchcancel touchleave', stopSliderTrack)\n\n        return cancelEvent(e)\n      })\n    }\n  })\n\n  .directive('myLabeledInput', function () {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var input = $('.md-input:first', element)\n      var label = $('.md-input-label:first', element)\n      var isDisabled = input[0] && input[0].tagName == 'SPAN'\n      var focused = false\n      var updateHasValueClass = function () {\n        if (isDisabled) {\n          element.toggleClass('md-input-has-value', input.html().length > 0)\n        } else {\n          element.toggleClass('md-input-has-value', focused || input.val().length > 0)\n        }\n      }\n\n      updateHasValueClass()\n      onContentLoaded(function () {\n        updateHasValueClass()\n        setZeroTimeout(function () {\n          element.addClass('md-input-animated')\n        })\n      })\n\n      if (!isDisabled) {\n        input.on('blur focus change', function (e) {\n          focused = e.type == 'focus'\n          element.toggleClass('md-input-focused', focused)\n          updateHasValueClass()\n        })\n      }\n\n      $scope.$on('value_updated', function () {\n        setZeroTimeout(function () {\n          updateHasValueClass()\n        })\n      })\n    }\n  })\n\n  .directive('myCopyField', function (toaster, _) {\n    return {\n      scope: {\n        selectEvent: '=myCopyField'\n      },\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      element.attr('readonly', 'true')\n      element[0].readonly = true\n      element.on('click', function () {\n        this.select()\n      })\n\n      if ($scope.selectEvent) {\n        $scope.$on($scope.selectEvent, function () {\n          setTimeout(function () {\n            element[0].focus()\n            element[0].select()\n          }, 100)\n        })\n      }\n    }\n  })\n\n  .directive('myCopyLink', function ($compile, $timeout, _) {\n    return {\n      restrict: 'A',\n      replace: false,\n      terminal: true,\n      priority: 1000,\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      element.attr('tooltip', '{{ttLabel}}')\n      element.removeAttr('my-copy-link')\n      element.removeAttr('data-my-copy-link')\n\n      var resetPromise = false\n      var resetTooltip = function () {\n        $timeout.cancel(resetPromise)\n        resetPromise = false\n        $scope.ttLabel = _('conversations_modal_share_url_copy_raw')\n      }\n\n      resetTooltip()\n\n      $compile(element)($scope)\n\n      var clipboard = new Clipboard(element[0])\n\n      clipboard.on('success', function (e) {\n        $timeout.cancel(resetPromise)\n        $scope.$apply(function () {\n          $scope.ttLabel = _('clipboard_copied_raw')\n        })\n        resetPromise = $timeout(resetTooltip, 2000)\n      })\n\n      clipboard.on('error', function (e) {\n        $timeout.cancel(resetPromise)\n        var langKey = Config.Navigator.osX\n          ? 'clipboard_press_cmd_c'\n          : 'clipboard_press_ctrl_c'\n        $scope.$apply(function () {\n          $scope.ttLabel = _(langKey + '_raw')\n        })\n        resetPromise = $timeout(resetTooltip, 5000)\n      })\n\n      $scope.$on('$destroy', function () {\n        clipboard.destroy()\n      })\n    }\n  })\n\n  .directive('mySubmitOnEnter', function () {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      element.on('keydown', function (event) {\n        if (event.keyCode == 13) {\n          element.trigger('submit')\n          return cancelEvent(event)\n        }\n      })\n    }\n  })\n\n  .directive('myArcProgress', function () {\n    var html =\n    '<svg class=\"progress-arc\" viewPort=\"0 0 100 100\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\\n  <defs>\\\n    <linearGradient id=\"grad_intermediate%id%\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\\\n      <stop offset=\"0%\" class=\"stop0\" />\\\n      <stop offset=\"60%\" class=\"stop60\" />\\\n      <stop offset=\"100%\"  class=\"stop100\"/>\\\n    </linearGradient>\\\n  </defs>\\\n  <circle class=\"progress-arc-bar\"></circle>\\\n</svg>'\n\n    function updateProgress (bar, progress, fullLen) {\n      progress = Math.max(0.0, Math.min(progress, 1.0))\n      var minProgress = 0.2\n      progress = minProgress + (1 - minProgress) * progress\n      bar.css({strokeDasharray: (progress * fullLen) + ', ' + ((1 - progress) * fullLen)})\n    }\n\n    var num = 0\n\n    return {\n      scope: {\n        progress: '=myArcProgress'\n      },\n      link: function ($scope, element, attrs) {\n        var intermediate = !attrs.myArcProgress\n        var width = attrs.width || element.width() || 40\n        var stroke = attrs.stroke || (width / 2 * 0.14)\n        var center = width / 2\n        var radius = center - (stroke / 2)\n\n        // Doesn't work without unique id for every gradient\n        var curNum = ++num\n\n        element\n          .html(html.replace('%id%', curNum))\n          .addClass('progress-arc-wrap')\n          .addClass(intermediate ? 'progress-arc-intermediate' : 'progress-arc-percent')\n          .css({width: width, height: width})\n\n        $(element[0].firstChild)\n          .attr('width', width)\n          .attr('height', width)\n\n        var bar = $('.progress-arc-bar', element)\n        bar\n          .attr('cx', center)\n          .attr('cy', center)\n          .attr('r', radius)\n          .css({strokeWidth: stroke})\n\n        var fullLen = 2 * Math.PI * radius\n        if (intermediate) {\n          updateProgress(bar, 0.3, fullLen)\n          bar.css({stroke: 'url(#grad_intermediate' + curNum + ')'})\n        } else {\n          $scope.$watch('progress', function (newProgress) {\n            updateProgress(bar, newProgress / 100.0, fullLen)\n          })\n        }\n      }\n    }\n  })\n\n  .directive('myScrollToOn', function () {\n    return {\n      link: function ($scope, element, attrs) {\n        var ev = attrs.myScrollToOn\n        var doScroll = function () {\n          onContentLoaded(function () {\n            $('html, body').animate({\n              scrollTop: element.offset().top\n            }, 200)\n          })\n        }\n        if (ev == '$init') {\n          doScroll()\n        } else {\n          $scope.$on(ev, doScroll)\n        }\n      }\n    }\n  })\n\n  .directive('myComposerDropdown', function () {\n    return {\n      templateUrl: templateUrl('composer_dropdown')\n    }\n  })\n\n  .directive('myEmojiSuggestions', function () {\n    return {\n      link: function ($scope, element, attrs) {\n        $scope.$watchCollection('emojiCodes', function (codes) {\n          // var codes = $scope.$eval(attrs.myEmojiSuggestions)\n          var html = []\n          var iconSize = Config.Mobile ? 26 : 20\n\n          var emoticonCode, emoticonData\n          var spritesheet, pos\n          var categoryIndex\n          var count = Math.min(5, codes.length)\n          var i, x, y\n\n          for (i = 0; i < count; i++) {\n            emoticonCode = codes[i]\n            if (emoticonCode.code) {\n              emoticonCode = emoticonCode.code\n            }\n            if (emoticonData = Config.Emoji[emoticonCode]) {\n              spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]\n              categoryIndex = spritesheet[0]\n              pos = spritesheet[1]\n              x = iconSize * spritesheet[3]\n              y = iconSize * spritesheet[2]\n              html.push('<li><a class=\"composer_emoji_option\" data-code=\"' + encodeEntities(emoticonCode) + '\"><i class=\"emoji emoji-w', iconSize, ' emoji-spritesheet-' + categoryIndex + '\" style=\"background-position: -' + x + 'px -' + y + 'px;\"></i><span class=\"composer_emoji_shortcut\">:' + encodeEntities(emoticonData[1][0]) + ':</span></a></li>')\n            }\n          }\n          // onContentLoaded(function () {\n          element.html(html.join(''))\n          console.log(dT(), 'emoji done')\n        // })\n        })\n      }\n    }\n  })\n\n  .directive('myInlineResults', function (AppPhotosManager, ExternalResourcesManager, AppDocsManager) {\n    return {\n      templateUrl: templateUrl('inline_results'),\n      scope: {\n        botResults: '=myInlineResults'\n      },\n\n      link: function ($scope, element, attrs) {\n        $scope.$watch('botResults.results', function (results) {\n          angular.forEach(results, function (result) {\n            if (result.thumb_url && !result.thumbUrl) {\n              ExternalResourcesManager.downloadByURL(result.thumb_url).then(function (url) {\n                result.thumbUrl = url\n              })\n            }\n            if (result.type == 'gif' && result.content_url && !result.contentUrl) {\n              ExternalResourcesManager.downloadByURL(result.content_url).then(function (url) {\n                result.contentUrl = url\n              })\n            }\n            if ((result.type == 'gif' || result.type == 'sticker') && result.document) {\n              AppDocsManager.downloadDoc(result.document.id)\n            }\n            var photoSize\n            if (result.type == 'photo' && result.photo) {\n              photoSize = AppPhotosManager.choosePhotoSize(result.photo, result.thumbW, result.thumbH)\n              var dim = calcImageInBox(photoSize.w, photoSize.h, result.thumbW, result.thumbH)\n              result.thumb = {\n                width: dim.w,\n                height: dim.h,\n                location: photoSize.location,\n                size: photoSize.size\n              }\n            }\n            if (result.type == 'game' && result.photo) {\n              photoSize = AppPhotosManager.choosePhotoSize(result.photo, 100, 100)\n              // var dim = calcImageInBox(photoSize.w, photoSize.h, result.thumbW, result.thumbH)\n              result.thumb = {\n                // width: dim.w,\n                // height: dim.h,\n                location: photoSize.location,\n                size: photoSize.size\n              }\n            }\n          })\n        })\n      }\n    }\n  })\n\n  .directive('myGameCommunication', function ($window) {\n    function link ($scope, element, attrs) {\n      onContentLoaded(function () {\n        var iframe = $('iframe, webview', element)[0]\n        var contentWindow = iframe.contentWindow\n        var handler = function (event) {\n          event = event.originalEvent || event\n          if (event.source && event.source != contentWindow) {\n            return\n          }\n          var data = event.data\n          try {\n            var dataParsed = JSON.parse(data)\n          } catch (e) {\n            return\n          }\n          if (!dataParsed || !dataParsed.eventType) {\n            return\n          }\n          $scope.$emit('game_frame_event', dataParsed)\n        }\n\n        $($window).on('message', handler)\n\n        $scope.$on('$destroy', function () {\n          $($window).off('message', handler)\n        })\n      })\n    }\n\n    return {\n      link: link\n    }\n  })\n\n  .directive('myEmojiImage', function (RichTextProcessor) {\n    function link ($scope, element, attrs) {\n      var emoji = attrs.myEmojiImage\n      var html = RichTextProcessor.wrapRichText(emoji, {noLinks: true, noLinebreaks: true})\n      element.html(html.valueOf())\n    }\n\n    return {\n      link: link\n    }\n  })\n\n  .directive('myExternalEmbed', function () {\n    var twitterAttached = false\n    var facebookAttached = false\n    var gplusAttached = false\n    var twitterPendingWidgets = []\n    var facebookPendingWidgets = []\n    var embedTag = Config.Modes.chrome_packed ? 'webview' : 'iframe'\n\n    function link ($scope, element, attrs) {\n      var embedData = $scope.$eval(attrs.myExternalEmbed)\n      if (!embedData) {\n        return\n      }\n      var html = ''\n      var callback = false\n      var needTwitter = false\n      var videoID\n      switch (embedData[0]) {\n        case 'youtube':\n          videoID = embedData[1]\n          html = '<div class=\"im_message_media_embed im_message_video_embed\"><' + embedTag + ' type=\"text/html\" frameborder=\"0\" ' +\n            'src=\"https://www.youtube.com/embed/' + videoID +\n            '?autoplay=0&amp;controls=2\" webkitallowfullscreen mozallowfullscreen allowfullscreen></' + embedTag + '></div>'\n          break\n\n        case 'vimeo':\n          videoID = embedData[1]\n          html = '<div class=\"im_message_media_embed im_message_video_embed\"><' + embedTag + ' type=\"text/html\" frameborder=\"0\" ' +\n            'src=\"https://player.vimeo.com/video/' + videoID +\n            '?title=0&amp;byline=0&amp;portrait=0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></' + embedTag + '></div>'\n          break\n\n        case 'instagram':\n          var instaID = embedData[1]\n          html = '<div class=\"im_message_media_embed im_message_insta_embed\"><' + embedTag + ' type=\"text/html\" frameborder=\"0\" ' +\n            'src=\"https://instagram.com/p/' + instaID +\n            '/embed/\"></' + embedTag + '></div>'\n          break\n\n        case 'vine':\n          var vineID = embedData[1]\n          html = '<div class=\"im_message_media_embed im_message_vine_embed\"><' + embedTag + ' type=\"text/html\" frameborder=\"0\" ' +\n            'src=\"https://vine.co/v/' + vineID + '/embed/simple\"></' + embedTag + '></div>'\n          break\n\n        case 'soundcloud':\n          var soundcloudUrl = embedData[1]\n          html = '<div class=\"im_message_media_embed im_message_soundcloud_embed\"><' + embedTag + ' type=\"text/html\" frameborder=\"0\" ' +\n            'src=\"https://w.soundcloud.com/player/?url=' + encodeEntities(encodeURIComponent(soundcloudUrl)) +\n            '&amp;auto_play=false&amp;hide_related=true&amp;show_comments=false&amp;show_user=true&amp;show_reposts=false&amp;visual=true\"></' + embedTag + '></div>'\n          break\n\n        case 'spotify':\n          var spotifyUrl = embedData[1]\n          html = '<div class=\"im_message_media_embed im_message_spotify_embed\"><' + embedTag + ' type=\"text/html\" frameborder=\"0\" allowtransparency=\"true\" ' +\n            'src=\"https://embed.spotify.com/?uri=spotify:' + encodeEntities(encodeURIComponent(spotifyUrl)) +\n            '\"></' + embedTag + '></div>'\n          break\n\n        case 'twitter':\n          html = '<div class=\"im_message_twitter_embed\"><blockquote class=\"twitter-tweet\" lang=\"en\"><a href=\"' + embedData[1] + '\"></a></blockquote></div>'\n\n          callback = function () {\n            if (!twitterAttached) {\n              twitterAttached = true\n              $('<script>')\n                .appendTo('body')\n                .on('load', function () {\n                  twttr.events.bind('loaded', function (event) {\n                    for (var i = 0; i < twitterPendingWidgets.length; i++) {\n                      twitterPendingWidgets[i].$emit('ui_height')\n                    }\n                    twitterPendingWidgets = []\n                  })\n                })\n                .attr('src', 'https://platform.twitter.com/widgets.js')\n            } else if (window.twttr) {\n              twttr.widgets.load(element[0])\n            }\n            twitterPendingWidgets.push($scope)\n          }\n          break\n\n        case 'facebook':\n          html = '<div class=\"im_message_facebook_embed\"><div class=\"fb-post\" data-href=\"' + embedData[1] + '\" data-width=\"300\"></div></div>'\n\n          callback = function () {\n            if (!facebookAttached) {\n              facebookAttached = true\n              $('<script>')\n                .appendTo('body')\n                .on('load', function () {\n                  FB.Event.subscribe('xfbml.render', function (event) {\n                    for (var i = 0; i < facebookPendingWidgets.length; i++) {\n                      facebookPendingWidgets[i].$emit('ui_height')\n                    }\n                    facebookPendingWidgets = []\n                  })\n                })\n                .attr('src', 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&appId=254098051407226&version=v2.0')\n            } else if (window.FB) {\n              FB.XFBML.parse(element[0])\n            }\n            facebookPendingWidgets.push($scope)\n          }\n          break\n\n        case 'gplus':\n          html = '<div class=\"im_message_gplus_embed\"><div class=\"g-post\" data-href=\"' + embedData[1] + '\"></div></div>'\n\n          callback = function () {\n            if (!gplusAttached) {\n              gplusAttached = true\n\n              window.___gcfg = {'parsetags': 'explicit'}\n              $('<script>')\n                .appendTo('body')\n                .on('load', function () {\n                  gapi.post.go()\n                })\n                .attr('src', 'https://apis.google.com/js/plusone.js')\n            } else if (window.gapi) {\n              gapi.post.go(element[0])\n            }\n            element.one('load', function () {\n              $scope.$emit('ui_height')\n            })\n          }\n          break\n      }\n\n      if (html) {\n        element[0].innerHTML = html\n        if (callback) {\n          callback()\n        }\n      }\n    }\n\n    return {\n      link: link\n    }\n  })"
  },
  {
    "path": "app/js/directives_mobile.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n\n/* Directives */\n\nangular.module('myApp.directives')\n\n  .directive('myDialogsListMobile', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var dialogsColWrap = $('.im_dialogs_col_wrap')[0]\n      var scrollableWrap = element[0]\n      var headWrap = $('.tg_page_head')[0]\n      var panelWrapSelector = attrs.modal\n        ? '.mobile_modal_body .im_dialogs_panel'\n        : '.im_dialogs_panel'\n      var panelWrap = $(panelWrapSelector)[0]\n      var moreNotified = false\n\n      $scope.$on('ui_dialogs_search', updateSizes)\n      $scope.$on('ui_dialogs_update', updateSizes)\n\n      $scope.$on('ui_dialogs_append', function () {\n        onContentLoaded(function () {\n          moreNotified = false\n\n          $timeout(function () {\n            $(scrollableWrap).trigger('scroll')\n          })\n        })\n      })\n\n      $scope.$on('ui_dialogs_change', function () {\n        onContentLoaded(function () {\n          moreNotified = false\n\n          $timeout(function () {\n            $(scrollableWrap).trigger('scroll')\n          })\n        })\n      })\n\n      $(scrollableWrap).on('scroll', function (e) {\n        if (!element.is(':visible')) return\n        if (!moreNotified && scrollableWrap.scrollTop >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) {\n          $scope.$emit('dialogs_need_more')\n          moreNotified = true\n        }\n      })\n\n      function updateSizes () {\n        if (!panelWrap || !panelWrap.offsetHeight) {\n          panelWrap = $(panelWrapSelector)[0]\n        }\n\n        if (attrs.modal) {\n          $(element).css({\n            height: $($window).height() -\n              (panelWrap ? panelWrap.offsetHeight : 58) - 46\n          })\n          return\n        }\n\n        if (!headWrap || !headWrap.offsetHeight) {\n          headWrap = $('.tg_page_head')[0]\n        }\n\n        if (!dialogsColWrap || !dialogsColWrap.offsetHeight) {\n          dialogsColWrap = $('.im_dialogs_col_wrap')[0]\n        }\n        $(element).css({\n          height: $($window).height() -\n            (headWrap ? headWrap.offsetHeight : 46) -\n            (panelWrap ? panelWrap.offsetHeight : 58) -\n            parseInt($(dialogsColWrap).css('paddingBottom') || 0)\n        })\n      }\n\n      $($window).on('resize', updateSizes)\n\n      updateSizes()\n      setTimeout(updateSizes, 1000)\n    }\n  })\n\n  .directive('myHistoryMobile', function ($window, $timeout, $rootScope, $transition) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var historyWrap = $('.im_history_wrap', element)[0]\n      var historyMessagesEl = $('.im_history_messages', element)[0]\n      var scrollableWrap = $('.im_history_scrollable_wrap', element)[0]\n      var scrollable = $('.im_history_scrollable', element)[0]\n      var bottomPanelWrap = $('.im_bottom_panel_wrap', element)[0]\n      var sendFormWrap = $('.im_send_form_wrap', element)[0]\n      var headWrap = $('.tg_page_head')[0]\n      var pinnedPanelEl = $('.im_history_pinned_panel', element)[0]\n      var sendForm = $('.im_send_form', element)[0]\n      var moreNotified = false\n      var lessNotified = false\n\n      onContentLoaded(function () {\n        scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n      })\n\n      $scope.$on('ui_history_append_new', function (e, options) {\n        if (!atBottom && !options.my) {\n          return\n        }\n\n        var pr = parseInt($(scrollableWrap).css('paddingRight'))\n        $(scrollableWrap).addClass('im_history_to_bottom')\n        $(scrollable).css({bottom: 0, marginLeft: -Math.ceil(pr / 2)})\n\n        onContentLoaded(function () {\n          $(scrollableWrap).removeClass('im_history_to_bottom')\n          $(scrollable).css({bottom: '', marginLeft: ''})\n          scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n          updateBottomizer()\n        })\n      })\n\n      function changeScroll () {\n        var unreadSplit\n        var focusMessage\n\n        // console.trace('change scroll')\n        if (focusMessage = $('.im_message_focus:visible', scrollableWrap)[0]) {\n          var ch = scrollableWrap.clientHeight\n          var st = scrollableWrap.scrollTop\n          var ot = focusMessage.offsetTop\n          var h = focusMessage.clientHeight\n          if (!st || st + ch < ot || st > ot + h) {\n            scrollableWrap.scrollTop = Math.max(0, ot - Math.floor(ch / 2) + 26)\n          }\n          atBottom = false\n        } else if (unreadSplit = $('.im_message_unread_split:visible', scrollableWrap)[0]) {\n          // console.log('change scroll unread', unreadSplit.offsetTop)\n          scrollableWrap.scrollTop = Math.max(0, unreadSplit.offsetTop - 52)\n          atBottom = false\n        } else {\n          // console.log('change scroll bottom')\n          scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n          atBottom = true\n        }\n        $timeout(function () {\n          $(scrollableWrap).trigger('scroll')\n          scrollTopInitial = scrollableWrap.scrollTop\n        })\n      }\n\n      $scope.$on('ui_history_change', function () {\n        var pr = parseInt($(scrollableWrap).css('paddingRight'))\n        $(scrollableWrap).addClass('im_history_to_bottom')\n        $(scrollable).css({bottom: 0, marginLeft: -Math.ceil(pr / 2)})\n        onContentLoaded(function () {\n          $(scrollableWrap).removeClass('im_history_to_bottom')\n          $(scrollable).css({bottom: '', marginLeft: ''})\n          updateSizes(true)\n          moreNotified = false\n          lessNotified = false\n          changeScroll()\n        })\n      })\n\n      $scope.$on('ui_history_change_scroll', function () {\n        onContentLoaded(changeScroll)\n      })\n\n      $scope.$on('ui_history_focus', function () {\n        if (!atBottom) {\n          scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n          atBottom = true\n        }\n      })\n\n      $scope.$on('ui_history_prepend', function () {\n        var sh = scrollableWrap.scrollHeight\n        var st = scrollableWrap.scrollTop\n        var pr = parseInt($(scrollableWrap).css('paddingRight'))\n        var ch = scrollableWrap.clientHeight\n\n        $(scrollableWrap).addClass('im_history_to_bottom')\n        scrollableWrap.scrollHeight // Some strange Chrome bug workaround\n        $(scrollable).css({bottom: -(sh - st - ch), marginLeft: -Math.ceil(pr / 2)})\n\n        var upd = function () {\n            $(scrollableWrap).removeClass('im_history_to_bottom')\n            $(scrollable).css({bottom: '', marginLeft: ''})\n            if (scrollTopInitial >= 0) {\n              changeScroll()\n            } else {\n              scrollableWrap.scrollTop = st + scrollableWrap.scrollHeight - sh\n            }\n\n            updateBottomizer()\n            moreNotified = false\n\n            $timeout(function () {\n              if (scrollableWrap.scrollHeight != sh) {\n                $(scrollableWrap).trigger('scroll')\n              }\n            })\n\n            clearTimeout(timer)\n            unreg()\n          },\n          timer = setTimeout(upd, 0),\n          unreg = $scope.$on('$viewContentLoaded', upd)\n      })\n\n      $scope.$on('ui_history_append', function () {\n        var sh = scrollableWrap.scrollHeight\n        onContentLoaded(function () {\n          atBottom = false\n          updateBottomizer()\n          lessNotified = false\n\n          if (scrollTopInitial >= 0) {\n            changeScroll()\n          }\n\n          $timeout(function () {\n            if (scrollableWrap.scrollHeight != sh) {\n              $(scrollableWrap).trigger('scroll')\n            }\n          })\n        })\n      })\n\n      $scope.$on('ui_panel_update', function (e, data) {\n        onContentLoaded(function () {\n          updateSizes()\n          if (data && data.blur) {\n            $scope.$broadcast('ui_message_blur')\n          } else {\n            $scope.$broadcast('ui_message_send')\n          }\n\n          $timeout(function () {\n            $(scrollableWrap).trigger('scroll')\n          })\n        })\n      })\n\n      $scope.$on('ui_selection_clear', function () {\n        if (window.getSelection) {\n          if (window.getSelection().empty) { // Chrome\n            window.getSelection().empty()\n          } else if (window.getSelection().removeAllRanges) { // Firefox\n            window.getSelection().removeAllRanges()\n          }\n        } else if (document.selection) { // IE?\n          document.selection.empty()\n        }\n      })\n\n      $scope.$on('ui_editor_resize', updateSizes)\n      $scope.$on('ui_height', function () {\n        onContentLoaded(updateSizes)\n      })\n\n      var atBottom = true\n      var scrollTopInitial = -1\n      $(scrollableWrap).on('scroll', function (e) {\n        if (!element.is(':visible') ||\n          $(scrollableWrap).hasClass('im_history_to_bottom')) {\n          return\n        }\n        var st = scrollableWrap.scrollTop\n        atBottom = st >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight\n        if (scrollTopInitial >= 0 && scrollTopInitial != st) {\n          scrollTopInitial = -1\n        }\n\n        if (!moreNotified && st <= 300) {\n          moreNotified = true\n          $scope.$emit('history_need_more')\n        }\n        else if (!lessNotified && st >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) {\n          lessNotified = true\n          $scope.$emit('history_need_less')\n        }\n      })\n\n      function updateSizes (heightOnly) {\n        if (!element.is(':visible') && !$(element[0].parentNode.parentNode).is(':visible')) {\n          return\n        }\n        if ($(sendFormWrap).is(':visible')) {\n          $(sendFormWrap).css({\n            height: $(sendForm).height()\n          })\n        }\n\n        if (!headWrap || !headWrap.offsetHeight) {\n          headWrap = $('.tg_page_head')[0]\n        }\n        if (!pinnedPanelEl || !pinnedPanelEl.offsetHeight) {\n          pinnedPanelEl = $('.im_history_pinned_panel', element)[0]\n        }\n        var pinnedHeight = pinnedPanelEl && pinnedPanelEl.offsetHeight || 0\n\n        var historyH = $($window).height() - bottomPanelWrap.offsetHeight - (headWrap ? headWrap.offsetHeight : 46) - pinnedHeight\n        $(historyWrap).css({\n          height: historyH\n        })\n\n        updateBottomizer()\n\n        if (heightOnly === true) return\n        if (atBottom) {\n          onContentLoaded(function () {\n            scrollableWrap.scrollTop = scrollableWrap.scrollHeight\n          })\n        }\n      }\n\n      function updateBottomizer () {}\n\n      $($window).on('resize', updateSizes)\n\n      updateSizes()\n      onContentLoaded(updateSizes)\n    }\n  })\n\n  .directive('myContactsListMobile', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var searchWrap = $('.contacts_modal_search')[0]\n      var panelWrap = $('.contacts_modal_panel')[0]\n\n      function updateSizes () {\n        $(element).css({\n          height: $($window).height() -\n            (panelWrap && panelWrap.offsetHeight || 0) -\n            (searchWrap && searchWrap.offsetHeight || 0) -\n            64\n        })\n      }\n\n      $($window).on('resize', updateSizes)\n      $scope.$on('contacts_change', function () {\n        onContentLoaded(updateSizes)\n      })\n      onContentLoaded(updateSizes)\n    }\n  })\n\n  .directive('myCountriesListMobile', function ($window, $timeout) {\n    return {\n      link: link\n    }\n\n    function link ($scope, element, attrs) {\n      var searchWrap = $('.countries_modal_search')[0]\n      var panelWrap = $('.countries_modal_panel')[0]\n\n      function updateSizes () {\n        $(element).css({\n          height: $($window).height()\n            - (panelWrap && panelWrap.offsetHeight || 0)\n            - (searchWrap && searchWrap.offsetHeight || 0)\n            - (46 + 18)\n        })\n      }\n\n      $($window).on('resize', updateSizes)\n      onContentLoaded(updateSizes)\n    }\n  })\n\n  .directive('myInfiniteScrollerMobile', function () {\n    return {\n      link: link,\n      scope: true\n    }\n\n    function link ($scope, element, attrs) {\n      var scrollableWrap = element[0]\n      var moreNotified = false\n\n      $(scrollableWrap).on('scroll', function (e) {\n        if (!element.is(':visible')) return\n        if (!moreNotified &&\n          scrollableWrap.scrollTop >= scrollableWrap.scrollHeight - scrollableWrap.clientHeight - 300) {\n          moreNotified = true\n          $scope.$apply(function () {\n            $scope.slice.limit += ($scope.slice.limitDelta || 20)\n          })\n\n          onContentLoaded(function () {\n            moreNotified = false\n          })\n        }\n      })\n    }\n  })\n"
  },
  {
    "path": "app/js/filters.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n/* global Config, tsNow */\n\n/* Filters */\n\nangular.module('myApp.filters', ['myApp.i18n'])\n\n  .filter('userName', function (_) {\n    return function (user) {\n      if (!user || !user.first_name && !user.last_name) {\n        return _('user_name_deleted')\n      }\n      return user.first_name ? (user.first_name + (user.last_name ? ' ' + user.last_name : '')) : user.last_name\n    }\n  })\n\n  .filter('userFirstName', function (_) {\n    return function (user) {\n      if (!user || !user.first_name && !user.last_name) {\n        return _('user_first_name_deleted')\n      }\n      return user.first_name || user.last_name\n    }\n  })\n\n  .filter('userStatus', function ($filter, _) {\n    var relativeTimeFilter = $filter('relativeTime')\n    return function (user, botChatPrivacy) {\n      if (user && !(user.id % 1000)) {\n        if (user.id === 777000) {\n          return _('user_status_service_notifications')\n        }\n        return _('user_status_support')\n      }\n      var statusType = user && user.status && user.status._\n      if (!statusType) {\n        statusType = user && user.pFlags && user.pFlags.bot ? 'userStatusBot' : 'userStatusEmpty'\n      }\n      switch (statusType) {\n        case 'userStatusOnline':\n          return _('user_status_online')\n\n        case 'userStatusOffline':\n          return _('user_status_last_seen', relativeTimeFilter(user.status.was_online))\n\n        case 'userStatusRecently':\n          return _('user_status_recently')\n\n        case 'userStatusLastWeek':\n          return _('user_status_last_week')\n\n        case 'userStatusLastMonth':\n          return _('user_status_last_month')\n\n        case 'userStatusBot':\n          if (botChatPrivacy) {\n            if (user.pFlags.bot_chat_history) {\n              return _('user_status_bot_noprivacy')\n            } else {\n              return _('user_status_bot_privacy')\n            }\n          }\n          return _('user_status_bot')\n\n        case 'userStatusEmpty':\n        default:\n          return _('user_status_long_ago')\n      }\n    }\n  })\n\n  .filter('chatTitle', function (_) {\n    return function (chat) {\n      if (!chat || !chat.title) {\n        return _('chat_title_deleted')\n      }\n      return chat.title\n    }\n  })\n\n  .filter('dateOrTime', function ($filter) {\n    var dateFilter = $filter('date')\n\n    return function (timestamp, extended) {\n      if (!timestamp) {\n        return ''\n      }\n      var ticks = timestamp * 1000\n      var diff = Math.abs(tsNow() - ticks)\n      var format = 'shortTime'\n\n      if (diff > 518400000) { // 6 days\n        format = extended ? 'mediumDate' : 'shortDate'\n      } else if (diff > 43200000) { // 12 hours\n        format = extended ? 'EEEE' : 'EEE'\n      }\n\n      return dateFilter(ticks, format)\n    }\n  })\n\n  .filter('dateMedium', function ($filter) {\n    var dateFilter = $filter('date')\n    return function (timestamp, extended) {\n      var ticks = timestamp * 1000\n      return dateFilter(ticks, 'medium')\n    }\n  })\n\n  .filter('time', function ($filter) {\n    var cachedDates = {}\n    var dateFilter = $filter('date')\n    var format = Config.Mobile ? 'shortTime' : 'mediumTime'\n\n    return function (timestamp) {\n      if (cachedDates[timestamp]) {\n        return cachedDates[timestamp]\n      }\n\n      return cachedDates[timestamp] = dateFilter(timestamp * 1000, format)\n    }\n  })\n\n  .filter('myDate', function ($filter) {\n    var cachedDates = {}\n    var dateFilter = $filter('date')\n\n    return function (timestamp) {\n      if (cachedDates[timestamp]) {\n        return cachedDates[timestamp]\n      }\n\n      return cachedDates[timestamp] = dateFilter(timestamp * 1000, 'fullDate')\n    }\n  })\n\n  .filter('duration', [function () {\n    return function (duration) {\n      duration = parseInt(duration)\n      if (isNaN(duration)) {\n        duration = 0\n      }\n      var hours = Math.floor(duration / 3600)\n      var mins = Math.floor((duration % 3600) / 60)\n      var secs = duration % 60\n\n      var durationStr = (hours ? hours + ':' : '') + mins + ':' + secs\n\n      durationStr = durationStr.replace(/:(\\d(?::|$))/g, ':0$1')\n\n      return durationStr\n    }\n  }])\n\n  .filter('durationRemains', function ($filter) {\n    var durationFilter = $filter('duration')\n\n    return function (done, total) {\n      return '-' + durationFilter(total - done)\n    }\n  })\n\n  .filter('phoneNumber', [function () {\n    return function (phoneRaw) {\n      var nbsp = ' '\n      phoneRaw = (phoneRaw || '').replace(/\\D/g, '')\n      if (phoneRaw.charAt(0) === '7' && phoneRaw.length === 11) {\n        return '+' + phoneRaw.charAt(0) + nbsp + '(' + phoneRaw.substr(1, 3) + ')' + nbsp + phoneRaw.substr(4, 3) + '-' + phoneRaw.substr(7, 2) + '-' + phoneRaw.substr(9, 2)\n      }\n      return '+' + phoneRaw\n    }\n  }])\n\n  .filter('formatSize', [function () {\n    return function (size, progressing) {\n      if (!size) {\n        return '0'\n      } else if (size < 1024) {\n        return size + ' b'\n      } else if (size < 1048576) {\n        return Math.round(size / 1024) + ' KB'\n      }\n      var mbs = size / 1048576\n      if (progressing) {\n        mbs = mbs.toFixed(1)\n      } else {\n        mbs = (Math.round(mbs * 10) / 10)\n      }\n      return mbs + ' MB'\n    }\n  }])\n\n  .filter('formatSizeProgress', function ($filter, _) {\n    var formatSizeFilter = $filter('formatSize')\n    return function (progress) {\n      if (!progress.total) {\n        return ''\n      }\n      var done = formatSizeFilter(progress.done, true)\n      var doneParts = done.split(' ')\n      var total = formatSizeFilter(progress.total)\n      var totalParts = total.split(' ')\n\n      if (totalParts[1] === doneParts[1]) {\n        return _('format_size_progress_mulitple', {done: doneParts[0], total: totalParts[0], parts: doneParts[1]})\n      }\n      return _('format_size_progress', {done: done, total: total})\n    }\n  })\n\n  .filter('formatShortNumber', [function () {\n    return function (num) {\n      var mult\n      if (!num) {\n        return '0'\n      } else if (num < 1000) {\n        return num.toString()\n      } else if (num < 900000) {\n        mult = num > 10000 ? 1 : 10\n        return (Math.round(num / 1000 * mult) / mult) + 'K'\n      }\n      mult = num > 10000000 ? 1 : 10\n      return (Math.round(num / 1000000 * mult) / mult) + 'M'\n    }\n  }])\n\n  .filter('nl2br', [function () {\n    return function (text) {\n      return text.replace(/\\n/g, '<br/>')\n    }\n  }])\n\n  .filter('shortUrl', [function () {\n    return function (text) {\n      if (typeof text !== 'string') {\n        return text\n      }\n      return text.replace(/^https?:\\/\\//, '').replace(/^www\\./, '')\n    }\n  }])\n\n  .filter('richText', function ($filter) {\n    var linkyFilter = $filter('linky')\n    return function (text) {\n      return linkyFilter(text, '_blank').replace(/\\n|&#10;/g, '<br/>')\n    }\n  })\n\n  .filter('relativeTime', function ($filter, _) {\n    var langMinutesPluralize = _.pluralize('relative_time_pluralize_minutes_ago')\n    var langHoursPluralize = _.pluralize('relative_time_pluralize_hours_ago')\n    var dateOrTimeFilter = $filter('dateOrTime')\n\n    return function (timestamp) {\n      var diff = Math.abs(tsNow(true) - timestamp)\n\n      if (diff < 60) {\n        return _('relative_time_just_now')\n      }\n      if (diff < 3600) {\n        var minutes = Math.floor(diff / 60)\n        return langMinutesPluralize(minutes)\n      }\n      if (diff < 86400) {\n        var hours = Math.floor(diff / 3600)\n        return langHoursPluralize(hours)\n      }\n      return dateOrTimeFilter(timestamp, true)\n    }\n  })\n"
  },
  {
    "path": "app/js/init.js",
    "content": ";(function initApplication () {\n  // Prevent click-jacking\n  try {\n    if (window == window.top || window.chrome && chrome.app && chrome.app.window) {\n      document.documentElement.style.display = 'block'\n    } else {\n      top.location = self.location\n    }\n  } catch (e) {console.error('CJ protection', e) }\n\n  var classes = [\n    Config.Navigator.osX ? 'osx' : 'non_osx',\n    Config.Navigator.msie ? 'msie' : 'non_msie',\n    Config.Navigator.retina ? 'is_2x' : 'is_1x'\n  ]\n  if (Config.Modes.ios_standalone) {\n    classes.push('ios_standalone')\n  }\n  $(document.body).addClass(classes.join(' '))\n\n  ConfigStorage.get('layout_selected', 'i18n_locale', 'kz_version', function (params) {\n    var layout = params[0]\n    var locale = params[1]\n    var kzVersion = params[2]\n    var defaultLocale = 'en-us'\n    var bootReady = {\n      dom: false,\n      i18n_ng: false,\n      i18n_messages: false,\n      i18n_fallback: false,\n      migration_check: false\n    }\n    if ('K' !== kzVersion && 'Z' !== kzVersion) {\n      kzVersion = false\n    }\n    if ('web.telegram.org' !== location.hostname ||\n        Config.Modes.test ||\n        Config.Modes.ios_standalone ||\n        location.search.indexOf('legacy=1') != -1) {\n      bootReady.migration_check = true\n    } else {\n      if (kzVersion) {\n        location.href = 'https://web.telegram.org/' + kzVersion.toLowerCase() + '/' + location.hash\n        return\n      }\n      $.getJSON('https://telegram.org/webogram_migrate').success(function(result) {\n        kzVersion = result.kz_version\n        if ('K' !== kzVersion && 'Z' !== kzVersion) {\n          kzVersion = Math.random() >= 0.5 ? 'K' : 'Z'\n        }\n        ConfigStorage.set({\n          kz_version: kzVersion\n        })\n        location.href = 'https://web.telegram.org/' + kzVersion.toLowerCase() + '/' + location.hash\n      })\n      return\n    }\n    var checkReady = function checkReady () {\n      var i\n      var ready = true\n      for (i in bootReady) {\n        if (bootReady.hasOwnProperty(i) && bootReady[i] === false) {\n          ready = false\n          break\n        }\n      }\n      if (ready) {\n        bootReady.boot = false\n        angular.bootstrap(document, ['myApp'])\n      }\n    }\n\n    if (Config.Modes.force_mobile) {\n      layout = 'mobile'\n    }\n    else if (Config.Modes.force_desktop) {\n      layout = 'desktop'\n    }\n\n    switch (layout) {\n      case 'mobile':\n        Config.Mobile = true\n        break\n      case 'desktop':\n        Config.Mobile = false\n        break\n      default:\n        var width = $(window).width()\n        Config.Mobile = Config.Navigator.mobile || width > 10 && width < 480\n        break\n    }\n    $('head').append(\n      '<link rel=\"stylesheet\" href=\"css/' + (Config.Mobile ? 'mobile.css' : 'desktop.css') + '\" />'\n    )\n\n    if (!locale) {\n      locale = (navigator.language || '').toLowerCase()\n      locale = Config.I18n.aliases[locale] || locale\n    }\n    for (var i = 0; i < Config.I18n.supported.length; i++) {\n      if (Config.I18n.supported[i] == locale) {\n        Config.I18n.locale = locale\n        break\n      }\n    }\n    bootReady.i18n_ng = Config.I18n.locale == defaultLocale // Already included\n\n    $.getJSON('js/locales/' + Config.I18n.locale + '.json').success(function (json) {\n      Config.I18n.messages = json\n      bootReady.i18n_messages = true\n      if (Config.I18n.locale == defaultLocale) { // No fallback, leave empty object\n        bootReady.i18n_fallback = true\n      }\n      checkReady()\n    })\n\n    if (Config.I18n.locale != defaultLocale) {\n      $.getJSON('js/locales/' + defaultLocale + '.json').success(function (json) {\n        Config.I18n.fallback_messages = json\n        bootReady.i18n_fallback = true\n        checkReady()\n      })\n    }\n\n    $(document).ready(function () {\n      bootReady.dom = true\n      if (!bootReady.i18n_ng) { // onDOMready because needs to be after angular\n        $('<script>').appendTo('body')\n          .on('load', function () {\n            bootReady.i18n_ng = true\n            checkReady()\n          })\n          .attr('src', 'vendor/angular/i18n/angular-locale_' + Config.I18n.locale + '.js')\n      } else {\n        checkReady()\n      }\n    })\n  })\n})()\n"
  },
  {
    "path": "app/js/lib/bin_utils.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nfunction bigint (num) {\n  return new BigInteger(num.toString(16), 16)\n}\n\nfunction bigStringInt (strNum) {\n  return new BigInteger(strNum, 10)\n}\n\nfunction dHexDump (bytes) {\n  var arr = []\n  for (var i = 0; i < bytes.length; i++) {\n    if (i && !(i % 2)) {\n      if (!(i % 16)) {\n        arr.push('\\n')\n      } else if (!(i % 4)) {\n        arr.push('  ')\n      } else {\n        arr.push(' ')\n      }\n    }\n    arr.push((bytes[i] < 16 ? '0' : '') + bytes[i].toString(16))\n  }\n\n  console.log(arr.join(''))\n}\n\nfunction bytesToHex (bytes) {\n  bytes = bytes || []\n  var arr = []\n  for (var i = 0; i < bytes.length; i++) {\n    arr.push((bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16))\n  }\n  return arr.join('')\n}\n\nfunction bytesFromHex (hexString) {\n  var len = hexString.length,\n    i\n  var start = 0\n  var bytes = []\n\n  if (hexString.length % 2) {\n    bytes.push(parseInt(hexString.charAt(0), 16))\n    start++\n  }\n\n  for (i = start; i < len; i += 2) {\n    bytes.push(parseInt(hexString.substr(i, 2), 16))\n  }\n\n  return bytes\n}\n\nfunction bytesToBase64 (bytes) {\n  var mod3\n  var result = ''\n\n  for (var nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\n    mod3 = nIdx % 3\n    nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24)\n    if (mod3 === 2 || nLen - nIdx === 1) {\n      result += String.fromCharCode(\n        uint6ToBase64(nUint24 >>> 18 & 63),\n        uint6ToBase64(nUint24 >>> 12 & 63),\n        uint6ToBase64(nUint24 >>> 6 & 63),\n        uint6ToBase64(nUint24 & 63)\n      )\n      nUint24 = 0\n    }\n  }\n\n  return result.replace(/A(?=A$|$)/g, '=')\n}\n\nfunction uint6ToBase64 (nUint6) {\n  return nUint6 < 26\n    ? nUint6 + 65\n    : nUint6 < 52\n      ? nUint6 + 71\n      : nUint6 < 62\n        ? nUint6 - 4\n        : nUint6 === 62\n          ? 43\n          : nUint6 === 63\n            ? 47\n            : 65\n}\n\nfunction base64ToBlob (base64str, mimeType) {\n  var sliceSize = 1024\n  var byteCharacters = atob(base64str)\n  var bytesLength = byteCharacters.length\n  var slicesCount = Math.ceil(bytesLength / sliceSize)\n  var byteArrays = new Array(slicesCount)\n\n  for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n    var begin = sliceIndex * sliceSize\n    var end = Math.min(begin + sliceSize, bytesLength)\n\n    var bytes = new Array(end - begin)\n    for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n      bytes[i] = byteCharacters[offset].charCodeAt(0)\n    }\n    byteArrays[sliceIndex] = new Uint8Array(bytes)\n  }\n\n  return blobConstruct(byteArrays, mimeType)\n}\n\nfunction dataUrlToBlob (url) {\n  // var name = 'b64blob ' + url.length\n  // console.time(name)\n  var urlParts = url.split(',')\n  var base64str = urlParts[1]\n  var mimeType = urlParts[0].split(':')[1].split(';')[0]\n  var blob = base64ToBlob(base64str, mimeType)\n  // console.timeEnd(name)\n  return blob\n}\n\nfunction blobConstruct (blobParts, mimeType) {\n  var blob\n  var safeMimeType = blobSafeMimeType(mimeType)\n  try {\n    blob = new Blob(blobParts, {type: safeMimeType})\n  } catch (e) {\n    var bb = new BlobBuilder\n    angular.forEach(blobParts, function (blobPart) {\n      bb.append(blobPart)\n    })\n    blob = bb.getBlob(safeMimeType)\n  }\n  return blob\n}\n\nfunction blobSafeMimeType(mimeType) {\n  if ([\n    'image/jpeg',\n    'image/png',\n    'image/gif',\n    'image/webp',\n    'image/bmp',\n    'video/mp4',\n    'video/webm',\n    'video/quicktime',\n    'audio/ogg',\n    'audio/mpeg',\n    'audio/mp4',\n  ].indexOf(mimeType) == -1) {\n    return 'application/octet-stream'\n  }\n  return mimeType\n}\n\nfunction bytesCmp (bytes1, bytes2) {\n  var len = bytes1.length\n  if (len != bytes2.length) {\n    return false\n  }\n\n  for (var i = 0; i < len; i++) {\n    if (bytes1[i] != bytes2[i]) {\n      return false\n    }\n  }\n  return true\n}\n\nfunction bytesXor (bytes1, bytes2) {\n  var len = bytes1.length\n  var bytes = []\n\n  for (var i = 0; i < len; ++i) {\n    bytes[i] = bytes1[i] ^ bytes2[i]\n  }\n\n  return bytes\n}\n\nfunction bytesToWords (bytes) {\n  if (bytes instanceof ArrayBuffer) {\n    bytes = new Uint8Array(bytes)\n  }\n  var len = bytes.length\n  var words = []\n  var i\n  for (i = 0; i < len; i++) {\n    words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8)\n  }\n\n  return new CryptoJS.lib.WordArray.init(words, len)\n}\n\nfunction bytesFromWords (wordArray) {\n  var words = wordArray.words\n  var sigBytes = wordArray.sigBytes\n  var bytes = []\n\n  for (var i = 0; i < sigBytes; i++) {\n    bytes.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)\n  }\n\n  return bytes\n}\n\nfunction bytesFromBigInt (bigInt, len) {\n  var bytes = bigInt.toByteArray()\n\n  if (len && bytes.length < len) {\n    var padding = []\n    for (var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n      padding[i] = 0\n    }\n    if (bytes instanceof ArrayBuffer) {\n      bytes = bufferConcat(padding, bytes)\n    } else {\n      bytes = padding.concat(bytes)\n    }\n  }else {\n    while (!bytes[0] && (!len || bytes.length > len)) {\n      bytes = bytes.slice(1)\n    }\n  }\n\n  return bytes\n}\n\nfunction bytesFromLeemonBigInt (bigInt, len) {\n  var str = bigInt2str(bigInt, 16)\n  return bytesFromHex(str)\n}\n\nfunction bytesToArrayBuffer (b) {\n  return (new Uint8Array(b)).buffer\n}\n\nfunction convertToArrayBuffer (bytes) {\n  // Be careful with converting subarrays!!\n  if (bytes instanceof ArrayBuffer) {\n    return bytes\n  }\n  if (bytes.buffer !== undefined &&\n    bytes.buffer.byteLength == bytes.length * bytes.BYTES_PER_ELEMENT) {\n    return bytes.buffer\n  }\n  return bytesToArrayBuffer(bytes)\n}\n\nfunction convertToUint8Array (bytes) {\n  if (bytes.buffer !== undefined) {\n    return bytes\n  }\n  return new Uint8Array(bytes)\n}\n\nfunction convertToByteArray (bytes) {\n  if (Array.isArray(bytes)) {\n    return bytes\n  }\n  bytes = convertToUint8Array(bytes)\n  var newBytes = []\n  for (var i = 0, len = bytes.length; i < len; i++) {\n    newBytes.push(bytes[i])\n  }\n  return newBytes\n}\n\nfunction bytesFromArrayBuffer (buffer) {\n  var len = buffer.byteLength\n  var byteView = new Uint8Array(buffer)\n  var bytes = []\n\n  for (var i = 0; i < len; ++i) {\n    bytes[i] = byteView[i]\n  }\n\n  return bytes\n}\n\nfunction bufferConcat (buffer1, buffer2) {\n  var l1 = buffer1.byteLength || buffer1.length\n  var l2 = buffer2.byteLength || buffer2.length\n  var tmp = new Uint8Array(l1 + l2)\n  tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0)\n  tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1)\n\n  return tmp.buffer\n}\n\nfunction longToInts (sLong) {\n  var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000))\n\n  return [divRem[0].intValue(), divRem[1].intValue()]\n}\n\nfunction longToBytes (sLong) {\n  return bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse()\n}\n\nfunction longFromInts (high, low) {\n  return bigint(high).shiftLeft(32).add(bigint(low)).toString(10)\n}\n\nfunction intToUint (val) {\n  val = parseInt(val)\n  if (val < 0) {\n    val = val + 4294967296\n  }\n  return val\n}\n\nfunction uintToInt (val) {\n  if (val > 2147483647) {\n    val = val - 4294967296\n  }\n  return val\n}\n\nfunction sha1HashSync (bytes) {\n  this.rushaInstance = this.rushaInstance || new Rusha(1024 * 1024)\n\n  // console.log(dT(), 'SHA-1 hash start', bytes.byteLength || bytes.length)\n  var hashBytes = rushaInstance.rawDigest(bytes).buffer\n  // console.log(dT(), 'SHA-1 hash finish')\n\n  return hashBytes\n}\n\nfunction sha1BytesSync (bytes) {\n  return bytesFromArrayBuffer(sha1HashSync(bytes))\n}\n\nfunction sha256HashSync (bytes) {\n  // console.log(dT(), 'SHA-2 hash start', bytes.byteLength || bytes.length)\n  var hashWords = CryptoJS.SHA256(bytesToWords(bytes))\n  // console.log(dT(), 'SHA-2 hash finish')\n\n  var hashBytes = bytesFromWords(hashWords)\n\n  return hashBytes\n}\n\nfunction rsaEncrypt (publicKey, bytes) {\n  bytes = addPadding(bytes, 255)\n\n  // console.log('RSA encrypt start')\n  var N = new BigInteger(publicKey.modulus, 16)\n  var E = new BigInteger(publicKey.exponent, 16)\n  var X = new BigInteger(bytes)\n  var encryptedBigInt = X.modPowInt(E, N),\n    encryptedBytes = bytesFromBigInt(encryptedBigInt, 256)\n    // console.log('RSA encrypt finish')\n\n  return encryptedBytes\n}\n\nfunction addPadding (bytes, blockSize, zeroes) {\n  blockSize = blockSize || 16\n  var len = bytes.byteLength || bytes.length\n  var needPadding = blockSize - (len % blockSize)\n  if (needPadding > 0 && needPadding < blockSize) {\n    var padding = new Array(needPadding)\n    if (zeroes) {\n      for (var i = 0; i < needPadding; i++) {\n        padding[i] = 0\n      }\n    } else {\n      (new SecureRandom()).nextBytes(padding)\n    }\n\n    if (bytes instanceof ArrayBuffer) {\n      bytes = bufferConcat(bytes, padding)\n    } else {\n      bytes = bytes.concat(padding)\n    }\n  }\n\n  return bytes\n}\n\nfunction aesEncryptSync (bytes, keyBytes, ivBytes) {\n  var len = bytes.byteLength || bytes.length\n\n  // console.log(dT(), 'AES encrypt start', len/*, bytesToHex(keyBytes), bytesToHex(ivBytes)*/)\n  bytes = addPadding(bytes)\n\n  var encryptedWords = CryptoJS.AES.encrypt(bytesToWords(bytes), bytesToWords(keyBytes), {\n    iv: bytesToWords(ivBytes),\n    padding: CryptoJS.pad.NoPadding,\n    mode: CryptoJS.mode.IGE\n  }).ciphertext\n\n  var encryptedBytes = bytesFromWords(encryptedWords)\n  // console.log(dT(), 'AES encrypt finish')\n\n  return encryptedBytes\n}\n\nfunction aesDecryptSync (encryptedBytes, keyBytes, ivBytes) {\n\n  // console.log(dT(), 'AES decrypt start', encryptedBytes.length)\n  var decryptedWords = CryptoJS.AES.decrypt({ciphertext: bytesToWords(encryptedBytes)}, bytesToWords(keyBytes), {\n    iv: bytesToWords(ivBytes),\n    padding: CryptoJS.pad.NoPadding,\n    mode: CryptoJS.mode.IGE\n  })\n\n  var bytes = bytesFromWords(decryptedWords)\n  // console.log(dT(), 'AES decrypt finish')\n\n  return bytes\n}\n\nfunction gzipUncompress (bytes) {\n  // console.log('Gzip uncompress start')\n  var result = (new Zlib.Gunzip(bytes)).decompress()\n  // console.log('Gzip uncompress finish')\n  return result\n}\n\nfunction nextRandomInt (maxValue) {\n  return Math.floor(Math.random() * maxValue)\n}\n\nfunction pqPrimeFactorization (pqBytes) {\n  var what = new BigInteger(pqBytes)\n  var result = false\n\n  // console.log(dT(), 'PQ start', pqBytes, what.toString(16), what.bitLength())\n\n  try {\n    result = pqPrimeLeemon(str2bigInt(what.toString(16), 16, Math.ceil(64 / bpe) + 1))\n  } catch (e) {\n    console.error('Pq leemon Exception', e)\n  }\n\n  if (result === false && what.bitLength() <= 64) {\n    // console.time('PQ long')\n    try {\n      result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16))\n    } catch (e) {\n      console.error('Pq long Exception', e)\n    }\n  // console.timeEnd('PQ long')\n  }\n  // console.log(result)\n\n  if (result === false) {\n    // console.time('pq BigInt')\n    result = pqPrimeBigInteger(what)\n  // console.timeEnd('pq BigInt')\n  }\n\n  // console.log(dT(), 'PQ finish')\n\n  return result\n}\n\nfunction pqPrimeBigInteger (what) {\n  var it = 0,\n    g\n  for (var i = 0; i < 3; i++) {\n    var q = (nextRandomInt(128) & 15) + 17\n    var x = bigint(nextRandomInt(1000000000) + 1)\n    var y = x.clone()\n    var lim = 1 << (i + 18)\n\n    for (var j = 1; j < lim; j++) {\n      ++it\n      var a = x.clone()\n      var b = x.clone()\n      var c = bigint(q)\n\n      while (!b.equals(BigInteger.ZERO)) {\n        if (!b.and(BigInteger.ONE).equals(BigInteger.ZERO)) {\n          c = c.add(a)\n          if (c.compareTo(what) > 0) {\n            c = c.subtract(what)\n          }\n        }\n        a = a.add(a)\n        if (a.compareTo(what) > 0) {\n          a = a.subtract(what)\n        }\n        b = b.shiftRight(1)\n      }\n\n      x = c.clone()\n      var z = x.compareTo(y) < 0 ? y.subtract(x) : x.subtract(y)\n      g = z.gcd(what)\n      if (!g.equals(BigInteger.ONE)) {\n        break\n      }\n      if ((j & (j - 1)) == 0) {\n        y = x.clone()\n      }\n    }\n    if (g.compareTo(BigInteger.ONE) > 0) {\n      break\n    }\n  }\n\n  var f = what.divide(g), P, Q\n\n  if (g.compareTo(f) > 0) {\n    P = f\n    Q = g\n  } else {\n    P = g\n    Q = f\n  }\n\n  return [bytesFromBigInt(P), bytesFromBigInt(Q), it]\n}\n\nfunction gcdLong (a, b) {\n  while (a.notEquals(goog.math.Long.ZERO) && b.notEquals(goog.math.Long.ZERO)) {\n    while (b.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n      b = b.shiftRight(1)\n    }\n    while (a.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n      a = a.shiftRight(1)\n    }\n    if (a.compare(b) > 0) {\n      a = a.subtract(b)\n    } else {\n      b = b.subtract(a)\n    }\n  }\n  return b.equals(goog.math.Long.ZERO) ? a : b\n}\n\nfunction pqPrimeLong (what) {\n  var it = 0,\n    g\n  for (var i = 0; i < 3; i++) {\n    var q = goog.math.Long.fromInt((nextRandomInt(128) & 15) + 17)\n    var x = goog.math.Long.fromInt(nextRandomInt(1000000000) + 1)\n    var y = x\n    var lim = 1 << (i + 18)\n\n    for (var j = 1; j < lim; j++) {\n      ++it\n      var a = x\n      var b = x\n      var c = q\n\n      while (b.notEquals(goog.math.Long.ZERO)) {\n        if (b.and(goog.math.Long.ONE).notEquals(goog.math.Long.ZERO)) {\n          c = c.add(a)\n          if (c.compare(what) > 0) {\n            c = c.subtract(what)\n          }\n        }\n        a = a.add(a)\n        if (a.compare(what) > 0) {\n          a = a.subtract(what)\n        }\n        b = b.shiftRight(1)\n      }\n\n      x = c\n      var z = x.compare(y) < 0 ? y.subtract(x) : x.subtract(y)\n      g = gcdLong(z, what)\n      if (g.notEquals(goog.math.Long.ONE)) {\n        break\n      }\n      if ((j & (j - 1)) == 0) {\n        y = x\n      }\n    }\n    if (g.compare(goog.math.Long.ONE) > 0) {\n      break\n    }\n  }\n\n  var f = what.div(g), P, Q\n\n  if (g.compare(f) > 0) {\n    P = f\n    Q = g\n  } else {\n    P = g\n    Q = f\n  }\n\n  return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16)), it]\n}\n\nfunction pqPrimeLeemon (what) {\n  var minBits = 64\n  var minLen = Math.ceil(minBits / bpe) + 1\n  var it = 0\n  var i, q\n  var j, lim\n  var g, P\n  var Q\n  var a = new Array(minLen)\n  var b = new Array(minLen)\n  var c = new Array(minLen)\n  var g = new Array(minLen)\n  var z = new Array(minLen)\n  var x = new Array(minLen)\n  var y = new Array(minLen)\n\n  for (i = 0; i < 3; i++) {\n    q = (nextRandomInt(128) & 15) + 17\n    copyInt_(x, nextRandomInt(1000000000) + 1)\n    copy_(y, x)\n    lim = 1 << (i + 18)\n\n    for (j = 1; j < lim; j++) {\n      ++it\n      copy_(a, x)\n      copy_(b, x)\n      copyInt_(c, q)\n\n      while (!isZero(b)) {\n        if (b[0] & 1) {\n          add_(c, a)\n          if (greater(c, what)) {\n            sub_(c, what)\n          }\n        }\n        add_(a, a)\n        if (greater(a, what)) {\n          sub_(a, what)\n        }\n        rightShift_(b, 1)\n      }\n\n      copy_(x, c)\n      if (greater(x, y)) {\n        copy_(z, x)\n        sub_(z, y)\n      } else {\n        copy_(z, y)\n        sub_(z, x)\n      }\n      eGCD_(z, what, g, a, b)\n      if (!equalsInt(g, 1)) {\n        break\n      }\n      if ((j & (j - 1)) == 0) {\n        copy_(y, x)\n      }\n    }\n    if (greater(g, one)) {\n      break\n    }\n  }\n\n  divide_(what, g, x, y)\n\n  if (greater(g, x)) {\n    P = x\n    Q = g\n  } else {\n    P = g\n    Q = x\n  }\n\n  // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n  return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q), it]\n}\n\nfunction bytesModPow (x, y, m) {\n  try {\n    var xBigInt = str2bigInt(bytesToHex(x), 16)\n    var yBigInt = str2bigInt(bytesToHex(y), 16)\n    var mBigInt = str2bigInt(bytesToHex(m), 16)\n    var resBigInt = powMod(xBigInt, yBigInt, mBigInt)\n\n    return bytesFromHex(bigInt2str(resBigInt, 16))\n  } catch (e) {\n    console.error('mod pow error', e)\n  }\n\n  return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256)\n}\n"
  },
  {
    "path": "app/js/lib/config.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nConfig = window.Config || {}\n\n/*\n\n  IMPORTANT NOTICE\n  ================\n\n  Do not publish your Webogram fork with my app credentials (below), or your application may be blocked.\n  You can get your own api_id, api_hash at https://my.telegram.org, see manual at https://core.telegram.org/api/obtaining_api_id.\n\n*/\n\nConfig.App = {\n  id: 2496,\n  hash: '8da85b0d5bfe62527e5b244c209159c3',\n  version: '0.7.0',\n  domains: ['web.telegram.org', 'zhukov.github.io']\n}\n\nConfig.Modes = {\n  test: location.search.indexOf('test=1') > 0,\n  debug: location.search.indexOf('debug=1') > 0,\n  http: location.search.indexOf('http=1') > 0,\n  ssl: location.search.indexOf('ssl=1') > 0 || location.protocol == 'https:' && location.search.indexOf('ssl=0') == -1,\n  force_mobile: location.search.indexOf('mobile=1') > 0,\n  force_desktop: location.search.indexOf('desktop=1') > 0,\n  nacl: location.search.indexOf('nacl=0') == -1,\n  webcrypto: location.search.indexOf('webcrypto=0') == -1,\n  packed: location.protocol == 'app:' || location.protocol == 'chrome-extension:',\n  ios_standalone: window.navigator.standalone && navigator.userAgent.match(/iOS|iPhone|iPad/),\n  chrome_packed: window.chrome && chrome.app && chrome.app.window && true || false,\n  animations: true,\n  memory_only: false,\n  allow_tmpfs: location.search.indexOf('tmpfs=yeahImSureIknowWhatImDoing') > 0 || false,\n  push_api: location.search.indexOf('push=1') == -1\n}\n\nConfig.Navigator = {\n  osX: (navigator.platform || '').toLowerCase().indexOf('mac') != -1 ||\n    (navigator.userAgent || '').toLowerCase().indexOf('mac') != -1,\n  msie: (navigator.userAgent || '').search(/MSIE | Trident\\/|Edge\\//) != -1,\n  retina: window.devicePixelRatio > 1,\n  ffos: navigator.userAgent.search(/mobi.+Gecko/i) != -1,\n  ffos2p: navigator.userAgent.search(/mobi.+Gecko\\/[34567]/i) != -1,\n  touch: screen.width <= 768 || ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,\n  mobile: screen.width && screen.width < 480 || navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1\n}\n\n// Touch detect: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js\n\nConfig.I18n = {\n  locale: 'en-us',\n  supported: [\n    'en-us'\n    , 'es-es'\n    , 'de-de'\n    , 'it-it'\n    , 'nl-nl'\n    , 'pt-br'\n  // ,\"ru-ru\"\n  ], // To be copied to package.json\n  languages: {\n    'en-us': 'English',\n    'de-de': 'Deutsch',\n    'es-es': 'Español',\n    'it-it': 'Italiano',\n    'ru-ru': 'Русский',\n    'nl-nl': 'Nederlands',\n    'pt-br': 'Português (Brazil)'\n  },\n  aliases: {\n    'en': 'en-us',\n    'de': 'de-de',\n    'es': 'es-es',\n    'it': 'it-it',\n    'ru': 'ru-ru',\n    'nl': 'nl-nl'\n  },\n  messages: {},\n  fallback_messages: {}\n}\n\nConfig.ExtCredentials = {\n  gmaps: {\n    api_key: 'AIzaSyC72t5GDcP-dob20d-ARwSwOQ41-zgbArg'\n  }\n}\n\nConfig.Schema = Config.Schema || {}\n\nConfig.Schema.MTProto = {'constructors': [{'id': '481674261','predicate': 'vector','params': [],'type': 'Vector t'}, {'id': '85337187','predicate': 'resPQ','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'pq','type': 'bytes'}, {'name': 'server_public_key_fingerprints','type': 'Vector<long>'}],'type': 'ResPQ'}, {'id': '-2083955988','predicate': 'p_q_inner_data','params': [{'name': 'pq','type': 'bytes'}, {'name': 'p','type': 'bytes'}, {'name': 'q','type': 'bytes'}, {'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'new_nonce','type': 'int256'}],'type': 'P_Q_inner_data'}, {'id': '2043348061','predicate': 'server_DH_params_fail','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'new_nonce_hash','type': 'int128'}],'type': 'Server_DH_Params'}, {'id': '-790100132','predicate': 'server_DH_params_ok','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'encrypted_answer','type': 'bytes'}],'type': 'Server_DH_Params'}, {'id': '-1249309254','predicate': 'server_DH_inner_data','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'g','type': 'int'}, {'name': 'dh_prime','type': 'bytes'}, {'name': 'g_a','type': 'bytes'}, {'name': 'server_time','type': 'int'}],'type': 'Server_DH_inner_data'}, {'id': '1715713620','predicate': 'client_DH_inner_data','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'retry_id','type': 'long'}, {'name': 'g_b','type': 'bytes'}],'type': 'Client_DH_Inner_Data'}, {'id': '1003222836','predicate': 'dh_gen_ok','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'new_nonce_hash1','type': 'int128'}],'type': 'Set_client_DH_params_answer'}, {'id': '1188831161','predicate': 'dh_gen_retry','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'new_nonce_hash2','type': 'int128'}],'type': 'Set_client_DH_params_answer'}, {'id': '-1499615742','predicate': 'dh_gen_fail','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'new_nonce_hash3','type': 'int128'}],'type': 'Set_client_DH_params_answer'}, {'id': '-212046591','predicate': 'rpc_result','params': [{'name': 'req_msg_id','type': 'long'}, {'name': 'result','type': 'Object'}],'type': 'RpcResult'}, {'id': '558156313','predicate': 'rpc_error','params': [{'name': 'error_code','type': 'int'}, {'name': 'error_message','type': 'string'}],'type': 'RpcError'}, {'id': '1579864942','predicate': 'rpc_answer_unknown','params': [],'type': 'RpcDropAnswer'}, {'id': '-847714938','predicate': 'rpc_answer_dropped_running','params': [],'type': 'RpcDropAnswer'}, {'id': '-1539647305','predicate': 'rpc_answer_dropped','params': [{'name': 'msg_id','type': 'long'}, {'name': 'seq_no','type': 'int'}, {'name': 'bytes','type': 'int'}],'type': 'RpcDropAnswer'}, {'id': '155834844','predicate': 'future_salt','params': [{'name': 'valid_since','type': 'int'}, {'name': 'valid_until','type': 'int'}, {'name': 'salt','type': 'long'}],'type': 'FutureSalt'}, {'id': '-1370486635','predicate': 'future_salts','params': [{'name': 'req_msg_id','type': 'long'}, {'name': 'now','type': 'int'}, {'name': 'salts','type': 'vector<future_salt>'}],'type': 'FutureSalts'}, {'id': '880243653','predicate': 'pong','params': [{'name': 'msg_id','type': 'long'}, {'name': 'ping_id','type': 'long'}],'type': 'Pong'}, {'id': '-501201412','predicate': 'destroy_session_ok','params': [{'name': 'session_id','type': 'long'}],'type': 'DestroySessionRes'}, {'id': '1658015945','predicate': 'destroy_session_none','params': [{'name': 'session_id','type': 'long'}],'type': 'DestroySessionRes'}, {'id': '-1631450872','predicate': 'new_session_created','params': [{'name': 'first_msg_id','type': 'long'}, {'name': 'unique_id','type': 'long'}, {'name': 'server_salt','type': 'long'}],'type': 'NewSession'}, {'id': '1945237724','predicate': 'msg_container','params': [{'name': 'messages','type': 'vector<%Message>'}],'type': 'MessageContainer'}, {'id': '1538843921','predicate': 'message','params': [{'name': 'msg_id','type': 'long'}, {'name': 'seqno','type': 'int'}, {'name': 'bytes','type': 'int'}, {'name': 'body','type': 'Object'}],'type': 'Message'}, {'id': '-530561358','predicate': 'msg_copy','params': [{'name': 'orig_message','type': 'Message'}],'type': 'MessageCopy'}, {'id': '812830625','predicate': 'gzip_packed','params': [{'name': 'packed_data','type': 'bytes'}],'type': 'Object'}, {'id': '1658238041','predicate': 'msgs_ack','params': [{'name': 'msg_ids','type': 'Vector<long>'}],'type': 'MsgsAck'}, {'id': '-1477445615','predicate': 'bad_msg_notification','params': [{'name': 'bad_msg_id','type': 'long'}, {'name': 'bad_msg_seqno','type': 'int'}, {'name': 'error_code','type': 'int'}],'type': 'BadMsgNotification'}, {'id': '-307542917','predicate': 'bad_server_salt','params': [{'name': 'bad_msg_id','type': 'long'}, {'name': 'bad_msg_seqno','type': 'int'}, {'name': 'error_code','type': 'int'}, {'name': 'new_server_salt','type': 'long'}],'type': 'BadMsgNotification'}, {'id': '2105940488','predicate': 'msg_resend_req','params': [{'name': 'msg_ids','type': 'Vector<long>'}],'type': 'MsgResendReq'}, {'id': '-630588590','predicate': 'msgs_state_req','params': [{'name': 'msg_ids','type': 'Vector<long>'}],'type': 'MsgsStateReq'}, {'id': '81704317','predicate': 'msgs_state_info','params': [{'name': 'req_msg_id','type': 'long'}, {'name': 'info','type': 'bytes'}],'type': 'MsgsStateInfo'}, {'id': '-1933520591','predicate': 'msgs_all_info','params': [{'name': 'msg_ids','type': 'Vector<long>'}, {'name': 'info','type': 'bytes'}],'type': 'MsgsAllInfo'}, {'id': '661470918','predicate': 'msg_detailed_info','params': [{'name': 'msg_id','type': 'long'}, {'name': 'answer_msg_id','type': 'long'}, {'name': 'bytes','type': 'int'}, {'name': 'status','type': 'int'}],'type': 'MsgDetailedInfo'}, {'id': '-2137147681','predicate': 'msg_new_detailed_info','params': [{'name': 'answer_msg_id','type': 'long'}, {'name': 'bytes','type': 'int'}, {'name': 'status','type': 'int'}],'type': 'MsgDetailedInfo'}],'methods': [{'id': '1615239032','method': 'req_pq','params': [{'name': 'nonce','type': 'int128'}],'type': 'ResPQ'}, {'id': '-686627650','method': 'req_DH_params','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'p','type': 'bytes'}, {'name': 'q','type': 'bytes'}, {'name': 'public_key_fingerprint','type': 'long'}, {'name': 'encrypted_data','type': 'bytes'}],'type': 'Server_DH_Params'}, {'id': '-184262881','method': 'set_client_DH_params','params': [{'name': 'nonce','type': 'int128'}, {'name': 'server_nonce','type': 'int128'}, {'name': 'encrypted_data','type': 'bytes'}],'type': 'Set_client_DH_params_answer'}, {'id': '1491380032','method': 'rpc_drop_answer','params': [{'name': 'req_msg_id','type': 'long'}],'type': 'RpcDropAnswer'}, {'id': '-1188971260','method': 'get_future_salts','params': [{'name': 'num','type': 'int'}],'type': 'FutureSalts'}, {'id': '2059302892','method': 'ping','params': [{'name': 'ping_id','type': 'long'}],'type': 'Pong'}, {'id': '-213746804','method': 'ping_delay_disconnect','params': [{'name': 'ping_id','type': 'long'}, {'name': 'disconnect_delay','type': 'int'}],'type': 'Pong'}, {'id': '-414113498','method': 'destroy_session','params': [{'name': 'session_id','type': 'long'}],'type': 'DestroySessionRes'}, {'id': '-1835453025','method': 'http_wait','params': [{'name': 'max_delay','type': 'int'}, {'name': 'wait_after','type': 'int'}, {'name': 'max_wait','type': 'int'}],'type': 'HttpWait'}]}\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nConfig.TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw']\n\nConfig.Schema.API = {\"constructors\":[{\"id\":\"-1132882121\",\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1720552011\",\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1072550713\",\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":\"481674261\",\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":\"-994444869\",\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":\"1450380236\",\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":\"2134579434\",\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"2107670217\",\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"396093539\",\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"-1182234929\",\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-138301121\",\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-208488460\",\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":\"-181407105\",\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":\"-1771768449\",\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":\"792191537\",\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-2114308294\",\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-104578748\",\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":\"-1494984313\",\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"480546647\",\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":\"-1837345356\",\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-1991004873\",\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-457104426\",\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":\"-206066487\",\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"}],\"type\":\"InputGeoPoint\"},{\"id\":\"483901197\",\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":\"-74070332\",\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoto\"},{\"id\":\"342061462\",\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"1996904104\",\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"InputAppEvent\"},{\"id\":\"-1649296275\",\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1160714821\",\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1432995067\",\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1086091090\",\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"8322574\",\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-891180321\",\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"172975040\",\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1373745011\",\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1384777335\",\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1258941372\",\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1278304028\",\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"276907596\",\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"2086234950\",\"predicate\":\"fileLocationUnavailable\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"FileLocation\"},{\"id\":\"1406570614\",\"predicate\":\"fileLocation\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"FileLocation\"},{\"id\":\"537022650\",\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"User\"},{\"id\":\"1326562017\",\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":\"-715532088\",\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"}],\"type\":\"UserProfilePhoto\"},{\"id\":\"164646985\",\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"-306628279\",\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"9203775\",\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"-1683826688\",\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Chat\"},{\"id\":\"-652419756\",\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"admins_enabled\",\"type\":\"flags.3?true\"},{\"name\":\"admin\",\"type\":\"flags.4?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"}],\"type\":\"Chat\"},{\"id\":\"120753115\",\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":\"771925524\",\"predicate\":\"chatFull\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector<BotInfo>\"}],\"type\":\"ChatFull\"},{\"id\":\"-925415106\",\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-57668565\",\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":\"1061556205\",\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChatParticipant>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":\"935395612\",\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":\"1632839530\",\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"}],\"type\":\"ChatPhoto\"},{\"id\":\"-2082087340\",\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Message\"},{\"id\":\"1157215293\",\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"}],\"type\":\"Message\"},{\"id\":\"-1642487306\",\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"}],\"type\":\"Message\"},{\"id\":\"1038967584\",\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"-1256047857\",\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"caption\",\"type\":\"flags.1?string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1457575028\",\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":\"1585262393\",\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1618676578\",\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"-1230047312\",\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1503425638\",\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"MessageAction\"},{\"id\":\"-1247687078\",\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"2144015272\",\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":\"-1780220945\",\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"1217033015\",\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"MessageAction\"},{\"id\":\"-1297179892\",\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"-455150117\",\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"}],\"type\":\"Dialog\"},{\"id\":\"590459437\",\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":\"-1836524247\",\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector<PhotoSize>\"}],\"type\":\"Photo\"},{\"id\":\"236446268\",\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":\"2009052699\",\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":\"-374917894\",\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":\"286776671\",\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":\"541710092\",\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"}],\"type\":\"GeoPoint\"},{\"id\":\"-2128698738\",\"predicate\":\"auth.checkedPhone\",\"params\":[{\"name\":\"phone_registered\",\"type\":\"Bool\"}],\"type\":\"auth.CheckedPhone\"},{\"id\":\"1577067778\",\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_registered\",\"type\":\"flags.0?true\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":\"-855308010\",\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-543777747\",\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":\"-1195615476\",\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":\"423314455\",\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"1251338318\",\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"-1540769658\",\"predicate\":\"inputNotifyAll\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"-265263912\",\"predicate\":\"inputPeerNotifyEventsEmpty\",\"params\":[],\"type\":\"InputPeerNotifyEvents\"},{\"id\":\"-395694988\",\"predicate\":\"inputPeerNotifyEventsAll\",\"params\":[],\"type\":\"InputPeerNotifyEvents\"},{\"id\":\"949182130\",\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?true\"},{\"name\":\"silent\",\"type\":\"flags.1?true\"},{\"name\":\"mute_until\",\"type\":\"int\"},{\"name\":\"sound\",\"type\":\"string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":\"-1378534221\",\"predicate\":\"peerNotifyEventsEmpty\",\"params\":[],\"type\":\"PeerNotifyEvents\"},{\"id\":\"1830677896\",\"predicate\":\"peerNotifyEventsAll\",\"params\":[],\"type\":\"PeerNotifyEvents\"},{\"id\":\"-1697798976\",\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?true\"},{\"name\":\"silent\",\"type\":\"flags.1?true\"},{\"name\":\"mute_until\",\"type\":\"int\"},{\"name\":\"sound\",\"type\":\"string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":\"-2122045747\",\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"}],\"type\":\"PeerSettings\"},{\"id\":\"-860866985\",\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"sizes\",\"type\":\"Vector<PhotoSize>\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"WallPaper\"},{\"id\":\"1490799288\",\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"505595789\",\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"777640226\",\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-1376497949\",\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-512463606\",\"predicate\":\"inputReportReasonOther\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"ReportReason\"},{\"id\":\"253890367\",\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"user\",\"type\":\"User\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"link\",\"type\":\"contacts.Link\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"common_chats_count\",\"type\":\"int\"}],\"type\":\"UserFull\"},{\"id\":\"-116274796\",\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":\"-805141448\",\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":\"1444661369\",\"predicate\":\"contactBlocked\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ContactBlocked\"},{\"id\":\"-748155807\",\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":\"986597452\",\"predicate\":\"contacts.link\",\"params\":[{\"name\":\"my_link\",\"type\":\"ContactLink\"},{\"name\":\"foreign_link\",\"type\":\"ContactLink\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"contacts.Link\"},{\"id\":\"-1219778094\",\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":\"-353862078\",\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<Contact>\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Contacts\"},{\"id\":\"2010127419\",\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector<ImportedContact>\"},{\"name\":\"popular_invites\",\"type\":\"Vector<PopularContact>\"},{\"name\":\"retry_contacts\",\"type\":\"Vector<long>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":\"471043349\",\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector<ContactBlocked>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"-1878523231\",\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector<ContactBlocked>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"364538944\",\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"1910543603\",\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-1938715001\",\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"189033187\",\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"1694474197\",\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-438840932\",\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"-1269012015\",\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"1474492012\",\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1777752804\",\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1614803355\",\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1458172132\",\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1629621880\",\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"2129714567\",\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-3644025\",\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"522914557\",\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1318109142\",\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":\"-1576161051\",\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1548249383\",\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":\"-1704596961\",\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":\"125178264\",\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":\"469489699\",\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":\"-1489818765\",\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"-1791935732\",\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":\"628472761\",\"predicate\":\"updateContactRegistered\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1657903163\",\"predicate\":\"updateContactLink\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"my_link\",\"type\":\"ContactLink\"},{\"name\":\"foreign_link\",\"type\":\"ContactLink\"}],\"type\":\"Update\"},{\"id\":\"-1519637954\",\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":\"1567990072\",\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"16030880\",\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":\"-1459938943\",\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":\"-484987010\",\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":\"-1857044719\",\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"377562760\",\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"int\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"2027216577\",\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1918567619\",\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1957577280\",\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1916114267\",\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":\"352657236\",\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":\"539045032\",\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photo\"},{\"id\":\"157948117\",\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":\"98092748\",\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"DcOption\"},{\"id\":\"-1669068444\",\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"chat_big_size\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"disabled_features\",\"type\":\"Vector<DisabledFeature>\"}],\"type\":\"Config\"},{\"id\":\"-1910892683\",\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":\"-1987579119\",\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"critical\",\"type\":\"Bool\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":\"-1000708810\",\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":\"415997816\",\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":\"1662091044\",\"predicate\":\"wallPaperSolid\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"bg_color\",\"type\":\"int\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"WallPaper\"},{\"id\":\"314359194\",\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"386986326\",\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1264392051\",\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"956179895\",\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1417756512\",\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"1006044124\",\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-931638658\",\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-94974410\",\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":\"332848423\",\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-247351839\",\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":\"-1038136962\",\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":\"1248893260\",\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":\"406307684\",\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":\"1690108678\",\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"1511503333\",\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"-182231723\",\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-317144808\",\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":\"594758406\",\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":\"-1058912715\",\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"740433629\",\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"1443858741\",\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-1802240206\",\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-95482955\",\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":\"767652808\",\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"-364179876\",\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1851755554\",\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1906403213\",\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"}],\"type\":\"Update\"},{\"id\":\"-476700163\",\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"1523279502\",\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"2084836563\",\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"caption\",\"type\":\"flags.1?string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1928391342\",\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":\"410618194\",\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputDocument\"},{\"id\":\"1125058340\",\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":\"922273905\",\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":\"-2027738169\",\"predicate\":\"document\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumb\",\"type\":\"PhotoSize\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"Document\"},{\"id\":\"398898678\",\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":\"-1613493288\",\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":\"-1261946036\",\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-1073230141\",\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"1959820384\",\"predicate\":\"notifyAll\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-2131957734\",\"predicate\":\"updateUserBlocked\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":\"-1094555409\",\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":\"381645902\",\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-44119819\",\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-1584933265\",\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-378127636\",\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-718310409\",\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-212740181\",\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-774682074\",\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-1441998364\",\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"393186209\",\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"1653390447\",\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-1290580579\",\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector<Peer>\"},{\"name\":\"results\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Found\"},{\"id\":\"-337352679\",\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"Update\"},{\"id\":\"-496024847\",\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"129960444\",\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"2011940674\",\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"-298113238\",\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"}],\"type\":\"Update\"},{\"id\":\"1335282456\",\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"-1137792208\",\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"218751099\",\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"407582158\",\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"320652927\",\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"195371015\",\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"-697604407\",\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"-1877932953\",\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"-123988\",\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"1698855810\",\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"1297858060\",\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"-125240806\",\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"-1955338397\",\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"209668535\",\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"1430961007\",\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"-1194283041\",\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":\"314130811\",\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"1815593308\",\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"297109817\",\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":\"1662637586\",\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"250621158\",\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"-1739392570\",\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"358154344\",\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"-244016606\",\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":\"-1970352846\",\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.Stickers\"},{\"id\":\"313694676\",\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector<long>\"}],\"type\":\"StickerPack\"},{\"id\":\"-395967805\",\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":\"-302170017\",\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSet>\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"-1369215196\",\"predicate\":\"disabledFeature\",\"params\":[{\"name\":\"feature\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DisabledFeature\"},{\"id\":\"-1721631396\",\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"791617983\",\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-2066640507\",\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"1599050311\",\"predicate\":\"contactLinkUnknown\",\"params\":[],\"type\":\"ContactLink\"},{\"id\":\"-17968211\",\"predicate\":\"contactLinkNone\",\"params\":[],\"type\":\"ContactLink\"},{\"id\":\"646922073\",\"predicate\":\"contactLinkHasPhone\",\"params\":[],\"type\":\"ContactLink\"},{\"id\":\"-721239344\",\"predicate\":\"contactLinkContact\",\"params\":[],\"type\":\"ContactLink\"},{\"id\":\"2139689491\",\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-350980120\",\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":\"-981018084\",\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":\"1594340540\",\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"}],\"type\":\"WebPage\"},{\"id\":\"-1557277184\",\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":\"2079516406\",\"predicate\":\"authorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":\"307276766\",\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector<Authorization>\"}],\"type\":\"account.Authorizations\"},{\"id\":\"-1764049896\",\"predicate\":\"account.noPassword\",\"params\":[{\"name\":\"new_salt\",\"type\":\"bytes\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"string\"}],\"type\":\"account.Password\"},{\"id\":\"2081952796\",\"predicate\":\"account.password\",\"params\":[{\"name\":\"current_salt\",\"type\":\"bytes\"},{\"name\":\"new_salt\",\"type\":\"bytes\"},{\"name\":\"hint\",\"type\":\"string\"},{\"name\":\"has_recovery\",\"type\":\"Bool\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"string\"}],\"type\":\"account.Password\"},{\"id\":\"-1212732749\",\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.PasswordSettings\"},{\"id\":\"-2037289493\",\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_salt\",\"type\":\"flags.0?bytes\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":\"326715557\",\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":\"-1052959727\",\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"784356159\",\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1551583367\",\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":\"1776236393\",\"predicate\":\"chatInviteEmpty\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":\"-64092740\",\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":\"1516793212\",\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":\"-613092008\",\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector<User>\"}],\"type\":\"ChatInvite\"},{\"id\":\"-123931160\",\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"1757493555\",\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-4838507\",\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":\"-1645763991\",\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":\"-2044933984\",\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":\"-852477119\",\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"installed\",\"type\":\"flags.0?true\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":\"-1240849242\",\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"773059779\",\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?string\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":\"-1032140601\",\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":\"-1729618630\",\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"BotInfo\"},{\"id\":\"-1560655744\",\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"2002815875\",\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector<KeyboardButton>\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":\"-1606526075\",\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"-200242528\",\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"889353612\",\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"2072935910\",\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":\"-668391402\",\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":\"-1148011883\",\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-100378723\",\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1868782349\",\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1827637959\",\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1859134776\",\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1692693954\",\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-1117713463\",\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-2106619040\",\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"681706865\",\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1938967520\",\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":\"1990644519\",\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":\"301019932\",\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"-292807034\",\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":\"-1343524562\",\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":\"-1109531342\",\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"548253432\",\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":\"1158377749\",\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"editor\",\"type\":\"flags.3?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"democracy\",\"type\":\"flags.10?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?string\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChannelAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChannelBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":\"681420594\",\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":\"2131196633\",\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":\"1991201921\",\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector<BotInfo>\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?int\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"}],\"type\":\"ChatFull\"},{\"id\":\"182649427\",\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":\"-1725551049\",\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1781355374\",\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"-352032773\",\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":\"-1227598250\",\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1656358105\",\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1108669311\",\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1015733815\",\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1734268085\",\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1041346555\",\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"1788705589\",\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"543450958\",\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-1798033689\",\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":\"-847783593\",\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector<MessageRange>\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":\"367766557\",\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-1557620115\",\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-471670279\",\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-566281095\",\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-1268741783\",\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-1548400251\",\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-177282392\",\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChannelParticipant>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"-791039645\",\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":\"-636267638\",\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-489233354\",\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"1855224129\",\"predicate\":\"updateChatAdmins\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"enabled\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1232070311\",\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1371385889\",\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"-1336546578\",\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"-1328445861\",\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-236044656\",\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"help.TermsOfService\"},{\"id\":\"1753886890\",\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":\"196268545\",\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Update\"},{\"id\":\"1135492588\",\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":\"372165663\",\"predicate\":\"foundGif\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"thumb_url\",\"type\":\"string\"},{\"name\":\"content_url\",\"type\":\"string\"},{\"name\":\"content_type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"FoundGif\"},{\"id\":\"-1670052855\",\"predicate\":\"foundGifCached\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"FoundGif\"},{\"id\":\"1212395773\",\"predicate\":\"inputMediaGifExternal\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"1158290442\",\"predicate\":\"messages.foundGifs\",\"params\":[{\"name\":\"next_offset\",\"type\":\"int\"},{\"name\":\"results\",\"type\":\"Vector<FoundGif>\"}],\"type\":\"messages.FoundGifs\"},{\"id\":\"-402498398\",\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":\"772213157\",\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"gifs\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.SavedGifs\"},{\"id\":\"-1821035490\",\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":\"691006739\",\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"1036876423\",\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"750510426\",\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb_url\",\"type\":\"flags.4?string\"},{\"name\":\"content_url\",\"type\":\"flags.5?string\"},{\"name\":\"content_type\",\"type\":\"flags.5?string\"},{\"name\":\"w\",\"type\":\"flags.6?int\"},{\"name\":\"h\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"175419739\",\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1937807902\",\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1679053127\",\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb_url\",\"type\":\"flags.4?string\"},{\"name\":\"content_url\",\"type\":\"flags.5?string\"},{\"name\":\"content_type\",\"type\":\"flags.5?string\"},{\"name\":\"w\",\"type\":\"flags.6?int\"},{\"name\":\"h\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":\"-1803769784\",\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector<BotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.BotResults\"},{\"id\":\"1417832080\",\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"239663460\",\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":\"1358283666\",\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"928101534\",\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1107622874\",\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1343122938\",\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"1571494644\",\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":\"1436466797\",\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_id\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"flags.1?int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"}],\"type\":\"MessageFwdHeader\"},{\"id\":\"457133559\",\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1738988427\",\"predicate\":\"updateChannelPinnedMessage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1799538451\",\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"1923290508\",\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"1948046307\",\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"577556219\",\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"1035688326\",\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"-1073693790\",\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"1398007207\",\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"-1425815847\",\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"629866245\",\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1748655686\",\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1318425559\",\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-59151553\",\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"90744648\",\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1218642516\",\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"911761060\",\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":\"-415938591\",\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":\"649453030\",\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":\"-469536605\",\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1045340827\",\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-1431327288\",\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"766443943\",\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-1222451611\",\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"1130767150\",\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"904770772\",\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1462213465\",\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"-459324\",\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"400266251\",\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":\"-1995686519\",\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":\"-103646630\",\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":\"1008755359\",\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":\"863093588\",\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-305282981\",\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":\"-1419371685\",\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"344356834\",\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"104314861\",\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-1122524854\",\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"371037736\",\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-75283823\",\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector<TopPeer>\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":\"-567906571\",\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":\"1891070632\",\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector<TopPeerCategoryPeers>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.TopPeers\"},{\"id\":\"892193368\",\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"546203849\",\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":\"975236280\",\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"634833351\",\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-299124375\",\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":\"-1169445179\",\"predicate\":\"draftMessageEmpty\",\"params\":[],\"type\":\"DraftMessage\"},{\"id\":\"-40996577\",\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":\"-1615153660\",\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"82699215\",\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"-123893531\",\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"},{\"name\":\"unread\",\"type\":\"Vector<long>\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"1461528386\",\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"186120336\",\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":\"1558317424\",\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.RecentStickers\"},{\"id\":\"-1706939360\",\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"1338747336\",\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":\"946083368\",\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"904138920\",\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"1678812626\",\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":\"-1574314746\",\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":\"861169551\",\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":\"153267905\",\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-1225309387\",\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"caption\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"872932635\",\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector<Document>\"}],\"type\":\"StickerSetCovered\"},{\"id\":\"-1361650766\",\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":\"-1744710921\",\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":\"1251549527\",\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":\"70813275\",\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":\"-1107729093\",\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":\"1336154098\",\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"1262639204\",\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-38694904\",\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":\"-750828557\",\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":\"53231223\",\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":\"-1020139510\",\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":\"1358175439\",\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1834538890\",\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"1493171408\",\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":\"-1707344487\",\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector<HighScore>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.HighScores\"},{\"id\":\"1258196845\",\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"1081547008\",\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1663561404\",\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-599948721\",\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":\"1950782688\",\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"1730456516\",\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-653089380\",\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-1054465340\",\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-1678197867\",\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"1816074681\",\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"1009288385\",\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":\"-564523562\",\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"2120376535\",\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector<RichText>\"}],\"type\":\"RichText\"},{\"id\":\"324435594\",\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":\"1890305021\",\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1879401953\",\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1162877472\",\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":\"-1076861716\",\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-248793375\",\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"1182402406\",\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1066346178\",\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":\"1216809369\",\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-618614392\",\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":\"-837994576\",\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":\"978896884\",\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"ordered\",\"type\":\"Bool\"},{\"name\":\"items\",\"type\":\"Vector<RichText>\"}],\"type\":\"PageBlock\"},{\"id\":\"641563686\",\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"1329878739\",\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-372860542\",\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-640214938\",\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"972174080\",\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":\"-840826671\",\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"690781161\",\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"145955919\",\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"319588707\",\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1908433218\",\"predicate\":\"pagePart\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"Page\"},{\"id\":\"1433323434\",\"predicate\":\"pageFull\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"Page\"},{\"id\":\"-2054908813\",\"predicate\":\"webPageNotModified\",\"params\":[],\"type\":\"WebPage\"},{\"id\":\"-88417185\",\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1030105979\",\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"-580219064\",\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-2048646399\",\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"-527056480\",\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"1471006352\",\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"-84416311\",\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"-686710068\",\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"Update\"},{\"id\":\"-657787251\",\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order\",\"type\":\"flags.0?Vector<Peer>\"}],\"type\":\"Update\"},{\"id\":\"2104790276\",\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":\"-2095595325\",\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":\"-1684914010\",\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-886477832\",\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":\"-1022713000\",\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"Invoice\"},{\"id\":\"-186607933\",\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"-368917890\",\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":\"-1892568281\",\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":\"-2074799289\",\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":\"512535275\",\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":\"-1868808300\",\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":\"-1344716869\",\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1080663248\",\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":\"-842892769\",\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":\"-971322408\",\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"WebDocument\"},{\"id\":\"-1678949555\",\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"InputWebDocument\"},{\"id\":\"-1036396922\",\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":\"568808380\",\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":\"1062645411\",\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentForm\"},{\"id\":\"-784000893\",\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":\"1314881805\",\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"1800845601\",\"predicate\":\"payments.paymentVerficationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"1342771681\",\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":\"-74456004\",\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":\"-1056001329\",\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"873977640\",\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-614138572\",\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":\"-1239335713\",\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"ShippingOption\"},{\"id\":\"-523384512\",\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":\"1563376297\",\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":\"-6249322\",\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":\"-1425052898\",\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":\"506920429\",\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":\"1399245077\",\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":\"462375633\",\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":\"-2089411356\",\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":\"1828732223\",\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":\"-1660057\",\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connection\",\"type\":\"PhoneConnection\"},{\"name\":\"alternative_connections\",\"type\":\"Vector<PhoneConnection>\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":\"1355435489\",\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":\"-1655957568\",\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":\"-1564789301\",\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":\"-326966976\",\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"-2134272152\",\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":\"-2132731265\",\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":\"2054952868\",\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1253451181\",\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1997373508\",\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"608050278\",\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-363659686\",\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"cdn_file_hashes\",\"type\":\"Vector<CdnFileHash>\"}],\"type\":\"upload.File\"},{\"id\":\"-290921362\",\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-1449145777\",\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-914167110\",\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":\"1462101002\",\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector<CdnPublicKey>\"}],\"type\":\"CdnConfig\"},{\"id\":\"-283684427\",\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":\"-892239370\",\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"1816636575\",\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"695856818\",\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"-209337866\",\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector<LangPackString>\"}],\"type\":\"LangPackDifference\"},{\"id\":\"292985073\",\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":\"281165899\",\"predicate\":\"updateLangPackTooLong\",\"params\":[],\"type\":\"Update\"},{\"id\":\"1442983757\",\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":\"1568467877\",\"predicate\":\"channelAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"invite_link\",\"type\":\"flags.6?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"manage_call\",\"type\":\"flags.10?true\"}],\"type\":\"ChannelAdminRights\"},{\"id\":\"1489977929\",\"predicate\":\"channelBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChannelBannedRights\"},{\"id\":\"-1473271656\",\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"promoted_by\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChannelAdminRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"573315206\",\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"kicked_by\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChannelBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"338142689\",\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"106343499\",\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-421545947\",\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1427671598\",\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1783299128\",\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-1204857405\",\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"ChatPhoto\"},{\"name\":\"new_photo\",\"type\":\"ChatPhoto\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"460916654\",\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"648939889\",\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-370660328\",\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1889215493\",\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1121994683\",\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"405815507\",\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-124291086\",\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-484690728\",\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-422036098\",\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-714643696\",\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"995769920\",\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":\"-309659827\",\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<ChannelAdminLogEvent>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":\"-368018716\",\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":\"511092620\",\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"834148991\",\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"1558266229\",\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":\"2012136335\",\"predicate\":\"cdnFileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"CdnFileHash\"},{\"id\":\"1200788123\",\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1634752813\",\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":\"-209768682\",\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.FavedStickers\"},{\"id\":\"-451831443\",\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-1987495099\",\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":\"-1040652646\",\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1887741886\",\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-1312568665\",\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-85549226\",\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"178373535\",\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-905587442\",\"predicate\":\"inputPaymentCredentialsAndroidPay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"},{\"name\":\"google_transaction_id\",\"type\":\"string\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-419271411\",\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-530392189\",\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1893427255\",\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1599903217\",\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"2065305999\",\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"InputMedia\"},{\"id\":\"2084316681\",\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1189204285\",\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1917045962\",\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1608834311\",\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-347535331\",\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1140172836\",\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"235081943\",\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector<RecentMeUrl>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":\"-266911767\",\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"1951620897\",\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"1588230153\",\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"InputSingleMedia\"}],\"methods\":[{\"id\":\"-878758099\",\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"1036301552\",\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"1877286395\",\"method\":\"auth.checkPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"}],\"type\":\"auth.CheckedPhone\"},{\"id\":\"-2035355412\",\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"current_number\",\"type\":\"flags.0?Bool\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":\"453408308\",\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1126886015\",\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"1461180992\",\"method\":\"auth.logOut\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1616179942\",\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-440401971\",\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":\"-470837741\",\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-841733627\",\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"1280460\",\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"other_uids\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"813089983\",\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-2067899501\",\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":\"313765169\",\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":\"-612493497\",\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"2018596725\",\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":\"1713919532\",\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-1068696894\",\"method\":\"account.getWallPapers\",\"params\":[],\"type\":\"Vector<WallPaper>\"},{\"id\":\"-1374118561\",\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"}],\"type\":\"Bool\"},{\"id\":\"227648840\",\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Vector<User>\"},{\"id\":\"-902781519\",\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"UserFull\"},{\"id\":\"-995929106\",\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector<ContactStatus>\"},{\"id\":\"-1071414113\",\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"contacts.Contacts\"},{\"id\":\"746589157\",\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<InputContact>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":\"-1902823612\",\"method\":\"contacts.deleteContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"contacts.Link\"},{\"id\":\"1504393374\",\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Bool\"},{\"id\":\"858475004\",\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":\"-448724803\",\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":\"-176409329\",\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"-2065352905\",\"method\":\"contacts.exportCard\",\"params\":[],\"type\":\"Vector<int>\"},{\"id\":\"1340184318\",\"method\":\"contacts.importCard\",\"params\":[{\"name\":\"export_card\",\"type\":\"Vector<int>\"}],\"type\":\"User\"},{\"id\":\"1109588596\",\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Messages\"},{\"id\":\"421243333\",\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-591691168\",\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"60726944\",\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputUser\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"238054714\",\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"469850889\",\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-443640366\",\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"94983360\",\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector<ReceivedNotifyMessage>\"},{\"id\":\"-1551737264\",\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":\"-91733382\",\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"-923703407\",\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"Updates\"},{\"id\":\"1888354709\",\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"grouped\",\"type\":\"flags.9?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"random_id\",\"type\":\"Vector<long>\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"}],\"type\":\"Updates\"},{\"id\":\"-820669733\",\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"-1460572005\",\"method\":\"messages.hideReportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"913498268\",\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"PeerSettings\"},{\"id\":\"-1115507112\",\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"reason\",\"type\":\"ReportReason\"}],\"type\":\"Bool\"},{\"id\":\"1013621127\",\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Chats\"},{\"id\":\"998448230\",\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"-599447467\",\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-900957736\",\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":\"-106911223\",\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-530505962\",\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":\"164303470\",\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-304838614\",\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":\"630429265\",\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"-256159406\",\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"UserProfilePhoto\"},{\"id\":\"1328726168\",\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"photos.Photo\"},{\"id\":\"-2016444625\",\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputPhoto>\"}],\"type\":\"Vector<long>\"},{\"id\":\"-1291540959\",\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"-475607115\",\"method\":\"upload.getFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":\"-990308245\",\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":\"531836966\",\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":\"-1372724842\",\"method\":\"help.getAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":\"1862465352\",\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<InputAppEvent>\"}],\"type\":\"Bool\"},{\"id\":\"1295590211\",\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":\"-1848823128\",\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":\"651135312\",\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"-162681021\",\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":\"1035731989\",\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-304536635\",\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"2031374829\",\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"2135648522\",\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-1451792525\",\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-1701831834\",\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"852769188\",\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"1436924774\",\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector<long>\"},{\"id\":\"1259113487\",\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":\"-562337987\",\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"-951575130\",\"method\":\"initConnection\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1663104819\",\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":\"916930423\",\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"655677548\",\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"1040964988\",\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":\"301470424\",\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":\"-623130288\",\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"-906486552\",\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<InputPrivacyRule>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"1099779595\",\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"150761757\",\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":\"608323678\",\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":\"-627372787\",\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-113456221\",\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":\"149257707\",\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"current_number\",\"type\":\"flags.0?Bool\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1891839707\",\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":\"-1373446075\",\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"messages.Stickers\"},{\"id\":\"479598769\",\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"954152242\",\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"1738800940\",\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"623001124\",\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":\"-484392616\",\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":\"-545786948\",\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":\"1418342645\",\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":\"-1131605573\",\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"current_password_hash\",\"type\":\"bytes\"}],\"type\":\"account.PasswordSettings\"},{\"id\":\"-92517498\",\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"current_password_hash\",\"type\":\"bytes\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":\"174260510\",\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password_hash\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-661144474\",\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":\"1319464594\",\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1080796745\",\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"2106086025\",\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"ExportedChatInvite\"},{\"id\":\"1051570619\",\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":\"1817183516\",\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"639215886\",\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-946871200\",\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"-110209570\",\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":\"-421563528\",\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-1877938321\",\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-993483427\",\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"Vector<int>\"},{\"id\":\"-871347913\",\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-2067661490\",\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"-787622117\",\"method\":\"channels.deleteUserHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-32999408\",\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-1814580409\",\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Messages\"},{\"id\":\"306054633\",\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"1416484774\",\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":\"176122811\",\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputChannel>\"}],\"type\":\"messages.Chats\"},{\"id\":\"141781513\",\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"-192332417\",\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"333610782\",\"method\":\"channels.editAbout\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"548962836\",\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChannelAdminRights\"}],\"type\":\"Updates\"},{\"id\":\"1450044624\",\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-248621111\",\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":\"283557164\",\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"890549214\",\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"615851205\",\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"-130635115\",\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"429865580\",\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":\"-950663035\",\"method\":\"channels.exportInvite\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"ExportedChatInvite\"},{\"id\":\"-1072619549\",\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"51854712\",\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-326379039\",\"method\":\"messages.toggleChatAdmins\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"-1444503762\",\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"363051235\",\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1640190800\",\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"889286899\",\"method\":\"help.getTermsOfService\",\"params\":[],\"type\":\"help.TermsOfService\"},{\"id\":\"2016638777\",\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"864953444\",\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":\"-1080395925\",\"method\":\"messages.searchGifs\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.FoundGifs\"},{\"id\":\"-2084618926\",\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.SavedGifs\"},{\"id\":\"846868683\",\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"1364105629\",\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":\"-346119674\",\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector<InputBotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":\"-1318189314\",\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"1231065863\",\"method\":\"channels.toggleInvites\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"-826838685\",\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"grouped\",\"type\":\"Bool\"}],\"type\":\"ExportedMessageLink\"},{\"id\":\"527021574\",\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"-1490162350\",\"method\":\"channels.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1056025023\",\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":\"520357240\",\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-39416522\",\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":\"97630429\",\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"stop_geo_live\",\"type\":\"flags.12?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"geo_point\",\"type\":\"flags.13?InputGeoPoint\"}],\"type\":\"Updates\"},{\"id\":\"-1327463869\",\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"stop_geo_live\",\"type\":\"flags.12?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"geo_point\",\"type\":\"flags.13?InputGeoPoint\"}],\"type\":\"Bool\"},{\"id\":\"-2130010132\",\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":\"-712043766\",\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-728224331\",\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"contacts.TopPeers\"},{\"id\":\"451113900\",\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"764901049\",\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<InputPeer>\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-1137057461\",\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":\"1782549861\",\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":\"766298703\",\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"1527873830\",\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"1587647177\",\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.RecentStickers\"},{\"id\":\"958863608\",\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-1986437075\",\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":\"1475442322\",\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":\"353818557\",\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"current_number\",\"type\":\"flags.0?Bool\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1596029123\",\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-1920105769\",\"method\":\"channels.getAdminedPublicChannels\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":\"1706608543\",\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"-866424884\",\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector<StickerSetCovered>\"},{\"id\":\"-1907842680\",\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"-1896289088\",\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"363700068\",\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-400399203\",\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":\"258170395\",\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":\"218777796\",\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":\"-341307408\",\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-333262899\",\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"852135825\",\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":\"847887978\",\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"-1784678844\",\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<InputPeer>\"}],\"type\":\"Bool\"},{\"id\":\"-497756594\",\"method\":\"messages.getPinnedDialogs\",\"params\":[],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-1440257555\",\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":\"-434028723\",\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"619086221\",\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":\"-1712285883\",\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentForm\"},{\"id\":\"-1601001088\",\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":\"1997180532\",\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":\"730364339\",\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"1250046590\",\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password_hash\",\"type\":\"bytes\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":\"578650699\",\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":\"-667062079\",\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":\"-436833542\",\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"Bool\"},{\"id\":\"163765653\",\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":\"-1680314774\",\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"stickers\",\"type\":\"Vector<InputStickerSetItem>\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-143257775\",\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-4795190\",\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-2041315650\",\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"1369162417\",\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":\"1430593449\",\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":\"1536537556\",\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"1003664544\",\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"788404002\",\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"399855457\",\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":\"2027164582\",\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":\"475228724\",\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"662363518\",\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"536919235\",\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"452533257\",\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector<CdnFileHash>\"},{\"id\":\"1375900482\",\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":\"-1699363442\",\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":\"773776152\",\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<LangPackString>\"},{\"id\":\"187583869\",\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":\"-2146445955\",\"method\":\"langpack.getLanguages\",\"params\":[],\"type\":\"Vector<LangPackLanguage>\"},{\"id\":\"-1076292147\",\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"banned_rights\",\"type\":\"ChannelBannedRights\"}],\"type\":\"Updates\"},{\"id\":\"870184064\",\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector<InputUser>\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":\"-149567365\",\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector<CdnFileHash>\"},{\"id\":\"-914493408\",\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":\"-359881479\",\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":\"567151374\",\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FavedStickers\"},{\"id\":\"-1174420133\",\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-357180360\",\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-2020263951\",\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1180140658\",\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1355375294\",\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"1036054804\",\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":\"-356796084\",\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"251759059\",\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"613691874\",\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"546656559\",\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector<InputSingleMedia>\"}],\"type\":\"Updates\"},{\"id\":\"1347929239\",\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"}]}\n\nConfig.Schema.API.constructors.push({\"id\":\"1474462241\",\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"})\nConfig.Schema.API.methods.push({\"id\":\"-1250643605\",\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"})\nConfig.Schema.API.methods.push({\"id\":\"-1952756306\",\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"})\n\n\nConfig.Schema.API.layer = 74\n\nConfig.Emoji = {'00a9': ['\\u00A9', ['copyright']],'00ae': ['\\u00AE', ['registered']],'203c': ['\\u203C', ['bangbang']],'2049': ['\\u2049', ['interrobang']],'2122': ['\\u2122', ['tm']],'2139': ['\\u2139', ['information_source']],'2194': ['\\u2194', ['left_right_arrow']],'2195': ['\\u2195', ['arrow_up_down']],'2196': ['\\u2196', ['arrow_upper_left']],'2197': ['\\u2197', ['arrow_upper_right']],'2198': ['\\u2198', ['arrow_lower_right']],'2199': ['\\u2199', ['arrow_lower_left']],'21a9': ['\\u21A9', ['leftwards_arrow_with_hook']],'21aa': ['\\u21AA', ['arrow_right_hook']],'231a': ['\\u231A', ['watch']],'231b': ['\\u231B', ['hourglass']],'23e9': ['\\u23E9', ['fast_forward']],'23ea': ['\\u23EA', ['rewind']],'23eb': ['\\u23EB', ['arrow_double_up']],'23ec': ['\\u23EC', ['arrow_double_down']],'23f0': ['\\u23F0', ['alarm_clock']],'23f3': ['\\u23F3', ['hourglass_flowing_sand']],'24c2': ['\\u24C2', ['m']],'25aa': ['\\u25AA', ['black_small_square']],'25ab': ['\\u25AB', ['white_small_square']],'25b6': ['\\u25B6', ['arrow_forward']],'25c0': ['\\u25C0', ['arrow_backward']],'25fb': ['\\u25FB', ['white_medium_square']],'25fc': ['\\u25FC', ['black_medium_square']],'25fd': ['\\u25FD', ['white_medium_small_square']],'25fe': ['\\u25FE', ['black_medium_small_square']],'2600': ['\\u2600', ['sunny']],'2601': ['\\u2601', ['cloud']],'260e': ['\\u260E', ['phone', 'telephone']],'2611': ['\\u2611', ['ballot_box_with_check']],'2614': ['\\u2614', ['umbrella']],'2615': ['\\u2615', ['coffee']],'261d': ['\\u261D', ['point_up']],'263a': ['\\u263A', ['relaxed']],'2648': ['\\u2648', ['aries']],'2649': ['\\u2649', ['taurus']],'264a': ['\\u264A', ['gemini']],'264b': ['\\u264B', ['cancer']],'264c': ['\\u264C', ['leo']],'264d': ['\\u264D', ['virgo']],'264e': ['\\u264E', ['libra']],'264f': ['\\u264F', ['scorpius']],'2650': ['\\u2650', ['sagittarius']],'2651': ['\\u2651', ['capricorn']],'2652': ['\\u2652', ['aquarius']],'2653': ['\\u2653', ['pisces']],'2660': ['\\u2660', ['spades']],'2663': ['\\u2663', ['clubs']],'2665': ['\\u2665', ['hearts']],'2666': ['\\u2666', ['diamonds']],'2668': ['\\u2668', ['hotsprings']],'267b': ['\\u267B', ['recycle']],'267f': ['\\u267F', ['wheelchair']],'2693': ['\\u2693', ['anchor']],'26a0': ['\\u26A0', ['warning']],'26a1': ['\\u26A1', ['zap']],'26aa': ['\\u26AA', ['white_circle']],'26ab': ['\\u26AB', ['black_circle']],'26bd': ['\\u26BD', ['soccer']],'26be': ['\\u26BE', ['baseball']],'26c4': ['\\u26C4', ['snowman']],'26c5': ['\\u26C5', ['partly_sunny']],'26ce': ['\\u26CE', ['ophiuchus']],'26d4': ['\\u26D4', ['no_entry']],'26ea': ['\\u26EA', ['church']],'26f2': ['\\u26F2', ['fountain']],'26f3': ['\\u26F3', ['golf']],'26f5': ['\\u26F5', ['boat', 'sailboat']],'26fa': ['\\u26FA', ['tent']],'26fd': ['\\u26FD', ['fuelpump']],'2702': ['\\u2702', ['scissors']],'2705': ['\\u2705', ['white_check_mark']],'2708': ['\\u2708', ['airplane']],'2709': ['\\u2709', ['email', 'envelope']],'270a': ['\\u270A', ['fist']],'270b': ['\\u270B', ['hand', 'raised_hand']],'270c': ['\\u270C', ['v']],'270f': ['\\u270F', ['pencil2']],'2712': ['\\u2712', ['black_nib']],'2714': ['\\u2714', ['heavy_check_mark']],'2716': ['\\u2716', ['heavy_multiplication_x']],'2728': ['\\u2728', ['sparkles']],'2733': ['\\u2733', ['eight_spoked_asterisk']],'2734': ['\\u2734', ['eight_pointed_black_star']],'2744': ['\\u2744', ['snowflake']],'2747': ['\\u2747', ['sparkle']],'274c': ['\\u274C', ['x']],'274e': ['\\u274E', ['negative_squared_cross_mark']],'2753': ['\\u2753', ['question']],'2754': ['\\u2754', ['grey_question']],'2755': ['\\u2755', ['grey_exclamation']],'2757': ['\\u2757', ['exclamation', 'heavy_exclamation_mark']],'2764': ['\\u2764', ['heart'], '<3'],'2795': ['\\u2795', ['heavy_plus_sign']],'2796': ['\\u2796', ['heavy_minus_sign']],'2797': ['\\u2797', ['heavy_division_sign']],'27a1': ['\\u27A1', ['arrow_right']],'27b0': ['\\u27B0', ['curly_loop']],'27bf': ['\\u27BF', ['loop']],'2934': ['\\u2934', ['arrow_heading_up']],'2935': ['\\u2935', ['arrow_heading_down']],'2b05': ['\\u2B05', ['arrow_left']],'2b06': ['\\u2B06', ['arrow_up']],'2b07': ['\\u2B07', ['arrow_down']],'2b1b': ['\\u2B1B', ['black_large_square']],'2b1c': ['\\u2B1C', ['white_large_square']],'2b50': ['\\u2B50', ['star']],'2b55': ['\\u2B55', ['o']],'3030': ['\\u3030', ['wavy_dash']],'303d': ['\\u303D', ['part_alternation_mark']],'3297': ['\\u3297', ['congratulations']],'3299': ['\\u3299', ['secret']],'1f004': ['\\uD83C\\uDC04', ['mahjong']],'1f0cf': ['\\uD83C\\uDCCF', ['black_joker']],'1f170': ['\\uD83C\\uDD70', ['a']],'1f171': ['\\uD83C\\uDD71', ['b']],'1f17e': ['\\uD83C\\uDD7E', ['o2']],'1f17f': ['\\uD83C\\uDD7F', ['parking']],'1f18e': ['\\uD83C\\uDD8E', ['ab']],'1f191': ['\\uD83C\\uDD91', ['cl']],'1f192': ['\\uD83C\\uDD92', ['cool']],'1f193': ['\\uD83C\\uDD93', ['free']],'1f194': ['\\uD83C\\uDD94', ['id']],'1f195': ['\\uD83C\\uDD95', ['new']],'1f196': ['\\uD83C\\uDD96', ['ng']],'1f197': ['\\uD83C\\uDD97', ['ok']],'1f198': ['\\uD83C\\uDD98', ['sos']],'1f199': ['\\uD83C\\uDD99', ['up']],'1f19a': ['\\uD83C\\uDD9A', ['vs']],'1f201': ['\\uD83C\\uDE01', ['koko']],'1f202': ['\\uD83C\\uDE02', ['sa']],'1f21a': ['\\uD83C\\uDE1A', ['u7121']],'1f22f': ['\\uD83C\\uDE2F', ['u6307']],'1f232': ['\\uD83C\\uDE32', ['u7981']],'1f233': ['\\uD83C\\uDE33', ['u7a7a']],'1f234': ['\\uD83C\\uDE34', ['u5408']],'1f235': ['\\uD83C\\uDE35', ['u6e80']],'1f236': ['\\uD83C\\uDE36', ['u6709']],'1f237': ['\\uD83C\\uDE37', ['u6708']],'1f238': ['\\uD83C\\uDE38', ['u7533']],'1f239': ['\\uD83C\\uDE39', ['u5272']],'1f23a': ['\\uD83C\\uDE3A', ['u55b6']],'1f250': ['\\uD83C\\uDE50', ['ideograph_advantage']],'1f251': ['\\uD83C\\uDE51', ['accept']],'1f300': ['\\uD83C\\uDF00', ['cyclone']],'1f301': ['\\uD83C\\uDF01', ['foggy']],'1f302': ['\\uD83C\\uDF02', ['closed_umbrella']],'1f303': ['\\uD83C\\uDF03', ['night_with_stars']],'1f304': ['\\uD83C\\uDF04', ['sunrise_over_mountains']],'1f305': ['\\uD83C\\uDF05', ['sunrise']],'1f306': ['\\uD83C\\uDF06', ['city_sunset']],'1f307': ['\\uD83C\\uDF07', ['city_sunrise']],'1f308': ['\\uD83C\\uDF08', ['rainbow']],'1f309': ['\\uD83C\\uDF09', ['bridge_at_night']],'1f30a': ['\\uD83C\\uDF0A', ['ocean']],'1f30b': ['\\uD83C\\uDF0B', ['volcano']],'1f30c': ['\\uD83C\\uDF0C', ['milky_way']],'1f30d': ['\\uD83C\\uDF0D', ['earth_africa']],'1f30e': ['\\uD83C\\uDF0E', ['earth_americas']],'1f30f': ['\\uD83C\\uDF0F', ['earth_asia']],'1f310': ['\\uD83C\\uDF10', ['globe_with_meridians']],'1f311': ['\\uD83C\\uDF11', ['new_moon']],'1f312': ['\\uD83C\\uDF12', ['waxing_crescent_moon']],'1f313': ['\\uD83C\\uDF13', ['first_quarter_moon']],'1f314': ['\\uD83C\\uDF14', ['moon', 'waxing_gibbous_moon']],'1f315': ['\\uD83C\\uDF15', ['full_moon']],'1f316': ['\\uD83C\\uDF16', ['waning_gibbous_moon']],'1f317': ['\\uD83C\\uDF17', ['last_quarter_moon']],'1f318': ['\\uD83C\\uDF18', ['waning_crescent_moon']],'1f319': ['\\uD83C\\uDF19', ['crescent_moon']],'1f320': ['\\uD83C\\uDF20', ['stars']],'1f31a': ['\\uD83C\\uDF1A', ['new_moon_with_face']],'1f31b': ['\\uD83C\\uDF1B', ['first_quarter_moon_with_face']],'1f31c': ['\\uD83C\\uDF1C', ['last_quarter_moon_with_face']],'1f31d': ['\\uD83C\\uDF1D', ['full_moon_with_face']],'1f31e': ['\\uD83C\\uDF1E', ['sun_with_face']],'1f31f': ['\\uD83C\\uDF1F', ['star2']],'1f330': ['\\uD83C\\uDF30', ['chestnut']],'1f331': ['\\uD83C\\uDF31', ['seedling']],'1f332': ['\\uD83C\\uDF32', ['evergreen_tree']],'1f333': ['\\uD83C\\uDF33', ['deciduous_tree']],'1f334': ['\\uD83C\\uDF34', ['palm_tree']],'1f335': ['\\uD83C\\uDF35', ['cactus']],'1f337': ['\\uD83C\\uDF37', ['tulip']],'1f338': ['\\uD83C\\uDF38', ['cherry_blossom']],'1f339': ['\\uD83C\\uDF39', ['rose']],'1f33a': ['\\uD83C\\uDF3A', ['hibiscus']],'1f33b': ['\\uD83C\\uDF3B', ['sunflower']],'1f33c': ['\\uD83C\\uDF3C', ['blossom']],'1f33d': ['\\uD83C\\uDF3D', ['corn']],'1f33e': ['\\uD83C\\uDF3E', ['ear_of_rice']],'1f33f': ['\\uD83C\\uDF3F', ['herb']],'1f340': ['\\uD83C\\uDF40', ['four_leaf_clover']],'1f341': ['\\uD83C\\uDF41', ['maple_leaf']],'1f342': ['\\uD83C\\uDF42', ['fallen_leaf']],'1f343': ['\\uD83C\\uDF43', ['leaves']],'1f344': ['\\uD83C\\uDF44', ['mushroom']],'1f345': ['\\uD83C\\uDF45', ['tomato']],'1f346': ['\\uD83C\\uDF46', ['eggplant']],'1f347': ['\\uD83C\\uDF47', ['grapes']],'1f348': ['\\uD83C\\uDF48', ['melon']],'1f349': ['\\uD83C\\uDF49', ['watermelon']],'1f34a': ['\\uD83C\\uDF4A', ['tangerine']],'1f34b': ['\\uD83C\\uDF4B', ['lemon']],'1f34c': ['\\uD83C\\uDF4C', ['banana']],'1f34d': ['\\uD83C\\uDF4D', ['pineapple']],'1f34e': ['\\uD83C\\uDF4E', ['apple']],'1f34f': ['\\uD83C\\uDF4F', ['green_apple']],'1f350': ['\\uD83C\\uDF50', ['pear']],'1f351': ['\\uD83C\\uDF51', ['peach']],'1f352': ['\\uD83C\\uDF52', ['cherries']],'1f353': ['\\uD83C\\uDF53', ['strawberry']],'1f354': ['\\uD83C\\uDF54', ['hamburger']],'1f355': ['\\uD83C\\uDF55', ['pizza']],'1f356': ['\\uD83C\\uDF56', ['meat_on_bone']],'1f357': ['\\uD83C\\uDF57', ['poultry_leg']],'1f358': ['\\uD83C\\uDF58', ['rice_cracker']],'1f359': ['\\uD83C\\uDF59', ['rice_ball']],'1f35a': ['\\uD83C\\uDF5A', ['rice']],'1f35b': ['\\uD83C\\uDF5B', ['curry']],'1f35c': ['\\uD83C\\uDF5C', ['ramen']],'1f35d': ['\\uD83C\\uDF5D', ['spaghetti']],'1f35e': ['\\uD83C\\uDF5E', ['bread']],'1f35f': ['\\uD83C\\uDF5F', ['fries']],'1f360': ['\\uD83C\\uDF60', ['sweet_potato']],'1f361': ['\\uD83C\\uDF61', ['dango']],'1f362': ['\\uD83C\\uDF62', ['oden']],'1f363': ['\\uD83C\\uDF63', ['sushi']],'1f364': ['\\uD83C\\uDF64', ['fried_shrimp']],'1f365': ['\\uD83C\\uDF65', ['fish_cake']],'1f366': ['\\uD83C\\uDF66', ['icecream']],'1f367': ['\\uD83C\\uDF67', ['shaved_ice']],'1f368': ['\\uD83C\\uDF68', ['ice_cream']],'1f369': ['\\uD83C\\uDF69', ['doughnut']],'1f36a': ['\\uD83C\\uDF6A', ['cookie']],'1f36b': ['\\uD83C\\uDF6B', ['chocolate_bar']],'1f36c': ['\\uD83C\\uDF6C', ['candy']],'1f36d': ['\\uD83C\\uDF6D', ['lollipop']],'1f36e': ['\\uD83C\\uDF6E', ['custard']],'1f36f': ['\\uD83C\\uDF6F', ['honey_pot']],'1f370': ['\\uD83C\\uDF70', ['cake']],'1f371': ['\\uD83C\\uDF71', ['bento']],'1f372': ['\\uD83C\\uDF72', ['stew']],'1f373': ['\\uD83C\\uDF73', ['egg']],'1f374': ['\\uD83C\\uDF74', ['fork_and_knife']],'1f375': ['\\uD83C\\uDF75', ['tea']],'1f376': ['\\uD83C\\uDF76', ['sake']],'1f377': ['\\uD83C\\uDF77', ['wine_glass']],'1f378': ['\\uD83C\\uDF78', ['cocktail']],'1f379': ['\\uD83C\\uDF79', ['tropical_drink']],'1f37a': ['\\uD83C\\uDF7A', ['beer']],'1f37b': ['\\uD83C\\uDF7B', ['beers']],'1f37c': ['\\uD83C\\uDF7C', ['baby_bottle']],'1f380': ['\\uD83C\\uDF80', ['ribbon']],'1f381': ['\\uD83C\\uDF81', ['gift']],'1f382': ['\\uD83C\\uDF82', ['birthday']],'1f383': ['\\uD83C\\uDF83', ['jack_o_lantern']],'1f384': ['\\uD83C\\uDF84', ['christmas_tree']],'1f385': ['\\uD83C\\uDF85', ['santa']],'1f386': ['\\uD83C\\uDF86', ['fireworks']],'1f387': ['\\uD83C\\uDF87', ['sparkler']],'1f388': ['\\uD83C\\uDF88', ['balloon']],'1f389': ['\\uD83C\\uDF89', ['tada']],'1f38a': ['\\uD83C\\uDF8A', ['confetti_ball']],'1f38b': ['\\uD83C\\uDF8B', ['tanabata_tree']],'1f38c': ['\\uD83C\\uDF8C', ['crossed_flags']],'1f38d': ['\\uD83C\\uDF8D', ['bamboo']],'1f38e': ['\\uD83C\\uDF8E', ['dolls']],'1f38f': ['\\uD83C\\uDF8F', ['flags']],'1f390': ['\\uD83C\\uDF90', ['wind_chime']],'1f391': ['\\uD83C\\uDF91', ['rice_scene']],'1f392': ['\\uD83C\\uDF92', ['school_satchel']],'1f393': ['\\uD83C\\uDF93', ['mortar_board']],'1f3a0': ['\\uD83C\\uDFA0', ['carousel_horse']],'1f3a1': ['\\uD83C\\uDFA1', ['ferris_wheel']],'1f3a2': ['\\uD83C\\uDFA2', ['roller_coaster']],'1f3a3': ['\\uD83C\\uDFA3', ['fishing_pole_and_fish']],'1f3a4': ['\\uD83C\\uDFA4', ['microphone']],'1f3a5': ['\\uD83C\\uDFA5', ['movie_camera']],'1f3a6': ['\\uD83C\\uDFA6', ['cinema']],'1f3a7': ['\\uD83C\\uDFA7', ['headphones']],'1f3a8': ['\\uD83C\\uDFA8', ['art']],'1f3a9': ['\\uD83C\\uDFA9', ['tophat']],'1f3aa': ['\\uD83C\\uDFAA', ['circus_tent']],'1f3ab': ['\\uD83C\\uDFAB', ['ticket']],'1f3ac': ['\\uD83C\\uDFAC', ['clapper']],'1f3ad': ['\\uD83C\\uDFAD', ['performing_arts']],'1f3ae': ['\\uD83C\\uDFAE', ['video_game']],'1f3af': ['\\uD83C\\uDFAF', ['dart']],'1f3b0': ['\\uD83C\\uDFB0', ['slot_machine']],'1f3b1': ['\\uD83C\\uDFB1', ['8ball']],'1f3b2': ['\\uD83C\\uDFB2', ['game_die']],'1f3b3': ['\\uD83C\\uDFB3', ['bowling']],'1f3b4': ['\\uD83C\\uDFB4', ['flower_playing_cards']],'1f3b5': ['\\uD83C\\uDFB5', ['musical_note']],'1f3b6': ['\\uD83C\\uDFB6', ['notes']],'1f3b7': ['\\uD83C\\uDFB7', ['saxophone']],'1f3b8': ['\\uD83C\\uDFB8', ['guitar']],'1f3b9': ['\\uD83C\\uDFB9', ['musical_keyboard']],'1f3ba': ['\\uD83C\\uDFBA', ['trumpet']],'1f3bb': ['\\uD83C\\uDFBB', ['violin']],'1f3bc': ['\\uD83C\\uDFBC', ['musical_score']],'1f3bd': ['\\uD83C\\uDFBD', ['running_shirt_with_sash']],'1f3be': ['\\uD83C\\uDFBE', ['tennis']],'1f3bf': ['\\uD83C\\uDFBF', ['ski']],'1f3c0': ['\\uD83C\\uDFC0', ['basketball']],'1f3c1': ['\\uD83C\\uDFC1', ['checkered_flag']],'1f3c2': ['\\uD83C\\uDFC2', ['snowboarder']],'1f3c3': ['\\uD83C\\uDFC3', ['runner', 'running']],'1f3c4': ['\\uD83C\\uDFC4', ['surfer']],'1f3c6': ['\\uD83C\\uDFC6', ['trophy']],'1f3c7': ['\\uD83C\\uDFC7', ['horse_racing']],'1f3c8': ['\\uD83C\\uDFC8', ['football']],'1f3c9': ['\\uD83C\\uDFC9', ['rugby_football']],'1f3ca': ['\\uD83C\\uDFCA', ['swimmer']],'1f3e0': ['\\uD83C\\uDFE0', ['house']],'1f3e1': ['\\uD83C\\uDFE1', ['house_with_garden']],'1f3e2': ['\\uD83C\\uDFE2', ['office']],'1f3e3': ['\\uD83C\\uDFE3', ['post_office']],'1f3e4': ['\\uD83C\\uDFE4', ['european_post_office']],'1f3e5': ['\\uD83C\\uDFE5', ['hospital']],'1f3e6': ['\\uD83C\\uDFE6', ['bank']],'1f3e7': ['\\uD83C\\uDFE7', ['atm']],'1f3e8': ['\\uD83C\\uDFE8', ['hotel']],'1f3e9': ['\\uD83C\\uDFE9', ['love_hotel']],'1f3ea': ['\\uD83C\\uDFEA', ['convenience_store']],'1f3eb': ['\\uD83C\\uDFEB', ['school']],'1f3ec': ['\\uD83C\\uDFEC', ['department_store']],'1f3ed': ['\\uD83C\\uDFED', ['factory']],'1f3ee': ['\\uD83C\\uDFEE', ['izakaya_lantern', 'lantern']],'1f3ef': ['\\uD83C\\uDFEF', ['japanese_castle']],'1f3f0': ['\\uD83C\\uDFF0', ['european_castle']],'1f400': ['\\uD83D\\uDC00', ['rat']],'1f401': ['\\uD83D\\uDC01', ['mouse2']],'1f402': ['\\uD83D\\uDC02', ['ox']],'1f403': ['\\uD83D\\uDC03', ['water_buffalo']],'1f404': ['\\uD83D\\uDC04', ['cow2']],'1f405': ['\\uD83D\\uDC05', ['tiger2']],'1f406': ['\\uD83D\\uDC06', ['leopard']],'1f407': ['\\uD83D\\uDC07', ['rabbit2']],'1f408': ['\\uD83D\\uDC08', ['cat2']],'1f409': ['\\uD83D\\uDC09', ['dragon']],'1f40a': ['\\uD83D\\uDC0A', ['crocodile']],'1f40b': ['\\uD83D\\uDC0B', ['whale2']],'1f40c': ['\\uD83D\\uDC0C', ['snail']],'1f40d': ['\\uD83D\\uDC0D', ['snake']],'1f40e': ['\\uD83D\\uDC0E', ['racehorse']],'1f40f': ['\\uD83D\\uDC0F', ['ram']],'1f410': ['\\uD83D\\uDC10', ['goat']],'1f411': ['\\uD83D\\uDC11', ['sheep']],'1f412': ['\\uD83D\\uDC12', ['monkey']],'1f413': ['\\uD83D\\uDC13', ['rooster']],'1f414': ['\\uD83D\\uDC14', ['chicken']],'1f415': ['\\uD83D\\uDC15', ['dog2']],'1f416': ['\\uD83D\\uDC16', ['pig2']],'1f417': ['\\uD83D\\uDC17', ['boar']],'1f418': ['\\uD83D\\uDC18', ['elephant']],'1f419': ['\\uD83D\\uDC19', ['octopus']],'1f41a': ['\\uD83D\\uDC1A', ['shell']],'1f41b': ['\\uD83D\\uDC1B', ['bug']],'1f41c': ['\\uD83D\\uDC1C', ['ant']],'1f41d': ['\\uD83D\\uDC1D', ['bee', 'honeybee']],'1f41e': ['\\uD83D\\uDC1E', ['beetle']],'1f41f': ['\\uD83D\\uDC1F', ['fish']],'1f420': ['\\uD83D\\uDC20', ['tropical_fish']],'1f421': ['\\uD83D\\uDC21', ['blowfish']],'1f422': ['\\uD83D\\uDC22', ['turtle']],'1f423': ['\\uD83D\\uDC23', ['hatching_chick']],'1f424': ['\\uD83D\\uDC24', ['baby_chick']],'1f425': ['\\uD83D\\uDC25', ['hatched_chick']],'1f426': ['\\uD83D\\uDC26', ['bird']],'1f427': ['\\uD83D\\uDC27', ['penguin']],'1f428': ['\\uD83D\\uDC28', ['koala']],'1f429': ['\\uD83D\\uDC29', ['poodle']],'1f42a': ['\\uD83D\\uDC2A', ['dromedary_camel']],'1f42b': ['\\uD83D\\uDC2B', ['camel']],'1f42c': ['\\uD83D\\uDC2C', ['dolphin', 'flipper']],'1f42d': ['\\uD83D\\uDC2D', ['mouse']],'1f42e': ['\\uD83D\\uDC2E', ['cow']],'1f42f': ['\\uD83D\\uDC2F', ['tiger']],'1f430': ['\\uD83D\\uDC30', ['rabbit']],'1f431': ['\\uD83D\\uDC31', ['cat']],'1f432': ['\\uD83D\\uDC32', ['dragon_face']],'1f433': ['\\uD83D\\uDC33', ['whale']],'1f434': ['\\uD83D\\uDC34', ['horse']],'1f435': ['\\uD83D\\uDC35', ['monkey_face']],'1f436': ['\\uD83D\\uDC36', ['dog']],'1f437': ['\\uD83D\\uDC37', ['pig']],'1f438': ['\\uD83D\\uDC38', ['frog']],'1f439': ['\\uD83D\\uDC39', ['hamster']],'1f43a': ['\\uD83D\\uDC3A', ['wolf']],'1f43b': ['\\uD83D\\uDC3B', ['bear']],'1f43c': ['\\uD83D\\uDC3C', ['panda_face']],'1f43d': ['\\uD83D\\uDC3D', ['pig_nose']],'1f43e': ['\\uD83D\\uDC3E', ['feet', 'paw_prints']],'1f440': ['\\uD83D\\uDC40', ['eyes']],'1f442': ['\\uD83D\\uDC42', ['ear']],'1f443': ['\\uD83D\\uDC43', ['nose']],'1f444': ['\\uD83D\\uDC44', ['lips']],'1f445': ['\\uD83D\\uDC45', ['tongue']],'1f446': ['\\uD83D\\uDC46', ['point_up_2']],'1f447': ['\\uD83D\\uDC47', ['point_down']],'1f448': ['\\uD83D\\uDC48', ['point_left']],'1f449': ['\\uD83D\\uDC49', ['point_right']],'1f44a': ['\\uD83D\\uDC4A', ['facepunch', 'punch']],'1f44b': ['\\uD83D\\uDC4B', ['wave']],'1f44c': ['\\uD83D\\uDC4C', ['ok_hand']],'1f44d': ['\\uD83D\\uDC4D', ['+1', 'thumbsup']],'1f44e': ['\\uD83D\\uDC4E', ['-1', 'thumbsdown']],'1f44f': ['\\uD83D\\uDC4F', ['clap']],'1f450': ['\\uD83D\\uDC50', ['open_hands']],'1f451': ['\\uD83D\\uDC51', ['crown']],'1f452': ['\\uD83D\\uDC52', ['womans_hat']],'1f453': ['\\uD83D\\uDC53', ['eyeglasses']],'1f454': ['\\uD83D\\uDC54', ['necktie']],'1f455': ['\\uD83D\\uDC55', ['shirt', 'tshirt']],'1f456': ['\\uD83D\\uDC56', ['jeans']],'1f457': ['\\uD83D\\uDC57', ['dress']],'1f458': ['\\uD83D\\uDC58', ['kimono']],'1f459': ['\\uD83D\\uDC59', ['bikini']],'1f45a': ['\\uD83D\\uDC5A', ['womans_clothes']],'1f45b': ['\\uD83D\\uDC5B', ['purse']],'1f45c': ['\\uD83D\\uDC5C', ['handbag']],'1f45d': ['\\uD83D\\uDC5D', ['pouch']],'1f45e': ['\\uD83D\\uDC5E', ['mans_shoe', 'shoe']],'1f45f': ['\\uD83D\\uDC5F', ['athletic_shoe']],'1f460': ['\\uD83D\\uDC60', ['high_heel']],'1f461': ['\\uD83D\\uDC61', ['sandal']],'1f462': ['\\uD83D\\uDC62', ['boot']],'1f463': ['\\uD83D\\uDC63', ['footprints']],'1f464': ['\\uD83D\\uDC64', ['bust_in_silhouette']],'1f465': ['\\uD83D\\uDC65', ['busts_in_silhouette']],'1f466': ['\\uD83D\\uDC66', ['boy']],'1f467': ['\\uD83D\\uDC67', ['girl']],'1f468': ['\\uD83D\\uDC68', ['man']],'1f469': ['\\uD83D\\uDC69', ['woman']],'1f46a': ['\\uD83D\\uDC6A', ['family']],'1f46b': ['\\uD83D\\uDC6B', ['couple']],'1f46c': ['\\uD83D\\uDC6C', ['two_men_holding_hands']],'1f46d': ['\\uD83D\\uDC6D', ['two_women_holding_hands']],'1f46e': ['\\uD83D\\uDC6E', ['cop']],'1f46f': ['\\uD83D\\uDC6F', ['dancers']],'1f470': ['\\uD83D\\uDC70', ['bride_with_veil']],'1f471': ['\\uD83D\\uDC71', ['person_with_blond_hair']],'1f472': ['\\uD83D\\uDC72', ['man_with_gua_pi_mao']],'1f473': ['\\uD83D\\uDC73', ['man_with_turban']],'1f474': ['\\uD83D\\uDC74', ['older_man']],'1f475': ['\\uD83D\\uDC75', ['older_woman']],'1f476': ['\\uD83D\\uDC76', ['baby']],'1f477': ['\\uD83D\\uDC77', ['construction_worker']],'1f478': ['\\uD83D\\uDC78', ['princess']],'1f479': ['\\uD83D\\uDC79', ['japanese_ogre']],'1f47a': ['\\uD83D\\uDC7A', ['japanese_goblin']],'1f47b': ['\\uD83D\\uDC7B', ['ghost']],'1f47c': ['\\uD83D\\uDC7C', ['angel']],'1f47d': ['\\uD83D\\uDC7D', ['alien']],'1f47e': ['\\uD83D\\uDC7E', ['space_invader']],'1f47f': ['\\uD83D\\uDC7F', ['imp']],'1f480': ['\\uD83D\\uDC80', ['skull']],'1f481': ['\\uD83D\\uDC81', ['information_desk_person']],'1f482': ['\\uD83D\\uDC82', ['guardsman']],'1f483': ['\\uD83D\\uDC83', ['dancer']],'1f484': ['\\uD83D\\uDC84', ['lipstick']],'1f485': ['\\uD83D\\uDC85', ['nail_care']],'1f486': ['\\uD83D\\uDC86', ['massage']],'1f487': ['\\uD83D\\uDC87', ['haircut']],'1f488': ['\\uD83D\\uDC88', ['barber']],'1f489': ['\\uD83D\\uDC89', ['syringe']],'1f48a': ['\\uD83D\\uDC8A', ['pill']],'1f48b': ['\\uD83D\\uDC8B', ['kiss']],'1f48c': ['\\uD83D\\uDC8C', ['love_letter']],'1f48d': ['\\uD83D\\uDC8D', ['ring']],'1f48e': ['\\uD83D\\uDC8E', ['gem']],'1f48f': ['\\uD83D\\uDC8F', ['couplekiss']],'1f490': ['\\uD83D\\uDC90', ['bouquet']],'1f491': ['\\uD83D\\uDC91', ['couple_with_heart']],'1f492': ['\\uD83D\\uDC92', ['wedding']],'1f493': ['\\uD83D\\uDC93', ['heartbeat']],'1f494': ['\\uD83D\\uDC94', ['broken_heart'], '<\\/3'],'1f495': ['\\uD83D\\uDC95', ['two_hearts']],'1f496': ['\\uD83D\\uDC96', ['sparkling_heart']],'1f497': ['\\uD83D\\uDC97', ['heartpulse']],'1f498': ['\\uD83D\\uDC98', ['cupid']],'1f499': ['\\uD83D\\uDC99', ['blue_heart'], '<3'],'1f49a': ['\\uD83D\\uDC9A', ['green_heart'], '<3'],'1f49b': ['\\uD83D\\uDC9B', ['yellow_heart'], '<3'],'1f49c': ['\\uD83D\\uDC9C', ['purple_heart'], '<3'],'1f49d': ['\\uD83D\\uDC9D', ['gift_heart']],'1f49e': ['\\uD83D\\uDC9E', ['revolving_hearts']],'1f49f': ['\\uD83D\\uDC9F', ['heart_decoration']],'1f4a0': ['\\uD83D\\uDCA0', ['diamond_shape_with_a_dot_inside']],'1f4a1': ['\\uD83D\\uDCA1', ['bulb']],'1f4a2': ['\\uD83D\\uDCA2', ['anger']],'1f4a3': ['\\uD83D\\uDCA3', ['bomb']],'1f4a4': ['\\uD83D\\uDCA4', ['zzz']],'1f4a5': ['\\uD83D\\uDCA5', ['boom', 'collision']],'1f4a6': ['\\uD83D\\uDCA6', ['sweat_drops']],'1f4a7': ['\\uD83D\\uDCA7', ['droplet']],'1f4a8': ['\\uD83D\\uDCA8', ['dash']],'1f4a9': ['\\uD83D\\uDCA9', ['hankey', 'poop', 'shit']],'1f4aa': ['\\uD83D\\uDCAA', ['muscle']],'1f4ab': ['\\uD83D\\uDCAB', ['dizzy']],'1f4ac': ['\\uD83D\\uDCAC', ['speech_balloon']],'1f4ad': ['\\uD83D\\uDCAD', ['thought_balloon']],'1f4ae': ['\\uD83D\\uDCAE', ['white_flower']],'1f4af': ['\\uD83D\\uDCAF', ['100']],'1f4b0': ['\\uD83D\\uDCB0', ['moneybag']],'1f4b1': ['\\uD83D\\uDCB1', ['currency_exchange']],'1f4b2': ['\\uD83D\\uDCB2', ['heavy_dollar_sign']],'1f4b3': ['\\uD83D\\uDCB3', ['credit_card']],'1f4b4': ['\\uD83D\\uDCB4', ['yen']],'1f4b5': ['\\uD83D\\uDCB5', ['dollar']],'1f4b6': ['\\uD83D\\uDCB6', ['euro']],'1f4b7': ['\\uD83D\\uDCB7', ['pound']],'1f4b8': ['\\uD83D\\uDCB8', ['money_with_wings']],'1f4b9': ['\\uD83D\\uDCB9', ['chart']],'1f4ba': ['\\uD83D\\uDCBA', ['seat']],'1f4bb': ['\\uD83D\\uDCBB', ['computer']],'1f4bc': ['\\uD83D\\uDCBC', ['briefcase']],'1f4bd': ['\\uD83D\\uDCBD', ['minidisc']],'1f4be': ['\\uD83D\\uDCBE', ['floppy_disk']],'1f4bf': ['\\uD83D\\uDCBF', ['cd']],'1f4c0': ['\\uD83D\\uDCC0', ['dvd']],'1f4c1': ['\\uD83D\\uDCC1', ['file_folder']],'1f4c2': ['\\uD83D\\uDCC2', ['open_file_folder']],'1f4c3': ['\\uD83D\\uDCC3', ['page_with_curl']],'1f4c4': ['\\uD83D\\uDCC4', ['page_facing_up']],'1f4c5': ['\\uD83D\\uDCC5', ['date']],'1f4c6': ['\\uD83D\\uDCC6', ['calendar']],'1f4c7': ['\\uD83D\\uDCC7', ['card_index']],'1f4c8': ['\\uD83D\\uDCC8', ['chart_with_upwards_trend']],'1f4c9': ['\\uD83D\\uDCC9', ['chart_with_downwards_trend']],'1f4ca': ['\\uD83D\\uDCCA', ['bar_chart']],'1f4cb': ['\\uD83D\\uDCCB', ['clipboard']],'1f4cc': ['\\uD83D\\uDCCC', ['pushpin']],'1f4cd': ['\\uD83D\\uDCCD', ['round_pushpin']],'1f4ce': ['\\uD83D\\uDCCE', ['paperclip']],'1f4cf': ['\\uD83D\\uDCCF', ['straight_ruler']],'1f4d0': ['\\uD83D\\uDCD0', ['triangular_ruler']],'1f4d1': ['\\uD83D\\uDCD1', ['bookmark_tabs']],'1f4d2': ['\\uD83D\\uDCD2', ['ledger']],'1f4d3': ['\\uD83D\\uDCD3', ['notebook']],'1f4d4': ['\\uD83D\\uDCD4', ['notebook_with_decorative_cover']],'1f4d5': ['\\uD83D\\uDCD5', ['closed_book']],'1f4d6': ['\\uD83D\\uDCD6', ['book', 'open_book']],'1f4d7': ['\\uD83D\\uDCD7', ['green_book']],'1f4d8': ['\\uD83D\\uDCD8', ['blue_book']],'1f4d9': ['\\uD83D\\uDCD9', ['orange_book']],'1f4da': ['\\uD83D\\uDCDA', ['books']],'1f4db': ['\\uD83D\\uDCDB', ['name_badge']],'1f4dc': ['\\uD83D\\uDCDC', ['scroll']],'1f4dd': ['\\uD83D\\uDCDD', ['memo', 'pencil']],'1f4de': ['\\uD83D\\uDCDE', ['telephone_receiver']],'1f4df': ['\\uD83D\\uDCDF', ['pager']],'1f4e0': ['\\uD83D\\uDCE0', ['fax']],'1f4e1': ['\\uD83D\\uDCE1', ['satellite']],'1f4e2': ['\\uD83D\\uDCE2', ['loudspeaker']],'1f4e3': ['\\uD83D\\uDCE3', ['mega']],'1f4e4': ['\\uD83D\\uDCE4', ['outbox_tray']],'1f4e5': ['\\uD83D\\uDCE5', ['inbox_tray']],'1f4e6': ['\\uD83D\\uDCE6', ['package']],'1f4e7': ['\\uD83D\\uDCE7', ['e-mail']],'1f4e8': ['\\uD83D\\uDCE8', ['incoming_envelope']],'1f4e9': ['\\uD83D\\uDCE9', ['envelope_with_arrow']],'1f4ea': ['\\uD83D\\uDCEA', ['mailbox_closed']],'1f4eb': ['\\uD83D\\uDCEB', ['mailbox']],'1f4ec': ['\\uD83D\\uDCEC', ['mailbox_with_mail']],'1f4ed': ['\\uD83D\\uDCED', ['mailbox_with_no_mail']],'1f4ee': ['\\uD83D\\uDCEE', ['postbox']],'1f4ef': ['\\uD83D\\uDCEF', ['postal_horn']],'1f4f0': ['\\uD83D\\uDCF0', ['newspaper']],'1f4f1': ['\\uD83D\\uDCF1', ['iphone']],'1f4f2': ['\\uD83D\\uDCF2', ['calling']],'1f4f3': ['\\uD83D\\uDCF3', ['vibration_mode']],'1f4f4': ['\\uD83D\\uDCF4', ['mobile_phone_off']],'1f4f5': ['\\uD83D\\uDCF5', ['no_mobile_phones']],'1f4f6': ['\\uD83D\\uDCF6', ['signal_strength']],'1f4f7': ['\\uD83D\\uDCF7', ['camera']],'1f4f9': ['\\uD83D\\uDCF9', ['video_camera']],'1f4fa': ['\\uD83D\\uDCFA', ['tv']],'1f4fb': ['\\uD83D\\uDCFB', ['radio']],'1f4fc': ['\\uD83D\\uDCFC', ['vhs']],'1f500': ['\\uD83D\\uDD00', ['twisted_rightwards_arrows']],'1f501': ['\\uD83D\\uDD01', ['repeat']],'1f502': ['\\uD83D\\uDD02', ['repeat_one']],'1f503': ['\\uD83D\\uDD03', ['arrows_clockwise']],'1f504': ['\\uD83D\\uDD04', ['arrows_counterclockwise']],'1f505': ['\\uD83D\\uDD05', ['low_brightness']],'1f506': ['\\uD83D\\uDD06', ['high_brightness']],'1f507': ['\\uD83D\\uDD07', ['mute']],'1f508': ['\\uD83D\\uDD09', ['speaker']],'1f509': ['\\uD83D\\uDD09', ['sound']],'1f50a': ['\\uD83D\\uDD0A', ['loud_sound']],'1f50b': ['\\uD83D\\uDD0B', ['battery']],'1f50c': ['\\uD83D\\uDD0C', ['electric_plug']],'1f50d': ['\\uD83D\\uDD0D', ['mag']],'1f50e': ['\\uD83D\\uDD0E', ['mag_right']],'1f50f': ['\\uD83D\\uDD0F', ['lock_with_ink_pen']],'1f510': ['\\uD83D\\uDD10', ['closed_lock_with_key']],'1f511': ['\\uD83D\\uDD11', ['key']],'1f512': ['\\uD83D\\uDD12', ['lock']],'1f513': ['\\uD83D\\uDD13', ['unlock']],'1f514': ['\\uD83D\\uDD14', ['bell']],'1f515': ['\\uD83D\\uDD15', ['no_bell']],'1f516': ['\\uD83D\\uDD16', ['bookmark']],'1f517': ['\\uD83D\\uDD17', ['link']],'1f518': ['\\uD83D\\uDD18', ['radio_button']],'1f519': ['\\uD83D\\uDD19', ['back']],'1f51a': ['\\uD83D\\uDD1A', ['end']],'1f51b': ['\\uD83D\\uDD1B', ['on']],'1f51c': ['\\uD83D\\uDD1C', ['soon']],'1f51d': ['\\uD83D\\uDD1D', ['top']],'1f51e': ['\\uD83D\\uDD1E', ['underage']],'1f51f': ['\\uD83D\\uDD1F', ['keycap_ten']],'1f520': ['\\uD83D\\uDD20', ['capital_abcd']],'1f521': ['\\uD83D\\uDD21', ['abcd']],'1f522': ['\\uD83D\\uDD22', ['1234']],'1f523': ['\\uD83D\\uDD23', ['symbols']],'1f524': ['\\uD83D\\uDD24', ['abc']],'1f525': ['\\uD83D\\uDD25', ['fire']],'1f526': ['\\uD83D\\uDD26', ['flashlight']],'1f527': ['\\uD83D\\uDD27', ['wrench']],'1f528': ['\\uD83D\\uDD28', ['hammer']],'1f529': ['\\uD83D\\uDD29', ['nut_and_bolt']],'1f52a': ['\\uD83D\\uDD2A', ['hocho']],'1f52b': ['\\uD83D\\uDD2B', ['gun']],'1f52c': ['\\uD83D\\uDD2C', ['microscope']],'1f52d': ['\\uD83D\\uDD2D', ['telescope']],'1f52e': ['\\uD83D\\uDD2E', ['crystal_ball']],'1f52f': ['\\uD83D\\uDD2F', ['six_pointed_star']],'1f530': ['\\uD83D\\uDD30', ['beginner']],'1f531': ['\\uD83D\\uDD31', ['trident']],'1f532': ['\\uD83D\\uDD32', ['black_square_button']],'1f533': ['\\uD83D\\uDD33', ['white_square_button']],'1f534': ['\\uD83D\\uDD34', ['red_circle']],'1f535': ['\\uD83D\\uDD35', ['large_blue_circle']],'1f536': ['\\uD83D\\uDD36', ['large_orange_diamond']],'1f537': ['\\uD83D\\uDD37', ['large_blue_diamond']],'1f538': ['\\uD83D\\uDD38', ['small_orange_diamond']],'1f539': ['\\uD83D\\uDD39', ['small_blue_diamond']],'1f53a': ['\\uD83D\\uDD3A', ['small_red_triangle']],'1f53b': ['\\uD83D\\uDD3B', ['small_red_triangle_down']],'1f53c': ['\\uD83D\\uDD3C', ['arrow_up_small']],'1f53d': ['\\uD83D\\uDD3D', ['arrow_down_small']],'1f550': ['\\uD83D\\uDD50', ['clock1']],'1f551': ['\\uD83D\\uDD51', ['clock2']],'1f552': ['\\uD83D\\uDD52', ['clock3']],'1f553': ['\\uD83D\\uDD53', ['clock4']],'1f554': ['\\uD83D\\uDD54', ['clock5']],'1f555': ['\\uD83D\\uDD55', ['clock6']],'1f556': ['\\uD83D\\uDD56', ['clock7']],'1f557': ['\\uD83D\\uDD57', ['clock8']],'1f558': ['\\uD83D\\uDD58', ['clock9']],'1f559': ['\\uD83D\\uDD59', ['clock10']],'1f55a': ['\\uD83D\\uDD5A', ['clock11']],'1f55b': ['\\uD83D\\uDD5B', ['clock12']],'1f55c': ['\\uD83D\\uDD5C', ['clock130']],'1f55d': ['\\uD83D\\uDD5D', ['clock230']],'1f55e': ['\\uD83D\\uDD5E', ['clock330']],'1f55f': ['\\uD83D\\uDD5F', ['clock430']],'1f560': ['\\uD83D\\uDD60', ['clock530']],'1f561': ['\\uD83D\\uDD61', ['clock630']],'1f562': ['\\uD83D\\uDD62', ['clock730']],'1f563': ['\\uD83D\\uDD63', ['clock830']],'1f564': ['\\uD83D\\uDD64', ['clock930']],'1f565': ['\\uD83D\\uDD65', ['clock1030']],'1f566': ['\\uD83D\\uDD66', ['clock1130']],'1f567': ['\\uD83D\\uDD67', ['clock1230']],'1f5fb': ['\\uD83D\\uDDFB', ['mount_fuji']],'1f5fc': ['\\uD83D\\uDDFC', ['tokyo_tower']],'1f5fd': ['\\uD83D\\uDDFD', ['statue_of_liberty']],'1f5fe': ['\\uD83D\\uDDFE', ['japan']],'1f5ff': ['\\uD83D\\uDDFF', ['moyai']],'1f600': ['\\uD83D\\uDE00', ['grinning']],'1f601': ['\\uD83D\\uDE01', ['grin']],'1f602': ['\\uD83D\\uDE02', ['joy']],'1f603': ['\\uD83D\\uDE03', ['smiley'], ':)'],'1f604': ['\\uD83D\\uDE04', ['smile'], ':)'],'1f605': ['\\uD83D\\uDE05', ['sweat_smile']],'1f606': ['\\uD83D\\uDE06', ['laughing', 'satisfied']],'1f607': ['\\uD83D\\uDE07', ['innocent']],'1f608': ['\\uD83D\\uDE08', ['smiling_imp']],'1f609': ['\\uD83D\\uDE09', ['wink'], ';)'],'1f60a': ['\\uD83D\\uDE0A', ['blush']],'1f60b': ['\\uD83D\\uDE0B', ['yum']],'1f60c': ['\\uD83D\\uDE0C', ['relieved']],'1f60d': ['\\uD83D\\uDE0D', ['heart_eyes']],'1f60e': ['\\uD83D\\uDE0E', ['sunglasses']],'1f60f': ['\\uD83D\\uDE0F', ['smirk']],'1f610': ['\\uD83D\\uDE10', ['neutral_face']],'1f611': ['\\uD83D\\uDE11', ['expressionless']],'1f612': ['\\uD83D\\uDE12', ['unamused']],'1f613': ['\\uD83D\\uDE13', ['sweat']],'1f614': ['\\uD83D\\uDE14', ['pensive']],'1f615': ['\\uD83D\\uDE15', ['confused']],'1f616': ['\\uD83D\\uDE16', ['confounded']],'1f617': ['\\uD83D\\uDE17', ['kissing']],'1f618': ['\\uD83D\\uDE18', ['kissing_heart']],'1f619': ['\\uD83D\\uDE19', ['kissing_smiling_eyes']],'1f61a': ['\\uD83D\\uDE1A', ['kissing_closed_eyes']],'1f61b': ['\\uD83D\\uDE1B', ['stuck_out_tongue']],'1f61c': ['\\uD83D\\uDE1C', ['stuck_out_tongue_winking_eye'], ';p'],'1f61d': ['\\uD83D\\uDE1D', ['stuck_out_tongue_closed_eyes']],'1f61e': ['\\uD83D\\uDE1E', ['disappointed'], ':('],'1f61f': ['\\uD83D\\uDE1F', ['worried']],'1f620': ['\\uD83D\\uDE20', ['angry']],'1f621': ['\\uD83D\\uDE21', ['rage']],'1f622': ['\\uD83D\\uDE22', ['cry'], \":'(\"],'1f623': ['\\uD83D\\uDE23', ['persevere']],'1f624': ['\\uD83D\\uDE24', ['triumph']],'1f625': ['\\uD83D\\uDE25', ['disappointed_relieved']],'1f626': ['\\uD83D\\uDE26', ['frowning']],'1f627': ['\\uD83D\\uDE27', ['anguished']],'1f628': ['\\uD83D\\uDE28', ['fearful']],'1f629': ['\\uD83D\\uDE29', ['weary']],'1f62a': ['\\uD83D\\uDE2A', ['sleepy']],'1f62b': ['\\uD83D\\uDE2B', ['tired_face']],'1f62c': ['\\uD83D\\uDE2C', ['grimacing']],'1f62d': ['\\uD83D\\uDE2D', ['sob'], \":'(\"],'1f62e': ['\\uD83D\\uDE2E', ['open_mouth']],'1f62f': ['\\uD83D\\uDE2F', ['hushed']],'1f630': ['\\uD83D\\uDE30', ['cold_sweat']],'1f631': ['\\uD83D\\uDE31', ['scream']],'1f632': ['\\uD83D\\uDE32', ['astonished']],'1f633': ['\\uD83D\\uDE33', ['flushed']],'1f634': ['\\uD83D\\uDE34', ['sleeping']],'1f635': ['\\uD83D\\uDE35', ['dizzy_face']],'1f636': ['\\uD83D\\uDE36', ['no_mouth']],'1f637': ['\\uD83D\\uDE37', ['mask']],'1f638': ['\\uD83D\\uDE38', ['smile_cat']],'1f639': ['\\uD83D\\uDE39', ['joy_cat']],'1f63a': ['\\uD83D\\uDE3A', ['smiley_cat']],'1f63b': ['\\uD83D\\uDE3B', ['heart_eyes_cat']],'1f63c': ['\\uD83D\\uDE3C', ['smirk_cat']],'1f63d': ['\\uD83D\\uDE3D', ['kissing_cat']],'1f63e': ['\\uD83D\\uDE3E', ['pouting_cat']],'1f63f': ['\\uD83D\\uDE3F', ['crying_cat_face']],'1f640': ['\\uD83D\\uDE40', ['scream_cat']],'1f645': ['\\uD83D\\uDE45', ['no_good']],'1f646': ['\\uD83D\\uDE46', ['ok_woman']],'1f647': ['\\uD83D\\uDE47', ['bow']],'1f648': ['\\uD83D\\uDE48', ['see_no_evil']],'1f649': ['\\uD83D\\uDE49', ['hear_no_evil']],'1f64a': ['\\uD83D\\uDE4A', ['speak_no_evil']],'1f64b': ['\\uD83D\\uDE4B', ['raising_hand']],'1f64c': ['\\uD83D\\uDE4C', ['raised_hands']],'1f64d': ['\\uD83D\\uDE4D', ['person_frowning']],'1f64e': ['\\uD83D\\uDE4E', ['person_with_pouting_face']],'1f64f': ['\\uD83D\\uDE4F', ['pray']],'1f680': ['\\uD83D\\uDE80', ['rocket']],'1f681': ['\\uD83D\\uDE81', ['helicopter']],'1f682': ['\\uD83D\\uDE82', ['steam_locomotive']],'1f683': ['\\uD83D\\uDE83', ['railway_car']],'1f68b': ['\\uD83D\\uDE8B', ['train']],'1f684': ['\\uD83D\\uDE84', ['bullettrain_side']],'1f685': ['\\uD83D\\uDE85', ['bullettrain_front']],'1f686': ['\\uD83D\\uDE86', ['train2']],'1f687': ['\\uD83D\\uDE87', ['metro']],'1f688': ['\\uD83D\\uDE88', ['light_rail']],'1f689': ['\\uD83D\\uDE89', ['station']],'1f68a': ['\\uD83D\\uDE8A', ['tram']],'1f68c': ['\\uD83D\\uDE8C', ['bus']],'1f68d': ['\\uD83D\\uDE8D', ['oncoming_bus']],'1f68e': ['\\uD83D\\uDE8E', ['trolleybus']],'1f68f': ['\\uD83D\\uDE8F', ['busstop']],'1f690': ['\\uD83D\\uDE90', ['minibus']],'1f691': ['\\uD83D\\uDE91', ['ambulance']],'1f692': ['\\uD83D\\uDE92', ['fire_engine']],'1f693': ['\\uD83D\\uDE93', ['police_car']],'1f694': ['\\uD83D\\uDE94', ['oncoming_police_car']],'1f695': ['\\uD83D\\uDE95', ['taxi']],'1f696': ['\\uD83D\\uDE96', ['oncoming_taxi']],'1f697': ['\\uD83D\\uDE97', ['car', 'red_car']],'1f698': ['\\uD83D\\uDE98', ['oncoming_automobile']],'1f699': ['\\uD83D\\uDE99', ['blue_car']],'1f69a': ['\\uD83D\\uDE9A', ['truck']],'1f69b': ['\\uD83D\\uDE9B', ['articulated_lorry']],'1f69c': ['\\uD83D\\uDE9C', ['tractor']],'1f69d': ['\\uD83D\\uDE9D', ['monorail']],'1f69e': ['\\uD83D\\uDE9E', ['mountain_railway']],'1f69f': ['\\uD83D\\uDE9F', ['suspension_railway']],'1f6a0': ['\\uD83D\\uDEA0', ['mountain_cableway']],'1f6a1': ['\\uD83D\\uDEA1', ['aerial_tramway']],'1f6a2': ['\\uD83D\\uDEA2', ['ship']],'1f6a3': ['\\uD83D\\uDEA3', ['rowboat']],'1f6a4': ['\\uD83D\\uDEA4', ['speedboat']],'1f6a5': ['\\uD83D\\uDEA5', ['traffic_light']],'1f6a6': ['\\uD83D\\uDEA6', ['vertical_traffic_light']],'1f6a7': ['\\uD83D\\uDEA7', ['construction']],'1f6a8': ['\\uD83D\\uDEA8', ['rotating_light']],'1f6a9': ['\\uD83D\\uDEA9', ['triangular_flag_on_post']],'1f6aa': ['\\uD83D\\uDEAA', ['door']],'1f6ab': ['\\uD83D\\uDEAB', ['no_entry_sign']],'1f6ac': ['\\uD83D\\uDEAC', ['smoking']],'1f6ad': ['\\uD83D\\uDEAD', ['no_smoking']],'1f6ae': ['\\uD83D\\uDEAE', ['put_litter_in_its_place']],'1f6af': ['\\uD83D\\uDEAF', ['do_not_litter']],'1f6b0': ['\\uD83D\\uDEB0', ['potable_water']],'1f6b1': ['\\uD83D\\uDEB1', ['non-potable_water']],'1f6b2': ['\\uD83D\\uDEB2', ['bike']],'1f6b3': ['\\uD83D\\uDEB3', ['no_bicycles']],'1f6b4': ['\\uD83D\\uDEB4', ['bicyclist']],'1f6b5': ['\\uD83D\\uDEB5', ['mountain_bicyclist']],'1f6b6': ['\\uD83D\\uDEB6', ['walking']],'1f6b7': ['\\uD83D\\uDEB7', ['no_pedestrians']],'1f6b8': ['\\uD83D\\uDEB8', ['children_crossing']],'1f6b9': ['\\uD83D\\uDEB9', ['mens']],'1f6ba': ['\\uD83D\\uDEBA', ['womens']],'1f6bb': ['\\uD83D\\uDEBB', ['restroom']],'1f6bc': ['\\uD83D\\uDEBC', ['baby_symbol']],'1f6bd': ['\\uD83D\\uDEBD', ['toilet']],'1f6be': ['\\uD83D\\uDEBE', ['wc']],'1f6bf': ['\\uD83D\\uDEBF', ['shower']],'1f6c0': ['\\uD83D\\uDEC0', ['bath']],'1f6c1': ['\\uD83D\\uDEC1', ['bathtub']],'1f6c2': ['\\uD83D\\uDEC2', ['passport_control']],'1f6c3': ['\\uD83D\\uDEC3', ['customs']],'1f6c4': ['\\uD83D\\uDEC4', ['baggage_claim']],'1f6c5': ['\\uD83D\\uDEC5', ['left_luggage']],'0023': ['\\u0023\\u20E3', ['hash']],'0030': ['\\u0030\\u20E3', ['zero']],'0031': ['\\u0031\\u20E3', ['one']],'0032': ['\\u0032\\u20E3', ['two']],'0033': ['\\u0033\\u20E3', ['three']],'0034': ['\\u0034\\u20E3', ['four']],'0035': ['\\u0035\\u20E3', ['five']],'0036': ['\\u0036\\u20E3', ['six']],'0037': ['\\u0037\\u20E3', ['seven']],'0038': ['\\u0038\\u20E3', ['eight']],'0039': ['\\u0039\\u20E3', ['nine']],'1f1e8-1f1f3': ['\\uD83C\\uDDE8\\uD83C\\uDDF3', ['cn']],'1f1e9-1f1ea': ['\\uD83C\\uDDE9\\uD83C\\uDDEA', ['de']],'1f1ea-1f1f8': ['\\uD83C\\uDDEA\\uD83C\\uDDF8', ['es']],'1f1eb-1f1f7': ['\\uD83C\\uDDEB\\uD83C\\uDDF7', ['fr']],'1f1ec-1f1e7': ['\\uD83C\\uDDEC\\uD83C\\uDDE7', ['gb', 'uk']],'1f1ee-1f1f9': ['\\uD83C\\uDDEE\\uD83C\\uDDF9', ['it']],'1f1ef-1f1f5': ['\\uD83C\\uDDEF\\uD83C\\uDDF5', ['jp']],'1f1f0-1f1f7': ['\\uD83C\\uDDF0\\uD83C\\uDDF7', ['kr']],'1f1f7-1f1fa': ['\\uD83C\\uDDF7\\uD83C\\uDDFA', ['ru']],'1f1fa-1f1f8': ['\\uD83C\\uDDFA\\uD83C\\uDDF8', ['us']]}\n\nConfig.EmojiCategories = [[ '1f604', '1f603', '1f600', '1f60a', '263a', '1f609', '1f60d', '1f618', '1f61a', '1f617', '1f619', '1f61c', '1f61d', '1f61b', '1f633', '1f601', '1f614', '1f60c', '1f612', '1f61e', '1f623', '1f622', '1f602', '1f62d', '1f62a', '1f625', '1f630', '1f605', '1f613', '1f629', '1f62b', '1f628', '1f631', '1f620', '1f621', '1f624', '1f616', '1f606', '1f60b', '1f637', '1f60e', '1f634', '1f635', '1f632', '1f61f', '1f626', '1f627', '1f608', '1f47f', '1f62e', '1f62c', '1f610', '1f615', '1f62f', '1f636', '1f607', '1f60f', '1f611', '1f472', '1f473', '1f46e', '1f477', '1f482', '1f476', '1f466', '1f467', '1f468', '1f469', '1f474', '1f475', '1f471', '1f47c', '1f478', '1f63a', '1f638', '1f63b', '1f63d', '1f63c', '1f640', '1f63f', '1f639', '1f63e', '1f479', '1f47a', '1f648', '1f649', '1f64a', '1f480', '1f47d', '1f4a9', '1f525', '2728', '1f31f', '1f4ab', '1f4a5', '1f4a2', '1f4a6', '1f4a7', '1f4a4', '1f4a8', '1f442', '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c', '1f44a', '270a', '270c', '1f44b', '270b', '1f450', '1f446', '1f447', '1f449', '1f448', '1f64c', '1f64f', '261d', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483', '1f46b', '1f46a', '1f46c', '1f46d', '1f48f', '1f491', '1f46f', '1f646', '1f645', '1f481', '1f64b', '1f486', '1f487', '1f485', '1f470', '1f64e', '1f64d', '1f647', '1f3a9', '1f451', '1f452', '1f45f', '1f45e', '1f461', '1f460', '1f462', '1f455', '1f454', '1f45a', '1f457', '1f3bd', '1f456', '1f458', '1f459', '1f4bc', '1f45c', '1f45d', '1f45b', '1f453', '1f380', '1f302', '1f484', '1f49b', '1f499', '1f49c', '1f49a', '2764', '1f494', '1f497', '1f493', '1f495', '1f496', '1f49e', '1f498', '1f48c', '1f48b', '1f48d', '1f48e', '1f464', '1f465', '1f4ac', '1f463', '1f4ad' ], [ '1f436', '1f43a', '1f431', '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b', '1f437', '1f43d', '1f42e', '1f417', '1f435', '1f412', '1f434', '1f411', '1f418', '1f43c', '1f427', '1f426', '1f424', '1f425', '1f423', '1f414', '1f40d', '1f422', '1f41b', '1f41d', '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f420', '1f41f', '1f42c', '1f433', '1f40b', '1f404', '1f40f', '1f400', '1f403', '1f405', '1f407', '1f409', '1f40e', '1f410', '1f413', '1f415', '1f416', '1f401', '1f402', '1f432', '1f421', '1f40a', '1f42b', '1f42a', '1f406', '1f408', '1f429', '1f43e', '1f490', '1f338', '1f337', '1f340', '1f339', '1f33b', '1f33a', '1f341', '1f343', '1f342', '1f33f', '1f33e', '1f344', '1f335', '1f334', '1f332', '1f333', '1f330', '1f331', '1f33c', '1f310', '1f31e', '1f31d', '1f31a', '1f311', '1f312', '1f313', '1f314', '1f315', '1f316', '1f317', '1f318', '1f31c', '1f31b', '1f319', '1f30d', '1f30e', '1f30f', '1f30b', '1f30c', '1f320', '2b50', '2600', '26c5', '2601', '26a1', '2614', '2744', '26c4', '1f300', '1f301', '1f308', '1f30a' ], [ '1f38d', '1f49d', '1f38e', '1f392', '1f393', '1f38f', '1f386', '1f387', '1f390', '1f391', '1f383', '1f47b', '1f385', '1f384', '1f381', '1f38b', '1f389', '1f38a', '1f388', '1f38c', '1f52e', '1f3a5', '1f4f7', '1f4f9', '1f4fc', '1f4bf', '1f4c0', '1f4bd', '1f4be', '1f4bb', '1f4f1', '260e', '1f4de', '1f4df', '1f4e0', '1f4e1', '1f4fa', '1f4fb', '1f50a', '1f509', '1f508', '1f507', '1f514', '1f515', '1f4e3', '1f4e2', '23f3', '231b', '23f0', '231a', '1f513', '1f512', '1f50f', '1f510', '1f511', '1f50e', '1f4a1', '1f526', '1f506', '1f505', '1f50c', '1f50b', '1f50d', '1f6c0', '1f6c1', '1f6bf', '1f6bd', '1f527', '1f529', '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a', '1f489', '1f4b0', '1f4b4', '1f4b5', '1f4b7', '1f4b6', '1f4b3', '1f4b8', '1f4f2', '1f4e7', '1f4e5', '1f4e4', '2709', '1f4e9', '1f4e8', '1f4ef', '1f4eb', '1f4ea', '1f4ec', '1f4ed', '1f4ee', '1f4e6', '1f4dd', '1f4c4', '1f4c3', '1f4d1', '1f4ca', '1f4c8', '1f4c9', '1f4dc', '1f4cb', '1f4c5', '1f4c6', '1f4c7', '1f4c1', '1f4c2', '2702', '1f4cc', '1f4ce', '2712', '270f', '1f4cf', '1f4d0', '1f4d5', '1f4d7', '1f4d8', '1f4d9', '1f4d3', '1f4d4', '1f4d2', '1f4da', '1f4d6', '1f516', '1f4db', '1f52c', '1f52d', '1f4f0', '1f3a8', '1f3ac', '1f3a4', '1f3a7', '1f3bc', '1f3b5', '1f3b6', '1f3b9', '1f3bb', '1f3ba', '1f3b7', '1f3b8', '1f47e', '1f3ae', '1f0cf', '1f3b4', '1f004', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd', '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '26f3', '1f6b5', '1f6b4', '1f3c1', '1f3c7', '1f3c6', '1f3bf', '1f3c2', '1f3ca', '1f3c4', '1f3a3', '2615', '1f375', '1f376', '1f37c', '1f37a', '1f37b', '1f378', '1f379', '1f377', '1f374', '1f355', '1f354', '1f35f', '1f357', '1f356', '1f35d', '1f35b', '1f364', '1f371', '1f363', '1f365', '1f359', '1f358', '1f35a', '1f35c', '1f372', '1f362', '1f361', '1f373', '1f35e', '1f369', '1f36e', '1f366', '1f368', '1f367', '1f382', '1f370', '1f36a', '1f36b', '1f36c', '1f36d', '1f36f', '1f34e', '1f34f', '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351', '1f348', '1f34c', '1f350', '1f34d', '1f360', '1f346', '1f345', '1f33d' ], [ '1f3e0', '1f3e1', '1f3eb', '1f3e2', '1f3e3', '1f3e5', '1f3e6', '1f3ea', '1f3e9', '1f3e8', '1f492', '26ea', '1f3ec', '1f3e4', '1f307', '1f306', '1f3ef', '1f3f0', '26fa', '1f3ed', '1f5fc', '1f5fe', '1f5fb', '1f304', '1f305', '1f303', '1f5fd', '1f309', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '26f5', '1f6a4', '1f6a3', '2693', '1f680', '2708', '1f4ba', '1f681', '1f682', '1f68a', '1f689', '1f69e', '1f686', '1f684', '1f685', '1f688', '1f687', '1f69d', '1f683', '1f68b', '1f68e', '1f68c', '1f68d', '1f699', '1f698', '1f697', '1f695', '1f696', '1f69b', '1f69a', '1f6a8', '1f693', '1f694', '1f692', '1f691', '1f690', '1f6b2', '1f6a1', '1f69f', '1f6a0', '1f69c', '1f488', '1f68f', '1f3ab', '1f6a6', '1f6a5', '26a0', '1f6a7', '1f530', '26fd', '1f3ee', '1f3b0', '2668', '1f5ff', '1f3aa', '1f3ad', '1f4cd', '1f6a9', '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3', '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9', '1f1f7-1f1fa', '1f1ec-1f1e7' ], [ '0031', '0032', '0033', '0034', '0035', '0036', '0037', '0038', '0039', '0030', '1f51f', '1f522', '0023', '1f523', '2b06', '2b07', '2b05', '27a1', '1f520', '1f521', '1f524', '2197', '2196', '2198', '2199', '2194', '2195', '1f504', '25c0', '25b6', '1f53c', '1f53d', '21a9', '21aa', '2139', '23ea', '23e9', '23eb', '23ec', '2935', '2934', '1f197', '1f500', '1f501', '1f502', '1f195', '1f199', '1f192', '1f193', '1f196', '1f4f6', '1f3a6', '1f201', '1f22f', '1f233', '1f235', '1f234', '1f232', '1f250', '1f239', '1f23a', '1f236', '1f21a', '1f6bb', '1f6b9', '1f6ba', '1f6bc', '1f6be', '1f6b0', '1f6ae', '1f17f', '267f', '1f6ad', '1f237', '1f238', '1f202', '24c2', '1f6c2', '1f6c4', '1f6c5', '1f6c3', '1f251', '3299', '3297', '1f191', '1f198', '1f194', '1f6ab', '1f51e', '1f4f5', '1f6af', '1f6b1', '1f6b3', '1f6b7', '1f6b8', '26d4', '2733', '2747', '274e', '2705', '2734', '1f49f', '1f19a', '1f4f3', '1f4f4', '1f170', '1f171', '1f18e', '1f17e', '1f4a0', '27bf', '267b', '2648', '2649', '264a', '264b', '264c', '264d', '264e', '264f', '2650', '2651', '2652', '2653', '26ce', '1f52f', '1f3e7', '1f4b9', '1f4b2', '1f4b1', '00a9', '00ae', '2122', '274c', '203c', '2049', '2757', '2753', '2755', '2754', '2b55', '1f51d', '1f51a', '1f519', '1f51b', '1f51c', '1f503', '1f55b', '1f567', '1f550', '1f55c', '1f551', '1f55d', '1f552', '1f55e', '1f553', '1f55f', '1f554', '1f560', '1f555', '1f556', '1f557', '1f558', '1f559', '1f55a', '1f561', '1f562', '1f563', '1f564', '1f565', '1f566', '2716', '2795', '2796', '2797', '2660', '2665', '2663', '2666', '1f4ae', '1f4af', '2714', '2611', '1f518', '1f517', '27b0', '3030', '303d', '1f531', '25fc', '25fb', '25fe', '25fd', '25aa', '25ab', '1f53a', '1f532', '1f533', '26ab', '26aa', '1f534', '1f535', '1f53b', '2b1c', '2b1b', '1f536', '1f537', '1f538', '1f539' ]]\n\nConfig.EmojiCategorySpritesheetDimens = [[7, 27], [4, 29], [7, 33], [3, 34], [7, 34]]\n\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nConfig.LatinizeMap = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','ǲ': 'D','ǅ': 'D','Đ': 'D','Ƌ': 'D','Ǳ': 'DZ','Ǆ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','ǈ': 'L','Ł': 'L','Ǉ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','ǋ': 'N','Ñ': 'N','Ǌ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','Ĳ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','ǳ': 'dz','ǆ': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','ǉ': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','ǌ': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ﬀ': 'ff','ﬃ': 'ffi','ﬄ': 'ffl','ﬁ': 'fi','ﬂ': 'fl','ĳ': 'ij','œ': 'oe','ﬆ': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'}\n\nConfig.CountryCodes = [['AB', 'country_select_modal_country_ab', '+7 840', '+7 940', '+995 44'], ['AF', 'country_select_modal_country_af', '+93'], ['AX', 'country_select_modal_country_ax', '+358 18'], ['AL', 'country_select_modal_country_al', '+355'], ['DZ', 'country_select_modal_country_dz', '+213'], ['AS', 'country_select_modal_country_as', '+1 684'], ['AD', 'country_select_modal_country_ad', '+376'], ['AO', 'country_select_modal_country_ao', '+244'], ['AI', 'country_select_modal_country_ai', '+1 264'], ['AG', 'country_select_modal_country_ag', '+1 268'], ['AR', 'country_select_modal_country_ar', '+54'], ['AM', 'country_select_modal_country_am', '+374'], ['AW', 'country_select_modal_country_aw', '+297'], ['SH', 'country_select_modal_country_sh_ac', '+247'], ['AU', 'country_select_modal_country_au', '+61'], ['AU', 'country_select_modal_country_au_et', '+672'], ['AT', 'country_select_modal_country_at', '+43'], ['AZ', 'country_select_modal_country_az', '+994'], ['BS', 'country_select_modal_country_bs', '+1 242'], ['BH', 'country_select_modal_country_bh', '+973'], ['BD', 'country_select_modal_country_bd', '+880'], ['BB', 'country_select_modal_country_bb', '+1 246'], ['AG', 'country_select_modal_country_ag_bar', '+1 268'], ['BY', 'country_select_modal_country_by', '+375'], ['BE', 'country_select_modal_country_be', '+32'], ['BZ', 'country_select_modal_country_bz', '+501'], ['BJ', 'country_select_modal_country_bj', '+229'], ['BM', 'country_select_modal_country_bm', '+1 441'], ['BT', 'country_select_modal_country_bt', '+975'], ['BO', 'country_select_modal_country_bo', '+591'], ['BQ', 'country_select_modal_country_bq', '+599 7'], ['BA', 'country_select_modal_country_ba', '+387'], ['BW', 'country_select_modal_country_bw', '+267'], ['BR', 'country_select_modal_country_br', '+55'], ['IO', 'country_select_modal_country_io', '+246'], ['VG', 'country_select_modal_country_vg', '+1 284'], ['BN', 'country_select_modal_country_bn', '+673'], ['BG', 'country_select_modal_country_bg', '+359'], ['BF', 'country_select_modal_country_bf', '+226'], ['MY', 'country_select_modal_country_mm', '+95'], ['BI', 'country_select_modal_country_bi', '+257'], ['KH', 'country_select_modal_country_kh', '+855'], ['CM', 'country_select_modal_country_cm', '+237'], ['CA', 'country_select_modal_country_ca', '+1'], ['CV', 'country_select_modal_country_cv', '+238'], ['KY', 'country_select_modal_country_ky', '+1 345'], ['CF', 'country_select_modal_country_cf', '+236'], ['TD', 'country_select_modal_country_td', '+235'], ['CL', 'country_select_modal_country_cl', '+56'], ['CN', 'country_select_modal_country_cn', '+86'], ['CX', 'country_select_modal_country_cx', '+61'], ['CC', 'country_select_modal_country_cc', '+61'], ['CO', 'country_select_modal_country_co', '+57'], ['KM', 'country_select_modal_country_km', '+269'], ['CG', 'country_select_modal_country_cg', '+242'], ['CD', 'country_select_modal_country_cd', '+243'], ['CK', 'country_select_modal_country_ck', '+682'], ['CR', 'country_select_modal_country_cr', '+506'], ['CI', 'country_select_modal_country_ci', '+225'], ['HR', 'country_select_modal_country_hr', '+385'], ['CU', 'country_select_modal_country_cu', '+53'], ['CW', 'country_select_modal_country_cw', '+599 9'], ['CY', 'country_select_modal_country_cy', '+357'], ['CZ', 'country_select_modal_country_cz', '+420'], ['DK', 'country_select_modal_country_dk', '+45'], ['DG', 'country_select_modal_country_dg', '+246'], ['DJ', 'country_select_modal_country_dj', '+253'], ['DM', 'country_select_modal_country_dm', '+1 767'], ['DO', 'country_select_modal_country_do', '+1 809', '+1 829', '+1 849'], ['TL', 'country_select_modal_country_tl', '+670'], ['EC', 'country_select_modal_country_ec', '+593'], ['EG', 'country_select_modal_country_eg', '+20'], ['SV', 'country_select_modal_country_sv', '+503'], ['GQ', 'country_select_modal_country_gq', '+240'], ['ER', 'country_select_modal_country_er', '+291'], ['EE', 'country_select_modal_country_ee', '+372'], ['ET', 'country_select_modal_country_et', '+251'], ['FK', 'country_select_modal_country_fk', '+500'], ['FO', 'country_select_modal_country_fo', '+298'], ['FJ', 'country_select_modal_country_fj', '+679'], ['FI', 'country_select_modal_country_fi', '+358'], ['FR', 'country_select_modal_country_fr', '+33'], ['GF', 'country_select_modal_country_gf', '+594'], ['PF', 'country_select_modal_country_pf', '+689'], ['GA', 'country_select_modal_country_ga', '+241'], ['GM', 'country_select_modal_country_gm', '+220'], ['GE', 'country_select_modal_country_ge', '+995'], ['DE', 'country_select_modal_country_de', '+49'], ['GH', 'country_select_modal_country_gh', '+233'], ['GI', 'country_select_modal_country_gi', '+350'], ['GR', 'country_select_modal_country_gr', '+30'], ['GL', 'country_select_modal_country_gl', '+299'], ['GD', 'country_select_modal_country_gd', '+1 473'], ['GP', 'country_select_modal_country_gp', '+590'], ['GU', 'country_select_modal_country_gu', '+1 671'], ['GT', 'country_select_modal_country_gt', '+502'], ['GG', 'country_select_modal_country_gg', '+44'], ['GN', 'country_select_modal_country_gn', '+224'], ['GW', 'country_select_modal_country_gw', '+245'], ['GY', 'country_select_modal_country_gy', '+592'], ['HT', 'country_select_modal_country_ht', '+509'], ['HN', 'country_select_modal_country_hn', '+504'], ['HK', 'country_select_modal_country_hk', '+852'], ['HU', 'country_select_modal_country_hu', '+36'], ['IS', 'country_select_modal_country_is', '+354'], ['IN', 'country_select_modal_country_in', '+91'], ['ID', 'country_select_modal_country_id', '+62'], ['IR', 'country_select_modal_country_ir', '+98'], ['IQ', 'country_select_modal_country_iq', '+964'], ['IE', 'country_select_modal_country_ie', '+353'], ['IL', 'country_select_modal_country_il', '+972'], ['IT', 'country_select_modal_country_it', '+39'], ['JM', 'country_select_modal_country_jm', '+1 876'], ['SJ', 'country_select_modal_country_sj', '+47 79'], ['JP', 'country_select_modal_country_jp', '+81'], ['JE', 'country_select_modal_country_je', '+44'], ['JO', 'country_select_modal_country_jo', '+962'], ['KZ', 'country_select_modal_country_kz', '+7 7'], ['KE', 'country_select_modal_country_ke', '+254'], ['KI', 'country_select_modal_country_ki', '+686'], ['KP', 'country_select_modal_country_kp', '+850'], ['KR', 'country_select_modal_country_kr', '+82'], ['KW', 'country_select_modal_country_kw', '+965'], ['KG', 'country_select_modal_country_kg', '+996'], ['LA', 'country_select_modal_country_la', '+856'], ['LV', 'country_select_modal_country_lv', '+371'], ['LB', 'country_select_modal_country_lb', '+961'], ['LS', 'country_select_modal_country_ls', '+266'], ['LR', 'country_select_modal_country_lr', '+231'], ['LY', 'country_select_modal_country_ly', '+218'], ['LI', 'country_select_modal_country_li', '+423'], ['LT', 'country_select_modal_country_lt', '+370'], ['LU', 'country_select_modal_country_lu', '+352'], ['MO', 'country_select_modal_country_mo', '+853'], ['MK', 'country_select_modal_country_mk', '+389'], ['MG', 'country_select_modal_country_mg', '+261'], ['MW', 'country_select_modal_country_mw', '+265'], ['MY', 'country_select_modal_country_my', '+60'], ['MV', 'country_select_modal_country_mv', '+960'], ['ML', 'country_select_modal_country_ml', '+223'], ['MT', 'country_select_modal_country_mt', '+356'], ['MH', 'country_select_modal_country_mh', '+692'], ['MQ', 'country_select_modal_country_mq', '+596'], ['MR', 'country_select_modal_country_mr', '+222'], ['MU', 'country_select_modal_country_mu', '+230'], ['YT', 'country_select_modal_country_yt', '+262'], ['MX', 'country_select_modal_country_mx', '+52'], ['FM', 'country_select_modal_country_fm', '+691'], ['MD', 'country_select_modal_country_md', '+373'], ['MC', 'country_select_modal_country_mc', '+377'], ['MN', 'country_select_modal_country_mn', '+976'], ['ME', 'country_select_modal_country_me', '+382'], ['MS', 'country_select_modal_country_ms', '+1 664'], ['MA', 'country_select_modal_country_ma', '+212'], ['MZ', 'country_select_modal_country_mz', '+258'], ['NA', 'country_select_modal_country_na', '+264'], ['NR', 'country_select_modal_country_nr', '+674'], ['NP', 'country_select_modal_country_np', '+977'], ['NL', 'country_select_modal_country_nl', '+31'], ['NC', 'country_select_modal_country_nc', '+687'], ['NZ', 'country_select_modal_country_nz', '+64'], ['NI', 'country_select_modal_country_ni', '+505'], ['NE', 'country_select_modal_country_ne', '+227'], ['NG', 'country_select_modal_country_ng', '+234'], ['NU', 'country_select_modal_country_nu', '+683'], ['NF', 'country_select_modal_country_nf', '+672'], ['MP', 'country_select_modal_country_mp', '+1 670'], ['NO', 'country_select_modal_country_no', '+47'], ['OM', 'country_select_modal_country_om', '+968'], ['PK', 'country_select_modal_country_pk', '+92'], ['PW', 'country_select_modal_country_pw', '+680'], ['PS', 'country_select_modal_country_ps', '+970'], ['PA', 'country_select_modal_country_pa', '+507'], ['PG', 'country_select_modal_country_pg', '+675'], ['PY', 'country_select_modal_country_py', '+595'], ['PE', 'country_select_modal_country_pe', '+51'], ['PH', 'country_select_modal_country_ph', '+63'], ['PN', 'country_select_modal_country_pn', '+64'], ['PL', 'country_select_modal_country_pl', '+48'], ['PT', 'country_select_modal_country_pt', '+351'], ['PR', 'country_select_modal_country_pr', '+1 787', '+1 939'], ['QA', 'country_select_modal_country_qa', '+974'], ['RE', 'country_select_modal_country_re', '+262'], ['RO', 'country_select_modal_country_ro', '+40'], ['RU', 'country_select_modal_country_ru', '+7'], ['RW', 'country_select_modal_country_rw', '+250'], ['BL', 'country_select_modal_country_bl', '+590'], ['SH', 'country_select_modal_country_sh', '+290'], ['KN', 'country_select_modal_country_kn', '+1 869'], ['LC', 'country_select_modal_country_lc', '+1 758'], ['MF', 'country_select_modal_country_mf', '+590'], ['PM', 'country_select_modal_country_pm', '+508'], ['VC', 'country_select_modal_country_vc', '+1 784'], ['WS', 'country_select_modal_country_ws', '+685'], ['SM', 'country_select_modal_country_sm', '+378'], ['ST', 'country_select_modal_country_st', '+239'], ['SA', 'country_select_modal_country_sa', '+966'], ['SN', 'country_select_modal_country_sn', '+221'], ['RS', 'country_select_modal_country_rs', '+381'], ['SC', 'country_select_modal_country_sc', '+248'], ['SL', 'country_select_modal_country_sl', '+232'], ['SG', 'country_select_modal_country_sg', '+65'], ['BQ', 'country_select_modal_country_nl_bq3', '+599 3'], ['SX', 'country_select_modal_country_sx', '+1 721'], ['SK', 'country_select_modal_country_sk', '+421'], ['SI', 'country_select_modal_country_si', '+386'], ['SB', 'country_select_modal_country_sb', '+677'], ['SO', 'country_select_modal_country_so', '+252'], ['ZA', 'country_select_modal_country_za', '+27'], ['GS', 'country_select_modal_country_gs', '+500'], [false, 'country_select_modal_country_ge_so', '+995 34'], ['SS', 'country_select_modal_country_ss', '+211'], ['ES', 'country_select_modal_country_es', '+34'], ['LK', 'country_select_modal_country_lk', '+94'], ['SD', 'country_select_modal_country_sd', '+249'], ['SR', 'country_select_modal_country_sr', '+597'], ['SJ', 'country_select_modal_country_sj_no', '+47 79'], ['SZ', 'country_select_modal_country_sz', '+268'], ['SE', 'country_select_modal_country_se', '+46'], ['CH', 'country_select_modal_country_ch', '+41'], ['SY', 'country_select_modal_country_sy', '+963'], ['TW', 'country_select_modal_country_tw', '+886'], ['TJ', 'country_select_modal_country_tj', '+992'], ['TZ', 'country_select_modal_country_tz', '+255'], ['TH', 'country_select_modal_country_th', '+66'], ['TG', 'country_select_modal_country_tg', '+228'], ['TK', 'country_select_modal_country_tk', '+690'], ['TO', 'country_select_modal_country_to', '+676'], ['TT', 'country_select_modal_country_tt', '+1 868'], ['TN', 'country_select_modal_country_tn', '+216'], ['TR', 'country_select_modal_country_tr', '+90'], ['TM', 'country_select_modal_country_tm', '+993'], ['TC', 'country_select_modal_country_tc', '+1 649'], ['TV', 'country_select_modal_country_tv', '+688'], ['UG', 'country_select_modal_country_ug', '+256'], ['UA', 'country_select_modal_country_ua', '+380'], ['AE', 'country_select_modal_country_ae', '+971'], ['UK', 'country_select_modal_country_uk', '+44'], ['US', 'country_select_modal_country_us', '+1'], ['UY', 'country_select_modal_country_uy', '+598'], ['VI', 'country_select_modal_country_vi', '+1 340'], ['UZ', 'country_select_modal_country_uz', '+998'], ['VU', 'country_select_modal_country_vu', '+678'], ['VE', 'country_select_modal_country_ve', '+58'], ['VA', 'country_select_modal_country_va', '+39 06 698', '+379'], ['VN', 'country_select_modal_country_vn', '+84'], ['WF', 'country_select_modal_country_wf', '+681'], ['YE', 'country_select_modal_country_ye', '+967'], ['ZM', 'country_select_modal_country_zm', '+260'], [false, 'country_select_modal_country_tz_uk', '+255'], ['ZW', 'country_select_modal_country_zw', '+263']]\n\nConfig.LangCountries = {'es': 'ES', 'ru': 'RU', 'en': 'US', 'de': 'DE', 'it': 'IT', 'nl': 'NL', 'fr': 'FR', 'ca': 'ES', 'es-419': 'MX', 'ar': 'SA', 'he': 'IL', 'tr': 'TR', 'id': 'ID', 'pl': 'PL'}\n\n// ConfigStorage\n;(function (window) {\n  var keyPrefix = ''\n  var noPrefix = false\n  var cache = {}\n  var useCs = !!(window.chrome && chrome.storage && chrome.storage.local)\n  var useLs = !useCs && !!window.localStorage\n\n  function storageSetPrefix (newPrefix) {\n    keyPrefix = newPrefix\n  }\n\n  function storageSetNoPrefix () {\n    noPrefix = true\n  }\n\n  function storageGetPrefix () {\n    if (noPrefix) {\n      noPrefix = false\n      return ''\n    }\n    return keyPrefix\n  }\n\n  function storageGetValue (keys, callback) {\n    var single = false\n    if (!Array.isArray(keys)) {\n      keys = Array.prototype.slice.call(arguments)\n      callback = keys.pop()\n      single = keys.length == 1\n    }\n    var result = [],\n      value\n    var allFound = true\n    var prefix = storageGetPrefix(),\n      i, key\n\n    for (i = 0; i < keys.length; i++) {\n      key = keys[i] = prefix + keys[i]\n      if (key.substr(0, 3) != 'xt_' && cache[key] !== undefined) {\n        result.push(cache[key])\n      }\n      else if (useLs) {\n        try {\n          value = localStorage.getItem(key)\n        } catch (e) {\n          useLs = false\n        }\n        try {\n          value = (value === undefined || value === null) ? false : JSON.parse(value)\n        } catch (e) {\n          value = false\n        }\n        result.push(cache[key] = value)\n      }\n      else if (!useCs) {\n        result.push(cache[key] = false)\n      }else {\n        allFound = false\n      }\n    }\n\n    if (allFound) {\n      return callback(single ? result[0] : result)\n    }\n\n    chrome.storage.local.get(keys, function (resultObj) {\n      var value\n      result = []\n      for (i = 0; i < keys.length; i++) {\n        key = keys[i]\n        value = resultObj[key]\n        value = value === undefined || value === null ? false : JSON.parse(value)\n        result.push(cache[key] = value)\n      }\n\n      callback(single ? result[0] : result)\n    })\n  }\n\n  function storageSetValue (obj, callback) {\n    var keyValues = {}\n    var prefix = storageGetPrefix(),\n      key, value\n\n    for (key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        value = obj[key]\n        key = prefix + key\n        cache[key] = value\n        value = JSON.stringify(value)\n        if (useLs) {\n          try {\n            localStorage.setItem(key, value)\n          } catch (e) {\n            useLs = false\n          }\n        } else {\n          keyValues[key] = value\n        }\n      }\n    }\n\n    if (useLs || !useCs) {\n      if (callback) {\n        callback()\n      }\n      return\n    }\n\n    chrome.storage.local.set(keyValues, callback)\n  }\n\n  function storageRemoveValue (keys, callback) {\n    if (!Array.isArray(keys)) {\n      keys = Array.prototype.slice.call(arguments)\n      if (typeof keys[keys.length - 1] === 'function') {\n        callback = keys.pop()\n      }\n    }\n    var prefix = storageGetPrefix(),\n      i, key\n\n    for (i = 0; i < keys.length; i++) {\n      key = keys[i] = prefix + keys[i]\n      delete cache[key]\n      if (useLs) {\n        try {\n          localStorage.removeItem(key)\n        } catch (e) {\n          useLs = false\n        }\n      }\n    }\n    if (useCs) {\n      chrome.storage.local.remove(keys, callback)\n    }\n    else if (callback) {\n      callback()\n    }\n  }\n\n  function storageClear (callback) {\n    if (useLs) {\n      try {\n        localStorage.clear()\n      } catch (e) {\n        useLs = false\n      }\n    }\n\n    if (useCs) {\n      chrome.storage.local.clear(function () {\n        cache = {}\n        callback()\n      })\n    } else {\n      cache = {}\n      callback()\n    }\n  }\n\n  window.ConfigStorage = {\n    prefix: storageSetPrefix,\n    noPrefix: storageSetNoPrefix,\n    get: storageGetValue,\n    set: storageSetValue,\n    remove: storageRemoveValue,\n    clear: storageClear\n  }\n})(this)\n"
  },
  {
    "path": "app/js/lib/crypto_worker.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimportScripts(\n  'polyfill.js',\n  'bin_utils.js',\n  '../../vendor/jsbn/jsbn_combined.js',\n  '../../vendor/leemon_bigint/bigint.js',\n  '../../vendor/closure/long.js',\n  '../../vendor/cryptoJS/crypto.js',\n  '../../vendor/rusha/rusha.js'\n)\n\nonmessage = function (e) {\n  var taskID = e.data.taskID,\n    result\n\n  switch (e.data.task) {\n    case 'factorize':\n      result = pqPrimeFactorization(e.data.bytes)\n      break\n\n    case 'mod-pow':\n      result = bytesModPow(e.data.x, e.data.y, e.data.m)\n      break\n\n    case 'sha1-hash':\n      result = sha1HashSync(e.data.bytes)\n      break\n\n    case 'aes-encrypt':\n      result = aesEncryptSync(e.data.bytes, e.data.keyBytes, e.data.ivBytes)\n      break\n\n    case 'aes-decrypt':\n      result = aesDecryptSync(e.data.encryptedBytes, e.data.keyBytes, e.data.ivBytes)\n      break\n\n    default:\n      throw new Error('Unknown task: ' + e.data.task)\n  }\n\n  postMessage({taskID: taskID, result: result})\n}\n\npostMessage('ready')\n"
  },
  {
    "path": "app/js/lib/i18n.js",
    "content": "'use strict'\n\nangular.module('myApp.i18n', ['izhukov.utils'])\n  .factory('_', ['$rootScope', '$locale', function ($rootScope, $locale) {\n    var locale = Config.I18n.locale\n    var messages = Config.I18n.messages\n    var fallbackMessages = Config.I18n.fallback_messages\n    var paramRegEx = /\\{\\s*([a-zA-Z\\d\\-_]+)(?:\\s*:\\s*(.*?))?\\s*\\}/g\n\n    function insertParams (msgstr, params) {\n      return msgstr.replace(paramRegEx, function ($0, paramKey, nestedMsgStr) {\n        var param = params[paramKey]\n        if (param === undefined) {\n          console.warn('[i18n] missing param ' + paramKey + ' for message \"' + msgstr + '\"')\n          return ''\n        }\n        if (nestedMsgStr !== undefined) {\n          param = insertParams(param, nestedMsgStr.split('|'))\n        }\n        return param.toString().trim()\n      })\n    }\n\n    function parseMarkdownString (msgstr, msgid) {\n      msgstr = msgstr\n        .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n        .replace(/\\n|&#10;/g, '<br/>')\n\n      return msgstr\n    }\n\n    function _ (msgid, params) {\n      var raw = false\n      var msgstr = msgid\n\n      if (msgid.substr(-4) === '_raw') {\n        raw = true\n        msgid = msgid.substr(0, msgid.length - 4)\n      }\n\n      if (messages.hasOwnProperty(msgid)) {\n        msgstr = messages[msgid]\n      } else if (fallbackMessages.hasOwnProperty(msgid)) {\n        msgstr = fallbackMessages[msgid]\n        console.warn('[i18n] missing locale key ' + locale + ' / ' + msgid)\n      } else {\n        console.warn('[i18n] missing key ' + msgid)\n        return msgid\n      }\n\n      if (!raw) {\n        msgstr = encodeEntities(msgstr)\n      }\n      if (msgid.substr(-3) == '_md') {\n        msgstr = parseMarkdownString(msgstr)\n      }\n\n      if (arguments.length > 1) {\n        if (typeof params == 'string') {\n          Array.prototype.shift.apply(arguments)\n          msgstr = insertParams(msgstr, arguments)\n        } else {\n          msgstr = insertParams(msgstr, params)\n        }\n      }\n\n      return msgstr\n    }\n\n    _.locale = function () {\n      return locale\n    }\n\n    _.pluralize = function (msgid) {\n      var categories = $rootScope.$eval(_(msgid + '_raw'))\n      return function (count) {\n        return (categories[$locale.pluralCat(count)] || '').replace('{}', count)\n      }\n    }\n\n    return _\n  }])\n\n  .filter('i18n', ['_', function (_) {\n    return function (msgid, params) {\n      return _(msgid + '_raw', params)\n    }\n  }])\n\n  .directive('ngPluralize', ['_', function (_) {\n    return {\n      restrict: 'EA',\n      priority: 1, // execute before built-in ngPluralize\n      compile: function (element) {\n        var msgid = element.attr('when')\n        var msgstr = _(msgid + '_raw')\n        element.attr('when', msgstr)\n      }\n    }\n  }])\n\n  .directive('myI18n', ['_', function (_) {\n    return {\n      restrict: 'EA',\n      compile: function (element) {\n        var params = element.children('my-i18n-param:not([name]), [my-i18n-param=\"\"]:not([name])').map(function (index, param) {\n          return param.outerHTML\n        }).toArray()\n        element.children('my-i18n-param[name], [my-i18n-param]:not([my-i18n-param=\"\"]), [my-i18n-param][name]').each(function (i, param) {\n          params[angular.element(param).attr('my-i18n-param') || angular.element(param).attr('name')] = param.outerHTML\n        })\n        element.children('my-i18n-param').remove()\n        var formats = element.attr('my-i18n') || element.attr('msgid') ? element : element.children('my-i18n-format, [my-i18n-format]')\n        formats.each(function (index, element) {\n          var format = angular.element(element)\n          var msgid = format.attr('my-i18n') || format.attr('msgid') || format.attr('my-i18n-format') || format.html().replace(/\\s+/g, ' ').trim()\n          if (format.hasClass('nocopy')) {\n            var msgstr = _(msgid + '_raw', params)\n            format.attr('data-content', msgstr)\n          } else {\n            var msgstr = _(msgid, params)\n            format.html(msgstr)\n          }\n        })\n      }\n    }\n  }])\n"
  },
  {
    "path": "app/js/lib/mtproto.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nangular.module('izhukov.mtproto', ['izhukov.utils'])\n\n  .factory('MtpDcConfigurator', function () {\n    var sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora']\n\n    var dcOptions = Config.Modes.test\n      ? [\n        {id: 1, host: '149.154.175.10',  port: 80},\n        {id: 2, host: '149.154.167.40',  port: 80},\n        {id: 3, host: '149.154.175.117', port: 80}\n      ]\n      : [\n        {id: 1, host: '149.154.175.50',  port: 80},\n        {id: 2, host: '149.154.167.51',  port: 80},\n        {id: 3, host: '149.154.175.100', port: 80},\n        {id: 4, host: '149.154.167.91',  port: 80},\n        {id: 5, host: '149.154.171.5',   port: 80}\n      ]\n\n    var chosenServers = {}\n\n    function chooseServer (dcID, upload) {\n      if (chosenServers[dcID] === undefined) {\n        var chosenServer = false,\n          i, dcOption\n\n        if (Config.Modes.ssl || !Config.Modes.http) {\n          var subdomain = sslSubdomains[dcID - 1] + (upload ? '-1' : '')\n          var path = Config.Modes.test ? 'apiw_test1' : 'apiw1'\n          chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path\n          return chosenServer\n        }\n\n        for (i = 0; i < dcOptions.length; i++) {\n          dcOption = dcOptions[i]\n          if (dcOption.id == dcID) {\n            chosenServer = 'http://' + dcOption.host + (dcOption.port != 80 ? ':' + dcOption.port : '') + '/apiw1'\n            break\n          }\n        }\n        chosenServers[dcID] = chosenServer\n      }\n\n      return chosenServers[dcID]\n    }\n\n    return {\n      chooseServer: chooseServer\n    }\n  })\n\n  .factory('MtpRsaKeysManager', function () {\n\n    /**\n    *  Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n    * \n    * \n    *  -----BEGIN RSA PUBLIC KEY-----\n    *  MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6\n    *  lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS\n    *  an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw\n    *  Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+\n    *  8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n\n    *  Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB\n    *  -----END RSA PUBLIC KEY-----\n    *  \n    *  -----BEGIN PUBLIC KEY-----\n    *  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAruw2yP/BCcsJliRoW5eB\n    *  VBVle9dtjJw+OYED160Wybum9SXtBBLXriwt4rROd9csv0t0OHCaTmRqBcQ0J8fx\n    *  hN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/j1dnVa/gVbCjdSxpbrfY2g2L4frzjJvd\n    *  l84Kd9ORYjDEAyFnEA7dD556OptgLQQ2e2iVNq8NZLYTzLp5YpOdO1doK+ttrltg\n    *  gTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnSLj16yE5HvJQn0CNpRdENvRUXe6tBP78O\n    *  39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wFXGF710w9lwCGNbmNxNYhtIkdqfsEcwR5\n    *  JwIDAQAB\n    *  -----END PUBLIC KEY-----\n    *  \n    *  -----BEGIN PUBLIC KEY-----\n    *  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvfLHfYH2r9R70w8prHbl\n    *  Wt/nDkh+XkgpflqQVcnAfSuTtO05lNPspQmL8Y2XjVT4t8cT6xAkdgfmmvnvRPOO\n    *  KPi0OfJXoRVylFzAQG/j83u5K3kRLbae7fLccVhKZhY46lvsueI1hQdLgNV9n1cQ\n    *  3TDS2pQOCtovG4eDl9wacrXOJTG2990VjgnIKNA0UMoP+KF03qzryqIt3oTvZq03\n    *  DyWdGK+AZjgBLaDKSnC6qD2cFY81UryRWOab8zKkWAnhw2kFpcqhI0jdV5QaSCEx\n    *  vnsjVaX0Y1N0870931/5Jb9ICe4nweZ9kSDF/gip3kWLG0o8XQpChDfyvsqB9OLV\n    *  /wIDAQAB\n    *  -----END PUBLIC KEY-----\n    *  \n    *  -----BEGIN PUBLIC KEY-----\n    *  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs/ditzm+mPND6xkhzwFI\n    *  z6J/968CtkcSE/7Z2qAJiXbmZ3UDJPGrzqTDHkO30R8VeRM/Kz2f4nR05GIFiITl\n    *  4bEjvpy7xqRDspJcCFIOcyXm8abVDhF+th6knSU0yLtNKuQVP6voMrnt9MV1X92L\n    *  GZQLgdHZbPQz0Z5qIpaKhdyA8DEvWWvSUwwc+yi1/gGaybwlzZwqXYoPOhwMebzK\n    *  Uk0xW14htcJrRrq+PXXQbRzTMynseCoPIoke0dtCodbA3qQxQovE16q9zz4Otv2k\n    *  4j63cz53J+mhkVWAeWxVGI0lltJmWtEYK6er8VqqWot3nqmWMXogrgRLggv/Nbbo\n    *  oQIDAQAB\n    *  -----END PUBLIC KEY-----\n    *  \n    *  -----BEGIN PUBLIC KEY-----\n    *  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmpxVY7ld/8DAjz6F6q0\n    *  5shjg8/4p6047bn6/m8yPy1RBsvIyvuDuGnP/RzPEhzXQ9UJ5Ynmh2XJZgHoE9xb\n    *  nfxL5BXHplJhMtADXKM9bWB11PU1Eioc3+AXBB8QiNFBn2XI5UkO5hPhbb9mJpjA\n    *  9Uhw8EdfqJP8QetVsI/xrCEbwEXe0xvifRLJbY08/Gp66KpQvy7g8w7VB8wlgePe\n    *  xW3pT13Ap6vuC+mQuJPyiHvSxjEKHgqePji9NP3tJUFQjcECqcm0yV7/2d0t/pbC\n    *  m+ZH1sadZspQCEPPrtbkQBlvHb4OLiIWPGHKSMeRFvp3IWcmdJqXahxLCUS1Eh6M\n    *  AQIDAQAB\n    *  -----END PUBLIC KEY-----\n    *\n    * Bytes can be got via \n    * $ openssl rsa -pubin -in key.pub -text -noout\n    */\n\n    var publisKeysHex = [\n      {\n        modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n        exponent: '010001'\n      },\n      {\n        modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n        exponent: '010001'\n      },\n      {\n        modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n        exponent: '010001'\n      },\n      {\n        modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n        exponent: '010001'\n      },\n      {\n        modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n        exponent: '010001'\n      }\n    ]\n\n    var publicKeysParsed = {}\n    var prepared = false\n\n    function prepareRsaKeys () {\n      if (prepared) {\n        return\n      }\n\n      for (var i = 0; i < publisKeysHex.length; i++) {\n        var keyParsed = publisKeysHex[i]\n\n        var RSAPublicKey = new TLSerialization()\n        RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n')\n        RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e')\n\n        var buffer = RSAPublicKey.getBuffer()\n\n        var fingerprintBytes = sha1BytesSync(buffer).slice(-8)\n        fingerprintBytes.reverse()\n\n        publicKeysParsed[bytesToHex(fingerprintBytes)] = {\n          modulus: keyParsed.modulus,\n          exponent: keyParsed.exponent\n        }\n      }\n\n      prepared = true\n    }\n\n    function selectRsaKeyByFingerPrint (fingerprints) {\n      prepareRsaKeys()\n\n      var fingerprintHex, foundKey, i\n      for (i = 0; i < fingerprints.length; i++) {\n        fingerprintHex = bigStringInt(fingerprints[i]).toString(16)\n        if (foundKey = publicKeysParsed[fingerprintHex]) {\n          return angular.extend({fingerprint: fingerprints[i]}, foundKey)\n        }\n      }\n\n      return false\n    }\n\n    return {\n      prepare: prepareRsaKeys,\n      select: selectRsaKeyByFingerPrint\n    }\n  })\n\n  .service('MtpSecureRandom', function ($window) {\n    $($window).on('click keydown', rng_seed_time)\n    return new SecureRandom()\n  })\n\n  .factory('MtpTimeManager', function (Storage) {\n    var lastMessageID = [0, 0]\n    var timeOffset = 0\n\n    Storage.get('server_time_offset').then(function (to) {\n      if (to) {\n        timeOffset = to\n      }\n    })\n\n    function generateMessageID () {\n      var timeTicks = tsNow(),\n        timeSec = Math.floor(timeTicks / 1000) + timeOffset,\n        timeMSec = timeTicks % 1000,\n        random = nextRandomInt(0xFFFF)\n\n      var messageID = [timeSec, (timeMSec << 21) | (random << 3) | 4]\n      if (lastMessageID[0] > messageID[0] ||\n        lastMessageID[0] == messageID[0] && lastMessageID[1] >= messageID[1]) {\n        messageID = [lastMessageID[0], lastMessageID[1] + 4]\n      }\n\n      lastMessageID = messageID\n\n      // console.log('generated msg id', messageID, timeOffset)\n\n      return longFromInts(messageID[0], messageID[1])\n    }\n\n    function applyServerTime (serverTime, localTime) {\n      var newTimeOffset = serverTime - Math.floor((localTime || tsNow()) / 1000)\n      var changed = Math.abs(timeOffset - newTimeOffset) > 10\n      Storage.set({server_time_offset: newTimeOffset})\n\n      lastMessageID = [0, 0]\n      timeOffset = newTimeOffset\n      console.log(dT(), 'Apply server time', serverTime, localTime, newTimeOffset, changed)\n\n      return changed\n    }\n\n    return {\n      generateID: generateMessageID,\n      applyServerTime: applyServerTime\n    }\n  })\n\n  .factory('MtpAuthorizer', function (MtpDcConfigurator, MtpRsaKeysManager, MtpSecureRandom, MtpTimeManager, CryptoWorker, $http, $q, $timeout) {\n    var chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/)\n    var chromeVersion = chromeMatches && parseFloat(chromeMatches[1]) || false\n    var xhrSendBuffer = !('ArrayBufferView' in window) && (chromeVersion > 0 && chromeVersion < 30)\n\n    delete $http.defaults.headers.post['Content-Type']\n    delete $http.defaults.headers.common['Accept']\n\n    function mtpSendPlainRequest (dcID, requestBuffer) {\n      var requestLength = requestBuffer.byteLength,\n        requestArray = new Int32Array(requestBuffer)\n\n      var header = new TLSerialization()\n      header.storeLongP(0, 0, 'auth_key_id') // Auth key\n      header.storeLong(MtpTimeManager.generateID(), 'msg_id') // Msg_id\n      header.storeInt(requestLength, 'request_length')\n\n      var headerBuffer = header.getBuffer(),\n        headerArray = new Int32Array(headerBuffer)\n      var headerLength = headerBuffer.byteLength\n\n      var resultBuffer = new ArrayBuffer(headerLength + requestLength),\n        resultArray = new Int32Array(resultBuffer)\n\n      resultArray.set(headerArray)\n      resultArray.set(requestArray, headerArray.length)\n\n      var requestData = xhrSendBuffer ? resultBuffer : resultArray,\n        requestPromise\n      var url = MtpDcConfigurator.chooseServer(dcID)\n      var baseError = {code: 406, type: 'NETWORK_BAD_RESPONSE', url: url}\n      try {\n        requestPromise = $http.post(url, requestData, {\n          responseType: 'arraybuffer',\n          transformRequest: null\n        })\n      } catch (e) {\n        requestPromise = $q.reject(angular.extend(baseError, {originalError: e}))\n      }\n      return requestPromise.then(\n        function (result) {\n          if (!result.data || !result.data.byteLength) {\n            return $q.reject(baseError)\n          }\n\n          try {\n            var deserializer = new TLDeserialization(result.data, {mtproto: true})\n            var auth_key_id = deserializer.fetchLong('auth_key_id')\n            var msg_id = deserializer.fetchLong('msg_id')\n            var msg_len = deserializer.fetchInt('msg_len')\n          } catch (e) {\n            return $q.reject(angular.extend(baseError, {originalError: e}))\n          }\n\n          return deserializer\n        },\n        function (error) {\n          if (!error.message && !error.type) {\n            error = angular.extend(baseError, {originalError: error})\n          }\n          return $q.reject(error)\n        }\n      )\n    }\n\n    function mtpSendReqPQ (auth) {\n      var deferred = auth.deferred\n\n      var request = new TLSerialization({mtproto: true})\n\n      request.storeMethod('req_pq', {nonce: auth.nonce})\n\n      console.log(dT(), 'Send req_pq', bytesToHex(auth.nonce))\n      mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n        var response = deserializer.fetchObject('ResPQ')\n\n        if (response._ != 'resPQ') {\n          throw new Error('[MT] resPQ response invalid: ' + response._)\n        }\n\n        if (!bytesCmp(auth.nonce, response.nonce)) {\n          throw new Error('[MT] resPQ nonce mismatch')\n        }\n\n        auth.serverNonce = response.server_nonce\n        auth.pq = response.pq\n        auth.fingerprints = response.server_public_key_fingerprints\n\n        console.log(dT(), 'Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints)\n\n        auth.publicKey = MtpRsaKeysManager.select(auth.fingerprints)\n\n        if (!auth.publicKey) {\n          throw new Error('[MT] No public key found')\n        }\n\n        console.log(dT(), 'PQ factorization start', auth.pq)\n        CryptoWorker.factorize(auth.pq).then(function (pAndQ) {\n          auth.p = pAndQ[0]\n          auth.q = pAndQ[1]\n          console.log(dT(), 'PQ factorization done', pAndQ[2])\n          mtpSendReqDhParams(auth)\n        }, function (error) {\n          console.log('Worker error', error, error.stack)\n          deferred.reject(error)\n        })\n      }, function (error) {\n        console.error(dT(), 'req_pq error', error.message)\n        deferred.reject(error)\n      })\n\n      $timeout(function () {\n        MtpRsaKeysManager.prepare()\n      })\n    }\n\n    function mtpSendReqDhParams (auth) {\n      var deferred = auth.deferred\n\n      auth.newNonce = new Array(32)\n      MtpSecureRandom.nextBytes(auth.newNonce)\n\n      var data = new TLSerialization({mtproto: true})\n      data.storeObject({\n        _: 'p_q_inner_data',\n        pq: auth.pq,\n        p: auth.p,\n        q: auth.q,\n        nonce: auth.nonce,\n        server_nonce: auth.serverNonce,\n        new_nonce: auth.newNonce\n      }, 'P_Q_inner_data', 'DECRYPTED_DATA')\n\n      var dataWithHash = sha1BytesSync(data.getBuffer()).concat(data.getBytes())\n\n      var request = new TLSerialization({mtproto: true})\n      request.storeMethod('req_DH_params', {\n        nonce: auth.nonce,\n        server_nonce: auth.serverNonce,\n        p: auth.p,\n        q: auth.q,\n        public_key_fingerprint: auth.publicKey.fingerprint,\n        encrypted_data: rsaEncrypt(auth.publicKey, dataWithHash)\n      })\n\n      console.log(dT(), 'Send req_DH_params')\n      mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n        var response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE')\n\n        if (response._ != 'server_DH_params_fail' && response._ != 'server_DH_params_ok') {\n          deferred.reject(new Error('[MT] Server_DH_Params response invalid: ' + response._))\n          return false\n        }\n\n        if (!bytesCmp(auth.nonce, response.nonce)) {\n          deferred.reject(new Error('[MT] Server_DH_Params nonce mismatch'))\n          return false\n        }\n\n        if (!bytesCmp(auth.serverNonce, response.server_nonce)) {\n          deferred.reject(new Error('[MT] Server_DH_Params server_nonce mismatch'))\n          return false\n        }\n\n        if (response._ == 'server_DH_params_fail') {\n          var newNonceHash = sha1BytesSync(auth.newNonce).slice(-16)\n          if (!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n            deferred.reject(new Error('[MT] server_DH_params_fail new_nonce_hash mismatch'))\n            return false\n          }\n          deferred.reject(new Error('[MT] server_DH_params_fail'))\n          return false\n        }\n\n        try {\n          mtpDecryptServerDhDataAnswer(auth, response.encrypted_answer)\n        } catch (e) {\n          deferred.reject(e)\n          return false\n        }\n\n        mtpSendSetClientDhParams(auth)\n      }, function (error) {\n        deferred.reject(error)\n      })\n    }\n\n    function mtpDecryptServerDhDataAnswer (auth, encryptedAnswer) {\n      auth.localTime = tsNow()\n\n      auth.tmpAesKey = sha1BytesSync(auth.newNonce.concat(auth.serverNonce)).concat(sha1BytesSync(auth.serverNonce.concat(auth.newNonce)).slice(0, 12))\n      auth.tmpAesIv = sha1BytesSync(auth.serverNonce.concat(auth.newNonce)).slice(12).concat(sha1BytesSync([].concat(auth.newNonce, auth.newNonce)), auth.newNonce.slice(0, 4))\n\n      var answerWithHash = aesDecryptSync(encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv)\n\n      var hash = answerWithHash.slice(0, 20)\n      var answerWithPadding = answerWithHash.slice(20)\n      var buffer = bytesToArrayBuffer(answerWithPadding)\n\n      var deserializer = new TLDeserialization(buffer, {mtproto: true})\n      var response = deserializer.fetchObject('Server_DH_inner_data')\n\n      if (response._ != 'server_DH_inner_data') {\n        throw new Error('[MT] server_DH_inner_data response invalid: ' + constructor)\n      }\n\n      if (!bytesCmp(auth.nonce, response.nonce)) {\n        throw new Error('[MT] server_DH_inner_data nonce mismatch')\n      }\n\n      if (!bytesCmp(auth.serverNonce, response.server_nonce)) {\n        throw new Error('[MT] server_DH_inner_data serverNonce mismatch')\n      }\n\n      console.log(dT(), 'Done decrypting answer')\n      auth.g = response.g\n      auth.dhPrime = response.dh_prime\n      auth.gA = response.g_a\n      auth.serverTime = response.server_time\n      auth.retry = 0\n\n      mtpVerifyDhParams(auth.g, auth.dhPrime, auth.gA)\n\n      var offset = deserializer.getOffset()\n\n      if (!bytesCmp(hash, sha1BytesSync(answerWithPadding.slice(0, offset)))) {\n        throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch')\n      }\n\n      MtpTimeManager.applyServerTime(auth.serverTime, auth.localTime)\n    }\n\n    function mtpVerifyDhParams(g, dhPrime, gA) {\n      console.log(dT(), 'Verifying DH params')\n      var dhPrimeHex = bytesToHex(dhPrime)\n      if (g != 3 ||\n          dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n        // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n        throw new Error('[MT] DH params are not verified: unknown dhPrime')\n      }\n      console.log(dT(), 'dhPrime cmp OK')\n\n      var gABigInt = new BigInteger(bytesToHex(gA), 16)\n      var dhPrimeBigInt = new BigInteger(dhPrimeHex, 16)\n\n      if (gABigInt.compareTo(BigInteger.ONE) <= 0) {\n        throw new Error('[MT] DH params are not verified: gA <= 1')\n      }\n\n      if (gABigInt.compareTo(dhPrimeBigInt.subtract(BigInteger.ONE)) >= 0) {\n        throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1')\n      }\n      console.log(dT(), '1 < gA < dhPrime-1 OK')\n\n\n      var two = new BigInteger(null)\n      two.fromInt(2)\n      var twoPow = two.pow(2048 - 64)\n\n      if (gABigInt.compareTo(twoPow) < 0) {\n        throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}')\n      }\n      if (gABigInt.compareTo(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n        throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}')\n      }\n      console.log(dT(), '2^{2048-64} < gA < dhPrime-2^{2048-64} OK')\n\n      return true\n    }\n\n    function mtpSendSetClientDhParams (auth) {\n      var deferred = auth.deferred\n      var gBytes = bytesFromHex(auth.g.toString(16))\n\n      auth.b = new Array(256)\n      MtpSecureRandom.nextBytes(auth.b)\n\n      CryptoWorker.modPow(gBytes, auth.b, auth.dhPrime).then(function (gB) {\n        var data = new TLSerialization({mtproto: true})\n        data.storeObject({\n          _: 'client_DH_inner_data',\n          nonce: auth.nonce,\n          server_nonce: auth.serverNonce,\n          retry_id: [0, auth.retry++],\n          g_b: gB\n        }, 'Client_DH_Inner_Data')\n\n        var dataWithHash = sha1BytesSync(data.getBuffer()).concat(data.getBytes())\n\n        var encryptedData = aesEncryptSync(dataWithHash, auth.tmpAesKey, auth.tmpAesIv)\n\n        var request = new TLSerialization({mtproto: true})\n        request.storeMethod('set_client_DH_params', {\n          nonce: auth.nonce,\n          server_nonce: auth.serverNonce,\n          encrypted_data: encryptedData\n        })\n\n        console.log(dT(), 'Send set_client_DH_params')\n        mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n          var response = deserializer.fetchObject('Set_client_DH_params_answer')\n\n          if (response._ != 'dh_gen_ok' && response._ != 'dh_gen_retry' && response._ != 'dh_gen_fail') {\n            deferred.reject(new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._))\n            return false\n          }\n\n          if (!bytesCmp(auth.nonce, response.nonce)) {\n            deferred.reject(new Error('[MT] Set_client_DH_params_answer nonce mismatch'))\n            return false\n          }\n\n          if (!bytesCmp(auth.serverNonce, response.server_nonce)) {\n            deferred.reject(new Error('[MT] Set_client_DH_params_answer server_nonce mismatch'))\n            return false\n          }\n\n          CryptoWorker.modPow(auth.gA, auth.b, auth.dhPrime).then(function (authKey) {\n            var authKeyHash = sha1BytesSync(authKey),\n              authKeyAux = authKeyHash.slice(0, 8),\n              authKeyID = authKeyHash.slice(-8)\n\n            console.log(dT(), 'Got Set_client_DH_params_answer', response._)\n            switch (response._) {\n              case 'dh_gen_ok':\n                var newNonceHash1 = sha1BytesSync(auth.newNonce.concat([1], authKeyAux)).slice(-16)\n\n                if (!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n                  deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash1 mismatch'))\n                  return false\n                }\n\n                var serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8))\n                // console.log('Auth successfull!', authKeyID, authKey, serverSalt)\n\n                auth.authKeyID = authKeyID\n                auth.authKey = authKey\n                auth.serverSalt = serverSalt\n\n                deferred.resolve(auth)\n                break\n\n              case 'dh_gen_retry':\n                var newNonceHash2 = sha1BytesSync(auth.newNonce.concat([2], authKeyAux)).slice(-16)\n                if (!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n                  deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch'))\n                  return false\n                }\n\n                return mtpSendSetClientDhParams(auth)\n\n              case 'dh_gen_fail':\n                var newNonceHash3 = sha1BytesSync(auth.newNonce.concat([3], authKeyAux)).slice(-16)\n                if (!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n                  deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch'))\n                  return false\n                }\n\n                deferred.reject(new Error('[MT] Set_client_DH_params_answer fail'))\n                return false\n            }\n          }, function (error) {\n            deferred.reject(error)\n          })\n        }, function (error) {\n          deferred.reject(error)\n        })\n      }, function (error) {\n        deferred.reject(error)\n      })\n    }\n\n    var cached = {}\n\n    function mtpAuth (dcID) {\n      if (cached[dcID] !== undefined) {\n        return cached[dcID]\n      }\n\n      var nonce = []\n      for (var i = 0; i < 16; i++) {\n        nonce.push(nextRandomInt(0xFF))\n      }\n\n      if (!MtpDcConfigurator.chooseServer(dcID)) {\n        return $q.reject(new Error('[MT] No server found for dc ' + dcID))\n      }\n\n      var auth = {\n        dcID: dcID,\n        nonce: nonce,\n        deferred: $q.defer()\n      }\n\n      $timeout(function () {\n        mtpSendReqPQ(auth)\n      })\n\n      cached[dcID] = auth.deferred.promise\n\n      cached[dcID]['catch'](function () {\n        delete cached[dcID]\n      })\n\n      return cached[dcID]\n    }\n\n    return {\n      auth: mtpAuth\n    }\n  })\n\n  .factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpTimeManager, MtpSecureRandom, Storage, CryptoWorker, AppRuntimeManager, $http, $q, $timeout, $interval, $rootScope) {\n    var updatesProcessor\n    var iii = 0,\n      offline\n    var offlineInited = false\n    var akStopped = false\n    var chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/)\n    var chromeVersion = chromeMatches && parseFloat(chromeMatches[1]) || false\n    var xhrSendBuffer = !('ArrayBufferView' in window) && (chromeVersion > 0 && chromeVersion < 30)\n\n    delete $http.defaults.headers.post['Content-Type']\n    delete $http.defaults.headers.common['Accept']\n\n    $rootScope.retryOnline = function () {\n      $(document.body).trigger('online')\n    }\n\n    function MtpNetworker (dcID, authKey, serverSalt, options) {\n      options = options || {}\n\n      this.dcID = dcID\n\n      this.authKey = authKey\n      this.authKeyUint8 = convertToUint8Array(authKey)\n      this.authKeyID = sha1BytesSync(authKey).slice(-8)\n\n      this.serverSalt = serverSalt\n\n      this.upload = options.fileUpload || options.fileDownload || false\n\n      this.updateSession()\n\n      this.lastServerMessages = []\n\n      this.checkConnectionPeriod = 0\n\n      this.sentMessages = {}\n\n      this.pendingMessages = {}\n      this.pendingAcks = []\n      this.pendingResends = []\n      this.connectionInited = false\n\n\n      this.longPollInt = $interval(this.checkLongPoll.bind(this), 10000)\n      this.checkLongPoll()\n\n      if (!offlineInited) {\n        offlineInited = true\n        $rootScope.offline = true\n        $rootScope.offlineConnecting = true\n      }\n\n      if (Config.Navigator.mobile) {\n        this.setupMobileSleep()\n      }\n    }\n\n    MtpNetworker.prototype.updateSession = function () {\n      this.seqNo = 0\n      this.prevSessionID = this.sessionID\n      this.sessionID = new Array(8)\n      MtpSecureRandom.nextBytes(this.sessionID)\n    }\n\n    MtpNetworker.prototype.setupMobileSleep = function () {\n      var self = this\n      $rootScope.$watch('idle.isIDLE', function (isIDLE) {\n        if (isIDLE) {\n          self.sleepAfter = tsNow() + 30000\n        } else {\n          delete self.sleepAfter\n          self.checkLongPoll()\n        }\n      })\n\n      $rootScope.$on('push_received', function () {\n        // console.log(dT(), 'push recieved', self.sleepAfter)\n        if (self.sleepAfter) {\n          self.sleepAfter = tsNow() + 30000\n          self.checkLongPoll()\n        }\n      })\n    }\n\n    MtpNetworker.prototype.updateSentMessage = function (sentMessageID) {\n      var sentMessage = this.sentMessages[sentMessageID]\n      if (!sentMessage) {\n        return false\n      }\n      var self = this\n      if (sentMessage.container) {\n        var newInner = []\n        angular.forEach(sentMessage.inner, function (innerSentMessageID) {\n          var innerSentMessage = self.updateSentMessage(innerSentMessageID)\n          if (innerSentMessage) {\n            newInner.push(innerSentMessage.msg_id)\n          }\n        })\n        sentMessage.inner = newInner\n      }\n\n      sentMessage.msg_id = MtpTimeManager.generateID()\n      sentMessage.seq_no = this.generateSeqNo(\n        sentMessage.notContentRelated ||\n        sentMessage.container\n      )\n      this.sentMessages[sentMessage.msg_id] = sentMessage\n      delete self.sentMessages[sentMessageID]\n\n      return sentMessage\n    }\n\n    MtpNetworker.prototype.generateSeqNo = function (notContentRelated) {\n      var seqNo = this.seqNo * 2\n\n      if (!notContentRelated) {\n        seqNo++\n        this.seqNo++\n      }\n\n      return seqNo\n    }\n\n    MtpNetworker.prototype.wrapMtpCall = function (method, params, options) {\n      var serializer = new TLSerialization({mtproto: true})\n\n      serializer.storeMethod(method, params)\n\n      var messageID = MtpTimeManager.generateID()\n      var seqNo = this.generateSeqNo()\n      var message = {\n        msg_id: messageID,\n        seq_no: seqNo,\n        body: serializer.getBytes()\n      }\n\n      if (Config.Modes.debug) {\n        console.log(dT(), 'MT call', method, params, messageID, seqNo)\n      }\n\n      return this.pushMessage(message, options)\n    }\n\n    MtpNetworker.prototype.wrapMtpMessage = function (object, options) {\n      options = options || {}\n\n      var serializer = new TLSerialization({mtproto: true})\n      serializer.storeObject(object, 'Object')\n\n      var messageID = MtpTimeManager.generateID()\n      var seqNo = this.generateSeqNo(options.notContentRelated)\n      var message = {\n        msg_id: messageID,\n        seq_no: seqNo,\n        body: serializer.getBytes()\n      }\n\n      if (Config.Modes.debug) {\n        console.log(dT(), 'MT message', object, messageID, seqNo)\n      }\n\n      return this.pushMessage(message, options)\n    }\n\n    MtpNetworker.prototype.wrapApiCall = function (method, params, options) {\n      var serializer = new TLSerialization(options)\n\n      if (!this.connectionInited) {\n        serializer.storeInt(0xda9b0d0d, 'invokeWithLayer')\n        serializer.storeInt(Config.Schema.API.layer, 'layer')\n        serializer.storeInt(0xc7481da6, 'initConnection')\n        serializer.storeInt(Config.App.id, 'api_id')\n        serializer.storeString(navigator.userAgent || 'Unknown UserAgent', 'device_model')\n        serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version')\n        serializer.storeString(Config.App.version, 'app_version')\n        serializer.storeString(navigator.language || 'en', 'system_lang_code')\n        serializer.storeString('', 'lang_pack')\n        serializer.storeString(navigator.language || 'en', 'lang_code')\n      }\n\n      if (options.afterMessageID) {\n        serializer.storeInt(0xcb9f372d, 'invokeAfterMsg')\n        serializer.storeLong(options.afterMessageID, 'msg_id')\n      }\n\n      options.resultType = serializer.storeMethod(method, params)\n\n      var messageID = MtpTimeManager.generateID()\n      var seqNo = this.generateSeqNo()\n      var message = {\n        msg_id: messageID,\n        seq_no: seqNo,\n        body: serializer.getBytes(true),\n        isAPI: true\n      }\n\n      if (Config.Modes.debug) {\n        console.log(dT(), 'Api call', method, params, messageID, seqNo, options)\n      } else {\n        console.log(dT(), 'Api call', method)\n      }\n\n      return this.pushMessage(message, options)\n    }\n\n    MtpNetworker.prototype.checkLongPoll = function (force) {\n      var isClean = this.cleanupSent()\n      // console.log('Check lp', this.longPollPending, tsNow(), this.dcID, isClean)\n      if (this.longPollPending && tsNow() < this.longPollPending ||\n          this.offline ||\n          akStopped) {\n        return false\n      }\n      var self = this\n      Storage.get('dc').then(function (baseDcID) {\n        if (isClean && (\n          baseDcID != self.dcID ||\n          self.upload ||\n          self.sleepAfter && tsNow() > self.sleepAfter\n          )) {\n          // console.warn(dT(), 'Send long-poll for DC is delayed', self.dcID, self.sleepAfter)\n          return\n        }\n        self.sendLongPoll()\n      })\n    }\n\n    MtpNetworker.prototype.sendLongPoll = function () {\n      var maxWait = 25000\n      var self = this\n\n      this.longPollPending = tsNow() + maxWait\n      // console.log('Set lp', this.longPollPending, tsNow())\n\n      this.wrapMtpCall('http_wait', {\n        max_delay: 500,\n        wait_after: 150,\n        max_wait: maxWait\n      }, {\n        noResponse: true,\n        longPoll: true\n      }).then(function () {\n        delete self.longPollPending\n        setZeroTimeout(self.checkLongPoll.bind(self))\n      }, function (error) {\n        console.log('Long-poll failed', error)\n      })\n    }\n\n    MtpNetworker.prototype.pushMessage = function (message, options) {\n      var deferred = $q.defer()\n\n      this.sentMessages[message.msg_id] = angular.extend(message, options || {}, {deferred: deferred})\n      this.pendingMessages[message.msg_id] = 0\n\n      if (!options || !options.noShedule) {\n        this.sheduleRequest()\n      }\n      if (angular.isObject(options)) {\n        options.messageID = message.msg_id\n      }\n\n      return deferred.promise\n    }\n\n    MtpNetworker.prototype.pushResend = function (messageID, delay) {\n      var value = delay ? tsNow() + delay : 0\n      var sentMessage = this.sentMessages[messageID]\n      if (sentMessage.container) {\n        for (var i = 0; i < sentMessage.inner.length; i++) {\n          this.pendingMessages[sentMessage.inner[i]] = value\n        }\n      } else {\n        this.pendingMessages[messageID] = value\n      }\n\n      // console.log('Resend due', messageID, this.pendingMessages)\n\n      this.sheduleRequest(delay)\n    }\n\n    MtpNetworker.prototype.getMsgKey = function (dataWithPadding, isOut) {\n      var authKey = this.authKeyUint8\n      var x = isOut ? 0 : 8\n      var msgKeyLargePlain = bufferConcat(authKey.subarray(88 + x, 88 + x + 32), dataWithPadding)\n      return CryptoWorker.sha256Hash(msgKeyLargePlain).then(function (msgKeyLarge) {\n        var msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24)\n        return msgKey\n      })\n    }\n\n    MtpNetworker.prototype.getAesKeyIv = function (msgKey, isOut) {\n      var authKey = this.authKeyUint8\n      var x = isOut ? 0 : 8\n      var sha2aText = new Uint8Array(52)\n      var sha2bText = new Uint8Array(52)\n      var promises = {}\n\n      sha2aText.set(msgKey, 0)\n      sha2aText.set(authKey.subarray(x, x + 36), 16)\n      promises.sha2a = CryptoWorker.sha256Hash(sha2aText)\n\n      sha2bText.set(authKey.subarray(40 + x, 40 + x + 36), 0)\n      sha2bText.set(msgKey, 36)\n      promises.sha2b = CryptoWorker.sha256Hash(sha2bText)\n\n      return $q.all(promises).then(function (result) {\n        var aesKey = new Uint8Array(32)\n        var aesIv = new Uint8Array(32)\n        var sha2a = new Uint8Array(result.sha2a)\n        var sha2b = new Uint8Array(result.sha2b)\n\n        aesKey.set(sha2a.subarray(0, 8))\n        aesKey.set(sha2b.subarray(8, 24), 8)\n        aesKey.set(sha2a.subarray(24, 32), 24)\n\n        aesIv.set(sha2b.subarray(0, 8))\n        aesIv.set(sha2a.subarray(8, 24), 8)\n        aesIv.set(sha2b.subarray(24, 32), 24)\n\n        return [aesKey, aesIv]\n      })\n    }\n\n    MtpNetworker.prototype.checkConnection = function (event) {\n      $rootScope.offlineConnecting = true\n\n      console.log(dT(), 'Check connection', event)\n      $timeout.cancel(this.checkConnectionPromise)\n\n      var serializer = new TLSerialization({mtproto: true})\n      var pingID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)]\n\n      serializer.storeMethod('ping', {ping_id: pingID})\n\n      var pingMessage = {\n        msg_id: MtpTimeManager.generateID(),\n        seq_no: this.generateSeqNo(true),\n        body: serializer.getBytes()\n      }\n\n      var self = this\n      this.sendEncryptedRequest(pingMessage, {timeout: 15000}).then(function (result) {\n        delete $rootScope.offlineConnecting\n        self.toggleOffline(false)\n      }, function () {\n        console.log(dT(), 'Delay ', self.checkConnectionPeriod * 1000)\n        self.checkConnectionPromise = $timeout(self.checkConnection.bind(self), parseInt(self.checkConnectionPeriod * 1000))\n        self.checkConnectionPeriod = Math.min(60, self.checkConnectionPeriod * 1.5)\n        $timeout(function () {\n          delete $rootScope.offlineConnecting\n        }, 1000)\n      })\n    }\n\n    MtpNetworker.prototype.toggleOffline = function (enabled) {\n      // console.log('toggle ', enabled, this.dcID, this.iii)\n      if (this.offline !== undefined && this.offline == enabled) {\n        return false\n      }\n\n      this.offline = enabled\n      $rootScope.offline = enabled\n      $rootScope.offlineConnecting = false\n\n      if (this.offline) {\n        $timeout.cancel(this.nextReqPromise)\n        delete this.nextReq\n\n        if (this.checkConnectionPeriod < 1.5) {\n          this.checkConnectionPeriod = 0\n        }\n\n        this.checkConnectionPromise = $timeout(this.checkConnection.bind(this), parseInt(this.checkConnectionPeriod * 1000))\n        this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5)\n\n        this.onOnlineCb = this.checkConnection.bind(this)\n\n        $(document.body).on('online focus', this.onOnlineCb)\n      } else {\n        delete this.longPollPending\n        this.checkLongPoll()\n        this.sheduleRequest()\n\n        if (this.onOnlineCb) {\n          $(document.body).off('online focus', this.onOnlineCb)\n        }\n        $timeout.cancel(this.checkConnectionPromise)\n      }\n    }\n\n    MtpNetworker.prototype.performSheduledRequest = function () {\n      // console.log(dT(), 'sheduled', this.dcID, this.iii)\n      if (this.offline || akStopped) {\n        console.log(dT(), 'Cancel sheduled')\n        return false\n      }\n      delete this.nextReq\n      if (this.pendingAcks.length) {\n        var ackMsgIDs = []\n        for (var i = 0; i < this.pendingAcks.length; i++) {\n          ackMsgIDs.push(this.pendingAcks[i])\n        }\n        // console.log('acking messages', ackMsgIDs)\n        this.wrapMtpMessage({_: 'msgs_ack', msg_ids: ackMsgIDs}, {notContentRelated: true, noShedule: true})\n      }\n\n      if (this.pendingResends.length) {\n        var resendMsgIDs = []\n        var resendOpts = {noShedule: true, notContentRelated: true}\n        for (var i = 0; i < this.pendingResends.length; i++) {\n          resendMsgIDs.push(this.pendingResends[i])\n        }\n        // console.log('resendReq messages', resendMsgIDs)\n        this.wrapMtpMessage({_: 'msg_resend_req', msg_ids: resendMsgIDs}, resendOpts)\n        this.lastResendReq = {req_msg_id: resendOpts.messageID, resend_msg_ids: resendMsgIDs}\n      }\n\n      var messages = [],\n        message\n      var messagesByteLen = 0\n      var currentTime = tsNow()\n      var hasApiCall = false\n      var hasHttpWait = false\n      var lengthOverflow = false\n      var singlesCount = 0\n      var self = this\n\n      angular.forEach(this.pendingMessages, function (value, messageID) {\n        if (!value || value >= currentTime) {\n          if (message = self.sentMessages[messageID]) {\n            var messageByteLength = (message.body.byteLength || message.body.length) + 32\n            if (!message.notContentRelated &&\n              lengthOverflow) {\n              return\n            }\n            if (!message.notContentRelated &&\n              messagesByteLen &&\n              messagesByteLen + messageByteLength > 655360) { // 640 Kb\n              lengthOverflow = true\n              return\n            }\n            if (message.singleInRequest) {\n              singlesCount++\n              if (singlesCount > 1) {\n                return\n              }\n            }\n            messages.push(message)\n            messagesByteLen += messageByteLength\n            if (message.isAPI) {\n              hasApiCall = true\n            }\n            else if (message.longPoll) {\n              hasHttpWait = true\n            }\n          } else {\n            // console.log(message, messageID)\n          }\n          delete self.pendingMessages[messageID]\n        }\n      })\n\n      if (hasApiCall && !hasHttpWait) {\n        var serializer = new TLSerialization({mtproto: true})\n        serializer.storeMethod('http_wait', {\n          max_delay: 500,\n          wait_after: 150,\n          max_wait: 3000\n        })\n        messages.push({\n          msg_id: MtpTimeManager.generateID(),\n          seq_no: this.generateSeqNo(),\n          body: serializer.getBytes()\n        })\n      }\n\n      if (!messages.length) {\n        // console.log('no sheduled messages')\n        return\n      }\n\n      var noResponseMsgs = []\n\n      if (messages.length > 1) {\n        var container = new TLSerialization({mtproto: true, startMaxLength: messagesByteLen + 64})\n        container.storeInt(0x73f1f8dc, 'CONTAINER[id]')\n        container.storeInt(messages.length, 'CONTAINER[count]')\n        var onloads = []\n        var innerMessages = []\n        for (var i = 0; i < messages.length; i++) {\n          container.storeLong(messages[i].msg_id, 'CONTAINER[' + i + '][msg_id]')\n          innerMessages.push(messages[i].msg_id)\n          container.storeInt(messages[i].seq_no, 'CONTAINER[' + i + '][seq_no]')\n          container.storeInt(messages[i].body.length, 'CONTAINER[' + i + '][bytes]')\n          container.storeRawBytes(messages[i].body, 'CONTAINER[' + i + '][body]')\n          if (messages[i].noResponse) {\n            noResponseMsgs.push(messages[i].msg_id)\n          }\n        }\n\n        var containerSentMessage = {\n          msg_id: MtpTimeManager.generateID(),\n          seq_no: this.generateSeqNo(true),\n          container: true,\n          inner: innerMessages\n        }\n\n        message = angular.extend({body: container.getBytes(true)}, containerSentMessage)\n\n        this.sentMessages[message.msg_id] = containerSentMessage\n\n        if (Config.Modes.debug) {\n          console.log(dT(), 'Container', innerMessages, message.msg_id, message.seq_no)\n        }\n      } else {\n        if (message.noResponse) {\n          noResponseMsgs.push(message.msg_id)\n        }\n        this.sentMessages[message.msg_id] = message\n      }\n\n      this.pendingAcks = []\n\n      this.sendEncryptedRequest(message).then(function (result) {\n        self.toggleOffline(false)\n        // console.log('parse for', message)\n        self.parseResponse(result.data).then(function (response) {\n          if (Config.Modes.debug) {\n            console.log(dT(), 'Server response', self.dcID, response)\n          }\n\n          self.processMessage(response.response, response.messageID, response.sessionID)\n\n          angular.forEach(noResponseMsgs, function (msgID) {\n            if (self.sentMessages[msgID]) {\n              var deferred = self.sentMessages[msgID].deferred\n              delete self.sentMessages[msgID]\n              deferred.resolve()\n            }\n          })\n\n          self.checkLongPoll()\n\n          this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod))\n        })\n      }, function (error) {\n        console.error('Encrypted request failed', error)\n\n        if (message.container) {\n          angular.forEach(message.inner, function (msgID) {\n            self.pendingMessages[msgID] = 0\n          })\n          delete self.sentMessages[message.msg_id]\n        } else {\n          self.pendingMessages[message.msg_id] = 0\n        }\n\n        angular.forEach(noResponseMsgs, function (msgID) {\n          if (self.sentMessages[msgID]) {\n            var deferred = self.sentMessages[msgID].deferred\n            delete self.sentMessages[msgID]\n            delete self.pendingMessages[msgID]\n            deferred.reject()\n          }\n        })\n\n        self.toggleOffline(true)\n      })\n\n      if (lengthOverflow || singlesCount > 1) {\n        this.sheduleRequest()\n      }\n    }\n\n    MtpNetworker.prototype.getEncryptedMessage = function (dataWithPadding) {\n      var self = this\n      return self.getMsgKey(dataWithPadding, true).then(function (msgKey) {\n        return self.getAesKeyIv(msgKey, true).then(function (keyIv) {\n          // console.log(dT(), 'after msg key iv')\n          return CryptoWorker.aesEncrypt(dataWithPadding, keyIv[0], keyIv[1]).then(function (encryptedBytes) {\n            // console.log(dT(), 'Finish encrypt')\n            return {\n              bytes: encryptedBytes,\n              msgKey: msgKey\n            }\n          })\n        })\n      })\n    }\n\n    MtpNetworker.prototype.getDecryptedMessage = function (msgKey, encryptedData) {\n      // console.log(dT(), 'get decrypted start')\n      return this.getAesKeyIv(msgKey, false).then(function (keyIv) {\n        // console.log(dT(), 'after msg key iv')\n        return CryptoWorker.aesDecrypt(encryptedData, keyIv[0], keyIv[1])\n      })\n    }\n\n    MtpNetworker.prototype.sendEncryptedRequest = function (message, options) {\n      var self = this\n      options = options || {}\n      // console.log(dT(), 'Send encrypted'/*, message*/)\n      // console.trace()\n      var data = new TLSerialization({startMaxLength: message.body.length + 2048})\n\n      data.storeIntBytes(this.serverSalt, 64, 'salt')\n      data.storeIntBytes(this.sessionID, 64, 'session_id')\n\n      data.storeLong(message.msg_id, 'message_id')\n      data.storeInt(message.seq_no, 'seq_no')\n\n      data.storeInt(message.body.length, 'message_data_length')\n      data.storeRawBytes(message.body, 'message_data')\n\n      var dataBuffer = data.getBuffer()\n\n      var paddingLength = (16 - (data.offset % 16)) + 16 * (1 + nextRandomInt(5))\n      var padding = new Array(paddingLength)\n      MtpSecureRandom.nextBytes(padding)\n\n      var dataWithPadding = bufferConcat(dataBuffer, padding)\n      // console.log(dT(), 'Adding padding', dataBuffer, padding, dataWithPadding)\n      // console.log(dT(), 'auth_key_id', bytesToHex(self.authKeyID))\n\n      return this.getEncryptedMessage(dataWithPadding).then(function (encryptedResult) {\n        // console.log(dT(), 'Got encrypted out message'/*, encryptedResult*/)\n        var request = new TLSerialization({startMaxLength: encryptedResult.bytes.byteLength + 256})\n        request.storeIntBytes(self.authKeyID, 64, 'auth_key_id')\n        request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key')\n        request.storeRawBytes(encryptedResult.bytes, 'encrypted_data')\n\n        var requestData = xhrSendBuffer ? request.getBuffer() : request.getArray()\n\n        var requestPromise\n        var url = MtpDcConfigurator.chooseServer(self.dcID, self.upload)\n        var baseError = {code: 406, type: 'NETWORK_BAD_RESPONSE', url: url}\n\n        try {\n          options = angular.extend(options || {}, {\n            responseType: 'arraybuffer',\n            transformRequest: null\n          })\n          requestPromise = $http.post(url, requestData, options)\n        } catch (e) {\n          requestPromise = $q.reject(e)\n        }\n        return requestPromise.then(\n          function (result) {\n            if (!result.data || !result.data.byteLength) {\n              return $q.reject(baseError)\n            }\n            return result\n          },\n          function (error) {\n            if (!error.message && !error.type) {\n              error = angular.extend(baseError, {type: 'NETWORK_BAD_REQUEST', originalError: error})\n            }\n            return $q.reject(error)\n          }\n        )\n      })\n    }\n\n    MtpNetworker.prototype.parseResponse = function (responseBuffer) {\n      // console.log(dT(), 'Start parsing response')\n      var self = this\n      var deserializer = new TLDeserialization(responseBuffer)\n\n      var authKeyID = deserializer.fetchIntBytes(64, false, 'auth_key_id')\n      if (!bytesCmp(authKeyID, this.authKeyID)) {\n        throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyID))\n      }\n      var msgKey = deserializer.fetchIntBytes(128, true, 'msg_key')\n      var encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data')\n\n      return self.getDecryptedMessage(msgKey, encryptedData).then(function (dataWithPadding) {\n        // console.log(dT(), 'after decrypt')\n        return self.getMsgKey(dataWithPadding, false).then(function (calcMsgKey) {\n          if (!bytesCmp(msgKey, calcMsgKey)) {\n            console.warn('[MT] msg_keys', msgKey, bytesFromArrayBuffer(calcMsgKey))\n            throw new Error('[MT] server msgKey mismatch')\n          }\n          // console.log(dT(), 'after msgKey check')\n\n          var deserializer = new TLDeserialization(dataWithPadding, {mtproto: true})\n\n          var salt = deserializer.fetchIntBytes(64, false, 'salt')\n          var sessionID = deserializer.fetchIntBytes(64, false, 'session_id')\n          var messageID = deserializer.fetchLong('message_id')\n\n          if (!bytesCmp(sessionID, self.sessionID) &&\n              (!self.prevSessionID || !bytesCmp(sessionID, self.prevSessionID))) {\n            console.warn('Sessions', sessionID, self.sessionID, self.prevSessionID)\n            throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionID))\n          }\n\n          var seqNo = deserializer.fetchInt('seq_no')\n\n          var totalLength = dataWithPadding.byteLength\n\n          var messageBodyLength = deserializer.fetchInt('message_data[length]')\n          var offset = deserializer.getOffset()\n\n          if ((messageBodyLength % 4) ||\n              messageBodyLength > totalLength - offset) {\n            throw new Error('[MT] Invalid body length: ' + messageBodyLength)\n          }\n          var messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data')\n\n          var offset = deserializer.getOffset()\n          var paddingLength = totalLength - offset\n          if (paddingLength < 12 || paddingLength > 1024) {\n            throw new Error('[MT] Invalid padding length: ' + paddingLength)\n          }\n\n          var buffer = bytesToArrayBuffer(messageBody)\n          var deserializerOptions = {\n            mtproto: true,\n            override: {\n              mt_message: function (result, field) {\n                result.msg_id = this.fetchLong(field + '[msg_id]')\n                result.seqno = this.fetchInt(field + '[seqno]')\n                result.bytes = this.fetchInt(field + '[bytes]')\n\n                var offset = this.getOffset()\n\n                try {\n                  result.body = this.fetchObject('Object', field + '[body]')\n                } catch (e) {\n                  console.error(dT(), 'parse error', e.message, e.stack)\n                  result.body = {_: 'parse_error', error: e}\n                }\n                if (this.offset != offset + result.bytes) {\n                  // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n                  // console.log(dT(), result)\n                  this.offset = offset + result.bytes\n                }\n              // console.log(dT(), 'override message', result)\n              },\n              mt_rpc_result: function (result, field) {\n                result.req_msg_id = this.fetchLong(field + '[req_msg_id]')\n\n                var sentMessage = self.sentMessages[result.req_msg_id]\n                var type = sentMessage && sentMessage.resultType || 'Object'\n\n                if (result.req_msg_id && !sentMessage) {\n                  // console.warn(dT(), 'Result for unknown message', result)\n                  return\n                }\n                result.result = this.fetchObject(type, field + '[result]')\n              // console.log(dT(), 'override rpc_result', sentMessage, type, result)\n              }\n            }\n          }\n          var deserializer = new TLDeserialization(buffer, deserializerOptions)\n          var response = deserializer.fetchObject('', 'INPUT')\n\n          return {\n            response: response,\n            messageID: messageID,\n            sessionID: sessionID,\n            seqNo: seqNo\n          }\n        })\n      })\n    }\n\n    MtpNetworker.prototype.applyServerSalt = function (newServerSalt) {\n      var serverSalt = longToBytes(newServerSalt)\n\n      var storeObj = {}\n      storeObj['dc' + this.dcID + '_server_salt'] = bytesToHex(serverSalt)\n      Storage.set(storeObj)\n\n      this.serverSalt = serverSalt\n      return true\n    }\n\n    MtpNetworker.prototype.sheduleRequest = function (delay) {\n      if (this.offline) {\n        this.checkConnection('forced shedule')\n      }\n      var nextReq = tsNow() + delay\n\n      if (delay && this.nextReq && this.nextReq <= nextReq) {\n        return false\n      }\n\n      // console.log(dT(), 'shedule req', delay)\n      // console.trace()\n\n      $timeout.cancel(this.nextReqPromise)\n      if (delay > 0) {\n        this.nextReqPromise = $timeout(this.performSheduledRequest.bind(this), delay || 0)\n      } else {\n        setZeroTimeout(this.performSheduledRequest.bind(this))\n      }\n\n      this.nextReq = nextReq\n    }\n\n    MtpNetworker.prototype.ackMessage = function (msgID) {\n      // console.log('ack message', msgID)\n      this.pendingAcks.push(msgID)\n      this.sheduleRequest(30000)\n    }\n\n    MtpNetworker.prototype.reqResendMessage = function (msgID) {\n      console.log(dT(), 'Req resend', msgID)\n      this.pendingResends.push(msgID)\n      this.sheduleRequest(100)\n    }\n\n    MtpNetworker.prototype.cleanupSent = function () {\n      var self = this\n      var notEmpty = false\n      // console.log('clean start', this.dcID/*, this.sentMessages*/)\n      angular.forEach(this.sentMessages, function (message, msgID) {\n        // console.log('clean iter', msgID, message)\n        if (message.notContentRelated && self.pendingMessages[msgID] === undefined) {\n          // console.log('clean notContentRelated', msgID)\n          delete self.sentMessages[msgID]\n        }\n        else if (message.container) {\n          for (var i = 0; i < message.inner.length; i++) {\n            if (self.sentMessages[message.inner[i]] !== undefined) {\n              // console.log('clean failed, found', msgID, message.inner[i], self.sentMessages[message.inner[i]].seq_no)\n              notEmpty = true\n              return\n            }\n          }\n          // console.log('clean container', msgID)\n          delete self.sentMessages[msgID]\n        } else {\n          notEmpty = true\n        }\n      })\n\n      return !notEmpty\n    }\n\n    MtpNetworker.prototype.processMessageAck = function (messageID) {\n      var sentMessage = this.sentMessages[messageID]\n      if (sentMessage && !sentMessage.acked) {\n        delete sentMessage.body\n        sentMessage.acked = true\n\n        return true\n      }\n\n      return false\n    }\n\n    MtpNetworker.prototype.processError = function (rawError) {\n      var matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || []\n      rawError.error_code = uintToInt(rawError.error_code)\n\n      return {\n        code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n        type: matches[1] || 'UNKNOWN',\n        description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n        originalError: rawError\n      }\n    }\n\n    MtpNetworker.prototype.processMessage = function (message, messageID, sessionID) {\n      var msgidInt = parseInt(messageID.toString(10).substr(0, -10), 10)\n      if (msgidInt % 2) {\n        console.warn('[MT] Server even message id: ', messageID, message)\n        return\n      }\n      // console.log('process message', message, messageID, sessionID)\n      switch (message._) {\n        case 'msg_container':\n          var len = message.messages.length\n          for (var i = 0; i < len; i++) {\n            this.processMessage(message.messages[i], message.messages[i].msg_id, sessionID)\n          }\n          break\n\n        case 'bad_server_salt':\n          console.log(dT(), 'Bad server salt', message)\n          var sentMessage = this.sentMessages[message.bad_msg_id]\n          if (!sentMessage || sentMessage.seq_no != message.bad_msg_seqno) {\n            console.log(message.bad_msg_id, message.bad_msg_seqno)\n            throw new Error('[MT] Bad server salt for invalid message')\n          }\n\n          this.applyServerSalt(message.new_server_salt)\n          this.pushResend(message.bad_msg_id)\n          this.ackMessage(messageID)\n          break\n\n        case 'bad_msg_notification':\n          console.log(dT(), 'Bad msg notification', message)\n          var sentMessage = this.sentMessages[message.bad_msg_id]\n          if (!sentMessage || sentMessage.seq_no != message.bad_msg_seqno) {\n            console.log(message.bad_msg_id, message.bad_msg_seqno)\n            throw new Error('[MT] Bad msg notification for invalid message')\n          }\n\n          if (message.error_code == 16 || message.error_code == 17) {\n            if (MtpTimeManager.applyServerTime(\n                bigStringInt(messageID).shiftRight(32).toString(10)\n              )) {\n              console.log(dT(), 'Update session')\n              this.updateSession()\n            }\n            var badMessage = this.updateSentMessage(message.bad_msg_id)\n            this.pushResend(badMessage.msg_id)\n            this.ackMessage(messageID)\n          }\n          break\n\n        case 'message':\n          if (this.lastServerMessages.indexOf(messageID) != -1) {\n            // console.warn('[MT] Server same messageID: ', messageID)\n            this.ackMessage(messageID)\n            return\n          }\n          this.lastServerMessages.push(messageID)\n          if (this.lastServerMessages.length > 100) {\n            this.lastServerMessages.shift()\n          }\n          this.processMessage(message.body, message.msg_id, sessionID)\n          break\n\n        case 'new_session_created':\n          this.ackMessage(messageID)\n\n          this.processMessageAck(message.first_msg_id)\n          this.applyServerSalt(message.server_salt)\n\n          var self = this\n          Storage.get('dc').then(function (baseDcID) {\n            if (baseDcID == self.dcID && !self.upload && updatesProcessor) {\n              updatesProcessor(message, true)\n            }\n          })\n          break\n\n        case 'msgs_ack':\n          for (var i = 0; i < message.msg_ids.length; i++) {\n            this.processMessageAck(message.msg_ids[i])\n          }\n          break\n\n        case 'msg_detailed_info':\n          if (!this.sentMessages[message.msg_id]) {\n            this.ackMessage(message.answer_msg_id)\n            break\n          }\n        case 'msg_new_detailed_info':\n          if (this.pendingAcks.indexOf(message.answer_msg_id)) {\n            break\n          }\n          this.reqResendMessage(message.answer_msg_id)\n          break\n\n        case 'msgs_state_info':\n          this.ackMessage(message.answer_msg_id)\n          if (this.lastResendReq && this.lastResendReq.req_msg_id == message.req_msg_id && this.pendingResends.length) {\n            var i, badMsgID, pos\n            for (i = 0; i < this.lastResendReq.resend_msg_ids.length; i++) {\n              badMsgID = this.lastResendReq.resend_msg_ids[i]\n              pos = this.pendingResends.indexOf(badMsgID)\n              if (pos != -1) {\n                this.pendingResends.splice(pos, 1)\n              }\n            }\n          }\n          break\n\n        case 'rpc_result':\n          this.ackMessage(messageID)\n\n          var sentMessageID = message.req_msg_id\n          var sentMessage = this.sentMessages[sentMessageID]\n\n          this.processMessageAck(sentMessageID)\n          if (sentMessage) {\n            var deferred = sentMessage.deferred\n            if (message.result._ == 'rpc_error') {\n              var error = this.processError(message.result)\n              console.log(dT(), 'Rpc error', error)\n              if (deferred) {\n                deferred.reject(error)\n              }\n            } else {\n              if (deferred) {\n                if (Config.Modes.debug) {\n                  console.log(dT(), 'Rpc response', message.result)\n                } else {\n                  var dRes = message.result._\n                  if (!dRes) {\n                    if (message.result.length > 5) {\n                      dRes = '[..' + message.result.length + '..]'\n                    } else {\n                      dRes = message.result\n                    }\n                  }\n                  console.log(dT(), 'Rpc response', dRes)\n                }\n                sentMessage.deferred.resolve(message.result)\n              }\n              if (sentMessage.isAPI) {\n                this.connectionInited = true\n              }\n            }\n\n            delete this.sentMessages[sentMessageID]\n          }\n          break\n\n        default:\n          this.ackMessage(messageID)\n\n          // console.log('Update', message)\n          if (updatesProcessor) {\n            updatesProcessor(message, true)\n          }\n          break\n\n      }\n    }\n\n    function startAll () {\n      if (akStopped) {\n        akStopped = false\n        updatesProcessor({_: 'new_session_created'}, true)\n      }\n    }\n\n    function stopAll () {\n      akStopped = true\n    }\n\n    return {\n      getNetworker: function (dcID, authKey, serverSalt, options) {\n        return new MtpNetworker(dcID, authKey, serverSalt, options)\n      },\n      setUpdatesProcessor: function (callback) {\n        updatesProcessor = callback\n      },\n      stopAll: stopAll,\n      startAll: startAll\n    }\n  })\n"
  },
  {
    "path": "app/js/lib/mtproto_wrapper.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nangular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])\n\n  .factory('MtpApiManager', function (Storage, MtpAuthorizer, MtpNetworkerFactory, MtpSingleInstanceService, AppRuntimeManager, ErrorService, qSync, $rootScope, $q, WebPushApiManager, TelegramMeWebService) {\n    var cachedNetworkers = {}\n    var cachedUploadNetworkers = {}\n    var cachedExportPromise = {}\n    var baseDcID = false\n\n    var telegramMeNotified\n\n    MtpSingleInstanceService.start()\n\n    Storage.get('dc').then(function (dcID) {\n      if (dcID) {\n        baseDcID = dcID\n      }\n    })\n\n    function telegramMeNotify (newValue) {\n      if (telegramMeNotified !== newValue) {\n        telegramMeNotified = newValue\n        TelegramMeWebService.setAuthorized(telegramMeNotified)\n      }\n    }\n\n    function mtpSetUserAuth (dcID, userAuth) {\n      var fullUserAuth = angular.extend({dcID: dcID}, userAuth)\n      Storage.set({\n        dc: dcID,\n        user_auth: fullUserAuth\n      })\n      telegramMeNotify(true)\n      $rootScope.$broadcast('user_auth', fullUserAuth)\n\n      baseDcID = dcID\n    }\n\n    function mtpLogOut () {\n      var storageKeys = []\n      for (var dcID = 1; dcID <= 5; dcID++) {\n        storageKeys.push('dc' + dcID + '_auth_key')\n      }\n      WebPushApiManager.forceUnsubscribe()\n      return Storage.get(storageKeys).then(function (storageResult) {\n        var logoutPromises = []\n        for (var i = 0; i < storageResult.length; i++) {\n          if (storageResult[i]) {\n            logoutPromises.push(mtpInvokeApi('auth.logOut', {}, {dcID: i + 1, ignoreErrors: true}))\n          }\n        }\n        return $q.all(logoutPromises).then(function () {\n          Storage.remove('dc', 'user_auth')\n          baseDcID = false\n          telegramMeNotify(false)\n          return mtpClearStorage()\n        }, function (error) {\n          storageKeys.push('dc', 'user_auth')\n          Storage.remove(storageKeys)\n          baseDcID = false\n          error.handled = true\n          telegramMeNotify(false)\n          return mtpClearStorage()\n        })\n      })\n    }\n\n    function mtpClearStorage () {\n      var saveKeys = ['user_auth', 't_user_auth', 'dc', 't_dc']\n      for (var dcID = 1; dcID <= 5; dcID++) {\n        saveKeys.push('dc' + dcID + '_auth_key')\n        saveKeys.push('t_dc' + dcID + '_auth_key')\n      }\n      Storage.noPrefix()\n      Storage.get(saveKeys).then(function (values) {\n        Storage.clear().then(function () {\n          var restoreObj = {}\n          angular.forEach(saveKeys, function (key, i) {\n            var value = values[i]\n            if (value !== false && value !== undefined) {\n              restoreObj[key] = value\n            }\n          })\n          Storage.noPrefix()\n          return Storage.set(restoreObj)\n        })\n      })\n    }\n\n    function mtpGetNetworker (dcID, options) {\n      options = options || {}\n\n      var cache = (options.fileUpload || options.fileDownload)\n        ? cachedUploadNetworkers\n        : cachedNetworkers\n      if (!dcID) {\n        throw new Exception('get Networker without dcID')\n      }\n\n      if (cache[dcID] !== undefined) {\n        return qSync.when(cache[dcID])\n      }\n\n      var akk = 'dc' + dcID + '_auth_key'\n      var ssk = 'dc' + dcID + '_server_salt'\n\n      return Storage.get(akk, ssk).then(function (result) {\n        if (cache[dcID] !== undefined) {\n          return cache[dcID]\n        }\n\n        var authKeyHex = result[0]\n        var serverSaltHex = result[1]\n        // console.log('ass', dcID, authKeyHex, serverSaltHex)\n        if (authKeyHex && authKeyHex.length == 512) {\n          if (!serverSaltHex || serverSaltHex.length != 16) {\n            serverSaltHex = 'AAAAAAAAAAAAAAAA'\n          }\n          var authKey = bytesFromHex(authKeyHex)\n          var serverSalt = bytesFromHex(serverSaltHex)\n\n          return cache[dcID] = MtpNetworkerFactory.getNetworker(dcID, authKey, serverSalt, options)\n        }\n\n        if (!options.createNetworker) {\n          return $q.reject({type: 'AUTH_KEY_EMPTY', code: 401})\n        }\n\n        return MtpAuthorizer.auth(dcID).then(function (auth) {\n          var storeObj = {}\n          storeObj[akk] = bytesToHex(auth.authKey)\n          storeObj[ssk] = bytesToHex(auth.serverSalt)\n          Storage.set(storeObj)\n\n          return cache[dcID] = MtpNetworkerFactory.getNetworker(dcID, auth.authKey, auth.serverSalt, options)\n        }, function (error) {\n          console.log('Get networker error', error, error.stack)\n          return $q.reject(error)\n        })\n      })\n    }\n\n    function mtpInvokeApi (method, params, options) {\n      options = options || {}\n\n      var deferred = $q.defer()\n      var rejectPromise = function (error) {\n          if (!error) {\n            error = {type: 'ERROR_EMPTY'}\n          } else if (!angular.isObject(error)) {\n            error = {message: error}\n          }\n          deferred.reject(error)\n          if (options.ignoreErrors) {\n            return\n          }\n\n          if (error.code == 406) {\n            error.handled = true\n          }\n\n          if (!options.noErrorBox) {\n            error.input = method\n            error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack\n            setTimeout(function () {\n              if (!error.handled) {\n                if (error.code == 401) {\n                  mtpLogOut()['finally'](function () {\n                    if (location.protocol == 'http:' &&\n                      !Config.Modes.http &&\n                      Config.App.domains.indexOf(location.hostname) != -1) {\n                      location.href = location.href.replace(/^http:/, 'https:')\n                    } else {\n                      location.hash = '/login'\n                      AppRuntimeManager.reload()\n                    }\n                  })\n                } else {\n                  ErrorService.show({error: error})\n                }\n                error.handled = true\n              }\n            }, 100)\n          }\n        },\n        dcID,\n        networkerPromise\n\n      var cachedNetworker\n      var stack = (new Error()).stack || 'empty stack'\n      var performRequest = function (networker) {\n        return (cachedNetworker = networker).wrapApiCall(method, params, options).then(\n          function (result) {\n            deferred.resolve(result)\n          },\n          function (error) {\n            console.error(dT(), 'Error', error.code, error.type, baseDcID, dcID)\n            if (error.code == 401 && baseDcID == dcID) {\n              Storage.remove('dc', 'user_auth')\n              telegramMeNotify(false)\n              rejectPromise(error)\n            }\n            else if (error.code == 401 && baseDcID && dcID != baseDcID) {\n              if (cachedExportPromise[dcID] === undefined) {\n                var exportDeferred = $q.defer()\n\n                mtpInvokeApi('auth.exportAuthorization', {dc_id: dcID}, {noErrorBox: true}).then(function (exportedAuth) {\n                  mtpInvokeApi('auth.importAuthorization', {\n                    id: exportedAuth.id,\n                    bytes: exportedAuth.bytes\n                  }, {dcID: dcID, noErrorBox: true}).then(function () {\n                    exportDeferred.resolve()\n                  }, function (e) {\n                    exportDeferred.reject(e)\n                  })\n                }, function (e) {\n                  exportDeferred.reject(e)\n                })\n\n                cachedExportPromise[dcID] = exportDeferred.promise\n              }\n\n              cachedExportPromise[dcID].then(function () {\n                (cachedNetworker = networker).wrapApiCall(method, params, options).then(function (result) {\n                  deferred.resolve(result)\n                }, rejectPromise)\n              }, rejectPromise)\n            }\n            else if (error.code == 303) {\n              var newDcID = error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2]\n              if (newDcID != dcID) {\n                if (options.dcID) {\n                  options.dcID = newDcID\n                } else {\n                  Storage.set({dc: baseDcID = newDcID})\n                }\n\n                mtpGetNetworker(newDcID, options).then(function (networker) {\n                  networker.wrapApiCall(method, params, options).then(function (result) {\n                    deferred.resolve(result)\n                  }, rejectPromise)\n                }, rejectPromise)\n              }\n            }\n            else if (!options.rawError && error.code == 420) {\n              var waitTime = error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 10\n              if (waitTime > (options.timeout || 60)) {\n                return rejectPromise(error)\n              }\n              setTimeout(function () {\n                performRequest(cachedNetworker)\n              }, waitTime * 1000)\n            }\n            else if (!options.rawError && (error.code == 500 || error.type == 'MSG_WAIT_FAILED')) {\n              var now = tsNow()\n              if (options.stopTime) {\n                if (now >= options.stopTime) {\n                  return rejectPromise(error)\n                }\n              } else {\n                options.stopTime = now + (options.timeout !== undefined ? options.timeout : 10) * 1000\n              }\n              options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1\n              setTimeout(function () {\n                performRequest(cachedNetworker)\n              }, options.waitTime * 1000)\n            }else {\n              rejectPromise(error)\n            }\n          })\n      }\n\n      if (dcID = (options.dcID || baseDcID)) {\n        mtpGetNetworker(dcID, options).then(performRequest, rejectPromise)\n      } else {\n        Storage.get('dc').then(function (baseDcID) {\n          mtpGetNetworker(dcID = baseDcID || 2, options).then(performRequest, rejectPromise)\n        })\n      }\n\n      return deferred.promise\n    }\n\n    function mtpGetUserID () {\n      return Storage.get('user_auth').then(function (auth) {\n        telegramMeNotify(auth && auth.id > 0 || false)\n        return auth.id || 0\n      })\n    }\n\n    function getBaseDcID () {\n      return baseDcID || false\n    }\n\n    return {\n      getBaseDcID: getBaseDcID,\n      getUserID: mtpGetUserID,\n      invokeApi: mtpInvokeApi,\n      getNetworker: mtpGetNetworker,\n      setUserAuth: mtpSetUserAuth,\n      logOut: mtpLogOut\n    }\n  })\n\n  .factory('MtpApiFileManager', function (MtpApiManager, $q, qSync, FileManager, IdbFileStorage, TmpfsFileStorage, MemoryFileStorage, WebpManager) {\n    var cachedFs = false\n    var cachedFsPromise = false\n    var cachedSavePromises = {}\n    var cachedDownloadPromises = {}\n    var cachedDownloads = {}\n\n    var downloadPulls = {}\n    var downloadActives = {}\n\n    function downloadRequest (dcID, cb, activeDelta) {\n      if (downloadPulls[dcID] === undefined) {\n        downloadPulls[dcID] = []\n        downloadActives[dcID] = 0\n      }\n      var downloadPull = downloadPulls[dcID]\n      var deferred = $q.defer()\n      downloadPull.push({cb: cb, deferred: deferred, activeDelta: activeDelta})\n      setZeroTimeout(function () {\n        downloadCheck(dcID)\n      })\n\n      return deferred.promise\n    }\n\n    var index = 0\n\n    function downloadCheck (dcID) {\n      var downloadPull = downloadPulls[dcID]\n      var downloadLimit = dcID == 'upload' ? 11 : 5\n\n      if (downloadActives[dcID] >= downloadLimit || !downloadPull || !downloadPull.length) {\n        return false\n      }\n\n      var data = downloadPull.shift()\n      var activeDelta = data.activeDelta || 1\n\n      downloadActives[dcID] += activeDelta\n\n      var a = index++\n      data.cb()\n        .then(function (result) {\n          downloadActives[dcID] -= activeDelta\n          downloadCheck(dcID)\n\n          data.deferred.resolve(result)\n        }, function (error) {\n          downloadActives[dcID] -= activeDelta\n          downloadCheck(dcID)\n\n          data.deferred.reject(error)\n        })\n    }\n\n    function getFileName (location) {\n      switch (location._) {\n        case 'inputDocumentFileLocation':\n          var fileName = (location.file_name || '').split('.', 2)\n          var ext = fileName[1] || ''\n          if (location.sticker && !WebpManager.isWebpSupported()) {\n            ext += '.png'\n          }\n          var versionPart = location.version ? ('v' + location.version) : ''\n          return fileName[0] + '_' + location.id + versionPart + '.' + ext\n\n        default:\n          if (!location.volume_id) {\n            console.trace('Empty location', location)\n          }\n          var ext = 'jpg'\n          if (location.sticker) {\n            ext = WebpManager.isWebpSupported() ? 'webp' : 'png'\n          }\n          return location.volume_id + '_' + location.local_id + '_' + location.secret + '.' + ext\n      }\n    }\n\n    function getTempFileName (file) {\n      var size = file.size || -1\n      var random = nextRandomInt(0xFFFFFFFF)\n      return '_temp' + random + '_' + size\n    }\n\n    function getCachedFile (location) {\n      if (!location) {\n        return false\n      }\n      var fileName = getFileName(location)\n\n      return cachedDownloads[fileName] || false\n    }\n\n    function getFileStorage () {\n      if (!Config.Modes.memory_only) {\n        if (TmpfsFileStorage.isAvailable()) {\n          return TmpfsFileStorage\n        }\n        if (IdbFileStorage.isAvailable()) {\n          return IdbFileStorage\n        }\n      }\n      return MemoryFileStorage\n    }\n\n    function saveSmallFile (location, bytes) {\n      var fileName = getFileName(location)\n      var mimeType = 'image/jpeg'\n\n      if (!cachedSavePromises[fileName]) {\n        cachedSavePromises[fileName] = getFileStorage().saveFile(fileName, bytes).then(function (blob) {\n          return cachedDownloads[fileName] = blob\n        }, function (error) {\n          delete cachedSavePromises[fileName]\n        })\n      }\n      return cachedSavePromises[fileName]\n    }\n\n    function downloadSmallFile (location) {\n      if (!FileManager.isAvailable()) {\n        return $q.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'})\n      }\n      var fileName = getFileName(location)\n      var mimeType = location.sticker ? 'image/webp' : 'image/jpeg'\n      var cachedPromise = cachedSavePromises[fileName] || cachedDownloadPromises[fileName]\n\n      if (cachedPromise) {\n        return cachedPromise\n      }\n\n      var fileStorage = getFileStorage()\n\n      return cachedDownloadPromises[fileName] = fileStorage.getFile(fileName).then(function (blob) {\n        return cachedDownloads[fileName] = blob\n      }, function () {\n        var downloadPromise = downloadRequest(location.dc_id, function () {\n          var inputLocation = location\n          if (!inputLocation._ || inputLocation._ == 'fileLocation') {\n            inputLocation = angular.extend({}, location, {_: 'inputFileLocation'})\n          }\n          // console.log('next small promise')\n          return MtpApiManager.invokeApi('upload.getFile', {\n            location: inputLocation,\n            offset: 0,\n            limit: 1024 * 1024\n          }, {\n            dcID: location.dc_id,\n            fileDownload: true,\n            createNetworker: true,\n            noErrorBox: true\n          })\n        })\n\n        var processDownloaded = function (bytes) {\n          if (!location.sticker || WebpManager.isWebpSupported()) {\n            return qSync.when(bytes)\n          }\n          return WebpManager.getPngBlobFromWebp(bytes)\n        }\n\n        return fileStorage.getFileWriter(fileName, mimeType).then(function (fileWriter) {\n          return downloadPromise.then(function (result) {\n            return processDownloaded(result.bytes).then(function (proccessedResult) {\n              return FileManager.write(fileWriter, proccessedResult).then(function () {\n                return cachedDownloads[fileName] = fileWriter.finalize()\n              })\n            })\n          })\n        })\n      })\n    }\n\n    function getDownloadedFile (location, size) {\n      var fileStorage = getFileStorage()\n      var fileName = getFileName(location)\n\n      return fileStorage.getFile(fileName, size)\n    }\n\n    function downloadFile (dcID, location, size, options) {\n      if (!FileManager.isAvailable()) {\n        return $q.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'})\n      }\n\n      options = options || {}\n\n      var processSticker = false\n      if (location.sticker && !WebpManager.isWebpSupported()) {\n        if (options.toFileEntry || size > 524288) {\n          delete location.sticker\n        } else {\n          processSticker = true\n          options.mime = 'image/png'\n        }\n      }\n\n      // console.log(dT(), 'Dload file', dcID, location, size)\n      var fileName = getFileName(location)\n      var toFileEntry = options.toFileEntry || null\n      var cachedPromise = cachedSavePromises[fileName] || cachedDownloadPromises[fileName]\n\n      var fileStorage = getFileStorage()\n\n      // console.log(dT(), 'fs', fileStorage.name, fileName, cachedPromise)\n\n      if (cachedPromise) {\n        if (toFileEntry) {\n          return cachedPromise.then(function (blob) {\n            return FileManager.copy(blob, toFileEntry)\n          })\n        }\n        return cachedPromise\n      }\n\n      var deferred = $q.defer()\n      var canceled = false\n      var resolved = false\n      var mimeType = options.mime || 'image/jpeg',\n        cacheFileWriter\n      var errorHandler = function (error) {\n        deferred.reject(error)\n        errorHandler = angular.noop\n        if (cacheFileWriter &&\n          (!error || error.type != 'DOWNLOAD_CANCELED')) {\n          cacheFileWriter.truncate(0)\n        }\n      }\n\n      fileStorage.getFile(fileName, size).then(function (blob) {\n        if (toFileEntry) {\n          FileManager.copy(blob, toFileEntry).then(function () {\n            deferred.resolve()\n          }, errorHandler)\n        } else {\n          deferred.resolve(cachedDownloads[fileName] = blob)\n        }\n      }, function () {\n        var fileWriterPromise = toFileEntry ? FileManager.getFileWriter(toFileEntry) : fileStorage.getFileWriter(fileName, mimeType)\n\n        var processDownloaded = function (bytes) {\n          if (!processSticker) {\n            return qSync.when(bytes)\n          }\n          return WebpManager.getPngBlobFromWebp(bytes)\n        }\n\n        fileWriterPromise.then(function (fileWriter) {\n          cacheFileWriter = fileWriter\n          var limit = 524288,\n            offset\n          var startOffset = 0\n          var writeFilePromise = $q.when(),\n            writeFileDeferred\n          if (fileWriter.length) {\n            startOffset = fileWriter.length\n            if (startOffset >= size) {\n              if (toFileEntry) {\n                deferred.resolve()\n              } else {\n                deferred.resolve(cachedDownloads[fileName] = fileWriter.finalize())\n              }\n              return\n            }\n            fileWriter.seek(startOffset)\n            deferred.notify({done: startOffset, total: size})\n          }\n          for (offset = startOffset; offset < size; offset += limit) {\n            writeFileDeferred = $q.defer()\n            ;(function (isFinal, offset, writeFileDeferred, writeFilePromise) {\n              return downloadRequest(dcID, function () {\n                if (canceled) {\n                  return $q.when()\n                }\n                return MtpApiManager.invokeApi('upload.getFile', {\n                  location: location,\n                  offset: offset,\n                  limit: limit\n                }, {\n                  dcID: dcID,\n                  fileDownload: true,\n                  singleInRequest: window.safari !== undefined,\n                  createNetworker: true\n                })\n              }, 2).then(function (result) {\n                writeFilePromise.then(function () {\n                  if (canceled) {\n                    return $q.when()\n                  }\n                  return processDownloaded(result.bytes).then(function (processedResult) {\n                    return FileManager.write(fileWriter, processedResult).then(function () {\n                      writeFileDeferred.resolve()\n                    }, errorHandler).then(function () {\n                      if (isFinal) {\n                        resolved = true\n                        if (toFileEntry) {\n                          deferred.resolve()\n                        } else {\n                          deferred.resolve(cachedDownloads[fileName] = fileWriter.finalize())\n                        }\n                      } else {\n                        deferred.notify({done: offset + limit, total: size})\n                      }\n                    })\n                  })\n                })\n              })\n            })(offset + limit >= size, offset, writeFileDeferred, writeFilePromise)\n            writeFilePromise = writeFileDeferred.promise\n          }\n        })\n      })\n\n      deferred.promise.cancel = function () {\n        if (!canceled && !resolved) {\n          canceled = true\n          delete cachedDownloadPromises[fileName]\n          errorHandler({type: 'DOWNLOAD_CANCELED'})\n        }\n      }\n\n      if (!toFileEntry) {\n        cachedDownloadPromises[fileName] = deferred.promise\n      }\n\n      return deferred.promise\n    }\n\n    function uploadFile (file) {\n      var fileSize = file.size,\n        isBigFile = fileSize >= 10485760,\n        canceled = false,\n        resolved = false,\n        doneParts = 0,\n        partSize = 262144, // 256 Kb\n        activeDelta = 2\n\n      if (fileSize > 67108864) {\n        partSize = 524288\n        activeDelta = 4\n      }\n      else if (fileSize < 102400) {\n        partSize = 32768\n        activeDelta = 1\n      }\n      var totalParts = Math.ceil(fileSize / partSize)\n\n      if (totalParts > 3000) {\n        return $q.reject({type: 'FILE_TOO_BIG'})\n      }\n\n      var fileID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)]\n      var deferred = $q.defer()\n      var errorHandler = function (error) {\n          // console.error('Up Error', error)\n          deferred.reject(error)\n          canceled = true\n          errorHandler = angular.noop\n        },\n        part = 0,\n        offset,\n        resultInputFile = {\n          _: isBigFile ? 'inputFileBig' : 'inputFile',\n          id: fileID,\n          parts: totalParts,\n          name: file.name,\n          md5_checksum: ''\n      }\n\n      for (offset = 0; offset < fileSize; offset += partSize) {\n        (function (offset, part) {\n          downloadRequest('upload', function () {\n            var uploadDeferred = $q.defer()\n\n            var reader = new FileReader()\n            var blob = file.slice(offset, offset + partSize)\n\n            reader.onloadend = function (e) {\n              if (canceled) {\n                uploadDeferred.reject()\n                return\n              }\n              if (e.target.readyState != FileReader.DONE) {\n                return\n              }\n              MtpApiManager.invokeApi(isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart', {\n                file_id: fileID,\n                file_part: part,\n                file_total_parts: totalParts,\n                bytes: e.target.result\n              }, {\n                startMaxLength: partSize + 256,\n                fileUpload: true,\n                singleInRequest: true\n              }).then(function (result) {\n                doneParts++\n                uploadDeferred.resolve()\n                if (doneParts >= totalParts) {\n                  deferred.resolve(resultInputFile)\n                  resolved = true\n                } else {\n                  console.log(dT(), 'Progress', doneParts * partSize / fileSize)\n                  deferred.notify({done: doneParts * partSize, total: fileSize})\n                }\n              }, errorHandler)\n            }\n\n            reader.readAsArrayBuffer(blob)\n\n            return uploadDeferred.promise\n          }, activeDelta)\n        })(offset, part++)\n      }\n\n      deferred.promise.cancel = function () {\n        console.log('cancel upload', canceled, resolved)\n        if (!canceled && !resolved) {\n          canceled = true\n          errorHandler({type: 'UPLOAD_CANCELED'})\n        }\n      }\n\n      return deferred.promise\n    }\n\n    return {\n      getCachedFile: getCachedFile,\n      getDownloadedFile: getDownloadedFile,\n      downloadFile: downloadFile,\n      downloadSmallFile: downloadSmallFile,\n      saveSmallFile: saveSmallFile,\n      uploadFile: uploadFile\n    }\n  })\n\n  .service('MtpSingleInstanceService', function (_, $rootScope, $compile, $timeout, $interval, $modalStack, Storage, AppRuntimeManager, IdleManager, ErrorService, MtpNetworkerFactory) {\n    var instanceID = nextRandomInt(0xFFFFFFFF)\n    var started = false\n    var masterInstance = false\n    var deactivatePromise = false\n    var deactivated = false\n    var initial = false\n\n    function start () {\n      if (!started && !Config.Navigator.mobile && !Config.Modes.packed) {\n        started = true\n\n        IdleManager.start()\n\n        $rootScope.$watch('idle.isIDLE', checkInstance)\n        $interval(checkInstance, 5000)\n        checkInstance()\n\n        try {\n          $($window).on('beforeunload', clearInstance)\n        } catch (e) {}\n      }\n    }\n\n    function clearInstance () {\n      if (masterInstance && !deactivated) {\n        console.warn('clear master instance');\n        Storage.remove('xt_instance')\n      }\n    }\n\n    function deactivateInstance () {\n      if (masterInstance || deactivated) {\n        return false\n      }\n      console.log(dT(), 'deactivate')\n      deactivatePromise = false\n      deactivated = true\n      clearInstance()\n      $modalStack.dismissAll()\n\n      document.title = _('inactive_tab_title_raw')\n\n      var inactivePageCompiled = $compile('<ng-include src=\"\\'partials/desktop/inactive.html\\'\"></ng-include>')\n\n      var scope = $rootScope.$new(true)\n      scope.close = function () {\n        AppRuntimeManager.close()\n      }\n      scope.reload = function () {\n        AppRuntimeManager.reload()\n      }\n      inactivePageCompiled(scope, function (clonedElement) {\n        $('.page_wrap').hide()\n        $(clonedElement).appendTo($('body'))\n      })\n      $rootScope.idle.deactivated = true\n    }\n\n    function checkInstance () {\n      if (deactivated) {\n        return false\n      }\n      var time = tsNow()\n      var idle = $rootScope.idle && $rootScope.idle.isIDLE\n      var newInstance = {id: instanceID, idle: idle, time: time}\n\n      Storage.get('xt_instance').then(function (curInstance) {\n        // console.log(dT(), 'check instance', newInstance, curInstance)\n        if (!idle ||\n            !curInstance ||\n            curInstance.id == instanceID ||\n            curInstance.time < time - 20000) {\n          Storage.set({xt_instance: newInstance})\n          if (!masterInstance) {\n            MtpNetworkerFactory.startAll()\n            if (!initial) {\n              initial = true\n            } else {\n              console.warn(dT(), 'now master instance', newInstance)\n            }\n            masterInstance = true\n          }\n          if (deactivatePromise) {\n            $timeout.cancel(deactivatePromise)\n            deactivatePromise = false\n          }\n        } else {\n          if (masterInstance) {\n            MtpNetworkerFactory.stopAll()\n            console.warn(dT(), 'now idle instance', newInstance)\n            if (!deactivatePromise) {\n              deactivatePromise = $timeout(deactivateInstance, 30000)\n            }\n            masterInstance = false\n          }\n        }\n      })\n    }\n\n    return {\n      start: start\n    }\n  })\n"
  },
  {
    "path": "app/js/lib/ng_utils.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nangular.module('izhukov.utils', [])\n\n  .provider('Storage', function () {\n    this.setPrefix = function (newPrefix) {\n      ConfigStorage.prefix(newPrefix)\n    }\n\n    this.$get = ['$q', function ($q) {\n      var methods = {}\n      angular.forEach(['get', 'set', 'remove', 'clear'], function (methodName) {\n        methods[methodName] = function () {\n          var deferred = $q.defer()\n          var args = Array.prototype.slice.call(arguments)\n\n          args.push(function (result) {\n            deferred.resolve(result)\n          })\n          ConfigStorage[methodName].apply(ConfigStorage, args)\n\n          return deferred.promise\n        }\n      })\n\n      methods.noPrefix = function () {\n        ConfigStorage.noPrefix()\n      }\n\n      return methods\n    }]\n  })\n\n  .service('qSync', function () {\n    return {\n      when: function (result) {\n        return {then: function (cb) {\n            return cb(result)\n        }}\n      },\n      reject: function (result) {\n        return {then: function (cb, badcb) {\n            if (badcb) {\n              return badcb(result)\n            }\n        }}\n      }\n    }\n  })\n\n  .service('FileManager', function ($window, $q, $timeout, qSync) {\n    $window.URL = $window.URL || $window.webkitURL\n    $window.BlobBuilder = $window.BlobBuilder || $window.WebKitBlobBuilder || $window.MozBlobBuilder\n    var isSafari = 'safari' in window\n    var safariVersion = parseFloat(isSafari && (navigator.userAgent.match(/Version\\/(\\d+\\.\\d+).* Safari/) || [])[1])\n    var safariWithDownload = isSafari && safariVersion >= 11.0\n    var buggyUnknownBlob = isSafari && !safariWithDownload\n\n    var blobSupported = true\n\n    try {\n      blobConstruct([], '')\n    } catch (e) {\n      blobSupported = false\n    }\n\n    function isBlobAvailable () {\n      return blobSupported\n    }\n\n    function fileCopyTo (fromFileEntry, toFileEntry) {\n      return getFileWriter(toFileEntry).then(function (fileWriter) {\n        return fileWriteData(fileWriter, fromFileEntry).then(function () {\n          return fileWriter\n        }, function (error) {\n          try {\n            fileWriter.truncate(0)\n          } catch (e) {}\n          return $q.reject(error)\n        })\n      })\n    }\n\n    function fileWriteData (fileWriter, bytes) {\n      var deferred = $q.defer()\n\n      fileWriter.onwriteend = function (e) {\n        deferred.resolve()\n      }\n      fileWriter.onerror = function (e) {\n        deferred.reject(e)\n      }\n\n      if (bytes.file) {\n        bytes.file(function (file) {\n          fileWriter.write(file)\n        }, function (error) {\n          deferred.reject(error)\n        })\n      }\n      else if (bytes instanceof Blob) { // is file bytes\n        fileWriter.write(bytes)\n      }else {\n        try {\n          var blob = blobConstruct([bytesToArrayBuffer(bytes)])\n          fileWriter.write(blob)\n        } catch (e) {\n          deferred.reject(e)\n        }\n      }\n\n      return deferred.promise\n    }\n\n    function chooseSaveFile (fileName, ext, mimeType) {\n      if (!$window.chrome || !chrome.fileSystem || !chrome.fileSystem.chooseEntry) {\n        return qSync.reject()\n      }\n      var deferred = $q.defer()\n\n      chrome.fileSystem.chooseEntry({\n        type: 'saveFile',\n        suggestedName: fileName,\n        accepts: [{\n          mimeTypes: [mimeType],\n          extensions: [ext]\n        }]\n      }, function (writableFileEntry) {\n        deferred.resolve(writableFileEntry)\n      })\n\n      return deferred.promise\n    }\n\n    function getFileWriter (fileEntry) {\n      var deferred = $q.defer()\n\n      fileEntry.createWriter(function (fileWriter) {\n        deferred.resolve(fileWriter)\n      }, function (error) {\n        deferred.reject(error)\n      })\n\n      return deferred.promise\n    }\n\n    function getFakeFileWriter (mimeType, saveFileCallback) {\n      var blobParts = []\n      var fakeFileWriter = {\n        write: function (blob) {\n          if (!blobSupported) {\n            if (fakeFileWriter.onerror) {\n              fakeFileWriter.onerror(new Error('Blob not supported by browser'))\n            }\n            return false\n          }\n          blobParts.push(blob)\n          setZeroTimeout(function () {\n            if (fakeFileWriter.onwriteend) {\n              fakeFileWriter.onwriteend()\n            }\n          })\n        },\n        truncate: function () {\n          blobParts = []\n        },\n        finalize: function () {\n          var blob = blobConstruct(blobParts, mimeType)\n          if (saveFileCallback) {\n            saveFileCallback(blob)\n          }\n          return blob\n        }\n      }\n\n      return fakeFileWriter\n    }\n\n    function getUrl (fileData, mimeType) {\n      var safeMimeType = blobSafeMimeType(mimeType)\n      // console.log(dT(), 'get url', fileData, mimeType, fileData.toURL !== undefined, fileData instanceof Blob)\n      if (fileData.toURL !== undefined) {\n        return fileData.toURL(safeMimeType)\n      }\n      if (fileData instanceof Blob) {\n        return URL.createObjectURL(fileData)\n      }\n      return 'data:' + safeMimeType + ';base64,' + bytesToBase64(fileData)\n    }\n\n    function getByteArray (fileData) {\n      if (fileData instanceof Blob) {\n        var deferred = $q.defer()\n        try {\n          var reader = new FileReader()\n          reader.onloadend = function (e) {\n            deferred.resolve(new Uint8Array(e.target.result))\n          }\n          reader.onerror = function (e) {\n            deferred.reject(e)\n          }\n          reader.readAsArrayBuffer(fileData)\n\n          return deferred.promise\n        } catch (e) {\n          return $q.reject(e)\n        }\n      }\n      else if (fileData.file) {\n        var deferred = $q.defer()\n        fileData.file(function (blob) {\n          getByteArray(blob).then(function (result) {\n            deferred.resolve(result)\n          }, function (error) {\n            deferred.reject(error)\n          })\n        }, function (error) {\n          deferred.reject(error)\n        })\n        return deferred.promise\n      }\n      return $q.when(fileData)\n    }\n\n    function getDataUrl (blob) {\n      var deferred\n      try {\n        var reader = new FileReader()\n        reader.onloadend = function () {\n          deferred.resolve(reader.result)\n        }\n        reader.readAsDataURL(blob)\n      } catch (e) {\n        return $q.reject(e)\n      }\n\n      deferred = $q.defer()\n\n      return deferred.promise\n    }\n\n    function getFileCorrectUrl (blob, mimeType) {\n      if (buggyUnknownBlob && blob instanceof Blob) {\n        var mimeType = blob.type || blob.mimeType || mimeType || ''\n        if (!mimeType.match(/image\\/(jpeg|gif|png|bmp)|video\\/quicktime/)) {\n          return getDataUrl(blob)\n        }\n      }\n      return qSync.when(getUrl(blob, mimeType))\n    }\n\n    function downloadFile (blob, mimeType, fileName) {\n      if (window.navigator && navigator.msSaveBlob !== undefined) {\n        window.navigator.msSaveBlob(blob, fileName)\n        return false\n      }\n\n      if (window.navigator && navigator.getDeviceStorage) {\n        var storageName = 'sdcard'\n        var subdir = 'telegram/'\n        switch (mimeType.split('/')[0]) {\n          case 'video':\n            storageName = 'videos'\n            break\n          case 'audio':\n            storageName = 'music'\n            break\n          case 'image':\n            storageName = 'pictures'\n            break\n        }\n        var deviceStorage = navigator.getDeviceStorage(storageName)\n\n        var request = deviceStorage.addNamed(blob, subdir + fileName)\n\n        request.onsuccess = function () {\n          console.log('Device storage save result', this.result)\n        }\n        request.onerror = function () {}\n        return\n      }\n\n      var popup = false\n      if (isSafari && !safariWithDownload) {\n        popup = window.open()\n      }\n\n      getFileCorrectUrl(blob, mimeType).then(function (url) {\n        if (popup) {\n          try {\n            popup.location.href = url\n            return\n          } catch (e) {}\n        }\n        var anchor = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')\n        anchor.href = url\n        if (!safariWithDownload) {\n          anchor.target = '_blank'\n        }\n        anchor.download = fileName\n        if (anchor.dataset) {\n          anchor.dataset.downloadurl = ['video/quicktime', fileName, url].join(':')\n        }\n        $(anchor).css({position: 'absolute', top: 1, left: 1}).appendTo('body')\n\n        try {\n          var clickEvent = document.createEvent('MouseEvents')\n          clickEvent.initMouseEvent(\n            'click', true, false, window, 0, 0, 0, 0, 0\n            , false, false, false, false, 0, null\n          )\n          anchor.dispatchEvent(clickEvent)\n        } catch (e) {\n          console.error('Download click error', e)\n          try {\n            anchor[0].click()\n          } catch (e) {\n            window.open(url, '_blank')\n          }\n        }\n        $timeout(function () {\n          $(anchor).remove()\n        }, 100)\n      })\n    }\n\n    return {\n      isAvailable: isBlobAvailable,\n      copy: fileCopyTo,\n      write: fileWriteData,\n      getFileWriter: getFileWriter,\n      getFakeFileWriter: getFakeFileWriter,\n      chooseSave: chooseSaveFile,\n      getUrl: getUrl,\n      getDataUrl: getDataUrl,\n      getByteArray: getByteArray,\n      getFileCorrectUrl: getFileCorrectUrl,\n      download: downloadFile\n    }\n  })\n\n  .service('IdbFileStorage', function ($q, $window, FileManager) {\n    $window.indexedDB = $window.indexedDB || $window.webkitIndexedDB || $window.mozIndexedDB || $window.OIndexedDB || $window.msIndexedDB\n    $window.IDBTransaction = $window.IDBTransaction || $window.webkitIDBTransaction || $window.OIDBTransaction || $window.msIDBTransaction\n\n    var dbName = 'cachedFiles'\n    var dbStoreName = 'files'\n    var dbVersion = 2\n    var openDbPromise\n    var storageIsAvailable = $window.indexedDB !== undefined &&\n      $window.IDBTransaction !== undefined\n\n    // IndexedDB is REALLY slow without blob support in Safari 8, no point in it\n    if (storageIsAvailable &&\n      navigator.userAgent.indexOf('Safari') != -1 &&\n      navigator.userAgent.indexOf('Chrome') == -1 &&\n      navigator.userAgent.match(/Version\\/[678]/)\n    ) {\n      storageIsAvailable = false\n    }\n\n    var storeBlobsAvailable = storageIsAvailable || false\n\n    function isAvailable () {\n      return storageIsAvailable\n    }\n\n    function openDatabase () {\n      if (openDbPromise) {\n        return openDbPromise\n      }\n\n      try {\n        var request = indexedDB.open(dbName, dbVersion)\n        var deferred = $q.defer()\n        var createObjectStore = function (db) {\n          db.createObjectStore(dbStoreName)\n        }\n        if (!request) {\n          throw new Exception()\n        }\n      } catch (error) {\n        console.error('error opening db', error.message)\n        storageIsAvailable = false\n        return $q.reject(error)\n      }\n\n      var finished = false\n      setTimeout(function () {\n        if (!finished) {\n          request.onerror({type: 'IDB_CREATE_TIMEOUT'})\n        }\n      }, 3000)\n\n      request.onsuccess = function (event) {\n        finished = true\n        var db = request.result\n\n        db.onerror = function (error) {\n          storageIsAvailable = false\n          console.error('Error creating/accessing IndexedDB database', error)\n          deferred.reject(error)\n        }\n\n        deferred.resolve(db)\n      }\n\n      request.onerror = function (event) {\n        finished = true\n        storageIsAvailable = false\n        console.error('Error creating/accessing IndexedDB database', event)\n        deferred.reject(event)\n      }\n\n      request.onupgradeneeded = function (event) {\n        finished = true\n        console.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion)\n        var db = event.target.result\n        if (event.oldVersion == 1) {\n          db.deleteObjectStore(dbStoreName)\n        }\n        createObjectStore(db)\n      }\n\n      return openDbPromise = deferred.promise\n    }\n\n    function saveFile (fileName, blob) {\n      return openDatabase().then(function (db) {\n        if (!storeBlobsAvailable) {\n          return saveFileBase64(db, fileName, blob)\n        }\n\n        if (!(blob instanceof Blob)) {\n          blob = blobConstruct([blob])\n        }\n\n        try {\n          var objectStore = db.transaction([dbStoreName], IDBTransaction.READ_WRITE || 'readwrite').objectStore(dbStoreName)\n          var request = objectStore.put(blob, fileName)\n        } catch (error) {\n          if (storeBlobsAvailable) {\n            storeBlobsAvailable = false\n            return saveFileBase64(db, fileName, blob)\n          }\n          storageIsAvailable = false\n          return $q.reject(error)\n        }\n\n        var deferred = $q.defer()\n\n        request.onsuccess = function (event) {\n          deferred.resolve(blob)\n        }\n\n        request.onerror = function (error) {\n          deferred.reject(error)\n        }\n\n        return deferred.promise\n      })\n    }\n\n    function saveFileBase64 (db, fileName, blob) {\n      if (getBlobSize(blob) > 10 * 1024 * 1024) {\n        return $q.reject()\n      }\n      if (!(blob instanceof Blob)) {\n        var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg')\n        var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob)\n        return storagePutB64String(db, fileName, address).then(function () {\n          return blob\n        })\n      }\n\n      try {\n        var reader = new FileReader()\n      } catch (e) {\n        storageIsAvailable = false\n        return $q.reject()\n      }\n\n      var deferred = $q.defer()\n\n      reader.onloadend = function () {\n        storagePutB64String(db, fileName, reader.result).then(function () {\n          deferred.resolve(blob)\n        }, function (error) {\n          deferred.reject(error)\n        })\n      }\n\n      reader.onerror = function (error) {\n        deferred.reject(error)\n      }\n\n      try {\n        reader.readAsDataURL(blob)\n      } catch (e) {\n        storageIsAvailable = false\n        return $q.reject()\n      }\n\n      return deferred.promise\n    }\n\n    function storagePutB64String (db, fileName, b64string) {\n      try {\n        var objectStore = db.transaction([dbStoreName], IDBTransaction.READ_WRITE || 'readwrite').objectStore(dbStoreName)\n        var request = objectStore.put(b64string, fileName)\n      } catch (error) {\n        storageIsAvailable = false\n        return $q.reject(error)\n      }\n\n      var deferred = $q.defer()\n\n      request.onsuccess = function (event) {\n        deferred.resolve()\n      }\n\n      request.onerror = function (error) {\n        deferred.reject(error)\n      }\n\n      return deferred.promise\n    }\n\n    function getBlobSize (blob) {\n      return blob.size || blob.byteLength || blob.length\n    }\n\n    function getFile (fileName) {\n      return openDatabase().then(function (db) {\n        var deferred = $q.defer()\n        var objectStore = db.transaction([dbStoreName], IDBTransaction.READ || 'readonly').objectStore(dbStoreName)\n        var request = objectStore.get(fileName)\n\n        request.onsuccess = function (event) {\n          var result = event.target.result\n          if (result === undefined) {\n            deferred.reject()\n          } else if (typeof result === 'string' &&\n            result.substr(0, 5) === 'data:') {\n            deferred.resolve(dataUrlToBlob(result))\n          } else {\n            deferred.resolve(result)\n          }\n        }\n\n        request.onerror = function (error) {\n          deferred.reject(error)\n        }\n\n        return deferred.promise\n      })\n    }\n\n    function getFileWriter (fileName, mimeType) {\n      var fakeWriter = FileManager.getFakeFileWriter(mimeType, function (blob) {\n        saveFile(fileName, blob)\n      })\n      return $q.when(fakeWriter)\n    }\n\n    openDatabase()\n\n    return {\n      name: 'IndexedDB',\n      isAvailable: isAvailable,\n      saveFile: saveFile,\n      getFile: getFile,\n      getFileWriter: getFileWriter\n    }\n  })\n\n  .service('TmpfsFileStorage', function ($q, $window, FileManager) {\n    $window.requestFileSystem = $window.requestFileSystem || $window.webkitRequestFileSystem\n\n    var reqFsPromise,\n      fileSystem\n    var storageIsAvailable = $window.requestFileSystem !== undefined\n\n    function requestFS () {\n      if (reqFsPromise) {\n        return reqFsPromise\n      }\n\n      if (!$window.requestFileSystem) {\n        return reqFsPromise = $q.reject({type: 'FS_BROWSER_UNSUPPORTED', description: 'requestFileSystem not present'})\n      }\n\n      var deferred = $q.defer()\n\n      $window.requestFileSystem($window.TEMPORARY, 500 * 1024 * 1024, function (fs) {\n        cachedFs = fs\n        deferred.resolve()\n      }, function (e) {\n        storageIsAvailable = false\n        deferred.reject(e)\n      })\n\n      return reqFsPromise = deferred.promise\n    }\n\n    function isAvailable () {\n      return Config.allow_tmpfs && storageIsAvailable\n    }\n\n    function getFile (fileName, size) {\n      size = size || 1\n      return requestFS().then(function () {\n        // console.log(dT(), 'get file', fileName)\n        var deferred = $q.defer()\n        cachedFs.root.getFile(fileName, {create: false}, function (fileEntry) {\n          fileEntry.file(function (file) {\n            // console.log(dT(), 'aa', file)\n            if (file.size >= size) {\n              deferred.resolve(fileEntry)\n            } else {\n              deferred.reject(new Error('FILE_NOT_FOUND'))\n            }\n          }, function (error) {\n            console.log(dT(), 'error', error)\n            deferred.reject(error)\n          })\n        }, function () {\n          deferred.reject(new Error('FILE_NOT_FOUND'))\n        })\n        return deferred.promise\n      })\n    }\n\n    function saveFile (fileName, blob) {\n      return getFileWriter(fileName).then(function (fileWriter) {\n        return FileManager.write(fileWriter, blob).then(function () {\n          return fileWriter.finalize()\n        })\n      })\n    }\n\n    function getFileWriter (fileName) {\n      // console.log(dT(), 'get file writer', fileName)\n      return requestFS().then(function () {\n        var deferred = $q.defer()\n        cachedFs.root.getFile(fileName, {create: true}, function (fileEntry) {\n          FileManager.getFileWriter(fileEntry).then(function (fileWriter) {\n            fileWriter.finalize = function () {\n              return fileEntry\n            }\n            deferred.resolve(fileWriter)\n          }, function (error) {\n            storageIsAvailable = false\n            deferred.reject(error)\n          })\n        }, function (error) {\n          storageIsAvailable = false\n          deferred.reject(error)\n        })\n\n        return deferred.promise\n      })\n    }\n\n    requestFS()\n\n    return {\n      name: 'TmpFS',\n      isAvailable: isAvailable,\n      saveFile: saveFile,\n      getFile: getFile,\n      getFileWriter: getFileWriter\n    }\n  })\n\n  .service('MemoryFileStorage', function ($q, FileManager) {\n    var storage = {}\n\n    function isAvailable () {\n      return true\n    }\n\n    function getFile (fileName, size) {\n      if (storage[fileName]) {\n        return $q.when(storage[fileName])\n      }\n      return $q.reject(new Error('FILE_NOT_FOUND'))\n    }\n\n    function saveFile (fileName, blob) {\n      return $q.when(storage[fileName] = blob)\n    }\n\n    function getFileWriter (fileName, mimeType) {\n      var fakeWriter = FileManager.getFakeFileWriter(mimeType, function (blob) {\n        saveFile(fileName, blob)\n      })\n      return $q.when(fakeWriter)\n    }\n\n    return {\n      name: 'Memory',\n      isAvailable: isAvailable,\n      saveFile: saveFile,\n      getFile: getFile,\n      getFileWriter: getFileWriter\n    }\n  })\n\n  .service('WebpManager', function (qSync, $q) {\n    var nativeWebpSupport = false\n\n    var image = new Image()\n    image.onload = function () {\n      nativeWebpSupport = this.width === 2 && this.height === 1\n    }\n    image.onerror = function () {\n      nativeWebpSupport = false\n    }\n    image.src = 'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoCAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA=='\n\n    var canvas\n    var context\n\n    function getCanvasFromWebp (data) {\n      var start = tsNow()\n\n      var decoder = new WebPDecoder()\n\n      var config = decoder.WebPDecoderConfig\n      var buffer = config.j || config.output\n      var bitstream = config.input\n\n      if (!decoder.WebPInitDecoderConfig(config)) {\n        console.error('[webpjs] Library version mismatch!')\n        return false\n      }\n\n      // console.log('[webpjs] status code', decoder.VP8StatusCode)\n      var StatusCode = decoder.VP8StatusCode\n\n      status = decoder.WebPGetFeatures(data, data.length, bitstream)\n      if (status != (StatusCode.VP8_STATUS_OK || 0)) {\n        console.error('[webpjs] status error', status, StatusCode)\n      }\n\n      var mode = decoder.WEBP_CSP_MODE\n      buffer.colorspace = mode.MODE_RGBA\n      buffer.J = 4\n\n      try {\n        status = decoder.WebPDecode(data, data.length, config)\n      } catch (e) {\n        status = e\n      }\n\n      ok = (status == 0)\n      if (!ok) {\n        console.error('[webpjs] decoding failed', status, StatusCode)\n        return false\n      }\n\n      // console.log('[webpjs] decoded: ', buffer.width, buffer.height, bitstream.has_alpha, 'Now saving...')\n      var bitmap = buffer.c.RGBA.ma\n\n      // console.log('[webpjs] done in ', tsNow() - start)\n\n      if (!bitmap) {\n        return false\n      }\n      var biHeight = buffer.height\n      var biWidth = buffer.width\n\n      if (!canvas || !context) {\n        canvas = document.createElement('canvas')\n        context = canvas.getContext('2d')\n      } else {\n        context.clearRect(0, 0, canvas.width, canvas.height)\n      }\n      canvas.height = biHeight\n      canvas.width = biWidth\n\n      var output = context.createImageData(canvas.width, canvas.height)\n      var outputData = output.data\n\n      for (var h = 0; h < biHeight; h++) {\n        for (var w = 0; w < biWidth; w++) {\n          outputData[0 + w * 4 + (biWidth * 4) * h] = bitmap[1 + w * 4 + (biWidth * 4) * h]\n          outputData[1 + w * 4 + (biWidth * 4) * h] = bitmap[2 + w * 4 + (biWidth * 4) * h]\n          outputData[2 + w * 4 + (biWidth * 4) * h] = bitmap[3 + w * 4 + (biWidth * 4) * h]\n          outputData[3 + w * 4 + (biWidth * 4) * h] = bitmap[0 + w * 4 + (biWidth * 4) * h]\n        }\n      }\n\n      context.putImageData(output, 0, 0)\n\n      return true\n    }\n\n    function getPngBlobFromWebp (data) {\n      if (!getCanvasFromWebp(data)) {\n        return $q.reject({type: 'WEBP_PROCESS_FAILED'})\n      }\n      if (canvas.toBlob === undefined) {\n        return qSync.when(dataUrlToBlob(canvas.toDataURL('image/png')))\n      }\n\n      var deferred = $q.defer()\n      canvas.toBlob(function (blob) {\n        deferred.resolve(blob)\n      }, 'image/png')\n      return deferred.promise\n    }\n\n    return {\n      isWebpSupported: function () {\n        return nativeWebpSupport\n      },\n      getPngBlobFromWebp: getPngBlobFromWebp\n    }\n  })\n\n  .service('CryptoWorker', function ($timeout, $q) {\n    var webWorker = false\n    var naClEmbed = false\n    var taskID = 0\n    var awaiting = {}\n    var webCrypto = Config.Modes.webcrypto && window.crypto && (window.crypto.subtle || window.crypto.webkitSubtle) /* || window.msCrypto && window.msCrypto.subtle*/\n    var useSha1Crypto = webCrypto && webCrypto.digest !== undefined\n    var useSha256Crypto = webCrypto && webCrypto.digest !== undefined\n    var finalizeTask = function (taskID, result) {\n      var deferred = awaiting[taskID]\n      if (deferred !== undefined) {\n        // console.log(dT(), 'CW done')\n        deferred.resolve(result)\n        delete awaiting[taskID]\n      }\n    }\n\n    if (Config.Modes.nacl &&\n      navigator.mimeTypes &&\n      navigator.mimeTypes['application/x-pnacl'] !== undefined) {\n      var listener = $('<div id=\"nacl_listener\"><embed id=\"mtproto_crypto\" width=\"0\" height=\"0\" src=\"nacl/mtproto_crypto.nmf\" type=\"application/x-pnacl\" /></div>').appendTo($('body'))[0]\n      listener.addEventListener('load', function (e) {\n        naClEmbed = listener.firstChild\n        console.log(dT(), 'NaCl ready')\n      }, true)\n      listener.addEventListener('message', function (e) {\n        finalizeTask(e.data.taskID, e.data.result)\n      }, true)\n      listener.addEventListener('error', function (e) {\n        console.error('NaCl error', e)\n      }, true)\n    }\n\n    if (window.Worker) {\n      var tmpWorker = new Worker('js/lib/crypto_worker.js')\n      tmpWorker.onmessage = function (e) {\n        if (!webWorker) {\n          webWorker = tmpWorker\n        } else {\n          finalizeTask(e.data.taskID, e.data.result)\n        }\n      }\n      tmpWorker.onerror = function (error) {\n        console.error('CW error', error, error.stack)\n        webWorker = false\n      }\n    }\n\n    function performTaskWorker (task, params, embed) {\n      // console.log(dT(), 'CW start', task)\n      var deferred = $q.defer()\n\n      awaiting[taskID] = deferred\n\n      params.task = task\n      params.taskID = taskID\n      ;(embed || webWorker).postMessage(params)\n\n      taskID++\n\n      return deferred.promise\n    }\n\n    return {\n      sha1Hash: function (bytes) {\n        if (useSha1Crypto) {\n          // We don't use buffer since typedArray.subarray(...).buffer gives the whole buffer and not sliced one. webCrypto.digest supports typed array\n          var deferred = $q.defer()\n          var bytesTyped = Array.isArray(bytes) ? convertToUint8Array(bytes) : bytes\n          // console.log(dT(), 'Native sha1 start')\n          webCrypto.digest({name: 'SHA-1'}, bytesTyped).then(function (digest) {\n            // console.log(dT(), 'Native sha1 done')\n            deferred.resolve(digest)\n          }, function (e) {\n            console.error('Crypto digest error', e)\n            useSha1Crypto = false\n            deferred.resolve(sha1HashSync(bytes))\n          })\n\n          return deferred.promise\n        }\n        return $timeout(function () {\n          return sha1HashSync(bytes)\n        })\n      },\n      sha256Hash: function (bytes) {\n        if (useSha256Crypto) {\n          var deferred = $q.defer()\n          var bytesTyped = Array.isArray(bytes) ? convertToUint8Array(bytes) : bytes\n          // console.log(dT(), 'Native sha1 start')\n          webCrypto.digest({name: 'SHA-256'}, bytesTyped).then(function (digest) {\n            // console.log(dT(), 'Native sha1 done')\n            deferred.resolve(digest)\n          }, function (e) {\n            console.error('Crypto digest error', e)\n            useSha256Crypto = false\n            deferred.resolve(sha256HashSync(bytes))\n          })\n\n          return deferred.promise\n        }\n        return $timeout(function () {\n          return sha256HashSync(bytes)\n        })\n      },\n      aesEncrypt: function (bytes, keyBytes, ivBytes) {\n        if (naClEmbed) {\n          return performTaskWorker('aes-encrypt', {\n            bytes: addPadding(convertToArrayBuffer(bytes)),\n            keyBytes: convertToArrayBuffer(keyBytes),\n            ivBytes: convertToArrayBuffer(ivBytes)\n          }, naClEmbed)\n        }\n        return $timeout(function () {\n          return convertToArrayBuffer(aesEncryptSync(bytes, keyBytes, ivBytes))\n        })\n      },\n      aesDecrypt: function (encryptedBytes, keyBytes, ivBytes) {\n        if (naClEmbed) {\n          return performTaskWorker('aes-decrypt', {\n            encryptedBytes: addPadding(convertToArrayBuffer(encryptedBytes)),\n            keyBytes: convertToArrayBuffer(keyBytes),\n            ivBytes: convertToArrayBuffer(ivBytes)\n          }, naClEmbed)\n        }\n        return $timeout(function () {\n          return convertToArrayBuffer(aesDecryptSync(encryptedBytes, keyBytes, ivBytes))\n        })\n      },\n      factorize: function (bytes) {\n        bytes = convertToByteArray(bytes)\n        if (naClEmbed && bytes.length <= 8) {\n          return performTaskWorker('factorize', {bytes: bytes}, naClEmbed)\n        }\n        if (webWorker) {\n          return performTaskWorker('factorize', {bytes: bytes})\n        }\n        return $timeout(function () {\n          return pqPrimeFactorization(bytes)\n        })\n      },\n      modPow: function (x, y, m) {\n        if (webWorker) {\n          return performTaskWorker('mod-pow', {\n            x: x,\n            y: y,\n            m: m\n          })\n        }\n        return $timeout(function () {\n          return bytesModPow(x, y, m)\n        })\n      }\n    }\n  })\n\n  .service('ExternalResourcesManager', function ($q, $http, $sce) {\n    var urlPromises = {}\n\n    function downloadByURL (url) {\n      if (urlPromises[url] !== undefined) {\n        return urlPromises[url]\n      }\n\n      return urlPromises[url] = $http.get(url, {responseType: 'blob', transformRequest: null})\n        .then(function (response) {\n          window.URL = window.URL || window.webkitURL\n          var url = window.URL.createObjectURL(response.data)\n          return $sce.trustAsResourceUrl(url)\n        }, function (error) {\n          if (!Config.Modes.chrome_packed) {\n            return $q.when($sce.trustAsResourceUrl(url))\n          }\n          return $q.reject(error)\n        })\n    }\n\n    return {\n      downloadByURL: downloadByURL\n    }\n  })\n\n  .service('IdleManager', function ($rootScope, $window, $timeout) {\n\n    $rootScope.idle = {isIDLE: false, initial: true}\n\n    var toPromise\n    var debouncePromise\n    var started = false\n\n    var hidden = 'hidden'\n    var visibilityChange = 'visibilitychange'\n    if (typeof document.hidden !== 'undefined') {\n      // default\n    } else if (typeof document.mozHidden !== 'undefined') {\n      hidden = 'mozHidden'\n      visibilityChange = 'mozvisibilitychange'\n    } else if (typeof document.msHidden !== 'undefined') {\n      hidden = 'msHidden'\n      visibilityChange = 'msvisibilitychange'\n    } else if (typeof document.webkitHidden !== 'undefined') {\n      hidden = 'webkitHidden'\n      visibilityChange = 'webkitvisibilitychange'\n    }\n    if (!Config.Mobile) {\n      visibilityChange = ''\n    }\n\n    return {\n      start: start\n    }\n\n    function start () {\n      if (!started) {\n        started = true\n        $($window).on(visibilityChange + ' blur focus keydown mousedown touchstart', onEvent)\n\n        setTimeout(function () {\n          onEvent({type: 'blur', fake_initial: true})\n        }, 0)\n      }\n    }\n\n    function onEvent (e) {\n      // console.log('event', e.type)\n      if (e.type == 'mousemove') {\n        var e = e.originalEvent || e\n        if (e && e.movementX === 0 && e.movementY === 0) {\n          return\n        }\n        $($window).off('mousemove', onEvent)\n      }\n\n      var isIDLE = e.type == 'blur' || e.type == 'timeout' ? true : false\n      if (hidden && document[hidden]) {\n        isIDLE = true\n      }\n\n      $timeout.cancel(toPromise)\n      if (!isIDLE) {\n        // console.log('update timeout')\n        toPromise = $timeout(function () {\n          onEvent({type: 'timeout'})\n        }, 30000)\n      }\n\n      if (e.type == 'focus' && !$rootScope.idle.afterFocus) {\n        $rootScope.idle.afterFocus = true\n        setTimeout(function () {\n          delete $rootScope.idle.afterFocus\n        }, 10)\n      }\n\n      var debounceTimeout = $rootScope.idle.initial ? 0 : 1000\n      if (e && !e.fake_initial) {\n        delete $rootScope.idle.initial\n      }\n\n      $timeout.cancel(debouncePromise)\n\n      if ($rootScope.idle.isIDLE == isIDLE) {\n        return\n      }\n\n      debouncePromise = $timeout(function () {\n        // console.log(dT(), 'IDLE changed', isIDLE)\n        $rootScope.idle.isIDLE = isIDLE\n        if (isIDLE && e.type == 'timeout') {\n          $($window).on('mousemove', onEvent)\n        }\n      }, debounceTimeout)\n\n    }\n  })\n\n  .service('GeoLocationManager', function ($q) {\n    var lastCoords = false\n\n    function isAvailable () {\n      return navigator.geolocation !== undefined\n    }\n\n    function getPosition (force) {\n      if (!force && lastCoords) {\n        return $q.when(lastCoords)\n      }\n      if (!isAvailable()) {\n        return $q.reject()\n      }\n      var deferred = $q.defer()\n      navigator.geolocation.getCurrentPosition(function (position) {\n        lastCoords = {\n          lat: position.coords.latitude,\n          long: position.coords.longitude\n        }\n        deferred.resolve(lastCoords)\n      }, function (error) {\n        deferred.reject(error)\n      })\n\n      return deferred.promise\n    }\n\n    return {\n      getPosition: getPosition,\n      isAvailable: isAvailable\n    }\n  })\n\n  .service('AppRuntimeManager', function ($window) {\n    return {\n      reload: function () {\n        try {\n          location.reload()\n        } catch (e) {}\n\n        if ($window.chrome && chrome.runtime && chrome.runtime.reload) {\n          chrome.runtime.reload()\n        }\n      },\n      close: function () {\n        try {\n          $window.close()\n        } catch (e) {}\n      },\n      focus: function () {\n        if (window.navigator.mozApps && document.hidden) {\n          // Get app instance and launch it to bring app to foreground\n          window.navigator.mozApps.getSelf().onsuccess = function () {\n            this.result.launch()\n          }\n        } else {\n          if (window.chrome && chrome.app && chrome.app.window) {\n            chrome.app.window.current().focus()\n          }\n          window.focus()\n        }\n      }\n    }\n  })\n\n  .service('RichTextProcessor', function ($sce, $sanitize) {\n    var emojiData = Config.Emoji\n    var emojiIconSize = 18\n    var emojiSupported = navigator.userAgent.search(/OS X|iPhone|iPad|iOS|Android/i) != -1,\n      emojiCode\n\n    var emojiRegExp = '\\\\u0023\\\\u20E3|\\\\u00a9|\\\\u00ae|\\\\u203c|\\\\u2049|\\\\u2139|[\\\\u2194-\\\\u2199]|\\\\u21a9|\\\\u21aa|\\\\u231a|\\\\u231b|\\\\u23e9|[\\\\u23ea-\\\\u23ec]|\\\\u23f0|\\\\u24c2|\\\\u25aa|\\\\u25ab|\\\\u25b6|\\\\u2611|\\\\u2614|\\\\u26fd|\\\\u2705|\\\\u2709|[\\\\u2795-\\\\u2797]|\\\\u27a1|\\\\u27b0|\\\\u27bf|\\\\u2934|\\\\u2935|[\\\\u2b05-\\\\u2b07]|\\\\u2b1b|\\\\u2b1c|\\\\u2b50|\\\\u2b55|\\\\u3030|\\\\u303d|\\\\u3297|\\\\u3299|[\\\\uE000-\\\\uF8FF\\\\u270A-\\\\u2764\\\\u2122\\\\u25C0\\\\u25FB-\\\\u25FE\\\\u2615\\\\u263a\\\\u2648-\\\\u2653\\\\u2660-\\\\u2668\\\\u267B\\\\u267F\\\\u2693\\\\u261d\\\\u26A0-\\\\u26FA\\\\u2708\\\\u2702\\\\u2601\\\\u260E]|[\\\\u2600\\\\u26C4\\\\u26BE\\\\u23F3\\\\u2764]|\\\\uD83D[\\\\uDC00-\\\\uDFFF]|\\\\uD83C[\\\\uDDE8-\\\\uDDFA\\uDDEC]\\\\uD83C[\\\\uDDEA-\\\\uDDFA\\uDDE7]|[0-9]\\\\u20e3|\\\\uD83C[\\\\uDC00-\\\\uDFFF]'\n\n    var alphaCharsRegExp = 'a-z' +\n      '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n      '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n      '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n      '\\\\u02bb' + // Hawaiian\n      '\\\\u0300-\\\\u036f' + // Combining diacritics\n      '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n      '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n      '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n      '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n      '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n      '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n      '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n      '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n      '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n      '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n      '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n      '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n      '\\\\u200c' + // Zero-Width Non-Joiner\n      '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n      '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n      '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n      '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n      '\\\\uff66-\\\\uff9f' + // half width Katakana\n      '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\n\n    var alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp\n\n    var domainAddChars = '\\u00b7'\n\n    // Based on Regular Expression for URL validation by Diego Perini\n    var urlRegExp = '((?:https?|ftp)://|mailto:)?' +\n      // user:pass authentication\n      '(?:\\\\S{1,64}(?::\\\\S{0,64})?@)?' +\n      '(?:' +\n      // sindresorhus/ip-regexp\n      '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n      '|' +\n      // host name\n      '[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n      // domain name\n      '(?:\\\\.[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n\n      // TLD identifier\n      '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n      ')' +\n      // port number\n      '(?::\\\\d{2,5})?' +\n      // resource path\n      '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?'\n\n    var usernameRegExp = '[a-zA-Z\\\\d_]{5,32}'\n    var botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)'\n\n    var fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i')\n\n    var emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\n    var youtubeRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?youtu(?:|\\.be|be\\.com|\\.b)(?:\\/v\\/|\\/watch\\\\?v=|e\\/|(?:\\/\\??#)?\\/watch(?:.+)v=)(.{11})(?:\\&[^\\s]*)?/\n    var vimeoRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/\n    var instagramRegExp = /^https?:\\/\\/(?:instagr\\.am\\/p\\/|instagram\\.com\\/p\\/)([a-zA-Z0-9\\-\\_]+)/i\n    var vineRegExp = /^https?:\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9\\-\\_]+)/i\n    var twitterRegExp = /^https?:\\/\\/twitter\\.com\\/.+?\\/status\\/\\d+/i\n    var facebookRegExp = /^https?:\\/\\/(?:www\\.|m\\.)?facebook\\.com\\/(?:.+?\\/posts\\/\\d+|(?:story\\.php|permalink\\.php)\\?story_fbid=(\\d+)(?:&substory_index=\\d+)?&id=(\\d+))/i\n    var gplusRegExp = /^https?:\\/\\/plus\\.google\\.com\\/\\d+\\/posts\\/[a-zA-Z0-9\\-\\_]+/i\n    var soundcloudRegExp = /^https?:\\/\\/(?:soundcloud\\.com|snd\\.sc)\\/([a-zA-Z0-9%\\-\\_]+)\\/([a-zA-Z0-9%\\-\\_]+)/i\n    var spotifyRegExp = /(https?:\\/\\/(open\\.spotify\\.com|play\\.spotify\\.com|spoti\\.fi)\\/(.+)|spotify:(.+))/i\n\n    var markdownTestRegExp = /[`_*@]/\n    var markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)/m\n\n    var siteHashtags = {\n      Telegram: 'tg://search_hashtag?hashtag={1}',\n      Twitter: 'https://twitter.com/hashtag/{1}',\n      Instagram: 'https://instagram.com/explore/tags/{1}/',\n      'Google Plus': 'https://plus.google.com/explore/{1}'\n    }\n\n    var siteMentions = {\n      Telegram: '#/im?p=%40{1}',\n      Twitter: 'https://twitter.com/{1}',\n      Instagram: 'https://instagram.com/{1}/',\n      GitHub: 'https://github.com/{1}'\n    }\n\n    var markdownEntities = {\n      '`': 'messageEntityCode',\n      '**': 'messageEntityBold',\n      '__': 'messageEntityItalic'\n    }\n\n    return {\n      wrapRichText: wrapRichText,\n      wrapPlainText: wrapPlainText,\n      wrapDraftText: wrapDraftText,\n      wrapUrl: wrapUrl,\n      parseEntities: parseEntities,\n      parseMarkdown: parseMarkdown,\n      parseEmojis: parseEmojis,\n      mergeEntities: mergeEntities\n    }\n\n    function getEmojiSpritesheetCoords (emojiCode) {\n      var i\n      var row, column\n      var totalColumns\n      for (var cat = 0; cat < Config.EmojiCategories.length; cat++) {\n        totalColumns = Config.EmojiCategorySpritesheetDimens[cat][1]\n        i = Config.EmojiCategories[cat].indexOf(emojiCode)\n        if (i > -1) {\n          row = Math.floor(i / totalColumns)\n          column = (i % totalColumns)\n          return { category: cat, row: row, column: column }\n        }\n      }\n      console.error('emoji not found in spritesheet', emojiCode)\n      return null\n    }\n\n    function parseEntities (text, options) {\n      options = options || {}\n\n      var match\n      var raw = text,\n        url\n      var entities = [],\n        emojiCode,\n        emojiCoords,\n        matchIndex\n      var rawOffset = 0\n\n      // var start = tsNow()\n\n      while ((match = raw.match(fullRegExp))) {\n        matchIndex = rawOffset + match.index\n\n        if (match[3]) { // mentions\n          entities.push({\n            _: 'messageEntityMention',\n            offset: matchIndex + match[1].length,\n            length: match[2].length + match[3].length\n          })\n        }\n        else if (match[4]) {\n          if (emailRegExp.test(match[4])) { // email\n            entities.push({\n              _: 'messageEntityEmail',\n              offset: matchIndex,\n              length: match[4].length\n            })\n          } else {\n            var url = false\n            var protocol = match[5]\n            var tld = match[6]\n            var excluded = ''\n\n            if (tld) { // URL\n              if (!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\n                protocol = 'http://'\n              }\n\n              if (protocol) {\n                var balanced = checkBrackets(match[4])\n\n                if (balanced.length !== match[4].length) {\n                  excluded = match[4].substring(balanced.length)\n                  match[4] = balanced\n                }\n\n                url = (match[5] ? '' : protocol) + match[4]\n              }\n            } else { // IP address\n              url = (match[5] ? '' : 'http://') + match[4]\n            }\n\n            if (url) {\n              entities.push({\n                _: 'messageEntityUrl',\n                offset: matchIndex,\n                length: match[4].length\n              })\n            }\n          }\n        }\n        else if (match[7]) { // New line\n          entities.push({\n            _: 'messageEntityLinebreak',\n            offset: matchIndex,\n            length: 1\n          })\n        }\n        else if (match[8]) { // Emoji\n          if ((emojiCode = EmojiHelper.emojiMap[match[8]]) &&\n              (emojiCoords = getEmojiSpritesheetCoords(emojiCode))) {\n            entities.push({\n              _: 'messageEntityEmoji',\n              offset: matchIndex,\n              length: match[0].length,\n              coords: emojiCoords,\n              title: emojiData[emojiCode][1][0]\n            })\n          }\n        }\n        else if (match[10]) { // Hashtag\n          entities.push({\n            _: 'messageEntityHashtag',\n            offset: matchIndex + match[9].length,\n            length: match[10].length\n          })\n        }\n        else if (match[12]) { // Bot command\n          entities.push({\n            _: 'messageEntityBotCommand',\n            offset: matchIndex + match[11].length,\n            length: 1 + match[12].length + (match[13] ? 1 + match[13].length : 0)\n          })\n        }\n        raw = raw.substr(match.index + match[0].length)\n        rawOffset += match.index + match[0].length\n      }\n\n      // if (entities.length) {\n      //   console.log('parse entities', text, entities.slice())\n      // }\n\n      return entities\n    }\n\n    function parseEmojis (text) {\n      return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n        var emojiCode = EmojiHelper.shortcuts[shortcut]\n        if (emojiCode !== undefined) {\n          return EmojiHelper.emojis[emojiCode][0]\n        }\n        return all\n      })\n    }\n\n    function parseMarkdown (text, entities, noTrim) {\n      if (!markdownTestRegExp.test(text)) {\n        return noTrim ? text : text.trim()\n      }\n      var raw = text\n      var match\n      var newText = []\n      var rawOffset = 0\n      var matchIndex\n      while (match = raw.match(markdownRegExp)) {\n        matchIndex = rawOffset + match.index\n        newText.push(raw.substr(0, match.index))\n\n        var text = (match[3] || match[8] || match[11])\n        rawOffset -= text.length\n        text = text.replace(/^\\s+|\\s+$/g, '')\n        rawOffset += text.length\n\n        if (text.match(/^`*$/)) {\n          newText.push(match[0])\n        }\n        else if (match[3]) { // pre\n          if (match[5] == '\\n') {\n            match[5] = ''\n            rawOffset -= 1\n          }\n          newText.push(match[1] + text + match[5])\n          entities.push({\n            _: 'messageEntityPre',\n            language: '',\n            offset: matchIndex + match[1].length,\n            length: text.length\n          })\n          rawOffset -= match[2].length + match[4].length\n        } else if (match[7]) { // code|italic|bold\n          newText.push(match[6] + text + match[9])\n          entities.push({\n            _: markdownEntities[match[7]],\n            offset: matchIndex + match[6].length,\n            length: text.length\n          })\n          rawOffset -= match[7].length * 2\n        } else if (match[11]) { // custom mention\n          newText.push(text)\n          entities.push({\n            _: 'messageEntityMentionName',\n            user_id: match[10],\n            offset: matchIndex,\n            length: text.length\n          })\n          rawOffset -= match[0].length - text.length\n        }\n        raw = raw.substr(match.index + match[0].length)\n        rawOffset += match.index + match[0].length\n      }\n      newText.push(raw)\n      newText = newText.join('')\n\n      if (!newText.replace(/\\s+/g, '').length) {\n        newText = text\n        entities.splice(0, entities.length)\n      }\n      if (!entities.length && !noTrim) {\n        newText = newText.trim()\n      }\n      return newText\n    }\n\n    function mergeEntities (currentEntities, newEntities, fromApi) {\n      var totalEntities = newEntities.slice()\n\n      var i\n      var len = currentEntities.length\n      var j\n      var len2 = newEntities.length\n      var startJ = 0\n      var curEntity\n      var newEntity\n      var start, end\n      var cStart, cEnd\n      var bad\n      for (i = 0; i < len; i++) {\n        curEntity = currentEntities[i]\n        if (fromApi &&\n          curEntity._ != 'messageEntityLinebreak' &&\n          curEntity._ != 'messageEntityEmoji') {\n          continue\n        }\n        // console.log('s', curEntity, newEntities)\n        start = curEntity.offset\n        end = start + curEntity.length\n        bad = false\n        for (j = startJ; j < len2; j++) {\n          newEntity = newEntities[j]\n          cStart = newEntity.offset\n          cEnd = cStart + newEntity.length\n          if (cStart <= start) {\n            startJ = j\n          }\n          if (start >= cStart && start < cEnd ||\n            end > cStart && end <= cEnd) {\n            // console.log('bad', curEntity, newEntity)\n            if (fromApi &&\n              start >= cStart && end <= cEnd) {\n              if (newEntity.nested === undefined) {\n                newEntity.nested = []\n              }\n              curEntity.offset -= cStart\n              newEntity.nested.push(angular.copy(curEntity))\n            }\n            bad = true\n            break\n          }\n          if (cStart >= end) {\n            break\n          }\n        }\n        if (bad) {\n          continue\n        }\n        totalEntities.push(curEntity)\n      }\n\n      totalEntities.sort(function (a, b) {\n        return a.offset - b.offset\n      })\n\n      // console.log('merge', currentEntities, newEntities, totalEntities)\n\n      return totalEntities\n    }\n\n    function wrapRichNestedText (text, nested, options) {\n      if (nested === undefined) {\n        return encodeEntities(text)\n      }\n      options.hasNested = true\n\n      return wrapRichText(text, {entities: nested, nested: true})\n    }\n\n    function wrapRichText (text, options) {\n      if (!text || !text.length) {\n        return ''\n      }\n\n      options = options || {}\n\n      var entities = options.entities\n      var contextSite = options.contextSite || 'Telegram'\n      var contextExternal = contextSite != 'Telegram'\n      var emojiFound = false\n\n      if (entities === undefined) {\n        entities = parseEntities(text, options)\n      }\n\n      var i = 0\n      var len = entities.length\n      var entity\n      var entityText\n      var skipEntity\n      var url\n      var html = []\n      var lastOffset = 0\n      var curEmojiSize = options.emojiIconSize || emojiIconSize\n      for (i = 0; i < len; i++) {\n        entity = entities[i]\n        if (entity.offset > lastOffset) {\n          html.push(\n            encodeEntities(text.substr(lastOffset, entity.offset - lastOffset))\n          )\n        }\n        else if (entity.offset < lastOffset) {\n          continue\n        }\n        skipEntity = false\n        entityText = text.substr(entity.offset, entity.length)\n        switch (entity._) {\n          case 'messageEntityMention':\n            var contextUrl = !options.noLinks && siteMentions[contextSite]\n            if (!contextUrl) {\n              skipEntity = true\n              break\n            }\n            var username = entityText.substr(1)\n            var attr = ''\n            if (options.highlightUsername &&\n              options.highlightUsername.toLowerCase() == username.toLowerCase()) {\n              attr = 'class=\"im_message_mymention\"'\n            }\n            html.push(\n              '<a ',\n              attr,\n              contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\" ' : '',\n              ' href=\"',\n              contextUrl.replace('{1}', encodeURIComponent(username)),\n              '\">',\n              encodeEntities(entityText),\n              '</a>'\n            )\n            break\n\n          case 'messageEntityMentionName':\n            if (options.noLinks) {\n              skipEntity = true\n              break\n            }\n            html.push(\n              '<a href=\"#/im?p=u',\n              encodeURIComponent(entity.user_id),\n              '\">',\n              encodeEntities(entityText),\n              '</a>'\n            )\n            break\n\n          case 'messageEntityHashtag':\n            var contextUrl = !options.noLinks && siteHashtags[contextSite]\n            if (!contextUrl) {\n              skipEntity = true\n              break\n            }\n            var hashtag = entityText.substr(1)\n            html.push(\n              '<a ',\n              contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\" ' : '',\n              'href=\"',\n              contextUrl.replace('{1}', encodeURIComponent(hashtag))\n              ,\n              '\">',\n              encodeEntities(entityText),\n              '</a>'\n            )\n            break\n\n          case 'messageEntityEmail':\n            if (options.noLinks) {\n              skipEntity = true\n              break\n            }\n            html.push(\n              '<a href=\"',\n              encodeEntities('mailto:' + entityText),\n              '\" target=\"_blank\" rel=\"noopener noreferrer\">',\n              encodeEntities(entityText),\n              '</a>'\n            )\n            break\n\n          case 'messageEntityUrl':\n          case 'messageEntityTextUrl':\n            var inner\n            if (entity._ == 'messageEntityTextUrl') {\n              url = entity.url\n              url = wrapUrl(url, true)\n              inner = wrapRichNestedText(entityText, entity.nested, options)\n            } else {\n              url = wrapUrl(entityText, false)\n              inner = encodeEntities(replaceUrlEncodings(entityText))\n            }\n            if (options.noLinks) {\n              html.push(inner);\n            } else {\n              html.push(\n                '<a href=\"',\n                encodeEntities(url),\n                '\" target=\"_blank\" rel=\"noopener noreferrer\">',\n                inner,\n                '</a>'\n              )\n            }\n            break\n\n          case 'messageEntityLinebreak':\n            html.push(options.noLinebreaks ? ' ' : '<br/>')\n            break\n\n          case 'messageEntityEmoji':\n            html.push(\n              '<span class=\"emoji emoji-',\n              entity.coords.category,\n              '-',\n              (curEmojiSize * entity.coords.column),\n              '-',\n              (curEmojiSize * entity.coords.row),\n              '\" ',\n              'title=\"', entity.title, '\">',\n              ':', entity.title, ':</span>'\n            )\n            emojiFound = true\n            break\n\n          case 'messageEntityBotCommand':\n            if (options.noLinks || options.noCommands || contextExternal) {\n              skipEntity = true\n              break\n            }\n            var command = entityText.substr(1)\n            var bot\n            var atPos\n            if ((atPos = command.indexOf('@')) != -1) {\n              bot = command.substr(atPos + 1)\n              command = command.substr(0, atPos)\n            } else {\n              bot = options.fromBot\n            }\n            html.push(\n              '<a href=\"',\n              encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : '')),\n              '\">',\n              encodeEntities(entityText),\n              '</a>'\n            )\n            break\n\n          case 'messageEntityBold':\n            html.push(\n              '<strong>',\n              wrapRichNestedText(entityText, entity.nested, options),\n              '</strong>'\n            )\n            break\n\n          case 'messageEntityItalic':\n            html.push(\n              '<em>',\n              wrapRichNestedText(entityText, entity.nested, options),\n              '</em>'\n            )\n            break\n\n          case 'messageEntityCode':\n            html.push(\n              '<code>',\n              encodeEntities(entityText),\n              '</code>'\n            )\n            break\n\n          case 'messageEntityPre':\n            html.push(\n              '<pre><code', (entity.language ? ' class=\"language-' + encodeEntities(entity.language) + '\"' : ''), '>',\n              encodeEntities(entityText),\n              '</code></pre>'\n            )\n            break\n\n          default:\n            skipEntity = true\n        }\n        lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\n      }\n      html.push(encodeEntities(text.substr(lastOffset)))\n\n      text = $sanitize(html.join(''))\n\n      if (!options.nested && (emojiFound || options.hasNested)) {\n        text = text.replace(/\\ufe0f|&#65039;|&#65533;|&#8205;/g, '', text)\n        var emojiSizeClass = curEmojiSize == 18 ? '' : (' emoji-w' + curEmojiSize)\n        text = text.replace(/<span((?: [^>]*)?) class=\"emoji emoji-(\\d)-(\\d+)-(\\d+)\"(.+?)<\\/span>/g,\n          '<span$1 class=\"emoji ' + emojiSizeClass + ' emoji-spritesheet-$2\" style=\"background-position: -$3px -$4px;\" $5</span>')\n      }\n\n      return $sce.trustAs('html', text)\n    }\n\n    function wrapDraftText (text, options) {\n      if (!text || !text.length) {\n        return ''\n      }\n\n      options = options || {}\n\n      var entities = options.entities\n\n      if (entities === undefined) {\n        entities = parseEntities(text, options)\n      }\n\n      var i = 0\n      var len = entities.length\n      var entity\n      var entityText\n      var skipEntity\n      var code = []\n      var lastOffset = 0\n      for (i = 0; i < len; i++) {\n        entity = entities[i]\n        if (entity.offset > lastOffset) {\n          code.push(\n            text.substr(lastOffset, entity.offset - lastOffset)\n          )\n        }\n        else if (entity.offset < lastOffset) {\n          continue\n        }\n        skipEntity = false\n        entityText = text.substr(entity.offset, entity.length)\n        switch (entity._) {\n          case 'messageEntityEmoji':\n            code.push(\n              ':',\n              entity.title,\n              ':'\n            )\n            break\n\n          case 'messageEntityCode':\n            code.push(\n              '`', entityText, '`'\n            )\n            break\n\n          case 'messageEntityBold':\n            code.push(\n              '**', entityText, '**'\n            )\n            break\n\n          case 'messageEntityItalic':\n            code.push(\n              '__', entityText, '__'\n            )\n            break\n\n          case 'messageEntityPre':\n            code.push(\n              '```', entityText, '```'\n            )\n            break\n\n          case 'messageEntityMentionName':\n            code.push(\n              '@', entity.user_id, ' (', entityText, ')'\n            )\n            break\n\n          default:\n            skipEntity = true\n        }\n        lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\n      }\n\n      code.push(text.substr(lastOffset))\n\n      return code.join('')\n    }\n\n    function checkBrackets (url) {\n      var urlLength = url.length\n      var urlOpenBrackets = url.split('(').length - 1\n      var urlCloseBrackets = url.split(')').length - 1\n\n      while (urlCloseBrackets > urlOpenBrackets &&\n        url.charAt(urlLength - 1) === ')') {\n        url = url.substr(0, urlLength - 1)\n        urlCloseBrackets--\n        urlLength--\n      }\n      if (urlOpenBrackets > urlCloseBrackets) {\n        url = url.replace(/\\)+$/, '')\n      }\n      return url\n    }\n\n    function replaceUrlEncodings(urlWithEncoded) {\n      return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, function (str) {\n        try {\n          return decodeURIComponent(str)\n        } catch (e) {\n          return str\n        }\n      })\n    }\n\n    function wrapPlainText (text, options) {\n      if (emojiSupported) {\n        return text\n      }\n      if (!text || !text.length) {\n        return ''\n      }\n\n      options = options || {}\n\n      text = text.replace(/\\ufe0f/g, '', text)\n\n      var match\n      var raw = text\n      var text = [],\n        emojiTitle\n\n      while ((match = raw.match(fullRegExp))) {\n        text.push(raw.substr(0, match.index))\n\n        if (match[8]) {\n          if ((emojiCode = EmojiHelper.emojiMap[match[8]]) &&\n            (emojiTitle = emojiData[emojiCode][1][0])) {\n            text.push(':' + emojiTitle + ':')\n          } else {\n            text.push(match[0])\n          }\n        } else {\n          text.push(match[0])\n        }\n        raw = raw.substr(match.index + match[0].length)\n      }\n      text.push(raw)\n\n      return text.join('')\n    }\n\n    function wrapUrl (url, unsafe) {\n      if (!url.match(/^https?:\\/\\//i)) {\n        url = 'http://' + url\n      }\n      var tgMeMatch\n      var telescoPeMatch\n      if (unsafe == 2) {\n        url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\n      }\n      else if ((tgMeMatch = url.match(/^https?:\\/\\/t(?:elegram)?\\.me\\/(.+)/))) {\n        var fullPath = tgMeMatch[1]\n        var path = fullPath.split('/')\n        switch (path[0]) {\n          case 'joinchat':\n            url = 'tg://join?invite=' + path[1]\n            break\n          case 'addstickers':\n            url = 'tg://addstickers?set=' + path[1]\n            break\n          default:\n            if (path[1] && path[1].match(/^\\d+$/)) {\n              url = 'tg://resolve?domain=' + path[0] + '&post=' + path[1]\n            }\n            else if (path.length == 1) {\n              var domainQuery = path[0].split('?')\n              var domain = domainQuery[0]\n              var query = domainQuery[1]\n              if (domain == 'iv') {\n                var match = (query || '').match(/url=([^&=]+)/)\n                if (match) {\n                  url = match[1]\n                  try {\n                    url = decodeURIComponent(url)\n                  } catch (e) {}\n                  return wrapUrl(url, unsafe)\n                }\n              }\n              url = 'tg://resolve?domain=' + domain + (query ? '&' + query : '')\n            }\n        }\n      }\n      else if ((telescoPeMatch = url.match(/^https?:\\/\\/telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n        url = 'tg://resolve?domain=' + telescoPeMatch[1] + '&post=' + telescoPeMatch[2]\n      }\n      else if (unsafe) {\n        url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\n      }\n      return url\n    }\n  })\n\n  .service('ServerTimeManager', function (Storage) {\n    var timestampNow = tsNow(true)\n    var midnightNoOffset = timestampNow - (timestampNow % 86400)\n    var midnightOffseted = new Date()\n    midnightOffseted.setHours(0)\n    midnightOffseted.setMinutes(0)\n    midnightOffseted.setSeconds(0)\n\n    var midnightOffset = midnightNoOffset - (Math.floor(+midnightOffseted / 1000))\n\n    var serverTimeOffset = 0\n    var timeParams = {\n      midnightOffset: midnightOffset,\n      serverTimeOffset: serverTimeOffset\n    }\n\n    Storage.get('server_time_offset').then(function (to) {\n      if (to) {\n        serverTimeOffset = to\n        timeParams.serverTimeOffset = to\n      }\n    })\n\n    return timeParams\n  })\n\n  .service('WebPushApiManager', function ($window, $timeout, $q, $rootScope, _, AppRuntimeManager) {\n\n    var isAvailable = true\n    var isPushEnabled = false\n    var localNotificationsAvailable = true\n    var started = false\n    var settings = {}\n    var isAliveTO\n    var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1\n    var userVisibleOnly = isFirefox ? false : true\n\n    if (!('PushManager' in window) ||\n        !('Notification' in window) ||\n        !('serviceWorker' in navigator)) {\n      console.warn('Push messaging is not supported.')\n      isAvailable = false\n      localNotificationsAvailable = false\n    }\n\n    if (isAvailable &&\n        Notification.permission === 'denied') {\n      console.warn('The user has blocked notifications.')\n    }\n\n    function start() {\n      if (!started) {\n        started = true\n        getSubscription()\n        setUpServiceWorkerChannel()\n      }\n    }\n\n    function setLocalNotificationsDisabled() {\n      localNotificationsAvailable = false\n    }\n\n    function getSubscription() {\n      if (!isAvailable) {\n        return\n      }\n      navigator.serviceWorker.ready.then(function(reg) {\n        reg.pushManager.getSubscription().then(function(subscription) {\n          isPushEnabled = subscription ? true : false\n          pushSubscriptionNotify('init', subscription)\n        })\n        .catch(function(err) {\n          console.log('Error during getSubscription()', err)\n        })\n      })\n    }\n\n    function subscribe() {\n      if (!isAvailable) {\n        return\n      }\n      navigator.serviceWorker.ready.then(function(reg) {\n        reg.pushManager.subscribe({userVisibleOnly: userVisibleOnly}).then(function(subscription) {\n          // The subscription was successful\n          isPushEnabled = true\n          pushSubscriptionNotify('subscribe', subscription)\n        })\n        .catch(function(e) {\n          if (Notification.permission === 'denied') {\n            console.log('Permission for Notifications was denied')\n          } else {\n            console.log('Unable to subscribe to push.', e)\n            if (!userVisibleOnly) {\n              userVisibleOnly = true\n              setTimeout(subscribe, 0)\n            }\n          }\n        })\n      })\n    }\n\n    function unsubscribe() {\n      if (!isAvailable) {\n        return\n      }\n      navigator.serviceWorker.ready.then(function(reg) {\n        reg.pushManager.getSubscription().then(function (subscription) {\n          isPushEnabled = false\n\n          if (subscription) {\n            pushSubscriptionNotify('unsubscribe', subscription)\n\n            setTimeout(function() {\n              subscription.unsubscribe().then(function(successful) {\n                isPushEnabled = false\n              }).catch(function(e) {\n                console.error('Unsubscription error: ', e)\n              })\n            }, 3000)\n          }\n\n        }).catch(function(e) {\n          console.error('Error thrown while unsubscribing from ' +\n            'push messaging.', e)\n        })\n      })\n    }\n\n    function forceUnsubscribe() {\n      if (!isAvailable) {\n        return\n      }\n      navigator.serviceWorker.ready.then(function(reg) {\n        reg.pushManager.getSubscription().then(function (subscription) {\n          console.warn('force unsubscribe', subscription)\n          if (subscription) {\n            subscription.unsubscribe().then(function(successful) {\n              console.warn('force unsubscribe successful', successful)\n              isPushEnabled = false\n            }).catch(function(e) {\n              console.error('Unsubscription error: ', e)\n            })\n          }\n\n        }).catch(function(e) {\n          console.error('Error thrown while unsubscribing from ' +\n            'push messaging.', e)\n        })\n      })\n    }\n\n    function isAliveNotify() {\n      if (!isAvailable ||\n          $rootScope.idle && $rootScope.idle.deactivated) {\n        return\n      }\n      settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im'\n\n      var eventData = {\n        type: 'ping',\n        localNotifications: localNotificationsAvailable,\n        lang: {\n          push_action_mute1d: _(Config.Mobile\n            ? 'push_action_mute1d_mobile_raw'\n            : 'push_action_mute1d_raw'\n          ),\n          push_action_settings: _(Config.Mobile\n            ? 'push_action_settings_mobile_raw'\n            : 'push_action_settings_raw'\n          ),\n          push_message_nopreview: _('push_message_nopreview_raw'),\n        },\n        settings: settings\n      }\n      if (navigator.serviceWorker.controller) {\n        navigator.serviceWorker.controller.postMessage(eventData)\n      }\n      isAliveTO = setTimeout(isAliveNotify, 10000)\n    }\n\n    function setSettings(newSettings) {\n      settings = angular.copy(newSettings)\n      clearTimeout(isAliveTO)\n      isAliveNotify()\n    }\n\n    function hidePushNotifications() {\n      if (!isAvailable) {\n        return\n      }\n      if (navigator.serviceWorker.controller) {\n        var eventData = {type: 'notifications_clear'}\n        navigator.serviceWorker.controller.postMessage(eventData)\n      }\n    }\n\n    function setUpServiceWorkerChannel() {\n      if (!isAvailable) {\n        return\n      }\n      navigator.serviceWorker.addEventListener('message', function(event) {\n        if (event.data &&\n            event.data.type == 'push_click') {\n          if ($rootScope.idle && $rootScope.idle.deactivated) {\n            AppRuntimeManager.reload()\n            return\n          }\n          $rootScope.$emit('push_notification_click', event.data.data)\n        }\n      })\n      navigator.serviceWorker.ready.then(isAliveNotify)\n    }\n\n\n    function pushSubscriptionNotify(event, subscription) {\n      if (subscription) {\n        var subscriptionObj = subscription.toJSON()\n        if (!subscriptionObj ||\n            !subscriptionObj.endpoint ||\n            !subscriptionObj.keys ||\n            !subscriptionObj.keys.p256dh ||\n            !subscriptionObj.keys.auth) {\n          console.warn(dT(), 'Invalid push subscription', subscriptionObj)\n          unsubscribe()\n          isAvailable = false\n          return pushSubscriptionNotify(event, false)\n        }\n        console.warn(dT(), 'Push', event, subscriptionObj)\n        $rootScope.$emit('push_' + event, {\n          tokenType: 10,\n          tokenValue: JSON.stringify(subscriptionObj)\n        })\n      } else {\n        console.warn(dT(), 'Push', event, false)\n        $rootScope.$emit('push_' + event, false)\n      }\n    }\n\n    return {\n      isAvailable: isAvailable,\n      start: start,\n      isPushEnabled: isPushEnabled,\n      subscribe: subscribe,\n      unsubscribe: unsubscribe,\n      forceUnsubscribe: forceUnsubscribe,\n      hidePushNotifications: hidePushNotifications,\n      setLocalNotificationsDisabled: setLocalNotificationsDisabled,\n      setSettings: setSettings\n    }\n\n  })\n"
  },
  {
    "path": "app/js/lib/polyfill.js",
    "content": "// Console-polyfill. MIT license.\n// https://github.com/paulmillr/console-polyfill\n// Make it safe to do console.log() always.\n;(function (global) {\n  'use strict'\n  global.console = global.console || {}\n  var con = global.console\n  var prop\n  var method\n  var empty = {}\n  var dummy = function () {}\n  var properties = 'memory'.split(',')\n  var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' +\n  'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' +\n  'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(',')\n  while (prop = properties.pop()) if (!con[prop]) con[prop] = empty\n  while (method = methods.pop()) if (!con[method]) con[method] = dummy\n})(typeof window === 'undefined' ? this : window)\n// Using `this` for web workers while maintaining compatibility with browser\n// targeted script loaders such as Browserify or Webpack where the only way to\n// get to the global object is via `window`.\n\n/* Array.indexOf polyfill */\nif (!Array.prototype.indexOf) {\n  Array.prototype.indexOf = function (searchElement, fromIndex) {\n    var k\n    if (this == null) {\n      throw new TypeError('\"this\" is null or not defined')\n    }\n\n    var O = Object(this)\n    var len = O.length >>> 0\n    if (len === 0) {\n      return -1\n    }\n    var n = +fromIndex || 0\n\n    if (Math.abs(n) === Infinity) {\n      n = 0\n    }\n    if (n >= len) {\n      return -1\n    }\n    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0)\n    while (k < len) {\n      if (k in O && O[k] === searchElement) {\n        return k\n      }\n      k++\n    }\n    return -1\n  }\n}\n\n/* Array.isArray polyfill */\nif (!Array.isArray) {\n  Array.isArray = function (arg) {\n    return Object.prototype.toString.call(arg) === '[object Array]'\n  }\n}\n\n/* Object.create polyfill */\nif (typeof Object.create != 'function') {\n  Object.create = (function () {\n    var Object = function () {}\n    return function (prototype) {\n      if (arguments.length > 1) {\n        throw Error('Second argument not supported')\n      }\n      if (typeof prototype != 'object') {\n        throw TypeError('Argument must be an object')\n      }\n      Object.prototype = prototype\n      var result = { }\n      Object.prototype = null\n      return result\n    }\n  })()\n}\n\n/* Function.bind polyfill */\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function (oThis) {\n    if (typeof this !== 'function') {\n      throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable')\n    }\n\n    var aArgs = Array.prototype.slice.call(arguments, 1)\n    var fToBind = this\n    var fNOP = function () {}\n    var fBound = function () {\n      return fToBind.apply(this instanceof fNOP && oThis\n        ? this\n        : oThis,\n        aArgs.concat(Array.prototype.slice.call(arguments)))\n    }\n\n    fNOP.prototype = this.prototype\n    fBound.prototype = new fNOP()\n\n    return fBound\n  }\n}\n\n/* setZeroTimeout polyfill, from http://dbaron.org/log/20100309-faster-timeouts */\n(function (global) {\n  var messageName = 'zero-timeout-message'\n  var originalSetTimeout = global.setTimeout\n  var originalClearTimeout = global.clearTimeout\n\n  var originalMinId = originalSetTimeout(function () {}, 0)\n  var zeroTimeouts = []\n  var zeroMinId = originalMinId + 100000000\n\n  function setZeroTimeout (fn) {\n    var timeoutId = ++zeroMinId\n    zeroTimeouts.push([timeoutId, fn])\n    global.postMessage(messageName, '*')\n    return timeoutId\n  }\n\n  function clearZeroTimeout(timeoutId) {\n    if (timeoutId && timeoutId >= zeroMinId) {\n      for (var i = 0, len = zeroTimeouts.length; i < len; i++) {\n        if (zeroTimeouts[i][0] == timeoutId) {\n          console.warn('spliced timeout', timeoutId, i)\n          zeroTimeouts.splice(i, 1)\n          break\n        }\n      }\n    }\n  }\n\n  function handleMessage (event) {\n    if (event.source == global && event.data == messageName) {\n      event.stopPropagation()\n      if (zeroTimeouts.length > 0) {\n        var fn = zeroTimeouts.shift()[1]\n        fn()\n      }\n    }\n  }\n\n  global.addEventListener('message', handleMessage, true)\n\n  global.setTimeout = function (callback, delay) {\n    if (!delay || delay <= 5) {\n      return setZeroTimeout(callback)\n    }\n    return originalSetTimeout(callback, delay)\n  }\n\n  global.clearTimeout = function (timeoutId) {\n    if (timeoutId >= zeroMinId) {\n      clearZeroTimeout(timeoutId)\n    }\n    return originalClearTimeout(timeoutId)\n  }\n\n  global.setZeroTimeout = setZeroTimeout\n})(this)\n"
  },
  {
    "path": "app/js/lib/push_worker.js",
    "content": "console.log('[SW] Push worker started')\n\nvar pendingNotification = false\n\nvar defaultBaseUrl\nswitch (location.hostname) {\n  case 'localhost':\n    defaultBaseUrl = 'http://localhost:8000/app/index.html#/im'\n    break\n  case 'zhukov.github.io':\n    defaultBaseUrl = 'https://zhukov.github.io/webogram/#/im'\n    break\n  default:\n  case 'web.telegram.org':\n    defaultBaseUrl = 'https://' + location.hostname + '/#/im'\n}\n\nself.addEventListener('push', function(event) {\n  var obj = event.data.json()\n  console.log('[SW] push', obj)\n\n  var hasActiveWindows = false\n  var checksPromise = new Promise(function (resolve, reject) {\n    var nowTime = +(new Date())\n    Promise.all([getMuteUntil(), getLastAliveTime()]).then(function (result) {\n      var muteUntil = result[0]\n      var lastAliveTime = result[1]\n      return clients.matchAll({type: 'window'}).then(function(clientList) {\n        console.log('matched clients', clientList)\n        hasActiveWindows = clientList.length > 0\n        if (hasActiveWindows) {\n          console.log('Supress notification because some instance is alive')\n          return reject()\n        }\n        if (userInvisibleIsSupported() &&\n            muteUntil &&\n            nowTime < muteUntil) {\n          console.log('Supress notification because mute for ', Math.ceil((muteUntil - nowTime) / 60000), 'min')\n          return reject()\n        }\n        if (!obj.badge) {\n          return reject()\n        }\n        return resolve()\n      })\n    })\n  })\n\n  var notificationPromise = checksPromise.then(function () {\n    return Promise.all([getSettings(), getLang()]).then(function (result) {\n      return fireNotification(obj, result[0], result[1])\n    })\n  })\n\n  var closePromise = notificationPromise.catch(function () {\n    console.log('[SW] Closing all notifications on push', hasActiveWindows)\n    if (userInvisibleIsSupported() || hasActiveWindows) {\n      return closeAllNotifications()\n    }\n    return self.registration.showNotification('Telegram', {\n      tag: 'unknown_peer'\n    }).then(function () {\n      if (hasActiveWindows) {\n        return closeAllNotifications()\n      }\n      setTimeout(closeAllNotifications, hasActiveWindows ? 0 : 100)\n    }).catch(function (error) {\n      console.error('Show notification error', error)\n    })\n  })\n\n  event.waitUntil(closePromise)\n})\n\nself.addEventListener('install', function(event) {\n  event.waitUntil(self.skipWaiting());\n});\nself.addEventListener('activate', function(event) {\n  console.log('[SW] on activate')\n  event.waitUntil(self.clients.claim());\n});\n\n\nself.addEventListener('message', function(event) {\n  console.log('[SW] on message', event.data)\n  var client = event.ports && event.ports[0] || event.source\n  if (event.data.type == 'ping') {\n    if (event.data.localNotifications) {\n      lastAliveTime = +(new Date())\n      IDBManager.setItem('push_last_alive', lastAliveTime)\n    }\n\n    if (pendingNotification &&\n        client &&\n        'postMessage' in client) {\n      client.postMessage(pendingNotification)\n      pendingNotification = false\n    }\n\n    if (event.data.lang) {\n      lang = event.data.lang\n      IDBManager.setItem('push_lang', lang)\n    }\n    if (event.data.settings) {\n      settings = event.data.settings\n      IDBManager.setItem('push_settings', settings)\n    }\n  }\n  if (event.data.type == 'notifications_clear') {\n    closeAllNotifications()\n  }\n})\n\nfunction fireNotification(obj, settings, lang) {\n  var title = obj.title || 'Telegram'\n  var body = obj.description || ''\n  var icon = 'img/logo_share.png'\n  var peerID\n\n  if (obj.custom && obj.custom.channel_id) {\n    peerID = -obj.custom.channel_id\n  }\n  else if (obj.custom && obj.custom.chat_id) {\n    peerID = -obj.custom.chat_id\n  }\n  else {\n    peerID = obj.custom && obj.custom.from_id || 0\n  }\n  obj.custom.peerID = peerID\n  var tag = 'peer' + peerID\n\n  if (settings && settings.nopreview) {\n    title = 'Telegram'\n    body = lang.push_message_nopreview || 'You have a new message'\n    tag = 'unknown_peer'\n  }\n\n  console.log('[SW] show notify', title, body, icon, obj)\n\n  var notificationPromise = self.registration.showNotification(title, {\n    body: body,\n    icon: icon,\n    tag: tag,\n    data: obj,\n    actions: [\n      {\n        action: 'mute1d',\n        title: lang.push_action_mute1d || 'Mute for 24H'\n      },\n      {\n        action: 'push_settings',\n        title: lang.push_action_settings || 'Settings'\n      }\n    ]\n  })\n\n  return notificationPromise.then(function (event) {\n    if (event && event.notification) {\n      pushToNotifications(event.notification)\n    }\n    return Promise.resolve()\n  }).catch(function (error) {\n    console.error('Show notification promise', error)\n  })\n}\n\n\nvar notifications = []\nfunction pushToNotifications(notification) {\n  if (notifications.indexOf(notification) == -1) {\n    notifications.push(notification)\n    notification.onclose = onCloseNotification\n  }\n}\n\nfunction onCloseNotification(event) {\n  removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification) {\n  var pos = notifications.indexOf(notification)\n  if (pos != -1) {\n    notifications.splice(pos, 1)\n  }\n}\n\nfunction closeAllNotifications() {\n  for (var i = 0, len = notifications.length; i < len; i++) {\n    try {\n      notifications[i].close()\n    } catch (e) {}\n  }\n\n  var promise\n  if ('getNotifications' in self.registration) {\n    promise = self.registration.getNotifications({}).then(function(notifications) {\n      for (var i = 0, len = notifications.length; i < len; i++) {\n        try {\n          notifications[i].close()\n        } catch (e) {}\n      }\n    }).catch(function (error) {\n      console.error('Offline register SW error', error)\n    })\n  } else {\n    promise = Promise.resolve()\n  }\n\n  notifications = []\n\n  return promise\n}\n\n\nself.addEventListener('notificationclick', function(event) {\n  var notification = event.notification\n  console.log('On notification click: ', notification.tag)\n  notification.close()\n\n  var action = event.action\n  if (action == 'mute1d' && userInvisibleIsSupported()) {\n    console.log('[SW] mute for 1d')\n    muteUntil = +(new Date()) + 86400000\n    IDBManager.setItem('push_mute_until', muteUntil)\n    return\n  }\n  if (!notification.data) {\n    return\n  }\n\n  var promise = clients.matchAll({\n    type: 'window'\n  }).then(function(clientList) {\n    notification.data.action = action\n    pendingNotification = {type: 'push_click', data: notification.data}\n    for (var i = 0; i < clientList.length; i++) {\n      var client = clientList[i]\n      if ('focus' in client) {\n        client.focus()\n        client.postMessage(pendingNotification)\n        pendingNotification = false\n        return\n      }\n    }\n    if (clients.openWindow) {\n      return getSettings().then(function (settings) {\n        return clients.openWindow(settings.baseUrl || defaultBaseUrl)\n      })\n    }\n  }).catch(function (error) {\n    console.error('Clients.matchAll error', error)\n  })\n\n  event.waitUntil(promise)\n})\n\nself.addEventListener('notificationclose', onCloseNotification)\n\n\n\n\n;(function () {\n  var dbName = 'keyvalue'\n  var dbStoreName = 'kvItems'\n  var dbVersion = 2\n  var openDbPromise\n  var idbIsAvailable = self.indexedDB !== undefined &&\n    self.IDBTransaction !== undefined\n\n  function isAvailable () {\n    return idbIsAvailable\n  }\n\n  function openDatabase () {\n    if (openDbPromise) {\n      return openDbPromise\n    }\n\n    return openDbPromise = new Promise(function (resolve, reject) {\n      try {\n        var request = indexedDB.open(dbName, dbVersion)\n        var createObjectStore = function (db) {\n          db.createObjectStore(dbStoreName)\n        }\n        if (!request) {\n          return reject()\n        }\n      } catch (error) {\n        console.error('error opening db', error.message)\n        idbIsAvailable = false\n        return reject(error)\n      }\n\n      var finished = false\n      setTimeout(function () {\n        if (!finished) {\n          request.onerror({type: 'IDB_CREATE_TIMEOUT'})\n        }\n      }, 3000)\n\n      request.onsuccess = function (event) {\n        finished = true\n        var db = request.result\n\n        db.onerror = function (error) {\n          idbIsAvailable = false\n          console.error('Error creating/accessing IndexedDB database', error)\n          reject(error)\n        }\n\n        resolve(db)\n      }\n\n      request.onerror = function (event) {\n        finished = true\n        idbIsAvailable = false\n        console.error('Error creating/accessing IndexedDB database', event)\n        reject(event)\n      }\n\n      request.onupgradeneeded = function (event) {\n        finished = true\n        console.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion)\n        var db = event.target.result\n        if (event.oldVersion == 1) {\n          db.deleteObjectStore(dbStoreName)\n        }\n        createObjectStore(db)\n      }\n    })\n  }\n\n  function setItem (key, value) {\n    return openDatabase().then(function (db) {\n      try {\n        var objectStore = db.transaction([dbStoreName], IDBTransaction.READ_WRITE || 'readwrite').objectStore(dbStoreName)\n        var request = objectStore.put(value, key)\n      } catch (error) {\n        idbIsAvailable = false\n        return Promise.reject(error)\n      }\n\n      return new Promise(function(resolve, reject) {\n        request.onsuccess = function (event) {\n          resolve(value)\n        }\n\n        request.onerror = function (error) {\n          reject(error)\n        }\n      })\n    })\n  }\n\n  function getItem (key) {\n    return openDatabase().then(function (db) {\n      return new Promise(function(resolve, reject) {\n        var objectStore = db.transaction([dbStoreName], IDBTransaction.READ || 'readonly').objectStore(dbStoreName)\n        var request = objectStore.get(key)\n\n        request.onsuccess = function (event) {\n          var result = event.target.result\n          if (result === undefined) {\n            resolve()\n          } else {\n            resolve(result)\n          }\n        }\n\n        request.onerror = function (error) {\n          reject(error)\n        }\n      })\n      \n    })\n  }\n\n  openDatabase()\n\n  self.IDBManager = {\n    name: 'IndexedDB',\n    isAvailable: isAvailable,\n    setItem: setItem,\n    getItem: getItem\n  }\n})()\n\n\nvar lastAliveTime, muteUntil, settings, lang\n\nfunction getMuteUntil() {\n  if (muteUntil !== undefined) {\n    return Promise.resolve(muteUntil)\n  }\n  return IDBManager.getItem('push_mute_until').then(function (newMuteUntil) {\n    return muteUntil = Math.max(muteUntil || 0, newMuteUntil || 0) || false\n  }).catch(function (error) {\n    console.error('IDB error', error)\n    return false\n  })\n}\n\nfunction getLastAliveTime() {\n  if (lastAliveTime !== undefined) {\n    return Promise.resolve(lastAliveTime)\n  }\n  return IDBManager.getItem('push_last_alive').then(function (newLastAliveTime) {\n    return lastAliveTime = Math.max(lastAliveTime || 0, newLastAliveTime || 0) || false\n  }).catch(function (error) {\n    console.error('IDB error', error)\n    return false\n  })\n}\n\nfunction getLang() {\n  if (lang !== undefined) {\n    return Promise.resolve(lang)\n  }\n  return IDBManager.getItem('push_lang').then(function (newLang) {\n    return lang = newLang || {}\n  }).catch(function (error) {\n    console.error('IDB error', error)\n    return {}\n  })\n}\n\nfunction getSettings() {\n  if (settings !== undefined) {\n    return Promise.resolve(settings)\n  }\n  return IDBManager.getItem('push_settings').then(function (newSettings) {\n    return settings = newSettings || {}\n  }).catch(function (error) {\n    console.error('IDB error', error)\n    return {}\n  })\n}\n\nfunction userInvisibleIsSupported() {\n  var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1\n  return isFirefox ? true : false\n}\n"
  },
  {
    "path": "app/js/lib/schema.tl",
    "content": "boolFalse#bc799737 = Bool;\nboolTrue#997275b5 = Bool;\n\ntrue#3fedd339 = True;\n\nvector#1cb5c415 {t:Type} # [ t ] = Vector t;\n\nerror#c4b9f9bb code:int text:string = Error;\n\nnull#56730bcc = Null;\n\ninputPeerEmpty#7f3b18ea = InputPeer;\ninputPeerSelf#7da07ec9 = InputPeer;\ninputPeerChat#179be863 chat_id:int = InputPeer;\ninputPeerUser#7b8e7de6 user_id:int access_hash:long = InputPeer;\ninputPeerChannel#20adaef8 channel_id:int access_hash:long = InputPeer;\n\ninputUserEmpty#b98886cf = InputUser;\ninputUserSelf#f7c1b13f = InputUser;\ninputUser#d8292816 user_id:int access_hash:long = InputUser;\n\ninputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;\n\ninputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;\ninputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;\n\ninputMediaEmpty#9664f57f = InputMedia;\ninputMediaUploadedPhoto#2f37e231 flags:# file:InputFile caption:string stickers:flags.0?Vector<InputDocument> ttl_seconds:flags.1?int = InputMedia;\ninputMediaPhoto#81fa373a flags:# id:InputPhoto caption:string ttl_seconds:flags.0?int = InputMedia;\ninputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;\ninputMediaContact#a6e45987 phone_number:string first_name:string last_name:string = InputMedia;\ninputMediaUploadedDocument#e39621fd flags:# nosound_video:flags.3?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector<DocumentAttribute> caption:string stickers:flags.0?Vector<InputDocument> ttl_seconds:flags.1?int = InputMedia;\ninputMediaDocument#5acb668e flags:# id:InputDocument caption:string ttl_seconds:flags.0?int = InputMedia;\ninputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia;\ninputMediaGifExternal#4843b0fd url:string q:string = InputMedia;\ninputMediaPhotoExternal#922aec1 flags:# url:string caption:string ttl_seconds:flags.0?int = InputMedia;\ninputMediaDocumentExternal#b6f74335 flags:# url:string caption:string ttl_seconds:flags.0?int = InputMedia;\ninputMediaGame#d33f43f3 id:InputGame = InputMedia;\ninputMediaInvoice#f4e096c3 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:string = InputMedia;\ninputMediaGeoLive#7b1a118f geo_point:InputGeoPoint period:int = InputMedia;\n\ninputChatPhotoEmpty#1ca48f57 = InputChatPhoto;\ninputChatUploadedPhoto#927c55b4 file:InputFile = InputChatPhoto;\ninputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto;\n\ninputGeoPointEmpty#e4c123d6 = InputGeoPoint;\ninputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;\n\ninputPhotoEmpty#1cd7bf0d = InputPhoto;\ninputPhoto#fb95c6c4 id:long access_hash:long = InputPhoto;\n\ninputFileLocation#14637196 volume_id:long local_id:int secret:long = InputFileLocation;\ninputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;\ninputDocumentFileLocation#430f0724 id:long access_hash:long version:int = InputFileLocation;\n\ninputAppEvent#770656a8 time:double type:string peer:long data:string = InputAppEvent;\n\npeerUser#9db1bc6d user_id:int = Peer;\npeerChat#bad0e5bb chat_id:int = Peer;\npeerChannel#bddde532 channel_id:int = Peer;\n\nstorage.fileUnknown#aa963b05 = storage.FileType;\nstorage.filePartial#40bc6f52 = storage.FileType;\nstorage.fileJpeg#7efe0e = storage.FileType;\nstorage.fileGif#cae1aadf = storage.FileType;\nstorage.filePng#a4f63c0 = storage.FileType;\nstorage.filePdf#ae1e508d = storage.FileType;\nstorage.fileMp3#528a0677 = storage.FileType;\nstorage.fileMov#4b09ebbc = storage.FileType;\nstorage.fileMp4#b3cea0e4 = storage.FileType;\nstorage.fileWebp#1081464c = storage.FileType;\n\nfileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileLocation;\nfileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;\n\nuserEmpty#200250ba id:int = User;\nuser#2e13f4c3 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?string bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User;\n\nuserProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;\nuserProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;\n\nuserStatusEmpty#9d05049 = UserStatus;\nuserStatusOnline#edb93949 expires:int = UserStatus;\nuserStatusOffline#8c703f was_online:int = UserStatus;\nuserStatusRecently#e26f42f1 = UserStatus;\nuserStatusLastWeek#7bf09fc = UserStatus;\nuserStatusLastMonth#77ebc742 = UserStatus;\n\nchatEmpty#9ba2d800 id:int = Chat;\nchat#d91cdd54 flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true admins_enabled:flags.3?true admin:flags.4?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel = Chat;\nchatForbidden#7328bdb id:int title:string = Chat;\nchannel#450b7115 flags:# creator:flags.0?true left:flags.2?true editor:flags.3?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true democracy:flags.10?true signatures:flags.11?true min:flags.12?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?string admin_rights:flags.14?ChannelAdminRights banned_rights:flags.15?ChannelBannedRights participants_count:flags.17?int = Chat;\nchannelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat;\n\nchatFull#2e02a614 id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> = ChatFull;\nchannelFull#76af5481 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int = ChatFull;\n\nchatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;\nchatParticipantCreator#da13538a user_id:int = ChatParticipant;\nchatParticipantAdmin#e2d6e436 user_id:int inviter_id:int date:int = ChatParticipant;\n\nchatParticipantsForbidden#fc900c2b flags:# chat_id:int self_participant:flags.0?ChatParticipant = ChatParticipants;\nchatParticipants#3f460fed chat_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;\n\nchatPhotoEmpty#37c1011c = ChatPhoto;\nchatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;\n\nmessageEmpty#83e5de54 id:int = Message;\nmessage#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;\nmessageService#9e19a1f6 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message;\n\nmessageMediaEmpty#3ded6320 = MessageMedia;\nmessageMediaPhoto#b5223b0f flags:# photo:flags.0?Photo caption:flags.1?string ttl_seconds:flags.2?int = MessageMedia;\nmessageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;\nmessageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;\nmessageMediaUnsupported#9f84f49e = MessageMedia;\nmessageMediaDocument#7c4414d3 flags:# document:flags.0?Document caption:flags.1?string ttl_seconds:flags.2?int = MessageMedia;\nmessageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia;\nmessageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia;\nmessageMediaGame#fdb19008 game:Game = MessageMedia;\nmessageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia;\nmessageMediaGeoLive#7c3c2609 geo:GeoPoint period:int = MessageMedia;\n\nmessageActionEmpty#b6aef7b0 = MessageAction;\nmessageActionChatCreate#a6638b9a title:string users:Vector<int> = MessageAction;\nmessageActionChatEditTitle#b5a1ce5a title:string = MessageAction;\nmessageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;\nmessageActionChatDeletePhoto#95e3fbef = MessageAction;\nmessageActionChatAddUser#488a7337 users:Vector<int> = MessageAction;\nmessageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;\nmessageActionChatJoinedByLink#f89cf5e8 inviter_id:int = MessageAction;\nmessageActionChannelCreate#95d2ac92 title:string = MessageAction;\nmessageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction;\nmessageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction;\nmessageActionPinMessage#94bd38ed = MessageAction;\nmessageActionHistoryClear#9fbab604 = MessageAction;\nmessageActionGameScore#92a72876 game_id:long score:int = MessageAction;\nmessageActionPaymentSentMe#8f31b327 flags:# currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction;\nmessageActionPaymentSent#40699cd0 currency:string total_amount:long = MessageAction;\nmessageActionPhoneCall#80e11a7f flags:# call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction;\nmessageActionScreenshotTaken#4792929b = MessageAction;\nmessageActionCustomAction#fae69f56 message:string = MessageAction;\n\ndialog#e4def5db flags:# pinned:flags.2?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage = Dialog;\n\nphotoEmpty#2331b22d id:long = Photo;\nphoto#9288dd29 flags:# has_stickers:flags.0?true id:long access_hash:long date:int sizes:Vector<PhotoSize> = Photo;\n\nphotoSizeEmpty#e17e23c type:string = PhotoSize;\nphotoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;\nphotoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize;\n\ngeoPointEmpty#1117dd5f = GeoPoint;\ngeoPoint#2049d70c long:double lat:double = GeoPoint;\n\nauth.checkedPhone#811ea28e phone_registered:Bool = auth.CheckedPhone;\n\nauth.sentCode#5e002502 flags:# phone_registered:flags.0?true type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode;\n\nauth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization;\n\nauth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;\n\ninputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;\ninputNotifyUsers#193b4417 = InputNotifyPeer;\ninputNotifyChats#4a95e84e = InputNotifyPeer;\ninputNotifyAll#a429b886 = InputNotifyPeer;\n\ninputPeerNotifyEventsEmpty#f03064d8 = InputPeerNotifyEvents;\ninputPeerNotifyEventsAll#e86a2c74 = InputPeerNotifyEvents;\n\ninputPeerNotifySettings#38935eb2 flags:# show_previews:flags.0?true silent:flags.1?true mute_until:int sound:string = InputPeerNotifySettings;\n\npeerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;\npeerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;\n\npeerNotifySettings#9acda4c0 flags:# show_previews:flags.0?true silent:flags.1?true mute_until:int sound:string = PeerNotifySettings;\n\npeerSettings#818426cd flags:# report_spam:flags.0?true = PeerSettings;\n\nwallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;\nwallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;\n\ninputReportReasonSpam#58dbcab8 = ReportReason;\ninputReportReasonViolence#1e22c78d = ReportReason;\ninputReportReasonPornography#2e59d922 = ReportReason;\ninputReportReasonChildAbuse#adf44ee3 = ReportReason;\ninputReportReasonOther#e1746d0a text:string = ReportReason;\n\nuserFull#f220f3f flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true user:User about:flags.1?string link:contacts.Link profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo common_chats_count:int = UserFull;\n\ncontact#f911c994 user_id:int mutual:Bool = Contact;\n\nimportedContact#d0028438 user_id:int client_id:long = ImportedContact;\n\ncontactBlocked#561bc879 user_id:int date:int = ContactBlocked;\n\ncontactStatus#d3680c61 user_id:int status:UserStatus = ContactStatus;\n\ncontacts.link#3ace484c my_link:ContactLink foreign_link:ContactLink user:User = contacts.Link;\n\ncontacts.contactsNotModified#b74ba9d2 = contacts.Contacts;\ncontacts.contacts#eae87e42 contacts:Vector<Contact> saved_count:int users:Vector<User> = contacts.Contacts;\n\ncontacts.importedContacts#77d01c3b imported:Vector<ImportedContact> popular_invites:Vector<PopularContact> retry_contacts:Vector<long> users:Vector<User> = contacts.ImportedContacts;\n\ncontacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;\ncontacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;\n\nmessages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;\nmessages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;\n\nmessages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;\nmessages.messagesSlice#b446ae3 count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;\nmessages.channelMessages#99262e37 flags:# pts:int count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;\nmessages.messagesNotModified#74535f21 count:int = messages.Messages;\n\nmessages.chats#64ff9fd5 chats:Vector<Chat> = messages.Chats;\nmessages.chatsSlice#9cd81144 count:int chats:Vector<Chat> = messages.Chats;\n\nmessages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector<Chat> users:Vector<User> = messages.ChatFull;\n\nmessages.affectedHistory#b45c69d1 pts:int pts_count:int offset:int = messages.AffectedHistory;\n\ninputMessagesFilterEmpty#57e2f66c = MessagesFilter;\ninputMessagesFilterPhotos#9609a51c = MessagesFilter;\ninputMessagesFilterVideo#9fc00e65 = MessagesFilter;\ninputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;\ninputMessagesFilterDocument#9eddf188 = MessagesFilter;\ninputMessagesFilterUrl#7ef0dd87 = MessagesFilter;\ninputMessagesFilterGif#ffc86587 = MessagesFilter;\ninputMessagesFilterVoice#50f5c392 = MessagesFilter;\ninputMessagesFilterMusic#3751b49e = MessagesFilter;\ninputMessagesFilterChatPhotos#3a20ecb8 = MessagesFilter;\ninputMessagesFilterPhoneCalls#80c99768 flags:# missed:flags.0?true = MessagesFilter;\ninputMessagesFilterRoundVoice#7a7c17a4 = MessagesFilter;\ninputMessagesFilterRoundVideo#b549da53 = MessagesFilter;\ninputMessagesFilterMyMentions#c1f8e69a = MessagesFilter;\ninputMessagesFilterGeo#e7026d0d = MessagesFilter;\ninputMessagesFilterContacts#e062db83 = MessagesFilter;\n\nupdateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update;\nupdateMessageID#4e90bfd6 id:int random_id:long = Update;\nupdateDeleteMessages#a20db0e5 messages:Vector<int> pts:int pts_count:int = Update;\nupdateUserTyping#5c486927 user_id:int action:SendMessageAction = Update;\nupdateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update;\nupdateChatParticipants#7761198 participants:ChatParticipants = Update;\nupdateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;\nupdateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update;\nupdateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;\nupdateContactRegistered#2575bbb9 user_id:int date:int = Update;\nupdateContactLink#9d2e67c5 user_id:int my_link:ContactLink foreign_link:ContactLink = Update;\nupdateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;\nupdateEncryptedChatTyping#1710f156 chat_id:int = Update;\nupdateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;\nupdateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;\nupdateChatParticipantAdd#ea4b0e5c chat_id:int user_id:int inviter_id:int date:int version:int = Update;\nupdateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;\nupdateDcOptions#8e5e9873 dc_options:Vector<DcOption> = Update;\nupdateUserBlocked#80ece81a user_id:int blocked:Bool = Update;\nupdateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;\nupdateServiceNotification#ebe46819 flags:# popup:flags.0?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector<MessageEntity> = Update;\nupdatePrivacy#ee3b272a key:PrivacyKey rules:Vector<PrivacyRule> = Update;\nupdateUserPhone#12b9417b user_id:int phone:string = Update;\nupdateReadHistoryInbox#9961fd5c peer:Peer max_id:int pts:int pts_count:int = Update;\nupdateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update;\nupdateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update;\nupdateReadMessagesContents#68c13933 messages:Vector<int> pts:int pts_count:int = Update;\nupdateChannelTooLong#eb0467fb flags:# channel_id:int pts:flags.0?int = Update;\nupdateChannel#b6d45656 channel_id:int = Update;\nupdateNewChannelMessage#62ba04d9 message:Message pts:int pts_count:int = Update;\nupdateReadChannelInbox#4214f37f channel_id:int max_id:int = Update;\nupdateDeleteChannelMessages#c37521c9 channel_id:int messages:Vector<int> pts:int pts_count:int = Update;\nupdateChannelMessageViews#98a12b4b channel_id:int id:int views:int = Update;\nupdateChatAdmins#6e947941 chat_id:int enabled:Bool version:int = Update;\nupdateChatParticipantAdmin#b6901959 chat_id:int user_id:int is_admin:Bool version:int = Update;\nupdateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update;\nupdateStickerSetsOrder#bb2d201 flags:# masks:flags.0?true order:Vector<long> = Update;\nupdateStickerSets#43ae3dec = Update;\nupdateSavedGifs#9375341e = Update;\nupdateBotInlineQuery#54826690 flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint offset:string = Update;\nupdateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update;\nupdateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update;\nupdateChannelPinnedMessage#98592475 channel_id:int id:int = Update;\nupdateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;\nupdateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update;\nupdateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;\nupdateReadChannelOutbox#25d6c9c7 channel_id:int max_id:int = Update;\nupdateDraftMessage#ee2bb969 peer:Peer draft:DraftMessage = Update;\nupdateReadFeaturedStickers#571d2742 = Update;\nupdateRecentStickers#9a422c20 = Update;\nupdateConfig#a229dd06 = Update;\nupdatePtsChanged#3354678f = Update;\nupdateChannelWebPage#40771900 channel_id:int webpage:WebPage pts:int pts_count:int = Update;\nupdateDialogPinned#d711a2cc flags:# pinned:flags.0?true peer:Peer = Update;\nupdatePinnedDialogs#d8caf68d flags:# order:flags.0?Vector<Peer> = Update;\nupdateBotWebhookJSON#8317c0c3 data:DataJSON = Update;\nupdateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update;\nupdateBotShippingQuery#e0cdc940 query_id:long user_id:int payload:bytes shipping_address:PostAddress = Update;\nupdateBotPrecheckoutQuery#5d2f3aa9 flags:# query_id:long user_id:int payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string currency:string total_amount:long = Update;\nupdatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update;\nupdateLangPackTooLong#10c2404b = Update;\nupdateLangPack#56022f4d difference:LangPackDifference = Update;\nupdateFavedStickers#e511996d = Update;\nupdateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector<int> = Update;\nupdateContactsReset#7084a7be = Update;\nupdateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update;\n\nupdates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;\n\nupdates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;\nupdates.difference#f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;\nupdates.differenceSlice#a8fb1981 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> intermediate_state:updates.State = updates.Difference;\nupdates.differenceTooLong#4afe8f6d pts:int = updates.Difference;\n\nupdatesTooLong#e317af7e = Updates;\nupdateShortMessage#914fbf11 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int entities:flags.7?Vector<MessageEntity> = Updates;\nupdateShortChatMessage#16812688 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int entities:flags.7?Vector<MessageEntity> = Updates;\nupdateShort#78d4dec1 update:Update date:int = Updates;\nupdatesCombined#725b04c3 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq_start:int seq:int = Updates;\nupdates#74ae4240 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq:int = Updates;\nupdateShortSentMessage#11f1331c flags:# out:flags.1?true id:int pts:int pts_count:int date:int media:flags.9?MessageMedia entities:flags.7?Vector<MessageEntity> = Updates;\n\nphotos.photos#8dca6aa5 photos:Vector<Photo> users:Vector<User> = photos.Photos;\nphotos.photosSlice#15051f54 count:int photos:Vector<Photo> users:Vector<User> = photos.Photos;\n\nphotos.photo#20212ca8 photo:Photo users:Vector<User> = photos.Photo;\n\nupload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;\nupload.fileCdnRedirect#ea52fe5a dc_id:int file_token:bytes encryption_key:bytes encryption_iv:bytes cdn_file_hashes:Vector<CdnFileHash> = upload.File;\n\ndcOption#5d8c6cc flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true static:flags.4?true id:int ip_address:string port:int = DcOption;\n\nconfig#9c840964 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:flags.3?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int chat_big_size:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int rating_e_decay:int stickers_recent_limit:int stickers_faved_limit:int channels_read_media_period:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string suggested_lang_code:flags.2?string lang_pack_version:flags.2?int disabled_features:Vector<DisabledFeature> = Config;\n\nnearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;\n\nhelp.appUpdate#8987f311 id:int critical:Bool url:string text:string = help.AppUpdate;\nhelp.noAppUpdate#c45a6536 = help.AppUpdate;\n\nhelp.inviteText#18cb9f78 message:string = help.InviteText;\n\nencryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;\nencryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;\nencryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;\nencryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;\nencryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;\n\ninputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;\n\nencryptedFileEmpty#c21f497e = EncryptedFile;\nencryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;\n\ninputEncryptedFileEmpty#1837c364 = InputEncryptedFile;\ninputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;\ninputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;\ninputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;\n\nencryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;\nencryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;\n\nmessages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;\nmessages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;\n\nmessages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;\nmessages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;\n\ninputDocumentEmpty#72f0eaae = InputDocument;\ninputDocument#18798952 id:long access_hash:long = InputDocument;\n\ndocumentEmpty#36f8c871 id:long = Document;\ndocument#87232bc7 id:long access_hash:long date:int mime_type:string size:int thumb:PhotoSize dc_id:int version:int attributes:Vector<DocumentAttribute> = Document;\n\nhelp.support#17c6b5f6 phone_number:string user:User = help.Support;\n\nnotifyPeer#9fd40bd8 peer:Peer = NotifyPeer;\nnotifyUsers#b4c83b4c = NotifyPeer;\nnotifyChats#c007cec3 = NotifyPeer;\nnotifyAll#74d07c60 = NotifyPeer;\n\nsendMessageTypingAction#16bf744e = SendMessageAction;\nsendMessageCancelAction#fd5ec8f5 = SendMessageAction;\nsendMessageRecordVideoAction#a187d66f = SendMessageAction;\nsendMessageUploadVideoAction#e9763aec progress:int = SendMessageAction;\nsendMessageRecordAudioAction#d52f73f7 = SendMessageAction;\nsendMessageUploadAudioAction#f351d7ab progress:int = SendMessageAction;\nsendMessageUploadPhotoAction#d1d34a26 progress:int = SendMessageAction;\nsendMessageUploadDocumentAction#aa0cd9e4 progress:int = SendMessageAction;\nsendMessageGeoLocationAction#176f8ba1 = SendMessageAction;\nsendMessageChooseContactAction#628cbc6f = SendMessageAction;\nsendMessageGamePlayAction#dd6a8f48 = SendMessageAction;\nsendMessageRecordRoundAction#88f27fbc = SendMessageAction;\nsendMessageUploadRoundAction#243e1c66 progress:int = SendMessageAction;\n\ncontacts.found#b3134d9d my_results:Vector<Peer> results:Vector<Peer> chats:Vector<Chat> users:Vector<User> = contacts.Found;\n\ninputPrivacyKeyStatusTimestamp#4f96cb18 = InputPrivacyKey;\ninputPrivacyKeyChatInvite#bdfb0426 = InputPrivacyKey;\ninputPrivacyKeyPhoneCall#fabadc5f = InputPrivacyKey;\n\nprivacyKeyStatusTimestamp#bc2eab30 = PrivacyKey;\nprivacyKeyChatInvite#500e6dfa = PrivacyKey;\nprivacyKeyPhoneCall#3d662b7b = PrivacyKey;\n\ninputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule;\ninputPrivacyValueAllowAll#184b35ce = InputPrivacyRule;\ninputPrivacyValueAllowUsers#131cc67f users:Vector<InputUser> = InputPrivacyRule;\ninputPrivacyValueDisallowContacts#ba52007 = InputPrivacyRule;\ninputPrivacyValueDisallowAll#d66b66c9 = InputPrivacyRule;\ninputPrivacyValueDisallowUsers#90110467 users:Vector<InputUser> = InputPrivacyRule;\n\nprivacyValueAllowContacts#fffe1bac = PrivacyRule;\nprivacyValueAllowAll#65427b82 = PrivacyRule;\nprivacyValueAllowUsers#4d5bbe0c users:Vector<int> = PrivacyRule;\nprivacyValueDisallowContacts#f888fa1a = PrivacyRule;\nprivacyValueDisallowAll#8b73e763 = PrivacyRule;\nprivacyValueDisallowUsers#c7f49b7 users:Vector<int> = PrivacyRule;\n\naccount.privacyRules#554abb6f rules:Vector<PrivacyRule> users:Vector<User> = account.PrivacyRules;\n\naccountDaysTTL#b8d0afdf days:int = AccountDaysTTL;\n\ndocumentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute;\ndocumentAttributeAnimated#11b58939 = DocumentAttribute;\ndocumentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute;\ndocumentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true supports_streaming:flags.1?true duration:int w:int h:int = DocumentAttribute;\ndocumentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute;\ndocumentAttributeFilename#15590068 file_name:string = DocumentAttribute;\ndocumentAttributeHasStickers#9801d2f7 = DocumentAttribute;\n\nmessages.stickersNotModified#f1749a22 = messages.Stickers;\nmessages.stickers#8a8ecd32 hash:string stickers:Vector<Document> = messages.Stickers;\n\nstickerPack#12b299d4 emoticon:string documents:Vector<long> = StickerPack;\n\nmessages.allStickersNotModified#e86602c3 = messages.AllStickers;\nmessages.allStickers#edfd405f hash:int sets:Vector<StickerSet> = messages.AllStickers;\n\ndisabledFeature#ae636f24 feature:string description:string = DisabledFeature;\n\nmessages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMessages;\n\ncontactLinkUnknown#5f4f9247 = ContactLink;\ncontactLinkNone#feedd3ad = ContactLink;\ncontactLinkHasPhone#268f3f59 = ContactLink;\ncontactLinkContact#d502c2d0 = ContactLink;\n\nwebPageEmpty#eb1477e8 id:long = WebPage;\nwebPagePending#c586da1c id:long date:int = WebPage;\nwebPage#5f07b4bc flags:# id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page = WebPage;\nwebPageNotModified#85849473 = WebPage;\n\nauthorization#7bf2e6f6 hash:long flags:int device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization;\n\naccount.authorizations#1250abde authorizations:Vector<Authorization> = account.Authorizations;\n\naccount.noPassword#96dabc18 new_salt:bytes email_unconfirmed_pattern:string = account.Password;\naccount.password#7c18141c current_salt:bytes new_salt:bytes hint:string has_recovery:Bool email_unconfirmed_pattern:string = account.Password;\n\naccount.passwordSettings#b7b72ab3 email:string = account.PasswordSettings;\n\naccount.passwordInputSettings#86916deb flags:# new_salt:flags.0?bytes new_password_hash:flags.0?bytes hint:flags.0?string email:flags.1?string = account.PasswordInputSettings;\n\nauth.passwordRecovery#137948a5 email_pattern:string = auth.PasswordRecovery;\n\nreceivedNotifyMessage#a384b779 id:int flags:int = ReceivedNotifyMessage;\n\nchatInviteEmpty#69df3769 = ExportedChatInvite;\nchatInviteExported#fc2e05bc link:string = ExportedChatInvite;\n\nchatInviteAlready#5a686d7c chat:Chat = ChatInvite;\nchatInvite#db74f558 flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true title:string photo:ChatPhoto participants_count:int participants:flags.4?Vector<User> = ChatInvite;\n\ninputStickerSetEmpty#ffb62b95 = InputStickerSet;\ninputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet;\ninputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet;\n\nstickerSet#cd303b41 flags:# installed:flags.0?true archived:flags.1?true official:flags.2?true masks:flags.3?true id:long access_hash:long title:string short_name:string count:int hash:int = StickerSet;\n\nmessages.stickerSet#b60a24a6 set:StickerSet packs:Vector<StickerPack> documents:Vector<Document> = messages.StickerSet;\n\nbotCommand#c27ac8c7 command:string description:string = BotCommand;\n\nbotInfo#98e81d3a user_id:int description:string commands:Vector<BotCommand> = BotInfo;\n\nkeyboardButton#a2fa4880 text:string = KeyboardButton;\nkeyboardButtonUrl#258aff05 text:string url:string = KeyboardButton;\nkeyboardButtonCallback#683a5e46 text:string data:bytes = KeyboardButton;\nkeyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton;\nkeyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton;\nkeyboardButtonSwitchInline#568a748 flags:# same_peer:flags.0?true text:string query:string = KeyboardButton;\nkeyboardButtonGame#50f41ccf text:string = KeyboardButton;\nkeyboardButtonBuy#afd93fbb text:string = KeyboardButton;\n\nkeyboardButtonRow#77608b83 buttons:Vector<KeyboardButton> = KeyboardButtonRow;\n\nreplyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup;\nreplyKeyboardForceReply#f4108aa0 flags:# single_use:flags.1?true selective:flags.2?true = ReplyMarkup;\nreplyKeyboardMarkup#3502758c flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true rows:Vector<KeyboardButtonRow> = ReplyMarkup;\nreplyInlineMarkup#48a30254 rows:Vector<KeyboardButtonRow> = ReplyMarkup;\n\nmessageEntityUnknown#bb92ba95 offset:int length:int = MessageEntity;\nmessageEntityMention#fa04579d offset:int length:int = MessageEntity;\nmessageEntityHashtag#6f635b0d offset:int length:int = MessageEntity;\nmessageEntityBotCommand#6cef8ac7 offset:int length:int = MessageEntity;\nmessageEntityUrl#6ed02538 offset:int length:int = MessageEntity;\nmessageEntityEmail#64e475c2 offset:int length:int = MessageEntity;\nmessageEntityBold#bd610bc9 offset:int length:int = MessageEntity;\nmessageEntityItalic#826f8b60 offset:int length:int = MessageEntity;\nmessageEntityCode#28a20571 offset:int length:int = MessageEntity;\nmessageEntityPre#73924be0 offset:int length:int language:string = MessageEntity;\nmessageEntityTextUrl#76a6d327 offset:int length:int url:string = MessageEntity;\nmessageEntityMentionName#352dca58 offset:int length:int user_id:int = MessageEntity;\ninputMessageEntityMentionName#208e68c9 offset:int length:int user_id:InputUser = MessageEntity;\n\ninputChannelEmpty#ee8c1e86 = InputChannel;\ninputChannel#afeb712e channel_id:int access_hash:long = InputChannel;\n\ncontacts.resolvedPeer#7f077ad9 peer:Peer chats:Vector<Chat> users:Vector<User> = contacts.ResolvedPeer;\n\nmessageRange#ae30253 min_id:int max_id:int = MessageRange;\n\nupdates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int = updates.ChannelDifference;\nupdates.channelDifferenceTooLong#6a9d7b35 flags:# final:flags.0?true pts:int timeout:flags.1?int top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = updates.ChannelDifference;\nupdates.channelDifference#2064674e flags:# final:flags.0?true pts:int timeout:flags.1?int new_messages:Vector<Message> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> = updates.ChannelDifference;\n\nchannelMessagesFilterEmpty#94d42ee7 = ChannelMessagesFilter;\nchannelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges:Vector<MessageRange> = ChannelMessagesFilter;\n\nchannelParticipant#15ebac1d user_id:int date:int = ChannelParticipant;\nchannelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant;\nchannelParticipantCreator#e3e2e1f9 user_id:int = ChannelParticipant;\nchannelParticipantAdmin#a82fa898 flags:# can_edit:flags.0?true user_id:int inviter_id:int promoted_by:int date:int admin_rights:ChannelAdminRights = ChannelParticipant;\nchannelParticipantBanned#222c1886 flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChannelBannedRights = ChannelParticipant;\n\nchannelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter;\nchannelParticipantsAdmins#b4608969 = ChannelParticipantsFilter;\nchannelParticipantsKicked#a3b54985 q:string = ChannelParticipantsFilter;\nchannelParticipantsBots#b0d1865b = ChannelParticipantsFilter;\nchannelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter;\nchannelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter;\n\nchannels.channelParticipants#f56ee2a8 count:int participants:Vector<ChannelParticipant> users:Vector<User> = channels.ChannelParticipants;\nchannels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants;\n\nchannels.channelParticipant#d0d9b163 participant:ChannelParticipant users:Vector<User> = channels.ChannelParticipant;\n\nhelp.termsOfService#f1ee3e90 text:string = help.TermsOfService;\n\nfoundGif#162ecc1f url:string thumb_url:string content_url:string content_type:string w:int h:int = FoundGif;\nfoundGifCached#9c750409 url:string photo:Photo document:Document = FoundGif;\n\nmessages.foundGifs#450a1c0a next_offset:int results:Vector<FoundGif> = messages.FoundGifs;\n\nmessages.savedGifsNotModified#e8025ca2 = messages.SavedGifs;\nmessages.savedGifs#2e0709a5 hash:int gifs:Vector<Document> = messages.SavedGifs;\n\ninputBotInlineMessageMediaAuto#292fed13 flags:# caption:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaGeo#c1b15d65 flags:# geo_point:InputGeoPoint period:int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaVenue#aaafadc8 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaContact#2daf01a7 flags:# phone_number:string first_name:string last_name:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\n\ninputBotInlineResult#2cbbe15a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb_url:flags.4?string content_url:flags.5?string content_type:flags.5?string w:flags.6?int h:flags.6?int duration:flags.7?int send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultPhoto#a8d864a7 id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultDocument#fff8fdc4 flags:# id:string type:string title:flags.1?string description:flags.2?string document:InputDocument send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:InputBotInlineMessage = InputBotInlineResult;\n\nbotInlineMessageMediaAuto#a74b15b flags:# caption:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaGeo#b722de65 flags:# geo:GeoPoint period:int reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaVenue#4366232e flags:# geo:GeoPoint title:string address:string provider:string venue_id:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaContact#35edb4d4 flags:# phone_number:string first_name:string last_name:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\n\nbotInlineResult#9bebaeb9 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb_url:flags.4?string content_url:flags.5?string content_type:flags.5?string w:flags.6?int h:flags.6?int duration:flags.7?int send_message:BotInlineMessage = BotInlineResult;\nbotInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult;\n\nmessages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector<BotInlineResult> cache_time:int users:Vector<User> = messages.BotResults;\n\nexportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink;\n\nmessageFwdHeader#559ebe6d flags:# from_id:flags.0?int date:int channel_id:flags.1?int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int = MessageFwdHeader;\n\nauth.codeTypeSms#72a3158c = auth.CodeType;\nauth.codeTypeCall#741cd3e3 = auth.CodeType;\nauth.codeTypeFlashCall#226ccefb = auth.CodeType;\n\nauth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType;\nauth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType;\nauth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType;\nauth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType;\n\nmessages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer;\n\nmessages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData;\n\ninputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID;\n\ninlineBotSwitchPM#3c20629f text:string start_param:string = InlineBotSwitchPM;\n\nmessages.peerDialogs#3371c354 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> state:updates.State = messages.PeerDialogs;\n\ntopPeer#edcdc05b peer:Peer rating:double = TopPeer;\n\ntopPeerCategoryBotsPM#ab661b5b = TopPeerCategory;\ntopPeerCategoryBotsInline#148677e2 = TopPeerCategory;\ntopPeerCategoryCorrespondents#637b7ed = TopPeerCategory;\ntopPeerCategoryGroups#bd17a14a = TopPeerCategory;\ntopPeerCategoryChannels#161d9628 = TopPeerCategory;\ntopPeerCategoryPhoneCalls#1e76a78c = TopPeerCategory;\n\ntopPeerCategoryPeers#fb834291 category:TopPeerCategory count:int peers:Vector<TopPeer> = TopPeerCategoryPeers;\n\ncontacts.topPeersNotModified#de266ef5 = contacts.TopPeers;\ncontacts.topPeers#70b772a8 categories:Vector<TopPeerCategoryPeers> chats:Vector<Chat> users:Vector<User> = contacts.TopPeers;\n\ndraftMessageEmpty#ba4baec5 = DraftMessage;\ndraftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector<MessageEntity> date:int = DraftMessage;\n\nmessages.featuredStickersNotModified#4ede3cf = messages.FeaturedStickers;\nmessages.featuredStickers#f89d88e5 hash:int sets:Vector<StickerSetCovered> unread:Vector<long> = messages.FeaturedStickers;\n\nmessages.recentStickersNotModified#b17f890 = messages.RecentStickers;\nmessages.recentStickers#5ce20970 hash:int stickers:Vector<Document> = messages.RecentStickers;\n\nmessages.archivedStickers#4fcba9c8 count:int sets:Vector<StickerSetCovered> = messages.ArchivedStickers;\n\nmessages.stickerSetInstallResultSuccess#38641628 = messages.StickerSetInstallResult;\nmessages.stickerSetInstallResultArchive#35e410a8 sets:Vector<StickerSetCovered> = messages.StickerSetInstallResult;\n\nstickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered;\nstickerSetMultiCovered#3407e51b set:StickerSet covers:Vector<Document> = StickerSetCovered;\n\nmaskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords;\n\ninputStickeredMediaPhoto#4a992157 id:InputPhoto = InputStickeredMedia;\ninputStickeredMediaDocument#438865b id:InputDocument = InputStickeredMedia;\n\ngame#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game;\n\ninputGameID#32c3e77 id:long access_hash:long = InputGame;\ninputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame;\n\nhighScore#58fffcd0 pos:int user_id:int score:int = HighScore;\n\nmessages.highScores#9a3bfd99 scores:Vector<HighScore> users:Vector<User> = messages.HighScores;\n\ntextEmpty#dc3d824f = RichText;\ntextPlain#744694e0 text:string = RichText;\ntextBold#6724abc4 text:RichText = RichText;\ntextItalic#d912a59c text:RichText = RichText;\ntextUnderline#c12622c4 text:RichText = RichText;\ntextStrike#9bf8bb95 text:RichText = RichText;\ntextFixed#6c3f19b9 text:RichText = RichText;\ntextUrl#3c2884c1 text:RichText url:string webpage_id:long = RichText;\ntextEmail#de5a0dd6 text:RichText email:string = RichText;\ntextConcat#7e6260d7 texts:Vector<RichText> = RichText;\n\npageBlockUnsupported#13567e8a = PageBlock;\npageBlockTitle#70abc3fd text:RichText = PageBlock;\npageBlockSubtitle#8ffa9a1f text:RichText = PageBlock;\npageBlockAuthorDate#baafe5e0 author:RichText published_date:int = PageBlock;\npageBlockHeader#bfd064ec text:RichText = PageBlock;\npageBlockSubheader#f12bb6e1 text:RichText = PageBlock;\npageBlockParagraph#467a0766 text:RichText = PageBlock;\npageBlockPreformatted#c070d93e text:RichText language:string = PageBlock;\npageBlockFooter#48870999 text:RichText = PageBlock;\npageBlockDivider#db20b188 = PageBlock;\npageBlockAnchor#ce0d37b0 name:string = PageBlock;\npageBlockList#3a58c7f4 ordered:Bool items:Vector<RichText> = PageBlock;\npageBlockBlockquote#263d7c26 text:RichText caption:RichText = PageBlock;\npageBlockPullquote#4f4456d3 text:RichText caption:RichText = PageBlock;\npageBlockPhoto#e9c69982 photo_id:long caption:RichText = PageBlock;\npageBlockVideo#d9d71866 flags:# autoplay:flags.0?true loop:flags.1?true video_id:long caption:RichText = PageBlock;\npageBlockCover#39f23300 cover:PageBlock = PageBlock;\npageBlockEmbed#cde200d1 flags:# full_width:flags.0?true allow_scrolling:flags.3?true url:flags.1?string html:flags.2?string poster_photo_id:flags.4?long w:int h:int caption:RichText = PageBlock;\npageBlockEmbedPost#292c7be9 url:string webpage_id:long author_photo_id:long author:string date:int blocks:Vector<PageBlock> caption:RichText = PageBlock;\npageBlockCollage#8b31c4f items:Vector<PageBlock> caption:RichText = PageBlock;\npageBlockSlideshow#130c8963 items:Vector<PageBlock> caption:RichText = PageBlock;\npageBlockChannel#ef1751b5 channel:Chat = PageBlock;\npageBlockAudio#31b81a7f audio_id:long caption:RichText = PageBlock;\n\npagePart#8e3f9ebe blocks:Vector<PageBlock> photos:Vector<Photo> documents:Vector<Document> = Page;\npageFull#556ec7aa blocks:Vector<PageBlock> photos:Vector<Photo> documents:Vector<Document> = Page;\n\nphoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason;\nphoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason;\nphoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason;\nphoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason;\n\ndataJSON#7d748d04 data:string = DataJSON;\n\nlabeledPrice#cb296bf8 label:string amount:long = LabeledPrice;\n\ninvoice#c30aa358 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true currency:string prices:Vector<LabeledPrice> = Invoice;\n\npaymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge;\n\npostAddress#1e8caaeb street_line1:string street_line2:string city:string state:string country_iso2:string post_code:string = PostAddress;\n\npaymentRequestedInfo#909c3f94 flags:# name:flags.0?string phone:flags.1?string email:flags.2?string shipping_address:flags.3?PostAddress = PaymentRequestedInfo;\n\npaymentSavedCredentialsCard#cdc27a1f id:string title:string = PaymentSavedCredentials;\n\nwebDocument#c61acbd8 url:string access_hash:long size:int mime_type:string attributes:Vector<DocumentAttribute> dc_id:int = WebDocument;\n\ninputWebDocument#9bed434d url:string size:int mime_type:string attributes:Vector<DocumentAttribute> = InputWebDocument;\n\ninputWebFileLocation#c239d686 url:string access_hash:long = InputWebFileLocation;\n\nupload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile;\n\npayments.paymentForm#3f56aea3 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true bot_id:int invoice:Invoice provider_id:int url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector<User> = payments.PaymentForm;\n\npayments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector<ShippingOption> = payments.ValidatedRequestedInfo;\n\npayments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult;\npayments.paymentVerficationNeeded#6b56b921 url:string = payments.PaymentResult;\n\npayments.paymentReceipt#500911e1 flags:# date:int bot_id:int invoice:Invoice provider_id:int info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption currency:string total_amount:long credentials_title:string users:Vector<User> = payments.PaymentReceipt;\n\npayments.savedInfo#fb8fe43c flags:# has_saved_credentials:flags.1?true saved_info:flags.0?PaymentRequestedInfo = payments.SavedInfo;\n\ninputPaymentCredentialsSaved#c10eb2cf id:string tmp_password:bytes = InputPaymentCredentials;\ninputPaymentCredentials#3417d728 flags:# save:flags.0?true data:DataJSON = InputPaymentCredentials;\ninputPaymentCredentialsApplePay#aa1c39f payment_data:DataJSON = InputPaymentCredentials;\ninputPaymentCredentialsAndroidPay#ca05d50e payment_token:DataJSON google_transaction_id:string = InputPaymentCredentials;\n\naccount.tmpPassword#db64fd34 tmp_password:bytes valid_until:int = account.TmpPassword;\n\nshippingOption#b6213cdf id:string title:string prices:Vector<LabeledPrice> = ShippingOption;\n\ninputStickerSetItem#ffa0a496 flags:# document:InputDocument emoji:string mask_coords:flags.0?MaskCoords = InputStickerSetItem;\n\ninputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall;\n\nphoneCallEmpty#5366c915 id:long = PhoneCall;\nphoneCallWaiting#1b8f4ad1 flags:# id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;\nphoneCallRequested#83761ce4 id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;\nphoneCallAccepted#6d003d3f id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall;\nphoneCall#ffe6ab67 id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connection:PhoneConnection alternative_connections:Vector<PhoneConnection> start_date:int = PhoneCall;\nphoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;\n\nphoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection;\n\nphoneCallProtocol#a2bb35cb flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int = PhoneCallProtocol;\n\nphone.phoneCall#ec82e140 phone_call:PhoneCall users:Vector<User> = phone.PhoneCall;\n\nupload.cdnFileReuploadNeeded#eea8e46e request_token:bytes = upload.CdnFile;\nupload.cdnFile#a99fca4f bytes:bytes = upload.CdnFile;\n\ncdnPublicKey#c982eaba dc_id:int public_key:string = CdnPublicKey;\n\ncdnConfig#5725e40a public_keys:Vector<CdnPublicKey> = CdnConfig;\n\nlangPackString#cad181f6 key:string value:string = LangPackString;\nlangPackStringPluralized#6c47ac9f flags:# key:string zero_value:flags.0?string one_value:flags.1?string two_value:flags.2?string few_value:flags.3?string many_value:flags.4?string other_value:string = LangPackString;\nlangPackStringDeleted#2979eeb2 key:string = LangPackString;\n\nlangPackDifference#f385c1f6 lang_code:string from_version:int version:int strings:Vector<LangPackString> = LangPackDifference;\n\nlangPackLanguage#117698f1 name:string native_name:string lang_code:string = LangPackLanguage;\n\nchannelAdminRights#5d7ceba5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true invite_link:flags.6?true pin_messages:flags.7?true add_admins:flags.9?true manage_call:flags.10?true = ChannelAdminRights;\n\nchannelBannedRights#58cf4249 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true until_date:int = ChannelBannedRights;\n\nchannelAdminLogEventActionChangeTitle#e6dfb825 prev_value:string new_value:string = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeAbout#55188a2e prev_value:string new_value:string = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeUsername#6a4afc38 prev_value:string new_value:string = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangePhoto#b82f55c3 prev_photo:ChatPhoto new_photo:ChatPhoto = ChannelAdminLogEventAction;\nchannelAdminLogEventActionToggleInvites#1b7907ae new_value:Bool = ChannelAdminLogEventAction;\nchannelAdminLogEventActionToggleSignatures#26ae0971 new_value:Bool = ChannelAdminLogEventAction;\nchannelAdminLogEventActionUpdatePinned#e9e82c18 message:Message = ChannelAdminLogEventAction;\nchannelAdminLogEventActionEditMessage#709b2405 prev_message:Message new_message:Message = ChannelAdminLogEventAction;\nchannelAdminLogEventActionDeleteMessage#42e047bb message:Message = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantJoin#183040d3 = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantLeave#f89777f2 = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantInvite#e31c34d8 participant:ChannelParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantToggleBan#e6d83d7e prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantToggleAdmin#d5676710 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeStickerSet#b1c3caa7 prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction;\nchannelAdminLogEventActionTogglePreHistoryHidden#5f5c95f1 new_value:Bool = ChannelAdminLogEventAction;\n\nchannelAdminLogEvent#3b5a3e40 id:long date:int user_id:int action:ChannelAdminLogEventAction = ChannelAdminLogEvent;\n\nchannels.adminLogResults#ed8af74d events:Vector<ChannelAdminLogEvent> chats:Vector<Chat> users:Vector<User> = channels.AdminLogResults;\n\nchannelAdminLogEventsFilter#ea107ae4 flags:# join:flags.0?true leave:flags.1?true invite:flags.2?true ban:flags.3?true unban:flags.4?true kick:flags.5?true unkick:flags.6?true promote:flags.7?true demote:flags.8?true info:flags.9?true settings:flags.10?true pinned:flags.11?true edit:flags.12?true delete:flags.13?true = ChannelAdminLogEventsFilter;\n\npopularContact#5ce14175 client_id:long importers:int = PopularContact;\n\ncdnFileHash#77eec38f offset:int limit:int hash:bytes = CdnFileHash;\n\nmessages.favedStickersNotModified#9e8fa6d3 = messages.FavedStickers;\nmessages.favedStickers#f37f2f16 hash:int packs:Vector<StickerPack> stickers:Vector<Document> = messages.FavedStickers;\n\nrecentMeUrlUnknown#46e1d13d url:string = RecentMeUrl;\nrecentMeUrlUser#8dbc3336 url:string user_id:int = RecentMeUrl;\nrecentMeUrlChat#a01b22f9 url:string chat_id:int = RecentMeUrl;\nrecentMeUrlChatInvite#eb49081d url:string chat_invite:ChatInvite = RecentMeUrl;\nrecentMeUrlStickerSet#bc0a57dc url:string set:StickerSetCovered = RecentMeUrl;\n\nhelp.recentMeUrls#e0310d7 urls:Vector<RecentMeUrl> chats:Vector<Chat> users:Vector<User> = help.RecentMeUrls;\n\ninputSingleMedia#5eaa7809 media:InputMedia random_id:long = InputSingleMedia;\n\n---functions---\n\ninvokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;\ninvokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector<long> query:!X = X;\ninitConnection#c7481da6 {X:Type} api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string query:!X = X;\ninvokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X;\ninvokeWithoutUpdates#bf9459b7 {X:Type} query:!X = X;\n\nauth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone;\nauth.sendCode#86aef0ec flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool api_id:int api_hash:string = auth.SentCode;\nauth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization;\nauth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;\nauth.logOut#5717da40 = Bool;\nauth.resetAuthorizations#9fab0d1a = Bool;\nauth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;\nauth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;\nauth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;\nauth.importBotAuthorization#67a3ff2c flags:int api_id:int api_hash:string bot_auth_token:string = auth.Authorization;\nauth.checkPassword#a63011e password_hash:bytes = auth.Authorization;\nauth.requestPasswordRecovery#d897bc66 = auth.PasswordRecovery;\nauth.recoverPassword#4ea56e92 code:string = auth.Authorization;\nauth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentCode;\nauth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool;\nauth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector<long> = Bool;\n\naccount.registerDevice#1389cc token_type:int token:string app_sandbox:Bool other_uids:Vector<int> = Bool;\naccount.unregisterDevice#3076c4bf token_type:int token:string other_uids:Vector<int> = Bool;\naccount.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;\naccount.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;\naccount.resetNotifySettings#db7e1747 = Bool;\naccount.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User;\naccount.updateStatus#6628562c offline:Bool = Bool;\naccount.getWallPapers#c04cfac2 = Vector<WallPaper>;\naccount.reportPeer#ae189d5f peer:InputPeer reason:ReportReason = Bool;\naccount.checkUsername#2714d86c username:string = Bool;\naccount.updateUsername#3e0bdd7c username:string = User;\naccount.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules;\naccount.setPrivacy#c9f81ce8 key:InputPrivacyKey rules:Vector<InputPrivacyRule> = account.PrivacyRules;\naccount.deleteAccount#418d4e0b reason:string = Bool;\naccount.getAccountTTL#8fc711d = AccountDaysTTL;\naccount.setAccountTTL#2442485e ttl:AccountDaysTTL = Bool;\naccount.sendChangePhoneCode#8e57deb flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool = auth.SentCode;\naccount.changePhone#70c32edb phone_number:string phone_code_hash:string phone_code:string = User;\naccount.updateDeviceLocked#38df3532 period:int = Bool;\naccount.getAuthorizations#e320c158 = account.Authorizations;\naccount.resetAuthorization#df77f3bc hash:long = Bool;\naccount.getPassword#548a30f5 = account.Password;\naccount.getPasswordSettings#bc8d11bb current_password_hash:bytes = account.PasswordSettings;\naccount.updatePasswordSettings#fa7c4b86 current_password_hash:bytes new_settings:account.PasswordInputSettings = Bool;\naccount.sendConfirmPhoneCode#1516d7bd flags:# allow_flashcall:flags.0?true hash:string current_number:flags.0?Bool = auth.SentCode;\naccount.confirmPhone#5f2178c3 phone_code_hash:string phone_code:string = Bool;\naccount.getTmpPassword#4a82327e password_hash:bytes period:int = account.TmpPassword;\n\nusers.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;\nusers.getFullUser#ca30a5b1 id:InputUser = UserFull;\n\ncontacts.getStatuses#c4a353ee = Vector<ContactStatus>;\ncontacts.getContacts#c023849f hash:int = contacts.Contacts;\ncontacts.importContacts#2c800be5 contacts:Vector<InputContact> = contacts.ImportedContacts;\ncontacts.deleteContact#8e953744 id:InputUser = contacts.Link;\ncontacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;\ncontacts.block#332b49fc id:InputUser = Bool;\ncontacts.unblock#e54100bd id:InputUser = Bool;\ncontacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;\ncontacts.exportCard#84e53737 = Vector<int>;\ncontacts.importCard#4fe196fe export_card:Vector<int> = User;\ncontacts.search#11f812d8 q:string limit:int = contacts.Found;\ncontacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer;\ncontacts.getTopPeers#d4982db5 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true phone_calls:flags.3?true groups:flags.10?true channels:flags.15?true offset:int limit:int hash:int = contacts.TopPeers;\ncontacts.resetTopPeerRating#1ae373ac category:TopPeerCategory peer:InputPeer = Bool;\ncontacts.resetSaved#879537f1 = Bool;\n\nmessages.getMessages#4222fa74 id:Vector<int> = messages.Messages;\nmessages.getDialogs#191ba9c5 flags:# exclude_pinned:flags.0?true offset_date:int offset_id:int offset_peer:InputPeer limit:int = messages.Dialogs;\nmessages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;\nmessages.search#39e9ea0 flags:# peer:InputPeer q:string from_id:flags.0?InputUser filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;\nmessages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages;\nmessages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true peer:InputPeer max_id:int = messages.AffectedHistory;\nmessages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector<int> = messages.AffectedMessages;\nmessages.receivedMessages#5a954c0 max_id:int = Vector<ReceivedNotifyMessage>;\nmessages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool;\nmessages.sendMessage#fa88427a flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> = Updates;\nmessages.sendMedia#c8f16791 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia random_id:long reply_markup:flags.2?ReplyMarkup = Updates;\nmessages.forwardMessages#708e0195 flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true grouped:flags.9?true from_peer:InputPeer id:Vector<int> random_id:Vector<long> to_peer:InputPeer = Updates;\nmessages.reportSpam#cf1592db peer:InputPeer = Bool;\nmessages.hideReportSpam#a8f1709b peer:InputPeer = Bool;\nmessages.getPeerSettings#3672e09c peer:InputPeer = PeerSettings;\nmessages.report#bd82b658 peer:InputPeer id:Vector<int> reason:ReportReason = Bool;\nmessages.getChats#3c6aa187 id:Vector<int> = messages.Chats;\nmessages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;\nmessages.editChatTitle#dc452855 chat_id:int title:string = Updates;\nmessages.editChatPhoto#ca4c79d8 chat_id:int photo:InputChatPhoto = Updates;\nmessages.addChatUser#f9a0aa09 chat_id:int user_id:InputUser fwd_limit:int = Updates;\nmessages.deleteChatUser#e0611f16 chat_id:int user_id:InputUser = Updates;\nmessages.createChat#9cb126e users:Vector<InputUser> title:string = Updates;\nmessages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;\nmessages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;\nmessages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;\nmessages.discardEncryption#edd923c5 chat_id:int = Bool;\nmessages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool;\nmessages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool;\nmessages.sendEncrypted#a9776773 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;\nmessages.sendEncryptedFile#9a901b66 peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage;\nmessages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;\nmessages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;\nmessages.reportEncryptedSpam#4b0c8c0f peer:InputEncryptedChat = Bool;\nmessages.readMessageContents#36a73f77 id:Vector<int> = messages.AffectedMessages;\nmessages.getStickers#ae22e045 emoticon:string hash:string = messages.Stickers;\nmessages.getAllStickers#1c9618b1 hash:int = messages.AllStickers;\nmessages.getWebPagePreview#25223e24 message:string = MessageMedia;\nmessages.exportChatInvite#7d885289 chat_id:int = ExportedChatInvite;\nmessages.checkChatInvite#3eadb1bb hash:string = ChatInvite;\nmessages.importChatInvite#6c50051c hash:string = Updates;\nmessages.getStickerSet#2619a90e stickerset:InputStickerSet = messages.StickerSet;\nmessages.installStickerSet#c78fe460 stickerset:InputStickerSet archived:Bool = messages.StickerSetInstallResult;\nmessages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool;\nmessages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_param:string = Updates;\nmessages.getMessagesViews#c4c8a55d peer:InputPeer id:Vector<int> increment:Bool = Vector<int>;\nmessages.toggleChatAdmins#ec8bd9e1 chat_id:int enabled:Bool = Updates;\nmessages.editChatAdmin#a9e69f2e chat_id:int user_id:InputUser is_admin:Bool = Bool;\nmessages.migrateChat#15a3b8e3 chat_id:int = Updates;\nmessages.searchGlobal#9e3cacb0 q:string offset_date:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;\nmessages.reorderStickerSets#78337739 flags:# masks:flags.0?true order:Vector<long> = Bool;\nmessages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document;\nmessages.searchGifs#bf9a776b q:string offset:int = messages.FoundGifs;\nmessages.getSavedGifs#83bf3d52 hash:int = messages.SavedGifs;\nmessages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool;\nmessages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults;\nmessages.setInlineBotResults#eb5ea206 flags:# gallery:flags.0?true private:flags.1?true query_id:long results:Vector<InputBotInlineResult> cache_time:int next_offset:flags.2?string switch_pm:flags.3?InlineBotSwitchPM = Bool;\nmessages.sendInlineBotResult#b16e06fe flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int random_id:long query_id:long id:string = Updates;\nmessages.getMessageEditData#fda68d36 peer:InputPeer id:int = messages.MessageEditData;\nmessages.editMessage#5d1b8dd flags:# no_webpage:flags.1?true stop_geo_live:flags.12?true peer:InputPeer id:int message:flags.11?string reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> geo_point:flags.13?InputGeoPoint = Updates;\nmessages.editInlineBotMessage#b0e08243 flags:# no_webpage:flags.1?true stop_geo_live:flags.12?true id:InputBotInlineMessageID message:flags.11?string reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> geo_point:flags.13?InputGeoPoint = Bool;\nmessages.getBotCallbackAnswer#810a9fec flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes = messages.BotCallbackAnswer;\nmessages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool;\nmessages.getPeerDialogs#2d9776b9 peers:Vector<InputPeer> = messages.PeerDialogs;\nmessages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector<MessageEntity> = Bool;\nmessages.getAllDrafts#6a3f8d65 = Updates;\nmessages.getFeaturedStickers#2dacca4f hash:int = messages.FeaturedStickers;\nmessages.readFeaturedStickers#5b118126 id:Vector<long> = Bool;\nmessages.getRecentStickers#5ea192c9 flags:# attached:flags.0?true hash:int = messages.RecentStickers;\nmessages.saveRecentSticker#392718f8 flags:# attached:flags.0?true id:InputDocument unsave:Bool = Bool;\nmessages.clearRecentStickers#8999602d flags:# attached:flags.0?true = Bool;\nmessages.getArchivedStickers#57f17692 flags:# masks:flags.0?true offset_id:long limit:int = messages.ArchivedStickers;\nmessages.getMaskStickers#65b8c79f hash:int = messages.AllStickers;\nmessages.getAttachedStickers#cc5b67cc media:InputStickeredMedia = Vector<StickerSetCovered>;\nmessages.setGameScore#8ef8ecc0 flags:# edit_message:flags.0?true force:flags.1?true peer:InputPeer id:int user_id:InputUser score:int = Updates;\nmessages.setInlineGameScore#15ad9f64 flags:# edit_message:flags.0?true force:flags.1?true id:InputBotInlineMessageID user_id:InputUser score:int = Bool;\nmessages.getGameHighScores#e822649d peer:InputPeer id:int user_id:InputUser = messages.HighScores;\nmessages.getInlineGameHighScores#f635e1b id:InputBotInlineMessageID user_id:InputUser = messages.HighScores;\nmessages.getCommonChats#d0a48c4 user_id:InputUser max_id:int limit:int = messages.Chats;\nmessages.getAllChats#eba80ff0 except_ids:Vector<int> = messages.Chats;\nmessages.getWebPage#32ca8f91 url:string hash:int = WebPage;\nmessages.toggleDialogPin#3289be6a flags:# pinned:flags.0?true peer:InputPeer = Bool;\nmessages.reorderPinnedDialogs#959ff644 flags:# force:flags.0?true order:Vector<InputPeer> = Bool;\nmessages.getPinnedDialogs#e254d64e = messages.PeerDialogs;\nmessages.setBotShippingResults#e5f672fa flags:# query_id:long error:flags.0?string shipping_options:flags.1?Vector<ShippingOption> = Bool;\nmessages.setBotPrecheckoutResults#9c2dd95 flags:# success:flags.1?true query_id:long error:flags.0?string = Bool;\nmessages.uploadMedia#519bc2b1 peer:InputPeer media:InputMedia = MessageMedia;\nmessages.sendScreenshotNotification#c97df020 peer:InputPeer reply_to_msg_id:int random_id:long = Updates;\nmessages.getFavedStickers#21ce0b0e hash:int = messages.FavedStickers;\nmessages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool;\nmessages.getUnreadMentions#46578472 peer:InputPeer offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;\nmessages.readMentions#f0189d3 peer:InputPeer = messages.AffectedHistory;\nmessages.getRecentLocations#249431e2 peer:InputPeer limit:int = messages.Messages;\nmessages.sendMultiMedia#2095512f flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector<InputSingleMedia> = Updates;\nmessages.uploadEncryptedFile#5057c497 peer:InputEncryptedChat file:InputEncryptedFile = EncryptedFile;\n\nupdates.getState#edd4882a = updates.State;\nupdates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference;\nupdates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference;\n\nphotos.updateProfilePhoto#f0bb5152 id:InputPhoto = UserProfilePhoto;\nphotos.uploadProfilePhoto#4f32c098 file:InputFile = photos.Photo;\nphotos.deletePhotos#87cf7f2f id:Vector<InputPhoto> = Vector<long>;\nphotos.getUserPhotos#91cd32a8 user_id:InputUser offset:int max_id:long limit:int = photos.Photos;\n\nupload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;\nupload.getFile#e3a6cfb5 location:InputFileLocation offset:int limit:int = upload.File;\nupload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;\nupload.getWebFile#24e6818d location:InputWebFileLocation offset:int limit:int = upload.WebFile;\nupload.getCdnFile#2000bcc3 file_token:bytes offset:int limit:int = upload.CdnFile;\nupload.reuploadCdnFile#1af91c09 file_token:bytes request_token:bytes = Vector<CdnFileHash>;\nupload.getCdnFileHashes#f715c87b file_token:bytes offset:int = Vector<CdnFileHash>;\n\nhelp.getConfig#c4f9186b = Config;\nhelp.getNearestDc#1fb33026 = NearestDc;\nhelp.getAppUpdate#ae2de196 = help.AppUpdate;\nhelp.saveAppLog#6f02f748 events:Vector<InputAppEvent> = Bool;\nhelp.getInviteText#4d392343 = help.InviteText;\nhelp.getSupport#9cdf08cd = help.Support;\nhelp.getAppChangelog#9010ef6f prev_app_version:string = Updates;\nhelp.getTermsOfService#350170f3 = help.TermsOfService;\nhelp.setBotUpdatesStatus#ec22cfcd pending_updates_count:int message:string = Bool;\nhelp.getCdnConfig#52029342 = CdnConfig;\nhelp.getRecentMeUrls#3dc0f114 referer:string = help.RecentMeUrls;\n\nchannels.readHistory#cc104937 channel:InputChannel max_id:int = Bool;\nchannels.deleteMessages#84c1fd4e channel:InputChannel id:Vector<int> = messages.AffectedMessages;\nchannels.deleteUserHistory#d10dd71b channel:InputChannel user_id:InputUser = messages.AffectedHistory;\nchannels.reportSpam#fe087810 channel:InputChannel user_id:InputUser id:Vector<int> = Bool;\nchannels.getMessages#93d7b347 channel:InputChannel id:Vector<int> = messages.Messages;\nchannels.getParticipants#123e05e9 channel:InputChannel filter:ChannelParticipantsFilter offset:int limit:int hash:int = channels.ChannelParticipants;\nchannels.getParticipant#546dd7a6 channel:InputChannel user_id:InputUser = channels.ChannelParticipant;\nchannels.getChannels#a7f6bbb id:Vector<InputChannel> = messages.Chats;\nchannels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull;\nchannels.createChannel#f4893d7f flags:# broadcast:flags.0?true megagroup:flags.1?true title:string about:string = Updates;\nchannels.editAbout#13e27f1e channel:InputChannel about:string = Bool;\nchannels.editAdmin#20b88214 channel:InputChannel user_id:InputUser admin_rights:ChannelAdminRights = Updates;\nchannels.editTitle#566decd0 channel:InputChannel title:string = Updates;\nchannels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates;\nchannels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool;\nchannels.updateUsername#3514b3de channel:InputChannel username:string = Bool;\nchannels.joinChannel#24b524c5 channel:InputChannel = Updates;\nchannels.leaveChannel#f836aa95 channel:InputChannel = Updates;\nchannels.inviteToChannel#199f3a6c channel:InputChannel users:Vector<InputUser> = Updates;\nchannels.exportInvite#c7560885 channel:InputChannel = ExportedChatInvite;\nchannels.deleteChannel#c0111fe3 channel:InputChannel = Updates;\nchannels.toggleInvites#49609307 channel:InputChannel enabled:Bool = Updates;\nchannels.exportMessageLink#ceb77163 channel:InputChannel id:int grouped:Bool = ExportedMessageLink;\nchannels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates;\nchannels.updatePinnedMessage#a72ded52 flags:# silent:flags.0?true channel:InputChannel id:int = Updates;\nchannels.getAdminedPublicChannels#8d8d82d7 = messages.Chats;\nchannels.editBanned#bfd915cd channel:InputChannel user_id:InputUser banned_rights:ChannelBannedRights = Updates;\nchannels.getAdminLog#33ddf480 flags:# channel:InputChannel q:string events_filter:flags.0?ChannelAdminLogEventsFilter admins:flags.1?Vector<InputUser> max_id:long min_id:long limit:int = channels.AdminLogResults;\nchannels.setStickers#ea8ca4f9 channel:InputChannel stickerset:InputStickerSet = Bool;\nchannels.readMessageContents#eab5dc38 channel:InputChannel id:Vector<int> = Bool;\nchannels.deleteHistory#af369d42 channel:InputChannel max_id:int = Bool;\nchannels.togglePreHistoryHidden#eabbb94c channel:InputChannel enabled:Bool = Updates;\n\nbots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON;\nbots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool;\n\npayments.getPaymentForm#99f09745 msg_id:int = payments.PaymentForm;\npayments.getPaymentReceipt#a092a980 msg_id:int = payments.PaymentReceipt;\npayments.validateRequestedInfo#770a8e74 flags:# save:flags.0?true msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo;\npayments.sendPaymentForm#2b8879b3 flags:# msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials = payments.PaymentResult;\npayments.getSavedInfo#227d824b = payments.SavedInfo;\npayments.clearSavedInfo#d83d70c1 flags:# credentials:flags.0?true info:flags.1?true = Bool;\n\nstickers.createStickerSet#9bd86e6a flags:# masks:flags.0?true user_id:InputUser title:string short_name:string stickers:Vector<InputStickerSetItem> = messages.StickerSet;\nstickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet;\nstickers.changeStickerPosition#ffb6d4ca sticker:InputDocument position:int = messages.StickerSet;\nstickers.addStickerToSet#8653febe stickerset:InputStickerSet sticker:InputStickerSetItem = messages.StickerSet;\n\nphone.getCallConfig#55451fa9 = DataJSON;\nphone.requestCall#5b95b3d4 user_id:InputUser random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall;\nphone.acceptCall#3bd2b4a0 peer:InputPhoneCall g_b:bytes protocol:PhoneCallProtocol = phone.PhoneCall;\nphone.confirmCall#2efe1722 peer:InputPhoneCall g_a:bytes key_fingerprint:long protocol:PhoneCallProtocol = phone.PhoneCall;\nphone.receivedCall#17d54f61 peer:InputPhoneCall = Bool;\nphone.discardCall#78d413a6 peer:InputPhoneCall duration:int reason:PhoneCallDiscardReason connection_id:long = Updates;\nphone.setCallRating#1c536a34 peer:InputPhoneCall rating:int comment:string = Updates;\nphone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool;\n\nlangpack.getLangPack#9ab5c58e lang_code:string = LangPackDifference;\nlangpack.getStrings#2e1ee318 lang_code:string keys:Vector<string> = Vector<LangPackString>;\nlangpack.getDifference#b2e4d7d from_version:int = LangPackDifference;\nlangpack.getLanguages#800fd57d = Vector<LangPackLanguage>;"
  },
  {
    "path": "app/js/lib/tl_utils.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nfunction TLSerialization (options) {\n  options = options || {}\n  this.maxLength = options.startMaxLength || 2048 // 2Kb\n  this.offset = 0 // in bytes\n\n  this.createBuffer()\n\n  // this.debug = options.debug !== undefined ? options.debug : Config.Modes.debug\n  this.mtproto = options.mtproto || false\n  return this\n}\n\nTLSerialization.prototype.createBuffer = function () {\n  this.buffer = new ArrayBuffer(this.maxLength)\n  this.intView = new Int32Array(this.buffer)\n  this.byteView = new Uint8Array(this.buffer)\n}\n\nTLSerialization.prototype.getArray = function () {\n  var resultBuffer = new ArrayBuffer(this.offset)\n  var resultArray = new Int32Array(resultBuffer)\n\n  resultArray.set(this.intView.subarray(0, this.offset / 4))\n\n  return resultArray\n}\n\nTLSerialization.prototype.getBuffer = function () {\n  return this.getArray().buffer\n}\n\nTLSerialization.prototype.getBytes = function (typed) {\n  if (typed) {\n    var resultBuffer = new ArrayBuffer(this.offset)\n    var resultArray = new Uint8Array(resultBuffer)\n\n    resultArray.set(this.byteView.subarray(0, this.offset))\n\n    return resultArray\n  }\n\n  var bytes = []\n  for (var i = 0; i < this.offset; i++) {\n    bytes.push(this.byteView[i])\n  }\n  return bytes\n}\n\nTLSerialization.prototype.checkLength = function (needBytes) {\n  if (this.offset + needBytes < this.maxLength) {\n    return\n  }\n\n  console.trace('Increase buffer', this.offset, needBytes, this.maxLength)\n  this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4\n  var previousBuffer = this.buffer\n  var previousArray = new Int32Array(previousBuffer)\n\n  this.createBuffer()\n\n  new Int32Array(this.buffer).set(previousArray)\n}\n\nTLSerialization.prototype.writeInt = function (i, field) {\n  this.debug && console.log('>>>', i.toString(16), i, field)\n\n  this.checkLength(4)\n  this.intView[this.offset / 4] = i\n  this.offset += 4\n}\n\nTLSerialization.prototype.storeInt = function (i, field) {\n  this.writeInt(i, (field || '') + ':int')\n}\n\nTLSerialization.prototype.storeBool = function (i, field) {\n  if (i) {\n    this.writeInt(0x997275b5, (field || '') + ':bool')\n  } else {\n    this.writeInt(0xbc799737, (field || '') + ':bool')\n  }\n}\n\nTLSerialization.prototype.storeLongP = function (iHigh, iLow, field) {\n  this.writeInt(iLow, (field || '') + ':long[low]')\n  this.writeInt(iHigh, (field || '') + ':long[high]')\n}\n\nTLSerialization.prototype.storeLong = function (sLong, field) {\n  if (angular.isArray(sLong)) {\n    if (sLong.length == 2) {\n      return this.storeLongP(sLong[0], sLong[1], field)\n    } else {\n      return this.storeIntBytes(sLong, 64, field)\n    }\n  }\n\n  if (typeof sLong != 'string') {\n    sLong = sLong ? sLong.toString() : '0'\n  }\n  var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000))\n\n  this.writeInt(intToUint(divRem[1].intValue()), (field || '') + ':long[low]')\n  this.writeInt(intToUint(divRem[0].intValue()), (field || '') + ':long[high]')\n}\n\nTLSerialization.prototype.storeDouble = function (f, field) {\n  var buffer = new ArrayBuffer(8)\n  var intView = new Int32Array(buffer)\n  var doubleView = new Float64Array(buffer)\n\n  doubleView[0] = f\n\n  this.writeInt(intView[0], (field || '') + ':double[low]')\n  this.writeInt(intView[1], (field || '') + ':double[high]')\n}\n\nTLSerialization.prototype.storeString = function (s, field) {\n  this.debug && console.log('>>>', s, (field || '') + ':string')\n\n  if (s === undefined) {\n    s = ''\n  }\n  var sUTF8 = unescape(encodeURIComponent(s))\n\n  this.checkLength(sUTF8.length + 8)\n\n  var len = sUTF8.length\n  if (len <= 253) {\n    this.byteView[this.offset++] = len\n  } else {\n    this.byteView[this.offset++] = 254\n    this.byteView[this.offset++] = len & 0xFF\n    this.byteView[this.offset++] = (len & 0xFF00) >> 8\n    this.byteView[this.offset++] = (len & 0xFF0000) >> 16\n  }\n  for (var i = 0; i < len; i++) {\n    this.byteView[this.offset++] = sUTF8.charCodeAt(i)\n  }\n\n  // Padding\n  while (this.offset % 4) {\n    this.byteView[this.offset++] = 0\n  }\n}\n\nTLSerialization.prototype.storeBytes = function (bytes, field) {\n  if (bytes instanceof ArrayBuffer) {\n    bytes = new Uint8Array(bytes)\n  }\n  else if (bytes === undefined) {\n    bytes = []\n  }\n  this.debug && console.log('>>>', bytesToHex(bytes), (field || '') + ':bytes')\n\n  var len = bytes.byteLength || bytes.length\n  this.checkLength(len + 8)\n  if (len <= 253) {\n    this.byteView[this.offset++] = len\n  } else {\n    this.byteView[this.offset++] = 254\n    this.byteView[this.offset++] = len & 0xFF\n    this.byteView[this.offset++] = (len & 0xFF00) >> 8\n    this.byteView[this.offset++] = (len & 0xFF0000) >> 16\n  }\n\n  this.byteView.set(bytes, this.offset)\n  this.offset += len\n\n  // Padding\n  while (this.offset % 4) {\n    this.byteView[this.offset++] = 0\n  }\n}\n\nTLSerialization.prototype.storeIntBytes = function (bytes, bits, field) {\n  if (bytes instanceof ArrayBuffer) {\n    bytes = new Uint8Array(bytes)\n  }\n  var len = bytes.length\n  if ((bits % 32) || (len * 8) != bits) {\n    throw new Error('Invalid bits: ' + bits + ', ' + bytes.length)\n  }\n\n  this.debug && console.log('>>>', bytesToHex(bytes), (field || '') + ':int' + bits)\n  this.checkLength(len)\n\n  this.byteView.set(bytes, this.offset)\n  this.offset += len\n}\n\nTLSerialization.prototype.storeRawBytes = function (bytes, field) {\n  if (bytes instanceof ArrayBuffer) {\n    bytes = new Uint8Array(bytes)\n  }\n  var len = bytes.length\n\n  this.debug && console.log('>>>', bytesToHex(bytes), (field || ''))\n  this.checkLength(len)\n\n  this.byteView.set(bytes, this.offset)\n  this.offset += len\n}\n\nTLSerialization.prototype.storeMethod = function (methodName, params) {\n  var schema = this.mtproto ? Config.Schema.MTProto : Config.Schema.API\n  var methodData = false,\n    i\n\n  for (i = 0; i < schema.methods.length; i++) {\n    if (schema.methods[i].method == methodName) {\n      methodData = schema.methods[i]\n      break\n    }\n  }\n  if (!methodData) {\n    throw new Error('No method ' + methodName + ' found')\n  }\n\n  this.storeInt(intToUint(methodData.id), methodName + '[id]')\n\n  var param, type\n  var i, condType\n  var fieldBit\n  var len = methodData.params.length\n  for (i = 0; i < len; i++) {\n    param = methodData.params[i]\n    type = param.type\n    if (type.indexOf('?') !== -1) {\n      condType = type.split('?')\n      fieldBit = condType[0].split('.')\n      if (!(params[fieldBit[0]] & (1 << fieldBit[1]))) {\n        continue\n      }\n      type = condType[1]\n    }\n\n    this.storeObject(params[param.name], type, methodName + '[' + param.name + ']')\n  }\n\n  return methodData.type\n}\n\nTLSerialization.prototype.storeObject = function (obj, type, field) {\n  switch (type) {\n    case '#':\n    case 'int':\n      return this.storeInt(obj, field)\n    case 'long':\n      return this.storeLong(obj, field)\n    case 'int128':\n      return this.storeIntBytes(obj, 128, field)\n    case 'int256':\n      return this.storeIntBytes(obj, 256, field)\n    case 'int512':\n      return this.storeIntBytes(obj, 512, field)\n    case 'string':\n      return this.storeString(obj, field)\n    case 'bytes':\n      return this.storeBytes(obj, field)\n    case 'double':\n      return this.storeDouble(obj, field)\n    case 'Bool':\n      return this.storeBool(obj, field)\n    case 'true':\n      return\n  }\n\n  if (angular.isArray(obj)) {\n    if (type.substr(0, 6) == 'Vector') {\n      this.writeInt(0x1cb5c415, field + '[id]')\n    }\n    else if (type.substr(0, 6) != 'vector') {\n      throw new Error('Invalid vector type ' + type)\n    }\n    var itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n    this.writeInt(obj.length, field + '[count]')\n    for (var i = 0; i < obj.length; i++) {\n      this.storeObject(obj[i], itemType, field + '[' + i + ']')\n    }\n    return true\n  }\n  else if (type.substr(0, 6).toLowerCase() == 'vector') {\n    throw new Error('Invalid vector object')\n  }\n\n  if (!angular.isObject(obj)) {\n    throw new Error('Invalid object for type ' + type)\n  }\n\n  var schema = this.mtproto ? Config.Schema.MTProto : Config.Schema.API\n  var predicate = obj['_']\n  var isBare = false\n  var constructorData = false,\n    i\n\n  if (isBare = (type.charAt(0) == '%')) {\n    type = type.substr(1)\n  }\n\n  for (i = 0; i < schema.constructors.length; i++) {\n    if (schema.constructors[i].predicate == predicate) {\n      constructorData = schema.constructors[i]\n      break\n    }\n  }\n  if (!constructorData) {\n    throw new Error('No predicate ' + predicate + ' found')\n  }\n\n  if (predicate == type) {\n    isBare = true\n  }\n\n  if (!isBare) {\n    this.writeInt(intToUint(constructorData.id), field + '[' + predicate + '][id]')\n  }\n\n  var param, type\n  var i, condType\n  var fieldBit\n  var len = constructorData.params.length\n  for (i = 0; i < len; i++) {\n    param = constructorData.params[i]\n    type = param.type\n    if (type.indexOf('?') !== -1) {\n      condType = type.split('?')\n      fieldBit = condType[0].split('.')\n      if (!(obj[fieldBit[0]] & (1 << fieldBit[1]))) {\n        continue\n      }\n      type = condType[1]\n    }\n\n    this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']')\n  }\n\n  return constructorData.type\n}\n\nfunction TLDeserialization (buffer, options) {\n  options = options || {}\n\n  this.offset = 0 // in bytes\n  this.override = options.override || {}\n\n  this.buffer = buffer\n  this.intView = new Uint32Array(this.buffer)\n  this.byteView = new Uint8Array(this.buffer)\n\n  // this.debug = options.debug !== undefined ? options.debug : Config.Modes.debug\n  this.mtproto = options.mtproto || false\n  return this\n}\n\nTLDeserialization.prototype.readInt = function (field) {\n  if (this.offset >= this.intView.length * 4) {\n    throw new Error('Nothing to fetch: ' + field)\n  }\n\n  var i = this.intView[this.offset / 4]\n\n  this.debug && console.log('<<<', i.toString(16), i, field)\n\n  this.offset += 4\n\n  return i\n}\n\nTLDeserialization.prototype.fetchInt = function (field) {\n  return this.readInt((field || '') + ':int')\n}\n\nTLDeserialization.prototype.fetchDouble = function (field) {\n  var buffer = new ArrayBuffer(8)\n  var intView = new Int32Array(buffer)\n  var doubleView = new Float64Array(buffer)\n\n  intView[0] = this.readInt((field || '') + ':double[low]'),\n  intView[1] = this.readInt((field || '') + ':double[high]')\n\n  return doubleView[0]\n}\n\nTLDeserialization.prototype.fetchLong = function (field) {\n  var iLow = this.readInt((field || '') + ':long[low]')\n  var iHigh = this.readInt((field || '') + ':long[high]')\n\n  var longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString()\n\n  return longDec\n}\n\nTLDeserialization.prototype.fetchBool = function (field) {\n  var i = this.readInt((field || '') + ':bool')\n  if (i == 0x997275b5) {\n    return true\n  } else if (i == 0xbc799737) {\n    return false\n  }\n\n  this.offset -= 4\n  return this.fetchObject('Object', field)\n}\n\nTLDeserialization.prototype.fetchString = function (field) {\n  var len = this.byteView[this.offset++]\n\n  if (len == 254) {\n    var len = this.byteView[this.offset++] |\n      (this.byteView[this.offset++] << 8) |\n      (this.byteView[this.offset++] << 16)\n  }\n\n  var sUTF8 = ''\n  for (var i = 0; i < len; i++) {\n    sUTF8 += String.fromCharCode(this.byteView[this.offset++])\n  }\n\n  // Padding\n  while (this.offset % 4) {\n    this.offset++\n  }\n\n  try {\n    var s = decodeURIComponent(escape(sUTF8))\n  } catch (e) {\n    var s = sUTF8\n  }\n\n  this.debug && console.log('<<<', s, (field || '') + ':string')\n\n  return s\n}\n\nTLDeserialization.prototype.fetchBytes = function (field) {\n  var len = this.byteView[this.offset++]\n\n  if (len == 254) {\n    len = this.byteView[this.offset++] |\n      (this.byteView[this.offset++] << 8) |\n      (this.byteView[this.offset++] << 16)\n  }\n\n  var bytes = this.byteView.subarray(this.offset, this.offset + len)\n  this.offset += len\n\n  // Padding\n  while (this.offset % 4) {\n    this.offset++\n  }\n\n  this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes')\n\n  return bytes\n}\n\nTLDeserialization.prototype.fetchIntBytes = function (bits, typed, field) {\n  if (bits % 32) {\n    throw new Error('Invalid bits: ' + bits)\n  }\n\n  var len = bits / 8\n  if (typed) {\n    var result = this.byteView.subarray(this.offset, this.offset + len)\n    this.offset += len\n    return result\n  }\n\n  var bytes = []\n  for (var i = 0; i < len; i++) {\n    bytes.push(this.byteView[this.offset++])\n  }\n\n  this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits)\n\n  return bytes\n}\n\nTLDeserialization.prototype.fetchRawBytes = function (len, typed, field) {\n  if (len === false) {\n    len = this.readInt((field || '') + '_length')\n    if (len > this.byteView.byteLength) {\n      throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength)\n    }\n  }\n\n  if (typed) {\n    var bytes = new Uint8Array(len)\n    bytes.set(this.byteView.subarray(this.offset, this.offset + len))\n    this.offset += len\n    return bytes\n  }\n\n  var bytes = []\n  for (var i = 0; i < len; i++) {\n    bytes.push(this.byteView[this.offset++])\n  }\n\n  this.debug && console.log('<<<', bytesToHex(bytes), (field || ''))\n\n  return bytes\n}\n\nTLDeserialization.prototype.fetchObject = function (type, field) {\n  switch (type) {\n    case '#':\n    case 'int':\n      return this.fetchInt(field)\n    case 'long':\n      return this.fetchLong(field)\n    case 'int128':\n      return this.fetchIntBytes(128, false, field)\n    case 'int256':\n      return this.fetchIntBytes(256, false, field)\n    case 'int512':\n      return this.fetchIntBytes(512, false, field)\n    case 'string':\n      return this.fetchString(field)\n    case 'bytes':\n      return this.fetchBytes(field)\n    case 'double':\n      return this.fetchDouble(field)\n    case 'Bool':\n      return this.fetchBool(field)\n    case 'true':\n      return true\n  }\n\n  field = field || type || 'Object'\n\n  if (type.substr(0, 6) == 'Vector' || type.substr(0, 6) == 'vector') {\n    if (type.charAt(0) == 'V') {\n      var constructor = this.readInt(field + '[id]')\n      var constructorCmp = uintToInt(constructor)\n\n      if (constructorCmp == 0x3072cfa1) { // Gzip packed\n        var compressed = this.fetchBytes(field + '[packed_string]')\n        var uncompressed = gzipUncompress(compressed)\n        var buffer = bytesToArrayBuffer(uncompressed)\n        var newDeserializer = (new TLDeserialization(buffer))\n\n        return newDeserializer.fetchObject(type, field)\n      }\n      if (constructorCmp != 0x1cb5c415) {\n        throw new Error('Invalid vector constructor ' + constructor)\n      }\n    }\n    var len = this.readInt(field + '[count]')\n    var result = []\n    if (len > 0) {\n      var itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n      for (var i = 0; i < len; i++) {\n        result.push(this.fetchObject(itemType, field + '[' + i + ']'))\n      }\n    }\n\n    return result\n  }\n\n  var schema = this.mtproto ? Config.Schema.MTProto : Config.Schema.API\n  var predicate = false\n  var constructorData = false\n\n  if (type.charAt(0) == '%') {\n    var checkType = type.substr(1)\n    for (var i = 0; i < schema.constructors.length; i++) {\n      if (schema.constructors[i].type == checkType) {\n        constructorData = schema.constructors[i]\n        break\n      }\n    }\n    if (!constructorData) {\n      throw new Error('Constructor not found for type: ' + type)\n    }\n  }\n  else if (type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n    for (var i = 0; i < schema.constructors.length; i++) {\n      if (schema.constructors[i].predicate == type) {\n        constructorData = schema.constructors[i]\n        break\n      }\n    }\n    if (!constructorData) {\n      throw new Error('Constructor not found for predicate: ' + type)\n    }\n  }else {\n    var constructor = this.readInt(field + '[id]')\n    var constructorCmp = uintToInt(constructor)\n\n    if (constructorCmp == 0x3072cfa1) { // Gzip packed\n      var compressed = this.fetchBytes(field + '[packed_string]')\n      var uncompressed = gzipUncompress(compressed)\n      var buffer = bytesToArrayBuffer(uncompressed)\n      var newDeserializer = (new TLDeserialization(buffer))\n\n      return newDeserializer.fetchObject(type, field)\n    }\n\n    var index = schema.constructorsIndex\n    if (!index) {\n      schema.constructorsIndex = index = {}\n      for (var i = 0; i < schema.constructors.length; i++) {\n        index[schema.constructors[i].id] = i\n      }\n    }\n    var i = index[constructorCmp]\n    if (i) {\n      constructorData = schema.constructors[i]\n    }\n\n    var fallback = false\n    if (!constructorData && this.mtproto) {\n      var schemaFallback = Config.Schema.API\n      for (i = 0; i < schemaFallback.constructors.length; i++) {\n        if (schemaFallback.constructors[i].id == constructorCmp) {\n          constructorData = schemaFallback.constructors[i]\n\n          delete this.mtproto\n          fallback = true\n          break\n        }\n      }\n    }\n    if (!constructorData) {\n      throw new Error('Constructor not found: ' + constructor + ' ' + this.fetchInt() + ' ' + this.fetchInt())\n    }\n  }\n\n  predicate = constructorData.predicate\n\n  var result = {'_': predicate}\n  var overrideKey = (this.mtproto ? 'mt_' : '') + predicate\n  var self = this\n\n  if (this.override[overrideKey]) {\n    this.override[overrideKey].apply(this, [result, field + '[' + predicate + ']'])\n  } else {\n    var i, param\n    var type, isCond\n    var condType, fieldBit\n    var value\n    var len = constructorData.params.length\n    for (i = 0; i < len; i++) {\n      param = constructorData.params[i]\n      type = param.type\n      if (type == '#' && result.pFlags === undefined) {\n        result.pFlags = {}\n      }\n      if (isCond = (type.indexOf('?') !== -1)) {\n        condType = type.split('?')\n        fieldBit = condType[0].split('.')\n        if (!(result[fieldBit[0]] & (1 << fieldBit[1]))) {\n          continue\n        }\n        type = condType[1]\n      }\n\n      value = self.fetchObject(type, field + '[' + predicate + '][' + param.name + ']')\n\n      if (isCond && type === 'true') {\n        result.pFlags[param.name] = value\n      } else {\n        result[param.name] = value\n      }\n    }\n  }\n\n  if (fallback) {\n    this.mtproto = true\n  }\n\n  return result\n}\n\nTLDeserialization.prototype.getOffset = function () {\n  return this.offset\n}\n\nTLDeserialization.prototype.fetchEnd = function () {\n  if (this.offset != this.byteView.length) {\n    throw new Error('Fetch end with non-empty buffer')\n  }\n  return true\n}\n"
  },
  {
    "path": "app/js/lib/utils.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nvar _logTimer = (new Date()).getTime()\nfunction dT () {\n  return '[' + (((new Date()).getTime() - _logTimer) / 1000).toFixed(3) + ']'\n}\n\nfunction checkClick (e, noprevent) {\n  if (e.which == 1 && (e.ctrlKey || e.metaKey) || e.which == 2) {\n    return true\n  }\n\n  if (!noprevent) {\n    e.preventDefault()\n  }\n\n  return false\n}\n\nfunction isInDOM (element, parentNode) {\n  if (!element) {\n    return false\n  }\n  parentNode = parentNode || document.body\n  if (element == parentNode) {\n    return true\n  }\n  return isInDOM(element.parentNode, parentNode)\n}\n\nfunction checkDragEvent (e) {\n  if (!e || e.target && (e.target.tagName == 'IMG' || e.target.tagName == 'A')) return false\n  if (e.dataTransfer && e.dataTransfer.types) {\n    for (var i = 0; i < e.dataTransfer.types.length; i++) {\n      if (e.dataTransfer.types[i] == 'Files') {\n        return true\n      }\n    }\n  } else {\n    return true\n  }\n\n  return false\n}\n\nfunction cancelEvent (event) {\n  event = event || window.event\n  if (event) {\n    event = event.originalEvent || event\n\n    if (event.stopPropagation) event.stopPropagation()\n    if (event.preventDefault) event.preventDefault()\n    event.returnValue = false\n    event.cancelBubble = true\n  }\n\n  return false\n}\n\nfunction hasOnclick (element) {\n  if (element.onclick ||\n    element.getAttribute('ng-click')) {\n    return true\n  }\n  var events = $._data(element, 'events')\n  if (events && (events.click || events.mousedown)) {\n    return true\n  }\n  return false\n}\n\nfunction getScrollWidth () {\n  var outer = $('<div>').css({\n    position: 'absolute',\n    width: 100,\n    height: 100,\n    overflow: 'scroll',\n    top: -9999\n  }).appendTo($(document.body))\n\n  var scrollbarWidth = outer[0].offsetWidth - outer[0].clientWidth\n  outer.remove()\n\n  return scrollbarWidth\n}\n\nfunction onCtrlEnter (textarea, cb) {\n  $(textarea).on('keydown', function (e) {\n    if (e.keyCode == 13 && (e.ctrlKey || e.metaKey)) {\n      cb()\n      return cancelEvent(e)\n    }\n  })\n}\n\nfunction setFieldSelection (field, from, to) {\n  field = $(field)[0]\n  try {\n    field.focus()\n    if (from === undefined || from === false) {\n      from = field.value.length\n    }\n    if (to === undefined || to === false) {\n      to = from\n    }\n    if (field.createTextRange) {\n      var range = field.createTextRange()\n      range.collapse(true)\n      range.moveEnd('character', to)\n      range.moveStart('character', from)\n      range.select()\n    }\n    else if (field.setSelectionRange) {\n      field.setSelectionRange(from, to)\n    }\n  } catch(e) {}\n}\n\nfunction getFieldSelection (field) {\n  if (field.selectionStart) {\n    return field.selectionStart\n  }\n  else if (!document.selection) {\n    return 0\n  }\n\n  var c = '\\x01'\n  var sel = document.selection.createRange()\n  var txt = sel.text\n  var dup = sel.duplicate()\n  var len = 0\n\n  try {\n    dup.moveToElementText(field)\n  } catch(e) {\n    return 0\n  }\n\n  sel.text = txt + c\n  len = dup.text.indexOf(c)\n  sel.moveStart('character', -1)\n  sel.text = ''\n\n  // if (browser.msie && len == -1) {\n  //   return field.value.length\n  // }\n  return len\n}\n\nfunction getRichValue (field) {\n  if (!field) {\n    return ''\n  }\n  var lines = []\n  var line = []\n\n  getRichElementValue(field, lines, line)\n  if (line.length) {\n    lines.push(line.join(''))\n  }\n\n  var value = lines.join('\\n')\n  value = value.replace(/\\u00A0/g, ' ')\n\n  return value\n}\n\nfunction getRichValueWithCaret (field) {\n  if (!field) {\n    return []\n  }\n  var lines = []\n  var line = []\n\n  var sel = window.getSelection ? window.getSelection() : false\n  var selNode\n  var selOffset\n  if (sel && sel.rangeCount) {\n    var range = sel.getRangeAt(0)\n    if (range.startContainer &&\n      range.startContainer == range.endContainer &&\n      range.startOffset == range.endOffset) {\n      selNode = range.startContainer\n      selOffset = range.startOffset\n    }\n  }\n\n  getRichElementValue(field, lines, line, selNode, selOffset)\n\n  if (line.length) {\n    lines.push(line.join(''))\n  }\n\n  var value = lines.join('\\n')\n  var caretPos = value.indexOf('\\x01')\n  if (caretPos != -1) {\n    value = value.substr(0, caretPos) + value.substr(caretPos + 1)\n  }\n  value = value.replace(/\\u00A0/g, ' ')\n\n  return [value, caretPos]\n}\n\nfunction getRichElementValue (node, lines, line, selNode, selOffset) {\n  if (node.nodeType == 3) { // TEXT\n    if (selNode === node) {\n      var value = node.nodeValue\n      line.push(value.substr(0, selOffset) + '\\x01' + value.substr(selOffset))\n    } else {\n      line.push(node.nodeValue)\n    }\n    return\n  }\n  if (node.nodeType != 1) { // NON-ELEMENT\n    return\n  }\n  var isSelected = (selNode === node)\n  var isBlock = node.tagName == 'DIV' || node.tagName == 'P'\n  var curChild\n  if (isBlock && line.length || node.tagName == 'BR') {\n    lines.push(line.join(''))\n    line.splice(0, line.length)\n  }\n  else if (node.tagName == 'IMG') {\n    if (node.alt) {\n      line.push(node.alt)\n    }\n  }\n  if (isSelected && !selOffset) {\n    line.push('\\x01')\n  }\n  var curChild = node.firstChild\n  while (curChild) {\n    getRichElementValue(curChild, lines, line, selNode, selOffset)\n    curChild = curChild.nextSibling\n  }\n  if (isSelected && selOffset) {\n    line.push('\\x01')\n  }\n  if (isBlock && line.length) {\n    lines.push(line.join(''))\n    line.splice(0, line.length)\n  }\n}\n\nfunction setRichFocus (field, selectNode, noCollapse) {\n  field.focus()\n  if (selectNode &&\n    selectNode.parentNode == field &&\n    !selectNode.nextSibling &&\n    !noCollapse) {\n    field.removeChild(selectNode)\n    selectNode = null\n  }\n  if (window.getSelection && document.createRange) {\n    var range = document.createRange()\n    if (selectNode) {\n      range.selectNode(selectNode)\n    } else {\n      range.selectNodeContents(field)\n    }\n    if (!noCollapse) {\n      range.collapse(false)\n    }\n\n    var sel = window.getSelection()\n    sel.removeAllRanges()\n    sel.addRange(range)\n  }\n  else if (document.body.createTextRange !== undefined) {\n    var textRange = document.body.createTextRange()\n    textRange.moveToElementText(selectNode || field)\n    if (!noCollapse) {\n      textRange.collapse(false)\n    }\n    textRange.select()\n  }\n}\n\nfunction getSelectedText () {\n  var sel = (\n  window.getSelection && window.getSelection() ||\n  document.getSelection && document.getSelection() ||\n  document.selection && document.selection.createRange().text || ''\n    ).toString().replace(/^\\s+|\\s+$/g, '')\n\n  return sel\n}\n\nfunction scrollToNode (scrollable, node, scroller) {\n  var elTop = node.offsetTop - 15\n  var elHeight = node.offsetHeight + 30\n  var scrollTop = scrollable.scrollTop\n  var viewportHeight = scrollable.clientHeight\n\n  if (scrollTop > elTop) { // we are below the node to scroll\n    scrollable.scrollTop = elTop\n    $(scroller).nanoScroller({flash: true})\n  }\n  else if (scrollTop < elTop + elHeight - viewportHeight) { // we are over the node to scroll\n    scrollable.scrollTop = elTop + elHeight - viewportHeight\n    $(scroller).nanoScroller({flash: true})\n  }\n}\n\nif (Config.Modes.animations &&\n  typeof window.requestAnimationFrame == 'function') {\n  window.onAnimationFrameCallback = function (cb) {\n    return (function () {\n      window.requestAnimationFrame(cb)\n    })\n  }\n} else {\n  window.onAnimationFrameCallback = function (cb) {\n    return cb\n  }\n}\n\nfunction onContentLoaded (cb) {\n  cb = onAnimationFrameCallback(cb)\n  setZeroTimeout(cb)\n}\n\nfunction tsNow (seconds) {\n  var t = +new Date() + (window.tsOffset || 0)\n  return seconds ? Math.floor(t / 1000) : t\n}\n\nfunction safeReplaceObject (wasObject, newObject) {\n  for (var key in wasObject) {\n    if (!newObject.hasOwnProperty(key) && key.charAt(0) != '$') {\n      delete wasObject[key]\n    }\n  }\n  for (var key in newObject) {\n    if (newObject.hasOwnProperty(key)) {\n      wasObject[key] = newObject[key]\n    }\n  }\n}\n\nfunction listMergeSorted (list1, list2) {\n  list1 = list1 || []\n  list2 = list2 || []\n\n  var result = angular.copy(list1)\n\n  var minID = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF\n  for (var i = 0; i < list2.length; i++) {\n    if (list2[i] < minID) {\n      result.push(list2[i])\n    }\n  }\n\n  return result\n}\n\nfunction listUniqSorted (list) {\n  list = list || []\n  var resultList = []\n  var prev = false\n  for (var i = 0; i < list.length; i++) {\n    if (list[i] !== prev) {\n      resultList.push(list[i])\n    }\n    prev = list[i]\n  }\n\n  return resultList\n}\n\nfunction templateUrl (tplName) {\n  var forceLayout = {\n    confirm_modal: 'desktop',\n    error_modal: 'desktop',\n    media_modal_layout: 'desktop',\n    slider: 'desktop',\n    reply_message: 'desktop',\n    full_round: 'desktop',\n    message_body: 'desktop',\n    message_media: 'desktop',\n    message_attach_game: 'desktop',\n    forwarded_messages: 'desktop',\n    chat_invite_link_modal: 'desktop',\n    reply_markup: 'desktop',\n    short_message: 'desktop',\n    pinned_message: 'desktop',\n    channel_edit_modal: 'desktop',\n    megagroup_edit_modal: 'desktop',\n    inline_results: 'desktop',\n    composer_dropdown: 'desktop',\n    peer_pinned_message_bar: 'desktop',\n    report_msgs_modal: 'desktop'\n  }\n  var layout = forceLayout[tplName] || (Config.Mobile ? 'mobile' : 'desktop')\n  return 'partials/' + layout + '/' + tplName + '.html'\n}\n\nfunction encodeEntities (value) {\n  return value.replace(/&/g, '&amp;').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, function (value) {\n    var hi = value.charCodeAt(0)\n    var low = value.charCodeAt(1)\n    return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'\n  }).replace(/([^\\#-~| |!])/g, function (value) { // non-alphanumeric\n    return '&#' + value.charCodeAt(0) + ';'\n  }).replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\nfunction calcImageInBox (imageW, imageH, boxW, boxH, noZooom) {\n  var boxedImageW = boxW\n  var boxedImageH = boxH\n\n  if ((imageW / imageH) > (boxW / boxH)) {\n    boxedImageH = parseInt(imageH * boxW / imageW)\n  }else {\n    boxedImageW = parseInt(imageW * boxH / imageH)\n    if (boxedImageW > boxW) {\n      boxedImageH = parseInt(boxedImageH * boxW / boxedImageW)\n      boxedImageW = boxW\n    }\n  }\n\n  // if (Config.Navigator.retina) {\n  //   imageW = Math.floor(imageW / 2)\n  //   imageH = Math.floor(imageH / 2)\n  // }\n\n  if (noZooom && boxedImageW >= imageW && boxedImageH >= imageH) {\n    boxedImageW = imageW\n    boxedImageH = imageH\n  }\n\n  return {w: boxedImageW, h: boxedImageH}\n}\n\nfunction versionCompare (ver1, ver2) {\n  if (typeof ver1 !== 'string') {\n    ver1 = ''\n  }\n  if (typeof ver2 !== 'string') {\n    ver2 = ''\n  }\n  ver1 = ver1.replace(/^\\s+|\\s+$/g, '').split('.')\n  ver2 = ver2.replace(/^\\s+|\\s+$/g, '').split('.')\n\n  var a = Math.max(ver1.length, ver2.length), i\n\n  for (i = 0; i < a; i++) {\n    if (ver1[i] == ver2[i]) {\n      continue\n    }\n    if (ver1[i] > ver2[i]) {\n      return 1\n    } else {\n      return -1\n    }\n  }\n\n  return 0\n}\n\n(function (global) {\n  var badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<\\s]+/g,\n    trimRe = /^\\s+|\\s$/g\n\n  function createIndex () {\n    return {\n      shortIndexes: {},\n      fullTexts: {}\n    }\n  }\n\n  function cleanSearchText (text) {\n    var hasTag = text.charAt(0) == '%'\n    text = text.replace(badCharsRe, ' ').replace(trimRe, '')\n    text = text.replace(/[^A-Za-z0-9]/g, function (ch) {\n      var latinizeCh = Config.LatinizeMap[ch]\n      return latinizeCh !== undefined ? latinizeCh : ch\n    })\n    text = text.toLowerCase()\n    if (hasTag) {\n      text = '%' + text\n    }\n\n    return text\n  }\n\n  function cleanUsername (username) {\n    return username && username.toLowerCase() || ''\n  }\n\n  function indexObject (id, searchText, searchIndex) {\n    if (searchIndex.fullTexts[id] !== undefined) {\n      return false\n    }\n\n    searchText = cleanSearchText(searchText)\n\n    if (!searchText.length) {\n      return false\n    }\n\n    var shortIndexes = searchIndex.shortIndexes\n\n    searchIndex.fullTexts[id] = searchText\n\n    angular.forEach(searchText.split(' '), function (searchWord) {\n      var len = Math.min(searchWord.length, 3),\n        wordPart, i\n      for (i = 1; i <= len; i++) {\n        wordPart = searchWord.substr(0, i)\n        if (shortIndexes[wordPart] === undefined) {\n          shortIndexes[wordPart] = [id]\n        } else {\n          shortIndexes[wordPart].push(id)\n        }\n      }\n    })\n  }\n\n  function search (query, searchIndex) {\n    var shortIndexes = searchIndex.shortIndexes\n    var fullTexts = searchIndex.fullTexts\n\n    query = cleanSearchText(query)\n\n    var queryWords = query.split(' ')\n    var foundObjs = false,\n      newFoundObjs, i\n    var j, searchText\n    var found\n\n    for (i = 0; i < queryWords.length; i++) {\n      newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]\n      if (!newFoundObjs) {\n        foundObjs = []\n        break\n      }\n      if (foundObjs === false || foundObjs.length > newFoundObjs.length) {\n        foundObjs = newFoundObjs\n      }\n    }\n\n    newFoundObjs = {}\n\n    for (j = 0; j < foundObjs.length; j++) {\n      found = true\n      searchText = fullTexts[foundObjs[j]]\n      for (i = 0; i < queryWords.length; i++) {\n        if (searchText.indexOf(queryWords[i]) == -1) {\n          found = false\n          break\n        }\n      }\n      if (found) {\n        newFoundObjs[foundObjs[j]] = true\n      }\n    }\n\n    return newFoundObjs\n  }\n\n  global.SearchIndexManager = {\n    createIndex: createIndex,\n    indexObject: indexObject,\n    cleanSearchText: cleanSearchText,\n    cleanUsername: cleanUsername,\n    search: search\n  }\n})(window)\n"
  },
  {
    "path": "app/js/locales/README.md",
    "content": "# Localization guide for Webogram\n\n## Adding/updating a new locale/language\n\nAdding a new locale is pretty easy, all you got to do is:\n\n1. ensure that the angular-locale file `vendor/angular/i18n/angular-locale_<locale>.js` exists. If not copy one of the others being most similar to your target locale and adapt it accordingly. See also the [angular docs](https://docs.angularjs.org/guide/i18n).\n2. copy `js/locales/en-us.json` to `js/locales/<locale>.json`\n3. without changing the key strings translate and change the value strings into your target locale\n4. add your locale to `Config.I18n` in `js/lib/config.js` with locale and its native name so it will be listed in the settings\n5. enjoy your awesome new Webogram in your own language!\n\nYou may also want to join the project on [transifex](https://www.transifex.com/projects/p/telegram-web/).\n\n### Details\n#### The locale string\nThe locale string which is also part of the filenames consists of the lower case two character language code and the two character country code separated by a hyphen with the country code being optional, e.g:\n* en-us\n* en-au\n* de-de\n\n#### Step 1: the angular locale\nThe files in `vendor/angular/i18n/` contain the `ngLocale` module in its various localizations which provides the `$locale` service which in turn is used by many angular functions especially for formatting times and dates and a little pluralization.\nThere should already be a file for almost every language so you most probably won't have to create your own.\nFor more see the [angular docs](https://docs.angularjs.org/guide/i18n).\n\n#### Step 2: copy the template\n`js/locales/en-us.json` should provide you with all the localization strings currently in use in webogram and therefore be a complete template to begin with.\nIt's basically just a json-encoded javascript object with the keys being the message ids and the values being the corresponding translations.\n\n#### Step 3: adjusting the translations\nThe values may contain very simple markdown syntax, numbered and named parameters depending on how and where the messages are used (see also below).\nParameters are enclosed in curly braces and can be numbered (starting with 0) and/or named, but the order in the strings doesn't matter.\nHere a few examples:\n> \"user_status_last_seen\": \"last seen {0}\",\n> \"settings_modal_recent_updates\": \"Recent updates (ver. {version})\"\n\nThe parameters can be parameterized too in which case the parameter name/number is followed by a colon and its parameters which are delimited by a pipe (`|`).\n\nExample:\n\n> Please, install {chrome-link: http://google.com/chrome | Google Chrome} or use {telegram-link: https://telegram.org/ | mobile app} instead.\n\nwhich would end up as\n\n> Please, install <a href=\"http://google.com/chrome\" target=\"_blank\">Google Chrome</a> or use <a href=\"https://telegram.org/\" target=\"_blank\">mobile app</a> instead.\n\nYou could alter the url in this example to point to the language specific version of the original url.\n\nThen there are some strings like this:\n> \"contacts_modal_pluralize_new_group_members\": \"{'one': '1 participant', 'other': '{} participants'}\",\n\nwhich are used in the `when` attributes of elements compiled by the [ngPluralize](https://docs.angularjs.org/api/ng/directive/ngPluralize) module and allow for different strings depending on the (number) value of the bound parameter and there must be valid json syntax.\nHere again see the [angular docs](https://docs.angularjs.org/guide/i18n).\nSuch strings will have the word _pluralize_ in their key.\n\nAnd finally: strings which keys have a `_md` suffix get parsed by a simple markdown parser that places everything between `**`s in `<strong/>` tags and replaces newlines with `<br/>` e.g.:\n> \"welcome_text_1_md\": \"This is a web-client for the **Telegram Messenger**.\",\n\nbecomes\n```html\nThis is a web-client for the <strong>Telegram Messenger</strong>.\n```\n\nIncluding html markup in the messages directly isn't supported and any contained markup will be escaped before inserting.\n\n#### Step 4: adding the newly created locale\nThe final step is to add the new locale to the list with supported (i.e. existing) locales for Webogram in `Config.I18n` object in `js/lib/config.js`.\nAdd the locale to the `Config.I18n.supported` array and to `Config.I18n.languages` with the locale as key and the native name of the language as value.\nAfter adding to the list (and perhaps restarting the app) it appears in the footer.\n\nAdditionally you can add your locale to `Config.I18n.aliases`. This object is used when there is no locale configured yet and we're trying to guess the best fit from the browsers current language.\nSince we're retrieving the browser language through `navigator.language` which may contain a locale with or without country code, we use `Config.I18n.aliases` here to map between these and our supported locales whereby the keys are the lookup values and the values a locale we support, e.g:\n```javascript\nConfig.I18n.aliases= {\n\t'en': 'en-us'\n}\n```\nThis maps a `navigator.language == 'en'` to `en-us` as locale to use.\n\n\n## Using the i18n module while developing\n\nAll the i18n functionality is located in the `myApp.i18n` module in `js/lib/i18n.js` and exposed via various ways whereby all the localization is done by the `_` service.\nIt takes a message key and optional parameters for that key and returns the localized string with parameters incorporated.\n\nWhen adding new messages the key for that messages should be prefixed with the view name it appears in. If the message (should) contain(s) markdown-like markup (see above) it should additionally have a `_md` suffix.\n\n### The service: call the localization function (`_`) directly\nThe Service `_` can be injected into other modules and offers some ways to interact:\n\n```javascript\n_('welcome_text_1_md'); // get a simple string\n_('user_status_last_seen', '1 minute ago', ...); // with numbered parameters or\n_('format_size_progress', {done: '10kB', total: '2048kB'}); // with named parameters\n_.locale(); // retrieve the currently active locale, e.g. \"en-us\"\n_.locale(\"en-us\"); // set and load a new locale\n_.supported(); // get the list of all supported locales\n```\n\nNote that `_` escapes any html entities appearing in the messages strings. If you want to retrieve an unmasked message - e.g. because it will be inserted in a way that escapes html again like `text()` - you can add a `_raw` suffix to the message key:\n```javascript\n_('welcome_text_1_md_raw'); // get a simple unmasked string\n```\n\n### The i18n filter\nThe i18n filter is basically just an alias/other way to call `_` and can be used in attributes and text nodes:\n\n```html\n<input placeholder=\"{{'modal_serach' | i18n}}\" />\n<span>{{\"user_status_last_seen\" | i18n:relativeTime}}</span>\n<div>{{\"format_size_progress\" | i18n:{done: bytesLoaded, total: totalSize} }}</div>\n```\n\n### Together with `ngPluralize`\n`myApp.i18n` automatically intercepts the compilation of the [ngPluralize](https://docs.angularjs.org/api/ng/directive/ngPluralize) directive and pipes the value of the `when` attribute through `_` before `ngPluralize` evaluates it.\nTherefore you have to replace the content of the `when` attribute with the key of the corresponding message for `ngPluralize`. The key should contain the word `pluralize` to indicate its usage.\n\n```html\n<ng-pluralize count=\"selectedCount\" when=\"contacts_modal_pluralize_new_group_members\">\n</ng-pluralize>\n```\nmay evaluate to\n```html\n<ng-pluralize count=\"selectedCount\" when=\"{'one': '1 participant', 'other': '{} participants'}\">\n\t5 participants\n</ng-pluralize>\n```\n\n### The my-i18n directive\nThe `my-i18n` directive can be used as attribute or as element and replaces the contents of the element with the localized message.\n\nSimple usage:\n```html\n<div my-i18n=\"modal_done\"></div>\n<my-i18n msgid=\"modal_done\"></my-i18n>\nbecome\n<div my-i18n=\"modal_done\">Done</div>\n<my-i18n msgid=\"modal_done\">Done</my-i18n>\n```\n\nFor messages which take parameters these are provided via (direct) child elements with a `my-i18n-param` directive. The params can be named or numbered if no name is provided.\n\nSimple formats:\n> \"settings_modal_recent_updates\": \"Recent updates (ver. {version})\",\n> \"user_status_last_seen\": \"last seen {0}\",\n\n```html\n<a ng-click=\"openChangelog()\" my-i18n=\"settings_modal_recent_updates\">\n\t<my-i18n-param name=\"version\" ng-bind=\"version\"></my-i18n-param>\n</a>\n\n<my-i18n msgid=\"settings_modal_recent_updates\">\n\t<span my-i18n-param=\"version\" ng-bind=\"version\"></span>\n</my-i18n>\n\n<my-i18n msgid=\"user_status_last_seen\">\n\t<my-i18n-param>1 minute ago</my-i18n-param>\n</my-i18n>\n\nevaluate to\n\n<a ng-click=\"openChangelog()\" my-i18n=\"settings_modal_recent_updates\">\n\tRecent updates (ver. <my-i18n-param name=\"version\" ng-bind=\"version\"></my-i18n-param>)\n</a>\n\n<my-i18n msgid=\"settings_modal_recent_updates\">\n\tRecent updates (ver. <span my-i18n-param=\"version\" ng-bind=\"version\"></span>)\n</my-i18n>\n\n<my-i18n msgid=\"user_status_last_seen\">\n\tlast seen <my-i18n-param>1 minute ago</my-i18n-param>\n</my-i18n>\n```\n\nAs you see any other directives applied to the elements are preserved.\n\nFinally, if there is no message key passed to the `my-i18n` directive it looks for (direct) child elements with a `my-i18n-format` directive and takes the msgid of that instead, e.g.:\n\n> \"im_one_typing\": \"{name1} is typing{dots}\",\n\n```html\n<div class=\"im_history_typing\"  my-i18n>\n\t<span ng-switch-when=\"1\" my-i18n-format=\"im_one_typing\"></span>\n\t<my-i18n-param name=\"name1\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[0]\"></a></my-i18n-param>\n\t<my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n</div>\n```\n\nThis way it is even possible to group together several formats which take (mostly) the same parameters:\n\n> \"im_one_typing\": \"{name1} is typing{dots}\",\n> \"im_two_typing\": \"{name1} and {name2} are typing{dots}\",\n> \"im_many_typing\": \"{name1}, {name2} and {count} more are typing{dots}\",\n\n```html\n<div class=\"im_history_typing\" my-i18n>\n\t<span ng-switch-when=\"1\" my-i18n-format=\"im_one_typing\"></span>\n\t<span ng-switch-when=\"2\" my-i18n-format=\"im_two_typing\"></span>\n\t<span ng-switch-default my-i18n-format=\"im_many_typing\"></span>\n\t<my-i18n-param name=\"name1\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[0]\"></a></my-i18n-param>\n\t<my-i18n-param name=\"name2\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[1]\"></a></my-i18n-param>\n\t<my-i18n-param name=\"count\">{{historyState.typing.length - 2}}</my-i18n-param>\n\t<my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n</div>\n\nwill evaluate to (whitespace added for readability):\n\n<div class=\"im_history_typing\" my-i18n>\n\t<span ng-switch-when=\"1\" my-i18n-format=\"im_one_typing\">\n\t\t<my-i18n-param name=\"name1\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[0]\"></a></my-i18n-param>\n\t\tis typing\n\t\t<my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n\t</span>\n\t<span ng-switch-when=\"2\" my-i18n-format=\"im_two_typing\">\n\t\t<my-i18n-param name=\"name1\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[0]\"></a></my-i18n-param>\n\t\tand\n\t\t<my-i18n-param name=\"name2\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[1]\"></a></my-i18n-param>\n\t\tare typing\n\t\t<my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n\t</span>\n\t<span ng-switch-default my-i18n-format=\"im_many_typing\">\n\t\t<my-i18n-param name=\"name1\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[0]\"></a></my-i18n-param>,\n\t\t<my-i18n-param name=\"name2\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[1]\"></a></my-i18n-param>\n\t\tand\n\t\t<my-i18n-param name=\"count\">{{historyState.typing.length - 2}}</my-i18n-param>\n\t\tmore are typing\n\t\t<my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n\t</span>\n</div>\n```\n\nAlso note the `ng-switch` directives on the `my-i18n-format` elements here so only one of the  `<span>`s is visible at a time.\n"
  },
  {
    "path": "app/js/locales/de-de.json",
    "content": "{\n    \"modal_search\": \"Suchen\",\n    \"modal_close\": \"Schließen\",\n    \"modal_edit\": \"Bearbeiten\",\n    \"modal_cancel\": \"Abbrechen\",\n    \"modal_more\": \"Weiteres...\",\n    \"modal_next\": \"Weiter\",\n    \"modal_ok\": \"OK\",\n    \"modal_done\": \"Fertig\",\n    \"group_modal_info\": \"Gruppeninfo\",\n    \"group_modal_pluralize_participants\": \"{'0': 'Keine Mitglieder', 'one': '1 Mitglied', 'other': '{} Mitglieder'}\",\n    \"group_modal_pluralize_online_participants\": \"{'one': '1 online', 'other': '{} online'}\",\n    \"group_modal_pluralize_subscribers\": \"{'0': 'Kein Abonnent', 'one': '1 Abonnent', 'other': '{} Abonnenten'}\",\n    \"group_modal_participants\": \"{total}, {online}\",\n    \"group_modal_add_member\": \"Person hinzufügen\",\n    \"group_modal_return\": \"Zurück zur Gruppe\",\n    \"group_modal_update_photo\": \"Neues Bild\",\n    \"group_modal_update_active\": \"Aktualisiere\",\n    \"group_modal_menu_more\": \"Weiteres\",\n    \"group_modal_menu_delete_photo\": \"Bild löschen\",\n    \"group_modal_menu_edit_group\": \"Gruppe bearbeiten\",\n    \"group_modal_menu_leave\": \"Verlassen\",\n    \"group_modal_menu_delete_group\": \"Löschen und verlassen\",\n    \"group_modal_menu_clear_history\": \"Verlauf löschen\",\n    \"group_modal_delete_group\": \"Gruppe löschen\",\n    \"group_modal_join\": \"Gruppe beitreten\",\n    \"group_modal_settings\": \"Einstellungen\",\n    \"group_modal_notifications\": \"Benachrichtigungen\",\n    \"group_modal_menu_share_link\": \"Per Link zur Gruppe einladen\",\n    \"group_modal_migrate_to_supergroup\": \"In Supergruppe ändern\",\n    \"group_modal_members\": \"Mitglieder\",\n    \"group_modal_members_kick\": \"Entfernen\",\n    \"group_modal_migrate_header\": \"Gruppenlimit erreicht\",\n    \"group_modal_migrate_desc\": \"Für weitere Funktionen und um das Limit aufzuheben in Supergruppe ändern:\",\n    \"group_modal_migrate_item1\": \"Bis zu 1000 Mitglieder sind nun möglich\",\n    \"group_modal_migrate_item2\": \"Neue Mitglieder sehen gesamten Verlauf\",\n    \"group_modal_migrate_item3\": \"Admins können alle Nachrichten löschen\",\n    \"group_modal_migrate_item4\": \"Mitteilungen sind standardmäßig stumm\",\n    \"channel_modal_info\": \"Beschreibung\",\n    \"channel_modal_description\": \"Beschreibung\",\n    \"channel_modal_share_link\": \"Link teilen\",\n    \"channel_modal_share_loading\": \"Lade{dots}\",\n    \"channel_modal_menu_edit\": \"Kanal bearbeiten\",\n    \"channel_modal_join\": \"Kanal beitreten\",\n    \"channel_modal_add_member\": \"Mitglied hinzufügen\",\n    \"channel_modal_leave_channel\": \"Kanal verlassen\",\n    \"channel_modal_delete_channel\": \"Kanal löschen\",\n    \"country_select_modal_title\": \"Land\",\n    \"settings_modal_title\": \"Einstellungen\",\n    \"settings_modal_menu_more\": \"Weiteres\",\n    \"settings_modal_delete_photo\": \"Profilbild löschen\",\n    \"settings_modal_set_photo\": \"Profilbild setzen\",\n    \"settings_modal_photo_updating\": \"Aktualisiere\",\n    \"settings_modal_edit_profile\": \"Profil bearbeiten\",\n    \"settings_modal_edit_username\": \"Benutzername ändern\",\n    \"settings_modal_empty_username_set\": \"Benutzername festlegen\",\n    \"settings_modal_terminate_sessions\": \"Andere Sitzungen beenden\",\n    \"settings_modal_active_sessions\": \"Sitzungen\",\n    \"settings_modal_settings\": \"Einstellungen\",\n    \"settings_modal_notification_alert\": \"Benachrichtigungen\",\n    \"settings_modal_notification_push\": \"Push-Mitteilungen\",\n    \"settings_modal_vibrate\": \"Vibrieren\",\n    \"settings_modal_sounds\": \"Töne\",\n    \"settings_modal_language\": \"Sprache\",\n    \"settings_modal_notifications\": \"Desktopbenachrichtigungen\",\n    \"settings_modal_pushes\": \"Hintergrund-Benachrichtigungen\",\n    \"settings_modal_message_preview\": \"Nachrichtenvorschau\",\n    \"settings_modal_sound\": \"Ton\",\n    \"settings_modal_enter_send_description_md\": \"**Enter** - Nachricht senden, **Shift + Enter** - Zeilenumbruch\",\n    \"settings_modal_ctrl_enter_send_description_md\": \"**Strg + Enter** - Nachricht senden, **Enter** - Zeilenumbruch\",\n    \"settings_modal_send_on_enter\": \"Senden mit Enter\",\n    \"settings_switch_back_to_desktop\": \"Zurück zur Desktopansicht\",\n    \"settings_modal_about\": \"Info\",\n    \"settings_modal_source_code_github\": \"Quelltext bei GitHub\",\n    \"settings_modal_follow_us_twitter\": \"Folge uns auf Twitter!\",\n    \"settings_modal_recent_updates\": \"Aktuelle Version: {version}\",\n    \"settings_modal_set_password\": \"Zusätzliches Kennwort\",\n    \"settings_modal_change_password\": \"Kennwort ändern\",\n    \"settings_modal_disable_password\": \"Deaktivieren\",\n    \"settings_modal_disable_password_mobile\": \"Kennwort deaktivieren\",\n    \"settings_modal_password_email_pending\": \"Link in {email} anklicken, um die zweistufige Bestätigung abzuschließen.\",\n    \"settings_modal_password_email_pending_cancel\": \"Abbrechen\",\n    \"settings_modal_password_email_pending_cancel_mobile\": \"Kennwort abbrechen\",\n    \"settings_modal_show_sensitive_content\": \"Sensible Inhalte anzeigen\",\n    \"password_delete_title\": \"Kennwort deaktivieren\",\n    \"password_change_title\": \"Zweistufige Bestätigung\",\n    \"password_current_placeholder\": \"Aktuelles Kennwort\",\n    \"password_create_placeholder\": \"Kennwort eingeben\",\n    \"password_new_placeholder\": \"Neues Kennwort\",\n    \"password_confirm_placeholder\": \"Neues Kennwort wiederholen\",\n    \"password_hint_placeholder\": \"Kennwort-Hinweis\",\n    \"password_email_placeholder\": \"E‑Mail-Adresse zur Wiederherstellung\",\n    \"password_create_description\": \"Du kannst ein eigenes Kennwort festlegen, um dich an einem neuen Gerät anzumelden, zusätzlich zum SMS-Code.\",\n    \"password_create_active\": \"Speichere...\",\n    \"password_create_submit\": \"Speichern\",\n    \"password_delete_active\": \"Lösche...\",\n    \"password_delete_submit\": \"Kennwort entfernen\",\n    \"sessions_modal_title\": \"Sitzungen\",\n    \"sessions_modal_loading\": \"Lade{dots}\",\n    \"sessions_modal_current_session\": \"Aktuelles Gerät\",\n    \"sessions_modal_session_online\": \"online\",\n    \"sessions_modal_terminate_one\": \"Abmelden\",\n    \"sessions_modal_terminate_all\": \"Alle anderen Geräte abmelden\",\n    \"sessions_modal_active_sessions\": \"Andere Geräte\",\n    \"stickerset_modal_title_loading\": \"Sticker-Paket\",\n    \"stickerset_modal_install\": \"Sticker hinzufügen\",\n    \"stickerset_modal_uninstall\": \"Sticker entfernen\",\n    \"stickerset_modal_share\": \"Teilen\",\n    \"stickerset_modal_loading\": \"Lade{dots}\",\n    \"page_title_pluralize_notifications\": \"{'0': 'Keine Nachrichten', 'one': '1 Nachricht', 'other': '{} Nachrichten'}\",\n    \"profile_edit_modal_title\": \"Profil bearbeiten\",\n    \"profile_edit_first_name\": \"Vorname\",\n    \"profile_edit_last_name\": \"Nachname\",\n    \"profile_edit_submit\": \"Speichern\",\n    \"profile_edit_submit_active\": \"Speichere...\",\n    \"username_edit_modal_title\": \"Benutzername ändern\",\n    \"username_edit_placeholder\": \"Benutzername\",\n    \"username_edit_description_md\": \"Benutzername wählen, damit du von anderen bei **Telegram** gefunden werden kannst - ohne, dass sie deine Nummer kennen müssen. \\n\\nErlaubt sind a-z, 0-9 und Unterstriche. Die Mindestlänge ist 5 Zeichen.\",\n    \"username_edit_submit\": \"Speichern\",\n    \"username_edit_submit_active\": \"Wird gespeichert...\",\n    \"user_modal_menu_more\": \"Weiteres\",\n    \"user_modal_send_message\": \"Nachricht senden\",\n    \"user_modal_edit_contact\": \"Kontakt bearbeiten\",\n    \"user_modal_delete_contact\": \"Kontakt entfernen\",\n    \"user_modal_add_contact\": \"Zu Kontakten hinzufügen\",\n    \"user_modal_share_contact\": \"Kontakt teilen\",\n    \"user_modal_block_user\": \"Kontakt blockieren\",\n    \"user_modal_unblock_user\": \"Kontakt freigeben\",\n    \"user_modal_clear_history\": \"Verlauf löschen\",\n    \"user_modal_delete_chat\": \"Chat löschen\",\n    \"user_modal_add_to_group\": \"Zu einer Gruppe hinzufügen\",\n    \"user_modal_info\": \"Info\",\n    \"user_modal_phone\": \"Telefon\",\n    \"user_modal_about\": \"Info\",\n    \"user_modal_bot_settings\": \"Einstellungen\",\n    \"user_modal_bot_help\": \"Hilfe\",\n    \"user_modal_username\": \"Benutzername\",\n    \"user_modal_settings\": \"Einstellungen\",\n    \"user_modal_notifications\": \"Benachrichtigungen\",\n    \"user_modal_contact_info\": \"Kontaktdetails\",\n    \"media_modal_photo\": \"Bild\",\n    \"media_modal_photo_index\": \"Bild {pos} von {count}\",\n    \"media_modal_video\": \"Video\",\n    \"media_modal_forward\": \"Weiterleiten\",\n    \"media_modal_download\": \"Download\",\n    \"media_modal_delete\": \"Löschen\",\n    \"game_modal_share_game\": \"Spiel teilen\",\n    \"game_modal_share_score\": \"Spielstand teilen\",\n    \"error_browser_no_local_file_system_image_md\": \"Dein Browser unterstützt nicht die {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem}-Funktion, welche zum Darstellen dieses Bildes benötigt wird.\\nBitte installiere {chrome-link: http://google.com/chrome | Google Chrome} oder benutze stattdessen die {telegram-link: https://telegram.org/ | mobile App}.\",\n    \"error_image_download_failed\": \"Download fehlgeschlagen\",\n    \"error_browser_no_local_file_system_video_md\": \"Dein Browser unterstützt nicht die {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem}-Funktion, welche zum Abspielen dieses Videos benötigt wird.\\nBitte installiere {chrome-link: http://google.com/chrome | Google Chrome} oder benutze stattdessen die {telegram-link: https://telegram.org/ | mobile App}.\",\n    \"error_video_download_failed\": \"Videodownload fehlgeschlagen\",\n    \"unread_messages_split\": \"Ungelesene Nachrichten\",\n    \"user_name_deleted\": \"GELÖSCHT\",\n    \"user_first_name_deleted\": \"GELÖSCHT\",\n    \"user_name_saved_msgs\": \"Gespeichertes\",\n    \"user_status_online\": \"online\",\n    \"user_status_last_seen\": \"zuletzt gesehen: {0}\",\n    \"user_status_recently\": \"zuletzt kürzlich gesehen\",\n    \"user_status_last_week\": \"innerhalb einer Woche gesehen\",\n    \"user_status_last_month\": \"diesen Monat gesehen\",\n    \"user_status_long_ago\": \"vor langer Zeit zuletzt gesehen\",\n    \"user_status_bot\": \"Bot\",\n    \"user_status_service_notifications\": \"Servicemeldungen\",\n    \"user_status_support\": \"Support\",\n    \"user_status_bot_noprivacy\": \"Zugriff auf Nachrichten\",\n    \"user_status_bot_privacy\": \"kein Zugriff auf Nachrichten\",\n    \"chat_title_deleted\": \"GELÖSCHT\",\n    \"format_size_progress_mulitple\": \"{done} von {total} {parts}\",\n    \"format_size_progress\": \"{done} von {total}\",\n    \"relative_time_pluralize_minutes_ago\": \"{'one': 'vor 1 Minute', 'other': 'vor {} Minuten'}\",\n    \"relative_time_pluralize_hours_ago\": \"{'one': 'vor 1 Stunde', 'other': 'vor {} Stunden'}\",\n    \"relative_time_just_now\": \"gerade eben\",\n    \"changelog_modal_header_recent_updates_md\": \"Aktualisierungen bei **Telegram Web**\",\n    \"changelog_modal_header_new_updates_md\": \"**Telegram Web** wurde aktualisiert!\",\n    \"changelog_modal_title_current_version\": \"aktuelle Version\",\n    \"changelog_modal_full_description_md\": \"Offizielle Messaging App basierend auf Telegram API für Geschwindigkeit und Sicherheit.\\n\\nDiese Software steht unter der GNU GPL Version 3.\",\n    \"changelog_modal_changelog_link\": \"Changelog\",\n    \"changelog_app_version\": \"Version {version}\",\n    \"group_create_contacts_modal_title\": \"Neue Gruppe\",\n    \"group_create_modal_title\": \"Gruppe erstellen\",\n    \"group_create_name\": \"Gruppenname\",\n    \"group_create_submit\": \"Gruppe erstellen\",\n    \"group_create_submit_active\": \"Erstelle...\",\n    \"group_edit_modal_title\": \"Gruppe bearbeiten\",\n    \"group_edit_name\": \"Gruppenname\",\n    \"group_edit_about\": \"Beschreibung\",\n    \"group_edit_submit\": \"Speichern\",\n    \"group_edit_submit_active\": \"Speichere...\",\n    \"channel_edit_modal_title\": \"Kanal bearbeiten\",\n    \"channel_edit_name\": \"Kanalname\",\n    \"channel_edit_about\": \"Beschreibung\",\n    \"channel_edit_submit\": \"Speichern\",\n    \"channel_edit_submit_active\": \"Speichere...\",\n    \"group_invite_link_modal_title\": \"Einladungslink\",\n    \"group_invite_link_link_label\": \"Link kopieren\",\n    \"group_invite_link_loading\": \"Lade...\",\n    \"group_invite_revoke_active\": \"Widerrufe...\",\n    \"group_invite_revoke\": \"Widerrufen\",\n    \"report_reason_modal_title\": \"Melden\",\n    \"report_reason_modal_spam\": \"Spam\",\n    \"report_reason_modal_violence\": \"Gewalt\",\n    \"report_reason_modal_pornography\": \"Pornografie\",\n    \"report_reason_modal_childabuse\": \"Kindesmissbrauch\",\n    \"report_reason_modal_other\": \"Sonstiges\",\n    \"report_reason_modal_other_placeholder\": \"Beschreibung\",\n    \"report_reason_modal_submit_btn\": \"Senden\",\n    \"clipboard_copied\": \"Kopiert!\",\n    \"clipboard_press_ctrl_c\": \"Strg+C um zu kopieren\",\n    \"clipboard_press_cmd_c\": \"⌘+C um zu kopieren\",\n    \"confirm_modal_logout\": \"Willst du dich wirklich abmelden?\",\n    \"confirm_modal_update_reload\": \"Eine neue Telegram Web Version wurde geladen. Jetzt starten?\",\n    \"confirm_modal_history_flush\": \"Sicher? Es kann nicht rückgängig gemacht werden!\",\n    \"confirm_modal_history_leave_flush_md\": \"Möchtest du aus der Gruppe wirklich austreten und deinen Verlauf löschen?\\n\\nDas kann nicht rückgängig gemacht werden!\",\n    \"confirm_modal_leave_channel_md\": \"Möchtest du wirklich diesen Kanal verlassen?\\n\\nDas kann nicht rückgängig gemacht werden.\",\n    \"confirm_modal_leave_group_md\": \"Möchtest du wirklich diese Gruppe verlassen?\\n\\nDas kann nicht rückgängig gemacht werden.\",\n    \"confirm_modal_terminate_sessions\": \"Alle Geräte außer diesem werden abgemeldet. Bist du sicher?\",\n    \"confirm_modal_terminate_session\": \"Möchtest du dieses Gerät wirklich abmelden?\",\n    \"confirm_modal_clipboard_file_send\": \"Willst du wirklich die Datei(en) aus der Zwischenablage senden?\",\n    \"confirm_modal_clipboard_X_files_send\": \"{'one': 'Wirklich die Datei aus der Zwischenablage senden?', 'other': 'Wirklich die {} Dateien aus der Zwischenablage senden?'}\",\n    \"confirm_modal_message_delete\": \"Willst du diese Nachricht wirklich löschen?\",\n    \"confirm_modal_delete_X_messages\": \"{'one': '{} Nachricht', 'other': '{} Nachrichten'}\",\n    \"confirm_modal_delete_messages\": \"Wirklich {messages} löschen?\",\n    \"confirm_modal_message_revoke\": \"Bei {recipient} löschen\",\n    \"confirm_modal_message_revoke_recipient_chat\": \"allen\",\n    \"confirm_modal_delete_messages_for_everyone_chat\": \"Das wird sie bei allen im Chat löschen.\",\n    \"confirm_modal_delete_messages_for_you_only_pm\": \"Das wird sie nur bei dir löschen und nicht bei {user}.\",\n    \"confirm_modal_delete_messages_for_you_only_chat\": \"Das wird es nur bei dir löschen und nicht bei anderen Teilnehmern.\",\n    \"confirm_modal_photo_delete\": \"Möchtest du wirklich das Foto löschen?\",\n    \"confirm_modal_contacts_import\": \"Telegram wird nun deine Kontakte synchronisieren, um deine Freundesliste zusammenzustellen.\",\n    \"confirm_modal_login_phone_correct\": \"Stimmt die Nummer wirklich?\",\n    \"confirm_modal_forward_to_peer\": \"An {peer} weiterleiten?\",\n    \"confirm_modal_forward_to_peer_success\": \"Nachricht erfolgreich weitergeleitet.\",\n    \"confirm_modal_report_success\": \"Meldung gesendet\",\n    \"confirm_modal_send_to_peer\": \"An {peer} senden?\",\n    \"confirm_modal_share_file_peer\": \"Mit {peer} teilen?\",\n    \"confirm_modal_invite_peer\": \"In {peer} einladen?\",\n    \"confirm_modal_share_game\": \"Das Spiel mit {peer} teilen?\",\n    \"confirm_modal_apply_lang_with_reload_md\": \"App neu laden, um die neue Sprache zu verwenden?\",\n    \"confirm_modal_migrate_to_https_md\": \"Telegram Web unterstützt nun zusätzlich SSL-Verschlüsselung. Möchtest du zur HTTPS-Version wechseln?\\nDie HTTP-Version wird bald deaktiviert werden.\",\n    \"confirm_modal_resize_desktop_md\": \"Möchtest du zur Desktopansicht wechseln?\",\n    \"confirm_modal_resize_mobile_md\": \"Möchtest du zur mobilen Ansicht wechseln?\",\n    \"confirm_modal_recovery_email_empty_md\": \"Warnung! Wirklich keine E-Mail Adresse hinterlegen?\\n\\nWenn du dein Kennwort vergisst, verlierst du den Zugang zu deinem Telegram Konto. Für immer, ohne Ausnahme.\",\n    \"confirm_modal_abort_password_setup\": \"Einrichtung der zweistufigen Bestätigung abbrechen?\",\n    \"confirm_modal_reset_account_md\": \"Absolut sicher?\\nWenn du dein Konto zurücksetzt, verlierst du alle Chats und Nachrichten, ebenso deine geteilten Bilder und Videos.\",\n    \"confirm_modal_join_group_link\": \"Möchtest du der Gruppe «{title}» beitreten?\",\n    \"confirm_modal_join_channel_link\": \"Möchtest du dem Kanal «{title}» beitreten?\",\n    \"confirm_modal_revoke_group_link\": \"Bist du sicher, dass du diesen Link widerrufen willst? Dadurch kann ihn niemand mehr nutzen.\",\n    \"confirm_modal_revoke_channel_link\": \"Bist du sicher, dass du diesen Link widerrufen willst? Dadurch kann ihn niemand mehr nutzen.\",\n    \"confirm_modal_delete_channel_md\": \"Sicher, dass du diesen Kanal löschen willst?\\n\\nAlle Mitglieder und Nachrichten werden entfernt.\",\n    \"confirm_modal_delete_group_md\": \"Sicher, dass du diese Gruppe löschen willst?\\n\\nAlle Mitglieder und Nachrichten werden entfernt.\",\n    \"confirm_modal_jump_ext_url_md\": \"Link öffnen?\\n\\n{url}\",\n    \"confirm_modal_migrate_supergroup_md\": \"Gruppenmitglieder müssen ihre Telegram-App aktualisieren um diese Supergruppe benutzen zu können.\\n\\nGruppe wirklich in eine Supergruppe ändern?\",\n    \"confirm_modal_bot_access_phone\": \"Der Bot wird deine Nummer sehen. Das kann für verschiedene Dienste nützlich sein.\",\n    \"confirm_modal_bot_access_geo\": \"Teilt deinen aktuellen Standort mit dem Bot.\",\n    \"confirm_modal_bot_access_geo_inline\": \"Dieser Bot möchte bei jeder Anfrage deinen Standort wissen. Das kann für standortabhängig aufbereitete Informationen benutzt werden.\",\n    \"confirm_modal_content_settings_sensitive_md\": \"**Filterung ausschalten**\\nAktivierst du diese Funktion, werden sensible Medien in öffentlichen Kanälen auf all deinen Geräten angezeigt.\",\n    \"confirm_modal_content_settings_sensitive_submit\": \"Ausschalten\",\n    \"confirm_modal_are_u_sure\": \"Bist du sicher?\",\n    \"confirm_modal_logout_submit\": \"Abmelden\",\n    \"confirm_modal_clear_history_submit\": \"Verlauf löschen\",\n    \"confirm_modal_leave_chat_submit\": \"Verlassen\",\n    \"confirm_modal_delete_chat_submit\": \"Chat löschen\",\n    \"confirm_modal_clipboard_files_send_submit\": \"Senden\",\n    \"confirm_modal_clipboard_file_send_submit\": \"Senden\",\n    \"confirm_modal_message_delete_submit\": \"Löschen\",\n    \"confirm_modal_messages_delete_submit\": \"Löschen\",\n    \"confirm_modal_photo_delete_submit\": \"Löschen\",\n    \"confirm_modal_forward_message_submit\": \"Nachricht weiterleiten\",\n    \"confirm_modal_share_photo_submit\": \"Bild weiterleiten\",\n    \"confirm_modal_share_video_submit\": \"Video weiterleiten\",\n    \"confirm_modal_share_contact_submit\": \"Kontakt senden\",\n    \"confirm_modal_share_file_submit\": \"Datei teilen\",\n    \"confirm_modal_reset_account_submit\": \"Konto zurücksetzen\",\n    \"contacts_modal_edit_list\": \"Bearbeiten\",\n    \"contacts_modal_edit_cancel\": \"Abbrechen\",\n    \"contacts_modal_edit_delete\": \"Löschen\",\n    \"contacts_modal_pluralize_new_group_members\": \"{'one': '1 Mitglied', 'other': '{} Mitglieder'}\",\n    \"contacts_modal_title\": \"Kontakte\",\n    \"contacts_modal_new_contact\": \"Neuer Kontakt\",\n    \"contacts_modal_empty_list\": \"Deine Kontaktliste ist leer. Du kannst {import-link: einen neuen Kontakt} per Telefonnumer hinzufügen.\",\n    \"conversations_modal_forward_title\": \"Weiterleiten\",\n    \"conversations_modal_forward_submit\": \"Weiterleiten\",\n    \"conversations_modal_select_recipients\": \"Empfänger wählen\",\n    \"conversations_modal_recipients\": \"Empfänger:\",\n    \"conversations_modal_share_url_loading\": \"Lade{dots}\",\n    \"conversations_modal_share_url_copy\": \"Link kopieren\",\n    \"contact_edit_modal_first_name\": \"Vorname\",\n    \"contact_edit_modal_last_name\": \"Nachname\",\n    \"contact_edit_modal_title\": \"Kontakt bearbeiten\",\n    \"contact_edit_modal_submit\": \"Speichern\",\n    \"contact_edit_modal_submit_active\": \"Speichere...\",\n    \"contact_import_modal_title\": \"Hinzufügen\",\n    \"contact_import_modal_phone\": \"Telefonnummer\",\n    \"contact_import_modal_phonebook\": \"Telefonbuch\",\n    \"contact_import_modal_submit\": \"Speichern\",\n    \"contact_import_modal_submit_active\": \"Importiere...\",\n    \"conversation_you\": \"Du\",\n    \"conversation_draft\": \"Entwurf:\",\n    \"conversation_media_photo\": \"Bild\",\n    \"conversation_media_video\": \"Video\",\n    \"conversation_media_round\": \"Videonachricht\",\n    \"conversation_media_document\": \"Datei\",\n    \"conversation_media_sticker\": \"Sticker\",\n    \"conversation_media_gif\": \"GIF\",\n    \"conversation_media_audio\": \"Audio\",\n    \"conversation_media_location\": \"Standort\",\n    \"conversation_media_contact\": \"Kontakt\",\n    \"conversation_media_attachment\": \"Anhang\",\n    \"conversation_media_unsupported\": \"Nicht unterstützte Datei\",\n    \"conversation_search_peer\": \"Diesen Chat durchsuchen\",\n    \"conversation_group_created\": \"hat die Gruppe erstellt\",\n    \"conversation_group_renamed\": \"hat den Gruppennamen geändert\",\n    \"conversation_group_photo_updated\": \"hat das Gruppenbild geändert\",\n    \"conversation_group_photo_removed\": \"hat das Gruppenbild entfernt\",\n    \"conversation_returned_to_group\": \"ist zur Gruppe zurückgekehrt\",\n    \"conversation_joined_group\": \"ist der Gruppe beigetreten\",\n    \"conversation_invited_user\": \"hat {user} eingeladen\",\n    \"conversation_invited_users\": \"{'one': 'hat {} Mitglied hinzugefügt', 'other': 'hat {} Benutzer hinzugefügt'}\",\n    \"conversation_left_group\": \"hat die Gruppe verlassen\",\n    \"conversation_kicked_user\": \"hat {user} entfernt\",\n    \"conversation_invited_user_message\": \"hat Benutzer eingeladen\",\n    \"conversation_kicked_user_message\": \"hat Benutzer entfernt\",\n    \"conversation_joined_by_link\": \"ist der Gruppe beigetreten\",\n    \"conversation_converted_to_supergroup\": \"in eine Supergruppe geändert\",\n    \"conversation_created_channel\": \"Kanal erstellt\",\n    \"conversation_changed_channel_name\": \"Kanal umbenannt\",\n    \"conversation_changed_channel_photo\": \"Bild geändert\",\n    \"conversation_removed_channel_photo\": \"Bild gelöscht\",\n    \"conversation_pinned_message\": \"hat Nachricht angeheftet\",\n    \"conversation_scored_X\": \"{'one': 'erzielte {} Punkte', 'other': 'erzielten {} Punkte'}\",\n    \"conversation_message_sent\": \"hat dir eine Nachricht gesendet\",\n    \"conversation_forwarded_X_messages\": \"{'one': 'hat {} Nachricht weitergeleitet', 'other': 'hat {} Nachrichten weitergeleitet'}\",\n    \"conversation_unknown_user\": \"Jemand\",\n    \"conversation_unknown_chat\": \"Unbekannte Unterhaltung\",\n    \"message_service_created_group\": \"hat die Gruppe {group-name} erstellt\",\n    \"message_service_changed_group_name\": \"hat den Gruppennamen zu {group-name} geändert\",\n    \"message_service_changed_group_photo\": \"hat das Gruppenbild geändert\",\n    \"message_service_removed_group_photo\": \"hat das Gruppenbild entfernt\",\n    \"message_service_invited_user\": \"hat {user} eingeladen\",\n    \"message_service_invited_users\": \"hat {user} und {num-more} weitere hinzugefügt\",\n    \"message_service_returned_to_group\": \"ist zur Gruppe zurückgekehrt\",\n    \"message_service_kicked_user\": \"hat {user} entfernt\",\n    \"message_service_left_group\": \"hat die Gruppe verlassen\",\n    \"message_service_joined_by_link\": \"ist per Einladungslink der Gruppe beigetreten\",\n    \"message_service_joined\": \"ist der Gruppe beigetreten\",\n    \"message_service_pinned_message\": \"hat «{message}» angeheftet\",\n    \"message_service_phonecall_incoming\": \"Eingehender Anruf\",\n    \"message_service_phonecall_outgoing\": \"Ausgehender Anruf\",\n    \"message_service_phonecall_missed\": \"Verpasster Anruf\",\n    \"message_service_phonecall_canceled\": \"Abgebrochener Anruf\",\n    \"message_service_phonecall\": \"Anruf {duration}\",\n    \"message_service_scored_game\": \"{scored} bei {message}\",\n    \"message_service_unsupported_action\": \"nicht unterstützte Aktion: {action}\",\n    \"message_service_bot_intro_header\": \"Was kann dieser Bot?\",\n    \"message_service_converted_to_supergroup\": \"hat die Gruppe in eine Supergruppe geändert\",\n    \"message_service_created_channel\": \"Kanal erstellt\",\n    \"message_service_changed_channel_name\": \"Kanal umbenannt in {channel-name}\",\n    \"message_service_changed_channel_photo\": \"Bild geändert\",\n    \"message_service_removed_channel_photo\": \"Bild gelöscht\",\n    \"message_service_scored_X\": \"{'one': 'erzielte {} Punkte', 'other': 'erzielten {} Punkte'}\",\n    \"message_service_payment_sent\": \"Zahlung gesendet\",\n    \"message_service_screenshot_taken\": \"hat ein Bildschirmfoto gemacht!\",\n    \"message_admin_badge\": \"Admin\",\n    \"message_action_reply\": \"Antworten\",\n    \"message_action_edit\": \"Bearbeiten\",\n    \"message_action_delete\": \"Löschen\",\n    \"message_action_report\": \"Melden\",\n    \"message_action_forward\": \"Weiterleiten\",\n    \"message_action_select\": \"Auswählen\",\n    \"message_action_cancel\": \"Abbrechen\",\n    \"message_action_retry\": \"Erneut versuchen\",\n    \"error_modal_warning_title\": \"Warnung\",\n    \"error_modal_bad_request_title\": \"Fehler\",\n    \"error_modal_unauthorized_title\": \"Nicht autorisiert\",\n    \"error_modal_forbidden_title\": \"Zugang verweigert\",\n    \"error_modal_not_found_title\": \"Nicht gefunden\",\n    \"error_modal_network_title\": \"Netzwerkfehler\",\n    \"error_modal_flood_title\": \"Zu schnell\",\n    \"error_modal_internal_title\": \"Serverfehler\",\n    \"error_modal_alert\": \"Warnung\",\n    \"error_modal_email_unconfirmed_title\": \"Fast geschafft!\",\n    \"error_modal_email_unconfirmed_descripion\": \"Bitte überprüfe deine Mails (auch den Spam-Ordner) um die zweistufige Bestätigung abzuschließen.\",\n    \"error_modal_password_success_title\": \"Geschafft!\",\n    \"error_modal_password_disabled_title\": \"Kennwort deaktiviert\",\n    \"error_modal_media_not_supported_title\": \"Nicht unterstütze Medien\",\n    \"error_modal_phonecalls_not_supported_title\": \"Anrufe sind noch nicht verfügbar\",\n    \"error_modal_recovery_na_title\": \"Tut uns leid\",\n    \"error_modal_network_description\": \"Bitte überprüfe deine Internetverbindung.\",\n    \"error_modal_firstname_invali_description\": \"Der eingegebene Vorname ist ungültig.\",\n    \"error_modal_lastname_invalid_description\": \"Der eingegebene Nachname ist ungültig.\",\n    \"error_modal_phone_invalid_description\": \"Die eingegebene Telefonnummer ist ungültig.\",\n    \"error_modal_users_too_much_description\": \"Zu viele Mitglieder in der Gruppe.\",\n    \"error_modal_photo_dimensions_invalid_description\": \"Die Bildabmessungen sind ungültig, bitte andere Datei auswählen.\",\n    \"error_modal_video_file_invalid_description\": \"Das Videoformat ist ungültig oder wird nicht unterstützt, bitte wähle eine andere Datei aus.\",\n    \"error_modal_photo_too_small_description\": \"Das ausgewählte Bild ist zu klein.\",\n    \"error_modal_no_phone_user_description_md\": \"Es gibt leider kein **Telegram** Konto mit der angegebenen Nummer.\",\n    \"error_modal_no_phone_users_description_md\": \"Es gibt gibt leider keine **Telegram** Konten mit den angegebenen Nummern.\",\n    \"error_modal_username_invalid_description\": \"Verzeihung, dieser Benutzername ist nicht erlaubt.\",\n    \"error_modal_phonebook_required_description\": \"Telegram benötigt Zugriff aufs Telefonbuch um Kontakte zu importieren.\",\n    \"error_modal_username_occupied_description\": \"Benutzername ist leider schon belegt.\",\n    \"error_modal_media_not_supported_description\": \"Dein Browser kann diese Mediendatei nicht wiedergeben. Lade die Datei herunter und versuche sie mit einem externen Player zu öffnen.\",\n    \"error_modal_username_not_found_description\": \"Es gibt leider kein Telegram Konto mit dem Benutzernamen.\",\n    \"error_modal_phonecalls_not_supported_description_md\": \"Leider werden Anrufe in der Web App noch nicht unterstützt.\\n\\nDu kannst {user} über unsere mobilen Apps oder Desktop Clients anrufen.\\n{download-link: Download »}\",\n    \"error_modal_app_signup_forbidden_md\": \"Du hast noch kein Telegram Konto, bitte **registriere** dich zuerst über  {signup-link: Android / iPhone}.\",\n    \"error_modal_bad_request_description\": \"Ein Parameter fehlt oder ist ungültig.\",\n    \"error_modal_unauthorized_description\": \"Diese Aktion benötigt autorisierten Zugriff. Bitte {login-link: melde dich an}.\",\n    \"error_modal_forbidden_description\": \"Diese Aktion ist für dich nicht erlaubt.\",\n    \"error_modal_not_found_description\": \"Die Seite wurde nicht gefunden.\",\n    \"error_modal_flood_description\": \"Du führst zu viele Anfragen durch. Bitte versuche es später wieder.\",\n    \"error_modal_internal_description\": \"Ein interner Serverfehler ist aufgetreten. Bitte versuche es später wieder.\",\n    \"error_modal_tech_details\": \"Hier klicken für technische Details\",\n    \"error_modal_recovery_na_description\": \"Da du für diesen Fall keine E-Mail Adresse hinterlegt hast, kannst du nur noch hoffen, dass dir dein Kennwort wieder einfällt oder du musst dein Telegram Konto zurückzusetzen.\",\n    \"error_modal_password_success_descripion\": \"Dein Kennwort für die zweistufige Bestätigung ist jetzt aktiv.\",\n    \"error_modal_password_disabled_descripion\": \"Zweistufige Bestätigung deaktiviert.\",\n    \"error_modal_user_not_mutual_contact\": \"Nutzer kann nur durch eigene Kontakte eingeladen werden\",\n    \"error_modal_invite_link_invalid\": \"Der Einladungslink ist ungültig\",\n    \"error_modal_channel_not_accessible\": \"Dieser Kanal ist nicht mehr zugänglich.\",\n    \"error_modal_not_contact_flood\": \"Derzeit kannst du nur Kontakten schreiben, die auch deine Nummer haben. {more-info-link: Mehr Infos »}\",\n    \"error_modal_gelocation_na\": \"App kann deinen aktuellen Standort nicht bestimmen\",\n    \"error_modal_2fa_recent_confirm\": \"Deine vorherigen Versuche das Konto zurückzusetzen wurden durch den aktiven Nutzer abgebrochen. Bitte in 7 Tagen erneut probieren.\",\n    \"error_modal_2fa_delayed_time_md\": \"Du kannst dein Konto zurücksetzen in: **{time}**\",\n    \"head_mainmenu\": \"Hauptmenü\",\n    \"head_telegram\": \"Telegram\",\n    \"head_new_group\": \"Neue Gruppe\",\n    \"head_new_contact\": \"Neuer Kontakt\",\n    \"head_contacts\": \"Kontakte\",\n    \"head_contacts_title\": \"Kontakte\",\n    \"head_telegram_faq\": \"Telegram FAQ\",\n    \"head_settings\": \"Einstellungen\",\n    \"head_log_out\": \"Abmelden\",\n    \"head_peer_more\": \"Weiteres\",\n    \"head_select_messages\": \"Nachrichten auswählen\",\n    \"head_media_photos\": \"Bilder\",\n    \"head_media_video\": \"Videos\",\n    \"head_media_documents\": \"Dateien\",\n    \"head_media_music\": \"Audio\",\n    \"head_media_links\": \"Geteilte Links\",\n    \"head_media_audio\": \"Sprachnachrichten\",\n    \"head_media_round\": \"Videonachrichten\",\n    \"head_media_mymentions\": \"Erwähnungen\",\n    \"head_media_search\": \"Suchen\",\n    \"head_about\": \"Info\",\n    \"head_clear_all\": \"Verlauf löschen\",\n    \"head_select\": \"Auswählen\",\n    \"head_typing\": \"schreibt\",\n    \"head_pluralize_participants\": \"{'0': 'Keine Mitglieder', 'one': '1 Mitglied', 'other': '{} Mitglieder'}\",\n    \"head_one_typing\": \"{name1} schreibt{dots}\",\n    \"head_two_typing\": \"{name1}, {name2}{dots}\",\n    \"head_many_typing\": \"{name1}+{names}{dots}\",\n    \"head_waiting_for_network\": \"Warte auf Verbindung\",\n    \"head_retry\": \"Erneut versuchen\",\n    \"head_connecting\": \"Verbinde\",\n    \"footer_twitter\": \"Twitter\",\n    \"im_new_group\": \"Neue Gruppe\",\n    \"im_new_contact\": \"Neuer Kontakt\",\n    \"im_contacts\": \"Kontakte\",\n    \"im_chat_contacts_title\": \"Chats und Kontakte\",\n    \"im_settings\": \"Einstellungen\",\n    \"im_conversations\": \"Unterhaltungen\",\n    \"im_found_title\": \"Globale Suche\",\n    \"im_messages\": \"Nachrichten\",\n    \"im_no_contacts\": \"Noch keine Kontakte\",\n    \"im_get_started_long\": \"Beginne mit dem Hinzufügen von Kontakten\",\n    \"im_add_contact\": \"Konktakt hinzufügen\",\n    \"im_import_phonebook\": \"Telefonbuch importieren\",\n    \"im_get_started\": \"Schnelleinstieg\",\n    \"im_welcome_text\": \"Willkommen bei Telegram Web. Du kannst jederzeit dein Profilbild und deinen Namen in den Einstellungen ändern.\",\n    \"im_open_settings\": \"Einstellungen öffnen\",\n    \"im_select_a_chat\": \"Bitte wähle einen Chat aus, um eine Unterhaltung zu beginnen\",\n    \"im_loading_history\": \"Lade Verlauf\",\n    \"im_media\": \"Medien\",\n    \"im_media_photos\": \"Bilder\",\n    \"im_media_video\": \"Videos\",\n    \"im_media_documents\": \"Dateien\",\n    \"im_media_audio\": \"Sprachnachrichten\",\n    \"im_media_round\": \"Videonachrichten\",\n    \"im_media_music\": \"Audio\",\n    \"im_media_links\": \"Geteilte Links\",\n    \"im_media_mentions\": \"Erwähnungen und Antworten\",\n    \"im_pluralize_participants\": \"{'0': 'Keine Mitglieder', 'one': '1 Mitglied', 'other': '{} Mitglieder'}\",\n    \"im_show_recent_messages\": \"Zeige aktuelle Nachrichten\",\n    \"im_show_all_messages\": \"Zeige alle Nachrichten\",\n    \"im_no_messages\": \"Noch keine Nachrichten vorhanden...\",\n    \"im_one_typing\": \"{name1} schreibt{dots}\",\n    \"im_two_typing\": \"{name1} und {name2} schreiben{dots}\",\n    \"im_many_typing\": \"{name1}, {name2} und {count} weiter schreiben{dots}\",\n    \"im_conversation_single_typing\": \"tippt{dots}\",\n    \"im_conversation_group_typing\": \"{name} tippt{dots}\",\n    \"im_delete_chat\": \"Chat löschen\",\n    \"im_clear_history\": \"Verlauf löschen\",\n    \"im_delete\": \"{count} Löschen\",\n    \"im_forward\": \"{count} weiterleiten\",\n    \"im_reply\": \"Antworten\",\n    \"im_edit\": \"Bearbeiten\",\n    \"im_start\": \"Starten\",\n    \"im_channel_join\": \"Beitreten\",\n    \"im_channel_mute\": \"Stumm\",\n    \"im_channel_unmute\": \"Stumm aus\",\n    \"im_report\": \"{count} melden\",\n    \"im_reply_loading\": \"Lade{dots}\",\n    \"im_X_forwarded_messages\": \"{'one': 'hat {} Nachricht weitergeleitet', 'other': 'hat {} Nachrichten weitergeleitet'}\",\n    \"im_photos_drop_text\": \"Bilder hier reinschieben um sie zu verschicken\",\n    \"im_message_field_placeholder\": \"Nachricht\",\n    \"im_broadcast_field_placeholder\": \"Broadcast...\",\n    \"im_emoji_tab\": \"Emoji\",\n    \"im_stickers_tab\": \"Sticker\",\n    \"im_stickers_tab_recent\": \"Häufig genutzt\",\n    \"im_voice_record_title\": \"Eine Nachricht aufnehmen\",\n    \"im_media_attach_title\": \"Medien senden\",\n    \"im_attach_file_title\": \"Datei senden\",\n    \"im_emoji_btn_title\": \"Emoticon einfügen\",\n    \"im_submit_message\": \"Senden\",\n    \"im_submit_edit_message\": \"Speichern\",\n    \"im_edit_message_title\": \"Nachricht bearbeiten\",\n    \"im_voice_recording_label\": \"Zum Abbrechen rausbewegen\",\n    \"im_voice_recording_cancel_label\": \"Loslassen, um abzubrechen\",\n    \"im_voice_processing_label\": \"Verarbeite{dots}\",\n    \"login_sign_in\": \"Anmelden\",\n    \"login_enter_number_description_md\": \"Bitte wähle dein Land und tippe die vollständige Handynummer deines bestehenden Kontos ein.\\n\\nUm dich neu bei Telegram zu registrieren, verwende eine unserer  {apps-link: mobilen Apps}.\",\n    \"login_incorrect_number\": \"Falsche Telefonnummer\",\n    \"login_code_input_placeholder\": \"Code\",\n    \"login_tel_input_placeholder\": \"Telefonnummer\",\n    \"login_country_select_placeholder\": \"Land\",\n    \"login_generating_key\": \"Schlüssel werden erstellt\",\n    \"login_generating_keys_info\": \"Schlüssel werden nur einmalig generiert, was auf langsamen Geräten eine Weile dauern könnte. Bitte ein wenig Geduld haben.\",\n    \"login_edit_number\": \"Telefonnummer bearbeiten\",\n    \"login_enter_code_label_md\": \"Code wurde dir per **Telegram** an dein anderes Gerät gesendet.\\nBitte diesen unten eingeben.\",\n    \"login_enter_sms_code_label_md\": \"Code wurde dir soeben per SMS gesendet.\\nBitte diesen unten eingeben.\",\n    \"login_enter_call_code_label_md\": \"Wir rufen dich an, um dir einen Code zu diktieren.\\nBitte diesen unten eingeben.\",\n    \"login_code_remaining\": \"Du kannst eine SMS in {remaining} anfordern\",\n    \"login_call_remaining\": \"Du kannst einen Anruf in {remaining} anfordern\",\n    \"login_code_not_received\": \"Code per SMS senden\",\n    \"login_code_not_received_call\": \"Code per Anruf senden\",\n    \"login_code_requesting\": \"Code wird angefordert\",\n    \"login_incorrect_sms_code\": \"Falscher SMS-Code\",\n    \"login_number_input_placeholder\": \"Code eingeben\",\n    \"login_checking_code\": \"Überprüfe Code\",\n    \"login_your_info\": \"Deine Angaben\",\n    \"login_fulll_name_label\": \"Bitte Vor- und Nachnamen eingeben, um ein Telegram-Konto einzurichten.\",\n    \"login_incorrect_first_name\": \"Falscher Vorname\",\n    \"login_first_name\": \"Vorname\",\n    \"login_incorrect_last_name\": \"Falscher Nachname\",\n    \"login_last_name\": \"Nachname\",\n    \"login_signing_up\": \"Registriere\",\n    \"login_sign_up\": \"Registrieren\",\n    \"login_about_title\": \"Info\",\n    \"login_about_hide\": \"verstecken\",\n    \"login_try_desktop\": \"For best experience on your computer, try {telegram-link}\",\n    \"login_try_desktop_btn\": \"Download Telegram\",\n    \"login_try_desktop_short_btn\": \"Download\",\n    \"login_about_desc1_md\": \"Die **Telegram Weboberfläche** ist schnell und vor allem sicher und installationsfrei in jedem aktuellen Webbrowser nutzbar.\",\n    \"login_about_desc2_md\": \"Chats werden mit der **Telegram Cloud** synchronisiert, so dass man alles von jedem Endgerät aus einsehen kann.\",\n    \"login_about_desc3_md\": \"Unser {source-link: Quelltext} ist öffentlich, jeder kann mithelfen.\",\n    \"login_about_intro\": \"Willkommen bei der offiziellen Telegram Weboberfläche.\",\n    \"login_about_learn\": \"Weitere Informationen\",\n    \"login_password_title\": \"Kennwort\",\n    \"login_password_label\": \"Du hast die zweistufige Bestätigung aktiviert. Dein Konto ist mit einem zusätzlichem Kennwort geschützt.\",\n    \"login_password_forgot_link\": \"Kennwort vergessen?\",\n    \"login_account_reset\": \"Konto zurücksetzen\",\n    \"login_password\": \"Dein Kennwort\",\n    \"login_incorrect_password\": \"Falsches Kennwort\",\n    \"login_checking_password\": \"Prüfe\",\n    \"login_recovery_title\": \"Kennwort vergessen?\",\n    \"login_code_placeholder\": \"Code\",\n    \"login_code_incorrect\": \"Falscher Code.\",\n    \"login_recovery_description_md\": \"Wir haben dir einen Code an deine E-Mail Adresse gesendet: \\n{email}\\n\\nÜberprüfe deine Mails und gib den 6-stelligen Code aus userer E-Mail ein.\",\n    \"password_recover_active\": \"Prüfe...\",\n    \"password_recover_submit\": \"Absenden\",\n    \"login_controller_unknown_country\": \"Unbekannt\",\n    \"message_forwarded_message\": \"Weitergeleitete Nachricht\",\n    \"message_via_bot\": \"via {bot}\",\n    \"message_edited\": \"bearbeitet\",\n    \"message_forwarded_message_mobile\": \"Weitergeleitet von {from}\",\n    \"message_forwarded_via_message_mobile\": \"Weitergeleitet von {from} via {bot}\",\n    \"message_attach_audio_message\": \"Sprachnachricht\",\n    \"message_attach_audio_play\": \"Abspielen\",\n    \"message_attach_document_open\": \"Öffnen\",\n    \"message_attach_document_download\": \"Download\",\n    \"message_attach_document_save\": \"Speichern\",\n    \"message_attach_video_video\": \"Video\",\n    \"message_attach_video_download\": \"Download\",\n    \"message_attach_video_save\": \"Speichern\",\n    \"message_attach_video_play\": \"Video abspielen\",\n    \"message_attach_unsupported\": \"Diese Nachricht wird von deiner Telegram Web nicht unterstützt. Bitte aktualisiere die App um sie zu sehen: {link}.\",\n    \"message_attach_unsupported_desktop\": \"Diese Nachricht wird von Telegram Web noch nicht unterstützt. Benutze stattdessen {link}.\",\n    \"message_attach_notweb\": \"Diese Nachricht wird von Telegram Web noch nicht unterstützt. Bitte benutze unsere mobilen Apps, um sie zu sehen: {link}.\",\n    \"conversation_select_modal_title\": \"Unterhaltung auswählen\",\n    \"conversation_select_modal_chats_contacts\": \"Chats und Kontakte\",\n    \"conversation_one_selected\": \"{name1}\",\n    \"conversation_two_selected\": \"{name1} und {name2}\",\n    \"conversation_many_selected\": \"{name1}, {name2} und {count} weitere\",\n    \"phonebook_modal_title\": \"Telefonbuch\",\n    \"phonebook_modal_deselect_all\": \"Auswahl aufheben\",\n    \"phonebook_modal_select_all\": \"Alle auswählen\",\n    \"phonebook_modal_empty\": \"Dein Telefonbuch ist leer.\",\n    \"phonebook_modal_submit_active\": \"Importiere\",\n    \"phonebook_modal_submit\": \"Kontakte importieren\",\n    \"inactive_tab_title\": \"Telegram: Zzz...\",\n    \"inactive_title\": \"Oh-oh, so viele Tabs....\",\n    \"inactive_description_md\": \"Telegram unterstützt nur jeweils einen aktiven Tab.\\nBitte lade die Seite neu oder schließe den Tab.\",\n    \"inactive_reload_btn\": \"Neu laden\",\n    \"push_action_mute1d\": \"Hintergr.-Benachrichtigungen 1 Tag stumm\",\n    \"push_action_settings\": \"Hintergr.-Benachrichtigungseinstellungen\",\n    \"push_action_mute1d_mobile\": \"Stumm für 24h\",\n    \"push_action_settings_mobile\": \"Einstellungen\",\n    \"push_message_nopreview\": \"Du hast eine neue Nachricht\",\n    \"push_action_mute1d_success\": \"Benachrichtigungseinstellungen erfolgreich gespeichert.\",\n    \"country_select_modal_country_ab\": \"Abchasien\",\n    \"country_select_modal_country_af\": \"Afghanistan\",\n    \"country_select_modal_country_ax\": \"Åland-Inseln\",\n    \"country_select_modal_country_al\": \"Albanien\",\n    \"country_select_modal_country_dz\": \"Algerien\",\n    \"country_select_modal_country_as\": \"Amerikanisch-Samoa\",\n    \"country_select_modal_country_ad\": \"Andorra\",\n    \"country_select_modal_country_ao\": \"Angola\",\n    \"country_select_modal_country_ai\": \"Anguilla\",\n    \"country_select_modal_country_ag\": \"Antigua und Barbuda\",\n    \"country_select_modal_country_ar\": \"Argentinien\",\n    \"country_select_modal_country_am\": \"Armenien\",\n    \"country_select_modal_country_aw\": \"Aruba\",\n    \"country_select_modal_country_sh_ac\": \"Ascension\",\n    \"country_select_modal_country_au\": \"Australien\",\n    \"country_select_modal_country_au_et\": \"Australisches externes Territorium\",\n    \"country_select_modal_country_at\": \"Österreich\",\n    \"country_select_modal_country_az\": \"Aserbaidschan\",\n    \"country_select_modal_country_bs\": \"Bahamas\",\n    \"country_select_modal_country_bh\": \"Bahrain\",\n    \"country_select_modal_country_bd\": \"Bangladesch\",\n    \"country_select_modal_country_bb\": \"Barbados\",\n    \"country_select_modal_country_ag_bar\": \"Barbuda\",\n    \"country_select_modal_country_by\": \"Belarus\",\n    \"country_select_modal_country_be\": \"Belgien\",\n    \"country_select_modal_country_bz\": \"Belize\",\n    \"country_select_modal_country_bj\": \"Benin\",\n    \"country_select_modal_country_bm\": \"Bermuda\",\n    \"country_select_modal_country_bt\": \"Bhutan\",\n    \"country_select_modal_country_bo\": \"Bolivien\",\n    \"country_select_modal_country_bq\": \"Karibische Niederlande\",\n    \"country_select_modal_country_ba\": \"Bosnien und Herzegowina\",\n    \"country_select_modal_country_bw\": \"Botsuana\",\n    \"country_select_modal_country_br\": \"Brasilien\",\n    \"country_select_modal_country_io\": \"Britisches Territorium im Indischen Ozean\",\n    \"country_select_modal_country_vg\": \"Britische Jungferninseln\",\n    \"country_select_modal_country_bn\": \"Brunei Darussalam\",\n    \"country_select_modal_country_bg\": \"Bulgarien\",\n    \"country_select_modal_country_bf\": \"Burkina Faso\",\n    \"country_select_modal_country_mm\": \"Myanmar\",\n    \"country_select_modal_country_bi\": \"Burundi\",\n    \"country_select_modal_country_kh\": \"Kambodscha\",\n    \"country_select_modal_country_cm\": \"Kamerun\",\n    \"country_select_modal_country_ca\": \"Kanada\",\n    \"country_select_modal_country_cv\": \"Kap Verde\",\n    \"country_select_modal_country_ky\": \"Kaimaninseln\",\n    \"country_select_modal_country_cf\": \"Zentralafrikanische Republik\",\n    \"country_select_modal_country_td\": \"Tschad\",\n    \"country_select_modal_country_cl\": \"Chile\",\n    \"country_select_modal_country_cn\": \"China\",\n    \"country_select_modal_country_cx\": \"Weihnachtsinsel\",\n    \"country_select_modal_country_cc\": \"Kokosinseln\",\n    \"country_select_modal_country_co\": \"Kolumbien\",\n    \"country_select_modal_country_km\": \"Komoren\",\n    \"country_select_modal_country_cg\": \"Kongo-Brazzaville\",\n    \"country_select_modal_country_cd\": \"Kongo-Kinshasa\",\n    \"country_select_modal_country_ck\": \"Cookinseln\",\n    \"country_select_modal_country_cr\": \"Costa Rica\",\n    \"country_select_modal_country_ci\": \"Côte d’Ivoire\",\n    \"country_select_modal_country_hr\": \"Kroatien\",\n    \"country_select_modal_country_cu\": \"Kuba\",\n    \"country_select_modal_country_cw\": \"Curaçao\",\n    \"country_select_modal_country_cy\": \"Zypern\",\n    \"country_select_modal_country_cz\": \"Tschechische Republik\",\n    \"country_select_modal_country_dk\": \"Dänemark\",\n    \"country_select_modal_country_dg\": \"Diego Garcia\",\n    \"country_select_modal_country_dj\": \"Dschibuti\",\n    \"country_select_modal_country_dm\": \"Dominica\",\n    \"country_select_modal_country_do\": \"Dominikanische Republik\",\n    \"country_select_modal_country_tl\": \"Timor-Leste\",\n    \"country_select_modal_country_ec\": \"Ecuador\",\n    \"country_select_modal_country_eg\": \"Ägypten\",\n    \"country_select_modal_country_sv\": \"El Salvador\",\n    \"country_select_modal_country_gq\": \"Äquatorialguinea\",\n    \"country_select_modal_country_er\": \"Eritrea\",\n    \"country_select_modal_country_ee\": \"Estland\",\n    \"country_select_modal_country_et\": \"Äthiopien\",\n    \"country_select_modal_country_fk\": \"Falklandinseln\",\n    \"country_select_modal_country_fo\": \"Färöer\",\n    \"country_select_modal_country_fj\": \"Fidschi\",\n    \"country_select_modal_country_fi\": \"Finnland\",\n    \"country_select_modal_country_fr\": \"Frankreich\",\n    \"country_select_modal_country_gf\": \"Französisch-Guayana\",\n    \"country_select_modal_country_pf\": \"Französisch-Polynesien\",\n    \"country_select_modal_country_ga\": \"Gabun\",\n    \"country_select_modal_country_gm\": \"Gambia\",\n    \"country_select_modal_country_ge\": \"Georgien\",\n    \"country_select_modal_country_de\": \"Deutschland\",\n    \"country_select_modal_country_gh\": \"Ghana\",\n    \"country_select_modal_country_gi\": \"Gibraltar\",\n    \"country_select_modal_country_gr\": \"Griechenland\",\n    \"country_select_modal_country_gl\": \"Grönland\",\n    \"country_select_modal_country_gd\": \"Grenada\",\n    \"country_select_modal_country_gp\": \"Guadeloupe\",\n    \"country_select_modal_country_gu\": \"Guam\",\n    \"country_select_modal_country_gt\": \"Guatemala\",\n    \"country_select_modal_country_gg\": \"Guernsey\",\n    \"country_select_modal_country_gn\": \"Guinea\",\n    \"country_select_modal_country_gw\": \"Guinea-Bissau\",\n    \"country_select_modal_country_gy\": \"Guyana\",\n    \"country_select_modal_country_ht\": \"Haiti\",\n    \"country_select_modal_country_hn\": \"Honduras\",\n    \"country_select_modal_country_hk\": \"Hongkong (Sonderverwaltungszone)\",\n    \"country_select_modal_country_hu\": \"Ungarn\",\n    \"country_select_modal_country_is\": \"Island\",\n    \"country_select_modal_country_in\": \"Indien\",\n    \"country_select_modal_country_id\": \"Indonesien\",\n    \"country_select_modal_country_ir\": \"Iran\",\n    \"country_select_modal_country_iq\": \"Irak\",\n    \"country_select_modal_country_ie\": \"Irland\",\n    \"country_select_modal_country_il\": \"Israel\",\n    \"country_select_modal_country_it\": \"Italien\",\n    \"country_select_modal_country_jm\": \"Jamaika\",\n    \"country_select_modal_country_sj\": \"Svalbard und Jan Mayen\",\n    \"country_select_modal_country_jp\": \"Japan\",\n    \"country_select_modal_country_je\": \"Jersey\",\n    \"country_select_modal_country_jo\": \"Jordanien\",\n    \"country_select_modal_country_kz\": \"Kasachstan\",\n    \"country_select_modal_country_ke\": \"Kenia\",\n    \"country_select_modal_country_ki\": \"Kiribati\",\n    \"country_select_modal_country_kp\": \"Nordkorea\",\n    \"country_select_modal_country_kr\": \"Südkorea\",\n    \"country_select_modal_country_kw\": \"Kuwait\",\n    \"country_select_modal_country_kg\": \"Kirgisistan\",\n    \"country_select_modal_country_la\": \"Laos\",\n    \"country_select_modal_country_lv\": \"Lettland\",\n    \"country_select_modal_country_lb\": \"Libanon\",\n    \"country_select_modal_country_ls\": \"Lesotho\",\n    \"country_select_modal_country_lr\": \"Liberia\",\n    \"country_select_modal_country_ly\": \"Libyen\",\n    \"country_select_modal_country_li\": \"Liechtenstein\",\n    \"country_select_modal_country_lt\": \"Litauen\",\n    \"country_select_modal_country_lu\": \"Luxemburg\",\n    \"country_select_modal_country_mo\": \"Sonderverwaltungsregion Macau\",\n    \"country_select_modal_country_mk\": \"Mazedonien\",\n    \"country_select_modal_country_mg\": \"Madagaskar\",\n    \"country_select_modal_country_mw\": \"Malawi\",\n    \"country_select_modal_country_my\": \"Malaysia\",\n    \"country_select_modal_country_mv\": \"Malediven\",\n    \"country_select_modal_country_ml\": \"Mali\",\n    \"country_select_modal_country_mt\": \"Malta\",\n    \"country_select_modal_country_mh\": \"Marshallinseln\",\n    \"country_select_modal_country_mq\": \"Martinique\",\n    \"country_select_modal_country_mr\": \"Mauretanien\",\n    \"country_select_modal_country_mu\": \"Mauritius\",\n    \"country_select_modal_country_yt\": \"Mayotte\",\n    \"country_select_modal_country_mx\": \"Mexiko\",\n    \"country_select_modal_country_fm\": \"Mikronesien\",\n    \"country_select_modal_country_md\": \"Republik Moldau\",\n    \"country_select_modal_country_mc\": \"Monaco\",\n    \"country_select_modal_country_mn\": \"Mongolei\",\n    \"country_select_modal_country_me\": \"Montenegro\",\n    \"country_select_modal_country_ms\": \"Montserrat\",\n    \"country_select_modal_country_ma\": \"Marokko\",\n    \"country_select_modal_country_mz\": \"Mosambik\",\n    \"country_select_modal_country_na\": \"Namibia\",\n    \"country_select_modal_country_nr\": \"Nauru\",\n    \"country_select_modal_country_np\": \"Nepal\",\n    \"country_select_modal_country_nl\": \"Niederlande\",\n    \"country_select_modal_country_nc\": \"Neukaledonien\",\n    \"country_select_modal_country_nz\": \"Neuseeland\",\n    \"country_select_modal_country_ni\": \"Nicaragua\",\n    \"country_select_modal_country_ne\": \"Niger\",\n    \"country_select_modal_country_ng\": \"Nigeria\",\n    \"country_select_modal_country_nu\": \"Niue\",\n    \"country_select_modal_country_nf\": \"Norfolkinsel\",\n    \"country_select_modal_country_mp\": \"Nördliche Marianen\",\n    \"country_select_modal_country_no\": \"Norwegen\",\n    \"country_select_modal_country_om\": \"Oman\",\n    \"country_select_modal_country_pk\": \"Pakistan\",\n    \"country_select_modal_country_pw\": \"Palau\",\n    \"country_select_modal_country_ps\": \"Palästinensische Autonomiegebiete\",\n    \"country_select_modal_country_pa\": \"Panama\",\n    \"country_select_modal_country_pg\": \"Papua-Neuguinea\",\n    \"country_select_modal_country_py\": \"Paraguay\",\n    \"country_select_modal_country_pe\": \"Peru\",\n    \"country_select_modal_country_ph\": \"Philippinen\",\n    \"country_select_modal_country_pn\": \"Pitcairninseln\",\n    \"country_select_modal_country_pl\": \"Polen\",\n    \"country_select_modal_country_pt\": \"Portugal\",\n    \"country_select_modal_country_pr\": \"Puerto Rico\",\n    \"country_select_modal_country_qa\": \"Katar\",\n    \"country_select_modal_country_re\": \"Réunion\",\n    \"country_select_modal_country_ro\": \"Rumänien\",\n    \"country_select_modal_country_ru\": \"Russland\",\n    \"country_select_modal_country_rw\": \"Ruanda\",\n    \"country_select_modal_country_bl\": \"St. Barthélemy\",\n    \"country_select_modal_country_sh\": \"St. Helena\",\n    \"country_select_modal_country_kn\": \"St. Kitts und Nevis\",\n    \"country_select_modal_country_lc\": \"St. Lucia\",\n    \"country_select_modal_country_mf\": \"St. Martin\",\n    \"country_select_modal_country_pm\": \"St. Pierre und Miquelon\",\n    \"country_select_modal_country_vc\": \"St. Vincent und die Grenadinen\",\n    \"country_select_modal_country_ws\": \"Samoa\",\n    \"country_select_modal_country_sm\": \"San Marino\",\n    \"country_select_modal_country_st\": \"São Tomé und Príncipe\",\n    \"country_select_modal_country_sa\": \"Saudi-Arabien\",\n    \"country_select_modal_country_sn\": \"Senegal\",\n    \"country_select_modal_country_rs\": \"Serbien\",\n    \"country_select_modal_country_sc\": \"Seychellen\",\n    \"country_select_modal_country_sl\": \"Sierra Leone\",\n    \"country_select_modal_country_sg\": \"Singapur\",\n    \"country_select_modal_country_nl_bq3\": \"Sint Eustatius\",\n    \"country_select_modal_country_sx\": \"Sint Maarten\",\n    \"country_select_modal_country_sk\": \"Slowakei\",\n    \"country_select_modal_country_si\": \"Slowenien\",\n    \"country_select_modal_country_sb\": \"Salomonen\",\n    \"country_select_modal_country_so\": \"Somalia\",\n    \"country_select_modal_country_za\": \"Südafrika\",\n    \"country_select_modal_country_gs\": \"Südgeorgien und die Südlichen Sandwichinseln\",\n    \"country_select_modal_country_ge_so\": \"Südossetien\",\n    \"country_select_modal_country_ss\": \"Südsudan\",\n    \"country_select_modal_country_es\": \"Spanien\",\n    \"country_select_modal_country_lk\": \"Sri Lanka\",\n    \"country_select_modal_country_sd\": \"Sudan\",\n    \"country_select_modal_country_sr\": \"Suriname\",\n    \"country_select_modal_country_sj_no\": \"Svalbard\",\n    \"country_select_modal_country_sz\": \"Swasiland\",\n    \"country_select_modal_country_se\": \"Schweden\",\n    \"country_select_modal_country_ch\": \"Schweiz\",\n    \"country_select_modal_country_sy\": \"Syrien\",\n    \"country_select_modal_country_tw\": \"Taiwan\",\n    \"country_select_modal_country_tj\": \"Tadschikistan\",\n    \"country_select_modal_country_tz\": \"Tansania\",\n    \"country_select_modal_country_th\": \"Thailand\",\n    \"country_select_modal_country_tg\": \"Togo\",\n    \"country_select_modal_country_tk\": \"Tokelau\",\n    \"country_select_modal_country_to\": \"Tonga\",\n    \"country_select_modal_country_tt\": \"Trinidad und Tobago\",\n    \"country_select_modal_country_tn\": \"Tunesien\",\n    \"country_select_modal_country_tr\": \"Türkei\",\n    \"country_select_modal_country_tm\": \"Turkmenistan\",\n    \"country_select_modal_country_tc\": \"Turks- und Caicosinseln\",\n    \"country_select_modal_country_tv\": \"Tuvalu\",\n    \"country_select_modal_country_ug\": \"Uganda\",\n    \"country_select_modal_country_ua\": \"Ukraine\",\n    \"country_select_modal_country_ae\": \"Vereinigte Arabische Emirate\",\n    \"country_select_modal_country_uk\": \"Vereinigtes Königreich\",\n    \"country_select_modal_country_us\": \"Vereinigte Staaten\",\n    \"country_select_modal_country_uy\": \"Uruguay\",\n    \"country_select_modal_country_vi\": \"Amerikanische Jungferninseln\",\n    \"country_select_modal_country_uz\": \"Usbekistan\",\n    \"country_select_modal_country_vu\": \"Vanuatu\",\n    \"country_select_modal_country_ve\": \"Venezuela\",\n    \"country_select_modal_country_va\": \"Vatikanstadt\",\n    \"country_select_modal_country_vn\": \"Vietnam\",\n    \"country_select_modal_country_wf\": \"Wallis und Futuna\",\n    \"country_select_modal_country_ye\": \"Jemen\",\n    \"country_select_modal_country_zm\": \"Sambia\",\n    \"country_select_modal_country_tz_uk\": \"Sansibar\",\n    \"country_select_modal_country_zw\": \"Simbabwe\"\n}"
  },
  {
    "path": "app/js/locales/en-us.json",
    "content": "{\n\t\"modal_search\": \"Search\",\n\t\"modal_close\": \"Close\",\n\t\"modal_edit\": \"Edit\",\n\t\"modal_cancel\": \"Cancel\",\n\t\"modal_more\": \"More...\",\n\t\"modal_next\": \"Next\",\n\t\"modal_ok\": \"OK\",\n\t\"modal_done\": \"Done\",\n\n\t\"group_modal_info\": \"Group info\",\n\t\"group_modal_pluralize_participants\": \"{'0': 'No members', 'one': '1 member', 'other': '{} members'}\",\n\t\"group_modal_pluralize_online_participants\": \"{'one': '1 online', 'other': '{} online'}\",\n\t\"group_modal_pluralize_subscribers\": \"{'0': 'No subscribers', 'one': '1 subscriber', 'other': '{} subscribers'}\",\n\t\"group_modal_participants\": \"{total}, {online}\",\n\t\"group_modal_add_member\": \"Add member\",\n\t\"group_modal_return\": \"Return to group\",\n\t\"group_modal_update_photo\": \"Update photo\",\n\t\"group_modal_update_active\": \"Updating\",\n\t\"group_modal_menu_more\": \"More\",\n\t\"group_modal_menu_delete_photo\": \"Delete photo\",\n\t\"group_modal_menu_edit_group\": \"Edit group\",\n\t\"group_modal_menu_leave\": \"Leave\",\n\t\"group_modal_menu_delete_group\": \"Delete and exit\",\n\t\"group_modal_menu_clear_history\": \"Clear history\",\n\t\"group_modal_delete_group\": \"Delete group\",\n\t\"group_modal_join\": \"Join group\",\n\t\"group_modal_settings\": \"Settings\",\n\t\"group_modal_notifications\": \"Notifications\",\n\t\"group_modal_menu_share_link\": \"Invite to group via link\",\n\t\"group_modal_migrate_to_supergroup\": \"Upgrade to supergroup\",\n\t\"group_modal_members\": \"Members\",\n\t\"group_modal_members_kick\": \"Remove\",\n\t\"group_modal_migrate_header\": \"Members limit reached\",\n\t\"group_modal_migrate_desc\": \"To go over the limit and get additional features, upgrade to a supergroup:\",\n\t\"group_modal_migrate_item1\": \"Supergroups can get up to 1000 members\",\n\t\"group_modal_migrate_item2\": \"New members see the entire chat history\",\n\t\"group_modal_migrate_item3\": \"Admins delete messages for everyone\",\n\t\"group_modal_migrate_item4\": \"Notifications are muted by default\",\n\n\t\"channel_modal_info\": \"Channel info\",\n\t\"channel_modal_description\": \"Description\",\n\t\"channel_modal_share_link\": \"Share link\",\n\t\"channel_modal_share_loading\": \"Loading{dots}\",\n\t\"channel_modal_menu_edit\": \"Edit channel\",\n\t\"channel_modal_join\": \"Join channel\",\n\t\"channel_modal_add_member\": \"Invite members\",\n\t\"channel_modal_leave_channel\": \"Leave channel\",\n\t\"channel_modal_delete_channel\": \"Delete channel\",\n\n\t\"country_select_modal_title\": \"Country\",\n\n\t\"settings_modal_title\": \"Settings\",\n\t\"settings_modal_menu_more\": \"More\",\n\t\"settings_modal_delete_photo\": \"Delete profile photo\",\n\t\"settings_modal_set_photo\": \"Set profile photo\",\n\t\"settings_modal_photo_updating\": \"Updating\",\n\t\"settings_modal_edit_profile\": \"Edit profile\",\n\t\"settings_modal_edit_username\": \"Change username\",\n\t\"settings_modal_empty_username_set\": \"Set username\",\n\t\"settings_modal_terminate_sessions\": \"Terminate all sessions\",\n\t\"settings_modal_active_sessions\": \"Active sessions\",\n\t\"settings_modal_settings\": \"Settings\",\n\t\"settings_modal_notification_alert\": \"Notification alerts\",\n\t\"settings_modal_notification_push\": \"PUSH notifications\",\n\t\"settings_modal_vibrate\": \"Vibrate\",\n\t\"settings_modal_sounds\": \"Sounds\",\n\t\"settings_modal_language\": \"Language\",\n\t\"settings_modal_notifications\": \"Desktop notifications\",\n\t\"settings_modal_pushes\": \"Background notifications\",\n\t\"settings_modal_message_preview\": \"Message preview\",\n\t\"settings_modal_sound\": \"Sound\",\n\t\"settings_modal_enter_send_description_md\": \"**Enter** - send message, **Shift + Enter** - new line\",\n\t\"settings_modal_ctrl_enter_send_description_md\": \"**Ctrl + Enter** - send message, **Enter** - new line\",\n\t\"settings_modal_send_on_enter\": \"Send on Enter\",\n\t\"settings_switch_back_to_desktop\": \"Switch back to desktop layout\",\n\t\"settings_modal_about\": \"About\",\n\t\"settings_modal_source_code_github\": \"Source code on GitHub\",\n\t\"settings_modal_follow_us_twitter\": \"Follow us on Twitter!\",\n\t\"settings_modal_recent_updates\": \"Recent updates (ver. {version})\",\n\n\t\"settings_modal_set_password\": \"Set additional password\",\n\t\"settings_modal_change_password\": \"Change password\",\n\t\"settings_modal_disable_password\": \"Turn off\",\n\t\"settings_modal_disable_password_mobile\": \"Turn password off\",\n\t\"settings_modal_password_email_pending\": \"Click the link in {email} to complete Two-Step Verification setup.\",\n\t\"settings_modal_password_email_pending_cancel\": \"Abort\",\n\t\"settings_modal_password_email_pending_cancel_mobile\": \"Abort password\",\n  \"settings_modal_show_sensitive_content\": \"Show Sensitive Content\",\n\n\t\"password_delete_title\": \"Turn password off\",\n\t\"password_change_title\": \"Two-Step Verification\",\n\t\"password_current_placeholder\": \"Enter current password\",\n\t\"password_create_placeholder\": \"Enter a password\",\n\t\"password_new_placeholder\": \"Enter new password\",\n\t\"password_confirm_placeholder\": \"Re-enter new password\",\n\t\"password_hint_placeholder\": \"Enter password hint\",\n\t\"password_email_placeholder\": \"Enter recovery e-mail\",\n\t\"password_create_description\": \"This password will be required when you log in on a new device in addition to the pin code.\",\n\t\"password_create_active\": \"Saving...\",\n\t\"password_create_submit\": \"Save\",\n\t\"password_delete_active\": \"Deleting...\",\n\t\"password_delete_submit\": \"Delete password\",\n\n\t\"sessions_modal_title\": \"Active sessions\",\n\t\"sessions_modal_loading\": \"Loading{dots}\",\n\t\"sessions_modal_current_session\": \"Current session\",\n\t\"sessions_modal_session_online\": \"online\",\n\t\"sessions_modal_terminate_one\": \"Terminate\",\n\t\"sessions_modal_terminate_all\": \"Terminate all other sessions\",\n\t\"sessions_modal_active_sessions\": \"Active sessions\",\n\n\t\"stickerset_modal_title_loading\": \"Stickerset\",\n\t\"stickerset_modal_install\": \"Add stickers\",\n\t\"stickerset_modal_uninstall\": \"Remove stickers\",\n\t\"stickerset_modal_share\": \"Share\",\n\t\"stickerset_modal_loading\": \"Loading{dots}\",\n\n\t\"page_title_pluralize_notifications\": \"{'0': 'No notifications', 'one': '1 notification', 'other': '{} notifications'}\",\n\n\t\"profile_edit_modal_title\": \"Edit profile\",\n\t\"profile_edit_first_name\": \"First name\",\n\t\"profile_edit_last_name\": \"Last name\",\n\t\"profile_edit_submit\": \"Save\",\n\t\"profile_edit_submit_active\": \"Saving...\",\n\n\n\t\"username_edit_modal_title\": \"Change username\",\n\t\"username_edit_placeholder\": \"Username\",\n\t\"username_edit_description_md\": \"You can choose a username on **Telegram**. If you do, other people will be able to find you by this username and contact you without knowing your phone number.\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\",\n\t\"username_edit_submit\": \"Save\",\n\t\"username_edit_submit_active\": \"Saving...\",\n\n\t\"user_modal_menu_more\": \"More\",\n\t\"user_modal_send_message\": \"Send message\",\n\t\"user_modal_edit_contact\": \"Edit contact\",\n\t\"user_modal_delete_contact\": \"Delete contact\",\n\t\"user_modal_add_contact\": \"Add to contacts\",\n\t\"user_modal_share_contact\": \"Share contact\",\n\t\"user_modal_block_user\": \"Block user\",\n\t\"user_modal_unblock_user\": \"Unblock user\",\n\t\"user_modal_clear_history\": \"Clear history\",\n\t\"user_modal_delete_chat\": \"Delete conversation\",\n\t\"user_modal_add_to_group\": \"Add to group\",\n\t\"user_modal_info\": \"Info\",\n\t\"user_modal_phone\": \"Phone\",\n\t\"user_modal_about\": \"About\",\n\t\"user_modal_bot_settings\": \"Settings\",\n\t\"user_modal_bot_help\": \"Help\",\n\t\"user_modal_username\": \"Username\",\n\t\"user_modal_settings\": \"Settings\",\n\t\"user_modal_notifications\": \"Notifications\",\n\t\"user_modal_contact_info\": \"Contact info\",\n\n\t\"media_modal_photo\": \"Photo\",\n\t\"media_modal_photo_index\": \"Photo {pos} of {count}\",\n\t\"media_modal_video\": \"Video\",\n\t\"media_modal_forward\": \"Forward\",\n\t\"media_modal_download\": \"Download\",\n\t\"media_modal_delete\": \"Delete\",\n\t\"game_modal_share_game\": \"Share Game\",\n\t\"game_modal_share_score\": \"Share Score\",\n\n\t\"error_browser_no_local_file_system_image_md\": \"Your browser doesn't support {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem} feature which is needed to display this image.\\nPlease, install {chrome-link: http://google.com/chrome | Google Chrome} or use {telegram-link: https://telegram.org/ | mobile app} instead.\",\n\t\"error_image_download_failed\": \"Download failed\",\n\t\"error_browser_no_local_file_system_video_md\": \"Your browser doesn't support {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem} feature which is needed to play this video.\\nPlease, install {chrome-link: http://google.com/chrome | Google Chrome} or use {telegram-link: https://telegram.org/ | mobile app} instead.\",\n\t\"error_video_download_failed\": \"Video download failed\",\n\n\t\"unread_messages_split\": \"Unread messages\",\n\n\t\"user_name_deleted\": \"DELETED\",\n\t\"user_first_name_deleted\": \"DELETED\",\n\t\"user_name_saved_msgs\": \"Saved Messages\",\n\t\"user_status_online\": \"online\",\n\t\"user_status_last_seen\": \"last seen {0}\",\n\t\"user_status_recently\": \"last seen recently\",\n\t\"user_status_last_week\": \"last seen within a week\",\n\t\"user_status_last_month\": \"last seen within a month\",\n\t\"user_status_long_ago\": \"last seen a long time ago\",\n\t\"user_status_bot\": \"bot\",\n\t\"user_status_service_notifications\": \"service notifications\",\n\t\"user_status_support\": \"support\",\n\t\"user_status_bot_noprivacy\": \"has access to messages\",\n\t\"user_status_bot_privacy\": \"has no access to messages\",\n\t\"chat_title_deleted\": \"DELETED\",\n\t\"format_size_progress_mulitple\": \"{done} of {total} {parts}\",\n\t\"format_size_progress\": \"{done} of {total}\",\n\t\"relative_time_pluralize_minutes_ago\": \"{'one': '1 minute ago', 'other': '{} minutes ago'}\",\n\t\"relative_time_pluralize_hours_ago\": \"{'one': '1 hour ago', 'other': '{} hours ago'}\",\n\t\"relative_time_just_now\": \"just now\",\n\n\t\"changelog_modal_header_recent_updates_md\": \"Recent updates in **Telegram Web**\",\n\t\"changelog_modal_header_new_updates_md\": \"**Telegram Web** has been updated!\",\n\t\"changelog_modal_title_current_version\": \"current version\",\n\t\"changelog_modal_full_description_md\": \"Official free messaging app based on Telegram API for speed and security.\\n\\nThis software is licensed under GNU GPL version 3.\",\n\t\"changelog_modal_changelog_link\": \"Changelog\",\n\t\"changelog_app_version\": \"Version {version}\",\n\n\t\"group_create_contacts_modal_title\": \"New group\",\n\t\"group_create_modal_title\": \"Create group\",\n\t\"group_create_name\": \"Group name\",\n\t\"group_create_submit\": \"Create group\",\n\t\"group_create_submit_active\": \"Creating...\",\n\n\t\"group_edit_modal_title\": \"Edit group\",\n\t\"group_edit_name\": \"Group name\",\n\t\"group_edit_about\": \"Group description\",\n\t\"group_edit_submit\": \"Save\",\n\t\"group_edit_submit_active\": \"Saving...\",\n\n\t\"channel_edit_modal_title\": \"Edit channel\",\n\t\"channel_edit_name\": \"Channel name\",\n\t\"channel_edit_about\": \"Channel description\",\n\t\"channel_edit_submit\": \"Save\",\n\t\"channel_edit_submit_active\": \"Saving...\",\n\n\t\"group_invite_link_modal_title\": \"Invite link\",\n\t\"group_invite_link_link_label\": \"Copy link\",\n\t\"group_invite_link_loading\": \"Loading...\",\n\t\"group_invite_revoke_active\": \"Revoking...\",\n\t\"group_invite_revoke\": \"Revoke\",\n\n\t\"report_reason_modal_title\": \"Report\",\n\t\"report_reason_modal_spam\": \"Spam\",\n\t\"report_reason_modal_violence\": \"Violence\",\n\t\"report_reason_modal_pornography\": \"Pornography\",\n\t\"report_reason_modal_childabuse\": \"Child Abuse\",\n\t\"report_reason_modal_other\": \"Other\",\n\t\"report_reason_modal_other_placeholder\": \"Description\",\n\t\"report_reason_modal_submit_btn\": \"Send\",\n\n\t\"clipboard_copied\": \"Copied!\",\n\t\"clipboard_press_ctrl_c\": \"Press Ctrl+C to copy\",\n\t\"clipboard_press_cmd_c\": \"Press ⌘+C to copy\",\n\n\t\"confirm_modal_logout\": \"Are you sure you want to log out?\",\n\t\"confirm_modal_update_reload\": \"A new version of Telegram Web has been downloaded. Launch it?\",\n\t\"confirm_modal_history_flush\": \"Are you sure? This can not be undone!\",\n\t\"confirm_modal_history_leave_flush_md\": \"Are you sure, you want to delete all message history and leave the group?\\n\\nThis action cannot be undone.\",\n\t\"confirm_modal_leave_channel_md\": \"Are you sure, you want to leave this channel?\\n\\nThis action cannot be undone.\",\n\t\"confirm_modal_leave_group_md\": \"Are you sure, you want to leave this group?\\n\\nThis action cannot be undone.\",\n\t\"confirm_modal_terminate_sessions\": \"Are you sure you want to log out all devices except for this one?\",\n\t\"confirm_modal_terminate_session\": \"Are you sure you want to log out this device?\",\n\t\"confirm_modal_clipboard_file_send\": \"Are you sure to send file(s) from clipboard?\",\n\t\"confirm_modal_clipboard_X_files_send\": \"{'one': 'Are you sure to send file from clipboard?', 'other': 'Are you sure to send {} files from clipboard?'}\",\n\t\"confirm_modal_message_delete\": \"Are you sure you want to delete the message?\",\n\t\"confirm_modal_delete_X_messages\": \"{'one': '{} message', 'other': '{} messages'}\",\n\t\"confirm_modal_delete_messages\": \"Are you sure you want to delete {messages}?\",\n\t\"confirm_modal_message_revoke\": \"Delete for {recipient}\",\n\t\"confirm_modal_message_revoke_recipient_chat\": \"everyone\",\n\t\"confirm_modal_delete_messages_for_everyone_chat\": \"This will delete messages for everyone in this chat.\",\n\t\"confirm_modal_delete_messages_for_you_only_pm\": \"This will delete messages just for you, not for {user}.\",\n\t\"confirm_modal_delete_messages_for_you_only_chat\": \"This will delete messages just for you, not for other members of the chat.\",\n\t\"confirm_modal_photo_delete\": \"Are you sure you want to delete the photo?\",\n\t\"confirm_modal_contacts_import\": \"Telegram will now sync your contacts in order to find your friends.\",\n\t\"confirm_modal_login_phone_correct\": \"Is this phone number correct?\",\n\t\"confirm_modal_forward_to_peer\": \"Forward to {peer}?\",\n\t\"confirm_modal_forward_to_peer_success\": \"Message was successfully forwarded.\",\n\t\"confirm_modal_report_success\": \"Report sent\",\n\t\"confirm_modal_send_to_peer\": \"Send to {peer}?\",\n\t\"confirm_modal_share_file_peer\": \"Share with {peer}?\",\n\t\"confirm_modal_invite_peer\": \"Invite to {peer}?\",\n\t\"confirm_modal_share_game\": \"Share the game to {peer}?\",\n\t\"confirm_modal_apply_lang_with_reload_md\": \"Reload the App to apply language?\",\n\t\"confirm_modal_migrate_to_https_md\": \"Telegram Web now supports additional SSL encryption. Would you like to switch to HTTPS?\\nThe HTTP version will be disabled soon.\",\n\t\"confirm_modal_resize_desktop_md\": \"Would you like to switch to desktop version?\",\n\t\"confirm_modal_resize_mobile_md\": \"Would you like to switch to mobile version?\",\n\t\"confirm_modal_recovery_email_empty_md\": \"Warning! Are you sure you don't want to add a password recovery e-mail?\\n\\nIf you forget your password, you will lose access to your Telegram account\",\n\t\"confirm_modal_abort_password_setup\": \"Abort two-step verification setup?\",\n\t\"confirm_modal_reset_account_md\": \"Are you sure?\\nThis action can not be undone.\\n\\nYou will lose all your chats and messages, along with any media and files you shared, if you proceed with resetting your account.\",\n\t\"confirm_modal_join_group_link\": \"Do you want to join the group «{title}»?\",\n\t\"confirm_modal_join_channel_link\": \"Do you want to join the channel «{title}»?\",\n\t\"confirm_modal_revoke_group_link\": \"Are you sure you want to revoke this link? Once you do, no one will be able to join the group using it.\",\n\t\"confirm_modal_revoke_channel_link\": \"Are you sure you want to revoke this link? Once you do, no one will be able to join the channel using it.\",\n\t\"confirm_modal_delete_channel_md\": \"Are you sure you want to delete this channel?\\n\\nAll members will be removed and all messages will be lost.\",\n\t\"confirm_modal_delete_group_md\": \"Are you sure you want to delete this group?\\n\\nAll members will be removed and all messages will be lost.\",\n\t\"confirm_modal_jump_ext_url_md\": \"Open this link?\\n\\n{url}\",\n\t\"confirm_modal_migrate_supergroup_md\": \"Please note that group members will need to update their Telegram apps to the latest version to see your supergroup.\\n\\nAre you sure you want to upgrade this group?\",\n\t\"confirm_modal_bot_access_phone\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n\t\"confirm_modal_bot_access_geo\": \"This will send your current location to the bot.\",\n  \"confirm_modal_bot_access_geo_inline\": \"This bot would like to know your location each time you send it a request. This can be used to provide location-specific results.\",\n\t\"confirm_modal_content_settings_sensitive_md\": \"**Disable filtering**\\nIf you disable filtering, Telegram will display sensitive media in public channels on all your connected devices.\",\n  \"confirm_modal_content_settings_sensitive_submit\": \"Disable\",\n\n\t\"confirm_modal_are_u_sure\": \"Are you sure?\",\n\n\t\"confirm_modal_logout_submit\": \"Log out\",\n\t\"confirm_modal_clear_history_submit\": \"Clear history\",\n\t\"confirm_modal_leave_chat_submit\": \"Leave\",\n\t\"confirm_modal_delete_chat_submit\": \"Delete chat\",\n\t\"confirm_modal_clipboard_files_send_submit\": \"Send\",\n\t\"confirm_modal_clipboard_file_send_submit\": \"Send\",\n\t\"confirm_modal_message_delete_submit\": \"Delete\",\n\t\"confirm_modal_messages_delete_submit\": \"Delete\",\n\t\"confirm_modal_photo_delete_submit\": \"Delete\",\n\t\"confirm_modal_forward_message_submit\": \"Forward message\",\n\t\"confirm_modal_share_photo_submit\": \"Forward photo\",\n\t\"confirm_modal_share_video_submit\": \"Forward video\",\n\t\"confirm_modal_share_contact_submit\": \"Send contact\",\n\t\"confirm_modal_share_file_submit\": \"Share file\",\n\t\"confirm_modal_reset_account_submit\": \"Reset my account\",\n\n\t\"contacts_modal_edit_list\": \"Edit\",\n\t\"contacts_modal_edit_cancel\": \"Cancel\",\n\t\"contacts_modal_edit_delete\": \"Delete\",\n\t\"contacts_modal_pluralize_new_group_members\": \"{'one': '1 member', 'other': '{} members'}\",\n\t\"contacts_modal_title\": \"Contacts\",\n\t\"contacts_modal_new_contact\": \"New contact\",\n\t\"contacts_modal_empty_list\": \"Your contacts list is empty. You can {import-link: add new contact} by phone number.\",\n\n\t\"conversations_modal_forward_title\": \"Forward\",\n\t\"conversations_modal_forward_submit\": \"Forward\",\n\t\"conversations_modal_select_recipients\": \"Select recipients\",\n\t\"conversations_modal_recipients\": \"Recipients:\",\n\t\"conversations_modal_share_url_loading\": \"Loading{dots}\",\n\t\"conversations_modal_share_url_copy\": \"Click to copy share link\",\n\n\t\"contact_edit_modal_first_name\": \"First name\",\n\t\"contact_edit_modal_last_name\": \"Last name\",\n\t\"contact_edit_modal_title\": \"Edit contact\",\n\t\"contact_edit_modal_submit\": \"Save\",\n\t\"contact_edit_modal_submit_active\": \"Saving...\",\n\n\t\"contact_import_modal_title\": \"Add new contact\",\n\t\"contact_import_modal_phone\": \"Phone number\",\n\t\"contact_import_modal_phonebook\": \"Phonebook\",\n\t\"contact_import_modal_submit\": \"Save\",\n\t\"contact_import_modal_submit_active\": \"Importing...\",\n\n\t\"conversation_you\": \"You\",\n\t\"conversation_draft\": \"Draft:\",\n\t\"conversation_media_photo\": \"Photo\",\n\t\"conversation_media_video\": \"Video\",\n\t\"conversation_media_round\": \"Video message\",\n\t\"conversation_media_document\": \"File\",\n\t\"conversation_media_sticker\": \"Sticker\",\n\t\"conversation_media_gif\": \"GIF\",\n\t\"conversation_media_audio\": \"Audio\",\n\t\"conversation_media_location\": \"Location\",\n\t\"conversation_media_contact\": \"Contact\",\n\t\"conversation_media_attachment\": \"Attachment\",\n\t\"conversation_media_unsupported\": \"Unsupported attachment\",\n\n\t\"conversation_search_peer\": \"Search in this chat\",\n\n\t\"conversation_group_created\": \"created the group\",\n\t\"conversation_group_renamed\": \"changed group name\",\n\t\"conversation_group_photo_updated\": \"changed group photo\",\n\t\"conversation_group_photo_removed\": \"removed group photo\",\n\t\"conversation_returned_to_group\": \"returned to group\",\n\t\"conversation_joined_group\": \"joined the group\",\n\t\"conversation_invited_user\": \"invited {user}\",\n\t\"conversation_invited_users\": \"{'one': 'invited {} user', 'other': 'invited {} users'}\",\n\t\"conversation_left_group\": \"left group\",\n\t\"conversation_kicked_user\": \"removed {user}\",\n\t\"conversation_invited_user_message\": \"invited user\",\n\t\"conversation_kicked_user_message\": \"removed user\",\n\t\"conversation_joined_by_link\": \"joined the group\",\n\t\"conversation_converted_to_supergroup\": \"upgraded to a supergroup\",\n\t\"conversation_created_channel\": \"Channel created\",\n\t\"conversation_changed_channel_name\": \"Channel renamed\",\n\t\"conversation_changed_channel_photo\": \"Channel photo updated\",\n\t\"conversation_removed_channel_photo\": \"Channel photo removed\",\n\t\"conversation_pinned_message\": \"pinned message\",\n\t\"conversation_scored_X\": \"{'one': 'scored {}', 'other': 'scored {}'}\",\n\n\t\"conversation_message_sent\": \"sent you a message\",\n\t\"conversation_forwarded_X_messages\": \"{'one': 'forwarded {} message', 'other': 'forwarded {} messages'}\",\n\n\t\"conversation_unknown_user\": \"Somebody\",\n\t\"conversation_unknown_chat\": \"Unknown chat\",\n\n\t\"message_service_created_group\": \"created the group {group-name}\",\n\t\"message_service_changed_group_name\": \"changed group name to {group-name}\",\n\t\"message_service_changed_group_photo\": \"changed group photo\",\n\t\"message_service_removed_group_photo\": \"removed group photo\",\n\t\"message_service_invited_user\": \"invited {user}\",\n\t\"message_service_invited_users\": \"invited {user} and {num-more} more\",\n\t\"message_service_returned_to_group\": \"returned to group\",\n\t\"message_service_kicked_user\": \"removed {user}\",\n\t\"message_service_left_group\": \"left group\",\n\t\"message_service_joined_by_link\": \"joined group via invite link\",\n\t\"message_service_joined\": \"joined the group\",\n\t\"message_service_pinned_message\": \"pinned «{message}»\",\n\t\"message_service_phonecall_incoming\": \"Incoming Call\",\n\t\"message_service_phonecall_outgoing\": \"Outgoing Call\",\n\t\"message_service_phonecall_missed\": \"Missed Call\",\n\t\"message_service_phonecall_canceled\": \"Cancelled Call\",\n\t\"message_service_phonecall\": \"Phone call {duration}\",\n\t\"message_service_scored_game\": \"{scored} in {message}\",\n\t\"message_service_unsupported_action\": \"unsupported action {action}\",\n\t\"message_service_bot_intro_header\": \"What can this bot do?\",\n\t\"message_service_converted_to_supergroup\": \"upgraded the group to a supergroup\",\n\t\"message_service_created_channel\": \"Channel created\",\n\t\"message_service_changed_channel_name\": \"Channel renamed to {channel-name}\",\n\t\"message_service_changed_channel_photo\": \"Channel photo updated\",\n\t\"message_service_removed_channel_photo\": \"Channel photo removed\",\n\t\"message_service_scored_X\": \"{'one': 'scored {}', 'other': 'scored {}'}\",\n\t\"message_service_payment_sent\": \"Payment sent\",\n\t\"message_service_screenshot_taken\": \"took a screenshot!\",\n\n\t\"message_admin_badge\": \"admin\",\n\n\t\"message_action_reply\": \"Reply\",\n\t\"message_action_edit\": \"Edit\",\n\t\"message_action_delete\": \"Delete\",\n\t\"message_action_report\": \"Report\",\n\t\"message_action_forward\": \"Forward\",\n\t\"message_action_select\": \"Select\",\n\t\"message_action_cancel\": \"Cancel\",\n\t\"message_action_retry\": \"Try again\",\n\n\t\"error_modal_warning_title\": \"Warning\",\n\t\"error_modal_bad_request_title\": \"Error\",\n\t\"error_modal_unauthorized_title\": \"Unauthorized\",\n\t\"error_modal_forbidden_title\": \"Access denied\",\n\t\"error_modal_not_found_title\": \"Not found\",\n\t\"error_modal_network_title\": \"Network error\",\n\t\"error_modal_flood_title\": \"Too fast\",\n\t\"error_modal_internal_title\": \"Server error\",\n\t\"error_modal_alert\": \"Alert\",\n\t\"error_modal_email_unconfirmed_title\": \"Almost there!\",\n\t\"error_modal_email_unconfirmed_descripion\": \"Please check your e-mail (don't forget the spam folder) to complete Two-Step Verification setup.\",\n\t\"error_modal_password_success_title\": \"Success!\",\n\t\"error_modal_password_disabled_title\": \"Password deactivated\",\n\t\"error_modal_media_not_supported_title\": \"Unsupported media\",\n\t\"error_modal_phonecalls_not_supported_title\": \"Calls are not available yet\",\n\t\"error_modal_recovery_na_title\": \"Sorry\",\n\n\t\"error_modal_network_description\": \"Please check your internet connection.\",\n\t\"error_modal_firstname_invali_description\": \"The first name you entered is invalid.\",\n\t\"error_modal_lastname_invalid_description\": \"The last name you entered is invalid.\",\n\t\"error_modal_phone_invalid_description\": \"The phone number you entered is invalid.\",\n\t\"error_modal_users_too_much_description\": \"Too many group members.\",\n\t\"error_modal_photo_dimensions_invalid_description\": \"The photo dimensions are invalid, please select another file.\",\n\t\"error_modal_video_file_invalid_description\": \"The video file extension is invalid or unsupported, please select another file.\",\n\t\"error_modal_photo_too_small_description\": \"The photo you provided is too small.\",\n\t\"error_modal_no_phone_user_description_md\": \"Sorry, there is no **Telegram** account with the phone number you provided.\",\n\t\"error_modal_no_phone_users_description_md\": \"Sorry, there are no **Telegram** accounts with the phone numbers you provided.\",\n\t\"error_modal_username_invalid_description\": \"Sorry, this username is not allowed.\",\n\t\"error_modal_phonebook_required_description\": \"Telegram needs access to phonebook to import contacts.\",\n\t \"error_modal_username_occupied_description\": \"Sorry, this username is already taken.\",\n\t \"error_modal_media_not_supported_description\": \"Your browser cannot play this media file. Try downloading the file and opening it in a standalone player.\",\n\t \"error_modal_username_not_found_description\": \"There is no Telegram account with the username you provided.\",\n\t\"error_modal_phonecalls_not_supported_description_md\": \"Unfortunately calls are not supported in the Web App at the moment.\\n\\nYou can call {user} using our mobile apps or native desktop applications.\\n{download-link: Download »}\",\n\t\"error_modal_app_signup_forbidden_md\": \"You don't have a Telegram account yet, please **sign up** with {signup-link: Android / iPhone} first.\",\n\n\t\"error_modal_bad_request_description\": \"One of the params is missing or invalid.\",\n\t\"error_modal_unauthorized_description\": \"This action requires authorization access. Please {login-link: log in}.\",\n\t\"error_modal_forbidden_description\": \"You are not allowed for this action.\",\n\t\"error_modal_not_found_description\": \"The page was not found.\",\n\t\"error_modal_flood_description\": \"You are performing too many actions. Please try again later.\",\n\t\"error_modal_internal_description\": \"Internal server error occured. Please try again later.\",\n\t\"error_modal_tech_details\": \"Click for technical details\",\n\t\"error_modal_recovery_na_description\": \"Since you haven't provided a recovery e-mail when setting up your password, your remaining options are either to remember your password or to reset your account.\",\n\t\"error_modal_password_success_descripion\": \"Your password for Two-Step Verification is now active.\",\n\t\"error_modal_password_disabled_descripion\": \"You have disabled Two-Step Verification.\",\n\t\"error_modal_user_not_mutual_contact\": \"The user can be invited by their contact only\",\n\t\"error_modal_invite_link_invalid\": \"The invite link is invalid\",\n\t\"error_modal_channel_not_accessible\": \"Sorry, this channel is not accessible.\",\n\t\"error_modal_not_contact_flood\": \"Sorry, you can only send messages to mutual contacts at the moment. {more-info-link: More info »}\",\n\t\"error_modal_gelocation_na\": \"App was unable to determine your current location\",\n\t\"error_modal_2fa_recent_confirm\": \"Your recent attempts to reset this account have been cancelled by its active user. Please try again in 7 days.\",\n\t\"error_modal_2fa_delayed_time_md\": \"You'll be able to reset your account in: **{time}**\",\n\n\t\"head_mainmenu\": \"Main menu\",\n\t\"head_telegram\": \"Telegram\",\n\t\"head_new_group\": \"New group\",\n\t\"head_new_contact\": \"New contact\",\n\t\"head_contacts\": \"Contacts\",\n\t\"head_contacts_title\": \"Contacts\",\n\t\"head_telegram_faq\": \"Telegram FAQ\",\n\t\"head_settings\": \"Settings\",\n\t\"head_log_out\": \"Log out\",\n\t\"head_peer_more\": \"More\",\n\t\"head_select_messages\": \"Select messages\",\n\t\"head_media_photos\": \"Photos\",\n\t\"head_media_video\": \"Videos\",\n\t\"head_media_documents\": \"Files\",\n\t\"head_media_music\": \"Audio\",\n\t\"head_media_links\": \"Shared links\",\n\t\"head_media_audio\": \"Voice messages\",\n\t\"head_media_round\": \"Video messages\",\n\t\"head_media_mymentions\": \"Mentions\",\n\t\"head_media_search\": \"Search\",\n\t\"head_about\": \"About\",\n\t\"head_clear_all\": \"Clear history\",\n\t\"head_select\": \"Select\",\n\t\"head_typing\": \"typing\",\n\t\"head_pluralize_participants\": \"{'0': 'No members', 'one': '1 member', 'other': '{} members'}\",\n\t\"head_one_typing\": \"{name1} is typing{dots}\",\n\t\"head_two_typing\": \"{name1}, {name2}{dots}\",\n\t\"head_many_typing\": \"{name1}+{names}{dots}\",\n\t\"head_waiting_for_network\": \"Waiting for network\",\n\t\"head_retry\": \"Retry\",\n\t\"head_connecting\": \"Connecting\",\n\n\t\"footer_twitter\": \"Twitter\",\n\n\n\t\"im_new_group\": \"New group\",\n\t\"im_new_contact\": \"New contact\",\n\t\"im_contacts\": \"Contacts\",\n\t\"im_chat_contacts_title\": \"Chats and contacts\",\n\t\"im_settings\": \"Settings\",\n\t\"im_conversations\": \"Conversations\",\n\t\"im_found_title\": \"Global search\",\n\t\"im_messages\": \"Messages\",\n\t\"im_no_contacts\": \"No contacts yet\",\n\t\"im_get_started_long\": \"Get started by adding a contact to chat with\",\n\t\"im_add_contact\": \"Add contact\",\n\t\"im_import_phonebook\": \"Import phonebook\",\n\t\"im_get_started\": \"Get started\",\n\t\"im_welcome_text\": \"Welcome to Telegram Web. You can always set your profile photo and change your name in Settings.\",\n\t\"im_open_settings\": \"Open settings\",\n\t\"im_select_a_chat\": \"Please select a chat to start messaging\",\n\t\"im_loading_history\": \"Loading history\",\n\t\"im_media\": \"Media\",\n\t\"im_media_photos\": \"Photos\",\n\t\"im_media_video\": \"Videos\",\n\t\"im_media_documents\": \"Files\",\n\t\"im_media_audio\": \"Voice messages\",\n\t\"im_media_round\": \"Video messages\",\n\t\"im_media_music\": \"Audio\",\n\t\"im_media_links\": \"Shared Links\",\n\t\"im_media_mentions\": \"Mentions and Replies\",\n\t\"im_pluralize_participants\": \"{'0': 'No members', 'one': '1 member', 'other': '{} members'}\",\n\t\"im_show_recent_messages\": \"Show recent messages\",\n\t\"im_show_all_messages\": \"Show all messages\",\n\t\"im_no_messages\": \"No messages here yet...\",\n\t\"im_one_typing\": \"{name1} is typing{dots}\",\n\t\"im_two_typing\": \"{name1} and {name2} are typing{dots}\",\n\t\"im_many_typing\": \"{name1}, {name2} and {count} more are typing{dots}\",\n\t\"im_conversation_single_typing\": \"typing{dots}\",\n\t\"im_conversation_group_typing\": \"{name} is typing{dots}\",\n\t\"im_delete_chat\": \"Delete chat\",\n\t\"im_clear_history\": \"Clear history\",\n\t\"im_delete\": \"Delete {count}\",\n\t\"im_forward\": \"Forward {count}\",\n\t\"im_reply\": \"Reply\",\n\t\"im_edit\": \"Edit\",\n\t\"im_start\": \"Start\",\n\t\"im_channel_join\": \"+ Join\",\n\t\"im_channel_mute\": \"Mute\",\n\t\"im_channel_unmute\": \"Unmute\",\n\t\"im_report\": \"Report {count}\",\n\t\"im_reply_loading\": \"Loading{dots}\",\n\t\"im_X_forwarded_messages\": \"{'one': '{} forwarded message', 'other': '{} forwarded messages'}\",\n\t\"im_photos_drop_text\": \"Drop photos here to send\",\n\t\"im_message_field_placeholder\": \"Write a message...\",\n\t\"im_broadcast_field_placeholder\": \"Broadcast a message...\",\n\t\"im_emoji_tab\": \"Emoji\",\n\t\"im_stickers_tab\": \"Stickers\",\n\t\"im_stickers_tab_recent\": \"Frequently used\",\n\t\"im_voice_record_title\": \"Record a message\",\n\t\"im_media_attach_title\": \"Send media\",\n\t\"im_attach_file_title\": \"Send file\",\n\t\"im_emoji_btn_title\": \"Insert emoticon\",\n\t\"im_submit_message\": \"Send\",\n\t\"im_submit_edit_message\": \"Save\",\n\t\"im_edit_message_title\": \"Edit message\",\n  \"im_voice_recording_label\": \"Release outside this form to cancel\",\n  \"im_voice_recording_cancel_label\": \"Release to cancel record\",\n  \"im_voice_processing_label\": \"Processing{dots}\",\n\t\"login_sign_in\": \"Sign in\",\n\t\"login_enter_number_description_md\": \"Please choose your country and enter your full phone number.\\n\\nNote that you need an existing account to log in to Telegram Web. To sign up for Telegram, use one of our {apps-link: mobile apps}.\",\n\t\"login_incorrect_number\": \"Incorrect phone number\",\n\t\"login_code_input_placeholder\": \"Code\",\n\t\"login_tel_input_placeholder\": \"Phone number\",\n\t\"login_country_select_placeholder\": \"Country\",\n\t\"login_generating_key\": \"Generating keys\",\n\t\"login_generating_keys_info\": \"Keys are only generated once. This can take a few minutes on slower devices, please be patient.\",\n\t\"login_edit_number\": \"Edit phone number\",\n\t\"login_enter_code_label_md\": \"We've sent the code to the **Telegram** app on your other device.\\nPlease enter the code below.\",\n\t\"login_enter_sms_code_label_md\": \"We've sent an SMS with an activation code to your phone.\\nPlease enter the code below.\",\n\t\"login_enter_call_code_label_md\": \"We are calling your phone to dictate a code.\\nPlease enter the code below.\",\n\t\"login_code_remaining\": \"You will be able to request SMS in {remaining}\",\n\t\"login_call_remaining\": \"You will be able to request call in {remaining}\",\n\t\"login_code_not_received\": \"Send code via SMS\",\n\t\"login_code_not_received_call\": \"Send code via Call\",\n\t\"login_code_requesting\": \"Requesting code\",\n\t\"login_incorrect_sms_code\": \"Incorrect SMS code\",\n\t\"login_number_input_placeholder\": \"Enter your code\",\n\t\"login_checking_code\": \"Checking code\",\n\t\"login_your_info\": \"Your info\",\n\t\"login_fulll_name_label\": \"Please enter your full name to set up a Telegram account.\",\n\t\"login_incorrect_first_name\": \"Incorrect first name\",\n\t\"login_first_name\": \"First name\",\n\t\"login_incorrect_last_name\": \"Incorrect last name\",\n\t\"login_last_name\": \"Last name\",\n\t\"login_signing_up\": \"Signing up\",\n\t\"login_sign_up\": \"Sign up\",\n\t\"login_about_title\": \"About\",\n\t\"login_about_hide\": \"hide\",\n\t\"login_try_desktop\": \"For best experience on your computer, try {telegram-link}\",\n\t\"login_try_desktop_btn\": \"Download Telegram\",\n\t\"login_try_desktop_short_btn\": \"Download\",\n\t\"login_about_desc1_md\": \"The Telegram web-client is a free, fast and secure way to enjoy most of **Telegram**'s features right in your **web-browser**.\",\n\t\"login_about_desc2_md\": \"It is always synced with the **Telegram app** on your mobile device, which makes it a perfect tool for messaging and file sharing.\",\n\t\"login_about_desc3_md\": \"Our {source-link: source code} is open, so everyone can make a contribution.\",\n\t\"login_about_intro\": \"Welcome to the official Telegram web-client.\",\n\t\"login_about_learn\": \"Learn more\",\n\t\"login_password_title\": \"Password\",\n\t\"login_password_label\": \"You have enabled Two-Step Verification, so your account is protected with an additional password.\",\n\t\"login_password_forgot_link\": \"Forgot password?\",\n\t\"login_account_reset\": \"Reset account\",\n\t\"login_password\": \"Your password\",\n\t\"login_incorrect_password\": \"Incorrect password\",\n\t\"login_checking_password\": \"Checking\",\n\t\"login_recovery_title\": \"Forgot password?\",\n\t\"login_code_placeholder\": \"Code\",\n\t\"login_code_incorrect\": \"Incorrect code\",\n\t\"login_recovery_description_md\": \"We have sent a recovery code to the e-mail you provided:\\n\\n{email}\\n\\nPlease check your e-mail and enter the 6-digit code we have sent here.\",\n\n\t\"password_recover_active\": \"Checking...\",\n\t\"password_recover_submit\": \"Submit\",\n\n\n\t\"login_controller_unknown_country\": \"Unknown\",\n\n\t\"message_forwarded_message\": \"Forwarded message\",\n\t\"message_via_bot\": \"via {bot}\",\n\t\"message_edited\": \"edited\",\n\t\"message_forwarded_message_mobile\": \"Forwarded from {from}\",\n\t\"message_forwarded_via_message_mobile\": \"Forwarded from {from} via {bot}\",\n\n\t\"message_attach_audio_message\": \"Voice message\",\n\t\"message_attach_audio_play\": \"Play\",\n\n\t\"message_attach_document_open\": \"Open\",\n\t\"message_attach_document_download\": \"Download\",\n\t\"message_attach_document_save\": \"Save file\",\n\n\t\"message_attach_video_video\": \"Video\",\n\t\"message_attach_video_download\": \"Download\",\n\t\"message_attach_video_save\": \"Save file\",\n\t\"message_attach_video_play\": \"Play video\",\n\n  \"message_attach_unsupported\": \"The message is not supported on your version of Telegram Web. Update the app to view: {link}.\",\n\t\"message_attach_unsupported_desktop\": \"This message is currently not supported on Telegram Web. Try {link}.\",\n\t\"message_attach_notweb\": \"The message is not supported on Telegram Web yet. Use Telegram mobile apps to view: {link}.\",\n\n\t\"conversation_select_modal_title\": \"Select conversation\",\n\t\"conversation_select_modal_chats_contacts\": \"Chats and contacts\",\n\t\"conversation_one_selected\": \"{name1}\",\n\t\"conversation_two_selected\": \"{name1} and {name2}\",\n\t\"conversation_many_selected\": \"{name1}, {name2} and {count} more\",\n\n\t\"phonebook_modal_title\": \"Phonebook\",\n\t\"phonebook_modal_deselect_all\": \"Deselect all\",\n\t\"phonebook_modal_select_all\": \"Select all\",\n\t\"phonebook_modal_empty\": \"Your phonebook is empty.\",\n\t\"phonebook_modal_submit_active\": \"Importing\",\n\t\"phonebook_modal_submit\": \"Import contacts\",\n\n\t\"inactive_tab_title\": \"Telegram: Zzz...\",\n\t\"inactive_title\": \"Such error, many tabs\",\n\t\"inactive_description_md\": \"Telegram supports only one active tab with the app.\\nPlease reload this page to continue using this tab or close it.\",\n\t\"inactive_reload_btn\": \"Reload App\",\n\n\t\"push_action_mute1d\": \"Mute background alerts for 1 day\",\n\t\"push_action_settings\": \"Background alerts settings\",\n\t\"push_action_mute1d_mobile\": \"Mute for 24H\",\n\t\"push_action_settings_mobile\": \"Alerts settings\",\n\t\"push_message_nopreview\": \"You have a new message\",\n\t\"push_action_mute1d_success\": \"Notification settings were successfully saved.\",\n\n\n\t\"country_select_modal_country_ab\": \"Abkhazia\",\n\t\"country_select_modal_country_af\": \"Afghanistan\",\n\t\"country_select_modal_country_ax\": \"Åland Islands\",\n\t\"country_select_modal_country_al\": \"Albania\",\n\t\"country_select_modal_country_dz\": \"Algeria\",\n\t\"country_select_modal_country_as\": \"American Samoa\",\n\t\"country_select_modal_country_ad\": \"Andorra\",\n\t\"country_select_modal_country_ao\": \"Angola\",\n\t\"country_select_modal_country_ai\": \"Anguilla\",\n\t\"country_select_modal_country_ag\": \"Antigua & Barbuda\",\n\t\"country_select_modal_country_ar\": \"Argentina\",\n\t\"country_select_modal_country_am\": \"Armenia\",\n\t\"country_select_modal_country_aw\": \"Aruba\",\n\t\"country_select_modal_country_sh_ac\": \"Ascension\",\n\t\"country_select_modal_country_au\": \"Australia\",\n\t\"country_select_modal_country_au_et\": \"Australian External Territories\",\n\t\"country_select_modal_country_at\": \"Austria\",\n\t\"country_select_modal_country_az\": \"Azerbaijan\",\n\t\"country_select_modal_country_bs\": \"Bahamas\",\n\t\"country_select_modal_country_bh\": \"Bahrain\",\n\t\"country_select_modal_country_bd\": \"Bangladesh\",\n\t\"country_select_modal_country_bb\": \"Barbados\",\n\t\"country_select_modal_country_ag_bar\": \"Barbuda\",\n\t\"country_select_modal_country_by\": \"Belarus\",\n\t\"country_select_modal_country_be\": \"Belgium\",\n\t\"country_select_modal_country_bz\": \"Belize\",\n\t\"country_select_modal_country_bj\": \"Benin\",\n\t\"country_select_modal_country_bm\": \"Bermuda\",\n\t\"country_select_modal_country_bt\": \"Bhutan\",\n\t\"country_select_modal_country_bo\": \"Bolivia\",\n\t\"country_select_modal_country_bq\": \"Caribbean Netherlands\",\n\t\"country_select_modal_country_ba\": \"Bosnia & Herzegovina\",\n\t\"country_select_modal_country_bw\": \"Botswana\",\n\t\"country_select_modal_country_br\": \"Brazil\",\n\t\"country_select_modal_country_io\": \"British Indian Ocean Territory\",\n\t\"country_select_modal_country_vg\": \"British Virgin Islands\",\n\t\"country_select_modal_country_bn\": \"Brunei\",\n\t\"country_select_modal_country_bg\": \"Bulgaria\",\n\t\"country_select_modal_country_bf\": \"Burkina Faso\",\n\t\"country_select_modal_country_mm\": \"Myanmar (Burma)\",\n\t\"country_select_modal_country_bi\": \"Burundi\",\n\t\"country_select_modal_country_kh\": \"Cambodia\",\n\t\"country_select_modal_country_cm\": \"Cameroon\",\n\t\"country_select_modal_country_ca\": \"Canada\",\n\t\"country_select_modal_country_cv\": \"Cape Verde\",\n\t\"country_select_modal_country_ky\": \"Cayman Islands\",\n\t\"country_select_modal_country_cf\": \"Central African Republic\",\n\t\"country_select_modal_country_td\": \"Chad\",\n\t\"country_select_modal_country_cl\": \"Chile\",\n\t\"country_select_modal_country_cn\": \"China\",\n\t\"country_select_modal_country_cx\": \"Christmas Island\",\n\t\"country_select_modal_country_cc\": \"Cocos (Keeling) Islands\",\n\t\"country_select_modal_country_co\": \"Colombia\",\n\t\"country_select_modal_country_km\": \"Comoros\",\n\t\"country_select_modal_country_cg\": \"Congo - Brazzaville\",\n\t\"country_select_modal_country_cd\": \"Congo - Kinshasa\",\n\t\"country_select_modal_country_ck\": \"Cook Islands\",\n\t\"country_select_modal_country_cr\": \"Costa Rica\",\n\t\"country_select_modal_country_ci\": \"Côte d’Ivoire\",\n\t\"country_select_modal_country_hr\": \"Croatia\",\n\t\"country_select_modal_country_cu\": \"Cuba\",\n\t\"country_select_modal_country_cw\": \"Curaçao\",\n\t\"country_select_modal_country_cy\": \"Cyprus\",\n\t\"country_select_modal_country_cz\": \"Czech Republic\",\n\t\"country_select_modal_country_dk\": \"Denmark\",\n\t\"country_select_modal_country_dg\": \"Diego Garcia\",\n\t\"country_select_modal_country_dj\": \"Djibouti\",\n\t\"country_select_modal_country_dm\": \"Dominica\",\n\t\"country_select_modal_country_do\": \"Dominican Republic\",\n\t\"country_select_modal_country_tl\": \"Timor-Leste\",\n\t\"country_select_modal_country_ec\": \"Ecuador\",\n\t\"country_select_modal_country_eg\": \"Egypt\",\n\t\"country_select_modal_country_sv\": \"El Salvador\",\n\t\"country_select_modal_country_gq\": \"Equatorial Guinea\",\n\t\"country_select_modal_country_er\": \"Eritrea\",\n\t\"country_select_modal_country_ee\": \"Estonia\",\n\t\"country_select_modal_country_et\": \"Ethiopia\",\n\t\"country_select_modal_country_fk\": \"Falkland Islands\",\n\t\"country_select_modal_country_fo\": \"Faroe Islands\",\n\t\"country_select_modal_country_fj\": \"Fiji\",\n\t\"country_select_modal_country_fi\": \"Finland\",\n\t\"country_select_modal_country_fr\": \"France\",\n\t\"country_select_modal_country_gf\": \"French Guiana\",\n\t\"country_select_modal_country_pf\": \"French Polynesia\",\n\t\"country_select_modal_country_ga\": \"Gabon\",\n\t\"country_select_modal_country_gm\": \"Gambia\",\n\t\"country_select_modal_country_ge\": \"Georgia\",\n\t\"country_select_modal_country_de\": \"Germany\",\n\t\"country_select_modal_country_gh\": \"Ghana\",\n\t\"country_select_modal_country_gi\": \"Gibraltar\",\n\t\"country_select_modal_country_gr\": \"Greece\",\n\t\"country_select_modal_country_gl\": \"Greenland\",\n\t\"country_select_modal_country_gd\": \"Grenada\",\n\t\"country_select_modal_country_gp\": \"Guadeloupe\",\n\t\"country_select_modal_country_gu\": \"Guam\",\n\t\"country_select_modal_country_gt\": \"Guatemala\",\n\t\"country_select_modal_country_gg\": \"Guernsey\",\n\t\"country_select_modal_country_gn\": \"Guinea\",\n\t\"country_select_modal_country_gw\": \"Guinea-Bissau\",\n\t\"country_select_modal_country_gy\": \"Guyana\",\n\t\"country_select_modal_country_ht\": \"Haiti\",\n\t\"country_select_modal_country_hn\": \"Honduras\",\n\t\"country_select_modal_country_hk\": \"Hong Kong SAR China\",\n\t\"country_select_modal_country_hu\": \"Hungary\",\n\t\"country_select_modal_country_is\": \"Iceland\",\n\t\"country_select_modal_country_in\": \"India\",\n\t\"country_select_modal_country_id\": \"Indonesia\",\n\t\"country_select_modal_country_ir\": \"Iran\",\n\t\"country_select_modal_country_iq\": \"Iraq\",\n\t\"country_select_modal_country_ie\": \"Ireland\",\n\t\"country_select_modal_country_il\": \"Israel\",\n\t\"country_select_modal_country_it\": \"Italy\",\n\t\"country_select_modal_country_jm\": \"Jamaica\",\n\t\"country_select_modal_country_sj\": \"Svalbard & Jan Mayen\",\n\t\"country_select_modal_country_jp\": \"Japan\",\n\t\"country_select_modal_country_je\": \"Jersey\",\n\t\"country_select_modal_country_jo\": \"Jordan\",\n\t\"country_select_modal_country_kz\": \"Kazakhstan\",\n\t\"country_select_modal_country_ke\": \"Kenya\",\n\t\"country_select_modal_country_ki\": \"Kiribati\",\n\t\"country_select_modal_country_kp\": \"North Korea\",\n\t\"country_select_modal_country_kr\": \"South Korea\",\n\t\"country_select_modal_country_kw\": \"Kuwait\",\n\t\"country_select_modal_country_kg\": \"Kyrgyzstan\",\n\t\"country_select_modal_country_la\": \"Laos\",\n\t\"country_select_modal_country_lv\": \"Latvia\",\n\t\"country_select_modal_country_lb\": \"Lebanon\",\n\t\"country_select_modal_country_ls\": \"Lesotho\",\n\t\"country_select_modal_country_lr\": \"Liberia\",\n\t\"country_select_modal_country_ly\": \"Libya\",\n\t\"country_select_modal_country_li\": \"Liechtenstein\",\n\t\"country_select_modal_country_lt\": \"Lithuania\",\n\t\"country_select_modal_country_lu\": \"Luxembourg\",\n\t\"country_select_modal_country_mo\": \"Macau SAR China\",\n\t\"country_select_modal_country_mk\": \"Macedonia\",\n\t\"country_select_modal_country_mg\": \"Madagascar\",\n\t\"country_select_modal_country_mw\": \"Malawi\",\n\t\"country_select_modal_country_my\": \"Malaysia\",\n\t\"country_select_modal_country_mv\": \"Maldives\",\n\t\"country_select_modal_country_ml\": \"Mali\",\n\t\"country_select_modal_country_mt\": \"Malta\",\n\t\"country_select_modal_country_mh\": \"Marshall Islands\",\n\t\"country_select_modal_country_mq\": \"Martinique\",\n\t\"country_select_modal_country_mr\": \"Mauritania\",\n\t\"country_select_modal_country_mu\": \"Mauritius\",\n\t\"country_select_modal_country_yt\": \"Mayotte\",\n\t\"country_select_modal_country_mx\": \"Mexico\",\n\t\"country_select_modal_country_fm\": \"Micronesia\",\n\t\"country_select_modal_country_md\": \"Moldova\",\n\t\"country_select_modal_country_mc\": \"Monaco\",\n\t\"country_select_modal_country_mn\": \"Mongolia\",\n\t\"country_select_modal_country_me\": \"Montenegro\",\n\t\"country_select_modal_country_ms\": \"Montserrat\",\n\t\"country_select_modal_country_ma\": \"Morocco\",\n\t\"country_select_modal_country_mz\": \"Mozambique\",\n\t\"country_select_modal_country_na\": \"Namibia\",\n\t\"country_select_modal_country_nr\": \"Nauru\",\n\t\"country_select_modal_country_np\": \"Nepal\",\n\t\"country_select_modal_country_nl\": \"Netherlands\",\n\t\"country_select_modal_country_nc\": \"New Caledonia\",\n\t\"country_select_modal_country_nz\": \"New Zealand\",\n\t\"country_select_modal_country_ni\": \"Nicaragua\",\n\t\"country_select_modal_country_ne\": \"Niger\",\n\t\"country_select_modal_country_ng\": \"Nigeria\",\n\t\"country_select_modal_country_nu\": \"Niue\",\n\t\"country_select_modal_country_nf\": \"Norfolk Island\",\n\t\"country_select_modal_country_mp\": \"Northern Mariana Islands\",\n\t\"country_select_modal_country_no\": \"Norway\",\n\t\"country_select_modal_country_om\": \"Oman\",\n\t\"country_select_modal_country_pk\": \"Pakistan\",\n\t\"country_select_modal_country_pw\": \"Palau\",\n\t\"country_select_modal_country_ps\": \"Palestinian Territories\",\n\t\"country_select_modal_country_pa\": \"Panama\",\n\t\"country_select_modal_country_pg\": \"Papua New Guinea\",\n\t\"country_select_modal_country_py\": \"Paraguay\",\n\t\"country_select_modal_country_pe\": \"Peru\",\n\t\"country_select_modal_country_ph\": \"Philippines\",\n\t\"country_select_modal_country_pn\": \"Pitcairn Islands\",\n\t\"country_select_modal_country_pl\": \"Poland\",\n\t\"country_select_modal_country_pt\": \"Portugal\",\n\t\"country_select_modal_country_pr\": \"Puerto Rico\",\n\t\"country_select_modal_country_qa\": \"Qatar\",\n\t\"country_select_modal_country_re\": \"Réunion\",\n\t\"country_select_modal_country_ro\": \"Romania\",\n\t\"country_select_modal_country_ru\": \"Russia\",\n\t\"country_select_modal_country_rw\": \"Rwanda\",\n\t\"country_select_modal_country_bl\": \"St. Barthélemy\",\n\t\"country_select_modal_country_sh\": \"St. Helena\",\n\t\"country_select_modal_country_kn\": \"St. Kitts & Nevis\",\n\t\"country_select_modal_country_lc\": \"St. Lucia\",\n\t\"country_select_modal_country_mf\": \"St. Martin (France)\",\n\t\"country_select_modal_country_pm\": \"St. Pierre and Miquelon\",\n\t\"country_select_modal_country_vc\": \"St. Vincent and the Grenadines\",\n\t\"country_select_modal_country_ws\": \"Samoa\",\n\t\"country_select_modal_country_sm\": \"San Marino\",\n\t\"country_select_modal_country_st\": \"São Tomé & Príncipe\",\n\t\"country_select_modal_country_sa\": \"Saudi Arabia\",\n\t\"country_select_modal_country_sn\": \"Senegal\",\n\t\"country_select_modal_country_rs\": \"Serbia\",\n\t\"country_select_modal_country_sc\": \"Seychelles\",\n\t\"country_select_modal_country_sl\": \"Sierra Leone\",\n\t\"country_select_modal_country_sg\": \"Singapore\",\n\t\"country_select_modal_country_nl_bq3\": \"Sint Eustatius\",\n\t\"country_select_modal_country_sx\": \"Sint Maarten\",\n\t\"country_select_modal_country_sk\": \"Slovakia\",\n\t\"country_select_modal_country_si\": \"Slovenia\",\n\t\"country_select_modal_country_sb\": \"Solomon Islands\",\n\t\"country_select_modal_country_so\": \"Somalia\",\n\t\"country_select_modal_country_za\": \"South Africa\",\n\t\"country_select_modal_country_gs\": \"South Georgia & South Sandwich Islands\",\n\t\"country_select_modal_country_ge_so\": \"South Ossetia\",\n\t\"country_select_modal_country_ss\": \"South Sudan\",\n\t\"country_select_modal_country_es\": \"Spain\",\n\t\"country_select_modal_country_lk\": \"Sri Lanka\",\n\t\"country_select_modal_country_sd\": \"Sudan\",\n\t\"country_select_modal_country_sr\": \"Suriname\",\n\t\"country_select_modal_country_sj_no\": \"Svalbard\",\n\t\"country_select_modal_country_sz\": \"Swaziland\",\n\t\"country_select_modal_country_se\": \"Sweden\",\n\t\"country_select_modal_country_ch\": \"Switzerland\",\n\t\"country_select_modal_country_sy\": \"Syria\",\n\t\"country_select_modal_country_tw\": \"Taiwan\",\n\t\"country_select_modal_country_tj\": \"Tajikistan\",\n\t\"country_select_modal_country_tz\": \"Tanzania\",\n\t\"country_select_modal_country_th\": \"Thailand\",\n\t\"country_select_modal_country_tg\": \"Togo\",\n\t\"country_select_modal_country_tk\": \"Tokelau\",\n\t\"country_select_modal_country_to\": \"Tonga\",\n\t\"country_select_modal_country_tt\": \"Trinidad & Tobago\",\n\t\"country_select_modal_country_tn\": \"Tunisia\",\n\t\"country_select_modal_country_tr\": \"Turkey\",\n\t\"country_select_modal_country_tm\": \"Turkmenistan\",\n\t\"country_select_modal_country_tc\": \"Turks & Caicos Islands\",\n\t\"country_select_modal_country_tv\": \"Tuvalu\",\n\t\"country_select_modal_country_ug\": \"Uganda\",\n\t\"country_select_modal_country_ua\": \"Ukraine\",\n\t\"country_select_modal_country_ae\": \"United Arab Emirates\",\n\t\"country_select_modal_country_uk\": \"United Kingdom\",\n\t\"country_select_modal_country_us\": \"United States\",\n\t\"country_select_modal_country_uy\": \"Uruguay\",\n\t\"country_select_modal_country_vi\": \"U.S. Virgin Islands\",\n\t\"country_select_modal_country_uz\": \"Uzbekistan\",\n\t\"country_select_modal_country_vu\": \"Vanuatu\",\n\t\"country_select_modal_country_ve\": \"Venezuela\",\n\t\"country_select_modal_country_va\": \"Vatican City\",\n\t\"country_select_modal_country_vn\": \"Vietnam\",\n\t\"country_select_modal_country_wf\": \"Wallis & Futuna\",\n\t\"country_select_modal_country_ye\": \"Yemen\",\n\t\"country_select_modal_country_zm\": \"Zambia\",\n\t\"country_select_modal_country_tz_uk\": \"Zanzibar\",\n\t\"country_select_modal_country_zw\": \"Zimbabwe\"\n}\n"
  },
  {
    "path": "app/js/locales/es-es.json",
    "content": "{\n    \"modal_search\": \"Buscar\",\n    \"modal_close\": \"Cerrar\",\n    \"modal_edit\": \"Editar\",\n    \"modal_cancel\": \"Cancelar\",\n    \"modal_more\": \"Más…\",\n    \"modal_next\": \"Siguiente\",\n    \"modal_ok\": \"OK\",\n    \"modal_done\": \"Hecho\",\n    \"group_modal_info\": \"Información\",\n    \"group_modal_pluralize_participants\": \"{'0': 'Sin miembros', 'one': '1 miembro', 'other': '{} miembros'}\",\n    \"group_modal_pluralize_online_participants\": \"{'one': '1 en línea', 'other': '{} en línea'}\",\n    \"group_modal_pluralize_subscribers\": \"{'0': 'Sin suscriptores', 'one': '1 suscriptor', 'other': '{} suscriptores'}\",\n    \"group_modal_participants\": \"{total}, {online}\",\n    \"group_modal_add_member\": \"Añadir miembro\",\n    \"group_modal_return\": \"Volver al grupo\",\n    \"group_modal_update_photo\": \"Actualizar foto\",\n    \"group_modal_update_active\": \"Actualizando\",\n    \"group_modal_menu_more\": \"Más\",\n    \"group_modal_menu_delete_photo\": \"Eliminar foto\",\n    \"group_modal_menu_edit_group\": \"Editar grupo\",\n    \"group_modal_menu_leave\": \"Salir\",\n    \"group_modal_menu_delete_group\": \"Eliminar y salir\",\n    \"group_modal_menu_clear_history\": \"Eliminar historial\",\n    \"group_modal_delete_group\": \"Eliminar grupo\",\n    \"group_modal_join\": \"Unirme al grupo\",\n    \"group_modal_settings\": \"Ajustes\",\n    \"group_modal_notifications\": \"Notificaciones\",\n    \"group_modal_menu_share_link\": \"Invitar al grupo con un enlace\",\n    \"group_modal_migrate_to_supergroup\": \"Convertir en supergrupo\",\n    \"group_modal_members\": \"Miembros\",\n    \"group_modal_members_kick\": \"Eliminar\",\n    \"group_modal_migrate_header\": \"Límite de miembros alcanzado\",\n    \"group_modal_migrate_desc\": \"Para superar el límite y tener características adicionales, conviértelo en un supergrupo:\",\n    \"group_modal_migrate_item1\": \"Permiten hasta 1000 miembros\",\n    \"group_modal_migrate_item2\": \"Nuevos miembros ven todo el historial\",\n    \"group_modal_migrate_item3\": \"Un administrador borra mensajes para todos\",\n    \"group_modal_migrate_item4\": \"Notificaciones silenciadas por defecto\",\n    \"channel_modal_info\": \"Información\",\n    \"channel_modal_description\": \"Descripción\",\n    \"channel_modal_share_link\": \"Compartir enlace\",\n    \"channel_modal_share_loading\": \"Cargando{dots}\",\n    \"channel_modal_menu_edit\": \"Editar canal\",\n    \"channel_modal_join\": \"Unirme al canal\",\n    \"channel_modal_add_member\": \"Añadir miembros\",\n    \"channel_modal_leave_channel\": \"Salir del canal\",\n    \"channel_modal_delete_channel\": \"Eliminar canal\",\n    \"country_select_modal_title\": \"País\",\n    \"settings_modal_title\": \"Ajustes\",\n    \"settings_modal_menu_more\": \"Más\",\n    \"settings_modal_delete_photo\": \"Eliminar foto de perfil\",\n    \"settings_modal_set_photo\": \"Poner foto de perfil\",\n    \"settings_modal_photo_updating\": \"Actualizando\",\n    \"settings_modal_edit_profile\": \"Editar perfil\",\n    \"settings_modal_edit_username\": \"Cambiar nombre de usuario\",\n    \"settings_modal_empty_username_set\": \"Elegir nombre de usuario\",\n    \"settings_modal_terminate_sessions\": \"Cerrar todas las otras sesiones\",\n    \"settings_modal_active_sessions\": \"Sesiones activas\",\n    \"settings_modal_settings\": \"Ajustes\",\n    \"settings_modal_notification_alert\": \"Alertas de notificaciones\",\n    \"settings_modal_notification_push\": \"Notificaciones PUSH\",\n    \"settings_modal_vibrate\": \"Vibración\",\n    \"settings_modal_sounds\": \"Sonidos\",\n    \"settings_modal_language\": \"Idioma\",\n    \"settings_modal_notifications\": \"Notificaciones de escritorio\",\n    \"settings_modal_pushes\": \"Notificaciones en segundo plano\",\n    \"settings_modal_message_preview\": \"Vista previa del mensaje\",\n    \"settings_modal_sound\": \"Sonido\",\n    \"settings_modal_enter_send_description_md\": \"**Intro** - enviar mensaje, **Shift + Intro** - nueva línea\",\n    \"settings_modal_ctrl_enter_send_description_md\": \"**Ctrl + Intro** - enviar mensaje, **Intro** - nueva línea\",\n    \"settings_modal_send_on_enter\": \"Enviar con Intro\",\n    \"settings_switch_back_to_desktop\": \"Volver a la vista de escritorio\",\n    \"settings_modal_about\": \"Acerca de\",\n    \"settings_modal_source_code_github\": \"Código fuente en GitHub\",\n    \"settings_modal_follow_us_twitter\": \"¡Síguenos en Twitter!\",\n    \"settings_modal_recent_updates\": \"Últimas actualizaciones (ver. {version})\",\n    \"settings_modal_set_password\": \"Poner una contraseña adicional\",\n    \"settings_modal_change_password\": \"Cambiar contraseña\",\n    \"settings_modal_disable_password\": \"Desactivar\",\n    \"settings_modal_disable_password_mobile\": \"Desactivar la contraseña\",\n    \"settings_modal_password_email_pending\": \"Haz clic en el enlace en {email} para configurar la verificación en dos pasos.\",\n    \"settings_modal_password_email_pending_cancel\": \"Cancelar\",\n    \"settings_modal_password_email_pending_cancel_mobile\": \"Anular contraseña\",\n    \"settings_modal_show_sensitive_content\": \"Mostrar contenido sensible\",\n    \"password_delete_title\": \"Desactivar contraseña\",\n    \"password_change_title\": \"Verificación en dos pasos\",\n    \"password_current_placeholder\": \"Pon tu contraseña actual\",\n    \"password_create_placeholder\": \"Pon una contraseña\",\n    \"password_new_placeholder\": \"Pon tu nueva contraseña\",\n    \"password_confirm_placeholder\": \"Repite tu nueva contraseña\",\n    \"password_hint_placeholder\": \"Pon la pista para tu contraseña\",\n    \"password_email_placeholder\": \"Pon tu correo de recuperación\",\n    \"password_create_description\": \"Esta contraseña será necesaria cuando inicies sesión en un nuevo dispositivo, además del código que recibes vía SMS.\",\n    \"password_create_active\": \"Guardando...\",\n    \"password_create_submit\": \"Guardar\",\n    \"password_delete_active\": \"Eliminando…\",\n    \"password_delete_submit\": \"Eliminar contraseña\",\n    \"sessions_modal_title\": \"Sesiones activas\",\n    \"sessions_modal_loading\": \"Cargando{dots}\",\n    \"sessions_modal_current_session\": \"Sesión actual\",\n    \"sessions_modal_session_online\": \"en línea\",\n    \"sessions_modal_terminate_one\": \"Cerrar sesión\",\n    \"sessions_modal_terminate_all\": \"Cerrar todas las demás sesiones\",\n    \"sessions_modal_active_sessions\": \"Sesiones activas\",\n    \"stickerset_modal_title_loading\": \"Pack de stickers\",\n    \"stickerset_modal_install\": \"Añadir stickers\",\n    \"stickerset_modal_uninstall\": \"Eliminar stickers\",\n    \"stickerset_modal_share\": \"Compartir\",\n    \"stickerset_modal_loading\": \"Cargando{dots}\",\n    \"page_title_pluralize_notifications\": \"{'0': 'Sin notificaciones', 'one': '1 notificación', 'other': '{} notificaciones'}\",\n    \"profile_edit_modal_title\": \"Editar perfil\",\n    \"profile_edit_first_name\": \"Nombre\",\n    \"profile_edit_last_name\": \"Apellidos\",\n    \"profile_edit_submit\": \"Guardar\",\n    \"profile_edit_submit_active\": \"Guardando…\",\n    \"username_edit_modal_title\": \"Cambiar nombre de usuario\",\n    \"username_edit_placeholder\": \"Nombre de usuario\",\n    \"username_edit_description_md\": \"Puedes elegir un nombre de usuario en **Telegram**. Si lo haces, otros usuarios te podrán encontrar por ese nombre y contactarte sin necesidad de saber tu número.\\n\\nPuedes usar a-z, 0-9 y guión bajo. La longitud mínima es de 5 caracteres.\",\n    \"username_edit_submit\": \"Guardar\",\n    \"username_edit_submit_active\": \"Guardando…\",\n    \"user_modal_menu_more\": \"Más\",\n    \"user_modal_send_message\": \"Enviar mensaje\",\n    \"user_modal_edit_contact\": \"Editar contacto\",\n    \"user_modal_delete_contact\": \"Eliminar contacto\",\n    \"user_modal_add_contact\": \"Añadir a Contactos\",\n    \"user_modal_share_contact\": \"Compartir contacto\",\n    \"user_modal_block_user\": \"Bloquear usuario\",\n    \"user_modal_unblock_user\": \"Desbloquear usuario\",\n    \"user_modal_clear_history\": \"Eliminar historial\",\n    \"user_modal_delete_chat\": \"Eliminar chat\",\n    \"user_modal_add_to_group\": \"Añadir al grupo\",\n    \"user_modal_info\": \"Información\",\n    \"user_modal_phone\": \"Teléfono\",\n    \"user_modal_about\": \"Acerca de\",\n    \"user_modal_bot_settings\": \"Ajustes\",\n    \"user_modal_bot_help\": \"Ayuda\",\n    \"user_modal_username\": \"Nombre de usuario\",\n    \"user_modal_settings\": \"Ajustes\",\n    \"user_modal_notifications\": \"Notificaciones\",\n    \"user_modal_contact_info\": \"Información\",\n    \"media_modal_photo\": \"Foto\",\n    \"media_modal_photo_index\": \"Foto {pos} de {count}\",\n    \"media_modal_video\": \"Video\",\n    \"media_modal_forward\": \"Reenviar\",\n    \"media_modal_download\": \"Descargar\",\n    \"media_modal_delete\": \"Eliminar\",\n    \"game_modal_share_game\": \"Compartir juego\",\n    \"game_modal_share_score\": \"Compartir puntuación\",\n    \"error_browser_no_local_file_system_image_md\": \"Tu navegador no es compatible con la función {moz-link: https://developer.mozilla.org/es-ES/docs/Web/API/LocalFileSystem | LocalFileSystem}, necesaria para mostrar esta imagen.\\nPor favor, instala {chrome-link: https://google.com/chrome | Google Chrome}, o usa {telegram-link: https://telegram.org/ | la aplicación móvil} en su lugar.\",\n    \"error_image_download_failed\": \"Descarga fallida\",\n    \"error_browser_no_local_file_system_video_md\": \"Tu navegador no es compatible con la función {moz-link: https://developer.mozilla.org/es-ES/docs/Web/API/LocalFileSystem | LocalFileSystem}, necesaria para reproducir este video.\\nPor favor, instala {chrome-link: https://google.com/chrome | Google Chrome}, o usa {telegram-link: https://telegram.org/ | la aplicación móvil} en su lugar.\",\n    \"error_video_download_failed\": \"Descarga de video fallida\",\n    \"unread_messages_split\": \"Mensajes sin leer\",\n    \"user_name_deleted\": \"ELIMINADO\",\n    \"user_first_name_deleted\": \"ELIMINADO\",\n    \"user_name_saved_msgs\": \"Mensajes guardados\",\n    \"user_status_online\": \"en línea\",\n    \"user_status_last_seen\": \"últ. vez {0}\",\n    \"user_status_recently\": \"últ. vez recientemente\",\n    \"user_status_last_week\": \"últ. vez hace unos días\",\n    \"user_status_last_month\": \"últ. vez hace unas semanas\",\n    \"user_status_long_ago\": \"últ. vez hace mucho tiempo\",\n    \"user_status_bot\": \"bot\",\n    \"user_status_service_notifications\": \"servicio de notificaciones\",\n    \"user_status_support\": \"soporte\",\n    \"user_status_bot_noprivacy\": \"tiene acceso a los mensajes\",\n    \"user_status_bot_privacy\": \"no tiene acceso a los mensajes\",\n    \"chat_title_deleted\": \"ELIMINADO\",\n    \"format_size_progress_mulitple\": \"{done} de {total} {parts}\",\n    \"format_size_progress\": \"{done} de {total}\",\n    \"relative_time_pluralize_minutes_ago\": \"{'one': 'hace 1 minuto', 'other': 'hace {} minutos'}\",\n    \"relative_time_pluralize_hours_ago\": \"{'one': 'hace 1 hora', 'other': 'hace {} horas'}\",\n    \"relative_time_just_now\": \"hace un momento\",\n    \"changelog_modal_header_recent_updates_md\": \"Últimas actualizaciones en **Telegram Web**\",\n    \"changelog_modal_header_new_updates_md\": \"¡**Telegram Web** se ha actualizado!\",\n    \"changelog_modal_title_current_version\": \"versión actual\",\n    \"changelog_modal_full_description_md\": \"App oficial de mensajería gratuita basada en la API de Telegram para la velocidad y seguridad.\\n\\nEste software está bajo licencia GNU GPL versión 3.\",\n    \"changelog_modal_changelog_link\": \"Novedades\",\n    \"changelog_app_version\": \"Versión {version}\",\n    \"group_create_contacts_modal_title\": \"Nuevo grupo\",\n    \"group_create_modal_title\": \"Crear grupo\",\n    \"group_create_name\": \"Nombre del grupo\",\n    \"group_create_submit\": \"Crear grupo\",\n    \"group_create_submit_active\": \"Creando…\",\n    \"group_edit_modal_title\": \"Editar grupo\",\n    \"group_edit_name\": \"Nombre del grupo\",\n    \"group_edit_about\": \"Descripción del grupo\",\n    \"group_edit_submit\": \"Guardar\",\n    \"group_edit_submit_active\": \"Guardando…\",\n    \"channel_edit_modal_title\": \"Editar canal\",\n    \"channel_edit_name\": \"Nombre del canal\",\n    \"channel_edit_about\": \"Descripción del canal\",\n    \"channel_edit_submit\": \"Guardar\",\n    \"channel_edit_submit_active\": \"Guardando…\",\n    \"group_invite_link_modal_title\": \"Enlace de invitación\",\n    \"group_invite_link_link_label\": \"Copiar enlace\",\n    \"group_invite_link_loading\": \"Cargando…\",\n    \"group_invite_revoke_active\": \"Revocando…\",\n    \"group_invite_revoke\": \"Anular\",\n    \"report_reason_modal_title\": \"Reportar\",\n    \"report_reason_modal_spam\": \"Spam\",\n    \"report_reason_modal_violence\": \"Violencia\",\n    \"report_reason_modal_pornography\": \"Pornografía\",\n    \"report_reason_modal_childabuse\": \"Abuso infantil\",\n    \"report_reason_modal_other\": \"Otros\",\n    \"report_reason_modal_other_placeholder\": \"Descripción\",\n    \"report_reason_modal_submit_btn\": \"Enviar\",\n    \"clipboard_copied\": \"¡Copiado!\",\n    \"clipboard_press_ctrl_c\": \"Presiona Ctrl+C para copiar\",\n    \"clipboard_press_cmd_c\": \"Presiona ⌘+C para copiar\",\n    \"confirm_modal_logout\": \"¿Quieres cerrar sesión?\",\n    \"confirm_modal_update_reload\": \"Se ha descargado una nueva versión de Telegram Web. ¿Quieres iniciarla?\",\n    \"confirm_modal_history_flush\": \"¿Quieres limpiar el historial? ¡Esto no puede deshacerse!\",\n    \"confirm_modal_history_leave_flush_md\": \"¿Quieres eliminar todo el historial de mensajes y salir del grupo?\\n\\nEsta acción no se puede deshacer.\",\n    \"confirm_modal_leave_channel_md\": \"¿Quieres salir de este canal?\\n\\nEsta acción no se puede deshacer.\",\n    \"confirm_modal_leave_group_md\": \"¿Quieres salir de este grupo?\\n\\nEsta acción no se puede deshacer.\",\n    \"confirm_modal_terminate_sessions\": \"¿Quieres cerrar la sesión de todos los dispositivos, excepto este?\",\n    \"confirm_modal_terminate_session\": \"¿Quieres cerrar la sesión de este dispositivo?\",\n    \"confirm_modal_clipboard_file_send\": \"¿Quieres enviar archivo(s) desde el portapapeles?\",\n    \"confirm_modal_clipboard_X_files_send\": \"{'one': '¿Quieres enviar un archivo desde el portapapeles?', 'other': '¿Quieres enviar {} archivos desde el portapapeles?'}\",\n    \"confirm_modal_message_delete\": \"¿Quieres eliminar el mensaje?\",\n    \"confirm_modal_delete_X_messages\": \"{'one': '{} mensaje', 'other': '{} mensajes'}\",\n    \"confirm_modal_delete_messages\": \"¿Quieres eliminar {messages}?\",\n    \"confirm_modal_message_revoke\": \"Eliminar para {recipient}\",\n    \"confirm_modal_message_revoke_recipient_chat\": \"todos\",\n    \"confirm_modal_delete_messages_for_everyone_chat\": \"Serán eliminados para todos en este chat.\",\n    \"confirm_modal_delete_messages_for_you_only_pm\": \"Se eliminarán sólo para ti, no para {user}.\",\n    \"confirm_modal_delete_messages_for_you_only_chat\": \"Esto eliminará mensajes sólo para ti, no para los otros participantes del chat.\",\n    \"confirm_modal_photo_delete\": \"¿Quieres eliminar la foto?\",\n    \"confirm_modal_contacts_import\": \"Telegram sincronizará tus contactos para encontrar a tus amigos.\",\n    \"confirm_modal_login_phone_correct\": \"¿Es correcto este número?\",\n    \"confirm_modal_forward_to_peer\": \"¿Reenviar a {peer}?\",\n    \"confirm_modal_forward_to_peer_success\": \"El mensaje fue reenviado exitosamente.\",\n    \"confirm_modal_report_success\": \"Reporte enviado\",\n    \"confirm_modal_send_to_peer\": \"¿Enviar a {peer}?\",\n    \"confirm_modal_share_file_peer\": \"¿Compartir con {peer}?\",\n    \"confirm_modal_invite_peer\": \"¿Añadir a {peer}?\",\n    \"confirm_modal_share_game\": \"¿Compartir el juego con {peer}?\",\n    \"confirm_modal_apply_lang_with_reload_md\": \"¿Quieres recargar la aplicación para usar el nuevo idioma?\",\n    \"confirm_modal_migrate_to_https_md\": \"Telegram Web ahora permite usar cifrado SSL adicional. ¿Quieres cambiar a HTTPS?\\nLa versión HTTP será inhabilitada pronto.\",\n    \"confirm_modal_resize_desktop_md\": \"¿Quieres cambiar a la versión de escritorio?\",\n    \"confirm_modal_resize_mobile_md\": \"¿Quieres cambiar a la versión móvil?\",\n    \"confirm_modal_recovery_email_empty_md\": \"¡Advertencia! ¿No quieres añadir un correo de recuperación para la contraseña?\\n\\nSi olvidas tu contraseña, perderás el acceso a tu cuenta de Telegram.\",\n    \"confirm_modal_abort_password_setup\": \"¿Anular la configuración de la verificación en dos pasos?\",\n    \"confirm_modal_reset_account_md\": \"¿Quieres hacerlo?\\nEsta acción no se puede deshacer.\\n\\nSi continúas con el reinicio de tu cuenta, perderás todos tus chats y mensajes, junto con toda la multimedia y archivos que compartiste. \",\n    \"confirm_modal_join_group_link\": \"¿Quieres unirte al grupo «{title}»?\",\n    \"confirm_modal_join_channel_link\": \"¿Quieres unirte al canal «{title}»?\",\n    \"confirm_modal_revoke_group_link\": \"¿Quieres anular este enlace? Una vez hecho, nadie podrá usarlo para unirse al grupo.\",\n    \"confirm_modal_revoke_channel_link\": \"¿Quieres anular este enlace? Una vez hecho, nadie podrá usarlo para unirse al grupo.\",\n    \"confirm_modal_delete_channel_md\": \"¿Quieres eliminar este canal?\\n\\nTodos los miembros y mensajes serán eliminados.\",\n    \"confirm_modal_delete_group_md\": \"¿Quieres eliminar este grupo?\\n\\nTodos los miembros y mensajes serán eliminados.\",\n    \"confirm_modal_jump_ext_url_md\": \"¿Abrir este enlace?\\n\\n{url}\",\n    \"confirm_modal_migrate_supergroup_md\": \"Por favor, ten en cuenta que los miembros del grupo tendrán que actualizar Telegram a la última versión para ver tu supergrupo. \\n\\n¿Quieres convertir el grupo?\",\n    \"confirm_modal_bot_access_phone\": \"El bot sabrá tu número de teléfono. Puede ser útil para la integración con otros servicios.\",\n    \"confirm_modal_bot_access_geo\": \"Esto enviará tu ubicación actual al bot.\",\n    \"confirm_modal_bot_access_geo_inline\": \"Este bot podría querer saber tu ubicación cada vez que le envías una solicitud. Esto puede ser usado para entregar resultados específicos para tu ubicación.\",\n    \"confirm_modal_content_settings_sensitive_md\": \"**Desactivar filtro**\\nSi desactivas el filtro, Telegram mostrará multimedia sensible en canales públicos en todos tus dispositivos conectados.\",\n    \"confirm_modal_content_settings_sensitive_submit\": \"Desactivar\",\n    \"confirm_modal_are_u_sure\": \"¿Confirmar?\",\n    \"confirm_modal_logout_submit\": \"Cerrar sesión\",\n    \"confirm_modal_clear_history_submit\": \"Eliminar historial\",\n    \"confirm_modal_leave_chat_submit\": \"Salir\",\n    \"confirm_modal_delete_chat_submit\": \"Eliminar chat\",\n    \"confirm_modal_clipboard_files_send_submit\": \"Enviar\",\n    \"confirm_modal_clipboard_file_send_submit\": \"Enviar\",\n    \"confirm_modal_message_delete_submit\": \"Eliminar\",\n    \"confirm_modal_messages_delete_submit\": \"Eliminar\",\n    \"confirm_modal_photo_delete_submit\": \"Eliminar\",\n    \"confirm_modal_forward_message_submit\": \"Reenviar mensaje\",\n    \"confirm_modal_share_photo_submit\": \"Reenviar foto\",\n    \"confirm_modal_share_video_submit\": \"Reenviar video\",\n    \"confirm_modal_share_contact_submit\": \"Enviar contacto\",\n    \"confirm_modal_share_file_submit\": \"Compartir archivo\",\n    \"confirm_modal_reset_account_submit\": \"Restablecer mi cuenta\",\n    \"contacts_modal_edit_list\": \"Editar\",\n    \"contacts_modal_edit_cancel\": \"Cancelar\",\n    \"contacts_modal_edit_delete\": \"Eliminar\",\n    \"contacts_modal_pluralize_new_group_members\": \"{'one': '1 miembro', 'other': '{} miembros'}\",\n    \"contacts_modal_title\": \"Contactos\",\n    \"contacts_modal_new_contact\": \"Nuevo contacto\",\n    \"contacts_modal_empty_list\": \"Tu lista de contactos está vacía . Puedes {import-link: añadir un nuevo contacto} con su número de teléfono.\",\n    \"conversations_modal_forward_title\": \"Reenviar\",\n    \"conversations_modal_forward_submit\": \"Reenviar\",\n    \"conversations_modal_select_recipients\": \"Elige destinatarios\",\n    \"conversations_modal_recipients\": \"Destinatarios:\",\n    \"conversations_modal_share_url_loading\": \"Cargando{dots}\",\n    \"conversations_modal_share_url_copy\": \"Haz clic para copiar el enlace\",\n    \"contact_edit_modal_first_name\": \"Nombre\",\n    \"contact_edit_modal_last_name\": \"Apellidos\",\n    \"contact_edit_modal_title\": \"Editar contacto\",\n    \"contact_edit_modal_submit\": \"Guardar\",\n    \"contact_edit_modal_submit_active\": \"Guardando…\",\n    \"contact_import_modal_title\": \"Añadir nuevo contacto\",\n    \"contact_import_modal_phone\": \"Número de teléfono\",\n    \"contact_import_modal_phonebook\": \"Agenda de contactos\",\n    \"contact_import_modal_submit\": \"Guardar\",\n    \"contact_import_modal_submit_active\": \"Importando…\",\n    \"conversation_you\": \"Tú\",\n    \"conversation_draft\": \"Borrador:\",\n    \"conversation_media_photo\": \"Foto\",\n    \"conversation_media_video\": \"Video\",\n    \"conversation_media_round\": \"Videomensaje\",\n    \"conversation_media_document\": \"Archivo\",\n    \"conversation_media_sticker\": \"Sticker\",\n    \"conversation_media_gif\": \"GIF\",\n    \"conversation_media_audio\": \"Audio\",\n    \"conversation_media_location\": \"Ubicación\",\n    \"conversation_media_contact\": \"Contacto\",\n    \"conversation_media_attachment\": \"Archivo adjunto\",\n    \"conversation_media_unsupported\": \"Adjunto no compatible\",\n    \"conversation_search_peer\": \"Buscar en el chat\",\n    \"conversation_group_created\": \"creó el grupo\",\n    \"conversation_group_renamed\": \"cambió el nombre del grupo\",\n    \"conversation_group_photo_updated\": \"cambió la foto del grupo\",\n    \"conversation_group_photo_removed\": \"eliminó la foto del grupo\",\n    \"conversation_returned_to_group\": \"volvió al grupo\",\n    \"conversation_joined_group\": \"se unió al grupo\",\n    \"conversation_invited_user\": \"añadió a {user}\",\n    \"conversation_invited_users\": \"{'one': 'añadió a {} usuario', 'other': 'añadió a {} usuarios'}\",\n    \"conversation_left_group\": \"salió del grupo\",\n    \"conversation_kicked_user\": \"eliminó a {user}\",\n    \"conversation_invited_user_message\": \"añadió a un usuario\",\n    \"conversation_kicked_user_message\": \"expulsó a un usuario\",\n    \"conversation_joined_by_link\": \"se unió al grupo\",\n    \"conversation_converted_to_supergroup\": \"fue convertido en un supergrupo\",\n    \"conversation_created_channel\": \"Canal creado\",\n    \"conversation_changed_channel_name\": \"Canal renombrado\",\n    \"conversation_changed_channel_photo\": \"Foto del canal actualizada\",\n    \"conversation_removed_channel_photo\": \"Foto del canal eliminada\",\n    \"conversation_pinned_message\": \"ancló un mensaje\",\n    \"conversation_scored_X\": \"{'one': 'consiguió {} punto', 'other': 'consiguió {} puntos'}\",\n    \"conversation_message_sent\": \"te envió un mensaje\",\n    \"conversation_forwarded_X_messages\": \"{'one': '{} mensaje reenviado', 'other': '{} mensajes reenviados'}\",\n    \"conversation_unknown_user\": \"Alguien\",\n    \"conversation_unknown_chat\": \"Chat desconocido\",\n    \"message_service_created_group\": \"creó el grupo {group-name}\",\n    \"message_service_changed_group_name\": \"cambió el nombre del grupo a {group-name}\",\n    \"message_service_changed_group_photo\": \"cambió la foto del grupo\",\n    \"message_service_removed_group_photo\": \"eliminó la foto del grupo\",\n    \"message_service_invited_user\": \"añadió a {user}\",\n    \"message_service_invited_users\": \"añadió a {user} y a {num-more} más\",\n    \"message_service_returned_to_group\": \"volvió al grupo\",\n    \"message_service_kicked_user\": \"expulsó a {user}\",\n    \"message_service_left_group\": \"salió del grupo\",\n    \"message_service_joined_by_link\": \"se unió al grupo con un enlace de invitación\",\n    \"message_service_joined\": \"se unió al grupo\",\n    \"message_service_pinned_message\": \"ancló «{message}»\",\n    \"message_service_phonecall_incoming\": \"Llamada entrante\",\n    \"message_service_phonecall_outgoing\": \"Llamada saliente\",\n    \"message_service_phonecall_missed\": \"Llamada perdida\",\n    \"message_service_phonecall_canceled\": \"Llamada cancelada\",\n    \"message_service_phonecall\": \"Llamada {duration}\",\n    \"message_service_scored_game\": \"{scored} en {message}\",\n    \"message_service_unsupported_action\": \"acción no compatible {action}\",\n    \"message_service_bot_intro_header\": \"¿Qué puede hacer este bot?\",\n    \"message_service_converted_to_supergroup\": \"convirtió el grupo en un supergrupo\",\n    \"message_service_created_channel\": \"Canal creado\",\n    \"message_service_changed_channel_name\": \"Canal renombrado a {channel-name}\",\n    \"message_service_changed_channel_photo\": \"Foto del canal actualizada\",\n    \"message_service_removed_channel_photo\": \"Foto del canal eliminada\",\n    \"message_service_scored_X\": \"{'one': 'puntuó {}', 'other': 'puntuó {}'}\",\n    \"message_service_payment_sent\": \"Pago enviado\",\n    \"message_service_screenshot_taken\": \"hizo una captura de pantalla\",\n    \"message_admin_badge\": \"administrador\",\n    \"message_action_reply\": \"Responder\",\n    \"message_action_edit\": \"Editar\",\n    \"message_action_delete\": \"Eliminar\",\n    \"message_action_report\": \"Reportar\",\n    \"message_action_forward\": \"Reenviar\",\n    \"message_action_select\": \"Elegir\",\n    \"message_action_cancel\": \"Cancelar\",\n    \"message_action_retry\": \"Reintentar\",\n    \"error_modal_warning_title\": \"Advertencia\",\n    \"error_modal_bad_request_title\": \"Error\",\n    \"error_modal_unauthorized_title\": \"No autorizado\",\n    \"error_modal_forbidden_title\": \"Acceso denegado\",\n    \"error_modal_not_found_title\": \"No encontrado\",\n    \"error_modal_network_title\": \"Error de red\",\n    \"error_modal_flood_title\": \"Demasiado rápido\",\n    \"error_modal_internal_title\": \"Error  del servidor\",\n    \"error_modal_alert\": \"Alerta\",\n    \"error_modal_email_unconfirmed_title\": \"¡Ya casi!\",\n    \"error_modal_email_unconfirmed_descripion\": \"Por favor, revisa tu correo (no olvides la carpeta del spam) para configurar la verificación en dos pasos.\",\n    \"error_modal_password_success_title\": \"¡Listo!\",\n    \"error_modal_password_disabled_title\": \"Contraseña desactivada\",\n    \"error_modal_media_not_supported_title\": \"Multimedia no compatible\",\n    \"error_modal_phonecalls_not_supported_title\": \"Las llamadas no están disponibles\",\n    \"error_modal_recovery_na_title\": \"Lo sentimos\",\n    \"error_modal_network_description\": \"Por favor, revisa tu conexión a internet.\",\n    \"error_modal_firstname_invali_description\": \"El nombre introducido es inválido.\",\n    \"error_modal_lastname_invalid_description\": \"Los apellidos introducidos son inválidos.\",\n    \"error_modal_phone_invalid_description\": \"El número de teléfono introducido es inválido.\",\n    \"error_modal_users_too_much_description\": \"Muchos miembros en el grupo.\",\n    \"error_modal_photo_dimensions_invalid_description\": \"Las dimensiones de la foto son inválidas. Por favor, selecciona otro archivo.\",\n    \"error_modal_video_file_invalid_description\": \"El formato del video es inválido o no es compatible. Por favor, selecciona otro archivo.\",\n    \"error_modal_photo_too_small_description\": \"La foto proporcionada es muy pequeña.\",\n    \"error_modal_no_phone_user_description_md\": \"Lo siento, no existe una cuenta de **Telegram** asociada al teléfono introducido.\",\n    \"error_modal_no_phone_users_description_md\": \"Lo siento, no existen cuentas de **Telegram** asociadas a los teléfonos introducidos.\",\n    \"error_modal_username_invalid_description\": \"Lo siento, este nombre de usuario no está permitido.\",\n    \"error_modal_phonebook_required_description\": \"Telegram necesita acceso a tu agenda para importar contactos.\",\n    \"error_modal_username_occupied_description\": \"Lo siento, este nombre de usuario ya está ocupado.\",\n    \"error_modal_media_not_supported_description\": \"Tu navegador no puede reproducir este archivo multimedia. Prueba descargándolo y abriéndolo en un reproductor independiente.\",\n    \"error_modal_username_not_found_description\": \"No hay una cuenta de Telegram con el nombre de usuario proporcionado.\",\n    \"error_modal_phonecalls_not_supported_description_md\": \"Las llamadas no son compatibles con la versión Web, por el momento.\\n\\nPuedes llamar a {user} con una app móvil o de escritorio.\\n{download-link: Download »}\",\n    \"error_modal_app_signup_forbidden_md\": \"Aún no tienes una cuenta de Telegram. Por favor, **regístrate** con un {signup-link: Android / iPhone} primero.\",\n    \"error_modal_bad_request_description\": \"Falta uno de los parámetros o es inválido.\",\n    \"error_modal_unauthorized_description\": \"Esta acción requiere acceso autorizado. Por favor, {login-link: inicia sesión}.\",\n    \"error_modal_forbidden_description\": \"No estás autorizado para esta acción.\",\n    \"error_modal_not_found_description\": \"No se encontró la página.\",\n    \"error_modal_flood_description\": \"Estás realizando demasiadas acciones. Por favor, reinténtalo más tarde.\",\n    \"error_modal_internal_description\": \"Error interno del servidor. Por favor, reinténtalo más tarde.\",\n    \"error_modal_tech_details\": \"Haz clic para detalles técnicos\",\n    \"error_modal_recovery_na_description\": \"Como no estableciste un correo de recuperación cuando configuraste tu contraseña, las opciones restantes son recordar tu contraseña o restablecer tu cuenta.\",\n    \"error_modal_password_success_descripion\": \"Tu contraseña para la verificación en dos pasos está activada.\",\n    \"error_modal_password_disabled_descripion\": \"Has desactivado la verificación en dos pasos.\",\n    \"error_modal_user_not_mutual_contact\": \"El usuario sólo puede ser añadido por sus contactos\",\n    \"error_modal_invite_link_invalid\": \"El enlace de invitación es inválido\",\n    \"error_modal_channel_not_accessible\": \"Lo sentimos, este canal no es accesible.\",\n    \"error_modal_not_contact_flood\": \"Lo sentimos, por ahora puedes enviar mensajes sólo a contactos mutuos. {more-info-link: Más información »}\",\n    \"error_modal_gelocation_na\": \"La aplicación no pudo determinar tu ubicación actual\",\n    \"error_modal_2fa_recent_confirm\": \"Tus intentos recientes para restablecer la cuenta fueron cancelados por su usuario activo. Por favor, reinténtalo en 7 días.\",\n    \"error_modal_2fa_delayed_time_md\": \"Podrás restablecer tu cuenta en: **{time}**\",\n    \"head_mainmenu\": \"Menú principal\",\n    \"head_telegram\": \"Telegram\",\n    \"head_new_group\": \"Nuevo grupo\",\n    \"head_new_contact\": \"Nuevo contacto\",\n    \"head_contacts\": \"Contactos\",\n    \"head_contacts_title\": \"Contactos\",\n    \"head_telegram_faq\": \"Preguntas frecuentes\",\n    \"head_settings\": \"Ajustes\",\n    \"head_log_out\": \"Cerrar sesión\",\n    \"head_peer_more\": \"Más\",\n    \"head_select_messages\": \"Elegir mensajes\",\n    \"head_media_photos\": \"Fotos\",\n    \"head_media_video\": \"Videos\",\n    \"head_media_documents\": \"Archivos\",\n    \"head_media_music\": \"Audio\",\n    \"head_media_links\": \"Enlaces\",\n    \"head_media_audio\": \"Mensajes de voz\",\n    \"head_media_round\": \"Videomensajes\",\n    \"head_media_mymentions\": \"Menciones\",\n    \"head_media_search\": \"Buscar\",\n    \"head_about\": \"Acerca de\",\n    \"head_clear_all\": \"Eliminar historial\",\n    \"head_select\": \"Seleccionar\",\n    \"head_typing\": \"escribiendo\",\n    \"head_pluralize_participants\": \"{'0': 'Sin miembro', 'one': '1 miembro', 'other': '{} miembros'}\",\n    \"head_one_typing\": \"{name1} está escribiendo{dots}\",\n    \"head_two_typing\": \"{name1}, {name2}{dots}\",\n    \"head_many_typing\": \"{name1}+{names}{dots}\",\n    \"head_waiting_for_network\": \"Esperando red\",\n    \"head_retry\": \"Reintentar\",\n    \"head_connecting\": \"Conectando\",\n    \"footer_twitter\": \"Twitter\",\n    \"im_new_group\": \"Nuevo grupo\",\n    \"im_new_contact\": \"Nuevo contacto\",\n    \"im_contacts\": \"Contactos\",\n    \"im_chat_contacts_title\": \"Chats y contactos\",\n    \"im_settings\": \"Ajustes\",\n    \"im_conversations\": \"Conversaciones\",\n    \"im_found_title\": \"Búsqueda global\",\n    \"im_messages\": \"Mensajes\",\n    \"im_no_contacts\": \"Aún sin contactos\",\n    \"im_get_started_long\": \"Comienza añadiendo un contacto con quien chatear\",\n    \"im_add_contact\": \"Añadir  contacto\",\n    \"im_import_phonebook\": \"Importar agenda de contactos\",\n    \"im_get_started\": \"Comienza\",\n    \"im_welcome_text\": \"Te damos la bienvenida a Telegram Web. Puedes establecer tu foto de perfil y cambiar tu nombre en Ajustes.\",\n    \"im_open_settings\": \"Abrir ajustes\",\n    \"im_select_a_chat\": \"Elige un chat para comenzar.\",\n    \"im_loading_history\": \"Cargando historial\",\n    \"im_media\": \"Multimedia\",\n    \"im_media_photos\": \"Fotos\",\n    \"im_media_video\": \"Videos\",\n    \"im_media_documents\": \"Archivos\",\n    \"im_media_audio\": \"Mensajes de voz\",\n    \"im_media_round\": \"Videomensajes\",\n    \"im_media_music\": \"Audio\",\n    \"im_media_links\": \"Enlaces\",\n    \"im_media_mentions\": \"Menciones y respuestas\",\n    \"im_pluralize_participants\": \"{'0': 'Sin miembros', 'one': '1 miembro', 'other': '{} miembros'}\",\n    \"im_show_recent_messages\": \"Mostrar mensajes recientes\",\n    \"im_show_all_messages\": \"Mostrar todos los mensajes\",\n    \"im_no_messages\": \"Aún no hay mensajes...\",\n    \"im_one_typing\": \"{name1} está escribiendo{dots}\",\n    \"im_two_typing\": \"{name1} y {name2} están escribiendo{dots}\",\n    \"im_many_typing\": \"{name1}, {name2} y {count} más están escribiendo{dots}\",\n    \"im_conversation_single_typing\": \"escribiendo{dots}\",\n    \"im_conversation_group_typing\": \"{name} está escribiendo{dots}\",\n    \"im_delete_chat\": \"Eliminar chat\",\n    \"im_clear_history\": \"Eliminar historial\",\n    \"im_delete\": \"Eliminar {count}\",\n    \"im_forward\": \"Reenviar {count}\",\n    \"im_reply\": \"Responder\",\n    \"im_edit\": \"Editar\",\n    \"im_start\": \"Iniciar\",\n    \"im_channel_join\": \"+ Unirme\",\n    \"im_channel_mute\": \"Silenciar\",\n    \"im_channel_unmute\": \"No silenciar\",\n    \"im_report\": \"Reportar {count}\",\n    \"im_reply_loading\": \"Cargando{dots}\",\n    \"im_X_forwarded_messages\": \"{'one': '{} mensaje reenviado', 'other': '{} mensajes reenviados'}\",\n    \"im_photos_drop_text\": \"Suelta las fotos aquí para enviarlas\",\n    \"im_message_field_placeholder\": \"Escribe un mensaje...\",\n    \"im_broadcast_field_placeholder\": \"Difunde un mensaje...\",\n    \"im_emoji_tab\": \"Emoji\",\n    \"im_stickers_tab\": \"Stickers\",\n    \"im_stickers_tab_recent\": \"Uso frecuente\",\n    \"im_voice_record_title\": \"Graba un mensaje\",\n    \"im_media_attach_title\": \"Enviar multimedia\",\n    \"im_attach_file_title\": \"Enviar archivo\",\n    \"im_emoji_btn_title\": \"Insertar emoticono\",\n    \"im_submit_message\": \"Enviar\",\n    \"im_submit_edit_message\": \"Guardar\",\n    \"im_edit_message_title\": \"Editar mensaje\",\n    \"im_voice_recording_label\": \"Suelta fuera de aquí para cancelar\",\n    \"im_voice_recording_cancel_label\": \"Suelta para cancelar la grabación\",\n    \"im_voice_processing_label\": \"Procesando{dots}\",\n    \"login_sign_in\": \"Iniciar sesión\",\n    \"login_enter_number_description_md\": \"Por favor, elige tu país y pon tu número de teléfono completo.\\n\\nTen en cuenta que necesitas una cuenta ya existente para iniciar sesión en Telegram Web. Para registrarte en Telegram, usa una de nuestras {apps-link: apps móviles}.\",\n    \"login_incorrect_number\": \"Número de teléfono incorrecto\",\n    \"login_code_input_placeholder\": \"Código\",\n    \"login_tel_input_placeholder\": \"Número de teléfono\",\n    \"login_country_select_placeholder\": \"País\",\n    \"login_generating_key\": \"Generando claves\",\n    \"login_generating_keys_info\": \"Las claves sólo se generan una vez. Puede tardar unos minutos en dispositivos lentos. Por favor, ten paciencia.\",\n    \"login_edit_number\": \"Editar el número de teléfono\",\n    \"login_enter_code_label_md\": \"Enviamos el código vía **Telegram** en tu otro dispositivo.\\nPor favor, pon el código abajo.\",\n    \"login_enter_sms_code_label_md\": \"Enviamos un SMS con el código de activación a tu teléfono.\\nPor favor, pon el código abajo.\",\n    \"login_enter_call_code_label_md\": \"Estamos llamando a tu teléfono para dictar un código.\\nPor favor, pon el código abajo.\",\n    \"login_code_remaining\": \"Podrás solicitar un SMS en {remaining}\",\n    \"login_call_remaining\": \"Podrás solicitar una llamada en {remaining}\",\n    \"login_code_not_received\": \"Enviar código por SMS\",\n    \"login_code_not_received_call\": \"Enviar el código vía llamada\",\n    \"login_code_requesting\": \"Solicitando el código\",\n    \"login_incorrect_sms_code\": \"Código SMS incorrecto\",\n    \"login_number_input_placeholder\": \"Inserta tu código\",\n    \"login_checking_code\": \"Comprobando el código\",\n    \"login_your_info\": \"Tu información\",\n    \"login_fulll_name_label\": \"Por favor, inserta tu nombre completo para crear tu cuenta de Telegram.\",\n    \"login_incorrect_first_name\": \"Nombre incorrecto\",\n    \"login_first_name\": \"Nombre\",\n    \"login_incorrect_last_name\": \"Apellidos incorrectos\",\n    \"login_last_name\": \"Apellidos\",\n    \"login_signing_up\": \"Iniciando sesión\",\n    \"login_sign_up\": \"Iniciar sesión\",\n    \"login_about_title\": \"Acerca de\",\n    \"login_about_hide\": \"ocultar\",\n    \"login_try_desktop\": \"For best experience on your computer, try {telegram-link}\",\n    \"login_try_desktop_btn\": \"Download Telegram\",\n    \"login_try_desktop_short_btn\": \"Download\",\n    \"login_about_desc1_md\": \"La versión web de Telegram es gratis, rápida, segura y te permite disfrutar la mayoría de las características de **Telegram** en tu **navegador web**.\",\n    \"login_about_desc2_md\": \"Está siempre sincronizada con la **app de Telegram** en tu dispositivo móvil, lo que la convierte en una herramienta perfecta para mensajería y compartir archivos.\",\n    \"login_about_desc3_md\": \"Nuestro {source-link: código fuente} es abierto, así que todos pueden contribuir.\",\n    \"login_about_intro\": \"Te damos la bienvenida a la versión web oficial de Telegram.\",\n    \"login_about_learn\": \"Saber más\",\n    \"login_password_title\": \"Contraseña\",\n    \"login_password_label\": \"Activaste la verificación en dos pasos, así que tu cuenta está protegida con una contraseña adicional.\",\n    \"login_password_forgot_link\": \"¿Olvidaste la contraseña?\",\n    \"login_account_reset\": \"Restablecer la cuenta\",\n    \"login_password\": \"Tu contraseña\",\n    \"login_incorrect_password\": \"Contraseña incorrecta\",\n    \"login_checking_password\": \"Comprobando\",\n    \"login_recovery_title\": \"¿Olvidaste la contraseña?\",\n    \"login_code_placeholder\": \"Código\",\n    \"login_code_incorrect\": \"Código incorrecto\",\n    \"login_recovery_description_md\": \"Hemos enviado un código de recuperación al correo que nos proporcionaste:\\n\\n{email}\\n\\nPor favor, revisa tu correo y pon el código de 6 dígitos que enviamos.\",\n    \"password_recover_active\": \"Comprobando...\",\n    \"password_recover_submit\": \"Enviar\",\n    \"login_controller_unknown_country\": \"Desconocido\",\n    \"message_forwarded_message\": \"Mensaje reenviado\",\n    \"message_via_bot\": \"vía {bot}\",\n    \"message_edited\": \"editado\",\n    \"message_forwarded_message_mobile\": \"Reenviado de {from}\",\n    \"message_forwarded_via_message_mobile\": \"Reenviado de {from} vía {bot}\",\n    \"message_attach_audio_message\": \"Mensaje de voz\",\n    \"message_attach_audio_play\": \"Reproducir\",\n    \"message_attach_document_open\": \"Abrir\",\n    \"message_attach_document_download\": \"Descargar\",\n    \"message_attach_document_save\": \"Guardar archivo\",\n    \"message_attach_video_video\": \"Video\",\n    \"message_attach_video_download\": \"Descargar\",\n    \"message_attach_video_save\": \"Guardar archivo\",\n    \"message_attach_video_play\": \"Ver video\",\n    \"message_attach_unsupported\": \"Este mensaje no es compatible en tu versión de Telegram Web. Actualiza la app para verlo: {link}.\",\n    \"message_attach_unsupported_desktop\": \"Este mensaje no es compatible actualmente con Telegram Web. Prueba {link}.\",\n    \"message_attach_notweb\": \"Este mensaje aún no es compatible con Telegram Web. Usa las aplicaciones móviles de Telegram para verlo: {link}.\",\n    \"conversation_select_modal_title\": \"Seleccionar conversación\",\n    \"conversation_select_modal_chats_contacts\": \"Chats y contactos\",\n    \"conversation_one_selected\": \"{name1}\",\n    \"conversation_two_selected\": \"{name1} y {name2}\",\n    \"conversation_many_selected\": \"{name1}, {name2} y {count} más\",\n    \"phonebook_modal_title\": \"Agenda de contactos\",\n    \"phonebook_modal_deselect_all\": \"Descartar todos\",\n    \"phonebook_modal_select_all\": \"Elegir todos\",\n    \"phonebook_modal_empty\": \"Tu agenda de contactos está vacía.\",\n    \"phonebook_modal_submit_active\": \"Importando\",\n    \"phonebook_modal_submit\": \"Importar contactos\",\n    \"inactive_tab_title\": \"Telegram: Zzz...\",\n    \"inactive_title\": \"Wow. Muchas pestañas.\",\n    \"inactive_description_md\": \"Sólo puedes usar una pestaña activa con la app.\\nRecarga esta página para seguir usándola o ciérrala.\",\n    \"inactive_reload_btn\": \"Recargar app\",\n    \"push_action_mute1d\": \"Silenciar 1 día las alertas en segundo plano\",\n    \"push_action_settings\": \"Ajustes de alertas en segundo plano\",\n    \"push_action_mute1d_mobile\": \"Silenciar 24 h\",\n    \"push_action_settings_mobile\": \"Ajustes de alertas\",\n    \"push_message_nopreview\": \"Tienes un mensaje nuevo\",\n    \"push_action_mute1d_success\": \"Los ajustes fueron guardados exitosamente.\",\n    \"country_select_modal_country_ab\": \"Abjasia\",\n    \"country_select_modal_country_af\": \"Afganistán\",\n    \"country_select_modal_country_ax\": \"Islas Åland\",\n    \"country_select_modal_country_al\": \"Albania\",\n    \"country_select_modal_country_dz\": \"Argelia\",\n    \"country_select_modal_country_as\": \"Samoa Americana\",\n    \"country_select_modal_country_ad\": \"Andorra\",\n    \"country_select_modal_country_ao\": \"Angola\",\n    \"country_select_modal_country_ai\": \"Anguila\",\n    \"country_select_modal_country_ag\": \"Antigua y Barbuda\",\n    \"country_select_modal_country_ar\": \"Argentina\",\n    \"country_select_modal_country_am\": \"Armenia\",\n    \"country_select_modal_country_aw\": \"Aruba\",\n    \"country_select_modal_country_sh_ac\": \"Isla Ascensión\",\n    \"country_select_modal_country_au\": \"Australia\",\n    \"country_select_modal_country_au_et\": \"Australia (Territorios externos)\",\n    \"country_select_modal_country_at\": \"Austria\",\n    \"country_select_modal_country_az\": \"Azerbaiyán\",\n    \"country_select_modal_country_bs\": \"Bahamas\",\n    \"country_select_modal_country_bh\": \"Baréin\",\n    \"country_select_modal_country_bd\": \"Bangladés\",\n    \"country_select_modal_country_bb\": \"Barbados\",\n    \"country_select_modal_country_ag_bar\": \"Barbuda\",\n    \"country_select_modal_country_by\": \"Bielorrusia\",\n    \"country_select_modal_country_be\": \"Bélgica\",\n    \"country_select_modal_country_bz\": \"Belice\",\n    \"country_select_modal_country_bj\": \"Benín\",\n    \"country_select_modal_country_bm\": \"Bermudas\",\n    \"country_select_modal_country_bt\": \"Bután\",\n    \"country_select_modal_country_bo\": \"Bolivia\",\n    \"country_select_modal_country_bq\": \"Caribe Neerlandés\",\n    \"country_select_modal_country_ba\": \"Bosnia y Herzegovina\",\n    \"country_select_modal_country_bw\": \"Botsuana\",\n    \"country_select_modal_country_br\": \"Brasil\",\n    \"country_select_modal_country_io\": \"Territorio Británico del Océano Índico\",\n    \"country_select_modal_country_vg\": \"Islas Vírgenes Británicas\",\n    \"country_select_modal_country_bn\": \"Brunéi\",\n    \"country_select_modal_country_bg\": \"Bulgaria\",\n    \"country_select_modal_country_bf\": \"Burkina Faso\",\n    \"country_select_modal_country_mm\": \"Myanmar/Birmania\",\n    \"country_select_modal_country_bi\": \"Burundi\",\n    \"country_select_modal_country_kh\": \"Camboya\",\n    \"country_select_modal_country_cm\": \"Camerún\",\n    \"country_select_modal_country_ca\": \"Canadá\",\n    \"country_select_modal_country_cv\": \"Cabo Verde\",\n    \"country_select_modal_country_ky\": \"Islas Caimán\",\n    \"country_select_modal_country_cf\": \"República Centroafricana\",\n    \"country_select_modal_country_td\": \"Chad\",\n    \"country_select_modal_country_cl\": \"Chile\",\n    \"country_select_modal_country_cn\": \"China\",\n    \"country_select_modal_country_cx\": \"Isla Christmas\",\n    \"country_select_modal_country_cc\": \"Islas Cocos\",\n    \"country_select_modal_country_co\": \"Colombia\",\n    \"country_select_modal_country_km\": \"Comoras\",\n    \"country_select_modal_country_cg\": \"República del Congo\",\n    \"country_select_modal_country_cd\": \"República Democrática del Congo\",\n    \"country_select_modal_country_ck\": \"Islas Cook\",\n    \"country_select_modal_country_cr\": \"Costa Rica\",\n    \"country_select_modal_country_ci\": \"Costa de Marfil\",\n    \"country_select_modal_country_hr\": \"Croacia\",\n    \"country_select_modal_country_cu\": \"Cuba\",\n    \"country_select_modal_country_cw\": \"Curazao\",\n    \"country_select_modal_country_cy\": \"Chipre\",\n    \"country_select_modal_country_cz\": \"República Checa\",\n    \"country_select_modal_country_dk\": \"Dinamarca\",\n    \"country_select_modal_country_dg\": \"Diego García\",\n    \"country_select_modal_country_dj\": \"Yibuti\",\n    \"country_select_modal_country_dm\": \"Dominica\",\n    \"country_select_modal_country_do\": \"República Dominicana\",\n    \"country_select_modal_country_tl\": \"Timor Oriental\",\n    \"country_select_modal_country_ec\": \"Ecuador\",\n    \"country_select_modal_country_eg\": \"Egipto\",\n    \"country_select_modal_country_sv\": \"El Salvador\",\n    \"country_select_modal_country_gq\": \"Guinea Ecuatorial\",\n    \"country_select_modal_country_er\": \"Eritrea\",\n    \"country_select_modal_country_ee\": \"Estonia\",\n    \"country_select_modal_country_et\": \"Etiopía\",\n    \"country_select_modal_country_fk\": \"Islas Malvinas\",\n    \"country_select_modal_country_fo\": \"Islas Feroe\",\n    \"country_select_modal_country_fj\": \"Fiyi\",\n    \"country_select_modal_country_fi\": \"Finlandia\",\n    \"country_select_modal_country_fr\": \"Francia\",\n    \"country_select_modal_country_gf\": \"Guayana Francesa\",\n    \"country_select_modal_country_pf\": \"Polinesia Francesa\",\n    \"country_select_modal_country_ga\": \"Gabón\",\n    \"country_select_modal_country_gm\": \"Gambia\",\n    \"country_select_modal_country_ge\": \"Georgia\",\n    \"country_select_modal_country_de\": \"Alemania\",\n    \"country_select_modal_country_gh\": \"Ghana\",\n    \"country_select_modal_country_gi\": \"Gibraltar\",\n    \"country_select_modal_country_gr\": \"Grecia\",\n    \"country_select_modal_country_gl\": \"Groenlandia\",\n    \"country_select_modal_country_gd\": \"Granada\",\n    \"country_select_modal_country_gp\": \"Guadalupe\",\n    \"country_select_modal_country_gu\": \"Guam\",\n    \"country_select_modal_country_gt\": \"Guatemala\",\n    \"country_select_modal_country_gg\": \"Guernesey\",\n    \"country_select_modal_country_gn\": \"Guinea\",\n    \"country_select_modal_country_gw\": \"Guinea-Bisáu\",\n    \"country_select_modal_country_gy\": \"Guyana\",\n    \"country_select_modal_country_ht\": \"Haití\",\n    \"country_select_modal_country_hn\": \"Honduras\",\n    \"country_select_modal_country_hk\": \"Hong Kong, China\",\n    \"country_select_modal_country_hu\": \"Hungría\",\n    \"country_select_modal_country_is\": \"Islandia\",\n    \"country_select_modal_country_in\": \"India\",\n    \"country_select_modal_country_id\": \"Indonesia\",\n    \"country_select_modal_country_ir\": \"Irán\",\n    \"country_select_modal_country_iq\": \"Irak\",\n    \"country_select_modal_country_ie\": \"Irlanda\",\n    \"country_select_modal_country_il\": \"Israel\",\n    \"country_select_modal_country_it\": \"Italia\",\n    \"country_select_modal_country_jm\": \"Jamaica\",\n    \"country_select_modal_country_sj\": \"Svalbard y Jan Mayen\",\n    \"country_select_modal_country_jp\": \"Japón\",\n    \"country_select_modal_country_je\": \"Jersey\",\n    \"country_select_modal_country_jo\": \"Jordania\",\n    \"country_select_modal_country_kz\": \"Kazajistán\",\n    \"country_select_modal_country_ke\": \"Kenia\",\n    \"country_select_modal_country_ki\": \"Kiribati\",\n    \"country_select_modal_country_kp\": \"Corea del Norte\",\n    \"country_select_modal_country_kr\": \"Corea del Sur\",\n    \"country_select_modal_country_kw\": \"Kuwait\",\n    \"country_select_modal_country_kg\": \"Kirguistán\",\n    \"country_select_modal_country_la\": \"Laos\",\n    \"country_select_modal_country_lv\": \"Letonia\",\n    \"country_select_modal_country_lb\": \"Líbano\",\n    \"country_select_modal_country_ls\": \"Lesoto\",\n    \"country_select_modal_country_lr\": \"Liberia\",\n    \"country_select_modal_country_ly\": \"Libia\",\n    \"country_select_modal_country_li\": \"Liechtenstein\",\n    \"country_select_modal_country_lt\": \"Lituania\",\n    \"country_select_modal_country_lu\": \"Luxemburgo\",\n    \"country_select_modal_country_mo\": \"Macao, China\",\n    \"country_select_modal_country_mk\": \"Macedonia\",\n    \"country_select_modal_country_mg\": \"Madagascar\",\n    \"country_select_modal_country_mw\": \"Malaui\",\n    \"country_select_modal_country_my\": \"Malasia\",\n    \"country_select_modal_country_mv\": \"Maldivas\",\n    \"country_select_modal_country_ml\": \"Mali\",\n    \"country_select_modal_country_mt\": \"Malta\",\n    \"country_select_modal_country_mh\": \"Islas Marshall\",\n    \"country_select_modal_country_mq\": \"Martinica\",\n    \"country_select_modal_country_mr\": \"Mauritania\",\n    \"country_select_modal_country_mu\": \"Mauricio\",\n    \"country_select_modal_country_yt\": \"Mayotte\",\n    \"country_select_modal_country_mx\": \"México\",\n    \"country_select_modal_country_fm\": \"Micronesia\",\n    \"country_select_modal_country_md\": \"Moldavia\",\n    \"country_select_modal_country_mc\": \"Mónaco\",\n    \"country_select_modal_country_mn\": \"Mongolia\",\n    \"country_select_modal_country_me\": \"Montenegro\",\n    \"country_select_modal_country_ms\": \"Montserrat\",\n    \"country_select_modal_country_ma\": \"Marruecos\",\n    \"country_select_modal_country_mz\": \"Mozambique\",\n    \"country_select_modal_country_na\": \"Namibia\",\n    \"country_select_modal_country_nr\": \"Nauru\",\n    \"country_select_modal_country_np\": \"Nepal\",\n    \"country_select_modal_country_nl\": \"Países Bajos\",\n    \"country_select_modal_country_nc\": \"Nueva Caledonia\",\n    \"country_select_modal_country_nz\": \"Nueva Zelanda\",\n    \"country_select_modal_country_ni\": \"Nicaragua\",\n    \"country_select_modal_country_ne\": \"Níger\",\n    \"country_select_modal_country_ng\": \"Nigeria\",\n    \"country_select_modal_country_nu\": \"Niue\",\n    \"country_select_modal_country_nf\": \"Isla Norfolk\",\n    \"country_select_modal_country_mp\": \"Islas Marianas del Norte\",\n    \"country_select_modal_country_no\": \"Noruega\",\n    \"country_select_modal_country_om\": \"Omán\",\n    \"country_select_modal_country_pk\": \"Pakistán\",\n    \"country_select_modal_country_pw\": \"Palaos\",\n    \"country_select_modal_country_ps\": \"Territorios Palestinos\",\n    \"country_select_modal_country_pa\": \"Panamá\",\n    \"country_select_modal_country_pg\": \"Papúa Nueva Guinea\",\n    \"country_select_modal_country_py\": \"Paraguay\",\n    \"country_select_modal_country_pe\": \"Perú\",\n    \"country_select_modal_country_ph\": \"Filipinas\",\n    \"country_select_modal_country_pn\": \"Islas Pitcairn\",\n    \"country_select_modal_country_pl\": \"Polonia\",\n    \"country_select_modal_country_pt\": \"Portugal\",\n    \"country_select_modal_country_pr\": \"Puerto Rico\",\n    \"country_select_modal_country_qa\": \"Qatar\",\n    \"country_select_modal_country_re\": \"Reunión\",\n    \"country_select_modal_country_ro\": \"Rumanía\",\n    \"country_select_modal_country_ru\": \"Rusia\",\n    \"country_select_modal_country_rw\": \"Ruanda\",\n    \"country_select_modal_country_bl\": \"San Bartolomé\",\n    \"country_select_modal_country_sh\": \"Santa Elena\",\n    \"country_select_modal_country_kn\": \"San Cristóbal y Nieves\",\n    \"country_select_modal_country_lc\": \"Santa Lucía\",\n    \"country_select_modal_country_mf\": \"San Martín, Francia\",\n    \"country_select_modal_country_pm\": \"San Pedro y Miquelón\",\n    \"country_select_modal_country_vc\": \"San Vicente y las Granadinas\",\n    \"country_select_modal_country_ws\": \"Samoa\",\n    \"country_select_modal_country_sm\": \"San Marino\",\n    \"country_select_modal_country_st\": \"Santo Tomé y Príncipe\",\n    \"country_select_modal_country_sa\": \"Arabia Saudí\",\n    \"country_select_modal_country_sn\": \"Senegal\",\n    \"country_select_modal_country_rs\": \"Serbia\",\n    \"country_select_modal_country_sc\": \"Seychelles\",\n    \"country_select_modal_country_sl\": \"Sierra Leona\",\n    \"country_select_modal_country_sg\": \"Singapur\",\n    \"country_select_modal_country_nl_bq3\": \"San Eustaquio\",\n    \"country_select_modal_country_sx\": \"San Martín, Países Bajos\",\n    \"country_select_modal_country_sk\": \"Eslovaquia\",\n    \"country_select_modal_country_si\": \"Eslovenia\",\n    \"country_select_modal_country_sb\": \"Islas Salomón\",\n    \"country_select_modal_country_so\": \"Somalia\",\n    \"country_select_modal_country_za\": \"Sudáfrica\",\n    \"country_select_modal_country_gs\": \"Georgia del Sur e Islas Sandwich del Sur\",\n    \"country_select_modal_country_ge_so\": \"Osetia del Sur\",\n    \"country_select_modal_country_ss\": \"Sudán del Sur\",\n    \"country_select_modal_country_es\": \"España\",\n    \"country_select_modal_country_lk\": \"Sri Lanka\",\n    \"country_select_modal_country_sd\": \"Sudán\",\n    \"country_select_modal_country_sr\": \"Surinam\",\n    \"country_select_modal_country_sj_no\": \"Svalbard\",\n    \"country_select_modal_country_sz\": \"Suazilandia\",\n    \"country_select_modal_country_se\": \"Suecia\",\n    \"country_select_modal_country_ch\": \"Suiza\",\n    \"country_select_modal_country_sy\": \"Siria\",\n    \"country_select_modal_country_tw\": \"Taiwán\",\n    \"country_select_modal_country_tj\": \"Tayikistán\",\n    \"country_select_modal_country_tz\": \"Tanzania\",\n    \"country_select_modal_country_th\": \"Tailandia\",\n    \"country_select_modal_country_tg\": \"Togo\",\n    \"country_select_modal_country_tk\": \"Tokelau\",\n    \"country_select_modal_country_to\": \"Tonga\",\n    \"country_select_modal_country_tt\": \"Trinidad y Tobago\",\n    \"country_select_modal_country_tn\": \"Túnez\",\n    \"country_select_modal_country_tr\": \"Turquía\",\n    \"country_select_modal_country_tm\": \"Turkmenistán\",\n    \"country_select_modal_country_tc\": \"Islas Turcas y Caicos\",\n    \"country_select_modal_country_tv\": \"Tuvalu\",\n    \"country_select_modal_country_ug\": \"Uganda\",\n    \"country_select_modal_country_ua\": \"Ucrania\",\n    \"country_select_modal_country_ae\": \"Emiratos Árabes Unidos\",\n    \"country_select_modal_country_uk\": \"Reino Unido\",\n    \"country_select_modal_country_us\": \"Estados Unidos\",\n    \"country_select_modal_country_uy\": \"Uruguay\",\n    \"country_select_modal_country_vi\": \"Islas Vírgenes de EE. UU.\",\n    \"country_select_modal_country_uz\": \"Uzbekistán\",\n    \"country_select_modal_country_vu\": \"Vanuatu\",\n    \"country_select_modal_country_ve\": \"Venezuela\",\n    \"country_select_modal_country_va\": \"Ciudad del Vaticano\",\n    \"country_select_modal_country_vn\": \"Vietnam\",\n    \"country_select_modal_country_wf\": \"Wallis y Futuna\",\n    \"country_select_modal_country_ye\": \"Yemen\",\n    \"country_select_modal_country_zm\": \"Zambia\",\n    \"country_select_modal_country_tz_uk\": \"Zanzíbar\",\n    \"country_select_modal_country_zw\": \"Zimbabue\"\n}"
  },
  {
    "path": "app/js/locales/it-it.json",
    "content": "{\n    \"modal_search\": \"Cerca\",\n    \"modal_close\": \"Chiudi\",\n    \"modal_edit\": \"Modifica\",\n    \"modal_cancel\": \"Annulla\",\n    \"modal_more\": \"Altro...\",\n    \"modal_next\": \"Avanti\",\n    \"modal_ok\": \"OK\",\n    \"modal_done\": \"Fatto\",\n    \"group_modal_info\": \"Info gruppo\",\n    \"group_modal_pluralize_participants\": \"{'0': 'Nessun membro', 'one': '1 membro', 'other': '{} membri'}\",\n    \"group_modal_pluralize_online_participants\": \"{'one': '1 in linea', 'other': '{} in linea'}\",\n    \"group_modal_pluralize_subscribers\": \"{'0': 'Nessun iscritto', 'one': '1 iscritto', 'other': '{} iscritti'}\",\n    \"group_modal_participants\": \"{total}, {online}\",\n    \"group_modal_add_member\": \"Aggiungi membro\",\n    \"group_modal_return\": \"Ritorna nel gruppo\",\n    \"group_modal_update_photo\": \"Aggiorna foto\",\n    \"group_modal_update_active\": \"Aggiorno\",\n    \"group_modal_menu_more\": \"Altro\",\n    \"group_modal_menu_delete_photo\": \"Elimina foto\",\n    \"group_modal_menu_edit_group\": \"Modifica gruppo\",\n    \"group_modal_menu_leave\": \"Lascia\",\n    \"group_modal_menu_delete_group\": \"Elimina ed esci\",\n    \"group_modal_menu_clear_history\": \"Cancella cronologia\",\n    \"group_modal_delete_group\": \"Elimina gruppo\",\n    \"group_modal_join\": \"Unisciti al gruppo\",\n    \"group_modal_settings\": \"Impostazioni\",\n    \"group_modal_notifications\": \"Notifiche\",\n    \"group_modal_menu_share_link\": \"Invita nel gruppo tramite link\",\n    \"group_modal_migrate_to_supergroup\": \"Aggiorna a supergruppo\",\n    \"group_modal_members\": \"Membri\",\n    \"group_modal_members_kick\": \"Rimuovi\",\n    \"group_modal_migrate_header\": \"Limite membri raggiunto\",\n    \"group_modal_migrate_desc\": \"Per superare il limite e avere ulteriori funzioni, aggiorna a un supergruppo:\",\n    \"group_modal_migrate_item1\": \"I supergruppi hanno massimo 1000 membri\",\n    \"group_modal_migrate_item2\": \"I nuovi membri vedono tutta la cronologia\",\n    \"group_modal_migrate_item3\": \"Gli admin eliminano i messaggi per tutti\",\n    \"group_modal_migrate_item4\": \"Le notifiche sono disattivate di default\",\n    \"channel_modal_info\": \"Info canale\",\n    \"channel_modal_description\": \"Descrizione\",\n    \"channel_modal_share_link\": \"Condividi link\",\n    \"channel_modal_share_loading\": \"Carico{dots}\",\n    \"channel_modal_menu_edit\": \"Modifica canale\",\n    \"channel_modal_join\": \"Unisciti al canale\",\n    \"channel_modal_add_member\": \"Invita membri\",\n    \"channel_modal_leave_channel\": \"Lascia il canale\",\n    \"channel_modal_delete_channel\": \"Elimina canale\",\n    \"country_select_modal_title\": \"Nazione\",\n    \"settings_modal_title\": \"Impostazioni\",\n    \"settings_modal_menu_more\": \"Altro\",\n    \"settings_modal_delete_photo\": \"Elimina foto profilo\",\n    \"settings_modal_set_photo\": \"Imposta foto profilo\",\n    \"settings_modal_photo_updating\": \"Aggiorno\",\n    \"settings_modal_edit_profile\": \"Modifica profilo\",\n    \"settings_modal_edit_username\": \"Cambia username\",\n    \"settings_modal_empty_username_set\": \"Imposta username\",\n    \"settings_modal_terminate_sessions\": \"Termina le altre sessioni\",\n    \"settings_modal_active_sessions\": \"Sessioni attive\",\n    \"settings_modal_settings\": \"Impostazioni\",\n    \"settings_modal_notification_alert\": \"Avvisi di notifica\",\n    \"settings_modal_notification_push\": \"Notifiche push\",\n    \"settings_modal_vibrate\": \"Vibra\",\n    \"settings_modal_sounds\": \"Suoni\",\n    \"settings_modal_language\": \"Lingua\",\n    \"settings_modal_notifications\": \"Notifiche desktop\",\n    \"settings_modal_pushes\": \"Notifiche in background\",\n    \"settings_modal_message_preview\": \"Anteprima messaggio\",\n    \"settings_modal_sound\": \"Suono\",\n    \"settings_modal_enter_send_description_md\": \"**Invio** - invia messaggio, **Shift + Invio** - a capo\",\n    \"settings_modal_ctrl_enter_send_description_md\": \"**Ctrl + Invio** - invia messaggio, **Invio** - a capo\",\n    \"settings_modal_send_on_enter\": \"Invia con tasto invio\",\n    \"settings_switch_back_to_desktop\": \"Torna alla modalità desktop\",\n    \"settings_modal_about\": \"Info\",\n    \"settings_modal_source_code_github\": \"Codice sorgente su GitHub\",\n    \"settings_modal_follow_us_twitter\": \"Seguici su Twitter!\",\n    \"settings_modal_recent_updates\": \"Nuovi aggiornamenti (ver. {version})\",\n    \"settings_modal_set_password\": \"Imposta password aggiuntiva\",\n    \"settings_modal_change_password\": \"Cambia password\",\n    \"settings_modal_disable_password\": \"Disattiva\",\n    \"settings_modal_disable_password_mobile\": \"Disattiva password\",\n    \"settings_modal_password_email_pending\": \"Premi sul link in {email} per completare la configurazione della verifica in due passaggi.\",\n    \"settings_modal_password_email_pending_cancel\": \"Annulla\",\n    \"settings_modal_password_email_pending_cancel_mobile\": \"Annulla password\",\n    \"settings_modal_show_sensitive_content\": \"Visualizza contenuti sensibili\",\n    \"password_delete_title\": \"Disattiva password\",\n    \"password_change_title\": \"Verifica in due passaggi\",\n    \"password_current_placeholder\": \"Inserisci la password corrente\",\n    \"password_create_placeholder\": \"Inserisci una password\",\n    \"password_new_placeholder\": \"Inserisci la nuova password\",\n    \"password_confirm_placeholder\": \"Reinserisci la nuova password\",\n    \"password_hint_placeholder\": \"Inserisci il suggerimento per la password\",\n    \"password_email_placeholder\": \"Imposta e-mail di recupero\",\n    \"password_create_description\": \"La password sarà richiesta quando ti connetti da un nuovo dispositivo insieme al codice.\",\n    \"password_create_active\": \"Salvo...\",\n    \"password_create_submit\": \"Salva\",\n    \"password_delete_active\": \"Eliminazione...\",\n    \"password_delete_submit\": \"Elimina password\",\n    \"sessions_modal_title\": \"Sessioni attive\",\n    \"sessions_modal_loading\": \"Carico{dots}\",\n    \"sessions_modal_current_session\": \"Sessione corrente\",\n    \"sessions_modal_session_online\": \"in linea\",\n    \"sessions_modal_terminate_one\": \"Termina\",\n    \"sessions_modal_terminate_all\": \"Termina tutte le altre sessioni\",\n    \"sessions_modal_active_sessions\": \"Sessioni attive\",\n    \"stickerset_modal_title_loading\": \"Set di sticker\",\n    \"stickerset_modal_install\": \"Aggiungi sticker\",\n    \"stickerset_modal_uninstall\": \"Rimuovi sticker\",\n    \"stickerset_modal_share\": \"Condividi\",\n    \"stickerset_modal_loading\": \"Carico{dots}\",\n    \"page_title_pluralize_notifications\": \"{'0': 'Nessuna notifica', 'one': '1 notifica' , 'other' : '{} notifiche' }\",\n    \"profile_edit_modal_title\": \"Modifica profilo\",\n    \"profile_edit_first_name\": \"Nome\",\n    \"profile_edit_last_name\": \"Cognome\",\n    \"profile_edit_submit\": \"Salva\",\n    \"profile_edit_submit_active\": \"Salvo...\",\n    \"username_edit_modal_title\": \"Cambia username\",\n    \"username_edit_placeholder\": \"Username\",\n    \"username_edit_description_md\": \"Puoi scegliere un username  su **Telegram**. Se lo fai, le altre persone potranno trovarti tramite questo username e contattarti senza conoscere il tuo numero di telefono.\\n\\nPuoi usare i caratteri a-z, 0-9 e l'underscore. La lunghezza minima è 5 caratteri.\",\n    \"username_edit_submit\": \"Salva\",\n    \"username_edit_submit_active\": \"Salvo...\",\n    \"user_modal_menu_more\": \"Altro\",\n    \"user_modal_send_message\": \"Invia messaggio\",\n    \"user_modal_edit_contact\": \"Modifica contatto\",\n    \"user_modal_delete_contact\": \"Elimina contatto\",\n    \"user_modal_add_contact\": \"Aggiungi ai contatti\",\n    \"user_modal_share_contact\": \"Condividi contatto\",\n    \"user_modal_block_user\": \"Blocca utente\",\n    \"user_modal_unblock_user\": \"Sblocca utente\",\n    \"user_modal_clear_history\": \"Cancella cronologia\",\n    \"user_modal_delete_chat\": \"Elimina chat\",\n    \"user_modal_add_to_group\": \"Aggiungi a un gruppo\",\n    \"user_modal_info\": \"Info\",\n    \"user_modal_phone\": \"Telefono\",\n    \"user_modal_about\": \"Info\",\n    \"user_modal_bot_settings\": \"Impostazioni\",\n    \"user_modal_bot_help\": \"Aiuto\",\n    \"user_modal_username\": \"Username\",\n    \"user_modal_settings\": \"Impostazioni\",\n    \"user_modal_notifications\": \"Notifiche\",\n    \"user_modal_contact_info\": \"Info contatto\",\n    \"media_modal_photo\": \"Foto\",\n    \"media_modal_photo_index\": \"Foto {pos} di {count}\",\n    \"media_modal_video\": \"Video\",\n    \"media_modal_forward\": \"Inoltra\",\n    \"media_modal_download\": \"Scarica\",\n    \"media_modal_delete\": \"Elimina\",\n    \"game_modal_share_game\": \"Condividi gioco\",\n    \"game_modal_share_score\": \"Condividi punteggio\",\n    \"error_browser_no_local_file_system_image_md\": \"Il tuo browser non supporta la funzione {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem} necessaria per visualizzare questa immagine.\\nPer favore, installa {chrome-link: http://google.com/chrome | Google Chrome} o invece usa {telegram-link: https://telegram.org/ | l'app mobile}.\",\n    \"error_image_download_failed\": \"Download fallito\",\n    \"error_browser_no_local_file_system_video_md\": \"Il tuo browser non supporta la funzione {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem} necessaria per riprodurre il filmato.\\nPer favore, installa {chrome-link: http://google.com/chrome | Google Chrome} o invece usa {telegram-link: https://telegram.org/ | l'app mobile}.\",\n    \"error_video_download_failed\": \"Download video fallito\",\n    \"unread_messages_split\": \"Messaggi non letti\",\n    \"user_name_deleted\": \"ELIMINATO\",\n    \"user_first_name_deleted\": \"ELIMINATO\",\n    \"user_name_saved_msgs\": \"Messaggi salvati\",\n    \"user_status_online\": \"in linea\",\n    \"user_status_last_seen\": \"ultimo accesso {0}\",\n    \"user_status_recently\": \"ultimo accesso di recente\",\n    \"user_status_last_week\": \"ultimo accesso entro una settimana\",\n    \"user_status_last_month\": \"ultimo accesso entro un mese\",\n    \"user_status_long_ago\": \"ultimo accesso molto tempo fa\",\n    \"user_status_bot\": \"bot\",\n    \"user_status_service_notifications\": \"notifiche di servizio\",\n    \"user_status_support\": \"assistenza\",\n    \"user_status_bot_noprivacy\": \"ha accesso ai messaggi\",\n    \"user_status_bot_privacy\": \"non ha accesso ai messaggi\",\n    \"chat_title_deleted\": \"ELIMINATO\",\n    \"format_size_progress_mulitple\": \"{done} su {total} {parts}\",\n    \"format_size_progress\": \"{done} su {total}\",\n    \"relative_time_pluralize_minutes_ago\": \"{'one' : '1 minuto fa', 'other' : '{} minuti fa'}\",\n    \"relative_time_pluralize_hours_ago\": \"{'one' : '1 ora fa', 'other' : '{} ore fa'}\",\n    \"relative_time_just_now\": \"adesso\",\n    \"changelog_modal_header_recent_updates_md\": \"Aggiornamenti recenti di **Telegram Web**\",\n    \"changelog_modal_header_new_updates_md\": \"**Telegram Web** è stato aggiornato!\",\n    \"changelog_modal_title_current_version\": \"versione corrente\",\n    \"changelog_modal_full_description_md\": \"App ufficiale basata sulle API di Telegram per velocità e sicurezza.\\n\\nQuesto software è sotto licenza GNU GPL versione 3.\",\n    \"changelog_modal_changelog_link\": \"Novità\",\n    \"changelog_app_version\": \"Versione {version}\",\n    \"group_create_contacts_modal_title\": \"Nuovo gruppo\",\n    \"group_create_modal_title\": \"Crea gruppo\",\n    \"group_create_name\": \"Nome del gruppo\",\n    \"group_create_submit\": \"Crea gruppo\",\n    \"group_create_submit_active\": \"Creo...\",\n    \"group_edit_modal_title\": \"Modifica gruppo\",\n    \"group_edit_name\": \"Nome del gruppo\",\n    \"group_edit_about\": \"Descrizione gruppo\",\n    \"group_edit_submit\": \"Salva\",\n    \"group_edit_submit_active\": \"Salvo...\",\n    \"channel_edit_modal_title\": \"Modifica canale\",\n    \"channel_edit_name\": \"Nome del canale\",\n    \"channel_edit_about\": \"Descrizione canale\",\n    \"channel_edit_submit\": \"Salva\",\n    \"channel_edit_submit_active\": \"Salvo...\",\n    \"group_invite_link_modal_title\": \"Link d'invito\",\n    \"group_invite_link_link_label\": \"Copia link\",\n    \"group_invite_link_loading\": \"Carico...\",\n    \"group_invite_revoke_active\": \"Revoco...\",\n    \"group_invite_revoke\": \"Revoca\",\n    \"report_reason_modal_title\": \"Segnala\",\n    \"report_reason_modal_spam\": \"Spam\",\n    \"report_reason_modal_violence\": \"Violenza\",\n    \"report_reason_modal_pornography\": \"Pornografia\",\n    \"report_reason_modal_childabuse\": \"Abuso minorile\",\n    \"report_reason_modal_other\": \"Altro\",\n    \"report_reason_modal_other_placeholder\": \"Descrizione\",\n    \"report_reason_modal_submit_btn\": \"Invia\",\n    \"clipboard_copied\": \"Copiato!\",\n    \"clipboard_press_ctrl_c\": \"Premi Ctrl+C per copiare\",\n    \"clipboard_press_cmd_c\": \"Premi ⌘+C per copiare\",\n    \"confirm_modal_logout\": \"Sei sicuro di voler uscire?\",\n    \"confirm_modal_update_reload\": \"Una nuova versione di Telegram Web è stata scaricata. Vuoi avviarla?\",\n    \"confirm_modal_history_flush\": \"Sei sicuro? L'operazione non può essere annullata!\",\n    \"confirm_modal_history_leave_flush_md\": \"Sei sicuro di voler eliminare tutta la cronologia dei messaggi e lasciare il gruppo?\\n\\nQuesta azione non può essere annullata.\",\n    \"confirm_modal_leave_channel_md\": \"Sei sicuro di voler lasciare questo canale?\\n\\nQuesta azione non può essere annullata.\",\n    \"confirm_modal_leave_group_md\": \"Sei sicuro di voler lasciare questo gruppo?\\n\\nQuesta azione non può essere annullata.\",\n    \"confirm_modal_terminate_sessions\": \"Vuoi davvero uscire da tutti i dispositivi tranne questo?\",\n    \"confirm_modal_terminate_session\": \"Sei sicuro di voler uscire da questo dispositivo?\",\n    \"confirm_modal_clipboard_file_send\": \"Sei sicuro di inviare il(i) file presenti negli appunti?\",\n    \"confirm_modal_clipboard_X_files_send\": \"{'one': 'Sei sicuro di inviare il file dagli appunti?', 'other': 'Sei sicuro di inviare {} file dagli appunti?'}\",\n    \"confirm_modal_message_delete\": \"Sei sicuro di voler eliminare il messaggio?\",\n    \"confirm_modal_delete_X_messages\": \"{'one': '{} messaggio', 'other': '{} messaggi'}\",\n    \"confirm_modal_delete_messages\": \"Sei sicuro di voler eliminare {messaggi}?\",\n    \"confirm_modal_message_revoke\": \"Elimina per {recipient}\",\n    \"confirm_modal_message_revoke_recipient_chat\": \"tutti\",\n    \"confirm_modal_delete_messages_for_everyone_chat\": \"Questo eliminerà i messaggi per chiunque in questa chat.\",\n    \"confirm_modal_delete_messages_for_you_only_pm\": \"Questo eliminerà i messaggi solo per te, non per {user}.\",\n    \"confirm_modal_delete_messages_for_you_only_chat\": \"Questo eliminerà i messaggi solo per te, non per gli altri membri della chat.\",\n    \"confirm_modal_photo_delete\": \"Sei sicuro di voler eliminare la foto?\",\n    \"confirm_modal_contacts_import\": \"Telegram sincronizzerà ora i tuoi contatti per cercare i tuoi amici.\",\n    \"confirm_modal_login_phone_correct\": \"Il tuo numero di telefono è giusto?\",\n    \"confirm_modal_forward_to_peer\": \"Inoltra a {peer}?\",\n    \"confirm_modal_forward_to_peer_success\": \"Il messaggio è stato inoltrato con successo.\",\n    \"confirm_modal_report_success\": \"Segnalazione inviata\",\n    \"confirm_modal_send_to_peer\": \"Inviare a {peer}?\",\n    \"confirm_modal_share_file_peer\": \"Condividere con {peer}?\",\n    \"confirm_modal_invite_peer\": \"Invitare in {peer}?\",\n    \"confirm_modal_share_game\": \"Condividere il gioco con {peer}?\",\n    \"confirm_modal_apply_lang_with_reload_md\": \"Riavviare l'app per impostare la lingua?\",\n    \"confirm_modal_migrate_to_https_md\": \"Telegram Web supporta un ulteriore tipo di crittografia SSL. Vuoi passare alla versione HTTPS?\\nLa versione HTTP sarà disabilitata presto.\",\n    \"confirm_modal_resize_desktop_md\": \"Vuoi passare alla modalità desktop?\",\n    \"confirm_modal_resize_mobile_md\": \"Vuoi passare alla modalità mobile?\",\n    \"confirm_modal_recovery_email_empty_md\": \"Attenzione! Sei sicuro di non voler aggiungere un'e-mail di recupero?\\n\\nSe dimentichi la tua password, perderai l'accesso al tuo account Telegram\",\n    \"confirm_modal_abort_password_setup\": \"Annullare la configurazione della verifica in due passaggi?\",\n    \"confirm_modal_reset_account_md\": \"Sei sicuro?\\nQuesta azione non può essere annullata.\\n\\n\\nPerderai tutte le chat e i messaggi, insieme ai media e ai file condivisi, se continui nel resettare il tuo account.\",\n    \"confirm_modal_join_group_link\": \"Vuoi unirti al gruppo «{title}»?\",\n    \"confirm_modal_join_channel_link\": \"Vuoi unirti al canale «{title}»?\",\n    \"confirm_modal_revoke_group_link\": \"Sei sicuro di voler revocare questo link? Una volta fatto, nessuno potrà unirsi al gruppo utilizzandolo.\",\n    \"confirm_modal_revoke_channel_link\": \"Sei sicuro di voler revocare questo link? Una volta fatto, nessuno potrà unirsi al canale utilizzandolo.\",\n    \"confirm_modal_delete_channel_md\": \"Sei sicuro di voler eliminare questo canale?\\n\\nTutti i membri saranno rimossi e tutti i messaggi verranno persi.\",\n    \"confirm_modal_delete_group_md\": \"Sei sicuro di voler eliminare questo gruppo?\\n\\nTutti i membri saranno rimossi e tutti i messaggi verranno persi.\",\n    \"confirm_modal_jump_ext_url_md\": \"Aprire questo link?\\n\\n{url}\",\n    \"confirm_modal_migrate_supergroup_md\": \"Per favore nota che i membri del gruppo dovranno aggiornare Telegram all'ultima versione per vedere il tuo supergruppo.\\n\\nSei sicuro di voler aggiornare questo gruppo?\",\n    \"confirm_modal_bot_access_phone\": \"Il bot saprà il tuo numero di telefono. Questo può essere utile per l'integrazione con altri servizi.\",\n    \"confirm_modal_bot_access_geo\": \"Questo invierà la tua posizione corrente al bot.\",\n    \"confirm_modal_bot_access_geo_inline\": \"Questo bot vorrebbe sapere la tua posizione ogni volta che invii una richiesta. Questo può essere usato per fornire risultati specifici per la posizione.\",\n    \"confirm_modal_content_settings_sensitive_md\": \"**Disattiva filtro**\\nSe disattivi il ​​filtro, Telegram mostrerà i media sensibili nei canali pubblici su tutti i tuoi dispositivi collegati.\",\n    \"confirm_modal_content_settings_sensitive_submit\": \"Disattiva\",\n    \"confirm_modal_are_u_sure\": \"Sei sicuro?\",\n    \"confirm_modal_logout_submit\": \"Esci\",\n    \"confirm_modal_clear_history_submit\": \"Cancella cronologia\",\n    \"confirm_modal_leave_chat_submit\": \"Lascia\",\n    \"confirm_modal_delete_chat_submit\": \"Elimina chat\",\n    \"confirm_modal_clipboard_files_send_submit\": \"Invia\",\n    \"confirm_modal_clipboard_file_send_submit\": \"Invia\",\n    \"confirm_modal_message_delete_submit\": \"Elimina\",\n    \"confirm_modal_messages_delete_submit\": \"Elimina\",\n    \"confirm_modal_photo_delete_submit\": \"Elimina\",\n    \"confirm_modal_forward_message_submit\": \"Inoltra messaggi\",\n    \"confirm_modal_share_photo_submit\": \"Inoltra foto\",\n    \"confirm_modal_share_video_submit\": \"Inoltra video\",\n    \"confirm_modal_share_contact_submit\": \"Invia contatto\",\n    \"confirm_modal_share_file_submit\": \"Condividi file\",\n    \"confirm_modal_reset_account_submit\": \"Ripristina il mio account\",\n    \"contacts_modal_edit_list\": \"Modifica\",\n    \"contacts_modal_edit_cancel\": \"Annulla\",\n    \"contacts_modal_edit_delete\": \"Elimina\",\n    \"contacts_modal_pluralize_new_group_members\": \"{'one': '1 membro', 'other': '{} membri'}\",\n    \"contacts_modal_title\": \"Contatti\",\n    \"contacts_modal_new_contact\": \"Nuovo contatto\",\n    \"contacts_modal_empty_list\": \"La tua rubrica è vuota. Puoi {import-link: aggiungere un nuovo contatto} tramite numero di telefono.\",\n    \"conversations_modal_forward_title\": \"Inoltra\",\n    \"conversations_modal_forward_submit\": \"Inoltra\",\n    \"conversations_modal_select_recipients\": \"Scegli destinatari\",\n    \"conversations_modal_recipients\": \"Destinatari:\",\n    \"conversations_modal_share_url_loading\": \"Carico{dots}\",\n    \"conversations_modal_share_url_copy\": \"Clicca per copiare il link\",\n    \"contact_edit_modal_first_name\": \"Nome\",\n    \"contact_edit_modal_last_name\": \"Cognome\",\n    \"contact_edit_modal_title\": \"Modifica contatto\",\n    \"contact_edit_modal_submit\": \"Salva\",\n    \"contact_edit_modal_submit_active\": \"Salvo...\",\n    \"contact_import_modal_title\": \"Aggiungi nuovo contatto\",\n    \"contact_import_modal_phone\": \"Numero di telefono\",\n    \"contact_import_modal_phonebook\": \"Rubrica\",\n    \"contact_import_modal_submit\": \"Salva\",\n    \"contact_import_modal_submit_active\": \"Importo...\",\n    \"conversation_you\": \"Tu\",\n    \"conversation_draft\": \"Bozza:\",\n    \"conversation_media_photo\": \"Foto\",\n    \"conversation_media_video\": \"Video\",\n    \"conversation_media_round\": \"Videomessaggio\",\n    \"conversation_media_document\": \"File\",\n    \"conversation_media_sticker\": \"Sticker\",\n    \"conversation_media_gif\": \"GIF\",\n    \"conversation_media_audio\": \"Audio\",\n    \"conversation_media_location\": \"Posizione\",\n    \"conversation_media_contact\": \"Contatto\",\n    \"conversation_media_attachment\": \"Allegato\",\n    \"conversation_media_unsupported\": \"Allegato non supportato\",\n    \"conversation_search_peer\": \"Cerca in questa chat\",\n    \"conversation_group_created\": \"ha creato il gruppo\",\n    \"conversation_group_renamed\": \"ha cambiato il nome del gruppo\",\n    \"conversation_group_photo_updated\": \"ha cambiato la foto del gruppo\",\n    \"conversation_group_photo_removed\": \"ha eliminato la foto del gruppo\",\n    \"conversation_returned_to_group\": \"è tornato nel gruppo\",\n    \"conversation_joined_group\": \"si è unito al gruppo\",\n    \"conversation_invited_user\": \"ha invitato {user}\",\n    \"conversation_invited_users\": \"{'one': 'ha invitato {} utente', 'other': 'ha invitato {} utenti'}\",\n    \"conversation_left_group\": \"ha lasciato il gruppo\",\n    \"conversation_kicked_user\": \"ha rimosso {user}\",\n    \"conversation_invited_user_message\": \"ha invitato un utente\",\n    \"conversation_kicked_user_message\": \"ha rimosso un membro\",\n    \"conversation_joined_by_link\": \"si è unito al gruppo\",\n    \"conversation_converted_to_supergroup\": \"ha aggiornato a supergruppo\",\n    \"conversation_created_channel\": \"Canale creato\",\n    \"conversation_changed_channel_name\": \"Canale rinominato\",\n    \"conversation_changed_channel_photo\": \"Foto del canale aggiornata\",\n    \"conversation_removed_channel_photo\": \"Foto del canale rimossa\",\n    \"conversation_pinned_message\": \"ha fissato un messaggio\",\n    \"conversation_scored_X\": \"{'one': 'ha totalizzato {} punto', 'other': 'ha totalizzato {} punti'}\",\n    \"conversation_message_sent\": \"ti ha inviato un messaggio\",\n    \"conversation_forwarded_X_messages\": \"{'one': '{} messaggio inoltrato', 'other': '{} messaggi inoltrati'}\",\n    \"conversation_unknown_user\": \"Qualcuno\",\n    \"conversation_unknown_chat\": \"Chat sconosciuta\",\n    \"message_service_created_group\": \"ha creato il gruppo {group-name}\",\n    \"message_service_changed_group_name\": \"ha cambiato il nome del gruppo in {group-name}\",\n    \"message_service_changed_group_photo\": \"ha cambiato la foto del gruppo\",\n    \"message_service_removed_group_photo\": \"ha eliminato la foto del gruppo\",\n    \"message_service_invited_user\": \"ha invitato {user}\",\n    \"message_service_invited_users\": \"ha invitato {user} e altri {num-more} \",\n    \"message_service_returned_to_group\": \"è tornato nel gruppo\",\n    \"message_service_kicked_user\": \"ha rimosso {user}\",\n    \"message_service_left_group\": \"ha lasciato il gruppo\",\n    \"message_service_joined_by_link\": \"si è unito al gruppo tramite link d'invito\",\n    \"message_service_joined\": \"si è unito al gruppo\",\n    \"message_service_pinned_message\": \"ha fissato «{message}»\",\n    \"message_service_phonecall_incoming\": \"Chiamata in entrata\",\n    \"message_service_phonecall_outgoing\": \"Chiamata in uscita\",\n    \"message_service_phonecall_missed\": \"Chiamata persa\",\n    \"message_service_phonecall_canceled\": \"Chiamata annullata\",\n    \"message_service_phonecall\": \"Durata chiamata {duration}\",\n    \"message_service_scored_game\": \"{scored} a {message}\",\n    \"message_service_unsupported_action\": \"azione non supportata {action}\",\n    \"message_service_bot_intro_header\": \"Cosa può fare questo bot?\",\n    \"message_service_converted_to_supergroup\": \"ha aggiornato il gruppo a supergruppo\",\n    \"message_service_created_channel\": \"Canale creato\",\n    \"message_service_changed_channel_name\": \"Canale rinominato in {channel-name}\",\n    \"message_service_changed_channel_photo\": \"Foto del canale aggiornata\",\n    \"message_service_removed_channel_photo\": \"Foto del canale rimossa\",\n    \"message_service_scored_X\": \"{'one': 'ha totalizzato {} punto', 'other': 'ha totalizzato {} punti'}\",\n    \"message_service_payment_sent\": \"Pagamento inviato\",\n    \"message_service_screenshot_taken\": \"ha fatto uno screenshot!\",\n    \"message_admin_badge\": \"amministratore\",\n    \"message_action_reply\": \"Rispondi\",\n    \"message_action_edit\": \"Modifica\",\n    \"message_action_delete\": \"Elimina\",\n    \"message_action_report\": \"Segnala\",\n    \"message_action_forward\": \"Inoltra\",\n    \"message_action_select\": \"Seleziona\",\n    \"message_action_cancel\": \"Annulla\",\n    \"message_action_retry\": \"Riprova\",\n    \"error_modal_warning_title\": \"Attenzione\",\n    \"error_modal_bad_request_title\": \"Errore\",\n    \"error_modal_unauthorized_title\": \"Non autorizzato\",\n    \"error_modal_forbidden_title\": \"Accesso negato\",\n    \"error_modal_not_found_title\": \"Non trovato\",\n    \"error_modal_network_title\": \"Errore di rete\",\n    \"error_modal_flood_title\": \"Troppo veloce\",\n    \"error_modal_internal_title\": \"Errore server\",\n    \"error_modal_alert\": \"Attenzione\",\n    \"error_modal_email_unconfirmed_title\": \"Ci siamo quasi!\",\n    \"error_modal_email_unconfirmed_descripion\": \"Per favore controlla la tua e-mail (anche lo spam) per completare la configurazione della verifica in due passaggi.\",\n    \"error_modal_password_success_title\": \"Fatto!\",\n    \"error_modal_password_disabled_title\": \"Password disattivata\",\n    \"error_modal_media_not_supported_title\": \"Media non supportato\",\n    \"error_modal_phonecalls_not_supported_title\": \"Le chiamate non sono ancora disponibili\",\n    \"error_modal_recovery_na_title\": \"Spiacenti\",\n    \"error_modal_network_description\": \"Per favore controlla la tua connessione a internet.\",\n    \"error_modal_firstname_invali_description\": \"Il nome che hai inserito non è valido.\",\n    \"error_modal_lastname_invalid_description\": \"Il cognome che hai inserito non è valido.\",\n    \"error_modal_phone_invalid_description\": \"Il numero di telefono che hai inserito non è valido.\",\n    \"error_modal_users_too_much_description\": \"Troppi membri nel gruppo.\",\n    \"error_modal_photo_dimensions_invalid_description\": \"Le  dimensioni della foto non sono valide, seleziona un altro file.\",\n    \"error_modal_video_file_invalid_description\": \"L'estensione del file video non è valida o non è supportata, per favore selezione un altro file.\",\n    \"error_modal_photo_too_small_description\": \"La foto che hai fornito è troppo piccola\",\n    \"error_modal_no_phone_user_description_md\": \"Spiacenti, non c'è alcun account **Telegram** associato al numero che hai fornito.\",\n    \"error_modal_no_phone_users_description_md\": \"Spiacenti, non c'è alcun account **Telegram** associato al numero che hai fornito.\",\n    \"error_modal_username_invalid_description\": \"Spiacenti, questo username non è consentito.\",\n    \"error_modal_phonebook_required_description\": \"Telegram ha bisogno di accedere alla tua rubrica per importare i contatti.\",\n    \"error_modal_username_occupied_description\": \"Spiacenti, questo username è già stato preso.\",\n    \"error_modal_media_not_supported_description\": \"Il tuo browser non può riprodurre questo file. Prova a scaricarlo e ad aprirlo in un player esterno.\",\n    \"error_modal_username_not_found_description\": \"Non esiste alcun account Telegram con l'username che hai fornito.\",\n    \"error_modal_phonecalls_not_supported_description_md\": \"Sfortunatamente le chiamate non sono ancora supportate nell'app Web al momento.\\n\\nPuoi chiamare {user} usando le nostre app mobile o le app native per computer.\\n{download-link: Scarica »}\",\n    \"error_modal_app_signup_forbidden_md\": \"Se non hai ancora un account Telegram, per favore **iscriviti** prima da {signup-link: Android / iPhone}.\",\n    \"error_modal_bad_request_description\": \"Un parametro è mancante o errato.\",\n    \"error_modal_unauthorized_description\": \"L'azione necessita dell'autorizzazione d'accesso. Per favore {login-link: accedi}.\",\n    \"error_modal_forbidden_description\": \"Non sei autorizzato a questa operazione.\",\n    \"error_modal_not_found_description\": \"La pagina non è stata trovata.\",\n    \"error_modal_flood_description\": \"Stai effettuando troppe operazioni. Si prega di riprovare più tardi.\",\n    \"error_modal_internal_description\": \"Si è verificato un errore interno al server. Si prega di riprovare più tardi.\",\n    \"error_modal_tech_details\": \"Clicca per i dettagli tecnici\",\n    \"error_modal_recovery_na_description\": \"Siccome non hai fornito un'email di recupero quando hai impostato la  tua password, non ti resta che ricordarti la password o ripristinare il tuo account.\",\n    \"error_modal_password_success_descripion\": \"La password per la verifica in due passaggi è ora attiva.\",\n    \"error_modal_password_disabled_descripion\": \"Hai disabilitato la verifica in due passaggi.\",\n    \"error_modal_user_not_mutual_contact\": \"L'utente può essere invitato solo da un suo contatto\",\n    \"error_modal_invite_link_invalid\": \"Il link d'invito non è valido\",\n    \"error_modal_channel_not_accessible\": \"Spiacenti, questo canale non è accessibile.\",\n    \"error_modal_not_contact_flood\": \"Spiacenti, al momento puoi scrivere solo ai contatti reciproci. {more-info-link: Maggiori informazioni »}\",\n    \"error_modal_gelocation_na\": \"L'app non è riuscita a determinare la tua posizione corrente\",\n    \"error_modal_2fa_recent_confirm\": \"I tuoi tentativi recenti di ripristinare questo account sono stati annullati dal suo utente attivo. Per favore riprova tra 7 giorni.\",\n    \"error_modal_2fa_delayed_time_md\": \"Potrai ripristinare il tuo account tra: **{time}**\",\n    \"head_mainmenu\": \"Menu principale\",\n    \"head_telegram\": \"Telegram\",\n    \"head_new_group\": \"Nuovo gruppo\",\n    \"head_new_contact\": \"Nuovo contatto\",\n    \"head_contacts\": \"Contatti\",\n    \"head_contacts_title\": \"Contatti\",\n    \"head_telegram_faq\": \"Domande frequenti\",\n    \"head_settings\": \"Impostazioni\",\n    \"head_log_out\": \"Esci\",\n    \"head_peer_more\": \"Altro\",\n    \"head_select_messages\": \"Seleziona messaggi\",\n    \"head_media_photos\": \"Foto\",\n    \"head_media_video\": \"Video\",\n    \"head_media_documents\": \"File\",\n    \"head_media_music\": \"Audio\",\n    \"head_media_links\": \"Link condivisi\",\n    \"head_media_audio\": \"Messaggi vocali\",\n    \"head_media_round\": \"Videomessaggi\",\n    \"head_media_mymentions\": \"Menzioni\",\n    \"head_media_search\": \"Cerca\",\n    \"head_about\": \"Info\",\n    \"head_clear_all\": \"Cancella cronologia\",\n    \"head_select\": \"Seleziona\",\n    \"head_typing\": \"sta scrivendo\",\n    \"head_pluralize_participants\": \"{'0': 'Nessun membro', 'one': '1 membro', 'other': '{} membri'}\",\n    \"head_one_typing\": \"{name1} sta scrivendo{dots}\",\n    \"head_two_typing\": \"{name1}, {name2}{dots}\",\n    \"head_many_typing\": \"{name1}+{names}{dots}\",\n    \"head_waiting_for_network\": \"Attendo la rete\",\n    \"head_retry\": \"Riprova\",\n    \"head_connecting\": \"Connetto\",\n    \"footer_twitter\": \"Twitter\",\n    \"im_new_group\": \"Nuovo gruppo\",\n    \"im_new_contact\": \"Nuovo contatto\",\n    \"im_contacts\": \"Contatti\",\n    \"im_chat_contacts_title\": \"Chat e contatti\",\n    \"im_settings\": \"Impostazioni\",\n    \"im_conversations\": \"Conversazioni\",\n    \"im_found_title\": \"Ricerca globale\",\n    \"im_messages\": \"Messaggi\",\n    \"im_no_contacts\": \"Ancora nessun contatto\",\n    \"im_get_started_long\": \"Inizia aggiungendo un contatto con cui messaggiare\",\n    \"im_add_contact\": \"Aggiungi contatto\",\n    \"im_import_phonebook\": \"Importa rubrica\",\n    \"im_get_started\": \"Inizia\",\n    \"im_welcome_text\": \"Benvenuto su Telegram Web. Puoi sempre impostare una foto profilo e cambiare il tuo nome nelle Impostazioni.\",\n    \"im_open_settings\": \"Apri impostazioni\",\n    \"im_select_a_chat\": \"Seleziona una chat per iniziare a messaggiare\",\n    \"im_loading_history\": \"Carico cronologia\",\n    \"im_media\": \"Media\",\n    \"im_media_photos\": \"Foto\",\n    \"im_media_video\": \"Video\",\n    \"im_media_documents\": \"File\",\n    \"im_media_audio\": \"Messaggi vocali\",\n    \"im_media_round\": \"Videomessaggi\",\n    \"im_media_music\": \"Audio\",\n    \"im_media_links\": \"Link condivisi\",\n    \"im_media_mentions\": \"Menzioni e risposte\",\n    \"im_pluralize_participants\": \"{'0': 'Nessun membro', 'one': '1 membro', 'other': '{} membri'}\",\n    \"im_show_recent_messages\": \"Mostra messaggi recenti\",\n    \"im_show_all_messages\": \"Mostra tutti i messaggi\",\n    \"im_no_messages\": \"Ancora nessun messaggio qui…\",\n    \"im_one_typing\": \"{name1} sta scrivendo{dots}\",\n    \"im_two_typing\": \"{name1} e {name2} stanno scrivendo{dots}\",\n    \"im_many_typing\": \"{name1}, {name2} e altri {count} stanno scrivendo{dots}\",\n    \"im_conversation_single_typing\": \"sta scrivendo{dots}\",\n    \"im_conversation_group_typing\": \"{name} sta scrivendo{dots}\",\n    \"im_delete_chat\": \"Elimina chat\",\n    \"im_clear_history\": \"Cancella cronologia\",\n    \"im_delete\": \"Elimina {count}\",\n    \"im_forward\": \"Inoltra {count}\",\n    \"im_reply\": \"Rispondi\",\n    \"im_edit\": \"Modifica\",\n    \"im_start\": \"Avvia\",\n    \"im_channel_join\": \"+ Unisciti\",\n    \"im_channel_mute\": \"Silenzia\",\n    \"im_channel_unmute\": \"Suona\",\n    \"im_report\": \"Segnala {count}\",\n    \"im_reply_loading\": \"Carico{dots}\",\n    \"im_X_forwarded_messages\": \"{'one': '{} messaggio inoltrato', 'other': '{} messaggi inoltrati'}\",\n    \"im_photos_drop_text\": \"Trascina qui le foto per inviarle\",\n    \"im_message_field_placeholder\": \"Scrivi un messaggio...\",\n    \"im_broadcast_field_placeholder\": \"Diffondi un messaggio...\",\n    \"im_emoji_tab\": \"Emoji\",\n    \"im_stickers_tab\": \"Sticker\",\n    \"im_stickers_tab_recent\": \"Utilizzate di frequente\",\n    \"im_voice_record_title\": \"Registra un messaggio\",\n    \"im_media_attach_title\": \"Invia media\",\n    \"im_attach_file_title\": \"Invia file\",\n    \"im_emoji_btn_title\": \"Inserisci emoticon\",\n    \"im_submit_message\": \"Invia\",\n    \"im_submit_edit_message\": \"Salva\",\n    \"im_edit_message_title\": \"Modifica messaggio\",\n    \"im_voice_recording_label\": \"Rilascia fuori da qui per annullare\",\n    \"im_voice_recording_cancel_label\": \"Rilascia per annullare la registrazione\",\n    \"im_voice_processing_label\": \"Elaboro{dots}\",\n    \"login_sign_in\": \"Accedi\",\n    \"login_enter_number_description_md\": \"Scegli il tuo paese e inserisci il tuo numero di telefono completo.\\n\\nTieni presente che hai bisogno di un account esistente per accedere a Telegram Web. Per iscriverti a Telegram, usauna delle nostre {apps-link: app mobile}.\",\n    \"login_incorrect_number\": \"Numero di telefono errato\",\n    \"login_code_input_placeholder\": \"Codice\",\n    \"login_tel_input_placeholder\": \"Numero di telefono\",\n    \"login_country_select_placeholder\": \"Nazione\",\n    \"login_generating_key\": \"Generazione chiavi\",\n    \"login_generating_keys_info\": \"Le chiavi vengono generate una volta soltanto. Questa operazione potrebbe impiegare alcuni minuti su dispositivi lenti, si prega di attendere.\",\n    \"login_edit_number\": \"Modifica numero di telefono\",\n    \"login_enter_code_label_md\": \"Abbiamo inviato il codice su **Telegram** nel tuo altro dispositivo.\\nPer favore inserisci il codice qui sotto.\",\n    \"login_enter_sms_code_label_md\": \"Abbiamo inviato un SMS con un codice di attivazione al tuo numero.\\nPer favore inserisci il codice qui sotto.\",\n    \"login_enter_call_code_label_md\": \"Stiamo chiamando il tuo numero per dettarti un codice.\\nPer favore inserisci il codice qui sotto.\",\n    \"login_code_remaining\": \"Potrai richiedere un SMS tra {remaining}\",\n    \"login_call_remaining\": \"Potrai richiedere una chiamata tra {remaining}\",\n    \"login_code_not_received\": \"Invia codice tramite SMS\",\n    \"login_code_not_received_call\": \"Invia codice tramite chiamata\",\n    \"login_code_requesting\": \"Richiedo il codice\",\n    \"login_incorrect_sms_code\": \"Codice SMS errato\",\n    \"login_number_input_placeholder\": \"Immetti il tuo codice\",\n    \"login_checking_code\": \"Verifica codice\",\n    \"login_your_info\": \"Le tue info\",\n    \"login_fulll_name_label\": \"Inserisci il tuo nome completo per impostare l'account Telegram.\",\n    \"login_incorrect_first_name\": \"Nome errato\",\n    \"login_first_name\": \"Nome\",\n    \"login_incorrect_last_name\": \"Cognome errato\",\n    \"login_last_name\": \"Cognome\",\n    \"login_signing_up\": \"Registrazione in corso\",\n    \"login_sign_up\": \"Registrati\",\n    \"login_about_title\": \"Info\",\n    \"login_about_hide\": \"nascondi\",\n    \"login_try_desktop\": \"For best experience on your computer, try {telegram-link}\",\n    \"login_try_desktop_btn\": \"Download Telegram\",\n    \"login_try_desktop_short_btn\": \"Download\",\n    \"login_about_desc1_md\": \"Il client web di Telegram è un modo gratuito, veloce e sicuro per goderti le funzioni di **Telegram** sul tuo **browser web**.\",\n    \"login_about_desc2_md\": \"È sempre sincronizzato con **Telegram** sul tuo dispositivo mobile, quindi è lo strumento perfetto per messaggiare e condividere file.\",\n    \"login_about_desc3_md\": \"Il nostro {source-link: codice sorgente} è aperto, così ognuno può contribuire.\",\n    \"login_about_intro\": \"Benvenuto nel client web ufficiale di Telegram.\",\n    \"login_about_learn\": \"Scopri di più\",\n    \"login_password_title\": \"Password\",\n    \"login_password_label\": \"Hai attivato la verifica in due passaggi, così il tuo account è protetto con una password aggiuntiva.\",\n    \"login_password_forgot_link\": \"Password dimenticata?\",\n    \"login_account_reset\": \"Ripristina account\",\n    \"login_password\": \"La tua password\",\n    \"login_incorrect_password\": \"Password errata\",\n    \"login_checking_password\": \"Controllo\",\n    \"login_recovery_title\": \"Password dimenticata?\",\n    \"login_code_placeholder\": \"Codice\",\n    \"login_code_incorrect\": \"Codice errato\",\n    \"login_recovery_description_md\": \"Abbiamo inviato un codice di recupero all'e-mail che ci hai fornito:\\n\\n{email}\\n\\nPer favore controlla la tua e-mail e inserisci il codice a 6 cifre che ti abbiamo inviato.\",\n    \"password_recover_active\": \"Controllo...\",\n    \"password_recover_submit\": \"Invia\",\n    \"login_controller_unknown_country\": \"Sconosciuto\",\n    \"message_forwarded_message\": \"Messaggio inoltrato\",\n    \"message_via_bot\": \"via {bot}\",\n    \"message_edited\": \"modificato\",\n    \"message_forwarded_message_mobile\": \"Inoltrato da {from}\",\n    \"message_forwarded_via_message_mobile\": \"Inoltrato da {from} via {bot}\",\n    \"message_attach_audio_message\": \"Messaggio vocale\",\n    \"message_attach_audio_play\": \"Riproduci\",\n    \"message_attach_document_open\": \"Apri\",\n    \"message_attach_document_download\": \"Scarica\",\n    \"message_attach_document_save\": \"Salva file\",\n    \"message_attach_video_video\": \"Video\",\n    \"message_attach_video_download\": \"Scarica\",\n    \"message_attach_video_save\": \"Salva file\",\n    \"message_attach_video_play\": \"Riproduci video\",\n    \"message_attach_unsupported\": \"Questo messaggio non è supportato sulla tua versione di Telegram Web. Aggiorna l'applicazione per visualizzarlo: {link}\",\n    \"message_attach_unsupported_desktop\": \"Questo messaggio non è ancora supportato su Telegram Web. Prova {link}.\",\n    \"message_attach_notweb\": \"Questo messaggio non è ancora supportato su Telegram Web. Usa le app mobile di Telegram per visualizzarlo: {link}\",\n    \"conversation_select_modal_title\": \"Seleziona conversazione\",\n    \"conversation_select_modal_chats_contacts\": \"Chat e contatti\",\n    \"conversation_one_selected\": \"{name1}\",\n    \"conversation_two_selected\": \"{name1} e {name2}\",\n    \"conversation_many_selected\": \"{name1}, {name2} e altri {count}\",\n    \"phonebook_modal_title\": \"Rubrica\",\n    \"phonebook_modal_deselect_all\": \"Deseleziona tutto\",\n    \"phonebook_modal_select_all\": \"Seleziona tutto\",\n    \"phonebook_modal_empty\": \"La tua rubrica è vuota.\",\n    \"phonebook_modal_submit_active\": \"Importo\",\n    \"phonebook_modal_submit\": \"Importa contatti\",\n    \"inactive_tab_title\": \"Telegram: Zzz...\",\n    \"inactive_title\": \"Oh no, troppe pagine\",\n    \"inactive_description_md\": \"Telegram supporta solo una scheda attiva con l'app.\\nPer favore ricarica questa scheda per usarla o chiudila.\",\n    \"inactive_reload_btn\": \"Ricarica l'app\",\n    \"push_action_mute1d\": \"Silenzia gli avvisi in background per 1 giorno\",\n    \"push_action_settings\": \"Impostazioni avvisi in background\",\n    \"push_action_mute1d_mobile\": \"Silenzia per 24H\",\n    \"push_action_settings_mobile\": \"Impostazioni avvisi\",\n    \"push_message_nopreview\": \"Hai un nuovo messaggio\",\n    \"push_action_mute1d_success\": \"Impostazioni di notifica salvate con successo.\",\n    \"country_select_modal_country_ab\": \"Abkhazia\",\n    \"country_select_modal_country_af\": \"Afghanistan\",\n    \"country_select_modal_country_ax\": \"Isole Aland\",\n    \"country_select_modal_country_al\": \"Albania\",\n    \"country_select_modal_country_dz\": \"Algeria\",\n    \"country_select_modal_country_as\": \"Samoa Americane\",\n    \"country_select_modal_country_ad\": \"Andorra\",\n    \"country_select_modal_country_ao\": \"Angola\",\n    \"country_select_modal_country_ai\": \"Anguilla\",\n    \"country_select_modal_country_ag\": \"Antigua e Barbuda\",\n    \"country_select_modal_country_ar\": \"Argentina\",\n    \"country_select_modal_country_am\": \"Armenia\",\n    \"country_select_modal_country_aw\": \"Aruba\",\n    \"country_select_modal_country_sh_ac\": \"Ascension\",\n    \"country_select_modal_country_au\": \"Australia\",\n    \"country_select_modal_country_au_et\": \"Territori Australiani Esterni\",\n    \"country_select_modal_country_at\": \"Austria\",\n    \"country_select_modal_country_az\": \"Azerbaigian\",\n    \"country_select_modal_country_bs\": \"Bahamas\",\n    \"country_select_modal_country_bh\": \"Bahrein\",\n    \"country_select_modal_country_bd\": \"Bangladesh\",\n    \"country_select_modal_country_bb\": \"Barbados\",\n    \"country_select_modal_country_ag_bar\": \"Barbuda\",\n    \"country_select_modal_country_by\": \"Bielorussia\",\n    \"country_select_modal_country_be\": \"Belgio\",\n    \"country_select_modal_country_bz\": \"Belize\",\n    \"country_select_modal_country_bj\": \"Benin\",\n    \"country_select_modal_country_bm\": \"Bermuda\",\n    \"country_select_modal_country_bt\": \"Bhutan\",\n    \"country_select_modal_country_bo\": \"Bolivia\",\n    \"country_select_modal_country_bq\": \"Caraibi Olandesi\",\n    \"country_select_modal_country_ba\": \"Bosnia-Erzegovina\",\n    \"country_select_modal_country_bw\": \"Botswana\",\n    \"country_select_modal_country_br\": \"Brasile\",\n    \"country_select_modal_country_io\": \"Territorio Britannico dell’Oceano Indiano\",\n    \"country_select_modal_country_vg\": \"Isole Vergini Britanniche\",\n    \"country_select_modal_country_bn\": \"Brunei\",\n    \"country_select_modal_country_bg\": \"Bulgaria\",\n    \"country_select_modal_country_bf\": \"Burkina Faso\",\n    \"country_select_modal_country_mm\": \"Myanmar (Birmania)\",\n    \"country_select_modal_country_bi\": \"Burundi\",\n    \"country_select_modal_country_kh\": \"Cambogia\",\n    \"country_select_modal_country_cm\": \"Camerun\",\n    \"country_select_modal_country_ca\": \"Canada\",\n    \"country_select_modal_country_cv\": \"Capo Verde\",\n    \"country_select_modal_country_ky\": \"Isole Cayman\",\n    \"country_select_modal_country_cf\": \"Repubblica Centrafricana\",\n    \"country_select_modal_country_td\": \"Ciad\",\n    \"country_select_modal_country_cl\": \"Cile\",\n    \"country_select_modal_country_cn\": \"Cina\",\n    \"country_select_modal_country_cx\": \"Isola di Christmas\",\n    \"country_select_modal_country_cc\": \"Isole Cocos\",\n    \"country_select_modal_country_co\": \"Colombia\",\n    \"country_select_modal_country_km\": \"Comore\",\n    \"country_select_modal_country_cg\": \"Congo-Brazzaville\",\n    \"country_select_modal_country_cd\": \"Congo - Kinshasa\",\n    \"country_select_modal_country_ck\": \"Isole Cook\",\n    \"country_select_modal_country_cr\": \"Costa Rica\",\n    \"country_select_modal_country_ci\": \"Costa d’Avorio\",\n    \"country_select_modal_country_hr\": \"Croazia\",\n    \"country_select_modal_country_cu\": \"Cuba\",\n    \"country_select_modal_country_cw\": \"Curaçao\",\n    \"country_select_modal_country_cy\": \"Cipro\",\n    \"country_select_modal_country_cz\": \"Repubblica Ceca\",\n    \"country_select_modal_country_dk\": \"Danimarca\",\n    \"country_select_modal_country_dg\": \"Diego Garcia\",\n    \"country_select_modal_country_dj\": \"Gibuti\",\n    \"country_select_modal_country_dm\": \"Dominica\",\n    \"country_select_modal_country_do\": \"Repubblica Dominicana\",\n    \"country_select_modal_country_tl\": \"Timor Est\",\n    \"country_select_modal_country_ec\": \"Ecuador\",\n    \"country_select_modal_country_eg\": \"Egitto\",\n    \"country_select_modal_country_sv\": \"El Salvador\",\n    \"country_select_modal_country_gq\": \"Guinea Equatoriale\",\n    \"country_select_modal_country_er\": \"Eritrea\",\n    \"country_select_modal_country_ee\": \"Estonia\",\n    \"country_select_modal_country_et\": \"Etiopia\",\n    \"country_select_modal_country_fk\": \"Isole Falkland\",\n    \"country_select_modal_country_fo\": \"Isole Faroe\",\n    \"country_select_modal_country_fj\": \"Figi\",\n    \"country_select_modal_country_fi\": \"Finlandia\",\n    \"country_select_modal_country_fr\": \"Francia\",\n    \"country_select_modal_country_gf\": \"Guiana Francese\",\n    \"country_select_modal_country_pf\": \"Polinesia Francese\",\n    \"country_select_modal_country_ga\": \"Gabon\",\n    \"country_select_modal_country_gm\": \"Gambia\",\n    \"country_select_modal_country_ge\": \"Georgia\",\n    \"country_select_modal_country_de\": \"Germania\",\n    \"country_select_modal_country_gh\": \"Ghana\",\n    \"country_select_modal_country_gi\": \"Gibilterra\",\n    \"country_select_modal_country_gr\": \"Grecia\",\n    \"country_select_modal_country_gl\": \"Groenlandia\",\n    \"country_select_modal_country_gd\": \"Grenada\",\n    \"country_select_modal_country_gp\": \"Guadalupa\",\n    \"country_select_modal_country_gu\": \"Guam\",\n    \"country_select_modal_country_gt\": \"Guatemala\",\n    \"country_select_modal_country_gg\": \"Guernsey\",\n    \"country_select_modal_country_gn\": \"Guinea\",\n    \"country_select_modal_country_gw\": \"Guinea-Bissau\",\n    \"country_select_modal_country_gy\": \"Guyana\",\n    \"country_select_modal_country_ht\": \"Haiti\",\n    \"country_select_modal_country_hn\": \"Honduras\",\n    \"country_select_modal_country_hk\": \"RAS di Hong Kong\",\n    \"country_select_modal_country_hu\": \"Ungheria\",\n    \"country_select_modal_country_is\": \"Islanda\",\n    \"country_select_modal_country_in\": \"India\",\n    \"country_select_modal_country_id\": \"Indonesia\",\n    \"country_select_modal_country_ir\": \"Iran\",\n    \"country_select_modal_country_iq\": \"Iraq\",\n    \"country_select_modal_country_ie\": \"Irlanda\",\n    \"country_select_modal_country_il\": \"Israele\",\n    \"country_select_modal_country_it\": \"Italia\",\n    \"country_select_modal_country_jm\": \"Giamaica\",\n    \"country_select_modal_country_sj\": \"Svalbard e Jan Mayen\",\n    \"country_select_modal_country_jp\": \"Giappone\",\n    \"country_select_modal_country_je\": \"Jersey\",\n    \"country_select_modal_country_jo\": \"Giordania\",\n    \"country_select_modal_country_kz\": \"Kazakistan\",\n    \"country_select_modal_country_ke\": \"Kenya\",\n    \"country_select_modal_country_ki\": \"Kiribati\",\n    \"country_select_modal_country_kp\": \"Corea del Nord\",\n    \"country_select_modal_country_kr\": \"Corea del Sud\",\n    \"country_select_modal_country_kw\": \"Kuwait\",\n    \"country_select_modal_country_kg\": \"Kirghizistan\",\n    \"country_select_modal_country_la\": \"Laos\",\n    \"country_select_modal_country_lv\": \"Lettonia\",\n    \"country_select_modal_country_lb\": \"Libano\",\n    \"country_select_modal_country_ls\": \"Lesotho\",\n    \"country_select_modal_country_lr\": \"Liberia\",\n    \"country_select_modal_country_ly\": \"Libia\",\n    \"country_select_modal_country_li\": \"Liechtenstein\",\n    \"country_select_modal_country_lt\": \"Lituania\",\n    \"country_select_modal_country_lu\": \"Lussemburgo\",\n    \"country_select_modal_country_mo\": \"RAS di Macao\",\n    \"country_select_modal_country_mk\": \"Repubblica di Macedonia\",\n    \"country_select_modal_country_mg\": \"Madagascar\",\n    \"country_select_modal_country_mw\": \"Malawi\",\n    \"country_select_modal_country_my\": \"Malesia\",\n    \"country_select_modal_country_mv\": \"Maldive\",\n    \"country_select_modal_country_ml\": \"Mali\",\n    \"country_select_modal_country_mt\": \"Malta\",\n    \"country_select_modal_country_mh\": \"Isole Marshall\",\n    \"country_select_modal_country_mq\": \"Martinica\",\n    \"country_select_modal_country_mr\": \"Mauritania\",\n    \"country_select_modal_country_mu\": \"Mauritius\",\n    \"country_select_modal_country_yt\": \"Mayotte\",\n    \"country_select_modal_country_mx\": \"Messico\",\n    \"country_select_modal_country_fm\": \"Micronesia\",\n    \"country_select_modal_country_md\": \"Moldavia\",\n    \"country_select_modal_country_mc\": \"Monaco\",\n    \"country_select_modal_country_mn\": \"Mongolia\",\n    \"country_select_modal_country_me\": \"Montenegro\",\n    \"country_select_modal_country_ms\": \"Montserrat\",\n    \"country_select_modal_country_ma\": \"Marocco\",\n    \"country_select_modal_country_mz\": \"Mozambico\",\n    \"country_select_modal_country_na\": \"Namibia\",\n    \"country_select_modal_country_nr\": \"Nauru\",\n    \"country_select_modal_country_np\": \"Nepal\",\n    \"country_select_modal_country_nl\": \"Paesi Bassi\",\n    \"country_select_modal_country_nc\": \"Nuova Caledonia\",\n    \"country_select_modal_country_nz\": \"Nuova Zelanda\",\n    \"country_select_modal_country_ni\": \"Nicaragua\",\n    \"country_select_modal_country_ne\": \"Niger\",\n    \"country_select_modal_country_ng\": \"Nigeria\",\n    \"country_select_modal_country_nu\": \"Niue\",\n    \"country_select_modal_country_nf\": \"Isola Norfolk\",\n    \"country_select_modal_country_mp\": \"Isole Marianne Settentrionali\",\n    \"country_select_modal_country_no\": \"Norvegia\",\n    \"country_select_modal_country_om\": \"Oman\",\n    \"country_select_modal_country_pk\": \"Pakistan\",\n    \"country_select_modal_country_pw\": \"Palau\",\n    \"country_select_modal_country_ps\": \"Territori palestinesi\",\n    \"country_select_modal_country_pa\": \"Panamá\",\n    \"country_select_modal_country_pg\": \"Papua Nuova Guinea\",\n    \"country_select_modal_country_py\": \"Paraguay\",\n    \"country_select_modal_country_pe\": \"Perù\",\n    \"country_select_modal_country_ph\": \"Filippine\",\n    \"country_select_modal_country_pn\": \"Isole Pitcairn\",\n    \"country_select_modal_country_pl\": \"Polonia\",\n    \"country_select_modal_country_pt\": \"Portogallo\",\n    \"country_select_modal_country_pr\": \"Portorico\",\n    \"country_select_modal_country_qa\": \"Qatar\",\n    \"country_select_modal_country_re\": \"Réunion\",\n    \"country_select_modal_country_ro\": \"Romania\",\n    \"country_select_modal_country_ru\": \"Federazione Russa\",\n    \"country_select_modal_country_rw\": \"Ruanda\",\n    \"country_select_modal_country_bl\": \"Saint-Barthélemy\",\n    \"country_select_modal_country_sh\": \"Sant’Elena\",\n    \"country_select_modal_country_kn\": \"Saint Kitts e Nevis\",\n    \"country_select_modal_country_lc\": \"Saint Lucia\",\n    \"country_select_modal_country_mf\": \"Saint Martin\",\n    \"country_select_modal_country_pm\": \"Saint Pierre e Miquelon\",\n    \"country_select_modal_country_vc\": \"Saint Vincent e Grenadines\",\n    \"country_select_modal_country_ws\": \"Samoa\",\n    \"country_select_modal_country_sm\": \"San Marino\",\n    \"country_select_modal_country_st\": \"São Tomé e Príncipe\",\n    \"country_select_modal_country_sa\": \"Arabia Saudita\",\n    \"country_select_modal_country_sn\": \"Senegal\",\n    \"country_select_modal_country_rs\": \"Serbia\",\n    \"country_select_modal_country_sc\": \"Seychelles\",\n    \"country_select_modal_country_sl\": \"Sierra Leone\",\n    \"country_select_modal_country_sg\": \"Singapore\",\n    \"country_select_modal_country_nl_bq3\": \"Sint Eustatius\",\n    \"country_select_modal_country_sx\": \"Sint Maarten\",\n    \"country_select_modal_country_sk\": \"Slovacchia\",\n    \"country_select_modal_country_si\": \"Slovenia\",\n    \"country_select_modal_country_sb\": \"Isole Solomon\",\n    \"country_select_modal_country_so\": \"Somalia\",\n    \"country_select_modal_country_za\": \"Sudafrica\",\n    \"country_select_modal_country_gs\": \"Georgia del Sud e isole Sandwich meridionali\",\n    \"country_select_modal_country_ge_so\": \"Ossetia del Sud\",\n    \"country_select_modal_country_ss\": \"Sudan del Sud\",\n    \"country_select_modal_country_es\": \"Spagna\",\n    \"country_select_modal_country_lk\": \"Sri Lanka\",\n    \"country_select_modal_country_sd\": \"Sudan\",\n    \"country_select_modal_country_sr\": \"Suriname\",\n    \"country_select_modal_country_sj_no\": \"Svalbard\",\n    \"country_select_modal_country_sz\": \"Swaziland\",\n    \"country_select_modal_country_se\": \"Svezia\",\n    \"country_select_modal_country_ch\": \"Svizzera\",\n    \"country_select_modal_country_sy\": \"Siria\",\n    \"country_select_modal_country_tw\": \"Taiwan\",\n    \"country_select_modal_country_tj\": \"Tagikistan\",\n    \"country_select_modal_country_tz\": \"Tanzania\",\n    \"country_select_modal_country_th\": \"Tailandia\",\n    \"country_select_modal_country_tg\": \"Togo\",\n    \"country_select_modal_country_tk\": \"Tokelau\",\n    \"country_select_modal_country_to\": \"Tonga\",\n    \"country_select_modal_country_tt\": \"Trinidad e Tobago\",\n    \"country_select_modal_country_tn\": \"Tunisia\",\n    \"country_select_modal_country_tr\": \"Turchia\",\n    \"country_select_modal_country_tm\": \"Turkmenistan\",\n    \"country_select_modal_country_tc\": \"Isole Turks e Caicos\",\n    \"country_select_modal_country_tv\": \"Tuvalu\",\n    \"country_select_modal_country_ug\": \"Uganda\",\n    \"country_select_modal_country_ua\": \"Ucraina\",\n    \"country_select_modal_country_ae\": \"Emirati Arabi Uniti\",\n    \"country_select_modal_country_uk\": \"Inghilterra\",\n    \"country_select_modal_country_us\": \"Stati Uniti\",\n    \"country_select_modal_country_uy\": \"Uruguay\",\n    \"country_select_modal_country_vi\": \"Isole Vergini Americane\",\n    \"country_select_modal_country_uz\": \"Uzbekistan\",\n    \"country_select_modal_country_vu\": \"Vanuatu\",\n    \"country_select_modal_country_ve\": \"Venezuela\",\n    \"country_select_modal_country_va\": \"Città del Vaticano\",\n    \"country_select_modal_country_vn\": \"Vietnam\",\n    \"country_select_modal_country_wf\": \"Wallis e Futuna\",\n    \"country_select_modal_country_ye\": \"Yemen\",\n    \"country_select_modal_country_zm\": \"Zambia\",\n    \"country_select_modal_country_tz_uk\": \"Zanzibar\",\n    \"country_select_modal_country_zw\": \"Zimbabwe\"\n}"
  },
  {
    "path": "app/js/locales/nl-nl.json",
    "content": "{\n    \"modal_search\": \"Zoeken\",\n    \"modal_close\": \"Sluit\",\n    \"modal_edit\": \"Wijzig\",\n    \"modal_cancel\": \"Annuleren\",\n    \"modal_more\": \"Meer\",\n    \"modal_next\": \"Volgende\",\n    \"modal_ok\": \"OK\",\n    \"modal_done\": \"Gereed\",\n    \"group_modal_info\": \"Groepsinformatie\",\n    \"group_modal_pluralize_participants\": \"{'0': 'Geen leden', 'one': '1 lid', 'other': '{} leden'}\",\n    \"group_modal_pluralize_online_participants\": \"{'one': '1 online', 'other': '{} online'}\",\n    \"group_modal_pluralize_subscribers\": \"{'0': 'Geen abonnees', 'one': '1 abonnee', 'other': '{} abonnees'}\",\n    \"group_modal_participants\": \"{total}, {online}\",\n    \"group_modal_add_member\": \"Lid toevoegen\",\n    \"group_modal_return\": \"Terugkeren naar groep\",\n    \"group_modal_update_photo\": \"Foto wijzigen\",\n    \"group_modal_update_active\": \"Bijwerken\",\n    \"group_modal_menu_more\": \"Meer\",\n    \"group_modal_menu_delete_photo\": \"Foto verwijderen\",\n    \"group_modal_menu_edit_group\": \"Groep wijzigen\",\n    \"group_modal_menu_leave\": \"Verlaten\",\n    \"group_modal_menu_delete_group\": \"Verwijderen en verlaten\",\n    \"group_modal_menu_clear_history\": \"Geschiedenis wissen\",\n    \"group_modal_delete_group\": \"Groep verwijderen\",\n    \"group_modal_join\": \"Lid worden van groep\",\n    \"group_modal_settings\": \"Instellingen\",\n    \"group_modal_notifications\": \"Meldingen\",\n    \"group_modal_menu_share_link\": \"Uitnodigingslink sturen\",\n    \"group_modal_migrate_to_supergroup\": \"Opwaarderen naar supergroep\",\n    \"group_modal_members\": \"Leden\",\n    \"group_modal_members_kick\": \"Verwijder\",\n    \"group_modal_migrate_header\": \"Ledenlimiet bereikt.\",\n    \"group_modal_migrate_desc\": \"Wil je extra functies en een hogere limiet? Waardeer op naar een supergroep:\",\n    \"group_modal_migrate_item1\": \"Supergroepen hebben tot 1000 leden\",\n    \"group_modal_migrate_item2\": \"Nieuwe leden zien de hele geschiedenis\",\n    \"group_modal_migrate_item3\": \"Beheerder wist berichten voor iedereen\",\n    \"group_modal_migrate_item4\": \"Meldingen staan standaard uit\",\n    \"channel_modal_info\": \"Kanaalinformatie\",\n    \"channel_modal_description\": \"Beschrijving\",\n    \"channel_modal_share_link\": \"Link delen\",\n    \"channel_modal_share_loading\": \"Laden{dots}\",\n    \"channel_modal_menu_edit\": \"Kanaal wijzigen\",\n    \"channel_modal_join\": \"Lid worden van kanaal\",\n    \"channel_modal_add_member\": \"Leden toevoegen\",\n    \"channel_modal_leave_channel\": \"Kanaal verlaten\",\n    \"channel_modal_delete_channel\": \"Kanaal verwijderen\",\n    \"country_select_modal_title\": \"Land\",\n    \"settings_modal_title\": \"Instellingen\",\n    \"settings_modal_menu_more\": \"Meer\",\n    \"settings_modal_delete_photo\": \"Profielfoto verwijderen\",\n    \"settings_modal_set_photo\": \"Profielfoto instellen\",\n    \"settings_modal_photo_updating\": \"Bijwerken\",\n    \"settings_modal_edit_profile\": \"Profiel wijzigen\",\n    \"settings_modal_edit_username\": \"Gebruikersnaam wijzigen\",\n    \"settings_modal_empty_username_set\": \"Gebruikersnaam instellen\",\n    \"settings_modal_terminate_sessions\": \"Beëindig alle sessies\",\n    \"settings_modal_active_sessions\": \"Actieve sessies\",\n    \"settings_modal_settings\": \"Instellingen\",\n    \"settings_modal_notification_alert\": \"Meldingswaarschuwingen\",\n    \"settings_modal_notification_push\": \"PUSH-berichtgeving.\",\n    \"settings_modal_vibrate\": \"Trillen\",\n    \"settings_modal_sounds\": \"Geluiden\",\n    \"settings_modal_language\": \"Taal\",\n    \"settings_modal_notifications\": \"Desktopmeldingen\",\n    \"settings_modal_pushes\": \"Achtergrondmeldingen\",\n    \"settings_modal_message_preview\": \"Voorbeeld\",\n    \"settings_modal_sound\": \"Geluid\",\n    \"settings_modal_enter_send_description_md\": \"**Enter** - bericht versturen, **Shift + Enter** - nieuwe regel\",\n    \"settings_modal_ctrl_enter_send_description_md\": \"**Ctrl + Enter** - bericht versturen. **Enter** - nieuwe regel\",\n    \"settings_modal_send_on_enter\": \"Versturen met Enter\",\n    \"settings_switch_back_to_desktop\": \"Terugschakelen naar desktopversie\",\n    \"settings_modal_about\": \"Over\",\n    \"settings_modal_source_code_github\": \"Broncode op GitHub\",\n    \"settings_modal_follow_us_twitter\": \"Volg ons op Twitter!\",\n    \"settings_modal_recent_updates\": \"Recente updates (ver. {version})\",\n    \"settings_modal_set_password\": \"Extra wachtwoord instellen\",\n    \"settings_modal_change_password\": \"Wachtwoord wijzigen\",\n    \"settings_modal_disable_password\": \"Uitschakelen\",\n    \"settings_modal_disable_password_mobile\": \"Wachtwoord uitschakelen\",\n    \"settings_modal_password_email_pending\": \"Klik op de link in {e-mail} om de twee-staps-verificatie in te schakelen.\",\n    \"settings_modal_password_email_pending_cancel\": \"Annuleren\",\n    \"settings_modal_password_email_pending_cancel_mobile\": \"Wachtwoord annuleren\",\n    \"settings_modal_show_sensitive_content\": \"Gevoelige inhoud tonen\",\n    \"password_delete_title\": \"Wachtwoord uitschakelen\",\n    \"password_change_title\": \"Twee-staps-verificatie\",\n    \"password_current_placeholder\": \"Wachtwoord invoeren\",\n    \"password_create_placeholder\": \"Wachtwoord invoeren\",\n    \"password_new_placeholder\": \"Nieuw wachtwoord invoeren\",\n    \"password_confirm_placeholder\": \"Wachtwoord opnieuw invoeren\",\n    \"password_hint_placeholder\": \"Wachtwoordhint invoeren\",\n    \"password_email_placeholder\": \"Herstel-e-mailadres invoeren\",\n    \"password_create_description\": \"Het wachtwoord is nodig als je inlogt op een nieuw apparaat, samen met de sms-code.\",\n    \"password_create_active\": \"Opslaan...\",\n    \"password_create_submit\": \"Opslaan\",\n    \"password_delete_active\": \"Verwijderen...\",\n    \"password_delete_submit\": \"Wachtwoord verwijderen\",\n    \"sessions_modal_title\": \"Actieve sessies\",\n    \"sessions_modal_loading\": \"Laden{dots}\",\n    \"sessions_modal_current_session\": \"Huidige sessie\",\n    \"sessions_modal_session_online\": \"online\",\n    \"sessions_modal_terminate_one\": \"Beëindig\",\n    \"sessions_modal_terminate_all\": \"Beëindig alle andere sessies\",\n    \"sessions_modal_active_sessions\": \"Actieve sessies\",\n    \"stickerset_modal_title_loading\": \"Stickerbundel\",\n    \"stickerset_modal_install\": \"Stickers toevoegen\",\n    \"stickerset_modal_uninstall\": \"Stickers verwijderen\",\n    \"stickerset_modal_share\": \"Delen\",\n    \"stickerset_modal_loading\": \"Laden{dots}\",\n    \"page_title_pluralize_notifications\": \"{'0': 'Geen meldingen', 'one': '1 melding', 'other': '{} meldingen'}\",\n    \"profile_edit_modal_title\": \"Profiel wijzigen\",\n    \"profile_edit_first_name\": \"Voornaam\",\n    \"profile_edit_last_name\": \"Achternaam\",\n    \"profile_edit_submit\": \"Opslaan\",\n    \"profile_edit_submit_active\": \"Opslaan\",\n    \"username_edit_modal_title\": \"Gebruikersnaam wijzigen\",\n    \"username_edit_placeholder\": \"Gebruikersnaam\",\n    \"username_edit_description_md\": \"Je kunt een gebruikersnaam kiezen voor **Telegram**. Hiermee kunnen anderen je vinden en contact met je opnemen zonder je telefoonnummer te weten.\\n\\nJe mag **a-z**, **0-9** en liggend streepje gebruiken. De minimale lengte is **5** tekens\",\n    \"username_edit_submit\": \"Opslaan\",\n    \"username_edit_submit_active\": \"Opslaan\",\n    \"user_modal_menu_more\": \"Meer\",\n    \"user_modal_send_message\": \"Bericht versturen\\n\",\n    \"user_modal_edit_contact\": \"Contact wijzigen\",\n    \"user_modal_delete_contact\": \"Contact verwijderen\",\n    \"user_modal_add_contact\": \"Toevoegen aan contacten\",\n    \"user_modal_share_contact\": \"Contact delen\",\n    \"user_modal_block_user\": \"Blokkeer gebruiker\",\n    \"user_modal_unblock_user\": \"Deblokkeer gebruiker\",\n    \"user_modal_clear_history\": \"Geschiedenis wissen\",\n    \"user_modal_delete_chat\": \"Chat verwijderen\",\n    \"user_modal_add_to_group\": \"Groepslid maken\",\n    \"user_modal_info\": \"Info\",\n    \"user_modal_phone\": \"Telefoon\",\n    \"user_modal_about\": \"Over\",\n    \"user_modal_bot_settings\": \"Instellingen\",\n    \"user_modal_bot_help\": \"Help\",\n    \"user_modal_username\": \"Gebruikersnaam\",\n    \"user_modal_settings\": \"Instellingen\",\n    \"user_modal_notifications\": \"Meldingen\",\n    \"user_modal_contact_info\": \"Contactinformatie\",\n    \"media_modal_photo\": \"Foto\",\n    \"media_modal_photo_index\": \"Foto {pos} van {count}\",\n    \"media_modal_video\": \"Video\",\n    \"media_modal_forward\": \"Doorsturen\",\n    \"media_modal_download\": \"Downloaden\",\n    \"media_modal_delete\": \"Verwijder\",\n    \"game_modal_share_game\": \"Spel delen\",\n    \"game_modal_share_score\": \"Score delen\",\n    \"error_browser_no_local_file_system_image_md\": \"Je browser heeft geen ondersteuning voor de {moz-link: https://developer.mozilla.org/nl/docs/Web/API/LocalFileSystem | LocalFileSystem}-functie, welke nodig is om deze afbeelding weer te geven.\\nInstalleer {chrome-link: http://google.com/chrome | Google Chrome} of maak in plaats daarvan gebruik van {telegram-link: https://telegram.org/ | mobile app}.\",\n    \"error_image_download_failed\": \"Download mislukt\",\n    \"error_browser_no_local_file_system_video_md\": \"Je browser heeft geen ondersteuning voor de {moz-link: https://developer.mozilla.org/nl/docs/Web/API/LocalFileSystem | LocalFileSystem}-functie, welke nodig is om deze video af te spelen.\\nInstalleer {chrome-link: http://google.com/chrome | Google Chrome} of maak in plaats daarvan gebruik van {telegram-link: https://telegram.org/ | mobile app}.\",\n    \"error_video_download_failed\": \"Video download mislukt\",\n    \"unread_messages_split\": \"Ongelezen berichten\",\n    \"user_name_deleted\": \"VERWIJDERD\",\n    \"user_first_name_deleted\": \"VERWIJDERD\",\n    \"user_name_saved_msgs\": \"Bewaarde berichten\",\n    \"user_status_online\": \"online\",\n    \"user_status_last_seen\": \"laatst gezien {0}\",\n    \"user_status_recently\": \"recent gezien\",\n    \"user_status_last_week\": \"afgelopen week gezien\",\n    \"user_status_last_month\": \"afgelopen maand gezien\",\n    \"user_status_long_ago\": \"lang geleden gezien\",\n    \"user_status_bot\": \"bot\",\n    \"user_status_service_notifications\": \"servicemeldingen\",\n    \"user_status_support\": \"ondersteuning\",\n    \"user_status_bot_noprivacy\": \"toegang tot berichten\",\n    \"user_status_bot_privacy\": \"geen toegang tot berichten\",\n    \"chat_title_deleted\": \"VERWIJDERD\",\n    \"format_size_progress_mulitple\": \"{done} van {total} {parts}\",\n    \"format_size_progress\": \"{done} van {total}\",\n    \"relative_time_pluralize_minutes_ago\": \"{'one': '1 minuut geleden', 'other': '{} minuten geleden'}\",\n    \"relative_time_pluralize_hours_ago\": \"{'one': '1 uur geleden', 'other': '{} uur geleden'}\",\n    \"relative_time_just_now\": \"zojuist\",\n    \"changelog_modal_header_recent_updates_md\": \"Recente updates in **Telegram Web**\",\n    \"changelog_modal_header_new_updates_md\": \"**Telegram Web** is bijgewerkt!\",\n    \"changelog_modal_title_current_version\": \"huidige versie\",\n    \"changelog_modal_full_description_md\": \"Officiële, gratis Telegram app gebaseerd op de Telegram API voor snelheid en veiligheid.\\n\\nDeze software valt onder de GNU GPL versie 3 licentie.\",\n    \"changelog_modal_changelog_link\": \"Wijzigingen\",\n    \"changelog_app_version\": \"Versie {version}\",\n    \"group_create_contacts_modal_title\": \"Nieuwe groep\",\n    \"group_create_modal_title\": \"Groep maken\",\n    \"group_create_name\": \"Groepsnaam\",\n    \"group_create_submit\": \"Groep maken\",\n    \"group_create_submit_active\": \"Maken\",\n    \"group_edit_modal_title\": \"Groep wijzigen\",\n    \"group_edit_name\": \"Groepsnaam\",\n    \"group_edit_about\": \"Groepsbeschrijving\",\n    \"group_edit_submit\": \"Opslaan\",\n    \"group_edit_submit_active\": \"Opslaan\",\n    \"channel_edit_modal_title\": \"Kanaal wijzigen\",\n    \"channel_edit_name\": \"Kanaalnaam\",\n    \"channel_edit_about\": \"Beschrijving\",\n    \"channel_edit_submit\": \"Opslaan\",\n    \"channel_edit_submit_active\": \"Opslaan...\",\n    \"group_invite_link_modal_title\": \"Uitnodigingslink\",\n    \"group_invite_link_link_label\": \"Uitnodigingslink kopiëren\",\n    \"group_invite_link_loading\": \"Laden...\",\n    \"group_invite_revoke_active\": \"Intrekken...\",\n    \"group_invite_revoke\": \"Intrekken\",\n    \"report_reason_modal_title\": \"Melden\",\n    \"report_reason_modal_spam\": \"Spam\",\n    \"report_reason_modal_violence\": \"Geweld\",\n    \"report_reason_modal_pornography\": \"Pornografie\",\n    \"report_reason_modal_childabuse\": \"Kindermisbruik\",\n    \"report_reason_modal_other\": \"Andere\",\n    \"report_reason_modal_other_placeholder\": \"Beschrijving\",\n    \"report_reason_modal_submit_btn\": \"Verstuur\",\n    \"clipboard_copied\": \"Gekopiëerd\",\n    \"clipboard_press_ctrl_c\": \"CTRL+C om te kopiëren\",\n    \"clipboard_press_cmd_c\": \"Press ⌘+C om te kopiëren\",\n    \"confirm_modal_logout\": \"Weet je zeker dat je wilt uitloggen?\",\n    \"confirm_modal_update_reload\": \"Een nieuwe versie van Telegram Web is gedownload. Deze starten?\",\n    \"confirm_modal_history_flush\": \"Weet je het zeker? Je kunt dit niet ongedaan maken.\",\n    \"confirm_modal_history_leave_flush_md\": \"Wil je de groep verlaten en de geschiedenis wissen?\\n\\nJe kunt dit niet ongedaan maken.\",\n    \"confirm_modal_leave_channel_md\": \"Kanaal echt verlaten?\\n\\nJe kunt dit niet ongedaan maken.\",\n    \"confirm_modal_leave_group_md\": \"Groep echt verlaten?\\n\\nJe kunt dit niet ongedaan maken.\",\n    \"confirm_modal_terminate_sessions\": \"Weet je zeker dat je wilt uitloggen van alle apparaten behalve het huidige apparaat?\",\n    \"confirm_modal_terminate_session\": \"Weet je zeker dat je wilt uitloggen?\",\n    \"confirm_modal_clipboard_file_send\": \"Bestand(en) echt vanaf klembord versturen?\",\n    \"confirm_modal_clipboard_X_files_send\": \"{'one': 'Weet je zeker dat het je het bestand van het klembord wilt versturen?', 'other': 'weet je zeker dat je {} bestanden van het klembord wilt versturen?'}\",\n    \"confirm_modal_message_delete\": \"Bericht echt verwijderen?\",\n    \"confirm_modal_delete_X_messages\": \"{'one': '{} bericht', 'other': '{} berichten'}\",\n    \"confirm_modal_delete_messages\": \"{messages} echt verwijderen?\",\n    \"confirm_modal_message_revoke\": \"Verwijder voor {recipient}\",\n    \"confirm_modal_message_revoke_recipient_chat\": \"iedereen\",\n    \"confirm_modal_delete_messages_for_everyone_chat\": \"Verwijder voor iedereen.\",\n    \"confirm_modal_delete_messages_for_you_only_pm\": \"Verwijder alleen voor jou, niet voor {user}.\",\n    \"confirm_modal_delete_messages_for_you_only_chat\": \"Hiermee verwijder je je berichten alleen voor jezelf, niet voor andere leden.\",\n    \"confirm_modal_photo_delete\": \"Foto echt verwijderen?\",\n    \"confirm_modal_contacts_import\": \"Telegram zal nu je contacten synchroniseren om je vrienden te kunnen vinden.\",\n    \"confirm_modal_login_phone_correct\": \"Is dit telefoonnummer juist?\",\n    \"confirm_modal_forward_to_peer\": \"Doorsturen naar {peer}?\",\n    \"confirm_modal_forward_to_peer_success\": \"Doorsturen gelukt\",\n    \"confirm_modal_report_success\": \"Melding verstuurd\",\n    \"confirm_modal_send_to_peer\": \"Versturen naar {peer}?\",\n    \"confirm_modal_share_file_peer\": \"Delen met {peer}?\",\n    \"confirm_modal_invite_peer\": \"Toevoegen aan {peer}?\",\n    \"confirm_modal_share_game\": \"Spel delen met {peer}?\",\n    \"confirm_modal_apply_lang_with_reload_md\": \"App herladen om de taal toe te passen?\",\n    \"confirm_modal_migrate_to_https_md\": \"Telegram Web heeft nu ondersteuning voor extra SSL-encryptie. Wil je naar HTTPS overschakelen?\\nDe HTTP-versie zal binnenkort worden uitgeschakeld.\",\n    \"confirm_modal_resize_desktop_md\": \"Wil je omschakelen naar de desktopversie?\",\n    \"confirm_modal_resize_mobile_md\": \"Wil je omschakelen naar de mobiele versie?\",\n    \"confirm_modal_recovery_email_empty_md\": \"Let op: Weet je zeker dat je geen herstel-e-mailadres wilt instellen?\\n\\nAls je je wachtwoord vergeet verlies je toegang tot je Telegram account.\",\n    \"confirm_modal_abort_password_setup\": \"Twee-staps-verificatie annuleren?\",\n    \"confirm_modal_reset_account_md\": \"Weet je het zeker?\\nJe kunt dit niet ongedaan maken.\\n\\nAl je chats, berichten en alle andere data gaan verloren als je verder gaat met de account-reset.\",\n    \"confirm_modal_join_group_link\": \"Wil je lid worden van de groep «{title}»?\",\n    \"confirm_modal_join_channel_link\": \"Lid worden van kanaal «{title}»?\",\n    \"confirm_modal_revoke_group_link\": \"Deze link echt intrekken? Na intrekken kan niemand meer lid worden met de oude link.\",\n    \"confirm_modal_revoke_channel_link\": \"Deze link echt intrekken? Na intrekken kan niemand meer lid worden met de oude link.\",\n    \"confirm_modal_delete_channel_md\": \"Kanaal echt verwijderen?\\n\\nBerichten worden gewist en alle leden verwijderd.\",\n    \"confirm_modal_delete_group_md\": \"Groep echt verwijderen?\\n\\nBerichten worden gewist en alle leden verwijderd.\",\n    \"confirm_modal_jump_ext_url_md\": \"Link openen?\\n\\n{url}\",\n    \"confirm_modal_migrate_supergroup_md\": \"Groepsleden moeten updaten naar de meest recente Telegram om je supergroep te kunnen zien.\\n\\nGroep echt opwaarderen?\",\n    \"confirm_modal_bot_access_phone\": \"De bot krijgt je telefoonnummer, dit kan handig zijn voor de integratie met andere diensten.\",\n    \"confirm_modal_bot_access_geo\": \"Huidige locatie naar deze bot sturen?\",\n    \"confirm_modal_bot_access_geo_inline\": \"Deze bot wil toegang tot je locatie voor ieder verzoek dat je stuurt. Dit kan gebruikt worden voor locatiespecifieke resultaten.\",\n    \"confirm_modal_content_settings_sensitive_md\": \"**Filteren uitschakelen**\\nAls je filteren uitschakelt, zal gevoelige media worden weergeven in publieke kanalen op al je apparaten met Telegram.\",\n    \"confirm_modal_content_settings_sensitive_submit\": \"Uitschakelen\",\n    \"confirm_modal_are_u_sure\": \"Weet je het zeker?\",\n    \"confirm_modal_logout_submit\": \"Uitloggen\",\n    \"confirm_modal_clear_history_submit\": \"Geschiedenis wissen\",\n    \"confirm_modal_leave_chat_submit\": \"Verlaten\",\n    \"confirm_modal_delete_chat_submit\": \"Chat verwijderen\",\n    \"confirm_modal_clipboard_files_send_submit\": \"Stuur\",\n    \"confirm_modal_clipboard_file_send_submit\": \"Stuur\",\n    \"confirm_modal_message_delete_submit\": \"Verwijder\",\n    \"confirm_modal_messages_delete_submit\": \"Verwijderen\",\n    \"confirm_modal_photo_delete_submit\": \"Verwijder\",\n    \"confirm_modal_forward_message_submit\": \"Bericht doorsturen\",\n    \"confirm_modal_share_photo_submit\": \"Foto doorsturen\",\n    \"confirm_modal_share_video_submit\": \"Video doorsturen\",\n    \"confirm_modal_share_contact_submit\": \"Contact delen\",\n    \"confirm_modal_share_file_submit\": \"Bestand delen\",\n    \"confirm_modal_reset_account_submit\": \"Reset mijn account\",\n    \"contacts_modal_edit_list\": \"Wijzig\",\n    \"contacts_modal_edit_cancel\": \"Annuleren\",\n    \"contacts_modal_edit_delete\": \"Verwijder\",\n    \"contacts_modal_pluralize_new_group_members\": \"{'one': '1 lid', 'other': '{} leden'}\",\n    \"contacts_modal_title\": \"Contacten\",\n    \"contacts_modal_new_contact\": \"Nieuw contact\",\n    \"contacts_modal_empty_list\": \"Je lijst met contacten is leeg. Je kunt een {import-link: contact toevoegen} aan de hand van het telefoonnummer.\",\n    \"conversations_modal_forward_title\": \"Doorsturen\",\n    \"conversations_modal_forward_submit\": \"Doorsturen\",\n    \"conversations_modal_select_recipients\": \"Ontvangers kiezen\",\n    \"conversations_modal_recipients\": \"Ontvangers:\",\n    \"conversations_modal_share_url_loading\": \"Laden{dots}\",\n    \"conversations_modal_share_url_copy\": \"Berichtlink kopiëren\",\n    \"contact_edit_modal_first_name\": \"Voornaam\",\n    \"contact_edit_modal_last_name\": \"Achternaam\",\n    \"contact_edit_modal_title\": \"Contact wijzigen\",\n    \"contact_edit_modal_submit\": \"Opslaan\",\n    \"contact_edit_modal_submit_active\": \"Opslaan\",\n    \"contact_import_modal_title\": \"Contact toevoegen\",\n    \"contact_import_modal_phone\": \"Telefoonnummer\",\n    \"contact_import_modal_phonebook\": \"Telefoonboek\",\n    \"contact_import_modal_submit\": \"Opslaan\",\n    \"contact_import_modal_submit_active\": \"Importeren\",\n    \"conversation_you\": \"Jij\",\n    \"conversation_draft\": \"Concept:\",\n    \"conversation_media_photo\": \"Foto\",\n    \"conversation_media_video\": \"Video\",\n    \"conversation_media_round\": \"Videobericht\",\n    \"conversation_media_document\": \"Bestand\",\n    \"conversation_media_sticker\": \"sticker\",\n    \"conversation_media_gif\": \"GIF\",\n    \"conversation_media_audio\": \"Geluidsbestand\",\n    \"conversation_media_location\": \"Locatie\",\n    \"conversation_media_contact\": \"Contact\",\n    \"conversation_media_attachment\": \"Bijlage\",\n    \"conversation_media_unsupported\": \"Bestandstype niet ondersteund\",\n    \"conversation_search_peer\": \"In chat zoeken\",\n    \"conversation_group_created\": \"heeft de groep gemaakt\",\n    \"conversation_group_renamed\": \"heeft de groepsnaam gewijzigd\",\n    \"conversation_group_photo_updated\": \"heeft de groepsafbeelding gewijzigd\",\n    \"conversation_group_photo_removed\": \"heeft de groepsafbeelding verwijderd\",\n    \"conversation_returned_to_group\": \"Teruggekeerd naar de groep\",\n    \"conversation_joined_group\": \"is nu lid van de groep\",\n    \"conversation_invited_user\": \"heeft {user} uitgenodigd\",\n    \"conversation_invited_users\": \"{'one': '{} gebruiker uitgenodigd', 'other': '{} gebruikers uitgenodigd'}\",\n    \"conversation_left_group\": \"heeft de groep verlaten\",\n    \"conversation_kicked_user\": \"{user} verwijderd\",\n    \"conversation_invited_user_message\": \"gebruiker uitgenodigd\",\n    \"conversation_kicked_user_message\": \"gebruiker verwijderd\",\n    \"conversation_joined_by_link\": \"is nu lid van de groep\",\n    \"conversation_converted_to_supergroup\": \"opgewaardeerd naar een supergroep\",\n    \"conversation_created_channel\": \"Kanaal gemaakt\",\n    \"conversation_changed_channel_name\": \"Kanaalnaam gewijzigd\",\n    \"conversation_changed_channel_photo\": \"Kanaalfoto bijgewerkt\",\n    \"conversation_removed_channel_photo\": \"Kanaalfoto verwijderd\",\n    \"conversation_pinned_message\": \"heeft bericht vastgezet\",\n    \"conversation_scored_X\": \"{'one': '{} punt', 'other': '{} punten'}\",\n    \"conversation_message_sent\": \"heeft je een bericht gestuurd\",\n    \"conversation_forwarded_X_messages\": \"{'one': 'heeft {} bericht doorgestuurd', 'other': 'heeft {} berichten doorgestuurd'}\",\n    \"conversation_unknown_user\": \"Iemand\",\n    \"conversation_unknown_chat\": \"Onbekende chat\",\n    \"message_service_created_group\": \"heeft de groep: {group-name} aangemaakt\",\n    \"message_service_changed_group_name\": \"de groepsnaam is gewijzigd naar {group-name}\",\n    \"message_service_changed_group_photo\": \"heeft de groepsafbeelding gewijzigd\",\n    \"message_service_removed_group_photo\": \"heeft de groepsafbeelding verwijderd\",\n    \"message_service_invited_user\": \"heeft {user} uitgenodigd\",\n    \"message_service_invited_users\": \"{user} en {num-more} andere uitgenodigd\",\n    \"message_service_returned_to_group\": \"Teruggekeerd naar de groep\",\n    \"message_service_kicked_user\": \"{user} verwijderd\",\n    \"message_service_left_group\": \"heeft de groep verlaten\",\n    \"message_service_joined_by_link\": \"is nu lid van de groep via uitnodigingslink\",\n    \"message_service_joined\": \"is nu lid van de groep\",\n    \"message_service_pinned_message\": \"heeft «{message}» vastgezet\",\n    \"message_service_phonecall_incoming\": \"Inkomende oproep\",\n    \"message_service_phonecall_outgoing\": \"Uitgaande oproep\",\n    \"message_service_phonecall_missed\": \"Gemiste oproep\",\n    \"message_service_phonecall_canceled\": \"Oproep geannuleerd\",\n    \"message_service_phonecall\": \"Oproep {duration}\",\n    \"message_service_scored_game\": \"{scored} behaald met {message}\",\n    \"message_service_unsupported_action\": \"Ongeldige actie {action}\",\n    \"message_service_bot_intro_header\": \"Wat kan deze bot? \",\n    \"message_service_converted_to_supergroup\": \"heeft de groep opgewaardeerd naar een supergroep\",\n    \"message_service_created_channel\": \"Kanaal gemaakt\",\n    \"message_service_changed_channel_name\": \"Kanaalnaam gewijzigd naar {channel-name}\",\n    \"message_service_changed_channel_photo\": \"Kanaalfoto bijgewerkt\",\n    \"message_service_removed_channel_photo\": \"Kanaalfoto verwijderd\",\n    \"message_service_scored_X\": \"{'one': '{} punt', 'other': '{} punten'}\",\n    \"message_service_payment_sent\": \"Betaling verzonden\",\n    \"message_service_screenshot_taken\": \"heeft een schermafdruk gemaakt!\",\n    \"message_admin_badge\": \"beheerder\",\n    \"message_action_reply\": \"Antwoord\",\n    \"message_action_edit\": \"Wijzig\",\n    \"message_action_delete\": \"Verwijder\",\n    \"message_action_report\": \"Melden\",\n    \"message_action_forward\": \"Doorsturen\",\n    \"message_action_select\": \"Selecteren\",\n    \"message_action_cancel\": \"Annuleren\",\n    \"message_action_retry\": \"Opnieuw proberen\",\n    \"error_modal_warning_title\": \"Waarschuwing\",\n    \"error_modal_bad_request_title\": \"Fout\",\n    \"error_modal_unauthorized_title\": \"Geen bevoegdheid\",\n    \"error_modal_forbidden_title\": \"Toegang geweigerd\",\n    \"error_modal_not_found_title\": \"Niet gevonden\",\n    \"error_modal_network_title\": \"Netwerkfout\",\n    \"error_modal_flood_title\": \"Te snel\",\n    \"error_modal_internal_title\": \"Serverfout\",\n    \"error_modal_alert\": \"Waarschuwing\",\n    \"error_modal_email_unconfirmed_title\": \"Bijna klaar!\",\n    \"error_modal_email_unconfirmed_descripion\": \"Controleer je e-mail om de twee-staps-verificatie in te schakelen (kijk voor de zekerheid ook in de ongewenste post).\",\n    \"error_modal_password_success_title\": \"Gelukt!\",\n    \"error_modal_password_disabled_title\": \"Wachtwoord uitgeschakeld\",\n    \"error_modal_media_not_supported_title\": \"Niet ondersteunde media\",\n    \"error_modal_phonecalls_not_supported_title\": \"Oproepen zijn nog niet beschikbaar\",\n    \"error_modal_recovery_na_title\": \"Sorry\",\n    \"error_modal_network_description\": \"Controleer je internetverbinding.\",\n    \"error_modal_firstname_invali_description\": \"De voornaam die je hebt ingegeven is ongeldig.\",\n    \"error_modal_lastname_invalid_description\": \"De achternaam die je hebt ingegeven is ongeldig.\",\n    \"error_modal_phone_invalid_description\": \"Het ingevoerde telefoonnummer is ongeldig.\",\n    \"error_modal_users_too_much_description\": \"Deze groep is al vol\",\n    \"error_modal_photo_dimensions_invalid_description\": \"Het formaat van de foto is ongeldig, kies een ander bestand.\",\n    \"error_modal_video_file_invalid_description\": \"De extensie van het videobestand is ongeldig of wordt niet ondersteund, kies een ander bestand.\",\n    \"error_modal_photo_too_small_description\": \"De gekozen foto is te klein.\",\n    \"error_modal_no_phone_user_description_md\": \"Sorry, er is geen **Telegram**-account gevonden voor het opgegeven nummer.\",\n    \"error_modal_no_phone_users_description_md\": \"Sorry, er zijn geen **Telegram**-accounts gevonden voor de opgegeven nummers.\",\n    \"error_modal_username_invalid_description\": \"Sorry, deze gebruikersnaam is niet toegestaan.\",\n    \"error_modal_phonebook_required_description\": \"Telegram heeft toegang nodig tot je telefoonboek om contacten te importeren.\",\n    \"error_modal_username_occupied_description\": \"Sorry, deze gebruikersnaam is al bezet.\",\n    \"error_modal_media_not_supported_description\": \"Je browser kan dit mediabestand niet afspelen. Probeer het bestand te downloaden en af te spelen in een vrijstaande afspeelapplicatie.\",\n    \"error_modal_username_not_found_description\": \"Geen Telegram-account gevonden voor de opgegeven gebruikersnaam. \",\n    \"error_modal_phonecalls_not_supported_description_md\": \"Helaas zijn oproepen nog niet beschikbaar in de Web-versie.\\n\\nJe kunt {user} bellen via onze mobiele- of desktop-applicaties.\\n{download-link: Download »}\",\n    \"error_modal_app_signup_forbidden_md\": \"Je hebt nog geen Telegram-account, **meld je eerst aan** via {signup-link: Android / iPhone} \",\n    \"error_modal_bad_request_description\": \"Éen van de parameters mist of is ongeldig.\",\n    \"error_modal_unauthorized_description\": \"Deze actie vereist authenticatie. {login-link: Inloggen}\",\n    \"error_modal_forbidden_description\": \"Je bent niet bevoegd deze bewerking uit te voeren.\",\n    \"error_modal_not_found_description\": \"De pagina werd niet gevonden.\",\n    \"error_modal_flood_description\": \"Je voert teveel acties tegelijkertijd uit. Probeer het later nog eens.\",\n    \"error_modal_internal_description\": \"Interne serverfout opgetreden. Probeer het later opnieuw.\",\n    \"error_modal_tech_details\": \"Klik voor technische details\",\n    \"error_modal_recovery_na_description\": \"Omdat je geen herstel-e-mailadres hebt opgegeven voor je wachtwoord zul je bij verlies van je wachtwoord je account moeten resetten.\",\n    \"error_modal_password_success_descripion\": \"Je wachtwoord voor twee-staps-verificatie is nu actief.\",\n    \"error_modal_password_disabled_descripion\": \"Twee-staps-verificatie uitgeschakeld.\",\n    \"error_modal_user_not_mutual_contact\": \"Deze gebruiker kan alleen door zijn/haar contacten worden uitgenodigd.\",\n    \"error_modal_invite_link_invalid\": \"De uitnodigingslink is ongeldig\",\n    \"error_modal_channel_not_accessible\": \"Sorry, dit kanaal is niet beschikbaar.\",\n    \"error_modal_not_contact_flood\": \"Je kunt momenteel alleen berichten sturen aan onderlingen contacten. {more-info-link: Meer info »}\",\n    \"error_modal_gelocation_na\": \"Huidige locatie kon niet worden vastgesteld\",\n    \"error_modal_2fa_recent_confirm\": \"De actieve gebruiker heeft de recente poging om dit account te resetten geannuleerd. Probeer het over 7 dagen nog eens.\",\n    \"error_modal_2fa_delayed_time_md\": \"Je account kan gereset worden over: **{time}**\",\n    \"head_mainmenu\": \"Hoofdmenu\",\n    \"head_telegram\": \"Telegram\",\n    \"head_new_group\": \"Nieuwe groep\",\n    \"head_new_contact\": \"Nieuw contact\",\n    \"head_contacts\": \"Contacten\",\n    \"head_contacts_title\": \"Contacten\",\n    \"head_telegram_faq\": \"Veelgestelde vragen\",\n    \"head_settings\": \"Instellingen\",\n    \"head_log_out\": \"Uitloggen\",\n    \"head_peer_more\": \"Meer\",\n    \"head_select_messages\": \"Berichten kiezen\",\n    \"head_media_photos\": \"Foto's\",\n    \"head_media_video\": \"Video's\",\n    \"head_media_documents\": \"Bestanden\",\n    \"head_media_music\": \"Audio\",\n    \"head_media_links\": \"Gedeelde links\",\n    \"head_media_audio\": \"Spraakberichten\",\n    \"head_media_round\": \"Videoberichten\",\n    \"head_media_mymentions\": \"Vermelding\",\n    \"head_media_search\": \"Zoeken\",\n    \"head_about\": \"Over\",\n    \"head_clear_all\": \"Geschiedenis wissen\",\n    \"head_select\": \"Selecteren\",\n    \"head_typing\": \"aan het typen\",\n    \"head_pluralize_participants\": \"{'0': 'Geen leden', 'one': '1 lid', 'other': '{} leden'}\",\n    \"head_one_typing\": \"{name1} is aan het typen{dots}\",\n    \"head_two_typing\": \"{name1}, {name2}{dots}\",\n    \"head_many_typing\": \"{name1}+{names}{dots}\",\n    \"head_waiting_for_network\": \"Wachten op netwerk\",\n    \"head_retry\": \"Opnieuw proberen\",\n    \"head_connecting\": \"Verbinden\",\n    \"footer_twitter\": \"Twitter\",\n    \"im_new_group\": \"Nieuwe groep\",\n    \"im_new_contact\": \"Nieuw contact\",\n    \"im_contacts\": \"Contacten\",\n    \"im_chat_contacts_title\": \"Chats en contacten\",\n    \"im_settings\": \"Instellingen\",\n    \"im_conversations\": \"Chats\",\n    \"im_found_title\": \"Wereldwijd zoeken\",\n    \"im_messages\": \"Berichten\",\n    \"im_no_contacts\": \"Nog geen contacten\",\n    \"im_get_started_long\": \"Begin door een contact toe te voegen om mee te chatten.\",\n    \"im_add_contact\": \"Contact toevoegen\",\n    \"im_import_phonebook\": \"Telefoonboek importeren\",\n    \"im_get_started\": \"Aan de slag\",\n    \"im_welcome_text\": \"Welkom bij Telegram Web. Je kunt je profielfoto en naam altijd wijzigen via instellingen.\",\n    \"im_open_settings\": \"Instellingen openen\",\n    \"im_select_a_chat\": \"Kies een chat om met chatten te beginnen\",\n    \"im_loading_history\": \"Geschiedenis laden\",\n    \"im_media\": \"Media\",\n    \"im_media_photos\": \"Foto's\",\n    \"im_media_video\": \"Video's\",\n    \"im_media_documents\": \"Bestanden\",\n    \"im_media_audio\": \"Spraakberichten\",\n    \"im_media_round\": \"Videoberichten\",\n    \"im_media_music\": \"Audio\",\n    \"im_media_links\": \"Gedeelde links\",\n    \"im_media_mentions\": \"Vermeldingen en antwoorden\",\n    \"im_pluralize_participants\": \"{'0': 'Geen leden', 'one': '1 lid', 'other': '{} leden'}\",\n    \"im_show_recent_messages\": \"Recente berichten laten zien\",\n    \"im_show_all_messages\": \"Laat alle berichten zien\",\n    \"im_no_messages\": \"Nog geen berichten\",\n    \"im_one_typing\": \"{name1} is aan het typen{dots}\",\n    \"im_two_typing\": \"{name1} en {name2} zijn aan het typen{dots}\",\n    \"im_many_typing\": \"{name1}, {name2} en {count} meer zijn aan het typen{dots}\",\n    \"im_conversation_single_typing\": \"aan het typen{dots}\",\n    \"im_conversation_group_typing\": \"{name} is aan het typen{dots}\",\n    \"im_delete_chat\": \"Chat verwijderen\",\n    \"im_clear_history\": \"Geschiedenis wissen\",\n    \"im_delete\": \"Verwijder {count}\",\n    \"im_forward\": \"Doorsturen {count}\",\n    \"im_reply\": \"Antwoord\",\n    \"im_edit\": \"Wijzig\",\n    \"im_start\": \"Begin\",\n    \"im_channel_join\": \"Lid worden\",\n    \"im_channel_mute\": \"Geluid uit\",\n    \"im_channel_unmute\": \"Stil uitschakelen\",\n    \"im_report\": \"Melden {count}\",\n    \"im_reply_loading\": \"Laden{dots}\",\n    \"im_X_forwarded_messages\": \"{'one': 'heeft {} bericht doorgestuurd', 'other': 'heeft {} berichten doorgestuurd'}\",\n    \"im_photos_drop_text\": \"Sleep foto's hierheen om te versturen.\",\n    \"im_message_field_placeholder\": \"Bericht schrijven\",\n    \"im_broadcast_field_placeholder\": \"Massabericht... \",\n    \"im_emoji_tab\": \"Emoji\",\n    \"im_stickers_tab\": \"Stickers\",\n    \"im_stickers_tab_recent\": \"Veelgebruikt\",\n    \"im_voice_record_title\": \"Neem een bericht op\",\n    \"im_media_attach_title\": \"Media versturen\",\n    \"im_attach_file_title\": \"Bestand versturen\",\n    \"im_emoji_btn_title\": \"Emoji invoegen\",\n    \"im_submit_message\": \"Stuur\",\n    \"im_submit_edit_message\": \"Opslaan\",\n    \"im_edit_message_title\": \"Bericht wijzigen\",\n    \"im_voice_recording_label\": \"Buiten het veld loslaten om te annuleren\",\n    \"im_voice_recording_cancel_label\": \"Loslaten om te annuleren\",\n    \"im_voice_processing_label\": \"Verwerken{dots}\",\n    \"login_sign_in\": \"Inloggen\",\n    \"login_enter_number_description_md\": \"Please choose your country and enter your full phone number.\\n\\nNote that you need an existing account to log in to Telegram Web. To sign up for Telegram, use one of our {apps-link: mobile apps}.\",\n    \"login_incorrect_number\": \"Onjuist telefoonnummer\",\n    \"login_code_input_placeholder\": \"Code\",\n    \"login_tel_input_placeholder\": \"Telefoonnummer\",\n    \"login_country_select_placeholder\": \"Land\",\n    \"login_generating_key\": \"Sleutels genereren\",\n    \"login_generating_keys_info\": \"Sleutels worden eenmalig gegenereerd. Dit kan een paar minuten duren op langzamere apparaten, even geduld.\",\n    \"login_edit_number\": \"Telefoonnummer wijzigen\",\n    \"login_enter_code_label_md\": \"We hebben de code naar je andere **Telegram**-app gestuurd.\\nGeef de code hieronder in.\",\n    \"login_enter_sms_code_label_md\": \"We hebben je een activatiecode per sms-bericht gestuurd.\\nGeef de code hieronder in.\",\n    \"login_enter_call_code_label_md\": \"We bellen je om een code te dicteren.\\nGeef de code hieronder in.\",\n    \"login_code_remaining\": \"Je kunt over {remaining} weer een SMS aanvragen.\",\n    \"login_call_remaining\": \"Je kunt over {remaining} wel een oproep aanvragen.\",\n    \"login_code_not_received\": \"Code sturen via SMS\",\n    \"login_code_not_received_call\": \"Code sturen via oproep.\",\n    \"login_code_requesting\": \"Bezig met aanvragen code\",\n    \"login_incorrect_sms_code\": \"Ongeldige activatiecode\",\n    \"login_number_input_placeholder\": \"Code invoeren\",\n    \"login_checking_code\": \"Code controleren\",\n    \"login_your_info\": \"Je gegevens\",\n    \"login_fulll_name_label\": \"Voer je volledige naam in om een Telegram account aan te maken.\",\n    \"login_incorrect_first_name\": \"Ongeldige voornaam\",\n    \"login_first_name\": \"Voornaam\",\n    \"login_incorrect_last_name\": \"Ongeldige achternaam\",\n    \"login_last_name\": \"Achternaam\",\n    \"login_signing_up\": \"Bezig met aanmelden\",\n    \"login_sign_up\": \"Aanmelden\",\n    \"login_about_title\": \"Over\",\n    \"login_about_hide\": \"verbergen\",\n    \"login_try_desktop\": \"For best experience on your computer, try {telegram-link}\",\n    \"login_try_desktop_btn\": \"Download Telegram\",\n    \"login_try_desktop_short_btn\": \"Download\",\n    \"login_about_desc1_md\": \"De Telegram web-app is een gratis,  snelle en veilige manier om de meeste **Telegram**-functies direct in je browser te kunnen gebruiken.\",\n    \"login_about_desc2_md\": \"De app loopt altijd gelijk met de Telegram-app op je mobiele apparaat,  wat het een perfecte applicatie maakt voor chatten en bestanden delen. \",\n    \"login_about_desc3_md\": \"Onze {source-link: broncode} is vrij beschikbaar,  dus iedereen kan een bijdrage leveren.\",\n    \"login_about_intro\": \"Welkom bij de officiële Telegram web-app.\",\n    \"login_about_learn\": \"Meer informatie\",\n    \"login_password_title\": \"Wachtwoord\",\n    \"login_password_label\": \"Twee-staps-verificatie ingeschakeld. Je account is met een extra wachtwoord beveiligd.\",\n    \"login_password_forgot_link\": \"Wachtwoord vergeten?\",\n    \"login_account_reset\": \"Account resetten\",\n    \"login_password\": \"Je wachtwoord\",\n    \"login_incorrect_password\": \"Ongeldig wachtwoord\",\n    \"login_checking_password\": \"Controleren\",\n    \"login_recovery_title\": \"Wachtwoord vergeten?\",\n    \"login_code_placeholder\": \"Code\",\n    \"login_code_incorrect\": \"Ongeldige code\",\n    \"login_recovery_description_md\": \"We hebben een herstelcode gestuurd naar het opgegeven e-mailadres:\\n\\n{email}\\n\\nControleer je e-mail en geef de 6-cijferige code in die we je hebben gestuurd.\",\n    \"password_recover_active\": \"Controleren...\",\n    \"password_recover_submit\": \"Versturen\",\n    \"login_controller_unknown_country\": \"Onbekend\",\n    \"message_forwarded_message\": \"Doorgestuurd bericht\",\n    \"message_via_bot\": \"via {bot}\",\n    \"message_edited\": \"gewijzigd\",\n    \"message_forwarded_message_mobile\": \"Doorgestuurd van {from}\",\n    \"message_forwarded_via_message_mobile\": \"Doorgestuurd van {from} via {bot}\",\n    \"message_attach_audio_message\": \"Spraakbericht\",\n    \"message_attach_audio_play\": \"Afspelen\",\n    \"message_attach_document_open\": \"Openen\",\n    \"message_attach_document_download\": \"Downloaden\",\n    \"message_attach_document_save\": \"Bestand opslaan\",\n    \"message_attach_video_video\": \"Video\",\n    \"message_attach_video_download\": \"Downloaden\",\n    \"message_attach_video_save\": \"Bestand opslaan\",\n    \"message_attach_video_play\": \"Video afspelen\",\n    \"message_attach_unsupported\": \"Dit bericht wordt niet ondersteund door deze versie van Telegram Web. Werk Telegram bij om dit bericht te bekijken: {link}.\",\n    \"message_attach_unsupported_desktop\": \"Dit bericht wordt niet ondersteund door Telegram Web. Probeer {link}.\",\n    \"message_attach_notweb\": \"Dit bericht wordt nog niet ondersteund door Telegram Web. Gebruik Telegram voor je mobiel om dit te bekijken: {link}.\",\n    \"conversation_select_modal_title\": \"Chat selecteren\",\n    \"conversation_select_modal_chats_contacts\": \"Chats en contacten\",\n    \"conversation_one_selected\": \"{name1}\",\n    \"conversation_two_selected\": \"{name1} en {name2}\",\n    \"conversation_many_selected\": \"{name1}, {name2} en {count} meer\",\n    \"phonebook_modal_title\": \"Telefoonboek\",\n    \"phonebook_modal_deselect_all\": \"Alles deselecteren\",\n    \"phonebook_modal_select_all\": \"Alles selecteren\",\n    \"phonebook_modal_empty\": \"Je telefoonboek is leeg.\",\n    \"phonebook_modal_submit_active\": \"Importeren\",\n    \"phonebook_modal_submit\": \"Contacten importeren\",\n    \"inactive_tab_title\": \"Telegram: Zzz...\",\n    \"inactive_title\": \"Such error, many tabs\",\n    \"inactive_description_md\": \"Telegram kan maar in één tabblad tegelijkertijd actief zijn met de app.\\nVernieuw deze pagina om het tabblad te gebruiken, of sluit het tabblad.\",\n    \"inactive_reload_btn\": \"Vernieuw app\",\n    \"push_action_mute1d\": \"Achtergrondmeldingen 1 dag stil.\",\n    \"push_action_settings\": \"Achtergrondmeldingsinstellingen\",\n    \"push_action_mute1d_mobile\": \"24u stil\",\n    \"push_action_settings_mobile\": \"Meldingsinstellingen\",\n    \"push_message_nopreview\": \"Je hebt een nieuw bericht\",\n    \"push_action_mute1d_success\": \"Meldingsinstellingen opgeslagen.\",\n    \"country_select_modal_country_ab\": \"Abchazië\",\n    \"country_select_modal_country_af\": \"Afghanistan\",\n    \"country_select_modal_country_ax\": \"Åland\",\n    \"country_select_modal_country_al\": \"Albanië\",\n    \"country_select_modal_country_dz\": \"Algerije\",\n    \"country_select_modal_country_as\": \"Amerikaans-Samoa\",\n    \"country_select_modal_country_ad\": \"Andorra\",\n    \"country_select_modal_country_ao\": \"Angola\",\n    \"country_select_modal_country_ai\": \"Anguilla\",\n    \"country_select_modal_country_ag\": \"Antigua en Barbuda\",\n    \"country_select_modal_country_ar\": \"Argentinië\",\n    \"country_select_modal_country_am\": \"Armenië\",\n    \"country_select_modal_country_aw\": \"Aruba\",\n    \"country_select_modal_country_sh_ac\": \"Ascension\",\n    \"country_select_modal_country_au\": \"Australië\",\n    \"country_select_modal_country_au_et\": \"Australische Externe Territoria\",\n    \"country_select_modal_country_at\": \"Oostenrijk\",\n    \"country_select_modal_country_az\": \"Azerbeidzjan\",\n    \"country_select_modal_country_bs\": \"Bahama's\",\n    \"country_select_modal_country_bh\": \"Bahrein\",\n    \"country_select_modal_country_bd\": \"Bangladesh\",\n    \"country_select_modal_country_bb\": \"Barbados\",\n    \"country_select_modal_country_ag_bar\": \"Barbuda\",\n    \"country_select_modal_country_by\": \"Wit-Rusland\",\n    \"country_select_modal_country_be\": \"België\",\n    \"country_select_modal_country_bz\": \"Belize\",\n    \"country_select_modal_country_bj\": \"Benin\",\n    \"country_select_modal_country_bm\": \"Bermuda\",\n    \"country_select_modal_country_bt\": \"Bhutan\",\n    \"country_select_modal_country_bo\": \"Bolivia\",\n    \"country_select_modal_country_bq\": \"Caribisch Nederland\",\n    \"country_select_modal_country_ba\": \"Bosnië en Herzegovina\",\n    \"country_select_modal_country_bw\": \"Botswana\",\n    \"country_select_modal_country_br\": \"Brazilië\",\n    \"country_select_modal_country_io\": \"Brits Indische Oceaanterritorium\",\n    \"country_select_modal_country_vg\": \"Britse Maagdeneilanden\",\n    \"country_select_modal_country_bn\": \"Brunei\",\n    \"country_select_modal_country_bg\": \"Bulgarije\",\n    \"country_select_modal_country_bf\": \"Burkina Faso\",\n    \"country_select_modal_country_mm\": \"Myanmar (Birma)\",\n    \"country_select_modal_country_bi\": \"Burundi\",\n    \"country_select_modal_country_kh\": \"Cambodja\",\n    \"country_select_modal_country_cm\": \"Kameroen\",\n    \"country_select_modal_country_ca\": \"Canada\",\n    \"country_select_modal_country_cv\": \"Kaapverdië\",\n    \"country_select_modal_country_ky\": \"Kaaimaneilanden\",\n    \"country_select_modal_country_cf\": \"Centraal-Afrikaanse Republiek\",\n    \"country_select_modal_country_td\": \"Tsjaad\",\n    \"country_select_modal_country_cl\": \"Chili\",\n    \"country_select_modal_country_cn\": \"China\",\n    \"country_select_modal_country_cx\": \"Christmaseiland\",\n    \"country_select_modal_country_cc\": \"Cocoseilanden\",\n    \"country_select_modal_country_co\": \"Colombia\",\n    \"country_select_modal_country_km\": \"Comoren\",\n    \"country_select_modal_country_cg\": \"Congo-Brazzaville\",\n    \"country_select_modal_country_cd\": \"Congo-Kinshasa\",\n    \"country_select_modal_country_ck\": \"Cookeilanden\",\n    \"country_select_modal_country_cr\": \"Costa Rica\",\n    \"country_select_modal_country_ci\": \"Ivoorkust\",\n    \"country_select_modal_country_hr\": \"Kroatië\",\n    \"country_select_modal_country_cu\": \"Cuba\",\n    \"country_select_modal_country_cw\": \"Curaçao\",\n    \"country_select_modal_country_cy\": \"Cyprus\",\n    \"country_select_modal_country_cz\": \"Tsjechië\",\n    \"country_select_modal_country_dk\": \"Denemarken\",\n    \"country_select_modal_country_dg\": \"Diego Garcia\",\n    \"country_select_modal_country_dj\": \"Djibouti\",\n    \"country_select_modal_country_dm\": \"Dominica\",\n    \"country_select_modal_country_do\": \"Dominicaanse Republiek\",\n    \"country_select_modal_country_tl\": \"Timor-Leste\",\n    \"country_select_modal_country_ec\": \"Ecuador\",\n    \"country_select_modal_country_eg\": \"Egypte\",\n    \"country_select_modal_country_sv\": \"El Salvador\",\n    \"country_select_modal_country_gq\": \"Equatoriaal-Guinea\",\n    \"country_select_modal_country_er\": \"Eritrea\",\n    \"country_select_modal_country_ee\": \"Estland\",\n    \"country_select_modal_country_et\": \"Ethiopië\",\n    \"country_select_modal_country_fk\": \"Falklandeilanden\",\n    \"country_select_modal_country_fo\": \"Faeröer\",\n    \"country_select_modal_country_fj\": \"Fiji\",\n    \"country_select_modal_country_fi\": \"Finland\",\n    \"country_select_modal_country_fr\": \"Frankrijk\",\n    \"country_select_modal_country_gf\": \"Frans-Guyana\",\n    \"country_select_modal_country_pf\": \"Frans-Polynesië\",\n    \"country_select_modal_country_ga\": \"Gabon\",\n    \"country_select_modal_country_gm\": \"Gambia\",\n    \"country_select_modal_country_ge\": \"Georgië\",\n    \"country_select_modal_country_de\": \"Duitsland\",\n    \"country_select_modal_country_gh\": \"Ghana\",\n    \"country_select_modal_country_gi\": \"Gibraltar\",\n    \"country_select_modal_country_gr\": \"Griekenland\",\n    \"country_select_modal_country_gl\": \"Groenland\",\n    \"country_select_modal_country_gd\": \"Grenada\",\n    \"country_select_modal_country_gp\": \"Guadeloupe\",\n    \"country_select_modal_country_gu\": \"Guam\",\n    \"country_select_modal_country_gt\": \"Guatemala\",\n    \"country_select_modal_country_gg\": \"Guernsey\",\n    \"country_select_modal_country_gn\": \"Guinee\",\n    \"country_select_modal_country_gw\": \"Guinee-Bissau\",\n    \"country_select_modal_country_gy\": \"Guyana\",\n    \"country_select_modal_country_ht\": \"Haïti\",\n    \"country_select_modal_country_hn\": \"Honduras\",\n    \"country_select_modal_country_hk\": \"Hongkong SAR China\",\n    \"country_select_modal_country_hu\": \"Hongarije\",\n    \"country_select_modal_country_is\": \"IJsland\",\n    \"country_select_modal_country_in\": \"India\",\n    \"country_select_modal_country_id\": \"Indonesië\",\n    \"country_select_modal_country_ir\": \"Iran\",\n    \"country_select_modal_country_iq\": \"Irak\",\n    \"country_select_modal_country_ie\": \"Ierland\",\n    \"country_select_modal_country_il\": \"Israël\",\n    \"country_select_modal_country_it\": \"Italië\",\n    \"country_select_modal_country_jm\": \"Jamaica\",\n    \"country_select_modal_country_sj\": \"Spitsbergen en Jan Mayen\",\n    \"country_select_modal_country_jp\": \"Japan\",\n    \"country_select_modal_country_je\": \"Jersey\",\n    \"country_select_modal_country_jo\": \"Jordanië\",\n    \"country_select_modal_country_kz\": \"Kazachstan\",\n    \"country_select_modal_country_ke\": \"Kenia\",\n    \"country_select_modal_country_ki\": \"Kiribati\",\n    \"country_select_modal_country_kp\": \"Noord-Korea\",\n    \"country_select_modal_country_kr\": \"Zuid-Korea\",\n    \"country_select_modal_country_kw\": \"Koeweit\",\n    \"country_select_modal_country_kg\": \"Kirgizië\",\n    \"country_select_modal_country_la\": \"Laos\",\n    \"country_select_modal_country_lv\": \"Letland\",\n    \"country_select_modal_country_lb\": \"Libanon\",\n    \"country_select_modal_country_ls\": \"Lesotho\",\n    \"country_select_modal_country_lr\": \"Liberia\",\n    \"country_select_modal_country_ly\": \"Libië\",\n    \"country_select_modal_country_li\": \"Liechtenstein\",\n    \"country_select_modal_country_lt\": \"Litouwen\",\n    \"country_select_modal_country_lu\": \"Luxemburg\",\n    \"country_select_modal_country_mo\": \"Macau SAR China\",\n    \"country_select_modal_country_mk\": \"Macedonië\",\n    \"country_select_modal_country_mg\": \"Madagaskar\",\n    \"country_select_modal_country_mw\": \"Malawi\",\n    \"country_select_modal_country_my\": \"Maleisië\",\n    \"country_select_modal_country_mv\": \"Maldiven\",\n    \"country_select_modal_country_ml\": \"Mali\",\n    \"country_select_modal_country_mt\": \"Malta\",\n    \"country_select_modal_country_mh\": \"Marshalleilanden\",\n    \"country_select_modal_country_mq\": \"Martinique\",\n    \"country_select_modal_country_mr\": \"Mauritanië\",\n    \"country_select_modal_country_mu\": \"Mauritius\",\n    \"country_select_modal_country_yt\": \"Mayotte\",\n    \"country_select_modal_country_mx\": \"Mexico\",\n    \"country_select_modal_country_fm\": \"Micronesië\",\n    \"country_select_modal_country_md\": \"Moldavië\",\n    \"country_select_modal_country_mc\": \"Monaco\",\n    \"country_select_modal_country_mn\": \"Mongolië\",\n    \"country_select_modal_country_me\": \"Montenegro\",\n    \"country_select_modal_country_ms\": \"Montserrat\",\n    \"country_select_modal_country_ma\": \"Marokko\",\n    \"country_select_modal_country_mz\": \"Mozambique\",\n    \"country_select_modal_country_na\": \"Namibië\",\n    \"country_select_modal_country_nr\": \"Nauru\",\n    \"country_select_modal_country_np\": \"Nepal\",\n    \"country_select_modal_country_nl\": \"Nederland\",\n    \"country_select_modal_country_nc\": \"Nieuw-Caledonië\",\n    \"country_select_modal_country_nz\": \"Nieuw-Zeeland\",\n    \"country_select_modal_country_ni\": \"Nicaragua\",\n    \"country_select_modal_country_ne\": \"Niger\",\n    \"country_select_modal_country_ng\": \"Nigeria\",\n    \"country_select_modal_country_nu\": \"Niue\",\n    \"country_select_modal_country_nf\": \"Norfolk\",\n    \"country_select_modal_country_mp\": \"Noordelijke Marianen\",\n    \"country_select_modal_country_no\": \"Noorwegen\",\n    \"country_select_modal_country_om\": \"Oman\",\n    \"country_select_modal_country_pk\": \"Pakistan\",\n    \"country_select_modal_country_pw\": \"Palau\",\n    \"country_select_modal_country_ps\": \"Palestijnse Territoria\",\n    \"country_select_modal_country_pa\": \"Panama\",\n    \"country_select_modal_country_pg\": \"Papoea-Nieuw-Guinea\",\n    \"country_select_modal_country_py\": \"Paraguay\",\n    \"country_select_modal_country_pe\": \"Peru\",\n    \"country_select_modal_country_ph\": \"Filipijnen\",\n    \"country_select_modal_country_pn\": \"Pitcairneilanden\",\n    \"country_select_modal_country_pl\": \"Polen\",\n    \"country_select_modal_country_pt\": \"Portugal\",\n    \"country_select_modal_country_pr\": \"Puerto Rico\",\n    \"country_select_modal_country_qa\": \"Qatar\",\n    \"country_select_modal_country_re\": \"Réunion\",\n    \"country_select_modal_country_ro\": \"Roemenië\",\n    \"country_select_modal_country_ru\": \"Rusland\",\n    \"country_select_modal_country_rw\": \"Rwanda\",\n    \"country_select_modal_country_bl\": \"Saint-Barthélemy\",\n    \"country_select_modal_country_sh\": \"Sint-Helena\",\n    \"country_select_modal_country_kn\": \"Saint Kitts en Nevis\",\n    \"country_select_modal_country_lc\": \"Saint Lucia\",\n    \"country_select_modal_country_mf\": \"Sint-Maarten (Frankrijk)\",\n    \"country_select_modal_country_pm\": \"Saint-Pierre en Miquelon\",\n    \"country_select_modal_country_vc\": \"Saint Vincent en de Grenadines\",\n    \"country_select_modal_country_ws\": \"Samoa\",\n    \"country_select_modal_country_sm\": \"San Marino\",\n    \"country_select_modal_country_st\": \"Sao Tomé en Principe\",\n    \"country_select_modal_country_sa\": \"Saoedi-Arabië\",\n    \"country_select_modal_country_sn\": \"Senegal\",\n    \"country_select_modal_country_rs\": \"Servië\",\n    \"country_select_modal_country_sc\": \"Seychellen\",\n    \"country_select_modal_country_sl\": \"Sierra Leone\",\n    \"country_select_modal_country_sg\": \"Singapore\",\n    \"country_select_modal_country_nl_bq3\": \"Sint Eustatius\",\n    \"country_select_modal_country_sx\": \"Sint Maarten\",\n    \"country_select_modal_country_sk\": \"Slowakije\",\n    \"country_select_modal_country_si\": \"Slovenië\",\n    \"country_select_modal_country_sb\": \"Salomonseilanden\",\n    \"country_select_modal_country_so\": \"Somalië\",\n    \"country_select_modal_country_za\": \"Zuid-Afrika\",\n    \"country_select_modal_country_gs\": \"Zuid-Georgia en de Zuidelijke Sandwicheilanden\",\n    \"country_select_modal_country_ge_so\": \"Zuid-Ossetië\",\n    \"country_select_modal_country_ss\": \"Zuid-Soedan\",\n    \"country_select_modal_country_es\": \"Spanje\",\n    \"country_select_modal_country_lk\": \"Sri Lanka\",\n    \"country_select_modal_country_sd\": \"Soedan\",\n    \"country_select_modal_country_sr\": \"Suriname\",\n    \"country_select_modal_country_sj_no\": \"Spitsbergen\",\n    \"country_select_modal_country_sz\": \"Swaziland\",\n    \"country_select_modal_country_se\": \"Zweden\",\n    \"country_select_modal_country_ch\": \"Zwitserland\",\n    \"country_select_modal_country_sy\": \"Syrië\",\n    \"country_select_modal_country_tw\": \"Taiwan\",\n    \"country_select_modal_country_tj\": \"Tadzjikistan\",\n    \"country_select_modal_country_tz\": \"Tanzania\",\n    \"country_select_modal_country_th\": \"Thailand\",\n    \"country_select_modal_country_tg\": \"Togo\",\n    \"country_select_modal_country_tk\": \"Tokelau\",\n    \"country_select_modal_country_to\": \"Tonga\",\n    \"country_select_modal_country_tt\": \"Trinidad en Tobago\",\n    \"country_select_modal_country_tn\": \"Tunesië\",\n    \"country_select_modal_country_tr\": \"Turkije\",\n    \"country_select_modal_country_tm\": \"Turkmenistan\",\n    \"country_select_modal_country_tc\": \"Turks- en Caicoseilanden\",\n    \"country_select_modal_country_tv\": \"Tuvalu\",\n    \"country_select_modal_country_ug\": \"Oeganda\",\n    \"country_select_modal_country_ua\": \"Oekraïne\",\n    \"country_select_modal_country_ae\": \"Verenigde Arabische Emiraten\",\n    \"country_select_modal_country_uk\": \"Verenigd Koninkrijk\",\n    \"country_select_modal_country_us\": \"Verenigde Staten\",\n    \"country_select_modal_country_uy\": \"Uruguay\",\n    \"country_select_modal_country_vi\": \"Amerikaanse Maagdeneilanden\",\n    \"country_select_modal_country_uz\": \"Oezbekistan\",\n    \"country_select_modal_country_vu\": \"Vanuatu\",\n    \"country_select_modal_country_ve\": \"Venezuela\",\n    \"country_select_modal_country_va\": \"Vaticaanstad\",\n    \"country_select_modal_country_vn\": \"Vietnam\",\n    \"country_select_modal_country_wf\": \"Wallis en Futuna\",\n    \"country_select_modal_country_ye\": \"Jemen\",\n    \"country_select_modal_country_zm\": \"Zambia\",\n    \"country_select_modal_country_tz_uk\": \"Zanzibar\",\n    \"country_select_modal_country_zw\": \"Zimbabwe\"\n}"
  },
  {
    "path": "app/js/locales/pt-br.json",
    "content": "{\n    \"modal_search\": \"Buscar\",\n    \"modal_close\": \"Fechar\",\n    \"modal_edit\": \"Editar\",\n    \"modal_cancel\": \"Cancelar\",\n    \"modal_more\": \"Mais...\",\n    \"modal_next\": \"Próximo\",\n    \"modal_ok\": \"OK\",\n    \"modal_done\": \"Pronto\",\n    \"group_modal_info\": \"Informações do Grupo\",\n    \"group_modal_pluralize_participants\": \"{'0': 'Nenhum membro', 'one': '1 membro', 'other': '{} membros'}\",\n    \"group_modal_pluralize_online_participants\": \"{'one': '1 online', 'other': '{} online'}\",\n    \"group_modal_pluralize_subscribers\": \"{'0': 'Nenhum inscrito', 'one': '1 inscrito', 'other': '{} inscritos'}\",\n    \"group_modal_participants\": \"{total}, {online}\",\n    \"group_modal_add_member\": \"Adicionar membro\",\n    \"group_modal_return\": \"Retornar ao grupo\",\n    \"group_modal_update_photo\": \"Atualizar foto\",\n    \"group_modal_update_active\": \"Atualizando\",\n    \"group_modal_menu_more\": \"Mais\",\n    \"group_modal_menu_delete_photo\": \"Apagar foto\",\n    \"group_modal_menu_edit_group\": \"Editar grupo\",\n    \"group_modal_menu_leave\": \"Sair\",\n    \"group_modal_menu_delete_group\": \"Apagar e sair\",\n    \"group_modal_menu_clear_history\": \"Limpar histórico\",\n    \"group_modal_delete_group\": \"Apagar grupo\",\n    \"group_modal_join\": \"Entrar no Grupo\",\n    \"group_modal_settings\": \"Configurações\",\n    \"group_modal_notifications\": \"Notificações\",\n    \"group_modal_menu_share_link\": \"Convidar ao grupo via link\",\n    \"group_modal_migrate_to_supergroup\": \"Converter em supergrupo\",\n    \"group_modal_members\": \"Membros\",\n    \"group_modal_members_kick\": \"Remover\",\n    \"group_modal_migrate_header\": \"Limite de membros alcançado\",\n    \"group_modal_migrate_desc\": \"Para ir além do limite e ter funcionalidades adicionais, converta em um supergrupo:\",\n    \"group_modal_migrate_item1\": \"Supergrupos podem ter até 200.000 membros\",\n    \"group_modal_migrate_item2\": \"• Novos membros veêm todo o histórico do chat\",\n    \"group_modal_migrate_item3\": \"Administradores apagam mensagens de todos\",\n    \"group_modal_migrate_item4\": \"Notificações são silenciadas por padrão\",\n    \"channel_modal_info\": \"Info do canal\",\n    \"channel_modal_description\": \"Descrição\",\n    \"channel_modal_share_link\": \"Compartilhar link\",\n    \"channel_modal_share_loading\": \"Carregando{dots}\",\n    \"channel_modal_menu_edit\": \"Editar canal\",\n    \"channel_modal_join\": \"Entrar no canal\",\n    \"channel_modal_add_member\": \"Convidar membros\",\n    \"channel_modal_leave_channel\": \"Sair do canal\",\n    \"channel_modal_delete_channel\": \"Apagar canal\",\n    \"country_select_modal_title\": \"País\",\n    \"settings_modal_title\": \"Configurações\",\n    \"settings_modal_menu_more\": \"Mais\",\n    \"settings_modal_delete_photo\": \"Apagar foto do perfil\",\n    \"settings_modal_set_photo\": \"Definir foto do perfil\",\n    \"settings_modal_photo_updating\": \"Atualizando\",\n    \"settings_modal_edit_profile\": \"Editar perfil\",\n    \"settings_modal_edit_username\": \"Alterar o nome de usuário\",\n    \"settings_modal_empty_username_set\": \"Definir nome de usuário\",\n    \"settings_modal_terminate_sessions\": \"Terminar todas as sessões\",\n    \"settings_modal_active_sessions\": \"Sessões ativas\",\n    \"settings_modal_settings\": \"Configurações\",\n    \"settings_modal_notification_alert\": \"Alertas de notificação\",\n    \"settings_modal_notification_push\": \"Notificações PUSH\",\n    \"settings_modal_vibrate\": \"Vibrar\",\n    \"settings_modal_sounds\": \"Sons\",\n    \"settings_modal_language\": \"Idioma\",\n    \"settings_modal_notifications\": \"Notificações na área de trabalho\",\n    \"settings_modal_pushes\": \"Notificações em segundo plano\",\n    \"settings_modal_message_preview\": \"Prévia de mensagens\",\n    \"settings_modal_sound\": \"Som\",\n    \"settings_modal_enter_send_description_md\": \"**Enter** - enviar mensagem, **Shift + Enter** - nova linha\",\n    \"settings_modal_ctrl_enter_send_description_md\": \"**Ctrl + Enter** - enviar mensagem, **Enter** - nova linha\",\n    \"settings_modal_send_on_enter\": \"Enviar com Enter\",\n    \"settings_switch_back_to_desktop\": \"Voltar para o layout Desktop\",\n    \"settings_modal_about\": \"Sobre\",\n    \"settings_modal_source_code_github\": \"Código-fonte no GitHub\",\n    \"settings_modal_follow_us_twitter\": \"Siga-nos no Twitter!\",\n    \"settings_modal_recent_updates\": \"Últimas atualizações (ver. {version})\",\n    \"settings_modal_set_password\": \"Definir senha adicional\",\n    \"settings_modal_change_password\": \"Alterar senha\",\n    \"settings_modal_disable_password\": \"Desativar\",\n    \"settings_modal_disable_password_mobile\": \"Desativar senha\",\n    \"settings_modal_password_email_pending\": \"Clique no link enviado para {email} para concluir a Verificação em Duas Etapas.\",\n    \"settings_modal_password_email_pending_cancel\": \"Cancelar\",\n    \"settings_modal_password_email_pending_cancel_mobile\": \"Cancelar senha\",\n    \"settings_modal_show_sensitive_content\": \"Mostrar Conteúdo Sensível\",\n    \"password_delete_title\": \"Desativar senha\",\n    \"password_change_title\": \"Verificação em Duas Etapas\",\n    \"password_current_placeholder\": \"Insira a sua senha atual\",\n    \"password_create_placeholder\": \"Insira uma senha\",\n    \"password_new_placeholder\": \"Insira a sua nova senha\",\n    \"password_confirm_placeholder\": \"Insira sua senha novamente\",\n    \"password_hint_placeholder\": \"Insira uma dica de senha\",\n    \"password_email_placeholder\": \"Definir e-mail de recuperação\",\n    \"password_create_description\": \"Você pode configurar uma senha que será requisitada quando você entrar em um novo dispositivo, além do código que você receberá por SMS. \",\n    \"password_create_active\": \"Salvando...\",\n    \"password_create_submit\": \"Salvar\",\n    \"password_delete_active\": \"Apagando...\",\n    \"password_delete_submit\": \"Apagar senha\",\n    \"sessions_modal_title\": \"Sessões ativas\",\n    \"sessions_modal_loading\": \"Carregando{dots}\",\n    \"sessions_modal_current_session\": \"Sessão atual\",\n    \"sessions_modal_session_online\": \"online\",\n    \"sessions_modal_terminate_one\": \"Encerrar\",\n    \"sessions_modal_terminate_all\": \"Terminar todas as outras sessões\",\n    \"sessions_modal_active_sessions\": \"Sessões ativas\",\n    \"stickerset_modal_title_loading\": \"Pacote de Sticker\",\n    \"stickerset_modal_install\": \"Adicionar Stickers\",\n    \"stickerset_modal_uninstall\": \"Remover stickers\",\n    \"stickerset_modal_share\": \"Compartilhar\",\n    \"stickerset_modal_loading\": \"Carregando{dots}\",\n    \"page_title_pluralize_notifications\": \"{'0': 'Sem notificações', 'one': '1 notificação', 'other': '{} notificações'}\",\n    \"profile_edit_modal_title\": \"Editar perfil\",\n    \"profile_edit_first_name\": \"Nome\",\n    \"profile_edit_last_name\": \"Sobrenome\",\n    \"profile_edit_submit\": \"Salvar\",\n    \"profile_edit_submit_active\": \"Salvando...\",\n    \"username_edit_modal_title\": \"Alterar o nome de usuário\",\n    \"username_edit_placeholder\": \"Nome de usuário\",\n    \"username_edit_description_md\": \"Você pode escolher um nome de usuário no **Telegram**. Assim, outras pessoas poderão te encontrar pelo nome de usuário e entrar em contato sem precisar saber seu telefone.\\n\\nVocê pode usar a-z, 0-9 e underline. O tamanho mínimo é de 5 caracteres.\",\n    \"username_edit_submit\": \"Salvar\",\n    \"username_edit_submit_active\": \"Salvando...\",\n    \"user_modal_menu_more\": \"Mais\",\n    \"user_modal_send_message\": \"Enviar mensagem\",\n    \"user_modal_edit_contact\": \"Editar contato\",\n    \"user_modal_delete_contact\": \"Apagar contato\",\n    \"user_modal_add_contact\": \"Adicionar aos contatos\",\n    \"user_modal_share_contact\": \"Compartilhar contato\",\n    \"user_modal_block_user\": \"Bloquear usuário\",\n    \"user_modal_unblock_user\": \"Desbloquear usuário\",\n    \"user_modal_clear_history\": \"Limpar histórico\",\n    \"user_modal_delete_chat\": \"Apagar Conversa\",\n    \"user_modal_add_to_group\": \"Adicionar ao grupo\",\n    \"user_modal_info\": \"Informação\",\n    \"user_modal_phone\": \"Telefone\",\n    \"user_modal_about\": \"Sobre\",\n    \"user_modal_bot_settings\": \"Configurações\",\n    \"user_modal_bot_help\": \"Ajuda\",\n    \"user_modal_username\": \"Nome de usuário\",\n    \"user_modal_settings\": \"Configurações\",\n    \"user_modal_notifications\": \"Notificações\",\n    \"user_modal_contact_info\": \"Informação do contato\",\n    \"media_modal_photo\": \"Foto\",\n    \"media_modal_photo_index\": \"Foto {pos} de {count}\",\n    \"media_modal_video\": \"Vídeo\",\n    \"media_modal_forward\": \"Encaminhar\",\n    \"media_modal_download\": \"Baixar\",\n    \"media_modal_delete\": \"Apagar\",\n    \"game_modal_share_game\": \"Compartilhar Jogo\",\n    \"game_modal_share_score\": \"Compartilhar Pontuação\",\n    \"error_browser_no_local_file_system_image_md\": \"Seu navegador não suporta {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem} a característica necessária para abrir essa imagem.\\nInstale o {chrome-link: http://google.com/chrome | Google Chrome} ou use o {telegram-link: https://telegram.org/ | aplicativo mobile} para isso.\",\n    \"error_image_download_failed\": \"Falha ao baixar\",\n    \"error_browser_no_local_file_system_video_md\": \"Seu navegador não suporta {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | LocalFileSystem} a característica necessária para reproduzir esse vídeo.\\nInstale o {chrome-link: http://google.com/chrome | Google Chrome} ou use o {telegram-link: https://telegram.org/ | aplicativo mobile} para isso.\",\n    \"error_video_download_failed\": \"Falha ao baixar vídeo\",\n    \"unread_messages_split\": \"Mensagens não lidas\",\n    \"user_name_deleted\": \"APAGADO\",\n    \"user_first_name_deleted\": \"APAGADO\",\n    \"user_name_saved_msgs\": \"Mensagens Salvas\",\n    \"user_status_online\": \"online\",\n    \"user_status_last_seen\": \"visto {0}\",\n    \"user_status_recently\": \"visto recentemente\",\n    \"user_status_last_week\": \"visto na última semana\",\n    \"user_status_last_month\": \"visto no último mês\",\n    \"user_status_long_ago\": \"visto há muito tempo\",\n    \"user_status_bot\": \"bot\",\n    \"user_status_service_notifications\": \"notificações de serviço\",\n    \"user_status_support\": \"suporte\",\n    \"user_status_bot_noprivacy\": \"tem acesso às mensagens\",\n    \"user_status_bot_privacy\": \"não tem acesso às mensagens\",\n    \"chat_title_deleted\": \"APAGADO\",\n    \"format_size_progress_mulitple\": \"{done} de {total} {parts}\",\n    \"format_size_progress\": \"{done} de {total}\",\n    \"relative_time_pluralize_minutes_ago\": \"{'one': '1 minuto atrás', 'other': '{} minutos atrás'}\",\n    \"relative_time_pluralize_hours_ago\": \"{'one': '1 hora atrás', 'other': '{} horas atrás'}\",\n    \"relative_time_just_now\": \"agora mesmo\",\n    \"changelog_modal_header_recent_updates_md\": \"Atualizações recentes no **Telegram Web**\",\n    \"changelog_modal_header_new_updates_md\": \"**Telegram Web** foi atualizado!\",\n    \"changelog_modal_title_current_version\": \"versão atual\",\n    \"changelog_modal_full_description_md\": \"Aplicativo de mensagens oficial e gratuito baseado na API do Telegram para velocidade e segurança.\\n\\nSoftware sob a licença GNU GPL versão 3.\",\n    \"changelog_modal_changelog_link\": \"Changelog\",\n    \"changelog_app_version\": \"Versão {version}\",\n    \"group_create_contacts_modal_title\": \"Novo grupo\",\n    \"group_create_modal_title\": \"Criar grupo\",\n    \"group_create_name\": \"Nome do grupo\",\n    \"group_create_submit\": \"Criar grupo\",\n    \"group_create_submit_active\": \"Criando...\",\n    \"group_edit_modal_title\": \"Editar grupo\",\n    \"group_edit_name\": \"Nome do grupo\",\n    \"group_edit_about\": \"Descrição do grupo\",\n    \"group_edit_submit\": \"Salvar\",\n    \"group_edit_submit_active\": \"Salvando...\",\n    \"channel_edit_modal_title\": \"Editar canal\",\n    \"channel_edit_name\": \"Nome do canal\",\n    \"channel_edit_about\": \"Descrição do canal\",\n    \"channel_edit_submit\": \"Salvar\",\n    \"channel_edit_submit_active\": \"Salvando...\",\n    \"group_invite_link_modal_title\": \"Link de convite\",\n    \"group_invite_link_link_label\": \"Copiar link\",\n    \"group_invite_link_loading\": \"Carregando...\",\n    \"group_invite_revoke_active\": \"Desativando...\",\n    \"group_invite_revoke\": \"Desativar\",\n    \"report_reason_modal_title\": \"Denunciar\",\n    \"report_reason_modal_spam\": \"Spam\",\n    \"report_reason_modal_violence\": \"Violência\",\n    \"report_reason_modal_pornography\": \"Pornografia\",\n    \"report_reason_modal_childabuse\": \"Abuso Infantil\",\n    \"report_reason_modal_other\": \"Outro\",\n    \"report_reason_modal_other_placeholder\": \"Descrição\",\n    \"report_reason_modal_submit_btn\": \"Enviar\",\n    \"clipboard_copied\": \"Copiado!\",\n    \"clipboard_press_ctrl_c\": \"Pressione Ctrl+C para copiar\",\n    \"clipboard_press_cmd_c\": \"Pressione ⌘+C para copiar\",\n    \"confirm_modal_logout\": \"Você tem certeza de que deseja sair?\",\n    \"confirm_modal_update_reload\": \"Uma nova versão do Telegram Web foi baixada. Atualizar?\",\n    \"confirm_modal_history_flush\": \"Você tem certeza? Não é possível desfazer!\",\n    \"confirm_modal_history_leave_flush_md\": \"Você tem certeza de que deseja apagar todo o histórico de mensagens e sair do grupo?\\n\\nNão é possível desfazer essa ação.\",\n    \"confirm_modal_leave_channel_md\": \"Você tem certeza de que deseja sair do canal?\\n\\nNão é possível desfazer essa ação.\",\n    \"confirm_modal_leave_group_md\": \"Você tem certeza de que deseja sair do grupo?\\n\\nNão é possível desfazer essa ação.\",\n    \"confirm_modal_terminate_sessions\": \"Tem certeza de que deseja sair todos os dispositivos, exceto o atual?\",\n    \"confirm_modal_terminate_session\": \"Você tem certeza de que deseja sair deste dispositivo?\",\n    \"confirm_modal_clipboard_file_send\": \"Você tem certeza de que deseja enviar arquivo(s) da área de transferência?\",\n    \"confirm_modal_clipboard_X_files_send\": \"{'one': 'Você tem certeza de que deseja enviar o arquivo da área de transferência?', 'other': 'Você tem certeza de que deseja enviar {} arquivos da área de transferência?'}\",\n    \"confirm_modal_message_delete\": \"Você tem certeza de que deseja apagar esta mensagem?\",\n    \"confirm_modal_delete_X_messages\": \"{'one': '{} mensagem', 'other': '{} mensagens'}\",\n    \"confirm_modal_delete_messages\": \"Você tem certeza de que deseja apagar {mensagens}?\",\n    \"confirm_modal_message_revoke\": \"Apagar para {recipient}\",\n    \"confirm_modal_message_revoke_recipient_chat\": \"todos\",\n    \"confirm_modal_delete_messages_for_everyone_chat\": \"Isso apagará para todos nessa conversa.\",\n    \"confirm_modal_delete_messages_for_you_only_pm\": \"Isso irá apagar somente para você, não para {user}.\",\n    \"confirm_modal_delete_messages_for_you_only_chat\": \"Isso irá apagar as mensagens somente para você, não para os outros membros do chat.\",\n    \"confirm_modal_photo_delete\": \"Você tem certeza de que deseja apagar a foto?\",\n    \"confirm_modal_contacts_import\": \"O Telegram sincronizará agora os seus contatos para encontrar seus amigos.\",\n    \"confirm_modal_login_phone_correct\": \"O número de telefone está correto?\",\n    \"confirm_modal_forward_to_peer\": \"Encaminhar para {peer}?\",\n    \"confirm_modal_forward_to_peer_success\": \"Mensagem encaminhada com sucesso.\",\n    \"confirm_modal_report_success\": \"Denúncia enviada\",\n    \"confirm_modal_send_to_peer\": \"Enviar para {peer}?\",\n    \"confirm_modal_share_file_peer\": \"Compartilhar com {peer}?\",\n    \"confirm_modal_invite_peer\": \"Convidar para {peer}?\",\n    \"confirm_modal_share_game\": \"Compartilhar o jogo com {peer}?\",\n    \"confirm_modal_apply_lang_with_reload_md\": \"Recarregar o aplicativo para aplicar o idioma?\",\n    \"confirm_modal_migrate_to_https_md\": \"O Telegram Web agora suporta criptografia SSL adicional. Você deseja alterar para HTTPS?\\nA versão HTTP será desabilitada em breve.\",\n    \"confirm_modal_resize_desktop_md\": \"Você deseja alterar para a versão desktop?\",\n    \"confirm_modal_resize_mobile_md\": \"Você deseja alterar para a versão mobile?\",\n    \"confirm_modal_recovery_email_empty_md\": \"Atenção! Você tem certeza de que não adicionará um e-mail de recuperação?\\n\\nSe você esquecer a sua senha, perderá o acesso à sua conta do Telegram.\",\n    \"confirm_modal_abort_password_setup\": \"Cancelar verificação em duas etapas?\",\n    \"confirm_modal_reset_account_md\": \"Você tem certeza?\\nNão é possível desfazer essa ação.\\n\\nVocê perderá todos os seus chats e mensagens, assim como todas as suas mídias e arquivos compartilhados se você prosseguir e apagar a sua conta,\",\n    \"confirm_modal_join_group_link\": \"Você deseja entrar no grupo \\\"{title}\\\"?\",\n    \"confirm_modal_join_channel_link\": \"Você deseja entrar no canal «{title}»?\",\n    \"confirm_modal_revoke_group_link\": \"Você tem certeza de que deseja desativar o link? Uma vez feito, ninguém conseguirá entrar no grupo por esse link.\",\n    \"confirm_modal_revoke_channel_link\": \"Você tem certeza de que deseja desativar o link? Uma vez feito, ninguém conseguirá entrar no canal por esse link.\",\n    \"confirm_modal_delete_channel_md\": \"Vocẽ tem certeza de que deseja apagar o canal?\\n\\nTodos os membros serão removidos e todas as mensagens serão perdidas.\",\n    \"confirm_modal_delete_group_md\": \"Vocẽ tem certeza de que deseja apagar o grupo?\\n\\nTodos os membros serão removidos e todas as mensagens serão perdidas.\",\n    \"confirm_modal_jump_ext_url_md\": \"Abrir esse link?\\n\\n{url}\",\n    \"confirm_modal_migrate_supergroup_md\": \"Por favor, note que os membros do grupo precisarão atualizar o aplicativo do Telegram até a última versão para ver seu supergrupo.\\n\\nDeseja converter este grupo?\",\n    \"confirm_modal_bot_access_phone\": \"O bot saberá seu número de telefone. Isso pode ser útil para a integração com outros serviços.\",\n    \"confirm_modal_bot_access_geo\": \"Isso irá enviar sua localização atual ao bot.\",\n    \"confirm_modal_bot_access_geo_inline\": \"Esse bot gostaria de saber sua localização todas as vezes que você enviar uma mensagem para ele. Isso pode ser utilizado para providenciar resultados específicos de localização.\",\n    \"confirm_modal_content_settings_sensitive_md\": \"**Desativar filtragem**\\nSe você desativar a filtragem, o Telegram exibirá conteúdo sensível de canais públicos em todos os seus dispositivos conectados.\",\n    \"confirm_modal_content_settings_sensitive_submit\": \"Desativar\",\n    \"confirm_modal_are_u_sure\": \"Você tem certeza?\",\n    \"confirm_modal_logout_submit\": \"Sair\",\n    \"confirm_modal_clear_history_submit\": \"Limpar histórico\",\n    \"confirm_modal_leave_chat_submit\": \"Sair\",\n    \"confirm_modal_delete_chat_submit\": \"Apagar chat\",\n    \"confirm_modal_clipboard_files_send_submit\": \"Enviar\",\n    \"confirm_modal_clipboard_file_send_submit\": \"Enviar\",\n    \"confirm_modal_message_delete_submit\": \"Apagar\",\n    \"confirm_modal_messages_delete_submit\": \"Apagar\",\n    \"confirm_modal_photo_delete_submit\": \"Apagar\",\n    \"confirm_modal_forward_message_submit\": \"Encaminhar mensagem\",\n    \"confirm_modal_share_photo_submit\": \"Encaminhar foto\",\n    \"confirm_modal_share_video_submit\": \"Encaminhar vídeo\",\n    \"confirm_modal_share_contact_submit\": \"Enviar contato\",\n    \"confirm_modal_share_file_submit\": \"Compartilhar arquivo\",\n    \"confirm_modal_reset_account_submit\": \"Apagar minha conta\",\n    \"contacts_modal_edit_list\": \"Editar\",\n    \"contacts_modal_edit_cancel\": \"Cancelar\",\n    \"contacts_modal_edit_delete\": \"Apagar\",\n    \"contacts_modal_pluralize_new_group_members\": \"{'one': '1 membro', 'other': '{} membros'}\",\n    \"contacts_modal_title\": \"Contatos\",\n    \"contacts_modal_new_contact\": \"Novo contato\",\n    \"contacts_modal_empty_list\": \"Sua lista de contatos está vazia. Você pode {import-link: adicionar um novo contato} pelo número de telefone.\",\n    \"conversations_modal_forward_title\": \"Encaminhar\",\n    \"conversations_modal_forward_submit\": \"Encaminhar\",\n    \"conversations_modal_select_recipients\": \"Selecione os destinatários\",\n    \"conversations_modal_recipients\": \"Destinatários:\",\n    \"conversations_modal_share_url_loading\": \"Carregando{dots}\",\n    \"conversations_modal_share_url_copy\": \"Clique para copiar o link\",\n    \"contact_edit_modal_first_name\": \"Nome\",\n    \"contact_edit_modal_last_name\": \"Sobrenome\",\n    \"contact_edit_modal_title\": \"Editar Contato\",\n    \"contact_edit_modal_submit\": \"Salvar\",\n    \"contact_edit_modal_submit_active\": \"Salvando...\",\n    \"contact_import_modal_title\": \"Adicionar novo contato\",\n    \"contact_import_modal_phone\": \"Número de telefone\",\n    \"contact_import_modal_phonebook\": \"Agenda telefônica\",\n    \"contact_import_modal_submit\": \"Salvar\",\n    \"contact_import_modal_submit_active\": \"Importando...\",\n    \"conversation_you\": \"Você\",\n    \"conversation_draft\": \"Rascunho\",\n    \"conversation_media_photo\": \"Foto\",\n    \"conversation_media_video\": \"Vídeo\",\n    \"conversation_media_round\": \"Mensagem de vídeo\",\n    \"conversation_media_document\": \"Arquivo\",\n    \"conversation_media_sticker\": \"Sticker\",\n    \"conversation_media_gif\": \"GIF\",\n    \"conversation_media_audio\": \"Áudio\",\n    \"conversation_media_location\": \"Localização\",\n    \"conversation_media_contact\": \"Contato\",\n    \"conversation_media_attachment\": \"Anexo\",\n    \"conversation_media_unsupported\": \"Anexo não suportado\",\n    \"conversation_search_peer\": \"Buscar neste chat\",\n    \"conversation_group_created\": \"criou o grupo\",\n    \"conversation_group_renamed\": \"alterou o nome do grupo\",\n    \"conversation_group_photo_updated\": \"alterou a foto do grupo\",\n    \"conversation_group_photo_removed\": \"removeu a foto do grupo\",\n    \"conversation_returned_to_group\": \"voltou ao grupo\",\n    \"conversation_joined_group\": \"entrou no grupo\",\n    \"conversation_invited_user\": \"convidou {user}\",\n    \"conversation_invited_users\": \"{'one': 'Convidou {} usuário', 'other': 'Convidou {} usuários'}\",\n    \"conversation_left_group\": \"saiu do grupo\",\n    \"conversation_kicked_user\": \"removeu {user}\",\n    \"conversation_invited_user_message\": \"usuário convidado\",\n    \"conversation_kicked_user_message\": \"usuário removido\",\n    \"conversation_joined_by_link\": \"entrou no grupo\",\n    \"conversation_converted_to_supergroup\": \"convertido em supergrupo\",\n    \"conversation_created_channel\": \"Canal criado\",\n    \"conversation_changed_channel_name\": \"Canal renomeado\",\n    \"conversation_changed_channel_photo\": \"Foto do canal atualizada\",\n    \"conversation_removed_channel_photo\": \"Foto do canal removida\",\n    \"conversation_pinned_message\": \"mensagem fixada\",\n    \"conversation_scored_X\": \"{'one': 'marcou {} ponto', 'other': 'marcou {} pontos'}\",\n    \"conversation_message_sent\": \"te enviou uma mensagem\",\n    \"conversation_forwarded_X_messages\": \"{'one': 'encaminhou {} mensagem', 'other': 'encaminhou {} mensagens'}\",\n    \"conversation_unknown_user\": \"Alguém\",\n    \"conversation_unknown_chat\": \"Chat desconhecido\",\n    \"message_service_created_group\": \"criou o grupo {group-name}\",\n    \"message_service_changed_group_name\": \"alterou o nome do grupo para {group-name}\",\n    \"message_service_changed_group_photo\": \"alterou a foto do grupo\",\n    \"message_service_removed_group_photo\": \"removeu a foto do grupo\",\n    \"message_service_invited_user\": \"convidou {user}\",\n    \"message_service_invited_users\": \"Convidou {user} e mais {num-more}\",\n    \"message_service_returned_to_group\": \"retornou ao grupo\",\n    \"message_service_kicked_user\": \"removeu {user}\",\n    \"message_service_left_group\": \"saiu do grupo\",\n    \"message_service_joined_by_link\": \"entrou para o grupo via link de convite\",\n    \"message_service_joined\": \"entrou no grupo\",\n    \"message_service_pinned_message\": \"fixou \\\"{message}\\\"\",\n    \"message_service_phonecall_incoming\": \"Chamada Recebida\",\n    \"message_service_phonecall_outgoing\": \"Chamada Efetuada\",\n    \"message_service_phonecall_missed\": \"Chamada Perdida\",\n    \"message_service_phonecall_canceled\": \"Chamada Cancelada\",\n    \"message_service_phonecall\": \"Chamada {duration}\",\n    \"message_service_scored_game\": \"{scored} em {message}\",\n    \"message_service_unsupported_action\": \"ação sem suporte {action}\",\n    \"message_service_bot_intro_header\": \"O que esse bot pode fazer?\",\n    \"message_service_converted_to_supergroup\": \"converteu o grupo em supergrupo\",\n    \"message_service_created_channel\": \"Canal criado\",\n    \"message_service_changed_channel_name\": \"Canal renomeado para {channel-name}\",\n    \"message_service_changed_channel_photo\": \"Foto do canal atualizada\",\n    \"message_service_removed_channel_photo\": \"Foto do canal removida\",\n    \"message_service_scored_X\": \"{'one': 'marcou {} ponto', 'other': 'marcou {} pontos'}\",\n    \"message_service_payment_sent\": \"Pagamento enviado\",\n    \"message_service_screenshot_taken\": \"fez uma captura de tela!\",\n    \"message_admin_badge\": \"admin\",\n    \"message_action_reply\": \"Responder\",\n    \"message_action_edit\": \"Editar\",\n    \"message_action_delete\": \"Apagar\",\n    \"message_action_report\": \"Denunciar\",\n    \"message_action_forward\": \"Encaminhar\",\n    \"message_action_select\": \"Selecionar\",\n    \"message_action_cancel\": \"Cancelar\",\n    \"message_action_retry\": \"Tente novamente\",\n    \"error_modal_warning_title\": \"Aviso\",\n    \"error_modal_bad_request_title\": \"Erro\",\n    \"error_modal_unauthorized_title\": \"Não autorizado\",\n    \"error_modal_forbidden_title\": \"Acesso negado\",\n    \"error_modal_not_found_title\": \"Não encontrado\",\n    \"error_modal_network_title\": \"Erro de rede\",\n    \"error_modal_flood_title\": \"Rápido demais\",\n    \"error_modal_internal_title\": \"Erro no servidor\",\n    \"error_modal_alert\": \"Alerta\",\n    \"error_modal_email_unconfirmed_title\": \"Quase lá!\",\n    \"error_modal_email_unconfirmed_descripion\": \"Por favor, verifique o seu e-mail para completar a configuração da Verificação em Duas Etapas (não esqueça da pasta spam).\",\n    \"error_modal_password_success_title\": \"Sucesso!\",\n    \"error_modal_password_disabled_title\": \"Senha desativada\",\n    \"error_modal_media_not_supported_title\": \"Mídia não suportada\",\n    \"error_modal_phonecalls_not_supported_title\": \"As chamadas ainda não estão disponíveis.\",\n    \"error_modal_recovery_na_title\": \"Desculpe\",\n    \"error_modal_network_description\": \"Por favor, verifique sua conexão com a internet.\",\n    \"error_modal_firstname_invali_description\": \"O nome inserido é inválido.\",\n    \"error_modal_lastname_invalid_description\": \"O sobrenome inserido é inválido.\",\n    \"error_modal_phone_invalid_description\": \"O número de telefone inserido é inválido.\",\n    \"error_modal_users_too_much_description\": \"Muitos membros no grupo\",\n    \"error_modal_photo_dimensions_invalid_description\": \"As dimensões da foto são inválidas, escolha outro arquivo.\",\n    \"error_modal_video_file_invalid_description\": \"A extensão do vídeo é inválida ou não suportada, selecione outro arquivo.\",\n    \"error_modal_photo_too_small_description\": \"Essa foto é muito pequena.\",\n    \"error_modal_no_phone_user_description_md\": \"Desculpe, não existe nenhuma conta do **Telegram** com o número informado.\",\n    \"error_modal_no_phone_users_description_md\": \"Desculpe, não existem contas do **Telegram** com os números informados.\",\n    \"error_modal_username_invalid_description\": \"Desculpe, esse nome de usuário não é permitido.\",\n    \"error_modal_phonebook_required_description\": \"O Telegram precisa acessar a sua agenda telefônica para importar os contatos.\",\n    \"error_modal_username_occupied_description\": \"Desculpe, esse nome de usuário já está em uso.\",\n    \"error_modal_media_not_supported_description\": \"Seu navegador não pode visualizar este tipo de mídia. Tente baixar o arquivo e abrir em outro reprodutor. \",\n    \"error_modal_username_not_found_description\": \"Não existe nenhuma conta do Telegram com o número informado.\",\n    \"error_modal_phonecalls_not_supported_description_md\": \"Infelizmente as chamadas ainda não são suportadas pelo App Web.\\n\\nVocê pode ligar para {user} usando nossos apps para celular ou aplicações desktop.\\n{download-link: Download »}\",\n    \"error_modal_app_signup_forbidden_md\": \"Você ainda não tem uma conta no Telegram, **registre-se** no {signup-link: Android / iPhone} primeiro.\",\n    \"error_modal_bad_request_description\": \"Um dos parâmetros está faltando ou é inválido.\",\n    \"error_modal_unauthorized_description\": \"Essa ação requer autorização. Por favor {login-link: entre}.\",\n    \"error_modal_forbidden_description\": \"Você não tem permissão para esta ação.\",\n    \"error_modal_not_found_description\": \"Página não foi encontrada.\",\n    \"error_modal_flood_description\": \"Você está realizando muitas ações. Tente novamente mais tarde.\",\n    \"error_modal_internal_description\": \"Erro interno do servidor. Por favor, tente novamente mais tarde.\",\n    \"error_modal_tech_details\": \"Clique para detalhes técnicos\",\n    \"error_modal_recovery_na_description\": \"Como você não indicou um e-mail de recuperação quando configurou a sua senha, as únicas opções restantes são lembrar a senha ou apagar a sua conta.\",\n    \"error_modal_password_success_descripion\": \"A sua senha para a Verificação em Duas Etapas foi ativada.\",\n    \"error_modal_password_disabled_descripion\": \"Você desativou a Verificação em Duas Etapas.\",\n    \"error_modal_user_not_mutual_contact\": \"Esse usuário só pode ser convidado pelos contatos dele\",\n    \"error_modal_invite_link_invalid\": \"Link de convite inválido\",\n    \"error_modal_channel_not_accessible\": \"Desculpe, esse canal não é mais acessível.\",\n    \"error_modal_not_contact_flood\": \"Desculpe, você pode enviar mensagens somente para contatos mútuos no momento. {more-info-link: Saiba mais »}\",\n    \"error_modal_gelocation_na\": \"O aplicativo não conseguiu determinar a sua localização atual.\",\n    \"error_modal_2fa_recent_confirm\": \"Suas tentativas recentes de restaurar essa conta foram canceladas pelo usuário ativo. Tente novamente em 7 dias.\",\n    \"error_modal_2fa_delayed_time_md\": \"Você poderá restaurar sua conta em: **{time}**\",\n    \"head_mainmenu\": \"Menu principal\",\n    \"head_telegram\": \"Telegram\",\n    \"head_new_group\": \"Novo grupo\",\n    \"head_new_contact\": \"Novo contato\",\n    \"head_contacts\": \"Contatos\",\n    \"head_contacts_title\": \"Contatos\",\n    \"head_telegram_faq\": \"Perguntas Frequentes\",\n    \"head_settings\": \"Configurações\",\n    \"head_log_out\": \"Sair\",\n    \"head_peer_more\": \"Mais\",\n    \"head_select_messages\": \"Selecionar mensagens\",\n    \"head_media_photos\": \"Fotos\",\n    \"head_media_video\": \"Vídeos\",\n    \"head_media_documents\": \"Arquivos\",\n    \"head_media_music\": \"Áudio\",\n    \"head_media_links\": \"Links compartilhados\",\n    \"head_media_audio\": \"Mensagens de voz\",\n    \"head_media_round\": \"Mensagens de vídeo\",\n    \"head_media_mymentions\": \"Menções\",\n    \"head_media_search\": \"Pesquisar\",\n    \"head_about\": \"Sobre\",\n    \"head_clear_all\": \"Limpar histórico\",\n    \"head_select\": \"Selecionar\",\n    \"head_typing\": \"digitando\",\n    \"head_pluralize_participants\": \"{'0': 'Nenhum membro', 'one': '1 membro', 'other': '{} membros'}\",\n    \"head_one_typing\": \"{name1} está digitando{dots}\",\n    \"head_two_typing\": \"{name1}, {name2}{dots}\",\n    \"head_many_typing\": \"{name1}+{names}{dots}\",\n    \"head_waiting_for_network\": \"Aguardando rede\",\n    \"head_retry\": \"Tentar novamente\",\n    \"head_connecting\": \"Conectando\",\n    \"footer_twitter\": \"Twitter\",\n    \"im_new_group\": \"Novo grupo\",\n    \"im_new_contact\": \"Novo contato\",\n    \"im_contacts\": \"Contatos\",\n    \"im_chat_contacts_title\": \"Conversas e contatos\",\n    \"im_settings\": \"Configurações\",\n    \"im_conversations\": \"Conversas\",\n    \"im_found_title\": \"Pesquisa global\",\n    \"im_messages\": \"Mensagens\",\n    \"im_no_contacts\": \"Nenhum contato ainda\",\n    \"im_get_started_long\": \"Comece adicionando um contato para conversar\",\n    \"im_add_contact\": \"Adicionar Contato\",\n    \"im_import_phonebook\": \"Importar agenda telefônica\",\n    \"im_get_started\": \"Começar\",\n    \"im_welcome_text\": \"Boas-vindas ao Telegram Web. Você pode adicionar a sua foto de perfil e alterar o seu nome nas Configurações.\",\n    \"im_open_settings\": \"Abrir configurações\",\n    \"im_select_a_chat\": \"Selecione um chat para começar a conversar\",\n    \"im_loading_history\": \"Carregando histórico\",\n    \"im_media\": \"Mídia\",\n    \"im_media_photos\": \"Fotos\",\n    \"im_media_video\": \"Vídeos\",\n    \"im_media_documents\": \"Arquivos\",\n    \"im_media_audio\": \"Mensagens de voz\",\n    \"im_media_round\": \"Mensagens de vídeo\",\n    \"im_media_music\": \"Áudio\",\n    \"im_media_links\": \"Links Compartilhados\",\n    \"im_media_mentions\": \"Menções e Respostas\",\n    \"im_pluralize_participants\": \"{'0': 'Nenhum membro', 'one': '1 membro', 'other': '{} membros'}\",\n    \"im_show_recent_messages\": \"Mostrar mensagens recentes\",\n    \"im_show_all_messages\": \"Mostrar todas as mensagens\",\n    \"im_no_messages\": \"Não há mensagens aqui ainda...\",\n    \"im_one_typing\": \"{name1} está digitando{dots}\",\n    \"im_two_typing\": \"{name1} e {name2} estão digitando{dots}\",\n    \"im_many_typing\": \"{name1}, {name2} e mais {count} estão digitando{dots}\",\n    \"im_conversation_single_typing\": \"digitando{dots}\",\n    \"im_conversation_group_typing\": \"{name} está digitando{dots}\",\n    \"im_delete_chat\": \"Apagar chat\",\n    \"im_clear_history\": \"Limpar histórico\",\n    \"im_delete\": \"Apagar {count}\",\n    \"im_forward\": \"Encaminhar {count}\",\n    \"im_reply\": \"Responder\",\n    \"im_edit\": \"Editar\",\n    \"im_start\": \"Começar\",\n    \"im_channel_join\": \"+ Entrar\",\n    \"im_channel_mute\": \"Silenciar\",\n    \"im_channel_unmute\": \"Restaurar Som\",\n    \"im_report\": \"Denunciar {count}\",\n    \"im_reply_loading\": \"Carregando{dots}\",\n    \"im_X_forwarded_messages\": \"{'one': '{} mensagem encaminhada', 'other': '{} mensagens encaminhadas'}\",\n    \"im_photos_drop_text\": \"Solte as fotos aqui para enviar\",\n    \"im_message_field_placeholder\": \"Escreva uma mensagem...\",\n    \"im_broadcast_field_placeholder\": \"Transmitir uma mensagem...\",\n    \"im_emoji_tab\": \"Emoji\",\n    \"im_stickers_tab\": \"Stickers\",\n    \"im_stickers_tab_recent\": \"Usado frequentemente\",\n    \"im_voice_record_title\": \"Gravar uma mensagem\",\n    \"im_media_attach_title\": \"Enviar mídia\",\n    \"im_attach_file_title\": \"Enviar arquivo\",\n    \"im_emoji_btn_title\": \"Inserir emoticon\",\n    \"im_submit_message\": \"Enviar\",\n    \"im_submit_edit_message\": \"Salvar\",\n    \"im_edit_message_title\": \"Editar mensagem\",\n    \"im_voice_recording_label\": \"Solte fora deste campo para cancelar\",\n    \"im_voice_recording_cancel_label\": \"Solte para cancelar a gravação\",\n    \"im_voice_processing_label\": \"Processando{dots}\",\n    \"login_sign_in\": \"Entrar\",\n    \"login_enter_number_description_md\": \"Please choose your country and enter your full phone number.\\n\\nNote that you need an existing account to log in to Telegram Web. To sign up for Telegram, use one of our {apps-link: mobile apps}.\",\n    \"login_incorrect_number\": \"Número de telefone incorreto\",\n    \"login_code_input_placeholder\": \"Código\",\n    \"login_tel_input_placeholder\": \"Número de telefone\",\n    \"login_country_select_placeholder\": \"País\",\n    \"login_generating_key\": \"Gerando chaves\",\n    \"login_generating_keys_info\": \"Chaves só são geradas uma vez. Isso pode levar alguns minutos em dispositivos mais lentos. Por favor, seja paciente.\",\n    \"login_edit_number\": \"Editar o número de telefone\",\n    \"login_enter_code_label_md\": \"Enviamos o código para o aplicativo do **Telegram** em seu outro dispositivo.\\nPor favor, insira o código abaixo.\",\n    \"login_enter_sms_code_label_md\": \"Enviamos um SMS com um código de ativação para o seu telefone.\\nPor favor, insira o código abaixo.\",\n    \"login_enter_call_code_label_md\": \"Estamos te ligando para ditar o código.\\nPor favor, insira o código abaixo.\",\n    \"login_code_remaining\": \"Você poderá solicitar um SMS em {remaining}\",\n    \"login_call_remaining\": \"Você poderá solicitar uma chamada em {remaining}\",\n    \"login_code_not_received\": \"Enviar código via SMS\",\n    \"login_code_not_received_call\": \"Enviar código via Chamada\",\n    \"login_code_requesting\": \"Solicitando código\",\n    \"login_incorrect_sms_code\": \"Código de SMS incorreto.\",\n    \"login_number_input_placeholder\": \"Insira seu código\",\n    \"login_checking_code\": \"Verificando código\",\n    \"login_your_info\": \"Suas informações\",\n    \"login_fulll_name_label\": \"Insira o seu nome completo para configurar sua conta do Telegram.\",\n    \"login_incorrect_first_name\": \"Nome incorreto.\",\n    \"login_first_name\": \"Nome\",\n    \"login_incorrect_last_name\": \"Sobrenome incorreto\",\n    \"login_last_name\": \"Sobrenome\",\n    \"login_signing_up\": \"Inscrevendo-se\",\n    \"login_sign_up\": \"Inscrever-se\",\n    \"login_about_title\": \"Sobre\",\n    \"login_about_hide\": \"esconder\",\n    \"login_try_desktop\": \"For best experience on your computer, try {telegram-link}\",\n    \"login_try_desktop_btn\": \"Download Telegram\",\n    \"login_try_desktop_short_btn\": \"Download\",\n    \"login_about_desc1_md\": \"O cliente web do Telegram é grátis, rápido e seguro para usufruir de muitas das funcionalidades do **Telegram** diretamente do seu **navegador**.\",\n    \"login_about_desc2_md\": \"Está sempre sincronizado com o **aplicativo do Telegram** em seu celular, o que o torna uma ferramenta perfeita para mensagens e compartilhamento de arquivos.\",\n    \"login_about_desc3_md\": \"Nosso {source-link: source code} é aberto, então todos podem contribuir.\",\n    \"login_about_intro\": \"Boas-vindas ao cliente web oficial do Telegram.\",\n    \"login_about_learn\": \"Saiba mais\",\n    \"login_password_title\": \"Senha\",\n    \"login_password_label\": \"Você habilitou a verificação em duas etapas, a sua conta está protegida com uma senha adicional.\",\n    \"login_password_forgot_link\": \"Esqueceu a senha?\",\n    \"login_account_reset\": \"Apagar conta\",\n    \"login_password\": \"Sua senha\",\n    \"login_incorrect_password\": \"Senha incorreta\",\n    \"login_checking_password\": \"Verificando\",\n    \"login_recovery_title\": \"Esqueceu a senha?\",\n    \"login_code_placeholder\": \"Código\",\n    \"login_code_incorrect\": \"Código incorreto.\",\n    \"login_recovery_description_md\": \"Enviamos um código de recuperação para o seu email:\\n\\n{email}\\n\\nPor favor, verifique o seu e-mail e digite aqui o código de 6 dígitos recebido.\",\n    \"password_recover_active\": \"Verificando...\",\n    \"password_recover_submit\": \"Enviar\",\n    \"login_controller_unknown_country\": \"Desconhecido\",\n    \"message_forwarded_message\": \"Encaminhar mensagem\",\n    \"message_via_bot\": \"via {bot}\",\n    \"message_edited\": \"editado\",\n    \"message_forwarded_message_mobile\": \"Encaminhado de {from}\",\n    \"message_forwarded_via_message_mobile\": \"Encaminhado de {from} via {bot}\",\n    \"message_attach_audio_message\": \"Mensagem de voz\",\n    \"message_attach_audio_play\": \"Tocar\",\n    \"message_attach_document_open\": \"Abrir\",\n    \"message_attach_document_download\": \"Baixar\",\n    \"message_attach_document_save\": \"Salvar arquivo\",\n    \"message_attach_video_video\": \"Vídeo\",\n    \"message_attach_video_download\": \"Baixar\",\n    \"message_attach_video_save\": \"Salvar arquivo\",\n    \"message_attach_video_play\": \"Reproduzir vídeo\",\n    \"message_attach_unsupported\": \"Esta mensagem não é suportada na sua versão do Telegram Web. Para visualizar, atualize seu aplicativo: {link}.\",\n    \"message_attach_unsupported_desktop\": \"Esta mensagem não é compatível com o Telegram Web no momento. Experimente {link}.\",\n    \"message_attach_notweb\": \"Essa mensagem ainda não é suportada pelo Telegram Web. Use os aplicativos móveis para visualizar: {link}.\",\n    \"conversation_select_modal_title\": \"Selecionar conversa\",\n    \"conversation_select_modal_chats_contacts\": \"Conversas e contatos\",\n    \"conversation_one_selected\": \"{name1}\",\n    \"conversation_two_selected\": \"{name1} e {name2}\",\n    \"conversation_many_selected\": \"{name1}, {name2} e {count} mais\",\n    \"phonebook_modal_title\": \"Agenda telefônica\",\n    \"phonebook_modal_deselect_all\": \"Cancelar seleção\",\n    \"phonebook_modal_select_all\": \"Selecionar tudo\",\n    \"phonebook_modal_empty\": \"Sua agenda telefônica está vazia.\",\n    \"phonebook_modal_submit_active\": \"Importando\",\n    \"phonebook_modal_submit\": \"Importar contatos\",\n    \"inactive_tab_title\": \"Telegram: Zzz...\",\n    \"inactive_title\": \"Erro, muitas abas\",\n    \"inactive_description_md\": \"Telegram suporta apenas uma aba ativa com o app.\\nPor favor, recarregue para continuar usando essa aba ou feche-a.\",\n    \"inactive_reload_btn\": \"Recarregar App\",\n    \"push_action_mute1d\": \"Silenciar alertas em segundo plano por 1 dia\",\n    \"push_action_settings\": \"Configurações de alertas em segundo plano\",\n    \"push_action_mute1d_mobile\": \"Silenciar por 24h\",\n    \"push_action_settings_mobile\": \"Configurações de alerta\",\n    \"push_message_nopreview\": \"Você tem uma nova mensagem\",\n    \"push_action_mute1d_success\": \"Configurações de notificação salvas com sucesso.\",\n    \"country_select_modal_country_ab\": \"Abcássia\",\n    \"country_select_modal_country_af\": \"Afeganistão\",\n    \"country_select_modal_country_ax\": \"Ilhas Aland\",\n    \"country_select_modal_country_al\": \"Albania\",\n    \"country_select_modal_country_dz\": \"Algéria\",\n    \"country_select_modal_country_as\": \"Samoa Americana\",\n    \"country_select_modal_country_ad\": \"Andorra\",\n    \"country_select_modal_country_ao\": \"Angola\",\n    \"country_select_modal_country_ai\": \"Anguilla\",\n    \"country_select_modal_country_ag\": \"Antígua & Barbuda\",\n    \"country_select_modal_country_ar\": \"Argentina\",\n    \"country_select_modal_country_am\": \"Armenia\",\n    \"country_select_modal_country_aw\": \"Aruba\",\n    \"country_select_modal_country_sh_ac\": \"Ascension\",\n    \"country_select_modal_country_au\": \"Austrália\",\n    \"country_select_modal_country_au_et\": \"Australian External Territories\",\n    \"country_select_modal_country_at\": \"Áustria\",\n    \"country_select_modal_country_az\": \"Azerbaijão\",\n    \"country_select_modal_country_bs\": \"Bahamas\",\n    \"country_select_modal_country_bh\": \"Barém\",\n    \"country_select_modal_country_bd\": \"Bangladesh\",\n    \"country_select_modal_country_bb\": \"Barbados\",\n    \"country_select_modal_country_ag_bar\": \"Barbuda\",\n    \"country_select_modal_country_by\": \"Bielorrússia\",\n    \"country_select_modal_country_be\": \"Bélgica\",\n    \"country_select_modal_country_bz\": \"Belize\",\n    \"country_select_modal_country_bj\": \"Benin\",\n    \"country_select_modal_country_bm\": \"Bermuda\",\n    \"country_select_modal_country_bt\": \"Butão\",\n    \"country_select_modal_country_bo\": \"Bolívia\",\n    \"country_select_modal_country_bq\": \"Países Baixos Caribenhos\",\n    \"country_select_modal_country_ba\": \"Bósnia e Herzegovina\",\n    \"country_select_modal_country_bw\": \"Botswana\",\n    \"country_select_modal_country_br\": \"Brasil\",\n    \"country_select_modal_country_io\": \"Território Britânico do Oceano Índico\",\n    \"country_select_modal_country_vg\": \"Ilhas Virgens Britânicas\",\n    \"country_select_modal_country_bn\": \"Brunei\",\n    \"country_select_modal_country_bg\": \"Bulgária\",\n    \"country_select_modal_country_bf\": \"Burkina Faso\",\n    \"country_select_modal_country_mm\": \"Myanmar (Birmânia)\",\n    \"country_select_modal_country_bi\": \"Burundi\",\n    \"country_select_modal_country_kh\": \"Cambodja\",\n    \"country_select_modal_country_cm\": \"Camarões\",\n    \"country_select_modal_country_ca\": \"Canadá\",\n    \"country_select_modal_country_cv\": \"Cabo Verde\",\n    \"country_select_modal_country_ky\": \"Ilhas Cayman\",\n    \"country_select_modal_country_cf\": \"República Centro-Africana\",\n    \"country_select_modal_country_td\": \"Chad\",\n    \"country_select_modal_country_cl\": \"Chile\",\n    \"country_select_modal_country_cn\": \"China\",\n    \"country_select_modal_country_cx\": \"Ilha Christmas\",\n    \"country_select_modal_country_cc\": \"Cocos (Keeling) Islands\",\n    \"country_select_modal_country_co\": \"Colômbia\",\n    \"country_select_modal_country_km\": \"Comoros\",\n    \"country_select_modal_country_cg\": \"Congo - Brazzaville\",\n    \"country_select_modal_country_cd\": \"Congo - Kinshasa\",\n    \"country_select_modal_country_ck\": \"Ilhas Cook\",\n    \"country_select_modal_country_cr\": \"Costa Rica\",\n    \"country_select_modal_country_ci\": \"Costa do Marfim\",\n    \"country_select_modal_country_hr\": \"Croácia\",\n    \"country_select_modal_country_cu\": \"Cuba\",\n    \"country_select_modal_country_cw\": \"Curaçau\",\n    \"country_select_modal_country_cy\": \"Chipre\",\n    \"country_select_modal_country_cz\": \"República Tcheca\",\n    \"country_select_modal_country_dk\": \"Dinamarca\",\n    \"country_select_modal_country_dg\": \"Diego Garcia\",\n    \"country_select_modal_country_dj\": \"Djibouti\",\n    \"country_select_modal_country_dm\": \"Domínica\",\n    \"country_select_modal_country_do\": \"República Dominicana\",\n    \"country_select_modal_country_tl\": \"Timor-Leste\",\n    \"country_select_modal_country_ec\": \"Equador\",\n    \"country_select_modal_country_eg\": \"Egito\",\n    \"country_select_modal_country_sv\": \"El Salvador\",\n    \"country_select_modal_country_gq\": \"Guiné Equatorial\",\n    \"country_select_modal_country_er\": \"Eritreia\",\n    \"country_select_modal_country_ee\": \"Estônia\",\n    \"country_select_modal_country_et\": \"Etiópia\",\n    \"country_select_modal_country_fk\": \"Ilhas Malvinas\",\n    \"country_select_modal_country_fo\": \"Faroe Islands\",\n    \"country_select_modal_country_fj\": \"Fiji\",\n    \"country_select_modal_country_fi\": \"Finlândia\",\n    \"country_select_modal_country_fr\": \"França\",\n    \"country_select_modal_country_gf\": \"French Guiana\",\n    \"country_select_modal_country_pf\": \"Polinésia Francesa\",\n    \"country_select_modal_country_ga\": \"Gabão\",\n    \"country_select_modal_country_gm\": \"Gâmbia\",\n    \"country_select_modal_country_ge\": \"Georgia\",\n    \"country_select_modal_country_de\": \"Alemanha\",\n    \"country_select_modal_country_gh\": \"Gana\",\n    \"country_select_modal_country_gi\": \"Gibraltar\",\n    \"country_select_modal_country_gr\": \"Grécia\",\n    \"country_select_modal_country_gl\": \"Groenlândia\",\n    \"country_select_modal_country_gd\": \"Grenada\",\n    \"country_select_modal_country_gp\": \"Guadalupe\",\n    \"country_select_modal_country_gu\": \"Guam\",\n    \"country_select_modal_country_gt\": \"Guatemala\",\n    \"country_select_modal_country_gg\": \"Guernsey\",\n    \"country_select_modal_country_gn\": \"Guinea\",\n    \"country_select_modal_country_gw\": \"Guiné-Bissau\",\n    \"country_select_modal_country_gy\": \"Guiana\",\n    \"country_select_modal_country_ht\": \"Haiti\",\n    \"country_select_modal_country_hn\": \"Honduras\",\n    \"country_select_modal_country_hk\": \"Hong Kong SAR China\",\n    \"country_select_modal_country_hu\": \"Hungria\",\n    \"country_select_modal_country_is\": \"Islândia\",\n    \"country_select_modal_country_in\": \"India\",\n    \"country_select_modal_country_id\": \"Indonesia\",\n    \"country_select_modal_country_ir\": \"Irã\",\n    \"country_select_modal_country_iq\": \"Iraque\",\n    \"country_select_modal_country_ie\": \"Irlanda\",\n    \"country_select_modal_country_il\": \"Israel\",\n    \"country_select_modal_country_it\": \"Itália\",\n    \"country_select_modal_country_jm\": \"Jamaica\",\n    \"country_select_modal_country_sj\": \"Svalbard & Jan Mayen\",\n    \"country_select_modal_country_jp\": \"Japão\",\n    \"country_select_modal_country_je\": \"Jersey\",\n    \"country_select_modal_country_jo\": \"Jordan\",\n    \"country_select_modal_country_kz\": \"Cazaquistão\",\n    \"country_select_modal_country_ke\": \"Kenya\",\n    \"country_select_modal_country_ki\": \"Kiribati\",\n    \"country_select_modal_country_kp\": \"Coréia do Norte\",\n    \"country_select_modal_country_kr\": \"Coréia do Sul\",\n    \"country_select_modal_country_kw\": \"Kuwait\",\n    \"country_select_modal_country_kg\": \"Quirguistão\",\n    \"country_select_modal_country_la\": \"Laos\",\n    \"country_select_modal_country_lv\": \"Letônia\",\n    \"country_select_modal_country_lb\": \"Líbano\",\n    \"country_select_modal_country_ls\": \"Lesoto\",\n    \"country_select_modal_country_lr\": \"Libéria\",\n    \"country_select_modal_country_ly\": \"Líbia\",\n    \"country_select_modal_country_li\": \"Liechtenstein\",\n    \"country_select_modal_country_lt\": \"Lituânia\",\n    \"country_select_modal_country_lu\": \"Luxemburgo\",\n    \"country_select_modal_country_mo\": \"Macau SAR China\",\n    \"country_select_modal_country_mk\": \"Macedônia\",\n    \"country_select_modal_country_mg\": \"Madagascar\",\n    \"country_select_modal_country_mw\": \"Maláui\",\n    \"country_select_modal_country_my\": \"Malásia\",\n    \"country_select_modal_country_mv\": \"Maldivas\",\n    \"country_select_modal_country_ml\": \"Mali\",\n    \"country_select_modal_country_mt\": \"Malta\",\n    \"country_select_modal_country_mh\": \"Ilhas Marshall\",\n    \"country_select_modal_country_mq\": \"Martinica\",\n    \"country_select_modal_country_mr\": \"Mauritânia\",\n    \"country_select_modal_country_mu\": \"Mauritius\",\n    \"country_select_modal_country_yt\": \"Mayotte\",\n    \"country_select_modal_country_mx\": \"México\",\n    \"country_select_modal_country_fm\": \"Micronésia\",\n    \"country_select_modal_country_md\": \"Moldova\",\n    \"country_select_modal_country_mc\": \"Monaco\",\n    \"country_select_modal_country_mn\": \"Mongólia\",\n    \"country_select_modal_country_me\": \"Montenegro\",\n    \"country_select_modal_country_ms\": \"Montserrat\",\n    \"country_select_modal_country_ma\": \"Marrocos\",\n    \"country_select_modal_country_mz\": \"Moçambique\",\n    \"country_select_modal_country_na\": \"Namíbia\",\n    \"country_select_modal_country_nr\": \"Nauru\",\n    \"country_select_modal_country_np\": \"Nepal\",\n    \"country_select_modal_country_nl\": \"Holanda\",\n    \"country_select_modal_country_nc\": \"Nova Caledônia\",\n    \"country_select_modal_country_nz\": \"Nova Zelândia\",\n    \"country_select_modal_country_ni\": \"Nicarágua\",\n    \"country_select_modal_country_ne\": \"Niger\",\n    \"country_select_modal_country_ng\": \"Nigéria\",\n    \"country_select_modal_country_nu\": \"Niue\",\n    \"country_select_modal_country_nf\": \"Ilha Norfolk\",\n    \"country_select_modal_country_mp\": \"Ilhas Marianas do Norte\",\n    \"country_select_modal_country_no\": \"Noruega\",\n    \"country_select_modal_country_om\": \"Omã\",\n    \"country_select_modal_country_pk\": \"Paquistão\",\n    \"country_select_modal_country_pw\": \"Palau\",\n    \"country_select_modal_country_ps\": \"Territórios Palestinos\",\n    \"country_select_modal_country_pa\": \"Panamá\",\n    \"country_select_modal_country_pg\": \"Papua Nova Guiné\",\n    \"country_select_modal_country_py\": \"Paraguai\",\n    \"country_select_modal_country_pe\": \"Peru\",\n    \"country_select_modal_country_ph\": \"Filipinas\",\n    \"country_select_modal_country_pn\": \"Ilhas Pitcairn\",\n    \"country_select_modal_country_pl\": \"Polônia\",\n    \"country_select_modal_country_pt\": \"Portugal\",\n    \"country_select_modal_country_pr\": \"Porto Rico\",\n    \"country_select_modal_country_qa\": \"Catar\",\n    \"country_select_modal_country_re\": \"Réunion\",\n    \"country_select_modal_country_ro\": \"Romênia\",\n    \"country_select_modal_country_ru\": \"Rússia\",\n    \"country_select_modal_country_rw\": \"Ruanda\",\n    \"country_select_modal_country_bl\": \"St. Barthélemy\",\n    \"country_select_modal_country_sh\": \"St. Helena\",\n    \"country_select_modal_country_kn\": \"St. Kitts & Nevis\",\n    \"country_select_modal_country_lc\": \"St. Lucia\",\n    \"country_select_modal_country_mf\": \"St. Martin (France)\",\n    \"country_select_modal_country_pm\": \"St. Pierre and Miquelon\",\n    \"country_select_modal_country_vc\": \"São Vicente e Granadinas\",\n    \"country_select_modal_country_ws\": \"Samoa\",\n    \"country_select_modal_country_sm\": \"San Marino\",\n    \"country_select_modal_country_st\": \"São Tomé & Príncipe\",\n    \"country_select_modal_country_sa\": \"Arábia Saudita\",\n    \"country_select_modal_country_sn\": \"Senegal\",\n    \"country_select_modal_country_rs\": \"Serbia\",\n    \"country_select_modal_country_sc\": \"Seychelles\",\n    \"country_select_modal_country_sl\": \"Serra Leoa\",\n    \"country_select_modal_country_sg\": \"Cingapura\",\n    \"country_select_modal_country_nl_bq3\": \"Sint Eustatius\",\n    \"country_select_modal_country_sx\": \"Sint Maarten\",\n    \"country_select_modal_country_sk\": \"Eslováquia\",\n    \"country_select_modal_country_si\": \"Eslovenia\",\n    \"country_select_modal_country_sb\": \"Ilhas Salomão\",\n    \"country_select_modal_country_so\": \"Somália\",\n    \"country_select_modal_country_za\": \"África do Sul\",\n    \"country_select_modal_country_gs\": \"Geórgia do Sul e Ilhas Sandwich do Sul\",\n    \"country_select_modal_country_ge_so\": \"Ossétia do Sul\",\n    \"country_select_modal_country_ss\": \"Sudão do Sul\",\n    \"country_select_modal_country_es\": \"Espanha\",\n    \"country_select_modal_country_lk\": \"Sri Lanka\",\n    \"country_select_modal_country_sd\": \"Sudão\",\n    \"country_select_modal_country_sr\": \"Suriname\",\n    \"country_select_modal_country_sj_no\": \"Svalbard\",\n    \"country_select_modal_country_sz\": \"Suazilândia\",\n    \"country_select_modal_country_se\": \"Suécia\",\n    \"country_select_modal_country_ch\": \"Suíça\",\n    \"country_select_modal_country_sy\": \"Síria\",\n    \"country_select_modal_country_tw\": \"Taiwan\",\n    \"country_select_modal_country_tj\": \"Tajiquistão\",\n    \"country_select_modal_country_tz\": \"Tanzânia\",\n    \"country_select_modal_country_th\": \"Tailândia\",\n    \"country_select_modal_country_tg\": \"Togo\",\n    \"country_select_modal_country_tk\": \"Tokelau\",\n    \"country_select_modal_country_to\": \"Tonga\",\n    \"country_select_modal_country_tt\": \"Trinidade e Tobago\",\n    \"country_select_modal_country_tn\": \"Tunisia\",\n    \"country_select_modal_country_tr\": \"Turquia\",\n    \"country_select_modal_country_tm\": \"Turquemenistão\",\n    \"country_select_modal_country_tc\": \"As Ilhas Turcas e Caicos\",\n    \"country_select_modal_country_tv\": \"Tuvalu\",\n    \"country_select_modal_country_ug\": \"Uganda\",\n    \"country_select_modal_country_ua\": \"Ucrânia\",\n    \"country_select_modal_country_ae\": \"Emirados Árabes Unidos\",\n    \"country_select_modal_country_uk\": \"Reino Unido\",\n    \"country_select_modal_country_us\": \"Estados Unidos\",\n    \"country_select_modal_country_uy\": \"Uruguai\",\n    \"country_select_modal_country_vi\": \"Ilhas Virgens dos Estados Unidos\",\n    \"country_select_modal_country_uz\": \"Uzbequistão\",\n    \"country_select_modal_country_vu\": \"Vanuatu\",\n    \"country_select_modal_country_ve\": \"Venezuela\",\n    \"country_select_modal_country_va\": \"Cidade do Vaticano\",\n    \"country_select_modal_country_vn\": \"Vietnã\",\n    \"country_select_modal_country_wf\": \"Ilhas Wallis e Futuna\",\n    \"country_select_modal_country_ye\": \"Iémen\",\n    \"country_select_modal_country_zm\": \"Zâmbia\",\n    \"country_select_modal_country_tz_uk\": \"Zanzibar\",\n    \"country_select_modal_country_zw\": \"Zimbábue\"\n}"
  },
  {
    "path": "app/js/locales/ru-ru.json",
    "content": "{\n    \"modal_search\": \"Поиск\",\n    \"modal_close\": \"Закрыть\",\n    \"modal_edit\": \"Изменить\",\n    \"modal_cancel\": \"Отмена\",\n    \"modal_more\": \"Ещё...\",\n    \"modal_next\": \"Далее\",\n    \"modal_ok\": \"OK\",\n    \"modal_done\": \"Готово\",\n    \"group_modal_info\": \"Информация о группе\",\n    \"group_modal_pluralize_participants\": \"{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}\",\n    \"group_modal_pluralize_online_participants\": \"{'one': '1 в сети', 'other': '{} в сети'}\",\n    \"group_modal_pluralize_subscribers\": \"{'0': 'Нет подписчиков', 'one': '1 подписчик', 'other': '{} подписчиков'}\",\n    \"group_modal_participants\": \"{total}, {online}\",\n    \"group_modal_add_member\": \"Добавить участника\",\n    \"group_modal_return\": \"Вернуться в группу\",\n    \"group_modal_update_photo\": \"Обновить фото\",\n    \"group_modal_update_active\": \"Обновление\",\n    \"group_modal_menu_more\": \"Ещё\",\n    \"group_modal_menu_delete_photo\": \"Удалить фото\",\n    \"group_modal_menu_edit_group\": \"Изменить группу\",\n    \"group_modal_menu_leave\": \"Покинуть\",\n    \"group_modal_menu_delete_group\": \"Удалить и выйти\",\n    \"group_modal_menu_clear_history\": \"Очистить историю\",\n    \"group_modal_delete_group\": \"Удалить группу\",\n    \"group_modal_join\": \"Join group\",\n    \"group_modal_settings\": \"Настройки\",\n    \"group_modal_notifications\": \"Уведомления\",\n    \"group_modal_menu_share_link\": \"Пригласить в группу по ссылке\",\n    \"group_modal_migrate_to_supergroup\": \"Преобразовать в супергруппу\",\n    \"group_modal_members\": \"Участники\",\n    \"group_modal_members_kick\": \"Исключить\",\n    \"group_modal_migrate_header\": \"Достигнуто максимальное количество участников\",\n    \"group_modal_migrate_desc\": \"Преобразуйте группу в супергруппу, чтобы превысить ограничение и получить дополнительные возможности:\",\n    \"group_modal_migrate_item1\": \"Супергруппы могут достигать 1000 участников\",\n    \"group_modal_migrate_item2\": \"Новые участники могут видеть полную историю сообщений\",\n    \"group_modal_migrate_item3\": \"Удалённые администраторами сообщения исчезают у всех пользователей\",\n    \"group_modal_migrate_item4\": \"Уведомления отключены по умолчанию\",\n    \"channel_modal_info\": \"Информация о канале\",\n    \"channel_modal_description\": \"Описание\",\n    \"channel_modal_share_link\": \"Поделиться ссылкой\",\n    \"channel_modal_share_loading\": \"Загрузка{dots}\",\n    \"channel_modal_menu_edit\": \"Edit channel\",\n    \"channel_modal_join\": \"Подписаться на канал\",\n    \"channel_modal_add_member\": \"Пригласить участников\",\n    \"channel_modal_leave_channel\": \"Покинуть канал\",\n    \"channel_modal_delete_channel\": \"Удалит канал\",\n    \"country_select_modal_title\": \"Страна\",\n    \"settings_modal_title\": \"Настройки\",\n    \"settings_modal_menu_more\": \"Ещё\",\n    \"settings_modal_delete_photo\": \"Удалить фото профиля\",\n    \"settings_modal_set_photo\": \"Установить фото профиля\",\n    \"settings_modal_photo_updating\": \"Обновление\",\n    \"settings_modal_edit_profile\": \"Изменить профиль\",\n    \"settings_modal_edit_username\": \"Изменить имя пользователя\",\n    \"settings_modal_empty_username_set\": \"Указать имя пользователя\",\n    \"settings_modal_terminate_sessions\": \"Завершить все другие сеансы\",\n    \"settings_modal_active_sessions\": \"Активные сеансы\",\n    \"settings_modal_settings\": \"Настройки\",\n    \"settings_modal_notification_alert\": \"Сигналы уведомлений\",\n    \"settings_modal_notification_push\": \"PUSH notifications\",\n    \"settings_modal_vibrate\": \"Вибросигнал\",\n    \"settings_modal_sounds\": \"Звук\",\n    \"settings_modal_language\": \"Язык\",\n    \"settings_modal_notifications\": \"Уведомления на рабочем столе\",\n    \"settings_modal_pushes\": \"Фоновые уведомления\",\n    \"settings_modal_message_preview\": \"Предпросмотр сообщений\",\n    \"settings_modal_sound\": \"Звук\",\n    \"settings_modal_enter_send_description_md\": \"**Enter** — отправить сообщение, **Shift + Enter** — новая строка\",\n    \"settings_modal_ctrl_enter_send_description_md\": \"**Ctrl + Enter** — отправить сообщение, **Enter** — новая строка\",\n    \"settings_modal_send_on_enter\": \"Отправлять по нажатию Enter\",\n    \"settings_switch_back_to_desktop\": \"Переключиться в режим рабочего стола\",\n    \"settings_modal_about\": \"О программе\",\n    \"settings_modal_source_code_github\": \"Исходный код на GitHub\",\n    \"settings_modal_follow_us_twitter\": \"Читайте нас в Твиттере!\",\n    \"settings_modal_recent_updates\": \"Последние обновления (ver. {version})\",\n    \"settings_modal_set_password\": \"Установить дополнительный пароль\",\n    \"settings_modal_change_password\": \"Сменить пароль\",\n    \"settings_modal_disable_password\": \"Отключить\",\n    \"settings_modal_disable_password_mobile\": \"Отключить пароль\",\n    \"settings_modal_password_email_pending\": \"Перейдите по ссылке из {email} для завершения настройки двухэтапной аутентификации.\",\n    \"settings_modal_password_email_pending_cancel\": \"Отмена\",\n    \"settings_modal_password_email_pending_cancel_mobile\": \"Отменить пароль\",\n    \"settings_modal_show_sensitive_content\": \"Show Sensitive Content\",\n    \"password_delete_title\": \"Отключить пароль\",\n    \"password_change_title\": \"Двухэтапная аутентификация\",\n    \"password_current_placeholder\": \"Введите текущий пароль\",\n    \"password_create_placeholder\": \"Введите пароль\",\n    \"password_new_placeholder\": \"Введите новый пароль\",\n    \"password_confirm_placeholder\": \"Повторите новый пароль\",\n    \"password_hint_placeholder\": \"Введите подсказку для пароля\",\n    \"password_email_placeholder\": \"Введите адрес электронной почты\",\n    \"password_create_description\": \"Этот пароль будет требоваться при входе на новом устройстве в дополнение к ПИН-коду.\",\n    \"password_create_active\": \"Сохранение...\",\n    \"password_create_submit\": \"Сохранить\",\n    \"password_delete_active\": \"Удаление...\",\n    \"password_delete_submit\": \"Удалить пароль\",\n    \"sessions_modal_title\": \"Активные сеансы\",\n    \"sessions_modal_loading\": \"Загрузка{dots}\",\n    \"sessions_modal_current_session\": \"Текущий сеанс\",\n    \"sessions_modal_session_online\": \"в сети\",\n    \"sessions_modal_terminate_one\": \"Завершение\",\n    \"sessions_modal_terminate_all\": \"Завершить все другие сеансы\",\n    \"sessions_modal_active_sessions\": \"Активные сеансы\",\n    \"stickerset_modal_title_loading\": \"Набор стикеров\",\n    \"stickerset_modal_install\": \"Добавить стикеры\",\n    \"stickerset_modal_uninstall\": \"Удалить стикеры\",\n    \"stickerset_modal_share\": \"Поделиться\",\n    \"stickerset_modal_loading\": \"Загрузка{dots}\",\n    \"page_title_pluralize_notifications\": \"{'0': 'Нет уведомлений', 'one': '1 уведомление', 'other': 'Уведомлений: {}'}\",\n    \"profile_edit_modal_title\": \"Изменить профиль\",\n    \"profile_edit_first_name\": \"Имя\",\n    \"profile_edit_last_name\": \"Фамилия\",\n    \"profile_edit_submit\": \"Сохранить\",\n    \"profile_edit_submit_active\": \"Сохранение...\",\n    \"username_edit_modal_title\": \"Смена имени пользователя\",\n    \"username_edit_placeholder\": \"Имя пользователя\",\n    \"username_edit_description_md\": \"Вы можете выбрать себе имя пользователя в **Telegram**. Если вы сделаете это, другие люди смогут находить вас с его помощью и связываться с вами, не зная номера вашего телефона. \\n\\nВы можете использовать символы a-z, 0-9 и подчёркивания. Минимальная длина составляет 5 символов.\",\n    \"username_edit_submit\": \"Сохранить\",\n    \"username_edit_submit_active\": \"Сохранение…\",\n    \"user_modal_menu_more\": \"Ещё\",\n    \"user_modal_send_message\": \"Отправить сообщение\",\n    \"user_modal_edit_contact\": \"Редактировать контакт\",\n    \"user_modal_delete_contact\": \"Удалить контакт\",\n    \"user_modal_add_contact\": \"Добавить в контакты\",\n    \"user_modal_share_contact\": \"Поделиться контактом\",\n    \"user_modal_block_user\": \"Заблокировать пользователя\",\n    \"user_modal_unblock_user\": \"Разблокировать пользователя\",\n    \"user_modal_clear_history\": \"Очистить историю\",\n    \"user_modal_delete_chat\": \"Delete conversation\",\n    \"user_modal_add_to_group\": \"Добавить в группу\",\n    \"user_modal_info\": \"Информация\",\n    \"user_modal_phone\": \"Телефон\",\n    \"user_modal_about\": \"О пользователе\",\n    \"user_modal_bot_settings\": \"Настройки\",\n    \"user_modal_bot_help\": \"Помощь\",\n    \"user_modal_username\": \"Имя пользователя\",\n    \"user_modal_settings\": \"Настройки\",\n    \"user_modal_notifications\": \"Уведомления\",\n    \"user_modal_contact_info\": \"Информация о контакте\",\n    \"media_modal_photo\": \"Фото\",\n    \"media_modal_photo_index\": \"Фото {pos} из {count}\",\n    \"media_modal_video\": \"Видео\",\n    \"media_modal_forward\": \"Переслать\",\n    \"media_modal_download\": \"Загрузить\",\n    \"media_modal_delete\": \"Удалить\",\n    \"game_modal_share_game\": \"Share Game\",\n    \"game_modal_share_score\": \"Share Score\",\n    \"error_browser_no_local_file_system_image_md\": \"Ваш браузер не поддерживает технологию {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | File System API}, которая необходима для отображения этого изображения.\\nПожалуйста, установите {chrome-link: http://google.com/chrome | Google Chrome} или воспользуйтесь {telegram-link: https://telegram.org/ | мобильным приложением}.\",\n    \"error_image_download_failed\": \"Сбой загрузки\",\n    \"error_browser_no_local_file_system_video_md\": \"Ваш браузер не поддерживает технологию {moz-link: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem | File System API}, которая необходима для воспроизведения этого видео.\\nПожалуйста, установите {chrome-link: http://google.com/chrome | Google Chrome} или воспользуйтесь {telegram-link: https://telegram.org/ | мобильным приложением}.\",\n    \"error_video_download_failed\": \"Сбой загрузки видео\",\n    \"unread_messages_split\": \"Непрочитанные сообщения\",\n    \"user_name_deleted\": \"УДАЛЕНО\",\n    \"user_first_name_deleted\": \"УДАЛЕНО\",\n    \"user_name_saved_msgs\": \"Сохранённые сообщения\",\n    \"user_status_online\": \"в сети\",\n    \"user_status_last_seen\": \"был(а) в сети {0}\",\n    \"user_status_recently\": \"был(а) в сети только что\",\n    \"user_status_last_week\": \"был(а) в сети в течение недели\",\n    \"user_status_last_month\": \"был(а) в сети в течение месяца\",\n    \"user_status_long_ago\": \"был(а) в сети очень давно\",\n    \"user_status_bot\": \"бот\",\n    \"user_status_service_notifications\": \"сервисные уведомления\",\n    \"user_status_support\": \"поддержка\",\n    \"user_status_bot_noprivacy\": \"имеет доступ к сообщениям\",\n    \"user_status_bot_privacy\": \"не имеет доступа к сообщениям\",\n    \"chat_title_deleted\": \"УДАЛЕНО\",\n    \"format_size_progress_mulitple\": \"{done} из {total} {parts}\",\n    \"format_size_progress\": \"{done} из {total}\",\n    \"relative_time_pluralize_minutes_ago\": \"{'one': '1 минуту назад', 'other': '{} минут(ы) назад'}\",\n    \"relative_time_pluralize_hours_ago\": \"{'one': '1 час назад', 'other': '{} часа(-ов) назад'}\",\n    \"relative_time_just_now\": \"только что\",\n    \"changelog_modal_header_recent_updates_md\": \"Последние обновления в **веб-клиенте Telegram**\",\n    \"changelog_modal_header_new_updates_md\": \"**Веб-клиент Telegram** обновился!\",\n    \"changelog_modal_title_current_version\": \"текущая версия\",\n    \"changelog_modal_full_description_md\": \"Official free messaging app based on Telegram API for speed and security.\\n\\nThis software is licensed under GNU GPL version 3.\",\n    \"changelog_modal_changelog_link\": \"Changelog\",\n    \"changelog_app_version\": \"Версия {version}\",\n    \"group_create_contacts_modal_title\": \"Новая группа\",\n    \"group_create_modal_title\": \"Создать группу\",\n    \"group_create_name\": \"Название группы\",\n    \"group_create_submit\": \"Создать группу\",\n    \"group_create_submit_active\": \"Создание...\",\n    \"group_edit_modal_title\": \"Редактировать группу\",\n    \"group_edit_name\": \"Название группы\",\n    \"group_edit_about\": \"Group description\",\n    \"group_edit_submit\": \"Сохранить\",\n    \"group_edit_submit_active\": \"Сохранение...\",\n    \"channel_edit_modal_title\": \"Edit channel\",\n    \"channel_edit_name\": \"Название канала\",\n    \"channel_edit_about\": \"Описание канала\",\n    \"channel_edit_submit\": \"Сохранить\",\n    \"channel_edit_submit_active\": \"Saving...\",\n    \"group_invite_link_modal_title\": \"Пригласительная ссылка\",\n    \"group_invite_link_link_label\": \"Скопировать ссылку\",\n    \"group_invite_link_loading\": \"Загрузка\",\n    \"group_invite_revoke_active\": \"Отмена...\",\n    \"group_invite_revoke\": \"Отозвать\",\n    \"report_reason_modal_title\": \"Report\",\n    \"report_reason_modal_spam\": \"Spam\",\n    \"report_reason_modal_violence\": \"Violence\",\n    \"report_reason_modal_pornography\": \"Pornography\",\n    \"report_reason_modal_childabuse\": \"Child Abuse\",\n    \"report_reason_modal_other\": \"Other\",\n    \"report_reason_modal_other_placeholder\": \"Description\",\n    \"report_reason_modal_submit_btn\": \"Send\",\n    \"clipboard_copied\": \"Скопировано!\",\n    \"clipboard_press_ctrl_c\": \"Press Ctrl+C to copy\",\n    \"clipboard_press_cmd_c\": \"Press ⌘+C to copy\",\n    \"confirm_modal_logout\": \"Вы действительно хотите выйти?\",\n    \"confirm_modal_update_reload\": \"Новая версия веб-клиента Telegram загружена. Запустить?\",\n    \"confirm_modal_history_flush\": \"Вы уверены? Это действие не может быть отменено!\",\n    \"confirm_modal_history_leave_flush_md\": \"Are you sure, you want to delete all message history and leave the group?\\n\\nThis action cannot be undone.\",\n    \"confirm_modal_leave_channel_md\": \"Are you sure, you want to leave this channel?\\n\\nThis action cannot be undone.\",\n    \"confirm_modal_leave_group_md\": \"Are you sure, you want to leave this group?\\n\\nThis action cannot be undone.\",\n    \"confirm_modal_terminate_sessions\": \"Уверены, что хотите выйти на всех устройствах, кроме этого?\",\n    \"confirm_modal_terminate_session\": \"Уверены, что хотите выйти на этом устройстве?\",\n    \"confirm_modal_clipboard_file_send\": \"Отправить файл(ы) из буфера обмена?\",\n    \"confirm_modal_clipboard_X_files_send\": \"{'one': 'Отправить {} файл из буфера обмена?', 'few': 'Отправить {} файла из буфера обмена?', 'many': 'Отправить {} файлов из буфера обмена?', 'other': 'Отправить {} файлов из буфера обмена?'}\",\n    \"confirm_modal_message_delete\": \"Удалить это сообщение?\",\n    \"confirm_modal_delete_X_messages\": \"{'one': '{} message', 'other': '{} messages'}\",\n    \"confirm_modal_delete_messages\": \"Are you sure you want to delete {messages}?\",\n    \"confirm_modal_message_revoke\": \"Удалить для {recipient}\",\n    \"confirm_modal_message_revoke_recipient_chat\": \"everyone\",\n    \"confirm_modal_delete_messages_for_everyone_chat\": \"Это удалит сообщения для всех в этом чате.\",\n    \"confirm_modal_delete_messages_for_you_only_pm\": \"This will delete messages just for you, not for {user}.\",\n    \"confirm_modal_delete_messages_for_you_only_chat\": \"This will delete messages just for you, not for other members of the chat.\",\n    \"confirm_modal_photo_delete\": \"Уверены, что хотите удалить это фото?\",\n    \"confirm_modal_contacts_import\": \"Telegram выполнит синхронизацию ваших контактов, чтобы найти ваших друзей.\",\n    \"confirm_modal_login_phone_correct\": \"Проверьте ещё раз ваш номер:\",\n    \"confirm_modal_forward_to_peer\": \"Переслать пользователю {peer}?\",\n    \"confirm_modal_forward_to_peer_success\": \"Message was successfully forwarded.\",\n    \"confirm_modal_report_success\": \"Report sent\",\n    \"confirm_modal_send_to_peer\": \"Отправить пользователю {peer}?\",\n    \"confirm_modal_share_file_peer\": \"Поделиться с {peer}?\",\n    \"confirm_modal_invite_peer\": \"Пригласить в {peer}?\",\n    \"confirm_modal_share_game\": \"Share the game to {peer}?\",\n    \"confirm_modal_apply_lang_with_reload_md\": \"Перезагрузить приложение для применения языка?\",\n    \"confirm_modal_migrate_to_https_md\": \"Веб-клиент Telegram теперь поддерживает дополнительное SSL-шифрование. Хотите переключиться на HTTPS?\\nHTTP-версия вскоре будет отключена.\",\n    \"confirm_modal_resize_desktop_md\": \"Хотите переключиться на версию для рабочего стола?\",\n    \"confirm_modal_resize_mobile_md\": \"Хотите переключиться на мобильную версию?\",\n    \"confirm_modal_recovery_email_empty_md\": \"Внимание! Уверены, что не хотите указать адрес электронной почты для восстановления?\\n\\nЕсли вы забудете пароль, то утратите доступ к вашему аккаунту Telegram\",\n    \"confirm_modal_abort_password_setup\": \"Отменить настройку двухэтапной аутентификации?\",\n    \"confirm_modal_reset_account_md\": \"Вы уверены?\\nЭто действие не может быть отменено.\\n\\nВы потеряете все ваши чаты и сообщения, а также любые медиа и файлы, которыми вы делились, если выполните сброс своего аккаунта.\",\n    \"confirm_modal_join_group_link\": \"Хотите вступить в группу «[название]»?\",\n    \"confirm_modal_join_channel_link\": \"Do you want to join the channel «{title}»?\",\n    \"confirm_modal_revoke_group_link\": \"Хотите ли вы аннулировать данную ссылку? После этого никто не сможет вступить в группу с её помощью\",\n    \"confirm_modal_revoke_channel_link\": \"Are you sure you want to revoke this link? Once you do, no one will be able to join the channel using it.\",\n    \"confirm_modal_delete_channel_md\": \"Are you sure you want to delete this channel?\\n\\nAll members will be removed and all messages will be lost.\",\n    \"confirm_modal_delete_group_md\": \"Are you sure you want to delete this group?\\n\\nAll members will be removed and all messages will be lost.\",\n    \"confirm_modal_jump_ext_url_md\": \"Open this link?\\n\\n{url}\",\n    \"confirm_modal_migrate_supergroup_md\": \"Please note that group members will need to update their Telegram apps to the latest version to see your supergroup.\\n\\nAre you sure you want to upgrade this group?\",\n    \"confirm_modal_bot_access_phone\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n    \"confirm_modal_bot_access_geo\": \"This will send your current location to the bot.\",\n    \"confirm_modal_bot_access_geo_inline\": \"This bot would like to know your location each time you send it a request. This can be used to provide location-specific results.\",\n    \"confirm_modal_content_settings_sensitive_md\": \"**Disable filtering**\\nIf you disable filtering, Telegram will display sensitive media in public channels on all your connected devices.\",\n    \"confirm_modal_content_settings_sensitive_submit\": \"Disable\",\n    \"confirm_modal_are_u_sure\": \"Вы уверены?\",\n    \"confirm_modal_logout_submit\": \"Выход\",\n    \"confirm_modal_clear_history_submit\": \"Очистить историю\",\n    \"confirm_modal_leave_chat_submit\": \"Leave\",\n    \"confirm_modal_delete_chat_submit\": \"Удалить чат\",\n    \"confirm_modal_clipboard_files_send_submit\": \"Отправить\",\n    \"confirm_modal_clipboard_file_send_submit\": \"Отправить\",\n    \"confirm_modal_message_delete_submit\": \"Удалить\",\n    \"confirm_modal_messages_delete_submit\": \"Удалить\",\n    \"confirm_modal_photo_delete_submit\": \"Удалить\",\n    \"confirm_modal_forward_message_submit\": \"Переслать сообщение\",\n    \"confirm_modal_share_photo_submit\": \"Переслать фотографию\",\n    \"confirm_modal_share_video_submit\": \"Переслать видео\",\n    \"confirm_modal_share_contact_submit\": \"Отправить контакт\",\n    \"confirm_modal_share_file_submit\": \"Поделиться файлом\",\n    \"confirm_modal_reset_account_submit\": \"Сбросить мой аккаунт\",\n    \"contacts_modal_edit_list\": \"Редактировать\",\n    \"contacts_modal_edit_cancel\": \"Отмена\",\n    \"contacts_modal_edit_delete\": \"Удалить\",\n    \"contacts_modal_pluralize_new_group_members\": \"{'one': '1 member', 'other': '{} members'}\",\n    \"contacts_modal_title\": \"Контакты\",\n    \"contacts_modal_new_contact\": \"Новый контакт\",\n    \"contacts_modal_empty_list\": \"У вас нет ни одного контакта. Вы можете {import-link: добавить новый контакт} по номеру телефона.\",\n    \"conversations_modal_forward_title\": \"Пересылка\",\n    \"conversations_modal_forward_submit\": \"Переслать\",\n    \"conversations_modal_select_recipients\": \"Выберите получателей\",\n    \"conversations_modal_recipients\": \"Получатели:\",\n    \"conversations_modal_share_url_loading\": \"Загрузка{dots}\",\n    \"conversations_modal_share_url_copy\": \"Click to copy share link\",\n    \"contact_edit_modal_first_name\": \"Имя\",\n    \"contact_edit_modal_last_name\": \"Фамилия\",\n    \"contact_edit_modal_title\": \"Редактировать контакт\",\n    \"contact_edit_modal_submit\": \"Сохранить\",\n    \"contact_edit_modal_submit_active\": \"Сохранение...\",\n    \"contact_import_modal_title\": \"Добавить новый контакт\",\n    \"contact_import_modal_phone\": \"Номер телефона\",\n    \"contact_import_modal_phonebook\": \"Телефонная книга\",\n    \"contact_import_modal_submit\": \"Сохранить\",\n    \"contact_import_modal_submit_active\": \"Импорт...\",\n    \"conversation_you\": \"Вы\",\n    \"conversation_draft\": \"Черновик:\",\n    \"conversation_media_photo\": \"Фотография\",\n    \"conversation_media_video\": \"Видео\",\n    \"conversation_media_round\": \"Видеосообщение\",\n    \"conversation_media_document\": \"Файл\",\n    \"conversation_media_sticker\": \"Стикер\",\n    \"conversation_media_gif\": \"GIF\",\n    \"conversation_media_audio\": \"Аудио\",\n    \"conversation_media_location\": \"Местоположение\",\n    \"conversation_media_contact\": \"Контакт\",\n    \"conversation_media_attachment\": \"Прикрепление\",\n    \"conversation_media_unsupported\": \"Вложение не поддерживается\",\n    \"conversation_search_peer\": \"Искать в этом чате\",\n    \"conversation_group_created\": \"создал(а) группу\",\n    \"conversation_group_renamed\": \"изменил(а) название группы\",\n    \"conversation_group_photo_updated\": \"изменил(а) фото группы\",\n    \"conversation_group_photo_removed\": \"удалил(а) фото группы\",\n    \"conversation_returned_to_group\": \"вернулся(-лась) в группу\",\n    \"conversation_joined_group\": \"joined the group\",\n    \"conversation_invited_user\": \"пригласил(а) {user}\",\n    \"conversation_invited_users\": \"{'one': 'invited {} user', 'other': 'invited {} users'}\",\n    \"conversation_left_group\": \"покинул(а) группу\",\n    \"conversation_kicked_user\": \"исключённый {user}\",\n    \"conversation_invited_user_message\": \"приглашённый пользователь\",\n    \"conversation_kicked_user_message\": \"исключённый пользователь\",\n    \"conversation_joined_by_link\": \"joined the group\",\n    \"conversation_converted_to_supergroup\": \"upgraded to a supergroup\",\n    \"conversation_created_channel\": \"Канал создан\",\n    \"conversation_changed_channel_name\": \"Канал переименован\",\n    \"conversation_changed_channel_photo\": \"Фото канала изменено\",\n    \"conversation_removed_channel_photo\": \"Фото канала удалено\",\n    \"conversation_pinned_message\": \"закреплённое сообщение\",\n    \"conversation_scored_X\": \"{'one': 'scored {}', 'other': 'scored {}'}\",\n    \"conversation_message_sent\": \"прислал(а) вам сообщение\",\n    \"conversation_forwarded_X_messages\": \"{'одно': 'отправленное {} сообщение', 'другие': 'отправленные {} сообщения'}\",\n    \"conversation_unknown_user\": \"Кто-то\",\n    \"conversation_unknown_chat\": \"Неизвестный чат\",\n    \"message_service_created_group\": \"создал(а) группу {group-name}\",\n    \"message_service_changed_group_name\": \"изменил(а) название группы на {group-name}\",\n    \"message_service_changed_group_photo\": \"изменил(а) фото группы\",\n    \"message_service_removed_group_photo\": \"удалил(а) фото группы\",\n    \"message_service_invited_user\": \"пригласил(а) {user}\",\n    \"message_service_invited_users\": \"invited {user} and {num-more} more\",\n    \"message_service_returned_to_group\": \"вернулся(-лась) в группу\",\n    \"message_service_kicked_user\": \"исключённый {user}\",\n    \"message_service_left_group\": \"покинул(а) группу\",\n    \"message_service_joined_by_link\": \"присоединился к группе по пригласительной ссылке\",\n    \"message_service_joined\": \"joined the group\",\n    \"message_service_pinned_message\": \"pinned «{message}»\",\n    \"message_service_phonecall_incoming\": \"Входящий вызов\",\n    \"message_service_phonecall_outgoing\": \"Исходящий вызов\",\n    \"message_service_phonecall_missed\": \"Пропущенный вызов\",\n    \"message_service_phonecall_canceled\": \"Отменённый вызов\",\n    \"message_service_phonecall\": \"Phone call {duration}\",\n    \"message_service_scored_game\": \"{scored} in {message}\",\n    \"message_service_unsupported_action\": \"неподдерживаемое действие {action}\",\n    \"message_service_bot_intro_header\": \"Что этот бот может делать?\",\n    \"message_service_converted_to_supergroup\": \"upgraded the group to a supergroup\",\n    \"message_service_created_channel\": \"Канал создан\",\n    \"message_service_changed_channel_name\": \"Channel renamed to {channel-name}\",\n    \"message_service_changed_channel_photo\": \"Фото канала изменено\",\n    \"message_service_removed_channel_photo\": \"Фото канала удалено\",\n    \"message_service_scored_X\": \"{'one': 'scored {}', 'other': 'scored {}'}\",\n    \"message_service_payment_sent\": \"Платёж отправлен\",\n    \"message_service_screenshot_taken\": \"took a screenshot!\",\n    \"message_admin_badge\": \"админ.\",\n    \"message_action_reply\": \"Ответить\",\n    \"message_action_edit\": \"Edit\",\n    \"message_action_delete\": \"Удалить\",\n    \"message_action_report\": \"Report\",\n    \"message_action_forward\": \"Переслать\",\n    \"message_action_select\": \"Выбрать\",\n    \"message_action_cancel\": \"Отмена\",\n    \"message_action_retry\": \"Try again\",\n    \"error_modal_warning_title\": \"Внимание\",\n    \"error_modal_bad_request_title\": \"Ошибка\",\n    \"error_modal_unauthorized_title\": \"Необходима авторизация\",\n    \"error_modal_forbidden_title\": \"Доступ запрещён\",\n    \"error_modal_not_found_title\": \"Не найдено\",\n    \"error_modal_network_title\": \"Ошибка сети\",\n    \"error_modal_flood_title\": \"Слишком быстро\",\n    \"error_modal_internal_title\": \"Ошибка сервера\",\n    \"error_modal_alert\": \"Уведомление\",\n    \"error_modal_email_unconfirmed_title\": \"Почти готово!\",\n    \"error_modal_email_unconfirmed_descripion\": \"Пожалуйста, проверь вашу электронную почту (не забудьте о папке со спамом) для завершения настройки двухэтапной аутентификации.\",\n    \"error_modal_password_success_title\": \"Готово!\",\n    \"error_modal_password_disabled_title\": \"Пароль отключён\",\n    \"error_modal_media_not_supported_title\": \"Неподдерживаемое медиа\",\n    \"error_modal_phonecalls_not_supported_title\": \"Calls are not available yet\",\n    \"error_modal_recovery_na_title\": \"Извините\",\n    \"error_modal_network_description\": \"Пожалуйста, проверьте своё подключение к интернету.\",\n    \"error_modal_firstname_invali_description\": \"Введено некорректное имя.\",\n    \"error_modal_lastname_invalid_description\": \"Введена некорректная фамилия.\",\n    \"error_modal_phone_invalid_description\": \"Введен некорректный номер.\",\n    \"error_modal_users_too_much_description\": \"Слишком много участников в группе\",\n    \"error_modal_photo_dimensions_invalid_description\": \"Пропорции фото некорректы, пожалуйста, выберите другое фото.\",\n    \"error_modal_video_file_invalid_description\": \"Этот формат видео некорректен или не поддерживается, пожалуйста, выберите другое видео.\",\n    \"error_modal_photo_too_small_description\": \"Выбранное фото слишком маленькое.\",\n    \"error_modal_no_phone_user_description_md\": \"К сожалению, к вашему телефону не привязан аккаунт **Telegram**.\",\n    \"error_modal_no_phone_users_description_md\": \"К сожалению, ни к одному из введённых номеров не привязан аккаунт **Telegram**.\",\n    \"error_modal_username_invalid_description\": \"Извините, такое имя пользователя недопустимо.\",\n    \"error_modal_phonebook_required_description\": \"Telegram требуется доступ к вашей телефонной книге для импорта контактов.\",\n    \"error_modal_username_occupied_description\": \"Извините, такое имя пользователя уже занято.\",\n    \"error_modal_media_not_supported_description\": \"Ваш браузер не может воспроизвести этот медиафайл. Попробуйте загрузить этот файл и открыть в стороннем плеере.\",\n    \"error_modal_username_not_found_description\": \"Нет аккаунта Telegram с указанным вами именем пользователя.\",\n    \"error_modal_phonecalls_not_supported_description_md\": \"Unfortunately calls are not supported in the Web App at the moment.\\n\\nYou can call {user} using our mobile apps or native desktop applications.\\n{download-link: Download »}\",\n    \"error_modal_app_signup_forbidden_md\": \"You don't have a Telegram account yet, please **sign up** with {signup-link: Android / iPhone} first.\",\n    \"error_modal_bad_request_description\": \"Один из параметров отсутствует или некорректен.\",\n    \"error_modal_unauthorized_description\": \"Для этого действия необходима авторизация. Пожалуйста, {login-link: войдите}.\",\n    \"error_modal_forbidden_description\": \"Вам запрещено это действие.\",\n    \"error_modal_not_found_description\": \"Страница не найдена.\",\n    \"error_modal_flood_description\": \"Вы выполняете слишком много действий. Попробуйте повторить позже.\",\n    \"error_modal_internal_description\": \"Внутренняя ошибка сервера. Попробуйте повторить позже.\",\n    \"error_modal_tech_details\": \"Click for technical details\",\n    \"error_modal_recovery_na_description\": \"Так как вы не указали адрес электронной почты для восстановления пароля, то оставшиеся варианты — вспомнить пароль или сбросить аккаунт.\",\n    \"error_modal_password_success_descripion\": \"Ваш пароль для двухэтапной аутентификации активен.\",\n    \"error_modal_password_disabled_descripion\": \"Вы отключили двухэтапную аутентификацию.\",\n    \"error_modal_user_not_mutual_contact\": \"The user can be invited by their contact only\",\n    \"error_modal_invite_link_invalid\": \"Пригласительная ссылка недействительна\",\n    \"error_modal_channel_not_accessible\": \"Извините, этот канал недоступен.\",\n    \"error_modal_not_contact_flood\": \"Sorry, you can only send messages to mutual contacts at the moment. {more-info-link: More info »}\",\n    \"error_modal_gelocation_na\": \"App was unable to determine your current location\",\n    \"error_modal_2fa_recent_confirm\": \"Your recent attempts to reset this account have been cancelled by its active user. Please try again in 7 days.\",\n    \"error_modal_2fa_delayed_time_md\": \"You'll be able to reset your account in: **{time}**\",\n    \"head_mainmenu\": \"Main menu\",\n    \"head_telegram\": \"Telegram\",\n    \"head_new_group\": \"Новая группа\",\n    \"head_new_contact\": \"Новый контакт\",\n    \"head_contacts\": \"Контакты\",\n    \"head_contacts_title\": \"Контакты\",\n    \"head_telegram_faq\": \"Вопросы и ответы о Telegram\",\n    \"head_settings\": \"Настройки\",\n    \"head_log_out\": \"Выход\",\n    \"head_peer_more\": \"Ещё\",\n    \"head_select_messages\": \"Выберите сообщения\",\n    \"head_media_photos\": \"Фотографии\",\n    \"head_media_video\": \"Видео\",\n    \"head_media_documents\": \"Файлы\",\n    \"head_media_music\": \"Аудио\",\n    \"head_media_links\": \"Shared links\",\n    \"head_media_audio\": \"Голосовые сообщения\",\n    \"head_media_round\": \"Видеосообщения\",\n    \"head_media_mymentions\": \"Упоминания\",\n    \"head_media_search\": \"Поиск\",\n    \"head_about\": \"О приложении\",\n    \"head_clear_all\": \"Очистить историю\",\n    \"head_select\": \"Выбрать\",\n    \"head_typing\": \"набирает\",\n    \"head_pluralize_participants\": \"{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}\",\n    \"head_one_typing\": \"{name1} набирает{dots}\",\n    \"head_two_typing\": \"{name1}, {name2}{dots}\",\n    \"head_many_typing\": \"{name1}+{names}{dots}\",\n    \"head_waiting_for_network\": \"Ожидание сети\",\n    \"head_retry\": \"Ещё раз\",\n    \"head_connecting\": \"Подключение\",\n    \"footer_twitter\": \"Твиттер\",\n    \"im_new_group\": \"Новая группа\",\n    \"im_new_contact\": \"Новый контакт\",\n    \"im_contacts\": \"Контакты\",\n    \"im_chat_contacts_title\": \"Chats and contacts\",\n    \"im_settings\": \"Настройки\",\n    \"im_conversations\": \"Диалоги\",\n    \"im_found_title\": \"Глобальный поиск\",\n    \"im_messages\": \"Сообщения\",\n    \"im_no_contacts\": \"Нет контактов\",\n    \"im_get_started_long\": \"Добавьте контакт для общения\",\n    \"im_add_contact\": \"Добавить контакт\",\n    \"im_import_phonebook\": \"Импорт из телефонной книги\",\n    \"im_get_started\": \"Начало работы\",\n    \"im_welcome_text\": \"Добро пожаловать в веб-клиент Telegram. Вы можете поменять аватар и имя в настройках.\",\n    \"im_open_settings\": \"Открыть настройки\",\n    \"im_select_a_chat\": \"Выберите чат для начала общения\",\n    \"im_loading_history\": \"Загрузка истории\",\n    \"im_media\": \"Медиа\",\n    \"im_media_photos\": \"Фотографии\",\n    \"im_media_video\": \"Видео\",\n    \"im_media_documents\": \"Файлы\",\n    \"im_media_audio\": \"Голосовые сообщения\",\n    \"im_media_round\": \"Видеосообщения\",\n    \"im_media_music\": \"Аудио\",\n    \"im_media_links\": \"Shared Links\",\n    \"im_media_mentions\": \"Упоминания и ответы\",\n    \"im_pluralize_participants\": \"{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}\",\n    \"im_show_recent_messages\": \"Показать последние сообщения\",\n    \"im_show_all_messages\": \"Показать все сообщения\",\n    \"im_no_messages\": \"Нет сообщений\",\n    \"im_one_typing\": \"{name1} набирает{dots}\",\n    \"im_two_typing\": \"{name1} и {name2} набирают{dots}\",\n    \"im_many_typing\": \"{name1}, {name2} и ещё {count} набирают{dots}\",\n    \"im_conversation_single_typing\": \"набирает{dots}\",\n    \"im_conversation_group_typing\": \"{name} набирает{dots}\",\n    \"im_delete_chat\": \"Удалить чат\",\n    \"im_clear_history\": \"Очистить историю\",\n    \"im_delete\": \"Удалить {count}\",\n    \"im_forward\": \"Переслать {count}\",\n    \"im_reply\": \"Ответить\",\n    \"im_edit\": \"Редактировать\",\n    \"im_start\": \"Старт\",\n    \"im_channel_join\": \"+ Join\",\n    \"im_channel_mute\": \"Выкл. звук\",\n    \"im_channel_unmute\": \"Вкл. звук\",\n    \"im_report\": \"Report {count}\",\n    \"im_reply_loading\": \"Загрузка{dots}\",\n    \"im_X_forwarded_messages\": \"{'one': '{} forwarded message', 'other': '{} forwarded messages'}\",\n    \"im_photos_drop_text\": \"Перетащите сюда фотографии, чтобы отправить их\",\n    \"im_message_field_placeholder\": \"Напишите сообщение...\",\n    \"im_broadcast_field_placeholder\": \"Broadcast a message...\",\n    \"im_emoji_tab\": \"Emoji\",\n    \"im_stickers_tab\": \"Стикер\",\n    \"im_stickers_tab_recent\": \"Frequently used\",\n    \"im_voice_record_title\": \"Record a message\",\n    \"im_media_attach_title\": \"Отправить медиа\",\n    \"im_attach_file_title\": \"Отправить файл\",\n    \"im_emoji_btn_title\": \"Вставить смайл\",\n    \"im_submit_message\": \"Отправить\",\n    \"im_submit_edit_message\": \"Сохранить\",\n    \"im_edit_message_title\": \"Edit message\",\n    \"im_voice_recording_label\": \"Release outside this form to cancel\",\n    \"im_voice_recording_cancel_label\": \"Release to cancel record\",\n    \"im_voice_processing_label\": \"Processing{dots}\",\n    \"login_sign_in\": \"Войти\",\n    \"login_enter_number_description_md\": \"Please choose your country and enter your full phone number.\\n\\nNote that you need an existing account to log in to Telegram Web. To sign up for Telegram, use one of our {apps-link: mobile apps}.\",\n    \"login_incorrect_number\": \"Некорректный номер\",\n    \"login_code_input_placeholder\": \"Код\",\n    \"login_tel_input_placeholder\": \"Номер телефона\",\n    \"login_country_select_placeholder\": \"Страна\",\n    \"login_generating_key\": \"Генерация ключей\",\n    \"login_generating_keys_info\": \"Ключи генерируются всего один раз. Этот процесс может занять несколько минут, особенно на медленных устройствах, пожалуйста, потерпите.\",\n    \"login_edit_number\": \"Редактировать номер телефона\",\n    \"login_enter_code_label_md\": \"We've sent the code to the **Telegram** app on your other device.\\nPlease enter the code below.\",\n    \"login_enter_sms_code_label_md\": \"We've sent an SMS with an activation code to your phone.\\nPlease enter the code below.\",\n    \"login_enter_call_code_label_md\": \"We are calling your phone to dictate a code.\\nPlease enter the code below.\",\n    \"login_code_remaining\": \"You will be able to request SMS in {remaining}\",\n    \"login_call_remaining\": \"You will be able to request call in {remaining}\",\n    \"login_code_not_received\": \"Send code via SMS\",\n    \"login_code_not_received_call\": \"Send code via Call\",\n    \"login_code_requesting\": \"Requesting code\",\n    \"login_incorrect_sms_code\": \"Неверный код\",\n    \"login_number_input_placeholder\": \"Введите ваш код\",\n    \"login_checking_code\": \"Проверка кода\",\n    \"login_your_info\": \"Информация о вас\",\n    \"login_fulll_name_label\": \"Введите свое имя для начала работы с Telegram.\",\n    \"login_incorrect_first_name\": \"Некорректное имя\",\n    \"login_first_name\": \"Имя\",\n    \"login_incorrect_last_name\": \"Некорректная фамилия\",\n    \"login_last_name\": \"Фамилия\",\n    \"login_signing_up\": \"Регистрация\",\n    \"login_sign_up\": \"Зарегистрироваться\",\n    \"login_about_title\": \"О веб-клиенте\",\n    \"login_about_hide\": \"hide\",\n    \"login_try_desktop\": \"For best experience on your computer, try {telegram-link}\",\n    \"login_try_desktop_btn\": \"Download Telegram\",\n    \"login_try_desktop_short_btn\": \"Download\",\n    \"login_about_desc1_md\": \"Веб-клиент Telegram — это бесплатный, быстрый и безопасный способ насладиться большинством функций **Telegram** прямо в вашем **веб-браузере**.\",\n    \"login_about_desc2_md\": \"Он всегда синхронизирован с **приложением Telegram** на вашем мобильном устройстве, что делает его идеальным инструментом для обмена сообщениями и файлами.\",\n    \"login_about_desc3_md\": \"Наш {source-link: исходный код} открыт, так что каждый желающий может внести свой вклад.\",\n    \"login_about_intro\": \"Добро пожаловать в официальный веб-клиент Telegram\",\n    \"login_about_learn\": \"Узнать больше\",\n    \"login_password_title\": \"Пароль\",\n    \"login_password_label\": \"Вы включили двухэтапную аутентификацию, теперь ваш аккаунт защищён дополнительным паролем.\",\n    \"login_password_forgot_link\": \"Забыли пароль\",\n    \"login_account_reset\": \"Сброс аккаунта\",\n    \"login_password\": \"Ваш пароль\",\n    \"login_incorrect_password\": \"Неверный пароль\",\n    \"login_checking_password\": \"Проверка\",\n    \"login_recovery_title\": \"Забыли пароль?\",\n    \"login_code_placeholder\": \"Код\",\n    \"login_code_incorrect\": \"Неверный код\",\n    \"login_recovery_description_md\": \"Мы отправили код восстановления на указанный вами адрес электронной почты:\\n\\n{email}\\n\\nПожалуйста, проверьте вашу электронную почту и введите полученный 6-значный код.\",\n    \"password_recover_active\": \"Проверка...\",\n    \"password_recover_submit\": \"Отправить\",\n    \"login_controller_unknown_country\": \"Неизвестно\",\n    \"message_forwarded_message\": \"Пересланное сообщение\",\n    \"message_via_bot\": \"via {bot}\",\n    \"message_edited\": \"edited\",\n    \"message_forwarded_message_mobile\": \"Forwarded from {from}\",\n    \"message_forwarded_via_message_mobile\": \"Forwarded from {from} via {bot}\",\n    \"message_attach_audio_message\": \"Запись голоса\",\n    \"message_attach_audio_play\": \"Воспроизвести\",\n    \"message_attach_document_open\": \"Открыть\",\n    \"message_attach_document_download\": \"Загрузить\",\n    \"message_attach_document_save\": \"Сохранить файл\",\n    \"message_attach_video_video\": \"Видео\",\n    \"message_attach_video_download\": \"Загрузить\",\n    \"message_attach_video_save\": \"Сохранить файл\",\n    \"message_attach_video_play\": \"Воспроизвести\",\n    \"message_attach_unsupported\": \"The message is not supported on your version of Telegram Web. Update the app to view: {link}.\",\n    \"message_attach_unsupported_desktop\": \"This message is currently not supported on Telegram Web. Try {link}.\",\n    \"message_attach_notweb\": \"The message is not supported on Telegram Web yet. Use Telegram mobile apps to view: {link}.\",\n    \"conversation_select_modal_title\": \"Выбрать чат\",\n    \"conversation_select_modal_chats_contacts\": \"Chats and contacts\",\n    \"conversation_one_selected\": \"{name1}\",\n    \"conversation_two_selected\": \"{name1} и {name2}\",\n    \"conversation_many_selected\": \"{name1}, {name2} и {count} других\",\n    \"phonebook_modal_title\": \"Телефонная книга\",\n    \"phonebook_modal_deselect_all\": \"Отменить выбор\",\n    \"phonebook_modal_select_all\": \"Выбрать всё\",\n    \"phonebook_modal_empty\": \"Ваша телефонная книга пуста.\",\n    \"phonebook_modal_submit_active\": \"Импорт\",\n    \"phonebook_modal_submit\": \"Импортировать контакты\",\n    \"inactive_tab_title\": \"Telegram: Zzz...\",\n    \"inactive_title\": \"Such error, many tabs\",\n    \"inactive_description_md\": \"Telegram supports only one active tab with the app.\\nPlease reload this page to continue using this tab or close it.\",\n    \"inactive_reload_btn\": \"Reload App\",\n    \"push_action_mute1d\": \"Mute background alerts for 1 day\",\n    \"push_action_settings\": \"Background alerts settings\",\n    \"push_action_mute1d_mobile\": \"Mute for 24H\",\n    \"push_action_settings_mobile\": \"Alerts settings\",\n    \"push_message_nopreview\": \"You have a new message\",\n    \"push_action_mute1d_success\": \"Notification settings were successfully saved.\",\n    \"country_select_modal_country_ab\": \"Абхазия\",\n    \"country_select_modal_country_af\": \"Афганистан\",\n    \"country_select_modal_country_ax\": \"Аландские о-ва\",\n    \"country_select_modal_country_al\": \"Албания\",\n    \"country_select_modal_country_dz\": \"Алжир\",\n    \"country_select_modal_country_as\": \"Американское Самоа\",\n    \"country_select_modal_country_ad\": \"Андорра\",\n    \"country_select_modal_country_ao\": \"Ангола\",\n    \"country_select_modal_country_ai\": \"Ангилья\",\n    \"country_select_modal_country_ag\": \"Антигуа и Барбуда\",\n    \"country_select_modal_country_ar\": \"Аргентина\",\n    \"country_select_modal_country_am\": \"Армения\",\n    \"country_select_modal_country_aw\": \"Аруба\",\n    \"country_select_modal_country_sh_ac\": \"Остров Вознесения\",\n    \"country_select_modal_country_au\": \"Австралия\",\n    \"country_select_modal_country_au_et\": \"Австралийские Антарктические Территории\",\n    \"country_select_modal_country_at\": \"Австрия\",\n    \"country_select_modal_country_az\": \"Азербайджан\",\n    \"country_select_modal_country_bs\": \"Багамские о-ва\",\n    \"country_select_modal_country_bh\": \"Бахрейн\",\n    \"country_select_modal_country_bd\": \"Бангладеш\",\n    \"country_select_modal_country_bb\": \"Барбадос\",\n    \"country_select_modal_country_ag_bar\": \"Барбуда\",\n    \"country_select_modal_country_by\": \"Беларусь\",\n    \"country_select_modal_country_be\": \"Бельгия\",\n    \"country_select_modal_country_bz\": \"Белиз\",\n    \"country_select_modal_country_bj\": \"Бенин\",\n    \"country_select_modal_country_bm\": \"Бермудские о-ва\",\n    \"country_select_modal_country_bt\": \"Бутан\",\n    \"country_select_modal_country_bo\": \"Боливия\",\n    \"country_select_modal_country_bq\": \"Бонэйр, Синт-Эстатиус и Саба\",\n    \"country_select_modal_country_ba\": \"Босния и Герцеговина\",\n    \"country_select_modal_country_bw\": \"Ботсвана\",\n    \"country_select_modal_country_br\": \"Бразилия\",\n    \"country_select_modal_country_io\": \"Британская территория в Индийском океане\",\n    \"country_select_modal_country_vg\": \"Виргинские о-ва (Британские)\",\n    \"country_select_modal_country_bn\": \"Бруней-Даруссалам\",\n    \"country_select_modal_country_bg\": \"Болгария\",\n    \"country_select_modal_country_bf\": \"Буркина-Фасо\",\n    \"country_select_modal_country_mm\": \"Мьянма (Бирма)\",\n    \"country_select_modal_country_bi\": \"Бурунди\",\n    \"country_select_modal_country_kh\": \"Камбоджа\",\n    \"country_select_modal_country_cm\": \"Камерун\",\n    \"country_select_modal_country_ca\": \"Канада\",\n    \"country_select_modal_country_cv\": \"Кабо-Верде\",\n    \"country_select_modal_country_ky\": \"Каймановы о-ва\",\n    \"country_select_modal_country_cf\": \"ЦАР\",\n    \"country_select_modal_country_td\": \"Чад\",\n    \"country_select_modal_country_cl\": \"Чили\",\n    \"country_select_modal_country_cn\": \"Китай\",\n    \"country_select_modal_country_cx\": \"о-в Рождества\",\n    \"country_select_modal_country_cc\": \"Кокосовые о-ва\",\n    \"country_select_modal_country_co\": \"Колумбия\",\n    \"country_select_modal_country_km\": \"Коморские о-ва\",\n    \"country_select_modal_country_cg\": \"Конго - Браззавиль\",\n    \"country_select_modal_country_cd\": \"Конго - Киншаса\",\n    \"country_select_modal_country_ck\": \"о-ва Кука\",\n    \"country_select_modal_country_cr\": \"Коста-Рика\",\n    \"country_select_modal_country_ci\": \"Кот-д’Ивуар\",\n    \"country_select_modal_country_hr\": \"Хорватия\",\n    \"country_select_modal_country_cu\": \"Куба\",\n    \"country_select_modal_country_cw\": \"Кюрасао\",\n    \"country_select_modal_country_cy\": \"Кипр\",\n    \"country_select_modal_country_cz\": \"Чехия\",\n    \"country_select_modal_country_dk\": \"Дания\",\n    \"country_select_modal_country_dg\": \"Диего-Гарсия\",\n    \"country_select_modal_country_dj\": \"Джибути\",\n    \"country_select_modal_country_dm\": \"Доминика\",\n    \"country_select_modal_country_do\": \"Доминиканская Республика\",\n    \"country_select_modal_country_tl\": \"Восточный Тимор\",\n    \"country_select_modal_country_ec\": \"Эквадор\",\n    \"country_select_modal_country_eg\": \"Египет\",\n    \"country_select_modal_country_sv\": \"Сальвадор\",\n    \"country_select_modal_country_gq\": \"Экваториальная Гвинея\",\n    \"country_select_modal_country_er\": \"Эритрея\",\n    \"country_select_modal_country_ee\": \"Эстония\",\n    \"country_select_modal_country_et\": \"Эфиопия\",\n    \"country_select_modal_country_fk\": \"Фолклендские о-ва\",\n    \"country_select_modal_country_fo\": \"Фарерские о-ва\",\n    \"country_select_modal_country_fj\": \"Фиджи\",\n    \"country_select_modal_country_fi\": \"Финляндия\",\n    \"country_select_modal_country_fr\": \"Франция\",\n    \"country_select_modal_country_gf\": \"Французская Гвиана\",\n    \"country_select_modal_country_pf\": \"Французская Полинезия\",\n    \"country_select_modal_country_ga\": \"Габон\",\n    \"country_select_modal_country_gm\": \"Гамбия\",\n    \"country_select_modal_country_ge\": \"Грузия\",\n    \"country_select_modal_country_de\": \"Германия\",\n    \"country_select_modal_country_gh\": \"Гана\",\n    \"country_select_modal_country_gi\": \"Гибралтар\",\n    \"country_select_modal_country_gr\": \"Греция\",\n    \"country_select_modal_country_gl\": \"Гренландия\",\n    \"country_select_modal_country_gd\": \"Гренада\",\n    \"country_select_modal_country_gp\": \"Гваделупа\",\n    \"country_select_modal_country_gu\": \"Гуам\",\n    \"country_select_modal_country_gt\": \"Гватемала\",\n    \"country_select_modal_country_gg\": \"Гернси\",\n    \"country_select_modal_country_gn\": \"Гвинея\",\n    \"country_select_modal_country_gw\": \"Гвинея-Бисау\",\n    \"country_select_modal_country_gy\": \"Гайана\",\n    \"country_select_modal_country_ht\": \"Гаити\",\n    \"country_select_modal_country_hn\": \"Гондурас\",\n    \"country_select_modal_country_hk\": \"Гонконг (особый район)\",\n    \"country_select_modal_country_hu\": \"Венгрия\",\n    \"country_select_modal_country_is\": \"Исландия\",\n    \"country_select_modal_country_in\": \"Индия\",\n    \"country_select_modal_country_id\": \"Индонезия\",\n    \"country_select_modal_country_ir\": \"Иран\",\n    \"country_select_modal_country_iq\": \"Ирак\",\n    \"country_select_modal_country_ie\": \"Ирландия\",\n    \"country_select_modal_country_il\": \"Израиль\",\n    \"country_select_modal_country_it\": \"Италия\",\n    \"country_select_modal_country_jm\": \"Ямайка\",\n    \"country_select_modal_country_sj\": \"Шпицберген и Ян-Майен\",\n    \"country_select_modal_country_jp\": \"Япония\",\n    \"country_select_modal_country_je\": \"Джерси\",\n    \"country_select_modal_country_jo\": \"Иордания\",\n    \"country_select_modal_country_kz\": \"Казахстан\",\n    \"country_select_modal_country_ke\": \"Кения\",\n    \"country_select_modal_country_ki\": \"Кирибати\",\n    \"country_select_modal_country_kp\": \"КНДР\",\n    \"country_select_modal_country_kr\": \"Республика Корея\",\n    \"country_select_modal_country_kw\": \"Кувейт\",\n    \"country_select_modal_country_kg\": \"Киргизия\",\n    \"country_select_modal_country_la\": \"Лаос\",\n    \"country_select_modal_country_lv\": \"Латвия\",\n    \"country_select_modal_country_lb\": \"Ливан\",\n    \"country_select_modal_country_ls\": \"Лесото\",\n    \"country_select_modal_country_lr\": \"Либерия\",\n    \"country_select_modal_country_ly\": \"Ливия\",\n    \"country_select_modal_country_li\": \"Лихтенштейн\",\n    \"country_select_modal_country_lt\": \"Литва\",\n    \"country_select_modal_country_lu\": \"Люксембург\",\n    \"country_select_modal_country_mo\": \"Макао (особый район)\",\n    \"country_select_modal_country_mk\": \"Македония\",\n    \"country_select_modal_country_mg\": \"Мадагаскар\",\n    \"country_select_modal_country_mw\": \"Малави\",\n    \"country_select_modal_country_my\": \"Малайзия\",\n    \"country_select_modal_country_mv\": \"Мальдивские о-ва\",\n    \"country_select_modal_country_ml\": \"Мали\",\n    \"country_select_modal_country_mt\": \"Мальта\",\n    \"country_select_modal_country_mh\": \"Маршалловы о-ва\",\n    \"country_select_modal_country_mq\": \"Мартиника\",\n    \"country_select_modal_country_mr\": \"Мавритания\",\n    \"country_select_modal_country_mu\": \"Маврикий\",\n    \"country_select_modal_country_yt\": \"Майотта\",\n    \"country_select_modal_country_mx\": \"Мексика\",\n    \"country_select_modal_country_fm\": \"Федеративные Штаты Микронезии\",\n    \"country_select_modal_country_md\": \"Молдова\",\n    \"country_select_modal_country_mc\": \"Монако\",\n    \"country_select_modal_country_mn\": \"Монголия\",\n    \"country_select_modal_country_me\": \"Черногория\",\n    \"country_select_modal_country_ms\": \"Монтсеррат\",\n    \"country_select_modal_country_ma\": \"Марокко\",\n    \"country_select_modal_country_mz\": \"Мозамбик\",\n    \"country_select_modal_country_na\": \"Намибия\",\n    \"country_select_modal_country_nr\": \"Науру\",\n    \"country_select_modal_country_np\": \"Непал\",\n    \"country_select_modal_country_nl\": \"Нидерланды\",\n    \"country_select_modal_country_nc\": \"Новая Каледония\",\n    \"country_select_modal_country_nz\": \"Новая Зеландия\",\n    \"country_select_modal_country_ni\": \"Никарагуа\",\n    \"country_select_modal_country_ne\": \"Нигер\",\n    \"country_select_modal_country_ng\": \"Нигерия\",\n    \"country_select_modal_country_nu\": \"Ниуэ\",\n    \"country_select_modal_country_nf\": \"о-в Норфолк\",\n    \"country_select_modal_country_mp\": \"Северные Марианские о-ва\",\n    \"country_select_modal_country_no\": \"Норвегия\",\n    \"country_select_modal_country_om\": \"Оман\",\n    \"country_select_modal_country_pk\": \"Пакистан\",\n    \"country_select_modal_country_pw\": \"Палау\",\n    \"country_select_modal_country_ps\": \"Палестинские территории\",\n    \"country_select_modal_country_pa\": \"Панама\",\n    \"country_select_modal_country_pg\": \"Папуа – Новая Гвинея\",\n    \"country_select_modal_country_py\": \"Парагвай\",\n    \"country_select_modal_country_pe\": \"Перу\",\n    \"country_select_modal_country_ph\": \"Филиппины\",\n    \"country_select_modal_country_pn\": \"Питкэрн\",\n    \"country_select_modal_country_pl\": \"Польша\",\n    \"country_select_modal_country_pt\": \"Португалия\",\n    \"country_select_modal_country_pr\": \"Пуэрто-Рико\",\n    \"country_select_modal_country_qa\": \"Катар\",\n    \"country_select_modal_country_re\": \"Реюньон\",\n    \"country_select_modal_country_ro\": \"Румыния\",\n    \"country_select_modal_country_ru\": \"Россия\",\n    \"country_select_modal_country_rw\": \"Руанда\",\n    \"country_select_modal_country_bl\": \"Сен-Бартельми\",\n    \"country_select_modal_country_sh\": \"О-в Св. Елены\",\n    \"country_select_modal_country_kn\": \"Сент-Китс и Невис\",\n    \"country_select_modal_country_lc\": \"Сент-Люсия\",\n    \"country_select_modal_country_mf\": \"Сен-Мартен (Франция)\",\n    \"country_select_modal_country_pm\": \"Сен-Пьер и Микелон\",\n    \"country_select_modal_country_vc\": \"Сент-Винсент и Гренадины\",\n    \"country_select_modal_country_ws\": \"Самоа\",\n    \"country_select_modal_country_sm\": \"Сан-Марино\",\n    \"country_select_modal_country_st\": \"Сан-Томе и Принсипи\",\n    \"country_select_modal_country_sa\": \"Саудовская Аравия\",\n    \"country_select_modal_country_sn\": \"Сенегал\",\n    \"country_select_modal_country_rs\": \"Сербия\",\n    \"country_select_modal_country_sc\": \"Сейшельские о-ва\",\n    \"country_select_modal_country_sl\": \"Сьерра-Леоне\",\n    \"country_select_modal_country_sg\": \"Сингапур\",\n    \"country_select_modal_country_nl_bq3\": \"Синт-Эстатиус\",\n    \"country_select_modal_country_sx\": \"Синт-Мартен\",\n    \"country_select_modal_country_sk\": \"Словакия\",\n    \"country_select_modal_country_si\": \"Словения\",\n    \"country_select_modal_country_sb\": \"Соломоновы о-ва\",\n    \"country_select_modal_country_so\": \"Сомали\",\n    \"country_select_modal_country_za\": \"ЮАР\",\n    \"country_select_modal_country_gs\": \"Южная Георгия и Южные Сандвичевы о-ва\",\n    \"country_select_modal_country_ge_so\": \"Южная Осетия\",\n    \"country_select_modal_country_ss\": \"Южный Судан\",\n    \"country_select_modal_country_es\": \"Испания\",\n    \"country_select_modal_country_lk\": \"Шри-Ланка\",\n    \"country_select_modal_country_sd\": \"Судан\",\n    \"country_select_modal_country_sr\": \"Суринам\",\n    \"country_select_modal_country_sj_no\": \"Шпицберген\",\n    \"country_select_modal_country_sz\": \"Свазиленд\",\n    \"country_select_modal_country_se\": \"Швеция\",\n    \"country_select_modal_country_ch\": \"Швейцария\",\n    \"country_select_modal_country_sy\": \"Сирия\",\n    \"country_select_modal_country_tw\": \"Тайвань\",\n    \"country_select_modal_country_tj\": \"Таджикистан\",\n    \"country_select_modal_country_tz\": \"Танзания\",\n    \"country_select_modal_country_th\": \"Таиланд\",\n    \"country_select_modal_country_tg\": \"Того\",\n    \"country_select_modal_country_tk\": \"Токелау\",\n    \"country_select_modal_country_to\": \"Тонга\",\n    \"country_select_modal_country_tt\": \"Тринидад и Тобаго\",\n    \"country_select_modal_country_tn\": \"Тунис\",\n    \"country_select_modal_country_tr\": \"Турция\",\n    \"country_select_modal_country_tm\": \"Туркменистан\",\n    \"country_select_modal_country_tc\": \"О-ва Тёркс и Кайкос\",\n    \"country_select_modal_country_tv\": \"Тувалу\",\n    \"country_select_modal_country_ug\": \"Уганда\",\n    \"country_select_modal_country_ua\": \"Украина\",\n    \"country_select_modal_country_ae\": \"ОАЭ\",\n    \"country_select_modal_country_uk\": \"Великобритания\",\n    \"country_select_modal_country_us\": \"Соединенные Штаты\",\n    \"country_select_modal_country_uy\": \"Уругвай\",\n    \"country_select_modal_country_vi\": \"Виргинские о-ва (США)\",\n    \"country_select_modal_country_uz\": \"Узбекистан\",\n    \"country_select_modal_country_vu\": \"Вануату\",\n    \"country_select_modal_country_ve\": \"Венесуэла\",\n    \"country_select_modal_country_va\": \"Ватикан\",\n    \"country_select_modal_country_vn\": \"Вьетнам\",\n    \"country_select_modal_country_wf\": \"Уоллис и Футуна\",\n    \"country_select_modal_country_ye\": \"Йемен\",\n    \"country_select_modal_country_zm\": \"Замбия\",\n    \"country_select_modal_country_tz_uk\": \"Занзибар\",\n    \"country_select_modal_country_zw\": \"Зимбабве\"\n}"
  },
  {
    "path": "app/js/message_composer.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n\n/* EmojiHelper */\n\n;(function (global, emojiData, categories, spritesheets) {\n  var emojis = {}\n  var shortcuts = {}\n  var emojiMap = {}\n  var spritesheetPositions = {}\n  var index = false\n\n  var popular = 'joy,kissing_heart,heart,heart_eyes,blush,grin,+1,relaxed,pensive,smile,sob,kiss,unamused,flushed,stuck_out_tongue_winking_eye,see_no_evil,wink,smiley,cry,stuck_out_tongue_closed_eyes,scream,rage,smirk,disappointed,sweat_smile,kissing_closed_eyes,speak_no_evil,relieved,grinning,yum,laughing,ok_hand,neutral_face,confused'.split(',')\n\n  var i\n  var j\n  var code\n  var shortcut\n  var emoji\n  var row\n  var column\n  var totalColumns\n  var len1\n  var len2\n\n  for (i = 0, len1 = categories.length; i < len1; i++) {\n    totalColumns = spritesheets[i][1]\n    for (j = 0, len2 = categories[i].length; j < len2; j++) {\n      code = categories[i][j]\n      emoji = emojiData[code]\n      shortcut = emoji[1][0]\n      emojis[code] = [emoji[0], shortcut]\n      shortcuts[shortcut] = code\n      spritesheetPositions[code] = [i, j, Math.floor(j / totalColumns), j % totalColumns]\n    }\n  }\n\n  angular.forEach(emojiData, function (emoji, emojiCode) {\n    emojiMap[emoji[0]] = emojiCode\n  })\n\n  function getPopularEmoji (callback) {\n    ConfigStorage.get('emojis_popular', function (popEmojis) {\n      var result = []\n      if (popEmojis && popEmojis.length) {\n        for (var i = 0, len = popEmojis.length; i < len; i++) {\n          result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n        }\n        callback(result)\n        return\n      }\n      ConfigStorage.get('emojis_recent', function (recentEmojis) {\n        recentEmojis = recentEmojis || popular || []\n        var shortcut\n        var code\n        for (var i = 0, len = recentEmojis.length; i < len; i++) {\n          shortcut = recentEmojis[i]\n          if (Array.isArray(shortcut)) {\n            shortcut = shortcut[0]\n          }\n          if (shortcut && typeof shortcut === 'string') {\n            if (shortcut.charAt(0) == ':') {\n              shortcut = shortcut.substr(1, shortcut.length - 2)\n            }\n            if (code = shortcuts[shortcut]) {\n              result.push({code: code, rate: 1})\n            }\n          }\n        }\n        callback(result)\n      })\n    })\n  }\n\n  function pushPopularEmoji (code) {\n    getPopularEmoji(function (popularEmoji) {\n      var exists = false\n      var count = popularEmoji.length\n      var result = []\n      for (var i = 0; i < count; i++) {\n        if (popularEmoji[i].code == code) {\n          exists = true\n          popularEmoji[i].rate++\n        }\n        result.push([popularEmoji[i].code, popularEmoji[i].rate])\n      }\n      if (exists) {\n        result.sort(function (a, b) {\n          return b[1] - a[1]\n        })\n      } else {\n        if (result.length > 41) {\n          result = result.slice(0, 41)\n        }\n        result.push([code, 1])\n      }\n      ConfigStorage.set({emojis_popular: result})\n    })\n  }\n\n  function indexEmojis () {\n    if (index === false) {\n      index = SearchIndexManager.createIndex()\n      var shortcut\n      for (shortcut in shortcuts) {\n        if (shortcuts.hasOwnProperty(shortcut)) {\n          SearchIndexManager.indexObject(shortcuts[shortcut], shortcut, index)\n        }\n      }\n    }\n  }\n\n  function searchEmojis (q) {\n    indexEmojis()\n    var foundObject = SearchIndexManager.search(q, index)\n    var foundCodes = []\n    var code\n    for (code in foundObject) {\n      if (foundObject.hasOwnProperty(code)) {\n        foundCodes.push(code)\n      }\n    }\n    return foundCodes\n  }\n\n  global.EmojiHelper = {\n    emojis: emojis,\n    emojiMap: emojiMap,\n    shortcuts: shortcuts,\n    spritesheetPositions: spritesheetPositions,\n    getPopularEmoji: getPopularEmoji,\n    pushPopularEmoji: pushPopularEmoji,\n    indexEmojis: indexEmojis,\n    searchEmojis: searchEmojis\n  }\n})(window, Config.Emoji, Config.EmojiCategories, Config.EmojiCategorySpritesheetDimens)\n\nfunction EmojiTooltip (btnEl, options) {\n  options = options || {}\n  var self = this\n\n  this.btnEl = $(btnEl)\n  this.onEmojiSelected = options.onEmojiSelected\n  this.onStickerSelected = options.onStickerSelected\n  this.getStickers = options.getStickers\n  this.getStickerImage = options.getStickerImage\n  this.onStickersetSelected = options.onStickersetSelected\n  this.langpack = options.langpack || {}\n\n  if (!Config.Navigator.touch) {\n    $(this.btnEl).on('mouseenter mouseleave', function (e) {\n      self.isOverBtn = e.type == 'mouseenter'\n      self.createTooltip()\n\n      if (self.isOverBtn) {\n        self.onMouseEnter(true)\n      } else {\n        self.onMouseLeave(true)\n      }\n    })\n  }\n  $(this.btnEl).on('mousedown', function (e) {\n    if (!self.shown) {\n      clearTimeout(self.showTimeout)\n      delete self.showTimeout\n      self.createTooltip()\n      self.show()\n    } else {\n      clearTimeout(self.hideTimeout)\n      delete self.hideTimeout\n      self.hide()\n    }\n    return cancelEvent(e)\n  })\n  $(document).on('mousedown', function (e) {\n    if (self.shown) {\n      self.hide()\n    }\n  })\n}\n\nEmojiTooltip.prototype.onMouseEnter = function (triggerShow) {\n  if (this.hideTimeout) {\n    clearTimeout(this.hideTimeout)\n    delete this.hideTimeout\n  }\n  else if (triggerShow && !this.showTimeout) {\n    this.showTimeout = setTimeout(this.show.bind(this), 100)\n  }\n}\n\nEmojiTooltip.prototype.onMouseLeave = function (triggerUnshow) {\n  if (!this.hideTimeout) {\n    var self = this\n    this.hideTimeout = setTimeout(function () {\n      self.hide()\n    }, 600)\n  }\n  else if (triggerUnshow && this.showTimeout) {\n    clearTimeout(this.showTimeout)\n    delete this.showTimeout\n  }\n}\n\nEmojiTooltip.prototype.createTooltip = function () {\n  if (this.tooltipEl) {\n    return false\n  }\n\n  var html =\n  '<div class=\"composer_emoji_tooltip noselect\">\\\n  <div class=\"composer_emoji_tooltip_tabs\">\\\n    <div class=\"composer_emoji_tooltip_tab composer_emoji_tooltip_tab_emoji\">' + this.langpack.im_emoji_tab + '</div>\\\n    <div class=\"composer_emoji_tooltip_tab composer_emoji_tooltip_tab_stickers\">' + this.langpack.im_stickers_tab + '</div>\\\n    <div class=\"composer_emoji_tooltip_tab_shadow\"></div>\\\n  </div>\\\n  <div class=\"composer_emoji_tooltip_tabs_wrap\">\\\n    <div class=\"composer_emoji_tooltip_tabs_contents clearfix\">\\\n      <div class=\"composer_emoji_tooltip_tab_emoji_content\">\\\n        <div class=\"composer_emoji_tooltip_content_wrap\">\\\n          <div class=\"composer_emoji_tooltip_content composer_emoji_tooltip_content_emoji clearfix\"></div>\\\n        </div>\\\n        <div class=\"composer_emoji_tooltip_categories\">\\\n          <a class=\"composer_emoji_tooltip_category active\" data-category=\"0\"><i class=\"composer_emoji_tooltip_category_recent\"></i></a>\\\n          <a class=\"composer_emoji_tooltip_category\" data-category=\"1\"><i class=\"composer_emoji_tooltip_category_smile\"></i></a>\\\n          <a class=\"composer_emoji_tooltip_category\" data-category=\"2\"><i class=\"composer_emoji_tooltip_category_flower\"></i></a>\\\n          <a class=\"composer_emoji_tooltip_category\" data-category=\"3\"><i class=\"composer_emoji_tooltip_category_bell\"></i></a>\\\n          <a class=\"composer_emoji_tooltip_category\" data-category=\"4\"><i class=\"composer_emoji_tooltip_category_car\"></i></a>\\\n          <a class=\"composer_emoji_tooltip_category\" data-category=\"5\"><i class=\"composer_emoji_tooltip_category_grid\"></i></a>\\\n        </div>\\\n      </div>\\\n      <div class=\"composer_emoji_tooltip_tab_stickers_content\">\\\n        <div class=\"composer_emoji_tooltip_content_wrap\">\\\n            <div class=\"composer_emoji_tooltip_content composer_emoji_tooltip_content_stickers clearfix\"></div>\\\n          </div>\\\n          <div class=\"composer_emoji_tooltip_categories\"></div>\\\n      </div>\\\n    </div>\\\n  </div>\\\n  <div class=\"composer_emoji_tooltip_tail\"><i class=\"icon icon-tooltip-tail\"></i></div>\\\n</div>'\n\n  html = html.replace(/>\\s+</g, '><')\n\n  var self = this\n  this.tooltipEl = $(html).appendTo(document.body)\n\n  this.tabsEl = $('.composer_emoji_tooltip_tabs', this.tooltipEl)\n  this.categoriesEl = $('.composer_emoji_tooltip_categories', this.tooltipEl)\n  this.stickersCategoriesEl = $('.composer_emoji_tooltip_tab_stickers_content .composer_emoji_tooltip_categories', this.tooltipEl)\n\n  this.contentEl = $('.composer_emoji_tooltip_content', this.tooltipEl)\n  this.emojiContentEl = $('.composer_emoji_tooltip_content_emoji', this.tooltipEl)\n  this.stickersContentEl = $('.composer_emoji_tooltip_content_stickers', this.tooltipEl)\n\n  // Tabs\n  angular.forEach(['emoji', 'stickers'], function (tabName, tabIndex) {\n    var tab = $('.composer_emoji_tooltip_tab_' + tabName, self.tabsEl)\n      .on('mousedown', function (e) {\n        self.selectTab(tabIndex)\n        return cancelEvent(e)\n      })\n\n    if (!Config.Navigator.touch) {\n      tab.on('mouseenter mouseleave', function (e) {\n        clearTimeout(self.selectTabTimeout)\n        if (e.type == 'mouseenter') {\n          self.selectTabTimeout = setTimeout(function () {\n            self.selectTab(tabIndex)\n          }, 300)\n        }\n      })\n    }\n  })\n\n  // Categories\n  var handleEvents = 'mousedown'\n  if (!Config.Navigator.touch) {\n    handleEvents += ' mouseover mouseout'\n  }\n  this.categoriesEl.on(handleEvents, function (e) {\n    e = e.originalEvent || e\n    var target = e.target\n    if (target.tagName != 'A') {\n      target = target.parentNode\n    }\n    if (target.tagName != 'A') {\n      return\n    }\n    var catIndex = parseInt(target.getAttribute('data-category'))\n    if (e.type == 'mousedown') {\n      self.selectCategory(catIndex)\n      return cancelEvent(e)\n    }\n    if (self.tab) {\n      return\n    }\n    var isOver = e.type == 'mouseover'\n    if (isOver && self.selectCategoryIndex == catIndex) {\n      return\n    }\n    clearTimeout(self.selectCategoryTimeout)\n    delete self.selectCategoryTimeout\n    if (isOver) {\n      self.selectCategoryIndex = catIndex\n      self.selectCategoryTimeout = setTimeout(function () {\n        delete self.selectCategoryIndex\n        delete self.selectCategoryTimeout\n        self.selectCategory(catIndex)\n      }, 300)\n    } else {\n      delete self.selectCategoryIndex\n    }\n  })\n\n  this.emojiScroller = new Scroller(this.emojiContentEl, {classPrefix: 'composer_emoji_tooltip'})\n  this.stickersScroller = new Scroller(this.stickersContentEl, {classPrefix: 'composer_emoji_tooltip'})\n  this.stickersScroller.onScroll(function (el, st) {\n    self.onStickersScroll(el, st)\n  })\n\n  this.contentEl.on('mousedown', function (e) {\n    e = e.originalEvent || e\n    var target = $(e.target), code, sticker, stickerset\n    if (target[0].tagName != 'A') {\n      target = $(target[0].parentNode)\n    }\n    if (code = target.attr('data-code')) {\n      if (self.onEmojiSelected) {\n        self.onEmojiSelected(code)\n      }\n      EmojiHelper.pushPopularEmoji(code)\n    }\n    if (sticker = target.attr('data-sticker')) {\n      if (self.onStickerSelected) {\n        self.onStickerSelected(sticker)\n      }\n      if (Config.Mobile) {\n        self.hide()\n      }\n    }\n    if (stickerset = target.attr('data-stickerset')) {\n      if (self.onStickersetSelected) {\n        self.onStickersetSelected(stickerset)\n      }\n      self.hide()\n    }\n    return cancelEvent(e)\n  })\n\n  if (!Config.Navigator.touch) {\n    this.tooltipEl.on('mouseenter mouseleave', function (e) {\n      if (e.type == 'mouseenter') {\n        self.onMouseEnter()\n      } else {\n        self.onMouseLeave()\n      }\n    })\n  }\n\n  this.selectTab(0)\n\n  $(window).on('resize', this.updatePosition.bind(this))\n\n  return true\n}\n\nEmojiTooltip.prototype.selectCategory = function (cat, force) {\n  if (!this.tab && this.cat === cat && !force) {\n    return false\n  }\n  $('.active', this.categoriesEl).removeClass('active')\n  this.cat = cat\n\n  if (this.tab) {\n    this.activateStickerCategory()\n    this.updateStickersContents(force)\n  } else {\n    $(this.categoriesEl[this.tab].childNodes[cat]).addClass('active')\n    this.updateEmojiContents()\n  }\n}\n\nEmojiTooltip.prototype.selectTab = function (tab, force) {\n  if (this.tab === tab && !force) {\n    return false\n  }\n\n  this.tab = tab\n  this.selectCategory(0, true)\n\n  var self = this\n  setTimeout(function () {\n    $(self.tooltipEl).toggleClass('composer_emoji_tooltip_tabs_stickers_active', tab == 1)\n  }, 0)\n}\n\nEmojiTooltip.prototype.updateEmojiContents = function () {\n  var html = []\n  var self = this\n  var iconSize = 26\n\n  var renderContent = function () {\n    self.emojiContentEl.html(html.join(''))\n    self.emojiScroller.reinit()\n  }\n\n  if (this.cat > 0) {\n    var categoryIndex = this.cat - 1\n    var emoticonCodes = Config.EmojiCategories[categoryIndex]\n    var totalColumns = Config.EmojiCategorySpritesheetDimens[categoryIndex][1]\n    var count = emoticonCodes.length\n    var emoticonCode\n    var emoticonData\n    var i\n    var x\n    var y\n\n    for (i = 0; i < count; i++) {\n      emoticonCode = emoticonCodes[i]\n      emoticonData = Config.Emoji[emoticonCode]\n      x = iconSize * (i % totalColumns)\n      y = iconSize * Math.floor(i / totalColumns)\n      html.push('<a class=\"composer_emoji_btn\" title=\":' + encodeEntities(emoticonData[1][0]) + ':\" data-code=\"' + encodeEntities(emoticonCode) + '\"><i class=\"emoji emoji-w' + iconSize + ' emoji-spritesheet-' + categoryIndex + '\" style=\"background-position: -' + x + 'px -' + y + 'px;\"></i></a>')\n    }\n    renderContent()\n  }else {\n    EmojiHelper.getPopularEmoji(function (popularEmoji) {\n      var emoticonCode\n      var emoticonData\n      var spritesheet\n      var pos\n      var categoryIndex\n      var count = popularEmoji.length\n      var i\n      var x\n      var y\n\n      for (i = 0; i < count; i++) {\n        emoticonCode = popularEmoji[i].code\n        if (emoticonData = Config.Emoji[emoticonCode]) {\n          spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]\n          categoryIndex = spritesheet[0]\n          pos = spritesheet[1]\n          x = iconSize * spritesheet[3]\n          y = iconSize * spritesheet[2]\n          html.push('<a class=\"composer_emoji_btn\" title=\":' + encodeEntities(emoticonData[1][0]) + ':\" data-code=\"' + encodeEntities(emoticonCode) + '\"><i class=\"emoji emoji-w' + iconSize + ' emoji-spritesheet-' + categoryIndex + '\" style=\"background-position: -' + x + 'px -' + y + 'px;\"></i></a>')\n        }\n      }\n      renderContent()\n    })\n  }\n}\n\nEmojiTooltip.prototype.updateStickersContents = function (force) {\n  var html = []\n  var categoriesHtml = []\n  var self = this\n  var iconSize = 26\n\n  var scrollStickers = function () {\n    var scrollTop = self.cat ? self.stickersetPositions[self.cat][0] : 0\n    self.stickersScroller.scrollTo(scrollTop, force ? 0 : 200)\n  }\n\n  if (!force && self.stickersetPositions.length) {\n    scrollStickers()\n    return\n  }\n\n  var renderStickers = function (stickersets) {\n    var set\n    var docID\n    var i\n    var j\n    var len1\n    var len2\n    for (i = 0, len1 = stickersets.length; i < len1; i++) {\n      set = stickersets[i]\n      if (!set.docIDs.length) {\n        continue\n      }\n      html.push('<div class=\"composer_stickerset_wrap clearfix\">')\n      if (set.title) {\n        html.push(\n          '<a class=\"composer_stickerset_title',\n          set.id ? '' : ' disabled',\n          '\" data-stickerset=\"',\n          encodeEntities(set.short_name),\n          '\">',\n          encodeEntities(set.title),\n          '</a>'\n        )\n      }\n      if (!set.id) {\n        categoriesHtml.push('<a class=\"composer_emoji_tooltip_category active\" data-category=\"0\"><i class=\"composer_emoji_tooltip_category_recent\"></i></a>')\n      } else {\n        categoriesHtml.push('<a class=\"composer_sticker_btn\" data-sticker=\"' + set.docIDs[0] + '\" data-category=\"' + i + '\"></a>')\n      }\n      for (j = 0, len2 = set.docIDs.length; j < len2; j++) {\n        docID = set.docIDs[j]\n        html.push('<a class=\"composer_sticker_btn\" data-sticker=\"' + docID + '\"></a>')\n      }\n      html.push('</div>')\n    }\n\n    self.stickersContentEl.html(html.join(''))\n    self.stickersCategoriesEl.html(categoriesHtml.join(''))\n    self.stickersScroller.reinit()\n\n    var scrollPositions = []\n    $('.composer_stickerset_wrap', self.stickersContentEl).each(function (k, stickerSetEl) {\n      var height = stickerSetEl.offsetHeight\n      var top = stickerSetEl.offsetTop\n      scrollPositions.push([top, height])\n    })\n    self.stickersetPositions = scrollPositions\n    scrollStickers()\n\n    var preload = []\n    self.contentEl.find('.composer_sticker_btn').each(function (k, element) {\n      if (k < 12) {\n        self.replaceStickerImage(element)\n      } else {\n        preload.push([element.offsetTop, element])\n      }\n    })\n    self.stickersPreload = preload\n\n    self.stickersCategoriesEl.find('.composer_sticker_btn').each(function (k, element) {\n      self.replaceStickerImage(element)\n    })\n  }\n  this.getStickers(renderStickers)\n}\n\nEmojiTooltip.prototype.replaceStickerImage = function (element) {\n  element = $(element)\n  this.getStickerImage(element, element.attr('data-sticker'))\n}\n\nEmojiTooltip.prototype.onStickersScroll = function (scrollable, scrollTop) {\n  var ch = scrollable.clientHeight\n  var sh = scrollable.scrollHeight\n  var len = this.stickersetPositions.length\n  var currentCat = false\n  var currentPos\n  var i\n\n  if (scrollTop < 20) {\n    currentCat = 0\n  } else if (scrollTop > sh - ch - 20) {\n    currentCat = len - 1\n  } else {\n    for (i = 0; i < len; i++) {\n      currentPos = this.stickersetPositions[i]\n      if (scrollTop >= currentPos[0] &&\n        scrollTop < (currentPos[0] + currentPos[1])) {\n        currentCat = i\n        break\n      }\n    }\n  }\n  var len = this.stickersPreload.length\n  if (len) {\n    for (i = 0; i < len; i++) {\n      currentPos = this.stickersPreload[i]\n      if (currentPos[0] >= scrollTop && currentPos[0] <= scrollTop + ch) {\n        // console.log('replace', currentPos[1], i)\n        this.replaceStickerImage(currentPos[1])\n        this.stickersPreload.splice(i, 1)\n        i--\n        len--\n      }\n    }\n  }\n  // console.log('on sticker scroll', scrollTop, ch, sh, currentCat, this.stickersetPositions)\n  if (this.cat === currentCat || currentCat === false) {\n    return\n  }\n  $('.active', this.categoriesEl).removeClass('active')\n  this.cat = currentCat\n  this.activateStickerCategory()\n}\n\nEmojiTooltip.prototype.onStickersChanged = function () {\n  if (this.tab) {\n    this.updateStickersContents(true)\n  }\n}\n\nEmojiTooltip.prototype.activateStickerCategory = function () {\n  var categoriesEl = this.categoriesEl[1]\n  var categoryEl = categoriesEl.childNodes[this.cat]\n  if (!categoryEl) {\n    return\n  }\n  $(categoryEl).addClass('active')\n\n  var left = categoryEl.offsetLeft\n  var width = categoryEl.offsetWidth\n  var viewportWidth = categoriesEl.clientWidth\n\n  // console.log('current cat el', categoryEl, left, width, viewportWidth)\n  $(categoriesEl).stop(true).animate({scrollLeft: left - (viewportWidth - width) / 2}, 200)\n}\n\nEmojiTooltip.prototype.updatePosition = function () {\n  var offset = this.btnEl.offset()\n  this.tooltipEl.css({top: offset.top, left: offset.left})\n}\n\nEmojiTooltip.prototype.show = function () {\n  this.updatePosition()\n  if (this.tab) {\n    this.updateStickersContents(true)\n  } else {\n    this.updateEmojiContents()\n  }\n  this.tooltipEl.addClass('composer_emoji_tooltip_shown')\n  this.btnEl.addClass('composer_emoji_insert_btn_on')\n  delete this.showTimeout\n  this.shown = true\n}\n\nEmojiTooltip.prototype.hide = function () {\n  if (this.tooltipEl) {\n    this.tooltipEl.removeClass('composer_emoji_tooltip_shown')\n    this.btnEl.removeClass('composer_emoji_insert_btn_on')\n  }\n  delete this.hideTimeout\n  delete this.shown\n}\n\nfunction EmojiPanel (containerEl, options) {\n  options = options || {}\n  var self = this\n\n  this.containerEl = $(containerEl)\n  this.onEmojiSelected = options.onEmojiSelected\n\n  this.containerEl.on('mousedown', function (e) {\n    e = e.originalEvent || e\n    var target = $(e.target), code\n    if (target[0].tagName != 'A') {\n      target = $(target[0].parentNode)\n    }\n    if (code = target.attr('data-code')) {\n      if (self.onEmojiSelected) {\n        self.onEmojiSelected(code)\n      }\n      EmojiHelper.pushPopularEmoji(code)\n    }\n    return cancelEvent(e)\n  })\n\n  this.update()\n}\n\nEmojiPanel.prototype.update = function () {\n  var html = []\n  var self = this\n  var iconSize = Config.Mobile ? 26 : 20\n\n  EmojiHelper.getPopularEmoji(function (popularEmoji) {\n    var emoticonCode\n    var emoticonData\n    var spritesheet\n    var pos\n    var categoryIndex\n    var count = popularEmoji.length\n    var i\n    var x\n    var y\n\n    for (i = 0; i < count; i++) {\n      emoticonCode = popularEmoji[i].code\n      if (emoticonData = Config.Emoji[emoticonCode]) {\n        spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]\n        categoryIndex = spritesheet[0]\n        pos = spritesheet[1]\n        x = iconSize * spritesheet[3]\n        y = iconSize * spritesheet[2]\n        html.push('<a class=\"composer_emoji_btn\" title=\":' + encodeEntities(emoticonData[1][0]) + ':\" data-code=\"' + encodeEntities(emoticonCode) + '\"><i class=\"emoji emoji-w20 emoji-spritesheet-' + categoryIndex + '\" style=\"background-position: -' + x + 'px -' + y + 'px;\"></i></a>')\n      }\n    }\n    self.containerEl.html(html.join(''))\n  })\n}\n\nfunction MessageComposer (textarea, options) {\n  var self = this\n\n  this.textareaEl = $(textarea)\n\n  this.setUpInput()\n\n  this.autoCompleteWrapEl = $('<div class=\"composer_dropdown_wrap\"></div>').appendTo(document.body)\n  var autoCompleteEl = $('<div></div>').appendTo(this.autoCompleteWrapEl)\n\n  options.dropdownDirective(autoCompleteEl, function (scope, newAutoCompleteEl) {\n    self.autoCompleteEl = newAutoCompleteEl\n    self.autoCompleteScope = scope\n    self.setUpAutoComplete()\n  })\n\n  this.isActive = false\n\n  this.onTyping = options.onTyping\n  this.onMessageSubmit = options.onMessageSubmit\n  this.onDirectionKey = options.onDirectionKey\n  this.getSendOnEnter = options.getSendOnEnter\n  this.onFilePaste = options.onFilePaste\n  this.onCommandSend = options.onCommandSend\n  this.onInlineResultSend = options.onInlineResultSend\n  this.mentions = options.mentions\n  this.commands = options.commands\n  this.renderToggleCnt = 0\n}\n\nMessageComposer.autoCompleteRegEx = /(\\s|^)(:|@|\\/)([\\S]*)$/\n\nMessageComposer.prototype.setUpInput = function () {\n  this.inlinePlaceholderWrap = $('<div class=\"im_inline_placeholder_wrap\"></div>').prependTo(this.textareaEl[0].parentNode)\n  this.inlinePlaceholderPrefixEl = $('<span class=\"im_inline_placeholder_prefix\"></span>').appendTo(this.inlinePlaceholderWrap)\n  this.inlinePlaceholderEl = $('<span class=\"im_inline_placeholder\"></span>').appendTo(this.inlinePlaceholderWrap)\n\n  if ('contentEditable' in document.body) {\n    this.setUpRich()\n  } else {\n    this.setUpPlaintext()\n  }\n\n  if (!Config.Mobile) {\n    var sbWidth = getScrollWidth()\n    if (sbWidth) {\n      // hide scrollbar for both LTR and RTL languages\n      // both scrollbars are hidden inside the paddings\n      // that are overflown outside of view\n      (this.richTextareaEl || this.textareaEl).css({\n        left: -sbWidth,\n        width: 'calc(100% + ' + (2 * sbWidth) + 'px)',\n        'padding-left': sbWidth + 2,\n        'padding-right': sbWidth + 28\n      })\n    }\n  }\n}\n\nMessageComposer.prototype.setInlinePlaceholder = function (prefix, placeholder) {\n  this.inlinePlaceholderPrefix = prefix\n  this.inlinePlaceholderPrefixEl.html(encodeEntities(prefix))\n  this.inlinePlaceholderEl.html(encodeEntities(placeholder))\n  this.onChange()\n}\n\nMessageComposer.prototype.updateInlinePlaceholder = function () {\n  var prefix = this.inlinePlaceholderPrefix\n  if (prefix) {\n    var value = this.textareaEl.val()\n    this.inlinePlaceholderWrap.toggleClass('active', value == prefix)\n  }\n}\n\nMessageComposer.prototype.setUpAutoComplete = function () {\n  this.scroller = new Scroller(this.autoCompleteEl, {maxHeight: 180})\n\n  var self = this\n  this.autoCompleteEl.on('mousedown', function (e) {\n    e = e.originalEvent || e\n    var target = e.target\n    var mention\n    var code\n    var command\n    var inlineID\n    while (target && target.tagName != 'A') {\n      target = target.parentNode\n    }\n    if (!target) {\n      return cancelEvent(e)\n    }\n    target = $(target)\n    if (code = target.attr('data-code')) {\n      if (self.onEmojiSelected) {\n        self.onEmojiSelected(code, true)\n      }\n      EmojiHelper.pushPopularEmoji(code)\n    }\n    if (e.altKey || !target.attr('data-username')) {\n      mention = target.attr('data-user-id')\n    } else {\n      mention = target.attr('data-username')\n    }\n    if (mention) {\n      self.onMentionSelected(mention, target.attr('data-name'))\n    }\n    if (command = target.attr('data-command')) {\n      if (self.onCommandSelected) {\n        self.onCommandSelected(command)\n      }\n      self.hideSuggestions()\n    }\n    if (inlineID = target.attr('data-inlineid')) {\n      if (self.onInlineResultSend) {\n        self.onInlineResultSend(inlineID)\n      }\n      self.hideSuggestions()\n    }\n    return cancelEvent(e)\n  })\n}\n\nMessageComposer.prototype.setUpRich = function () {\n  this.textareaEl.hide()\n  this.richTextareaEl = $('<div class=\"composer_rich_textarea\" contenteditable=\"true\" dir=\"auto\"></div>')\n\n  this.textareaEl[0].parentNode.insertBefore(this.richTextareaEl[0], this.textareaEl[0])\n\n  this.richTextareaEl.on('keyup keydown', this.onKeyEvent.bind(this))\n  this.richTextareaEl.on('focus blur', this.onFocusBlur.bind(this))\n  this.richTextareaEl.on('paste', this.onRichPaste.bind(this))\n  this.richTextareaEl.on('DOMNodeInserted', this.onRichPasteNode.bind(this))\n\n  $(document.body).on('keydown', this.backupSelection.bind(this))\n}\n\nMessageComposer.prototype.setUpPlaintext = function () {\n  this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this))\n  this.textareaEl.on('focus blur', this.onFocusBlur.bind(this))\n}\n\nMessageComposer.prototype.onKeyEvent = function (e) {\n  var self = this\n  if (e.type == 'keyup') {\n    // console.log(dT(), 'keyup', e.keyCode)\n    this.checkAutocomplete()\n\n    var length = false\n    if (this.richTextareaEl) {\n      clearTimeout(this.updateValueTO)\n      var now = tsNow()\n      if (this.keyupStarted === undefined) {\n        this.keyupStarted = now\n      }\n      if (now - this.keyupStarted > 3000 || true) {\n        this.onChange()\n      }else {\n        length = this.richTextareaEl[0].textContent.length\n        if (this.wasEmpty != !length) {\n          this.wasEmpty = !this.wasEmpty\n          this.onChange()\n        } else if (this.inlinePlaceholderPrefix) {\n          this.onChange()\n        } else {\n          this.updateValueTO = setTimeout(this.onChange.bind(this), 1000)\n        }\n      }\n    }\n\n    if (this.onTyping) {\n      var now = tsNow()\n      if (now - this.lastTyping > 5000) {\n        if (length === false) {\n          length = (this.richTextareaEl ? this.richTextareaEl[0].textContent : this.textareaEl[0].value).length\n        }\n\n        if (length != this.lastLength) {\n          this.lastTyping = now\n          this.lastLength = length\n          this.onTyping()\n        }\n      }\n    }\n  }\n  if (e.type == 'keydown') {\n    var checkSubmit = !this.autocompleteShown\n    if (this.autocompleteShown) {\n      if (e.keyCode == 38 || e.keyCode == 40) { // UP / DOWN\n        var next = e.keyCode == 40\n        var currentSel = $(this.autoCompleteEl).find('li.composer_autocomplete_option_active')\n        var allLIs = Array.prototype.slice.call($(this.autoCompleteEl).find('li'))\n        var nextSel\n\n        if (currentSel.length) {\n          var pos = allLIs.indexOf(currentSel[0])\n          var nextPos = pos + (next ? 1 : -1)\n          nextSel = allLIs[nextPos]\n          currentSel.removeClass('composer_autocomplete_option_active')\n          if (nextSel) {\n            $(nextSel).addClass('composer_autocomplete_option_active')\n            this.scroller.scrollToNode(nextSel)\n            // console.log(dT(), 'keydown cancel', e.keyCode)\n            return cancelEvent(e)\n          }\n        }\n\n        nextSel = allLIs[next ? 0 : allLIs.length - 1]\n        this.scroller.scrollToNode(nextSel)\n        $(nextSel).addClass('composer_autocomplete_option_active')\n\n        // console.log(dT(), 'keydown cancel', e.keyCode)\n        return cancelEvent(e)\n      }\n\n      if (e.keyCode == 13 || e.keyCode == 9) { // Enter or Tab\n        var currentSel = $(this.autoCompleteEl).find('li.composer_autocomplete_option_active')\n        if (!currentSel.length && e.keyCode == 9) {\n          currentSel = $(this.autoCompleteEl).find('li:first')\n        }\n        currentSel = currentSel.find('a:first')\n        var code\n        var mention\n        var command\n        var inlineID\n        if (code = currentSel.attr('data-code')) {\n          this.onEmojiSelected(code, true)\n          EmojiHelper.pushPopularEmoji(code)\n          return cancelEvent(e)\n        }\n        if (e.altKey || !currentSel.attr('data-username')) {\n          mention = currentSel.attr('data-user-id')\n        } else {\n          mention = currentSel.attr('data-username')\n        }\n        if (mention) {\n          this.onMentionSelected(mention, currentSel.attr('data-name'))\n          return cancelEvent(e)\n        }\n        if (command = currentSel.attr('data-command')) {\n          if (this.onCommandSelected) {\n            this.onCommandSelected(command, e.keyCode == 9)\n          }\n          return cancelEvent(e)\n        }\n        if (inlineID = currentSel.attr('data-inlineid')) {\n          if (self.onInlineResultSend) {\n            self.onInlineResultSend(inlineID)\n          }\n          self.hideSuggestions()\n          // console.log(dT(), 'keydown cancel', e.keyCode)\n          return cancelEvent(e)\n        }\n        checkSubmit = true\n      }\n    }\n\n    if (checkSubmit && e.keyCode == 13) {\n      var submit = false\n      var sendOnEnter = true\n      if (this.getSendOnEnter && !this.getSendOnEnter()) {\n        sendOnEnter = false\n      }\n      if (sendOnEnter && !e.shiftKey) {\n        submit = true\n      } else if (!sendOnEnter && (e.ctrlKey || e.metaKey)) {\n        submit = true\n      }\n\n      if (submit) {\n        this.onMessageSubmit(e)\n        return cancelEvent(e)\n      }\n    }\n\n    // Direction keys when content is empty\n    if ([33, 34, 35, 36, 38, 39].indexOf(e.keyCode) != -1 &&\n        !e.shiftKey &&\n        !e.altKey &&\n        !e.ctrlKey &&\n        !e.metaKey &&\n        this.richTextareaEl &&\n        !this.richTextareaEl[0].textContent.length) {\n      return this.onDirectionKey(e)\n    }\n  }\n}\n\nMessageComposer.prototype.backupSelection = function () {\n  delete this.selection\n\n  if (!this.isActive) {\n    return\n  }\n  if (window.getSelection) {\n    var sel = window.getSelection()\n    if (sel.getRangeAt && sel.rangeCount) {\n      this.selection = sel.getRangeAt(0)\n    }\n  } else if (document.selection && document.selection.createRange) {\n    this.selection = document.selection.createRange()\n  }\n}\n\nMessageComposer.prototype.restoreSelection = function () {\n  if (!this.selection) {\n    return false\n  }\n  var result = false\n  if (window.getSelection) {\n    var sel = window.getSelection()\n    sel.removeAllRanges()\n    sel.addRange(this.selection)\n    result = true\n  }\n  else if (document.selection && this.selection.select) {\n    this.selection.select()\n    result = true\n  }\n  delete this.selection\n\n  return result\n}\n\nMessageComposer.prototype.checkAutocomplete = function (forceFull) {\n  var pos\n  var value\n  if (this.richTextareaEl) {\n    var textarea = this.richTextareaEl[0]\n    var valueCaret = getRichValueWithCaret(textarea)\n    var value = valueCaret[0]\n    var pos = valueCaret[1] >= 0 ? valueCaret[1] : value.length\n\n    if (!pos) {\n      this.cleanRichTextarea(value, true)\n    }\n  } else {\n    var textarea = this.textareaEl[0]\n    var pos = getFieldSelection(textarea)\n    var value = textarea.value\n  }\n\n  if (value &&\n    this.curInlineResults &&\n    this.curInlineResults.text == value) {\n    this.showInlineSuggestions(this.curInlineResults)\n    return\n  }\n\n  if (!forceFull) {\n    value = value.substr(0, pos)\n  }\n\n  var matches = value.match(MessageComposer.autoCompleteRegEx)\n  if (matches) {\n    if (this.previousQuery == matches[0]) {\n      return\n    }\n    this.previousQuery = matches[0]\n    var query = SearchIndexManager.cleanSearchText(matches[3])\n\n    if (matches[2] == '@') { // mentions\n      if (this.mentions && this.mentions.index) {\n        if (query.length) {\n          var foundObject = SearchIndexManager.search(query, this.mentions.index)\n          var foundUsers = []\n          var user\n          for (var i = 0, length = this.mentions.users.length; i < length; i++) {\n            user = this.mentions.users[i]\n            if (foundObject[user.id]) {\n              foundUsers.push(user)\n            }\n          }\n        } else {\n          var foundUsers = this.mentions.users\n        }\n        if (foundUsers.length) {\n          this.showMentionSuggestions(foundUsers)\n        } else {\n          this.hideSuggestions()\n        }\n      } else {\n        this.hideSuggestions()\n      }\n    }\n    else if (!matches[1] && matches[2] == '/') { // commands\n      if (this.commands && this.commands.index) {\n        if (query.length) {\n          var foundObject = SearchIndexManager.search(query, this.commands.index)\n          var foundCommands = []\n          var command\n          for (var i = 0, length = this.commands.list.length; i < length; i++) {\n            command = this.commands.list[i]\n            if (foundObject[command.value]) {\n              foundCommands.push(command)\n            }\n          }\n        } else {\n          var foundCommands = this.commands.list\n        }\n        if (foundCommands.length) {\n          this.showCommandsSuggestions(foundCommands)\n        } else {\n          this.hideSuggestions()\n        }\n      } else {\n        this.hideSuggestions()\n      }\n    }\n    else if (matches[2] == ':') { // emoji\n      if (value.match(/^\\s*:(.+):\\s*$/)) {\n        return\n      }\n      EmojiHelper.getPopularEmoji((function (popular) {\n        if (query.length) {\n          var found = EmojiHelper.searchEmojis(query)\n          if (found.length) {\n            var popularFound = [],\n              code\n            var pos\n            for (var i = 0, len = popular.length; i < len; i++) {\n              code = popular[i].code\n              pos = found.indexOf(code)\n              if (pos >= 0) {\n                popularFound.push(code)\n                found.splice(pos, 1)\n                if (!found.length) {\n                  break\n                }\n              }\n            }\n            this.showEmojiSuggestions(popularFound.concat(found))\n          } else {\n            this.hideSuggestions()\n          }\n        } else {\n          this.showEmojiSuggestions(popular)\n        }\n      }).bind(this))\n    }\n  }else {\n    delete this.previousQuery\n    this.hideSuggestions()\n  }\n}\n\nMessageComposer.prototype.onFocusBlur = function (e) {\n  this.isActive = e.type == 'focus'\n\n  if (!this.isActive) {\n    this.cleanRichTextarea()\n    this.hideSuggestions()\n  } else {\n    setTimeout(this.checkAutocomplete.bind(this), 100)\n  }\n  if (this.richTextareaEl) {\n    document.execCommand('enableObjectResizing', !this.isActive, !this.isActive)\n  }\n}\n\nMessageComposer.prototype.onRichPaste = function (e) {\n  var cData = (e.originalEvent || e).clipboardData\n  var items = cData && cData.items || [],\n    i\n  for (i = 0; i < items.length; i++) {\n    if (items[i].kind == 'file') {\n      e.preventDefault()\n      return true\n    }\n  }\n\n  try {\n    var text = cData.getData('text/plain')\n  } catch (e) {\n    return true\n  }\n  setZeroTimeout(this.onChange.bind(this), 0)\n  if (text.length) {\n    document.execCommand('insertText', false, text)\n    return cancelEvent(e)\n  }\n  return true\n}\n\nMessageComposer.prototype.cleanRichTextarea = function (value, focused) {\n  if (!this.richTextareaEl[0]) {\n    return\n  }\n  if (value === undefined) {\n    value = getRichValue(this.richTextareaEl[0])\n  }\n  if (value.match(/^\\s*$/) && this.richTextareaEl.html().length > 0) {\n    this.richTextareaEl.html('')\n    this.lastLength = 0\n    this.wasEmpty = true\n\n    if (focused) {\n      var self = this\n      setZeroTimeout(function () {\n        self.focus()\n      })\n    }\n  }\n}\n\nMessageComposer.prototype.onRichPasteNode = function (e) {\n  var element = (e.originalEvent || e).target\n  var src = (element || {}).src || ''\n  var remove = false\n\n  if (src.substr(0, 5) == 'data:') {\n    remove = true\n    var blob = dataUrlToBlob(src)\n    this.onFilePaste(blob)\n    setZeroTimeout(function () {\n      element.parentNode.replaceChild(document.createTextNode('   '), element)\n    })\n  }\n  else if (src && !src.match(/img\\/blank\\.gif/)) {\n    var replacementNode = document.createTextNode(' ' + src + ' ')\n    setTimeout(function () {\n      element.parentNode.replaceChild(replacementNode, element)\n    }, 100)\n  }\n}\n\nMessageComposer.prototype.onEmojiSelected = function (code, autocomplete) {\n  if (this.richTextareaEl) {\n    var textarea = this.richTextareaEl[0]\n    if (!this.isActive) {\n      if (!this.restoreSelection()) {\n        setRichFocus(textarea)\n      }\n    }\n    if (autocomplete) {\n      var valueCaret = getRichValueWithCaret(textarea)\n      var fullValue = valueCaret[0]\n      var pos = valueCaret[1] >= 0 ? valueCaret[1] : fullValue.length\n      var suffix = fullValue.substr(pos)\n      var prefix = fullValue.substr(0, pos)\n      var matches = prefix.match(/:([\\S]*)$/)\n      var emoji = EmojiHelper.emojis[code]\n\n      var newValuePrefix\n      if (matches && matches[0]) {\n        newValuePrefix = prefix.substr(0, matches.index) + ':' + emoji[1] + ':'\n      } else {\n        newValuePrefix = prefix + ':' + emoji[1] + ':'\n      }\n      textarea.value = newValue\n\n      var html\n      if (suffix.length) {\n        this.selId = (this.selId || 0) + 1\n        html = this.getRichHtml(newValuePrefix) + '&nbsp;<span id=\"composer_sel' + this.selId + '\"></span>' + this.getRichHtml(suffix)\n        this.richTextareaEl.html(html)\n        setRichFocus(textarea, $('#composer_sel' + this.selId)[0])\n      } else {\n        html = this.getRichHtml(newValuePrefix) + '&nbsp;'\n        this.richTextareaEl.html(html)\n        setRichFocus(textarea)\n      }\n    } else {\n      var html = this.getEmojiHtml(code)\n      if (window.getSelection) {\n        var sel = window.getSelection()\n        if (sel.getRangeAt && sel.rangeCount) {\n          var el = document.createElement('div')\n          el.innerHTML = html\n          var node = el.firstChild\n          var range = sel.getRangeAt(0)\n          range.deleteContents()\n          range.insertNode(document.createTextNode(' '))\n          range.insertNode(node)\n          range.setStart(node, 0)\n\n          setTimeout(function () {\n            range = document.createRange()\n            range.setStartAfter(node)\n            range.collapse(true)\n            sel.removeAllRanges()\n            sel.addRange(range)\n          }, 0)\n        }\n      } else if (document.selection && document.selection.type != 'Control') {\n        document.selection.createRange().pasteHTML(html)\n      }\n    }\n  }else {\n    var textarea = this.textareaEl[0]\n    var fullValue = textarea.value\n    var pos = this.isActive ? getFieldSelection(textarea) : fullValue.length\n    var suffix = fullValue.substr(pos)\n    var prefix = fullValue.substr(0, pos)\n    var matches = autocomplete && prefix.match(/:([\\S]*)$/)\n    var emoji = EmojiHelper.emojis[code]\n\n    if (matches && matches[0]) {\n      var newValue = prefix.substr(0, matches.index) + ':' + emoji[1] + ': ' + suffix\n      var newPos = matches.index + emoji[1].length + 3\n    } else {\n      var newValue = prefix + ':' + emoji[1] + ': ' + suffix\n      var newPos = prefix.length + emoji[1].length + 3\n    }\n    textarea.value = newValue\n    setFieldSelection(textarea, newPos)\n  }\n\n  this.hideSuggestions()\n  this.onChange()\n}\n\nMessageComposer.prototype.onMentionsUpdated = function (username) {\n  delete this.previousQuery\n  if (this.isActive) {\n    this.checkAutocomplete()\n  }\n}\n\nMessageComposer.prototype.onMentionSelected = function (username, firstName) {\n  var hasUsername = true;\n  if (username.charAt(0) == '#') {\n    hasUsername = false;\n    username = username.substr(1);\n    firstName = firstName.replace(/\\(\\)@/, '')\n  }\n\n  if (this.richTextareaEl) {\n    var textarea = this.richTextareaEl[0]\n    if (!this.isActive) {\n      if (!this.restoreSelection()) {\n        setRichFocus(textarea)\n      }\n    }\n    var valueCaret = getRichValueWithCaret(textarea)\n    var fullValue = valueCaret[0]\n    var pos = valueCaret[1] >= 0 ? valueCaret[1] : fullValue.length\n    var suffix = fullValue.substr(pos)\n    var prefix = fullValue.substr(0, pos)\n    var matches = prefix.match(/@([\\S]*)$/)\n\n    var newValuePrefix\n    if (matches && matches[0]) {\n      newValuePrefix = prefix.substr(0, matches.index) + '@' + username\n    } else {\n      newValuePrefix = prefix + '@' + username\n    }\n\n    var html\n    if (hasUsername) {\n      if (suffix.length) {\n        this.selId = (this.selId || 0) + 1\n        html = this.getRichHtml(newValuePrefix) + '&nbsp;<span id=\"composer_sel' + this.selId + '\"></span>' + this.getRichHtml(suffix)\n        this.richTextareaEl.html(html)\n        setRichFocus(textarea, $('#composer_sel' + this.selId)[0])\n      } else {\n        html = this.getRichHtml(newValuePrefix) + '&nbsp;'\n        this.richTextareaEl.html(html)\n        setRichFocus(textarea)\n      }\n    } else {\n      this.selId = (this.selId || 0) + 1\n      html = this.getRichHtml(newValuePrefix) + '&nbsp;(<span id=\"composer_sel' + this.selId + '\">' + encodeEntities(firstName) + '</span>)&nbsp;' + this.getRichHtml(suffix)\n      this.richTextareaEl.html(html)\n      setRichFocus(textarea, $('#composer_sel' + this.selId)[0], true)\n    }\n  } else {\n    var textarea = this.textareaEl[0]\n    var fullValue = textarea.value\n    var pos = this.isActive ? getFieldSelection(textarea) : fullValue.length\n    var suffix = fullValue.substr(pos)\n    var prefix = fullValue.substr(0, pos)\n    var matches = prefix.match(/@([\\S]*)$/)\n\n    var newValuePrefix\n    var newValue\n    var newPos\n    var newPosTo\n    if (matches && matches[0]) {\n      newValuePrefix = prefix.substr(0, matches.index) + '@' + username\n    } else {\n      newValuePrefix = prefix + '@' + username\n    }\n\n    if (hasUsername) {\n      newValue = newValuePrefix + '@' + username + ' ' + suffix\n      newPos = matches.index + username.length + 2\n    } else {\n      newValue = newValuePrefix + '@' + username + ' (' + firstName + ') ' + suffix\n      newPos = matches.index + username.length + 2\n      newPosTo = newPos + firstName.length\n    }\n    textarea.value = newValue\n    setFieldSelection(textarea, newPos, newPosTo)\n  }\n\n  this.hideSuggestions()\n  this.onChange()\n}\n\nMessageComposer.prototype.onCommandSelected = function (command, isTab) {\n  if (isTab) {\n    if (this.richTextareaEl) {\n      this.richTextareaEl.html(encodeEntities(command) + '&nbsp;')\n      setRichFocus(this.richTextareaEl[0])\n    }else {\n      var textarea = this.textareaEl[0]\n      textarea.value = command + ' '\n      setFieldSelection(textarea)\n    }\n  } else {\n    this.onCommandSend(command)\n  }\n\n  this.hideSuggestions()\n  this.onChange()\n}\n\nMessageComposer.prototype.onChange = function (e) {\n  if (this.richTextareaEl) {\n    delete this.keyupStarted\n    var richValue = getRichValue(this.richTextareaEl[0])\n    this.textareaEl.val(richValue).trigger('change')\n  }\n  this.updateInlinePlaceholder()\n}\n\nMessageComposer.prototype.getEmojiHtml = function (code, emoji) {\n  emoji = emoji || EmojiHelper.emojis[code]\n  var iconSize = 20\n  var spritesheet = EmojiHelper.spritesheetPositions[code]\n  var categoryIndex = spritesheet[0]\n  var pos = spritesheet[1]\n  var x = iconSize * spritesheet[3]\n  var y = iconSize * spritesheet[2]\n\n  return '<img src=\"img/blank.gif\" alt=\":' + encodeEntities(emoji[1]) + ':\" data-code=\"' + encodeEntities(code) + '\" class=\"emoji emoji-w20 emoji-spritesheet-' + categoryIndex + '\" style=\"background-position: -' + x + 'px -' + y + 'px;\" onresizestart=\"return false\" />'\n}\n\nMessageComposer.prototype.setValue = function (text) {\n  if (this.richTextareaEl) {\n    this.richTextareaEl.html(this.getRichHtml(text))\n    this.lastLength = text.length\n    this.wasEmpty = !text.length\n    this.onKeyEvent({type: 'keyup'})\n  } else {\n    this.textareaEl.val(text)\n  }\n}\n\nMessageComposer.prototype.setFocusedValue = function (parts) {\n  var prefix = parts[0]\n  var selection = parts[1]\n  var suffix = parts[2]\n\n  if (this.richTextareaEl) {\n    this.selId = (this.selId || 0) + 1\n    var html =\n    this.getRichHtml(prefix) +\n    '<span id=\"composer_sel' + this.selId + '\">' +\n    this.getRichHtml(selection) +\n    '</span>' +\n    this.getRichHtml(suffix)\n\n    this.richTextareaEl.html(html)\n\n    setRichFocus(this.richTextareaEl[0], $('#composer_sel' + this.selId)[0], true)\n  } else {\n    this.textareaEl.val(prefix + selection + suffix)\n    setFieldSelection(this.textareaEl[0], prefix.length, prefix.length + selection.length)\n  }\n}\n\nMessageComposer.prototype.getRichHtml = function (text) {\n  var html = $('<div>').text(text).html()\n  html = html.replace(/\\n/g, '<br/>')\n  html = html.replace(/:([A-Za-z0-9\\-\\+\\*_]+?):/gi, (function (all, shortcut) {\n    var code = EmojiHelper.shortcuts[shortcut]\n    if (code !== undefined) {\n      return this.getEmojiHtml(code)\n    }\n    return all\n  }).bind(this))\n  html = html.replace(/  /g, ' \\u00A0').replace(/^ | $/g, '\\u00A0')\n\n  return html\n}\n\nMessageComposer.prototype.focus = function () {\n  if (this.richTextareaEl) {\n    setZeroTimeout((function () {\n      setRichFocus(this.richTextareaEl[0])\n    }).bind(this))\n  } else {\n    setFieldSelection(this.textareaEl[0])\n  }\n}\n\nMessageComposer.prototype.blur = function () {\n  if (this.richTextareaEl) {\n    this.richTextareaEl[0].blur()\n  } else {\n    this.textareaEl[0].blur()\n  }\n}\n\nMessageComposer.prototype.renderSuggestions = function () {\n  this.autoCompleteWrapEl.show()\n  this.scroller.reinit()\n  this.updatePosition()\n  this.autocompleteShown = true\n}\n\nMessageComposer.prototype.showEmojiSuggestions = function (codes) {\n  var renderCnt = ++this.renderToggleCnt\n  var self = this\n  setZeroTimeout(function () {\n    self.autoCompleteScope.$apply(function () {\n      self.autoCompleteScope.type = 'emoji'\n      self.autoCompleteScope.emojiCodes = codes\n    })\n    onContentLoaded(function () {\n      if (renderCnt == self.renderToggleCnt) {\n        self.renderSuggestions()\n      }\n    })\n  })\n}\n\nMessageComposer.prototype.showMentionSuggestions = function (users) {\n  var renderCnt = ++this.renderToggleCnt\n  var self = this\n  setZeroTimeout(function () {\n    self.autoCompleteScope.$apply(function () {\n      self.autoCompleteScope.type = 'mentions'\n      self.autoCompleteScope.mentionUsers = users\n    })\n    onContentLoaded(function () {\n      if (renderCnt == self.renderToggleCnt) {\n        self.renderSuggestions()\n      }\n    })\n  })\n}\n\nMessageComposer.prototype.showCommandsSuggestions = function (commands) {\n  var renderCnt = ++this.renderToggleCnt\n  var self = this\n  setZeroTimeout(function () {\n    self.autoCompleteScope.$apply(function () {\n      self.autoCompleteScope.type = 'commands'\n      self.autoCompleteScope.commands = commands\n    })\n    onContentLoaded(function () {\n      if (renderCnt == self.renderToggleCnt) {\n        self.renderSuggestions()\n      }\n    })\n  })\n}\n\nMessageComposer.prototype.showInlineSuggestions = function (botResults) {\n  if (!botResults || !botResults.results.length) {\n    this.hideSuggestions()\n    return\n  }\n  var renderCnt = ++this.renderToggleCnt\n  var self = this\n  if (self.autoCompleteScope.type == 'inline' &&\n    self.autoCompleteScope.botResults == botResults &&\n    self.autocompleteShown) {\n    return\n  }\n  setZeroTimeout(function () {\n    self.autoCompleteScope.$apply(function () {\n      self.autoCompleteScope.type = 'inline'\n      self.autoCompleteScope.botResults = botResults\n    })\n    onContentLoaded(function () {\n      if (renderCnt == self.renderToggleCnt) {\n        self.renderSuggestions()\n      }\n    })\n  })\n}\n\nMessageComposer.prototype.setInlineSuggestions = function (botResults) {\n  this.curInlineResults = botResults\n  this.checkAutocomplete()\n}\n\nMessageComposer.prototype.updatePosition = function () {\n  var offset = (this.richTextareaEl || this.textareaEl).offset()\n  var height = this.scroller.updateHeight()\n  var width = $((this.richTextareaEl || this.textareaEl)[0].parentNode).outerWidth()\n  this.autoCompleteWrapEl.css({\n    top: offset.top - height,\n    left: Config.Mobile ? 0 : offset.left,\n    width: Config.Mobile ? '100%' : width - 2\n  })\n  this.scroller.update()\n}\n\nMessageComposer.prototype.hideSuggestions = function () {\n  var renderCnt = ++this.renderToggleCnt\n  // console.trace(dT())\n  // return\n  this.autoCompleteWrapEl.hide()\n  delete this.autocompleteShown\n}\n\nMessageComposer.prototype.resetTyping = function () {\n  this.lastTyping = 0\n  this.lastLength = 0\n}\n\nMessageComposer.prototype.setPlaceholder = function (newPlaceholder) {\n  ;(this.richTextareaEl || this.textareaEl).attr('placeholder', newPlaceholder)\n}\n\nfunction Scroller (content, options) {\n  options = options || {}\n  var classPrefix = options.classPrefix || 'scroller'\n\n  this.content = $(content)\n  this.useNano = options.nano !== undefined ? options.nano : !Config.Mobile\n  this.maxHeight = options.maxHeight\n  this.minHeight = options.minHeight\n\n  if (this.useNano) {\n    this.setUpNano()\n  } else {\n    this.setUpNative()\n  }\n  this.updateHeight()\n}\nScroller.prototype.setUpNano = function () {\n  this.content.wrap('<div class=\"scroller_scrollable_container\"><div class=\"scroller_scrollable_wrap nano\"><div class=\"scroller_scrollable nano-content \"></div></div></div>')\n\n  this.scrollable = $(this.content[0].parentNode)\n  this.scroller = $(this.scrollable[0].parentNode)\n  this.wrap = $(this.scroller[0].parentNode)\n\n  this.scroller.nanoScroller({preventPageScrolling: true, tabIndex: -1})\n}\n\nScroller.prototype.setUpNative = function () {\n  this.content.wrap('<div class=\"scroller_native_scrollable\"></div>')\n  this.scrollable = $(this.content[0].parentNode)\n\n  this.scrollable.css({overflow: 'auto'})\n  if (this.maxHeight) {\n    this.scrollable.css({maxHeight: this.maxHeight})\n  }\n  if (this.minHeight) {\n    this.scrollable.css({minHeight: this.minHeight})\n  }\n}\n\nScroller.prototype.onScroll = function (cb) {\n  var self = this\n  var scrollable = this.scrollable[0]\n  this.scrollable.on('scroll', function (e) {\n    if (self.isAnimatedScroll) {\n      return\n    }\n    cb(scrollable, scrollable.scrollTop)\n  })\n}\n\nScroller.prototype.update = function () {\n  if (this.useNano) {\n    $(this.scroller).nanoScroller()\n  }\n}\n\nScroller.prototype.reinit = function () {\n  this.scrollTo(0)\n  if (this.useNano) {\n    setTimeout((function () {\n      this.updateHeight()\n    }).bind(this), 100)\n  }\n}\n\nScroller.prototype.updateHeight = function () {\n  var height\n  if (this.useNano) {\n    if (this.maxHeight || this.minHeight) {\n      height = this.content[0].offsetHeight\n      if (this.maxHeight && height > this.maxHeight) {\n        height = this.maxHeight\n      }\n      if (this.minHeight && height < this.minHeight) {\n        height = this.minHeight\n      }\n      this.wrap.css({height: height})\n    } else {\n      height = this.scroller[0].offsetHeight\n    }\n    $(this.scroller).nanoScroller()\n  } else {\n    height = this.scrollable[0].offsetHeight\n  }\n  return height\n}\n\nScroller.prototype.scrollTo = function (scrollTop, animation, cb) {\n  if (animation > 0) {\n    var self = this\n    this.isAnimatedScroll = true\n    this.scrollable.animate({scrollTop: scrollTop}, animation, function () {\n      delete self.isAnimatedScroll\n      if (self.useNano) {\n        $(self.scroller).nanoScroller({flash: true})\n      }\n      self.scrollable.trigger('scroll')\n      if (cb) {\n        cb()\n      }\n    })\n  } else {\n    this.scrollable[0].scrollTop = scrollTop\n    if (this.useNano) {\n      $(this.scroller).nanoScroller({flash: true})\n    }\n    if (cb) {\n      cb()\n    }\n  }\n}\n\nScroller.prototype.scrollToNode = function (node) {\n  node = node[0] || node\n  var elTop = node.offsetTop - 15\n  var elHeight = node.offsetHeight + 30\n  var scrollTop = this.scrollable[0].scrollTop\n  var viewportHeight = this.scrollable[0].clientHeight\n\n  if (scrollTop > elTop) { // we are below the node to scroll\n    this.scrollTo(elTop)\n  }\n  else if (scrollTop < elTop + elHeight - viewportHeight) { // we are over the node to scroll\n    this.scrollTo(elTop + elHeight - viewportHeight)\n  }\n}\n"
  },
  {
    "path": "app/js/messages_manager.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n\nangular.module('myApp.services')\n\n  .service('AppMessagesManager', function ($q, $rootScope, $location, $filter, $timeout, $sce, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppDocsManager, AppStickersManager, AppMessagesIDsManager, DraftsManager, AppWebPagesManager, AppGamesManager, MtpApiManager, MtpApiFileManager, ServerTimeManager, RichTextProcessor, NotificationsManager, Storage, AppProfileManager, TelegramMeWebService, ErrorService, StatusManager, _) {\n    var messagesStorage = {}\n    var messagesForHistory = {}\n    var messagesForDialogs = {}\n    var historiesStorage = {}\n    var dialogsStorage = {count: null, dialogs: []}\n    var pendingByRandomID = {}\n    var pendingByMessageID = {}\n    var pendingAfterMsgs = {}\n    var pendingTopMsgs = {}\n    var sendFilePromise = $q.when()\n    var tempID = -1\n    var tempFinalizeCallbacks = {}\n\n    var dialogsIndex = SearchIndexManager.createIndex()\n    var cachedResults = {query: false}\n\n    var lastSearchFilter = {}\n    var lastSearchResults = []\n\n    var needSingleMessages = []\n    var fetchSingleMessagesTimeout = false\n\n    var incrementedMessageViews = {}\n    var needIncrementMessageViews = []\n    var incrementMessageViewsTimeout = false\n\n    var maxSeenID = false\n    Storage.get('max_seen_msg').then(function (maxID) {\n      if (maxID &&\n          !AppMessagesIDsManager.getMessageIDInfo(maxID)[1]) {\n        maxSeenID = maxID\n      }\n    })\n\n    var dateOrTimeFilter = $filter('dateOrTime')\n    var fwdMessagesPluralize = _.pluralize('conversation_forwarded_X_messages')\n    var gameScorePluralize = _.pluralize('conversation_scored_X')\n\n    NotificationsManager.start()\n\n    var allDialogsLoaded = false\n    var dialogsOffsetDate = 0\n    var pinnedIndex = 0\n    var dialogsNum = 0\n\n    var migratedFromTo = {}\n    var migratedToFrom = {}\n\n    function getConversations (query, offsetIndex, limit) {\n      var curDialogStorage = dialogsStorage\n      var isSearch = angular.isString(query) && query.length\n\n      if (isSearch) {\n        if (!limit || cachedResults.query !== query) {\n          cachedResults.query = query\n\n          var results = SearchIndexManager.search(query, dialogsIndex)\n\n          cachedResults.dialogs = []\n          angular.forEach(dialogsStorage.dialogs, function (dialog) {\n            if (results[dialog.peerID]) {\n              cachedResults.dialogs.push(dialog)\n            }\n          })\n          cachedResults.count = cachedResults.dialogs.length\n        }\n        curDialogStorage = cachedResults\n      } else {\n        cachedResults.query = false\n      }\n\n      var offset = 0\n      if (offsetIndex > 0) {\n        for (offset = 0; offset < curDialogStorage.dialogs.length; offset++) {\n          if (offsetIndex > curDialogStorage.dialogs[offset].index) {\n            break\n          }\n        }\n      }\n\n      limit = limit || 20\n\n      if (\n        isSearch ||\n        allDialogsLoaded ||\n        curDialogStorage.dialogs.length >= offset + limit\n      ) {\n        return $q.when({\n          dialogs: curDialogStorage.dialogs.slice(offset, offset + limit)\n        })\n      }\n\n      return getTopMessages(limit).then(function () {\n        offset = 0\n        if (offsetIndex > 0) {\n          for (offset = 0; offset < curDialogStorage.dialogs.length; offset++) {\n            if (offsetIndex > curDialogStorage.dialogs[offset].index) {\n              break\n            }\n          }\n        }\n        return {\n          dialogs: curDialogStorage.dialogs.slice(offset, offset + limit)\n        }\n      })\n    }\n\n    function getConversation(peerID) {\n      var foundDialog = getDialogByPeerID(peerID)\n      if (foundDialog.length) {\n        return $q.when(foundDialog[0])\n      }\n      return $q.when({\n        peerID: peerID,\n        top_message: 0,\n        index: generateDialogIndex(generateDialogPinnedDate()),\n        pFlags: {}\n      })\n    }\n\n    function getDialogByPeerID (peerID) {\n      for (var i = 0; i < dialogsStorage.dialogs.length; i++) {\n        if (dialogsStorage.dialogs[i].peerID == peerID) {\n          return [dialogsStorage.dialogs[i], i]\n        }\n      }\n\n      return []\n    }\n\n    function saveConversation (dialog) {\n      var peerID = AppPeersManager.getPeerID(dialog.peer)\n      if (!peerID) {\n        return false\n      }\n      var channelID = AppPeersManager.isChannel(peerID) ? -peerID : 0\n      var peerText = AppPeersManager.getPeerSearchText(peerID)\n      SearchIndexManager.indexObject(peerID, peerText, dialogsIndex)\n\n      var isMegagroup = AppPeersManager.isMegagroup(channelID)\n      if (dialog.top_message) {\n        var mid = AppMessagesIDsManager.getFullMessageID(dialog.top_message, channelID)\n        var message = getMessage(mid)\n      } else {\n        var mid = tempID--\n        var message = {\n          _: 'message',\n          id: mid,\n          mid: mid,\n          from_id: AppUsersManager.getSelf().id,\n          to_id: AppPeersManager.getOutputPeer(peerID),\n          deleted: true,\n          flags: 0,\n          pFlags: {unread: false, out: true},\n          date: 0,\n          message: ''\n        }\n        saveMessages([message])\n      }\n      var offsetDate = message.date\n\n      if (!channelID && peerID < 0) {\n        var chat = AppChatsManager.getChat(-peerID)\n        if (chat && chat.migrated_to && chat.pFlags.deactivated) {\n          var migratedToPeer = AppPeersManager.getPeerID(chat.migrated_to)\n          migratedFromTo[peerID] = migratedToPeer\n          migratedToFrom[migratedToPeer] = peerID\n          return\n        }\n      }\n\n      dialog.top_message = mid\n      dialog.read_inbox_max_id = AppMessagesIDsManager.getFullMessageID(dialog.read_inbox_max_id, channelID)\n      dialog.read_outbox_max_id = AppMessagesIDsManager.getFullMessageID(dialog.read_outbox_max_id, channelID)\n\n      var topDate = message.date\n      if (channelID) {\n        var channel = AppChatsManager.getChat(channelID)\n        if (!topDate || channel.date && channel.date > topDate) {\n          topDate = channel.date\n        }\n      }\n      var savedDraft = DraftsManager.saveDraft(peerID, dialog.draft)\n      if (savedDraft && savedDraft.date > topDate) {\n        topDate = savedDraft.date\n      }\n      if (dialog.pFlags.pinned) {\n        topDate = generateDialogPinnedDate()\n      }\n\n      dialog.index = generateDialogIndex(topDate)\n      dialog.peerID = peerID\n\n      pushDialogToStorage(dialog, offsetDate)\n\n      // Because we saved message without dialog present\n      var unreadKey = message.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'\n      if (message.mid && message.mid > dialog[unreadKey]) {\n        message.pFlags.unread = true\n      }\n\n      if (historiesStorage[peerID] === undefined &&\n        !message.deleted) {\n        var historyStorage = {count: null, history: [], pending: []}\n        historyStorage[mid > 0 ? 'history' : 'pending'].push(mid)\n        if (mid < 0 && message.pFlags.unread) {\n          dialog.unread_count++\n        }\n        historiesStorage[peerID] = historyStorage\n        if (mergeReplyKeyboard(historyStorage, message)) {\n          $rootScope.$broadcast('history_reply_markup', {peerID: peerID})\n        }\n      }\n\n      NotificationsManager.savePeerSettings(peerID, dialog.notify_settings)\n\n      if (channelID && dialog.pts) {\n        ApiUpdatesManager.addChannelState(channelID, dialog.pts)\n      }\n\n      if (\n        Config.Modes.packed &&\n        !channelID &&\n        dialog.unread_count > 0 &&\n        maxSeenID &&\n        dialog.top_message > maxSeenID &&\n        message.pFlags.unread &&\n        !message.pFlags.out\n      ) {\n        var notifyPeer = message.flags & 16 ? message.from_id : peerID\n        NotificationsManager.getPeerMuted(notifyPeer).then(function (muted) {\n          if (!muted) {\n            notifyAboutMessage(message)\n          }\n        })\n      }\n    }\n\n    function getTopMessages (limit) {\n      var first = true\n      var dialogs = dialogsStorage.dialogs\n      var offsetDate = 0\n      var offsetID = 0\n      var offsetPeerID = 0\n      var offsetIndex = 0\n      var flags = 0\n      if (dialogsOffsetDate) {\n        offsetDate = dialogsOffsetDate + ServerTimeManager.serverTimeOffset\n        offsetIndex = dialogsOffsetDate * 0x10000\n        flags |= 1\n      }\n      return MtpApiManager.invokeApi('messages.getDialogs', {\n        flags: flags,\n        offset_date: offsetDate,\n        offset_id: AppMessagesIDsManager.getMessageLocalID(offsetID),\n        offset_peer: AppPeersManager.getInputPeerByID(offsetPeerID),\n        limit: limit\n      }, {\n        timeout: 300\n      }).then(function (dialogsResult) {\n        if (!offsetDate) {\n          TelegramMeWebService.setAuthorized(true)\n        }\n\n        AppUsersManager.saveApiUsers(dialogsResult.users)\n        AppChatsManager.saveApiChats(dialogsResult.chats)\n        saveMessages(dialogsResult.messages)\n\n        var maxSeenIdIncremented = offsetDate ? true : false\n        var hasPrepend = false\n        dialogsResult.dialogs.reverse()\n        angular.forEach(dialogsResult.dialogs, function (dialog) {\n          saveConversation(dialog)\n          if (offsetIndex && dialog.index > offsetIndex) {\n            newDialogsToHandle[dialog.peerID] = dialog\n            hasPrepend = true\n          }\n\n          if (!maxSeenIdIncremented &&\n              !AppPeersManager.isChannel(AppPeersManager.getPeerID(dialog.peer))) {\n            incrementMaxSeenID(dialog.top_message)\n            maxSeenIdIncremented = true\n          }\n        })\n        dialogsResult.dialogs.reverse()\n\n        if (!dialogsResult.dialogs.length ||\n          !dialogsResult.count ||\n          dialogs.length >= dialogsResult.count) {\n          allDialogsLoaded = true\n        }\n\n        if (hasPrepend &&\n            !newDialogsHandlePromise) {\n          newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n        } else {\n          $rootScope.$broadcast('dialogs_multiupdate', {})\n        }\n      })\n    }\n\n    function generateDialogPinnedDate() {\n      return 0x7fffff00 + ((pinnedIndex++) & 0xff)\n    }\n\n    function generateDialogIndex (date) {\n      if (date === undefined) {\n        date = tsNow(true) + ServerTimeManager.serverTimeOffset\n      }\n      return (date * 0x10000) + ((++dialogsNum) & 0xFFFF)\n    }\n\n    function pushDialogToStorage (dialog, offsetDate) {\n      var dialogs = dialogsStorage.dialogs\n      var pos = getDialogByPeerID(dialog.peerID)[1]\n      if (pos !== undefined) {\n        dialogs.splice(pos, 1)\n      }\n\n      if (offsetDate &&\n          !dialog.pFlags.pinned &&\n          (!dialogsOffsetDate || offsetDate < dialogsOffsetDate)) {\n        if (pos !== undefined) {\n          // So the dialog jumped to the last position\n          return false\n        }\n        dialogsOffsetDate = offsetDate\n      }\n\n      var index = dialog.index\n      var i\n      var len = dialogs.length\n      if (!len || index < dialogs[len - 1].index) {\n        dialogs.push(dialog)\n      }\n      else if (index >= dialogs[0].index) {\n        dialogs.unshift(dialog)\n      }\n      else {\n        for (i = 0; i < len; i++) {\n          if (index > dialogs[i].index) {\n            dialogs.splice(i, 0, dialog)\n            break\n          }\n        }\n      }\n    }\n\n    function requestHistory (peerID, maxID, limit, offset) {\n      var isChannel = AppPeersManager.isChannel(peerID)\n      var isMegagroup = isChannel && AppPeersManager.isMegagroup(peerID)\n\n      return MtpApiManager.invokeApi('messages.getHistory', {\n        peer: AppPeersManager.getInputPeerByID(peerID),\n        offset_id: maxID ? AppMessagesIDsManager.getMessageLocalID(maxID) : 0,\n        add_offset: offset || 0,\n        limit: limit || 0\n      }, {\n        timeout: 300,\n        noErrorBox: true\n      }).then(function (historyResult) {\n        AppUsersManager.saveApiUsers(historyResult.users)\n        AppChatsManager.saveApiChats(historyResult.chats)\n        saveMessages(historyResult.messages)\n\n        if (isChannel) {\n          ApiUpdatesManager.addChannelState(-peerID, historyResult.pts)\n        }\n\n        var length = historyResult.messages.length\n        if (length &&\n          historyResult.messages[length - 1].deleted) {\n          historyResult.messages.splice(length - 1, 1)\n          length--\n          historyResult.count--\n        }\n\n        if (\n          peerID < 0 ||\n          !AppUsersManager.isBot(peerID) ||\n          (length == limit && limit < historyResult.count)\n        ) {\n          return historyResult\n        }\n\n        return AppProfileManager.getProfile(peerID).then(function (userFull) {\n          var description = userFull.bot_info && userFull.bot_info.description\n          if (description) {\n            var messageID = tempID--\n            var message = {\n              _: 'messageService',\n              id: messageID,\n              from_id: peerID,\n              to_id: AppPeersManager.getOutputPeer(peerID),\n              flags: 0,\n              pFlags: {},\n              date: tsNow(true) + ServerTimeManager.serverTimeOffset,\n              action: {\n                _: 'messageActionBotIntro',\n                description: description\n              }\n            }\n            saveMessages([message])\n            historyResult.messages.push(message)\n            if (historyResult.count) {\n              historyResult.count++\n            }\n          }\n          return historyResult\n        })\n      }, function (error) {\n        switch (error.type) {\n          case 'CHANNEL_PRIVATE':\n            var channel = AppChatsManager.getChat(-peerID)\n            channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title}\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updates',\n              updates: [{\n                _: 'updateChannel',\n                channel_id: -peerID\n              }],\n              chats: [channel],\n              users: []\n            })\n            break\n        }\n        return $q.reject(error)\n      })\n    }\n\n    function fillHistoryStorage (peerID, maxID, fullLimit, historyStorage) {\n      // console.log('fill history storage', peerID, maxID, fullLimit, angular.copy(historyStorage))\n      var offset = (migratedFromTo[peerID] && !maxID) ? 1 : 0\n      return requestHistory(peerID, maxID, fullLimit, offset).then(function (historyResult) {\n        historyStorage.count = historyResult.count || historyResult.messages.length\n\n        var offset = 0\n        if (!maxID && historyResult.messages.length) {\n          maxID = historyResult.messages[0].mid + 1\n        }\n        if (maxID > 0) {\n          for (offset = 0; offset < historyStorage.history.length; offset++) {\n            if (maxID > historyStorage.history[offset]) {\n              break\n            }\n          }\n        }\n\n        var wasTotalCount = historyStorage.history.length\n\n        historyStorage.history.splice(offset, historyStorage.history.length - offset)\n        angular.forEach(historyResult.messages, function (message) {\n          if (mergeReplyKeyboard(historyStorage, message)) {\n            $rootScope.$broadcast('history_reply_markup', {peerID: peerID})\n          }\n          historyStorage.history.push(message.mid)\n        })\n\n        var totalCount = historyStorage.history.length\n        fullLimit -= (totalCount - wasTotalCount)\n\n        var migratedNextPeer = migratedFromTo[peerID]\n        var migratedPrevPeer = migratedToFrom[peerID]\n        var isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined\n\n        if (isMigrated) {\n          historyStorage.count = Math.max(historyStorage.count, totalCount) + 1\n        }\n\n        if (fullLimit > 0) {\n          maxID = historyStorage.history[totalCount - 1]\n          if (isMigrated) {\n            if (!historyResult.messages.length) {\n              if (migratedPrevPeer) {\n                maxID = 0\n                peerID = migratedPrevPeer\n              } else {\n                historyStorage.count = totalCount\n                return true\n              }\n            }\n            return fillHistoryStorage(peerID, maxID, fullLimit, historyStorage)\n          }\n          else if (totalCount < historyStorage.count) {\n            return fillHistoryStorage(peerID, maxID, fullLimit, historyStorage)\n          }\n        }\n        return true\n      })\n    }\n\n    function wrapHistoryResult (peerID, result) {\n      var unreadOffset = result.unreadOffset\n      if (unreadOffset) {\n        var i\n        var message\n        for (i = result.history.length - 1; i >= 0; i--) {\n          message = messagesStorage[result.history[i]]\n          if (message && !message.pFlags.out && message.pFlags.unread) {\n            result.unreadOffset = i + 1\n            break\n          }\n        }\n      }\n      return $q.when(result)\n    }\n\n    function migrateChecks (migrateFrom, migrateTo) {\n      if (!migratedFromTo[migrateFrom] &&\n        !migratedToFrom[migrateTo] &&\n        AppChatsManager.hasChat(-migrateTo)) {\n        var fromChat = AppChatsManager.getChat(-migrateFrom)\n        if (fromChat &&\n          fromChat.migrated_to &&\n          fromChat.migrated_to.channel_id == -migrateTo) {\n          migratedFromTo[migrateFrom] = migrateTo\n          migratedToFrom[migrateTo] = migrateFrom\n\n          $timeout(function () {\n            var foundDialog = getDialogByPeerID(migrateFrom)\n            if (foundDialog.length) {\n              dialogsStorage.dialogs.splice(foundDialog[1], 1)\n              $rootScope.$broadcast('dialog_drop', {peerID: migrateFrom})\n            }\n            $rootScope.$broadcast('dialog_migrate', {migrateFrom: migrateFrom, migrateTo: migrateTo})\n          }, 100)\n        }\n      }\n    }\n\n    function convertMigratedPeer (peerID) {\n      if (migratedFromTo[peerID]) {\n        return migratedFromTo[peerID]\n      }\n    }\n\n    function getHistory (peerID, maxID, limit, backLimit, prerendered) {\n      if (migratedFromTo[peerID]) {\n        peerID = migratedFromTo[peerID]\n      }\n      var historyStorage = historiesStorage[peerID]\n      var offset = 0\n      var offsetNotFound = false\n      var unreadOffset = false\n      var unreadSkip = false\n\n      prerendered = prerendered ? Math.min(50, prerendered) : 0\n\n      if (historyStorage === undefined) {\n        historyStorage = historiesStorage[peerID] = {count: null, history: [], pending: []}\n      }\n\n      if (maxID < 0) {\n        maxID = 0\n      }\n      var isMigrated = false\n      var reqPeerID = peerID\n      if (migratedToFrom[peerID]) {\n        isMigrated = true\n        if (maxID && maxID < AppMessagesIDsManager.fullMsgIDModulus) {\n          reqPeerID = migratedToFrom[peerID]\n        }\n      }\n\n      if (!limit && !maxID) {\n        var foundDialog = getDialogByPeerID(peerID)[0]\n        if (foundDialog && foundDialog.unread_count > 1) {\n          var unreadCount = foundDialog.unread_count\n          if (unreadSkip = (unreadCount > 50)) {\n            if (foundDialog.read_inbox_max_id) {\n              maxID = foundDialog.read_inbox_max_id\n              backLimit = 16\n              unreadOffset = 16\n              limit = 4\n            } else {\n              limit = 20\n              unreadOffset = 16\n              offset = unreadCount - unreadOffset\n            }\n          } else {\n            limit = Math.max(10, prerendered, unreadCount + 2)\n            unreadOffset = unreadCount\n          }\n        }\n        else if (Config.Mobile) {\n          limit = 20\n        }\n      }\n      if (maxID > 0) {\n        offsetNotFound = true\n        for (offset = 0; offset < historyStorage.history.length; offset++) {\n          if (maxID > historyStorage.history[offset]) {\n            offsetNotFound = false\n            break\n          }\n        }\n      }\n\n      if (!offsetNotFound && (\n        historyStorage.count !== null && historyStorage.history.length == historyStorage.count ||\n        historyStorage.history.length >= offset + (limit || 1)\n        )) {\n        if (backLimit) {\n          backLimit = Math.min(offset, backLimit)\n          offset = Math.max(0, offset - backLimit)\n          limit += backLimit\n        } else {\n          limit = limit || (offset ? 20 : (prerendered || 5))\n        }\n        var history = historyStorage.history.slice(offset, offset + limit)\n        if (!maxID && historyStorage.pending.length) {\n          history = historyStorage.pending.slice().concat(history)\n        }\n        return wrapHistoryResult(peerID, {\n          count: historyStorage.count,\n          history: history,\n          unreadOffset: unreadOffset,\n          unreadSkip: unreadSkip\n        })\n      }\n\n      if (!backLimit && !limit) {\n        limit = prerendered || 20\n      }\n      if (offsetNotFound) {\n        offset = 0\n      }\n      if (backLimit || unreadSkip || maxID && historyStorage.history.indexOf(maxID) == -1) {\n        if (backLimit) {\n          offset = -backLimit\n          limit += backLimit\n        }\n        return requestHistory(reqPeerID, maxID, limit, offset).then(function (historyResult) {\n          historyStorage.count = historyResult.count || historyResult.messages.length\n          if (isMigrated) {\n            historyStorage.count++\n          }\n\n          var history = []\n          angular.forEach(historyResult.messages, function (message) {\n            history.push(message.mid)\n          })\n          if (!maxID && historyStorage.pending.length) {\n            history = historyStorage.pending.slice().concat(history)\n          }\n\n          return wrapHistoryResult(peerID, {\n            count: historyStorage.count,\n            history: history,\n            unreadOffset: unreadOffset,\n            unreadSkip: unreadSkip\n          })\n        })\n      }\n\n      return fillHistoryStorage(peerID, maxID, limit, historyStorage).then(function () {\n        offset = 0\n        if (maxID > 0) {\n          for (offset = 0; offset < historyStorage.history.length; offset++) {\n            if (maxID > historyStorage.history[offset]) {\n              break\n            }\n          }\n        }\n\n        var history = historyStorage.history.slice(offset, offset + limit)\n        if (!maxID && historyStorage.pending.length) {\n          history = historyStorage.pending.slice().concat(history)\n        }\n\n        return wrapHistoryResult(peerID, {\n          count: historyStorage.count,\n          history: history,\n          unreadOffset: unreadOffset,\n          unreadSkip: unreadSkip\n        })\n      })\n    }\n\n    function getReplyKeyboard (peerID) {\n      return (historiesStorage[peerID] || {}).reply_markup || false\n    }\n\n    function mergeReplyKeyboard (historyStorage, message) {\n      // console.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n      if (!message.reply_markup &&\n        !message.pFlags.out &&\n        !message.action) {\n        return false\n      }\n      if (message.reply_markup &&\n        message.reply_markup._ == 'replyInlineMarkup') {\n        return false\n      }\n      var messageReplyMarkup = message.reply_markup\n      var lastReplyMarkup = historyStorage.reply_markup\n      if (messageReplyMarkup) {\n        if (lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n          return false\n        }\n        if (messageReplyMarkup.pFlags.selective &&\n          !(message.flags & 16)) {\n          return false\n        }\n        if (historyStorage.maxOutID &&\n          message.mid < historyStorage.maxOutID &&\n          messageReplyMarkup.pFlags.single_use) {\n          messageReplyMarkup.pFlags.hidden = true\n        }\n        messageReplyMarkup = angular.extend({\n          mid: message.mid\n        }, messageReplyMarkup)\n        if (messageReplyMarkup._ != 'replyKeyboardHide') {\n          messageReplyMarkup.fromID = message.from_id\n        }\n        historyStorage.reply_markup = messageReplyMarkup\n        // console.log('set', historyStorage.reply_markup)\n        return true\n      }\n\n      if (message.pFlags.out) {\n        if (lastReplyMarkup) {\n          if (lastReplyMarkup.pFlags.single_use &&\n            !lastReplyMarkup.pFlags.hidden &&\n            (message.mid > lastReplyMarkup.mid || message.mid < 0) &&\n            message.message) {\n            lastReplyMarkup.pFlags.hidden = true\n            // console.log('set', historyStorage.reply_markup)\n            return true\n          }\n        } else if (!historyStorage.maxOutID ||\n          message.mid > historyStorage.maxOutID) {\n          historyStorage.maxOutID = message.mid\n        }\n      }\n\n      if (message.action &&\n        message.action._ == 'messageActionChatDeleteUser' &&\n        (lastReplyMarkup\n          ? message.action.user_id == lastReplyMarkup.fromID\n          : AppUsersManager.isBot(message.action.user_id)\n        )\n      ) {\n        historyStorage.reply_markup = {\n          _: 'replyKeyboardHide',\n          mid: message.mid,\n          flags: 0,\n          pFlags: {}\n        }\n        // console.log('set', historyStorage.reply_markup)\n        return true\n      }\n\n      return false\n    }\n\n    function getSearch (peerID, query, inputFilter, maxID, limit) {\n      peerID = peerID ? parseInt(peerID) : 0\n      var foundMsgs = []\n      var useSearchCache = !query\n      var newSearchFilter = {peer: peerID, filter: inputFilter}\n      var sameSearchCache = useSearchCache && angular.equals(lastSearchFilter, newSearchFilter)\n\n      if (useSearchCache && !sameSearchCache) {\n        // console.warn(dT(), 'new search filter', lastSearchFilter, newSearchFilter)\n        lastSearchFilter = newSearchFilter\n        lastSearchResults = []\n      }\n\n      // console.log(dT(), 'search', useSearchCache, sameSearchCache, lastSearchResults, maxID)\n\n      if (peerID && !maxID && !query) {\n        var historyStorage = historiesStorage[peerID]\n\n        if (historyStorage !== undefined && historyStorage.history.length) {\n          var neededContents = {},\n            neededDocType\n          var neededLimit = limit || 20,\n            i\n          var message\n\n          switch (inputFilter._) {\n            case 'inputMessagesFilterPhotos':\n              neededContents['messageMediaPhoto'] = true\n              break\n\n            case 'inputMessagesFilterPhotoVideo':\n              neededContents['messageMediaPhoto'] = true\n              neededContents['messageMediaDocument'] = true\n              neededDocType = 'video'\n              break\n\n            case 'inputMessagesFilterVideo':\n              neededContents['messageMediaDocument'] = true\n              neededDocType = 'video'\n              break\n\n            case 'inputMessagesFilterDocument':\n              neededContents['messageMediaDocument'] = true\n              neededDocType = false\n              break\n\n            case 'inputMessagesFilterVoice':\n              neededContents['messageMediaDocument'] = true\n              neededDocType = 'voice'\n              break\n\n            case 'inputMessagesFilterRoundVideo':\n              neededContents['messageMediaDocument'] = true\n              neededDocType = 'round'\n              break\n\n            case 'inputMessagesFilterMusic':\n              neededContents['messageMediaDocument'] = true\n              neededDocType = 'audio'\n              break\n\n            case 'inputMessagesFilterUrl':\n              neededContents['url'] = true\n              break\n\n            case 'inputMessagesFilterMyMentions':\n              neededContents['mentioned'] = true\n              break\n\n            default:\n              return $q.when({\n                count: 0,\n                history: []\n              })\n          }\n          for (i = 0; i < historyStorage.history.length; i++) {\n            message = messagesStorage[historyStorage.history[i]]\n            if (message.media && neededContents[message.media._]) {\n              if (neededDocType !== undefined &&\n                  message.media._ == 'messageMediaDocument' &&\n                  message.media.document.type != neededDocType) {\n                continue\n              }\n              foundMsgs.push(message.mid)\n              if (foundMsgs.length >= neededLimit) {\n                break\n              }\n            }\n          }\n        }\n\n        // console.warn(dT(), 'before append', foundMsgs)\n        if (foundMsgs.length < neededLimit && lastSearchResults.length && sameSearchCache) {\n          var minID = foundMsgs.length ? foundMsgs[foundMsgs.length - 1] : false\n          for (var i = 0; i < lastSearchResults.length; i++) {\n            if (minID === false || lastSearchResults[i] < minID) {\n              foundMsgs.push(lastSearchResults[i])\n              if (foundMsgs.length >= neededLimit) {\n                break\n              }\n            }\n          }\n        }\n        // console.warn(dT(), 'after append', foundMsgs)\n      }\n\n      if (foundMsgs.length || limit == 1000) {\n        if (useSearchCache) {\n          lastSearchResults = listMergeSorted(lastSearchResults, foundMsgs)\n        }\n\n        return $q.when({\n          count: null,\n          history: foundMsgs\n        })\n      }\n\n      var apiPromise\n\n      if (peerID || !query) {\n        apiPromise = MtpApiManager.invokeApi('messages.search', {\n          flags: 0,\n          peer: AppPeersManager.getInputPeerByID(peerID),\n          q: query || '',\n          filter: inputFilter || {_: 'inputMessagesFilterEmpty'},\n          min_date: 0,\n          max_date: 0,\n          limit: limit || 20,\n          offset_id: AppMessagesIDsManager.getMessageLocalID(maxID) || 0,\n          add_offset: 0,\n          max_id: 0,\n          min_id: 0\n        }, {\n          timeout: 300,\n          noErrorBox: true\n        })\n      } else {\n        var offsetDate = 0\n        var offsetPeerID = 0\n        var offsetID = 0\n        var offsetMessage = maxID && getMessage(maxID)\n\n        if (offsetMessage && offsetMessage.date) {\n          offsetDate = offsetMessage.date + ServerTimeManager.serverTimeOffset\n          offsetID = offsetMessage.id\n          offsetPeerID = getMessagePeer(offsetMessage)\n        }\n        apiPromise = MtpApiManager.invokeApi('messages.searchGlobal', {\n          q: query,\n          offset_date: offsetDate,\n          offset_peer: AppPeersManager.getInputPeerByID(offsetPeerID),\n          offset_id: AppMessagesIDsManager.getMessageLocalID(offsetID),\n          limit: limit || 20\n        }, {\n          timeout: 300,\n          noErrorBox: true\n        })\n      }\n\n      return apiPromise.then(function (searchResult) {\n        AppUsersManager.saveApiUsers(searchResult.users)\n        AppChatsManager.saveApiChats(searchResult.chats)\n        saveMessages(searchResult.messages)\n\n        var foundCount = searchResult.count || searchResult.messages.length\n\n        foundMsgs = []\n        angular.forEach(searchResult.messages, function (message) {\n          var peerID = getMessagePeer(message)\n          if (peerID < 0) {\n            var chat = AppChatsManager.getChat(-peerID)\n            if (chat.migrated_to) {\n              migrateChecks(peerID, -chat.migrated_to.channel_id)\n            }\n          }\n          foundMsgs.push(message.mid)\n        })\n\n        if (useSearchCache &&\n            (!maxID || sameSearchCache && lastSearchResults.indexOf(maxID) >= 0)) {\n          lastSearchResults = listMergeSorted(lastSearchResults, foundMsgs)\n        }\n        // console.log(dT(), 'after API', foundMsgs, lastSearchResults)\n\n        return {\n          count: foundCount,\n          history: foundMsgs\n        }\n      }, function (error) {\n        if (error.code == 400) {\n          error.handled = true\n        }\n        return $q.reject(error)\n      })\n    }\n\n    function getMessage (messageID) {\n      return messagesStorage[messageID] || {\n        _: 'messageEmpty',\n        deleted: true,\n        pFlags: {out: false, unread: false}\n      }\n    }\n\n    function canMessageBeEdited(message) {\n      var goodMedias = [\n        'messageMediaPhoto',\n        'messageMediaDocument',\n        'messageMediaWebPage',\n        'messageMediaPending'\n      ]\n      if (message._ != 'message' ||\n          message.deleted ||\n          message.fwd_from ||\n          message.via_bot_id ||\n          message.media && goodMedias.indexOf(message.media._) == -1 ||\n          message.fromID && AppUsersManager.isBot(message.fromID)) {\n        return false\n      }\n      if (message.media &&\n          message.media._ == 'messageMediaDocument' &&\n          message.media.document.sticker) {\n        return false\n      }\n\n      return true\n    }\n\n    function canEditMessage(messageID) {\n      if (!messagesStorage[messageID]) {\n        return false\n      }\n      var message = messagesStorage[messageID]\n      if (!message ||\n          !message.canBeEdited) {\n        return false\n      }\n      if (getMessagePeer(message) == AppUsersManager.getSelf().id) {\n        return true\n      }\n      if (message.date < tsNow(true) - 2 * 86400 ||\n          !message.pFlags.out) {\n        return false\n      }\n      return true\n    }\n\n    function canReportMessage(messageID) {\n      if (!messagesStorage[messageID]) {\n        return false\n      }\n      if (!canEditMessage(messageID)) {\n        var message = messagesStorage[messageID]\n        if (!message.pFlags.out) {\n          return true\n        }\n      }\n      return false\n    }\n\n    function getMessageEditData(messageID) {\n      if (!canEditMessage(messageID)) {\n        return $q.reject()\n      }\n      var message = getMessage(messageID)\n      if (message.media &&\n          message.media._ != 'messageMediaEmpty' &&\n          message.media._ != 'messageMediaWebPage') {\n\n        return $q.when({\n          caption: true,\n          text: typeof message.media.caption === 'string' ? message.media.caption : ''\n        })\n      }\n\n      var text = typeof message.message === 'string' ? message.message : ''\n      var entities = RichTextProcessor.parseEntities(text)\n      var serverEntities = message.entities || []\n      entities = RichTextProcessor.mergeEntities(entities, serverEntities)\n\n      text = RichTextProcessor.wrapDraftText(text, {entities: entities})\n\n      return $q.when({\n        caption: false,\n        text: text\n      })\n    }\n\n    function canRevokeMessage(messageID) {\n      if (messageID <= 0 ||\n          !messagesStorage[messageID]) {\n        return false\n      }\n\n      var message = messagesStorage[messageID]\n      if (message._ != 'message' ||\n          message.deleted) {\n        return false\n      }\n\n      var peerID = getMessagePeer(message)\n      if (peerID < 0 && !AppChatsManager.isChannel(-peerID)) {\n        var chat = AppChatsManager.getChat(-peerID)\n        if (chat.pFlags.creator ||\n            chat.pFlags.admins_enabled && chat.pFlags.admin) {\n          return true\n        }\n      }\n\n      if (!message.pFlags.out ||\n          message.date < tsNow(true) - 2 * 86400) {\n        return false\n      }\n\n      return true\n    }\n\n    function deleteMessages (messageIDs, revoke) {\n      var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(messageIDs)\n      var promises = []\n      angular.forEach(splitted.msgIDs, function (msgIDs, channelID) {\n        var promise\n        if (channelID > 0) {\n          var channel = AppChatsManager.getChat(channelID)\n          if (!channel.pFlags.creator && !(channel.pFlags.editor && channel.pFlags.megagroup)) {\n            var goodMsgIDs = []\n            if (channel.pFlags.editor || channel.pFlags.megagroup) {\n              angular.forEach(msgIDs, function (msgID, i) {\n                var message = getMessage(splitted.mids[channelID][i])\n                if (message.pFlags.out) {\n                  goodMsgIDs.push(msgID)\n                }\n              })\n            }\n            if (!goodMsgIDs.length) {\n              return\n            }\n            msgIDs = goodMsgIDs\n          }\n          promise = MtpApiManager.invokeApi('channels.deleteMessages', {\n            channel: AppChatsManager.getChannelInput(channelID),\n            id: msgIDs\n          }).then(function (affectedMessages) {\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updateShort',\n              update: {\n                _: 'updateDeleteChannelMessages',\n                channel_id: channelID,\n                messages: msgIDs,\n                pts: affectedMessages.pts,\n                pts_count: affectedMessages.pts_count\n              }\n            })\n          })\n        } else {\n          var flags = 0\n          if (revoke) {\n            flags |= 1\n          }\n          promise = MtpApiManager.invokeApi('messages.deleteMessages', {\n            flags: flags,\n            id: msgIDs\n          }).then(function (affectedMessages) {\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updateShort',\n              update: {\n                _: 'updateDeleteMessages',\n                messages: msgIDs,\n                pts: affectedMessages.pts,\n                pts_count: affectedMessages.pts_count\n              }\n            })\n          })\n        }\n        promises.push(promise)\n      })\n\n      return $q.all(promises)\n    }\n\n    function getMessageShareLink (fullMsgID) {\n      var info = AppMessagesIDsManager.getMessageIDInfo(fullMsgID)\n      var msgID = info[0]\n      var channelID = info[1]\n      if (!channelID) {\n        return $q.reject()\n      }\n      var message = getMessage(fullMsgID)\n      var channel = AppChatsManager.getChat(channelID)\n      if (!message ||\n          !message.pFlags ||\n          !message.pFlags.post ||\n          !channel.username) {\n        return $q.reject()\n      }\n      return MtpApiManager.invokeApi('channels.exportMessageLink', {\n        channel: AppChatsManager.getChannelInput(channelID),\n        id: msgID\n      }).then(function (exportedMessageLink) {\n        return exportedMessageLink.link\n      })\n    }\n\n    function readHistory (peerID) {\n      // console.trace('start read')\n      var isChannel = AppPeersManager.isChannel(peerID)\n      var historyStorage = historiesStorage[peerID]\n      var foundDialog = getDialogByPeerID(peerID)[0]\n\n      if (!foundDialog || !foundDialog.unread_count) {\n        if (!historyStorage || !historyStorage.history.length) {\n          return false\n        }\n\n        var messageID,\n          message\n        var foundUnread = false\n        for (i = historyStorage.history.length; i >= 0; i--) {\n          messageID = historyStorage.history[i]\n          message = messagesStorage[messageID]\n          if (message && !message.pFlags.out && message.pFlags.unread) {\n            foundUnread = true\n            break\n          }\n        }\n        if (!foundUnread) {\n          return false\n        }\n      }\n\n      if (historyStorage.readPromise) {\n        return historyStorage.readPromise\n      }\n\n      var apiPromise\n      if (isChannel) {\n        apiPromise = MtpApiManager.invokeApi('channels.readHistory', {\n          channel: AppChatsManager.getChannelInput(-peerID),\n          max_id: 0\n        })\n      } else {\n        apiPromise = MtpApiManager.invokeApi('messages.readHistory', {\n          peer: AppPeersManager.getInputPeerByID(peerID),\n          max_id: 0\n        }).then(function (affectedMessages) {\n          ApiUpdatesManager.processUpdateMessage({\n            _: 'updateShort',\n            update: {\n              _: 'updatePts',\n              pts: affectedMessages.pts,\n              pts_count: affectedMessages.pts_count\n            }\n          })\n        })\n      }\n\n      historyStorage.readPromise = apiPromise.then(function () {\n        if (foundDialog) {\n          // console.log('done read history', peerID)\n          foundDialog.unread_count = 0\n          $rootScope.$broadcast('dialog_unread', {peerID: peerID, count: 0})\n          $rootScope.$broadcast('messages_read')\n          if (historyStorage && historyStorage.history.length) {\n            foundDialog.read_inbox_max_id = historyStorage.history[0]\n          }\n        }\n      })['finally'](function () {\n        delete historyStorage.readPromise\n      })\n\n      if (historyStorage && historyStorage.history.length) {\n        var messageID\n        var message, i\n        var peerID, foundDialog\n        var dialog\n        for (i = 0; i < historyStorage.history.length; i++) {\n          messageID = historyStorage.history[i]\n          message = messagesStorage[messageID]\n          if (message && !message.pFlags.out) {\n            message.pFlags.unread = false\n            if (messagesForHistory[messageID]) {\n              messagesForHistory[messageID].pFlags.unread = false\n            }\n            if (messagesForDialogs[messageID]) {\n              messagesForDialogs[messageID].pFlags.unread = false\n            }\n            NotificationsManager.cancel('msg' + messageID)\n          }\n        }\n      }\n\n      NotificationsManager.soundReset(AppPeersManager.getPeerString(peerID))\n\n      return historyStorage.readPromise\n    }\n\n    function readMessages (messageIDs) {\n      var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(messageIDs)\n      angular.forEach(splitted.msgIDs, function (msgIDs, channelID) {\n        if (channelID > 0) {\n          MtpApiManager.invokeApi('channels.readMessageContents', {\n            channel: AppChatsManager.getChannelInput(channelID),\n            id: msgIDs\n          }).then(function () {\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updateShort',\n              update: {\n                _: 'updateChannelReadMessagesContents',\n                channel_id: channelID,\n                messages: msgIDs\n              }\n            })\n          })\n        } else {\n          MtpApiManager.invokeApi('messages.readMessageContents', {\n            id: msgIDs\n          }).then(function (affectedMessages) {\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updateShort',\n              update: {\n                _: 'updateReadMessagesContents',\n                messages: msgIDs,\n                pts: affectedMessages.pts,\n                pts_count: affectedMessages.pts_count\n              }\n            })\n          })\n        }\n      })\n\n\n    }\n\n    function doFlushHistory (inputPeer, justClear) {\n      var flags = 0\n      if (justClear) {\n        flags |= 1\n      }\n      return MtpApiManager.invokeApi('messages.deleteHistory', {\n        flags: flags,\n        peer: inputPeer,\n        max_id: 0\n      }).then(function (affectedHistory) {\n        ApiUpdatesManager.processUpdateMessage({\n          _: 'updateShort',\n          update: {\n            _: 'updatePts',\n            pts: affectedHistory.pts,\n            pts_count: affectedHistory.pts_count\n          }\n        })\n        if (!affectedHistory.offset) {\n          return true\n        }\n        return doFlushHistory(inputPeer, justClear)\n      })\n    }\n\n    function flushHistory (peerID, justClear) {\n      if (AppPeersManager.isChannel(peerID)) {\n        return getHistory(peerID, false, 1).then(function (historyResult) {\n          var channelID = -peerID\n          var maxID = AppMessagesIDsManager.getMessageLocalID(historyResult.history[0] || 0)\n          return MtpApiManager.invokeApi('channels.deleteHistory', {\n            channel: AppChatsManager.getChannelInput(channelID),\n            max_id: maxID\n          }).then(function () {\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updateShort',\n              update: {\n                _: 'updateChannelAvailableMessages',\n                channel_id: channelID,\n                available_min_id: maxID\n              }\n            })\n            return true\n          })\n        })\n      }\n      return doFlushHistory(AppPeersManager.getInputPeerByID(peerID), justClear).then(function () {\n        if (justClear) {\n          $rootScope.$broadcast('dialog_flush', {peerID: peerID})\n        } else {\n          var foundDialog = getDialogByPeerID(peerID)\n          if (foundDialog[0]) {\n            dialogsStorage.dialogs.splice(foundDialog[1], 1)\n          }\n          delete historiesStorage[peerID]\n          $rootScope.$broadcast('dialog_drop', {peerID: peerID})\n        }\n      })\n    }\n\n    function saveMessages (apiMessages, options) {\n      options = options || {}\n      angular.forEach(apiMessages, function (apiMessage) {\n        if (apiMessage.pFlags === undefined) {\n          apiMessage.pFlags = {}\n        }\n        if (!apiMessage.pFlags.out) {\n          apiMessage.pFlags.out = false\n        }\n        if (!apiMessage.pFlags.unread) {\n          apiMessage.pFlags.unread = false\n        }\n        if (apiMessage._ == 'messageEmpty') {\n          return\n        }\n\n        var peerID = getMessagePeer(apiMessage)\n        var isChannel = apiMessage.to_id._ == 'peerChannel'\n        var channelID = isChannel ? -peerID : 0\n        var isBroadcast = isChannel && AppChatsManager.isBroadcast(channelID)\n\n        var mid = AppMessagesIDsManager.getFullMessageID(apiMessage.id, channelID)\n        apiMessage.mid = mid\n\n        var dialog = getDialogByPeerID(peerID)[0]\n        if (dialog && mid > 0) {\n          var dialogKey = apiMessage.pFlags.out\n            ? 'read_outbox_max_id'\n            : 'read_inbox_max_id'\n\n          apiMessage.pFlags.unread = mid > dialog[dialogKey]\n        }\n        else if (options.isNew) {\n          apiMessage.pFlags.unread = true\n        }\n        // console.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n        if (apiMessage.reply_to_msg_id) {\n          apiMessage.reply_to_mid = AppMessagesIDsManager.getFullMessageID(apiMessage.reply_to_msg_id, channelID)\n        }\n\n        apiMessage.date -= ServerTimeManager.serverTimeOffset\n\n        apiMessage.peerID = peerID\n        apiMessage.fromID = apiMessage.pFlags.post ? peerID : apiMessage.from_id\n\n        var fwdHeader = apiMessage.fwd_from\n        if (fwdHeader) {\n          if (peerID == AppUsersManager.getSelf().id) {\n            if (fwdHeader.saved_from_peer && fwdHeader.saved_from_msg_id) {\n              var savedFromPeerID = AppPeersManager.getPeerID(fwdHeader.saved_from_peer)\n              var savedFromMid = AppMessagesIDsManager.getFullMessageID(fwdHeader.saved_from_msg_id, AppPeersManager.isChannel(savedFromPeerID) ? -savedFromPeerID : 0)\n              apiMessage.savedFrom = savedFromPeerID + '_' + savedFromMid\n            }\n            apiMessage.fromID = fwdHeader.channel_id ? -fwdHeader.channel_id : fwdHeader.from_id\n          } else {\n            apiMessage.fwdFromID = fwdHeader.channel_id ? -fwdHeader.channel_id : fwdHeader.from_id\n            apiMessage.fwdPostID = fwdHeader.channel_post\n          }\n          fwdHeader.date -= ServerTimeManager.serverTimeOffset\n        }\n\n        if (apiMessage.via_bot_id > 0) {\n          apiMessage.viaBotID = apiMessage.via_bot_id\n        }\n\n        var mediaContext = {\n          user_id: apiMessage.fromID,\n          date: apiMessage.date\n        }\n\n        if (apiMessage.media) {\n          switch (apiMessage.media._) {\n            case 'messageMediaEmpty':\n              delete apiMessage.media\n              break\n            case 'messageMediaPhoto':\n              if (apiMessage.media.ttl_seconds) {\n                apiMessage.media = {_: 'messageMediaUnsupportedWeb'}\n              } else {\n                AppPhotosManager.savePhoto(apiMessage.media.photo, mediaContext)\n              }\n              break\n            case 'messageMediaDocument':\n              if (apiMessage.media.ttl_seconds) {\n                apiMessage.media = {_: 'messageMediaUnsupportedWeb'}\n              } else {\n                AppDocsManager.saveDoc(apiMessage.media.document, mediaContext)\n              }\n              break\n            case 'messageMediaWebPage':\n              AppWebPagesManager.saveWebPage(apiMessage.media.webpage, apiMessage.mid, mediaContext)\n              break\n            case 'messageMediaGame':\n              AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext)\n              apiMessage.media.handleMessage = true\n              break\n            case 'messageMediaInvoice':\n              apiMessage.media = {_: 'messageMediaUnsupportedWeb'}\n              break\n            case 'messageMediaGeoLive':\n              apiMessage.media._ = 'messageMediaGeo'\n              break\n          }\n        }\n        if (apiMessage.action) {\n          var migrateFrom\n          var migrateTo\n          switch (apiMessage.action._) {\n            case 'messageActionChatEditPhoto':\n              AppPhotosManager.savePhoto(apiMessage.action.photo, mediaContext)\n              if (isBroadcast) {\n                apiMessage.action._ = 'messageActionChannelEditPhoto'\n              }\n              break\n\n            case 'messageActionChatEditTitle':\n              if (isBroadcast) {\n                apiMessage.action._ = 'messageActionChannelEditTitle'\n              }\n              break\n\n            case 'messageActionChatDeletePhoto':\n              if (isBroadcast) {\n                apiMessage.action._ = 'messageActionChannelDeletePhoto'\n              }\n              break\n\n            case 'messageActionChatAddUser':\n              if (apiMessage.action.users.length == 1) {\n                apiMessage.action.user_id = apiMessage.action.users[0]\n                if (apiMessage.fromID == apiMessage.action.user_id) {\n                  if (isChannel) {\n                    apiMessage.action._ = 'messageActionChatJoined'\n                  } else {\n                    apiMessage.action._ = 'messageActionChatReturn'\n                  }\n                }\n              }\n              else if (apiMessage.action.users.length > 1) {\n                apiMessage.action._ = 'messageActionChatAddUsers'\n              }\n              break\n\n            case 'messageActionChatDeleteUser':\n              if (apiMessage.fromID == apiMessage.action.user_id) {\n                apiMessage.action._ = 'messageActionChatLeave'\n              }\n              break\n\n            case 'messageActionChannelMigrateFrom':\n              migrateFrom = -apiMessage.action.chat_id\n              migrateTo = -channelID\n              break\n\n            case 'messageActionChatMigrateTo':\n              migrateFrom = -channelID\n              migrateTo = -apiMessage.action.channel_id\n              break\n\n            case 'messageActionHistoryClear':\n              apiMessage.deleted = true\n              apiMessage.clear_history = true\n              apiMessage.pFlags.out = false\n              apiMessage.pFlags.unread = false\n              break\n\n            case 'messageActionPhoneCall':\n              delete apiMessage.fromID\n              apiMessage.action.type = \n                (apiMessage.pFlags.out ? 'out_' : 'in_') +\n                (\n                  apiMessage.action.reason._ == 'phoneCallDiscardReasonMissed' ||\n                  apiMessage.action.reason._ == 'phoneCallDiscardReasonBusy'\n                     ? 'missed'\n                     : 'ok'\n                )\n              break\n          }\n          \n          if (migrateFrom &&\n              migrateTo &&\n              !migratedFromTo[migrateFrom] &&\n              !migratedToFrom[migrateTo]) {\n            migrateChecks(migrateFrom, migrateTo)\n          }\n        }\n\n        if (apiMessage.message && apiMessage.message.length) {\n          var myEntities = RichTextProcessor.parseEntities(apiMessage.message)\n          var apiEntities = apiMessage.entities || []\n          apiMessage.totalEntities = RichTextProcessor.mergeEntities(myEntities, apiEntities, !apiMessage.pending)\n        }\n\n        apiMessage.canBeEdited = canMessageBeEdited(apiMessage)\n\n        if (!options.isEdited) {\n          messagesStorage[mid] = apiMessage\n        }\n      })\n    }\n\n    function sendText (peerID, text, options) {\n      if (!angular.isString(text)) {\n        return\n      }\n      peerID = AppPeersManager.getPeerMigratedTo(peerID) || peerID\n      options = options || {}\n      var entities = options.entities || []\n      if (!options.viaBotID) {\n        text = RichTextProcessor.parseMarkdown(text, entities)\n      }\n      if (!text.length) {\n        return\n      }\n\n      var sendEntites = getInputEntities(entities)\n      var messageID = tempID--\n      var randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)]\n      var randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString()\n      var historyStorage = historiesStorage[peerID]\n      var flags = 0\n      var pFlags = {}\n      var replyToMsgID = options.replyToMsgID\n      var isChannel = AppPeersManager.isChannel(peerID)\n      var isMegagroup = isChannel && AppPeersManager.isMegagroup(peerID)\n      var asChannel = isChannel && !isMegagroup ? true : false\n      var message\n\n      if (historyStorage === undefined) {\n        historyStorage = historiesStorage[peerID] = {count: null, history: [], pending: []}\n      }\n\n      var fromID = AppUsersManager.getSelf().id\n      if (peerID != fromID) {\n        flags |= 2\n        pFlags.out = true\n        if (!isChannel && !AppUsersManager.isBot(peerID)) {\n          flags |= 1\n          pFlags.unread = true\n        }\n      }\n      if (replyToMsgID) {\n        flags |= 8\n      }\n      if (asChannel) {\n        fromID = 0\n        pFlags.post = true\n      } else {\n        flags |= 256\n      }\n      message = {\n        _: 'message',\n        id: messageID,\n        from_id: fromID,\n        to_id: AppPeersManager.getOutputPeer(peerID),\n        flags: flags,\n        pFlags: pFlags,\n        date: tsNow(true) + ServerTimeManager.serverTimeOffset,\n        message: text,\n        random_id: randomIDS,\n        reply_to_msg_id: replyToMsgID,\n        via_bot_id: options.viaBotID,\n        reply_markup: options.reply_markup,\n        entities: entities,\n        views: asChannel && 1,\n        pending: true\n      }\n\n      var toggleError = function (on) {\n        var historyMessage = messagesForHistory[messageID]\n        if (on) {\n          message.error = true\n          if (historyMessage) {\n            historyMessage.error = true\n          }\n        } else {\n          delete message.error\n          if (historyMessage) {\n            delete historyMessage.error\n          }\n        }\n        $rootScope.$broadcast('messages_pending')\n      }\n\n      message.send = function () {\n        toggleError(false)\n        var sentRequestOptions = {}\n        if (pendingAfterMsgs[peerID]) {\n          sentRequestOptions.afterMessageID = pendingAfterMsgs[peerID].messageID\n        }\n        var flags = 0\n        if (replyToMsgID) {\n          flags |= 1\n        }\n        if (asChannel) {\n          flags |= 16\n        }\n        if (options.clearDraft) {\n          flags |= 128\n        }\n        var apiPromise\n        if (options.viaBotID) {\n          apiPromise = MtpApiManager.invokeApi('messages.sendInlineBotResult', {\n            flags: flags,\n            peer: AppPeersManager.getInputPeerByID(peerID),\n            random_id: randomID,\n            reply_to_msg_id: AppMessagesIDsManager.getMessageLocalID(replyToMsgID),\n            query_id: options.queryID,\n            id: options.resultID\n          }, sentRequestOptions)\n        } else {\n          if (sendEntites.length) {\n            flags |= 8\n          }\n          apiPromise = MtpApiManager.invokeApi('messages.sendMessage', {\n            flags: flags,\n            peer: AppPeersManager.getInputPeerByID(peerID),\n            message: text,\n            random_id: randomID,\n            reply_to_msg_id: AppMessagesIDsManager.getMessageLocalID(replyToMsgID),\n            entities: sendEntites\n          }, sentRequestOptions)\n        }\n        // console.log(flags, entities)\n        apiPromise.then(function (updates) {\n          if (updates._ == 'updateShortSentMessage') {\n            message.flags = updates.flags\n            message.date = updates.date\n            message.id = updates.id\n            message.media = updates.media\n            message.entities = updates.entities\n            updates = {\n              _: 'updates',\n              users: [],\n              chats: [],\n              seq: 0,\n              updates: [{\n                _: 'updateMessageID',\n                random_id: randomIDS,\n                id: updates.id\n              }, {\n                _: isChannel\n                      ? 'updateNewChannelMessage'\n                      : 'updateNewMessage',\n                message: message,\n                pts: updates.pts,\n                pts_count: updates.pts_count\n              }]\n            }\n          }\n          else if (updates.updates) {\n            angular.forEach(updates.updates, function (update) {\n              if (update._ == 'updateDraftMessage') {\n                update.local = true\n              }\n            })\n          }\n          // Testing bad situations\n          // var upd = angular.copy(updates)\n          // updates.updates.splice(0, 1)\n\n          ApiUpdatesManager.processUpdateMessage(updates)\n\n          // $timeout(function () {\n          // ApiUpdatesManager.processUpdateMessage(upd)\n          // }, 5000)\n        }, function (error) {\n          toggleError(true)\n        })['finally'](function () {\n          if (pendingAfterMsgs[peerID] === sentRequestOptions) {\n            delete pendingAfterMsgs[peerID]\n          }\n        })\n\n        pendingAfterMsgs[peerID] = sentRequestOptions\n      }\n\n      saveMessages([message])\n      historyStorage.pending.unshift(messageID)\n      $rootScope.$broadcast('history_append', {peerID: peerID, messageID: messageID, my: true})\n\n      setZeroTimeout(message.send)\n      // setTimeout(function () {\n      //   message.send()\n      // }, 5000)\n\n      if (options.clearDraft) {\n        DraftsManager.clearDraft(peerID)\n      }\n\n      pendingByRandomID[randomIDS] = [peerID, messageID]\n    }\n\n    function sendFile (peerID, file, options) {\n      peerID = AppPeersManager.getPeerMigratedTo(peerID) || peerID\n      options = options || {}\n      var messageID = tempID--\n      var randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)]\n      var randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString()\n      var historyStorage = historiesStorage[peerID]\n      var flags = 0\n      var pFlags = {}\n      var replyToMsgID = options.replyToMsgID\n      var isChannel = AppPeersManager.isChannel(peerID)\n      var isMegagroup = isChannel && AppPeersManager.isMegagroup(peerID)\n      var asChannel = isChannel && !isMegagroup ? true : false\n      var attachType, apiFileName\n      var realFileName\n\n      if (!options.isMedia) {\n        attachType = 'document'\n        apiFileName = 'document.' + file.type.split('/')[1]\n      } else if (['image/jpeg', 'image/png', 'image/bmp'].indexOf(file.type) >= 0) {\n        attachType = 'photo'\n        apiFileName = 'photo.' + file.type.split('/')[1]\n      } else if (file.type.substr(0, 6) == 'audio/' || ['video/ogg'].indexOf(file.type) >= 0) {\n        attachType = 'audio'\n        apiFileName = 'audio.' + (file.type.split('/')[1] == 'ogg' ? 'ogg' : 'mp3')\n      } else if (file.type.substr(0, 6) == 'video/') {\n        attachType = 'video'\n        apiFileName = 'video.mp4'\n      } else {\n        attachType = 'document'\n        apiFileName = 'document.' + file.type.split('/')[1]\n      }\n\n      // console.log(attachType, apiFileName, file.type)\n\n      if (historyStorage === undefined) {\n        historyStorage = historiesStorage[peerID] = {count: null, history: [], pending: []}\n      }\n\n      var fromID = AppUsersManager.getSelf().id\n      if (peerID != fromID) {\n        flags |= 2\n        pFlags.out = true\n        if (!isChannel && !AppUsersManager.isBot(peerID)) {\n          flags |= 1\n          pFlags.unread = true\n        }\n      }\n      if (replyToMsgID) {\n        flags |= 8\n      }\n      if (asChannel) {\n        fromID = 0\n        pFlags.post = true\n      } else {\n        flags |= 256\n      }\n      var media = {\n        _: 'messageMediaPending',\n        type: attachType,\n        file_name: file.name || apiFileName,\n        size: file.size,\n        progress: {percent: 1, total: file.size}\n      }\n\n      var message = {\n        _: 'message',\n        id: messageID,\n        from_id: fromID,\n        to_id: AppPeersManager.getOutputPeer(peerID),\n        flags: flags,\n        pFlags: pFlags,\n        date: tsNow(true) + ServerTimeManager.serverTimeOffset,\n        message: '',\n        media: media,\n        random_id: randomIDS,\n        reply_to_msg_id: replyToMsgID,\n        views: asChannel && 1,\n        pending: true\n      }\n\n      var toggleError = function (on) {\n        var historyMessage = messagesForHistory[messageID]\n        if (on) {\n          message.error = true\n          if (historyMessage) {\n            historyMessage.error = true\n          }\n        } else {\n          delete message.error\n          if (historyMessage) {\n            delete historyMessage.error\n          }\n        }\n        $rootScope.$broadcast('messages_pending')\n      }\n\n      var uploaded = false,\n        uploadPromise\n\n      message.send = function () {\n        var sendFileDeferred = $q.defer()\n\n        sendFilePromise.then(function () {\n          if (!uploaded || message.error) {\n            uploaded = false\n            uploadPromise = MtpApiFileManager.uploadFile(file)\n          }\n\n          uploadPromise.then(function (inputFile) {\n            inputFile.name = apiFileName\n            uploaded = true\n            var inputMedia\n            switch (attachType) {\n              case 'photo':\n                inputMedia = {_: 'inputMediaUploadedPhoto', flags: 0, file: inputFile}\n                break\n\n              case 'document':\n              default:\n                inputMedia = {_: 'inputMediaUploadedDocument', file: inputFile, mime_type: file.type, caption: '', attributes: [\n                    {_: 'documentAttributeFilename', file_name: file.name}\n                ]}\n            }\n            var flags = 0\n            if (replyToMsgID) {\n              flags |= 1\n            }\n            if (asChannel) {\n              flags |= 16\n            }\n            MtpApiManager.invokeApi('messages.sendMedia', {\n              flags: flags,\n              peer: AppPeersManager.getInputPeerByID(peerID),\n              media: inputMedia,\n              random_id: randomID,\n              reply_to_msg_id: AppMessagesIDsManager.getMessageLocalID(replyToMsgID)\n            }).then(function (updates) {\n              ApiUpdatesManager.processUpdateMessage(updates)\n            }, function (error) {\n              if (attachType == 'photo' &&\n                error.code == 400 &&\n                (error.type == 'PHOTO_INVALID_DIMENSIONS' ||\n                error.type == 'PHOTO_SAVE_FILE_INVALID')) {\n                error.handled = true\n                attachType = 'document'\n                message.send()\n                return\n              }\n              toggleError(true)\n            })\n          }, function (error) {\n            toggleError(true)\n          }, function (progress) {\n            // console.log('upload progress', progress)\n            media.progress.done = progress.done\n            media.progress.percent = Math.max(1, Math.floor(100 * progress.done / progress.total))\n            $rootScope.$broadcast('history_update', {peerID: peerID})\n          })\n\n          media.progress.cancel = function () {\n            if (!uploaded) {\n              sendFileDeferred.resolve()\n              uploadPromise.cancel()\n              cancelPendingMessage(randomIDS)\n            }\n          }\n\n          uploadPromise['finally'](function () {\n            sendFileDeferred.resolve()\n          })\n        })\n\n        sendFilePromise = sendFileDeferred.promise\n      }\n\n      saveMessages([message])\n      historyStorage.pending.unshift(messageID)\n      $rootScope.$broadcast('history_append', {peerID: peerID, messageID: messageID, my: true})\n\n      setZeroTimeout(message.send)\n\n      pendingByRandomID[randomIDS] = [peerID, messageID]\n    }\n\n    function sendOther (peerID, inputMedia, options) {\n      peerID = AppPeersManager.getPeerMigratedTo(peerID) || peerID\n      options = options || {}\n\n      var messageID = tempID--\n      var randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)]\n      var randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString()\n      var historyStorage = historiesStorage[peerID]\n      var replyToMsgID = options.replyToMsgID\n      var isChannel = AppPeersManager.isChannel(peerID)\n      var isMegagroup = isChannel && AppPeersManager.isMegagroup(peerID)\n      var asChannel = isChannel && !isMegagroup ? true : false\n\n      if (historyStorage === undefined) {\n        historyStorage = historiesStorage[peerID] = {count: null, history: [], pending: []}\n      }\n\n      var fromID = AppUsersManager.getSelf().id\n      var media\n      switch (inputMedia._) {\n        case 'inputMediaPhoto':\n          media = {\n            _: 'messageMediaPhoto',\n            photo: AppPhotosManager.getPhoto(inputMedia.id.id),\n            caption: inputMedia.caption || ''\n          }\n          break\n\n        case 'inputMediaDocument':\n          var doc = AppDocsManager.getDoc(inputMedia.id.id)\n          if (doc.sticker && doc.stickerSetInput) {\n            AppStickersManager.pushPopularSticker(doc.id)\n          }\n          media = {\n            _: 'messageMediaDocument',\n            'document': doc,\n            caption: inputMedia.caption || ''\n          }\n          break\n\n        case 'inputMediaContact':\n          media = {\n            _: 'messageMediaContact',\n            phone_number: inputMedia.phone_number,\n            first_name: inputMedia.first_name,\n            last_name: inputMedia.last_name,\n            user_id: 0\n          }\n          break\n\n        case 'inputMediaGeoPoint':\n          media = {\n            _: 'messageMediaGeo',\n            geo: {\n              _: 'geoPoint',\n              'lat': inputMedia.geo_point['lat'],\n              'long': inputMedia.geo_point['long']\n            }\n          }\n          break\n\n        case 'inputMediaVenue':\n          media = {\n            _: 'messageMediaVenue',\n            geo: {\n              _: 'geoPoint',\n              'lat': inputMedia.geo_point['lat'],\n              'long': inputMedia.geo_point['long']\n            },\n            title: inputMedia.title,\n            address: inputMedia.address,\n            provider: inputMedia.provider,\n            venue_id: inputMedia.venue_id\n          }\n          break\n\n        case 'messageMediaPending':\n          media = inputMedia\n          break\n      }\n\n      var flags = 0\n      var pFlags = {}\n      if (peerID != fromID) {\n        flags |= 2\n        pFlags.out = true\n        if (!AppUsersManager.isBot(peerID)) {\n          flags |= 1\n          pFlags.unread = true\n        }\n      }\n      if (replyToMsgID) {\n        flags |= 8\n      }\n      if (asChannel) {\n        fromID = 0\n        pFlags.post = true\n      } else {\n        flags |= 256\n      }\n\n      var message = {\n        _: 'message',\n        id: messageID,\n        from_id: fromID,\n        to_id: AppPeersManager.getOutputPeer(peerID),\n        flags: flags,\n        pFlags: pFlags,\n        date: tsNow(true) + ServerTimeManager.serverTimeOffset,\n        message: '',\n        media: media,\n        random_id: randomIDS,\n        reply_to_msg_id: replyToMsgID,\n        via_bot_id: options.viaBotID,\n        reply_markup: options.reply_markup,\n        views: asChannel && 1,\n        pending: true\n      }\n\n      var toggleError = function (on) {\n        var historyMessage = messagesForHistory[messageID]\n        if (on) {\n          message.error = true\n          if (historyMessage) {\n            historyMessage.error = true\n          }\n        } else {\n          delete message.error\n          if (historyMessage) {\n            delete historyMessage.error\n          }\n        }\n        $rootScope.$broadcast('messages_pending')\n      }\n\n      message.send = function () {\n        var flags = 0\n        if (replyToMsgID) {\n          flags |= 1\n        }\n        if (asChannel) {\n          flags |= 16\n        }\n        if (options.clearDraft) {\n          flags |= 128\n        }\n\n        var sentRequestOptions = {}\n        if (pendingAfterMsgs[peerID]) {\n          sentRequestOptions.afterMessageID = pendingAfterMsgs[peerID].messageID\n        }\n\n        var apiPromise\n        if (options.viaBotID) {\n          apiPromise = MtpApiManager.invokeApi('messages.sendInlineBotResult', {\n            flags: flags,\n            peer: AppPeersManager.getInputPeerByID(peerID),\n            random_id: randomID,\n            reply_to_msg_id: AppMessagesIDsManager.getMessageLocalID(replyToMsgID),\n            query_id: options.queryID,\n            id: options.resultID\n          }, sentRequestOptions)\n        } else {\n          apiPromise = MtpApiManager.invokeApi('messages.sendMedia', {\n            flags: flags,\n            peer: AppPeersManager.getInputPeerByID(peerID),\n            media: inputMedia,\n            random_id: randomID,\n            reply_to_msg_id: AppMessagesIDsManager.getMessageLocalID(replyToMsgID)\n          }, sentRequestOptions)\n        }\n        apiPromise.then(function (updates) {\n          if (updates.updates) {\n            angular.forEach(updates.updates, function (update) {\n              if (update._ == 'updateDraftMessage') {\n                update.local = true\n              }\n            })\n          }\n          ApiUpdatesManager.processUpdateMessage(updates)\n        }, function (error) {\n          toggleError(true)\n        })['finally'](function () {\n          if (pendingAfterMsgs[peerID] === sentRequestOptions) {\n            delete pendingAfterMsgs[peerID]\n          }\n        })\n        pendingAfterMsgs[peerID] = sentRequestOptions\n      }\n\n      saveMessages([message])\n      historyStorage.pending.unshift(messageID)\n      $rootScope.$broadcast('history_append', {peerID: peerID, messageID: messageID, my: true})\n\n      setZeroTimeout(message.send)\n\n      if (options.clearDraft) {\n        DraftsManager.clearDraft(peerID)\n      }\n\n      pendingByRandomID[randomIDS] = [peerID, messageID]\n    }\n\n    function forwardMessages (peerID, mids, options) {\n      peerID = AppPeersManager.getPeerMigratedTo(peerID) || peerID\n      mids = mids.sort()\n      options = options || {}\n\n      var flags = 0\n      var isChannel = AppPeersManager.isChannel(peerID)\n      var isMegagroup = isChannel && AppPeersManager.isMegagroup(peerID)\n      var asChannel = isChannel && !isMegagroup ? true : false\n\n      if (asChannel) {\n        flags |= 16\n      }\n      if (options.withMyScore) {\n        flags |= 256\n      }\n\n      var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(mids)\n      var promises = []\n      angular.forEach(splitted.msgIDs, function (msgIDs, channelID) {\n        var len = msgIDs.length\n        var randomIDs = []\n        for (var i = 0; i < len; i++) {\n          randomIDs.push([nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)])\n        }\n        var sentRequestOptions = {}\n        if (pendingAfterMsgs[peerID]) {\n          sentRequestOptions.afterMessageID = pendingAfterMsgs[peerID].messageID\n        }\n        var promise = MtpApiManager.invokeApi('messages.forwardMessages', {\n          flags: flags,\n          from_peer: AppPeersManager.getInputPeerByID(-channelID),\n          id: msgIDs,\n          random_id: randomIDs,\n          to_peer: AppPeersManager.getInputPeerByID(peerID)\n        }, sentRequestOptions).then(function (updates) {\n          ApiUpdatesManager.processUpdateMessage(updates)\n        })['finally'](function () {\n          if (pendingAfterMsgs[peerID] === sentRequestOptions) {\n            delete pendingAfterMsgs[peerID]\n          }\n        })\n        pendingAfterMsgs[peerID] = sentRequestOptions\n        promises.push(promise)\n      })\n\n      return $q.all(promises)\n    }\n\n    function reportMessages (mids, reason) {\n      mids = mids.sort()\n      var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(mids)\n      var promises = []\n      angular.forEach(splitted.msgIDs, function (msgIDs, channelID) {\n        var peerID = -channelID || getMessagePeer(getMessage(msgIDs[0]))\n        var promise = MtpApiManager.invokeApi('messages.report', {\n          peer: AppPeersManager.getInputPeerByID(peerID),\n          id: msgIDs,\n          reason: reason\n        }).then(function (updates) {\n          ApiUpdatesManager.processUpdateMessage(updates)\n        })\n        promises.push(promise)\n      })\n\n      return $q.all(promises)\n    }\n\n    function startBot (botID, chatID, startParam) {\n      var peerID = chatID ? -chatID : botID\n      if (startParam) {\n        var randomID = bigint(nextRandomInt(0xFFFFFFFF)).shiftLeft(32).add(bigint(nextRandomInt(0xFFFFFFFF))).toString()\n\n        return MtpApiManager.invokeApi('messages.startBot', {\n          bot: AppUsersManager.getUserInput(botID),\n          peer: AppPeersManager.getInputPeerByID(peerID),\n          random_id: randomID,\n          start_param: startParam\n        }).then(function (updates) {\n          ApiUpdatesManager.processUpdateMessage(updates)\n        })\n      }\n\n      if (chatID) {\n        if (AppChatsManager.isChannel(chatID)) {\n          return MtpApiManager.invokeApi('channels.inviteToChannel', {\n            channel: AppChatsManager.getChannelInput(chatID),\n            users: [AppUsersManager.getUserInput(botID)]\n          }).then(function (updates) {\n            ApiUpdatesManager.processUpdateMessage(updates)\n            sendText(peerID, '/start@' + bot.username)\n          }, function (error) {\n            if (error && error.type == 'USER_ALREADY_PARTICIPANT') {\n              var bot = AppUsersManager.getUser(botID)\n              sendText(peerID, '/start@' + bot.username)\n              error.handled = true\n            }\n          })\n        } else {\n          return MtpApiManager.invokeApi('messages.addChatUser', {\n            chat_id: AppChatsManager.getChatInput(chatID),\n            user_id: AppUsersManager.getUserInput(botID)\n          }).then(function (updates) {\n            ApiUpdatesManager.processUpdateMessage(updates)\n            sendText(peerID, '/start@' + bot.username)\n          }, function (error) {\n            if (error && error.type == 'USER_ALREADY_PARTICIPANT') {\n              var bot = AppUsersManager.getUser(botID)\n              sendText(peerID, '/start@' + bot.username)\n              error.handled = true\n            }\n          })\n        }\n      }\n\n      return sendText(peerID, '/start')\n    }\n\n    function shareGame (botID, peerID, inputGame) {\n      var randomID = bigint(nextRandomInt(0xFFFFFFFF)).shiftLeft(32).add(bigint(nextRandomInt(0xFFFFFFFF))).toString()\n      return MtpApiManager.invokeApi('messages.sendMedia', {\n        flags: 0,\n        peer: AppPeersManager.getInputPeerByID(peerID),\n        media: {\n          _: 'inputMediaGame',\n          id: inputGame\n        },\n        random_id: randomID\n      }).then(function (updates) {\n        ApiUpdatesManager.processUpdateMessage(updates)\n      })\n    }\n\n    function cancelPendingMessage (randomID) {\n      var pendingData = pendingByRandomID[randomID]\n\n      console.log('pending', randomID, pendingData)\n\n      if (pendingData) {\n        var peerID = pendingData[0]\n        var tempID = pendingData[1]\n        var historyStorage = historiesStorage[peerID]\n        var pos = historyStorage.pending.indexOf(tempID)\n\n        ApiUpdatesManager.processUpdateMessage({\n          _: 'updateShort',\n          update: {\n            _: 'updateDeleteMessages',\n            messages: [tempID]\n          }\n        })\n\n        if (pos != -1) {\n          historyStorage.pending.splice(pos, 1)\n        }\n\n        delete messagesForHistory[tempID]\n        delete messagesStorage[tempID]\n\n        return true\n      }\n\n      return false\n    }\n\n    function finalizePendingMessage (randomID, finalMessage) {\n      var pendingData = pendingByRandomID[randomID]\n      // console.log('pdata', randomID, pendingData)\n\n      if (pendingData) {\n        var peerID = pendingData[0]\n        var tempID = pendingData[1]\n        var historyStorage = historiesStorage[peerID],\n          message,\n          historyMessage\n\n        // console.log('pending', randomID, historyStorage.pending)\n        var pos = historyStorage.pending.indexOf(tempID)\n        if (pos != -1) {\n          historyStorage.pending.splice(pos, 1)\n        }\n\n        if (message = messagesStorage[tempID]) {\n          delete message.pending\n          delete message.error\n          delete message.random_id\n          delete message.send\n        }\n\n        if (historyMessage = messagesForHistory[tempID]) {\n          messagesForHistory[finalMessage.mid] = angular.extend(historyMessage, wrapForHistory(finalMessage.mid))\n          delete historyMessage.pending\n          delete historyMessage.error\n          delete historyMessage.random_id\n          delete historyMessage.send\n\n          $rootScope.$broadcast('messages_pending')\n        }\n\n        delete messagesForHistory[tempID]\n        delete messagesStorage[tempID]\n\n        finalizePendingMessageCallbacks(tempID, finalMessage.mid)\n\n        return message\n      }\n\n      return false\n    }\n\n    function finalizePendingMessageCallbacks(tempID, mid) {\n      var callbacks = tempFinalizeCallbacks[tempID]\n      console.warn(dT(), callbacks, tempID)\n      if (callbacks !== undefined) {\n        angular.forEach(callbacks, function (callback) {\n          callback(mid)\n        })\n        delete tempFinalizeCallbacks[tempID]\n      }\n    }\n\n    function getInputEntities(entities) {\n      var sendEntites = angular.copy(entities)\n      angular.forEach(sendEntites, function (entity) {\n        if (entity._ == 'messageEntityMentionName') {\n          entity._ = 'inputMessageEntityMentionName'\n          entity.user_id = AppUsersManager.getUserInput(entity.user_id)\n        }\n      })\n      return sendEntites\n    }\n\n    function editMessage(messageID, text) {\n      if (!angular.isString(text) ||\n          !canEditMessage(messageID)) {\n        return $q.reject()\n      }\n      if (messageID < 0) {\n        if (tempFinalizeCallbacks[messageID] === undefined) {\n          tempFinalizeCallbacks[messageID] = {}\n        }\n        var deferred = $q.defer()\n        tempFinalizeCallbacks[messageID].edit = function (mid) {\n          console.log('invoke callback', mid)\n          editMessage(mid, text).then(function (result) {\n            deferred.resolve(result)\n          }, function (error) {\n            deferred.reject(error)\n          })\n        }\n        return deferred.promise\n      }\n      var entities = []\n      text = RichTextProcessor.parseMarkdown(text, entities)\n\n      var message = getMessage(messageID)\n      var peerID = getMessagePeer(message)\n      var flags = 8 | (1 << 11)\n\n      return MtpApiManager.invokeApi('messages.editMessage', {\n        flags: flags,\n        peer: AppPeersManager.getInputPeerByID(peerID),\n        id: AppMessagesIDsManager.getMessageLocalID(messageID),\n        message: text,\n        entities: getInputEntities(entities)\n      }).then(function (updates) {\n        ApiUpdatesManager.processUpdateMessage(updates)\n      }, function (error) {\n        if (error &&\n            error.type == 'MESSAGE_NOT_MODIFIED') {\n          error.handled = true\n          return\n        }\n        if (error &&\n            error.type == 'MESSAGE_EMPTY') {\n          error.handled = true\n        }\n        return $q.reject(error)\n      })\n    }\n\n    function getMessagePeer (message) {\n      var toID = message.to_id && AppPeersManager.getPeerID(message.to_id) || 0\n\n      if (toID < 0) {\n        return toID\n      } else if (message.pFlags && message.pFlags.out || message.flags & 2) {\n        return toID\n      }\n      return message.from_id\n    }\n\n    function wrapForDialog (msgID, dialog) {\n      var useCache = msgID && dialog !== undefined\n      var unreadCount = dialog && dialog.unread_count\n\n      if (useCache && messagesForDialogs[msgID] !== undefined) {\n        delete messagesForDialogs[msgID].typing\n        messagesForDialogs[msgID].unreadCount = unreadCount\n        return messagesForDialogs[msgID]\n      }\n\n      var message = angular.copy(messagesStorage[msgID])\n\n      if (!message || !message.to_id) {\n        if (dialog && dialog.peerID) {\n          message = {\n            _: 'message',\n            to_id: AppPeersManager.getOutputPeer(dialog.peerID),\n            deleted: true,\n            date: tsNow(true),\n            pFlags: {out: true}\n          }\n        } else {\n          return message\n        }\n      }\n\n      message.peerID = getMessagePeer(message)\n      message.peerData = AppPeersManager.getPeer(message.peerID)\n      message.peerString = AppPeersManager.getPeerString(message.peerID)\n      message.unreadCount = unreadCount\n      message.index = dialog && dialog.index || (message.date * 0x10000)\n      message.pinned = dialog && dialog.pFlags.pinned || false\n\n      if (message._ == 'messageService' && message.action.user_id) {\n        message.action.user = AppUsersManager.getUser(message.action.user_id)\n      }\n\n      if (message.message && message.message.length) {\n        message.richMessage = RichTextProcessor.wrapRichText(message.message.substr(0, 128), {noLinks: true, noLinebreaks: true})\n      }\n\n      message.dateText = dateOrTimeFilter(message.date)\n\n      if (useCache) {\n        message.draft = DraftsManager.getServerDraft(message.peerID)\n        messagesForDialogs[msgID] = message\n      }\n\n      return message\n    }\n\n    function wrapSingleMessage (msgID) {\n      if (messagesStorage[msgID]) {\n        return wrapForDialog(msgID)\n      }\n      if (needSingleMessages.indexOf(msgID) == -1) {\n        needSingleMessages.push(msgID)\n        if (fetchSingleMessagesTimeout === false) {\n          fetchSingleMessagesTimeout = setTimeout(fetchSingleMessages, 100)\n        }\n      }\n      return {mid: msgID, loading: true}\n    }\n\n    function clearDialogCache (msgID) {\n      delete messagesForDialogs[msgID]\n    }\n\n    function wrapForHistory (msgID) {\n      if (messagesForHistory[msgID] !== undefined) {\n        return messagesForHistory[msgID]\n      }\n\n      var message = angular.copy(messagesStorage[msgID]) || {id: msgID}\n\n      if (message.media && message.media.progress !== undefined) {\n        message.media.progress = messagesStorage[msgID].media.progress\n      }\n\n      var fromUser = message.from_id && AppUsersManager.getUser(message.from_id)\n      var fromBot = fromUser && fromUser.pFlags.bot && fromUser.username || false\n      var withBot = (fromBot ||\n        message.to_id && (\n        message.to_id.chat_id ||\n        message.to_id.user_id && AppUsersManager.isBot(message.to_id.user_id)\n      )\n      )\n\n      if (message.media) {\n        if (message.media.caption &&\n          message.media.caption.length) {\n          message.media.rCaption = RichTextProcessor.wrapRichText(message.media.caption, {\n            noCommands: !withBot,\n            fromBot: fromBot\n          })\n        }\n\n        switch (message.media._) {\n          case 'messageMediaPhoto':\n            message.media.photo = AppPhotosManager.wrapForHistory(message.media.photo.id)\n            break\n\n          case 'messageMediaDocument':\n            message.media.document = AppDocsManager.wrapForHistory(message.media.document.id)\n            break\n\n          case 'messageMediaGeo':\n            var mapUrl = 'https://maps.google.com/?q=' + message.media.geo['lat'] + ',' + message.media.geo['long']\n            message.media.mapUrl = $sce.trustAsResourceUrl(mapUrl)\n            break\n\n          case 'messageMediaVenue':\n            var mapUrl\n            if (message.media.provider == 'foursquare' &&\n              message.media.venue_id) {\n              mapUrl = 'https://foursquare.com/v/' + encodeURIComponent(message.media.venue_id)\n            } else {\n              mapUrl = 'https://maps.google.com/?q=' + message.media.geo['lat'] + ',' + message.media.geo['long']\n            }\n            message.media.mapUrl = $sce.trustAsResourceUrl(mapUrl)\n            break\n\n          case 'messageMediaContact':\n            message.media.rFullName = RichTextProcessor.wrapRichText(\n              message.media.first_name + ' ' + (message.media.last_name || ''),\n              {noLinks: true, noLinebreaks: true}\n            )\n            break\n\n          case 'messageMediaWebPage':\n            if (!message.media.webpage ||\n              message.media.webpage._ == 'webPageEmpty') {\n              delete message.media\n              break\n            }\n            message.media.webpage = AppWebPagesManager.wrapForHistory(message.media.webpage.id)\n            break\n\n          case 'messageMediaGame':\n            message.media.game = AppGamesManager.wrapForHistory(message.media.game.id)\n            break\n        }\n      }\n      else if (message.action) {\n        switch (message.action._) {\n          case 'messageActionChatEditPhoto':\n          case 'messageActionChannelEditPhoto':\n            message.action.photo = AppPhotosManager.wrapForHistory(message.action.photo.id)\n            break\n\n          case 'messageActionChatCreate':\n          case 'messageActionChatEditTitle':\n          case 'messageActionChannelCreate':\n          case 'messageActionChannelEditTitle':\n            message.action.rTitle = RichTextProcessor.wrapRichText(message.action.title, {noLinebreaks: true}) || _('chat_title_deleted')\n            break\n\n          case 'messageActionBotIntro':\n            message.action.rDescription = RichTextProcessor.wrapRichText(message.action.description, {\n              noCommands: !withBot,\n              fromBot: fromBot\n            })\n            break\n        }\n      }\n\n      return messagesForHistory[msgID] = message\n    }\n\n    function wrapReplyMarkup (replyMarkup, fromID) {\n      if (!replyMarkup ||\n        replyMarkup._ == 'replyKeyboardHide') {\n        return false\n      }\n      if (replyMarkup.wrapped) {\n        return replyMarkup\n      }\n      var isInline = replyMarkup._ == 'replyInlineMarkup'\n      var count = replyMarkup.rows && replyMarkup.rows.length || 0\n      if (!isInline &&\n        count > 0 &&\n        count <= 4 &&\n        !(replyMarkup.pFlags && replyMarkup.pFlags.resize)) {\n        replyMarkup.splitCount = count\n      }\n      replyMarkup.wrapped = true\n      angular.forEach(replyMarkup.rows, function (markupRow) {\n        angular.forEach(markupRow.buttons, function (markupButton) {\n          markupButton.rText = RichTextProcessor.wrapRichText(markupButton.text, {noLinks: true, noLinebreaks: true})\n          if (markupButton._ == 'keyboardButtonUrl') {\n            var from = AppUsersManager.getUser(fromID)\n            var unsafe = !(from && from.pFlags && from.pFlags.verified)\n            markupButton.pUrl = RichTextProcessor.wrapUrl(markupButton.url, unsafe)\n          }\n        })\n      })\n      return replyMarkup\n    }\n\n    function wrapMessageText(msgID) {\n      var message = getMessage(msgID)\n      var fromUser = message.from_id && AppUsersManager.getUser(message.from_id)\n      var fromBot = fromUser && fromUser.pFlags.bot && fromUser.username || false\n      var toPeerID = AppPeersManager.getPeerID(message.to_id)\n      var withBot = (\n        fromBot ||\n        AppPeersManager.isBot(toPeerID) ||\n        AppPeersManager.isAnyGroup(toPeerID)\n      )\n\n      var options = {\n        noCommands: !withBot,\n        fromBot: fromBot,\n        entities: message.totalEntities\n      }\n      if (message.pFlags.mentioned) {\n        var user = AppUsersManager.getSelf()\n        if (user) {\n          options.highlightUsername = user.username\n        }\n      }\n      return RichTextProcessor.wrapRichText(message.message, options)\n    }\n\n    function fetchSingleMessages () {\n      if (fetchSingleMessagesTimeout !== false) {\n        clearTimeout(fetchSingleMessagesTimeout)\n        fetchSingleMessagesTimeout = false\n      }\n      if (!needSingleMessages.length) {\n        return\n      }\n      var mids = needSingleMessages.slice()\n      needSingleMessages = []\n\n      var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(mids)\n      angular.forEach(splitted.msgIDs, function (msgIDs, channelID) {\n        var promise\n        if (channelID > 0) {\n          promise = MtpApiManager.invokeApi('channels.getMessages', {\n            channel: AppChatsManager.getChannelInput(channelID),\n            id: msgIDs\n          })\n        } else {\n          promise = MtpApiManager.invokeApi('messages.getMessages', {\n            id: msgIDs\n          })\n        }\n\n        promise.then(function (getMessagesResult) {\n          AppUsersManager.saveApiUsers(getMessagesResult.users)\n          AppChatsManager.saveApiChats(getMessagesResult.chats)\n          saveMessages(getMessagesResult.messages)\n\n          $rootScope.$broadcast('messages_downloaded', splitted.mids[channelID])\n        })\n      })\n    }\n\n    function incrementMessageViews () {\n      if (incrementMessageViewsTimeout !== false) {\n        clearTimeout(incrementMessageViewsTimeout)\n        incrementMessageViewsTimeout = false\n      }\n      if (!needIncrementMessageViews.length) {\n        return\n      }\n      var mids = needIncrementMessageViews.slice()\n      needIncrementMessageViews = []\n\n      var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(mids)\n      angular.forEach(splitted.msgIDs, function (msgIDs, channelID) {\n        // console.log('increment', msgIDs, channelID)\n        MtpApiManager.invokeApi('messages.getMessagesViews', {\n          peer: AppPeersManager.getInputPeerByID(-channelID),\n          id: msgIDs,\n          increment: true\n        }).then(function (views) {\n          if (channelID) {\n            var mids = splitted.mids[channelID]\n            var updates = []\n            for (var i = 0; i < mids.length; i++) {\n              updates.push({\n                _: 'updateChannelMessageViews',\n                channel_id: channelID,\n                id: mids[i],\n                views: views[i]\n              })\n            }\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updates',\n              updates: updates,\n              chats: [],\n              users: []\n            })\n          }\n        })\n      })\n    }\n\n    function regroupWrappedHistory (history, limit) {\n      if (!history || !history.length) {\n        return false\n      }\n      var start = 0\n      var len = history.length\n      var end = len,\n        i, curDay\n      var prevDay, curMessage\n      var prevMessage, curGrouped\n      var prevGrouped\n      var wasUpdated = false\n      var groupFwd = !Config.Mobile\n\n      if (limit > 0) {\n        end = Math.min(limit, len)\n      } else if (limit < 0) {\n        start = Math.max(0, end + limit)\n      }\n\n      for (i = start; i < end; i++) {\n        if (history[i].deleted) {\n          history.splice(i, 1)\n          end--\n          continue\n        }\n        curMessage = history[i]\n        curDay = Math.floor((curMessage.date + ServerTimeManager.midnightOffset) / 86400)\n\n        prevGrouped = prevMessage && prevMessage.grouped\n        curGrouped = curMessage.grouped\n\n        if (curDay === prevDay) {\n          if (curMessage.needDate) {\n            delete curMessage.needDate\n            wasUpdated = true\n          }\n        } else if (!i || prevMessage) {\n          if (!curMessage.needDate) {\n            curMessage.needDate = true\n            wasUpdated = true\n          }\n        }\n\n        if (curMessage.fwdFromID &&\n          curMessage.media &&\n          curMessage.media.document &&\n          (curMessage.media.document.sticker || curMessage.media.document.audioTitle) &&\n          (curMessage.fromID != (prevMessage || {}).fromID || !(prevMessage || {}).fwdFromID)) {\n          delete curMessage.fwdFromID\n          curMessage._ = 'message'\n        }\n\n        if (curMessage.views &&\n            !incrementedMessageViews[curMessage.mid]) {\n          incrementedMessageViews[curMessage.mid] = true\n          needIncrementMessageViews.push(curMessage.mid)\n          if (incrementMessageViewsTimeout === false) {\n            incrementMessageViewsTimeout = setTimeout(incrementMessageViews, 10000)\n          }\n        }\n\n        if ((!AppPeersManager.isBroadcast(getMessagePeer(curMessage)) || curMessage.fwdFromID) &&\n            prevMessage &&\n            prevMessage.fromID == curMessage.fromID &&\n            !prevMessage.fwdFromID == !curMessage.fwdFromID &&\n            prevMessage.viaBotID == curMessage.viaBotID &&\n            !prevMessage.action &&\n            !curMessage.action &&\n            curMessage.date < prevMessage.date + 900) {\n          var singleLine = curMessage.message && curMessage.message.length < 70 && curMessage.message.indexOf('\\n') == -1 && !curMessage.reply_to_mid\n          if (groupFwd &&\n            curMessage.fwdFromID &&\n            curMessage.fwdFromID == prevMessage.fwdFromID &&\n            curMessage.viaBotID == prevMessage.viaBotID) {\n            curMessage.grouped = singleLine ? 'im_grouped_fwd_short' : 'im_grouped_fwd'\n          } else {\n            curMessage.grouped = !curMessage.fwdFromID && singleLine ? 'im_grouped_short' : 'im_grouped'\n          }\n          if (groupFwd && curMessage.fwdFromID) {\n            if (!prevMessage.grouped) {\n              prevMessage.grouped = 'im_grouped_fwd_start'\n            }\n            if (curMessage.grouped && i == len - 1) {\n              curMessage.grouped += ' im_grouped_fwd_end'\n            }\n          }\n        } else if (prevMessage || !i) {\n          delete curMessage.grouped\n\n          if (groupFwd && prevMessage && prevMessage.grouped && prevMessage.fwdFromID) {\n            prevMessage.grouped += ' im_grouped_fwd_end'\n          }\n        }\n        if (!wasUpdated && prevGrouped != (prevMessage && prevMessage.grouped)) {\n          wasUpdated = true\n        }\n        prevMessage = curMessage\n        prevDay = curDay\n      }\n      if (!wasUpdated && curGrouped != (prevMessage && prevMessage.grouped)) {\n        wasUpdated = true\n      }\n\n      return wasUpdated\n    }\n\n    function getMessageThumb (message, thumbWidth, thumbHeight) {\n      var thumbPhotoSize\n      var sticker = false\n      if (message.media) {\n        switch (message.media._) {\n          case 'messageMediaPhoto':\n            thumbPhotoSize = AppPhotosManager.choosePhotoSize(message.media.photo, thumbWidth, thumbHeight)\n            break\n\n          case 'messageMediaDocument':\n            thumbPhotoSize = message.media.document.thumb\n            if (message.media.document.sticker) {\n              sticker = true\n            }\n            break\n        }\n      }\n\n      if (thumbPhotoSize && thumbPhotoSize._ != 'photoSizeEmpty') {\n        var dim = calcImageInBox(thumbPhotoSize.w, thumbPhotoSize.h, thumbWidth, thumbHeight, true)\n\n        var thumb = {\n          width: dim.w,\n          height: dim.h,\n          location: thumbPhotoSize.location,\n          size: thumbPhotoSize.size\n        }\n        if (sticker) {\n          thumb.location.sticker = true\n        }\n\n        return thumb\n      }\n\n      return false\n    }\n\n    function incrementMaxSeenID (maxID) {\n      if (!maxID || !(!maxSeenID || maxID > maxSeenID)) {\n        return false\n      }\n      Storage.set({\n        max_seen_msg: maxID\n      })\n      MtpApiManager.invokeApi('messages.receivedMessages', {\n        max_id: maxID\n      })\n    }\n\n    function notifyAboutMessage (message, options) {\n      options = options || {}\n\n      var peerID = getMessagePeer(message)\n      var peerString\n      var notification = {}\n      var notificationMessage = false,\n        notificationPhoto\n\n      var notifySettings = NotificationsManager.getNotifySettings()\n\n      if (message.fwdFromID && options.fwd_count) {\n        notificationMessage = fwdMessagesPluralize(options.fwd_count)\n      } else if (message.message) {\n        if (notifySettings.nopreview) {\n          notificationMessage = _('conversation_message_sent')\n        } else {\n          notificationMessage = RichTextProcessor.wrapPlainText(message.message)\n        }\n      } else if (message.media) {\n        var captionEmoji = false;\n        switch (message.media._) {\n          case 'messageMediaPhoto':\n            notificationMessage = _('conversation_media_photo_raw')\n            captionEmoji = '🖼'\n            break\n          case 'messageMediaDocument':\n            switch (message.media.document.type) {\n              case 'gif':\n                notificationMessage = _('conversation_media_gif_raw')\n                captionEmoji = '🎬'\n                break\n              case 'sticker':\n                notificationMessage = _('conversation_media_sticker')\n                var stickerEmoji = message.media.document.stickerEmojiRaw\n                if (stickerEmoji !== undefined) {\n                  notificationMessage = RichTextProcessor.wrapPlainText(stickerEmoji) + ' ' + notificationMessage\n                }\n                break\n              case 'video':\n                notificationMessage = _('conversation_media_video_raw')\n                captionEmoji = '📹'\n                break\n              case 'round':\n                notificationMessage = _('conversation_media_round_raw')\n                captionEmoji = '📹'\n                break\n              case 'voice':\n              case 'audio':\n                notificationMessage = _('conversation_media_audio_raw')\n                break\n              default:\n                if (message.media.document.file_name) {\n                  notificationMessage = RichTextProcessor.wrapPlainText('📎 ' + message.media.document.file_name)\n                } else {\n                  notificationMessage = _('conversation_media_document_raw')\n                  captionEmoji = '📎'\n                }\n                break\n            }\n            break\n\n          case 'messageMediaGeo':\n          case 'messageMediaVenue':\n            notificationMessage = _('conversation_media_location_raw')\n            captionEmoji = '📍'\n            break\n          case 'messageMediaContact':\n            notificationMessage = _('conversation_media_contact_raw')\n            break\n          case 'messageMediaGame':\n            notificationMessage = RichTextProcessor.wrapPlainText('🎮 ' + message.media.game.title)\n            break\n          case 'messageMediaUnsupported':\n            notificationMessage = _('conversation_media_unsupported_raw')\n            break\n          default:\n            notificationMessage = _('conversation_media_attachment_raw')\n            break\n        }\n\n        if (captionEmoji !== false &&\n            message.media.caption) {\n          notificationMessage = RichTextProcessor.wrapPlainText(captionEmoji + ' ' + message.media.caption)\n        }\n      } else if (message._ == 'messageService') {\n        switch (message.action._) {\n          case 'messageActionChatCreate':\n            notificationMessage = _('conversation_group_created_raw')\n            break\n          case 'messageActionChatEditTitle':\n            notificationMessage = _('conversation_group_renamed_raw')\n            break\n          case 'messageActionChatEditPhoto':\n            notificationMessage = _('conversation_group_photo_updated_raw')\n            break\n          case 'messageActionChatDeletePhoto':\n            notificationMessage = _('conversation_group_photo_removed_raw')\n            break\n          case 'messageActionChatAddUser':\n          case 'messageActionChatAddUsers':\n            notificationMessage = _('conversation_invited_user_message_raw')\n            break\n          case 'messageActionChatReturn':\n            notificationMessage = _('conversation_returned_to_group_raw')\n            break\n          case 'messageActionChatJoined':\n            notificationMessage = _('conversation_joined_group_raw')\n            break\n          case 'messageActionChatDeleteUser':\n            notificationMessage = _('conversation_kicked_user_message_raw')\n            break\n          case 'messageActionChatLeave':\n            notificationMessage = _('conversation_left_group_raw')\n            break\n          case 'messageActionChatJoinedByLink':\n            notificationMessage = _('conversation_joined_by_link_raw')\n            break\n          case 'messageActionChannelCreate':\n            notificationMessage = _('conversation_created_channel_raw')\n            break\n          case 'messageActionChannelEditTitle':\n            notificationMessage = _('conversation_changed_channel_name_raw')\n            break\n          case 'messageActionChannelEditPhoto':\n            notificationMessage = _('conversation_changed_channel_photo_raw')\n            break\n          case 'messageActionChannelDeletePhoto':\n            notificationMessage = _('conversation_removed_channel_photo_raw')\n            break\n          case 'messageActionPinMessage':\n            notificationMessage = _('conversation_pinned_message_raw')\n            break\n          case 'messageActionGameScore':\n            notificationMessage = gameScorePluralize(message.action.score)\n            break\n\n          case 'messageActionPhoneCall':\n            switch (message.action.type) {\n              case 'out_missed':\n                notificationMessage = _('message_service_phonecall_canceled_raw')\n                break\n              case 'in_missed':\n                notificationMessage = _('message_service_phonecall_missed_raw')\n                break\n              case 'out_ok':\n                notificationMessage = _('message_service_phonecall_outgoing_raw')\n                break\n              case 'in_ok':\n                notificationMessage = _('message_service_phonecall_incoming_raw')\n                break\n            }\n            break\n        }\n      }\n\n      if (peerID > 0) {\n        var fromUser = AppUsersManager.getUser(message.from_id)\n        var fromPhoto = AppUsersManager.getUserPhoto(message.from_id)\n\n        notification.title = (fromUser.first_name || '') +\n          (fromUser.first_name && fromUser.last_name ? ' ' : '') +\n          (fromUser.last_name || '')\n        if (!notification.title) {\n          notification.title = fromUser.phone || _('conversation_unknown_user_raw')\n        }\n\n        notificationPhoto = fromPhoto\n\n        peerString = AppUsersManager.getUserString(peerID)\n      } else {\n        notification.title = AppChatsManager.getChat(-peerID).title || _('conversation_unknown_chat_raw')\n\n        if (message.from_id > 0) {\n          var fromUser = AppUsersManager.getUser(message.from_id)\n          notification.title = (fromUser.first_name || fromUser.last_name || _('conversation_unknown_user_raw')) +\n          ' @ ' +\n          notification.title\n        }\n\n        notificationPhoto = AppChatsManager.getChatPhoto(-peerID)\n\n        peerString = AppChatsManager.getChatString(-peerID)\n      }\n\n      notification.title = RichTextProcessor.wrapPlainText(notification.title)\n\n      notification.onclick = function () {\n        $rootScope.$broadcast('history_focus', {\n          peerString: peerString,\n          messageID: message.flags & 16 ? message.mid : 0\n        })\n      }\n\n      notification.message = notificationMessage\n      notification.key = 'msg' + message.mid\n      notification.tag = peerString\n      notification.silent = message.pFlags.silent || false\n\n      if (notificationPhoto.location && !notificationPhoto.location.empty) {\n        MtpApiFileManager.downloadSmallFile(notificationPhoto.location, notificationPhoto.size).then(function (blob) {\n          if (message.pFlags.unread) {\n            notification.image = blob\n            NotificationsManager.notify(notification)\n          }\n        })\n      } else {\n        NotificationsManager.notify(notification)\n      }\n    }\n\n    var newMessagesHandlePromise = false\n    var newMessagesToHandle = {}\n    var newDialogsHandlePromise = false\n    var newDialogsToHandle = {}\n    var notificationsHandlePromise = false\n    var notificationsToHandle = {}\n    var newUpdatesAfterReloadToHandle = {}\n\n    function handleNewMessages () {\n      $timeout.cancel(newMessagesHandlePromise)\n      newMessagesHandlePromise = false\n      $rootScope.$broadcast('history_multiappend', newMessagesToHandle)\n      newMessagesToHandle = {}\n    }\n\n    function handleNewDialogs () {\n      $timeout.cancel(newDialogsHandlePromise)\n      newDialogsHandlePromise = false\n      var newMaxSeenID = 0\n      angular.forEach(newDialogsToHandle, function (dialog, peerID) {\n        if (dialog.reload) {\n          reloadConversation(peerID)\n          delete newDialogsToHandle[peerID]\n        } else {\n          pushDialogToStorage(dialog)\n          if (!AppPeersManager.isChannel(peerID)) {\n            newMaxSeenID = Math.max(newMaxSeenID, dialog.top_message || 0)\n          }\n        }\n      })\n      if (newMaxSeenID !== false) {\n        incrementMaxSeenID(newMaxSeenID)\n      }\n      $rootScope.$broadcast('dialogs_multiupdate', newDialogsToHandle)\n      newDialogsToHandle = {}\n    }\n\n    function handleNotifications () {\n      $timeout.cancel(notificationsHandlePromise)\n      notificationsHandlePromise = false\n\n      var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000\n      angular.forEach(notificationsToHandle, function (notifyPeerToHandle) {\n        notifyPeerToHandle.isMutedPromise.then(function (muted) {\n          var topMessage = notifyPeerToHandle.top_message\n          if (muted ||\n            !topMessage.pFlags.unread) {\n            return\n          }\n          setTimeout(function () {\n            if (topMessage.pFlags.unread) {\n              notifyAboutMessage(topMessage, {\n                fwd_count: notifyPeerToHandle.fwd_count\n              })\n            }\n          }, timeout)\n        })\n      })\n\n      notificationsToHandle = {}\n    }\n\n    function handleUpdate(update) {\n      switch (update._) {\n        case 'updateMessageID':\n          var randomID = update.random_id\n          var pendingData = pendingByRandomID[randomID]\n          if (pendingData) {\n            var peerID = pendingData[0]\n            var tempID = pendingData[1]\n            var channelID = AppPeersManager.isChannel(peerID) ? -peerID : 0\n            var mid = AppMessagesIDsManager.getFullMessageID(update.id, channelID)\n            var message = messagesStorage[mid]\n            if (message) {\n              var historyStorage = historiesStorage[peerID]\n              var pos = historyStorage.pending.indexOf(tempID)\n              if (pos != -1) {\n                historyStorage.pending.splice(pos, 1)\n              }\n              delete messagesForHistory[tempID]\n              delete messagesStorage[tempID]\n\n              var msgs = {}\n              msgs[tempID] = true\n\n              $rootScope.$broadcast('history_delete', {peerID: peerID, msgs: msgs})\n\n              finalizePendingMessageCallbacks(tempID, finalMessage.mid)\n            } else {\n              pendingByMessageID[mid] = randomID\n            }\n          }\n          break\n\n        case 'updateNewMessage':\n        case 'updateNewChannelMessage':\n          var message = update.message\n          var peerID = getMessagePeer(message)\n          var historyStorage = historiesStorage[peerID]\n          var foundDialog = getDialogByPeerID(peerID)\n\n          if (!foundDialog.length) {\n            newDialogsToHandle[peerID] = {reload: true}\n            if (!newDialogsHandlePromise) {\n              newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n            }\n            if (newUpdatesAfterReloadToHandle[peerID] === undefined) {\n              newUpdatesAfterReloadToHandle[peerID] = []\n            }\n            newUpdatesAfterReloadToHandle[peerID].push(update)\n            break\n          }\n\n          if (update._ == 'updateNewChannelMessage') {\n            var chat = AppChatsManager.getChat(-peerID)\n            if (chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n              break\n            }\n          }\n\n          saveMessages([message], {isNew: true})\n          // console.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n          if (historyStorage === undefined) {\n           historyStorage = historiesStorage[peerID] = {\n              count: null,\n              history: [],\n              pending: []\n            }\n          }\n\n          var history = message.mid > 0 ? historyStorage.history : historyStorage.pending\n          if (history.indexOf(message.mid) != -1) {\n            return false\n          }\n          var topMsgID = history[0]\n          history.unshift(message.mid)\n          if (message.mid > 0 && message.mid < topMsgID) {\n            history.sort(function (a, b) {\n              return b - a\n            })\n          }\n          if (message.mid > 0 &&\n              historyStorage.count !== null) {\n            historyStorage.count++\n          }\n\n          if (mergeReplyKeyboard(historyStorage, message)) {\n            $rootScope.$broadcast('history_reply_markup', {peerID: peerID})\n          }\n\n          if (!message.pFlags.out && message.from_id) {\n            AppUsersManager.forceUserOnline(message.from_id)\n          }\n\n          var randomID = pendingByMessageID[message.mid],\n            pendingMessage\n\n          if (randomID) {\n            if (pendingMessage = finalizePendingMessage(randomID, message)) {\n              $rootScope.$broadcast('history_update', {peerID: peerID})\n            }\n            delete pendingByMessageID[message.mid]\n          }\n\n          if (!pendingMessage) {\n            if (newMessagesToHandle[peerID] === undefined) {\n              newMessagesToHandle[peerID] = []\n            }\n            newMessagesToHandle[peerID].push(message.mid)\n            if (!newMessagesHandlePromise) {\n              newMessagesHandlePromise = $timeout(handleNewMessages, 0)\n            }\n          }\n\n          var inboxUnread = !message.pFlags.out && message.pFlags.unread\n          var dialog = foundDialog[0]\n          dialog.top_message = message.mid\n          if (inboxUnread) {\n            dialog.unread_count++\n          }\n          if (!dialog.pFlags.pinned || !dialog.index) {\n            dialog.index = generateDialogIndex(message.date)\n          }\n\n          newDialogsToHandle[peerID] = dialog\n          if (!newDialogsHandlePromise) {\n            newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n          }\n\n          if (inboxUnread &&\n              ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE)) {\n            var notifyPeer = message.flags & 16 ? message.from_id : peerID\n            var notifyPeerToHandle = notificationsToHandle[notifyPeer]\n            if (notifyPeerToHandle === undefined) {\n              notifyPeerToHandle = notificationsToHandle[notifyPeer] = {\n                isMutedPromise: NotificationsManager.getPeerMuted(notifyPeer),\n                fwd_count: 0,\n                from_id: 0\n              }\n            }\n\n            if (notifyPeerToHandle.from_id != message.from_id) {\n              notifyPeerToHandle.from_id = message.from_id\n              notifyPeerToHandle.fwd_count = 0\n            }\n            if (message.fwdFromID) {\n              notifyPeerToHandle.fwd_count++\n            }\n\n            notifyPeerToHandle.top_message = message\n\n            if (!notificationsHandlePromise) {\n              notificationsHandlePromise = $timeout(handleNotifications, 1000)\n            }\n          }\n          break\n\n        case 'updateDialogPinned':\n          var peerID = AppPeersManager.getPeerID(update.peer)\n          var foundDialog = getDialogByPeerID(peerID)\n\n          if (!foundDialog.length || !update.pFlags.pinned) {\n            newDialogsToHandle[peerID] = {reload: true}\n            if (!newDialogsHandlePromise) {\n              newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n            }\n            break\n          }\n\n          var dialog = foundDialog[0]\n          dialog.index = generateDialogIndex(generateDialogPinnedDate())\n          dialog.pFlags.pinned = true\n          break\n\n        case 'updatePinnedDialogs':\n          var changedDialogs = {}\n          var newPinned = {}\n          if (!update.order) {\n            MtpApiManager.invokeApi('messages.getPinnedDialogs', {}).then(function (dialogsResult) {\n              dialogsResult.dialogs.reverse()\n              applyConversations(dialogsResult)\n              angular.forEach(dialogsResult.dialogs, function (dialog) {\n                newPinned[dialog.peerID] = true\n              })\n              angular.forEach(dialogsStorage.dialogs, function (dialog) {\n                var peerID = dialog.peerID\n                if (dialog.pFlags.pinned && !newPinned[peerID]) {\n                  newDialogsToHandle[peerID] = {reload: true}\n                  if (!newDialogsHandlePromise) {\n                    newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n                  }\n                }\n              })\n            })\n            break\n          }\n          update.order.reverse()\n          angular.forEach(update.order, function (peer) {\n            var peerID = AppPeersManager.getPeerID(peer)\n            newPinned[peerID] = true\n\n            var foundDialog = getDialogByPeerID(peerID)\n\n            if (!foundDialog.length) {\n              newDialogsToHandle[peerID] = {reload: true}\n              if (!newDialogsHandlePromise) {\n                newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n              }\n              return\n            }\n\n            var dialog = foundDialog[0]\n            dialog.index = generateDialogIndex(generateDialogPinnedDate())\n            dialog.pFlags.pinned = true\n\n            newDialogsToHandle[peerID] = dialog\n            if (!newDialogsHandlePromise) {\n              newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n            }\n          })\n          angular.forEach(dialogsStorage.dialogs, function (dialog) {\n            var peerID = dialog.peerID\n            if (dialog.pFlags.pinned && !newPinned[peerID]) {\n              newDialogsToHandle[peerID] = {reload: true}\n              if (!newDialogsHandlePromise) {\n                newDialogsHandlePromise = $timeout(handleNewDialogs, 0)\n              }\n            }\n          })\n          break\n\n        case 'updateEditMessage':\n        case 'updateEditChannelMessage':\n          var message = update.message\n          var peerID = getMessagePeer(message)\n          var channelID = message.to_id._ == 'peerChannel' ? -peerID : 0\n          var mid = AppMessagesIDsManager.getFullMessageID(message.id, channelID)\n          if (messagesStorage[mid] === undefined) {\n            break\n          }\n\n          // console.trace(dT(), 'edit message', message)\n          saveMessages([message], {isEdited: true})\n          safeReplaceObject(messagesStorage[mid], message)\n\n          var wasForHistory = messagesForHistory[mid]\n          if (wasForHistory !== undefined) {\n            delete messagesForHistory[mid]\n            var newForHistory = wrapForHistory(mid)\n            safeReplaceObject(wasForHistory, newForHistory)\n            messagesForHistory[mid] = wasForHistory\n          }\n\n          var foundDialog = getDialogByPeerID(peerID)[0]\n          var isTopMessage = foundDialog && foundDialog.top_message == mid\n          if (message.clear_history) {\n            if (isTopMessage) {\n              $rootScope.$broadcast('dialog_flush', {peerID: peerID})\n            } else {\n              var msgs = {}\n              msgs[mid] = true\n              $rootScope.$broadcast('history_delete', {peerID: peerID, msgs: msgs})\n            }\n          } else {\n            $rootScope.$broadcast('message_edit', {\n              peerID: peerID,\n              id: message.id,\n              mid: mid\n            })\n            if (isTopMessage) {\n              var updatedDialogs = {}\n              updatedDialogs[peerID] = foundDialog\n              $rootScope.$broadcast('dialogs_multiupdate', updatedDialogs)\n            }\n          }\n          break\n\n        case 'updateReadHistoryInbox':\n        case 'updateReadHistoryOutbox':\n        case 'updateReadChannelInbox':\n        case 'updateReadChannelOutbox':\n          var isOut = update._ == 'updateReadHistoryOutbox' || update._ == 'updateReadChannelOutbox'\n          var channelID = update.channel_id\n          var maxID = AppMessagesIDsManager.getFullMessageID(update.max_id, channelID)\n          var peerID = channelID ? -channelID : AppPeersManager.getPeerID(update.peer)\n          var foundDialog = getDialogByPeerID(peerID)\n          var history = (historiesStorage[peerID] || {}).history || []\n          var newUnreadCount = false\n          var length = history.length\n          var foundAffected = false\n          var messageID, message\n          var i\n\n          // console.warn(dT(), 'read', peerID, isOut ? 'out' : 'in', maxID)\n\n          if (peerID > 0 && isOut) {\n            AppUsersManager.forceUserOnline(peerID)\n          }\n\n          for (i = 0; i < length; i++) {\n            messageID = history[i]\n            if (messageID > maxID) {\n              continue\n            }\n            message = messagesStorage[messageID]\n\n            if (message.pFlags.out != isOut) {\n              continue\n            }\n            if (!message.pFlags.unread) {\n              break\n            }\n            // console.warn('read', messageID, message.pFlags.unread, message)\n            if (message && message.pFlags.unread) {\n              message.pFlags.unread = false\n              if (messagesForHistory[messageID]) {\n                messagesForHistory[messageID].pFlags.unread = false\n                if (!foundAffected) {\n                  foundAffected = true\n                }\n              }\n              if (messagesForDialogs[messageID]) {\n                messagesForDialogs[messageID].pFlags.unread = false\n              }\n              if (!message.pFlags.out) {\n                if (foundDialog[0]) {\n                  newUnreadCount = --foundDialog[0].unread_count\n                }\n                NotificationsManager.cancel('msg' + messageID)\n              }\n            }\n          }\n          if (foundDialog[0]) {\n            if (!isOut &&\n              newUnreadCount &&\n              foundDialog[0].top_message <= maxID) {\n              newUnreadCount = foundDialog[0].unread_count = 0\n            }\n            var dialogKey = isOut ? 'read_outbox_max_id' : 'read_inbox_max_id'\n            foundDialog[0][dialogKey] = maxID\n          }\n\n          if (newUnreadCount !== false) {\n            // console.warn(dT(), 'cnt', peerID, newUnreadCount)\n            $rootScope.$broadcast('dialog_unread', {peerID: peerID, count: newUnreadCount})\n          }\n          if (foundAffected) {\n            $rootScope.$broadcast('messages_read')\n          }\n          break\n\n        case 'updateChannelReadMessagesContents':\n          var channelID = update.channel_id\n          var newMessages = []\n          angular.forEach(update.messages, function (msgID) {\n            newMessages.push(AppMessagesIDsManager.getFullMessageID(msgID, channelID))\n          })\n          update.messages = newMessages\n\n        case 'updateReadMessagesContents':\n          var messages = update.messages\n          var len = messages.length\n          var i\n          var messageID, message\n          var historyMessage\n          for (i = 0; i < len; i++) {\n            messageID = messages[i]\n            if (message = messagesStorage[messageID]) {\n              delete message.pFlags.media_unread\n            }\n            if (historyMessage = messagesForHistory[messageID]) {\n              delete historyMessage.pFlags.media_unread\n            }\n          }\n          break\n\n        case 'updateChannelAvailableMessages':\n          var channelID = update.channel_id\n          var messages = []\n          var peerID = -channelID\n          var history = (historiesStorage[peerID] || {}).history || []\n          if (history.length) {\n            angular.forEach(history, function (msgID) {\n              if (!update.available_min_id ||\n                  AppMessagesIDsManager.getMessageLocalID(msgID) <= update.available_min_id) {\n                messages.push(msgID)\n              }\n            })\n          }\n          update.messages = messages\n\n        case 'updateDeleteMessages':\n        case 'updateDeleteChannelMessages':\n          var dialogsUpdated = {}\n          var historiesUpdated = {}\n          var channelID = update.channel_id\n          var messageID\n          var message, i\n          var peerID, foundDialog\n          var history\n          var peerMessagesToHandle\n          var peerMessagesHandlePos\n\n          for (i = 0; i < update.messages.length; i++) {\n            messageID = AppMessagesIDsManager.getFullMessageID(update.messages[i], channelID)\n            message = messagesStorage[messageID]\n            if (message) {\n              peerID = getMessagePeer(message)\n              history = historiesUpdated[peerID] || (historiesUpdated[peerID] = {count: 0, unread: 0, msgs: {}})\n\n              if (!message.pFlags.out && message.pFlags.unread) {\n                history.unread++\n                NotificationsManager.cancel('msg' + messageID)\n              }\n              history.count++\n              history.msgs[messageID] = true\n\n              if (messagesForHistory[messageID]) {\n                messagesForHistory[messageID].deleted = true\n                delete messagesForHistory[messageID]\n              }\n              if (messagesForDialogs[messageID]) {\n                messagesForDialogs[messageID].deleted = true\n                delete messagesForDialogs[messageID]\n              }\n              message.deleted = true\n              messagesStorage[messageID] = {\n                deleted: true,\n                id: messageID,\n                from_id: message.from_id,\n                to_id: message.to_id,\n                flags: message.flags,\n                pFlags: message.pFlags,\n                date: message.date\n              }\n\n              peerMessagesToHandle = newMessagesToHandle[peerID]\n              if (peerMessagesToHandle && peerMessagesToHandle.length) {\n                peerMessagesHandlePos = peerMessagesToHandle.indexOf(messageID)\n                if (peerMessagesHandlePos != -1) {\n                  peerMessagesToHandle.splice(peerMessagesHandlePos)\n                }\n              }\n            }\n          }\n\n          angular.forEach(historiesUpdated, function (updatedData, peerID) {\n            var historyStorage = historiesStorage[peerID]\n            if (historyStorage !== undefined) {\n              var newHistory = []\n              var newPending = []\n              for (var i = 0; i < historyStorage.history.length; i++) {\n                if (!updatedData.msgs[historyStorage.history[i]]) {\n                  newHistory.push(historyStorage.history[i])\n                }\n              }\n              historyStorage.history = newHistory\n              if (updatedData.count &&\n                historyStorage.count !== null &&\n                historyStorage.count > 0) {\n                historyStorage.count -= updatedData.count\n                if (historyStorage.count < 0) {\n                  historyStorage.count = 0\n                }\n              }\n\n              for (var i = 0; i < historyStorage.pending.length; i++) {\n                if (!updatedData.msgs[historyStorage.pending[i]]) {\n                  newPending.push(historyStorage.pending[i])\n                }\n              }\n              historyStorage.pending = newPending\n\n              $rootScope.$broadcast('history_delete', {peerID: peerID, msgs: updatedData.msgs})\n            }\n\n            var foundDialog = getDialogByPeerID(peerID)[0]\n            if (foundDialog) {\n              if (updatedData.unread) {\n                foundDialog.unread_count -= updatedData.unread\n\n                $rootScope.$broadcast('dialog_unread', {\n                  peerID: peerID,\n                  count: foundDialog.unread_count\n                })\n              }\n\n              if (updatedData.msgs[foundDialog.top_message]) {\n                reloadConversation(peerID)\n              }\n            }\n          })\n          break\n\n        case 'updateChannel':\n          var channelID = update.channel_id\n          var peerID = -channelID\n          var channel = AppChatsManager.getChat(channelID)\n\n          var needDialog = channel._ == 'channel' && (!channel.pFlags.left && !channel.pFlags.kicked)\n          var foundDialog = getDialogByPeerID(peerID)\n          var hasDialog = foundDialog.length > 0\n\n          var canViewHistory = channel._ == 'channel' && (channel.username || !channel.pFlags.left && !channel.pFlags.kicked) && true || false\n          var hasHistory = historiesStorage[peerID] !== undefined\n\n          if (canViewHistory != hasHistory) {\n            delete historiesStorage[peerID]\n            $rootScope.$broadcast('history_forbidden', peerID)\n          }\n          if (hasDialog != needDialog) {\n            if (needDialog) {\n              reloadConversation(-channelID)\n            } else {\n              if (foundDialog[0]) {\n                dialogsStorage.dialogs.splice(foundDialog[1], 1)\n                $rootScope.$broadcast('dialog_drop', {peerID: peerID})\n              }\n            }\n          }\n          break\n\n        case 'updateChannelReload':\n          var channelID = update.channel_id\n          var peerID = -channelID\n          var foundDialog = getDialogByPeerID(peerID)\n          if (foundDialog[0]) {\n            dialogsStorage.dialogs.splice(foundDialog[1], 1)\n          }\n          delete historiesStorage[peerID]\n          reloadConversation(-channelID).then(function () {\n            $rootScope.$broadcast('history_reload', peerID)\n          })\n          break\n\n        case 'updateChannelMessageViews':\n          var views = update.views\n          var mid = AppMessagesIDsManager.getFullMessageID(update.id, update.channel_id)\n          var message = getMessage(mid)\n          if (message && message.views && message.views < views) {\n            message.views = views\n            $rootScope.$broadcast('message_views', {\n              mid: mid,\n              views: views\n            })\n          }\n          break\n\n        case 'updateServiceNotification':\n          // update.inbox_date = tsNow(true)\n          // update.pFlags = {popup: true}\n          var fromID = 777000\n          var peerID = fromID\n          var messageID = tempID--\n          var message = {\n            _: 'message',\n            id: messageID,\n            from_id: fromID,\n            to_id: AppPeersManager.getOutputPeer(peerID),\n            flags: 0,\n            pFlags: {unread: true},\n            date: (update.inbox_date || tsNow(true)) + ServerTimeManager.serverTimeOffset,\n            message: update.message,\n            media: update.media,\n            entities: update.entities\n          }\n          if (!AppUsersManager.hasUser(fromID)) {\n            AppUsersManager.saveApiUsers([{\n              _: 'user',\n              id: fromID,\n              pFlags: {verified: true},\n              access_hash: 0,\n              first_name: 'Telegram',\n              phone: '42777'\n            }])\n          }\n          saveMessages([message])\n\n          if (update.inbox_date) {\n            pendingTopMsgs[peerID] = messageID\n            handleUpdate({\n              _: 'updateNewMessage',\n              message: message\n            })\n          }\n          if (update.pFlags.popup && update.message) {\n            var historyMessage = wrapForHistory(messageID)\n            ErrorService.show({error: {code: 400, type: 'UPDATE_SERVICE_NOTIFICATION'}, historyMessage: historyMessage})\n          }\n          break\n      }\n    }\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      // if (update._ != 'updateUserStatus') {\n      //   console.log('on apiUpdate', update)\n      // }\n      handleUpdate(update)\n    })\n\n    function reloadConversation (peerID) {\n      return MtpApiManager.invokeApi('messages.getPeerDialogs', {\n        peers: [\n          AppPeersManager.getInputPeerByID(peerID)\n        ]\n      }).then(applyConversations)\n    }\n\n    function applyConversations(dialogsResult) {\n      AppUsersManager.saveApiUsers(dialogsResult.users)\n      AppChatsManager.saveApiChats(dialogsResult.chats)\n      saveMessages(dialogsResult.messages)\n\n      var updatedDialogs = {}\n      var hasUpdated = false\n      angular.forEach(dialogsResult.dialogs, function (dialog) {\n        var peerID = AppPeersManager.getPeerID(dialog.peer)\n        var topMessage = dialog.top_message\n        var topPendingMesage = pendingTopMsgs[peerID]\n        if (topPendingMesage) {\n          if (!topMessage || getMessage(topPendingMesage).date > getMessage(topMessage).date) {\n            dialog.top_message = topMessage = topPendingMesage\n          }\n        }\n        if (topMessage) {\n          var wasBefore = getDialogByPeerID(peerID).length > 0\n          saveConversation(dialog)\n          if (wasBefore) {\n            clearDialogCache(topMessage)\n            $rootScope.$broadcast('dialog_top', dialog)\n          } else {\n            updatedDialogs[peerID] = dialog\n            hasUpdated = true\n          }\n        } else {\n          var foundDialog = getDialogByPeerID(peerID)\n          if (foundDialog.length) {\n            dialogsStorage.dialogs.splice(foundDialog[1], 1)\n            $rootScope.$broadcast('dialog_drop', {peerID: peerID})\n          }\n        }\n        if (newUpdatesAfterReloadToHandle[peerID] !== undefined) {\n          angular.forEach(newUpdatesAfterReloadToHandle[peerID], function (update) {\n            handleUpdate(update)\n          })\n          delete newUpdatesAfterReloadToHandle[peerID]\n        }\n      })\n      if (hasUpdated) {\n        $rootScope.$broadcast('dialogs_multiupdate', updatedDialogs)\n      }\n    }\n\n    $rootScope.$on('webpage_updated', function (e, eventData) {\n      angular.forEach(eventData.msgs, function (msgID) {\n        var historyMessage = messagesForHistory[msgID]\n        if (historyMessage) {\n          historyMessage.media = {\n            _: 'messageMediaWebPage',\n            webpage: AppWebPagesManager.wrapForHistory(eventData.id)\n          }\n          $rootScope.$broadcast('message_edit', {\n            peerID: getMessagePeer(historyMessage),\n            id: historyMessage.id,\n            mid: msgID,\n            justMedia: true\n          })\n        }\n      })\n    })\n\n    $rootScope.$on('draft_updated', function (e, eventData) {\n      var peerID = eventData.peerID\n      var draft = eventData.draft\n\n      var dialog = getDialogByPeerID(peerID)[0]\n      if (dialog) {\n        var topDate\n        if (draft && draft.date) {\n          topDate = draft.date\n        } else {\n          var channelID = AppPeersManager.isChannel(peerID) ? -peerID : 0\n          var topDate = getMessage(dialog.top_message).date\n          if (channelID) {\n            var channel = AppChatsManager.getChat(channelID)\n            if (!topDate || channel.date && channel.date > topDate) {\n              topDate = channel.date\n            }\n          }\n        }\n        if (!dialog.pFlags.pinned) {\n          dialog.index = generateDialogIndex(topDate)\n        }\n        pushDialogToStorage(dialog)\n\n        $rootScope.$broadcast('dialog_draft', {\n          peerID: peerID,\n          draft: draft,\n          index: dialog.index\n        })\n      }\n    })\n\n    return {\n      getConversations: getConversations,\n      getConversation: getConversation,\n      getHistory: getHistory,\n      getSearch: getSearch,\n      getMessage: getMessage,\n      getReplyKeyboard: getReplyKeyboard,\n      readHistory: readHistory,\n      readMessages: readMessages,\n      flushHistory: flushHistory,\n      deleteMessages: deleteMessages,\n      sendText: sendText,\n      sendFile: sendFile,\n      sendOther: sendOther,\n      forwardMessages: forwardMessages,\n      reportMessages: reportMessages,\n      startBot: startBot,\n      shareGame: shareGame,\n      editMessage: editMessage,\n      convertMigratedPeer: convertMigratedPeer,\n      getMessagePeer: getMessagePeer,\n      getMessageThumb: getMessageThumb,\n      getMessageShareLink: getMessageShareLink,\n      canMessageBeEdited: canMessageBeEdited,\n      canEditMessage: canEditMessage,\n      canReportMessage: canReportMessage,\n      getMessageEditData: getMessageEditData,\n      canRevokeMessage: canRevokeMessage,\n      clearDialogCache: clearDialogCache,\n      wrapForDialog: wrapForDialog,\n      wrapForHistory: wrapForHistory,\n      wrapReplyMarkup: wrapReplyMarkup,\n      wrapSingleMessage: wrapSingleMessage,\n      wrapMessageText: wrapMessageText,\n      regroupWrappedHistory: regroupWrappedHistory\n    }\n  })\n\n  .service('AppMessagesIDsManager', function () {\n    var channelLocals = {}\n    var channelsByLocals = {}\n    var channelCurLocal = 0\n    var fullMsgIDModulus = 4294967296\n\n    return {\n      getFullMessageID: getFullMessageID,\n      getMessageIDInfo: getMessageIDInfo,\n      getMessageLocalID: getMessageLocalID,\n      splitMessageIDsByChannels: splitMessageIDsByChannels,\n      fullMsgIDModulus: fullMsgIDModulus\n    }\n\n    function getFullMessageID (msgID, channelID) {\n      if (!channelID || msgID <= 0) {\n        return msgID\n      }\n      msgID = getMessageLocalID(msgID)\n      var localStart = channelLocals[channelID]\n      if (!localStart) {\n        localStart = (++channelCurLocal) * fullMsgIDModulus\n        channelsByLocals[localStart] = channelID\n        channelLocals[channelID] = localStart\n      }\n\n      return localStart + msgID\n    }\n\n    function getMessageIDInfo (fullMsgID) {\n      if (fullMsgID < fullMsgIDModulus) {\n        return [fullMsgID, 0]\n      }\n      var msgID = fullMsgID % fullMsgIDModulus\n      var channelID = channelsByLocals[fullMsgID - msgID]\n\n      return [msgID, channelID]\n    }\n\n    function getMessageLocalID (fullMsgID) {\n      if (!fullMsgID) {\n        return 0\n      }\n      return fullMsgID % fullMsgIDModulus\n    }\n\n    function splitMessageIDsByChannels (mids) {\n      var msgIDsByChannels = {}\n      var midsByChannels = {}\n      var i\n      var mid, msgChannel\n      var channelID\n      for (i = 0; i < mids.length; i++) {\n        mid = mids[i]\n        msgChannel = getMessageIDInfo(mid)\n        channelID = msgChannel[1]\n        if (msgIDsByChannels[channelID] === undefined) {\n          msgIDsByChannels[channelID] = []\n          midsByChannels[channelID] = []\n        }\n        msgIDsByChannels[channelID].push(msgChannel[0])\n        midsByChannels[channelID].push(mid)\n      }\n\n      return {\n        msgIDs: msgIDsByChannels,\n        mids: midsByChannels\n      }\n    }\n  })\n"
  },
  {
    "path": "app/js/offline_manager.js",
    "content": ";(function initAutoUpgrade () {\n  window.safeConfirm = function (params, callback) {\n    if (typeof params === 'string') {\n      params = {message: params}\n    }\n    var result = false\n    try {\n      result = confirm(params.message)\n    } catch (e) {\n      result = true\n    }\n    setTimeout(function () {callback(result)}, 10)\n  }\n\n  if ((!navigator.serviceWorker && !window.applicationCache) ||\n    Config.Modes.packed ||\n    !window.addEventListener) {\n    return\n  }\n  if ('web.telegram.org' !== location.hostname ||\n      Config.Modes.test ||\n      Config.Modes.ios_standalone ||\n      location.search.indexOf('legacy=1') != -1) {\n    // procceed\n  } else {\n    return\n  }\n\n  var declined = false\n  function updateFound () {\n    if (!declined) {\n      safeConfirm({type: 'WEBOGRAM_UPDATED_RELOAD', message: 'A new version of Webogram is downloaded. Launch it?'}, function (result) {\n        if (result) {\n          window.location.reload()\n        } else {\n          declined = true\n        }\n      })\n    }\n  }\n\n  if (navigator.serviceWorker) {\n    // If available, use a Service Worker to handle offlining.\n    navigator.serviceWorker.register('service_worker.js').then(function (registration) {\n      console.log('Offline worker registered')\n      registration.addEventListener('updatefound', function () {\n        var installingWorker = this.installing\n\n        // Wait for the new service worker to be installed before prompting to update.\n        installingWorker.addEventListener('statechange', function () {\n          switch (installingWorker.state) {\n            case 'installed':\n              // Only show the prompt if there is currently a controller so it is not\n              // shown on first load.\n              if (navigator.serviceWorker.controller) {\n                updateFound()\n              }\n              break\n\n            case 'redundant':\n              console.error('The installing service worker became redundant.')\n              break\n          }\n        })\n      })\n    }).catch(function (error) {\n      console.error('Offline register SW error', error)\n    })\n  } else {\n    // Otherwise, use AppCache.\n    var appCache = window.applicationCache\n    var updateTimeout = false\n    var scheduleUpdate = function (delay) {\n      clearTimeout(updateTimeout)\n      updateTimeout = setTimeout(function () {\n        try {\n          appCache.update()\n        } catch (ex) {\n          console.log('appCache.update: ' + ex)\n        }\n      }, delay || 300000)\n    }\n\n    scheduleUpdate(3000)\n    window.addEventListener('load', function () {\n      appCache.addEventListener('updateready', function () {\n        if (appCache.status == appCache.UPDATEREADY) {\n          updateFound()\n        }\n      }, false)\n      appCache.addEventListener('noupdate', function () {scheduleUpdate()}, false)\n      appCache.addEventListener('error', function () {scheduleUpdate()}, false)\n    })\n  }\n})()\n"
  },
  {
    "path": "app/js/services.js",
    "content": "/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n'use strict'\n\n/* Services */\n\nangular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])\n\n  .service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, qSync, MtpApiManager, RichTextProcessor, ServerTimeManager, Storage, _) {\n    var users = {}\n    var usernames = {}\n    var userAccess = {}\n    var cachedPhotoLocations = {}\n    var contactsIndex = SearchIndexManager.createIndex()\n    var contactsFillPromise\n    var contactsList\n    var myID\n\n    MtpApiManager.getUserID().then(function (id) {\n      myID = id\n    })\n\n    function fillContacts () {\n      if (contactsFillPromise) {\n        return contactsFillPromise\n      }\n      return contactsFillPromise = MtpApiManager.invokeApi('contacts.getContacts', {\n        hash: 0\n      }).then(function (result) {\n        var userID, searchText\n        var i\n        contactsList = []\n        saveApiUsers(result.users)\n\n        for (var i = 0; i < result.contacts.length; i++) {\n          userID = result.contacts[i].user_id\n          contactsList.push(userID)\n          SearchIndexManager.indexObject(userID, getUserSearchText(userID), contactsIndex)\n        }\n\n        return contactsList\n      })\n    }\n\n    function getUserSearchText (id) {\n      var user = users[id]\n      if (!user) {\n        return false\n      }\n      var serviceText = ''\n      if (user.pFlags.self) {\n        serviceText = _('user_name_saved_msgs_raw')\n      }\n\n      return (user.first_name || '') +\n              ' ' + (user.last_name || '') +\n              ' ' + (user.phone || '') +\n              ' ' + (user.username || '') +\n              ' ' + serviceText\n    }\n\n    function getContacts (query) {\n      return fillContacts().then(function (contactsList) {\n        if (angular.isString(query) && query.length) {\n          var results = SearchIndexManager.search(query, contactsIndex)\n          var filteredContactsList = []\n\n          for (var i = 0; i < contactsList.length; i++) {\n            if (results[contactsList[i]]) {\n              filteredContactsList.push(contactsList[i])\n            }\n          }\n          contactsList = filteredContactsList\n        }\n\n        contactsList.sort(function (userID1, userID2) {\n          var sortName1 = (users[userID1] || {}.sortName) || ''\n          var sortName2 = (users[userID2] || {}.sortName) || ''\n          if (sortName1 == sortName2) {\n            return 0\n          }\n          return sortName1 > sortName2 ? 1 : -1\n        })\n\n        return contactsList\n      })\n    }\n\n    function resolveUsername (username) {\n      return usernames[username] || 0\n    }\n\n    function saveApiUsers (apiUsers) {\n      angular.forEach(apiUsers, saveApiUser)\n    }\n\n    function saveApiUser (apiUser, noReplace) {\n      if (!angular.isObject(apiUser) ||\n        noReplace && angular.isObject(users[apiUser.id]) && users[apiUser.id].first_name) {\n        return\n      }\n\n      var userID = apiUser.id\n      var result = users[userID]\n\n      if (apiUser.pFlags === undefined) {\n        apiUser.pFlags = {}\n      }\n\n      if (apiUser.pFlags.min) {\n        if (result !== undefined) {\n          return\n        }\n      }\n\n      if (apiUser.phone) {\n        apiUser.rPhone = $filter('phoneNumber')(apiUser.phone)\n      }\n\n      apiUser.num = (Math.abs(userID) % 8) + 1\n\n      if (apiUser.first_name) {\n        apiUser.rFirstName = RichTextProcessor.wrapRichText(apiUser.first_name, {noLinks: true, noLinebreaks: true})\n        apiUser.rFullName = apiUser.last_name ? RichTextProcessor.wrapRichText(apiUser.first_name + ' ' + (apiUser.last_name || ''), {noLinks: true, noLinebreaks: true}) : apiUser.rFirstName\n      } else {\n        apiUser.rFirstName = RichTextProcessor.wrapRichText(apiUser.last_name, {noLinks: true, noLinebreaks: true}) || apiUser.rPhone || _('user_first_name_deleted')\n        apiUser.rFullName = RichTextProcessor.wrapRichText(apiUser.last_name, {noLinks: true, noLinebreaks: true}) || apiUser.rPhone || _('user_name_deleted')\n      }\n\n      if (apiUser.username) {\n        var searchUsername = SearchIndexManager.cleanUsername(apiUser.username)\n        usernames[searchUsername] = userID\n      }\n\n      apiUser.sortName = apiUser.pFlags.deleted ? '' : SearchIndexManager.cleanSearchText(apiUser.first_name + ' ' + (apiUser.last_name || ''))\n\n      var nameWords = apiUser.sortName.split(' ')\n      var firstWord = nameWords.shift()\n      var lastWord = nameWords.pop()\n      apiUser.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1))\n\n      if (apiUser.status) {\n        if (apiUser.status.expires) {\n          apiUser.status.expires -= ServerTimeManager.serverTimeOffset\n        }\n        if (apiUser.status.was_online) {\n          apiUser.status.was_online -= ServerTimeManager.serverTimeOffset\n        }\n      }\n      if (apiUser.pFlags.bot) {\n        apiUser.sortStatus = -1\n      } else {\n        apiUser.sortStatus = getUserStatusForSort(apiUser.status)\n      }\n\n      var result = users[userID]\n      if (result === undefined) {\n        result = users[userID] = apiUser\n      } else {\n        safeReplaceObject(result, apiUser)\n      }\n      $rootScope.$broadcast('user_update', userID)\n\n      if (cachedPhotoLocations[userID] !== undefined) {\n        safeReplaceObject(cachedPhotoLocations[userID], apiUser && apiUser.photo && apiUser.photo.photo_small || {empty: true})\n      }\n    }\n\n    function saveUserAccess (id, accessHash) {\n      userAccess[id] = accessHash\n    }\n\n    function getUserStatusForSort (status) {\n      if (status) {\n        var expires = status.expires || status.was_online\n        if (expires) {\n          return expires\n        }\n        var timeNow = tsNow(true)\n        switch (status._) {\n          case 'userStatusRecently':\n            return timeNow - 86400 * 3\n          case 'userStatusLastWeek':\n            return timeNow - 86400 * 7\n          case 'userStatusLastMonth':\n            return timeNow - 86400 * 30\n        }\n      }\n\n      return 0\n    }\n\n    function getUser (id) {\n      if (angular.isObject(id)) {\n        return id\n      }\n      return users[id] || {id: id, deleted: true, num: 1, access_hash: userAccess[id]}\n    }\n\n    function getSelf () {\n      return getUser(myID)\n    }\n\n    function isBot (id) {\n      return users[id] && users[id].pFlags.bot\n    }\n\n    function hasUser (id, allowMin) {\n      var user = users[id]\n      return angular.isObject(user) && (allowMin || !user.pFlags.min)\n    }\n\n    function getUserPhoto (id) {\n      var user = getUser(id)\n\n      if (id == 333000) {\n        return {\n          placeholder: 'img/placeholders/DialogListAvatarSystem@2x.png'\n        }\n      }\n\n      if (cachedPhotoLocations[id] === undefined) {\n        cachedPhotoLocations[id] = user && user.photo && user.photo.photo_small || {empty: true}\n      }\n\n      return {\n        num: user.num,\n        placeholder: 'img/placeholders/UserAvatar' + user.num + '@2x.png',\n        location: cachedPhotoLocations[id]\n      }\n    }\n\n    function getUserString (id) {\n      var user = getUser(id)\n      return 'u' + id + (user.access_hash ? '_' + user.access_hash : '')\n    }\n\n    function getUserInput (id) {\n      var user = getUser(id)\n      if (user.pFlags.self) {\n        return {_: 'inputUserSelf'}\n      }\n      return {\n        _: 'inputUser',\n        user_id: id,\n        access_hash: user.access_hash || 0\n      }\n    }\n\n    function updateUsersStatuses () {\n      var timestampNow = tsNow(true)\n      angular.forEach(users, function (user) {\n        if (user.status &&\n          user.status._ == 'userStatusOnline' &&\n          user.status.expires < timestampNow) {\n          user.status = user.status.wasStatus ||\n          {_: 'userStatusOffline', was_online: user.status.expires}\n          delete user.status.wasStatus\n          $rootScope.$broadcast('user_update', user.id)\n        }\n      })\n    }\n\n    function forceUserOnline (id) {\n      if (isBot(id)) {\n        return\n      }\n      var user = getUser(id)\n      if (user &&\n        user.status &&\n        user.status._ != 'userStatusOnline' &&\n        user.status._ != 'userStatusEmpty') {\n        var wasStatus\n        if (user.status._ != 'userStatusOffline') {\n          delete user.status.wasStatus\n          wasStatus = angular.copy(user.status)\n        }\n        user.status = {\n          _: 'userStatusOnline',\n          expires: tsNow(true) + 60,\n          wasStatus: wasStatus\n        }\n        user.sortStatus = getUserStatusForSort(user.status)\n        $rootScope.$broadcast('user_update', id)\n      }\n    }\n\n    function wrapForFull (id) {\n      var user = getUser(id)\n\n      return user\n    }\n\n    function openUser (userID, override) {\n      var scope = $rootScope.$new()\n      scope.userID = userID\n      scope.override = override || {}\n\n      var modalInstance = $modal.open({\n        templateUrl: templateUrl('user_modal'),\n        controller: 'UserModalController',\n        scope: scope,\n        windowClass: 'user_modal_window mobile_modal',\n        backdrop: 'single'\n      })\n    }\n\n    function importContact (phone, firstName, lastName) {\n      return MtpApiManager.invokeApi('contacts.importContacts', {\n        contacts: [{\n          _: 'inputPhoneContact',\n          client_id: '1',\n          phone: phone,\n          first_name: firstName,\n          last_name: lastName\n        }],\n        replace: false\n      }).then(function (importedContactsResult) {\n        saveApiUsers(importedContactsResult.users)\n\n        var foundUserID = false\n        angular.forEach(importedContactsResult.imported, function (importedContact) {\n          onContactUpdated(foundUserID = importedContact.user_id, true)\n        })\n\n        return foundUserID || false\n      })\n    }\n\n    function importContacts (contacts) {\n      var inputContacts = [],\n        i\n      var j\n\n      for (i = 0; i < contacts.length; i++) {\n        for (j = 0; j < contacts[i].phones.length; j++) {\n          inputContacts.push({\n            _: 'inputPhoneContact',\n            client_id: (i << 16 | j).toString(10),\n            phone: contacts[i].phones[j],\n            first_name: contacts[i].first_name,\n            last_name: contacts[i].last_name\n          })\n        }\n      }\n\n      return MtpApiManager.invokeApi('contacts.importContacts', {\n        contacts: inputContacts,\n        replace: false\n      }).then(function (importedContactsResult) {\n        saveApiUsers(importedContactsResult.users)\n\n        var result = []\n        angular.forEach(importedContactsResult.imported, function (importedContact) {\n          onContactUpdated(importedContact.user_id, true)\n          result.push(importedContact.user_id)\n        })\n\n        return result\n      })\n    }\n\n    function deleteContacts (userIDs) {\n      var ids = []\n      angular.forEach(userIDs, function (userID) {\n        ids.push(getUserInput(userID))\n      })\n      return MtpApiManager.invokeApi('contacts.deleteContacts', {\n        id: ids\n      }).then(function () {\n        angular.forEach(userIDs, function (userID) {\n          onContactUpdated(userID, false)\n        })\n      })\n    }\n\n    function onContactUpdated (userID, isContact) {\n      userID = parseInt(userID)\n      if (angular.isArray(contactsList)) {\n        var curPos = curIsContact = contactsList.indexOf(userID)\n        var curIsContact = curPos != -1\n\n        if (isContact != curIsContact) {\n          if (isContact) {\n            contactsList.push(userID)\n            SearchIndexManager.indexObject(userID, getUserSearchText(userID), contactsIndex)\n          } else {\n            contactsList.splice(curPos, 1)\n          }\n          $rootScope.$broadcast('contacts_update', userID)\n        }\n      }\n    }\n\n    function openImportContact () {\n      return $modal.open({\n        templateUrl: templateUrl('import_contact_modal'),\n        controller: 'ImportContactModalController',\n        windowClass: 'md_simple_modal_window mobile_modal'\n      }).result.then(function (foundUserID) {\n        if (!foundUserID) {\n          return $q.reject()\n        }\n        return foundUserID\n      })\n    }\n\n    function setUserStatus (userID, offline) {\n      if (isBot(userID)) {\n        return\n      }\n      var user = users[userID]\n      if (user) {\n        var status = offline ? {\n          _: 'userStatusOffline',\n          was_online: tsNow(true)\n        } : {\n          _: 'userStatusOnline',\n          expires: tsNow(true) + 500\n        }\n\n        user.status = status\n        user.sortStatus = getUserStatusForSort(user.status)\n        $rootScope.$broadcast('user_update', userID)\n      }\n    }\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      // console.log('on apiUpdate', update)\n      switch (update._) {\n        case 'updateUserStatus':\n          var userID = update.user_id\n          var user = users[userID]\n          if (user) {\n            user.status = update.status\n            if (user.status) {\n              if (user.status.expires) {\n                user.status.expires -= ServerTimeManager.serverTimeOffset\n              }\n              if (user.status.was_online) {\n                user.status.was_online -= ServerTimeManager.serverTimeOffset\n              }\n            }\n            user.sortStatus = getUserStatusForSort(user.status)\n            $rootScope.$broadcast('user_update', userID)\n          }\n          break\n\n        case 'updateUserPhoto':\n          var userID = update.user_id\n          var user = users[userID]\n          if (user) {\n            forceUserOnline(userID)\n            if (!user.photo) {\n              user.photo = update.photo\n            } else {\n              safeReplaceObject(user.photo, update.photo)\n            }\n\n            if (cachedPhotoLocations[userID] !== undefined) {\n              safeReplaceObject(cachedPhotoLocations[userID], update.photo && update.photo.photo_small || {empty: true})\n            }\n\n            $rootScope.$broadcast('user_update', userID)\n          }\n          break\n\n        case 'updateContactLink':\n          onContactUpdated(update.user_id, update.my_link._ == 'contactLinkContact')\n          break\n      }\n    })\n\n    $rootScope.$on('user_auth', function (e, userAuth) {\n      myID = userAuth && userAuth.id || 0\n    })\n\n    setInterval(updateUsersStatuses, 60000)\n\n    $rootScope.$on('stateSynchronized', updateUsersStatuses)\n\n    return {\n      getContacts: getContacts,\n      saveApiUsers: saveApiUsers,\n      saveApiUser: saveApiUser,\n      saveUserAccess: saveUserAccess,\n      getUser: getUser,\n      getSelf: getSelf,\n      getUserInput: getUserInput,\n      setUserStatus: setUserStatus,\n      forceUserOnline: forceUserOnline,\n      getUserPhoto: getUserPhoto,\n      getUserString: getUserString,\n      getUserSearchText: getUserSearchText,\n      hasUser: hasUser,\n      isBot: isBot,\n      importContact: importContact,\n      importContacts: importContacts,\n      deleteContacts: deleteContacts,\n      wrapForFull: wrapForFull,\n      openUser: openUser,\n      resolveUsername: resolveUsername,\n      openImportContact: openImportContact\n    }\n  })\n\n  .service('PhonebookContactsService', function ($q, $modal, $sce, FileManager) {\n    return {\n      isAvailable: isAvailable,\n      openPhonebookImport: openPhonebookImport,\n      getPhonebookContacts: getPhonebookContacts\n    }\n\n    function isAvailable () {\n      if (Config.Mobile && Config.Navigator.ffos && Config.Modes.packed) {\n        try {\n          return navigator.mozContacts && navigator.mozContacts.getAll\n        } catch (e) {\n          console.error(dT(), 'phonebook n/a', e)\n          return false\n        }\n      }\n      return false\n    }\n\n    function openPhonebookImport () {\n      return $modal.open({\n        templateUrl: templateUrl('phonebook_modal'),\n        controller: 'PhonebookModalController',\n        windowClass: 'phonebook_modal_window mobile_modal'\n      })\n    }\n\n    function getPhonebookContacts () {\n      try {\n        var request = window.navigator.mozContacts.getAll({})\n      } catch (e) {\n        return $q.reject(e)\n      }\n\n      var deferred = $q.defer()\n      var contacts = []\n      var count = 0\n\n      request.onsuccess = function () {\n        if (this.result) {\n          var contact = {\n            id: count,\n            first_name: (this.result.givenName || []).join(' '),\n            last_name: (this.result.familyName || []).join(' '),\n            phones: []\n          }\n\n          if (this.result.tel != undefined) {\n            for (var i = 0; i < this.result.tel.length; i++) {\n              contact.phones.push(this.result.tel[i].value)\n            }\n          }\n          if (this.result.photo && this.result.photo[0]) {\n            try {\n              contact.photo = FileManager.getUrl(this.result.photo[0])\n            } catch (e) {}\n          }\n          if (!contact.photo) {\n            contact.photo = 'img/placeholders/UserAvatar' + ((Math.abs(count) % 8) + 1) + '@2x.png'\n          }\n          contact.photo = $sce.trustAsResourceUrl(contact.photo)\n\n          count++\n          contacts.push(contact)\n        }\n\n        if (!this.result || count >= 1000) {\n          deferred.resolve(contacts)\n          return\n        }\n\n        this['continue']()\n      }\n\n      request.onerror = function (e) {\n        console.log('phonebook error', e, e.type, e.message)\n        deferred.reject(e)\n      }\n\n      return deferred.promise\n    }\n  })\n\n  .service('AppChatsManager', function ($q, $rootScope, $modal, _, MtpApiManager, AppUsersManager, AppPhotosManager, RichTextProcessor) {\n    var chats = {}\n    var usernames = {}\n    var channelAccess = {}\n    var megagroups = {}\n    var cachedPhotoLocations = {}\n\n    function saveApiChats (apiChats) {\n      angular.forEach(apiChats, saveApiChat)\n    }\n\n    function saveApiChat (apiChat) {\n      if (!angular.isObject(apiChat)) {\n        return\n      }\n      apiChat.rTitle = RichTextProcessor.wrapRichText(apiChat.title, {noLinks: true, noLinebreaks: true}) || _('chat_title_deleted')\n\n      var result = chats[apiChat.id]\n      var titleWords = SearchIndexManager.cleanSearchText(apiChat.title || '').split(' ')\n      var firstWord = titleWords.shift()\n      var lastWord = titleWords.pop()\n      apiChat.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1))\n\n      apiChat.num = (Math.abs(apiChat.id >> 1) % 8) + 1\n\n      if (apiChat.pFlags === undefined) {\n        apiChat.pFlags = {}\n      }\n      if (apiChat.pFlags.min) {\n        if (result !== undefined) {\n          return\n        }\n      }\n      if (apiChat._ == 'channel' &&\n          apiChat.participants_count === undefined &&\n          result !== undefined &&\n          result.participants_count) {\n        apiChat.participants_count = result.participants_count\n      }\n\n      if (apiChat.username) {\n        var searchUsername = SearchIndexManager.cleanUsername(apiChat.username)\n        usernames[searchUsername] = apiChat.id\n      }\n\n      if (result === undefined) {\n        result = chats[apiChat.id] = apiChat\n      } else {\n        safeReplaceObject(result, apiChat)\n        $rootScope.$broadcast('chat_update', apiChat.id)\n      }\n\n      if (cachedPhotoLocations[apiChat.id] !== undefined) {\n        safeReplaceObject(cachedPhotoLocations[apiChat.id], apiChat && apiChat.photo && apiChat.photo.photo_small || {empty: true})\n      }\n    }\n\n    function getChat (id) {\n      return chats[id] || {id: id, deleted: true, access_hash: channelAccess[id]}\n    }\n\n    function hasRights (id, action) {\n      if (chats[id] === undefined) {\n        return false\n      }\n      var chat = getChat(id)\n      if (chat._ == 'chatForbidden' ||\n          chat._ == 'channelForbidden' ||\n          chat.pFlags.kicked ||\n          chat.pFlags.left) {\n        return false\n      }\n      if (chat.pFlags.creator) {\n        return true\n      }\n\n      switch (action) {\n        case 'send':\n          if (chat._ == 'channel' &&\n              !chat.pFlags.megagroup &&\n              !chat.pFlags.editor) {\n            return false\n          }\n          break\n\n        case 'edit_title':\n        case 'edit_photo':\n        case 'invite':\n          if (chat._ == 'channel') {\n            if (chat.pFlags.megagroup) {\n              if (!chat.pFlags.editor &&\n                  !(action == 'invite' && chat.pFlags.democracy)) {\n                return false\n              }\n            } else {\n              return false\n            }\n          } else {\n            if (chat.pFlags.admins_enabled &&\n                !chat.pFlags.admin) {\n              return false\n            }\n          }\n          break\n      }\n      return true\n    }\n\n    function resolveUsername (username) {\n      return usernames[username] || 0\n    }\n\n    function saveChannelAccess (id, accessHash) {\n      channelAccess[id] = accessHash\n    }\n\n    function saveIsMegagroup (id) {\n      megagroups[id] = true\n    }\n\n    function isChannel (id) {\n      var chat = chats[id]\n      if (chat && (chat._ == 'channel' || chat._ == 'channelForbidden') ||\n        channelAccess[id]) {\n        return true\n      }\n      return false\n    }\n\n    function isMegagroup (id) {\n      if (megagroups[id]) {\n        return true\n      }\n      var chat = chats[id]\n      if (chat && chat._ == 'channel' && chat.pFlags.megagroup) {\n        return true\n      }\n      return false\n    }\n\n    function isBroadcast (id) {\n      return isChannel(id) && !isMegagroup(id)\n    }\n\n    function getChatInput (id) {\n      return id || 0\n    }\n\n    function getChannelInput (id) {\n      if (!id) {\n        return {_: 'inputChannelEmpty'}\n      }\n      return {\n        _: 'inputChannel',\n        channel_id: id,\n        access_hash: getChat(id).access_hash || channelAccess[id] || 0\n      }\n    }\n\n    function hasChat (id, allowMin) {\n      var chat = chats[id]\n      return angular.isObject(chat) && (allowMin || !chat.pFlags.min)\n    }\n\n    function getChatPhoto (id) {\n      var chat = getChat(id)\n\n      if (cachedPhotoLocations[id] === undefined) {\n        cachedPhotoLocations[id] = chat && chat.photo && chat.photo.photo_small || {empty: true}\n      }\n\n      return {\n        placeholder: 'img/placeholders/GroupAvatar' + Math.ceil(chat.num / 2) + '@2x.png',\n        location: cachedPhotoLocations[id]\n      }\n    }\n\n    function getChatString (id) {\n      var chat = getChat(id)\n      if (isChannel(id)) {\n        return (isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash\n      }\n      return 'g' + id\n    }\n\n    function wrapForFull (id, fullChat) {\n      var chatFull = angular.copy(fullChat)\n      var chat = getChat(id)\n\n      if (!chatFull.participants_count) {\n        chatFull.participants_count = chat.participants_count\n      }\n\n      if (chatFull.participants &&\n          chatFull.participants._ == 'chatParticipants') {\n        chatFull.participants.participants = wrapParticipants(id, chatFull.participants.participants)\n      }\n\n      if (chatFull.about) {\n        chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true})\n      }\n\n      chatFull.peerString = getChatString(id)\n      chatFull.chat = chat\n\n      return chatFull\n    }\n\n    function wrapParticipants(id, participants) {\n      var chat = getChat(id)\n      var myID = AppUsersManager.getSelf().id\n      if (isChannel(id)) {\n        var isAdmin = chat.pFlags.creator || chat.pFlags.editor || chat.pFlags.moderator\n        angular.forEach(participants, function (participant) {\n          participant.canLeave = myID == participant.user_id\n          participant.canKick = isAdmin && participant._ == 'channelParticipant'\n\n          // just for order by last seen\n          participant.user = AppUsersManager.getUser(participant.user_id)\n        })\n      } else {\n        var isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin\n        angular.forEach(participants, function (participant) {\n          participant.canLeave = myID == participant.user_id\n          participant.canKick = !participant.canLeave && (\n            chat.pFlags.creator ||\n            participant._ == 'chatParticipant' && (isAdmin || myID == participant.inviter_id)\n          )\n\n          // just for order by last seen\n          participant.user = AppUsersManager.getUser(participant.user_id)\n        })\n      }\n      return participants\n    }\n\n    function openChat (chatID, accessHash) {\n      var scope = $rootScope.$new()\n      scope.chatID = chatID\n\n      if (isChannel(chatID)) {\n        var modalInstance = $modal.open({\n          templateUrl: templateUrl('channel_modal'),\n          controller: 'ChannelModalController',\n          scope: scope,\n          windowClass: 'chat_modal_window channel_modal_window mobile_modal'\n        })\n      } else {\n        var modalInstance = $modal.open({\n          templateUrl: templateUrl('chat_modal'),\n          controller: 'ChatModalController',\n          scope: scope,\n          windowClass: 'chat_modal_window mobile_modal'\n        })\n      }\n    }\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      // console.log('on apiUpdate', update)\n      switch (update._) {\n        case 'updateChannel':\n          var channelID = update.channel_id\n          $rootScope.$broadcast('channel_settings', {channelID: channelID})\n          break\n      }\n    })\n\n    return {\n      saveApiChats: saveApiChats,\n      saveApiChat: saveApiChat,\n      getChat: getChat,\n      isChannel: isChannel,\n      isMegagroup: isMegagroup,\n      isBroadcast: isBroadcast,\n      hasRights: hasRights,\n      saveChannelAccess: saveChannelAccess,\n      saveIsMegagroup: saveIsMegagroup,\n      getChatInput: getChatInput,\n      getChannelInput: getChannelInput,\n      getChatPhoto: getChatPhoto,\n      getChatString: getChatString,\n      resolveUsername: resolveUsername,\n      hasChat: hasChat,\n      wrapForFull: wrapForFull,\n      wrapParticipants: wrapParticipants,\n      openChat: openChat\n    }\n  })\n\n  .service('AppPeersManager', function ($q, qSync, AppUsersManager, AppChatsManager, MtpApiManager) {\n    function getInputPeer (peerString) {\n      var firstChar = peerString.charAt(0)\n      var peerParams = peerString.substr(1).split('_')\n\n      if (firstChar == 'u') {\n        AppUsersManager.saveUserAccess(peerParams[0], peerParams[1])\n        return {\n          _: 'inputPeerUser',\n          user_id: peerParams[0],\n          access_hash: peerParams[1]\n        }\n      }\n      else if (firstChar == 'c' || firstChar == 's') {\n        AppChatsManager.saveChannelAccess(peerParams[0], peerParams[1])\n        if (firstChar == 's') {\n          AppChatsManager.saveIsMegagroup(peerParams[0])\n        }\n        return {\n          _: 'inputPeerChannel',\n          channel_id: peerParams[0],\n          access_hash: peerParams[1] || 0\n        }\n      }else {\n        return {\n          _: 'inputPeerChat',\n          chat_id: peerParams[0]\n        }\n      }\n    }\n\n    function getInputPeerByID (peerID) {\n      if (!peerID) {\n        return {_: 'inputPeerEmpty'}\n      }\n      if (peerID < 0) {\n        var chatID = -peerID\n        if (!AppChatsManager.isChannel(chatID)) {\n          return {\n            _: 'inputPeerChat',\n            chat_id: chatID\n          }\n        } else {\n          return {\n            _: 'inputPeerChannel',\n            channel_id: chatID,\n            access_hash: AppChatsManager.getChat(chatID).access_hash || 0\n          }\n        }\n      }\n      return {\n        _: 'inputPeerUser',\n        user_id: peerID,\n        access_hash: AppUsersManager.getUser(peerID).access_hash || 0\n      }\n    }\n\n    function getPeerSearchText (peerID) {\n      var text\n      if (peerID > 0) {\n        text = '%pu ' + AppUsersManager.getUserSearchText(peerID)\n      } else if (peerID < 0) {\n        var chat = AppChatsManager.getChat(-peerID)\n        text = '%pg ' + (chat.title || '')\n      }\n      return text\n    }\n\n    function getPeerString (peerID) {\n      if (peerID > 0) {\n        return AppUsersManager.getUserString(peerID)\n      }\n      return AppChatsManager.getChatString(-peerID)\n    }\n\n    function getOutputPeer (peerID) {\n      if (peerID > 0) {\n        return {_: 'peerUser', user_id: peerID}\n      }\n      var chatID = -peerID\n      if (AppChatsManager.isChannel(chatID)) {\n        return {_: 'peerChannel', channel_id: chatID}\n      }\n      return {_: 'peerChat', chat_id: chatID}\n    }\n\n    function resolveUsername (username) {\n      var searchUserName = SearchIndexManager.cleanUsername(username)\n      if (searchUserName.match(/^\\d+$/)) {\n        return qSync.when(false)\n      }\n      var foundUserID\n      var foundChatID, foundPeerID\n      var foundUsername\n      if (foundUserID = AppUsersManager.resolveUsername(searchUserName)) {\n        foundUsername = AppUsersManager.getUser(foundUserID).username\n        if (SearchIndexManager.cleanUsername(foundUsername) == searchUserName) {\n          return qSync.when(foundUserID)\n        }\n      }\n      if (foundChatID = AppChatsManager.resolveUsername(searchUserName)) {\n        foundUsername = AppChatsManager.getChat(foundChatID).username\n        if (SearchIndexManager.cleanUsername(foundUsername) == searchUserName) {\n          return qSync.when(-foundChatID)\n        }\n      }\n\n      return MtpApiManager.invokeApi('contacts.resolveUsername', {username: username}).then(function (resolveResult) {\n        AppUsersManager.saveApiUsers(resolveResult.users)\n        AppChatsManager.saveApiChats(resolveResult.chats)\n        return getPeerID(resolveResult.peer)\n      })\n    }\n\n    function getPeerID (peerString) {\n      if (angular.isObject(peerString)) {\n        return peerString.user_id\n          ? peerString.user_id\n          : -(peerString.channel_id || peerString.chat_id)\n      }\n      var isUser = peerString.charAt(0) == 'u'\n      var peerParams = peerString.substr(1).split('_')\n\n      return isUser ? peerParams[0] : -peerParams[0] || 0\n    }\n\n    function getPeer (peerID) {\n      return peerID > 0\n        ? AppUsersManager.getUser(peerID)\n        : AppChatsManager.getChat(-peerID)\n    }\n\n    function getPeerPhoto (peerID) {\n      return peerID > 0\n        ? AppUsersManager.getUserPhoto(peerID)\n        : AppChatsManager.getChatPhoto(-peerID)\n    }\n\n    function getPeerMigratedTo(peerID) {\n      if (peerID >= 0) {\n        return false\n      }\n      var chat = AppChatsManager.getChat(-peerID)\n      if (chat && chat.migrated_to && chat.pFlags.deactivated) {\n        return getPeerID(chat.migrated_to)\n      }\n      return false\n    }\n\n    function isChannel (peerID) {\n      return (peerID < 0) && AppChatsManager.isChannel(-peerID)\n    }\n\n    function isMegagroup (peerID) {\n      return (peerID < 0) && AppChatsManager.isMegagroup(-peerID)\n    }\n\n    function isAnyGroup (peerID) {\n      return (peerID < 0) && !AppChatsManager.isBroadcast(-peerID)\n    }\n\n    function isBroadcast (id) {\n      return isChannel(id) && !isMegagroup(id)\n    }\n\n    function isBot (peerID) {\n      return (peerID > 0) && AppUsersManager.isBot(peerID)\n    }\n\n    return {\n      getInputPeer: getInputPeer,\n      getInputPeerByID: getInputPeerByID,\n      getPeerSearchText: getPeerSearchText,\n      getPeerString: getPeerString,\n      getOutputPeer: getOutputPeer,\n      getPeerID: getPeerID,\n      getPeer: getPeer,\n      getPeerPhoto: getPeerPhoto,\n      getPeerMigratedTo: getPeerMigratedTo,\n      resolveUsername: resolveUsername,\n      isChannel: isChannel,\n      isAnyGroup: isAnyGroup,\n      isMegagroup: isMegagroup,\n      isBroadcast: isBroadcast,\n      isBot: isBot\n    }\n  })\n\n  .service('AppProfileManager', function ($q, $rootScope, AppUsersManager, AppChatsManager, AppMessagesIDsManager, AppPeersManager, AppPhotosManager, NotificationsManager, MtpApiManager, ApiUpdatesManager, RichTextProcessor, Storage) {\n    var botInfos = {}\n    var chatsFull = {}\n    var chatFullPromises = {}\n    var chatParticipantsPromises = {}\n\n    function saveBotInfo (botInfo) {\n      var botID = botInfo && botInfo.user_id\n      if (!botID) {\n        return false\n      }\n      var commands = {}\n      angular.forEach(botInfo.commands, function (botCommand) {\n        commands[botCommand.command] = botCommand.description\n      })\n      return botInfos[botID] = {\n        id: botID,\n        version: botInfo.version,\n        shareText: botInfo.share_text,\n        description: botInfo.description,\n        commands: commands\n      }\n    }\n\n    function getProfile (id, override) {\n      return MtpApiManager.invokeApi('users.getFullUser', {\n        id: AppUsersManager.getUserInput(id)\n      }).then(function (userFull) {\n        if (override && override.phone_number) {\n          userFull.user.phone = override.phone_number\n          if (override.first_name || override.last_name) {\n            userFull.user.first_name = override.first_name\n            userFull.user.last_name = override.last_name\n          }\n          AppUsersManager.saveApiUser(userFull.user)\n        } else {\n          AppUsersManager.saveApiUser(userFull.user, true)\n        }\n\n        if (userFull.profile_photo) {\n          AppPhotosManager.savePhoto(userFull.profile_photo, {\n            user_id: id\n          })\n        }\n\n        if (userFull.about !== undefined) {\n          userFull.rAbout = RichTextProcessor.wrapRichText(userFull.about, {noLinebreaks: true})\n        }\n\n        NotificationsManager.savePeerSettings(id, userFull.notify_settings)\n\n        if (userFull.bot_info) {\n          userFull.bot_info = saveBotInfo(userFull.bot_info)\n        }\n\n        return userFull\n      })\n    }\n\n    function getPeerBots (peerID) {\n      var peerBots = []\n      if (peerID >= 0 && !AppUsersManager.isBot(peerID) ||\n        (AppPeersManager.isChannel(peerID) && !AppPeersManager.isMegagroup(peerID))) {\n        return $q.when(peerBots)\n      }\n      if (peerID >= 0) {\n        return getProfile(peerID).then(function (userFull) {\n          var botInfo = userFull.bot_info\n          if (botInfo && botInfo._ != 'botInfoEmpty') {\n            peerBots.push(botInfo)\n          }\n          return peerBots\n        })\n      }\n\n      return getChatFull(-peerID).then(function (chatFull) {\n        angular.forEach(chatFull.bot_info, function (botInfo) {\n          peerBots.push(saveBotInfo(botInfo))\n        })\n        return peerBots\n      })\n    }\n\n    function getChatFull (id) {\n      if (AppChatsManager.isChannel(id)) {\n        return getChannelFull(id)\n      }\n      if (chatsFull[id] !== undefined) {\n        var chat = AppChatsManager.getChat(id)\n        if (chat.version == chatsFull[id].participants.version ||\n          chat.pFlags.left) {\n          return $q.when(chatsFull[id])\n        }\n      }\n      if (chatFullPromises[id] !== undefined) {\n        return chatFullPromises[id]\n      }\n      // console.trace(dT(), 'Get chat full', id, AppChatsManager.getChat(id))\n      return chatFullPromises[id] = MtpApiManager.invokeApi('messages.getFullChat', {\n        chat_id: AppChatsManager.getChatInput(id)\n      }).then(function (result) {\n        AppChatsManager.saveApiChats(result.chats)\n        AppUsersManager.saveApiUsers(result.users)\n        var fullChat = result.full_chat\n        if (fullChat && fullChat.chat_photo.id) {\n          AppPhotosManager.savePhoto(fullChat.chat_photo)\n        }\n        NotificationsManager.savePeerSettings(-id, fullChat.notify_settings)\n        delete chatFullPromises[id]\n        chatsFull[id] = fullChat\n        $rootScope.$broadcast('chat_full_update', id)\n\n        return fullChat\n      })\n    }\n\n    function getChatInviteLink (id, force) {\n      return getChatFull(id).then(function (chatFull) {\n        if (!force &&\n          chatFull.exported_invite &&\n          chatFull.exported_invite._ == 'chatInviteExported') {\n          return chatFull.exported_invite.link\n        }\n        var promise\n        if (AppChatsManager.isChannel(id)) {\n          promise = MtpApiManager.invokeApi('channels.exportInvite', {\n            channel: AppChatsManager.getChannelInput(id)\n          })\n        } else {\n          promise = MtpApiManager.invokeApi('messages.exportChatInvite', {\n            chat_id: AppChatsManager.getChatInput(id)\n          })\n        }\n        return promise.then(function (exportedInvite) {\n          if (chatsFull[id] !== undefined) {\n            chatsFull[id].exported_invite = exportedInvite\n          }\n          return exportedInvite.link\n        })\n      })\n    }\n\n    function getChannelParticipants (id, filter, limit, offset) {\n      filter = filter || {_: 'channelParticipantsRecent'}\n      limit = limit || 200\n      offset = offset || 0\n      var promiseKey = [id, filter._, offset, limit].join('_')\n      var promiseData = chatParticipantsPromises[promiseKey]\n\n      if (filter._ == 'channelParticipantsRecent') {\n        var chat = AppChatsManager.getChat(id)\n        if (chat &&\n            chat.pFlags && (\n              chat.pFlags.kicked ||\n              chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n            )) {\n          return $q.reject()\n        }\n      }\n\n      var fetchParticipants = function (cachedParticipants) {\n        var hash = 0\n        if (cachedParticipants) {\n          var userIDs = []\n          angular.forEach(cachedParticipants, function (participant) {\n            userIDs.push(participant.user_id)\n          })\n          userIDs.sort()\n          angular.forEach(userIDs, function (userID) {\n            hash = ((hash * 20261) + 0x80000000 + userID) % 0x80000000\n          })\n        }\n        return MtpApiManager.invokeApi('channels.getParticipants', {\n          channel: AppChatsManager.getChannelInput(id),\n          filter: filter,\n          offset: offset,\n          limit: limit,\n          hash: hash\n        }).then(function (result) {\n          if (result._ == 'channels.channelParticipantsNotModified') {\n            return cachedParticipants\n          }\n          AppUsersManager.saveApiUsers(result.users)\n          return result.participants\n        })\n      }\n\n      var maybeAddSelf = function (participants) {\n        var chat = AppChatsManager.getChat(id)\n        var selfMustBeFirst = filter._ == 'channelParticipantsRecent' &&\n                              !offset &&\n                              !chat.pFlags.kicked &&\n                              !chat.pFlags.left\n\n        if (selfMustBeFirst) {\n          participants = angular.copy(participants)\n          var myID = AppUsersManager.getSelf().id\n          var myIndex = false\n          var myParticipant\n          for (var i = 0, len = participants.length; i < len; i++) {\n            if (participants[i].user_id == myID) {\n              myIndex = i\n              break\n            }\n          }\n          if (myIndex !== false) {\n            myParticipant = participants[i]\n            participants.splice(i, 1)\n          } else {\n            myParticipant = {_: 'channelParticipantSelf', user_id: myID}\n          }\n          participants.unshift(myParticipant)\n        }\n        return participants\n      }\n\n      var timeNow = tsNow()\n      if (promiseData !== undefined) {\n        var promise = promiseData[1]\n        if (promiseData[0] > timeNow - 60000) {\n          return promise\n        }\n        var newPromise = promise.then(function (cachedParticipants) {\n          return fetchParticipants(cachedParticipants).then(maybeAddSelf)\n        })\n        chatParticipantsPromises[promiseKey] = [timeNow, newPromise]\n        return newPromise\n      }\n\n      var newPromise = fetchParticipants().then(maybeAddSelf)\n      chatParticipantsPromises[promiseKey] = [timeNow, newPromise]\n      return newPromise\n    }\n\n    function getChannelFull (id, force) {\n      if (chatsFull[id] !== undefined && !force) {\n        return $q.when(chatsFull[id])\n      }\n      if (chatFullPromises[id] !== undefined) {\n        return chatFullPromises[id]\n      }\n\n      return chatFullPromises[id] = MtpApiManager.invokeApi('channels.getFullChannel', {\n        channel: AppChatsManager.getChannelInput(id)\n      }).then(function (result) {\n        AppChatsManager.saveApiChats(result.chats)\n        AppUsersManager.saveApiUsers(result.users)\n        var fullChannel = result.full_chat\n        if (fullChannel && fullChannel.chat_photo.id) {\n          AppPhotosManager.savePhoto(fullChannel.chat_photo)\n        }\n        NotificationsManager.savePeerSettings(-id, fullChannel.notify_settings)\n\n        if (fullChannel.pinned_msg_id) {\n          fullChannel.pinned_msg_id = AppMessagesIDsManager.getFullMessageID(fullChannel.pinned_msg_id, id)\n        }\n\n        delete chatFullPromises[id]\n        chatsFull[id] = fullChannel\n        $rootScope.$broadcast('chat_full_update', id)\n\n        return fullChannel\n\n      }, function (error) {\n        switch (error.type) {\n          case 'CHANNEL_PRIVATE':\n            var channel = AppChatsManager.getChat(id)\n            channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title}\n            ApiUpdatesManager.processUpdateMessage({\n              _: 'updates',\n              updates: [{\n                _: 'updateChannel',\n                channel_id: id\n              }],\n              chats: [channel],\n              users: []\n            })\n            break\n        }\n        return $q.reject(error)\n      })\n    }\n\n    function invalidateChannelParticipants(id) {\n      delete chatsFull[id]\n      delete chatFullPromises[id]\n      angular.forEach(chatParticipantsPromises, function (val, key) {\n        if (key.split('_')[0] == id) {\n          delete chatParticipantsPromises[key]\n        }\n      })\n      $rootScope.$broadcast('chat_full_update', id)\n    }\n\n    function getChannelPinnedMessage(id) {\n      return getChannelFull(id).then(function (fullChannel) {\n        var pinnedMessageID = fullChannel && fullChannel.pinned_msg_id\n        if (!pinnedMessageID) {\n          return false\n        }\n        return Storage.get('pinned_hidden' + id).then(function (hiddenMessageID) {\n          if (AppMessagesIDsManager.getMessageLocalID(pinnedMessageID) == hiddenMessageID) {\n            return false\n          }\n          return pinnedMessageID\n        })\n      })\n    }\n\n    function hideChannelPinnedMessage(id, pinnedMessageID) {\n      var setKeys = {}\n      setKeys['pinned_hidden' + id] = AppMessagesIDsManager.getMessageLocalID(pinnedMessageID)\n      Storage.set(setKeys)\n      $rootScope.$broadcast('peer_pinned_message', -id)      \n    }\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      // console.log('on apiUpdate', update)\n      switch (update._) {\n        case 'updateChatParticipants':\n          var participants = update.participants\n          var chatFull = chatsFull[participants.id]\n          if (chatFull !== undefined) {\n            chatFull.participants = update.participants\n            $rootScope.$broadcast('chat_full_update', chatID)\n          }\n          break\n\n        case 'updateChatParticipantAdd':\n          var chatFull = chatsFull[update.chat_id]\n          if (chatFull !== undefined) {\n            var participants = chatFull.participants.participants || []\n            for (var i = 0, length = participants.length; i < length; i++) {\n              if (participants[i].user_id == update.user_id) {\n                return\n              }\n            }\n            participants.push({\n              _: 'chatParticipant',\n              user_id: update.user_id,\n              inviter_id: update.inviter_id,\n              date: tsNow(true)\n            })\n            chatFull.participants.version = update.version\n            $rootScope.$broadcast('chat_full_update', update.chat_id)\n          }\n          break\n\n        case 'updateChatParticipantDelete':\n          var chatFull = chatsFull[update.chat_id]\n          if (chatFull !== undefined) {\n            var participants = chatFull.participants.participants || []\n            for (var i = 0, length = participants.length; i < length; i++) {\n              if (participants[i].user_id == update.user_id) {\n                participants.splice(i, 1)\n                chatFull.participants.version = update.version\n                $rootScope.$broadcast('chat_full_update', update.chat_id)\n                return\n              }\n            }\n          }\n          break\n\n        case 'updateChannelPinnedMessage':\n          var channelID = update.channel_id\n          var fullChannel = chatsFull[channelID]\n          if (fullChannel !== undefined) {\n            fullChannel.pinned_msg_id = AppMessagesIDsManager.getFullMessageID(update.id, channelID)\n            $rootScope.$broadcast('peer_pinned_message', -channelID)\n          }\n          break\n\n      }\n    })\n\n    $rootScope.$on('chat_update', function (e, chatID) {\n      var fullChat = chatsFull[chatID]\n      var chat = AppChatsManager.getChat(chatID)\n      if (!chat.photo || !fullChat) {\n        return\n      }\n      var emptyPhoto = chat.photo._ == 'chatPhotoEmpty'\n      if (emptyPhoto != (fullChat.chat_photo._ == 'photoEmpty')) {\n        delete chatsFull[chatID]\n        $rootScope.$broadcast('chat_full_update', chatID)\n        return\n      }\n      if (emptyPhoto) {\n        return\n      }\n      var smallUserpic = chat.photo.photo_small\n      var smallPhotoSize = AppPhotosManager.choosePhotoSize(fullChat.chat_photo, 0, 0)\n      if (!angular.equals(smallUserpic, smallPhotoSize.location)) {\n        delete chatsFull[chatID]\n        $rootScope.$broadcast('chat_full_update', chatID)\n      }\n    })\n\n    return {\n      getPeerBots: getPeerBots,\n      getProfile: getProfile,\n      getChatInviteLink: getChatInviteLink,\n      getChatFull: getChatFull,\n      getChannelFull: getChannelFull,\n      getChannelParticipants: getChannelParticipants,\n      invalidateChannelParticipants: invalidateChannelParticipants,\n      getChannelPinnedMessage: getChannelPinnedMessage,\n      hideChannelPinnedMessage: hideChannelPinnedMessage\n    }\n  })\n\n  .service('AppPhotosManager', function ($modal, $window, $rootScope, MtpApiManager, MtpApiFileManager, AppUsersManager, FileManager) {\n    var photos = {}\n    var windowW = $(window).width()\n    var windowH = $(window).height()\n\n    function savePhoto (apiPhoto, context) {\n      if (context) {\n        angular.extend(apiPhoto, context)\n      }\n      photos[apiPhoto.id] = apiPhoto\n\n      angular.forEach(apiPhoto.sizes, function (photoSize) {\n        if (photoSize._ == 'photoCachedSize') {\n          MtpApiFileManager.saveSmallFile(photoSize.location, photoSize.bytes)\n\n          // Memory\n          photoSize.size = photoSize.bytes.length\n          delete photoSize.bytes\n          photoSize._ = 'photoSize'\n        }\n      })\n    }\n\n    function choosePhotoSize (photo, width, height) {\n      if (Config.Navigator.retina) {\n        width *= 2\n        height *= 2\n      }\n      var bestPhotoSize = {_: 'photoSizeEmpty'}\n      var bestDiff = 0xFFFFFF\n\n      angular.forEach(photo.sizes, function (photoSize) {\n        var diff = Math.abs(photoSize.w * photoSize.h - width * height)\n        if (diff < bestDiff) {\n          bestPhotoSize = photoSize\n          bestDiff = diff\n        }\n      })\n\n      // console.log('choosing', photo, width, height, bestPhotoSize)\n\n      return bestPhotoSize\n    }\n\n    function getUserPhotos (userID, maxID, limit) {\n      var inputUser = AppUsersManager.getUserInput(userID)\n      return MtpApiManager.invokeApi('photos.getUserPhotos', {\n        user_id: inputUser,\n        offset: 0,\n        limit: limit || 20,\n        max_id: maxID || 0\n      }).then(function (photosResult) {\n        AppUsersManager.saveApiUsers(photosResult.users)\n        var photoIDs = []\n        var context = {user_id: userID}\n        for (var i = 0; i < photosResult.photos.length; i++) {\n          savePhoto(photosResult.photos[i], context)\n          photoIDs.push(photosResult.photos[i].id)\n        }\n\n        return {\n          count: photosResult.count || photosResult.photos.length,\n          photos: photoIDs\n        }\n      })\n    }\n\n    function preloadPhoto (photoID) {\n      if (!photos[photoID]) {\n        return\n      }\n      var photo = photos[photoID]\n      var fullWidth = $(window).width() - (Config.Mobile ? 20 : 32)\n      var fullHeight = $($window).height() - (Config.Mobile ? 150 : 116)\n      if (fullWidth > 800) {\n        fullWidth -= 208\n      }\n      var fullPhotoSize = choosePhotoSize(photo, fullWidth, fullHeight)\n\n      if (fullPhotoSize && !fullPhotoSize.preloaded) {\n        fullPhotoSize.preloaded = true\n        if (fullPhotoSize.size) {\n          MtpApiFileManager.downloadFile(fullPhotoSize.location.dc_id, {\n            _: 'inputFileLocation',\n            volume_id: fullPhotoSize.location.volume_id,\n            local_id: fullPhotoSize.location.local_id,\n            secret: fullPhotoSize.location.secret\n          }, fullPhotoSize.size)\n        } else {\n          MtpApiFileManager.downloadSmallFile(fullPhotoSize.location)\n        }\n      }\n    }\n    $rootScope.preloadPhoto = preloadPhoto\n\n    function getPhoto (photoID) {\n      return photos[photoID] || {_: 'photoEmpty'}\n    }\n\n    function wrapForHistory (photoID, options) {\n      options = options || {}\n      var photo = angular.copy(photos[photoID]) || {_: 'photoEmpty'}\n      var width = options.website ? 64 : Math.min(windowW - 80, Config.Mobile ? 210 : 260)\n      var height = options.website ? 64 : Math.min(windowH - 100, Config.Mobile ? 210 : 260)\n      var thumbPhotoSize = choosePhotoSize(photo, width, height)\n      var thumb = {\n        placeholder: 'img/placeholders/PhotoThumbConversation.gif',\n        width: width,\n        height: height\n      }\n\n      if (options.website && Config.Mobile) {\n        width = 50\n        height = 50\n      }\n\n      // console.log('chosen photo size', photoID, thumbPhotoSize)\n      if (thumbPhotoSize && thumbPhotoSize._ != 'photoSizeEmpty') {\n        var dim = calcImageInBox(thumbPhotoSize.w, thumbPhotoSize.h, width, height)\n        thumb.width = dim.w\n        thumb.height = dim.h\n        thumb.location = thumbPhotoSize.location\n        thumb.size = thumbPhotoSize.size\n      } else {\n        thumb.width = 100\n        thumb.height = 100\n      }\n\n      photo.thumb = thumb\n\n      return photo\n    }\n\n    function wrapForFull (photoID) {\n      var photo = wrapForHistory(photoID)\n      var fullWidth = $(window).width() - (Config.Mobile ? 0 : 32)\n      var fullHeight = $($window).height() - (Config.Mobile ? 0 : 116)\n      if (!Config.Mobile && fullWidth > 800) {\n        fullWidth -= 208\n      }\n      var fullPhotoSize = choosePhotoSize(photo, fullWidth, fullHeight)\n      var full = {\n        placeholder: 'img/placeholders/PhotoThumbModal.gif'\n      }\n\n      full.width = fullWidth\n      full.height = fullHeight\n\n      if (fullPhotoSize && fullPhotoSize._ != 'photoSizeEmpty') {\n        var wh = calcImageInBox(fullPhotoSize.w, fullPhotoSize.h, fullWidth, fullHeight, true)\n        full.width = wh.w\n        full.height = wh.h\n\n        full.modalWidth = Math.max(full.width, Math.min(400, fullWidth))\n\n        full.location = fullPhotoSize.location\n        full.size = fullPhotoSize.size\n      }\n\n      photo.full = full\n\n      return photo\n    }\n\n    function openPhoto (photoID, list) {\n      if (!photoID || photoID === '0') {\n        return false\n      }\n\n      var scope = $rootScope.$new(true)\n\n      scope.photoID = photoID\n\n      var controller = 'PhotoModalController'\n      if (list && list.p > 0) {\n        controller = 'UserpicModalController'\n        scope.userID = list.p\n      }\n      else if (list && list.p < 0) {\n        controller = 'ChatpicModalController'\n        scope.chatID = -list.p\n      }\n      else if (list && list.m > 0) {\n        scope.messageID = list.m\n        if (list.w) {\n          scope.webpageID = list.w\n        }\n      }\n\n      var modalInstance = $modal.open({\n        templateUrl: templateUrl('photo_modal'),\n        windowTemplateUrl: templateUrl('media_modal_layout'),\n        controller: controller,\n        scope: scope,\n        windowClass: 'photo_modal_window'\n      })\n    }\n\n    function downloadPhoto (photoID) {\n      var photo = photos[photoID]\n      var ext = 'jpg'\n      var mimeType = 'image/jpeg'\n      var fileName = 'photo' + photoID + '.' + ext\n      var fullWidth = Math.max(screen.width || 0, $(window).width() - 36, 800)\n      var fullHeight = Math.max(screen.height || 0, $($window).height() - 150, 800)\n      var fullPhotoSize = choosePhotoSize(photo, fullWidth, fullHeight)\n      var inputFileLocation = {\n        _: 'inputFileLocation',\n        volume_id: fullPhotoSize.location.volume_id,\n        local_id: fullPhotoSize.location.local_id,\n        secret: fullPhotoSize.location.secret\n      }\n\n      FileManager.chooseSave(fileName, ext, mimeType).then(function (writableFileEntry) {\n        if (writableFileEntry) {\n          MtpApiFileManager.downloadFile(\n            fullPhotoSize.location.dc_id, inputFileLocation, fullPhotoSize.size, {\n              mime: mimeType,\n              toFileEntry: writableFileEntry\n            }).then(function () {\n            // console.log('file save done')\n          }, function (e) {\n            console.log('photo download failed', e)\n          })\n        }\n      }, function () {\n        var cachedBlob = MtpApiFileManager.getCachedFile(inputFileLocation)\n        if (cachedBlob) {\n          return FileManager.download(cachedBlob, mimeType, fileName)\n        }\n\n        MtpApiFileManager.downloadFile(\n          fullPhotoSize.location.dc_id, inputFileLocation, fullPhotoSize.size, {mime: mimeType}\n        ).then(function (blob) {\n          FileManager.download(blob, mimeType, fileName)\n        }, function (e) {\n          console.log('photo download failed', e)\n        })\n      })\n    }\n\n    $rootScope.openPhoto = openPhoto\n\n    return {\n      savePhoto: savePhoto,\n      preloadPhoto: preloadPhoto,\n      getUserPhotos: getUserPhotos,\n      getPhoto: getPhoto,\n      choosePhotoSize: choosePhotoSize,\n      wrapForHistory: wrapForHistory,\n      wrapForFull: wrapForFull,\n      openPhoto: openPhoto,\n      downloadPhoto: downloadPhoto\n    }\n  })\n\n  .service('AppWebPagesManager', function ($modal, $sce, $window, $rootScope, MtpApiManager, AppPhotosManager, AppDocsManager, RichTextProcessor) {\n    var webpages = {}\n    var pendingWebPages = {}\n\n    function saveWebPage (apiWebPage, messageID, mediaContext) {\n      if (apiWebPage.photo && apiWebPage.photo._ === 'photo') {\n        AppPhotosManager.savePhoto(apiWebPage.photo, mediaContext)\n      } else {\n        delete apiWebPage.photo\n      }\n      if (apiWebPage.document && apiWebPage.document._ === 'document') {\n        AppDocsManager.saveDoc(apiWebPage.document, mediaContext)\n      } else {\n        if (apiWebPage.type == 'document') {\n          delete apiWebPage.type\n        }\n        delete apiWebPage.document\n      }\n\n      var siteName = apiWebPage.site_name\n      var shortTitle = apiWebPage.title || apiWebPage.author || siteName || ''\n      if (siteName &&\n        shortTitle == siteName) {\n        delete apiWebPage.site_name\n      }\n      if (shortTitle.length > 100) {\n        shortTitle = shortTitle.substr(0, 80) + '...'\n      }\n      apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true})\n      var contextHashtag = ''\n      if (siteName == 'GitHub') {\n        var matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/)\n        if (matches) {\n          contextHashtag = matches[0] + '/issues/{1}'\n        }\n      }\n      // delete apiWebPage.description\n      var shortDescriptionText = (apiWebPage.description || '')\n      if (shortDescriptionText.length > 180) {\n        shortDescriptionText = shortDescriptionText.substr(0, 150).replace(/(\\n|\\s)+$/, '') + '...'\n      }\n      apiWebPage.rDescription = RichTextProcessor.wrapRichText(\n        shortDescriptionText, {\n          contextSite: siteName || 'external',\n          contextHashtag: contextHashtag\n        }\n      )\n\n      if (apiWebPage.type != 'photo' &&\n        apiWebPage.type != 'video' &&\n        apiWebPage.type != 'gif' &&\n        apiWebPage.type != 'document' &&\n        !apiWebPage.description &&\n        apiWebPage.photo) {\n        apiWebPage.type = 'photo'\n      }\n\n      if (messageID) {\n        if (pendingWebPages[apiWebPage.id] === undefined) {\n          pendingWebPages[apiWebPage.id] = {}\n        }\n        pendingWebPages[apiWebPage.id][messageID] = true\n        webpages[apiWebPage.id] = apiWebPage\n      }\n\n      if (webpages[apiWebPage.id] === undefined) {\n        webpages[apiWebPage.id] = apiWebPage\n      } else {\n        safeReplaceObject(webpages[apiWebPage.id], apiWebPage)\n      }\n\n      if (!messageID &&\n        pendingWebPages[apiWebPage.id] !== undefined) {\n        var msgs = []\n        angular.forEach(pendingWebPages[apiWebPage.id], function (t, msgID) {\n          msgs.push(msgID)\n        })\n        $rootScope.$broadcast('webpage_updated', {\n          id: apiWebPage.id,\n          msgs: msgs\n        })\n      }\n    }\n\n    function openEmbed (webpageID, messageID) {\n      var scope = $rootScope.$new(true)\n\n      scope.webpageID = webpageID\n      scope.messageID = messageID\n\n      $modal.open({\n        templateUrl: templateUrl('embed_modal'),\n        windowTemplateUrl: templateUrl('media_modal_layout'),\n        controller: 'EmbedModalController',\n        scope: scope,\n        windowClass: 'photo_modal_window'\n      })\n    }\n\n    function wrapForHistory (webPageID) {\n      var webPage = angular.copy(webpages[webPageID]) || {_: 'webPageEmpty'}\n\n      if (webPage.photo && webPage.photo.id) {\n        webPage.photo = AppPhotosManager.wrapForHistory(webPage.photo.id, {website: webPage.type != 'photo' && webPage.type != 'video'})\n      }\n      if (webPage.document && webPage.document.id) {\n        webPage.document = AppDocsManager.wrapForHistory(webPage.document.id)\n      }\n\n      return webPage\n    }\n\n    function wrapForFull (webPageID) {\n      var webPage = wrapForHistory(webPageID)\n\n      if (!webPage.embed_url) {\n        return webPage\n      }\n\n      var fullWidth = $(window).width() - (Config.Mobile ? 0 : 10)\n      var fullHeight = $($window).height() - (Config.Mobile ? 92 : 150)\n\n      if (!Config.Mobile && fullWidth > 800) {\n        fullWidth -= 208\n      }\n\n      var full = {\n        width: fullWidth,\n        height: fullHeight\n      }\n\n      if (!webPage.embed_width || !webPage.embed_height) {\n        full.height = full.width = Math.min(fullWidth, fullHeight)\n      } else {\n        var wh = calcImageInBox(webPage.embed_width, webPage.embed_height, fullWidth, fullHeight)\n        full.width = wh.w\n        full.height = wh.h\n      }\n\n      var embedTag = Config.Modes.chrome_packed ? 'webview' : 'iframe'\n\n      var embedType = webPage.embed_type != 'iframe' ? webPage.embed_type || 'text/html' : 'text/html'\n\n      var embedHtml = '<' + embedTag + ' src=\"' + encodeEntities(webPage.embed_url) + '\" type=\"' + encodeEntities(embedType) + '\" frameborder=\"0\" border=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen width=\"' + full.width + '\" height=\"' + full.height + '\" style=\"width: ' + full.width + 'px; height: ' + full.height + 'px;\"></' + embedTag + '>'\n\n      full.html = $sce.trustAs('html', embedHtml)\n\n      webPage.full = full\n\n      return webPage\n    }\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      switch (update._) {\n        case 'updateWebPage':\n          saveWebPage(update.webpage)\n          break\n      }\n    })\n\n    return {\n      saveWebPage: saveWebPage,\n      openEmbed: openEmbed,\n      wrapForFull: wrapForFull,\n      wrapForHistory: wrapForHistory\n    }\n  })\n\n  .service('AppGamesManager', function ($modal, $sce, $window, $rootScope, MtpApiManager, AppPhotosManager, AppDocsManager, RichTextProcessor) {\n    var games = {}\n\n    function saveGame (apiGame, messageID, mediaContext) {\n      if (apiGame.photo && apiGame.photo._ === 'photo') {\n        AppPhotosManager.savePhoto(apiGame.photo, mediaContext)\n      } else {\n        delete apiGame.photo\n      }\n      if (apiGame.document && apiGame.document._ === 'document') {\n        AppDocsManager.saveDoc(apiGame.document, mediaContext)\n      } else {\n        delete apiGame.document\n      }\n\n      apiGame.rTitle = RichTextProcessor.wrapRichText(apiGame.title, {noLinks: true, noLinebreaks: true})\n      apiGame.rDescription = RichTextProcessor.wrapRichText(\n        apiGame.description || '', {}\n      )\n\n      if (games[apiGame.id] === undefined) {\n        games[apiGame.id] = apiGame\n      } else {\n        safeReplaceObject(games[apiGame.id], apiGame)\n      }\n    }\n\n    function openGame (gameID, messageID, embedUrl) {\n      var scope = $rootScope.$new(true)\n\n      scope.gameID = gameID\n      scope.messageID = messageID\n      scope.embedUrl = embedUrl\n\n      $modal.open({\n        templateUrl: templateUrl('game_modal'),\n        windowTemplateUrl: templateUrl('media_modal_layout'),\n        controller: 'GameModalController',\n        scope: scope,\n        windowClass: 'photo_modal_window mobile_modal'\n      })\n    }\n\n    function wrapForHistory (gameID) {\n      var game = angular.copy(games[gameID]) || {_: 'gameEmpty'}\n\n      if (game.photo && game.photo.id) {\n        game.photo = AppPhotosManager.wrapForHistory(game.photo.id)\n      }\n      if (game.document && game.document.id) {\n        game.document = AppDocsManager.wrapForHistory(game.document.id)\n      }\n\n      return game\n    }\n\n    function wrapForFull (gameID, msgID, embedUrl) {\n      var game = wrapForHistory(gameID)\n\n      var fullWidth = $(window).width() - (Config.Mobile ? 0 : 10)\n      var fullHeight = $($window).height() - (Config.Mobile ? 51 : 150)\n\n      if (!Config.Mobile && fullWidth > 800) {\n        fullWidth -= 208\n      }\n\n      var full = {\n        width: fullWidth,\n        height: fullHeight\n      }\n\n      var embedTag = Config.Modes.chrome_packed ? 'webview' : 'iframe'\n\n      var embedType = 'text/html'\n\n      var embedHtml = '<' + embedTag + ' src=\"' + encodeEntities(embedUrl) + '\" type=\"' + encodeEntities(embedType) + '\" frameborder=\"0\" border=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen width=\"' + full.width + '\" height=\"' + full.height + '\" style=\"width: ' + full.width + 'px; height: ' + full.height + 'px;\" sandbox=\"allow-scripts allow-same-origin\"></' + embedTag + '>'\n\n      full.html = $sce.trustAs('html', embedHtml)\n\n      game.full = full\n\n      return game\n    }\n\n    return {\n      saveGame: saveGame,\n      openGame: openGame,\n      wrapForFull: wrapForFull,\n      wrapForHistory: wrapForHistory\n    }\n  })\n\n  .service('AppDocsManager', function ($sce, $rootScope, $modal, $window, $q, $timeout, RichTextProcessor, MtpApiFileManager, FileManager, qSync) {\n    var docs = {}\n    var docsForHistory = {}\n    var windowW = $(window).width()\n    var windowH = $(window).height()\n\n    function saveDoc (apiDoc, context) {\n      docs[apiDoc.id] = apiDoc\n\n      if (context) {\n        angular.extend(apiDoc, context)\n      }\n      if (apiDoc.thumb && apiDoc.thumb._ == 'photoCachedSize') {\n        MtpApiFileManager.saveSmallFile(apiDoc.thumb.location, apiDoc.thumb.bytes)\n\n        // Memory\n        apiDoc.thumb.size = apiDoc.thumb.bytes.length\n        delete apiDoc.thumb.bytes\n        apiDoc.thumb._ = 'photoSize'\n      }\n      if (apiDoc.thumb && apiDoc.thumb._ == 'photoSizeEmpty') {\n        delete apiDoc.thumb\n      }\n      angular.forEach(apiDoc.attributes, function (attribute) {\n        switch (attribute._) {\n          case 'documentAttributeFilename':\n            apiDoc.file_name = attribute.file_name\n            break\n          case 'documentAttributeAudio':\n            apiDoc.duration = attribute.duration\n            apiDoc.audioTitle = attribute.title\n            apiDoc.audioPerformer = attribute.performer\n            apiDoc.type = attribute.pFlags.voice ? 'voice' : 'audio'\n            break\n          case 'documentAttributeVideo':\n            apiDoc.duration = attribute.duration\n            apiDoc.w = attribute.w\n            apiDoc.h = attribute.h\n            if (apiDoc.thumb &&\n                attribute.pFlags.round_message) {\n              apiDoc.type = 'round'\n            }\n            else if (apiDoc.thumb) {\n              apiDoc.type = 'video'\n            }\n            break\n          case 'documentAttributeSticker':\n            apiDoc.sticker = true\n            if (attribute.alt !== undefined) {\n              apiDoc.stickerEmojiRaw = attribute.alt\n              apiDoc.stickerEmoji = RichTextProcessor.wrapRichText(apiDoc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true})\n            }\n            if (attribute.stickerset) {\n              if (attribute.stickerset._ == 'inputStickerSetEmpty') {\n                delete attribute.stickerset\n              }\n              else if (attribute.stickerset._ == 'inputStickerSetID') {\n                apiDoc.stickerSetInput = attribute.stickerset\n              }\n            }\n            if (apiDoc.thumb && apiDoc.mime_type == 'image/webp') {\n              apiDoc.type = 'sticker'\n            }\n            break\n          case 'documentAttributeImageSize':\n            apiDoc.w = attribute.w\n            apiDoc.h = attribute.h\n            break\n          case 'documentAttributeAnimated':\n            if ((apiDoc.mime_type == 'image/gif' || apiDoc.mime_type == 'video/mp4') &&\n              apiDoc.thumb) {\n              apiDoc.type = 'gif'\n            }\n            apiDoc.animated = true\n            break\n        }\n      })\n\n      if (!apiDoc.mime_type) {\n        switch (apiDoc.type) {\n          case 'gif':\n            apiDoc.mime_type = 'video/mp4'\n            break\n          case 'video':\n          case 'round':\n            apiDoc.mime_type = 'video/mp4'\n            break\n          case 'sticker':\n            apiDoc.mime_type = 'image/webp'\n            break\n          case 'audio':\n            apiDoc.mime_type = 'audio/mpeg'\n            break\n          case 'voice':\n            apiDoc.mime_type = 'audio/ogg'\n            break\n          default:\n            apiDoc.mime_type = 'application/octet-stream'\n            break\n        }\n      }\n\n      if (!apiDoc.file_name) {\n        apiDoc.file_name = ''\n      }\n\n      if (apiDoc._ == 'documentEmpty') {\n        apiDoc.size = 0\n      }\n    }\n\n    function getDoc (docID) {\n      return docs[docID] || {_: 'documentEmpty'}\n    }\n\n    function hasDoc (docID) {\n      return docs[docID] !== undefined\n    }\n\n    function getFileName (doc) {\n      if (doc.file_name) {\n        return doc.file_name\n      }\n      var fileExt = '.' + doc.mime_type.split('/')[1]\n      if (fileExt == '.octet-stream') {\n        fileExt = ''\n      }\n      return 't_' + (doc.type || 'file') + doc.id + fileExt\n    }\n\n    function wrapForHistory (docID) {\n      if (docsForHistory[docID] !== undefined) {\n        return docsForHistory[docID]\n      }\n\n      var doc = angular.copy(docs[docID])\n      var thumbPhotoSize = doc.thumb\n      var inlineImage = false,\n        boxWidth\n      var boxHeight, thumb\n      var dim\n\n      switch (doc.type) {\n        case 'video':\n          boxWidth = Math.min(windowW - 80, Config.Mobile ? 210 : 150),\n          boxHeight = Math.min(windowH - 100, Config.Mobile ? 210 : 150)\n          break\n\n        case 'sticker':\n          inlineImage = true\n          boxWidth = Math.min(windowW - 80, Config.Mobile ? 128 : 192)\n          boxHeight = Math.min(windowH - 100, Config.Mobile ? 128 : 192)\n          break\n\n        case 'gif':\n          inlineImage = true\n          boxWidth = Math.min(windowW - 80, Config.Mobile ? 210 : 260)\n          boxHeight = Math.min(windowH - 100, Config.Mobile ? 210 : 260)\n          break\n\n        case 'round':\n          inlineImage = true\n          boxWidth = Math.min(windowW - 80, 200)\n          boxHeight = Math.min(windowH - 100, 200)\n          break\n\n        default:\n          boxWidth = boxHeight = 100\n      }\n\n      if (inlineImage && doc.w && doc.h) {\n        dim = calcImageInBox(doc.w, doc.h, boxWidth, boxHeight)\n      }\n      else if (thumbPhotoSize) {\n        dim = calcImageInBox(thumbPhotoSize.w, thumbPhotoSize.h, boxWidth, boxHeight)\n      }\n\n      if (dim) {\n        thumb = {\n          width: dim.w,\n          height: dim.h\n        }\n        if (thumbPhotoSize) {\n          thumb.location = thumbPhotoSize.location\n          thumb.size = thumbPhotoSize.size\n        }\n      } else {\n        thumb = false\n      }\n      doc.thumb = thumb\n\n      doc.withPreview = !Config.Mobile && doc.mime_type.match(/^image\\/(gif|png|jpeg|jpg|bmp|tiff)/) ? 1 : 0\n\n      return docsForHistory[docID] = doc\n    }\n\n    function updateDocDownloaded (docID) {\n      var doc = docs[docID]\n      var historyDoc = docsForHistory[docID] || doc || {}\n      var inputFileLocation = {\n        _: 'inputDocumentFileLocation',\n        id: docID,\n        access_hash: doc.access_hash,\n        version: doc.version,\n        file_name: getFileName(doc)\n      }\n\n      if (historyDoc.downloaded === undefined) {\n        MtpApiFileManager.getDownloadedFile(inputFileLocation, doc.size).then(function () {\n          historyDoc.downloaded = true\n        }, function () {\n          historyDoc.downloaded = false\n        })\n      }\n    }\n\n    function downloadDoc (docID, toFileEntry) {\n      var doc = docs[docID]\n      var historyDoc = docsForHistory[docID] || doc || {}\n      var inputFileLocation = {\n        _: 'inputDocumentFileLocation',\n        id: docID,\n        access_hash: doc.access_hash,\n        version: doc.version,\n        file_name: getFileName(doc)\n      }\n\n      if (doc._ == 'documentEmpty') {\n        return $q.reject()\n      }\n\n      if (historyDoc.downloaded && !toFileEntry) {\n        var cachedBlob = MtpApiFileManager.getCachedFile(inputFileLocation)\n        if (cachedBlob) {\n          return qSync.when(cachedBlob)\n        }\n      }\n\n      historyDoc.progress = {enabled: !historyDoc.downloaded, percent: 1, total: doc.size}\n\n      var downloadPromise = MtpApiFileManager.downloadFile(doc.dc_id, inputFileLocation, doc.size, {\n        mime: doc.mime_type || 'application/octet-stream',\n        toFileEntry: toFileEntry\n      })\n\n      downloadPromise.then(function (blob) {\n        if (blob) {\n          FileManager.getFileCorrectUrl(blob, doc.mime_type).then(function (url) {\n            var trustedUrl = $sce.trustAsResourceUrl(url)\n            historyDoc.url = trustedUrl\n            doc.url = trustedUrl\n          })\n          historyDoc.downloaded = true\n        }\n        historyDoc.progress.percent = 100\n        $timeout(function () {\n          delete historyDoc.progress\n        })\n      // console.log('file save done')\n      }, function (e) {\n        console.log('document download failed', e)\n        historyDoc.progress.enabled = false\n      }, function (progress) {\n        console.log('dl progress', progress)\n        historyDoc.progress.enabled = true\n        historyDoc.progress.done = progress.done\n        historyDoc.progress.percent = Math.max(1, Math.floor(100 * progress.done / progress.total))\n        $rootScope.$broadcast('history_update')\n      })\n\n      historyDoc.progress.cancel = downloadPromise.cancel\n\n      return downloadPromise\n    }\n\n    function openDoc (docID, messageID) {\n      var scope = $rootScope.$new(true)\n      scope.docID = docID\n      scope.messageID = messageID\n\n      var modalInstance = $modal.open({\n        templateUrl: templateUrl('document_modal'),\n        windowTemplateUrl: templateUrl('media_modal_layout'),\n        controller: 'DocumentModalController',\n        scope: scope,\n        windowClass: 'document_modal_window'\n      })\n    }\n\n    function saveDocFile (docID) {\n      var doc = docs[docID]\n      var historyDoc = docsForHistory[docID] || doc || {}\n      var mimeType = doc.mime_type\n      var fileName = getFileName(doc)\n      var ext = (fileName.split('.', 2) || [])[1] || ''\n\n      FileManager.chooseSave(getFileName(doc), ext, doc.mime_type).then(function (writableFileEntry) {\n        if (writableFileEntry) {\n          downloadDoc(docID, writableFileEntry)\n        }\n      }, function () {\n        downloadDoc(docID).then(function (blob) {\n          FileManager.download(blob, doc.mime_type, fileName)\n        })\n      })\n    }\n\n    function wrapVideoForFull (docID) {\n      var doc = wrapForHistory(docID)\n      var fullWidth = Math.min($(window).width() - (Config.Mobile ? 0 : 60), 542)\n      var fullHeight = $(window).height() - (Config.Mobile ? 92 : 150)\n      var full = {\n        placeholder: 'img/placeholders/docThumbModal.gif',\n        width: fullWidth,\n        height: fullHeight\n      }\n\n      if (!doc.w || !doc.h) {\n        full.height = full.width = Math.min(fullWidth, fullHeight)\n      } else {\n        var dim = calcImageInBox(doc.w, doc.h, fullWidth, fullHeight)\n        full.width = dim.w\n        full.height = dim.h\n      }\n\n      doc.full = full\n      doc.fullThumb = angular.copy(doc.thumb)\n      doc.fullThumb.width = full.width\n      doc.fullThumb.height = full.height\n\n      return doc\n    }\n\n    function openVideo (docID, messageID) {\n      var scope = $rootScope.$new(true)\n      scope.docID = docID\n      scope.messageID = messageID\n\n      return $modal.open({\n        templateUrl: templateUrl('video_modal'),\n        windowTemplateUrl: templateUrl('media_modal_layout'),\n        controller: 'VideoModalController',\n        scope: scope,\n        windowClass: 'video_modal_window'\n      })\n    }\n\n    return {\n      saveDoc: saveDoc,\n      getDoc: getDoc,\n      hasDoc: hasDoc,\n      wrapForHistory: wrapForHistory,\n      wrapVideoForFull: wrapVideoForFull,\n      updateDocDownloaded: updateDocDownloaded,\n      downloadDoc: downloadDoc,\n      openDoc: openDoc,\n      openVideo: openVideo,\n      saveDocFile: saveDocFile\n    }\n  })\n\n  .service('AppStickersManager', function ($q, $rootScope, $modal, _, FileManager, MtpApiManager, AppDocsManager, Storage, ApiUpdatesManager) {\n    var started = false\n    var applied = false\n    var currentStickerSets = []\n    var emojiIndex = {}\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      if (update._ != 'updateStickerSets' &&\n        update._ != 'updateNewStickerSet' &&\n        update._ != 'updateDelStickerSet' &&\n        update._ != 'updateStickerSetsOrder') {\n        return false\n      }\n\n      return Storage.get('all_stickers').then(function (stickers) {\n        if (!stickers ||\n            stickers.layer != Config.Schema.API.layer) {\n          $rootScope.$broadcast('stickers_changed')\n        }\n        switch (update._) {\n          case 'updateNewStickerSet':\n            var fullSet = update.stickerset\n            var set = fullSet.set\n            if (set.pFlags.masks) {\n              return false\n            }\n            var pos = false\n            for (var i = 0, len = stickers.sets.length; i < len; i++) {\n              if (stickers.sets[i].id == set.id) {\n                pos = i\n                break\n              }\n            }\n            if (pos !== false) {\n              stickers.sets.splice(pos, 1)\n            }\n            set.pFlags.installed = true\n            stickers.sets.unshift(set)\n            stickers.fullSets[set.id] = fullSet\n            indexStickerSetEmoticons(fullSet)\n            break\n\n          case 'updateDelStickerSet':\n            var set\n            for (var i = 0, len = stickers.sets.length; i < len; i++) {\n              set = stickers.sets[i]\n              if (set.id == update.id) {\n                set.pFlags.installed = false\n                stickers.sets.splice(i, 1)\n                break\n              }\n            }\n            delete stickers.fullSets[update.id]\n            break\n\n          case 'updateStickerSetsOrder':\n            if (update.pFlags.masks) {\n              return\n            }\n            var order = update.order\n            stickers.sets.sort(function (a, b) {\n              return order.indexOf(a.id) - order.indexOf(b.id)\n            })\n            break\n        }\n        stickers.hash = getStickerSetsHash(stickers.sets)\n        stickers.date = 0\n        Storage.set({all_stickers: stickers}).then(function () {\n          $rootScope.$broadcast('stickers_changed')\n        })\n      })\n    })\n\n    return {\n      start: start,\n      getStickers: getStickers,\n      openStickersetLink: openStickersetLink,\n      openStickerset: openStickerset,\n      installStickerset: installStickerset,\n      pushPopularSticker: pushPopularSticker,\n      searchStickers: searchStickers,\n      getStickerset: getStickerset\n    }\n\n    function start () {\n      if (!started) {\n        started = true\n        setTimeout(getStickers, 1000)\n      }\n    }\n\n    function getStickers (force) {\n      return Storage.get('all_stickers').then(function (stickers) {\n        var layer = Config.Schema.API.layer\n        if (stickers.layer != layer ||\n            stickers.emojiIndex === undefined) {\n          stickers = false\n        }\n        if (stickers && stickers.date > tsNow(true) && !force) {\n          emojiIndex = stickers.emojiIndex\n          return processRawStickers(stickers)\n        }\n        return MtpApiManager.invokeApi('messages.getAllStickers', {\n          hash: stickers && stickers.hash || ''\n        }).then(function (newStickers) {\n          var notModified = newStickers._ == 'messages.allStickersNotModified'\n          if (notModified) {\n            newStickers = stickers\n          }\n          newStickers.date = tsNow(true) + 3600\n          newStickers.layer = layer\n          delete newStickers._\n\n          if (notModified) {\n            Storage.set({all_stickers: newStickers})\n            emojiIndex = newStickers.emojiIndex\n            return processRawStickers(newStickers)\n          }\n\n          return getStickerSets(newStickers, stickers && stickers.fullSets).then(function () {\n            Storage.set({all_stickers: newStickers})\n            return processRawStickers(newStickers)\n          })\n        })\n      })\n    }\n\n    function processRawStickers (stickers) {\n      if (applied !== stickers.hash) {\n        applied = stickers.hash\n        var i\n        var j, len1\n        var len2, doc\n        var set, docIDs\n        var documents\n\n        currentStickerSets = []\n        len1 = stickers.sets.length\n        for (i = 0; i < len1; i++) {\n          set = stickers.sets[i]\n          if (set.pFlags.disabled) {\n            continue\n          }\n          documents = stickers.fullSets[set.id].documents\n          len2 = documents.length\n          docIDs = []\n          for (j = 0; j < len2; j++) {\n            doc = documents[j]\n            AppDocsManager.saveDoc(doc)\n            docIDs.push(doc.id)\n          }\n          set.docIDs = docIDs\n          currentStickerSets.push(set)\n        }\n      }\n\n      return getPopularStickers().then(function (popularStickers) {\n        var resultStickersets = currentStickerSets\n        if (popularStickers.length) {\n          resultStickersets = currentStickerSets.slice()\n          var docIDs = []\n          var i\n          var len\n          for (i = 0, len = popularStickers.length; i < len; i++) {\n            docIDs.push(popularStickers[i].id)\n          }\n          resultStickersets.unshift({\n            id: 0,\n            title: _('im_stickers_tab_recent_raw'),\n            short_name: '',\n            docIDs: docIDs\n          })\n        }\n        return resultStickersets\n      })\n    }\n\n    function indexStickerSetEmoticons(fullSet) {\n      angular.forEach(fullSet.packs, function (pack) {\n        var emoji = pack.emoticon\n        var emojiCode = false\n        while (emoji.length) {\n          emojiCode = EmojiHelper.emojiMap[emoji]\n          if (emojiCode !== undefined) {\n            break\n          }\n          emoji = emoji.substr(0, -1)\n        }\n        // console.warn('index', fullSet, pack, emojiCode)\n        if (emojiCode === undefined) {\n          return\n        }\n        var stickersList = emojiIndex[emojiCode]\n        if (stickersList === undefined) {\n          emojiIndex[emojiCode] = stickersList = []\n        }\n        angular.forEach(pack.documents, function (docID) {\n          if (stickersList.indexOf(docID) === -1) {\n            stickersList.push(docID)\n          }\n        })\n      })\n    }\n\n    function searchStickers(emojiCode) {\n      return getPopularStickers().then(function () {\n        // console.warn('search', emojiCode, emojiIndex, emojiIndex[emojiCode])\n        var stickersList = emojiIndex[emojiCode]\n        var result = []\n        if (stickersList === undefined) {\n          return result\n        }\n        var setIDs = []\n        angular.forEach(currentStickerSets, function (set) {\n          setIDs.push(set.id)\n        })\n        angular.forEach(stickersList, function (docID) {\n          var doc = AppDocsManager.getDoc(docID)\n          if (!doc || !doc.stickerSetInput) {\n            return\n          }\n          var setID = doc.stickerSetInput.id\n          if (setIDs.indexOf(setID) == -1) {\n            return\n          }\n          result.push(doc)\n        })\n        result.sort(function (doc1, doc2) {\n          return setIDs.indexOf(doc1.stickerSetInput.id) - setIDs.indexOf(doc2.stickerSetInput.id)\n        })\n        return result\n      })\n\n    }\n\n    function getStickerSets (allStickers, prevCachedSets) {\n      var promises = []\n      var cachedSets = prevCachedSets || allStickers.fullSets || {}\n      allStickers.fullSets = {}\n      emojiIndex = allStickers.emojiIndex = {}\n      angular.forEach(allStickers.sets, function (shortSet) {\n        var fullSet = cachedSets[shortSet.id]\n        if (fullSet && fullSet.set.hash == shortSet.hash) {\n          allStickers.fullSets[shortSet.id] = fullSet\n          indexStickerSetEmoticons(fullSet)\n        } else {\n          var promise = MtpApiManager.invokeApi('messages.getStickerSet', {\n            stickerset: {\n              _: 'inputStickerSetID',\n              id: shortSet.id,\n              access_hash: shortSet.access_hash\n            }\n          }).then(function (fullSet) {\n            allStickers.fullSets[shortSet.id] = fullSet\n            indexStickerSetEmoticons(fullSet)\n          })\n          promises.push(promise)\n        }\n      })\n      return $q.all(promises)\n    }\n\n    function getPopularStickers () {\n      return Storage.get('stickers_popular').then(function (popStickers) {\n        var result = []\n        var i, len\n        var docID\n        if (popStickers && popStickers.length) {\n          for (i = 0, len = popStickers.length; i < len; i++) {\n            docID = popStickers[i][0]\n            if (AppDocsManager.hasDoc(docID)) {\n              result.push({id: docID, rate: popStickers[i][1]})\n            }\n          }\n        }\n        return result\n      })\n    }\n\n    function pushPopularSticker (id) {\n      getPopularStickers().then(function (popularStickers) {\n        var exists = false\n        var count = popularStickers.length\n        var result = []\n        for (var i = 0; i < count; i++) {\n          if (popularStickers[i].id == id) {\n            exists = true\n            popularStickers[i].rate++\n          }\n          result.push([popularStickers[i].id, popularStickers[i].rate])\n        }\n        if (exists) {\n          result.sort(function (a, b) {\n            return b[1] - a[1]\n          })\n        } else {\n          if (result.length > 15) {\n            result = result.slice(0, 15)\n          }\n          result.push([id, 1])\n        }\n        ConfigStorage.set({stickers_popular: result})\n      })\n    }\n\n    function getStickerset (inputStickerset) {\n      return MtpApiManager.invokeApi('messages.getStickerSet', {\n        stickerset: inputStickerset\n      }).then(function (result) {\n        for (var i = 0; i < result.documents.length; i++) {\n          AppDocsManager.saveDoc(result.documents[i])\n        }\n        return result\n      })\n    }\n\n    function installStickerset (fullSet, uninstall) {\n      var method = uninstall\n        ? 'messages.uninstallStickerSet'\n        : 'messages.installStickerSet'\n      var inputStickerset = {\n        _: 'inputStickerSetID',\n        id: fullSet.set.id,\n        access_hash: fullSet.set.access_hash\n      }\n      return MtpApiManager.invokeApi(method, {\n        stickerset: inputStickerset,\n        disabled: false\n      }).then(function (result) {\n        var update\n        if (uninstall) {\n          update = {_: 'updateDelStickerSet', id: fullSet.set.id}\n        } else {\n          update = {_: 'updateNewStickerSet', stickerset: fullSet}\n        }\n        ApiUpdatesManager.processUpdateMessage({\n          _: 'updateShort',\n          update: update\n        })\n      })\n    }\n\n    function openStickersetLink (shortName) {\n      return openStickerset({\n        _: 'inputStickerSetShortName',\n        short_name: shortName\n      })\n    }\n\n    function openStickerset (inputStickerset) {\n      var scope = $rootScope.$new(true)\n      scope.inputStickerset = inputStickerset\n      var modal = $modal.open({\n        templateUrl: templateUrl('stickerset_modal'),\n        controller: 'StickersetModalController',\n        scope: scope,\n        windowClass: 'stickerset_modal_window mobile_modal'\n      })\n    }\n\n    function getStickerSetsHash (stickerSets) {\n      var acc = 0\n      var set\n      for (var i = 0; i < stickerSets.length; i++) {\n        set = stickerSets[i]\n        if (set.pFlags.disabled || !set.pFlags.installed) {\n          continue\n        }\n        acc = ((acc * 20261) + 0x80000000 + set.hash) % 0x80000000\n      }\n      return acc\n    }\n  })\n\n  .service('AppInlineBotsManager', function (qSync, $q, $rootScope, toaster, Storage, ErrorService, MtpApiManager, AppMessagesManager, AppMessagesIDsManager, AppDocsManager, AppPhotosManager, AppGamesManager, RichTextProcessor, AppUsersManager, AppPeersManager, LocationParamsService, PeersSelectService, GeoLocationManager) {\n    var inlineResults = {}\n\n    return {\n      resolveInlineMention: resolveInlineMention,\n      getPopularBots: getPopularBots,\n      sendInlineResult: sendInlineResult,\n      getInlineResults: getInlineResults,\n      regroupWrappedResults: regroupWrappedResults,\n      switchToPM: switchToPM,\n      checkSwitchReturn: checkSwitchReturn,\n      switchInlineButtonClick: switchInlineButtonClick,\n      callbackButtonClick: callbackButtonClick,\n      gameButtonClick: gameButtonClick\n    }\n\n    function getPopularBots () {\n      return Storage.get('inline_bots_popular').then(function (bots) {\n        var result = []\n        var i, len\n        var userID\n        if (bots && bots.length) {\n          var now = tsNow(true)\n          for (i = 0, len = bots.length; i < len; i++) {\n            if ((now - bots[i][3]) > 14 * 86400) {\n              continue\n            }\n            userID = bots[i][0]\n            if (!AppUsersManager.hasUser(userID)) {\n              AppUsersManager.saveApiUser(bots[i][1])\n            }\n            result.push({id: userID, rate: bots[i][2], date: bots[i][3]})\n          }\n        }\n        return result\n      })\n    }\n\n    function pushPopularBot (id) {\n      getPopularBots().then(function (bots) {\n        var exists = false\n        var count = bots.length\n        var result = []\n        for (var i = 0; i < count; i++) {\n          if (bots[i].id == id) {\n            exists = true\n            bots[i].rate++\n            bots[i].date = tsNow(true)\n          }\n          var user = AppUsersManager.getUser(bots[i].id)\n          result.push([bots[i].id, user, bots[i].rate, bots[i].date])\n        }\n        if (exists) {\n          result.sort(function (a, b) {\n            return b[2] - a[2]\n          })\n        } else {\n          if (result.length > 15) {\n            result = result.slice(0, 15)\n          }\n          result.push([id, AppUsersManager.getUser(id), 1, tsNow(true)])\n        }\n        ConfigStorage.set({inline_bots_popular: result})\n\n        $rootScope.$broadcast('inline_bots_popular')\n      })\n    }\n\n    function resolveInlineMention (username) {\n      return AppPeersManager.resolveUsername(username).then(function (peerID) {\n        if (peerID > 0) {\n          var bot = AppUsersManager.getUser(peerID)\n          if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n            var resolvedBot = {\n              username: username,\n              id: peerID,\n              placeholder: bot.bot_inline_placeholder\n            }\n            if (bot.pFlags.bot_inline_geo &&\n              GeoLocationManager.isAvailable()) {\n              return checkGeoLocationAccess(peerID).then(function () {\n                return GeoLocationManager.getPosition().then(function (coords) {\n                  resolvedBot.geo = coords\n                  return qSync.when(resolvedBot)\n                })\n              })['catch'](function () {\n                return qSync.when(resolvedBot)\n              })\n            }\n            return qSync.when(resolvedBot)\n          }\n        }\n        return $q.reject()\n      }, function (error) {\n        error.handled = true\n        return $q.reject(error)\n      })\n    }\n\n    function getInlineResults (peerID, botID, query, geo, offset) {\n      return MtpApiManager.invokeApi('messages.getInlineBotResults', {\n        flags: 0 | (geo ? 1 : 0),\n        bot: AppUsersManager.getUserInput(botID),\n        peer: AppPeersManager.getInputPeerByID(peerID),\n        query: query,\n        geo_point: geo && {_: 'inputGeoPoint', lat: geo['lat'], long: geo['long']},\n        offset: offset\n      }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (botResults) {\n        var queryID = botResults.query_id\n        delete botResults._\n        delete botResults.flags\n        delete botResults.query_id\n\n        if (botResults.switch_pm) {\n          botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true})\n        }\n\n        angular.forEach(botResults.results, function (result) {\n          var qID = queryID + '_' + result.id\n          result.qID = qID\n          result.botID = botID\n\n          result.rTitle = RichTextProcessor.wrapRichText(result.title, {noLinebreaks: true, noLinks: true})\n          result.rDescription = RichTextProcessor.wrapRichText(result.description, {noLinebreaks: true, noLinks: true})\n          result.initials = (result.url || result.title || result.type || '').substr(0, 1)\n\n          if (result.document) {\n            AppDocsManager.saveDoc(result.document)\n          }\n          if (result.photo) {\n            AppPhotosManager.savePhoto(result.photo)\n          }\n\n          inlineResults[qID] = result\n        })\n        return botResults\n      })\n    }\n\n    function regroupWrappedResults (results, rowW, rowH) {\n      if (!results ||\n          !results[0] ||\n          ['photo', 'gif', 'sticker'].indexOf(results[0].type) == -1) {\n        return\n      }\n      var ratios = []\n      angular.forEach(results, function (result) {\n        var w\n        var h, doc\n        var photo\n        if (result._ == 'botInlineMediaResult') {\n          if (doc = result.document) {\n            w = result.document.w\n            h = result.document.h\n          }\n          else if (photo = result.photo) {\n            var photoSize = (photo.sizes || [])[0]\n            w = photoSize && photoSize.w\n            h = photoSize && photoSize.h\n          }\n        }else {\n          w = result.w\n          h = result.h\n        }\n        if (!w || !h) {\n          w = h = 1\n        }\n        ratios.push(w / h)\n      })\n\n      var rows = []\n      var curCnt = 0\n      var curW = 0\n      angular.forEach(ratios, function (ratio) {\n        var w = ratio * rowH\n        curW += w\n        if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n          curCnt++\n        } else {\n          rows.push(curCnt)\n          curCnt = 1\n          curW = w\n        }\n      })\n      if (curCnt) {\n        rows.push(curCnt)\n      }\n\n      var i = 0\n      var thumbs = []\n      var lastRowI = rows.length - 1\n      angular.forEach(rows, function (rowCnt, rowI) {\n        var lastRow = rowI == lastRowI\n        var curRatios = ratios.slice(i, i + rowCnt)\n        var sumRatios = 0\n        angular.forEach(curRatios, function (ratio) {\n          sumRatios += ratio\n        })\n        angular.forEach(curRatios, function (ratio, j) {\n          var thumbH = rowH\n          var thumbW = rowW * ratio / sumRatios\n          var realW = thumbH * ratio\n          if (lastRow && thumbW > realW) {\n            thumbW = realW\n          }\n          var result = results[i + j]\n          result.thumbW = Math.floor(thumbW) - 2\n          result.thumbH = Math.floor(thumbH) - 2\n        })\n\n        i += rowCnt\n      })\n    }\n\n    function switchToPM (fromPeerID, botID, startParam) {\n      var peerString = AppPeersManager.getPeerString(fromPeerID)\n      var setHash = {}\n      setHash['inline_switch_pm' + botID] = {peer: peerString, time: tsNow()}\n      Storage.set(setHash)\n      $rootScope.$broadcast('history_focus', {peerString: AppPeersManager.getPeerString(botID)})\n      AppMessagesManager.startBot(botID, 0, startParam)\n    }\n\n    function checkSwitchReturn (botID) {\n      var bot = AppUsersManager.getUser(botID)\n      if (!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n        return qSync.when(false)\n      }\n      var key = 'inline_switch_pm' + botID\n      return Storage.get(key).then(function (peerData) {\n        if (peerData) {\n          Storage.remove(key)\n          if (tsNow() - peerData.time < 3600000) {\n            return peerData.peer\n          }\n        }\n        return false\n      })\n    }\n\n    function switchInlineQuery (botID, toPeerString, query) {\n      $rootScope.$broadcast('history_focus', {\n        peerString: toPeerString,\n        attachment: {\n          _: 'inline_query',\n          mention: '@' + AppUsersManager.getUser(botID).username,\n          query: query\n        }\n      })\n    }\n\n    function switchInlineButtonClick (id, button) {\n      var message = AppMessagesManager.getMessage(id)\n      var botID = message.viaBotID || message.fromID\n      if (button.pFlags && button.pFlags.same_peer) {\n        var peerID = AppMessagesManager.getMessagePeer(message)\n        var toPeerString = AppPeersManager.getPeerString(peerID)\n        switchInlineQuery(botID, toPeerString, button.query)\n        return\n      }\n      return checkSwitchReturn(botID).then(function (retPeerString) {\n        if (retPeerString) {\n          return switchInlineQuery(botID, retPeerString, button.query)\n        }\n        PeersSelectService.selectPeer({\n          canSend: true\n        }).then(function (toPeerString) {\n          return switchInlineQuery(botID, toPeerString, button.query)\n        })\n      })\n    }\n\n    function callbackButtonClick (id, button) {\n      var message = AppMessagesManager.getMessage(id)\n      var botID = message.fromID\n      var peerID = AppMessagesManager.getMessagePeer(message)\n\n      return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n        flags: 1,\n        peer: AppPeersManager.getInputPeerByID(peerID),\n        msg_id: AppMessagesIDsManager.getMessageLocalID(id),\n        data: button.data\n      }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n        if (typeof callbackAnswer.message === 'string' &&\n            callbackAnswer.message.length) {\n          showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n        }\n        else if (typeof callbackAnswer.url === 'string') {\n          var url = RichTextProcessor.wrapUrl(callbackAnswer.url, true)\n          LocationParamsService.openUrl(url)\n        }\n      })\n    }\n\n    function gameButtonClick (id) {\n      var message = AppMessagesManager.getMessage(id)\n      var peerID = AppMessagesManager.getMessagePeer(message)\n\n      return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n        flags: 2,\n        peer: AppPeersManager.getInputPeerByID(peerID),\n        msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n      }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n        if (typeof callbackAnswer.message === 'string' &&\n            callbackAnswer.message.length) {\n          showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n        }\n        else if (typeof callbackAnswer.url === 'string') {\n          AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n        }\n      })\n    }\n\n    function showCallbackMessage(message, isAlert) {\n      if (typeof message != 'string' ||\n        !message.length) {\n        return\n      }\n      var html = RichTextProcessor.wrapRichText(message, {noLinks: true, noLinebreaks: true})\n      if (isAlert) {\n        ErrorService.show({\n          title_html: html,\n          alert: true\n        })\n      } else {\n        toaster.pop({\n          type: 'info',\n          body: html.valueOf(),\n          bodyOutputType: 'trustedHtml',\n          showCloseButton: false\n        })\n      }\n    }\n\n    function sendInlineResult (peerID, qID, options) {\n      var inlineResult = inlineResults[qID]\n      if (inlineResult === undefined) {\n        return false\n      }\n      pushPopularBot(inlineResult.botID)\n      var splitted = qID.split('_')\n      var queryID = splitted.shift()\n      var resultID = splitted.join('_')\n      options = options || {}\n      options.viaBotID = inlineResult.botID\n      options.queryID = queryID\n      options.resultID = resultID\n      if (inlineResult.send_message.reply_markup) {\n        options.reply_markup = inlineResult.send_message.reply_markup\n      }\n\n      if (inlineResult.send_message._ == 'botInlineMessageText') {\n        options.entities = inlineResult.send_message.entities\n        AppMessagesManager.sendText(peerID, inlineResult.send_message.message, options)\n      } else {\n        var caption = ''\n        var inputMedia = false\n        switch (inlineResult.send_message._) {\n          case 'botInlineMessageMediaAuto':\n            caption = inlineResult.send_message.caption\n            if (inlineResult._ == 'botInlineMediaResult') {\n              var doc = inlineResult.document\n              var photo = inlineResult.photo\n              if (doc) {\n                inputMedia = {\n                  _: 'inputMediaDocument',\n                  id: {_: 'inputDocument', id: doc.id, access_hash: doc.access_hash},\n                  caption: caption\n                }\n              } else {\n                inputMedia = {\n                  _: 'inputMediaPhoto',\n                  id: {_: 'inputPhoto', id: photo.id, access_hash: photo.access_hash},\n                  caption: caption\n                }\n              }\n            }\n            break\n\n          case 'botInlineMessageMediaGeo':\n            inputMedia = {\n              _: 'inputMediaGeoPoint',\n              geo_point: {\n                _: 'inputGeoPoint',\n                'lat': inlineResult.send_message.geo['lat'],\n                'long': inlineResult.send_message.geo['long']\n              }\n            }\n            break\n\n          case 'botInlineMessageMediaVenue':\n            inputMedia = {\n              _: 'inputMediaVenue',\n              geo_point: {\n                _: 'inputGeoPoint',\n                'lat': inlineResult.send_message.geo['lat'],\n                'long': inlineResult.send_message.geo['long']\n              },\n              title: inlineResult.send_message.title,\n              address: inlineResult.send_message.address,\n              provider: inlineResult.send_message.provider,\n              venue_id: inlineResult.send_message.venue_id\n            }\n            break\n\n          case 'botInlineMessageMediaContact':\n            inputMedia = {\n              _: 'inputMediaContact',\n              phone_number: inlineResult.send_message.phone_number,\n              first_name: inlineResult.send_message.first_name,\n              last_name: inlineResult.send_message.last_name\n            }\n            break\n        }\n        if (!inputMedia) {\n          inputMedia = {\n            _: 'messageMediaPending',\n            type: inlineResult.type,\n            file_name: inlineResult.title || inlineResult.content_url || inlineResult.url,\n            size: 0,\n            progress: {percent: 30, total: 0}\n          }\n        }\n        AppMessagesManager.sendOther(peerID, inputMedia, options)\n      }\n    }\n\n    function checkGeoLocationAccess (botID) {\n      var key = 'bot_access_geo' + botID\n      return Storage.get(key).then(function (geoAccess) {\n        if (geoAccess && geoAccess.granted) {\n          return true\n        }\n        return ErrorService.confirm({\n          type: 'BOT_ACCESS_GEO_INLINE'\n        }).then(function () {\n          var setHash = {}\n          setHash[key] = {granted: true, time: tsNow()}\n          Storage.set(setHash)\n          return true\n        }, function () {\n          var setHash = {}\n          setHash[key] = {denied: true, time: tsNow()}\n          Storage.set(setHash)\n          return $q.reject()\n        })\n      })\n    }\n  })\n\n  .service('ApiUpdatesManager', function ($rootScope, MtpNetworkerFactory, AppUsersManager, AppChatsManager, AppPeersManager, MtpApiManager) {\n    var updatesState = {\n      pendingPtsUpdates: [],\n      pendingSeqUpdates: {},\n      syncPending: false,\n      syncLoading: true\n    }\n    var channelStates = {}\n\n    var myID = 0\n    MtpApiManager.getUserID().then(function (id) {\n      myID = id\n    })\n\n    function popPendingSeqUpdate () {\n      var nextSeq = updatesState.seq + 1\n      var pendingUpdatesData = updatesState.pendingSeqUpdates[nextSeq]\n      if (!pendingUpdatesData) {\n        return false\n      }\n      var updates = pendingUpdatesData.updates\n      var i\n      var length\n      for (var i = 0, length = updates.length; i < length; i++) {\n        saveUpdate(updates[i])\n      }\n      updatesState.seq = pendingUpdatesData.seq\n      if (pendingUpdatesData.date && updatesState.date < pendingUpdatesData.date) {\n        updatesState.date = pendingUpdatesData.date\n      }\n      delete updatesState.pendingSeqUpdates[nextSeq]\n\n      if (!popPendingSeqUpdate() &&\n        updatesState.syncPending &&\n        updatesState.syncPending.seqAwaiting &&\n        updatesState.seq >= updatesState.syncPending.seqAwaiting) {\n        if (!updatesState.syncPending.ptsAwaiting) {\n          clearTimeout(updatesState.syncPending.timeout)\n          updatesState.syncPending = false\n        } else {\n          delete updatesState.syncPending.seqAwaiting\n        }\n      }\n\n      return true\n    }\n\n    function popPendingPtsUpdate (channelID) {\n      var curState = channelID ? getChannelState(channelID) : updatesState\n      if (!curState.pendingPtsUpdates.length) {\n        return false\n      }\n      curState.pendingPtsUpdates.sort(function (a, b) {\n        return a.pts - b.pts\n      })\n      // console.log(dT(), 'pop update', channelID, curState.pendingPtsUpdates)\n\n      var curPts = curState.pts\n      var goodPts = false\n      var goodIndex = false\n      var update\n      for (var i = 0, length = curState.pendingPtsUpdates.length; i < length; i++) {\n        update = curState.pendingPtsUpdates[i]\n        curPts += update.pts_count\n        if (curPts >= update.pts) {\n          goodPts = update.pts\n          goodIndex = i\n        }\n      }\n\n      if (!goodPts) {\n        return false\n      }\n\n      console.log(dT(), 'pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1))\n\n      curState.pts = goodPts\n      for (i = 0; i <= goodIndex; i++) {\n        update = curState.pendingPtsUpdates[i]\n        saveUpdate(update)\n      }\n      curState.pendingPtsUpdates.splice(0, goodIndex + 1)\n\n      if (!curState.pendingPtsUpdates.length && curState.syncPending) {\n        if (!curState.syncPending.seqAwaiting) {\n          clearTimeout(curState.syncPending.timeout)\n          curState.syncPending = false\n        } else {\n          delete curState.syncPending.ptsAwaiting\n        }\n      }\n\n      return true\n    }\n\n    function forceGetDifference () {\n      if (!updatesState.syncLoading) {\n        getDifference()\n      }\n    }\n\n    function processUpdateMessage (updateMessage, fromMTProto) {\n      // return forceGetDifference()\n      var processOpts = {\n        date: updateMessage.date,\n        seq: updateMessage.seq,\n        seqStart: updateMessage.seq_start\n      }\n\n      switch (updateMessage._) {\n        case 'updatesTooLong':\n        case 'new_session_created':\n          forceGetDifference()\n          break\n\n        case 'updateShort':\n          processUpdate(updateMessage.update, processOpts)\n          break\n\n        case 'updateShortMessage':\n        case 'updateShortChatMessage':\n          var isOut = updateMessage.flags & 2\n          var fromID = updateMessage.from_id || (isOut ? myID : updateMessage.user_id)\n          var toID = updateMessage.chat_id\n            ? -updateMessage.chat_id\n            : (isOut ? updateMessage.user_id : myID)\n\n          processUpdate({\n            _: 'updateNewMessage',\n            message: {\n              _: 'message',\n              flags: updateMessage.flags,\n              pFlags: updateMessage.pFlags,\n              id: updateMessage.id,\n              from_id: fromID,\n              to_id: AppPeersManager.getOutputPeer(toID),\n              date: updateMessage.date,\n              message: updateMessage.message,\n              fwd_from: updateMessage.fwd_from,\n              reply_to_msg_id: updateMessage.reply_to_msg_id,\n              entities: updateMessage.entities\n            },\n            pts: updateMessage.pts,\n            pts_count: updateMessage.pts_count\n          }, processOpts)\n          break\n\n        case 'updatesCombined':\n        case 'updates':\n          AppUsersManager.saveApiUsers(updateMessage.users)\n          AppChatsManager.saveApiChats(updateMessage.chats)\n\n          angular.forEach(updateMessage.updates, function (update) {\n            processUpdate(update, processOpts)\n          })\n          break\n\n        default:\n          console.warn(dT(), 'Unknown update message', updateMessage)\n      }\n    }\n\n    function getDifference () {\n      // console.trace(dT(), 'Get full diff')\n      if (!updatesState.syncLoading) {\n        updatesState.syncLoading = true\n        updatesState.pendingSeqUpdates = {}\n        updatesState.pendingPtsUpdates = []\n      }\n\n      if (updatesState.syncPending) {\n        clearTimeout(updatesState.syncPending.timeout)\n        updatesState.syncPending = false\n      }\n\n      MtpApiManager.invokeApi('updates.getDifference', {pts: updatesState.pts, date: updatesState.date, qts: -1}, {\n        timeout: 0x7fffffff\n      }).then(function (differenceResult) {\n        if (differenceResult._ == 'updates.differenceEmpty') {\n          console.log(dT(), 'apply empty diff', differenceResult.seq)\n          updatesState.date = differenceResult.date\n          updatesState.seq = differenceResult.seq\n          updatesState.syncLoading = false\n          $rootScope.$broadcast('stateSynchronized')\n          return false\n        }\n\n        AppUsersManager.saveApiUsers(differenceResult.users)\n        AppChatsManager.saveApiChats(differenceResult.chats)\n\n        // Should be first because of updateMessageID\n        // console.log(dT(), 'applying', differenceResult.other_updates.length, 'other updates')\n\n        var channelsUpdates = []\n        angular.forEach(differenceResult.other_updates, function (update) {\n          switch (update._) {\n            case 'updateChannelTooLong':\n            case 'updateNewChannelMessage':\n            case 'updateEditChannelMessage':\n              processUpdate(update)\n              return\n          }\n          saveUpdate(update)\n        })\n\n        // console.log(dT(), 'applying', differenceResult.new_messages.length, 'new messages')\n        angular.forEach(differenceResult.new_messages, function (apiMessage) {\n          saveUpdate({\n            _: 'updateNewMessage',\n            message: apiMessage,\n            pts: updatesState.pts,\n            pts_count: 0\n          })\n        })\n\n        var nextState = differenceResult.intermediate_state || differenceResult.state\n        updatesState.seq = nextState.seq\n        updatesState.pts = nextState.pts\n        updatesState.date = nextState.date\n\n        // console.log(dT(), 'apply diff', updatesState.seq, updatesState.pts)\n\n        if (differenceResult._ == 'updates.differenceSlice') {\n          getDifference()\n        } else {\n          // console.log(dT(), 'finished get diff')\n          $rootScope.$broadcast('stateSynchronized')\n          updatesState.syncLoading = false\n        }\n      }, function () {\n        updatesState.syncLoading = false\n      })\n    }\n\n    function getChannelDifference (channelID) {\n      var channelState = getChannelState(channelID)\n      if (!channelState.syncLoading) {\n        channelState.syncLoading = true\n        channelState.pendingPtsUpdates = []\n      }\n      if (channelState.syncPending) {\n        clearTimeout(channelState.syncPending.timeout)\n        channelState.syncPending = false\n      }\n      // console.log(dT(), 'Get channel diff', AppChatsManager.getChat(channelID), channelState.pts)\n      MtpApiManager.invokeApi('updates.getChannelDifference', {\n        channel: AppChatsManager.getChannelInput(channelID),\n        filter: {_: 'channelMessagesFilterEmpty'},\n        pts: channelState.pts,\n        limit: 30\n      }, {timeout: 0x7fffffff}).then(function (differenceResult) {\n        // console.log(dT(), 'channel diff result', differenceResult)\n        channelState.pts = differenceResult.pts\n\n        if (differenceResult._ == 'updates.channelDifferenceEmpty') {\n          console.log(dT(), 'apply channel empty diff', differenceResult)\n          channelState.syncLoading = false\n          $rootScope.$broadcast('stateSynchronized')\n          return false\n        }\n\n        if (differenceResult._ == 'updates.channelDifferenceTooLong') {\n          console.log(dT(), 'channel diff too long', differenceResult)\n          channelState.syncLoading = false\n          delete channelStates[channelID]\n          saveUpdate({_: 'updateChannelReload', channel_id: channelID})\n          return false\n        }\n\n        AppUsersManager.saveApiUsers(differenceResult.users)\n        AppChatsManager.saveApiChats(differenceResult.chats)\n\n        // Should be first because of updateMessageID\n        console.log(dT(), 'applying', differenceResult.other_updates.length, 'channel other updates')\n        angular.forEach(differenceResult.other_updates, function (update) {\n          saveUpdate(update)\n        })\n\n        console.log(dT(), 'applying', differenceResult.new_messages.length, 'channel new messages')\n        angular.forEach(differenceResult.new_messages, function (apiMessage) {\n          saveUpdate({\n            _: 'updateNewChannelMessage',\n            message: apiMessage,\n            pts: channelState.pts,\n            pts_count: 0\n          })\n        })\n\n        console.log(dT(), 'apply channel diff', channelState.pts)\n\n        if (differenceResult._ == 'updates.channelDifference' &&\n          !differenceResult.pFlags['final']) {\n          getChannelDifference(channelID)\n        } else {\n          console.log(dT(), 'finished channel get diff')\n          $rootScope.$broadcast('stateSynchronized')\n          channelState.syncLoading = false\n        }\n      }, function () {\n        channelState.syncLoading = false\n      })\n    }\n\n    function addChannelState (channelID, pts) {\n      if (!pts) {\n        throw new Error('Add channel state without pts ' + channelID)\n      }\n      if (channelStates[channelID] === undefined) {\n        channelStates[channelID] = {\n          pts: pts,\n          pendingPtsUpdates: [],\n          syncPending: false,\n          syncLoading: false\n        }\n        return true\n      }\n      return false\n    }\n\n    function getChannelState (channelID, pts) {\n      if (channelStates[channelID] === undefined) {\n        addChannelState(channelID, pts)\n      }\n      return channelStates[channelID]\n    }\n\n    function processUpdate (update, options) {\n      options = options || {}\n      var channelID = false\n      switch (update._) {\n        case 'updateNewChannelMessage':\n        case 'updateEditChannelMessage':\n          channelID = -AppPeersManager.getPeerID(update.message.to_id)\n          break\n        case 'updateDeleteChannelMessages':\n          channelID = update.channel_id\n          break\n        case 'updateChannelTooLong':\n          channelID = update.channel_id\n          if (channelStates[channelID] === undefined) {\n            return false\n          }\n          break\n      }\n\n      var curState = channelID ? getChannelState(channelID, update.pts) : updatesState\n\n      // console.log(dT(), 'process', channelID, curState.pts, update)\n\n      if (curState.syncLoading) {\n        return false\n      }\n\n      if (update._ == 'updateChannelTooLong') {\n        if (!curState.lastPtsUpdateTime ||\n            curState.lastPtsUpdateTime < tsNow() - 10000) {\n          // console.trace(dT(), 'channel too long, get diff', channelID, update)\n          getChannelDifference(channelID)\n        }\n        return false\n      }\n\n      if (update._ == 'updateNewMessage' ||\n          update._ == 'updateEditMessage' ||\n          update._ == 'updateNewChannelMessage' ||\n          update._ == 'updateEditChannelMessage') {\n        var message = update.message\n        var toPeerID = AppPeersManager.getPeerID(message.to_id)\n        var fwdHeader = message.fwd_from || {}\n        var reason = false\n        if (message.from_id && !AppUsersManager.hasUser(message.from_id, message.pFlags.post/* || channelID*/) && (reason = 'author') ||\n            fwdHeader.from_id && !AppUsersManager.hasUser(fwdHeader.from_id, !!fwdHeader.channel_id) && (reason = 'fwdAuthor') ||\n            fwdHeader.channel_id && !AppChatsManager.hasChat(fwdHeader.channel_id, true) && (reason = 'fwdChannel') ||\n            toPeerID > 0 && !AppUsersManager.hasUser(toPeerID) && (reason = 'toPeer User') ||\n            toPeerID < 0 && !AppChatsManager.hasChat(-toPeerID) && (reason = 'toPeer Chat')) {\n          console.warn(dT(), 'Not enough data for message update', toPeerID, reason, message)\n          if (channelID && AppChatsManager.hasChat(channelID)) {\n            getChannelDifference(channelID)\n          } else {\n            forceGetDifference()\n          }\n          return false\n        }\n      }\n      else if (channelID && !AppChatsManager.hasChat(channelID)) {\n        // console.log(dT(), 'skip update, missing channel', channelID, update)\n        return false\n      }\n\n      var popPts\n      var popSeq\n\n      if (update.pts) {\n        var newPts = curState.pts + (update.pts_count || 0)\n        if (newPts < update.pts) {\n          console.warn(dT(), 'Pts hole', curState, update, channelID && AppChatsManager.getChat(channelID))\n          curState.pendingPtsUpdates.push(update)\n          if (!curState.syncPending) {\n            curState.syncPending = {\n              timeout: setTimeout(function () {\n                if (channelID) {\n                  getChannelDifference(channelID)\n                } else {\n                  getDifference()\n                }\n              }, 5000)\n            }\n          }\n          curState.syncPending.ptsAwaiting = true\n          return false\n        }\n        if (update.pts > curState.pts) {\n          curState.pts = update.pts\n          popPts = true\n\n          curState.lastPtsUpdateTime = tsNow()\n        }\n        else if (update.pts_count) {\n          // console.warn(dT(), 'Duplicate update', update)\n          return false\n        }\n        if (channelID && options.date && updatesState.date < options.date) {\n          updatesState.date = options.date\n        }\n      }\n      else if (!channelID && options.seq > 0) {\n        var seq = options.seq\n        var seqStart = options.seqStart || seq\n\n        if (seqStart != curState.seq + 1) {\n          if (seqStart > curState.seq) {\n            console.warn(dT(), 'Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting)\n\n            if (curState.pendingSeqUpdates[seqStart] === undefined) {\n              curState.pendingSeqUpdates[seqStart] = {seq: seq, date: options.date, updates: []}\n            }\n            curState.pendingSeqUpdates[seqStart].updates.push(update)\n\n            if (!curState.syncPending) {\n              curState.syncPending = {\n                timeout: setTimeout(function () {\n                  getDifference()\n                }, 5000)\n              }\n            }\n            if (!curState.syncPending.seqAwaiting ||\n              curState.syncPending.seqAwaiting < seqStart) {\n              curState.syncPending.seqAwaiting = seqStart\n            }\n            return false\n          }\n        }\n\n        if (curState.seq != seq) {\n          curState.seq = seq\n          if (options.date && curState.date < options.date) {\n            curState.date = options.date\n          }\n          popSeq = true\n        }\n      }\n\n      saveUpdate(update)\n\n      if (popPts) {\n        popPendingPtsUpdate(channelID)\n      }\n      else if (popSeq) {\n        popPendingSeqUpdate()\n      }\n    }\n\n    function saveUpdate (update) {\n      $rootScope.$broadcast('apiUpdate', update)\n    }\n\n    function attach () {\n      MtpNetworkerFactory.setUpdatesProcessor(processUpdateMessage)\n      MtpApiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then(function (stateResult) {\n        updatesState.seq = stateResult.seq\n        updatesState.pts = stateResult.pts\n        updatesState.date = stateResult.date\n        setTimeout(function () {\n          updatesState.syncLoading = false\n        }, 1000)\n\n      // updatesState.seq = 1\n      // updatesState.pts = stateResult.pts - 5000\n      // updatesState.date = 1\n      // getDifference()\n      })\n    }\n\n    return {\n      processUpdateMessage: processUpdateMessage,\n      addChannelState: addChannelState,\n      attach: attach\n    }\n  })\n\n  .service('StatusManager', function ($timeout, $rootScope, MtpApiManager, AppUsersManager, IdleManager) {\n    var toPromise\n    var lastOnlineUpdated = 0\n    var started = false\n    var myID = 0\n    var myOtherDeviceActive = false\n\n    MtpApiManager.getUserID().then(function (id) {\n      myID = id\n    })\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      if (update._ == 'updateUserStatus' && update.user_id == myID) {\n        myOtherDeviceActive = tsNow() + (update.status._ == 'userStatusOnline' ? 300000 : 0)\n      }\n    })\n\n    return {\n      start: start,\n      isOtherDeviceActive: isOtherDeviceActive\n    }\n\n    function start () {\n      if (!started) {\n        started = true\n        $rootScope.$watch('idle.isIDLE', checkIDLE)\n        $rootScope.$watch('offline', checkIDLE)\n      }\n    }\n\n    function sendUpdateStatusReq (offline) {\n      var date = tsNow()\n      if (offline && !lastOnlineUpdated ||\n        !offline && (date - lastOnlineUpdated) < 50000 ||\n        $rootScope.offline) {\n        return\n      }\n      lastOnlineUpdated = offline ? 0 : date\n      AppUsersManager.setUserStatus(myID, offline)\n      return MtpApiManager.invokeApi('account.updateStatus', {\n        offline: offline\n      }, {noErrorBox: true})\n    }\n\n    function checkIDLE () {\n      toPromise && $timeout.cancel(toPromise)\n      if ($rootScope.idle.isIDLE) {\n        toPromise = $timeout(function () {\n          sendUpdateStatusReq(true)\n        }, 5000)\n      } else {\n        sendUpdateStatusReq(false)\n        toPromise = $timeout(checkIDLE, 60000)\n      }\n    }\n\n    function isOtherDeviceActive () {\n      if (!myOtherDeviceActive) {\n        return false\n      }\n      if (tsNow() > myOtherDeviceActive) {\n        myOtherDeviceActive = false\n        return false\n      }\n      return true\n    }\n  })\n\n  .service('NotificationsManager', function ($rootScope, $window, $interval, $q, $modal, _, toaster, MtpApiManager, AppPeersManager, AppChatsManager, AppUsersManager, IdleManager, Storage, AppRuntimeManager, FileManager, WebPushApiManager) {\n    navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate\n\n    var notificationsMsSiteMode = false\n    try {\n      if (window.external && window.external.msIsSiteMode()) {\n        notificationsMsSiteMode = true\n      }\n    } catch (e) {}\n\n    var notificationsUiSupport = notificationsMsSiteMode ||\n      ('Notification' in window) ||\n      ('mozNotification' in navigator)\n    var notificationsShown = {}\n    var notificationIndex = 0\n    var notificationsCount = 0\n    var soundsPlayed = {}\n    var vibrateSupport = !!navigator.vibrate\n    var nextSoundAt = false\n    var prevSoundVolume = false\n    var peerSettings = {}\n    var faviconEl = $('link[rel=\"icon\"]:first')[0]\n    var langNotificationsPluralize = _.pluralize('page_title_pluralize_notifications')\n\n    var titleBackup = document.title\n    var titleChanged = false\n    var titlePromise\n    var prevFavicon\n    var stopped = false\n\n    var settings = {}\n\n    $rootScope.$watch('idle.deactivated', function (newVal) {\n      if (newVal) {\n        stop()\n      }\n    })\n\n    $rootScope.$watch('idle.isIDLE', function (newVal) {\n      if (stopped) {\n        return\n      }\n      if (!newVal) {\n        notificationsClear()\n      }\n      if (!Config.Navigator.mobile) {\n        $interval.cancel(titlePromise)\n        if (!newVal) {\n          titleChanged = false\n          document.title = titleBackup\n          setFavicon()\n        } else {\n          titleBackup = document.title\n\n          titlePromise = $interval(function () {\n            if (titleChanged || !notificationsCount) {\n              titleChanged = false\n              document.title = titleBackup\n              setFavicon()\n            } else {\n              titleChanged = true\n              document.title = langNotificationsPluralize(notificationsCount)\n              setFavicon('favicon_unread.ico')\n            }\n          }, 1000)\n        }\n      }\n    })\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      // console.log('on apiUpdate', update)\n      switch (update._) {\n        case 'updateNotifySettings':\n          if (update.peer._ == 'notifyPeer') {\n            var peerID = AppPeersManager.getPeerID(update.peer.peer)\n            savePeerSettings(peerID, update.notify_settings)\n          }\n          break\n      }\n    })\n\n    var registeredDevice = false\n    var pushInited = false\n    $rootScope.$on('push_init', function (e, tokenData) {\n      pushInited = true\n      if (!settings.nodesktop && !settings.nopush) {\n        if (tokenData) {\n          registerDevice(tokenData)\n        } else {\n          WebPushApiManager.subscribe()\n        }\n      } else {\n        unregisterDevice(tokenData)\n      }\n    })\n    $rootScope.$on('push_subscribe', function (e, tokenData) {\n      registerDevice(tokenData)\n    })\n    $rootScope.$on('push_unsubscribe', function (e, tokenData) {\n      unregisterDevice(tokenData)\n    })\n\n    var topMessagesDeferred = $q.defer()\n    var unregisterTopMsgs = $rootScope.$on('dialogs_multiupdate', function () {\n      unregisterTopMsgs()\n      topMessagesDeferred.resolve()\n    })\n    var topMessagesPromise = topMessagesDeferred.promise\n\n    $rootScope.$on('push_notification_click', function (e, notificationData) {\n      if (notificationData.action == 'push_settings') {\n        topMessagesPromise.then(function () {\n          $modal.open({\n            templateUrl: templateUrl('settings_modal'),\n            controller: 'SettingsModalController',\n            windowClass: 'settings_modal_window mobile_modal',\n            backdrop: 'single'\n          })\n        })\n        return\n      }\n      if (notificationData.action == 'mute1d') {\n        MtpApiManager.invokeApi('account.updateDeviceLocked', function () {\n          period: 86400\n        }).then(function () {\n          var toastData = toaster.pop({\n            type: 'info',\n            body: _('push_action_mute1d_success'),\n            bodyOutputType: 'trustedHtml',\n            clickHandler: function () {\n              toaster.clear(toastData)\n            },\n            showCloseButton: false\n          })\n        })\n        return\n      }\n      var peerID = notificationData.custom && notificationData.custom.peerID\n      console.log('click', notificationData, peerID)\n      if (peerID) {\n        topMessagesPromise.then(function () {\n          if (notificationData.custom.channel_id &&\n              !AppChatsManager.hasChat(notificationData.custom.channel_id)) {\n            return\n          }\n          if (peerID > 0 && !AppUsersManager.hasUser(peerID)) {\n            return\n          }\n          $rootScope.$broadcast('history_focus', {\n            peerString: AppPeersManager.getPeerString(peerID)\n          })\n        })\n      }\n    })\n    \n\n    return {\n      start: start,\n      notify: notify,\n      cancel: notificationCancel,\n      clear: notificationsClear,\n      soundReset: notificationSoundReset,\n      getPeerSettings: getPeerSettings,\n      getPeerMuted: getPeerMuted,\n      savePeerSettings: savePeerSettings,\n      updatePeerSettings: updatePeerSettings,\n      updateNotifySettings: updateNotifySettings,\n      getNotifySettings: getNotifySettings,\n      getVibrateSupport: getVibrateSupport,\n      testSound: playSound\n    }\n\n    function updateNotifySettings () {\n      Storage.get('notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush').then(function (updSettings) {\n        settings.nodesktop = updSettings[0]\n        settings.volume = updSettings[1] === false\n          ? 0.5\n          : updSettings[1]\n\n        settings.novibrate = updSettings[2]\n        settings.nopreview = updSettings[3]\n        settings.nopush = updSettings[4]\n\n\n        if (pushInited) {\n          var needPush = !settings.nopush && !settings.nodesktop && WebPushApiManager.isAvailable || false\n          var hasPush = registeredDevice !== false\n          if (needPush != hasPush) {\n            if (needPush) {\n              WebPushApiManager.subscribe()\n            } else {\n              WebPushApiManager.unsubscribe()\n            }\n          }\n        }\n        WebPushApiManager.setSettings(settings)\n      })\n    }\n\n    function getNotifySettings () {\n      return settings\n    }\n\n    function getPeerSettings (peerID) {\n      if (peerSettings[peerID] !== undefined) {\n        return peerSettings[peerID]\n      }\n\n      return peerSettings[peerID] = MtpApiManager.invokeApi('account.getNotifySettings', {\n        peer: {\n          _: 'inputNotifyPeer',\n          peer: AppPeersManager.getInputPeerByID(peerID)\n        }\n      })\n    }\n\n    function setFavicon (href) {\n      href = href || 'favicon.ico'\n      if (prevFavicon === href) {\n        return\n      }\n      var link = document.createElement('link')\n      link.rel = 'shortcut icon'\n      link.type = 'image/x-icon'\n      link.href = href\n      faviconEl.parentNode.replaceChild(link, faviconEl)\n      faviconEl = link\n\n      prevFavicon = href\n    }\n\n    function savePeerSettings (peerID, settings) {\n      // console.trace(dT(), 'peer settings', peerID, settings)\n      peerSettings[peerID] = $q.when(settings)\n      $rootScope.$broadcast('notify_settings', {peerID: peerID})\n    }\n\n    function updatePeerSettings (peerID, settings) {\n      savePeerSettings(peerID, settings)\n\n      var inputSettings = angular.copy(settings)\n      inputSettings._ = 'inputPeerNotifySettings'\n\n      return MtpApiManager.invokeApi('account.updateNotifySettings', {\n        peer: {\n          _: 'inputNotifyPeer',\n          peer: AppPeersManager.getInputPeerByID(peerID)\n        },\n        settings: inputSettings\n      })\n    }\n\n    function getPeerMuted (peerID) {\n      return getPeerSettings(peerID).then(function (peerNotifySettings) {\n        return peerNotifySettings._ == 'peerNotifySettings' &&\n          peerNotifySettings.mute_until * 1000 > tsNow()\n      })\n    }\n\n    function start () {\n      updateNotifySettings()\n      $rootScope.$on('settings_changed', updateNotifySettings)\n      WebPushApiManager.start()\n\n      if (!notificationsUiSupport) {\n        return false\n      }\n\n      if ('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n        $($window).on('click', requestPermission)\n      }\n\n      try {\n        if ('onbeforeunload' in window) {\n          $($window).on('beforeunload', notificationsClear)\n        }\n      } catch (e) {}\n    }\n\n    function stop () {\n      notificationsClear()\n      $interval.cancel(titlePromise)\n      setFavicon()\n      stopped = true\n    }\n\n    function requestPermission () {\n      Notification.requestPermission()\n      $($window).off('click', requestPermission)\n    }\n\n    function notify (data) {\n      console.log('notify', data, $rootScope.idle.isIDLE, notificationsUiSupport, stopped)\n      if (stopped) {\n        return\n      }\n\n      // FFOS Notification blob src bug workaround\n      if (Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n        data.image = 'https://telegram.org/img/t_logo.png'\n      }\n      else if (data.image && !angular.isString(data.image)) {\n        if (Config.Navigator.ffos2p) {\n          FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n            data.image = url\n            notify(data)\n          })\n          return false\n        } else {\n          data.image = FileManager.getUrl(data.image, 'image/jpeg')\n        }\n      }\n      else if (!data.image) {\n        data.image = 'img/icons/icon60.png'\n      }\n      // console.log('notify image', data.image)\n\n      notificationsCount++\n\n      var now = tsNow()\n      if (settings.volume > 0 &&\n        (\n        !data.tag ||\n        !soundsPlayed[data.tag] ||\n        now > soundsPlayed[data.tag] + 60000\n        )\n      ) {\n        playSound(settings.volume)\n        soundsPlayed[data.tag] = now\n      }\n\n      if (!notificationsUiSupport ||\n        'Notification' in window && Notification.permission !== 'granted') {\n        return false\n      }\n\n      if (settings.nodesktop) {\n        if (vibrateSupport && !settings.novibrate) {\n          navigator.vibrate([200, 100, 200])\n          return\n        }\n        return\n      }\n\n      var idx = ++notificationIndex\n      var key = data.key || 'k' + idx\n      var notification\n\n      if ('Notification' in window) {\n        try {\n          if (data.tag) {\n            angular.forEach(notificationsShown, function (notification) {\n              if (notification &&\n                  notification.tag == data.tag) {\n                notification.hidden = true\n              }\n            })\n          }\n          notification = new Notification(data.title, {\n            icon: data.image || '',\n            body: data.message || '',\n            tag: data.tag || '',\n            silent: data.silent || false\n          })\n        } catch (e) {\n          notificationsUiSupport = false\n          WebPushApiManager.setLocalNotificationsDisabled()\n          return\n        }\n      }\n      else if ('mozNotification' in navigator) {\n        notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n      }\n      else if (notificationsMsSiteMode) {\n        window.external.msSiteModeClearIconOverlay()\n        window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n        window.external.msSiteModeActivate()\n        notification = {\n          index: idx\n        }\n      } else {\n        return\n      }\n\n      notification.onclick = function () {\n        notification.close()\n        AppRuntimeManager.focus()\n        notificationsClear()\n        if (data.onclick) {\n          data.onclick()\n        }\n      }\n\n      notification.onclose = function () {\n        if (!notification.hidden) {\n          delete notificationsShown[key]\n          notificationsClear()\n        }\n      }\n\n      if (notification.show) {\n        notification.show()\n      }\n      notificationsShown[key] = notification\n\n      if (!Config.Navigator.mobile) {\n        setTimeout(function () {\n          notificationHide(key)\n        }, 8000)\n      }\n    }\n\n    function playSound (volume) {\n      var now = tsNow()\n      if (nextSoundAt && now < nextSoundAt && prevSoundVolume == volume) {\n        return\n      }\n      nextSoundAt = now + 1000\n      prevSoundVolume = volume\n      var filename = 'img/sound_a.mp3'\n      var obj = $('#notify_sound').html('<audio autoplay=\"autoplay\" mozaudiochannel=\"notification\">' +\n        '<source src=\"' + filename + '\" type=\"audio/mpeg\" />' +\n        '<embed hidden=\"true\" autostart=\"true\" loop=\"false\" volume=\"' + (volume * 100) + '\" src=\"' + filename + '\" />' +\n        '</audio>')\n      obj.find('audio')[0].volume = volume\n    }\n\n    function notificationCancel (key) {\n      var notification = notificationsShown[key]\n      if (notification) {\n        if (notificationsCount > 0) {\n          notificationsCount--\n        }\n        try {\n          if (notification.close) {\n            notification.hidden = true\n            notification.close()\n          }\n          else if (notificationsMsSiteMode &&\n            notification.index == notificationIndex) {\n            window.external.msSiteModeClearIconOverlay()\n          }\n        } catch (e) {}\n        delete notificationsCount[key]\n      }\n    }\n\n    function notificationHide (key) {\n      var notification = notificationsShown[key]\n      if (notification) {\n        try {\n          if (notification.close) {\n            notification.hidden = true\n            notification.close()\n          }\n        } catch (e) {}\n        delete notificationsCount[key]\n      }\n    }\n\n    function notificationSoundReset (tag) {\n      delete soundsPlayed[tag]\n    }\n\n    function notificationsClear () {\n      if (notificationsMsSiteMode) {\n        window.external.msSiteModeClearIconOverlay()\n      } else {\n        angular.forEach(notificationsShown, function (notification) {\n          try {\n            if (notification.close) {\n              notification.close()\n            }\n          } catch (e) {}\n        })\n      }\n      notificationsShown = {}\n      notificationsCount = 0\n\n      WebPushApiManager.hidePushNotifications()\n    }\n\n    function registerDevice (tokenData) {\n      if (registeredDevice &&\n          angular.equals(registeredDevice, tokenData)) {\n        return false\n      }\n      MtpApiManager.invokeApi('account.registerDevice', {\n        token_type: tokenData.tokenType,\n        token: tokenData.tokenValue,\n        other_uids: []\n      }).then(function () {\n        registeredDevice = tokenData\n      }, function (error) {\n        error.handled = true\n      })\n    }\n\n    function unregisterDevice (tokenData) {\n      if (!registeredDevice) {\n        return false\n      }\n      MtpApiManager.invokeApi('account.unregisterDevice', {\n        token_type: tokenData.tokenType,\n        token: tokenData.tokenValue,\n        other_uids: []\n      }).then(function () {\n        registeredDevice = false\n      }, function (error) {\n        error.handled = true\n      })\n    }\n\n    function getVibrateSupport () {\n      return vibrateSupport\n    }\n  })\n\n  .service('PasswordManager', function ($timeout, $q, $rootScope, MtpApiManager, CryptoWorker, MtpSecureRandom) {\n    return {\n      check: check,\n      getState: getState,\n      requestRecovery: requestRecovery,\n      recover: recover,\n      updateSettings: updateSettings\n    }\n\n    function getState (options) {\n      return MtpApiManager.invokeApi('account.getPassword', {}, options).then(function (result) {\n        return result\n      })\n    }\n\n    function updateSettings (state, settings) {\n      var currentHashPromise\n      var newHashPromise\n      var params = {\n        new_settings: {\n          _: 'account.passwordInputSettings',\n          flags: 0,\n          hint: settings.hint || ''\n        }\n      }\n\n      if (typeof settings.cur_password === 'string' &&\n        settings.cur_password.length > 0) {\n        currentHashPromise = makePasswordHash(state.current_salt, settings.cur_password)\n      } else {\n        currentHashPromise = $q.when([])\n      }\n\n      if (typeof settings.new_password === 'string' &&\n        settings.new_password.length > 0) {\n        var saltRandom = new Array(8)\n        var newSalt = bufferConcat(state.new_salt, saltRandom)\n        MtpSecureRandom.nextBytes(saltRandom)\n        newHashPromise = makePasswordHash(newSalt, settings.new_password)\n        params.new_settings.new_salt = newSalt\n        params.new_settings.flags |= 1\n      } else {\n        if (typeof settings.new_password === 'string') {\n          params.new_settings.flags |= 1\n          params.new_settings.new_salt = []\n        }\n        newHashPromise = $q.when([])\n      }\n\n      if (typeof settings.email === 'string') {\n        params.new_settings.flags |= 2\n        params.new_settings.email = settings.email || ''\n      }\n\n      return $q.all([currentHashPromise, newHashPromise]).then(function (hashes) {\n        params.current_password_hash = hashes[0]\n        params.new_settings.new_password_hash = hashes[1]\n\n        return MtpApiManager.invokeApi('account.updatePasswordSettings', params)\n      })\n    }\n\n    function check (state, password, options) {\n      return makePasswordHash(state.current_salt, password).then(function (passwordHash) {\n        return MtpApiManager.invokeApi('auth.checkPassword', {\n          password_hash: passwordHash\n        }, options)\n      })\n    }\n\n    function requestRecovery (state, options) {\n      return MtpApiManager.invokeApi('auth.requestPasswordRecovery', {}, options)\n    }\n\n    function recover (code, options) {\n      return MtpApiManager.invokeApi('auth.recoverPassword', {\n        code: code\n      }, options)\n    }\n\n    function makePasswordHash (salt, password) {\n      var passwordUTF8 = unescape(encodeURIComponent(password))\n\n      var buffer = new ArrayBuffer(passwordUTF8.length)\n      var byteView = new Uint8Array(buffer)\n      for (var i = 0, len = passwordUTF8.length; i < len; i++) {\n        byteView[i] = passwordUTF8.charCodeAt(i)\n      }\n\n      buffer = bufferConcat(bufferConcat(salt, byteView), salt)\n\n      return CryptoWorker.sha256Hash(buffer)\n    }\n  })\n\n  .service('ErrorService', function ($rootScope, $modal, $window) {\n    var shownBoxes = 0\n\n    function show (params, options) {\n      if (shownBoxes >= 1) {\n        console.log('Skip error box, too many open', shownBoxes, params, options)\n        return false\n      }\n\n      options = options || {}\n      var scope = $rootScope.$new()\n      angular.extend(scope, params)\n\n      shownBoxes++\n      var modal = $modal.open({\n        templateUrl: templateUrl('error_modal'),\n        scope: scope,\n        windowClass: options.windowClass || 'error_modal_window'\n      })\n\n      modal.result['finally'](function () {\n        shownBoxes--\n      })\n\n      return modal\n    }\n\n    function alert (title, description) {\n      return show({\n        title: title,\n        description: description\n      })\n    }\n\n    function confirm (params, options, data) {\n      options = options || {}\n      data = data || {}\n      var scope = $rootScope.$new()\n      angular.extend(scope, params)\n      angular.extend(scope, { data: data })\n\n      var modal = $modal.open({\n        templateUrl: templateUrl('confirm_modal'),\n        scope: scope,\n        windowClass: options.windowClass || 'confirm_modal_window'\n      })\n\n      return modal.result\n    }\n\n    $window.safeConfirm = function (params, callback) {\n      if (typeof params === 'string') {\n        params = {message: params}\n      }\n      confirm(params).then(function (result) {\n        callback(result || true)\n      }, function () {\n        callback(false)\n      })\n    }\n\n    return {\n      show: show,\n      alert: alert,\n      confirm: confirm\n    }\n  })\n\n  .service('PeersSelectService', function ($rootScope, $modal) {\n    function selectPeer (options) {\n      var scope = $rootScope.$new()\n      scope.multiSelect = false\n      scope.noMessages = true\n      scope.forPeerSelect = true\n      if (options) {\n        angular.extend(scope, options)\n      }\n\n      return $modal.open({\n        templateUrl: templateUrl('peer_select'),\n        controller: 'PeerSelectController',\n        scope: scope,\n        windowClass: 'peer_select_window mobile_modal',\n        backdrop: 'single'\n      }).result\n    }\n\n    function selectPeers (options) {\n      if (Config.Mobile) {\n        return selectPeer(options).then(function (peerString) {\n          return [peerString]\n        })\n      }\n\n      var scope = $rootScope.$new()\n      scope.multiSelect = true\n      scope.noMessages = true\n      scope.forPeerSelect = true\n      if (options) {\n        angular.extend(scope, options)\n      }\n\n      return $modal.open({\n        templateUrl: templateUrl('peer_select'),\n        controller: 'PeerSelectController',\n        scope: scope,\n        windowClass: 'peer_select_window mobile_modal',\n        backdrop: 'single'\n      }).result\n    }\n\n    return {\n      selectPeer: selectPeer,\n      selectPeers: selectPeers\n    }\n  })\n\n  .service('ContactsSelectService', function ($rootScope, $modal) {\n    function select (multiSelect, options) {\n      options = options || {}\n\n      var scope = $rootScope.$new()\n      scope.multiSelect = multiSelect\n      angular.extend(scope, options)\n      if (!scope.action && multiSelect) {\n        scope.action = 'select'\n      }\n\n      return $modal.open({\n        templateUrl: templateUrl('contacts_modal'),\n        controller: 'ContactsModalController',\n        scope: scope,\n        windowClass: 'contacts_modal_window mobile_modal',\n        backdrop: 'single'\n      }).result\n    }\n\n    return {\n      selectContacts: function (options) {\n        return select(true, options)\n      },\n      selectContact: function (options) {\n        return select(false, options)\n      }\n    }\n  })\n\n  .service('ChangelogNotifyService', function (Storage, $rootScope, $modal, $timeout, MtpApiManager, ApiUpdatesManager) {\n\n    var checked = false\n\n    function checkUpdate () {\n      if (checked) {\n        return\n      }\n      checked = true\n      MtpApiManager.getUserID().then(function (userID) {\n        if (!userID) {\n          return\n        }\n        $timeout(function () {\n          Storage.get('last_version').then(function (lastVersion) {\n            if (lastVersion != Config.App.version) {\n              if (!lastVersion) {\n                Storage.set({last_version: Config.App.version})\n              } else {\n                MtpApiManager.invokeApi('help.getAppChangelog', {\n                  prev_app_version: lastVersion\n                }, {\n                  noErrorBox: true,\n                }).then(function (updates) {\n                  if (updates._ == 'updates' && !updates.updates.length) {\n                    return false\n                  }\n                  ApiUpdatesManager.processUpdateMessage(updates)\n                  Storage.set({last_version: Config.App.version})\n                })\n              }\n            }\n          })\n        }, 5000)\n      })\n    }\n\n    function showChangelog (lastVersion) {\n      var $scope = $rootScope.$new()\n      $scope.lastVersion = lastVersion\n\n      $modal.open({\n        controller: 'ChangelogModalController',\n        templateUrl: templateUrl('changelog_modal'),\n        scope: $scope,\n        windowClass: 'changelog_modal_window mobile_modal'\n      })\n    }\n\n    return {\n      checkUpdate: checkUpdate,\n      showChangelog: showChangelog\n    }\n  })\n\n  .service('HttpsMigrateService', function (ErrorService, Storage) {\n    var started = false\n\n    function check () {\n      Storage.get('https_dismiss').then(function (ts) {\n        if (!ts || tsNow() > ts + 43200000) {\n          ErrorService.confirm({\n            type: 'MIGRATE_TO_HTTPS'\n          }).then(function () {\n            var popup\n            try {\n              popup = window.open('https://web.telegram.org', '_blank')\n            } catch (e) {}\n            if (!popup) {\n              location.href = 'https://web.telegram.org'\n            }\n          }, function () {\n            Storage.set({https_dismiss: tsNow()})\n          })\n        }\n      })\n    }\n\n    function start () {\n      if (started ||\n        location.protocol != 'http:' ||\n        Config.Modes.http ||\n        Config.App.domains.indexOf(location.hostname) == -1) {\n        return\n      }\n      started = true\n      setTimeout(check, 120000)\n    }\n\n    return {\n      start: start,\n      check: check\n    }\n  })\n\n  .service('LayoutSwitchService', function (ErrorService, Storage, AppRuntimeManager, $window) {\n    var started = false\n    var confirmShown = false\n\n    function switchLayout (mobile) {\n      ConfigStorage.noPrefix()\n      Storage.set({\n        layout_selected: mobile ? 'mobile' : 'desktop',\n        layout_width: $(window).width()\n      }).then(function () {\n        AppRuntimeManager.reload()\n      })\n    }\n\n    function layoutCheck (e) {\n      if (confirmShown) {\n        return\n      }\n      var width = $(window).width()\n      var newMobile = width < 600\n      if (!width ||\n        !e && (Config.Navigator.mobile ? width <= 800 : newMobile)) {\n        return\n      }\n      if (newMobile != Config.Mobile) {\n        ConfigStorage.noPrefix()\n        Storage.get('layout_width').then(function (confirmedWidth) {\n          if (width == confirmedWidth) {\n            return false\n          }\n          confirmShown = true\n          ErrorService.confirm({\n            type: newMobile ? 'SWITCH_MOBILE_VERSION' : 'SWITCH_DESKTOP_VERSION'\n          }).then(function () {\n            switchLayout(newMobile)\n          }, function () {\n            ConfigStorage.noPrefix()\n            Storage.set({layout_width: width})\n            confirmShown = false\n          })\n        })\n      }\n    }\n\n    function start () {\n      if (started || Config.Navigator.mobile) {\n        return\n      }\n      started = true\n      layoutCheck()\n      $($window).on('resize', layoutCheck)\n    }\n\n    return {\n      start: start,\n      switchLayout: switchLayout\n    }\n  })\n\n  .service('TelegramMeWebService', function (Storage) {\n    var disabled = Config.Modes.test ||\n      Config.App.domains.indexOf(location.hostname) == -1 ||\n      location.protocol != 'http:' && location.protocol != 'https:' ||\n      location.protocol == 'https:' && location.hostname != 'web.telegram.org'\n\n    function sendAsyncRequest (canRedirect) {\n      if (disabled) {\n        return false\n      }\n      Storage.get('tgme_sync').then(function (curValue) {\n        var ts = tsNow(true)\n        if (canRedirect &&\n          curValue &&\n          curValue.canRedirect == canRedirect &&\n          curValue.ts + 86400 > ts) {\n          return false\n        }\n        Storage.set({tgme_sync: {canRedirect: canRedirect, ts: ts}})\n\n        var script1 = $('<script>').appendTo('body')\n          .on('load error', function () {\n            script1.remove()\n          })\n          .attr('src', '//telegram.me/_websync_?authed=' + (canRedirect ? '1' : '0'))\n\n        var script2 = $('<script>').appendTo('body')\n          .on('load error', function () {\n            script2.remove()\n          })\n          .attr('src', '//t.me/_websync_?authed=' + (canRedirect ? '1' : '0'))\n      })\n    }\n\n    return {\n      setAuthorized: sendAsyncRequest\n    }\n  })\n\n  .service('LocationParamsService', function (qSync, $rootScope, $routeParams, AppPeersManager, AppUsersManager, AppChatsManager, AppMessagesManager, AppMessagesIDsManager, MtpApiManager, ApiUpdatesManager, PeersSelectService, AppStickersManager, ErrorService) {\n    var tgAddrRegExp = /^(web\\+)?tg:(\\/\\/)?(.+)/\n\n    function checkLocationTgAddr () {\n      var tgaddr = $routeParams.tgaddr\n      if (tgaddr) {\n        if (!tgaddr.match(/[=&?]/)) {\n          try {\n            tgaddr = decodeURIComponent(tgaddr)\n          } catch (e) {}\n        }\n        var matches = tgaddr.match(tgAddrRegExp)\n        if (matches) {\n          handleTgProtoAddr(matches[3])\n        }\n      }\n    }\n\n    function handleTgProtoAddr (url, inner) {\n      var matches\n\n      if (matches = url.match(/^resolve\\?domain=(.+?)(?:&(start|startgroup|post|game)=(.+))?$/)) {\n        AppPeersManager.resolveUsername(matches[1]).then(function (peerID) {\n          if (peerID > 0 && AppUsersManager.isBot(peerID) &&\n              (matches[2] == 'startgroup' || matches[2] == 'game')) {\n            var isStartGroup = matches[2] == 'startgroup'\n            PeersSelectService.selectPeer({\n              confirm_type: isStartGroup ? 'INVITE_TO_GROUP' : 'INVITE_TO_GAME',\n              noUsers: isStartGroup\n            }).then(function (toPeerString) {\n              var toPeerID = AppPeersManager.getPeerID(toPeerString)\n              var sendPromise\n              if (isStartGroup) {\n                var toChatID = toPeerID < 0 ? -toPeerID : 0\n                sendPromise = AppMessagesManager.startBot(peerID, toChatID, matches[3])\n              } else {\n                inputGame = {\n                  _: 'inputGameShortName',\n                  bot_id: AppUsersManager.getUserInput(peerID),\n                  short_name: matches[3]\n                }\n                sendPromise = AppMessagesManager.shareGame(peerID, toPeerID, inputGame)\n              }\n              sendPromise.then(function () {\n                $rootScope.$broadcast('history_focus', {peerString: toPeerString})\n              })\n            })\n            return true\n          }\n\n          var params = {\n            peerString: AppPeersManager.getPeerString(peerID)\n          }\n\n          if (matches[2] == 'start') {\n            params.startParam = matches[3]\n          }\n          else if (matches[2] == 'post') {\n            params.messageID = AppMessagesIDsManager.getFullMessageID(parseInt(matches[3]), -peerID)\n          }\n\n          $rootScope.$broadcast('history_focus', params)\n        })\n        return true\n      }\n\n      if (matches = url.match(/^join\\?invite=(.+)$/)) {\n        openChatInviteLink(matches[1])\n        return true\n      }\n\n      if (matches = url.match(/^addstickers\\?set=(.+)$/)) {\n        AppStickersManager.openStickersetLink(matches[1])\n        return true\n      }\n\n      if (matches = url.match(/^msg_url\\?url=([^&]+)(?:&text=(.*))?$/)) {\n        var url = decodeURIComponent(matches[1])\n        var text = matches[2] ? decodeURIComponent(matches[2]) : ''\n        shareUrl(url, text)\n        return true\n      }\n\n      if (inner &&\n        (matches = url.match(/^unsafe_url\\?url=([^&]+)/))) {\n        var url = decodeURIComponent(matches[1])\n        ErrorService.confirm({\n          type: 'JUMP_EXT_URL',\n          url: url\n        }).then(function () {\n          var target = '_blank'\n          if (url.search('https://telegram.me/') === 0 ||\n              url.search('https://t.me/') === 0) {\n            target = '_self'\n          }\n          else if (!url.match(/^https?:\\/\\//)) {\n            url = 'http://' + url\n          }\n          var popup = window.open(url, target)\n          try {\n            popup.opener = null;\n          } catch (e) {}\n        })\n        return true\n      }\n\n      if (matches = url.match(/^search_hashtag\\?hashtag=(.+?)$/)) {\n        $rootScope.$broadcast('dialogs_search', {query: '#' + decodeURIComponent(matches[1])})\n        if (Config.Mobile) {\n          $rootScope.$broadcast('history_focus', {\n            peerString: ''\n          })\n        }\n        return true\n      }\n\n      if (inner &&\n        (matches = url.match(/^bot_command\\?command=(.+?)(?:&bot=(.+))?$/))) {\n        var peerID = $rootScope.selectedPeerID\n        var text = '/' + matches[1]\n        if (peerID < 0 && matches[2]) {\n          text += '@' + matches[2]\n        }\n        AppMessagesManager.sendText(peerID, text)\n\n        $rootScope.$broadcast('history_focus', {\n          peerString: AppPeersManager.getPeerString(peerID)\n        })\n        return true\n      }\n\n      return false\n    }\n\n    function handleActivityMessage (name, data) {\n      console.log(dT(), 'Received activity', name, data)\n\n      if (name == 'share' && data.url) {\n        shareUrl(data.url, '')\n      }\n      else if (name == 'view' && data.url) {\n        var matches = data.url.match(tgAddrRegExp)\n        if (matches) {\n          handleTgProtoAddr(matches[3])\n        }\n      }\n      else if (name == 'webrtc-call' && data.contact) {\n        var contact = data.contact\n        var phones = []\n        if (contact.tel != undefined) {\n          for (var i = 0; i < contact.tel.length; i++) {\n            phones.push(contact.tel[i].value)\n          }\n        }\n        var firstName = (contact.givenName || []).join(' ')\n        var lastName = (contact.familyName || []).join(' ')\n\n        if (phones.length) {\n          AppUsersManager.importContact(phones[0], firstName, lastName).then(function (foundUserID) {\n            if (foundUserID) {\n              var peerString = AppPeersManager.getPeerString(foundUserID)\n              $rootScope.$broadcast('history_focus', {peerString: peerString})\n            } else {\n              ErrorService.show({\n                error: {code: 404, type: 'USER_NOT_USING_TELEGRAM'}\n              })\n            }\n          })\n        }\n      }\n      else if (name === 'share' && data.blobs && data.blobs.length > 0) {\n        PeersSelectService.selectPeers({confirm_type: 'EXT_SHARE_PEER', canSend: true}).then(function (peerStrings) {\n          angular.forEach(peerStrings, function (peerString) {\n            var peerID = AppPeersManager.getPeerID(peerString)\n            angular.forEach(data.blobs, function (blob) {\n              AppMessagesManager.sendFile(peerID, blob, {isMedia: true})\n            })\n          })\n          if (peerStrings.length == 1) {\n            $rootScope.$broadcast('history_focus', {peerString: peerStrings[0]})\n          }\n        })\n      }\n    }\n\n    var started = false\n    function start () {\n      if (started) {\n        return\n      }\n      started = true\n\n      if (window.navigator.mozSetMessageHandler) {\n        console.log(dT(), 'Set activity message handler')\n        window.navigator.mozSetMessageHandler('activity', function (activityRequest) {\n          handleActivityMessage(activityRequest.source.name, activityRequest.source.data)\n        })\n      }\n\n      $(document).on('click', function (event) {\n        var target = event.target\n        if (target &&\n          target.tagName == 'A' &&\n          !target.onclick &&\n          !target.onmousedown) {\n          var href = $(target).attr('href') || target.href || ''\n          var match = href.match(tgAddrRegExp)\n          if (match) {\n            if (handleTgProtoAddr(match[3], true)) {\n              return cancelEvent(event)\n            }\n          }\n        }\n      })\n\n      $(document).on('mousedown', function (event) {\n        var target = event.target\n        if (target &&\n            target.tagName == 'A') {\n          var href = $(target).attr('href') || target.href || ''\n          if (Config.Modes.chrome_packed && \n              href.length &&\n              $(target).attr('target') == '_blank') {\n            $(target).attr('rel', '')\n          }\n        }\n      })\n\n      $rootScope.$on('$routeUpdate', checkLocationTgAddr)\n      checkLocationTgAddr()\n    }\n\n    function openUrl(url) {\n      var match = url.match(tgAddrRegExp)\n      if (match) {\n        if (handleTgProtoAddr(match[3], true)) {\n          return true\n        }\n      }\n      var popup = window.open(url, '_blank')\n      try {\n        popup.opener = null;\n      } catch (e) {}\n      return popup ? true : false\n    }\n\n    function shareUrl (url, text, shareLink) {\n      var options = {}\n      if (shareLink) {\n        options.shareLinkPromise = qSync.when(url)\n      }\n      PeersSelectService.selectPeer(options).then(function (toPeerString) {\n        $rootScope.$broadcast('history_focus', {\n          peerString: toPeerString,\n          attachment: {\n            _: 'share_url',\n            url: url,\n            text: text\n          }\n        })\n      })\n    }\n\n    function openChatInviteLink (hash) {\n      return MtpApiManager.invokeApi('messages.checkChatInvite', {\n        hash: hash\n      }).then(function (chatInvite) {\n        var chatTitle\n        if (chatInvite._ == 'chatInviteAlready') {\n          AppChatsManager.saveApiChat(chatInvite.chat)\n          var canJump = !chatInvite.chat.pFlags.left ||\n            AppChatsManager.isChannel(chatInvite.chat.id) && chatInvite.chat.username\n          if (canJump) {\n            return $rootScope.$broadcast('history_focus', {\n              peerString: AppChatsManager.getChatString(chatInvite.chat.id)\n            })\n          }\n          chatTitle = chatInvite.chat.title\n        } else {\n          chatTitle = chatInvite.title\n        }\n        ErrorService.confirm({\n          type: (chatInvite.pFlags.channel && !chatInvite.pFlags.megagroup) ? 'JOIN_CHANNEL_BY_LINK' : 'JOIN_GROUP_BY_LINK',\n          title: chatTitle\n        }).then(function () {\n          return MtpApiManager.invokeApi('messages.importChatInvite', {\n            hash: hash\n          }).then(function (updates) {\n            ApiUpdatesManager.processUpdateMessage(updates)\n\n            if (updates.chats && updates.chats.length == 1) {\n              $rootScope.$broadcast('history_focus', {peerString: AppChatsManager.getChatString(updates.chats[0].id)\n              })\n            }\n            else if (updates.updates && updates.updates.length) {\n              for (var i = 0, len = updates.updates.length, update; i < len; i++) {\n                update = updates.updates[i]\n                if (update._ == 'updateNewMessage') {\n                  $rootScope.$broadcast('history_focus', {peerString: AppChatsManager.getChatString(update.message.to_id.chat_id)\n                  })\n                  break\n                }\n              }\n            }\n          })\n        })\n      })\n    }\n\n    return {\n      start: start,\n      shareUrl: shareUrl,\n      openUrl: openUrl\n    }\n  })\n\n  .service('DraftsManager', function ($rootScope, qSync, MtpApiManager, ApiUpdatesManager, AppMessagesIDsManager, AppChatsManager, AppPeersManager, RichTextProcessor, Storage, ServerTimeManager) {\n    var cachedServerDrafts = {}\n\n    $rootScope.$on('apiUpdate', function (e, update) {\n      if (update._ != 'updateDraftMessage') {\n        return\n      }\n      var peerID = AppPeersManager.getPeerID(update.peer)\n      saveDraft(peerID, update.draft, {notify: true, local: update.local})\n    })\n\n    return {\n      getDraft: getDraft,\n      getServerDraft: getServerDraft,\n      saveDraft: saveDraft,\n      changeDraft: changeDraft,\n      clearDraft: clearDraft,\n      syncDraft: syncDraft\n    }\n\n    function getDraft (peerID, unsyncOnly) {\n      // console.warn(dT(), 'get draft', peerID, unsyncOnly)\n      return Storage.get('draft' + peerID).then(function (draft) {\n        if (typeof draft === 'string') {\n          if (draft.length > 0) {\n            draft = {\n              text: draft\n            }\n          } else {\n            draft = false\n          }\n        }\n        if (!draft && !unsyncOnly) {\n          draft = getServerDraft(peerID)\n          // console.warn(dT(), 'server', draft)\n        } else {\n          // console.warn(dT(), 'local', draft)\n        }\n        var replyToMsgID = draft && draft.replyToMsgID\n        if (replyToMsgID) {\n          var channelID = AppPeersManager.isChannel(peerID) ? -peerID : false\n          draft.replyToMsgID = AppMessagesIDsManager.getFullMessageID(replyToMsgID, channelID)\n        }\n        return draft\n      })\n    }\n\n    function getServerDraft (peerID) {\n      var cached = cachedServerDrafts[peerID]\n      if (cached !== undefined) {\n        return cached\n      }\n      return false\n    }\n\n    function saveDraft (peerID, apiDraft, options) {\n      options = options || {}\n      var draft = processApiDraft(apiDraft)\n      cachedServerDrafts[peerID] = draft\n\n      if (options.notify) {\n        // console.warn(dT(), 'save draft', peerID, apiDraft, options)\n        changeDraft(peerID, draft)\n        $rootScope.$broadcast('draft_updated', {\n          peerID: peerID,\n          draft: draft,\n          local: options.local\n        })\n      }\n\n      return draft\n    }\n\n    function changeDraft (peerID, draft) {\n      // console.warn(dT(), 'change draft', peerID, draft)\n      if (!peerID) {\n        console.trace('empty peerID')\n      }\n      if (peerID < 0 &&\n          !AppChatsManager.hasRights(-peerID, 'send')) {\n        draft = false\n      }\n      if (!draft) {\n        draft = {\n          text: '',\n          replyToMsgID: 0\n        }\n      }\n      draft.replyToMsgID = draft.replyToMsgID\n        ? AppMessagesIDsManager.getMessageLocalID(draft.replyToMsgID)\n        : 0\n\n      var draftKey = 'draft' + peerID\n\n      if (!isEmptyDraft(draft)) {\n        var backupDraftObj = {}\n        backupDraftObj[draftKey] = draft\n        Storage.set(backupDraftObj)\n      } else {\n        Storage.remove(draftKey)\n      }\n    }\n\n    function clearDraft (peerID, alsoSync) {\n      changeDraft(peerID)\n      ApiUpdatesManager.processUpdateMessage({\n        _: 'updateShort',\n        update: {\n          _: 'updateDraftMessage',\n          peer: AppPeersManager.getOutputPeer(peerID),\n          draft: {_: 'draftMessageEmpty'},\n          local: true\n        }\n      })\n      if (alsoSync) {\n        syncDraft(peerID)\n      }\n    }\n\n    function draftsAreEqual (draft1, draft2) {\n      var isEmpty1 = isEmptyDraft(draft1)\n      var isEmpty2 = isEmptyDraft(draft2)\n      if (isEmpty1 && isEmpty2) {\n        return true\n      }\n      if (isEmpty1 != isEmpty2) {\n        return false\n      }\n      if (draft1.replyToMsgID != draft2.replyToMsgID) {\n        return false\n      }\n      if (draft1.text != draft2.text) {\n        return false\n      }\n      return true\n    }\n\n    function isEmptyDraft (draft) {\n      if (!draft) {\n        return true\n      }\n      if (draft.replyToMsgID > 0) {\n        return false\n      }\n      if (typeof draft.text !== 'string' || !draft.text.length) {\n        return true\n      }\n      return false\n    }\n\n    function processApiDraft (draft) {\n      if (!draft || draft._ != 'draftMessage') {\n        return false\n      }\n\n      var entities = RichTextProcessor.parseEntities(draft.message)\n      var serverEntities = draft.entities || []\n      entities = RichTextProcessor.mergeEntities(entities, serverEntities)\n\n      var text = RichTextProcessor.wrapDraftText(draft.message, {entities: entities})\n      var richMessage = RichTextProcessor.wrapRichText(draft.message, {noLinks: true, noLinebreaks: true})\n\n      return {\n        text: text,\n        richMessage: richMessage,\n        replyToMsgID: draft.reply_to_msg_id || 0,\n        date: draft.date - ServerTimeManager.serverTimeOffset\n      }\n    }\n\n    function syncDraft (peerID) {\n      // console.warn(dT(), 'sync draft', peerID)\n      getDraft(peerID, true).then(function (localDraft) {\n        var serverDraft = cachedServerDrafts[peerID]\n        if (draftsAreEqual(serverDraft, localDraft)) {\n          // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n          return\n        }\n        // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n        var params = {\n          flags: 0,\n          peer: AppPeersManager.getInputPeerByID(peerID)\n        }\n        var draftObj\n        if (isEmptyDraft(localDraft)) {\n          draftObj = {_: 'draftMessageEmpty'}\n          params.message = ''\n        } else {\n          draftObj = {_: 'draftMessage'}\n          var message = localDraft.text\n          var entities = []\n          message = RichTextProcessor.parseEmojis(message)\n          message = RichTextProcessor.parseMarkdown(message, entities, true)\n          if (localDraft.replyToMsgID > 0) {\n            params.flags |= 1\n            params.reply_to_msg_id = localDraft.replyToMsgID\n            draftObj.reply_to_msg_id = localDraft.replyToMsgID\n          }\n          if (entities.length) {\n            params.flags |= 8\n            params.entities = entities\n            draftObj.entities = entities\n          }\n          params.message = message\n          draftObj.message = message\n        }\n        MtpApiManager.invokeApi('messages.saveDraft', params).then(function () {\n          draftObj.date = tsNow(true) + ServerTimeManager.serverTimeOffset\n          saveDraft(peerID, draftObj, {notify: true, local: true})\n        })\n      })\n    }\n  })\n"
  },
  {
    "path": "app/less/app.less",
    "content": "@import \"lib/mixins\";\n\n/* app common css */\n\nhtml {\n  background: #e7ebf0;\n  overflow: visible;\n}\n\nbody {\n  color: #000;\n  background: none;\n  font: 12px/18px 'Open Sans', \"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, Verdana, sans-serif;\n  overflow: hidden;\n\n  &.non_osx {\n    font: 13px/18px Tahoma, sans-serif, Arial, Helvetica;\n  }\n}\n\nh1, h2, h3, h4, h5 {\n  color: #222;\n}\n\n.non_osx {\n  h4 {\n    font-size: 17px;\n  }\n}\n\n.noselect {\n  .user-select(none);\n}\n\n.hasselect {\n  .user-select(text);\n}\n\n.copyonly {\n  color: transparent;\n  display: inline-block;\n  vertical-align: baseline;\n  width: 1px;\n  height: 0px;\n  background: none 0 no-repeat;\n  font-size: 0px;\n  float: left;\n  text-rendering: auto;\n  .user-select(none);\n}\n.nocopy::before {\n  content: attr(data-content);\n}\n\npre {\n  margin-bottom: 0;\n  overflow: auto;\n  padding: 3px;\n  border: 1px solid #eee;\n  max-height: none;\n  font-size: inherit;\n}\n\na {\n  cursor: pointer;\n\n  &.disabled {\n    cursor: default;\n    pointer-events: none;\n  }\n}\n\n.form-control {\n  border: 1px solid #d9dbde;\n  border-radius: 2px;\n\n  .box-shadow(none);\n\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n\n  &:focus {\n    border-color: #66afe9;\n    outline: 0;\n\n    @shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n    .box-shadow(@shadow);\n  }\n\n  &.no_outline {\n    &:focus {\n      border: 1px solid #d9dbde;\n      outline: none;\n\n      .box-shadow(none);\n    }\n  }\n\n  &::-moz-placeholder,\n  &:-ms-input-placeholder,\n  &::-webkit-input-placeholder {\n    color: #b3b3b3;\n  }\n}\n\ninput[type=\"number\"] {\n  &::-webkit-outer-spin-button,\n  &::-webkit-inner-spin-button {\n    -webkit-appearance: none;\n    margin: 0;\n  }\n\n  -moz-appearance:textfield;\n}\n\n.btn {\n  border: 0;\n  padding: 7px 13px;\n\n  &:hover,\n  &:active,\n  &.active,\n  &:focus,\n  &:active:focus,\n  &.active:focus,\n  .open &.dropdown-toggle {\n    .box-shadow(none);\n    outline: none;\n  }\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #6ec26d;\n\n  &:hover,\n  &:focus,\n  &:active,\n  &.active,\n  .open &.dropdown-toggle {\n    color: #ffffff;\n    background-color: #61b75b;\n  }\n\n  &:active,\n  &.active,\n  .open &.dropdown-toggle {\n    background: #66b864;\n    background-image: none;\n  }\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #c05f5a;\n\n  &:hover,\n  &:focus,\n  &:active,\n  &.active,\n  .open &.dropdown-toggle {\n    color: #ffffff;\n    background-color: #ab5450;\n  }\n\n  &:active,\n  &.active,\n  .open &.dropdown-toggle {\n    background: #a24f4b;\n    background-image: none;\n  }\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #6490b1;\n  border-radius: 3px;\n\n  &:hover,\n  &:focus,\n  &:active,\n  &.active,\n  .open &.dropdown-toggle {\n    color: #ffffff;\n    background-color: #4a80a9;\n  }\n\n  &:active,\n  &.active,\n  .open &.dropdown-toggle {\n    background: #41769e;\n    background-image: none;\n  }\n\n  &[disabled],\n  &.disabled {\n    background: #7999b3;\n  }\n}\n\n.btn-link {\n  color: #3a6d99;\n  text-decoration: none !important;\n  border-radius: 3px;\n  overflow: hidden;\n\n  &:hover {\n    background: #f2f6fa;\n  }\n\n  &.btn-link-noarea:hover,\n  &.dropdown-toggle:hover {\n    background: none;\n  }\n\n  &.dropdown-toggle:active {\n    outline: none;\n  }\n}\n\n.btn-md {\n  background: none;\n  text-decoration: none !important;\n  border-radius: 2px;\n  overflow: hidden;\n  text-transform: uppercase;\n  font-size: 13px;\n  padding: 6px 10px;\n  font-weight: bold;\n\n  &,\n  &:focus,\n  &:hover {\n    color: #72a0c7;\n  }\n\n  &:hover {\n    background: #f2f6fa;\n  }\n}\n\n.btn-md-primary {\n  &,\n  &:focus,\n  &:hover {\n    color: #4680b3;\n  }\n}\n\n.btn-md-danger {\n  &,\n  &:focus,\n  &:hover {\n    color: #c05f5a;\n  }\n\n  &:hover {\n    background: #fbe7e6;\n  }\n}\n\n.md-input-group {\n  height: 50px;\n  border-bottom: 1px solid #e6e6e6;\n  padding: 0;\n  margin: 0 0 22px;\n}\n.md-textarea-group {\n  height: 66px;\n}\n.md-input-grouped {\n  margin-bottom: 12px;\n}\n\n.md-input-label {\n  font-weight: normal;\n  color: #999;\n  cursor: pointer;\n  display: block;\n  font-size: 13px;\n  margin: 0;\n  padding: 0;\n  z-index: 1;\n  pointer-events: none;\n  -webkit-font-smoothing: antialiased;\n\n  transform-origin: left center;\n  -webkit-transform-origin: left center;\n\n  -webkit-transform: translate3d(0, 22px, 0);\n  transform: translate3d(0, 22px, 0);\n\n  span.ng-enter-prepare {\n    display: none;\n  }\n}\n\n.md-input-animated {\n  .md-input-group,\n  .md-input-label {\n    -webkit-transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n  }\n}\n\n.md-input {\n  color: #000;\n  background: #fff;\n  display: inline-block;\n  border: 0;\n  outline: 0;\n  font-size: 13px;\n  padding: 3px 0;\n  margin: 3px 0 0;\n  width: 100%;\n  resize: none;\n\n  .box-shadow(none);\n}\n.md-input-disabled .md-input {\n  color: #999;\n}\n.md-input-focused {\n  border-bottom: 2px solid #6bace1;\n}\n\n.md-input-error {\n  border-bottom: 2px solid #e2726f;\n\n  .md-input-label {\n    color: #d45a58;\n  }\n}\n\n.md-input-has-value {\n  .md-input-label {\n    -webkit-transform: scale(0.9);\n    transform: scale(0.9);\n  }\n}\n\n.md-input-group-centered {\n  &,\n  .md-input {\n    text-align: center;\n  }\n\n  .md-input-label {\n    transform-origin: center center;\n    -webkit-transform-origin: center center;\n  }\n}\n\n.md_modal {\n  &_head {\n    color: #fff;\n    background: #5580a3;\n    padding: 0 0 28px 26px;\n  }\n\n  &_head_simple {\n    padding-bottom: 13px;\n  }\n\n  &_actions_wrap {\n    float: right;\n  }\n}\n\na {\n  &.md_modal_action {\n    display: block;\n    float: right;\n    color: #dde8f1;\n    padding: 19px 15px 5px;\n    font-weight: bold;\n  }\n\n  &.md_modal_action:hover {\n    color: #fff;\n  }\n\n  &.md_modal_action_close {\n    padding-right: 22px;\n  }\n\n  &.md_modal_action:hover,\n  &.md_modal_action:focus,\n  &.md_modal_action:active {\n    text-decoration: none;\n  }\n}\n\n.md_modal_title {\n  font-weight: bold;\n  padding: 18px 0 5px;\n  font-size: 13px;\n}\n\n.navbar_offline {\n  .navbar-header,\n  .navbar-offline > li {\n    float: left;\n  }\n}\n\n.navbar-offline {\n  max-width: 400px;\n  margin: 0 auto;\n  float: none;\n\n  &-text {\n    color: #b9cfe3;\n    padding: 13px 15px;\n    font-size: 13px;\n    display: block;\n    line-height: 20px;\n  }\n}\n\n.tg_progress {\n  height: 12px;\n  margin: 0;\n  padding: 0;\n  background: rgba(255,255,255, 0.4);\n  border: 5px solid rgba(0,0,0, 0.5);\n  border-radius: 3px;\n\n  .progress-bar {\n    height: 5px;\n    line-height: 2px;\n    background: rgba(255,255,255, 0.9);\n    border-radius: 0;\n    overflow: hidden;\n  }\n}\n\n.progress-arc-wrap {\n  display: block;\n  border-radius: 100%;\n\n  transform-origin: center center;\n  -webkit-animation:  infinite_rotation 0.8s linear infinite;\n  -moz-animation:     infinite_rotation 0.8s linear infinite;\n  -ms-animation:      infinite_rotation 0.8s linear infinite;\n  animation:          infinite_rotation 0.8s linear infinite;\n}\n.progress-arc .progress-arc-bar {\n  stroke-dashoffset: 0;\n  transform-origin: center center;\n  fill: transparent;\n\n  .progress-arc-intermediate & {\n    stroke: #68a4d1;\n  }\n\n  .composer_progress_icon & {\n    stroke: #b3b3b3;\n  }\n\n  .progress-arc-percent & {\n    stroke: #FFF;\n    stroke: rgba(255,255,255,0.95);\n\n    transition: stroke-dasharray 500ms linear;\n  }\n}\n.stop0 {\n  stop-opacity: 1.0;\n  stop-color: #68a4d1;\n  .composer_progress_icon & {\n    stop-color: #b3b3b3;\n  }\n}\n.stop60 {\n  stop-opacity: 1.0;\n  stop-color: #68a4d1;\n  .composer_progress_icon & {\n    stop-color: #b3b3b3;\n  }\n}\n.stop100 {\n  stop-opacity: 0.0;\n  stop-color: #68a4d1;\n  .composer_progress_icon & {\n    stop-color: #b3b3b3;\n  }\n}\n\n/* Infinite rotation */\n@-webkit-keyframes infinite_rotation {\n  0% {\n    transform: rotate(0);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-moz-keyframes infinite_rotation {\n  0% {\n    transform: rotate(0);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-ms-keyframes infinite_rotation {\n  0% {\n    transform: rotate(0);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@keyframes infinite_rotation {\n  0% {\n    transform: rotate(0);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n\n\n.dropdown-menu {\n  border-radius: 2px;\n  padding: 0;\n\n  .box-shadow(0 1px 3px rgba(0, 0, 0, 0.175));\n\n  &-to-up {\n    top: auto;\n    bottom: 100%;\n    margin: 0 0 3px;\n  }\n}\n\n.dropdown-menu {\n  & > li {\n    & > a {\n      padding: 5px 14px;\n      font-size: 13px;\n    }\n  }\n}\n\n.modal-backdrop {\n  background: rgba(26, 26, 26, 0.7);\n  opacity: 1 !important;\n  /*opacity: 0.25 !important;*/\n}\n.modal.fade .modal-dialog {\n  .noTransition();\n}\n.modal.fade,\n.modal-backdrop.fade {\n  .noTransition();\n}\n\n.text-invisible {\n  visibility: hidden;\n}\n\n.modal {\n  overflow-y: auto;\n  padding: 10px;\n\n  &-dialog {\n    margin: 0 auto;\n  }\n\n  &-content {\n    border: 0;\n    border-radius: 0;\n\n    .box-shadow(0 1px 10px rgba(0, 0, 0, 0.15));\n  }\n\n  &-header {\n    padding: 12px 0 4px 3px;\n    border-bottom: 2px solid #E1E1E1;\n    margin: 0 18px;\n  }\n\n  &-title {\n    color: #222;\n    font-weight: bold;\n    font-size: 17px;\n    line-height: 1.4;\n  }\n\n  &-close-link,\n  &-head-link {\n    font-size: 12px;\n    line-height: 1.4;\n    float: right;\n    padding: 0 2px 0;\n    margin: 6px 2px 0 0;\n\n    &:hover {\n      text-decoration: none;\n    }\n  }\n\n  &-head-link {\n    margin-right: 15px;\n  }\n\n  &-close-button {\n    position: absolute;\n    z-index: 1051;\n    top: 0;\n    right: 0;\n    width: 54px;\n    height: 54px;\n\n    i {\n      display: inline-block;\n      width: 12px;\n      height: 12px;\n      margin: 21px;\n      opacity: 0.8;\n      .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n      background-position: -15px -320px;\n    }\n  }\n\n  &-close-button:hover {\n    i {\n      opacity: 1;\n    }\n  }\n\n  &-body {\n    padding: 14px 14px;\n  }\n\n  &-footer {\n    padding: 0 14px 13px;\n    margin: 0;\n    border-top: 0;\n  }\n}\n\n.modal_simple {\n  &_header {\n    font-size: 14px;\n    margin: 0 0 10px;\n    text-align: center;\n    font-weight: bold;\n  }\n\n  &_form {\n    max-width: 276px;\n    margin: 0 auto;\n    /*padding: 70px 0 50px;*/\n\n    h4 {\n      font-size: 14px;\n      margin-bottom: 38px;\n      text-align: left;\n    }\n\n    .form-group {\n      margin-bottom: 13px;\n    }\n  }\n\n  &_form_description {\n    color: #777;\n    line-height: 160%;\n    margin: 10px 0 0;\n    text-align: justify;\n  }\n}\n\n.md_simple {\n  &_header {\n    font-size: 14px;\n    margin: 0 0 10px;\n    font-weight: bold;\n  }\n\n  &_modal_body {\n    padding: 40px 37px 0;\n\n    .modal_simple_form {\n      max-width: none;\n      margin: 0;\n      padding: 0;\n    }\n\n    .modal_simple_form h4 {\n      font-size: 14px;\n      margin-top: 0;\n      margin-bottom: 38px;\n      text-align: left;\n      font-weight: bold;\n    }\n  }\n\n  &_form_description {\n    color: #777;\n    line-height: 160%;\n    margin: 0 0 10px;\n    text-align: justify;\n  }\n\n  &_modal_footer {\n    text-align: right;\n    padding: 10px 27px 15px;\n\n    .btn {\n      margin-left: 10px;\n    }\n  }\n}\n\n.modal_section {\n  &_header {\n    font-size: 12px;\n    line-height: 14px;\n    color: #999;\n    background: #f5f5f5;\n    padding: 7px 14px;\n    margin: 0;\n  }\n\n  &_body {\n    padding: 14px 14px;\n\n    p,\n    dl {\n      margin: 5px 0;\n    }\n  }\n\n  &:last-child &_body {\n    padding-bottom: 8px;\n  }\n}\n\na.tg_checkbox, p.tg_checkbox {\n  color: #000;\n  display: block;\n  line-height: 18px;\n  padding: 8px 0;\n  margin: 9px 0;\n\n  &:hover {\n    text-decoration: none;\n  }\n}\n\n.tg_checkbox {\n  span.icon-checkbox-outer {\n    float: right;\n    display: inline-block;\n    background-color: #e6e6e6;\n    width: 36px;\n    height: 14px;\n    line-height: 14px;\n    vertical-align: middle;\n    border-radius: 8px;\n    margin: 3px 0px 3px 0;\n    -webkit-transition: background-color ease-in-out 0.1s;\n    transition: background-color ease-in-out 0.1s;\n  }\n\n  &.tg_checkbox_on span.icon-checkbox-outer {\n    background-color: #bfd9ed;\n  }\n\n  i.icon-checkbox-inner {\n    display: inline-block;\n    background: #fff;\n    width: 20px;\n    height: 20px;\n    border-radius: 10px;\n    overflow: hidden;\n    float: left;\n    margin-left: -1px;\n    margin-top: -3px;\n    -webkit-transition: all ease 0.1s;\n    transition: all ease 0.1s;\n    border: 1px solid #E7E7E7;\n\n    .box-shadow(0px 0px 1px rgba(0, 0, 0, 0.05));\n  }\n\n  &.tg_checkbox_on i.icon-checkbox-inner {\n    background: #6b9bc2;\n    margin-left: 16px;\n    border: 0;\n\n    .box-shadow(none);\n  }\n}\n\n.tg_checkbox_label {\n  display: inline-block;\n  line-height: 18px;\n  vertical-align: middle;\n}\n/*a.tg_checkbox:hover span.icon-checkbox-outer {\n  background: #bdbdbd;\n}\na.tg_checkbox_on:hover span.icon-checkbox-outer {\n  background: #5785aa;\n}\na.tg_checkbox:hover i.icon-checkbox-inner {\n  background: #f2f2f2;\n}*/\n.tg_radios_wrap {\n  margin: 15px 0;\n}\n\n.tg_radio {\n  a& {\n    color: #000;\n    display: block;\n    line-height: 20px;\n    padding: 5px 0 6px;\n\n    &:hover {\n      text-decoration: none;\n    }\n  }\n\n  .icon-radio-outer {\n    display: inline-block;\n    width: 20px;\n    height: 20px;\n    line-height: 20px;\n    vertical-align: middle;\n    border-radius: 10px;\n    border: 2px solid #d8d8d8;\n    overflow: hidden;\n    margin: 0 8px 0 0;\n\n    -webkit-transition: border-color ease-in-out 0.1s;\n    transition: border-color ease-in-out 0.1s;\n  }\n}\n\ni.icon-radio {\n  display: inline-block;\n  background-color: #fff;\n  width: 16px;\n  height: 16px;\n  line-height: 16px;\n  border-radius: 8px;\n  border: 3px solid #fff;\n  -webkit-transition: background-color ease-in-out 0.1s;\n  transition: background-color ease-in-out 0.1s;\n}\n\n.tg_radio.tg_radio_on .icon-radio-outer {\n  border-color: #5c8db3;\n}\n.tg_radio.tg_radio_on i.icon-radio {\n  background-color: #6b9bc2;\n}\na.tg_radio:hover i.icon-radio {\n  background-color: #f2f2f2;\n}\na.tg_radio_on:hover i.icon-radio {\n  background-color: #5785aa;\n}\n\n.tg_radio_label {\n  display: inline-block;\n  line-height: 20px;\n  vertical-align: middle;\n}\n.tg_range_wrap {\n  line-height: 18px;\n}\n.tg_slider_wrap {\n  position: relative;\n  cursor: pointer;\n  line-height: 18px;\n  height: 18px;\n}\n.tg_slider_track {\n  position: absolute;\n  background: #c4daec;\n  height: 4px;\n  margin: 7px 0;\n  width: 100%;\n  z-index: 2;\n}\n.tg_slider_track_fill {\n  background: #83afd2;\n  height: 4px;\n}\n.tg_slider_thumb {\n  position: absolute;\n  border: 0;\n  background: #6b9bc2;\n  width: 18px;\n  height: 18px;\n  border-radius: 9px;\n  z-index: 3;\n}\n\n.tg_form_group {\n  padding: 6px 0;\n\n  &:first-child {\n  padding-top: 0;\n  }\n  &:last-child {\n    padding-bottom: 0;\n  }\n}\n\n.img_fullsize_with_progress_wrap {\n  position: relative;\n  margin: 0 auto;\n}\n.img_fullsize_progress_overlay {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n}\n.img_fullsize_progress_wrap {\n  position: relative;\n}\n.img_fullsize_progress {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 25px;\n  margin: 0;\n  padding: 0;\n  background: rgba(0,0,0, 0.5);\n  border: 0;\n  border-radius: 0;\n  padding: 10px;\n}\n\n.nano-content {\n  outline: none !important;\n}\n\n/* Login page */\n.login_head_bg {\n  background: #5682a3;\n  height: 226px;\n}\n.login_page {\n  margin: -131px auto 90px;\n  max-width: 404px;\n}\n.login_head_wrap {\n  height: 75px;\n}\n.login_head_logo_link {\n  display: inline-block;\n  line-height: 30px;\n  padding: 23px 15px 22px;\n}\n.tg_logo_wrap {\n  line-height: 30px !important;\n}\n.icon-tg-logo {\n  width: 30px;\n  height: 30px;\n  display: inline-block;\n  vertical-align: top;\n  margin-right: 18px;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -5px -10px;\n}\n.icon-tg-title {\n  width: 62px;\n  height: 14px;\n  display: inline-block;\n  vertical-align: middle;\n  background-image: url('../img/Telegram.svg');\n  background-repeat: no-repeat;\n  background-position: 0 0;\n  margin-top: 1px;\n}\n.login_head_submit_wrap,\n.login_head_submit_progress {\n  float: right;\n}\n.login_head_submit_wrap {\n  font-weight: bold;\n}\n.login_head_submit_btn,\n.login_head_submit_progress {\n  font-size: 13px;\n  line-height: 20px;\n  padding: 27px 15px 28px;\n  display: inline-block;\n  color: #fff;\n}\n.login_head_submit_btn:hover,\n.login_head_submit_btn:focus,\n.login_head_submit_btn:active {\n  color: #fff;\n  text-decoration: none;\n}\n.icon-next-submit {\n  width: 7px;\n  height: 12px;\n  display: inline-block;\n  vertical-align: middle;\n  margin-left: 12px;\n  margin-top: -1px;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -18px -50px;\n}\n\n.login_footer_wrap {\n  color: #84a2bc;\n  font-size: 13px;\n  line-height: 16px;\n  margin-top: 25px;\n  text-align: center;\n}\n.logo_footer_learn_more_link,\n.logo_footer_learn_more_link:hover,\n.logo_footer_learn_more_link:focus,\n.logo_footer_learn_more_link:active {\n  color: #84a2bc;\n  font-weight: bold;\n}\n\n.login_form_wrap {\n  background: #fff;\n  padding: 44px 65px 44px;\n\n  @shadow: 0px 1px 1px rgba(97, 127, 152, 0.2),\n           1px 0px 0 rgba(97, 127, 152, 0.1),\n           -1px 0px 0 rgba(97, 127, 152, 0.1);\n\n  .box-shadow(@shadow);\n\n  border-radius: 2px;\n  border: 0;\n  margin: 0;\n  max-width: none;\n}\n.login_phone_country_input_group {\n  cursor: pointer;\n}\n.login_phone_num_input_group {\n  overflow: hidden;\n}\n.login_phone_code_input_group {\n  float: left;\n  width: 50px;\n  margin-right: 25px;\n}\n\n.login_footer_about_wrap {\n  background: #fff;\n  margin-top: 12px;\n  padding: 44px 65px 44px;\n\n  .box-shadow(0px 1px 0 #dfe5ec);\n\n  border-radius: 3px;\n  border: 1px solid #dfe5ec;\n\n  h3 {\n    margin: 0 0 20px;\n    font-size: 15px;\n    font-weight: bold;\n    text-align: left;\n\n    .login_footer_about_hide {\n      color: #999;\n      font-size: 80%;\n      font-weight: normal;\n      margin-left: 8px;\n    }\n  }\n\n  p {\n    margin: 0 0 20px;\n    font-size: 13px;\n    line-height: 160%;\n\n    &:last-child {\n      margin: 0;\n    }\n  }\n}\n\n.login_form_head {\n  color: #222222;\n  margin: 0 0 20px;\n  font-size: 15px;\n  font-weight: bold;\n}\n.login_form_lead {\n  color: #999;\n  margin: 15px 0 30px;\n  font-size: 13px;\n  line-height: 160%;\n}\n.login_form_hint {\n  color: #999;\n  margin: 0 0 20px;\n  font-size: 13px;\n  line-height: 160%;\n}\n.login_form_messaging {\n  color: #999;\n  font-size: 13px;\n  margin-top: 20px;\n  line-height: 160%;\n}\n.login_phone_head {\n  color: #222222;\n  font-size: 15px;\n  font-weight: bold;\n  text-align: center;\n  margin: 0;\n}\n.login_edit_phone {\n  margin: 5px 0 15px;\n  text-align: center;\n}\n.login_smscode_lead {\n  color: #999;\n  margin: 15px 0 15px;\n  line-height: 160%;\n  text-align: center;\n\n  &:last-child {\n    margin-bottom: 30px;\n  }\n}\n\n.login_forgot_button {\n  text-align: center;\n  margin: 30px 0 10px;\n}\n.login_reset_button {\n  text-align: center;\n  margin: 10px 0 0;\n}\n\n/* IM page start */\n\n/* Dialogs list */\n.im_dialogs_empty_wrap {\n  margin: 60px 50px;\n  text-align: center;\n}\n.im_dialogs_empty_header {\n  font-size: 15px;\n  color: #808080;\n  margin: 0 0 15px;\n}\n.im_dialogs_empty_lead {\n  color: #808080;\n  margin-bottom: 18px;\n}\n.im_dialogs_import_phonebook {\n  margin-top: 10px;\n}\n.im_dialogs_panel {\n  padding: 12px 12px 12px;\n  position: relative;\n  .im_dialogs_modal_col_wrap & {\n    padding: 7px 12px 6px;\n    .box-shadow(0px 1px 1px rgba(0,0,0,0.15));\n    z-index: 1;\n  }\n}\n.im_dialogs_search {\n  position: relative;\n}\n\n.im_dialogs_search_field {\n  font-size: 12px;\n  line-height: normal;\n  border: 1px solid #F2F2F2;\n  border-radius: 2px;\n  padding: 6px 26px 6px 30px;\n  margin: 0 0 0;\n\n  background-color: #F2F2F2;\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -6px -205px;\n\n  .im_dialogs_modal_col_wrap & {\n    background-color: #fff;\n    border-color: #fff !important;\n  }\n\n  &:focus,\n  &:active {\n    background-color: #fff;\n  }\n\n  &::-ms-clear {\n    display: none;\n  }\n}\n\na.tg_search_clear {\n  position: absolute;\n  right: 0;\n  margin-top: -34px;\n  width: 34px;\n  height: 34px;\n  opacity: 0.6;\n\n  .contacts_modal_search & {\n    right: 12px;\n  }\n\n  &:hover {\n    opacity: 1;\n  }\n}\n\ni.icon-search-clear {\n  display: inline-block;\n  color: #999;\n  width: 13px;\n  height: 13px;\n  margin: 10px 0 0 11px;\n  vertical-align: text-top;\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -15px -192px;\n}\n\ni.icon-verified {\n  display: inline-block;\n  width: 17px;\n  height: 17px;\n  vertical-align: text-top;\n  .image-2x('../img/icons/ProfileIcons.png', 40px, 420px);\n  background-position: -11px -373px;\n\n  .im_dialogs_scrollable_wrap & {\n    display: none;\n  }\n  .im_dialogs_col_search & {\n    display: inline-block;\n  }\n\n}\n\n.im_dialogs_scrollable_wrap {\n  outline: none ! important;\n\n  .im_dialog_wrap {\n    margin-top: 0;\n  }\n\n  a.im_dialog {\n    clear: both;\n    overflow: hidden;\n    color: #000;\n    padding: 8px 9px;\n    border-radius: 0;\n\n    &:hover,\n    &_selected {\n      border-radius: 0;\n      background: #f2f6fa;\n    }\n\n    .icon,\n    .glyphicon {\n      display: none;\n    }\n  }\n\n  .active {\n    a.im_dialog {\n      border-radius: 0;\n      background-color: #6490b1;\n\n      &:hover,\n      &_selected {\n        background-color: #6490b1;\n      }\n    }\n  }\n}\n\n.im_dialogs_modal_list {\n  padding-top: 10px;\n}\n\n.im_dialog_message_wrap {\n  overflow: hidden;\n  word-wrap: break-word;\n}\n\n\na.im_dialog {\n  .im_dialog_chat_from_wrap,\n  .im_short_message_media,\n  .im_short_message_service {\n    color: #3a6d99;\n  }\n  .im_short_message_text {\n    color: #808080;\n  }\n  .im_dialog_draft_from {\n    color: #c05f5a;\n  }\n}\n\n\na.im_dialog:hover,\na.im_dialog_selected {\n  .im_short_message_text {\n    color: #698192;\n  }\n}\n\n.active {\n  a.im_dialog {\n    .im_dialog_chat_from_wrap,\n    .im_short_message_media,\n    .im_short_message_service,\n    .im_short_message_text,\n    .im_dialog_message,\n    .im_dialog_draft_from {\n      color: #fff;\n    }\n  }\n}\n\n.im_dialogs_scrollable_wrap a.im_dialog_searchpeer .icon-search-clear {\n  display: inline-block;\n  cursor: pointer;\n  pointer-events: all;\n}\n\n.im_dialogs_scrollable_wrap {\n  a.im_dialog_searchpeer {\n    &,\n    &:hover,\n    &_selected {\n      background: #f3f3f3;\n    }\n  }\n}\n\n\n\n.im_dialog_peer {\n  color: #222;\n  font-weight: bold;\n  margin-top: 2px;\n  margin-bottom: 2px;\n\n  .active & {\n    color: #fff;\n  }\n}\n\n.im_dialog_badge {\n  background: #64c270;\n  font-size: 11px;\n  padding: 5px;\n  border-radius: 11px;\n  min-width: 21px;\n  text-align: center;\n  margin-top: 4px;\n\n  .active & {\n    color: #428bca;\n    background-color: #fff;\n  }\n\n  .im_dialogs_modal_col & {\n    display: none;\n  }\n  &_muted {\n    background: #bfbfbf;\n  }\n}\n\n.im_dialog_unread {\n  background: #c1d6e5;\n  display: inline-block;\n  float: right;\n  width: 8px;\n  height: 8px;\n  border-radius: 5px;\n  overflow: hidden;\n  margin: 12px 0 0;\n\n  a.im_dialog:hover &,\n  a.im_dialog_selected & {\n    background: #a3c0d4;\n  }\n\n  .active & {\n    background-color: #a4c4dd;\n  }\n}\n\n.im_dialog_pinned {\n  display: inline-block;\n  float: right;\n  width: 14px;\n  height: 14px;\n  overflow: hidden;\n  margin: 12px 0 0;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -13px -916px;\n  // background-position: -13px -892px;\n\n  a.im_dialog:hover &,\n  a.im_dialog_selected & {\n    background-position: -13px -916px;\n  }\n\n  .active & {\n    background-position: -13px -916px;\n  }\n}\n\n.im_dialog_date {\n  color: #b3b3b3;\n  font-size: 0.85em;\n\n  a.im_dialog:hover &,\n  a.im_dialog_selected & {\n    color: #91a6ba;\n  }\n  .active &,\n  .active a.im_dialog:hover &,\n  .active a.im_dialog_selected & {\n    color: #b8d1e4;\n  }\n}\n\n.im_dialog_message,\n.im_dialog_peer {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.im_dialog_message_wrap {\n  height: 44px;\n  overflow: hidden;\n}\n.im_dialog_message {\n  color: #808080;\n}\n\n/* IM history */\n.icon-caret {\n  width: 8px;\n  height: 4px;\n\n  display: inline-block;\n  vertical-align: text-top;\n  margin-top: 7px;\n  margin-left: 6px;\n\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -17px -444px;\n}\n\n.im_dialogs_empty_header {\n  font-size: 15px;\n  color: #808080;\n  margin: 0 0 15px;\n}\n.im_dialogs_empty_lead {\n  color: #808080;\n  margin-bottom: 18px;\n}\n.im_history_scrollable_wrap {\n  outline: none ! important;\n  position: relative;\n}\n\n.im_history_to_bottom {\n  overflow: hidden;\n\n  .im_history_scrollable {\n    position: absolute;\n    bottom: 0;\n    width: 100%;\n  }\n}\n\n.im_history_pinned_wrap {\n  padding: 7px 10px 7px 20px;\n  border-bottom: 1px solid #E9EBED;\n}\n.im_history_pinned_message {\n  cursor: pointer;\n}\n.im_history_pinned_message:hover {\n  text-decoration: none;\n}\n.im_history_pinned_hide {\n  float: right;\n  display: block;\n  width: 18px;\n  height: 18px;\n  margin-right: 6px;\n  margin-top: 11px;\n  -webkit-transform: translate3d(0, 0, 0);\n  padding-top: 7px;\n\n  .icon-reply-bar {\n    display: block;\n    background: #999;\n    width: 18px;\n    height: 2px;\n    transform-origin: 50% 50%;\n  }\n\n  &:hover {\n    .icon-reply-bar {\n      background: #44a1e8;\n    }\n  }\n}\n\n\n.im_history {\n  // padding: 20px 0 0 0;\n  padding: 0;\n  position: relative;\n}\n.im_message_unread_split {\n  background: #f0f4f7;\n  color: #8096a8;\n  text-align: center;\n  padding: 4px 10px;\n  margin: 10px 0;\n}\n\n.im_message_author,\n.im_message_fwd_author {\n  color: #3a6d99;\n  font-weight: bold;\n}\n.im_message_author_via,\n.im_message_fwd_via {\n  color: #3a6d99;\n  &:hover {\n    text-decoration: none;\n    & .im_message_fwd_author {\n      text-decoration: underline;\n    }\n  }\n}\n.non_osx .im_message_author_wrap,\n.non_osx .im_message_fwd_author_wrap {\n  font-size: 12px;\n}\n.im_message_author_via {\n  color: #3a6d99;\n  margin-left: 5px;\n}\n.im_message_fwd_via {\n  margin-left: 0;\n}\n.im_message_author_admin {\n  color: #adadad;\n  margin-left: 6px;\n  font-size: 11px;\n}\n\n.im_message_from_photo,\n.im_message_contact_photo,\n.im_message_fwd_photo {\n  width: 42px;\n  height: 42px;\n  border-radius: 50%;\n  overflow: hidden;\n\n  .peer_initials {\n    line-height: 42px;\n  }\n}\n\na.im_message_from_photo,\na.im_message_contact_photo {\n  margin: 0 15px 0 0;\n}\n.non_osx .im_message_contact_name {\n  font-size: 12px;\n}\n.im_message_contact_name {\n  font-weight: bold;\n}\n.im_message_contact_name,\n.im_message_contact_phone {\n  white-space: nowrap;\n}\na.im_message_photo_thumb,\na.im_message_video_thumb {\n  display: block;\n  overflow: hidden;\n  border-radius: 2px;\n}\nimg.im_message_photo_thumb,\nimg.im_message_video_thumb {\n  overflow: hidden;\n  border-radius: 2px;\n}\n.im_message_video,\na.im_message_photo_thumb {\n  margin-top: 5px;\n}\na.im_message_video_thumb {\n  float: left;\n  margin-right: 15px;\n  position: relative;\n}\n\nimg.im_message_video_thumb_blurred {\n  -webkit-filter: blur(2px);\n  -moz-filter: blur(2px);\n  -o-filter: blur(2px);\n  -ms-filter: blur(2px);\n  filter: blur(2px);\n  filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='2');\n}\n\ndiv.im_message_video_thumb {\n  position: relative;\n}\n.im_message_video_duration {\n  background: rgba(0, 0, 0, 0.4);\n  color: #fff;\n  position: absolute;\n  bottom: 4px;\n  right: 4px;\n  padding: 2px 6px;\n  font-size: 11px;\n  line-height: 15px;\n  border-radius: 2px;\n  overflow: hidden;\n  z-index: 1;\n}\n\n.icon-videoplay {\n  position: absolute;\n  display: inline-block;\n  top: 50%;\n  left: 50%;\n  margin-left: -5px;\n  margin-top: -9px;\n  z-index: 1;\n\n  width: 0;\n  height: 0;\n  border-style: solid;\n  border-width: 9px 0 9px 14px;\n  border-color: transparent transparent transparent #fff;\n}\n\n.im_message_geopoint {\n  border-radius: 2px;\n  margin-top: 5px;\n  overflow: hidden;\n  display: block;\n  position: relative;\n  width: 300px;\n  height: 150px;\n}\n\n\n.im_message_venue_geopoint_wrap {\n  display: block;\n  position: relative;\n  overflow: hidden;\n  width: 100px;\n  height: 100px;\n  margin-right: 10px;\n  float: left;\n  border-radius: 2px;\n  background: #f2f2f2;\n  text-align: center;\n  line-height: 0;\n}\n\n.icon-geo-point {\n  position: absolute;\n  display: inline-block;\n  top: 50%;\n  left: 50%;\n  margin-left: -8px;\n  margin-top: -15px;\n  width: 15px;\n  height: 19px;\n\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -14px -389px;\n}\n\n.im_message_media_embed {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  margin-top: 5px;\n\n  iframe,\n  webview {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n  }\n}\n\n.im_message_webpage_wrap {\n  margin: 3px 0 3px;\n  border-left: 2px solid #7eaad1;\n  padding-left: 12px;\n}\n.im_message_webpage_site {\n  color: #999;\n  font-weight: normal;\n  line-height: 120%;\n  margin-bottom: 3px;\n}\n.im_message_webpage_title {\n  font-weight: bold;\n  // margin-right: 4px;\n}\n.im_message_sign {\n  padding-top: 1px;\n}\n.im_message_sign_link {\n  pointer-events: none;\n  color: #adadad;\n  font-size: 0.95em;\n}\n.icon-circle {\n  display: none;\n  // display: inline-block;\n  width: 0.5em;\n  height: 0.5em;\n  border-radius: 0.5em;\n  background: #999;\n  overflow: hidden;\n\n  vertical-align: middle;\n  margin: -2px 3px 0;\n}\n.im_message_webpage_description {\n  margin: 2px 0 2px;\n}\n.im_message_webpage_article_photo {\n  display: block;\n  margin: 5px 0 5px 5px;\n}\n.im_message_article_thumb {\n}\n\n.im_message_video_embed {\n  padding-bottom: 56.25%; /* 16/9 ratio */\n}\n.im_message_insta_embed {\n  padding-bottom: 122%;\n}\n.im_message_vine_embed {\n  padding-bottom: 100%;\n}\n.im_message_soundcloud_embed {\n  padding-bottom: 56.25%; /* 16/9 ratio */\n}\n.im_message_spotify_embed {\n  width: 300px;\n  height: 80px;\n}\n.im_message_twitter_embed > blockquote {\n  visibility: hidden;\n}\n.im_message_webpage_gif .img_gif_with_progress_wrap {\n  margin-top: 5px;\n  display: block;\n}\n\n.im_message_gif_wrap {\n  position: relative;\n}\n.img_gif_with_progress_wrap {\n  display: inline-block;\n  line-height: 0;\n}\n.im_message_gif_btn {\n  color: #fff;\n  font-style: normal;\n  font-weight: bold;\n  position: absolute;\n  display: inline-block;\n  top: 50%;\n  left: 50%;\n  margin-left: -22px;\n  margin-top: -21px;\n  border: 2px solid #fff;\n  border-radius: 20px;\n  padding: 10px;\n  z-index: 1;\n}\n\n.im_message_video,\n.im_message_document,\n.im_message_upload_file,\n.im_message_audio {\n  margin-top: 3px;\n  width: 317px;\n}\n.im_message_audio {\n  margin-top: 3px;\n}\n.im_message_file_button {\n  display: block;\n  background: rgba(218,228,234,0.50);\n  float: left;\n  width: 42px;\n  height: 42px;\n  border-radius: 50%;\n  margin-right: 10px;\n}\n\n.im_message_file_button_icon {\n  display: inline-block;\n  line-height: 0;\n  width: 12px;\n  height: 18px;\n  margin: 12px 15px;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -14px -509px;\n\n  .im_message_file_button_dl_doc & {\n    background-position: -12px -561px;\n    width: 16px;\n    height: 18px;\n    margin: 13px 13px;\n  }\n}\n\n.im_message_file_button_dl_audio {\n  background: #6490b1;\n  border-radius: 50%;\n\n  .im_message_file_button_icon {\n    display: block;\n    width: 14px;\n    height: 16px;\n    margin: 13px 16px;\n\n    .image-2x('../img/icons/General.png', 40px, 948px);\n    background-position: -13px -611px;\n  }\n\n  &,\n  .is_1x & {\n    .audio_player_btn_icon_pause {\n      width: 12px;\n      height: 14px;\n      background-position: -14px -587px;\n      margin: 14px 15px;\n    }\n  }\n}\n\n.im_message_selected .icon-document,\n.im_history_select_active .im_message_outer_wrap:hover .icon-document {\n  background-color: #dae6f0;\n  background-position: -2px -542px;\n}\n\n.im_history_select_active {\n  a,\n  button,\n  .clickable {\n    pointer-events: none;\n  }\n}\n\n.im_message_document_link_disabled {\n  cursor: default;\n  pointer-events: none;\n}\n.im_message_document_info {\n  float: left;\n}\n.im_message_document_thumb_wrap {\n  border-radius: 2px;\n  overflow: hidden;\n  background: #f2f2f2;\n  width: 100px;\n  min-height: 38px;\n  max-height: 100px;\n  margin-right: 10px;\n  text-align: center;\n  float: left;\n  line-height: 0;\n}\nimg.im_message_document_thumb {\n  max-width: 100px;\n  max-height: 100px;\n  vertical-align: middle;\n}\n.im_message_document_name_wrap {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  width: 265px;\n  padding: 0 0 1px;\n}\n.im_message_document_actions {\n  width: 265px;\n}\n.im_message_document_name {\n  color: #3a6d99;\n  display: inline-block;\n  font-weight: bold;\n  max-width: 170px;\n  overflow: hidden;\n  vertical-align: text-top;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n\n  &:after {\n    content: attr(data-name);\n    display: block;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n  &:before {\n    content: attr(data-ext);\n    float: right;\n  }\n  &:hover:before {\n    text-decoration: underline;\n  }\n}\n.im_message_document_size {\n  color: #999;\n  padding-left: 2px;\n  vertical-align: text-top;\n}\n.im_message_document_actions a,\n.audio_player_actions a {\n  margin-right: 10px;\n}\n.audio_player_title_wrap {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  padding: 1px 0 1px;\n  line-height: 16px;\n  height: 19px;\n  width: 200px;\n}\n.audio_player_title {\n  display: inline-block;\n  font-weight: bold;\n  max-width: 100px;\n  overflow: hidden;\n  vertical-align: text-top;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.icon-audio-unread {\n  display: inline-block;\n  width: 6px;\n  height: 6px;\n  background: #4eabf1;\n  border: 0;\n  border-radius: 4px;\n  margin: 5px 5px 0 2px;\n  vertical-align: text-top;\n}\n.audio_player_meta {\n  overflow: hidden;\n  vertical-align: text-top;\n  display: inline-block;\n}\n.audio_player_size,\n.audio_player_duration {\n  color: #999;\n  padding-left: 2px;\n}\n.audio_player_actions {\n  margin-top: 3px;\n}\n\n.audio_player_seek {\n  &_slider {\n    float: left;\n    margin-right: 15px;\n    width: 200px;\n\n    .tg_slider_wrap {\n      height: 18px;\n      line-height: 18px;\n    }\n\n    .tg_slider_track {\n      margin: 7px 0;\n      background: rgba(218,228,234,0.50);\n      height: 4px;\n      border-radius: 0;\n    }\n\n    .tg_slider_track_fill {\n      background: #6490b1;\n      height: 4px;\n      width: 0;\n    }\n\n    .tg_slider_thumb {\n      display: none;\n    }\n\n    &:hover {\n      .tg_slider_thumb {\n        display: block;\n      }\n    }\n  }\n}\n\n.audio_player_volume_slider {\n  width: 50px;\n  float: left;\n\n  .tg_slider_wrap {\n    height: 18px;\n    line-height: 18px;\n  }\n\n  .tg_slider_thumb {\n    display: none;\n    background: #6490b1;\n    width: 4px;\n    height: 10px;\n    line-height: 16px;\n    margin-top: 4px;\n    border-radius: 0;\n  }\n\n  &:hover {\n    .tg_slider_thumb {\n      display: block;\n    }\n  }\n\n  .tg_slider_track {\n    margin: 7px 0;\n    background: rgba(218,228,234,0.50);\n    height: 4px;\n  }\n\n  .tg_slider_track_fill {\n    background: #6490b1;\n    height: 4px;\n    width: 0;\n  }\n}\n\n.audio_player_progress_wrap {\n  overflow: hidden;\n\n  .tg_down_progress {\n    margin-top: 5px;\n  }\n}\n\n.audio_player_media {\n  position: absolute;\n  visibility: hidden;\n\n  canvas {\n    display: none;\n  }\n}\n\n.im_message_upload_progress_wrap,\n.im_message_download_progress_wrap {\n  margin-top: 5px;\n  width: 200px;\n}\n\n.im_message_document_thumbed {\n  .im_message_document_name_wrap,\n  .im_message_upload_progress_wrap,\n  .im_message_download_progress_wrap,\n  .im_message_document_actions {\n    width: 207px;\n  }\n  .im_message_document_name {\n    max-width: 110px;\n  }\n}\n\n.im_message_video {\n  .im_message_document_name_wrap,\n  .im_message_download_progress_wrap,\n  .im_message_document_actions {\n    width: 152px;\n  }\n\n  .im_message_document_name_wrap {\n    margin-top: 5px;\n  }\n}\n\n.im_message_cancelable_progress_wrap,\n.im_message_playback_progress_wrap {\n  margin-top: 4px;\n  /*width: 265px;*/\n}\n.im_message_media_progress_cancel {\n  margin-left: 15px;\n  line-height: 100%;\n  width: 50px;\n  display: block;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.tg_up_progress,\n.tg_down_progress {\n  height: 4px;\n  margin: 0;\n  padding: 0;\n  background: rgba(218,228,234,0.50);\n  border: 0;\n  border-radius: 0;\n\n  .box-shadow(none);\n\n  .progress-bar {\n    height: 4px;\n    line-height: 4px;\n    background: #6B9ABD;\n    border-radius: 0;\n    overflow: hidden;\n\n    .box-shadow(none);\n  }\n}\n\n.im_service_message_wrap {\n  text-align: center;\n}\n.im_bot_intro_message_wrap {\n  max-width: 300px;\n  padding: 4px 10px;\n  margin: 10px auto;\n  color: #000;\n  line-height: 1.4;\n  text-align: left;\n  font-size: 13px;\n}\n.im_bot_intro_message_header {\n  font-weight: bold;\n  text-align: center;\n}\n.im_bot_intro_message {\n  margin-top: 10px;\n}\n.im_service_message {\n  display: block;\n  min-width: 10px;\n  padding: 4px 7px;\n  line-height: 1.4;\n  color: #999;\n  text-align: center;\n  border-radius: 10px;\n  margin: 5px 0;\n}\n.im_service_message_photo_thumb {\n  display: inline-block;\n  margin: 0 auto;\n}\n.im_service_message .im_service_message_pinned {\n  color: inherit;\n  font-weight: bold;\n  display: inline-block;\n  max-width: 150px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  vertical-align: middle;\n}\n.im_service_message_phonecall {\n  color: inherit !important;\n  font-weight: bold;\n}\n.im_service_message_phonecall_duration {\n  font-weight: normal;\n}\n\n.im_message_date,\n.im_message_fwd_date {\n  color: #adadad;\n  font-size: 0.85em;\n  padding: 0 0 20px 10px;\n}\n\n.im_message_edited {\n  display: none;\n}\n\n.im_message_date_text {\n  cursor: pointer;\n  &:hover {\n    text-decoration: underline;\n  }\n}\n\ndiv.im_message_author,\ndiv.im_message_body {\n  display: block;\n  overflow: hidden;\n}\n\n// .im_message_meta,\n.im_message_body {\n  .user-select(text);\n}\n\n.im_message_error_btn {\n  display: none;\n\n  .im_message_error & {\n    display: inline;\n  }\n\n  .icon-message-status {\n    background: #da564d;\n    opacity: 0.85;\n    pointer-events: auto;\n\n    &:hover {\n      opacity: 1;\n    }\n  }\n}\n\n\n.im_message_views_wrap {\n  position: relative;\n}\n.im_message_views {\n  display: inline-block;\n  position: absolute;\n  white-space: nowrap;\n  line-height: normal;\n}\n.im_message_views_inline {\n  display: inline-block;\n  white-space: nowrap;\n  // line-height: normal;\n  font-size: 0.85em;\n  margin-left: 5px;\n}\n.icon-message-views {\n  display: inline-block;\n  width: 16px;\n  height: 11px;\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -12px -850px;\n  vertical-align: text-bottom;\n  margin-right: 0.3rem;\n\n  .message_focus &,\n  .im_message_selected &,\n  .im_history_select_active .im_message_outer_wrap:hover & {\n    background-position: -12px -871px;\n  }\n}\n.im_message_views_cnt {\n  color: #adadad;\n  font-weight: bold;\n  vertical-align: top;\n}\n\n.im_message_reply_wrap {\n  display: block;\n  color: inherit;\n  text-decoration: none;\n  margin-bottom: 5px;\n  margin-top: 2px;\n  overflow: hidden;\n\n  &:hover {\n    text-decoration: none;\n    color: inherit;\n  }\n}\n\n.im_message_reply_border {\n  background: #7eaad1;\n  height: 33px;\n  width: 2px;\n  position: absolute;\n  margin-left: -12px;\n}\n.im_message_reply {\n  padding-left: 12px;\n}\n.im_message_reply_thumb_wrap {\n  display: block;\n  float: left;\n  width: 42px;\n  height: 42px;\n  text-align: center;\n  position: absolute;\n}\n.im_message_reply_author {\n  font-weight: bold;\n  color: #3a6d99;\n  line-height: 16px;\n  margin-bottom: 3px;\n}\n.non_osx .im_message_reply_author {\n  font-size: 12px;\n}\n.im_message_reply_loading {\n  padding: 7px 0 8px;\n}\n.im_message_reply_body .im_short_message_service,\n.im_message_reply_body .im_short_message_media {\n  color: #999;\n}\n.im_message_reply_body {\n  line-height: 16px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  margin-bottom: 1px;\n}\n\n.im_message_reply_thumbed {\n  .im_message_reply_wrap,\n  .im_message_reply_border {\n    height: 42px;\n  }\n\n  .im_message_reply_author {\n    margin-top: 4px;\n  }\n\n  .im_message_reply_author,\n  .im_message_reply_body {\n    margin-left: 52px;\n  }\n\n  .im_message_reply_wrap & {\n    margin-bottom: 4px;\n  }\n}\n\na.im_message_fwd_photo {\n  position: absolute;\n  margin-top: 1px;\n}\n.im_message_fwd_date {\n  padding: 0;\n}\n.im_message_text {\n  word-wrap: break-word;\n  line-height: 150%;\n  white-space: pre-wrap;\n}\n.im_message_photo_caption,\n.im_message_video_caption,\n.im_message_document_caption {\n  margin-top: 3px;\n  clear: both;\n  word-wrap: break-word;\n  line-height: 150%;\n  white-space: pre-wrap;\n}\n.im_message_mymention {\n  background: #fff8cc;\n}\n\n.reply_markup_wrap {\n  margin: 15px -2px 0;\n\n  .im_message_keyboard & {\n    margin-top: 7px;\n  }\n}\n.reply_markup_row {\n  padding: 4px 0;\n  line-height: 0;\n  &:first-child {\n    padding-top: 0;\n  }\n  &:last-child {\n    padding-bottom: 0;\n  }\n  .reply_markup_scrollable_wrap.active-scrollbar & {\n    margin-right: 6px;\n  }\n}\n.reply_markup_button_wrap {\n  display: inline-block;\n  padding: 0 4px;\n  vertical-align: bottom;\n}\n.reply_markup_button {\n  color: #3a6d99;\n  display: block;\n  width: 100%;\n  background: #f0f4f7;\n  height: 30px;\n  font-size: 13px;\n  margin: 0;\n  padding: 6px 6px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n\n  .reply_markup_h1 & {\n    height: 170px;\n  }\n  .reply_markup_h2 & {\n    height: 81px;\n  }\n  .reply_markup_h3 & {\n    height: 51px;\n  }\n  .reply_markup_h4 & {\n    height: 36px;\n  }\n}\n.reply_markup_button:focus,\n.reply_markup_button:hover {\n  color: #3a6d99;\n  background: #dfe8f0;\n}\n.reply_markup_button_w1 {width: 100%;}\n.reply_markup_button_w2 {width: 50%;}\n.reply_markup_button_w3 {width: 33.3333333%;}\n.reply_markup_button_w4 {width: 25%;}\n.reply_markup_button_w5 {width: 20%;}\n.reply_markup_button_w6 {width: 16.6666666%;}\n.reply_markup_button_w7 {width: 14.2857142%;}\n.reply_markup_button_w8 {width: 12.5%;}\n.reply_markup_button_w9 {width: 11.1111111%;}\n.reply_markup_button_w10 {width: 10%;}\n.reply_markup_button_w11 {width: 9.09090909%;}\n.reply_markup_button_w12 {width: 8.33333333%;}\n\n\n.im_history_not_selected_wrap {\n  display: none;\n  .im_page_peer_not_selected & {\n    display: block;\n  }\n}\n.im_history_selected_wrap {\n  display: none;\n  .im_history_loaded & {\n    display: block;\n  }\n  .im_page_peer_not_selected & {\n    display: none;\n  }\n}\n.im_history_selected_loading_wrap {\n  display: block;\n  .im_history_loaded & {\n    display: none;\n  }\n  .im_page_peer_not_selected & {\n    display: none;\n  }\n}\n\n.im_history_not_selected,\n.im_history_empty {\n  visibility: hidden;\n  text-align: center;\n  color: #999;\n  font-size: 16px;\n  line-height: 18px;\n  padding: 1px 50px;\n  margin: 0;\n\n  &.vertical-aligned {\n    visibility: visible;\n  }\n\n  .im_history_to_bottom & {\n    display: none;\n  }\n}\n.im_history_loading {\n  width: 35px;\n  margin: 0 auto;\n  visibility: hidden;\n\n  &.vertical-aligned {\n    visibility: visible;\n  }\n}\n\n.im_history_loading_more {\n  display: block;\n  width: 26px;\n  height: 46px;\n  margin: 0 auto;\n  padding: 20px 0 0;\n  visibility: hidden;\n\n  .progress-arc-wrap {\n    display: none;\n  }\n\n  &.im_history_loading_more_active {\n    visibility: visible;\n\n    .progress-arc-wrap {\n      display: block;\n    }\n  }\n}\n.im_history_loading_less {\n  display: block;\n  width: 26px;\n  margin: 0 auto;\n  visibility: hidden;\n\n  .progress-arc-wrap {\n    display: none;\n  }\n\n  &.im_history_loading_less_active {\n    visibility: visible;\n\n    .progress-arc-wrap {\n      display: block;\n    }\n  }\n}\n\n.im_send_panel_wrap {\n  margin: 0 auto;\n  padding: 10px 15px 30px 15px;\n}\n.im_send_form_wrap {\n  position: relative;\n}\n.im_send_form {\n  margin: 0 auto;\n  position: absolute;\n  bottom: 0;\n}\n.im_attach_input,\n.im_media_attach_input {\n  cursor: pointer;\n  font-size: 120px !important;\n  opacity: 0.01;\n  position: absolute;\n  z-index: 100;\n  margin: 0;\n  padding: 0;\n\n  top: 0;\n  right: 0;\n}\n\n.im_send_dropbox_wrap {\n  background: #fff;\n  display: none;\n  padding: 17px 10px 0;\n  border: 1px dashed #999;\n  overflow: hidden;\n  text-align: center;\n  color: #999;\n  position: absolute;\n}\n.im_send_form_dragging {\n  .im_send_dropbox_wrap {\n    display: block;\n  }\n  .composer_rich_textarea,\n  .im_message_field,\n  .composer_emoji_insert_btn,\n  .composer_progress_icon_wrap,\n  .composer_command_btn,\n  .composer_keyboard_btn,\n  .im_inline_placeholder_wrap {\n    visibility: hidden;\n  }\n}\n\n.im_send_field_wrap {\n  position: relative;\n}\ntextarea.im_message_field {\n  font-size: 12px;\n  margin-bottom: 10px;\n  padding: 6px;\n  min-height: 50px;\n  height: 50px;\n  resize: none;\n}\n.im_inline_placeholder_wrap {\n  color: #9aa2ab;\n  position: absolute;\n  margin-top: 2px;\n  white-space: nowrap;\n  pointer-events: none;\n  text-overflow: ellipsis;\n  display: none;\n  width: 100%;\n  width: ~\"calc(100% - 30px)\";\n  overflow: hidden;\n}\n.im_inline_placeholder_wrap.active {\n  display: block;\n}\n.im_inline_placeholder_prefix {\n  visibility: hidden;\n}\n\n.icon-online {\n  background: #6ec26d;\n  border: 1px solid #fff;\n  display: block;\n  width: 11px;\n  height: 11px;\n  border-radius: 6px;\n  overflow: hidden;\n  position: absolute;\n  margin-top: -7px;\n  margin-left: 33px;\n}\n\n.im_send_reply {\n  &_wrap {\n    margin-bottom: 5px;\n  }\n\n  &_form_wrap {\n    a.im_panel_own_photo,\n    a.im_panel_peer_photo {\n      margin-top: 41px;\n    }\n  }\n\n  &_cancel {\n    float: right;\n    display: block;\n    width: 18px;\n    height: 18px;\n    margin-right: 6px;\n    margin-top: 5px;\n    -webkit-transform: translate3d(0,0,0);\n    padding-top: 7px;\n\n    .icon-reply-bar {\n      display: block;\n      background: #999;\n      width: 18px;\n      height: 2px;\n      transform-origin: 50% 50%;\n    }\n\n    &:hover {\n      .icon-reply-bar {\n        background: #44a1e8;\n      }\n    }\n  }\n}\n\n.icon-reply-bar {\n  &:first-child {\n    .transform(rotate(-45deg));\n\n    transform-origin: 50% 50%;\n  }\n\n  &:last-child {\n    .transform(translate3d(0,-2px,0) rotate(45deg));\n  }\n}\n\na.img_fullsize,\n.img_fullsize_wrap {\n  display: block;\n  text-align: center;\n}\nimg.img_fullsize {\n  margin: 0 auto;\n}\n.document_modal_image_wrap {\n  overflow: auto;\n}\n.document_fullsize_wrap {\n  display: none;\n  cursor: zoom-in;\n  text-align: center;\n}\n.document_fullsize_zoomed {\n  cursor: zoom-out;\n}\n.document_fullsize_img {\n  /*max-width: 100%;*/\n  -webkit-user-select: none;\n}\n\n.document_fullsize_zoomed {\n  .document_fullsize_img {\n    /*min-width: 100%;*/\n    -webkit-user-select: none;\n    image-rendering: optimizeSpeed;             /* FUCK SMOOTHING, GIVE ME SPEED  */\n    image-rendering: -moz-crisp-edges;          /* Firefox                        */\n    image-rendering: -o-crisp-edges;            /* Opera                          */\n    image-rendering: -webkit-optimize-contrast; /* Chrome (and eventually Safari) */\n    image-rendering: optimize-contrast;         /* CSS3 Proposed                  */\n    -ms-interpolation-mode: nearest-neighbor;   /* IE8+                           */\n  }\n}\n\n.video_full_player {\n  video {\n    background: #000;\n  }\n}\n\n.media_modal_info {\n  color: #999;\n  margin: 20px 0 0;\n}\n.media_modal_actions {\n  margin-top: 20px;\n}\n.media_modal_action_link {\n  margin-left: 15px;\n}\n.media_modal_author {\n  color: inherit;\n  font-weight: bold;\n\n  &:hover {\n    color: inherit;\n  }\n  .non_osx & {\n    font-size: 12px;\n  }\n}\n\n/* Message composer */\n.composer_progress_enabled-add,\n.composer_progress_enabled-remove {\n  transition-duration: 0.2s;\n}\n.composer_progress_icon_wrap {\n  position: absolute;\n  right: 3px;\n  top: 2px;\n  width: 22px;\n  height: 22px;\n  overflow: hidden;\n  margin-top: 1px;\n  pointer-events: none;\n  padding: 0;\n  display: none;\n  opacity: 0;\n\n  .composer_progress_enabled-add &,\n  .composer_progress_enabled-remove & {\n    transition: opacity cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.2s;\n    display: block;\n  }\n\n  .composer_progress_enabled & {\n    display: block;\n    opacity: 1;\n  }\n}\n.composer_emoji_insert_btn {\n  opacity: 1;\n  position: absolute;\n  right: 3px;\n  top: 2px;\n  cursor: pointer;\n  padding: 0;\n\n  width: 22px;\n  height: 22px;\n  margin-top: 1px;\n  display: block;\n  opacity: 1;\n\n  .composer_progress_enabled & {\n    display: none;\n    opacity: 0;\n  }\n\n  .composer_progress_enabled-add &,\n  .composer_progress_enabled-remove & {\n    transition: opacity cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.2s;\n    display: block;\n  }\n}\n\n.icon-emoji {\n  display: inline-block;\n  width: 22px;\n  height: 22px;\n  vertical-align: top;\n  opacity: 0.8;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -9px -335px;\n}\n\n\n.composer_emoji_tooltip {\n  display: none;\n  position: absolute;\n  z-index: 999;\n  width: 286px;\n  margin-left: -133px;\n  margin-top: -330px;\n\n  border: 1px #dfdfdf solid;\n\n  .rounded(3px);\n  .box-shadow(0px 1px 1px rgba(0, 0, 0, 0.1));\n\n  background: #fff;\n  padding: 0;\n\n  &_shown {\n    display: block;\n  }\n\n  &_tail {\n    position: absolute;\n    bottom: -14px;\n    left: 50%;\n    margin-left: -13px;\n    overflow: hidden;\n    width: 26px;\n    height: 14px;\n  }\n}\n\n.icon-tooltip-tail {\n  background: #fff;\n  width: 18px;\n  height: 18px;\n  display: inline-block;\n  border: 1px #dfdfdf solid;\n  border-width: 0 1px 1px 0;\n\n  .rounded(2px);\n\n  position: relative;\n  top: -8px;\n  left: 4px;\n\n  .transform(rotate(45deg));\n  .box-shadow(1px 1px 1px rgba(0, 0, 0, 0.1));\n}\n\n.composer_emoji_tooltip_tabs {\n  -webkit-box-shadow: 0px 1px 0px 0px rgba(0,0,0,0.1);\n  -moz-box-shadow: 0px 1px 0px 0px rgba(0,0,0,0.1);\n  box-shadow: 0px 1px 0px 0px rgba(0,0,0,0.1);\n  padding-top: 2px;\n}\n.composer_emoji_tooltip_tab {\n  cursor: pointer;\n  display: inline-block;\n  line-height: 33px;\n  text-align: center;\n  width: 50%;\n  text-transform: uppercase;\n  font-weight: bold;\n  transition: color ease-in-out 0.2s;\n\n  &:hover,\n  &:active,\n  &:focus {\n    text-decoration: none;\n  }\n}\n.composer_emoji_tooltip_tab_emoji,\n.composer_emoji_tooltip_tabs_stickers_active .composer_emoji_tooltip_tab_stickers {\n  color: #53a9ea;\n}\n.composer_emoji_tooltip_tabs_stickers_active .composer_emoji_tooltip_tab_emoji,\n.composer_emoji_tooltip_tab_stickers {\n  color: #999;\n}\n.composer_emoji_tooltip_tab_shadow {\n  width: 50%;\n  height: 1px;\n  background: #53a9ea;\n  -webkit-box-shadow: 0px 1px 0px 0px rgba(83,169,234,1);\n  -moz-box-shadow: 0px 1px 0px 0px rgba(83,169,234,1);\n  box-shadow: 0px 1px 0px 0px rgba(83,169,234,1);\n  .transform(translate3d(0,0,0));\n\n  transition: transform ease-in-out 0.2s;\n\n  .composer_emoji_tooltip_tabs_stickers_active & {\n    .transform(translate3d(100%,0,0));\n  }\n}\n\n.composer_emoji_tooltip_categories {\n  width: 100%;\n  line-height: 0;\n\n  .composer_emoji_tooltip_tab_emoji_content & {\n    width: 100%;\n    margin: 0 0 3px;\n    padding: 0 5px 15px;\n    line-height: 0;\n  }\n\n  .composer_emoji_tooltip_tab_stickers_content & {\n    vertical-align: top;\n    padding: 0 5px 15px;\n    margin: 0 0 3px;\n    overflow-x: scroll;\n    white-space: nowrap;\n    position: relative;\n\n    &::-webkit-scrollbar {\n      display: none;\n    }\n\n    .composer_sticker_btn {\n      width: 36px;\n      height: 34px;\n      padding: 3px 4px;\n      vertical-align: top;\n      margin: 4px 0 0 0;\n    }\n    .composer_sticker_image {\n      max-width: 28px;\n      max-height: 28px;\n    }\n  }\n}\n\n.composer_emoji_tooltip_category {\n  line-height: 0;\n  color: white;\n  display: inline-block;\n  cursor: pointer;\n  opacity: 0.3;\n  padding: 9px 12px;\n  // margin: 0 12px 0 12px;\n\n  &:hover {\n    opacity: 0.4;\n  }\n  &.active,\n  &.active:hover {\n    opacity: 1;\n  }\n}\n\n.composer_emoji_tooltip_category i {\n  display: inline-block;\n  width: 21px;\n  height: 21px;\n\n  .image-2x('../img/icons/IconsetSmiles.png', 27px, 362px);\n}\n\n/* Recent */\n.composer_emoji_tooltip_category_recent {background-position: -3px 0; }\n.active .composer_emoji_tooltip_category_recent {background-position: -3px -31px; }\n\n/* Smile */\n.composer_emoji_tooltip_category_smile {background-position: -3px -62px; }\n.active .composer_emoji_tooltip_category_smile {background-position: -3px -93px; }\n\n/* Flower */\n.composer_emoji_tooltip_category_flower {background-position: -3px -124px; }\n.active .composer_emoji_tooltip_category_flower {background-position: -3px -155px; }\n\n/* Bell */\n.composer_emoji_tooltip_category_bell {background-position: -3px -185px; }\n.active .composer_emoji_tooltip_category_bell {background-position: -3px -213px; }\n\n/* Car */\n.composer_emoji_tooltip_category_car {background-position: -3px -241px; }\n.active .composer_emoji_tooltip_category_car {background-position: -3px -269px; }\n\n/* Grid */\n.composer_emoji_tooltip_category_grid {background-position: -3px -297px; }\n.active .composer_emoji_tooltip_category_grid {background-position: -3px -324px; }\n\n\n.composer_emoji_tooltip_tabs_wrap {\n  height: 275px;\n  width: 284px;\n  position: relative;\n  overflow: hidden;\n}\n.composer_emoji_tooltip_tabs_contents {\n  position: absolute;\n  width: 568px;\n\n  .non_msie & {\n    transition: transform ease-in-out 0.2s;\n    .transform(translate3d(0,0,0));\n  }\n  .non_msie .composer_emoji_tooltip_tabs_stickers_active & {\n    .transform(translate3d(-284px,0,0));\n  }\n\n  .msie & {\n    margin-left: 0;\n    transition: margin-left ease-in-out 0.2s;\n  }\n  .msie .composer_emoji_tooltip_tabs_stickers_active & {\n    margin-left: -284px;\n  }\n\n}\n.composer_emoji_tooltip_tab_emoji_content,\n.composer_emoji_tooltip_tab_stickers_content {\n  width: 284px;\n  height: 275px;\n  float: left;\n}\n.composer_emoji_tooltip_content_stickers {\n  position: relative;\n}\n.composer_emoji_tooltip_content_wrap {\n  padding: 0 2px 0 8px;\n}\n.composer_emoji_tooltip .scroller_scrollable_container {\n  height: 233px;\n  position: relative;\n}\n.composer_emoji_tooltip_content {\n  padding-top: 10px;\n  padding-right: 8px;\n  outline: 0!important;\n}\n\na.composer_emoji_btn {\n  margin: 0 2px 0 0;\n  padding: 5px;\n  display: block;\n  float: left;\n  border-radius: 2px;\n\n  &:hover {\n    background-color: #edf2f5;\n  }\n}\n\n.emoji {\n  display: -moz-inline-box;\n  -moz-box-orient: vertical;\n  display: inline-block;\n  vertical-align: baseline;\n  *vertical-align: auto;\n  *zoom: 1;\n  *display: inline;\n  height: 18px;\n  width: 18px;\n  background-repeat: no-repeat;\n  text-indent: -9999px;\n  border: 0 none;\n}\n\n/* widths and heights calculated according to spritesheet dimensions and icon size */\n.emoji-spritesheet-0 {\n  background-size: 486px 126px;\n  background-image: url('../img/emojisprite_0.png');\n}\n.emoji-spritesheet-1 {\n  background-size: 522px 72px;\n  background-image: url('../img/emojisprite_1.png');\n}\n.emoji-spritesheet-2 {\n  background-size: 594px 126px;\n  background-image: url('../img/emojisprite_2.png');\n}\n.emoji-spritesheet-3 {\n  background-size: 612px 54px;\n  background-image: url('../img/emojisprite_3.png');\n}\n.emoji-spritesheet-4 {\n  background-size: 612px 126px;\n  background-image: url('../img/emojisprite_4.png');\n}\n\n.emoji-w20 {\n  width: 20px;\n  height: 20px;\n  vertical-align: middle;\n  display: inline-block;\n\n  &.emoji-spritesheet-0 { background-size: 540px 140px; }\n  &.emoji-spritesheet-1 { background-size: 580px 80px;  }\n  &.emoji-spritesheet-2 { background-size: 660px 140px; }\n  &.emoji-spritesheet-3 { background-size: 680px 60px;  }\n  &.emoji-spritesheet-4 { background-size: 680px 140px; }\n}\n\n.emoji-w26 {\n  width: 26px;\n  height: 26px;\n  vertical-align: middle;\n  display: inline-block;\n\n  &.emoji-spritesheet-0 { background-size: 702px 182px; }\n  &.emoji-spritesheet-1 { background-size: 754px 104px; }\n  &.emoji-spritesheet-2 { background-size: 858px 182px; }\n  &.emoji-spritesheet-3 { background-size: 884px 78px;  }\n  &.emoji-spritesheet-4 { background-size: 884px 182px; }\n}\n\n\n.composer_dropdown_wrap {\n  background: #FFF;\n  display: none;\n  position: absolute;\n  z-index: 10;\n  border: 0;\n\n  .box-shadow(0px 1px 1px 0px rgba(60,75,87,0.27));\n\n  border-radius: 0;\n  margin-top: -5px;\n  margin-left: -1px;\n  width: 380px;\n}\n\n.composer_dropdown {\n  position: static;\n  display: block;\n  float: none;\n  top: auto;\n  left: auto;\n  border: 0;\n  border-radius: 0;\n  padding: 0;\n  margin: 0;\n  z-index: auto;\n\n  & > li > a {\n    display: block;\n    font-size: 13px;\n    line-height: 15px;\n    padding: 4px 10px;\n    color: #52719a;\n  }\n\n  li a:hover,\n  li.composer_autocomplete_option_active a {\n    color: #52719a;\n    background: #f2f6fa;\n    text-decoration: none;\n  }\n}\n\n.composer_emoji_shortcut {\n  display: inline-block;\n  vertical-align: top;\n  margin-left: 15px;\n  line-height: 20px;\n}\n.composer_mention_option {\n  line-height: 20px;\n}\n.composer_user_mention {\n  color: #808080;\n  margin-left: 7px;\n}\n\n.composer_dropdown {\n  li a:hover .composer_user_mention,\n  li.composer_autocomplete_option_active a .composer_user_mention {\n    color: #698192;\n  }\n}\n\n.composer_user_photo {\n  span& {\n    display: inline-block;\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    overflow: hidden;\n    margin-right: 10px;\n    vertical-align: top;\n  }\n\n  img& {\n    width: 32px;\n    height: 32px;\n    vertical-align: top;\n  }\n\n  span& {\n    .peer_initials {\n      line-height: 32px;\n      font-size: 14px;\n    }\n  }\n}\n\n.composer_user_name,\n.composer_user_mention {\n  display: inline-block;\n  line-height: 32px;\n  vertical-align: top;\n}\n\n.composer_dropdown a.composer_command_option {\n  color: #808080;\n  line-height: 32px;\n  padding-right: 5px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.composer_dropdown .composer_command_value {\n  color: #52719a;\n  display: inline;\n}\n.composer_dropdown .composer_command_desc {\n  display: inline;\n  color: #808080;\n  padding-left: 7px;\n  font-weight: normal;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\na.composer_command_option:hover .composer_command_desc,\n.composer_autocomplete_option_active a.composer_command_option .composer_command_desc {\n  color: #698192;\n}\n.composer_command_desc .emoji {\n  vertical-align: text-bottom;\n}\n\n\n.composer_stickerset_title {\n  display: block;\n  // clear: both;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  font-weight: bold;\n  font-size: 13px;\n  color: #444;\n  margin: 10px 0 3px;\n  padding: 0 6px;\n\n  .composer_stickerset_wrap:first-child & {\n    margin-top: 0;\n  }\n  &:hover {\n    color: #444;\n  }\n}\n.composer_sticker_btn {\n  width: 66px;\n  height: 66px;\n  display: inline-block;\n  text-align: center;\n  padding: 3px;\n  vertical-align: top;\n\n  &:hover {\n    background: #f2f6fa;\n  }\n}\n\n.composer_sticker_image {\n  max-width: 60px;\n  max-height: 60px;\n  vertical-align: middle;\n}\n\n.composer_rich_textarea {\n  font-size: 12px;\n  margin-bottom: 10px;\n  padding: 6px;\n  min-height: 38px;\n  height: auto;\n  width: auto;\n  max-height: 284px;\n  overflow: auto;\n  line-height: 17px;\n\n  border: 1px solid #d2dbe3;\n  border-radius: 2px;\n\n  .box-shadow(none);\n  .box-sizing(content-box);\n\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n\n  -webkit-user-select: text;\n  word-wrap: break-word;\n\n  .user-select(text);\n\n  &:empty::before {\n    content: attr(placeholder);\n    color: #9aa2ab;\n    display: block;\n    margin-top: -1px;\n    margin-left: 1px;\n    pointer-events: none;\n  }\n  &:empty:active::before,\n  &:empty:focus::before {\n    opacity: 0.75;\n  }\n\n\n  img {\n    width: 20px;\n    height: 20px;\n    vertical-align: middle;\n    margin: -3px 0 0 0;\n  }\n}\n\n// Mozilla hack\n@-moz-document url-prefix() {\n  .composer_rich_textarea:empty:active:before,\n  .composer_rich_textarea:empty:focus:before {\n    display: none;\n  }\n}\n\n// IE hack\n_:-ms-lang(x), .composer_rich_textarea:empty:active:before {\n  display: none;\n}\n_:-ms-lang(x), .composer_rich_textarea:empty:focus:before {\n  display: none;\n}\n\n\n.composer_command_btn {\n  display: block;\n  position: absolute;\n  right: 37px;\n  top: 4px;\n  cursor: pointer;\n  padding: 0;\n\n  width: 20px;\n  height: 20px;\n}\n.icon-slash {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  vertical-align: top;\n  opacity: 0.8;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -10px -790px;\n\n  .composer_command_btn.active & {\n    background-position: -10px -820px;\n  }\n\n  .composer_command_btn:hover & {\n    opacity: 1.0;\n  }\n}\n\n.composer_keyboard_btn {\n  display: block;\n  position: absolute;\n  right: 37px;\n  top: 4px;\n  cursor: pointer;\n  padding: 0;\n\n  width: 20px;\n  height: 20px;\n}\n.icon-keyboard {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  vertical-align: top;\n  opacity: 0.8;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -10px -730px;\n\n  .composer_keyboard_btn.active & {\n    background-position: -10px -760px;\n  }\n\n  .composer_keyboard_btn:hover & {\n    opacity: 1.0;\n  }\n}\n\n.inline_switch_pm {\n  text-decoration: none !important;\n  display: block;\n  font-size: 13px;\n  font-weight: bold;\n  line-height: 15px;\n  padding: 10px 10px;\n  text-align: center;\n  color: #52719a;\n\n  &:hover {\n    background: #f2f6fa;\n    color: #52719a;\n  }\n}\n.inline_results_wrap {\n  line-height: 0;\n}\n.inline_result_wrap {\n  display: block;\n}\n.inline_result_gif,\n.inline_result_photo,\n.inline_result_sticker {\n  display: inline-block;\n  padding: 1px;\n}\n.inline_result_article {\n  display: block;\n}\n.inline_article_thumb_wrap {\n  width: 50px;\n  height: 50px;\n  margin-right: 10px;\n  pointer-events: none;\n  text-align: center;\n}\n.inline_article_thumb {\n  max-width: 50px;\n  max-height: 50px;\n  line-height: 0;\n}\n.inline_result_video .inline_article_thumb_wrap {\n  width: 90px;\n  height: 50px;\n}\n.inline_result_video .inline_article_thumb {\n  max-width: 90px;\n  max-height: 50px;\n}\n.inline_article_thumb_initials {\n  color: #999;\n  background: #EEE;\n  line-height: 50px;\n  text-align: center;\n  font-size: 25px;\n  text-transform: uppercase;\n\n  li a:hover &,\n  li.composer_autocomplete_option_active a & {\n    color: #698192;\n    background: darken(#f2f6fa, 5%);\n  }\n}\n.inline_article_content_wrap {\n  overflow: hidden;\n  pointer-events: none;\n}\n.inline_article_thumb_wrap,\n.inline_article_title,\n.inline_article_description,\n.inline_article_url {\n  pointer-events: none;\n}\n.inline_article_title {\n  color: #222;\n  font-weight: bold;\n  font-size: 12px;\n}\n.inline_article_description {\n  color: #808080;\n  padding-top: 4px;\n  font-size: 12px;\n  li a:hover &,\n  li.composer_autocomplete_option_active a & {\n    color: #698192;\n  }\n}\n.inline_article_url {\n  padding-top: 4px;\n}\n\n.composer_dropdown > li.inline_result_gif > a,\n.composer_dropdown > li.inline_result_photo > a,\n.composer_dropdown > li.inline_result_sticker > a {\n  padding: 0;\n  line-height: 0;\n  display: block;\n  overflow: hidden;\n}\nli.inline_result_gif.composer_autocomplete_option_active a,\nli.inline_result_photo.composer_autocomplete_option_active a,\nli.inline_result_sticker.composer_autocomplete_option_active a {\n  position: relative;\n\n  .inline_result_ind {\n    display: block;\n    background: rgba(255,255,255,0.3);\n    width: 100%;\n    height: 100%;\n    position: absolute;\n  }\n}\n.inline_result_gif .img_gif_video,\n.inline_result_photo .inline_result_photo_image {\n  object-fit: cover;\n}\n.inline_result_sticker img {\n  object-fit: contain;\n}\n.inline_result_game img {\n  object-fit: cover;\n  width: 50px;\n  height: 50px;\n}\n.inline_result_gif_mtproto,\n.inline_result_gif_http,\n.inline_result_photo_mtproto,\n.inline_result_photo_http {\n  pointer-events: none;\n}\n\n\n.im_voice_recorder_wrap {\n  display: none;\n  z-index: 100;\n}\n\n.im_recorder_indicator, .im_recorder_time {\n  float: left;\n  vertical-align: middle;\n  color: #333;\n}\n\n.im_recorder_indicator i {\n  background-color: #ff1010;\n  height: 10px;\n  width: 10px;\n  border-radius: 50%;\n  margin-right: 5px;\n  vertical-align: baseline;\n  display: inline-block;\n  animation: blinker 0.5s cubic-bezier(.5, 0, 1, 1) infinite alternate;  \n}\n\n@keyframes blinker {  \n  from { opacity: 1; }\n  to { opacity: 0; }\n}\n\n.im_recorder_label {\n  overflow: auto;\n  font-size: 12px;\n  text-align: center;\n  vertical-align: middle;\n  color: #3a6d99;\n\n  transition: color linear 0.2s;\n  \n  i {\n    margin-right: 5px;\n  }\n  \n  .im_send_form_hover & {\n    color: #CCC;\n  }\n}\n.im_send_form_hover .im_recorder_label_hout,\n.im_recorder_label_hover {\n  display: none;\n}\n.im_send_form_hover .im_recorder_label_hover {\n  display: inline;\n\n}\n\n.im_voice_recording,\n.im_processing_recording {\n  color: #AAA;\n\n  .im_voice_recorder_wrap {\n    display: block;\n  }\n}\n\n\n.error_modal_window {\n  .modal-dialog {\n    max-width: 350px;\n  }\n}\n\n.error_modal_description {\n  color: #999;\n  padding: 5px 0;\n  font-size: 13px;\n  line-height: 160%;\n}\n\n.md_simple_modal_alert_body {\n  .md_simple_header,\n  .error_modal_description {\n    text-align: center;\n  }\n}\n\n.error_modal_details {\n  textarea {\n    display: block;\n    font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n    padding: 0;\n    font-size: 10px;\n    line-height: 100%;\n    white-space: pre-wrap;\n    padding: 4px;\n    margin: 10px 0 10px;\n    word-break: break-all;\n    word-wrap: break-word;\n    color: #333333;\n    background-color: #f5f5f5;\n    border: 1px solid #cccccc;\n    border-radius: 4px;\n    width: 100%;\n    text-align: left;\n  }\n}\n\n.error_modal_details_link {\n  &,\n  &:hover {\n    font-size: 11px;\n    color: #999\n  }\n}\n\n.confirm_modal_description {\n  text-align: center;\n  padding: 20px 0;\n  font-size: 14px;\n  line-height: 160%;\n}\n.confirm_phone_number {\n  font-weight: bold;\n  padding: 15px 10px 0;\n  text-align: center;\n}\n.confirm_modal_extlink_jump {\n  word-break: break-all;\n}\n.confirm_modal_paste_image {\n  max-width: 274px;\n  height: 274px;\n  background-position: 50% 50%;\n  background-size: contain;\n  background-repeat: no-repeat;\n  margin: 10px auto -10px;\n}\n\n.photo_modal_window,\n.video_modal_window,\n.document_modal_window {\n  display: block;\n}\n.photo_modal_error {\n  color: #999;\n  position: absolute;\n  width: 100%;\n  top: 50%;\n  margin-top: -20px;\n  padding: 0 20px;\n  text-align: center;\n  font-size: 1.4em;\n  line-height: 160%;\n}\n.video_full_error {\n  border-radius: 10px;\n  overflow: hidden;\n  background: rgba(0,0,0,0.6);\n  color: #fff;\n  position: absolute;\n  top: 50%;\n  margin: -40px 10px 0;\n  padding: 10px 10px;\n  text-align: center;\n  font-size: 1.4em;\n  line-height: 160%;\n}\n\n.settings_modal_wrap .im_attach_input {\n  z-index: 999;\n}\n\n.settings_modal_username_link {\n  &,\n  &:hover {\n    color: inherit;\n  }\n}\n\n.settings_external_service {\n  line-height: 0;\n  display: inline-block;\n  padding: 7px 9px;\n}\n\n.settings_about_section_body {\n  padding-right: 0;\n\n  p {\n    margin-top: 7px;\n    margin-bottom: 3px;\n  }\n}\n\n.icon-github {\n  display: inline-block;\n  width: 59px;\n  height: 18px;\n\n  .image-2x('../img/icons/AboutLogos.png', 60px, 136px);\n  background-position: 0 -5px;\n\n  a:hover & {\n    background-position: 0 -43px;\n  }\n}\n\n.icon-twitter {\n  display: inline-block;\n  width: 20px;\n  height: 15px;\n  margin-top: 1px;\n\n  .image-2x('../img/icons/AboutLogos.png', 60px, 136px);\n  background-position: 0 -81px;\n\n  a:hover & {\n    background-position: 0 -116px;\n  }\n}\n\n/* Contacts modal */\n.contacts_modal_search {\n  position: relative;\n  padding: 7px 12px 6px;\n  .box-shadow(0px 1px 1px rgba(0,0,0,0.15));\n  z-index: 1;\n}\n\n.contacts_modal_search_field {\n  font-size: 12px;\n  line-height: normal;\n  border: 1px solid #fff  !important;\n  border-radius: 2px;\n  padding: 6px 27px 6px 30px;\n  margin: 0;\n\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -6px -205px;\n\n  &::-ms-clear {\n    display: none;\n  }\n}\n\na.contacts_modal_search_clear {\n  right: 9px;\n  margin-top: -24px;\n}\n.contacts_scrollable_wrap {\n  outline: none ! important;\n}\n.contacts_modal_contacts_empty {\n  visibility: hidden;\n  text-align: center;\n  color: #999;\n  font-size: 16px;\n  line-height: 160%;\n  padding: 1px 50px;\n  margin: 0;\n}\n.contacts_modal_contacts_empty.vertical-aligned {\n  visibility: visible;\n}\n\n.contacts_modal_members_list {\n\n  .contacts_modal_contact_wrap {\n    margin-top: 0;\n  }\n\n  a.contacts_modal_contact {\n    clear: both;\n    overflow: hidden;\n    color: #000;\n    padding: 8px 9px;\n    border-radius: 0;\n\n    &:hover {\n      background: #f2f6fa;\n    }\n  }\n\n  .active {\n    a.contacts_modal_contact {\n      &,\n      &:hover {\n        background: #f2f6fa;\n      }\n    }\n  }\n}\n\n.contacts_modal_contact_name {\n  display: block;\n  color: #3C6E97;\n  font-weight: bold;\n  margin: 1px 0 2px;\n\n  .non_osx & {\n    font-size: 12px;\n  }\n}\n\n.contacts_modal_contact_photo {\n  width: 40px;\n  height: 40px;\n  margin-right: 10px;\n  overflow: hidden;\n  border-radius: 20px;\n\n  .peer_initials {\n    line-height: 40px;\n    font-size: 15px;\n  }\n}\n.contacts_modal_contact_status {\n  color: #999;\n}\na.contacts_modal_contact:hover .contacts_modal_contact_status,\n.contacts_modal_members_list .active a.contacts_modal_contact .contacts_modal_contact_status,\na.contacts_modal_contact:hover .md_modal_list_peer_description,\n.contacts_modal_members_list .active a.contacts_modal_contact .md_modal_list_peer_description {\n  color: #91a6ba;\n}\n\nh4.chat_modal_migrate_header {\n  font-size: inherit;\n  font-weight: bold;\n  color: inherit;\n}\nul.chat_modal_migrate_list {\n  margin-top: 10px;\n  padding-left: 15px;\n}\n\n.chat_modal_participant_wrap {\n  padding: 8px 0;\n  border-top: 1px solid #F0F0F0;\n\n  &:first-child {\n    border-top: 0;\n  }\n}\n\n.chat_modal_participant_kick {\n  padding: 11px 0;\n  display: block;\n}\n\n.chat_modal_participant_name {\n  display: block;\n  color: #3C6E97;\n  font-weight: bold;\n  margin: 1px 0 2px;\n\n  .non_osx & {\n    font-size: 12px;\n  }\n}\n\n.chat_modal_participant_status {\n  color: #999;\n}\n\n.chat_modal_participant_photo {\n  a& {\n    width: 40px;\n    height: 40px;\n    margin-right: 10px;\n    border-radius: 20px;\n    overflow: hidden;\n  }\n  img& {\n    width: 40px;\n    height: 40px;\n  }\n  .peer_initials {\n    line-height: 40px;\n    font-size: 15px;\n  }\n}\n\n.chat_modal_members_forbidden {\n  color: #999;\n}\n\n.icon-contact-tick {\n  position: absolute;\n  right: 10px;\n  top: 17px;\n  display: inline-block;\n  width: 25px;\n  height: 25px;\n  opacity: 0.5;\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -9px -516px;\n}\n\n.contacts_modal_members_list {\n  .contacts_modal_contact_wrap:hover {\n    .icon-contact-tick {\n      background-position: -9px -481px;\n      opacity: 0.5;\n    }\n  }\n\n  .contacts_modal_contact_wrap.active {\n    .icon-contact-tick {\n      background-position: -9px -481px;\n      opacity: 1;\n    }\n  }\n\n  .disabled {\n    pointer-events: none;\n\n    .icon-contact-tick {\n      display: none;\n    }\n  }\n}\n\n\n.sessions_modal {\n  &_session {\n    padding: 8px 24px;\n  }\n  &_sessions_header {\n    color: #999;\n    font-size: 13px;\n    margin-left: 16px;\n    margin-top: 20px;\n    font-weight: bold;\n  }\n  &_terminate_all_wrap {\n    margin: 5px 0 0 24px;\n  }\n}\n.sessions_modal_sessions_list {\n  padding: 14px 0 10px;\n  margin-bottom: 10px;\n}\n.session_active_date_online {\n  color: #3a6d99;\n}\n.sessions_modal_loading {\n  text-align: center;\n  color: #999;\n  font-size: 16px;\n  line-height: 18px;\n  padding: 1px 50px;\n  margin: 0;\n}\n.session_active_date {\n  color: #999;\n}\n.session_meta_wrap {\n  text-align: right;\n}\n.session_terminate_btn {\n  margin-top: 24px;\n  display: inline-block;\n}\n.sessions_modal_session_app {\n  font-weight: bold;\n  font-style: 12px;\n  margin-bottom: 3px;\n}\n.sessions_modal_session_device {\n  margin: 3px 0 3px;\n}\n.sessions_modal_session_location {\n  color: #777;\n}\n\n.sessions_modal_other_splitter {\n  margin: 15px 0 20px 24px;\n}\n\n\n.stickerset_modal_window .modal-dialog {\n  max-width: 642px;\n  width: auto;\n}\n.stickerset_modal_stickers_list {\n  padding: 25px;\n}\n.stickerset_modal_sticker_wrap {\n  margin: 0 5px 5px 0;\n  padding: 0;\n  position: relative;\n  display: block;\n  width: 192px;\n  height: 192px;\n  float: left;\n  border-radius: 3px;\n  overflow: hidden;\n\n  &:hover {\n    background: #f2f6fa;\n  }\n}\n.stickerset_modal_sticker {\n  width: 192px;\n  height: 192px;\n  text-align: center;\n}\n.stickerset_modal_sticker img {\n  max-width: 192px;\n  max-height: 192px;\n}\n.stickerset_modal_sticker_alt {\n  position: absolute;\n  bottom: 0;\n  right: 0;\n}\n.stickerset_actions {\n  padding: 10px 20px;\n  height: 50px;\n  text-align: center;\n}\n.stickerset_modal_loading {\n  text-align: center;\n  color: #999;\n  font-size: 16px;\n  line-height: 18px;\n  padding: 1px 50px;\n  margin: 0;\n}\n\n.modal-dialog {\n  width: 100%;\n  \n  .md_simple_modal_window &,\n  .confirm_modal_window &,\n  .error_modal_window & {\n    max-width: 348px;\n  }\n}\n\n.im_message_focus_active {\n  .im_message_date,\n  .im_message_author_admin,\n  .im_message_document_size,\n  .audio_player_duration,\n  .audio_player_size,\n  .im_message_fwd_date,\n  .im_message_views_cnt,\n  .im_message_sign_link,\n  .im_message_edited {\n    color: #899daf;\n  }\n\n  .im_message_outer_wrap {\n    // background-color: rgba(242, 246, 250, 1.0);\n    background-color: rgba(242, 246, 250, 0);\n    animation-name: im_message_focus_fade;\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-out;\n    animation-duration: 4s;\n  }\n}\n\n@keyframes im_message_focus_fade {\n    from {\n      background-color: rgba(242, 246, 250, 1.0);\n    }\n    to {\n      background-color: rgba(242, 246, 250, 0);\n    }\n}\n\n/* Colorized user names */\n.user {\n  .generate_user(@user_colors, true);\n  .generate_user(@user_bgcolors, false);\n}\n\na.peer_photo_init {\n  &:hover,\n  &:active,\n  &:focus {\n    text-decoration: none;\n  }\n}\n\n.peer_initials {\n  display: block;\n  color: #fff;\n  text-align: center;\n  text-transform: uppercase;\n\n  .user-select(none);\n}\n\nh5 {\n  .im_dialogs_contacts_wrap &,\n  .im_dialogs_messages_wrap & {\n    color: #999;\n    font-size: 13px;\n    margin-left: 20px;\n    font-weight: bold;\n  }\n}\n\n/* Gif documents */\n.img_gif_image_wrap {\n  position: relative;\n  overflow: hidden;\n}\n.img_gif_meta {\n  background: rgba(0,0,0,0.4);\n  width: 40px;\n  height: 40px;\n  line-height: 0;\n  position: absolute;\n  z-index: 2;\n  border-radius: 50%;\n  overflow: hidden;\n  margin: 0 auto;\n  top: 50%;\n  left: 50%;\n  margin-left: -20px;\n  margin-top: -20px;\n  pointer-events: none;\n}\n.img_gif_label {\n  font-weight: bold;\n  color: #FFF;\n  display: block;\n  line-height: 40px;\n  font-size: 13px;\n  text-align: center;\n}\n.icon-cancel {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin-left: -9px;\n  margin-top: -1px;\n\n  .icon-bar {\n    display: block;\n    width: 18px;\n    height: 2px;\n    background: #FFF;\n    transform-origin: 50% 50%;\n\n    &:first-child {\n      .transform(rotate(-45deg));\n    }\n    &:last-child {\n      .transform(translate3d(0,-2px,0) rotate(45deg));\n    }\n  }\n}\n\n.img_gif_thumb {\n  -webkit-filter: blur(2px);\n  -moz-filter: blur(2px);\n  -o-filter: blur(2px);\n  -ms-filter: blur(2px);\n  filter: blur(2px);\n  filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='3');\n  transform-origin: center center;\n  -webkit-transform-origin: center center;\n  -webkit-transform: scale(1.02, 1.02);\n  transform: scale(1.02, 1.02);\n\n  max-width: 100%;\n  height: auto;\n}\n\n.img_gif_meta_contents {\n  transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.2s;\n}\n.img_gif_meta_contents.ng-leave.ng-leave-active,\n.img_gif_meta_contents.ng-enter {\n  opacity: 0;\n}\n.img_gif_meta_contents.ng-leave,\n.img_gif_meta_contents.ng-enter.ng-enter-active {\n  opacity: 1;\n}\n\n\n/* Round documents */\n.img_round_with_progress_wrap {\n  display: inline-block;\n  line-height: 0;\n}\n.img_round_image_wrap {\n  position: relative;\n  overflow: hidden;\n  border-radius: 50%;\n\n  // Safari doesn't use border radius without this\n  -webkit-transform: translateZ(0);\n  // -webkit-perspective: 1000;\n  // -webkit-backface-visibility: hidden;\n}\n.img_round_meta {\n  background: rgba(0,0,0,0.4);\n  .img_round_video_unread & {\n    background: rgba(100,144,177,0.6);\n  }\n\n  width: 40px;\n  height: 40px;\n  line-height: 0;\n  position: absolute;\n  z-index: 2;\n  border-radius: 50%;\n  overflow: hidden;\n  margin: 0 auto;\n  top: 50%;\n  left: 50%;\n  margin-left: -20px;\n  margin-top: -20px;\n  pointer-events: none;\n}\n.icon-cancel {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin-left: -9px;\n  margin-top: -1px;\n\n  .icon-bar {\n    display: block;\n    width: 18px;\n    height: 2px;\n    background: #FFF;\n    transform-origin: 50% 50%;\n\n    &:first-child {\n      .transform(rotate(-45deg));\n    }\n    &:last-child {\n      .transform(translate3d(0,-2px,0) rotate(45deg));\n    }\n  }\n}\n\n.img_round_thumb {\n  -webkit-filter: blur(2px);\n  -moz-filter: blur(2px);\n  -o-filter: blur(2px);\n  -ms-filter: blur(2px);\n  filter: blur(2px);\n  filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='3');\n  transform-origin: center center;\n  -webkit-transform-origin: center center;\n  -webkit-transform: scale(1.02, 1.02);\n  transform: scale(1.02, 1.02);\n\n  max-width: 100%;\n  height: auto;\n}\n\n.img_round_meta_contents {\n  transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.2s;\n}\n.img_round_meta_contents.ng-leave.ng-leave-active,\n.img_round_meta_contents.ng-enter {\n  opacity: 0;\n}\n.img_round_meta_contents.ng-leave,\n.img_round_meta_contents.ng-enter.ng-enter-active {\n  opacity: 1;\n}\n\n.countries_modal_window {\n  .modal-dialog {\n    max-width: 392px;\n  }\n}\n\n.countries_modal_window {\n  .modal_simple_header {\n    margin-bottom: 12px;\n    font-weight: normal;\n  }\n}\n\n.countries_modal_search {\n  padding: 0 0 12px;\n  margin: 0 20px;\n  position: relative;\n}\n\n\n.countries_modal_search_field {\n  font-size: 12px;\n  line-height: normal;\n  background-size: 42px 1171px;\n  border: 1px solid #F2F2F2;\n  border-radius: 3px;\n  padding: 6px 20px 6px 30px;\n  margin-bottom: 0;\n  margin: 0;\n\n  background-color: #F2F2F2;\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -6px -205px;\n\n  &:focus,\n  &:active {\n    background-color: #fff;\n  }\n\n  &::-ms-clear {\n    display: none;\n  }\n}\n\na.countries_modal_search_clear {\n  right: 12px;\n  margin-top: -34px;\n}\n.countries_modal_wrap .modal-body {\n  padding: 14px 0;\n}\n\n.countries_scrollable_wrap {\n  a.countries_modal_country {\n    clear: both;\n    overflow: hidden;\n    color: #000;\n    padding: 8px 26px;\n    font-size: 12px;\n    border-radius: 0;\n\n    &:hover {\n      border-radius: 2px;\n      background: #f2f6fa;\n    }\n  }\n}\n\n.countries_modal_country_code {\n  color: #999;\n\n  .countries_scrollable_wrap a.countries_modal_country:hover & {\n    color: #698192;\n  }\n}\n\n/* Loading dots animation */\n.loading_dots {\n  display: inline-block;\n  font-size: 1em;\n  line-height: 1;\n  padding: 0.125em 0 0.175em 0.15em;\n\n  i {\n    border: 0.125rem solid;\n    border-radius: 50%;\n    display: inline-block;\n    height: 0.2rem;\n    width:  0.2rem;\n    margin-left: 0.2rem;\n\n    -webkit-animation:  loading_dots 0.8s linear infinite;\n    -moz-animation:     loading_dots 0.8s linear infinite;\n    -ms-animation:      loading_dots 0.8s linear infinite;\n    animation:          loading_dots 0.8s linear infinite;\n\n    &:nth-child(2) {\n      -webkit-animation-delay:  0.2s;\n      -moz-animation-delay:     0.2s;\n      -ms-animation-delay:      0.2s;\n      animation-delay:          0.2s;\n    }\n    &:nth-child(3) {\n      -webkit-animation-delay:  0.4s;\n      -moz-animation-delay:     0.4s;\n      -ms-animation-delay:      0.4s;\n      animation-delay:          0.4s;\n    }\n  }\n\n  @-webkit-keyframes loading_dots {\n    0% {\n      opacity: 0;\n    }\n    50% {\n      opacity: 1;\n    }\n    100% {\n      opacity: 0;\n    }\n  }\n\n  @-moz-keyframes loading_dots {\n    0% {\n      opacity: 0;\n    }\n    50% {\n      opacity: 1;\n    }\n    100% {\n      opacity: 0;\n    }\n  }\n  @-ms-keyframes loading_dots {\n    0% {\n      opacity: 0;\n    }\n    50% {\n      opacity: 1;\n    }\n    100% {\n      opacity: 0;\n    }\n  }\n  @keyframes loading_dots {\n    0% {\n      opacity: 0;\n    }\n    50% {\n      opacity: 1;\n    }\n    100% {\n      opacity: 0;\n    }\n  }\n}\n\n.telegram_modal_logo {\n  .image-2x('../img/Telegram72.png', 72px, 72px);\n  background-position: 0 0;\n}\n\n.changelog {\n  &_modal_window .modal-dialog {\n    max-width: 480px;\n  }\n\n  &_card_wrap {\n    text-align: center;\n    padding: 12px 0 18px;\n  }\n\n  &_header {\n    margin-top: 15px;\n    font-size: 16px;\n  }\n\n  &_card {\n    width: 160px;\n    height: 160px;\n    display: block;\n    background: url(../img/changelog/card_wecandoit.png) no-repeat 0 0;\n    background-size: 160px 160px;\n    margin: 0 auto;\n  }\n\n  &_card_search {\n    width: 133px;\n    height: 133px;\n    display: block;\n    background: url(../img/changelog/search.png) no-repeat 0 0;\n    background-size: 133px 133px;\n    margin: 0 auto;\n  }\n\n  &_version_title {\n    color: #9d9479;\n    background: #efede3;\n  }\n\n  &_version_changes_list li {\n    line-height: 20px;\n  }\n\n  &_footer_wrap {\n    padding: 15px 28px 30px 120px;\n  }\n\n  &_github_link {\n    font-size: 13px;\n    float: right;\n    color: #999;\n  }\n\n  &_more_link {\n    font-size: 13px;\n  }\n}\n\n.bad_browser_wrap {\n  border-radius: 4px;\n  border: 1px solid #ccc;\n  background: #fff;\n  max-width: 600px;\n  margin: 50px auto 0;\n  padding: 40px;\n\n  h2 {\n    margin-top: 0;\n  }\n}\n\n.bad_browser_text {\n  font-size: 14px;\n  line-height: 160%;\n  margin: 25px 0 30px;\n}\n\n#nacl_listener {\n  position: absolute;\n  left: -10000px;\n}\n\n.peer_modal_profile_wrap {\n  padding: 35px 2px 0px;\n}\n\n.peer_modal_photo {\n  width: 72px;\n  height: 72px;\n  border-radius: 36px;\n  overflow: hidden;\n\n  a&,\n  div& {\n    display: block;\n    margin-right: 19px;\n  }\n\n  .peer_initials {\n    line-height: 72px;\n    font-size: 22px;\n  }\n}\n\n.peer_modal_profile_name {\n  font-size: 14px;\n  padding: 15px 0 9px;\n  font-weight: bold;\n}\n.peer_modal_profile_description {\n  color: #ccdeed;\n}\n\n.md_modal_split_action {\n  display: block;\n  background: #fff;\n  float: right;\n  position: relative;\n  width: 52px;\n  height: 52px;\n  margin-left: 20px;\n  border-radius: 26px;\n  overflow: hidden;\n\n  .box-shadow(0 1px 1px rgba(0, 0, 0, 0.2));\n\n  &s {\n    position: absolute;\n    right: 25px;\n    top: -26px;\n\n    &_wrap {\n      position: relative;\n    }\n  }\n\n  &_camera {\n    display: inline-block;\n    width: 20px;\n    height: 18px;\n    margin: 17px 0 0 16px;\n\n    .image-2x('../img/icons/ProfileIcons.png', 40px, 420px);\n    background-position: -10px -164px;\n  }\n\n  &:hover &_camera,\n  &:active &_camera {\n    background-position: -10px -192px;\n  }\n\n  &_twitter {\n    display: inline-block;\n    width: 27px;\n    height: 22px;\n    margin: 17px 0 0 13px;\n\n    .image-2x('../img/icons/ProfileIcons.png', 40px, 420px);\n    background-position: -7px -280px;\n  }\n\n  &:hover &_twitter,\n  &:active &_twitter {\n    background-position: -7px -312px;\n  }\n\n  &_msg {\n    display: inline-block;\n    width: 20px;\n    height: 20px;\n    margin: 18px 0 0 16px;\n\n    .image-2x('../img/icons/ProfileIcons.png', 40px, 420px);\n    background-position: -10px -220px;\n  }\n\n  &:hover &_msg,\n  &:active &_msg {\n    background-position: -10px -250px;\n  }\n}\n\n.md_modal_iconed_section {\n  &_wrap {\n    position: relative;\n    border-bottom: 1px solid #ebebeb;\n    margin: 19px 0 0 120px;\n    padding-right: 28px;\n\n    &:last-child {\n      border-bottom: 0;\n    }\n  }\n\n  &_number {\n    margin-top: 0;\n  }\n\n  &_toggle {\n    margin-top: 10px;\n  }\n\n  &_radio {\n    margin-top: 1px;\n  }\n}\n\n.md_modal_section {\n  &s {\n    padding-top: 17px;\n  }\n\n  &_icon {\n    display: inline-block;\n    margin-left: -64px;\n    margin-top: 5px;\n    position: absolute;\n\n    .image-2x('../img/icons/ProfileIcons.png', 40px, 420px);\n    background-position: 0 0;\n\n    .md_modal_iconed_section_toggle & {\n      margin-top: 8px;\n    }\n    .md_modal_iconed_section_radio & {\n      margin-top: 10px;\n    }\n    .md_modal_iconed_section_link & {\n      margin-top: 4px;\n    }\n\n    &_phone {\n      width: 18px;\n      height: 18px;\n      background-position: -12px -10px;\n      margin-top: 3px;\n    }\n\n    &_about {\n      width: 20px;\n      height: 20px;\n      background-position: -10px -344px;\n      margin-top: 0px;\n    }\n\n    &_notification {\n      width: 17px;\n      height: 20px;\n      background-position: -12px -38px;\n    }\n\n    &_keyboard {\n      width: 20px;\n      height: 14px;\n      background-position: -10px -140px;\n      margin-left: -66px;\n    }\n\n    &_person {\n      width: 16px;\n      height: 16px;\n      background-position: -12px -90px;\n    }\n\n    &_people {\n      width: 22px;\n      height: 14px;\n      background-position: -9px -116px;\n    }\n\n    &_more {\n      width: 18px;\n      height: 12px;\n      background-position: -11px -68px;\n    }\n  }\n\n  &_param_wrap {\n    margin-top: 19px;\n    margin-bottom: 19px;\n\n    &:last-child {\n      margin-bottom: 16px;\n    }\n\n    .md_modal_section_param_name {\n      color: #909090;\n      font-size: 11px;\n      line-height: 14px;\n      margin-top: 4px;\n    }\n    .md_modal_section_param_value {\n      word-break: break-word;\n      word-wrap: break-word;\n      overflow: hidden;\n    }\n  }\n\n  &_range_wrap {\n    padding-right: 4px;\n    margin-bottom: 25px;\n    padding-top: 1px;\n  }\n\n  &_select_wrap {\n    margin-bottom: 20px;\n  }\n\n  &_select {\n    float: right;\n    font-size: 12px;\n    padding: 0;\n  }\n\n  &_select_wrap &_param_name {\n    padding-top: 1px;\n  }\n\n  &_select {\n    .dropdown-toggle {\n      font-size: 12px;\n      padding: 0;\n      line-height: normal;\n    }\n\n    .dropdown-menu {\n      left: -15px;\n    }\n  }\n\n  &_link {\n    color: inherit;\n    display: block;\n    padding: 4px 0;\n\n    &_wrap {\n      padding-bottom: 15px;\n    }\n\n    &:hover {\n      text-decoration: none;\n    }\n    &.pull-right {\n      color: #3a6d99;\n    }\n  }\n\n  &_text {\n    display: block;\n    padding: 4px 0;\n    color: #777;\n  }\n\n  &_version {\n    color: #777;\n    display: inline-block;\n    margin-left: -70px;\n    position: absolute;\n  }\n\n  &_splitter {\n    border-top: 1px solid #dfdfdf;\n    min-height: 12px;\n    background: #f5f5f5;\n\n    .box-shadow(inset 0px 1px 1px #ededed);\n  }\n  &_splitter_content {\n    height: auto;\n    padding-left: 120px;\n    color: #777;\n    font-size: 12px;\n    padding: 5px 20px 3px 55px;\n  }\n}\n\n.md_modal_versioned_section_wrap {\n  position: relative;\n  border-bottom: 1px solid #ebebeb;\n  margin: 19px 0 0 120px;\n  padding-right: 28px;\n\n  &:last-child {\n    border-bottom: 0;\n  }\n}\n\n.md_modal_list_peer {\n  &_wrap {\n    padding-bottom: 16px;\n  }\n\n  &_action {\n    font-size: 13px;\n    padding: 3px;\n    margin: -3px;\n  }\n\n  &_photo {\n    width: 42px;\n    height: 42px;\n    line-height: 42px;\n    border-radius: 50%;\n    overflow: hidden;\n\n    a&,\n    div& {\n      margin-right: 12px;\n    }\n  }\n\n  &_name {\n    font-size: 13px;\n    font-weight: bold;\n\n    a& {\n      color: inherit;\n    }\n  }\n\n  &_description {\n    margin-top: 4px;\n    color: #999;\n\n    &.status_online,\n    .status_online {\n      color: #3a6d99;\n    }\n  }\n}\n\n.md_modal_footer {\n  padding: 15px 27px 15px;\n}\n.md_modal_footer_empty {\n  padding: 10px 27px 0;\n}\n\n.md_photo_loading {\n  display: block;\n  width: 72px;\n  height: 72px;\n  border-radius: 36px;\n  overflow: hidden;\n  background: #48769b;\n  text-align: center;\n  line-height: 72px;\n  padding: 0;\n\n  i {\n    display: inline-block;\n    background: #fff;\n    width: 8px;\n    height: 8px;\n    border-radius: 4px;\n    vertical-align: middle;\n    border: 0;\n    margin-left: 6px;\n\n    &:first-child {\n      margin-left: 0;\n    }\n  }\n}\n\n.inactive_page_content {\n  max-width: 400px;\n  margin: 0 auto;\n  text-align: center;\n}\n.inactive_image {\n  display: block;\n  .image-2x('../img/Manytabs.png', 341px, 262px);\n  width: 341px;\n  height: 262px;\n  margin: 0 auto;\n}\n.inactive_title {\n  font-size: 18px;\n  color: #444444;\n}\n.inactive_description {\n  color: #666666;\n  font-size: 15px;\n  line-height: 150%;\n}\n.inactive_actions {\n  margin-top: 15px;\n}\n\n\n@media print {\n  html, body {\n    background: #fff;\n  }\n  body .im_page_wrap {\n    border: 0;\n    box-shadow: none;\n    overflow: visible;\n  }\n  body .im_dialogs_col_wrap,\n  body .im_bottom_panel_wrap,\n  body .tg_head_logo_wrap,\n  body .tg_head_peer_search_btn,\n  body .tg_head_peer_return_btn,\n  body .tg_head_peer_dropdown {\n    display: none;\n  }\n  body .im_history_wrap {\n    height: auto !important;\n  }\n  body .nano-pane {\n    display: none;\n  }\n  body .nano > .nano-content {\n    position: static;\n  }\n  body .tg_head_peer_info {\n    text-align: center;\n  }\n  body .im_history_col_wrap,\n  body .tg_head_main_wrap {\n    width: auto;\n    max-width: 700px;\n    float: none;\n    margin: 0 auto;\n  }\n}\n\n.visually-hidden { /* https://snook.ca/archives/html_and_css/hiding-content-for-accessibility */\n  position: absolute !important;\n  height: 1px; width: 1px;\n  overflow: hidden;\n  clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n  clip: rect(1px, 1px, 1px, 1px);\n}\n"
  },
  {
    "path": "app/less/desktop.less",
    "content": "@import \"lib/mixins\";\n\n/* app desktop css */\n\n.tg_head {\n  &_split {\n    max-width: 1010px;\n    margin: 0 auto;\n    height: 48px;\n    background: #5682a3;\n  }\n\n  &_logo_wrap {\n    float: left;\n    width: 31%;\n  }\n\n  &_main_wrap {\n    float: left;\n    width: 69%;\n    white-space: nowrap;\n  }\n\n  &_btn {\n    display: block;\n    font-weight: bold;\n    padding: 16px 19px;\n    color: #b9cfe3;\n    font-size: 13px;\n    line-height: 16px;\n\n    .dropdown.open &,\n    &:hover {\n      color: #fff;\n      text-decoration: none;\n      background: #497799;\n    }\n\n    .dropdown.open & {\n      position: relative;\n      z-index: 5;\n    }\n  }\n}\n\n.tg_head_logo_dropdown {\n  .dropdown-toggle {\n    color: #fff;\n    padding: 17px 20px 15px 22px;\n    display: block;\n    font-size: 14px;\n    line-height: 16px;\n    vertical-align: top;\n\n    &:hover,\n    &:focus,\n    &:active {\n      text-decoration: none;\n    }\n\n    .tg_head_logo_text {\n      display: inline-block;\n      vertical-align: top;\n    }\n  }\n}\n\n.login_try_desktop,\n.tg_try_desktop {\n  background: #24a3f8;\n  background: linear-gradient(90deg, #2496ff 0%, #24b0f1 100%);\n  -webkit-font-smoothing: antialiased;\n  text-align: center;\n  position: relative;\n  z-index: 100;\n\n  .try_desktop_text {\n    font-size: 14px;\n    font-weight: bold;\n    padding: 22px 15px;\n    margin-bottom: 0;\n    color: #fff;\n\n    & a {\n      color: #fff;\n    }\n  }\n\n  a.try_desktop_btn {\n    display: inline-block;\n    font-size: 13px;\n    line-height: 22px;\n    padding: 8px 20px;\n    border-radius: 19px;\n    font-weight: bold;\n    background: #fff;\n    color: #539def;\n\n    &:hover,\n    &:focus,\n    &:active {\n      text-decoration: none;\n      color: #539def;\n    }\n  }\n\n  .try_desktop_close {\n    position: absolute;\n    display: inline-block;\n    width: 21px;\n    height: 21px;\n    margin: 10px 12px;\n    background: url('data:image/svg+xml,%3Csvg%20height%3D%2221%22%20viewBox%3D%220%200%2021%2021%22%20width%3D%2221%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22m5.3%205.3c.4-.4%201-.4%201.4%200l3.5%203.5%203.6-3.5c.4-.4%201-.4%201.4%200s.4%201%200%201.4l-3.5%203.5%203.5%203.6c.4.3.4.9.1%201.3l-.1.1c-.4.4-1%20.4-1.4%200l-3.6-3.5-3.5%203.5c-.4.4-1%20.4-1.4%200s-.4-1%200-1.4l3.5-3.6-3.5-3.5c-.4-.4-.4-.9-.1-1.3z%22%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E');\n    cursor: pointer;\n    right: 0;\n    top: 0;\n  }\n}\n\n.login_try_desktop {\n  margin-bottom: -64px;\n  height: 120px;\n\n  &:before,\n  &:after {\n    position: absolute;\n    display: inline-block;\n    pointer-events: none;\n    content: '';\n    width: 314px;\n    height: 120px;\n    opacity: .25;\n    top: 0;\n  }\n\n  &:before {\n    background: url('data:image/svg+xml,%3Csvg%20height%3D%22120%22%20viewBox%3D%220%200%20314%20120%22%20width%3D%22314%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22m-65.3-70c54.8%200%20102%2034.5%20122.6%2083.8%203.6-.5%207.3-.8%2011.1-.8%2022.3%200%2042.6%209.1%2057.5%2024h2.4c24.1%200%2044.9%2014.9%2054.4%2036.3.2.1.3.1.5.2.5.1%201.1.1%201.8%200%206.2-2.6%2012.9-4%2019.9-4%2021.8%200%2040.5%2013.5%2048.9%2033%20.3.2.6.4.9.5.4.1.9.2%201.4.2%205.6-4.4%2012.6-6.9%2020.1-6.9%2018.1%200%2032.8%2014.7%2032.8%2032.8%200%2018.2-14.7%2032.9-32.8%2032.9-9.4%200-18-4-23.9-10.5-9%2017.7-26.8%2029.8-47.4%2029.8-19.6%200-36.7-11.1-46-27.5-9%205.7-19.4%209-30.6%209-.8%200-1.6-.1-2.4-.1-14.9%2014.9-35.2%2024.1-57.5%2024.1-16.4%200-31.6-5-44.5-13.4-23.6%2022.1-54.9%2035.6-89.2%2035.6-73.8%200-133.7-62.5-133.7-139.5s59.9-139.5%20133.7-139.5z%22%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E');\n    left: 0;\n  }\n\n  &:after {\n    background: url('data:image/svg+xml,%3Csvg%20height%3D%22120%22%20viewBox%3D%220%200%20314%20120%22%20width%3D%22314%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22m333.8-24c64.2%200%20116.2%2049.2%20116.2%20109.9%200%2060.8-52%20110-116.2%20110-18%200-35-3.9-50.2-10.8-15.8%2013-36.5%2020.9-59.1%2020.9-31.1%200-58.6-14.9-74.9-37.7-7.7%203.9-16.5%206.1-25.9%206.1-12%200-23.2-3.6-32.3-9.7-8.6%208.5-20.8%2013.8-34.3%2013.8-15.8%200-29.9-7.3-38.5-18.7-4.1%2012.6-16.5%2021.8-31.1%2021.8-18%200-32.5-13.7-32.5-30.6%200-17%2014.5-30.7%2032.5-30.7%207.5%200%2014.5%202.5%2020%206.6.6.4%201.2.9%201.8%201.4.1%200%20.2-.1.4-.1.1-.1.1-.1.2-.1.1-.9.3-1.9.4-2.8%204-21.1%2023.5-37%2046.8-37%206.5%200%2012.6%201.2%2018.2%203.4.6%200%201.1.1%201.4%200%20.3-.2.6-.3.9-.5%2010.1-13.8%2027-22.9%2046.1-22.9%209%200%2017.5%202%2025%205.5%2016.1-23.4%2044.1-38.9%2075.8-38.9%202.1%200%204.2%200%206.2.2%2019.4-35.1%2058.3-59.1%20103.1-59.1z%22%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E');\n    right: 0;\n  }\n\n  a.try_desktop_btn {\n    margin-top: -2px;\n  }\n}\n.tg_try_desktop {\n  max-width: 1010px;\n  margin: 0 auto;\n  height: 66px;\n\n  .try_desktop_close {\n    margin: 22px 19px 0 0;\n  }\n\n  a.try_desktop_btn {\n    display: inline;\n    padding: 7px 15px;\n    border-radius: 15px;\n    margin-left: 15px;\n  }\n}\n\n.icon-hamburger-wrap {\n  display: inline-block;\n  width: 18px;\n  height: 14px;\n  -webkit-transform: translate3d(0,0,0);\n}\n\n.tg_head_logo_dropdown {\n  .icon-hamburger-wrap {\n    margin: 0 40px 0 0;\n    vertical-align: top;\n  }\n\n  .icon-tg-title {\n    vertical-align: top;\n  }\n}\n\n.icon-hamburger-wrap {\n  .icon-bar {\n    background: #fff;\n    display: block;\n    height: 2px;\n    margin: 0;\n\n    &:nth-child(2) {\n      margin-bottom: 4px;\n      margin-top: 4px;\n    }\n  }\n}\n\n.tg_head_logo_dropdown {\n  .icon-bar {\n    opacity: 1;\n    -webkit-transition: -webkit-transform .1s ease-in;\n    -o-transition: -o-transform .1s ease;\n    -ms-transition: -ms-transform .1s ease;\n    -moz-transition: -moz-transform .1s ease;\n    transition: transform .1s ease-in;\n    -webkit-transform-origin: 50% 50%;\n    -o-transform-origin: 50% 50%;\n    -ms-transform-origin: 50% 50%;\n    -moz-transform-origin: 50% 50%;\n    transform-origin: 50% 50%;\n  }\n\n  &:not(.open) {\n    .dropdown-toggle:hover {\n      .icon-bar {\n        &:nth-child(1) {\n          .transform(translateY(-1px));\n        }\n\n        &:nth-child(3) {\n          .transform(translateY(1px));\n        }\n      }\n    }\n  }\n\n  &.open {\n    .icon-bar {\n      &:nth-child(1) {\n        .transform(translate3d(0,6px,0) rotate(45deg));\n      }\n\n      &:nth-child(2) {\n        opacity: 0;\n      }\n\n      &:nth-child(3) {\n        .transform(translate3d(0,-6px,0) rotate(-45deg));\n      }\n    }\n  }\n\n  .dropdown-menu {\n    border-radius: 0;\n    padding: 9px 0 7px;\n\n    margin: -1px 0 0;\n    float: none;\n    right: 0;\n    border: 1px solid rgba(15, 60, 96, 0.2);\n    border-left-color: #b5c3d0;\n    border-right-color: #b5c3d0;\n\n    .box-shadow(0px 1px 3px 0px rgba(60,75,87,0.27));\n\n    overflow: hidden;\n  }\n\n  @-webkit-keyframes rollIn {\n      from { transform: translateY(-220px); }\n        to { transform: translateY(0); }\n  }\n\n  @keyframes rollIn {\n      from { transform: translateY(-220px); }\n        to { transform: translateY(0); }\n  }\n\n  &.open {\n    .dropdown-menu {\n      -webkit-animation: rollIn 0.1s ease-in;\n      animation: rollIn 0.1s ease-in;\n      z-index: 4;\n    }\n  }\n\n  .dropdown-menu {\n    & > li {\n      & > a {\n        font-size: 12px;\n        line-height: 21px;\n        padding: 11px 19px 10px 21px;\n        color: #42749b;\n\n        &:hover {\n          background: #f2f6fa;\n        }\n\n        span {\n          vertical-align: top;\n        }\n      }\n    }\n  }\n}\n\n\n.icon {\n  &-new-group {\n    width: 20px;\n    height: 14px;\n    margin-right: 38px;\n    display: inline-block;\n    vertical-align: top;\n    margin-top: 3px;\n    .image-2x('../img/icons/General.png', 40px, 948px);\n    background-position: -10px -111px;\n\n  }\n\n  &-contacts {\n    width: 18px;\n    height: 18px;\n    margin-right: 40px;\n    margin-top: 2px;\n    display: inline-block;\n    vertical-align: top;\n    .image-2x('../img/icons/General.png', 40px, 948px);\n    background-position: -11px -135px;\n  }\n\n  &-settings {\n    width: 20px;\n    height: 20px;\n    margin-right: 38px;\n    margin-top: 1px;\n    display: inline-block;\n    vertical-align: top;\n    .image-2x('../img/icons/General.png', 40px, 948px);\n    background-position: -10px -163px;\n  }\n\n  &-faq {\n    width: 20px;\n    height: 20px;\n    margin-right: 38px;\n    margin-top: 1px;\n    display: inline-block;\n    vertical-align: top;\n    .image-2x('../img/icons/General.png', 40px, 948px);\n    background-position: -10px -637px;\n  }\n\n  &-about {\n    width: 21px;\n    height: 21px;\n    margin-right: 37px;\n    display: inline-block;\n    vertical-align: top;\n\n    .image-2x('../img/icons/General.png', 40px, 948px);\n    background-position: -10px -193px;\n  }\n}\n\n.tg_head_connecting {\n  &_text {\n    color: #b9cfe3;\n    padding: 14px 15px;\n    font-size: 13px;\n    display: block;\n    line-height: 20px;\n    float: left;\n  }\n\n  &_wrap {\n    .tg_head_btn {\n      float: left;\n    }\n  }\n}\n\n.tg_head_peer_search_btn {\n  float: right;\n  padding-top: 15px;\n  padding-bottom: 15px;\n}\n\n.tg_head_peer {\n  &_dropdown {\n    float: right;\n  }\n\n  &_status {\n    font-weight: normal;\n  }\n\n  &_dropdown {\n    .dropdown-menu {\n      max-width: 100%;\n      border-radius: 0;\n      padding: 9px 0;\n\n      float: none;\n      right: 0;\n      left: auto;\n\n      margin: -1px 0 0 0;\n      border: 1px solid rgba(15, 60, 96, 0.2);\n\n      .box-shadow(0px 1px 3px 0px rgba(60,75,87,0.27));\n    }\n  }\n\n  &_more_dropdown {\n    .dropdown-menu {\n      left: auto;\n      right: 0;\n    }\n  }\n\n  &_dropdown {\n    .dropdown-menu {\n      & > li {\n        & > a {\n          font-size: 13px;\n          line-height: 15px;\n          padding: 11px 18px 11px 18px;\n          color: #52719a;\n\n          &:hover {\n            background: #f3f6fa;\n          }\n        }\n      }\n    }\n  }\n\n  &_return_btn {\n    float: right;\n  }\n\n  &_return_count {\n    color: #fff;\n    margin-left: 3px;\n  }\n\n  &_title_wrap {\n    overflow: hidden;\n\n    .tg_head_btn {\n      padding: 15px 19px 15px;\n      line-height: 18px;\n\n      .tg_head_peer_info {\n        display: block;\n        white-space: nowrap;\n        overflow: hidden;\n        -ms-text-overflow: ellipsis;\n        text-overflow: ellipsis;\n      }\n    }\n  }\n\n  &_title {\n    display: inline-block;\n    color: #fff;\n    margin-right: 3px;\n    -ms-text-overflow: ellipsis;\n    text-overflow: ellipsis;\n    max-width: 180px;\n    overflow: hidden;\n    vertical-align: top;\n  }\n\n  &_media {\n    padding: 14px 19px;\n    color: #fff;\n    font-size: 13px;\n    line-height: 20px;\n    float: left;\n    font-weight: bold;\n  }\n}\n\n.icon-search {\n  display: inline-block;\n  width: 17px;\n  height: 17px;\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -12px -1037px;\n  vertical-align: middle;\n  opacity: 0.9;\n}\n\n\n.tg_head_peer_media_dropdown {\n  .dropdown-toggle  {\n    display: block;\n\n    .icon-bar {\n      display: block;\n      background-color: #d7e5f0;\n      width: 4px;\n      height: 4px;\n      border-radius: 2px;\n      margin-left: 3px;\n      margin-right: 3px;\n\n      & + .icon-bar {\n        margin-top: 2px;\n      }\n    }\n  }\n}\n\n.icon-filter {\n  &-photos,\n  &-video,\n  &-documents,\n  &-audio {\n    display: inline-block;\n    margin-right: 12px;\n    vertical-align: top;\n\n    .image-2x('../img/icons/General.png', 40px, 948px);\n    background-position: 0 0;\n  }\n\n  &-photos {\n    width: 18px;\n    height: 18px;\n    background-position: -11px -223px;\n    margin-top: 1px;\n  }\n\n  &-video {\n    width: 16px;\n    height: 18px;\n    background-position: -12px -278px;\n    margin-top: 1px;\n  }\n\n  &-documents {\n    width: 18px;\n    height: 17px;\n    background-position: -11px -251px;\n    margin-top: 1px;\n  }\n\n  &-audio {\n    width: 14px;\n    height: 19px;\n    background-position: -13px -306px;\n    margin-top: 0;\n  }\n}\n\n/** initial setup **/\n.nano {\n  position : relative;\n  width    : 100%;\n  height   : 100%;\n  overflow : hidden;\n\n  & > .nano-content {\n    position      : absolute;\n    overflow      : scroll;\n    overflow-x    : hidden;\n    top           : 0;\n    right         : 0;\n    bottom        : 0;\n    left          : 0;\n\n    &:focus {\n      outline: thin dotted;\n    }\n\n    &::-webkit-scrollbar {\n      display: none;\n    }\n  }\n}\n\n.has-scrollbar {\n  & > .nano-content {\n    &::-webkit-scrollbar {\n      display: block;\n    }\n  }\n}\n\n.nano {\n  & > .nano-pane {\n    background : rgba(0,0,0,.25);\n    position   : absolute;\n    width      : 10px;\n    right      : 0;\n    top        : 0;\n    bottom     : 0;\n    visibility : hidden\\9; /* Target only IE7 and IE8 with this hack */\n    opacity    : .01;\n    -webkit-transition    : .2s;\n    -moz-transition       : .2s;\n    -o-transition         : .2s;\n    transition            : .2s;\n\n    .rounded(5px);\n\n    & > .nano-slider {\n      background: #444;\n      background: rgba(0,0,0,.5);\n      position              : relative;\n      margin                : 0 1px;\n\n      .rounded(3px);\n    }\n  }\n}\n\n.nano-pane {\n  .nano:hover > &,\n  &.active,\n  &.flashed {\n    visibility : visible\\9; /* Target only IE7 and IE8 with this hack */\n    opacity    : 0.99;\n  }\n}\n\n.composer_emoji_tooltip,\n.composer_dropdown_wrap {\n  z-index: 1001;\n\n  .nano > .nano-pane {\n    background : rgba(255,255,255,0.0);\n    right: -2px;\n    top: 5px;\n    bottom: 5px;\n\n    & > .nano-slider {\n      background: #d1d1d1;\n      background : rgba(0,0,0,0.17);\n      margin: 0 3px 0 4px;\n    }\n  }\n}\n\n@media (max-width: 940px) {\n  .composer_emoji_tooltip {\n    margin-left: -245px;\n\n    &_tail {\n      left: 90%;\n    }\n  }\n}\n\n.composer_dropdown_wrap .nano > .nano-pane {\n  top: 3px;\n  bottom: 3px;\n  right: -1px;\n}\n\n.countries_modal_col {\n  .nano {\n    & > .nano-pane {\n      background : rgba(3,36,64,0.08);\n      width      : 3px;\n      right: 6px;\n      top: 0;\n      -webkit-transition    : .2s;\n      -moz-transition       : .2s;\n      -o-transition         : .2s;\n      transition            : .2s;\n\n      .rounded(0);\n\n      & > .nano-slider {\n        background : rgba(3,46,79,0.22);\n        margin: 0;\n\n        .rounded(0);\n      }\n    }\n  }\n}\n\n.im_page_wrap {\n  background: #fff;\n  max-width: 1010px;\n  min-width: 300px;\n  margin: 0 auto;\n\n  .box-shadow(0px 1px 0 #dfe5ec);\n\n  border-radius: 0 0 3px 3px;\n\n  border-left: 1px solid #dfe5ec;\n  border-right: 1px solid #dfe5ec;\n  border-bottom: 1px solid #d2dbe3;\n\n  overflow: hidden;\n}\n\n.footer {\n  &_wrap {\n    font-size: 11px;\n    text-align: center;\n    color: #9cacb9;\n    line-height: 40px;\n  }\n\n  &_empty {\n    height: 23px;\n  }\n\n  &_brand {\n    color: #9cacb9;\n    font-weight: bold;\n  }\n}\n\na {\n  &.footer_lang_link {\n    color: #9cacb9;\n\n    &.active {\n      font-weight: bold;\n    }\n  }\n\n  &.footer_link {\n    color: #9cacb9;\n    padding: 0 3px;\n  }\n}\n\n.footer_brand:hover,\n.footer_brand:active,\na.footer_lang_link.active:hover,\na.footer_lang_link.active:active,\na.footer_link.active:hover,\na.footer_link.active:active {\n  color: #8499aa;\n  text-decoration: none;\n}\n\n.footer_link_divider {\n  padding: 0 5px;\n}\n\n.im_dialogs_col {\n  margin-right: -7px;\n\n  &_wrap {\n    float: left;\n    width: 31%;\n    border-right: 2px solid #E9EBED;\n    padding-bottom: 10px;\n  }\n}\n\n.im_dialogs_scrollable_wrap {\n  padding: 0 7px 0 0;\n\n  /* Hardware acceleration in Safari */\n  -webkit-transform: translateZ(0);\n  -webkit-perspective: 1000;\n  -webkit-backface-visibility: hidden;\n}\n\n.im_dialogs_col {\n  .nano {\n    & > .nano-pane {\n      background : rgba(0,0,0,0.0);\n      width      : 12px;\n      right: 0px;\n\n      .rounded(0);\n      .noTransition();\n\n      & > .nano-slider {\n        background: rgba(30, 85,127 , 0.3);\n        margin: 0 5px;\n\n        .rounded(0);\n      }\n    }\n  }\n}\n\n.im_history {\n  &_col_wrap {\n    float: left;\n    width: 69%;\n  }\n\n  &_scrollable_wrap {\n    /* Hardware acceleration in Safari */\n    \n    // Caused flickering and bluring in webkit\n    // -webkit-transform: translateZ(0);\n    // -webkit-perspective: 1000;\n    // -webkit-backface-visibility: hidden;\n  }\n}\n\n.nano-pane {\n  .im_history_col .nano > &,\n  .contacts_modal_col .nano > &,\n  .sessions_modal_col .nano > &,\n  .stickerset_modal_col .nano > &,\n  .im_dialogs_modal_col .nano > & {\n    background : rgba(216,223,225,0.45); /*45% d8dfe5*/\n    width      : 9px;\n    right: 0;\n    top: 0;\n\n    .rounded(2px);\n    .noTransition();\n  }\n\n  .contacts_modal_col .nano > & {\n    width: 5px;\n    right: 4px;\n    top: 10px;\n  }\n\n  .sessions_modal_col .nano > &,\n  .stickerset_modal_col .nano > & {\n    top: 4px;\n    bottom: 4px;\n    width: 5px;\n    right: 4px;\n  }\n\n  .im_dialogs_modal_col .nano > & {\n    width: 6px;\n    right: 2px;\n    top: 10px;\n  }\n\n  .im_history_col .nano > & {\n    top: 10px;\n    right: 8px;\n  }\n\n  .im_history_col .nano > &,\n  .contacts_modal_col .nano > &,\n  .sessions_modal_col .nano > &,\n  .stickerset_modal_col .nano > &,\n  .im_dialogs_modal_col .nano > & {\n    & > .nano-slider {\n      background : rgba(137,160,179,0.50); /*50% 89a0b3*/\n      margin: 0;\n\n      .rounded(2px);\n    }\n  }\n}\n\n.reply_markup_scrollable_container {\n  .nano > .nano-pane {\n    background: rgba(137, 160, 179, 0.1);\n    right: 2px;\n    width: 3px;\n    top: 0;\n    bottom: 0;\n    .rounded(1px);\n\n    & > .nano-slider {\n      .rounded(1px);\n      background: #d1d1d1;\n      background: rgba(137, 160, 179, 0.5);\n      margin: 0;\n    }\n  }\n}\n\n.im_history {\n  &_no_dialogs_wrap {\n    margin: 122px 170px 60px;\n    text-align: center;\n  }\n\n  &_appending {\n    -webkit-transition: all ease-in-out 0.2s;\n    -moz-transition: all ease-in-out 0.2s;\n    -ms-transition: all ease-in-out 0.2s;\n    -o-transition: all ease-in-out 0.2s;\n    transition: all ease-in-out 0.2s;\n  }\n\n  &_typing_wrap {\n    line-height: 18px;\n    width: 100%;\n    height: 39px;\n    overflow: hidden;\n    -webkit-user-select: none;\n  }\n\n  &_typing {\n    font-size: 11px;\n    color: #999;\n    max-width: 556px;\n    margin: 0 auto;\n    padding: 13px 81px 8px 85px;\n\n    a.im_history_typing_author {\n      color: #999;\n      font-weight: bold;\n    }\n  }\n}\n\n.im_history_loading_less {\n  margin-top: 5px;\n}\n\n/* Contacts modal */\n.contacts_modal {\n  &_window {\n    .modal-dialog {\n      max-width: 420px;\n    }\n  }\n\n  &_members_list {\n    padding-top: 10px;\n\n    a.contacts_modal_contact {\n      padding: 8px 16px;\n    }\n\n    .active {\n      a.contacts_modal_contact,\n      a.contacts_modal_contact:hover {\n        background: #6490b1;\n        color: #fff;\n      }\n\n      a.contacts_modal_contact .md_modal_list_peer_description,\n      a.contacts_modal_contact:hover .md_modal_list_peer_description,\n      a.contacts_modal_contact .md_modal_list_peer_description .status_online {\n        color: #fff;\n      }\n    }\n  }\n}\n\n.session_terminate_btn {\n  opacity: 0;\n}\n.sessions_modal_session:hover .session_terminate_btn {\n  opacity: 1;\n}\n\n/* Messages edit panel */\n\n.im {\n  &_edit_delete_btn,\n  &_edit_forward_btn,\n  &_edit_reply_btn,\n  &_start_btn {\n    border-radius: 2px;\n    padding: 7px 17px;\n    font-weight: bold;\n    font-size: 12px;\n    line-height: 18px;\n    margin: 6px 0 6px 14px;\n  }\n\n  &_edit_panel_wrap {\n    padding: 0px 0 41px;\n    margin: 0 24px 0 12px;\n  }\n\n  &_edit_panel_border {\n    display: block;\n    margin: 0 0 42px 3px;\n    border-bottom: 1px solid #EEE;\n  }\n\n  &_edit_cancel_link {\n    display: block;\n    padding: 7px 17px;\n    border-radius: 2px;\n    overflow: hidden;\n    margin: 6px 6px;\n    float: right;\n  }\n\n  &_edit_selected_actions {\n    text-align: left;\n    text-transform: uppercase;\n  }\n\n  &_edit_start_actions {\n    text-align: center;\n    text-transform: uppercase;\n  }\n  &_start_btn {\n    padding: 7px 25px;\n  }\n\n  &_selected_count {\n    color: #b9cfe3;\n  }\n\n  &_submit {\n    color: #499dd9;\n    font-size: 13px;\n    line-height: 18px;\n    height: 18px;\n    border-radius: 0;\n    float: right;\n    min-width: 0;\n    margin-top: 5px;\n    margin-left: 10px;\n    width: auto;\n    padding: 0;\n    font-weight: bold;\n\n    &:hover {\n      color: #3589c5;\n      background: inherit;\n    }\n  }\n}\n\n.im_submit_edit_label,\n.im_submit_edit .im_submit_send_label {\n  display: none;\n}\n.im_submit_edit .im_submit_edit_label {\n  display: inline;\n}\n\n.composer_emoji_panel {\n  display: block;\n  height: 30px;\n  overflow: hidden;\n  max-width: 210px;\n\n  a.composer_emoji_btn {\n    display: inline-block;\n    padding: 5px;\n    outline: 0;\n    border-radius: 2px;\n    margin: -1px 0 2px -1px;\n  }\n}\n\n.im_message_selected .im_message_date,\n.im_message_selected .im_message_document_size,\n.im_message_selected .im_message_audio_duration,\n.im_message_selected .im_message_audio_size,\n.im_message_selected .im_message_fwd_date,\n.im_message_selected .im_message_author_admin,\n.im_message_selected .im_message_views_cnt,\n.im_message_selected .im_message_sign_link,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_date,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_document_size,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_audio_duration,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_audio_size,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_fwd_date,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_author_admin,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_views_cnt,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_sign_link {\n  color: #899daf;\n}\n\n.icon-select-tick {\n  display: none;\n\n  .im_dialogs_modal_list .im_dialog_wrap .im_dialog &{\n    display: block;\n    margin: 10px 5px 0 -5px;\n    position: relative;\n    float: left;\n    width: 26px;\n    height: 26px;\n    .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n    background-position: -9px -481px;\n    opacity: 0.5;\n  }\n\n  .im_dialogs_modal_list .im_dialog_wrap:hover .im_dialog &{\n    opacity: 0.75;\n  }\n\n  &.dialog_selected{\n    opacity: 1 !important;\n  }\n}\n\n@media (min-width: 900px) {\n  .im_message_wrap {\n    position: relative;\n  }\n  .icon-select-tick {\n    .im_message_selected &,\n    .im_history_selectable .im_message_outer_wrap:hover & {\n      position: absolute;\n      width: 26px;\n      height: 26px;\n      margin: 9px 0 0 -59px;\n      display: block;\n\n      .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n      background-position: -9px -481px;\n      opacity: 0.5;\n    }\n    .im_message_selected & {\n      opacity: 1 !important;\n    }\n\n    .im_grouped_short &,\n    .im_grouped_short .im_message_outer_wrap:hover & {\n      margin-top: -2px;\n    }\n    .im_message_fwd &,\n    .im_message_outer_wrap:hover .im_message_fwd & {\n      margin-top: 10px;\n    }\n    .im_grouped_fwd &,\n    .im_grouped_fwd .im_message_outer_wrap:hover & {\n      margin-top: 7px;\n    }\n    .im_grouped &,\n    .im_grouped .im_message_outer_wrap:hover & {\n      margin-top: 7px;\n    }\n    .im_grouped_fwd_short &,\n    .im_grouped_fwd_short .im_message_outer_wrap:hover & {\n      margin-top: -5px;\n    }\n  }\n}\n\n.icon-message-status {\n  pointer-events: none;\n  background: #4eabf1;\n  border: 0;\n  display: block;\n  width: 10px;\n  height: 10px;\n  border-radius: 7px;\n  position: absolute;\n  margin-left: -26px;\n  margin-top: 16px;\n  opacity: 0;\n\n  .im_message_unread & {\n    opacity: 1.0;\n  }\n  .im_message_pending & {\n    opacity: 0.5;\n  }\n\n  .im_grouped_short & {\n    margin-top: 5px;\n  }\n  .im_message_fwd & {\n    margin-top: 16px;\n  }\n  .im_grouped_fwd & {\n    margin-top: 13px;\n  }\n  .im_grouped & {\n    margin-top: 13px;\n  }\n  .im_grouped_fwd_short & {\n    margin-top: 2px;\n  }\n}\n\n/* Dialogs modal */\n.peer_select {\n  &_window {\n    .modal-dialog {\n      max-width: 420px;\n    }\n  }\n\n  &_modal_footer {\n    padding: 15px 10px 15px;\n\n    .box-shadow(0 -1px 0px rgba(0,0,0,0.05));\n  }\n\n  &_modal_recipients_wrap {\n    padding: 6px 0 0 10px;\n    white-space: nowrap;\n    max-width: 300px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n\n  &_modal_recipients_empty,\n  &_modal_recipients_name {\n    color: #999;\n  }\n\n  &_modal_recipient {\n    display: inline-block;\n    white-space: nowrap;\n    max-width: 120px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    vertical-align: bottom;\n  }\n}\n\na.peer_select_modal_share_link {\n  color: #999 !important;\n}\n\n@media (max-height: 600px), (max-width: 1010px) {\n  .im_page_wrap {\n    border-bottom: 0;\n    border-radius: 0;\n\n    .box-shadow(none);\n  }\n\n  .footer_wrap {\n    display: none;\n  }\n}\n\n.im_message_fwd {\n  &_author_wrap {\n    margin: 1px 0 4px;\n    display: inline-block;\n  }\n\n  &_author {\n    margin-right: 5px;\n  }\n\n  .im_message_fwd_author_wrap,\n  .im_message_text,\n  .im_message_media,\n  .im_message_sign {\n    margin-left: 52px;\n  }\n}\n\n.im_send_panel_wrap {\n  max-width: 554px;\n  padding-bottom: 21px;\n}\n.im_send_form {\n  max-width: 382px;\n  left: 70px;\n  right: 72px;\n}\n.im_panel_peer_photo,\n.im_panel_own_photo {\n  width: 52px;\n  height: 52px;\n  line-height: 52px;\n  border-radius: 50%;\n  overflow: hidden;\n}\ndiv.im_panel_peer_photo,\na.im_panel_peer_photo {\n  cursor: pointer;\n  margin-left: 20px;\n  height: 55px;\n}\na.im_panel_own_photo {\n  display: block;\n  margin-right: 18px;\n}\na.im_panel_own_photo .peer_initials,\ndiv.im_panel_peer_photo .peer_initials,\na.im_panel_peer_photo .peer_initials {\n  font-size: 18px;\n  line-height: 50px;\n}\n\n.im_panel_peer_online {\n  background: #6ec26d;\n  border: 2px solid #fff;\n  display: block;\n  width: 14px;\n  height: 14px;\n  border-radius: 7px;\n  overflow: hidden;\n  position: absolute;\n  margin-top: -12px;\n  margin-left: 36px;\n}\n\n.composer_emoji_insert_btn,\n.composer_progress_icon_wrap,\n.composer_command_btn,\n.composer_keyboard_btn {\n  z-index: 1;\n}\n\n.composer_emoji_insert_btn {\n  &:hover {\n    .icon-emoji {\n      opacity: 1;\n    }\n  }\n\n  &:active,\n  &.composer_emoji_insert_btn_on {\n    .icon-emoji {\n      background-position: -9px -367px;\n      opacity: 1;\n    }\n  }\n}\n\n.im_send_field_wrap {\n  margin-bottom: 13px;\n  padding-bottom: 2px;\n  overflow-x: hidden;\n}\n.composer_rich_textarea,\n.composer_textarea {\n  overflow: none;\n  overflow-y: scroll;\n  border-radius: 0;\n  border: 0;\n  box-shadow: none;\n  outline: none;\n  box-shadow: 0 1px 0 0 #e8e8e8;\n  padding: 1px 28px 1px 0;\n  position: relative;\n  margin: 0;\n  min-height: 52px;\n  line-height: 20px;\n  height: auto;\n  box-sizing: border-box;\n\n  &:focus {\n    border: 0;\n    box-shadow: none;\n    outline: none;\n    box-shadow: 0 2px 0 0 #77b7e4;\n  }\n\n  .im_send_field_wrap_2ndbtn & {\n    padding-right: 65px;\n  }\n}\n\n.icon-paperclip {\n  display: inline-block;\n  width: 18px;\n  height: 17px;\n  vertical-align: top;\n  opacity: 0.8;\n  margin: 0;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -11px -455px;\n}\n\n.im_attach {\n  cursor: pointer;\n  display: block;\n  overflow: hidden;\n  position: relative;\n\n  width: 18px;\n  height: 17px;\n  margin-right: 28px;\n  margin-top: 6px;\n\n  &:hover {\n    .icon-paperclip {\n      opacity: 1;\n    }\n  }\n\n  &:active {\n    .icon-paperclip {\n      background-position: -11px -482px;\n      opacity: 1;\n    }\n  }\n}\n\n.im_media_attach {\n  cursor: pointer;\n  display: block;\n  overflow: hidden;\n  position: relative;\n  padding: 0;\n\n  width: 20px;\n  height: 18px;\n  margin-top: 5px;\n  margin-right: 25px;\n}\n\n.icon-camera {\n  display: inline-block;\n  width: 20px;\n  height: 18px;\n  vertical-align: top;\n  opacity: 0.8;\n\n  .image-2x('../img/icons/General.png', 40px, 948px);\n  background-position: -10px -399px;\n}\n\n.im_media_attach {\n  &:hover .icon-camera {\n    opacity: 1;\n  }\n\n  &:active .icon-camera {\n    background-position: -10px -427px;\n    opacity: 1;\n  }\n}\n\n.im_record {\n  display: none;\n  width: 18px;\n  height: 23px;\n  margin-right: 15px;\n  \n  user-select: none;\n  -moz-user-select: none;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  \n  position: relative;\n\n  .im_record_supported & {\n    display: block;\n  }\n}\n.im_record_bg {\n  position: absolute;\n  margin: -10px 0 0 -16px; \n  padding: 13px 16px 13px 16px;\n\n  width: 50px;\n  height: 50px;\n\n  border-radius: 50px;\n  overflow: hidden;\n  background: #fff;\n  transition: background-color linear 0.2s;\n\n  .im_send_form_hover .im_voice_recording & {\n    background: #cae9ff;\n  }\n}\n\n.icon-mic {\n  display: inline-block;\n  width: 18px;\n  height: 22px;\n  vertical-align: text-top;\n  opacity: 0.8;\n\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -12px -285px;\n  background-color: transparent;\n\n  .im_record:hover & {\n    opacity: 1;\n  }\n  .im_record:active &,\n  .im_voice_recording & {\n    background-position: -12px -705px;\n  }\n\n}\n\n.im_voice_recorder_wrap {\n  padding: 17px 10px 0;\n  display: none;\n  position: absolute;\n}\n\n.im_voice_recording,\n.im_processing_recording {\n  .im_voice_recorder_wrap {\n    display: block;\n  }\n\n  .composer_rich_textarea,\n  .im_message_field,\n  .composer_emoji_insert_btn,\n  .composer_progress_icon_wrap,\n  .composer_command_btn,\n  .composer_keyboard_btn,\n  .im_inline_placeholder_wrap {\n    visibility: hidden;\n  }\n}\n\n\n@media (max-height: 600px) {\n  a {\n    &.im_panel_peer_photo,\n    &.im_panel_own_photo {\n      display: none;\n    }\n  }\n\n  .im_send_field_wrap {\n    margin-bottom: 0;\n  }\n\n  .composer {\n    &_rich_textarea,\n    &_textarea {\n      min-height: 27px;\n      padding-right: 25px;\n    }\n\n    &_progress_icon_wrap {\n      top: 0;\n      right: 0;\n      margin-top: 0;\n    }\n\n    &_emoji_insert_btn {\n      top: 0;\n      right: 0px;\n      margin-top: -1px;\n    }\n\n    &_command_btn {\n      top: 2px;\n      right: 35px;\n    }\n    &_keyboard_btn {\n      top: 2px;\n      right: 35px;\n    }\n\n    &_emoji_panel {\n      display: none;\n    }\n  }\n\n  .im_submit {\n    position: absolute;\n    top: 0;\n    left: 100%;\n    margin: 0 0 0 15px;\n\n    .im_record_supported .im_send_form_empty & {\n      display: none;\n    }\n  }\n  .im_media_attach {\n    position: absolute;\n    top: -6px;\n    left: -43px;\n    width: 19px;\n    height: 24px;\n  }\n\n  .icon-camera {\n    display: inline-block;\n    width: 19px;\n    height: 23px;\n    vertical-align: text-top;\n    opacity: 0.8;\n    margin-top: -1px;\n\n    .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n    background-position: -12px -68px;\n  }\n\n  .im_media_attach {\n    &:hover .icon-camera,\n    &:active .icon-camera {\n      background-position: -12px -100px;\n      opacity: 1;\n    }\n  }\n\n  .im_attach {\n    display: none;\n    position: absolute;\n    top: 0;\n    right: 100%;\n    margin: 0;\n    margin-right: 45px;\n    margin-top: 1px;\n  }\n\n  .icon-emoji {\n    display: inline-block;\n    width: 22px;\n    height: 22px;\n    vertical-align: text-top;\n    opacity: 1;\n    margin: 0;\n\n    .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n    background-position: -10px -771px;\n  }\n\n  .composer_emoji_insert_btn:active .icon-emoji,\n  .is_1x .composer_emoji_insert_btn:active .icon-emoji,\n  .composer_emoji_insert_btn.composer_emoji_insert_btn_on .icon-emoji,\n  .is_1x .composer_emoji_insert_btn.composer_emoji_insert_btn_on .icon-emoji {\n    background-position: -10px -803px;\n  }\n\n  .im_edit_panel {\n    &_wrap {\n      padding-bottom: 8px;\n    }\n\n    &_border {\n      margin-bottom: 7px;\n    }\n  }\n\n  .im_send_dropbox_wrap {\n    padding-top: 5px;\n    padding-bottom: 5px;\n  }\n\n  .im_record {\n    display: none;\n    position: absolute;\n    top: 5px;\n    right: -56px;\n    margin-top: -8px;\n\n    .im_record_supported .im_send_form_empty & {\n      display: block;\n    }\n  }\n\n  .im_voice_recorder_wrap {\n    padding-top: 4px;\n  }\n\n}\n\n.im_edit_panel {\n  &_wrap.im_edit_small_panel_wrap {\n    padding-bottom: 8px;\n  }\n\n  .im_edit_small_panel_wrap &_border {\n    margin-bottom: 7px;\n  }\n}\n\n/* Peer modals */\n.user_modal {\n  &_window .modal-dialog {\n    max-width: 480px;\n  }\n\n  &_photo_profile_wrap {\n    padding: 13px 12px;\n    margin-bottom: 15px;\n  }\n\n  &_image_wrap {\n    display: block;\n    width: 100px;\n    margin-right: 22px;\n    overflow: hidden;\n    border-radius: 3px;\n  }\n\n  &_image {\n    width: 100px;\n    height: 100px;\n  }\n\n  &_header {\n    font-weight: bold;\n    margin: 2px 0 7px;\n  }\n\n  &_status {\n    color: #999;\n    margin-bottom: 15px;\n  }\n}\n\n.modal_section_body {\n  dt {\n    font-weight: normal;\n    display: inline-block;\n    width: 100px;\n  }\n\n  dd {\n    display: inline-block;\n  }\n}\n\n.user_modal {\n  &_main_btn {\n    border: 0;\n    font-size: 12px;\n    padding-left: 16px;\n    padding-right: 16px;\n    margin: 8px 10px 0 0;\n    float: left;\n  }\n\n  &_other_btn {\n    margin: 8px 0 0 0;\n    float: left;\n\n    .dropdown-toggle {\n      border: 0;\n      font-size: 12px;\n    }\n\n    .dropdown-menu {\n      margin-left: -3px;\n    }\n  }\n\n  &_settings_wrap {\n    margin-top: 25px;\n  }\n\n  &_notifications {\n    font-weight: bold;\n  }\n\n  &_clear {\n    margin-top: 20px;\n  }\n}\n\n.chat_modal {\n  &_window {\n    .modal-dialog {\n      max-width: 480px;\n    }\n  }\n\n  &_header {\n    font-weight: bold;\n    margin: 0 0 10px;\n  }\n\n  &_members_count {\n    color: #999;\n    margin-bottom: 16px;\n  }\n\n  &_actions_wrap {\n    float: right;\n    position: relative;\n    width: 332px;\n\n    & > button,\n    & > .chat_modal_other_btn > button,\n    & > span.btn {\n      padding: 7px 10px;\n    }\n  }\n\n  &_main_btn {\n    border: 0;\n    font-size: 12px;\n    padding-left: 16px;\n    padding-right: 16px;\n    float: left;\n    position: relative;\n    overflow: hidden;\n    margin-right: 10px;\n    margin-top: 8px;\n  }\n\n  &_invite_btn {\n    border: 0;\n    font-size: 12px;\n    padding-left: 16px;\n    padding-right: 16px;\n    float: left;\n    position: relative;\n    margin-right: 10px;\n    margin-top: 8px;\n  }\n\n  &_delete_btn {\n    border: 0;\n    font-size: 12px;\n    padding-left: 16px;\n    padding-right: 16px;\n    float: left;\n    margin-right: 10px;\n    margin-top: 8px;\n  }\n\n  &_other_btn {\n    margin-top: 8px;\n    float: left;\n\n    .dropdown-toggle {\n      border: 0;\n      font-size: 12px;\n    }\n\n    .dropdown-menu {\n      margin-left: -3px;\n    }\n  }\n\n  &_photo_update_link {\n    display: block;\n    padding: 5px 14px;\n    clear: both;\n    font-weight: normal;\n    line-height: 1.428571429;\n    color: #333333;\n    white-space: nowrap;\n    font-size: 13px;\n    overflow: hidden;\n    position: relative;\n\n    &:hover {\n      text-decoration: none;\n      color: #262626;\n      background-color: #f5f5f5;\n    }\n  }\n\n  &_settings_wrap {\n    margin-top: 10px;\n  }\n}\n\n.settings {\n  &_modal {\n    &_window {\n      .modal-dialog {\n        max-width: 480px;\n      }\n    }\n\n    &_settings {\n      padding: 4px 0;\n      margin: 0;\n    }\n\n    &_wrap {\n      .user_modal_main_btn {\n        position: relative;\n        overflow: hidden;\n      }\n    }\n  }\n\n  &_profile {\n    &_edit_form {\n      margin-bottom: 15px;\n    }\n\n    &_image_wrap {\n      float: left;\n      width: 120px;\n      margin-right: 22px;\n    }\n\n    &_first_name,\n    &_last_name {\n      width: 180px;\n      float: left;\n      margin-bottom: 0;\n\n      label {\n        margin-bottom: 3px;\n      }\n    }\n\n    &_first_name {\n      margin-right: 22px;\n      margin-bottom: 10px;\n    }\n\n    &_last_name {\n      margin-right: 10px;\n      margin-bottom: 15px;\n    }\n\n    &_save {\n      padding-top: 21px;\n      float: left;\n\n      &_btn {\n        width: 50px;\n      }\n    }\n\n    &_edit_form {\n      margin-bottom: 0;\n\n      input {\n        font-size: 12px;\n        line-height: normal;\n        background: #f2f2f2;\n        border: 1px solid #f2f2f2;\n        border-radius: 0;\n        padding: 6px 6px 6px 6px;\n        margin-bottom: 0;\n        margin: 0;\n\n        &:focus,\n        &:active {\n          background-color: #fff;\n        }\n      }\n    }\n  }\n\n  &_send_choose_form {\n    input {\n      margin-top: 2px;\n    }\n  }\n\n  &_send_choose_form {\n    margin-bottom: 20px;\n  }\n\n  &_user_phone,\n  &_version {\n    color: #999;\n  }\n}\n\n.modal_section_body {\n  dl.settings_modal_language {\n    margin: 3px 0;\n\n    dt {\n      padding-top: 2px;\n    }\n  }\n}\n\n.settings_modal_language_select {\n  font-size: 12px;\n  height: 21px;\n  line-height: 21px;\n  padding: 0;\n}\n\na.settings_modal_content_settings_wrap {\n  margin-top: -5px;\n}\n\n.icon-volume {\n  &-outer {\n    display: inline-block;\n    background: #c7c7c7;\n    border-radius: 10px;\n    overflow: hidden;\n    height: 18px;\n    padding: 5px 8px;\n    margin: 0 9px 0 0;\n    width: 32px;\n  }\n\n  &-inner {\n    display: block;\n    background: #fff;\n    float: left;\n    width: 2px;\n    vertical-align: bottom;\n    margin: 0 1px 0;\n    height: 8px;\n  }\n\n  &-inner1 {\n    height: 2px;\n    margin-top: 6px;\n  }\n\n  &-inner2 {\n    height: 4px;\n    margin-top: 4px;\n  }\n\n  &-inner3 {\n    height: 6px;\n    margin-top: 2px;\n  }\n\n  &-outer1 &-inner2,\n  &-outer1 &-inner3,\n  &-outer1 &-inner4,\n  &-outer2 &-inner3,\n  &-outer2 &-inner4,\n  &-outer3 &-inner4 {\n    display: none;\n  }\n}\n\n.settings_volume_slider {\n  width: 100%;\n  max-width: 362px;\n  display: inline-block;\n}\n.im_message_selected .im_message_outer_wrap {\n  background: #f2f6fa;\n}\n\n.im_history_selectable .im_message_outer_wrap {\n  cursor: pointer;\n}\n.im_history_select_active .im_message_outer_wrap:hover {\n  background: #f2f6fa;\n}\n\n.im_message_wrap {\n  max-width: 560px;\n  padding: 0 15px 0 15px;\n  margin: 0 auto;\n  position: static;\n}\n.im_content_message_wrap {\n  margin: 8px 10px 8px 16px;\n}\n\n.im_message_views_wrap {\n  width: 0;\n\n  .im_grouped &,\n  .im_grouped_short &,\n  .im_grouped_fwd &,\n  .im_grouped_fwd_short & {\n    display: none;\n    .im_message_selected& {\n      display: block;\n    }\n  }\n  .im_message_selected.im_grouped &,\n  .im_message_selected.im_grouped_fwd & {\n    width: auto;\n  }\n}\n.im_message_views {\n  right: 0;\n  font-size: 0.85em;\n  top: 3px;\n\n  .im_grouped &,\n  .im_grouped_fwd & {\n    top: 19px;\n  }\n  .im_message_fwd & {\n    top: 3px;\n  }\n}\n\n.im_grouped_short {\n  .im_content_message_wrap {\n    margin: 6px 10px 6px 16px;\n  }\n\n  &:last-child {\n    .im_content_message_wrap {\n      margin-bottom: 8px;\n    }\n  }\n}\n\n@media (min-width: 901px) {\n  .im_message_wrap {\n    position: relative;\n  }\n}\n\n.im_message_author {\n  margin: 1px 0 4px;\n  display: inline-block;\n}\n\n/* Groupings */\n.im_message_fwd_from {\n  margin-top: 5px;\n}\n.im_grouped .im_message_fwd_from {\n  margin-top: 0;\n}\n.im_message_fwd {\n  margin-top: 4px;\n  margin-bottom: 4px;\n}\n.im_grouped_short .im_message_author_wrap,\n.im_grouped_short .im_message_from_photo,\n.im_grouped .im_message_author_wrap,\n.im_grouped .im_message_from_photo,\n.im_grouped_fwd .im_message_author_wrap,\n.im_grouped_fwd .im_message_from_photo,\n.im_grouped_fwd_short .im_message_author_wrap,\n.im_grouped_fwd_short .im_message_from_photo {\n  display: none;\n}\n\n.im_message_body {\n  .im_grouped_short &,\n  .im_grouped &,\n  .im_grouped_fwd &,\n  .im_grouped_fwd_short & {\n    margin-left: 57px;\n  }\n}\n\n\n\n.im_grouped_fwd .im_message_fwd_from,\n.im_grouped_fwd_short .im_message_fwd_from {\n  display: none;\n}\n\n.im_message_fwd {\n  .im_grouped_short &,\n  .im_grouped &,\n  .im_grouped_fwd &,\n  .im_grouped_fwd_short & {\n    .im_message_meta {\n      display: none;\n    }\n  }\n  .im_grouped_fwd_short & {\n    margin-top: 8px;\n  }\n}\n\n.tooltip {\n  &-inner {\n    background: rgba(0,0,0, 0.8);\n  }\n  &-arrow {\n    opacity: 0.8;\n  }\n}\n\n.im_dialogs {\n  &_scrollable_wrap {\n    a.im_dialog {\n      padding: 7px 16px;\n    }\n  }\n\n  &_scrollable_wrap {\n    .active {\n      a.im_dialog {\n        margin-right: -2px;\n        padding-right: 18px;\n      }\n    }\n  }\n}\n\n.im_dialog {\n  &_photo {\n    width: 48px;\n    height: 48px;\n    border-radius: 50%;\n    overflow: hidden;\n  }\n\n  div&_photo {\n    margin-right: 15px;\n\n    .peer_initials {\n      line-height: 48px;\n      font-size: 18px;\n    }\n  }\n\n  &_message {\n    margin-top: 5px;\n  }\n\n  &_peer {\n    margin-top: 3px;\n    margin-bottom: 3px;\n  }\n}\n\n.active {\n  .im_dialog_date,\n  a.im_dialog:hover .im_dialog_date,\n  a.im_dialog_selected .im_dialog_date {\n    color: #fff;\n  }\n}\n\n/* Import contact modal */\n.import_contact_modal_window {\n  .modal-dialog {\n    max-width: 480px;\n  }\n}\n\n.modal-content-animated {\n  -webkit-transition: margin-top linear 0.2s;\n  transition: margin-top linear 0.2s;\n}\n\n.countries {\n  &_modal_search {\n    padding: 12px 12px 12px;\n    margin: 0;\n    position: relative;\n  }\n\n  &_modal_col {\n    max-height: 350px;\n  }\n\n  &_modal_wrap .md_modal_body {\n    padding-bottom: 15px;\n  }\n}\n\n.modal_close {\n  width: 20px;\n  height: 21px;\n  float: right;\n  margin: 43px 40px 0 0;\n  opacity: 0.5;\n  pointer-events: none;\n\n  -webkit-transition    : .2s;\n  -moz-transition       : .2s;\n  -o-transition         : .2s;\n  transition            : .2s;\n\n  .image-2x('../img/icons/PhotoIcons.png', 40px, 200px);\n  background-position: -10px -10px;\n\n  &_wrap {\n    display: none;\n    cursor: pointer;\n    position: fixed;\n    top: 0;\n    right: 0;\n    width: 50%;\n    height: 100%;\n\n    &:hover {\n      .modal_close {\n        opacity: 1;\n      }\n    }\n  }\n\n  &_wrap_wnext {\n    width: 104px;\n    height: 150px;\n  }\n}\n\n.modal_prev_wrap,\n.modal_next_wrap {\n  display: none;\n  position: fixed;\n  top: 0;\n  left: 0;\n  bottom: 64px;\n  width: 104px;\n}\n.modal_next_wrap {\n  left: auto;\n  right: 0;\n}\n.modal_prev,\n.modal_next {\n  width: 16px;\n  height: 24px;\n  opacity: 0.15;\n  position: absolute;\n  top: 50%;\n  pointer-events: none;\n  margin: 0 0 0 38px;\n\n  -webkit-transition    : .2s;\n  -moz-transition       : .2s;\n  -o-transition         : .2s;\n  transition            : .2s;\n\n  .image-2x('../img/icons/PhotoIcons.png', 40px, 200px);\n  background-position: -12px -41px;\n}\n.modal_next {\n  margin: 0 0 0 50px;\n  background-position: -14px -75px;\n}\n\n.modal_prev_active_wrap {\n  cursor: pointer;\n\n  .modal_prev {\n    opacity: 0.5;\n  }\n\n  &:hover {\n    background-color: rgba(0,0,0,0.2);\n\n    .modal_prev {\n      opacity: 1;\n    }\n  }\n}\n\n.modal_next_active_wrap {\n  cursor: pointer;\n\n  .modal_next {\n    opacity: 0.5;\n  }\n\n  &:hover {\n    background-color: rgba(0,0,0,0.2);\n\n    .modal_next {\n      opacity: 1;\n    }\n  }\n}\n\n@media (min-width: 800px) {\n  .modal_close_wrap,\n  .modal_next_wrap,\n  .modal_prev_wrap {\n    display: block;\n  }\n}\n\n.media_modal {\n  &_bottom_panel {\n    max-width: 1000px;\n    margin: 0 auto;\n    color: rgba(255, 255, 255, 0.6);\n    position: relative;\n\n    &_wrap {\n      position: fixed;\n      bottom: 0;\n      left: 0;\n      right: 0;\n      height: 64px;\n      background: #313131;\n    }\n  }\n\n  &_title_wrap {\n    max-width: 300px;\n    margin: 0 auto;\n    text-align: center;\n    font-size: 13px;\n    font-weight: bold;\n    line-height: 16px;\n    padding: 24px 0;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  &_info_wrap {\n    line-height: 16px;\n    padding: 15px 16px;\n    width: 200px;\n    position: absolute;\n    left: 0;\n  }\n\n  &_author_photo {\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    overflow: hidden;\n\n    .peer_initials {\n      line-height: 32px;\n    }\n\n    a& {\n      margin: 1px 10px 1px 0;\n    }\n  }\n\n  div&_author_name {\n    font-size: 13px;\n    margin-top: 1px;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  &_date {\n    &,\n    a&:hover {\n      font-size: 11px;\n      color: rgba(255, 255, 255, 0.4);\n    }\n\n    div& {\n      margin-top: 2px;\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n  }\n\n  &_wrap {\n    .modal-body {\n      padding: 16px;\n    }\n  }\n}\n\n.embed_modal_wrap .modal-body {\n  line-height: 0;\n  padding: 0;\n}\n\n.photo_modal_window,\n.video_modal_window,\n.document_modal_window {\n  padding: 0;\n}\n\n.video_modal_window {\n  .modal-body {\n    padding: 0;\n  }\n}\n\n.media_modal_bottom_actions {\n  position: absolute;\n  right: 0;\n}\n\n.media_modal_action_btn {\n  float: left;\n  display: block;\n  width: 68px;\n  height: 64px;\n\n  &:hover {\n    background: rgba(0,0,0,0.2);\n  }\n\n  i {\n    display: block;\n    opacity: 0.5;\n\n    .image-2x('../img/icons/PhotoIcons.png', 40px, 200px);\n    background-position: 0 0;\n  }\n\n  &:hover i {\n    opacity: 1;\n  }\n\n  & i&_download {\n    background-position: -12px -163px;\n    width: 16px;\n    height: 20px;\n    margin: 22px 26px;\n  }\n\n  & i&_forward {\n    background-position: -9px -109px;\n    width: 23px;\n    height: 15px;\n    margin: 24px 22px;\n  }\n\n  & i&_delete {\n    background-position: -13px -135px;\n    width: 14px;\n    height: 18px;\n    margin: 23px 27px;\n  }\n}\n"
  },
  {
    "path": "app/less/font.less",
    "content": "/* From http://fonts.googleapis.com/css?family=Open+Sans:400&subset=latin,cyrillic */\n\n/* cyrillic */\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(../fonts/400cn.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* latin */\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(../fonts/400ln.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;\n}\n\n/* cyrillic */\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(../fonts/600cn.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* latin */\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(../fonts/600ln.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans'), local('OpenSans'), url(../fonts/400.woff2) format('woff2'), url(../fonts/400.woff) format('woff'), url(../fonts/400.ttf) format('truetype'), url(../fonts/400.svg#OpenSans) format('svg');\n}\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(../fonts/600.woff2) format('woff2'), url(../fonts/600.woff) format('woff'), url(../fonts/600.ttf) format('truetype'), url(../fonts/600.svg#OpenSans) format('svg');\n}"
  },
  {
    "path": "app/less/lib/mixins.less",
    "content": "@user_colors:   '#8365ab',\n                '#539e4f',\n                '#ae9661',\n                '#4979a3',\n                '#b7635d',\n                '#b3577a',\n                '#5397b4',\n                '#c07844';\n\n@user_bgcolors: '#cc90e2',\n                '#80d066',\n                '#ecd074',\n                '#6fb1e4',\n                '#e57979',\n                '#f98bae',\n                '#73cdd0',\n                '#fba76f';\n\n.generate_user(@arr, @isColor) {\n    .-(@i: 1) when (@i <= length(@arr)) {\n        @color: e(extract(@arr, @i));\n        & when (@isColor) {\n          &_color_@{i},\n          &_color_@{i}:hover {\n            color: @color;\n          }\n        }\n        & when not (@isColor) {\n          &_bgcolor_@{i} {\n            background: @color;\n          }\n        }\n        .-((@i + 1));\n    } .-;\n}\n\n.user-select(@argument: none) {\n  -webkit-user-select: @argument;\n  -moz-user-select: @argument;\n  -ms-user-select: @argument;\n  user-select: @argument;\n}\n\n.box-shadow(@arguments) {\n  -webkit-box-shadow: @arguments;\n  -moz-box-shadow: @arguments;\n  box-shadow: @arguments;\n}\n\n.transform(@arguments) {\n  -webkit-transform: @arguments;\n  -moz-transform: @arguments;\n  -o-transform: @arguments;\n  -ms-transform: @arguments;\n  transform: @arguments;\n}\n\n.box-sizing(@sizing: border-box) {\n  -ms-box-sizing: @sizing;\n  -moz-box-sizing: @sizing;\n  -webkit-box-sizing: @sizing;\n  box-sizing: @sizing;\n}\n\n.rounded(@radius: 2px) {\n  -webkit-border-radius: @radius;\n  -moz-border-radius: @radius;\n  border-radius: @radius;\n}\n\n.noTransition() {\n  -webkit-transition: none;\n  -moz-transition: none;\n  -o-transition: none;\n  transition: none;\n}\n\n/* Thanks to @brandonb927\n   https://gist.github.com/brandonb927/3874012\n\n   Prepending 'only screen and ' to each media query breaks nested media queries */\n\n// .image-2x(@image, @width, @height, @repeat: no-repeat) {\n//   @filename  : ~`/(.*)\\.(jpg|jpeg|png|gif)/.exec(@{image})[1]`;\n//   @extension : ~`/(.*)\\.(jpg|jpeg|png|gif)/.exec(@{image})[2]`;\n//   background-image: ~`\"url(@{filename}.@{extension}?1)\"`;\n//   background-repeat: @repeat;\n\n//   /* on retina, use image that's scaled by 2 */\n//   @media\n//     (-webkit-min-device-pixel-ratio: 2),\n//     (   min--moz-device-pixel-ratio: 2),\n//     (     -o-min-device-pixel-ratio: 2/1),\n//     (        min-device-pixel-ratio: 2),\n//     (                min-resolution: 192dpi),\n//     (                min-resolution: 2dppx) {\n//       background-image: ~`\"url(@{filename}_2x.@{extension}?1)\"`;\n//       background-size: @width @height;\n//   }\n// }\n\n\n\n.image-2x(@image, @width, @height, @repeat: no-repeat) {\n  @filename  : ~`/(.*)\\.(jpg|jpeg|png|gif)/.exec(@{image})[1]`;\n  @extension : ~`/(.*)\\.(jpg|jpeg|png|gif)/.exec(@{image})[2]`;\n  background-image: ~`\"url(@{filename}.@{extension})\"`;\n  background-repeat: @repeat;\n  .is_2x & {\n    background-image: ~`\"url(@{filename}_2x.@{extension})\"`;\n    background-size: @width @height;\n  }\n}"
  },
  {
    "path": "app/less/mobile.less",
    "content": "@import \"lib/mixins\";\n\n/* app mobile css */\n\nhtml {\n  background: #fff;\n}\n\n.dropdown-menu {\n  border-radius: 0;\n\n  & > li > a {\n    padding: 15px 17px 14px;\n    font-size: 14px;\n  }\n\n  .divider {\n    margin: 0;\n  }\n}\n\n.tg_page_head {\n  .navbar-quick-nav,\n  .navbar-toggle {\n    display: none;\n  }\n\n  .container {\n    display: block;\n    width: auto;\n    padding-left: 0;\n    padding-right: 0;\n\n    .navbar-header {\n      margin: 0;\n    }\n  }\n\n  .navbar-inverse {\n    background: #5682a3;\n    border: 0;\n\n    .box-shadow(0px 1px 1px rgba(0, 0, 0, 0.11));\n\n    margin: 0;\n  }\n\n  .ios_standalone & {\n    .navbar > .container {\n      margin-top: 20px;\n    }\n  }\n\n  .navbar > .container {\n    .navbar-brand {\n      padding: 8px 15px;\n      margin-left: 0;\n      margin-right: 20px;\n      display: block;\n      line-height: 0;\n      height: auto;\n    }\n    .navbar-quick-nav  .navbar-brand {\n      margin-right: 0;\n    }\n  }\n\n  .navbar-menu {\n    .navbar-nav.navbar-right {\n      margin-right: 0;\n    }\n  }\n\n  .navbar-inverse {\n    .navbar-nav > li > a {\n      padding-top: 13px;\n      padding-bottom: 13px;\n      color: #b9cfe3;\n      font-size: 13px;\n\n      &:hover {\n        color: #fff;\n      }\n    }\n\n    .navbar-toggle {\n      border-color: #497495;\n      outline: 0;\n      border: 0;\n    }\n\n    .navbar-collapse,\n    .navbar-form {\n      border-color: #497495;\n    }\n\n    .navbar-toggle {\n      &:active,\n      &:focus {\n        background-color: rgba(255,255,255,0.1);\n      }\n    }\n  }\n\n  .navbar > .container {\n    .navbar-brand {\n      padding-left: 9px;\n      outline: none;\n    }\n  }\n}\n\n.ios_standalone {\n  .modal.mobile_modal {\n    border-top: 20px solid #497495;\n  }\n}\n\n.im_history_panel_edit_link {\n  margin-right: 0;\n}\n.navbar-header {\n  float: none;\n}\n.navbar-toggle-wrap {\n  float: right;\n  display: block;\n  margin: 0;\n\n  .navbar-toggle {\n    float: none;\n    display: block;\n    margin: 0;\n    padding: 12px 20px 11px;\n    border-radius: 0;\n  }\n}\n\n.tg_page_head {\n  .navbar-inverse {\n    .navbar-toggle:hover {\n      background-color: rgba(0,0,0,0.0);\n    }\n    .open .navbar-toggle {\n      background-color: rgba(0,0,0,0.1);\n    }\n  }\n}\n\n.navbar_peer_not_selected .navbar-toggle-wrap .navbar-toggle {\n  padding: 16px 17px;\n}\n\n.navbar-toggle-wrap {\n  .navbar-toggle  {\n    .icon-bar {\n      background-color: #d7e5f0;\n      width: 5px;\n      height: 5px;\n      border-radius: 3px;\n      margin-left: 6px;\n      margin-right: 6px;\n\n      & + .icon-bar {\n        margin-top: 3px;\n      }\n\n      .navbar_peer_not_selected & {\n        background-color: #fefeff;\n        width: 21px;\n        height: 2px;\n        border-radius: 1px;\n        margin-left: 0;\n        margin-right: 0;\n      }\n    }\n  }\n\n  .dropdown-menu {\n    margin-top: 6px;\n    right: -40px;\n    left: auto;\n    width: 195px;\n\n    .navbar_peer_not_selected &,\n    .tg_modal_head & {\n      right: 6px;\n    }\n  }\n}\n\n// ?! why not into the \"& + .icon-bar\"\n.navbar-toggle-wrap .navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n.navbar-toggle {\n  .dropdown-toggle {\n    display: block;\n  }\n}\n\n.navbar-search-wrap {\n  display: none;\n  float: right;\n  margin: 0;\n  line-height: 0;\n  padding: 12px 14px 11px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n\n  &:active {\n    background-color: rgba(0,0,0,0.1);\n  }\n}\n\n.icon-search {\n  display: inline-block;\n  width: 21px;\n  height: 21px;\n  .image-2x('../img/icons/MobileIcons.png', 21px, 52px);\n  background-position: 0 0;\n}\n\n.tg_page_head .navbar_peer_not_selected .navbar-search-wrap,\n.tg_modal_head .navbar-search-wrap {\n  display: block;\n}\n.tg_head_peer_menu_wrap {\n  .navbar_peer_not_selected & {\n    display: none;\n  }\n}\n\n.tg_page_head {\n  .navbar-quick-nav {\n    display: block;\n    float: none;\n    margin: 0;\n\n    li {\n      float: left;\n    }\n\n    a {\n      padding-top: 15px;\n      padding-bottom: 15px;\n    }\n  }\n}\n\n.icon-back {\n  display: inline-block;\n  width: 11px;\n  height: 19px;\n  vertical-align: text-top;\n  opacity: 0.8;\n\n\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -15px -835px;\n}\n\n.tg_page_head {\n  .navbar-quick-nav {\n    a:active {\n      .icon-back {\n        opacity: 1;\n      }\n    }\n  }\n\n  .navbar > .container .navbar-brand {\n    display: none;\n  }\n\n  .navbar_peer_not_selected > .container .navbar-brand {\n    display: block;\n  }\n\n  .navbar_offline > .container .navbar-brand.tg_logo_wrap {\n    display: none;\n  }\n\n  .navbar {\n    min-height: 46px;\n  }\n\n  .navbar-inverse .navbar-quick-nav > li > a {\n    padding-left: 16px;\n    padding: 6px 10px 2px 28px;\n    color: #b9cfe3;\n    font-size: 13px;\n    height: 46px;\n\n    /*&:active,*/\n    &:hover {\n      background-color: rgba(0,0,0,0.1);\n    }\n  }\n}\n\n.navbar-quick-nav  {\n  .icon-back {\n    position: absolute;\n    margin-left: -18px;\n    margin-top: 8px;\n  }\n\n  h4 {\n    font-size: 15px;\n    color: #fff;\n    margin: 0;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n  }\n}\n\n.navbar-quick {\n  &-back-title {\n    max-width: 160px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n\n  &-media-back h4 {\n    margin: 9px 0 12px 0;\n    line-height: 120%;\n  }\n\n  &-profile-back,\n  &-group-back {\n    h4 {\n      font-weight: bold;\n    }\n\n    small {\n      font-size: 13px;\n      white-space: nowrap;\n      overflow: hidden;\n      margin-left: 0;\n    }\n\n    .status_online {\n      color: #fff;\n    }\n  }\n}\n\n.navbar-menu {\n  display: none;\n\n  .navbar_offline & {\n    display: block;\n  }\n}\n\n.navbar-offline {\n  .navbar_offline & {\n    float: left;\n    margin: 0;\n  }\n\n  & > li > a {\n    padding-right: 0;\n    padding-left: 0;\n  }\n\n  &-text {\n    color: #fff;\n    font-size: 15px;\n  }\n\n  .tg_page_head .navbar-inverse & {\n    & > li > a {\n      padding-top: 13px;\n      padding-bottom: 12px;\n      color: #fff;\n      font-size: 15px;\n    }\n  }\n}\n\n.navbar_offline {\n  .tg_page_head & {\n    & > .container .navbar-brand {\n      margin-right: 0;\n    }\n  }\n\n  .navbar-quick-nav li > a > .navbar-quick-back-title,\n  .navbar-search-wrap,\n  .navbar-history-edit {\n    display: none;\n  }\n}\n\n.navbar-peer-wrap {\n  display: block;\n  float: right;\n  width: 46px;\n  height: 46px;\n  padding: 5px;\n\n  img {\n    width: 36px;\n    height: 36px;\n    border-radius: 18px;\n    overflow: hidden;\n  }\n\n  .peer_initials {\n    line-height: 36px;\n    font-size: 15px;\n    border-radius: 18px;\n    overflow: hidden;\n  }\n\n  .navbar_peer_not_selected & {\n    display: none;\n  }\n}\n\n.navbar_history_select {\n  .navbar-peer-wrap,\n  .navbar-toggle-wrap {\n    display: none;\n  }\n}\n\n.tg_page_head {\n  .navbar-quick-nav {\n    li.navbar-quick-right {\n      float: right;\n    }\n\n    li.navbar-quick-left {\n      float: left;\n    }\n\n    li.navbar-quick-title {\n      position: static;\n      float: none;\n      color: #fff;\n      font-size: 15px;\n      font-weight: bold;\n      padding: 14px 0;\n      text-align: center;\n    }\n  }\n\n  .navbar-inverse {\n    .navbar-quick-nav {\n      & > .navbar-quick-right > a,\n      & > .navbar-quick-left > a {\n        font-size: 15px;\n        color: #fff;\n        padding: 14px 15px;\n      }\n    }\n  }\n}\n\n.mobile_scrollable_wrap {\n  overflow: hidden;\n  overflow-y: scroll;\n  -webkit-overflow-scrolling: touch;\n}\n\n.login {\n  &_head_bg {\n    display: none;\n  }\n\n  &_page {\n    margin-top: 0;\n    margin-bottom: 30px;\n  }\n\n  &_head_wrap {\n    height: 75px;\n    background: #537c9a;\n  }\n\n  &_form_wrap {\n    border-radius: 0;\n    border-top: 0;\n    border-left: 0;\n    border-right: 0;\n    box-shadow: none;\n    padding: 44px 40px 44px;\n  }\n\n  &_footer_about_wrap {\n    border-radius: 0;\n    border-top: 0;\n    border-left: 0;\n    border-right: 0;\n    box-shadow: none;\n    padding: 44px 40px 44px;\n  }\n}\n\n.icon-next-submit {\n  margin-top: -3px;\n}\n\n.im_dialogs {\n  &_empty_header {\n    font-size: 19px;\n    margin-bottom: 10px;\n  }\n\n  &_empty_lead {\n    font-size: 14px;\n    line-height: 160%;\n  }\n\n  &_add_contact,\n  &_import_phonebook {\n    padding: 12px 13px;\n  }\n\n  &_add_contact + &_import_phonebook {\n    margin-top: 10px;\n  }\n}\n\n.im_page_wrap {\n  background: none;\n  box-shadow: none;\n  border: 0;\n  overflow: hidden;\n}\n.im_history_select_active .im_message_outer_wrap:hover,\n.im_message_selected {\n  background: #e1e9f0;\n}\n\n.im_message_body {\n  padding: 7px 10px;\n  border-radius: 3px;\n  background: #f1f1f1;\n\n  .im_message_out & {\n    background: #e4ecf2;\n  }\n}\n\n.im_message_body_media,\n.im_message_out .im_message_body_media {\n  padding: 0;\n  border-radius: 0;\n  background: none;\n}\n\n.im_message_selected {\n  .im_message_body,\n  .im_message_document,\n  .im_message_audio {\n    background: #497495;\n    color: #fff;\n  }\n  .im_message_body_media {\n    background: none;\n    color: inherit;\n  }\n}\n\n.im_service_message {\n  font-size: 13px;\n}\n.audio_player_button {\n  margin-right: 8px;\n}\n.audio_player_volume_slider .tg_slider_wrap {\n  display: none;\n}\n.audio_player_seek_slider {\n  width: 100%;\n}\n\n.audio_player_seek_slider .tg_slider_track {\n  background: rgba(200, 200, 200, 0.6);\n}\n\n.im_message_body_media {\n  .im_message_document,\n  .im_message_audio {\n    padding: 5px;\n    border-radius: 3px;\n    background: #f1f1f1;\n    margin-top: 0;\n  }\n\n  .im_message_game {\n    padding: 5px;\n    border-radius: 3px;\n    background: #f1f1f1;\n    margin-top: 0;\n\n    .im_message_webpage_wrap {\n      margin-left: 3px;\n    }\n  }\n\n  .im_message_geopoint {\n    width: 200px;\n    height: 100px;\n  }\n\n  a.im_message_photo_thumb,\n  .im_message_video {\n    margin-top: 0;\n  }\n\n  .im_message_out & {\n    .im_message_document,\n    .im_message_audio {\n      background: #e4ecf2;\n    }\n  }\n}\n\n.im_message_webpage,\n.im_message_webpage_site,\n.im_message_webpage_title,\n.im_message_webpage_description {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  font-size: 13px;\n  line-height: 140%;\n}\n.im_message_webpage_wrap {\n  padding-left: 6px;\n}\n\n.im_message {\n  &_document {\n    position: relative;\n    width: auto;\n    max-width: 250px;\n\n    .icon-document,\n    &_thumb_wrap {\n      position: absolute;\n    }\n\n    .im_message_out & {\n      .icon-document {\n        background-color: #e4ecf2;\n      }\n    }\n\n    &_thumb_wrap {\n      background-color: transparent;\n      position: absolute;\n    }\n\n    &_info {\n      float: none;\n      margin-left: 43px;\n      width: auto;\n      min-height: 38px;\n\n      .cancelable_progress_wrap {\n        margin-top: 4px;\n      }\n    }\n\n    &_thumbed &_info {\n      margin-left: 110px;\n      min-height: 100px;\n    }\n\n    &_size {\n      display: block;\n      padding-left: 0;\n    }\n\n    &_thumbed &_name_wrap,\n    &_name_wrap {\n      width: auto;\n    }\n\n    &_progress &_size {\n      display: inline;\n    }\n\n    &_progress &_name  {\n      max-width: 50%;\n    }\n\n    &_progress&_thumbed &_name  {\n      display: inline;\n      max-width: none;\n    }\n\n    &_thumbed &_name {\n      white-space: normal;\n    }\n  }\n\n  &_video {\n    width: auto;\n    max-width: 250px;\n  }\n\n  &_audio {\n    width: auto;\n    max-width: 200px;\n\n    & .audio_player_title_wrap {\n      width: auto;\n      font-size: 12px;\n    }\n  }\n\n\n  &_contact {\n    width: 200px;\n\n    &_name,\n    &_phone {\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      max-width: 150px;\n    }\n  }\n\n  &_document_thumbed &_upload_progress_wrap,\n  &_document_thumbed &_download_progress_wrap {\n    width: 130px;\n  }\n\n  &_text {\n    line-height: 140%;\n    font-size: 13px;\n  }\n}\n\n.img_gif_label,\n.img_gif_size,\n.im_message_video_duration {\n  font-size: 13px;\n}\na.im_message_video_thumb {\n  margin-right: 0;\n}\nimg.im_message_video_thumb,\n.img_gif_thumb {\n  -webkit-filter: none;\n  -moz-filter: none;\n  -o-filter: none;\n  -ms-filter: none;\n  filter: none;\n}\n\n.im_grouped {\n  .im_message_body {\n    margin-left: 0;\n  }\n}\n\n.im_history_panel_wrap {\n  display: none;\n  margin: 0 15px;\n}\n.im_send_panel_wrap {\n  padding: 10px 0 12px;\n}\n.im_history_scrollable_wrap.im_history_to_bottom {\n  overflow: hidden;\n  position: relative;\n}\n.im_history {\n  position: static;\n}\n.icon-select-tick {\n  margin: 10px 0 0 -24px\n}\n.im_message_wrap {\n  padding: 0 8px;\n}\n\n.im_content_message_wrap {\n  font-size: 15px;\n  float: left;\n  position: relative;\n  margin: 8px 0 8px;\n  max-width: 100%;\n\n  &.im_message_out {\n    padding-left: 80px;\n    padding-right: 0;\n    float: right;\n  }\n\n  &.im_message_in {\n    padding-left: 0;\n    padding-right: 60px;\n  }\n\n  .im_history_messages_group &.im_message_in,\n  .im_history_messages_group .im_grouped_short &.im_message_in,\n  .im_history_messages_group .im_grouped &.im_message_in {\n    padding-left: 45px;\n  }\n\n  .im_grouped_short &,\n  .im_grouped & {\n    margin-top: 0;\n  }\n}\n\n.im_message_reply {\n  &_wrap {\n    margin-top: 2px;\n  }\n\n  &_author {\n    font-weight: normal;\n    font-size: 13px;\n  }\n}\n.im_message_reply_body {\n  font-size: 12px;\n}\n\n.im_message_fwd_header {\n  font-size: 12px;\n}\n\n.im_message_meta {\n  float: none;\n  position: absolute;\n  bottom: 5px;\n  left: 100%;\n  white-space: nowrap;\n  margin-left: -60px;\n  width: 60px;\n  padding: 0 0 0 8px;\n  // overflow: hidden;\n\n  .im_message_out & {\n    width: 80px;\n    left: 0;\n    text-align: right;\n    margin-left: 0;\n    padding: 0 8px 0 0;\n  }\n}\n\n.im_message_views {\n  top: -12px;\n  font-size: 10px;\n\n  .im_message_out & {\n    right: 0;\n  }\n}\n\n.im_message_date {\n  font-size: 10px;\n  line-height: 12px;\n  padding: 0;\n  display: block;\n}\n.im_message_edited {\n  display: block;\n  margin-top: 4px;\n}\n.im_message_date_text {\n  display: block;\n  margin-top: 3px;\n}\n\n.im_message_out {\n  .im_message_fwd_date {\n    color: #93a2ae;\n  }\n\n  .icon-document {\n    background-color: #dae6f0;\n    background-position: -2px -542px;\n  }\n}\n\n.im_message_out .im_message_document_size,\n.im_message_out .audio_player_duration,\n.im_message_out .audio_player_size,\n.im_message_out .im_message_fwd_date,\n.im_message_selected .im_message_document_size,\n.im_message_selected .audio_player_duration,\n.im_message_selected .audio_player_size,\n.im_message_selected .im_message_fwd_date,\n.im_message_focus .im_message_document_size,\n.im_message_focus .audio_player_duration,\n.im_message_focus .audio_player_size,\n.im_message_focus .im_message_fwd_date,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_document_size,\n.im_history_select_active .im_message_outer_wrap:hover .audio_player_duration,\n.im_history_select_active .im_message_outer_wrap:hover .audio_player_size,\n.im_history_select_active .im_message_outer_wrap:hover .im_message_fwd_date {\n  color: #68839c;\n}\n\n.im_message_from_photo,\n.im_message_fwd_photo {\n  width: 40px;\n  height: 40px;\n}\na.im_message_from_photo {\n  margin: 0;\n  display: none;\n}\n\n.im_history_messages_group {\n  a.im_message_from_photo {\n    display: block;\n    position: absolute;\n    margin-left: -45px;\n  }\n}\na.im_message_author_via {\n  color: #323232;\n  display: block;\n  font-size: 13px;\n  font-weight: normal;\n  margin-bottom: 3px;\n  .im_message_out & {\n    margin-left: 0;\n  }\n  .im_message_fwd_author {\n    color: inherit;\n  }\n}\n.im_message_author {\n  display: none;\n}\n.im_message_author_admin {\n  display: none;\n}\n\n.im_history_messages_group {\n  a.im_message_author {\n    display: inline;\n    font-size: 13px;\n    font-weight: normal;\n  }\n  .im_message_author_admin {\n    display: inline;\n    font-size: 13px;\n  }\n  .im_message_sign_link {\n    font-size: 12px;\n  }\n}\n.im_service_message a.im_message_author {\n  display: inline;\n  font-size: 13px;\n  font-weight: normal;\n}\n\n.im_grouped_short a.im_message_from_photo,\n.im_grouped_short a.im_message_author,\n.im_grouped_short .im_message_author_admin,\n.im_grouped_short a.im_message_author_via,\n.im_grouped a.im_message_from_photo,\n.im_grouped a.im_message_author,\n.im_grouped a.im_message_author_via,\n.im_grouped a.im_message_author_admin,\n.im_grouped_fwd a.im_message_from_photo,\n.im_grouped_fwd a.im_message_author,\n.im_grouped_fwd a.im_message_author_via,\n.im_grouped_fwd a.im_message_author_admin,\n.im_grouped_fwd_short a.im_message_from_photo,\n.im_grouped_fwd_short a.im_message_author,\n.im_grouped_fwd_short a.im_message_author_via,\n.im_grouped_fwd_short a.im_message_author_admin,\n.im_message_out a.im_message_from_photo,\n.im_message_out a.im_message_author,\n.im_message_out a.im_message_author_admin,\n.im_message_body_media a.im_message_author,\n.im_message_body_media a.im_message_author_admin {\n  display: none;\n}\n.im_message_wrap {\n  padding: 0 7px;\n}\n\n\n\n\n.im_message_out {\n  .icon-message-status {\n    border: 0;\n    display: inline-block;\n    width: 10px;\n    height: 10px;\n    line-height: 18px;\n    border-radius: 7px;\n    position: static;\n    vertical-align: text-top;\n    margin-right: 2px;\n    opacity: 1;\n    margin-top: 1px;\n    background: none;\n  }\n}\n\n.im_message_unread {\n  .icon-message-status {\n    background: #43A4DB;\n  }\n}\n\n.im_message_pending {\n  .icon-message-status {\n    background: #9fd2ee;\n  }\n}\n\n.im_dialogs_search_field,\n.contacts_modal_search_field {\n  font-size: 1.2em;\n}\n.im_edit_start_actions {\n  text-align: center;\n}\n.im_edit_selected_actions {\n  text-align: center;\n}\n.im_edit_delete_btn,\n.im_edit_forward_btn,\n.im_start_btn {\n  border-radius: 2px;\n  font-weight: normal;\n  line-height: 18px;\n  background: none !important;\n  border: 0 !important;\n  width: 50%;\n  margin: 0;\n  font-size: 15px;\n  padding: 13px 0;\n}\n.im_edit_forward_btn {\n  color: #497495 !important;\n}\n.im_edit_delete_btn {\n  color: #c3584d !important;\n}\n.im_start_btn {\n  color: #497495 !important;\n}\n.im_edit_delete_btn strong,\n.im_edit_forward_btn strong {\n  font-weight: normal;\n}\n.im_edit_panel_wrap {\n  padding: 5px 0;\n  margin: 0;\n}\n.im_dialogs_col_wrap {\n  border: 0;\n  padding-bottom: 0;\n}\n.im_dialogs_col_wrap,\n.im_history_col_wrap {\n  float: none;\n  width: auto;\n  max-width: auto;\n  min-width: auto;\n}\n.im_dialogs_col_wrap,\n.im_page_peer_not_selected .im_history_col_wrap {\n  display: none;\n}\n.im_page_peer_not_selected .im_dialogs_col_wrap {\n  display: block;\n}\n\n.im_dialogs_panel {\n  display: none;\n  padding-left: 9px;\n  padding-right: 9px;\n\n  &.im_dialogs_panel_search {\n    display: block;\n  }\n}\n\n.im_page_split {\n  .im_dialogs_search {\n    margin-right: 0;\n  }\n}\n\na.im_dialog {\n  .im_dialogs_scrollable_wrap & {\n    border-bottom: 1px solid #eee;\n    border-top: 1px solid #eee;\n    margin-top: -1px;\n    border-radius: 0 !important;\n    padding-right: 11px;\n  }\n\n  .im_dialog_wrap:last-child & {\n    border-bottom: 0;\n  }\n}\n\n.im_dialog_photo {\n  width: 54px;\n  height: 54px;\n  border-radius: 50%;\n  overflow: hidden;\n\n  div& {\n    margin: 0 12px 0 0;\n\n    .peer_initials {\n      line-height: 54px;\n      font-size: 18px;\n    }\n  }\n}\n\n.im_dialog_peer,\n.im_dialog_message {\n  font-size: 1.3em;\n}\n.im_dialog_peer {\n  margin-bottom: 7px;\n  margin-top: 5px;\n}\n.im_dialog_meta {\n  margin-top: 6px;\n}\n\n.im_dialog_date {\n  &,\n  a.im_dialog:hover &,\n  a.im_dialog_selected & {\n    color: #b3b3b3;\n    font-size: 12px;\n    margin-right: 3px;\n  }\n}\n.im_dialog_message_wrap {\n  height: 51px;\n}\n\n.im_dialog_unread {\n  &,\n  .active &,\n  a.im_dialog:hover &,\n  a.im_dialog_selected & {\n    background: #7cacc7;\n  }\n}\n\n.im_dialog_message_text {\n  &,\n  a.im_dialog:hover &,\n  a.im_dialog_selected & {\n    color: #8f8f8f;\n  }\n}\n\n.im_message_fwd_title {\n  display: none;\n\n  .im_grouped_fwd_start & {\n    display: block;\n    color: #8a8a8a;\n    font-size: 13px;\n    font-weight: normal;\n    margin-bottom: 5px;\n  }\n\n  .im_history_messages_group .im_message_in & {\n    margin-top: 5px;\n  }\n\n  .im_message_out & {\n    color: #798791;\n  }\n}\n\n.im_message_selected .im_message_body a,\n.im_message_selected .im_message_fwd_title,\n.im_message_selected .im_message_fwd_date,\n.im_message_selected .im_message_document_name,\n.im_message_selected .im_message_document_size,\n.im_message_selected .audio_player_title,\n.im_message_selected .audio_player_duration,\n.im_message_selected .audio_player_size,\n.im_history_select_active .im_message_selected:hover .im_message_document_size,\n.im_history_select_active .im_message_selected:hover .audio_player_duration,\n.im_history_select_active .im_message_selected:hover .audio_player_size,\n.im_history_select_active .im_message_selected:hover .im_message_fwd_date {\n  color: #fff;\n}\na.im_message_fwd_author {\n  color: #323232;\n}\n.im_dialogs_scrollable_wrap a.im_dialog:hover,\n.im_dialogs_scrollable_wrap a.im_dialog_selected,\n.im_dialogs_scrollable_wrap .active a.im_dialog,\n.im_dialogs_scrollable_wrap .active a.im_dialog:hover,\n.im_dialogs_scrollable_wrap .active a.im_dialog_selected {\n  border-radius: 0;\n  background-color: #f4f4f4;\n}\n\n.mobile_modal {\n  &.modal {\n    background: #fff;\n    padding: 0;\n  }\n\n  &.md_simple_modal_window .modal-dialog {\n    max-width: none;\n  }\n\n  .modal-content {\n    border-radius: 0;\n    box-shadow: none;\n\n    .modal-body {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n\n  .modal-dialog {\n    margin: 0 auto;\n  }\n\n  .modal-footer {\n    padding-left: 0;\n    padding-right: 0;\n    padding-bottom: 9px;\n  }\n\n  &_body,\n  .modal-content .mobile_modal_body {\n    padding: 9px;\n  }\n}\n\n.mobile {\n  &_user_modal_photo_profile_wrap {\n    padding: 3px;\n    margin-bottom: 15px;\n  }\n\n  &_user_modal_image_wrap {\n    display: block;\n    width: 64px;\n    height: 64px;\n    margin-right: 14px;\n\n    .peer_initials {\n      line-height: 64px;\n      font-size: 18px;\n    }\n  }\n\n  &_chat_modal_image {\n    margin-right: 14px;\n    float: left;\n  }\n\n  &_user_modal_image {\n    width: 64px;\n    height: 64px;\n    overflow: hidden;\n    border-radius: 32px;\n  }\n\n  &_user_modal_info_wrap {\n    padding-top: 2px;\n  }\n\n  &_user_modal_header {\n    font-size: 16px;\n    font-weight: bold;\n    margin-bottom: 7px;\n    margin-top: 11px\n  }\n\n  &_user_modal_status {\n    font-size: 14px;\n    color: #999;\n  }\n\n  &_modal_action_wrap {\n    border-bottom: 1px solid #e0e0e0;\n  }\n\n  &_modal_select_wrap {\n    margin: 7px 12px 0;\n  }\n\n  a&_modal_action,\n  span&_modal_action {\n    color: #000;\n    display: block;\n    line-height: 47px;\n    font-size: 15px;\n    padding: 0 12px;\n    margin: 0;\n  }\n\n  span&_modal_upload_action {\n    position: relative;\n    overflow: hidden;\n  }\n\n  a&_modal_action:hover,\n  a&_modal_action:active {\n    text-decoration: none;\n  }\n\n  a&_modal_action .icon-checkbox-outer {\n    float: right;\n    margin-top: 16px;\n    margin-right: 1px;\n  }\n\n  a&_modal_action .tg_checkbox_label {\n    vertical-align: baseline;\n    line-height: inherit;\n  }\n\n  &_modal_section {\n    display: block;\n    border-bottom: 1px solid #e0e0e0;\n    padding: 15px 0;\n  }\n\n  &_modal_section:last-child {\n    border-bottom: 0;\n  }\n\n  &_modal_section_header {\n    font-size: 12px;\n    margin-bottom: 3px;\n    margin-top: 0;\n    color: #999;\n    padding: 0 12px;\n  }\n\n  &_modal_section_value {\n    font-size: 15px;\n    padding: 0 12px;\n\n    overflow: hidden;\n    text-overflow: ellipsis;\n    display: inline-block;\n    width: 100%;\n  }\n\n  &_modal_section_body {\n    padding: 0 12px;\n  }\n}\n\n.user_modal_other_btn {\n  button {\n    padding-right: 0;\n  }\n\n  .dropdown-menu {\n    left: auto;\n    right: -9px;\n  }\n}\n\n.chat_modal {\n  &_actions_wrap {\n    clear: both;\n  }\n\n  &_other_btn {\n    button {\n      padding-right: 0;\n    }\n\n    .dropdown-menu {\n      left: auto;\n      right: -9px;\n    }\n  }\n}\n\n.game_modal_wrap .modal-body {\n  padding: 0;\n}\n\n\n.modal-content {\n  .photo_modal_window &,\n  .video_modal_window & {\n    border-radius: 0;\n  }\n}\n\n.media_modal_wrap {\n  .modal-body {\n    padding: 0 0 0;\n  }\n}\n\n.media_modal_actions,\n.media_modal_info{\n  margin: 10px;\n}\n\n.im_send_form {\n  position: relative;\n  left: 0;\n  right: 0;\n  max-width: none;\n}\n\n.im_submit {\n  width: 50px;\n  min-width: 0;\n  height: 32px;\n  padding: 0;\n  border: 0;\n  position: absolute;\n  right: 0;\n  top: 0;\n\n  &,\n  &:active,\n  &:hover {\n    color: transparent;\n    box-shadow: none;\n    background-color: inherit;\n\n    .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n    background-position: 2px -860px;\n  }\n}\n\n.icon-paperclip, .icon-mic {\n  display: inline-block;\n  width: 18px;\n  height: 23px;\n  vertical-align: text-top;\n  opacity: 0.8;\n\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -12px -68px;\n}\n\n.icon-mic {\n  background-position: -12px -285px;\n}\n.im_voice_recording .icon-mic {\n  background-position: -12px -705px;\n}\n\n.im_attach {\n  cursor: pointer;\n  display: block;\n  overflow: hidden;\n  position: absolute;\n  left: 0;\n  top: 0;\n  margin: 0;\n  width: 50px;\n  height: 32px;\n  padding: 3px 13px 4px 16px;\n  right: auto;\n\n  &:active {\n    .icon-paperclip {\n      background-position: -12px -100px;\n      opacity: 1;\n    }\n  }\n}\n\n.im_record {\n  display: none;\n  right: 0;\n  top: -8px;\n  width: 50px;\n  height: 50px;\n  position: absolute;\n  user-select: none;\n  -moz-user-select: none;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  padding: 13px 16px 13px 16px;\n\n  border-radius: 50px;\n  overflow: hidden;\n  background: #fff;\n  transition: background-color linear 0.2s;\n\n  .im_record_supported .im_send_form_empty & {\n    display: block;\n  }\n}\n.im_send_form_hover .im_voice_recording .im_record {\n  background: #cae9ff;\n}\n\n.im_send_form_empty .im_submit {\n  opacity: 0.4;\n}\n.im_record_supported .im_send_form_empty .im_submit {\n  display: none;\n}\n\n.im_voice_recorder_wrap {\n  height: 32px;\n  line-height: 32px;\n  right: 50px;\n  left: 0;\n  padding: 0 0 0 20px;\n}\n.im_recorder_label {\n  padding-right: 48px;\n}\n\n\n.im_voice_recording,\n.im_processing_recording {\n  color: #AAA;\n\n  .im_voice_recorder_wrap {\n    display: block;\n  }\n  .im_send_field_wrap,\n  .im_submit,\n  .im_attach {\n    display: none;\n    // visibility: hidden;\n  }\n}\n\n.im_processing_recording {\n  .im_recorder_indicator i {\n    background-color: green;\n  }\n\n  .im_record {\n    display: none;\n  }\n}\n\n.icon-emoji {\n  display: inline-block;\n  width: 22px;\n  height: 22px;\n  vertical-align: text-top;\n  opacity: 1;\n  margin: 0;\n\n  .image-2x('../img/icons/IconsetW.png', 42px, 1171px);\n  background-position: -10px -771px;\n}\n\n.composer_emoji_insert_btn {\n  top: 3px;\n  right: 5px;\n\n  &.composer_emoji_insert_btn_on,\n  &:active,\n  .is_1x &.composer_emoji_insert_btn_on,\n  .is_1x &:active {\n    .icon-emoji {\n      background-position: -10px -803px;\n    }\n  }\n}\n\n.im_send_field_wrap {\n  margin-right: 50px;\n  margin-left: 48px;\n\n  .form-control {\n    border-radius: 4px;\n  }\n}\n\n.composer_rich_textarea {\n  min-height: 18px;\n  max-height: 136px;\n  margin-bottom: 0;\n  font-size: 15px;\n\n  &:empty {\n    background: #f1f1f1;\n    border-color: #f1f1f1;\n\n    &:before {\n      color: #999;\n      margin-top: 1px;\n    }\n  }\n\n  &:active,\n  &:focus {\n    box-shadow: none;\n    outline: 0;\n    background: #fff;\n    border-color: #d9dbde;\n    content: none;\n  }\n}\n\n.composer_emoji_tooltip {\n  margin-left: -246px;\n  margin-top: -181px;\n  z-index: 10000;\n}\n.composer_emoji_tooltip_tab {\n  line-height: 15px;\n  font-size: 11px;\n}\n\n.composer_emoji_tooltip .scroller_native_scrollable {\n  height: 117px;\n}\n.composer_emoji_tooltip_tabs_wrap,\n.composer_emoji_tooltip_tab_emoji_content,\n.composer_emoji_tooltip_tab_stickers_content {\n  height: 147px;\n}\n.composer_emoji_tooltip_category {\n  padding-top: 3px;\n  padding-bottom: 3px;\n}\n\n.composer_emoji_tooltip_categories {\n  .composer_emoji_tooltip_tab_stickers_content & {\n    .composer_sticker_btn {\n      padding-top: 0;\n      padding-bottom: 0;\n      margin: 0;\n    }\n  }\n}\n\n.composer_emoji_tooltip_tail {\n  display: none;\n  left: 18px;\n}\n\n.composer_dropdown_wrap {\n  box-shadow: none;\n}\n.composer_dropdown a.composer_command_option,\n.composer_dropdown a.composer_mention_option {\n  padding: 5px 12px;\n  font-size: 12px;\n  line-height: 25px;\n}\n.composer_user_name,\n.composer_user_mention {\n  line-height: 25px;\n}\nspan.composer_user_photo,\nimg.composer_user_photo {\n  width: 25px;\n  height: 25px;\n}\n\n.composer_dropdown a.composer_emoji_option {\n  padding: 5px 12px;\n  font-size: 13px;\n  line-height: 26px;\n}\n.composer_dropdown a.composer_emoji_option .emoji {\n  vertical-align: top;\n}\n.composer_emoji_shortcut {\n  line-height: 26px;\n}\n\n.contacts_modal {\n  &_search {\n    margin: -9px -9px 0;\n  }\n\n  &_col {\n    margin: 0 -9px;\n  }\n\n  &_members_list {\n    a.contacts_modal_contact {\n      padding: 8px 9px;\n      border-radius: 0;\n      border-bottom: 1px solid #eee;\n\n      &:hover {\n        background: inherit;\n      }\n    }\n\n    li.contacts_modal_contact_wrap {\n      margin: 0;\n    }\n\n    li:last-child a {\n      border-bottom: 0;\n    }\n  }\n}\n.modal-content .sessions_modal_wrap .mobile_modal_body {\n  padding: 0;\n}\n.sessions_modal_session {\n  padding: 8px 15px;\n}\n.sessions_modal_terminate_all_wrap {\n  margin-left: 15px;\n}\n\n\n.mobile_modal {\n  .peer_select_modal_wrap {\n    .modal-body {\n      padding: 0;\n    }\n  }\n}\n\n.settings_about_section_body {\n  padding-right: 0;\n}\n\n.countries_modal {\n  &_search {\n    padding: 3px 3px 12px;\n    margin: 0;\n    position: relative;\n  }\n\n  &_col {\n    margin: 0 -9px;\n  }\n\n  &_members_list {\n    padding: 0 12px 0 12px;\n  }\n\n  .countries_scrollable_wrap a&_country {\n    padding: 8px 8px;\n  }\n}\n\n.import_modal_phonebook_wrap {\n  margin-top: 40px;\n  text-align: center;\n}\n\n.media_modal_bottom {\n  &_panel_wrap {\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    height: 46px;\n    background: rgba(0,0,0,0.6);\n    z-index: 1030;\n  }\n\n  &_panel {\n    color: #fff;\n  }\n}\n\n.media_modal_top {\n  &_panel_wrap {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    height: 46px;\n    background: rgba(0,0,0,0.6);\n    z-index: 1030;\n  }\n\n  &_panel {\n    color: #fff;\n  }\n\n  &_actions {\n    .navbar-quick-media-back {\n      color: inherit;\n      position: relative;\n      display: block;\n      padding-left: 16px;\n      padding: 6px 10px 2px 28px;\n      font-size: 13px;\n      height: 46px;\n\n      &:hover {\n        text-decoration: none;\n      }\n\n      .icon-back {\n        position: absolute;\n        margin-left: -18px;\n        margin-top: 8px;\n      }\n    }\n  }\n}\n\nh4.media_modal_title_wrap {\n  color: inherit;\n  margin: 8px 0 11px 0;\n  white-space: nowrap;\n  text-overflow:ellipsis;\n  overflow: hidden;\n}\n.media_modal_info_wrap {\n  line-height: 16px;\n  padding: 7px 20px;\n  text-align: center;\n  max-width: 150px;\n  margin: 0 auto;\n}\n.media_modal_author {\n  display: inline-block;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  max-width: 150px;\n  font-size: 14px;\n}\n.media_modal_date,\na.media_modal_date:hover {\n  font-size: 12px;\n  color: #999;\n}\n.photo_modal_window,\n.video_modal_window,\n.document_modal_window {\n  padding: 0;\n  background: #000;\n}\n\n.photo_modal_window,\n.video_modal_window,\n.document_modal_window {\n  .modal-content {\n    background: none;\n    box-shadow: none;\n  }\n}\n\n.video_modal_window .modal-body {\n  padding: 0;\n}\n\n.media_modal_action_btn {\n  float: left;\n  display: block;\n  width: 46px;\n  height: 46px;\n\n  .tg_page_head .navbar-inverse .navbar-quick-nav > .navbar-quick-right > a&,\n  .tg_page_head .navbar-inverse .navbar-quick-nav > .navbar-quick-left > a& {\n    padding: 0;\n  }\n\n  i {\n    display: block;\n    opacity: 0.8;\n\n    .image-2x('../img/icons/PhotoIcons.png', 40px, 200px);\n    background-position: 0 0;\n  }\n\n  &:active {\n    i {\n      opacity: 1;\n    }\n  }\n\n  & i&_download {\n    background-position: -12px -163px;\n    width: 16px;\n    height: 20px;\n    margin: 14px 15px;\n  }\n\n  & i&_forward {\n    background-position: -9px -109px;\n    width: 23px;\n    height: 15px;\n    margin: 14px 13px;\n  }\n\n  & i&_delete {\n    background-position: -13px -135px;\n    width: 14px;\n    height: 18px;\n    margin: 13px 17px;\n  }\n}\n\n\n.stickerset_modal_stickers_list {\n  padding: 10px;\n}\n.stickerset_modal_sticker_wrap,\n.stickerset_modal_sticker_wrap img,\n.stickerset_modal_sticker {\n  width: 90px;\n  height: 90px;\n}\n\n.message_actions_modal_window {\n  max-width: 220px;\n  margin: 0 auto;\n}\n.message_actions_wrap {\n  padding: 10px 20px;\n}\n\n\n\n.im_send_reply_wrap {\n  margin-left: 38px;\n  margin-right: 10px;\n}\n.composer_rich_textarea,\n.composer_textarea {\n  padding-right: 28px;\n\n  .im_send_field_wrap_2ndbtn & {\n    padding-right: 35px;\n  }\n}\n.im_inline_placeholder_wrap {\n  font-size: 15px;\n  line-height: 17px;\n  padding: 6px 7px;\n  top: 0;\n}\n\n.im_send_dropbox_wrap {\n  padding: 5px 10px;\n  font-size: 15px;\n  line-height: 22px;\n}\n\n\n.im_send_field_panel {\n  position: relative;\n}\n.composer_command_btn {\n  right: 35px;\n  top: 6px;\n}\n.composer_keyboard_btn {\n  right: 35px;\n  top: 6px;\n}\n.im_send_keyboard_wrap {\n  padding: 0 5px;\n}\n.composer_progress_icon_wrap {\n  right: 6px;\n  top: 4px;\n}\n"
  },
  {
    "path": "app/manifest.json",
    "content": "{\n  \"name\": \"Telegram\",\n  \"description\": \"Telegram Web App.\\nMore info & source code here: https://github.com/zhukov/webogram\",\n  \"version\": \"0.7.0\",\n  \"short_name\": \"Telegram\",\n  \"manifest_version\": 2,\n  \"app\": {\n    \"background\": {\n      \"scripts\": [\"js/background.js\"]\n    }\n  },\n  \"permissions\": [\n    \"notifications\",\n    \"webview\",\n    {\"fileSystem\": [\"write\"]},\n    \"storage\",\n    \"unlimitedStorage\",\n    \"fullscreen\"\n  ],\n  \"gcm_sender_id\": \"122867383838\",\n  \"icons\": {\n    \"16\": \"img/icons/icon16.png\",\n    \"32\": \"img/icons/icon32.png\",\n    \"60\": \"img/icons/icon60.png\",\n    \"64\": \"img/icons/icon64.png\",\n    \"90\": \"img/icons/icon90.png\",\n    \"128\": \"img/icons/icon128.png\"\n  }\n}\n"
  },
  {
    "path": "app/manifest.webapp",
    "content": "{\n  \"name\": \"Telegram\",\n  \"description\": \"Telegram Web App.\\nMore info & source code here: https://github.com/zhukov/webogram\",\n  \"version\": \"0.7.0\",\n  \"type\": \"privileged\",\n  \"launch_path\": \"/index.html\",\n  \"developer\": {\n    \"name\": \"Igor Zhukov\",\n    \"url\": \"https://github.com/zhukov\"\n  },\n  \"installs_allowed_from\": [\n    \"*\"\n  ],\n  \"messages\": [{\n    \"push\": \"/index.html\"\n  }, {\n    \"push-register\": \"/index.html\"\n  }, {\n    \"notification\": \"/index.html\"\n  }],\n  \"permissions\": {\n    \"desktop-notification\": {\n      \"description\": \"Required to show new message notifications\"\n    },\n    \"contacts\": {\n      \"description\": \"Required to import phonebook contacts\",\n      \"access\": \"readonly\"\n    },\n    \"push\": {\n      \"description\": \"Required for notifications\"\n    },\n    \"device-storage:music\": {\n      \"description\": \"Required for voice notes download\",\n      \"access\": \"createonly\"\n    },\n    \"device-storage:pictures\": {\n    \"description\": \"Required for photos download\",\n      \"access\": \"createonly\"\n    },\n    \"device-storage:sdcard\": {\n    \"description\": \"Required for documents download\",\n      \"access\": \"createonly\"\n    },\n    \"device-storage:videos\": {\n    \"description\": \"Required for videos download\",\n      \"access\": \"createonly\"\n    },\n    \"audio-capture\" : {\n    \"description\" : \"Required to record voice messages\"\n    }\n  },\n  \"activities\": {\n    \"share\": {\n      \"href\": \"/index.html\",\n      \"disposition\": \"window\",\n      \"filters\": {\n        \"type\": [\"image/*\",\"audio/*\",\"video/*\", \"url\"],\n        \"url\": {\n          \"pattern\": \"https?:.{1,16384}\",\n          \"regexp\": \"^https?:\"\n        }\n      },\n      \"returnValue\": false\n    },\n    \"view\": {\n      \"href\": \"/index.html\",\n      \"disposition\": \"window\",\n      \"filters\": {\n        \"type\": \"url\",\n        \"url\": {\n          \"required\": true,\n          \"pattern\": \"tg:.{1,16384}\",\n          \"regexp\": \"^tg:\"\n        }\n      },\n      \"returnValue\": false\n    }\n  },\n  \"orientation\": \"portrait-primary\",\n  \"icons\": {\n    \"16\": \"/img/icons/icon16.png\",\n    \"32\": \"/img/icons/icon32.png\",\n    \"60\": \"/img/icons/icon60.png\",\n    \"64\": \"/img/icons/icon64.png\",\n    \"90\": \"/img/icons/icon90.png\",\n    \"120\": \"/img/icons/icon120.png\",\n    \"128\": \"/img/icons/icon128.png\"\n  }\n}\n"
  },
  {
    "path": "app/manifest.webapp.json",
    "content": "{\n  \"name\": \"Telegram\",\n  \"description\": \"Telegram Web App.\\nMore info & source code here: https://github.com/zhukov/webogram\",\n  \"short_name\": \"Telegram\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#497495\",\n  \"gcm_sender_id\": \"122867383838\",\n  \"start_url\": \"./\",\n  \"scope\": \"/\",\n  \"background_color\": \"#fff\",\n  \"icons\": [\n    {\n      \"src\": \"img/icons/icon16.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"16x16\"\n    },\n    {\n      \"src\": \"img/icons/icon32.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"32x32\"\n    },\n    {\n      \"src\": \"img/icons/icon60.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"60x60\"\n    },\n    {\n      \"src\": \"img/icons/icon64.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"64x64\"\n    },\n    {\n      \"src\": \"img/icons/icon90.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"90x90\"\n    },\n    {\n      \"src\": \"img/icons/icon128.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"128x128\"\n    },\n    {\n      \"src\": \"img/icons/icon192.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"192x192\"\n    },\n    {\n      \"src\": \"img/icons/icon512.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"512x512\"\n    },\n    {\n      \"src\": \"img/icons/icon.svg\",\n      \"type\": \"image/svg+xml\",\n      \"sizes\": \"513x513\"\n    }\n  ],\n  \"related_applications\": [\n    {\n      \"platform\": \"play\",\n      \"id\": \"org.telegram.messenger\",\n      \"url\": \"https://telegram.org/dl/android?ref=webmanifest\"\n    },\n    {\n      \"platform\": \"itunes\",\n      \"url\": \"https://telegram.org/dl/ios?ref=webmanifest\"\n    }\n  ]\n}\n"
  },
  {
    "path": "app/nacl/Makefile",
    "content": "# Copyright (c) 2013 The Native Client Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n#\n# GNU Make based build file.  For details on GNU Make see:\n# http://www.gnu.org/software/make/manual/make.html\n#\n\n#\n# Get pepper directory for toolchain and includes.\n#\n# If NACL_SDK_ROOT is not set, then assume it can be found three directories up.\n#\nTHIS_MAKEFILE := $(abspath $(lastword $(MAKEFILE_LIST)))\nNACL_SDK_ROOT ?= $(abspath $(dir $(THIS_MAKEFILE))../..)\n\n# Project Build flags\nWARNINGS := -Wno-long-long -Wall -Wswitch-enum -pedantic -Werror\nCXXFLAGS := -pthread -std=gnu++98 $(WARNINGS)\n\n#\n# Compute tool paths\n#\nGETOS := python $(NACL_SDK_ROOT)/tools/getos.py\nOSHELPERS = python $(NACL_SDK_ROOT)/tools/oshelpers.py\nOSNAME := $(shell $(GETOS))\nRM := $(OSHELPERS) rm\n\nPNACL_TC_PATH := $(abspath $(NACL_SDK_ROOT)/toolchain/$(OSNAME)_pnacl)\nPNACL_CXX := $(PNACL_TC_PATH)/bin/pnacl-clang++\nPNACL_FINALIZE := $(PNACL_TC_PATH)/bin/pnacl-finalize\nCXXFLAGS := -I$(NACL_SDK_ROOT)/include\nLDFLAGS := -L$(NACL_SDK_ROOT)/lib/pnacl/Release -lppapi_cpp -lppapi\n\n#\n# Disable DOS PATH warning when using Cygwin based tools Windows\n#\nCYGWIN ?= nodosfilewarning\nexport CYGWIN\n\n\n# Declare the ALL target first, to make the 'all' target the default build\nall: mtproto_crypto.pexe\n\nclean:\n\t$(RM) mtproto_crypto.pexe mtproto_crypto.bc\n\nmtproto_crypto.bc: mtproto_crypto.cc aes_core.c aes_ige.c aes_misc.c\n\t$(PNACL_CXX) -o $@ $^ -O2 $(CXXFLAGS) $(LDFLAGS)\n\t# $(PNACL_CXX) -g -o $@ $^ $(CXXFLAGS) $(LDFLAGS)\n\nmtproto_crypto.pexe: mtproto_crypto.bc\n\t$(PNACL_FINALIZE) -o $@ $<\n"
  },
  {
    "path": "app/nacl/aes.h",
    "content": "/* crypto/aes/aes.h -*- mode:C; c-file-style: \"eay\" -*- */\n/* ====================================================================\n * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer. \n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"\n *\n * 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    openssl-core@openssl.org.\n *\n * 5. Products derived from this software may not be called \"OpenSSL\"\n *    nor may \"OpenSSL\" appear in their names without prior written\n *    permission of the OpenSSL Project.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit (http://www.openssl.org/)\"\n *\n * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR\n * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n * ====================================================================\n *\n */\n\n#ifndef HEADER_AES_H\n#define HEADER_AES_H\n\n//#include <openssl/opensslconf.h>\n\n#ifdef OPENSSL_NO_AES\n#error AES is disabled.\n#endif\n\n#include <stddef.h>\n\n#define AES_ENCRYPT\t1\n#define AES_DECRYPT\t0\n\n/* Because array size can't be a const in C, the following two are macros.\n   Both sizes are in bytes. */\n#define AES_MAXNR 14\n#define AES_BLOCK_SIZE 16\n\n#ifdef  __cplusplus\nextern \"C\" {\n#endif\n\n/* This should be a hidden type, but EVP requires that the size be known */\nstruct aes_key_st {\n#ifdef AES_LONG\n    unsigned long rd_key[4 *(AES_MAXNR + 1)];\n#else\n    unsigned int rd_key[4 *(AES_MAXNR + 1)];\n#endif\n    int rounds;\n};\ntypedef struct aes_key_st AES_KEY;\n\nconst char *AES_options(void);\n\nint AES_set_encrypt_key(const unsigned char *userKey, const int bits,\n\tAES_KEY *key);\nint AES_set_decrypt_key(const unsigned char *userKey, const int bits,\n\tAES_KEY *key);\n\nint private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,\n\tAES_KEY *key);\nint private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,\n\tAES_KEY *key);\n\nvoid AES_encrypt(const unsigned char *in, unsigned char *out,\n\tconst AES_KEY *key);\nvoid AES_decrypt(const unsigned char *in, unsigned char *out,\n\tconst AES_KEY *key);\n\nvoid AES_ecb_encrypt(const unsigned char *in, unsigned char *out,\n\tconst AES_KEY *key, const int enc);\nvoid AES_cbc_encrypt(const unsigned char *in, unsigned char *out,\n\tsize_t length, const AES_KEY *key,\n\tunsigned char *ivec, const int enc);\nvoid AES_cfb128_encrypt(const unsigned char *in, unsigned char *out,\n\tsize_t length, const AES_KEY *key,\n\tunsigned char *ivec, int *num, const int enc);\nvoid AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,\n\tsize_t length, const AES_KEY *key,\n\tunsigned char *ivec, int *num, const int enc);\nvoid AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,\n\tsize_t length, const AES_KEY *key,\n\tunsigned char *ivec, int *num, const int enc);\nvoid AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,\n\tsize_t length, const AES_KEY *key,\n\tunsigned char *ivec, int *num);\nvoid AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,\n\tsize_t length, const AES_KEY *key,\n\tunsigned char ivec[AES_BLOCK_SIZE],\n\tunsigned char ecount_buf[AES_BLOCK_SIZE],\n\tunsigned int *num);\n/* NB: the IV is _two_ blocks long */\nvoid AES_ige_encrypt(const unsigned char *in, unsigned char *out,\n\t\t     size_t length, const AES_KEY *key,\n\t\t     unsigned char *ivec, const int enc);\n/* NB: the IV is _four_ blocks long */\nvoid AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,\n\t\t\tsize_t length, const AES_KEY *key,\n\t\t\tconst AES_KEY *key2, const unsigned char *ivec,\n\t\t\tconst int enc);\n\nint AES_wrap_key(AES_KEY *key, const unsigned char *iv,\n\t\tunsigned char *out,\n\t\tconst unsigned char *in, unsigned int inlen);\nint AES_unwrap_key(AES_KEY *key, const unsigned char *iv,\n\t\tunsigned char *out,\n\t\tconst unsigned char *in, unsigned int inlen);\n\n\n#ifdef  __cplusplus\n}\n#endif\n\n#endif /* !HEADER_AES_H */\n"
  },
  {
    "path": "app/nacl/aes_core.c",
    "content": "/* crypto/aes/aes_core.c -*- mode:C; c-file-style: \"eay\" -*- */\n/**\n * rijndael-alg-fst.c\n *\n * @version 3.0 (December 2000)\n *\n * Optimised ANSI C code for the Rijndael cipher (now AES)\n *\n * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>\n * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>\n * @author Paulo Barreto <paulo.barreto@terra.com.br>\n *\n * This code is hereby placed in the public domain.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Note: rewritten a little bit to provide error control and an OpenSSL-\n   compatible API */\n\n#ifndef AES_DEBUG\n# ifndef NDEBUG\n#  define NDEBUG\n# endif\n#endif\n#include <assert.h>\n\n#include <stdlib.h>\n#include \"aes.h\"\n#include \"aes_locl.h\"\n\n#ifndef AES_ASM\n/*\nTe0[x] = S [x].[02, 01, 01, 03];\nTe1[x] = S [x].[03, 02, 01, 01];\nTe2[x] = S [x].[01, 03, 02, 01];\nTe3[x] = S [x].[01, 01, 03, 02];\n\nTd0[x] = Si[x].[0e, 09, 0d, 0b];\nTd1[x] = Si[x].[0b, 0e, 09, 0d];\nTd2[x] = Si[x].[0d, 0b, 0e, 09];\nTd3[x] = Si[x].[09, 0d, 0b, 0e];\nTd4[x] = Si[x].[01];\n*/\n\nstatic const u32 Te0[256] = {\n    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,\n    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,\n    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,\n    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,\n    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,\n    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,\n    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,\n    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,\n    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,\n    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,\n    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,\n    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,\n    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,\n    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,\n    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,\n    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,\n    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,\n    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,\n    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,\n    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,\n    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,\n    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,\n    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,\n    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,\n    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,\n    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,\n    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,\n    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,\n    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,\n    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,\n    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,\n    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,\n    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,\n    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,\n    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,\n    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,\n    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,\n    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,\n    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,\n    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,\n    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,\n    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,\n    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,\n    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,\n    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,\n    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,\n    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,\n    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,\n    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,\n    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,\n    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,\n    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,\n    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,\n    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,\n    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,\n    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,\n    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,\n    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,\n    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,\n    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,\n    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,\n    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,\n    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,\n    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,\n};\nstatic const u32 Te1[256] = {\n    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,\n    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,\n    0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,\n    0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,\n    0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,\n    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,\n    0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,\n    0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,\n    0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,\n    0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,\n    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,\n    0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,\n    0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,\n    0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,\n    0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,\n    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,\n    0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,\n    0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,\n    0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,\n    0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,\n    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,\n    0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,\n    0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,\n    0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,\n    0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,\n    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,\n    0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,\n    0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,\n    0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,\n    0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,\n    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,\n    0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,\n    0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,\n    0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,\n    0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,\n    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,\n    0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,\n    0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,\n    0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,\n    0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,\n    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,\n    0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,\n    0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,\n    0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,\n    0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,\n    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,\n    0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,\n    0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,\n    0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,\n    0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,\n    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,\n    0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,\n    0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,\n    0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,\n    0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,\n    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,\n    0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,\n    0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,\n    0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,\n    0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,\n    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,\n    0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,\n    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,\n    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,\n};\nstatic const u32 Te2[256] = {\n    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,\n    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,\n    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,\n    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,\n    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,\n    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,\n    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,\n    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,\n    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,\n    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,\n    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,\n    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,\n    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,\n    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,\n    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,\n    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,\n    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,\n    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,\n    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,\n    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,\n    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,\n    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,\n    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,\n    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,\n    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,\n    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,\n    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,\n    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,\n    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,\n    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,\n    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,\n    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,\n    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,\n    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,\n    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,\n    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,\n    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,\n    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,\n    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,\n    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,\n    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,\n    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,\n    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,\n    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,\n    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,\n    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,\n    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,\n    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,\n    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,\n    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,\n    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,\n    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,\n    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,\n    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,\n    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,\n    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,\n    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,\n    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,\n    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,\n    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,\n    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,\n    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,\n    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,\n    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,\n};\nstatic const u32 Te3[256] = {\n    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,\n    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,\n    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,\n    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,\n    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,\n    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,\n    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,\n    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,\n    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,\n    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,\n    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,\n    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,\n    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,\n    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,\n    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,\n    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,\n    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,\n    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,\n    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,\n    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,\n    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,\n    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,\n    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,\n    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,\n    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,\n    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,\n    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,\n    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,\n    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,\n    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,\n    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,\n    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,\n    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,\n    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,\n    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,\n    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,\n    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,\n    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,\n    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,\n    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,\n    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,\n    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,\n    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,\n    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,\n    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,\n    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,\n    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,\n    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,\n    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,\n    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,\n    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,\n    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,\n    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,\n    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,\n    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,\n    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,\n    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,\n    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,\n    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,\n    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,\n    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,\n    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,\n    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,\n    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,\n};\n\nstatic const u32 Td0[256] = {\n    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,\n    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,\n    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,\n    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,\n    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,\n    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,\n    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,\n    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,\n    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,\n    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,\n    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,\n    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,\n    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,\n    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,\n    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,\n    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,\n    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,\n    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,\n    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,\n    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,\n    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,\n    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,\n    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,\n    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,\n    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,\n    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,\n    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,\n    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,\n    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,\n    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,\n    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,\n    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,\n    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,\n    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,\n    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,\n    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,\n    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,\n    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,\n    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,\n    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,\n    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,\n    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,\n    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,\n    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,\n    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,\n    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,\n    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,\n    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,\n    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,\n    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,\n    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,\n    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,\n    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,\n    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,\n    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,\n    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,\n    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,\n    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,\n    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,\n    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,\n    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,\n    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,\n    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,\n    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,\n};\nstatic const u32 Td1[256] = {\n    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,\n    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,\n    0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,\n    0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,\n    0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,\n    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,\n    0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,\n    0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,\n    0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,\n    0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,\n    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,\n    0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,\n    0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,\n    0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,\n    0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,\n    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,\n    0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,\n    0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,\n    0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,\n    0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,\n    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,\n    0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,\n    0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,\n    0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,\n    0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,\n    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,\n    0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,\n    0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,\n    0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,\n    0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,\n    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,\n    0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,\n    0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,\n    0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,\n    0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,\n    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,\n    0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,\n    0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,\n    0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,\n    0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,\n    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,\n    0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,\n    0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,\n    0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,\n    0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,\n    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,\n    0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,\n    0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,\n    0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,\n    0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,\n    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,\n    0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,\n    0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,\n    0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,\n    0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,\n    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,\n    0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,\n    0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,\n    0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,\n    0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,\n    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,\n    0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,\n    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,\n    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,\n};\nstatic const u32 Td2[256] = {\n    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,\n    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,\n    0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,\n    0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,\n    0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,\n    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,\n    0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,\n    0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,\n    0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,\n    0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,\n    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,\n    0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,\n    0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,\n    0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,\n    0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,\n    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,\n    0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,\n    0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,\n    0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,\n    0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,\n    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,\n    0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,\n    0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,\n    0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,\n    0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,\n    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,\n    0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,\n    0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,\n    0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,\n    0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,\n    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,\n    0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,\n    0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,\n    0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,\n    0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,\n    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,\n    0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,\n    0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,\n    0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,\n    0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,\n    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,\n    0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,\n    0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,\n    0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,\n    0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,\n    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,\n    0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,\n    0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,\n    0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,\n    0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,\n    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,\n    0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,\n    0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,\n    0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,\n    0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,\n    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,\n    0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,\n    0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,\n    0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,\n    0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,\n    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,\n    0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,\n    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,\n    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,\n};\nstatic const u32 Td3[256] = {\n    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,\n    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,\n    0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,\n    0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,\n    0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,\n    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,\n    0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,\n    0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,\n    0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,\n    0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,\n    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,\n    0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,\n    0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,\n    0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,\n    0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,\n    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,\n    0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,\n    0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,\n    0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,\n    0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,\n    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,\n    0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,\n    0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,\n    0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,\n    0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,\n    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,\n    0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,\n    0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,\n    0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,\n    0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,\n    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,\n    0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,\n    0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,\n    0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,\n    0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,\n    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,\n    0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,\n    0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,\n    0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,\n    0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,\n    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,\n    0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,\n    0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,\n    0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,\n    0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,\n    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,\n    0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,\n    0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,\n    0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,\n    0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,\n    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,\n    0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,\n    0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,\n    0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,\n    0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,\n    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,\n    0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,\n    0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,\n    0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,\n    0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,\n    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,\n    0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,\n    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,\n    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,\n};\nstatic const u8 Td4[256] = {\n    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,\n    0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,\n    0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,\n    0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,\n    0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,\n    0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,\n    0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,\n    0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,\n    0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,\n    0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,\n    0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,\n    0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,\n    0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,\n    0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,\n    0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,\n    0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,\n    0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,\n    0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,\n    0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,\n    0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,\n    0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,\n    0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,\n    0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,\n    0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,\n    0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,\n    0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,\n    0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,\n    0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,\n    0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,\n    0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,\n    0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,\n    0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,\n};\nstatic const u32 rcon[] = {\n\t0x01000000, 0x02000000, 0x04000000, 0x08000000,\n\t0x10000000, 0x20000000, 0x40000000, 0x80000000,\n\t0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */\n};\n\n/**\n * Expand the cipher key into the encryption key schedule.\n */\nint private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,\n\t\t\tAES_KEY *key) {\n\n\tu32 *rk;\n   \tint i = 0;\n\tu32 temp;\n\n\tif (!userKey || !key)\n\t\treturn -1;\n\tif (bits != 128 && bits != 192 && bits != 256)\n\t\treturn -2;\n\n\trk = key->rd_key;\n\n\tif (bits==128)\n\t\tkey->rounds = 10;\n\telse if (bits==192)\n\t\tkey->rounds = 12;\n\telse\n\t\tkey->rounds = 14;\n\n\trk[0] = GETU32(userKey     );\n\trk[1] = GETU32(userKey +  4);\n\trk[2] = GETU32(userKey +  8);\n\trk[3] = GETU32(userKey + 12);\n\tif (bits == 128) {\n\t\twhile (1) {\n\t\t\ttemp  = rk[3];\n\t\t\trk[4] = rk[0] ^\n\t\t\t\t(Te2[(temp >> 16) & 0xff] & 0xff000000) ^\n\t\t\t\t(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^\n\t\t\t\t(Te0[(temp      ) & 0xff] & 0x0000ff00) ^\n\t\t\t\t(Te1[(temp >> 24)       ] & 0x000000ff) ^\n\t\t\t\trcon[i];\n\t\t\trk[5] = rk[1] ^ rk[4];\n\t\t\trk[6] = rk[2] ^ rk[5];\n\t\t\trk[7] = rk[3] ^ rk[6];\n\t\t\tif (++i == 10) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\trk += 4;\n\t\t}\n\t}\n\trk[4] = GETU32(userKey + 16);\n\trk[5] = GETU32(userKey + 20);\n\tif (bits == 192) {\n\t\twhile (1) {\n\t\t\ttemp = rk[ 5];\n\t\t\trk[ 6] = rk[ 0] ^\n\t\t\t\t(Te2[(temp >> 16) & 0xff] & 0xff000000) ^\n\t\t\t\t(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^\n\t\t\t\t(Te0[(temp      ) & 0xff] & 0x0000ff00) ^\n\t\t\t\t(Te1[(temp >> 24)       ] & 0x000000ff) ^\n\t\t\t\trcon[i];\n\t\t\trk[ 7] = rk[ 1] ^ rk[ 6];\n\t\t\trk[ 8] = rk[ 2] ^ rk[ 7];\n\t\t\trk[ 9] = rk[ 3] ^ rk[ 8];\n\t\t\tif (++i == 8) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\trk[10] = rk[ 4] ^ rk[ 9];\n\t\t\trk[11] = rk[ 5] ^ rk[10];\n\t\t\trk += 6;\n\t\t}\n\t}\n\trk[6] = GETU32(userKey + 24);\n\trk[7] = GETU32(userKey + 28);\n\tif (bits == 256) {\n\t\twhile (1) {\n\t\t\ttemp = rk[ 7];\n\t\t\trk[ 8] = rk[ 0] ^\n\t\t\t\t(Te2[(temp >> 16) & 0xff] & 0xff000000) ^\n\t\t\t\t(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^\n\t\t\t\t(Te0[(temp      ) & 0xff] & 0x0000ff00) ^\n\t\t\t\t(Te1[(temp >> 24)       ] & 0x000000ff) ^\n\t\t\t\trcon[i];\n\t\t\trk[ 9] = rk[ 1] ^ rk[ 8];\n\t\t\trk[10] = rk[ 2] ^ rk[ 9];\n\t\t\trk[11] = rk[ 3] ^ rk[10];\n\t\t\tif (++i == 7) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\ttemp = rk[11];\n\t\t\trk[12] = rk[ 4] ^\n\t\t\t\t(Te2[(temp >> 24)       ] & 0xff000000) ^\n\t\t\t\t(Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^\n\t\t\t\t(Te0[(temp >>  8) & 0xff] & 0x0000ff00) ^\n\t\t\t\t(Te1[(temp      ) & 0xff] & 0x000000ff);\n\t\t\trk[13] = rk[ 5] ^ rk[12];\n\t\t\trk[14] = rk[ 6] ^ rk[13];\n\t\t\trk[15] = rk[ 7] ^ rk[14];\n\n\t\t\trk += 8;\n        \t}\n\t}\n\treturn 0;\n}\n\n/**\n * Expand the cipher key into the decryption key schedule.\n */\nint private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,\n\t\t\t AES_KEY *key) {\n\n        u32 *rk;\n\tint i, j, status;\n\tu32 temp;\n\n\t/* first, start with an encryption schedule */\n\tstatus = private_AES_set_encrypt_key(userKey, bits, key);\n\tif (status < 0)\n\t\treturn status;\n\n\trk = key->rd_key;\n\n\t/* invert the order of the round keys: */\n\tfor (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {\n\t\ttemp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;\n\t\ttemp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;\n\t\ttemp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;\n\t\ttemp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;\n\t}\n\t/* apply the inverse MixColumn transform to all round keys but the first and the last: */\n\tfor (i = 1; i < (key->rounds); i++) {\n\t\trk += 4;\n\t\trk[0] =\n\t\t\tTd0[Te1[(rk[0] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te1[(rk[0] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te1[(rk[0]      ) & 0xff] & 0xff];\n\t\trk[1] =\n\t\t\tTd0[Te1[(rk[1] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te1[(rk[1] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te1[(rk[1]      ) & 0xff] & 0xff];\n\t\trk[2] =\n\t\t\tTd0[Te1[(rk[2] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te1[(rk[2] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te1[(rk[2]      ) & 0xff] & 0xff];\n\t\trk[3] =\n\t\t\tTd0[Te1[(rk[3] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te1[(rk[3] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te1[(rk[3]      ) & 0xff] & 0xff];\n\t}\n\treturn 0;\n}\n\n/*\n * Encrypt a single block\n * in and out can overlap\n */\nvoid AES_encrypt(const unsigned char *in, unsigned char *out,\n\t\t const AES_KEY *key) {\n\n\tconst u32 *rk;\n\tu32 s0, s1, s2, s3, t0, t1, t2, t3;\n#ifndef FULL_UNROLL\n\tint r;\n#endif /* ?FULL_UNROLL */\n\n\tassert(in && out && key);\n\trk = key->rd_key;\n\n\t/*\n\t * map byte array block to cipher state\n\t * and add initial round key:\n\t */\n\ts0 = GETU32(in     ) ^ rk[0];\n\ts1 = GETU32(in +  4) ^ rk[1];\n\ts2 = GETU32(in +  8) ^ rk[2];\n\ts3 = GETU32(in + 12) ^ rk[3];\n#ifdef FULL_UNROLL\n\t/* round 1: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];\n   \t/* round 2: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];\n\t/* round 3: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];\n   \t/* round 4: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];\n\t/* round 5: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];\n   \t/* round 6: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];\n\t/* round 7: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];\n   \t/* round 8: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];\n\t/* round 9: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];\n    if (key->rounds > 10) {\n        /* round 10: */\n        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];\n        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];\n        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];\n        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];\n        /* round 11: */\n        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];\n        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];\n        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];\n        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];\n        if (key->rounds > 12) {\n            /* round 12: */\n            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];\n            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];\n            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];\n            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];\n            /* round 13: */\n            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];\n            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];\n            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];\n            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];\n        }\n    }\n    rk += key->rounds << 2;\n#else  /* !FULL_UNROLL */\n    /*\n     * Nr - 1 full rounds:\n     */\n    r = key->rounds >> 1;\n    for (;;) {\n        t0 =\n            Te0[(s0 >> 24)       ] ^\n            Te1[(s1 >> 16) & 0xff] ^\n            Te2[(s2 >>  8) & 0xff] ^\n            Te3[(s3      ) & 0xff] ^\n            rk[4];\n        t1 =\n            Te0[(s1 >> 24)       ] ^\n            Te1[(s2 >> 16) & 0xff] ^\n            Te2[(s3 >>  8) & 0xff] ^\n            Te3[(s0      ) & 0xff] ^\n            rk[5];\n        t2 =\n            Te0[(s2 >> 24)       ] ^\n            Te1[(s3 >> 16) & 0xff] ^\n            Te2[(s0 >>  8) & 0xff] ^\n            Te3[(s1      ) & 0xff] ^\n            rk[6];\n        t3 =\n            Te0[(s3 >> 24)       ] ^\n            Te1[(s0 >> 16) & 0xff] ^\n            Te2[(s1 >>  8) & 0xff] ^\n            Te3[(s2      ) & 0xff] ^\n            rk[7];\n\n        rk += 8;\n        if (--r == 0) {\n            break;\n        }\n\n        s0 =\n            Te0[(t0 >> 24)       ] ^\n            Te1[(t1 >> 16) & 0xff] ^\n            Te2[(t2 >>  8) & 0xff] ^\n            Te3[(t3      ) & 0xff] ^\n            rk[0];\n        s1 =\n            Te0[(t1 >> 24)       ] ^\n            Te1[(t2 >> 16) & 0xff] ^\n            Te2[(t3 >>  8) & 0xff] ^\n            Te3[(t0      ) & 0xff] ^\n            rk[1];\n        s2 =\n            Te0[(t2 >> 24)       ] ^\n            Te1[(t3 >> 16) & 0xff] ^\n            Te2[(t0 >>  8) & 0xff] ^\n            Te3[(t1      ) & 0xff] ^\n            rk[2];\n        s3 =\n            Te0[(t3 >> 24)       ] ^\n            Te1[(t0 >> 16) & 0xff] ^\n            Te2[(t1 >>  8) & 0xff] ^\n            Te3[(t2      ) & 0xff] ^\n            rk[3];\n    }\n#endif /* ?FULL_UNROLL */\n    /*\n\t * apply last round and\n\t * map cipher state to byte array block:\n\t */\n\ts0 =\n\t\t(Te2[(t0 >> 24)       ] & 0xff000000) ^\n\t\t(Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te0[(t2 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te1[(t3      ) & 0xff] & 0x000000ff) ^\n\t\trk[0];\n\tPUTU32(out     , s0);\n\ts1 =\n\t\t(Te2[(t1 >> 24)       ] & 0xff000000) ^\n\t\t(Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te0[(t3 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te1[(t0      ) & 0xff] & 0x000000ff) ^\n\t\trk[1];\n\tPUTU32(out +  4, s1);\n\ts2 =\n\t\t(Te2[(t2 >> 24)       ] & 0xff000000) ^\n\t\t(Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te0[(t0 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te1[(t1      ) & 0xff] & 0x000000ff) ^\n\t\trk[2];\n\tPUTU32(out +  8, s2);\n\ts3 =\n\t\t(Te2[(t3 >> 24)       ] & 0xff000000) ^\n\t\t(Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te0[(t1 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te1[(t2      ) & 0xff] & 0x000000ff) ^\n\t\trk[3];\n\tPUTU32(out + 12, s3);\n}\n\n/*\n * Decrypt a single block\n * in and out can overlap\n */\nvoid AES_decrypt(const unsigned char *in, unsigned char *out,\n\t\t const AES_KEY *key) {\n\n\tconst u32 *rk;\n\tu32 s0, s1, s2, s3, t0, t1, t2, t3;\n#ifndef FULL_UNROLL\n\tint r;\n#endif /* ?FULL_UNROLL */\n\n\tassert(in && out && key);\n\trk = key->rd_key;\n\n\t/*\n\t * map byte array block to cipher state\n\t * and add initial round key:\n\t */\n    s0 = GETU32(in     ) ^ rk[0];\n    s1 = GETU32(in +  4) ^ rk[1];\n    s2 = GETU32(in +  8) ^ rk[2];\n    s3 = GETU32(in + 12) ^ rk[3];\n#ifdef FULL_UNROLL\n    /* round 1: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];\n    /* round 2: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];\n    /* round 3: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];\n    /* round 4: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];\n    /* round 5: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];\n    /* round 6: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];\n    /* round 7: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];\n    /* round 8: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];\n    /* round 9: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];\n    if (key->rounds > 10) {\n        /* round 10: */\n        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];\n        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];\n        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];\n        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];\n        /* round 11: */\n        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];\n        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];\n        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];\n        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];\n        if (key->rounds > 12) {\n            /* round 12: */\n            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];\n            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];\n            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];\n            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];\n            /* round 13: */\n            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];\n            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];\n            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];\n            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];\n        }\n    }\n\trk += key->rounds << 2;\n#else  /* !FULL_UNROLL */\n    /*\n     * Nr - 1 full rounds:\n     */\n    r = key->rounds >> 1;\n    for (;;) {\n        t0 =\n            Td0[(s0 >> 24)       ] ^\n            Td1[(s3 >> 16) & 0xff] ^\n            Td2[(s2 >>  8) & 0xff] ^\n            Td3[(s1      ) & 0xff] ^\n            rk[4];\n        t1 =\n            Td0[(s1 >> 24)       ] ^\n            Td1[(s0 >> 16) & 0xff] ^\n            Td2[(s3 >>  8) & 0xff] ^\n            Td3[(s2      ) & 0xff] ^\n            rk[5];\n        t2 =\n            Td0[(s2 >> 24)       ] ^\n            Td1[(s1 >> 16) & 0xff] ^\n            Td2[(s0 >>  8) & 0xff] ^\n            Td3[(s3      ) & 0xff] ^\n            rk[6];\n        t3 =\n            Td0[(s3 >> 24)       ] ^\n            Td1[(s2 >> 16) & 0xff] ^\n            Td2[(s1 >>  8) & 0xff] ^\n            Td3[(s0      ) & 0xff] ^\n            rk[7];\n\n        rk += 8;\n        if (--r == 0) {\n            break;\n        }\n\n        s0 =\n            Td0[(t0 >> 24)       ] ^\n            Td1[(t3 >> 16) & 0xff] ^\n            Td2[(t2 >>  8) & 0xff] ^\n            Td3[(t1      ) & 0xff] ^\n            rk[0];\n        s1 =\n            Td0[(t1 >> 24)       ] ^\n            Td1[(t0 >> 16) & 0xff] ^\n            Td2[(t3 >>  8) & 0xff] ^\n            Td3[(t2      ) & 0xff] ^\n            rk[1];\n        s2 =\n            Td0[(t2 >> 24)       ] ^\n            Td1[(t1 >> 16) & 0xff] ^\n            Td2[(t0 >>  8) & 0xff] ^\n            Td3[(t3      ) & 0xff] ^\n            rk[2];\n        s3 =\n            Td0[(t3 >> 24)       ] ^\n            Td1[(t2 >> 16) & 0xff] ^\n            Td2[(t1 >>  8) & 0xff] ^\n            Td3[(t0      ) & 0xff] ^\n            rk[3];\n    }\n#endif /* ?FULL_UNROLL */\n    /*\n\t * apply last round and\n\t * map cipher state to byte array block:\n\t */\n   \ts0 =\n   \t\t(Td4[(t0 >> 24)       ] << 24) ^\n   \t\t(Td4[(t3 >> 16) & 0xff] << 16) ^\n   \t\t(Td4[(t2 >>  8) & 0xff] <<  8) ^\n   \t\t(Td4[(t1      ) & 0xff])       ^\n   \t\trk[0];\n\tPUTU32(out     , s0);\n   \ts1 =\n   \t\t(Td4[(t1 >> 24)       ] << 24) ^\n   \t\t(Td4[(t0 >> 16) & 0xff] << 16) ^\n   \t\t(Td4[(t3 >>  8) & 0xff] <<  8) ^\n   \t\t(Td4[(t2      ) & 0xff])       ^\n   \t\trk[1];\n\tPUTU32(out +  4, s1);\n   \ts2 =\n   \t\t(Td4[(t2 >> 24)       ] << 24) ^\n   \t\t(Td4[(t1 >> 16) & 0xff] << 16) ^\n   \t\t(Td4[(t0 >>  8) & 0xff] <<  8) ^\n   \t\t(Td4[(t3      ) & 0xff])       ^\n   \t\trk[2];\n\tPUTU32(out +  8, s2);\n   \ts3 =\n   \t\t(Td4[(t3 >> 24)       ] << 24) ^\n   \t\t(Td4[(t2 >> 16) & 0xff] << 16) ^\n   \t\t(Td4[(t1 >>  8) & 0xff] <<  8) ^\n   \t\t(Td4[(t0      ) & 0xff])       ^\n   \t\trk[3];\n\tPUTU32(out + 12, s3);\n}\n\n#else /* AES_ASM */\n\nstatic const u8 Te4[256] = {\n    0x63U, 0x7cU, 0x77U, 0x7bU, 0xf2U, 0x6bU, 0x6fU, 0xc5U,\n    0x30U, 0x01U, 0x67U, 0x2bU, 0xfeU, 0xd7U, 0xabU, 0x76U,\n    0xcaU, 0x82U, 0xc9U, 0x7dU, 0xfaU, 0x59U, 0x47U, 0xf0U,\n    0xadU, 0xd4U, 0xa2U, 0xafU, 0x9cU, 0xa4U, 0x72U, 0xc0U,\n    0xb7U, 0xfdU, 0x93U, 0x26U, 0x36U, 0x3fU, 0xf7U, 0xccU,\n    0x34U, 0xa5U, 0xe5U, 0xf1U, 0x71U, 0xd8U, 0x31U, 0x15U,\n    0x04U, 0xc7U, 0x23U, 0xc3U, 0x18U, 0x96U, 0x05U, 0x9aU,\n    0x07U, 0x12U, 0x80U, 0xe2U, 0xebU, 0x27U, 0xb2U, 0x75U,\n    0x09U, 0x83U, 0x2cU, 0x1aU, 0x1bU, 0x6eU, 0x5aU, 0xa0U,\n    0x52U, 0x3bU, 0xd6U, 0xb3U, 0x29U, 0xe3U, 0x2fU, 0x84U,\n    0x53U, 0xd1U, 0x00U, 0xedU, 0x20U, 0xfcU, 0xb1U, 0x5bU,\n    0x6aU, 0xcbU, 0xbeU, 0x39U, 0x4aU, 0x4cU, 0x58U, 0xcfU,\n    0xd0U, 0xefU, 0xaaU, 0xfbU, 0x43U, 0x4dU, 0x33U, 0x85U,\n    0x45U, 0xf9U, 0x02U, 0x7fU, 0x50U, 0x3cU, 0x9fU, 0xa8U,\n    0x51U, 0xa3U, 0x40U, 0x8fU, 0x92U, 0x9dU, 0x38U, 0xf5U,\n    0xbcU, 0xb6U, 0xdaU, 0x21U, 0x10U, 0xffU, 0xf3U, 0xd2U,\n    0xcdU, 0x0cU, 0x13U, 0xecU, 0x5fU, 0x97U, 0x44U, 0x17U,\n    0xc4U, 0xa7U, 0x7eU, 0x3dU, 0x64U, 0x5dU, 0x19U, 0x73U,\n    0x60U, 0x81U, 0x4fU, 0xdcU, 0x22U, 0x2aU, 0x90U, 0x88U,\n    0x46U, 0xeeU, 0xb8U, 0x14U, 0xdeU, 0x5eU, 0x0bU, 0xdbU,\n    0xe0U, 0x32U, 0x3aU, 0x0aU, 0x49U, 0x06U, 0x24U, 0x5cU,\n    0xc2U, 0xd3U, 0xacU, 0x62U, 0x91U, 0x95U, 0xe4U, 0x79U,\n    0xe7U, 0xc8U, 0x37U, 0x6dU, 0x8dU, 0xd5U, 0x4eU, 0xa9U,\n    0x6cU, 0x56U, 0xf4U, 0xeaU, 0x65U, 0x7aU, 0xaeU, 0x08U,\n    0xbaU, 0x78U, 0x25U, 0x2eU, 0x1cU, 0xa6U, 0xb4U, 0xc6U,\n    0xe8U, 0xddU, 0x74U, 0x1fU, 0x4bU, 0xbdU, 0x8bU, 0x8aU,\n    0x70U, 0x3eU, 0xb5U, 0x66U, 0x48U, 0x03U, 0xf6U, 0x0eU,\n    0x61U, 0x35U, 0x57U, 0xb9U, 0x86U, 0xc1U, 0x1dU, 0x9eU,\n    0xe1U, 0xf8U, 0x98U, 0x11U, 0x69U, 0xd9U, 0x8eU, 0x94U,\n    0x9bU, 0x1eU, 0x87U, 0xe9U, 0xceU, 0x55U, 0x28U, 0xdfU,\n    0x8cU, 0xa1U, 0x89U, 0x0dU, 0xbfU, 0xe6U, 0x42U, 0x68U,\n    0x41U, 0x99U, 0x2dU, 0x0fU, 0xb0U, 0x54U, 0xbbU, 0x16U\n};\nstatic const u32 rcon[] = {\n\t0x01000000, 0x02000000, 0x04000000, 0x08000000,\n\t0x10000000, 0x20000000, 0x40000000, 0x80000000,\n\t0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */\n};\n\n/**\n * Expand the cipher key into the encryption key schedule.\n */\nint private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,\n\t\t\tAES_KEY *key) {\n\tu32 *rk;\n   \tint i = 0;\n\tu32 temp;\n\n\tif (!userKey || !key)\n\t\treturn -1;\n\tif (bits != 128 && bits != 192 && bits != 256)\n\t\treturn -2;\n\n\trk = key->rd_key;\n\n\tif (bits==128)\n\t\tkey->rounds = 10;\n\telse if (bits==192)\n\t\tkey->rounds = 12;\n\telse\n\t\tkey->rounds = 14;\n\n\trk[0] = GETU32(userKey     );\n\trk[1] = GETU32(userKey +  4);\n\trk[2] = GETU32(userKey +  8);\n\trk[3] = GETU32(userKey + 12);\n\tif (bits == 128) {\n\t\twhile (1) {\n\t\t\ttemp  = rk[3];\n\t\t\trk[4] = rk[0] ^\n\t\t\t\t(Te4[(temp >> 16) & 0xff] << 24) ^\n\t\t\t\t(Te4[(temp >>  8) & 0xff] << 16) ^\n\t\t\t\t(Te4[(temp      ) & 0xff] << 8) ^\n\t\t\t\t(Te4[(temp >> 24)       ]) ^\n\t\t\t\trcon[i];\n\t\t\trk[5] = rk[1] ^ rk[4];\n\t\t\trk[6] = rk[2] ^ rk[5];\n\t\t\trk[7] = rk[3] ^ rk[6];\n\t\t\tif (++i == 10) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\trk += 4;\n\t\t}\n\t}\n\trk[4] = GETU32(userKey + 16);\n\trk[5] = GETU32(userKey + 20);\n\tif (bits == 192) {\n\t\twhile (1) {\n\t\t\ttemp = rk[ 5];\n\t\t\trk[ 6] = rk[ 0] ^\n\t\t\t\t(Te4[(temp >> 16) & 0xff] << 24) ^\n\t\t\t\t(Te4[(temp >>  8) & 0xff] << 16) ^\n\t\t\t\t(Te4[(temp      ) & 0xff] << 8) ^\n\t\t\t\t(Te4[(temp >> 24)       ]) ^\n\t\t\t\trcon[i];\n\t\t\trk[ 7] = rk[ 1] ^ rk[ 6];\n\t\t\trk[ 8] = rk[ 2] ^ rk[ 7];\n\t\t\trk[ 9] = rk[ 3] ^ rk[ 8];\n\t\t\tif (++i == 8) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\trk[10] = rk[ 4] ^ rk[ 9];\n\t\t\trk[11] = rk[ 5] ^ rk[10];\n\t\t\trk += 6;\n\t\t}\n\t}\n\trk[6] = GETU32(userKey + 24);\n\trk[7] = GETU32(userKey + 28);\n\tif (bits == 256) {\n\t\twhile (1) {\n\t\t\ttemp = rk[ 7];\n\t\t\trk[ 8] = rk[ 0] ^\n\t\t\t\t(Te4[(temp >> 16) & 0xff] << 24) ^\n\t\t\t\t(Te4[(temp >>  8) & 0xff] << 16) ^\n\t\t\t\t(Te4[(temp      ) & 0xff] << 8) ^\n\t\t\t\t(Te4[(temp >> 24)       ]) ^\n\t\t\t\trcon[i];\n\t\t\trk[ 9] = rk[ 1] ^ rk[ 8];\n\t\t\trk[10] = rk[ 2] ^ rk[ 9];\n\t\t\trk[11] = rk[ 3] ^ rk[10];\n\t\t\tif (++i == 7) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\ttemp = rk[11];\n\t\t\trk[12] = rk[ 4] ^\n\t\t\t\t(Te4[(temp >> 24)       ] << 24) ^\n\t\t\t\t(Te4[(temp >> 16) & 0xff] << 16) ^\n\t\t\t\t(Te4[(temp >>  8) & 0xff] << 8) ^\n\t\t\t\t(Te4[(temp      ) & 0xff]);\n\t\t\trk[13] = rk[ 5] ^ rk[12];\n\t\t\trk[14] = rk[ 6] ^ rk[13];\n\t\t\trk[15] = rk[ 7] ^ rk[14];\n\n\t\t\trk += 8;\n        \t}\n\t}\n\treturn 0;\n}\n\n/**\n * Expand the cipher key into the decryption key schedule.\n */\nint private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,\n\t\t\t AES_KEY *key) {\n\n        u32 *rk;\n\tint i, j, status;\n\tu32 temp;\n\n\t/* first, start with an encryption schedule */\n\tstatus = private_AES_set_encrypt_key(userKey, bits, key);\n\tif (status < 0)\n\t\treturn status;\n\n\trk = key->rd_key;\n\n\t/* invert the order of the round keys: */\n\tfor (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {\n\t\ttemp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;\n\t\ttemp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;\n\t\ttemp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;\n\t\ttemp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;\n\t}\n\t/* apply the inverse MixColumn transform to all round keys but the first and the last: */\n\tfor (i = 1; i < (key->rounds); i++) {\n\t\trk += 4;\n\t\tfor (j = 0; j < 4; j++) {\n\t\t\tu32 tp1, tp2, tp4, tp8, tp9, tpb, tpd, tpe, m;\n\n\t\t\ttp1 = rk[j];\n\t\t\tm = tp1 & 0x80808080;\n\t\t\ttp2 = ((tp1 & 0x7f7f7f7f) << 1) ^\n\t\t\t\t((m - (m >> 7)) & 0x1b1b1b1b);\n\t\t\tm = tp2 & 0x80808080;\n\t\t\ttp4 = ((tp2 & 0x7f7f7f7f) << 1) ^\n\t\t\t\t((m - (m >> 7)) & 0x1b1b1b1b);\n\t\t\tm = tp4 & 0x80808080;\n\t\t\ttp8 = ((tp4 & 0x7f7f7f7f) << 1) ^\n\t\t\t\t((m - (m >> 7)) & 0x1b1b1b1b);\n\t\t\ttp9 = tp8 ^ tp1;\n\t\t\ttpb = tp9 ^ tp2;\n\t\t\ttpd = tp9 ^ tp4;\n\t\t\ttpe = tp8 ^ tp4 ^ tp2;\n#if defined(ROTATE)\n\t\t\trk[j] = tpe ^ ROTATE(tpd,16) ^\n\t\t\t\tROTATE(tp9,24) ^ ROTATE(tpb,8);\n#else\n\t\t\trk[j] = tpe ^ (tpd >> 16) ^ (tpd << 16) ^ \n\t\t\t\t(tp9 >> 8) ^ (tp9 << 24) ^\n\t\t\t\t(tpb >> 24) ^ (tpb << 8);\n#endif\n\t\t}\n\t}\n\treturn 0;\n}\n\n#endif /* AES_ASM */\n"
  },
  {
    "path": "app/nacl/aes_ige.c",
    "content": "/* crypto/aes/aes_ige.c -*- mode:C; c-file-style: \"eay\" -*- */\n/* ====================================================================\n * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer. \n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"\n *\n * 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    openssl-core@openssl.org.\n *\n * 5. Products derived from this software may not be called \"OpenSSL\"\n *    nor may \"OpenSSL\" appear in their names without prior written\n *    permission of the OpenSSL Project.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit (http://www.openssl.org/)\"\n *\n * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR\n * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n * ====================================================================\n *\n */\n\n//#include \"cryptlib.h\"\n\n#include \"aes.h\"\n#include \"aes_locl.h\"\n#include <assert.h>\n#define OPENSSL_assert assert\n\n#define N_WORDS (AES_BLOCK_SIZE / sizeof(unsigned long))\ntypedef struct {\n        unsigned long data[N_WORDS];\n} aes_block_t;\n\n/* XXX: probably some better way to do this */\n#if defined(__i386__) || defined(__x86_64__)\n#define UNALIGNED_MEMOPS_ARE_FAST 1\n#else\n#define UNALIGNED_MEMOPS_ARE_FAST 0\n#endif\n\n#if UNALIGNED_MEMOPS_ARE_FAST\n#define load_block(d, s)        (d) = *(const aes_block_t *)(s)\n#define store_block(d, s)       *(aes_block_t *)(d) = (s)\n#else\n#define load_block(d, s)        memcpy((d).data, (s), AES_BLOCK_SIZE)\n#define store_block(d, s)       memcpy((d), (s).data, AES_BLOCK_SIZE)\n#endif\n\n/* N.B. The IV for this mode is _twice_ the block size */\n\nvoid AES_ige_encrypt(const unsigned char *in, unsigned char *out,\n\t\t\t\t\t size_t length, const AES_KEY *key,\n\t\t\t\t\t unsigned char *ivec, const int enc)\n\t{\n\tsize_t n;\n\tsize_t len = length;\n\n\tOPENSSL_assert(in && out && key && ivec);\n\tOPENSSL_assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));\n\tOPENSSL_assert((length%AES_BLOCK_SIZE) == 0);\n\n\tlen = length / AES_BLOCK_SIZE;\n\n\tif (AES_ENCRYPT == enc)\n\t\t{\n\t\tif (in != out &&\n\t\t    (UNALIGNED_MEMOPS_ARE_FAST || ((size_t)in|(size_t)out|(size_t)ivec)%sizeof(long)==0))\n\t\t\t{\n\t\t\taes_block_t *ivp = (aes_block_t *)ivec;\n\t\t\taes_block_t *iv2p = (aes_block_t *)(ivec + AES_BLOCK_SIZE);\n\n\t\t\twhile (len)\n\t\t\t\t{\n\t\t\t\taes_block_t *inp = (aes_block_t *)in;\n\t\t\t\taes_block_t *outp = (aes_block_t *)out;\n\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\toutp->data[n] = inp->data[n] ^ ivp->data[n];\n\t\t\t\tAES_encrypt((unsigned char *)outp->data, (unsigned char *)outp->data, key);\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\toutp->data[n] ^= iv2p->data[n];\n\t\t\t\tivp = outp;\n\t\t\t\tiv2p = inp;\n\t\t\t\t--len;\n\t\t\t\tin += AES_BLOCK_SIZE;\n\t\t\t\tout += AES_BLOCK_SIZE;\n\t\t\t\t}\n\t\t\tmemcpy(ivec, ivp->data, AES_BLOCK_SIZE);\n\t\t\tmemcpy(ivec + AES_BLOCK_SIZE, iv2p->data, AES_BLOCK_SIZE);\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\taes_block_t tmp, tmp2;\n\t\t\taes_block_t iv;\n\t\t\taes_block_t iv2;\n\n\t\t\tload_block(iv, ivec);\n\t\t\tload_block(iv2, ivec + AES_BLOCK_SIZE);\n\n\t\t\twhile (len)\n\t\t\t\t{\n\t\t\t\tload_block(tmp, in);\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\ttmp2.data[n] = tmp.data[n] ^ iv.data[n];\n\t\t\t\tAES_encrypt((unsigned char *)tmp2.data, (unsigned char *)tmp2.data, key);\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\ttmp2.data[n] ^= iv2.data[n];\n\t\t\t\tstore_block(out, tmp2);\n\t\t\t\tiv = tmp2;\n\t\t\t\tiv2 = tmp;\n\t\t\t\t--len;\n\t\t\t\tin += AES_BLOCK_SIZE;\n\t\t\t\tout += AES_BLOCK_SIZE;\n\t\t\t\t}\n\t\t\tmemcpy(ivec, iv.data, AES_BLOCK_SIZE);\n\t\t\tmemcpy(ivec + AES_BLOCK_SIZE, iv2.data, AES_BLOCK_SIZE);\n\t\t\t}\n\t\t}\n\telse\n\t\t{\n\t\tif (in != out &&\n\t\t    (UNALIGNED_MEMOPS_ARE_FAST || ((size_t)in|(size_t)out|(size_t)ivec)%sizeof(long)==0))\n\t\t\t{\n\t\t\taes_block_t *ivp = (aes_block_t *)ivec;\n\t\t\taes_block_t *iv2p = (aes_block_t *)(ivec + AES_BLOCK_SIZE);\n\n\t\t\twhile (len)\n\t\t\t\t{\n\t\t\t\taes_block_t tmp;\n\t\t\t\taes_block_t *inp = (aes_block_t *)in;\n\t\t\t\taes_block_t *outp = (aes_block_t *)out;\n\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\ttmp.data[n] = inp->data[n] ^ iv2p->data[n];\n\t\t\t\tAES_decrypt((unsigned char *)tmp.data, (unsigned char *)outp->data, key);\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\toutp->data[n] ^= ivp->data[n];\n\t\t\t\tivp = inp;\n\t\t\t\tiv2p = outp;\n\t\t\t\t--len;\n\t\t\t\tin += AES_BLOCK_SIZE;\n\t\t\t\tout += AES_BLOCK_SIZE;\n\t\t\t\t}\n\t\t\tmemcpy(ivec, ivp->data, AES_BLOCK_SIZE);\n\t\t\tmemcpy(ivec + AES_BLOCK_SIZE, iv2p->data, AES_BLOCK_SIZE);\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\taes_block_t tmp, tmp2;\n\t\t\taes_block_t iv;\n\t\t\taes_block_t iv2;\n\n\t\t\tload_block(iv, ivec);\n\t\t\tload_block(iv2, ivec + AES_BLOCK_SIZE);\n\n\t\t\twhile (len)\n\t\t\t\t{\n\t\t\t\tload_block(tmp, in);\n\t\t\t\ttmp2 = tmp;\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\ttmp.data[n] ^= iv2.data[n];\n\t\t\t\tAES_decrypt((unsigned char *)tmp.data, (unsigned char *)tmp.data, key);\n\t\t\t\tfor(n=0 ; n < N_WORDS; ++n)\n\t\t\t\t\ttmp.data[n] ^= iv.data[n];\n\t\t\t\tstore_block(out, tmp);\n\t\t\t\tiv = tmp2;\n\t\t\t\tiv2 = tmp;\n\t\t\t\t--len;\n\t\t\t\tin += AES_BLOCK_SIZE;\n\t\t\t\tout += AES_BLOCK_SIZE;\n\t\t\t\t}\n\t\t\tmemcpy(ivec, iv.data, AES_BLOCK_SIZE);\n\t\t\tmemcpy(ivec + AES_BLOCK_SIZE, iv2.data, AES_BLOCK_SIZE);\n\t\t\t}\n\t\t}\n\t}\n\n/*\n * Note that its effectively impossible to do biIGE in anything other\n * than a single pass, so no provision is made for chaining.\n */\n\n/* N.B. The IV for this mode is _four times_ the block size */\n\nvoid AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,\n\t\t\t\t\t\tsize_t length, const AES_KEY *key,\n\t\t\t\t\t\tconst AES_KEY *key2, const unsigned char *ivec,\n\t\t\t\t\t\tconst int enc)\n\t{\n\tsize_t n;\n\tsize_t len = length;\n\tunsigned char tmp[AES_BLOCK_SIZE];\n\tunsigned char tmp2[AES_BLOCK_SIZE];\n\tunsigned char tmp3[AES_BLOCK_SIZE];\n\tunsigned char prev[AES_BLOCK_SIZE];\n\tconst unsigned char *iv;\n\tconst unsigned char *iv2;\n\n\tOPENSSL_assert(in && out && key && ivec);\n\tOPENSSL_assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));\n\tOPENSSL_assert((length%AES_BLOCK_SIZE) == 0);\n\n\tif (AES_ENCRYPT == enc)\n\t\t{\n\t\t/* XXX: Do a separate case for when in != out (strictly should\n\t\t   check for overlap, too) */\n\n\t\t/* First the forward pass */ \n\t\tiv = ivec;\n\t\tiv2 = ivec + AES_BLOCK_SIZE;\n\t\twhile (len >= AES_BLOCK_SIZE)\n\t\t\t{\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\tout[n] = in[n] ^ iv[n];\n\t\t\tAES_encrypt(out, out, key);\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\tout[n] ^= iv2[n];\n\t\t\tiv = out;\n\t\t\tmemcpy(prev, in, AES_BLOCK_SIZE);\n\t\t\tiv2 = prev;\n\t\t\tlen -= AES_BLOCK_SIZE;\n\t\t\tin += AES_BLOCK_SIZE;\n\t\t\tout += AES_BLOCK_SIZE;\n\t\t\t}\n\n\t\t/* And now backwards */\n\t\tiv = ivec + AES_BLOCK_SIZE*2;\n\t\tiv2 = ivec + AES_BLOCK_SIZE*3;\n\t\tlen = length;\n\t\twhile(len >= AES_BLOCK_SIZE)\n\t\t\t{\n\t\t\tout -= AES_BLOCK_SIZE;\n\t\t\t/* XXX: reduce copies by alternating between buffers */\n\t\t\tmemcpy(tmp, out, AES_BLOCK_SIZE);\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\tout[n] ^= iv[n];\n\t\t\t/*\t\t\thexdump(stdout, \"out ^ iv\", out, AES_BLOCK_SIZE); */\n\t\t\tAES_encrypt(out, out, key);\n\t\t\t/*\t\t\thexdump(stdout,\"enc\", out, AES_BLOCK_SIZE); */\n\t\t\t/*\t\t\thexdump(stdout,\"iv2\", iv2, AES_BLOCK_SIZE); */\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\tout[n] ^= iv2[n];\n\t\t\t/*\t\t\thexdump(stdout,\"out\", out, AES_BLOCK_SIZE); */\n\t\t\tiv = out;\n\t\t\tmemcpy(prev, tmp, AES_BLOCK_SIZE);\n\t\t\tiv2 = prev;\n\t\t\tlen -= AES_BLOCK_SIZE;\n\t\t\t}\n\t\t}\n\telse\n\t\t{\n\t\t/* First backwards */\n\t\tiv = ivec + AES_BLOCK_SIZE*2;\n\t\tiv2 = ivec + AES_BLOCK_SIZE*3;\n\t\tin += length;\n\t\tout += length;\n\t\twhile (len >= AES_BLOCK_SIZE)\n\t\t\t{\n\t\t\tin -= AES_BLOCK_SIZE;\n\t\t\tout -= AES_BLOCK_SIZE;\n\t\t\tmemcpy(tmp, in, AES_BLOCK_SIZE);\n\t\t\tmemcpy(tmp2, in, AES_BLOCK_SIZE);\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\ttmp[n] ^= iv2[n];\n\t\t\tAES_decrypt(tmp, out, key);\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\tout[n] ^= iv[n];\n\t\t\tmemcpy(tmp3, tmp2, AES_BLOCK_SIZE);\n\t\t\tiv = tmp3;\n\t\t\tiv2 = out;\n\t\t\tlen -= AES_BLOCK_SIZE;\n\t\t\t}\n\n\t\t/* And now forwards */\n\t\tiv = ivec;\n\t\tiv2 = ivec + AES_BLOCK_SIZE;\n\t\tlen = length;\n\t\twhile (len >= AES_BLOCK_SIZE)\n\t\t\t{\n\t\t\tmemcpy(tmp, out, AES_BLOCK_SIZE);\n\t\t\tmemcpy(tmp2, out, AES_BLOCK_SIZE);\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\ttmp[n] ^= iv2[n];\n\t\t\tAES_decrypt(tmp, out, key);\n\t\t\tfor(n=0 ; n < AES_BLOCK_SIZE ; ++n)\n\t\t\t\tout[n] ^= iv[n];\n\t\t\tmemcpy(tmp3, tmp2, AES_BLOCK_SIZE);\n\t\t\tiv = tmp3;\n\t\t\tiv2 = out;\n\t\t\tlen -= AES_BLOCK_SIZE;\n\t\t\tin += AES_BLOCK_SIZE;\n\t\t\tout += AES_BLOCK_SIZE;\n\t\t\t}\n\t\t}\n\t}\n"
  },
  {
    "path": "app/nacl/aes_locl.h",
    "content": "/* crypto/aes/aes.h -*- mode:C; c-file-style: \"eay\" -*- */\n/* ====================================================================\n * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer. \n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"\n *\n * 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    openssl-core@openssl.org.\n *\n * 5. Products derived from this software may not be called \"OpenSSL\"\n *    nor may \"OpenSSL\" appear in their names without prior written\n *    permission of the OpenSSL Project.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit (http://www.openssl.org/)\"\n *\n * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR\n * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n * ====================================================================\n *\n */\n\n#ifndef HEADER_AES_LOCL_H\n#define HEADER_AES_LOCL_H\n\n//#include <openssl/e_os2.h>\n\n#ifdef OPENSSL_NO_AES\n#error AES is disabled.\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))\n# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)\n# define GETU32(p) SWAP(*((u32 *)(p)))\n# define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); }\n#else\n# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))\n# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }\n#endif\n\n#ifdef AES_LONG\ntypedef unsigned long u32;\n#else\ntypedef unsigned int u32;\n#endif\ntypedef unsigned short u16;\ntypedef unsigned char u8;\n\n#define MAXKC   (256/32)\n#define MAXKB   (256/8)\n#define MAXNR   14\n\n/* This controls loop-unrolling in aes_core.c */\n#undef FULL_UNROLL\n\n#endif /* !HEADER_AES_LOCL_H */\n"
  },
  {
    "path": "app/nacl/aes_misc.c",
    "content": "/* crypto/aes/aes_misc.c -*- mode:C; c-file-style: \"eay\" -*- */\n/* ====================================================================\n * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer. \n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"\n *\n * 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    openssl-core@openssl.org.\n *\n * 5. Products derived from this software may not be called \"OpenSSL\"\n *    nor may \"OpenSSL\" appear in their names without prior written\n *    permission of the OpenSSL Project.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by the OpenSSL Project\n *    for use in the OpenSSL Toolkit (http://www.openssl.org/)\"\n *\n * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR\n * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n * ====================================================================\n *\n */\n\n//#include <openssl/opensslv.h>\n//#include <openssl/crypto.h>\n#include \"aes.h\"\n#include \"aes_locl.h\"\n\nconst char AES_version[]=\"AES\" ;//OPENSSL_VERSION_PTEXT;\n\nconst char *AES_options(void) {\n#ifdef FULL_UNROLL\n        return \"aes(full)\";\n#else   \n        return \"aes(partial)\";\n#endif\n}\n\n/* FIPS wrapper functions to block low level AES calls in FIPS mode */\n\nint AES_set_encrypt_key(const unsigned char *userKey, const int bits,\n\t\t\tAES_KEY *key)\n\t{\n#ifdef OPENSSL_FIPS\n\tfips_cipher_abort(AES);\n#endif\n\treturn private_AES_set_encrypt_key(userKey, bits, key);\n\t}\n\nint AES_set_decrypt_key(const unsigned char *userKey, const int bits,\n\t\t\tAES_KEY *key)\n\t{\n#ifdef OPENSSL_FIPS\n\tfips_cipher_abort(AES);\n#endif\n\treturn private_AES_set_decrypt_key(userKey, bits, key);\n\t}\n"
  },
  {
    "path": "app/nacl/mtproto_crypto.cc",
    "content": "// Copyright (c) 2013 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @file hello_tutorial.cc\n/// This example demonstrates loading, running and scripting a very simple NaCl\n/// module.  To load the NaCl module, the browser first looks for the\n/// CreateModule() factory method (at the end of this file).  It calls\n/// CreateModule() once to load the module code.  After the code is loaded,\n/// CreateModule() is not called again.\n///\n/// Once the code is loaded, the browser calls the CreateInstance()\n/// method on the object returned by CreateModule().  It calls CreateInstance()\n/// each time it encounters an <embed> tag that references your NaCl module.\n///\n/// The browser can talk to your NaCl module via the postMessage() Javascript\n/// function.  When you call postMessage() on your NaCl module from the browser,\n/// this becomes a call to the HandleMessage() method of your pp::Instance\n/// subclass.  You can send messages back to the browser by calling the\n/// PostMessage() method on your pp::Instance.  Note that these two methods\n/// (postMessage() in Javascript and PostMessage() in C++) are asynchronous.\n/// This means they return immediately - there is no waiting for the message\n/// to be handled.  This has implications in your program design, particularly\n/// when mutating property values that are exposed to both the browser and the\n/// NaCl module.\n\n#include \"ppapi/cpp/instance.h\"\n#include \"ppapi/cpp/module.h\"\n#include \"ppapi/cpp/var.h\"\n#include \"ppapi/cpp/var_dictionary.h\"\n#include \"ppapi/cpp/var_array_buffer.h\"\n#include \"aes.h\"\n#include <inttypes.h>\n#include <stdio.h>\n\n\nuint64_t gcd(uint64_t a, uint64_t b) {\n  while (a != 0 && b != 0) {\n    while ((b & 1) == 0) {\n      b >>= 1;\n    }\n    while ((a & 1) == 0) {\n      a >>= 1;\n    }\n    if (a > b) {\n      a -= b;\n    } else {\n      b -= a;\n    }\n  }\n  return b == 0 ? a : b;\n}\n\n/// The Instance class.  One of these exists for each instance of your NaCl\n/// module on the web page.  The browser will ask the Module object to create\n/// a new Instance for each occurrence of the <embed> tag that has these\n/// attributes:\n///     src=\"hello_tutorial.nmf\"\n///     type=\"application/x-pnacl\"\n/// To communicate with the browser, you must override HandleMessage() to\n/// receive messages from the browser, and use PostMessage() to send messages\n/// back to the browser.  Note that this interface is asynchronous.\nclass MtprotoCryptoInstance : public pp::Instance {\n public:\n  /// The constructor creates the plugin-side instance.\n  /// @param[in] instance the handle to the browser-side plugin instance.\n  explicit MtprotoCryptoInstance(PP_Instance instance) : pp::Instance(instance)\n  {}\n\n  virtual ~MtprotoCryptoInstance() {}\n\n  /// Handler for messages coming in from the browser via postMessage().  The\n  /// @a var_message can contain be any pp:Var type; for example int, string\n  /// Array or Dictinary. Please see the pp:Var documentation for more details.\n  /// @param[in] var_message The message posted by the browser.\n  virtual void HandleMessage(const pp::Var& var_message) {\n\n    if (!var_message.is_dictionary()) {\n      return;\n    }\n\n    pp::VarDictionary request = pp::VarDictionary::VarDictionary(var_message);\n\n    pp::Var varTaskID = request.Get(pp::Var::Var(\"taskID\"));\n    pp::Var varTask = request.Get(pp::Var::Var(\"task\"));\n    if (!varTaskID.is_int()) {\n      return;\n    }\n\n    int32_t intTaskID = varTaskID.AsInt();\n    std::string strTask = varTask.AsString();\n    pp::Var varResult;\n\n    if (strTask == \"aes-encrypt\") {\n      pp::Var varData = request.Get(pp::Var::Var(\"bytes\"));\n      pp::Var varKey = request.Get(pp::Var::Var(\"keyBytes\"));\n      pp::Var varIv = request.Get(pp::Var::Var(\"ivBytes\"));\n\n      if (!varData.is_array_buffer() || !varKey.is_array_buffer() || !varIv.is_array_buffer()) {\n        return;\n      }\n\n      pp::VarArrayBuffer abData = pp::VarArrayBuffer::VarArrayBuffer(varData);\n      pp::VarArrayBuffer abKey = pp::VarArrayBuffer::VarArrayBuffer(varKey);\n      pp::VarArrayBuffer abIv = pp::VarArrayBuffer::VarArrayBuffer(varIv);\n\n      char* what = static_cast<char*>(abData.Map());\n      char* keyBuff = static_cast<char*>(abKey.Map());\n      char* ivBuff = static_cast<char*>(abIv.Map());\n      int length = abData.ByteLength();\n\n      AES_KEY akey;\n      AES_set_encrypt_key((const unsigned char *) keyBuff, 32 * 8, &akey);\n      AES_ige_encrypt((const unsigned char *)what, (unsigned char *)what, length, &akey, (unsigned char *)ivBuff, AES_ENCRYPT);\n\n      varResult = abData;\n\n    }\n    else if (strTask == \"aes-decrypt\") {\n      pp::Var varData = request.Get(pp::Var::Var(\"encryptedBytes\"));\n      pp::Var varKey = request.Get(pp::Var::Var(\"keyBytes\"));\n      pp::Var varIv = request.Get(pp::Var::Var(\"ivBytes\"));\n\n      if (!varData.is_array_buffer() || !varKey.is_array_buffer() || !varIv.is_array_buffer()) {\n        return;\n      }\n\n      pp::VarArrayBuffer abData = pp::VarArrayBuffer::VarArrayBuffer(varData);\n      pp::VarArrayBuffer abKey = pp::VarArrayBuffer::VarArrayBuffer(varKey);\n      pp::VarArrayBuffer abIv = pp::VarArrayBuffer::VarArrayBuffer(varIv);\n\n      char* what = static_cast<char*>(abData.Map());\n      char* keyBuff = static_cast<char*>(abKey.Map());\n      char* ivBuff = static_cast<char*>(abIv.Map());\n      int length = abData.ByteLength();\n\n      AES_KEY akey;\n      AES_set_decrypt_key((const unsigned char *) keyBuff, 32 * 8, &akey);\n      AES_ige_encrypt((const unsigned char *)what, (unsigned char *)what, length, &akey, (unsigned char *)ivBuff, AES_DECRYPT);\n\n      varResult = abData;\n\n    }\n    else if (strTask == \"factorize\") {\n\n      pp::Var varBytes = request.Get(pp::Var::Var(\"bytes\"));\n      if (!varBytes.is_array()) {\n        return;\n      }\n\n      pp::VarArray aBytes = pp::VarArray::VarArray(varBytes);\n      int length = aBytes.GetLength();\n      if (length > 8) {\n        return;\n      }\n\n      uint64_t what = 0;\n      for (int i = 0; i < length; i++) {\n        what += (uint64_t) aBytes.Get(length - i - 1).AsInt() << (i * 8);\n      }\n\n      int it = 0, i, j;\n      uint64_t g = 0;\n      for (i = 0; i < 3 || it < 1000; i++) {\n        int q = ((lrand48() & 15) + 17) % what;\n        uint64_t x = (long long)lrand48() % (what - 1) + 1, y = x;\n        int lim = 1 << (i + 18), j;\n        for(j = 1; j < lim; j++) {\n          ++it;\n          uint64_t a = x, b = x, c = q;\n          while (b) {\n            if (b & 1) {\n              c += a;\n              if (c >= what) {\n                c -= what;\n              }\n            }\n            a += a;\n            if (a >= what) {\n              a -= what;\n            }\n            b >>= 1;\n          }\n          x = c;\n          uint64_t z = x < y ? what + x - y : x - y;\n          g = gcd(z, what);\n          if (g != 1) {\n            break;\n          }\n          if (!(j & (j - 1))) {\n            y = x;\n          }\n        }\n        if (g > 1 && g < what) {\n          break;\n        }\n      }\n      uint64_t p = what / g;\n      pp::VarArray pBytesArray = pp::VarArray::VarArray();\n      int index = 0;\n      for (int i = 0; i < 8; i++) {\n        unsigned char byte = p >> ((8 - i - 1) * 8) & 0xFF;\n        if (byte > 0 || index > 0) {\n          pBytesArray.Set(index, pp::Var::Var((int)byte));\n          index++;\n        }\n      }\n\n      index = 0;\n      pp::VarArray gBytesArray = pp::VarArray::VarArray();\n      for (i = 0; i < 8; i++) {\n        unsigned char byte = g >> ((8 - i - 1) * 8) & 0xFF;\n        if (byte > 0 || index > 0) {\n          gBytesArray.Set(index, pp::Var::Var((int)byte));\n          index++;\n        }\n      }\n\n      pp::VarArray varResultArray = pp::VarArray::VarArray();\n      if (p < g) {\n        varResultArray.Set(0, pBytesArray);\n        varResultArray.Set(1, gBytesArray);\n      } else {\n        varResultArray.Set(1, pBytesArray);\n        varResultArray.Set(0, gBytesArray);\n      }\n\n      varResult = varResultArray;\n    }\n    else {\n      varResult = pp::Var::Var();\n    }\n\n    pp::VarDictionary response = pp::VarDictionary::VarDictionary();\n    response.Set(pp::Var::Var(\"taskID\"), varTaskID);\n    response.Set(pp::Var::Var(\"result\"), varResult);\n\n    PostMessage(response);\n  }\n};\n\n/// The Module class.  The browser calls the CreateInstance() method to create\n/// an instance of your NaCl module on the web page.  The browser creates a new\n/// instance for each <embed> tag with type=\"application/x-pnacl\".\nclass MtprotoCryptoModule : public pp::Module {\n public:\n  MtprotoCryptoModule() : pp::Module() {}\n  virtual ~MtprotoCryptoModule() {}\n\n  /// Create and return a MtprotoCryptoInstance object.\n  /// @param[in] instance The browser-side instance.\n  /// @return the plugin-side instance.\n  virtual pp::Instance* CreateInstance(PP_Instance instance) {\n    return new MtprotoCryptoInstance(instance);\n  }\n};\n\nnamespace pp {\n/// Factory function called by the browser when the module is first loaded.\n/// The browser keeps a singleton of this module.  It calls the\n/// CreateInstance() method on the object you return to make instances.  There\n/// is one instance per <embed> tag on the page.  This is the main binding\n/// point for your NaCl module with the browser.\nModule* CreateModule() {\n  return new MtprotoCryptoModule();\n}\n}  // namespace pp\n"
  },
  {
    "path": "app/nacl/mtproto_crypto.nmf",
    "content": "{\n  \"program\": {\n    \"portable\": {\n      \"pnacl-translate\": {\n        \"url\": \"mtproto_crypto.pexe?67\",\n        \"optlevel\": 2\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/partials/desktop/audio_player.html",
    "content": "<div class=\"audio_player_wrap clearfix\">\n\t<a class=\"im_message_file_button\" ng-click=\"togglePlay()\" ng-class=\"{im_message_file_button_dl_audio: audio.downloaded}\">\n\t  <i class=\"im_message_file_button_icon\" ng-class=\"{audio_player_btn_icon_pause: mediaPlayer.player.playing}\"></i>\n\t</a>\n\t<div class=\"audio_player_title_wrap\">\n\t\t<div class=\"audio_player_meta pull-right\" ng-if=\"audio.downloaded &amp;&amp; (mediaPlayer.player.duration || audio.duration)\" ng-switch=\"mediaPlayer.player.playing || mediaPlayer.player.currentTime > 0\">\n\t\t\t<span ng-switch-when=\"true\" class=\"audio_player_duration\" ng-bind=\"mediaPlayer.player.currentTime | durationRemains : duration()\"></span>\n\t\t\t<span ng-switch-default class=\"audio_player_duration\" ng-bind=\"duration() | duration\"></span>\n\t\t</div>\n\t\t<span class=\"copyonly\">[ </span>\n\t\t<a ng-attr-title=\"{{audio.file_name}}\" ng-click=\"download()\" class=\"audio_player_title\" ng-switch=\"::audio.audioTitle.length > 0 ? 2 : (audio.file_name.length > 0 ? 1 : 0)\">\n\t\t\t<span ng-switch-when=\"2\">\n\t\t\t\t<strong ng-bind=\"::audio.audioPerformer\"></strong>\n\t\t\t\t<span ng-bind=\"::(audio.audioPerformer ? '– ' : '') + audio.audioTitle\"></span>\n\t\t\t</span>\n\t\t\t<span ng-switch-when=\"1\" ng-bind=\"::audio.file_name\"></span>\n\t\t\t<span ng-switch-default my-i18n=\"message_attach_audio_message\"></span>\n\t\t</a>\n\t\t<span class=\"copyonly\">]</span>\n\t\t<i ng-if=\"::message.pFlags.media_unread || false\" ng-show=\"message.pFlags.media_unread\" class=\"icon icon-audio-unread\"></i>\n\t\t<div class=\"audio_player_meta\" ng-if=\"!audio.downloaded || !duration()\" ng-switch=\"audio.progress.enabled\">\n\t\t\t<span ng-switch-when=\"true\" class=\"audio_player_size\" ng-bind=\"audio.progress | formatSizeProgress\"></span>\n\t\t\t<span ng-switch-default class=\"audio_player_size\" ng-bind=\"audio.size | formatSize\"></span>\n\t\t</div>\n\t</div>\n\t<div class=\"audio_player_actions noselect\" ng-if=\"!audio.progress.enabled &amp;&amp; !audio.downloaded\">\n    <a class=\"nocopy\" ng-if=\"audio._ == 'document'\" ng-click=\"download()\" my-i18n=\"message_attach_document_download\"></a>\n    <a class=\"nocopy\" ng-click=\"togglePlay()\" my-i18n=\"message_attach_audio_play\"></a>\n\t</div>\n\t<div class=\"audio_player_progress_wrap\" ng-if=\"audio.progress.enabled || audio.downloaded\" ng-switch=\"audio.progress.enabled\">\n\t\t<div ng-switch-when=\"true\" class=\"clearfix im_message_cancelable_progress_wrap\">\n\t\t  <a class=\"im_message_media_progress_cancel pull-right nocopy\" ng-click=\"audio.progress.cancel()\" my-i18n=\"modal_cancel\"></a>\n\t\t  <div class=\"im_message_download_progress_wrap\">\n\t\t    <div class=\"progress tg_down_progress\">\n\t\t      <div class=\"progress-bar progress-bar-success\" ng-style=\"{width: audio.progress.percent + '%'}\"></div>\n\t\t    </div>\n\t\t  </div>\n\t\t</div>\n\t  <div ng-switch-default class=\"im_message_playback_progress_wrap\">\n\t  \t<div class=\"audio_player_seek_slider\" my-slider slider-model=\"mediaPlayer.player.currentTime\" slider-max=\"duration()\" slider-onchange=\"seek(value)\"></div>\n\t  \t<div class=\"audio_player_volume_slider\" my-slider slider-model=\"mediaPlayer.player.volume\" slider-min=\"0\" slider-max=\"1\" slider-onchange=\"setVolume(value)\"></div>\n\t  </div>\n\t</div>\n\t<div class=\"audio_player_media\" ng-if=\"audio.url\" my-ogv-player=\"mediaPlayer.player\" src=\"audio.url\" volume=\"{{::volume}}\"></div>\n</div>"
  },
  {
    "path": "app/partials/desktop/changelog_modal.html",
    "content": "<div class=\"changelog_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$close()\" my-i18n=\"modal_close\"></a>\n      </div>\n      <div class=\"md_modal_title\" my-i18n=\"head_about\"></div>\n    </div>\n\n    <div class=\"peer_modal_profile_wrap clearfix\">\n      <div class=\"peer_modal_photo_wrap pull-left\">\n        <div class=\"peer_modal_photo telegram_modal_logo\"></div>\n      </div>\n      <div class=\"peer_modal_profile\">\n        <div class=\"peer_modal_profile_name\">Telegram Web</div>\n        <div class=\"peer_modal_profile_description\" my-i18n=\"changelog_app_version\">\n          <my-i18n-param name=\"version\" ng-bind=\"currentVersion\"></my-i18n-param>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"md_modal_split_actions_wrap\">\n    <div class=\"md_modal_split_actions\">\n      <a href=\"https://twitter.com/telegram_web\" target=\"_blank\" class=\"md_modal_split_action\">\n        <i class=\"md_modal_split_action_twitter\"></i>\n      </a>\n    </div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"md_modal_sections\">\n\n      <div class=\"md_modal_versioned_section_wrap\">\n        <div class=\"md_modal_section_description changelog_version_changes\" my-i18n=\"changelog_modal_full_description_md\"></div>\n      </div>\n\n    </div>\n\n\n    <div class=\"changelog_footer_wrap clearfix\">\n      <a class=\"changelog_github_link\" href=\"https://github.com/zhukov/webogram\" target=\"_blank\">GitHub</a>\n      <a class=\"changelog_more_link\" href=\"https://github.com/zhukov/webogram/blob/master/CHANGELOG.md\" target=\"_blank\" my-i18n=\"changelog_modal_changelog_link\"></a>\n    </div>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/channel_edit_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateChannel()\">\n\n      <h4 my-i18n=\"channel_edit_modal_title\"></h4>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"channel_edit_name\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"channel.title\" />\n      </div>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"channel_edit_about\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"channel.about\" />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: channel.updating}\" ng-click=\"updateChannel()\" ng-bind=\"channel.updating ? 'channel_edit_submit_active' : 'channel_edit_submit' | i18n\" ng-disabled=\"channel.updating\"></button>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/channel_modal.html",
    "content": "<div class=\"chat_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$close()\" my-i18n=\"modal_close\"></a>\n        <a class=\"md_modal_action\" ng-if=\"hasRights('edit_title')\" ng-click=\"editChannel()\" my-i18n=\"modal_edit\"></a>\n      </div>\n      <div class=\"md_modal_title\" ng-switch=\"isMegagroup\">\n        <span ng-switch-when=\"true\" my-i18n=\"group_modal_info\"></span>\n        <span ng-switch-default my-i18n=\"channel_modal_info\"></span>\n      </div>\n    </div>\n\n    <div class=\"peer_modal_profile_wrap clearfix\">\n      <div class=\"peer_modal_photo_wrap pull-left\" ng-switch=\"photo.updating\">\n        <div ng-switch-when=\"true\" class=\"peer_modal_photo md_photo_loading loading_dots\">\n          <i></i><i></i><i></i>\n        </div>\n        <a ng-switch-default ng-click=\"openPhoto(chatFull.chat_photo.id, {p: -chatFull.chat.id})\" class=\"peer_modal_photo\" my-peer-photolink=\"::-chatFull.chat.id\" img-class=\"peer_modal_photo\" no-open=\"true\" watch=\"true\" ng-class=\"{disabled: !chatFull.chat.photo.photo_small}\" ng-disabled=\"!chatFull.chat.photo.photo_small\"></a>\n      </div>\n      <div class=\"peer_modal_profile\">\n        <div class=\"peer_modal_profile_name\" my-peer-link=\"-chatFull.chat.id\" verified=\"true\"></div>\n        <div class=\"peer_modal_profile_description\" ng-if=\"chatFull.participants_count > 0\" ng-switch=\"isMegagroup\">\n          <ng-pluralize ng-switch-when=\"true\"\n                        count=\"chatFull.participants_count\"\n                        when=\"group_modal_pluralize_participants\">\n          </ng-pluralize>\n          <ng-pluralize ng-switch-default\n                        count=\"chatFull.participants_count\"\n                        when=\"group_modal_pluralize_subscribers\">\n          </ng-pluralize>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"md_modal_split_actions_wrap\">\n    <div class=\"md_modal_split_actions\" ng-switch=\"hasRights('edit_photo')\">\n      <div ng-switch-when=\"true\" class=\"md_modal_split_action\">\n        <input my-file-upload  type=\"file\" multiple=\"false\" class=\"im_attach_input\" size=\"120\" accept=\"image/x-png, image/png, image/gif, image/jpeg\" title=\"{{'group_modal_update_photo' | i18n}}\" />\n        <i class=\"md_modal_split_action_camera\"></i>\n      </div>\n      <a ng-switch-default class=\"md_modal_split_action\" href=\"\" ng-click=\"goToHistory()\" title=\"{{'user_modal_send_message' | i18n}}\">\n        <i class=\"md_modal_split_action_msg\"></i>\n      </a>\n    </div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"md_modal_sections clearfix\">\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_number\" ng-if=\"chatFull.rAbout || chatFull.chat.username || chatFull.chat.pFlags.creator\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_about\"></i>\n\n        <div class=\"md_modal_section_param_wrap\" ng-if=\"chatFull.about.length > 0\">\n          <div class=\"md_modal_section_param_value\">\n            <span ng-bind-html=\"chatFull.rAbout\"></span>\n          </div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"channel_modal_description\"></div>\n        </div>\n\n        <div class=\"md_modal_section_param_wrap\" ng-if=\"chatFull.chat.username\">\n          <div class=\"md_modal_section_param_value\">\n            <a class=\"settings_modal_username_link\" ng-click=\"shareLink($event)\" ng-bind=\"'https://t.me/' + chatFull.chat.username\" ng-href=\"https://t.me/{{chatFull.chat.username}}\" target=\"_blank\"></a>\n          </div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"channel_modal_share_link\"></div>\n        </div>\n\n        <div class=\"md_modal_section_param_wrap\" ng-if=\"!chatFull.chat.username &amp;&amp; chatFull.chat.pFlags.creator\">\n          <div class=\"md_modal_section_param_value\" ng-switch=\"chatFull.exported_invite._\">\n            <a ng-switch-when=\"chatInviteExported\" class=\"settings_modal_username_link\" ng-click=\"shareLink($event)\" ng-bind=\"chatFull.exported_invite.link\" ng-href=\"{{chatFull.exported_invite.link}}\" target=\"_blank\"></a>\n            <span ng-switch-default my-i18n=\"channel_modal_share_loading\">\n              <my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n            </span>\n          </div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"channel_modal_share_link\"></div>\n        </div>\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_link\" ng-if=\"hasRights('invite') || chatFull.chat.pFlags.left\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_person\"></i>\n\n        <div class=\"md_modal_section_link_wrap\" ng-switch=\"chatFull.chat.pFlags.left\">\n          <a ng-switch-when=\"true\" class=\"md_modal_section_link\" ng-click=\"joinChannel()\" my-i18n=\"channel_modal_join\"></a>\n          <a ng-switch-default class=\"md_modal_section_link\" ng-click=\"inviteToChannel()\" my-i18n=\"channel_modal_add_member\"></a>\n        </div>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_toggle\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_notification\"></i>\n\n        <a class=\"md_modal_section_toggle_wrap tg_checkbox\" ng-click=\"settings.notifications = !settings.notifications\" ng-class=\"settings.notifications ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"group_modal_notifications\"></span>\n        </a>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_link\" ng-if=\"isMegagroup && !chatFull.chat.username && !chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_more\"></i>\n\n        <div class=\"md_modal_section_link_wrap\">\n          <a class=\"md_modal_section_link\" ng-click=\"flushHistory()\" my-i18n=\"group_modal_menu_clear_history\"></a>\n        </div>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_link\" ng-if=\"chatFull.chat.pFlags.creator || !chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked && !isMegagroup\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_more\"></i>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"!chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked && !isMegagroup\">\n          <a class=\"md_modal_section_link\" ng-click=\"leaveChannel()\" my-i18n=\"channel_modal_leave_channel\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"chatFull.chat.pFlags.creator\">\n          <a class=\"md_modal_section_link md_modal_section_link_danger\" ng-click=\"deleteChannel()\" ng-switch=\"isMegagroup\">\n            <span ng-switch-when=\"true\" my-i18n=\"group_modal_delete_group\"></span>\n            <span ng-switch-default my-i18n=\"channel_modal_delete_channel\"></span>\n          </a>\n        </div>\n\n      </div>\n\n    </div>\n\n    <div ng-if=\"participants.length > 0\">\n\n      <div class=\"md_modal_section_splitter\"></div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_peers\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_people\"></i>\n\n        <div class=\"md_modal_section_peers_wrap\">\n\n          <div class=\"md_modal_list_peer_wrap clearfix\" ng-repeat=\"participant in participants\">\n\n            <a ng-if=\"participant.canLeave\" ng-click=\"leaveChannel()\" class=\"md_modal_list_peer_action pull-right\" my-i18n=\"group_modal_menu_leave\"></a>\n            <a ng-if=\"participant.canKick\" ng-click=\"kickFromChannel(participant.user_id)\" class=\"md_modal_list_peer_action pull-right\" my-i18n=\"group_modal_members_kick\"></a>\n\n            <a class=\"md_modal_list_peer_photo pull-left\" my-peer-photolink=\"::participant.user_id\" img-class=\"md_modal_list_peer_photo\"></a>\n\n            <div class=\"md_modal_list_peer_name\">\n              <a class=\"md_modal_list_peer_name\" my-peer-link=\"participant.user_id\"></a>\n            </div>\n            <div class=\"md_modal_list_peer_description\" my-user-status=\"::participant.user_id\" bot-chat-privacy=\"true\"></div>\n          </div>\n\n        </div>\n\n      </div>\n\n    </div>\n  </div>\n\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/chat_create_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateGroup()\">\n\n      <h4 my-i18n=\"group_create_modal_title\"></h4>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"group_create_name\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"group.name\" />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: group.creating}\" ng-click=\"createGroup()\" ng-bind=\"group.creating ? 'group_create_submit_active' : 'group_create_submit' | i18n\" ng-disabled=\"group.creating\"></button>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/chat_edit_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateGroup()\">\n\n      <h4 my-i18n=\"group_edit_modal_title\"></h4>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"group_edit_name\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"group.name\" />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: group.updating}\" ng-click=\"updateGroup()\" ng-bind=\"group.updating ? 'group_edit_submit_active' : 'group_edit_submit' | i18n\" ng-disabled=\"group.updating\"></button>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/chat_invite_link_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <div class=\"modal_simple_form\">\n\n      <h4 my-i18n=\"group_invite_link_modal_title\"></h4>\n\n      <div ng-switch=\"exportedInvite.canRevoke\">\n        <div ng-switch-when=\"true\">\n          <div class=\"md-input-group md-textarea-group\" my-labeled-input>\n            <label class=\"md-input-label\" my-i18n=\"group_invite_link_link_label\"></label>\n            <textarea class=\"md-input\" ng-model=\"exportedInvite.link\" rows=\"2\" my-copy-field=\"'ui_invite_select'\"></textarea>\n          </div>\n        </div>\n\n        <div ng-switch-default>\n          <div class=\"md-input-group\" my-labeled-input>\n            <label class=\"md-input-label\" my-i18n=\"group_invite_link_link_label\"></label>\n            <input class=\"md-input\" type=\"text\" ng-model=\"exportedInvite.link\" my-copy-field=\"'ui_invite_select'\" />\n          </div>\n        </div>\n\n      </div>\n\n    </div>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\" ng-switch=\"exportedInvite.canRevoke\">\n    <div ng-switch-when=\"true\">\n      <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n      <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: exportedInvite.revoking}\" ng-click=\"revokeLink()\" ng-bind=\"exportedInvite.revoking ? 'group_invite_revoke_active' : 'group_invite_revoke' | i18n\" ng-disabled=\"exportedInvite.revoking\"></button>\n    </div>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/chat_modal.html",
    "content": "<div class=\"chat_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$close()\" my-i18n=\"modal_close\"></a>\n        <a class=\"md_modal_action\" ng-if=\"hasRights('edit_title')\" ng-click=\"editTitle()\" my-i18n=\"modal_edit\"></a>\n      </div>\n      <div class=\"md_modal_title\" my-i18n=\"group_modal_info\"></div>\n    </div>\n\n    <div class=\"peer_modal_profile_wrap clearfix\">\n      <div class=\"peer_modal_photo_wrap pull-left\" ng-switch=\"photo.updating\">\n        <div ng-switch-when=\"true\" class=\"peer_modal_photo md_photo_loading loading_dots\">\n          <i></i><i></i><i></i>\n        </div>\n        <a ng-switch-default ng-click=\"openPhoto(chatFull.chat_photo.id, {p: -chatFull.chat.id})\" class=\"peer_modal_photo\" my-peer-photolink=\"::-chatFull.chat.id\" img-class=\"peer_modal_photo\" no-open=\"true\" watch=\"true\" ng-class=\"{disabled: !chatFull.chat.photo.photo_small}\" ng-disabled=\"!chatFull.chat.photo.photo_small\"></a>\n      </div>\n      <div class=\"peer_modal_profile\">\n        <div class=\"peer_modal_profile_name\" my-peer-link=\"-chatFull.chat.id\"></div>\n        <div class=\"peer_modal_profile_description\" ng-if=\"chatFull.chat.participants_count > 0\">\n          <ng-pluralize count=\"chatFull.chat.participants_count\"\n                        when=\"group_modal_pluralize_participants\">\n          </ng-pluralize>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"md_modal_split_actions_wrap\">\n    <div class=\"md_modal_split_actions\">\n      <div class=\"md_modal_split_action\">\n        <input my-file-upload  type=\"file\" multiple=\"false\" class=\"im_attach_input\" size=\"120\" multiple=\"false\" accept=\"image/x-png, image/png, image/gif, image/jpeg\" title=\"{{'group_modal_update_photo' | i18n}}\" />\n        <i class=\"md_modal_split_action_camera\"></i>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"md_modal_sections clearfix\">\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_link\" ng-if=\"hasRights('invite') && chatFull.participants.participants.length < maxParticipants\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_person\"></i>\n\n        <div class=\"md_modal_section_link_wrap\">\n          <a class=\"md_modal_section_link\" ng-click=\"inviteToGroup()\" my-i18n=\"group_modal_add_member\"></a>\n        </div>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap  md_modal_iconed_section_link\" ng-if=\"chatFull.chat._ != 'chatForbidden' && !chatFull.chat.pFlags.left && chatFull.chat.pFlags.creator\">\n\n        <div class=\"md_modal_section_link_wrap\">\n          <a class=\"md_modal_section_link\" ng-click=\"inviteViaLink()\" my-i18n=\"group_modal_menu_share_link\"></a>\n        </div>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_toggle\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_notification\"></i>\n\n        <a class=\"md_modal_section_toggle_wrap tg_checkbox\" ng-click=\"settings.notifications = !settings.notifications\" ng-class=\"settings.notifications ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"group_modal_notifications\"></span>\n        </a>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap  md_modal_iconed_section_link\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_more\"></i>\n\n        <div class=\"md_modal_section_link_wrap\" ng-switch=\"chatFull.chat.pFlags.left || chatFull.chat.pFlags.kicked || chatFull.chat._ == 'chatForbidden'\">\n          <a ng-switch-when=\"true\" class=\"md_modal_section_link\" ng-click=\"flushHistory(false)\" my-i18n=\"group_modal_menu_delete_group\"></a>\n          <a ng-switch-default class=\"md_modal_section_link\" ng-click=\"flushHistory(true)\" my-i18n=\"group_modal_menu_clear_history\"></a>\n        </div>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap  md_modal_iconed_section_link\" ng-if=\"chatFull.chat.pFlags.creator\">\n\n        <div class=\"md_modal_section_link_wrap\">\n          <a class=\"md_modal_section_link\" ng-click=\"migrateToSuperGroup()\" my-i18n=\"group_modal_migrate_to_supergroup\"></a>\n        </div>\n\n      </div>\n\n    </div>\n\n    <div ng-if=\"chatFull.chat._ != 'chatForbidden' &amp;&amp; !chatFull.chat.pFlags.left &amp;&amp; chatFull.participants.participants.length > 0\">\n\n      <div ng-switch=\"chatFull.chat.pFlags.creator && needMigrate\">\n        <div ng-switch-when=\"true\" class=\"md_modal_section_splitter md_modal_section_splitter_content\">\n          <h4 class=\"chat_modal_migrate_header\" my-i18n=\"group_modal_migrate_header\"></h4>\n          <p class=\"chat_modal_migrate_description\" my-i18n=\"group_modal_migrate_desc\"></p>\n          <ul class=\"chat_modal_migrate_list\">\n           <li my-i18n=\"group_modal_migrate_item1\"></li>\n           <li my-i18n=\"group_modal_migrate_item2\"></li>\n           <li my-i18n=\"group_modal_migrate_item3\"></li>\n           <li my-i18n=\"group_modal_migrate_item4\"></li>\n          </ul>\n        </div>\n        <div ng-switch-default class=\"md_modal_section_splitter\"></div>\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_peers\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_people\"></i>\n\n        <div class=\"md_modal_section_peers_wrap\">\n\n          <div class=\"md_modal_list_peer_wrap clearfix\" ng-repeat=\"participant in chatFull.participants.participants | orderBy:'-user.sortStatus'\">\n\n            <a ng-if=\"participant.canLeave\" ng-click=\"leaveGroup()\" class=\"md_modal_list_peer_action pull-right\" my-i18n=\"group_modal_menu_delete_group\"></a>\n            <a ng-if=\"participant.canKick\" ng-click=\"kickFromGroup(participant.user_id)\" class=\"md_modal_list_peer_action pull-right\" my-i18n=\"group_modal_members_kick\"></a>\n\n            <a class=\"md_modal_list_peer_photo pull-left\" my-peer-photolink=\"::participant.user_id\" img-class=\"md_modal_list_peer_photo\"></a>\n\n            <div class=\"md_modal_list_peer_name\">\n              <a class=\"md_modal_list_peer_name\" my-peer-link=\"participant.user_id\"></a>\n            </div>\n            <div class=\"md_modal_list_peer_description\" my-user-status=\"::participant.user_id\" bot-chat-privacy=\"true\"></div>\n          </div>\n\n        </div>\n\n      </div>\n\n    </div>\n  </div>\n\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/composer_dropdown.html",
    "content": "<div ng-switch=\"type\">\n\n  <ul ng-switch-when=\"mentions\" class=\"composer_dropdown\">\n    <li ng-repeat=\"user in mentionUsers\">\n      <a class=\"composer_mention_option\" data-user-id=\"{{'#' + user.id}}\" data-username=\"{{user.username}}\" data-name=\"{{user.first_name}}\">\n        <span class=\"composer_user_photo\" my-peer-photolink=\"user.id\" img-class=\"composer_user_photo\"></span>\n        <span class=\"composer_user_name\" ng-bind-html=\"user.rFullName\"></span>\n        <span class=\"composer_user_mention\" ng-if=\"user.username.length > 0\" ng-bind=\"'@' + user.username\"></span>\n      </a>\n    </li>\n  </ul>\n\n  <ul ng-switch-when=\"commands\" class=\"composer_dropdown\">\n    <li ng-repeat=\"command in commands track by (command.botID + command.value)\">\n      <a class=\"composer_command_option\" data-command=\"{{command.value}}\">\n        <span class=\"composer_user_photo\" my-peer-photolink=\"command.botID\" img-class=\"composer_user_photo\"></span>\n        <span class=\"composer_command_value\" ng-bind=\"command.value\"></span>\n        <span class=\"composer_command_desc\" ng-bind-html=\"command.rDescription\"></span>\n      </a>\n    </li>\n  </ul>\n\n  <ul ng-switch-when=\"emoji\" my-emoji-suggestions=\"emojiCodes\" class=\"composer_dropdown\"></ul>\n\n  <div ng-switch-when=\"inline\" my-inline-results=\"botResults\"></div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/confirm_modal.html",
    "content": "<div class=\"confirm_modal_wrap md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <div class=\"confirm_modal_description\" ng-switch=\"type\">\n      <span ng-switch-when=\"LOGOUT\" my-i18n=\"confirm_modal_logout\"></span>\n      <span ng-switch-when=\"WEBOGRAM_UPDATED_RELOAD\" my-i18n=\"confirm_modal_update_reload\"></span>\n      <span ng-switch-when=\"HISTORY_FLUSH\" my-i18n=\"confirm_modal_history_flush\"></span>\n      <span ng-switch-when=\"HISTORY_LEAVE_AND_FLUSH\" my-i18n=\"confirm_modal_history_leave_flush_md\"></span>\n      <span ng-switch-when=\"HISTORY_FLUSH_AND_DELETE\" my-i18n=\"confirm_modal_history_flush\"></span>\n      <span ng-switch-when=\"TERMINATE_SESSIONS\" my-i18n=\"confirm_modal_terminate_sessions\"></span>\n      <span ng-switch-when=\"TERMINATE_SESSION\" my-i18n=\"confirm_modal_terminate_session\"></span>\n\n      <span ng-switch-when=\"FILES_CLIPBOARD_PASTE\">\n        <ng-pluralize count=\"files.length\"\n                     when=\"confirm_modal_clipboard_X_files_send\">\n        </ng-pluralize>\n      </span>\n      <div ng-switch-when=\"FILE_CLIPBOARD_PASTE\">\n        <span my-i18n=\"confirm_modal_clipboard_file_send\"></span>\n        <div class=\"confirm_modal_paste_image\" ng-if=\"fileUrl !== false\" ng-style=\"{backgroundImage: 'url(' + fileUrl + ')'}\"></div>\n      </div>\n      <span ng-switch-when=\"MESSAGE_DELETE\" my-i18n=\"confirm_modal_message_delete\"></span>\n      <span ng-switch-when=\"MESSAGES_DELETE\">\n        <span my-i18n=\"confirm_modal_delete_messages\">\n          <my-i18n-param name=\"messages\"><strong><ng-pluralize when=\"confirm_modal_delete_X_messages\" count=\"count\"></ng-pluralize></strong></my-i18n-param>\n        </span>\n\n        <a class=\"tg_checkbox\" ng-if=\"revocable\" ng-click=\"data.revoke = !data.revoke\" ng-class=\"data.revoke ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"confirm_modal_message_revoke\">\n            <my-i18n-param name=\"recipient\" ng-switch=\"isUser\">\n              <span ng-switch-when=\"true\" my-peer-link=\"peerID\" short=\"true\"></span>\n              <span ng-switch-default my-i18n=\"confirm_modal_message_revoke_recipient_chat\"></span>\n            </my-i18n-param>\n          </span>\n        </a>\n        <p class=\"tg_checkbox\" ng-if=\"!revocable && !isChannel && !isSavedMessages\" ng-switch=\"isUser ? 'user' : (isSupergroup ? 'supergroup' : (isUsualGroup ? 'group' : 'default'))\">\n          <span ng-switch-when=\"supergroup\" my-i18n=\"confirm_modal_delete_messages_for_everyone_chat\"></span>\n          <span ng-switch-when=\"group\" my-i18n=\"confirm_modal_delete_messages_for_you_only_chat\"></span>\n          <span ng-switch-when=\"user\" my-i18n=\"confirm_modal_delete_messages_for_you_only_pm\"><my-i18n-param name=\"user\"><strong my-peer-link=\"peerID\"></strong></my-i18n-param></span>\n        </p>\n      </span>\n      <span ng-switch-when=\"PHOTO_DELETE\" my-i18n=\"confirm_modal_photo_delete\"></span>\n      <span ng-switch-when=\"CONTACTS_IMPORT_PERFORM\" my-i18n=\"confirm_modal_contacts_import\"></span>\n      <div ng-switch-when=\"LOGIN_PHONE_CORRECT\">\n        <my-i18n msgid=\"confirm_modal_login_phone_correct\"></my-i18n>\n        <div class=\"confirm_phone_number\">\n          <span ng-bind=\"country_code\"></span> <span ng-bind=\"phone_number\"></span>\n        </div>\n      </div>\n      <my-i18n>\n        <span ng-switch-when=\"FORWARD_PEER\" my-i18n-format=\"confirm_modal_forward_to_peer\"></span>\n        <span ng-switch-when=\"SHARE_CONTACT_PEER\" my-i18n-format=\"confirm_modal_send_to_peer\"></span>\n        <span ng-switch-when=\"SHARE_URL\" my-i18n-format=\"confirm_modal_send_to_peer\"></span>\n        <span ng-switch-when=\"EXT_SHARE_PEER\" my-i18n-format=\"confirm_modal_share_file_peer\"></span>\n        <span ng-switch-when=\"INVITE_TO_GROUP\" my-i18n-format=\"confirm_modal_invite_peer\"></span>\n        <span ng-switch-when=\"INVITE_TO_GAME\" my-i18n-format=\"confirm_modal_share_game\"></span>\n        <my-i18n-param name=\"peer\">\n          <strong my-peer-link=\"peer_id\"></strong>\n        </my-i18n-param>\n      </my-i18n>\n      <div ng-switch-when=\"APPLY_LANG_WITH_RELOAD\" my-i18n=\"confirm_modal_apply_lang_with_reload_md\"></div>\n      <div ng-switch-when=\"MIGRATE_TO_HTTPS\" my-i18n=\"confirm_modal_migrate_to_https_md\"></div>\n      <div ng-switch-when=\"SWITCH_DESKTOP_VERSION\" my-i18n=\"confirm_modal_resize_desktop_md\"></div>\n      <div ng-switch-when=\"SWITCH_MOBILE_VERSION\" my-i18n=\"confirm_modal_resize_mobile_md\"></div>\n      <div ng-switch-when=\"RECOVERY_EMAIL_EMPTY\" my-i18n=\"confirm_modal_recovery_email_empty_md\"></div>\n      <div ng-switch-when=\"PASSWORD_ABORT_SETUP\"  my-i18n=\"confirm_modal_abort_password_setup\"></div>\n      <div ng-switch-when=\"RESET_ACCOUNT\" my-i18n=\"confirm_modal_reset_account_md\"></div>\n      <div ng-switch-when=\"JOIN_GROUP_BY_LINK\" my-i18n=\"confirm_modal_join_group_link\">\n        <my-i18n-param name=\"title\"><strong ng-bind=\"title\"></strong></my-i18n-param>\n      </div>\n      <div ng-switch-when=\"JOIN_CHANNEL_BY_LINK\" my-i18n=\"confirm_modal_join_channel_link\">\n        <my-i18n-param name=\"title\"><strong ng-bind=\"title\"></strong></my-i18n-param>\n      </div>\n      <div ng-switch-when=\"REVOKE_GROUP_INVITE_LINK\" my-i18n=\"confirm_modal_revoke_group_link\"></div>\n      <div ng-switch-when=\"REVOKE_CHANNEL_INVITE_LINK\" my-i18n=\"confirm_modal_revoke_channel_link\"></div>\n      <div ng-switch-when=\"CHANNEL_DELETE\" my-i18n=\"confirm_modal_delete_channel_md\"></div>\n      <div ng-switch-when=\"MEGAGROUP_DELETE\" my-i18n=\"confirm_modal_delete_group_md\"></div>\n      <div ng-switch-when=\"CHANNEL_LEAVE\" my-i18n=\"confirm_modal_leave_channel_md\"></div>\n      <div ng-switch-when=\"MEGAGROUP_LEAVE\" my-i18n=\"confirm_modal_leave_group_md\"></div>\n      <div ng-switch-when=\"JUMP_EXT_URL\" my-i18n=\"confirm_modal_jump_ext_url_md\" class=\"confirm_modal_extlink_jump\">\n        <my-i18n-param name=\"url\"><strong ng-bind=\"url\"></strong></my-i18n-param>\n      </div>\n      <div ng-switch-when=\"SUPERGROUP_MIGRATE\" my-i18n=\"confirm_modal_migrate_supergroup_md\"></div>\n      <div ng-switch-when=\"BOT_ACCESS_PHONE\" my-i18n=\"confirm_modal_bot_access_phone\"></div>\n      <div ng-switch-when=\"BOT_ACCESS_GEO\" my-i18n=\"confirm_modal_bot_access_geo\"></div>\n      <div ng-switch-when=\"BOT_ACCESS_GEO_INLINE\" my-i18n=\"confirm_modal_bot_access_geo_inline\"></div>\n      <div ng-switch-when=\"CONTENT_SETTINGS_SENSITIVE\" my-i18n=\"confirm_modal_content_settings_sensitive_md\"></div>\n\n\n\n\n      <span ng-switch-default ng-switch=\"message.length > 0\">\n        <span ng-switch-when=\"true\" ng-bind=\"message\"></span>\n        <span ng-switch-default my-i18n=\"confirm_modal_are_u_sure\"></span>\n      </span>\n    </div>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\">\n      <span my-i18n=\"modal_cancel\"></span>\n    </button>\n    <button class=\"btn btn-md btn-md-primary\" ng-switch=\"type\" ng-click=\"$close(data)\" ng-class=\"{'btn-md-danger': type == 'RESET_ACCOUNT' || type == 'HISTORY_LEAVE_AND_FLUSH' || type == 'HISTORY_FLUSH_AND_DELETE' || type == 'HISTORY_FLUSH'}\" my-focused >\n      <span ng-switch-when=\"LOGOUT\" my-i18n=\"confirm_modal_logout_submit\"></span>\n      <span ng-switch-when=\"HISTORY_FLUSH\" my-i18n=\"confirm_modal_clear_history_submit\"></span>\n      <span ng-switch-when=\"HISTORY_LEAVE_AND_FLUSH\" my-i18n=\"confirm_modal_leave_chat_submit\"></span>\n      <span ng-switch-when=\"HISTORY_FLUSH_AND_DELETE\" my-i18n=\"confirm_modal_delete_chat_submit\"></span>\n      <span ng-switch-when=\"FILES_CLIPBOARD_PASTE\" my-i18n=\"confirm_modal_clipboard_files_send_submit\"></span>\n      <span ng-switch-when=\"FILE_CLIPBOARD_PASTE\" my-i18n=\"confirm_modal_clipboard_file_send_submit\"></span>\n      <span ng-switch-when=\"MESSAGE_DELETE\" my-i18n=\"confirm_modal_message_delete_submit\"></span>\n      <span ng-switch-when=\"MESSAGES_DELETE\" my-i18n=\"confirm_modal_messages_delete_submit\"></span>\n      <span ng-switch-when=\"PHOTO_DELETE\" my-i18n=\"confirm_modal_photo_delete_submit\"></span>\n      <span ng-switch-when=\"FORWARD_PEER\" my-i18n=\"confirm_modal_forward_message_submit\"></span>\n      <span ng-switch-when=\"PHOTO_SHARE_PEER\" my-i18n=\"confirm_modal_share_photo_submit\"></span>\n      <span ng-switch-when=\"VIDEO_SHARE_PEER\" my-i18n=\"confirm_modal_share_video_submit\"></span>\n      <span ng-switch-when=\"SHARE_CONTACT_PEER\" my-i18n=\"confirm_modal_share_contact_submit\"></span>\n      <span ng-switch-when=\"EXT_SHARE_PEER\" my-i18n=\"confirm_modal_share_file_submit\"></span>\n      <span ng-switch-when=\"RESET_ACCOUNT\" my-i18n=\"confirm_modal_reset_account_submit\"></span>\n      <span ng-switch-when=\"CONTENT_SETTINGS_SENSITIVE\" my-i18n=\"confirm_modal_content_settings_sensitive_submit\"></span>\n      <span ng-switch-default my-i18n=\"modal_ok\"></span>\n    </button>\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/contacts_modal.html",
    "content": "<div class=\"contacts_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head md_modal_head_simple\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-if=\"action != 'edit'\" ng-click=\"$dismiss()\" my-i18n=\"modal_close\"></a>\n        <a class=\"md_modal_action\" ng-if=\"action == 'edit'\" class=\"contacts_modal_edit_link\" ng-click=\"toggleEdit(false)\" my-i18n=\"contacts_modal_edit_cancel\"></a>\n        <a class=\"md_modal_action\" ng-if=\"!action\" ng-click=\"toggleEdit(true)\" my-i18n=\"contacts_modal_edit_list\"></a>\n      </div>\n    </div>\n    <div class=\"md_modal_title\" ng-switch=\"action\">\n      <div ng-switch-when=\"new_group\" ng-switch=\"selectedCount > 0\">\n        <span ng-switch-when=\"true\">\n          <ng-pluralize count=\"selectedCount\" when=\"contacts_modal_pluralize_new_group_members\">\n          </ng-pluralize>\n        </span>\n        <span ng-switch-default my-i18n=\"group_create_contacts_modal_title\"></span>\n      </div>\n      <span ng-switch-default my-i18n=\"contacts_modal_title\"></span>\n    </div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"contacts_modal_search\">\n      <input class=\"form-control contacts_modal_search_field no_outline\" my-focused type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\" autocomplete=\"off\" />\n      <a class=\"im_dialogs_search_clear tg_search_clear\" ng-click=\"search.query = ''\" ng-show=\"search.query.length\">\n        <i class=\"icon icon-search-clear\"></i>\n      </a>\n    </div>\n\n    <div my-contacts-list class=\"contacts_modal_col\">\n\n      <div class=\"contacts_wrap nano\" my-infinite-scroller>\n        <div class=\"contacts_scrollable_wrap nano-content\" ng-switch=\"contactsEmpty\">\n\n          <div ng-switch-when=\"true\" class=\"contacts_modal_contacts_empty\" my-vertical-position=\"0.2\" padding=\"true\" my-i18n=\"contacts_modal_empty_list\">\n            <my-i18n-param name=\"import-link\"><a href=\"\" ng-click=\"importContact()\">{0}</a></my-i18n-param>\n          </div>\n\n          <ul ng-switch-default class=\"contacts_modal_members_list nav nav-pills nav-stacked\">\n\n            <li class=\"contacts_modal_contact_wrap clearfix\" ng-repeat=\"contact in contacts | limitTo: slice.limit track by contact.userID\" ng-class=\"{active: selectedContacts[contact.userID], disabled: disabledContacts[contact.userID]}\">\n              <a class=\"contacts_modal_contact\" ng-click=\"contactSelect(contact.userID)\">\n\n                <div class=\"md_modal_list_peer_photo pull-left\" my-peer-photolink=\"::contact.userID\" img-class=\"md_modal_list_peer_photo\"></div>\n                <div class=\"md_modal_list_peer_name\" my-peer-link=\"contact.userID\"></div>\n                <div class=\"md_modal_list_peer_description\" ng-switch=\"contact.found\">\n                  <span ng-switch-when=\"true\" ng-bind=\"'@' + contact.user.username\"></span>\n                  <span ng-switch-default my-user-status=\"::contact.userID\"></span>\n                </div>\n\n              </a>\n            </li>\n\n          </ul>\n\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n  <div class=\"md_modal_footer clearfix\" ng-switch=\"action\">\n\n    <div ng-switch-when=\"new_group\" class=\"pull-right\">\n      <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n      <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" ng-click=\"submitSelected()\" type=\"submit\" my-i18n=\"modal_next\"></button>\n    </div>\n\n    <button ng-switch-when=\"select\" class=\"btn btn-md btn-md-primary pull-right\" ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" ng-click=\"submitSelected()\" type=\"submit\" my-i18n=\"modal_next\"></button>\n\n    <button ng-switch-when=\"edit\" class=\"btn btn-md btn-md-danger pull-right\"  ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" ng-click=\"deleteSelected()\">\n      <my-i18n msgid=\"contacts_modal_edit_delete\"></my-i18n>\n      <strong ng-bind=\"selectedCount\"></strong>\n    </button>\n\n    <div ng-switch-default class=\"text-center\">\n      <button class=\"btn btn-md btn-md-primary\" ng-click=\"importContact()\" my-i18n=\"contacts_modal_new_contact\"></button>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/country_select_modal.html",
    "content": "<div class=\"countries_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head md_modal_head_simple\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$dismiss()\" my-i18n=\"modal_close\"></a>\n      </div>\n    </div>\n    <div class=\"md_modal_title\" my-i18n=\"country_select_modal_title\"></div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"countries_modal_search\">\n      <input class=\"form-control countries_modal_search_field no_outline\" my-focused type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\" autocomplete=\"off\" />\n      <a class=\"countries_modal_search_clear tg_search_clear\" ng-click=\"search.query = ''\" ng-show=\"search.query.length\">\n        <i class=\"icon icon-search-clear\"></i>\n      </a>\n\n    </div>\n\n    <div class=\"countries_modal_col\" my-countries-list>\n\n      <div class=\"countries_wrap nano\" my-infinite-scroller>\n        <div class=\"countries_scrollable_wrap nano-content\">\n\n          <ul class=\"countries_modal_members_list nav nav-pills nav-stacked\">\n\n            <li class=\"countries_modal_country_wrap clearfix\" ng-repeat=\"country in countries | limitTo : slice.limit track by $index\">\n              <a class=\"countries_modal_country\" ng-click=\"$close(country)\">\n                <span class=\"countries_modal_country_code pull-right\" ng-bind=\"country.code\"></span>\n                <span class=\"countries_modal_country_name\" ng-bind=\"country.name\"></span>\n              </a>\n            </li>\n\n          </ul>\n\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/dialog.html",
    "content": "<a class=\"im_dialog\" ng-mousedown=\"dialogSelect(dialogMessage.peerString, dialogMessage.unreadCount == -1 && dialogMessage.mid)\">\n\n  <div class=\"im_dialog_meta pull-right text-right\">\n    <div class=\"im_dialog_date\" ng-bind=\"dialogMessage.dateText\"></div>\n    <span\n      class=\"im_dialog_badge badge ng-hide\"\n      ng-show=\"dialogMessage.unreadCount > 0 && !dialogMessage.pFlags.out\"\n      ng-bind=\"dialogMessage.unreadCount\"\n      my-peer-muted=\"dialogMessage.peerID\" muted-class=\"im_dialog_badge_muted\"\n    ></span>\n    <i\n      class=\"im_dialog_unread ng-hide\"\n      ng-show=\"dialogMessage.pFlags.out && dialogMessage.pFlags.unread\"\n    ></i>\n    <i\n      class=\"im_dialog_pinned ng-hide\"\n      ng-show=\"dialogMessage.pinned && !dialogMessage.unreadCount && !dialogMessage.pFlags.unread\"\n    ></i>\n  </div>\n\n  <i class=\"icon icon-select-tick\" ng-class=\"{dialog_selected: isSelected(dialogMessage.peerString)}\" ng-mousedown=\"dialogMultiSelect(dialogMessage.peerString, $event)\"></i>\n  \n  <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"::dialogMessage.peerID\" img-class=\"im_dialog_photo\" watch=\"true\" for-dialog=\"!dialogMessage.foundInHistory\"></div>\n\n  <div class=\"im_dialog_message_wrap\">\n\n    <div class=\"im_dialog_peer\">\n      <span my-peer-link=\"dialogMessage.peerID\" verified=\"true\" for-dialog=\"!dialogMessage.foundInHistory\"></span>\n    </div>\n\n    <div ng-switch=\"dialogMessage.typing ? 'typing' : (!dialogMessage.unreadCount && dialogMessage.draft ? 'draft' : (dialogMessage.deleted ? 'deleted' : 'message'))\">\n\n      <div ng-switch-when=\"typing\" class=\"im_dialog_message\">\n        <span class=\"im_short_message_service\" my-i18n=\"im_conversation_group_typing\">\n          <my-i18n-param name=\"name\"><span my-peer-link=\"dialogMessage.typing\" short=\"true\" class=\"im_dialog_chat_from_wrap\"></span></my-i18n-param><my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n        </span>\n      </div>\n\n      <div ng-switch-when=\"draft\" class=\"im_dialog_message\">\n        <span class=\"im_dialog_chat_from_wrap\">\n          <span class=\"im_dialog_draft_from\" my-i18n=\"conversation_draft\"></span>\n        </span>\n        <span class=\"im_short_message_text\" ng-bind-html=\"dialogMessage.draft.richMessage\"></span>\n      </div>\n\n      <div ng-switch-when=\"deleted\" class=\"im_dialog_message\">\n        <span class=\"im_short_message_text\">&nbsp;</span>\n      </div>\n\n      <div ng-switch-when=\"message\" class=\"im_dialog_message\">\n        <span ng-switch=\"dialogMessage.peerID > 0 || dialogMessage.fromID < 0\">\n          <span ng-switch-when=\"true\">\n            <span class=\"im_dialog_chat_from_wrap\" ng-if=\"dialogMessage.pFlags.out && dialogMessage.fromID > 0\">\n              <span\n                class=\"im_dialog_chat_from\"\n                my-i18n=\"conversation_you\"\n              ></span><span ng-if=\"dialogMessage.message.length > 0 || !!dialogMessage.media\">:</span>\n            </span>\n          </span>\n          <span ng-switch-default>\n            <span class=\"im_dialog_chat_from_wrap\" ng-switch=\"dialogMessage.pFlags.out && dialogMessage._ != 'messageService'\">\n              <span\n                ng-switch-when=\"false\"\n                class=\"im_dialog_chat_from\"\n                my-peer-link=\"dialogMessage.from_id\" short=\"true\" peer-watch=\"true\"\n              ></span><span\n                ng-switch-when=\"true\"\n                class=\"im_dialog_chat_from\"\n                my-i18n=\"conversation_you\"\n              ></span><span ng-if=\"dialogMessage.message.length || dialogMessage.media\">:</span>\n            </span>\n          </span>\n        </span>\n\n        <span my-short-message=\"dialogMessage\"></span>\n      </div>\n    </div>\n\n  </div>\n\n</a>\n"
  },
  {
    "path": "app/partials/desktop/document_modal.html",
    "content": "<div class=\"modal_close_wrap\" ng-click=\"$close()\">\n  <div class=\"modal_close\"></div>\n</div>\n\n<div class=\"media_modal_bottom_panel_wrap\">\n  <div class=\"media_modal_bottom_panel\">\n    <div class=\"media_modal_bottom_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-click=\"download()\" title=\"{{'media_modal_download' | i18n}}\">\n        <i class=\"media_modal_action_btn_download\"></i>\n      </a>\n      <a class=\"media_modal_action_btn\" ng-if=\"messageID\" ng-click=\"forward()\"  title=\"{{'media_modal_forward' | i18n}}\">\n        <i class=\"media_modal_action_btn_forward\"></i>\n      </a>\n      <a class=\"media_modal_action_btn\" ng-if=\"messageID\" ng-click=\"delete()\" title=\"{{'media_modal_delete' | i18n}}\">\n        <i class=\"media_modal_action_btn_delete\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_info_wrap pull-left\" ng-if=\"document.user_id > 0\" ng-switch=\"messageID > 0\">\n      <a class=\"media_modal_author_photo pull-left\" my-peer-photolink=\"document.user_id\" img-class=\"media_modal_author_photo\" watch=\"true\"></a>\n      <div class=\"media_modal_author_name\">\n        <a class=\"media_modal_author\" my-peer-link=\"document.user_id\" peer-watch=\"true\"></a>\n      </div>\n      <div class=\"media_modal_date\" ng-if=\"document.date > 0\">\n        <a ng-switch-when=\"true\" class=\"media_modal_date\" ng-click=\"goToMessage()\" ng-bind=\"document.date | dateOrTime :true\"></a>\n        <span ng-switch-default ng-bind=\"document.date | dateOrTime :true\"></span>\n      </div>\n    </div>\n\n    <div class=\"media_modal_title_wrap\" ng-bind=\"document.file_name\"></div>\n\n  </div>\n</div>\n\n<div class=\"modal-dialog\">\n  <div class=\"modal-content\">\n    <div my-modal-width=\"{{photo.full.modalWidth}}\" class=\"media_modal_wrap photo_modal_wrap\" my-modal-position animation=\"no\">\n\n      <div class=\"modal-body\">\n\n        <div my-load-document=\"document\"></div>\n\n      </div>\n\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/edit_contact_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"doImport()\">\n\n      <h4 my-i18n=\"contact_edit_modal_title\"></h4>\n\n      <div class=\"md-input-group md-input-disabled\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"contact_import_modal_phone\"></label>\n        <span class=\"md-input\" ng-bind=\"importContact.phone | phoneNumber\"></span>\n      </div>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"contact_edit_modal_first_name\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"importContact.first_name\" my-submit-on-enter />\n      </div>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"contact_edit_modal_last_name\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"importContact.last_name\" my-submit-on-enter />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: progress.enabled}\" ng-click=\"doImport()\" ng-bind=\"progress.enabled ? 'contact_edit_modal_submit_active' : 'contact_edit_modal_submit'| i18n\" ng-disabled=\"progress.enabled\"></button>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/embed_modal.html",
    "content": "<div class=\"modal_close_wrap\" ng-click=\"$close()\">\n  <div class=\"modal_close\"></div>\n</div>\n\n<div class=\"media_modal_bottom_panel_wrap\">\n  <div class=\"media_modal_bottom_panel\">\n    <div class=\"media_modal_bottom_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-click=\"forward()\"  title=\"{{'media_modal_forward' | i18n}}\">\n        <i class=\"media_modal_action_btn_forward\"></i>\n      </a>\n      <a class=\"media_modal_action_btn\" ng-click=\"delete()\" title=\"{{'media_modal_delete' | i18n}}\">\n        <i class=\"media_modal_action_btn_delete\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_info_wrap pull-left\" ng-if=\"webpageID\">\n      <div class=\"media_modal_author_name\">\n        <a class=\"media_modal_author\" href=\"{{webpage.url}}\" target=\"_blank\" ng-bind-html=\"webpage.rTitle\" rel=\"noopener noreferrer\"></a>\n      </div>\n      <div class=\"media_modal_date\"  ng-bind=\"webpage.site_name || webpage.display_url\"></div>\n    </div>\n\n    <div class=\"media_modal_title_wrap\" my-i18n=\"media_modal_video\"></div>\n  </div>\n</div>\n\n<div class=\"modal-dialog\">\n  <div class=\"modal-content\">\n    <div my-modal-width=\"{{webpage.full.width - 32}}\" class=\"media_modal_wrap embed_modal_wrap\" my-modal-position animation=\"no\">\n\n      <div class=\"modal-body\" ng-bind-html=\"webpage.full.html\">\n\n\n      </div>\n\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/emoji_btn_tooltip.html",
    "content": "<div class=\"composer_emoji_btn_wrap\">\n\n  <div class=\"composer_emoji_tooltip_wrap\">\n    <div class=\"composer_emoji_tooltip\">\n\n      <div class=\"composer_emoji_tooltip_tabs\">\n        <a ng-repeat=\"tab in ::tabs\" href=\"\" class=\"composer_emoji_tooltip_tab\" ng-class=\"['composer_emoji_tooltip_tab_' + tab, curTab == tab ? 'active' : '']\" ng-click=\"tabSelect(tab)\"></a>\n      </div>\n\n      <div class=\"composer_emoji_content\" ng-switch=\"curTab == 'stickers'\">\n        <div ng-switch-when=\"true\" class=\"composer_emoji_content_emoticons\">\n          <a class=\"composer_emoticon_option\" href=\"\" ng-repeat=\"emoji in emojis\" ng-click=\"emojiSelect(emoji)\"></a>\n        </div>\n        <div ng-switch-default class=\"composer_emoji_content_stickers\">\n          <a class=\"composer_sticker_option\" href=\"\" ng-repeat=\"sticker in stickers\" ng-click=\"stickerSelect(sticker)\"></a>\n        </div>\n      </div>\n\n    </div>\n  </div>\n\n  <a class=\"composer_emoji_btn\">\n    <i class=\"icon icon-emoji\"></i>\n  </a>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/error_modal.html",
    "content": "<div class=\"error_modal_wrap md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\" ng-class=\"{md_simple_modal_alert_body: alert}\">\n\n    <h4 ng-if=\"error\" class=\"md_simple_header\" ng-switch=\"error.type\">\n      <span ng-switch-when=\"MEDIA_TYPE_NOT_SUPPORTED\" my-i18n=\"error_modal_media_not_supported_title\"></span>\n      <span ng-switch-when=\"PHONECALLS_NOT_SUPPORTED\" my-i18n=\"error_modal_phonecalls_not_supported_title\"></span>\n      <span ng-switch-when=\"USERNAME_NOT_OCCUPIED\" my-i18n=\"error_modal_not_found_title\"></span>\n      <span ng-switch-when=\"PASSWORD_RECOVERY_NA\" my-i18n=\"error_modal_recovery_na_title\"></span>\n      <span ng-switch-default ng-switch=\"error.code\">\n        <span ng-switch-when=\"400\" my-i18n=\"error_modal_bad_request_title\"></span>\n        <span ng-switch-when=\"401\" my-i18n=\"error_modal_unauthorized_title\"></span>\n        <span ng-switch-when=\"403\" my-i18n=\"error_modal_forbidden_title\"></span>\n        <span ng-switch-when=\"404\" my-i18n=\"error_modal_not_found_title\"></span>\n        <span ng-switch-when=\"406\" my-i18n=\"error_modal_network_title\"></span>\n        <span ng-switch-when=\"420\" my-i18n=\"error_modal_flood_title\"></span>\n        <span ng-switch-default my-i18n=\"error_modal_internal_title\"></span>\n      </span>\n      <span ng-switch-when=\"CALLBACK_RESPONSE\"><!-- empty --></span>\n    </h4>\n    <h4 ng-if=\"!error\" class=\"md_simple_header\" ng-switch=\"title_html !== undefined ? 'html' : (title.length > 0 ? 'text' : 'default')\">\n      <span ng-switch-when=\"html\" ng-bind-html=\"title_html\"></span>\n      <span ng-switch-when=\"text\" ng-bind=\"title\"></span>\n      <span ng-switch-default my-i18n=\"error_modal_alert\"></span>\n    </h4>\n\n    <div ng-if=\"error\" class=\"error_modal_description\" ng-switch=\"error.type\">\n      <span ng-switch-when=\"NETWORK_BAD_REQUEST\" my-i18n=\"error_modal_network_description\"></span>\n      <span ng-switch-when=\"NETWORK_BAD_RESPONSE\" my-i18n=\"error_modal_network_description\"></span>\n      <span ng-switch-when=\"FIRSTNAME_INVALID\" my-i18n=\"error_modal_firstname_invali_description\"></span>\n      <span ng-switch-when=\"LASTNAME_INVALID\" my-i18n=\"error_modal_lastname_invalid_description\"></span>\n      <span ng-switch-when=\"PHONE_NUMBER_INVALID\" my-i18n=\"error_modal_phone_invalid_description\"></span>\n      <span ng-switch-when=\"USERS_TOO_MUCH\" my-i18n=\"error_modal_users_too_much_description\"></span>\n      <span ng-switch-when=\"PHOTO_INVALID_DIMENSIONS\" my-i18n=\"error_modal_photo_dimensions_invalid_description\"></span>\n      <span ng-switch-when=\"VIDEO_EXT_INVALID\" my-i18n=\"error_modal_video_file_invalid_description\"></span>\n      <span ng-switch-when=\"PHOTO_CROP_SIZE_SMALL\" my-i18n=\"error_modal_photo_too_small_description\"></span>\n      <span ng-switch-when=\"USER_NOT_USING_TELEGRAM\" my-i18n=\"error_modal_no_phone_user_description_md\"></span>\n      <span ng-switch-when=\"USERS_NOT_USING_TELEGRAM\" my-i18n=\"error_modal_no_phone_users_description_md\"></span>\n      <span ng-switch-when=\"PHONEBOOK_GET_CONTACTS_FAILED\" my-i18n=\"error_modal_phonebook_required_description\"></span>\n      <span ng-switch-when=\"USERNAME_INVALID\" my-i18n=\"error_modal_username_invalid_description\"></span>\n      <span ng-switch-when=\"USERNAME_OCCUPIED\" my-i18n=\"error_modal_username_occupied_description\"></span>\n      <span ng-switch-when=\"MEDIA_TYPE_NOT_SUPPORTED\" my-i18n=\"error_modal_media_not_supported_description\"></span>\n      <span ng-switch-when=\"PHONE_NUMBER_APP_SIGNUP_FORBIDDEN\" my-i18n=\"error_modal_app_signup_forbidden_md\">\n        <my-i18n-param name=\"signup-link\"><a href=\"https://telegram.org/dl\" target=\"_blank\">{0}</a></my-i18n-param>\n      </span>\n\n      <span ng-switch-when=\"USERNAME_NOT_OCCUPIED\" my-i18n=\"error_modal_username_not_found_description\"></span>\n      <span ng-switch-when=\"USER_NOT_MUTUAL_CONTACT\" my-i18n=\"error_modal_user_not_mutual_contact\"></span>\n      <span ng-switch-when=\"INVITE_HASH_INVALID\" my-i18n=\"error_modal_invite_link_invalid\"></span>\n      <span ng-switch-when=\"INVITE_HASH_EXPIRED\" my-i18n=\"error_modal_invite_link_invalid\"></span>\n      <span ng-switch-when=\"INVITE_HASH_EMPTY\" my-i18n=\"error_modal_invite_link_invalid\"></span>\n      <span ng-switch-when=\"CHANNEL_PRIVATE\" my-i18n=\"error_modal_channel_not_accessible\"></span>\n      <span ng-switch-when=\"PEER_FLOOD\" my-i18n=\"error_modal_not_contact_flood\">\n        <my-i18n-param name=\"more-info-link\"><a href=\"https://t.me/spambot\">{0}</a></my-i18n-param>\n      </span>\n      <span ng-switch-when=\"2FA_RECENT_CONFIRM\" my-i18n=\"error_modal_2fa_recent_confirm\"></span>\n      <span ng-switch-when=\"2FA_CONFIRM_WAIT_TIME\" my-i18n=\"error_modal_2fa_delayed_time_md\">\n        <my-i18n-param name=\"time\"><span ng-bind=\"error.waitTime | duration\"></span></my-i18n-param>\n      </span>\n      <span ng-switch-when=\"PHONECALLS_NOT_SUPPORTED\" my-i18n=\"error_modal_phonecalls_not_supported_description_md\">\n        <my-i18n-param name=\"user\"><strong my-peer-link=\"error.userID\"></strong></my-i18n-param>\n        <my-i18n-param name=\"download-link\"><a href=\"https://telegram.org/dl\" target=\"_blank\">{0}</a></my-i18n-param>\n        \n      </span>\n\n      <span ng-switch-when=\"CALLBACK_RESPONSE\" ng-bind-html=\"error.description_html\"></span>\n\n      <span ng-switch-when=\"UPDATE_SERVICE_NOTIFICATION\">\n        <div my-message-body=\"historyMessage\">\n          <div class=\"im_message_text\" dir=\"auto\"></div>\n          <div class=\"im_message_media\"></div>\n        </div>\n      </span>\n\n\n\n      <div ng-switch-default ng-switch=\"error.code\">\n        <span ng-switch-when=\"400\" my-i18n=\"error_modal_bad_request_description\"></span>\n        <span ng-switch-when=\"401\" my-i18n=\"error_modal_unauthorized_description\">\n          <my-i18n-param name=\"login-link\"><a href=\"#/login\">{0}</a></my-i18n-param>\n        </span>\n        <span ng-switch-when=\"403\" my-i18n=\"error_modal_forbidden_description\"></span>\n        <span ng-switch-when=\"404\" my-i18n=\"error_modal_not_found_description\"></span>\n        <span ng-switch-when=\"420\" my-i18n=\"error_modal_flood_description\"></span>\n        <span ng-switch-default my-i18n=\"error_modal_internal_description\"></span>\n      </div>\n\n    </div>\n\n    <div ng-if=\"error && error.input\" class=\"error_modal_details\" ng-switch=\"error.detailsShown\">\n      <textarea ng-switch-when=\"true\" rows=\"3\" onclick=\"this.select()\">Method: {{error.input || 'N/A'}}{{error.url ? \"\\nUrl: \" + error.url : ''}}\nResult: {{error.originalError ? error.originalError : (error.stack ? (error.name || '') + ' ' + (error.description || error.message) : error)}}</textarea>\n      <div ng-switch-default>\n        <a class=\"error_modal_details_link\" href=\"\" ng-click=\"error.detailsShown = true\" my-i18n=\"error_modal_tech_details\"></a>\n      </div>\n    </div>\n\n    <div ng-if=\"!error && description.length > 0\" class=\"error_modal_description\" ng-bind=\"description\"></div>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md btn-md-primary\" ng-click=\"$dismiss()\" my-focused>\n      <span my-i18n=\"modal_ok\"></span>\n    </button>\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/footer.html",
    "content": "<div class=\"footer_wrap\" ng-controller=\"AppFooterController\">\n\t<a class=\"footer_link\" href=\"https://telegram.org\" target=\"_blank\" my-i18n=\"head_about\"></a>\n  <a class=\"footer_link\" ng-click=\"openSettings()\" my-i18n=\"im_settings\"></a>\n  <a class=\"footer_link\" href=\"https://twitter.com/telegram_web\" target=\"_blank\" my-i18n=\"footer_twitter\"></a>\n</div>"
  },
  {
    "path": "app/partials/desktop/forwarded_messages.html",
    "content": "<div class=\"im_message_reply clearfix\" ng-class=\"{im_message_reply_thumbed: thumb !== false}\">\n  <div class=\"im_message_reply_border\"></div>\n  <div class=\"im_message_reply_thumb_wrap pull-left\" ng-if=\"thumb !== false\">\n    <img\n      class=\"im_message_reply_thumb\"\n      my-load-thumb\n      thumb=\"thumb\"\n      watch=\"true\"\n    />\n  </div>\n  <div class=\"im_message_reply_author\">\n    <span my-peer-link=\"fromID\" peer-watch=\"true\"></span>\n  </div>\n  <div class=\"im_message_reply_body\" ng-switch=\"singleMessage !== false\">\n    <div ng-switch-when=\"true\">\n      <span my-short-message=\"singleMessage\"></span>\n    </div>\n    <div ng-switch-default>\n      <span class=\"im_reply_message_service\">\n        <ng-pluralize count=\"count\"\n                      when=\"im_X_forwarded_messages\">\n        </ng-pluralize>\n      </span>\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/full_document.html",
    "content": "<div class=\"document_modal_image_wrap\">\n  <div class=\"img_fullsize_with_progress_wrap document_fullsize_with_progress_wrap\" ng-style=\"{width: frameWidth + 'px', height: frameHeight + 'px'}\">\n    <div class=\"img_fullsize_progress_overlay\">\n      <div class=\"img_fullsize_progress_wrap\" ng-style=\"{width: frameWidth + 'px', height: frameHeight + 'px'}\">\n        <div class=\"img_fullsize_progress progress tg_progress\">\n          <div class=\"progress-bar progress-bar-success\" style=\"width: {{document.progress.percent}}%\"></div>\n        </div>\n      </div>\n    </div>\n    <div class=\"img_fullsize_wrap\" ng-if=\"thumbSrc.length > 0\">\n      <img\n        class=\"img_fullsize\"\n        ng-src=\"{{thumbSrc}}\"\n        ng-style=\"{width: imageWidth + 'px', height: imageHeight + 'px'}\"\n      />\n    </div>\n  </div>\n  <div class=\"document_fullsize_wrap\" ng-click=\"toggleZoom(!zoomed)\">\n    <img class=\"document_fullsize_img\" />\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/full_gif.html",
    "content": "<a class=\"img_gif_with_progress_wrap\" ng-click=\"toggle($event)\">\n\n  <div class=\"img_gif_image_wrap\">\n\n    <div class=\"img_gif_meta\" ng-show=\"!isActive || needClick\" ng-switch=\"document.progress.enabled\">\n      <div ng-switch-when=\"true\" class=\"img_gif_meta_contents\">\n        <i class=\"icon icon-cancel\">\n          <i class=\"icon icon-bar\"></i>\n          <i class=\"icon icon-bar\"></i>\n        </i>\n        <div my-arc-progress=\"document.progress.percent\"></div>\n      </div>\n      <div ng-switch-default class=\"img_gif_label noselect img_gif_meta_contents\"><span class=\"copyonly\">[</span>GIF<span class=\"copyonly\">]</span></div>\n    </div>\n\n    <div ng-if=\"document.url\" ng-show=\"document.downloaded &amp;&amp; isActive\" ng-switch=\"document.mime_type == 'video/mp4'\">\n      <video ng-switch-when=\"true\" width=\"{{document.thumb.width}}\" height=\"{{document.thumb.height}}\" loop autoplay muted class=\"img_gif_video\">\n        <source ng-src=\"{{document.url}}\" type=\"video/mp4\">\n      </video>\n      <img ng-switch-default class=\"img_gif_image\" ng-src=\"{{document.url}}\" width=\"{{document.thumb.width}}\" height=\"{{document.thumb.height}}\" />\n    </div>\n    <img ng-hide=\"document.downloaded &amp;&amp; isActive\" class=\"img_gif_thumb\" my-load-thumb thumb=\"document.thumb\" />\n\n  </div>\n\n</a>"
  },
  {
    "path": "app/partials/desktop/full_photo.html",
    "content": "<div class=\"img_fullsize_with_progress_wrap\">\n  <div class=\"img_fullsize_progress_overlay\" ng-show=\"progress.enabled\">\n    <div class=\"img_fullsize_progress_wrap\">\n      <div class=\"img_fullsize_progress progress tg_progress\" ng-show=\"progress.percent > 0\">\n        <div class=\"progress-bar progress-bar-success\" ng-style=\"{width: progress.percent + '%'}\">\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"photo_full_wrap\">\n    <a class=\"photo_modal_image\">\n      <img class=\"photo_modal_image\"/>\n    </a>\n  </div>\n  <div class=\"photo_modal_error_wrap\" ng-if=\"error\">\n    <div class=\"photo_modal_error\" ng-if=\"error.html\" ng-bind-html=\"error.html\"></div>\n    <div class=\"photo_modal_error\" ng-if=\"error.text\" ng-bind=\"error.text\"></div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/full_round.html",
    "content": "<a class=\"img_round_with_progress_wrap\" ng-click=\"toggle($event)\">\n\n  <div class=\"img_round_image_wrap\" ng-style=\"::{width: document.thumb.width + 'px'}\" ng-class=\"message.pFlags.media_unread ? 'img_round_video_unread' : ''\">\n\n    <div class=\"img_round_meta\" ng-show=\"!isActive || needClick\" ng-switch=\"document.progress.enabled\">\n      <div ng-switch-when=\"true\" class=\"img_round_meta_contents\">\n        <i class=\"icon icon-cancel\">\n          <i class=\"icon icon-bar\"></i>\n          <i class=\"icon icon-bar\"></i>\n        </i>\n        <div my-arc-progress=\"document.progress.percent\"></div>\n      </div>\n      \n      <div ng-switch-default class=\"img_round_meta_contents\"><i class=\"icon icon-videoplay\"></i></div>\n    </div>\n\n    <div ng-if=\"document.url\" ng-show=\"document.downloaded &amp;&amp; isActive\" ng-switch=\"document.mime_type == 'video/mp4'\">\n      <video ng-switch-when=\"true\" width=\"{{document.thumb.width}}\" height=\"{{document.thumb.height}}\" class=\"img_round_video\">\n        <source ng-src=\"{{document.url}}\" type=\"video/mp4\">\n      </video>\n      <img ng-switch-default class=\"img_round_image\" ng-src=\"{{document.url}}\" width=\"{{document.thumb.width}}\" height=\"{{document.thumb.height}}\" />\n    </div>\n    <img ng-hide=\"document.downloaded &amp;&amp; isActive\" class=\"img_round_thumb\" my-load-thumb thumb=\"document.thumb\" />\n\n  </div>\n\n</a>"
  },
  {
    "path": "app/partials/desktop/full_video.html",
    "content": "<div class=\"img_fullsize_with_progress_wrap\" ng-style=\"{width: video.full.width + 'px', height: video.full.height + 'px'}\">\n  <div class=\"img_fullsize_progress_overlay\" ng-show=\"video.progress.enabled\">\n    <div class=\"img_fullsize_progress_wrap\" ng-style=\"{width: video.full.width + 'px', height: video.full.height + 'px'}\">\n      <div class=\"img_fullsize_progress progress tg_progress\">\n        <div class=\"progress-bar progress-bar-success\" style=\"width: {{video.progress.percent}}%\"></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"img_fullsize_wrap\" ng-if=\"!video.url\">\n    <img\n      class=\"img_fullsize\"\n      my-load-thumb\n      thumb=\"video.fullThumb\"\n    />\n  </div>\n  <div class=\"video_full_player\" ng-if=\"video.url\" ng-switch=\"player.quicktime\">\n    <embed ng-switch-when=\"true\" ng-src=\"{{video.url}}\" width=\"{{video.full.width}}\" height=\"{{video.full.height}}\" autoplay=\"true\" CONTROLLER=\"TRUE\" SHOWCONTROLS=\"TRUE\" controller=\"true\" loop=\"false\" pluginspace=\"http://www.apple.com/quicktime/\" />\n    <video ng-switch-default width=\"{{video.full.width}}\" height=\"{{video.full.height}}\" controls autoplay >\n      <source ng-src=\"{{video.url}}\" type=\"video/mp4\">\n    </video>\n  </div>\n  <div class=\"video_full_error_wrap\" ng-if=\"error\">\n    <div class=\"video_full_error\" ng-if=\"error.html\" ng-bind-html=\"error.html\"></div>\n    <div class=\"video_full_error\" ng-if=\"error.text\" ng-bind=\"error.text\"></div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/game_modal.html",
    "content": "<div class=\"modal_close_wrap\" ng-click=\"$close()\">\n  <div class=\"modal_close\"></div>\n</div>\n\n<div class=\"media_modal_bottom_panel_wrap\">\n  <div class=\"media_modal_bottom_panel\">\n    <div class=\"media_modal_bottom_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-click=\"forward()\"  title=\"{{'media_modal_forward' | i18n}}\">\n        <i class=\"media_modal_action_btn_forward\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_info_wrap pull-left\">\n      <a class=\"media_modal_author_photo pull-left\" my-peer-photolink=\"botID\" img-class=\"media_modal_author_photo\"></a>\n      <div class=\"media_modal_author_name\">\n        <a class=\"media_modal_author\" my-peer-link=\"botID\"></a>\n      </div>\n      <div class=\"media_modal_date\">\n        <a class=\"media_modal_date\" my-peer-link=\"botID\" username=\"true\"></a>\n      </div>\n    </div>\n\n    <div class=\"media_modal_title_wrap\" ng-bind-html=\"game.rTitle\"></div>\n  </div>\n</div>\n\n<div class=\"modal-dialog\">\n  <div class=\"modal-content\">\n    <div my-modal-width=\"{{game.full.width - 32}}\" class=\"media_modal_wrap embed_modal_wrap\" my-modal-position animation=\"no\">\n\n      <div class=\"modal-body\" ng-bind-html=\"game.full.html\" my-game-communication></div>\n\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/head.html",
    "content": "<div class=\"tg_page_head tg_head_wrap noselect clearfix\">\n  <div class=\"tg_try_desktop\" ng-if=\"try_desktop.shown\">\n    <span class=\"try_desktop_close\" ng-click=\"closeTryDesktop()\"></span>\n    <p class=\"try_desktop_text\"><my-i18n msgid=\"login_try_desktop\"><my-i18n-param name=\"telegram-link\"><a href=\"https://{{try_desktop.domain}}/\" target=\"_blank\">{{try_desktop.domain}}</a></my-i18n-param></my-i18n><a class=\"try_desktop_btn\" href=\"https://{{try_desktop.domain}}/\" target=\"_blank\" my-i18n=\"login_try_desktop_short_btn\"></a></p>\n  </div>\n  <div class=\"tg_head_split\">\n\n    <div class=\"tg_head_logo_wrap\">\n      <div class=\"tg_head_logo_dropdown dropdown\" dropdown>\n        <a class=\"tg_head_btn dropdown-toggle\" dropdown-toggle>\n          <span class=\"visually-hidden\" my-i18n=\"head_mainmenu\"></span>\n          <div class=\"icon-hamburger-wrap\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </div><i class=\"icon icon-tg-title\"></i>\n        </a>\n\n        <ul class=\"dropdown-menu\">\n          <li><a ng-click=\"openGroup()\">\n            <i class=\"icon icon-new-group\"></i><span my-i18n=\"im_new_group\"></span>\n          </a></li>\n          <li ng-if=\"!isEmpty.contacts\"><a ng-click=\"openContacts()\">\n            <i class=\"icon icon-contacts\"></i><span my-i18n=\"im_contacts\"></span>\n          </a></li>\n          <li><a ng-click=\"openSettings()\">\n            <i class=\"icon icon-settings\"></i><span my-i18n=\"im_settings\"></span>\n          </a></li>\n          <li><a ng-click=\"openFaq()\">\n            <i class=\"icon icon-faq\"></i><span my-i18n=\"head_telegram_faq\"></span>\n          </a></li>\n          <li><a href=\"\" ng-click=\"openChangelog()\">\n            <i class=\"icon icon-about\"></i><span my-i18n=\"head_about\"></span>\n          </a></li>\n        </ul>\n      </div>\n    </div>\n\n    <div class=\"tg_head_main_wrap\" ng-switch=\"offline\">\n      <div ng-switch-when=\"true\" class=\"tg_head_connecting_wrap\" ng-switch=\"offlineConnecting\">\n        <span ng-switch-default class=\"tg_head_connecting_text\"><my-i18n msgid=\"head_waiting_for_network\"></my-i18n><span my-loading-dots></span></span>\n        <a ng-switch-default class=\"tg_head_btn\" ng-click=\"retryOnline()\" my-i18n=\"head_retry\"></a>\n        <span ng-switch-when=\"true\" class=\"tg_head_connecting_text\"><my-i18n msgid=\"head_connecting\"></my-i18n><span my-loading-dots></span></span>\n      </div>\n\n      <div ng-switch-default ng-if=\"!!historyPeer.id\" class=\"tg_head_main_peer_wrap\">\n\n        <div class=\"tg_head_peer_dropdown tg_head_peer_media_dropdown dropdown\" dropdown>\n          <a class=\"tg_head_btn dropdown-toggle\" dropdown-toggle>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </a>\n          <ul class=\"dropdown-menu\">\n            <li><a ng-click=\"toggleEdit()\" my-i18n=\"head_select_messages\"></a></li>\n            <li class=\"divider ng-scope\"></li>\n            <li><a ng-click=\"toggleMedia('photos')\" my-i18n=\"head_media_photos\"></a></li>\n            <li><a ng-click=\"toggleMedia('video')\" my-i18n=\"head_media_video\"></a></li>\n            <li><a ng-click=\"toggleMedia('documents')\" my-i18n=\"head_media_documents\"></a></li>\n            <li><a ng-click=\"toggleMedia('music')\" my-i18n=\"head_media_music\"></a></li>\n            <li><a ng-click=\"toggleMedia('urls')\" my-i18n=\"head_media_links\"></a></li>\n            <li><a ng-click=\"toggleMedia('audio')\" my-i18n=\"head_media_audio\"></a></li>\n            <li><a ng-click=\"toggleMedia('round')\" my-i18n=\"head_media_round\"></a></li>\n            <li ng-if=\"isHistoryPeerGroup()\" class=\"divider ng-scope\"></li>\n            <li ng-if=\"isHistoryPeerGroup()\"><a ng-click=\"toggleMedia('mentions')\" my-i18n=\"head_media_mymentions\"></a></li>\n          </ul>\n        </div>\n\n        <a class=\"tg_head_btn tg_head_peer_search_btn\" ng-click=\"toggleMedia('search')\">\n          <i class=\"icon icon-search\"></i>\n        </a>\n\n        <a class=\"tg_head_btn tg_head_peer_return_btn\" ng-show=\"historyFilter.mediaType.length || historyState.skipped\" ng-click=\"returnToRecent()\" ng-switch=\"historyState.skipped\">\n          <span ng-switch-when=\"true\" my-i18n=\"im_show_recent_messages\"></span>\n          <span ng-switch-default my-i18n=\"im_show_all_messages\"></span>\n          <strong class=\"tg_head_peer_return_count\" ng-show=\"historyState.missedCount > 0\" ng-bind=\"'+' + historyState.missedCount\"></strong>\n        </a>\n\n        <div class=\"tg_head_peer_title_wrap\" ng-switch=\"historyFilter.mediaType\">\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"photos\">\n            <i class=\"icon icon-filter-photos\"></i><span my-i18n=\"im_media_photos\"></span>\n          </div>\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"video\">\n            <i class=\"icon icon-filter-video\"></i><span my-i18n=\"im_media_video\"></span>\n          </div>\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"documents\">\n            <i class=\"icon icon-filter-documents\"></i><span my-i18n=\"im_media_documents\"></span>\n          </div>\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"audio\">\n            <i class=\"icon icon-filter-audio\"></i><span my-i18n=\"im_media_audio\"></span>\n          </div>\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"round\">\n            <i class=\"icon icon-filter-audio\"></i><span my-i18n=\"im_media_round\"></span>\n          </div>\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"music\">\n            <i class=\"icon icon-filter-documents\"></i><span my-i18n=\"im_media_music\"></span>\n          </div>\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"urls\">\n            <span my-i18n=\"im_media_links\"></span>\n          </div>\n          <div class=\"tg_head_peer_media\" ng-switch-when=\"mentions\">\n            <span my-i18n=\"im_media_mentions\"></span>\n          </div>\n\n          <a class=\"tg_head_btn\" ng-switch-default ng-click=\"showPeerInfo()\">\n            <div class=\"tg_head_peer_info\">\n              <span class=\"tg_head_peer_title\" my-peer-link=\"historyPeer.id\" peer-watch=\"true\" dir=\"auto\" for-dialog=\"true\"></span>\n              <span class=\"tg_head_peer_status\" ng-switch=\"historyPeer.id > 0\">\n                <span ng-switch-when=\"true\" my-user-status=\"historyPeer.id\" for-dialog=\"true\"></span>\n                <span ng-switch-default my-chat-status=\"-historyPeer.id\"></span>\n              </span>\n            </div>\n          </a>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/desktop/im.html",
    "content": "<div my-head></div>\n\n<div class=\"im_page_wrap clearfix\" ng-class=\"{im_page_peer_not_selected: !curDialog.peer}\">\n\n  <div class=\"im_page_split clearfix\">\n\n    <div class=\"im_dialogs_col_wrap noselect\" ng-controller=\"AppImDialogsController\" my-dialogs ng-class=\"search.query.length > 0 ? 'im_dialogs_col_search' : ''\">\n      <div class=\"im_dialogs_panel\">\n        <div class=\"im_dialogs_search\">\n          <input class=\"form-control im_dialogs_search_field no_outline\" type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\" autocomplete=\"off\" />\n          <a class=\"im_dialogs_search_clear tg_search_clear\" ng-click=\"searchClear()\" ng-show=\"search.query.length\">\n            <i class=\"icon icon-search-clear\"></i>\n          </a>\n        </div>\n      </div>\n\n      <div my-dialogs-list class=\"im_dialogs_col\">\n        <div class=\"im_dialogs_wrap nano\">\n          <div class=\"im_dialogs_scrollable_wrap nano-content\">\n\n            <div class=\"im_dialogs_empty_wrap\" ng-if=\"isEmpty.dialogs && isEmpty.contacts\">\n              <h3 class=\"im_dialogs_empty_header\" my-i18n=\"im_no_contacts\"></h3>\n              <p class=\"im_dialogs_empty_lead\" my-i18n=\"im_get_started_long\"></p>\n              <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-click=\"importContact()\" my-i18n=\"im_add_contact\"></button>\n              <button ng-if=\"phonebookAvailable\" type=\"button\" class=\"btn btn-primary btn-sm im_dialogs_import_phonebook\" ng-click=\"importPhonebook()\" my-i18n=\"im_import_phonebook\"></button>\n            </div>\n\n            <ul class=\"nav nav-pills nav-stacked\">\n              <li class=\"im_dialog_wrap\" ng-if=\"searchPeer\">\n                <a class=\"im_dialog im_dialog_searchpeer disabled\" ng-mousedown=\"setSearchPeer()\">\n\n                  <div class=\"im_dialog_meta pull-right\">\n                    <div class=\"im_dialog_clear_searchpeer\">\n                      <!-- <i class=\"icon icon-clear-searchpeer\"></i> -->\n                      <i class=\"icon icon-search-clear\"></i>\n                    </div>\n                  </div>\n\n                  <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"searchPeer\" img-class=\"im_dialog_photo\" watch=\"true\" for-dialog=\"true\"></div>\n\n                  <div class=\"im_dialog_message_wrap\">\n\n                    <div class=\"im_dialog_peer\">\n                      <span my-peer-link=\"searchPeer\" for-dialog=\"true\"></span>\n                    </div>\n\n                    <div class=\"im_dialog_message\">\n                      <span class=\"\" my-i18n=\"conversation_search_peer\"></span>\n                    </div>\n\n                  </div>\n\n                </a>\n\n              </li>\n              <li class=\"im_dialog_wrap\" my-dialog dialog-message=\"dialogMessage\" ng-repeat=\"dialogMessage in dialogs track by dialogMessage.peerID\" ng-class=\"{active: curDialog.peerID == dialogMessage.peerID}\"></li>\n            </ul>\n\n            <div class=\"im_dialogs_contacts_wrap\" ng-show=\"myResults.length > 0\">\n              <h5 my-i18n=\"im_chat_contacts_title\"></h5>\n              <ul class=\"nav nav-pills nav-stacked\">\n                <li class=\"im_dialog_wrap\" ng-repeat=\"myResult in myResults track by myResult.id\" ng-class=\"{active: curDialog.peerID == myResult.id}\">\n                  <a class=\"im_dialog\" ng-mousedown=\"dialogSelect(myResult.peerString)\">\n                    <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"myResult.id\" img-class=\"im_dialog_photo\" watch=\"true\" for-dialog=\"true\"></div>\n                    <div class=\"im_dialog_message_wrap\">\n                      <div class=\"im_dialog_peer\">\n                        <span class=\"im_dialog_user\" my-peer-link=\"myResult.id\"  verified=\"true\" for-dialog=\"true\"></span>\n                      </div>\n                      <div class=\"im_dialog_message\" ng-switch=\"myResult.id > 0\">\n                        <span ng-switch-when=\"true\" class=\"im_dialog_message_text\" my-user-status=\"::myResult.id\" for-dialog=\"true\"></span>\n                        <span ng-switch-default class=\"im_dialog_message_text\" my-chat-status=\"::-myResult.id\"></span>\n                      </div>\n                    </div>\n                  </a>\n                </li>\n              </ul>\n            </div>\n\n            <div class=\"im_dialogs_contacts_wrap\" ng-show=\"foundPeers.length > 0\">\n              <h5 my-i18n=\"im_found_title\"></h5>\n              <ul class=\"nav nav-pills nav-stacked\">\n                <li class=\"im_dialog_wrap\" ng-repeat=\"foundPeer in foundPeers track by foundPeer.id\" ng-class=\"{active: curDialog.peerID == foundPeer.id}\">\n                  <a class=\"im_dialog\" ng-mousedown=\"dialogSelect(foundPeer.peerString)\">\n                    <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"foundPeer.id\" img-class=\"im_dialog_photo\" watch=\"true\" for-dialog=\"true\"></div>\n                    <div class=\"im_dialog_message_wrap\">\n                      <div class=\"im_dialog_peer\">\n                        <span class=\"im_dialog_user\" my-peer-link=\"foundPeer.id\"  verified=\"true\" for-dialog=\"true\"></span>\n                      </div>\n                      <div class=\"im_dialog_message\">\n                        <span class=\"im_dialog_message_text\" ng-switch=\"foundPeer.id > 0\">\n                          <span ng-bind=\"::'@' + foundPeer.username + ', '\"></span>\n                          <span ng-switch-when=\"true\" class=\"im_dialog_message_text\" my-user-status=\"::foundPeer.id\" for-dialog=\"true\"></span>\n                          <span ng-switch-default class=\"im_dialog_message_text\" my-chat-status=\"::-foundPeer.id\"></span>\n                        </span>\n                      </div>\n                    </div>\n                  </a>\n                </li>\n              </ul>\n            </div>\n\n            <div class=\"im_dialogs_messages_wrap\" ng-show=\"foundMessages.length > 0\">\n              <h5 my-i18n=\"im_messages\"></h5>\n              <ul class=\"nav nav-pills nav-stacked\">\n                <li class=\"im_dialog_wrap\" my-dialog dialog-message=\"dialogMessage\" ng-repeat=\"dialogMessage in foundMessages track by dialogMessage.mid\" ng-class=\"{active: curDialog.peerID == dialogMessage.peerID &amp;&amp; curDialog.messageID == dialogMessage.id}\"></li>\n              </ul>\n            </div>\n\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"im_history_col_wrap noselect\" ng-controller=\"AppImHistoryController\" ng-class=\"{im_history_loaded: state.loaded}\">\n\n      <div class=\"im_history_not_selected_wrap\" ng-switch=\"isEmpty.contacts &amp;&amp; isEmpty.dialogs\">\n        <div ng-switch-when=\"true\" class=\"im_history_no_dialogs_wrap\">\n          <h3 class=\"im_dialogs_empty_header\" my-i18n=\"im_get_started\"></h3>\n          <p class=\"im_dialogs_empty_lead\" my-i18n=\"im_welcome_text\"></p>\n          <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-click=\"openSettings()\" my-i18n=\"im_open_settings\"></button>\n        </div>\n        <div ng-switch-default class=\"im_history_not_selected\" my-vertical-position=\"0.35\" padding=\"true\" my-i18n=\"im_select_a_chat\"></div>\n      </div>\n\n      <div class=\"im_history_selected_loading_wrap im_history_loading\" my-vertical-position=\"0.4\" padding=\"true\">\n        <div my-arc-progress stroke=\"4\" width=\"32\"></div>\n      </div>\n\n      <div class=\"im_history_selected_wrap\">\n        <div my-history class=\"im_history_col\">\n          <div my-peer-pinned-message-bar=\"curDialog.peerID\" class=\"im_history_pinned_panel\"></div>\n\n          <div class=\"im_history_wrap nano\">\n\n            <div class=\"im_history_scrollable_wrap nano-content\">\n\n              <div class=\"im_history_scrollable\">\n                  <div class=\"im_history\" ng-class=\"{im_history_selectable: !historyState.botActions, im_history_select_active: historyState.selectActions}\">\n\n                    <div class=\"im_history_empty_wrap\" ng-show=\"state.empty\" ng-switch=\"state.mayBeHasMore\">\n                      <div ng-switch-when=\"true\" class=\"im_history_loading\" my-vertical-position=\"0.3\" padding=\"true\">\n                        <div my-arc-progress stroke=\"4\" width=\"32\"></div>\n                      </div>\n                      <div ng-switch-default class=\"im_history_empty\" my-vertical-position=\"0.25\" padding=\"true\" my-i18n=\"im_no_messages\"></div>\n                    </div>\n\n                    <div class=\"im_history_messages\" ng-class=\"{im_history_messages_group: historyPeer.id < 0}\">\n                      <div class=\"im_history_loading_more\" ng-class=\"{im_history_loading_more_active: state.moreActive}\">\n                        <div my-arc-progress stroke=\"3\" width=\"26\"></div>\n                      </div>\n                      <div class=\"im_history_messages_peer\" ng-show=\"peerHistory.peerID == historyPeer.id\" ng-repeat=\"peerHistory in peerHistories\">\n                        <div class=\"im_history_message_wrap\" my-message ng-repeat=\"historyMessage in peerHistory.messages\"></div>\n                      </div>\n                    </div>\n\n                  </div>\n\n                  <div class=\"im_history_typing_wrap\" ng-switch=\"historyState.skipped\">\n\n                    <div ng-switch-when=\"true\" class=\"im_history_loading_less\" ng-class=\"{im_history_loading_less_active: state.lessActive}\">\n                      <div my-arc-progress stroke=\"3\" width=\"26\"></div>\n                    </div>\n                    <div ng-switch-default class=\"im_history_typing\" ng-show=\"historyState.typing.length > 0 &amp;&amp; !historyFilter.mediaType &amp;&amp; !state.empty\" ng-switch=\"historyState.typing.length\" my-i18n>\n                      <span ng-switch-when=\"0\"></span>\n                      <span ng-switch-when=\"1\" my-i18n-format=\"im_one_typing\"></span>\n                      <span ng-switch-when=\"2\" my-i18n-format=\"im_two_typing\"></span>\n                      <span ng-switch-default my-i18n-format=\"im_many_typing\"></span>\n                      <my-i18n-param name=\"name1\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[0]\"></a></my-i18n-param>\n                      <my-i18n-param name=\"name2\"><a class=\"im_history_typing_author\" my-peer-link=\"historyState.typing[1]\"></a></my-i18n-param>\n                      <my-i18n-param name=\"count\">{{historyState.typing.length - 2}}</my-i18n-param>\n                      <my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n                    </div>\n                  </div>\n\n              </div>\n\n            </div>\n\n          </div>\n\n          <div class=\"im_bottom_panel_wrap\">\n\n            <div class=\"im_edit_panel_wrap clearfix\" ng-show=\"historyState.actions()\" ng-switch=\"historyState.actions()\" ng-class=\"historyState.channelActions !== false ? 'im_edit_small_panel_wrap' : ''\">\n              <div class=\"im_edit_panel_border\"></div>\n\n              <div ng-switch-when=\"bot\">\n                <a ng-show=\"historyState.botActions == 'param'\" class=\"btn btn-md btn-md-primary im_edit_cancel_link\" ng-click=\"cancelBot()\" my-i18n=\"modal_cancel\"></a>\n                <div class=\"im_edit_start_actions\">\n                  <a class=\"btn btn-primary im_start_btn\" ng-click=\"startBot()\" my-i18n=\"im_start\"></a>\n                </div>\n              </div>\n              <div ng-switch-when=\"channel\">\n                <div class=\"im_edit_start_actions\" ng-switch=\"historyState.channelActions\">\n                  <a ng-switch-when=\"join\" class=\"btn btn-primary im_start_btn\" ng-click=\"joinChannel()\" my-i18n=\"im_channel_join\"></a>\n                  <a ng-switch-when=\"mute\" class=\"btn btn-link im_start_btn\" ng-click=\"togglePeerMuted(true)\" my-i18n=\"im_channel_mute\"></a>\n                  <a ng-switch-when=\"unmute\" class=\"btn btn-link im_start_btn\" ng-click=\"togglePeerMuted(false)\" my-i18n=\"im_channel_unmute\"></a>\n                </div>\n              </div>\n              <div ng-switch-when=\"selected\" class=\"im_edit_selected_actions\" my-i18n>\n                <a class=\"btn btn-md btn-md-primary im_edit_cancel_link\" ng-click=\"selectedCancel()\" my-i18n=\"modal_cancel\"></a>\n                <a class=\"btn btn-primary im_edit_forward_btn\" ng-click=\"selectedForward()\" ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" my-i18n-format=\"im_forward\"></a>\n                <a class=\"btn btn-primary im_edit_delete_btn\" ng-click=\"selectedDelete()\" ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" my-i18n-format=\"im_delete\" ng-show=\"historyState.canDelete\"></a>\n                <a class=\"btn btn-primary im_edit_delete_btn\" ng-click=\"selectedReport()\" ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" my-i18n-format=\"im_report\" ng-show=\"historyState.canReport\"></a>\n                <a class=\"btn btn-primary im_edit_reply_btn\" ng-click=\"selectedReply()\" ng-show=\"selectedCount == 1 &amp;&amp; historyState.canReply\" my-i18n=\"im_reply\"></a>\n                <a class=\"btn btn-primary im_edit_reply_btn\" ng-click=\"selectedEdit()\" ng-show=\"selectedCount == 1 &amp;&amp; historyState.canEdit\" my-i18n=\"im_edit\"></a>\n                <my-i18n-param name=\"count\"><strong class=\"im_selected_count\" ng-show=\"selectedCount > 0\" ng-bind=\"selectedCount\"></strong></my-i18n-param>\n              </div>\n            </div>\n\n            <div class=\"im_send_panel_wrap noselect\" ng-show=\"!historyState.actions()\">\n\n              <div class=\"im_send_form_wrap1\">\n\n                <div class=\"im_send_form_wrap clearfix\" ng-controller=\"AppImSendController\" ng-class=\"{im_send_reply_form_wrap: draftMessage.replyToMsgID > 0}\">\n\n                  <a class=\"pull-right im_panel_peer_photo\" my-peer-photolink=\"historyPeer.id\" img-class=\"im_panel_peer_photo\" watch=\"true\" for-dialog=\"true\" ng-show=\"!draftMessage.isBroadcast\">\n                    <i class=\"icon im_panel_peer_online\" ng-show=\"historyPeer.id > 0 &amp;&amp; historyPeer.data.status._ == 'userStatusOnline'\"></i>\n                  </a>\n                  <a class=\"pull-left im_panel_own_photo\" my-peer-photolink=\"draftMessage.isBroadcast ? historyPeer.id : ownID\" img-class=\"im_panel_own_photo\" watch=\"true\" ng-click=\"openSettings()\" no-open=\"true\"></a>\n\n                  <div my-send-form draft-message=\"draftMessage\" mentions=\"mentions\" commands=\"commands\" reply-keyboard=\"historyState.replyKeyboard\"></div>\n\n                </div>\n\n              </div>\n\n            </div>\n\n          </div>\n\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n\n<div class=\"footer_wrap footer_empty\"></div>\n\n<toaster-container toaster-options=\"{'position-class': 'toast-bottom-center'}\"></toaster-container>\n"
  },
  {
    "path": "app/partials/desktop/import_contact_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"doImport()\" name=\"importContactForm\">\n\n      <h4 my-i18n=\"contact_import_modal_title\"></h4>\n\n      <div class=\"md-input-group\" my-labeled-input ng-class=\"{'md-input-error': importContactForm.phone.$invalid && importContactForm.phone.$touched}\" my-labeled-input>\n        <label class=\"md-input-label\" ng-switch=\"importContactForm.phone.$invalid && importContactForm.phone.$touched\">\n          <span ng-switch-when=\"true\" my-i18n=\"login_incorrect_number\"></span>\n          <span ng-switch-default my-i18n=\"contact_import_modal_phone\"></span>\n        </label>\n        <input class=\"md-input\" my-focused type=\"tel\" ng-model=\"importContact.phone\" ng-pattern=\"/^[-\\+\\(\\)\\d\\s]{7,32}$/\" my-submit-on-enter name=\"phone\" />\n      </div>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"contact_edit_modal_first_name\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"importContact.first_name\"  my-submit-on-enter />\n      </div>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"contact_edit_modal_last_name\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"importContact.last_name\"  my-submit-on-enter />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: progress.enabled}\" ng-click=\"doImport()\" ng-bind=\"progress.enabled ? 'contact_import_modal_submit_active' : 'contact_import_modal_submit' | i18n\" ng-disabled=\"progress.enabled\"></button>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/inactive.html",
    "content": "<div class=\"inactive_page_wrap\">\n  <div class=\"tg_head_split inactive_head\"></div>\n  <div class=\"im_page_wrap\">\n    <div class=\"inactive_page_content\" my-vertical-position=\"0.35\">\n      <a class=\"inactive_image\" ng-click=\"reload()\"></a>\n      <h3 class=\"inactive_title\" my-i18n=\"inactive_title\"></h3>\n      <div class=\"inactive_description\" my-i18n=\"inactive_description_md\"></div>\n      <div class=\"inactive_actions\">\n        <button class=\"btn btn-lg btn-md btn-md-primary\" ng-click=\"reload()\" my-i18n=\"inactive_reload_btn\" my-focused></button>\n      </div>\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/inline_results.html",
    "content": "<a ng-if=\"botResults.switch_pm !== undefined\" class=\"inline_switch_pm\" ng-bind-html=\"botResults.switch_pm.rText\" data-inlineid=\"_switch_pm_{{botResults.switch_pm.start_param}}\"></a>\n\n<ul class=\"inline_results_wrap composer_dropdown\">\n  <li class=\"inline_result_wrap\" ng-class=\"'inline_result_' + result.type\" ng-repeat=\"result in botResults.results track by result.qID\" ng-switch=\"result.type\">\n\n    <a ng-switch-when=\"gif\" class=\"img_gif_with_progress_wrap\" data-inlineid=\"{{result.qID}}\" ng-style=\"::{width: result.thumbW, height: result.thumbH}\" ng-switch=\"result._\">\n      <div class=\"inline_result_ind\"></div>\n      <div ng-switch-when=\"botInlineMediaResult\" ng-switch=\"result.document.url !== undefined\" class=\"inline_result_gif_mtproto\">\n        <div ng-switch-when=\"true\" ng-switch=\"result.document.mime_type == 'video/mp4'\">\n          <video ng-switch-when=\"true\" width=\"{{result.thumbW}}\" height=\"{{result.thumbH}}\" loop autoplay muted class=\"img_gif_video\">\n            <source ng-src=\"{{result.document.url}}\" type=\"video/mp4\">\n          </video>\n          <img ng-switch-default class=\"img_gif_image\" ng-src=\"{{result.document.url}}\" width=\"{{result.thumbW}}\" height=\"{{result.thumbH}}\" />\n        </div>\n        <div ng-switch-default class=\"img_gif_image_wrap\">\n          <img class=\"img_gif_thumb\" my-load-thumb thumb=\"result.document.thumb\" width=\"{{result.thumbW}}\" height=\"{{result.thumbH}}\" />\n        </div>\n      </div>\n      <div ng-switch-default ng-switch=\"result.contentUrl !== undefined\" class=\"inline_result_gif_http\">\n        <div ng-switch-when=\"true\" ng-switch=\"result.content_type == 'video/mp4'\">\n          <video ng-switch-when=\"true\" width=\"{{result.thumbW}}\" height=\"{{result.thumbH}}\" loop autoplay muted class=\"img_gif_video\">\n            <source ng-src=\"{{result.contentUrl}}\" type=\"video/mp4\">\n          </video>\n          <img ng-switch-default class=\"img_gif_image\" ng-src=\"{{result.contentUrl}}\" width=\"{{result.thumbW}}\" height=\"{{result.thumbH}}\" />\n        </div>\n        <img ng-switch-default ng-if=\"result.thumbUrl !== undefined\" class=\"img_gif_thumb\" width=\"{{result.thumbW}}\" height=\"{{result.thumbH}}\" ng-src=\"{{result.thumbUrl}}\" />\n      </div>\n    </a>\n\n    <a ng-switch-when=\"sticker\" data-inlineid=\"{{result.qID}}\" ng-style=\"::{width: result.thumbW, height: result.thumbH}\">\n      <div class=\"inline_result_ind\"></div>\n      <div class=\"inline_result_sticker_image\" my-load-sticker document=\"result.document\" dim=\"{width: result.thumbW, height: result.thumbH}\"></div>\n    </a>\n\n    <a ng-switch-when=\"photo\" data-inlineid=\"{{result.qID}}\" ng-style=\"::{width: result.thumbW, height: result.thumbH}\" ng-switch=\"result._\">\n      <div class=\"inline_result_ind\"></div>\n      <div ng-switch-when=\"botInlineMediaResult\" class=\"inline_result_photo_mtproto\">\n        <img\n          class=\"inline_result_photo_image\"\n          my-load-thumb\n          thumb=\"result.thumb\"\n          ng-style=\"::{width: result.thumbW, height: result.thumbH}\"\n        />\n      </div>\n      <div ng-switch-default class=\"inline_result_photo_http\">\n        <img ng-if=\"result.thumbUrl !== undefined\" class=\"inline_result_photo_image\" width=\"{{result.thumbW}}\" height=\"{{result.thumbH}}\" ng-src=\"{{result.thumbUrl}}\" />\n      </div>\n    </a>\n\n    <a ng-switch-default class=\"inline_result_article clearfix\" data-inlineid=\"{{result.qID}}\">\n      <div class=\"inline_article_thumb_wrap pull-left\" ng-switch=\"result.thumb !== undefined ? 'thumb' : (result.thumbUrl !== undefined ? 'thumbHttp' : (result.send_message.geo ? 'geo' : false))\">\n        <img ng-switch-when=\"thumb\" class=\"inline_article_thumb\" my-load-thumb\n          thumb=\"result.thumb\"/>\n        <img ng-switch-when=\"thumbHttp\" class=\"inline_article_thumb\" ng-src=\"{{result.thumbUrl}}\"/>\n        <img\n          ng-switch-when=\"geo\"\n          class=\"inline_article_thumb\"\n          my-geo-point-map=\"result.send_message.geo\"\n          width=\"50\"\n          height=\"50\"\n        />\n        <div ng-switch-default class=\"inline_article_thumb_initials\" ng-bind=\"result.initials\"></div>\n      </div>\n      <div class=\"inline_article_content_wrap\">\n        <div class=\"inline_article_title\" ng-if=\"::result.title.length > 0\" ng-bind-html=\"::result.rTitle\"></div>\n        <div class=\"inline_article_description\" ng-if=\"::result.description.length > 0\" ng-bind-html=\"::result.rDescription\"></div>\n        <div class=\"inline_article_url\" ng-if=\"::result.url.length > 0\" ng-bind=\"::result.url\"></div>\n      </div>\n    </a>\n\n  </li>\n</ul>"
  },
  {
    "path": "app/partials/desktop/lang_footer.html",
    "content": "<div class=\"footer_wrap\" ng-controller=\"AppLangSelectController\">\n\t<span ng-repeat=\"locale in ::supportedLocales\">\n\t  <a class=\"footer_lang_link\" ng-class=\"{active: curLocale == locale, disabled: curLocale == locale}\" ng-disabled=\"curLocale == locale\" ng-click=\"localeSelect(locale)\" ng-bind=\"langNames[locale]\"></a>\n\t  <span ng-if=\"!$last\" class=\"footer_link_divider\"></span>\n\t</span>\n</div>"
  },
  {
    "path": "app/partials/desktop/login.html",
    "content": "<div class=\"login_page_wrap\" my-custom-background=\"#e7ebf0\">\n  <div class=\"login_try_desktop\" ng-if=\"try_desktop.shown\">\n    <span class=\"try_desktop_close\" ng-click=\"closeTryDesktop()\"></span>\n    <p class=\"try_desktop_text\" my-i18n=\"login_try_desktop\"><my-i18n-param name=\"telegram-link\"><a href=\"https://{{try_desktop.domain}}/\" target=\"_blank\">{{try_desktop.domain}}</a></my-i18n-param></p>\n    <a class=\"try_desktop_btn\" href=\"https://{{try_desktop.domain}}/\" target=\"_blank\" my-i18n=\"login_try_desktop_btn\"></a>\n  </div>\n  <div class=\"login_head_bg\"></div>\n  <div class=\"login_page\">\n    <div class=\"login_head_wrap clearfix\" ng-switch=\"progress.enabled\">\n      <div ng-switch-when=\"true\" class=\"login_head_submit_progress\">\n        <my-i18n ng-if=\"!credentials.phone_code_hash\" msgid=\"login_generating_key\"></my-i18n><my-i18n ng-if=\"credentials.phone_code_hash &amp;&amp; !credentials.phone_code_valid\" msgid=\"login_checking_code\"></my-i18n><my-i18n ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.phone_unoccupied\" msgid=\"login_signing_up\"></my-i18n><my-i18n ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.password_needed\" msgid=\"login_checking_password\"></my-i18n><span my-loading-dots></span>\n      </div>\n      <div ng-switch-default class=\"login_head_submit_wrap\">\n        <a class=\"login_head_submit_btn\" ng-if=\"!credentials.phone_code_hash\" ng-click=\"sendCode()\">\n          <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n        </a>\n        <a class=\"login_head_submit_btn\" ng-if=\"credentials.phone_code_hash &amp;&amp; !credentials.phone_code_valid\" ng-click=\"logIn()\">\n          <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n        </a>\n        <a class=\"login_head_submit_btn\" ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.phone_unoccupied\" ng-click=\"logIn(true)\">\n          <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n        </a>\n        <a class=\"login_head_submit_btn\" ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.password_needed\" ng-click=\"checkPassword()\">\n          <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n        </a>\n      </div>\n      <a class=\"login_head_logo_link\" href=\"https://telegram.org\" target=\"_blank\">\n        <i class=\"icon icon-tg-logo\"></i><i class=\"icon icon-tg-title\"></i>\n      </a>\n    </div>\n\n    <div class=\"login_form_wrap\">\n      <div class=\"error\" ng-if=\"error.message\" ng-bind=\"error.message\"></div>\n\n      <form name=\"mySendCodeForm\" ng-if=\"!credentials.phone_code_hash\" ng-submit=\"sendCode()\">\n        <h3 class=\"login_form_head\" my-i18n=\"login_sign_in\"></h3>\n        <p class=\"login_form_lead\" my-i18n=\"login_enter_number_description_md\"><!--\n          --><my-i18n-param name=\"apps-link\"><!--\n            --><a href=\"https://telegram.org/apps\" target=\"_blank\">{0}</a><!--\n          --></my-i18n-param><!--\n        --></p>\n\n\n        <div class=\"md-input-group md-input-has-value login_phone_country_input_group\" ng-click=\"chooseCountry()\">\n          <label class=\"md-input-label\" my-i18n=\"login_country_select_placeholder\"></label>\n          <div autocomplete=\"off\" class=\"md-input\" ng-bind=\"credentials.phone_country_name\"></div>\n        </div>\n\n        <div class=\"login_phone_groups_wrap clearfix\">\n\n          <div class=\"md-input-group login_phone_code_input_group\" ng-class=\"{'md-input-error': error.field == 'phone'}\" my-labeled-input>\n            <label class=\"md-input-label\" my-i18n=\"login_code_input_placeholder\"></label>\n            <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"phone_country\" type=\"tel\" ng-model=\"credentials.phone_country\" />\n          </div>\n\n          <div class=\"md-input-group login_phone_num_input_group\" ng-class=\"{'md-input-error': error.field == 'phone'}\" my-labeled-input ng-switch=\"error.field == 'phone'\">\n            <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_number\"></label>\n            <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_tel_input_placeholder\"></label>\n            <input required autocomplete=\"off\" my-submit-on-enter class=\"md-input\" my-focus-on=\"country_selected\" name=\"phone_number\" type=\"tel\" ng-model=\"credentials.phone_number\" />\n          </div>\n\n        </div>\n        <div class=\"login_form_messaging\" ng-show=\"progress.enabled\" my-i18n=\"login_generating_keys_info\"></div>\n      </form>\n\n      <form name=\"myLoginForm\" ng-if=\"credentials.phone_code_hash &amp;&amp; !credentials.phone_code_valid\" ng-submit=\"logIn()\">\n        <h3 class=\"login_phone_head\"><span ng-bind=\"credentials.phone_country\"></span> <span ng-bind=\"credentials.phone_number\"></span></h3>\n        <div class=\"login_edit_phone\"><a ng-click=\"editPhone()\" my-i18n=\"login_edit_number\"></a></div>\n\n        <div ng-switch=\"credentials.type._\">\n          <p ng-switch-when=\"auth.sentCodeTypeApp\" class=\"login_smscode_lead\" my-i18n=\"login_enter_code_label_md\"></p>\n          <p ng-switch-when=\"auth.sentCodeTypeCall\" class=\"login_smscode_lead\" my-i18n=\"login_enter_call_code_label_md\"></p>\n          <p ng-switch-default class=\"login_smscode_lead\" my-i18n=\"login_enter_sms_code_label_md\"></p>\n        </div>\n\n        <div ng-if=\"nextPending.type\" ng-switch=\"nextPending.remaining > 0\">\n          <p ng-switch-when=\"true\" class=\"login_smscode_lead\">\n            <span ng-switch=\"nextPending.type._\" my-i18n>\n              <span ng-switch-when=\"auth.codeTypeCall\" my-i18n-format=\"login_call_remaining\"></span>\n              <span ng-switch-default my-i18n-format=\"login_code_remaining\"></span>\n              <my-i18n-param name=\"remaining\" ng-bind=\"nextPending.remaining | duration\"></my-i18n-param>\n            </span>\n          </p>\n          <p ng-switch-default class=\"login_smscode_lead\" ng-switch=\"nextPending.progress\">\n            <a ng-switch-when=\"true\" ng-disabled class=\"disabled\">\n              <span my-i18n=\"login_code_requesting\"></span><span my-loading-dots></span>\n            </a>\n            <a ng-switch-default ng-click=\"sendNext()\" ng-switch=\"nextPending.type._\">\n              <span ng-switch-when=\"auth.codeTypeCall\" my-i18n=\"login_code_not_received_call\"></span>\n              <span ng-switch-default my-i18n=\"login_code_not_received\"></span>\n            </a>\n          </p>\n        </div>\n\n        <div class=\"md-input-group md-input-group-centered\" ng-class=\"{'md-input-error': error.field == 'phone_code'}\" my-labeled-input ng-switch=\"error.field == 'phone_code'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_sms_code\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_number_input_placeholder\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"phone_code\" type=\"tel\" ng-model=\"credentials.phone_code\" required />\n        </div>\n      </form>\n\n      <form name=\"myFullNameForm\" ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.phone_unoccupied\" ng-submit=\"logIn(true)\">\n        <h3 class=\"login_form_head\" my-i18n=\"login_your_info\"></h3>\n        <p class=\"login_form_lead\" my-i18n=\"login_fulll_name_label\"></p>\n\n        <div class=\"md-input-group\" ng-class=\"{'md-input-error': error.field == 'first_name'}\" my-labeled-input ng-switch=\"error.field == 'first_name'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_first_name\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_first_name\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"first_name\" type=\"text\" ng-model=\"credentials.first_name\" my-submit-on-enter required />\n        </div>\n\n        <div class=\"md-input-group\" ng-class=\"{'md-input-error': error.field == 'last_name'}\" my-labeled-input ng-switch=\"error.field == 'last_name'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_last_name\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_last_name\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" name=\"last_name\" type=\"text\" ng-model=\"credentials.last_name\" my-submit-on-enter />\n        </div>\n\n      </form>\n\n      <form name=\"myPasswordForm\" ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.password_needed\" ng-submit=\"checkPassword()\">\n        <h3 class=\"login_form_head\" my-i18n=\"login_password_title\"></h3>\n        <p class=\"login_form_lead\" my-i18n=\"login_password_label\"></p>\n\n        <div class=\"md-input-group\" ng-class=\"{'md-input-error': error.field == 'password'}\" my-labeled-input ng-switch=\"error.field == 'password'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_password\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_password\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"password\" type=\"password\" ng-model=\"credentials.password\" my-submit-on-enter required />\n        </div>\n\n        <p ng-if=\"password.hint.length > 0\" class=\"login_form_hint\" ng-bind=\"password.hint\"></p>\n\n        <div class=\"login_forgot_button\">\n          <button class=\"btn btn-md\" ng-click=\"forgotPassword($event)\" my-i18n=\"login_password_forgot_link\"></button>\n        </div>\n\n        <div ng-if=\"canReset\" class=\"login_reset_button\">\n          <button class=\"btn btn-md btn-md-danger\" ng-click=\"resetAccount($event)\" my-i18n=\"login_account_reset\"></button>\n        </div>\n\n      </form>\n\n    </div>\n\n    <div ng-switch=\"about.shown\">\n      <div ng-switch-when=\"true\" class=\"login_footer_about_wrap\" my-scroll-to-on=\"$init\">\n        <h3><span my-i18n=\"login_about_title\"></span><a ng-click=\"about.shown = false\" class=\"login_footer_about_hide\" my-i18n=\"login_about_hide\"></a></h3>\n        <p my-i18n=\"login_about_desc1_md\"></p>\n        <p my-i18n=\"login_about_desc2_md\"></p>\n        <p my-i18n=\"login_about_desc3_md\">\n          <my-i18n-param name=\"source-link\">\n            <a href=\"https://github.com/zhukov/webogram\" target=\"_blank\">{0}</a>\n          </my-i18n-param>\n        </p>\n      </div>\n      <div ng-switch-default class=\"login_footer_wrap\">\n        <p my-i18n=\"login_about_intro\"></p>\n        <a class=\"logo_footer_learn_more_link\" href=\"\" ng-click=\"about.shown = true\" my-i18n=\"login_about_learn\"></a>\n      </div>\n\n    </div>\n  </div>\n\n</div>\n\n"
  },
  {
    "path": "app/partials/desktop/media_modal_layout.html",
    "content": "<div tabindex=\"-1\" role=\"dialog\" class=\"modal\" ng-style=\"{'z-index': 1050 + index*10}\" ng-click=\"close($event)\"  modal-transclude></div>"
  },
  {
    "path": "app/partials/desktop/megagroup_edit_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateChannel()\">\n\n      <h4 my-i18n=\"channel_edit_modal_title\"></h4>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"group_edit_name\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"channel.title\" />\n      </div>\n\n      <div class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"group_edit_about\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"channel.about\" />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: channel.updating}\" ng-click=\"updateChannel()\" ng-bind=\"channel.updating ? 'group_edit_submit_active' : 'group_edit_submit' | i18n\" ng-disabled=\"channel.updating\"></button>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/message.html",
    "content": " <div class=\"im_message_outer_wrap hasselect\" ng-click=\"toggleMessage(historyMessage.mid, $event)\" data-msg-id=\"{{::historyMessage.id}}\">\n\n  <div class=\"im_message_wrap clearfix\" ng-switch=\"::historyMessage._ == 'messageService'\">\n\n    <div class=\"im_service_message_wrap\" ng-switch-when=\"true\" ng-switch=\"historyMessage.action._ == 'messageActionBotIntro'\">\n      <div ng-switch-when=\"true\" class=\"im_bot_intro_message_wrap\">\n        <div class=\"im_bot_intro_message_header\" my-i18n=\"message_service_bot_intro_header\"></div>\n        <div class=\"im_bot_intro_message\" ng-bind-html=\"::historyMessage.action.rDescription\"></div>\n      </div>\n      <div ng-switch-default class=\"im_service_message\">\n        <a class=\"im_message_author\" ng-if=\"::historyMessage.fromID > 0\" my-peer-link=\"historyMessage.fromID\" short=\"historyMessage.peerID > 0\" color=\"historyMessage.peerID < 0\" no-watch=\"true\"></a>\n        <span class=\"im_message_service\" my-service-message=\"historyMessage\"></span>\n      </div>\n\n      <a ng-if=\"::historyMessage.action._ == 'messageActionChatEditPhoto' || historyMessage.action._ == 'messageActionChannelEditPhoto'\" class=\"im_service_message_photo_thumb\" href=\"\" ng-click=\"openPhoto(historyMessage.action.photo.id)\">\n        <img\n          class=\"im_service_message_photo_thumb\"\n          my-load-thumb\n          thumb=\"historyMessage.action.photo.thumb\"\n        />\n      </a>\n\n    </div>\n\n    <div ng-switch-default class=\"im_content_message_wrap\" ng-class=\"::[historyMessage.pFlags.out ? 'im_message_out' : 'im_message_in', historyMessage.fwdFromID ? 'im_message_fwd' : '']\">\n      <i class=\"icon icon-select-tick\"></i>\n\n      <a class=\"im_message_error_btn\" ng-if=\"::historyMessage.pending || historyMessage.error || false\" ng-click=\"historyMessage.send()\">\n        <i class=\"icon-message-status\" tooltip=\"{{'message_action_retry' | i18n}}\"></i>\n      </a>\n      <i ng-if=\"::historyMessage.pFlags.unread &amp;&amp; historyMessage.pFlags.out || historyMessage.pending || false\" class=\"icon-message-status\" ng-show=\"!historyMessage.error\"></i>\n\n      <a class=\"im_message_from_photo pull-left\" my-peer-photolink=\"::historyMessage.fromID\" img-class=\"im_message_from_photo\"></a>\n\n      <div class=\"im_message_meta pull-right text-right noselect\">\n        <div class=\"im_message_views_wrap\" ng-if=\"::!historyMessage.fwdFromID && historyMessage.views > 0\">\n          <div class=\"im_message_views\">\n            <i class=\"icon-message-views\"></i><span class=\"im_message_views_cnt\" my-message-views=\"historyMessage.mid\"></span>\n          </div>\n        </div>\n        <span class=\"im_message_date clickable\">\n          <span class=\"im_message_edited\" my-message-edited=\"historyMessage.mid\"></span>\n          <span class=\"im_message_date_text nocopy\" data-content=\"{{::historyMessage.date | time}}\"></span>\n        </span>\n      </div>\n\n      <div class=\"im_message_body\" ng-class=\"::{im_message_body_media: historyMessage._ == 'message' &amp;&amp; historyMessage.media ? true : false}\">\n\n        <span class=\"im_message_author_wrap\">\n          <span class=\"copyonly\">[<span ng-bind=\"::historyMessage.date | time\"></span>] </span><a class=\"im_message_author\" my-peer-link=\"historyMessage.fromID\" short=\"historyMessage.peerID > 0\" color=\"historyMessage.peerID < 0\" no-watch=\"true\" saved-from=\"historyMessage.savedFrom\"></a><a ng-if=\"::historyMessage.viaBotID && !historyMessage.fwdFromID\" class=\"im_message_author_via\" ng-click=\"selectInlineBot(historyMessage.viaBotID, $event)\"><span class=\"copyonly\">&nbsp;</span><span my-i18n=\"message_via_bot\"><my-i18n-param name=\"bot\"><span class=\"im_message_fwd_author\" my-peer-link=\"historyMessage.viaBotID\" username=\"true\" no-watch=\"true\"></span></my-i18n-param></span></a><span class=\"copyonly\">:</span><span class=\"im_message_author_admin\" my-message-admin-badge=\"historyMessage\"></span>\n        </span>\n\n\n        <a class=\"im_message_reply_wrap\" my-reply-message=\"::historyMessage.reply_to_mid\" ng-if=\"::historyMessage.reply_to_mid\"></a>\n\n        <div ng-if=\"::historyMessage.fwdFromID || false\" class=\"im_message_fwd_from\">\n          <span class=\"copyonly\"><span my-i18n=\"message_forwarded_message\"></span>:&nbsp;</span>\n          <a class=\"im_message_fwd_photo pull-left\" my-peer-photolink=\"::historyMessage.fwdFromID\" img-class=\"im_message_fwd_photo\"></a>\n          <div class=\"im_message_fwd_author_wrap\">\n            <a class=\"im_message_fwd_author\" my-peer-link=\"historyMessage.fwdFromID\" post-id=\"historyMessage.fwdPostID\"></a><a ng-if=\"::historyMessage.viaBotID\" class=\"im_message_fwd_via\" ng-click=\"selectInlineBot(historyMessage.viaBotID, $event)\"><span class=\"copyonly\">&nbsp;</span><span my-i18n=\"message_via_bot\"><my-i18n-param name=\"bot\"><span class=\"im_message_fwd_author\" my-peer-link=\"historyMessage.viaBotID\" username=\"true\" no-watch=\"true\"></span></my-i18n-param></span></a><span class=\"copyonly\">&nbsp;[</span><span class=\"im_message_fwd_date\" ng-bind=\"::historyMessage.fwd_from.date | dateMedium\"></span><span class=\"copyonly\">]&nbsp;</span>\n            <span class=\"im_message_views_inline\" ng-if=\"::historyMessage.views > 0\">\n              <i class=\"icon-message-views\"></i><span class=\"im_message_views_cnt\" my-message-views=\"historyMessage.mid\"></span>\n            </span>\n          </div>\n        </div>\n\n        <div my-message-body=\"historyMessage\">\n          <div class=\"im_message_text\" dir=\"auto\"></div>\n          <div class=\"im_message_media\"></div>\n          <div class=\"im_message_sign\"></div>\n          <div class=\"im_message_keyboard\"></div>\n        </div>\n\n\n      </div>\n\n    </div>\n  </div>\n\n</div>\n\n"
  },
  {
    "path": "app/partials/desktop/message_attach_contact.html",
    "content": "<div class=\"im_message_contact\">\n  <a ng-if=\"::media.user_id > 0\"  class=\"im_message_contact_photo pull-left\" my-peer-photolink=\"media.user_id\" img-class=\"im_message_contact_photo\" user-override=\"media\"></a>\n  <div class=\"im_message_contact_name\" ng-switch=\"media.user_id > 0\">\n    <a ng-switch-when=\"true\" my-peer-link=\"media.user_id\" user-override=\"media\"></a>\n    <span ng-switch-default ng-bind-html=\"::media.rFullName\"></span>\n  </div>\n  <div class=\"im_message_contact_phone\" ng-bind=\"::media.phone_number | phoneNumber\"></div>\n</div>"
  },
  {
    "path": "app/partials/desktop/message_attach_document.html",
    "content": "<div ng-switch=\"::media.document.type\" data-doc-id=\"{{::media.document.id}}\">\n\n  <div ng-switch-when=\"gif\" my-load-gif document=\"media.document\"></div>\n\n  <div ng-switch-when=\"round\" my-load-round document=\"media.document\"></div>\n\n  <div ng-switch-when=\"sticker\" my-load-sticker document=\"media.document\" open=\"true\"></div>\n\n  <div ng-switch-when=\"voice\" class=\"im_message_audio\">\n    <div my-audio-player audio=\"media.document\"></div>\n  </div>\n\n  <div ng-switch-when=\"audio\" class=\"im_message_audio\">\n    <div my-audio-player audio=\"media.document\"></div>\n  </div>\n\n  <div ng-switch-when=\"video\" class=\"im_message_video im_message_document_thumbed\">\n    <a class=\"im_message_video_thumb\" ng-click=\"videoOpen()\" ng-style=\"::{width: media.document.thumb.width + 'px'}\">\n      <span class=\"im_message_video_duration nocopy\" data-content=\"{{::media.document.duration | duration}}\"></span>\n      <i class=\"icon icon-videoplay\"></i>\n      <img\n        class=\"im_message_video_thumb im_message_video_thumb_blurred\"\n        my-load-thumb\n        thumb=\"media.document.thumb\"\n      />\n    </a>\n\n    <div class=\"im_message_document_info\">\n      <div class=\"im_message_document_name_wrap\">\n        <span class=\"copyonly\">[</span><span class=\"im_message_document_name\" my-i18n=\"message_attach_video_video\"></span><span class=\"copyonly\">&nbsp;<span  ng-bind=\"::media.document.duration | duration\"></span>]</span>\n        <span class=\"im_message_document_size\" ng-if=\"!media.document.progress.enabled\" ng-bind=\"::media.document.size | formatSize\"></span>\n        <span class=\"im_message_document_size\" ng-if=\"media.document.progress.enabled\" ng-bind=\"media.document.progress | formatSizeProgress\"></span>\n      </div>\n      <div class=\"im_message_document_actions noselect\" ng-if=\"!media.document.progress.enabled\">\n        <a href=\"\" ng-click=\"docSave()\" ng-switch=\"media.document.downloaded\">\n          <span class=\"nocopy\" ng-switch-when=\"true\" my-i18n=\"message_attach_video_save\"></span>\n          <span class=\"nocopy\" ng-switch-default my-i18n=\"message_attach_video_download\"></span>\n        </a>\n        <a class=\"nocopy\" href=\"\" ng-click=\"videoOpen()\" my-i18n=\"message_attach_video_play\"></a>\n      </div>\n      <div class=\"clearfix im_message_cancelable_progress_wrap\" ng-if=\"media.document.progress.enabled\">\n        <a class=\"im_message_media_progress_cancel pull-right nocopy\" ng-click=\"media.document.progress.cancel()\" my-i18n=\"modal_cancel\"></a>\n        <div class=\"im_message_download_progress_wrap\">\n          <div class=\"progress tg_down_progress\">\n            <div class=\"progress-bar progress-bar-success\" ng-style=\"{width: media.document.progress.percent + '%'}\"></div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div ng-switch-default class=\"im_message_document clearfix\" ng-class=\"{im_message_document_thumbed: !!media.document.thumb, im_message_document_progress: media.document.progress.enabled}\">\n\n    <a ng-if=\"::!media.document.thumb\" class=\"im_message_file_button\" ng-click=\"docOpen()\" ng-class=\"{im_message_file_button_dl_doc: media.document.downloaded}\">\n      <i class=\"im_message_file_button_icon\"></i>\n    </a>\n    <a ng-if=\"::media.document.thumb\" ng-click=\"docOpen()\">\n      <div class=\"im_message_document_thumb_wrap\">\n        <img\n          class=\"im_message_document_thumb\"\n          my-load-thumb\n          thumb=\"media.document.thumb\"\n        />\n      </div>\n    </a>\n\n    <div class=\"im_message_document_info\">\n      <div class=\"im_message_document_name_wrap\">\n        <a href=\"\" ng-attr-title=\"{{media.document.file_name}}\" ng-attr-data-name=\"{{media_file_name_without_ext}}\" ng-attr-data-ext=\"{{media_file_ext}}\" ng-click=\"docOpen()\" class=\"im_message_document_name\"></a><span class=\"copyonly\">[<span ng-bind=\"::media.document.file_name\"></span>]</span>\n        <span class=\"im_message_document_size\" ng-if=\"!media.document.progress.enabled\" ng-bind=\"::media.document.size | formatSize\"></span>\n        <span class=\"im_message_document_size\" ng-if=\"media.document.progress.enabled\" ng-bind=\"media.document.progress | formatSizeProgress\"></span>\n      </div>\n      <div class=\"im_message_document_actions\" ng-if=\"!media.document.progress.enabled\" ng-switch=\"media.document.downloaded\">\n        <a class=\"nocopy\" ng-switch-when=\"true\" href=\"\" ng-click=\"docSave()\" my-i18n=\"message_attach_document_save\"></a>\n        <a class=\"nocopy\" ng-switch-default href=\"\" ng-click=\"docSave()\" my-i18n=\"message_attach_document_download\"></a>\n        <a class=\"nocopy\" ng-if=\"::media.document.withPreview\" href=\"\" ng-click=\"docOpen()\" my-i18n=\"message_attach_document_open\"></a>\n      </div>\n      <div class=\"clearfix im_message_cancelable_progress_wrap\" ng-if=\"media.document.progress.enabled\">\n        <a class=\"im_message_media_progress_cancel pull-right nocopy\" ng-click=\"media.document.progress.cancel()\" my-i18n=\"modal_cancel\"></a>\n        <div class=\"im_message_download_progress_wrap\">\n          <div class=\"progress tg_down_progress\">\n            <div class=\"progress-bar progress-bar-success\" ng-style=\"{width: media.document.progress.percent + '%'}\"></div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</div>\n<div ng-if=\"::media.rCaption\" class=\"im_message_document_caption\" ng-bind-html=\"::media.rCaption\"></div>\n"
  },
  {
    "path": "app/partials/desktop/message_attach_game.html",
    "content": "<div class=\"im_message_game\">\n  <div class=\"im_message_webpage_wrap clearfix\">\n    <div class=\"im_message_webpage_photo\">\n      <div class=\"im_message_webpage_title\">\n        <a href=\"\"  ng-click=\"openGame()\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"media.game.rTitle\"></a>\n      </div>\n      <div class=\"im_message_webpage_description im_message_game_description\" ng-bind-html=\"::media.game.rDescription\"></div>\n      <div class=\"im_message_webpage_description im_message_game_message\"></div>\n      <a class=\"im_message_photo_thumb\" ng-click=\"openGame()\" ng-style=\"::{width: media.game.photo.thumb.width + 'px'}\">\n        <img\n          class=\"im_message_photo_thumb\"\n          my-load-thumb\n          thumb=\"media.game.photo.thumb\"\n          alt=\"[{{::media.game.title}}]\"\n        />\n      </a>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/desktop/message_attach_geo.html",
    "content": "<a ng-href=\"{{::media.mapUrl}}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"im_message_geopoint\">\n  <img\n    class=\"im_message_venue_geopoint_image\"\n    my-geo-point-map=\"media.geo\"\n    width=\"300\"\n    height=\"150\"\n    alt=\"[{{::'conversation_media_location' | i18n}} {{::media.mapUrl}}]\"\n  />\n</a>"
  },
  {
    "path": "app/partials/desktop/message_attach_pending.html",
    "content": "<div class=\"im_message_document im_message_upload_file\" ng-class=\"::'im_message_upload_' + media.type\">\n  <div class=\"im_message_file_button im_message_file_button_upload\">\n    <i class=\"im_message_file_button_icon\"></i>\n  </div>\n  <div class=\"im_message_document_info\">\n    <div class=\"im_message_document_name_wrap\">\n      <span ng-attr-title=\"{{media.file_name}}\" ng-attr-data-name=\"{{media_file_name_without_ext}}\" ng-attr-data-ext=\"{{media_file_ext}}\" class=\"im_message_document_name\"></span>\n      <span class=\"im_message_document_size\" ng-if=\"media.progress\" ng-bind=\"media.progress | formatSizeProgress\"></span>\n    </div>\n    <div class=\"clearfix im_message_cancelable_progress_wrap\">\n      <a class=\"im_message_media_progress_cancel pull-right\" ng-click=\"media.progress.cancel()\" my-i18n=\"modal_cancel\"></a>\n      <div class=\"im_message_download_progress_wrap\">\n        <div class=\"progress tg_up_progress\">\n          <div class=\"progress-bar progress-bar-success\" role=\"progressbar\" ng-style=\"{width: media.progress.percent + '%'}\"></div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/desktop/message_attach_photo.html",
    "content": "<a class=\"im_message_photo_thumb\" ng-click=\"openPhoto(media.photo.id, {m: messageId})\" ng-style=\"::{width: media.photo.thumb.width + 'px'}\" ng-mouseover=\"preloadPhoto(media.photo.id)\">\n  <img\n    class=\"im_message_photo_thumb\"\n    my-load-thumb\n    thumb=\"media.photo.thumb\"\n    alt=\"[{{::'conversation_media_photo' | i18n}}]\"\n  />\n</a>\n<div ng-if=\"::media.rCaption\" class=\"im_message_photo_caption\" ng-bind-html=\"::media.rCaption\"></div>"
  },
  {
    "path": "app/partials/desktop/message_attach_venue.html",
    "content": "<div class=\"im_message_venue clearfix\">\n\n  <a ng-href=\"{{::media.mapUrl}}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"im_message_venue_geopoint_wrap\">\n    <img\n      class=\"im_message_venue_geopoint_image\"\n      my-geo-point-map=\"media.geo\"\n      width=\"100\"\n      height=\"100\"\n      alt=\"[{{::'conversation_media_location' | i18n}} {{::media.mapUrl}}]\"\n    />\n  </a>\n\n  <div class=\"im_message_venue_info\">\n    <div class=\"im_message_venue_title_wrap\">\n      <a ng-href=\"{{::media.mapUrl}}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"im_message_document_name\" ng-bind=\"::media.title\"></a>\n    </div>\n    <div class=\"im_message_venue_address\" ng-bind=\"::media.address\"></div>\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/message_attach_webpage.html",
    "content": "<div ng-show=\"media.webpage._ == 'webPage'\" class=\"im_message_webpage_wrap clearfix\" ng-switch=\"media.webpage.type\">\n  <div ng-switch-when=\"photo\" class=\"im_message_webpage_photo\">\n    <div class=\"im_message_webpage_title\">\n      <a href=\"{{media.webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"media.webpage.rTitle\"></a>\n    </div>\n    <div ng-if=\"media.webpage.description.length\" class=\"im_message_webpage_description\" ng-bind-html=\"media.webpage.rDescription\"></div>\n    <a class=\"im_message_photo_thumb\" ng-click=\"openPhoto(media.webpage.photo.id, {w: media.webpage.id, m: messageId})\" ng-style=\"::{width: media.webpage.photo.thumb.width + 'px'}\" ng-mouseover=\"preloadPhoto(media.webpage.photo.id)\">\n      <img\n        class=\"im_message_photo_thumb\"\n        my-load-thumb\n        thumb=\"media.webpage.photo.thumb\"\n        alt=\"[{{::'conversation_media_photo' | i18n}}]\"\n      />\n    </a>\n  </div>\n  <div ng-switch-when=\"video\" class=\"im_message_webpage_video\">\n    <div class=\"im_message_webpage_site\" ng-bind=\"media.webpage.site_name || media.webpage.display_url\"></div>\n    <div class=\"im_message_webpage_title\">\n      <a ng-click=\"openEmbed($event)\" href=\"{{media.webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"media.webpage.rTitle\"></a>\n    </div>\n    <div ng-if=\"media.webpage.description.length\" class=\"im_message_webpage_description\" ng-bind-html=\"media.webpage.rDescription\"></div>\n    <a class=\"im_message_video_thumb\" ng-click=\"openEmbed($event)\" ng-href=\"{{media.webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-style=\"::{width: video.thumb.width + 'px'}\">\n      <span ng-if=\"media.webpage.duration > 0\" class=\"im_message_video_duration nocopy\" data-content=\"{{::media.webpage.duration | duration}}\"></span>\n      <i class=\"icon icon-videoplay\"></i>\n      <img\n        class=\"im_message_video_thumb\"\n        my-load-thumb\n        thumb=\"media.webpage.photo.thumb\"\n        alt=\"[{{::'conversation_media_video' | i18n}}]\"\n      />\n    </a>\n  </div>\n\n  <div ng-switch-when=\"document\" class=\"im_message_webpage_document\">\n    <div my-message-document=\"media.webpage\" message-id=\"messageId\"></div>\n  </div>\n\n  <div ng-switch-when=\"gif\" class=\"im_message_webpage_gif\">\n    <div class=\"im_message_webpage_title\">\n      <a href=\"{{media.webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"media.webpage.rTitle\"></a>\n    </div>\n    <div my-message-document=\"media.webpage\" message-id=\"messageId\"></div>\n  </div>\n\n  <div ng-switch-default class=\"im_message_webpage_article\">\n    <a ng-if=\"media.webpage.photo\" href=\"{{media.webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"im_message_webpage_article_photo pull-right\">\n      <img\n        class=\"im_message_article_thumb\"\n        my-load-thumb\n        thumb=\"media.webpage.photo.thumb\"\n      />\n    </a>\n    <div ng-if=\"media.webpage.site_name\" class=\"im_message_webpage_site\" ng-bind=\"media.webpage.site_name\"></div>\n    <div class=\"im_message_webpage_title\">\n      <a ng-click=\"openEmbed($event)\" href=\"{{media.webpage.url}}\" rel=\"noopener noreferrer\" target=\"_blank\" ng-bind-html=\"media.webpage.rTitle\"></a>\n    </div>\n    <div ng-if=\"media.webpage.description.length\" class=\"im_message_webpage_description\" ng-bind-html=\"media.webpage.rDescription\"></div>\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/desktop/message_media.html",
    "content": "<div ng-switch=\"::media._\">\n  <div ng-switch-when=\"messageMediaPhoto\"     my-message-photo=\"media\" message-id=\"messageId\"></div>\n  <div ng-switch-when=\"messageMediaDocument\"  my-message-document=\"media\" message-id=\"messageId\"></div>\n  <div ng-switch-when=\"messageMediaGeo\"       my-message-geo=\"media\"></div>\n  <div ng-switch-when=\"messageMediaVenue\"     my-message-venue=\"media\"></div>\n  <div ng-switch-when=\"messageMediaContact\"   my-message-contact=\"media\"></div>\n  <div ng-switch-when=\"messageMediaWebPage\"   my-message-webpage=\"media\" message-id=\"messageId\"></div>\n  <div ng-switch-when=\"messageMediaGame\"      my-message-game=\"media\" message-id=\"messageId\"></div>\n  <div ng-switch-when=\"messageMediaPending\"   my-message-pending=\"media\"></div>  \n\n  <div ng-switch-when=\"messageMediaUnsupported\">\n    <div class=\"im_message_text\" my-i18n=\"message_attach_unsupported_desktop\">\n      <my-i18n-param name=\"link\"><a href=\"https://getdesktop.telegram.org\" target=\"_blank\">getdesktop.telegram.org</a></my-i18n-param>\n    </div>\n  </div>\n\n  <div ng-switch-when=\"messageMediaUnsupportedWeb\">\n    <div class=\"im_message_text\" my-i18n=\"message_attach_notweb\">\n      <my-i18n-param name=\"link\"><a href=\"https://web.telegram.org\" target=\"_blank\">web.telegram.org</a></my-i18n-param>\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/message_service.html",
    "content": "<span ng-switch=\"::historyMessage.action._\">\n  <my-i18n>\n    <span ng-switch-when=\"messageActionChatCreate\" my-i18n-format=\"message_service_created_group\"></span>\n    <span ng-switch-when=\"messageActionChatEditTitle\" my-i18n-format=\"message_service_changed_group_name\"></span>\n    <my-i18n-param name=\"group-name\">&laquo;<strong ng-bind-html=\"::historyMessage.action.rTitle\"></strong>&raquo;</my-i18n-param>\n  </my-i18n>\n  <span ng-switch-when=\"messageActionChatEditPhoto\" my-i18n=\"message_service_changed_group_photo\"></span>\n  <span ng-switch-when=\"messageActionChatDeletePhoto\" my-i18n=\"message_service_removed_group_photo\"></span>\n  <span ng-switch-when=\"messageActionChatJoinedByLink\" my-i18n=\"message_service_joined_by_link\"></span>\n  <span ng-switch-when=\"messageActionChatReturn\" my-i18n=\"message_service_returned_to_group\"></span>\n  <span ng-switch-when=\"messageActionChatJoined\" my-i18n=\"message_service_joined\"></span>\n  <span ng-switch-when=\"messageActionChatAddUser\" my-i18n=\"message_service_invited_user\">\n    <my-i18n-param name=\"user\"><a my-peer-link=\"historyMessage.action.user_id\" color=\"true\"></a></my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChatAddUsers\" my-i18n=\"message_service_invited_users\">\n    <my-i18n-param name=\"user\"><a my-peer-link=\"historyMessage.action.users[0]\" color=\"true\"></a></my-i18n-param>\n    <my-i18n-param name=\"num-more\"><span ng-bind=\"historyMessage.action.users.length - 1\"></span></my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChatLeave\" my-i18n=\"message_service_left_group\"></span>\n  <span ng-switch-when=\"messageActionChatDeleteUser\" my-i18n=\"message_service_kicked_user\">\n    <my-i18n-param name=\"user\"><a my-peer-link=\"historyMessage.action.user_id\" color=\"true\"></a></my-i18n-param>\n  </span>\n\n  <span ng-switch-when=\"messageActionChatMigrateTo\" my-i18n=\"message_service_converted_to_supergroup\"></span>\n  <span ng-switch-when=\"messageActionChannelMigrateFrom\" my-i18n=\"message_service_converted_to_supergroup\"></span>\n  <span ng-switch-when=\"messageActionChannelCreate\" my-i18n=\"message_service_created_channel\"></span>\n  <span ng-switch-when=\"messageActionChannelEditTitle\" my-i18n=\"message_service_changed_channel_name\">\n    <my-i18n-param name=\"channel-name\">&laquo;<strong ng-bind-html=\"::historyMessage.action.rTitle\"></strong>&raquo;</my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChannelEditPhoto\" my-i18n=\"message_service_changed_channel_photo\"></span>\n  <span ng-switch-when=\"messageActionChannelDeletePhoto\" my-i18n=\"message_service_removed_channel_photo\"></span>\n\n  <span ng-switch-when=\"messageActionGameScore\" my-i18n=\"message_service_scored_game\">\n    <my-i18n-param name=\"scored\">\n      <ng-pluralize count=\"historyMessage.action.score\"\n                     when=\"message_service_scored_X\"></ng-pluralize>\n    </my-i18n-param>\n    <my-i18n-param name=\"message\"><a class=\"im_service_message_pinned\" my-pinned-message=\"::historyMessage.reply_to_mid\"></a></my-i18n-param>\n  </span>\n\n  <span ng-switch-when=\"messageActionPinMessage\" my-i18n=\"message_service_pinned_message\">\n    <my-i18n-param name=\"message\"><a class=\"im_service_message_pinned\" my-pinned-message=\"::historyMessage.reply_to_mid\"></a></my-i18n-param>\n  </span>\n\n  <a ng-switch-when=\"messageActionPhoneCall\" class=\"im_service_message_phonecall\" ng-click=\"phoneCallClick(historyMessage.mid)\" ng-switch=\"historyMessage.action.type\">\n    <span ng-switch-when=\"out_missed\" my-i18n=\"message_service_phonecall_canceled\"></span>\n    <span ng-switch-when=\"in_missed\" my-i18n=\"message_service_phonecall_missed\"></span>\n    <span ng-switch-when=\"out_ok\" my-i18n=\"message_service_phonecall_outgoing\"></span>\n    <span ng-switch-when=\"in_ok\" my-i18n=\"message_service_phonecall_incoming\"></span>\n    <span ng-if=\"historyMessage.action.duration > 0\" ng-bind=\"historyMessage.action.duration | duration\" class=\"im_service_message_phonecall_duration\"></span>\n  </a>\n\n  <span ng-switch-when=\"messageActionPaymentSent\" my-i18n=\"message_service_payment_sent\"></span>\n\n  <span ng-switch-when=\"messageActionScreenshotTaken\" my-i18n=\"message_service_screenshot_taken\"></span>\n\n  <span ng-switch-when=\"messageActionCustomAction\" ng-bind=\"historyMessage.action.message\"></span>\n  \n\n  <span ng-switch-default my-i18n=\"message_service_unsupported_action\">\n    <my-i18n-param name=\"action\"><span ng-bind=\"historyMessage.action._\"></span></my-i18n-param>\n  </span>\n</span>\n"
  },
  {
    "path": "app/partials/desktop/password_recovery_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"checkCode()\">\n\n      <h4 my-i18n=\"login_recovery_title\"></h4>\n\n      <div class=\"md_simple_form_description\" my-i18n=\"login_recovery_description_md\">\n        <my-i18n-param name=\"email\">\n          <strong ng-bind=\"recovery.email_pattern\"></strong>\n        </my-i18n-param>\n      </div>\n\n      <div class=\"md-input-group\" ng-class=\"{'md-input-error': recovery.error_field == 'code'}\" my-labeled-input ng-switch=\"recovery.error_field == 'code'\">\n        <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_code_incorrect\"></label>\n        <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_code_placeholder\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"recovery.code\" name=\"code\" my-focused />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: recovery.updating}\" ng-click=\"checkCode()\" ng-disabled=\"recovery.updating\" ng-bind=\"recovery.updating ? 'password_recover_active' : 'password_recover_submit' | i18n\"></button>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/password_update_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updatePassword()\">\n\n      <h4 ng-switch=\"action\">\n        <my-i18n ng-switch-when=\"disable\" msgid=\"password_delete_title\"></my-i18n>\n        <my-i18n ng-switch-default msgid=\"password_change_title\"></my-i18n>\n      </h4>\n\n      <div ng-if=\"password._ != 'account.noPassword'\" class=\"md-input-group\" ng-class=\"{'md-input-error': passwordSettings.error_field == 'cur_password'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_current_placeholder\"></label>\n        <input class=\"md-input\" my-focused type=\"password\" ng-model=\"passwordSettings.cur_password\" name=\"cur_password\" my-focus-on=\"cur_password_focus\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group md-input-grouped\" ng-class=\"{'md-input-error': passwordSettings.error_field == 'new_password'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_new_placeholder\"></label>\n        <input class=\"md-input\" type=\"password\" ng-model=\"passwordSettings.new_password\" name=\"new_password\" my-focus-on=\"new_password_focus\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group\" ng-class=\"{'md-input-error': passwordSettings.confirm_password && passwordSettings.new_password && passwordSettings.confirm_password != passwordSettings.new_password}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_confirm_placeholder\"></label>\n        <input class=\"md-input\" type=\"password\" ng-model=\"passwordSettings.confirm_password\" name=\"confirm_password\" my-focus-on=\"confirm_password_focus\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_hint_placeholder\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"passwordSettings.hint\" name=\"hint\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md_simple_form_description\" my-i18n=\"password_create_description\"></div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group\" ng-class=\"{'md-input-error': passwordSettings.error_field == 'email'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_email_placeholder\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"passwordSettings.email\" name=\"email\" />\n      </div>\n\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: passwordSettings.updating}\" ng-click=\"updatePassword()\" ng-disabled=\"passwordSettings.updating\" ng-switch=\"action\">\n      <span ng-switch-when=\"disable\" ng-bind=\"passwordSettings.updating ? 'password_delete_active' : 'password_delete_submit' | i18n\"></span>\n      <span ng-switch-default ng-bind=\"passwordSettings.updating ? 'password_create_active' : 'password_create_submit' | i18n\"></span>\n    </button>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/peer_pinned_message_bar.html",
    "content": "<div class=\"im_history_pinned_wrap\" ng-if=\"pinnedMessageID > 0\">\n  <a class=\"im_history_pinned_hide\" ng-mousedown=\"hidePinned()\"><i class=\"icon icon-reply-bar\"></i><i class=\"icon icon-reply-bar\"></i></a>\n  <a class=\"im_history_pinned_message\" my-reply-message=\"pinnedMessageID\" watch=\"true\"></a>\n</div>"
  },
  {
    "path": "app/partials/desktop/peer_select.html",
    "content": "<div class=\"peer_select_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head md_modal_head_simple\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$dismiss()\" my-i18n=\"modal_close\"></a>\n      </div>\n    </div>\n    <div class=\"md_modal_title\" my-i18n=\"conversations_modal_forward_title\"></div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"im_dialogs_modal_col_wrap\" ng-controller=\"AppImDialogsController\" my-dialogs ng-class=\"search.query.length > 0 ? 'im_dialogs_col_search' : ''\">\n      <div class=\"im_dialogs_panel\">\n        <div class=\"im_dialogs_search\">\n          <input my-focused class=\"form-control im_dialogs_search_field no_outline\" type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\" autocomplete=\"off\" />\n          <a class=\"im_dialogs_search_clear tg_search_clear\" ng-click=\"search.query = ''\" ng-show=\"search.query.length\">\n            <i class=\"icon icon-search-clear\"></i>\n          </a>\n        </div>\n      </div>\n      <div my-dialogs-list modal=\"true\" class=\"im_dialogs_modal_col\">\n        <div class=\"im_dialogs_wrap nano\">\n          <div class=\"im_dialogs_scrollable_wrap nano-content\">\n            <ul class=\"im_dialogs_modal_list nav nav-pills nav-stacked\">\n              <li class=\"im_dialog_wrap\" my-dialog dialog-message=\"dialogMessage\" ng-repeat=\"dialogMessage in dialogs track by dialogMessage.peerID\" ng-class=\"{active: selectedPeers[dialogMessage.peerID] !== undefined}\"></li>\n            </ul>\n            <div class=\"im_dialogs_contacts_wrap\" ng-show=\"myResults.length > 0\">\n              <h5 my-i18n=\"conversation_select_modal_chats_contacts\"></h5>\n              <ul class=\"nav nav-pills nav-stacked\">\n                <li class=\"im_dialog_wrap\" ng-repeat=\"myResult in myResults track by myResult.id\" ng-class=\"{active: selectedPeers[myResult.id] !== undefined}\">\n                  <a class=\"im_dialog\" ng-click=\"dialogSelect(myResult.peerString)\">\n                    <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"::myResult.id\" img-class=\"im_dialog_photo\"></div>\n                    <div class=\"im_dialog_message_wrap\">\n                      <div class=\"im_dialog_peer\">\n                        <span class=\"im_dialog_user\" my-peer-link=\"myResult.id\"></span>\n                      </div>\n                      <div class=\"im_dialog_message\" ng-switch=\"myResult.id > 0\">\n                        <span ng-switch-when=\"true\" class=\"im_dialog_message_text\" my-user-status=\"::myResult.id\"></span>\n                        <span ng-switch-default class=\"im_dialog_message_text\" my-chat-status=\"::-myResult.id\"></span>\n                      </div>\n                    </div>\n                  </a>\n                </li>\n              </ul>\n            </div>\n\n            <div class=\"im_dialogs_contacts_wrap\" ng-show=\"foundPeers.length > 0\">\n              <h5 my-i18n=\"im_found_title\"></h5>\n              <ul class=\"nav nav-pills nav-stacked\">\n                <li class=\"im_dialog_wrap\" ng-repeat=\"foundPeer in foundPeers track by foundPeer.id\" ng-class=\"{active: selectedPeers[foundPeer.id] !== undefined}\">\n                  <a class=\"im_dialog\" ng-click=\"dialogSelect(foundPeer.peerString)\">\n                    <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"foundPeer.id\" img-class=\"im_dialog_photo\" watch=\"true\"></div>\n                    <div class=\"im_dialog_message_wrap\">\n                      <div class=\"im_dialog_peer\">\n                        <span class=\"im_dialog_user\" my-peer-link=\"foundPeer.id\"></span>\n                      </div>\n                      <div class=\"im_dialog_message\">\n                        <span class=\"im_dialog_message_text\" ng-bind=\"::'@' + foundPeer.username\"></span>\n                      </div>\n                    </div>\n                  </a>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n\n  <div class=\"md_modal_footer peer_select_modal_footer clearfix\" ng-if=\"multiSelect\">\n    <button class=\"btn btn-md btn-md-primary pull-right\" ng-click=\"submitSelected()\" my-i18n=\"conversations_modal_forward_submit\"></button>\n\n    <div class=\"peer_select_modal_recipients_wrap\" ng-switch=\"!selectedCount\">\n      <span ng-switch-when=\"true\" ng-switch=\"shareLink.loading ? 'url_loading' : (shareLink.url ? 'url' : 'empty')\">\n        <span ng-switch-when=\"url_loading\" class=\"peer_select_modal_recipients_empty\" my-i18n=\"conversations_modal_share_url_loading\">\n          <my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n        </span>\n        <span ng-switch-when=\"url\">\n          <a class=\"peer_select_modal_share_link\" my-copy-link ng-bind=\"shareLink.url | shortUrl\" data-clipboard-text=\"{{shareLink.url}}\"></a>\n        </span>\n        <span ng-switch-default class=\"peer_select_modal_recipients_empty\" my-i18n=\"conversations_modal_select_recipients\"></span>\n      </span>\n      <span ng-switch-default>\n        <span class=\"peer_select_modal_recipients_name\" my-i18n=\"conversations_modal_recipients\"></span>\n        <span class=\"peer_select_modal_recipients_list\" ng-switch=\"selectedCount\" my-i18n>\n          <span ng-switch-when=\"1\" my-i18n-format=\"conversation_one_selected\"></span>\n          <span ng-switch-when=\"2\" my-i18n-format=\"conversation_two_selected\"></span>\n          <span ng-switch-default my-i18n-format=\"conversation_many_selected\"></span>\n          <my-i18n-param name=\"name1\"><span class=\"peer_select_modal_recipient\" ng-bind-html=\"selectedPeers[selectedPeerIDs[0]][selectedPeerIDs[0] > 0 ? 'rFullName' : 'rTitle']\"></span></my-i18n-param>\n          <my-i18n-param name=\"name2\"><span class=\"peer_select_modal_recipient\" ng-bind-html=\"selectedPeers[selectedPeerIDs[1]][selectedPeerIDs[1] > 0 ? 'rFullName' : 'rTitle']\"></span></my-i18n-param>\n          <my-i18n-param name=\"count\">{{selectedCount - 2}}</my-i18n-param>\n        </span>\n\n      </span>\n    </div>\n  </div>\n\n  <div class=\"md_modal_footer md_modal_footer_empty clearfix\" ng-if=\"!multiSelect\"></div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/photo_modal.html",
    "content": "<div class=\"modal_prev_wrap\" ng-class=\"{modal_prev_active_wrap: nav.hasPrev}\" ng-click=\"nav.prev($event)\">\n  <div class=\"modal_prev\"></div>\n</div>\n<div class=\"modal_next_wrap\" ng-class=\"{modal_next_active_wrap: nav.hasNext}\" ng-click=\"nav.next($event)\">\n  <div class=\"modal_next\"></div>\n</div>\n<div class=\"modal_close_wrap modal_close_wrap_wnext\" ng-click=\"$close()\">\n  <div class=\"modal_close\"></div>\n</div>\n\n<div class=\"media_modal_bottom_panel_wrap\">\n  <div class=\"media_modal_bottom_panel\">\n    <div class=\"media_modal_bottom_actions\">\n      <a class=\"media_modal_action_btn\" ng-click=\"download()\" title=\"{{'media_modal_download' | i18n}}\">\n        <i class=\"media_modal_action_btn_download\"></i>\n      </a>\n      <a class=\"media_modal_action_btn\" ng-if=\"canForward\" ng-click=\"forward()\"  title=\"{{'media_modal_forward' | i18n}}\">\n        <i class=\"media_modal_action_btn_forward\"></i>\n      </a>\n      <a class=\"media_modal_action_btn\" ng-if=\"canDelete\" ng-click=\"delete()\" title=\"{{'media_modal_delete' | i18n}}\">\n        <i class=\"media_modal_action_btn_delete\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_info_wrap pull-left\" ng-if=\"!webpageID && photo.user_id\">\n      <a class=\"media_modal_author_photo pull-left\" my-peer-photolink=\"photo.user_id\" img-class=\"media_modal_author_photo\" watch=\"true\"></a>\n      <div class=\"media_modal_author_name\">\n        <a class=\"media_modal_author\" my-peer-link=\"photo.user_id\" peer-watch=\"true\"></a>\n      </div>\n      <div class=\"media_modal_date\" ng-if=\"photo.date > 0\" ng-switch=\"messageID > 0\">\n        <a ng-switch-when=\"true\" class=\"media_modal_date\" ng-click=\"goToMessage()\" ng-bind=\"photo.date | dateOrTime :true\"></a>\n        <span ng-switch-default ng-bind=\"photo.date | dateOrTime :true\"></span>\n      </div>\n    </div>\n\n    <div class=\"media_modal_info_wrap pull-left\" ng-if=\"webpageID\">\n      <div class=\"media_modal_author_name\">\n        <a class=\"media_modal_author\" href=\"{{webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"webpage.rTitle\"></a>\n      </div>\n      <div class=\"media_modal_date\"  ng-bind=\"webpage.site_name || webpage.display_url\"></div>\n    </div>\n\n    <div class=\"media_modal_title_wrap\" ng-switch=\"count > 1 &amp;&amp; pos > 0\">\n      <my-i18n ng-switch-when=\"true\" msgid=\"media_modal_photo_index\">\n        <my-i18n-param name=\"pos\" ng-bind=\"pos\"></my-i18n-param>\n        <my-i18n-param name=\"count\" ng-bind=\"count\"></my-i18n-param>\n      </my-i18n>\n      <my-i18n ng-switch-default msgid=\"media_modal_photo\">\n    </div>\n  </div>\n</div>\n\n<div class=\"modal-dialog\" my-modal-nav next=\"nav.next()\" prev=\"nav.prev()\">\n  <div class=\"modal-content\">\n    <div my-modal-width=\"{{photo.full.modalWidth}}\" class=\"media_modal_wrap photo_modal_wrap\" my-modal-position animation=\"no\">\n\n      <div class=\"modal-body\">\n\n        <div class=\"photo_modal_image_wrap\" my-load-full-photo full-photo=\"photo.full\" thumb-location=\"photo.thumb.location\" ng-click=\"nav.next()\"></div>\n\n      </div>\n\n    </div>\n  </div>\n</div>\n\n"
  },
  {
    "path": "app/partials/desktop/pinned_message.html",
    "content": "<span ng-switch=\"pinnedMessage.loading\"><span ng-switch-when=\"true\" my-i18n=\"im_reply_loading\"><my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param></span><span ng-switch-default my-short-message=\"pinnedMessage\"></span></span>"
  },
  {
    "path": "app/partials/desktop/profile_edit_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateProfile()\">\n\n      <h4 my-i18n=\"profile_edit_modal_title\"></h4>\n\n      <div class=\"md-input-group\" ng-class=\"{'has-error': error.field == 'first_name'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"profile_edit_first_name\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"profile.first_name\" />\n      </div>\n\n      <div class=\"md-input-group\" ng-class=\"{'has-error': error.field == 'last_name'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"profile_edit_last_name\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"profile.last_name\" />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: profile.updating}\" ng-click=\"updateProfile()\" ng-bind=\"profile.updating ? 'profile_edit_submit_active' : 'profile_edit_submit' | i18n\" ng-disabled=\"profile.updating\"></button>\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/reply_markup.html",
    "content": "<div class=\"reply_markup_wrap\">\n  <div class=\"reply_markup\" ng-class=\"replyMarkup.splitCount ? 'reply_markup_h' + replyMarkup.splitCount : ''\">\n    <div class=\"reply_markup_row\" ng-repeat=\"row in replyMarkup.rows\">\n      <div class=\"reply_markup_button_wrap\" ng-class=\"'reply_markup_button_w' + row.buttons.length\" ng-repeat=\"button in row.buttons\" ng-switch=\"button._\">\n        <a ng-switch-when=\"keyboardButtonUrl\" class=\"btn reply_markup_button\" href=\"{{button.pUrl}}\" ng-bind-html=\"::button.rText\" rel=\"noopener noreferrer\"></a>\n        <button ng-switch-default class=\"btn reply_markup_button\" ng-bind-html=\"::button.rText\" ng-click=\"buttonClick(button)\"></button>\n      </div>\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/reply_message.html",
    "content": "<div class=\"im_message_reply clearfix\" ng-class=\"{im_message_reply_thumbed: thumb !== false}\" ng-switch=\"replyMessage.loading\">\n  <div class=\"im_message_reply_border\"></div>\n  <div class=\"im_message_reply_loading\" ng-switch-when=\"true\" my-i18n=\"im_reply_loading\">\n    <my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n  </div>\n  <div class=\"im_message_reply_thumb_wrap pull-left\" ng-if=\"thumb !== false\">\n    <img\n      class=\"im_message_reply_thumb\"\n      my-load-thumb\n      thumb=\"thumb\"\n      watch=\"true\"\n    />\n  </div>\n  <div class=\"im_message_reply_author\" ng-switch-default ng-switch=\"isEdit\">\n    <span class=\"copyonly\">&gt;&nbsp;</span>\n    <span ng-switch-when=\"true\" my-i18n=\"im_edit_message_title\"></span>\n    <span ng-switch-default my-peer-link=\"replyMessage.fromID\" peer-watch=\"true\"></span>\n  </div>\n  <div class=\"im_message_reply_body\" ng-switch-default>\n    <span class=\"copyonly\">&gt;&nbsp;</span>\n    <span my-short-message=\"replyMessage\"></span>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/desktop/report_msgs_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"$close(reason)\">\n\n      <h4 my-i18n=\"report_reason_modal_title\"></h4>\n\n      <div class=\"tg_radios_wrap\">\n        <a class=\"md_modal_section_radio_wrap tg_radio\" ng-click=\"toggleReportReason('inputReportReasonSpam')\" ng-class=\"reason._ == 'inputReportReasonSpam' ? 'tg_radio_on' : ''\">\n          <span class=\"icon icon-radio-outer\"><i class=\"icon-radio\"></i></span>\n          <span my-i18n=\"report_reason_modal_spam\"></span>\n        </a>\n\n        <a class=\"md_modal_section_radio_wrap tg_radio\" ng-click=\"toggleReportReason('inputReportReasonViolence')\" ng-class=\"reason._ == 'inputReportReasonViolence' ? 'tg_radio_on' : ''\">\n          <span class=\"icon icon-radio-outer\"><i class=\"icon-radio\"></i></span>\n          <span my-i18n=\"report_reason_modal_violence\"></span>\n        </a>\n\n        <a class=\"md_modal_section_radio_wrap tg_radio\" ng-click=\"toggleReportReason('inputReportReasonChildAbuse')\" ng-class=\"reason._ == 'inputReportReasonChildAbuse' ? 'tg_radio_on' : ''\">\n          <span class=\"icon icon-radio-outer\"><i class=\"icon-radio\"></i></span>\n          <span class=\"\" my-i18n=\"report_reason_modal_childabuse\"></span>\n        </a>\n\n        <a class=\"md_modal_section_radio_wrap tg_radio\" ng-click=\"toggleReportReason('inputReportReasonPornography')\" ng-class=\"reason._ == 'inputReportReasonPornography' ? 'tg_radio_on' : ''\">\n          <span class=\"icon icon-radio-outer\"><i class=\"icon-radio\"></i></span>\n          <span my-i18n=\"report_reason_modal_pornography\"></span>\n        </a>\n\n\n        <a class=\"md_modal_section_radio_wrap tg_radio\" ng-click=\"toggleReportReason('inputReportReasonOther')\" ng-class=\"reason._ == 'inputReportReasonOther' ? 'tg_radio_on' : ''\">\n          <span class=\"icon icon-radio-outer\"><i class=\"icon-radio\"></i></span>\n          <span my-i18n=\"report_reason_modal_other\"></span>\n        </a>\n      </div>\n\n      <div class=\"md-input-group\" my-labeled-input ng-show=\"reason._ == 'inputReportReasonOther'\">\n        <label class=\"md-input-label\" my-i18n=\"report_reason_modal_other_placeholder\"></label>\n        <input class=\"md-input\" my-focus-on=\"ui_reason_text_focus\" type=\"text\" ng-model=\"reason.text\" />\n      </div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-click=\"$close(reason)\" my-i18n=\"report_reason_modal_submit_btn\"></button>\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/send_form.html",
    "content": "<form class=\"im_send_form\" ng-class=\"{im_send_form_empty: !draftMessage.text.length, composer_progress_enabled: draftMessage.inlineProgress, im_voice_recording: voiceRecorder.recording, im_processing_recording: voiceRecorder.processing}\">\n\n  <div class=\"im_send_form_inline_results\" my-inline-results=\"inlineResults\"></div>\n\n  <div class=\"im_send_reply_wrap\" ng-if=\"draftMessage.replyToMsgID > 0\">\n    <a class=\"im_send_reply_cancel\" ng-mousedown=\"draftMessage.replyClear(true)\"><i class=\"icon icon-reply-bar\"></i><i class=\"icon icon-reply-bar\"></i></a>\n    <a class=\"im_message_reply_wrap\" my-reply-message=\"draftMessage.replyToMsgID\" watch=\"true\" edit=\"{{draftMessage.type == 'edit'}}\"></a>\n  </div>\n\n  <div class=\"im_send_reply_wrap im_send_fwds_wrap\" ng-if=\"draftMessage.fwdMessages.length > 0\">\n    <a class=\"im_send_reply_cancel\" ng-mousedown=\"draftMessage.fwdsClear()\"><i class=\"icon icon-reply-bar\"></i><i class=\"icon icon-reply-bar\"></i></a>\n    <div class=\"im_message_reply_wrap\" my-forwarded-messages=\"draftMessage.fwdMessages\"></div>\n  </div>\n\n  <div class=\"im_send_field_wrap hasselect\" ng-class=\"replyKeyboard._ == 'replyKeyboardMarkup' ? 'im_send_field_wrap_2ndbtn' : ''\">\n    <a class=\"composer_emoji_insert_btn\"><i class=\"icon icon-emoji\"></i></a>\n    <div class=\"composer_progress_icon_wrap\">\n      <div class=\"composer_progress_icon\" my-arc-progress width=\"22\" stroke=\"2.5\"></div>\n    </div>\n    <a class=\"composer_command_btn\" ng-show=\"!replyKeyboard && commands.list.length > 0 && (!draftMessage.text.length || draftMessage.text == '/')\" ng-mousedown=\"draftMessage.toggleSlash($event)\" ng-class=\"draftMessage.text[0] == '/' ? 'active' : ''\"><i class=\"icon icon-slash\"></i></a>\n    <a class=\"composer_keyboard_btn\" ng-show=\"replyKeyboard._ == 'replyKeyboardMarkup'\" ng-mousedown=\"draftMessage.replyKeyboardToggle($event)\" ng-class=\"!replyKeyboard.pFlags.hidden ? 'active' : ''\"><i class=\"icon icon-keyboard\"></i></a>\n\n    <div class=\"im_send_dropbox_wrap\" my-i18n=\"im_photos_drop_text\"></div>\n    <div class=\"im_voice_recorder_wrap\">\n      <div class=\"im_recorder_indicator\"><i></i></div>\n      <div class=\"im_recorder_time\" ng-bind=\"voiceRecorder.duration | duration\"></div>\n      <div class=\"im_recorder_label\" ng-switch=\"voiceRecorder.processing\">\n        <span ng-switch-when=\"true\" my-i18n=\"im_voice_processing_label\">\n          <my-i18n-param name=\"dots\"></my-i18n-param>\n        </span>\n        <span ng-switch-default>\n          <span class=\"im_recorder_label_hover\" my-i18n=\"im_voice_recording_label\"></span>\n          <span class=\"im_recorder_label_hout\" my-i18n=\"im_voice_recording_cancel_label\"></span>\n        </span>\n      </div>\n    </div>\n\n    <textarea ng-model=\"draftMessage.text\" class=\"form-control im_message_field no_outline\" dir=\"auto\" ng-trim=\"false\"></textarea>\n  </div>\n\n  <div class=\"im_send_buttons_wrap clearfix\">\n    <button type=\"submit\" class=\"btn btn-md im_submit\" ng-class=\"draftMessage.type == 'edit' ? 'im_submit_edit' : 'im_submit_send'\">\n      <span class=\"im_submit_send_label nocopy\" my-i18n=\"im_submit_message\"></span>\n      <span class=\"im_submit_edit_label nocopy\" my-i18n=\"im_submit_edit_message\"></span>\n    </button>\n\n    <div class=\"im_attach pull-left\">\n      <input type=\"file\" class=\"im_attach_input\" size=\"28\" multiple=\"multiple\" title=\"{{'im_attach_file_title' | i18n}}\" />\n      <i class=\"icon icon-paperclip\"></i>\n    </div>\n\n    <div class=\"im_media_attach pull-left\">\n      <input type=\"file\" class=\"im_media_attach_input\" size=\"28\" multiple=\"multiple\" accept=\"image/*, video/*, audio/*\" title=\"{{'im_media_attach_title' | i18n}}\"/>\n      <i class=\"icon icon-camera\"></i>\n    </div>\n\n    <a class=\"im_record pull-left\" title=\"{{'im_voice_record_title' | i18n}}\">\n      <div class=\"im_record_bg\" title=\"{{'im_voice_record_title' | i18n}}\">\n        <i class=\"icon icon-mic\"></i>\n      </div>\n    </a>\n\n    <div class=\"composer_emoji_panel\"></div>\n  </div>\n\n  <div class=\"im_send_keyboard_wrap\" ng-if=\"replyKeyboard._ == 'replyKeyboardMarkup'\" ng-show=\"!replyKeyboard.pFlags.hidden\">\n    <div my-reply-markup=\"replyKeyboard\"></div>\n  </div>\n\n</form>\n"
  },
  {
    "path": "app/partials/desktop/sessions_list_modal.html",
    "content": "<div class=\"sessions_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head md_modal_head_simple\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$dismiss()\" my-i18n=\"modal_close\"></a>\n      </div>\n    </div>\n    <div class=\"md_modal_title\" my-i18n=\"sessions_modal_title\"></div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div my-sessions-list class=\"sessions_modal_col\">\n\n      <div class=\"sessions_wrap nano\" my-infinite-scroller>\n        <div class=\"sessions_scrollable_wrap nano-content\" ng-switch=\"!sessionsLoaded\">\n\n          <div ng-switch-when=\"true\" class=\"sessions_modal_loading\" my-vertical-position=\"0.2\" padding=\"true\" my-i18n=\"sessions_modal_loading\">\n            <my-i18n-param name=\"dots\">\n              <span my-loading-dots></span>\n            </my-i18n-param>\n          </div>\n\n          <ul ng-switch-default class=\"sessions_modal_sessions_list nav nav-pills nav-stacked\">\n\n            <li class=\"sessions_modal_session_wrap clearfix\" ng-repeat=\"authorization in authorizations | limitTo: slice.limit track by authorization.hash\">\n              <div class=\"sessions_modal_session\">\n                <div class=\"session_meta_wrap pull-right\">\n                  <div class=\"session_active_date\" ng-switch=\"authorization.current\">\n                    <span ng-switch-when=\"true\" class=\"session_active_date_online\" my-i18n=\"sessions_modal_current_session\"></span>\n                    <span ng-switch-default ng-bind=\"authorization.date_active | dateOrTime\"></span>\n                  </div>\n\n                  <a ng-if=\"!authorization.current\" class=\"session_terminate_btn\" ng-click=\"terminateSession(authorization.hash)\" my-i18n=\"sessions_modal_terminate_one\"></a>\n                </div>\n\n                <div class=\"sessions_modal_session_app\" ng-bind=\"authorization.app_name + ' ' + authorization.app_version\"></div>\n                <div class=\"sessions_modal_session_device\" ng-bind=\"authorization.device_model + ', ' + authorization.platform + ' ' + authorization.system_version\"></div>\n                <div class=\"sessions_modal_session_location\" ng-bind=\"authorization.ip + ' - ' + authorization.country\"></div>\n              </div>\n              <div ng-if=\"authorization.current && authorizations.length > 1\">\n                <div class=\"sessions_modal_terminate_all_wrap\">\n                  <a ng-click=\"terminateAllSessions()\" my-i18n=\"sessions_modal_terminate_all\"></a>\n                </div>\n\n                <hr class=\"sessions_modal_other_splitter\"></hr>\n              </div>\n            </li>\n\n          </ul>\n\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/settings_modal.html",
    "content": "<div class=\"settings_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$close()\" my-i18n=\"modal_close\"></a>\n        <a class=\"md_modal_action\" ng-click=\"editProfile()\" my-i18n=\"modal_edit\"></a>\n      </div>\n      <div class=\"md_modal_title\" my-i18n=\"settings_modal_title\"></div>\n    </div>\n\n    <div class=\"peer_modal_profile_wrap clearfix\">\n      <div class=\"peer_modal_photo_wrap pull-left\" ng-switch=\"photo.updating\">\n        <div ng-switch-when=\"true\" class=\"peer_modal_photo md_photo_loading loading_dots\">\n          <i></i><i></i><i></i>\n        </div>\n        <a ng-switch-default ng-click=\"openUserPic()\" class=\"peer_modal_photo\" my-peer-photolink=\"::profile.id\" img-class=\"peer_modal_photo\" watch=\"true\" no-open=\"true\" ng-class=\"{disabled: !profile.photo.photo_id}\" ng-disabled=\"!profile.photo.photo_id\"></a>\n      </div>\n      <div class=\"peer_modal_profile\">\n        <div class=\"peer_modal_profile_name\" my-peer-link=\"profile.id\"></div>\n        <div class=\"peer_modal_profile_description\" my-user-status=\"::profile.id\"></div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"md_modal_split_actions_wrap\">\n    <div class=\"md_modal_split_actions\">\n      <div class=\"md_modal_split_action\">\n        <input my-file-upload  type=\"file\" multiple=\"false\" class=\"im_attach_input\" size=\"120\" multiple=\"false\" accept=\"image/x-png, image/png, image/gif, image/jpeg\" title=\"{{'settings_modal_set_photo' | i18n}}\" />\n        <i class=\"md_modal_split_action_camera\"></i>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"md_modal_sections clearfix\">\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_number\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_phone\"></i>\n\n        <div class=\"md_modal_section_param_wrap\">\n          <div class=\"md_modal_section_param_value\" ng-bind=\"profile.phone | phoneNumber\"></div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"user_modal_phone\"></div>\n        </div>\n\n        <div class=\"md_modal_section_param_wrap\">\n          <div class=\"md_modal_section_param_value\" ng-switch=\"profile.username.length > 0\">\n            <a ng-switch-when=\"true\" class=\"settings_modal_username_link\" ng-click=\"changeUsername()\" ng-bind=\"'@' + profile.username\"></a>\n            <a ng-switch-default ng-click=\"changeUsername()\" my-i18n=\"settings_modal_empty_username_set\"></a>\n          </div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"user_modal_username\"></div>\n        </div>\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_toggle\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_notification\"></i>\n\n        <a class=\"md_modal_section_toggle_wrap tg_checkbox\" ng-click=\"toggleDesktop()\" ng-class=\"notify.desktop ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_notifications\"></span>\n        </a>\n\n        <a ng-if=\"notify.desktop && notify.pushAvailable\" class=\"md_modal_section_toggle_wrap tg_checkbox\" ng-click=\"togglePush()\" ng-class=\"notify.push ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_pushes\"></span>\n        </a>\n\n        \n\n        <a class=\"md_modal_section_toggle_wrap tg_checkbox\" ng-click=\"togglePreview()\" ng-class=\"notify.preview ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_message_preview\"></span>\n        </a>\n\n        <a class=\"md_modal_section_toggle_wrap tg_checkbox\" ng-click=\"toggleSound()\" ng-class=\"notify.volume ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_sound\"></span>\n        </a>\n\n        <div class=\"md_modal_section_range_wrap tg_range_wrap\" ng-show=\"notify.volume > 0\">\n          <div my-slider slider-model=\"notify.volume\"></div>\n        </div>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_radio\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_keyboard\"></i>\n\n        <div class=\"tg_radios_wrap\">\n          <a class=\"md_modal_section_radio_wrap tg_radio\" ng-click=\"toggleCtrlEnter(1)\" ng-class=\"send.enter == 1 ? 'tg_radio_on' : ''\">\n            <span class=\"icon icon-radio-outer\"><i class=\"icon-radio\"></i></span>\n            <span my-i18n=\"settings_modal_enter_send_description_md\"></span>\n          </a>\n\n          <a class=\"md_modal_section_radio_wrap tg_radio\" ng-click=\"toggleCtrlEnter(0)\" ng-class=\"send.enter == 0 ? 'tg_radio_on' : ''\">\n            <span class=\"icon icon-radio-outer\"><i class=\"icon-radio\"></i></span>\n            <span my-i18n=\"settings_modal_ctrl_enter_send_description_md\"></span>\n          </a>\n        </div>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap  md_modal_iconed_section_link\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_more\"></i>\n\n        <div class=\"md_modal_section_select_wrap\" ng-controller=\"AppLangSelectController\">\n          <div class=\"dropdown md_modal_section_select\" dropdown>\n            <button class=\"btn btn-link dropdown-toggle\" dropdown-toggle ng-bind=\"langNames[curLocale]\"></button>\n            <ul class=\"dropdown-menu dropdown-menu-to-up\">\n              <li ng-repeat=\"locale in ::supportedLocales\">\n                <a ng-click=\"localeSelect(locale)\" ng-bind=\"langNames[locale]\"></a>\n              </li>\n            </ul>\n          </div>\n\n          <div class=\"md_modal_section_param_name\" my-i18n=\"settings_modal_language\"></div>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\">\n          <a ng-if=\"password._ == 'account.noPassword' && password.email_unconfirmed_pattern.length\" class=\"md_modal_section_link pull-right\" ng-click=\"changePassword({action: 'cancel_email'})\" my-i18n=\"settings_modal_password_email_pending_cancel\">\n          </a>\n          <span class=\"md_modal_section_text\" ng-if=\"password._ == 'account.noPassword' && password.email_unconfirmed_pattern.length\" class=\"md_modal_section_link\" my-i18n=\"settings_modal_password_email_pending\">\n            <my-i18n-param name=\"email\">\n              <span ng-bind=\"password.email_unconfirmed_pattern\"></span>\n            </my-i18n-param>\n          </span>\n          <a ng-if=\"password._ == 'account.noPassword' && !password.email_unconfirmed_pattern\" class=\"md_modal_section_link\" ng-click=\"changePassword({action: 'create'})\" my-i18n=\"settings_modal_set_password\"></a>\n\n          <a ng-if=\"password._ == 'account.password'\" class=\"md_modal_section_link pull-right\" ng-click=\"changePassword({action: 'disable'})\" my-i18n=\"settings_modal_disable_password\"></a>\n          <a ng-if=\"password._ == 'account.password'\" class=\"md_modal_section_link\" ng-click=\"changePassword({action: 'change'})\" my-i18n=\"settings_modal_change_password\"></a>\n        </div>\n\n        <a class=\"md_modal_section_toggle_wrap settings_modal_content_settings_wrap tg_checkbox\" ng-click=\"toggleContentSettings()\" ng-class=\"contentSettings.pFlags.sensitive_enabled ? 'tg_checkbox_on' : ''\" ng-show=\"contentSettings.pFlags.sensitive_can_change\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_show_sensitive_content\"></span>\n        </a>\n\n        \n\n        <div class=\"md_modal_section_link_wrap\">\n          <a class=\"md_modal_section_link\" ng-click=\"showSessions()\" my-i18n=\"settings_modal_active_sessions\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\">\n          <a class=\"md_modal_section_link\" ng-click=\"logOut()\" my-i18n=\"head_log_out\"></a>\n        </div>\n\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/short_message.html",
    "content": "<span class=\"im_short_message_media\" ng-if=\"message.media\" ng-switch=\"message.media._\">\n  <span ng-switch-when=\"messageMediaPhoto\" my-i18n=\"conversation_media_photo\"></span>\n  <span ng-switch-when=\"messageMediaDocument\" ng-switch=\"message.media.document.type || false\">\n    <span ng-switch-when=\"sticker\">\n      <span ng-bind-html=\"message.media.document.stickerEmoji\"></span>\n      <my-i18n msgid=\"conversation_media_sticker\"></my-i18n>\n    </span>\n    <span ng-switch-when=\"gif\" my-i18n=\"conversation_media_gif\"></span>\n    <span ng-switch-when=\"round\" my-i18n=\"conversation_media_round\"></span>\n    <span ng-switch-when=\"audio\" my-i18n=\"conversation_media_audio\"></span>\n    <span ng-switch-when=\"voice\" my-i18n=\"conversation_media_audio\"></span>\n    <span ng-switch-when=\"video\" my-i18n=\"conversation_media_video\"></span>\n    <span ng-switch-default ng-bind=\"message.media.document.file_name\"></span>\n  </span>\n  <span ng-switch-when=\"messageMediaGeo\" my-i18n=\"conversation_media_location\"></span>\n  <span ng-switch-when=\"messageMediaVenue\" my-i18n=\"conversation_media_location\"></span>\n  <span ng-switch-when=\"messageMediaContact\" my-i18n=\"conversation_media_contact\"></span>\n  <span ng-switch-when=\"messageMediaGame\">\n    <span my-emoji-image=\"🎮\"></span>\n    <span ng-bind-html=\"message.media.game.rTitle\"></span>\n  </span>\n  <span ng-switch-when=\"messageMediaUnsupported\" my-i18n=\"conversation_media_unsupported\"></span>\n  <span ng-switch-when=\"messageMediaUnsupportedWeb\" my-i18n=\"conversation_media_unsupported\"></span>\n</span><span class=\"im_short_message_service\" ng-if=\"message._ == 'messageService'\" ng-switch=\"message.action._\">\n  <span ng-switch-when=\"messageActionChatCreate\" my-i18n=\"conversation_group_created\"></span>\n  <span ng-switch-when=\"messageActionChatEditTitle\" my-i18n=\"conversation_group_renamed\"></span>\n  <span ng-switch-when=\"messageActionChatEditPhoto\" my-i18n=\"conversation_group_photo_updated\"></span>\n  <span ng-switch-when=\"messageActionChatDeletePhoto\" my-i18n=\"conversation_group_photo_removed\"></span>\n  <span ng-switch-when=\"messageActionChatJoinedByLink\" my-i18n=\"conversation_joined_by_link\"></span>\n  <span ng-switch-when=\"messageActionChatReturn\" my-i18n=\"conversation_returned_to_group\"></span>\n  <span ng-switch-when=\"messageActionChatJoined\" my-i18n=\"conversation_joined_group\"></span>\n  <span ng-switch-when=\"messageActionChatAddUser\" my-i18n=\"conversation_invited_user\">\n      <my-i18n-param name=\"user\"><span my-peer-link=\"message.action.user_id\"></span></my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChatAddUsers\" my-i18n=\"\">\n    <ng-pluralize count=\"message.action.users.length\"\n                  when=\"conversation_invited_users\">\n    </ng-pluralize>\n  </span>\n  <span ng-switch-when=\"messageActionChatLeave\" my-i18n=\"conversation_left_group\"></span>\n  <span ng-switch-when=\"messageActionChatDeleteUser\" my-i18n=\"conversation_kicked_user\">\n    <my-i18n-param name=\"user\"><span my-peer-link=\"message.action.user_id\"></span></my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChatMigrateTo\" my-i18n=\"conversation_converted_to_supergroup\"></span>\n  <span ng-switch-when=\"messageActionChannelMigrateFrom\" my-i18n=\"conversation_converted_to_supergroup\"></span>\n  <span ng-switch-when=\"messageActionChannelCreate\" my-i18n=\"conversation_created_channel\"></span>\n  <span ng-switch-when=\"messageActionChannelEditTitle\" my-i18n=\"conversation_changed_channel_name\"></span>\n  <span ng-switch-when=\"messageActionChannelEditPhoto\" my-i18n=\"conversation_changed_channel_photo\"></span>\n  <span ng-switch-when=\"messageActionPinMessage\" my-i18n=\"conversation_pinned_message\"></span>\n  <span ng-switch-when=\"messageActionGameScore\">\n      <ng-pluralize count=\"message.action.score\"\n                     when=\"conversation_scored_X\"></ng-pluralize>\n    </my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionPhoneCall\" ng-switch=\"message.action.type\">\n    <span ng-switch-when=\"out_missed\" my-i18n=\"message_service_phonecall_canceled\"></span>\n    <span ng-switch-when=\"in_missed\" my-i18n=\"message_service_phonecall_missed\"></span>\n    <span ng-switch-when=\"out_ok\" my-i18n=\"message_service_phonecall_outgoing\"></span>\n    <span ng-switch-when=\"in_ok\" my-i18n=\"message_service_phonecall_incoming\"></span>\n  </span>\n  <span ng-switch-when=\"messageActionPaymentSent\" my-i18n=\"message_service_payment_sent\"></span>\n  <span ng-switch-when=\"messageActionScreenshotTaken\" my-i18n=\"message_service_screenshot_taken\"></span>\n  <span ng-switch-when=\"messageActionCustomAction\" ng-bind=\"message.action.message\"></span>\n\n\n</span><span class=\"im_short_message_text\" ng-if=\"message.message.length && (!message.media || message.media._ == 'messageMediaWebPage')\" ng-bind-html=\"message.richMessage\"></span>"
  },
  {
    "path": "app/partials/desktop/slider.html",
    "content": "<div class=\"tg_slider_wrap\">\n\t<div class=\"tg_slider_thumb\"></div>\n\t<div class=\"tg_slider_track\">\n\t\t<div class=\"tg_slider_track_fill\"></div>\n\t</div>\n</div>"
  },
  {
    "path": "app/partials/desktop/stickerset_modal.html",
    "content": "<div class=\"stickerset_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head md_modal_head_simple\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$dismiss()\" my-i18n=\"modal_close\"></a>\n      </div>\n    </div>\n    <div class=\"md_modal_title\" ng-switch=\"!stickersetLoaded\">\n      <span ng-switch-when=\"true\" my-i18n=\"stickerset_modal_title_loading\"></span>\n      <span ng-switch-default ng-bind=\"stickerset.title\"></span>\n    </div>\n  </div>\n\n  <div class=\"md_modal_body\">\n\n    <div my-stickers-list class=\"stickerset_modal_col\">\n\n      <div class=\"stickerset_wrap nano\" my-infinite-scroller>\n        <div class=\"stickerset_scrollable_wrap nano-content\" ng-switch=\"!stickersetLoaded\">\n\n          <div ng-switch-when=\"true\" class=\"stickerset_modal_loading\" my-vertical-position=\"0.2\" padding=\"true\" my-i18n=\"stickerset_modal_loading\">\n            <my-i18n-param name=\"dots\">\n              <span my-loading-dots></span>\n            </my-i18n-param>\n          </div>\n\n          <div ng-switch-default class=\"stickerset_modal_stickers_list clearfix\">\n            <a class=\"stickerset_modal_sticker_wrap\" ng-repeat=\"sticker in documents | limitTo: slice.limit\" ng-click=\"chooseSticker(sticker.id)\">\n              <div class=\"stickerset_modal_sticker\" my-load-sticker document=\"sticker\" dim=\"stickerDimensions[sticker.id]\"></div>\n              <div class=\"stickerset_modal_sticker_alt\" ng-bind-html=\"stickerEmojis[sticker.id]\"></div>\n            </a>\n          </div>\n\n        </div>\n      </div>\n\n    </div>\n\n    <div class=\"stickerset_actions_wrap\">\n      <div class=\"stickerset_actions\" ng-switch=\"stickersetInstalled\">\n        <button ng-if=\"stickersetLoaded\" class=\"btn btn-md btn-md-primary pull-left\" my-i18n=\"stickerset_modal_share\" ng-click=\"share()\"></button>\n        <button ng-switch-when=\"true\" class=\"btn btn-md btn-md-danger\" my-i18n=\"stickerset_modal_uninstall\" ng-click=\"toggleInstalled(false)\"></button>\n        <button ng-switch-when=\"false\" class=\"btn btn-md btn-md-primary\" my-i18n=\"stickerset_modal_install\" ng-click=\"toggleInstalled(true)\"></button>\n      </div>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/desktop/user_modal.html",
    "content": "<div class=\"user_modal_wrap md_modal_wrap\" my-modal-position>\n\n  <div class=\"md_modal_head\">\n    <div class=\"md_modal_title_wrap\">\n      <div class=\"md_modal_actions_wrap clearfix\">\n        <a class=\"md_modal_action md_modal_action_close\" ng-click=\"$close()\" my-i18n=\"modal_close\"></a>\n        <a class=\"md_modal_action\" ng-if=\"user.pFlags.contact\" ng-click=\"importContact(true)\" my-i18n=\"modal_edit\"></a>\n      </div>\n      <div class=\"md_modal_title\" my-i18n=\"user_modal_contact_info\"></div>\n    </div>\n\n    <div class=\"peer_modal_profile_wrap clearfix\">\n      <div class=\"peer_modal_photo_wrap pull-left\">\n        <a ng-click=\"openUserPic()\" class=\"peer_modal_photo\" ng-class=\"{disabled: !user.photo.photo_id}\" ng-disabled=\"!user.photo.photo_id\" my-peer-photolink=\"::user.id\" img-class=\"peer_modal_photo\" no-open=\"true\"></a>\n      </div>\n      <div class=\"peer_modal_profile\">\n        <div class=\"peer_modal_profile_name\" my-peer-link=\"user.id\" verified=\"true\"></div>\n        <div class=\"peer_modal_profile_description\" my-user-status=\"::user.id\"></div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"md_modal_split_actions_wrap\">\n    <div class=\"md_modal_split_actions\">\n      <a class=\"md_modal_split_action\" href=\"\" ng-click=\"goToHistory()\" title=\"{{'user_modal_send_message' | i18n}}\">\n        <i class=\"md_modal_split_action_msg\"></i>\n      </a>\n    </div>\n  </div>\n\n\n  <div class=\"md_modal_body\">\n\n    <div class=\"md_modal_sections clearfix\">\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_number\" ng-if=\"user.phone || user.username || rAbout\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_phone\"></i>\n\n        <div class=\"md_modal_section_param_wrap\" ng-if=\"user.phone\">\n          <div class=\"md_modal_section_param_value\" ng-bind=\"user.phone | phoneNumber\"></div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"user_modal_phone\"></div>\n        </div>\n\n        <div class=\"md_modal_section_param_wrap\" ng-if=\"user.username\">\n          <div class=\"md_modal_section_param_value\">\n            <span ng-bind=\"'@' + user.username\"></span>\n          </div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"user_modal_username\"></div>\n        </div>\n\n        <div class=\"md_modal_section_param_wrap\" ng-if=\"rAbout\">\n          <div class=\"md_modal_section_param_value\">\n            <span ng-bind-html=\"rAbout\"></span>\n          </div>\n          <div class=\"md_modal_section_param_name\" my-i18n=\"user_modal_about\"></div>\n        </div>\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_toggle\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_notification\"></i>\n\n        <a class=\"md_modal_section_toggle_wrap tg_checkbox\" ng-click=\"settings.notifications = !settings.notifications\" ng-class=\"settings.notifications ? 'tg_checkbox_on' : ''\">\n          <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n          <span class=\"tg_checkbox_label\" my-i18n=\"user_modal_notifications\"></span>\n        </a>\n\n      </div>\n\n      <div class=\"md_modal_iconed_section_wrap md_modal_iconed_section_link\" ng-init=\"f.showMoreActions = !user.phone.length\">\n        <i class=\"md_modal_section_icon md_modal_section_icon_more\"></i>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"user.pFlags.bot &amp;&amp; !user.pFlags.bot_nochats\">\n          <a class=\"md_modal_section_link\" ng-click=\"inviteToGroup()\" my-i18n=\"user_modal_add_to_group\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"bot_info.commands.settings != null\">\n          <a class=\"md_modal_section_link\" ng-click=\"sendCommand('settings')\" my-i18n=\"user_modal_bot_settings\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"bot_info.commands.help != null\">\n          <a class=\"md_modal_section_link\" ng-click=\"sendCommand('help')\" my-i18n=\"user_modal_bot_help\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"user.phone.length > 0 &amp;&amp; !user.pFlags.contact &amp;&amp; !user.pFlags.self\">\n          <a class=\"md_modal_section_link\" ng-click=\"importContact()\" my-i18n=\"user_modal_add_contact\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"user.phone.length > 0\">\n          <a class=\"md_modal_section_link\" ng-click=\"shareContact()\" my-i18n=\"user_modal_share_contact\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"f.showMoreActions &amp;&amp; user.pFlags.contact\">\n          <a class=\"md_modal_section_link\" ng-click=\"deleteContact()\" my-i18n=\"user_modal_delete_contact\"></a>\n        </div>\n\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"f.showMoreActions &amp;&amp; !user.pFlags.self\">\n          <a class=\"md_modal_section_link\" ng-click=\"toggleBlock(!blocked)\" ng-switch=\"blocked\">\n            <my-i18n ng-switch-when=\"true\" msgid=\"user_modal_unblock_user\"></my-i18n>\n            <my-i18n ng-switch-default msgid=\"user_modal_block_user\"></my-i18n>\n          </a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"f.showMoreActions\">\n          <a class=\"md_modal_section_link\" ng-click=\"flushHistory(true)\" my-i18n=\"user_modal_clear_history\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"f.showMoreActions\">\n          <a class=\"md_modal_section_link\" ng-click=\"flushHistory()\" my-i18n=\"user_modal_delete_chat\"></a>\n        </div>\n\n        <div class=\"md_modal_section_link_wrap\" ng-if=\"!f.showMoreActions\">\n          <a class=\"md_modal_section_link\" ng-click=\"f.showMoreActions = true\" my-i18n=\"modal_more\"></a>\n        </div>\n\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n\n"
  },
  {
    "path": "app/partials/desktop/username_edit_modal.html",
    "content": "<div class=\"md_simple_modal_wrap\" my-modal-position>\n\n  <div class=\"md_simple_modal_body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateUsername()\">\n\n      <h4 my-i18n=\"username_edit_modal_title\"></h4>\n\n      <div class=\"md-input-group\" ng-class=\"{'md-input-error': checked.error}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"username_edit_placeholder\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"profile.username\" name=\"username\" ng-model-options=\"{updateOn: 'default blur', debounce: {default: 600, blur: 0}}\" />\n      </div>\n\n      <div class=\"md_simple_form_description\" my-i18n=\"username_edit_description_md\"></div>\n\n    </form>\n\n  </div>\n\n  <div class=\"md_simple_modal_footer\">\n\n    <button class=\"btn btn-md\" ng-click=\"$dismiss()\" my-i18n=\"modal_cancel\"></button>\n    <button class=\"btn btn-md btn-md-primary\" ng-class=\"{disabled: profile.updating}\" ng-click=\"updateUsername()\" ng-bind=\"profile.updating ? 'username_edit_submit_active' : 'username_edit_submit' | i18n\" ng-disabled=\"profile.updating\"></button>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/desktop/video_modal.html",
    "content": "<div class=\"modal_close_wrap\" ng-class=\"{modal_close_wrap_wnext: nav.hasNext}\" ng-click=\"$close()\">\n  <div class=\"modal_close\"></div>\n</div>\n\n<div class=\"media_modal_bottom_panel_wrap\">\n  <div class=\"media_modal_bottom_panel\">\n    <div class=\"media_modal_bottom_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-click=\"download()\" title=\"{{'media_modal_download' | i18n}}\">\n        <i class=\"media_modal_action_btn_download\"></i>\n      </a>\n      <a class=\"media_modal_action_btn\" ng-if=\"messageID\" ng-click=\"forward()\"  title=\"{{'media_modal_forward' | i18n}}\">\n        <i class=\"media_modal_action_btn_forward\"></i>\n      </a>\n      <a class=\"media_modal_action_btn\" ng-if=\"messageID\" ng-click=\"delete()\" title=\"{{'media_modal_delete' | i18n}}\">\n        <i class=\"media_modal_action_btn_delete\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_info_wrap pull-left\" ng-if=\"video.user_id > 0\" ng-switch=\"messageID > 0\">\n      <a class=\"media_modal_author_photo pull-left\" my-peer-photolink=\"video.user_id\" img-class=\"media_modal_author_photo\" watch=\"true\"></a>\n      <div class=\"media_modal_author_name\">\n        <a class=\"media_modal_author\" my-peer-link=\"video.user_id\" peer-watch=\"true\"></a>\n      </div>\n      <div class=\"media_modal_date\" ng-if=\"video.date > 0\">\n        <a ng-switch-when=\"true\" class=\"media_modal_date\" ng-click=\"goToMessage()\" ng-bind=\"video.date | dateOrTime :true\"></a>\n        <span ng-switch-default ng-bind=\"video.date | dateOrTime :true\"></span>\n      </div>\n    </div>\n\n    <div class=\"media_modal_title_wrap\" my-i18n=\"media_modal_video\"></div>\n  </div>\n</div>\n\n<div class=\"modal-dialog\">\n  <div class=\"modal-content\">\n    <div my-modal-width=\"{{video.full.width - 32}}\" class=\"media_modal_wrap video_modal_wrap\" my-modal-position animation=\"no\">\n\n      <div class=\"modal-body\">\n        <div class=\"video_modal_image_wrap\" my-load-video video=\"video\"></div>\n\n      </div>\n\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/mobile/audio_player.html",
    "content": "<div class=\"audio_player_wrap clearfix\">\n\t<a class=\"im_message_file_button\" ng-click=\"togglePlay()\" ng-class=\"{im_message_file_button_dl_audio: audio.downloaded}\">\n\t  <i class=\"im_message_file_button_icon\" ng-class=\"{audio_player_btn_icon_pause: mediaPlayer.player.playing}\"></i>\n\t</a>\n\t<div class=\"audio_player_title_wrap\">\n\t\t<div class=\"audio_player_meta pull-right\" ng-if=\"audio.downloaded &amp;&amp; (mediaPlayer.player.duration || audio.duration)\" ng-switch=\"mediaPlayer.player.playing || mediaPlayer.player.currentTime > 0\">\n\t\t\t<span ng-switch-when=\"true\" class=\"audio_player_duration\" ng-bind=\"mediaPlayer.player.currentTime | durationRemains : duration()\"></span>\n\t\t\t<span ng-switch-default class=\"audio_player_duration\" ng-bind=\"duration() | duration\"></span>\n\t\t</div>\n\t\t<span class=\"copyonly\">[ </span>\n\t\t<a ng-attr-title=\"{{audio.file_name}}\" ng-click=\"download()\" class=\"audio_player_title\" ng-switch=\"::audio.audioTitle.length > 0 ? 2 : (audio.file_name.length > 0 ? 1 : 0)\">\n\t\t\t<span ng-switch-when=\"2\">\n\t\t\t\t<strong ng-bind=\"::audio.audioPerformer\"></strong>\n\t\t\t\t<span ng-bind=\"::(audio.audioPerformer ? '– ' : '') + audio.audioTitle\"></span>\n\t\t\t</span>\n\t\t\t<span ng-switch-when=\"1\" ng-bind=\"::audio.file_name\"></span>\n\t\t\t<span ng-switch-default my-i18n=\"message_attach_audio_message\"></span>\n\t\t</a>\n\t\t<span class=\"copyonly\">]</span>\n\t\t<i ng-if=\"::message.pFlags.media_unread || false\" ng-show=\"message.pFlags.media_unread\" class=\"icon icon-audio-unread\"></i>\n\t\t<div class=\"audio_player_meta\" ng-if=\"!audio.downloaded || !duration()\" ng-switch=\"audio.progress.enabled\">\n\t\t\t<span ng-switch-when=\"true\" class=\"audio_player_size\" ng-bind=\"audio.progress | formatSizeProgress\"></span>\n\t\t\t<span ng-switch-default class=\"audio_player_size\" ng-bind=\"audio.size | formatSize\"></span>\n\t\t</div>\n\t</div>\n\t<div class=\"audio_player_actions noselect\" ng-if=\"!audio.progress.enabled &amp;&amp; !audio.downloaded\">\n    <a class=\"nocopy\" ng-if=\"audio._ == 'document'\" ng-click=\"download()\" my-i18n=\"message_attach_document_download\"></a>\n    <a class=\"nocopy\" ng-click=\"togglePlay()\" my-i18n=\"message_attach_audio_play\"></a>\n\t</div>\n\t<div class=\"audio_player_progress_wrap\" ng-if=\"audio.progress.enabled || audio.downloaded\" ng-switch=\"audio.progress.enabled\">\n\t\t<div ng-switch-when=\"true\" class=\"clearfix im_message_cancelable_progress_wrap\">\n\t\t  <a class=\"im_message_media_progress_cancel pull-right nocopy\" ng-click=\"audio.progress.cancel()\" my-i18n=\"modal_cancel\"></a>\n\t\t  <div class=\"im_message_download_progress_wrap\">\n\t\t    <div class=\"progress tg_down_progress\">\n\t\t      <div class=\"progress-bar progress-bar-success\" ng-style=\"{width: audio.progress.percent + '%'}\"></div>\n\t\t    </div>\n\t\t  </div>\n\t\t</div>\n\t  <div ng-switch-default class=\"im_message_playback_progress_wrap\">\n\t  \t<div class=\"audio_player_seek_slider\" my-slider slider-model=\"mediaPlayer.player.currentTime\" slider-max=\"duration()\" slider-onchange=\"seek(value)\"></div>\n\t  \t<div class=\"audio_player_volume_slider\" my-slider slider-model=\"mediaPlayer.player.volume\" slider-min=\"0\" slider-max=\"1\" slider-onchange=\"setVolume(value)\"></div>\n\t  </div>\n\t</div>\n\t<div class=\"audio_player_media\" ng-if=\"audio.url\" my-ogv-player=\"mediaPlayer.player\" src=\"audio.url\" volume=\"{{::volume}}\"></div>\n</div>"
  },
  {
    "path": "app/partials/mobile/changelog_modal.html",
    "content": "<div class=\"changelog_modal_wrap\">\n\n  <a class=\"modal-close-button\" ng-click=\"$close()\"><i></i></a>\n\n  <div class=\"modal-body\">\n\n    <div class=\"changelog_card_wrap\" ng-switch=\"lastVersion === false\">\n      <div ng-switch-when=\"true\">\n        <div class=\"changelog_card\"></div>\n        <h2 class=\"changelog_header\" my-i18n=\"changelog_modal_header_recent_updates_md\"></h2>\n      </div>\n      <div ng-switch-default>\n        <div class=\"changelog_card\"></div>\n        <h2 class=\"changelog_header\" my-i18n=\"changelog_modal_header_new_updates_md\"></h2>\n      </div>\n    </div>\n\n    <div class=\"changelog_versions_wrap\">\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.5.6\n          <span class=\"pull-right\" my-i18n=\"changelog_modal_title_current_version\"></span>\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Edit the text of your messages after sending them. This works across all Telegram chats, including groups and one-on-one conversations. Select a message and click 'Edit' or just press the up arrow button to edit your last message.</li>\n            <li>Unsend Messages: retract any messages within 48 hours of sending them. Check out the <a href=\"https://telegram.org/blog/unsend-and-usage\" target=\"_blank\">Telegram Blog</a> for more info.</li>\n            <li>Pinned chats. Check out the <a href=\"https://telegram.org/blog/pin-and-ifttt\" target=\"_blank\">Telegram Blog</a> for more info.</li>\n            <li>Sticker suggestions by emoji.</li>\n            <li>Search for messages in specific chats.</li>\n            <li>Background notifications in Chrome and Firefox (can be disabled in Settings)</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.5.5\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Introducing Drafts: Seamless syncing for unsent messages on all your devices. Drafts are now visible in your chats list.</li>\n            <li>Mention people in groups by typing @ and selecting them from the list — even if they don't have a username.</li>\n            <li>Share links to specific posts in channels via quick forwarding menu (click on the date in a message to try this out).</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.5.4\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Introducing Bot API 2.0, the biggest update to our bot platform since June 2015.</li>\n            <li>New inline keyboards with callback, 'open URL' or 'switch to inline mode' buttons help create seamless interfaces.</li>\n            <li>Bots can now update existing messages on the fly as you interact with them.</li>\n            <li>Prepare for the rise of location-based bots: all bots can now ask users to share their location.</li>\n            <li>Inline bots can now send all attachments supported in Telegram (videos, music, stickers, files, etc.).</li>\n            <li>Try out these sample bots to see what's coming your way soon: @music, @sticker, @youtube, @foursquare</li>\n            <li>Check out the <a href=\"https://telegram.org/blog/bots-2-0\" target=\"_blank\">Telegram Blog</a> for more info.</li>\n            <li>New quick forwarding in channels (click on the date in a message to try this out).</li>\n            <li>Improved performance.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.5.3\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Inline bots: A new way to add bot content to any chat. Type a bot's username and your query in the text field to get instant results and send them to your chat partner. Try typing <code>@gif dog</code> in your next chat. Sample bots: @gif, @wiki, @bing, @vid, @bold.</li>\n            <li>Check out the <a href=\"https://telegram.org/blog/inline-bots\" target=\"_blank\">Telegram Blog</a> for more info.</li>\n            <li>Improved GIFs: 20x faster sending and downloading, nice animated progress</li>\n            <li>Click on message date to reply (or to forward from channels).</li>\n            <li>Preview images before sending when pasting from clipboard.</li>\n            <li>Improved formatting for copy-pasted history fragments (date, time and sender names inserted automatically).</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.5.2\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Unread counters for muted chats now colored in gray.</li>\n            <li>Improved previews for sticker sets: Click on a sticker to view the whole set, click on stickers in a set to send right away, added a 'Share' button.</li>\n            <li>Improved performance.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.5.1\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Groups that have reached their capacity of 200 users can be upgraded to supergroups of up to 1,000 members.</li>\n            <li>[Mobile] Supported web page previews.</li>\n            <li>[FirefoxOS] Added sender userpic to notifications.</li>\n            <li>[FirefoxOS] Supported share url from Browser.</li>\n            <li>Check out the <a href=\"https://telegram.org/blog/supergroups\" target=\"_blank\">Telegram Blog</a> for more info</li>\n          </ul>\n        </div>\n      </div>\n\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.5.0\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Removed annoying \"multiple tabs open\" error.</li>\n            <li>Improved message forwarding.</li>\n            <li>Added view counter to messages from channels.</li>\n            <li>Improved image loading in Safari and Firefox.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.9\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>New emoji and sticker menu, tabs for sticker packs.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.8\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Introducing Channels – a great new way to broadcast your messages to unlimited audiences.</li>\n            <li>Check out the <a href=\"https://telegram.org/blog/channels\" target=\"_blank\">Telegram Blog</a> for more info</li>\n            <li>Improved performance in Safari on OS X El Capitan.</li>\n            <li>Added formatting for fixed-width code, surround text with `single backticks` for inline text and ```triple backticks``` for blocks of pre-formatted text.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.7\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>New bot API, free for everyone. If you're an engineer, create your own bots for games, services or integrations.\n            </li>\n            <li>Check out <a href=\"https://telegram.org/blog/bot-revolution\" target=\"_blank\">Telegram Blog</a> for more info</li>\n            <li>Improved Stickers support: now stickers are loading much faster.</li>\n            <li>Click on any custom stickers in chats to view and add sticker sets.</li>\n            <li>[Mobile] Reply to a message easily: tap on any message and select \"Reply\".</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.6\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Install and share custom sticker sets like this one: <a href=\"tg://addstickers?set=Animals\">telegram.me/addstickers/Animals</a></li>\n            <li>If you're an artist, create custom sticker sets using our <a href=\"tg://resolve?domain=stickers\">@Stickers</a> bot.</li>\n            <li>Check out <a href=\"https://telegram.org/blog/stickers-revolution\" target=\"_blank\">Telegram Blog</a> for more info</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.5\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>\n              Invite links for group chats:<br/>\n              Check out <a href=\"https://telegram.org/blog/invite-links\" target=\"_blank\">Telegram Blog</a> for more info\n            </li>\n            <li>Smart notifications</li>\n            <li>'Listened' status for voice messages</li>\n            <li>Places in locations (venues, landmarks)</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.4\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Link Previews:<br/>\n            Get rich link summaries for tweets, YouTube videos, Instagram photos and other content.</li>\n\n            <li>Check out <a href=\"https://telegram.org/blog/link-preview\" target=\"_blank\">Telegram Blog</a> for more info.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.3\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Sessions List:<br/>\n            View your active Telegram sessions (on desktop, tablet and mobile devices) and close specific sessions remotely.</li>\n\n            <li>Two-step verification:<br/>\n            Set up an additional password that will be required to log into your Telegram account.</li>\n\n            <li>Check out <a href=\"https://telegram.org/blog/sessions-and-2-step-verification\" target=\"_blank\">Telegram Blog</a> for more info.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.2\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Optimization for screens with smaller Y-resolutions.</li>\n            <li>Supported Spotify URL embeds.</li>\n            <li>Mentions of the current user in group chats are now highlighted.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.1\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Reply to specific messages in groups.</li>\n            <li>Mention @usernames in groups to notify multiple users.</li>\n            <li>Revised notifications in groups: mentioned users and people you reply to will be notified (private chat notification settings apply in this case instead of group settings). Check out <a href=\"https://telegram.org/blog/replies-mentions-hashtags\" target=\"_blank\">Telegram Blog</a> for more info.</li>\n            <li>Setting to disable message preview</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.4.0\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Full stickers support</li>\n            <li>Multisearch box: instantly find chats, usernames and messages</li>\n            <li>Emoji autocomplete: e.g., type <strong>:kiss</strong> in the message field to see the list. <a href=\"http://www.emoji-cheat-sheet.com/\" target=\"_blank\">Full cheat sheet &raquo;</a></li>\n            <li>Added 'typing' notification in chats list</li>\n            <li>Online members counter in group headers</li>\n          </ul>\n        </div>\n      </div>\n\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.9\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>[Desktop] Material design completed</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.8\n          <span class=\"pull-right\" my-i18n=\"changelog_modal_title_current_version\"></span>\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Telegram.me links open right in Telegram Web when authorized</li>\n            <li>@username mentions in messages are clickable and open a conversation with the user</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.7\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>[Desktop] [Beta] New material design for modal windows</li>\n            <li>[Desktop] Forward messages to multiple recipients</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.6\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>New viewer for photos, videos, documents.</li>\n            <li>[FirefoxOS] Improved media downloads.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.5\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Added embedded Soundcloud tracks and playlists.</li>\n            <li>Added global user search to contacts list.</li>\n            <li>Added switch to mobile version on window resize.</li>\n            <li>Migrate to HTTPS notification</li>\n            <li>Bugfixes.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.4\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Added embedded Facebook posts and Vimeo videos.</li>\n            <li>Improved IE10+ support: downloading files and style fixes.</li>\n            <li>Added unsupported media playback warning.</li>\n            <li>Bugfixes.</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.3\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Added Native Client module: dramatically improved encryption speed; Download and upload speed is now as high as in native applications.</li>\n            <li>HTTPS. We recommend you to use <a href=\"https://web.telegram.org\" target=\"_blank\">https://web.telegram.org</a>.</li>\n            <li>Added multiple open tabs warning. Please note, that only one tab with Telegram Web will work.</li>\n            <li>Added embedded Instagram, Twitter, Vine, YouTube links.</li>\n            <li>Jump to selected spot when playing back audio.</li>\n            <li>Bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.2\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Usernames support: <a href=\"\" ng-click=\"changeUsername()\">Choose a username right now!</a></li>\n            <li>Search can now find public users by username.</li>\n            <li>Most popular emoticons shown in 'recent' when empty</li>\n            <li>Bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.1\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>New languages: Spanish, German and Italian are now available </li>\n            <li>New custom-made audio player</li>\n            <li>Bad browser page for IE 6-9</li>\n            <li>Perfomance improvements and bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.3.0\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Log in codes may be received in other Telegram apps</li>\n            <li>Partner's online status updates automatically</li>\n            <li>Added support for non-english hashtags in messages</li>\n            <li>Fixed invalid scrollbar width bug</li>\n            <li>[Desktop] Added automatic country code detection</li>\n            <li>[FirefoxOS] Improved PUSH-notifications for &lt;= 1.1</li>\n            <li>[FirefoxOS] Fixed emoji in notifications</li>\n            <li>[FirefoxOS] Fixed attachment bug for &lt;= 1.1</li>\n            <li>[FirefoxOS] Added phonebook permissions handling</li>\n            <li>[FirefoxOS] Added ability to share Gallery photos in Telegram</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.2.9\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Updated mobile layout</li>\n            <li>Bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.2.5\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Updated mobile layout</li>\n            <li>Improved performance</li>\n            <li>Improved messages grouping</li>\n            <li>[FirefoxOS] Fixed notifications for &lt;= 1.1</li>\n            <li>[FirefoxOS] Fixed phonebook import</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.2.1\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Improved key generation performance on slow devices</li>\n            <li>Added network sleep for mobile devices</li>\n            <li>[FirefoxOS] Added support of PUSH notifications</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.2\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Updated contacts list, added edit mode</li>\n            <li>First Firefox OS release. See <a href=\"https://marketplace.firefox.com/app/telegram\" target=\"_blank\">Firefox Marketplace</a></li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\" ng-show=\"canShowVersion('0.1.9')\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.1.9\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Improvements of performance</li>\n            <li>Bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\" ng-show=\"canShowVersion('0.1.8')\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.1.8\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Improved mobile layout</li>\n            <li>Bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\" ng-show=\"canShowVersion('0.1.7')\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.1.7\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Improved mobile layout</li>\n            <li>Added file cache for Firefox and Android</li>\n            <li>New design for forwarded messages</li>\n            <li>Hash-tags support</li>\n            <li>Messaging bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\" ng-show=\"canShowVersion('0.1.6')\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.1.6\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Added search of messages</li>\n            <li>Improved performance of chats with lots of unread messages</li>\n            <li>Bugfixes</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\" ng-show=\"canShowVersion('0.1.5')\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.1.5\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Added registration</li>\n            <li>Improved experience for newly registered users</li>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\" ng-show=\"canShowVersion('0.1.4')\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.1.4\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Browse userpic history (click on the photo in user info)</li>\n            <li>New <a href=\"https://github.com/zhukov/webogram\" target=\"_blank\" title=\"Source code on GitHub\">GitHub</a>, <a href=\"https://twitter.com/telegram_web\" target=\"_blank\" title=\"Follow us on Twitter!\">Twitter</a> buttons in Settings</li>\n            <li>Updated keyboard shortcuts:</li>\n            <ul>\n              <li><strong>Alt+Home</strong> - switch to first (most recent) conversation</li>\n              <li>Removed <strong>Alt+1, 2, 3..</strong> shortcuts due to conflicts in different browsers</li>\n            </ul>\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"modal_section changelog_version_wrap\" ng-show=\"canShowVersion('0.1.3')\">\n        <h3 class=\"modal_section_header changelog_version_title\">\n          Version 0.1.3\n        </h3>\n        <div class=\"modal_section_body changelog_version_changes\">\n          <ul class=\"list-unstyled changelog_version_changes_list\">\n            <li>Added version history to welcome screen</li>\n            <li>Added keyboard shortcuts:</li>\n            <ul>\n              <li><strong>Tab</strong> - set focus to message field</li>\n              <li><strong>Esc</strong> or <strong>Shift+Tab</strong> - set focus to search field</li>\n              <li><strong>Up/Down</strong> (while in search field) - move between conversations</li>\n              <li><strong>Enter</strong> (while in search field) - open selected or first conversation</li>\n              <li><strong>Alt+Up/Down</strong> - move to previous/next conversation</li>\n            </ul>\n            <li>Improved grouping for messages</li>\n            <li>Fixed video modal positioning bug</li>\n            <li>Fixed focusing issues on mobile</li>\n          </ul>\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/channel_modal.html",
    "content": "<div class=\"chat_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-toggle-wrap dropdown\" dropdown ng-if=\"hasRights('edit_title') || hasRights('edit_photo')\">\n          <a class=\"dropdown-toggle navbar-toggle\" dropdown-toggle>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </a>\n          <ul class=\"dropdown-menu\">\n            <li ng-if=\"chatFull.chat.photo.photo_small\" ng-if=\"hasRights('edit_photo')\">\n              <a ng-click=\"deletePhoto()\" my-i18n=\"group_modal_menu_delete_photo\"></a>\n            </li>\n            <li ng-if=\"hasRights('edit_title')\">\n              <a ng-click=\"editChannel()\" ng-switch=\"isMegagroup\">\n                <span ng-switch-when=\"true\" my-i18n=\"group_modal_menu_edit_group\"></span>\n                <span ng-switch-default my-i18n=\"channel_modal_menu_edit\"></span>\n              </a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$close()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\" ng-switch=\"isMegagroup\">\n                  <h4>\n                    <span ng-switch-when=\"true\" my-i18n=\"group_modal_info\"></span>\n                    <span ng-switch-default my-i18n=\"channel_modal_info\"></span>\n                  </h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"mobile_user_modal_photo_profile_wrap\">\n\n      <a ng-click=\"openPhoto(chatFull.chat_photo.id, {p: -chatFull.chat.id})\"  class=\"mobile_user_modal_image_wrap pull-left\" my-peer-photolink=\"::-chatFull.chat.id\" img-class=\"mobile_user_modal_image mobile_chat_modal_image\" no-open=\"true\" watch=\"true\" ng-class=\"{disabled: !chatFull.chat.photo.photo_small}\" ng-disabled=\"!chatFull.chat.photo.photo_small\"></a>\n\n      <div class=\"mobile_user_modal_info_wrap clearfix\">\n        <h4 class=\"mobile_user_modal_header\" my-peer-link=\"-chatFull.chat.id\"></h4>\n        <p class=\"mobile_user_modal_status\"  ng-if=\"chatFull.participants_count > 0\" ng-switch=\"isMegagroup\">\n          <ng-pluralize ng-switch-when=\"true\"\n                        count=\"chatFull.participants_count\"\n                        when=\"group_modal_pluralize_participants\">\n          </ng-pluralize>\n          <ng-pluralize ng-switch-default\n                        count=\"chatFull.participants_count\"\n                        when=\"group_modal_pluralize_subscribers\">\n          </ng-pluralize>\n        </p>\n      </div>\n\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"chatFull.chat.username\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"channel_modal_share_link\"></h4>\n      <div class=\"mobile_modal_section_value\">\n        <a class=\"settings_modal_username_link\" ng-click=\"shareLink($event)\" ng-bind=\"'https://t.me/' + chatFull.chat.username\" ng-href=\"https://t.me/{{chatFull.chat.username}}\" target=\"_blank\"></a>\n      </div>\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"!chatFull.chat.username &amp;&amp; chatFull.chat.pFlags.creator\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"channel_modal_share_link\"></h4>\n      <div class=\"mobile_modal_section_value\" ng-switch=\"chatFull.exported_invite._\">\n        <a ng-switch-when=\"chatInviteExported\" class=\"settings_modal_username_link\" ng-click=\"shareLink($event)\" ng-bind=\"chatFull.exported_invite.link\" ng-href=\"{{chatFull.exported_invite.link}}\" target=\"_blank\"></a>\n        <span ng-switch-default my-i18n=\"channel_modal_share_loading\">\n          <my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n        </span>\n      </div>\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"chatFull.rAbout\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"channel_modal_description\"></h4>\n      <div class=\"mobile_modal_section_value\" ng-bind-html=\"chatFull.rAbout\"></div>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"hasRights('edit_photo') &amp;&amp; !photo.updating\">\n      <span class=\"mobile_modal_action mobile_modal_upload_action\">\n        <input my-file-upload  type=\"file\" multiple=\"false\" class=\"im_attach_input\" size=\"120\" multiple=\"false\" accept=\"image/x-png, image/png, image/gif, image/jpeg\" />\n        <span my-i18n=\"group_modal_update_photo\"></span>\n      </span>\n    </div>\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"photo.updating\">\n      <span class=\"mobile_modal_action\" my-i18n>\n        <span my-i18n=\"group_modal_update_active\"></span>\n        <span my-loading-dots></span>\n      </span>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"hasRights('invite') || chatFull.chat.pFlags.left\" ng-switch=\"chatFull.chat.pFlags.left\">\n      <a ng-switch-when=\"true\" class=\"mobile_modal_action\" ng-click=\"joinChannel()\" ng-switch=\"isMegagroup\">\n        <span ng-switch-when=\"true\" my-i18n=\"group_modal_join\"></span>\n        <span ng-switch-default my-i18n=\"channel_modal_join\"></span>\n      </a>\n      <a ng-switch-default class=\"mobile_modal_action\" ng-click=\"inviteToChannel()\" my-i18n=\"channel_modal_add_member\"></a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"settings.notifications = !settings.notifications\" ng-class=\"settings.notifications ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"group_modal_notifications\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"isMegagroup && !chatFull.chat.username && !chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked\">\n      <a class=\"mobile_modal_action\" ng-click=\"flushHistory()\" my-i18n=\"group_modal_menu_clear_history\"></a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"!chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked && !isMegagroup\">\n      <a class=\"mobile_modal_action\" ng-click=\"leaveChannel()\" my-i18n=\"channel_modal_leave_channel\"></a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"chatFull.chat.pFlags.creator\">\n      <a class=\"mobile_modal_action\" ng-click=\"deleteChannel()\" ng-switch=\"isMegagroup\">\n        <span ng-switch-when=\"true\" my-i18n=\"group_modal_delete_group\"></span>\n        <span ng-switch-default my-i18n=\"channel_modal_delete_channel\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"participants.length > 0\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"group_modal_members\"></h4>\n      <div class=\"mobile_modal_section_body\">\n\n        <div class=\"chat_modal_members_list\">\n\n          <div class=\"chat_modal_participant_wrap clearfix\" ng-repeat=\"participant in participants | orderBy:'-user.sortStatus'\">\n\n            <a ng-if=\"participant.canLeave\" ng-click=\"leaveChannel()\" class=\"chat_modal_participant_kick pull-right\" my-i18n=\"group_modal_menu_leave\"></a>\n            <a ng-if=\"participant.canKick\" ng-click=\"kickFromChannel(participant.user_id)\" class=\"chat_modal_participant_kick pull-right\" my-i18n=\"group_modal_members_kick\"></a>\n\n            <a class=\"chat_modal_participant_photo pull-left\" my-peer-photolink=\"participant.user_id\" img-class=\"chat_modal_participant_photo\" status=\"true\"></a>\n\n            <div class=\"chat_modal_participant_name\">\n              <a my-peer-link=\"participant.user_id\"></a>\n            </div>\n            <div class=\"chat_modal_participant_status\" my-user-status=\"::participant.user_id\" bot-chat-privacy=\"true\"></div>\n          </div>\n\n        </div>\n\n      </div>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/chat_create_modal.html",
    "content": "<div class=\"contacts_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: group.creating}\" ng-click=\"createGroup()\" ng-bind=\"group.creating ? 'group_create_submit_active' : 'group_create_submit' | i18n\" ng-disabled=\"group.creating\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"group_create_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"createGroup()\" my-vertical-position=\"0.25\">\n\n      <div class=\"form-group\">\n        <input class=\"form-control input-lg\" my-focused type=\"text\" placeholder=\"{{'group_create_name' | i18n}}\" ng-model=\"group.name\"/>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/chat_edit_modal.html",
    "content": "<div class=\"contacts_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: group.updating}\" ng-click=\"updateGroup()\" ng-bind=\"group.updating ? 'group_edit_submit_active' : 'group_edit_submit' | i18n\" ng-disabled=\"group.updating\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"group_edit_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateGroup()\" my-vertical-position=\"0.25\">\n\n      <div class=\"form-group\">\n        <input class=\"form-control input-lg\" my-focused type=\"text\" placeholder=\"{{'group_edit_name' | i18n}}\" ng-model=\"group.name\"/>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/chat_modal.html",
    "content": "<div class=\"chat_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-toggle-wrap dropdown\" dropdown>\n          <a class=\"dropdown-toggle navbar-toggle\" dropdown-toggle>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </a>\n          <ul class=\"dropdown-menu\">\n            <li ng-if=\"chatFull.thumb.location\" ng-if=\"hasRights('edit_title')\">\n              <a ng-click=\"deletePhoto()\" my-i18n=\"group_modal_menu_delete_photo\"></a>\n            </li>\n            <li ng-if=\"hasRights('edit_title')\">\n              <a ng-click=\"editTitle()\" my-i18n=\"group_modal_menu_edit_group\"></a>\n            </li>\n            <li>\n              <a ng-click=\"flushHistory(true)\" my-i18n=\"group_modal_menu_clear_history\"></a>\n            </li>\n            <li ng-if=\"chatFull.chat.pFlags.creator\">\n              <a ng-click=\"migrateToSuperGroup()\" my-i18n=\"group_modal_migrate_to_supergroup\"></a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$close()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"group_modal_info\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"mobile_user_modal_photo_profile_wrap\">\n\n      <a ng-click=\"openPhoto(chatFull.chat_photo.id, {p: -chatFull.chat.id})\"  class=\"mobile_user_modal_image_wrap pull-left\" my-peer-photolink=\"::-chatFull.chat.id\" img-class=\"mobile_user_modal_image mobile_chat_modal_image\" no-open=\"true\" watch=\"true\" ng-class=\"{disabled: !chatFull.chat.photo.photo_small}\" ng-disabled=\"!chatFull.chat.photo.photo_small\"></a>\n\n      <div class=\"mobile_user_modal_info_wrap clearfix\">\n        <h4 class=\"mobile_user_modal_header\" my-peer-link=\"-chatFull.chat.id\"></h4>\n        <p class=\"mobile_user_modal_status\"  ng-if=\"chatFull.chat.participants_count > 0\">\n          <ng-pluralize count=\"chatFull.chat.participants_count\"\n                           when=\"group_modal_pluralize_participants\">\n          </ng-pluralize>\n        </p>\n      </div>\n\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"hasRights('invite') &amp;&amp; chatFull.participants.participants.length\">\n      <a class=\"mobile_modal_action\" ng-click=\"inviteToGroup()\" my-i18n=\"group_modal_add_member\"></a>\n    </div>\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"chatFull.chat._ != 'chatForbidden' && !chatFull.chat.pFlags.left && chatFull.chat.pFlags.creator\">\n      <a class=\"mobile_modal_action\" ng-click=\"inviteViaLink()\" my-i18n=\"group_modal_menu_share_link\"></a>\n    </div>\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"chatFull.chat._ == 'chatForbidden'\">\n      <a class=\"mobile_modal_action\" ng-click=\"flushHistory()\" my-i18n=\"group_modal_delete_group\"></a>\n    </div>\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"hasRights('edit_photo') &amp;&amp; !photo.updating\">\n      <span class=\"mobile_modal_action mobile_modal_upload_action\">\n        <input my-file-upload  type=\"file\" multiple=\"false\" class=\"im_attach_input\" size=\"120\" multiple=\"false\" accept=\"image/x-png, image/png, image/gif, image/jpeg\" />\n        <span my-i18n=\"group_modal_update_photo\"></span>\n      </span>\n    </div>\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"photo.updating\">\n      <span class=\"mobile_modal_action\" my-i18n>\n        <span my-i18n=\"group_modal_update_active\"></span>\n        <span my-loading-dots></span>\n      </span>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"settings.notifications = !settings.notifications\" ng-class=\"settings.notifications ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"group_modal_notifications\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_section\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"group_modal_members\"></h4>\n      <div class=\"mobile_modal_section_body\">\n\n        <div class=\"chat_modal_members_list\">\n\n          <div class=\"chat_modal_participant_wrap clearfix\" ng-repeat=\"participant in chatFull.participants.participants | orderBy:'-user.sortStatus'\">\n            <a ng-if=\"participant.canKick\" ng-click=\"kickFromGroup(participant.user_id)\" class=\"chat_modal_participant_kick pull-right\" my-i18n=\"group_modal_members_kick\"></a>\n            <a ng-if=\"participant.canLeave\" ng-click=\"leaveGroup()\" class=\"chat_modal_participant_kick pull-right\" my-i18n=\"group_modal_menu_delete_group\"></a>\n\n            <a class=\"chat_modal_participant_photo pull-left\" my-peer-photolink=\"participant.user_id\" img-class=\"chat_modal_participant_photo\" status=\"true\"></a>\n\n            <div class=\"chat_modal_participant_name\">\n              <a my-peer-link=\"participant.user_id\"></a>\n            </div>\n            <div class=\"chat_modal_participant_status\" my-user-status=\"::participant.user_id\" bot-chat-privacy=\"true\"></div>\n          </div>\n\n        </div>\n\n      </div>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/contacts_modal.html",
    "content": "<div class=\"contacts_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\" ng-switch=\"action\">\n\n          <ul ng-switch-when=\"edit\" class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-left\">\n              <a ng-click=\"toggleEdit(false)\" my-i18n=\"contacts_modal_edit_cancel\"></a>\n            </li>\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" ng-click=\"deleteSelected()\">\n                <my-i18n msgid=\"contacts_modal_edit_delete\"></my-i18n>\n                <strong ng-bind=\"selectedCount\"></strong>\n              </a>\n            </li>\n          </ul>\n\n          <div ng-switch-default class=\"navbar-toggle-wrap dropdown\" ng-show=\"!action\" dropdown>\n            <a class=\"dropdown-toggle navbar-toggle\" dropdown-toggle>\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n            </a>\n            <ul class=\"dropdown-menu\">\n              <li>\n                <a ng-click=\"toggleEdit(true)\" my-i18n=\"contacts_modal_edit_list\"></a>\n              </li>\n              <li>\n                <a ng-click=\"importContact()\" my-i18n=\"contacts_modal_new_contact\"></a>\n              </li>\n            </ul>\n          </div>\n\n          <ul ng-switch-default class=\"nav navbar-nav navbar-quick-nav\">\n            <li ng-if=\"action == 'select' || action == 'new_group'\" class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" ng-click=\"submitSelected()\" my-i18n=\"modal_next\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 ng-switch=\"action\">\n                    <div ng-switch-when=\"new_group\" ng-switch=\"selectedCount > 0\">\n                      <span ng-switch-when=\"true\">\n                        <ng-pluralize count=\"selectedCount\" when=\"contacts_modal_pluralize_new_group_members\">\n                        </ng-pluralize>\n                      </span>\n                      <span ng-switch-default my-i18n=\"group_create_contacts_modal_title\"></span>\n                    </div>\n                    <span ng-switch-default my-i18n=\"contacts_modal_title\"></span>\n                  </h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"contacts_modal_search\">\n      <input class=\"form-control contacts_modal_search_field no_outline\" my-focused type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\"/>\n      <a class=\"im_dialogs_search_clear tg_search_clear\" ng-click=\"search.query = ''\" ng-show=\"search.query.length\">\n        <i class=\"icon icon-search-clear\"></i>\n      </a>\n    </div>\n\n\n    <div class=\"contacts_modal_col contacts_wrap contacts_scrollable_wrap mobile_scrollable_wrap\" my-contacts-list-mobile my-infinite-scroller-mobile>\n      <ul class=\"contacts_modal_members_list nav nav-pills nav-stacked\">\n\n        <li class=\"contacts_modal_contact_wrap clearfix\" ng-repeat=\"contact in contacts | limitTo: slice.limit track by contact.userID\" ng-class=\"{active: selectedContacts[contact.userID], disabled: disabledContacts[contact.userID]}\">\n          <a class=\"contacts_modal_contact\" ng-click=\"contactSelect(contact.userID)\">\n\n            <i ng-if=\"multiSelect\" class=\"icon icon-contact-tick\"></i>\n\n            <div class=\"contacts_modal_contact_photo pull-left\" my-peer-photolink=\"contact.userID\" status=\"true\" img-class=\"contacts_modal_contact_photo\"></div>\n            <div class=\"contacts_modal_contact_name\" my-peer-link=\"contact.userID\"></div>\n            <div class=\"contacts_modal_contact_status\" ng-switch=\"contact.found\">\n              <span ng-switch-when=\"true\" ng-bind=\"'@' + contact.user.username\"></span>\n              <span ng-switch-default my-user-status=\"::contact.userID\"></span>\n            </div>\n          </a>\n        </li>\n\n      </ul>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/country_select_modal.html",
    "content": "<div class=\"countries_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 class=\"modal_simple_header\" my-i18n=\"country_select_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"countries_modal_search\">\n      <input class=\"form-control countries_modal_search_field no_outline\" my-focused type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\"/>\n      <a class=\"countries_modal_search_clear tg_search_clear\" ng-click=\"search.query = ''\" ng-show=\"search.query.length\">\n        <i class=\"icon icon-search-clear\"></i>\n      </a>\n    </div>\n\n    <div class=\"countries_modal_col countries_wrap countries_scrollable_wrap mobile_scrollable_wrap\" my-countries-list-mobile my-infinite-scroller-mobile>\n      <ul class=\"countries_modal_members_list nav nav-pills nav-stacked\">\n\n        <li class=\"countries_modal_country_wrap clearfix\" ng-repeat=\"country in countries | limitTo : slice.limit track by $index\">\n          <a class=\"countries_modal_country\" ng-click=\"$close(country)\">\n            <span class=\"countries_modal_country_code pull-right\" ng-bind=\"country.code\"></span>\n            <span class=\"countries_modal_country_name\" ng-bind=\"country.name\"></span>\n          </a>\n        </li>\n\n      </ul>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/dialog.html",
    "content": "<a class=\"im_dialog\" ng-mousedown=\"dialogSelect(dialogMessage.peerString, dialogMessage.unreadCount == -1 && dialogMessage.mid)\">\n\n  <div class=\"im_dialog_meta pull-right text-right\">\n    <div class=\"im_dialog_date\" ng-bind=\"dialogMessage.dateText\"></div>\n    <span\n      class=\"im_dialog_badge badge ng-hide\"\n      ng-show=\"dialogMessage.unreadCount > 0 && !dialogMessage.pFlags.out\"\n      ng-bind=\"dialogMessage.unreadCount\"\n      my-peer-muted=\"dialogMessage.peerID\" muted-class=\"im_dialog_badge_muted\"\n    ></span>\n    <i\n      class=\"im_dialog_unread ng-hide\"\n      ng-show=\"dialogMessage.pFlags.out && dialogMessage.pFlags.unread\"\n    ></i>\n    <i\n      class=\"im_dialog_pinned ng-hide\"\n      ng-show=\"dialogMessage.pinned && !dialogMessage.unreadCount && !dialogMessage.pFlags.unread\"\n    ></i>\n  </div>\n\n  <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"::dialogMessage.peerID\" img-class=\"im_dialog_photo\" watch=\"true\" for-dialog=\"true\"></div>\n\n  <div class=\"im_dialog_message_wrap\" ng-class=\"{im_dialog_message_wtyping: dialogMessage.typing > 0}\">\n\n    <div class=\"im_dialog_peer\">\n      <span my-peer-link=\"dialogMessage.peerID\" verified=\"true\" for-dialog=\"true\"></span>\n    </div>\n\n    <div ng-switch=\"dialogMessage.typing ? 'typing' : (!dialogMessage.unreadCount && dialogMessage.draft ? 'draft' : (dialogMessage.deleted ? 'deleted' : 'message'))\">\n\n      <div ng-switch-when=\"typing\" class=\"im_dialog_message im_dialog_message_typing\">\n        <span class=\"im_short_message_service\" my-i18n=\"im_conversation_group_typing\">\n          <my-i18n-param name=\"name\"><span my-peer-link=\"dialogMessage.typing\" short=\"true\" class=\"im_dialog_chat_from_wrap\"></span></my-i18n-param><my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n        </span>\n      </div>\n\n      <div ng-switch-when=\"draft\" class=\"im_dialog_message\">\n        <span class=\"im_dialog_chat_from_wrap\">\n          <span class=\"im_dialog_draft_from\" my-i18n=\"conversation_draft\"></span>\n        </span>\n        <span class=\"im_short_message_text\" ng-bind-html=\"dialogMessage.draft.richMessage\"></span>\n      </div>\n\n      <div ng-switch-when=\"deleted\" class=\"im_dialog_message\">\n        <span class=\"im_short_message_text\">&nbsp;</span>\n      </div>\n\n      <div ng-switch-when=\"message\" class=\"im_dialog_message\">\n        <span ng-switch=\"dialogMessage.peerID > 0 || dialogMessage.fromID < 0\">\n          <span ng-switch-when=\"true\">\n            <span class=\"im_dialog_chat_from_wrap\" ng-if=\"dialogMessage.pFlags.out && dialogMessage.fromID > 0\">\n              <span\n                class=\"im_dialog_chat_from\"\n                my-i18n=\"conversation_you\"\n              ></span><span ng-if=\"dialogMessage.message.length > 0 || !!dialogMessage.media\">:</span>\n            </span>\n          </span>\n          <span ng-switch-default>\n            <span class=\"im_dialog_chat_from_wrap\" ng-switch=\"dialogMessage.pFlags.out && dialogMessage._ != 'messageService'\">\n              <span\n                ng-switch-when=\"false\"\n                class=\"im_dialog_chat_from\"\n                my-peer-link=\"dialogMessage.from_id\" short=\"true\" peer-watch=\"true\"\n              ></span><span\n                ng-switch-when=\"true\"\n                class=\"im_dialog_chat_from\"\n                my-i18n=\"conversation_you\"\n              ></span><span ng-if=\"dialogMessage.message.length || dialogMessage.media\">:</span>\n            </span>\n          </span>\n        </span>\n\n        <span my-short-message=\"dialogMessage\"></span>\n      </div>\n    </div>\n\n  </div>\n\n</a>\n"
  },
  {
    "path": "app/partials/mobile/edit_contact_modal.html",
    "content": "<div class=\"import_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: progress.enabled}\" ng-click=\"doImport()\" ng-bind=\"progress.enabled ? 'contact_edit_modal_submit_active' : 'contact_edit_modal_submit'| i18n\" ng-disabled=\"progress.enabled\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"contact_edit_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"doImport()\" my-vertical-position=\"0.3\">\n\n      <div class=\"form-group\">\n        <span class=\"form-control uneditable_input input-lg disabled\" disabled my-focused type=\"text\" ng-bind=\"importContact.phone | phoneNumber\"></span>\n      </div>\n      <div class=\"form-group\">\n        <input class=\"form-control input-lg\" type=\"text\" placeholder=\"{{'contact_edit_modal_first_name' | i18n}}\" ng-model=\"importContact.first_name\" my-submit-on-enter/>\n      </div>\n      <div class=\"form-group\">\n        <input class=\"form-control input-lg\" type=\"text\" placeholder=\"{{'contact_edit_modal_last_name' | i18n}}\" ng-model=\"importContact.last_name\" my-submit-on-enter/>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/full_gif.html",
    "content": "<a class=\"img_gif_with_progress_wrap\" ng-click=\"toggle($event)\">\n\n  <div class=\"img_gif_image_wrap\">\n\n    <div class=\"img_gif_meta\" ng-show=\"!isActive || needClick\" ng-switch=\"document.progress.enabled\">\n      <div ng-switch-when=\"true\" class=\"img_gif_meta_contents\">\n        <i class=\"icon icon-cancel\">\n          <i class=\"icon icon-bar\"></i>\n          <i class=\"icon icon-bar\"></i>\n        </i>\n        <div my-arc-progress=\"document.progress.percent\"></div>\n      </div>\n      <div ng-switch-default class=\"img_gif_label noselect img_gif_meta_contents\">GIF</div>\n    </div>\n\n    <div ng-if=\"document.url\" ng-show=\"document.downloaded &amp;&amp; isActive\" ng-switch=\"document.mime_type == 'video/mp4'\">\n      <video ng-switch-when=\"true\" width=\"{{document.thumb.width}}\" height=\"{{document.thumb.height}}\" controls loop muted class=\"img_gif_video\">\n        <source ng-src=\"{{document.url}}\" type=\"video/mp4\">\n      </video>\n      <img ng-switch-default class=\"img_gif_image\" ng-src=\"{{document.url}}\" width=\"{{document.thumb.width}}\" height=\"{{document.thumb.height}}\" />\n    </div>\n    <img ng-hide=\"document.downloaded &amp;&amp; isActive\" class=\"img_gif_thumb\" my-load-thumb thumb=\"document.thumb\" />\n\n  </div>\n\n</a>"
  },
  {
    "path": "app/partials/mobile/full_photo.html",
    "content": "<div class=\"img_fullsize_with_progress_wrap\">\n  <div class=\"img_fullsize_progress_overlay\" ng-show=\"progress.enabled\">\n    <div class=\"img_fullsize_progress_wrap\">\n      <div class=\"img_fullsize_progress progress tg_progress\" ng-show=\"progress.percent > 0\">\n        <div class=\"progress-bar progress-bar-success\" ng-style=\"{width: progress.percent + '%'}\">\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"photo_full_wrap\">\n    <a class=\"photo_modal_image\">\n      <img class=\"photo_modal_image\"/>\n    </a>\n  </div>\n  <div class=\"photo_modal_error_wrap\" ng-if=\"error\">\n    <div class=\"photo_modal_error\" ng-if=\"error.html\" ng-bind-html=\"error.html\"></div>\n    <div class=\"photo_modal_error\" ng-if=\"error.text\" ng-bind=\"error.text\"></div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/mobile/full_video.html",
    "content": "<div class=\"img_fullsize_with_progress_wrap\" ng-style=\"{width: video.full.width + 'px', height: video.full.height + 'px'}\">\n  <div class=\"img_fullsize_progress_overlay\" ng-show=\"video.progress.enabled\">\n    <div class=\"img_fullsize_progress_wrap\" ng-style=\"{width: video.full.width + 'px', height: video.full.height + 'px'}\">\n      <div class=\"img_fullsize_progress progress tg_progress\">\n        <div class=\"progress-bar progress-bar-success\" style=\"width: {{video.progress.percent}}%\"></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"img_fullsize_wrap\" ng-if=\"!video.url\">\n    <img\n      class=\"img_fullsize\"\n      my-load-thumb\n      thumb=\"video.fullThumb\"\n    />\n  </div>\n  <div class=\"video_full_player\" ng-if=\"video.url\" ng-switch=\"player.quicktime\">\n    <embed ng-switch-when=\"true\" ng-src=\"{{video.url}}\" width=\"{{video.full.width}}\" height=\"{{video.full.height}}\" autoplay=\"true\" CONTROLLER=\"TRUE\" SHOWCONTROLS=\"TRUE\" controller=\"true\" loop=\"false\" pluginspace=\"http://www.apple.com/quicktime/\" />\n    <video ng-switch-default width=\"{{video.full.width}}\" height=\"{{video.full.height}}\" controls autoplay >\n      <source ng-src=\"{{video.url}}\" type=\"video/mp4\">\n    </video>\n  </div>\n  <div class=\"video_full_error_wrap\" ng-if=\"error\">\n    <div class=\"video_full_error\" ng-if=\"error.html\" ng-bind-html=\"error.html\"></div>\n    <div class=\"video_full_error\" ng-if=\"error.text\" ng-bind=\"error.text\"></div>\n  </div>\n</div>"
  },
  {
    "path": "app/partials/mobile/game_modal.html",
    "content": "<div class=\"game_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-toggle-wrap dropdown\" dropdown>\n          <a class=\"dropdown-toggle navbar-toggle\" dropdown-toggle>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </a>\n          <ul class=\"dropdown-menu\">\n            <li>\n              <a ng-click=\"forward()\" my-i18n=\"game_modal_share_game\"></a>\n            </li>\n            <li>\n              <a ng-click=\"forward(true)\" my-i18n=\"game_modal_share_score\"></a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$close()\" class=\"navbar-quick-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 ng-bind-html=\"game.rTitle\"></h4>\n                  <small>@<span my-peer-link=\"botID\"></span></small>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\" ng-bind-html=\"game.full.html\" my-game-communication></div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/head.html",
    "content": "<div class=\"tg_page_head\">\n  <div class=\"navbar navbar-static-top  navbar-inverse\" role=\"navigation\" ng-class=\"{navbar_peer_not_selected: !curDialog.peer, navbar_offline: offline, navbar_history_select: historyState.selectActions}\">\n    <div class=\"container\">\n\n\n      <a class=\"navbar-peer-wrap\" my-peer-photolink=\"historyPeer.id\" peer-watch=\"true\"></a>\n\n      <div class=\"navbar-toggle-wrap dropdown\" dropdown ng-switch=\"!curDialog.peer\">\n        <a class=\"dropdown-toggle navbar-toggle\" dropdown-toggle>\n          <span class=\"icon-bar\"></span>\n          <span class=\"icon-bar\"></span>\n          <span class=\"icon-bar\"></span>\n        </a>\n        <ul ng-switch-when=\"true\" class=\"dropdown-menu\">\n          <li><a ng-click=\"openGroup()\" my-i18n=\"head_new_group\"></a></li>\n          <li><a ng-click=\"importContact()\" my-i18n=\"head_new_contact\"></a></li>\n          <li ng-if=\"!isEmpty.contacts\"><a ng-click=\"openContacts()\" my-i18n=\"head_contacts\"></a></li>\n          <li><a ng-click=\"openSettings()\" my-i18n=\"head_settings\"></a></li>\n          <li><a ng-click=\"logOut()\" my-i18n=\"head_log_out\"></a></li>\n        </ul>\n        <ul ng-switch-default class=\"dropdown-menu\">\n          <li><a ng-click=\"toggleEdit()\" my-i18n=\"head_select_messages\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType\" class=\"divider\"></li>\n          <li ng-if=\"!historyFilter.mediaType\"><a ng-click=\"toggleMedia('photos')\" my-i18n=\"head_media_photos\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType\"><a ng-click=\"toggleMedia('video')\" my-i18n=\"head_media_video\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType\"><a ng-click=\"toggleMedia('documents')\" my-i18n=\"head_media_documents\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType\"><a ng-click=\"toggleMedia('music')\" my-i18n=\"head_media_music\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType\"><a ng-click=\"toggleMedia('urls')\" my-i18n=\"head_media_links\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType\"><a ng-click=\"toggleMedia('audio')\" my-i18n=\"head_media_audio\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType\"><a ng-click=\"toggleMedia('round')\" my-i18n=\"head_media_round\"></a></li>\n          <li ng-if=\"!historyFilter.mediaType && isHistoryPeerGroup()\" class=\"divider\"></li>\n          <li ng-if=\"!historyFilter.mediaType && isHistoryPeerGroup()\"><a ng-click=\"toggleMedia('mentions')\" my-i18n=\"head_media_mymentions\"></a></li>\n        </ul>\n      </div>\n\n      <a class=\"navbar-search-wrap\" ng-click=\"toggleSearch()\">\n        <i class=\"icon-search\"></i>\n      </a>\n\n      <div class=\"navbar-header\">\n\n        <a class=\"navbar-brand tg_logo_wrap\" href=\"#/im\"><i class=\"icon icon-tg-logo\"></i><i class=\"icon icon-tg-title\"></i></a>\n\n        <span class=\"tg_head_logo\"></span></a>\n\n        <div class=\"tg_head_peer_menu_wrap\" ng-switch=\"curDialog.peer &amp;&amp; historyFilter.mediaType.length > 0\">\n          <ul ng-switch-when=\"true\" class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"toggleMedia()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\" ng-switch=\"historyFilter.mediaType\">\n                  <h4 ng-switch-when=\"photos\" my-i18n=\"im_media_photos\"></h4>\n                  <h4 ng-switch-when=\"video\" my-i18n=\"im_media_video\"></h4>\n                  <h4 ng-switch-when=\"documents\" my-i18n=\"im_media_documents\"></h4>\n                  <h4 ng-switch-when=\"audio\" my-i18n=\"im_media_audio\"></h4>\n                  <h4 ng-switch-when=\"round\" my-i18n=\"im_media_round\"></h4>\n                  <h4 ng-switch-when=\"music\" my-i18n=\"im_media_music\"></h4>\n                  <h4 ng-switch-when=\"urls\" my-i18n=\"im_media_links\"></h4>\n                  <h4 ng-switch-when=\"mentions\" my-i18n=\"im_media_mentions\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n          <div ng-switch-default ng-switch=\"historyState.selectActions\">\n            <ul ng-switch-when=\"selected\" class=\"nav navbar-navbar navbar-quick-nav navbar-history-edit\">\n              <li class=\"navbar-quick-right\">\n                <a ng-click=\"toggleEdit()\" my-i18n=\"modal_cancel\"></a>\n              </li>\n              <li class=\"navbar-quick-left\">\n                <a ng-click=\"selectedFlush()\" my-i18n=\"head_clear_all\"></a>\n              </li>\n              <li class=\"navbar-quick-title\" my-i18n=\"head_select\"></li>\n            </ul>\n            <ul ng-switch-default class=\"nav navbar-nav navbar-quick-nav\" ng-switch=\"historyPeer.id > 0\">\n              <li ng-switch-when=\"true\">\n                <a href=\"#/im\" class=\"navbar-quick-profile-back\">\n                  <i class=\"icon icon-back\"></i>\n                  <div class=\"navbar-quick-back-title\">\n                    <h4 my-peer-link=\"historyPeer.id\" peer-watch=\"true\"></h4>\n                    <small ng-switch=\"historyState.typing.length\">\n                      <span ng-switch-when=\"1\" class=\"status_online\">\n                        <my-i18n msgid=\"head_typing\"></my-i18n><span my-loading-dots></span>\n                      </span>\n                      <span ng-switch-default my-user-status=\"historyPeer.id\" for-dialog=\"true\"></span>\n                    </small>\n                  </div>\n                </a>\n              </li>\n              <li ng-switch-default>\n                <a href=\"#/im\" class=\"navbar-quick-group-back\">\n                  <i class=\"icon icon-back\"></i>\n                  <div class=\"navbar-quick-back-title\">\n                    <h4 my-peer-link=\"historyPeer.id\" peer-watch=\"true\" for-dialog=\"true\"></h4>\n                    <small ng-switch=\"historyState.typing.length\">\n                      <span ng-switch-when=\"0\" class=\"tg_head_peer_status\" my-chat-status=\"-historyPeer.id\"></span>\n                      <my-i18n>\n                        <span ng-switch-when=\"1\" class=\"status_online\" my-i18n-format=\"head_one_typing\"></span>\n                        <span ng-switch-when=\"2\" class=\"status_online\" my-i18n-format=\"head_two_typing\"></span>\n                        <span ng-switch-default class=\"status_online\" my-i18n-format=\"head_many_typing\"></span>\n                        <my-i18n-param name=\"name1\"><span my-peer-link=\"historyState.typing[0]\" short=\"true\"></span></my-i18n-param>\n                        <my-i18n-param name=\"name2\"><span my-peer-link=\"historyState.typing[1]\" short=\"true\"></span></my-i18n-param>\n                        <my-i18n-param name=\"names\" ng-bind=\"historyState.typing.length - 1\"></my-i18n-param>\n                        <my-i18n-param name=\"dots\"><span my-loading-dots></span></my-i18n-param>\n                      </my-i18n>\n                    </small>\n                  </div>\n                </a>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"navbar-menu\" ng-if=\"offline\">\n\n        <ul class=\"nav navbar-nav navbar-offline\">\n          <li ng-show=\"!offlineConnecting\"><span class=\"navbar-offline-text\"><my-i18n msgid=\"head_waiting_for_network\"></my-i18n><span my-loading-dots></span></span></li>\n          <li ng-show=\"!offlineConnecting\" class=\"hidden-xs\"><a href=\"\" ng-click=\"retryOnline()\" my-i18n=\"head_retry\"></a></li>\n          <li ng-show=\"offlineConnecting\"><span class=\"navbar-offline-text\"><my-i18n msgid=\"head_connecting\"></my-i18n><span my-loading-dots></span></span></li>\n        </ul>\n      </div>\n\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/mobile/im.html",
    "content": "<div my-head></div>\n\n<div class=\"im_page_wrap\" ng-class=\"{im_page_peer_not_selected: !curDialog.peer}\">\n\n  <div class=\"im_page_split clearfix\">\n\n    <div ng-controller=\"AppImDialogsController\" my-dialogs class=\"im_dialogs_col_wrap\" ng-class=\"search.query.length > 0 ? 'im_dialogs_col_search' : ''\">\n      <div class=\"im_dialogs_panel\">\n        <div class=\"im_dialogs_search\">\n          <input class=\"form-control im_dialogs_search_field no_outline\" type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\" autocomplete=\"off\" />\n          <a class=\"im_dialogs_search_clear tg_search_clear\" ng-click=\"searchClear()\" ng-show=\"search.query.length\">\n            <i class=\"icon icon-search-clear\"></i>\n          </a>\n        </div>\n      </div>\n\n      <div my-dialogs-list-mobile class=\"im_dialogs_col im_dialogs_scrollable_wrap mobile_scrollable_wrap\">\n\n        <div class=\"im_dialogs_empty_wrap\" ng-if=\"isEmpty.contacts\" my-vertical-position=\"0.4\">\n          <h3 class=\"im_dialogs_empty_header\" my-i18n=\"im_no_contacts\"></h3>\n          <p class=\"im_dialogs_empty_lead\" my-i18n=\"im_get_started_long\"></p>\n          <button type=\"button\" class=\"btn btn-primary btn-block im_dialogs_add_contact\" ng-click=\"importContact()\" my-i18n=\"im_add_contact\"></button>\n          <button ng-if=\"phonebookAvailable\" type=\"button\" class=\"btn btn-primary btn-block im_dialogs_import_phonebook\" ng-click=\"importPhonebook()\" my-i18n=\"im_import_phonebook\"></button>\n        </div>\n\n        <ul class=\"nav nav-pills nav-stacked\">\n          <li class=\"im_dialog_wrap\" my-dialog dialog-message=\"dialogMessage\" ng-repeat=\"dialogMessage in dialogs track by dialogMessage.peerID\" ng-class=\"{active: curDialog.peerID == dialogMessage.peerID}\"></li>\n        </ul>\n\n        <div class=\"im_dialogs_contacts_wrap\" ng-show=\"myResults.length > 0\">\n          <h5 my-i18n=\"im_chat_contacts_title\"></h5>\n          <ul class=\"nav nav-pills nav-stacked\">\n            <li class=\"im_dialog_wrap\" ng-repeat=\"myResult in myResults track by myResult.id\" ng-class=\"{active: curDialog.peerID == myResult.id}\">\n              <a class=\"im_dialog\" ng-mousedown=\"dialogSelect(myResult.peerString)\">\n                <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"myResult.id\" img-class=\"im_dialog_photo\" watch=\"true\" for-dialog=\"true\"></div>\n                <div class=\"im_dialog_message_wrap\">\n                  <div class=\"im_dialog_peer\">\n                    <span class=\"im_dialog_user\" my-peer-link=\"myResult.id\"  verified=\"true\" for-dialog=\"true\"></span>\n                  </div>\n                  <div class=\"im_dialog_message\" ng-switch=\"myResult.id > 0\">\n                    <span ng-switch-when=\"true\" class=\"im_dialog_message_text\" my-user-status=\"::myResult.id\" for-dialog=\"true\"></span>\n                    <span ng-switch-default class=\"im_dialog_message_text\" my-chat-status=\"::-myResult.id\"></span>\n                  </div>\n                </div>\n              </a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"im_dialogs_contacts_wrap\" ng-show=\"foundPeers.length > 0\">\n          <h5 my-i18n=\"im_found_title\"></h5>\n          <ul class=\"nav nav-pills nav-stacked\">\n            <li class=\"im_dialog_wrap\" ng-repeat=\"foundPeer in foundPeers track by foundPeer.id\" ng-class=\"{active: curDialog.peerID == foundPeer.id}\">\n              <a class=\"im_dialog\" ng-mousedown=\"dialogSelect(foundPeer.peerString)\">\n                <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"foundPeer.id\" img-class=\"im_dialog_photo\" watch=\"true\" for-dialog=\"true\"></div>\n                <div class=\"im_dialog_message_wrap\">\n                  <div class=\"im_dialog_peer\">\n                    <span class=\"im_dialog_user\" my-peer-link=\"foundPeer.id\" verified=\"true\" for-dialog=\"true\"></span>\n                  </div>\n                  <div class=\"im_dialog_message\">\n                    <span class=\"im_dialog_message_text\" ng-switch=\"foundPeer.id > 0\">\n                      <span ng-bind=\"::'@' + foundPeer.username + ', '\"></span>\n                      <span ng-switch-when=\"true\" class=\"im_dialog_message_text\" my-user-status=\"::foundPeer.id\" for-dialog=\"true\"></span>\n                      <span ng-switch-default class=\"im_dialog_message_text\" my-chat-status=\"::-foundPeer.id\"></span>\n                    </span>\n                  </div>\n                </div>\n              </a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"im_dialogs_messages_wrap\" ng-show=\"foundMessages.length > 0\">\n          <h5 my-i18n=\"im_messages\"></h5>\n          <ul class=\"nav nav-pills nav-stacked\">\n            <li class=\"im_dialog_wrap\" my-dialog dialog-message=\"dialogMessage\" ng-repeat=\"dialogMessage in foundMessages track by dialogMessage.mid\" ng-class=\"{active: curDialog.peerID == dialogMessage.peerID &amp;&amp; curDialog.messageID == dialogMessage.mid}\"></li>\n          </ul>\n        </div>\n\n      </div>\n    </div>\n\n    <div class=\"im_history_col_wrap\" ng-controller=\"AppImHistoryController\" ng-class=\"{im_history_loaded: state.loaded}\">\n\n      <div class=\"im_history_not_selected_wrap im_history_not_selected\" my-vertical-position=\"0.35\" padding=\"true\">\n        <my-i18n msgid=\"im_loading_history\"></my-i18n><span my-loading-dots></span>\n      </div>\n\n      <div class=\"im_history_selected_wrap\">\n        <div my-history-mobile class=\"im_history_col\">\n\n          <div my-peer-pinned-message-bar=\"curDialog.peerID\" class=\"im_history_pinned_panel\"></div>\n\n          <div class=\"im_history_wrap im_history_scrollable_wrap mobile_scrollable_wrap\">\n\n            <div class=\"im_history_scrollable\">\n                <div class=\"im_history\" ng-class=\"{im_history_selectable: !historyState.botActions, im_history_select_active: historyState.selectActions}\">\n                  <div ng-if=\"state.empty\"  class=\"im_history_empty\" ng-switch=\"state.mayBeHasMore\" my-vertical-position=\"0.25\" padding=\"true\">\n                    <span ng-switch-when=\"true\">\n                      <my-i18n msgid=\"im_loading_history\"></my-i18n><span my-loading-dots></span>\n                    </span>\n                    <span ng-switch-default my-i18n=\"im_no_messages\"></span>\n                  </div>\n\n                  <div class=\"im_history_messages\" ng-class=\"{im_history_messages_group: historyPeer.id < 0}\">\n                    <div class=\"im_history_messages_peer\" ng-show=\"peerHistory.peerID == historyPeer.id\" ng-repeat=\"peerHistory in peerHistories\">\n                      <div class=\"im_history_message_wrap\" my-message ng-repeat=\"historyMessage in peerHistory.messages\"></div>\n                    </div>\n                  </div>\n\n                </div>\n\n            </div>\n\n          </div>\n\n          <div class=\"im_bottom_panel_wrap\">\n\n            <div class=\"im_edit_panel_wrap clearfix\" ng-show=\"historyState.actions()\" ng-switch=\"historyState.actions()\">\n              <div class=\"im_edit_panel_border\"></div>\n\n              <div ng-switch-when=\"bot\">\n                <a ng-show=\"historyState.botActions == 'param'\" class=\"btn btn-md btn-md-primary im_edit_cancel_link\" ng-click=\"cancelBot()\" my-i18n=\"modal_cancel\"></a>\n                <div class=\"im_edit_start_actions\">\n                  <a class=\"btn btn-primary im_start_btn\" ng-click=\"startBot()\" my-i18n=\"im_start\"></a>\n                </div>\n              </div>\n              <div ng-switch-when=\"channel\">\n                <div class=\"im_edit_start_actions\" ng-switch=\"historyState.channelActions\">\n                  <a ng-switch-when=\"join\" class=\"btn btn-primary im_start_btn\" ng-click=\"joinChannel()\" my-i18n=\"im_channel_join\"></a>\n                  <a ng-switch-when=\"mute\" class=\"btn btn-link im_start_btn\" ng-click=\"togglePeerMuted(true)\" my-i18n=\"im_channel_mute\"></a>\n                  <a ng-switch-when=\"unmute\" class=\"btn btn-link im_start_btn\" ng-click=\"togglePeerMuted(false)\" my-i18n=\"im_channel_unmute\"></a>\n                </div>\n              </div>\n              <div ng-switch-when=\"selected\" class=\"im_edit_selected_actions\" my-i18n>\n                <a class=\"btn btn-primary im_edit_forward_btn\" ng-click=\"selectedForward()\" ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" my-i18n-format=\"im_forward\"></a><a class=\"btn btn-primary im_edit_delete_btn\" ng-click=\"selectedDelete()\" ng-class=\"{disabled: !selectedCount}\" ng-disabled=\"!selectedCount\" my-i18n-format=\"im_delete\" ng-show=\"historyState.canDelete\"></a>\n                <my-i18n-param name=\"count\"><strong class=\"im_selected_count\" ng-show=\"selectedCount > 0\" ng-bind=\"selectedCount\"></strong></my-i18n-param>\n              </div>\n            </div>\n\n            <div class=\"im_send_panel_wrap\" ng-show=\"!historyState.actions()\">\n\n              <div class=\"im_send_form_wrap1\">\n\n                <div class=\"im_send_form_wrap clearfix\" ng-controller=\"AppImSendController\">\n                  <div my-send-form draft-message=\"draftMessage\" mentions=\"mentions\" commands=\"commands\" reply-keyboard=\"historyState.replyKeyboard\"></div>\n                </div>\n\n              </div>\n\n            </div>\n\n          </div>\n\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n\n<toaster-container toaster-options=\"{'position-class': 'toast-bottom-center'}\"></toaster-container>\n"
  },
  {
    "path": "app/partials/mobile/import_contact_modal.html",
    "content": "<div class=\"import_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: progress.enabled}\" ng-click=\"doImport()\" ng-bind=\"progress.enabled ? 'contact_import_modal_submit_active' : 'contact_import_modal_submit' | i18n\" ng-disabled=\"progress.enabled\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"contact_import_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"doImport()\" my-vertical-position=\"0.2\">\n\n      <div class=\"form-group\">\n        <input class=\"form-control input-lg\" my-focused type=\"text\" placeholder=\"{{'contact_import_modal_phone' | i18n}}\" ng-model=\"importContact.phone\" my-submit-on-enter/>\n      </div>\n      <div class=\"form-group\">\n        <input class=\"form-control input-lg\" type=\"text\" placeholder=\"{{'contact_edit_modal_first_name' | i18n}}\" ng-model=\"importContact.first_name\" my-submit-on-enter/>\n      </div>\n      <div class=\"form-group\">\n        <input class=\"form-control input-lg\" type=\"text\" placeholder=\"{{'contact_edit_modal_last_name' | i18n}}\" ng-model=\"importContact.last_name\" my-submit-on-enter/>\n      </div>\n\n      <div class=\"import_modal_phonebook_wrap\" ng-if=\"phonebookAvailable\">\n        <a class=\"btn btn-link\" ng-click=\"importPhonebook()\" my-i18n=\"contact_import_modal_phonebook\"></a>\n      </div>\n\n    </form>\n\n  </div>\n</div>"
  },
  {
    "path": "app/partials/mobile/login.html",
    "content": "<div class=\"tg_page_head\">\n  <div class=\"navbar navbar-static-top navbar-inverse navbar_peer_not_selected\">\n    <div class=\"container\">\n      <div class=\"navbar-header\">\n\n        <ul class=\"nav navbar-nav navbar-quick-nav\">\n          <li class=\"navbar-quick-right login_head_submit_wrap\">\n            <a class=\"disabled\" disabled=\"disabled\" ng-if=\"progress.enabled\" class=\"login_head_submit_progress\">\n              <my-i18n ng-if=\"!credentials.phone_code_hash\" msgid=\"login_generating_key\"></my-i18n><my-i18n ng-if=\"credentials.phone_code_hash &amp;&amp; !credentials.phone_code_valid\" msgid=\"login_checking_code\"></my-i18n><my-i18n ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.phone_unoccupied\" msgid=\"login_signing_up\"></my-i18n><my-i18n ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.password_needed\" msgid=\"login_checking_password\"></my-i18n><span my-loading-dots></span>\n            </a>\n            <a ng-if=\"!progress.enabled &amp;&amp; !credentials.phone_code_hash\" ng-click=\"sendCode()\">\n              <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n            </a>\n            <a ng-if=\"!progress.enabled &amp;&amp; credentials.phone_code_hash &amp;&amp; !credentials.phone_code_valid\" ng-click=\"logIn()\">\n              <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n            </a>\n            <a ng-if=\"!progress.enabled &amp;&amp; credentials.phone_code_valid &amp;&amp; credentials.phone_unoccupied\" ng-click=\"logIn(true)\">\n              <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n            </a>\n            <a ng-if=\"!progress.enabled &amp;&amp; credentials.phone_code_valid &amp;&amp; credentials.password_needed\" ng-click=\"checkPassword()\">\n              <my-i18n msgid=\"modal_next\"></my-i18n><i class=\"icon icon-next-submit\"></i>\n            </a>\n          </li>\n          <li>\n            <a class=\"navbar-brand tg_logo_wrap\" href=\"https://telegram.org\" target=\"_blank\"><i class=\"icon icon-tg-logo\"></i><i class=\"icon icon-tg-title\"></i></a>\n          </li>\n        </ul>\n      </div>\n\n    </div>\n  </div>\n</div>\n\n\n<div class=\"login_page_wrap\" my-custom-background=\"#e7ebf0\">\n  <div class=\"login_page\">\n    <div class=\"login_form_wrap\" my-vertical-position=\"0.2\" padding=\"true\">\n      <div class=\"error\" ng-if=\"error.message\" ng-bind=\"error.message\"></div>\n\n      <form name=\"mySendCodeForm\" ng-if=\"!credentials.phone_code_hash\" ng-submit=\"sendCode()\">\n        <h3 class=\"login_form_head\" my-i18n=\"login_sign_in\"></h3>\n        <p class=\"login_form_lead\" my-i18n=\"login_enter_number_description_md\"><!--\n          --><my-i18n-param name=\"apps-link\"><!--\n            --><a href=\"https://telegram.org/apps\" target=\"_blank\">{0}</a><!--\n          --></my-i18n-param><!--\n        --></p>\n\n        <div class=\"md-input-group md-input-has-value login_phone_country_input_group\" ng-click=\"chooseCountry()\">\n          <label class=\"md-input-label\" my-i18n=\"login_country_select_placeholder\"></label>\n          <div autocomplete=\"off\" class=\"md-input\" ng-bind=\"credentials.phone_country_name\"></div>\n        </div>\n\n        <div class=\"login_phone_groups_wrap clearfix\">\n\n          <div class=\"md-input-group login_phone_code_input_group\" ng-class=\"{'md-input-error': error.field == 'phone'}\" my-labeled-input>\n            <label class=\"md-input-label\" my-i18n=\"login_code_input_placeholder\"></label>\n            <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"phone_country\" type=\"tel\" ng-model=\"credentials.phone_country\" />\n          </div>\n\n          <div class=\"md-input-group login_phone_num_input_group\" ng-class=\"{'md-input-error': error.field == 'phone'}\" my-labeled-input ng-switch=\"error.field == 'phone'\">\n            <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_number\"></label>\n            <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_tel_input_placeholder\"></label>\n            <input required autocomplete=\"off\" class=\"md-input\" my-focus-on=\"country_selected\" name=\"phone_number\" type=\"tel\" ng-model=\"credentials.phone_number\" />\n          </div>\n\n        </div>\n        <div class=\"login_form_messaging\" ng-show=\"progress.enabled\" my-i18n=\"login_generating_keys_info\"></div>\n      </form>\n\n      <form name=\"myLoginForm\" ng-if=\"credentials.phone_code_hash &amp;&amp; !credentials.phone_code_valid\" ng-submit=\"logIn()\">\n        <h3 class=\"login_phone_head\"><span ng-bind=\"credentials.phone_country\"></span> <span ng-bind=\"credentials.phone_number\"></span></h3>\n        <div class=\"login_edit_phone\"><a ng-click=\"editPhone()\" my-i18n=\"login_edit_number\"></a></div>\n\n        <div ng-switch=\"credentials.type._\">\n          <p ng-switch-when=\"auth.sentCodeTypeApp\" class=\"login_smscode_lead\" my-i18n=\"login_enter_code_label_md\"></p>\n          <p ng-switch-when=\"auth.sentCodeTypeCall\" class=\"login_smscode_lead\" my-i18n=\"login_enter_call_code_label_md\"></p>\n          <p ng-switch-default class=\"login_smscode_lead\" my-i18n=\"login_enter_sms_code_label_md\"></p>\n        </div>\n\n        <div ng-if=\"nextPending.type\" ng-switch=\"nextPending.remaining > 0\">\n          <p ng-switch-when=\"true\" class=\"login_smscode_lead\">\n            <span ng-switch=\"nextPending.type._\" my-i18n>\n              <span ng-switch-when=\"auth.codeTypeCall\" my-i18n-format=\"login_call_remaining\"></span>\n              <span ng-switch-default my-i18n-format=\"login_code_remaining\"></span>\n              <my-i18n-param name=\"remaining\" ng-bind=\"nextPending.remaining | duration\"></my-i18n-param>\n            </span>\n          </p>\n          <p ng-switch-default class=\"login_smscode_lead\" ng-switch=\"nextPending.progress\">\n            <a ng-switch-when=\"true\" ng-disabled class=\"disabled\">\n              <span my-i18n=\"login_code_requesting\"></span><span my-loading-dots></span>\n            </a>\n            <a ng-switch-default ng-click=\"sendNext()\" ng-switch=\"nextPending.type._\">\n              <span ng-switch-when=\"auth.codeTypeCall\" my-i18n=\"login_code_not_received_call\"></span>\n              <span ng-switch-default my-i18n=\"login_code_not_received\"></span>\n            </a>\n          </p>\n        </div>\n\n        <div class=\"md-input-group md-input-group-centered\" ng-class=\"{'md-input-error': error.field == 'phone_code'}\" my-labeled-input ng-switch=\"error.field == 'phone_code'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_sms_code\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_number_input_placeholder\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"phone_code\" type=\"tel\" ng-model=\"credentials.phone_code\" required />\n        </div>\n      </form>\n\n      <form name=\"myFullNameForm\" ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.phone_unoccupied\" ng-submit=\"logIn(true)\">\n        <h3 class=\"login_form_head\" my-i18n=\"login_your_info\"></h3>\n        <p class=\"login_form_lead\" my-i18n=\"login_fulll_name_label\"></p>\n\n        <div class=\"md-input-group\" ng-class=\"{'md-input-error': error.field == 'first_name'}\" my-labeled-input ng-switch=\"error.field == 'first_name'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_first_name\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_first_name\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"first_name\" type=\"text\" ng-model=\"credentials.first_name\" required />\n        </div>\n\n        <div class=\"md-input-group\" ng-class=\"{'md-input-error': error.field == 'last_name'}\" my-labeled-input ng-switch=\"error.field == 'last_name'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_last_name\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_last_name\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" name=\"last_name\" type=\"text\" ng-model=\"credentials.last_name\" />\n        </div>\n\n      </form>\n\n      <form name=\"myPasswordForm\" ng-if=\"credentials.phone_code_valid &amp;&amp; credentials.password_needed\" ng-submit=\"checkPassword()\">\n        <h3 class=\"login_form_head\" my-i18n=\"login_password_title\"></h3>\n        <p class=\"login_form_lead\" my-i18n=\"login_password_label\"></p>\n\n        <div class=\"md-input-group\" ng-class=\"{'md-input-error': error.field == 'password'}\" my-labeled-input ng-switch=\"error.field == 'password'\">\n          <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_incorrect_password\"></label>\n          <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_password\"></label>\n          <input autocomplete=\"off\" class=\"md-input\" my-focused name=\"password\" type=\"password\" ng-model=\"credentials.password\" my-submit-on-enter required />\n        </div>\n\n        <p ng-if=\"password.hint.length > 0\" class=\"login_form_hint\" ng-bind=\"password.hint\"></p>\n\n        <div class=\"login_forgot_button\">\n          <button class=\"btn btn-md\" ng-click=\"forgotPassword($event)\" my-i18n=\"login_password_forgot_link\"></button>\n        </div>\n\n        <div ng-if=\"canReset\" class=\"login_reset_button\">\n          <button class=\"btn btn-md btn-md-danger\" ng-click=\"resetAccount($event)\" my-i18n=\"login_account_reset\"></button>\n        </div>\n\n      </form>\n\n    </div>\n\n    <div ng-switch=\"about.shown\">\n      <div ng-switch-when=\"true\" class=\"login_footer_about_wrap\" my-scroll-to-on=\"$init\">\n        <h3><span my-i18n=\"login_about_title\"></span><a ng-click=\"about.shown = false\" class=\"login_footer_about_hide\" my-i18n=\"login_about_hide\"></a></h3>\n        <p my-i18n=\"login_about_desc1_md\"></p>\n        <p my-i18n=\"login_about_desc2_md\"></p>\n        <p my-i18n=\"login_about_desc3_md\">\n          <my-i18n-param name=\"source-link\">\n            <a href=\"https://github.com/zhukov/webogram\" target=\"_blank\">{0}</a>\n          </my-i18n-param>\n        </p>\n      </div>\n      <div ng-switch-default class=\"login_footer_wrap\">\n        <p my-i18n=\"login_about_intro\"></p>\n        <a class=\"logo_footer_learn_more_link\" href=\"\" ng-click=\"about.shown = true\" my-i18n=\"login_about_learn\"></a>\n      </div>\n\n    </div>\n  </div>\n\n</div>\n\n"
  },
  {
    "path": "app/partials/mobile/message.html",
    "content": "<div class=\"im_message_outer_wrap\" ng-click=\"toggleMessage(historyMessage.mid, $event)\">\n\n\n  <div class=\"im_message_wrap clearfix\" ng-switch=\"::historyMessage._ == 'messageService'\">\n\n    <div class=\"im_service_message_wrap\" ng-switch-when=\"true\" ng-switch=\"historyMessage.action._ == 'messageActionBotIntro'\">\n      <div ng-switch-when=\"true\" class=\"im_bot_intro_message_wrap\">\n        <div class=\"im_bot_intro_message_header\" my-i18n=\"message_service_bot_intro_header\"></div>\n        <div class=\"im_bot_intro_message\" ng-bind-html=\"::historyMessage.action.rDescription\"></div>\n      </div>\n      <div ng-switch-default class=\"im_service_message\">\n        <a class=\"im_message_author\" ng-if=\"::historyMessage.fromID > 0\" my-peer-link=\"historyMessage.fromID\" short=\"historyMessage.peerID > 0\" color=\"historyMessage.peerID < 0\" no-watch=\"true\"></a>\n        <span class=\"im_message_service\" my-service-message=\"historyMessage\"></span>\n      </div>\n\n      <a ng-if=\"::historyMessage.action._ == 'messageActionChatEditPhoto' || historyMessage.action._ == 'messageActionChannelEditPhoto'\" class=\"im_service_message_photo_thumb\" href=\"\" ng-click=\"openPhoto(historyMessage.action.photo.id)\">\n        <img\n          class=\"im_service_message_photo_thumb\"\n          my-load-thumb\n          thumb=\"historyMessage.action.photo.thumb\"\n        />\n      </a>\n\n    </div>\n\n    <div ng-switch-default class=\"im_content_message_wrap\" ng-class=\"::[historyMessage.pFlags.out ? 'im_message_out' : 'im_message_in', historyMessage.fwdFromID ? 'im_message_fwd' : '']\">\n\n      <a class=\"im_message_from_photo pull-left\" my-peer-photolink=\"::historyMessage.fromID\" img-class=\"im_message_from_photo\"></a>\n\n      <div class=\"im_message_meta\">\n        <div class=\"im_message_views_wrap\" ng-if=\"::historyMessage.views > 0\">\n          <div class=\"im_message_views\">\n            <i class=\"icon-message-views\"></i><span class=\"im_message_views_cnt\" my-message-views=\"historyMessage.mid\"></span>\n          </div>\n        </div>\n        <a class=\"im_message_error_btn\" ng-if=\"::historyMessage.pending || historyMessage.error || false\" ng-click=\"historyMessage.send()\">\n          <i class=\"icon-message-status\" tooltip=\"{{'message_action_retry' | i18n}}\"></i>\n        </a>\n        <span class=\"im_message_date\">\n          <span class=\"im_message_edited\" my-message-edited=\"historyMessage.mid\"></span>\n          <span class=\"im_message_date_text\">\n            <i ng-if=\"::historyMessage.pFlags.out &amp;&amp; (historyMessage.pFlags.unread || historyMessage.pending) || false\" class=\"icon-message-status\" ng-show=\"!historyMessage.error\"></i>\n            <span ng-bind=\"::historyMessage.date | time\"></span>\n          </span>\n        </span>\n      </div>\n\n      <div my-message-body=\"historyMessage\">\n        <div class=\"im_message_body\" ng-class=\"::{im_message_body_media: historyMessage._ == 'message' &amp;&amp; historyMessage.media && historyMessage.media._ != 'messageMediaWebPage' && !historyMessage.media.rCaption && !historyMessage.viaBotID ? true : false}\">\n\n          <a class=\"im_message_author\" my-peer-link=\"historyMessage.fromID\" short=\"historyMessage.peerID > 0\" color=\"historyMessage.peerID < 0\" no-watch=\"true\"></a>\n          <a ng-if=\"::historyMessage.viaBotID && !historyMessage.fwdFromID\" class=\"im_message_author_via\" my-i18n=\"message_via_bot\" ng-click=\"selectInlineBot(historyMessage.viaBotID, $event)\"><my-i18n-param name=\"bot\"><span class=\"im_message_fwd_author\" my-peer-link=\"historyMessage.viaBotID\" username=\"true\" no-watch=\"true\"></span></my-i18n-param></a>\n          <span class=\"im_message_author_admin\" my-message-admin-badge=\"historyMessage\"></span>\n\n          <a class=\"im_message_reply_wrap\" my-reply-message=\"::historyMessage.reply_to_mid\" ng-if=\"::historyMessage.reply_to_mid\"></a>\n\n          <div ng-if=\"::!!historyMessage.fwdFromID &amp;&amp; !historyMessage.media\" class=\"im_message_fwd_header\" ng-switch=\"!!historyMessage.viaBotID\" my-i18n>\n            <span ng-switch-when=\"true\" my-i18n-format=\"message_forwarded_via_message_mobile\"></span>\n            <span ng-switch-default my-i18n-format=\"message_forwarded_message_mobile\"></span>\n            <my-i18n-param name=\"from\"><a class=\"im_message_fwd_author\" my-peer-link=\"historyMessage.fwdFromID\" no-watch=\"true\" post-id=\"historyMessage.fwdPostID\"></a></my-i18n-param>\n            <my-i18n-param name=\"bot\"><a class=\"im_message_fwd_author\" my-peer-link=\"historyMessage.viaBotID\" username=\"true\" no-watch=\"true\"></a></my-i18n-param>\n          </div>\n\n          <div class=\"im_message_text\" dir=\"auto\"></div>\n          <div class=\"im_message_media\"></div>\n          <div class=\"im_message_sign\"></div>\n\n        </div>\n\n        <div class=\"im_message_keyboard\"></div>\n\n      </div>\n\n    </div>\n  </div>\n\n</div>\n\n"
  },
  {
    "path": "app/partials/mobile/message_actions_modal.html",
    "content": "<div class=\"message_actions_modal_wrap\" my-modal-position>\n\n  <div class=\"message_actions_wrap\">\n    <button ng-if=\"historyState.canReply\" class=\"btn btn-md btn-md-primary btn-block\" my-i18n=\"message_action_reply\" ng-click=\"$close('reply')\"></button>\n    <button ng-if=\"historyState.canEdit\" class=\"btn btn-md btn-md-primary btn-block\" my-i18n=\"message_action_edit\" ng-click=\"$close('edit')\"></button>\n    <button class=\"btn btn-md btn-md-primary btn-block\" my-i18n=\"message_action_forward\" ng-click=\"$close('forward')\"></button>\n    <button ng-if=\"historyState.canDelete\" class=\"btn btn-md btn-md-primary btn-block\" my-i18n=\"message_action_delete\" ng-click=\"$close('delete')\"></button>\n    <button ng-if=\"historyState.canReport\" class=\"btn btn-md btn-md-primary btn-block\" my-i18n=\"message_action_report\" ng-click=\"$close('report')\"></button>\n    <button class=\"btn btn-md btn-md-primary btn-block\" my-i18n=\"message_action_select\" ng-click=\"$close('select')\"></button>\n    <button class=\"btn btn-md btn-block\" my-i18n=\"message_action_cancel\" ng-click=\"$dismiss()\"></button>\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/message_attach_contact.html",
    "content": "<div class=\"im_message_contact\">\n  <a ng-if=\"::media.user_id > 0\"  class=\"im_message_contact_photo pull-left\" my-peer-photolink=\"media.user_id\" img-class=\"im_message_contact_photo\" user-override=\"media\"></a>\n  <div class=\"im_message_contact_name\" ng-switch=\"media.user_id > 0\">\n    <a ng-switch-when=\"true\" my-peer-link=\"media.user_id\" user-override=\"media\"></a>\n    <span ng-switch-default ng-bind-html=\"::media.rFullName\"></span>\n  </div>\n  <div class=\"im_message_contact_phone\" ng-bind=\"::media.phone_number | phoneNumber\"></div>\n</div>"
  },
  {
    "path": "app/partials/mobile/message_attach_document.html",
    "content": "<div ng-switch=\"::media.document.type\">\n\n  <div ng-switch-when=\"gif\" my-load-gif document=\"media.document\"></div>\n  \n  <div ng-switch-when=\"round\" my-load-round document=\"media.document\"></div>\n\n  <div ng-switch-when=\"sticker\" my-load-sticker document=\"media.document\" open=\"true\"></div>\n\n  <div ng-switch-when=\"voice\" class=\"im_message_audio\">\n    <div my-audio-player audio=\"media.document\"></div>\n  </div>\n\n  <div ng-switch-when=\"audio\" class=\"im_message_audio\">\n    <div my-audio-player audio=\"media.document\"></div>\n  </div>\n\n  <div ng-switch-when=\"video\" class=\"im_message_video im_message_document_thumbed\">\n    <a class=\"im_message_video_thumb\" href=\"\" ng-click=\"videoOpen()\" ng-style=\"::{width: media.document.thumb.width + 'px'}\">\n      <span class=\"im_message_video_duration\" ng-bind=\"::media.document.duration | duration\"></span>\n      <i class=\"icon icon-videoplay\"></i>\n      <img\n        class=\"im_message_video_thumb im_message_video_thumb_blurred\"\n        my-load-thumb\n        thumb=\"media.document.thumb\"\n      />\n    </a>\n  </div>\n\n  <div ng-switch-default class=\"im_message_document clearfix\" ng-class=\"{im_message_document_thumbed: !!media.document.thumb, im_message_document_progress: media.document.progress.enabled}\">\n\n    <a ng-if=\"::!media.document.thumb\" class=\"im_message_file_button\" ng-click=\"docOpen()\" ng-class=\"{im_message_file_button_dl_doc: media.document.downloaded}\">\n      <i class=\"im_message_file_button_icon\"></i>\n    </a>\n    <a ng-if=\"::media.document.thumb\" ng-click=\"docOpen()\">\n      <div class=\"im_message_document_thumb_wrap\">\n        <img\n          class=\"im_message_document_thumb\"\n          my-load-thumb\n          thumb=\"media.document.thumb\"\n        />\n      </div>\n    </a>\n\n    <div class=\"im_message_document_info\">\n      <div class=\"im_message_document_name_wrap\">\n        <a href=\"\" ng-attr-data-name=\"{{media_file_name_without_ext}}\" ng-attr-data-ext=\"{{media_file_ext}}\" ng-click=\"docOpen()\" class=\"im_message_document_name\"></a>\n        <span class=\"im_message_document_size\" ng-if=\"!media.document.progress.enabled\" ng-bind=\"::media.document.size | formatSize\"></span>\n        <span class=\"im_message_document_size\" ng-if=\"media.document.progress.enabled\" ng-bind=\"media.document.progress | formatSizeProgress\"></span>\n      </div>\n      <div class=\"im_message_document_actions\" ng-if=\"!media.document.progress.enabled\" ng-switch=\"media.document.downloaded\">\n        <a ng-switch-when=\"true\" href=\"\" ng-click=\"docSave()\" my-i18n=\"message_attach_document_save\"></a>\n        <a ng-switch-default href=\"\" ng-click=\"docSave()\" my-i18n=\"message_attach_document_download\"></a>\n        <a ng-if=\"::media.document.withPreview\" href=\"\" ng-click=\"docOpen()\" my-i18n=\"message_attach_document_open\"></a>\n      </div>\n      <div class=\"clearfix im_message_cancelable_progress_wrap\" ng-if=\"media.document.progress.enabled\">\n        <a class=\"im_message_media_progress_cancel pull-right\" ng-click=\"media.document.progress.cancel()\" my-i18n=\"modal_cancel\"></a>\n        <div class=\"im_message_download_progress_wrap\">\n          <div class=\"progress tg_down_progress\">\n            <div class=\"progress-bar progress-bar-success\" ng-style=\"{width: media.document.progress.percent + '%'}\"></div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</div>\n<div ng-if=\"::media.rCaption\" class=\"im_message_document_caption\" ng-bind-html=\"::media.rCaption\"></div>\n"
  },
  {
    "path": "app/partials/mobile/message_attach_geo.html",
    "content": "<a ng-href=\"{{::media.mapUrl}}\" target=\"_blank\" class=\"im_message_geopoint\">\n  <img\n    class=\"im_message_venue_geopoint_image\"\n    my-geo-point-map=\"media.geo\"\n    width=\"200\"\n    height=\"100\"\n  />\n</a>"
  },
  {
    "path": "app/partials/mobile/message_attach_pending.html",
    "content": "<div class=\"im_message_document im_message_upload_file\" ng-class=\"::'im_message_upload_' + media.type\">\n  <div class=\"im_message_file_button im_message_file_button_upload\">\n    <i class=\"im_message_file_button_icon\"></i>\n  </div>\n  <div class=\"im_message_document_info\">\n    <div class=\"im_message_document_name_wrap\">\n      <span class=\"im_message_document_name\" ng-attr-data-name=\"{{media_file_name_without_ext}}\" ng-attr-data-ext=\"{{media_file_ext}}\"></span>\n      <span class=\"im_message_document_size\" ng-if=\"media.progress\" ng-bind=\"media.progress | formatSizeProgress\"></span>\n    </div>\n    <div class=\"clearfix im_message_cancelable_progress_wrap\">\n      <a class=\"im_message_media_progress_cancel pull-right\" ng-click=\"media.progress.cancel()\" my-i18n=\"modal_cancel\"></a>\n      <div class=\"im_message_download_progress_wrap\">\n        <div class=\"progress tg_down_progress\">\n          <div class=\"progress-bar progress-bar-success\" role=\"progressbar\" ng-style=\"{width: media.progress.percent + '%'}\"></div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/mobile/message_attach_photo.html",
    "content": "<a class=\"im_message_photo_thumb\" ng-click=\"openPhoto(media.photo.id, {m: messageId})\" ng-style=\"::{width: media.photo.thumb.width + 'px'}\" ng-mouseover=\"preloadPhoto(media.photo.id)\" data-photo-id=\"{{::media.photo.id}}\">\n\n  <img\n    class=\"im_message_photo_thumb\"\n    my-load-thumb\n    thumb=\"media.photo.thumb\"\n  />\n</a>\n<div ng-if=\"::media.rCaption\" class=\"im_message_photo_caption\" ng-bind-html=\"::media.rCaption\"></div>"
  },
  {
    "path": "app/partials/mobile/message_attach_venue.html",
    "content": "<div class=\"im_message_venue clearfix\">\n\n  <a ng-href=\"{{::media.mapUrl}}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"im_message_venue_geopoint_wrap\">\n    <img\n      class=\"im_message_venue_geopoint_image\"\n      my-geo-point-map=\"media.geo\"\n      width=\"100\"\n      height=\"100\"\n      alt=\"[{{::'conversation_media_location' | i18n}} {{::media.mapUrl}}]\"\n    />\n  </a>\n\n  <div class=\"im_message_venue_info\">\n    <div class=\"im_message_venue_title_wrap\">\n      <a ng-href=\"{{::media.mapUrl}}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"im_message_document_name\" ng-bind=\"::media.title\"></a>\n    </div>\n    <div class=\"im_message_venue_address\" ng-bind=\"::media.address\"></div>\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/message_attach_webpage.html",
    "content": "<div ng-show=\"webpage._ == 'webPage'\" class=\"im_message_webpage_wrap clearfix\" ng-switch=\"webpage.type\">\n  <div ng-switch-when=\"photo\" class=\"im_message_webpage_photo\">\n    <div class=\"im_message_webpage_site\" ng-bind=\"webpage.site_name || webpage.display_url\"></div>\n    <div class=\"im_message_webpage_title\">\n      <a href=\"{{webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"webpage.rTitle\"></a>\n    </div>\n    <div ng-if=\"webpage.description.length\" class=\"im_message_webpage_description\" ng-bind-html=\"webpage.rDescription\"></div>\n    <a class=\"im_message_photo_thumb\" ng-click=\"openPhoto(webpage.photo.id, {w: webpage.id, m: messageId})\" ng-style=\"::{width: webpage.photo.thumb.width + 'px'}\" ng-mouseover=\"preloadPhoto(webpage.photo.id)\">\n      <img\n        class=\"im_message_photo_thumb\"\n        my-load-thumb\n        thumb=\"webpage.photo.thumb\"\n      />\n    </a>\n  </div>\n  <div ng-switch-when=\"video\" class=\"im_message_webpage_video\">\n    <div class=\"im_message_webpage_site\" ng-bind=\"webpage.site_name || webpage.display_url\"></div>\n    <div class=\"im_message_webpage_title\">\n      <a ng-click=\"openEmbed($event)\" href=\"{{webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"webpage.rTitle\"></a>\n    </div>\n    <div ng-if=\"webpage.description.length\" class=\"im_message_webpage_description\" ng-bind-html=\"webpage.rDescription\"></div>\n    <a class=\"im_message_video_thumb\" ng-click=\"openEmbed($event)\" ng-href=\"{{webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-style=\"::{width: video.thumb.width + 'px'}\">\n      <span ng-if=\"webpage.duration > 0\" class=\"im_message_video_duration\" ng-bind=\"::webpage.duration | duration\"></span>\n      <i class=\"icon icon-videoplay\"></i>\n      <img\n        class=\"im_message_video_thumb\"\n        my-load-thumb\n        thumb=\"webpage.photo.thumb\"\n      />\n    </a>\n  </div>\n\n  <div ng-switch-default class=\"im_message_webpage_article\">\n    <div class=\"im_message_webpage_site\" ng-bind=\"webpage.site_name\"></div>\n    <a ng-if=\"webpage.photo\" href=\"{{webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"im_message_webpage_article_photo pull-right\">\n      <img\n        class=\"im_message_article_thumb\"\n        my-load-thumb\n        thumb=\"webpage.photo.thumb\"\n      />\n    </a>\n    <div class=\"im_message_webpage_title\">\n      <a ng-click=\"openEmbed($event)\" href=\"{{webpage.url}}\" target=\"_blank\" rel=\"noopener noreferrer\" ng-bind-html=\"webpage.rTitle\"></a>\n    </div>\n    <div ng-if=\"webpage.description.length\" class=\"im_message_webpage_description\" ng-bind-html=\"webpage.rDescription\"></div>\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/mobile/message_service.html",
    "content": "<span ng-switch=\"::historyMessage.action._\">\n  <my-i18n>\n    <span ng-switch-when=\"messageActionChatCreate\" my-i18n-format=\"message_service_created_group\"></span>\n    <span ng-switch-when=\"messageActionChatEditTitle\" my-i18n-format=\"message_service_changed_group_name\"></span>\n    <my-i18n-param name=\"group-name\">&laquo;<strong ng-bind-html=\"::historyMessage.action.rTitle\"></strong>&raquo;</my-i18n-param>\n  </my-i18n>\n  <span ng-switch-when=\"messageActionChatEditPhoto\" my-i18n=\"message_service_changed_group_photo\"></span>\n  <span ng-switch-when=\"messageActionChatDeletePhoto\" my-i18n=\"message_service_removed_group_photo\"></span>\n  <span ng-switch-when=\"messageActionChatJoinedByLink\" my-i18n=\"message_service_joined_by_link\"></span>\n  <span ng-switch-when=\"messageActionChatReturn\" my-i18n=\"message_service_returned_to_group\"></span>\n  <span ng-switch-when=\"messageActionChatJoined\" my-i18n=\"message_service_joined\"></span>\n  <span ng-switch-when=\"messageActionChatAddUser\" my-i18n=\"message_service_invited_user\">\n    <my-i18n-param name=\"user\"><a my-peer-link=\"historyMessage.action.user_id\" color=\"true\"></a></my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChatAddUsers\" my-i18n=\"message_service_invited_users\">\n    <my-i18n-param name=\"user\"><a my-peer-link=\"historyMessage.action.users[0]\" color=\"true\"></a></my-i18n-param>\n    <my-i18n-param name=\"num-more\"><span ng-bind=\"historyMessage.action.users.length - 1\"></span></my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChatLeave\" my-i18n=\"message_service_left_group\"></span>\n  <span ng-switch-when=\"messageActionChatDeleteUser\" my-i18n=\"message_service_kicked_user\">\n    <my-i18n-param name=\"user\"><a my-peer-link=\"historyMessage.action.user_id\" color=\"true\"></a></my-i18n-param>\n  </span>\n\n  <span ng-switch-when=\"messageActionChatMigrateTo\" my-i18n=\"message_service_converted_to_supergroup\"></span>\n  <span ng-switch-when=\"messageActionChannelMigrateFrom\" my-i18n=\"message_service_converted_to_supergroup\"></span>\n  <span ng-switch-when=\"messageActionChannelCreate\" my-i18n=\"message_service_created_channel\"></span>\n  <span ng-switch-when=\"messageActionChannelEditTitle\" my-i18n=\"message_service_changed_channel_name\">\n    <my-i18n-param name=\"channel-name\">&laquo;<strong ng-bind-html=\"::historyMessage.action.rTitle\"></strong>&raquo;</my-i18n-param>\n  </span>\n  <span ng-switch-when=\"messageActionChannelEditPhoto\" my-i18n=\"message_service_changed_channel_photo\"></span>\n  <span ng-switch-when=\"messageActionChannelDeletePhoto\" my-i18n=\"message_service_removed_channel_photo\"></span>\n\n  <span ng-switch-when=\"messageActionGameScore\" my-i18n=\"message_service_scored_game\">\n    <my-i18n-param name=\"scored\">\n      <ng-pluralize count=\"historyMessage.action.score\"\n                     when=\"message_service_scored_X\"></ng-pluralize>\n    </my-i18n-param>\n    <my-i18n-param name=\"message\"><a class=\"im_service_message_pinned\" my-pinned-message=\"::historyMessage.reply_to_mid\"></a></my-i18n-param>\n  </span>\n\n  <span ng-switch-when=\"messageActionPinMessage\" my-i18n=\"message_service_pinned_message\">\n    <my-i18n-param name=\"message\"><a my-pinned-message=\"historyMessage.reply_to_mid\"></a></my-i18n-param>\n  </span>\n\n  <a ng-switch-when=\"messageActionPhoneCall\" class=\"im_service_message_phonecall\" ng-click=\"phoneCallClick(historyMessage.mid)\" ng-switch=\"historyMessage.action.type\">\n    <span ng-switch-when=\"out_missed\" my-i18n=\"message_service_phonecall_canceled\"></span>\n    <span ng-switch-when=\"in_missed\" my-i18n=\"message_service_phonecall_missed\"></span>\n    <span ng-switch-when=\"out_ok\" my-i18n=\"message_service_phonecall_outgoing\"></span>\n    <span ng-switch-when=\"in_ok\" my-i18n=\"message_service_phonecall_incoming\"></span>\n    <span ng-if=\"historyMessage.action.duration > 0\" ng-bind=\"historyMessage.action.duration | duration\" class=\"im_service_message_phonecall_duration\"></span>\n  </a>\n  \n  <span ng-switch-when=\"messageActionPaymentSent\" my-i18n=\"message_service_payment_sent\"></span>\n\n  <span ng-switch-when=\"messageActionScreenshotTaken\" my-i18n=\"message_service_screenshot_taken\"></span>\n\n  <span ng-switch-when=\"messageActionCustomAction\" ng-bind=\"historyMessage.action.message\"></span>\n\n  <span ng-switch-default my-i18n=\"message_service_unsupported_action\">\n    <my-i18n-param name=\"action\"><span ng-bind=\"historyMessage.action._\"></span></my-i18n-param>\n  </span>\n</span>\n"
  },
  {
    "path": "app/partials/mobile/password_recovery_modal.html",
    "content": "<div class=\"username_edit_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: recovery.updating}\" ng-click=\"checkCode()\" ng-bind=\"recovery.updating ? 'password_recover_active' : 'password_recover_submit' | i18n\" ng-disabled=\"recovery.updating\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"login_recovery_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"checkCode()\">\n\n      <div class=\"md_simple_form_description\" my-i18n=\"login_recovery_description_md\">\n        <my-i18n-param name=\"email\">\n          <strong ng-bind=\"recovery.email_pattern\"></strong>\n        </my-i18n-param>\n      </div>\n\n      <div class=\"md-input-group\" ng-class=\"{'md-input-error': recovery.error_field == 'code'}\" my-labeled-input ng-switch=\"recovery.error_field == 'code'\">\n        <label ng-switch-when=\"true\" class=\"md-input-label\" my-i18n=\"login_code_incorrect\"></label>\n        <label ng-switch-default class=\"md-input-label\" my-i18n=\"login_code_placeholder\"></label>\n        <input class=\"md-input\" my-focused type=\"text\" ng-model=\"recovery.code\" name=\"code\" my-focused />\n      </div>\n\n    </form>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/password_update_modal.html",
    "content": "<div class=\"username_edit_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: passwordSettings.updating}\" ng-click=\"updatePassword()\" ng-disabled=\"passwordSettings.updating\" ng-switch=\"action\">\n                <span ng-switch-when=\"disable\" ng-bind=\"passwordSettings.updating ? 'password_delete_active' : 'password_delete_submit' | i18n\"></span>\n                <span ng-switch-default ng-bind=\"passwordSettings.updating ? 'password_create_active' : 'password_create_submit' | i18n\"></span>\n              </a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 ng-switch=\"action\">\n                    <my-i18n ng-switch-when=\"disable\" msgid=\"password_delete_title\"></my-i18n>\n                    <my-i18n ng-switch-default msgid=\"password_change_title\"></my-i18n>\n                  </h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updatePassword()\" my-vertical-position=\"0.3\">\n\n      <div ng-if=\"password._ != 'account.noPassword'\" class=\"md-input-group\" ng-class=\"{'md-input-error': passwordSettings.error_field == 'cur_password'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_current_placeholder\"></label>\n        <input class=\"md-input\" my-focused type=\"password\" ng-model=\"passwordSettings.cur_password\" name=\"cur_password\" my-focus-on=\"cur_password_focus\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group md-input-grouped\" ng-class=\"{'md-input-error': passwordSettings.error_field == 'new_password'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_new_placeholder\"></label>\n        <input class=\"md-input\" type=\"password\" ng-model=\"passwordSettings.new_password\" name=\"new_password\" my-focus-on=\"new_password_focus\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group\" ng-class=\"{'md-input-error': passwordSettings.confirm_password && passwordSettings.new_password && passwordSettings.confirm_password != passwordSettings.new_password}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_confirm_placeholder\"></label>\n        <input class=\"md-input\" type=\"password\" ng-model=\"passwordSettings.confirm_password\" name=\"confirm_password\" my-focus-on=\"confirm_password_focus\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_hint_placeholder\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"passwordSettings.hint\" name=\"hint\" />\n      </div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md_simple_form_description\" my-i18n=\"password_create_description\"></div>\n\n      <div ng-if=\"action != 'disable'\" class=\"md-input-group\" ng-class=\"{'md-input-error': passwordSettings.error_field == 'email'}\" my-labeled-input>\n        <label class=\"md-input-label\" my-i18n=\"password_email_placeholder\"></label>\n        <input class=\"md-input\" type=\"text\" ng-model=\"passwordSettings.email\" name=\"email\" />\n      </div>\n\n    </form>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/peer_select.html",
    "content": "<div class=\"peer_select_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <a class=\"navbar-search-wrap\" ng-click=\"toggleSearch()\">\n          <i class=\"icon-search\"></i>\n        </a>\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"conversation_select_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"im_dialogs_modal_col_wrap\" ng-controller=\"AppImDialogsController\" my-dialogs ng-class=\"search.query.length > 0 ? 'im_dialogs_col_search' : ''\">\n      <div class=\"im_dialogs_panel\">\n        <div class=\"im_dialogs_search\">\n          <input my-focused class=\"form-control im_dialogs_search_field no_outline\" type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\" autocomplete=\"off\" />\n          <a class=\"im_dialogs_search_clear tg_search_clear\" ng-click=\"search.query = ''\" ng-show=\"search.query.length\">\n            <i class=\"icon icon-search-clear\"></i>\n          </a>\n        </div>\n      </div>\n      <div my-dialogs-list-mobile modal=\"true\" class=\"im_dialogs_modal_col im_dialogs_scrollable_wrap mobile_scrollable_wrap\">\n        <ul class=\"nav nav-pills nav-stacked\">\n          <li class=\"im_dialog_wrap\" my-dialog dialog-message=\"dialogMessage\" ng-repeat=\"dialogMessage in dialogs track by dialogMessage.peerID\"></li>\n        </ul>\n        <div class=\"im_dialogs_contacts_wrap\" ng-show=\"myResults.length > 0\">\n          <h5 my-i18n=\"conversation_select_modal_chats_contacts\"></h5>\n          <ul class=\"nav nav-pills nav-stacked\">\n            <li class=\"im_dialog_wrap\" ng-repeat=\"myResult in myResults track by myResult.id\" ng-class=\"{active: curDialog.peerID == myResult.id}\">\n              <a class=\"im_dialog\" ng-click=\"dialogSelect(myResult.peerString)\">\n                <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"::myResult.id\" img-class=\"im_dialog_photo\" watch=\"true\"></div>\n                <div class=\"im_dialog_message_wrap\">\n                  <div class=\"im_dialog_peer\">\n                    <span class=\"im_dialog_user\" my-peer-link=\"myResult.id\"></span>\n                  </div>\n                  <div class=\"im_dialog_message\" ng-switch=\"myResult.id > 0\">\n                    <span ng-switch-when=\"true\" class=\"im_dialog_message_text\" my-user-status=\"::myResult.id\"></span>\n                    <span ng-switch-default class=\"im_dialog_message_text\" my-chat-status=\"::-myResult.id\"></span>\n                  </div>\n                </div>\n              </a>\n            </li>\n          </ul>\n        </div>\n        <div class=\"im_dialogs_contacts_wrap\" ng-show=\"foundPeers.length > 0\">\n          <h5 my-i18n=\"im_found_title\"></h5>\n          <ul class=\"nav nav-pills nav-stacked\">\n            <li class=\"im_dialog_wrap\" ng-repeat=\"foundPeer in foundPeers track by foundPeer.id\" ng-class=\"{active: selectedPeers[foundPeer.id] !== undefined}\">\n              <a class=\"im_dialog\" ng-click=\"dialogSelect(foundPeer.peerString)\">\n                <div class=\"im_dialog_photo pull-left\" my-peer-photolink=\"foundPeer.id\" img-class=\"im_dialog_photo\" watch=\"true\"></div>\n                <div class=\"im_dialog_message_wrap\">\n                  <div class=\"im_dialog_peer\">\n                    <span class=\"im_dialog_user\" my-peer-link=\"foundPeer.id\"></span>\n                  </div>\n                  <div class=\"im_dialog_message\">\n                    <span class=\"im_dialog_message_text\" ng-bind=\"::'@' + foundPeer.username\"></span>\n                  </div>\n                </div>\n              </a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/phonebook_modal.html",
    "content": "<div class=\"contacts_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: !selectedCount || progress.enabled}\" ng-click=\"submitSelected()\" ng-switch=\"progress.enabled\">\n                <span ng-switch-when=\"true\">\n                  <my-i18n msgid=\"phonebook_modal_submit_active\"></my-i18n>\n                  <span my-loading-dots></span>\n                </span>\n                <span ng-switch-default my-i18n=\"phonebook_modal_submit\"></span>\n              </a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"phonebook_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"contacts_modal_search\">\n      <input class=\"form-control contacts_modal_search_field no_outline\" my-focused type=\"search\" placeholder=\"{{'modal_search' | i18n}}\" ng-model=\"search.query\" autocomplete=\"off\" />\n      <a class=\"contacts_modal_search_clear tg_search_clear\" ng-click=\"search.query = ''\" ng-show=\"search.query.length\">\n        <i class=\"icon icon-search-clear\"></i>\n      </a>\n    </div>\n\n\n    <div class=\"contacts_modal_col contacts_wrap contacts_scrollable_wrap mobile_scrollable_wrap\" my-contacts-list-mobile my-infinite-scroller-mobile>\n      <div ng-switch=\"contactsEmpty\">\n\n        <div ng-switch-when=\"true\" class=\"contacts_modal_contacts_empty\" my-vertical-position=\"0.2\" padding=\"true\" my-i18n=\"phonebook_modal_empty\"></div>\n\n        <ul ng-switch-default class=\"contacts_modal_members_list nav nav-pills nav-stacked\">\n\n          <li class=\"contacts_modal_contact_wrap clearfix\" ng-repeat=\"contact in contacts | limitTo: slice.limit track by contact.id\" ng-class=\"{active: selectedContacts[contact.id]}\">\n            <a class=\"contacts_modal_contact\" ng-click=\"contactSelect(contact.id)\">\n\n              <i ng-if=\"multiSelect\" class=\"icon icon-contact-tick\"></i>\n\n              <div class=\"contacts_modal_contact_photo pull-left\">\n                <img\n                  class=\"contacts_modal_contact_photo\"\n                  ng-src=\"{{contact.photo}}\"\n                />\n              </div>\n\n              <div class=\"contacts_modal_contact_name\">\n                <span ng-bind=\"contact.first_name\"></span>\n                <span ng-bind=\"contact.last_name\"></span>\n              </div>\n              <div class=\"contacts_modal_contact_status\" ng-repeat=\"phone in contact.phones\">\n                <span ng-bind=\"phone | phoneNumber\"></span>\n              </div>\n\n            </a>\n          </li>\n\n        </ul>\n\n      </div>\n    </div>\n\n  </div>\n\n  <div class=\"modal-footer contacts_modal_panel\" ng-show=\"multiSelect\">\n    <button class=\"btn btn-primary\" ng-click=\"toggleSelection()\" ng-switch=\"selectedCount > 0\">\n      <span ng-switch-when=\"true\" my-i18n=\"phonebook_modal_deselect_all\"></span>\n      <span ng-switch-default my-i18n=\"phonebook_modal_select_all\"></span>\n    </button>\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/photo_modal.html",
    "content": "<div class=\"media_modal_bottom_panel_wrap\" ng-show=\"!hideToolbars\">\n  <div class=\"media_modal_bottom_panel\">\n    <div class=\"media_modal_bottom_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-if=\"canDelete\" ng-click=\"delete()\" title=\"{{'media_modal_delete' | i18n}}\">\n        <i class=\"media_modal_action_btn_delete\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_bottom_actions pull-left\">\n      <a class=\"media_modal_action_btn\" ng-if=\"canForward\" ng-click=\"forward()\"  title=\"{{'media_modal_forward' | i18n}}\">\n        <i class=\"media_modal_action_btn_forward\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_info_wrap\" ng-if=\"photo.user_id > 0\">\n      <a class=\"media_modal_author\" my-peer-link=\"photo.user_id\" peer-watch=\"true\"></a>\n      <br/>\n      <span class=\"media_modal_date\" ng-bind=\"photo.date | dateOrTime :true\"></span>\n    </div>\n\n  </div>\n</div>\n\n<div class=\"media_modal_top_panel_wrap\" ng-show=\"!hideToolbars\">\n  <div class=\"media_modal_top_panel\">\n    <div class=\"media_modal_top_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-click=\"download()\" title=\"{{'media_modal_download' | i18n}}\">\n        <i class=\"media_modal_action_btn_download\"></i>\n      </a>\n    </div>\n    <div class=\"media_modal_top_actions pull-left\">\n      <a ng-click=\"$close()\" class=\"navbar-quick-media-back\">\n        <i class=\"icon icon-back\"></i>\n\n        <div class=\"navbar-quick-back-title\">\n          <h4 class=\"media_modal_title_wrap\" ng-switch=\"count > 1 &amp;&amp; pos > 0\">\n            <my-i18n ng-switch-when=\"true\" msgid=\"media_modal_photo_index\">\n              <my-i18n-param name=\"pos\" ng-bind=\"pos\"></my-i18n-param>\n              <my-i18n-param name=\"count\" ng-bind=\"count\"></my-i18n-param>\n            </my-i18n>\n            <my-i18n ng-switch-default msgid=\"media_modal_photo\">\n          </h4>\n        </div>\n      </a>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal-dialog\" ng-swipe-right=\"nav.prev()\" ng-swipe-left=\"nav.next()\" ng-click=\"hideToolbars = !hideToolbars\">\n  <div class=\"modal-content\">\n    <div my-modal-width=\"{{photo.full.modalWidth}}\" class=\"media_modal_wrap photo_modal_wrap\" my-vertical-position=\"0.5\">\n\n      <div class=\"modal-body\">\n\n        <div class=\"photo_modal_image_wrap\" my-load-full-photo full-photo=\"photo.full\" thumb-location=\"photo.thumb.location\"></div>\n\n      </div>\n\n    </div>\n  </div>\n</div>\n\n"
  },
  {
    "path": "app/partials/mobile/profile_edit_modal.html",
    "content": "<div class=\"profile_edit_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: profile.updating}\" ng-click=\"updateProfile()\" ng-bind=\"profile.updating ? 'profile_edit_submit_active' : 'profile_edit_submit' | i18n\" ng-disabled=\"profile.updating\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"profile_edit_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateProfile()\" my-vertical-position=\"0.3\">\n\n      <div class=\"form-group\" ng-class=\"{'has-error': error.field == 'first_name'}\">\n        <input class=\"form-control input-lg\" my-focused type=\"text\" placeholder=\"{{'profile_edit_first_name' | i18n}}\" ng-model=\"profile.first_name\"  name=\"first_name\"/>\n      </div>\n      <div class=\"form-group\" ng-class=\"{'has-error': error.field == 'last_name'}\">\n        <input class=\"form-control input-lg\" type=\"text\" placeholder=\"{{'profile_edit_last_name' | i18n}}\" ng-model=\"profile.last_name\"/>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/send_form.html",
    "content": "<form class=\"im_send_form\" ng-class=\"{im_send_form_empty: !draftMessage.text.length && draftMessage.type != 'edit', composer_progress_enabled: draftMessage.inlineProgress, im_voice_recording: voiceRecorder.recording, im_processing_recording: voiceRecorder.processing}\">\n\n  <div class=\"im_send_reply_wrap\" ng-if=\"draftMessage.replyToMsgID > 0\">\n    <a class=\"im_send_reply_cancel\" ng-mousedown=\"draftMessage.replyClear(true)\"><i class=\"icon icon-reply-bar\"></i><i class=\"icon icon-reply-bar\"></i></a>\n    <a class=\"im_message_reply_wrap\" my-reply-message=\"draftMessage.replyToMsgID\" watch=\"true\" edit=\"{{draftMessage.type == 'edit'}}\"></a>\n  </div>\n\n  <div class=\"im_send_reply_wrap im_send_fwds_wrap\" ng-if=\"draftMessage.fwdMessages.length > 0\">\n    <a class=\"im_send_reply_cancel\" ng-mousedown=\"draftMessage.fwdsClear()\"><i class=\"icon icon-reply-bar\"></i><i class=\"icon icon-reply-bar\"></i></a>\n    <div class=\"im_message_reply_wrap\" my-forwarded-messages=\"draftMessage.fwdMessages\"></div>\n  </div>\n\n  <div class=\"im_send_field_panel\">\n\n    <div class=\"im_voice_recorder_wrap\">\n      <div class=\"im_recorder_indicator\"><i></i></div>\n      <div class=\"im_recorder_time\" ng-bind=\"voiceRecorder.duration | duration\"></div>\n      <div class=\"im_recorder_label\" ng-switch=\"voiceRecorder.processing\">\n        <span ng-switch-when=\"true\" my-i18n=\"im_voice_processing_label\">\n          <my-i18n-param name=\"dots\"></my-i18n-param>\n        </span>\n        <span ng-switch-default>\n          <span class=\"im_recorder_label_hover\" my-i18n=\"im_voice_recording_label\"></span>\n          <span class=\"im_recorder_label_hout\" my-i18n=\"im_voice_recording_cancel_label\"></span>\n        </span>\n      </div>\n    </div>\n\n    <div class=\"im_send_field_wrap\" ng-class=\"replyKeyboard._ == 'replyKeyboardMarkup' ? 'im_send_field_wrap_2ndbtn' : ''\">\n      <a class=\"composer_emoji_insert_btn pull-right\"><i class=\"icon icon-emoji\"></i></a>\n      <a class=\"composer_command_btn\" ng-show=\"!replyKeyboard && commands.list.length > 0 && (!draftMessage.text.length || draftMessage.text[0] == '/')\" ng-mousedown=\"draftMessage.toggleSlash($event)\" ng-class=\"draftMessage.text[0] == '/' ? 'active' : ''\"><i class=\"icon icon-slash\"></i></a>\n      <a class=\"composer_keyboard_btn\" ng-show=\"replyKeyboard._ == 'replyKeyboardMarkup'\" ng-mousedown=\"draftMessage.replyKeyboardToggle($event)\" ng-class=\"!replyKeyboard.pFlags.hidden ? 'active' : ''\"><i class=\"icon icon-keyboard\"></i></a>\n\n      <div class=\"composer_progress_icon_wrap\">\n        <div class=\"composer_progress_icon\" my-arc-progress width=\"22\" stroke=\"2.5\"></div>\n      </div>\n\n      <div class=\"im_send_dropbox_wrap\" my-i18n=\"im_photos_drop_text\"></div>\n      <textarea ng-model=\"draftMessage.text\" class=\"form-control im_message_field no_outline\" dir=\"auto\" ng-trim=\"false\"></textarea>\n    </div>\n\n    <div class=\"im_attach pull-left\">\n      <input type=\"file\" class=\"im_attach_input\" size=\"28\" multiple=\"true\" title=\"{{'im_media_attach_title' | i18n}}\" />\n      <i class=\"icon icon-paperclip\"></i>\n    </div>\n\n    <div class=\"im_record pull-right\" title=\"{{'im_voice_record_title' | i18n}}\">\n      <i class=\"icon icon-mic\"></i>\n    </div>\n\n    <button type=\"submit\" class=\"btn btn-success im_submit\"></button>\n  </div>\n\n\n  <div class=\"im_send_keyboard_wrap\" ng-if=\"replyKeyboard._ == 'replyKeyboardMarkup'\" ng-show=\"!replyKeyboard.pFlags.hidden\">\n    <div my-reply-markup=\"replyKeyboard\"></div>\n  </div>\n\n</form>\n"
  },
  {
    "path": "app/partials/mobile/sessions_list_modal.html",
    "content": "<div class=\"sessions_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"sessions_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div my-sessions-list class=\"sessions_modal_col\">\n\n      <div class=\"sessions_wrap nano\" my-infinite-scroller>\n        <div class=\"sessions_scrollable_wrap nano-content\" ng-switch=\"!sessionsLoaded\">\n\n          <div ng-switch-when=\"true\" class=\"sessions_modal_loading\" my-vertical-position=\"0.2\" padding=\"true\" my-i18n=\"sessions_modal_loading\">\n            <my-i18n-param name=\"dots\">\n              <span my-loading-dots></span>\n            </my-i18n-param>\n          </div>\n\n          <ul ng-switch-default class=\"sessions_modal_sessions_list nav nav-pills nav-stacked\">\n\n            <li class=\"sessions_modal_session_wrap clearfix\" ng-repeat=\"authorization in authorizations | limitTo: slice.limit track by authorization.hash\">\n              <div class=\"sessions_modal_session\">\n                <div class=\"session_meta_wrap pull-right\">\n                  <div class=\"session_active_date\" ng-switch=\"authorization.current\">\n                    <span ng-switch-when=\"true\" class=\"session_active_date_online\" my-i18n=\"sessions_modal_current_session\"></span>\n                    <span ng-switch-default ng-bind=\"authorization.date_active | dateOrTime\"></span>\n                  </div>\n\n                  <a ng-if=\"!authorization.current\" class=\"session_terminate_btn\" ng-click=\"terminateSession(authorization.hash)\" my-i18n=\"sessions_modal_terminate_one\"></a>\n                </div>\n\n                <div class=\"sessions_modal_session_app\" ng-bind=\"authorization.app_name + ' ' + authorization.app_version\"></div>\n                <div class=\"sessions_modal_session_device\" ng-bind=\"authorization.device_model + ', ' + authorization.platform + ' ' + authorization.system_version\"></div>\n                <div class=\"sessions_modal_session_location\" ng-bind=\"authorization.ip + ' - ' + authorization.country\"></div>\n              </div>\n              <div ng-if=\"authorization.current && authorizations.length > 1\">\n                <div class=\"sessions_modal_terminate_all_wrap\">\n                  <a ng-click=\"terminateAllSessions()\" my-i18n=\"sessions_modal_terminate_all\"></a>\n                </div>\n\n                <hr class=\"sessions_modal_other_splitter\"></hr>\n              </div>\n            </li>\n\n          </ul>\n\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/settings_modal.html",
    "content": "<div class=\"settings_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-toggle-wrap dropdown\" dropdown>\n          <a class=\"dropdown-toggle navbar-toggle\" dropdown-toggle>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </a>\n          <ul class=\"dropdown-menu\">\n            <li ng-if=\"photo.location\">\n              <a ng-click=\"deletePhoto()\" my-i18n=\"settings_modal_delete_photo\"></a>\n            </li>\n            <li>\n              <a ng-click=\"editProfile()\" my-i18n=\"settings_modal_edit_profile\"></a>\n            </li>\n            <li>\n              <a ng-click=\"changeUsername()\" my-i18n=\"settings_modal_edit_username\"></a>\n            </li>\n            <li>\n              <a ng-if=\"password._ == 'account.noPassword' && password.email_unconfirmed_pattern.length\" ng-click=\"changePassword({action: 'cancel_email'})\" my-i18n=\"settings_modal_password_email_pending_cancel_mobile\">\n              </a>\n              <a ng-if=\"password._ == 'account.noPassword' && !password.email_unconfirmed_pattern\" ng-click=\"changePassword({action: 'create'})\" my-i18n=\"settings_modal_set_password\"></a>\n              <a ng-if=\"password._ == 'account.password'\" ng-click=\"changePassword({action: 'change'})\" my-i18n=\"settings_modal_change_password\"></a>\n            </li>\n            <li ng-if=\"password._ == 'account.password'\">\n              <a ng-click=\"changePassword({action: 'disable'})\" my-i18n=\"settings_modal_disable_password_mobile\"></a>\n            </li>\n\n            <li>\n              <a ng-click=\"showSessions()\" my-i18n=\"settings_modal_active_sessions\"></a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$close()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"settings_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"mobile_user_modal_photo_profile_wrap\">\n\n      <a ng-click=\"openUserPic()\"  class=\"mobile_user_modal_image_wrap pull-left\" my-peer-photolink=\"::profile.id\" img-class=\"mobile_user_modal_image\" no-open=\"true\" watch=\"true\" ng-class=\"{disabled: !profile.photo.photo_id}\" ng-disabled=\"!profile.photo.photo_id\"></a>\n\n      <div class=\"mobile_user_modal_info_wrap clearfix\">\n        <h4 class=\"mobile_user_modal_header\" my-peer-link=\"profile.id\"></h4>\n        <p class=\"mobile_user_modal_status\" my-user-status=\"::profile.id\"></p>\n      </div>\n\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-switch=\"photo.updating\">\n      <span ng-switch-when=\"true\" class=\"mobile_modal_action\" my-i18n>\n        <my-i18n msgid=\"settings_modal_photo_updating\"></my-i18n>\n        <span my-loading-dots></span>\n      </span>\n      <span ng-switch-default class=\"mobile_modal_action mobile_modal_upload_action\">\n        <input my-file-upload  type=\"file\" multiple=\"false\" class=\"im_attach_input\" size=\"120\" multiple=\"false\" accept=\"image/x-png, image/png, image/gif, image/jpeg\" />\n        <my-i18n msgid=\"settings_modal_set_photo\"></my-i18n>\n      </span>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"toggleDesktop()\" ng-class=\"notify.desktop ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_notification_alert\"></span>\n      </a>\n    </div>\n\n    <div ng-if=\"notify.desktop && notify.pushAvailable\" class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"togglePush()\" ng-class=\"notify.push ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_notification_push\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"togglePreview()\" ng-class=\"notify.preview ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_message_preview\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"!notify.desktop &amp;&amp; notify.canVibrate\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"toggleVibrate()\" ng-class=\"notify.vibrate ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_vibrate\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"toggleSound()\" ng-class=\"notify.volume ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_sounds\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"toggleCtrlEnter(send.enter == 1 ? 0 : 1)\" ng-class=\"send.enter == 1 ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_send_on_enter\"></span>\n      </a>\n    </div>\n\n\n    <div class=\"mobile_modal_action_wrap clearfix\" ng-controller=\"AppLangSelectController\">\n      <div class=\"mobile_modal_select_wrap pull-right\">\n        <select class=\"form-control\" ng-change=\"localeSelect()\" ng-model=\"form.locale\">\n          <option ng-repeat=\"locale in ::supportedLocales\" value=\"{{locale}}\" ng-bind=\"langNames[locale]\" ng-selected=\"locale == curLocale\"></option>\n        </select>\n      </div>\n      <span class=\"mobile_modal_action\" my-i18n=\"settings_modal_language\"></span>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-show=\"contentSettings.pFlags.sensitive_can_change\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"toggleContentSettings()\" ng-class=\"contentSettings.pFlags.sensitive_enabled ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"settings_modal_show_sensitive_content\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"profile.phone\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"user_modal_phone\"></h4>\n      <div class=\"mobile_modal_section_value\" ng-bind=\"profile.phone | phoneNumber\"></div>\n    </div>\n\n    <div class=\"mobile_modal_section\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"user_modal_username\"></h4>\n      <div class=\"mobile_modal_section_value\" ng-click=\"changeUsername()\" ng-switch=\"profile.username.length > 0\">\n        <a class=\"settings_modal_username_link\" ng-switch-when=\"true\" href=\"\" ng-click=\"changeUsername()\" ng-bind=\"'@' + profile.username\"></a>\n        <a ng-switch-default href=\"\" ng-click=\"changeUsername()\" my-i18n=\"settings_modal_empty_username_set\"></a>\n      </div>\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"switchBackToDesktop\">\n      <div class=\"mobile_modal_section_value\">\n        <a href=\"\" ng-click=\"switchToDesktop()\" my-i18n=\"settings_switch_back_to_desktop\"></a>\n      </div>\n    </div>\n\n    <div class=\"mobile_modal_section\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"settings_modal_about\"></h4>\n      <div class=\"mobile_modal_section_body settings_about_section_body clearfix\">\n        <div class=\"settings_external_services pull-right\">\n          <a href=\"https://github.com/zhukov/webogram\" target=\"_blank\" title=\"{{'settings_modal_source_code_github' | i18n}}\" class=\"settings_external_service\"><i class=\"icon icon-github\"></i></a>\n          <a href=\"https://twitter.com/telegram_web\" target=\"_blank\" title=\"{{'settings_modal_follow_us_twitter' | i18n}}\" class=\"settings_external_service\"><i class=\"icon icon-twitter\"></i></a>\n        </div>\n        <p>\n          <a href=\"https://github.com/zhukov/webogram/blob/master/CHANGELOG.md\" target=\"_blank\" my-i18n=\"settings_modal_recent_updates\">\n            <my-i18n-param name=\"version\" ng-bind=\"version\"></my-i18n-param>\n          </a>\n        </p>\n      </div>\n    </div>\n\n  </div>\n</div>\n"
  },
  {
    "path": "app/partials/mobile/stickerset_modal.html",
    "content": "<div class=\"stickerset_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\" ng-if=\"stickersetLoaded\" ng-switch=\"stickersetInstalled\">\n              <a ng-switch-when=\"true\" my-i18n=\"stickerset_modal_uninstall\" ng-click=\"toggleInstalled(false)\"></a>\n              <a ng-switch-when=\"false\" my-i18n=\"stickerset_modal_install\" ng-click=\"toggleInstalled(true)\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 ng-switch=\"!stickersetLoaded\">\n                    <span ng-switch-when=\"true\" my-i18n=\"stickerset_modal_title_loading\"></span>\n                    <span ng-switch-default ng-bind=\"stickerset.title\"></span>\n                  </h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <div my-stickers-list class=\"stickerset_modal_col\">\n\n      <div class=\"stickerset_wrap nano\" my-infinite-scroller>\n        <div class=\"stickerset_scrollable_wrap nano-content\" ng-switch=\"!stickersetLoaded\">\n\n          <div ng-switch-when=\"true\" class=\"stickerset_modal_loading\" my-vertical-position=\"0.2\" padding=\"true\" my-i18n=\"stickerset_modal_loading\">\n            <my-i18n-param name=\"dots\">\n              <span my-loading-dots></span>\n            </my-i18n-param>\n          </div>\n\n          <div ng-switch-default class=\"stickerset_modal_stickers_list clearfix\">\n            <div class=\"stickerset_modal_sticker_wrap\" ng-repeat=\"sticker in documents | limitTo: slice.limit\">\n              <div class=\"stickerset_modal_sticker\" my-load-sticker document=\"sticker\" thumb=\"true\"></div>\n              <div class=\"stickerset_modal_sticker_alt\" ng-bind-html=\"sticker.stickerEmoji\"></div>\n            </div>\n          </div>\n\n        </div>\n      </div>\n\n    </div>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/user_modal.html",
    "content": "<div class=\"mobile_user_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-toggle-wrap dropdown\" dropdown>\n          <a class=\"dropdown-toggle navbar-toggle\" dropdown-toggle>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </a>\n          <ul class=\"dropdown-menu\">\n            <li ng-if=\"user.pFlags.contact\">\n              <a ng-click=\"importContact(true)\" my-i18n=\"user_modal_edit_contact\"></a>\n            </li>\n            <li ng-if=\"user.pFlags.contact\">\n              <a ng-click=\"deleteContact()\" my-i18n=\"user_modal_delete_contact\"></a>\n            </li>\n            <li ng-if=\"user.phone.length > 0 &amp;&amp; !user.pFlags.contact &amp;&amp; !user.pFlags.self\">\n              <a ng-click=\"importContact()\" my-i18n=\"user_modal_add_contact\"></a>\n            </li>\n            <li>\n              <a ng-click=\"flushHistory(true)\" my-i18n=\"user_modal_clear_history\"></a>\n            </li>\n            <li>\n              <a ng-click=\"flushHistory()\" my-i18n=\"user_modal_delete_chat\"></a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li>\n              <a ng-click=\"$close()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"user_modal_contact_info\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body mobile_modal_body\">\n\n    <div class=\"mobile_user_modal_photo_profile_wrap\">\n\n      <a ng-click=\"openUserPic()\"  class=\"mobile_user_modal_image_wrap pull-left\" my-peer-photolink=\"::user.id\" img-class=\"mobile_user_modal_image\" no-open=\"true\" watch=\"true\" ng-class=\"{disabled: !user.photo.photo_id}\" ng-disabled=\"!user.photo.photo_id\"></a>\n\n      <div class=\"mobile_user_modal_info_wrap clearfix\">\n        <h4 class=\"mobile_user_modal_header\" my-peer-link=\"user.id\" verified=\"true\"></h4>\n        <p class=\"mobile_user_modal_status\" ng-if=\"user.status\" my-user-status=\"::user.id\"></p>\n      </div>\n\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"user.phone.length > 0\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"user_modal_phone\"></h4>\n      <div class=\"mobile_modal_section_value\" ng-bind=\"user.phone | phoneNumber\"></div>\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"user.username\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"user_modal_username\"></h4>\n      <div class=\"mobile_modal_section_value\" ng-bind=\"'@' + user.username\"></div>\n    </div>\n\n    <div class=\"mobile_modal_section\" ng-if=\"rAbout\">\n      <h4 class=\"mobile_modal_section_header\" my-i18n=\"user_modal_about\"></h4>\n      <div class=\"mobile_modal_section_value\" ng-bind-html=\"rAbout\"></div>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action\" ng-click=\"goToHistory()\" my-i18n=\"user_modal_send_message\"></a>\n    </div>\n\n    <div ng-if=\"user.phone.length > 0\" class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action\" ng-click=\"shareContact()\" my-i18n=\"user_modal_share_contact\"></a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"user.pFlags.bot &amp;&amp; !user.pFlags.bot_nochats\">\n      <a class=\"mobile_modal_action\" ng-click=\"inviteToGroup()\" my-i18n=\"user_modal_add_to_group\"></a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"bot_info.commands.settings != null\">\n      <a class=\"mobile_modal_action\" ng-click=\"sendCommand('settings')\" my-i18n=\"user_modal_bot_settings\"></a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"bot_info.commands.help != null\">\n      <a class=\"mobile_modal_action\" ng-click=\"sendCommand('help')\" my-i18n=\"user_modal_bot_help\"></a>\n    </div>\n\n\n    <div class=\"mobile_modal_action_wrap\">\n      <a class=\"mobile_modal_action tg_checkbox clearfix\" ng-click=\"settings.notifications = !settings.notifications\" ng-class=\"settings.notifications ? 'tg_checkbox_on' : ''\">\n        <span class=\"icon icon-checkbox-outer\"><i class=\"icon-checkbox-inner\"></i></span>\n        <span class=\"tg_checkbox_label\" my-i18n=\"user_modal_notifications\"></span>\n      </a>\n    </div>\n\n    <div class=\"mobile_modal_action_wrap\" ng-if=\"!user.pFlags.self\">\n      <a class=\"mobile_modal_action\" ng-click=\"toggleBlock(!blocked)\" ng-switch=\"blocked\">\n        <my-i18n ng-switch-when=\"true\" msgid=\"user_modal_unblock_user\"></my-i18n>\n        <my-i18n ng-switch-default msgid=\"user_modal_block_user\"></my-i18n>\n      </a>\n    </div>\n\n  </div>\n\n</div>\n"
  },
  {
    "path": "app/partials/mobile/username_edit_modal.html",
    "content": "<div class=\"username_edit_modal_wrap\">\n\n  <div class=\"tg_page_head tg_modal_head\">\n    <div class=\"navbar navbar-static-top navbar-inverse\">\n      <div class=\"container\">\n\n        <div class=\"navbar-header\">\n\n          <ul class=\"nav navbar-nav navbar-quick-nav\">\n            <li class=\"navbar-quick-right\">\n              <a ng-class=\"{disabled: profile.updating}\" ng-click=\"updateUsername()\" ng-bind=\"profile.updating ? 'username_edit_submit_active' : 'username_edit_submit' | i18n\" ng-disabled=\"profile.updating\"></a>\n            </li>\n            <li>\n              <a ng-click=\"$dismiss()\" class=\"navbar-quick-media-back\">\n                <i class=\"icon icon-back\"></i>\n                <div class=\"navbar-quick-back-title\">\n                  <h4 my-i18n=\"username_edit_modal_title\"></h4>\n                </div>\n              </a>\n            </li>\n          </ul>\n\n        </div>\n\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal-body\">\n\n    <form class=\"modal_simple_form\" ng-submit=\"updateUsername()\" my-vertical-position=\"0.3\">\n\n      <div class=\"form-group import_modal_field_wrap\" ng-class=\"{'has-error': checked.error, 'has-feedback': checked.feedback.length > 0}\">\n        <input class=\"form-control input-md\" my-focused type=\"text\" placeholder=\"{{'username_edit_placeholder' | i18n}}\" ng-model=\"profile.username\"  name=\"username\" ng-model-options=\"{updateOn: 'default blur', debounce: {default: 600, blur: 0}}\"/>\n        <span ng-if=\"checked.error\" class=\"glyphicon form-control-feedback\" ng-class=\"{'glyphicon-remove': checked.error}\"></span>\n      </div>\n\n      <div class=\"modal_simple_form_description\" my-i18n=\"username_edit_description_md\"></div>\n\n    </form>\n\n  </div>\n\n</div>"
  },
  {
    "path": "app/partials/mobile/video_modal.html",
    "content": "<div class=\"media_modal_bottom_panel_wrap\">\n  <div class=\"media_modal_bottom_panel\">\n    <div class=\"media_modal_bottom_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-if=\"messageID\" ng-click=\"delete()\" title=\"{{'media_modal_delete' | i18n}}\">\n        <i class=\"media_modal_action_btn_delete\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_bottom_actions pull-left\">\n      <a class=\"media_modal_action_btn\" ng-if=\"messageID\" ng-click=\"forward()\"  title=\"{{'media_modal_forward' | i18n}}\">\n        <i class=\"media_modal_action_btn_forward\"></i>\n      </a>\n    </div>\n\n    <div class=\"media_modal_info_wrap\" ng-if=\"video.user_id > 0\">\n      <a class=\"media_modal_author\" my-peer-link=\"video.user_id\" peer-watch=\"true\"></a>\n      <br/>\n      <span class=\"media_modal_date\" ng-bind=\"video.date | dateOrTime :true\"></span>\n    </div>\n\n  </div>\n</div>\n\n<div class=\"media_modal_top_panel_wrap\">\n  <div class=\"media_modal_top_panel\">\n    <div class=\"media_modal_top_actions pull-right\">\n      <a class=\"media_modal_action_btn\" ng-click=\"download()\" title=\"{{'media_modal_download' | i18n}}\">\n        <i class=\"media_modal_action_btn_download\"></i>\n      </a>\n    </div>\n    <div class=\"media_modal_top_actions pull-left\">\n      <a ng-click=\"$close()\" class=\"navbar-quick-media-back\">\n        <i class=\"icon icon-back\"></i>\n        <div class=\"navbar-quick-back-title\">\n          <h4 class=\"media_modal_title_wrap\" my-i18n=\"media_modal_video\"></h4>\n        </div>\n      </a>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal-dialog\">\n  <div class=\"modal-content\">\n    <div my-modal-width=\"{{video.full.width}}\" class=\"media_modal_wrap video_modal_wrap\" my-vertical-position=\"0.5\">\n\n      <div class=\"modal-body\">\n\n        <div class=\"video_modal_image_wrap\" my-load-video video=\"video\"></div>\n\n      </div>\n\n    </div>\n  </div>\n</div>\n\n"
  },
  {
    "path": "app/service_worker.js",
    "content": "/* global importScripts */\nimportScripts('js/lib/push_worker.js')\n\n// Version 53\n"
  },
  {
    "path": "app/vendor/README.md",
    "content": "## Third party libraries\n\n### [AngularJS](http://angularjs.org/)\n\n**Author**: Google, Inc.\n**License**: MIT, https://github.com/angular/angular.js/blob/master/LICENSE\n\n### [JSBN](http://www-cs-students.stanford.edu/~tjw/jsbn/)\n\n**Author**: Tom Wu\n**License**: BSD, http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE\n\nBiginteger for RSA, PQ prime factorization\n\n\n### [jQuery Emojiarea](https://github.com/diy/jquery-emojiarea)\n\n**Author**: diy\n**License**: Apache, Version 2.0, https://github.com/diy/jquery-emojiarea#license\n\nEmoji keyboard and rich-textfield for composing messages with emoticons\n\n\n### [UI Bootstrap](http://angular-ui.github.io/bootstrap/)\n\n**Author**: AngularUI Team, https://github.com/organizations/angular-ui/teams/291112\n**License**: MIT, https://github.com/angular-ui/bootstrap/blob/master/LICENSE\n\nModal windows\n\n\n### [jQuery](https://github.com/jquery/jquery)\n\n**Author**: jQuery Foundation and other contributors\n**License**: MIT, https://github.com/jquery/jquery/blob/master/LICENSE.txt\n\nDom manupulations.\n\n### [Bootstrap](https://github.com/twbs/bootstrap)\n\n**Author**: Twitter, Inc\n**License**: MIT, https://github.com/twbs/bootstrap/blob/master/LICENSE\n\nNormalize, CSS-framework\n\n### [nanoScrollerJS](https://github.com/jamesflorentino/nanoScrollerJS)\n\n**Author**: James Florentino\n**License**: MIT, https://github.com/jamesflorentino/nanoScrollerJS/blob/master/LICENSE\n\nBeautiful OS X Lion-like scrollbars\n\n\n### [CryptoJS](https://code.google.com/p/crypto-js/)\n\n**Author**: Jeff Mott\n**License**: BSD-3-Clause, https://code.google.com/p/crypto-js/wiki/License\n\nAES, SHA-1 implementation\n\n### [zlib.js](https://github.com/imaya/zlib.js)\n\n**Author**: imaya\n**License**: MIT, https://github.com/imaya/zlib.js/blob/master/LICENSE\n\nGZIP for decompressing server responses\n\n### [emoji-data](https://github.com/iamcal/emoji-data)\n\n**Author**: iamcal\n**License**: not specified\n\nBuild emoji list in apropriate format. Generate sheet in future, when needed.\n\n\n### [gemoji](https://github.com/github/gemoji)\n\n**Author**: GitHub Inc, 37signals, id Software, whynne@deviantart, Apple Inc.\n**License**: https://github.com/github/gemoji/blob/master/LICENSE\n\nEmoji images\n"
  },
  {
    "path": "app/vendor/angular/angular-animate.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar ELEMENT_NODE = 1;\nvar COMMENT_NODE = 8;\n\nvar ADD_CLASS_SUFFIX = '-add';\nvar REMOVE_CLASS_SUFFIX = '-remove';\nvar EVENT_CLASS_PREFIX = 'ng-';\nvar ACTIVE_CLASS_SUFFIX = '-active';\nvar PREPARE_CLASS_SUFFIX = '-prepare';\n\nvar NG_ANIMATE_CLASSNAME = 'ng-animate';\nvar NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren';\n\n// Detect proper transitionend/animationend event names.\nvar CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;\n\n// If unprefixed events are not supported but webkit-prefixed are, use the latter.\n// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.\n// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`\n// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.\n// Register both events in case `window.onanimationend` is not supported because of that,\n// do the same for `transitionend` as Safari is likely to exhibit similar behavior.\n// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit\n// therefore there is no reason to test anymore for other vendor prefixes:\n// http://caniuse.com/#search=transition\nif ((window.ontransitionend === undefined) && (window.onwebkittransitionend !== undefined)) {\n  CSS_PREFIX = '-webkit-';\n  TRANSITION_PROP = 'WebkitTransition';\n  TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';\n} else {\n  TRANSITION_PROP = 'transition';\n  TRANSITIONEND_EVENT = 'transitionend';\n}\n\nif ((window.onanimationend === undefined) && (window.onwebkitanimationend !== undefined)) {\n  CSS_PREFIX = '-webkit-';\n  ANIMATION_PROP = 'WebkitAnimation';\n  ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';\n} else {\n  ANIMATION_PROP = 'animation';\n  ANIMATIONEND_EVENT = 'animationend';\n}\n\nvar DURATION_KEY = 'Duration';\nvar PROPERTY_KEY = 'Property';\nvar DELAY_KEY = 'Delay';\nvar TIMING_KEY = 'TimingFunction';\nvar ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';\nvar ANIMATION_PLAYSTATE_KEY = 'PlayState';\nvar SAFE_FAST_FORWARD_DURATION_VALUE = 9999;\n\nvar ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY;\nvar ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY;\nvar TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY;\nvar TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY;\n\nvar ngMinErr = angular.$$minErr('ng');\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', 'Argument \\'{0}\\' is {1}', (name || '?'), (reason || 'required'));\n  }\n  return arg;\n}\n\nfunction mergeClasses(a,b) {\n  if (!a && !b) return '';\n  if (!a) return b;\n  if (!b) return a;\n  if (isArray(a)) a = a.join(' ');\n  if (isArray(b)) b = b.join(' ');\n  return a + ' ' + b;\n}\n\nfunction packageStyles(options) {\n  var styles = {};\n  if (options && (options.to || options.from)) {\n    styles.to = options.to;\n    styles.from = options.from;\n  }\n  return styles;\n}\n\nfunction pendClasses(classes, fix, isPrefix) {\n  var className = '';\n  classes = isArray(classes)\n      ? classes\n      : classes && isString(classes) && classes.length\n          ? classes.split(/\\s+/)\n          : [];\n  forEach(classes, function(klass, i) {\n    if (klass && klass.length > 0) {\n      className += (i > 0) ? ' ' : '';\n      className += isPrefix ? fix + klass\n                            : klass + fix;\n    }\n  });\n  return className;\n}\n\nfunction removeFromArray(arr, val) {\n  var index = arr.indexOf(val);\n  if (val >= 0) {\n    arr.splice(index, 1);\n  }\n}\n\nfunction stripCommentsFromElement(element) {\n  if (element instanceof jqLite) {\n    switch (element.length) {\n      case 0:\n        return element;\n\n      case 1:\n        // there is no point of stripping anything if the element\n        // is the only element within the jqLite wrapper.\n        // (it's important that we retain the element instance.)\n        if (element[0].nodeType === ELEMENT_NODE) {\n          return element;\n        }\n        break;\n\n      default:\n        return jqLite(extractElementNode(element));\n    }\n  }\n\n  if (element.nodeType === ELEMENT_NODE) {\n    return jqLite(element);\n  }\n}\n\nfunction extractElementNode(element) {\n  if (!element[0]) return element;\n  for (var i = 0; i < element.length; i++) {\n    var elm = element[i];\n    if (elm.nodeType === ELEMENT_NODE) {\n      return elm;\n    }\n  }\n}\n\nfunction $$addClass($$jqLite, element, className) {\n  forEach(element, function(elm) {\n    $$jqLite.addClass(elm, className);\n  });\n}\n\nfunction $$removeClass($$jqLite, element, className) {\n  forEach(element, function(elm) {\n    $$jqLite.removeClass(elm, className);\n  });\n}\n\nfunction applyAnimationClassesFactory($$jqLite) {\n  return function(element, options) {\n    if (options.addClass) {\n      $$addClass($$jqLite, element, options.addClass);\n      options.addClass = null;\n    }\n    if (options.removeClass) {\n      $$removeClass($$jqLite, element, options.removeClass);\n      options.removeClass = null;\n    }\n  };\n}\n\nfunction prepareAnimationOptions(options) {\n  options = options || {};\n  if (!options.$$prepared) {\n    var domOperation = options.domOperation || noop;\n    options.domOperation = function() {\n      options.$$domOperationFired = true;\n      domOperation();\n      domOperation = noop;\n    };\n    options.$$prepared = true;\n  }\n  return options;\n}\n\nfunction applyAnimationStyles(element, options) {\n  applyAnimationFromStyles(element, options);\n  applyAnimationToStyles(element, options);\n}\n\nfunction applyAnimationFromStyles(element, options) {\n  if (options.from) {\n    element.css(options.from);\n    options.from = null;\n  }\n}\n\nfunction applyAnimationToStyles(element, options) {\n  if (options.to) {\n    element.css(options.to);\n    options.to = null;\n  }\n}\n\nfunction mergeAnimationDetails(element, oldAnimation, newAnimation) {\n  var target = oldAnimation.options || {};\n  var newOptions = newAnimation.options || {};\n\n  var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || '');\n  var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || '');\n  var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove);\n\n  if (newOptions.preparationClasses) {\n    target.preparationClasses = concatWithSpace(newOptions.preparationClasses, target.preparationClasses);\n    delete newOptions.preparationClasses;\n  }\n\n  // noop is basically when there is no callback; otherwise something has been set\n  var realDomOperation = target.domOperation !== noop ? target.domOperation : null;\n\n  extend(target, newOptions);\n\n  // TODO(matsko or sreeramu): proper fix is to maintain all animation callback in array and call at last,but now only leave has the callback so no issue with this.\n  if (realDomOperation) {\n    target.domOperation = realDomOperation;\n  }\n\n  if (classes.addClass) {\n    target.addClass = classes.addClass;\n  } else {\n    target.addClass = null;\n  }\n\n  if (classes.removeClass) {\n    target.removeClass = classes.removeClass;\n  } else {\n    target.removeClass = null;\n  }\n\n  oldAnimation.addClass = target.addClass;\n  oldAnimation.removeClass = target.removeClass;\n\n  return target;\n}\n\nfunction resolveElementClasses(existing, toAdd, toRemove) {\n  var ADD_CLASS = 1;\n  var REMOVE_CLASS = -1;\n\n  var flags = {};\n  existing = splitClassesToLookup(existing);\n\n  toAdd = splitClassesToLookup(toAdd);\n  forEach(toAdd, function(value, key) {\n    flags[key] = ADD_CLASS;\n  });\n\n  toRemove = splitClassesToLookup(toRemove);\n  forEach(toRemove, function(value, key) {\n    flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS;\n  });\n\n  var classes = {\n    addClass: '',\n    removeClass: ''\n  };\n\n  forEach(flags, function(val, klass) {\n    var prop, allow;\n    if (val === ADD_CLASS) {\n      prop = 'addClass';\n      allow = !existing[klass] || existing[klass + REMOVE_CLASS_SUFFIX];\n    } else if (val === REMOVE_CLASS) {\n      prop = 'removeClass';\n      allow = existing[klass] || existing[klass + ADD_CLASS_SUFFIX];\n    }\n    if (allow) {\n      if (classes[prop].length) {\n        classes[prop] += ' ';\n      }\n      classes[prop] += klass;\n    }\n  });\n\n  function splitClassesToLookup(classes) {\n    if (isString(classes)) {\n      classes = classes.split(' ');\n    }\n\n    var obj = {};\n    forEach(classes, function(klass) {\n      // sometimes the split leaves empty string values\n      // incase extra spaces were applied to the options\n      if (klass.length) {\n        obj[klass] = true;\n      }\n    });\n    return obj;\n  }\n\n  return classes;\n}\n\nfunction getDomNode(element) {\n  return (element instanceof jqLite) ? element[0] : element;\n}\n\nfunction applyGeneratedPreparationClasses($$jqLite, element, event, options) {\n  var classes = '';\n  if (event) {\n    classes = pendClasses(event, EVENT_CLASS_PREFIX, true);\n  }\n  if (options.addClass) {\n    classes = concatWithSpace(classes, pendClasses(options.addClass, ADD_CLASS_SUFFIX));\n  }\n  if (options.removeClass) {\n    classes = concatWithSpace(classes, pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX));\n  }\n  if (classes.length) {\n    options.preparationClasses = classes;\n    element.addClass(classes);\n  }\n}\n\nfunction clearGeneratedClasses(element, options) {\n  if (options.preparationClasses) {\n    element.removeClass(options.preparationClasses);\n    options.preparationClasses = null;\n  }\n  if (options.activeClasses) {\n    element.removeClass(options.activeClasses);\n    options.activeClasses = null;\n  }\n}\n\nfunction blockKeyframeAnimations(node, applyBlock) {\n  var value = applyBlock ? 'paused' : '';\n  var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY;\n  applyInlineStyle(node, [key, value]);\n  return [key, value];\n}\n\nfunction applyInlineStyle(node, styleTuple) {\n  var prop = styleTuple[0];\n  var value = styleTuple[1];\n  node.style[prop] = value;\n}\n\nfunction concatWithSpace(a,b) {\n  if (!a) return b;\n  if (!b) return a;\n  return a + ' ' + b;\n}\n\nvar helpers = {\n  blockTransitions: function(node, duration) {\n    // we use a negative delay value since it performs blocking\n    // yet it doesn't kill any existing transitions running on the\n    // same element which makes this safe for class-based animations\n    var value = duration ? '-' + duration + 's' : '';\n    applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]);\n    return [TRANSITION_DELAY_PROP, value];\n  }\n};\n\nvar $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {\n  var queue, cancelFn;\n\n  function scheduler(tasks) {\n    // we make a copy since RAFScheduler mutates the state\n    // of the passed in array variable and this would be difficult\n    // to track down on the outside code\n    queue = queue.concat(tasks);\n    nextTick();\n  }\n\n  queue = scheduler.queue = [];\n\n  /* waitUntilQuiet does two things:\n   * 1. It will run the FINAL `fn` value only when an uncanceled RAF has passed through\n   * 2. It will delay the next wave of tasks from running until the quiet `fn` has run.\n   *\n   * The motivation here is that animation code can request more time from the scheduler\n   * before the next wave runs. This allows for certain DOM properties such as classes to\n   * be resolved in time for the next animation to run.\n   */\n  scheduler.waitUntilQuiet = function(fn) {\n    if (cancelFn) cancelFn();\n\n    cancelFn = $$rAF(function() {\n      cancelFn = null;\n      fn();\n      nextTick();\n    });\n  };\n\n  return scheduler;\n\n  function nextTick() {\n    if (!queue.length) return;\n\n    var items = queue.shift();\n    for (var i = 0; i < items.length; i++) {\n      items[i]();\n    }\n\n    if (!cancelFn) {\n      $$rAF(function() {\n        if (!cancelFn) nextTick();\n      });\n    }\n  }\n}];\n\n/**\n * @ngdoc directive\n * @name ngAnimateChildren\n * @restrict AE\n * @element ANY\n *\n * @description\n *\n * ngAnimateChildren allows you to specify that children of this element should animate even if any\n * of the children's parents are currently animating. By default, when an element has an active `enter`, `leave`, or `move`\n * (structural) animation, child elements that also have an active structural animation are not animated.\n *\n * Note that even if `ngAnimateChildren` is set, no child animations will run when the parent element is removed from the DOM (`leave` animation).\n *\n *\n * @param {string} ngAnimateChildren If the value is empty, `true` or `on`,\n *     then child animations are allowed. If the value is `false`, child animations are not allowed.\n *\n * @example\n * <example module=\"ngAnimateChildren\" name=\"ngAnimateChildren\" deps=\"angular-animate.js\" animations=\"true\">\n     <file name=\"index.html\">\n       <div ng-controller=\"MainController as main\">\n         <label>Show container? <input type=\"checkbox\" ng-model=\"main.enterElement\" /></label>\n         <label>Animate children? <input type=\"checkbox\" ng-model=\"main.animateChildren\" /></label>\n         <hr>\n         <div ng-animate-children=\"{{main.animateChildren}}\">\n           <div ng-if=\"main.enterElement\" class=\"container\">\n             List of items:\n             <div ng-repeat=\"item in [0, 1, 2, 3]\" class=\"item\">Item {{item}}</div>\n           </div>\n         </div>\n       </div>\n     </file>\n     <file name=\"animations.css\">\n\n      .container.ng-enter,\n      .container.ng-leave {\n        transition: all ease 1.5s;\n      }\n\n      .container.ng-enter,\n      .container.ng-leave-active {\n        opacity: 0;\n      }\n\n      .container.ng-leave,\n      .container.ng-enter-active {\n        opacity: 1;\n      }\n\n      .item {\n        background: firebrick;\n        color: #FFF;\n        margin-bottom: 10px;\n      }\n\n      .item.ng-enter,\n      .item.ng-leave {\n        transition: transform 1.5s ease;\n      }\n\n      .item.ng-enter {\n        transform: translateX(50px);\n      }\n\n      .item.ng-enter-active {\n        transform: translateX(0);\n      }\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngAnimateChildren', ['ngAnimate'])\n        .controller('MainController', function MainController() {\n          this.animateChildren = false;\n          this.enterElement = false;\n        });\n    </file>\n  </example>\n */\nvar $$AnimateChildrenDirective = ['$interpolate', function($interpolate) {\n  return {\n    link: function(scope, element, attrs) {\n      var val = attrs.ngAnimateChildren;\n      if (isString(val) && val.length === 0) { //empty attribute\n        element.data(NG_ANIMATE_CHILDREN_DATA, true);\n      } else {\n        // Interpolate and set the value, so that it is available to\n        // animations that run right after compilation\n        setData($interpolate(val)(scope));\n        attrs.$observe('ngAnimateChildren', setData);\n      }\n\n      function setData(value) {\n        value = value === 'on' || value === 'true';\n        element.data(NG_ANIMATE_CHILDREN_DATA, value);\n      }\n    }\n  };\n}];\n\n/* exported $AnimateCssProvider */\n\nvar ANIMATE_TIMER_KEY = '$$animateCss';\n\n/**\n * @ngdoc service\n * @name $animateCss\n * @kind object\n *\n * @description\n * The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes\n * from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT\n * to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or\n * directives to create more complex animations that can be purely driven using CSS code.\n *\n * Note that only browsers that support CSS transitions and/or keyframe animations are capable of\n * rendering animations triggered via `$animateCss` (bad news for IE9 and lower).\n *\n * ## General Use\n * Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that\n * is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however,\n * any automatic control over cancelling animations and/or preventing animations from being run on\n * child elements will not be handled by AngularJS. For this to work as expected, please use `$animate` to\n * trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger\n * the CSS animation.\n *\n * The example below shows how we can create a folding animation on an element using `ng-if`:\n *\n * ```html\n * <!-- notice the `fold-animation` CSS class -->\n * <div ng-if=\"onOff\" class=\"fold-animation\">\n *   This element will go BOOM\n * </div>\n * <button ng-click=\"onOff=true\">Fold In</button>\n * ```\n *\n * Now we create the **JavaScript animation** that will trigger the CSS transition:\n *\n * ```js\n * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element, doneFn) {\n *       var height = element[0].offsetHeight;\n *       return $animateCss(element, {\n *         from: { height:'0px' },\n *         to: { height:height + 'px' },\n *         duration: 1 // one second\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * ## More Advanced Uses\n *\n * `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks\n * like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code.\n *\n * This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation,\n * applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with\n * `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order\n * to provide a working animation that will run in CSS.\n *\n * The example below showcases a more advanced version of the `.fold-animation` from the example above:\n *\n * ```js\n * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element, doneFn) {\n *       var height = element[0].offsetHeight;\n *       return $animateCss(element, {\n *         addClass: 'red large-text pulse-twice',\n *         easing: 'ease-out',\n *         from: { height:'0px' },\n *         to: { height:height + 'px' },\n *         duration: 1 // one second\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * Since we're adding/removing CSS classes then the CSS transition will also pick those up:\n *\n * ```css\n * /&#42; since a hardcoded duration value of 1 was provided in the JavaScript animation code,\n * the CSS classes below will be transitioned despite them being defined as regular CSS classes &#42;/\n * .red { background:red; }\n * .large-text { font-size:20px; }\n *\n * /&#42; we can also use a keyframe animation and $animateCss will make it work alongside the transition &#42;/\n * .pulse-twice {\n *   animation: 0.5s pulse linear 2;\n *   -webkit-animation: 0.5s pulse linear 2;\n * }\n *\n * @keyframes pulse {\n *   from { transform: scale(0.5); }\n *   to { transform: scale(1.5); }\n * }\n *\n * @-webkit-keyframes pulse {\n *   from { -webkit-transform: scale(0.5); }\n *   to { -webkit-transform: scale(1.5); }\n * }\n * ```\n *\n * Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen.\n *\n * ## How the Options are handled\n *\n * `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation\n * works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline\n * styles using the `from` and `to` properties.\n *\n * ```js\n * var animator = $animateCss(element, {\n *   from: { background:'red' },\n *   to: { background:'blue' }\n * });\n * animator.start();\n * ```\n *\n * ```css\n * .rotating-animation {\n *   animation:0.5s rotate linear;\n *   -webkit-animation:0.5s rotate linear;\n * }\n *\n * @keyframes rotate {\n *   from { transform: rotate(0deg); }\n *   to { transform: rotate(360deg); }\n * }\n *\n * @-webkit-keyframes rotate {\n *   from { -webkit-transform: rotate(0deg); }\n *   to { -webkit-transform: rotate(360deg); }\n * }\n * ```\n *\n * The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is\n * going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition\n * style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition\n * and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied\n * and spread across the transition and keyframe animation.\n *\n * ## What is returned\n *\n * `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually\n * start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are\n * added and removed on the element). Once `$animateCss` is called it will return an object with the following properties:\n *\n * ```js\n * var animator = $animateCss(element, { ... });\n * ```\n *\n * Now what do the contents of our `animator` variable look like:\n *\n * ```js\n * {\n *   // starts the animation\n *   start: Function,\n *\n *   // ends (aborts) the animation\n *   end: Function\n * }\n * ```\n *\n * To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends.\n * If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and styles may have been\n * applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties\n * and that changing them will not reconfigure the parameters of the animation.\n *\n * ### runner.done() vs runner.then()\n * It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the\n * runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**.\n * Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()`\n * unless you really need a digest to kick off afterwards.\n *\n * Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss\n * (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code).\n * Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works.\n *\n * @param {DOMElement} element the element that will be animated\n * @param {object} options the animation-related options that will be applied during the animation\n *\n * * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied\n * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.)\n * * `structural` - Indicates that the `ng-` prefix will be added to the event class. Setting to `false` or omitting will turn `ng-EVENT` and\n * `ng-EVENT-active` in `EVENT` and `EVENT-active`. Unused if `event` is omitted.\n * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both).\n * * `transitionStyle` - The raw CSS transition style that will be used (e.g. `1s linear all`).\n * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`).\n * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation.\n * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition.\n * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation.\n * * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation.\n * * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0`\n * is provided then the animation will be skipped entirely.\n * * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is\n * used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value\n * of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same\n * CSS delay value.\n * * `stagger` - A numeric time value representing the delay between successively animated elements\n * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.})\n * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a\n *   `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)\n * * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occurring on the classes being added and removed.)\n * * `cleanupStyles` - Whether or not the provided `from` and `to` styles will be removed once\n *    the animation is closed. This is useful for when the styles are used purely for the sake of\n *    the animation and do not have a lasting visual effect on the element (e.g. a collapse and open animation).\n *    By default this value is set to `false`.\n *\n * @return {object} an object with start and end methods and details about the animation.\n *\n * * `start` - The method to start the animation. This will return a `Promise` when called.\n * * `end` - This method will cancel the animation and remove all applied CSS classes and styles.\n */\nvar ONE_SECOND = 1000;\n\nvar ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\nvar CLOSING_TIME_BUFFER = 1.5;\n\nvar DETECT_CSS_PROPERTIES = {\n  transitionDuration:      TRANSITION_DURATION_PROP,\n  transitionDelay:         TRANSITION_DELAY_PROP,\n  transitionProperty:      TRANSITION_PROP + PROPERTY_KEY,\n  animationDuration:       ANIMATION_DURATION_PROP,\n  animationDelay:          ANIMATION_DELAY_PROP,\n  animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY\n};\n\nvar DETECT_STAGGER_CSS_PROPERTIES = {\n  transitionDuration:      TRANSITION_DURATION_PROP,\n  transitionDelay:         TRANSITION_DELAY_PROP,\n  animationDuration:       ANIMATION_DURATION_PROP,\n  animationDelay:          ANIMATION_DELAY_PROP\n};\n\nfunction getCssKeyframeDurationStyle(duration) {\n  return [ANIMATION_DURATION_PROP, duration + 's'];\n}\n\nfunction getCssDelayStyle(delay, isKeyframeAnimation) {\n  var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP;\n  return [prop, delay + 's'];\n}\n\nfunction computeCssStyles($window, element, properties) {\n  var styles = Object.create(null);\n  var detectedStyles = $window.getComputedStyle(element) || {};\n  forEach(properties, function(formalStyleName, actualStyleName) {\n    var val = detectedStyles[formalStyleName];\n    if (val) {\n      var c = val.charAt(0);\n\n      // only numerical-based values have a negative sign or digit as the first value\n      if (c === '-' || c === '+' || c >= 0) {\n        val = parseMaxTime(val);\n      }\n\n      // by setting this to null in the event that the delay is not set or is set directly as 0\n      // then we can still allow for negative values to be used later on and not mistake this\n      // value for being greater than any other negative value.\n      if (val === 0) {\n        val = null;\n      }\n      styles[actualStyleName] = val;\n    }\n  });\n\n  return styles;\n}\n\nfunction parseMaxTime(str) {\n  var maxValue = 0;\n  var values = str.split(/\\s*,\\s*/);\n  forEach(values, function(value) {\n    // it's always safe to consider only second values and omit `ms` values since\n    // getComputedStyle will always handle the conversion for us\n    if (value.charAt(value.length - 1) === 's') {\n      value = value.substring(0, value.length - 1);\n    }\n    value = parseFloat(value) || 0;\n    maxValue = maxValue ? Math.max(value, maxValue) : value;\n  });\n  return maxValue;\n}\n\nfunction truthyTimingValue(val) {\n  return val === 0 || val != null;\n}\n\nfunction getCssTransitionDurationStyle(duration, applyOnlyDuration) {\n  var style = TRANSITION_PROP;\n  var value = duration + 's';\n  if (applyOnlyDuration) {\n    style += DURATION_KEY;\n  } else {\n    value += ' linear all';\n  }\n  return [style, value];\n}\n\n// we do not reassign an already present style value since\n// if we detect the style property value again we may be\n// detecting styles that were added via the `from` styles.\n// We make use of `isDefined` here since an empty string\n// or null value (which is what getPropertyValue will return\n// for a non-existing style) will still be marked as a valid\n// value for the style (a falsy value implies that the style\n// is to be removed at the end of the animation). If we had a simple\n// \"OR\" statement then it would not be enough to catch that.\nfunction registerRestorableStyles(backup, node, properties) {\n  forEach(properties, function(prop) {\n    backup[prop] = isDefined(backup[prop])\n        ? backup[prop]\n        : node.style.getPropertyValue(prop);\n  });\n}\n\nvar $AnimateCssProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n\n  this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout', '$$animateCache',\n               '$$forceReflow', '$sniffer', '$$rAFScheduler', '$$animateQueue',\n       function($window,   $$jqLite,   $$AnimateRunner,   $timeout,   $$animateCache,\n                $$forceReflow,   $sniffer,   $$rAFScheduler, $$animateQueue) {\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function computeCachedCssStyles(node, className, cacheKey, allowNoDuration, properties) {\n      var timings = $$animateCache.get(cacheKey);\n\n      if (!timings) {\n        timings = computeCssStyles($window, node, properties);\n        if (timings.animationIterationCount === 'infinite') {\n          timings.animationIterationCount = 1;\n        }\n      }\n\n      // if a css animation has no duration we\n      // should mark that so that repeated addClass/removeClass calls are skipped\n      var hasDuration = allowNoDuration || (timings.transitionDuration > 0 || timings.animationDuration > 0);\n\n      // we keep putting this in multiple times even though the value and the cacheKey are the same\n      // because we're keeping an internal tally of how many duplicate animations are detected.\n      $$animateCache.put(cacheKey, timings, hasDuration);\n\n      return timings;\n    }\n\n    function computeCachedCssStaggerStyles(node, className, cacheKey, properties) {\n      var stagger;\n      var staggerCacheKey = 'stagger-' + cacheKey;\n\n      // if we have one or more existing matches of matching elements\n      // containing the same parent + CSS styles (which is how cacheKey works)\n      // then staggering is possible\n      if ($$animateCache.count(cacheKey) > 0) {\n        stagger = $$animateCache.get(staggerCacheKey);\n\n        if (!stagger) {\n          var staggerClassName = pendClasses(className, '-stagger');\n\n          $$jqLite.addClass(node, staggerClassName);\n\n          stagger = computeCssStyles($window, node, properties);\n\n          // force the conversion of a null value to zero incase not set\n          stagger.animationDuration = Math.max(stagger.animationDuration, 0);\n          stagger.transitionDuration = Math.max(stagger.transitionDuration, 0);\n\n          $$jqLite.removeClass(node, staggerClassName);\n\n          $$animateCache.put(staggerCacheKey, stagger, true);\n        }\n      }\n\n      return stagger || {};\n    }\n\n    var rafWaitQueue = [];\n    function waitUntilQuiet(callback) {\n      rafWaitQueue.push(callback);\n      $$rAFScheduler.waitUntilQuiet(function() {\n        $$animateCache.flush();\n\n        // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.\n        // PLEASE EXAMINE THE `$$forceReflow` service to understand why.\n        var pageWidth = $$forceReflow();\n\n        // we use a for loop to ensure that if the queue is changed\n        // during this looping then it will consider new requests\n        for (var i = 0; i < rafWaitQueue.length; i++) {\n          rafWaitQueue[i](pageWidth);\n        }\n        rafWaitQueue.length = 0;\n      });\n    }\n\n    function computeTimings(node, className, cacheKey, allowNoDuration) {\n      var timings = computeCachedCssStyles(node, className, cacheKey, allowNoDuration, DETECT_CSS_PROPERTIES);\n      var aD = timings.animationDelay;\n      var tD = timings.transitionDelay;\n      timings.maxDelay = aD && tD\n          ? Math.max(aD, tD)\n          : (aD || tD);\n      timings.maxDuration = Math.max(\n          timings.animationDuration * timings.animationIterationCount,\n          timings.transitionDuration);\n\n      return timings;\n    }\n\n    return function init(element, initialOptions) {\n      // all of the animation functions should create\n      // a copy of the options data, however, if a\n      // parent service has already created a copy then\n      // we should stick to using that\n      var options = initialOptions || {};\n      if (!options.$$prepared) {\n        options = prepareAnimationOptions(copy(options));\n      }\n\n      var restoreStyles = {};\n      var node = getDomNode(element);\n      if (!node\n          || !node.parentNode\n          || !$$animateQueue.enabled()) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var temporaryStyles = [];\n      var classes = element.attr('class');\n      var styles = packageStyles(options);\n      var animationClosed;\n      var animationPaused;\n      var animationCompleted;\n      var runner;\n      var runnerHost;\n      var maxDelay;\n      var maxDelayTime;\n      var maxDuration;\n      var maxDurationTime;\n      var startTime;\n      var events = [];\n\n      if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var method = options.event && isArray(options.event)\n            ? options.event.join(' ')\n            : options.event;\n\n      var isStructural = method && options.structural;\n      var structuralClassName = '';\n      var addRemoveClassName = '';\n\n      if (isStructural) {\n        structuralClassName = pendClasses(method, EVENT_CLASS_PREFIX, true);\n      } else if (method) {\n        structuralClassName = method;\n      }\n\n      if (options.addClass) {\n        addRemoveClassName += pendClasses(options.addClass, ADD_CLASS_SUFFIX);\n      }\n\n      if (options.removeClass) {\n        if (addRemoveClassName.length) {\n          addRemoveClassName += ' ';\n        }\n        addRemoveClassName += pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX);\n      }\n\n      // there may be a situation where a structural animation is combined together\n      // with CSS classes that need to resolve before the animation is computed.\n      // However this means that there is no explicit CSS code to block the animation\n      // from happening (by setting 0s none in the class name). If this is the case\n      // we need to apply the classes before the first rAF so we know to continue if\n      // there actually is a detected transition or keyframe animation\n      if (options.applyClassesEarly && addRemoveClassName.length) {\n        applyAnimationClasses(element, options);\n      }\n\n      var preparationClasses = [structuralClassName, addRemoveClassName].join(' ').trim();\n      var fullClassName = classes + ' ' + preparationClasses;\n      var hasToStyles = styles.to && Object.keys(styles.to).length > 0;\n      var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0;\n\n      // there is no way we can trigger an animation if no styles and\n      // no classes are being applied which would then trigger a transition,\n      // unless there a is raw keyframe value that is applied to the element.\n      if (!containsKeyframeAnimation\n           && !hasToStyles\n           && !preparationClasses) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var stagger, cacheKey = $$animateCache.cacheKey(node, method, options.addClass, options.removeClass);\n      if ($$animateCache.containsCachedAnimationWithoutDuration(cacheKey)) {\n        preparationClasses = null;\n        return closeAndReturnNoopAnimator();\n      }\n\n      if (options.stagger > 0) {\n        var staggerVal = parseFloat(options.stagger);\n        stagger = {\n          transitionDelay: staggerVal,\n          animationDelay: staggerVal,\n          transitionDuration: 0,\n          animationDuration: 0\n        };\n      } else {\n        stagger = computeCachedCssStaggerStyles(node, preparationClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES);\n      }\n\n      if (!options.$$skipPreparationClasses) {\n        $$jqLite.addClass(element, preparationClasses);\n      }\n\n      var applyOnlyDuration;\n\n      if (options.transitionStyle) {\n        var transitionStyle = [TRANSITION_PROP, options.transitionStyle];\n        applyInlineStyle(node, transitionStyle);\n        temporaryStyles.push(transitionStyle);\n      }\n\n      if (options.duration >= 0) {\n        applyOnlyDuration = node.style[TRANSITION_PROP].length > 0;\n        var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration);\n\n        // we set the duration so that it will be picked up by getComputedStyle later\n        applyInlineStyle(node, durationStyle);\n        temporaryStyles.push(durationStyle);\n      }\n\n      if (options.keyframeStyle) {\n        var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle];\n        applyInlineStyle(node, keyframeStyle);\n        temporaryStyles.push(keyframeStyle);\n      }\n\n      var itemIndex = stagger\n          ? options.staggerIndex >= 0\n              ? options.staggerIndex\n              : $$animateCache.count(cacheKey)\n          : 0;\n\n      var isFirst = itemIndex === 0;\n\n      // this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY\n      // without causing any combination of transitions to kick in. By adding a negative delay value\n      // it forces the setup class' transition to end immediately. We later then remove the negative\n      // transition delay to allow for the transition to naturally do it's thing. The beauty here is\n      // that if there is no transition defined then nothing will happen and this will also allow\n      // other transitions to be stacked on top of each other without any chopping them out.\n      if (isFirst && !options.skipBlocking) {\n        helpers.blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE);\n      }\n\n      var timings = computeTimings(node, fullClassName, cacheKey, !isStructural);\n      var relativeDelay = timings.maxDelay;\n      maxDelay = Math.max(relativeDelay, 0);\n      maxDuration = timings.maxDuration;\n\n      var flags = {};\n      flags.hasTransitions          = timings.transitionDuration > 0;\n      flags.hasAnimations           = timings.animationDuration > 0;\n      flags.hasTransitionAll        = flags.hasTransitions && timings.transitionProperty === 'all';\n      flags.applyTransitionDuration = hasToStyles && (\n                                        (flags.hasTransitions && !flags.hasTransitionAll)\n                                         || (flags.hasAnimations && !flags.hasTransitions));\n      flags.applyAnimationDuration  = options.duration && flags.hasAnimations;\n      flags.applyTransitionDelay    = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions);\n      flags.applyAnimationDelay     = truthyTimingValue(options.delay) && flags.hasAnimations;\n      flags.recalculateTimingStyles = addRemoveClassName.length > 0;\n\n      if (flags.applyTransitionDuration || flags.applyAnimationDuration) {\n        maxDuration = options.duration ? parseFloat(options.duration) : maxDuration;\n\n        if (flags.applyTransitionDuration) {\n          flags.hasTransitions = true;\n          timings.transitionDuration = maxDuration;\n          applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0;\n          temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration));\n        }\n\n        if (flags.applyAnimationDuration) {\n          flags.hasAnimations = true;\n          timings.animationDuration = maxDuration;\n          temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration));\n        }\n      }\n\n      if (maxDuration === 0 && !flags.recalculateTimingStyles) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var activeClasses = pendClasses(preparationClasses, ACTIVE_CLASS_SUFFIX);\n\n      if (options.delay != null) {\n        var delayStyle;\n        if (typeof options.delay !== 'boolean') {\n          delayStyle = parseFloat(options.delay);\n          // number in options.delay means we have to recalculate the delay for the closing timeout\n          maxDelay = Math.max(delayStyle, 0);\n        }\n\n        if (flags.applyTransitionDelay) {\n          temporaryStyles.push(getCssDelayStyle(delayStyle));\n        }\n\n        if (flags.applyAnimationDelay) {\n          temporaryStyles.push(getCssDelayStyle(delayStyle, true));\n        }\n      }\n\n      // we need to recalculate the delay value since we used a pre-emptive negative\n      // delay value and the delay value is required for the final event checking. This\n      // property will ensure that this will happen after the RAF phase has passed.\n      if (options.duration == null && timings.transitionDuration > 0) {\n        flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst;\n      }\n\n      maxDelayTime = maxDelay * ONE_SECOND;\n      maxDurationTime = maxDuration * ONE_SECOND;\n      if (!options.skipBlocking) {\n        flags.blockTransition = timings.transitionDuration > 0;\n        flags.blockKeyframeAnimation = timings.animationDuration > 0 &&\n                                       stagger.animationDelay > 0 &&\n                                       stagger.animationDuration === 0;\n      }\n\n      if (options.from) {\n        if (options.cleanupStyles) {\n          registerRestorableStyles(restoreStyles, node, Object.keys(options.from));\n        }\n        applyAnimationFromStyles(element, options);\n      }\n\n      if (flags.blockTransition || flags.blockKeyframeAnimation) {\n        applyBlocking(maxDuration);\n      } else if (!options.skipBlocking) {\n        helpers.blockTransitions(node, false);\n      }\n\n      // TODO(matsko): for 1.5 change this code to have an animator object for better debugging\n      return {\n        $$willAnimate: true,\n        end: endFn,\n        start: function() {\n          if (animationClosed) return;\n\n          runnerHost = {\n            end: endFn,\n            cancel: cancelFn,\n            resume: null, //this will be set during the start() phase\n            pause: null\n          };\n\n          runner = new $$AnimateRunner(runnerHost);\n\n          waitUntilQuiet(start);\n\n          // we don't have access to pause/resume the animation\n          // since it hasn't run yet. AnimateRunner will therefore\n          // set noop functions for resume and pause and they will\n          // later be overridden once the animation is triggered\n          return runner;\n        }\n      };\n\n      function endFn() {\n        close();\n      }\n\n      function cancelFn() {\n        close(true);\n      }\n\n      function close(rejected) {\n        // if the promise has been called already then we shouldn't close\n        // the animation again\n        if (animationClosed || (animationCompleted && animationPaused)) return;\n        animationClosed = true;\n        animationPaused = false;\n\n        if (preparationClasses && !options.$$skipPreparationClasses) {\n          $$jqLite.removeClass(element, preparationClasses);\n        }\n\n        if (activeClasses) {\n          $$jqLite.removeClass(element, activeClasses);\n        }\n\n        blockKeyframeAnimations(node, false);\n        helpers.blockTransitions(node, false);\n\n        forEach(temporaryStyles, function(entry) {\n          // There is only one way to remove inline style properties entirely from elements.\n          // By using `removeProperty` this works, but we need to convert camel-cased CSS\n          // styles down to hyphenated values.\n          node.style[entry[0]] = '';\n        });\n\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n\n        if (Object.keys(restoreStyles).length) {\n          forEach(restoreStyles, function(value, prop) {\n            if (value) {\n              node.style.setProperty(prop, value);\n            } else {\n              node.style.removeProperty(prop);\n            }\n          });\n        }\n\n        // the reason why we have this option is to allow a synchronous closing callback\n        // that is fired as SOON as the animation ends (when the CSS is removed) or if\n        // the animation never takes off at all. A good example is a leave animation since\n        // the element must be removed just after the animation is over or else the element\n        // will appear on screen for one animation frame causing an overbearing flicker.\n        if (options.onDone) {\n          options.onDone();\n        }\n\n        if (events && events.length) {\n          // Remove the transitionend / animationend listener(s)\n          element.off(events.join(' '), onAnimationProgress);\n        }\n\n        //Cancel the fallback closing timeout and remove the timer data\n        var animationTimerData = element.data(ANIMATE_TIMER_KEY);\n        if (animationTimerData) {\n          $timeout.cancel(animationTimerData[0].timer);\n          element.removeData(ANIMATE_TIMER_KEY);\n        }\n\n        // if the preparation function fails then the promise is not setup\n        if (runner) {\n          runner.complete(!rejected);\n        }\n      }\n\n      function applyBlocking(duration) {\n        if (flags.blockTransition) {\n          helpers.blockTransitions(node, duration);\n        }\n\n        if (flags.blockKeyframeAnimation) {\n          blockKeyframeAnimations(node, !!duration);\n        }\n      }\n\n      function closeAndReturnNoopAnimator() {\n        runner = new $$AnimateRunner({\n          end: endFn,\n          cancel: cancelFn\n        });\n\n        // should flush the cache animation\n        waitUntilQuiet(noop);\n        close();\n\n        return {\n          $$willAnimate: false,\n          start: function() {\n            return runner;\n          },\n          end: endFn\n        };\n      }\n\n      function onAnimationProgress(event) {\n        event.stopPropagation();\n        var ev = event.originalEvent || event;\n\n        if (ev.target !== node) {\n          // Since TransitionEvent / AnimationEvent bubble up,\n          // we have to ignore events by finished child animations\n          return;\n        }\n\n        // we now always use `Date.now()` due to the recent changes with\n        // event.timeStamp in Firefox, Webkit and Chrome (see #13494 for more info)\n        var timeStamp = ev.$manualTimeStamp || Date.now();\n\n        /* Firefox (or possibly just Gecko) likes to not round values up\n         * when a ms measurement is used for the animation */\n        var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));\n\n        /* $manualTimeStamp is a mocked timeStamp value which is set\n         * within browserTrigger(). This is only here so that tests can\n         * mock animations properly. Real events fallback to event.timeStamp,\n         * or, if they don't, then a timeStamp is automatically created for them.\n         * We're checking to see if the timeStamp surpasses the expected delay,\n         * but we're using elapsedTime instead of the timeStamp on the 2nd\n         * pre-condition since animationPauseds sometimes close off early */\n        if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n          // we set this flag to ensure that if the transition is paused then, when resumed,\n          // the animation will automatically close itself since transitions cannot be paused.\n          animationCompleted = true;\n          close();\n        }\n      }\n\n      function start() {\n        if (animationClosed) return;\n        if (!node.parentNode) {\n          close();\n          return;\n        }\n\n        // even though we only pause keyframe animations here the pause flag\n        // will still happen when transitions are used. Only the transition will\n        // not be paused since that is not possible. If the animation ends when\n        // paused then it will not complete until unpaused or cancelled.\n        var playPause = function(playAnimation) {\n          if (!animationCompleted) {\n            animationPaused = !playAnimation;\n            if (timings.animationDuration) {\n              var value = blockKeyframeAnimations(node, animationPaused);\n              if (animationPaused) {\n                temporaryStyles.push(value);\n              } else {\n                removeFromArray(temporaryStyles, value);\n              }\n            }\n          } else if (animationPaused && playAnimation) {\n            animationPaused = false;\n            close();\n          }\n        };\n\n        // checking the stagger duration prevents an accidentally cascade of the CSS delay style\n        // being inherited from the parent. If the transition duration is zero then we can safely\n        // rely that the delay value is an intentional stagger delay style.\n        var maxStagger = itemIndex > 0\n                         && ((timings.transitionDuration && stagger.transitionDuration === 0) ||\n                            (timings.animationDuration && stagger.animationDuration === 0))\n                         && Math.max(stagger.animationDelay, stagger.transitionDelay);\n        if (maxStagger) {\n          $timeout(triggerAnimationStart,\n                   Math.floor(maxStagger * itemIndex * ONE_SECOND),\n                   false);\n        } else {\n          triggerAnimationStart();\n        }\n\n        // this will decorate the existing promise runner with pause/resume methods\n        runnerHost.resume = function() {\n          playPause(true);\n        };\n\n        runnerHost.pause = function() {\n          playPause(false);\n        };\n\n        function triggerAnimationStart() {\n          // just incase a stagger animation kicks in when the animation\n          // itself was cancelled entirely\n          if (animationClosed) return;\n\n          applyBlocking(false);\n\n          forEach(temporaryStyles, function(entry) {\n            var key = entry[0];\n            var value = entry[1];\n            node.style[key] = value;\n          });\n\n          applyAnimationClasses(element, options);\n          $$jqLite.addClass(element, activeClasses);\n\n          if (flags.recalculateTimingStyles) {\n            fullClassName = node.getAttribute('class') + ' ' + preparationClasses;\n            cacheKey = $$animateCache.cacheKey(node, method, options.addClass, options.removeClass);\n\n            timings = computeTimings(node, fullClassName, cacheKey, false);\n            relativeDelay = timings.maxDelay;\n            maxDelay = Math.max(relativeDelay, 0);\n            maxDuration = timings.maxDuration;\n\n            if (maxDuration === 0) {\n              close();\n              return;\n            }\n\n            flags.hasTransitions = timings.transitionDuration > 0;\n            flags.hasAnimations = timings.animationDuration > 0;\n          }\n\n          if (flags.applyAnimationDelay) {\n            relativeDelay = typeof options.delay !== 'boolean' && truthyTimingValue(options.delay)\n                  ? parseFloat(options.delay)\n                  : relativeDelay;\n\n            maxDelay = Math.max(relativeDelay, 0);\n            timings.animationDelay = relativeDelay;\n            delayStyle = getCssDelayStyle(relativeDelay, true);\n            temporaryStyles.push(delayStyle);\n            node.style[delayStyle[0]] = delayStyle[1];\n          }\n\n          maxDelayTime = maxDelay * ONE_SECOND;\n          maxDurationTime = maxDuration * ONE_SECOND;\n\n          if (options.easing) {\n            var easeProp, easeVal = options.easing;\n            if (flags.hasTransitions) {\n              easeProp = TRANSITION_PROP + TIMING_KEY;\n              temporaryStyles.push([easeProp, easeVal]);\n              node.style[easeProp] = easeVal;\n            }\n            if (flags.hasAnimations) {\n              easeProp = ANIMATION_PROP + TIMING_KEY;\n              temporaryStyles.push([easeProp, easeVal]);\n              node.style[easeProp] = easeVal;\n            }\n          }\n\n          if (timings.transitionDuration) {\n            events.push(TRANSITIONEND_EVENT);\n          }\n\n          if (timings.animationDuration) {\n            events.push(ANIMATIONEND_EVENT);\n          }\n\n          startTime = Date.now();\n          var timerTime = maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime;\n          var endTime = startTime + timerTime;\n\n          var animationsData = element.data(ANIMATE_TIMER_KEY) || [];\n          var setupFallbackTimer = true;\n          if (animationsData.length) {\n            var currentTimerData = animationsData[0];\n            setupFallbackTimer = endTime > currentTimerData.expectedEndTime;\n            if (setupFallbackTimer) {\n              $timeout.cancel(currentTimerData.timer);\n            } else {\n              animationsData.push(close);\n            }\n          }\n\n          if (setupFallbackTimer) {\n            var timer = $timeout(onAnimationExpired, timerTime, false);\n            animationsData[0] = {\n              timer: timer,\n              expectedEndTime: endTime\n            };\n            animationsData.push(close);\n            element.data(ANIMATE_TIMER_KEY, animationsData);\n          }\n\n          if (events.length) {\n            element.on(events.join(' '), onAnimationProgress);\n          }\n\n          if (options.to) {\n            if (options.cleanupStyles) {\n              registerRestorableStyles(restoreStyles, node, Object.keys(options.to));\n            }\n            applyAnimationToStyles(element, options);\n          }\n        }\n\n        function onAnimationExpired() {\n          var animationsData = element.data(ANIMATE_TIMER_KEY);\n\n          // this will be false in the event that the element was\n          // removed from the DOM (via a leave animation or something\n          // similar)\n          if (animationsData) {\n            for (var i = 1; i < animationsData.length; i++) {\n              animationsData[i]();\n            }\n            element.removeData(ANIMATE_TIMER_KEY);\n          }\n        }\n      }\n    };\n  }];\n}];\n\nvar $$AnimateCssDriverProvider = ['$$animationProvider', /** @this */ function($$animationProvider) {\n  $$animationProvider.drivers.push('$$animateCssDriver');\n\n  var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim';\n  var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor';\n\n  var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out';\n  var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in';\n\n  function isDocumentFragment(node) {\n    return node.parentNode && node.parentNode.nodeType === 11;\n  }\n\n  this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$sniffer', '$$jqLite', '$document',\n       function($animateCss,   $rootScope,   $$AnimateRunner,   $rootElement,   $sniffer,   $$jqLite,   $document) {\n\n    // only browsers that support these properties can render animations\n    if (!$sniffer.animations && !$sniffer.transitions) return noop;\n\n    var bodyNode = $document[0].body;\n    var rootNode = getDomNode($rootElement);\n\n    var rootBodyElement = jqLite(\n      // this is to avoid using something that exists outside of the body\n      // we also special case the doc fragment case because our unit test code\n      // appends the $rootElement to the body after the app has been bootstrapped\n      isDocumentFragment(rootNode) || bodyNode.contains(rootNode) ? rootNode : bodyNode\n    );\n\n    return function initDriverFn(animationDetails) {\n      return animationDetails.from && animationDetails.to\n          ? prepareFromToAnchorAnimation(animationDetails.from,\n                                         animationDetails.to,\n                                         animationDetails.classes,\n                                         animationDetails.anchors)\n          : prepareRegularAnimation(animationDetails);\n    };\n\n    function filterCssClasses(classes) {\n      //remove all the `ng-` stuff\n      return classes.replace(/\\bng-\\S+\\b/g, '');\n    }\n\n    function getUniqueValues(a, b) {\n      if (isString(a)) a = a.split(' ');\n      if (isString(b)) b = b.split(' ');\n      return a.filter(function(val) {\n        return b.indexOf(val) === -1;\n      }).join(' ');\n    }\n\n    function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {\n      var clone = jqLite(getDomNode(outAnchor).cloneNode(true));\n      var startingClasses = filterCssClasses(getClassVal(clone));\n\n      outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);\n      inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);\n\n      clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME);\n\n      rootBodyElement.append(clone);\n\n      var animatorIn, animatorOut = prepareOutAnimation();\n\n      // the user may not end up using the `out` animation and\n      // only making use of the `in` animation or vice-versa.\n      // In either case we should allow this and not assume the\n      // animation is over unless both animations are not used.\n      if (!animatorOut) {\n        animatorIn = prepareInAnimation();\n        if (!animatorIn) {\n          return end();\n        }\n      }\n\n      var startingAnimator = animatorOut || animatorIn;\n\n      return {\n        start: function() {\n          var runner;\n\n          var currentAnimation = startingAnimator.start();\n          currentAnimation.done(function() {\n            currentAnimation = null;\n            if (!animatorIn) {\n              animatorIn = prepareInAnimation();\n              if (animatorIn) {\n                currentAnimation = animatorIn.start();\n                currentAnimation.done(function() {\n                  currentAnimation = null;\n                  end();\n                  runner.complete();\n                });\n                return currentAnimation;\n              }\n            }\n            // in the event that there is no `in` animation\n            end();\n            runner.complete();\n          });\n\n          runner = new $$AnimateRunner({\n            end: endFn,\n            cancel: endFn\n          });\n\n          return runner;\n\n          function endFn() {\n            if (currentAnimation) {\n              currentAnimation.end();\n            }\n          }\n        }\n      };\n\n      function calculateAnchorStyles(anchor) {\n        var styles = {};\n\n        var coords = getDomNode(anchor).getBoundingClientRect();\n\n        // we iterate directly since safari messes up and doesn't return\n        // all the keys for the coords object when iterated\n        forEach(['width','height','top','left'], function(key) {\n          var value = coords[key];\n          switch (key) {\n            case 'top':\n              value += bodyNode.scrollTop;\n              break;\n            case 'left':\n              value += bodyNode.scrollLeft;\n              break;\n          }\n          styles[key] = Math.floor(value) + 'px';\n        });\n        return styles;\n      }\n\n      function prepareOutAnimation() {\n        var animator = $animateCss(clone, {\n          addClass: NG_OUT_ANCHOR_CLASS_NAME,\n          delay: true,\n          from: calculateAnchorStyles(outAnchor)\n        });\n\n        // read the comment within `prepareRegularAnimation` to understand\n        // why this check is necessary\n        return animator.$$willAnimate ? animator : null;\n      }\n\n      function getClassVal(element) {\n        return element.attr('class') || '';\n      }\n\n      function prepareInAnimation() {\n        var endingClasses = filterCssClasses(getClassVal(inAnchor));\n        var toAdd = getUniqueValues(endingClasses, startingClasses);\n        var toRemove = getUniqueValues(startingClasses, endingClasses);\n\n        var animator = $animateCss(clone, {\n          to: calculateAnchorStyles(inAnchor),\n          addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd,\n          removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove,\n          delay: true\n        });\n\n        // read the comment within `prepareRegularAnimation` to understand\n        // why this check is necessary\n        return animator.$$willAnimate ? animator : null;\n      }\n\n      function end() {\n        clone.remove();\n        outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);\n        inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);\n      }\n    }\n\n    function prepareFromToAnchorAnimation(from, to, classes, anchors) {\n      var fromAnimation = prepareRegularAnimation(from, noop);\n      var toAnimation = prepareRegularAnimation(to, noop);\n\n      var anchorAnimations = [];\n      forEach(anchors, function(anchor) {\n        var outElement = anchor['out'];\n        var inElement = anchor['in'];\n        var animator = prepareAnchoredAnimation(classes, outElement, inElement);\n        if (animator) {\n          anchorAnimations.push(animator);\n        }\n      });\n\n      // no point in doing anything when there are no elements to animate\n      if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return;\n\n      return {\n        start: function() {\n          var animationRunners = [];\n\n          if (fromAnimation) {\n            animationRunners.push(fromAnimation.start());\n          }\n\n          if (toAnimation) {\n            animationRunners.push(toAnimation.start());\n          }\n\n          forEach(anchorAnimations, function(animation) {\n            animationRunners.push(animation.start());\n          });\n\n          var runner = new $$AnimateRunner({\n            end: endFn,\n            cancel: endFn // CSS-driven animations cannot be cancelled, only ended\n          });\n\n          $$AnimateRunner.all(animationRunners, function(status) {\n            runner.complete(status);\n          });\n\n          return runner;\n\n          function endFn() {\n            forEach(animationRunners, function(runner) {\n              runner.end();\n            });\n          }\n        }\n      };\n    }\n\n    function prepareRegularAnimation(animationDetails) {\n      var element = animationDetails.element;\n      var options = animationDetails.options || {};\n\n      if (animationDetails.structural) {\n        options.event = animationDetails.event;\n        options.structural = true;\n        options.applyClassesEarly = true;\n\n        // we special case the leave animation since we want to ensure that\n        // the element is removed as soon as the animation is over. Otherwise\n        // a flicker might appear or the element may not be removed at all\n        if (animationDetails.event === 'leave') {\n          options.onDone = options.domOperation;\n        }\n      }\n\n      // We assign the preparationClasses as the actual animation event since\n      // the internals of $animateCss will just suffix the event token values\n      // with `-active` to trigger the animation.\n      if (options.preparationClasses) {\n        options.event = concatWithSpace(options.event, options.preparationClasses);\n      }\n\n      var animator = $animateCss(element, options);\n\n      // the driver lookup code inside of $$animation attempts to spawn a\n      // driver one by one until a driver returns a.$$willAnimate animator object.\n      // $animateCss will always return an object, however, it will pass in\n      // a flag as a hint as to whether an animation was detected or not\n      return animator.$$willAnimate ? animator : null;\n    }\n  }];\n}];\n\n// TODO(matsko): use caching here to speed things up for detection\n// TODO(matsko): add documentation\n//  by the time...\n\nvar $$AnimateJsProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  this.$get = ['$injector', '$$AnimateRunner', '$$jqLite',\n       function($injector,   $$AnimateRunner,   $$jqLite) {\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n         // $animateJs(element, 'enter');\n    return function(element, event, classes, options) {\n      var animationClosed = false;\n\n      // the `classes` argument is optional and if it is not used\n      // then the classes will be resolved from the element's className\n      // property as well as options.addClass/options.removeClass.\n      if (arguments.length === 3 && isObject(classes)) {\n        options = classes;\n        classes = null;\n      }\n\n      options = prepareAnimationOptions(options);\n      if (!classes) {\n        classes = element.attr('class') || '';\n        if (options.addClass) {\n          classes += ' ' + options.addClass;\n        }\n        if (options.removeClass) {\n          classes += ' ' + options.removeClass;\n        }\n      }\n\n      var classesToAdd = options.addClass;\n      var classesToRemove = options.removeClass;\n\n      // the lookupAnimations function returns a series of animation objects that are\n      // matched up with one or more of the CSS classes. These animation objects are\n      // defined via the module.animation factory function. If nothing is detected then\n      // we don't return anything which then makes $animation query the next driver.\n      var animations = lookupAnimations(classes);\n      var before, after;\n      if (animations.length) {\n        var afterFn, beforeFn;\n        if (event === 'leave') {\n          beforeFn = 'leave';\n          afterFn = 'afterLeave'; // TODO(matsko): get rid of this\n        } else {\n          beforeFn = 'before' + event.charAt(0).toUpperCase() + event.substr(1);\n          afterFn = event;\n        }\n\n        if (event !== 'enter' && event !== 'move') {\n          before = packageAnimations(element, event, options, animations, beforeFn);\n        }\n        after  = packageAnimations(element, event, options, animations, afterFn);\n      }\n\n      // no matching animations\n      if (!before && !after) return;\n\n      function applyOptions() {\n        options.domOperation();\n        applyAnimationClasses(element, options);\n      }\n\n      function close() {\n        animationClosed = true;\n        applyOptions();\n        applyAnimationStyles(element, options);\n      }\n\n      var runner;\n\n      return {\n        $$willAnimate: true,\n        end: function() {\n          if (runner) {\n            runner.end();\n          } else {\n            close();\n            runner = new $$AnimateRunner();\n            runner.complete(true);\n          }\n          return runner;\n        },\n        start: function() {\n          if (runner) {\n            return runner;\n          }\n\n          runner = new $$AnimateRunner();\n          var closeActiveAnimations;\n          var chain = [];\n\n          if (before) {\n            chain.push(function(fn) {\n              closeActiveAnimations = before(fn);\n            });\n          }\n\n          if (chain.length) {\n            chain.push(function(fn) {\n              applyOptions();\n              fn(true);\n            });\n          } else {\n            applyOptions();\n          }\n\n          if (after) {\n            chain.push(function(fn) {\n              closeActiveAnimations = after(fn);\n            });\n          }\n\n          runner.setHost({\n            end: function() {\n              endAnimations();\n            },\n            cancel: function() {\n              endAnimations(true);\n            }\n          });\n\n          $$AnimateRunner.chain(chain, onComplete);\n          return runner;\n\n          function onComplete(success) {\n            close(success);\n            runner.complete(success);\n          }\n\n          function endAnimations(cancelled) {\n            if (!animationClosed) {\n              (closeActiveAnimations || noop)(cancelled);\n              onComplete(cancelled);\n            }\n          }\n        }\n      };\n\n      function executeAnimationFn(fn, element, event, options, onDone) {\n        var args;\n        switch (event) {\n          case 'animate':\n            args = [element, options.from, options.to, onDone];\n            break;\n\n          case 'setClass':\n            args = [element, classesToAdd, classesToRemove, onDone];\n            break;\n\n          case 'addClass':\n            args = [element, classesToAdd, onDone];\n            break;\n\n          case 'removeClass':\n            args = [element, classesToRemove, onDone];\n            break;\n\n          default:\n            args = [element, onDone];\n            break;\n        }\n\n        args.push(options);\n\n        var value = fn.apply(fn, args);\n        if (value) {\n          if (isFunction(value.start)) {\n            value = value.start();\n          }\n\n          if (value instanceof $$AnimateRunner) {\n            value.done(onDone);\n          } else if (isFunction(value)) {\n            // optional onEnd / onCancel callback\n            return value;\n          }\n        }\n\n        return noop;\n      }\n\n      function groupEventedAnimations(element, event, options, animations, fnName) {\n        var operations = [];\n        forEach(animations, function(ani) {\n          var animation = ani[fnName];\n          if (!animation) return;\n\n          // note that all of these animations will run in parallel\n          operations.push(function() {\n            var runner;\n            var endProgressCb;\n\n            var resolved = false;\n            var onAnimationComplete = function(rejected) {\n              if (!resolved) {\n                resolved = true;\n                (endProgressCb || noop)(rejected);\n                runner.complete(!rejected);\n              }\n            };\n\n            runner = new $$AnimateRunner({\n              end: function() {\n                onAnimationComplete();\n              },\n              cancel: function() {\n                onAnimationComplete(true);\n              }\n            });\n\n            endProgressCb = executeAnimationFn(animation, element, event, options, function(result) {\n              var cancelled = result === false;\n              onAnimationComplete(cancelled);\n            });\n\n            return runner;\n          });\n        });\n\n        return operations;\n      }\n\n      function packageAnimations(element, event, options, animations, fnName) {\n        var operations = groupEventedAnimations(element, event, options, animations, fnName);\n        if (operations.length === 0) {\n          var a, b;\n          if (fnName === 'beforeSetClass') {\n            a = groupEventedAnimations(element, 'removeClass', options, animations, 'beforeRemoveClass');\n            b = groupEventedAnimations(element, 'addClass', options, animations, 'beforeAddClass');\n          } else if (fnName === 'setClass') {\n            a = groupEventedAnimations(element, 'removeClass', options, animations, 'removeClass');\n            b = groupEventedAnimations(element, 'addClass', options, animations, 'addClass');\n          }\n\n          if (a) {\n            operations = operations.concat(a);\n          }\n          if (b) {\n            operations = operations.concat(b);\n          }\n        }\n\n        if (operations.length === 0) return;\n\n        // TODO(matsko): add documentation\n        return function startAnimation(callback) {\n          var runners = [];\n          if (operations.length) {\n            forEach(operations, function(animateFn) {\n              runners.push(animateFn());\n            });\n          }\n\n          if (runners.length) {\n            $$AnimateRunner.all(runners, callback);\n          }  else {\n            callback();\n          }\n\n          return function endFn(reject) {\n            forEach(runners, function(runner) {\n              if (reject) {\n                runner.cancel();\n              } else {\n                runner.end();\n              }\n            });\n          };\n        };\n      }\n    };\n\n    function lookupAnimations(classes) {\n      classes = isArray(classes) ? classes : classes.split(' ');\n      var matches = [], flagMap = {};\n      for (var i = 0; i < classes.length; i++) {\n        var klass = classes[i],\n            animationFactory = $animateProvider.$$registeredAnimations[klass];\n        if (animationFactory && !flagMap[klass]) {\n          matches.push($injector.get(animationFactory));\n          flagMap[klass] = true;\n        }\n      }\n      return matches;\n    }\n  }];\n}];\n\nvar $$AnimateJsDriverProvider = ['$$animationProvider', /** @this */ function($$animationProvider) {\n  $$animationProvider.drivers.push('$$animateJsDriver');\n  this.$get = ['$$animateJs', '$$AnimateRunner', function($$animateJs, $$AnimateRunner) {\n    return function initDriverFn(animationDetails) {\n      if (animationDetails.from && animationDetails.to) {\n        var fromAnimation = prepareAnimation(animationDetails.from);\n        var toAnimation = prepareAnimation(animationDetails.to);\n        if (!fromAnimation && !toAnimation) return;\n\n        return {\n          start: function() {\n            var animationRunners = [];\n\n            if (fromAnimation) {\n              animationRunners.push(fromAnimation.start());\n            }\n\n            if (toAnimation) {\n              animationRunners.push(toAnimation.start());\n            }\n\n            $$AnimateRunner.all(animationRunners, done);\n\n            var runner = new $$AnimateRunner({\n              end: endFnFactory(),\n              cancel: endFnFactory()\n            });\n\n            return runner;\n\n            function endFnFactory() {\n              return function() {\n                forEach(animationRunners, function(runner) {\n                  // at this point we cannot cancel animations for groups just yet. 1.5+\n                  runner.end();\n                });\n              };\n            }\n\n            function done(status) {\n              runner.complete(status);\n            }\n          }\n        };\n      } else {\n        return prepareAnimation(animationDetails);\n      }\n    };\n\n    function prepareAnimation(animationDetails) {\n      // TODO(matsko): make sure to check for grouped animations and delegate down to normal animations\n      var element = animationDetails.element;\n      var event = animationDetails.event;\n      var options = animationDetails.options;\n      var classes = animationDetails.classes;\n      return $$animateJs(element, event, classes, options);\n    }\n  }];\n}];\n\nvar NG_ANIMATE_ATTR_NAME = 'data-ng-animate';\nvar NG_ANIMATE_PIN_DATA = '$ngAnimatePin';\nvar $$AnimateQueueProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  var PRE_DIGEST_STATE = 1;\n  var RUNNING_STATE = 2;\n  var ONE_SPACE = ' ';\n\n  var rules = this.rules = {\n    skip: [],\n    cancel: [],\n    join: []\n  };\n\n  function getEventData(options) {\n    return {\n      addClass: options.addClass,\n      removeClass: options.removeClass,\n      from: options.from,\n      to: options.to\n    };\n  }\n\n  function makeTruthyCssClassMap(classString) {\n    if (!classString) {\n      return null;\n    }\n\n    var keys = classString.split(ONE_SPACE);\n    var map = Object.create(null);\n\n    forEach(keys, function(key) {\n      map[key] = true;\n    });\n    return map;\n  }\n\n  function hasMatchingClasses(newClassString, currentClassString) {\n    if (newClassString && currentClassString) {\n      var currentClassMap = makeTruthyCssClassMap(currentClassString);\n      return newClassString.split(ONE_SPACE).some(function(className) {\n        return currentClassMap[className];\n      });\n    }\n  }\n\n  function isAllowed(ruleType, currentAnimation, previousAnimation) {\n    return rules[ruleType].some(function(fn) {\n      return fn(currentAnimation, previousAnimation);\n    });\n  }\n\n  function hasAnimationClasses(animation, and) {\n    var a = (animation.addClass || '').length > 0;\n    var b = (animation.removeClass || '').length > 0;\n    return and ? a && b : a || b;\n  }\n\n  rules.join.push(function(newAnimation, currentAnimation) {\n    // if the new animation is class-based then we can just tack that on\n    return !newAnimation.structural && hasAnimationClasses(newAnimation);\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // there is no need to animate anything if no classes are being added and\n    // there is no structural animation that will be triggered\n    return !newAnimation.structural && !hasAnimationClasses(newAnimation);\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // why should we trigger a new structural animation if the element will\n    // be removed from the DOM anyway?\n    return currentAnimation.event === 'leave' && newAnimation.structural;\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // if there is an ongoing current animation then don't even bother running the class-based animation\n    return currentAnimation.structural && currentAnimation.state === RUNNING_STATE && !newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // there can never be two structural animations running at the same time\n    return currentAnimation.structural && newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // if the previous animation is already running, but the new animation will\n    // be triggered, but the new animation is structural\n    return currentAnimation.state === RUNNING_STATE && newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // cancel the animation if classes added / removed in both animation cancel each other out,\n    // but only if the current animation isn't structural\n\n    if (currentAnimation.structural) return false;\n\n    var nA = newAnimation.addClass;\n    var nR = newAnimation.removeClass;\n    var cA = currentAnimation.addClass;\n    var cR = currentAnimation.removeClass;\n\n    // early detection to save the global CPU shortage :)\n    if ((isUndefined(nA) && isUndefined(nR)) || (isUndefined(cA) && isUndefined(cR))) {\n      return false;\n    }\n\n    return hasMatchingClasses(nA, cR) || hasMatchingClasses(nR, cA);\n  });\n\n  this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$Map',\n               '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', '$$forceReflow',\n               '$$isDocumentHidden',\n       function($$rAF,   $rootScope,   $rootElement,   $document,   $$Map,\n                $$animation,   $$AnimateRunner,   $templateRequest,   $$jqLite,   $$forceReflow,\n                $$isDocumentHidden) {\n\n    var activeAnimationsLookup = new $$Map();\n    var disabledElementsLookup = new $$Map();\n    var animationsEnabled = null;\n\n    function removeFromDisabledElementsLookup(evt) {\n      disabledElementsLookup.delete(evt.target);\n    }\n\n    function postDigestTaskFactory() {\n      var postDigestCalled = false;\n      return function(fn) {\n        // we only issue a call to postDigest before\n        // it has first passed. This prevents any callbacks\n        // from not firing once the animation has completed\n        // since it will be out of the digest cycle.\n        if (postDigestCalled) {\n          fn();\n        } else {\n          $rootScope.$$postDigest(function() {\n            postDigestCalled = true;\n            fn();\n          });\n        }\n      };\n    }\n\n    // Wait until all directive and route-related templates are downloaded and\n    // compiled. The $templateRequest.totalPendingRequests variable keeps track of\n    // all of the remote templates being currently downloaded. If there are no\n    // templates currently downloading then the watcher will still fire anyway.\n    var deregisterWatch = $rootScope.$watch(\n      function() { return $templateRequest.totalPendingRequests === 0; },\n      function(isEmpty) {\n        if (!isEmpty) return;\n        deregisterWatch();\n\n        // Now that all templates have been downloaded, $animate will wait until\n        // the post digest queue is empty before enabling animations. By having two\n        // calls to $postDigest calls we can ensure that the flag is enabled at the\n        // very end of the post digest queue. Since all of the animations in $animate\n        // use $postDigest, it's important that the code below executes at the end.\n        // This basically means that the page is fully downloaded and compiled before\n        // any animations are triggered.\n        $rootScope.$$postDigest(function() {\n          $rootScope.$$postDigest(function() {\n            // we check for null directly in the event that the application already called\n            // .enabled() with whatever arguments that it provided it with\n            if (animationsEnabled === null) {\n              animationsEnabled = true;\n            }\n          });\n        });\n      }\n    );\n\n    var callbackRegistry = Object.create(null);\n\n    // remember that the `customFilter`/`classNameFilter` are set during the\n    // provider/config stage therefore we can optimize here and setup helper functions\n    var customFilter = $animateProvider.customFilter();\n    var classNameFilter = $animateProvider.classNameFilter();\n    var returnTrue = function() { return true; };\n\n    var isAnimatableByFilter = customFilter || returnTrue;\n    var isAnimatableClassName = !classNameFilter ? returnTrue : function(node, options) {\n      var className = [node.getAttribute('class'), options.addClass, options.removeClass].join(' ');\n      return classNameFilter.test(className);\n    };\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function normalizeAnimationDetails(element, animation) {\n      return mergeAnimationDetails(element, animation, {});\n    }\n\n    // IE9-11 has no method \"contains\" in SVG element and in Node.prototype. Bug #10259.\n    var contains = window.Node.prototype.contains || /** @this */ function(arg) {\n      // eslint-disable-next-line no-bitwise\n      return this === arg || !!(this.compareDocumentPosition(arg) & 16);\n    };\n\n    function findCallbacks(targetParentNode, targetNode, event) {\n      var matches = [];\n      var entries = callbackRegistry[event];\n      if (entries) {\n        forEach(entries, function(entry) {\n          if (contains.call(entry.node, targetNode)) {\n            matches.push(entry.callback);\n          } else if (event === 'leave' && contains.call(entry.node, targetParentNode)) {\n            matches.push(entry.callback);\n          }\n        });\n      }\n\n      return matches;\n    }\n\n    function filterFromRegistry(list, matchContainer, matchCallback) {\n      var containerNode = extractElementNode(matchContainer);\n      return list.filter(function(entry) {\n        var isMatch = entry.node === containerNode &&\n                        (!matchCallback || entry.callback === matchCallback);\n        return !isMatch;\n      });\n    }\n\n    function cleanupEventListeners(phase, node) {\n      if (phase === 'close' && !node.parentNode) {\n        // If the element is not attached to a parentNode, it has been removed by\n        // the domOperation, and we can safely remove the event callbacks\n        $animate.off(node);\n      }\n    }\n\n    var $animate = {\n      on: function(event, container, callback) {\n        var node = extractElementNode(container);\n        callbackRegistry[event] = callbackRegistry[event] || [];\n        callbackRegistry[event].push({\n          node: node,\n          callback: callback\n        });\n\n        // Remove the callback when the element is removed from the DOM\n        jqLite(container).on('$destroy', function() {\n          var animationDetails = activeAnimationsLookup.get(node);\n\n          if (!animationDetails) {\n            // If there's an animation ongoing, the callback calling code will remove\n            // the event listeners. If we'd remove here, the callbacks would be removed\n            // before the animation ends\n            $animate.off(event, container, callback);\n          }\n        });\n      },\n\n      off: function(event, container, callback) {\n        if (arguments.length === 1 && !isString(arguments[0])) {\n          container = arguments[0];\n          for (var eventType in callbackRegistry) {\n            callbackRegistry[eventType] = filterFromRegistry(callbackRegistry[eventType], container);\n          }\n\n          return;\n        }\n\n        var entries = callbackRegistry[event];\n        if (!entries) return;\n\n        callbackRegistry[event] = arguments.length === 1\n            ? null\n            : filterFromRegistry(entries, container, callback);\n      },\n\n      pin: function(element, parentElement) {\n        assertArg(isElement(element), 'element', 'not an element');\n        assertArg(isElement(parentElement), 'parentElement', 'not an element');\n        element.data(NG_ANIMATE_PIN_DATA, parentElement);\n      },\n\n      push: function(element, event, options, domOperation) {\n        options = options || {};\n        options.domOperation = domOperation;\n        return queueAnimation(element, event, options);\n      },\n\n      // this method has four signatures:\n      //  () - global getter\n      //  (bool) - global setter\n      //  (element) - element getter\n      //  (element, bool) - element setter<F37>\n      enabled: function(element, bool) {\n        var argCount = arguments.length;\n\n        if (argCount === 0) {\n          // () - Global getter\n          bool = !!animationsEnabled;\n        } else {\n          var hasElement = isElement(element);\n\n          if (!hasElement) {\n            // (bool) - Global setter\n            bool = animationsEnabled = !!element;\n          } else {\n            var node = getDomNode(element);\n\n            if (argCount === 1) {\n              // (element) - Element getter\n              bool = !disabledElementsLookup.get(node);\n            } else {\n              // (element, bool) - Element setter\n              if (!disabledElementsLookup.has(node)) {\n                // The element is added to the map for the first time.\n                // Create a listener to remove it on `$destroy` (to avoid memory leak).\n                jqLite(element).on('$destroy', removeFromDisabledElementsLookup);\n              }\n              disabledElementsLookup.set(node, !bool);\n            }\n          }\n        }\n\n        return bool;\n      }\n    };\n\n    return $animate;\n\n    function queueAnimation(originalElement, event, initialOptions) {\n      // we always make a copy of the options since\n      // there should never be any side effects on\n      // the input data when running `$animateCss`.\n      var options = copy(initialOptions);\n\n      var element = stripCommentsFromElement(originalElement);\n      var node = getDomNode(element);\n      var parentNode = node && node.parentNode;\n\n      options = prepareAnimationOptions(options);\n\n      // we create a fake runner with a working promise.\n      // These methods will become available after the digest has passed\n      var runner = new $$AnimateRunner();\n\n      // this is used to trigger callbacks in postDigest mode\n      var runInNextPostDigestOrNow = postDigestTaskFactory();\n\n      if (isArray(options.addClass)) {\n        options.addClass = options.addClass.join(' ');\n      }\n\n      if (options.addClass && !isString(options.addClass)) {\n        options.addClass = null;\n      }\n\n      if (isArray(options.removeClass)) {\n        options.removeClass = options.removeClass.join(' ');\n      }\n\n      if (options.removeClass && !isString(options.removeClass)) {\n        options.removeClass = null;\n      }\n\n      if (options.from && !isObject(options.from)) {\n        options.from = null;\n      }\n\n      if (options.to && !isObject(options.to)) {\n        options.to = null;\n      }\n\n      // If animations are hard-disabled for the whole application there is no need to continue.\n      // There are also situations where a directive issues an animation for a jqLite wrapper that\n      // contains only comment nodes. In this case, there is no way we can perform an animation.\n      if (!animationsEnabled ||\n          !node ||\n          !isAnimatableByFilter(node, event, initialOptions) ||\n          !isAnimatableClassName(node, options)) {\n        close();\n        return runner;\n      }\n\n      var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;\n\n      var documentHidden = $$isDocumentHidden();\n\n      // This is a hard disable of all animations the element itself, therefore  there is no need to\n      // continue further past this point if not enabled\n      // Animations are also disabled if the document is currently hidden (page is not visible\n      // to the user), because browsers slow down or do not flush calls to requestAnimationFrame\n      var skipAnimations = documentHidden || disabledElementsLookup.get(node);\n      var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {};\n      var hasExistingAnimation = !!existingAnimation.state;\n\n      // there is no point in traversing the same collection of parent ancestors if a followup\n      // animation will be run on the same element that already did all that checking work\n      if (!skipAnimations && (!hasExistingAnimation || existingAnimation.state !== PRE_DIGEST_STATE)) {\n        skipAnimations = !areAnimationsAllowed(node, parentNode, event);\n      }\n\n      if (skipAnimations) {\n        // Callbacks should fire even if the document is hidden (regression fix for issue #14120)\n        if (documentHidden) notifyProgress(runner, event, 'start', getEventData(options));\n        close();\n        if (documentHidden) notifyProgress(runner, event, 'close', getEventData(options));\n        return runner;\n      }\n\n      if (isStructural) {\n        closeChildAnimations(node);\n      }\n\n      var newAnimation = {\n        structural: isStructural,\n        element: element,\n        event: event,\n        addClass: options.addClass,\n        removeClass: options.removeClass,\n        close: close,\n        options: options,\n        runner: runner\n      };\n\n      if (hasExistingAnimation) {\n        var skipAnimationFlag = isAllowed('skip', newAnimation, existingAnimation);\n        if (skipAnimationFlag) {\n          if (existingAnimation.state === RUNNING_STATE) {\n            close();\n            return runner;\n          } else {\n            mergeAnimationDetails(element, existingAnimation, newAnimation);\n            return existingAnimation.runner;\n          }\n        }\n        var cancelAnimationFlag = isAllowed('cancel', newAnimation, existingAnimation);\n        if (cancelAnimationFlag) {\n          if (existingAnimation.state === RUNNING_STATE) {\n            // this will end the animation right away and it is safe\n            // to do so since the animation is already running and the\n            // runner callback code will run in async\n            existingAnimation.runner.end();\n          } else if (existingAnimation.structural) {\n            // this means that the animation is queued into a digest, but\n            // hasn't started yet. Therefore it is safe to run the close\n            // method which will call the runner methods in async.\n            existingAnimation.close();\n          } else {\n            // this will merge the new animation options into existing animation options\n            mergeAnimationDetails(element, existingAnimation, newAnimation);\n\n            return existingAnimation.runner;\n          }\n        } else {\n          // a joined animation means that this animation will take over the existing one\n          // so an example would involve a leave animation taking over an enter. Then when\n          // the postDigest kicks in the enter will be ignored.\n          var joinAnimationFlag = isAllowed('join', newAnimation, existingAnimation);\n          if (joinAnimationFlag) {\n            if (existingAnimation.state === RUNNING_STATE) {\n              normalizeAnimationDetails(element, newAnimation);\n            } else {\n              applyGeneratedPreparationClasses($$jqLite, element, isStructural ? event : null, options);\n\n              event = newAnimation.event = existingAnimation.event;\n              options = mergeAnimationDetails(element, existingAnimation, newAnimation);\n\n              //we return the same runner since only the option values of this animation will\n              //be fed into the `existingAnimation`.\n              return existingAnimation.runner;\n            }\n          }\n        }\n      } else {\n        // normalization in this case means that it removes redundant CSS classes that\n        // already exist (addClass) or do not exist (removeClass) on the element\n        normalizeAnimationDetails(element, newAnimation);\n      }\n\n      // when the options are merged and cleaned up we may end up not having to do\n      // an animation at all, therefore we should check this before issuing a post\n      // digest callback. Structural animations will always run no matter what.\n      var isValidAnimation = newAnimation.structural;\n      if (!isValidAnimation) {\n        // animate (from/to) can be quickly checked first, otherwise we check if any classes are present\n        isValidAnimation = (newAnimation.event === 'animate' && Object.keys(newAnimation.options.to || {}).length > 0)\n                            || hasAnimationClasses(newAnimation);\n      }\n\n      if (!isValidAnimation) {\n        close();\n        clearElementAnimationState(node);\n        return runner;\n      }\n\n      // the counter keeps track of cancelled animations\n      var counter = (existingAnimation.counter || 0) + 1;\n      newAnimation.counter = counter;\n\n      markElementAnimationState(node, PRE_DIGEST_STATE, newAnimation);\n\n      $rootScope.$$postDigest(function() {\n        // It is possible that the DOM nodes inside `originalElement` have been replaced. This can\n        // happen if the animated element is a transcluded clone and also has a `templateUrl`\n        // directive on it. Therefore, we must recreate `element` in order to interact with the\n        // actual DOM nodes.\n        // Note: We still need to use the old `node` for certain things, such as looking up in\n        //       HashMaps where it was used as the key.\n\n        element = stripCommentsFromElement(originalElement);\n\n        var animationDetails = activeAnimationsLookup.get(node);\n        var animationCancelled = !animationDetails;\n        animationDetails = animationDetails || {};\n\n        // if addClass/removeClass is called before something like enter then the\n        // registered parent element may not be present. The code below will ensure\n        // that a final value for parent element is obtained\n        var parentElement = element.parent() || [];\n\n        // animate/structural/class-based animations all have requirements. Otherwise there\n        // is no point in performing an animation. The parent node must also be set.\n        var isValidAnimation = parentElement.length > 0\n                                && (animationDetails.event === 'animate'\n                                    || animationDetails.structural\n                                    || hasAnimationClasses(animationDetails));\n\n        // this means that the previous animation was cancelled\n        // even if the follow-up animation is the same event\n        if (animationCancelled || animationDetails.counter !== counter || !isValidAnimation) {\n          // if another animation did not take over then we need\n          // to make sure that the domOperation and options are\n          // handled accordingly\n          if (animationCancelled) {\n            applyAnimationClasses(element, options);\n            applyAnimationStyles(element, options);\n          }\n\n          // if the event changed from something like enter to leave then we do\n          // it, otherwise if it's the same then the end result will be the same too\n          if (animationCancelled || (isStructural && animationDetails.event !== event)) {\n            options.domOperation();\n            runner.end();\n          }\n\n          // in the event that the element animation was not cancelled or a follow-up animation\n          // isn't allowed to animate from here then we need to clear the state of the element\n          // so that any future animations won't read the expired animation data.\n          if (!isValidAnimation) {\n            clearElementAnimationState(node);\n          }\n\n          return;\n        }\n\n        // this combined multiple class to addClass / removeClass into a setClass event\n        // so long as a structural event did not take over the animation\n        event = !animationDetails.structural && hasAnimationClasses(animationDetails, true)\n            ? 'setClass'\n            : animationDetails.event;\n\n        markElementAnimationState(node, RUNNING_STATE);\n        var realRunner = $$animation(element, event, animationDetails.options);\n\n        // this will update the runner's flow-control events based on\n        // the `realRunner` object.\n        runner.setHost(realRunner);\n        notifyProgress(runner, event, 'start', getEventData(options));\n\n        realRunner.done(function(status) {\n          close(!status);\n          var animationDetails = activeAnimationsLookup.get(node);\n          if (animationDetails && animationDetails.counter === counter) {\n            clearElementAnimationState(node);\n          }\n          notifyProgress(runner, event, 'close', getEventData(options));\n        });\n      });\n\n      return runner;\n\n      function notifyProgress(runner, event, phase, data) {\n        runInNextPostDigestOrNow(function() {\n          var callbacks = findCallbacks(parentNode, node, event);\n          if (callbacks.length) {\n            // do not optimize this call here to RAF because\n            // we don't know how heavy the callback code here will\n            // be and if this code is buffered then this can\n            // lead to a performance regression.\n            $$rAF(function() {\n              forEach(callbacks, function(callback) {\n                callback(element, phase, data);\n              });\n              cleanupEventListeners(phase, node);\n            });\n          } else {\n            cleanupEventListeners(phase, node);\n          }\n        });\n        runner.progress(event, phase, data);\n      }\n\n      function close(reject) {\n        clearGeneratedClasses(element, options);\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n        options.domOperation();\n        runner.complete(!reject);\n      }\n    }\n\n    function closeChildAnimations(node) {\n      var children = node.querySelectorAll('[' + NG_ANIMATE_ATTR_NAME + ']');\n      forEach(children, function(child) {\n        var state = parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME), 10);\n        var animationDetails = activeAnimationsLookup.get(child);\n        if (animationDetails) {\n          switch (state) {\n            case RUNNING_STATE:\n              animationDetails.runner.end();\n              /* falls through */\n            case PRE_DIGEST_STATE:\n              activeAnimationsLookup.delete(child);\n              break;\n          }\n        }\n      });\n    }\n\n    function clearElementAnimationState(node) {\n      node.removeAttribute(NG_ANIMATE_ATTR_NAME);\n      activeAnimationsLookup.delete(node);\n    }\n\n    /**\n     * This fn returns false if any of the following is true:\n     * a) animations on any parent element are disabled, and animations on the element aren't explicitly allowed\n     * b) a parent element has an ongoing structural animation, and animateChildren is false\n     * c) the element is not a child of the body\n     * d) the element is not a child of the $rootElement\n     */\n    function areAnimationsAllowed(node, parentNode, event) {\n      var bodyNode = $document[0].body;\n      var rootNode = getDomNode($rootElement);\n\n      var bodyNodeDetected = (node === bodyNode) || node.nodeName === 'HTML';\n      var rootNodeDetected = (node === rootNode);\n      var parentAnimationDetected = false;\n      var elementDisabled = disabledElementsLookup.get(node);\n      var animateChildren;\n\n      var parentHost = jqLite.data(node, NG_ANIMATE_PIN_DATA);\n      if (parentHost) {\n        parentNode = getDomNode(parentHost);\n      }\n\n      while (parentNode) {\n        if (!rootNodeDetected) {\n          // AngularJS doesn't want to attempt to animate elements outside of the application\n          // therefore we need to ensure that the rootElement is an ancestor of the current element\n          rootNodeDetected = (parentNode === rootNode);\n        }\n\n        if (parentNode.nodeType !== ELEMENT_NODE) {\n          // no point in inspecting the #document element\n          break;\n        }\n\n        var details = activeAnimationsLookup.get(parentNode) || {};\n        // either an enter, leave or move animation will commence\n        // therefore we can't allow any animations to take place\n        // but if a parent animation is class-based then that's ok\n        if (!parentAnimationDetected) {\n          var parentNodeDisabled = disabledElementsLookup.get(parentNode);\n\n          if (parentNodeDisabled === true && elementDisabled !== false) {\n            // disable animations if the user hasn't explicitly enabled animations on the\n            // current element\n            elementDisabled = true;\n            // element is disabled via parent element, no need to check anything else\n            break;\n          } else if (parentNodeDisabled === false) {\n            elementDisabled = false;\n          }\n          parentAnimationDetected = details.structural;\n        }\n\n        if (isUndefined(animateChildren) || animateChildren === true) {\n          var value = jqLite.data(parentNode, NG_ANIMATE_CHILDREN_DATA);\n          if (isDefined(value)) {\n            animateChildren = value;\n          }\n        }\n\n        // there is no need to continue traversing at this point\n        if (parentAnimationDetected && animateChildren === false) break;\n\n        if (!bodyNodeDetected) {\n          // we also need to ensure that the element is or will be a part of the body element\n          // otherwise it is pointless to even issue an animation to be rendered\n          bodyNodeDetected = (parentNode === bodyNode);\n        }\n\n        if (bodyNodeDetected && rootNodeDetected) {\n          // If both body and root have been found, any other checks are pointless,\n          // as no animation data should live outside the application\n          break;\n        }\n\n        if (!rootNodeDetected) {\n          // If `rootNode` is not detected, check if `parentNode` is pinned to another element\n          parentHost = jqLite.data(parentNode, NG_ANIMATE_PIN_DATA);\n          if (parentHost) {\n            // The pin target element becomes the next parent element\n            parentNode = getDomNode(parentHost);\n            continue;\n          }\n        }\n\n        parentNode = parentNode.parentNode;\n      }\n\n      var allowAnimation = (!parentAnimationDetected || animateChildren) && elementDisabled !== true;\n      return allowAnimation && rootNodeDetected && bodyNodeDetected;\n    }\n\n    function markElementAnimationState(node, state, details) {\n      details = details || {};\n      details.state = state;\n\n      node.setAttribute(NG_ANIMATE_ATTR_NAME, state);\n\n      var oldValue = activeAnimationsLookup.get(node);\n      var newValue = oldValue\n          ? extend(oldValue, details)\n          : details;\n      activeAnimationsLookup.set(node, newValue);\n    }\n  }];\n}];\n\n/** @this */\nvar $$AnimateCacheProvider = function() {\n\n  var KEY = '$$ngAnimateParentKey';\n  var parentCounter = 0;\n  var cache = Object.create(null);\n\n  this.$get = [function() {\n    return {\n      cacheKey: function(node, method, addClass, removeClass) {\n        var parentNode = node.parentNode;\n        var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter);\n        var parts = [parentID, method, node.getAttribute('class')];\n        if (addClass) {\n          parts.push(addClass);\n        }\n        if (removeClass) {\n          parts.push(removeClass);\n        }\n        return parts.join(' ');\n      },\n\n      containsCachedAnimationWithoutDuration: function(key) {\n        var entry = cache[key];\n\n        // nothing cached, so go ahead and animate\n        // otherwise it should be a valid animation\n        return (entry && !entry.isValid) || false;\n      },\n\n      flush: function() {\n        cache = Object.create(null);\n      },\n\n      count: function(key) {\n        var entry = cache[key];\n        return entry ? entry.total : 0;\n      },\n\n      get: function(key) {\n        var entry = cache[key];\n        return entry && entry.value;\n      },\n\n      put: function(key, value, isValid) {\n        if (!cache[key]) {\n          cache[key] = { total: 1, value: value, isValid: isValid };\n        } else {\n          cache[key].total++;\n          cache[key].value = value;\n        }\n      }\n    };\n  }];\n};\n\n/* exported $$AnimationProvider */\n\nvar $$AnimationProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  var NG_ANIMATE_REF_ATTR = 'ng-animate-ref';\n\n  var drivers = this.drivers = [];\n\n  var RUNNER_STORAGE_KEY = '$$animationRunner';\n  var PREPARE_CLASSES_KEY = '$$animatePrepareClasses';\n\n  function setRunner(element, runner) {\n    element.data(RUNNER_STORAGE_KEY, runner);\n  }\n\n  function removeRunner(element) {\n    element.removeData(RUNNER_STORAGE_KEY);\n  }\n\n  function getRunner(element) {\n    return element.data(RUNNER_STORAGE_KEY);\n  }\n\n  this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$Map', '$$rAFScheduler', '$$animateCache',\n       function($$jqLite,   $rootScope,   $injector,   $$AnimateRunner,   $$Map,   $$rAFScheduler, $$animateCache) {\n\n    var animationQueue = [];\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function sortAnimations(animations) {\n      var tree = { children: [] };\n      var i, lookup = new $$Map();\n\n      // this is done first beforehand so that the map\n      // is filled with a list of the elements that will be animated\n      for (i = 0; i < animations.length; i++) {\n        var animation = animations[i];\n        lookup.set(animation.domNode, animations[i] = {\n          domNode: animation.domNode,\n          element: animation.element,\n          fn: animation.fn,\n          children: []\n        });\n      }\n\n      for (i = 0; i < animations.length; i++) {\n        processNode(animations[i]);\n      }\n\n      return flatten(tree);\n\n      function processNode(entry) {\n        if (entry.processed) return entry;\n        entry.processed = true;\n\n        var elementNode = entry.domNode;\n        var parentNode = elementNode.parentNode;\n        lookup.set(elementNode, entry);\n\n        var parentEntry;\n        while (parentNode) {\n          parentEntry = lookup.get(parentNode);\n          if (parentEntry) {\n            if (!parentEntry.processed) {\n              parentEntry = processNode(parentEntry);\n            }\n            break;\n          }\n          parentNode = parentNode.parentNode;\n        }\n\n        (parentEntry || tree).children.push(entry);\n        return entry;\n      }\n\n      function flatten(tree) {\n        var result = [];\n        var queue = [];\n        var i;\n\n        for (i = 0; i < tree.children.length; i++) {\n          queue.push(tree.children[i]);\n        }\n\n        var remainingLevelEntries = queue.length;\n        var nextLevelEntries = 0;\n        var row = [];\n\n        for (i = 0; i < queue.length; i++) {\n          var entry = queue[i];\n          if (remainingLevelEntries <= 0) {\n            remainingLevelEntries = nextLevelEntries;\n            nextLevelEntries = 0;\n            result.push(row);\n            row = [];\n          }\n          row.push(entry);\n          entry.children.forEach(function(childEntry) {\n            nextLevelEntries++;\n            queue.push(childEntry);\n          });\n          remainingLevelEntries--;\n        }\n\n        if (row.length) {\n          result.push(row);\n        }\n\n        return result;\n      }\n    }\n\n    // TODO(matsko): document the signature in a better way\n    return function(element, event, options) {\n      options = prepareAnimationOptions(options);\n      var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;\n\n      // there is no animation at the current moment, however\n      // these runner methods will get later updated with the\n      // methods leading into the driver's end/cancel methods\n      // for now they just stop the animation from starting\n      var runner = new $$AnimateRunner({\n        end: function() { close(); },\n        cancel: function() { close(true); }\n      });\n\n      if (!drivers.length) {\n        close();\n        return runner;\n      }\n\n      var classes = mergeClasses(element.attr('class'), mergeClasses(options.addClass, options.removeClass));\n      var tempClasses = options.tempClasses;\n      if (tempClasses) {\n        classes += ' ' + tempClasses;\n        options.tempClasses = null;\n      }\n\n      if (isStructural) {\n        element.data(PREPARE_CLASSES_KEY, 'ng-' + event + PREPARE_CLASS_SUFFIX);\n      }\n\n      setRunner(element, runner);\n\n      animationQueue.push({\n        // this data is used by the postDigest code and passed into\n        // the driver step function\n        element: element,\n        classes: classes,\n        event: event,\n        structural: isStructural,\n        options: options,\n        beforeStart: beforeStart,\n        close: close\n      });\n\n      element.on('$destroy', handleDestroyedElement);\n\n      // we only want there to be one function called within the post digest\n      // block. This way we can group animations for all the animations that\n      // were apart of the same postDigest flush call.\n      if (animationQueue.length > 1) return runner;\n\n      $rootScope.$$postDigest(function() {\n        var animations = [];\n        forEach(animationQueue, function(entry) {\n          // the element was destroyed early on which removed the runner\n          // form its storage. This means we can't animate this element\n          // at all and it already has been closed due to destruction.\n          if (getRunner(entry.element)) {\n            animations.push(entry);\n          } else {\n            entry.close();\n          }\n        });\n\n        // now any future animations will be in another postDigest\n        animationQueue.length = 0;\n\n        var groupedAnimations = groupAnimations(animations);\n        var toBeSortedAnimations = [];\n\n        forEach(groupedAnimations, function(animationEntry) {\n          var element = animationEntry.from ? animationEntry.from.element : animationEntry.element;\n          var extraClasses = options.addClass;\n\n          extraClasses = (extraClasses ? (extraClasses + ' ') : '') + NG_ANIMATE_CLASSNAME;\n          var cacheKey = $$animateCache.cacheKey(element[0], animationEntry.event, extraClasses, options.removeClass);\n\n          toBeSortedAnimations.push({\n            element: element,\n            domNode: getDomNode(element),\n            fn: function triggerAnimationStart() {\n              var startAnimationFn, closeFn = animationEntry.close;\n\n              // in the event that we've cached the animation status for this element\n              // and it's in fact an invalid animation (something that has duration = 0)\n              // then we should skip all the heavy work from here on\n              if ($$animateCache.containsCachedAnimationWithoutDuration(cacheKey)) {\n                closeFn();\n                return;\n              }\n\n              // it's important that we apply the `ng-animate` CSS class and the\n              // temporary classes before we do any driver invoking since these\n              // CSS classes may be required for proper CSS detection.\n              animationEntry.beforeStart();\n\n              // in the event that the element was removed before the digest runs or\n              // during the RAF sequencing then we should not trigger the animation.\n              var targetElement = animationEntry.anchors\n                  ? (animationEntry.from.element || animationEntry.to.element)\n                  : animationEntry.element;\n\n              if (getRunner(targetElement)) {\n                var operation = invokeFirstDriver(animationEntry);\n                if (operation) {\n                  startAnimationFn = operation.start;\n                }\n              }\n\n              if (!startAnimationFn) {\n                closeFn();\n              } else {\n                var animationRunner = startAnimationFn();\n                animationRunner.done(function(status) {\n                  closeFn(!status);\n                });\n                updateAnimationRunners(animationEntry, animationRunner);\n              }\n            }\n          });\n        });\n\n        // we need to sort each of the animations in order of parent to child\n        // relationships. This ensures that the child classes are applied at the\n        // right time.\n        var finalAnimations = sortAnimations(toBeSortedAnimations);\n        for (var i = 0; i < finalAnimations.length; i++) {\n          var innerArray = finalAnimations[i];\n          for (var j = 0; j < innerArray.length; j++) {\n            var entry = innerArray[j];\n            var element = entry.element;\n\n            // the RAFScheduler code only uses functions\n            finalAnimations[i][j] = entry.fn;\n\n            // the first row of elements shouldn't have a prepare-class added to them\n            // since the elements are at the top of the animation hierarchy and they\n            // will be applied without a RAF having to pass...\n            if (i === 0) {\n              element.removeData(PREPARE_CLASSES_KEY);\n              continue;\n            }\n\n            var prepareClassName = element.data(PREPARE_CLASSES_KEY);\n            if (prepareClassName) {\n              $$jqLite.addClass(element, prepareClassName);\n            }\n          }\n        }\n\n        $$rAFScheduler(finalAnimations);\n      });\n\n      return runner;\n\n      // TODO(matsko): change to reference nodes\n      function getAnchorNodes(node) {\n        var SELECTOR = '[' + NG_ANIMATE_REF_ATTR + ']';\n        var items = node.hasAttribute(NG_ANIMATE_REF_ATTR)\n              ? [node]\n              : node.querySelectorAll(SELECTOR);\n        var anchors = [];\n        forEach(items, function(node) {\n          var attr = node.getAttribute(NG_ANIMATE_REF_ATTR);\n          if (attr && attr.length) {\n            anchors.push(node);\n          }\n        });\n        return anchors;\n      }\n\n      function groupAnimations(animations) {\n        var preparedAnimations = [];\n        var refLookup = {};\n        forEach(animations, function(animation, index) {\n          var element = animation.element;\n          var node = getDomNode(element);\n          var event = animation.event;\n          var enterOrMove = ['enter', 'move'].indexOf(event) >= 0;\n          var anchorNodes = animation.structural ? getAnchorNodes(node) : [];\n\n          if (anchorNodes.length) {\n            var direction = enterOrMove ? 'to' : 'from';\n\n            forEach(anchorNodes, function(anchor) {\n              var key = anchor.getAttribute(NG_ANIMATE_REF_ATTR);\n              refLookup[key] = refLookup[key] || {};\n              refLookup[key][direction] = {\n                animationID: index,\n                element: jqLite(anchor)\n              };\n            });\n          } else {\n            preparedAnimations.push(animation);\n          }\n        });\n\n        var usedIndicesLookup = {};\n        var anchorGroups = {};\n        forEach(refLookup, function(operations, key) {\n          var from = operations.from;\n          var to = operations.to;\n\n          if (!from || !to) {\n            // only one of these is set therefore we can't have an\n            // anchor animation since all three pieces are required\n            var index = from ? from.animationID : to.animationID;\n            var indexKey = index.toString();\n            if (!usedIndicesLookup[indexKey]) {\n              usedIndicesLookup[indexKey] = true;\n              preparedAnimations.push(animations[index]);\n            }\n            return;\n          }\n\n          var fromAnimation = animations[from.animationID];\n          var toAnimation = animations[to.animationID];\n          var lookupKey = from.animationID.toString();\n          if (!anchorGroups[lookupKey]) {\n            var group = anchorGroups[lookupKey] = {\n              structural: true,\n              beforeStart: function() {\n                fromAnimation.beforeStart();\n                toAnimation.beforeStart();\n              },\n              close: function() {\n                fromAnimation.close();\n                toAnimation.close();\n              },\n              classes: cssClassesIntersection(fromAnimation.classes, toAnimation.classes),\n              from: fromAnimation,\n              to: toAnimation,\n              anchors: [] // TODO(matsko): change to reference nodes\n            };\n\n            // the anchor animations require that the from and to elements both have at least\n            // one shared CSS class which effectively marries the two elements together to use\n            // the same animation driver and to properly sequence the anchor animation.\n            if (group.classes.length) {\n              preparedAnimations.push(group);\n            } else {\n              preparedAnimations.push(fromAnimation);\n              preparedAnimations.push(toAnimation);\n            }\n          }\n\n          anchorGroups[lookupKey].anchors.push({\n            'out': from.element, 'in': to.element\n          });\n        });\n\n        return preparedAnimations;\n      }\n\n      function cssClassesIntersection(a,b) {\n        a = a.split(' ');\n        b = b.split(' ');\n        var matches = [];\n\n        for (var i = 0; i < a.length; i++) {\n          var aa = a[i];\n          if (aa.substring(0,3) === 'ng-') continue;\n\n          for (var j = 0; j < b.length; j++) {\n            if (aa === b[j]) {\n              matches.push(aa);\n              break;\n            }\n          }\n        }\n\n        return matches.join(' ');\n      }\n\n      function invokeFirstDriver(animationDetails) {\n        // we loop in reverse order since the more general drivers (like CSS and JS)\n        // may attempt more elements, but custom drivers are more particular\n        for (var i = drivers.length - 1; i >= 0; i--) {\n          var driverName = drivers[i];\n          var factory = $injector.get(driverName);\n          var driver = factory(animationDetails);\n          if (driver) {\n            return driver;\n          }\n        }\n      }\n\n      function beforeStart() {\n        tempClasses = (tempClasses ? (tempClasses + ' ') : '') + NG_ANIMATE_CLASSNAME;\n        $$jqLite.addClass(element, tempClasses);\n\n        var prepareClassName = element.data(PREPARE_CLASSES_KEY);\n        if (prepareClassName) {\n          $$jqLite.removeClass(element, prepareClassName);\n          prepareClassName = null;\n        }\n      }\n\n      function updateAnimationRunners(animation, newRunner) {\n        if (animation.from && animation.to) {\n          update(animation.from.element);\n          update(animation.to.element);\n        } else {\n          update(animation.element);\n        }\n\n        function update(element) {\n          var runner = getRunner(element);\n          if (runner) runner.setHost(newRunner);\n        }\n      }\n\n      function handleDestroyedElement() {\n        var runner = getRunner(element);\n        if (runner && (event !== 'leave' || !options.$$domOperationFired)) {\n          runner.end();\n        }\n      }\n\n      function close(rejected) {\n        element.off('$destroy', handleDestroyedElement);\n        removeRunner(element);\n\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n        options.domOperation();\n\n        if (tempClasses) {\n          $$jqLite.removeClass(element, tempClasses);\n        }\n\n        runner.complete(!rejected);\n      }\n    };\n  }];\n}];\n\n/**\n * @ngdoc directive\n * @name ngAnimateSwap\n * @restrict A\n * @scope\n *\n * @description\n *\n * ngAnimateSwap is a animation-oriented directive that allows for the container to\n * be removed and entered in whenever the associated expression changes. A\n * common usecase for this directive is a rotating banner or slider component which\n * contains one image being present at a time. When the active image changes\n * then the old image will perform a `leave` animation and the new element\n * will be inserted via an `enter` animation.\n *\n * @animations\n * | Animation                        | Occurs                               |\n * |----------------------------------|--------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the new element is inserted to the DOM  |\n * | {@link ng.$animate#leave leave}  | when the old element is removed from the DOM |\n *\n * @example\n * <example name=\"ngAnimateSwap-directive\" module=\"ngAnimateSwapExample\"\n *          deps=\"angular-animate.js\"\n *          animations=\"true\" fixBase=\"true\">\n *   <file name=\"index.html\">\n *     <div class=\"container\" ng-controller=\"AppCtrl\">\n *       <div ng-animate-swap=\"number\" class=\"cell swap-animation\" ng-class=\"colorClass(number)\">\n *         {{ number }}\n *       </div>\n *     </div>\n *   </file>\n *   <file name=\"script.js\">\n *     angular.module('ngAnimateSwapExample', ['ngAnimate'])\n *       .controller('AppCtrl', ['$scope', '$interval', function($scope, $interval) {\n *         $scope.number = 0;\n *         $interval(function() {\n *           $scope.number++;\n *         }, 1000);\n *\n *         var colors = ['red','blue','green','yellow','orange'];\n *         $scope.colorClass = function(number) {\n *           return colors[number % colors.length];\n *         };\n *       }]);\n *   </file>\n *  <file name=\"animations.css\">\n *  .container {\n *    height:250px;\n *    width:250px;\n *    position:relative;\n *    overflow:hidden;\n *    border:2px solid black;\n *  }\n *  .container .cell {\n *    font-size:150px;\n *    text-align:center;\n *    line-height:250px;\n *    position:absolute;\n *    top:0;\n *    left:0;\n *    right:0;\n *    border-bottom:2px solid black;\n *  }\n *  .swap-animation.ng-enter, .swap-animation.ng-leave {\n *    transition:0.5s linear all;\n *  }\n *  .swap-animation.ng-enter {\n *    top:-250px;\n *  }\n *  .swap-animation.ng-enter-active {\n *    top:0px;\n *  }\n *  .swap-animation.ng-leave {\n *    top:0px;\n *  }\n *  .swap-animation.ng-leave-active {\n *    top:250px;\n *  }\n *  .red { background:red; }\n *  .green { background:green; }\n *  .blue { background:blue; }\n *  .yellow { background:yellow; }\n *  .orange { background:orange; }\n *  </file>\n * </example>\n */\nvar ngAnimateSwapDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    transclude: 'element',\n    terminal: true,\n    priority: 550, // We use 550 here to ensure that the directive is caught before others,\n                   // but after `ngIf` (at priority 600).\n    link: function(scope, $element, attrs, ctrl, $transclude) {\n      var previousElement, previousScope;\n      scope.$watchCollection(attrs.ngAnimateSwap || attrs['for'], function(value) {\n        if (previousElement) {\n          $animate.leave(previousElement);\n        }\n        if (previousScope) {\n          previousScope.$destroy();\n          previousScope = null;\n        }\n        if (value || value === 0) {\n          $transclude(function(clone, childScope) {\n            previousElement = clone;\n            previousScope = childScope;\n            $animate.enter(clone, null, $element);\n          });\n        }\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc module\n * @name ngAnimate\n * @description\n *\n * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via\n * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` the animation hooks are enabled for an AngularJS app.\n *\n * ## Usage\n * Simply put, there are two ways to make use of animations when ngAnimate is used: by using **CSS** and **JavaScript**. The former works purely based\n * using CSS (by using matching CSS selectors/styles) and the latter triggers animations that are registered via `module.animation()`. For\n * both CSS and JS animations the sole requirement is to have a matching `CSS class` that exists both in the registered animation and within\n * the HTML element that the animation will be triggered on.\n *\n * ## Directive Support\n * The following directives are \"animation aware\":\n *\n * | Directive                                                                     | Supported Animations                                                      |\n * |-------------------------------------------------------------------------------|---------------------------------------------------------------------------|\n * | {@link ng.directive:form#animations form / ngForm}                            | add and remove ({@link ng.directive:form#css-classes various classes})    |\n * | {@link ngAnimate.directive:ngAnimateSwap#animations ngAnimateSwap}            | enter and leave                                                           |\n * | {@link ng.directive:ngClass#animations ngClass / {{class&#125;&#8203;&#125;}  | add and remove                                                            |\n * | {@link ng.directive:ngClassEven#animations ngClassEven}                       | add and remove                                                            |\n * | {@link ng.directive:ngClassOdd#animations ngClassOdd}                         | add and remove                                                            |\n * | {@link ng.directive:ngHide#animations ngHide}                                 | add and remove (the `ng-hide` class)                                      |\n * | {@link ng.directive:ngIf#animations ngIf}                                     | enter and leave                                                           |\n * | {@link ng.directive:ngInclude#animations ngInclude}                           | enter and leave                                                           |\n * | {@link module:ngMessages#animations ngMessage / ngMessageExp}                 | enter and leave                                                           |\n * | {@link module:ngMessages#animations ngMessages}                               | add and remove (the `ng-active`/`ng-inactive` classes)                    |\n * | {@link ng.directive:ngModel#animations ngModel}                               | add and remove ({@link ng.directive:ngModel#css-classes various classes}) |\n * | {@link ng.directive:ngRepeat#animations ngRepeat}                             | enter, leave, and move                                                    |\n * | {@link ng.directive:ngShow#animations ngShow}                                 | add and remove (the `ng-hide` class)                                      |\n * | {@link ng.directive:ngSwitch#animations ngSwitch}                             | enter and leave                                                           |\n * | {@link ngRoute.directive:ngView#animations ngView}                            | enter and leave                                                           |\n *\n * (More information can be found by visiting the documentation associated with each directive.)\n *\n * For a full breakdown of the steps involved during each animation event, refer to the\n * {@link ng.$animate `$animate` API docs}.\n *\n * ## CSS-based Animations\n *\n * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML\n * and CSS code we can create an animation that will be picked up by AngularJS when an underlying directive performs an operation.\n *\n * The example below shows how an `enter` animation can be made possible on an element using `ng-if`:\n *\n * ```html\n * <div ng-if=\"bool\" class=\"fade\">\n *    Fade me in out\n * </div>\n * <button ng-click=\"bool=true\">Fade In!</button>\n * <button ng-click=\"bool=false\">Fade Out!</button>\n * ```\n *\n * Notice the CSS class **fade**? We can now create the CSS transition code that references this class:\n *\n * ```css\n * /&#42; The starting CSS styles for the enter animation &#42;/\n * .fade.ng-enter {\n *   transition:0.5s linear all;\n *   opacity:0;\n * }\n *\n * /&#42; The finishing CSS styles for the enter animation &#42;/\n * .fade.ng-enter.ng-enter-active {\n *   opacity:1;\n * }\n * ```\n *\n * The key thing to remember here is that, depending on the animation event (which each of the directives above trigger depending on what's going on) two\n * generated CSS classes will be applied to the element; in the example above we have `.ng-enter` and `.ng-enter-active`. For CSS transitions, the transition\n * code **must** be defined within the starting CSS class (in this case `.ng-enter`). The destination class is what the transition will animate towards.\n *\n * If for example we wanted to create animations for `leave` and `move` (ngRepeat triggers move) then we can do so using the same CSS naming conventions:\n *\n * ```css\n * /&#42; now the element will fade out before it is removed from the DOM &#42;/\n * .fade.ng-leave {\n *   transition:0.5s linear all;\n *   opacity:1;\n * }\n * .fade.ng-leave.ng-leave-active {\n *   opacity:0;\n * }\n * ```\n *\n * We can also make use of **CSS Keyframes** by referencing the keyframe animation within the starting CSS class:\n *\n * ```css\n * /&#42; there is no need to define anything inside of the destination\n * CSS class since the keyframe will take charge of the animation &#42;/\n * .fade.ng-leave {\n *   animation: my_fade_animation 0.5s linear;\n *   -webkit-animation: my_fade_animation 0.5s linear;\n * }\n *\n * @keyframes my_fade_animation {\n *   from { opacity:1; }\n *   to { opacity:0; }\n * }\n *\n * @-webkit-keyframes my_fade_animation {\n *   from { opacity:1; }\n *   to { opacity:0; }\n * }\n * ```\n *\n * Feel free also mix transitions and keyframes together as well as any other CSS classes on the same element.\n *\n * ### CSS Class-based Animations\n *\n * Class-based animations (animations that are triggered via `ngClass`, `ngShow`, `ngHide` and some other directives) have a slightly different\n * naming convention. Class-based animations are basic enough that a standard transition or keyframe can be referenced on the class being added\n * and removed.\n *\n * For example if we wanted to do a CSS animation for `ngHide` then we place an animation on the `.ng-hide` CSS class:\n *\n * ```html\n * <div ng-show=\"bool\" class=\"fade\">\n *   Show and hide me\n * </div>\n * <button ng-click=\"bool=!bool\">Toggle</button>\n *\n * <style>\n * .fade.ng-hide {\n *   transition:0.5s linear all;\n *   opacity:0;\n * }\n * </style>\n * ```\n *\n * All that is going on here with ngShow/ngHide behind the scenes is the `.ng-hide` class is added/removed (when the hidden state is valid). Since\n * ngShow and ngHide are animation aware then we can match up a transition and ngAnimate handles the rest.\n *\n * In addition the addition and removal of the CSS class, ngAnimate also provides two helper methods that we can use to further decorate the animation\n * with CSS styles.\n *\n * ```html\n * <div ng-class=\"{on:onOff}\" class=\"highlight\">\n *   Highlight this box\n * </div>\n * <button ng-click=\"onOff=!onOff\">Toggle</button>\n *\n * <style>\n * .highlight {\n *   transition:0.5s linear all;\n * }\n * .highlight.on-add {\n *   background:white;\n * }\n * .highlight.on {\n *   background:yellow;\n * }\n * .highlight.on-remove {\n *   background:black;\n * }\n * </style>\n * ```\n *\n * We can also make use of CSS keyframes by placing them within the CSS classes.\n *\n *\n * ### CSS Staggering Animations\n * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a\n * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be\n * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for\n * the animation. The style property expected within the stagger class can either be a **transition-delay** or an\n * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).\n *\n * ```css\n * .my-animation.ng-enter {\n *   /&#42; standard transition code &#42;/\n *   transition: 1s linear all;\n *   opacity:0;\n * }\n * .my-animation.ng-enter-stagger {\n *   /&#42; this will have a 100ms delay between each successive leave animation &#42;/\n *   transition-delay: 0.1s;\n *\n *   /&#42; As of 1.4.4, this must always be set: it signals ngAnimate\n *     to not accidentally inherit a delay property from another CSS class &#42;/\n *   transition-duration: 0s;\n *\n *   /&#42; if you are using animations instead of transitions you should configure as follows:\n *     animation-delay: 0.1s;\n *     animation-duration: 0s; &#42;/\n * }\n * .my-animation.ng-enter.ng-enter-active {\n *   /&#42; standard transition styles &#42;/\n *   opacity:1;\n * }\n * ```\n *\n * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations\n * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this\n * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation\n * will also be reset if one or more animation frames have passed since the multiple calls to `$animate` were fired.\n *\n * The following code will issue the **ng-leave-stagger** event on the element provided:\n *\n * ```js\n * var kids = parent.children();\n *\n * $animate.leave(kids[0]); //stagger index=0\n * $animate.leave(kids[1]); //stagger index=1\n * $animate.leave(kids[2]); //stagger index=2\n * $animate.leave(kids[3]); //stagger index=3\n * $animate.leave(kids[4]); //stagger index=4\n *\n * window.requestAnimationFrame(function() {\n *   //stagger has reset itself\n *   $animate.leave(kids[5]); //stagger index=0\n *   $animate.leave(kids[6]); //stagger index=1\n *\n *   $scope.$digest();\n * });\n * ```\n *\n * Stagger animations are currently only supported within CSS-defined animations.\n *\n * ### The `ng-animate` CSS class\n *\n * When ngAnimate is animating an element it will apply the `ng-animate` CSS class to the element for the duration of the animation.\n * This is a temporary CSS class and it will be removed once the animation is over (for both JavaScript and CSS-based animations).\n *\n * Therefore, animations can be applied to an element using this temporary class directly via CSS.\n *\n * ```css\n * .zipper.ng-animate {\n *   transition:0.5s linear all;\n * }\n * .zipper.ng-enter {\n *   opacity:0;\n * }\n * .zipper.ng-enter.ng-enter-active {\n *   opacity:1;\n * }\n * .zipper.ng-leave {\n *   opacity:1;\n * }\n * .zipper.ng-leave.ng-leave-active {\n *   opacity:0;\n * }\n * ```\n *\n * (Note that the `ng-animate` CSS class is reserved and it cannot be applied on an element directly since ngAnimate will always remove\n * the CSS class once an animation has completed.)\n *\n *\n * ### The `ng-[event]-prepare` class\n *\n * This is a special class that can be used to prevent unwanted flickering / flash of content before\n * the actual animation starts. The class is added as soon as an animation is initialized, but removed\n * before the actual animation starts (after waiting for a $digest).\n * It is also only added for *structural* animations (`enter`, `move`, and `leave`).\n *\n * In practice, flickering can appear when nesting elements with structural animations such as `ngIf`\n * into elements that have class-based animations such as `ngClass`.\n *\n * ```html\n * <div ng-class=\"{red: myProp}\">\n *   <div ng-class=\"{blue: myProp}\">\n *     <div class=\"message\" ng-if=\"myProp\"></div>\n *   </div>\n * </div>\n * ```\n *\n * It is possible that during the `enter` animation, the `.message` div will be briefly visible before it starts animating.\n * In that case, you can add styles to the CSS that make sure the element stays hidden before the animation starts:\n *\n * ```css\n * .message.ng-enter-prepare {\n *   opacity: 0;\n * }\n * ```\n *\n * ### Animating between value changes\n *\n * Sometimes you need to animate between different expression states, whose values\n * don't necessary need to be known or referenced in CSS styles.\n * Unless possible with another {@link ngAnimate#directive-support \"animation aware\" directive},\n * that specific use case can always be covered with {@link ngAnimate.directive:ngAnimateSwap} as\n * can be seen in {@link ngAnimate.directive:ngAnimateSwap#examples this example}.\n *\n * Note that {@link ngAnimate.directive:ngAnimateSwap} is a *structural directive*, which means it\n * creates a new instance of the element (including any other/child directives it may have) and\n * links it to a new scope every time *swap* happens. In some cases this might not be desirable\n * (e.g. for performance reasons, or when you wish to retain internal state on the original\n * element instance).\n *\n * ## JavaScript-based Animations\n *\n * ngAnimate also allows for animations to be consumed by JavaScript code. The approach is similar to CSS-based animations (where there is a shared\n * CSS class that is referenced in our HTML code) but in addition we need to register the JavaScript animation on the module. By making use of the\n * `module.animation()` module function we can register the animation.\n *\n * Let's see an example of a enter/leave animation using `ngRepeat`:\n *\n * ```html\n * <div ng-repeat=\"item in items\" class=\"slide\">\n *   {{ item }}\n * </div>\n * ```\n *\n * See the **slide** CSS class? Let's use that class to define an animation that we'll structure in our module code by using `module.animation`:\n *\n * ```js\n * myModule.animation('.slide', [function() {\n *   return {\n *     // make note that other events (like addClass/removeClass)\n *     // have different function input parameters\n *     enter: function(element, doneFn) {\n *       jQuery(element).fadeIn(1000, doneFn);\n *\n *       // remember to call doneFn so that AngularJS\n *       // knows that the animation has concluded\n *     },\n *\n *     move: function(element, doneFn) {\n *       jQuery(element).fadeIn(1000, doneFn);\n *     },\n *\n *     leave: function(element, doneFn) {\n *       jQuery(element).fadeOut(1000, doneFn);\n *     }\n *   }\n * }]);\n * ```\n *\n * The nice thing about JS-based animations is that we can inject other services and make use of advanced animation libraries such as\n * greensock.js and velocity.js.\n *\n * If our animation code class-based (meaning that something like `ngClass`, `ngHide` and `ngShow` triggers it) then we can still define\n * our animations inside of the same registered animation, however, the function input arguments are a bit different:\n *\n * ```html\n * <div ng-class=\"color\" class=\"colorful\">\n *   this box is moody\n * </div>\n * <button ng-click=\"color='red'\">Change to red</button>\n * <button ng-click=\"color='blue'\">Change to blue</button>\n * <button ng-click=\"color='green'\">Change to green</button>\n * ```\n *\n * ```js\n * myModule.animation('.colorful', [function() {\n *   return {\n *     addClass: function(element, className, doneFn) {\n *       // do some cool animation and call the doneFn\n *     },\n *     removeClass: function(element, className, doneFn) {\n *       // do some cool animation and call the doneFn\n *     },\n *     setClass: function(element, addedClass, removedClass, doneFn) {\n *       // do some cool animation and call the doneFn\n *     }\n *   }\n * }]);\n * ```\n *\n * ## CSS + JS Animations Together\n *\n * AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of AngularJS,\n * defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking\n * charge of the animation**:\n *\n * ```html\n * <div ng-if=\"bool\" class=\"slide\">\n *   Slide in and out\n * </div>\n * ```\n *\n * ```js\n * myModule.animation('.slide', [function() {\n *   return {\n *     enter: function(element, doneFn) {\n *       jQuery(element).slideIn(1000, doneFn);\n *     }\n *   }\n * }]);\n * ```\n *\n * ```css\n * .slide.ng-enter {\n *   transition:0.5s linear all;\n *   transform:translateY(-100px);\n * }\n * .slide.ng-enter.ng-enter-active {\n *   transform:translateY(0);\n * }\n * ```\n *\n * Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the\n * lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from\n * our own JS-based animation code:\n *\n * ```js\n * myModule.animation('.slide', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element) {\n*        // this will trigger `.slide.ng-enter` and `.slide.ng-enter-active`.\n *       return $animateCss(element, {\n *         event: 'enter',\n *         structural: true\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * The nice thing here is that we can save bandwidth by sticking to our CSS-based animation code and we don't need to rely on a 3rd-party animation framework.\n *\n * The `$animateCss` service is very powerful since we can feed in all kinds of extra properties that will be evaluated and fed into a CSS transition or\n * keyframe animation. For example if we wanted to animate the height of an element while adding and removing classes then we can do so by providing that\n * data into `$animateCss` directly:\n *\n * ```js\n * myModule.animation('.slide', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element) {\n *       return $animateCss(element, {\n *         event: 'enter',\n *         structural: true,\n *         addClass: 'maroon-setting',\n *         from: { height:0 },\n *         to: { height: 200 }\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * Now we can fill in the rest via our transition CSS code:\n *\n * ```css\n * /&#42; the transition tells ngAnimate to make the animation happen &#42;/\n * .slide.ng-enter { transition:0.5s linear all; }\n *\n * /&#42; this extra CSS class will be absorbed into the transition\n * since the $animateCss code is adding the class &#42;/\n * .maroon-setting { background:red; }\n * ```\n *\n * And `$animateCss` will figure out the rest. Just make sure to have the `done()` callback fire the `doneFn` function to signal when the animation is over.\n *\n * To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}.\n *\n * ## Animation Anchoring (via `ng-animate-ref`)\n *\n * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between\n * structural areas of an application (like views) by pairing up elements using an attribute\n * called `ng-animate-ref`.\n *\n * Let's say for example we have two views that are managed by `ng-view` and we want to show\n * that there is a relationship between two components situated in within these views. By using the\n * `ng-animate-ref` attribute we can identify that the two components are paired together and we\n * can then attach an animation, which is triggered when the view changes.\n *\n * Say for example we have the following template code:\n *\n * ```html\n * <!-- index.html -->\n * <div ng-view class=\"view-animation\">\n * </div>\n *\n * <!-- home.html -->\n * <a href=\"#/banner-page\">\n *   <img src=\"./banner.jpg\" class=\"banner\" ng-animate-ref=\"banner\">\n * </a>\n *\n * <!-- banner-page.html -->\n * <img src=\"./banner.jpg\" class=\"banner\" ng-animate-ref=\"banner\">\n * ```\n *\n * Now, when the view changes (once the link is clicked), ngAnimate will examine the\n * HTML contents to see if there is a match reference between any components in the view\n * that is leaving and the view that is entering. It will scan both the view which is being\n * removed (leave) and inserted (enter) to see if there are any paired DOM elements that\n * contain a matching ref value.\n *\n * The two images match since they share the same ref value. ngAnimate will now create a\n * transport element (which is a clone of the first image element) and it will then attempt\n * to animate to the position of the second image element in the next view. For the animation to\n * work a special CSS class called `ng-anchor` will be added to the transported element.\n *\n * We can now attach a transition onto the `.banner.ng-anchor` CSS class and then\n * ngAnimate will handle the entire transition for us as well as the addition and removal of\n * any changes of CSS classes between the elements:\n *\n * ```css\n * .banner.ng-anchor {\n *   /&#42; this animation will last for 1 second since there are\n *          two phases to the animation (an `in` and an `out` phase) &#42;/\n *   transition:0.5s linear all;\n * }\n * ```\n *\n * We also **must** include animations for the views that are being entered and removed\n * (otherwise anchoring wouldn't be possible since the new view would be inserted right away).\n *\n * ```css\n * .view-animation.ng-enter, .view-animation.ng-leave {\n *   transition:0.5s linear all;\n *   position:fixed;\n *   left:0;\n *   top:0;\n *   width:100%;\n * }\n * .view-animation.ng-enter {\n *   transform:translateX(100%);\n * }\n * .view-animation.ng-leave,\n * .view-animation.ng-enter.ng-enter-active {\n *   transform:translateX(0%);\n * }\n * .view-animation.ng-leave.ng-leave-active {\n *   transform:translateX(-100%);\n * }\n * ```\n *\n * Now we can jump back to the anchor animation. When the animation happens, there are two stages that occur:\n * an `out` and an `in` stage. The `out` stage happens first and that is when the element is animated away\n * from its origin. Once that animation is over then the `in` stage occurs which animates the\n * element to its destination. The reason why there are two animations is to give enough time\n * for the enter animation on the new element to be ready.\n *\n * The example above sets up a transition for both the in and out phases, but we can also target the out or\n * in phases directly via `ng-anchor-out` and `ng-anchor-in`.\n *\n * ```css\n * .banner.ng-anchor-out {\n *   transition: 0.5s linear all;\n *\n *   /&#42; the scale will be applied during the out animation,\n *          but will be animated away when the in animation runs &#42;/\n *   transform: scale(1.2);\n * }\n *\n * .banner.ng-anchor-in {\n *   transition: 1s linear all;\n * }\n * ```\n *\n *\n *\n *\n * ### Anchoring Demo\n *\n  <example module=\"anchoringExample\"\n           name=\"anchoringExample\"\n           id=\"anchoringExample\"\n           deps=\"angular-animate.js;angular-route.js\"\n           animations=\"true\">\n    <file name=\"index.html\">\n      <a href=\"#!/\">Home</a>\n      <hr />\n      <div class=\"view-container\">\n        <div ng-view class=\"view\"></div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('anchoringExample', ['ngAnimate', 'ngRoute'])\n        .config(['$routeProvider', function($routeProvider) {\n          $routeProvider.when('/', {\n            templateUrl: 'home.html',\n            controller: 'HomeController as home'\n          });\n          $routeProvider.when('/profile/:id', {\n            templateUrl: 'profile.html',\n            controller: 'ProfileController as profile'\n          });\n        }])\n        .run(['$rootScope', function($rootScope) {\n          $rootScope.records = [\n            { id: 1, title: 'Miss Beulah Roob' },\n            { id: 2, title: 'Trent Morissette' },\n            { id: 3, title: 'Miss Ava Pouros' },\n            { id: 4, title: 'Rod Pouros' },\n            { id: 5, title: 'Abdul Rice' },\n            { id: 6, title: 'Laurie Rutherford Sr.' },\n            { id: 7, title: 'Nakia McLaughlin' },\n            { id: 8, title: 'Jordon Blanda DVM' },\n            { id: 9, title: 'Rhoda Hand' },\n            { id: 10, title: 'Alexandrea Sauer' }\n          ];\n        }])\n        .controller('HomeController', [function() {\n          //empty\n        }])\n        .controller('ProfileController', ['$rootScope', '$routeParams',\n            function ProfileController($rootScope, $routeParams) {\n          var index = parseInt($routeParams.id, 10);\n          var record = $rootScope.records[index - 1];\n\n          this.title = record.title;\n          this.id = record.id;\n        }]);\n    </file>\n    <file name=\"home.html\">\n      <h2>Welcome to the home page</h1>\n      <p>Please click on an element</p>\n      <a class=\"record\"\n         ng-href=\"#!/profile/{{ record.id }}\"\n         ng-animate-ref=\"{{ record.id }}\"\n         ng-repeat=\"record in records\">\n        {{ record.title }}\n      </a>\n    </file>\n    <file name=\"profile.html\">\n      <div class=\"profile record\" ng-animate-ref=\"{{ profile.id }}\">\n        {{ profile.title }}\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .record {\n        display:block;\n        font-size:20px;\n      }\n      .profile {\n        background:black;\n        color:white;\n        font-size:100px;\n      }\n      .view-container {\n        position:relative;\n      }\n      .view-container > .view.ng-animate {\n        position:absolute;\n        top:0;\n        left:0;\n        width:100%;\n        min-height:500px;\n      }\n      .view.ng-enter, .view.ng-leave,\n      .record.ng-anchor {\n        transition:0.5s linear all;\n      }\n      .view.ng-enter {\n        transform:translateX(100%);\n      }\n      .view.ng-enter.ng-enter-active, .view.ng-leave {\n        transform:translateX(0%);\n      }\n      .view.ng-leave.ng-leave-active {\n        transform:translateX(-100%);\n      }\n      .record.ng-anchor-out {\n        background:red;\n      }\n    </file>\n  </example>\n *\n * ### How is the element transported?\n *\n * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting\n * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element\n * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The\n * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match\n * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied\n * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class\n * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element\n * will become visible since the shim class will be removed.\n *\n * ### How is the morphing handled?\n *\n * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out\n * what CSS classes differ between the starting element and the destination element. These different CSS classes\n * will be added/removed on the anchor element and a transition will be applied (the transition that is provided\n * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will\n * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that\n * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since\n * the cloned element is placed inside of root element which is likely close to the body element).\n *\n * Note that if the root element is on the `<html>` element then the cloned node will be placed inside of body.\n *\n *\n * ## Using $animate in your directive code\n *\n * So far we've explored how to feed in animations into an AngularJS application, but how do we trigger animations within our own directives in our application?\n * By injecting the `$animate` service into our directive code, we can trigger structural and class-based hooks which can then be consumed by animations. Let's\n * imagine we have a greeting box that shows and hides itself when the data changes\n *\n * ```html\n * <greeting-box active=\"onOrOff\">Hi there</greeting-box>\n * ```\n *\n * ```js\n * ngModule.directive('greetingBox', ['$animate', function($animate) {\n *   return function(scope, element, attrs) {\n *     attrs.$observe('active', function(value) {\n *       value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on');\n *     });\n *   });\n * }]);\n * ```\n *\n * Now the `on` CSS class is added and removed on the greeting box component. Now if we add a CSS class on top of the greeting box element\n * in our HTML code then we can trigger a CSS or JS animation to happen.\n *\n * ```css\n * /&#42; normally we would create a CSS class to reference on the element &#42;/\n * greeting-box.on { transition:0.5s linear all; background:green; color:white; }\n * ```\n *\n * The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's\n * possible be sure to visit the {@link ng.$animate $animate service API page}.\n *\n *\n * ## Callbacks and Promises\n *\n * When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger\n * an animation (within our directive code) then we can continue performing directive and scope related activities after the animation has\n * ended by chaining onto the returned promise that animation method returns.\n *\n * ```js\n * // somewhere within the depths of the directive\n * $animate.enter(element, parent).then(function() {\n *   //the animation has completed\n * });\n * ```\n *\n * (Note that earlier versions of AngularJS prior to v1.4 required the promise code to be wrapped using `$scope.$apply(...)`. This is not the case\n * anymore.)\n *\n * In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering\n * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view\n * routing controller to hook into that:\n *\n * ```js\n * ngModule.controller('HomePageController', ['$animate', function($animate) {\n *   $animate.on('enter', ngViewElement, function(element) {\n *     // the animation for this route has completed\n *   }]);\n * }])\n * ```\n *\n * (Note that you will need to trigger a digest within the callback to get AngularJS to notice any scope-related changes.)\n */\n\nvar copy;\nvar extend;\nvar forEach;\nvar isArray;\nvar isDefined;\nvar isElement;\nvar isFunction;\nvar isObject;\nvar isString;\nvar isUndefined;\nvar jqLite;\nvar noop;\n\n/**\n * @ngdoc service\n * @name $animate\n * @kind object\n *\n * @description\n * The ngAnimate `$animate` service documentation is the same for the core `$animate` service.\n *\n * Click here {@link ng.$animate to learn more about animations with `$animate`}.\n */\nangular.module('ngAnimate', [], function initAngularHelpers() {\n  // Access helpers from AngularJS core.\n  // Do it inside a `config` block to ensure `window.angular` is available.\n  noop        = angular.noop;\n  copy        = angular.copy;\n  extend      = angular.extend;\n  jqLite      = angular.element;\n  forEach     = angular.forEach;\n  isArray     = angular.isArray;\n  isString    = angular.isString;\n  isObject    = angular.isObject;\n  isUndefined = angular.isUndefined;\n  isDefined   = angular.isDefined;\n  isFunction  = angular.isFunction;\n  isElement   = angular.isElement;\n})\n  .info({ angularVersion: '1.7.8' })\n  .directive('ngAnimateSwap', ngAnimateSwapDirective)\n\n  .directive('ngAnimateChildren', $$AnimateChildrenDirective)\n  .factory('$$rAFScheduler', $$rAFSchedulerFactory)\n\n  .provider('$$animateQueue', $$AnimateQueueProvider)\n  .provider('$$animateCache', $$AnimateCacheProvider)\n  .provider('$$animation', $$AnimationProvider)\n\n  .provider('$animateCss', $AnimateCssProvider)\n  .provider('$$animateCssDriver', $$AnimateCssDriverProvider)\n\n  .provider('$$animateJs', $$AnimateJsProvider)\n  .provider('$$animateJsDriver', $$AnimateJsDriverProvider);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-aria.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngAria\n * @description\n *\n * The `ngAria` module provides support for common\n * [<abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr>](http://www.w3.org/TR/wai-aria/)\n * attributes that convey state or semantic information about the application for users\n * of assistive technologies, such as screen readers.\n *\n * ## Usage\n *\n * For ngAria to do its magic, simply include the module `ngAria` as a dependency. The following\n * directives are supported:\n * `ngModel`, `ngChecked`, `ngReadonly`, `ngRequired`, `ngValue`, `ngDisabled`, `ngShow`, `ngHide`,\n * `ngClick`, `ngDblClick`, and `ngMessages`.\n *\n * Below is a more detailed breakdown of the attributes handled by ngAria:\n *\n * | Directive                                   | Supported Attributes                                                                                |\n * |---------------------------------------------|-----------------------------------------------------------------------------------------------------|\n * | {@link ng.directive:ngModel ngModel}        | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required, input roles |\n * | {@link ng.directive:ngDisabled ngDisabled}  | aria-disabled                                                                                       |\n * | {@link ng.directive:ngRequired ngRequired}  | aria-required                                                                                       |\n * | {@link ng.directive:ngChecked ngChecked}    | aria-checked                                                                                        |\n * | {@link ng.directive:ngReadonly ngReadonly}  | aria-readonly                                                                                       |\n * | {@link ng.directive:ngValue ngValue}        | aria-checked                                                                                        |\n * | {@link ng.directive:ngShow ngShow}          | aria-hidden                                                                                         |\n * | {@link ng.directive:ngHide ngHide}          | aria-hidden                                                                                         |\n * | {@link ng.directive:ngDblclick ngDblclick}  | tabindex                                                                                            |\n * | {@link module:ngMessages ngMessages}        | aria-live                                                                                           |\n * | {@link ng.directive:ngClick ngClick}        | tabindex, keydown event, button role                                                                |\n *\n * Find out more information about each directive by reading the\n * {@link guide/accessibility ngAria Developer Guide}.\n *\n * ## Example\n * Using ngDisabled with ngAria:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\">\n * ```\n * Becomes:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\" aria-disabled=\"true\">\n * ```\n *\n * ## Disabling Specific Attributes\n * It is possible to disable individual attributes added by ngAria with the\n * {@link ngAria.$ariaProvider#config config} method. For more details, see the\n * {@link guide/accessibility Developer Guide}.\n *\n * ## Disabling `ngAria` on Specific Elements\n * It is possible to make `ngAria` ignore a specific element, by adding the `ng-aria-disable`\n * attribute on it. Note that only the element itself (and not its child elements) will be ignored.\n */\nvar ARIA_DISABLE_ATTR = 'ngAriaDisable';\n\nvar ngAriaModule = angular.module('ngAria', ['ng']).\n                        info({ angularVersion: '1.7.8' }).\n                        provider('$aria', $AriaProvider);\n\n/**\n* Internal Utilities\n*/\nvar nodeBlackList = ['BUTTON', 'A', 'INPUT', 'TEXTAREA', 'SELECT', 'DETAILS', 'SUMMARY'];\n\nvar isNodeOneOf = function(elem, nodeTypeArray) {\n  if (nodeTypeArray.indexOf(elem[0].nodeName) !== -1) {\n    return true;\n  }\n};\n/**\n * @ngdoc provider\n * @name $ariaProvider\n * @this\n *\n * @description\n *\n * Used for configuring the ARIA attributes injected and managed by ngAria.\n *\n * ```js\n * angular.module('myApp', ['ngAria'], function config($ariaProvider) {\n *   $ariaProvider.config({\n *     ariaValue: true,\n *     tabindex: false\n *   });\n * });\n *```\n *\n * ## Dependencies\n * Requires the {@link ngAria} module to be installed.\n *\n */\nfunction $AriaProvider() {\n  var config = {\n    ariaHidden: true,\n    ariaChecked: true,\n    ariaReadonly: true,\n    ariaDisabled: true,\n    ariaRequired: true,\n    ariaInvalid: true,\n    ariaValue: true,\n    tabindex: true,\n    bindKeydown: true,\n    bindRoleForClick: true\n  };\n\n  /**\n   * @ngdoc method\n   * @name $ariaProvider#config\n   *\n   * @param {object} config object to enable/disable specific ARIA attributes\n   *\n   *  - **ariaHidden** – `{boolean}` – Enables/disables aria-hidden tags\n   *  - **ariaChecked** – `{boolean}` – Enables/disables aria-checked tags\n   *  - **ariaReadonly** – `{boolean}` – Enables/disables aria-readonly tags\n   *  - **ariaDisabled** – `{boolean}` – Enables/disables aria-disabled tags\n   *  - **ariaRequired** – `{boolean}` – Enables/disables aria-required tags\n   *  - **ariaInvalid** – `{boolean}` – Enables/disables aria-invalid tags\n   *  - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and\n   *    aria-valuenow tags\n   *  - **tabindex** – `{boolean}` – Enables/disables tabindex tags\n   *  - **bindKeydown** – `{boolean}` – Enables/disables keyboard event binding on non-interactive\n   *    elements (such as `div` or `li`) using ng-click, making them more accessible to users of\n   *    assistive technologies\n   *  - **bindRoleForClick** – `{boolean}` – Adds role=button to non-interactive elements (such as\n   *    `div` or `li`) using ng-click, making them more accessible to users of assistive\n   *    technologies\n   *\n   * @description\n   * Enables/disables various ARIA attributes\n   */\n  this.config = function(newConfig) {\n    config = angular.extend(config, newConfig);\n  };\n\n  function watchExpr(attrName, ariaAttr, nodeBlackList, negate) {\n    return function(scope, elem, attr) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      var ariaCamelName = attr.$normalize(ariaAttr);\n      if (config[ariaCamelName] && !isNodeOneOf(elem, nodeBlackList) && !attr[ariaCamelName]) {\n        scope.$watch(attr[attrName], function(boolVal) {\n          // ensure boolean value\n          boolVal = negate ? !boolVal : !!boolVal;\n          elem.attr(ariaAttr, boolVal);\n        });\n      }\n    };\n  }\n  /**\n   * @ngdoc service\n   * @name $aria\n   *\n   * @description\n   * @priority 200\n   *\n   * The $aria service contains helper methods for applying common\n   * [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.\n   *\n   * ngAria injects common accessibility attributes that tell assistive technologies when HTML\n   * elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,\n   * let's review a code snippet from ngAria itself:\n   *\n   *```js\n   * ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {\n   *   return $aria.$$watchExpr('ngDisabled', 'aria-disabled', nodeBlackList, false);\n   * }])\n   *```\n   * Shown above, the ngAria module creates a directive with the same signature as the\n   * traditional `ng-disabled` directive. But this ngAria version is dedicated to\n   * solely managing accessibility attributes on custom elements. The internal `$aria` service is\n   * used to watch the boolean attribute `ngDisabled`. If it has not been explicitly set by the\n   * developer, `aria-disabled` is injected as an attribute with its value synchronized to the\n   * value in `ngDisabled`.\n   *\n   * Because ngAria hooks into the `ng-disabled` directive, developers do not have to do\n   * anything to enable this feature. The `aria-disabled` attribute is automatically managed\n   * simply as a silent side-effect of using `ng-disabled` with the ngAria module.\n   *\n   * The full list of directives that interface with ngAria:\n   * * **ngModel**\n   * * **ngChecked**\n   * * **ngReadonly**\n   * * **ngRequired**\n   * * **ngDisabled**\n   * * **ngValue**\n   * * **ngShow**\n   * * **ngHide**\n   * * **ngClick**\n   * * **ngDblclick**\n   * * **ngMessages**\n   *\n   * Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each\n   * directive.\n   *\n   *\n   * ## Dependencies\n   * Requires the {@link ngAria} module to be installed.\n   */\n  this.$get = function() {\n    return {\n      config: function(key) {\n        return config[key];\n      },\n      $$watchExpr: watchExpr\n    };\n  };\n}\n\n\nngAriaModule.directive('ngShow', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngShow', 'aria-hidden', [], true);\n}])\n.directive('ngHide', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngHide', 'aria-hidden', [], false);\n}])\n.directive('ngValue', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngValue', 'aria-checked', nodeBlackList, false);\n}])\n.directive('ngChecked', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngChecked', 'aria-checked', nodeBlackList, false);\n}])\n.directive('ngReadonly', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngReadonly', 'aria-readonly', nodeBlackList, false);\n}])\n.directive('ngRequired', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngRequired', 'aria-required', nodeBlackList, false);\n}])\n.directive('ngModel', ['$aria', function($aria) {\n\n  function shouldAttachAttr(attr, normalizedAttr, elem, allowBlacklistEls) {\n    return $aria.config(normalizedAttr) &&\n      !elem.attr(attr) &&\n      (allowBlacklistEls || !isNodeOneOf(elem, nodeBlackList)) &&\n      (elem.attr('type') !== 'hidden' || elem[0].nodeName !== 'INPUT');\n  }\n\n  function shouldAttachRole(role, elem) {\n    // if element does not have role attribute\n    // AND element type is equal to role (if custom element has a type equaling shape) <-- remove?\n    // AND element is not in nodeBlackList\n    return !elem.attr('role') && (elem.attr('type') === role) && !isNodeOneOf(elem, nodeBlackList);\n  }\n\n  function getShape(attr, elem) {\n    var type = attr.type,\n        role = attr.role;\n\n    return ((type || role) === 'checkbox' || role === 'menuitemcheckbox') ? 'checkbox' :\n           ((type || role) === 'radio'    || role === 'menuitemradio') ? 'radio' :\n           (type === 'range'              || role === 'progressbar' || role === 'slider') ? 'range' : '';\n  }\n\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    priority: 200, //Make sure watches are fired after any other directives that affect the ngModel value\n    compile: function(elem, attr) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      var shape = getShape(attr, elem);\n\n      return {\n        post: function(scope, elem, attr, ngModel) {\n          var needsTabIndex = shouldAttachAttr('tabindex', 'tabindex', elem, false);\n\n          function ngAriaWatchModelValue() {\n            return ngModel.$modelValue;\n          }\n\n          function getRadioReaction(newVal) {\n            // Strict comparison would cause a BC\n            // eslint-disable-next-line eqeqeq\n            var boolVal = (attr.value == ngModel.$viewValue);\n            elem.attr('aria-checked', boolVal);\n          }\n\n          function getCheckboxReaction() {\n            elem.attr('aria-checked', !ngModel.$isEmpty(ngModel.$viewValue));\n          }\n\n          switch (shape) {\n            case 'radio':\n            case 'checkbox':\n              if (shouldAttachRole(shape, elem)) {\n                elem.attr('role', shape);\n              }\n              if (shouldAttachAttr('aria-checked', 'ariaChecked', elem, false)) {\n                scope.$watch(ngAriaWatchModelValue, shape === 'radio' ?\n                    getRadioReaction : getCheckboxReaction);\n              }\n              if (needsTabIndex) {\n                elem.attr('tabindex', 0);\n              }\n              break;\n            case 'range':\n              if (shouldAttachRole(shape, elem)) {\n                elem.attr('role', 'slider');\n              }\n              if ($aria.config('ariaValue')) {\n                var needsAriaValuemin = !elem.attr('aria-valuemin') &&\n                    (attr.hasOwnProperty('min') || attr.hasOwnProperty('ngMin'));\n                var needsAriaValuemax = !elem.attr('aria-valuemax') &&\n                    (attr.hasOwnProperty('max') || attr.hasOwnProperty('ngMax'));\n                var needsAriaValuenow = !elem.attr('aria-valuenow');\n\n                if (needsAriaValuemin) {\n                  attr.$observe('min', function ngAriaValueMinReaction(newVal) {\n                    elem.attr('aria-valuemin', newVal);\n                  });\n                }\n                if (needsAriaValuemax) {\n                  attr.$observe('max', function ngAriaValueMinReaction(newVal) {\n                    elem.attr('aria-valuemax', newVal);\n                  });\n                }\n                if (needsAriaValuenow) {\n                  scope.$watch(ngAriaWatchModelValue, function ngAriaValueNowReaction(newVal) {\n                    elem.attr('aria-valuenow', newVal);\n                  });\n                }\n              }\n              if (needsTabIndex) {\n                elem.attr('tabindex', 0);\n              }\n              break;\n          }\n\n          if (!attr.hasOwnProperty('ngRequired') && ngModel.$validators.required\n            && shouldAttachAttr('aria-required', 'ariaRequired', elem, false)) {\n            // ngModel.$error.required is undefined on custom controls\n            attr.$observe('required', function() {\n              elem.attr('aria-required', !!attr['required']);\n            });\n          }\n\n          if (shouldAttachAttr('aria-invalid', 'ariaInvalid', elem, true)) {\n            scope.$watch(function ngAriaInvalidWatch() {\n              return ngModel.$invalid;\n            }, function ngAriaInvalidReaction(newVal) {\n              elem.attr('aria-invalid', !!newVal);\n            });\n          }\n        }\n      };\n    }\n  };\n}])\n.directive('ngDisabled', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngDisabled', 'aria-disabled', nodeBlackList, false);\n}])\n.directive('ngMessages', function() {\n  return {\n    restrict: 'A',\n    require: '?ngMessages',\n    link: function(scope, elem, attr, ngMessages) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      if (!elem.attr('aria-live')) {\n        elem.attr('aria-live', 'assertive');\n      }\n    }\n  };\n})\n.directive('ngClick',['$aria', '$parse', function($aria, $parse) {\n  return {\n    restrict: 'A',\n    compile: function(elem, attr) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      var fn = $parse(attr.ngClick);\n      return function(scope, elem, attr) {\n\n        if (!isNodeOneOf(elem, nodeBlackList)) {\n\n          if ($aria.config('bindRoleForClick') && !elem.attr('role')) {\n            elem.attr('role', 'button');\n          }\n\n          if ($aria.config('tabindex') && !elem.attr('tabindex')) {\n            elem.attr('tabindex', 0);\n          }\n\n          if ($aria.config('bindKeydown') && !attr.ngKeydown && !attr.ngKeypress && !attr.ngKeyup) {\n            elem.on('keydown', function(event) {\n              var keyCode = event.which || event.keyCode;\n\n              if (keyCode === 13 || keyCode === 32) {\n                // If the event is triggered on a non-interactive element ...\n                if (nodeBlackList.indexOf(event.target.nodeName) === -1 && !event.target.isContentEditable) {\n                  // ... prevent the default browser behavior (e.g. scrolling when pressing spacebar)\n                  // See https://github.com/angular/angular.js/issues/16664\n                  event.preventDefault();\n                }\n                scope.$apply(callback);\n              }\n\n              function callback() {\n                fn(scope, { $event: event });\n              }\n            });\n          }\n        }\n      };\n    }\n  };\n}])\n.directive('ngDblclick', ['$aria', function($aria) {\n  return function(scope, elem, attr) {\n    if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n    if ($aria.config('tabindex') && !elem.attr('tabindex') && !isNodeOneOf(elem, nodeBlackList)) {\n      elem.attr('tabindex', 0);\n    }\n  };\n}]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-cookies.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngCookies\n * @description\n *\n * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.\n *\n * See {@link ngCookies.$cookies `$cookies`} for usage.\n */\n\n\nangular.module('ngCookies', ['ng']).\n  info({ angularVersion: '1.7.8' }).\n  /**\n   * @ngdoc provider\n   * @name $cookiesProvider\n   * @description\n   * Use `$cookiesProvider` to change the default behavior of the {@link ngCookies.$cookies $cookies} service.\n   * */\n   provider('$cookies', [/** @this */function $CookiesProvider() {\n    /**\n     * @ngdoc property\n     * @name $cookiesProvider#defaults\n     * @description\n     *\n     * Object containing default options to pass when setting cookies.\n     *\n     * The object may have following properties:\n     *\n     * - **path** - `{string}` - The cookie will be available only for this path and its\n     *   sub-paths. By default, this is the URL that appears in your `<base>` tag.\n     * - **domain** - `{string}` - The cookie will be available only for this domain and\n     *   its sub-domains. For security reasons the user agent will not accept the cookie\n     *   if the current domain is not a sub-domain of this domain or equal to it.\n     * - **expires** - `{string|Date}` - String of the form \"Wdy, DD Mon YYYY HH:MM:SS GMT\"\n     *   or a Date object indicating the exact date/time this cookie will expire.\n     * - **secure** - `{boolean}` - If `true`, then the cookie will only be available through a\n     *   secured connection.\n     * - **samesite** - `{string}` - prevents the browser from sending the cookie along with cross-site requests.\n     *   Accepts the values `lax` and `strict`. See the [OWASP Wiki](https://www.owasp.org/index.php/SameSite)\n     *   for more info. Note that as of May 2018, not all browsers support `SameSite`,\n     *   so it cannot be used as a single measure against Cross-Site-Request-Forgery (CSRF) attacks.\n     *\n     * Note: By default, the address that appears in your `<base>` tag will be used as the path.\n     * This is important so that cookies will be visible for all routes when html5mode is enabled.\n     *\n     * @example\n     *\n     * ```js\n     * angular.module('cookiesProviderExample', ['ngCookies'])\n     *   .config(['$cookiesProvider', function($cookiesProvider) {\n     *     // Setting default options\n     *     $cookiesProvider.defaults.domain = 'foo.com';\n     *     $cookiesProvider.defaults.secure = true;\n     *   }]);\n     * ```\n     **/\n    var defaults = this.defaults = {};\n\n    function calcOptions(options) {\n      return options ? angular.extend({}, defaults, options) : defaults;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $cookies\n     *\n     * @description\n     * Provides read/write access to browser's cookies.\n     *\n     * <div class=\"alert alert-info\">\n     * Up until AngularJS 1.3, `$cookies` exposed properties that represented the\n     * current browser cookie values. In version 1.4, this behavior has changed, and\n     * `$cookies` now provides a standard api of getters, setters etc.\n     * </div>\n     *\n     * Requires the {@link ngCookies `ngCookies`} module to be installed.\n     *\n     * @example\n     *\n     * ```js\n     * angular.module('cookiesExample', ['ngCookies'])\n     *   .controller('ExampleController', ['$cookies', function($cookies) {\n     *     // Retrieving a cookie\n     *     var favoriteCookie = $cookies.get('myFavorite');\n     *     // Setting a cookie\n     *     $cookies.put('myFavorite', 'oatmeal');\n     *   }]);\n     * ```\n     */\n    this.$get = ['$$cookieReader', '$$cookieWriter', function($$cookieReader, $$cookieWriter) {\n      return {\n        /**\n         * @ngdoc method\n         * @name $cookies#get\n         *\n         * @description\n         * Returns the value of given cookie key\n         *\n         * @param {string} key Id to use for lookup.\n         * @returns {string} Raw cookie value.\n         */\n        get: function(key) {\n          return $$cookieReader()[key];\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#getObject\n         *\n         * @description\n         * Returns the deserialized value of given cookie key\n         *\n         * @param {string} key Id to use for lookup.\n         * @returns {Object} Deserialized cookie value.\n         */\n        getObject: function(key) {\n          var value = this.get(key);\n          return value ? angular.fromJson(value) : value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#getAll\n         *\n         * @description\n         * Returns a key value object with all the cookies\n         *\n         * @returns {Object} All cookies\n         */\n        getAll: function() {\n          return $$cookieReader();\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#put\n         *\n         * @description\n         * Sets a value for given cookie key\n         *\n         * @param {string} key Id for the `value`.\n         * @param {string} value Raw value to be stored.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        put: function(key, value, options) {\n          $$cookieWriter(key, value, calcOptions(options));\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#putObject\n         *\n         * @description\n         * Serializes and sets a value for given cookie key\n         *\n         * @param {string} key Id for the `value`.\n         * @param {Object} value Value to be stored.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        putObject: function(key, value, options) {\n          this.put(key, angular.toJson(value), options);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#remove\n         *\n         * @description\n         * Remove given cookie\n         *\n         * @param {string} key Id of the key-value pair to delete.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        remove: function(key, options) {\n          $$cookieWriter(key, undefined, calcOptions(options));\n        }\n      };\n    }];\n  }]);\n\n/**\n * @name $$cookieWriter\n * @requires $document\n *\n * @description\n * This is a private service for writing cookies\n *\n * @param {string} name Cookie name\n * @param {string=} value Cookie value (if undefined, cookie will be deleted)\n * @param {Object=} options Object with options that need to be stored for the cookie.\n */\nfunction $$CookieWriter($document, $log, $browser) {\n  var cookiePath = $browser.baseHref();\n  var rawDocument = $document[0];\n\n  function buildCookieString(name, value, options) {\n    var path, expires;\n    options = options || {};\n    expires = options.expires;\n    path = angular.isDefined(options.path) ? options.path : cookiePath;\n    if (angular.isUndefined(value)) {\n      expires = 'Thu, 01 Jan 1970 00:00:00 GMT';\n      value = '';\n    }\n    if (angular.isString(expires)) {\n      expires = new Date(expires);\n    }\n\n    var str = encodeURIComponent(name) + '=' + encodeURIComponent(value);\n    str += path ? ';path=' + path : '';\n    str += options.domain ? ';domain=' + options.domain : '';\n    str += expires ? ';expires=' + expires.toUTCString() : '';\n    str += options.secure ? ';secure' : '';\n    str += options.samesite ? ';samesite=' + options.samesite : '';\n\n    // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:\n    // - 300 cookies\n    // - 20 cookies per unique domain\n    // - 4096 bytes per cookie\n    var cookieLength = str.length + 1;\n    if (cookieLength > 4096) {\n      $log.warn('Cookie \\'' + name +\n        '\\' possibly not set or overflowed because it was too large (' +\n        cookieLength + ' > 4096 bytes)!');\n    }\n\n    return str;\n  }\n\n  return function(name, value, options) {\n    rawDocument.cookie = buildCookieString(name, value, options);\n  };\n}\n\n$$CookieWriter.$inject = ['$document', '$log', '$browser'];\n\nangular.module('ngCookies').provider('$$cookieWriter', /** @this */ function $$CookieWriterProvider() {\n  this.$get = $$CookieWriter;\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-csp.css",
    "content": "/* Include this file in your html if you are using the CSP mode. */\n\n@charset \"UTF-8\";\n\n[ng\\:cloak],\n[ng-cloak],\n[data-ng-cloak],\n[x-ng-cloak],\n.ng-cloak,\n.x-ng-cloak,\n.ng-hide:not(.ng-hide-animate) {\n  display: none !important;\n}\n\nng\\:form {\n  display: block;\n}\n\n.ng-animate-shim {\n  visibility:hidden;\n}\n\n.ng-anchor {\n  position:absolute;\n}\n"
  },
  {
    "path": "app/vendor/angular/angular-loader.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n\n(function() {'use strict';\n    // NOTE:\n    // These functions are copied here from `src/Angular.js`, because they are needed inside the\n    // `angular-loader.js` closure and need to be available before the main `angular.js` script has\n    // been loaded.\n    function isFunction(value) {return typeof value === 'function';}\n    function isDefined(value) {return typeof value !== 'undefined';}\n    function isNumber(value) {return typeof value === 'number';}\n    function isObject(value) {return value !== null && typeof value === 'object';}\n    function isScope(obj) {return obj && obj.$evalAsync && obj.$watch;}\n    function isUndefined(value) {return typeof value === 'undefined';}\n    function isWindow(obj) {return obj && obj.window === obj;}\n    function sliceArgs(args, startIndex) {return Array.prototype.slice.call(args, startIndex || 0);}\n    function toJsonReplacer(key, value) {\n      var val = value;\n\n      if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {\n        val = undefined;\n      } else if (isWindow(value)) {\n        val = '$WINDOW';\n      } else if (value &&  window.document === value) {\n        val = '$DOCUMENT';\n      } else if (isScope(value)) {\n        val = '$SCOPE';\n      }\n\n      return val;\n    }\n\n/* exported toDebugString */\n\nfunction serializeObject(obj, maxDepth) {\n  var seen = [];\n\n  // There is no direct way to stringify object until reaching a specific depth\n  // and a very deep object can cause a performance issue, so we copy the object\n  // based on this specific depth and then stringify it.\n  if (isValidObjectMaxDepth(maxDepth)) {\n    // This file is also included in `angular-loader`, so `copy()` might not always be available in\n    // the closure. Therefore, it is lazily retrieved as `angular.copy()` when needed.\n    obj = angular.copy(obj, null, maxDepth);\n  }\n  return JSON.stringify(obj, function(key, val) {\n    val = toJsonReplacer(key, val);\n    if (isObject(val)) {\n\n      if (seen.indexOf(val) >= 0) return '...';\n\n      seen.push(val);\n    }\n    return val;\n  });\n}\n\nfunction toDebugString(obj, maxDepth) {\n  if (typeof obj === 'function') {\n    return obj.toString().replace(/ \\{[\\s\\S]*$/, '');\n  } else if (isUndefined(obj)) {\n    return 'undefined';\n  } else if (typeof obj !== 'string') {\n    return serializeObject(obj, maxDepth);\n  }\n  return obj;\n}\n\n/* exported\n  minErrConfig,\n  errorHandlingConfig,\n  isValidObjectMaxDepth\n*/\n\nvar minErrConfig = {\n  objectMaxDepth: 5,\n  urlErrorParamsEnabled: true\n};\n\n/**\n * @ngdoc function\n * @name angular.errorHandlingConfig\n * @module ng\n * @kind function\n *\n * @description\n * Configure several aspects of error handling in AngularJS if used as a setter or return the\n * current configuration if used as a getter. The following options are supported:\n *\n * - **objectMaxDepth**: The maximum depth to which objects are traversed when stringified for error messages.\n *\n * Omitted or undefined options will leave the corresponding configuration values unchanged.\n *\n * @param {Object=} config - The configuration object. May only contain the options that need to be\n *     updated. Supported keys:\n *\n * * `objectMaxDepth`  **{Number}** - The max depth for stringifying objects. Setting to a\n *   non-positive or non-numeric value, removes the max depth limit.\n *   Default: 5\n *\n * * `urlErrorParamsEnabled`  **{Boolean}** - Specifies wether the generated error url will\n *   contain the parameters of the thrown error. Disabling the parameters can be useful if the\n *   generated error url is very long.\n *\n *   Default: true. When used without argument, it returns the current value.\n */\nfunction errorHandlingConfig(config) {\n  if (isObject(config)) {\n    if (isDefined(config.objectMaxDepth)) {\n      minErrConfig.objectMaxDepth = isValidObjectMaxDepth(config.objectMaxDepth) ? config.objectMaxDepth : NaN;\n    }\n    if (isDefined(config.urlErrorParamsEnabled) && isBoolean(config.urlErrorParamsEnabled)) {\n      minErrConfig.urlErrorParamsEnabled = config.urlErrorParamsEnabled;\n    }\n  } else {\n    return minErrConfig;\n  }\n}\n\n/**\n * @private\n * @param {Number} maxDepth\n * @return {boolean}\n */\nfunction isValidObjectMaxDepth(maxDepth) {\n  return isNumber(maxDepth) && maxDepth > 0;\n}\n\n\n/**\n * @description\n *\n * This object provides a utility for producing rich Error messages within\n * AngularJS. It can be called as follows:\n *\n * var exampleMinErr = minErr('example');\n * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\n *\n * The above creates an instance of minErr in the example namespace. The\n * resulting error will have a namespaced error code of example.one.  The\n * resulting error will replace {0} with the value of foo, and {1} with the\n * value of bar. The object is not restricted in the number of arguments it can\n * take.\n *\n * If fewer arguments are specified than necessary for interpolation, the extra\n * interpolation markers will be preserved in the final string.\n *\n * Since data will be parsed statically during a build step, some restrictions\n * are applied with respect to how minErr instances are created and called.\n * Instances should have names of the form namespaceMinErr for a minErr created\n * using minErr('namespace') . Error codes, namespaces and template strings\n * should all be static strings, not variables or general expressions.\n *\n * @param {string} module The namespace to use for the new minErr instance.\n * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning\n *   error from returned function, for cases when a particular type of error is useful.\n * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\n */\n\nfunction minErr(module, ErrorConstructor) {\n  ErrorConstructor = ErrorConstructor || Error;\n\n  var url = 'https://errors.angularjs.org/1.7.8/';\n  var regex = url.replace('.', '\\\\.') + '[\\\\s\\\\S]*';\n  var errRegExp = new RegExp(regex, 'g');\n\n  return function() {\n    var code = arguments[0],\n      template = arguments[1],\n      message = '[' + (module ? module + ':' : '') + code + '] ',\n      templateArgs = sliceArgs(arguments, 2).map(function(arg) {\n        return toDebugString(arg, minErrConfig.objectMaxDepth);\n      }),\n      paramPrefix, i;\n\n    // A minErr message has two parts: the message itself and the url that contains the\n    // encoded message.\n    // The message's parameters can contain other error messages which also include error urls.\n    // To prevent the messages from getting too long, we strip the error urls from the parameters.\n\n    message += template.replace(/\\{\\d+\\}/g, function(match) {\n      var index = +match.slice(1, -1);\n\n      if (index < templateArgs.length) {\n        return templateArgs[index].replace(errRegExp, '');\n      }\n\n      return match;\n    });\n\n    message += '\\n' + url + (module ? module + '/' : '') + code;\n\n    if (minErrConfig.urlErrorParamsEnabled) {\n      for (i = 0, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {\n        message += paramPrefix + 'p' + i + '=' + encodeURIComponent(templateArgs[i]);\n      }\n    }\n\n    return new ErrorConstructor(message);\n  };\n}\n\n/**\n * @ngdoc type\n * @name angular.Module\n * @module ng\n * @description\n *\n * Interface for configuring AngularJS {@link angular.module modules}.\n */\n\nfunction setupModuleLoader(window) {\n\n  var $injectorMinErr = minErr('$injector');\n  var ngMinErr = minErr('ng');\n\n  function ensure(obj, name, factory) {\n    return obj[name] || (obj[name] = factory());\n  }\n\n  var angular = ensure(window, 'angular', Object);\n\n  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\n  angular.$$minErr = angular.$$minErr || minErr;\n\n  return ensure(angular, 'module', function() {\n    /** @type {Object.<string, angular.Module>} */\n    var modules = {};\n\n    /**\n     * @ngdoc function\n     * @name angular.module\n     * @module ng\n     * @description\n     *\n     * The `angular.module` is a global place for creating, registering and retrieving AngularJS\n     * modules.\n     * All modules (AngularJS core or 3rd party) that should be available to an application must be\n     * registered using this mechanism.\n     *\n     * Passing one argument retrieves an existing {@link angular.Module},\n     * whereas passing more than one argument creates a new {@link angular.Module}\n     *\n     *\n     * # Module\n     *\n     * A module is a collection of services, directives, controllers, filters, and configuration information.\n     * `angular.module` is used to configure the {@link auto.$injector $injector}.\n     *\n     * ```js\n     * // Create a new module\n     * var myModule = angular.module('myModule', []);\n     *\n     * // register a new service\n     * myModule.value('appName', 'MyCoolApp');\n     *\n     * // configure existing services inside initialization blocks.\n     * myModule.config(['$locationProvider', function($locationProvider) {\n     *   // Configure existing providers\n     *   $locationProvider.hashPrefix('!');\n     * }]);\n     * ```\n     *\n     * Then you can create an injector and load your modules like this:\n     *\n     * ```js\n     * var injector = angular.injector(['ng', 'myModule'])\n     * ```\n     *\n     * However it's more likely that you'll just use\n     * {@link ng.directive:ngApp ngApp} or\n     * {@link angular.bootstrap} to simplify this process for you.\n     *\n     * @param {!string} name The name of the module to create or retrieve.\n     * @param {!Array.<string>=} requires If specified then new module is being created. If\n     *        unspecified then the module is being retrieved for further configuration.\n     * @param {Function=} configFn Optional configuration function for the module. Same as\n     *        {@link angular.Module#config Module#config()}.\n     * @returns {angular.Module} new module with the {@link angular.Module} api.\n     */\n    return function module(name, requires, configFn) {\n\n      var info = {};\n\n      var assertNotHasOwnProperty = function(name, context) {\n        if (name === 'hasOwnProperty') {\n          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n        }\n      };\n\n      assertNotHasOwnProperty(name, 'module');\n      if (requires && modules.hasOwnProperty(name)) {\n        modules[name] = null;\n      }\n      return ensure(modules, name, function() {\n        if (!requires) {\n          throw $injectorMinErr('nomod', 'Module \\'{0}\\' is not available! You either misspelled ' +\n             'the module name or forgot to load it. If registering a module ensure that you ' +\n             'specify the dependencies as the second argument.', name);\n        }\n\n        /** @type {!Array.<Array.<*>>} */\n        var invokeQueue = [];\n\n        /** @type {!Array.<Function>} */\n        var configBlocks = [];\n\n        /** @type {!Array.<Function>} */\n        var runBlocks = [];\n\n        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);\n\n        /** @type {angular.Module} */\n        var moduleInstance = {\n          // Private state\n          _invokeQueue: invokeQueue,\n          _configBlocks: configBlocks,\n          _runBlocks: runBlocks,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#info\n           * @module ng\n           *\n           * @param {Object=} info Information about the module\n           * @returns {Object|Module} The current info object for this module if called as a getter,\n           *                          or `this` if called as a setter.\n           *\n           * @description\n           * Read and write custom information about this module.\n           * For example you could put the version of the module in here.\n           *\n           * ```js\n           * angular.module('myModule', []).info({ version: '1.0.0' });\n           * ```\n           *\n           * The version could then be read back out by accessing the module elsewhere:\n           *\n           * ```\n           * var version = angular.module('myModule').info().version;\n           * ```\n           *\n           * You can also retrieve this information during runtime via the\n           * {@link $injector#modules `$injector.modules`} property:\n           *\n           * ```js\n           * var version = $injector.modules['myModule'].info().version;\n           * ```\n           */\n          info: function(value) {\n            if (isDefined(value)) {\n              if (!isObject(value)) throw ngMinErr('aobj', 'Argument \\'{0}\\' must be an object', 'value');\n              info = value;\n              return this;\n            }\n            return info;\n          },\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#requires\n           * @module ng\n           *\n           * @description\n           * Holds the list of modules which the injector will load before the current module is\n           * loaded.\n           */\n          requires: requires,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#name\n           * @module ng\n           *\n           * @description\n           * Name of the module.\n           */\n          name: name,\n\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#provider\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerType Construction function for creating new instance of the\n           *                                service.\n           * @description\n           * See {@link auto.$provide#provider $provide.provider()}.\n           */\n          provider: invokeLaterAndSetModuleName('$provide', 'provider'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#factory\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerFunction Function for creating new instance of the service.\n           * @description\n           * See {@link auto.$provide#factory $provide.factory()}.\n           */\n          factory: invokeLaterAndSetModuleName('$provide', 'factory'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#service\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} constructor A constructor function that will be instantiated.\n           * @description\n           * See {@link auto.$provide#service $provide.service()}.\n           */\n          service: invokeLaterAndSetModuleName('$provide', 'service'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#value\n           * @module ng\n           * @param {string} name service name\n           * @param {*} object Service instance object.\n           * @description\n           * See {@link auto.$provide#value $provide.value()}.\n           */\n          value: invokeLater('$provide', 'value'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#constant\n           * @module ng\n           * @param {string} name constant name\n           * @param {*} object Constant value.\n           * @description\n           * Because the constants are fixed, they get applied before other provide methods.\n           * See {@link auto.$provide#constant $provide.constant()}.\n           */\n          constant: invokeLater('$provide', 'constant', 'unshift'),\n\n           /**\n           * @ngdoc method\n           * @name angular.Module#decorator\n           * @module ng\n           * @param {string} name The name of the service to decorate.\n           * @param {Function} decorFn This function will be invoked when the service needs to be\n           *                           instantiated and should return the decorated service instance.\n           * @description\n           * See {@link auto.$provide#decorator $provide.decorator()}.\n           */\n          decorator: invokeLaterAndSetModuleName('$provide', 'decorator', configBlocks),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#animation\n           * @module ng\n           * @param {string} name animation name\n           * @param {Function} animationFactory Factory function for creating new instance of an\n           *                                    animation.\n           * @description\n           *\n           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\n           *\n           *\n           * Defines an animation hook that can be later used with\n           * {@link $animate $animate} service and directives that use this service.\n           *\n           * ```js\n           * module.animation('.animation-name', function($inject1, $inject2) {\n           *   return {\n           *     eventName : function(element, done) {\n           *       //code to run the animation\n           *       //once complete, then run done()\n           *       return function cancellationFunction(element) {\n           *         //code to cancel the animation\n           *       }\n           *     }\n           *   }\n           * })\n           * ```\n           *\n           * See {@link ng.$animateProvider#register $animateProvider.register()} and\n           * {@link ngAnimate ngAnimate module} for more information.\n           */\n          animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#filter\n           * @module ng\n           * @param {string} name Filter name - this must be a valid AngularJS expression identifier\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\n           * @description\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\n           *\n           * <div class=\"alert alert-warning\">\n           * **Note:** Filter names must be valid AngularJS {@link expression} identifiers, such as `uppercase` or `orderBy`.\n           * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n           * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n           * (`myapp_subsection_filterx`).\n           * </div>\n           */\n          filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#controller\n           * @module ng\n           * @param {string|Object} name Controller name, or an object map of controllers where the\n           *    keys are the names and the values are the constructors.\n           * @param {Function} constructor Controller constructor function.\n           * @description\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\n           */\n          controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#directive\n           * @module ng\n           * @param {string|Object} name Directive name, or an object map of directives where the\n           *    keys are the names and the values are the factories.\n           * @param {Function} directiveFactory Factory function for creating new instance of\n           * directives.\n           * @description\n           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\n           */\n          directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#component\n           * @module ng\n           * @param {string|Object} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`),\n           *    or an object map of components where the keys are the names and the values are the component definition objects.\n           * @param {Object} options Component definition object (a simplified\n           *    {@link ng.$compile#directive-definition-object directive definition object})\n           *\n           * @description\n           * See {@link ng.$compileProvider#component $compileProvider.component()}.\n           */\n          component: invokeLaterAndSetModuleName('$compileProvider', 'component'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#config\n           * @module ng\n           * @param {Function} configFn Execute this function on module load. Useful for service\n           *    configuration.\n           * @description\n           * Use this method to configure services by injecting their\n           * {@link angular.Module#provider `providers`}, e.g. for adding routes to the\n           * {@link ngRoute.$routeProvider $routeProvider}.\n           *\n           * Note that you can only inject {@link angular.Module#provider `providers`} and\n           * {@link angular.Module#constant `constants`} into this function.\n           *\n           * For more about how to configure services, see\n           * {@link providers#provider-recipe Provider Recipe}.\n           */\n          config: config,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#run\n           * @module ng\n           * @param {Function} initializationFn Execute this function after injector creation.\n           *    Useful for application initialization.\n           * @description\n           * Use this method to register work which should be performed when the injector is done\n           * loading all modules.\n           */\n          run: function(block) {\n            runBlocks.push(block);\n            return this;\n          }\n        };\n\n        if (configFn) {\n          config(configFn);\n        }\n\n        return moduleInstance;\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @param {String=} insertMethod\n         * @returns {angular.Module}\n         */\n        function invokeLater(provider, method, insertMethod, queue) {\n          if (!queue) queue = invokeQueue;\n          return function() {\n            queue[insertMethod || 'push']([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @returns {angular.Module}\n         */\n        function invokeLaterAndSetModuleName(provider, method, queue) {\n          if (!queue) queue = invokeQueue;\n          return function(recipeName, factoryFunction) {\n            if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;\n            queue.push([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n      });\n    };\n  });\n\n}\n\nsetupModuleLoader(window);\n})(window);\n\n/**\n * Closure compiler type information\n *\n * @typedef { {\n *   requires: !Array.<string>,\n *   invokeQueue: !Array.<Array.<*>>,\n *\n *   service: function(string, Function):angular.Module,\n *   factory: function(string, Function):angular.Module,\n *   value: function(string, *):angular.Module,\n *\n *   filter: function(string, Function):angular.Module,\n *\n *   init: function(Function):angular.Module\n * } }\n */\nangular.Module;\n\n"
  },
  {
    "path": "app/vendor/angular/angular-message-format.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global isFunction: false */\n/* global noop: false */\n/* global toJson: false */\n/* global $$stringify: false */\n\n// Convert an index into the string into line/column for use in error messages\n// As such, this doesn't have to be efficient.\nfunction indexToLineAndColumn(text, index) {\n  var lines = text.split(/\\n/g);\n  for (var i = 0; i < lines.length; i++) {\n    var line = lines[i];\n    if (index >= line.length) {\n      index -= line.length;\n    } else {\n      return { line: i + 1, column: index + 1 };\n    }\n  }\n}\nvar PARSE_CACHE_FOR_TEXT_LITERALS = Object.create(null);\n\nfunction parseTextLiteral(text) {\n  var cachedFn = PARSE_CACHE_FOR_TEXT_LITERALS[text];\n  if (cachedFn != null) {\n    return cachedFn;\n  }\n  function parsedFn(context) { return text; }\n  parsedFn['$$watchDelegate'] = function watchDelegate(scope, listener, objectEquality) {\n    var unwatch = scope['$watch'](noop,\n        function textLiteralWatcher() {\n          listener(text, text, scope);\n          unwatch();\n        },\n        objectEquality);\n    return unwatch;\n  };\n  PARSE_CACHE_FOR_TEXT_LITERALS[text] = parsedFn;\n  parsedFn['exp'] = text; // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n  parsedFn['expressions'] = []; // Require this to call $compile.$$addBindingInfo() which allows Protractor to find elements by binding.\n  return parsedFn;\n}\n\nfunction subtractOffset(expressionFn, offset) {\n  if (offset === 0) {\n    return expressionFn;\n  }\n  function minusOffset(value) {\n    return (value == null) ? value : value - offset;\n  }\n  function parsedFn(context) { return minusOffset(expressionFn(context)); }\n  var unwatch;\n  parsedFn['$$watchDelegate'] = function watchDelegate(scope, listener, objectEquality) {\n    unwatch = scope['$watch'](expressionFn,\n        function pluralExpressionWatchListener(newValue, oldValue) {\n          listener(minusOffset(newValue), minusOffset(oldValue), scope);\n        },\n        objectEquality);\n    return unwatch;\n  };\n  return parsedFn;\n}\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: false */\n/* global isFunction: false */\n/* global noop: false */\n\n/**\n * @constructor\n * @private\n */\nfunction MessageSelectorBase(expressionFn, choices) {\n  var self = this;\n  this.expressionFn = expressionFn;\n  this.choices = choices;\n  if (choices['other'] === undefined) {\n    throw $interpolateMinErr('reqother', '“other” is a required option.');\n  }\n  this.parsedFn = function(context) { return self.getResult(context); };\n  this.parsedFn['$$watchDelegate'] = function $$watchDelegate(scope, listener, objectEquality) {\n    return self.watchDelegate(scope, listener, objectEquality);\n  };\n  this.parsedFn['exp'] = expressionFn['exp'];\n  this.parsedFn['expressions'] = expressionFn['expressions'];\n}\n\nMessageSelectorBase.prototype.getMessageFn = function getMessageFn(value) {\n  return this.choices[this.categorizeValue(value)];\n};\n\nMessageSelectorBase.prototype.getResult = function getResult(context) {\n  return this.getMessageFn(this.expressionFn(context))(context);\n};\n\nMessageSelectorBase.prototype.watchDelegate = function watchDelegate(scope, listener, objectEquality) {\n  var watchers = new MessageSelectorWatchers(this, scope, listener, objectEquality);\n  return function() { watchers.cancelWatch(); };\n};\n\n/**\n * @constructor\n * @private\n */\nfunction MessageSelectorWatchers(msgSelector, scope, listener, objectEquality) {\n  var self = this;\n  this.scope = scope;\n  this.msgSelector = msgSelector;\n  this.listener = listener;\n  this.objectEquality = objectEquality;\n  this.lastMessage = undefined;\n  this.messageFnWatcher = noop;\n  var expressionFnListener = function(newValue, oldValue) { return self.expressionFnListener(newValue, oldValue); };\n  this.expressionFnWatcher = scope['$watch'](msgSelector.expressionFn, expressionFnListener, objectEquality);\n}\n\nMessageSelectorWatchers.prototype.expressionFnListener = function expressionFnListener(newValue, oldValue) {\n  var self = this;\n  this.messageFnWatcher();\n  var messageFnListener = function(newMessage, oldMessage) { return self.messageFnListener(newMessage, oldMessage); };\n  var messageFn = this.msgSelector.getMessageFn(newValue);\n  this.messageFnWatcher = this.scope['$watch'](messageFn, messageFnListener, this.objectEquality);\n};\n\nMessageSelectorWatchers.prototype.messageFnListener = function messageFnListener(newMessage, oldMessage) {\n  this.listener.call(null, newMessage, newMessage === oldMessage ? newMessage : this.lastMessage, this.scope);\n  this.lastMessage = newMessage;\n};\n\nMessageSelectorWatchers.prototype.cancelWatch = function cancelWatch() {\n  this.expressionFnWatcher();\n  this.messageFnWatcher();\n};\n\n/**\n * @constructor\n * @extends MessageSelectorBase\n * @private\n */\nfunction SelectMessage(expressionFn, choices) {\n  MessageSelectorBase.call(this, expressionFn, choices);\n}\n\nfunction SelectMessageProto() {}\nSelectMessageProto.prototype = MessageSelectorBase.prototype;\n\nSelectMessage.prototype = new SelectMessageProto();\nSelectMessage.prototype.categorizeValue = function categorizeSelectValue(value) {\n  return (this.choices[value] !== undefined) ? value : 'other';\n};\n\n/**\n * @constructor\n * @extends MessageSelectorBase\n * @private\n */\nfunction PluralMessage(expressionFn, choices, offset, pluralCat) {\n  MessageSelectorBase.call(this, expressionFn, choices);\n  this.offset = offset;\n  this.pluralCat = pluralCat;\n}\n\nfunction PluralMessageProto() {}\nPluralMessageProto.prototype = MessageSelectorBase.prototype;\n\nPluralMessage.prototype = new PluralMessageProto();\nPluralMessage.prototype.categorizeValue = function categorizePluralValue(value) {\n  if (isNaN(value)) {\n    return 'other';\n  } else if (this.choices[value] !== undefined) {\n    return value;\n  } else {\n    var category = this.pluralCat(value - this.offset);\n    return (this.choices[category] !== undefined) ? category : 'other';\n  }\n};\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: false */\n/* global isFunction: false */\n/* global parseTextLiteral: false */\n\n/**\n * @constructor\n * @private\n */\nfunction InterpolationParts(trustedContext, allOrNothing) {\n  this.trustedContext = trustedContext;\n  this.allOrNothing = allOrNothing;\n  this.textParts = [];\n  this.expressionFns = [];\n  this.expressionIndices = [];\n  this.partialText = '';\n  this.concatParts = null;\n}\n\nInterpolationParts.prototype.flushPartialText = function flushPartialText() {\n  if (this.partialText) {\n    if (this.concatParts == null) {\n      this.textParts.push(this.partialText);\n    } else {\n      this.textParts.push(this.concatParts.join(''));\n      this.concatParts = null;\n    }\n    this.partialText = '';\n  }\n};\n\nInterpolationParts.prototype.addText = function addText(text) {\n  if (text.length) {\n    if (!this.partialText) {\n      this.partialText = text;\n    } else if (this.concatParts) {\n      this.concatParts.push(text);\n    } else {\n      this.concatParts = [this.partialText, text];\n    }\n  }\n};\n\nInterpolationParts.prototype.addExpressionFn = function addExpressionFn(expressionFn) {\n  this.flushPartialText();\n  this.expressionIndices.push(this.textParts.length);\n  this.expressionFns.push(expressionFn);\n  this.textParts.push('');\n};\n\nInterpolationParts.prototype.getExpressionValues = function getExpressionValues(context) {\n  var expressionValues = new Array(this.expressionFns.length);\n  for (var i = 0; i < this.expressionFns.length; i++) {\n    expressionValues[i] = this.expressionFns[i](context);\n  }\n  return expressionValues;\n};\n\nInterpolationParts.prototype.getResult = function getResult(expressionValues) {\n  for (var i = 0; i < this.expressionIndices.length; i++) {\n    var expressionValue = expressionValues[i];\n    if (this.allOrNothing && expressionValue === undefined) return;\n    this.textParts[this.expressionIndices[i]] = expressionValue;\n  }\n  return this.textParts.join('');\n};\n\n\nInterpolationParts.prototype.toParsedFn = function toParsedFn(mustHaveExpression, originalText) {\n  var self = this;\n  this.flushPartialText();\n  if (mustHaveExpression && this.expressionFns.length === 0) {\n    return undefined;\n  }\n  if (this.textParts.length === 0) {\n    return parseTextLiteral('');\n  }\n  if (this.trustedContext && this.textParts.length > 1) {\n    $interpolateMinErr['throwNoconcat'](originalText);\n  }\n  if (this.expressionFns.length === 0) {\n    if (this.textParts.length !== 1) { this.errorInParseLogic(); }\n    return parseTextLiteral(this.textParts[0]);\n  }\n  var parsedFn = function(context) {\n    return self.getResult(self.getExpressionValues(context));\n  };\n  parsedFn['$$watchDelegate'] = function $$watchDelegate(scope, listener, objectEquality) {\n    return self.watchDelegate(scope, listener, objectEquality);\n  };\n\n  parsedFn['exp'] = originalText; // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n  parsedFn['expressions'] = new Array(this.expressionFns.length); // Require this to call $compile.$$addBindingInfo() which allows Protractor to find elements by binding.\n  for (var i = 0; i < this.expressionFns.length; i++) {\n    parsedFn['expressions'][i] = this.expressionFns[i]['exp'];\n  }\n\n  return parsedFn;\n};\n\nInterpolationParts.prototype.watchDelegate = function watchDelegate(scope, listener, objectEquality) {\n  var watcher = new InterpolationPartsWatcher(this, scope, listener, objectEquality);\n  return function() { watcher.cancelWatch(); };\n};\n\nfunction InterpolationPartsWatcher(interpolationParts, scope, listener, objectEquality) {\n  this.interpolationParts = interpolationParts;\n  this.scope = scope;\n  this.previousResult = (undefined);\n  this.listener = listener;\n  var self = this;\n  this.expressionFnsWatcher = scope['$watchGroup'](interpolationParts.expressionFns, function(newExpressionValues, oldExpressionValues) {\n    self.watchListener(newExpressionValues, oldExpressionValues);\n  });\n}\n\nInterpolationPartsWatcher.prototype.watchListener = function watchListener(newExpressionValues, oldExpressionValues) {\n  var result = this.interpolationParts.getResult(newExpressionValues);\n  this.listener.call(null, result, newExpressionValues === oldExpressionValues ? result : this.previousResult, this.scope);\n  this.previousResult = result;\n};\n\nInterpolationPartsWatcher.prototype.cancelWatch = function cancelWatch() {\n  this.expressionFnsWatcher();\n};\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: false */\n/* global indexToLineAndColumn: false */\n/* global InterpolationParts: false */\n/* global PluralMessage: false */\n/* global SelectMessage: false */\n/* global subtractOffset: false */\n\n// The params src and dst are exactly one of two types: NestedParserState or MessageFormatParser.\n// This function is fully optimized by V8. (inspect via IRHydra or --trace-deopt.)\n// The idea behind writing it this way is to avoid repeating oneself.  This is the ONE place where\n// the parser state that is saved/restored when parsing nested mustaches is specified.\nfunction copyNestedParserState(src, dst) {\n  dst.expressionFn = src.expressionFn;\n  dst.expressionMinusOffsetFn = src.expressionMinusOffsetFn;\n  dst.pluralOffset = src.pluralOffset;\n  dst.choices = src.choices;\n  dst.choiceKey = src.choiceKey;\n  dst.interpolationParts = src.interpolationParts;\n  dst.ruleChoiceKeyword = src.ruleChoiceKeyword;\n  dst.msgStartIndex = src.msgStartIndex;\n  dst.expressionStartIndex = src.expressionStartIndex;\n}\n\nfunction NestedParserState(parser) {\n  copyNestedParserState(parser, this);\n}\n\n/**\n * @constructor\n * @private\n */\nfunction MessageFormatParser(text, startIndex, $parse, pluralCat, stringifier,\n                             mustHaveExpression, trustedContext, allOrNothing) {\n  this.text = text;\n  this.index = startIndex || 0;\n  this.$parse = $parse;\n  this.pluralCat = pluralCat;\n  this.stringifier = stringifier;\n  this.mustHaveExpression = !!mustHaveExpression;\n  this.trustedContext = trustedContext;\n  this.allOrNothing = !!allOrNothing;\n  this.expressionFn = null;\n  this.expressionMinusOffsetFn = null;\n  this.pluralOffset = null;\n  this.choices = null;\n  this.choiceKey = null;\n  this.interpolationParts = null;\n  this.msgStartIndex = null;\n  this.nestedStateStack = [];\n  this.parsedFn = null;\n  this.rule = null;\n  this.ruleStack = null;\n  this.ruleChoiceKeyword = null;\n  this.interpNestLevel = null;\n  this.expressionStartIndex = null;\n  this.stringStartIndex = null;\n  this.stringQuote = null;\n  this.stringInterestsRe = null;\n  this.angularOperatorStack = null;\n  this.textPart = null;\n}\n\n// preserve v8 optimization.\nvar EMPTY_STATE = new NestedParserState(new MessageFormatParser(\n        /* text= */ '', /* startIndex= */ 0, /* $parse= */ null, /* pluralCat= */ null, /* stringifier= */ null,\n        /* mustHaveExpression= */ false, /* trustedContext= */ null, /* allOrNothing */ false));\n\nMessageFormatParser.prototype.pushState = function pushState() {\n  this.nestedStateStack.push(new NestedParserState(this));\n  copyNestedParserState(EMPTY_STATE, this);\n};\n\nMessageFormatParser.prototype.popState = function popState() {\n  if (this.nestedStateStack.length === 0) {\n    this.errorInParseLogic();\n  }\n  var previousState = this.nestedStateStack.pop();\n  copyNestedParserState(previousState, this);\n};\n\n// Oh my JavaScript!  Who knew you couldn't match a regex at a specific\n// location in a string but will always search forward?!\n// Apparently you'll be growing this ability via the sticky flag (y) in\n// ES6.  I'll just to work around you for now.\nMessageFormatParser.prototype.matchRe = function matchRe(re, search) {\n  re.lastIndex = this.index;\n  var match = re.exec(this.text);\n  if (match != null && (search === true || (match.index === this.index))) {\n    this.index = re.lastIndex;\n    return match;\n  }\n  return null;\n};\n\nMessageFormatParser.prototype.searchRe = function searchRe(re) {\n  return this.matchRe(re, true);\n};\n\n\nMessageFormatParser.prototype.consumeRe = function consumeRe(re) {\n  // Without the sticky flag, we can't use the .test() method to consume a\n  // match at the current index.  Instead, we'll use the slower .exec() method\n  // and verify match.index.\n  return !!this.matchRe(re);\n};\n\n// Run through our grammar avoiding deeply nested function call chains.\nMessageFormatParser.prototype.run = function run(initialRule) {\n  this.ruleStack = [initialRule];\n  do {\n    this.rule = this.ruleStack.pop();\n    while (this.rule) {\n      this.rule();\n    }\n    this.assertRuleOrNull(this.rule);\n  } while (this.ruleStack.length > 0);\n};\n\nMessageFormatParser.prototype.errorInParseLogic = function errorInParseLogic() {\n    throw $interpolateMinErr('logicbug',\n        'The messageformat parser has encountered an internal error.  Please file a github issue against the AngularJS project and provide this message text that triggers the bug.  Text: “{0}”',\n        this.text);\n};\n\nMessageFormatParser.prototype.assertRuleOrNull = function assertRuleOrNull(rule) {\n  if (rule === undefined) {\n    this.errorInParseLogic();\n  }\n};\n\nvar NEXT_WORD_RE = /\\s*(\\w+)\\s*/g;\nMessageFormatParser.prototype.errorExpecting = function errorExpecting() {\n  // What was wrong with the syntax? Unsupported type, missing comma, or something else?\n  var match = this.matchRe(NEXT_WORD_RE), position;\n  if (match == null) {\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqarg',\n        'Expected one of “plural” or “select” at line {0}, column {1} of text “{2}”',\n        position.line, position.column, this.text);\n  }\n  var word = match[1];\n  if (word === 'select' || word === 'plural') {\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqcomma',\n        'Expected a comma after the keyword “{0}” at line {1}, column {2} of text “{3}”',\n        word, position.line, position.column, this.text);\n  } else {\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('unknarg',\n        'Unsupported keyword “{0}” at line {0}, column {1}. Only “plural” and “select” are currently supported.  Text: “{3}”',\n        word, position.line, position.column, this.text);\n  }\n};\n\nvar STRING_START_RE = /['\"]/g;\nMessageFormatParser.prototype.ruleString = function ruleString() {\n  var match = this.matchRe(STRING_START_RE);\n  if (match == null) {\n    var position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('wantstring',\n        'Expected the beginning of a string at line {0}, column {1} in text “{2}”',\n        position.line, position.column, this.text);\n  }\n  this.startStringAtMatch(match);\n};\n\nMessageFormatParser.prototype.startStringAtMatch = function startStringAtMatch(match) {\n  this.stringStartIndex = match.index;\n  this.stringQuote = match[0];\n  this.stringInterestsRe = this.stringQuote === '\\'' ? SQUOTED_STRING_INTEREST_RE : DQUOTED_STRING_INTEREST_RE;\n  this.rule = this.ruleInsideString;\n};\n\nvar SQUOTED_STRING_INTEREST_RE = /\\\\(?:\\\\|'|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}|[0-7]{3}|\\r\\n|\\n|[\\s\\S])|'/g;\nvar DQUOTED_STRING_INTEREST_RE = /\\\\(?:\\\\|\"|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}|[0-7]{3}|\\r\\n|\\n|[\\s\\S])|\"/g;\nMessageFormatParser.prototype.ruleInsideString = function ruleInsideString() {\n  var match = this.searchRe(this.stringInterestsRe);\n  if (match == null) {\n    var position = indexToLineAndColumn(this.text, this.stringStartIndex);\n    throw $interpolateMinErr('untermstr',\n        'The string beginning at line {0}, column {1} is unterminated in text “{2}”',\n        position.line, position.column, this.text);\n  }\n  if (match[0] === this.stringQuote) {\n    this.rule = null;\n  }\n};\n\nvar PLURAL_OR_SELECT_ARG_TYPE_RE = /\\s*(plural|select)\\s*,\\s*/g;\nMessageFormatParser.prototype.rulePluralOrSelect = function rulePluralOrSelect() {\n  var match = this.searchRe(PLURAL_OR_SELECT_ARG_TYPE_RE);\n  if (match == null) {\n    this.errorExpecting();\n  }\n  var argType = match[1];\n  switch (argType) {\n    case 'plural': this.rule = this.rulePluralStyle; break;\n    case 'select': this.rule = this.ruleSelectStyle; break;\n    default: this.errorInParseLogic();\n  }\n};\n\nMessageFormatParser.prototype.rulePluralStyle = function rulePluralStyle() {\n  this.choices = Object.create(null);\n  this.ruleChoiceKeyword = this.rulePluralValueOrKeyword;\n  this.rule = this.rulePluralOffset;\n};\n\nMessageFormatParser.prototype.ruleSelectStyle = function ruleSelectStyle() {\n  this.choices = Object.create(null);\n  this.ruleChoiceKeyword = this.ruleSelectKeyword;\n  this.rule = this.ruleSelectKeyword;\n};\n\nvar NUMBER_RE = /[0]|(?:[1-9][0-9]*)/g;\nvar PLURAL_OFFSET_RE = new RegExp('\\\\s*offset\\\\s*:\\\\s*(' + NUMBER_RE.source + ')', 'g');\n\nMessageFormatParser.prototype.rulePluralOffset = function rulePluralOffset() {\n  var match = this.matchRe(PLURAL_OFFSET_RE);\n  this.pluralOffset = (match == null) ? 0 : parseInt(match[1], 10);\n  this.expressionMinusOffsetFn = subtractOffset(this.expressionFn, this.pluralOffset);\n  this.rule = this.rulePluralValueOrKeyword;\n};\n\nMessageFormatParser.prototype.assertChoiceKeyIsNew = function assertChoiceKeyIsNew(choiceKey, index) {\n  if (this.choices[choiceKey] !== undefined) {\n    var position = indexToLineAndColumn(this.text, index);\n    throw $interpolateMinErr('dupvalue',\n        'The choice “{0}” is specified more than once. Duplicate key is at line {1}, column {2} in text “{3}”',\n        choiceKey, position.line, position.column, this.text);\n  }\n};\n\nvar SELECT_KEYWORD = /\\s*(\\w+)/g;\nMessageFormatParser.prototype.ruleSelectKeyword = function ruleSelectKeyword() {\n  var match = this.matchRe(SELECT_KEYWORD);\n  if (match == null) {\n    this.parsedFn = new SelectMessage(this.expressionFn, this.choices).parsedFn;\n    this.rule = null;\n    return;\n  }\n  this.choiceKey = match[1];\n  this.assertChoiceKeyIsNew(this.choiceKey, match.index);\n  this.rule = this.ruleMessageText;\n};\n\nvar EXPLICIT_VALUE_OR_KEYWORD_RE = new RegExp('\\\\s*(?:(?:=(' + NUMBER_RE.source + '))|(\\\\w+))', 'g');\nMessageFormatParser.prototype.rulePluralValueOrKeyword = function rulePluralValueOrKeyword() {\n  var match = this.matchRe(EXPLICIT_VALUE_OR_KEYWORD_RE);\n  if (match == null) {\n    this.parsedFn = new PluralMessage(this.expressionFn, this.choices, this.pluralOffset, this.pluralCat).parsedFn;\n    this.rule = null;\n    return;\n  }\n  if (match[1] != null) {\n    this.choiceKey = parseInt(match[1], 10);\n  } else {\n    this.choiceKey = match[2];\n  }\n  this.assertChoiceKeyIsNew(this.choiceKey, match.index);\n  this.rule = this.ruleMessageText;\n};\n\nvar BRACE_OPEN_RE = /\\s*\\{/g;\nvar BRACE_CLOSE_RE = /}/g;\nMessageFormatParser.prototype.ruleMessageText = function ruleMessageText() {\n  if (!this.consumeRe(BRACE_OPEN_RE)) {\n    var position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqopenbrace',\n        'The plural choice “{0}” must be followed by a message in braces at line {1}, column {2} in text “{3}”',\n        this.choiceKey, position.line, position.column, this.text);\n  }\n  this.msgStartIndex = this.index;\n  this.interpolationParts = new InterpolationParts(this.trustedContext, this.allOrNothing);\n  this.rule = this.ruleInInterpolationOrMessageText;\n};\n\n// Note: Since \"\\\" is used as an escape character, don't allow it to be part of the\n// startSymbol/endSymbol when I add the feature to allow them to be redefined.\nvar INTERP_OR_END_MESSAGE_RE = /\\\\.|{{|}/g;\nvar INTERP_OR_PLURALVALUE_OR_END_MESSAGE_RE = /\\\\.|{{|#|}/g;\nvar ESCAPE_OR_MUSTACHE_BEGIN_RE = /\\\\.|{{/g;\nMessageFormatParser.prototype.advanceInInterpolationOrMessageText = function advanceInInterpolationOrMessageText() {\n  var currentIndex = this.index, match;\n  if (this.ruleChoiceKeyword == null) { // interpolation\n    match = this.searchRe(ESCAPE_OR_MUSTACHE_BEGIN_RE);\n    if (match == null) { // End of interpolation text.  Nothing more to process.\n      this.textPart = this.text.substring(currentIndex);\n      this.index = this.text.length;\n      return null;\n    }\n  } else {\n    match = this.searchRe(this.ruleChoiceKeyword === this.rulePluralValueOrKeyword ?\n                          INTERP_OR_PLURALVALUE_OR_END_MESSAGE_RE : INTERP_OR_END_MESSAGE_RE);\n    if (match == null) {\n      var position = indexToLineAndColumn(this.text, this.msgStartIndex);\n      throw $interpolateMinErr('reqendbrace',\n          'The plural/select choice “{0}” message starting at line {1}, column {2} does not have an ending closing brace. Text “{3}”',\n          this.choiceKey, position.line, position.column, this.text);\n    }\n  }\n  // match is non-null.\n  var token = match[0];\n  this.textPart = this.text.substring(currentIndex, match.index);\n  return token;\n};\n\nMessageFormatParser.prototype.ruleInInterpolationOrMessageText = function ruleInInterpolationOrMessageText() {\n  var currentIndex = this.index;\n  var token = this.advanceInInterpolationOrMessageText();\n  if (token == null) {\n    // End of interpolation text.  Nothing more to process.\n    this.index = this.text.length;\n    this.interpolationParts.addText(this.text.substring(currentIndex));\n    this.rule = null;\n    return;\n  }\n  if (token[0] === '\\\\') {\n    // unescape next character and continue\n    this.interpolationParts.addText(this.textPart + token[1]);\n    return;\n  }\n  this.interpolationParts.addText(this.textPart);\n  if (token === '{{') {\n    this.pushState();\n    this.ruleStack.push(this.ruleEndMustacheInInterpolationOrMessage);\n    this.rule = this.ruleEnteredMustache;\n  } else if (token === '}') {\n    this.choices[this.choiceKey] = this.interpolationParts.toParsedFn(/*mustHaveExpression=*/false, this.text);\n    this.rule = this.ruleChoiceKeyword;\n  } else if (token === '#') {\n    this.interpolationParts.addExpressionFn(this.expressionMinusOffsetFn);\n  } else {\n    this.errorInParseLogic();\n  }\n};\n\nMessageFormatParser.prototype.ruleInterpolate = function ruleInterpolate() {\n  this.interpolationParts = new InterpolationParts(this.trustedContext, this.allOrNothing);\n  this.rule = this.ruleInInterpolation;\n};\n\nMessageFormatParser.prototype.ruleInInterpolation = function ruleInInterpolation() {\n  var currentIndex = this.index;\n  var match = this.searchRe(ESCAPE_OR_MUSTACHE_BEGIN_RE);\n  if (match == null) {\n    // End of interpolation text.  Nothing more to process.\n    this.index = this.text.length;\n    this.interpolationParts.addText(this.text.substring(currentIndex));\n    this.parsedFn = this.interpolationParts.toParsedFn(this.mustHaveExpression, this.text);\n    this.rule = null;\n    return;\n  }\n  var token = match[0];\n  if (token[0] === '\\\\') {\n    // unescape next character and continue\n    this.interpolationParts.addText(this.text.substring(currentIndex, match.index) + token[1]);\n    return;\n  }\n  this.interpolationParts.addText(this.text.substring(currentIndex, match.index));\n  this.pushState();\n  this.ruleStack.push(this.ruleInterpolationEndMustache);\n  this.rule = this.ruleEnteredMustache;\n};\n\nMessageFormatParser.prototype.ruleInterpolationEndMustache = function ruleInterpolationEndMustache() {\n  var expressionFn = this.parsedFn;\n  this.popState();\n  this.interpolationParts.addExpressionFn(expressionFn);\n  this.rule = this.ruleInInterpolation;\n};\n\nMessageFormatParser.prototype.ruleEnteredMustache = function ruleEnteredMustache() {\n  this.parsedFn = null;\n  this.ruleStack.push(this.ruleEndMustache);\n  this.rule = this.ruleAngularExpression;\n};\n\nMessageFormatParser.prototype.ruleEndMustacheInInterpolationOrMessage = function ruleEndMustacheInInterpolationOrMessage() {\n  var expressionFn = this.parsedFn;\n  this.popState();\n  this.interpolationParts.addExpressionFn(expressionFn);\n  this.rule = this.ruleInInterpolationOrMessageText;\n};\n\n\n\nvar INTERP_END_RE = /\\s*}}/g;\nMessageFormatParser.prototype.ruleEndMustache = function ruleEndMustache() {\n  var match = this.matchRe(INTERP_END_RE);\n  if (match == null) {\n    var position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqendinterp',\n        'Expecting end of interpolation symbol, “{0}”, at line {1}, column {2} in text “{3}”',\n        '}}', position.line, position.column, this.text);\n  }\n  if (this.parsedFn == null) {\n    // If we parsed a MessageFormat extension, (e.g. select/plural today, maybe more some other\n    // day), then the result *has* to be a string and those rules would have already set\n    // this.parsedFn.  If there was no MessageFormat extension, then there is no requirement to\n    // stringify the result and parsedFn isn't set.  We set it here.  While we could have set it\n    // unconditionally when exiting the AngularJS expression, I intend for us to not just replace\n    // $interpolate, but also to replace $parse in a future version (so ng-bind can work), and in\n    // such a case we do not want to unnecessarily stringify something if it's not going to be used\n    // in a string context.\n    this.parsedFn = this.$parse(this.expressionFn, this.stringifier);\n    this.parsedFn['exp'] = this.expressionFn['exp']; // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n    this.parsedFn['expressions'] = this.expressionFn['expressions']; // Require this to call $compile.$$addBindingInfo() which allows Protractor to find elements by binding.\n  }\n  this.rule = null;\n};\n\nMessageFormatParser.prototype.ruleAngularExpression = function ruleAngularExpression() {\n  this.angularOperatorStack = [];\n  this.expressionStartIndex = this.index;\n  this.rule = this.ruleInAngularExpression;\n};\n\nfunction getEndOperator(opBegin) {\n  switch (opBegin) {\n    case '{': return '}';\n    case '[': return ']';\n    case '(': return ')';\n    default: return null;\n  }\n}\n\nfunction getBeginOperator(opEnd) {\n  switch (opEnd) {\n    case '}': return '{';\n    case ']': return '[';\n    case ')': return '(';\n    default: return null;\n  }\n}\n\n// TODO(chirayu): The interpolation endSymbol must also be accounted for. It\n// just so happens that \"}\" is an operator so it's in the list below.  But we\n// should support any other type of start/end interpolation symbol.\nvar INTERESTING_OPERATORS_RE = /[[\\]{}()'\",]/g;\nMessageFormatParser.prototype.ruleInAngularExpression = function ruleInAngularExpression() {\n  var match = this.searchRe(INTERESTING_OPERATORS_RE);\n  var position;\n  if (match == null) {\n    if (this.angularOperatorStack.length === 0) {\n      // This is the end of the AngularJS expression so this is actually a\n      // success.  Note that when inside an interpolation, this means we even\n      // consumed the closing interpolation symbols if they were curlies.  This\n      // is NOT an error at this point but will become an error further up the\n      // stack when the part that saw the opening curlies is unable to find the\n      // closing ones.\n      this.index = this.text.length;\n      this.expressionFn = this.$parse(this.text.substring(this.expressionStartIndex, this.index));\n      // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n      this.expressionFn['exp'] = this.text.substring(this.expressionStartIndex, this.index);\n      this.expressionFn['expressions'] = this.expressionFn['expressions'];\n      this.rule = null;\n      return;\n    }\n    var innermostOperator = this.angularOperatorStack[0];\n    throw $interpolateMinErr('badexpr',\n        'Unexpected end of AngularJS expression.  Expecting operator “{0}” at the end of the text “{1}”',\n        this.getEndOperator(innermostOperator), this.text);\n  }\n  var operator = match[0];\n  if (operator === '\\'' || operator === '\"') {\n    this.ruleStack.push(this.ruleInAngularExpression);\n    this.startStringAtMatch(match);\n    return;\n  }\n  if (operator === ',') {\n    if (this.trustedContext) {\n      position = indexToLineAndColumn(this.text, this.index);\n      throw $interpolateMinErr('unsafe',\n          'Use of select/plural MessageFormat syntax is currently disallowed in a secure context ({0}).  At line {1}, column {2} of text “{3}”',\n          this.trustedContext, position.line, position.column, this.text);\n    }\n    // only the top level comma has relevance.\n    if (this.angularOperatorStack.length === 0) {\n      // todo: does this need to be trimmed?\n      this.expressionFn = this.$parse(this.text.substring(this.expressionStartIndex, match.index));\n      // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n      this.expressionFn['exp'] = this.text.substring(this.expressionStartIndex, match.index);\n      this.expressionFn['expressions'] = this.expressionFn['expressions'];\n      this.rule = null;\n      this.rule = this.rulePluralOrSelect;\n    }\n    return;\n  }\n  if (getEndOperator(operator) != null) {\n    this.angularOperatorStack.unshift(operator);\n    return;\n  }\n  var beginOperator = getBeginOperator(operator);\n  if (beginOperator == null) {\n    this.errorInParseLogic();\n  }\n  if (this.angularOperatorStack.length > 0) {\n    if (beginOperator === this.angularOperatorStack[0]) {\n      this.angularOperatorStack.shift();\n      return;\n    }\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('badexpr',\n        'Unexpected operator “{0}” at line {1}, column {2} in text. Was expecting “{3}”. Text: “{4}”',\n        operator, position.line, position.column, getEndOperator(this.angularOperatorStack[0]), this.text);\n  }\n  // We are trying to pop off the operator stack but there really isn't anything to pop off.\n  this.index = match.index;\n  this.expressionFn = this.$parse(this.text.substring(this.expressionStartIndex, this.index));\n  // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n  this.expressionFn['exp'] = this.text.substring(this.expressionStartIndex, this.index);\n  this.expressionFn['expressions'] = this.expressionFn['expressions'];\n  this.rule = null;\n};\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: true */\n/* global isFunction: true */\n/* global noop: true */\n/* global toJson: true */\n/* global MessageFormatParser: false */\n\n/**\n * @ngdoc module\n * @name ngMessageFormat\n * @packageName angular-message-format\n *\n * @description\n *\n * ## What is  ngMessageFormat?\n *\n * The ngMessageFormat module extends the AngularJS {@link ng.$interpolate `$interpolate`} service\n * with a syntax for handling pluralization and gender specific messages, which is based on the\n * [ICU MessageFormat syntax][ICU].\n *\n * See [the design doc][ngMessageFormat doc] for more information.\n *\n * [ICU]: http://userguide.icu-project.org/formatparse/messages#TOC-MessageFormat\n * [ngMessageFormat doc]: https://docs.google.com/a/google.com/document/d/1pbtW2yvtmFBikfRrJd8VAsabiFkKezmYZ_PbgdjQOVU/edit\n *\n * ## Examples\n *\n * ### Gender\n *\n * This example uses the \"select\" keyword to specify the message based on gender.\n *\n * <example name=\"ngMessageFormat-example-gender\" module=\"msgFmtExample\" deps=\"angular-message-format.js\">\n * <file name=\"index.html\">\n *  <div ng-controller=\"AppController\">\n *    Select Recipient:<br>\n      <select ng-model=\"recipient\" ng-options=\"person as person.name for person in recipients\">\n      </select>\n      <p>{{recipient.gender, select,\n                male {{{recipient.name}} unwrapped his gift. }\n                female {{{recipient.name}} unwrapped her gift. }\n                other {{{recipient.name}} unwrapped their gift. }\n      }}</p>\n *  </div>\n * </file>\n * <file name=\"script.js\">\n *   function Person(name, gender) {\n *     this.name = name;\n *     this.gender = gender;\n *   }\n *\n *   var alice   = new Person('Alice', 'female'),\n *       bob     = new Person('Bob', 'male'),\n *       ashley = new Person('Ashley', '');\n *\n *   angular.module('msgFmtExample', ['ngMessageFormat'])\n *     .controller('AppController', ['$scope', function($scope) {\n *         $scope.recipients = [alice, bob, ashley];\n *         $scope.recipient = $scope.recipients[0];\n *       }]);\n * </file>\n * </example>\n *\n * ### Plural\n *\n * This example shows how the \"plural\" keyword is used to account for a variable number of entities.\n * The \"#\" variable holds the current number and can be embedded in the message.\n *\n * Note that \"=1\" takes precedence over \"one\".\n *\n * The example also shows the \"offset\" keyword, which allows you to offset the value of the \"#\" variable.\n *\n * <example name=\"ngMessageFormat-example-plural\" module=\"msgFmtExample\" deps=\"angular-message-format.js\">\n * <file name=\"index.html\">\n *   <div ng-controller=\"AppController\">\n *    <button ng-click=\"recipients.pop()\" id=\"decreaseRecipients\">decreaseRecipients</button><br>\n *    Select recipients:<br>\n *    <select multiple size=5 ng-model=\"recipients\" ng-options=\"person as person.name for person in people\">\n *    </select><br>\n *     <p>{{recipients.length, plural, offset:1\n *             =0    {{{sender.name}} gave no gifts (\\#=#)}\n *             =1    {{{sender.name}} gave a gift to {{recipients[0].name}} (\\#=#)}\n *             one   {{{sender.name}} gave {{recipients[0].name}} and one other person a gift (\\#=#)}\n *             other {{{sender.name}} gave {{recipients[0].name}} and # other people a gift (\\#=#)}\n *           }}</p>\n *   </div>\n * </file>\n *\n * <file name=\"script.js\">\n *   function Person(name, gender) {\n *     this.name = name;\n *     this.gender = gender;\n *   }\n *\n *   var alice   = new Person('Alice', 'female'),\n *       bob     = new Person('Bob', 'male'),\n *       sarah     = new Person('Sarah', 'female'),\n *       harry   = new Person('Harry Potter', 'male'),\n *       ashley   = new Person('Ashley', '');\n *\n *   angular.module('msgFmtExample', ['ngMessageFormat'])\n *     .controller('AppController', ['$scope', function($scope) {\n *         $scope.people = [alice, bob, sarah, ashley];\n *         $scope.recipients = [alice, bob, sarah];\n *         $scope.sender = harry;\n *       }]);\n * </file>\n *\n * <file name=\"protractor.js\" type=\"protractor\">\n *   describe('MessageFormat plural', function() {\n *\n *     it('should pluralize initial values', function() {\n *       var messageElem = element(by.binding('recipients.length')),\n *           decreaseRecipientsBtn = element(by.id('decreaseRecipients'));\n *\n *       expect(messageElem.getText()).toEqual('Harry Potter gave Alice and 2 other people a gift (#=2)');\n *       decreaseRecipientsBtn.click();\n *       expect(messageElem.getText()).toEqual('Harry Potter gave Alice and one other person a gift (#=1)');\n *       decreaseRecipientsBtn.click();\n *       expect(messageElem.getText()).toEqual('Harry Potter gave a gift to Alice (#=0)');\n *       decreaseRecipientsBtn.click();\n *       expect(messageElem.getText()).toEqual('Harry Potter gave no gifts (#=-1)');\n *     });\n *   });\n * </file>\n * </example>\n *\n * ### Plural and Gender together\n *\n * This example shows how you can specify gender rules for specific plural matches - in this case,\n * =1 is special cased for gender.\n * <example name=\"ngMessageFormat-example-plural-gender\" module=\"msgFmtExample\" deps=\"angular-message-format.js\">\n *   <file name=\"index.html\">\n *     <div ng-controller=\"AppController\">\n       Select recipients:<br>\n       <select multiple size=5 ng-model=\"recipients\" ng-options=\"person as person.name for person in people\">\n       </select><br>\n        <p>{{recipients.length, plural,\n          =0 {{{sender.name}} has not given any gifts to anyone.}\n          =1 {  {{recipients[0].gender, select,\n                 female { {{sender.name}} gave {{recipients[0].name}} her gift.}\n                 male { {{sender.name}} gave {{recipients[0].name}} his gift.}\n                 other { {{sender.name}} gave {{recipients[0].name}} their gift.}\n                }}\n              }\n          other {{{sender.name}} gave {{recipients.length}} people gifts.}\n          }}</p>\n      </file>\n *    <file name=\"script.js\">\n *      function Person(name, gender) {\n *        this.name = name;\n *        this.gender = gender;\n *      }\n *\n *      var alice   = new Person('Alice', 'female'),\n *          bob     = new Person('Bob', 'male'),\n *          harry   = new Person('Harry Potter', 'male'),\n *          ashley   = new Person('Ashley', '');\n *\n *      angular.module('msgFmtExample', ['ngMessageFormat'])\n *        .controller('AppController', ['$scope', function($scope) {\n *            $scope.people = [alice, bob, ashley];\n *            $scope.recipients = [alice];\n *            $scope.sender = harry;\n *          }]);\n *    </file>\n    </example>\n */\n\nvar $$MessageFormatFactory = ['$parse', '$locale', '$sce', '$exceptionHandler', function $$messageFormat(\n                               $parse,   $locale,   $sce,   $exceptionHandler) {\n\n  function getStringifier(trustedContext, allOrNothing, text) {\n    return function stringifier(value) {\n      try {\n        value = trustedContext ? $sce['getTrusted'](trustedContext, value) : $sce['valueOf'](value);\n        return allOrNothing && (value === undefined) ? value : $$stringify(value);\n      } catch (err) {\n        $exceptionHandler($interpolateMinErr['interr'](text, err));\n      }\n    };\n  }\n\n  function interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n    var stringifier = getStringifier(trustedContext, allOrNothing, text);\n    var parser = new MessageFormatParser(text, 0, $parse, $locale['pluralCat'], stringifier,\n                                         mustHaveExpression, trustedContext, allOrNothing);\n    parser.run(parser.ruleInterpolate);\n    return parser.parsedFn;\n  }\n\n  return {\n    'interpolate': interpolate\n  };\n}];\n\nvar $$interpolateDecorator = ['$$messageFormat', '$delegate', function $$interpolateDecorator($$messageFormat, $interpolate) {\n  if ($interpolate['startSymbol']() !== '{{' || $interpolate['endSymbol']() !== '}}') {\n    throw $interpolateMinErr('nochgmustache', 'angular-message-format.js currently does not allow you to use custom start and end symbols for interpolation.');\n  }\n  var interpolate = $$messageFormat['interpolate'];\n  interpolate['startSymbol'] = $interpolate['startSymbol'];\n  interpolate['endSymbol'] = $interpolate['endSymbol'];\n  return interpolate;\n}];\n\nvar $interpolateMinErr;\nvar isFunction;\nvar noop;\nvar toJson;\nvar $$stringify;\n\nvar ngModule = window['angular']['module']('ngMessageFormat', ['ng']);\nngModule['info']({ 'angularVersion': '1.7.8' });\nngModule['factory']('$$messageFormat', $$MessageFormatFactory);\nngModule['config'](['$provide', function($provide) {\n  $interpolateMinErr = window['angular']['$interpolateMinErr'];\n  isFunction = window['angular']['isFunction'];\n  noop = window['angular']['noop'];\n  toJson = window['angular']['toJson'];\n  $$stringify = window['angular']['$$stringify'];\n\n  $provide['decorator']('$interpolate', $$interpolateDecorator);\n}]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-messages.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar forEach;\nvar isArray;\nvar isString;\nvar jqLite;\n\n/**\n * @ngdoc module\n * @name ngMessages\n * @description\n *\n * The `ngMessages` module provides enhanced support for displaying messages within templates\n * (typically within forms or when rendering message objects that return key/value data).\n * Instead of relying on JavaScript code and/or complex ng-if statements within your form template to\n * show and hide error messages specific to the state of an input field, the `ngMessages` and\n * `ngMessage` directives are designed to handle the complexity, inheritance and priority\n * sequencing based on the order of how the messages are defined in the template.\n *\n * Currently, the ngMessages module only contains the code for the `ngMessages`, `ngMessagesInclude`\n * `ngMessage`, `ngMessageExp` and `ngMessageDefault` directives.\n *\n * ## Usage\n * The `ngMessages` directive allows keys in a key/value collection to be associated with a child element\n * (or 'message') that will show or hide based on the truthiness of that key's value in the collection. A common use\n * case for `ngMessages` is to display error messages for inputs using the `$error` object exposed by the\n * {@link ngModel ngModel} directive.\n *\n * The child elements of the `ngMessages` directive are matched to the collection keys by a `ngMessage` or\n * `ngMessageExp` directive. The value of these attributes must match a key in the collection that is provided by\n * the `ngMessages` directive.\n *\n * Consider the following example, which illustrates a typical use case of `ngMessages`. Within the form `myForm` we\n * have a text input named `myField` which is bound to the scope variable `field` using the {@link ngModel ngModel}\n * directive.\n *\n * The `myField` field is a required input of type `email` with a maximum length of 15 characters.\n *\n * ```html\n * <form name=\"myForm\">\n *   <label>\n *     Enter text:\n *     <input type=\"email\" ng-model=\"field\" name=\"myField\" required maxlength=\"15\" />\n *   </label>\n *   <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *     <div ng-message=\"required\">Please enter a value for this field.</div>\n *     <div ng-message=\"email\">This field must be a valid email address.</div>\n *     <div ng-message=\"maxlength\">This field can be at most 15 characters long.</div>\n *   </div>\n * </form>\n * ```\n *\n * In order to show error messages corresponding to `myField` we first create an element with an `ngMessages` attribute\n * set to the `$error` object owned by the `myField` input in our `myForm` form.\n *\n * Within this element we then create separate elements for each of the possible errors that `myField` could have.\n * The `ngMessage` attribute is used to declare which element(s) will appear for which error - for example,\n * setting `ng-message=\"required\"` specifies that this particular element should be displayed when there\n * is no value present for the required field `myField` (because the key `required` will be `true` in the object\n * `myForm.myField.$error`).\n *\n * ### Message order\n *\n * By default, `ngMessages` will only display one message for a particular key/value collection at any time. If more\n * than one message (or error) key is currently true, then which message is shown is determined by the order of messages\n * in the HTML template code (messages declared first are prioritised). This mechanism means the developer does not have\n * to prioritize messages using custom JavaScript code.\n *\n * Given the following error object for our example (which informs us that the field `myField` currently has both the\n * `required` and `email` errors):\n *\n * ```javascript\n * <!-- keep in mind that ngModel automatically sets these error flags -->\n * myField.$error = { required : true, email: true, maxlength: false };\n * ```\n * The `required` message will be displayed to the user since it appears before the `email` message in the DOM.\n * Once the user types a single character, the `required` message will disappear (since the field now has a value)\n * but the `email` message will be visible because it is still applicable.\n *\n * ### Displaying multiple messages at the same time\n *\n * While `ngMessages` will by default only display one error element at a time, the `ng-messages-multiple` attribute can\n * be applied to the `ngMessages` container element to cause it to display all applicable error messages at once:\n *\n * ```html\n * <!-- attribute-style usage -->\n * <div ng-messages=\"myForm.myField.$error\" ng-messages-multiple>...</div>\n *\n * <!-- element-style usage -->\n * <ng-messages for=\"myForm.myField.$error\" multiple>...</ng-messages>\n * ```\n *\n * ## Reusing and Overriding Messages\n * In addition to prioritization, ngMessages also allows for including messages from a remote or an inline\n * template. This allows for generic collection of messages to be reused across multiple parts of an\n * application.\n *\n * ```html\n * <script type=\"text/ng-template\" id=\"error-messages\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n * </script>\n *\n * <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *   <div ng-messages-include=\"error-messages\"></div>\n * </div>\n * ```\n *\n * However, including generic messages may not be useful enough to match all input fields, therefore,\n * `ngMessages` provides the ability to override messages defined in the remote template by redefining\n * them within the directive container.\n *\n * ```html\n * <!-- a generic template of error messages known as \"my-custom-messages\" -->\n * <script type=\"text/ng-template\" id=\"my-custom-messages\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n * </script>\n *\n * <form name=\"myForm\">\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            id=\"email\"\n *            name=\"myEmail\"\n *            ng-model=\"email\"\n *            minlength=\"5\"\n *            required />\n *   </label>\n *   <!-- any ng-message elements that appear BEFORE the ng-messages-include will\n *        override the messages present in the ng-messages-include template -->\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <!-- this required message has overridden the template message -->\n *     <div ng-message=\"required\">You did not enter your email address</div>\n *\n *     <!-- this is a brand new message and will appear last in the prioritization -->\n *     <div ng-message=\"email\">Your email address is invalid</div>\n *\n *     <!-- and here are the generic error messages -->\n *     <div ng-messages-include=\"my-custom-messages\"></div>\n *   </div>\n * </form>\n * ```\n *\n * In the example HTML code above the message that is set on required will override the corresponding\n * required message defined within the remote template. Therefore, with particular input fields (such\n * email addresses, date fields, autocomplete inputs, etc...), specialized error messages can be applied\n * while more generic messages can be used to handle other, more general input errors.\n *\n * ## Dynamic Messaging\n * ngMessages also supports using expressions to dynamically change key values. Using arrays and\n * repeaters to list messages is also supported. This means that the code below will be able to\n * fully adapt itself and display the appropriate message when any of the expression data changes:\n *\n * ```html\n * <form name=\"myForm\">\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            name=\"myEmail\"\n *            ng-model=\"email\"\n *            minlength=\"5\"\n *            required />\n *   </label>\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <div ng-message=\"required\">You did not enter your email address</div>\n *     <div ng-repeat=\"errorMessage in errorMessages\">\n *       <!-- use ng-message-exp for a message whose key is given by an expression -->\n *       <div ng-message-exp=\"errorMessage.type\">{{ errorMessage.text }}</div>\n *     </div>\n *   </div>\n * </form>\n * ```\n *\n * The `errorMessage.type` expression can be a string value or it can be an array so\n * that multiple errors can be associated with a single error message:\n *\n * ```html\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            ng-model=\"data.email\"\n *            name=\"myEmail\"\n *            ng-minlength=\"5\"\n *            ng-maxlength=\"100\"\n *            required />\n *   </label>\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <div ng-message-exp=\"'required'\">You did not enter your email address</div>\n *     <div ng-message-exp=\"['minlength', 'maxlength']\">\n *       Your email must be between 5 and 100 characters long\n *     </div>\n *   </div>\n * ```\n *\n * Feel free to use other structural directives such as ng-if and ng-switch to further control\n * what messages are active and when. Be careful, if you place ng-message on the same element\n * as these structural directives, AngularJS may not be able to determine if a message is active\n * or not. Therefore it is best to place the ng-message on a child element of the structural\n * directive.\n *\n * ```html\n * <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *   <div ng-if=\"showRequiredError\">\n *     <div ng-message=\"required\">Please enter something</div>\n *   </div>\n * </div>\n * ```\n *\n * ## Animations\n * If the `ngAnimate` module is active within the application then the `ngMessages`, `ngMessage` and\n * `ngMessageExp` directives will trigger animations whenever any messages are added and removed from\n * the DOM by the `ngMessages` directive.\n *\n * Whenever the `ngMessages` directive contains one or more visible messages then the `.ng-active` CSS\n * class will be added to the element. The `.ng-inactive` CSS class will be applied when there are no\n * messages present. Therefore, CSS transitions and keyframes as well as JavaScript animations can\n * hook into the animations whenever these classes are added/removed.\n *\n * Let's say that our HTML code for our messages container looks like so:\n *\n * ```html\n * <div ng-messages=\"myMessages\" class=\"my-messages\" role=\"alert\">\n *   <div ng-message=\"alert\" class=\"some-message\">...</div>\n *   <div ng-message=\"fail\" class=\"some-message\">...</div>\n * </div>\n * ```\n *\n * Then the CSS animation code for the message container looks like so:\n *\n * ```css\n * .my-messages {\n *   transition:1s linear all;\n * }\n * .my-messages.ng-active {\n *   // messages are visible\n * }\n * .my-messages.ng-inactive {\n *   // messages are hidden\n * }\n * ```\n *\n * Whenever an inner message is attached (becomes visible) or removed (becomes hidden) then the enter\n * and leave animation is triggered for each particular element bound to the `ngMessage` directive.\n *\n * Therefore, the CSS code for the inner messages looks like so:\n *\n * ```css\n * .some-message {\n *   transition:1s linear all;\n * }\n *\n * .some-message.ng-enter {}\n * .some-message.ng-enter.ng-enter-active {}\n *\n * .some-message.ng-leave {}\n * .some-message.ng-leave.ng-leave-active {}\n * ```\n *\n * {@link ngAnimate See the ngAnimate docs} to learn how to use JavaScript animations or to learn\n * more about ngAnimate.\n *\n * ## Displaying a default message\n * If the ngMessages renders no inner ngMessage directive (i.e. when none of the truthy\n * keys are matched by a defined message), then it will render a default message\n * using the {@link ngMessageDefault} directive.\n * Note that matched messages will always take precedence over unmatched messages. That means\n * the default message will not be displayed when another message is matched. This is also\n * true for `ng-messages-multiple`.\n *\n * ```html\n * <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n *   <div ng-message-default>This field has an input error</div>\n * </div>\n * ```\n *\n\n */\nangular.module('ngMessages', [], function initAngularHelpers() {\n  // Access helpers from AngularJS core.\n  // Do it inside a `config` block to ensure `window.angular` is available.\n  forEach = angular.forEach;\n  isArray = angular.isArray;\n  isString = angular.isString;\n  jqLite = angular.element;\n})\n  .info({ angularVersion: '1.7.8' })\n\n  /**\n   * @ngdoc directive\n   * @module ngMessages\n   * @name ngMessages\n   * @restrict AE\n   *\n   * @description\n   * `ngMessages` is a directive that is designed to show and hide messages based on the state\n   * of a key/value object that it listens on. The directive itself complements error message\n   * reporting with the `ngModel` $error object (which stores a key/value state of validation errors).\n   *\n   * `ngMessages` manages the state of internal messages within its container element. The internal\n   * messages use the `ngMessage` directive and will be inserted/removed from the page depending\n   * on if they're present within the key/value object. By default, only one message will be displayed\n   * at a time and this depends on the prioritization of the messages within the template. (This can\n   * be changed by using the `ng-messages-multiple` or `multiple` attribute on the directive container.)\n   *\n   * A remote template can also be used (With {@link ngMessagesInclude}) to promote message\n   * reusability and messages can also be overridden.\n   *\n   * A default message can also be displayed when no `ngMessage` directive is inserted, using the\n   * {@link ngMessageDefault} directive.\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   *   <ANY ng-message-exp=\"expressionValue\">...</ANY>\n   *   <ANY ng-message-default>...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   *   <ng-message when-exp=\"expressionValue\">...</ng-message>\n   *   <ng-message-default>...</ng-message-default>\n   * </ng-messages>\n   * ```\n   *\n   * @param {string} ngMessages an AngularJS expression evaluating to a key/value object\n   *                 (this is typically the $error object on an ngModel instance).\n   * @param {string=} ngMessagesMultiple|multiple when set, all messages will be displayed with true\n   *\n   * @example\n   * <example name=\"ngMessages-directive\" module=\"ngMessagesExample\"\n   *          deps=\"angular-messages.js\"\n   *          animations=\"true\" fixBase=\"true\">\n   *   <file name=\"index.html\">\n   *     <form name=\"myForm\">\n   *       <label>\n   *         Enter your name:\n   *         <input type=\"text\"\n   *                name=\"myName\"\n   *                ng-model=\"name\"\n   *                ng-minlength=\"5\"\n   *                ng-maxlength=\"20\"\n   *                required />\n   *       </label>\n   *       <pre>myForm.myName.$error = {{ myForm.myName.$error | json }}</pre>\n   *\n   *       <div ng-messages=\"myForm.myName.$error\" style=\"color:maroon\" role=\"alert\">\n   *         <div ng-message=\"required\">You did not enter a field</div>\n   *         <div ng-message=\"minlength\">Your field is too short</div>\n   *         <div ng-message=\"maxlength\">Your field is too long</div>\n   *         <div ng-message-default>This field has an input error</div>\n   *       </div>\n   *     </form>\n   *   </file>\n   *   <file name=\"script.js\">\n   *     angular.module('ngMessagesExample', ['ngMessages']);\n   *   </file>\n   * </example>\n   */\n  .directive('ngMessages', ['$animate', function($animate) {\n    var ACTIVE_CLASS = 'ng-active';\n    var INACTIVE_CLASS = 'ng-inactive';\n\n    return {\n      require: 'ngMessages',\n      restrict: 'AE',\n      controller: ['$element', '$scope', '$attrs', function NgMessagesCtrl($element, $scope, $attrs) {\n        var ctrl = this;\n        var latestKey = 0;\n        var nextAttachId = 0;\n\n        this.getAttachId = function getAttachId() { return nextAttachId++; };\n\n        var messages = this.messages = {};\n        var renderLater, cachedCollection;\n\n        this.render = function(collection) {\n          collection = collection || {};\n\n          renderLater = false;\n          cachedCollection = collection;\n\n          // this is true if the attribute is empty or if the attribute value is truthy\n          var multiple = isAttrTruthy($scope, $attrs.ngMessagesMultiple) ||\n                         isAttrTruthy($scope, $attrs.multiple);\n\n          var unmatchedMessages = [];\n          var matchedKeys = {};\n          var truthyKeys = 0;\n          var messageItem = ctrl.head;\n          var messageFound = false;\n          var totalMessages = 0;\n\n          // we use != instead of !== to allow for both undefined and null values\n          while (messageItem != null) {\n            totalMessages++;\n            var messageCtrl = messageItem.message;\n\n            var messageUsed = false;\n            if (!messageFound) {\n              forEach(collection, function(value, key) {\n                if (truthy(value) && !messageUsed) {\n                  truthyKeys++;\n\n                  if (messageCtrl.test(key)) {\n                    // this is to prevent the same error name from showing up twice\n                    if (matchedKeys[key]) return;\n                    matchedKeys[key] = true;\n\n                    messageUsed = true;\n                    messageCtrl.attach();\n                  }\n                }\n              });\n            }\n\n            if (messageUsed) {\n              // unless we want to display multiple messages then we should\n              // set a flag here to avoid displaying the next message in the list\n              messageFound = !multiple;\n            } else {\n              unmatchedMessages.push(messageCtrl);\n            }\n\n            messageItem = messageItem.next;\n          }\n\n          forEach(unmatchedMessages, function(messageCtrl) {\n            messageCtrl.detach();\n          });\n\n          var messageMatched = unmatchedMessages.length !== totalMessages;\n          var attachDefault = ctrl.default && !messageMatched && truthyKeys > 0;\n\n          if (attachDefault) {\n            ctrl.default.attach();\n          } else if (ctrl.default) {\n            ctrl.default.detach();\n          }\n\n          if (messageMatched || attachDefault) {\n            $animate.setClass($element, ACTIVE_CLASS, INACTIVE_CLASS);\n          } else {\n            $animate.setClass($element, INACTIVE_CLASS, ACTIVE_CLASS);\n          }\n        };\n\n        $scope.$watchCollection($attrs.ngMessages || $attrs['for'], ctrl.render);\n\n        this.reRender = function() {\n          if (!renderLater) {\n            renderLater = true;\n            $scope.$evalAsync(function() {\n              if (renderLater && cachedCollection) {\n                ctrl.render(cachedCollection);\n              }\n            });\n          }\n        };\n\n        this.register = function(comment, messageCtrl, isDefault) {\n          if (isDefault) {\n            ctrl.default = messageCtrl;\n          } else {\n            var nextKey = latestKey.toString();\n            messages[nextKey] = {\n              message: messageCtrl\n            };\n            insertMessageNode($element[0], comment, nextKey);\n            comment.$$ngMessageNode = nextKey;\n            latestKey++;\n          }\n\n          ctrl.reRender();\n        };\n\n        this.deregister = function(comment, isDefault) {\n          if (isDefault) {\n            delete ctrl.default;\n          } else {\n            var key = comment.$$ngMessageNode;\n            delete comment.$$ngMessageNode;\n            removeMessageNode($element[0], comment, key);\n            delete messages[key];\n          }\n          ctrl.reRender();\n        };\n\n        function findPreviousMessage(parent, comment) {\n          var prevNode = comment;\n          var parentLookup = [];\n\n          while (prevNode && prevNode !== parent) {\n            var prevKey = prevNode.$$ngMessageNode;\n            if (prevKey && prevKey.length) {\n              return messages[prevKey];\n            }\n\n            // dive deeper into the DOM and examine its children for any ngMessage\n            // comments that may be in an element that appears deeper in the list\n            if (prevNode.childNodes.length && parentLookup.indexOf(prevNode) === -1) {\n              parentLookup.push(prevNode);\n              prevNode = prevNode.childNodes[prevNode.childNodes.length - 1];\n            } else if (prevNode.previousSibling) {\n              prevNode = prevNode.previousSibling;\n            } else {\n              prevNode = prevNode.parentNode;\n              parentLookup.push(prevNode);\n            }\n          }\n        }\n\n        function insertMessageNode(parent, comment, key) {\n          var messageNode = messages[key];\n          if (!ctrl.head) {\n            ctrl.head = messageNode;\n          } else {\n            var match = findPreviousMessage(parent, comment);\n            if (match) {\n              messageNode.next = match.next;\n              match.next = messageNode;\n            } else {\n              messageNode.next = ctrl.head;\n              ctrl.head = messageNode;\n            }\n          }\n        }\n\n        function removeMessageNode(parent, comment, key) {\n          var messageNode = messages[key];\n\n          // This message node may have already been removed by a call to deregister()\n          if (!messageNode) return;\n\n          var match = findPreviousMessage(parent, comment);\n          if (match) {\n            match.next = messageNode.next;\n          } else {\n            ctrl.head = messageNode.next;\n          }\n        }\n      }]\n    };\n\n    function isAttrTruthy(scope, attr) {\n     return (isString(attr) && attr.length === 0) || //empty attribute\n            truthy(scope.$eval(attr));\n    }\n\n    function truthy(val) {\n      return isString(val) ? val.length : !!val;\n    }\n  }])\n\n  /**\n   * @ngdoc directive\n   * @name ngMessagesInclude\n   * @restrict AE\n   * @scope\n   *\n   * @description\n   * `ngMessagesInclude` is a directive with the purpose to import existing ngMessage template\n   * code from a remote template and place the downloaded template code into the exact spot\n   * that the ngMessagesInclude directive is placed within the ngMessages container. This allows\n   * for a series of pre-defined messages to be reused and also allows for the developer to\n   * determine what messages are overridden due to the placement of the ngMessagesInclude directive.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-messages-include=\"remoteTplString\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-messages-include src=\"expressionValue1\">...</ng-messages-include>\n   * </ng-messages>\n   * ```\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @param {string} ngMessagesInclude|src a string value corresponding to the remote template.\n   */\n  .directive('ngMessagesInclude',\n    ['$templateRequest', '$document', '$compile', function($templateRequest, $document, $compile) {\n\n    return {\n      restrict: 'AE',\n      require: '^^ngMessages', // we only require this for validation sake\n      link: function($scope, element, attrs) {\n        var src = attrs.ngMessagesInclude || attrs.src;\n        $templateRequest(src).then(function(html) {\n          if ($scope.$$destroyed) return;\n\n          if (isString(html) && !html.trim()) {\n            // Empty template - nothing to compile\n            replaceElementWithMarker(element, src);\n          } else {\n            // Non-empty template - compile and link\n            $compile(html)($scope, function(contents) {\n              element.after(contents);\n              replaceElementWithMarker(element, src);\n            });\n          }\n        });\n      }\n    };\n\n    // Helpers\n    function replaceElementWithMarker(element, src) {\n      // A comment marker is placed for debugging purposes\n      var comment = $compile.$$createComment ?\n          $compile.$$createComment('ngMessagesInclude', src) :\n          $document[0].createComment(' ngMessagesInclude: ' + src + ' ');\n      var marker = jqLite(comment);\n      element.after(marker);\n\n      // Don't pollute the DOM anymore by keeping an empty directive element\n      element.remove();\n    }\n  }])\n\n  /**\n   * @ngdoc directive\n   * @name ngMessage\n   * @restrict AE\n   * @scope\n   * @priority 1\n   *\n   * @description\n   * `ngMessage` is a directive with the purpose to show and hide a particular message.\n   * For `ngMessage` to operate, a parent `ngMessages` directive on a parent DOM element\n   * must be situated since it determines which messages are visible based on the state\n   * of the provided key/value map that `ngMessages` listens on.\n   *\n   * More information about using `ngMessage` can be found in the\n   * {@link module:ngMessages `ngMessages` module documentation}.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   * </ng-messages>\n   * ```\n   *\n   * @param {expression} ngMessage|when a string value corresponding to the message key.\n   */\n  .directive('ngMessage', ngMessageDirectiveFactory())\n\n\n  /**\n   * @ngdoc directive\n   * @name ngMessageExp\n   * @restrict AE\n   * @priority 1\n   * @scope\n   *\n   * @description\n   * `ngMessageExp` is the same as {@link directive:ngMessage `ngMessage`}, but instead of a static\n   * value, it accepts an expression to be evaluated for the message key.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\">\n   *   <ANY ng-message-exp=\"expressionValue\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\">\n   *   <ng-message when-exp=\"expressionValue\">...</ng-message>\n   * </ng-messages>\n   * ```\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @param {expression} ngMessageExp|whenExp an expression value corresponding to the message key.\n   */\n  .directive('ngMessageExp', ngMessageDirectiveFactory())\n\n  /**\n   * @ngdoc directive\n   * @name ngMessageDefault\n   * @restrict AE\n   * @scope\n   *\n   * @description\n   * `ngMessageDefault` is a directive with the purpose to show and hide a default message for\n   * {@link directive:ngMessages}, when none of provided messages matches.\n   *\n   * More information about using `ngMessageDefault` can be found in the\n   * {@link module:ngMessages `ngMessages` module documentation}.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   *   <ANY ng-message-default>...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   *   <ng-message-default>...</ng-message-default>\n   * </ng-messages>\n   *\n  */\n  .directive('ngMessageDefault', ngMessageDirectiveFactory(true));\n\nfunction ngMessageDirectiveFactory(isDefault) {\n  return ['$animate', function($animate) {\n    return {\n      restrict: 'AE',\n      transclude: 'element',\n      priority: 1, // must run before ngBind, otherwise the text is set on the comment\n      terminal: true,\n      require: '^^ngMessages',\n      link: function(scope, element, attrs, ngMessagesCtrl, $transclude) {\n        var commentNode, records, staticExp, dynamicExp;\n\n        if (!isDefault) {\n          commentNode = element[0];\n          staticExp = attrs.ngMessage || attrs.when;\n          dynamicExp = attrs.ngMessageExp || attrs.whenExp;\n\n          var assignRecords = function(items) {\n            records = items\n                ? (isArray(items)\n                      ? items\n                      : items.split(/[\\s,]+/))\n                : null;\n            ngMessagesCtrl.reRender();\n          };\n\n          if (dynamicExp) {\n            assignRecords(scope.$eval(dynamicExp));\n            scope.$watchCollection(dynamicExp, assignRecords);\n          } else {\n            assignRecords(staticExp);\n          }\n        }\n\n        var currentElement, messageCtrl;\n        ngMessagesCtrl.register(commentNode, messageCtrl = {\n          test: function(name) {\n            return contains(records, name);\n          },\n          attach: function() {\n            if (!currentElement) {\n              $transclude(function(elm, newScope) {\n                $animate.enter(elm, null, element);\n                currentElement = elm;\n\n                // Each time we attach this node to a message we get a new id that we can match\n                // when we are destroying the node later.\n                var $$attachId = currentElement.$$attachId = ngMessagesCtrl.getAttachId();\n\n                // in the event that the element or a parent element is destroyed\n                // by another structural directive then it's time\n                // to deregister the message from the controller\n                currentElement.on('$destroy', function() {\n                  // If the message element was removed via a call to `detach` then `currentElement` will be null\n                  // So this handler only handles cases where something else removed the message element.\n                  if (currentElement && currentElement.$$attachId === $$attachId) {\n                    ngMessagesCtrl.deregister(commentNode, isDefault);\n                    messageCtrl.detach();\n                  }\n                  newScope.$destroy();\n                });\n              });\n            }\n          },\n          detach: function() {\n            if (currentElement) {\n              var elm = currentElement;\n              currentElement = null;\n              $animate.leave(elm);\n            }\n          }\n        }, isDefault);\n\n        // We need to ensure that this directive deregisters itself when it no longer exists\n        // Normally this is done when the attached element is destroyed; but if this directive\n        // gets removed before we attach the message to the DOM there is nothing to watch\n        // in which case we must deregister when the containing scope is destroyed.\n        scope.$on('$destroy', function() {\n          ngMessagesCtrl.deregister(commentNode, isDefault);\n        });\n      }\n    };\n  }];\n\n  function contains(collection, key) {\n    if (collection) {\n      return isArray(collection)\n          ? collection.indexOf(key) >= 0\n          : collection.hasOwnProperty(key);\n    }\n  }\n}\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-mocks.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {\n\n'use strict';\n\n/* global routeToRegExp: true */\n\n/**\n * @param {string} path - The path to parse. (It is assumed to have query and hash stripped off.)\n * @param {Object} opts - Options.\n * @return {Object} - An object containing an array of path parameter names (`keys`) and a regular\n *     expression (`regexp`) that can be used to identify a matching URL and extract the path\n *     parameter values.\n *\n * @description\n * Parses the given path, extracting path parameter names and a regular expression to match URLs.\n *\n * Originally inspired by `pathRexp` in `visionmedia/express/lib/utils.js`.\n */\nfunction routeToRegExp(path, opts) {\n  var keys = [];\n\n  var pattern = path\n    .replace(/([().])/g, '\\\\$1')\n    .replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g, function(_, slash, key, option) {\n      var optional = option === '?' || option === '*?';\n      var star = option === '*' || option === '*?';\n      keys.push({name: key, optional: optional});\n      slash = slash || '';\n      return (\n        (optional ? '(?:' + slash : slash + '(?:') +\n        (star ? '(.+?)' : '([^/]+)') +\n        (optional ? '?)?' : ')')\n      );\n    })\n    .replace(/([/$*])/g, '\\\\$1');\n\n  if (opts.ignoreTrailingSlashes) {\n    pattern = pattern.replace(/\\/+$/, '') + '/*';\n  }\n\n  return {\n    keys: keys,\n    regexp: new RegExp(\n      '^' + pattern + '(?:[?#]|$)',\n      opts.caseInsensitiveMatch ? 'i' : ''\n    )\n  };\n}\n\n'use strict';\n\n/* global routeToRegExp: false */\n\n/**\n * @ngdoc object\n * @name angular.mock\n * @description\n *\n * Namespace from 'angular-mocks.js' which contains testing related code.\n *\n */\nangular.mock = {};\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n *\n * @description\n * This service is a mock implementation of {@link ng.$browser}. It provides fake\n * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr,\n * cookies, etc.\n *\n * The api of this service is the same as that of the real {@link ng.$browser $browser}, except\n * that there are several helper methods available which can be used in tests.\n */\nangular.mock.$BrowserProvider = function() {\n  this.$get = [\n    '$log', '$$taskTrackerFactory',\n    function($log, $$taskTrackerFactory) {\n      return new angular.mock.$Browser($log, $$taskTrackerFactory);\n    }\n  ];\n};\n\nangular.mock.$Browser = function($log, $$taskTrackerFactory) {\n  var self = this;\n  var taskTracker = $$taskTrackerFactory($log);\n\n  this.isMock = true;\n  self.$$url = 'http://server/';\n  self.$$lastUrl = self.$$url; // used by url polling fn\n  self.pollFns = [];\n\n  // Task-tracking API\n  self.$$completeOutstandingRequest = taskTracker.completeTask;\n  self.$$incOutstandingRequestCount = taskTracker.incTaskCount;\n  self.notifyWhenNoOutstandingRequests = taskTracker.notifyWhenNoPendingTasks;\n\n  // register url polling fn\n\n  self.onUrlChange = function(listener) {\n    self.pollFns.push(\n      function() {\n        if (self.$$lastUrl !== self.$$url || self.$$state !== self.$$lastState) {\n          self.$$lastUrl = self.$$url;\n          self.$$lastState = self.$$state;\n          listener(self.$$url, self.$$state);\n        }\n      }\n    );\n\n    return listener;\n  };\n\n  self.$$applicationDestroyed = angular.noop;\n  self.$$checkUrlChange = angular.noop;\n\n  self.deferredFns = [];\n  self.deferredNextId = 0;\n\n  self.defer = function(fn, delay, taskType) {\n    var timeoutId = self.deferredNextId++;\n\n    delay = delay || 0;\n    taskType = taskType || taskTracker.DEFAULT_TASK_TYPE;\n\n    taskTracker.incTaskCount(taskType);\n    self.deferredFns.push({\n      id: timeoutId,\n      type: taskType,\n      time: (self.defer.now + delay),\n      fn: fn\n    });\n    self.deferredFns.sort(function(a, b) { return a.time - b.time; });\n\n    return timeoutId;\n  };\n\n\n  /**\n   * @name $browser#defer.now\n   *\n   * @description\n   * Current milliseconds mock time.\n   */\n  self.defer.now = 0;\n\n\n  self.defer.cancel = function(deferId) {\n    var taskIndex;\n\n    angular.forEach(self.deferredFns, function(task, index) {\n      if (task.id === deferId) taskIndex = index;\n    });\n\n    if (angular.isDefined(taskIndex)) {\n      var task = self.deferredFns.splice(taskIndex, 1)[0];\n      taskTracker.completeTask(angular.noop, task.type);\n      return true;\n    }\n\n    return false;\n  };\n\n\n  /**\n   * @name $browser#defer.flush\n   *\n   * @description\n   * Flushes all pending requests and executes the defer callbacks.\n   *\n   * See {@link ngMock.$flushPendingsTasks} for more info.\n   *\n   * @param {number=} number of milliseconds to flush. See {@link #defer.now}\n   */\n  self.defer.flush = function(delay) {\n    var nextTime;\n\n    if (angular.isDefined(delay)) {\n      // A delay was passed so compute the next time\n      nextTime = self.defer.now + delay;\n    } else if (self.deferredFns.length) {\n      // No delay was passed so set the next time so that it clears the deferred queue\n      nextTime = self.deferredFns[self.deferredFns.length - 1].time;\n    } else {\n      // No delay passed, but there are no deferred tasks so flush - indicates an error!\n      throw new Error('No deferred tasks to be flushed');\n    }\n\n    while (self.deferredFns.length && self.deferredFns[0].time <= nextTime) {\n      // Increment the time and call the next deferred function\n      self.defer.now = self.deferredFns[0].time;\n      var task = self.deferredFns.shift();\n      taskTracker.completeTask(task.fn, task.type);\n    }\n\n    // Ensure that the current time is correct\n    self.defer.now = nextTime;\n  };\n\n  /**\n   * @name $browser#defer.getPendingTasks\n   *\n   * @description\n   * Returns the currently pending tasks that need to be flushed.\n   * You can request a specific type of tasks only, by specifying a `taskType`.\n   *\n   * @param {string=} taskType - The type tasks to return.\n   */\n  self.defer.getPendingTasks = function(taskType) {\n    return !taskType\n        ? self.deferredFns\n        : self.deferredFns.filter(function(task) { return task.type === taskType; });\n  };\n\n  /**\n   * @name $browser#defer.formatPendingTasks\n   *\n   * @description\n   * Formats each task in a list of pending tasks as a string, suitable for use in error messages.\n   *\n   * @param {Array<Object>} pendingTasks - A list of task objects.\n   * @return {Array<string>} A list of stringified tasks.\n   */\n  self.defer.formatPendingTasks = function(pendingTasks) {\n    return pendingTasks.map(function(task) {\n      return '{id: ' + task.id + ', type: ' + task.type + ', time: ' + task.time + '}';\n    });\n  };\n\n  /**\n   * @name $browser#defer.verifyNoPendingTasks\n   *\n   * @description\n   * Verifies that there are no pending tasks that need to be flushed.\n   * You can check for a specific type of tasks only, by specifying a `taskType`.\n   *\n   * See {@link $verifyNoPendingTasks} for more info.\n   *\n   * @param {string=} taskType - The type tasks to check for.\n   */\n  self.defer.verifyNoPendingTasks = function(taskType) {\n    var pendingTasks = self.defer.getPendingTasks(taskType);\n\n    if (pendingTasks.length) {\n      var formattedTasks = self.defer.formatPendingTasks(pendingTasks).join('\\n  ');\n      throw new Error('Deferred tasks to flush (' + pendingTasks.length + '):\\n  ' +\n          formattedTasks);\n    }\n  };\n\n  self.$$baseHref = '/';\n  self.baseHref = function() {\n    return this.$$baseHref;\n  };\n};\nangular.mock.$Browser.prototype = {\n\n  /**\n   * @name $browser#poll\n   *\n   * @description\n   * run all fns in pollFns\n   */\n  poll: function poll() {\n    angular.forEach(this.pollFns, function(pollFn) {\n      pollFn();\n    });\n  },\n\n  url: function(url, replace, state) {\n    if (angular.isUndefined(state)) {\n      state = null;\n    }\n    if (url) {\n      // The `$browser` service trims empty hashes; simulate it.\n      this.$$url = url.replace(/#$/, '');\n      // Native pushState serializes & copies the object; simulate it.\n      this.$$state = angular.copy(state);\n      return this;\n    }\n\n    return this.$$url;\n  },\n\n  state: function() {\n    return this.$$state;\n  }\n};\n\n/**\n * @ngdoc service\n * @name $flushPendingTasks\n *\n * @description\n * Flushes all currently pending tasks and executes the corresponding callbacks.\n *\n * Optionally, you can also pass a `delay` argument to only flush tasks that are scheduled to be\n * executed within `delay` milliseconds. Currently, `delay` only applies to timeouts, since all\n * other tasks have a delay of 0 (i.e. they are scheduled to be executed as soon as possible, but\n * still asynchronously).\n *\n * If no delay is specified, it uses a delay such that all currently pending tasks are flushed.\n *\n * The types of tasks that are flushed include:\n *\n * - Pending timeouts (via {@link $timeout}).\n * - Pending tasks scheduled via {@link ng.$rootScope.Scope#$applyAsync $applyAsync}.\n * - Pending tasks scheduled via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.\n *   These include tasks scheduled via `$evalAsync()` indirectly (such as {@link $q} promises).\n *\n * <div class=\"alert alert-info\">\n *   Periodic tasks scheduled via {@link $interval} use a different queue and are not flushed by\n *   `$flushPendingTasks()`. Use {@link ngMock.$interval#flush $interval.flush(millis)} instead.\n * </div>\n *\n * @param {number=} delay - The number of milliseconds to flush.\n */\nangular.mock.$FlushPendingTasksProvider = function() {\n  this.$get = [\n    '$browser',\n    function($browser) {\n      return function $flushPendingTasks(delay) {\n        return $browser.defer.flush(delay);\n      };\n    }\n  ];\n};\n\n/**\n * @ngdoc service\n * @name $verifyNoPendingTasks\n *\n * @description\n * Verifies that there are no pending tasks that need to be flushed. It throws an error if there are\n * still pending tasks.\n *\n * You can check for a specific type of tasks only, by specifying a `taskType`.\n *\n * Available task types:\n *\n * - `$timeout`: Pending timeouts (via {@link $timeout}).\n * - `$http`: Pending HTTP requests (via {@link $http}).\n * - `$route`: In-progress route transitions (via {@link $route}).\n * - `$applyAsync`: Pending tasks scheduled via {@link ng.$rootScope.Scope#$applyAsync $applyAsync}.\n * - `$evalAsync`: Pending tasks scheduled via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.\n *   These include tasks scheduled via `$evalAsync()` indirectly (such as {@link $q} promises).\n *\n * <div class=\"alert alert-info\">\n *   Periodic tasks scheduled via {@link $interval} use a different queue and are not taken into\n *   account by `$verifyNoPendingTasks()`. There is currently no way to verify that there are no\n *   pending {@link $interval} tasks.\n * </div>\n *\n * @param {string=} taskType - The type of tasks to check for.\n */\nangular.mock.$VerifyNoPendingTasksProvider = function() {\n  this.$get = [\n    '$browser',\n    function($browser) {\n      return function $verifyNoPendingTasks(taskType) {\n        return $browser.defer.verifyNoPendingTasks(taskType);\n      };\n    }\n  ];\n};\n\n/**\n * @ngdoc provider\n * @name $exceptionHandlerProvider\n *\n * @description\n * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors\n * passed to the `$exceptionHandler`.\n */\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n *\n * @description\n * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed\n * to it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration\n * information.\n *\n *\n * ```js\n *   describe('$exceptionHandlerProvider', function() {\n *\n *     it('should capture log messages and exceptions', function() {\n *\n *       module(function($exceptionHandlerProvider) {\n *         $exceptionHandlerProvider.mode('log');\n *       });\n *\n *       inject(function($log, $exceptionHandler, $timeout) {\n *         $timeout(function() { $log.log(1); });\n *         $timeout(function() { $log.log(2); throw 'banana peel'; });\n *         $timeout(function() { $log.log(3); });\n *         expect($exceptionHandler.errors).toEqual([]);\n *         expect($log.assertEmpty());\n *         $timeout.flush();\n *         expect($exceptionHandler.errors).toEqual(['banana peel']);\n *         expect($log.log.logs).toEqual([[1], [2], [3]]);\n *       });\n *     });\n *   });\n * ```\n */\n\nangular.mock.$ExceptionHandlerProvider = function() {\n  var handler;\n\n  /**\n   * @ngdoc method\n   * @name $exceptionHandlerProvider#mode\n   *\n   * @description\n   * Sets the logging mode.\n   *\n   * @param {string} mode Mode of operation, defaults to `rethrow`.\n   *\n   *   - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log`\n   *     mode stores an array of errors in `$exceptionHandler.errors`, to allow later assertion of\n   *     them. See {@link ngMock.$log#assertEmpty assertEmpty()} and\n   *     {@link ngMock.$log#reset reset()}.\n   *   - `rethrow`: If any errors are passed to the handler in tests, it typically means that there\n   *     is a bug in the application or test, so this mock will make these tests fail. For any\n   *     implementations that expect exceptions to be thrown, the `rethrow` mode will also maintain\n   *     a log of thrown errors in `$exceptionHandler.errors`.\n   */\n  this.mode = function(mode) {\n\n    switch (mode) {\n      case 'log':\n      case 'rethrow':\n        var errors = [];\n        handler = function(e) {\n          if (arguments.length === 1) {\n            errors.push(e);\n          } else {\n            errors.push([].slice.call(arguments, 0));\n          }\n          if (mode === 'rethrow') {\n            throw e;\n          }\n        };\n        handler.errors = errors;\n        break;\n      default:\n        throw new Error('Unknown mode \\'' + mode + '\\', only \\'log\\'/\\'rethrow\\' modes are allowed!');\n    }\n  };\n\n  this.$get = function() {\n    return handler;\n  };\n\n  this.mode('rethrow');\n};\n\n\n/**\n * @ngdoc service\n * @name $log\n *\n * @description\n * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays\n * (one array per logging level). These arrays are exposed as `logs` property of each of the\n * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`.\n *\n */\nangular.mock.$LogProvider = function() {\n  var debug = true;\n\n  function concat(array1, array2, index) {\n    return array1.concat(Array.prototype.slice.call(array2, index));\n  }\n\n  this.debugEnabled = function(flag) {\n    if (angular.isDefined(flag)) {\n      debug = flag;\n      return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = function() {\n    var $log = {\n      log: function() { $log.log.logs.push(concat([], arguments, 0)); },\n      warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },\n      info: function() { $log.info.logs.push(concat([], arguments, 0)); },\n      error: function() { $log.error.logs.push(concat([], arguments, 0)); },\n      debug: function() {\n        if (debug) {\n          $log.debug.logs.push(concat([], arguments, 0));\n        }\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $log#reset\n     *\n     * @description\n     * Reset all of the logging arrays to empty.\n     */\n    $log.reset = function() {\n      /**\n       * @ngdoc property\n       * @name $log#log.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#log `log()`}.\n       *\n       * @example\n       * ```js\n       * $log.log('Some Log');\n       * var first = $log.log.logs.unshift();\n       * ```\n       */\n      $log.log.logs = [];\n      /**\n       * @ngdoc property\n       * @name $log#info.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#info `info()`}.\n       *\n       * @example\n       * ```js\n       * $log.info('Some Info');\n       * var first = $log.info.logs.unshift();\n       * ```\n       */\n      $log.info.logs = [];\n      /**\n       * @ngdoc property\n       * @name $log#warn.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#warn `warn()`}.\n       *\n       * @example\n       * ```js\n       * $log.warn('Some Warning');\n       * var first = $log.warn.logs.unshift();\n       * ```\n       */\n      $log.warn.logs = [];\n      /**\n       * @ngdoc property\n       * @name $log#error.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#error `error()`}.\n       *\n       * @example\n       * ```js\n       * $log.error('Some Error');\n       * var first = $log.error.logs.unshift();\n       * ```\n       */\n      $log.error.logs = [];\n        /**\n       * @ngdoc property\n       * @name $log#debug.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#debug `debug()`}.\n       *\n       * @example\n       * ```js\n       * $log.debug('Some Error');\n       * var first = $log.debug.logs.unshift();\n       * ```\n       */\n      $log.debug.logs = [];\n    };\n\n    /**\n     * @ngdoc method\n     * @name $log#assertEmpty\n     *\n     * @description\n     * Assert that all of the logging methods have no logged messages. If any messages are present,\n     * an exception is thrown.\n     */\n    $log.assertEmpty = function() {\n      var errors = [];\n      angular.forEach(['error', 'warn', 'info', 'log', 'debug'], function(logLevel) {\n        angular.forEach($log[logLevel].logs, function(log) {\n          angular.forEach(log, function(logItem) {\n            errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\\n' +\n                        (logItem.stack || ''));\n          });\n        });\n      });\n      if (errors.length) {\n        errors.unshift('Expected $log to be empty! Either a message was logged unexpectedly, or ' +\n          'an expected log message was not checked and removed:');\n        errors.push('');\n        throw new Error(errors.join('\\n---------\\n'));\n      }\n    };\n\n    $log.reset();\n    return $log;\n  };\n};\n\n\n/**\n * @ngdoc service\n * @name $interval\n *\n * @description\n * Mock implementation of the $interval service.\n *\n * Use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n * time.\n *\n * @param {function()} fn A function that should be called repeatedly.\n * @param {number} delay Number of milliseconds between each function call.\n * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n *   indefinitely.\n * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n * @param {...*=} Pass additional parameters to the executed function.\n * @returns {promise} A promise which will be notified on each iteration.\n */\nangular.mock.$IntervalProvider = function() {\n  this.$get = ['$browser', '$$intervalFactory',\n       function($browser,   $$intervalFactory) {\n    var repeatFns = [],\n        nextRepeatId = 0,\n        now = 0,\n        setIntervalFn = function(tick, delay, deferred, skipApply) {\n          var id = nextRepeatId++;\n          var fn = !skipApply ? tick : function() {\n            tick();\n            $browser.defer.flush();\n          };\n\n          repeatFns.push({\n            nextTime: (now + (delay || 0)),\n            delay: delay || 1,\n            fn: fn,\n            id: id,\n            deferred: deferred\n          });\n          repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime; });\n\n          return id;\n        },\n        clearIntervalFn = function(id) {\n          for (var fnIndex = repeatFns.length - 1; fnIndex >= 0; fnIndex--) {\n            if (repeatFns[fnIndex].id === id) {\n              repeatFns.splice(fnIndex, 1);\n              break;\n            }\n          }\n        };\n\n    var $interval = $$intervalFactory(setIntervalFn, clearIntervalFn);\n\n    /**\n     * @ngdoc method\n     * @name $interval#cancel\n     *\n     * @description\n     * Cancels a task associated with the `promise`.\n     *\n     * @param {promise} promise A promise from calling the `$interval` function.\n     * @returns {boolean} Returns `true` if the task was successfully cancelled.\n     */\n    $interval.cancel = function(promise) {\n      if (!promise) return false;\n\n      for (var fnIndex = repeatFns.length - 1; fnIndex >= 0; fnIndex--) {\n        if (repeatFns[fnIndex].id === promise.$$intervalId) {\n          var deferred = repeatFns[fnIndex].deferred;\n          deferred.promise.then(undefined, function() {});\n          deferred.reject('canceled');\n          repeatFns.splice(fnIndex, 1);\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    /**\n     * @ngdoc method\n     * @name $interval#flush\n     * @description\n     *\n     * Runs interval tasks scheduled to be run in the next `millis` milliseconds.\n     *\n     * @param {number} millis maximum timeout amount to flush up until.\n     *\n     * @return {number} The amount of time moved forward.\n     */\n    $interval.flush = function(millis) {\n      var before = now;\n      now += millis;\n      while (repeatFns.length && repeatFns[0].nextTime <= now) {\n        var task = repeatFns[0];\n        task.fn();\n        if (task.nextTime === before) {\n          // this can only happen the first time\n          // a zero-delay interval gets triggered\n          task.nextTime++;\n        }\n        task.nextTime += task.delay;\n        repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});\n      }\n      return millis;\n    };\n\n    return $interval;\n  }];\n};\n\n\nfunction jsonStringToDate(string) {\n  // The R_ISO8061_STR regex is never going to fit into the 100 char limit!\n  // eslit-disable-next-line max-len\n  var R_ISO8061_STR = /^(-?\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{3}))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d)))?$/;\n\n  var match;\n  if ((match = string.match(R_ISO8061_STR))) {\n    var date = new Date(0),\n        tzHour = 0,\n        tzMin  = 0;\n    if (match[9]) {\n      tzHour = toInt(match[9] + match[10]);\n      tzMin = toInt(match[9] + match[11]);\n    }\n    date.setUTCFullYear(toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));\n    date.setUTCHours(toInt(match[4] || 0) - tzHour,\n                     toInt(match[5] || 0) - tzMin,\n                     toInt(match[6] || 0),\n                     toInt(match[7] || 0));\n    return date;\n  }\n  return string;\n}\n\nfunction toInt(str) {\n  return parseInt(str, 10);\n}\n\nfunction padNumberInMock(num, digits, trim) {\n  var neg = '';\n  if (num < 0) {\n    neg =  '-';\n    num = -num;\n  }\n  num = '' + num;\n  while (num.length < digits) num = '0' + num;\n  if (trim) {\n    num = num.substr(num.length - digits);\n  }\n  return neg + num;\n}\n\n\n/**\n * @ngdoc type\n * @name angular.mock.TzDate\n * @description\n *\n * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`.\n *\n * Mock of the Date type which has its timezone specified via constructor arg.\n *\n * The main purpose is to create Date-like instances with timezone fixed to the specified timezone\n * offset, so that we can test code that depends on local timezone settings without dependency on\n * the time zone settings of the machine where the code is running.\n *\n * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored)\n * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC*\n *\n * @example\n * !!!! WARNING !!!!!\n * This is not a complete Date object so only methods that were implemented can be called safely.\n * To make matters worse, TzDate instances inherit stuff from Date via a prototype.\n *\n * We do our best to intercept calls to \"unimplemented\" methods, but since the list of methods is\n * incomplete we might be missing some non-standard methods. This can result in errors like:\n * \"Date.prototype.foo called on incompatible Object\".\n *\n * ```js\n * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');\n * newYearInBratislava.getTimezoneOffset() => -60;\n * newYearInBratislava.getFullYear() => 2010;\n * newYearInBratislava.getMonth() => 0;\n * newYearInBratislava.getDate() => 1;\n * newYearInBratislava.getHours() => 0;\n * newYearInBratislava.getMinutes() => 0;\n * newYearInBratislava.getSeconds() => 0;\n * ```\n *\n */\nangular.mock.TzDate = function(offset, timestamp) {\n  var self = new Date(0);\n  if (angular.isString(timestamp)) {\n    var tsStr = timestamp;\n\n    self.origDate = jsonStringToDate(timestamp);\n\n    timestamp = self.origDate.getTime();\n    if (isNaN(timestamp)) {\n      // eslint-disable-next-line no-throw-literal\n      throw {\n        name: 'Illegal Argument',\n        message: 'Arg \\'' + tsStr + '\\' passed into TzDate constructor is not a valid date string'\n      };\n    }\n  } else {\n    self.origDate = new Date(timestamp);\n  }\n\n  var localOffset = new Date(timestamp).getTimezoneOffset();\n  self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60;\n  self.date = new Date(timestamp + self.offsetDiff);\n\n  self.getTime = function() {\n    return self.date.getTime() - self.offsetDiff;\n  };\n\n  self.toLocaleDateString = function() {\n    return self.date.toLocaleDateString();\n  };\n\n  self.getFullYear = function() {\n    return self.date.getFullYear();\n  };\n\n  self.getMonth = function() {\n    return self.date.getMonth();\n  };\n\n  self.getDate = function() {\n    return self.date.getDate();\n  };\n\n  self.getHours = function() {\n    return self.date.getHours();\n  };\n\n  self.getMinutes = function() {\n    return self.date.getMinutes();\n  };\n\n  self.getSeconds = function() {\n    return self.date.getSeconds();\n  };\n\n  self.getMilliseconds = function() {\n    return self.date.getMilliseconds();\n  };\n\n  self.getTimezoneOffset = function() {\n    return offset * 60;\n  };\n\n  self.getUTCFullYear = function() {\n    return self.origDate.getUTCFullYear();\n  };\n\n  self.getUTCMonth = function() {\n    return self.origDate.getUTCMonth();\n  };\n\n  self.getUTCDate = function() {\n    return self.origDate.getUTCDate();\n  };\n\n  self.getUTCHours = function() {\n    return self.origDate.getUTCHours();\n  };\n\n  self.getUTCMinutes = function() {\n    return self.origDate.getUTCMinutes();\n  };\n\n  self.getUTCSeconds = function() {\n    return self.origDate.getUTCSeconds();\n  };\n\n  self.getUTCMilliseconds = function() {\n    return self.origDate.getUTCMilliseconds();\n  };\n\n  self.getDay = function() {\n    return self.date.getDay();\n  };\n\n  // provide this method only on browsers that already have it\n  if (self.toISOString) {\n    self.toISOString = function() {\n      return padNumberInMock(self.origDate.getUTCFullYear(), 4) + '-' +\n            padNumberInMock(self.origDate.getUTCMonth() + 1, 2) + '-' +\n            padNumberInMock(self.origDate.getUTCDate(), 2) + 'T' +\n            padNumberInMock(self.origDate.getUTCHours(), 2) + ':' +\n            padNumberInMock(self.origDate.getUTCMinutes(), 2) + ':' +\n            padNumberInMock(self.origDate.getUTCSeconds(), 2) + '.' +\n            padNumberInMock(self.origDate.getUTCMilliseconds(), 3) + 'Z';\n    };\n  }\n\n  //hide all methods not implemented in this mock that the Date prototype exposes\n  var unimplementedMethods = ['getUTCDay',\n      'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',\n      'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear',\n      'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds',\n      'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString',\n      'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf'];\n\n  angular.forEach(unimplementedMethods, function(methodName) {\n    self[methodName] = function() {\n      throw new Error('Method \\'' + methodName + '\\' is not implemented in the TzDate mock');\n    };\n  });\n\n  return self;\n};\n\n//make \"tzDateInstance instanceof Date\" return true\nangular.mock.TzDate.prototype = Date.prototype;\n\n\n/**\n * @ngdoc service\n * @name $animate\n *\n * @description\n * Mock implementation of the {@link ng.$animate `$animate`} service. Exposes two additional methods\n * for testing animations.\n *\n * You need to require the `ngAnimateMock` module in your test suite for instance `beforeEach(module('ngAnimateMock'))`\n */\nangular.mock.animate = angular.module('ngAnimateMock', ['ng'])\n  .info({ angularVersion: '1.7.8' })\n\n  .config(['$provide', function($provide) {\n\n    $provide.factory('$$forceReflow', function() {\n      function reflowFn() {\n        reflowFn.totalReflows++;\n      }\n      reflowFn.totalReflows = 0;\n      return reflowFn;\n    });\n\n    $provide.factory('$$animateAsyncRun', function() {\n      var queue = [];\n      var queueFn = function() {\n        return function(fn) {\n          queue.push(fn);\n        };\n      };\n      queueFn.flush = function() {\n        if (queue.length === 0) return false;\n\n        for (var i = 0; i < queue.length; i++) {\n          queue[i]();\n        }\n        queue = [];\n\n        return true;\n      };\n      return queueFn;\n    });\n\n    $provide.decorator('$$animateJs', ['$delegate', function($delegate) {\n      var runners = [];\n\n      var animateJsConstructor = function() {\n        var animator = $delegate.apply($delegate, arguments);\n        // If no javascript animation is found, animator is undefined\n        if (animator) {\n          runners.push(animator);\n        }\n        return animator;\n      };\n\n      animateJsConstructor.$closeAndFlush = function() {\n        runners.forEach(function(runner) {\n          runner.end();\n        });\n        runners = [];\n      };\n\n      return animateJsConstructor;\n    }]);\n\n    $provide.decorator('$animateCss', ['$delegate', function($delegate) {\n      var runners = [];\n\n      var animateCssConstructor = function(element, options) {\n        var animator = $delegate(element, options);\n        runners.push(animator);\n        return animator;\n      };\n\n      animateCssConstructor.$closeAndFlush = function() {\n        runners.forEach(function(runner) {\n          runner.end();\n        });\n        runners = [];\n      };\n\n      return animateCssConstructor;\n    }]);\n\n    $provide.decorator('$animate', ['$delegate', '$timeout', '$browser', '$$rAF', '$animateCss', '$$animateJs',\n                                    '$$forceReflow', '$$animateAsyncRun', '$rootScope',\n                            function($delegate,   $timeout,   $browser,   $$rAF,   $animateCss,   $$animateJs,\n                                     $$forceReflow,   $$animateAsyncRun,  $rootScope) {\n      var animate = {\n        queue: [],\n        cancel: $delegate.cancel,\n        on: $delegate.on,\n        off: $delegate.off,\n        pin: $delegate.pin,\n        get reflows() {\n          return $$forceReflow.totalReflows;\n        },\n        enabled: $delegate.enabled,\n        /**\n         * @ngdoc method\n         * @name $animate#closeAndFlush\n         * @description\n         *\n         * This method will close all pending animations (both {@link ngAnimate#javascript-based-animations Javascript}\n         * and {@link ngAnimate.$animateCss CSS}) and it will also flush any remaining animation frames and/or callbacks.\n         */\n        closeAndFlush: function() {\n          // we allow the flush command to swallow the errors\n          // because depending on whether CSS or JS animations are\n          // used, there may not be a RAF flush. The primary flush\n          // at the end of this function must throw an exception\n          // because it will track if there were pending animations\n          this.flush(true);\n          $animateCss.$closeAndFlush();\n          $$animateJs.$closeAndFlush();\n          this.flush();\n        },\n        /**\n         * @ngdoc method\n         * @name $animate#flush\n         * @description\n         *\n         * This method is used to flush the pending callbacks and animation frames to either start\n         * an animation or conclude an animation. Note that this will not actually close an\n         * actively running animation (see {@link ngMock.$animate#closeAndFlush `closeAndFlush()`} for that).\n         */\n        flush: function(hideErrors) {\n          $rootScope.$digest();\n\n          var doNextRun, somethingFlushed = false;\n          do {\n            doNextRun = false;\n\n            if ($$rAF.queue.length) {\n              $$rAF.flush();\n              doNextRun = somethingFlushed = true;\n            }\n\n            if ($$animateAsyncRun.flush()) {\n              doNextRun = somethingFlushed = true;\n            }\n          } while (doNextRun);\n\n          if (!somethingFlushed && !hideErrors) {\n            throw new Error('No pending animations ready to be closed or flushed');\n          }\n\n          $rootScope.$digest();\n        }\n      };\n\n      angular.forEach(\n        ['animate','enter','leave','move','addClass','removeClass','setClass'], function(method) {\n        animate[method] = function() {\n          animate.queue.push({\n            event: method,\n            element: arguments[0],\n            options: arguments[arguments.length - 1],\n            args: arguments\n          });\n          return $delegate[method].apply($delegate, arguments);\n        };\n      });\n\n      return animate;\n    }]);\n\n  }]);\n\n\n/**\n * @ngdoc function\n * @name angular.mock.dump\n * @description\n *\n * *NOTE*: This is not an injectable instance, just a globally available function.\n *\n * Method for serializing common AngularJS objects (scope, elements, etc..) into strings.\n * It is useful for logging objects to the console when debugging.\n *\n * @param {*} object - any object to turn into string.\n * @return {string} a serialized string of the argument\n */\nangular.mock.dump = function(object) {\n  return serialize(object);\n\n  function serialize(object) {\n    var out;\n\n    if (angular.isElement(object)) {\n      object = angular.element(object);\n      out = angular.element('<div></div>');\n      angular.forEach(object, function(element) {\n        out.append(angular.element(element).clone());\n      });\n      out = out.html();\n    } else if (angular.isArray(object)) {\n      out = [];\n      angular.forEach(object, function(o) {\n        out.push(serialize(o));\n      });\n      out = '[ ' + out.join(', ') + ' ]';\n    } else if (angular.isObject(object)) {\n      if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) {\n        out = serializeScope(object);\n      } else if (object instanceof Error) {\n        out = object.stack || ('' + object.name + ': ' + object.message);\n      } else {\n        // TODO(i): this prevents methods being logged,\n        // we should have a better way to serialize objects\n        out = angular.toJson(object, true);\n      }\n    } else {\n      out = String(object);\n    }\n\n    return out;\n  }\n\n  function serializeScope(scope, offset) {\n    offset = offset ||  '  ';\n    var log = [offset + 'Scope(' + scope.$id + '): {'];\n    for (var key in scope) {\n      if (Object.prototype.hasOwnProperty.call(scope, key) && !key.match(/^(\\$|this)/)) {\n        log.push('  ' + key + ': ' + angular.toJson(scope[key]));\n      }\n    }\n    var child = scope.$$childHead;\n    while (child) {\n      log.push(serializeScope(child, offset + '  '));\n      child = child.$$nextSibling;\n    }\n    log.push('}');\n    return log.join('\\n' + offset);\n  }\n};\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @description\n * Fake HTTP backend implementation suitable for unit testing applications that use the\n * {@link ng.$http $http service}.\n *\n * <div class=\"alert alert-info\">\n * **Note**: For fake HTTP backend implementation suitable for end-to-end testing or backend-less\n * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}.\n * </div>\n *\n * During unit testing, we want our unit tests to run quickly and have no external dependencies so\n * we don’t want to send [XHR](https://developer.mozilla.org/en/xmlhttprequest) or\n * [JSONP](http://en.wikipedia.org/wiki/JSONP) requests to a real server. All we really need is\n * to verify whether a certain request has been sent or not, or alternatively just let the\n * application make requests, respond with pre-trained responses and assert that the end result is\n * what we expect it to be.\n *\n * This mock implementation can be used to respond with static or dynamic responses via the\n * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc).\n *\n * When an AngularJS application needs some data from a server, it calls the $http service, which\n * sends the request to a real server using $httpBackend service. With dependency injection, it is\n * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify\n * the requests and respond with some testing data without sending a request to a real server.\n *\n * There are two ways to specify what test data should be returned as http responses by the mock\n * backend when the code under test makes http requests:\n *\n * - `$httpBackend.expect` - specifies a request expectation\n * - `$httpBackend.when` - specifies a backend definition\n *\n *\n * ## Request Expectations vs Backend Definitions\n *\n * Request expectations provide a way to make assertions about requests made by the application and\n * to define responses for those requests. The test will fail if the expected requests are not made\n * or they are made in the wrong order.\n *\n * Backend definitions allow you to define a fake backend for your application which doesn't assert\n * if a particular request was made or not, it just returns a trained response if a request is made.\n * The test will pass whether or not the request gets made during testing.\n *\n *\n * <table class=\"table\">\n *   <tr><th width=\"220px\"></th><th>Request expectations</th><th>Backend definitions</th></tr>\n *   <tr>\n *     <th>Syntax</th>\n *     <td>.expect(...).respond(...)</td>\n *     <td>.when(...).respond(...)</td>\n *   </tr>\n *   <tr>\n *     <th>Typical usage</th>\n *     <td>strict unit tests</td>\n *     <td>loose (black-box) unit testing</td>\n *   </tr>\n *   <tr>\n *     <th>Fulfills multiple requests</th>\n *     <td>NO</td>\n *     <td>YES</td>\n *   </tr>\n *   <tr>\n *     <th>Order of requests matters</th>\n *     <td>YES</td>\n *     <td>NO</td>\n *   </tr>\n *   <tr>\n *     <th>Request required</th>\n *     <td>YES</td>\n *     <td>NO</td>\n *   </tr>\n *   <tr>\n *     <th>Response required</th>\n *     <td>optional (see below)</td>\n *     <td>YES</td>\n *   </tr>\n * </table>\n *\n * In cases where both backend definitions and request expectations are specified during unit\n * testing, the request expectations are evaluated first.\n *\n * If a request expectation has no response specified, the algorithm will search your backend\n * definitions for an appropriate response.\n *\n * If a request didn't match any expectation or if the expectation doesn't have the response\n * defined, the backend definitions are evaluated in sequential order to see if any of them match\n * the request. The response from the first matched definition is returned.\n *\n *\n * ## Flushing HTTP requests\n *\n * The $httpBackend used in production always responds to requests asynchronously. If we preserved\n * this behavior in unit testing, we'd have to create async unit tests, which are hard to write,\n * to follow and to maintain. But neither can the testing mock respond synchronously; that would\n * change the execution of the code under test. For this reason, the mock $httpBackend has a\n * `flush()` method, which allows the test to explicitly flush pending requests. This preserves\n * the async api of the backend, while allowing the test to execute synchronously.\n *\n *\n * ## Unit testing with mock $httpBackend\n * The following code shows how to setup and use the mock backend when unit testing a controller.\n * First we create the controller under test:\n *\n  ```js\n  // The module code\n  angular\n    .module('MyApp', [])\n    .controller('MyController', MyController);\n\n  // The controller code\n  function MyController($scope, $http) {\n    var authToken;\n\n    $http.get('/auth.py').then(function(response) {\n      authToken = response.headers('A-Token');\n      $scope.user = response.data;\n    }).catch(function() {\n      $scope.status = 'Failed...';\n    });\n\n    $scope.saveMessage = function(message) {\n      var headers = { 'Authorization': authToken };\n      $scope.status = 'Saving...';\n\n      $http.post('/add-msg.py', message, { headers: headers } ).then(function(response) {\n        $scope.status = '';\n      }).catch(function() {\n        $scope.status = 'Failed...';\n      });\n    };\n  }\n  ```\n *\n * Now we setup the mock backend and create the test specs:\n *\n  ```js\n    // testing controller\n    describe('MyController', function() {\n       var $httpBackend, $rootScope, createController, authRequestHandler;\n\n       // Set up the module\n       beforeEach(module('MyApp'));\n\n       beforeEach(inject(function($injector) {\n         // Set up the mock http service responses\n         $httpBackend = $injector.get('$httpBackend');\n         // backend definition common for all tests\n         authRequestHandler = $httpBackend.when('GET', '/auth.py')\n                                .respond({userId: 'userX'}, {'A-Token': 'xxx'});\n\n         // Get hold of a scope (i.e. the root scope)\n         $rootScope = $injector.get('$rootScope');\n         // The $controller service is used to create instances of controllers\n         var $controller = $injector.get('$controller');\n\n         createController = function() {\n           return $controller('MyController', {'$scope' : $rootScope });\n         };\n       }));\n\n\n       afterEach(function() {\n         $httpBackend.verifyNoOutstandingExpectation();\n         $httpBackend.verifyNoOutstandingRequest();\n       });\n\n\n       it('should fetch authentication token', function() {\n         $httpBackend.expectGET('/auth.py');\n         var controller = createController();\n         $httpBackend.flush();\n       });\n\n\n       it('should fail authentication', function() {\n\n         // Notice how you can change the response even after it was set\n         authRequestHandler.respond(401, '');\n\n         $httpBackend.expectGET('/auth.py');\n         var controller = createController();\n         $httpBackend.flush();\n         expect($rootScope.status).toBe('Failed...');\n       });\n\n\n       it('should send msg to server', function() {\n         var controller = createController();\n         $httpBackend.flush();\n\n         // now you don’t care about the authentication, but\n         // the controller will still send the request and\n         // $httpBackend will respond without you having to\n         // specify the expectation and response for this request\n\n         $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');\n         $rootScope.saveMessage('message content');\n         expect($rootScope.status).toBe('Saving...');\n         $httpBackend.flush();\n         expect($rootScope.status).toBe('');\n       });\n\n\n       it('should send auth header', function() {\n         var controller = createController();\n         $httpBackend.flush();\n\n         $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {\n           // check if the header was sent, if it wasn't the expectation won't\n           // match the request and the test will fail\n           return headers['Authorization'] === 'xxx';\n         }).respond(201, '');\n\n         $rootScope.saveMessage('whatever');\n         $httpBackend.flush();\n       });\n    });\n  ```\n *\n * ## Dynamic responses\n *\n * You define a response to a request by chaining a call to `respond()` onto a definition or expectation.\n * If you provide a **callback** as the first parameter to `respond(callback)` then you can dynamically generate\n * a response based on the properties of the request.\n *\n * The `callback` function should be of the form `function(method, url, data, headers, params)`.\n *\n * ### Query parameters\n *\n * By default, query parameters on request URLs are parsed into the `params` object. So a request URL\n * of `/list?q=searchstr&orderby=-name` would set `params` to be `{q: 'searchstr', orderby: '-name'}`.\n *\n * ### Regex parameter matching\n *\n * If an expectation or definition uses a **regex** to match the URL, you can provide an array of **keys** via a\n * `params` argument. The index of each **key** in the array will match the index of a **group** in the\n * **regex**.\n *\n * The `params` object in the **callback** will now have properties with these keys, which hold the value of the\n * corresponding **group** in the **regex**.\n *\n * This also applies to the `when` and `expect` shortcut methods.\n *\n *\n * ```js\n *   $httpBackend.expect('GET', /\\/user\\/(.+)/, undefined, undefined, ['id'])\n *     .respond(function(method, url, data, headers, params) {\n *       // for requested url of '/user/1234' params is {id: '1234'}\n *     });\n *\n *   $httpBackend.whenPATCH(/\\/user\\/(.+)\\/article\\/(.+)/, undefined, undefined, ['user', 'article'])\n *     .respond(function(method, url, data, headers, params) {\n *       // for url of '/user/1234/article/567' params is {user: '1234', article: '567'}\n *     });\n * ```\n *\n * ## Matching route requests\n *\n * For extra convenience, `whenRoute` and `expectRoute` shortcuts are available. These methods offer colon\n * delimited matching of the url path, ignoring the query string and trailing slashes. This allows declarations\n * similar to how application routes are configured with `$routeProvider`. Because these methods convert\n * the definition url to regex, declaration order is important. Combined with query parameter parsing,\n * the following is possible:\n *\n  ```js\n    $httpBackend.whenRoute('GET', '/users/:id')\n      .respond(function(method, url, data, headers, params) {\n        return [200, MockUserList[Number(params.id)]];\n      });\n\n    $httpBackend.whenRoute('GET', '/users')\n      .respond(function(method, url, data, headers, params) {\n        var userList = angular.copy(MockUserList),\n          defaultSort = 'lastName',\n          count, pages, isPrevious, isNext;\n\n        // paged api response '/v1/users?page=2'\n        params.page = Number(params.page) || 1;\n\n        // query for last names '/v1/users?q=Archer'\n        if (params.q) {\n          userList = $filter('filter')({lastName: params.q});\n        }\n\n        pages = Math.ceil(userList.length / pagingLength);\n        isPrevious = params.page > 1;\n        isNext = params.page < pages;\n\n        return [200, {\n          count:    userList.length,\n          previous: isPrevious,\n          next:     isNext,\n          // sort field -> '/v1/users?sortBy=firstName'\n          results:  $filter('orderBy')(userList, params.sortBy || defaultSort)\n                      .splice((params.page - 1) * pagingLength, pagingLength)\n        }];\n      });\n  ```\n */\nangular.mock.$httpBackendDecorator =\n  ['$rootScope', '$timeout', '$delegate', createHttpBackendMock];\n\n/**\n * General factory function for $httpBackend mock.\n * Returns instance for unit testing (when no arguments specified):\n *   - passing through is disabled\n *   - auto flushing is disabled\n *\n * Returns instance for e2e testing (when `$delegate` and `$browser` specified):\n *   - passing through (delegating request to real backend) is enabled\n *   - auto flushing is enabled\n *\n * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified)\n * @param {Object=} $browser Auto-flushing enabled if specified\n * @return {Object} Instance of $httpBackend mock\n */\nfunction createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {\n  var definitions = [],\n      expectations = [],\n      matchLatestDefinition = false,\n      responses = [],\n      responsesPush = angular.bind(responses, responses.push),\n      copy = angular.copy,\n      // We cache the original backend so that if both ngMock and ngMockE2E override the\n      // service the ngMockE2E version can pass through to the real backend\n      originalHttpBackend = $delegate.$$originalHttpBackend || $delegate;\n\n  function createResponse(status, data, headers, statusText) {\n    if (angular.isFunction(status)) return status;\n\n    return function() {\n      return angular.isNumber(status)\n          ? [status, data, headers, statusText, 'complete']\n          : [200, status, data, headers, 'complete'];\n    };\n  }\n\n  // TODO(vojta): change params to: method, url, data, headers, callback\n  function $httpBackend(method, url, data, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) {\n\n    var xhr = new MockXhr(),\n        expectation = expectations[0],\n        wasExpected = false;\n\n    xhr.$$events = eventHandlers;\n    xhr.upload.$$events = uploadEventHandlers;\n\n    function prettyPrint(data) {\n      return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp)\n          ? data\n          : angular.toJson(data);\n    }\n\n    function wrapResponse(wrapped) {\n      if (!$browser && timeout) {\n        if (timeout.then) {\n          timeout.then(function() {\n            handlePrematureEnd(angular.isDefined(timeout.$$timeoutId) ? 'timeout' : 'abort');\n          });\n        } else {\n          $timeout(function() {\n            handlePrematureEnd('timeout');\n          }, timeout);\n        }\n      }\n\n      handleResponse.description = method + ' ' + url;\n      return handleResponse;\n\n      function handleResponse() {\n        var response = wrapped.response(method, url, data, headers, wrapped.params(url));\n        xhr.$$respHeaders = response[2];\n        callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(),\n                 copy(response[3] || ''), copy(response[4]));\n      }\n\n      function handlePrematureEnd(reason) {\n        for (var i = 0, ii = responses.length; i < ii; i++) {\n          if (responses[i] === handleResponse) {\n            responses.splice(i, 1);\n            callback(-1, undefined, '', undefined, reason);\n            break;\n          }\n        }\n      }\n    }\n\n    function createFatalError(message) {\n      var error = new Error(message);\n      // In addition to being converted to a rejection, these errors also need to be passed to\n      // the $exceptionHandler and be rethrown (so that the test fails).\n      error.$$passToExceptionHandler = true;\n      return error;\n    }\n\n    if (expectation && expectation.match(method, url)) {\n      if (!expectation.matchData(data)) {\n        throw createFatalError('Expected ' + expectation + ' with different data\\n' +\n          'EXPECTED: ' + prettyPrint(expectation.data) + '\\n' +\n          'GOT:      ' + data);\n      }\n\n      if (!expectation.matchHeaders(headers)) {\n        throw createFatalError('Expected ' + expectation + ' with different headers\\n' +\n          'EXPECTED: ' + prettyPrint(expectation.headers) + '\\n' +\n          'GOT:      ' + prettyPrint(headers));\n      }\n\n      expectations.shift();\n\n      if (expectation.response) {\n        responses.push(wrapResponse(expectation));\n        return;\n      }\n      wasExpected = true;\n    }\n\n    var i = matchLatestDefinition ? definitions.length : -1, definition;\n\n    while ((definition = definitions[matchLatestDefinition ? --i : ++i])) {\n      if (definition.match(method, url, data, headers || {})) {\n        if (definition.response) {\n          // if $browser specified, we do auto flush all requests\n          ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));\n        } else if (definition.passThrough) {\n          originalHttpBackend(method, url, data, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers);\n        } else throw createFatalError('No response defined !');\n        return;\n      }\n    }\n\n    if (wasExpected) {\n      throw createFatalError('No response defined !');\n    }\n\n    throw createFatalError('Unexpected request: ' + method + ' ' + url + '\\n' +\n      (expectation ? 'Expected ' + expectation : 'No more request expected'));\n  }\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#when\n   * @description\n   * Creates a new backend definition.\n   *\n   * @param {string} method HTTP method.\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n   *   data string and returns true if the data is as expected.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current definition.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   *\n   *  - respond –\n   *      ```js\n   *      {function([status,] data[, headers, statusText])\n   *      | function(function(method, url, data, headers, params)}\n   *      ```\n   *    – The respond method takes a set of static data to be returned or a function that can\n   *    return an array containing response status (number), response data (Array|Object|string),\n   *    response headers (Object), HTTP status text (string), and XMLHttpRequest status (string:\n   *    `complete`, `error`, `timeout` or `abort`). The respond method returns the `requestHandler`\n   *    object for possible overrides.\n   */\n  $httpBackend.when = function(method, url, data, headers, keys) {\n\n    assertArgDefined(arguments, 1, 'url');\n\n    var definition = new MockHttpExpectation(method, url, data, headers, keys),\n        chain = {\n          respond: function(status, data, headers, statusText) {\n            definition.passThrough = undefined;\n            definition.response = createResponse(status, data, headers, statusText);\n            return chain;\n          }\n        };\n\n    if ($browser) {\n      chain.passThrough = function() {\n        definition.response = undefined;\n        definition.passThrough = true;\n        return chain;\n      };\n    }\n\n    definitions.push(definition);\n    return chain;\n  };\n\n  /**\n   * @ngdoc method\n   * @name  $httpBackend#matchLatestDefinitionEnabled\n   * @description\n   * This method can be used to change which mocked responses `$httpBackend` returns, when defining\n   * them with {@link ngMock.$httpBackend#when $httpBackend.when()} (and shortcut methods).\n   * By default, `$httpBackend` returns the first definition that matches. When setting\n   * `$http.matchLatestDefinitionEnabled(true)`, it will use the last response that matches, i.e. the\n   * one that was added last.\n   *\n   * ```js\n   * hb.when('GET', '/url1').respond(200, 'content', {});\n   * hb.when('GET', '/url1').respond(201, 'another', {});\n   * hb('GET', '/url1'); // receives \"content\"\n   *\n   * $http.matchLatestDefinitionEnabled(true)\n   * hb('GET', '/url1'); // receives \"another\"\n   *\n   * hb.when('GET', '/url1').respond(201, 'onemore', {});\n   * hb('GET', '/url1'); // receives \"onemore\"\n   * ```\n   *\n   * This is useful if a you have a default response that is overriden inside specific tests.\n   *\n   * Note that different from config methods on providers, `matchLatestDefinitionEnabled()` can be changed\n   * even when the application is already running.\n   *\n   * @param  {Boolean=} value value to set, either `true` or `false`. Default is `false`.\n   *                          If omitted, it will return the current value.\n   * @return {$httpBackend|Boolean} self when used as a setter, and the current value when used\n   *                                as a getter\n   */\n  $httpBackend.matchLatestDefinitionEnabled = function(value) {\n    if (angular.isDefined(value)) {\n      matchLatestDefinition = value;\n      return this;\n    } else {\n      return matchLatestDefinition;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenGET\n   * @description\n   * Creates a new backend definition for GET requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current definition.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenHEAD\n   * @description\n   * Creates a new backend definition for HEAD requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current definition.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenDELETE\n   * @description\n   * Creates a new backend definition for DELETE requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current definition.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenPOST\n   * @description\n   * Creates a new backend definition for POST requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n   *   data string and returns true if the data is as expected.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current definition.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenPUT\n   * @description\n   * Creates a new backend definition for PUT requests.  For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n   *   data string and returns true if the data is as expected.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current definition.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenJSONP\n   * @description\n   * Creates a new backend definition for JSONP requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n  createShortMethods('when');\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenRoute\n   * @description\n   * Creates a new backend definition that compares only with the requested route.\n   *\n   * @param {string} method HTTP method.\n   * @param {string} url HTTP url string that supports colon param matching.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   * See {@link ngMock.$httpBackend#when `when`} for more info.\n   */\n  $httpBackend.whenRoute = function(method, url) {\n    var parsed = parseRouteUrl(url);\n    return $httpBackend.when(method, parsed.regexp, undefined, undefined, parsed.keys);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expect\n   * @description\n   * Creates a new request expectation.\n   *\n   * @param {string} method HTTP method.\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current definition.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *  request is handled. You can save this object for later use and invoke `respond` again in\n   *  order to change how a matched request is handled.\n   *\n   *  - respond –\n   *      ```js\n   *      {function([status,] data[, headers, statusText])\n   *      | function(function(method, url, data, headers, params)}\n   *      ```\n   *    – The respond method takes a set of static data to be returned or a function that can\n   *    return an array containing response status (number), response data (Array|Object|string),\n   *    response headers (Object), HTTP status text (string), and XMLHttpRequest status (string:\n   *    `complete`, `error`, `timeout` or `abort`). The respond method returns the `requestHandler`\n   *    object for possible overrides.\n   */\n  $httpBackend.expect = function(method, url, data, headers, keys) {\n\n    assertArgDefined(arguments, 1, 'url');\n\n    var expectation = new MockHttpExpectation(method, url, data, headers, keys),\n        chain = {\n          respond: function(status, data, headers, statusText) {\n            expectation.response = createResponse(status, data, headers, statusText);\n            return chain;\n          }\n        };\n\n    expectations.push(expectation);\n    return chain;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectGET\n   * @description\n   * Creates a new request expectation for GET requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current expectation.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled. See #expect for more info.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectHEAD\n   * @description\n   * Creates a new request expectation for HEAD requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current expectation.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectDELETE\n   * @description\n   * Creates a new request expectation for DELETE requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current expectation.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectPOST\n   * @description\n   * Creates a new request expectation for POST requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current expectation.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectPUT\n   * @description\n   * Creates a new request expectation for PUT requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current expectation.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectPATCH\n   * @description\n   * Creates a new request expectation for PATCH requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n   *   and returns true if the url matches the current expectation.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectJSONP\n   * @description\n   * Creates a new request expectation for JSONP requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)=} url HTTP url or function that receives an url\n   *   and returns true if the url matches the current expectation.\n   * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n  createShortMethods('expect');\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectRoute\n   * @description\n   * Creates a new request expectation that compares only with the requested route.\n   *\n   * @param {string} method HTTP method.\n   * @param {string} url HTTP url string that supports colon param matching.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   * See {@link ngMock.$httpBackend#expect `expect`} for more info.\n   */\n  $httpBackend.expectRoute = function(method, url) {\n    var parsed = parseRouteUrl(url);\n    return $httpBackend.expect(method, parsed.regexp, undefined, undefined, parsed.keys);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#flush\n   * @description\n   * Flushes pending requests using the trained responses. Requests are flushed in the order they\n   * were made, but it is also possible to skip one or more requests (for example to have them\n   * flushed later). This is useful for simulating scenarios where responses arrive from the server\n   * in any order.\n   *\n   * If there are no pending requests to flush when the method is called, an exception is thrown (as\n   * this is typically a sign of programming error).\n   *\n   * @param {number=} count - Number of responses to flush. If undefined/null, all pending requests\n   *     (starting after `skip`) will be flushed.\n   * @param {number=} [skip=0] - Number of pending requests to skip. For example, a value of `5`\n   *     would skip the first 5 pending requests and start flushing from the 6th onwards.\n   */\n  $httpBackend.flush = function(count, skip, digest) {\n    if (digest !== false) $rootScope.$digest();\n\n    skip = skip || 0;\n    if (skip >= responses.length) throw new Error('No pending request to flush !');\n\n    if (angular.isDefined(count) && count !== null) {\n      while (count--) {\n        var part = responses.splice(skip, 1);\n        if (!part.length) throw new Error('No more pending request to flush !');\n        part[0]();\n      }\n    } else {\n      while (responses.length > skip) {\n        responses.splice(skip, 1)[0]();\n      }\n    }\n    $httpBackend.verifyNoOutstandingExpectation(digest);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#verifyNoOutstandingExpectation\n   * @description\n   * Verifies that all of the requests defined via the `expect` api were made. If any of the\n   * requests were not made, verifyNoOutstandingExpectation throws an exception.\n   *\n   * Typically, you would call this method following each test case that asserts requests using an\n   * \"afterEach\" clause.\n   *\n   * ```js\n   *   afterEach($httpBackend.verifyNoOutstandingExpectation);\n   * ```\n   */\n  $httpBackend.verifyNoOutstandingExpectation = function(digest) {\n    if (digest !== false) $rootScope.$digest();\n    if (expectations.length) {\n      throw new Error('Unsatisfied requests: ' + expectations.join(', '));\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#verifyNoOutstandingRequest\n   * @description\n   * Verifies that there are no outstanding requests that need to be flushed.\n   *\n   * Typically, you would call this method following each test case that asserts requests using an\n   * \"afterEach\" clause.\n   *\n   * ```js\n   *   afterEach($httpBackend.verifyNoOutstandingRequest);\n   * ```\n   */\n  $httpBackend.verifyNoOutstandingRequest = function(digest) {\n    if (digest !== false) $rootScope.$digest();\n    if (responses.length) {\n      var unflushedDescriptions = responses.map(function(res) { return res.description; });\n      throw new Error('Unflushed requests: ' + responses.length + '\\n  ' +\n                      unflushedDescriptions.join('\\n  '));\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#resetExpectations\n   * @description\n   * Resets all request expectations, but preserves all backend definitions. Typically, you would\n   * call resetExpectations during a multiple-phase test when you want to reuse the same instance of\n   * $httpBackend mock.\n   */\n  $httpBackend.resetExpectations = function() {\n    expectations.length = 0;\n    responses.length = 0;\n  };\n\n  $httpBackend.$$originalHttpBackend = originalHttpBackend;\n\n  return $httpBackend;\n\n\n  function createShortMethods(prefix) {\n    angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {\n     $httpBackend[prefix + method] = function(url, headers, keys) {\n        assertArgDefined(arguments, 0, 'url');\n\n        // Change url to `null` if `undefined` to stop it throwing an exception further down\n        if (angular.isUndefined(url)) url = null;\n\n       return $httpBackend[prefix](method, url, undefined, headers, keys);\n     };\n    });\n\n    angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {\n      $httpBackend[prefix + method] = function(url, data, headers, keys) {\n        assertArgDefined(arguments, 0, 'url');\n\n        // Change url to `null` if `undefined` to stop it throwing an exception further down\n        if (angular.isUndefined(url)) url = null;\n\n        return $httpBackend[prefix](method, url, data, headers, keys);\n      };\n    });\n  }\n\n  function parseRouteUrl(url) {\n    var strippedUrl = stripQueryAndHash(url);\n    var parseOptions = {caseInsensitiveMatch: true, ignoreTrailingSlashes: true};\n    return routeToRegExp(strippedUrl, parseOptions);\n  }\n}\n\nfunction assertArgDefined(args, index, name) {\n  if (args.length > index && angular.isUndefined(args[index])) {\n    throw new Error('Undefined argument `' + name + '`; the argument is provided but not defined');\n  }\n}\n\nfunction stripQueryAndHash(url) {\n  return url.replace(/[?#].*$/, '');\n}\n\nfunction MockHttpExpectation(expectedMethod, expectedUrl, expectedData, expectedHeaders,\n                             expectedKeys) {\n\n  this.data = expectedData;\n  this.headers = expectedHeaders;\n\n  this.match = function(method, url, data, headers) {\n    if (expectedMethod !== method) return false;\n    if (!this.matchUrl(url)) return false;\n    if (angular.isDefined(data) && !this.matchData(data)) return false;\n    if (angular.isDefined(headers) && !this.matchHeaders(headers)) return false;\n    return true;\n  };\n\n  this.matchUrl = function(url) {\n    if (!expectedUrl) return true;\n    if (angular.isFunction(expectedUrl.test)) return expectedUrl.test(url);\n    if (angular.isFunction(expectedUrl)) return expectedUrl(url);\n    return (expectedUrl === url || compareUrlWithQuery(url));\n  };\n\n  this.matchHeaders = function(headers) {\n    if (angular.isUndefined(expectedHeaders)) return true;\n    if (angular.isFunction(expectedHeaders)) return expectedHeaders(headers);\n    return angular.equals(expectedHeaders, headers);\n  };\n\n  this.matchData = function(data) {\n    if (angular.isUndefined(expectedData)) return true;\n    if (expectedData && angular.isFunction(expectedData.test)) return expectedData.test(data);\n    if (expectedData && angular.isFunction(expectedData)) return expectedData(data);\n    if (expectedData && !angular.isString(expectedData)) {\n      return angular.equals(angular.fromJson(angular.toJson(expectedData)), angular.fromJson(data));\n    }\n    // eslint-disable-next-line eqeqeq\n    return expectedData == data;\n  };\n\n  this.toString = function() {\n    return expectedMethod + ' ' + expectedUrl;\n  };\n\n  this.params = function(url) {\n    var queryStr = url.indexOf('?') === -1 ? '' : url.substring(url.indexOf('?') + 1);\n    var strippedUrl = stripQueryAndHash(url);\n\n    return angular.extend(extractParamsFromQuery(queryStr), extractParamsFromPath(strippedUrl));\n  };\n\n  function compareUrlWithQuery(url) {\n    var urlWithQueryRe = /^([^?]*)\\?(.*)$/;\n\n    var expectedMatch = urlWithQueryRe.exec(expectedUrl);\n    var actualMatch = urlWithQueryRe.exec(url);\n\n    return !!(expectedMatch && actualMatch) &&\n      (expectedMatch[1] === actualMatch[1]) &&\n      (normalizeQuery(expectedMatch[2]) === normalizeQuery(actualMatch[2]));\n  }\n\n  function normalizeQuery(queryStr) {\n    return queryStr.split('&').sort().join('&');\n  }\n\n  function extractParamsFromPath(strippedUrl) {\n    var keyObj = {};\n\n    if (!expectedUrl || !angular.isFunction(expectedUrl.test) ||\n        !expectedKeys || !expectedKeys.length) return keyObj;\n\n    var match = expectedUrl.exec(strippedUrl);\n    if (!match) return keyObj;\n\n    for (var i = 1, len = match.length; i < len; ++i) {\n      var key = expectedKeys[i - 1];\n      var val = match[i];\n      if (key && val) {\n        keyObj[key.name || key] = val;\n      }\n    }\n\n    return keyObj;\n  }\n\n  function extractParamsFromQuery(queryStr) {\n    var obj = {},\n        keyValuePairs = queryStr.split('&').\n            filter(angular.identity).  // Ignore empty segments.\n            map(function(keyValue) { return keyValue.replace(/\\+/g, '%20').split('='); });\n\n    angular.forEach(keyValuePairs, function(pair) {\n      var key = tryDecodeURIComponent(pair[0]);\n      if (angular.isDefined(key)) {\n        var val = angular.isDefined(pair[1]) ? tryDecodeURIComponent(pair[1]) : true;\n        if (!hasOwnProperty.call(obj, key)) {\n          obj[key] = val;\n        } else if (angular.isArray(obj[key])) {\n          obj[key].push(val);\n        } else {\n          obj[key] = [obj[key], val];\n        }\n      }\n    });\n\n    return obj;\n  }\n\n  function tryDecodeURIComponent(value) {\n    try {\n      return decodeURIComponent(value);\n    } catch (e) {\n      // Ignore any invalid uri component\n    }\n  }\n}\n\nfunction createMockXhr() {\n  return new MockXhr();\n}\n\nfunction MockXhr() {\n\n  // hack for testing $http, $httpBackend\n  MockXhr.$$lastInstance = this;\n\n  this.open = function(method, url, async) {\n    this.$$method = method;\n    this.$$url = url;\n    this.$$async = async;\n    this.$$reqHeaders = {};\n    this.$$respHeaders = {};\n  };\n\n  this.send = function(data) {\n    this.$$data = data;\n  };\n\n  this.setRequestHeader = function(key, value) {\n    this.$$reqHeaders[key] = value;\n  };\n\n  this.getResponseHeader = function(name) {\n    // the lookup must be case insensitive,\n    // that's why we try two quick lookups first and full scan last\n    var header = this.$$respHeaders[name];\n    if (header) return header;\n\n    name = angular.$$lowercase(name);\n    header = this.$$respHeaders[name];\n    if (header) return header;\n\n    header = undefined;\n    angular.forEach(this.$$respHeaders, function(headerVal, headerName) {\n      if (!header && angular.$$lowercase(headerName) === name) header = headerVal;\n    });\n    return header;\n  };\n\n  this.getAllResponseHeaders = function() {\n    var lines = [];\n\n    angular.forEach(this.$$respHeaders, function(value, key) {\n      lines.push(key + ': ' + value);\n    });\n    return lines.join('\\n');\n  };\n\n  this.abort = function() {\n    if (isFunction(this.onabort)) {\n      this.onabort();\n    }\n  };\n\n  // This section simulates the events on a real XHR object (and the upload object)\n  // When we are testing $httpBackend (inside the AngularJS project) we make partial use of this\n  // but store the events directly ourselves on `$$events`, instead of going through the `addEventListener`\n  this.$$events = {};\n  this.addEventListener = function(name, listener) {\n    if (angular.isUndefined(this.$$events[name])) this.$$events[name] = [];\n    this.$$events[name].push(listener);\n  };\n\n  this.upload = {\n    $$events: {},\n    addEventListener: this.addEventListener\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $timeout\n * @description\n *\n * This service is just a simple decorator for {@link ng.$timeout $timeout} service\n * that adds a \"flush\" and \"verifyNoPendingTasks\" methods.\n */\n\nangular.mock.$TimeoutDecorator = ['$delegate', '$browser', function($delegate, $browser) {\n\n  /**\n   * @ngdoc method\n   * @name $timeout#flush\n   *\n   * @deprecated\n   * sinceVersion=\"1.7.3\"\n   *\n   * This method flushes all types of tasks (not only timeouts), which is unintuitive.\n   * It is recommended to use {@link ngMock.$flushPendingTasks} instead.\n   *\n   * @description\n   *\n   * Flushes the queue of pending tasks.\n   *\n   * _This method is essentially an alias of {@link ngMock.$flushPendingTasks}._\n   *\n   * <div class=\"alert alert-warning\">\n   *   For historical reasons, this method will also flush non-`$timeout` pending tasks, such as\n   *   {@link $q} promises and tasks scheduled via\n   *   {@link ng.$rootScope.Scope#$applyAsync $applyAsync} and\n   *   {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.\n   * </div>\n   *\n   * @param {number=} delay maximum timeout amount to flush up until\n   */\n  $delegate.flush = function(delay) {\n    // For historical reasons, `$timeout.flush()` flushes all types of pending tasks.\n    // Keep the same behavior for backwards compatibility (and because it doesn't make sense to\n    // selectively flush scheduled events out of order).\n    $browser.defer.flush(delay);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $timeout#verifyNoPendingTasks\n   *\n   * @deprecated\n   * sinceVersion=\"1.7.3\"\n   *\n   * This method takes all types of tasks (not only timeouts) into account, which is unintuitive.\n   * It is recommended to use {@link ngMock.$verifyNoPendingTasks} instead, which additionally\n   * allows checking for timeouts only (with `$verifyNoPendingTasks('$timeout')`).\n   *\n   * @description\n   *\n   * Verifies that there are no pending tasks that need to be flushed. It throws an error if there\n   * are still pending tasks.\n   *\n   * _This method is essentially an alias of {@link ngMock.$verifyNoPendingTasks} (called with no\n   * arguments)._\n   *\n   * <div class=\"alert alert-warning\">\n   *   <p>\n   *     For historical reasons, this method will also verify non-`$timeout` pending tasks, such as\n   *     pending {@link $http} requests, in-progress {@link $route} transitions, unresolved\n   *     {@link $q} promises and tasks scheduled via\n   *     {@link ng.$rootScope.Scope#$applyAsync $applyAsync} and\n   *     {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.\n   *   </p>\n   *   <p>\n   *     It is recommended to use {@link ngMock.$verifyNoPendingTasks} instead, which additionally\n   *     supports verifying a specific type of tasks. For example, you can verify there are no\n   *     pending timeouts with `$verifyNoPendingTasks('$timeout')`.\n   *   </p>\n   * </div>\n   */\n  $delegate.verifyNoPendingTasks = function() {\n    // For historical reasons, `$timeout.verifyNoPendingTasks()` takes all types of pending tasks\n    // into account. Keep the same behavior for backwards compatibility.\n    var pendingTasks = $browser.defer.getPendingTasks();\n\n    if (pendingTasks.length) {\n      var formattedTasks = $browser.defer.formatPendingTasks(pendingTasks).join('\\n  ');\n      var hasPendingTimeout = pendingTasks.some(function(task) { return task.type === '$timeout'; });\n      var extraMessage = hasPendingTimeout ? '' : '\\n\\nNone of the pending tasks are timeouts. ' +\n          'If you only want to verify pending timeouts, use ' +\n          '`$verifyNoPendingTasks(\\'$timeout\\')` instead.';\n\n      throw new Error('Deferred tasks to flush (' + pendingTasks.length + '):\\n  ' +\n          formattedTasks + extraMessage);\n    }\n  };\n\n  return $delegate;\n}];\n\nangular.mock.$RAFDecorator = ['$delegate', function($delegate) {\n  var rafFn = function(fn) {\n    var index = rafFn.queue.length;\n    rafFn.queue.push(fn);\n    return function() {\n      rafFn.queue.splice(index, 1);\n    };\n  };\n\n  rafFn.queue = [];\n  rafFn.supported = $delegate.supported;\n\n  rafFn.flush = function() {\n    if (rafFn.queue.length === 0) {\n      throw new Error('No rAF callbacks present');\n    }\n\n    var length = rafFn.queue.length;\n    for (var i = 0; i < length; i++) {\n      rafFn.queue[i]();\n    }\n\n    rafFn.queue = rafFn.queue.slice(i);\n  };\n\n  return rafFn;\n}];\n\n/**\n *\n */\nvar originalRootElement;\nangular.mock.$RootElementProvider = function() {\n  this.$get = ['$injector', function($injector) {\n    originalRootElement = angular.element('<div ng-app></div>').data('$injector', $injector);\n    return originalRootElement;\n  }];\n};\n\n/**\n * @ngdoc service\n * @name $controller\n * @description\n * A decorator for {@link ng.$controller} with additional `bindings` parameter, useful when testing\n * controllers of directives that use {@link $compile#-bindtocontroller- `bindToController`}.\n *\n * ## Example\n *\n * ```js\n *\n * // Directive definition ...\n *\n * myMod.directive('myDirective', {\n *   controller: 'MyDirectiveController',\n *   bindToController: {\n *     name: '@'\n *   }\n * });\n *\n *\n * // Controller definition ...\n *\n * myMod.controller('MyDirectiveController', ['$log', function($log) {\n *   this.log = function() {\n *     $log.info(this.name);\n *   };\n * }]);\n *\n *\n * // In a test ...\n *\n * describe('myDirectiveController', function() {\n *   describe('log()', function() {\n *     it('should write the bound name to the log', inject(function($controller, $log) {\n *       var ctrl = $controller('MyDirectiveController', { /* no locals &#42;/ }, { name: 'Clark Kent' });\n *       ctrl.log();\n *\n *       expect(ctrl.name).toEqual('Clark Kent');\n *       expect($log.info.logs).toEqual(['Clark Kent']);\n *     }));\n *   });\n * });\n *\n * ```\n *\n * @param {Function|string} constructor If called with a function then it's considered to be the\n *    controller constructor function. Otherwise it's considered to be a string which is used\n *    to retrieve the controller constructor using the following steps:\n *\n *    * check if a controller with given name is registered via `$controllerProvider`\n *    * check if evaluating the string on the current scope returns a constructor\n *\n *    The string can use the `controller as property` syntax, where the controller instance is published\n *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this\n *    to work correctly.\n *\n * @param {Object} locals Injection locals for Controller.\n * @param {Object=} bindings Properties to add to the controller instance. This is used to simulate\n *                           the `bindToController` feature and simplify certain kinds of tests.\n * @return {Object} Instance of given controller.\n */\nfunction createControllerDecorator() {\n  angular.mock.$ControllerDecorator = ['$delegate', function($delegate) {\n    return function(expression, locals, later, ident) {\n      if (later && typeof later === 'object') {\n        var instantiate = $delegate(expression, locals, true, ident);\n        var instance = instantiate();\n        angular.extend(instance, later);\n        return instance;\n      }\n      return $delegate(expression, locals, later, ident);\n    };\n  }];\n\n  return angular.mock.$ControllerDecorator;\n}\n\n/**\n * @ngdoc service\n * @name $componentController\n * @description\n * A service that can be used to create instances of component controllers. Useful for unit-testing.\n *\n * Be aware that the controller will be instantiated and attached to the scope as specified in\n * the component definition object. If you do not provide a `$scope` object in the `locals` param\n * then the helper will create a new isolated scope as a child of `$rootScope`.\n *\n * If you are using `$element` or `$attrs` in the controller, make sure to provide them as `locals`.\n * The `$element` must be a jqLite-wrapped DOM element, and `$attrs` should be an object that\n * has all properties / functions that you are using in the controller. If this is getting too complex,\n * you should compile the component instead and access the component's controller via the\n * {@link angular.element#methods `controller`} function.\n *\n * See also the section on {@link guide/component#unit-testing-component-controllers unit-testing component controllers}\n * in the guide.\n *\n * @param {string} componentName the name of the component whose controller we want to instantiate\n * @param {Object} locals Injection locals for Controller.\n * @param {Object=} bindings Properties to add to the controller before invoking the constructor. This is used\n *                           to simulate the `bindToController` feature and simplify certain kinds of tests.\n * @param {string=} ident Override the property name to use when attaching the controller to the scope.\n * @return {Object} Instance of requested controller.\n */\nangular.mock.$ComponentControllerProvider = ['$compileProvider',\n    function ComponentControllerProvider($compileProvider) {\n  this.$get = ['$controller','$injector', '$rootScope', function($controller, $injector, $rootScope) {\n    return function $componentController(componentName, locals, bindings, ident) {\n      // get all directives associated to the component name\n      var directives = $injector.get(componentName + 'Directive');\n      // look for those directives that are components\n      var candidateDirectives = directives.filter(function(directiveInfo) {\n        // components have controller, controllerAs and restrict:'E'\n        return directiveInfo.controller && directiveInfo.controllerAs && directiveInfo.restrict === 'E';\n      });\n      // check if valid directives found\n      if (candidateDirectives.length === 0) {\n        throw new Error('No component found');\n      }\n      if (candidateDirectives.length > 1) {\n        throw new Error('Too many components found');\n      }\n      // get the info of the component\n      var directiveInfo = candidateDirectives[0];\n      // create a scope if needed\n      locals = locals || {};\n      locals.$scope = locals.$scope || $rootScope.$new(true);\n      return $controller(directiveInfo.controller, locals, bindings, ident || directiveInfo.controllerAs);\n    };\n  }];\n}];\n\n\n/**\n * @ngdoc module\n * @name ngMock\n * @packageName angular-mocks\n * @description\n *\n * The `ngMock` module provides support to inject and mock AngularJS services into unit tests.\n * In addition, ngMock also extends various core AngularJS services such that they can be\n * inspected and controlled in a synchronous manner within test code.\n *\n * @installation\n *\n *  First, download the file:\n *  * [Google CDN](https://developers.google.com/speed/libraries/devguide#angularjs) e.g.\n *    `\"//ajax.googleapis.com/ajax/libs/angularjs/X.Y.Z/angular-mocks.js\"`\n *  * [NPM](https://www.npmjs.com/) e.g. `npm install angular-mocks@X.Y.Z`\n *  * [Yarn](https://yarnpkg.com) e.g. `yarn add angular-mocks@X.Y.Z`\n *  * [Bower](http://bower.io) e.g. `bower install angular-mocks#X.Y.Z`\n *  * [code.angularjs.org](https://code.angularjs.org/) (discouraged for production use)  e.g.\n *    `\"//code.angularjs.org/X.Y.Z/angular-mocks.js\"`\n *\n * where X.Y.Z is the AngularJS version you are running.\n *\n * Then, configure your test runner to load `angular-mocks.js` after `angular.js`.\n * This example uses <a href=\"http://karma-runner.github.io/\">Karma</a>:\n *\n * ```\n * config.set({\n *   files: [\n *     'build/angular.js', // and other module files you need\n *     'build/angular-mocks.js',\n *     '<path/to/application/files>',\n *     '<path/to/spec/files>'\n *   ]\n * });\n * ```\n *\n * Including the `angular-mocks.js` file automatically adds the `ngMock` module, so your tests\n *  are ready to go!\n */\nangular.module('ngMock', ['ng']).provider({\n  $browser: angular.mock.$BrowserProvider,\n  $exceptionHandler: angular.mock.$ExceptionHandlerProvider,\n  $log: angular.mock.$LogProvider,\n  $interval: angular.mock.$IntervalProvider,\n  $rootElement: angular.mock.$RootElementProvider,\n  $componentController: angular.mock.$ComponentControllerProvider,\n  $flushPendingTasks: angular.mock.$FlushPendingTasksProvider,\n  $verifyNoPendingTasks: angular.mock.$VerifyNoPendingTasksProvider\n}).config(['$provide', '$compileProvider', function($provide, $compileProvider) {\n  $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);\n  $provide.decorator('$$rAF', angular.mock.$RAFDecorator);\n  $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator);\n  $provide.decorator('$controller', createControllerDecorator($compileProvider));\n  $provide.decorator('$httpBackend', angular.mock.$httpBackendDecorator);\n}]).info({ angularVersion: '1.7.8' });\n\n/**\n * @ngdoc module\n * @name ngMockE2E\n * @module ngMockE2E\n * @packageName angular-mocks\n * @description\n *\n * The `ngMockE2E` is an AngularJS module which contains mocks suitable for end-to-end testing.\n * Currently there is only one mock present in this module -\n * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.\n */\nangular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {\n  $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);\n}]).info({ angularVersion: '1.7.8' });\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @module ngMockE2E\n * @description\n * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of\n * applications that use the {@link ng.$http $http service}.\n *\n * <div class=\"alert alert-info\">\n * **Note**: For fake http backend implementation suitable for unit testing please see\n * {@link ngMock.$httpBackend unit-testing $httpBackend mock}.\n * </div>\n *\n * This implementation can be used to respond with static or dynamic responses via the `when` api\n * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the\n * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch\n * templates from a webserver).\n *\n * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application\n * is being developed with the real backend api replaced with a mock, it is often desirable for\n * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch\n * templates or static files from the webserver). To configure the backend with this behavior\n * use the `passThrough` request handler of `when` instead of `respond`.\n *\n * Additionally, we don't want to manually have to flush mocked out requests like we do during unit\n * testing. For this reason the e2e $httpBackend flushes mocked out requests\n * automatically, closely simulating the behavior of the XMLHttpRequest object.\n *\n * To setup the application to run with this http backend, you have to create a module that depends\n * on the `ngMockE2E` and your application modules and defines the fake backend:\n *\n * ```js\n *   var myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);\n *   myAppDev.run(function($httpBackend) {\n *     var phones = [{name: 'phone1'}, {name: 'phone2'}];\n *\n *     // returns the current list of phones\n *     $httpBackend.whenGET('/phones').respond(phones);\n *\n *     // adds a new phone to the phones array\n *     $httpBackend.whenPOST('/phones').respond(function(method, url, data) {\n *       var phone = angular.fromJson(data);\n *       phones.push(phone);\n *       return [200, phone, {}];\n *     });\n *     $httpBackend.whenGET(/^\\/templates\\//).passThrough(); // Requests for templates are handled by the real server\n *     //...\n *   });\n * ```\n *\n * Afterwards, bootstrap your app with this new module.\n *\n * @example\n * <example name=\"httpbackend-e2e-testing\" module=\"myAppE2E\" deps=\"angular-mocks.js\">\n * <file name=\"app.js\">\n *   var myApp = angular.module('myApp', []);\n *\n *   myApp.controller('MainCtrl', function MainCtrl($http) {\n *     var ctrl = this;\n *\n *     ctrl.phones = [];\n *     ctrl.newPhone = {\n *       name: ''\n *     };\n *\n *     ctrl.getPhones = function() {\n *       $http.get('/phones').then(function(response) {\n *         ctrl.phones = response.data;\n *       });\n *     };\n *\n *     ctrl.addPhone = function(phone) {\n *       $http.post('/phones', phone).then(function() {\n *         ctrl.newPhone = {name: ''};\n *         return ctrl.getPhones();\n *       });\n *     };\n *\n *     ctrl.getPhones();\n *   });\n * </file>\n * <file name=\"e2e.js\">\n *   var myAppDev = angular.module('myAppE2E', ['myApp', 'ngMockE2E']);\n *\n *   myAppDev.run(function($httpBackend) {\n *     var phones = [{name: 'phone1'}, {name: 'phone2'}];\n *\n *     // returns the current list of phones\n *     $httpBackend.whenGET('/phones').respond(phones);\n *\n *     // adds a new phone to the phones array\n *     $httpBackend.whenPOST('/phones').respond(function(method, url, data) {\n *       var phone = angular.fromJson(data);\n *       phones.push(phone);\n *       return [200, phone, {}];\n *     });\n *   });\n * </file>\n * <file name=\"index.html\">\n *   <div ng-controller=\"MainCtrl as $ctrl\">\n *   <form name=\"newPhoneForm\" ng-submit=\"$ctrl.addPhone($ctrl.newPhone)\">\n *     <input type=\"text\" ng-model=\"$ctrl.newPhone.name\">\n *     <input type=\"submit\" value=\"Add Phone\">\n *   </form>\n *   <h1>Phones</h1>\n *   <ul>\n *     <li ng-repeat=\"phone in $ctrl.phones\">{{phone.name}}</li>\n *   </ul>\n *   </div>\n * </file>\n * </example>\n *\n *\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#when\n * @module ngMockE2E\n * @description\n * Creates a new backend definition.\n *\n * @param {string} method HTTP method.\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n *   data string and returns true if the data is as expected.\n * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n *   object and returns true if the headers match the current definition.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n *\n *  - respond –\n *    ```\n *    { function([status,] data[, headers, statusText])\n *    | function(function(method, url, data, headers, params)}\n *    ```\n *    – The respond method takes a set of static data to be returned or a function that can return\n *    an array containing response status (number), response data (Array|Object|string), response\n *    headers (Object), and the text for the status (string).\n *  - passThrough – `{function()}` – Any request matching a backend definition with\n *    `passThrough` handler will be passed through to the real backend (an XHR request will be made\n *    to the server.)\n *  - Both methods return the `requestHandler` object for possible overrides.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenGET\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for GET requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenHEAD\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for HEAD requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenDELETE\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for DELETE requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenPOST\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for POST requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n *   data string and returns true if the data is as expected.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenPUT\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for PUT requests.  For more info see `when()`.\n *\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n *   data string and returns true if the data is as expected.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenPATCH\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for PATCH requests.  For more info see `when()`.\n *\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n *   data string and returns true if the data is as expected.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenJSONP\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for JSONP requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url\n *   and returns true if the url matches the current definition.\n * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on\n *   {@link ngMock.$httpBackend $httpBackend mock}.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n/**\n * @ngdoc method\n * @name $httpBackend#whenRoute\n * @module ngMockE2E\n * @description\n * Creates a new backend definition that compares only with the requested route.\n *\n * @param {string} method HTTP method.\n * @param {string} url HTTP url string that supports colon param matching.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n/**\n * @ngdoc method\n * @name  $httpBackend#matchLatestDefinitionEnabled\n * @module ngMockE2E\n * @description\n * This method can be used to change which mocked responses `$httpBackend` returns, when defining\n * them with {@link ngMock.$httpBackend#when $httpBackend.when()} (and shortcut methods).\n * By default, `$httpBackend` returns the first definition that matches. When setting\n * `$http.matchLatestDefinitionEnabled(true)`, it will use the last response that matches, i.e. the\n * one that was added last.\n *\n * ```js\n * hb.when('GET', '/url1').respond(200, 'content', {});\n * hb.when('GET', '/url1').respond(201, 'another', {});\n * hb('GET', '/url1'); // receives \"content\"\n *\n * $http.matchLatestDefinitionEnabled(true)\n * hb('GET', '/url1'); // receives \"another\"\n *\n * hb.when('GET', '/url1').respond(201, 'onemore', {});\n * hb('GET', '/url1'); // receives \"onemore\"\n * ```\n *\n * This is useful if a you have a default response that is overriden inside specific tests.\n *\n * Note that different from config methods on providers, `matchLatestDefinitionEnabled()` can be changed\n * even when the application is already running.\n *\n * @param  {Boolean=} value value to set, either `true` or `false`. Default is `false`.\n *                          If omitted, it will return the current value.\n * @return {$httpBackend|Boolean} self when used as a setter, and the current value when used\n *                                as a getter\n */\nangular.mock.e2e = {};\nangular.mock.e2e.$httpBackendDecorator =\n  ['$rootScope', '$timeout', '$delegate', '$browser', createHttpBackendMock];\n\n\n/**\n * @ngdoc type\n * @name $rootScope.Scope\n * @module ngMock\n * @description\n * {@link ng.$rootScope.Scope Scope} type decorated with helper methods useful for testing. These\n * methods are automatically available on any {@link ng.$rootScope.Scope Scope} instance when\n * `ngMock` module is loaded.\n *\n * In addition to all the regular `Scope` methods, the following helper methods are available:\n */\nangular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {\n\n  var $rootScopePrototype = Object.getPrototypeOf($delegate);\n\n  $rootScopePrototype.$countChildScopes = countChildScopes;\n  $rootScopePrototype.$countWatchers = countWatchers;\n\n  return $delegate;\n\n  // ------------------------------------------------------------------------------------------ //\n\n  /**\n   * @ngdoc method\n   * @name $rootScope.Scope#$countChildScopes\n   * @module ngMock\n   * @this $rootScope.Scope\n   * @description\n   * Counts all the direct and indirect child scopes of the current scope.\n   *\n   * The current scope is excluded from the count. The count includes all isolate child scopes.\n   *\n   * @returns {number} Total number of child scopes.\n   */\n  function countChildScopes() {\n    var count = 0; // exclude the current scope\n    var pendingChildHeads = [this.$$childHead];\n    var currentScope;\n\n    while (pendingChildHeads.length) {\n      currentScope = pendingChildHeads.shift();\n\n      while (currentScope) {\n        count += 1;\n        pendingChildHeads.push(currentScope.$$childHead);\n        currentScope = currentScope.$$nextSibling;\n      }\n    }\n\n    return count;\n  }\n\n\n  /**\n   * @ngdoc method\n   * @name $rootScope.Scope#$countWatchers\n   * @this $rootScope.Scope\n   * @module ngMock\n   * @description\n   * Counts all the watchers of direct and indirect child scopes of the current scope.\n   *\n   * The watchers of the current scope are included in the count and so are all the watchers of\n   * isolate child scopes.\n   *\n   * @returns {number} Total number of watchers.\n   */\n  function countWatchers() {\n    var count = this.$$watchers ? this.$$watchers.length : 0; // include the current scope\n    var pendingChildHeads = [this.$$childHead];\n    var currentScope;\n\n    while (pendingChildHeads.length) {\n      currentScope = pendingChildHeads.shift();\n\n      while (currentScope) {\n        count += currentScope.$$watchers ? currentScope.$$watchers.length : 0;\n        pendingChildHeads.push(currentScope.$$childHead);\n        currentScope = currentScope.$$nextSibling;\n      }\n    }\n\n    return count;\n  }\n}];\n\n\n(function(jasmineOrMocha) {\n\n  if (!jasmineOrMocha) {\n    return;\n  }\n\n  var currentSpec = null,\n      injectorState = new InjectorState(),\n      annotatedFunctions = [],\n      wasInjectorCreated = function() {\n        return !!currentSpec;\n      };\n\n  angular.mock.$$annotate = angular.injector.$$annotate;\n  angular.injector.$$annotate = function(fn) {\n    if (typeof fn === 'function' && !fn.$inject) {\n      annotatedFunctions.push(fn);\n    }\n    return angular.mock.$$annotate.apply(this, arguments);\n  };\n\n  /**\n   * @ngdoc function\n   * @name angular.mock.module\n   * @description\n   *\n   * *NOTE*: This function is also published on window for easy access.<br>\n   * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha\n   *\n   * This function registers a module configuration code. It collects the configuration information\n   * which will be used when the injector is created by {@link angular.mock.inject inject}.\n   *\n   * See {@link angular.mock.inject inject} for usage example\n   *\n   * @param {...(string|Function|Object)} fns any number of modules which are represented as string\n   *        aliases or as anonymous module initialization functions. The modules are used to\n   *        configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. If an\n   *        object literal is passed each key-value pair will be registered on the module via\n   *        {@link auto.$provide $provide}.value, the key being the string name (or token) to associate\n   *        with the value on the injector.\n   */\n  var module = window.module = angular.mock.module = function() {\n    var moduleFns = Array.prototype.slice.call(arguments, 0);\n    return wasInjectorCreated() ? workFn() : workFn;\n    /////////////////////\n    function workFn() {\n      if (currentSpec.$injector) {\n        throw new Error('Injector already created, can not register a module!');\n      } else {\n        var fn, modules = currentSpec.$modules || (currentSpec.$modules = []);\n        angular.forEach(moduleFns, function(module) {\n          if (angular.isObject(module) && !angular.isArray(module)) {\n            fn = ['$provide', function($provide) {\n              angular.forEach(module, function(value, key) {\n                $provide.value(key, value);\n              });\n            }];\n          } else {\n            fn = module;\n          }\n          if (currentSpec.$providerInjector) {\n            currentSpec.$providerInjector.invoke(fn);\n          } else {\n            modules.push(fn);\n          }\n        });\n      }\n    }\n  };\n\n  module.$$beforeAllHook = (window.before || window.beforeAll);\n  module.$$afterAllHook = (window.after || window.afterAll);\n\n  // purely for testing ngMock itself\n  module.$$currentSpec = function(to) {\n    if (arguments.length === 0) return to;\n    currentSpec = to;\n  };\n\n  /**\n   * @ngdoc function\n   * @name angular.mock.module.sharedInjector\n   * @description\n   *\n   * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha\n   *\n   * This function ensures a single injector will be used for all tests in a given describe context.\n   * This contrasts with the default behaviour where a new injector is created per test case.\n   *\n   * Use sharedInjector when you want to take advantage of Jasmine's `beforeAll()`, or mocha's\n   * `before()` methods. Call `module.sharedInjector()` before you setup any other hooks that\n   * will create (i.e call `module()`) or use (i.e call `inject()`) the injector.\n   *\n   * You cannot call `sharedInjector()` from within a context already using `sharedInjector()`.\n   *\n   * ## Example\n   *\n   * Typically beforeAll is used to make many assertions about a single operation. This can\n   * cut down test run-time as the test setup doesn't need to be re-run, and enabling focussed\n   * tests each with a single assertion.\n   *\n   * ```js\n   * describe(\"Deep Thought\", function() {\n   *\n   *   module.sharedInjector();\n   *\n   *   beforeAll(module(\"UltimateQuestion\"));\n   *\n   *   beforeAll(inject(function(DeepThought) {\n   *     expect(DeepThought.answer).toBeUndefined();\n   *     DeepThought.generateAnswer();\n   *   }));\n   *\n   *   it(\"has calculated the answer correctly\", inject(function(DeepThought) {\n   *     // Because of sharedInjector, we have access to the instance of the DeepThought service\n   *     // that was provided to the beforeAll() hook. Therefore we can test the generated answer\n   *     expect(DeepThought.answer).toBe(42);\n   *   }));\n   *\n   *   it(\"has calculated the answer within the expected time\", inject(function(DeepThought) {\n   *     expect(DeepThought.runTimeMillennia).toBeLessThan(8000);\n   *   }));\n   *\n   *   it(\"has double checked the answer\", inject(function(DeepThought) {\n   *     expect(DeepThought.absolutelySureItIsTheRightAnswer).toBe(true);\n   *   }));\n   *\n   * });\n   *\n   * ```\n   */\n  module.sharedInjector = function() {\n    if (!(module.$$beforeAllHook && module.$$afterAllHook)) {\n      throw Error('sharedInjector() cannot be used unless your test runner defines beforeAll/afterAll');\n    }\n\n    var initialized = false;\n\n    module.$$beforeAllHook(/** @this */ function() {\n      if (injectorState.shared) {\n        injectorState.sharedError = Error('sharedInjector() cannot be called inside a context that has already called sharedInjector()');\n        throw injectorState.sharedError;\n      }\n      initialized = true;\n      currentSpec = this;\n      injectorState.shared = true;\n    });\n\n    module.$$afterAllHook(function() {\n      if (initialized) {\n        injectorState = new InjectorState();\n        module.$$cleanup();\n      } else {\n        injectorState.sharedError = null;\n      }\n    });\n  };\n\n  module.$$beforeEach = function() {\n    if (injectorState.shared && currentSpec && currentSpec !== this) {\n      var state = currentSpec;\n      currentSpec = this;\n      angular.forEach(['$injector','$modules','$providerInjector', '$injectorStrict'], function(k) {\n        currentSpec[k] = state[k];\n        state[k] = null;\n      });\n    } else {\n      currentSpec = this;\n      originalRootElement = null;\n      annotatedFunctions = [];\n    }\n  };\n\n  module.$$afterEach = function() {\n    if (injectorState.cleanupAfterEach()) {\n      module.$$cleanup();\n    }\n  };\n\n  module.$$cleanup = function() {\n    var injector = currentSpec.$injector;\n\n    annotatedFunctions.forEach(function(fn) {\n      delete fn.$inject;\n    });\n\n    currentSpec.$injector = null;\n    currentSpec.$modules = null;\n    currentSpec.$providerInjector = null;\n    currentSpec = null;\n\n    if (injector) {\n      // Ensure `$rootElement` is instantiated, before checking `originalRootElement`\n      var $rootElement = injector.get('$rootElement');\n      var rootNode = $rootElement && $rootElement[0];\n      var cleanUpNodes = !originalRootElement ? [] : [originalRootElement[0]];\n      if (rootNode && (!originalRootElement || rootNode !== originalRootElement[0])) {\n        cleanUpNodes.push(rootNode);\n      }\n      angular.element.cleanData(cleanUpNodes);\n\n      // Ensure `$destroy()` is available, before calling it\n      // (a mocked `$rootScope` might not implement it (or not even be an object at all))\n      var $rootScope = injector.get('$rootScope');\n      if ($rootScope && $rootScope.$destroy) $rootScope.$destroy();\n    }\n\n    // clean up jquery's fragment cache\n    angular.forEach(angular.element.fragments, function(val, key) {\n      delete angular.element.fragments[key];\n    });\n\n    MockXhr.$$lastInstance = null;\n\n    angular.forEach(angular.callbacks, function(val, key) {\n      delete angular.callbacks[key];\n    });\n    angular.callbacks.$$counter = 0;\n  };\n\n  (window.beforeEach || window.setup)(module.$$beforeEach);\n  (window.afterEach || window.teardown)(module.$$afterEach);\n\n  /**\n   * @ngdoc function\n   * @name angular.mock.inject\n   * @description\n   *\n   * *NOTE*: This function is also published on window for easy access.<br>\n   * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha\n   *\n   * The inject function wraps a function into an injectable function. The inject() creates new\n   * instance of {@link auto.$injector $injector} per test, which is then used for\n   * resolving references.\n   *\n   *\n   * ## Resolving References (Underscore Wrapping)\n   * Often, we would like to inject a reference once, in a `beforeEach()` block and reuse this\n   * in multiple `it()` clauses. To be able to do this we must assign the reference to a variable\n   * that is declared in the scope of the `describe()` block. Since we would, most likely, want\n   * the variable to have the same name of the reference we have a problem, since the parameter\n   * to the `inject()` function would hide the outer variable.\n   *\n   * To help with this, the injected parameters can, optionally, be enclosed with underscores.\n   * These are ignored by the injector when the reference name is resolved.\n   *\n   * For example, the parameter `_myService_` would be resolved as the reference `myService`.\n   * Since it is available in the function body as `_myService_`, we can then assign it to a variable\n   * defined in an outer scope.\n   *\n   * ```\n   * // Defined out reference variable outside\n   * var myService;\n   *\n   * // Wrap the parameter in underscores\n   * beforeEach( inject( function(_myService_){\n   *   myService = _myService_;\n   * }));\n   *\n   * // Use myService in a series of tests.\n   * it('makes use of myService', function() {\n   *   myService.doStuff();\n   * });\n   *\n   * ```\n   *\n   * See also {@link angular.mock.module angular.mock.module}\n   *\n   * ## Example\n   * Example of what a typical jasmine tests looks like with the inject method.\n   * ```js\n   *\n   *   angular.module('myApplicationModule', [])\n   *       .value('mode', 'app')\n   *       .value('version', 'v1.0.1');\n   *\n   *\n   *   describe('MyApp', function() {\n   *\n   *     // You need to load modules that you want to test,\n   *     // it loads only the \"ng\" module by default.\n   *     beforeEach(module('myApplicationModule'));\n   *\n   *\n   *     // inject() is used to inject arguments of all given functions\n   *     it('should provide a version', inject(function(mode, version) {\n   *       expect(version).toEqual('v1.0.1');\n   *       expect(mode).toEqual('app');\n   *     }));\n   *\n   *\n   *     // The inject and module method can also be used inside of the it or beforeEach\n   *     it('should override a version and test the new version is injected', function() {\n   *       // module() takes functions or strings (module aliases)\n   *       module(function($provide) {\n   *         $provide.value('version', 'overridden'); // override version here\n   *       });\n   *\n   *       inject(function(version) {\n   *         expect(version).toEqual('overridden');\n   *       });\n   *     });\n   *   });\n   *\n   * ```\n   *\n   * @param {...Function} fns any number of functions which will be injected using the injector.\n   */\n\n\n\n  var ErrorAddingDeclarationLocationStack = function ErrorAddingDeclarationLocationStack(e, errorForStack) {\n    this.message = e.message;\n    this.name = e.name;\n    if (e.line) this.line = e.line;\n    if (e.sourceId) this.sourceId = e.sourceId;\n    if (e.stack && errorForStack)\n      this.stack = e.stack + '\\n' + errorForStack.stack;\n    if (e.stackArray) this.stackArray = e.stackArray;\n  };\n  ErrorAddingDeclarationLocationStack.prototype = Error.prototype;\n\n  window.inject = angular.mock.inject = function() {\n    var blockFns = Array.prototype.slice.call(arguments, 0);\n    var errorForStack = new Error('Declaration Location');\n    // IE10+ and PhanthomJS do not set stack trace information, until the error is thrown\n    if (!errorForStack.stack) {\n      try {\n        throw errorForStack;\n      } catch (e) { /* empty */ }\n    }\n    return wasInjectorCreated() ? WorkFn.call(currentSpec) : WorkFn;\n    /////////////////////\n    function WorkFn() {\n      var modules = currentSpec.$modules || [];\n      var strictDi = !!currentSpec.$injectorStrict;\n      modules.unshift(['$injector', function($injector) {\n        currentSpec.$providerInjector = $injector;\n      }]);\n      modules.unshift('ngMock');\n      modules.unshift('ng');\n      var injector = currentSpec.$injector;\n      if (!injector) {\n        if (strictDi) {\n          // If strictDi is enabled, annotate the providerInjector blocks\n          angular.forEach(modules, function(moduleFn) {\n            if (typeof moduleFn === 'function') {\n              angular.injector.$$annotate(moduleFn);\n            }\n          });\n        }\n        injector = currentSpec.$injector = angular.injector(modules, strictDi);\n        currentSpec.$injectorStrict = strictDi;\n      }\n      for (var i = 0, ii = blockFns.length; i < ii; i++) {\n        if (currentSpec.$injectorStrict) {\n          // If the injector is strict / strictDi, and the spec wants to inject using automatic\n          // annotation, then annotate the function here.\n          injector.annotate(blockFns[i]);\n        }\n        try {\n          injector.invoke(blockFns[i] || angular.noop, this);\n        } catch (e) {\n          if (e.stack && errorForStack) {\n            throw new ErrorAddingDeclarationLocationStack(e, errorForStack);\n          }\n          throw e;\n        } finally {\n          errorForStack = null;\n        }\n      }\n    }\n  };\n\n\n  angular.mock.inject.strictDi = function(value) {\n    value = arguments.length ? !!value : true;\n    return wasInjectorCreated() ? workFn() : workFn;\n\n    function workFn() {\n      if (value !== currentSpec.$injectorStrict) {\n        if (currentSpec.$injector) {\n          throw new Error('Injector already created, can not modify strict annotations');\n        } else {\n          currentSpec.$injectorStrict = value;\n        }\n      }\n    }\n  };\n\n  function InjectorState() {\n    this.shared = false;\n    this.sharedError = null;\n\n    this.cleanupAfterEach = function() {\n      return !this.shared || this.sharedError;\n    };\n  }\n})(window.jasmine || window.mocha);\n\n'use strict';\n\n(function() {\n  /**\n   * @ngdoc function\n   * @name browserTrigger\n   * @description\n   *\n   * This is a global (window) function that is only available when the {@link ngMock} module is\n   * included.\n   *\n   * It can be used to trigger a native browser event on an element, which is useful for unit testing.\n   *\n   *\n   * @param {Object} element Either a wrapped jQuery/jqLite node or a DOMElement\n   * @param {string=} eventType Optional event type. If none is specified, the function tries\n   *                            to determine the right event type for the element, e.g. `change` for\n   *                            `input[text]`.\n   * @param {Object=} eventData An optional object which contains additional event data that is used\n   *                            when creating the event:\n   *\n   *  - `bubbles`: [Event.bubbles](https://developer.mozilla.org/docs/Web/API/Event/bubbles).\n   *    Not applicable to all events.\n   *\n   *  - `cancelable`: [Event.cancelable](https://developer.mozilla.org/docs/Web/API/Event/cancelable).\n   *    Not applicable to all events.\n   *\n   *  - `charcode`: [charCode](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/charcode)\n   *    for keyboard events (keydown, keypress, and keyup).\n   *\n   *  - `data`: [data](https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent/data) for\n   *    [CompositionEvents](https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent).\n   *\n   *  - `elapsedTime`: the elapsedTime for\n   *    [TransitionEvent](https://developer.mozilla.org/docs/Web/API/TransitionEvent)\n   *    and [AnimationEvent](https://developer.mozilla.org/docs/Web/API/AnimationEvent).\n   *\n   *  - `keycode`: [keyCode](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/keycode)\n   *    for keyboard events (keydown, keypress, and keyup).\n   *\n   *  - `keys`: an array of possible modifier keys (ctrl, alt, shift, meta) for\n   *    [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent) and\n   *    keyboard events (keydown, keypress, and keyup).\n   *\n   *  - `relatedTarget`: the\n   *    [relatedTarget](https://developer.mozilla.org/docs/Web/API/MouseEvent/relatedTarget)\n   *    for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent).\n   *\n   *  - `which`: [which](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/which)\n   *    for keyboard events (keydown, keypress, and keyup).\n   *\n   *  - `x`: x-coordinates for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent)\n   *    and [TouchEvent](https://developer.mozilla.org/docs/Web/API/TouchEvent).\n   *\n   *  - `y`: y-coordinates for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent)\n   *    and [TouchEvent](https://developer.mozilla.org/docs/Web/API/TouchEvent).\n   *\n   */\n  window.browserTrigger = function browserTrigger(element, eventType, eventData) {\n    if (element && !element.nodeName) element = element[0];\n    if (!element) return;\n\n    eventData = eventData || {};\n    var relatedTarget = eventData.relatedTarget || element;\n    var keys = eventData.keys;\n    var x = eventData.x;\n    var y = eventData.y;\n\n    var inputType = (element.type) ? element.type.toLowerCase() : null,\n        nodeName = element.nodeName.toLowerCase();\n    if (!eventType) {\n      eventType = {\n        'text':            'change',\n        'textarea':        'change',\n        'hidden':          'change',\n        'password':        'change',\n        'button':          'click',\n        'submit':          'click',\n        'reset':           'click',\n        'image':           'click',\n        'checkbox':        'click',\n        'radio':           'click',\n        'select-one':      'change',\n        'select-multiple': 'change',\n        '_default_':       'click'\n      }[inputType || '_default_'];\n    }\n\n    if (nodeName === 'option') {\n      element.parentNode.value = element.value;\n      element = element.parentNode;\n      eventType = 'change';\n    }\n\n    keys = keys || [];\n    function pressed(key) {\n      return keys.indexOf(key) !== -1;\n    }\n\n    var evnt;\n    if (/transitionend/.test(eventType)) {\n      if (window.WebKitTransitionEvent) {\n        evnt = new window.WebKitTransitionEvent(eventType, eventData);\n        evnt.initEvent(eventType, eventData.bubbles, true);\n      } else {\n        try {\n          evnt = new window.TransitionEvent(eventType, eventData);\n        } catch (e) {\n          evnt = window.document.createEvent('TransitionEvent');\n          evnt.initTransitionEvent(eventType, eventData.bubbles, null, null, eventData.elapsedTime || 0);\n        }\n      }\n    } else if (/animationend/.test(eventType)) {\n      if (window.WebKitAnimationEvent) {\n        evnt = new window.WebKitAnimationEvent(eventType, eventData);\n        evnt.initEvent(eventType, eventData.bubbles, true);\n      } else {\n        try {\n          evnt = new window.AnimationEvent(eventType, eventData);\n        } catch (e) {\n          evnt = window.document.createEvent('AnimationEvent');\n          evnt.initAnimationEvent(eventType, eventData.bubbles, null, null, eventData.elapsedTime || 0);\n        }\n      }\n    } else if (/touch/.test(eventType) && supportsTouchEvents()) {\n      evnt = createTouchEvent(element, eventType, x, y);\n    } else if (/key/.test(eventType)) {\n      evnt = window.document.createEvent('Events');\n      evnt.initEvent(eventType, eventData.bubbles, eventData.cancelable);\n      evnt.view = window;\n      evnt.ctrlKey = pressed('ctrl');\n      evnt.altKey = pressed('alt');\n      evnt.shiftKey = pressed('shift');\n      evnt.metaKey = pressed('meta');\n      evnt.keyCode = eventData.keyCode;\n      evnt.charCode = eventData.charCode;\n      evnt.which = eventData.which;\n    } else if (/composition/.test(eventType)) {\n      try {\n        evnt = new window.CompositionEvent(eventType, {\n          data: eventData.data\n        });\n      } catch (e) {\n        // Support: IE9+\n        evnt = window.document.createEvent('CompositionEvent', {});\n        evnt.initCompositionEvent(\n          eventType,\n          eventData.bubbles,\n          eventData.cancelable,\n          window,\n          eventData.data,\n          null\n        );\n      }\n\n    } else {\n      evnt = window.document.createEvent('MouseEvents');\n      x = x || 0;\n      y = y || 0;\n      evnt.initMouseEvent(eventType, true, true, window, 0, x, y, x, y, pressed('ctrl'),\n          pressed('alt'), pressed('shift'), pressed('meta'), 0, relatedTarget);\n    }\n\n    /* we're unable to change the timeStamp value directly so this\n     * is only here to allow for testing where the timeStamp value is\n     * read */\n    evnt.$manualTimeStamp = eventData.timeStamp;\n\n    if (!evnt) return;\n\n    if (!eventData.bubbles || supportsEventBubblingInDetachedTree() || isAttachedToDocument(element)) {\n      return element.dispatchEvent(evnt);\n    } else {\n      triggerForPath(element, evnt);\n    }\n  };\n\n  function supportsTouchEvents() {\n    if ('_cached' in supportsTouchEvents) {\n      return supportsTouchEvents._cached;\n    }\n    if (!window.document.createTouch || !window.document.createTouchList) {\n      supportsTouchEvents._cached = false;\n      return false;\n    }\n    try {\n      window.document.createEvent('TouchEvent');\n    } catch (e) {\n      supportsTouchEvents._cached = false;\n      return false;\n    }\n    supportsTouchEvents._cached = true;\n    return true;\n  }\n\n  function createTouchEvent(element, eventType, x, y) {\n    var evnt = new window.Event(eventType);\n    x = x || 0;\n    y = y || 0;\n\n    var touch = window.document.createTouch(window, element, Date.now(), x, y, x, y);\n    var touches = window.document.createTouchList(touch);\n\n    evnt.touches = touches;\n\n    return evnt;\n  }\n\n  function supportsEventBubblingInDetachedTree() {\n    if ('_cached' in supportsEventBubblingInDetachedTree) {\n      return supportsEventBubblingInDetachedTree._cached;\n    }\n    supportsEventBubblingInDetachedTree._cached = false;\n    var doc = window.document;\n    if (doc) {\n      var parent = doc.createElement('div'),\n          child = parent.cloneNode();\n      parent.appendChild(child);\n      parent.addEventListener('e', function() {\n        supportsEventBubblingInDetachedTree._cached = true;\n      });\n      var evnt = window.document.createEvent('Events');\n      evnt.initEvent('e', true, true);\n      child.dispatchEvent(evnt);\n    }\n    return supportsEventBubblingInDetachedTree._cached;\n  }\n\n  function triggerForPath(element, evnt) {\n    var stop = false;\n\n    var _stopPropagation = evnt.stopPropagation;\n    evnt.stopPropagation = function() {\n      stop = true;\n      _stopPropagation.apply(evnt, arguments);\n    };\n    patchEventTargetForBubbling(evnt, element);\n    do {\n      element.dispatchEvent(evnt);\n      // eslint-disable-next-line no-unmodified-loop-condition\n    } while (!stop && (element = element.parentNode));\n  }\n\n  function patchEventTargetForBubbling(event, target) {\n    event._target = target;\n    Object.defineProperty(event, 'target', {get: function() { return this._target;}});\n  }\n\n  function isAttachedToDocument(element) {\n    while ((element = element.parentNode)) {\n        if (element === window) {\n            return true;\n        }\n    }\n    return false;\n  }\n})();\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-parse-ext.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/******************************************************\n *         Generated file, do not modify              *\n *                                                    *\n *****************************************************/\n\nfunction IDS_Y(cp) {\n  if (0x0041 <= cp && cp <= 0x005A) return true;\n  if (0x0061 <= cp && cp <= 0x007A) return true;\n  if (cp === 0x00AA) return true;\n  if (cp === 0x00B5) return true;\n  if (cp === 0x00BA) return true;\n  if (0x00C0 <= cp && cp <= 0x00D6) return true;\n  if (0x00D8 <= cp && cp <= 0x00F6) return true;\n  if (0x00F8 <= cp && cp <= 0x02C1) return true;\n  if (0x02C6 <= cp && cp <= 0x02D1) return true;\n  if (0x02E0 <= cp && cp <= 0x02E4) return true;\n  if (cp === 0x02EC) return true;\n  if (cp === 0x02EE) return true;\n  if (0x0370 <= cp && cp <= 0x0374) return true;\n  if (0x0376 <= cp && cp <= 0x0377) return true;\n  if (0x037A <= cp && cp <= 0x037D) return true;\n  if (cp === 0x037F) return true;\n  if (cp === 0x0386) return true;\n  if (0x0388 <= cp && cp <= 0x038A) return true;\n  if (cp === 0x038C) return true;\n  if (0x038E <= cp && cp <= 0x03A1) return true;\n  if (0x03A3 <= cp && cp <= 0x03F5) return true;\n  if (0x03F7 <= cp && cp <= 0x0481) return true;\n  if (0x048A <= cp && cp <= 0x052F) return true;\n  if (0x0531 <= cp && cp <= 0x0556) return true;\n  if (cp === 0x0559) return true;\n  if (0x0561 <= cp && cp <= 0x0587) return true;\n  if (0x05D0 <= cp && cp <= 0x05EA) return true;\n  if (0x05F0 <= cp && cp <= 0x05F2) return true;\n  if (0x0620 <= cp && cp <= 0x064A) return true;\n  if (0x066E <= cp && cp <= 0x066F) return true;\n  if (0x0671 <= cp && cp <= 0x06D3) return true;\n  if (cp === 0x06D5) return true;\n  if (0x06E5 <= cp && cp <= 0x06E6) return true;\n  if (0x06EE <= cp && cp <= 0x06EF) return true;\n  if (0x06FA <= cp && cp <= 0x06FC) return true;\n  if (cp === 0x06FF) return true;\n  if (cp === 0x0710) return true;\n  if (0x0712 <= cp && cp <= 0x072F) return true;\n  if (0x074D <= cp && cp <= 0x07A5) return true;\n  if (cp === 0x07B1) return true;\n  if (0x07CA <= cp && cp <= 0x07EA) return true;\n  if (0x07F4 <= cp && cp <= 0x07F5) return true;\n  if (cp === 0x07FA) return true;\n  if (0x0800 <= cp && cp <= 0x0815) return true;\n  if (cp === 0x081A) return true;\n  if (cp === 0x0824) return true;\n  if (cp === 0x0828) return true;\n  if (0x0840 <= cp && cp <= 0x0858) return true;\n  if (0x08A0 <= cp && cp <= 0x08B4) return true;\n  if (0x0904 <= cp && cp <= 0x0939) return true;\n  if (cp === 0x093D) return true;\n  if (cp === 0x0950) return true;\n  if (0x0958 <= cp && cp <= 0x0961) return true;\n  if (0x0971 <= cp && cp <= 0x0980) return true;\n  if (0x0985 <= cp && cp <= 0x098C) return true;\n  if (0x098F <= cp && cp <= 0x0990) return true;\n  if (0x0993 <= cp && cp <= 0x09A8) return true;\n  if (0x09AA <= cp && cp <= 0x09B0) return true;\n  if (cp === 0x09B2) return true;\n  if (0x09B6 <= cp && cp <= 0x09B9) return true;\n  if (cp === 0x09BD) return true;\n  if (cp === 0x09CE) return true;\n  if (0x09DC <= cp && cp <= 0x09DD) return true;\n  if (0x09DF <= cp && cp <= 0x09E1) return true;\n  if (0x09F0 <= cp && cp <= 0x09F1) return true;\n  if (0x0A05 <= cp && cp <= 0x0A0A) return true;\n  if (0x0A0F <= cp && cp <= 0x0A10) return true;\n  if (0x0A13 <= cp && cp <= 0x0A28) return true;\n  if (0x0A2A <= cp && cp <= 0x0A30) return true;\n  if (0x0A32 <= cp && cp <= 0x0A33) return true;\n  if (0x0A35 <= cp && cp <= 0x0A36) return true;\n  if (0x0A38 <= cp && cp <= 0x0A39) return true;\n  if (0x0A59 <= cp && cp <= 0x0A5C) return true;\n  if (cp === 0x0A5E) return true;\n  if (0x0A72 <= cp && cp <= 0x0A74) return true;\n  if (0x0A85 <= cp && cp <= 0x0A8D) return true;\n  if (0x0A8F <= cp && cp <= 0x0A91) return true;\n  if (0x0A93 <= cp && cp <= 0x0AA8) return true;\n  if (0x0AAA <= cp && cp <= 0x0AB0) return true;\n  if (0x0AB2 <= cp && cp <= 0x0AB3) return true;\n  if (0x0AB5 <= cp && cp <= 0x0AB9) return true;\n  if (cp === 0x0ABD) return true;\n  if (cp === 0x0AD0) return true;\n  if (0x0AE0 <= cp && cp <= 0x0AE1) return true;\n  if (cp === 0x0AF9) return true;\n  if (0x0B05 <= cp && cp <= 0x0B0C) return true;\n  if (0x0B0F <= cp && cp <= 0x0B10) return true;\n  if (0x0B13 <= cp && cp <= 0x0B28) return true;\n  if (0x0B2A <= cp && cp <= 0x0B30) return true;\n  if (0x0B32 <= cp && cp <= 0x0B33) return true;\n  if (0x0B35 <= cp && cp <= 0x0B39) return true;\n  if (cp === 0x0B3D) return true;\n  if (0x0B5C <= cp && cp <= 0x0B5D) return true;\n  if (0x0B5F <= cp && cp <= 0x0B61) return true;\n  if (cp === 0x0B71) return true;\n  if (cp === 0x0B83) return true;\n  if (0x0B85 <= cp && cp <= 0x0B8A) return true;\n  if (0x0B8E <= cp && cp <= 0x0B90) return true;\n  if (0x0B92 <= cp && cp <= 0x0B95) return true;\n  if (0x0B99 <= cp && cp <= 0x0B9A) return true;\n  if (cp === 0x0B9C) return true;\n  if (0x0B9E <= cp && cp <= 0x0B9F) return true;\n  if (0x0BA3 <= cp && cp <= 0x0BA4) return true;\n  if (0x0BA8 <= cp && cp <= 0x0BAA) return true;\n  if (0x0BAE <= cp && cp <= 0x0BB9) return true;\n  if (cp === 0x0BD0) return true;\n  if (0x0C05 <= cp && cp <= 0x0C0C) return true;\n  if (0x0C0E <= cp && cp <= 0x0C10) return true;\n  if (0x0C12 <= cp && cp <= 0x0C28) return true;\n  if (0x0C2A <= cp && cp <= 0x0C39) return true;\n  if (cp === 0x0C3D) return true;\n  if (0x0C58 <= cp && cp <= 0x0C5A) return true;\n  if (0x0C60 <= cp && cp <= 0x0C61) return true;\n  if (0x0C85 <= cp && cp <= 0x0C8C) return true;\n  if (0x0C8E <= cp && cp <= 0x0C90) return true;\n  if (0x0C92 <= cp && cp <= 0x0CA8) return true;\n  if (0x0CAA <= cp && cp <= 0x0CB3) return true;\n  if (0x0CB5 <= cp && cp <= 0x0CB9) return true;\n  if (cp === 0x0CBD) return true;\n  if (cp === 0x0CDE) return true;\n  if (0x0CE0 <= cp && cp <= 0x0CE1) return true;\n  if (0x0CF1 <= cp && cp <= 0x0CF2) return true;\n  if (0x0D05 <= cp && cp <= 0x0D0C) return true;\n  if (0x0D0E <= cp && cp <= 0x0D10) return true;\n  if (0x0D12 <= cp && cp <= 0x0D3A) return true;\n  if (cp === 0x0D3D) return true;\n  if (cp === 0x0D4E) return true;\n  if (0x0D5F <= cp && cp <= 0x0D61) return true;\n  if (0x0D7A <= cp && cp <= 0x0D7F) return true;\n  if (0x0D85 <= cp && cp <= 0x0D96) return true;\n  if (0x0D9A <= cp && cp <= 0x0DB1) return true;\n  if (0x0DB3 <= cp && cp <= 0x0DBB) return true;\n  if (cp === 0x0DBD) return true;\n  if (0x0DC0 <= cp && cp <= 0x0DC6) return true;\n  if (0x0E01 <= cp && cp <= 0x0E30) return true;\n  if (0x0E32 <= cp && cp <= 0x0E33) return true;\n  if (0x0E40 <= cp && cp <= 0x0E46) return true;\n  if (0x0E81 <= cp && cp <= 0x0E82) return true;\n  if (cp === 0x0E84) return true;\n  if (0x0E87 <= cp && cp <= 0x0E88) return true;\n  if (cp === 0x0E8A) return true;\n  if (cp === 0x0E8D) return true;\n  if (0x0E94 <= cp && cp <= 0x0E97) return true;\n  if (0x0E99 <= cp && cp <= 0x0E9F) return true;\n  if (0x0EA1 <= cp && cp <= 0x0EA3) return true;\n  if (cp === 0x0EA5) return true;\n  if (cp === 0x0EA7) return true;\n  if (0x0EAA <= cp && cp <= 0x0EAB) return true;\n  if (0x0EAD <= cp && cp <= 0x0EB0) return true;\n  if (0x0EB2 <= cp && cp <= 0x0EB3) return true;\n  if (cp === 0x0EBD) return true;\n  if (0x0EC0 <= cp && cp <= 0x0EC4) return true;\n  if (cp === 0x0EC6) return true;\n  if (0x0EDC <= cp && cp <= 0x0EDF) return true;\n  if (cp === 0x0F00) return true;\n  if (0x0F40 <= cp && cp <= 0x0F47) return true;\n  if (0x0F49 <= cp && cp <= 0x0F6C) return true;\n  if (0x0F88 <= cp && cp <= 0x0F8C) return true;\n  if (0x1000 <= cp && cp <= 0x102A) return true;\n  if (cp === 0x103F) return true;\n  if (0x1050 <= cp && cp <= 0x1055) return true;\n  if (0x105A <= cp && cp <= 0x105D) return true;\n  if (cp === 0x1061) return true;\n  if (0x1065 <= cp && cp <= 0x1066) return true;\n  if (0x106E <= cp && cp <= 0x1070) return true;\n  if (0x1075 <= cp && cp <= 0x1081) return true;\n  if (cp === 0x108E) return true;\n  if (0x10A0 <= cp && cp <= 0x10C5) return true;\n  if (cp === 0x10C7) return true;\n  if (cp === 0x10CD) return true;\n  if (0x10D0 <= cp && cp <= 0x10FA) return true;\n  if (0x10FC <= cp && cp <= 0x1248) return true;\n  if (0x124A <= cp && cp <= 0x124D) return true;\n  if (0x1250 <= cp && cp <= 0x1256) return true;\n  if (cp === 0x1258) return true;\n  if (0x125A <= cp && cp <= 0x125D) return true;\n  if (0x1260 <= cp && cp <= 0x1288) return true;\n  if (0x128A <= cp && cp <= 0x128D) return true;\n  if (0x1290 <= cp && cp <= 0x12B0) return true;\n  if (0x12B2 <= cp && cp <= 0x12B5) return true;\n  if (0x12B8 <= cp && cp <= 0x12BE) return true;\n  if (cp === 0x12C0) return true;\n  if (0x12C2 <= cp && cp <= 0x12C5) return true;\n  if (0x12C8 <= cp && cp <= 0x12D6) return true;\n  if (0x12D8 <= cp && cp <= 0x1310) return true;\n  if (0x1312 <= cp && cp <= 0x1315) return true;\n  if (0x1318 <= cp && cp <= 0x135A) return true;\n  if (0x1380 <= cp && cp <= 0x138F) return true;\n  if (0x13A0 <= cp && cp <= 0x13F5) return true;\n  if (0x13F8 <= cp && cp <= 0x13FD) return true;\n  if (0x1401 <= cp && cp <= 0x166C) return true;\n  if (0x166F <= cp && cp <= 0x167F) return true;\n  if (0x1681 <= cp && cp <= 0x169A) return true;\n  if (0x16A0 <= cp && cp <= 0x16EA) return true;\n  if (0x16EE <= cp && cp <= 0x16F8) return true;\n  if (0x1700 <= cp && cp <= 0x170C) return true;\n  if (0x170E <= cp && cp <= 0x1711) return true;\n  if (0x1720 <= cp && cp <= 0x1731) return true;\n  if (0x1740 <= cp && cp <= 0x1751) return true;\n  if (0x1760 <= cp && cp <= 0x176C) return true;\n  if (0x176E <= cp && cp <= 0x1770) return true;\n  if (0x1780 <= cp && cp <= 0x17B3) return true;\n  if (cp === 0x17D7) return true;\n  if (cp === 0x17DC) return true;\n  if (0x1820 <= cp && cp <= 0x1877) return true;\n  if (0x1880 <= cp && cp <= 0x18A8) return true;\n  if (cp === 0x18AA) return true;\n  if (0x18B0 <= cp && cp <= 0x18F5) return true;\n  if (0x1900 <= cp && cp <= 0x191E) return true;\n  if (0x1950 <= cp && cp <= 0x196D) return true;\n  if (0x1970 <= cp && cp <= 0x1974) return true;\n  if (0x1980 <= cp && cp <= 0x19AB) return true;\n  if (0x19B0 <= cp && cp <= 0x19C9) return true;\n  if (0x1A00 <= cp && cp <= 0x1A16) return true;\n  if (0x1A20 <= cp && cp <= 0x1A54) return true;\n  if (cp === 0x1AA7) return true;\n  if (0x1B05 <= cp && cp <= 0x1B33) return true;\n  if (0x1B45 <= cp && cp <= 0x1B4B) return true;\n  if (0x1B83 <= cp && cp <= 0x1BA0) return true;\n  if (0x1BAE <= cp && cp <= 0x1BAF) return true;\n  if (0x1BBA <= cp && cp <= 0x1BE5) return true;\n  if (0x1C00 <= cp && cp <= 0x1C23) return true;\n  if (0x1C4D <= cp && cp <= 0x1C4F) return true;\n  if (0x1C5A <= cp && cp <= 0x1C7D) return true;\n  if (0x1CE9 <= cp && cp <= 0x1CEC) return true;\n  if (0x1CEE <= cp && cp <= 0x1CF1) return true;\n  if (0x1CF5 <= cp && cp <= 0x1CF6) return true;\n  if (0x1D00 <= cp && cp <= 0x1DBF) return true;\n  if (0x1E00 <= cp && cp <= 0x1F15) return true;\n  if (0x1F18 <= cp && cp <= 0x1F1D) return true;\n  if (0x1F20 <= cp && cp <= 0x1F45) return true;\n  if (0x1F48 <= cp && cp <= 0x1F4D) return true;\n  if (0x1F50 <= cp && cp <= 0x1F57) return true;\n  if (cp === 0x1F59) return true;\n  if (cp === 0x1F5B) return true;\n  if (cp === 0x1F5D) return true;\n  if (0x1F5F <= cp && cp <= 0x1F7D) return true;\n  if (0x1F80 <= cp && cp <= 0x1FB4) return true;\n  if (0x1FB6 <= cp && cp <= 0x1FBC) return true;\n  if (cp === 0x1FBE) return true;\n  if (0x1FC2 <= cp && cp <= 0x1FC4) return true;\n  if (0x1FC6 <= cp && cp <= 0x1FCC) return true;\n  if (0x1FD0 <= cp && cp <= 0x1FD3) return true;\n  if (0x1FD6 <= cp && cp <= 0x1FDB) return true;\n  if (0x1FE0 <= cp && cp <= 0x1FEC) return true;\n  if (0x1FF2 <= cp && cp <= 0x1FF4) return true;\n  if (0x1FF6 <= cp && cp <= 0x1FFC) return true;\n  if (cp === 0x2071) return true;\n  if (cp === 0x207F) return true;\n  if (0x2090 <= cp && cp <= 0x209C) return true;\n  if (cp === 0x2102) return true;\n  if (cp === 0x2107) return true;\n  if (0x210A <= cp && cp <= 0x2113) return true;\n  if (cp === 0x2115) return true;\n  if (0x2118 <= cp && cp <= 0x211D) return true;\n  if (cp === 0x2124) return true;\n  if (cp === 0x2126) return true;\n  if (cp === 0x2128) return true;\n  if (0x212A <= cp && cp <= 0x2139) return true;\n  if (0x213C <= cp && cp <= 0x213F) return true;\n  if (0x2145 <= cp && cp <= 0x2149) return true;\n  if (cp === 0x214E) return true;\n  if (0x2160 <= cp && cp <= 0x2188) return true;\n  if (0x2C00 <= cp && cp <= 0x2C2E) return true;\n  if (0x2C30 <= cp && cp <= 0x2C5E) return true;\n  if (0x2C60 <= cp && cp <= 0x2CE4) return true;\n  if (0x2CEB <= cp && cp <= 0x2CEE) return true;\n  if (0x2CF2 <= cp && cp <= 0x2CF3) return true;\n  if (0x2D00 <= cp && cp <= 0x2D25) return true;\n  if (cp === 0x2D27) return true;\n  if (cp === 0x2D2D) return true;\n  if (0x2D30 <= cp && cp <= 0x2D67) return true;\n  if (cp === 0x2D6F) return true;\n  if (0x2D80 <= cp && cp <= 0x2D96) return true;\n  if (0x2DA0 <= cp && cp <= 0x2DA6) return true;\n  if (0x2DA8 <= cp && cp <= 0x2DAE) return true;\n  if (0x2DB0 <= cp && cp <= 0x2DB6) return true;\n  if (0x2DB8 <= cp && cp <= 0x2DBE) return true;\n  if (0x2DC0 <= cp && cp <= 0x2DC6) return true;\n  if (0x2DC8 <= cp && cp <= 0x2DCE) return true;\n  if (0x2DD0 <= cp && cp <= 0x2DD6) return true;\n  if (0x2DD8 <= cp && cp <= 0x2DDE) return true;\n  if (0x3005 <= cp && cp <= 0x3007) return true;\n  if (0x3021 <= cp && cp <= 0x3029) return true;\n  if (0x3031 <= cp && cp <= 0x3035) return true;\n  if (0x3038 <= cp && cp <= 0x303C) return true;\n  if (0x3041 <= cp && cp <= 0x3096) return true;\n  if (0x309B <= cp && cp <= 0x309F) return true;\n  if (0x30A1 <= cp && cp <= 0x30FA) return true;\n  if (0x30FC <= cp && cp <= 0x30FF) return true;\n  if (0x3105 <= cp && cp <= 0x312D) return true;\n  if (0x3131 <= cp && cp <= 0x318E) return true;\n  if (0x31A0 <= cp && cp <= 0x31BA) return true;\n  if (0x31F0 <= cp && cp <= 0x31FF) return true;\n  if (0x3400 <= cp && cp <= 0x4DB5) return true;\n  if (0x4E00 <= cp && cp <= 0x9FD5) return true;\n  if (0xA000 <= cp && cp <= 0xA48C) return true;\n  if (0xA4D0 <= cp && cp <= 0xA4FD) return true;\n  if (0xA500 <= cp && cp <= 0xA60C) return true;\n  if (0xA610 <= cp && cp <= 0xA61F) return true;\n  if (0xA62A <= cp && cp <= 0xA62B) return true;\n  if (0xA640 <= cp && cp <= 0xA66E) return true;\n  if (0xA67F <= cp && cp <= 0xA69D) return true;\n  if (0xA6A0 <= cp && cp <= 0xA6EF) return true;\n  if (0xA717 <= cp && cp <= 0xA71F) return true;\n  if (0xA722 <= cp && cp <= 0xA788) return true;\n  if (0xA78B <= cp && cp <= 0xA7AD) return true;\n  if (0xA7B0 <= cp && cp <= 0xA7B7) return true;\n  if (0xA7F7 <= cp && cp <= 0xA801) return true;\n  if (0xA803 <= cp && cp <= 0xA805) return true;\n  if (0xA807 <= cp && cp <= 0xA80A) return true;\n  if (0xA80C <= cp && cp <= 0xA822) return true;\n  if (0xA840 <= cp && cp <= 0xA873) return true;\n  if (0xA882 <= cp && cp <= 0xA8B3) return true;\n  if (0xA8F2 <= cp && cp <= 0xA8F7) return true;\n  if (cp === 0xA8FB) return true;\n  if (cp === 0xA8FD) return true;\n  if (0xA90A <= cp && cp <= 0xA925) return true;\n  if (0xA930 <= cp && cp <= 0xA946) return true;\n  if (0xA960 <= cp && cp <= 0xA97C) return true;\n  if (0xA984 <= cp && cp <= 0xA9B2) return true;\n  if (cp === 0xA9CF) return true;\n  if (0xA9E0 <= cp && cp <= 0xA9E4) return true;\n  if (0xA9E6 <= cp && cp <= 0xA9EF) return true;\n  if (0xA9FA <= cp && cp <= 0xA9FE) return true;\n  if (0xAA00 <= cp && cp <= 0xAA28) return true;\n  if (0xAA40 <= cp && cp <= 0xAA42) return true;\n  if (0xAA44 <= cp && cp <= 0xAA4B) return true;\n  if (0xAA60 <= cp && cp <= 0xAA76) return true;\n  if (cp === 0xAA7A) return true;\n  if (0xAA7E <= cp && cp <= 0xAAAF) return true;\n  if (cp === 0xAAB1) return true;\n  if (0xAAB5 <= cp && cp <= 0xAAB6) return true;\n  if (0xAAB9 <= cp && cp <= 0xAABD) return true;\n  if (cp === 0xAAC0) return true;\n  if (cp === 0xAAC2) return true;\n  if (0xAADB <= cp && cp <= 0xAADD) return true;\n  if (0xAAE0 <= cp && cp <= 0xAAEA) return true;\n  if (0xAAF2 <= cp && cp <= 0xAAF4) return true;\n  if (0xAB01 <= cp && cp <= 0xAB06) return true;\n  if (0xAB09 <= cp && cp <= 0xAB0E) return true;\n  if (0xAB11 <= cp && cp <= 0xAB16) return true;\n  if (0xAB20 <= cp && cp <= 0xAB26) return true;\n  if (0xAB28 <= cp && cp <= 0xAB2E) return true;\n  if (0xAB30 <= cp && cp <= 0xAB5A) return true;\n  if (0xAB5C <= cp && cp <= 0xAB65) return true;\n  if (0xAB70 <= cp && cp <= 0xABE2) return true;\n  if (0xAC00 <= cp && cp <= 0xD7A3) return true;\n  if (0xD7B0 <= cp && cp <= 0xD7C6) return true;\n  if (0xD7CB <= cp && cp <= 0xD7FB) return true;\n  if (0xF900 <= cp && cp <= 0xFA6D) return true;\n  if (0xFA70 <= cp && cp <= 0xFAD9) return true;\n  if (0xFB00 <= cp && cp <= 0xFB06) return true;\n  if (0xFB13 <= cp && cp <= 0xFB17) return true;\n  if (cp === 0xFB1D) return true;\n  if (0xFB1F <= cp && cp <= 0xFB28) return true;\n  if (0xFB2A <= cp && cp <= 0xFB36) return true;\n  if (0xFB38 <= cp && cp <= 0xFB3C) return true;\n  if (cp === 0xFB3E) return true;\n  if (0xFB40 <= cp && cp <= 0xFB41) return true;\n  if (0xFB43 <= cp && cp <= 0xFB44) return true;\n  if (0xFB46 <= cp && cp <= 0xFBB1) return true;\n  if (0xFBD3 <= cp && cp <= 0xFD3D) return true;\n  if (0xFD50 <= cp && cp <= 0xFD8F) return true;\n  if (0xFD92 <= cp && cp <= 0xFDC7) return true;\n  if (0xFDF0 <= cp && cp <= 0xFDFB) return true;\n  if (0xFE70 <= cp && cp <= 0xFE74) return true;\n  if (0xFE76 <= cp && cp <= 0xFEFC) return true;\n  if (0xFF21 <= cp && cp <= 0xFF3A) return true;\n  if (0xFF41 <= cp && cp <= 0xFF5A) return true;\n  if (0xFF66 <= cp && cp <= 0xFFBE) return true;\n  if (0xFFC2 <= cp && cp <= 0xFFC7) return true;\n  if (0xFFCA <= cp && cp <= 0xFFCF) return true;\n  if (0xFFD2 <= cp && cp <= 0xFFD7) return true;\n  if (0xFFDA <= cp && cp <= 0xFFDC) return true;\n  if (0x10000 <= cp && cp <= 0x1000B) return true;\n  if (0x1000D <= cp && cp <= 0x10026) return true;\n  if (0x10028 <= cp && cp <= 0x1003A) return true;\n  if (0x1003C <= cp && cp <= 0x1003D) return true;\n  if (0x1003F <= cp && cp <= 0x1004D) return true;\n  if (0x10050 <= cp && cp <= 0x1005D) return true;\n  if (0x10080 <= cp && cp <= 0x100FA) return true;\n  if (0x10140 <= cp && cp <= 0x10174) return true;\n  if (0x10280 <= cp && cp <= 0x1029C) return true;\n  if (0x102A0 <= cp && cp <= 0x102D0) return true;\n  if (0x10300 <= cp && cp <= 0x1031F) return true;\n  if (0x10330 <= cp && cp <= 0x1034A) return true;\n  if (0x10350 <= cp && cp <= 0x10375) return true;\n  if (0x10380 <= cp && cp <= 0x1039D) return true;\n  if (0x103A0 <= cp && cp <= 0x103C3) return true;\n  if (0x103C8 <= cp && cp <= 0x103CF) return true;\n  if (0x103D1 <= cp && cp <= 0x103D5) return true;\n  if (0x10400 <= cp && cp <= 0x1049D) return true;\n  if (0x10500 <= cp && cp <= 0x10527) return true;\n  if (0x10530 <= cp && cp <= 0x10563) return true;\n  if (0x10600 <= cp && cp <= 0x10736) return true;\n  if (0x10740 <= cp && cp <= 0x10755) return true;\n  if (0x10760 <= cp && cp <= 0x10767) return true;\n  if (0x10800 <= cp && cp <= 0x10805) return true;\n  if (cp === 0x10808) return true;\n  if (0x1080A <= cp && cp <= 0x10835) return true;\n  if (0x10837 <= cp && cp <= 0x10838) return true;\n  if (cp === 0x1083C) return true;\n  if (0x1083F <= cp && cp <= 0x10855) return true;\n  if (0x10860 <= cp && cp <= 0x10876) return true;\n  if (0x10880 <= cp && cp <= 0x1089E) return true;\n  if (0x108E0 <= cp && cp <= 0x108F2) return true;\n  if (0x108F4 <= cp && cp <= 0x108F5) return true;\n  if (0x10900 <= cp && cp <= 0x10915) return true;\n  if (0x10920 <= cp && cp <= 0x10939) return true;\n  if (0x10980 <= cp && cp <= 0x109B7) return true;\n  if (0x109BE <= cp && cp <= 0x109BF) return true;\n  if (cp === 0x10A00) return true;\n  if (0x10A10 <= cp && cp <= 0x10A13) return true;\n  if (0x10A15 <= cp && cp <= 0x10A17) return true;\n  if (0x10A19 <= cp && cp <= 0x10A33) return true;\n  if (0x10A60 <= cp && cp <= 0x10A7C) return true;\n  if (0x10A80 <= cp && cp <= 0x10A9C) return true;\n  if (0x10AC0 <= cp && cp <= 0x10AC7) return true;\n  if (0x10AC9 <= cp && cp <= 0x10AE4) return true;\n  if (0x10B00 <= cp && cp <= 0x10B35) return true;\n  if (0x10B40 <= cp && cp <= 0x10B55) return true;\n  if (0x10B60 <= cp && cp <= 0x10B72) return true;\n  if (0x10B80 <= cp && cp <= 0x10B91) return true;\n  if (0x10C00 <= cp && cp <= 0x10C48) return true;\n  if (0x10C80 <= cp && cp <= 0x10CB2) return true;\n  if (0x10CC0 <= cp && cp <= 0x10CF2) return true;\n  if (0x11003 <= cp && cp <= 0x11037) return true;\n  if (0x11083 <= cp && cp <= 0x110AF) return true;\n  if (0x110D0 <= cp && cp <= 0x110E8) return true;\n  if (0x11103 <= cp && cp <= 0x11126) return true;\n  if (0x11150 <= cp && cp <= 0x11172) return true;\n  if (cp === 0x11176) return true;\n  if (0x11183 <= cp && cp <= 0x111B2) return true;\n  if (0x111C1 <= cp && cp <= 0x111C4) return true;\n  if (cp === 0x111DA) return true;\n  if (cp === 0x111DC) return true;\n  if (0x11200 <= cp && cp <= 0x11211) return true;\n  if (0x11213 <= cp && cp <= 0x1122B) return true;\n  if (0x11280 <= cp && cp <= 0x11286) return true;\n  if (cp === 0x11288) return true;\n  if (0x1128A <= cp && cp <= 0x1128D) return true;\n  if (0x1128F <= cp && cp <= 0x1129D) return true;\n  if (0x1129F <= cp && cp <= 0x112A8) return true;\n  if (0x112B0 <= cp && cp <= 0x112DE) return true;\n  if (0x11305 <= cp && cp <= 0x1130C) return true;\n  if (0x1130F <= cp && cp <= 0x11310) return true;\n  if (0x11313 <= cp && cp <= 0x11328) return true;\n  if (0x1132A <= cp && cp <= 0x11330) return true;\n  if (0x11332 <= cp && cp <= 0x11333) return true;\n  if (0x11335 <= cp && cp <= 0x11339) return true;\n  if (cp === 0x1133D) return true;\n  if (cp === 0x11350) return true;\n  if (0x1135D <= cp && cp <= 0x11361) return true;\n  if (0x11480 <= cp && cp <= 0x114AF) return true;\n  if (0x114C4 <= cp && cp <= 0x114C5) return true;\n  if (cp === 0x114C7) return true;\n  if (0x11580 <= cp && cp <= 0x115AE) return true;\n  if (0x115D8 <= cp && cp <= 0x115DB) return true;\n  if (0x11600 <= cp && cp <= 0x1162F) return true;\n  if (cp === 0x11644) return true;\n  if (0x11680 <= cp && cp <= 0x116AA) return true;\n  if (0x11700 <= cp && cp <= 0x11719) return true;\n  if (0x118A0 <= cp && cp <= 0x118DF) return true;\n  if (cp === 0x118FF) return true;\n  if (0x11AC0 <= cp && cp <= 0x11AF8) return true;\n  if (0x12000 <= cp && cp <= 0x12399) return true;\n  if (0x12400 <= cp && cp <= 0x1246E) return true;\n  if (0x12480 <= cp && cp <= 0x12543) return true;\n  if (0x13000 <= cp && cp <= 0x1342E) return true;\n  if (0x14400 <= cp && cp <= 0x14646) return true;\n  if (0x16800 <= cp && cp <= 0x16A38) return true;\n  if (0x16A40 <= cp && cp <= 0x16A5E) return true;\n  if (0x16AD0 <= cp && cp <= 0x16AED) return true;\n  if (0x16B00 <= cp && cp <= 0x16B2F) return true;\n  if (0x16B40 <= cp && cp <= 0x16B43) return true;\n  if (0x16B63 <= cp && cp <= 0x16B77) return true;\n  if (0x16B7D <= cp && cp <= 0x16B8F) return true;\n  if (0x16F00 <= cp && cp <= 0x16F44) return true;\n  if (cp === 0x16F50) return true;\n  if (0x16F93 <= cp && cp <= 0x16F9F) return true;\n  if (0x1B000 <= cp && cp <= 0x1B001) return true;\n  if (0x1BC00 <= cp && cp <= 0x1BC6A) return true;\n  if (0x1BC70 <= cp && cp <= 0x1BC7C) return true;\n  if (0x1BC80 <= cp && cp <= 0x1BC88) return true;\n  if (0x1BC90 <= cp && cp <= 0x1BC99) return true;\n  if (0x1D400 <= cp && cp <= 0x1D454) return true;\n  if (0x1D456 <= cp && cp <= 0x1D49C) return true;\n  if (0x1D49E <= cp && cp <= 0x1D49F) return true;\n  if (cp === 0x1D4A2) return true;\n  if (0x1D4A5 <= cp && cp <= 0x1D4A6) return true;\n  if (0x1D4A9 <= cp && cp <= 0x1D4AC) return true;\n  if (0x1D4AE <= cp && cp <= 0x1D4B9) return true;\n  if (cp === 0x1D4BB) return true;\n  if (0x1D4BD <= cp && cp <= 0x1D4C3) return true;\n  if (0x1D4C5 <= cp && cp <= 0x1D505) return true;\n  if (0x1D507 <= cp && cp <= 0x1D50A) return true;\n  if (0x1D50D <= cp && cp <= 0x1D514) return true;\n  if (0x1D516 <= cp && cp <= 0x1D51C) return true;\n  if (0x1D51E <= cp && cp <= 0x1D539) return true;\n  if (0x1D53B <= cp && cp <= 0x1D53E) return true;\n  if (0x1D540 <= cp && cp <= 0x1D544) return true;\n  if (cp === 0x1D546) return true;\n  if (0x1D54A <= cp && cp <= 0x1D550) return true;\n  if (0x1D552 <= cp && cp <= 0x1D6A5) return true;\n  if (0x1D6A8 <= cp && cp <= 0x1D6C0) return true;\n  if (0x1D6C2 <= cp && cp <= 0x1D6DA) return true;\n  if (0x1D6DC <= cp && cp <= 0x1D6FA) return true;\n  if (0x1D6FC <= cp && cp <= 0x1D714) return true;\n  if (0x1D716 <= cp && cp <= 0x1D734) return true;\n  if (0x1D736 <= cp && cp <= 0x1D74E) return true;\n  if (0x1D750 <= cp && cp <= 0x1D76E) return true;\n  if (0x1D770 <= cp && cp <= 0x1D788) return true;\n  if (0x1D78A <= cp && cp <= 0x1D7A8) return true;\n  if (0x1D7AA <= cp && cp <= 0x1D7C2) return true;\n  if (0x1D7C4 <= cp && cp <= 0x1D7CB) return true;\n  if (0x1E800 <= cp && cp <= 0x1E8C4) return true;\n  if (0x1EE00 <= cp && cp <= 0x1EE03) return true;\n  if (0x1EE05 <= cp && cp <= 0x1EE1F) return true;\n  if (0x1EE21 <= cp && cp <= 0x1EE22) return true;\n  if (cp === 0x1EE24) return true;\n  if (cp === 0x1EE27) return true;\n  if (0x1EE29 <= cp && cp <= 0x1EE32) return true;\n  if (0x1EE34 <= cp && cp <= 0x1EE37) return true;\n  if (cp === 0x1EE39) return true;\n  if (cp === 0x1EE3B) return true;\n  if (cp === 0x1EE42) return true;\n  if (cp === 0x1EE47) return true;\n  if (cp === 0x1EE49) return true;\n  if (cp === 0x1EE4B) return true;\n  if (0x1EE4D <= cp && cp <= 0x1EE4F) return true;\n  if (0x1EE51 <= cp && cp <= 0x1EE52) return true;\n  if (cp === 0x1EE54) return true;\n  if (cp === 0x1EE57) return true;\n  if (cp === 0x1EE59) return true;\n  if (cp === 0x1EE5B) return true;\n  if (cp === 0x1EE5D) return true;\n  if (cp === 0x1EE5F) return true;\n  if (0x1EE61 <= cp && cp <= 0x1EE62) return true;\n  if (cp === 0x1EE64) return true;\n  if (0x1EE67 <= cp && cp <= 0x1EE6A) return true;\n  if (0x1EE6C <= cp && cp <= 0x1EE72) return true;\n  if (0x1EE74 <= cp && cp <= 0x1EE77) return true;\n  if (0x1EE79 <= cp && cp <= 0x1EE7C) return true;\n  if (cp === 0x1EE7E) return true;\n  if (0x1EE80 <= cp && cp <= 0x1EE89) return true;\n  if (0x1EE8B <= cp && cp <= 0x1EE9B) return true;\n  if (0x1EEA1 <= cp && cp <= 0x1EEA3) return true;\n  if (0x1EEA5 <= cp && cp <= 0x1EEA9) return true;\n  if (0x1EEAB <= cp && cp <= 0x1EEBB) return true;\n  if (0x20000 <= cp && cp <= 0x2A6D6) return true;\n  if (0x2A700 <= cp && cp <= 0x2B734) return true;\n  if (0x2B740 <= cp && cp <= 0x2B81D) return true;\n  if (0x2B820 <= cp && cp <= 0x2CEA1) return true;\n  if (0x2F800 <= cp && cp <= 0x2FA1D) return true;\n  return false;\n}\nfunction IDC_Y(cp) {\n  if (0x0030 <= cp && cp <= 0x0039) return true;\n  if (0x0041 <= cp && cp <= 0x005A) return true;\n  if (cp === 0x005F) return true;\n  if (0x0061 <= cp && cp <= 0x007A) return true;\n  if (cp === 0x00AA) return true;\n  if (cp === 0x00B5) return true;\n  if (cp === 0x00B7) return true;\n  if (cp === 0x00BA) return true;\n  if (0x00C0 <= cp && cp <= 0x00D6) return true;\n  if (0x00D8 <= cp && cp <= 0x00F6) return true;\n  if (0x00F8 <= cp && cp <= 0x02C1) return true;\n  if (0x02C6 <= cp && cp <= 0x02D1) return true;\n  if (0x02E0 <= cp && cp <= 0x02E4) return true;\n  if (cp === 0x02EC) return true;\n  if (cp === 0x02EE) return true;\n  if (0x0300 <= cp && cp <= 0x0374) return true;\n  if (0x0376 <= cp && cp <= 0x0377) return true;\n  if (0x037A <= cp && cp <= 0x037D) return true;\n  if (cp === 0x037F) return true;\n  if (0x0386 <= cp && cp <= 0x038A) return true;\n  if (cp === 0x038C) return true;\n  if (0x038E <= cp && cp <= 0x03A1) return true;\n  if (0x03A3 <= cp && cp <= 0x03F5) return true;\n  if (0x03F7 <= cp && cp <= 0x0481) return true;\n  if (0x0483 <= cp && cp <= 0x0487) return true;\n  if (0x048A <= cp && cp <= 0x052F) return true;\n  if (0x0531 <= cp && cp <= 0x0556) return true;\n  if (cp === 0x0559) return true;\n  if (0x0561 <= cp && cp <= 0x0587) return true;\n  if (0x0591 <= cp && cp <= 0x05BD) return true;\n  if (cp === 0x05BF) return true;\n  if (0x05C1 <= cp && cp <= 0x05C2) return true;\n  if (0x05C4 <= cp && cp <= 0x05C5) return true;\n  if (cp === 0x05C7) return true;\n  if (0x05D0 <= cp && cp <= 0x05EA) return true;\n  if (0x05F0 <= cp && cp <= 0x05F2) return true;\n  if (0x0610 <= cp && cp <= 0x061A) return true;\n  if (0x0620 <= cp && cp <= 0x0669) return true;\n  if (0x066E <= cp && cp <= 0x06D3) return true;\n  if (0x06D5 <= cp && cp <= 0x06DC) return true;\n  if (0x06DF <= cp && cp <= 0x06E8) return true;\n  if (0x06EA <= cp && cp <= 0x06FC) return true;\n  if (cp === 0x06FF) return true;\n  if (0x0710 <= cp && cp <= 0x074A) return true;\n  if (0x074D <= cp && cp <= 0x07B1) return true;\n  if (0x07C0 <= cp && cp <= 0x07F5) return true;\n  if (cp === 0x07FA) return true;\n  if (0x0800 <= cp && cp <= 0x082D) return true;\n  if (0x0840 <= cp && cp <= 0x085B) return true;\n  if (0x08A0 <= cp && cp <= 0x08B4) return true;\n  if (0x08E3 <= cp && cp <= 0x0963) return true;\n  if (0x0966 <= cp && cp <= 0x096F) return true;\n  if (0x0971 <= cp && cp <= 0x0983) return true;\n  if (0x0985 <= cp && cp <= 0x098C) return true;\n  if (0x098F <= cp && cp <= 0x0990) return true;\n  if (0x0993 <= cp && cp <= 0x09A8) return true;\n  if (0x09AA <= cp && cp <= 0x09B0) return true;\n  if (cp === 0x09B2) return true;\n  if (0x09B6 <= cp && cp <= 0x09B9) return true;\n  if (0x09BC <= cp && cp <= 0x09C4) return true;\n  if (0x09C7 <= cp && cp <= 0x09C8) return true;\n  if (0x09CB <= cp && cp <= 0x09CE) return true;\n  if (cp === 0x09D7) return true;\n  if (0x09DC <= cp && cp <= 0x09DD) return true;\n  if (0x09DF <= cp && cp <= 0x09E3) return true;\n  if (0x09E6 <= cp && cp <= 0x09F1) return true;\n  if (0x0A01 <= cp && cp <= 0x0A03) return true;\n  if (0x0A05 <= cp && cp <= 0x0A0A) return true;\n  if (0x0A0F <= cp && cp <= 0x0A10) return true;\n  if (0x0A13 <= cp && cp <= 0x0A28) return true;\n  if (0x0A2A <= cp && cp <= 0x0A30) return true;\n  if (0x0A32 <= cp && cp <= 0x0A33) return true;\n  if (0x0A35 <= cp && cp <= 0x0A36) return true;\n  if (0x0A38 <= cp && cp <= 0x0A39) return true;\n  if (cp === 0x0A3C) return true;\n  if (0x0A3E <= cp && cp <= 0x0A42) return true;\n  if (0x0A47 <= cp && cp <= 0x0A48) return true;\n  if (0x0A4B <= cp && cp <= 0x0A4D) return true;\n  if (cp === 0x0A51) return true;\n  if (0x0A59 <= cp && cp <= 0x0A5C) return true;\n  if (cp === 0x0A5E) return true;\n  if (0x0A66 <= cp && cp <= 0x0A75) return true;\n  if (0x0A81 <= cp && cp <= 0x0A83) return true;\n  if (0x0A85 <= cp && cp <= 0x0A8D) return true;\n  if (0x0A8F <= cp && cp <= 0x0A91) return true;\n  if (0x0A93 <= cp && cp <= 0x0AA8) return true;\n  if (0x0AAA <= cp && cp <= 0x0AB0) return true;\n  if (0x0AB2 <= cp && cp <= 0x0AB3) return true;\n  if (0x0AB5 <= cp && cp <= 0x0AB9) return true;\n  if (0x0ABC <= cp && cp <= 0x0AC5) return true;\n  if (0x0AC7 <= cp && cp <= 0x0AC9) return true;\n  if (0x0ACB <= cp && cp <= 0x0ACD) return true;\n  if (cp === 0x0AD0) return true;\n  if (0x0AE0 <= cp && cp <= 0x0AE3) return true;\n  if (0x0AE6 <= cp && cp <= 0x0AEF) return true;\n  if (cp === 0x0AF9) return true;\n  if (0x0B01 <= cp && cp <= 0x0B03) return true;\n  if (0x0B05 <= cp && cp <= 0x0B0C) return true;\n  if (0x0B0F <= cp && cp <= 0x0B10) return true;\n  if (0x0B13 <= cp && cp <= 0x0B28) return true;\n  if (0x0B2A <= cp && cp <= 0x0B30) return true;\n  if (0x0B32 <= cp && cp <= 0x0B33) return true;\n  if (0x0B35 <= cp && cp <= 0x0B39) return true;\n  if (0x0B3C <= cp && cp <= 0x0B44) return true;\n  if (0x0B47 <= cp && cp <= 0x0B48) return true;\n  if (0x0B4B <= cp && cp <= 0x0B4D) return true;\n  if (0x0B56 <= cp && cp <= 0x0B57) return true;\n  if (0x0B5C <= cp && cp <= 0x0B5D) return true;\n  if (0x0B5F <= cp && cp <= 0x0B63) return true;\n  if (0x0B66 <= cp && cp <= 0x0B6F) return true;\n  if (cp === 0x0B71) return true;\n  if (0x0B82 <= cp && cp <= 0x0B83) return true;\n  if (0x0B85 <= cp && cp <= 0x0B8A) return true;\n  if (0x0B8E <= cp && cp <= 0x0B90) return true;\n  if (0x0B92 <= cp && cp <= 0x0B95) return true;\n  if (0x0B99 <= cp && cp <= 0x0B9A) return true;\n  if (cp === 0x0B9C) return true;\n  if (0x0B9E <= cp && cp <= 0x0B9F) return true;\n  if (0x0BA3 <= cp && cp <= 0x0BA4) return true;\n  if (0x0BA8 <= cp && cp <= 0x0BAA) return true;\n  if (0x0BAE <= cp && cp <= 0x0BB9) return true;\n  if (0x0BBE <= cp && cp <= 0x0BC2) return true;\n  if (0x0BC6 <= cp && cp <= 0x0BC8) return true;\n  if (0x0BCA <= cp && cp <= 0x0BCD) return true;\n  if (cp === 0x0BD0) return true;\n  if (cp === 0x0BD7) return true;\n  if (0x0BE6 <= cp && cp <= 0x0BEF) return true;\n  if (0x0C00 <= cp && cp <= 0x0C03) return true;\n  if (0x0C05 <= cp && cp <= 0x0C0C) return true;\n  if (0x0C0E <= cp && cp <= 0x0C10) return true;\n  if (0x0C12 <= cp && cp <= 0x0C28) return true;\n  if (0x0C2A <= cp && cp <= 0x0C39) return true;\n  if (0x0C3D <= cp && cp <= 0x0C44) return true;\n  if (0x0C46 <= cp && cp <= 0x0C48) return true;\n  if (0x0C4A <= cp && cp <= 0x0C4D) return true;\n  if (0x0C55 <= cp && cp <= 0x0C56) return true;\n  if (0x0C58 <= cp && cp <= 0x0C5A) return true;\n  if (0x0C60 <= cp && cp <= 0x0C63) return true;\n  if (0x0C66 <= cp && cp <= 0x0C6F) return true;\n  if (0x0C81 <= cp && cp <= 0x0C83) return true;\n  if (0x0C85 <= cp && cp <= 0x0C8C) return true;\n  if (0x0C8E <= cp && cp <= 0x0C90) return true;\n  if (0x0C92 <= cp && cp <= 0x0CA8) return true;\n  if (0x0CAA <= cp && cp <= 0x0CB3) return true;\n  if (0x0CB5 <= cp && cp <= 0x0CB9) return true;\n  if (0x0CBC <= cp && cp <= 0x0CC4) return true;\n  if (0x0CC6 <= cp && cp <= 0x0CC8) return true;\n  if (0x0CCA <= cp && cp <= 0x0CCD) return true;\n  if (0x0CD5 <= cp && cp <= 0x0CD6) return true;\n  if (cp === 0x0CDE) return true;\n  if (0x0CE0 <= cp && cp <= 0x0CE3) return true;\n  if (0x0CE6 <= cp && cp <= 0x0CEF) return true;\n  if (0x0CF1 <= cp && cp <= 0x0CF2) return true;\n  if (0x0D01 <= cp && cp <= 0x0D03) return true;\n  if (0x0D05 <= cp && cp <= 0x0D0C) return true;\n  if (0x0D0E <= cp && cp <= 0x0D10) return true;\n  if (0x0D12 <= cp && cp <= 0x0D3A) return true;\n  if (0x0D3D <= cp && cp <= 0x0D44) return true;\n  if (0x0D46 <= cp && cp <= 0x0D48) return true;\n  if (0x0D4A <= cp && cp <= 0x0D4E) return true;\n  if (cp === 0x0D57) return true;\n  if (0x0D5F <= cp && cp <= 0x0D63) return true;\n  if (0x0D66 <= cp && cp <= 0x0D6F) return true;\n  if (0x0D7A <= cp && cp <= 0x0D7F) return true;\n  if (0x0D82 <= cp && cp <= 0x0D83) return true;\n  if (0x0D85 <= cp && cp <= 0x0D96) return true;\n  if (0x0D9A <= cp && cp <= 0x0DB1) return true;\n  if (0x0DB3 <= cp && cp <= 0x0DBB) return true;\n  if (cp === 0x0DBD) return true;\n  if (0x0DC0 <= cp && cp <= 0x0DC6) return true;\n  if (cp === 0x0DCA) return true;\n  if (0x0DCF <= cp && cp <= 0x0DD4) return true;\n  if (cp === 0x0DD6) return true;\n  if (0x0DD8 <= cp && cp <= 0x0DDF) return true;\n  if (0x0DE6 <= cp && cp <= 0x0DEF) return true;\n  if (0x0DF2 <= cp && cp <= 0x0DF3) return true;\n  if (0x0E01 <= cp && cp <= 0x0E3A) return true;\n  if (0x0E40 <= cp && cp <= 0x0E4E) return true;\n  if (0x0E50 <= cp && cp <= 0x0E59) return true;\n  if (0x0E81 <= cp && cp <= 0x0E82) return true;\n  if (cp === 0x0E84) return true;\n  if (0x0E87 <= cp && cp <= 0x0E88) return true;\n  if (cp === 0x0E8A) return true;\n  if (cp === 0x0E8D) return true;\n  if (0x0E94 <= cp && cp <= 0x0E97) return true;\n  if (0x0E99 <= cp && cp <= 0x0E9F) return true;\n  if (0x0EA1 <= cp && cp <= 0x0EA3) return true;\n  if (cp === 0x0EA5) return true;\n  if (cp === 0x0EA7) return true;\n  if (0x0EAA <= cp && cp <= 0x0EAB) return true;\n  if (0x0EAD <= cp && cp <= 0x0EB9) return true;\n  if (0x0EBB <= cp && cp <= 0x0EBD) return true;\n  if (0x0EC0 <= cp && cp <= 0x0EC4) return true;\n  if (cp === 0x0EC6) return true;\n  if (0x0EC8 <= cp && cp <= 0x0ECD) return true;\n  if (0x0ED0 <= cp && cp <= 0x0ED9) return true;\n  if (0x0EDC <= cp && cp <= 0x0EDF) return true;\n  if (cp === 0x0F00) return true;\n  if (0x0F18 <= cp && cp <= 0x0F19) return true;\n  if (0x0F20 <= cp && cp <= 0x0F29) return true;\n  if (cp === 0x0F35) return true;\n  if (cp === 0x0F37) return true;\n  if (cp === 0x0F39) return true;\n  if (0x0F3E <= cp && cp <= 0x0F47) return true;\n  if (0x0F49 <= cp && cp <= 0x0F6C) return true;\n  if (0x0F71 <= cp && cp <= 0x0F84) return true;\n  if (0x0F86 <= cp && cp <= 0x0F97) return true;\n  if (0x0F99 <= cp && cp <= 0x0FBC) return true;\n  if (cp === 0x0FC6) return true;\n  if (0x1000 <= cp && cp <= 0x1049) return true;\n  if (0x1050 <= cp && cp <= 0x109D) return true;\n  if (0x10A0 <= cp && cp <= 0x10C5) return true;\n  if (cp === 0x10C7) return true;\n  if (cp === 0x10CD) return true;\n  if (0x10D0 <= cp && cp <= 0x10FA) return true;\n  if (0x10FC <= cp && cp <= 0x1248) return true;\n  if (0x124A <= cp && cp <= 0x124D) return true;\n  if (0x1250 <= cp && cp <= 0x1256) return true;\n  if (cp === 0x1258) return true;\n  if (0x125A <= cp && cp <= 0x125D) return true;\n  if (0x1260 <= cp && cp <= 0x1288) return true;\n  if (0x128A <= cp && cp <= 0x128D) return true;\n  if (0x1290 <= cp && cp <= 0x12B0) return true;\n  if (0x12B2 <= cp && cp <= 0x12B5) return true;\n  if (0x12B8 <= cp && cp <= 0x12BE) return true;\n  if (cp === 0x12C0) return true;\n  if (0x12C2 <= cp && cp <= 0x12C5) return true;\n  if (0x12C8 <= cp && cp <= 0x12D6) return true;\n  if (0x12D8 <= cp && cp <= 0x1310) return true;\n  if (0x1312 <= cp && cp <= 0x1315) return true;\n  if (0x1318 <= cp && cp <= 0x135A) return true;\n  if (0x135D <= cp && cp <= 0x135F) return true;\n  if (0x1369 <= cp && cp <= 0x1371) return true;\n  if (0x1380 <= cp && cp <= 0x138F) return true;\n  if (0x13A0 <= cp && cp <= 0x13F5) return true;\n  if (0x13F8 <= cp && cp <= 0x13FD) return true;\n  if (0x1401 <= cp && cp <= 0x166C) return true;\n  if (0x166F <= cp && cp <= 0x167F) return true;\n  if (0x1681 <= cp && cp <= 0x169A) return true;\n  if (0x16A0 <= cp && cp <= 0x16EA) return true;\n  if (0x16EE <= cp && cp <= 0x16F8) return true;\n  if (0x1700 <= cp && cp <= 0x170C) return true;\n  if (0x170E <= cp && cp <= 0x1714) return true;\n  if (0x1720 <= cp && cp <= 0x1734) return true;\n  if (0x1740 <= cp && cp <= 0x1753) return true;\n  if (0x1760 <= cp && cp <= 0x176C) return true;\n  if (0x176E <= cp && cp <= 0x1770) return true;\n  if (0x1772 <= cp && cp <= 0x1773) return true;\n  if (0x1780 <= cp && cp <= 0x17D3) return true;\n  if (cp === 0x17D7) return true;\n  if (0x17DC <= cp && cp <= 0x17DD) return true;\n  if (0x17E0 <= cp && cp <= 0x17E9) return true;\n  if (0x180B <= cp && cp <= 0x180D) return true;\n  if (0x1810 <= cp && cp <= 0x1819) return true;\n  if (0x1820 <= cp && cp <= 0x1877) return true;\n  if (0x1880 <= cp && cp <= 0x18AA) return true;\n  if (0x18B0 <= cp && cp <= 0x18F5) return true;\n  if (0x1900 <= cp && cp <= 0x191E) return true;\n  if (0x1920 <= cp && cp <= 0x192B) return true;\n  if (0x1930 <= cp && cp <= 0x193B) return true;\n  if (0x1946 <= cp && cp <= 0x196D) return true;\n  if (0x1970 <= cp && cp <= 0x1974) return true;\n  if (0x1980 <= cp && cp <= 0x19AB) return true;\n  if (0x19B0 <= cp && cp <= 0x19C9) return true;\n  if (0x19D0 <= cp && cp <= 0x19DA) return true;\n  if (0x1A00 <= cp && cp <= 0x1A1B) return true;\n  if (0x1A20 <= cp && cp <= 0x1A5E) return true;\n  if (0x1A60 <= cp && cp <= 0x1A7C) return true;\n  if (0x1A7F <= cp && cp <= 0x1A89) return true;\n  if (0x1A90 <= cp && cp <= 0x1A99) return true;\n  if (cp === 0x1AA7) return true;\n  if (0x1AB0 <= cp && cp <= 0x1ABD) return true;\n  if (0x1B00 <= cp && cp <= 0x1B4B) return true;\n  if (0x1B50 <= cp && cp <= 0x1B59) return true;\n  if (0x1B6B <= cp && cp <= 0x1B73) return true;\n  if (0x1B80 <= cp && cp <= 0x1BF3) return true;\n  if (0x1C00 <= cp && cp <= 0x1C37) return true;\n  if (0x1C40 <= cp && cp <= 0x1C49) return true;\n  if (0x1C4D <= cp && cp <= 0x1C7D) return true;\n  if (0x1CD0 <= cp && cp <= 0x1CD2) return true;\n  if (0x1CD4 <= cp && cp <= 0x1CF6) return true;\n  if (0x1CF8 <= cp && cp <= 0x1CF9) return true;\n  if (0x1D00 <= cp && cp <= 0x1DF5) return true;\n  if (0x1DFC <= cp && cp <= 0x1F15) return true;\n  if (0x1F18 <= cp && cp <= 0x1F1D) return true;\n  if (0x1F20 <= cp && cp <= 0x1F45) return true;\n  if (0x1F48 <= cp && cp <= 0x1F4D) return true;\n  if (0x1F50 <= cp && cp <= 0x1F57) return true;\n  if (cp === 0x1F59) return true;\n  if (cp === 0x1F5B) return true;\n  if (cp === 0x1F5D) return true;\n  if (0x1F5F <= cp && cp <= 0x1F7D) return true;\n  if (0x1F80 <= cp && cp <= 0x1FB4) return true;\n  if (0x1FB6 <= cp && cp <= 0x1FBC) return true;\n  if (cp === 0x1FBE) return true;\n  if (0x1FC2 <= cp && cp <= 0x1FC4) return true;\n  if (0x1FC6 <= cp && cp <= 0x1FCC) return true;\n  if (0x1FD0 <= cp && cp <= 0x1FD3) return true;\n  if (0x1FD6 <= cp && cp <= 0x1FDB) return true;\n  if (0x1FE0 <= cp && cp <= 0x1FEC) return true;\n  if (0x1FF2 <= cp && cp <= 0x1FF4) return true;\n  if (0x1FF6 <= cp && cp <= 0x1FFC) return true;\n  if (0x203F <= cp && cp <= 0x2040) return true;\n  if (cp === 0x2054) return true;\n  if (cp === 0x2071) return true;\n  if (cp === 0x207F) return true;\n  if (0x2090 <= cp && cp <= 0x209C) return true;\n  if (0x20D0 <= cp && cp <= 0x20DC) return true;\n  if (cp === 0x20E1) return true;\n  if (0x20E5 <= cp && cp <= 0x20F0) return true;\n  if (cp === 0x2102) return true;\n  if (cp === 0x2107) return true;\n  if (0x210A <= cp && cp <= 0x2113) return true;\n  if (cp === 0x2115) return true;\n  if (0x2118 <= cp && cp <= 0x211D) return true;\n  if (cp === 0x2124) return true;\n  if (cp === 0x2126) return true;\n  if (cp === 0x2128) return true;\n  if (0x212A <= cp && cp <= 0x2139) return true;\n  if (0x213C <= cp && cp <= 0x213F) return true;\n  if (0x2145 <= cp && cp <= 0x2149) return true;\n  if (cp === 0x214E) return true;\n  if (0x2160 <= cp && cp <= 0x2188) return true;\n  if (0x2C00 <= cp && cp <= 0x2C2E) return true;\n  if (0x2C30 <= cp && cp <= 0x2C5E) return true;\n  if (0x2C60 <= cp && cp <= 0x2CE4) return true;\n  if (0x2CEB <= cp && cp <= 0x2CF3) return true;\n  if (0x2D00 <= cp && cp <= 0x2D25) return true;\n  if (cp === 0x2D27) return true;\n  if (cp === 0x2D2D) return true;\n  if (0x2D30 <= cp && cp <= 0x2D67) return true;\n  if (cp === 0x2D6F) return true;\n  if (0x2D7F <= cp && cp <= 0x2D96) return true;\n  if (0x2DA0 <= cp && cp <= 0x2DA6) return true;\n  if (0x2DA8 <= cp && cp <= 0x2DAE) return true;\n  if (0x2DB0 <= cp && cp <= 0x2DB6) return true;\n  if (0x2DB8 <= cp && cp <= 0x2DBE) return true;\n  if (0x2DC0 <= cp && cp <= 0x2DC6) return true;\n  if (0x2DC8 <= cp && cp <= 0x2DCE) return true;\n  if (0x2DD0 <= cp && cp <= 0x2DD6) return true;\n  if (0x2DD8 <= cp && cp <= 0x2DDE) return true;\n  if (0x2DE0 <= cp && cp <= 0x2DFF) return true;\n  if (0x3005 <= cp && cp <= 0x3007) return true;\n  if (0x3021 <= cp && cp <= 0x302F) return true;\n  if (0x3031 <= cp && cp <= 0x3035) return true;\n  if (0x3038 <= cp && cp <= 0x303C) return true;\n  if (0x3041 <= cp && cp <= 0x3096) return true;\n  if (0x3099 <= cp && cp <= 0x309F) return true;\n  if (0x30A1 <= cp && cp <= 0x30FA) return true;\n  if (0x30FC <= cp && cp <= 0x30FF) return true;\n  if (0x3105 <= cp && cp <= 0x312D) return true;\n  if (0x3131 <= cp && cp <= 0x318E) return true;\n  if (0x31A0 <= cp && cp <= 0x31BA) return true;\n  if (0x31F0 <= cp && cp <= 0x31FF) return true;\n  if (0x3400 <= cp && cp <= 0x4DB5) return true;\n  if (0x4E00 <= cp && cp <= 0x9FD5) return true;\n  if (0xA000 <= cp && cp <= 0xA48C) return true;\n  if (0xA4D0 <= cp && cp <= 0xA4FD) return true;\n  if (0xA500 <= cp && cp <= 0xA60C) return true;\n  if (0xA610 <= cp && cp <= 0xA62B) return true;\n  if (0xA640 <= cp && cp <= 0xA66F) return true;\n  if (0xA674 <= cp && cp <= 0xA67D) return true;\n  if (0xA67F <= cp && cp <= 0xA6F1) return true;\n  if (0xA717 <= cp && cp <= 0xA71F) return true;\n  if (0xA722 <= cp && cp <= 0xA788) return true;\n  if (0xA78B <= cp && cp <= 0xA7AD) return true;\n  if (0xA7B0 <= cp && cp <= 0xA7B7) return true;\n  if (0xA7F7 <= cp && cp <= 0xA827) return true;\n  if (0xA840 <= cp && cp <= 0xA873) return true;\n  if (0xA880 <= cp && cp <= 0xA8C4) return true;\n  if (0xA8D0 <= cp && cp <= 0xA8D9) return true;\n  if (0xA8E0 <= cp && cp <= 0xA8F7) return true;\n  if (cp === 0xA8FB) return true;\n  if (cp === 0xA8FD) return true;\n  if (0xA900 <= cp && cp <= 0xA92D) return true;\n  if (0xA930 <= cp && cp <= 0xA953) return true;\n  if (0xA960 <= cp && cp <= 0xA97C) return true;\n  if (0xA980 <= cp && cp <= 0xA9C0) return true;\n  if (0xA9CF <= cp && cp <= 0xA9D9) return true;\n  if (0xA9E0 <= cp && cp <= 0xA9FE) return true;\n  if (0xAA00 <= cp && cp <= 0xAA36) return true;\n  if (0xAA40 <= cp && cp <= 0xAA4D) return true;\n  if (0xAA50 <= cp && cp <= 0xAA59) return true;\n  if (0xAA60 <= cp && cp <= 0xAA76) return true;\n  if (0xAA7A <= cp && cp <= 0xAAC2) return true;\n  if (0xAADB <= cp && cp <= 0xAADD) return true;\n  if (0xAAE0 <= cp && cp <= 0xAAEF) return true;\n  if (0xAAF2 <= cp && cp <= 0xAAF6) return true;\n  if (0xAB01 <= cp && cp <= 0xAB06) return true;\n  if (0xAB09 <= cp && cp <= 0xAB0E) return true;\n  if (0xAB11 <= cp && cp <= 0xAB16) return true;\n  if (0xAB20 <= cp && cp <= 0xAB26) return true;\n  if (0xAB28 <= cp && cp <= 0xAB2E) return true;\n  if (0xAB30 <= cp && cp <= 0xAB5A) return true;\n  if (0xAB5C <= cp && cp <= 0xAB65) return true;\n  if (0xAB70 <= cp && cp <= 0xABEA) return true;\n  if (0xABEC <= cp && cp <= 0xABED) return true;\n  if (0xABF0 <= cp && cp <= 0xABF9) return true;\n  if (0xAC00 <= cp && cp <= 0xD7A3) return true;\n  if (0xD7B0 <= cp && cp <= 0xD7C6) return true;\n  if (0xD7CB <= cp && cp <= 0xD7FB) return true;\n  if (0xF900 <= cp && cp <= 0xFA6D) return true;\n  if (0xFA70 <= cp && cp <= 0xFAD9) return true;\n  if (0xFB00 <= cp && cp <= 0xFB06) return true;\n  if (0xFB13 <= cp && cp <= 0xFB17) return true;\n  if (0xFB1D <= cp && cp <= 0xFB28) return true;\n  if (0xFB2A <= cp && cp <= 0xFB36) return true;\n  if (0xFB38 <= cp && cp <= 0xFB3C) return true;\n  if (cp === 0xFB3E) return true;\n  if (0xFB40 <= cp && cp <= 0xFB41) return true;\n  if (0xFB43 <= cp && cp <= 0xFB44) return true;\n  if (0xFB46 <= cp && cp <= 0xFBB1) return true;\n  if (0xFBD3 <= cp && cp <= 0xFD3D) return true;\n  if (0xFD50 <= cp && cp <= 0xFD8F) return true;\n  if (0xFD92 <= cp && cp <= 0xFDC7) return true;\n  if (0xFDF0 <= cp && cp <= 0xFDFB) return true;\n  if (0xFE00 <= cp && cp <= 0xFE0F) return true;\n  if (0xFE20 <= cp && cp <= 0xFE2F) return true;\n  if (0xFE33 <= cp && cp <= 0xFE34) return true;\n  if (0xFE4D <= cp && cp <= 0xFE4F) return true;\n  if (0xFE70 <= cp && cp <= 0xFE74) return true;\n  if (0xFE76 <= cp && cp <= 0xFEFC) return true;\n  if (0xFF10 <= cp && cp <= 0xFF19) return true;\n  if (0xFF21 <= cp && cp <= 0xFF3A) return true;\n  if (cp === 0xFF3F) return true;\n  if (0xFF41 <= cp && cp <= 0xFF5A) return true;\n  if (0xFF66 <= cp && cp <= 0xFFBE) return true;\n  if (0xFFC2 <= cp && cp <= 0xFFC7) return true;\n  if (0xFFCA <= cp && cp <= 0xFFCF) return true;\n  if (0xFFD2 <= cp && cp <= 0xFFD7) return true;\n  if (0xFFDA <= cp && cp <= 0xFFDC) return true;\n  if (0x10000 <= cp && cp <= 0x1000B) return true;\n  if (0x1000D <= cp && cp <= 0x10026) return true;\n  if (0x10028 <= cp && cp <= 0x1003A) return true;\n  if (0x1003C <= cp && cp <= 0x1003D) return true;\n  if (0x1003F <= cp && cp <= 0x1004D) return true;\n  if (0x10050 <= cp && cp <= 0x1005D) return true;\n  if (0x10080 <= cp && cp <= 0x100FA) return true;\n  if (0x10140 <= cp && cp <= 0x10174) return true;\n  if (cp === 0x101FD) return true;\n  if (0x10280 <= cp && cp <= 0x1029C) return true;\n  if (0x102A0 <= cp && cp <= 0x102D0) return true;\n  if (cp === 0x102E0) return true;\n  if (0x10300 <= cp && cp <= 0x1031F) return true;\n  if (0x10330 <= cp && cp <= 0x1034A) return true;\n  if (0x10350 <= cp && cp <= 0x1037A) return true;\n  if (0x10380 <= cp && cp <= 0x1039D) return true;\n  if (0x103A0 <= cp && cp <= 0x103C3) return true;\n  if (0x103C8 <= cp && cp <= 0x103CF) return true;\n  if (0x103D1 <= cp && cp <= 0x103D5) return true;\n  if (0x10400 <= cp && cp <= 0x1049D) return true;\n  if (0x104A0 <= cp && cp <= 0x104A9) return true;\n  if (0x10500 <= cp && cp <= 0x10527) return true;\n  if (0x10530 <= cp && cp <= 0x10563) return true;\n  if (0x10600 <= cp && cp <= 0x10736) return true;\n  if (0x10740 <= cp && cp <= 0x10755) return true;\n  if (0x10760 <= cp && cp <= 0x10767) return true;\n  if (0x10800 <= cp && cp <= 0x10805) return true;\n  if (cp === 0x10808) return true;\n  if (0x1080A <= cp && cp <= 0x10835) return true;\n  if (0x10837 <= cp && cp <= 0x10838) return true;\n  if (cp === 0x1083C) return true;\n  if (0x1083F <= cp && cp <= 0x10855) return true;\n  if (0x10860 <= cp && cp <= 0x10876) return true;\n  if (0x10880 <= cp && cp <= 0x1089E) return true;\n  if (0x108E0 <= cp && cp <= 0x108F2) return true;\n  if (0x108F4 <= cp && cp <= 0x108F5) return true;\n  if (0x10900 <= cp && cp <= 0x10915) return true;\n  if (0x10920 <= cp && cp <= 0x10939) return true;\n  if (0x10980 <= cp && cp <= 0x109B7) return true;\n  if (0x109BE <= cp && cp <= 0x109BF) return true;\n  if (0x10A00 <= cp && cp <= 0x10A03) return true;\n  if (0x10A05 <= cp && cp <= 0x10A06) return true;\n  if (0x10A0C <= cp && cp <= 0x10A13) return true;\n  if (0x10A15 <= cp && cp <= 0x10A17) return true;\n  if (0x10A19 <= cp && cp <= 0x10A33) return true;\n  if (0x10A38 <= cp && cp <= 0x10A3A) return true;\n  if (cp === 0x10A3F) return true;\n  if (0x10A60 <= cp && cp <= 0x10A7C) return true;\n  if (0x10A80 <= cp && cp <= 0x10A9C) return true;\n  if (0x10AC0 <= cp && cp <= 0x10AC7) return true;\n  if (0x10AC9 <= cp && cp <= 0x10AE6) return true;\n  if (0x10B00 <= cp && cp <= 0x10B35) return true;\n  if (0x10B40 <= cp && cp <= 0x10B55) return true;\n  if (0x10B60 <= cp && cp <= 0x10B72) return true;\n  if (0x10B80 <= cp && cp <= 0x10B91) return true;\n  if (0x10C00 <= cp && cp <= 0x10C48) return true;\n  if (0x10C80 <= cp && cp <= 0x10CB2) return true;\n  if (0x10CC0 <= cp && cp <= 0x10CF2) return true;\n  if (0x11000 <= cp && cp <= 0x11046) return true;\n  if (0x11066 <= cp && cp <= 0x1106F) return true;\n  if (0x1107F <= cp && cp <= 0x110BA) return true;\n  if (0x110D0 <= cp && cp <= 0x110E8) return true;\n  if (0x110F0 <= cp && cp <= 0x110F9) return true;\n  if (0x11100 <= cp && cp <= 0x11134) return true;\n  if (0x11136 <= cp && cp <= 0x1113F) return true;\n  if (0x11150 <= cp && cp <= 0x11173) return true;\n  if (cp === 0x11176) return true;\n  if (0x11180 <= cp && cp <= 0x111C4) return true;\n  if (0x111CA <= cp && cp <= 0x111CC) return true;\n  if (0x111D0 <= cp && cp <= 0x111DA) return true;\n  if (cp === 0x111DC) return true;\n  if (0x11200 <= cp && cp <= 0x11211) return true;\n  if (0x11213 <= cp && cp <= 0x11237) return true;\n  if (0x11280 <= cp && cp <= 0x11286) return true;\n  if (cp === 0x11288) return true;\n  if (0x1128A <= cp && cp <= 0x1128D) return true;\n  if (0x1128F <= cp && cp <= 0x1129D) return true;\n  if (0x1129F <= cp && cp <= 0x112A8) return true;\n  if (0x112B0 <= cp && cp <= 0x112EA) return true;\n  if (0x112F0 <= cp && cp <= 0x112F9) return true;\n  if (0x11300 <= cp && cp <= 0x11303) return true;\n  if (0x11305 <= cp && cp <= 0x1130C) return true;\n  if (0x1130F <= cp && cp <= 0x11310) return true;\n  if (0x11313 <= cp && cp <= 0x11328) return true;\n  if (0x1132A <= cp && cp <= 0x11330) return true;\n  if (0x11332 <= cp && cp <= 0x11333) return true;\n  if (0x11335 <= cp && cp <= 0x11339) return true;\n  if (0x1133C <= cp && cp <= 0x11344) return true;\n  if (0x11347 <= cp && cp <= 0x11348) return true;\n  if (0x1134B <= cp && cp <= 0x1134D) return true;\n  if (cp === 0x11350) return true;\n  if (cp === 0x11357) return true;\n  if (0x1135D <= cp && cp <= 0x11363) return true;\n  if (0x11366 <= cp && cp <= 0x1136C) return true;\n  if (0x11370 <= cp && cp <= 0x11374) return true;\n  if (0x11480 <= cp && cp <= 0x114C5) return true;\n  if (cp === 0x114C7) return true;\n  if (0x114D0 <= cp && cp <= 0x114D9) return true;\n  if (0x11580 <= cp && cp <= 0x115B5) return true;\n  if (0x115B8 <= cp && cp <= 0x115C0) return true;\n  if (0x115D8 <= cp && cp <= 0x115DD) return true;\n  if (0x11600 <= cp && cp <= 0x11640) return true;\n  if (cp === 0x11644) return true;\n  if (0x11650 <= cp && cp <= 0x11659) return true;\n  if (0x11680 <= cp && cp <= 0x116B7) return true;\n  if (0x116C0 <= cp && cp <= 0x116C9) return true;\n  if (0x11700 <= cp && cp <= 0x11719) return true;\n  if (0x1171D <= cp && cp <= 0x1172B) return true;\n  if (0x11730 <= cp && cp <= 0x11739) return true;\n  if (0x118A0 <= cp && cp <= 0x118E9) return true;\n  if (cp === 0x118FF) return true;\n  if (0x11AC0 <= cp && cp <= 0x11AF8) return true;\n  if (0x12000 <= cp && cp <= 0x12399) return true;\n  if (0x12400 <= cp && cp <= 0x1246E) return true;\n  if (0x12480 <= cp && cp <= 0x12543) return true;\n  if (0x13000 <= cp && cp <= 0x1342E) return true;\n  if (0x14400 <= cp && cp <= 0x14646) return true;\n  if (0x16800 <= cp && cp <= 0x16A38) return true;\n  if (0x16A40 <= cp && cp <= 0x16A5E) return true;\n  if (0x16A60 <= cp && cp <= 0x16A69) return true;\n  if (0x16AD0 <= cp && cp <= 0x16AED) return true;\n  if (0x16AF0 <= cp && cp <= 0x16AF4) return true;\n  if (0x16B00 <= cp && cp <= 0x16B36) return true;\n  if (0x16B40 <= cp && cp <= 0x16B43) return true;\n  if (0x16B50 <= cp && cp <= 0x16B59) return true;\n  if (0x16B63 <= cp && cp <= 0x16B77) return true;\n  if (0x16B7D <= cp && cp <= 0x16B8F) return true;\n  if (0x16F00 <= cp && cp <= 0x16F44) return true;\n  if (0x16F50 <= cp && cp <= 0x16F7E) return true;\n  if (0x16F8F <= cp && cp <= 0x16F9F) return true;\n  if (0x1B000 <= cp && cp <= 0x1B001) return true;\n  if (0x1BC00 <= cp && cp <= 0x1BC6A) return true;\n  if (0x1BC70 <= cp && cp <= 0x1BC7C) return true;\n  if (0x1BC80 <= cp && cp <= 0x1BC88) return true;\n  if (0x1BC90 <= cp && cp <= 0x1BC99) return true;\n  if (0x1BC9D <= cp && cp <= 0x1BC9E) return true;\n  if (0x1D165 <= cp && cp <= 0x1D169) return true;\n  if (0x1D16D <= cp && cp <= 0x1D172) return true;\n  if (0x1D17B <= cp && cp <= 0x1D182) return true;\n  if (0x1D185 <= cp && cp <= 0x1D18B) return true;\n  if (0x1D1AA <= cp && cp <= 0x1D1AD) return true;\n  if (0x1D242 <= cp && cp <= 0x1D244) return true;\n  if (0x1D400 <= cp && cp <= 0x1D454) return true;\n  if (0x1D456 <= cp && cp <= 0x1D49C) return true;\n  if (0x1D49E <= cp && cp <= 0x1D49F) return true;\n  if (cp === 0x1D4A2) return true;\n  if (0x1D4A5 <= cp && cp <= 0x1D4A6) return true;\n  if (0x1D4A9 <= cp && cp <= 0x1D4AC) return true;\n  if (0x1D4AE <= cp && cp <= 0x1D4B9) return true;\n  if (cp === 0x1D4BB) return true;\n  if (0x1D4BD <= cp && cp <= 0x1D4C3) return true;\n  if (0x1D4C5 <= cp && cp <= 0x1D505) return true;\n  if (0x1D507 <= cp && cp <= 0x1D50A) return true;\n  if (0x1D50D <= cp && cp <= 0x1D514) return true;\n  if (0x1D516 <= cp && cp <= 0x1D51C) return true;\n  if (0x1D51E <= cp && cp <= 0x1D539) return true;\n  if (0x1D53B <= cp && cp <= 0x1D53E) return true;\n  if (0x1D540 <= cp && cp <= 0x1D544) return true;\n  if (cp === 0x1D546) return true;\n  if (0x1D54A <= cp && cp <= 0x1D550) return true;\n  if (0x1D552 <= cp && cp <= 0x1D6A5) return true;\n  if (0x1D6A8 <= cp && cp <= 0x1D6C0) return true;\n  if (0x1D6C2 <= cp && cp <= 0x1D6DA) return true;\n  if (0x1D6DC <= cp && cp <= 0x1D6FA) return true;\n  if (0x1D6FC <= cp && cp <= 0x1D714) return true;\n  if (0x1D716 <= cp && cp <= 0x1D734) return true;\n  if (0x1D736 <= cp && cp <= 0x1D74E) return true;\n  if (0x1D750 <= cp && cp <= 0x1D76E) return true;\n  if (0x1D770 <= cp && cp <= 0x1D788) return true;\n  if (0x1D78A <= cp && cp <= 0x1D7A8) return true;\n  if (0x1D7AA <= cp && cp <= 0x1D7C2) return true;\n  if (0x1D7C4 <= cp && cp <= 0x1D7CB) return true;\n  if (0x1D7CE <= cp && cp <= 0x1D7FF) return true;\n  if (0x1DA00 <= cp && cp <= 0x1DA36) return true;\n  if (0x1DA3B <= cp && cp <= 0x1DA6C) return true;\n  if (cp === 0x1DA75) return true;\n  if (cp === 0x1DA84) return true;\n  if (0x1DA9B <= cp && cp <= 0x1DA9F) return true;\n  if (0x1DAA1 <= cp && cp <= 0x1DAAF) return true;\n  if (0x1E800 <= cp && cp <= 0x1E8C4) return true;\n  if (0x1E8D0 <= cp && cp <= 0x1E8D6) return true;\n  if (0x1EE00 <= cp && cp <= 0x1EE03) return true;\n  if (0x1EE05 <= cp && cp <= 0x1EE1F) return true;\n  if (0x1EE21 <= cp && cp <= 0x1EE22) return true;\n  if (cp === 0x1EE24) return true;\n  if (cp === 0x1EE27) return true;\n  if (0x1EE29 <= cp && cp <= 0x1EE32) return true;\n  if (0x1EE34 <= cp && cp <= 0x1EE37) return true;\n  if (cp === 0x1EE39) return true;\n  if (cp === 0x1EE3B) return true;\n  if (cp === 0x1EE42) return true;\n  if (cp === 0x1EE47) return true;\n  if (cp === 0x1EE49) return true;\n  if (cp === 0x1EE4B) return true;\n  if (0x1EE4D <= cp && cp <= 0x1EE4F) return true;\n  if (0x1EE51 <= cp && cp <= 0x1EE52) return true;\n  if (cp === 0x1EE54) return true;\n  if (cp === 0x1EE57) return true;\n  if (cp === 0x1EE59) return true;\n  if (cp === 0x1EE5B) return true;\n  if (cp === 0x1EE5D) return true;\n  if (cp === 0x1EE5F) return true;\n  if (0x1EE61 <= cp && cp <= 0x1EE62) return true;\n  if (cp === 0x1EE64) return true;\n  if (0x1EE67 <= cp && cp <= 0x1EE6A) return true;\n  if (0x1EE6C <= cp && cp <= 0x1EE72) return true;\n  if (0x1EE74 <= cp && cp <= 0x1EE77) return true;\n  if (0x1EE79 <= cp && cp <= 0x1EE7C) return true;\n  if (cp === 0x1EE7E) return true;\n  if (0x1EE80 <= cp && cp <= 0x1EE89) return true;\n  if (0x1EE8B <= cp && cp <= 0x1EE9B) return true;\n  if (0x1EEA1 <= cp && cp <= 0x1EEA3) return true;\n  if (0x1EEA5 <= cp && cp <= 0x1EEA9) return true;\n  if (0x1EEAB <= cp && cp <= 0x1EEBB) return true;\n  if (0x20000 <= cp && cp <= 0x2A6D6) return true;\n  if (0x2A700 <= cp && cp <= 0x2B734) return true;\n  if (0x2B740 <= cp && cp <= 0x2B81D) return true;\n  if (0x2B820 <= cp && cp <= 0x2CEA1) return true;\n  if (0x2F800 <= cp && cp <= 0x2FA1D) return true;\n  if (0xE0100 <= cp && cp <= 0xE01EF) return true;\n  return false;\n}\n\n/* eslint-disable new-cap */\n\n/**\n * @ngdoc module\n * @name ngParseExt\n * @packageName angular-parse-ext\n *\n * @description\n *\n * The `ngParseExt` module provides functionality to allow Unicode characters in\n * identifiers inside AngularJS expressions.\n *\n * This module allows the usage of any identifier that follows ES6 identifier naming convention\n * to be used as an identifier in an AngularJS expression. ES6 delegates some of the identifier\n * rules definition to Unicode, this module uses ES6 and Unicode 8.0 identifiers convention.\n *\n * <div class=\"alert alert-warning\">\n * You cannot use Unicode characters for variable names in the {@link ngRepeat} or {@link ngOptions}\n * expressions (e.g. `ng-repeat=\"f in поля\"`), because even with `ngParseExt` included, these\n * special expressions are not parsed by the {@link $parse} service.\n * </div>\n */\n\n/* global angularParseExtModule: true,\n  IDS_Y,\n  IDC_Y\n*/\n\nfunction isValidIdentifierStart(ch, cp) {\n  return ch === '$' ||\n         ch === '_' ||\n         IDS_Y(cp);\n}\n\nfunction isValidIdentifierContinue(ch, cp) {\n  return ch === '$' ||\n         ch === '_' ||\n         cp === 0x200C || // <ZWNJ>\n         cp === 0x200D || // <ZWJ>\n         IDC_Y(cp);\n}\n\nangular.module('ngParseExt', [])\n  .config(['$parseProvider', function($parseProvider) {\n    $parseProvider.setIdentifierFns(isValidIdentifierStart, isValidIdentifierContinue);\n  }])\n  .info({ angularVersion: '1.7.8' });\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-resource.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar $resourceMinErr = angular.$$minErr('$resource');\n\n// Helper functions and regex to lookup a dotted path on an object\n// stopping at undefined/null.  The path must be composed of ASCII\n// identifiers (just like $parse)\nvar MEMBER_NAME_REGEX = /^(\\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;\n\nfunction isValidDottedPath(path) {\n  return (path != null && path !== '' && path !== 'hasOwnProperty' &&\n      MEMBER_NAME_REGEX.test('.' + path));\n}\n\nfunction lookupDottedPath(obj, path) {\n  if (!isValidDottedPath(path)) {\n    throw $resourceMinErr('badmember', 'Dotted member path \"@{0}\" is invalid.', path);\n  }\n  var keys = path.split('.');\n  for (var i = 0, ii = keys.length; i < ii && angular.isDefined(obj); i++) {\n    var key = keys[i];\n    obj = (obj !== null) ? obj[key] : undefined;\n  }\n  return obj;\n}\n\n/**\n * Create a shallow copy of an object and clear other fields from the destination\n */\nfunction shallowClearAndCopy(src, dst) {\n  dst = dst || {};\n\n  angular.forEach(dst, function(value, key) {\n    delete dst[key];\n  });\n\n  for (var key in src) {\n    if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n      dst[key] = src[key];\n    }\n  }\n\n  return dst;\n}\n\n/**\n * @ngdoc module\n * @name ngResource\n * @description\n *\n * The `ngResource` module provides interaction support with RESTful services\n * via the $resource service.\n *\n * See {@link ngResource.$resourceProvider} and {@link ngResource.$resource} for usage.\n */\n\n/**\n * @ngdoc provider\n * @name $resourceProvider\n *\n * @description\n *\n * Use `$resourceProvider` to change the default behavior of the {@link ngResource.$resource}\n * service.\n *\n * ## Dependencies\n * Requires the {@link ngResource } module to be installed.\n *\n */\n\n/**\n * @ngdoc service\n * @name $resource\n * @requires $http\n * @requires ng.$log\n * @requires $q\n * @requires ng.$timeout\n *\n * @description\n * A factory which creates a resource object that lets you interact with\n * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.\n *\n * The returned resource object has action methods which provide high-level behaviors without\n * the need to interact with the low level {@link ng.$http $http} service.\n *\n * Requires the {@link ngResource `ngResource`} module to be installed.\n *\n * By default, trailing slashes will be stripped from the calculated URLs,\n * which can pose problems with server backends that do not expect that\n * behavior.  This can be disabled by configuring the `$resourceProvider` like\n * this:\n *\n * ```js\n     app.config(['$resourceProvider', function($resourceProvider) {\n       // Don't strip trailing slashes from calculated URLs\n       $resourceProvider.defaults.stripTrailingSlashes = false;\n     }]);\n * ```\n *\n * @param {string} url A parameterized URL template with parameters prefixed by `:` as in\n *   `/user/:username`. If you are using a URL with a port number (e.g.\n *   `http://example.com:8080/api`), it will be respected.\n *\n *   If you are using a url with a suffix, just add the suffix, like this:\n *   `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`\n *   or even `$resource('http://example.com/resource/:resource_id.:format')`\n *   If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be\n *   collapsed down to a single `.`.  If you need this sequence to appear and not collapse then you\n *   can escape it with `/\\.`.\n *\n * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in\n *   `actions` methods. If a parameter value is a function, it will be called every time\n *   a param value needs to be obtained for a request (unless the param was overridden). The\n *   function will be passed the current data value as an argument.\n *\n *   Each key value in the parameter object is first bound to url template if present and then any\n *   excess keys are appended to the url search query after the `?`.\n *\n *   Given a template `/path/:verb` and parameter `{verb: 'greet', salutation: 'Hello'}` results in\n *   URL `/path/greet?salutation=Hello`.\n *\n *   If the parameter value is prefixed with `@`, then the value for that parameter will be\n *   extracted from the corresponding property on the `data` object (provided when calling actions\n *   with a request body).\n *   For example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of\n *   `someParam` will be `data.someProp`.\n *   Note that the parameter will be ignored, when calling a \"GET\" action method (i.e. an action\n *   method that does not accept a request body).\n *\n * @param {Object.<Object>=} actions Hash with declaration of custom actions that will be available\n *   in addition to the default set of resource actions (see below). If a custom action has the same\n *   key as a default action (e.g. `save`), then the default action will be *overwritten*, and not\n *   extended.\n *\n *   The declaration should be created in the format of {@link ng.$http#usage $http.config}:\n *\n *       {\n *         action1: {method:?, params:?, isArray:?, headers:?, ...},\n *         action2: {method:?, params:?, isArray:?, headers:?, ...},\n *         ...\n *       }\n *\n *   Where:\n *\n *   - **`action`** – {string} – The name of action. This name becomes the name of the method on\n *     your resource object.\n *   - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,\n *     `DELETE`, `JSONP`, etc).\n *   - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of\n *     the parameter value is a function, it will be called every time when a param value needs to\n *     be obtained for a request (unless the param was overridden). The function will be passed the\n *     current data value as an argument.\n *   - **`url`** – {string} – Action specific `url` override. The url templating is supported just\n *     like for the resource-level urls.\n *   - **`isArray`** – {boolean=} – If true then the returned object for this action is an array,\n *     see `returns` section.\n *   - **`transformRequest`** –\n *     `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n *     Transform function or an array of such functions. The transform function takes the http\n *     request body and headers and returns its transformed (typically serialized) version.\n *     By default, transformRequest will contain one function that checks if the request data is\n *     an object and serializes it using `angular.toJson`. To prevent this behavior, set\n *     `transformRequest` to an empty array: `transformRequest: []`\n *   - **`transformResponse`** –\n *     `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –\n *     Transform function or an array of such functions. The transform function takes the HTTP\n *     response body, headers and status and returns its transformed (typically deserialized)\n *     version.\n *     By default, transformResponse will contain one function that checks if the response looks\n *     like a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior,\n *     set `transformResponse` to an empty array: `transformResponse: []`\n *   - **`cache`** – `{boolean|Cache}` – A boolean value or object created with\n *     {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response.\n *     See {@link $http#caching $http Caching} for more information.\n *   - **`timeout`** – `{number}` – Timeout in milliseconds.<br />\n *     **Note:** In contrast to {@link ng.$http#usage $http.config}, {@link ng.$q promises} are\n *     **not** supported in `$resource`, because the same value would be used for multiple requests.\n *     If you are looking for a way to cancel requests, you should use the `cancellable` option.\n *   - **`cancellable`** – `{boolean}` – If true, the request made by a \"non-instance\" call will be\n *     cancelled (if not already completed) by calling `$cancelRequest()` on the call's return\n *     value. Calling `$cancelRequest()` for a non-cancellable or an already completed/cancelled\n *     request will have no effect.\n *   - **`withCredentials`** – `{boolean}` – Whether to set the `withCredentials` flag on the\n *     XHR object. See\n *     [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials)\n *     for more information.\n *   - **`responseType`** – `{string}` – See\n *     [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType).\n *   - **`interceptor`** – `{Object=}` – The interceptor object has four optional methods -\n *     `request`, `requestError`, `response`, and `responseError`. See\n *     {@link ng.$http#interceptors $http interceptors} for details. Note that\n *     `request`/`requestError` interceptors are applied before calling `$http`, thus before any\n *     global `$http` interceptors. Also, rejecting or throwing an error inside the `request`\n *     interceptor will result in calling the `responseError` interceptor.\n *     The resource instance or collection is available on the `resource` property of the\n *     `http response` object passed to `response`/`responseError` interceptors.\n *     Keep in mind that the associated promise will be resolved with the value returned by the\n *     response interceptors. Make sure you return an appropriate value and not the `response`\n *     object passed as input. For reference, the default `response` interceptor (which gets applied\n *     if you don't specify a custom one) returns `response.resource`.<br />\n *     See {@link ngResource.$resource#using-interceptors below} for an example of using\n *     interceptors in `$resource`.\n *   - **`hasBody`** – `{boolean}` – If true, then the request will have a body.\n *     If not specified, then only POST, PUT and PATCH requests will have a body. *\n * @param {Object} options Hash with custom settings that should extend the\n *   default `$resourceProvider` behavior.  The supported options are:\n *\n *   - **`stripTrailingSlashes`** – {boolean} – If true then the trailing\n *   slashes from any calculated URL will be stripped. (Defaults to true.)\n *   - **`cancellable`** – {boolean} – If true, the request made by a \"non-instance\" call will be\n *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return value.\n *   This can be overwritten per action. (Defaults to false.)\n *\n * @returns {Object} A resource \"class\" object with methods for the default set of resource actions\n *   optionally extended with custom `actions`. The default set contains these actions:\n *   ```js\n *   {\n *     'get':    {method: 'GET'},\n *     'save':   {method: 'POST'},\n *     'query':  {method: 'GET', isArray: true},\n *     'remove': {method: 'DELETE'},\n *     'delete': {method: 'DELETE'}\n *   }\n *   ```\n *\n *   Calling these methods invoke {@link ng.$http} with the specified http method, destination and\n *   parameters. When the data is returned from the server then the object is an instance of the\n *   resource class. The actions `save`, `remove` and `delete` are available on it as methods with\n *   the `$` prefix. This allows you to easily perform CRUD operations (create, read, update,\n *   delete) on server-side data like this:\n *   ```js\n *   var User = $resource('/user/:userId', {userId: '@id'});\n *   User.get({userId: 123}).$promise.then(function(user) {\n *     user.abc = true;\n *     user.$save();\n *   });\n *   ```\n *\n *   It is important to realize that invoking a `$resource` object method immediately returns an\n *   empty reference (object or array depending on `isArray`). Once the data is returned from the\n *   server the existing reference is populated with the actual data. This is a useful trick since\n *   usually the resource is assigned to a model which is then rendered by the view. Having an empty\n *   object results in no rendering, once the data arrives from the server then the object is\n *   populated with the data and the view automatically re-renders itself showing the new data. This\n *   means that in most cases one never has to write a callback function for the action methods.\n *\n *   The action methods on the class object or instance object can be invoked with the following\n *   parameters:\n *\n *   - \"class\" actions without a body: `Resource.action([parameters], [success], [error])`\n *   - \"class\" actions with a body: `Resource.action([parameters], postData, [success], [error])`\n *   - instance actions: `instance.$action([parameters], [success], [error])`\n *\n *\n *   When calling instance methods, the instance itself is used as the request body (if the action\n *   should have a body). By default, only actions using `POST`, `PUT` or `PATCH` have request\n *   bodies, but you can use the `hasBody` configuration option to specify whether an action\n *   should have a body or not (regardless of its HTTP method).\n *\n *\n *   Success callback is called with (value (Object|Array), responseHeaders (Function),\n *   status (number), statusText (string)) arguments, where `value` is the populated resource\n *   instance or collection object. The error callback is called with (httpResponse) argument.\n *\n *   Class actions return an empty instance (with the additional properties listed below).\n *   Instance actions return a promise for the operation.\n *\n *   The Resource instances and collections have these additional properties:\n *\n *   - `$promise`: The {@link ng.$q promise} of the original server interaction that created this\n *     instance or collection.\n *\n *     On success, the promise is resolved with the same resource instance or collection object,\n *     updated with data from server. This makes it easy to use in the\n *     {@link ngRoute.$routeProvider `resolve` section of `$routeProvider.when()`} to defer view\n *     rendering until the resource(s) are loaded.\n *\n *     On failure, the promise is rejected with the {@link ng.$http http response} object.\n *\n *     If an interceptor object was provided, the promise will instead be resolved with the value\n *     returned by the response interceptor (on success) or responceError interceptor (on failure).\n *\n *   - `$resolved`: `true` after first server interaction is completed (either with success or\n *      rejection), `false` before that. Knowing if the Resource has been resolved is useful in\n *      data-binding. If there is a response/responseError interceptor and it returns a promise,\n *      `$resolved` will wait for that too.\n *\n *   The Resource instances and collections have these additional methods:\n *\n *   - `$cancelRequest`: If there is a cancellable, pending request related to the instance or\n *      collection, calling this method will abort the request.\n *\n *   The Resource instances have these additional methods:\n *\n *   - `toJSON`: It returns a simple object without any of the extra properties added as part of\n *     the Resource API. This object can be serialized through {@link angular.toJson} safely\n *     without attaching AngularJS-specific fields. Notice that `JSON.stringify` (and\n *     `angular.toJson`) automatically use this method when serializing a Resource instance\n *     (see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON%28%29_behavior)).\n *\n * @example\n *\n * ### Basic usage\n *\n   ```js\n     // Define a CreditCard class\n     var CreditCard = $resource('/users/:userId/cards/:cardId',\n       {userId: 123, cardId: '@id'}, {\n         charge: {method: 'POST', params: {charge: true}}\n       });\n\n     // We can retrieve a collection from the server\n     var cards = CreditCard.query();\n         // GET: /users/123/cards\n         // server returns: [{id: 456, number: '1234', name: 'Smith'}]\n\n     // Wait for the request to complete\n     cards.$promise.then(function() {\n       var card = cards[0];\n\n       // Each item is an instance of CreditCard\n       expect(card instanceof CreditCard).toEqual(true);\n\n       // Non-GET methods are mapped onto the instances\n       card.name = 'J. Smith';\n       card.$save();\n           // POST: /users/123/cards/456 {id: 456, number: '1234', name: 'J. Smith'}\n           // server returns: {id: 456, number: '1234', name: 'J. Smith'}\n\n       // Our custom method is mapped as well (since it uses POST)\n       card.$charge({amount: 9.99});\n           // POST: /users/123/cards/456?amount=9.99&charge=true {id: 456, number: '1234', name: 'J. Smith'}\n     });\n\n     // We can create an instance as well\n     var newCard = new CreditCard({number: '0123'});\n     newCard.name = 'Mike Smith';\n\n     var savePromise = newCard.$save();\n         // POST: /users/123/cards {number: '0123', name: 'Mike Smith'}\n         // server returns: {id: 789, number: '0123', name: 'Mike Smith'}\n\n     savePromise.then(function() {\n       // Once the promise is resolved, the created instance\n       // is populated with the data returned by the server\n       expect(newCard.id).toEqual(789);\n     });\n   ```\n *\n * The object returned from a call to `$resource` is a resource \"class\" which has one \"static\"\n * method for each action in the definition.\n *\n * Calling these methods invokes `$http` on the `url` template with the given HTTP `method`,\n * `params` and `headers`.\n *\n * @example\n *\n * ### Accessing the response\n *\n * When the data is returned from the server then the object is an instance of the resource type and\n * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD\n * operations (create, read, update, delete) on server-side data.\n *\n   ```js\n     var User = $resource('/users/:userId', {userId: '@id'});\n     User.get({userId: 123}).$promise.then(function(user) {\n       user.abc = true;\n       user.$save();\n     });\n   ```\n *\n * It's worth noting that the success callback for `get`, `query` and other methods gets called with\n * the resource instance (populated with the data that came from the server) as well as an `$http`\n * header getter function, the HTTP status code and the response status text. So one could rewrite\n * the above example and get access to HTTP headers as follows:\n *\n   ```js\n     var User = $resource('/users/:userId', {userId: '@id'});\n     User.get({userId: 123}, function(user, getResponseHeaders) {\n       user.abc = true;\n       user.$save(function(user, putResponseHeaders) {\n         // `user` => saved `User` object\n         // `putResponseHeaders` => `$http` header getter\n       });\n     });\n   ```\n *\n * @example\n *\n * ### Creating custom actions\n *\n * In this example we create a custom method on our resource to make a PUT request:\n *\n   ```js\n      var app = angular.module('app', ['ngResource']);\n\n      // Some APIs expect a PUT request in the format URL/object/ID\n      // Here we are creating an 'update' method\n      app.factory('Notes', ['$resource', function($resource) {\n        return $resource('/notes/:id', {id: '@id'}, {\n          update: {method: 'PUT'}\n        });\n      }]);\n\n      // In our controller we get the ID from the URL using `$location`\n      app.controller('NotesCtrl', ['$location', 'Notes', function($location, Notes) {\n        // First, retrieve the corresponding `Note` object from the server\n        // (Assuming a URL of the form `.../notes?id=XYZ`)\n        var noteId = $location.search().id;\n        var note = Notes.get({id: noteId});\n\n        note.$promise.then(function() {\n          note.content = 'Hello, world!';\n\n          // Now call `update` to save the changes on the server\n          Notes.update(note);\n              // This will PUT /notes/ID with the note object as the request payload\n\n          // Since `update` is a non-GET method, it will also be available on the instance\n          // (prefixed with `$`), so we could replace the `Note.update()` call with:\n          //note.$update();\n        });\n      }]);\n   ```\n *\n * @example\n *\n * ### Cancelling requests\n *\n * If an action's configuration specifies that it is cancellable, you can cancel the request related\n * to an instance or collection (as long as it is a result of a \"non-instance\" call):\n *\n   ```js\n     // ...defining the `Hotel` resource...\n     var Hotel = $resource('/api/hotels/:id', {id: '@id'}, {\n       // Let's make the `query()` method cancellable\n       query: {method: 'get', isArray: true, cancellable: true}\n     });\n\n     // ...somewhere in the PlanVacationController...\n     ...\n     this.onDestinationChanged = function onDestinationChanged(destination) {\n       // We don't care about any pending request for hotels\n       // in a different destination any more\n       if (this.availableHotels) {\n         this.availableHotels.$cancelRequest();\n       }\n\n       // Let's query for hotels in `destination`\n       // (calls: /api/hotels?location=<destination>)\n       this.availableHotels = Hotel.query({location: destination});\n     };\n   ```\n *\n * @example\n *\n * ### Using interceptors\n *\n * You can use interceptors to transform the request or response, perform additional operations, and\n * modify the returned instance/collection. The following example, uses `request` and `response`\n * interceptors to augment the returned instance with additional info:\n *\n   ```js\n     var Thing = $resource('/api/things/:id', {id: '@id'}, {\n       save: {\n         method: 'POST',\n         interceptor: {\n           request: function(config) {\n             // Before the request is sent out, store a timestamp on the request config\n             config.requestTimestamp = Date.now();\n             return config;\n           },\n           response: function(response) {\n             // Get the instance from the response object\n             var instance = response.resource;\n\n             // Augment the instance with a custom `saveLatency` property, computed as the time\n             // between sending the request and receiving the response.\n             instance.saveLatency = Date.now() - response.config.requestTimestamp;\n\n             // Return the instance\n             return instance;\n           }\n         }\n       }\n     });\n\n     Thing.save({foo: 'bar'}).$promise.then(function(thing) {\n       console.log('That thing was saved in ' + thing.saveLatency + 'ms.');\n     });\n   ```\n *\n */\nangular.module('ngResource', ['ng']).\n  info({ angularVersion: '1.7.8' }).\n  provider('$resource', function ResourceProvider() {\n    var PROTOCOL_AND_IPV6_REGEX = /^https?:\\/\\/\\[[^\\]]*][^/]*/;\n\n    var provider = this;\n\n    /**\n     * @ngdoc property\n     * @name $resourceProvider#defaults\n     * @description\n     * Object containing default options used when creating `$resource` instances.\n     *\n     * The default values satisfy a wide range of usecases, but you may choose to overwrite any of\n     * them to further customize your instances. The available properties are:\n     *\n     * - **stripTrailingSlashes** – `{boolean}` – If true, then the trailing slashes from any\n     *   calculated URL will be stripped.<br />\n     *   (Defaults to true.)\n     * - **cancellable** – `{boolean}` – If true, the request made by a \"non-instance\" call will be\n     *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return\n     *   value. For more details, see {@link ngResource.$resource}. This can be overwritten per\n     *   resource class or action.<br />\n     *   (Defaults to false.)\n     * - **actions** - `{Object.<Object>}` - A hash with default actions declarations. Actions are\n     *   high-level methods corresponding to RESTful actions/methods on resources. An action may\n     *   specify what HTTP method to use, what URL to hit, if the return value will be a single\n     *   object or a collection (array) of objects etc. For more details, see\n     *   {@link ngResource.$resource}. The actions can also be enhanced or overwritten per resource\n     *   class.<br />\n     *   The default actions are:\n     *   ```js\n     *   {\n     *     get: {method: 'GET'},\n     *     save: {method: 'POST'},\n     *     query: {method: 'GET', isArray: true},\n     *     remove: {method: 'DELETE'},\n     *     delete: {method: 'DELETE'}\n     *   }\n     *   ```\n     *\n     * #### Example\n     *\n     * For example, you can specify a new `update` action that uses the `PUT` HTTP verb:\n     *\n     * ```js\n     *   angular.\n     *     module('myApp').\n     *     config(['$resourceProvider', function ($resourceProvider) {\n     *       $resourceProvider.defaults.actions.update = {\n     *         method: 'PUT'\n     *       };\n     *     }]);\n     * ```\n     *\n     * Or you can even overwrite the whole `actions` list and specify your own:\n     *\n     * ```js\n     *   angular.\n     *     module('myApp').\n     *     config(['$resourceProvider', function ($resourceProvider) {\n     *       $resourceProvider.defaults.actions = {\n     *         create: {method: 'POST'},\n     *         get:    {method: 'GET'},\n     *         getAll: {method: 'GET', isArray:true},\n     *         update: {method: 'PUT'},\n     *         delete: {method: 'DELETE'}\n     *       };\n     *     });\n     * ```\n     *\n     */\n    this.defaults = {\n      // Strip slashes by default\n      stripTrailingSlashes: true,\n\n      // Make non-instance requests cancellable (via `$cancelRequest()`)\n      cancellable: false,\n\n      // Default actions configuration\n      actions: {\n        'get': {method: 'GET'},\n        'save': {method: 'POST'},\n        'query': {method: 'GET', isArray: true},\n        'remove': {method: 'DELETE'},\n        'delete': {method: 'DELETE'}\n      }\n    };\n\n    this.$get = ['$http', '$log', '$q', '$timeout', function($http, $log, $q, $timeout) {\n\n      var noop = angular.noop,\n          forEach = angular.forEach,\n          extend = angular.extend,\n          copy = angular.copy,\n          isArray = angular.isArray,\n          isDefined = angular.isDefined,\n          isFunction = angular.isFunction,\n          isNumber = angular.isNumber,\n          encodeUriQuery = angular.$$encodeUriQuery,\n          encodeUriSegment = angular.$$encodeUriSegment;\n\n      function Route(template, defaults) {\n        this.template = template;\n        this.defaults = extend({}, provider.defaults, defaults);\n        this.urlParams = {};\n      }\n\n      Route.prototype = {\n        setUrlParams: function(config, params, actionUrl) {\n          var self = this,\n            url = actionUrl || self.template,\n            val,\n            encodedVal,\n            protocolAndIpv6 = '';\n\n          var urlParams = self.urlParams = Object.create(null);\n          forEach(url.split(/\\W/), function(param) {\n            if (param === 'hasOwnProperty') {\n              throw $resourceMinErr('badname', 'hasOwnProperty is not a valid parameter name.');\n            }\n            if (!(new RegExp('^\\\\d+$').test(param)) && param &&\n              (new RegExp('(^|[^\\\\\\\\]):' + param + '(\\\\W|$)').test(url))) {\n              urlParams[param] = {\n                isQueryParamValue: (new RegExp('\\\\?.*=:' + param + '(?:\\\\W|$)')).test(url)\n              };\n            }\n          });\n          url = url.replace(/\\\\:/g, ':');\n          url = url.replace(PROTOCOL_AND_IPV6_REGEX, function(match) {\n            protocolAndIpv6 = match;\n            return '';\n          });\n\n          params = params || {};\n          forEach(self.urlParams, function(paramInfo, urlParam) {\n            val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];\n            if (isDefined(val) && val !== null) {\n              if (paramInfo.isQueryParamValue) {\n                encodedVal = encodeUriQuery(val, true);\n              } else {\n                encodedVal = encodeUriSegment(val);\n              }\n              url = url.replace(new RegExp(':' + urlParam + '(\\\\W|$)', 'g'), function(match, p1) {\n                return encodedVal + p1;\n              });\n            } else {\n              url = url.replace(new RegExp('(/?):' + urlParam + '(\\\\W|$)', 'g'), function(match,\n                  leadingSlashes, tail) {\n                if (tail.charAt(0) === '/') {\n                  return tail;\n                } else {\n                  return leadingSlashes + tail;\n                }\n              });\n            }\n          });\n\n          // strip trailing slashes and set the url (unless this behavior is specifically disabled)\n          if (self.defaults.stripTrailingSlashes) {\n            url = url.replace(/\\/+$/, '') || '/';\n          }\n\n          // Collapse `/.` if found in the last URL path segment before the query.\n          // E.g. `http://url.com/id/.format?q=x` becomes `http://url.com/id.format?q=x`.\n          url = url.replace(/\\/\\.(?=\\w+($|\\?))/, '.');\n          // Replace escaped `/\\.` with `/.`.\n          // (If `\\.` comes from a param value, it will be encoded as `%5C.`.)\n          config.url = protocolAndIpv6 + url.replace(/\\/(\\\\|%5C)\\./, '/.');\n\n\n          // set params - delegate param encoding to $http\n          forEach(params, function(value, key) {\n            if (!self.urlParams[key]) {\n              config.params = config.params || {};\n              config.params[key] = value;\n            }\n          });\n        }\n      };\n\n\n      function resourceFactory(url, paramDefaults, actions, options) {\n        var route = new Route(url, options);\n\n        actions = extend({}, provider.defaults.actions, actions);\n\n        function extractParams(data, actionParams) {\n          var ids = {};\n          actionParams = extend({}, paramDefaults, actionParams);\n          forEach(actionParams, function(value, key) {\n            if (isFunction(value)) { value = value(data); }\n            ids[key] = value && value.charAt && value.charAt(0) === '@' ?\n              lookupDottedPath(data, value.substr(1)) : value;\n          });\n          return ids;\n        }\n\n        function defaultResponseInterceptor(response) {\n          return response.resource;\n        }\n\n        function Resource(value) {\n          shallowClearAndCopy(value || {}, this);\n        }\n\n        Resource.prototype.toJSON = function() {\n          var data = extend({}, this);\n          delete data.$promise;\n          delete data.$resolved;\n          delete data.$cancelRequest;\n          return data;\n        };\n\n        forEach(actions, function(action, name) {\n          var hasBody = action.hasBody === true || (action.hasBody !== false && /^(POST|PUT|PATCH)$/i.test(action.method));\n          var numericTimeout = action.timeout;\n          var cancellable = isDefined(action.cancellable) ?\n              action.cancellable : route.defaults.cancellable;\n\n          if (numericTimeout && !isNumber(numericTimeout)) {\n            $log.debug('ngResource:\\n' +\n                       '  Only numeric values are allowed as `timeout`.\\n' +\n                       '  Promises are not supported in $resource, because the same value would ' +\n                       'be used for multiple requests. If you are looking for a way to cancel ' +\n                       'requests, you should use the `cancellable` option.');\n            delete action.timeout;\n            numericTimeout = null;\n          }\n\n          Resource[name] = function(a1, a2, a3, a4) {\n            var params = {}, data, onSuccess, onError;\n\n            switch (arguments.length) {\n              case 4:\n                onError = a4;\n                onSuccess = a3;\n                // falls through\n              case 3:\n              case 2:\n                if (isFunction(a2)) {\n                  if (isFunction(a1)) {\n                    onSuccess = a1;\n                    onError = a2;\n                    break;\n                  }\n\n                  onSuccess = a2;\n                  onError = a3;\n                  // falls through\n                } else {\n                  params = a1;\n                  data = a2;\n                  onSuccess = a3;\n                  break;\n                }\n                // falls through\n              case 1:\n                if (isFunction(a1)) onSuccess = a1;\n                else if (hasBody) data = a1;\n                else params = a1;\n                break;\n              case 0: break;\n              default:\n                throw $resourceMinErr('badargs',\n                  'Expected up to 4 arguments [params, data, success, error], got {0} arguments',\n                  arguments.length);\n            }\n\n            var isInstanceCall = this instanceof Resource;\n            var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));\n            var httpConfig = {};\n            var requestInterceptor = action.interceptor && action.interceptor.request || undefined;\n            var requestErrorInterceptor = action.interceptor && action.interceptor.requestError ||\n              undefined;\n            var responseInterceptor = action.interceptor && action.interceptor.response ||\n              defaultResponseInterceptor;\n            var responseErrorInterceptor = action.interceptor && action.interceptor.responseError ||\n              $q.reject;\n            var successCallback = onSuccess ? function(val) {\n              onSuccess(val, response.headers, response.status, response.statusText);\n            } : undefined;\n            var errorCallback = onError || undefined;\n            var timeoutDeferred;\n            var numericTimeoutPromise;\n            var response;\n\n            forEach(action, function(value, key) {\n              switch (key) {\n                default:\n                  httpConfig[key] = copy(value);\n                  break;\n                case 'params':\n                case 'isArray':\n                case 'interceptor':\n                case 'cancellable':\n                  break;\n              }\n            });\n\n            if (!isInstanceCall && cancellable) {\n              timeoutDeferred = $q.defer();\n              httpConfig.timeout = timeoutDeferred.promise;\n\n              if (numericTimeout) {\n                numericTimeoutPromise = $timeout(timeoutDeferred.resolve, numericTimeout);\n              }\n            }\n\n            if (hasBody) httpConfig.data = data;\n            route.setUrlParams(httpConfig,\n              extend({}, extractParams(data, action.params || {}), params),\n              action.url);\n\n            // Start the promise chain\n            var promise = $q.\n              resolve(httpConfig).\n              then(requestInterceptor).\n              catch(requestErrorInterceptor).\n              then($http);\n\n            promise = promise.then(function(resp) {\n              var data = resp.data;\n\n              if (data) {\n                // Need to convert action.isArray to boolean in case it is undefined\n                if (isArray(data) !== (!!action.isArray)) {\n                  throw $resourceMinErr('badcfg',\n                      'Error in resource configuration for action `{0}`. Expected response to ' +\n                      'contain an {1} but got an {2} (Request: {3} {4})', name, action.isArray ? 'array' : 'object',\n                    isArray(data) ? 'array' : 'object', httpConfig.method, httpConfig.url);\n                }\n                if (action.isArray) {\n                  value.length = 0;\n                  forEach(data, function(item) {\n                    if (typeof item === 'object') {\n                      value.push(new Resource(item));\n                    } else {\n                      // Valid JSON values may be string literals, and these should not be converted\n                      // into objects. These items will not have access to the Resource prototype\n                      // methods, but unfortunately there\n                      value.push(item);\n                    }\n                  });\n                } else {\n                  var promise = value.$promise;     // Save the promise\n                  shallowClearAndCopy(data, value);\n                  value.$promise = promise;         // Restore the promise\n                }\n              }\n\n              resp.resource = value;\n              response = resp;\n              return responseInterceptor(resp);\n            }, function(rejectionOrResponse) {\n              rejectionOrResponse.resource = value;\n              response = rejectionOrResponse;\n              return responseErrorInterceptor(rejectionOrResponse);\n            });\n\n            promise = promise['finally'](function() {\n              value.$resolved = true;\n              if (!isInstanceCall && cancellable) {\n                value.$cancelRequest = noop;\n                $timeout.cancel(numericTimeoutPromise);\n                timeoutDeferred = numericTimeoutPromise = httpConfig.timeout = null;\n              }\n            });\n\n            // Run the `success`/`error` callbacks, but do not let them affect the returned promise.\n            promise.then(successCallback, errorCallback);\n\n            if (!isInstanceCall) {\n              // we are creating instance / collection\n              // - set the initial promise\n              // - return the instance / collection\n              value.$promise = promise;\n              value.$resolved = false;\n              if (cancellable) value.$cancelRequest = cancelRequest;\n\n              return value;\n            }\n\n            // instance call\n            return promise;\n\n            function cancelRequest(value) {\n              promise.catch(noop);\n              if (timeoutDeferred !== null) {\n                timeoutDeferred.resolve(value);\n              }\n            }\n          };\n\n\n          Resource.prototype['$' + name] = function(params, success, error) {\n            if (isFunction(params)) {\n              error = success; success = params; params = {};\n            }\n            var result = Resource[name].call(this, params, this, success, error);\n            return result.$promise || result;\n          };\n        });\n\n        return Resource;\n      }\n\n      return resourceFactory;\n    }];\n  });\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-route.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/* global shallowCopy: true */\n\n/**\n * Creates a shallow copy of an object, an array or a primitive.\n *\n * Assumes that there are no proto properties for objects.\n */\nfunction shallowCopy(src, dst) {\n  if (isArray(src)) {\n    dst = dst || [];\n\n    for (var i = 0, ii = src.length; i < ii; i++) {\n      dst[i] = src[i];\n    }\n  } else if (isObject(src)) {\n    dst = dst || {};\n\n    for (var key in src) {\n      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n        dst[key] = src[key];\n      }\n    }\n  }\n\n  return dst || src;\n}\n\n/* global routeToRegExp: true */\n\n/**\n * @param {string} path - The path to parse. (It is assumed to have query and hash stripped off.)\n * @param {Object} opts - Options.\n * @return {Object} - An object containing an array of path parameter names (`keys`) and a regular\n *     expression (`regexp`) that can be used to identify a matching URL and extract the path\n *     parameter values.\n *\n * @description\n * Parses the given path, extracting path parameter names and a regular expression to match URLs.\n *\n * Originally inspired by `pathRexp` in `visionmedia/express/lib/utils.js`.\n */\nfunction routeToRegExp(path, opts) {\n  var keys = [];\n\n  var pattern = path\n    .replace(/([().])/g, '\\\\$1')\n    .replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g, function(_, slash, key, option) {\n      var optional = option === '?' || option === '*?';\n      var star = option === '*' || option === '*?';\n      keys.push({name: key, optional: optional});\n      slash = slash || '';\n      return (\n        (optional ? '(?:' + slash : slash + '(?:') +\n        (star ? '(.+?)' : '([^/]+)') +\n        (optional ? '?)?' : ')')\n      );\n    })\n    .replace(/([/$*])/g, '\\\\$1');\n\n  if (opts.ignoreTrailingSlashes) {\n    pattern = pattern.replace(/\\/+$/, '') + '/*';\n  }\n\n  return {\n    keys: keys,\n    regexp: new RegExp(\n      '^' + pattern + '(?:[?#]|$)',\n      opts.caseInsensitiveMatch ? 'i' : ''\n    )\n  };\n}\n\n/* global routeToRegExp: false */\n/* global shallowCopy: false */\n\n// `isArray` and `isObject` are necessary for `shallowCopy()` (included via `src/shallowCopy.js`).\n// They are initialized inside the `$RouteProvider`, to ensure `window.angular` is available.\nvar isArray;\nvar isObject;\nvar isDefined;\nvar noop;\n\n/**\n * @ngdoc module\n * @name ngRoute\n * @description\n *\n * The `ngRoute` module provides routing and deeplinking services and directives for AngularJS apps.\n *\n * ## Example\n * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.\n *\n */\n/* global -ngRouteModule */\nvar ngRouteModule = angular.\n  module('ngRoute', []).\n  info({ angularVersion: '1.7.8' }).\n  provider('$route', $RouteProvider).\n  // Ensure `$route` will be instantiated in time to capture the initial `$locationChangeSuccess`\n  // event (unless explicitly disabled). This is necessary in case `ngView` is included in an\n  // asynchronously loaded template.\n  run(instantiateRoute);\nvar $routeMinErr = angular.$$minErr('ngRoute');\nvar isEagerInstantiationEnabled;\n\n\n/**\n * @ngdoc provider\n * @name $routeProvider\n * @this\n *\n * @description\n *\n * Used for configuring routes.\n *\n * ## Example\n * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.\n *\n * ## Dependencies\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n */\nfunction $RouteProvider() {\n  isArray = angular.isArray;\n  isObject = angular.isObject;\n  isDefined = angular.isDefined;\n  noop = angular.noop;\n\n  function inherit(parent, extra) {\n    return angular.extend(Object.create(parent), extra);\n  }\n\n  var routes = {};\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#when\n   *\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\n   *    contains redundant trailing slash or is missing one, the route will still match and the\n   *    `$location.path` will be updated to add or drop the trailing slash to exactly match the\n   *    route definition.\n   *\n   *    * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up\n   *        to the next slash are matched and stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain named groups starting with a colon and ending with a star:\n   *        e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain optional named groups with a question mark: e.g.`:name?`.\n   *\n   *    For example, routes like `/color/:color/largecode/:largecode*\\/edit` will match\n   *    `/color/brown/largecode/code/with/slashes/edit` and extract:\n   *\n   *    * `color: brown`\n   *    * `largecode: code/with/slashes`.\n   *\n   *\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\n   *    match.\n   *\n   *    Object properties:\n   *\n   *    - `controller` – `{(string|Function)=}` – Controller fn that should be associated with\n   *      newly created scope or the name of a {@link angular.Module#controller registered\n   *      controller} if passed as a string.\n   *    - `controllerAs` – `{string=}` – An identifier name for a reference to the controller.\n   *      If present, the controller will be published to scope under the `controllerAs` name.\n   *    - `template` – `{(string|Function)=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used by {@link\n   *      ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.\n   *      This property takes precedence over `templateUrl`.\n   *\n   *      If `template` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *      One of `template` or `templateUrl` is required.\n   *\n   *    - `templateUrl` – `{(string|Function)=}` – path or function that returns a path to an html\n   *      template that should be used by {@link ngRoute.directive:ngView ngView}.\n   *\n   *      If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *      One of `templateUrl` or `template` is required.\n   *\n   *    - `resolve` - `{Object.<string, Function>=}` - An optional map of dependencies which should\n   *      be injected into the controller. If any of these dependencies are promises, the router\n   *      will wait for them all to be resolved or one to be rejected before the controller is\n   *      instantiated.\n   *      If all the promises are resolved successfully, the values of the resolved promises are\n   *      injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is\n   *      fired. If any of the promises are rejected the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired.\n   *      For easier access to the resolved dependencies from the template, the `resolve` map will\n   *      be available on the scope of the route, under `$resolve` (by default) or a custom name\n   *      specified by the `resolveAs` property (see below). This can be particularly useful, when\n   *      working with {@link angular.Module#component components} as route templates.<br />\n   *      <div class=\"alert alert-warning\">\n   *        **Note:** If your scope already contains a property with this name, it will be hidden\n   *        or overwritten. Make sure, you specify an appropriate name for this property, that\n   *        does not collide with other properties on the scope.\n   *      </div>\n   *      The map object is:\n   *\n   *      - `key` – `{string}`: a name of a dependency to be injected into the controller.\n   *      - `factory` - `{string|Function}`: If `string` then it is an alias for a service.\n   *        Otherwise if function, then it is {@link auto.$injector#invoke injected}\n   *        and the return value is treated as the dependency. If the result is a promise, it is\n   *        resolved before its value is injected into the controller. Be aware that\n   *        `ngRoute.$routeParams` will still refer to the previous route within these resolve\n   *        functions.  Use `$route.current.params` to access the new route parameters, instead.\n   *\n   *    - `resolveAs` - `{string=}` - The name under which the `resolve` map will be available on\n   *      the scope of the route. If omitted, defaults to `$resolve`.\n   *\n   *    - `redirectTo` – `{(string|Function)=}` – value to update\n   *      {@link ng.$location $location} path with and trigger route redirection.\n   *\n   *      If `redirectTo` is a function, it will be called with the following parameters:\n   *\n   *      - `{Object.<string>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route templateUrl.\n   *      - `{string}` - current `$location.path()`\n   *      - `{Object}` - current `$location.search()`\n   *\n   *      The custom `redirectTo` function is expected to return a string which will be used\n   *      to update `$location.url()`. If the function throws an error, no further processing will\n   *      take place and the {@link ngRoute.$route#$routeChangeError $routeChangeError} event will\n   *      be fired.\n   *\n   *      Routes that specify `redirectTo` will not have their controllers, template functions\n   *      or resolves called, the `$location` will be changed to the redirect url and route\n   *      processing will stop. The exception to this is if the `redirectTo` is a function that\n   *      returns `undefined`. In this case the route transition occurs as though there was no\n   *      redirection.\n   *\n   *    - `resolveRedirectTo` – `{Function=}` – a function that will (eventually) return the value\n   *      to update {@link ng.$location $location} URL with and trigger route redirection. In\n   *      contrast to `redirectTo`, dependencies can be injected into `resolveRedirectTo` and the\n   *      return value can be either a string or a promise that will be resolved to a string.\n   *\n   *      Similar to `redirectTo`, if the return value is `undefined` (or a promise that gets\n   *      resolved to `undefined`), no redirection takes place and the route transition occurs as\n   *      though there was no redirection.\n   *\n   *      If the function throws an error or the returned promise gets rejected, no further\n   *      processing will take place and the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event will be fired.\n   *\n   *      `redirectTo` takes precedence over `resolveRedirectTo`, so specifying both on the same\n   *      route definition, will cause the latter to be ignored.\n   *\n   *    - `[reloadOnUrl=true]` - `{boolean=}` - reload route when any part of the URL changes\n   *      (including the path) even if the new URL maps to the same route.\n   *\n   *      If the option is set to `false` and the URL in the browser changes, but the new URL maps\n   *      to the same route, then a `$routeUpdate` event is broadcasted on the root scope (without\n   *      reloading the route).\n   *\n   *    - `[reloadOnSearch=true]` - `{boolean=}` - reload route when only `$location.search()`\n   *      or `$location.hash()` changes.\n   *\n   *      If the option is set to `false` and the URL in the browser changes, then a `$routeUpdate`\n   *      event is broadcasted on the root scope (without reloading the route).\n   *\n   *      <div class=\"alert alert-warning\">\n   *        **Note:** This option has no effect if `reloadOnUrl` is set to `false`.\n   *      </div>\n   *\n   *    - `[caseInsensitiveMatch=false]` - `{boolean=}` - match routes without being case sensitive\n   *\n   *      If the option is set to `true`, then the particular route can be matched without being\n   *      case sensitive\n   *\n   * @returns {Object} self\n   *\n   * @description\n   * Adds a new route definition to the `$route` service.\n   */\n  this.when = function(path, route) {\n    //copy original route object to preserve params inherited from proto chain\n    var routeCopy = shallowCopy(route);\n    if (angular.isUndefined(routeCopy.reloadOnUrl)) {\n      routeCopy.reloadOnUrl = true;\n    }\n    if (angular.isUndefined(routeCopy.reloadOnSearch)) {\n      routeCopy.reloadOnSearch = true;\n    }\n    if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {\n      routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;\n    }\n    routes[path] = angular.extend(\n      routeCopy,\n      {originalPath: path},\n      path && routeToRegExp(path, routeCopy)\n    );\n\n    // create redirection for trailing slashes\n    if (path) {\n      var redirectPath = (path[path.length - 1] === '/')\n            ? path.substr(0, path.length - 1)\n            : path + '/';\n\n      routes[redirectPath] = angular.extend(\n        {originalPath: path, redirectTo: path},\n        routeToRegExp(redirectPath, routeCopy)\n      );\n    }\n\n    return this;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $routeProvider#caseInsensitiveMatch\n   * @description\n   *\n   * A boolean property indicating if routes defined\n   * using this provider should be matched using a case insensitive\n   * algorithm. Defaults to `false`.\n   */\n  this.caseInsensitiveMatch = false;\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#otherwise\n   *\n   * @description\n   * Sets route definition that will be used on route change when no other route definition\n   * is matched.\n   *\n   * @param {Object|string} params Mapping information to be assigned to `$route.current`.\n   * If called with a string, the value maps to `redirectTo`.\n   * @returns {Object} self\n   */\n  this.otherwise = function(params) {\n    if (typeof params === 'string') {\n      params = {redirectTo: params};\n    }\n    this.when(null, params);\n    return this;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#eagerInstantiationEnabled\n   * @kind function\n   *\n   * @description\n   * Call this method as a setter to enable/disable eager instantiation of the\n   * {@link ngRoute.$route $route} service upon application bootstrap. You can also call it as a\n   * getter (i.e. without any arguments) to get the current value of the\n   * `eagerInstantiationEnabled` flag.\n   *\n   * Instantiating `$route` early is necessary for capturing the initial\n   * {@link ng.$location#$locationChangeStart $locationChangeStart} event and navigating to the\n   * appropriate route. Usually, `$route` is instantiated in time by the\n   * {@link ngRoute.ngView ngView} directive. Yet, in cases where `ngView` is included in an\n   * asynchronously loaded template (e.g. in another directive's template), the directive factory\n   * might not be called soon enough for `$route` to be instantiated _before_ the initial\n   * `$locationChangeSuccess` event is fired. Eager instantiation ensures that `$route` is always\n   * instantiated in time, regardless of when `ngView` will be loaded.\n   *\n   * The default value is true.\n   *\n   * **Note**:<br />\n   * You may want to disable the default behavior when unit-testing modules that depend on\n   * `ngRoute`, in order to avoid an unexpected request for the default route's template.\n   *\n   * @param {boolean=} enabled - If provided, update the internal `eagerInstantiationEnabled` flag.\n   *\n   * @returns {*} The current value of the `eagerInstantiationEnabled` flag if used as a getter or\n   *     itself (for chaining) if used as a setter.\n   */\n  isEagerInstantiationEnabled = true;\n  this.eagerInstantiationEnabled = function eagerInstantiationEnabled(enabled) {\n    if (isDefined(enabled)) {\n      isEagerInstantiationEnabled = enabled;\n      return this;\n    }\n\n    return isEagerInstantiationEnabled;\n  };\n\n\n  this.$get = ['$rootScope',\n               '$location',\n               '$routeParams',\n               '$q',\n               '$injector',\n               '$templateRequest',\n               '$sce',\n               '$browser',\n      function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce, $browser) {\n\n    /**\n     * @ngdoc service\n     * @name $route\n     * @requires $location\n     * @requires $routeParams\n     *\n     * @property {Object} current Reference to the current route definition.\n     * The route definition contains:\n     *\n     *   - `controller`: The controller constructor as defined in the route definition.\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\n     *     controller instantiation. The `locals` contain\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\n     *\n     *     - `$scope` - The current route scope.\n     *     - `$template` - The current route template HTML.\n     *\n     *     The `locals` will be assigned to the route scope's `$resolve` property. You can override\n     *     the property name, using `resolveAs` in the route definition. See\n     *     {@link ngRoute.$routeProvider $routeProvider} for more info.\n     *\n     * @property {Object} routes Object with all route configuration Objects as its properties.\n     *\n     * @description\n     * `$route` is used for deep-linking URLs to controllers and views (HTML partials).\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\n     *\n     * Requires the {@link ngRoute `ngRoute`} module to be installed.\n     *\n     * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.\n     *\n     * The `$route` service is typically used in conjunction with the\n     * {@link ngRoute.directive:ngView `ngView`} directive and the\n     * {@link ngRoute.$routeParams `$routeParams`} service.\n     *\n     * @example\n     * This example shows how changing the URL hash causes the `$route` to match a route against the\n     * URL, and the `ngView` pulls in the partial.\n     *\n     * <example name=\"$route-service\" module=\"ngRouteExample\"\n     *          deps=\"angular-route.js\" fixBase=\"true\">\n     *   <file name=\"index.html\">\n     *     <div ng-controller=\"MainController\">\n     *       Choose:\n     *       <a href=\"Book/Moby\">Moby</a> |\n     *       <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n     *       <a href=\"Book/Gatsby\">Gatsby</a> |\n     *       <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n     *       <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n     *\n     *       <div ng-view></div>\n     *\n     *       <hr />\n     *\n     *       <pre>$location.path() = {{$location.path()}}</pre>\n     *       <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\n     *       <pre>$route.current.params = {{$route.current.params}}</pre>\n     *       <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\n     *       <pre>$routeParams = {{$routeParams}}</pre>\n     *     </div>\n     *   </file>\n     *\n     *   <file name=\"book.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *   </file>\n     *\n     *   <file name=\"chapter.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *     Chapter Id: {{params.chapterId}}\n     *   </file>\n     *\n     *   <file name=\"script.js\">\n     *     angular.module('ngRouteExample', ['ngRoute'])\n     *\n     *      .controller('MainController', function($scope, $route, $routeParams, $location) {\n     *          $scope.$route = $route;\n     *          $scope.$location = $location;\n     *          $scope.$routeParams = $routeParams;\n     *      })\n     *\n     *      .controller('BookController', function($scope, $routeParams) {\n     *          $scope.name = 'BookController';\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *      .controller('ChapterController', function($scope, $routeParams) {\n     *          $scope.name = 'ChapterController';\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *     .config(function($routeProvider, $locationProvider) {\n     *       $routeProvider\n     *        .when('/Book/:bookId', {\n     *         templateUrl: 'book.html',\n     *         controller: 'BookController',\n     *         resolve: {\n     *           // I will cause a 1 second delay\n     *           delay: function($q, $timeout) {\n     *             var delay = $q.defer();\n     *             $timeout(delay.resolve, 1000);\n     *             return delay.promise;\n     *           }\n     *         }\n     *       })\n     *       .when('/Book/:bookId/ch/:chapterId', {\n     *         templateUrl: 'chapter.html',\n     *         controller: 'ChapterController'\n     *       });\n     *\n     *       // configure html5 to get links working on jsfiddle\n     *       $locationProvider.html5Mode(true);\n     *     });\n     *\n     *   </file>\n     *\n     *   <file name=\"protractor.js\" type=\"protractor\">\n     *     it('should load and compile correct template', function() {\n     *       element(by.linkText('Moby: Ch1')).click();\n     *       var content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller: ChapterController/);\n     *       expect(content).toMatch(/Book Id: Moby/);\n     *       expect(content).toMatch(/Chapter Id: 1/);\n     *\n     *       element(by.partialLinkText('Scarlet')).click();\n     *\n     *       content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller: BookController/);\n     *       expect(content).toMatch(/Book Id: Scarlet/);\n     *     });\n     *   </file>\n     * </example>\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeStart\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted before a route change. At this  point the route services starts\n     * resolving all of the dependencies needed for the route change to occur.\n     * Typically this involves fetching the view template as well as any dependencies\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\n     * `$routeChangeSuccess` is fired.\n     *\n     * The route change (and the `$location` change that triggered it) can be prevented\n     * by calling `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on}\n     * for more details about event object.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} next Future route information.\n     * @param {Route} current Current route information.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeSuccess\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted after a route change has happened successfully.\n     * The `resolve` dependencies are now available in the `current.locals` property.\n     *\n     * {@link ngRoute.directive:ngView ngView} listens for the directive\n     * to instantiate the controller and render the view.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} current Current route information.\n     * @param {Route|Undefined} previous Previous route information, or undefined if current is\n     * first route entered.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeError\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if a redirection function fails or any redirection or resolve promises are\n     * rejected.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current route information.\n     * @param {Route} previous Previous route information.\n     * @param {Route} rejection The thrown error or the rejection reason of the promise. Usually\n     * the rejection reason is the error that caused the promise to get rejected.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeUpdate\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if the same instance of a route (including template, controller instance,\n     * resolved dependencies, etc.) is being reused. This can happen if either `reloadOnSearch` or\n     * `reloadOnUrl` has been set to `false`.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current/previous route information.\n     */\n\n    var forceReload = false,\n        preparedRoute,\n        preparedRouteIsUpdateOnly,\n        $route = {\n          routes: routes,\n\n          /**\n           * @ngdoc method\n           * @name $route#reload\n           *\n           * @description\n           * Causes `$route` service to reload the current route even if\n           * {@link ng.$location $location} hasn't changed.\n           *\n           * As a result of that, {@link ngRoute.directive:ngView ngView}\n           * creates new scope and reinstantiates the controller.\n           */\n          reload: function() {\n            forceReload = true;\n\n            var fakeLocationEvent = {\n              defaultPrevented: false,\n              preventDefault: function fakePreventDefault() {\n                this.defaultPrevented = true;\n                forceReload = false;\n              }\n            };\n\n            $rootScope.$evalAsync(function() {\n              prepareRoute(fakeLocationEvent);\n              if (!fakeLocationEvent.defaultPrevented) commitRoute();\n            });\n          },\n\n          /**\n           * @ngdoc method\n           * @name $route#updateParams\n           *\n           * @description\n           * Causes `$route` service to update the current URL, replacing\n           * current route parameters with those specified in `newParams`.\n           * Provided property names that match the route's path segment\n           * definitions will be interpolated into the location's path, while\n           * remaining properties will be treated as query params.\n           *\n           * @param {!Object<string, string>} newParams mapping of URL parameter names to values\n           */\n          updateParams: function(newParams) {\n            if (this.current && this.current.$$route) {\n              newParams = angular.extend({}, this.current.params, newParams);\n              $location.path(interpolate(this.current.$$route.originalPath, newParams));\n              // interpolate modifies newParams, only query params are left\n              $location.search(newParams);\n            } else {\n              throw $routeMinErr('norout', 'Tried updating route with no current route');\n            }\n          }\n        };\n\n    $rootScope.$on('$locationChangeStart', prepareRoute);\n    $rootScope.$on('$locationChangeSuccess', commitRoute);\n\n    return $route;\n\n    /////////////////////////////////////////////////////\n\n    /**\n     * @param on {string} current url\n     * @param route {Object} route regexp to match the url against\n     * @return {?Object}\n     *\n     * @description\n     * Check if the route matches the current url.\n     *\n     * Inspired by match in\n     * visionmedia/express/lib/router/router.js.\n     */\n    function switchRouteMatcher(on, route) {\n      var keys = route.keys,\n          params = {};\n\n      if (!route.regexp) return null;\n\n      var m = route.regexp.exec(on);\n      if (!m) return null;\n\n      for (var i = 1, len = m.length; i < len; ++i) {\n        var key = keys[i - 1];\n\n        var val = m[i];\n\n        if (key && val) {\n          params[key.name] = val;\n        }\n      }\n      return params;\n    }\n\n    function prepareRoute($locationEvent) {\n      var lastRoute = $route.current;\n\n      preparedRoute = parseRoute();\n      preparedRouteIsUpdateOnly = isNavigationUpdateOnly(preparedRoute, lastRoute);\n\n      if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) {\n        if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) {\n          if ($locationEvent) {\n            $locationEvent.preventDefault();\n          }\n        }\n      }\n    }\n\n    function commitRoute() {\n      var lastRoute = $route.current;\n      var nextRoute = preparedRoute;\n\n      if (preparedRouteIsUpdateOnly) {\n        lastRoute.params = nextRoute.params;\n        angular.copy(lastRoute.params, $routeParams);\n        $rootScope.$broadcast('$routeUpdate', lastRoute);\n      } else if (nextRoute || lastRoute) {\n        forceReload = false;\n        $route.current = nextRoute;\n\n        var nextRoutePromise = $q.resolve(nextRoute);\n\n        $browser.$$incOutstandingRequestCount('$route');\n\n        nextRoutePromise.\n          then(getRedirectionData).\n          then(handlePossibleRedirection).\n          then(function(keepProcessingRoute) {\n            return keepProcessingRoute && nextRoutePromise.\n              then(resolveLocals).\n              then(function(locals) {\n                // after route change\n                if (nextRoute === $route.current) {\n                  if (nextRoute) {\n                    nextRoute.locals = locals;\n                    angular.copy(nextRoute.params, $routeParams);\n                  }\n                  $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);\n                }\n              });\n          }).catch(function(error) {\n            if (nextRoute === $route.current) {\n              $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);\n            }\n          }).finally(function() {\n            // Because `commitRoute()` is called from a `$rootScope.$evalAsync` block (see\n            // `$locationWatch`), this `$$completeOutstandingRequest()` call will not cause\n            // `outstandingRequestCount` to hit zero.  This is important in case we are redirecting\n            // to a new route which also requires some asynchronous work.\n\n            $browser.$$completeOutstandingRequest(noop, '$route');\n          });\n      }\n    }\n\n    function getRedirectionData(route) {\n      var data = {\n        route: route,\n        hasRedirection: false\n      };\n\n      if (route) {\n        if (route.redirectTo) {\n          if (angular.isString(route.redirectTo)) {\n            data.path = interpolate(route.redirectTo, route.params);\n            data.search = route.params;\n            data.hasRedirection = true;\n          } else {\n            var oldPath = $location.path();\n            var oldSearch = $location.search();\n            var newUrl = route.redirectTo(route.pathParams, oldPath, oldSearch);\n\n            if (angular.isDefined(newUrl)) {\n              data.url = newUrl;\n              data.hasRedirection = true;\n            }\n          }\n        } else if (route.resolveRedirectTo) {\n          return $q.\n            resolve($injector.invoke(route.resolveRedirectTo)).\n            then(function(newUrl) {\n              if (angular.isDefined(newUrl)) {\n                data.url = newUrl;\n                data.hasRedirection = true;\n              }\n\n              return data;\n            });\n        }\n      }\n\n      return data;\n    }\n\n    function handlePossibleRedirection(data) {\n      var keepProcessingRoute = true;\n\n      if (data.route !== $route.current) {\n        keepProcessingRoute = false;\n      } else if (data.hasRedirection) {\n        var oldUrl = $location.url();\n        var newUrl = data.url;\n\n        if (newUrl) {\n          $location.\n            url(newUrl).\n            replace();\n        } else {\n          newUrl = $location.\n            path(data.path).\n            search(data.search).\n            replace().\n            url();\n        }\n\n        if (newUrl !== oldUrl) {\n          // Exit out and don't process current next value,\n          // wait for next location change from redirect\n          keepProcessingRoute = false;\n        }\n      }\n\n      return keepProcessingRoute;\n    }\n\n    function resolveLocals(route) {\n      if (route) {\n        var locals = angular.extend({}, route.resolve);\n        angular.forEach(locals, function(value, key) {\n          locals[key] = angular.isString(value) ?\n              $injector.get(value) :\n              $injector.invoke(value, null, null, key);\n        });\n        var template = getTemplateFor(route);\n        if (angular.isDefined(template)) {\n          locals['$template'] = template;\n        }\n        return $q.all(locals);\n      }\n    }\n\n    function getTemplateFor(route) {\n      var template, templateUrl;\n      if (angular.isDefined(template = route.template)) {\n        if (angular.isFunction(template)) {\n          template = template(route.params);\n        }\n      } else if (angular.isDefined(templateUrl = route.templateUrl)) {\n        if (angular.isFunction(templateUrl)) {\n          templateUrl = templateUrl(route.params);\n        }\n        if (angular.isDefined(templateUrl)) {\n          route.loadedTemplateUrl = $sce.valueOf(templateUrl);\n          template = $templateRequest(templateUrl);\n        }\n      }\n      return template;\n    }\n\n    /**\n     * @returns {Object} the current active route, by matching it against the URL\n     */\n    function parseRoute() {\n      // Match a route\n      var params, match;\n      angular.forEach(routes, function(route, path) {\n        if (!match && (params = switchRouteMatcher($location.path(), route))) {\n          match = inherit(route, {\n            params: angular.extend({}, $location.search(), params),\n            pathParams: params});\n          match.$$route = route;\n        }\n      });\n      // No route matched; fallback to \"otherwise\" route\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\n    }\n\n    /**\n     * @param {Object} newRoute - The new route configuration (as returned by `parseRoute()`).\n     * @param {Object} oldRoute - The previous route configuration (as returned by `parseRoute()`).\n     * @returns {boolean} Whether this is an \"update-only\" navigation, i.e. the URL maps to the same\n     *                    route and it can be reused (based on the config and the type of change).\n     */\n    function isNavigationUpdateOnly(newRoute, oldRoute) {\n      // IF this is not a forced reload\n      return !forceReload\n          // AND both `newRoute`/`oldRoute` are defined\n          && newRoute && oldRoute\n          // AND they map to the same Route Definition Object\n          && (newRoute.$$route === oldRoute.$$route)\n          // AND `reloadOnUrl` is disabled\n          && (!newRoute.reloadOnUrl\n              // OR `reloadOnSearch` is disabled\n              || (!newRoute.reloadOnSearch\n                  // AND both routes have the same path params\n                  && angular.equals(newRoute.pathParams, oldRoute.pathParams)\n              )\n          );\n    }\n\n    /**\n     * @returns {string} interpolation of the redirect path with the parameters\n     */\n    function interpolate(string, params) {\n      var result = [];\n      angular.forEach((string || '').split(':'), function(segment, i) {\n        if (i === 0) {\n          result.push(segment);\n        } else {\n          var segmentMatch = segment.match(/(\\w+)(?:[?*])?(.*)/);\n          var key = segmentMatch[1];\n          result.push(params[key]);\n          result.push(segmentMatch[2] || '');\n          delete params[key];\n        }\n      });\n      return result.join('');\n    }\n  }];\n}\n\ninstantiateRoute.$inject = ['$injector'];\nfunction instantiateRoute($injector) {\n  if (isEagerInstantiationEnabled) {\n    // Instantiate `$route`\n    $injector.get('$route');\n  }\n}\n\nngRouteModule.provider('$routeParams', $RouteParamsProvider);\n\n\n/**\n * @ngdoc service\n * @name $routeParams\n * @requires $route\n * @this\n *\n * @description\n * The `$routeParams` service allows you to retrieve the current set of route parameters.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * The route parameters are a combination of {@link ng.$location `$location`}'s\n * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.\n * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.\n *\n * In case of parameter name collision, `path` params take precedence over `search` params.\n *\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\n * (but its properties will likely change) even when a route change occurs.\n *\n * Note that the `$routeParams` are only updated *after* a route change completes successfully.\n * This means that you cannot rely on `$routeParams` being correct in route resolve functions.\n * Instead you can use `$route.current.params` to access the new route's parameters.\n *\n * @example\n * ```js\n *  // Given:\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\n *  // Route: /Chapter/:chapterId/Section/:sectionId\n *  //\n *  // Then\n *  $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}\n * ```\n */\nfunction $RouteParamsProvider() {\n  this.$get = function() { return {}; };\n}\n\nngRouteModule.directive('ngView', ngViewFactory);\nngRouteModule.directive('ngView', ngViewFillContentFactory);\n\n\n/**\n * @ngdoc directive\n * @name ngView\n * @restrict ECA\n *\n * @description\n * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by\n * including the rendered template of the current route into the main layout (`index.html`) file.\n * Every time the current route changes, the included view changes with it according to the\n * configuration of the `$route` service.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the new element is inserted to the DOM |\n * | {@link ng.$animate#leave leave}  | when the old element is removed from to the DOM  |\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n * @param {string=} onload Expression to evaluate whenever the view updates.\n *\n * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the view is updated.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated\n *                    as an expression yields a truthy value.\n * @example\n    <example name=\"ngView-directive\" module=\"ngViewExample\"\n             deps=\"angular-route.js;angular-animate.js\"\n             animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n        <div ng-controller=\"MainCtrl as main\">\n          Choose:\n          <a href=\"Book/Moby\">Moby</a> |\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n          <a href=\"Book/Gatsby\">Gatsby</a> |\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n\n          <div class=\"view-animate-container\">\n            <div ng-view class=\"view-animate\"></div>\n          </div>\n          <hr />\n\n          <pre>$location.path() = {{main.$location.path()}}</pre>\n          <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>\n          <pre>$route.current.params = {{main.$route.current.params}}</pre>\n          <pre>$routeParams = {{main.$routeParams}}</pre>\n        </div>\n      </file>\n\n      <file name=\"book.html\">\n        <div>\n          controller: {{book.name}}<br />\n          Book Id: {{book.params.bookId}}<br />\n        </div>\n      </file>\n\n      <file name=\"chapter.html\">\n        <div>\n          controller: {{chapter.name}}<br />\n          Book Id: {{chapter.params.bookId}}<br />\n          Chapter Id: {{chapter.params.chapterId}}\n        </div>\n      </file>\n\n      <file name=\"animations.css\">\n        .view-animate-container {\n          position:relative;\n          height:100px!important;\n          background:white;\n          border:1px solid black;\n          height:40px;\n          overflow:hidden;\n        }\n\n        .view-animate {\n          padding:10px;\n        }\n\n        .view-animate.ng-enter, .view-animate.ng-leave {\n          transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n\n          display:block;\n          width:100%;\n          border-left:1px solid black;\n\n          position:absolute;\n          top:0;\n          left:0;\n          right:0;\n          bottom:0;\n          padding:10px;\n        }\n\n        .view-animate.ng-enter {\n          left:100%;\n        }\n        .view-animate.ng-enter.ng-enter-active {\n          left:0;\n        }\n        .view-animate.ng-leave.ng-leave-active {\n          left:-100%;\n        }\n      </file>\n\n      <file name=\"script.js\">\n        angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])\n          .config(['$routeProvider', '$locationProvider',\n            function($routeProvider, $locationProvider) {\n              $routeProvider\n                .when('/Book/:bookId', {\n                  templateUrl: 'book.html',\n                  controller: 'BookCtrl',\n                  controllerAs: 'book'\n                })\n                .when('/Book/:bookId/ch/:chapterId', {\n                  templateUrl: 'chapter.html',\n                  controller: 'ChapterCtrl',\n                  controllerAs: 'chapter'\n                });\n\n              $locationProvider.html5Mode(true);\n          }])\n          .controller('MainCtrl', ['$route', '$routeParams', '$location',\n            function MainCtrl($route, $routeParams, $location) {\n              this.$route = $route;\n              this.$location = $location;\n              this.$routeParams = $routeParams;\n          }])\n          .controller('BookCtrl', ['$routeParams', function BookCtrl($routeParams) {\n            this.name = 'BookCtrl';\n            this.params = $routeParams;\n          }])\n          .controller('ChapterCtrl', ['$routeParams', function ChapterCtrl($routeParams) {\n            this.name = 'ChapterCtrl';\n            this.params = $routeParams;\n          }]);\n\n      </file>\n\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should load and compile correct template', function() {\n          element(by.linkText('Moby: Ch1')).click();\n          var content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller: ChapterCtrl/);\n          expect(content).toMatch(/Book Id: Moby/);\n          expect(content).toMatch(/Chapter Id: 1/);\n\n          element(by.partialLinkText('Scarlet')).click();\n\n          content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller: BookCtrl/);\n          expect(content).toMatch(/Book Id: Scarlet/);\n        });\n      </file>\n    </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngView#$viewContentLoaded\n * @eventType emit on the current ngView scope\n * @description\n * Emitted every time the ngView content is reloaded.\n */\nngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];\nfunction ngViewFactory($route, $anchorScroll, $animate) {\n  return {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    link: function(scope, $element, attr, ctrl, $transclude) {\n        var currentScope,\n            currentElement,\n            previousLeaveAnimation,\n            autoScrollExp = attr.autoscroll,\n            onloadExp = attr.onload || '';\n\n        scope.$on('$routeChangeSuccess', update);\n        update();\n\n        function cleanupLastView() {\n          if (previousLeaveAnimation) {\n            $animate.cancel(previousLeaveAnimation);\n            previousLeaveAnimation = null;\n          }\n\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            previousLeaveAnimation = $animate.leave(currentElement);\n            previousLeaveAnimation.done(function(response) {\n              if (response !== false) previousLeaveAnimation = null;\n            });\n            currentElement = null;\n          }\n        }\n\n        function update() {\n          var locals = $route.current && $route.current.locals,\n              template = locals && locals.$template;\n\n          if (angular.isDefined(template)) {\n            var newScope = scope.$new();\n            var current = $route.current;\n\n            // Note: This will also link all children of ng-view that were contained in the original\n            // html. If that content contains controllers, ... they could pollute/change the scope.\n            // However, using ng-view on an element with additional content does not make sense...\n            // Note: We can't remove them in the cloneAttchFn of $transclude as that\n            // function is called before linking the content, which would apply child\n            // directives to non existing elements.\n            var clone = $transclude(newScope, function(clone) {\n              $animate.enter(clone, null, currentElement || $element).done(function onNgViewEnter(response) {\n                if (response !== false && angular.isDefined(autoScrollExp)\n                  && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                  $anchorScroll();\n                }\n              });\n              cleanupLastView();\n            });\n\n            currentElement = clone;\n            currentScope = current.scope = newScope;\n            currentScope.$emit('$viewContentLoaded');\n            currentScope.$eval(onloadExp);\n          } else {\n            cleanupLastView();\n          }\n        }\n    }\n  };\n}\n\n// This directive is called during the $transclude call of the first `ngView` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngView\n// is called.\nngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];\nfunction ngViewFillContentFactory($compile, $controller, $route) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    link: function(scope, $element) {\n      var current = $route.current,\n          locals = current.locals;\n\n      $element.html(locals.$template);\n\n      var link = $compile($element.contents());\n\n      if (current.controller) {\n        locals.$scope = scope;\n        var controller = $controller(current.controller, locals);\n        if (current.controllerAs) {\n          scope[current.controllerAs] = controller;\n        }\n        $element.data('$ngControllerController', controller);\n        $element.children().data('$ngControllerController', controller);\n      }\n      scope[current.resolveAs || '$resolve'] = locals;\n\n      link(scope);\n    }\n  };\n}\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-sanitize.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $sanitizeMinErr = angular.$$minErr('$sanitize');\nvar bind;\nvar extend;\nvar forEach;\nvar isArray;\nvar isDefined;\nvar lowercase;\nvar noop;\nvar nodeContains;\nvar htmlParser;\nvar htmlSanitizeWriter;\n\n/**\n * @ngdoc module\n * @name ngSanitize\n * @description\n *\n * The `ngSanitize` module provides functionality to sanitize HTML.\n *\n * See {@link ngSanitize.$sanitize `$sanitize`} for usage.\n */\n\n/**\n * @ngdoc service\n * @name $sanitize\n * @kind function\n *\n * @description\n *   Sanitizes an html string by stripping all potentially dangerous tokens.\n *\n *   The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are\n *   then serialized back to a properly escaped HTML string. This means that no unsafe input can make\n *   it into the returned string.\n *\n *   The whitelist for URL sanitization of attribute values is configured using the functions\n *   `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link $compileProvider}.\n *\n *   The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}.\n *\n * @param {string} html HTML input.\n * @returns {string} Sanitized HTML.\n *\n * @example\n   <example module=\"sanitizeExample\" deps=\"angular-sanitize.js\" name=\"sanitize-service\">\n   <file name=\"index.html\">\n     <script>\n         angular.module('sanitizeExample', ['ngSanitize'])\n           .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {\n             $scope.snippet =\n               '<p style=\"color:blue\">an html\\n' +\n               '<em onmouseover=\"this.textContent=\\'PWN3D!\\'\">click here</em>\\n' +\n               'snippet</p>';\n             $scope.deliberatelyTrustDangerousSnippet = function() {\n               return $sce.trustAsHtml($scope.snippet);\n             };\n           }]);\n     </script>\n     <div ng-controller=\"ExampleController\">\n        Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <td>Directive</td>\n           <td>How</td>\n           <td>Source</td>\n           <td>Rendered</td>\n         </tr>\n         <tr id=\"bind-html-with-sanitize\">\n           <td>ng-bind-html</td>\n           <td>Automatically uses $sanitize</td>\n           <td><pre>&lt;div ng-bind-html=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind-html=\"snippet\"></div></td>\n         </tr>\n         <tr id=\"bind-html-with-trust\">\n           <td>ng-bind-html</td>\n           <td>Bypass $sanitize by explicitly trusting the dangerous value</td>\n           <td>\n           <pre>&lt;div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"&gt;\n&lt;/div&gt;</pre>\n           </td>\n           <td><div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"></div></td>\n         </tr>\n         <tr id=\"bind-default\">\n           <td>ng-bind</td>\n           <td>Automatically escapes</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n       </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should sanitize the html snippet by default', function() {\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('<p>an html\\n<em>click here</em>\\nsnippet</p>');\n     });\n\n     it('should inline raw snippet if bound to a trusted value', function() {\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).\n         toBe(\"<p style=\\\"color:blue\\\">an html\\n\" +\n              \"<em onmouseover=\\\"this.textContent='PWN3D!'\\\">click here</em>\\n\" +\n              \"snippet</p>\");\n     });\n\n     it('should escape snippet without any filter', function() {\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).\n         toBe(\"&lt;p style=\\\"color:blue\\\"&gt;an html\\n\" +\n              \"&lt;em onmouseover=\\\"this.textContent='PWN3D!'\\\"&gt;click here&lt;/em&gt;\\n\" +\n              \"snippet&lt;/p&gt;\");\n     });\n\n     it('should update', function() {\n       element(by.model('snippet')).clear();\n       element(by.model('snippet')).sendKeys('new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('new <b>text</b>');\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).toBe(\n         'new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).toBe(\n         \"new &lt;b onclick=\\\"alert(1)\\\"&gt;text&lt;/b&gt;\");\n     });\n   </file>\n   </example>\n */\n\n\n/**\n * @ngdoc provider\n * @name $sanitizeProvider\n * @this\n *\n * @description\n * Creates and configures {@link $sanitize} instance.\n */\nfunction $SanitizeProvider() {\n  var hasBeenInstantiated = false;\n  var svgEnabled = false;\n\n  this.$get = ['$$sanitizeUri', function($$sanitizeUri) {\n    hasBeenInstantiated = true;\n    if (svgEnabled) {\n      extend(validElements, svgElements);\n    }\n    return function(html) {\n      var buf = [];\n      htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {\n        return !/^unsafe:/.test($$sanitizeUri(uri, isImage));\n      }));\n      return buf.join('');\n    };\n  }];\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#enableSvg\n   * @kind function\n   *\n   * @description\n   * Enables a subset of svg to be supported by the sanitizer.\n   *\n   * <div class=\"alert alert-warning\">\n   *   <p>By enabling this setting without taking other precautions, you might expose your\n   *   application to click-hijacking attacks. In these attacks, sanitized svg elements could be positioned\n   *   outside of the containing element and be rendered over other elements on the page (e.g. a login\n   *   link). Such behavior can then result in phishing incidents.</p>\n   *\n   *   <p>To protect against these, explicitly setup `overflow: hidden` css rule for all potential svg\n   *   tags within the sanitized content:</p>\n   *\n   *   <br>\n   *\n   *   <pre><code>\n   *   .rootOfTheIncludedContent svg {\n   *     overflow: hidden !important;\n   *   }\n   *   </code></pre>\n   * </div>\n   *\n   * @param {boolean=} flag Enable or disable SVG support in the sanitizer.\n   * @returns {boolean|$sanitizeProvider} Returns the currently configured value if called\n   *    without an argument or self for chaining otherwise.\n   */\n  this.enableSvg = function(enableSvg) {\n    if (isDefined(enableSvg)) {\n      svgEnabled = enableSvg;\n      return this;\n    } else {\n      return svgEnabled;\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#addValidElements\n   * @kind function\n   *\n   * @description\n   * Extends the built-in lists of valid HTML/SVG elements, i.e. elements that are considered safe\n   * and are not stripped off during sanitization. You can extend the following lists of elements:\n   *\n   * - `htmlElements`: A list of elements (tag names) to extend the current list of safe HTML\n   *   elements. HTML elements considered safe will not be removed during sanitization. All other\n   *   elements will be stripped off.\n   *\n   * - `htmlVoidElements`: This is similar to `htmlElements`, but marks the elements as\n   *   \"void elements\" (similar to HTML\n   *   [void elements](https://rawgit.com/w3c/html/html5.1-2/single-page.html#void-elements)). These\n   *   elements have no end tag and cannot have content.\n   *\n   * - `svgElements`: This is similar to `htmlElements`, but for SVG elements. This list is only\n   *   taken into account if SVG is {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for\n   *   `$sanitize`.\n   *\n   * <div class=\"alert alert-info\">\n   *   This method must be called during the {@link angular.Module#config config} phase. Once the\n   *   `$sanitize` service has been instantiated, this method has no effect.\n   * </div>\n   *\n   * <div class=\"alert alert-warning\">\n   *   Keep in mind that extending the built-in lists of elements may expose your app to XSS or\n   *   other vulnerabilities. Be very mindful of the elements you add.\n   * </div>\n   *\n   * @param {Array<String>|Object} elements - A list of valid HTML elements or an object with one or\n   *   more of the following properties:\n   *   - **htmlElements** - `{Array<String>}` - A list of elements to extend the current list of\n   *     HTML elements.\n   *   - **htmlVoidElements** - `{Array<String>}` - A list of elements to extend the current list of\n   *     void HTML elements; i.e. elements that do not have an end tag.\n   *   - **svgElements** - `{Array<String>}` - A list of elements to extend the current list of SVG\n   *     elements. The list of SVG elements is only taken into account if SVG is\n   *     {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for `$sanitize`.\n   *\n   * Passing an array (`[...]`) is equivalent to passing `{htmlElements: [...]}`.\n   *\n   * @return {$sanitizeProvider} Returns self for chaining.\n   */\n  this.addValidElements = function(elements) {\n    if (!hasBeenInstantiated) {\n      if (isArray(elements)) {\n        elements = {htmlElements: elements};\n      }\n\n      addElementsTo(svgElements, elements.svgElements);\n      addElementsTo(voidElements, elements.htmlVoidElements);\n      addElementsTo(validElements, elements.htmlVoidElements);\n      addElementsTo(validElements, elements.htmlElements);\n    }\n\n    return this;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#addValidAttrs\n   * @kind function\n   *\n   * @description\n   * Extends the built-in list of valid attributes, i.e. attributes that are considered safe and are\n   * not stripped off during sanitization.\n   *\n   * **Note**:\n   * The new attributes will not be treated as URI attributes, which means their values will not be\n   * sanitized as URIs using `$compileProvider`'s\n   * {@link ng.$compileProvider#aHrefSanitizationWhitelist aHrefSanitizationWhitelist} and\n   * {@link ng.$compileProvider#imgSrcSanitizationWhitelist imgSrcSanitizationWhitelist}.\n   *\n   * <div class=\"alert alert-info\">\n   *   This method must be called during the {@link angular.Module#config config} phase. Once the\n   *   `$sanitize` service has been instantiated, this method has no effect.\n   * </div>\n   *\n   * <div class=\"alert alert-warning\">\n   *   Keep in mind that extending the built-in list of attributes may expose your app to XSS or\n   *   other vulnerabilities. Be very mindful of the attributes you add.\n   * </div>\n   *\n   * @param {Array<String>} attrs - A list of valid attributes.\n   *\n   * @returns {$sanitizeProvider} Returns self for chaining.\n   */\n  this.addValidAttrs = function(attrs) {\n    if (!hasBeenInstantiated) {\n      extend(validAttrs, arrayToMap(attrs, true));\n    }\n    return this;\n  };\n\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n  // Private stuff\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n\n  bind = angular.bind;\n  extend = angular.extend;\n  forEach = angular.forEach;\n  isArray = angular.isArray;\n  isDefined = angular.isDefined;\n  lowercase = angular.$$lowercase;\n  noop = angular.noop;\n\n  htmlParser = htmlParserImpl;\n  htmlSanitizeWriter = htmlSanitizeWriterImpl;\n\n  nodeContains = window.Node.prototype.contains || /** @this */ function(arg) {\n    // eslint-disable-next-line no-bitwise\n    return !!(this.compareDocumentPosition(arg) & 16);\n  };\n\n  // Regular Expressions for parsing tags and attributes\n  var SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\n    // Match everything outside of normal chars and \" (quote character)\n    NON_ALPHANUMERIC_REGEXP = /([^#-~ |!])/g;\n\n\n  // Good source of info about elements and attributes\n  // http://dev.w3.org/html5/spec/Overview.html#semantics\n  // http://simon.html5.org/html-elements\n\n  // Safe Void Elements - HTML5\n  // http://dev.w3.org/html5/spec/Overview.html#void-elements\n  var voidElements = stringToMap('area,br,col,hr,img,wbr');\n\n  // Elements that you can, intentionally, leave open (and which close themselves)\n  // http://dev.w3.org/html5/spec/Overview.html#optional-tags\n  var optionalEndTagBlockElements = stringToMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'),\n      optionalEndTagInlineElements = stringToMap('rp,rt'),\n      optionalEndTagElements = extend({},\n                                              optionalEndTagInlineElements,\n                                              optionalEndTagBlockElements);\n\n  // Safe Block Elements - HTML5\n  var blockElements = extend({}, optionalEndTagBlockElements, stringToMap('address,article,' +\n          'aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +\n          'h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul'));\n\n  // Inline Elements - HTML5\n  var inlineElements = extend({}, optionalEndTagInlineElements, stringToMap('a,abbr,acronym,b,' +\n          'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,' +\n          'samp,small,span,strike,strong,sub,sup,time,tt,u,var'));\n\n  // SVG Elements\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements\n  // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted.\n  // They can potentially allow for arbitrary javascript to be executed. See #11290\n  var svgElements = stringToMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' +\n          'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' +\n          'radialGradient,rect,stop,svg,switch,text,title,tspan');\n\n  // Blocked Elements (will be stripped)\n  var blockedElements = stringToMap('script,style');\n\n  var validElements = extend({},\n                                     voidElements,\n                                     blockElements,\n                                     inlineElements,\n                                     optionalEndTagElements);\n\n  //Attributes that have href and hence need to be sanitized\n  var uriAttrs = stringToMap('background,cite,href,longdesc,src,xlink:href,xml:base');\n\n  var htmlAttrs = stringToMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +\n      'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +\n      'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +\n      'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' +\n      'valign,value,vspace,width');\n\n  // SVG attributes (without \"id\" and \"name\" attributes)\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes\n  var svgAttrs = stringToMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +\n      'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' +\n      'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' +\n      'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' +\n      'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' +\n      'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' +\n      'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' +\n      'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' +\n      'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' +\n      'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' +\n      'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' +\n      'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' +\n      'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' +\n      'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' +\n      'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true);\n\n  var validAttrs = extend({},\n                                  uriAttrs,\n                                  svgAttrs,\n                                  htmlAttrs);\n\n  function stringToMap(str, lowercaseKeys) {\n    return arrayToMap(str.split(','), lowercaseKeys);\n  }\n\n  function arrayToMap(items, lowercaseKeys) {\n    var obj = {}, i;\n    for (i = 0; i < items.length; i++) {\n      obj[lowercaseKeys ? lowercase(items[i]) : items[i]] = true;\n    }\n    return obj;\n  }\n\n  function addElementsTo(elementsMap, newElements) {\n    if (newElements && newElements.length) {\n      extend(elementsMap, arrayToMap(newElements));\n    }\n  }\n\n  /**\n   * Create an inert document that contains the dirty HTML that needs sanitizing\n   * Depending upon browser support we use one of three strategies for doing this.\n   * Support: Safari 10.x -> XHR strategy\n   * Support: Firefox -> DomParser strategy\n   */\n  var getInertBodyElement /* function(html: string): HTMLBodyElement */ = (function(window, document) {\n    var inertDocument;\n    if (document && document.implementation) {\n      inertDocument = document.implementation.createHTMLDocument('inert');\n    } else {\n      throw $sanitizeMinErr('noinert', 'Can\\'t create an inert html document');\n    }\n    var inertBodyElement = (inertDocument.documentElement || inertDocument.getDocumentElement()).querySelector('body');\n\n    // Check for the Safari 10.1 bug - which allows JS to run inside the SVG G element\n    inertBodyElement.innerHTML = '<svg><g onload=\"this.parentNode.remove()\"></g></svg>';\n    if (!inertBodyElement.querySelector('svg')) {\n      return getInertBodyElement_XHR;\n    } else {\n      // Check for the Firefox bug - which prevents the inner img JS from being sanitized\n      inertBodyElement.innerHTML = '<svg><p><style><img src=\"</style><img src=x onerror=alert(1)//\">';\n      if (inertBodyElement.querySelector('svg img')) {\n        return getInertBodyElement_DOMParser;\n      } else {\n        return getInertBodyElement_InertDocument;\n      }\n    }\n\n    function getInertBodyElement_XHR(html) {\n      // We add this dummy element to ensure that the rest of the content is parsed as expected\n      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.\n      html = '<remove></remove>' + html;\n      try {\n        html = encodeURI(html);\n      } catch (e) {\n        return undefined;\n      }\n      var xhr = new window.XMLHttpRequest();\n      xhr.responseType = 'document';\n      xhr.open('GET', 'data:text/html;charset=utf-8,' + html, false);\n      xhr.send(null);\n      var body = xhr.response.body;\n      body.firstChild.remove();\n      return body;\n    }\n\n    function getInertBodyElement_DOMParser(html) {\n      // We add this dummy element to ensure that the rest of the content is parsed as expected\n      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.\n      html = '<remove></remove>' + html;\n      try {\n        var body = new window.DOMParser().parseFromString(html, 'text/html').body;\n        body.firstChild.remove();\n        return body;\n      } catch (e) {\n        return undefined;\n      }\n    }\n\n    function getInertBodyElement_InertDocument(html) {\n      inertBodyElement.innerHTML = html;\n\n      // Support: IE 9-11 only\n      // strip custom-namespaced attributes on IE<=11\n      if (document.documentMode) {\n        stripCustomNsAttrs(inertBodyElement);\n      }\n\n      return inertBodyElement;\n    }\n  })(window, window.document);\n\n  /**\n   * @example\n   * htmlParser(htmlString, {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * });\n   *\n   * @param {string} html string\n   * @param {object} handler\n   */\n  function htmlParserImpl(html, handler) {\n    if (html === null || html === undefined) {\n      html = '';\n    } else if (typeof html !== 'string') {\n      html = '' + html;\n    }\n\n    var inertBodyElement = getInertBodyElement(html);\n    if (!inertBodyElement) return '';\n\n    //mXSS protection\n    var mXSSAttempts = 5;\n    do {\n      if (mXSSAttempts === 0) {\n        throw $sanitizeMinErr('uinput', 'Failed to sanitize html because the input is unstable');\n      }\n      mXSSAttempts--;\n\n      // trigger mXSS if it is going to happen by reading and writing the innerHTML\n      html = inertBodyElement.innerHTML;\n      inertBodyElement = getInertBodyElement(html);\n    } while (html !== inertBodyElement.innerHTML);\n\n    var node = inertBodyElement.firstChild;\n    while (node) {\n      switch (node.nodeType) {\n        case 1: // ELEMENT_NODE\n          handler.start(node.nodeName.toLowerCase(), attrToMap(node.attributes));\n          break;\n        case 3: // TEXT NODE\n          handler.chars(node.textContent);\n          break;\n      }\n\n      var nextNode;\n      if (!(nextNode = node.firstChild)) {\n        if (node.nodeType === 1) {\n          handler.end(node.nodeName.toLowerCase());\n        }\n        nextNode = getNonDescendant('nextSibling', node);\n        if (!nextNode) {\n          while (nextNode == null) {\n            node = getNonDescendant('parentNode', node);\n            if (node === inertBodyElement) break;\n            nextNode = getNonDescendant('nextSibling', node);\n            if (node.nodeType === 1) {\n              handler.end(node.nodeName.toLowerCase());\n            }\n          }\n        }\n      }\n      node = nextNode;\n    }\n\n    while ((node = inertBodyElement.firstChild)) {\n      inertBodyElement.removeChild(node);\n    }\n  }\n\n  function attrToMap(attrs) {\n    var map = {};\n    for (var i = 0, ii = attrs.length; i < ii; i++) {\n      var attr = attrs[i];\n      map[attr.name] = attr.value;\n    }\n    return map;\n  }\n\n\n  /**\n   * Escapes all potentially dangerous characters, so that the\n   * resulting string can be safely inserted into attribute or\n   * element text.\n   * @param value\n   * @returns {string} escaped text\n   */\n  function encodeEntities(value) {\n    return value.\n      replace(/&/g, '&amp;').\n      replace(SURROGATE_PAIR_REGEXP, function(value) {\n        var hi = value.charCodeAt(0);\n        var low = value.charCodeAt(1);\n        return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n      }).\n      replace(NON_ALPHANUMERIC_REGEXP, function(value) {\n        return '&#' + value.charCodeAt(0) + ';';\n      }).\n      replace(/</g, '&lt;').\n      replace(/>/g, '&gt;');\n  }\n\n  /**\n   * create an HTML/XML writer which writes to buffer\n   * @param {Array} buf use buf.join('') to get out sanitized html string\n   * @returns {object} in the form of {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * }\n   */\n  function htmlSanitizeWriterImpl(buf, uriValidator) {\n    var ignoreCurrentElement = false;\n    var out = bind(buf, buf.push);\n    return {\n      start: function(tag, attrs) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && blockedElements[tag]) {\n          ignoreCurrentElement = tag;\n        }\n        if (!ignoreCurrentElement && validElements[tag] === true) {\n          out('<');\n          out(tag);\n          forEach(attrs, function(value, key) {\n            var lkey = lowercase(key);\n            var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');\n            if (validAttrs[lkey] === true &&\n              (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {\n              out(' ');\n              out(key);\n              out('=\"');\n              out(encodeEntities(value));\n              out('\"');\n            }\n          });\n          out('>');\n        }\n      },\n      end: function(tag) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && validElements[tag] === true && voidElements[tag] !== true) {\n          out('</');\n          out(tag);\n          out('>');\n        }\n        // eslint-disable-next-line eqeqeq\n        if (tag == ignoreCurrentElement) {\n          ignoreCurrentElement = false;\n        }\n      },\n      chars: function(chars) {\n        if (!ignoreCurrentElement) {\n          out(encodeEntities(chars));\n        }\n      }\n    };\n  }\n\n\n  /**\n   * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1' attribute to declare\n   * ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo'). This is undesirable since we don't want\n   * to allow any of these custom attributes. This method strips them all.\n   *\n   * @param node Root element to process\n   */\n  function stripCustomNsAttrs(node) {\n    while (node) {\n      if (node.nodeType === window.Node.ELEMENT_NODE) {\n        var attrs = node.attributes;\n        for (var i = 0, l = attrs.length; i < l; i++) {\n          var attrNode = attrs[i];\n          var attrName = attrNode.name.toLowerCase();\n          if (attrName === 'xmlns:ns1' || attrName.lastIndexOf('ns1:', 0) === 0) {\n            node.removeAttributeNode(attrNode);\n            i--;\n            l--;\n          }\n        }\n      }\n\n      var nextNode = node.firstChild;\n      if (nextNode) {\n        stripCustomNsAttrs(nextNode);\n      }\n\n      node = getNonDescendant('nextSibling', node);\n    }\n  }\n\n  function getNonDescendant(propName, node) {\n    // An element is clobbered if its `propName` property points to one of its descendants\n    var nextNode = node[propName];\n    if (nextNode && nodeContains.call(node, nextNode)) {\n      throw $sanitizeMinErr('elclob', 'Failed to sanitize html because the element is clobbered: {0}', node.outerHTML || node.outerText);\n    }\n    return nextNode;\n  }\n}\n\nfunction sanitizeText(chars) {\n  var buf = [];\n  var writer = htmlSanitizeWriter(buf, noop);\n  writer.chars(chars);\n  return buf.join('');\n}\n\n\n// define ngSanitize module and register $sanitize service\nangular.module('ngSanitize', [])\n  .provider('$sanitize', $SanitizeProvider)\n  .info({ angularVersion: '1.7.8' });\n\n/**\n * @ngdoc filter\n * @name linky\n * @kind function\n *\n * @description\n * Finds links in text input and turns them into html links. Supports `http/https/ftp/sftp/mailto` and\n * plain email address links.\n *\n * Requires the {@link ngSanitize `ngSanitize`} module to be installed.\n *\n * @param {string} text Input text.\n * @param {string} [target] Window (`_blank|_self|_parent|_top`) or named frame to open links in.\n * @param {object|function(url)} [attributes] Add custom attributes to the link element.\n *\n *    Can be one of:\n *\n *    - `object`: A map of attributes\n *    - `function`: Takes the url as a parameter and returns a map of attributes\n *\n *    If the map of attributes contains a value for `target`, it overrides the value of\n *    the target parameter.\n *\n *\n * @returns {string} Html-linkified and {@link $sanitize sanitized} text.\n *\n * @usage\n   <span ng-bind-html=\"linky_expression | linky\"></span>\n *\n * @example\n   <example module=\"linkyExample\" deps=\"angular-sanitize.js\" name=\"linky-filter\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n       Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <th>Filter</th>\n           <th>Source</th>\n           <th>Rendered</th>\n         </tr>\n         <tr id=\"linky-filter\">\n           <td>linky filter</td>\n           <td>\n             <pre>&lt;div ng-bind-html=\"snippet | linky\"&gt;<br>&lt;/div&gt;</pre>\n           </td>\n           <td>\n             <div ng-bind-html=\"snippet | linky\"></div>\n           </td>\n         </tr>\n         <tr id=\"linky-target\">\n          <td>linky target</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"></div>\n          </td>\n         </tr>\n         <tr id=\"linky-custom-attributes\">\n          <td>linky custom attributes</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"></div>\n          </td>\n         </tr>\n         <tr id=\"escaped-html\">\n           <td>no filter</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"script.js\">\n       angular.module('linkyExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.snippet =\n             'Pretty text with some links:\\n' +\n             'http://angularjs.org/,\\n' +\n             'mailto:us@somewhere.org,\\n' +\n             'another@somewhere.org,\\n' +\n             'and one more: ftp://127.0.0.1/.';\n           $scope.snippetWithSingleURL = 'http://angularjs.org/';\n         }]);\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should linkify the snippet with urls', function() {\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);\n       });\n\n       it('should not linkify snippet without the linky filter', function() {\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);\n       });\n\n       it('should update', function() {\n         element(by.model('snippet')).clear();\n         element(by.model('snippet')).sendKeys('new http://link.');\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('new http://link.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())\n             .toBe('new http://link.');\n       });\n\n       it('should work with the target property', function() {\n        expect(element(by.id('linky-target')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_blank'\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');\n       });\n\n       it('should optionally add custom attributes', function() {\n        expect(element(by.id('linky-custom-attributes')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-custom-attributes a')).getAttribute('rel')).toEqual('nofollow');\n       });\n     </file>\n   </example>\n */\nangular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {\n  var LINKY_URL_REGEXP =\n        /((s?ftp|https?):\\/\\/|(www\\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s.;,(){}<>\"\\u201d\\u2019]/i,\n      MAILTO_REGEXP = /^mailto:/i;\n\n  var linkyMinErr = angular.$$minErr('linky');\n  var isDefined = angular.isDefined;\n  var isFunction = angular.isFunction;\n  var isObject = angular.isObject;\n  var isString = angular.isString;\n\n  return function(text, target, attributes) {\n    if (text == null || text === '') return text;\n    if (!isString(text)) throw linkyMinErr('notstring', 'Expected string but received: {0}', text);\n\n    var attributesFn =\n      isFunction(attributes) ? attributes :\n      isObject(attributes) ? function getAttributesObject() {return attributes;} :\n      function getEmptyAttributesObject() {return {};};\n\n    var match;\n    var raw = text;\n    var html = [];\n    var url;\n    var i;\n    while ((match = raw.match(LINKY_URL_REGEXP))) {\n      // We can not end in these as they are sometimes found at the end of the sentence\n      url = match[0];\n      // if we did not match ftp/http/www/mailto then assume mailto\n      if (!match[2] && !match[4]) {\n        url = (match[3] ? 'http://' : 'mailto:') + url;\n      }\n      i = match.index;\n      addText(raw.substr(0, i));\n      addLink(url, match[0].replace(MAILTO_REGEXP, ''));\n      raw = raw.substring(i + match[0].length);\n    }\n    addText(raw);\n    return $sanitize(html.join(''));\n\n    function addText(text) {\n      if (!text) {\n        return;\n      }\n      html.push(sanitizeText(text));\n    }\n\n    function addLink(url, text) {\n      var key, linkAttributes = attributesFn(url);\n      html.push('<a ');\n\n      for (key in linkAttributes) {\n        html.push(key + '=\"' + linkAttributes[key] + '\" ');\n      }\n\n      if (isDefined(target) && !('target' in linkAttributes)) {\n        html.push('target=\"',\n                  target,\n                  '\" ');\n      }\n      html.push('href=\"',\n                url.replace(/\"/g, '&quot;'),\n                '\">');\n      addText(text);\n      html.push('</a>');\n    }\n  };\n}]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular-touch.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngTouch\n * @description\n *\n * The `ngTouch` module provides helpers for touch-enabled devices.\n * The implementation is based on jQuery Mobile touch event handling\n * ([jquerymobile.com](http://jquerymobile.com/)). *\n *\n * See {@link ngTouch.$swipe `$swipe`} for usage.\n *\n * @deprecated\n * sinceVersion=\"1.7.0\"\n * The ngTouch module with the {@link ngTouch.$swipe `$swipe`} service and\n * the {@link ngTouch.ngSwipeLeft} and {@link ngTouch.ngSwipeRight} directives are\n * deprecated. Instead, stand-alone libraries for touch handling and gesture interaction\n * should be used, for example [HammerJS](https://hammerjs.github.io/) (which is also used by\n * Angular).\n */\n\n// define ngTouch module\n/* global ngTouch */\nvar ngTouch = angular.module('ngTouch', []);\n\nngTouch.info({ angularVersion: '1.7.8' });\n\nfunction nodeName_(element) {\n  return angular.$$lowercase(element.nodeName || (element[0] && element[0].nodeName));\n}\n\n/* global ngTouch: false */\n\n    /**\n     * @ngdoc service\n     * @name $swipe\n     *\n     * @deprecated\n     * sinceVersion=\"1.7.0\"\n     *\n     * See the {@link ngTouch module} documentation for more information.\n     *\n     * @description\n     * The `$swipe` service is a service that abstracts the messier details of hold-and-drag swipe\n     * behavior, to make implementing swipe-related directives more convenient.\n     *\n     * Requires the {@link ngTouch `ngTouch`} module to be installed.\n     *\n     * `$swipe` is used by the `ngSwipeLeft` and `ngSwipeRight` directives in `ngTouch`.\n     *\n     * # Usage\n     * The `$swipe` service is an object with a single method: `bind`. `bind` takes an element\n     * which is to be watched for swipes, and an object with four handler functions. See the\n     * documentation for `bind` below.\n     */\n\nngTouch.factory('$swipe', [function() {\n  // The total distance in any direction before we make the call on swipe vs. scroll.\n  var MOVE_BUFFER_RADIUS = 10;\n\n  var POINTER_EVENTS = {\n    'mouse': {\n      start: 'mousedown',\n      move: 'mousemove',\n      end: 'mouseup'\n    },\n    'touch': {\n      start: 'touchstart',\n      move: 'touchmove',\n      end: 'touchend',\n      cancel: 'touchcancel'\n    },\n    'pointer': {\n      start: 'pointerdown',\n      move: 'pointermove',\n      end: 'pointerup',\n      cancel: 'pointercancel'\n    }\n  };\n\n  function getCoordinates(event) {\n    var originalEvent = event.originalEvent || event;\n    var touches = originalEvent.touches && originalEvent.touches.length ? originalEvent.touches : [originalEvent];\n    var e = (originalEvent.changedTouches && originalEvent.changedTouches[0]) || touches[0];\n\n    return {\n      x: e.clientX,\n      y: e.clientY\n    };\n  }\n\n  function getEvents(pointerTypes, eventType) {\n    var res = [];\n    angular.forEach(pointerTypes, function(pointerType) {\n      var eventName = POINTER_EVENTS[pointerType][eventType];\n      if (eventName) {\n        res.push(eventName);\n      }\n    });\n    return res.join(' ');\n  }\n\n  return {\n    /**\n     * @ngdoc method\n     * @name $swipe#bind\n     *\n     * @description\n     * The main method of `$swipe`. It takes an element to be watched for swipe motions, and an\n     * object containing event handlers.\n     * The pointer types that should be used can be specified via the optional\n     * third argument, which is an array of strings `'mouse'`, `'touch'` and `'pointer'`. By default,\n     * `$swipe` will listen for `mouse`, `touch` and `pointer` events.\n     *\n     * The four events are `start`, `move`, `end`, and `cancel`. `start`, `move`, and `end`\n     * receive as a parameter a coordinates object of the form `{ x: 150, y: 310 }` and the raw\n     * `event`. `cancel` receives the raw `event` as its single parameter.\n     *\n     * `start` is called on either `mousedown`, `touchstart` or `pointerdown`. After this event, `$swipe` is\n     * watching for `touchmove`, `mousemove` or `pointermove` events. These events are ignored until the total\n     * distance moved in either dimension exceeds a small threshold.\n     *\n     * Once this threshold is exceeded, either the horizontal or vertical delta is greater.\n     * - If the horizontal distance is greater, this is a swipe and `move` and `end` events follow.\n     * - If the vertical distance is greater, this is a scroll, and we let the browser take over.\n     *   A `cancel` event is sent.\n     *\n     * `move` is called on `mousemove`, `touchmove` and `pointermove` after the above logic has determined that\n     * a swipe is in progress.\n     *\n     * `end` is called when a swipe is successfully completed with a `touchend`, `mouseup` or `pointerup`.\n     *\n     * `cancel` is called either on a `touchcancel` or `pointercancel`  from the browser, or when we begin scrolling\n     * as described above.\n     *\n     */\n    bind: function(element, eventHandlers, pointerTypes) {\n      // Absolute total movement, used to control swipe vs. scroll.\n      var totalX, totalY;\n      // Coordinates of the start position.\n      var startCoords;\n      // Last event's position.\n      var lastPos;\n      // Whether a swipe is active.\n      var active = false;\n\n      pointerTypes = pointerTypes || ['mouse', 'touch', 'pointer'];\n      element.on(getEvents(pointerTypes, 'start'), function(event) {\n        startCoords = getCoordinates(event);\n        active = true;\n        totalX = 0;\n        totalY = 0;\n        lastPos = startCoords;\n        if (eventHandlers['start']) {\n          eventHandlers['start'](startCoords, event);\n        }\n      });\n      var events = getEvents(pointerTypes, 'cancel');\n      if (events) {\n        element.on(events, function(event) {\n          active = false;\n          if (eventHandlers['cancel']) {\n            eventHandlers['cancel'](event);\n          }\n        });\n      }\n\n      element.on(getEvents(pointerTypes, 'move'), function(event) {\n        if (!active) return;\n\n        // Android will send a touchcancel if it thinks we're starting to scroll.\n        // So when the total distance (+ or - or both) exceeds 10px in either direction,\n        // we either:\n        // - On totalX > totalY, we send preventDefault() and treat this as a swipe.\n        // - On totalY > totalX, we let the browser handle it as a scroll.\n\n        if (!startCoords) return;\n        var coords = getCoordinates(event);\n\n        totalX += Math.abs(coords.x - lastPos.x);\n        totalY += Math.abs(coords.y - lastPos.y);\n\n        lastPos = coords;\n\n        if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) {\n          return;\n        }\n\n        // One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll.\n        if (totalY > totalX) {\n          // Allow native scrolling to take over.\n          active = false;\n          if (eventHandlers['cancel']) {\n            eventHandlers['cancel'](event);\n          }\n          return;\n        } else {\n          // Prevent the browser from scrolling.\n          event.preventDefault();\n          if (eventHandlers['move']) {\n            eventHandlers['move'](coords, event);\n          }\n        }\n      });\n\n      element.on(getEvents(pointerTypes, 'end'), function(event) {\n        if (!active) return;\n        active = false;\n        if (eventHandlers['end']) {\n          eventHandlers['end'](getCoordinates(event), event);\n        }\n      });\n    }\n  };\n}]);\n\n/* global ngTouch: false */\n\n/**\n * @ngdoc directive\n * @name ngSwipeLeft\n *\n * @deprecated\n * sinceVersion=\"1.7.0\"\n *\n * See the {@link ngTouch module} documentation for more information.\n *\n * @description\n * Specify custom behavior when an element is swiped to the left on a touchscreen device.\n * A leftward swipe is a quick, right-to-left slide of the finger.\n * Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag\n * too.\n *\n * To disable the mouse click and drag functionality, add `ng-swipe-disable-mouse` to\n * the `ng-swipe-left` or `ng-swipe-right` DOM Element.\n *\n * Requires the {@link ngTouch `ngTouch`} module to be installed.\n *\n * @element ANY\n * @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate\n * upon left swipe. (Event object is available as `$event`)\n *\n * @example\n    <example module=\"ngSwipeLeftExample\" deps=\"angular-touch.js\" name=\"ng-swipe-left\">\n      <file name=\"index.html\">\n        <div ng-show=\"!showActions\" ng-swipe-left=\"showActions = true\">\n          Some list content, like an email in the inbox\n        </div>\n        <div ng-show=\"showActions\" ng-swipe-right=\"showActions = false\">\n          <button ng-click=\"reply()\">Reply</button>\n          <button ng-click=\"delete()\">Delete</button>\n        </div>\n      </file>\n      <file name=\"script.js\">\n        angular.module('ngSwipeLeftExample', ['ngTouch']);\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSwipeRight\n *\n * @deprecated\n * sinceVersion=\"1.7.0\"\n *\n * See the {@link ngTouch module} documentation for more information.\n *\n * @description\n * Specify custom behavior when an element is swiped to the right on a touchscreen device.\n * A rightward swipe is a quick, left-to-right slide of the finger.\n * Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag\n * too.\n *\n * Requires the {@link ngTouch `ngTouch`} module to be installed.\n *\n * @element ANY\n * @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate\n * upon right swipe. (Event object is available as `$event`)\n *\n * @example\n    <example module=\"ngSwipeRightExample\" deps=\"angular-touch.js\" name=\"ng-swipe-right\">\n      <file name=\"index.html\">\n        <div ng-show=\"!showActions\" ng-swipe-left=\"showActions = true\">\n          Some list content, like an email in the inbox\n        </div>\n        <div ng-show=\"showActions\" ng-swipe-right=\"showActions = false\">\n          <button ng-click=\"reply()\">Reply</button>\n          <button ng-click=\"delete()\">Delete</button>\n        </div>\n      </file>\n      <file name=\"script.js\">\n        angular.module('ngSwipeRightExample', ['ngTouch']);\n      </file>\n    </example>\n */\n\nfunction makeSwipeDirective(directiveName, direction, eventName) {\n  ngTouch.directive(directiveName, ['$parse', '$swipe', function($parse, $swipe) {\n    // The maximum vertical delta for a swipe should be less than 75px.\n    var MAX_VERTICAL_DISTANCE = 75;\n    // Vertical distance should not be more than a fraction of the horizontal distance.\n    var MAX_VERTICAL_RATIO = 0.3;\n    // At least a 30px lateral motion is necessary for a swipe.\n    var MIN_HORIZONTAL_DISTANCE = 30;\n\n    return function(scope, element, attr) {\n      var swipeHandler = $parse(attr[directiveName]);\n\n      var startCoords, valid;\n\n      function validSwipe(coords) {\n        // Check that it's within the coordinates.\n        // Absolute vertical distance must be within tolerances.\n        // Horizontal distance, we take the current X - the starting X.\n        // This is negative for leftward swipes and positive for rightward swipes.\n        // After multiplying by the direction (-1 for left, +1 for right), legal swipes\n        // (ie. same direction as the directive wants) will have a positive delta and\n        // illegal ones a negative delta.\n        // Therefore this delta must be positive, and larger than the minimum.\n        if (!startCoords) return false;\n        var deltaY = Math.abs(coords.y - startCoords.y);\n        var deltaX = (coords.x - startCoords.x) * direction;\n        return valid && // Short circuit for already-invalidated swipes.\n            deltaY < MAX_VERTICAL_DISTANCE &&\n            deltaX > 0 &&\n            deltaX > MIN_HORIZONTAL_DISTANCE &&\n            deltaY / deltaX < MAX_VERTICAL_RATIO;\n      }\n\n      var pointerTypes = ['touch'];\n      if (!angular.isDefined(attr['ngSwipeDisableMouse'])) {\n        pointerTypes.push('mouse');\n      }\n      $swipe.bind(element, {\n        'start': function(coords, event) {\n          startCoords = coords;\n          valid = true;\n        },\n        'cancel': function(event) {\n          valid = false;\n        },\n        'end': function(coords, event) {\n          if (validSwipe(coords)) {\n            scope.$apply(function() {\n              element.triggerHandler(eventName);\n              swipeHandler(scope, {$event: event});\n            });\n          }\n        }\n      }, pointerTypes);\n    };\n  }]);\n}\n\n// Left is negative X-coordinate, right is positive.\nmakeSwipeDirective('ngSwipeLeft', -1, 'swipeleft');\nmakeSwipeDirective('ngSwipeRight', 1, 'swiperight');\n\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/angular.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window) {'use strict';\n\n/* exported\n  minErrConfig,\n  errorHandlingConfig,\n  isValidObjectMaxDepth\n*/\n\nvar minErrConfig = {\n  objectMaxDepth: 5,\n  urlErrorParamsEnabled: true\n};\n\n/**\n * @ngdoc function\n * @name angular.errorHandlingConfig\n * @module ng\n * @kind function\n *\n * @description\n * Configure several aspects of error handling in AngularJS if used as a setter or return the\n * current configuration if used as a getter. The following options are supported:\n *\n * - **objectMaxDepth**: The maximum depth to which objects are traversed when stringified for error messages.\n *\n * Omitted or undefined options will leave the corresponding configuration values unchanged.\n *\n * @param {Object=} config - The configuration object. May only contain the options that need to be\n *     updated. Supported keys:\n *\n * * `objectMaxDepth`  **{Number}** - The max depth for stringifying objects. Setting to a\n *   non-positive or non-numeric value, removes the max depth limit.\n *   Default: 5\n *\n * * `urlErrorParamsEnabled`  **{Boolean}** - Specifies wether the generated error url will\n *   contain the parameters of the thrown error. Disabling the parameters can be useful if the\n *   generated error url is very long.\n *\n *   Default: true. When used without argument, it returns the current value.\n */\nfunction errorHandlingConfig(config) {\n  if (isObject(config)) {\n    if (isDefined(config.objectMaxDepth)) {\n      minErrConfig.objectMaxDepth = isValidObjectMaxDepth(config.objectMaxDepth) ? config.objectMaxDepth : NaN;\n    }\n    if (isDefined(config.urlErrorParamsEnabled) && isBoolean(config.urlErrorParamsEnabled)) {\n      minErrConfig.urlErrorParamsEnabled = config.urlErrorParamsEnabled;\n    }\n  } else {\n    return minErrConfig;\n  }\n}\n\n/**\n * @private\n * @param {Number} maxDepth\n * @return {boolean}\n */\nfunction isValidObjectMaxDepth(maxDepth) {\n  return isNumber(maxDepth) && maxDepth > 0;\n}\n\n\n/**\n * @description\n *\n * This object provides a utility for producing rich Error messages within\n * AngularJS. It can be called as follows:\n *\n * var exampleMinErr = minErr('example');\n * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\n *\n * The above creates an instance of minErr in the example namespace. The\n * resulting error will have a namespaced error code of example.one.  The\n * resulting error will replace {0} with the value of foo, and {1} with the\n * value of bar. The object is not restricted in the number of arguments it can\n * take.\n *\n * If fewer arguments are specified than necessary for interpolation, the extra\n * interpolation markers will be preserved in the final string.\n *\n * Since data will be parsed statically during a build step, some restrictions\n * are applied with respect to how minErr instances are created and called.\n * Instances should have names of the form namespaceMinErr for a minErr created\n * using minErr('namespace') . Error codes, namespaces and template strings\n * should all be static strings, not variables or general expressions.\n *\n * @param {string} module The namespace to use for the new minErr instance.\n * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning\n *   error from returned function, for cases when a particular type of error is useful.\n * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\n */\n\nfunction minErr(module, ErrorConstructor) {\n  ErrorConstructor = ErrorConstructor || Error;\n\n  var url = 'https://errors.angularjs.org/1.7.8/';\n  var regex = url.replace('.', '\\\\.') + '[\\\\s\\\\S]*';\n  var errRegExp = new RegExp(regex, 'g');\n\n  return function() {\n    var code = arguments[0],\n      template = arguments[1],\n      message = '[' + (module ? module + ':' : '') + code + '] ',\n      templateArgs = sliceArgs(arguments, 2).map(function(arg) {\n        return toDebugString(arg, minErrConfig.objectMaxDepth);\n      }),\n      paramPrefix, i;\n\n    // A minErr message has two parts: the message itself and the url that contains the\n    // encoded message.\n    // The message's parameters can contain other error messages which also include error urls.\n    // To prevent the messages from getting too long, we strip the error urls from the parameters.\n\n    message += template.replace(/\\{\\d+\\}/g, function(match) {\n      var index = +match.slice(1, -1);\n\n      if (index < templateArgs.length) {\n        return templateArgs[index].replace(errRegExp, '');\n      }\n\n      return match;\n    });\n\n    message += '\\n' + url + (module ? module + '/' : '') + code;\n\n    if (minErrConfig.urlErrorParamsEnabled) {\n      for (i = 0, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {\n        message += paramPrefix + 'p' + i + '=' + encodeURIComponent(templateArgs[i]);\n      }\n    }\n\n    return new ErrorConstructor(message);\n  };\n}\n\n/* We need to tell ESLint what variables are being exported */\n/* exported\n  angular,\n  msie,\n  jqLite,\n  jQuery,\n  slice,\n  splice,\n  push,\n  toString,\n  minErrConfig,\n  errorHandlingConfig,\n  isValidObjectMaxDepth,\n  ngMinErr,\n  angularModule,\n  uid,\n  REGEX_STRING_REGEXP,\n  VALIDITY_STATE_PROPERTY,\n\n  lowercase,\n  uppercase,\n  nodeName_,\n  isArrayLike,\n  forEach,\n  forEachSorted,\n  reverseParams,\n  nextUid,\n  setHashKey,\n  extend,\n  toInt,\n  inherit,\n  merge,\n  noop,\n  identity,\n  valueFn,\n  isUndefined,\n  isDefined,\n  isObject,\n  isBlankObject,\n  isString,\n  isNumber,\n  isNumberNaN,\n  isDate,\n  isError,\n  isArray,\n  isFunction,\n  isRegExp,\n  isWindow,\n  isScope,\n  isFile,\n  isFormData,\n  isBlob,\n  isBoolean,\n  isPromiseLike,\n  trim,\n  escapeForRegexp,\n  isElement,\n  makeMap,\n  includes,\n  arrayRemove,\n  copy,\n  simpleCompare,\n  equals,\n  csp,\n  jq,\n  concat,\n  sliceArgs,\n  bind,\n  toJsonReplacer,\n  toJson,\n  fromJson,\n  convertTimezoneToLocal,\n  timezoneToOffset,\n  addDateMinutes,\n  startingTag,\n  tryDecodeURIComponent,\n  parseKeyValue,\n  toKeyValue,\n  encodeUriSegment,\n  encodeUriQuery,\n  angularInit,\n  bootstrap,\n  getTestability,\n  snake_case,\n  bindJQuery,\n  assertArg,\n  assertArgFn,\n  assertNotHasOwnProperty,\n  getter,\n  getBlockNodes,\n  hasOwnProperty,\n  createMap,\n  stringify,\n\n  NODE_TYPE_ELEMENT,\n  NODE_TYPE_ATTRIBUTE,\n  NODE_TYPE_TEXT,\n  NODE_TYPE_COMMENT,\n  NODE_TYPE_DOCUMENT,\n  NODE_TYPE_DOCUMENT_FRAGMENT\n*/\n\n////////////////////////////////////\n\n/**\n * @ngdoc module\n * @name ng\n * @module ng\n * @installation\n * @description\n *\n * The ng module is loaded by default when an AngularJS application is started. The module itself\n * contains the essential components for an AngularJS application to function. The table below\n * lists a high level breakdown of each of the services/factories, filters, directives and testing\n * components available within this core module.\n *\n */\n\nvar REGEX_STRING_REGEXP = /^\\/(.+)\\/([a-z]*)$/;\n\n// The name of a form control's ValidityState property.\n// This is used so that it's possible for internal tests to create mock ValidityStates.\nvar VALIDITY_STATE_PROPERTY = 'validity';\n\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * @private\n *\n * @description Converts the specified string to lowercase.\n * @param {string} string String to be converted to lowercase.\n * @returns {string} Lowercased string.\n */\nvar lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;};\n\n/**\n * @private\n *\n * @description Converts the specified string to uppercase.\n * @param {string} string String to be converted to uppercase.\n * @returns {string} Uppercased string.\n */\nvar uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};\n\n\nvar\n    msie,             // holds major version number for IE, or NaN if UA is not IE.\n    jqLite,           // delay binding since jQuery could be loaded after us.\n    jQuery,           // delay binding\n    slice             = [].slice,\n    splice            = [].splice,\n    push              = [].push,\n    toString          = Object.prototype.toString,\n    getPrototypeOf    = Object.getPrototypeOf,\n    ngMinErr          = minErr('ng'),\n\n    /** @name angular */\n    angular           = window.angular || (window.angular = {}),\n    angularModule,\n    uid               = 0;\n\n// Support: IE 9-11 only\n/**\n * documentMode is an IE-only property\n * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx\n */\nmsie = window.document.documentMode;\n\n\n/**\n * @private\n * @param {*} obj\n * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,\n *                   String ...)\n */\nfunction isArrayLike(obj) {\n\n  // `null`, `undefined` and `window` are not array-like\n  if (obj == null || isWindow(obj)) return false;\n\n  // arrays, strings and jQuery/jqLite objects are array like\n  // * jqLite is either the jQuery or jqLite constructor function\n  // * we have to check the existence of jqLite first as this method is called\n  //   via the forEach method when constructing the jqLite object in the first place\n  if (isArray(obj) || isString(obj) || (jqLite && obj instanceof jqLite)) return true;\n\n  // Support: iOS 8.2 (not reproducible in simulator)\n  // \"length\" in obj used to prevent JIT error (gh-11508)\n  var length = 'length' in Object(obj) && obj.length;\n\n  // NodeList objects (with `item` method) and\n  // other objects with suitable length characteristics are array-like\n  return isNumber(length) && (length >= 0 && (length - 1) in obj || typeof obj.item === 'function');\n\n}\n\n/**\n * @ngdoc function\n * @name angular.forEach\n * @module ng\n * @kind function\n *\n * @description\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\n * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value`\n * is the value of an object property or an array element, `key` is the object property key or\n * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional.\n *\n * It is worth noting that `.forEach` does not iterate over inherited properties because it filters\n * using the `hasOwnProperty` method.\n *\n * Unlike ES262's\n * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18),\n * providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just\n * return the value provided.\n *\n   ```js\n     var values = {name: 'misko', gender: 'male'};\n     var log = [];\n     angular.forEach(values, function(value, key) {\n       this.push(key + ': ' + value);\n     }, log);\n     expect(log).toEqual(['name: misko', 'gender: male']);\n   ```\n *\n * @param {Object|Array} obj Object to iterate over.\n * @param {Function} iterator Iterator function.\n * @param {Object=} context Object to become context (`this`) for the iterator function.\n * @returns {Object|Array} Reference to `obj`.\n */\n\nfunction forEach(obj, iterator, context) {\n  var key, length;\n  if (obj) {\n    if (isFunction(obj)) {\n      for (key in obj) {\n        if (key !== 'prototype' && key !== 'length' && key !== 'name' && obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (isArray(obj) || isArrayLike(obj)) {\n      var isPrimitive = typeof obj !== 'object';\n      for (key = 0, length = obj.length; key < length; key++) {\n        if (isPrimitive || key in obj) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (obj.forEach && obj.forEach !== forEach) {\n        obj.forEach(iterator, context, obj);\n    } else if (isBlankObject(obj)) {\n      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty\n      for (key in obj) {\n        iterator.call(context, obj[key], key, obj);\n      }\n    } else if (typeof obj.hasOwnProperty === 'function') {\n      // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed\n      for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else {\n      // Slow path for objects which do not have a method `hasOwnProperty`\n      for (key in obj) {\n        if (hasOwnProperty.call(obj, key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    }\n  }\n  return obj;\n}\n\nfunction forEachSorted(obj, iterator, context) {\n  var keys = Object.keys(obj).sort();\n  for (var i = 0; i < keys.length; i++) {\n    iterator.call(context, obj[keys[i]], keys[i]);\n  }\n  return keys;\n}\n\n\n/**\n * when using forEach the params are value, key, but it is often useful to have key, value.\n * @param {function(string, *)} iteratorFn\n * @returns {function(*, string)}\n */\nfunction reverseParams(iteratorFn) {\n  return function(value, key) {iteratorFn(key, value);};\n}\n\n/**\n * A consistent way of creating unique IDs in angular.\n *\n * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before\n * we hit number precision issues in JavaScript.\n *\n * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M\n *\n * @returns {number} an unique alpha-numeric string\n */\nfunction nextUid() {\n  return ++uid;\n}\n\n\n/**\n * Set or clear the hashkey for an object.\n * @param obj object\n * @param h the hashkey (!truthy to delete the hashkey)\n */\nfunction setHashKey(obj, h) {\n  if (h) {\n    obj.$$hashKey = h;\n  } else {\n    delete obj.$$hashKey;\n  }\n}\n\n\nfunction baseExtend(dst, objs, deep) {\n  var h = dst.$$hashKey;\n\n  for (var i = 0, ii = objs.length; i < ii; ++i) {\n    var obj = objs[i];\n    if (!isObject(obj) && !isFunction(obj)) continue;\n    var keys = Object.keys(obj);\n    for (var j = 0, jj = keys.length; j < jj; j++) {\n      var key = keys[j];\n      var src = obj[key];\n\n      if (deep && isObject(src)) {\n        if (isDate(src)) {\n          dst[key] = new Date(src.valueOf());\n        } else if (isRegExp(src)) {\n          dst[key] = new RegExp(src);\n        } else if (src.nodeName) {\n          dst[key] = src.cloneNode(true);\n        } else if (isElement(src)) {\n          dst[key] = src.clone();\n        } else {\n          if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};\n          baseExtend(dst[key], [src], true);\n        }\n      } else {\n        dst[key] = src;\n      }\n    }\n  }\n\n  setHashKey(dst, h);\n  return dst;\n}\n\n/**\n * @ngdoc function\n * @name angular.extend\n * @module ng\n * @kind function\n *\n * @description\n * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s)\n * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so\n * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`.\n *\n * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use\n * {@link angular.merge} for this.\n *\n * @param {Object} dst Destination object.\n * @param {...Object} src Source object(s).\n * @returns {Object} Reference to `dst`.\n */\nfunction extend(dst) {\n  return baseExtend(dst, slice.call(arguments, 1), false);\n}\n\n\n/**\n* @ngdoc function\n* @name angular.merge\n* @module ng\n* @kind function\n*\n* @description\n* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s)\n* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so\n* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`.\n*\n* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source\n* objects, performing a deep copy.\n*\n* @deprecated\n* sinceVersion=\"1.6.5\"\n* This function is deprecated, but will not be removed in the 1.x lifecycle.\n* There are edge cases (see {@link angular.merge#known-issues known issues}) that are not\n* supported by this function. We suggest using another, similar library for all-purpose merging,\n* such as [lodash's merge()](https://lodash.com/docs/4.17.4#merge).\n*\n* @knownIssue\n* This is a list of (known) object types that are not handled correctly by this function:\n* - [`Blob`](https://developer.mozilla.org/docs/Web/API/Blob)\n* - [`MediaStream`](https://developer.mozilla.org/docs/Web/API/MediaStream)\n* - [`CanvasGradient`](https://developer.mozilla.org/docs/Web/API/CanvasGradient)\n* - AngularJS {@link $rootScope.Scope scopes};\n*\n* `angular.merge` also does not support merging objects with circular references.\n*\n* @param {Object} dst Destination object.\n* @param {...Object} src Source object(s).\n* @returns {Object} Reference to `dst`.\n*/\nfunction merge(dst) {\n  return baseExtend(dst, slice.call(arguments, 1), true);\n}\n\n\n\nfunction toInt(str) {\n  return parseInt(str, 10);\n}\n\nvar isNumberNaN = Number.isNaN || function isNumberNaN(num) {\n  // eslint-disable-next-line no-self-compare\n  return num !== num;\n};\n\n\nfunction inherit(parent, extra) {\n  return extend(Object.create(parent), extra);\n}\n\n/**\n * @ngdoc function\n * @name angular.noop\n * @module ng\n * @kind function\n *\n * @description\n * A function that performs no operations. This function can be useful when writing code in the\n * functional style.\n   ```js\n     function foo(callback) {\n       var result = calculateResult();\n       (callback || angular.noop)(result);\n     }\n   ```\n */\nfunction noop() {}\nnoop.$inject = [];\n\n\n/**\n * @ngdoc function\n * @name angular.identity\n * @module ng\n * @kind function\n *\n * @description\n * A function that returns its first argument. This function is useful when writing code in the\n * functional style.\n *\n   ```js\n   function transformer(transformationFn, value) {\n     return (transformationFn || angular.identity)(value);\n   };\n\n   // E.g.\n   function getResult(fn, input) {\n     return (fn || angular.identity)(input);\n   };\n\n   getResult(function(n) { return n * 2; }, 21);   // returns 42\n   getResult(null, 21);                            // returns 21\n   getResult(undefined, 21);                       // returns 21\n   ```\n *\n * @param {*} value to be returned.\n * @returns {*} the value passed in.\n */\nfunction identity($) {return $;}\nidentity.$inject = [];\n\n\nfunction valueFn(value) {return function valueRef() {return value;};}\n\nfunction hasCustomToString(obj) {\n  return isFunction(obj.toString) && obj.toString !== toString;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isUndefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is undefined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is undefined.\n */\nfunction isUndefined(value) {return typeof value === 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is defined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is defined.\n */\nfunction isDefined(value) {return typeof value !== 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isObject\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\n * considered to be objects. Note that JavaScript arrays are objects.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Object` but not `null`.\n */\nfunction isObject(value) {\n  // http://jsperf.com/isobject4\n  return value !== null && typeof value === 'object';\n}\n\n\n/**\n * Determine if a value is an object with a null prototype\n *\n * @returns {boolean} True if `value` is an `Object` with a null prototype\n */\nfunction isBlankObject(value) {\n  return value !== null && typeof value === 'object' && !getPrototypeOf(value);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isString\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `String`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `String`.\n */\nfunction isString(value) {return typeof value === 'string';}\n\n\n/**\n * @ngdoc function\n * @name angular.isNumber\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Number`.\n *\n * This includes the \"special\" numbers `NaN`, `+Infinity` and `-Infinity`.\n *\n * If you wish to exclude these then you can use the native\n * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)\n * method.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Number`.\n */\nfunction isNumber(value) {return typeof value === 'number';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDate\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a value is a date.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Date`.\n */\nfunction isDate(value) {\n  return toString.call(value) === '[object Date]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isArray\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Array`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Array`.\n */\nfunction isArray(arr) {\n  return Array.isArray(arr) || arr instanceof Array;\n}\n\n/**\n * @description\n * Determines if a reference is an `Error`.\n * Loosely based on https://www.npmjs.com/package/iserror\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Error`.\n */\nfunction isError(value) {\n  var tag = toString.call(value);\n  switch (tag) {\n    case '[object Error]': return true;\n    case '[object Exception]': return true;\n    case '[object DOMException]': return true;\n    default: return value instanceof Error;\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.isFunction\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Function`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Function`.\n */\nfunction isFunction(value) {return typeof value === 'function';}\n\n\n/**\n * Determines if a value is a regular expression object.\n *\n * @private\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `RegExp`.\n */\nfunction isRegExp(value) {\n  return toString.call(value) === '[object RegExp]';\n}\n\n\n/**\n * Checks if `obj` is a window object.\n *\n * @private\n * @param {*} obj Object to check\n * @returns {boolean} True if `obj` is a window obj.\n */\nfunction isWindow(obj) {\n  return obj && obj.window === obj;\n}\n\n\nfunction isScope(obj) {\n  return obj && obj.$evalAsync && obj.$watch;\n}\n\n\nfunction isFile(obj) {\n  return toString.call(obj) === '[object File]';\n}\n\n\nfunction isFormData(obj) {\n  return toString.call(obj) === '[object FormData]';\n}\n\n\nfunction isBlob(obj) {\n  return toString.call(obj) === '[object Blob]';\n}\n\n\nfunction isBoolean(value) {\n  return typeof value === 'boolean';\n}\n\n\nfunction isPromiseLike(obj) {\n  return obj && isFunction(obj.then);\n}\n\n\nvar TYPED_ARRAY_REGEXP = /^\\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/;\nfunction isTypedArray(value) {\n  return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value));\n}\n\nfunction isArrayBuffer(obj) {\n  return toString.call(obj) === '[object ArrayBuffer]';\n}\n\n\nvar trim = function(value) {\n  return isString(value) ? value.trim() : value;\n};\n\n// Copied from:\n// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021\n// Prereq: s is a string.\nvar escapeForRegexp = function(s) {\n  return s\n    .replace(/([-()[\\]{}+?*.$^|,:#<!\\\\])/g, '\\\\$1')\n    // eslint-disable-next-line no-control-regex\n    .replace(/\\x08/g, '\\\\x08');\n};\n\n\n/**\n * @ngdoc function\n * @name angular.isElement\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a DOM element (or wrapped jQuery element).\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\n */\nfunction isElement(node) {\n  return !!(node &&\n    (node.nodeName  // We are a direct element.\n    || (node.prop && node.attr && node.find)));  // We have an on and find method part of jQuery API.\n}\n\n/**\n * @param str 'key1,key2,...'\n * @returns {object} in the form of {key1:true, key2:true, ...}\n */\nfunction makeMap(str) {\n  var obj = {}, items = str.split(','), i;\n  for (i = 0; i < items.length; i++) {\n    obj[items[i]] = true;\n  }\n  return obj;\n}\n\n\nfunction nodeName_(element) {\n  return lowercase(element.nodeName || (element[0] && element[0].nodeName));\n}\n\nfunction includes(array, obj) {\n  return Array.prototype.indexOf.call(array, obj) !== -1;\n}\n\nfunction arrayRemove(array, value) {\n  var index = array.indexOf(value);\n  if (index >= 0) {\n    array.splice(index, 1);\n  }\n  return index;\n}\n\n/**\n * @ngdoc function\n * @name angular.copy\n * @module ng\n * @kind function\n *\n * @description\n * Creates a deep copy of `source`, which should be an object or an array. This functions is used\n * internally, mostly in the change-detection code. It is not intended as an all-purpose copy\n * function, and has several limitations (see below).\n *\n * * If no destination is supplied, a copy of the object or array is created.\n * * If a destination is provided, all of its elements (for arrays) or properties (for objects)\n *   are deleted and then all elements/properties from the source are copied to it.\n * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.\n * * If `source` is identical to `destination` an exception will be thrown.\n *\n * <br />\n *\n * <div class=\"alert alert-warning\">\n *   Only enumerable properties are taken into account. Non-enumerable properties (both on `source`\n *   and on `destination`) will be ignored.\n * </div>\n *\n * <div class=\"alert alert-warning\">\n *   `angular.copy` does not check if destination and source are of the same type. It's the\n *   developer's responsibility to make sure they are compatible.\n * </div>\n *\n * @knownIssue\n * This is a non-exhaustive list of object types / features that are not handled correctly by\n * `angular.copy`. Note that since this functions is used by the change detection code, this\n * means binding or watching objects of these types (or that include these types) might not work\n * correctly.\n * - [`File`](https://developer.mozilla.org/docs/Web/API/File)\n * - [`Map`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map)\n * - [`ImageData`](https://developer.mozilla.org/docs/Web/API/ImageData)\n * - [`MediaStream`](https://developer.mozilla.org/docs/Web/API/MediaStream)\n * - [`Set`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Set)\n * - [`WeakMap`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)\n * - ['getter'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get)/\n *   [`setter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set)`\n *\n * @param {*} source The source that will be used to make a copy. Can be any type, including\n *     primitives, `null`, and `undefined`.\n * @param {(Object|Array)=} destination Destination into which the source is copied. If provided,\n *     must be of the same type as `source`.\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\n *\n * @example\n  <example module=\"copyExample\" name=\"angular-copy\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form novalidate class=\"simple-form\">\n          <label>Name: <input type=\"text\" ng-model=\"user.name\" /></label><br />\n          <label>Age:  <input type=\"number\" ng-model=\"user.age\" /></label><br />\n          Gender: <label><input type=\"radio\" ng-model=\"user.gender\" value=\"male\" />male</label>\n                  <label><input type=\"radio\" ng-model=\"user.gender\" value=\"female\" />female</label><br />\n          <button ng-click=\"reset()\">RESET</button>\n          <button ng-click=\"update(user)\">SAVE</button>\n        </form>\n        <pre>form = {{user | json}}</pre>\n        <pre>leader = {{leader | json}}</pre>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      // Module: copyExample\n      angular.\n        module('copyExample', []).\n        controller('ExampleController', ['$scope', function($scope) {\n          $scope.leader = {};\n\n          $scope.reset = function() {\n            // Example with 1 argument\n            $scope.user = angular.copy($scope.leader);\n          };\n\n          $scope.update = function(user) {\n            // Example with 2 arguments\n            angular.copy(user, $scope.leader);\n          };\n\n          $scope.reset();\n        }]);\n    </file>\n  </example>\n */\nfunction copy(source, destination, maxDepth) {\n  var stackSource = [];\n  var stackDest = [];\n  maxDepth = isValidObjectMaxDepth(maxDepth) ? maxDepth : NaN;\n\n  if (destination) {\n    if (isTypedArray(destination) || isArrayBuffer(destination)) {\n      throw ngMinErr('cpta', 'Can\\'t copy! TypedArray destination cannot be mutated.');\n    }\n    if (source === destination) {\n      throw ngMinErr('cpi', 'Can\\'t copy! Source and destination are identical.');\n    }\n\n    // Empty the destination object\n    if (isArray(destination)) {\n      destination.length = 0;\n    } else {\n      forEach(destination, function(value, key) {\n        if (key !== '$$hashKey') {\n          delete destination[key];\n        }\n      });\n    }\n\n    stackSource.push(source);\n    stackDest.push(destination);\n    return copyRecurse(source, destination, maxDepth);\n  }\n\n  return copyElement(source, maxDepth);\n\n  function copyRecurse(source, destination, maxDepth) {\n    maxDepth--;\n    if (maxDepth < 0) {\n      return '...';\n    }\n    var h = destination.$$hashKey;\n    var key;\n    if (isArray(source)) {\n      for (var i = 0, ii = source.length; i < ii; i++) {\n        destination.push(copyElement(source[i], maxDepth));\n      }\n    } else if (isBlankObject(source)) {\n      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty\n      for (key in source) {\n        destination[key] = copyElement(source[key], maxDepth);\n      }\n    } else if (source && typeof source.hasOwnProperty === 'function') {\n      // Slow path, which must rely on hasOwnProperty\n      for (key in source) {\n        if (source.hasOwnProperty(key)) {\n          destination[key] = copyElement(source[key], maxDepth);\n        }\n      }\n    } else {\n      // Slowest path --- hasOwnProperty can't be called as a method\n      for (key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          destination[key] = copyElement(source[key], maxDepth);\n        }\n      }\n    }\n    setHashKey(destination, h);\n    return destination;\n  }\n\n  function copyElement(source, maxDepth) {\n    // Simple values\n    if (!isObject(source)) {\n      return source;\n    }\n\n    // Already copied values\n    var index = stackSource.indexOf(source);\n    if (index !== -1) {\n      return stackDest[index];\n    }\n\n    if (isWindow(source) || isScope(source)) {\n      throw ngMinErr('cpws',\n        'Can\\'t copy! Making copies of Window or Scope instances is not supported.');\n    }\n\n    var needsRecurse = false;\n    var destination = copyType(source);\n\n    if (destination === undefined) {\n      destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));\n      needsRecurse = true;\n    }\n\n    stackSource.push(source);\n    stackDest.push(destination);\n\n    return needsRecurse\n      ? copyRecurse(source, destination, maxDepth)\n      : destination;\n  }\n\n  function copyType(source) {\n    switch (toString.call(source)) {\n      case '[object Int8Array]':\n      case '[object Int16Array]':\n      case '[object Int32Array]':\n      case '[object Float32Array]':\n      case '[object Float64Array]':\n      case '[object Uint8Array]':\n      case '[object Uint8ClampedArray]':\n      case '[object Uint16Array]':\n      case '[object Uint32Array]':\n        return new source.constructor(copyElement(source.buffer), source.byteOffset, source.length);\n\n      case '[object ArrayBuffer]':\n        // Support: IE10\n        if (!source.slice) {\n          // If we're in this case we know the environment supports ArrayBuffer\n          /* eslint-disable no-undef */\n          var copied = new ArrayBuffer(source.byteLength);\n          new Uint8Array(copied).set(new Uint8Array(source));\n          /* eslint-enable */\n          return copied;\n        }\n        return source.slice(0);\n\n      case '[object Boolean]':\n      case '[object Number]':\n      case '[object String]':\n      case '[object Date]':\n        return new source.constructor(source.valueOf());\n\n      case '[object RegExp]':\n        var re = new RegExp(source.source, source.toString().match(/[^/]*$/)[0]);\n        re.lastIndex = source.lastIndex;\n        return re;\n\n      case '[object Blob]':\n        return new source.constructor([source], {type: source.type});\n    }\n\n    if (isFunction(source.cloneNode)) {\n      return source.cloneNode(true);\n    }\n  }\n}\n\n\n// eslint-disable-next-line no-self-compare\nfunction simpleCompare(a, b) { return a === b || (a !== a && b !== b); }\n\n\n/**\n * @ngdoc function\n * @name angular.equals\n * @module ng\n * @kind function\n *\n * @description\n * Determines if two objects or two values are equivalent. Supports value types, regular\n * expressions, arrays and objects.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `angular.equals`.\n * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)\n * * Both values represent the same regular expression (In JavaScript,\n *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual\n *   representation matches).\n *\n * During a property comparison, properties of `function` type and properties with names\n * that begin with `$` are ignored.\n *\n * Scope and DOMWindow objects are being compared only by identify (`===`).\n *\n * @param {*} o1 Object or value to compare.\n * @param {*} o2 Object or value to compare.\n * @returns {boolean} True if arguments are equal.\n *\n * @example\n   <example module=\"equalsExample\" name=\"equalsExample\">\n     <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form novalidate>\n          <h3>User 1</h3>\n          Name: <input type=\"text\" ng-model=\"user1.name\">\n          Age: <input type=\"number\" ng-model=\"user1.age\">\n\n          <h3>User 2</h3>\n          Name: <input type=\"text\" ng-model=\"user2.name\">\n          Age: <input type=\"number\" ng-model=\"user2.age\">\n\n          <div>\n            <br/>\n            <input type=\"button\" value=\"Compare\" ng-click=\"compare()\">\n          </div>\n          User 1: <pre>{{user1 | json}}</pre>\n          User 2: <pre>{{user2 | json}}</pre>\n          Equal: <pre>{{result}}</pre>\n        </form>\n      </div>\n    </file>\n    <file name=\"script.js\">\n        angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) {\n          $scope.user1 = {};\n          $scope.user2 = {};\n          $scope.compare = function() {\n            $scope.result = angular.equals($scope.user1, $scope.user2);\n          };\n        }]);\n    </file>\n  </example>\n */\nfunction equals(o1, o2) {\n  if (o1 === o2) return true;\n  if (o1 === null || o2 === null) return false;\n  // eslint-disable-next-line no-self-compare\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n  if (t1 === t2 && t1 === 'object') {\n    if (isArray(o1)) {\n      if (!isArray(o2)) return false;\n      if ((length = o1.length) === o2.length) {\n        for (key = 0; key < length; key++) {\n          if (!equals(o1[key], o2[key])) return false;\n        }\n        return true;\n      }\n    } else if (isDate(o1)) {\n      if (!isDate(o2)) return false;\n      return simpleCompare(o1.getTime(), o2.getTime());\n    } else if (isRegExp(o1)) {\n      if (!isRegExp(o2)) return false;\n      return o1.toString() === o2.toString();\n    } else {\n      if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) ||\n        isArray(o2) || isDate(o2) || isRegExp(o2)) return false;\n      keySet = createMap();\n      for (key in o1) {\n        if (key.charAt(0) === '$' || isFunction(o1[key])) continue;\n        if (!equals(o1[key], o2[key])) return false;\n        keySet[key] = true;\n      }\n      for (key in o2) {\n        if (!(key in keySet) &&\n            key.charAt(0) !== '$' &&\n            isDefined(o2[key]) &&\n            !isFunction(o2[key])) return false;\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\nvar csp = function() {\n  if (!isDefined(csp.rules)) {\n\n\n    var ngCspElement = (window.document.querySelector('[ng-csp]') ||\n                    window.document.querySelector('[data-ng-csp]'));\n\n    if (ngCspElement) {\n      var ngCspAttribute = ngCspElement.getAttribute('ng-csp') ||\n                    ngCspElement.getAttribute('data-ng-csp');\n      csp.rules = {\n        noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1),\n        noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1)\n      };\n    } else {\n      csp.rules = {\n        noUnsafeEval: noUnsafeEval(),\n        noInlineStyle: false\n      };\n    }\n  }\n\n  return csp.rules;\n\n  function noUnsafeEval() {\n    try {\n      // eslint-disable-next-line no-new, no-new-func\n      new Function('');\n      return false;\n    } catch (e) {\n      return true;\n    }\n  }\n};\n\n/**\n * @ngdoc directive\n * @module ng\n * @name ngJq\n *\n * @element ANY\n * @param {string=} ngJq the name of the library available under `window`\n * to be used for angular.element\n * @description\n * Use this directive to force the angular.element library.  This should be\n * used to force either jqLite by leaving ng-jq blank or setting the name of\n * the jquery variable under window (eg. jQuery).\n *\n * Since AngularJS looks for this directive when it is loaded (doesn't wait for the\n * DOMContentLoaded event), it must be placed on an element that comes before the script\n * which loads angular. Also, only the first instance of `ng-jq` will be used and all\n * others ignored.\n *\n * @example\n * This example shows how to force jqLite using the `ngJq` directive to the `html` tag.\n ```html\n <!doctype html>\n <html ng-app ng-jq>\n ...\n ...\n </html>\n ```\n * @example\n * This example shows how to use a jQuery based library of a different name.\n * The library name must be available at the top most 'window'.\n ```html\n <!doctype html>\n <html ng-app ng-jq=\"jQueryLib\">\n ...\n ...\n </html>\n ```\n */\nvar jq = function() {\n  if (isDefined(jq.name_)) return jq.name_;\n  var el;\n  var i, ii = ngAttrPrefixes.length, prefix, name;\n  for (i = 0; i < ii; ++i) {\n    prefix = ngAttrPrefixes[i];\n    el = window.document.querySelector('[' + prefix.replace(':', '\\\\:') + 'jq]');\n    if (el) {\n      name = el.getAttribute(prefix + 'jq');\n      break;\n    }\n  }\n\n  return (jq.name_ = name);\n};\n\nfunction concat(array1, array2, index) {\n  return array1.concat(slice.call(array2, index));\n}\n\nfunction sliceArgs(args, startIndex) {\n  return slice.call(args, startIndex || 0);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.bind\n * @module ng\n * @kind function\n *\n * @description\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\n * `fn`). You can supply optional `args` that are prebound to the function. This feature is also\n * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as\n * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).\n *\n * @param {Object} self Context which `fn` should be evaluated in.\n * @param {function()} fn Function to be bound.\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\n */\nfunction bind(self, fn) {\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\n    return curryArgs.length\n      ? function() {\n          return arguments.length\n            ? fn.apply(self, concat(curryArgs, arguments, 0))\n            : fn.apply(self, curryArgs);\n        }\n      : function() {\n          return arguments.length\n            ? fn.apply(self, arguments)\n            : fn.call(self);\n        };\n  } else {\n    // In IE, native methods are not functions so they cannot be bound (note: they don't need to be).\n    return fn;\n  }\n}\n\n\nfunction toJsonReplacer(key, value) {\n  var val = value;\n\n  if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {\n    val = undefined;\n  } else if (isWindow(value)) {\n    val = '$WINDOW';\n  } else if (value &&  window.document === value) {\n    val = '$DOCUMENT';\n  } else if (isScope(value)) {\n    val = '$SCOPE';\n  }\n\n  return val;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.toJson\n * @module ng\n * @kind function\n *\n * @description\n * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be\n * stripped since AngularJS uses this notation internally.\n *\n * @param {Object|Array|Date|string|number|boolean} obj Input to be serialized into JSON.\n * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace.\n *    If set to an integer, the JSON output will contain that many spaces per indentation.\n * @returns {string|undefined} JSON-ified string representing `obj`.\n * @knownIssue\n *\n * The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date`\n * object with an invalid date value. The only reliable way to prevent this is to monkeypatch the\n * `Date.prototype.toJSON` method as follows:\n *\n * ```\n * var _DatetoJSON = Date.prototype.toJSON;\n * Date.prototype.toJSON = function() {\n *   try {\n *     return _DatetoJSON.call(this);\n *   } catch(e) {\n *     if (e instanceof RangeError) {\n *       return null;\n *     }\n *     throw e;\n *   }\n * };\n * ```\n *\n * See https://github.com/angular/angular.js/pull/14221 for more information.\n */\nfunction toJson(obj, pretty) {\n  if (isUndefined(obj)) return undefined;\n  if (!isNumber(pretty)) {\n    pretty = pretty ? 2 : null;\n  }\n  return JSON.stringify(obj, toJsonReplacer, pretty);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.fromJson\n * @module ng\n * @kind function\n *\n * @description\n * Deserializes a JSON string.\n *\n * @param {string} json JSON string to deserialize.\n * @returns {Object|Array|string|number} Deserialized JSON string.\n */\nfunction fromJson(json) {\n  return isString(json)\n      ? JSON.parse(json)\n      : json;\n}\n\n\nvar ALL_COLONS = /:/g;\nfunction timezoneToOffset(timezone, fallback) {\n  // Support: IE 9-11 only, Edge 13-15+\n  // IE/Edge do not \"understand\" colon (`:`) in timezone\n  timezone = timezone.replace(ALL_COLONS, '');\n  var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n  return isNumberNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n}\n\n\nfunction addDateMinutes(date, minutes) {\n  date = new Date(date.getTime());\n  date.setMinutes(date.getMinutes() + minutes);\n  return date;\n}\n\n\nfunction convertTimezoneToLocal(date, timezone, reverse) {\n  reverse = reverse ? -1 : 1;\n  var dateTimezoneOffset = date.getTimezoneOffset();\n  var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n  return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset));\n}\n\n\n/**\n * @returns {string} Returns the string representation of the element.\n */\nfunction startingTag(element) {\n  element = jqLite(element).clone().empty();\n  var elemHtml = jqLite('<div></div>').append(element).html();\n  try {\n    return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :\n        elemHtml.\n          match(/^(<[^>]+>)/)[1].\n          replace(/^<([\\w-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);});\n  } catch (e) {\n    return lowercase(elemHtml);\n  }\n\n}\n\n\n/////////////////////////////////////////////////\n\n/**\n * Tries to decode the URI component without throwing an exception.\n *\n * @private\n * @param str value potential URI component to check.\n * @returns {boolean} True if `value` can be decoded\n * with the decodeURIComponent function.\n */\nfunction tryDecodeURIComponent(value) {\n  try {\n    return decodeURIComponent(value);\n  } catch (e) {\n    // Ignore any invalid uri component.\n  }\n}\n\n\n/**\n * Parses an escaped url query string into key-value pairs.\n * @returns {Object.<string,boolean|Array>}\n */\nfunction parseKeyValue(/**string*/keyValue) {\n  var obj = {};\n  forEach((keyValue || '').split('&'), function(keyValue) {\n    var splitPoint, key, val;\n    if (keyValue) {\n      key = keyValue = keyValue.replace(/\\+/g,'%20');\n      splitPoint = keyValue.indexOf('=');\n      if (splitPoint !== -1) {\n        key = keyValue.substring(0, splitPoint);\n        val = keyValue.substring(splitPoint + 1);\n      }\n      key = tryDecodeURIComponent(key);\n      if (isDefined(key)) {\n        val = isDefined(val) ? tryDecodeURIComponent(val) : true;\n        if (!hasOwnProperty.call(obj, key)) {\n          obj[key] = val;\n        } else if (isArray(obj[key])) {\n          obj[key].push(val);\n        } else {\n          obj[key] = [obj[key],val];\n        }\n      }\n    }\n  });\n  return obj;\n}\n\nfunction toKeyValue(obj) {\n  var parts = [];\n  forEach(obj, function(value, key) {\n    if (isArray(value)) {\n      forEach(value, function(arrayValue) {\n        parts.push(encodeUriQuery(key, true) +\n                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));\n      });\n    } else {\n    parts.push(encodeUriQuery(key, true) +\n               (value === true ? '' : '=' + encodeUriQuery(value, true)));\n    }\n  });\n  return parts.length ? parts.join('&') : '';\n}\n\n\n/**\n * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\n * segments:\n *    segment       = *pchar\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriSegment(val) {\n  return encodeUriQuery(val, true).\n             replace(/%26/gi, '&').\n             replace(/%3D/gi, '=').\n             replace(/%2B/gi, '+');\n}\n\n\n/**\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\n * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\n * encoded per http://tools.ietf.org/html/rfc3986:\n *    query         = *( pchar / \"/\" / \"?\" )\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriQuery(val, pctEncodeSpaces) {\n  return encodeURIComponent(val).\n             replace(/%40/gi, '@').\n             replace(/%3A/gi, ':').\n             replace(/%24/g, '$').\n             replace(/%2C/gi, ',').\n             replace(/%3B/gi, ';').\n             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\n}\n\nvar ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];\n\nfunction getNgAttribute(element, ngAttr) {\n  var attr, i, ii = ngAttrPrefixes.length;\n  for (i = 0; i < ii; ++i) {\n    attr = ngAttrPrefixes[i] + ngAttr;\n    if (isString(attr = element.getAttribute(attr))) {\n      return attr;\n    }\n  }\n  return null;\n}\n\nfunction allowAutoBootstrap(document) {\n  var script = document.currentScript;\n\n  if (!script) {\n    // Support: IE 9-11 only\n    // IE does not have `document.currentScript`\n    return true;\n  }\n\n  // If the `currentScript` property has been clobbered just return false, since this indicates a probable attack\n  if (!(script instanceof window.HTMLScriptElement || script instanceof window.SVGScriptElement)) {\n    return false;\n  }\n\n  var attributes = script.attributes;\n  var srcs = [attributes.getNamedItem('src'), attributes.getNamedItem('href'), attributes.getNamedItem('xlink:href')];\n\n  return srcs.every(function(src) {\n    if (!src) {\n      return true;\n    }\n    if (!src.value) {\n      return false;\n    }\n\n    var link = document.createElement('a');\n    link.href = src.value;\n\n    if (document.location.origin === link.origin) {\n      // Same-origin resources are always allowed, even for non-whitelisted schemes.\n      return true;\n    }\n    // Disabled bootstrapping unless angular.js was loaded from a known scheme used on the web.\n    // This is to prevent angular.js bundled with browser extensions from being used to bypass the\n    // content security policy in web pages and other browser extensions.\n    switch (link.protocol) {\n      case 'http:':\n      case 'https:':\n      case 'ftp:':\n      case 'blob:':\n      case 'file:':\n      case 'data:':\n        return true;\n      default:\n        return false;\n    }\n  });\n}\n\n// Cached as it has to run during loading so that document.currentScript is available.\nvar isAutoBootstrapAllowed = allowAutoBootstrap(window.document);\n\n/**\n * @ngdoc directive\n * @name ngApp\n * @module ng\n *\n * @element ANY\n * @param {angular.Module} ngApp an optional application\n *   {@link angular.module module} name to load.\n * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be\n *   created in \"strict-di\" mode. This means that the application will fail to invoke functions which\n *   do not use explicit function annotation (and are thus unsuitable for minification), as described\n *   in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in\n *   tracking down the root of these bugs.\n *\n * @description\n *\n * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive\n * designates the **root element** of the application and is typically placed near the root element\n * of the page - e.g. on the `<body>` or `<html>` tags.\n *\n * There are a few things to keep in mind when using `ngApp`:\n * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`\n *   found in the document will be used to define the root element to auto-bootstrap as an\n *   application. To run multiple applications in an HTML document you must manually bootstrap them using\n *   {@link angular.bootstrap} instead.\n * - AngularJS applications cannot be nested within each other.\n * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`.\n *   This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and\n *   {@link ngRoute.ngView `ngView`}.\n *   Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},\n *   causing animations to stop working and making the injector inaccessible from outside the app.\n *\n * You can specify an **AngularJS module** to be used as the root module for the application.  This\n * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It\n * should contain the application code needed or have dependencies on other modules that will\n * contain the code. See {@link angular.module} for more information.\n *\n * In the example below if the `ngApp` directive were not placed on the `html` element then the\n * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`\n * would not be resolved to `3`.\n *\n * @example\n *\n * ### Simple Usage\n *\n * `ngApp` is the easiest, and most common way to bootstrap an application.\n *\n <example module=\"ngAppDemo\" name=\"ng-app\">\n   <file name=\"index.html\">\n   <div ng-controller=\"ngAppDemoController\">\n     I can add: {{a}} + {{b}} =  {{ a+b }}\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {\n     $scope.a = 1;\n     $scope.b = 2;\n   });\n   </file>\n </example>\n *\n * @example\n *\n * ### With `ngStrictDi`\n *\n * Using `ngStrictDi`, you would see something like this:\n *\n <example ng-app-included=\"true\" name=\"strict-di\">\n   <file name=\"index.html\">\n   <div ng-app=\"ngAppStrictDemo\" ng-strict-di>\n       <div ng-controller=\"GoodController1\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style (see\n              script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"GoodController2\">\n           Name: <input ng-model=\"name\"><br />\n           Hello, {{name}}!\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style\n              (see script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"BadController\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>The controller could not be instantiated, due to relying\n              on automatic function annotations (which are disabled in\n              strict mode). As such, the content of this section is not\n              interpolated, and there should be an error in your web console.\n           </p>\n       </div>\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppStrictDemo', [])\n     // BadController will fail to instantiate, due to relying on automatic function annotation,\n     // rather than an explicit annotation\n     .controller('BadController', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     })\n     // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,\n     // due to using explicit annotations using the array style and $inject property, respectively.\n     .controller('GoodController1', ['$scope', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     }])\n     .controller('GoodController2', GoodController2);\n     function GoodController2($scope) {\n       $scope.name = 'World';\n     }\n     GoodController2.$inject = ['$scope'];\n   </file>\n   <file name=\"style.css\">\n   div[ng-controller] {\n       margin-bottom: 1em;\n       -webkit-border-radius: 4px;\n       border-radius: 4px;\n       border: 1px solid;\n       padding: .5em;\n   }\n   div[ng-controller^=Good] {\n       border-color: #d6e9c6;\n       background-color: #dff0d8;\n       color: #3c763d;\n   }\n   div[ng-controller^=Bad] {\n       border-color: #ebccd1;\n       background-color: #f2dede;\n       color: #a94442;\n       margin-bottom: 0;\n   }\n   </file>\n </example>\n */\nfunction angularInit(element, bootstrap) {\n  var appElement,\n      module,\n      config = {};\n\n  // The element `element` has priority over any other element.\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n\n    if (!appElement && element.hasAttribute && element.hasAttribute(name)) {\n      appElement = element;\n      module = element.getAttribute(name);\n    }\n  });\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n    var candidate;\n\n    if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\\\:') + ']'))) {\n      appElement = candidate;\n      module = candidate.getAttribute(name);\n    }\n  });\n  if (appElement) {\n    if (!isAutoBootstrapAllowed) {\n      window.console.error('AngularJS: disabling automatic bootstrap. <script> protocol indicates ' +\n          'an extension, document.location.href does not match.');\n      return;\n    }\n    config.strictDi = getNgAttribute(appElement, 'strict-di') !== null;\n    bootstrap(appElement, module ? [module] : [], config);\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.bootstrap\n * @module ng\n * @description\n * Use this function to manually start up AngularJS application.\n *\n * For more information, see the {@link guide/bootstrap Bootstrap guide}.\n *\n * AngularJS will detect if it has been loaded into the browser more than once and only allow the\n * first loaded script to be bootstrapped and will report a warning to the browser console for\n * each of the subsequent scripts. This prevents strange results in applications, where otherwise\n * multiple instances of AngularJS try to work on the DOM.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually.\n * They must use {@link ng.directive:ngApp ngApp}.\n * </div>\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion},\n * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}.\n * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},\n * causing animations to stop working and making the injector inaccessible from outside the app.\n * </div>\n *\n * ```html\n * <!doctype html>\n * <html>\n * <body>\n * <div ng-controller=\"WelcomeController\">\n *   {{greeting}}\n * </div>\n *\n * <script src=\"angular.js\"></script>\n * <script>\n *   var app = angular.module('demo', [])\n *   .controller('WelcomeController', function($scope) {\n *       $scope.greeting = 'Welcome!';\n *   });\n *   angular.bootstrap(document, ['demo']);\n * </script>\n * </body>\n * </html>\n * ```\n *\n * @param {DOMElement} element DOM element which is the root of AngularJS application.\n * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.\n *     Each item in the array should be the name of a predefined module or a (DI annotated)\n *     function that will be invoked by the injector as a `config` block.\n *     See: {@link angular.module modules}\n * @param {Object=} config an object for defining configuration options for the application. The\n *     following keys are supported:\n *\n * * `strictDi` - disable automatic function annotation for the application. This is meant to\n *   assist in finding bugs which break minified code. Defaults to `false`.\n *\n * @returns {auto.$injector} Returns the newly created injector for this app.\n */\nfunction bootstrap(element, modules, config) {\n  if (!isObject(config)) config = {};\n  var defaultConfig = {\n    strictDi: false\n  };\n  config = extend(defaultConfig, config);\n  var doBootstrap = function() {\n    element = jqLite(element);\n\n    if (element.injector()) {\n      var tag = (element[0] === window.document) ? 'document' : startingTag(element);\n      // Encode angle brackets to prevent input from being sanitized to empty string #8683.\n      throw ngMinErr(\n          'btstrpd',\n          'App already bootstrapped with this element \\'{0}\\'',\n          tag.replace(/</,'&lt;').replace(/>/,'&gt;'));\n    }\n\n    modules = modules || [];\n    modules.unshift(['$provide', function($provide) {\n      $provide.value('$rootElement', element);\n    }]);\n\n    if (config.debugInfoEnabled) {\n      // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`.\n      modules.push(['$compileProvider', function($compileProvider) {\n        $compileProvider.debugInfoEnabled(true);\n      }]);\n    }\n\n    modules.unshift('ng');\n    var injector = createInjector(modules, config.strictDi);\n    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',\n       function bootstrapApply(scope, element, compile, injector) {\n        scope.$apply(function() {\n          element.data('$injector', injector);\n          compile(element)(scope);\n        });\n      }]\n    );\n    return injector;\n  };\n\n  var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/;\n  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;\n\n  if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) {\n    config.debugInfoEnabled = true;\n    window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, '');\n  }\n\n  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {\n    return doBootstrap();\n  }\n\n  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');\n  angular.resumeBootstrap = function(extraModules) {\n    forEach(extraModules, function(module) {\n      modules.push(module);\n    });\n    return doBootstrap();\n  };\n\n  if (isFunction(angular.resumeDeferredBootstrap)) {\n    angular.resumeDeferredBootstrap();\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.reloadWithDebugInfo\n * @module ng\n * @description\n * Use this function to reload the current application with debug information turned on.\n * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`.\n *\n * See {@link ng.$compileProvider#debugInfoEnabled} for more.\n */\nfunction reloadWithDebugInfo() {\n  window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name;\n  window.location.reload();\n}\n\n/**\n * @name angular.getTestability\n * @module ng\n * @description\n * Get the testability service for the instance of AngularJS on the given\n * element.\n * @param {DOMElement} element DOM element which is the root of AngularJS application.\n */\nfunction getTestability(rootElement) {\n  var injector = angular.element(rootElement).injector();\n  if (!injector) {\n    throw ngMinErr('test',\n      'no injector found for element argument to getTestability');\n  }\n  return injector.get('$$testability');\n}\n\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\nfunction snake_case(name, separator) {\n  separator = separator || '_';\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n    return (pos ? separator : '') + letter.toLowerCase();\n  });\n}\n\nvar bindJQueryFired = false;\nfunction bindJQuery() {\n  var originalCleanData;\n\n  if (bindJQueryFired) {\n    return;\n  }\n\n  // bind to jQuery if present;\n  var jqName = jq();\n  jQuery = isUndefined(jqName) ? window.jQuery :   // use jQuery (if present)\n           !jqName             ? undefined     :   // use jqLite\n                                 window[jqName];   // use jQuery specified by `ngJq`\n\n  // Use jQuery if it exists with proper functionality, otherwise default to us.\n  // AngularJS 1.2+ requires jQuery 1.7+ for on()/off() support.\n  // AngularJS 1.3+ technically requires at least jQuery 2.1+ but it may work with older\n  // versions. It will not work for sure with jQuery <1.7, though.\n  if (jQuery && jQuery.fn.on) {\n    jqLite = jQuery;\n    extend(jQuery.fn, {\n      scope: JQLitePrototype.scope,\n      isolateScope: JQLitePrototype.isolateScope,\n      controller: /** @type {?} */ (JQLitePrototype).controller,\n      injector: JQLitePrototype.injector,\n      inheritedData: JQLitePrototype.inheritedData\n    });\n  } else {\n    jqLite = JQLite;\n  }\n\n  // All nodes removed from the DOM via various jqLite/jQuery APIs like .remove()\n  // are passed through jqLite/jQuery.cleanData. Monkey-patch this method to fire\n  // the $destroy event on all removed nodes.\n  originalCleanData = jqLite.cleanData;\n  jqLite.cleanData = function(elems) {\n    var events;\n    for (var i = 0, elem; (elem = elems[i]) != null; i++) {\n      events = (jqLite._data(elem) || {}).events;\n      if (events && events.$destroy) {\n        jqLite(elem).triggerHandler('$destroy');\n      }\n    }\n    originalCleanData(elems);\n  };\n\n  angular.element = jqLite;\n\n  // Prevent double-proxying.\n  bindJQueryFired = true;\n}\n\n/**\n * throw error if the argument is falsy.\n */\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', 'Argument \\'{0}\\' is {1}', (name || '?'), (reason || 'required'));\n  }\n  return arg;\n}\n\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\n  if (acceptArrayAnnotation && isArray(arg)) {\n      arg = arg[arg.length - 1];\n  }\n\n  assertArg(isFunction(arg), name, 'not a function, got ' +\n      (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));\n  return arg;\n}\n\n/**\n * throw error if the name given is hasOwnProperty\n * @param  {String} name    the name to test\n * @param  {String} context the context in which the name is used, such as module or directive\n */\nfunction assertNotHasOwnProperty(name, context) {\n  if (name === 'hasOwnProperty') {\n    throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n  }\n}\n\n/**\n * Return the value accessible from the object by path. Any undefined traversals are ignored\n * @param {Object} obj starting object\n * @param {String} path path to traverse\n * @param {boolean} [bindFnToScope=true]\n * @returns {Object} value as accessible by path\n */\n//TODO(misko): this function needs to be removed\nfunction getter(obj, path, bindFnToScope) {\n  if (!path) return obj;\n  var keys = path.split('.');\n  var key;\n  var lastInstance = obj;\n  var len = keys.length;\n\n  for (var i = 0; i < len; i++) {\n    key = keys[i];\n    if (obj) {\n      obj = (lastInstance = obj)[key];\n    }\n  }\n  if (!bindFnToScope && isFunction(obj)) {\n    return bind(lastInstance, obj);\n  }\n  return obj;\n}\n\n/**\n * Return the DOM siblings between the first and last node in the given array.\n * @param {Array} array like object\n * @returns {Array} the inputted object or a jqLite collection containing the nodes\n */\nfunction getBlockNodes(nodes) {\n  // TODO(perf): update `nodes` instead of creating a new object?\n  var node = nodes[0];\n  var endNode = nodes[nodes.length - 1];\n  var blockNodes;\n\n  for (var i = 1; node !== endNode && (node = node.nextSibling); i++) {\n    if (blockNodes || nodes[i] !== node) {\n      if (!blockNodes) {\n        blockNodes = jqLite(slice.call(nodes, 0, i));\n      }\n      blockNodes.push(node);\n    }\n  }\n\n  return blockNodes || nodes;\n}\n\n\n/**\n * Creates a new object without a prototype. This object is useful for lookup without having to\n * guard against prototypically inherited properties via hasOwnProperty.\n *\n * Related micro-benchmarks:\n * - http://jsperf.com/object-create2\n * - http://jsperf.com/proto-map-lookup/2\n * - http://jsperf.com/for-in-vs-object-keys2\n *\n * @returns {Object}\n */\nfunction createMap() {\n  return Object.create(null);\n}\n\nfunction stringify(value) {\n  if (value == null) { // null || undefined\n    return '';\n  }\n  switch (typeof value) {\n    case 'string':\n      break;\n    case 'number':\n      value = '' + value;\n      break;\n    default:\n      if (hasCustomToString(value) && !isArray(value) && !isDate(value)) {\n        value = value.toString();\n      } else {\n        value = toJson(value);\n      }\n  }\n\n  return value;\n}\n\nvar NODE_TYPE_ELEMENT = 1;\nvar NODE_TYPE_ATTRIBUTE = 2;\nvar NODE_TYPE_TEXT = 3;\nvar NODE_TYPE_COMMENT = 8;\nvar NODE_TYPE_DOCUMENT = 9;\nvar NODE_TYPE_DOCUMENT_FRAGMENT = 11;\n\n/**\n * @ngdoc type\n * @name angular.Module\n * @module ng\n * @description\n *\n * Interface for configuring AngularJS {@link angular.module modules}.\n */\n\nfunction setupModuleLoader(window) {\n\n  var $injectorMinErr = minErr('$injector');\n  var ngMinErr = minErr('ng');\n\n  function ensure(obj, name, factory) {\n    return obj[name] || (obj[name] = factory());\n  }\n\n  var angular = ensure(window, 'angular', Object);\n\n  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\n  angular.$$minErr = angular.$$minErr || minErr;\n\n  return ensure(angular, 'module', function() {\n    /** @type {Object.<string, angular.Module>} */\n    var modules = {};\n\n    /**\n     * @ngdoc function\n     * @name angular.module\n     * @module ng\n     * @description\n     *\n     * The `angular.module` is a global place for creating, registering and retrieving AngularJS\n     * modules.\n     * All modules (AngularJS core or 3rd party) that should be available to an application must be\n     * registered using this mechanism.\n     *\n     * Passing one argument retrieves an existing {@link angular.Module},\n     * whereas passing more than one argument creates a new {@link angular.Module}\n     *\n     *\n     * # Module\n     *\n     * A module is a collection of services, directives, controllers, filters, and configuration information.\n     * `angular.module` is used to configure the {@link auto.$injector $injector}.\n     *\n     * ```js\n     * // Create a new module\n     * var myModule = angular.module('myModule', []);\n     *\n     * // register a new service\n     * myModule.value('appName', 'MyCoolApp');\n     *\n     * // configure existing services inside initialization blocks.\n     * myModule.config(['$locationProvider', function($locationProvider) {\n     *   // Configure existing providers\n     *   $locationProvider.hashPrefix('!');\n     * }]);\n     * ```\n     *\n     * Then you can create an injector and load your modules like this:\n     *\n     * ```js\n     * var injector = angular.injector(['ng', 'myModule'])\n     * ```\n     *\n     * However it's more likely that you'll just use\n     * {@link ng.directive:ngApp ngApp} or\n     * {@link angular.bootstrap} to simplify this process for you.\n     *\n     * @param {!string} name The name of the module to create or retrieve.\n     * @param {!Array.<string>=} requires If specified then new module is being created. If\n     *        unspecified then the module is being retrieved for further configuration.\n     * @param {Function=} configFn Optional configuration function for the module. Same as\n     *        {@link angular.Module#config Module#config()}.\n     * @returns {angular.Module} new module with the {@link angular.Module} api.\n     */\n    return function module(name, requires, configFn) {\n\n      var info = {};\n\n      var assertNotHasOwnProperty = function(name, context) {\n        if (name === 'hasOwnProperty') {\n          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n        }\n      };\n\n      assertNotHasOwnProperty(name, 'module');\n      if (requires && modules.hasOwnProperty(name)) {\n        modules[name] = null;\n      }\n      return ensure(modules, name, function() {\n        if (!requires) {\n          throw $injectorMinErr('nomod', 'Module \\'{0}\\' is not available! You either misspelled ' +\n             'the module name or forgot to load it. If registering a module ensure that you ' +\n             'specify the dependencies as the second argument.', name);\n        }\n\n        /** @type {!Array.<Array.<*>>} */\n        var invokeQueue = [];\n\n        /** @type {!Array.<Function>} */\n        var configBlocks = [];\n\n        /** @type {!Array.<Function>} */\n        var runBlocks = [];\n\n        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);\n\n        /** @type {angular.Module} */\n        var moduleInstance = {\n          // Private state\n          _invokeQueue: invokeQueue,\n          _configBlocks: configBlocks,\n          _runBlocks: runBlocks,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#info\n           * @module ng\n           *\n           * @param {Object=} info Information about the module\n           * @returns {Object|Module} The current info object for this module if called as a getter,\n           *                          or `this` if called as a setter.\n           *\n           * @description\n           * Read and write custom information about this module.\n           * For example you could put the version of the module in here.\n           *\n           * ```js\n           * angular.module('myModule', []).info({ version: '1.0.0' });\n           * ```\n           *\n           * The version could then be read back out by accessing the module elsewhere:\n           *\n           * ```\n           * var version = angular.module('myModule').info().version;\n           * ```\n           *\n           * You can also retrieve this information during runtime via the\n           * {@link $injector#modules `$injector.modules`} property:\n           *\n           * ```js\n           * var version = $injector.modules['myModule'].info().version;\n           * ```\n           */\n          info: function(value) {\n            if (isDefined(value)) {\n              if (!isObject(value)) throw ngMinErr('aobj', 'Argument \\'{0}\\' must be an object', 'value');\n              info = value;\n              return this;\n            }\n            return info;\n          },\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#requires\n           * @module ng\n           *\n           * @description\n           * Holds the list of modules which the injector will load before the current module is\n           * loaded.\n           */\n          requires: requires,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#name\n           * @module ng\n           *\n           * @description\n           * Name of the module.\n           */\n          name: name,\n\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#provider\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerType Construction function for creating new instance of the\n           *                                service.\n           * @description\n           * See {@link auto.$provide#provider $provide.provider()}.\n           */\n          provider: invokeLaterAndSetModuleName('$provide', 'provider'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#factory\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerFunction Function for creating new instance of the service.\n           * @description\n           * See {@link auto.$provide#factory $provide.factory()}.\n           */\n          factory: invokeLaterAndSetModuleName('$provide', 'factory'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#service\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} constructor A constructor function that will be instantiated.\n           * @description\n           * See {@link auto.$provide#service $provide.service()}.\n           */\n          service: invokeLaterAndSetModuleName('$provide', 'service'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#value\n           * @module ng\n           * @param {string} name service name\n           * @param {*} object Service instance object.\n           * @description\n           * See {@link auto.$provide#value $provide.value()}.\n           */\n          value: invokeLater('$provide', 'value'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#constant\n           * @module ng\n           * @param {string} name constant name\n           * @param {*} object Constant value.\n           * @description\n           * Because the constants are fixed, they get applied before other provide methods.\n           * See {@link auto.$provide#constant $provide.constant()}.\n           */\n          constant: invokeLater('$provide', 'constant', 'unshift'),\n\n           /**\n           * @ngdoc method\n           * @name angular.Module#decorator\n           * @module ng\n           * @param {string} name The name of the service to decorate.\n           * @param {Function} decorFn This function will be invoked when the service needs to be\n           *                           instantiated and should return the decorated service instance.\n           * @description\n           * See {@link auto.$provide#decorator $provide.decorator()}.\n           */\n          decorator: invokeLaterAndSetModuleName('$provide', 'decorator', configBlocks),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#animation\n           * @module ng\n           * @param {string} name animation name\n           * @param {Function} animationFactory Factory function for creating new instance of an\n           *                                    animation.\n           * @description\n           *\n           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\n           *\n           *\n           * Defines an animation hook that can be later used with\n           * {@link $animate $animate} service and directives that use this service.\n           *\n           * ```js\n           * module.animation('.animation-name', function($inject1, $inject2) {\n           *   return {\n           *     eventName : function(element, done) {\n           *       //code to run the animation\n           *       //once complete, then run done()\n           *       return function cancellationFunction(element) {\n           *         //code to cancel the animation\n           *       }\n           *     }\n           *   }\n           * })\n           * ```\n           *\n           * See {@link ng.$animateProvider#register $animateProvider.register()} and\n           * {@link ngAnimate ngAnimate module} for more information.\n           */\n          animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#filter\n           * @module ng\n           * @param {string} name Filter name - this must be a valid AngularJS expression identifier\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\n           * @description\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\n           *\n           * <div class=\"alert alert-warning\">\n           * **Note:** Filter names must be valid AngularJS {@link expression} identifiers, such as `uppercase` or `orderBy`.\n           * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n           * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n           * (`myapp_subsection_filterx`).\n           * </div>\n           */\n          filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#controller\n           * @module ng\n           * @param {string|Object} name Controller name, or an object map of controllers where the\n           *    keys are the names and the values are the constructors.\n           * @param {Function} constructor Controller constructor function.\n           * @description\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\n           */\n          controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#directive\n           * @module ng\n           * @param {string|Object} name Directive name, or an object map of directives where the\n           *    keys are the names and the values are the factories.\n           * @param {Function} directiveFactory Factory function for creating new instance of\n           * directives.\n           * @description\n           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\n           */\n          directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#component\n           * @module ng\n           * @param {string|Object} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`),\n           *    or an object map of components where the keys are the names and the values are the component definition objects.\n           * @param {Object} options Component definition object (a simplified\n           *    {@link ng.$compile#directive-definition-object directive definition object})\n           *\n           * @description\n           * See {@link ng.$compileProvider#component $compileProvider.component()}.\n           */\n          component: invokeLaterAndSetModuleName('$compileProvider', 'component'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#config\n           * @module ng\n           * @param {Function} configFn Execute this function on module load. Useful for service\n           *    configuration.\n           * @description\n           * Use this method to configure services by injecting their\n           * {@link angular.Module#provider `providers`}, e.g. for adding routes to the\n           * {@link ngRoute.$routeProvider $routeProvider}.\n           *\n           * Note that you can only inject {@link angular.Module#provider `providers`} and\n           * {@link angular.Module#constant `constants`} into this function.\n           *\n           * For more about how to configure services, see\n           * {@link providers#provider-recipe Provider Recipe}.\n           */\n          config: config,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#run\n           * @module ng\n           * @param {Function} initializationFn Execute this function after injector creation.\n           *    Useful for application initialization.\n           * @description\n           * Use this method to register work which should be performed when the injector is done\n           * loading all modules.\n           */\n          run: function(block) {\n            runBlocks.push(block);\n            return this;\n          }\n        };\n\n        if (configFn) {\n          config(configFn);\n        }\n\n        return moduleInstance;\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @param {String=} insertMethod\n         * @returns {angular.Module}\n         */\n        function invokeLater(provider, method, insertMethod, queue) {\n          if (!queue) queue = invokeQueue;\n          return function() {\n            queue[insertMethod || 'push']([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @returns {angular.Module}\n         */\n        function invokeLaterAndSetModuleName(provider, method, queue) {\n          if (!queue) queue = invokeQueue;\n          return function(recipeName, factoryFunction) {\n            if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;\n            queue.push([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n      });\n    };\n  });\n\n}\n\n/* global shallowCopy: true */\n\n/**\n * Creates a shallow copy of an object, an array or a primitive.\n *\n * Assumes that there are no proto properties for objects.\n */\nfunction shallowCopy(src, dst) {\n  if (isArray(src)) {\n    dst = dst || [];\n\n    for (var i = 0, ii = src.length; i < ii; i++) {\n      dst[i] = src[i];\n    }\n  } else if (isObject(src)) {\n    dst = dst || {};\n\n    for (var key in src) {\n      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n        dst[key] = src[key];\n      }\n    }\n  }\n\n  return dst || src;\n}\n\n/* exported toDebugString */\n\nfunction serializeObject(obj, maxDepth) {\n  var seen = [];\n\n  // There is no direct way to stringify object until reaching a specific depth\n  // and a very deep object can cause a performance issue, so we copy the object\n  // based on this specific depth and then stringify it.\n  if (isValidObjectMaxDepth(maxDepth)) {\n    // This file is also included in `angular-loader`, so `copy()` might not always be available in\n    // the closure. Therefore, it is lazily retrieved as `angular.copy()` when needed.\n    obj = angular.copy(obj, null, maxDepth);\n  }\n  return JSON.stringify(obj, function(key, val) {\n    val = toJsonReplacer(key, val);\n    if (isObject(val)) {\n\n      if (seen.indexOf(val) >= 0) return '...';\n\n      seen.push(val);\n    }\n    return val;\n  });\n}\n\nfunction toDebugString(obj, maxDepth) {\n  if (typeof obj === 'function') {\n    return obj.toString().replace(/ \\{[\\s\\S]*$/, '');\n  } else if (isUndefined(obj)) {\n    return 'undefined';\n  } else if (typeof obj !== 'string') {\n    return serializeObject(obj, maxDepth);\n  }\n  return obj;\n}\n\n/* global angularModule: true,\n  version: true,\n\n  $CompileProvider,\n\n  htmlAnchorDirective,\n  inputDirective,\n  hiddenInputBrowserCacheDirective,\n  formDirective,\n  scriptDirective,\n  selectDirective,\n  optionDirective,\n  ngBindDirective,\n  ngBindHtmlDirective,\n  ngBindTemplateDirective,\n  ngClassDirective,\n  ngClassEvenDirective,\n  ngClassOddDirective,\n  ngCloakDirective,\n  ngControllerDirective,\n  ngFormDirective,\n  ngHideDirective,\n  ngIfDirective,\n  ngIncludeDirective,\n  ngIncludeFillContentDirective,\n  ngInitDirective,\n  ngNonBindableDirective,\n  ngPluralizeDirective,\n  ngRefDirective,\n  ngRepeatDirective,\n  ngShowDirective,\n  ngStyleDirective,\n  ngSwitchDirective,\n  ngSwitchWhenDirective,\n  ngSwitchDefaultDirective,\n  ngOptionsDirective,\n  ngTranscludeDirective,\n  ngModelDirective,\n  ngListDirective,\n  ngChangeDirective,\n  patternDirective,\n  patternDirective,\n  requiredDirective,\n  requiredDirective,\n  minlengthDirective,\n  minlengthDirective,\n  maxlengthDirective,\n  maxlengthDirective,\n  ngValueDirective,\n  ngModelOptionsDirective,\n  ngAttributeAliasDirectives,\n  ngEventDirectives,\n\n  $AnchorScrollProvider,\n  $AnimateProvider,\n  $CoreAnimateCssProvider,\n  $$CoreAnimateJsProvider,\n  $$CoreAnimateQueueProvider,\n  $$AnimateRunnerFactoryProvider,\n  $$AnimateAsyncRunFactoryProvider,\n  $BrowserProvider,\n  $CacheFactoryProvider,\n  $ControllerProvider,\n  $DateProvider,\n  $DocumentProvider,\n  $$IsDocumentHiddenProvider,\n  $ExceptionHandlerProvider,\n  $FilterProvider,\n  $$ForceReflowProvider,\n  $InterpolateProvider,\n  $$IntervalFactoryProvider,\n  $IntervalProvider,\n  $HttpProvider,\n  $HttpParamSerializerProvider,\n  $HttpParamSerializerJQLikeProvider,\n  $HttpBackendProvider,\n  $xhrFactoryProvider,\n  $jsonpCallbacksProvider,\n  $LocationProvider,\n  $LogProvider,\n  $$MapProvider,\n  $ParseProvider,\n  $RootScopeProvider,\n  $QProvider,\n  $$QProvider,\n  $$SanitizeUriProvider,\n  $SceProvider,\n  $SceDelegateProvider,\n  $SnifferProvider,\n  $$TaskTrackerFactoryProvider,\n  $TemplateCacheProvider,\n  $TemplateRequestProvider,\n  $$TestabilityProvider,\n  $TimeoutProvider,\n  $$RAFProvider,\n  $WindowProvider,\n  $$jqLiteProvider,\n  $$CookieReaderProvider\n*/\n\n\n/**\n * @ngdoc object\n * @name angular.version\n * @module ng\n * @description\n * An object that contains information about the current AngularJS version.\n *\n * This object has the following properties:\n *\n * - `full` – `{string}` – Full version string, such as \"0.9.18\".\n * - `major` – `{number}` – Major version number, such as \"0\".\n * - `minor` – `{number}` – Minor version number, such as \"9\".\n * - `dot` – `{number}` – Dot version number, such as \"18\".\n * - `codeName` – `{string}` – Code name of the release, such as \"jiggling-armfat\".\n */\nvar version = {\n  // These placeholder strings will be replaced by grunt's `build` task.\n  // They need to be double- or single-quoted.\n  full: '1.7.8',\n  major: 1,\n  minor: 7,\n  dot: 8,\n  codeName: 'enthusiastic-oblation'\n};\n\n\nfunction publishExternalAPI(angular) {\n  extend(angular, {\n    'errorHandlingConfig': errorHandlingConfig,\n    'bootstrap': bootstrap,\n    'copy': copy,\n    'extend': extend,\n    'merge': merge,\n    'equals': equals,\n    'element': jqLite,\n    'forEach': forEach,\n    'injector': createInjector,\n    'noop': noop,\n    'bind': bind,\n    'toJson': toJson,\n    'fromJson': fromJson,\n    'identity': identity,\n    'isUndefined': isUndefined,\n    'isDefined': isDefined,\n    'isString': isString,\n    'isFunction': isFunction,\n    'isObject': isObject,\n    'isNumber': isNumber,\n    'isElement': isElement,\n    'isArray': isArray,\n    'version': version,\n    'isDate': isDate,\n    'callbacks': {$$counter: 0},\n    'getTestability': getTestability,\n    'reloadWithDebugInfo': reloadWithDebugInfo,\n    '$$minErr': minErr,\n    '$$csp': csp,\n    '$$encodeUriSegment': encodeUriSegment,\n    '$$encodeUriQuery': encodeUriQuery,\n    '$$lowercase': lowercase,\n    '$$stringify': stringify,\n    '$$uppercase': uppercase\n  });\n\n  angularModule = setupModuleLoader(window);\n\n  angularModule('ng', ['ngLocale'], ['$provide',\n    function ngModule($provide) {\n      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.\n      $provide.provider({\n        $$sanitizeUri: $$SanitizeUriProvider\n      });\n      $provide.provider('$compile', $CompileProvider).\n        directive({\n            a: htmlAnchorDirective,\n            input: inputDirective,\n            textarea: inputDirective,\n            form: formDirective,\n            script: scriptDirective,\n            select: selectDirective,\n            option: optionDirective,\n            ngBind: ngBindDirective,\n            ngBindHtml: ngBindHtmlDirective,\n            ngBindTemplate: ngBindTemplateDirective,\n            ngClass: ngClassDirective,\n            ngClassEven: ngClassEvenDirective,\n            ngClassOdd: ngClassOddDirective,\n            ngCloak: ngCloakDirective,\n            ngController: ngControllerDirective,\n            ngForm: ngFormDirective,\n            ngHide: ngHideDirective,\n            ngIf: ngIfDirective,\n            ngInclude: ngIncludeDirective,\n            ngInit: ngInitDirective,\n            ngNonBindable: ngNonBindableDirective,\n            ngPluralize: ngPluralizeDirective,\n            ngRef: ngRefDirective,\n            ngRepeat: ngRepeatDirective,\n            ngShow: ngShowDirective,\n            ngStyle: ngStyleDirective,\n            ngSwitch: ngSwitchDirective,\n            ngSwitchWhen: ngSwitchWhenDirective,\n            ngSwitchDefault: ngSwitchDefaultDirective,\n            ngOptions: ngOptionsDirective,\n            ngTransclude: ngTranscludeDirective,\n            ngModel: ngModelDirective,\n            ngList: ngListDirective,\n            ngChange: ngChangeDirective,\n            pattern: patternDirective,\n            ngPattern: patternDirective,\n            required: requiredDirective,\n            ngRequired: requiredDirective,\n            minlength: minlengthDirective,\n            ngMinlength: minlengthDirective,\n            maxlength: maxlengthDirective,\n            ngMaxlength: maxlengthDirective,\n            ngValue: ngValueDirective,\n            ngModelOptions: ngModelOptionsDirective\n        }).\n        directive({\n          ngInclude: ngIncludeFillContentDirective,\n          input: hiddenInputBrowserCacheDirective\n        }).\n        directive(ngAttributeAliasDirectives).\n        directive(ngEventDirectives);\n      $provide.provider({\n        $anchorScroll: $AnchorScrollProvider,\n        $animate: $AnimateProvider,\n        $animateCss: $CoreAnimateCssProvider,\n        $$animateJs: $$CoreAnimateJsProvider,\n        $$animateQueue: $$CoreAnimateQueueProvider,\n        $$AnimateRunner: $$AnimateRunnerFactoryProvider,\n        $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider,\n        $browser: $BrowserProvider,\n        $cacheFactory: $CacheFactoryProvider,\n        $controller: $ControllerProvider,\n        $document: $DocumentProvider,\n        $$isDocumentHidden: $$IsDocumentHiddenProvider,\n        $exceptionHandler: $ExceptionHandlerProvider,\n        $filter: $FilterProvider,\n        $$forceReflow: $$ForceReflowProvider,\n        $interpolate: $InterpolateProvider,\n        $interval: $IntervalProvider,\n        $$intervalFactory: $$IntervalFactoryProvider,\n        $http: $HttpProvider,\n        $httpParamSerializer: $HttpParamSerializerProvider,\n        $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider,\n        $httpBackend: $HttpBackendProvider,\n        $xhrFactory: $xhrFactoryProvider,\n        $jsonpCallbacks: $jsonpCallbacksProvider,\n        $location: $LocationProvider,\n        $log: $LogProvider,\n        $parse: $ParseProvider,\n        $rootScope: $RootScopeProvider,\n        $q: $QProvider,\n        $$q: $$QProvider,\n        $sce: $SceProvider,\n        $sceDelegate: $SceDelegateProvider,\n        $sniffer: $SnifferProvider,\n        $$taskTrackerFactory: $$TaskTrackerFactoryProvider,\n        $templateCache: $TemplateCacheProvider,\n        $templateRequest: $TemplateRequestProvider,\n        $$testability: $$TestabilityProvider,\n        $timeout: $TimeoutProvider,\n        $window: $WindowProvider,\n        $$rAF: $$RAFProvider,\n        $$jqLite: $$jqLiteProvider,\n        $$Map: $$MapProvider,\n        $$cookieReader: $$CookieReaderProvider\n      });\n    }\n  ])\n  .info({ angularVersion: '1.7.8' });\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* global\n  JQLitePrototype: true,\n  BOOLEAN_ATTR: true,\n  ALIASED_ATTR: true\n*/\n\n//////////////////////////////////\n//JQLite\n//////////////////////////////////\n\n/**\n * @ngdoc function\n * @name angular.element\n * @module ng\n * @kind function\n *\n * @description\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\n *\n * If jQuery is available, `angular.element` is an alias for the\n * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`\n * delegates to AngularJS's built-in subset of jQuery, called \"jQuery lite\" or **jqLite**.\n *\n * jqLite is a tiny, API-compatible subset of jQuery that allows\n * AngularJS to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most\n * commonly needed functionality with the goal of having a very small footprint.\n *\n * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the\n * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a\n * specific version of jQuery if multiple versions exist on the page.\n *\n * <div class=\"alert alert-info\">**Note:** All element references in AngularJS are always wrapped with jQuery or\n * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.</div>\n *\n * <div class=\"alert alert-warning\">**Note:** Keep in mind that this function will not find elements\n * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)`\n * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.</div>\n *\n * ## AngularJS's jqLite\n * jqLite provides only the following jQuery methods:\n *\n * - [`addClass()`](http://api.jquery.com/addClass/) - Does not support a function as first argument\n * - [`after()`](http://api.jquery.com/after/)\n * - [`append()`](http://api.jquery.com/append/) - Contrary to jQuery, this doesn't clone elements\n *   so will not work correctly when invoked on a jqLite object containing more than one DOM node\n * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters\n * - [`bind()`](http://api.jquery.com/bind/) (_deprecated_, use [`on()`](http://api.jquery.com/on/)) - Does not support namespaces, selectors or eventData\n * - [`children()`](http://api.jquery.com/children/) - Does not support selectors\n * - [`clone()`](http://api.jquery.com/clone/)\n * - [`contents()`](http://api.jquery.com/contents/)\n * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`.\n *   As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing.\n * - [`data()`](http://api.jquery.com/data/)\n * - [`detach()`](http://api.jquery.com/detach/)\n * - [`empty()`](http://api.jquery.com/empty/)\n * - [`eq()`](http://api.jquery.com/eq/)\n * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name\n * - [`hasClass()`](http://api.jquery.com/hasClass/)\n * - [`html()`](http://api.jquery.com/html/)\n * - [`next()`](http://api.jquery.com/next/) - Does not support selectors\n * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData\n * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter\n * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors\n * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors\n * - [`prepend()`](http://api.jquery.com/prepend/)\n * - [`prop()`](http://api.jquery.com/prop/)\n * - [`ready()`](http://api.jquery.com/ready/) (_deprecated_, use `angular.element(callback)` instead of `angular.element(document).ready(callback)`)\n * - [`remove()`](http://api.jquery.com/remove/)\n * - [`removeAttr()`](http://api.jquery.com/removeAttr/) - Does not support multiple attributes\n * - [`removeClass()`](http://api.jquery.com/removeClass/) - Does not support a function as first argument\n * - [`removeData()`](http://api.jquery.com/removeData/)\n * - [`replaceWith()`](http://api.jquery.com/replaceWith/)\n * - [`text()`](http://api.jquery.com/text/)\n * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument\n * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers\n * - [`unbind()`](http://api.jquery.com/unbind/) (_deprecated_, use [`off()`](http://api.jquery.com/off/)) - Does not support namespaces or event object as parameter\n * - [`val()`](http://api.jquery.com/val/)\n * - [`wrap()`](http://api.jquery.com/wrap/)\n *\n * ## jQuery/jqLite Extras\n * AngularJS also provides the following additional methods and events to both jQuery and jqLite:\n *\n * ### Events\n * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event\n *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM\n *    element before it is removed.\n *\n * ### Methods\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\n *   `'ngModel'`).\n * - `injector()` - retrieves the injector of the current element or its parent.\n * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current\n *   element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to\n *   be enabled.\n * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the\n *   current element. This getter should be used only on elements that contain a directive which starts a new isolate\n *   scope. Calling `scope()` on this element always returns the original non-isolate scope.\n *   Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled.\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\n *   parent element is reached.\n *\n * @knownIssue You cannot spy on `angular.element` if you are using Jasmine version 1.x. See\n * https://github.com/angular/angular.js/issues/14251 for more information.\n *\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\n * @returns {Object} jQuery object.\n */\n\nJQLite.expando = 'ng339';\n\nvar jqCache = JQLite.cache = {},\n    jqId = 1;\n\n/*\n * !!! This is an undocumented \"private\" function !!!\n */\nJQLite._data = function(node) {\n  //jQuery always returns an object on cache miss\n  return this.cache[node[this.expando]] || {};\n};\n\nfunction jqNextId() { return ++jqId; }\n\n\nvar DASH_LOWERCASE_REGEXP = /-([a-z])/g;\nvar MS_HACK_REGEXP = /^-ms-/;\nvar MOUSE_EVENT_MAP = { mouseleave: 'mouseout', mouseenter: 'mouseover' };\nvar jqLiteMinErr = minErr('jqLite');\n\n/**\n * Converts kebab-case to camelCase.\n * There is also a special case for the ms prefix starting with a lowercase letter.\n * @param name Name to normalize\n */\nfunction cssKebabToCamel(name) {\n    return kebabToCamel(name.replace(MS_HACK_REGEXP, 'ms-'));\n}\n\nfunction fnCamelCaseReplace(all, letter) {\n  return letter.toUpperCase();\n}\n\n/**\n * Converts kebab-case to camelCase.\n * @param name Name to normalize\n */\nfunction kebabToCamel(name) {\n  return name\n    .replace(DASH_LOWERCASE_REGEXP, fnCamelCaseReplace);\n}\n\nvar SINGLE_TAG_REGEXP = /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/;\nvar HTML_REGEXP = /<|&#?\\w+;/;\nvar TAG_NAME_REGEXP = /<([\\w:-]+)/;\nvar XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi;\n\nvar wrapMap = {\n  'option': [1, '<select multiple=\"multiple\">', '</select>'],\n\n  'thead': [1, '<table>', '</table>'],\n  'col': [2, '<table><colgroup>', '</colgroup></table>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n  'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],\n  '_default': [0, '', '']\n};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction jqLiteIsTextNode(html) {\n  return !HTML_REGEXP.test(html);\n}\n\nfunction jqLiteAcceptsData(node) {\n  // The window object can accept data but has no nodeType\n  // Otherwise we are only interested in elements (1) and documents (9)\n  var nodeType = node.nodeType;\n  return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;\n}\n\nfunction jqLiteHasData(node) {\n  for (var key in jqCache[node.ng339]) {\n    return true;\n  }\n  return false;\n}\n\nfunction jqLiteBuildFragment(html, context) {\n  var tmp, tag, wrap,\n      fragment = context.createDocumentFragment(),\n      nodes = [], i;\n\n  if (jqLiteIsTextNode(html)) {\n    // Convert non-html into a text node\n    nodes.push(context.createTextNode(html));\n  } else {\n    // Convert html into DOM nodes\n    tmp = fragment.appendChild(context.createElement('div'));\n    tag = (TAG_NAME_REGEXP.exec(html) || ['', ''])[1].toLowerCase();\n    wrap = wrapMap[tag] || wrapMap._default;\n    tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, '<$1></$2>') + wrap[2];\n\n    // Descend through wrappers to the right content\n    i = wrap[0];\n    while (i--) {\n      tmp = tmp.lastChild;\n    }\n\n    nodes = concat(nodes, tmp.childNodes);\n\n    tmp = fragment.firstChild;\n    tmp.textContent = '';\n  }\n\n  // Remove wrapper from fragment\n  fragment.textContent = '';\n  fragment.innerHTML = ''; // Clear inner HTML\n  forEach(nodes, function(node) {\n    fragment.appendChild(node);\n  });\n\n  return fragment;\n}\n\nfunction jqLiteParseHTML(html, context) {\n  context = context || window.document;\n  var parsed;\n\n  if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {\n    return [context.createElement(parsed[1])];\n  }\n\n  if ((parsed = jqLiteBuildFragment(html, context))) {\n    return parsed.childNodes;\n  }\n\n  return [];\n}\n\nfunction jqLiteWrapNode(node, wrapper) {\n  var parent = node.parentNode;\n\n  if (parent) {\n    parent.replaceChild(wrapper, node);\n  }\n\n  wrapper.appendChild(node);\n}\n\n\n// IE9-11 has no method \"contains\" in SVG element and in Node.prototype. Bug #10259.\nvar jqLiteContains = window.Node.prototype.contains || /** @this */ function(arg) {\n  // eslint-disable-next-line no-bitwise\n  return !!(this.compareDocumentPosition(arg) & 16);\n};\n\n/////////////////////////////////////////////\nfunction JQLite(element) {\n  if (element instanceof JQLite) {\n    return element;\n  }\n\n  var argIsString;\n\n  if (isString(element)) {\n    element = trim(element);\n    argIsString = true;\n  }\n  if (!(this instanceof JQLite)) {\n    if (argIsString && element.charAt(0) !== '<') {\n      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');\n    }\n    return new JQLite(element);\n  }\n\n  if (argIsString) {\n    jqLiteAddNodes(this, jqLiteParseHTML(element));\n  } else if (isFunction(element)) {\n    jqLiteReady(element);\n  } else {\n    jqLiteAddNodes(this, element);\n  }\n}\n\nfunction jqLiteClone(element) {\n  return element.cloneNode(true);\n}\n\nfunction jqLiteDealoc(element, onlyDescendants) {\n  if (!onlyDescendants && jqLiteAcceptsData(element)) jqLite.cleanData([element]);\n\n  if (element.querySelectorAll) {\n    jqLite.cleanData(element.querySelectorAll('*'));\n  }\n}\n\nfunction isEmptyObject(obj) {\n  var name;\n\n  for (name in obj) {\n    return false;\n  }\n  return true;\n}\n\nfunction removeIfEmptyData(element) {\n  var expandoId = element.ng339;\n  var expandoStore = expandoId && jqCache[expandoId];\n\n  var events = expandoStore && expandoStore.events;\n  var data = expandoStore && expandoStore.data;\n\n  if ((!data || isEmptyObject(data)) && (!events || isEmptyObject(events))) {\n    delete jqCache[expandoId];\n    element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it\n  }\n}\n\nfunction jqLiteOff(element, type, fn, unsupported) {\n  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');\n\n  var expandoStore = jqLiteExpandoStore(element);\n  var events = expandoStore && expandoStore.events;\n  var handle = expandoStore && expandoStore.handle;\n\n  if (!handle) return; //no listeners registered\n\n  if (!type) {\n    for (type in events) {\n      if (type !== '$destroy') {\n        element.removeEventListener(type, handle);\n      }\n      delete events[type];\n    }\n  } else {\n\n    var removeHandler = function(type) {\n      var listenerFns = events[type];\n      if (isDefined(fn)) {\n        arrayRemove(listenerFns || [], fn);\n      }\n      if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) {\n        element.removeEventListener(type, handle);\n        delete events[type];\n      }\n    };\n\n    forEach(type.split(' '), function(type) {\n      removeHandler(type);\n      if (MOUSE_EVENT_MAP[type]) {\n        removeHandler(MOUSE_EVENT_MAP[type]);\n      }\n    });\n  }\n\n  removeIfEmptyData(element);\n}\n\nfunction jqLiteRemoveData(element, name) {\n  var expandoId = element.ng339;\n  var expandoStore = expandoId && jqCache[expandoId];\n\n  if (expandoStore) {\n    if (name) {\n      delete expandoStore.data[name];\n    } else {\n      expandoStore.data = {};\n    }\n\n    removeIfEmptyData(element);\n  }\n}\n\n\nfunction jqLiteExpandoStore(element, createIfNecessary) {\n  var expandoId = element.ng339,\n      expandoStore = expandoId && jqCache[expandoId];\n\n  if (createIfNecessary && !expandoStore) {\n    element.ng339 = expandoId = jqNextId();\n    expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined};\n  }\n\n  return expandoStore;\n}\n\n\nfunction jqLiteData(element, key, value) {\n  if (jqLiteAcceptsData(element)) {\n    var prop;\n\n    var isSimpleSetter = isDefined(value);\n    var isSimpleGetter = !isSimpleSetter && key && !isObject(key);\n    var massGetter = !key;\n    var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter);\n    var data = expandoStore && expandoStore.data;\n\n    if (isSimpleSetter) { // data('key', value)\n      data[kebabToCamel(key)] = value;\n    } else {\n      if (massGetter) {  // data()\n        return data;\n      } else {\n        if (isSimpleGetter) { // data('key')\n          // don't force creation of expandoStore if it doesn't exist yet\n          return data && data[kebabToCamel(key)];\n        } else { // mass-setter: data({key1: val1, key2: val2})\n          for (prop in key) {\n            data[kebabToCamel(prop)] = key[prop];\n          }\n        }\n      }\n    }\n  }\n}\n\nfunction jqLiteHasClass(element, selector) {\n  if (!element.getAttribute) return false;\n  return ((' ' + (element.getAttribute('class') || '') + ' ').replace(/[\\n\\t]/g, ' ').\n      indexOf(' ' + selector + ' ') > -1);\n}\n\nfunction jqLiteRemoveClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\n                            .replace(/[\\n\\t]/g, ' ');\n    var newClasses = existingClasses;\n\n    forEach(cssClasses.split(' '), function(cssClass) {\n      cssClass = trim(cssClass);\n      newClasses = newClasses.replace(' ' + cssClass + ' ', ' ');\n    });\n\n    if (newClasses !== existingClasses) {\n      element.setAttribute('class', trim(newClasses));\n    }\n  }\n}\n\nfunction jqLiteAddClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\n                            .replace(/[\\n\\t]/g, ' ');\n    var newClasses = existingClasses;\n\n    forEach(cssClasses.split(' '), function(cssClass) {\n      cssClass = trim(cssClass);\n      if (newClasses.indexOf(' ' + cssClass + ' ') === -1) {\n        newClasses += cssClass + ' ';\n      }\n    });\n\n    if (newClasses !== existingClasses) {\n      element.setAttribute('class', trim(newClasses));\n    }\n  }\n}\n\n\nfunction jqLiteAddNodes(root, elements) {\n  // THIS CODE IS VERY HOT. Don't make changes without benchmarking.\n\n  if (elements) {\n\n    // if a Node (the most common case)\n    if (elements.nodeType) {\n      root[root.length++] = elements;\n    } else {\n      var length = elements.length;\n\n      // if an Array or NodeList and not a Window\n      if (typeof length === 'number' && elements.window !== elements) {\n        if (length) {\n          for (var i = 0; i < length; i++) {\n            root[root.length++] = elements[i];\n          }\n        }\n      } else {\n        root[root.length++] = elements;\n      }\n    }\n  }\n}\n\n\nfunction jqLiteController(element, name) {\n  return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller');\n}\n\nfunction jqLiteInheritedData(element, name, value) {\n  // if element is the document object work with the html element instead\n  // this makes $(document).scope() possible\n  if (element.nodeType === NODE_TYPE_DOCUMENT) {\n    element = element.documentElement;\n  }\n  var names = isArray(name) ? name : [name];\n\n  while (element) {\n    for (var i = 0, ii = names.length; i < ii; i++) {\n      if (isDefined(value = jqLite.data(element, names[i]))) return value;\n    }\n\n    // If dealing with a document fragment node with a host element, and no parent, use the host\n    // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM\n    // to lookup parent controllers.\n    element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host);\n  }\n}\n\nfunction jqLiteEmpty(element) {\n  jqLiteDealoc(element, true);\n  while (element.firstChild) {\n    element.removeChild(element.firstChild);\n  }\n}\n\nfunction jqLiteRemove(element, keepData) {\n  if (!keepData) jqLiteDealoc(element);\n  var parent = element.parentNode;\n  if (parent) parent.removeChild(element);\n}\n\n\nfunction jqLiteDocumentLoaded(action, win) {\n  win = win || window;\n  if (win.document.readyState === 'complete') {\n    // Force the action to be run async for consistent behavior\n    // from the action's point of view\n    // i.e. it will definitely not be in a $apply\n    win.setTimeout(action);\n  } else {\n    // No need to unbind this handler as load is only ever called once\n    jqLite(win).on('load', action);\n  }\n}\n\nfunction jqLiteReady(fn) {\n  function trigger() {\n    window.document.removeEventListener('DOMContentLoaded', trigger);\n    window.removeEventListener('load', trigger);\n    fn();\n  }\n\n  // check if document is already loaded\n  if (window.document.readyState === 'complete') {\n    window.setTimeout(fn);\n  } else {\n    // We can not use jqLite since we are not done loading and jQuery could be loaded later.\n\n    // Works for modern browsers and IE9\n    window.document.addEventListener('DOMContentLoaded', trigger);\n\n    // Fallback to window.onload for others\n    window.addEventListener('load', trigger);\n  }\n}\n\n//////////////////////////////////////////\n// Functions which are declared directly.\n//////////////////////////////////////////\nvar JQLitePrototype = JQLite.prototype = {\n  ready: jqLiteReady,\n  toString: function() {\n    var value = [];\n    forEach(this, function(e) { value.push('' + e);});\n    return '[' + value.join(', ') + ']';\n  },\n\n  eq: function(index) {\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\n  },\n\n  length: 0,\n  push: push,\n  sort: [].sort,\n  splice: [].splice\n};\n\n//////////////////////////////////////////\n// Functions iterating getter/setters.\n// these functions return self on setter and\n// value on get.\n//////////////////////////////////////////\nvar BOOLEAN_ATTR = {};\nforEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {\n  BOOLEAN_ATTR[lowercase(value)] = value;\n});\nvar BOOLEAN_ELEMENTS = {};\nforEach('input,select,option,textarea,button,form,details'.split(','), function(value) {\n  BOOLEAN_ELEMENTS[value] = true;\n});\nvar ALIASED_ATTR = {\n  'ngMinlength': 'minlength',\n  'ngMaxlength': 'maxlength',\n  'ngMin': 'min',\n  'ngMax': 'max',\n  'ngPattern': 'pattern',\n  'ngStep': 'step'\n};\n\nfunction getBooleanAttrName(element, name) {\n  // check dom last since we will most likely fail on name\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\n\n  // booleanAttr is here twice to minimize DOM access\n  return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;\n}\n\nfunction getAliasedAttrName(name) {\n  return ALIASED_ATTR[name];\n}\n\nforEach({\n  data: jqLiteData,\n  removeData: jqLiteRemoveData,\n  hasData: jqLiteHasData,\n  cleanData: function jqLiteCleanData(nodes) {\n    for (var i = 0, ii = nodes.length; i < ii; i++) {\n      jqLiteRemoveData(nodes[i]);\n      jqLiteOff(nodes[i]);\n    }\n  }\n}, function(fn, name) {\n  JQLite[name] = fn;\n});\n\nforEach({\n  data: jqLiteData,\n  inheritedData: jqLiteInheritedData,\n\n  scope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);\n  },\n\n  isolateScope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');\n  },\n\n  controller: jqLiteController,\n\n  injector: function(element) {\n    return jqLiteInheritedData(element, '$injector');\n  },\n\n  removeAttr: function(element, name) {\n    element.removeAttribute(name);\n  },\n\n  hasClass: jqLiteHasClass,\n\n  css: function(element, name, value) {\n    name = cssKebabToCamel(name);\n\n    if (isDefined(value)) {\n      element.style[name] = value;\n    } else {\n      return element.style[name];\n    }\n  },\n\n  attr: function(element, name, value) {\n    var ret;\n    var nodeType = element.nodeType;\n    if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT ||\n      !element.getAttribute) {\n      return;\n    }\n\n    var lowercasedName = lowercase(name);\n    var isBooleanAttr = BOOLEAN_ATTR[lowercasedName];\n\n    if (isDefined(value)) {\n      // setter\n\n      if (value === null || (value === false && isBooleanAttr)) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, isBooleanAttr ? lowercasedName : value);\n      }\n    } else {\n      // getter\n\n      ret = element.getAttribute(name);\n\n      if (isBooleanAttr && ret !== null) {\n        ret = lowercasedName;\n      }\n      // Normalize non-existing attributes to undefined (as jQuery).\n      return ret === null ? undefined : ret;\n    }\n  },\n\n  prop: function(element, name, value) {\n    if (isDefined(value)) {\n      element[name] = value;\n    } else {\n      return element[name];\n    }\n  },\n\n  text: (function() {\n    getText.$dv = '';\n    return getText;\n\n    function getText(element, value) {\n      if (isUndefined(value)) {\n        var nodeType = element.nodeType;\n        return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : '';\n      }\n      element.textContent = value;\n    }\n  })(),\n\n  val: function(element, value) {\n    if (isUndefined(value)) {\n      if (element.multiple && nodeName_(element) === 'select') {\n        var result = [];\n        forEach(element.options, function(option) {\n          if (option.selected) {\n            result.push(option.value || option.text);\n          }\n        });\n        return result;\n      }\n      return element.value;\n    }\n    element.value = value;\n  },\n\n  html: function(element, value) {\n    if (isUndefined(value)) {\n      return element.innerHTML;\n    }\n    jqLiteDealoc(element, true);\n    element.innerHTML = value;\n  },\n\n  empty: jqLiteEmpty\n}, function(fn, name) {\n  /**\n   * Properties: writes return selection, reads return first value\n   */\n  JQLite.prototype[name] = function(arg1, arg2) {\n    var i, key;\n    var nodeCount = this.length;\n\n    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\n    // in a way that survives minification.\n    // jqLiteEmpty takes no arguments but is a setter.\n    if (fn !== jqLiteEmpty &&\n        (isUndefined((fn.length === 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) {\n      if (isObject(arg1)) {\n\n        // we are a write, but the object properties are the key/values\n        for (i = 0; i < nodeCount; i++) {\n          if (fn === jqLiteData) {\n            // data() takes the whole object in jQuery\n            fn(this[i], arg1);\n          } else {\n            for (key in arg1) {\n              fn(this[i], key, arg1[key]);\n            }\n          }\n        }\n        // return self for chaining\n        return this;\n      } else {\n        // we are a read, so read the first child.\n        // TODO: do we still need this?\n        var value = fn.$dv;\n        // Only if we have $dv do we iterate over all, otherwise it is just the first element.\n        var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount;\n        for (var j = 0; j < jj; j++) {\n          var nodeValue = fn(this[j], arg1, arg2);\n          value = value ? value + nodeValue : nodeValue;\n        }\n        return value;\n      }\n    } else {\n      // we are a write, so apply to all children\n      for (i = 0; i < nodeCount; i++) {\n        fn(this[i], arg1, arg2);\n      }\n      // return self for chaining\n      return this;\n    }\n  };\n});\n\nfunction createEventHandler(element, events) {\n  var eventHandler = function(event, type) {\n    // jQuery specific api\n    event.isDefaultPrevented = function() {\n      return event.defaultPrevented;\n    };\n\n    var eventFns = events[type || event.type];\n    var eventFnsLength = eventFns ? eventFns.length : 0;\n\n    if (!eventFnsLength) return;\n\n    if (isUndefined(event.immediatePropagationStopped)) {\n      var originalStopImmediatePropagation = event.stopImmediatePropagation;\n      event.stopImmediatePropagation = function() {\n        event.immediatePropagationStopped = true;\n\n        if (event.stopPropagation) {\n          event.stopPropagation();\n        }\n\n        if (originalStopImmediatePropagation) {\n          originalStopImmediatePropagation.call(event);\n        }\n      };\n    }\n\n    event.isImmediatePropagationStopped = function() {\n      return event.immediatePropagationStopped === true;\n    };\n\n    // Some events have special handlers that wrap the real handler\n    var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper;\n\n    // Copy event handlers in case event handlers array is modified during execution.\n    if ((eventFnsLength > 1)) {\n      eventFns = shallowCopy(eventFns);\n    }\n\n    for (var i = 0; i < eventFnsLength; i++) {\n      if (!event.isImmediatePropagationStopped()) {\n        handlerWrapper(element, event, eventFns[i]);\n      }\n    }\n  };\n\n  // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all\n  //       events on `element`\n  eventHandler.elem = element;\n  return eventHandler;\n}\n\nfunction defaultHandlerWrapper(element, event, handler) {\n  handler.call(element, event);\n}\n\nfunction specialMouseHandlerWrapper(target, event, handler) {\n  // Refer to jQuery's implementation of mouseenter & mouseleave\n  // Read about mouseenter and mouseleave:\n  // http://www.quirksmode.org/js/events_mouse.html#link8\n  var related = event.relatedTarget;\n  // For mousenter/leave call the handler if related is outside the target.\n  // NB: No relatedTarget if the mouse left/entered the browser window\n  if (!related || (related !== target && !jqLiteContains.call(target, related))) {\n    handler.call(target, event);\n  }\n}\n\n//////////////////////////////////////////\n// Functions iterating traversal.\n// These functions chain results into a single\n// selector.\n//////////////////////////////////////////\nforEach({\n  removeData: jqLiteRemoveData,\n\n  on: function jqLiteOn(element, type, fn, unsupported) {\n    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');\n\n    // Do not add event handlers to non-elements because they will not be cleaned up.\n    if (!jqLiteAcceptsData(element)) {\n      return;\n    }\n\n    var expandoStore = jqLiteExpandoStore(element, true);\n    var events = expandoStore.events;\n    var handle = expandoStore.handle;\n\n    if (!handle) {\n      handle = expandoStore.handle = createEventHandler(element, events);\n    }\n\n    // http://jsperf.com/string-indexof-vs-split\n    var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type];\n    var i = types.length;\n\n    var addHandler = function(type, specialHandlerWrapper, noEventListener) {\n      var eventFns = events[type];\n\n      if (!eventFns) {\n        eventFns = events[type] = [];\n        eventFns.specialHandlerWrapper = specialHandlerWrapper;\n        if (type !== '$destroy' && !noEventListener) {\n          element.addEventListener(type, handle);\n        }\n      }\n\n      eventFns.push(fn);\n    };\n\n    while (i--) {\n      type = types[i];\n      if (MOUSE_EVENT_MAP[type]) {\n        addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper);\n        addHandler(type, undefined, true);\n      } else {\n        addHandler(type);\n      }\n    }\n  },\n\n  off: jqLiteOff,\n\n  one: function(element, type, fn) {\n    element = jqLite(element);\n\n    //add the listener twice so that when it is called\n    //you can remove the original function and still be\n    //able to call element.off(ev, fn) normally\n    element.on(type, function onFn() {\n      element.off(type, fn);\n      element.off(type, onFn);\n    });\n    element.on(type, fn);\n  },\n\n  replaceWith: function(element, replaceNode) {\n    var index, parent = element.parentNode;\n    jqLiteDealoc(element);\n    forEach(new JQLite(replaceNode), function(node) {\n      if (index) {\n        parent.insertBefore(node, index.nextSibling);\n      } else {\n        parent.replaceChild(node, element);\n      }\n      index = node;\n    });\n  },\n\n  children: function(element) {\n    var children = [];\n    forEach(element.childNodes, function(element) {\n      if (element.nodeType === NODE_TYPE_ELEMENT) {\n        children.push(element);\n      }\n    });\n    return children;\n  },\n\n  contents: function(element) {\n    return element.contentDocument || element.childNodes || [];\n  },\n\n  append: function(element, node) {\n    var nodeType = element.nodeType;\n    if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return;\n\n    node = new JQLite(node);\n\n    for (var i = 0, ii = node.length; i < ii; i++) {\n      var child = node[i];\n      element.appendChild(child);\n    }\n  },\n\n  prepend: function(element, node) {\n    if (element.nodeType === NODE_TYPE_ELEMENT) {\n      var index = element.firstChild;\n      forEach(new JQLite(node), function(child) {\n        element.insertBefore(child, index);\n      });\n    }\n  },\n\n  wrap: function(element, wrapNode) {\n    jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]);\n  },\n\n  remove: jqLiteRemove,\n\n  detach: function(element) {\n    jqLiteRemove(element, true);\n  },\n\n  after: function(element, newElement) {\n    var index = element, parent = element.parentNode;\n\n    if (parent) {\n      newElement = new JQLite(newElement);\n\n      for (var i = 0, ii = newElement.length; i < ii; i++) {\n        var node = newElement[i];\n        parent.insertBefore(node, index.nextSibling);\n        index = node;\n      }\n    }\n  },\n\n  addClass: jqLiteAddClass,\n  removeClass: jqLiteRemoveClass,\n\n  toggleClass: function(element, selector, condition) {\n    if (selector) {\n      forEach(selector.split(' '), function(className) {\n        var classCondition = condition;\n        if (isUndefined(classCondition)) {\n          classCondition = !jqLiteHasClass(element, className);\n        }\n        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);\n      });\n    }\n  },\n\n  parent: function(element) {\n    var parent = element.parentNode;\n    return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null;\n  },\n\n  next: function(element) {\n    return element.nextElementSibling;\n  },\n\n  find: function(element, selector) {\n    if (element.getElementsByTagName) {\n      return element.getElementsByTagName(selector);\n    } else {\n      return [];\n    }\n  },\n\n  clone: jqLiteClone,\n\n  triggerHandler: function(element, event, extraParameters) {\n\n    var dummyEvent, eventFnsCopy, handlerArgs;\n    var eventName = event.type || event;\n    var expandoStore = jqLiteExpandoStore(element);\n    var events = expandoStore && expandoStore.events;\n    var eventFns = events && events[eventName];\n\n    if (eventFns) {\n      // Create a dummy event to pass to the handlers\n      dummyEvent = {\n        preventDefault: function() { this.defaultPrevented = true; },\n        isDefaultPrevented: function() { return this.defaultPrevented === true; },\n        stopImmediatePropagation: function() { this.immediatePropagationStopped = true; },\n        isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; },\n        stopPropagation: noop,\n        type: eventName,\n        target: element\n      };\n\n      // If a custom event was provided then extend our dummy event with it\n      if (event.type) {\n        dummyEvent = extend(dummyEvent, event);\n      }\n\n      // Copy event handlers in case event handlers array is modified during execution.\n      eventFnsCopy = shallowCopy(eventFns);\n      handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];\n\n      forEach(eventFnsCopy, function(fn) {\n        if (!dummyEvent.isImmediatePropagationStopped()) {\n          fn.apply(element, handlerArgs);\n        }\n      });\n    }\n  }\n}, function(fn, name) {\n  /**\n   * chaining functions\n   */\n  JQLite.prototype[name] = function(arg1, arg2, arg3) {\n    var value;\n\n    for (var i = 0, ii = this.length; i < ii; i++) {\n      if (isUndefined(value)) {\n        value = fn(this[i], arg1, arg2, arg3);\n        if (isDefined(value)) {\n          // any function which returns a value needs to be wrapped\n          value = jqLite(value);\n        }\n      } else {\n        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));\n      }\n    }\n    return isDefined(value) ? value : this;\n  };\n});\n\n// bind legacy bind/unbind to on/off\nJQLite.prototype.bind = JQLite.prototype.on;\nJQLite.prototype.unbind = JQLite.prototype.off;\n\n\n// Provider for private $$jqLite service\n/** @this */\nfunction $$jqLiteProvider() {\n  this.$get = function $$jqLite() {\n    return extend(JQLite, {\n      hasClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteHasClass(node, classes);\n      },\n      addClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteAddClass(node, classes);\n      },\n      removeClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteRemoveClass(node, classes);\n      }\n    });\n  };\n}\n\n/**\n * Computes a hash of an 'obj'.\n * Hash of a:\n *  string is string\n *  number is number as string\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\n *         that is also assigned to the $$hashKey property of the object.\n *\n * @param obj\n * @returns {string} hash string such that the same input will have the same hash string.\n *         The resulting string key is in 'type:hashKey' format.\n */\nfunction hashKey(obj, nextUidFn) {\n  var key = obj && obj.$$hashKey;\n\n  if (key) {\n    if (typeof key === 'function') {\n      key = obj.$$hashKey();\n    }\n    return key;\n  }\n\n  var objType = typeof obj;\n  if (objType === 'function' || (objType === 'object' && obj !== null)) {\n    key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)();\n  } else {\n    key = objType + ':' + obj;\n  }\n\n  return key;\n}\n\n// A minimal ES2015 Map implementation.\n// Should be bug/feature equivalent to the native implementations of supported browsers\n// (for the features required in Angular).\n// See https://kangax.github.io/compat-table/es6/#test-Map\nvar nanKey = Object.create(null);\nfunction NgMapShim() {\n  this._keys = [];\n  this._values = [];\n  this._lastKey = NaN;\n  this._lastIndex = -1;\n}\nNgMapShim.prototype = {\n  _idx: function(key) {\n    if (key !== this._lastKey) {\n      this._lastKey = key;\n      this._lastIndex = this._keys.indexOf(key);\n    }\n    return this._lastIndex;\n  },\n  _transformKey: function(key) {\n    return isNumberNaN(key) ? nanKey : key;\n  },\n  get: function(key) {\n    key = this._transformKey(key);\n    var idx = this._idx(key);\n    if (idx !== -1) {\n      return this._values[idx];\n    }\n  },\n  has: function(key) {\n    key = this._transformKey(key);\n    var idx = this._idx(key);\n    return idx !== -1;\n  },\n  set: function(key, value) {\n    key = this._transformKey(key);\n    var idx = this._idx(key);\n    if (idx === -1) {\n      idx = this._lastIndex = this._keys.length;\n    }\n    this._keys[idx] = key;\n    this._values[idx] = value;\n\n    // Support: IE11\n    // Do not `return this` to simulate the partial IE11 implementation\n  },\n  delete: function(key) {\n    key = this._transformKey(key);\n    var idx = this._idx(key);\n    if (idx === -1) {\n      return false;\n    }\n    this._keys.splice(idx, 1);\n    this._values.splice(idx, 1);\n    this._lastKey = NaN;\n    this._lastIndex = -1;\n    return true;\n  }\n};\n\n// For now, always use `NgMapShim`, even if `window.Map` is available. Some native implementations\n// are still buggy (often in subtle ways) and can cause hard-to-debug failures. When native `Map`\n// implementations get more stable, we can reconsider switching to `window.Map` (when available).\nvar NgMap = NgMapShim;\n\nvar $$MapProvider = [/** @this */function() {\n  this.$get = [function() {\n    return NgMap;\n  }];\n}];\n\n/**\n * @ngdoc function\n * @module ng\n * @name angular.injector\n * @kind function\n *\n * @description\n * Creates an injector object that can be used for retrieving services as well as for\n * dependency injection (see {@link guide/di dependency injection}).\n *\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\n *     {@link angular.module}. The `ng` module must be explicitly added.\n * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which\n *     disallows argument name annotation inference.\n * @returns {injector} Injector object. See {@link auto.$injector $injector}.\n *\n * @example\n * Typical usage\n * ```js\n *   // create an injector\n *   var $injector = angular.injector(['ng']);\n *\n *   // use the injector to kick off your application\n *   // use the type inference to auto inject arguments, or use implicit injection\n *   $injector.invoke(function($rootScope, $compile, $document) {\n *     $compile($document)($rootScope);\n *     $rootScope.$digest();\n *   });\n * ```\n *\n * Sometimes you want to get access to the injector of a currently running AngularJS app\n * from outside AngularJS. Perhaps, you want to inject and compile some markup after the\n * application has been bootstrapped. You can do this using the extra `injector()` added\n * to JQuery/jqLite elements. See {@link angular.element}.\n *\n * *This is fairly rare but could be the case if a third party library is injecting the\n * markup.*\n *\n * In the following example a new block of HTML containing a `ng-controller`\n * directive is added to the end of the document body by JQuery. We then compile and link\n * it into the current AngularJS scope.\n *\n * ```js\n * var $div = $('<div ng-controller=\"MyCtrl\">{{content.label}}</div>');\n * $(document.body).append($div);\n *\n * angular.element(document).injector().invoke(function($compile) {\n *   var scope = angular.element($div).scope();\n *   $compile($div)(scope);\n * });\n * ```\n */\n\n\n/**\n * @ngdoc module\n * @name auto\n * @installation\n * @description\n *\n * Implicit module which gets automatically added to each {@link auto.$injector $injector}.\n */\n\nvar ARROW_ARG = /^([^(]+?)=>/;\nvar FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nvar $injectorMinErr = minErr('$injector');\n\nfunction stringifyFn(fn) {\n  return Function.prototype.toString.call(fn);\n}\n\nfunction extractArgs(fn) {\n  var fnText = stringifyFn(fn).replace(STRIP_COMMENTS, ''),\n      args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n  return args;\n}\n\nfunction anonFn(fn) {\n  // For anonymous functions, showing at the very least the function signature can help in\n  // debugging.\n  var args = extractArgs(fn);\n  if (args) {\n    return 'function(' + (args[1] || '').replace(/[\\s\\r\\n]+/, ' ') + ')';\n  }\n  return 'fn';\n}\n\nfunction annotate(fn, strictDi, name) {\n  var $inject,\n      argDecl,\n      last;\n\n  if (typeof fn === 'function') {\n    if (!($inject = fn.$inject)) {\n      $inject = [];\n      if (fn.length) {\n        if (strictDi) {\n          if (!isString(name) || !name) {\n            name = fn.name || anonFn(fn);\n          }\n          throw $injectorMinErr('strictdi',\n            '{0} is not using explicit annotation and cannot be invoked in strict mode', name);\n        }\n        argDecl = extractArgs(fn);\n        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {\n          arg.replace(FN_ARG, function(all, underscore, name) {\n            $inject.push(name);\n          });\n        });\n      }\n      fn.$inject = $inject;\n    }\n  } else if (isArray(fn)) {\n    last = fn.length - 1;\n    assertArgFn(fn[last], 'fn');\n    $inject = fn.slice(0, last);\n  } else {\n    assertArgFn(fn, 'fn', true);\n  }\n  return $inject;\n}\n\n///////////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $injector\n *\n * @description\n *\n * `$injector` is used to retrieve object instances as defined by\n * {@link auto.$provide provider}, instantiate types, invoke methods,\n * and load modules.\n *\n * The following always holds true:\n *\n * ```js\n *   var $injector = angular.injector();\n *   expect($injector.get('$injector')).toBe($injector);\n *   expect($injector.invoke(function($injector) {\n *     return $injector;\n *   })).toBe($injector);\n * ```\n *\n * ## Injection Function Annotation\n *\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\n * following are all valid ways of annotating function with injection arguments and are equivalent.\n *\n * ```js\n *   // inferred (only works if code not minified/obfuscated)\n *   $injector.invoke(function(serviceA){});\n *\n *   // annotated\n *   function explicit(serviceA) {};\n *   explicit.$inject = ['serviceA'];\n *   $injector.invoke(explicit);\n *\n *   // inline\n *   $injector.invoke(['serviceA', function(serviceA){}]);\n * ```\n *\n * ### Inference\n *\n * In JavaScript calling `toString()` on a function returns the function definition. The definition\n * can then be parsed and the function arguments can be extracted. This method of discovering\n * annotations is disallowed when the injector is in strict mode.\n * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the\n * argument names.\n *\n * ### `$inject` Annotation\n * By adding an `$inject` property onto a function the injection parameters can be specified.\n *\n * ### Inline\n * As an array of injection names, where the last item in the array is the function to call.\n */\n\n/**\n * @ngdoc property\n * @name $injector#modules\n * @type {Object}\n * @description\n * A hash containing all the modules that have been loaded into the\n * $injector.\n *\n * You can use this property to find out information about a module via the\n * {@link angular.Module#info `myModule.info(...)`} method.\n *\n * For example:\n *\n * ```\n * var info = $injector.modules['ngAnimate'].info();\n * ```\n *\n * **Do not use this property to attempt to modify the modules after the application\n * has been bootstrapped.**\n */\n\n\n/**\n * @ngdoc method\n * @name $injector#get\n *\n * @description\n * Return an instance of the service.\n *\n * @param {string} name The name of the instance to retrieve.\n * @param {string=} caller An optional string to provide the origin of the function call for error messages.\n * @return {*} The instance.\n */\n\n/**\n * @ngdoc method\n * @name $injector#invoke\n *\n * @description\n * Invoke the method and supply the method arguments from the `$injector`.\n *\n * @param {Function|Array.<string|Function>} fn The injectable function to invoke. Function parameters are\n *   injected according to the {@link guide/di $inject Annotation} rules.\n * @param {Object=} self The `this` for the invoked method.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n *                         object first, before the `$injector` is consulted.\n * @returns {*} the value returned by the invoked `fn` function.\n */\n\n/**\n * @ngdoc method\n * @name $injector#has\n *\n * @description\n * Allows the user to query if the particular service exists.\n *\n * @param {string} name Name of the service to query.\n * @returns {boolean} `true` if injector has given service.\n */\n\n/**\n * @ngdoc method\n * @name $injector#instantiate\n * @description\n * Create a new instance of JS type. The method takes a constructor function, invokes the new\n * operator, and supplies all of the arguments to the constructor function as specified by the\n * constructor annotation.\n *\n * @param {Function} Type Annotated constructor function.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n * object first, before the `$injector` is consulted.\n * @returns {Object} new instance of `Type`.\n */\n\n/**\n * @ngdoc method\n * @name $injector#annotate\n *\n * @description\n * Returns an array of service names which the function is requesting for injection. This API is\n * used by the injector to determine which services need to be injected into the function when the\n * function is invoked. There are three ways in which the function can be annotated with the needed\n * dependencies.\n *\n * #### Argument names\n *\n * The simplest form is to extract the dependencies from the arguments of the function. This is done\n * by converting the function into a string using `toString()` method and extracting the argument\n * names.\n * ```js\n *   // Given\n *   function MyController($scope, $route) {\n *     // ...\n *   }\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * You can disallow this method by using strict injection mode.\n *\n * This method does not work with code minification / obfuscation. For this reason the following\n * annotation strategies are supported.\n *\n * #### The `$inject` property\n *\n * If a function has an `$inject` property and its value is an array of strings, then the strings\n * represent names of services to be injected into the function.\n * ```js\n *   // Given\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\n *     // ...\n *   }\n *   // Define function dependencies\n *   MyController['$inject'] = ['$scope', '$route'];\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * #### The array notation\n *\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property\n * is very inconvenient. In these situations using the array notation to specify the dependencies in\n * a way that survives minification is a better choice:\n *\n * ```js\n *   // We wish to write this (not minification / obfuscation safe)\n *   injector.invoke(function($compile, $rootScope) {\n *     // ...\n *   });\n *\n *   // We are forced to write break inlining\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\n *     // ...\n *   };\n *   tmpFn.$inject = ['$compile', '$rootScope'];\n *   injector.invoke(tmpFn);\n *\n *   // To better support inline function the inline annotation is supported\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\n *     // ...\n *   }]);\n *\n *   // Therefore\n *   expect(injector.annotate(\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\n *    ).toEqual(['$compile', '$rootScope']);\n * ```\n *\n * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to\n * be retrieved as described above.\n *\n * @param {boolean=} [strictDi=false] Disallow argument name annotation inference.\n *\n * @returns {Array.<string>} The names of the services which the function requires.\n */\n/**\n * @ngdoc method\n * @name $injector#loadNewModules\n *\n * @description\n *\n * **This is a dangerous API, which you use at your own risk!**\n *\n * Add the specified modules to the current injector.\n *\n * This method will add each of the injectables to the injector and execute all of the config and run\n * blocks for each module passed to the method.\n *\n * If a module has already been loaded into the injector then it will not be loaded again.\n *\n * * The application developer is responsible for loading the code containing the modules; and for\n * ensuring that lazy scripts are not downloaded and executed more often that desired.\n * * Previously compiled HTML will not be affected by newly loaded directives, filters and components.\n * * Modules cannot be unloaded.\n *\n * You can use {@link $injector#modules `$injector.modules`} to check whether a module has been loaded\n * into the injector, which may indicate whether the script has been executed already.\n *\n * @example\n * Here is an example of loading a bundle of modules, with a utility method called `getScript`:\n *\n * ```javascript\n * app.factory('loadModule', function($injector) {\n *   return function loadModule(moduleName, bundleUrl) {\n *     return getScript(bundleUrl).then(function() { $injector.loadNewModules([moduleName]); });\n *   };\n * })\n * ```\n *\n * @param {Array<String|Function|Array>=} mods an array of modules to load into the application.\n *     Each item in the array should be the name of a predefined module or a (DI annotated)\n *     function that will be invoked by the injector as a `config` block.\n *     See: {@link angular.module modules}\n */\n\n\n/**\n * @ngdoc service\n * @name $provide\n *\n * @description\n *\n * The {@link auto.$provide $provide} service has a number of methods for registering components\n * with the {@link auto.$injector $injector}. Many of these functions are also exposed on\n * {@link angular.Module}.\n *\n * An AngularJS **service** is a singleton object created by a **service factory**.  These **service\n * factories** are functions which, in turn, are created by a **service provider**.\n * The **service providers** are constructor functions. When instantiated they must contain a\n * property called `$get`, which holds the **service factory** function.\n *\n * When you request a service, the {@link auto.$injector $injector} is responsible for finding the\n * correct **service provider**, instantiating it and then calling its `$get` **service factory**\n * function to get the instance of the **service**.\n *\n * Often services have no configuration options and there is no need to add methods to the service\n * provider.  The provider will be no more than a constructor function with a `$get` property. For\n * these cases the {@link auto.$provide $provide} service has additional helper methods to register\n * services without specifying a provider.\n *\n * * {@link auto.$provide#provider provider(name, provider)} - registers a **service provider** with the\n *     {@link auto.$injector $injector}\n * * {@link auto.$provide#constant constant(name, obj)} - registers a value/object that can be accessed by\n *     providers and services.\n * * {@link auto.$provide#value value(name, obj)} - registers a value/object that can only be accessed by\n *     services, not providers.\n * * {@link auto.$provide#factory factory(name, fn)} - registers a service **factory function**\n *     that will be wrapped in a **service provider** object, whose `$get` property will contain the\n *     given factory function.\n * * {@link auto.$provide#service service(name, Fn)} - registers a **constructor function**\n *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate\n *      a new object using the given constructor function.\n * * {@link auto.$provide#decorator decorator(name, decorFn)} - registers a **decorator function** that\n *      will be able to modify or replace the implementation of another service.\n *\n * See the individual methods for more information and examples.\n */\n\n/**\n * @ngdoc method\n * @name $provide#provider\n * @description\n *\n * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions\n * are constructor functions, whose instances are responsible for \"providing\" a factory for a\n * service.\n *\n * Service provider names start with the name of the service they provide followed by `Provider`.\n * For example, the {@link ng.$log $log} service has a provider called\n * {@link ng.$logProvider $logProvider}.\n *\n * Service provider objects can have additional methods which allow configuration of the provider\n * and its service. Importantly, you can configure what kind of service is created by the `$get`\n * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a\n * method {@link ng.$logProvider#debugEnabled debugEnabled}\n * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the\n * console or not.\n *\n * It is possible to inject other providers into the provider function,\n * but the injected provider must have been defined before the one that requires it.\n *\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name +\n                        'Provider'` key.\n * @param {(Object|function())} provider If the provider is:\n *\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\n *     {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.\n *   - `Constructor`: a new instance of the provider will be created using\n *     {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.\n *\n * @returns {Object} registered provider instance\n\n * @example\n *\n * The following example shows how to create a simple event tracking service and register it using\n * {@link auto.$provide#provider $provide.provider()}.\n *\n * ```js\n *  // Define the eventTracker provider\n *  function EventTrackerProvider() {\n *    var trackingUrl = '/track';\n *\n *    // A provider method for configuring where the tracked events should been saved\n *    this.setTrackingUrl = function(url) {\n *      trackingUrl = url;\n *    };\n *\n *    // The service factory function\n *    this.$get = ['$http', function($http) {\n *      var trackedEvents = {};\n *      return {\n *        // Call this to track an event\n *        event: function(event) {\n *          var count = trackedEvents[event] || 0;\n *          count += 1;\n *          trackedEvents[event] = count;\n *          return count;\n *        },\n *        // Call this to save the tracked events to the trackingUrl\n *        save: function() {\n *          $http.post(trackingUrl, trackedEvents);\n *        }\n *      };\n *    }];\n *  }\n *\n *  describe('eventTracker', function() {\n *    var postSpy;\n *\n *    beforeEach(module(function($provide) {\n *      // Register the eventTracker provider\n *      $provide.provider('eventTracker', EventTrackerProvider);\n *    }));\n *\n *    beforeEach(module(function(eventTrackerProvider) {\n *      // Configure eventTracker provider\n *      eventTrackerProvider.setTrackingUrl('/custom-track');\n *    }));\n *\n *    it('tracks events', inject(function(eventTracker) {\n *      expect(eventTracker.event('login')).toEqual(1);\n *      expect(eventTracker.event('login')).toEqual(2);\n *    }));\n *\n *    it('saves to the tracking url', inject(function(eventTracker, $http) {\n *      postSpy = spyOn($http, 'post');\n *      eventTracker.event('login');\n *      eventTracker.save();\n *      expect(postSpy).toHaveBeenCalled();\n *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');\n *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');\n *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });\n *    }));\n *  });\n * ```\n */\n\n/**\n * @ngdoc method\n * @name $provide#factory\n * @description\n *\n * Register a **service factory**, which will be called to return the service instance.\n * This is short for registering a service where its provider consists of only a `$get` property,\n * which is the given service factory function.\n * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to\n * configure your service in a provider.\n *\n * @param {string} name The name of the instance.\n * @param {Function|Array.<string|Function>} $getFn The injectable $getFn for the instance creation.\n *                      Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service\n * ```js\n *   $provide.factory('ping', ['$http', function($http) {\n *     return function ping() {\n *       return $http.send('/ping');\n *     };\n *   }]);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#service\n * @description\n *\n * Register a **service constructor**, which will be invoked with `new` to create the service\n * instance.\n * This is short for registering a service where its provider's `$get` property is a factory\n * function that returns an instance instantiated by the injector from the service constructor\n * function.\n *\n * Internally it looks a bit like this:\n *\n * ```\n * {\n *   $get: function() {\n *     return $injector.instantiate(constructor);\n *   }\n * }\n * ```\n *\n *\n * You should use {@link auto.$provide#service $provide.service(class)} if you define your service\n * as a type/class.\n *\n * @param {string} name The name of the instance.\n * @param {Function|Array.<string|Function>} constructor An injectable class (constructor function)\n *     that will be instantiated.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service using\n * {@link auto.$provide#service $provide.service(class)}.\n * ```js\n *   var Ping = function($http) {\n *     this.$http = $http;\n *   };\n *\n *   Ping.$inject = ['$http'];\n *\n *   Ping.prototype.send = function() {\n *     return this.$http.get('/ping');\n *   };\n *   $provide.service('ping', Ping);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping.send();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#value\n * @description\n *\n * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a\n * number, an array, an object or a function. This is short for registering a service where its\n * provider's `$get` property is a factory function that takes no arguments and returns the **value\n * service**. That also means it is not possible to inject other services into a value service.\n *\n * Value services are similar to constant services, except that they cannot be injected into a\n * module configuration function (see {@link angular.Module#config}) but they can be overridden by\n * an AngularJS {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the instance.\n * @param {*} value The value.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here are some examples of creating value services.\n * ```js\n *   $provide.value('ADMIN_USER', 'admin');\n *\n *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });\n *\n *   $provide.value('halfOf', function(value) {\n *     return value / 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#constant\n * @description\n *\n * Register a **constant service** with the {@link auto.$injector $injector}, such as a string,\n * a number, an array, an object or a function. Like the {@link auto.$provide#value value}, it is not\n * possible to inject other services into a constant.\n *\n * But unlike {@link auto.$provide#value value}, a constant can be\n * injected into a module configuration function (see {@link angular.Module#config}) and it cannot\n * be overridden by an AngularJS {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the constant.\n * @param {*} value The constant value.\n * @returns {Object} registered instance\n *\n * @example\n * Here a some examples of creating constants:\n * ```js\n *   $provide.constant('SHARD_HEIGHT', 306);\n *\n *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);\n *\n *   $provide.constant('double', function(value) {\n *     return value * 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#decorator\n * @description\n *\n * Register a **decorator function** with the {@link auto.$injector $injector}. A decorator function\n * intercepts the creation of a service, allowing it to override or modify the behavior of the\n * service. The return value of the decorator function may be the original service, or a new service\n * that replaces (or wraps and delegates to) the original service.\n *\n * You can find out more about using decorators in the {@link guide/decorators} guide.\n *\n * @param {string} name The name of the service to decorate.\n * @param {Function|Array.<string|Function>} decorator This function will be invoked when the service needs to be\n *    provided and should return the decorated service instance. The function is called using\n *    the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.\n *    Local injection arguments:\n *\n *    * `$delegate` - The original service instance, which can be replaced, monkey patched, configured,\n *      decorated or delegated to.\n *\n * @example\n * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting\n * calls to {@link ng.$log#error $log.warn()}.\n * ```js\n *   $provide.decorator('$log', ['$delegate', function($delegate) {\n *     $delegate.warn = $delegate.error;\n *     return $delegate;\n *   }]);\n * ```\n */\n\n\nfunction createInjector(modulesToLoad, strictDi) {\n  strictDi = (strictDi === true);\n  var INSTANTIATING = {},\n      providerSuffix = 'Provider',\n      path = [],\n      loadedModules = new NgMap(),\n      providerCache = {\n        $provide: {\n            provider: supportObject(provider),\n            factory: supportObject(factory),\n            service: supportObject(service),\n            value: supportObject(value),\n            constant: supportObject(constant),\n            decorator: decorator\n          }\n      },\n      providerInjector = (providerCache.$injector =\n          createInternalInjector(providerCache, function(serviceName, caller) {\n            if (angular.isString(caller)) {\n              path.push(caller);\n            }\n            throw $injectorMinErr('unpr', 'Unknown provider: {0}', path.join(' <- '));\n          })),\n      instanceCache = {},\n      protoInstanceInjector =\n          createInternalInjector(instanceCache, function(serviceName, caller) {\n            var provider = providerInjector.get(serviceName + providerSuffix, caller);\n            return instanceInjector.invoke(\n                provider.$get, provider, undefined, serviceName);\n          }),\n      instanceInjector = protoInstanceInjector;\n\n  providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) };\n  instanceInjector.modules = providerInjector.modules = createMap();\n  var runBlocks = loadModules(modulesToLoad);\n  instanceInjector = protoInstanceInjector.get('$injector');\n  instanceInjector.strictDi = strictDi;\n  forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); });\n\n  instanceInjector.loadNewModules = function(mods) {\n    forEach(loadModules(mods), function(fn) { if (fn) instanceInjector.invoke(fn); });\n  };\n\n\n  return instanceInjector;\n\n  ////////////////////////////////////\n  // $provider\n  ////////////////////////////////////\n\n  function supportObject(delegate) {\n    return function(key, value) {\n      if (isObject(key)) {\n        forEach(key, reverseParams(delegate));\n      } else {\n        return delegate(key, value);\n      }\n    };\n  }\n\n  function provider(name, provider_) {\n    assertNotHasOwnProperty(name, 'service');\n    if (isFunction(provider_) || isArray(provider_)) {\n      provider_ = providerInjector.instantiate(provider_);\n    }\n    if (!provider_.$get) {\n      throw $injectorMinErr('pget', 'Provider \\'{0}\\' must define $get factory method.', name);\n    }\n    return (providerCache[name + providerSuffix] = provider_);\n  }\n\n  function enforceReturnValue(name, factory) {\n    return /** @this */ function enforcedReturnValue() {\n      var result = instanceInjector.invoke(factory, this);\n      if (isUndefined(result)) {\n        throw $injectorMinErr('undef', 'Provider \\'{0}\\' must return a value from $get factory method.', name);\n      }\n      return result;\n    };\n  }\n\n  function factory(name, factoryFn, enforce) {\n    return provider(name, {\n      $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn\n    });\n  }\n\n  function service(name, constructor) {\n    return factory(name, ['$injector', function($injector) {\n      return $injector.instantiate(constructor);\n    }]);\n  }\n\n  function value(name, val) { return factory(name, valueFn(val), false); }\n\n  function constant(name, value) {\n    assertNotHasOwnProperty(name, 'constant');\n    providerCache[name] = value;\n    instanceCache[name] = value;\n  }\n\n  function decorator(serviceName, decorFn) {\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\n        orig$get = origProvider.$get;\n\n    origProvider.$get = function() {\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\n    };\n  }\n\n  ////////////////////////////////////\n  // Module Loading\n  ////////////////////////////////////\n  function loadModules(modulesToLoad) {\n    assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array');\n    var runBlocks = [], moduleFn;\n    forEach(modulesToLoad, function(module) {\n      if (loadedModules.get(module)) return;\n      loadedModules.set(module, true);\n\n      function runInvokeQueue(queue) {\n        var i, ii;\n        for (i = 0, ii = queue.length; i < ii; i++) {\n          var invokeArgs = queue[i],\n              provider = providerInjector.get(invokeArgs[0]);\n\n          provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\n        }\n      }\n\n      try {\n        if (isString(module)) {\n          moduleFn = angularModule(module);\n          instanceInjector.modules[module] = moduleFn;\n          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\n          runInvokeQueue(moduleFn._invokeQueue);\n          runInvokeQueue(moduleFn._configBlocks);\n        } else if (isFunction(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else if (isArray(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else {\n          assertArgFn(module, 'module');\n        }\n      } catch (e) {\n        if (isArray(module)) {\n          module = module[module.length - 1];\n        }\n        if (e.message && e.stack && e.stack.indexOf(e.message) === -1) {\n          // Safari & FF's stack traces don't contain error.message content\n          // unlike those of Chrome and IE\n          // So if stack doesn't contain message, we create a new string that contains both.\n          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.\n          // eslint-disable-next-line no-ex-assign\n          e = e.message + '\\n' + e.stack;\n        }\n        throw $injectorMinErr('modulerr', 'Failed to instantiate module {0} due to:\\n{1}',\n                  module, e.stack || e.message || e);\n      }\n    });\n    return runBlocks;\n  }\n\n  ////////////////////////////////////\n  // internal Injector\n  ////////////////////////////////////\n\n  function createInternalInjector(cache, factory) {\n\n    function getService(serviceName, caller) {\n      if (cache.hasOwnProperty(serviceName)) {\n        if (cache[serviceName] === INSTANTIATING) {\n          throw $injectorMinErr('cdep', 'Circular dependency found: {0}',\n                    serviceName + ' <- ' + path.join(' <- '));\n        }\n        return cache[serviceName];\n      } else {\n        try {\n          path.unshift(serviceName);\n          cache[serviceName] = INSTANTIATING;\n          cache[serviceName] = factory(serviceName, caller);\n          return cache[serviceName];\n        } catch (err) {\n          if (cache[serviceName] === INSTANTIATING) {\n            delete cache[serviceName];\n          }\n          throw err;\n        } finally {\n          path.shift();\n        }\n      }\n    }\n\n\n    function injectionArgs(fn, locals, serviceName) {\n      var args = [],\n          $inject = createInjector.$$annotate(fn, strictDi, serviceName);\n\n      for (var i = 0, length = $inject.length; i < length; i++) {\n        var key = $inject[i];\n        if (typeof key !== 'string') {\n          throw $injectorMinErr('itkn',\n                  'Incorrect injection token! Expected service name as string, got {0}', key);\n        }\n        args.push(locals && locals.hasOwnProperty(key) ? locals[key] :\n                                                         getService(key, serviceName));\n      }\n      return args;\n    }\n\n    function isClass(func) {\n      // Support: IE 9-11 only\n      // IE 9-11 do not support classes and IE9 leaks with the code below.\n      if (msie || typeof func !== 'function') {\n        return false;\n      }\n      var result = func.$$ngIsClass;\n      if (!isBoolean(result)) {\n        result = func.$$ngIsClass = /^class\\b/.test(stringifyFn(func));\n      }\n      return result;\n    }\n\n    function invoke(fn, self, locals, serviceName) {\n      if (typeof locals === 'string') {\n        serviceName = locals;\n        locals = null;\n      }\n\n      var args = injectionArgs(fn, locals, serviceName);\n      if (isArray(fn)) {\n        fn = fn[fn.length - 1];\n      }\n\n      if (!isClass(fn)) {\n        // http://jsperf.com/angularjs-invoke-apply-vs-switch\n        // #5388\n        return fn.apply(self, args);\n      } else {\n        args.unshift(null);\n        return new (Function.prototype.bind.apply(fn, args))();\n      }\n    }\n\n\n    function instantiate(Type, locals, serviceName) {\n      // Check if Type is annotated and use just the given function at n-1 as parameter\n      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);\n      var ctor = (isArray(Type) ? Type[Type.length - 1] : Type);\n      var args = injectionArgs(Type, locals, serviceName);\n      // Empty object at position 0 is ignored for invocation with `new`, but required.\n      args.unshift(null);\n      return new (Function.prototype.bind.apply(ctor, args))();\n    }\n\n\n    return {\n      invoke: invoke,\n      instantiate: instantiate,\n      get: getService,\n      annotate: createInjector.$$annotate,\n      has: function(name) {\n        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);\n      }\n    };\n  }\n}\n\ncreateInjector.$$annotate = annotate;\n\n/**\n * @ngdoc provider\n * @name $anchorScrollProvider\n * @this\n *\n * @description\n * Use `$anchorScrollProvider` to disable automatic scrolling whenever\n * {@link ng.$location#hash $location.hash()} changes.\n */\nfunction $AnchorScrollProvider() {\n\n  var autoScrollingEnabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $anchorScrollProvider#disableAutoScrolling\n   *\n   * @description\n   * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to\n   * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />\n   * Use this method to disable automatic scrolling.\n   *\n   * If automatic scrolling is disabled, one must explicitly call\n   * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the\n   * current hash.\n   */\n  this.disableAutoScrolling = function() {\n    autoScrollingEnabled = false;\n  };\n\n  /**\n   * @ngdoc service\n   * @name $anchorScroll\n   * @kind function\n   * @requires $window\n   * @requires $location\n   * @requires $rootScope\n   *\n   * @description\n   * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the\n   * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified\n   * in the\n   * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#an-indicated-part-of-the-document).\n   *\n   * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to\n   * match any anchor whenever it changes. This can be disabled by calling\n   * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}.\n   *\n   * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a\n   * vertical scroll-offset (either fixed or dynamic).\n   *\n   * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of\n   *                       {@link ng.$location#hash $location.hash()} will be used.\n   *\n   * @property {(number|function|jqLite)} yOffset\n   * If set, specifies a vertical scroll-offset. This is often useful when there are fixed\n   * positioned elements at the top of the page, such as navbars, headers etc.\n   *\n   * `yOffset` can be specified in various ways:\n   * - **number**: A fixed number of pixels to be used as offset.<br /><br />\n   * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return\n   *   a number representing the offset (in pixels).<br /><br />\n   * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from\n   *   the top of the page to the element's bottom will be used as offset.<br />\n   *   **Note**: The element will be taken into account only as long as its `position` is set to\n   *   `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust\n   *   their height and/or positioning according to the viewport's size.\n   *\n   * <br />\n   * <div class=\"alert alert-warning\">\n   * In order for `yOffset` to work properly, scrolling should take place on the document's root and\n   * not some child element.\n   * </div>\n   *\n   * @example\n     <example module=\"anchorScrollExample\" name=\"anchor-scroll\">\n       <file name=\"index.html\">\n         <div id=\"scrollArea\" ng-controller=\"ScrollController\">\n           <a ng-click=\"gotoBottom()\">Go to bottom</a>\n           <a id=\"bottom\"></a> You're at the bottom!\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollExample', [])\n           .controller('ScrollController', ['$scope', '$location', '$anchorScroll',\n             function($scope, $location, $anchorScroll) {\n               $scope.gotoBottom = function() {\n                 // set the location.hash to the id of\n                 // the element you wish to scroll to.\n                 $location.hash('bottom');\n\n                 // call $anchorScroll()\n                 $anchorScroll();\n               };\n             }]);\n       </file>\n       <file name=\"style.css\">\n         #scrollArea {\n           height: 280px;\n           overflow: auto;\n         }\n\n         #bottom {\n           display: block;\n           margin-top: 2000px;\n         }\n       </file>\n     </example>\n   *\n   * <hr />\n   * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value).\n   * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details.\n   *\n   * @example\n     <example module=\"anchorScrollOffsetExample\" name=\"anchor-scroll-offset\">\n       <file name=\"index.html\">\n         <div class=\"fixed-header\" ng-controller=\"headerCtrl\">\n           <a href=\"\" ng-click=\"gotoAnchor(x)\" ng-repeat=\"x in [1,2,3,4,5]\">\n             Go to anchor {{x}}\n           </a>\n         </div>\n         <div id=\"anchor{{x}}\" class=\"anchor\" ng-repeat=\"x in [1,2,3,4,5]\">\n           Anchor {{x}} of 5\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollOffsetExample', [])\n           .run(['$anchorScroll', function($anchorScroll) {\n             $anchorScroll.yOffset = 50;   // always scroll by 50 extra pixels\n           }])\n           .controller('headerCtrl', ['$anchorScroll', '$location', '$scope',\n             function($anchorScroll, $location, $scope) {\n               $scope.gotoAnchor = function(x) {\n                 var newHash = 'anchor' + x;\n                 if ($location.hash() !== newHash) {\n                   // set the $location.hash to `newHash` and\n                   // $anchorScroll will automatically scroll to it\n                   $location.hash('anchor' + x);\n                 } else {\n                   // call $anchorScroll() explicitly,\n                   // since $location.hash hasn't changed\n                   $anchorScroll();\n                 }\n               };\n             }\n           ]);\n       </file>\n       <file name=\"style.css\">\n         body {\n           padding-top: 50px;\n         }\n\n         .anchor {\n           border: 2px dashed DarkOrchid;\n           padding: 10px 10px 200px 10px;\n         }\n\n         .fixed-header {\n           background-color: rgba(0, 0, 0, 0.2);\n           height: 50px;\n           position: fixed;\n           top: 0; left: 0; right: 0;\n         }\n\n         .fixed-header > a {\n           display: inline-block;\n           margin: 5px 15px;\n         }\n       </file>\n     </example>\n   */\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\n    var document = $window.document;\n\n    // Helper function to get first anchor from a NodeList\n    // (using `Array#some()` instead of `angular#forEach()` since it's more performant\n    //  and working in all supported browsers.)\n    function getFirstAnchor(list) {\n      var result = null;\n      Array.prototype.some.call(list, function(element) {\n        if (nodeName_(element) === 'a') {\n          result = element;\n          return true;\n        }\n      });\n      return result;\n    }\n\n    function getYOffset() {\n\n      var offset = scroll.yOffset;\n\n      if (isFunction(offset)) {\n        offset = offset();\n      } else if (isElement(offset)) {\n        var elem = offset[0];\n        var style = $window.getComputedStyle(elem);\n        if (style.position !== 'fixed') {\n          offset = 0;\n        } else {\n          offset = elem.getBoundingClientRect().bottom;\n        }\n      } else if (!isNumber(offset)) {\n        offset = 0;\n      }\n\n      return offset;\n    }\n\n    function scrollTo(elem) {\n      if (elem) {\n        elem.scrollIntoView();\n\n        var offset = getYOffset();\n\n        if (offset) {\n          // `offset` is the number of pixels we should scroll UP in order to align `elem` properly.\n          // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the\n          // top of the viewport.\n          //\n          // IF the number of pixels from the top of `elem` to the end of the page's content is less\n          // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some\n          // way down the page.\n          //\n          // This is often the case for elements near the bottom of the page.\n          //\n          // In such cases we do not need to scroll the whole `offset` up, just the difference between\n          // the top of the element and the offset, which is enough to align the top of `elem` at the\n          // desired position.\n          var elemTop = elem.getBoundingClientRect().top;\n          $window.scrollBy(0, elemTop - offset);\n        }\n      } else {\n        $window.scrollTo(0, 0);\n      }\n    }\n\n    function scroll(hash) {\n      // Allow numeric hashes\n      hash = isString(hash) ? hash : isNumber(hash) ? hash.toString() : $location.hash();\n      var elm;\n\n      // empty hash, scroll to the top of the page\n      if (!hash) scrollTo(null);\n\n      // element with given id\n      else if ((elm = document.getElementById(hash))) scrollTo(elm);\n\n      // first anchor with given name :-D\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm);\n\n      // no element and hash === 'top', scroll to the top of the page\n      else if (hash === 'top') scrollTo(null);\n    }\n\n    // does not scroll when user clicks on anchor link that is currently on\n    // (no url change, no $location.hash() change), browser native does scroll\n    if (autoScrollingEnabled) {\n      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},\n        function autoScrollWatchAction(newVal, oldVal) {\n          // skip the initial scroll if $location.hash is empty\n          if (newVal === oldVal && newVal === '') return;\n\n          jqLiteDocumentLoaded(function() {\n            $rootScope.$evalAsync(scroll);\n          });\n        });\n    }\n\n    return scroll;\n  }];\n}\n\nvar $animateMinErr = minErr('$animate');\nvar ELEMENT_NODE = 1;\nvar NG_ANIMATE_CLASSNAME = 'ng-animate';\n\nfunction mergeClasses(a,b) {\n  if (!a && !b) return '';\n  if (!a) return b;\n  if (!b) return a;\n  if (isArray(a)) a = a.join(' ');\n  if (isArray(b)) b = b.join(' ');\n  return a + ' ' + b;\n}\n\nfunction extractElementNode(element) {\n  for (var i = 0; i < element.length; i++) {\n    var elm = element[i];\n    if (elm.nodeType === ELEMENT_NODE) {\n      return elm;\n    }\n  }\n}\n\nfunction splitClasses(classes) {\n  if (isString(classes)) {\n    classes = classes.split(' ');\n  }\n\n  // Use createMap() to prevent class assumptions involving property names in\n  // Object.prototype\n  var obj = createMap();\n  forEach(classes, function(klass) {\n    // sometimes the split leaves empty string values\n    // incase extra spaces were applied to the options\n    if (klass.length) {\n      obj[klass] = true;\n    }\n  });\n  return obj;\n}\n\n// if any other type of options value besides an Object value is\n// passed into the $animate.method() animation then this helper code\n// will be run which will ignore it. While this patch is not the\n// greatest solution to this, a lot of existing plugins depend on\n// $animate to either call the callback (< 1.2) or return a promise\n// that can be changed. This helper function ensures that the options\n// are wiped clean incase a callback function is provided.\nfunction prepareAnimateOptions(options) {\n  return isObject(options)\n      ? options\n      : {};\n}\n\nvar $$CoreAnimateJsProvider = /** @this */ function() {\n  this.$get = noop;\n};\n\n// this is prefixed with Core since it conflicts with\n// the animateQueueProvider defined in ngAnimate/animateQueue.js\nvar $$CoreAnimateQueueProvider = /** @this */ function() {\n  var postDigestQueue = new NgMap();\n  var postDigestElements = [];\n\n  this.$get = ['$$AnimateRunner', '$rootScope',\n       function($$AnimateRunner,   $rootScope) {\n    return {\n      enabled: noop,\n      on: noop,\n      off: noop,\n      pin: noop,\n\n      push: function(element, event, options, domOperation) {\n        if (domOperation) {\n          domOperation();\n        }\n\n        options = options || {};\n        if (options.from) {\n          element.css(options.from);\n        }\n        if (options.to) {\n          element.css(options.to);\n        }\n\n        if (options.addClass || options.removeClass) {\n          addRemoveClassesPostDigest(element, options.addClass, options.removeClass);\n        }\n\n        var runner = new $$AnimateRunner();\n\n        // since there are no animations to run the runner needs to be\n        // notified that the animation call is complete.\n        runner.complete();\n        return runner;\n      }\n    };\n\n\n    function updateData(data, classes, value) {\n      var changed = false;\n      if (classes) {\n        classes = isString(classes) ? classes.split(' ') :\n                  isArray(classes) ? classes : [];\n        forEach(classes, function(className) {\n          if (className) {\n            changed = true;\n            data[className] = value;\n          }\n        });\n      }\n      return changed;\n    }\n\n    function handleCSSClassChanges() {\n      forEach(postDigestElements, function(element) {\n        var data = postDigestQueue.get(element);\n        if (data) {\n          var existing = splitClasses(element.attr('class'));\n          var toAdd = '';\n          var toRemove = '';\n          forEach(data, function(status, className) {\n            var hasClass = !!existing[className];\n            if (status !== hasClass) {\n              if (status) {\n                toAdd += (toAdd.length ? ' ' : '') + className;\n              } else {\n                toRemove += (toRemove.length ? ' ' : '') + className;\n              }\n            }\n          });\n\n          forEach(element, function(elm) {\n            if (toAdd) {\n              jqLiteAddClass(elm, toAdd);\n            }\n            if (toRemove) {\n              jqLiteRemoveClass(elm, toRemove);\n            }\n          });\n          postDigestQueue.delete(element);\n        }\n      });\n      postDigestElements.length = 0;\n    }\n\n\n    function addRemoveClassesPostDigest(element, add, remove) {\n      var data = postDigestQueue.get(element) || {};\n\n      var classesAdded = updateData(data, add, true);\n      var classesRemoved = updateData(data, remove, false);\n\n      if (classesAdded || classesRemoved) {\n\n        postDigestQueue.set(element, data);\n        postDigestElements.push(element);\n\n        if (postDigestElements.length === 1) {\n          $rootScope.$$postDigest(handleCSSClassChanges);\n        }\n      }\n    }\n  }];\n};\n\n/**\n * @ngdoc provider\n * @name $animateProvider\n *\n * @description\n * Default implementation of $animate that doesn't perform any animations, instead just\n * synchronously performs DOM updates and resolves the returned runner promise.\n *\n * In order to enable animations the `ngAnimate` module has to be loaded.\n *\n * To see the functional implementation check out `src/ngAnimate/animate.js`.\n */\nvar $AnimateProvider = ['$provide', /** @this */ function($provide) {\n  var provider = this;\n  var classNameFilter = null;\n  var customFilter = null;\n\n  this.$$registeredAnimations = Object.create(null);\n\n   /**\n   * @ngdoc method\n   * @name $animateProvider#register\n   *\n   * @description\n   * Registers a new injectable animation factory function. The factory function produces the\n   * animation object which contains callback functions for each event that is expected to be\n   * animated.\n   *\n   *   * `eventFn`: `function(element, ... , doneFunction, options)`\n   *   The element to animate, the `doneFunction` and the options fed into the animation. Depending\n   *   on the type of animation additional arguments will be injected into the animation function. The\n   *   list below explains the function signatures for the different animation methods:\n   *\n   *   - setClass: function(element, addedClasses, removedClasses, doneFunction, options)\n   *   - addClass: function(element, addedClasses, doneFunction, options)\n   *   - removeClass: function(element, removedClasses, doneFunction, options)\n   *   - enter, leave, move: function(element, doneFunction, options)\n   *   - animate: function(element, fromStyles, toStyles, doneFunction, options)\n   *\n   *   Make sure to trigger the `doneFunction` once the animation is fully complete.\n   *\n   * ```js\n   *   return {\n   *     //enter, leave, move signature\n   *     eventFn : function(element, done, options) {\n   *       //code to run the animation\n   *       //once complete, then run done()\n   *       return function endFunction(wasCancelled) {\n   *         //code to cancel the animation\n   *       }\n   *     }\n   *   }\n   * ```\n   *\n   * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to).\n   * @param {Function} factory The factory function that will be executed to return the animation\n   *                           object.\n   */\n  this.register = function(name, factory) {\n    if (name && name.charAt(0) !== '.') {\n      throw $animateMinErr('notcsel', 'Expecting class selector starting with \\'.\\' got \\'{0}\\'.', name);\n    }\n\n    var key = name + '-animation';\n    provider.$$registeredAnimations[name.substr(1)] = key;\n    $provide.factory(key, factory);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#customFilter\n   *\n   * @description\n   * Sets and/or returns the custom filter function that is used to \"filter\" animations, i.e.\n   * determine if an animation is allowed or not. When no filter is specified (the default), no\n   * animation will be blocked. Setting the `customFilter` value will only allow animations for\n   * which the filter function's return value is truthy.\n   *\n   * This allows to easily create arbitrarily complex rules for filtering animations, such as\n   * allowing specific events only, or enabling animations on specific subtrees of the DOM, etc.\n   * Filtering animations can also boost performance for low-powered devices, as well as\n   * applications containing a lot of structural operations.\n   *\n   * <div class=\"alert alert-success\">\n   *   **Best Practice:**\n   *   Keep the filtering function as lean as possible, because it will be called for each DOM\n   *   action (e.g. insertion, removal, class change) performed by \"animation-aware\" directives.\n   *   See {@link guide/animations#which-directives-support-animations- here} for a list of built-in\n   *   directives that support animations.\n   *   Performing computationally expensive or time-consuming operations on each call of the\n   *   filtering function can make your animations sluggish.\n   * </div>\n   *\n   * **Note:** If present, `customFilter` will be checked before\n   * {@link $animateProvider#classNameFilter classNameFilter}.\n   *\n   * @param {Function=} filterFn - The filter function which will be used to filter all animations.\n   *   If a falsy value is returned, no animation will be performed. The function will be called\n   *   with the following arguments:\n   *   - **node** `{DOMElement}` - The DOM element to be animated.\n   *   - **event** `{String}` - The name of the animation event (e.g. `enter`, `leave`, `addClass`\n   *     etc).\n   *   - **options** `{Object}` - A collection of options/styles used for the animation.\n   * @return {Function} The current filter function or `null` if there is none set.\n   */\n  this.customFilter = function(filterFn) {\n    if (arguments.length === 1) {\n      customFilter = isFunction(filterFn) ? filterFn : null;\n    }\n\n    return customFilter;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#classNameFilter\n   *\n   * @description\n   * Sets and/or returns the CSS class regular expression that is checked when performing\n   * an animation. Upon bootstrap the classNameFilter value is not set at all and will\n   * therefore enable $animate to attempt to perform an animation on any element that is triggered.\n   * When setting the `classNameFilter` value, animations will only be performed on elements\n   * that successfully match the filter expression. This in turn can boost performance\n   * for low-powered devices as well as applications containing a lot of structural operations.\n   *\n   * **Note:** If present, `classNameFilter` will be checked after\n   * {@link $animateProvider#customFilter customFilter}. If `customFilter` is present and returns\n   * false, `classNameFilter` will not be checked.\n   *\n   * @param {RegExp=} expression The className expression which will be checked against all animations\n   * @return {RegExp} The current CSS className expression value. If null then there is no expression value\n   */\n  this.classNameFilter = function(expression) {\n    if (arguments.length === 1) {\n      classNameFilter = (expression instanceof RegExp) ? expression : null;\n      if (classNameFilter) {\n        var reservedRegex = new RegExp('[(\\\\s|\\\\/)]' + NG_ANIMATE_CLASSNAME + '[(\\\\s|\\\\/)]');\n        if (reservedRegex.test(classNameFilter.toString())) {\n          classNameFilter = null;\n          throw $animateMinErr('nongcls', '$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class.', NG_ANIMATE_CLASSNAME);\n        }\n      }\n    }\n    return classNameFilter;\n  };\n\n  this.$get = ['$$animateQueue', function($$animateQueue) {\n    function domInsert(element, parentElement, afterElement) {\n      // if for some reason the previous element was removed\n      // from the dom sometime before this code runs then let's\n      // just stick to using the parent element as the anchor\n      if (afterElement) {\n        var afterNode = extractElementNode(afterElement);\n        if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) {\n          afterElement = null;\n        }\n      }\n      if (afterElement) {\n        afterElement.after(element);\n      } else {\n        parentElement.prepend(element);\n      }\n    }\n\n    /**\n     * @ngdoc service\n     * @name $animate\n     * @description The $animate service exposes a series of DOM utility methods that provide support\n     * for animation hooks. The default behavior is the application of DOM operations, however,\n     * when an animation is detected (and animations are enabled), $animate will do the heavy lifting\n     * to ensure that animation runs with the triggered DOM operation.\n     *\n     * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't\n     * included and only when it is active then the animation hooks that `$animate` triggers will be\n     * functional. Once active then all structural `ng-` directives will trigger animations as they perform\n     * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`,\n     * `ngShow`, `ngHide` and `ngMessages` also provide support for animations.\n     *\n     * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives.\n     *\n     * To learn more about enabling animation support, click here to visit the\n     * {@link ngAnimate ngAnimate module page}.\n     */\n    return {\n      // we don't call it directly since non-existant arguments may\n      // be interpreted as null within the sub enabled function\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#on\n       * @kind function\n       * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...)\n       *    has fired on the given element or among any of its children. Once the listener is fired, the provided callback\n       *    is fired with the following params:\n       *\n       * ```js\n       * $animate.on('enter', container,\n       *    function callback(element, phase) {\n       *      // cool we detected an enter animation within the container\n       *    }\n       * );\n       * ```\n       *\n       * <div class=\"alert alert-warning\">\n       * **Note**: Generally, the events that are fired correspond 1:1 to `$animate` method names,\n       * e.g. {@link ng.$animate#addClass addClass()} will fire `addClass`, and {@link ng.ngClass}\n       * will fire `addClass` if classes are added, and `removeClass` if classes are removed.\n       * However, there are two exceptions:\n       *\n       * <ul>\n       *   <li>if both an {@link ng.$animate#addClass addClass()} and a\n       *   {@link ng.$animate#removeClass removeClass()} action are performed during the same\n       *   animation, the event fired will be `setClass`. This is true even for `ngClass`.</li>\n       *   <li>an {@link ng.$animate#animate animate()} call that adds and removes classes will fire\n       *   the `setClass` event, but if it either removes or adds classes,\n       *   it will fire `animate` instead.</li>\n       * </ul>\n       *\n       * </div>\n       *\n       * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...)\n       * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself\n       *     as well as among its children\n       * @param {Function} callback the callback function that will be fired when the listener is triggered.\n       *\n       * The arguments present in the callback function are:\n       * * `element` - The captured DOM element that the animation was fired on.\n       * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends).\n       * * `data` - an object with these properties:\n       *     * addClass - `{string|null}` - space-separated CSS classes to add to the element\n       *     * removeClass - `{string|null}` - space-separated CSS classes to remove from the element\n       *     * from - `{Object|null}` - CSS properties & values at the beginning of the animation\n       *     * to - `{Object|null}` - CSS properties & values at the end of the animation\n       *\n       * Note that the callback does not trigger a scope digest. Wrap your call into a\n       * {@link $rootScope.Scope#$apply scope.$apply} to propagate changes to the scope.\n       */\n      on: $$animateQueue.on,\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#off\n       * @kind function\n       * @description Deregisters an event listener based on the event which has been associated with the provided element. This method\n       * can be used in three different ways depending on the arguments:\n       *\n       * ```js\n       * // remove all the animation event listeners listening for `enter`\n       * $animate.off('enter');\n       *\n       * // remove listeners for all animation events from the container element\n       * $animate.off(container);\n       *\n       * // remove all the animation event listeners listening for `enter` on the given element and its children\n       * $animate.off('enter', container);\n       *\n       * // remove the event listener function provided by `callback` that is set\n       * // to listen for `enter` on the given `container` as well as its children\n       * $animate.off('enter', container, callback);\n       * ```\n       *\n       * @param {string|DOMElement} event|container the animation event (e.g. enter, leave, move,\n       * addClass, removeClass, etc...), or the container element. If it is the element, all other\n       * arguments are ignored.\n       * @param {DOMElement=} container the container element the event listener was placed on\n       * @param {Function=} callback the callback function that was registered as the listener\n       */\n      off: $$animateQueue.off,\n\n      /**\n       * @ngdoc method\n       * @name $animate#pin\n       * @kind function\n       * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists\n       *    outside of the DOM structure of the AngularJS application. By doing so, any animation triggered via `$animate` can be issued on the\n       *    element despite being outside the realm of the application or within another application. Say for example if the application\n       *    was bootstrapped on an element that is somewhere inside of the `<body>` tag, but we wanted to allow for an element to be situated\n       *    as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind\n       *    that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association.\n       *\n       *    Note that this feature is only active when the `ngAnimate` module is used.\n       *\n       * @param {DOMElement} element the external element that will be pinned\n       * @param {DOMElement} parentElement the host parent element that will be associated with the external element\n       */\n      pin: $$animateQueue.pin,\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enabled\n       * @kind function\n       * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This\n       * function can be called in four ways:\n       *\n       * ```js\n       * // returns true or false\n       * $animate.enabled();\n       *\n       * // changes the enabled state for all animations\n       * $animate.enabled(false);\n       * $animate.enabled(true);\n       *\n       * // returns true or false if animations are enabled for an element\n       * $animate.enabled(element);\n       *\n       * // changes the enabled state for an element and its children\n       * $animate.enabled(element, true);\n       * $animate.enabled(element, false);\n       * ```\n       *\n       * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state\n       * @param {boolean=} enabled whether or not the animations will be enabled for the element\n       *\n       * @return {boolean} whether or not animations are enabled\n       */\n      enabled: $$animateQueue.enabled,\n\n      /**\n       * @ngdoc method\n       * @name $animate#cancel\n       * @kind function\n       * @description Cancels the provided animation and applies the end state of the animation.\n       * Note that this does not cancel the underlying operation, e.g. the setting of classes or\n       * adding the element to the DOM.\n       *\n       * @param {animationRunner} animationRunner An animation runner returned by an $animate function.\n       *\n       * @example\n        <example module=\"animationExample\" deps=\"angular-animate.js\" animations=\"true\" name=\"animate-cancel\">\n          <file name=\"app.js\">\n            angular.module('animationExample', ['ngAnimate']).component('cancelExample', {\n              templateUrl: 'template.html',\n              controller: function($element, $animate) {\n                this.runner = null;\n\n                this.addClass = function() {\n                  this.runner = $animate.addClass($element.find('div'), 'red');\n                  var ctrl = this;\n                  this.runner.finally(function() {\n                    ctrl.runner = null;\n                  });\n                };\n\n                this.removeClass = function() {\n                  this.runner = $animate.removeClass($element.find('div'), 'red');\n                  var ctrl = this;\n                  this.runner.finally(function() {\n                    ctrl.runner = null;\n                  });\n                };\n\n                this.cancel = function() {\n                  $animate.cancel(this.runner);\n                };\n              }\n            });\n          </file>\n          <file name=\"template.html\">\n            <p>\n              <button id=\"add\" ng-click=\"$ctrl.addClass()\">Add</button>\n              <button ng-click=\"$ctrl.removeClass()\">Remove</button>\n              <br>\n              <button id=\"cancel\" ng-click=\"$ctrl.cancel()\" ng-disabled=\"!$ctrl.runner\">Cancel</button>\n              <br>\n              <div id=\"target\">CSS-Animated Text</div>\n            </p>\n          </file>\n          <file name=\"index.html\">\n            <cancel-example></cancel-example>\n          </file>\n          <file name=\"style.css\">\n            .red-add, .red-remove {\n              transition: all 4s cubic-bezier(0.250, 0.460, 0.450, 0.940);\n            }\n\n            .red,\n            .red-add.red-add-active {\n              color: #FF0000;\n              font-size: 40px;\n            }\n\n            .red-remove.red-remove-active {\n              font-size: 10px;\n              color: black;\n            }\n\n          </file>\n        </example>\n       */\n      cancel: function(runner) {\n        if (runner.cancel) {\n          runner.cancel();\n        }\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enter\n       * @kind function\n       * @description Inserts the element into the DOM either after the `after` element (if provided) or\n       *   as the first child within the `parent` element and then triggers an animation.\n       *   A promise is returned that will be resolved during the next digest once the animation\n       *   has completed.\n       *\n       * @param {DOMElement} element the element which will be inserted into the DOM\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (so long as the after element is not present)\n       * @param {DOMElement=} after the sibling element after which the element will be appended\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Runner} the animation runner\n       */\n      enter: function(element, parent, after, options) {\n        parent = parent && jqLite(parent);\n        after = after && jqLite(after);\n        parent = parent || after.parent();\n        domInsert(element, parent, after);\n        return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options));\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#move\n       * @kind function\n       * @description Inserts (moves) the element into its new position in the DOM either after\n       *   the `after` element (if provided) or as the first child within the `parent` element\n       *   and then triggers an animation. A promise is returned that will be resolved\n       *   during the next digest once the animation has completed.\n       *\n       * @param {DOMElement} element the element which will be moved into the new DOM position\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (so long as the after element is not present)\n       * @param {DOMElement=} after the sibling element after which the element will be appended\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Runner} the animation runner\n       */\n      move: function(element, parent, after, options) {\n        parent = parent && jqLite(parent);\n        after = after && jqLite(after);\n        parent = parent || after.parent();\n        domInsert(element, parent, after);\n        return $$animateQueue.push(element, 'move', prepareAnimateOptions(options));\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#leave\n       * @kind function\n       * @description Triggers an animation and then removes the element from the DOM.\n       * When the function is called a promise is returned that will be resolved during the next\n       * digest once the animation has completed.\n       *\n       * @param {DOMElement} element the element which will be removed from the DOM\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Runner} the animation runner\n       */\n      leave: function(element, options) {\n        return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() {\n          element.remove();\n        });\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#addClass\n       * @kind function\n       *\n       * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon\n       *   execution, the addClass operation will only be handled after the next digest and it will not trigger an\n       *   animation if element already contains the CSS class or if the class is removed at a later step.\n       *   Note that class-based animations are treated differently compared to structural animations\n       *   (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *   depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Runner} animationRunner the animation runner\n       */\n      addClass: function(element, className, options) {\n        options = prepareAnimateOptions(options);\n        options.addClass = mergeClasses(options.addclass, className);\n        return $$animateQueue.push(element, 'addClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#removeClass\n       * @kind function\n       *\n       * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon\n       *   execution, the removeClass operation will only be handled after the next digest and it will not trigger an\n       *   animation if element does not contain the CSS class or if the class is added at a later step.\n       *   Note that class-based animations are treated differently compared to structural animations\n       *   (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *   depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Runner} the animation runner\n       */\n      removeClass: function(element, className, options) {\n        options = prepareAnimateOptions(options);\n        options.removeClass = mergeClasses(options.removeClass, className);\n        return $$animateQueue.push(element, 'removeClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#setClass\n       * @kind function\n       *\n       * @description Performs both the addition and removal of a CSS classes on an element and (during the process)\n       *    triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and\n       *    `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has\n       *    passed. Note that class-based animations are treated differently compared to structural animations\n       *    (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *    depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces)\n       * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Runner} the animation runner\n       */\n      setClass: function(element, add, remove, options) {\n        options = prepareAnimateOptions(options);\n        options.addClass = mergeClasses(options.addClass, add);\n        options.removeClass = mergeClasses(options.removeClass, remove);\n        return $$animateQueue.push(element, 'setClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#animate\n       * @kind function\n       *\n       * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element.\n       * If any detected CSS transition, keyframe or JavaScript matches the provided className value, then the animation will take\n       * on the provided styles. For example, if a transition animation is set for the given className, then the provided `from` and\n       * `to` styles will be applied alongside the given transition. If the CSS style provided in `from` does not have a corresponding\n       * style in `to`, the style in `from` is applied immediately, and no animation is run.\n       * If a JavaScript animation is detected then the provided styles will be given in as function parameters into the `animate`\n       * method (or as part of the `options` parameter):\n       *\n       * ```js\n       * ngModule.animation('.my-inline-animation', function() {\n       *   return {\n       *     animate : function(element, from, to, done, options) {\n       *       //animation\n       *       done();\n       *     }\n       *   }\n       * });\n       * ```\n       *\n       * @param {DOMElement} element the element which the CSS styles will be applied to\n       * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation.\n       * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation.\n       * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If\n       *    this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element.\n       *    (Note that if no animation is detected then this value will not be applied to the element.)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element.\n       *   The object can have the following properties:\n       *\n       *   - **addClass** - `{string}` - space-separated CSS classes to add to element\n       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`\n       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element\n       *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`\n       *\n       * @return {Runner} the animation runner\n       */\n      animate: function(element, from, to, className, options) {\n        options = prepareAnimateOptions(options);\n        options.from = options.from ? extend(options.from, from) : from;\n        options.to   = options.to   ? extend(options.to, to)     : to;\n\n        className = className || 'ng-inline-animate';\n        options.tempClasses = mergeClasses(options.tempClasses, className);\n        return $$animateQueue.push(element, 'animate', options);\n      }\n    };\n  }];\n}];\n\nvar $$AnimateAsyncRunFactoryProvider = /** @this */ function() {\n  this.$get = ['$$rAF', function($$rAF) {\n    var waitQueue = [];\n\n    function waitForTick(fn) {\n      waitQueue.push(fn);\n      if (waitQueue.length > 1) return;\n      $$rAF(function() {\n        for (var i = 0; i < waitQueue.length; i++) {\n          waitQueue[i]();\n        }\n        waitQueue = [];\n      });\n    }\n\n    return function() {\n      var passed = false;\n      waitForTick(function() {\n        passed = true;\n      });\n      return function(callback) {\n        if (passed) {\n          callback();\n        } else {\n          waitForTick(callback);\n        }\n      };\n    };\n  }];\n};\n\nvar $$AnimateRunnerFactoryProvider = /** @this */ function() {\n  this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$$isDocumentHidden', '$timeout',\n       function($q,   $sniffer,   $$animateAsyncRun,   $$isDocumentHidden,   $timeout) {\n\n    var INITIAL_STATE = 0;\n    var DONE_PENDING_STATE = 1;\n    var DONE_COMPLETE_STATE = 2;\n\n    AnimateRunner.chain = function(chain, callback) {\n      var index = 0;\n\n      next();\n      function next() {\n        if (index === chain.length) {\n          callback(true);\n          return;\n        }\n\n        chain[index](function(response) {\n          if (response === false) {\n            callback(false);\n            return;\n          }\n          index++;\n          next();\n        });\n      }\n    };\n\n    AnimateRunner.all = function(runners, callback) {\n      var count = 0;\n      var status = true;\n      forEach(runners, function(runner) {\n        runner.done(onProgress);\n      });\n\n      function onProgress(response) {\n        status = status && response;\n        if (++count === runners.length) {\n          callback(status);\n        }\n      }\n    };\n\n    function AnimateRunner(host) {\n      this.setHost(host);\n\n      var rafTick = $$animateAsyncRun();\n      var timeoutTick = function(fn) {\n        $timeout(fn, 0, false);\n      };\n\n      this._doneCallbacks = [];\n      this._tick = function(fn) {\n        if ($$isDocumentHidden()) {\n          timeoutTick(fn);\n        } else {\n          rafTick(fn);\n        }\n      };\n      this._state = 0;\n    }\n\n    AnimateRunner.prototype = {\n      setHost: function(host) {\n        this.host = host || {};\n      },\n\n      done: function(fn) {\n        if (this._state === DONE_COMPLETE_STATE) {\n          fn();\n        } else {\n          this._doneCallbacks.push(fn);\n        }\n      },\n\n      progress: noop,\n\n      getPromise: function() {\n        if (!this.promise) {\n          var self = this;\n          this.promise = $q(function(resolve, reject) {\n            self.done(function(status) {\n              if (status === false) {\n                reject();\n              } else {\n                resolve();\n              }\n            });\n          });\n        }\n        return this.promise;\n      },\n\n      then: function(resolveHandler, rejectHandler) {\n        return this.getPromise().then(resolveHandler, rejectHandler);\n      },\n\n      'catch': function(handler) {\n        return this.getPromise()['catch'](handler);\n      },\n\n      'finally': function(handler) {\n        return this.getPromise()['finally'](handler);\n      },\n\n      pause: function() {\n        if (this.host.pause) {\n          this.host.pause();\n        }\n      },\n\n      resume: function() {\n        if (this.host.resume) {\n          this.host.resume();\n        }\n      },\n\n      end: function() {\n        if (this.host.end) {\n          this.host.end();\n        }\n        this._resolve(true);\n      },\n\n      cancel: function() {\n        if (this.host.cancel) {\n          this.host.cancel();\n        }\n        this._resolve(false);\n      },\n\n      complete: function(response) {\n        var self = this;\n        if (self._state === INITIAL_STATE) {\n          self._state = DONE_PENDING_STATE;\n          self._tick(function() {\n            self._resolve(response);\n          });\n        }\n      },\n\n      _resolve: function(response) {\n        if (this._state !== DONE_COMPLETE_STATE) {\n          forEach(this._doneCallbacks, function(fn) {\n            fn(response);\n          });\n          this._doneCallbacks.length = 0;\n          this._state = DONE_COMPLETE_STATE;\n        }\n      }\n    };\n\n    return AnimateRunner;\n  }];\n};\n\n/* exported $CoreAnimateCssProvider */\n\n/**\n * @ngdoc service\n * @name $animateCss\n * @kind object\n * @this\n *\n * @description\n * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included,\n * then the `$animateCss` service will actually perform animations.\n *\n * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}.\n */\nvar $CoreAnimateCssProvider = function() {\n  this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) {\n\n    return function(element, initialOptions) {\n      // all of the animation functions should create\n      // a copy of the options data, however, if a\n      // parent service has already created a copy then\n      // we should stick to using that\n      var options = initialOptions || {};\n      if (!options.$$prepared) {\n        options = copy(options);\n      }\n\n      // there is no point in applying the styles since\n      // there is no animation that goes on at all in\n      // this version of $animateCss.\n      if (options.cleanupStyles) {\n        options.from = options.to = null;\n      }\n\n      if (options.from) {\n        element.css(options.from);\n        options.from = null;\n      }\n\n      var closed, runner = new $$AnimateRunner();\n      return {\n        start: run,\n        end: run\n      };\n\n      function run() {\n        $$rAF(function() {\n          applyAnimationContents();\n          if (!closed) {\n            runner.complete();\n          }\n          closed = true;\n        });\n        return runner;\n      }\n\n      function applyAnimationContents() {\n        if (options.addClass) {\n          element.addClass(options.addClass);\n          options.addClass = null;\n        }\n        if (options.removeClass) {\n          element.removeClass(options.removeClass);\n          options.removeClass = null;\n        }\n        if (options.to) {\n          element.css(options.to);\n          options.to = null;\n        }\n      }\n    };\n  }];\n};\n\n/* global getHash: true, stripHash: false */\n\nfunction getHash(url) {\n  var index = url.indexOf('#');\n  return index === -1 ? '' : url.substr(index);\n}\n\nfunction trimEmptyHash(url) {\n  return url.replace(/#$/, '');\n}\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n * @requires $log\n * @description\n * This object has two goals:\n *\n * - hide all the global state in the browser caused by the window object\n * - abstract away all the browser specific features and inconsistencies\n *\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\n * service, which can be used for convenient testing of the application without the interaction with\n * the real browser apis.\n */\n/**\n * @param {object} window The global window object.\n * @param {object} document jQuery wrapped document.\n * @param {object} $log window.console or an object with the same interface.\n * @param {object} $sniffer $sniffer service\n */\nfunction Browser(window, document, $log, $sniffer, $$taskTrackerFactory) {\n  var self = this,\n      location = window.location,\n      history = window.history,\n      setTimeout = window.setTimeout,\n      clearTimeout = window.clearTimeout,\n      pendingDeferIds = {},\n      taskTracker = $$taskTrackerFactory($log);\n\n  self.isMock = false;\n\n  //////////////////////////////////////////////////////////////\n  // Task-tracking API\n  //////////////////////////////////////////////////////////////\n\n  // TODO(vojta): remove this temporary api\n  self.$$completeOutstandingRequest = taskTracker.completeTask;\n  self.$$incOutstandingRequestCount = taskTracker.incTaskCount;\n\n  // TODO(vojta): prefix this method with $$ ?\n  self.notifyWhenNoOutstandingRequests = taskTracker.notifyWhenNoPendingTasks;\n\n  //////////////////////////////////////////////////////////////\n  // URL API\n  //////////////////////////////////////////////////////////////\n\n  var cachedState, lastHistoryState,\n      lastBrowserUrl = location.href,\n      baseElement = document.find('base'),\n      pendingLocation = null,\n      getCurrentState = !$sniffer.history ? noop : function getCurrentState() {\n        try {\n          return history.state;\n        } catch (e) {\n          // MSIE can reportedly throw when there is no state (UNCONFIRMED).\n        }\n      };\n\n  cacheState();\n\n  /**\n   * @name $browser#url\n   *\n   * @description\n   * GETTER:\n   * Without any argument, this method just returns current value of `location.href` (with a\n   * trailing `#` stripped of if the hash is empty).\n   *\n   * SETTER:\n   * With at least one argument, this method sets url to new value.\n   * If html5 history api supported, `pushState`/`replaceState` is used, otherwise\n   * `location.href`/`location.replace` is used.\n   * Returns its own instance to allow chaining.\n   *\n   * NOTE: this api is intended for use only by the `$location` service. Please use the\n   * {@link ng.$location $location service} to change url.\n   *\n   * @param {string} url New url (when used as setter)\n   * @param {boolean=} replace Should new url replace current history record?\n   * @param {object=} state State object to use with `pushState`/`replaceState`\n   */\n  self.url = function(url, replace, state) {\n    // In modern browsers `history.state` is `null` by default; treating it separately\n    // from `undefined` would cause `$browser.url('/foo')` to change `history.state`\n    // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.\n    if (isUndefined(state)) {\n      state = null;\n    }\n\n    // Android Browser BFCache causes location, history reference to become stale.\n    if (location !== window.location) location = window.location;\n    if (history !== window.history) history = window.history;\n\n    // setter\n    if (url) {\n      var sameState = lastHistoryState === state;\n\n      // Normalize the inputted URL\n      url = urlResolve(url).href;\n\n      // Don't change anything if previous and current URLs and states match. This also prevents\n      // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.\n      // See https://github.com/angular/angular.js/commit/ffb2701\n      if (lastBrowserUrl === url && (!$sniffer.history || sameState)) {\n        return self;\n      }\n      var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url);\n      lastBrowserUrl = url;\n      lastHistoryState = state;\n      // Don't use history API if only the hash changed\n      // due to a bug in IE10/IE11 which leads\n      // to not firing a `hashchange` nor `popstate` event\n      // in some cases (see #9143).\n      if ($sniffer.history && (!sameBase || !sameState)) {\n        history[replace ? 'replaceState' : 'pushState'](state, '', url);\n        cacheState();\n      } else {\n        if (!sameBase) {\n          pendingLocation = url;\n        }\n        if (replace) {\n          location.replace(url);\n        } else if (!sameBase) {\n          location.href = url;\n        } else {\n          location.hash = getHash(url);\n        }\n        if (location.href !== url) {\n          pendingLocation = url;\n        }\n      }\n      if (pendingLocation) {\n        pendingLocation = url;\n      }\n      return self;\n    // getter\n    } else {\n      // - pendingLocation is needed as browsers don't allow to read out\n      //   the new location.href if a reload happened or if there is a bug like in iOS 9 (see\n      //   https://openradar.appspot.com/22186109).\n      return trimEmptyHash(pendingLocation || location.href);\n    }\n  };\n\n  /**\n   * @name $browser#state\n   *\n   * @description\n   * This method is a getter.\n   *\n   * Return history.state or null if history.state is undefined.\n   *\n   * @returns {object} state\n   */\n  self.state = function() {\n    return cachedState;\n  };\n\n  var urlChangeListeners = [],\n      urlChangeInit = false;\n\n  function cacheStateAndFireUrlChange() {\n    pendingLocation = null;\n    fireStateOrUrlChange();\n  }\n\n  // This variable should be used *only* inside the cacheState function.\n  var lastCachedState = null;\n  function cacheState() {\n    // This should be the only place in $browser where `history.state` is read.\n    cachedState = getCurrentState();\n    cachedState = isUndefined(cachedState) ? null : cachedState;\n\n    // Prevent callbacks fo fire twice if both hashchange & popstate were fired.\n    if (equals(cachedState, lastCachedState)) {\n      cachedState = lastCachedState;\n    }\n\n    lastCachedState = cachedState;\n    lastHistoryState = cachedState;\n  }\n\n  function fireStateOrUrlChange() {\n    var prevLastHistoryState = lastHistoryState;\n    cacheState();\n\n    if (lastBrowserUrl === self.url() && prevLastHistoryState === cachedState) {\n      return;\n    }\n\n    lastBrowserUrl = self.url();\n    lastHistoryState = cachedState;\n    forEach(urlChangeListeners, function(listener) {\n      listener(self.url(), cachedState);\n    });\n  }\n\n  /**\n   * @name $browser#onUrlChange\n   *\n   * @description\n   * Register callback function that will be called, when url changes.\n   *\n   * It's only called when the url is changed from outside of AngularJS:\n   * - user types different url into address bar\n   * - user clicks on history (forward/back) button\n   * - user clicks on a link\n   *\n   * It's not called when url is changed by $browser.url() method\n   *\n   * The listener gets called with new url as parameter.\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to monitor url changes in AngularJS apps.\n   *\n   * @param {function(string)} listener Listener function to be called when url changes.\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\n   */\n  self.onUrlChange = function(callback) {\n    // TODO(vojta): refactor to use node's syntax for events\n    if (!urlChangeInit) {\n      // We listen on both (hashchange/popstate) when available, as some browsers don't\n      // fire popstate when user changes the address bar and don't fire hashchange when url\n      // changed by push/replaceState\n\n      // html5 history api - popstate event\n      if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange);\n      // hashchange event\n      jqLite(window).on('hashchange', cacheStateAndFireUrlChange);\n\n      urlChangeInit = true;\n    }\n\n    urlChangeListeners.push(callback);\n    return callback;\n  };\n\n  /**\n   * @private\n   * Remove popstate and hashchange handler from window.\n   *\n   * NOTE: this api is intended for use only by $rootScope.\n   */\n  self.$$applicationDestroyed = function() {\n    jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange);\n  };\n\n  /**\n   * Checks whether the url has changed outside of AngularJS.\n   * Needs to be exported to be able to check for changes that have been done in sync,\n   * as hashchange/popstate events fire in async.\n   */\n  self.$$checkUrlChange = fireStateOrUrlChange;\n\n  //////////////////////////////////////////////////////////////\n  // Misc API\n  //////////////////////////////////////////////////////////////\n\n  /**\n   * @name $browser#baseHref\n   *\n   * @description\n   * Returns current <base href>\n   * (always relative - without domain)\n   *\n   * @returns {string} The current base href\n   */\n  self.baseHref = function() {\n    var href = baseElement.attr('href');\n    return href ? href.replace(/^(https?:)?\\/\\/[^/]*/, '') : '';\n  };\n\n  /**\n   * @name $browser#defer\n   * @param {function()} fn A function, who's execution should be deferred.\n   * @param {number=} [delay=0] Number of milliseconds to defer the function execution.\n   * @param {string=} [taskType=DEFAULT_TASK_TYPE] The type of task that is deferred.\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\n   *\n   * @description\n   * Executes a fn asynchronously via `setTimeout(fn, delay)`.\n   *\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\n   * via `$browser.defer.flush()`.\n   *\n   */\n  self.defer = function(fn, delay, taskType) {\n    var timeoutId;\n\n    delay = delay || 0;\n    taskType = taskType || taskTracker.DEFAULT_TASK_TYPE;\n\n    taskTracker.incTaskCount(taskType);\n    timeoutId = setTimeout(function() {\n      delete pendingDeferIds[timeoutId];\n      taskTracker.completeTask(fn, taskType);\n    }, delay);\n    pendingDeferIds[timeoutId] = taskType;\n\n    return timeoutId;\n  };\n\n\n  /**\n   * @name $browser#defer.cancel\n   *\n   * @description\n   * Cancels a deferred task identified with `deferId`.\n   *\n   * @param {*} deferId Token returned by the `$browser.defer` function.\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n   *                    canceled.\n   */\n  self.defer.cancel = function(deferId) {\n    if (pendingDeferIds.hasOwnProperty(deferId)) {\n      var taskType = pendingDeferIds[deferId];\n      delete pendingDeferIds[deferId];\n      clearTimeout(deferId);\n      taskTracker.completeTask(noop, taskType);\n      return true;\n    }\n    return false;\n  };\n\n}\n\n/** @this */\nfunction $BrowserProvider() {\n  this.$get = ['$window', '$log', '$sniffer', '$document', '$$taskTrackerFactory',\n       function($window,   $log,   $sniffer,   $document,   $$taskTrackerFactory) {\n    return new Browser($window, $document, $log, $sniffer, $$taskTrackerFactory);\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $cacheFactory\n * @this\n *\n * @description\n * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to\n * them.\n *\n * ```js\n *\n *  var cache = $cacheFactory('cacheId');\n *  expect($cacheFactory.get('cacheId')).toBe(cache);\n *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();\n *\n *  cache.put(\"key\", \"value\");\n *  cache.put(\"another key\", \"another value\");\n *\n *  // We've specified no options on creation\n *  expect(cache.info()).toEqual({id: 'cacheId', size: 2});\n *\n * ```\n *\n *\n * @param {string} cacheId Name or id of the newly created cache.\n * @param {object=} options Options object that specifies the cache behavior. Properties:\n *\n *   - `{number=}` `capacity` — turns the cache into LRU cache.\n *\n * @returns {object} Newly created cache object with the following set of methods:\n *\n * - `{object}` `info()` — Returns id, size, and options of cache.\n * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns\n *   it.\n * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.\n * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.\n * - `{void}` `removeAll()` — Removes all cached values.\n * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.\n *\n * @example\n   <example module=\"cacheExampleApp\" name=\"cache-factory\">\n     <file name=\"index.html\">\n       <div ng-controller=\"CacheController\">\n         <input ng-model=\"newCacheKey\" placeholder=\"Key\">\n         <input ng-model=\"newCacheValue\" placeholder=\"Value\">\n         <button ng-click=\"put(newCacheKey, newCacheValue)\">Cache</button>\n\n         <p ng-if=\"keys.length\">Cached Values</p>\n         <div ng-repeat=\"key in keys\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"cache.get(key)\"></b>\n         </div>\n\n         <p>Cache Info</p>\n         <div ng-repeat=\"(key, value) in cache.info()\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"value\"></b>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('cacheExampleApp', []).\n         controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {\n           $scope.keys = [];\n           $scope.cache = $cacheFactory('cacheId');\n           $scope.put = function(key, value) {\n             if (angular.isUndefined($scope.cache.get(key))) {\n               $scope.keys.push(key);\n             }\n             $scope.cache.put(key, angular.isUndefined(value) ? null : value);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       p {\n         margin: 10px 0 3px;\n       }\n     </file>\n   </example>\n */\nfunction $CacheFactoryProvider() {\n\n  this.$get = function() {\n    var caches = {};\n\n    function cacheFactory(cacheId, options) {\n      if (cacheId in caches) {\n        throw minErr('$cacheFactory')('iid', 'CacheId \\'{0}\\' is already taken!', cacheId);\n      }\n\n      var size = 0,\n          stats = extend({}, options, {id: cacheId}),\n          data = createMap(),\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\n          lruHash = createMap(),\n          freshEnd = null,\n          staleEnd = null;\n\n      /**\n       * @ngdoc type\n       * @name $cacheFactory.Cache\n       *\n       * @description\n       * A cache object used to store and retrieve data, primarily used by\n       * {@link $templateRequest $templateRequest} and the {@link ng.directive:script script}\n       * directive to cache templates and other data.\n       *\n       * ```js\n       *  angular.module('superCache')\n       *    .factory('superCache', ['$cacheFactory', function($cacheFactory) {\n       *      return $cacheFactory('super-cache');\n       *    }]);\n       * ```\n       *\n       * Example test:\n       *\n       * ```js\n       *  it('should behave like a cache', inject(function(superCache) {\n       *    superCache.put('key', 'value');\n       *    superCache.put('another key', 'another value');\n       *\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 2\n       *    });\n       *\n       *    superCache.remove('another key');\n       *    expect(superCache.get('another key')).toBeUndefined();\n       *\n       *    superCache.removeAll();\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 0\n       *    });\n       *  }));\n       * ```\n       */\n      return (caches[cacheId] = {\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#put\n         * @kind function\n         *\n         * @description\n         * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be\n         * retrieved later, and incrementing the size of the cache if the key was not already\n         * present in the cache. If behaving like an LRU cache, it will also remove stale\n         * entries from the set.\n         *\n         * It will not insert undefined values into the cache.\n         *\n         * @param {string} key the key under which the cached data is stored.\n         * @param {*} value the value to store alongside the key. If it is undefined, the key\n         *    will not be stored.\n         * @returns {*} the value stored.\n         */\n        put: function(key, value) {\n          if (isUndefined(value)) return;\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\n\n            refresh(lruEntry);\n          }\n\n          if (!(key in data)) size++;\n          data[key] = value;\n\n          if (size > capacity) {\n            this.remove(staleEnd.key);\n          }\n\n          return value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#get\n         * @kind function\n         *\n         * @description\n         * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the data to be retrieved\n         * @returns {*} the value stored.\n         */\n        get: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            refresh(lruEntry);\n          }\n\n          return data[key];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#remove\n         * @kind function\n         *\n         * @description\n         * Removes an entry from the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the entry to be removed\n         */\n        remove: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            if (lruEntry === freshEnd) freshEnd = lruEntry.p;\n            if (lruEntry === staleEnd) staleEnd = lruEntry.n;\n            link(lruEntry.n,lruEntry.p);\n\n            delete lruHash[key];\n          }\n\n          if (!(key in data)) return;\n\n          delete data[key];\n          size--;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#removeAll\n         * @kind function\n         *\n         * @description\n         * Clears the cache object of any entries.\n         */\n        removeAll: function() {\n          data = createMap();\n          size = 0;\n          lruHash = createMap();\n          freshEnd = staleEnd = null;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#destroy\n         * @kind function\n         *\n         * @description\n         * Destroys the {@link $cacheFactory.Cache Cache} object entirely,\n         * removing it from the {@link $cacheFactory $cacheFactory} set.\n         */\n        destroy: function() {\n          data = null;\n          stats = null;\n          lruHash = null;\n          delete caches[cacheId];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#info\n         * @kind function\n         *\n         * @description\n         * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.\n         *\n         * @returns {object} an object with the following properties:\n         *   <ul>\n         *     <li>**id**: the id of the cache instance</li>\n         *     <li>**size**: the number of entries kept in the cache instance</li>\n         *     <li>**...**: any additional properties from the options object when creating the\n         *       cache.</li>\n         *   </ul>\n         */\n        info: function() {\n          return extend({}, stats, {size: size});\n        }\n      });\n\n\n      /**\n       * makes the `entry` the freshEnd of the LRU linked list\n       */\n      function refresh(entry) {\n        if (entry !== freshEnd) {\n          if (!staleEnd) {\n            staleEnd = entry;\n          } else if (staleEnd === entry) {\n            staleEnd = entry.n;\n          }\n\n          link(entry.n, entry.p);\n          link(entry, freshEnd);\n          freshEnd = entry;\n          freshEnd.n = null;\n        }\n      }\n\n\n      /**\n       * bidirectionally links two entries of the LRU linked list\n       */\n      function link(nextEntry, prevEntry) {\n        if (nextEntry !== prevEntry) {\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\n        }\n      }\n    }\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#info\n   *\n   * @description\n   * Get information about all the caches that have been created\n   *\n   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`\n   */\n    cacheFactory.info = function() {\n      var info = {};\n      forEach(caches, function(cache, cacheId) {\n        info[cacheId] = cache.info();\n      });\n      return info;\n    };\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#get\n   *\n   * @description\n   * Get access to a cache object by the `cacheId` used when it was created.\n   *\n   * @param {string} cacheId Name or id of a cache to access.\n   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.\n   */\n    cacheFactory.get = function(cacheId) {\n      return caches[cacheId];\n    };\n\n\n    return cacheFactory;\n  };\n}\n\n/**\n * @ngdoc service\n * @name $templateCache\n * @this\n *\n * @description\n * `$templateCache` is a {@link $cacheFactory.Cache Cache object} created by the\n * {@link ng.$cacheFactory $cacheFactory}.\n *\n * The first time a template is used, it is loaded in the template cache for quick retrieval. You\n * can load templates directly into the cache in a `script` tag, by using {@link $templateRequest},\n * or by consuming the `$templateCache` service directly.\n *\n * Adding via the `script` tag:\n *\n * ```html\n *   <script type=\"text/ng-template\" id=\"templateId.html\">\n *     <p>This is the content of the template</p>\n *   </script>\n * ```\n *\n * **Note:** the `script` tag containing the template does not need to be included in the `head` of\n * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (e.g.\n * element with {@link ngApp} attribute), otherwise the template will be ignored.\n *\n * Adding via the `$templateCache` service:\n *\n * ```js\n * var myApp = angular.module('myApp', []);\n * myApp.run(function($templateCache) {\n *   $templateCache.put('templateId.html', 'This is the content of the template');\n * });\n * ```\n *\n * To retrieve the template later, simply use it in your component:\n * ```js\n * myApp.component('myComponent', {\n *    templateUrl: 'templateId.html'\n * });\n * ```\n *\n * or get it via the `$templateCache` service:\n * ```js\n * $templateCache.get('templateId.html')\n * ```\n *\n */\nfunction $TemplateCacheProvider() {\n  this.$get = ['$cacheFactory', function($cacheFactory) {\n    return $cacheFactory('templates');\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables like document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\n *\n * DOM-related variables:\n *\n * - \"node\" - DOM Node\n * - \"element\" - DOM Element or Node\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\n *\n *\n * Compiler related stuff:\n *\n * - \"linkFn\" - linking fn of a single directive\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\n */\n\n\n/**\n * @ngdoc service\n * @name $compile\n * @kind function\n *\n * @description\n * Compiles an HTML string or DOM into a template and produces a template function, which\n * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.\n *\n * The compilation is a process of walking the DOM tree and matching DOM elements to\n * {@link ng.$compileProvider#directive directives}.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** This document is an in-depth reference of all directive options.\n * For a gentle introduction to directives with examples of common use cases,\n * see the {@link guide/directive directive guide}.\n * </div>\n *\n * ## Comprehensive Directive API\n *\n * There are many different options for a directive.\n *\n * The difference resides in the return value of the factory function.\n * You can either return a {@link $compile#directive-definition-object Directive Definition Object (see below)}\n * that defines the directive properties, or just the `postLink` function (all other properties will have\n * the default values).\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's recommended to use the \"directive definition object\" form.\n * </div>\n *\n * Here's an example directive declared with a Directive Definition Object:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       {@link $compile#-priority- priority}: 0,\n *       {@link $compile#-template- template}: '<div></div>', // or // function(tElement, tAttrs) { ... },\n *       // or\n *       // {@link $compile#-templateurl- templateUrl}: 'directive.html', // or // function(tElement, tAttrs) { ... },\n *       {@link $compile#-transclude- transclude}: false,\n *       {@link $compile#-restrict- restrict}: 'A',\n *       {@link $compile#-templatenamespace- templateNamespace}: 'html',\n *       {@link $compile#-scope- scope}: false,\n *       {@link $compile#-controller- controller}: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },\n *       {@link $compile#-controlleras- controllerAs}: 'stringIdentifier',\n *       {@link $compile#-bindtocontroller- bindToController}: false,\n *       {@link $compile#-require- require}: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],\n *       {@link $compile#-multielement- multiElement}: false,\n *       {@link $compile#-compile- compile}: function compile(tElement, tAttrs, transclude) {\n *         return {\n *            {@link $compile#pre-linking-function pre}: function preLink(scope, iElement, iAttrs, controller) { ... },\n *            {@link $compile#post-linking-function post}: function postLink(scope, iElement, iAttrs, controller) { ... }\n *         }\n *         // or\n *         // return function postLink( ... ) { ... }\n *       },\n *       // or\n *       // {@link $compile#-link- link}: {\n *       //  {@link $compile#pre-linking-function pre}: function preLink(scope, iElement, iAttrs, controller) { ... },\n *       //  {@link $compile#post-linking-function post}: function postLink(scope, iElement, iAttrs, controller) { ... }\n *       // }\n *       // or\n *       // {@link $compile#-link- link}: function postLink( ... ) { ... }\n *     };\n *     return directiveDefinitionObject;\n *   });\n * ```\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Any unspecified options will use the default value. You can see the default values below.\n * </div>\n *\n * Therefore the above can be simplified as:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       link: function postLink(scope, iElement, iAttrs) { ... }\n *     };\n *     return directiveDefinitionObject;\n *     // or\n *     // return function postLink(scope, iElement, iAttrs) { ... }\n *   });\n * ```\n *\n * ### Life-cycle hooks\n * Directive controllers can provide the following methods that are called by AngularJS at points in the life-cycle of the\n * directive:\n * * `$onInit()` - Called on each controller after all the controllers on an element have been constructed and\n *   had their bindings initialized (and before the pre &amp; post linking functions for the directives on\n *   this element). This is a good place to put initialization code for your controller.\n * * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The\n *   `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an\n *   object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a\n *   component such as cloning the bound value to prevent accidental mutation of the outer value. Note that this will\n *   also be called when your bindings are initialized.\n * * `$doCheck()` - Called on each turn of the digest cycle. Provides an opportunity to detect and act on\n *   changes. Any actions that you wish to take in response to the changes that you detect must be\n *   invoked from this hook; implementing this has no effect on when `$onChanges` is called. For example, this hook\n *   could be useful if you wish to perform a deep equality check, or to check a Date object, changes to which would not\n *   be detected by AngularJS's change detector and thus not trigger `$onChanges`. This hook is invoked with no arguments;\n *   if detecting changes, you must store the previous value(s) for comparison to the current values.\n * * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing\n *   external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in\n *   the same order as the `$scope.$broadcast` events are triggered, which is top down. This means that parent\n *   components will have their `$onDestroy()` hook called before child components.\n * * `$postLink()` - Called after this controller's element and its children have been linked. Similar to the post-link\n *   function this hook can be used to set up DOM event handlers and do direct DOM manipulation.\n *   Note that child elements that contain `templateUrl` directives will not have been compiled and linked since\n *   they are waiting for their template to load asynchronously and their own compilation and linking has been\n *   suspended until that occurs.\n *\n * #### Comparison with life-cycle hooks in the new Angular\n * The new Angular also uses life-cycle hooks for its components. While the AngularJS life-cycle hooks are similar there are\n * some differences that you should be aware of, especially when it comes to moving your code from AngularJS to Angular:\n *\n * * AngularJS hooks are prefixed with `$`, such as `$onInit`. Angular hooks are prefixed with `ng`, such as `ngOnInit`.\n * * AngularJS hooks can be defined on the controller prototype or added to the controller inside its constructor.\n *   In Angular you can only define hooks on the prototype of the Component class.\n * * Due to the differences in change-detection, you may get many more calls to `$doCheck` in AngularJS than you would to\n *   `ngDoCheck` in Angular.\n * * Changes to the model inside `$doCheck` will trigger new turns of the digest loop, which will cause the changes to be\n *   propagated throughout the application.\n *   Angular does not allow the `ngDoCheck` hook to trigger a change outside of the component. It will either throw an\n *   error or do nothing depending upon the state of `enableProdMode()`.\n *\n * #### Life-cycle hook examples\n *\n * This example shows how you can check for mutations to a Date object even though the identity of the object\n * has not changed.\n *\n * <example name=\"doCheckDateExample\" module=\"do-check-module\">\n *   <file name=\"app.js\">\n *     angular.module('do-check-module', [])\n *       .component('app', {\n *         template:\n *           'Month: <input ng-model=\"$ctrl.month\" ng-change=\"$ctrl.updateDate()\">' +\n *           'Date: {{ $ctrl.date }}' +\n *           '<test date=\"$ctrl.date\"></test>',\n *         controller: function() {\n *           this.date = new Date();\n *           this.month = this.date.getMonth();\n *           this.updateDate = function() {\n *             this.date.setMonth(this.month);\n *           };\n *         }\n *       })\n *       .component('test', {\n *         bindings: { date: '<' },\n *         template:\n *           '<pre>{{ $ctrl.log | json }}</pre>',\n *         controller: function() {\n *           var previousValue;\n *           this.log = [];\n *           this.$doCheck = function() {\n *             var currentValue = this.date && this.date.valueOf();\n *             if (previousValue !== currentValue) {\n *               this.log.push('doCheck: date mutated: ' + this.date);\n *               previousValue = currentValue;\n *             }\n *           };\n *         }\n *       });\n *   </file>\n *   <file name=\"index.html\">\n *     <app></app>\n *   </file>\n * </example>\n *\n * This example show how you might use `$doCheck` to trigger changes in your component's inputs even if the\n * actual identity of the component doesn't change. (Be aware that cloning and deep equality checks on large\n * arrays or objects can have a negative impact on your application performance)\n *\n * <example name=\"doCheckArrayExample\" module=\"do-check-module\">\n *   <file name=\"index.html\">\n *     <div ng-init=\"items = []\">\n *       <button ng-click=\"items.push(items.length)\">Add Item</button>\n *       <button ng-click=\"items = []\">Reset Items</button>\n *       <pre>{{ items }}</pre>\n *       <test items=\"items\"></test>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *      angular.module('do-check-module', [])\n *        .component('test', {\n *          bindings: { items: '<' },\n *          template:\n *            '<pre>{{ $ctrl.log | json }}</pre>',\n *          controller: function() {\n *            this.log = [];\n *\n *            this.$doCheck = function() {\n *              if (this.items_ref !== this.items) {\n *                this.log.push('doCheck: items changed');\n *                this.items_ref = this.items;\n *              }\n *              if (!angular.equals(this.items_clone, this.items)) {\n *                this.log.push('doCheck: items mutated');\n *                this.items_clone = angular.copy(this.items);\n *              }\n *            };\n *          }\n *        });\n *   </file>\n * </example>\n *\n *\n * ### Directive Definition Object\n *\n * The directive definition object provides instructions to the {@link ng.$compile\n * compiler}. The attributes are:\n *\n * #### `multiElement`\n * When this property is set to true (default is `false`), the HTML compiler will collect DOM nodes between\n * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them\n * together as the directive elements. It is recommended that this feature be used on directives\n * which are not strictly behavioral (such as {@link ngClick}), and which\n * do not manipulate or replace child nodes (such as {@link ngInclude}).\n *\n * #### `priority`\n * When there are multiple directives defined on a single DOM element, sometimes it\n * is necessary to specify the order in which the directives are applied. The `priority` is used\n * to sort the directives before their `compile` functions get called. Priority is defined as a\n * number. Directives with greater numerical `priority` are compiled first. Pre-link functions\n * are also run in priority order, but post-link functions are run in reverse order. The order\n * of directives with the same priority is undefined. The default priority is `0`.\n *\n * #### `terminal`\n * If set to true then the current `priority` will be the last set of directives\n * which will execute (any directives at the current priority will still execute\n * as the order of execution on same `priority` is undefined). Note that expressions\n * and other directives used in the directive's template will also be excluded from execution.\n *\n * #### `scope`\n * The scope property can be `false`, `true`, or an object:\n *\n * * **`false` (default):** No scope will be created for the directive. The directive will use its\n * parent's scope.\n *\n * * **`true`:** A new child scope that prototypically inherits from its parent will be created for\n * the directive's element. If multiple directives on the same element request a new scope,\n * only one new scope is created.\n *\n * * **`{...}` (an object hash):** A new \"isolate\" scope is created for the directive's template.\n * The 'isolate' scope differs from normal scope in that it does not prototypically\n * inherit from its parent scope. This is useful when creating reusable components, which should not\n * accidentally read or modify data in the parent scope. Note that an isolate scope\n * directive without a `template` or `templateUrl` will not apply the isolate scope\n * to its children elements.\n *\n * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the\n * directive's element. These local properties are useful for aliasing values for templates. The keys in\n * the object hash map to the name of the property on the isolate scope; the values define how the property\n * is bound to the parent scope, via matching attributes on the directive's element:\n *\n * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is\n *   always a string since DOM attributes are strings. If no `attr` name is specified then the\n *   attribute name is assumed to be the same as the local name. Given `<my-component\n *   my-attr=\"hello {{name}}\">` and the isolate scope definition `scope: { localName:'@myAttr' }`,\n *   the directive's scope property `localName` will reflect the interpolated value of `hello\n *   {{name}}`. As the `name` attribute changes so will the `localName` property on the directive's\n *   scope. The `name` is read from the parent scope (not the directive's scope).\n *\n * * `=` or `=attr` - set up a bidirectional binding between a local scope property and an expression\n *   passed via the attribute `attr`. The expression is evaluated in the context of the parent scope.\n *   If no `attr` name is specified then the attribute name is assumed to be the same as the local\n *   name. Given `<my-component my-attr=\"parentModel\">` and the isolate scope definition `scope: {\n *   localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the\n *   value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in\n *   `localModel` and vice versa. If the binding expression is non-assignable, or if the attribute\n *   isn't  optional and doesn't exist, an exception\n *   ({@link error/$compile/nonassign `$compile:nonassign`}) will be thrown upon discovering changes\n *   to the local value, since it will be impossible to sync them back to the parent scope.\n *\n *   By default, the {@link ng.$rootScope.Scope#$watch `$watch`}\n *   method is used for tracking changes, and the equality check is based on object identity.\n *   However, if an object literal or an array literal is passed as the binding expression, the\n *   equality check is done by value (using the {@link angular.equals} function). It's also possible\n *   to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection\n *   `$watchCollection`}: use `=*` or `=*attr`\n *\n  * * `<` or `<attr` - set up a one-way (one-directional) binding between a local scope property and an\n *   expression passed via the attribute `attr`. The expression is evaluated in the context of the\n *   parent scope. If no `attr` name is specified then the attribute name is assumed to be the same as the\n *   local name.\n *\n *   For example, given `<my-component my-attr=\"parentModel\">` and directive definition of\n *   `scope: { localModel:'<myAttr' }`, then the isolated scope property `localModel` will reflect the\n *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected\n *   in `localModel`, but changes in `localModel` will not reflect in `parentModel`. There are however\n *   two caveats:\n *     1. one-way binding does not copy the value from the parent to the isolate scope, it simply\n *     sets the same value. That means if your bound value is an object, changes to its properties\n *     in the isolated scope will be reflected in the parent scope (because both reference the same object).\n *     2. one-way binding watches changes to the **identity** of the parent value. That means the\n *     {@link ng.$rootScope.Scope#$watch `$watch`} on the parent value only fires if the reference\n *     to the value has changed. In most cases, this should not be of concern, but can be important\n *     to know if you one-way bind to an object, and then replace that object in the isolated scope.\n *     If you now change a property of the object in your parent scope, the change will not be\n *     propagated to the isolated scope, because the identity of the object on the parent scope\n *     has not changed. Instead you must assign a new object.\n *\n *   One-way binding is useful if you do not plan to propagate changes to your isolated scope bindings\n *   back to the parent. However, it does not make this completely impossible.\n *\n *   By default, the {@link ng.$rootScope.Scope#$watch `$watch`}\n *   method is used for tracking changes, and the equality check is based on object identity.\n *   It's also possible to watch the evaluated value shallowly with\n *   {@link ng.$rootScope.Scope#$watchCollection `$watchCollection`}: use `<*` or `<*attr`\n *\n * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. If\n *   no `attr` name is specified then the attribute name is assumed to be the same as the local name.\n *   Given `<my-component my-attr=\"count = count + value\">` and the isolate scope definition `scope: {\n *   localFn:'&myAttr' }`, the isolate scope property `localFn` will point to a function wrapper for\n *   the `count = count + value` expression. Often it's desirable to pass data from the isolated scope\n *   via an expression to the parent scope. This can be done by passing a map of local variable names\n *   and values into the expression wrapper fn. For example, if the expression is `increment(amount)`\n *   then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`.\n *\n * All 4 kinds of bindings (`@`, `=`, `<`, and `&`) can be made optional by adding `?` to the expression.\n * The marker must come after the mode and before the attribute name.\n * See the {@link error/$compile/iscp Invalid Isolate Scope Definition error} for definition examples.\n * This is useful to refine the interface directives provide.\n * One subtle difference between optional and non-optional happens **when the binding attribute is not\n * set**:\n * - the binding is optional: the property will not be defined\n * - the binding is not optional: the property is defined\n *\n * ```js\n *app.directive('testDir', function() {\n    return {\n      scope: {\n        notoptional: '=',\n        optional: '=?',\n      },\n      bindToController: true,\n      controller: function() {\n        this.$onInit = function() {\n          console.log(this.hasOwnProperty('notoptional')) // true\n          console.log(this.hasOwnProperty('optional')) // false\n        }\n      }\n    }\n  })\n *```\n *\n *\n * ##### Combining directives with different scope defintions\n *\n * In general it's possible to apply more than one directive to one element, but there might be limitations\n * depending on the type of scope required by the directives. The following points will help explain these limitations.\n * For simplicity only two directives are taken into account, but it is also applicable for several directives:\n *\n * * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope\n * * **child scope** + **no scope** =>  Both directives will share one single child scope\n * * **child scope** + **child scope** =>  Both directives will share one single child scope\n * * **isolated scope** + **no scope** =>  The isolated directive will use it's own created isolated scope. The other directive will use\n * its parent's scope\n * * **isolated scope** + **child scope** =>  **Won't work!** Only one scope can be related to one element. Therefore these directives cannot\n * be applied to the same element.\n * * **isolated scope** + **isolated scope**  =>  **Won't work!** Only one scope can be related to one element. Therefore these directives\n * cannot be applied to the same element.\n *\n *\n * #### `bindToController`\n * This property is used to bind scope properties directly to the controller. It can be either\n * `true` or an object hash with the same format as the `scope` property.\n *\n * When an isolate scope is used for a directive (see above), `bindToController: true` will\n * allow a component to have its properties bound to the controller, rather than to scope.\n *\n * After the controller is instantiated, the initial values of the isolate scope bindings will be bound to the controller\n * properties. You can access these bindings once they have been initialized by providing a controller method called\n * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings\n * initialized.\n *\n * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property.\n * This will set up the scope bindings to the controller directly. Note that `scope` can still be used\n * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate\n * scope (useful for component directives).\n *\n * If both `bindToController` and `scope` are defined and have object hashes, `bindToController` overrides `scope`.\n *\n *\n * #### `controller`\n * Controller constructor function. The controller is instantiated before the\n * pre-linking phase and can be accessed by other directives (see\n * `require` attribute). This allows the directives to communicate with each other and augment\n * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:\n *\n * * `$scope` - Current scope associated with the element\n * * `$element` - Current element\n * * `$attrs` - Current attributes object for the element\n * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope:\n *   `function([scope], cloneLinkingFn, futureParentElement, slotName)`:\n *    * `scope`: (optional) override the scope.\n *    * `cloneLinkingFn`: (optional) argument to create clones of the original transcluded content.\n *    * `futureParentElement` (optional):\n *        * defines the parent to which the `cloneLinkingFn` will add the cloned elements.\n *        * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`.\n *        * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements)\n *          and when the `cloneLinkingFn` is passed,\n *          as those elements need to created and cloned in a special way when they are defined outside their\n *          usual containers (e.g. like `<svg>`).\n *        * See also the `directive.templateNamespace` property.\n *    * `slotName`: (optional) the name of the slot to transclude. If falsy (e.g. `null`, `undefined` or `''`)\n *      then the default transclusion is provided.\n *    The `$transclude` function also has a method on it, `$transclude.isSlotFilled(slotName)`, which returns\n *    `true` if the specified slot contains content (i.e. one or more DOM nodes).\n *\n * #### `require`\n * Require another directive and inject its controller as the fourth argument to the linking function. The\n * `require` property can be a string, an array or an object:\n * * a **string** containing the name of the directive to pass to the linking function\n * * an **array** containing the names of directives to pass to the linking function. The argument passed to the\n * linking function will be an array of controllers in the same order as the names in the `require` property\n * * an **object** whose property values are the names of the directives to pass to the linking function. The argument\n * passed to the linking function will also be an object with matching keys, whose values will hold the corresponding\n * controllers.\n *\n * If the `require` property is an object and `bindToController` is truthy, then the required controllers are\n * bound to the controller using the keys of the `require` property. This binding occurs after all the controllers\n * have been constructed but before `$onInit` is called.\n * If the name of the required controller is the same as the local name (the key), the name can be\n * omitted. For example, `{parentDir: '^^'}` is equivalent to `{parentDir: '^^parentDir'}`.\n * See the {@link $compileProvider#component} helper for an example of how this can be used.\n * If no such required directive(s) can be found, or if the directive does not have a controller, then an error is\n * raised (unless no link function is specified and the required controllers are not being bound to the directive\n * controller, in which case error checking is skipped). The name can be prefixed with:\n *\n * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.\n * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.\n * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.\n * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found.\n * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass\n *   `null` to the `link` fn if not found.\n * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass\n *   `null` to the `link` fn if not found.\n *\n *\n * #### `controllerAs`\n * Identifier name for a reference to the controller in the directive's scope.\n * This allows the controller to be referenced from the directive template. This is especially\n * useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible\n * to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the\n * `controllerAs` reference might overwrite a property that already exists on the parent scope.\n *\n *\n * #### `restrict`\n * String of subset of `EACM` which restricts the directive to a specific directive\n * declaration style. If omitted, the defaults (elements and attributes) are used.\n *\n * * `E` - Element name (default): `<my-directive></my-directive>`\n * * `A` - Attribute (default): `<div my-directive=\"exp\"></div>`\n * * `C` - Class: `<div class=\"my-directive: exp;\"></div>`\n * * `M` - Comment: `<!-- directive: my-directive exp -->`\n *\n *\n * #### `templateNamespace`\n * String representing the document type used by the markup in the template.\n * AngularJS needs this information as those elements need to be created and cloned\n * in a special way when they are defined outside their usual containers like `<svg>` and `<math>`.\n *\n * * `html` - All root nodes in the template are HTML. Root nodes may also be\n *   top-level elements such as `<svg>` or `<math>`.\n * * `svg` - The root nodes in the template are SVG elements (excluding `<math>`).\n * * `math` - The root nodes in the template are MathML elements (excluding `<svg>`).\n *\n * If no `templateNamespace` is specified, then the namespace is considered to be `html`.\n *\n * #### `template`\n * HTML markup that may:\n * * Replace the contents of the directive's element (default).\n * * Replace the directive's element itself (if `replace` is true - DEPRECATED).\n * * Wrap the contents of the directive's element (if `transclude` is true).\n *\n * Value may be:\n *\n * * A string. For example `<div red-on-hover>{{delete_str}}</div>`.\n * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`\n *   function api below) and returns a string value.\n *\n *\n * #### `templateUrl`\n * This is similar to `template` but the template is loaded from the specified URL, asynchronously.\n *\n * Because template loading is asynchronous the compiler will suspend compilation of directives on that element\n * for later when the template has been resolved.  In the meantime it will continue to compile and link\n * sibling and parent elements as though this element had not contained any directives.\n *\n * The compiler does not suspend the entire compilation to wait for templates to be loaded because this\n * would result in the whole app \"stalling\" until all templates are loaded asynchronously - even in the\n * case when only one deeply nested directive has `templateUrl`.\n *\n * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}\n *\n * You can specify `templateUrl` as a string representing the URL or as a function which takes two\n * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns\n * a string value representing the url.  In either case, the template URL is passed through {@link\n * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.\n *\n *\n * #### `replace`\n * <div class=\"alert alert-danger\">\n * **Note:** `replace` is deprecated in AngularJS and has been removed in the new Angular (v2+).\n * </div>\n *\n * Specifies what the template should replace. Defaults to `false`.\n *\n * * `true` - the template will replace the directive's element.\n * * `false` - the template will replace the contents of the directive's element.\n *\n * The replacement process migrates all of the attributes / classes from the old element to the new\n * one. See the {@link guide/directive#template-expanding-directive\n * Directives Guide} for an example.\n *\n * There are very few scenarios where element replacement is required for the application function,\n * the main one being reusable custom components that are used within SVG contexts\n * (because SVG doesn't work with custom elements in the DOM tree).\n *\n * #### `transclude`\n * Extract the contents of the element where the directive appears and make it available to the directive.\n * The contents are compiled and provided to the directive as a **transclusion function**. See the\n * {@link $compile#transclusion Transclusion} section below.\n *\n *\n * #### `compile`\n *\n * ```js\n *   function compile(tElement, tAttrs, transclude) { ... }\n * ```\n *\n * The compile function deals with transforming the template DOM. Since most directives do not do\n * template transformation, it is not used often. The compile function takes the following arguments:\n *\n *   * `tElement` - template element - The element where the directive has been declared. It is\n *     safe to do template transformation on the element and child elements only.\n *\n *   * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared\n *     between all directive compile functions.\n *\n *   * `transclude` -  [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`\n *\n * <div class=\"alert alert-warning\">\n * **Note:** The template instance and the link instance may be different objects if the template has\n * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that\n * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration\n * should be done in a linking function rather than in a compile function.\n * </div>\n\n * <div class=\"alert alert-warning\">\n * **Note:** The compile function cannot handle directives that recursively use themselves in their\n * own templates or compile functions. Compiling these directives results in an infinite loop and\n * stack overflow errors.\n *\n * This can be avoided by manually using $compile in the postLink function to imperatively compile\n * a directive's template instead of relying on automatic template compilation via `template` or\n * `templateUrl` declaration or manual compilation inside the compile function.\n * </div>\n *\n * <div class=\"alert alert-danger\">\n * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it\n *   e.g. does not know about the right outer scope. Please use the transclude function that is passed\n *   to the link function instead.\n * </div>\n\n * A compile function can have a return value which can be either a function or an object.\n *\n * * returning a (post-link) function - is equivalent to registering the linking function via the\n *   `link` property of the config object when the compile function is empty.\n *\n * * returning an object with function(s) registered via `pre` and `post` properties - allows you to\n *   control when a linking function should be called during the linking phase. See info about\n *   pre-linking and post-linking functions below.\n *\n *\n * #### `link`\n * This property is used only if the `compile` property is not defined.\n *\n * ```js\n *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }\n * ```\n *\n * The link function is responsible for registering DOM listeners as well as updating the DOM. It is\n * executed after the template has been cloned. This is where most of the directive logic will be\n * put.\n *\n *   * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the\n *     directive for registering {@link ng.$rootScope.Scope#$watch watches}.\n *\n *   * `iElement` - instance element - The element where the directive is to be used. It is safe to\n *     manipulate the children of the element only in `postLink` function since the children have\n *     already been linked.\n *\n *   * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared\n *     between all directive linking functions.\n *\n *   * `controller` - the directive's required controller instance(s) - Instances are shared\n *     among all directives, which allows the directives to use the controllers as a communication\n *     channel. The exact value depends on the directive's `require` property:\n *       * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one\n *       * `string`: the controller instance\n *       * `array`: array of controller instances\n *\n *     If a required controller cannot be found, and it is optional, the instance is `null`,\n *     otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown.\n *\n *     Note that you can also require the directive's own controller - it will be made available like\n *     any other controller.\n *\n *   * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.\n *     This is the same as the `$transclude` parameter of directive controllers,\n *     see {@link ng.$compile#-controller- the controller section for details}.\n *     `function([scope], cloneLinkingFn, futureParentElement)`.\n *\n * #### Pre-linking function\n *\n * Executed before the child elements are linked. Not safe to do DOM transformation since the\n * compiler linking function will fail to locate the correct elements for linking.\n *\n * #### Post-linking function\n *\n * Executed after the child elements are linked.\n *\n * Note that child elements that contain `templateUrl` directives will not have been compiled\n * and linked since they are waiting for their template to load asynchronously and their own\n * compilation and linking has been suspended until that occurs.\n *\n * It is safe to do DOM transformation in the post-linking function on elements that are not waiting\n * for their async templates to be resolved.\n *\n *\n * ### Transclusion\n *\n * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and\n * copying them to another part of the DOM, while maintaining their connection to the original AngularJS\n * scope from where they were taken.\n *\n * Transclusion is used (often with {@link ngTransclude}) to insert the\n * original contents of a directive's element into a specified place in the template of the directive.\n * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded\n * content has access to the properties on the scope from which it was taken, even if the directive\n * has isolated scope.\n * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}.\n *\n * This makes it possible for the widget to have private state for its template, while the transcluded\n * content has access to its originating scope.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** When testing an element transclude directive you must not place the directive at the root of the\n * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives\n * Testing Transclusion Directives}.\n * </div>\n *\n * There are three kinds of transclusion depending upon whether you want to transclude just the contents of the\n * directive's element, the entire element or multiple parts of the element contents:\n *\n * * `true` - transclude the content (i.e. the child nodes) of the directive's element.\n * * `'element'` - transclude the whole of the directive's element including any directives on this\n *   element that defined at a lower priority than this directive. When used, the `template`\n *   property is ignored.\n * * **`{...}` (an object hash):** - map elements of the content onto transclusion \"slots\" in the template.\n *\n * **Mult-slot transclusion** is declared by providing an object for the `transclude` property.\n *\n * This object is a map where the keys are the name of the slot to fill and the value is an element selector\n * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`)\n * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc).\n *\n * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}\n *\n * If the element selector is prefixed with a `?` then that slot is optional.\n *\n * For example, the transclude object `{ slotA: '?myCustomElement' }` maps `<my-custom-element>` elements to\n * the `slotA` slot, which can be accessed via the `$transclude` function or via the {@link ngTransclude} directive.\n *\n * Slots that are not marked as optional (`?`) will trigger a compile time error if there are no matching elements\n * in the transclude content. If you wish to know if an optional slot was filled with content, then you can call\n * `$transclude.isSlotFilled(slotName)` on the transclude function passed to the directive's link function and\n * injectable into the directive's controller.\n *\n *\n * #### Transclusion Functions\n *\n * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion\n * function** to the directive's `link` function and `controller`. This transclusion function is a special\n * **linking function** that will return the compiled contents linked to a new transclusion scope.\n *\n * <div class=\"alert alert-info\">\n * If you are just using {@link ngTransclude} then you don't need to worry about this function, since\n * ngTransclude will deal with it for us.\n * </div>\n *\n * If you want to manually control the insertion and removal of the transcluded content in your directive\n * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery\n * object that contains the compiled DOM, which is linked to the correct transclusion scope.\n *\n * When you call a transclusion function you can pass in a **clone attach function**. This function accepts\n * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded\n * content and the `scope` is the newly created transclusion scope, which the clone will be linked to.\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function\n * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope.\n * </div>\n *\n * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone\n * attach function**:\n *\n * ```js\n * var transcludedContent, transclusionScope;\n *\n * $transclude(function(clone, scope) {\n *   element.append(clone);\n *   transcludedContent = clone;\n *   transclusionScope = scope;\n * });\n * ```\n *\n * Later, if you want to remove the transcluded content from your DOM then you should also destroy the\n * associated transclusion scope:\n *\n * ```js\n * transcludedContent.remove();\n * transclusionScope.$destroy();\n * ```\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: if you intend to add and remove transcluded content manually in your directive\n * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it),\n * then you are also responsible for calling `$destroy` on the transclusion scope.\n * </div>\n *\n * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat}\n * automatically destroy their transcluded clones as necessary so you do not need to worry about this if\n * you are simply using {@link ngTransclude} to inject the transclusion into your directive.\n *\n *\n * #### Transclusion Scopes\n *\n * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion\n * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed\n * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it\n * was taken.\n *\n * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look\n * like this:\n *\n * ```html\n * <div ng-app>\n *   <div isolate>\n *     <div transclusion>\n *     </div>\n *   </div>\n * </div>\n * ```\n *\n * The `$parent` scope hierarchy will look like this:\n *\n   ```\n   - $rootScope\n     - isolate\n       - transclusion\n   ```\n *\n * but the scopes will inherit prototypically from different scopes to their `$parent`.\n *\n   ```\n   - $rootScope\n     - transclusion\n   - isolate\n   ```\n *\n *\n * ### Attributes\n *\n * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the\n * `link()` or `compile()` functions. It has a variety of uses.\n *\n * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways:\n *   'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access\n *   to the attributes.\n *\n * * *Directive inter-communication:* All directives share the same instance of the attributes\n *   object which allows the directives to use the attributes object as inter directive\n *   communication.\n *\n * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object\n *   allowing other directives to read the interpolated value.\n *\n * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes\n *   that contain interpolation (e.g. `src=\"{{bar}}\"`). Not only is this very efficient but it's also\n *   the only way to easily get the actual value because during the linking phase the interpolation\n *   hasn't been evaluated yet and so the value is at this time set to `undefined`.\n *\n * ```js\n * function linkingFn(scope, elm, attrs, ctrl) {\n *   // get the attribute value\n *   console.log(attrs.ngModel);\n *\n *   // change the attribute\n *   attrs.$set('ngModel', 'new value');\n *\n *   // observe changes to interpolated attribute\n *   attrs.$observe('ngModel', function(value) {\n *     console.log('ngModel has changed value to ' + value);\n *   });\n * }\n * ```\n *\n * ## Example\n *\n * <div class=\"alert alert-warning\">\n * **Note**: Typically directives are registered with `module.directive`. The example below is\n * to illustrate how `$compile` works.\n * </div>\n *\n <example module=\"compileExample\" name=\"compile\">\n   <file name=\"index.html\">\n    <script>\n      angular.module('compileExample', [], function($compileProvider) {\n        // configure new 'compile' directive by passing a directive\n        // factory function. The factory function injects the '$compile'\n        $compileProvider.directive('compile', function($compile) {\n          // directive factory creates a link function\n          return function(scope, element, attrs) {\n            scope.$watch(\n              function(scope) {\n                 // watch the 'compile' expression for changes\n                return scope.$eval(attrs.compile);\n              },\n              function(value) {\n                // when the 'compile' expression changes\n                // assign it into the current DOM\n                element.html(value);\n\n                // compile the new DOM and link it to the current\n                // scope.\n                // NOTE: we only compile .childNodes so that\n                // we don't get into infinite loop compiling ourselves\n                $compile(element.contents())(scope);\n              }\n            );\n          };\n        });\n      })\n      .controller('GreeterController', ['$scope', function($scope) {\n        $scope.name = 'AngularJS';\n        $scope.html = 'Hello {{name}}';\n      }]);\n    </script>\n    <div ng-controller=\"GreeterController\">\n      <input ng-model=\"name\"> <br/>\n      <textarea ng-model=\"html\"></textarea> <br/>\n      <div compile=\"html\"></div>\n    </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should auto compile', function() {\n       var textarea = $('textarea');\n       var output = $('div[compile]');\n       // The initial state reads 'Hello AngularJS'.\n       expect(output.getText()).toBe('Hello AngularJS');\n       textarea.clear();\n       textarea.sendKeys('{{name}}!');\n       expect(output.getText()).toBe('AngularJS!');\n     });\n   </file>\n </example>\n\n *\n *\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\n * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED.\n *\n * <div class=\"alert alert-danger\">\n * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it\n *   e.g. will not use the right outer scope. Please pass the transclude function as a\n *   `parentBoundTranscludeFn` to the link function instead.\n * </div>\n *\n * @param {number} maxPriority only apply directives lower than given priority (Only effects the\n *                 root element(s), not their children)\n * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template\n * (a DOM element/tree) to a scope. Where:\n *\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\n *  `template` and call the `cloneAttachFn` function allowing the caller to attach the\n *  cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\n *  called as: <br/> `cloneAttachFn(clonedElement, scope)` where:\n *\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\n *      * `scope` - is the current scope with which the linking function is working with.\n *\n *  * `options` - An optional object hash with linking options. If `options` is provided, then the following\n *  keys may be used to control linking behavior:\n *\n *      * `parentBoundTranscludeFn` - the transclude function made available to\n *        directives; if given, it will be passed through to the link functions of\n *        directives found in `element` during compilation.\n *      * `transcludeControllers` - an object hash with keys that map controller names\n *        to a hash with the key `instance`, which maps to the controller instance;\n *        if given, it will make the controllers available to directives on the compileNode:\n *        ```\n *        {\n *          parent: {\n *            instance: parentControllerInstance\n *          }\n *        }\n *        ```\n *      * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add\n *        the cloned elements; only needed for transcludes that are allowed to contain non html\n *        elements (e.g. SVG elements). See also the directive.controller property.\n *\n * Calling the linking function returns the element of the template. It is either the original\n * element passed in, or the clone of the element if the `cloneAttachFn` is provided.\n *\n * After linking the view is not updated until after a call to $digest which typically is done by\n * AngularJS automatically.\n *\n * If you need access to the bound view, there are two ways to do it:\n *\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\n *   before you send them to the compiler and keep this reference around.\n *   ```js\n *     var element = $compile('<p>{{total}}</p>')(scope);\n *   ```\n *\n * - if on the other hand, you need the element to be cloned, the view reference from the original\n *   example would not point to the clone, but rather to the original template that was cloned. In\n *   this case, you can access the clone via the cloneAttachFn:\n *   ```js\n *     var templateElement = angular.element('<p>{{total}}</p>'),\n *         scope = ....;\n *\n *     var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {\n *       //attach the clone to DOM document at the right place\n *     });\n *\n *     //now we have reference to the cloned DOM via `clonedElement`\n *   ```\n *\n *\n * For information on how the compiler works, see the\n * {@link guide/compiler AngularJS HTML Compiler} section of the Developer Guide.\n *\n * @knownIssue\n *\n * ### Double Compilation\n *\n   Double compilation occurs when an already compiled part of the DOM gets\n   compiled again. This is an undesired effect and can lead to misbehaving directives, performance issues,\n   and memory leaks. Refer to the Compiler Guide {@link guide/compiler#double-compilation-and-how-to-avoid-it\n   section on double compilation} for an in-depth explanation and ways to avoid it.\n\n * @knownIssue\n\n   ### Issues with `replace: true`\n *\n * <div class=\"alert alert-danger\">\n *   **Note**: {@link $compile#-replace- `replace: true`} is deprecated and not recommended to use,\n *   mainly due to the issues listed here. It has been completely removed in the new Angular.\n * </div>\n *\n * #### Attribute values are not merged\n *\n * When a `replace` directive encounters the same attribute on the original and the replace node,\n * it will simply deduplicate the attribute and join the values with a space or with a `;` in case of\n * the `style` attribute.\n * ```html\n * Original Node: <span class=\"original\" style=\"color: red;\"></span>\n * Replace Template: <span class=\"replaced\" style=\"background: blue;\"></span>\n * Result: <span class=\"original replaced\" style=\"color: red; background: blue;\"></span>\n * ```\n *\n * That means attributes that contain AngularJS expressions will not be merged correctly, e.g.\n * {@link ngShow} or {@link ngClass} will cause a {@link $parse} error:\n *\n * ```html\n * Original Node: <span ng-class=\"{'something': something}\" ng-show=\"!condition\"></span>\n * Replace Template: <span ng-class=\"{'else': else}\" ng-show=\"otherCondition\"></span>\n * Result: <span ng-class=\"{'something': something} {'else': else}\" ng-show=\"!condition otherCondition\"></span>\n * ```\n *\n * See issue [#5695](https://github.com/angular/angular.js/issues/5695).\n *\n * #### Directives are not deduplicated before compilation\n *\n * When the original node and the replace template declare the same directive(s), they will be\n * {@link guide/compiler#double-compilation-and-how-to-avoid-it compiled twice} because the compiler\n * does not deduplicate them. In many cases, this is not noticable, but e.g. {@link ngModel} will\n * attach `$formatters` and `$parsers` twice.\n *\n * See issue [#2573](https://github.com/angular/angular.js/issues/2573).\n *\n * #### `transclude: element` in the replace template root can have unexpected effects\n *\n * When the replace template has a directive at the root node that uses\n * {@link $compile#-transclude- `transclude: element`}, e.g.\n * {@link ngIf} or {@link ngRepeat}, the DOM structure or scope inheritance can be incorrect.\n * See the following issues:\n *\n * - Incorrect scope on replaced element:\n * [#9837](https://github.com/angular/angular.js/issues/9837)\n * - Different DOM between `template` and `templateUrl`:\n * [#10612](https://github.com/angular/angular.js/issues/14326)\n *\n */\n\n/**\n * @ngdoc directive\n * @name ngProp\n * @restrict A\n * @element ANY\n *\n * @usage\n *\n * ```html\n * <ANY ng-prop-propname=\"expression\">\n * </ANY>\n * ```\n *\n * or with uppercase letters in property (e.g. \"propName\"):\n *\n *\n * ```html\n * <ANY ng-prop-prop_name=\"expression\">\n * </ANY>\n * ```\n *\n *\n * @description\n * The `ngProp` directive binds an expression to a DOM element property.\n * `ngProp` allows writing to arbitrary properties by including\n * the property name in the attribute, e.g. `ng-prop-value=\"'my value'\"` binds 'my value' to\n * the `value` property.\n *\n * Usually, it's not necessary to write to properties in AngularJS, as the built-in directives\n * handle the most common use cases (instead of the above example, you would use {@link ngValue}).\n *\n * However, [custom elements](https://developer.mozilla.org/docs/Web/Web_Components/Using_custom_elements)\n * often use custom properties to hold data, and `ngProp` can be used to provide input to these\n * custom elements.\n *\n * ## Binding to camelCase properties\n *\n * Since HTML attributes are case-insensitive, camelCase properties like `innerHTML` must be escaped.\n * AngularJS uses the underscore (_) in front of a character to indicate that it is uppercase, so\n * `innerHTML`  must be written as `ng-prop-inner_h_t_m_l=\"expression\"` (Note that this is just an\n * example, and for binding HTML {@link ngBindHtml} should be used.\n *\n * ## Security\n *\n * Binding expressions to arbitrary properties poses a security risk, as  properties like `innerHTML`\n * can insert potentially dangerous HTML into the application, e.g. script tags that execute\n * malicious code.\n * For this reason, `ngProp` applies Strict Contextual Escaping with the {@link ng.$sce $sce service}.\n * This means vulnerable properties require their content to be \"trusted\", based on the\n * context of the property. For example, the `innerHTML` is in the `HTML` context, and the\n * `iframe.src` property is in the `RESOURCE_URL` context, which requires that values written to\n * this property are trusted as a `RESOURCE_URL`.\n *\n * This can be set explicitly by calling $sce.trustAs(type, value) on the value that is\n * trusted before passing it to the `ng-prop-*` directive. There are exist shorthand methods for\n * each context type in the form of {@link ng.$sce#trustAsResourceUrl $sce.trustAsResourceUrl()} et al.\n *\n * In some cases you can also rely upon automatic sanitization of untrusted values - see below.\n *\n * Based on the context, other options may exist to mark a value as trusted / configure the behavior\n * of {@link ng.$sce}. For example, to restrict the `RESOURCE_URL` context to specific origins, use\n * the {@link $sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist()}\n * and {@link $sceDelegateProvider#resourceUrlBlacklist resourceUrlBlacklist()}.\n *\n * {@link ng.$sce#what-trusted-context-types-are-supported- Find out more about the different context types}.\n *\n * ### HTML Sanitization\n *\n * By default, `$sce` will throw an error if it detects untrusted HTML content, and will not bind the\n * content.\n * However, if you include the {@link ngSanitize ngSanitize module}, it will try to sanitize the\n * potentially dangerous HTML, e.g. strip non-whitelisted tags and attributes when binding to\n * `innerHTML`.\n *\n * @example\n * ### Binding to different contexts\n *\n * <example name=\"ngProp\" module=\"exampleNgProp\">\n *   <file name=\"app.js\">\n *     angular.module('exampleNgProp', [])\n *       .component('main', {\n *         templateUrl: 'main.html',\n *         controller: function($sce) {\n *           this.safeContent = '<strong>Safe content</strong>';\n *           this.unsafeContent = '<button onclick=\"alert(\\'Hello XSS!\\')\">Click for XSS</button>';\n *           this.trustedUnsafeContent = $sce.trustAsHtml(this.unsafeContent);\n *         }\n *       });\n *   </file>\n *   <file name=\"main.html\">\n *     <div>\n *       <div class=\"prop-unit\">\n *         Binding to a property without security context:\n *         <div class=\"prop-binding\" ng-prop-inner_text=\"$ctrl.safeContent\"></div>\n *         <span class=\"prop-note\">innerText</span> (safeContent)\n *       </div>\n *\n *       <div class=\"prop-unit\">\n *         \"Safe\" content that requires a security context will throw because the contents could potentially be dangerous ...\n *         <div class=\"prop-binding\" ng-prop-inner_h_t_m_l=\"$ctrl.safeContent\"></div>\n *         <span class=\"prop-note\">innerHTML</span> (safeContent)\n *       </div>\n *\n *       <div class=\"prop-unit\">\n *         ... so that actually dangerous content cannot be executed:\n *         <div class=\"prop-binding\" ng-prop-inner_h_t_m_l=\"$ctrl.unsafeContent\"></div>\n *         <span class=\"prop-note\">innerHTML</span> (unsafeContent)\n *       </div>\n *\n *       <div class=\"prop-unit\">\n *         ... but unsafe Content that has been trusted explicitly works - only do this if you are 100% sure!\n *         <div class=\"prop-binding\" ng-prop-inner_h_t_m_l=\"$ctrl.trustedUnsafeContent\"></div>\n *         <span class=\"prop-note\">innerHTML</span> (trustedUnsafeContent)\n *       </div>\n *     </div>\n *   </file>\n *   <file name=\"index.html\">\n *     <main></main>\n *   </file>\n *   <file name=\"styles.css\">\n *     .prop-unit {\n *       margin-bottom: 10px;\n *     }\n *\n *     .prop-binding {\n *       min-height: 30px;\n *       border: 1px solid blue;\n *     }\n *\n *     .prop-note {\n *       font-family: Monospace;\n *     }\n *   </file>\n * </example>\n *\n *\n * @example\n * ### Binding to innerHTML with ngSanitize\n *\n * <example name=\"ngProp\" module=\"exampleNgProp\" deps=\"angular-sanitize.js\">\n *   <file name=\"app.js\">\n *     angular.module('exampleNgProp', ['ngSanitize'])\n *       .component('main', {\n *         templateUrl: 'main.html',\n *         controller: function($sce) {\n *           this.safeContent = '<strong>Safe content</strong>';\n *           this.unsafeContent = '<button onclick=\"alert(\\'Hello XSS!\\')\">Click for XSS</button>';\n *           this.trustedUnsafeContent = $sce.trustAsHtml(this.unsafeContent);\n *         }\n *       });\n *   </file>\n *   <file name=\"main.html\">\n *     <div>\n *       <div class=\"prop-unit\">\n *         \"Safe\" content will be sanitized ...\n *         <div class=\"prop-binding\" ng-prop-inner_h_t_m_l=\"$ctrl.safeContent\"></div>\n *         <span class=\"prop-note\">innerHTML</span> (safeContent)\n *       </div>\n *\n *       <div class=\"prop-unit\">\n *         ... as will dangerous content:\n *         <div class=\"prop-binding\" ng-prop-inner_h_t_m_l=\"$ctrl.unsafeContent\"></div>\n *         <span class=\"prop-note\">innerHTML</span> (unsafeContent)\n *       </div>\n *\n *       <div class=\"prop-unit\">\n *         ... and content that has been trusted explicitly works the same as without ngSanitize:\n *         <div class=\"prop-binding\" ng-prop-inner_h_t_m_l=\"$ctrl.trustedUnsafeContent\"></div>\n *         <span class=\"prop-note\">innerHTML</span> (trustedUnsafeContent)\n *       </div>\n *     </div>\n *   </file>\n *   <file name=\"index.html\">\n *     <main></main>\n *   </file>\n *   <file name=\"styles.css\">\n *     .prop-unit {\n *       margin-bottom: 10px;\n *     }\n *\n *     .prop-binding {\n *       min-height: 30px;\n *       border: 1px solid blue;\n *     }\n *\n *     .prop-note {\n *       font-family: Monospace;\n *     }\n *   </file>\n * </example>\n *\n */\n\n/** @ngdoc directive\n * @name ngOn\n * @restrict A\n * @element ANY\n *\n * @usage\n *\n * ```html\n * <ANY ng-on-eventname=\"expression\">\n * </ANY>\n * ```\n *\n * or with uppercase letters in property (e.g. \"eventName\"):\n *\n *\n * ```html\n * <ANY ng-on-event_name=\"expression\">\n * </ANY>\n * ```\n *\n * @description\n * The `ngOn` directive adds an event listener to a DOM element via\n * {@link angular.element angular.element().on()}, and evaluates an expression when the event is\n * fired.\n * `ngOn` allows adding listeners for arbitrary events by including\n * the event name in the attribute, e.g. `ng-on-drop=\"onDrop()\"` executes the 'onDrop()' expression\n * when the `drop` event is fired.\n *\n * AngularJS provides specific directives for many events, such as {@link ngClick}, so in most\n * cases it is not necessary to use `ngOn`. However, AngularJS does not support all events\n * (e.g. the `drop` event in the example above), and new events might be introduced in later DOM\n * standards.\n *\n * Another use-case for `ngOn` is listening to\n * [custom events](https://developer.mozilla.org/docs/Web/Guide/Events/Creating_and_triggering_events)\n * fired by\n * [custom elements](https://developer.mozilla.org/docs/Web/Web_Components/Using_custom_elements).\n *\n * ## Binding to camelCase properties\n *\n * Since HTML attributes are case-insensitive, camelCase properties like `myEvent` must be escaped.\n * AngularJS uses the underscore (_) in front of a character to indicate that it is uppercase, so\n * `myEvent` must be written as `ng-on-my_event=\"expression\"`.\n *\n * @example\n * ### Bind to built-in DOM events\n *\n * <example name=\"ngOn\" module=\"exampleNgOn\">\n *   <file name=\"app.js\">\n *     angular.module('exampleNgOn', [])\n *       .component('main', {\n *         templateUrl: 'main.html',\n *         controller: function() {\n *           this.clickCount = 0;\n *           this.mouseoverCount = 0;\n *\n *           this.loadingState = 0;\n *         }\n *       });\n *   </file>\n *   <file name=\"main.html\">\n *     <div>\n *       This is equivalent to `ngClick` and `ngMouseover`:<br>\n *       <button\n *         ng-on-click=\"$ctrl.clickCount = $ctrl.clickCount + 1\"\n *         ng-on-mouseover=\"$ctrl.mouseoverCount = $ctrl.mouseoverCount + 1\">Click or mouseover</button><br>\n *       clickCount: {{$ctrl.clickCount}}<br>\n *       mouseover: {{$ctrl.mouseoverCount}}\n *\n *       <hr>\n *\n *       For the `error` and `load` event on images no built-in AngularJS directives exist:<br>\n *       <img src=\"thisimagedoesnotexist.png\" ng-on-error=\"$ctrl.loadingState = -1\" ng-on-load=\"$ctrl.loadingState = 1\"><br>\n *       <div ng-switch=\"$ctrl.loadingState\">\n *         <span ng-switch-when=\"0\">Image is loading</span>\n *         <span ng-switch-when=\"-1\">Image load error</span>\n *         <span ng-switch-when=\"1\">Image loaded successfully</span>\n *       </div>\n *     </div>\n *   </file>\n *   <file name=\"index.html\">\n *     <main></main>\n *   </file>\n * </example>\n *\n *\n * @example\n * ### Bind to custom DOM events\n *\n * <example name=\"ngOnCustom\" module=\"exampleNgOn\">\n *   <file name=\"app.js\">\n *     angular.module('exampleNgOn', [])\n *       .component('main', {\n *         templateUrl: 'main.html',\n *         controller: function() {\n *           this.eventLog = '';\n *\n *           this.listener = function($event) {\n *             this.eventLog = 'Event with type \"' + $event.type + '\" fired at ' + $event.detail;\n *           };\n *         }\n *       })\n *       .component('childComponent', {\n *         templateUrl: 'child.html',\n *         controller: function($element) {\n *           this.fireEvent = function() {\n *             var event = new CustomEvent('customtype', { detail: new Date()});\n *\n *             $element[0].dispatchEvent(event);\n *           };\n *         }\n *       });\n *   </file>\n *   <file name=\"main.html\">\n *     <child-component ng-on-customtype=\"$ctrl.listener($event)\"></child-component><br>\n *     <span>Event log: {{$ctrl.eventLog}}</span>\n *   </file>\n *   <file name=\"child.html\">\n      <button ng-click=\"$ctrl.fireEvent()\">Fire custom event</button>\n *   </file>\n *   <file name=\"index.html\">\n *     <main></main>\n *   </file>\n * </example>\n */\n\nvar $compileMinErr = minErr('$compile');\n\nfunction UNINITIALIZED_VALUE() {}\nvar _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE();\n\n/**\n * @ngdoc provider\n * @name $compileProvider\n *\n * @description\n */\n$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];\n/** @this */\nfunction $CompileProvider($provide, $$sanitizeUriProvider) {\n  var hasDirectives = {},\n      Suffix = 'Directive',\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive:\\s*([\\w-]+)\\s+(.*)$/,\n      CLASS_DIRECTIVE_REGEXP = /(([\\w-]+)(?::([^;]+))?;?)/,\n      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),\n      REQUIRE_PREFIX_REGEXP = /^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/;\n\n  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes\n  // The assumption is that future DOM event attribute names will begin with\n  // 'on' and be composed of only English letters.\n  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;\n  var bindingCache = createMap();\n\n  function parseIsolateBindings(scope, directiveName, isController) {\n    var LOCAL_REGEXP = /^([@&]|[=<](\\*?))(\\??)\\s*([\\w$]*)$/;\n\n    var bindings = createMap();\n\n    forEach(scope, function(definition, scopeName) {\n      definition = definition.trim();\n\n      if (definition in bindingCache) {\n        bindings[scopeName] = bindingCache[definition];\n        return;\n      }\n      var match = definition.match(LOCAL_REGEXP);\n\n      if (!match) {\n        throw $compileMinErr('iscp',\n            'Invalid {3} for directive \\'{0}\\'.' +\n            ' Definition: {... {1}: \\'{2}\\' ...}',\n            directiveName, scopeName, definition,\n            (isController ? 'controller bindings definition' :\n            'isolate scope definition'));\n      }\n\n      bindings[scopeName] = {\n        mode: match[1][0],\n        collection: match[2] === '*',\n        optional: match[3] === '?',\n        attrName: match[4] || scopeName\n      };\n      if (match[4]) {\n        bindingCache[definition] = bindings[scopeName];\n      }\n    });\n\n    return bindings;\n  }\n\n  function parseDirectiveBindings(directive, directiveName) {\n    var bindings = {\n      isolateScope: null,\n      bindToController: null\n    };\n    if (isObject(directive.scope)) {\n      if (directive.bindToController === true) {\n        bindings.bindToController = parseIsolateBindings(directive.scope,\n                                                         directiveName, true);\n        bindings.isolateScope = {};\n      } else {\n        bindings.isolateScope = parseIsolateBindings(directive.scope,\n                                                     directiveName, false);\n      }\n    }\n    if (isObject(directive.bindToController)) {\n      bindings.bindToController =\n          parseIsolateBindings(directive.bindToController, directiveName, true);\n    }\n    if (bindings.bindToController && !directive.controller) {\n      // There is no controller\n      throw $compileMinErr('noctrl',\n            'Cannot bind to controller without directive \\'{0}\\'s controller.',\n            directiveName);\n    }\n    return bindings;\n  }\n\n  function assertValidDirectiveName(name) {\n    var letter = name.charAt(0);\n    if (!letter || letter !== lowercase(letter)) {\n      throw $compileMinErr('baddir', 'Directive/Component name \\'{0}\\' is invalid. The first character must be a lowercase letter', name);\n    }\n    if (name !== name.trim()) {\n      throw $compileMinErr('baddir',\n            'Directive/Component name \\'{0}\\' is invalid. The name should not contain leading or trailing whitespaces',\n            name);\n    }\n  }\n\n  function getDirectiveRequire(directive) {\n    var require = directive.require || (directive.controller && directive.name);\n\n    if (!isArray(require) && isObject(require)) {\n      forEach(require, function(value, key) {\n        var match = value.match(REQUIRE_PREFIX_REGEXP);\n        var name = value.substring(match[0].length);\n        if (!name) require[key] = match[0] + key;\n      });\n    }\n\n    return require;\n  }\n\n  function getDirectiveRestrict(restrict, name) {\n    if (restrict && !(isString(restrict) && /[EACM]/.test(restrict))) {\n      throw $compileMinErr('badrestrict',\n          'Restrict property \\'{0}\\' of directive \\'{1}\\' is invalid',\n          restrict,\n          name);\n    }\n\n    return restrict || 'EA';\n  }\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#directive\n   * @kind function\n   *\n   * @description\n   * Register a new directive with the compiler.\n   *\n   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which\n   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the\n   *    names and the values are the factories.\n   * @param {Function|Array} directiveFactory An injectable directive factory function. See the\n   *    {@link guide/directive directive guide} and the {@link $compile compile API} for more info.\n   * @returns {ng.$compileProvider} Self for chaining.\n   */\n  this.directive = function registerDirective(name, directiveFactory) {\n    assertArg(name, 'name');\n    assertNotHasOwnProperty(name, 'directive');\n    if (isString(name)) {\n      assertValidDirectiveName(name);\n      assertArg(directiveFactory, 'directiveFactory');\n      if (!hasDirectives.hasOwnProperty(name)) {\n        hasDirectives[name] = [];\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\n          function($injector, $exceptionHandler) {\n            var directives = [];\n            forEach(hasDirectives[name], function(directiveFactory, index) {\n              try {\n                var directive = $injector.invoke(directiveFactory);\n                if (isFunction(directive)) {\n                  directive = { compile: valueFn(directive) };\n                } else if (!directive.compile && directive.link) {\n                  directive.compile = valueFn(directive.link);\n                }\n                directive.priority = directive.priority || 0;\n                directive.index = index;\n                directive.name = directive.name || name;\n                directive.require = getDirectiveRequire(directive);\n                directive.restrict = getDirectiveRestrict(directive.restrict, name);\n                directive.$$moduleName = directiveFactory.$$moduleName;\n                directives.push(directive);\n              } catch (e) {\n                $exceptionHandler(e);\n              }\n            });\n            return directives;\n          }]);\n      }\n      hasDirectives[name].push(directiveFactory);\n    } else {\n      forEach(name, reverseParams(registerDirective));\n    }\n    return this;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#component\n   * @module ng\n   * @param {string|Object} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`),\n   *    or an object map of components where the keys are the names and the values are the component definition objects.\n   * @param {Object} options Component definition object (a simplified\n   *    {@link ng.$compile#directive-definition-object directive definition object}),\n   *    with the following properties (all optional):\n   *\n   *    - `controller` – `{(string|function()=}` – controller constructor function that should be\n   *      associated with newly created scope or the name of a {@link ng.$compile#-controller-\n   *      registered controller} if passed as a string. An empty `noop` function by default.\n   *    - `controllerAs` – `{string=}` – identifier name for to reference the controller in the component's scope.\n   *      If present, the controller will be published to scope under the `controllerAs` name.\n   *      If not present, this will default to be `$ctrl`.\n   *    - `template` – `{string=|function()=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used as the contents of this component.\n   *      Empty string by default.\n   *\n   *      If `template` is a function, then it is {@link auto.$injector#invoke injected} with\n   *      the following locals:\n   *\n   *      - `$element` - Current element\n   *      - `$attrs` - Current attributes object for the element\n   *\n   *    - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html\n   *      template that should be used  as the contents of this component.\n   *\n   *      If `templateUrl` is a function, then it is {@link auto.$injector#invoke injected} with\n   *      the following locals:\n   *\n   *      - `$element` - Current element\n   *      - `$attrs` - Current attributes object for the element\n   *\n   *    - `bindings` – `{object=}` – defines bindings between DOM attributes and component properties.\n   *      Component properties are always bound to the component controller and not to the scope.\n   *      See {@link ng.$compile#-bindtocontroller- `bindToController`}.\n   *    - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled.\n   *      Disabled by default.\n   *    - `require` - `{Object<string, string>=}` - requires the controllers of other directives and binds them to\n   *      this component's controller. The object keys specify the property names under which the required\n   *      controllers (object values) will be bound. See {@link ng.$compile#-require- `require`}.\n   *    - `$...` – additional properties to attach to the directive factory function and the controller\n   *      constructor function. (This is used by the component router to annotate)\n   *\n   * @returns {ng.$compileProvider} the compile provider itself, for chaining of function calls.\n   * @description\n   * Register a **component definition** with the compiler. This is a shorthand for registering a special\n   * type of directive, which represents a self-contained UI component in your application. Such components\n   * are always isolated (i.e. `scope: {}`) and are always restricted to elements (i.e. `restrict: 'E'`).\n   *\n   * Component definitions are very simple and do not require as much configuration as defining general\n   * directives. Component definitions usually consist only of a template and a controller backing it.\n   *\n   * In order to make the definition easier, components enforce best practices like use of `controllerAs`,\n   * `bindToController`. They always have **isolate scope** and are restricted to elements.\n   *\n   * Here are a few examples of how you would usually define components:\n   *\n   * ```js\n   *   var myMod = angular.module(...);\n   *   myMod.component('myComp', {\n   *     template: '<div>My name is {{$ctrl.name}}</div>',\n   *     controller: function() {\n   *       this.name = 'shahar';\n   *     }\n   *   });\n   *\n   *   myMod.component('myComp', {\n   *     template: '<div>My name is {{$ctrl.name}}</div>',\n   *     bindings: {name: '@'}\n   *   });\n   *\n   *   myMod.component('myComp', {\n   *     templateUrl: 'views/my-comp.html',\n   *     controller: 'MyCtrl',\n   *     controllerAs: 'ctrl',\n   *     bindings: {name: '@'}\n   *   });\n   *\n   * ```\n   * For more examples, and an in-depth guide, see the {@link guide/component component guide}.\n   *\n   * <br />\n   * See also {@link ng.$compileProvider#directive $compileProvider.directive()}.\n   */\n  this.component = function registerComponent(name, options) {\n    if (!isString(name)) {\n      forEach(name, reverseParams(bind(this, registerComponent)));\n      return this;\n    }\n\n    var controller = options.controller || function() {};\n\n    function factory($injector) {\n      function makeInjectable(fn) {\n        if (isFunction(fn) || isArray(fn)) {\n          return /** @this */ function(tElement, tAttrs) {\n            return $injector.invoke(fn, this, {$element: tElement, $attrs: tAttrs});\n          };\n        } else {\n          return fn;\n        }\n      }\n\n      var template = (!options.template && !options.templateUrl ? '' : options.template);\n      var ddo = {\n        controller: controller,\n        controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl',\n        template: makeInjectable(template),\n        templateUrl: makeInjectable(options.templateUrl),\n        transclude: options.transclude,\n        scope: {},\n        bindToController: options.bindings || {},\n        restrict: 'E',\n        require: options.require\n      };\n\n      // Copy annotations (starting with $) over to the DDO\n      forEach(options, function(val, key) {\n        if (key.charAt(0) === '$') ddo[key] = val;\n      });\n\n      return ddo;\n    }\n\n    // TODO(pete) remove the following `forEach` before we release 1.6.0\n    // The component-router@0.2.0 looks for the annotations on the controller constructor\n    // Nothing in AngularJS looks for annotations on the factory function but we can't remove\n    // it from 1.5.x yet.\n\n    // Copy any annotation properties (starting with $) over to the factory and controller constructor functions\n    // These could be used by libraries such as the new component router\n    forEach(options, function(val, key) {\n      if (key.charAt(0) === '$') {\n        factory[key] = val;\n        // Don't try to copy over annotations to named controller\n        if (isFunction(controller)) controller[key] = val;\n      }\n    });\n\n    factory.$inject = ['$injector'];\n\n    return this.directive(name, factory);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#aHrefSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at preventing XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#imgSrcSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name  $compileProvider#debugInfoEnabled\n   *\n   * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the\n   * current debugInfoEnabled state\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   *\n   * @kind function\n   *\n   * @description\n   * Call this method to enable/disable various debug runtime information in the compiler such as adding\n   * binding information and a reference to the current scope on to DOM elements.\n   * If enabled, the compiler will add the following to DOM elements that have been bound to the scope\n   * * `ng-binding` CSS class\n   * * `ng-scope` and `ng-isolated-scope` CSS classes\n   * * `$binding` data property containing an array of the binding expressions\n   * * Data properties used by the {@link angular.element#methods `scope()`/`isolateScope()` methods} to return\n   *   the element's scope.\n   * * Placeholder comments will contain information about what directive and binding caused the placeholder.\n   *   E.g. `<!-- ngIf: shouldShow() -->`.\n   *\n   * You may want to disable this in production for a significant performance boost. See\n   * {@link guide/production#disabling-debug-data Disabling Debug Data} for more.\n   *\n   * The default value is true.\n   */\n  var debugInfoEnabled = true;\n  this.debugInfoEnabled = function(enabled) {\n    if (isDefined(enabled)) {\n      debugInfoEnabled = enabled;\n      return this;\n    }\n    return debugInfoEnabled;\n  };\n\n  /**\n   * @ngdoc method\n   * @name  $compileProvider#strictComponentBindingsEnabled\n   *\n   * @param {boolean=} enabled update the strictComponentBindingsEnabled state if provided,\n   * otherwise return the current strictComponentBindingsEnabled state.\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   *\n   * @kind function\n   *\n   * @description\n   * Call this method to enable / disable the strict component bindings check. If enabled, the\n   * compiler will enforce that all scope / controller bindings of a\n   * {@link $compileProvider#directive directive} / {@link $compileProvider#component component}\n   * that are not set as optional with `?`, must be provided when the directive is instantiated.\n   * If not provided, the compiler will throw the\n   * {@link error/$compile/missingattr $compile:missingattr error}.\n   *\n   * The default value is false.\n   */\n  var strictComponentBindingsEnabled = false;\n  this.strictComponentBindingsEnabled = function(enabled) {\n    if (isDefined(enabled)) {\n      strictComponentBindingsEnabled = enabled;\n      return this;\n    }\n    return strictComponentBindingsEnabled;\n  };\n\n  var TTL = 10;\n  /**\n   * @ngdoc method\n   * @name $compileProvider#onChangesTtl\n   * @description\n   *\n   * Sets the number of times `$onChanges` hooks can trigger new changes before giving up and\n   * assuming that the model is unstable.\n   *\n   * The current default is 10 iterations.\n   *\n   * In complex applications it's possible that dependencies between `$onChanges` hooks and bindings will result\n   * in several iterations of calls to these hooks. However if an application needs more than the default 10\n   * iterations to stabilize then you should investigate what is causing the model to continuously change during\n   * the `$onChanges` hook execution.\n   *\n   * Increasing the TTL could have performance implications, so you should not change it without proper justification.\n   *\n   * @param {number} limit The number of `$onChanges` hook iterations.\n   * @returns {number|object} the current limit (or `this` if called as a setter for chaining)\n   */\n  this.onChangesTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n      return this;\n    }\n    return TTL;\n  };\n\n  var commentDirectivesEnabledConfig = true;\n  /**\n   * @ngdoc method\n   * @name $compileProvider#commentDirectivesEnabled\n   * @description\n   *\n   * It indicates to the compiler\n   * whether or not directives on comments should be compiled.\n   * Defaults to `true`.\n   *\n   * Calling this function with false disables the compilation of directives\n   * on comments for the whole application.\n   * This results in a compilation performance gain,\n   * as the compiler doesn't have to check comments when looking for directives.\n   * This should however only be used if you are sure that no comment directives are used in\n   * the application (including any 3rd party directives).\n   *\n   * @param {boolean} enabled `false` if the compiler may ignore directives on comments\n   * @returns {boolean|object} the current value (or `this` if called as a setter for chaining)\n   */\n  this.commentDirectivesEnabled = function(value) {\n    if (arguments.length) {\n      commentDirectivesEnabledConfig = value;\n      return this;\n    }\n    return commentDirectivesEnabledConfig;\n  };\n\n\n  var cssClassDirectivesEnabledConfig = true;\n  /**\n   * @ngdoc method\n   * @name $compileProvider#cssClassDirectivesEnabled\n   * @description\n   *\n   * It indicates to the compiler\n   * whether or not directives on element classes should be compiled.\n   * Defaults to `true`.\n   *\n   * Calling this function with false disables the compilation of directives\n   * on element classes for the whole application.\n   * This results in a compilation performance gain,\n   * as the compiler doesn't have to check element classes when looking for directives.\n   * This should however only be used if you are sure that no class directives are used in\n   * the application (including any 3rd party directives).\n   *\n   * @param {boolean} enabled `false` if the compiler may ignore directives on element classes\n   * @returns {boolean|object} the current value (or `this` if called as a setter for chaining)\n   */\n  this.cssClassDirectivesEnabled = function(value) {\n    if (arguments.length) {\n      cssClassDirectivesEnabledConfig = value;\n      return this;\n    }\n    return cssClassDirectivesEnabledConfig;\n  };\n\n\n  /**\n   * The security context of DOM Properties.\n   * @private\n   */\n  var PROP_CONTEXTS = createMap();\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#addPropertySecurityContext\n   * @description\n   *\n   * Defines the security context for DOM properties bound by ng-prop-*.\n   *\n   * @param {string} elementName The element name or '*' to match any element.\n   * @param {string} propertyName The DOM property name.\n   * @param {string} ctx The {@link $sce} security context in which this value is safe for use, e.g. `$sce.URL`\n   * @returns {object} `this` for chaining\n   */\n  this.addPropertySecurityContext = function(elementName, propertyName, ctx) {\n    var key = (elementName.toLowerCase() + '|' + propertyName.toLowerCase());\n\n    if (key in PROP_CONTEXTS && PROP_CONTEXTS[key] !== ctx) {\n      throw $compileMinErr('ctxoverride', 'Property context \\'{0}.{1}\\' already set to \\'{2}\\', cannot override to \\'{3}\\'.', elementName, propertyName, PROP_CONTEXTS[key], ctx);\n    }\n\n    PROP_CONTEXTS[key] = ctx;\n    return this;\n  };\n\n  /* Default property contexts.\n   *\n   * Copy of https://github.com/angular/angular/blob/6.0.6/packages/compiler/src/schema/dom_security_schema.ts#L31-L58\n   * Changing:\n   * - SecurityContext.* => SCE_CONTEXTS/$sce.*\n   * - STYLE => CSS\n   * - various URL => MEDIA_URL\n   * - *|formAction, form|action URL => RESOURCE_URL (like the attribute)\n   */\n  (function registerNativePropertyContexts() {\n    function registerContext(ctx, values) {\n      forEach(values, function(v) { PROP_CONTEXTS[v.toLowerCase()] = ctx; });\n    }\n\n    registerContext(SCE_CONTEXTS.HTML, [\n      'iframe|srcdoc',\n      '*|innerHTML',\n      '*|outerHTML'\n    ]);\n    registerContext(SCE_CONTEXTS.CSS, ['*|style']);\n    registerContext(SCE_CONTEXTS.URL, [\n      'area|href',       'area|ping',\n      'a|href',          'a|ping',\n      'blockquote|cite',\n      'body|background',\n      'del|cite',\n      'input|src',\n      'ins|cite',\n      'q|cite'\n    ]);\n    registerContext(SCE_CONTEXTS.MEDIA_URL, [\n      'audio|src',\n      'img|src',    'img|srcset',\n      'source|src', 'source|srcset',\n      'track|src',\n      'video|src',  'video|poster'\n    ]);\n    registerContext(SCE_CONTEXTS.RESOURCE_URL, [\n      '*|formAction',\n      'applet|code',      'applet|codebase',\n      'base|href',\n      'embed|src',\n      'frame|src',\n      'form|action',\n      'head|profile',\n      'html|manifest',\n      'iframe|src',\n      'link|href',\n      'media|src',\n      'object|codebase',  'object|data',\n      'script|src'\n    ]);\n  })();\n\n\n  this.$get = [\n            '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse',\n            '$controller', '$rootScope', '$sce', '$animate',\n    function($injector,   $interpolate,   $exceptionHandler,   $templateRequest,   $parse,\n             $controller,   $rootScope,   $sce,   $animate) {\n\n    var SIMPLE_ATTR_NAME = /^\\w/;\n    var specialAttrHolder = window.document.createElement('div');\n\n\n    var commentDirectivesEnabled = commentDirectivesEnabledConfig;\n    var cssClassDirectivesEnabled = cssClassDirectivesEnabledConfig;\n\n\n    var onChangesTtl = TTL;\n    // The onChanges hooks should all be run together in a single digest\n    // When changes occur, the call to trigger their hooks will be added to this queue\n    var onChangesQueue;\n\n    // This function is called in a $$postDigest to trigger all the onChanges hooks in a single digest\n    function flushOnChangesQueue() {\n      try {\n        if (!(--onChangesTtl)) {\n          // We have hit the TTL limit so reset everything\n          onChangesQueue = undefined;\n          throw $compileMinErr('infchng', '{0} $onChanges() iterations reached. Aborting!\\n', TTL);\n        }\n        // We must run this hook in an apply since the $$postDigest runs outside apply\n        $rootScope.$apply(function() {\n          for (var i = 0, ii = onChangesQueue.length; i < ii; ++i) {\n            try {\n              onChangesQueue[i]();\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          // Reset the queue to trigger a new schedule next time there is a change\n          onChangesQueue = undefined;\n        });\n      } finally {\n        onChangesTtl++;\n      }\n    }\n\n\n    function sanitizeSrcset(value, invokeType) {\n      if (!value) {\n        return value;\n      }\n      if (!isString(value)) {\n        throw $compileMinErr('srcset', 'Can\\'t pass trusted values to `{0}`: \"{1}\"', invokeType, value.toString());\n      }\n\n      // Such values are a bit too complex to handle automatically inside $sce.\n      // Instead, we sanitize each of the URIs individually, which works, even dynamically.\n\n      // It's not possible to work around this using `$sce.trustAsMediaUrl`.\n      // If you want to programmatically set explicitly trusted unsafe URLs, you should use\n      // `$sce.trustAsHtml` on the whole `img` tag and inject it into the DOM using the\n      // `ng-bind-html` directive.\n\n      var result = '';\n\n      // first check if there are spaces because it's not the same pattern\n      var trimmedSrcset = trim(value);\n      //                (   999x   ,|   999w   ,|   ,|,   )\n      var srcPattern = /(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/;\n      var pattern = /\\s/.test(trimmedSrcset) ? srcPattern : /(,)/;\n\n      // split srcset into tuple of uri and descriptor except for the last item\n      var rawUris = trimmedSrcset.split(pattern);\n\n      // for each tuples\n      var nbrUrisWith2parts = Math.floor(rawUris.length / 2);\n      for (var i = 0; i < nbrUrisWith2parts; i++) {\n        var innerIdx = i * 2;\n        // sanitize the uri\n        result += $sce.getTrustedMediaUrl(trim(rawUris[innerIdx]));\n        // add the descriptor\n        result += ' ' + trim(rawUris[innerIdx + 1]);\n      }\n\n      // split the last item into uri and descriptor\n      var lastTuple = trim(rawUris[i * 2]).split(/\\s/);\n\n      // sanitize the last uri\n      result += $sce.getTrustedMediaUrl(trim(lastTuple[0]));\n\n      // and add the last descriptor if any\n      if (lastTuple.length === 2) {\n        result += (' ' + trim(lastTuple[1]));\n      }\n      return result;\n    }\n\n\n    function Attributes(element, attributesToCopy) {\n      if (attributesToCopy) {\n        var keys = Object.keys(attributesToCopy);\n        var i, l, key;\n\n        for (i = 0, l = keys.length; i < l; i++) {\n          key = keys[i];\n          this[key] = attributesToCopy[key];\n        }\n      } else {\n        this.$attr = {};\n      }\n\n      this.$$element = element;\n    }\n\n    Attributes.prototype = {\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$normalize\n       * @kind function\n       *\n       * @description\n       * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or\n       * `data-`) to its normalized, camelCase form.\n       *\n       * Also there is special case for Moz prefix starting with upper case letter.\n       *\n       * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}\n       *\n       * @param {string} name Name to normalize\n       */\n      $normalize: directiveNormalize,\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$addClass\n       * @kind function\n       *\n       * @description\n       * Adds the CSS class value specified by the classVal parameter to the element. If animations\n       * are enabled then an animation will be triggered for the class addition.\n       *\n       * @param {string} classVal The className value that will be added to the element\n       */\n      $addClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.addClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$removeClass\n       * @kind function\n       *\n       * @description\n       * Removes the CSS class value specified by the classVal parameter from the element. If\n       * animations are enabled then an animation will be triggered for the class removal.\n       *\n       * @param {string} classVal The className value that will be removed from the element\n       */\n      $removeClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.removeClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$updateClass\n       * @kind function\n       *\n       * @description\n       * Adds and removes the appropriate CSS class values to the element based on the difference\n       * between the new and old CSS class values (specified as newClasses and oldClasses).\n       *\n       * @param {string} newClasses The current CSS className value\n       * @param {string} oldClasses The former CSS className value\n       */\n      $updateClass: function(newClasses, oldClasses) {\n        var toAdd = tokenDifference(newClasses, oldClasses);\n        if (toAdd && toAdd.length) {\n          $animate.addClass(this.$$element, toAdd);\n        }\n\n        var toRemove = tokenDifference(oldClasses, newClasses);\n        if (toRemove && toRemove.length) {\n          $animate.removeClass(this.$$element, toRemove);\n        }\n      },\n\n      /**\n       * Set a normalized attribute on the element in a way such that all directives\n       * can share the attribute. This function properly handles boolean attributes.\n       * @param {string} key Normalized key. (ie ngAttribute)\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\n       *     Defaults to true.\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\n       */\n      $set: function(key, value, writeAttr, attrName) {\n        // TODO: decide whether or not to throw an error if \"class\"\n        // is set through this function since it may cause $updateClass to\n        // become unstable.\n\n        var node = this.$$element[0],\n            booleanKey = getBooleanAttrName(node, key),\n            aliasedKey = getAliasedAttrName(key),\n            observer = key,\n            nodeName;\n\n        if (booleanKey) {\n          this.$$element.prop(key, value);\n          attrName = booleanKey;\n        } else if (aliasedKey) {\n          this[aliasedKey] = value;\n          observer = aliasedKey;\n        }\n\n        this[key] = value;\n\n        // translate normalized key to actual key\n        if (attrName) {\n          this.$attr[key] = attrName;\n        } else {\n          attrName = this.$attr[key];\n          if (!attrName) {\n            this.$attr[key] = attrName = snake_case(key, '-');\n          }\n        }\n\n        nodeName = nodeName_(this.$$element);\n\n        // Sanitize img[srcset] values.\n        if (nodeName === 'img' && key === 'srcset') {\n          this[key] = value = sanitizeSrcset(value, '$set(\\'srcset\\', value)');\n        }\n\n        if (writeAttr !== false) {\n          if (value === null || isUndefined(value)) {\n            this.$$element.removeAttr(attrName);\n          } else {\n            if (SIMPLE_ATTR_NAME.test(attrName)) {\n              // jQuery skips special boolean attrs treatment in XML nodes for\n              // historical reasons and hence AngularJS cannot freely call\n              // `.attr(attrName, false) with such attributes. To avoid issues\n              // in XHTML, call `removeAttr` in such cases instead.\n              // See https://github.com/jquery/jquery/issues/4249\n              if (booleanKey && value === false) {\n                this.$$element.removeAttr(attrName);\n              } else {\n                this.$$element.attr(attrName, value);\n              }\n            } else {\n              setSpecialAttr(this.$$element[0], attrName, value);\n            }\n          }\n        }\n\n        // fire observers\n        var $$observers = this.$$observers;\n        if ($$observers) {\n          forEach($$observers[observer], function(fn) {\n            try {\n              fn(value);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          });\n        }\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$observe\n       * @kind function\n       *\n       * @description\n       * Observes an interpolated attribute.\n       *\n       * The observer function will be invoked once during the next `$digest` following\n       * compilation. The observer is then invoked whenever the interpolated value\n       * changes.\n       *\n       * @param {string} key Normalized key. (ie ngAttribute) .\n       * @param {function(interpolatedValue)} fn Function that will be called whenever\n                the interpolated value of the attribute changes.\n       *        See the {@link guide/interpolation#how-text-and-attribute-bindings-work Interpolation\n       *        guide} for more info.\n       * @returns {function()} Returns a deregistration function for this observer.\n       */\n      $observe: function(key, fn) {\n        var attrs = this,\n            $$observers = (attrs.$$observers || (attrs.$$observers = createMap())),\n            listeners = ($$observers[key] || ($$observers[key] = []));\n\n        listeners.push(fn);\n        $rootScope.$evalAsync(function() {\n          if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) {\n            // no one registered attribute interpolation function, so lets call it manually\n            fn(attrs[key]);\n          }\n        });\n\n        return function() {\n          arrayRemove(listeners, fn);\n        };\n      }\n    };\n\n    function setSpecialAttr(element, attrName, value) {\n      // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute`\n      // so we have to jump through some hoops to get such an attribute\n      // https://github.com/angular/angular.js/pull/13318\n      specialAttrHolder.innerHTML = '<span ' + attrName + '>';\n      var attributes = specialAttrHolder.firstChild.attributes;\n      var attribute = attributes[0];\n      // We have to remove the attribute from its container element before we can add it to the destination element\n      attributes.removeNamedItem(attribute.name);\n      attribute.value = value;\n      element.attributes.setNamedItem(attribute);\n    }\n\n    function safeAddClass($element, className) {\n      try {\n        $element.addClass(className);\n      } catch (e) {\n        // ignore, since it means that we are trying to set class on\n        // SVG element, where class name is read-only.\n      }\n    }\n\n\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        denormalizeTemplate = (startSymbol === '{{' && endSymbol  === '}}')\n            ? identity\n            : function denormalizeTemplate(template) {\n              return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n        },\n        NG_PREFIX_BINDING = /^ng(Attr|Prop|On)([A-Z].*)$/;\n    var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/;\n\n    compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) {\n      var bindings = $element.data('$binding') || [];\n\n      if (isArray(binding)) {\n        bindings = bindings.concat(binding);\n      } else {\n        bindings.push(binding);\n      }\n\n      $element.data('$binding', bindings);\n    } : noop;\n\n    compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) {\n      safeAddClass($element, 'ng-binding');\n    } : noop;\n\n    compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) {\n      var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope';\n      $element.data(dataName, scope);\n    } : noop;\n\n    compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) {\n      safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope');\n    } : noop;\n\n    compile.$$createComment = function(directiveName, comment) {\n      var content = '';\n      if (debugInfoEnabled) {\n        content = ' ' + (directiveName || '') + ': ';\n        if (comment) content += comment + ' ';\n      }\n      return window.document.createComment(content);\n    };\n\n    return compile;\n\n    //================================\n\n    function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,\n                        previousCompileContext) {\n      if (!($compileNodes instanceof jqLite)) {\n        // jquery always rewraps, whereas we need to preserve the original selector so that we can\n        // modify it.\n        $compileNodes = jqLite($compileNodes);\n      }\n      var compositeLinkFn =\n              compileNodes($compileNodes, transcludeFn, $compileNodes,\n                           maxPriority, ignoreDirective, previousCompileContext);\n      compile.$$addScopeClass($compileNodes);\n      var namespace = null;\n      return function publicLinkFn(scope, cloneConnectFn, options) {\n        if (!$compileNodes) {\n          throw $compileMinErr('multilink', 'This element has already been linked.');\n        }\n        assertArg(scope, 'scope');\n\n        if (previousCompileContext && previousCompileContext.needsNewScope) {\n          // A parent directive did a replace and a directive on this element asked\n          // for transclusion, which caused us to lose a layer of element on which\n          // we could hold the new transclusion scope, so we will create it manually\n          // here.\n          scope = scope.$parent.$new();\n        }\n\n        options = options || {};\n        var parentBoundTranscludeFn = options.parentBoundTranscludeFn,\n          transcludeControllers = options.transcludeControllers,\n          futureParentElement = options.futureParentElement;\n\n        // When `parentBoundTranscludeFn` is passed, it is a\n        // `controllersBoundTransclude` function (it was previously passed\n        // as `transclude` to directive.link) so we must unwrap it to get\n        // its `boundTranscludeFn`\n        if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) {\n          parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude;\n        }\n\n        if (!namespace) {\n          namespace = detectNamespaceForChildElements(futureParentElement);\n        }\n        var $linkNode;\n        if (namespace !== 'html') {\n          // When using a directive with replace:true and templateUrl the $compileNodes\n          // (or a child element inside of them)\n          // might change, so we need to recreate the namespace adapted compileNodes\n          // for call to the link function.\n          // Note: This will already clone the nodes...\n          $linkNode = jqLite(\n            wrapTemplate(namespace, jqLite('<div></div>').append($compileNodes).html())\n          );\n        } else if (cloneConnectFn) {\n          // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\n          // and sometimes changes the structure of the DOM.\n          $linkNode = JQLitePrototype.clone.call($compileNodes);\n        } else {\n          $linkNode = $compileNodes;\n        }\n\n        if (transcludeControllers) {\n          for (var controllerName in transcludeControllers) {\n            $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance);\n          }\n        }\n\n        compile.$$addScopeInfo($linkNode, scope);\n\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);\n\n        if (!cloneConnectFn) {\n          $compileNodes = compositeLinkFn = null;\n        }\n        return $linkNode;\n      };\n    }\n\n    function detectNamespaceForChildElements(parentElement) {\n      // TODO: Make this detect MathML as well...\n      var node = parentElement && parentElement[0];\n      if (!node) {\n        return 'html';\n      } else {\n        return nodeName_(node) !== 'foreignobject' && toString.call(node).match(/SVG/) ? 'svg' : 'html';\n      }\n    }\n\n    /**\n     * Compile function matches each node in nodeList against the directives. Once all directives\n     * for a particular node are collected their compile functions are executed. The compile\n     * functions return values - the linking functions - are combined into a composite linking\n     * function, which is the a linking function for the node.\n     *\n     * @param {NodeList} nodeList an array of nodes or NodeList to compile\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then\n     *        the rootElement must be set the jqLite collection of the compile root. This is\n     *        needed so that the jqLite collection items can be replaced with widgets.\n     * @param {number=} maxPriority Max directive priority.\n     * @returns {Function} A composite linking function of all of the matched directives or null.\n     */\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,\n                            previousCompileContext) {\n      var linkFns = [],\n          // `nodeList` can be either an element's `.childNodes` (live NodeList)\n          // or a jqLite/jQuery collection or an array\n          notLiveList = isArray(nodeList) || (nodeList instanceof jqLite),\n          attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound;\n\n\n      for (var i = 0; i < nodeList.length; i++) {\n        attrs = new Attributes();\n\n        // Support: IE 11 only\n        // Workaround for #11781 and #14924\n        if (msie === 11) {\n          mergeConsecutiveTextNodes(nodeList, i, notLiveList);\n        }\n\n        // We must always refer to `nodeList[i]` hereafter,\n        // since the nodes can be replaced underneath us.\n        directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,\n                                        ignoreDirective);\n\n        nodeLinkFn = (directives.length)\n            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,\n                                      null, [], [], previousCompileContext)\n            : null;\n\n        if (nodeLinkFn && nodeLinkFn.scope) {\n          compile.$$addScopeClass(attrs.$$element);\n        }\n\n        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||\n                      !(childNodes = nodeList[i].childNodes) ||\n                      !childNodes.length)\n            ? null\n            : compileNodes(childNodes,\n                 nodeLinkFn ? (\n                  (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)\n                     && nodeLinkFn.transclude) : transcludeFn);\n\n        if (nodeLinkFn || childLinkFn) {\n          linkFns.push(i, nodeLinkFn, childLinkFn);\n          linkFnFound = true;\n          nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn;\n        }\n\n        //use the previous context only for the first element in the virtual group\n        previousCompileContext = null;\n      }\n\n      // return a linking function if we have found anything, null otherwise\n      return linkFnFound ? compositeLinkFn : null;\n\n      function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {\n        var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn;\n        var stableNodeList;\n\n\n        if (nodeLinkFnFound) {\n          // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our\n          // offsets don't get screwed up\n          var nodeListLength = nodeList.length;\n          stableNodeList = new Array(nodeListLength);\n\n          // create a sparse array by only copying the elements which have a linkFn\n          for (i = 0; i < linkFns.length; i += 3) {\n            idx = linkFns[i];\n            stableNodeList[idx] = nodeList[idx];\n          }\n        } else {\n          stableNodeList = nodeList;\n        }\n\n        for (i = 0, ii = linkFns.length; i < ii;) {\n          node = stableNodeList[linkFns[i++]];\n          nodeLinkFn = linkFns[i++];\n          childLinkFn = linkFns[i++];\n\n          if (nodeLinkFn) {\n            if (nodeLinkFn.scope) {\n              childScope = scope.$new();\n              compile.$$addScopeInfo(jqLite(node), childScope);\n            } else {\n              childScope = scope;\n            }\n\n            if (nodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(\n                  scope, nodeLinkFn.transclude, parentBoundTranscludeFn);\n\n            } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {\n              childBoundTranscludeFn = parentBoundTranscludeFn;\n\n            } else if (!parentBoundTranscludeFn && transcludeFn) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);\n\n            } else {\n              childBoundTranscludeFn = null;\n            }\n\n            nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);\n\n          } else if (childLinkFn) {\n            childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);\n          }\n        }\n      }\n    }\n\n    function mergeConsecutiveTextNodes(nodeList, idx, notLiveList) {\n      var node = nodeList[idx];\n      var parent = node.parentNode;\n      var sibling;\n\n      if (node.nodeType !== NODE_TYPE_TEXT) {\n        return;\n      }\n\n      while (true) {\n        sibling = parent ? node.nextSibling : nodeList[idx + 1];\n        if (!sibling || sibling.nodeType !== NODE_TYPE_TEXT) {\n          break;\n        }\n\n        node.nodeValue = node.nodeValue + sibling.nodeValue;\n\n        if (sibling.parentNode) {\n          sibling.parentNode.removeChild(sibling);\n        }\n        if (notLiveList && sibling === nodeList[idx + 1]) {\n          nodeList.splice(idx + 1, 1);\n        }\n      }\n    }\n\n    function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {\n      function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {\n\n        if (!transcludedScope) {\n          transcludedScope = scope.$new(false, containingScope);\n          transcludedScope.$$transcluded = true;\n        }\n\n        return transcludeFn(transcludedScope, cloneFn, {\n          parentBoundTranscludeFn: previousBoundTranscludeFn,\n          transcludeControllers: controllers,\n          futureParentElement: futureParentElement\n        });\n      }\n\n      // We need  to attach the transclusion slots onto the `boundTranscludeFn`\n      // so that they are available inside the `controllersBoundTransclude` function\n      var boundSlots = boundTranscludeFn.$$slots = createMap();\n      for (var slotName in transcludeFn.$$slots) {\n        if (transcludeFn.$$slots[slotName]) {\n          boundSlots[slotName] = createBoundTranscludeFn(scope, transcludeFn.$$slots[slotName], previousBoundTranscludeFn);\n        } else {\n          boundSlots[slotName] = null;\n        }\n      }\n\n      return boundTranscludeFn;\n    }\n\n    /**\n     * Looks for directives on the given node and adds them to the directive collection which is\n     * sorted.\n     *\n     * @param node Node to search.\n     * @param directives An array to which the directives are added to. This array is sorted before\n     *        the function returns.\n     * @param attrs The shared attrs object which is used to populate the normalized attributes.\n     * @param {number=} maxPriority Max directive priority.\n     */\n    function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      var nodeType = node.nodeType,\n          attrsMap = attrs.$attr,\n          match,\n          nodeName,\n          className;\n\n      switch (nodeType) {\n        case NODE_TYPE_ELEMENT: /* Element */\n\n          nodeName = nodeName_(node);\n\n          // use the node name: <directive>\n          addDirective(directives,\n              directiveNormalize(nodeName), 'E', maxPriority, ignoreDirective);\n\n          // iterate over the attributes\n          for (var attr, name, nName, value, ngPrefixMatch, nAttrs = node.attributes,\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\n            var attrStartName = false;\n            var attrEndName = false;\n\n            var isNgAttr = false, isNgProp = false, isNgEvent = false;\n            var multiElementMatch;\n\n            attr = nAttrs[j];\n            name = attr.name;\n            value = attr.value;\n\n            nName = directiveNormalize(name.toLowerCase());\n\n            // Support ng-attr-*, ng-prop-* and ng-on-*\n            if ((ngPrefixMatch = nName.match(NG_PREFIX_BINDING))) {\n              isNgAttr = ngPrefixMatch[1] === 'Attr';\n              isNgProp = ngPrefixMatch[1] === 'Prop';\n              isNgEvent = ngPrefixMatch[1] === 'On';\n\n              // Normalize the non-prefixed name\n              name = name.replace(PREFIX_REGEXP, '')\n                .toLowerCase()\n                .substr(4 + ngPrefixMatch[1].length).replace(/_(.)/g, function(match, letter) {\n                  return letter.toUpperCase();\n                });\n\n            // Support *-start / *-end multi element directives\n            } else if ((multiElementMatch = nName.match(MULTI_ELEMENT_DIR_RE)) && directiveIsMultiElement(multiElementMatch[1])) {\n              attrStartName = name;\n              attrEndName = name.substr(0, name.length - 5) + 'end';\n              name = name.substr(0, name.length - 6);\n            }\n\n            if (isNgProp || isNgEvent) {\n              attrs[nName] = value;\n              attrsMap[nName] = attr.name;\n\n              if (isNgProp) {\n                addPropertyDirective(node, directives, nName, name);\n              } else {\n                addEventDirective(directives, nName, name);\n              }\n            } else {\n              // Update nName for cases where a prefix was removed\n              // NOTE: the .toLowerCase() is unnecessary and causes https://github.com/angular/angular.js/issues/16624 for ng-attr-*\n              nName = directiveNormalize(name.toLowerCase());\n              attrsMap[nName] = name;\n\n              if (isNgAttr || !attrs.hasOwnProperty(nName)) {\n                attrs[nName] = value;\n                if (getBooleanAttrName(node, nName)) {\n                  attrs[nName] = true; // presence means true\n                }\n              }\n\n              addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);\n              addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,\n                            attrEndName);\n            }\n          }\n\n          if (nodeName === 'input' && node.getAttribute('type') === 'hidden') {\n            // Hidden input elements can have strange behaviour when navigating back to the page\n            // This tells the browser not to try to cache and reinstate previous values\n            node.setAttribute('autocomplete', 'off');\n          }\n\n          // use class as directive\n          if (!cssClassDirectivesEnabled) break;\n          className = node.className;\n          if (isObject(className)) {\n              // Maybe SVGAnimatedString\n              className = className.animVal;\n          }\n          if (isString(className) && className !== '') {\n            while ((match = CLASS_DIRECTIVE_REGEXP.exec(className))) {\n              nName = directiveNormalize(match[2]);\n              if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[3]);\n              }\n              className = className.substr(match.index + match[0].length);\n            }\n          }\n          break;\n        case NODE_TYPE_TEXT: /* Text Node */\n          addTextInterpolateDirective(directives, node.nodeValue);\n          break;\n        case NODE_TYPE_COMMENT: /* Comment */\n          if (!commentDirectivesEnabled) break;\n          collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective);\n          break;\n      }\n\n      directives.sort(byPriority);\n      return directives;\n    }\n\n    function collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      // function created because of performance, try/catch disables\n      // the optimization of the whole function #14848\n      try {\n        var match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\n        if (match) {\n          var nName = directiveNormalize(match[1]);\n          if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {\n            attrs[nName] = trim(match[2]);\n          }\n        }\n      } catch (e) {\n        // turns out that under some circumstances IE9 throws errors when one attempts to read\n        // comment's node value.\n        // Just ignore it and continue. (Can't seem to reproduce in test case.)\n      }\n    }\n\n    /**\n     * Given a node with a directive-start it collects all of the siblings until it finds\n     * directive-end.\n     * @param node\n     * @param attrStart\n     * @param attrEnd\n     * @returns {*}\n     */\n    function groupScan(node, attrStart, attrEnd) {\n      var nodes = [];\n      var depth = 0;\n      if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {\n        do {\n          if (!node) {\n            throw $compileMinErr('uterdir',\n                      'Unterminated attribute, found \\'{0}\\' but no matching \\'{1}\\' found.',\n                      attrStart, attrEnd);\n          }\n          if (node.nodeType === NODE_TYPE_ELEMENT) {\n            if (node.hasAttribute(attrStart)) depth++;\n            if (node.hasAttribute(attrEnd)) depth--;\n          }\n          nodes.push(node);\n          node = node.nextSibling;\n        } while (depth > 0);\n      } else {\n        nodes.push(node);\n      }\n\n      return jqLite(nodes);\n    }\n\n    /**\n     * Wrapper for linking function which converts normal linking function into a grouped\n     * linking function.\n     * @param linkFn\n     * @param attrStart\n     * @param attrEnd\n     * @returns {Function}\n     */\n    function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {\n      return function groupedElementsLink(scope, element, attrs, controllers, transcludeFn) {\n        element = groupScan(element[0], attrStart, attrEnd);\n        return linkFn(scope, element, attrs, controllers, transcludeFn);\n      };\n    }\n\n    /**\n     * A function generator that is used to support both eager and lazy compilation\n     * linking function.\n     * @param eager\n     * @param $compileNodes\n     * @param transcludeFn\n     * @param maxPriority\n     * @param ignoreDirective\n     * @param previousCompileContext\n     * @returns {Function}\n     */\n    function compilationGenerator(eager, $compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) {\n      var compiled;\n\n      if (eager) {\n        return compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext);\n      }\n      return /** @this */ function lazyCompilation() {\n        if (!compiled) {\n          compiled = compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext);\n\n          // Null out all of these references in order to make them eligible for garbage collection\n          // since this is a potentially long lived closure\n          $compileNodes = transcludeFn = previousCompileContext = null;\n        }\n        return compiled.apply(this, arguments);\n      };\n    }\n\n    /**\n     * Once the directives have been collected, their compile functions are executed. This method\n     * is responsible for inlining directive templates as well as terminating the application\n     * of the directives if the terminal directive has been reached.\n     *\n     * @param {Array} directives Array of collected directives to execute their compile function.\n     *        this needs to be pre-sorted by priority order.\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\n     * @param {Object} templateAttrs The shared attribute function\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *                                                  scope argument is auto-generated to the new\n     *                                                  child of the transcluded parent scope.\n     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this\n     *                              argument has the root jqLite array so that we can replace nodes\n     *                              on it.\n     * @param {Object=} originalReplaceDirective An optional directive that will be ignored when\n     *                                           compiling the transclusion.\n     * @param {Array.<Function>} preLinkFns\n     * @param {Array.<Function>} postLinkFns\n     * @param {Object} previousCompileContext Context used for previous compilation of the current\n     *                                        node\n     * @returns {Function} linkFn\n     */\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,\n                                   jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,\n                                   previousCompileContext) {\n      previousCompileContext = previousCompileContext || {};\n\n      var terminalPriority = -Number.MAX_VALUE,\n          newScopeDirective = previousCompileContext.newScopeDirective,\n          controllerDirectives = previousCompileContext.controllerDirectives,\n          newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,\n          templateDirective = previousCompileContext.templateDirective,\n          nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,\n          hasTranscludeDirective = false,\n          hasTemplate = false,\n          hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\n          directive,\n          directiveName,\n          $template,\n          replaceDirective = originalReplaceDirective,\n          childTranscludeFn = transcludeFn,\n          linkFn,\n          didScanForMultipleTransclusion = false,\n          mightHaveMultipleTransclusionError = false,\n          directiveValue;\n\n      // executes all directives on the current element\n      for (var i = 0, ii = directives.length; i < ii; i++) {\n        directive = directives[i];\n        var attrStart = directive.$$start;\n        var attrEnd = directive.$$end;\n\n        // collect multiblock sections\n        if (attrStart) {\n          $compileNode = groupScan(compileNode, attrStart, attrEnd);\n        }\n        $template = undefined;\n\n        if (terminalPriority > directive.priority) {\n          break; // prevent further processing of directives\n        }\n\n        directiveValue = directive.scope;\n\n        if (directiveValue) {\n\n          // skip the check for directives with async templates, we'll check the derived sync\n          // directive when the template arrives\n          if (!directive.templateUrl) {\n            if (isObject(directiveValue)) {\n              // This directive is trying to add an isolated scope.\n              // Check that there is no scope of any kind already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective,\n                                directive, $compileNode);\n              newIsolateScopeDirective = directive;\n            } else {\n              // This directive is trying to add a child scope.\n              // Check that there is no isolated scope already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,\n                                $compileNode);\n            }\n          }\n\n          newScopeDirective = newScopeDirective || directive;\n        }\n\n        directiveName = directive.name;\n\n        // If we encounter a condition that can result in transclusion on the directive,\n        // then scan ahead in the remaining directives for others that may cause a multiple\n        // transclusion error to be thrown during the compilation process.  If a matching directive\n        // is found, then we know that when we encounter a transcluded directive, we need to eagerly\n        // compile the `transclude` function rather than doing it lazily in order to throw\n        // exceptions at the correct time\n        if (!didScanForMultipleTransclusion && ((directive.replace && (directive.templateUrl || directive.template))\n            || (directive.transclude && !directive.$$tlb))) {\n                var candidateDirective;\n\n                for (var scanningIndex = i + 1; (candidateDirective = directives[scanningIndex++]);) {\n                    if ((candidateDirective.transclude && !candidateDirective.$$tlb)\n                        || (candidateDirective.replace && (candidateDirective.templateUrl || candidateDirective.template))) {\n                        mightHaveMultipleTransclusionError = true;\n                        break;\n                    }\n                }\n\n                didScanForMultipleTransclusion = true;\n        }\n\n        if (!directive.templateUrl && directive.controller) {\n          controllerDirectives = controllerDirectives || createMap();\n          assertNoDuplicate('\\'' + directiveName + '\\' controller',\n              controllerDirectives[directiveName], directive, $compileNode);\n          controllerDirectives[directiveName] = directive;\n        }\n\n        directiveValue = directive.transclude;\n\n        if (directiveValue) {\n          hasTranscludeDirective = true;\n\n          // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.\n          // This option should only be used by directives that know how to safely handle element transclusion,\n          // where the transcluded nodes are added or replaced after linking.\n          if (!directive.$$tlb) {\n            assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);\n            nonTlbTranscludeDirective = directive;\n          }\n\n          if (directiveValue === 'element') {\n            hasElementTranscludeDirective = true;\n            terminalPriority = directive.priority;\n            $template = $compileNode;\n            $compileNode = templateAttrs.$$element =\n                jqLite(compile.$$createComment(directiveName, templateAttrs[directiveName]));\n            compileNode = $compileNode[0];\n            replaceWith(jqCollection, sliceArgs($template), compileNode);\n\n            childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority,\n                                        replaceDirective && replaceDirective.name, {\n                                          // Don't pass in:\n                                          // - controllerDirectives - otherwise we'll create duplicates controllers\n                                          // - newIsolateScopeDirective or templateDirective - combining templates with\n                                          //   element transclusion doesn't make sense.\n                                          //\n                                          // We need only nonTlbTranscludeDirective so that we prevent putting transclusion\n                                          // on the same element more than once.\n                                          nonTlbTranscludeDirective: nonTlbTranscludeDirective\n                                        });\n          } else {\n\n            var slots = createMap();\n\n            if (!isObject(directiveValue)) {\n              $template = jqLite(jqLiteClone(compileNode)).contents();\n            } else {\n\n              // We have transclusion slots,\n              // collect them up, compile them and store their transclusion functions\n              $template = window.document.createDocumentFragment();\n\n              var slotMap = createMap();\n              var filledSlots = createMap();\n\n              // Parse the element selectors\n              forEach(directiveValue, function(elementSelector, slotName) {\n                // If an element selector starts with a ? then it is optional\n                var optional = (elementSelector.charAt(0) === '?');\n                elementSelector = optional ? elementSelector.substring(1) : elementSelector;\n\n                slotMap[elementSelector] = slotName;\n\n                // We explicitly assign `null` since this implies that a slot was defined but not filled.\n                // Later when calling boundTransclusion functions with a slot name we only error if the\n                // slot is `undefined`\n                slots[slotName] = null;\n\n                // filledSlots contains `true` for all slots that are either optional or have been\n                // filled. This is used to check that we have not missed any required slots\n                filledSlots[slotName] = optional;\n              });\n\n              // Add the matching elements into their slot\n              forEach($compileNode.contents(), function(node) {\n                var slotName = slotMap[directiveNormalize(nodeName_(node))];\n                if (slotName) {\n                  filledSlots[slotName] = true;\n                  slots[slotName] = slots[slotName] || window.document.createDocumentFragment();\n                  slots[slotName].appendChild(node);\n                } else {\n                  $template.appendChild(node);\n                }\n              });\n\n              // Check for required slots that were not filled\n              forEach(filledSlots, function(filled, slotName) {\n                if (!filled) {\n                  throw $compileMinErr('reqslot', 'Required transclusion slot `{0}` was not filled.', slotName);\n                }\n              });\n\n              for (var slotName in slots) {\n                if (slots[slotName]) {\n                  // Only define a transclusion function if the slot was filled\n                  var slotCompileNodes = jqLite(slots[slotName].childNodes);\n                  slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slotCompileNodes, transcludeFn);\n                }\n              }\n\n              $template = jqLite($template.childNodes);\n            }\n\n            $compileNode.empty(); // clear contents\n            childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, undefined,\n                undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope});\n            childTranscludeFn.$$slots = slots;\n          }\n        }\n\n        if (directive.template) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          directiveValue = (isFunction(directive.template))\n              ? directive.template($compileNode, templateAttrs)\n              : directive.template;\n\n          directiveValue = denormalizeTemplate(directiveValue);\n\n          if (directive.replace) {\n            replaceDirective = directive;\n            if (jqLiteIsTextNode(directiveValue)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length !== 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  'Template for directive \\'{0}\\' must have exactly one root element. {1}',\n                  directiveName, '');\n            }\n\n            replaceWith(jqCollection, $compileNode, compileNode);\n\n            var newTemplateAttrs = {$attr: {}};\n\n            // combine directives from the original node and from the template:\n            // - take the array of directives for this element\n            // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)\n            // - collect directives from the template and sort them by priority\n            // - combine directives as: processed + template + unprocessed\n            var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);\n            var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));\n\n            if (newIsolateScopeDirective || newScopeDirective) {\n              // The original directive caused the current element to be replaced but this element\n              // also needs to have a new scope, so we need to tell the template directives\n              // that they would need to get their scope from further up, if they require transclusion\n              markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective);\n            }\n            directives = directives.concat(templateDirectives).concat(unprocessedDirectives);\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\n\n            ii = directives.length;\n          } else {\n            $compileNode.html(directiveValue);\n          }\n        }\n\n        if (directive.templateUrl) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          if (directive.replace) {\n            replaceDirective = directive;\n          }\n\n          // eslint-disable-next-line no-func-assign\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,\n              templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {\n                controllerDirectives: controllerDirectives,\n                newScopeDirective: (newScopeDirective !== directive) && newScopeDirective,\n                newIsolateScopeDirective: newIsolateScopeDirective,\n                templateDirective: templateDirective,\n                nonTlbTranscludeDirective: nonTlbTranscludeDirective\n              });\n          ii = directives.length;\n        } else if (directive.compile) {\n          try {\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\n            var context = directive.$$originalDirective || directive;\n            if (isFunction(linkFn)) {\n              addLinkFns(null, bind(context, linkFn), attrStart, attrEnd);\n            } else if (linkFn) {\n              addLinkFns(bind(context, linkFn.pre), bind(context, linkFn.post), attrStart, attrEnd);\n            }\n          } catch (e) {\n            $exceptionHandler(e, startingTag($compileNode));\n          }\n        }\n\n        if (directive.terminal) {\n          nodeLinkFn.terminal = true;\n          terminalPriority = Math.max(terminalPriority, directive.priority);\n        }\n\n      }\n\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;\n      nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;\n      nodeLinkFn.templateOnThisElement = hasTemplate;\n      nodeLinkFn.transclude = childTranscludeFn;\n\n      previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;\n\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\n      return nodeLinkFn;\n\n      ////////////////////\n\n      function addLinkFns(pre, post, attrStart, attrEnd) {\n        if (pre) {\n          if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);\n          pre.require = directive.require;\n          pre.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            pre = cloneAndAnnotateFn(pre, {isolateScope: true});\n          }\n          preLinkFns.push(pre);\n        }\n        if (post) {\n          if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);\n          post.require = directive.require;\n          post.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            post = cloneAndAnnotateFn(post, {isolateScope: true});\n          }\n          postLinkFns.push(post);\n        }\n      }\n\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\n        var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element,\n            attrs, scopeBindingInfo;\n\n        if (compileNode === linkNode) {\n          attrs = templateAttrs;\n          $element = templateAttrs.$$element;\n        } else {\n          $element = jqLite(linkNode);\n          attrs = new Attributes($element, templateAttrs);\n        }\n\n        controllerScope = scope;\n        if (newIsolateScopeDirective) {\n          isolateScope = scope.$new(true);\n        } else if (newScopeDirective) {\n          controllerScope = scope.$parent;\n        }\n\n        if (boundTranscludeFn) {\n          // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn`\n          // is later passed as `parentBoundTranscludeFn` to `publicLinkFn`\n          transcludeFn = controllersBoundTransclude;\n          transcludeFn.$$boundTransclude = boundTranscludeFn;\n          // expose the slots on the `$transclude` function\n          transcludeFn.isSlotFilled = function(slotName) {\n            return !!boundTranscludeFn.$$slots[slotName];\n          };\n        }\n\n        if (controllerDirectives) {\n          elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective);\n        }\n\n        if (newIsolateScopeDirective) {\n          // Initialize isolate scope bindings for new isolate scope directive.\n          compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective ||\n              templateDirective === newIsolateScopeDirective.$$originalDirective)));\n          compile.$$addScopeClass($element, true);\n          isolateScope.$$isolateBindings =\n              newIsolateScopeDirective.$$isolateBindings;\n          scopeBindingInfo = initializeDirectiveBindings(scope, attrs, isolateScope,\n                                        isolateScope.$$isolateBindings,\n                                        newIsolateScopeDirective);\n          if (scopeBindingInfo.removeWatches) {\n            isolateScope.$on('$destroy', scopeBindingInfo.removeWatches);\n          }\n        }\n\n        // Initialize bindToController bindings\n        for (var name in elementControllers) {\n          var controllerDirective = controllerDirectives[name];\n          var controller = elementControllers[name];\n          var bindings = controllerDirective.$$bindings.bindToController;\n\n          controller.instance = controller();\n          $element.data('$' + controllerDirective.name + 'Controller', controller.instance);\n          controller.bindingInfo =\n            initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);\n          }\n\n        // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy\n        forEach(controllerDirectives, function(controllerDirective, name) {\n          var require = controllerDirective.require;\n          if (controllerDirective.bindToController && !isArray(require) && isObject(require)) {\n            extend(elementControllers[name].instance, getControllers(name, require, $element, elementControllers));\n          }\n        });\n\n        // Handle the init and destroy lifecycle hooks on all controllers that have them\n        forEach(elementControllers, function(controller) {\n          var controllerInstance = controller.instance;\n          if (isFunction(controllerInstance.$onChanges)) {\n            try {\n              controllerInstance.$onChanges(controller.bindingInfo.initialChanges);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          if (isFunction(controllerInstance.$onInit)) {\n            try {\n              controllerInstance.$onInit();\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          if (isFunction(controllerInstance.$doCheck)) {\n            controllerScope.$watch(function() { controllerInstance.$doCheck(); });\n            controllerInstance.$doCheck();\n          }\n          if (isFunction(controllerInstance.$onDestroy)) {\n            controllerScope.$on('$destroy', function callOnDestroyHook() {\n              controllerInstance.$onDestroy();\n            });\n          }\n        });\n\n        // PRELINKING\n        for (i = 0, ii = preLinkFns.length; i < ii; i++) {\n          linkFn = preLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // RECURSION\n        // We only pass the isolate scope, if the isolate directive has a template,\n        // otherwise the child elements do not belong to the isolate directive.\n        var scopeToChild = scope;\n        if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {\n          scopeToChild = isolateScope;\n        }\n        if (childLinkFn) {\n          childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);\n        }\n\n        // POSTLINKING\n        for (i = postLinkFns.length - 1; i >= 0; i--) {\n          linkFn = postLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // Trigger $postLink lifecycle hooks\n        forEach(elementControllers, function(controller) {\n          var controllerInstance = controller.instance;\n          if (isFunction(controllerInstance.$postLink)) {\n            controllerInstance.$postLink();\n          }\n        });\n\n        // This is the function that is injected as `$transclude`.\n        // Note: all arguments are optional!\n        function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) {\n          var transcludeControllers;\n          // No scope passed in:\n          if (!isScope(scope)) {\n            slotName = futureParentElement;\n            futureParentElement = cloneAttachFn;\n            cloneAttachFn = scope;\n            scope = undefined;\n          }\n\n          if (hasElementTranscludeDirective) {\n            transcludeControllers = elementControllers;\n          }\n          if (!futureParentElement) {\n            futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element;\n          }\n          if (slotName) {\n            // slotTranscludeFn can be one of three things:\n            //  * a transclude function - a filled slot\n            //  * `null` - an optional slot that was not filled\n            //  * `undefined` - a slot that was not declared (i.e. invalid)\n            var slotTranscludeFn = boundTranscludeFn.$$slots[slotName];\n            if (slotTranscludeFn) {\n              return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);\n            } else if (isUndefined(slotTranscludeFn)) {\n              throw $compileMinErr('noslot',\n               'No parent directive that requires a transclusion with slot name \"{0}\". ' +\n               'Element: {1}',\n               slotName, startingTag($element));\n            }\n          } else {\n            return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);\n          }\n        }\n      }\n    }\n\n    function getControllers(directiveName, require, $element, elementControllers) {\n      var value;\n\n      if (isString(require)) {\n        var match = require.match(REQUIRE_PREFIX_REGEXP);\n        var name = require.substring(match[0].length);\n        var inheritType = match[1] || match[3];\n        var optional = match[2] === '?';\n\n        //If only parents then start at the parent element\n        if (inheritType === '^^') {\n          $element = $element.parent();\n        //Otherwise attempt getting the controller from elementControllers in case\n        //the element is transcluded (and has no data) and to avoid .data if possible\n        } else {\n          value = elementControllers && elementControllers[name];\n          value = value && value.instance;\n        }\n\n        if (!value) {\n          var dataName = '$' + name + 'Controller';\n\n          if (inheritType === '^^' && $element[0] && $element[0].nodeType === NODE_TYPE_DOCUMENT) {\n            // inheritedData() uses the documentElement when it finds the document, so we would\n            // require from the element itself.\n            value = null;\n          } else {\n            value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName);\n          }\n        }\n\n        if (!value && !optional) {\n          throw $compileMinErr('ctreq',\n              'Controller \\'{0}\\', required by directive \\'{1}\\', can\\'t be found!',\n              name, directiveName);\n        }\n      } else if (isArray(require)) {\n        value = [];\n        for (var i = 0, ii = require.length; i < ii; i++) {\n          value[i] = getControllers(directiveName, require[i], $element, elementControllers);\n        }\n      } else if (isObject(require)) {\n        value = {};\n        forEach(require, function(controller, property) {\n          value[property] = getControllers(directiveName, controller, $element, elementControllers);\n        });\n      }\n\n      return value || null;\n    }\n\n    function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective) {\n      var elementControllers = createMap();\n      for (var controllerKey in controllerDirectives) {\n        var directive = controllerDirectives[controllerKey];\n        var locals = {\n          $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,\n          $element: $element,\n          $attrs: attrs,\n          $transclude: transcludeFn\n        };\n\n        var controller = directive.controller;\n        if (controller === '@') {\n          controller = attrs[directive.name];\n        }\n\n        var controllerInstance = $controller(controller, locals, true, directive.controllerAs);\n\n        // For directives with element transclusion the element is a comment.\n        // In this case .data will not attach any data.\n        // Instead, we save the controllers for the element in a local hash and attach to .data\n        // later, once we have the actual element.\n        elementControllers[directive.name] = controllerInstance;\n        $element.data('$' + directive.name + 'Controller', controllerInstance.instance);\n      }\n      return elementControllers;\n    }\n\n    // Depending upon the context in which a directive finds itself it might need to have a new isolated\n    // or child scope created. For instance:\n    // * if the directive has been pulled into a template because another directive with a higher priority\n    // asked for element transclusion\n    // * if the directive itself asks for transclusion but it is at the root of a template and the original\n    // element was replaced. See https://github.com/angular/angular.js/issues/12936\n    function markDirectiveScope(directives, isolateScope, newScope) {\n      for (var j = 0, jj = directives.length; j < jj; j++) {\n        directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope});\n      }\n    }\n\n    /**\n     * looks up the directive and decorates it with exception handling and proper parameters. We\n     * call this the boundDirective.\n     *\n     * @param {string} name name of the directive to look up.\n     * @param {string} location The directive must be found in specific format.\n     *   String containing any of theses characters:\n     *\n     *   * `E`: element name\n     *   * `A': attribute\n     *   * `C`: class\n     *   * `M`: comment\n     * @returns {boolean} true if directive was added.\n     */\n    function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,\n                          endAttrName) {\n      if (name === ignoreDirective) return null;\n      var match = null;\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          directive = directives[i];\n          if ((isUndefined(maxPriority) || maxPriority > directive.priority) &&\n               directive.restrict.indexOf(location) !== -1) {\n            if (startAttrName) {\n              directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});\n            }\n            if (!directive.$$bindings) {\n              var bindings = directive.$$bindings =\n                  parseDirectiveBindings(directive, directive.name);\n              if (isObject(bindings.isolateScope)) {\n                directive.$$isolateBindings = bindings.isolateScope;\n              }\n            }\n            tDirectives.push(directive);\n            match = directive;\n          }\n        }\n      }\n      return match;\n    }\n\n\n    /**\n     * looks up the directive and returns true if it is a multi-element directive,\n     * and therefore requires DOM nodes between -start and -end markers to be grouped\n     * together.\n     *\n     * @param {string} name name of the directive to look up.\n     * @returns true if directive was registered as multi-element.\n     */\n    function directiveIsMultiElement(name) {\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          directive = directives[i];\n          if (directive.multiElement) {\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n\n    /**\n     * When the element is replaced with HTML template then the new attributes\n     * on the template need to be merged with the existing attributes in the DOM.\n     * The desired effect is to have both of the attributes present.\n     *\n     * @param {object} dst destination attributes (original DOM)\n     * @param {object} src source attributes (from the directive template)\n     */\n    function mergeTemplateAttributes(dst, src) {\n      var srcAttr = src.$attr,\n          dstAttr = dst.$attr;\n\n      // reapply the old attributes to the new element\n      forEach(dst, function(value, key) {\n        if (key.charAt(0) !== '$') {\n          if (src[key] && src[key] !== value) {\n            if (value.length) {\n              value += (key === 'style' ? ';' : ' ') + src[key];\n            } else {\n              value = src[key];\n            }\n          }\n          dst.$set(key, value, true, srcAttr[key]);\n        }\n      });\n\n      // copy the new attributes on the old attrs object\n      forEach(src, function(value, key) {\n        // Check if we already set this attribute in the loop above.\n        // `dst` will never contain hasOwnProperty as DOM parser won't let it.\n        // You will get an \"InvalidCharacterError: DOM Exception 5\" error if you\n        // have an attribute like \"has-own-property\" or \"data-has-own-property\", etc.\n        if (!dst.hasOwnProperty(key) && key.charAt(0) !== '$') {\n          dst[key] = value;\n\n          if (key !== 'class' && key !== 'style') {\n            dstAttr[key] = srcAttr[key];\n          }\n        }\n      });\n    }\n\n\n    function compileTemplateUrl(directives, $compileNode, tAttrs,\n        $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {\n      var linkQueue = [],\n          afterTemplateNodeLinkFn,\n          afterTemplateChildLinkFn,\n          beforeTemplateCompileNode = $compileNode[0],\n          origAsyncDirective = directives.shift(),\n          derivedSyncDirective = inherit(origAsyncDirective, {\n            templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective\n          }),\n          templateUrl = (isFunction(origAsyncDirective.templateUrl))\n              ? origAsyncDirective.templateUrl($compileNode, tAttrs)\n              : origAsyncDirective.templateUrl,\n          templateNamespace = origAsyncDirective.templateNamespace;\n\n      $compileNode.empty();\n\n      $templateRequest(templateUrl)\n        .then(function(content) {\n          var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;\n\n          content = denormalizeTemplate(content);\n\n          if (origAsyncDirective.replace) {\n            if (jqLiteIsTextNode(content)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(templateNamespace, trim(content)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length !== 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  'Template for directive \\'{0}\\' must have exactly one root element. {1}',\n                  origAsyncDirective.name, templateUrl);\n            }\n\n            tempTemplateAttrs = {$attr: {}};\n            replaceWith($rootElement, $compileNode, compileNode);\n            var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);\n\n            if (isObject(origAsyncDirective.scope)) {\n              // the original directive that caused the template to be loaded async required\n              // an isolate scope\n              markDirectiveScope(templateDirectives, true);\n            }\n            directives = templateDirectives.concat(directives);\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\n          } else {\n            compileNode = beforeTemplateCompileNode;\n            $compileNode.html(content);\n          }\n\n          directives.unshift(derivedSyncDirective);\n\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,\n              childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,\n              previousCompileContext);\n          forEach($rootElement, function(node, i) {\n            if (node === compileNode) {\n              $rootElement[i] = $compileNode[0];\n            }\n          });\n          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);\n\n          while (linkQueue.length) {\n            var scope = linkQueue.shift(),\n                beforeTemplateLinkNode = linkQueue.shift(),\n                linkRootElement = linkQueue.shift(),\n                boundTranscludeFn = linkQueue.shift(),\n                linkNode = $compileNode[0];\n\n            if (scope.$$destroyed) continue;\n\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\n              var oldClasses = beforeTemplateLinkNode.className;\n\n              if (!(previousCompileContext.hasElementTranscludeDirective &&\n                  origAsyncDirective.replace)) {\n                // it was cloned therefore we have to clone as well.\n                linkNode = jqLiteClone(compileNode);\n              }\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\n\n              // Copy in CSS classes from original node\n              safeAddClass(jqLite(linkNode), oldClasses);\n            }\n            if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n            } else {\n              childBoundTranscludeFn = boundTranscludeFn;\n            }\n            afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,\n              childBoundTranscludeFn);\n          }\n          linkQueue = null;\n        }).catch(function(error) {\n          if (isError(error)) {\n            $exceptionHandler(error);\n          }\n        });\n\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {\n        var childBoundTranscludeFn = boundTranscludeFn;\n        if (scope.$$destroyed) return;\n        if (linkQueue) {\n          linkQueue.push(scope,\n                         node,\n                         rootElement,\n                         childBoundTranscludeFn);\n        } else {\n          if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n            childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n          }\n          afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);\n        }\n      };\n    }\n\n\n    /**\n     * Sorting function for bound directives.\n     */\n    function byPriority(a, b) {\n      var diff = b.priority - a.priority;\n      if (diff !== 0) return diff;\n      if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;\n      return a.index - b.index;\n    }\n\n    function assertNoDuplicate(what, previousDirective, directive, element) {\n\n      function wrapModuleNameIfDefined(moduleName) {\n        return moduleName ?\n          (' (module: ' + moduleName + ')') :\n          '';\n      }\n\n      if (previousDirective) {\n        throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}',\n            previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName),\n            directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element));\n      }\n    }\n\n\n    function addTextInterpolateDirective(directives, text) {\n      var interpolateFn = $interpolate(text, true);\n      if (interpolateFn) {\n        directives.push({\n          priority: 0,\n          compile: function textInterpolateCompileFn(templateNode) {\n            var templateNodeParent = templateNode.parent(),\n                hasCompileParent = !!templateNodeParent.length;\n\n            // When transcluding a template that has bindings in the root\n            // we don't have a parent and thus need to add the class during linking fn.\n            if (hasCompileParent) compile.$$addBindingClass(templateNodeParent);\n\n            return function textInterpolateLinkFn(scope, node) {\n              var parent = node.parent();\n              if (!hasCompileParent) compile.$$addBindingClass(parent);\n              compile.$$addBindingInfo(parent, interpolateFn.expressions);\n              scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {\n                node[0].nodeValue = value;\n              });\n            };\n          }\n        });\n      }\n    }\n\n\n    function wrapTemplate(type, template) {\n      type = lowercase(type || 'html');\n      switch (type) {\n      case 'svg':\n      case 'math':\n        var wrapper = window.document.createElement('div');\n        wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';\n        return wrapper.childNodes[0].childNodes;\n      default:\n        return template;\n      }\n    }\n\n\n    function getTrustedAttrContext(nodeName, attrNormalizedName) {\n      if (attrNormalizedName === 'srcdoc') {\n        return $sce.HTML;\n      }\n      // All nodes with src attributes require a RESOURCE_URL value, except for\n      // img and various html5 media nodes, which require the MEDIA_URL context.\n      if (attrNormalizedName === 'src' || attrNormalizedName === 'ngSrc') {\n        if (['img', 'video', 'audio', 'source', 'track'].indexOf(nodeName) === -1) {\n          return $sce.RESOURCE_URL;\n        }\n        return $sce.MEDIA_URL;\n      } else if (attrNormalizedName === 'xlinkHref') {\n        // Some xlink:href are okay, most aren't\n        if (nodeName === 'image') return $sce.MEDIA_URL;\n        if (nodeName === 'a') return $sce.URL;\n        return $sce.RESOURCE_URL;\n      } else if (\n          // Formaction\n          (nodeName === 'form' && attrNormalizedName === 'action') ||\n          // If relative URLs can go where they are not expected to, then\n          // all sorts of trust issues can arise.\n          (nodeName === 'base' && attrNormalizedName === 'href') ||\n          // links can be stylesheets or imports, which can run script in the current origin\n          (nodeName === 'link' && attrNormalizedName === 'href')\n      ) {\n        return $sce.RESOURCE_URL;\n      } else if (nodeName === 'a' && (attrNormalizedName === 'href' ||\n                                 attrNormalizedName === 'ngHref')) {\n        return $sce.URL;\n      }\n    }\n\n    function getTrustedPropContext(nodeName, propNormalizedName) {\n      var prop = propNormalizedName.toLowerCase();\n      return PROP_CONTEXTS[nodeName + '|' + prop] || PROP_CONTEXTS['*|' + prop];\n    }\n\n    function sanitizeSrcsetPropertyValue(value) {\n      return sanitizeSrcset($sce.valueOf(value), 'ng-prop-srcset');\n    }\n    function addPropertyDirective(node, directives, attrName, propName) {\n      if (EVENT_HANDLER_ATTR_REGEXP.test(propName)) {\n        throw $compileMinErr('nodomevents', 'Property bindings for HTML DOM event properties are disallowed');\n      }\n\n      var nodeName = nodeName_(node);\n      var trustedContext = getTrustedPropContext(nodeName, propName);\n\n      var sanitizer = identity;\n      // Sanitize img[srcset] + source[srcset] values.\n      if (propName === 'srcset' && (nodeName === 'img' || nodeName === 'source')) {\n        sanitizer = sanitizeSrcsetPropertyValue;\n      } else if (trustedContext) {\n        sanitizer = $sce.getTrusted.bind($sce, trustedContext);\n      }\n\n      directives.push({\n        priority: 100,\n        compile: function ngPropCompileFn(_, attr) {\n          var ngPropGetter = $parse(attr[attrName]);\n          var ngPropWatch = $parse(attr[attrName], function sceValueOf(val) {\n            // Unwrap the value to compare the actual inner safe value, not the wrapper object.\n            return $sce.valueOf(val);\n          });\n\n          return {\n            pre: function ngPropPreLinkFn(scope, $element) {\n              function applyPropValue() {\n                var propValue = ngPropGetter(scope);\n                $element[0][propName] = sanitizer(propValue);\n              }\n\n              applyPropValue();\n              scope.$watch(ngPropWatch, applyPropValue);\n            }\n          };\n        }\n      });\n    }\n\n    function addEventDirective(directives, attrName, eventName) {\n      directives.push(\n        createEventDirective($parse, $rootScope, $exceptionHandler, attrName, eventName, /*forceAsync=*/false)\n      );\n    }\n\n    function addAttrInterpolateDirective(node, directives, value, name, isNgAttr) {\n      var nodeName = nodeName_(node);\n      var trustedContext = getTrustedAttrContext(nodeName, name);\n      var mustHaveExpression = !isNgAttr;\n      var allOrNothing = ALL_OR_NOTHING_ATTRS[name] || isNgAttr;\n\n      var interpolateFn = $interpolate(value, mustHaveExpression, trustedContext, allOrNothing);\n\n      // no interpolation found -> ignore\n      if (!interpolateFn) return;\n\n      if (name === 'multiple' && nodeName === 'select') {\n        throw $compileMinErr('selmulti',\n            'Binding to the \\'multiple\\' attribute is not supported. Element: {0}',\n            startingTag(node));\n      }\n\n      if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {\n        throw $compileMinErr('nodomevents', 'Interpolations for HTML DOM event attributes are disallowed');\n      }\n\n      directives.push({\n        priority: 100,\n        compile: function() {\n            return {\n              pre: function attrInterpolatePreLinkFn(scope, element, attr) {\n                var $$observers = (attr.$$observers || (attr.$$observers = createMap()));\n\n                // If the attribute has changed since last $interpolate()ed\n                var newValue = attr[name];\n                if (newValue !== value) {\n                  // we need to interpolate again since the attribute value has been updated\n                  // (e.g. by another directive's compile function)\n                  // ensure unset/empty values make interpolateFn falsy\n                  interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing);\n                  value = newValue;\n                }\n\n                // if attribute was updated so that there is no interpolation going on we don't want to\n                // register any observers\n                if (!interpolateFn) return;\n\n                // initialize attr object so that it's ready in case we need the value for isolate\n                // scope initialization, otherwise the value would not be available from isolate\n                // directive's linking fn during linking phase\n                attr[name] = interpolateFn(scope);\n\n                ($$observers[name] || ($$observers[name] = [])).$$inter = true;\n                (attr.$$observers && attr.$$observers[name].$$scope || scope).\n                  $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {\n                    //special case for class attribute addition + removal\n                    //so that class changes can tap into the animation\n                    //hooks provided by the $animate service. Be sure to\n                    //skip animations when the first digest occurs (when\n                    //both the new and the old values are the same) since\n                    //the CSS classes are the non-interpolated values\n                    if (name === 'class' && newValue !== oldValue) {\n                      attr.$updateClass(newValue, oldValue);\n                    } else {\n                      attr.$set(name, newValue);\n                    }\n                  });\n              }\n            };\n          }\n      });\n    }\n\n\n    /**\n     * This is a special jqLite.replaceWith, which can replace items which\n     * have no parents, provided that the containing jqLite collection is provided.\n     *\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\n     *                               in the root of the tree.\n     * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep\n     *                                  the shell, but replace its DOM node reference.\n     * @param {Node} newNode The new DOM node.\n     */\n    function replaceWith($rootElement, elementsToRemove, newNode) {\n      var firstElementToRemove = elementsToRemove[0],\n          removeCount = elementsToRemove.length,\n          parent = firstElementToRemove.parentNode,\n          i, ii;\n\n      if ($rootElement) {\n        for (i = 0, ii = $rootElement.length; i < ii; i++) {\n          if ($rootElement[i] === firstElementToRemove) {\n            $rootElement[i++] = newNode;\n            for (var j = i, j2 = j + removeCount - 1,\n                     jj = $rootElement.length;\n                 j < jj; j++, j2++) {\n              if (j2 < jj) {\n                $rootElement[j] = $rootElement[j2];\n              } else {\n                delete $rootElement[j];\n              }\n            }\n            $rootElement.length -= removeCount - 1;\n\n            // If the replaced element is also the jQuery .context then replace it\n            // .context is a deprecated jQuery api, so we should set it only when jQuery set it\n            // http://api.jquery.com/context/\n            if ($rootElement.context === firstElementToRemove) {\n              $rootElement.context = newNode;\n            }\n            break;\n          }\n        }\n      }\n\n      if (parent) {\n        parent.replaceChild(newNode, firstElementToRemove);\n      }\n\n      // Append all the `elementsToRemove` to a fragment. This will...\n      // - remove them from the DOM\n      // - allow them to still be traversed with .nextSibling\n      // - allow a single fragment.qSA to fetch all elements being removed\n      var fragment = window.document.createDocumentFragment();\n      for (i = 0; i < removeCount; i++) {\n        fragment.appendChild(elementsToRemove[i]);\n      }\n\n      if (jqLite.hasData(firstElementToRemove)) {\n        // Copy over user data (that includes AngularJS's $scope etc.). Don't copy private\n        // data here because there's no public interface in jQuery to do that and copying over\n        // event listeners (which is the main use of private data) wouldn't work anyway.\n        jqLite.data(newNode, jqLite.data(firstElementToRemove));\n\n        // Remove $destroy event listeners from `firstElementToRemove`\n        jqLite(firstElementToRemove).off('$destroy');\n      }\n\n      // Cleanup any data/listeners on the elements and children.\n      // This includes invoking the $destroy event on any elements with listeners.\n      jqLite.cleanData(fragment.querySelectorAll('*'));\n\n      // Update the jqLite collection to only contain the `newNode`\n      for (i = 1; i < removeCount; i++) {\n        delete elementsToRemove[i];\n      }\n      elementsToRemove[0] = newNode;\n      elementsToRemove.length = 1;\n    }\n\n\n    function cloneAndAnnotateFn(fn, annotation) {\n      return extend(function() { return fn.apply(null, arguments); }, fn, annotation);\n    }\n\n\n    function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) {\n      try {\n        linkFn(scope, $element, attrs, controllers, transcludeFn);\n      } catch (e) {\n        $exceptionHandler(e, startingTag($element));\n      }\n    }\n\n    function strictBindingsCheck(attrName, directiveName) {\n      if (strictComponentBindingsEnabled) {\n        throw $compileMinErr('missingattr',\n          'Attribute \\'{0}\\' of \\'{1}\\' is non-optional and must be set!',\n          attrName, directiveName);\n      }\n    }\n\n    // Set up $watches for isolate scope and controller bindings.\n    function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) {\n      var removeWatchCollection = [];\n      var initialChanges = {};\n      var changes;\n\n      forEach(bindings, function initializeBinding(definition, scopeName) {\n        var attrName = definition.attrName,\n        optional = definition.optional,\n        mode = definition.mode, // @, =, <, or &\n        lastValue,\n        parentGet, parentSet, compare, removeWatch;\n\n        switch (mode) {\n\n          case '@':\n            if (!optional && !hasOwnProperty.call(attrs, attrName)) {\n              strictBindingsCheck(attrName, directive.name);\n              destination[scopeName] = attrs[attrName] = undefined;\n\n            }\n            removeWatch = attrs.$observe(attrName, function(value) {\n              if (isString(value) || isBoolean(value)) {\n                var oldValue = destination[scopeName];\n                recordChanges(scopeName, value, oldValue);\n                destination[scopeName] = value;\n              }\n            });\n            attrs.$$observers[attrName].$$scope = scope;\n            lastValue = attrs[attrName];\n            if (isString(lastValue)) {\n              // If the attribute has been provided then we trigger an interpolation to ensure\n              // the value is there for use in the link fn\n              destination[scopeName] = $interpolate(lastValue)(scope);\n            } else if (isBoolean(lastValue)) {\n              // If the attributes is one of the BOOLEAN_ATTR then AngularJS will have converted\n              // the value to boolean rather than a string, so we special case this situation\n              destination[scopeName] = lastValue;\n            }\n            initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '=':\n            if (!hasOwnProperty.call(attrs, attrName)) {\n              if (optional) break;\n              strictBindingsCheck(attrName, directive.name);\n              attrs[attrName] = undefined;\n            }\n            if (optional && !attrs[attrName]) break;\n\n            parentGet = $parse(attrs[attrName]);\n            if (parentGet.literal) {\n              compare = equals;\n            } else {\n              compare = simpleCompare;\n            }\n            parentSet = parentGet.assign || function() {\n              // reset the change, or we will throw this exception on every $digest\n              lastValue = destination[scopeName] = parentGet(scope);\n              throw $compileMinErr('nonassign',\n                  'Expression \\'{0}\\' in attribute \\'{1}\\' used with directive \\'{2}\\' is non-assignable!',\n                  attrs[attrName], attrName, directive.name);\n            };\n            lastValue = destination[scopeName] = parentGet(scope);\n            var parentValueWatch = function parentValueWatch(parentValue) {\n              if (!compare(parentValue, destination[scopeName])) {\n                // we are out of sync and need to copy\n                if (!compare(parentValue, lastValue)) {\n                  // parent changed and it has precedence\n                  destination[scopeName] = parentValue;\n                } else {\n                  // if the parent can be assigned then do so\n                  parentSet(scope, parentValue = destination[scopeName]);\n                }\n              }\n              lastValue = parentValue;\n              return lastValue;\n            };\n            parentValueWatch.$stateful = true;\n            if (definition.collection) {\n              removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch);\n            } else {\n              removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal);\n            }\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '<':\n            if (!hasOwnProperty.call(attrs, attrName)) {\n              if (optional) break;\n              strictBindingsCheck(attrName, directive.name);\n              attrs[attrName] = undefined;\n            }\n            if (optional && !attrs[attrName]) break;\n\n            parentGet = $parse(attrs[attrName]);\n            var isLiteral = parentGet.literal;\n\n            var initialValue = destination[scopeName] = parentGet(scope);\n            initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);\n\n            removeWatch = scope[definition.collection ? '$watchCollection' : '$watch'](parentGet, function parentValueWatchAction(newValue, oldValue) {\n              if (oldValue === newValue) {\n                if (oldValue === initialValue || (isLiteral && equals(oldValue, initialValue))) {\n                  return;\n                }\n                oldValue = initialValue;\n              }\n              recordChanges(scopeName, newValue, oldValue);\n              destination[scopeName] = newValue;\n            });\n\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '&':\n            if (!optional && !hasOwnProperty.call(attrs, attrName)) {\n              strictBindingsCheck(attrName, directive.name);\n            }\n            // Don't assign Object.prototype method to scope\n            parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop;\n\n            // Don't assign noop to destination if expression is not valid\n            if (parentGet === noop && optional) break;\n\n            destination[scopeName] = function(locals) {\n              return parentGet(scope, locals);\n            };\n            break;\n        }\n      });\n\n      function recordChanges(key, currentValue, previousValue) {\n        if (isFunction(destination.$onChanges) && !simpleCompare(currentValue, previousValue)) {\n          // If we have not already scheduled the top level onChangesQueue handler then do so now\n          if (!onChangesQueue) {\n            scope.$$postDigest(flushOnChangesQueue);\n            onChangesQueue = [];\n          }\n          // If we have not already queued a trigger of onChanges for this controller then do so now\n          if (!changes) {\n            changes = {};\n            onChangesQueue.push(triggerOnChangesHook);\n          }\n          // If the has been a change on this property already then we need to reuse the previous value\n          if (changes[key]) {\n            previousValue = changes[key].previousValue;\n          }\n          // Store this change\n          changes[key] = new SimpleChange(previousValue, currentValue);\n        }\n      }\n\n      function triggerOnChangesHook() {\n        destination.$onChanges(changes);\n        // Now clear the changes so that we schedule onChanges when more changes arrive\n        changes = undefined;\n      }\n\n      return {\n        initialChanges: initialChanges,\n        removeWatches: removeWatchCollection.length && function removeWatches() {\n          for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) {\n            removeWatchCollection[i]();\n          }\n        }\n      };\n    }\n  }];\n}\n\nfunction SimpleChange(previous, current) {\n  this.previousValue = previous;\n  this.currentValue = current;\n}\nSimpleChange.prototype.isFirstChange = function() { return this.previousValue === _UNINITIALIZED_VALUE; };\n\n\nvar PREFIX_REGEXP = /^((?:x|data)[:\\-_])/i;\nvar SPECIAL_CHARS_REGEXP = /[:\\-_]+(.)/g;\n\n/**\n * Converts all accepted directives format into proper directive name.\n * @param name Name to normalize\n */\nfunction directiveNormalize(name) {\n  return name\n    .replace(PREFIX_REGEXP, '')\n    .replace(SPECIAL_CHARS_REGEXP, function(_, letter, offset) {\n      return offset ? letter.toUpperCase() : letter;\n    });\n}\n\n/**\n * @ngdoc type\n * @name $compile.directive.Attributes\n *\n * @description\n * A shared object between directive compile / linking functions which contains normalized DOM\n * element attributes. The values reflect current binding state `{{ }}`. The normalization is\n * needed since all of these are treated as equivalent in AngularJS:\n *\n * ```\n *    <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\n * ```\n */\n\n/**\n * @ngdoc property\n * @name $compile.directive.Attributes#$attr\n *\n * @description\n * A map of DOM element attribute names to the normalized name. This is\n * needed to do reverse lookup from normalized name back to actual name.\n */\n\n\n/**\n * @ngdoc method\n * @name $compile.directive.Attributes#$set\n * @kind function\n *\n * @description\n * Set DOM element attribute value.\n *\n *\n * @param {string} name Normalized element attribute name of the property to modify. The name is\n *          reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\n *          property to the original name.\n * @param {string} value Value to set the attribute to. The value can be an interpolated string.\n */\n\n\n\n/**\n * Closure compiler type information\n */\n\nfunction nodesetLinkingFn(\n  /* angular.Scope */ scope,\n  /* NodeList */ nodeList,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction directiveLinkingFn(\n  /* nodesetLinkingFn */ nodesetLinkingFn,\n  /* angular.Scope */ scope,\n  /* Node */ node,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction tokenDifference(str1, str2) {\n  var values = '',\n      tokens1 = str1.split(/\\s+/),\n      tokens2 = str2.split(/\\s+/);\n\n  outer:\n  for (var i = 0; i < tokens1.length; i++) {\n    var token = tokens1[i];\n    for (var j = 0; j < tokens2.length; j++) {\n      if (token === tokens2[j]) continue outer;\n    }\n    values += (values.length > 0 ? ' ' : '') + token;\n  }\n  return values;\n}\n\nfunction removeComments(jqNodes) {\n  jqNodes = jqLite(jqNodes);\n  var i = jqNodes.length;\n\n  if (i <= 1) {\n    return jqNodes;\n  }\n\n  while (i--) {\n    var node = jqNodes[i];\n    if (node.nodeType === NODE_TYPE_COMMENT ||\n       (node.nodeType === NODE_TYPE_TEXT && node.nodeValue.trim() === '')) {\n         splice.call(jqNodes, i, 1);\n    }\n  }\n  return jqNodes;\n}\n\nvar $controllerMinErr = minErr('$controller');\n\n\nvar CNTRL_REG = /^(\\S+)(\\s+as\\s+([\\w$]+))?$/;\nfunction identifierForController(controller, ident) {\n  if (ident && isString(ident)) return ident;\n  if (isString(controller)) {\n    var match = CNTRL_REG.exec(controller);\n    if (match) return match[3];\n  }\n}\n\n\n/**\n * @ngdoc provider\n * @name $controllerProvider\n * @this\n *\n * @description\n * The {@link ng.$controller $controller service} is used by AngularJS to create new\n * controllers.\n *\n * This provider allows controller registration via the\n * {@link ng.$controllerProvider#register register} method.\n */\nfunction $ControllerProvider() {\n  var controllers = {};\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#has\n   * @param {string} name Controller name to check.\n   */\n  this.has = function(name) {\n    return controllers.hasOwnProperty(name);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Controller name, or an object map of controllers where the keys are\n   *    the names and the values are the constructors.\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\n   *    annotations in the array notation).\n   */\n  this.register = function(name, constructor) {\n    assertNotHasOwnProperty(name, 'controller');\n    if (isObject(name)) {\n      extend(controllers, name);\n    } else {\n      controllers[name] = constructor;\n    }\n  };\n\n  this.$get = ['$injector', function($injector) {\n\n    /**\n     * @ngdoc service\n     * @name $controller\n     * @requires $injector\n     *\n     * @param {Function|string} constructor If called with a function then it's considered to be the\n     *    controller constructor function. Otherwise it's considered to be a string which is used\n     *    to retrieve the controller constructor using the following steps:\n     *\n     *    * check if a controller with given name is registered via `$controllerProvider`\n     *    * check if evaluating the string on the current scope returns a constructor\n     *\n     *    The string can use the `controller as property` syntax, where the controller instance is published\n     *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this\n     *    to work correctly.\n     *\n     * @param {Object} locals Injection locals for Controller.\n     * @return {Object} Instance of given controller.\n     *\n     * @description\n     * `$controller` service is responsible for instantiating controllers.\n     *\n     * It's just a simple call to {@link auto.$injector $injector}, but extracted into\n     * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).\n     */\n    return function $controller(expression, locals, later, ident) {\n      // PRIVATE API:\n      //   param `later` --- indicates that the controller's constructor is invoked at a later time.\n      //                     If true, $controller will allocate the object with the correct\n      //                     prototype chain, but will not invoke the controller until a returned\n      //                     callback is invoked.\n      //   param `ident` --- An optional label which overrides the label parsed from the controller\n      //                     expression, if any.\n      var instance, match, constructor, identifier;\n      later = later === true;\n      if (ident && isString(ident)) {\n        identifier = ident;\n      }\n\n      if (isString(expression)) {\n        match = expression.match(CNTRL_REG);\n        if (!match) {\n          throw $controllerMinErr('ctrlfmt',\n            'Badly formed controller string \\'{0}\\'. ' +\n            'Must match `__name__ as __id__` or `__name__`.', expression);\n        }\n        constructor = match[1];\n        identifier = identifier || match[3];\n        expression = controllers.hasOwnProperty(constructor)\n            ? controllers[constructor]\n            : getter(locals.$scope, constructor, true);\n\n        if (!expression) {\n          throw $controllerMinErr('ctrlreg',\n            'The controller with the name \\'{0}\\' is not registered.', constructor);\n        }\n\n        assertArgFn(expression, constructor, true);\n      }\n\n      if (later) {\n        // Instantiate controller later:\n        // This machinery is used to create an instance of the object before calling the\n        // controller's constructor itself.\n        //\n        // This allows properties to be added to the controller before the constructor is\n        // invoked. Primarily, this is used for isolate scope bindings in $compile.\n        //\n        // This feature is not intended for use by applications, and is thus not documented\n        // publicly.\n        // Object creation: http://jsperf.com/create-constructor/2\n        var controllerPrototype = (isArray(expression) ?\n          expression[expression.length - 1] : expression).prototype;\n        instance = Object.create(controllerPrototype || null);\n\n        if (identifier) {\n          addIdentifier(locals, identifier, instance, constructor || expression.name);\n        }\n\n        return extend(function $controllerInit() {\n          var result = $injector.invoke(expression, instance, locals, constructor);\n          if (result !== instance && (isObject(result) || isFunction(result))) {\n            instance = result;\n            if (identifier) {\n              // If result changed, re-assign controllerAs value to scope.\n              addIdentifier(locals, identifier, instance, constructor || expression.name);\n            }\n          }\n          return instance;\n        }, {\n          instance: instance,\n          identifier: identifier\n        });\n      }\n\n      instance = $injector.instantiate(expression, locals, constructor);\n\n      if (identifier) {\n        addIdentifier(locals, identifier, instance, constructor || expression.name);\n      }\n\n      return instance;\n    };\n\n    function addIdentifier(locals, identifier, instance, name) {\n      if (!(locals && isObject(locals.$scope))) {\n        throw minErr('$controller')('noscp',\n          'Cannot export controller \\'{0}\\' as \\'{1}\\'! No $scope object provided via `locals`.',\n          name, identifier);\n      }\n\n      locals.$scope[identifier] = instance;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $document\n * @requires $window\n * @this\n *\n * @description\n * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.\n *\n * @example\n   <example module=\"documentExample\" name=\"document\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <p>$document title: <b ng-bind=\"title\"></b></p>\n         <p>window.document title: <b ng-bind=\"windowTitle\"></b></p>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('documentExample', [])\n         .controller('ExampleController', ['$scope', '$document', function($scope, $document) {\n           $scope.title = $document[0].title;\n           $scope.windowTitle = angular.element(window.document)[0].title;\n         }]);\n     </file>\n   </example>\n */\nfunction $DocumentProvider() {\n  this.$get = ['$window', function(window) {\n    return jqLite(window.document);\n  }];\n}\n\n\n/**\n * @private\n * @this\n * Listens for document visibility change and makes the current status accessible.\n */\nfunction $$IsDocumentHiddenProvider() {\n  this.$get = ['$document', '$rootScope', function($document, $rootScope) {\n    var doc = $document[0];\n    var hidden = doc && doc.hidden;\n\n    $document.on('visibilitychange', changeListener);\n\n    $rootScope.$on('$destroy', function() {\n      $document.off('visibilitychange', changeListener);\n    });\n\n    function changeListener() {\n      hidden = doc.hidden;\n    }\n\n    return function() {\n      return hidden;\n    };\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n * @requires ng.$log\n * @this\n *\n * @description\n * Any uncaught exception in AngularJS expressions is delegated to this service.\n * The default implementation simply delegates to `$log.error` which logs it into\n * the browser console.\n *\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\n * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.\n *\n * ## Example:\n *\n * The example below will overwrite the default `$exceptionHandler` in order to (a) log uncaught\n * errors to the backend for later inspection by the developers and (b) to use `$log.warn()` instead\n * of `$log.error()`.\n *\n * ```js\n *   angular.\n *     module('exceptionOverwrite', []).\n *     factory('$exceptionHandler', ['$log', 'logErrorsToBackend', function($log, logErrorsToBackend) {\n *       return function myExceptionHandler(exception, cause) {\n *         logErrorsToBackend(exception, cause);\n *         $log.warn(exception, cause);\n *       };\n *     }]);\n * ```\n *\n * <hr />\n * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind`\n * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler}\n * (unless executed during a digest).\n *\n * If you wish, you can manually delegate exceptions, e.g.\n * `try { ... } catch(e) { $exceptionHandler(e); }`\n *\n * @param {Error} exception Exception associated with the error.\n * @param {string=} cause Optional information about the context in which\n *       the error was thrown.\n *\n */\nfunction $ExceptionHandlerProvider() {\n  this.$get = ['$log', function($log) {\n    return function(exception, cause) {\n      $log.error.apply($log, arguments);\n    };\n  }];\n}\n\nvar $$ForceReflowProvider = /** @this */ function() {\n  this.$get = ['$document', function($document) {\n    return function(domNode) {\n      //the line below will force the browser to perform a repaint so\n      //that all the animated elements within the animation frame will\n      //be properly updated and drawn on screen. This is required to\n      //ensure that the preparation animation is properly flushed so that\n      //the active state picks up from there. DO NOT REMOVE THIS LINE.\n      //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH\n      //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND\n      //WILL TAKE YEARS AWAY FROM YOUR LIFE.\n      if (domNode) {\n        if (!domNode.nodeType && domNode instanceof jqLite) {\n          domNode = domNode[0];\n        }\n      } else {\n        domNode = $document[0].body;\n      }\n      return domNode.offsetWidth + 1;\n    };\n  }];\n};\n\nvar APPLICATION_JSON = 'application/json';\nvar CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};\nvar JSON_START = /^\\[|^\\{(?!\\{)/;\nvar JSON_ENDS = {\n  '[': /]$/,\n  '{': /}$/\n};\nvar JSON_PROTECTION_PREFIX = /^\\)]\\}',?\\n/;\nvar $httpMinErr = minErr('$http');\n\nfunction serializeValue(v) {\n  if (isObject(v)) {\n    return isDate(v) ? v.toISOString() : toJson(v);\n  }\n  return v;\n}\n\n\n/** @this */\nfunction $HttpParamSerializerProvider() {\n  /**\n   * @ngdoc service\n   * @name $httpParamSerializer\n   * @description\n   *\n   * Default {@link $http `$http`} params serializer that converts objects to strings\n   * according to the following rules:\n   *\n   * * `{'foo': 'bar'}` results in `foo=bar`\n   * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object)\n   * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element)\n   * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D` (stringified and encoded representation of an object)\n   *\n   * Note that serializer will sort the request parameters alphabetically.\n   */\n\n  this.$get = function() {\n    return function ngParamSerializer(params) {\n      if (!params) return '';\n      var parts = [];\n      forEachSorted(params, function(value, key) {\n        if (value === null || isUndefined(value) || isFunction(value)) return;\n        if (isArray(value)) {\n          forEach(value, function(v) {\n            parts.push(encodeUriQuery(key)  + '=' + encodeUriQuery(serializeValue(v)));\n          });\n        } else {\n          parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value)));\n        }\n      });\n\n      return parts.join('&');\n    };\n  };\n}\n\n/** @this */\nfunction $HttpParamSerializerJQLikeProvider() {\n  /**\n   * @ngdoc service\n   * @name $httpParamSerializerJQLike\n   *\n   * @description\n   *\n   * Alternative {@link $http `$http`} params serializer that follows\n   * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic.\n   * The serializer will also sort the params alphabetically.\n   *\n   * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property:\n   *\n   * ```js\n   * $http({\n   *   url: myUrl,\n   *   method: 'GET',\n   *   params: myParams,\n   *   paramSerializer: '$httpParamSerializerJQLike'\n   * });\n   * ```\n   *\n   * It is also possible to set it as the default `paramSerializer` in the\n   * {@link $httpProvider#defaults `$httpProvider`}.\n   *\n   * Additionally, you can inject the serializer and use it explicitly, for example to serialize\n   * form data for submission:\n   *\n   * ```js\n   * .controller(function($http, $httpParamSerializerJQLike) {\n   *   //...\n   *\n   *   $http({\n   *     url: myUrl,\n   *     method: 'POST',\n   *     data: $httpParamSerializerJQLike(myData),\n   *     headers: {\n   *       'Content-Type': 'application/x-www-form-urlencoded'\n   *     }\n   *   });\n   *\n   * });\n   * ```\n   *\n   */\n  this.$get = function() {\n    return function jQueryLikeParamSerializer(params) {\n      if (!params) return '';\n      var parts = [];\n      serialize(params, '', true);\n      return parts.join('&');\n\n      function serialize(toSerialize, prefix, topLevel) {\n        if (isArray(toSerialize)) {\n          forEach(toSerialize, function(value, index) {\n            serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']');\n          });\n        } else if (isObject(toSerialize) && !isDate(toSerialize)) {\n          forEachSorted(toSerialize, function(value, key) {\n            serialize(value, prefix +\n                (topLevel ? '' : '[') +\n                key +\n                (topLevel ? '' : ']'));\n          });\n        } else {\n          if (isFunction(toSerialize)) {\n            toSerialize = toSerialize();\n          }\n          parts.push(encodeUriQuery(prefix) + '=' +\n              (toSerialize == null ? '' : encodeUriQuery(serializeValue(toSerialize))));\n        }\n      }\n    };\n  };\n}\n\nfunction defaultHttpResponseTransform(data, headers) {\n  if (isString(data)) {\n    // Strip json vulnerability protection prefix and trim whitespace\n    var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim();\n\n    if (tempData) {\n      var contentType = headers('Content-Type');\n      var hasJsonContentType = contentType && (contentType.indexOf(APPLICATION_JSON) === 0);\n\n      if (hasJsonContentType || isJsonLike(tempData)) {\n        try {\n          data = fromJson(tempData);\n        } catch (e) {\n          if (!hasJsonContentType) {\n            return data;\n          }\n          throw $httpMinErr('baddata', 'Data must be a valid JSON object. Received: \"{0}\". ' +\n          'Parse error: \"{1}\"', data, e);\n        }\n      }\n    }\n  }\n\n  return data;\n}\n\nfunction isJsonLike(str) {\n    var jsonStart = str.match(JSON_START);\n    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);\n}\n\n/**\n * Parse headers into key value object\n *\n * @param {string} headers Raw headers as a string\n * @returns {Object} Parsed headers as key value object\n */\nfunction parseHeaders(headers) {\n  var parsed = createMap(), i;\n\n  function fillInParsed(key, val) {\n    if (key) {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  }\n\n  if (isString(headers)) {\n    forEach(headers.split('\\n'), function(line) {\n      i = line.indexOf(':');\n      fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1)));\n    });\n  } else if (isObject(headers)) {\n    forEach(headers, function(headerVal, headerKey) {\n      fillInParsed(lowercase(headerKey), trim(headerVal));\n    });\n  }\n\n  return parsed;\n}\n\n\n/**\n * Returns a function that provides access to parsed headers.\n *\n * Headers are lazy parsed when first requested.\n * @see parseHeaders\n *\n * @param {(string|Object)} headers Headers to provide access to.\n * @returns {function(string=)} Returns a getter function which if called with:\n *\n *   - if called with an argument returns a single header value or null\n *   - if called with no arguments returns an object containing all headers.\n */\nfunction headersGetter(headers) {\n  var headersObj;\n\n  return function(name) {\n    if (!headersObj) headersObj =  parseHeaders(headers);\n\n    if (name) {\n      var value = headersObj[lowercase(name)];\n      if (value === undefined) {\n        value = null;\n      }\n      return value;\n    }\n\n    return headersObj;\n  };\n}\n\n\n/**\n * Chain all given functions\n *\n * This function is used for both request and response transforming\n *\n * @param {*} data Data to transform.\n * @param {function(string=)} headers HTTP headers getter fn.\n * @param {number} status HTTP status code of the response.\n * @param {(Function|Array.<Function>)} fns Function or an array of functions.\n * @returns {*} Transformed data.\n */\nfunction transformData(data, headers, status, fns) {\n  if (isFunction(fns)) {\n    return fns(data, headers, status);\n  }\n\n  forEach(fns, function(fn) {\n    data = fn(data, headers, status);\n  });\n\n  return data;\n}\n\n\nfunction isSuccess(status) {\n  return 200 <= status && status < 300;\n}\n\n\n/**\n * @ngdoc provider\n * @name $httpProvider\n * @this\n *\n * @description\n * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.\n */\nfunction $HttpProvider() {\n  /**\n   * @ngdoc property\n   * @name $httpProvider#defaults\n   * @description\n   *\n   * Object containing default values for all {@link ng.$http $http} requests.\n   *\n   * - **`defaults.cache`** - {boolean|Object} - A boolean value or object created with\n   * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses\n   * by default. See {@link $http#caching $http Caching} for more information.\n   *\n   * - **`defaults.headers`** - {Object} - Default headers for all $http requests.\n   * Refer to {@link ng.$http#setting-http-headers $http} for documentation on\n   * setting default headers.\n   *     - **`defaults.headers.common`**\n   *     - **`defaults.headers.post`**\n   *     - **`defaults.headers.put`**\n   *     - **`defaults.headers.patch`**\n   *\n   * - **`defaults.jsonpCallbackParam`** - `{string}` - the name of the query parameter that passes the name of the\n   * callback in a JSONP request. The value of this parameter will be replaced with the expression generated by the\n   * {@link $jsonpCallbacks} service. Defaults to `'callback'`.\n   *\n   * - **`defaults.paramSerializer`** - `{string|function(Object<string,string>):string}` - A function\n   *  used to the prepare string representation of request parameters (specified as an object).\n   *  If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}.\n   *  Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}.\n   *\n   * - **`defaults.transformRequest`** -\n   * `{Array<function(data, headersGetter)>|function(data, headersGetter)}` -\n   * An array of functions (or a single function) which are applied to the request data.\n   * By default, this is an array with one request transformation function:\n   *\n   *   - If the `data` property of the request configuration object contains an object, serialize it\n   *     into JSON format.\n   *\n   * - **`defaults.transformResponse`** -\n   * `{Array<function(data, headersGetter, status)>|function(data, headersGetter, status)}` -\n   * An array of functions (or a single function) which are applied to the response data. By default,\n   * this is an array which applies one response transformation function that does two things:\n   *\n   *  - If XSRF prefix is detected, strip it\n   *    (see {@link ng.$http#security-considerations Security Considerations in the $http docs}).\n   *  - If the `Content-Type` is `application/json` or the response looks like JSON,\n   *    deserialize it using a JSON parser.\n   *\n   * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.\n   * Defaults value is `'XSRF-TOKEN'`.\n   *\n   * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the\n   * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.\n   *\n   */\n  var defaults = this.defaults = {\n    // transform incoming response data\n    transformResponse: [defaultHttpResponseTransform],\n\n    // transform outgoing request data\n    transformRequest: [function(d) {\n      return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;\n    }],\n\n    // default headers\n    headers: {\n      common: {\n        'Accept': 'application/json, text/plain, */*'\n      },\n      post:   shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      put:    shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      patch:  shallowCopy(CONTENT_TYPE_APPLICATION_JSON)\n    },\n\n    xsrfCookieName: 'XSRF-TOKEN',\n    xsrfHeaderName: 'X-XSRF-TOKEN',\n\n    paramSerializer: '$httpParamSerializer',\n\n    jsonpCallbackParam: 'callback'\n  };\n\n  var useApplyAsync = false;\n  /**\n   * @ngdoc method\n   * @name $httpProvider#useApplyAsync\n   * @description\n   *\n   * Configure $http service to combine processing of multiple http responses received at around\n   * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in\n   * significant performance improvement for bigger applications that make many HTTP requests\n   * concurrently (common during application bootstrap).\n   *\n   * Defaults to false. If no value is specified, returns the current configured value.\n   *\n   * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred\n   *    \"apply\" on the next tick, giving time for subsequent requests in a roughly ~10ms window\n   *    to load and share the same digest cycle.\n   *\n   * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.\n   *    otherwise, returns the current configured value.\n   */\n  this.useApplyAsync = function(value) {\n    if (isDefined(value)) {\n      useApplyAsync = !!value;\n      return this;\n    }\n    return useApplyAsync;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $httpProvider#interceptors\n   * @description\n   *\n   * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http}\n   * pre-processing of request or postprocessing of responses.\n   *\n   * These service factories are ordered by request, i.e. they are applied in the same order as the\n   * array, on request, but reverse order, on response.\n   *\n   * {@link ng.$http#interceptors Interceptors detailed info}\n   */\n  var interceptorFactories = this.interceptors = [];\n\n  /**\n   * @ngdoc property\n   * @name $httpProvider#xsrfWhitelistedOrigins\n   * @description\n   *\n   * Array containing URLs whose origins are trusted to receive the XSRF token. See the\n   * {@link ng.$http#security-considerations Security Considerations} sections for more details on\n   * XSRF.\n   *\n   * **Note:** An \"origin\" consists of the [URI scheme](https://en.wikipedia.org/wiki/URI_scheme),\n   * the [hostname](https://en.wikipedia.org/wiki/Hostname) and the\n   * [port number](https://en.wikipedia.org/wiki/Port_(computer_networking). For `http:` and\n   * `https:`, the port number can be omitted if using th default ports (80 and 443 respectively).\n   * Examples: `http://example.com`, `https://api.example.com:9876`\n   *\n   * <div class=\"alert alert-warning\">\n   *   It is not possible to whitelist specific URLs/paths. The `path`, `query` and `fragment` parts\n   *   of a URL will be ignored. For example, `https://foo.com/path/bar?query=baz#fragment` will be\n   *   treated as `https://foo.com`, meaning that **all** requests to URLs starting with\n   *   `https://foo.com/` will include the XSRF token.\n   * </div>\n   *\n   * @example\n   *\n   * ```js\n   * // App served from `https://example.com/`.\n   * angular.\n   *   module('xsrfWhitelistedOriginsExample', []).\n   *   config(['$httpProvider', function($httpProvider) {\n   *     $httpProvider.xsrfWhitelistedOrigins.push('https://api.example.com');\n   *   }]).\n   *   run(['$http', function($http) {\n   *     // The XSRF token will be sent.\n   *     $http.get('https://api.example.com/preferences').then(...);\n   *\n   *     // The XSRF token will NOT be sent.\n   *     $http.get('https://stats.example.com/activity').then(...);\n   *   }]);\n   * ```\n   */\n  var xsrfWhitelistedOrigins = this.xsrfWhitelistedOrigins = [];\n\n  this.$get = ['$browser', '$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', '$sce',\n      function($browser, $httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector, $sce) {\n\n    var defaultCache = $cacheFactory('$http');\n\n    /**\n     * Make sure that default param serializer is exposed as a function\n     */\n    defaults.paramSerializer = isString(defaults.paramSerializer) ?\n      $injector.get(defaults.paramSerializer) : defaults.paramSerializer;\n\n    /**\n     * Interceptors stored in reverse order. Inner interceptors before outer interceptors.\n     * The reversal is needed so that we can build up the interception chain around the\n     * server request.\n     */\n    var reversedInterceptors = [];\n\n    forEach(interceptorFactories, function(interceptorFactory) {\n      reversedInterceptors.unshift(isString(interceptorFactory)\n          ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\n    });\n\n    /**\n     * A function to check request URLs against a list of allowed origins.\n     */\n    var urlIsAllowedOrigin = urlIsAllowedOriginFactory(xsrfWhitelistedOrigins);\n\n    /**\n     * @ngdoc service\n     * @kind function\n     * @name $http\n     * @requires ng.$httpBackend\n     * @requires $cacheFactory\n     * @requires $rootScope\n     * @requires $q\n     * @requires $injector\n     *\n     * @description\n     * The `$http` service is a core AngularJS service that facilitates communication with the remote\n     * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)\n     * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).\n     *\n     * For unit testing applications that use `$http` service, see\n     * {@link ngMock.$httpBackend $httpBackend mock}.\n     *\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\n     * $resource} service.\n     *\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\n     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage\n     * it is important to familiarize yourself with these APIs and the guarantees they provide.\n     *\n     *\n     * ## General usage\n     * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} —\n     * that is used to generate an HTTP request and returns  a {@link ng.$q promise} that is\n     * resolved (request success) or rejected (request failure) with a\n     * {@link ng.$http#$http-returns response} object.\n     *\n     * ```js\n     *   // Simple GET request example:\n     *   $http({\n     *     method: 'GET',\n     *     url: '/someUrl'\n     *   }).then(function successCallback(response) {\n     *       // this callback will be called asynchronously\n     *       // when the response is available\n     *     }, function errorCallback(response) {\n     *       // called asynchronously if an error occurs\n     *       // or server returns response with an error status.\n     *     });\n     * ```\n     *\n     *\n     * ## Shortcut methods\n     *\n     * Shortcut methods are also available. All shortcut methods require passing in the URL, and\n     * request data must be passed in for POST/PUT requests. An optional config can be passed as the\n     * last argument.\n     *\n     * ```js\n     *   $http.get('/someUrl', config).then(successCallback, errorCallback);\n     *   $http.post('/someUrl', data, config).then(successCallback, errorCallback);\n     * ```\n     *\n     * Complete list of shortcut methods:\n     *\n     * - {@link ng.$http#get $http.get}\n     * - {@link ng.$http#head $http.head}\n     * - {@link ng.$http#post $http.post}\n     * - {@link ng.$http#put $http.put}\n     * - {@link ng.$http#delete $http.delete}\n     * - {@link ng.$http#jsonp $http.jsonp}\n     * - {@link ng.$http#patch $http.patch}\n     *\n     *\n     * ## Writing Unit Tests that use $http\n     * When unit testing (using {@link ngMock ngMock}), it is necessary to call\n     * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending\n     * request using trained responses.\n     *\n     * ```\n     * $httpBackend.expectGET(...);\n     * $http.get(...);\n     * $httpBackend.flush();\n     * ```\n     *\n     * ## Setting HTTP Headers\n     *\n     * The $http service will automatically add certain HTTP headers to all requests. These defaults\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\n     * object, which currently contains this default configuration:\n     *\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\n     *   - <code>Accept: application/json, text/plain, \\*&#65279;/&#65279;\\*</code>\n     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)\n     *   - `Content-Type: application/json`\n     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)\n     *   - `Content-Type: application/json`\n     *\n     * To add or overwrite these defaults, simply add or remove a property from these configuration\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\n     * with the lowercased HTTP method name as the key, e.g.\n     * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`.\n     *\n     * The defaults can also be set at runtime via the `$http.defaults` object in the same\n     * fashion. For example:\n     *\n     * ```\n     * module.run(function($http) {\n     *   $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';\n     * });\n     * ```\n     *\n     * In addition, you can supply a `headers` property in the config object passed when\n     * calling `$http(config)`, which overrides the defaults without changing them globally.\n     *\n     * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis,\n     * Use the `headers` property, setting the desired header to `undefined`. For example:\n     *\n     * ```js\n     * var req = {\n     *  method: 'POST',\n     *  url: 'http://example.com',\n     *  headers: {\n     *    'Content-Type': undefined\n     *  },\n     *  data: { test: 'test' }\n     * }\n     *\n     * $http(req).then(function(){...}, function(){...});\n     * ```\n     *\n     * ## Transforming Requests and Responses\n     *\n     * Both requests and responses can be transformed using transformation functions: `transformRequest`\n     * and `transformResponse`. These properties can be a single function that returns\n     * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions,\n     * which allows you to `push` or `unshift` a new transformation function into the transformation chain.\n     *\n     * <div class=\"alert alert-warning\">\n     * **Note:** AngularJS does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline.\n     * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference).\n     * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest\n     * function will be reflected on the scope and in any templates where the object is data-bound.\n     * To prevent this, transform functions should have no side-effects.\n     * If you need to modify properties, it is recommended to make a copy of the data, or create new object to return.\n     * </div>\n     *\n     * ### Default Transformations\n     *\n     * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and\n     * `defaults.transformResponse` properties. If a request does not provide its own transformations\n     * then these will be applied.\n     *\n     * You can augment or replace the default transformations by modifying these properties by adding to or\n     * replacing the array.\n     *\n     * AngularJS provides the following default transformations:\n     *\n     * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`) is\n     * an array with one function that does the following:\n     *\n     * - If the `data` property of the request configuration object contains an object, serialize it\n     *   into JSON format.\n     *\n     * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`) is\n     * an array with one function that does the following:\n     *\n     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).\n     *  - If the `Content-Type` is `application/json` or the response looks like JSON,\n   *      deserialize it using a JSON parser.\n     *\n     *\n     * ### Overriding the Default Transformations Per Request\n     *\n     * If you wish to override the request/response transformations only for a single request then provide\n     * `transformRequest` and/or `transformResponse` properties on the configuration object passed\n     * into `$http`.\n     *\n     * Note that if you provide these properties on the config object the default transformations will be\n     * overwritten. If you wish to augment the default transformations then you must include them in your\n     * local transformation array.\n     *\n     * The following code demonstrates adding a new response transformation to be run after the default response\n     * transformations have been run.\n     *\n     * ```js\n     * function appendTransform(defaults, transform) {\n     *\n     *   // We can't guarantee that the default transformation is an array\n     *   defaults = angular.isArray(defaults) ? defaults : [defaults];\n     *\n     *   // Append the new transformation to the defaults\n     *   return defaults.concat(transform);\n     * }\n     *\n     * $http({\n     *   url: '...',\n     *   method: 'GET',\n     *   transformResponse: appendTransform($http.defaults.transformResponse, function(value) {\n     *     return doTransform(value);\n     *   })\n     * });\n     * ```\n     *\n     *\n     * ## Caching\n     *\n     * {@link ng.$http `$http`} responses are not cached by default. To enable caching, you must\n     * set the config.cache value or the default cache value to TRUE or to a cache object (created\n     * with {@link ng.$cacheFactory `$cacheFactory`}). If defined, the value of config.cache takes\n     * precedence over the default cache value.\n     *\n     * In order to:\n     *   * cache all responses - set the default cache value to TRUE or to a cache object\n     *   * cache a specific response - set config.cache value to TRUE or to a cache object\n     *\n     * If caching is enabled, but neither the default cache nor config.cache are set to a cache object,\n     * then the default `$cacheFactory(\"$http\")` object is used.\n     *\n     * The default cache value can be set by updating the\n     * {@link ng.$http#defaults `$http.defaults.cache`} property or the\n     * {@link $httpProvider#defaults `$httpProvider.defaults.cache`} property.\n     *\n     * When caching is enabled, {@link ng.$http `$http`} stores the response from the server using\n     * the relevant cache object. The next time the same request is made, the response is returned\n     * from the cache without sending a request to the server.\n     *\n     * Take note that:\n     *\n     *   * Only GET and JSONP requests are cached.\n     *   * The cache key is the request URL including search parameters; headers are not considered.\n     *   * Cached responses are returned asynchronously, in the same way as responses from the server.\n     *   * If multiple identical requests are made using the same cache, which is not yet populated,\n     *     one request will be made to the server and remaining requests will return the same response.\n     *   * A cache-control header on the response does not affect if or how responses are cached.\n     *\n     *\n     * ## Interceptors\n     *\n     * Before you start creating interceptors, be sure to understand the\n     * {@link ng.$q $q and deferred/promise APIs}.\n     *\n     * For purposes of global error handling, authentication, or any kind of synchronous or\n     * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be\n     * able to intercept requests before they are handed to the server and\n     * responses before they are handed over to the application code that\n     * initiated these requests. The interceptors leverage the {@link ng.$q\n     * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.\n     *\n     * The interceptors are service factories that are registered with the `$httpProvider` by\n     * adding them to the `$httpProvider.interceptors` array. The factory is called and\n     * injected with dependencies (if specified) and returns the interceptor.\n     *\n     * There are two kinds of interceptors (and two kinds of rejection interceptors):\n     *\n     *   * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to\n     *     modify the `config` object or create a new one. The function needs to return the `config`\n     *     object directly, or a promise containing the `config` or a new `config` object.\n     *   * `requestError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *   * `response`: interceptors get called with http `response` object. The function is free to\n     *     modify the `response` object or create a new one. The function needs to return the `response`\n     *     object directly, or as a promise containing the `response` or a new `response` object.\n     *   * `responseError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *\n     *\n     * ```js\n     *   // register the interceptor as a service\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\n     *     return {\n     *       // optional method\n     *       'request': function(config) {\n     *         // do something on success\n     *         return config;\n     *       },\n     *\n     *       // optional method\n     *      'requestError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       },\n     *\n     *\n     *\n     *       // optional method\n     *       'response': function(response) {\n     *         // do something on success\n     *         return response;\n     *       },\n     *\n     *       // optional method\n     *      'responseError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       }\n     *     };\n     *   });\n     *\n     *   $httpProvider.interceptors.push('myHttpInterceptor');\n     *\n     *\n     *   // alternatively, register the interceptor via an anonymous factory\n     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {\n     *     return {\n     *      'request': function(config) {\n     *          // same as above\n     *       },\n     *\n     *       'response': function(response) {\n     *          // same as above\n     *       }\n     *     };\n     *   });\n     * ```\n     *\n     * ## Security Considerations\n     *\n     * When designing web applications, consider security threats from:\n     *\n     * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\n     *\n     * Both server and the client must cooperate in order to eliminate these threats. AngularJS comes\n     * pre-configured with strategies that address these issues, but for this to work backend server\n     * cooperation is required.\n     *\n     * ### JSON Vulnerability Protection\n     *\n     * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * allows third party website to turn your JSON resource URL into\n     * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\n     * AngularJS will automatically strip the prefix before processing it as JSON.\n     *\n     * For example if your server needs to return:\n     * ```js\n     * ['one','two']\n     * ```\n     *\n     * which is vulnerable to attack, your server can return:\n     * ```js\n     * )]}',\n     * ['one','two']\n     * ```\n     *\n     * AngularJS will strip the prefix, before processing the JSON.\n     *\n     *\n     * ### Cross Site Request Forgery (XSRF) Protection\n     *\n     * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by\n     * which the attacker can trick an authenticated user into unknowingly executing actions on your\n     * website. AngularJS provides a mechanism to counter XSRF. When performing XHR requests, the\n     * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP\n     * header (by default `X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read\n     * the cookie, your server can be assured that the XHR came from JavaScript running on your\n     * domain.\n     *\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\n     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the\n     * server can verify that the cookie matches the `X-XSRF-TOKEN` HTTP header, and therefore be\n     * sure that only JavaScript running on your domain could have sent the request. The token must\n     * be unique for each user and must be verifiable by the server (to prevent the JavaScript from\n     * making up its own tokens). We recommend that the token is a digest of your site's\n     * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)\n     * for added security.\n     *\n     * The header will &mdash; by default &mdash; **not** be set for cross-domain requests. This\n     * prevents unauthorized servers (e.g. malicious or compromised 3rd-party APIs) from gaining\n     * access to your users' XSRF tokens and exposing them to Cross Site Request Forgery. If you\n     * want to, you can whitelist additional origins to also receive the XSRF token, by adding them\n     * to {@link ng.$httpProvider#xsrfWhitelistedOrigins xsrfWhitelistedOrigins}. This might be\n     * useful, for example, if your application, served from `example.com`, needs to access your API\n     * at `api.example.com`.\n     * See {@link ng.$httpProvider#xsrfWhitelistedOrigins $httpProvider.xsrfWhitelistedOrigins} for\n     * more details.\n     *\n     * <div class=\"alert alert-danger\">\n     *   **Warning**<br />\n     *   Only whitelist origins that you have control over and make sure you understand the\n     *   implications of doing so.\n     * </div>\n     *\n     * The name of the cookie and the header can be specified using the `xsrfCookieName` and\n     * `xsrfHeaderName` properties of either `$httpProvider.defaults` at config-time,\n     * `$http.defaults` at run-time, or the per-request config object.\n     *\n     * In order to prevent collisions in environments where multiple AngularJS apps share the\n     * same domain or subdomain, we recommend that each application uses a unique cookie name.\n     *\n     *\n     * @param {object} config Object describing the request to be made and how it should be\n     *    processed. The object has following properties:\n     *\n     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)\n     *    - **url** – `{string|TrustedObject}` – Absolute or relative URL of the resource that is being requested;\n     *      or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be serialized\n     *      with the `paramSerializer` and appended as GET parameters.\n     *    - **data** – `{string|Object}` – Data to be sent as the request message data.\n     *    - **headers** – `{Object}` – Map of strings or functions which return strings representing\n     *      HTTP headers to send to the server. If the return value of a function is null, the\n     *      header will not be sent. Functions accept a config object as an argument.\n     *    - **eventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest object.\n     *      To bind events to the XMLHttpRequest upload object, use `uploadEventHandlers`.\n     *      The handler will be called in the context of a `$apply` block.\n     *    - **uploadEventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest upload\n     *      object. To bind events to the XMLHttpRequest object, use `eventHandlers`.\n     *      The handler will be called in the context of a `$apply` block.\n     *    - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.\n     *    - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.\n     *    - **transformRequest** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      request body and headers and returns its transformed (typically serialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **transformResponse** –\n     *      `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      response body, headers and status and returns its transformed (typically deserialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **paramSerializer** - `{string|function(Object<string,string>):string}` - A function used to\n     *      prepare the string representation of request parameters (specified as an object).\n     *      If specified as string, it is interpreted as function registered with the\n     *      {@link $injector $injector}, which means you can create your own serializer\n     *      by registering it as a {@link auto.$provide#service service}.\n     *      The default serializer is the {@link $httpParamSerializer $httpParamSerializer};\n     *      alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike}\n     *    - **cache** – `{boolean|Object}` – A boolean value or object created with\n     *      {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response.\n     *      See {@link $http#caching $http Caching} for more information.\n     *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}\n     *      that should abort the request when resolved.\n     *\n     *      A numerical timeout or a promise returned from {@link ng.$timeout $timeout}, will set\n     *      the `xhrStatus` in the {@link $http#$http-returns response} to \"timeout\", and any other\n     *      resolved promise will set it to \"abort\", following standard XMLHttpRequest behavior.\n     *\n     *    - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the\n     *      XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)\n     *      for more information.\n     *    - **responseType** - `{string}` - see\n     *      [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype).\n     *\n     * @returns {HttpPromise} A {@link ng.$q `Promise}` that will be resolved (request success)\n     *   or rejected (request failure) with a response object.\n     *\n     *   The response object has these properties:\n     *\n     *   - **data** – `{string|Object}` – The response body transformed with\n     *     the transform functions.\n     *   - **status** – `{number}` – HTTP status code of the response.\n     *   - **headers** – `{function([headerName])}` – Header getter function.\n     *   - **config** – `{Object}` – The configuration object that was used\n     *     to generate the request.\n     *   - **statusText** – `{string}` – HTTP status text of the response.\n     *   - **xhrStatus** – `{string}` – Status of the XMLHttpRequest\n     *     (`complete`, `error`, `timeout` or `abort`).\n     *\n     *\n     *   A response status code between 200 and 299 is considered a success status\n     *   and will result in the success callback being called. Any response status\n     *   code outside of that range is considered an error status and will result\n     *   in the error callback being called.\n     *   Also, status codes less than -1 are normalized to zero. -1 usually means\n     *   the request was aborted, e.g. using a `config.timeout`. More information\n     *   about the status might be available in the `xhrStatus` property.\n     *\n     *   Note that if the response is a redirect, XMLHttpRequest will transparently\n     *   follow it, meaning that the outcome (success or error) will be determined\n     *   by the final response status code.\n     *\n     *\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\n     *   requests. This is primarily meant to be used for debugging purposes.\n     *\n     *\n     * @example\n<example module=\"httpExample\" name=\"http-service\">\n<file name=\"index.html\">\n  <div ng-controller=\"FetchController\">\n    <select ng-model=\"method\" aria-label=\"Request method\">\n      <option>GET</option>\n      <option>JSONP</option>\n    </select>\n    <input type=\"text\" ng-model=\"url\" size=\"80\" aria-label=\"URL\" />\n    <button id=\"fetchbtn\" ng-click=\"fetch()\">fetch</button><br>\n    <button id=\"samplegetbtn\" ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\n    <button id=\"samplejsonpbtn\"\n      ng-click=\"updateModel('JSONP',\n                    'https://angularjs.org/greet.php?name=Super%20Hero')\">\n      Sample JSONP\n    </button>\n    <button id=\"invalidjsonpbtn\"\n      ng-click=\"updateModel('JSONP', 'https://angularjs.org/doesntexist')\">\n        Invalid JSONP\n      </button>\n    <pre>http status code: {{status}}</pre>\n    <pre>http response data: {{data}}</pre>\n  </div>\n</file>\n<file name=\"script.js\">\n  angular.module('httpExample', [])\n    .config(['$sceDelegateProvider', function($sceDelegateProvider) {\n      // We must whitelist the JSONP endpoint that we are using to show that we trust it\n      $sceDelegateProvider.resourceUrlWhitelist([\n        'self',\n        'https://angularjs.org/**'\n      ]);\n    }])\n    .controller('FetchController', ['$scope', '$http', '$templateCache',\n      function($scope, $http, $templateCache) {\n        $scope.method = 'GET';\n        $scope.url = 'http-hello.html';\n\n        $scope.fetch = function() {\n          $scope.code = null;\n          $scope.response = null;\n\n          $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\n            then(function(response) {\n              $scope.status = response.status;\n              $scope.data = response.data;\n            }, function(response) {\n              $scope.data = response.data || 'Request failed';\n              $scope.status = response.status;\n          });\n        };\n\n        $scope.updateModel = function(method, url) {\n          $scope.method = method;\n          $scope.url = url;\n        };\n      }]);\n</file>\n<file name=\"http-hello.html\">\n  Hello, $http!\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  var status = element(by.binding('status'));\n  var data = element(by.binding('data'));\n  var fetchBtn = element(by.id('fetchbtn'));\n  var sampleGetBtn = element(by.id('samplegetbtn'));\n  var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));\n\n  it('should make an xhr GET request', function() {\n    sampleGetBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Hello, \\$http!/);\n  });\n\n// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185\n// it('should make a JSONP request to angularjs.org', function() {\n//   var sampleJsonpBtn = element(by.id('samplejsonpbtn'));\n//   sampleJsonpBtn.click();\n//   fetchBtn.click();\n//   expect(status.getText()).toMatch('200');\n//   expect(data.getText()).toMatch(/Super Hero!/);\n// });\n\n  it('should make JSONP request to invalid URL and invoke the error handler',\n      function() {\n    invalidJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('0');\n    expect(data.getText()).toMatch('Request failed');\n  });\n</file>\n</example>\n     */\n    function $http(requestConfig) {\n\n      if (!isObject(requestConfig)) {\n        throw minErr('$http')('badreq', 'Http request configuration must be an object.  Received: {0}', requestConfig);\n      }\n\n      if (!isString($sce.valueOf(requestConfig.url))) {\n        throw minErr('$http')('badreq', 'Http request configuration url must be a string or a $sce trusted object.  Received: {0}', requestConfig.url);\n      }\n\n      var config = extend({\n        method: 'get',\n        transformRequest: defaults.transformRequest,\n        transformResponse: defaults.transformResponse,\n        paramSerializer: defaults.paramSerializer,\n        jsonpCallbackParam: defaults.jsonpCallbackParam\n      }, requestConfig);\n\n      config.headers = mergeHeaders(requestConfig);\n      config.method = uppercase(config.method);\n      config.paramSerializer = isString(config.paramSerializer) ?\n          $injector.get(config.paramSerializer) : config.paramSerializer;\n\n      $browser.$$incOutstandingRequestCount('$http');\n\n      var requestInterceptors = [];\n      var responseInterceptors = [];\n      var promise = $q.resolve(config);\n\n      // apply interceptors\n      forEach(reversedInterceptors, function(interceptor) {\n        if (interceptor.request || interceptor.requestError) {\n          requestInterceptors.unshift(interceptor.request, interceptor.requestError);\n        }\n        if (interceptor.response || interceptor.responseError) {\n          responseInterceptors.push(interceptor.response, interceptor.responseError);\n        }\n      });\n\n      promise = chainInterceptors(promise, requestInterceptors);\n      promise = promise.then(serverRequest);\n      promise = chainInterceptors(promise, responseInterceptors);\n      promise = promise.finally(completeOutstandingRequest);\n\n      return promise;\n\n\n      function chainInterceptors(promise, interceptors) {\n        for (var i = 0, ii = interceptors.length; i < ii;) {\n          var thenFn = interceptors[i++];\n          var rejectFn = interceptors[i++];\n\n          promise = promise.then(thenFn, rejectFn);\n        }\n\n        interceptors.length = 0;\n\n        return promise;\n      }\n\n      function completeOutstandingRequest() {\n        $browser.$$completeOutstandingRequest(noop, '$http');\n      }\n\n      function executeHeaderFns(headers, config) {\n        var headerContent, processedHeaders = {};\n\n        forEach(headers, function(headerFn, header) {\n          if (isFunction(headerFn)) {\n            headerContent = headerFn(config);\n            if (headerContent != null) {\n              processedHeaders[header] = headerContent;\n            }\n          } else {\n            processedHeaders[header] = headerFn;\n          }\n        });\n\n        return processedHeaders;\n      }\n\n      function mergeHeaders(config) {\n        var defHeaders = defaults.headers,\n            reqHeaders = extend({}, config.headers),\n            defHeaderName, lowercaseDefHeaderName, reqHeaderName;\n\n        defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);\n\n        // using for-in instead of forEach to avoid unnecessary iteration after header has been found\n        defaultHeadersIteration:\n        for (defHeaderName in defHeaders) {\n          lowercaseDefHeaderName = lowercase(defHeaderName);\n\n          for (reqHeaderName in reqHeaders) {\n            if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {\n              continue defaultHeadersIteration;\n            }\n          }\n\n          reqHeaders[defHeaderName] = defHeaders[defHeaderName];\n        }\n\n        // execute if header value is a function for merged headers\n        return executeHeaderFns(reqHeaders, shallowCopy(config));\n      }\n\n      function serverRequest(config) {\n        var headers = config.headers;\n        var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest);\n\n        // strip content-type if data is undefined\n        if (isUndefined(reqData)) {\n          forEach(headers, function(value, header) {\n            if (lowercase(header) === 'content-type') {\n              delete headers[header];\n            }\n          });\n        }\n\n        if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {\n          config.withCredentials = defaults.withCredentials;\n        }\n\n        // send request\n        return sendReq(config, reqData).then(transformResponse, transformResponse);\n      }\n\n      function transformResponse(response) {\n        // make a copy since the response must be cacheable\n        var resp = extend({}, response);\n        resp.data = transformData(response.data, response.headers, response.status,\n                                  config.transformResponse);\n        return (isSuccess(response.status))\n          ? resp\n          : $q.reject(resp);\n      }\n    }\n\n    $http.pendingRequests = [];\n\n    /**\n     * @ngdoc method\n     * @name $http#get\n     *\n     * @description\n     * Shortcut method to perform `GET` request.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.\n     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.\n     * See {@link ng.$http#$http-returns `$http()` return value}.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#delete\n     *\n     * @description\n     * Shortcut method to perform `DELETE` request.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.\n     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.\n     * See {@link ng.$http#$http-returns `$http()` return value}.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#head\n     *\n     * @description\n     * Shortcut method to perform `HEAD` request.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.\n     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.\n     * See {@link ng.$http#$http-returns `$http()` return value}.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#jsonp\n     *\n     * @description\n     * Shortcut method to perform `JSONP` request.\n     *\n     * Note that, since JSONP requests are sensitive because the response is given full access to the browser,\n     * the url must be declared, via {@link $sce} as a trusted resource URL.\n     * You can trust a URL by adding it to the whitelist via\n     * {@link $sceDelegateProvider#resourceUrlWhitelist  `$sceDelegateProvider.resourceUrlWhitelist`} or\n     * by explicitly trusting the URL via {@link $sce#trustAsResourceUrl `$sce.trustAsResourceUrl(url)`}.\n     *\n     * You should avoid generating the URL for the JSONP request from user provided data.\n     * Provide additional query parameters via `params` property of the `config` parameter, rather than\n     * modifying the URL itself.\n     *\n     * JSONP requests must specify a callback to be used in the response from the server. This callback\n     * is passed as a query parameter in the request. You must specify the name of this parameter by\n     * setting the `jsonpCallbackParam` property on the request config object.\n     *\n     * ```\n     * $http.jsonp('some/trusted/url', {jsonpCallbackParam: 'callback'})\n     * ```\n     *\n     * You can also specify a default callback parameter name in `$http.defaults.jsonpCallbackParam`.\n     * Initially this is set to `'callback'`.\n     *\n     * <div class=\"alert alert-danger\">\n     * You can no longer use the `JSON_CALLBACK` string as a placeholder for specifying where the callback\n     * parameter value should go.\n     * </div>\n     *\n     * If you would like to customise where and how the callbacks are stored then try overriding\n     * or decorating the {@link $jsonpCallbacks} service.\n     *\n     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;\n     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.\n     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.\n     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.\n     * See {@link ng.$http#$http-returns `$http()` return value}.\n     */\n    createShortMethods('get', 'delete', 'head', 'jsonp');\n\n    /**\n     * @ngdoc method\n     * @name $http#post\n     *\n     * @description\n     * Shortcut method to perform `POST` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.\n     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.\n     * See {@link ng.$http#$http-returns `$http()` return value}.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#put\n     *\n     * @description\n     * Shortcut method to perform `PUT` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.\n     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.\n     * See {@link ng.$http#$http-returns `$http()` return value}.\n     */\n\n     /**\n      * @ngdoc method\n      * @name $http#patch\n      *\n      * @description\n      * Shortcut method to perform `PATCH` request.\n      *\n      * @param {string} url Relative or absolute URL specifying the destination of the request\n      * @param {*} data Request content\n      * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.\n      * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.\n      * See {@link ng.$http#$http-returns `$http()` return value}.\n      */\n    createShortMethodsWithData('post', 'put', 'patch');\n\n        /**\n         * @ngdoc property\n         * @name $http#defaults\n         *\n         * @description\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\n         * default headers, withCredentials as well as request and response transformations.\n         *\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\n         */\n    $http.defaults = defaults;\n\n\n    return $http;\n\n\n    function createShortMethods(names) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, config) {\n          return $http(extend({}, config || {}, {\n            method: name,\n            url: url\n          }));\n        };\n      });\n    }\n\n\n    function createShortMethodsWithData(name) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, data, config) {\n          return $http(extend({}, config || {}, {\n            method: name,\n            url: url,\n            data: data\n          }));\n        };\n      });\n    }\n\n\n    /**\n     * Makes the request.\n     *\n     * !!! ACCESSES CLOSURE VARS:\n     * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests\n     */\n    function sendReq(config, reqData) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          cache,\n          cachedResp,\n          reqHeaders = config.headers,\n          isJsonp = lowercase(config.method) === 'jsonp',\n          url = config.url;\n\n      if (isJsonp) {\n        // JSONP is a pretty sensitive operation where we're allowing a script to have full access to\n        // our DOM and JS space.  So we require that the URL satisfies SCE.RESOURCE_URL.\n        url = $sce.getTrustedResourceUrl(url);\n      } else if (!isString(url)) {\n        // If it is not a string then the URL must be a $sce trusted object\n        url = $sce.valueOf(url);\n      }\n\n      url = buildUrl(url, config.paramSerializer(config.params));\n\n      if (isJsonp) {\n        // Check the url and add the JSONP callback placeholder\n        url = sanitizeJsonpCallbackParam(url, config.jsonpCallbackParam);\n      }\n\n      $http.pendingRequests.push(config);\n      promise.then(removePendingReq, removePendingReq);\n\n      if ((config.cache || defaults.cache) && config.cache !== false &&\n          (config.method === 'GET' || config.method === 'JSONP')) {\n        cache = isObject(config.cache) ? config.cache\n            : isObject(/** @type {?} */ (defaults).cache)\n              ? /** @type {?} */ (defaults).cache\n              : defaultCache;\n      }\n\n      if (cache) {\n        cachedResp = cache.get(url);\n        if (isDefined(cachedResp)) {\n          if (isPromiseLike(cachedResp)) {\n            // cached request has already been sent, but there is no response yet\n            cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult);\n          } else {\n            // serving from cache\n            if (isArray(cachedResp)) {\n              resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3], cachedResp[4]);\n            } else {\n              resolvePromise(cachedResp, 200, {}, 'OK', 'complete');\n            }\n          }\n        } else {\n          // put the promise for the non-transformed response into cache as a placeholder\n          cache.put(url, promise);\n        }\n      }\n\n\n      // if we won't have the response in cache, set the xsrf headers and\n      // send the request to the backend\n      if (isUndefined(cachedResp)) {\n        var xsrfValue = urlIsAllowedOrigin(config.url)\n            ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName]\n            : undefined;\n        if (xsrfValue) {\n          reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;\n        }\n\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\n            config.withCredentials, config.responseType,\n            createApplyHandlers(config.eventHandlers),\n            createApplyHandlers(config.uploadEventHandlers));\n      }\n\n      return promise;\n\n      function createApplyHandlers(eventHandlers) {\n        if (eventHandlers) {\n          var applyHandlers = {};\n          forEach(eventHandlers, function(eventHandler, key) {\n            applyHandlers[key] = function(event) {\n              if (useApplyAsync) {\n                $rootScope.$applyAsync(callEventHandler);\n              } else if ($rootScope.$$phase) {\n                callEventHandler();\n              } else {\n                $rootScope.$apply(callEventHandler);\n              }\n\n              function callEventHandler() {\n                eventHandler(event);\n              }\n            };\n          });\n          return applyHandlers;\n        }\n      }\n\n\n      /**\n       * Callback registered to $httpBackend():\n       *  - caches the response if desired\n       *  - resolves the raw $http promise\n       *  - calls $apply\n       */\n      function done(status, response, headersString, statusText, xhrStatus) {\n        if (cache) {\n          if (isSuccess(status)) {\n            cache.put(url, [status, response, parseHeaders(headersString), statusText, xhrStatus]);\n          } else {\n            // remove promise from the cache\n            cache.remove(url);\n          }\n        }\n\n        function resolveHttpPromise() {\n          resolvePromise(response, status, headersString, statusText, xhrStatus);\n        }\n\n        if (useApplyAsync) {\n          $rootScope.$applyAsync(resolveHttpPromise);\n        } else {\n          resolveHttpPromise();\n          if (!$rootScope.$$phase) $rootScope.$apply();\n        }\n      }\n\n\n      /**\n       * Resolves the raw $http promise.\n       */\n      function resolvePromise(response, status, headers, statusText, xhrStatus) {\n        //status: HTTP response status code, 0, -1 (aborted by timeout / promise)\n        status = status >= -1 ? status : 0;\n\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\n          data: response,\n          status: status,\n          headers: headersGetter(headers),\n          config: config,\n          statusText: statusText,\n          xhrStatus: xhrStatus\n        });\n      }\n\n      function resolvePromiseWithResult(result) {\n        resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText, result.xhrStatus);\n      }\n\n      function removePendingReq() {\n        var idx = $http.pendingRequests.indexOf(config);\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\n      }\n    }\n\n\n    function buildUrl(url, serializedParams) {\n      if (serializedParams.length > 0) {\n        url += ((url.indexOf('?') === -1) ? '?' : '&') + serializedParams;\n      }\n      return url;\n    }\n\n    function sanitizeJsonpCallbackParam(url, cbKey) {\n      var parts = url.split('?');\n      if (parts.length > 2) {\n        // Throw if the url contains more than one `?` query indicator\n        throw $httpMinErr('badjsonp', 'Illegal use more than one \"?\", in url, \"{1}\"', url);\n      }\n      var params = parseKeyValue(parts[1]);\n      forEach(params, function(value, key) {\n        if (value === 'JSON_CALLBACK') {\n          // Throw if the url already contains a reference to JSON_CALLBACK\n          throw $httpMinErr('badjsonp', 'Illegal use of JSON_CALLBACK in url, \"{0}\"', url);\n        }\n        if (key === cbKey) {\n          // Throw if the callback param was already provided\n          throw $httpMinErr('badjsonp', 'Illegal use of callback param, \"{0}\", in url, \"{1}\"', cbKey, url);\n        }\n      });\n\n      // Add in the JSON_CALLBACK callback param value\n      url += ((url.indexOf('?') === -1) ? '?' : '&') + cbKey + '=JSON_CALLBACK';\n\n      return url;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $xhrFactory\n * @this\n *\n * @description\n * Factory function used to create XMLHttpRequest objects.\n *\n * Replace or decorate this service to create your own custom XMLHttpRequest objects.\n *\n * ```\n * angular.module('myApp', [])\n * .factory('$xhrFactory', function() {\n *   return function createXhr(method, url) {\n *     return new window.XMLHttpRequest({mozSystem: true});\n *   };\n * });\n * ```\n *\n * @param {string} method HTTP method of the request (GET, POST, PUT, ..)\n * @param {string} url URL of the request.\n */\nfunction $xhrFactoryProvider() {\n  this.$get = function() {\n    return function createXhr() {\n      return new window.XMLHttpRequest();\n    };\n  };\n}\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @requires $jsonpCallbacks\n * @requires $document\n * @requires $xhrFactory\n * @this\n *\n * @description\n * HTTP backend used by the {@link ng.$http service} that delegates to\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\n *\n * You should never need to use this service directly, instead use the higher-level abstractions:\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\n *\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\n * $httpBackend} which can be trained with responses.\n */\nfunction $HttpBackendProvider() {\n  this.$get = ['$browser', '$jsonpCallbacks', '$document', '$xhrFactory', function($browser, $jsonpCallbacks, $document, $xhrFactory) {\n    return createHttpBackend($browser, $xhrFactory, $browser.defer, $jsonpCallbacks, $document[0]);\n  }];\n}\n\nfunction createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {\n  // TODO(vojta): fix the signature\n  return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) {\n    url = url || $browser.url();\n\n    if (lowercase(method) === 'jsonp') {\n      var callbackPath = callbacks.createCallback(url);\n      var jsonpDone = jsonpReq(url, callbackPath, function(status, text) {\n        // jsonpReq only ever sets status to 200 (OK), 404 (ERROR) or -1 (WAITING)\n        var response = (status === 200) && callbacks.getResponse(callbackPath);\n        completeRequest(callback, status, response, '', text, 'complete');\n        callbacks.removeCallback(callbackPath);\n      });\n    } else {\n\n      var xhr = createXhr(method, url);\n      var abortedByTimeout = false;\n\n      xhr.open(method, url, true);\n      forEach(headers, function(value, key) {\n        if (isDefined(value)) {\n            xhr.setRequestHeader(key, value);\n        }\n      });\n\n      xhr.onload = function requestLoaded() {\n        var statusText = xhr.statusText || '';\n\n        // responseText is the old-school way of retrieving response (supported by IE9)\n        // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)\n        var response = ('response' in xhr) ? xhr.response : xhr.responseText;\n\n        // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n        var status = xhr.status === 1223 ? 204 : xhr.status;\n\n        // fix status code when it is 0 (0 status is undocumented).\n        // Occurs when accessing file resources or on Android 4.1 stock browser\n        // while retrieving files from application cache.\n        if (status === 0) {\n          status = response ? 200 : urlResolve(url).protocol === 'file' ? 404 : 0;\n        }\n\n        completeRequest(callback,\n            status,\n            response,\n            xhr.getAllResponseHeaders(),\n            statusText,\n            'complete');\n      };\n\n      var requestError = function() {\n        // The response is always empty\n        // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error\n        completeRequest(callback, -1, null, null, '', 'error');\n      };\n\n      var requestAborted = function() {\n        completeRequest(callback, -1, null, null, '', abortedByTimeout ? 'timeout' : 'abort');\n      };\n\n      var requestTimeout = function() {\n        // The response is always empty\n        // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error\n        completeRequest(callback, -1, null, null, '', 'timeout');\n      };\n\n      xhr.onerror = requestError;\n      xhr.ontimeout = requestTimeout;\n      xhr.onabort = requestAborted;\n\n      forEach(eventHandlers, function(value, key) {\n        xhr.addEventListener(key, value);\n      });\n\n      forEach(uploadEventHandlers, function(value, key) {\n        xhr.upload.addEventListener(key, value);\n      });\n\n      if (withCredentials) {\n        xhr.withCredentials = true;\n      }\n\n      if (responseType) {\n        try {\n          xhr.responseType = responseType;\n        } catch (e) {\n          // WebKit added support for the json responseType value on 09/03/2013\n          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are\n          // known to throw when setting the value \"json\" as the response type. Other older\n          // browsers implementing the responseType\n          //\n          // The json response type can be ignored if not supported, because JSON payloads are\n          // parsed on the client-side regardless.\n          if (responseType !== 'json') {\n            throw e;\n          }\n        }\n      }\n\n      xhr.send(isUndefined(post) ? null : post);\n    }\n\n    // Since we are using xhr.abort() when a request times out, we have to set a flag that\n    // indicates to requestAborted if the request timed out or was aborted.\n    //\n    // http.timeout = numerical timeout   timeout\n    // http.timeout = $timeout            timeout\n    // http.timeout = promise             abort\n    // xhr.abort()                        abort (The xhr object is normally inaccessible, but\n    //                                    can be exposed with the xhrFactory)\n    if (timeout > 0) {\n      var timeoutId = $browserDefer(function() {\n        timeoutRequest('timeout');\n      }, timeout);\n    } else if (isPromiseLike(timeout)) {\n      timeout.then(function() {\n        timeoutRequest(isDefined(timeout.$$timeoutId) ? 'timeout' : 'abort');\n      });\n    }\n\n    function timeoutRequest(reason) {\n      abortedByTimeout = reason === 'timeout';\n      if (jsonpDone) {\n        jsonpDone();\n      }\n      if (xhr) {\n        xhr.abort();\n      }\n    }\n\n    function completeRequest(callback, status, response, headersString, statusText, xhrStatus) {\n      // cancel timeout and subsequent timeout promise resolution\n      if (isDefined(timeoutId)) {\n        $browserDefer.cancel(timeoutId);\n      }\n      jsonpDone = xhr = null;\n\n      callback(status, response, headersString, statusText, xhrStatus);\n    }\n  };\n\n  function jsonpReq(url, callbackPath, done) {\n    url = url.replace('JSON_CALLBACK', callbackPath);\n    // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.:\n    // - fetches local scripts via XHR and evals them\n    // - adds and immediately removes script elements from the document\n    var script = rawDocument.createElement('script'), callback = null;\n    script.type = 'text/javascript';\n    script.src = url;\n    script.async = true;\n\n    callback = function(event) {\n      script.removeEventListener('load', callback);\n      script.removeEventListener('error', callback);\n      rawDocument.body.removeChild(script);\n      script = null;\n      var status = -1;\n      var text = 'unknown';\n\n      if (event) {\n        if (event.type === 'load' && !callbacks.wasCalled(callbackPath)) {\n          event = { type: 'error' };\n        }\n        text = event.type;\n        status = event.type === 'error' ? 404 : 200;\n      }\n\n      if (done) {\n        done(status, text);\n      }\n    };\n\n    script.addEventListener('load', callback);\n    script.addEventListener('error', callback);\n    rawDocument.body.appendChild(script);\n    return callback;\n  }\n}\n\nvar $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate');\n$interpolateMinErr.throwNoconcat = function(text) {\n  throw $interpolateMinErr('noconcat',\n      'Error while interpolating: {0}\\nStrict Contextual Escaping disallows ' +\n      'interpolations that concatenate multiple expressions when a trusted value is ' +\n      'required.  See http://docs.angularjs.org/api/ng.$sce', text);\n};\n\n$interpolateMinErr.interr = function(text, err) {\n  return $interpolateMinErr('interr', 'Can\\'t interpolate: {0}\\n{1}', text, err.toString());\n};\n\n/**\n * @ngdoc provider\n * @name $interpolateProvider\n * @this\n *\n * @description\n *\n * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.\n *\n * <div class=\"alert alert-danger\">\n * This feature is sometimes used to mix different markup languages, e.g. to wrap an AngularJS\n * template within a Python Jinja template (or any other template language). Mixing templating\n * languages is **very dangerous**. The embedding template language will not safely escape AngularJS\n * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS)\n * security bugs!\n * </div>\n *\n * @example\n<example name=\"custom-interpolation-markup\" module=\"customInterpolationApp\">\n<file name=\"index.html\">\n<script>\n  var customInterpolationApp = angular.module('customInterpolationApp', []);\n\n  customInterpolationApp.config(function($interpolateProvider) {\n    $interpolateProvider.startSymbol('//');\n    $interpolateProvider.endSymbol('//');\n  });\n\n\n  customInterpolationApp.controller('DemoController', function() {\n      this.label = \"This binding is brought you by // interpolation symbols.\";\n  });\n</script>\n<div ng-controller=\"DemoController as demo\">\n    //demo.label//\n</div>\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  it('should interpolate binding with custom symbols', function() {\n    expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');\n  });\n</file>\n</example>\n */\nfunction $InterpolateProvider() {\n  var startSymbol = '{{';\n  var endSymbol = '}}';\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#startSymbol\n   * @description\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\n   *\n   * @param {string=} value new value to set the starting symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.startSymbol = function(value) {\n    if (value) {\n      startSymbol = value;\n      return this;\n    }\n    return startSymbol;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#endSymbol\n   * @description\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n   *\n   * @param {string=} value new value to set the ending symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.endSymbol = function(value) {\n    if (value) {\n      endSymbol = value;\n      return this;\n    }\n    return endSymbol;\n  };\n\n\n  this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {\n    var startSymbolLength = startSymbol.length,\n        endSymbolLength = endSymbol.length,\n        escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),\n        escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');\n\n    function escape(ch) {\n      return '\\\\\\\\\\\\' + ch;\n    }\n\n    function unescapeText(text) {\n      return text.replace(escapedStartRegexp, startSymbol).\n        replace(escapedEndRegexp, endSymbol);\n    }\n\n    // TODO: this is the same as the constantWatchDelegate in parse.js\n    function constantWatchDelegate(scope, listener, objectEquality, constantInterp) {\n      var unwatch = scope.$watch(function constantInterpolateWatch(scope) {\n        unwatch();\n        return constantInterp(scope);\n      }, listener, objectEquality);\n      return unwatch;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $interpolate\n     * @kind function\n     *\n     * @requires $parse\n     * @requires $sce\n     *\n     * @description\n     *\n     * Compiles a string with markup into an interpolation function. This service is used by the\n     * HTML {@link ng.$compile $compile} service for data binding. See\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\n     * interpolation markup.\n     *\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var exp = $interpolate('Hello {{name | uppercase}}!');\n     *   expect(exp({name:'AngularJS'})).toEqual('Hello ANGULARJS!');\n     * ```\n     *\n     * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is\n     * `true`, the interpolation function will return `undefined` unless all embedded expressions\n     * evaluate to a value other than `undefined`.\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var context = {greeting: 'Hello', name: undefined };\n     *\n     *   // default \"forgiving\" mode\n     *   var exp = $interpolate('{{greeting}} {{name}}!');\n     *   expect(exp(context)).toEqual('Hello !');\n     *\n     *   // \"allOrNothing\" mode\n     *   exp = $interpolate('{{greeting}} {{name}}!', false, null, true);\n     *   expect(exp(context)).toBeUndefined();\n     *   context.name = 'AngularJS';\n     *   expect(exp(context)).toEqual('Hello AngularJS!');\n     * ```\n     *\n     * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.\n     *\n     * #### Escaped Interpolation\n     * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers\n     * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).\n     * It will be rendered as a regular start/end marker, and will not be interpreted as an expression\n     * or binding.\n     *\n     * This enables web-servers to prevent script injection attacks and defacing attacks, to some\n     * degree, while also enabling code examples to work without relying on the\n     * {@link ng.directive:ngNonBindable ngNonBindable} directive.\n     *\n     * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,\n     * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all\n     * interpolation start/end markers with their escaped counterparts.**\n     *\n     * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered\n     * output when the $interpolate service processes the text. So, for HTML elements interpolated\n     * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter\n     * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,\n     * this is typically useful only when user-data is used in rendering a template from the server, or\n     * when otherwise untrusted data is used by a directive.\n     *\n     * <example name=\"interpolation\">\n     *  <file name=\"index.html\">\n     *    <div ng-init=\"username='A user'\">\n     *      <p ng-init=\"apptitle='Escaping demo'\">{{apptitle}}: \\{\\{ username = \"defaced value\"; \\}\\}\n     *        </p>\n     *      <p><strong>{{username}}</strong> attempts to inject code which will deface the\n     *        application, but fails to accomplish their task, because the server has correctly\n     *        escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)\n     *        characters.</p>\n     *      <p>Instead, the result of the attempted script injection is visible, and can be removed\n     *        from the database by an administrator.</p>\n     *    </div>\n     *  </file>\n     * </example>\n     *\n     * @knownIssue\n     * It is currently not possible for an interpolated expression to contain the interpolation end\n     * symbol. For example, `{{ '}}' }}` will be incorrectly interpreted as `{{ ' }}` + `' }}`, i.e.\n     * an interpolated expression consisting of a single-quote (`'`) and the `' }}` string.\n     *\n     * @knownIssue\n     * All directives and components must use the standard `{{` `}}` interpolation symbols\n     * in their templates. If you change the application interpolation symbols the {@link $compile}\n     * service will attempt to denormalize the standard symbols to the custom symbols.\n     * The denormalization process is not clever enough to know not to replace instances of the standard\n     * symbols where they would not normally be treated as interpolation symbols. For example in the following\n     * code snippet the closing braces of the literal object will get incorrectly denormalized:\n     *\n     * ```\n     * <div data-context='{\"context\":{\"id\":3,\"type\":\"page\"}}\">\n     * ```\n     *\n     * The workaround is to ensure that such instances are separated by whitespace:\n     * ```\n     * <div data-context='{\"context\":{\"id\":3,\"type\":\"page\"} }\">\n     * ```\n     *\n     * See https://github.com/angular/angular.js/pull/14610#issuecomment-219401099 for more information.\n     *\n     * @param {string} text The text with markup to interpolate.\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\n     *    embedded expression in order to return an interpolation function. Strings with no\n     *    embedded expression will return null for the interpolation function.\n     * @param {string=} trustedContext when provided, the returned function passes the interpolated\n     *    result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,\n     *    trustedContext)} before returning it.  Refer to the {@link ng.$sce $sce} service that\n     *    provides Strict Contextual Escaping for details.\n     * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined\n     *    unless all embedded expressions evaluate to a value other than `undefined`.\n     * @returns {function(context)} an interpolation function which is used to compute the\n     *    interpolated string. The function has these parameters:\n     *\n     * - `context`: evaluation context for all expressions embedded in the interpolated text\n     */\n    function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n      var contextAllowsConcatenation = trustedContext === $sce.URL || trustedContext === $sce.MEDIA_URL;\n\n      // Provide a quick exit and simplified result function for text with no interpolation\n      if (!text.length || text.indexOf(startSymbol) === -1) {\n        if (mustHaveExpression) return;\n\n        var unescapedText = unescapeText(text);\n        if (contextAllowsConcatenation) {\n          unescapedText = $sce.getTrusted(trustedContext, unescapedText);\n        }\n        var constantInterp = valueFn(unescapedText);\n        constantInterp.exp = text;\n        constantInterp.expressions = [];\n        constantInterp.$$watchDelegate = constantWatchDelegate;\n\n        return constantInterp;\n      }\n\n      allOrNothing = !!allOrNothing;\n      var startIndex,\n          endIndex,\n          index = 0,\n          expressions = [],\n          parseFns,\n          textLength = text.length,\n          exp,\n          concat = [],\n          expressionPositions = [],\n          singleExpression;\n\n\n      while (index < textLength) {\n        if (((startIndex = text.indexOf(startSymbol, index)) !== -1) &&\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) !== -1)) {\n          if (index !== startIndex) {\n            concat.push(unescapeText(text.substring(index, startIndex)));\n          }\n          exp = text.substring(startIndex + startSymbolLength, endIndex);\n          expressions.push(exp);\n          index = endIndex + endSymbolLength;\n          expressionPositions.push(concat.length);\n          concat.push(''); // Placeholder that will get replaced with the evaluated expression.\n        } else {\n          // we did not find an interpolation, so we have to add the remainder to the separators array\n          if (index !== textLength) {\n            concat.push(unescapeText(text.substring(index)));\n          }\n          break;\n        }\n      }\n\n      singleExpression = concat.length === 1 && expressionPositions.length === 1;\n      // Intercept expression if we need to stringify concatenated inputs, which may be SCE trusted\n      // objects rather than simple strings\n      // (we don't modify the expression if the input consists of only a single trusted input)\n      var interceptor = contextAllowsConcatenation && singleExpression ? undefined : parseStringifyInterceptor;\n      parseFns = expressions.map(function(exp) { return $parse(exp, interceptor); });\n\n      // Concatenating expressions makes it hard to reason about whether some combination of\n      // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a\n      // single expression be used for some $sce-managed secure contexts (RESOURCE_URLs mostly),\n      // we ensure that the value that's used is assigned or constructed by some JS code somewhere\n      // that is more testable or make it obvious that you bound the value to some user controlled\n      // value.  This helps reduce the load when auditing for XSS issues.\n\n      // Note that URL and MEDIA_URL $sce contexts do not need this, since `$sce` can sanitize the values\n      // passed to it. In that case, `$sce.getTrusted` will be called on either the single expression\n      // or on the overall concatenated string (losing trusted types used in the mix, by design).\n      // Both these methods will sanitize plain strings. Also, HTML could be included, but since it's\n      // only used in srcdoc attributes, this would not be very useful.\n\n      if (!mustHaveExpression || expressions.length) {\n        var compute = function(values) {\n          for (var i = 0, ii = expressions.length; i < ii; i++) {\n            if (allOrNothing && isUndefined(values[i])) return;\n            concat[expressionPositions[i]] = values[i];\n          }\n\n          if (contextAllowsConcatenation) {\n            // If `singleExpression` then `concat[0]` might be a \"trusted\" value or `null`, rather than a string\n            return $sce.getTrusted(trustedContext, singleExpression ? concat[0] : concat.join(''));\n          } else if (trustedContext && concat.length > 1) {\n            // This context does not allow more than one part, e.g. expr + string or exp + exp.\n            $interpolateMinErr.throwNoconcat(text);\n          }\n          // In an unprivileged context or only one part: just concatenate and return.\n          return concat.join('');\n        };\n\n        return extend(function interpolationFn(context) {\n            var i = 0;\n            var ii = expressions.length;\n            var values = new Array(ii);\n\n            try {\n              for (; i < ii; i++) {\n                values[i] = parseFns[i](context);\n              }\n\n              return compute(values);\n            } catch (err) {\n              $exceptionHandler($interpolateMinErr.interr(text, err));\n            }\n\n          }, {\n          // all of these properties are undocumented for now\n          exp: text, //just for compatibility with regular watchers created via $watch\n          expressions: expressions,\n          $$watchDelegate: function(scope, listener) {\n            var lastValue;\n            return scope.$watchGroup(parseFns, /** @this */ function interpolateFnWatcher(values, oldValues) {\n              var currValue = compute(values);\n              listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);\n              lastValue = currValue;\n            });\n          }\n        });\n      }\n\n      function parseStringifyInterceptor(value) {\n        try {\n          // In concatenable contexts, getTrusted comes at the end, to avoid sanitizing individual\n          // parts of a full URL. We don't care about losing the trustedness here.\n          // In non-concatenable contexts, where there is only one expression, this interceptor is\n          // not applied to the expression.\n          value = (trustedContext && !contextAllowsConcatenation) ?\n                    $sce.getTrusted(trustedContext, value) :\n                    $sce.valueOf(value);\n          return allOrNothing && !isDefined(value) ? value : stringify(value);\n        } catch (err) {\n          $exceptionHandler($interpolateMinErr.interr(text, err));\n        }\n      }\n    }\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#startSymbol\n     * @description\n     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.\n     *\n     * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} start symbol.\n     */\n    $interpolate.startSymbol = function() {\n      return startSymbol;\n    };\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#endSymbol\n     * @description\n     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n     *\n     * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} end symbol.\n     */\n    $interpolate.endSymbol = function() {\n      return endSymbol;\n    };\n\n    return $interpolate;\n  }];\n}\n\nvar $intervalMinErr = minErr('$interval');\n\n/** @this */\nfunction $IntervalProvider() {\n  this.$get = ['$$intervalFactory', '$window',\n       function($$intervalFactory,   $window) {\n    var intervals = {};\n    var setIntervalFn = function(tick, delay, deferred) {\n      var id = $window.setInterval(tick, delay);\n      intervals[id] = deferred;\n      return id;\n    };\n    var clearIntervalFn = function(id) {\n      $window.clearInterval(id);\n      delete intervals[id];\n    };\n\n    /**\n     * @ngdoc service\n     * @name $interval\n     *\n     * @description\n     * AngularJS's wrapper for `window.setInterval`. The `fn` function is executed every `delay`\n     * milliseconds.\n     *\n     * The return value of registering an interval function is a promise. This promise will be\n     * notified upon each tick of the interval, and will be resolved after `count` iterations, or\n     * run indefinitely if `count` is not defined. The value of the notification will be the\n     * number of iterations that have run.\n     * To cancel an interval, call `$interval.cancel(promise)`.\n     *\n     * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n     * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n     * time.\n     *\n     * <div class=\"alert alert-warning\">\n     * **Note**: Intervals created by this service must be explicitly destroyed when you are finished\n     * with them.  In particular they are not automatically destroyed when a controller's scope or a\n     * directive's element are destroyed.\n     * You should take this into consideration and make sure to always cancel the interval at the\n     * appropriate moment.  See the example below for more details on how and when to do this.\n     * </div>\n     *\n     * @param {function()} fn A function that should be called repeatedly. If no additional arguments\n     *   are passed (see below), the function is called with the current iteration count.\n     * @param {number} delay Number of milliseconds between each function call.\n     * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n     *   indefinitely.\n     * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n     *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n     * @param {...*=} Pass additional parameters to the executed function.\n     * @returns {promise} A promise which will be notified on each iteration. It will resolve once all iterations of the interval complete.\n     *\n     * @example\n     * <example module=\"intervalExample\" name=\"interval-service\">\n     * <file name=\"index.html\">\n     *   <script>\n     *     angular.module('intervalExample', [])\n     *       .controller('ExampleController', ['$scope', '$interval',\n     *         function($scope, $interval) {\n     *           $scope.format = 'M/d/yy h:mm:ss a';\n     *           $scope.blood_1 = 100;\n     *           $scope.blood_2 = 120;\n     *\n     *           var stop;\n     *           $scope.fight = function() {\n     *             // Don't start a new fight if we are already fighting\n     *             if ( angular.isDefined(stop) ) return;\n     *\n     *             stop = $interval(function() {\n     *               if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {\n     *                 $scope.blood_1 = $scope.blood_1 - 3;\n     *                 $scope.blood_2 = $scope.blood_2 - 4;\n     *               } else {\n     *                 $scope.stopFight();\n     *               }\n     *             }, 100);\n     *           };\n     *\n     *           $scope.stopFight = function() {\n     *             if (angular.isDefined(stop)) {\n     *               $interval.cancel(stop);\n     *               stop = undefined;\n     *             }\n     *           };\n     *\n     *           $scope.resetFight = function() {\n     *             $scope.blood_1 = 100;\n     *             $scope.blood_2 = 120;\n     *           };\n     *\n     *           $scope.$on('$destroy', function() {\n     *             // Make sure that the interval is destroyed too\n     *             $scope.stopFight();\n     *           });\n     *         }])\n     *       // Register the 'myCurrentTime' directive factory method.\n     *       // We inject $interval and dateFilter service since the factory method is DI.\n     *       .directive('myCurrentTime', ['$interval', 'dateFilter',\n     *         function($interval, dateFilter) {\n     *           // return the directive link function. (compile function not needed)\n     *           return function(scope, element, attrs) {\n     *             var format,  // date format\n     *                 stopTime; // so that we can cancel the time updates\n     *\n     *             // used to update the UI\n     *             function updateTime() {\n     *               element.text(dateFilter(new Date(), format));\n     *             }\n     *\n     *             // watch the expression, and update the UI on change.\n     *             scope.$watch(attrs.myCurrentTime, function(value) {\n     *               format = value;\n     *               updateTime();\n     *             });\n     *\n     *             stopTime = $interval(updateTime, 1000);\n     *\n     *             // listen on DOM destroy (removal) event, and cancel the next UI update\n     *             // to prevent updating time after the DOM element was removed.\n     *             element.on('$destroy', function() {\n     *               $interval.cancel(stopTime);\n     *             });\n     *           }\n     *         }]);\n     *   </script>\n     *\n     *   <div>\n     *     <div ng-controller=\"ExampleController\">\n     *       <label>Date format: <input ng-model=\"format\"></label> <hr/>\n     *       Current time is: <span my-current-time=\"format\"></span>\n     *       <hr/>\n     *       Blood 1 : <font color='red'>{{blood_1}}</font>\n     *       Blood 2 : <font color='red'>{{blood_2}}</font>\n     *       <button type=\"button\" data-ng-click=\"fight()\">Fight</button>\n     *       <button type=\"button\" data-ng-click=\"stopFight()\">StopFight</button>\n     *       <button type=\"button\" data-ng-click=\"resetFight()\">resetFight</button>\n     *     </div>\n     *   </div>\n     *\n     * </file>\n     * </example>\n     */\n    var interval = $$intervalFactory(setIntervalFn, clearIntervalFn);\n\n    /**\n     * @ngdoc method\n     * @name $interval#cancel\n     *\n     * @description\n     * Cancels a task associated with the `promise`.\n     *\n     * @param {Promise=} promise returned by the `$interval` function.\n     * @returns {boolean} Returns `true` if the task was successfully canceled.\n     */\n    interval.cancel = function(promise) {\n      if (!promise) return false;\n\n      if (!promise.hasOwnProperty('$$intervalId')) {\n        throw $intervalMinErr('badprom',\n            '`$interval.cancel()` called with a promise that was not generated by `$interval()`.');\n      }\n\n      if (!intervals.hasOwnProperty(promise.$$intervalId)) return false;\n\n      var id = promise.$$intervalId;\n      var deferred = intervals[id];\n\n      // Interval cancels should not report an unhandled promise.\n      markQExceptionHandled(deferred.promise);\n      deferred.reject('canceled');\n      clearIntervalFn(id);\n\n      return true;\n    };\n\n    return interval;\n  }];\n}\n\n/** @this */\nfunction $$IntervalFactoryProvider() {\n  this.$get = ['$browser', '$q', '$$q', '$rootScope',\n       function($browser,   $q,   $$q,   $rootScope) {\n    return function intervalFactory(setIntervalFn, clearIntervalFn) {\n      return function intervalFn(fn, delay, count, invokeApply) {\n        var hasParams = arguments.length > 4,\n            args = hasParams ? sliceArgs(arguments, 4) : [],\n            iteration = 0,\n            skipApply = isDefined(invokeApply) && !invokeApply,\n            deferred = (skipApply ? $$q : $q).defer(),\n            promise = deferred.promise;\n\n        count = isDefined(count) ? count : 0;\n\n        function callback() {\n          if (!hasParams) {\n            fn(iteration);\n          } else {\n            fn.apply(null, args);\n          }\n        }\n\n        function tick() {\n          if (skipApply) {\n            $browser.defer(callback);\n          } else {\n            $rootScope.$evalAsync(callback);\n          }\n          deferred.notify(iteration++);\n\n          if (count > 0 && iteration >= count) {\n            deferred.resolve(iteration);\n            clearIntervalFn(promise.$$intervalId);\n          }\n\n          if (!skipApply) $rootScope.$apply();\n        }\n\n        promise.$$intervalId = setIntervalFn(tick, delay, deferred, skipApply);\n\n        return promise;\n      };\n    };\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $jsonpCallbacks\n * @requires $window\n * @description\n * This service handles the lifecycle of callbacks to handle JSONP requests.\n * Override this service if you wish to customise where the callbacks are stored and\n * how they vary compared to the requested url.\n */\nvar $jsonpCallbacksProvider = /** @this */ function() {\n  this.$get = function() {\n    var callbacks = angular.callbacks;\n    var callbackMap = {};\n\n    function createCallback(callbackId) {\n      var callback = function(data) {\n        callback.data = data;\n        callback.called = true;\n      };\n      callback.id = callbackId;\n      return callback;\n    }\n\n    return {\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#createCallback\n       * @param {string} url the url of the JSONP request\n       * @returns {string} the callback path to send to the server as part of the JSONP request\n       * @description\n       * {@link $httpBackend} calls this method to create a callback and get hold of the path to the callback\n       * to pass to the server, which will be used to call the callback with its payload in the JSONP response.\n       */\n      createCallback: function(url) {\n        var callbackId = '_' + (callbacks.$$counter++).toString(36);\n        var callbackPath = 'angular.callbacks.' + callbackId;\n        var callback = createCallback(callbackId);\n        callbackMap[callbackPath] = callbacks[callbackId] = callback;\n        return callbackPath;\n      },\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#wasCalled\n       * @param {string} callbackPath the path to the callback that was sent in the JSONP request\n       * @returns {boolean} whether the callback has been called, as a result of the JSONP response\n       * @description\n       * {@link $httpBackend} calls this method to find out whether the JSONP response actually called the\n       * callback that was passed in the request.\n       */\n      wasCalled: function(callbackPath) {\n        return callbackMap[callbackPath].called;\n      },\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#getResponse\n       * @param {string} callbackPath the path to the callback that was sent in the JSONP request\n       * @returns {*} the data received from the response via the registered callback\n       * @description\n       * {@link $httpBackend} calls this method to get hold of the data that was provided to the callback\n       * in the JSONP response.\n       */\n      getResponse: function(callbackPath) {\n        return callbackMap[callbackPath].data;\n      },\n      /**\n       * @ngdoc method\n       * @name $jsonpCallbacks#removeCallback\n       * @param {string} callbackPath the path to the callback that was sent in the JSONP request\n       * @description\n       * {@link $httpBackend} calls this method to remove the callback after the JSONP request has\n       * completed or timed-out.\n       */\n      removeCallback: function(callbackPath) {\n        var callback = callbackMap[callbackPath];\n        delete callbacks[callback.id];\n        delete callbackMap[callbackPath];\n      }\n    };\n  };\n};\n\n/**\n * @ngdoc service\n * @name $locale\n *\n * @description\n * $locale service provides localization rules for various AngularJS components. As of right now the\n * only public api is:\n *\n * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)\n */\n\n/* global stripHash: true */\n\nvar PATH_MATCH = /^([^?#]*)(\\?([^#]*))?(#(.*))?$/,\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\nvar $locationMinErr = minErr('$location');\n\n\n/**\n * Encode path using encodeUriSegment, ignoring forward slashes\n *\n * @param {string} path Path to encode\n * @returns {string}\n */\nfunction encodePath(path) {\n  var segments = path.split('/'),\n      i = segments.length;\n\n  while (i--) {\n    // decode forward slashes to prevent them from being double encoded\n    segments[i] = encodeUriSegment(segments[i].replace(/%2F/g, '/'));\n  }\n\n  return segments.join('/');\n}\n\nfunction decodePath(path, html5Mode) {\n  var segments = path.split('/'),\n      i = segments.length;\n\n  while (i--) {\n    segments[i] = decodeURIComponent(segments[i]);\n    if (html5Mode) {\n      // encode forward slashes to prevent them from being mistaken for path separators\n      segments[i] = segments[i].replace(/\\//g, '%2F');\n    }\n  }\n\n  return segments.join('/');\n}\n\nfunction normalizePath(pathValue, searchValue, hashValue) {\n  var search = toKeyValue(searchValue),\n    hash = hashValue ? '#' + encodeUriSegment(hashValue) : '',\n    path = encodePath(pathValue);\n\n  return path + (search ? '?' + search : '') + hash;\n}\n\nfunction parseAbsoluteUrl(absoluteUrl, locationObj) {\n  var parsedUrl = urlResolve(absoluteUrl);\n\n  locationObj.$$protocol = parsedUrl.protocol;\n  locationObj.$$host = parsedUrl.hostname;\n  locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\n}\n\nvar DOUBLE_SLASH_REGEX = /^\\s*[\\\\/]{2,}/;\nfunction parseAppUrl(url, locationObj, html5Mode) {\n\n  if (DOUBLE_SLASH_REGEX.test(url)) {\n    throw $locationMinErr('badpath', 'Invalid url \"{0}\".', url);\n  }\n\n  var prefixed = (url.charAt(0) !== '/');\n  if (prefixed) {\n    url = '/' + url;\n  }\n  var match = urlResolve(url);\n  var path = prefixed && match.pathname.charAt(0) === '/' ? match.pathname.substring(1) : match.pathname;\n  locationObj.$$path = decodePath(path, html5Mode);\n  locationObj.$$search = parseKeyValue(match.search);\n  locationObj.$$hash = decodeURIComponent(match.hash);\n\n  // make sure path starts with '/';\n  if (locationObj.$$path && locationObj.$$path.charAt(0) !== '/') {\n    locationObj.$$path = '/' + locationObj.$$path;\n  }\n}\n\nfunction startsWith(str, search) {\n  return str.slice(0, search.length) === search;\n}\n\n/**\n *\n * @param {string} base\n * @param {string} url\n * @returns {string} returns text from `url` after `base` or `undefined` if it does not begin with\n *                   the expected string.\n */\nfunction stripBaseUrl(base, url) {\n  if (startsWith(url, base)) {\n    return url.substr(base.length);\n  }\n}\n\nfunction stripHash(url) {\n  var index = url.indexOf('#');\n  return index === -1 ? url : url.substr(0, index);\n}\n\nfunction stripFile(url) {\n  return url.substr(0, stripHash(url).lastIndexOf('/') + 1);\n}\n\n/* return the server only (scheme://host:port) */\nfunction serverBase(url) {\n  return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));\n}\n\n\n/**\n * LocationHtml5Url represents a URL\n * This object is exposed as $location service when HTML5 mode is enabled and supported\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} basePrefix URL path prefix\n */\nfunction LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {\n  this.$$html5 = true;\n  basePrefix = basePrefix || '';\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given HTML5 (regular) URL string into properties\n   * @param {string} url HTML5 URL\n   * @private\n   */\n  this.$$parse = function(url) {\n    var pathUrl = stripBaseUrl(appBaseNoFile, url);\n    if (!isString(pathUrl)) {\n      throw $locationMinErr('ipthprfx', 'Invalid url \"{0}\", missing path prefix \"{1}\".', url,\n          appBaseNoFile);\n    }\n\n    parseAppUrl(pathUrl, this, true);\n\n    if (!this.$$path) {\n      this.$$path = '/';\n    }\n\n    this.$$compose();\n  };\n\n  this.$$normalizeUrl = function(url) {\n    return appBaseNoFile + url.substr(1); // first char is always '/'\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n    var appUrl, prevAppUrl;\n    var rewrittenUrl;\n\n\n    if (isDefined(appUrl = stripBaseUrl(appBase, url))) {\n      prevAppUrl = appUrl;\n      if (basePrefix && isDefined(appUrl = stripBaseUrl(basePrefix, appUrl))) {\n        rewrittenUrl = appBaseNoFile + (stripBaseUrl('/', appUrl) || appUrl);\n      } else {\n        rewrittenUrl = appBase + prevAppUrl;\n      }\n    } else if (isDefined(appUrl = stripBaseUrl(appBaseNoFile, url))) {\n      rewrittenUrl = appBaseNoFile + appUrl;\n    } else if (appBaseNoFile === url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents URL\n * This object is exposed as $location service when developer doesn't opt into html5 mode.\n * It also serves as the base class for html5 mode fallback on legacy browsers.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {\n\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given hashbang URL into properties\n   * @param {string} url Hashbang URL\n   * @private\n   */\n  this.$$parse = function(url) {\n    var withoutBaseUrl = stripBaseUrl(appBase, url) || stripBaseUrl(appBaseNoFile, url);\n    var withoutHashUrl;\n\n    if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') {\n\n      // The rest of the URL starts with a hash so we have\n      // got either a hashbang path or a plain hash fragment\n      withoutHashUrl = stripBaseUrl(hashPrefix, withoutBaseUrl);\n      if (isUndefined(withoutHashUrl)) {\n        // There was no hashbang prefix so we just have a hash fragment\n        withoutHashUrl = withoutBaseUrl;\n      }\n\n    } else {\n      // There was no hashbang path nor hash fragment:\n      // If we are in HTML5 mode we use what is left as the path;\n      // Otherwise we ignore what is left\n      if (this.$$html5) {\n        withoutHashUrl = withoutBaseUrl;\n      } else {\n        withoutHashUrl = '';\n        if (isUndefined(withoutBaseUrl)) {\n          appBase = url;\n          /** @type {?} */ (this).replace();\n        }\n      }\n    }\n\n    parseAppUrl(withoutHashUrl, this, false);\n\n    this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);\n\n    this.$$compose();\n\n    /*\n     * In Windows, on an anchor node on documents loaded from\n     * the filesystem, the browser will return a pathname\n     * prefixed with the drive name ('/C:/path') when a\n     * pathname without a drive is set:\n     *  * a.setAttribute('href', '/foo')\n     *   * a.pathname === '/C:/foo' //true\n     *\n     * Inside of AngularJS, we're always using pathnames that\n     * do not include drive names for routing.\n     */\n    function removeWindowsDriveName(path, url, base) {\n      /*\n      Matches paths for file protocol on windows,\n      such as /C:/foo/bar, and captures only /foo/bar.\n      */\n      var windowsFilePathExp = /^\\/[A-Z]:(\\/.*)/;\n\n      var firstPathSegmentMatch;\n\n      //Get the relative path from the input URL.\n      if (startsWith(url, base)) {\n        url = url.replace(base, '');\n      }\n\n      // The input URL intentionally contains a first path segment that ends with a colon.\n      if (windowsFilePathExp.exec(url)) {\n        return path;\n      }\n\n      firstPathSegmentMatch = windowsFilePathExp.exec(path);\n      return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;\n    }\n  };\n\n  this.$$normalizeUrl = function(url) {\n    return appBase + (url ? hashPrefix + url : '');\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (stripHash(appBase) === stripHash(url)) {\n      this.$$parse(url);\n      return true;\n    }\n    return false;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents URL\n * This object is exposed as $location service when html5 history api is enabled but the browser\n * does not support it.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {\n  this.$$html5 = true;\n  LocationHashbangUrl.apply(this, arguments);\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n\n    var rewrittenUrl;\n    var appUrl;\n\n    if (appBase === stripHash(url)) {\n      rewrittenUrl = url;\n    } else if ((appUrl = stripBaseUrl(appBaseNoFile, url))) {\n      rewrittenUrl = appBase + hashPrefix + appUrl;\n    } else if (appBaseNoFile === url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n\n  this.$$normalizeUrl = function(url) {\n    // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#'\n    return appBase + hashPrefix + url;\n  };\n}\n\n\nvar locationPrototype = {\n\n  /**\n   * Ensure absolute URL is initialized.\n   * @private\n   */\n  $$absUrl:'',\n\n  /**\n   * Are we in html5 mode?\n   * @private\n   */\n  $$html5: false,\n\n  /**\n   * Has any change been replacing?\n   * @private\n   */\n  $$replace: false,\n\n  /**\n   * Compose url and update `url` and `absUrl` property\n   * @private\n   */\n  $$compose: function() {\n    this.$$url = normalizePath(this.$$path, this.$$search, this.$$hash);\n    this.$$absUrl = this.$$normalizeUrl(this.$$url);\n    this.$$urlUpdatedByLocation = true;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#absUrl\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return full URL representation with all segments encoded according to rules specified in\n   * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var absUrl = $location.absUrl();\n   * // => \"http://example.com/#/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @return {string} full URL\n   */\n  absUrl: locationGetter('$$absUrl'),\n\n  /**\n   * @ngdoc method\n   * @name $location#url\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return URL (e.g. `/path?a=b#hash`) when called without any parameter.\n   *\n   * Change path, search and hash, when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var url = $location.url();\n   * // => \"/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @param {string=} url New URL without base prefix (e.g. `/path?a=b#hash`)\n   * @return {string} url\n   */\n  url: function(url) {\n    if (isUndefined(url)) {\n      return this.$$url;\n    }\n\n    var match = PATH_MATCH.exec(url);\n    if (match[1] || url === '') this.path(decodeURIComponent(match[1]));\n    if (match[2] || match[1] || url === '') this.search(match[3] || '');\n    this.hash(match[5] || '');\n\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#protocol\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return protocol of current URL.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var protocol = $location.protocol();\n   * // => \"http\"\n   * ```\n   *\n   * @return {string} protocol of current URL\n   */\n  protocol: locationGetter('$$protocol'),\n\n  /**\n   * @ngdoc method\n   * @name $location#host\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return host of current URL.\n   *\n   * Note: compared to the non-AngularJS version `location.host` which returns `hostname:port`, this returns the `hostname` portion only.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var host = $location.host();\n   * // => \"example.com\"\n   *\n   * // given URL http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo\n   * host = $location.host();\n   * // => \"example.com\"\n   * host = location.host;\n   * // => \"example.com:8080\"\n   * ```\n   *\n   * @return {string} host of current URL.\n   */\n  host: locationGetter('$$host'),\n\n  /**\n   * @ngdoc method\n   * @name $location#port\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return port of current URL.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var port = $location.port();\n   * // => 80\n   * ```\n   *\n   * @return {Number} port\n   */\n  port: locationGetter('$$port'),\n\n  /**\n   * @ngdoc method\n   * @name $location#path\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return path of current URL when called without any parameter.\n   *\n   * Change path when called with parameter and return `$location`.\n   *\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\n   * if it is missing.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var path = $location.path();\n   * // => \"/some/path\"\n   * ```\n   *\n   * @param {(string|number)=} path New path\n   * @return {(string|object)} path if called with no parameters, or `$location` if called with a parameter\n   */\n  path: locationGetterSetter('$$path', function(path) {\n    path = path !== null ? path.toString() : '';\n    return path.charAt(0) === '/' ? path : '/' + path;\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#search\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return search part (as object) of current URL when called without any parameter.\n   *\n   * Change search part when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var searchObject = $location.search();\n   * // => {foo: 'bar', baz: 'xoxo'}\n   *\n   * // set foo to 'yipee'\n   * $location.search('foo', 'yipee');\n   * // $location.search() => {foo: 'yipee', baz: 'xoxo'}\n   * ```\n   *\n   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\n   * hash object.\n   *\n   * When called with a single argument the method acts as a setter, setting the `search` component\n   * of `$location` to the specified value.\n   *\n   * If the argument is a hash object containing an array of values, these values will be encoded\n   * as duplicate search parameters in the URL.\n   *\n   * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number, then `paramValue`\n   * will override only a single search property.\n   *\n   * If `paramValue` is an array, it will override the property of the `search` component of\n   * `$location` specified via the first argument.\n   *\n   * If `paramValue` is `null`, the property specified via the first argument will be deleted.\n   *\n   * If `paramValue` is `true`, the property specified via the first argument will be added with no\n   * value nor trailing equal sign.\n   *\n   * @return {Object} If called with no arguments returns the parsed `search` object. If called with\n   * one or more arguments returns `$location` object itself.\n   */\n  search: function(search, paramValue) {\n    switch (arguments.length) {\n      case 0:\n        return this.$$search;\n      case 1:\n        if (isString(search) || isNumber(search)) {\n          search = search.toString();\n          this.$$search = parseKeyValue(search);\n        } else if (isObject(search)) {\n          search = copy(search, {});\n          // remove object undefined or null properties\n          forEach(search, function(value, key) {\n            if (value == null) delete search[key];\n          });\n\n          this.$$search = search;\n        } else {\n          throw $locationMinErr('isrcharg',\n              'The first argument of the `$location#search()` call must be a string or an object.');\n        }\n        break;\n      default:\n        if (isUndefined(paramValue) || paramValue === null) {\n          delete this.$$search[search];\n        } else {\n          this.$$search[search] = paramValue;\n        }\n    }\n\n    this.$$compose();\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#hash\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Returns the hash fragment when called without any parameters.\n   *\n   * Changes the hash fragment when called with a parameter and returns `$location`.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue\n   * var hash = $location.hash();\n   * // => \"hashValue\"\n   * ```\n   *\n   * @param {(string|number)=} hash New hash fragment\n   * @return {string} hash\n   */\n  hash: locationGetterSetter('$$hash', function(hash) {\n    return hash !== null ? hash.toString() : '';\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#replace\n   *\n   * @description\n   * If called, all changes to $location during the current `$digest` will replace the current history\n   * record, instead of adding a new one.\n   */\n  replace: function() {\n    this.$$replace = true;\n    return this;\n  }\n};\n\nforEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) {\n  Location.prototype = Object.create(locationPrototype);\n\n  /**\n   * @ngdoc method\n   * @name $location#state\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return the history state object when called without any parameter.\n   *\n   * Change the history state object when called with one parameter and return `$location`.\n   * The state object is later passed to `pushState` or `replaceState`.\n   *\n   * NOTE: This method is supported only in HTML5 mode and only in browsers supporting\n   * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support\n   * older browsers (like IE9 or Android < 4.0), don't use this method.\n   *\n   * @param {object=} state State object for pushState or replaceState\n   * @return {object} state\n   */\n  Location.prototype.state = function(state) {\n    if (!arguments.length) {\n      return this.$$state;\n    }\n\n    if (Location !== LocationHtml5Url || !this.$$html5) {\n      throw $locationMinErr('nostate', 'History API state support is available only ' +\n        'in HTML5 mode and only in browsers supporting HTML5 History API');\n    }\n    // The user might modify `stateObject` after invoking `$location.state(stateObject)`\n    // but we're changing the $$state reference to $browser.state() during the $digest\n    // so the modification window is narrow.\n    this.$$state = isUndefined(state) ? null : state;\n    this.$$urlUpdatedByLocation = true;\n\n    return this;\n  };\n});\n\n\nfunction locationGetter(property) {\n  return /** @this */ function() {\n    return this[property];\n  };\n}\n\n\nfunction locationGetterSetter(property, preprocess) {\n  return /** @this */ function(value) {\n    if (isUndefined(value)) {\n      return this[property];\n    }\n\n    this[property] = preprocess(value);\n    this.$$compose();\n\n    return this;\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $location\n *\n * @requires $rootElement\n *\n * @description\n * The $location service parses the URL in the browser address bar (based on the\n * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL\n * available to your application. Changes to the URL in the address bar are reflected into\n * $location service and changes to $location are reflected into the browser address bar.\n *\n * **The $location service:**\n *\n * - Exposes the current URL in the browser address bar, so you can\n *   - Watch and observe the URL.\n *   - Change the URL.\n * - Synchronizes the URL with the browser when the user\n *   - Changes the address bar.\n *   - Clicks the back or forward button (or clicks a History link).\n *   - Clicks on a link.\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\n *\n * For more information see {@link guide/$location Developer Guide: Using $location}\n */\n\n/**\n * @ngdoc provider\n * @name $locationProvider\n * @this\n *\n * @description\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\n */\nfunction $LocationProvider() {\n  var hashPrefix = '!',\n      html5Mode = {\n        enabled: false,\n        requireBase: true,\n        rewriteLinks: true\n      };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#hashPrefix\n   * @description\n   * The default value for the prefix is `'!'`.\n   * @param {string=} prefix Prefix for hash part (containing path and search)\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.hashPrefix = function(prefix) {\n    if (isDefined(prefix)) {\n      hashPrefix = prefix;\n      return this;\n    } else {\n      return hashPrefix;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#html5Mode\n   * @description\n   * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value.\n   *   If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported\n   *   properties:\n   *   - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to\n   *     change urls where supported. Will fall back to hash-prefixed paths in browsers that do not\n   *     support `pushState`.\n   *   - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies\n   *     whether or not a <base> tag is required to be present. If `enabled` and `requireBase` are\n   *     true, and a base tag is not present, an error will be thrown when `$location` is injected.\n   *     See the {@link guide/$location $location guide for more information}\n   *   - **rewriteLinks** - `{boolean|string}` - (default: `true`) When html5Mode is enabled,\n   *     enables/disables URL rewriting for relative links. If set to a string, URL rewriting will\n   *     only happen on links with an attribute that matches the given string. For example, if set\n   *     to `'internal-link'`, then the URL will only be rewritten for `<a internal-link>` links.\n   *     Note that [attribute name normalization](guide/directive#normalization) does not apply\n   *     here, so `'internalLink'` will **not** match `'internal-link'`.\n   *\n   * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter\n   */\n  this.html5Mode = function(mode) {\n    if (isBoolean(mode)) {\n      html5Mode.enabled = mode;\n      return this;\n    } else if (isObject(mode)) {\n\n      if (isBoolean(mode.enabled)) {\n        html5Mode.enabled = mode.enabled;\n      }\n\n      if (isBoolean(mode.requireBase)) {\n        html5Mode.requireBase = mode.requireBase;\n      }\n\n      if (isBoolean(mode.rewriteLinks) || isString(mode.rewriteLinks)) {\n        html5Mode.rewriteLinks = mode.rewriteLinks;\n      }\n\n      return this;\n    } else {\n      return html5Mode;\n    }\n  };\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeStart\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted before a URL will change.\n   *\n   * This change can be prevented by calling\n   * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more\n   * details about event object. Upon successful change\n   * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeSuccess\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted after a URL was changed.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window',\n      function($rootScope, $browser, $sniffer, $rootElement, $window) {\n    var $location,\n        LocationMode,\n        baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''\n        initialUrl = $browser.url(),\n        appBase;\n\n    if (html5Mode.enabled) {\n      if (!baseHref && html5Mode.requireBase) {\n        throw $locationMinErr('nobase',\n          '$location in HTML5 mode requires a <base> tag to be present!');\n      }\n      appBase = serverBase(initialUrl) + (baseHref || '/');\n      LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;\n    } else {\n      appBase = stripHash(initialUrl);\n      LocationMode = LocationHashbangUrl;\n    }\n    var appBaseNoFile = stripFile(appBase);\n\n    $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix);\n    $location.$$parseLinkUrl(initialUrl, initialUrl);\n\n    $location.$$state = $browser.state();\n\n    var IGNORE_URI_REGEXP = /^\\s*(javascript|mailto):/i;\n\n    // Determine if two URLs are equal despite potentially having different encoding/normalizing\n    //  such as $location.absUrl() vs $browser.url()\n    // See https://github.com/angular/angular.js/issues/16592\n    function urlsEqual(a, b) {\n      return a === b || urlResolve(a).href === urlResolve(b).href;\n    }\n\n    function setBrowserUrlWithFallback(url, replace, state) {\n      var oldUrl = $location.url();\n      var oldState = $location.$$state;\n      try {\n        $browser.url(url, replace, state);\n\n        // Make sure $location.state() returns referentially identical (not just deeply equal)\n        // state object; this makes possible quick checking if the state changed in the digest\n        // loop. Checking deep equality would be too expensive.\n        $location.$$state = $browser.state();\n      } catch (e) {\n        // Restore old values if pushState fails\n        $location.url(oldUrl);\n        $location.$$state = oldState;\n\n        throw e;\n      }\n    }\n\n    $rootElement.on('click', function(event) {\n      var rewriteLinks = html5Mode.rewriteLinks;\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\n      // currently we open nice url link and redirect then\n\n      if (!rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which === 2 || event.button === 2) return;\n\n      var elm = jqLite(event.target);\n\n      // traverse the DOM up to find first A tag\n      while (nodeName_(elm[0]) !== 'a') {\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\n      }\n\n      if (isString(rewriteLinks) && isUndefined(elm.attr(rewriteLinks))) return;\n\n      var absHref = elm.prop('href');\n      // get the actual href attribute - see\n      // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx\n      var relHref = elm.attr('href') || elm.attr('xlink:href');\n\n      if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {\n        // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during\n        // an animation.\n        absHref = urlResolve(absHref.animVal).href;\n      }\n\n      // Ignore when url is started with javascript: or mailto:\n      if (IGNORE_URI_REGEXP.test(absHref)) return;\n\n      if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {\n        if ($location.$$parseLinkUrl(absHref, relHref)) {\n          // We do a preventDefault for all urls that are part of the AngularJS application,\n          // in html5mode and also without, so that we are able to abort navigation without\n          // getting double entries in the location history.\n          event.preventDefault();\n          // update location manually\n          if ($location.absUrl() !== $browser.url()) {\n            $rootScope.$apply();\n          }\n        }\n      }\n    });\n\n\n    // rewrite hashbang url <> html5 url\n    if ($location.absUrl() !== initialUrl) {\n      $browser.url($location.absUrl(), true);\n    }\n\n    var initializing = true;\n\n    // update $location when $browser url changes\n    $browser.onUrlChange(function(newUrl, newState) {\n\n      if (!startsWith(newUrl, appBaseNoFile)) {\n        // If we are navigating outside of the app then force a reload\n        $window.location.href = newUrl;\n        return;\n      }\n\n      $rootScope.$evalAsync(function() {\n        var oldUrl = $location.absUrl();\n        var oldState = $location.$$state;\n        var defaultPrevented;\n        $location.$$parse(newUrl);\n        $location.$$state = newState;\n\n        defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n            newState, oldState).defaultPrevented;\n\n        // if the location was changed by a `$locationChangeStart` handler then stop\n        // processing this location change\n        if ($location.absUrl() !== newUrl) return;\n\n        if (defaultPrevented) {\n          $location.$$parse(oldUrl);\n          $location.$$state = oldState;\n          setBrowserUrlWithFallback(oldUrl, false, oldState);\n        } else {\n          initializing = false;\n          afterLocationChange(oldUrl, oldState);\n        }\n      });\n      if (!$rootScope.$$phase) $rootScope.$digest();\n    });\n\n    // update browser\n    $rootScope.$watch(function $locationWatch() {\n      if (initializing || $location.$$urlUpdatedByLocation) {\n        $location.$$urlUpdatedByLocation = false;\n\n        var oldUrl = $browser.url();\n        var newUrl = $location.absUrl();\n        var oldState = $browser.state();\n        var currentReplace = $location.$$replace;\n        var urlOrStateChanged = !urlsEqual(oldUrl, newUrl) ||\n          ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);\n\n        if (initializing || urlOrStateChanged) {\n          initializing = false;\n\n          $rootScope.$evalAsync(function() {\n            var newUrl = $location.absUrl();\n            var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n                $location.$$state, oldState).defaultPrevented;\n\n            // if the location was changed by a `$locationChangeStart` handler then stop\n            // processing this location change\n            if ($location.absUrl() !== newUrl) return;\n\n            if (defaultPrevented) {\n              $location.$$parse(oldUrl);\n              $location.$$state = oldState;\n            } else {\n              if (urlOrStateChanged) {\n                setBrowserUrlWithFallback(newUrl, currentReplace,\n                                          oldState === $location.$$state ? null : $location.$$state);\n              }\n              afterLocationChange(oldUrl, oldState);\n            }\n          });\n        }\n      }\n\n      $location.$$replace = false;\n\n      // we don't need to return anything because $evalAsync will make the digest loop dirty when\n      // there is a change\n    });\n\n    return $location;\n\n    function afterLocationChange(oldUrl, oldState) {\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl,\n        $location.$$state, oldState);\n    }\n}];\n}\n\n/**\n * @ngdoc service\n * @name $log\n * @requires $window\n *\n * @description\n * Simple service for logging. Default implementation safely writes the message\n * into the browser's console (if present).\n *\n * The main purpose of this service is to simplify debugging and troubleshooting.\n *\n * To reveal the location of the calls to `$log` in the JavaScript console,\n * you can \"blackbox\" the AngularJS source in your browser:\n *\n * [Mozilla description of blackboxing](https://developer.mozilla.org/en-US/docs/Tools/Debugger/How_to/Black_box_a_source).\n * [Chrome description of blackboxing](https://developer.chrome.com/devtools/docs/blackboxing).\n *\n * Note: Not all browsers support blackboxing.\n *\n * The default is to log `debug` messages. You can use\n * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.\n *\n * @example\n   <example module=\"logExample\" name=\"log-service\">\n     <file name=\"script.js\">\n       angular.module('logExample', [])\n         .controller('LogController', ['$scope', '$log', function($scope, $log) {\n           $scope.$log = $log;\n           $scope.message = 'Hello World!';\n         }]);\n     </file>\n     <file name=\"index.html\">\n       <div ng-controller=\"LogController\">\n         <p>Reload this page with open console, enter text and hit the log button...</p>\n         <label>Message:\n         <input type=\"text\" ng-model=\"message\" /></label>\n         <button ng-click=\"$log.log(message)\">log</button>\n         <button ng-click=\"$log.warn(message)\">warn</button>\n         <button ng-click=\"$log.info(message)\">info</button>\n         <button ng-click=\"$log.error(message)\">error</button>\n         <button ng-click=\"$log.debug(message)\">debug</button>\n       </div>\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc provider\n * @name $logProvider\n * @this\n *\n * @description\n * Use the `$logProvider` to configure how the application logs messages\n */\nfunction $LogProvider() {\n  var debug = true,\n      self = this;\n\n  /**\n   * @ngdoc method\n   * @name $logProvider#debugEnabled\n   * @description\n   * @param {boolean=} flag enable or disable debug level messages\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.debugEnabled = function(flag) {\n    if (isDefined(flag)) {\n      debug = flag;\n      return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = ['$window', function($window) {\n    // Support: IE 9-11, Edge 12-14+\n    // IE/Edge display errors in such a way that it requires the user to click in 4 places\n    // to see the stack trace. There is no way to feature-detect it so there's a chance\n    // of the user agent sniffing to go wrong but since it's only about logging, this shouldn't\n    // break apps. Other browsers display errors in a sensible way and some of them map stack\n    // traces along source maps if available so it makes sense to let browsers display it\n    // as they want.\n    var formatStackTrace = msie || /\\bEdge\\//.test($window.navigator && $window.navigator.userAgent);\n\n    return {\n      /**\n       * @ngdoc method\n       * @name $log#log\n       *\n       * @description\n       * Write a log message\n       */\n      log: consoleLog('log'),\n\n      /**\n       * @ngdoc method\n       * @name $log#info\n       *\n       * @description\n       * Write an information message\n       */\n      info: consoleLog('info'),\n\n      /**\n       * @ngdoc method\n       * @name $log#warn\n       *\n       * @description\n       * Write a warning message\n       */\n      warn: consoleLog('warn'),\n\n      /**\n       * @ngdoc method\n       * @name $log#error\n       *\n       * @description\n       * Write an error message\n       */\n      error: consoleLog('error'),\n\n      /**\n       * @ngdoc method\n       * @name $log#debug\n       *\n       * @description\n       * Write a debug message\n       */\n      debug: (function() {\n        var fn = consoleLog('debug');\n\n        return function() {\n          if (debug) {\n            fn.apply(self, arguments);\n          }\n        };\n      })()\n    };\n\n    function formatError(arg) {\n      if (isError(arg)) {\n        if (arg.stack && formatStackTrace) {\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\n              : arg.stack;\n        } else if (arg.sourceURL) {\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\n        }\n      }\n      return arg;\n    }\n\n    function consoleLog(type) {\n      var console = $window.console || {},\n          logFn = console[type] || console.log || noop;\n\n      return function() {\n        var args = [];\n        forEach(arguments, function(arg) {\n          args.push(formatError(arg));\n        });\n        // Support: IE 9 only\n        // console methods don't inherit from Function.prototype in IE 9 so we can't\n        // call `logFn.apply(console, args)` directly.\n        return Function.prototype.apply.call(logFn, console, args);\n      };\n    }\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $parseMinErr = minErr('$parse');\n\nvar objectValueOf = {}.constructor.prototype.valueOf;\n\n// Sandboxing AngularJS Expressions\n// ------------------------------\n// AngularJS expressions are no longer sandboxed. So it is now even easier to access arbitrary JS code by\n// various means such as obtaining a reference to native JS functions like the Function constructor.\n//\n// As an example, consider the following AngularJS expression:\n//\n//   {}.toString.constructor('alert(\"evil JS code\")')\n//\n// It is important to realize that if you create an expression from a string that contains user provided\n// content then it is possible that your application contains a security vulnerability to an XSS style attack.\n//\n// See https://docs.angularjs.org/guide/security\n\n\nfunction getStringValue(name) {\n  // Property names must be strings. This means that non-string objects cannot be used\n  // as keys in an object. Any non-string object, including a number, is typecasted\n  // into a string via the toString method.\n  // -- MDN, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Property_accessors#Property_names\n  //\n  // So, to ensure that we are checking the same `name` that JavaScript would use, we cast it\n  // to a string. It's not always possible. If `name` is an object and its `toString` method is\n  // 'broken' (doesn't return a string, isn't a function, etc.), an error will be thrown:\n  //\n  // TypeError: Cannot convert object to primitive value\n  //\n  // For performance reasons, we don't catch this error here and allow it to propagate up the call\n  // stack. Note that you'll get the same error in JavaScript if you try to access a property using\n  // such a 'broken' object as a key.\n  return name + '';\n}\n\n\nvar OPERATORS = createMap();\nforEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; });\nvar ESCAPE = {'n':'\\n', 'f':'\\f', 'r':'\\r', 't':'\\t', 'v':'\\v', '\\'':'\\'', '\"':'\"'};\n\n\n/////////////////////////////////////////\n\n\n/**\n * @constructor\n */\nvar Lexer = function Lexer(options) {\n  this.options = options;\n};\n\nLexer.prototype = {\n  constructor: Lexer,\n\n  lex: function(text) {\n    this.text = text;\n    this.index = 0;\n    this.tokens = [];\n\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      if (ch === '\"' || ch === '\\'') {\n        this.readString(ch);\n      } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {\n        this.readNumber();\n      } else if (this.isIdentifierStart(this.peekMultichar())) {\n        this.readIdent();\n      } else if (this.is(ch, '(){}[].,;:?')) {\n        this.tokens.push({index: this.index, text: ch});\n        this.index++;\n      } else if (this.isWhitespace(ch)) {\n        this.index++;\n      } else {\n        var ch2 = ch + this.peek();\n        var ch3 = ch2 + this.peek(2);\n        var op1 = OPERATORS[ch];\n        var op2 = OPERATORS[ch2];\n        var op3 = OPERATORS[ch3];\n        if (op1 || op2 || op3) {\n          var token = op3 ? ch3 : (op2 ? ch2 : ch);\n          this.tokens.push({index: this.index, text: token, operator: true});\n          this.index += token.length;\n        } else {\n          this.throwError('Unexpected next character ', this.index, this.index + 1);\n        }\n      }\n    }\n    return this.tokens;\n  },\n\n  is: function(ch, chars) {\n    return chars.indexOf(ch) !== -1;\n  },\n\n  peek: function(i) {\n    var num = i || 1;\n    return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;\n  },\n\n  isNumber: function(ch) {\n    return ('0' <= ch && ch <= '9') && typeof ch === 'string';\n  },\n\n  isWhitespace: function(ch) {\n    // IE treats non-breaking space as \\u00A0\n    return (ch === ' ' || ch === '\\r' || ch === '\\t' ||\n            ch === '\\n' || ch === '\\v' || ch === '\\u00A0');\n  },\n\n  isIdentifierStart: function(ch) {\n    return this.options.isIdentifierStart ?\n        this.options.isIdentifierStart(ch, this.codePointAt(ch)) :\n        this.isValidIdentifierStart(ch);\n  },\n\n  isValidIdentifierStart: function(ch) {\n    return ('a' <= ch && ch <= 'z' ||\n            'A' <= ch && ch <= 'Z' ||\n            '_' === ch || ch === '$');\n  },\n\n  isIdentifierContinue: function(ch) {\n    return this.options.isIdentifierContinue ?\n        this.options.isIdentifierContinue(ch, this.codePointAt(ch)) :\n        this.isValidIdentifierContinue(ch);\n  },\n\n  isValidIdentifierContinue: function(ch, cp) {\n    return this.isValidIdentifierStart(ch, cp) || this.isNumber(ch);\n  },\n\n  codePointAt: function(ch) {\n    if (ch.length === 1) return ch.charCodeAt(0);\n    // eslint-disable-next-line no-bitwise\n    return (ch.charCodeAt(0) << 10) + ch.charCodeAt(1) - 0x35FDC00;\n  },\n\n  peekMultichar: function() {\n    var ch = this.text.charAt(this.index);\n    var peek = this.peek();\n    if (!peek) {\n      return ch;\n    }\n    var cp1 = ch.charCodeAt(0);\n    var cp2 = peek.charCodeAt(0);\n    if (cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF) {\n      return ch + peek;\n    }\n    return ch;\n  },\n\n  isExpOperator: function(ch) {\n    return (ch === '-' || ch === '+' || this.isNumber(ch));\n  },\n\n  throwError: function(error, start, end) {\n    end = end || this.index;\n    var colStr = (isDefined(start)\n            ? 's ' + start +  '-' + this.index + ' [' + this.text.substring(start, end) + ']'\n            : ' ' + end);\n    throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',\n        error, colStr, this.text);\n  },\n\n  readNumber: function() {\n    var number = '';\n    var start = this.index;\n    while (this.index < this.text.length) {\n      var ch = lowercase(this.text.charAt(this.index));\n      if (ch === '.' || this.isNumber(ch)) {\n        number += ch;\n      } else {\n        var peekCh = this.peek();\n        if (ch === 'e' && this.isExpOperator(peekCh)) {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            peekCh && this.isNumber(peekCh) &&\n            number.charAt(number.length - 1) === 'e') {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            (!peekCh || !this.isNumber(peekCh)) &&\n            number.charAt(number.length - 1) === 'e') {\n          this.throwError('Invalid exponent');\n        } else {\n          break;\n        }\n      }\n      this.index++;\n    }\n    this.tokens.push({\n      index: start,\n      text: number,\n      constant: true,\n      value: Number(number)\n    });\n  },\n\n  readIdent: function() {\n    var start = this.index;\n    this.index += this.peekMultichar().length;\n    while (this.index < this.text.length) {\n      var ch = this.peekMultichar();\n      if (!this.isIdentifierContinue(ch)) {\n        break;\n      }\n      this.index += ch.length;\n    }\n    this.tokens.push({\n      index: start,\n      text: this.text.slice(start, this.index),\n      identifier: true\n    });\n  },\n\n  readString: function(quote) {\n    var start = this.index;\n    this.index++;\n    var string = '';\n    var rawString = quote;\n    var escape = false;\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      rawString += ch;\n      if (escape) {\n        if (ch === 'u') {\n          var hex = this.text.substring(this.index + 1, this.index + 5);\n          if (!hex.match(/[\\da-f]{4}/i)) {\n            this.throwError('Invalid unicode escape [\\\\u' + hex + ']');\n          }\n          this.index += 4;\n          string += String.fromCharCode(parseInt(hex, 16));\n        } else {\n          var rep = ESCAPE[ch];\n          string = string + (rep || ch);\n        }\n        escape = false;\n      } else if (ch === '\\\\') {\n        escape = true;\n      } else if (ch === quote) {\n        this.index++;\n        this.tokens.push({\n          index: start,\n          text: rawString,\n          constant: true,\n          value: string\n        });\n        return;\n      } else {\n        string += ch;\n      }\n      this.index++;\n    }\n    this.throwError('Unterminated quote', start);\n  }\n};\n\nvar AST = function AST(lexer, options) {\n  this.lexer = lexer;\n  this.options = options;\n};\n\nAST.Program = 'Program';\nAST.ExpressionStatement = 'ExpressionStatement';\nAST.AssignmentExpression = 'AssignmentExpression';\nAST.ConditionalExpression = 'ConditionalExpression';\nAST.LogicalExpression = 'LogicalExpression';\nAST.BinaryExpression = 'BinaryExpression';\nAST.UnaryExpression = 'UnaryExpression';\nAST.CallExpression = 'CallExpression';\nAST.MemberExpression = 'MemberExpression';\nAST.Identifier = 'Identifier';\nAST.Literal = 'Literal';\nAST.ArrayExpression = 'ArrayExpression';\nAST.Property = 'Property';\nAST.ObjectExpression = 'ObjectExpression';\nAST.ThisExpression = 'ThisExpression';\nAST.LocalsExpression = 'LocalsExpression';\n\n// Internal use only\nAST.NGValueParameter = 'NGValueParameter';\n\nAST.prototype = {\n  ast: function(text) {\n    this.text = text;\n    this.tokens = this.lexer.lex(text);\n\n    var value = this.program();\n\n    if (this.tokens.length !== 0) {\n      this.throwError('is an unexpected token', this.tokens[0]);\n    }\n\n    return value;\n  },\n\n  program: function() {\n    var body = [];\n    while (true) {\n      if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))\n        body.push(this.expressionStatement());\n      if (!this.expect(';')) {\n        return { type: AST.Program, body: body};\n      }\n    }\n  },\n\n  expressionStatement: function() {\n    return { type: AST.ExpressionStatement, expression: this.filterChain() };\n  },\n\n  filterChain: function() {\n    var left = this.expression();\n    while (this.expect('|')) {\n      left = this.filter(left);\n    }\n    return left;\n  },\n\n  expression: function() {\n    return this.assignment();\n  },\n\n  assignment: function() {\n    var result = this.ternary();\n    if (this.expect('=')) {\n      if (!isAssignable(result)) {\n        throw $parseMinErr('lval', 'Trying to assign a value to a non l-value');\n      }\n\n      result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='};\n    }\n    return result;\n  },\n\n  ternary: function() {\n    var test = this.logicalOR();\n    var alternate;\n    var consequent;\n    if (this.expect('?')) {\n      alternate = this.expression();\n      if (this.consume(':')) {\n        consequent = this.expression();\n        return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent};\n      }\n    }\n    return test;\n  },\n\n  logicalOR: function() {\n    var left = this.logicalAND();\n    while (this.expect('||')) {\n      left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() };\n    }\n    return left;\n  },\n\n  logicalAND: function() {\n    var left = this.equality();\n    while (this.expect('&&')) {\n      left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()};\n    }\n    return left;\n  },\n\n  equality: function() {\n    var left = this.relational();\n    var token;\n    while ((token = this.expect('==','!=','===','!=='))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() };\n    }\n    return left;\n  },\n\n  relational: function() {\n    var left = this.additive();\n    var token;\n    while ((token = this.expect('<', '>', '<=', '>='))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() };\n    }\n    return left;\n  },\n\n  additive: function() {\n    var left = this.multiplicative();\n    var token;\n    while ((token = this.expect('+','-'))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() };\n    }\n    return left;\n  },\n\n  multiplicative: function() {\n    var left = this.unary();\n    var token;\n    while ((token = this.expect('*','/','%'))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() };\n    }\n    return left;\n  },\n\n  unary: function() {\n    var token;\n    if ((token = this.expect('+', '-', '!'))) {\n      return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() };\n    } else {\n      return this.primary();\n    }\n  },\n\n  primary: function() {\n    var primary;\n    if (this.expect('(')) {\n      primary = this.filterChain();\n      this.consume(')');\n    } else if (this.expect('[')) {\n      primary = this.arrayDeclaration();\n    } else if (this.expect('{')) {\n      primary = this.object();\n    } else if (this.selfReferential.hasOwnProperty(this.peek().text)) {\n      primary = copy(this.selfReferential[this.consume().text]);\n    } else if (this.options.literals.hasOwnProperty(this.peek().text)) {\n      primary = { type: AST.Literal, value: this.options.literals[this.consume().text]};\n    } else if (this.peek().identifier) {\n      primary = this.identifier();\n    } else if (this.peek().constant) {\n      primary = this.constant();\n    } else {\n      this.throwError('not a primary expression', this.peek());\n    }\n\n    var next;\n    while ((next = this.expect('(', '[', '.'))) {\n      if (next.text === '(') {\n        primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() };\n        this.consume(')');\n      } else if (next.text === '[') {\n        primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true };\n        this.consume(']');\n      } else if (next.text === '.') {\n        primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false };\n      } else {\n        this.throwError('IMPOSSIBLE');\n      }\n    }\n    return primary;\n  },\n\n  filter: function(baseExpression) {\n    var args = [baseExpression];\n    var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true};\n\n    while (this.expect(':')) {\n      args.push(this.expression());\n    }\n\n    return result;\n  },\n\n  parseArguments: function() {\n    var args = [];\n    if (this.peekToken().text !== ')') {\n      do {\n        args.push(this.filterChain());\n      } while (this.expect(','));\n    }\n    return args;\n  },\n\n  identifier: function() {\n    var token = this.consume();\n    if (!token.identifier) {\n      this.throwError('is not a valid identifier', token);\n    }\n    return { type: AST.Identifier, name: token.text };\n  },\n\n  constant: function() {\n    // TODO check that it is a constant\n    return { type: AST.Literal, value: this.consume().value };\n  },\n\n  arrayDeclaration: function() {\n    var elements = [];\n    if (this.peekToken().text !== ']') {\n      do {\n        if (this.peek(']')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        elements.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume(']');\n\n    return { type: AST.ArrayExpression, elements: elements };\n  },\n\n  object: function() {\n    var properties = [], property;\n    if (this.peekToken().text !== '}') {\n      do {\n        if (this.peek('}')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        property = {type: AST.Property, kind: 'init'};\n        if (this.peek().constant) {\n          property.key = this.constant();\n          property.computed = false;\n          this.consume(':');\n          property.value = this.expression();\n        } else if (this.peek().identifier) {\n          property.key = this.identifier();\n          property.computed = false;\n          if (this.peek(':')) {\n            this.consume(':');\n            property.value = this.expression();\n          } else {\n            property.value = property.key;\n          }\n        } else if (this.peek('[')) {\n          this.consume('[');\n          property.key = this.expression();\n          this.consume(']');\n          property.computed = true;\n          this.consume(':');\n          property.value = this.expression();\n        } else {\n          this.throwError('invalid key', this.peek());\n        }\n        properties.push(property);\n      } while (this.expect(','));\n    }\n    this.consume('}');\n\n    return {type: AST.ObjectExpression, properties: properties };\n  },\n\n  throwError: function(msg, token) {\n    throw $parseMinErr('syntax',\n        'Syntax Error: Token \\'{0}\\' {1} at column {2} of the expression [{3}] starting at [{4}].',\n          token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));\n  },\n\n  consume: function(e1) {\n    if (this.tokens.length === 0) {\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    }\n\n    var token = this.expect(e1);\n    if (!token) {\n      this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());\n    }\n    return token;\n  },\n\n  peekToken: function() {\n    if (this.tokens.length === 0) {\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    }\n    return this.tokens[0];\n  },\n\n  peek: function(e1, e2, e3, e4) {\n    return this.peekAhead(0, e1, e2, e3, e4);\n  },\n\n  peekAhead: function(i, e1, e2, e3, e4) {\n    if (this.tokens.length > i) {\n      var token = this.tokens[i];\n      var t = token.text;\n      if (t === e1 || t === e2 || t === e3 || t === e4 ||\n          (!e1 && !e2 && !e3 && !e4)) {\n        return token;\n      }\n    }\n    return false;\n  },\n\n  expect: function(e1, e2, e3, e4) {\n    var token = this.peek(e1, e2, e3, e4);\n    if (token) {\n      this.tokens.shift();\n      return token;\n    }\n    return false;\n  },\n\n  selfReferential: {\n    'this': {type: AST.ThisExpression },\n    '$locals': {type: AST.LocalsExpression }\n  }\n};\n\nfunction ifDefined(v, d) {\n  return typeof v !== 'undefined' ? v : d;\n}\n\nfunction plusFn(l, r) {\n  if (typeof l === 'undefined') return r;\n  if (typeof r === 'undefined') return l;\n  return l + r;\n}\n\nfunction isStateless($filter, filterName) {\n  var fn = $filter(filterName);\n  return !fn.$stateful;\n}\n\nvar PURITY_ABSOLUTE = 1;\nvar PURITY_RELATIVE = 2;\n\n// Detect nodes which could depend on non-shallow state of objects\nfunction isPure(node, parentIsPure) {\n  switch (node.type) {\n    // Computed members might invoke a stateful toString()\n    case AST.MemberExpression:\n      if (node.computed) {\n        return false;\n      }\n      break;\n\n    // Unary always convert to primative\n    case AST.UnaryExpression:\n      return PURITY_ABSOLUTE;\n\n    // The binary + operator can invoke a stateful toString().\n    case AST.BinaryExpression:\n      return node.operator !== '+' ? PURITY_ABSOLUTE : false;\n\n    // Functions / filters probably read state from within objects\n    case AST.CallExpression:\n      return false;\n  }\n\n  return (undefined === parentIsPure) ? PURITY_RELATIVE : parentIsPure;\n}\n\nfunction findConstantAndWatchExpressions(ast, $filter, parentIsPure) {\n  var allConstants;\n  var argsToWatch;\n  var isStatelessFilter;\n\n  var astIsPure = ast.isPure = isPure(ast, parentIsPure);\n\n  switch (ast.type) {\n  case AST.Program:\n    allConstants = true;\n    forEach(ast.body, function(expr) {\n      findConstantAndWatchExpressions(expr.expression, $filter, astIsPure);\n      allConstants = allConstants && expr.expression.constant;\n    });\n    ast.constant = allConstants;\n    break;\n  case AST.Literal:\n    ast.constant = true;\n    ast.toWatch = [];\n    break;\n  case AST.UnaryExpression:\n    findConstantAndWatchExpressions(ast.argument, $filter, astIsPure);\n    ast.constant = ast.argument.constant;\n    ast.toWatch = ast.argument.toWatch;\n    break;\n  case AST.BinaryExpression:\n    findConstantAndWatchExpressions(ast.left, $filter, astIsPure);\n    findConstantAndWatchExpressions(ast.right, $filter, astIsPure);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch);\n    break;\n  case AST.LogicalExpression:\n    findConstantAndWatchExpressions(ast.left, $filter, astIsPure);\n    findConstantAndWatchExpressions(ast.right, $filter, astIsPure);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = ast.constant ? [] : [ast];\n    break;\n  case AST.ConditionalExpression:\n    findConstantAndWatchExpressions(ast.test, $filter, astIsPure);\n    findConstantAndWatchExpressions(ast.alternate, $filter, astIsPure);\n    findConstantAndWatchExpressions(ast.consequent, $filter, astIsPure);\n    ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant;\n    ast.toWatch = ast.constant ? [] : [ast];\n    break;\n  case AST.Identifier:\n    ast.constant = false;\n    ast.toWatch = [ast];\n    break;\n  case AST.MemberExpression:\n    findConstantAndWatchExpressions(ast.object, $filter, astIsPure);\n    if (ast.computed) {\n      findConstantAndWatchExpressions(ast.property, $filter, astIsPure);\n    }\n    ast.constant = ast.object.constant && (!ast.computed || ast.property.constant);\n    ast.toWatch = ast.constant ? [] : [ast];\n    break;\n  case AST.CallExpression:\n    isStatelessFilter = ast.filter ? isStateless($filter, ast.callee.name) : false;\n    allConstants = isStatelessFilter;\n    argsToWatch = [];\n    forEach(ast.arguments, function(expr) {\n      findConstantAndWatchExpressions(expr, $filter, astIsPure);\n      allConstants = allConstants && expr.constant;\n      argsToWatch.push.apply(argsToWatch, expr.toWatch);\n    });\n    ast.constant = allConstants;\n    ast.toWatch = isStatelessFilter ? argsToWatch : [ast];\n    break;\n  case AST.AssignmentExpression:\n    findConstantAndWatchExpressions(ast.left, $filter, astIsPure);\n    findConstantAndWatchExpressions(ast.right, $filter, astIsPure);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = [ast];\n    break;\n  case AST.ArrayExpression:\n    allConstants = true;\n    argsToWatch = [];\n    forEach(ast.elements, function(expr) {\n      findConstantAndWatchExpressions(expr, $filter, astIsPure);\n      allConstants = allConstants && expr.constant;\n      argsToWatch.push.apply(argsToWatch, expr.toWatch);\n    });\n    ast.constant = allConstants;\n    ast.toWatch = argsToWatch;\n    break;\n  case AST.ObjectExpression:\n    allConstants = true;\n    argsToWatch = [];\n    forEach(ast.properties, function(property) {\n      findConstantAndWatchExpressions(property.value, $filter, astIsPure);\n      allConstants = allConstants && property.value.constant;\n      argsToWatch.push.apply(argsToWatch, property.value.toWatch);\n      if (property.computed) {\n        //`{[key]: value}` implicitly does `key.toString()` which may be non-pure\n        findConstantAndWatchExpressions(property.key, $filter, /*parentIsPure=*/false);\n        allConstants = allConstants && property.key.constant;\n        argsToWatch.push.apply(argsToWatch, property.key.toWatch);\n      }\n    });\n    ast.constant = allConstants;\n    ast.toWatch = argsToWatch;\n    break;\n  case AST.ThisExpression:\n    ast.constant = false;\n    ast.toWatch = [];\n    break;\n  case AST.LocalsExpression:\n    ast.constant = false;\n    ast.toWatch = [];\n    break;\n  }\n}\n\nfunction getInputs(body) {\n  if (body.length !== 1) return;\n  var lastExpression = body[0].expression;\n  var candidate = lastExpression.toWatch;\n  if (candidate.length !== 1) return candidate;\n  return candidate[0] !== lastExpression ? candidate : undefined;\n}\n\nfunction isAssignable(ast) {\n  return ast.type === AST.Identifier || ast.type === AST.MemberExpression;\n}\n\nfunction assignableAST(ast) {\n  if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) {\n    return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='};\n  }\n}\n\nfunction isLiteral(ast) {\n  return ast.body.length === 0 ||\n      ast.body.length === 1 && (\n      ast.body[0].expression.type === AST.Literal ||\n      ast.body[0].expression.type === AST.ArrayExpression ||\n      ast.body[0].expression.type === AST.ObjectExpression);\n}\n\nfunction isConstant(ast) {\n  return ast.constant;\n}\n\nfunction ASTCompiler($filter) {\n  this.$filter = $filter;\n}\n\nASTCompiler.prototype = {\n  compile: function(ast) {\n    var self = this;\n    this.state = {\n      nextId: 0,\n      filters: {},\n      fn: {vars: [], body: [], own: {}},\n      assign: {vars: [], body: [], own: {}},\n      inputs: []\n    };\n    findConstantAndWatchExpressions(ast, self.$filter);\n    var extra = '';\n    var assignable;\n    this.stage = 'assign';\n    if ((assignable = assignableAST(ast))) {\n      this.state.computing = 'assign';\n      var result = this.nextId();\n      this.recurse(assignable, result);\n      this.return_(result);\n      extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l');\n    }\n    var toWatch = getInputs(ast.body);\n    self.stage = 'inputs';\n    forEach(toWatch, function(watch, key) {\n      var fnKey = 'fn' + key;\n      self.state[fnKey] = {vars: [], body: [], own: {}};\n      self.state.computing = fnKey;\n      var intoId = self.nextId();\n      self.recurse(watch, intoId);\n      self.return_(intoId);\n      self.state.inputs.push({name: fnKey, isPure: watch.isPure});\n      watch.watchId = key;\n    });\n    this.state.computing = 'fn';\n    this.stage = 'main';\n    this.recurse(ast);\n    var fnString =\n      // The build and minification steps remove the string \"use strict\" from the code, but this is done using a regex.\n      // This is a workaround for this until we do a better job at only removing the prefix only when we should.\n      '\"' + this.USE + ' ' + this.STRICT + '\";\\n' +\n      this.filterPrefix() +\n      'var fn=' + this.generateFunction('fn', 's,l,a,i') +\n      extra +\n      this.watchFns() +\n      'return fn;';\n\n    // eslint-disable-next-line no-new-func\n    var fn = (new Function('$filter',\n        'getStringValue',\n        'ifDefined',\n        'plus',\n        fnString))(\n          this.$filter,\n          getStringValue,\n          ifDefined,\n          plusFn);\n    this.state = this.stage = undefined;\n    return fn;\n  },\n\n  USE: 'use',\n\n  STRICT: 'strict',\n\n  watchFns: function() {\n    var result = [];\n    var inputs = this.state.inputs;\n    var self = this;\n    forEach(inputs, function(input) {\n      result.push('var ' + input.name + '=' + self.generateFunction(input.name, 's'));\n      if (input.isPure) {\n        result.push(input.name, '.isPure=' + JSON.stringify(input.isPure) + ';');\n      }\n    });\n    if (inputs.length) {\n      result.push('fn.inputs=[' + inputs.map(function(i) { return i.name; }).join(',') + '];');\n    }\n    return result.join('');\n  },\n\n  generateFunction: function(name, params) {\n    return 'function(' + params + '){' +\n        this.varsPrefix(name) +\n        this.body(name) +\n        '};';\n  },\n\n  filterPrefix: function() {\n    var parts = [];\n    var self = this;\n    forEach(this.state.filters, function(id, filter) {\n      parts.push(id + '=$filter(' + self.escape(filter) + ')');\n    });\n    if (parts.length) return 'var ' + parts.join(',') + ';';\n    return '';\n  },\n\n  varsPrefix: function(section) {\n    return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : '';\n  },\n\n  body: function(section) {\n    return this.state[section].body.join('');\n  },\n\n  recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {\n    var left, right, self = this, args, expression, computed;\n    recursionFn = recursionFn || noop;\n    if (!skipWatchIdCheck && isDefined(ast.watchId)) {\n      intoId = intoId || this.nextId();\n      this.if_('i',\n        this.lazyAssign(intoId, this.computedMember('i', ast.watchId)),\n        this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true)\n      );\n      return;\n    }\n    switch (ast.type) {\n    case AST.Program:\n      forEach(ast.body, function(expression, pos) {\n        self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; });\n        if (pos !== ast.body.length - 1) {\n          self.current().body.push(right, ';');\n        } else {\n          self.return_(right);\n        }\n      });\n      break;\n    case AST.Literal:\n      expression = this.escape(ast.value);\n      this.assign(intoId, expression);\n      recursionFn(intoId || expression);\n      break;\n    case AST.UnaryExpression:\n      this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; });\n      expression = ast.operator + '(' + this.ifDefined(right, 0) + ')';\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.BinaryExpression:\n      this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; });\n      this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; });\n      if (ast.operator === '+') {\n        expression = this.plus(left, right);\n      } else if (ast.operator === '-') {\n        expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0);\n      } else {\n        expression = '(' + left + ')' + ast.operator + '(' + right + ')';\n      }\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.LogicalExpression:\n      intoId = intoId || this.nextId();\n      self.recurse(ast.left, intoId);\n      self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId));\n      recursionFn(intoId);\n      break;\n    case AST.ConditionalExpression:\n      intoId = intoId || this.nextId();\n      self.recurse(ast.test, intoId);\n      self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId));\n      recursionFn(intoId);\n      break;\n    case AST.Identifier:\n      intoId = intoId || this.nextId();\n      if (nameId) {\n        nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s');\n        nameId.computed = false;\n        nameId.name = ast.name;\n      }\n      self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)),\n        function() {\n          self.if_(self.stage === 'inputs' || 's', function() {\n            if (create && create !== 1) {\n              self.if_(\n                self.isNull(self.nonComputedMember('s', ast.name)),\n                self.lazyAssign(self.nonComputedMember('s', ast.name), '{}'));\n            }\n            self.assign(intoId, self.nonComputedMember('s', ast.name));\n          });\n        }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name))\n        );\n      recursionFn(intoId);\n      break;\n    case AST.MemberExpression:\n      left = nameId && (nameId.context = this.nextId()) || this.nextId();\n      intoId = intoId || this.nextId();\n      self.recurse(ast.object, left, undefined, function() {\n        self.if_(self.notNull(left), function() {\n          if (ast.computed) {\n            right = self.nextId();\n            self.recurse(ast.property, right);\n            self.getStringValue(right);\n            if (create && create !== 1) {\n              self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}'));\n            }\n            expression = self.computedMember(left, right);\n            self.assign(intoId, expression);\n            if (nameId) {\n              nameId.computed = true;\n              nameId.name = right;\n            }\n          } else {\n            if (create && create !== 1) {\n              self.if_(self.isNull(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}'));\n            }\n            expression = self.nonComputedMember(left, ast.property.name);\n            self.assign(intoId, expression);\n            if (nameId) {\n              nameId.computed = false;\n              nameId.name = ast.property.name;\n            }\n          }\n        }, function() {\n          self.assign(intoId, 'undefined');\n        });\n        recursionFn(intoId);\n      }, !!create);\n      break;\n    case AST.CallExpression:\n      intoId = intoId || this.nextId();\n      if (ast.filter) {\n        right = self.filter(ast.callee.name);\n        args = [];\n        forEach(ast.arguments, function(expr) {\n          var argument = self.nextId();\n          self.recurse(expr, argument);\n          args.push(argument);\n        });\n        expression = right + '(' + args.join(',') + ')';\n        self.assign(intoId, expression);\n        recursionFn(intoId);\n      } else {\n        right = self.nextId();\n        left = {};\n        args = [];\n        self.recurse(ast.callee, right, left, function() {\n          self.if_(self.notNull(right), function() {\n            forEach(ast.arguments, function(expr) {\n              self.recurse(expr, ast.constant ? undefined : self.nextId(), undefined, function(argument) {\n                args.push(argument);\n              });\n            });\n            if (left.name) {\n              expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')';\n            } else {\n              expression = right + '(' + args.join(',') + ')';\n            }\n            self.assign(intoId, expression);\n          }, function() {\n            self.assign(intoId, 'undefined');\n          });\n          recursionFn(intoId);\n        });\n      }\n      break;\n    case AST.AssignmentExpression:\n      right = this.nextId();\n      left = {};\n      this.recurse(ast.left, undefined, left, function() {\n        self.if_(self.notNull(left.context), function() {\n          self.recurse(ast.right, right);\n          expression = self.member(left.context, left.name, left.computed) + ast.operator + right;\n          self.assign(intoId, expression);\n          recursionFn(intoId || expression);\n        });\n      }, 1);\n      break;\n    case AST.ArrayExpression:\n      args = [];\n      forEach(ast.elements, function(expr) {\n        self.recurse(expr, ast.constant ? undefined : self.nextId(), undefined, function(argument) {\n          args.push(argument);\n        });\n      });\n      expression = '[' + args.join(',') + ']';\n      this.assign(intoId, expression);\n      recursionFn(intoId || expression);\n      break;\n    case AST.ObjectExpression:\n      args = [];\n      computed = false;\n      forEach(ast.properties, function(property) {\n        if (property.computed) {\n          computed = true;\n        }\n      });\n      if (computed) {\n        intoId = intoId || this.nextId();\n        this.assign(intoId, '{}');\n        forEach(ast.properties, function(property) {\n          if (property.computed) {\n            left = self.nextId();\n            self.recurse(property.key, left);\n          } else {\n            left = property.key.type === AST.Identifier ?\n                       property.key.name :\n                       ('' + property.key.value);\n          }\n          right = self.nextId();\n          self.recurse(property.value, right);\n          self.assign(self.member(intoId, left, property.computed), right);\n        });\n      } else {\n        forEach(ast.properties, function(property) {\n          self.recurse(property.value, ast.constant ? undefined : self.nextId(), undefined, function(expr) {\n            args.push(self.escape(\n                property.key.type === AST.Identifier ? property.key.name :\n                  ('' + property.key.value)) +\n                ':' + expr);\n          });\n        });\n        expression = '{' + args.join(',') + '}';\n        this.assign(intoId, expression);\n      }\n      recursionFn(intoId || expression);\n      break;\n    case AST.ThisExpression:\n      this.assign(intoId, 's');\n      recursionFn(intoId || 's');\n      break;\n    case AST.LocalsExpression:\n      this.assign(intoId, 'l');\n      recursionFn(intoId || 'l');\n      break;\n    case AST.NGValueParameter:\n      this.assign(intoId, 'v');\n      recursionFn(intoId || 'v');\n      break;\n    }\n  },\n\n  getHasOwnProperty: function(element, property) {\n    var key = element + '.' + property;\n    var own = this.current().own;\n    if (!own.hasOwnProperty(key)) {\n      own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')');\n    }\n    return own[key];\n  },\n\n  assign: function(id, value) {\n    if (!id) return;\n    this.current().body.push(id, '=', value, ';');\n    return id;\n  },\n\n  filter: function(filterName) {\n    if (!this.state.filters.hasOwnProperty(filterName)) {\n      this.state.filters[filterName] = this.nextId(true);\n    }\n    return this.state.filters[filterName];\n  },\n\n  ifDefined: function(id, defaultValue) {\n    return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')';\n  },\n\n  plus: function(left, right) {\n    return 'plus(' + left + ',' + right + ')';\n  },\n\n  return_: function(id) {\n    this.current().body.push('return ', id, ';');\n  },\n\n  if_: function(test, alternate, consequent) {\n    if (test === true) {\n      alternate();\n    } else {\n      var body = this.current().body;\n      body.push('if(', test, '){');\n      alternate();\n      body.push('}');\n      if (consequent) {\n        body.push('else{');\n        consequent();\n        body.push('}');\n      }\n    }\n  },\n\n  not: function(expression) {\n    return '!(' + expression + ')';\n  },\n\n  isNull: function(expression) {\n    return expression + '==null';\n  },\n\n  notNull: function(expression) {\n    return expression + '!=null';\n  },\n\n  nonComputedMember: function(left, right) {\n    var SAFE_IDENTIFIER = /^[$_a-zA-Z][$_a-zA-Z0-9]*$/;\n    var UNSAFE_CHARACTERS = /[^$_a-zA-Z0-9]/g;\n    if (SAFE_IDENTIFIER.test(right)) {\n      return left + '.' + right;\n    } else {\n      return left  + '[\"' + right.replace(UNSAFE_CHARACTERS, this.stringEscapeFn) + '\"]';\n    }\n  },\n\n  computedMember: function(left, right) {\n    return left + '[' + right + ']';\n  },\n\n  member: function(left, right, computed) {\n    if (computed) return this.computedMember(left, right);\n    return this.nonComputedMember(left, right);\n  },\n\n  getStringValue: function(item) {\n    this.assign(item, 'getStringValue(' + item + ')');\n  },\n\n  lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {\n    var self = this;\n    return function() {\n      self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck);\n    };\n  },\n\n  lazyAssign: function(id, value) {\n    var self = this;\n    return function() {\n      self.assign(id, value);\n    };\n  },\n\n  stringEscapeRegex: /[^ a-zA-Z0-9]/g,\n\n  stringEscapeFn: function(c) {\n    return '\\\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4);\n  },\n\n  escape: function(value) {\n    if (isString(value)) return '\\'' + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + '\\'';\n    if (isNumber(value)) return value.toString();\n    if (value === true) return 'true';\n    if (value === false) return 'false';\n    if (value === null) return 'null';\n    if (typeof value === 'undefined') return 'undefined';\n\n    throw $parseMinErr('esc', 'IMPOSSIBLE');\n  },\n\n  nextId: function(skip, init) {\n    var id = 'v' + (this.state.nextId++);\n    if (!skip) {\n      this.current().vars.push(id + (init ? '=' + init : ''));\n    }\n    return id;\n  },\n\n  current: function() {\n    return this.state[this.state.computing];\n  }\n};\n\n\nfunction ASTInterpreter($filter) {\n  this.$filter = $filter;\n}\n\nASTInterpreter.prototype = {\n  compile: function(ast) {\n    var self = this;\n    findConstantAndWatchExpressions(ast, self.$filter);\n    var assignable;\n    var assign;\n    if ((assignable = assignableAST(ast))) {\n      assign = this.recurse(assignable);\n    }\n    var toWatch = getInputs(ast.body);\n    var inputs;\n    if (toWatch) {\n      inputs = [];\n      forEach(toWatch, function(watch, key) {\n        var input = self.recurse(watch);\n        input.isPure = watch.isPure;\n        watch.input = input;\n        inputs.push(input);\n        watch.watchId = key;\n      });\n    }\n    var expressions = [];\n    forEach(ast.body, function(expression) {\n      expressions.push(self.recurse(expression.expression));\n    });\n    var fn = ast.body.length === 0 ? noop :\n             ast.body.length === 1 ? expressions[0] :\n             function(scope, locals) {\n               var lastValue;\n               forEach(expressions, function(exp) {\n                 lastValue = exp(scope, locals);\n               });\n               return lastValue;\n             };\n    if (assign) {\n      fn.assign = function(scope, value, locals) {\n        return assign(scope, locals, value);\n      };\n    }\n    if (inputs) {\n      fn.inputs = inputs;\n    }\n    return fn;\n  },\n\n  recurse: function(ast, context, create) {\n    var left, right, self = this, args;\n    if (ast.input) {\n      return this.inputs(ast.input, ast.watchId);\n    }\n    switch (ast.type) {\n    case AST.Literal:\n      return this.value(ast.value, context);\n    case AST.UnaryExpression:\n      right = this.recurse(ast.argument);\n      return this['unary' + ast.operator](right, context);\n    case AST.BinaryExpression:\n      left = this.recurse(ast.left);\n      right = this.recurse(ast.right);\n      return this['binary' + ast.operator](left, right, context);\n    case AST.LogicalExpression:\n      left = this.recurse(ast.left);\n      right = this.recurse(ast.right);\n      return this['binary' + ast.operator](left, right, context);\n    case AST.ConditionalExpression:\n      return this['ternary?:'](\n        this.recurse(ast.test),\n        this.recurse(ast.alternate),\n        this.recurse(ast.consequent),\n        context\n      );\n    case AST.Identifier:\n      return self.identifier(ast.name, context, create);\n    case AST.MemberExpression:\n      left = this.recurse(ast.object, false, !!create);\n      if (!ast.computed) {\n        right = ast.property.name;\n      }\n      if (ast.computed) right = this.recurse(ast.property);\n      return ast.computed ?\n        this.computedMember(left, right, context, create) :\n        this.nonComputedMember(left, right, context, create);\n    case AST.CallExpression:\n      args = [];\n      forEach(ast.arguments, function(expr) {\n        args.push(self.recurse(expr));\n      });\n      if (ast.filter) right = this.$filter(ast.callee.name);\n      if (!ast.filter) right = this.recurse(ast.callee, true);\n      return ast.filter ?\n        function(scope, locals, assign, inputs) {\n          var values = [];\n          for (var i = 0; i < args.length; ++i) {\n            values.push(args[i](scope, locals, assign, inputs));\n          }\n          var value = right.apply(undefined, values, inputs);\n          return context ? {context: undefined, name: undefined, value: value} : value;\n        } :\n        function(scope, locals, assign, inputs) {\n          var rhs = right(scope, locals, assign, inputs);\n          var value;\n          if (rhs.value != null) {\n            var values = [];\n            for (var i = 0; i < args.length; ++i) {\n              values.push(args[i](scope, locals, assign, inputs));\n            }\n            value = rhs.value.apply(rhs.context, values);\n          }\n          return context ? {value: value} : value;\n        };\n    case AST.AssignmentExpression:\n      left = this.recurse(ast.left, true, 1);\n      right = this.recurse(ast.right);\n      return function(scope, locals, assign, inputs) {\n        var lhs = left(scope, locals, assign, inputs);\n        var rhs = right(scope, locals, assign, inputs);\n        lhs.context[lhs.name] = rhs;\n        return context ? {value: rhs} : rhs;\n      };\n    case AST.ArrayExpression:\n      args = [];\n      forEach(ast.elements, function(expr) {\n        args.push(self.recurse(expr));\n      });\n      return function(scope, locals, assign, inputs) {\n        var value = [];\n        for (var i = 0; i < args.length; ++i) {\n          value.push(args[i](scope, locals, assign, inputs));\n        }\n        return context ? {value: value} : value;\n      };\n    case AST.ObjectExpression:\n      args = [];\n      forEach(ast.properties, function(property) {\n        if (property.computed) {\n          args.push({key: self.recurse(property.key),\n                     computed: true,\n                     value: self.recurse(property.value)\n          });\n        } else {\n          args.push({key: property.key.type === AST.Identifier ?\n                          property.key.name :\n                          ('' + property.key.value),\n                     computed: false,\n                     value: self.recurse(property.value)\n          });\n        }\n      });\n      return function(scope, locals, assign, inputs) {\n        var value = {};\n        for (var i = 0; i < args.length; ++i) {\n          if (args[i].computed) {\n            value[args[i].key(scope, locals, assign, inputs)] = args[i].value(scope, locals, assign, inputs);\n          } else {\n            value[args[i].key] = args[i].value(scope, locals, assign, inputs);\n          }\n        }\n        return context ? {value: value} : value;\n      };\n    case AST.ThisExpression:\n      return function(scope) {\n        return context ? {value: scope} : scope;\n      };\n    case AST.LocalsExpression:\n      return function(scope, locals) {\n        return context ? {value: locals} : locals;\n      };\n    case AST.NGValueParameter:\n      return function(scope, locals, assign) {\n        return context ? {value: assign} : assign;\n      };\n    }\n  },\n\n  'unary+': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = argument(scope, locals, assign, inputs);\n      if (isDefined(arg)) {\n        arg = +arg;\n      } else {\n        arg = 0;\n      }\n      return context ? {value: arg} : arg;\n    };\n  },\n  'unary-': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = argument(scope, locals, assign, inputs);\n      if (isDefined(arg)) {\n        arg = -arg;\n      } else {\n        arg = -0;\n      }\n      return context ? {value: arg} : arg;\n    };\n  },\n  'unary!': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = !argument(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary+': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs = right(scope, locals, assign, inputs);\n      var arg = plusFn(lhs, rhs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary-': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs = right(scope, locals, assign, inputs);\n      var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary*': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary/': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary%': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary===': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary!==': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary==': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      // eslint-disable-next-line eqeqeq\n      var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary!=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      // eslint-disable-next-line eqeqeq\n      var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary<': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary>': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary<=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary>=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary&&': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary||': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'ternary?:': function(test, alternate, consequent, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  value: function(value, context) {\n    return function() { return context ? {context: undefined, name: undefined, value: value} : value; };\n  },\n  identifier: function(name, context, create) {\n    return function(scope, locals, assign, inputs) {\n      var base = locals && (name in locals) ? locals : scope;\n      if (create && create !== 1 && base && base[name] == null) {\n        base[name] = {};\n      }\n      var value = base ? base[name] : undefined;\n      if (context) {\n        return {context: base, name: name, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  computedMember: function(left, right, context, create) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs;\n      var value;\n      if (lhs != null) {\n        rhs = right(scope, locals, assign, inputs);\n        rhs = getStringValue(rhs);\n        if (create && create !== 1) {\n          if (lhs && !(lhs[rhs])) {\n            lhs[rhs] = {};\n          }\n        }\n        value = lhs[rhs];\n      }\n      if (context) {\n        return {context: lhs, name: rhs, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  nonComputedMember: function(left, right, context, create) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      if (create && create !== 1) {\n        if (lhs && lhs[right] == null) {\n          lhs[right] = {};\n        }\n      }\n      var value = lhs != null ? lhs[right] : undefined;\n      if (context) {\n        return {context: lhs, name: right, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  inputs: function(input, watchId) {\n    return function(scope, value, locals, inputs) {\n      if (inputs) return inputs[watchId];\n      return input(scope, value, locals);\n    };\n  }\n};\n\n/**\n * @constructor\n */\nfunction Parser(lexer, $filter, options) {\n  this.ast = new AST(lexer, options);\n  this.astCompiler = options.csp ? new ASTInterpreter($filter) :\n                                   new ASTCompiler($filter);\n}\n\nParser.prototype = {\n  constructor: Parser,\n\n  parse: function(text) {\n    var ast = this.getAst(text);\n    var fn = this.astCompiler.compile(ast.ast);\n    fn.literal = isLiteral(ast.ast);\n    fn.constant = isConstant(ast.ast);\n    fn.oneTime = ast.oneTime;\n    return fn;\n  },\n\n  getAst: function(exp) {\n    var oneTime = false;\n    exp = exp.trim();\n\n    if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {\n      oneTime = true;\n      exp = exp.substring(2);\n    }\n    return {\n      ast: this.ast.ast(exp),\n      oneTime: oneTime\n    };\n  }\n};\n\nfunction getValueOf(value) {\n  return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value);\n}\n\n///////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $parse\n * @kind function\n *\n * @description\n *\n * Converts AngularJS {@link guide/expression expression} into a function.\n *\n * ```js\n *   var getter = $parse('user.name');\n *   var setter = getter.assign;\n *   var context = {user:{name:'AngularJS'}};\n *   var locals = {user:{name:'local'}};\n *\n *   expect(getter(context)).toEqual('AngularJS');\n *   setter(context, 'newValue');\n *   expect(context.user.name).toEqual('newValue');\n *   expect(getter(context, locals)).toEqual('local');\n * ```\n *\n *\n * @param {string} expression String expression to compile.\n * @returns {function(context, locals)} a function which represents the compiled expression:\n *\n *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n *      are evaluated against (typically a scope object).\n *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n *      `context`.\n *\n *    The returned function also has the following properties:\n *      * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript\n *        literal.\n *      * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript\n *        constant literals.\n *      * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be\n *        set to a function to change its value on the given context.\n *\n */\n\n\n/**\n * @ngdoc provider\n * @name $parseProvider\n * @this\n *\n * @description\n * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}\n *  service.\n */\nfunction $ParseProvider() {\n  var cache = createMap();\n  var literals = {\n    'true': true,\n    'false': false,\n    'null': null,\n    'undefined': undefined\n  };\n  var identStart, identContinue;\n\n  /**\n   * @ngdoc method\n   * @name $parseProvider#addLiteral\n   * @description\n   *\n   * Configure $parse service to add literal values that will be present as literal at expressions.\n   *\n   * @param {string} literalName Token for the literal value. The literal name value must be a valid literal name.\n   * @param {*} literalValue Value for this literal. All literal values must be primitives or `undefined`.\n   *\n   **/\n  this.addLiteral = function(literalName, literalValue) {\n    literals[literalName] = literalValue;\n  };\n\n /**\n  * @ngdoc method\n  * @name $parseProvider#setIdentifierFns\n  *\n  * @description\n  *\n  * Allows defining the set of characters that are allowed in AngularJS expressions. The function\n  * `identifierStart` will get called to know if a given character is a valid character to be the\n  * first character for an identifier. The function `identifierContinue` will get called to know if\n  * a given character is a valid character to be a follow-up identifier character. The functions\n  * `identifierStart` and `identifierContinue` will receive as arguments the single character to be\n  * identifier and the character code point. These arguments will be `string` and `numeric`. Keep in\n  * mind that the `string` parameter can be two characters long depending on the character\n  * representation. It is expected for the function to return `true` or `false`, whether that\n  * character is allowed or not.\n  *\n  * Since this function will be called extensively, keep the implementation of these functions fast,\n  * as the performance of these functions have a direct impact on the expressions parsing speed.\n  *\n  * @param {function=} identifierStart The function that will decide whether the given character is\n  *   a valid identifier start character.\n  * @param {function=} identifierContinue The function that will decide whether the given character is\n  *   a valid identifier continue character.\n  */\n  this.setIdentifierFns = function(identifierStart, identifierContinue) {\n    identStart = identifierStart;\n    identContinue = identifierContinue;\n    return this;\n  };\n\n  this.$get = ['$filter', function($filter) {\n    var noUnsafeEval = csp().noUnsafeEval;\n    var $parseOptions = {\n          csp: noUnsafeEval,\n          literals: copy(literals),\n          isIdentifierStart: isFunction(identStart) && identStart,\n          isIdentifierContinue: isFunction(identContinue) && identContinue\n        };\n    $parse.$$getAst = $$getAst;\n    return $parse;\n\n    function $parse(exp, interceptorFn) {\n      var parsedExpression, cacheKey;\n\n      switch (typeof exp) {\n        case 'string':\n          exp = exp.trim();\n          cacheKey = exp;\n\n          parsedExpression = cache[cacheKey];\n\n          if (!parsedExpression) {\n            var lexer = new Lexer($parseOptions);\n            var parser = new Parser(lexer, $filter, $parseOptions);\n            parsedExpression = parser.parse(exp);\n\n            cache[cacheKey] = addWatchDelegate(parsedExpression);\n          }\n          return addInterceptor(parsedExpression, interceptorFn);\n\n        case 'function':\n          return addInterceptor(exp, interceptorFn);\n\n        default:\n          return addInterceptor(noop, interceptorFn);\n      }\n    }\n\n    function $$getAst(exp) {\n      var lexer = new Lexer($parseOptions);\n      var parser = new Parser(lexer, $filter, $parseOptions);\n      return parser.getAst(exp).ast;\n    }\n\n    function expressionInputDirtyCheck(newValue, oldValueOfValue, compareObjectIdentity) {\n\n      if (newValue == null || oldValueOfValue == null) { // null/undefined\n        return newValue === oldValueOfValue;\n      }\n\n      if (typeof newValue === 'object') {\n\n        // attempt to convert the value to a primitive type\n        // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can\n        //             be cheaply dirty-checked\n        newValue = getValueOf(newValue);\n\n        if (typeof newValue === 'object' && !compareObjectIdentity) {\n          // objects/arrays are not supported - deep-watching them would be too expensive\n          return false;\n        }\n\n        // fall-through to the primitive equality check\n      }\n\n      //Primitive or NaN\n      // eslint-disable-next-line no-self-compare\n      return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue);\n    }\n\n    function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) {\n      var inputExpressions = parsedExpression.inputs;\n      var lastResult;\n\n      if (inputExpressions.length === 1) {\n        var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails\n        inputExpressions = inputExpressions[0];\n        return scope.$watch(function expressionInputWatch(scope) {\n          var newInputValue = inputExpressions(scope);\n          if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf, inputExpressions.isPure)) {\n            lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]);\n            oldInputValueOf = newInputValue && getValueOf(newInputValue);\n          }\n          return lastResult;\n        }, listener, objectEquality, prettyPrintExpression);\n      }\n\n      var oldInputValueOfValues = [];\n      var oldInputValues = [];\n      for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n        oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails\n        oldInputValues[i] = null;\n      }\n\n      return scope.$watch(function expressionInputsWatch(scope) {\n        var changed = false;\n\n        for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n          var newInputValue = inputExpressions[i](scope);\n          if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i], inputExpressions[i].isPure))) {\n            oldInputValues[i] = newInputValue;\n            oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue);\n          }\n        }\n\n        if (changed) {\n          lastResult = parsedExpression(scope, undefined, undefined, oldInputValues);\n        }\n\n        return lastResult;\n      }, listener, objectEquality, prettyPrintExpression);\n    }\n\n    function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) {\n      var isDone = parsedExpression.literal ? isAllDefined : isDefined;\n      var unwatch, lastValue;\n\n      var exp = parsedExpression.$$intercepted || parsedExpression;\n      var post = parsedExpression.$$interceptor || identity;\n\n      var useInputs = parsedExpression.inputs && !exp.inputs;\n\n      // Propogate the literal/inputs/constant attributes\n      // ... but not oneTime since we are handling it\n      oneTimeWatch.literal = parsedExpression.literal;\n      oneTimeWatch.constant = parsedExpression.constant;\n      oneTimeWatch.inputs = parsedExpression.inputs;\n\n      // Allow other delegates to run on this wrapped expression\n      addWatchDelegate(oneTimeWatch);\n\n      unwatch = scope.$watch(oneTimeWatch, listener, objectEquality, prettyPrintExpression);\n\n      return unwatch;\n\n      function unwatchIfDone() {\n        if (isDone(lastValue)) {\n          unwatch();\n        }\n      }\n\n      function oneTimeWatch(scope, locals, assign, inputs) {\n        lastValue = useInputs && inputs ? inputs[0] : exp(scope, locals, assign, inputs);\n        if (isDone(lastValue)) {\n          scope.$$postDigest(unwatchIfDone);\n        }\n        return post(lastValue);\n      }\n    }\n\n    function isAllDefined(value) {\n      var allDefined = true;\n      forEach(value, function(val) {\n        if (!isDefined(val)) allDefined = false;\n      });\n      return allDefined;\n    }\n\n    function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch = scope.$watch(function constantWatch(scope) {\n        unwatch();\n        return parsedExpression(scope);\n      }, listener, objectEquality);\n      return unwatch;\n    }\n\n    function addWatchDelegate(parsedExpression) {\n      if (parsedExpression.constant) {\n        parsedExpression.$$watchDelegate = constantWatchDelegate;\n      } else if (parsedExpression.oneTime) {\n        parsedExpression.$$watchDelegate = oneTimeWatchDelegate;\n      } else if (parsedExpression.inputs) {\n        parsedExpression.$$watchDelegate = inputsWatchDelegate;\n      }\n\n      return parsedExpression;\n    }\n\n    function chainInterceptors(first, second) {\n      function chainedInterceptor(value) {\n        return second(first(value));\n      }\n      chainedInterceptor.$stateful = first.$stateful || second.$stateful;\n      chainedInterceptor.$$pure = first.$$pure && second.$$pure;\n\n      return chainedInterceptor;\n    }\n\n    function addInterceptor(parsedExpression, interceptorFn) {\n      if (!interceptorFn) return parsedExpression;\n\n      // Extract any existing interceptors out of the parsedExpression\n      // to ensure the original parsedExpression is always the $$intercepted\n      if (parsedExpression.$$interceptor) {\n        interceptorFn = chainInterceptors(parsedExpression.$$interceptor, interceptorFn);\n        parsedExpression = parsedExpression.$$intercepted;\n      }\n\n      var useInputs = false;\n\n      var fn = function interceptedExpression(scope, locals, assign, inputs) {\n        var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs);\n        return interceptorFn(value);\n      };\n\n      // Maintain references to the interceptor/intercepted\n      fn.$$intercepted = parsedExpression;\n      fn.$$interceptor = interceptorFn;\n\n      // Propogate the literal/oneTime/constant attributes\n      fn.literal = parsedExpression.literal;\n      fn.oneTime = parsedExpression.oneTime;\n      fn.constant = parsedExpression.constant;\n\n      // Treat the interceptor like filters.\n      // If it is not $stateful then only watch its inputs.\n      // If the expression itself has no inputs then use the full expression as an input.\n      if (!interceptorFn.$stateful) {\n        useInputs = !parsedExpression.inputs;\n        fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression];\n\n        if (!interceptorFn.$$pure) {\n          fn.inputs = fn.inputs.map(function(e) {\n              // Remove the isPure flag of inputs when it is not absolute because they are now wrapped in a\n              // non-pure interceptor function.\n              if (e.isPure === PURITY_RELATIVE) {\n                return function depurifier(s) { return e(s); };\n              }\n              return e;\n            });\n        }\n      }\n\n      return addWatchDelegate(fn);\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $q\n * @requires $rootScope\n *\n * @description\n * A service that helps you run functions asynchronously, and use their return values (or exceptions)\n * when they are done processing.\n *\n * This is a [Promises/A+](https://promisesaplus.com/)-compliant implementation of promises/deferred\n * objects inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).\n *\n * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred\n * implementations, and the other which resembles ES6 (ES2015) promises to some degree.\n *\n * ## $q constructor\n *\n * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`\n * function as the first argument. This is similar to the native Promise implementation from ES6,\n * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * While the constructor-style use is supported, not all of the supporting methods from ES6 promises are\n * available yet.\n *\n * It can be used like so:\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     // perform some asynchronous operation, resolve or reject the promise when appropriate.\n *     return $q(function(resolve, reject) {\n *       setTimeout(function() {\n *         if (okToGreet(name)) {\n *           resolve('Hello, ' + name + '!');\n *         } else {\n *           reject('Greeting ' + name + ' is not allowed.');\n *         }\n *       }, 1000);\n *     });\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   });\n * ```\n *\n * Note: progress/notify callbacks are not currently supported via the ES6-style interface.\n *\n * Note: unlike ES6 behavior, an exception thrown in the constructor function will NOT implicitly reject the promise.\n *\n * However, the more traditional CommonJS-style usage is still available, and documented below.\n *\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\n * interface for interacting with an object that represents the result of an action that is\n * performed asynchronously, and may or may not be finished at any given point in time.\n *\n * From the perspective of dealing with error handling, deferred and promise APIs are to\n * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     var deferred = $q.defer();\n *\n *     setTimeout(function() {\n *       deferred.notify('About to greet ' + name + '.');\n *\n *       if (okToGreet(name)) {\n *         deferred.resolve('Hello, ' + name + '!');\n *       } else {\n *         deferred.reject('Greeting ' + name + ' is not allowed.');\n *       }\n *     }, 1000);\n *\n *     return deferred.promise;\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   }, function(update) {\n *     alert('Got notification: ' + update);\n *   });\n * ```\n *\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\n * comes in the way of guarantees that promise and deferred APIs make, see\n * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.\n *\n * Additionally the promise api allows for composition that is very hard to do with the\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\n * section on serial or parallel joining of promises.\n *\n * ## The Deferred API\n *\n * A new instance of deferred is constructed by calling `$q.defer()`.\n *\n * The purpose of the deferred object is to expose the associated Promise instance as well as APIs\n * that can be used for signaling the successful or unsuccessful completion, as well as the status\n * of the task.\n *\n * **Methods**\n *\n * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection\n *   constructed via `$q.reject`, the promise will be rejected instead.\n * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to\n *   resolving it with a rejection constructed via `$q.reject`.\n * - `notify(value)` - provides updates on the status of the promise's execution. This may be called\n *   multiple times before the promise is either resolved or rejected.\n *\n * **Properties**\n *\n * - promise – `{Promise}` – promise object associated with this deferred.\n *\n *\n * ## The Promise API\n *\n * A new promise instance is created when a deferred instance is created and can be retrieved by\n * calling `deferred.promise`.\n *\n * The purpose of the promise object is to allow for interested parties to get access to the result\n * of the deferred task when it completes.\n *\n * **Methods**\n *\n * - `then(successCallback, [errorCallback], [notifyCallback])` – regardless of when the promise was or\n *   will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously\n *   as soon as the result is available. The callbacks are called with a single argument: the result\n *   or rejection reason. Additionally, the notify callback may be called zero or more times to\n *   provide a progress indication, before the promise is resolved or rejected.\n *\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\n *   `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved\n *   with the value which is resolved in that promise using\n *   [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)).\n *   It also notifies via the return value of the `notifyCallback` method. The promise cannot be\n *   resolved or rejected from the notifyCallback method. The errorCallback and notifyCallback\n *   arguments are optional.\n *\n * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`\n *\n * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,\n *   but to do so without modifying the final value. This is useful to release resources or do some\n *   clean-up that needs to be done whether the promise was rejected or resolved. See the [full\n *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for\n *   more information.\n *\n * ## Chaining promises\n *\n * Because calling the `then` method of a promise returns a new derived promise, it is easily\n * possible to create a chain of promises:\n *\n * ```js\n *   promiseB = promiseA.then(function(result) {\n *     return result + 1;\n *   });\n *\n *   // promiseB will be resolved immediately after promiseA is resolved and its value\n *   // will be the result of promiseA incremented by 1\n * ```\n *\n * It is possible to create chains of any length and since a promise can be resolved with another\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\n * the promises at any point in the chain. This makes it possible to implement powerful APIs like\n * $http's response interceptors.\n *\n *\n * ## Differences between Kris Kowal's Q and $q\n *\n *  There are two main differences:\n *\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\n *   mechanism in AngularJS, which means faster propagation of resolution or rejection into your\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\n * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains\n *   all the important functionality needed for common async tasks.\n *\n * ## Testing\n *\n *  ```js\n *    it('should simulate promise', inject(function($q, $rootScope) {\n *      var deferred = $q.defer();\n *      var promise = deferred.promise;\n *      var resolvedValue;\n *\n *      promise.then(function(value) { resolvedValue = value; });\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Simulate resolving of promise\n *      deferred.resolve(123);\n *      // Note that the 'then' function does not get called synchronously.\n *      // This is because we want the promise API to always be async, whether or not\n *      // it got called synchronously or asynchronously.\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Propagate promise resolution to 'then' functions using $apply().\n *      $rootScope.$apply();\n *      expect(resolvedValue).toEqual(123);\n *    }));\n *  ```\n *\n * @param {function(function, function)} resolver Function which is responsible for resolving or\n *   rejecting the newly created promise. The first parameter is a function which resolves the\n *   promise, the second parameter is a function which rejects the promise.\n *\n * @returns {Promise} The newly created promise.\n */\n/**\n * @ngdoc provider\n * @name $qProvider\n * @this\n *\n * @description\n */\nfunction $QProvider() {\n  var errorOnUnhandledRejections = true;\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $rootScope.$evalAsync(callback);\n    }, $exceptionHandler, errorOnUnhandledRejections);\n  }];\n\n  /**\n   * @ngdoc method\n   * @name $qProvider#errorOnUnhandledRejections\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides whether to generate an error when a rejected promise is not handled.\n   * This feature is enabled by default.\n   *\n   * @param {boolean=} value Whether to generate an error when a rejected promise is not handled.\n   * @returns {boolean|ng.$qProvider} Current value when called without a new value or self for\n   *    chaining otherwise.\n   */\n  this.errorOnUnhandledRejections = function(value) {\n    if (isDefined(value)) {\n      errorOnUnhandledRejections = value;\n      return this;\n    } else {\n      return errorOnUnhandledRejections;\n    }\n  };\n}\n\n/** @this */\nfunction $$QProvider() {\n  var errorOnUnhandledRejections = true;\n  this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $browser.defer(callback);\n    }, $exceptionHandler, errorOnUnhandledRejections);\n  }];\n\n  this.errorOnUnhandledRejections = function(value) {\n    if (isDefined(value)) {\n      errorOnUnhandledRejections = value;\n      return this;\n    } else {\n      return errorOnUnhandledRejections;\n    }\n  };\n}\n\n/**\n * Constructs a promise manager.\n *\n * @param {function(function)} nextTick Function for executing functions in the next turn.\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\n *     debugging purposes.\n * @param {boolean=} errorOnUnhandledRejections Whether an error should be generated on unhandled\n *     promises rejections.\n * @returns {object} Promise manager.\n */\nfunction qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {\n  var $qMinErr = minErr('$q', TypeError);\n  var queueSize = 0;\n  var checkQueue = [];\n\n  /**\n   * @ngdoc method\n   * @name ng.$q#defer\n   * @kind function\n   *\n   * @description\n   * Creates a `Deferred` object which represents a task which will finish in the future.\n   *\n   * @returns {Deferred} Returns a new instance of deferred.\n   */\n  function defer() {\n    return new Deferred();\n  }\n\n  function Deferred() {\n    var promise = this.promise = new Promise();\n    //Non prototype methods necessary to support unbound execution :/\n    this.resolve = function(val) { resolvePromise(promise, val); };\n    this.reject = function(reason) { rejectPromise(promise, reason); };\n    this.notify = function(progress) { notifyPromise(promise, progress); };\n  }\n\n\n  function Promise() {\n    this.$$state = { status: 0 };\n  }\n\n  extend(Promise.prototype, {\n    then: function(onFulfilled, onRejected, progressBack) {\n      if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) {\n        return this;\n      }\n      var result = new Promise();\n\n      this.$$state.pending = this.$$state.pending || [];\n      this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);\n      if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);\n\n      return result;\n    },\n\n    'catch': function(callback) {\n      return this.then(null, callback);\n    },\n\n    'finally': function(callback, progressBack) {\n      return this.then(function(value) {\n        return handleCallback(value, resolve, callback);\n      }, function(error) {\n        return handleCallback(error, reject, callback);\n      }, progressBack);\n    }\n  });\n\n  function processQueue(state) {\n    var fn, promise, pending;\n\n    pending = state.pending;\n    state.processScheduled = false;\n    state.pending = undefined;\n    try {\n      for (var i = 0, ii = pending.length; i < ii; ++i) {\n        markQStateExceptionHandled(state);\n        promise = pending[i][0];\n        fn = pending[i][state.status];\n        try {\n          if (isFunction(fn)) {\n            resolvePromise(promise, fn(state.value));\n          } else if (state.status === 1) {\n            resolvePromise(promise, state.value);\n          } else {\n            rejectPromise(promise, state.value);\n          }\n        } catch (e) {\n          rejectPromise(promise, e);\n          // This error is explicitly marked for being passed to the $exceptionHandler\n          if (e && e.$$passToExceptionHandler === true) {\n            exceptionHandler(e);\n          }\n        }\n      }\n    } finally {\n      --queueSize;\n      if (errorOnUnhandledRejections && queueSize === 0) {\n        nextTick(processChecks);\n      }\n    }\n  }\n\n  function processChecks() {\n    // eslint-disable-next-line no-unmodified-loop-condition\n    while (!queueSize && checkQueue.length) {\n      var toCheck = checkQueue.shift();\n      if (!isStateExceptionHandled(toCheck)) {\n        markQStateExceptionHandled(toCheck);\n        var errorMessage = 'Possibly unhandled rejection: ' + toDebugString(toCheck.value);\n        if (isError(toCheck.value)) {\n          exceptionHandler(toCheck.value, errorMessage);\n        } else {\n          exceptionHandler(errorMessage);\n        }\n      }\n    }\n  }\n\n  function scheduleProcessQueue(state) {\n    if (errorOnUnhandledRejections && !state.pending && state.status === 2 && !isStateExceptionHandled(state)) {\n      if (queueSize === 0 && checkQueue.length === 0) {\n        nextTick(processChecks);\n      }\n      checkQueue.push(state);\n    }\n    if (state.processScheduled || !state.pending) return;\n    state.processScheduled = true;\n    ++queueSize;\n    nextTick(function() { processQueue(state); });\n  }\n\n  function resolvePromise(promise, val) {\n    if (promise.$$state.status) return;\n    if (val === promise) {\n      $$reject(promise, $qMinErr(\n        'qcycle',\n        'Expected promise to be resolved with value other than itself \\'{0}\\'',\n        val));\n    } else {\n      $$resolve(promise, val);\n    }\n\n  }\n\n  function $$resolve(promise, val) {\n    var then;\n    var done = false;\n    try {\n      if (isObject(val) || isFunction(val)) then = val.then;\n      if (isFunction(then)) {\n        promise.$$state.status = -1;\n        then.call(val, doResolve, doReject, doNotify);\n      } else {\n        promise.$$state.value = val;\n        promise.$$state.status = 1;\n        scheduleProcessQueue(promise.$$state);\n      }\n    } catch (e) {\n      doReject(e);\n    }\n\n    function doResolve(val) {\n      if (done) return;\n      done = true;\n      $$resolve(promise, val);\n    }\n    function doReject(val) {\n      if (done) return;\n      done = true;\n      $$reject(promise, val);\n    }\n    function doNotify(progress) {\n      notifyPromise(promise, progress);\n    }\n  }\n\n  function rejectPromise(promise, reason) {\n    if (promise.$$state.status) return;\n    $$reject(promise, reason);\n  }\n\n  function $$reject(promise, reason) {\n    promise.$$state.value = reason;\n    promise.$$state.status = 2;\n    scheduleProcessQueue(promise.$$state);\n  }\n\n  function notifyPromise(promise, progress) {\n    var callbacks = promise.$$state.pending;\n\n    if ((promise.$$state.status <= 0) && callbacks && callbacks.length) {\n      nextTick(function() {\n        var callback, result;\n        for (var i = 0, ii = callbacks.length; i < ii; i++) {\n          result = callbacks[i][0];\n          callback = callbacks[i][3];\n          try {\n            notifyPromise(result, isFunction(callback) ? callback(progress) : progress);\n          } catch (e) {\n            exceptionHandler(e);\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#reject\n   * @kind function\n   *\n   * @description\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\n   * a promise chain, you don't need to worry about it.\n   *\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\n   * a promise error callback and you want to forward the error to the promise derived from the\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\n   * `reject`.\n   *\n   * ```js\n   *   promiseB = promiseA.then(function(result) {\n   *     // success: do something and resolve promiseB\n   *     //          with the old or a new result\n   *     return result;\n   *   }, function(reason) {\n   *     // error: handle the error if possible and\n   *     //        resolve promiseB with newPromiseOrValue,\n   *     //        otherwise forward the rejection to promiseB\n   *     if (canHandle(reason)) {\n   *      // handle the error and recover\n   *      return newPromiseOrValue;\n   *     }\n   *     return $q.reject(reason);\n   *   });\n   * ```\n   *\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\n   */\n  function reject(reason) {\n    var result = new Promise();\n    rejectPromise(result, reason);\n    return result;\n  }\n\n  function handleCallback(value, resolver, callback) {\n    var callbackOutput = null;\n    try {\n      if (isFunction(callback)) callbackOutput = callback();\n    } catch (e) {\n      return reject(e);\n    }\n    if (isPromiseLike(callbackOutput)) {\n      return callbackOutput.then(function() {\n        return resolver(value);\n      }, reject);\n    } else {\n      return resolver(value);\n    }\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#when\n   * @kind function\n   *\n   * @description\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\n   * This is useful when you are dealing with an object that might or might not be a promise, or if\n   * the promise comes from a source that can't be trusted.\n   *\n   * @param {*} value Value or a promise\n   * @param {Function=} successCallback\n   * @param {Function=} errorCallback\n   * @param {Function=} progressCallback\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n\n\n  function when(value, callback, errback, progressBack) {\n    var result = new Promise();\n    resolvePromise(result, value);\n    return result.then(callback, errback, progressBack);\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#resolve\n   * @kind function\n   *\n   * @description\n   * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6.\n   *\n   * @param {*} value Value or a promise\n   * @param {Function=} successCallback\n   * @param {Function=} errorCallback\n   * @param {Function=} progressCallback\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n  var resolve = when;\n\n  /**\n   * @ngdoc method\n   * @name $q#all\n   * @kind function\n   *\n   * @description\n   * Combines multiple promises into a single promise that is resolved when all of the input\n   * promises are resolved.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,\n   *   each value corresponding to the promise at the same index/key in the `promises` array/hash.\n   *   If any of the promises is resolved with a rejection, this resulting promise will be rejected\n   *   with the same rejection value.\n   */\n\n  function all(promises) {\n    var result = new Promise(),\n        counter = 0,\n        results = isArray(promises) ? [] : {};\n\n    forEach(promises, function(promise, key) {\n      counter++;\n      when(promise).then(function(value) {\n        results[key] = value;\n        if (!(--counter)) resolvePromise(result, results);\n      }, function(reason) {\n        rejectPromise(result, reason);\n      });\n    });\n\n    if (counter === 0) {\n      resolvePromise(result, results);\n    }\n\n    return result;\n  }\n\n  /**\n   * @ngdoc method\n   * @name $q#race\n   * @kind function\n   *\n   * @description\n   * Returns a promise that resolves or rejects as soon as one of those promises\n   * resolves or rejects, with the value or reason from that promise.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} a promise that resolves or rejects as soon as one of the `promises`\n   * resolves or rejects, with the value or reason from that promise.\n   */\n\n  function race(promises) {\n    var deferred = defer();\n\n    forEach(promises, function(promise) {\n      when(promise).then(deferred.resolve, deferred.reject);\n    });\n\n    return deferred.promise;\n  }\n\n  function $Q(resolver) {\n    if (!isFunction(resolver)) {\n      throw $qMinErr('norslvr', 'Expected resolverFn, got \\'{0}\\'', resolver);\n    }\n\n    var promise = new Promise();\n\n    function resolveFn(value) {\n      resolvePromise(promise, value);\n    }\n\n    function rejectFn(reason) {\n      rejectPromise(promise, reason);\n    }\n\n    resolver(resolveFn, rejectFn);\n\n    return promise;\n  }\n\n  // Let's make the instanceof operator work for promises, so that\n  // `new $q(fn) instanceof $q` would evaluate to true.\n  $Q.prototype = Promise.prototype;\n\n  $Q.defer = defer;\n  $Q.reject = reject;\n  $Q.when = when;\n  $Q.resolve = resolve;\n  $Q.all = all;\n  $Q.race = race;\n\n  return $Q;\n}\n\nfunction isStateExceptionHandled(state) {\n  return !!state.pur;\n}\nfunction markQStateExceptionHandled(state) {\n  state.pur = true;\n}\nfunction markQExceptionHandled(q) {\n  // Built-in `$q` promises will always have a `$$state` property. This check is to allow\n  // overwriting `$q` with a different promise library (e.g. Bluebird + angular-bluebird-promises).\n  // (Currently, this is the only method that might be called with a promise, even if it is not\n  // created by the built-in `$q`.)\n  if (q.$$state) {\n    markQStateExceptionHandled(q.$$state);\n  }\n}\n\n/** @this */\nfunction $$RAFProvider() { //rAF\n  this.$get = ['$window', '$timeout', function($window, $timeout) {\n    var requestAnimationFrame = $window.requestAnimationFrame ||\n                                $window.webkitRequestAnimationFrame;\n\n    var cancelAnimationFrame = $window.cancelAnimationFrame ||\n                               $window.webkitCancelAnimationFrame ||\n                               $window.webkitCancelRequestAnimationFrame;\n\n    var rafSupported = !!requestAnimationFrame;\n    var raf = rafSupported\n      ? function(fn) {\n          var id = requestAnimationFrame(fn);\n          return function() {\n            cancelAnimationFrame(id);\n          };\n        }\n      : function(fn) {\n          var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n          return function() {\n            $timeout.cancel(timer);\n          };\n        };\n\n    raf.supported = rafSupported;\n\n    return raf;\n  }];\n}\n\n/**\n * DESIGN NOTES\n *\n * The design decisions behind the scope are heavily favored for speed and memory consumption.\n *\n * The typical use of scope is to watch the expressions, which most of the time return the same\n * value as last time so we optimize the operation.\n *\n * Closures construction is expensive in terms of speed as well as memory:\n *   - No closures, instead use prototypical inheritance for API\n *   - Internal state needs to be stored on scope directly, which means that private state is\n *     exposed as $$____ properties\n *\n * Loop operations are optimized by using while(count--) { ... }\n *   - This means that in order to keep the same order of execution as addition we have to add\n *     items to the array at the beginning (unshift) instead of at the end (push)\n *\n * Child scopes are created and removed often\n *   - Using an array would be slow since inserts in the middle are expensive; so we use linked lists\n *\n * There are fewer watches than observers. This is why you don't want the observer to be implemented\n * in the same way as watch. Watch requires return of the initialization function which is expensive\n * to construct.\n */\n\n\n/**\n * @ngdoc provider\n * @name $rootScopeProvider\n * @description\n *\n * Provider for the $rootScope service.\n */\n\n/**\n * @ngdoc method\n * @name $rootScopeProvider#digestTtl\n * @description\n *\n * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and\n * assuming that the model is unstable.\n *\n * The current default is 10 iterations.\n *\n * In complex applications it's possible that the dependencies between `$watch`s will result in\n * several digest iterations. However if an application needs more than the default 10 digest\n * iterations for its model to stabilize then you should investigate what is causing the model to\n * continuously change during the digest.\n *\n * Increasing the TTL could have performance implications, so you should not change it without\n * proper justification.\n *\n * @param {number} limit The number of digest iterations.\n */\n\n\n/**\n * @ngdoc service\n * @name $rootScope\n * @this\n *\n * @description\n *\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\n * All other scopes are descendant scopes of the root scope. Scopes provide separation\n * between the model and the view, via a mechanism for watching the model for changes.\n * They also provide event emission/broadcast and subscription facility. See the\n * {@link guide/scope developer guide on scopes}.\n */\nfunction $RootScopeProvider() {\n  var TTL = 10;\n  var $rootScopeMinErr = minErr('$rootScope');\n  var lastDirtyWatch = null;\n  var applyAsyncId = null;\n\n  this.digestTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n    }\n    return TTL;\n  };\n\n  function createChildScopeClass(parent) {\n    function ChildScope() {\n      this.$$watchers = this.$$nextSibling =\n          this.$$childHead = this.$$childTail = null;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$watchersCount = 0;\n      this.$id = nextUid();\n      this.$$ChildScope = null;\n      this.$$suspended = false;\n    }\n    ChildScope.prototype = parent;\n    return ChildScope;\n  }\n\n  this.$get = ['$exceptionHandler', '$parse', '$browser',\n      function($exceptionHandler, $parse, $browser) {\n\n    function destroyChildScope($event) {\n        $event.currentScope.$$destroyed = true;\n    }\n\n    function cleanUpScope($scope) {\n\n      // Support: IE 9 only\n      if (msie === 9) {\n        // There is a memory leak in IE9 if all child scopes are not disconnected\n        // completely when a scope is destroyed. So this code will recurse up through\n        // all this scopes children\n        //\n        // See issue https://github.com/angular/angular.js/issues/10706\n        if ($scope.$$childHead) {\n          cleanUpScope($scope.$$childHead);\n        }\n        if ($scope.$$nextSibling) {\n          cleanUpScope($scope.$$nextSibling);\n        }\n      }\n\n      // The code below works around IE9 and V8's memory leaks\n      //\n      // See:\n      // - https://code.google.com/p/v8/issues/detail?id=2073#c26\n      // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909\n      // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451\n\n      $scope.$parent = $scope.$$nextSibling = $scope.$$prevSibling = $scope.$$childHead =\n          $scope.$$childTail = $scope.$root = $scope.$$watchers = null;\n    }\n\n    /**\n     * @ngdoc type\n     * @name $rootScope.Scope\n     *\n     * @description\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\n     * {@link auto.$injector $injector}. Child scopes are created using the\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\n     * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for\n     * an in-depth introduction and usage examples.\n     *\n     *\n     * ## Inheritance\n     * A scope can inherit from a parent scope, as in this example:\n     * ```js\n         var parent = $rootScope;\n         var child = parent.$new();\n\n         parent.salutation = \"Hello\";\n         expect(child.salutation).toEqual('Hello');\n\n         child.salutation = \"Welcome\";\n         expect(child.salutation).toEqual('Welcome');\n         expect(parent.salutation).toEqual('Hello');\n     * ```\n     *\n     * When interacting with `Scope` in tests, additional helper methods are available on the\n     * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional\n     * details.\n     *\n     *\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be\n     *                                       provided for the current scope. Defaults to {@link ng}.\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\n     *                              append/override services provided by `providers`. This is handy\n     *                              when unit-testing and having the need to override a default\n     *                              service.\n     * @returns {Object} Newly created scope.\n     *\n     */\n    function Scope() {\n      this.$id = nextUid();\n      this.$$phase = this.$parent = this.$$watchers =\n                     this.$$nextSibling = this.$$prevSibling =\n                     this.$$childHead = this.$$childTail = null;\n      this.$root = this;\n      this.$$destroyed = false;\n      this.$$suspended = false;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$watchersCount = 0;\n      this.$$isolateBindings = null;\n    }\n\n    /**\n     * @ngdoc property\n     * @name $rootScope.Scope#$id\n     *\n     * @description\n     * Unique scope ID (monotonically increasing) useful for debugging.\n     */\n\n     /**\n      * @ngdoc property\n      * @name $rootScope.Scope#$parent\n      *\n      * @description\n      * Reference to the parent scope.\n      */\n\n      /**\n       * @ngdoc property\n       * @name $rootScope.Scope#$root\n       *\n       * @description\n       * Reference to the root scope.\n       */\n\n    Scope.prototype = {\n      constructor: Scope,\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$new\n       * @kind function\n       *\n       * @description\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\n       *\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event.\n       * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\n       *\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is\n       * desired for the scope and its child scopes to be permanently detached from the parent and\n       * thus stop participating in model change detection and listener notification by invoking.\n       *\n       * @param {boolean} isolate If true, then the scope does not prototypically inherit from the\n       *         parent scope. The scope is isolated, as it can not see parent scope properties.\n       *         When creating widgets, it is useful for the widget to not accidentally read parent\n       *         state.\n       *\n       * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent`\n       *                              of the newly created scope. Defaults to `this` scope if not provided.\n       *                              This is used when creating a transclude scope to correctly place it\n       *                              in the scope hierarchy while maintaining the correct prototypical\n       *                              inheritance.\n       *\n       * @returns {Object} The newly created child scope.\n       *\n       */\n      $new: function(isolate, parent) {\n        var child;\n\n        parent = parent || this;\n\n        if (isolate) {\n          child = new Scope();\n          child.$root = this.$root;\n        } else {\n          // Only create a child scope class if somebody asks for one,\n          // but cache it to allow the VM to optimize lookups.\n          if (!this.$$ChildScope) {\n            this.$$ChildScope = createChildScopeClass(this);\n          }\n          child = new this.$$ChildScope();\n        }\n        child.$parent = parent;\n        child.$$prevSibling = parent.$$childTail;\n        if (parent.$$childHead) {\n          parent.$$childTail.$$nextSibling = child;\n          parent.$$childTail = child;\n        } else {\n          parent.$$childHead = parent.$$childTail = child;\n        }\n\n        // When the new scope is not isolated or we inherit from `this`, and\n        // the parent scope is destroyed, the property `$$destroyed` is inherited\n        // prototypically. In all other cases, this property needs to be set\n        // when the parent scope is destroyed.\n        // The listener needs to be added after the parent is set\n        if (isolate || parent !== this) child.$on('$destroy', destroyChildScope);\n\n        return child;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watch\n       * @kind function\n       *\n       * @description\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\n       *\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest\n       *   $digest()} and should return the value that will be watched. (`watchExpression` should not change\n       *   its value when executed multiple times with the same input because it may be executed multiple\n       *   times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be\n       *   [idempotent](http://en.wikipedia.org/wiki/Idempotence).)\n       * - The `listener` is called only when the value from the current `watchExpression` and the\n       *   previous call to `watchExpression` are not equal (with the exception of the initial run,\n       *   see below). Inequality is determined according to reference inequality,\n       *   [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)\n       *    via the `!==` Javascript operator, unless `objectEquality == true`\n       *   (see next point)\n       * - When `objectEquality == true`, inequality of the `watchExpression` is determined\n       *   according to the {@link angular.equals} function. To save the value of the object for\n       *   later comparison, the {@link angular.copy} function is used. This therefore means that\n       *   watching complex objects will have adverse memory and performance implications.\n       * - This should not be used to watch for changes in objects that are (or contain)\n       *   [File](https://developer.mozilla.org/docs/Web/API/File) objects due to limitations with {@link angular.copy `angular.copy`}.\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire.\n       *   This is achieved by rerunning the watchers until no changes are detected. The rerun\n       *   iteration limit is 10 to prevent an infinite loop deadlock.\n       *\n       *\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\n       * you can register a `watchExpression` function with no `listener`. (Be prepared for\n       * multiple calls to your `watchExpression` because it will execute multiple times in a\n       * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.)\n       *\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\n       * listener was called due to initialization.\n       *\n       *\n       *\n       * @example\n       * ```js\n           // let's assume that scope was dependency injected as the $rootScope\n           var scope = $rootScope;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n\n\n\n           // Using a function as a watchExpression\n           var food;\n           scope.foodCounter = 0;\n           expect(scope.foodCounter).toEqual(0);\n           scope.$watch(\n             // This function returns the value being watched. It is called for each turn of the $digest loop\n             function() { return food; },\n             // This is the change listener, called when the value returned from the above function changes\n             function(newValue, oldValue) {\n               if ( newValue !== oldValue ) {\n                 // Only increment the counter if the value changed\n                 scope.foodCounter = scope.foodCounter + 1;\n               }\n             }\n           );\n           // No digest has been run so the counter will be zero\n           expect(scope.foodCounter).toEqual(0);\n\n           // Run the digest but since food has not changed count will still be zero\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(0);\n\n           // Update food and run digest.  Now the counter will increment\n           food = 'cheeseburger';\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(1);\n\n       * ```\n       *\n       *\n       *\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers\n       *    a call to the `listener`.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(scope)`: called with current `scope` as a parameter.\n       * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value\n       *    of `watchExpression` changes.\n       *\n       *    - `newVal` contains the current value of the `watchExpression`\n       *    - `oldVal` contains the previous value of the `watchExpression`\n       *    - `scope` refers to the current scope\n       * @param {boolean=} [objectEquality=false] Compare for object equality using {@link angular.equals} instead of\n       *     comparing for reference equality.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) {\n        var get = $parse(watchExp);\n        var fn = isFunction(listener) ? listener : noop;\n\n        if (get.$$watchDelegate) {\n          return get.$$watchDelegate(this, fn, objectEquality, get, watchExp);\n        }\n        var scope = this,\n            array = scope.$$watchers,\n            watcher = {\n              fn: fn,\n              last: initWatchVal,\n              get: get,\n              exp: prettyPrintExpression || watchExp,\n              eq: !!objectEquality\n            };\n\n        lastDirtyWatch = null;\n\n        if (!array) {\n          array = scope.$$watchers = [];\n          array.$$digestWatchIndex = -1;\n        }\n        // we use unshift since we use a while loop in $digest for speed.\n        // the while loop reads in reverse order.\n        array.unshift(watcher);\n        array.$$digestWatchIndex++;\n        incrementWatchersCount(this, 1);\n\n        return function deregisterWatch() {\n          var index = arrayRemove(array, watcher);\n          if (index >= 0) {\n            incrementWatchersCount(scope, -1);\n            if (index < array.$$digestWatchIndex) {\n              array.$$digestWatchIndex--;\n            }\n          }\n          lastDirtyWatch = null;\n        };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchGroup\n       * @kind function\n       *\n       * @description\n       * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.\n       * If any one expression in the collection changes the `listener` is executed.\n       *\n       * - The items in the `watchExpressions` array are observed via the standard `$watch` operation. Their return\n       *   values are examined for changes on every call to `$digest`.\n       * - The `listener` is called whenever any expression in the `watchExpressions` array changes.\n       *\n       * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually\n       * watched using {@link ng.$rootScope.Scope#$watch $watch()}\n       *\n       * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any\n       *    expression in `watchExpressions` changes\n       *    The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    The `scope` refers to the current scope.\n       * @returns {function()} Returns a de-registration function for all listeners.\n       */\n      $watchGroup: function(watchExpressions, listener) {\n        var oldValues = new Array(watchExpressions.length);\n        var newValues = new Array(watchExpressions.length);\n        var deregisterFns = [];\n        var self = this;\n        var changeReactionScheduled = false;\n        var firstRun = true;\n\n        if (!watchExpressions.length) {\n          // No expressions means we call the listener ASAP\n          var shouldCall = true;\n          self.$evalAsync(function() {\n            if (shouldCall) listener(newValues, newValues, self);\n          });\n          return function deregisterWatchGroup() {\n            shouldCall = false;\n          };\n        }\n\n        if (watchExpressions.length === 1) {\n          // Special case size of one\n          return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) {\n            newValues[0] = value;\n            oldValues[0] = oldValue;\n            listener(newValues, (value === oldValue) ? newValues : oldValues, scope);\n          });\n        }\n\n        forEach(watchExpressions, function(expr, i) {\n          var unwatchFn = self.$watch(expr, function watchGroupSubAction(value) {\n            newValues[i] = value;\n            if (!changeReactionScheduled) {\n              changeReactionScheduled = true;\n              self.$evalAsync(watchGroupAction);\n            }\n          });\n          deregisterFns.push(unwatchFn);\n        });\n\n        function watchGroupAction() {\n          changeReactionScheduled = false;\n\n          try {\n            if (firstRun) {\n              firstRun = false;\n              listener(newValues, newValues, self);\n            } else {\n              listener(newValues, oldValues, self);\n            }\n          } finally {\n            for (var i = 0; i < watchExpressions.length; i++) {\n              oldValues[i] = newValues[i];\n            }\n          }\n        }\n\n        return function deregisterWatchGroup() {\n          while (deregisterFns.length) {\n            deregisterFns.shift()();\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchCollection\n       * @kind function\n       *\n       * @description\n       * Shallow watches the properties of an object and fires whenever any of the properties change\n       * (for arrays, this implies watching the array items; for object maps, this implies watching\n       * the properties). If a change is detected, the `listener` callback is fired.\n       *\n       * - The `obj` collection is observed via standard $watch operation and is examined on every\n       *   call to $digest() to see if any items have been added, removed, or moved.\n       * - The `listener` is called whenever anything within the `obj` has changed. Examples include\n       *   adding, removing, and moving items belonging to an object or array.\n       *\n       *\n       * @example\n       * ```js\n          $scope.names = ['igor', 'matias', 'misko', 'james'];\n          $scope.dataCount = 4;\n\n          $scope.$watchCollection('names', function(newNames, oldNames) {\n            $scope.dataCount = newNames.length;\n          });\n\n          expect($scope.dataCount).toEqual(4);\n          $scope.$digest();\n\n          //still at 4 ... no changes\n          expect($scope.dataCount).toEqual(4);\n\n          $scope.names.pop();\n          $scope.$digest();\n\n          //now there's been a change\n          expect($scope.dataCount).toEqual(3);\n       * ```\n       *\n       *\n       * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The\n       *    expression value should evaluate to an object or an array which is observed on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the\n       *    collection will trigger a call to the `listener`.\n       *\n       * @param {function(newCollection, oldCollection, scope)} listener a callback function called\n       *    when a change is detected.\n       *    - The `newCollection` object is the newly modified data obtained from the `obj` expression\n       *    - The `oldCollection` object is a copy of the former collection data.\n       *      Due to performance considerations, the`oldCollection` value is computed only if the\n       *      `listener` function declares two or more arguments.\n       *    - The `scope` argument refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for this listener. When the\n       *    de-registration function is executed, the internal watch operation is terminated.\n       */\n      $watchCollection: function(obj, listener) {\n        // Mark the interceptor as\n        // ... $$pure when literal since the instance will change when any input changes\n        $watchCollectionInterceptor.$$pure = $parse(obj).literal;\n        // ... $stateful when non-literal since we must read the state of the collection\n        $watchCollectionInterceptor.$stateful = !$watchCollectionInterceptor.$$pure;\n\n        var self = this;\n        // the current value, updated on each dirty-check run\n        var newValue;\n        // a shallow copy of the newValue from the last dirty-check run,\n        // updated to match newValue during dirty-check run\n        var oldValue;\n        // a shallow copy of the newValue from when the last change happened\n        var veryOldValue;\n        // only track veryOldValue if the listener is asking for it\n        var trackVeryOldValue = (listener.length > 1);\n        var changeDetected = 0;\n        var changeDetector = $parse(obj, $watchCollectionInterceptor);\n        var internalArray = [];\n        var internalObject = {};\n        var initRun = true;\n        var oldLength = 0;\n\n        function $watchCollectionInterceptor(_value) {\n          newValue = _value;\n          var newLength, key, bothNaN, newItem, oldItem;\n\n          // If the new value is undefined, then return undefined as the watch may be a one-time watch\n          if (isUndefined(newValue)) return;\n\n          if (!isObject(newValue)) { // if primitive\n            if (oldValue !== newValue) {\n              oldValue = newValue;\n              changeDetected++;\n            }\n          } else if (isArrayLike(newValue)) {\n            if (oldValue !== internalArray) {\n              // we are transitioning from something which was not an array into array.\n              oldValue = internalArray;\n              oldLength = oldValue.length = 0;\n              changeDetected++;\n            }\n\n            newLength = newValue.length;\n\n            if (oldLength !== newLength) {\n              // if lengths do not match we need to trigger change notification\n              changeDetected++;\n              oldValue.length = oldLength = newLength;\n            }\n            // copy the items to oldValue and look for changes.\n            for (var i = 0; i < newLength; i++) {\n              oldItem = oldValue[i];\n              newItem = newValue[i];\n\n              // eslint-disable-next-line no-self-compare\n              bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n              if (!bothNaN && (oldItem !== newItem)) {\n                changeDetected++;\n                oldValue[i] = newItem;\n              }\n            }\n          } else {\n            if (oldValue !== internalObject) {\n              // we are transitioning from something which was not an object into object.\n              oldValue = internalObject = {};\n              oldLength = 0;\n              changeDetected++;\n            }\n            // copy the items to oldValue and look for changes.\n            newLength = 0;\n            for (key in newValue) {\n              if (hasOwnProperty.call(newValue, key)) {\n                newLength++;\n                newItem = newValue[key];\n                oldItem = oldValue[key];\n\n                if (key in oldValue) {\n                  // eslint-disable-next-line no-self-compare\n                  bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n                  if (!bothNaN && (oldItem !== newItem)) {\n                    changeDetected++;\n                    oldValue[key] = newItem;\n                  }\n                } else {\n                  oldLength++;\n                  oldValue[key] = newItem;\n                  changeDetected++;\n                }\n              }\n            }\n            if (oldLength > newLength) {\n              // we used to have more keys, need to find them and destroy them.\n              changeDetected++;\n              for (key in oldValue) {\n                if (!hasOwnProperty.call(newValue, key)) {\n                  oldLength--;\n                  delete oldValue[key];\n                }\n              }\n            }\n          }\n          return changeDetected;\n        }\n\n        function $watchCollectionAction() {\n          if (initRun) {\n            initRun = false;\n            listener(newValue, newValue, self);\n          } else {\n            listener(newValue, veryOldValue, self);\n          }\n\n          // make a copy for the next time a collection is changed\n          if (trackVeryOldValue) {\n            if (!isObject(newValue)) {\n              //primitive\n              veryOldValue = newValue;\n            } else if (isArrayLike(newValue)) {\n              veryOldValue = new Array(newValue.length);\n              for (var i = 0; i < newValue.length; i++) {\n                veryOldValue[i] = newValue[i];\n              }\n            } else { // if object\n              veryOldValue = {};\n              for (var key in newValue) {\n                if (hasOwnProperty.call(newValue, key)) {\n                  veryOldValue[key] = newValue[key];\n                }\n              }\n            }\n          }\n        }\n\n        return this.$watch(changeDetector, $watchCollectionAction);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$digest\n       * @kind function\n       *\n       * @description\n       * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and\n       * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change\n       * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}\n       * until no more listeners are firing. This means that it is possible to get into an infinite\n       * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of\n       * iterations exceeds 10.\n       *\n       * Usually, you don't call `$digest()` directly in\n       * {@link ng.directive:ngController controllers} or in\n       * {@link ng.$compileProvider#directive directives}.\n       * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within\n       * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.\n       *\n       * If you want to be notified whenever `$digest()` is called,\n       * you can register a `watchExpression` function with\n       * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.\n       *\n       * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.\n       *\n       * @example\n       * ```js\n           var scope = ...;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n       * ```\n       *\n       */\n      $digest: function() {\n        var watch, value, last, fn, get,\n            watchers,\n            dirty, ttl = TTL,\n            next, current, target = asyncQueue.length ? $rootScope : this,\n            watchLog = [],\n            logIdx, asyncTask;\n\n        beginPhase('$digest');\n        // Check for changes to browser url that happened in sync before the call to $digest\n        $browser.$$checkUrlChange();\n\n        if (this === $rootScope && applyAsyncId !== null) {\n          // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then\n          // cancel the scheduled $apply and flush the queue of expressions to be evaluated.\n          $browser.defer.cancel(applyAsyncId);\n          flushApplyAsync();\n        }\n\n        lastDirtyWatch = null;\n\n        do { // \"while dirty\" loop\n          dirty = false;\n          current = target;\n\n          // It's safe for asyncQueuePosition to be a local variable here because this loop can't\n          // be reentered recursively. Calling $digest from a function passed to $evalAsync would\n          // lead to a '$digest already in progress' error.\n          for (var asyncQueuePosition = 0; asyncQueuePosition < asyncQueue.length; asyncQueuePosition++) {\n            try {\n              asyncTask = asyncQueue[asyncQueuePosition];\n              fn = asyncTask.fn;\n              fn(asyncTask.scope, asyncTask.locals);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n            lastDirtyWatch = null;\n          }\n          asyncQueue.length = 0;\n\n          traverseScopesLoop:\n          do { // \"traverse the scopes\" loop\n            if ((watchers = !current.$$suspended && current.$$watchers)) {\n              // process our watches\n              watchers.$$digestWatchIndex = watchers.length;\n              while (watchers.$$digestWatchIndex--) {\n                try {\n                  watch = watchers[watchers.$$digestWatchIndex];\n                  // Most common watches are on primitives, in which case we can short\n                  // circuit it with === operator, only when === fails do we use .equals\n                  if (watch) {\n                    get = watch.get;\n                    if ((value = get(current)) !== (last = watch.last) &&\n                        !(watch.eq\n                            ? equals(value, last)\n                            : (isNumberNaN(value) && isNumberNaN(last)))) {\n                      dirty = true;\n                      lastDirtyWatch = watch;\n                      watch.last = watch.eq ? copy(value, null) : value;\n                      fn = watch.fn;\n                      fn(value, ((last === initWatchVal) ? value : last), current);\n                      if (ttl < 5) {\n                        logIdx = 4 - ttl;\n                        if (!watchLog[logIdx]) watchLog[logIdx] = [];\n                        watchLog[logIdx].push({\n                          msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,\n                          newVal: value,\n                          oldVal: last\n                        });\n                      }\n                    } else if (watch === lastDirtyWatch) {\n                      // If the most recently dirty watcher is now clean, short circuit since the remaining watchers\n                      // have already been tested.\n                      dirty = false;\n                      break traverseScopesLoop;\n                    }\n                  }\n                } catch (e) {\n                  $exceptionHandler(e);\n                }\n              }\n            }\n\n            // Insanity Warning: scope depth-first traversal\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\n            // this piece should be kept in sync with the traversal in $broadcast\n            // (though it differs due to having the extra check for $$suspended and does not\n            // check $$listenerCount)\n            if (!(next = ((!current.$$suspended && current.$$watchersCount && current.$$childHead) ||\n                (current !== target && current.$$nextSibling)))) {\n              while (current !== target && !(next = current.$$nextSibling)) {\n                current = current.$parent;\n              }\n            }\n          } while ((current = next));\n\n          // `break traverseScopesLoop;` takes us to here\n\n          if ((dirty || asyncQueue.length) && !(ttl--)) {\n            clearPhase();\n            throw $rootScopeMinErr('infdig',\n                '{0} $digest() iterations reached. Aborting!\\n' +\n                'Watchers fired in the last 5 iterations: {1}',\n                TTL, watchLog);\n          }\n\n        } while (dirty || asyncQueue.length);\n\n        clearPhase();\n\n        // postDigestQueuePosition isn't local here because this loop can be reentered recursively.\n        while (postDigestQueuePosition < postDigestQueue.length) {\n          try {\n            postDigestQueue[postDigestQueuePosition++]();\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        }\n        postDigestQueue.length = postDigestQueuePosition = 0;\n\n        // Check for changes to browser url that happened during the $digest\n        // (for which no event is fired; e.g. via `history.pushState()`)\n        $browser.$$checkUrlChange();\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$suspend\n       * @kind function\n       *\n       * @description\n       * Suspend watchers of this scope subtree so that they will not be invoked during digest.\n       *\n       * This can be used to optimize your application when you know that running those watchers\n       * is redundant.\n       *\n       * **Warning**\n       *\n       * Suspending scopes from the digest cycle can have unwanted and difficult to debug results.\n       * Only use this approach if you are confident that you know what you are doing and have\n       * ample tests to ensure that bindings get updated as you expect.\n       *\n       * Some of the things to consider are:\n       *\n       * * Any external event on a directive/component will not trigger a digest while the hosting\n       *   scope is suspended - even if the event handler calls `$apply()` or `$rootScope.$digest()`.\n       * * Transcluded content exists on a scope that inherits from outside a directive but exists\n       *   as a child of the directive's containing scope. If the containing scope is suspended the\n       *   transcluded scope will also be suspended, even if the scope from which the transcluded\n       *   scope inherits is not suspended.\n       * * Multiple directives trying to manage the suspended status of a scope can confuse each other:\n       *    * A call to `$suspend()` on an already suspended scope is a no-op.\n       *    * A call to `$resume()` on a non-suspended scope is a no-op.\n       *    * If two directives suspend a scope, then one of them resumes the scope, the scope will no\n       *      longer be suspended. This could result in the other directive believing a scope to be\n       *      suspended when it is not.\n       * * If a parent scope is suspended then all its descendants will be also excluded from future\n       *   digests whether or not they have been suspended themselves. Note that this also applies to\n       *   isolate child scopes.\n       * * Calling `$digest()` directly on a descendant of a suspended scope will still run the watchers\n       *   for that scope and its descendants. When digesting we only check whether the current scope is\n       *   locally suspended, rather than checking whether it has a suspended ancestor.\n       * * Calling `$resume()` on a scope that has a suspended ancestor will not cause the scope to be\n       *   included in future digests until all its ancestors have been resumed.\n       * * Resolved promises, e.g. from explicit `$q` deferreds and `$http` calls, trigger `$apply()`\n       *   against the `$rootScope` and so will still trigger a global digest even if the promise was\n       *   initiated by a component that lives on a suspended scope.\n       */\n      $suspend: function() {\n        this.$$suspended = true;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$isSuspended\n       * @kind function\n       *\n       * @description\n       * Call this method to determine if this scope has been explicitly suspended. It will not\n       * tell you whether an ancestor has been suspended.\n       * To determine if this scope will be excluded from a digest triggered at the $rootScope,\n       * for example, you must check all its ancestors:\n       *\n       * ```\n       * function isExcludedFromDigest(scope) {\n       *   while(scope) {\n       *     if (scope.$isSuspended()) return true;\n       *     scope = scope.$parent;\n       *   }\n       *   return false;\n       * ```\n       *\n       * Be aware that a scope may not be included in digests if it has a suspended ancestor,\n       * even if `$isSuspended()` returns false.\n       *\n       * @returns true if the current scope has been suspended.\n       */\n      $isSuspended: function() {\n        return this.$$suspended;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$resume\n       * @kind function\n       *\n       * @description\n       * Resume watchers of this scope subtree in case it was suspended.\n       *\n       * See {@link $rootScope.Scope#$suspend} for information about the dangers of using this approach.\n       */\n      $resume: function() {\n        this.$$suspended = false;\n      },\n\n      /**\n       * @ngdoc event\n       * @name $rootScope.Scope#$destroy\n       * @eventType broadcast on scope being destroyed\n       *\n       * @description\n       * Broadcasted when a scope and its children are being destroyed.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$destroy\n       * @kind function\n       *\n       * @description\n       * Removes the current scope (and all of its children) from the parent scope. Removal implies\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\n       * propagate to the current scope and its children. Removal also implies that the current\n       * scope is eligible for garbage collection.\n       *\n       * The `$destroy()` is usually used by directives such as\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\n       * unrolling of the loop.\n       *\n       * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.\n       * Application code can register a `$destroy` event handler that will give it a chance to\n       * perform any necessary cleanup.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n      $destroy: function() {\n        // We can't destroy a scope that has been already destroyed.\n        if (this.$$destroyed) return;\n        var parent = this.$parent;\n\n        this.$broadcast('$destroy');\n        this.$$destroyed = true;\n\n        if (this === $rootScope) {\n          //Remove handlers attached to window when $rootScope is removed\n          $browser.$$applicationDestroyed();\n        }\n\n        incrementWatchersCount(this, -this.$$watchersCount);\n        for (var eventName in this.$$listenerCount) {\n          decrementListenerCount(this, this.$$listenerCount[eventName], eventName);\n        }\n\n        // sever all the references to parent scopes (after this cleanup, the current scope should\n        // not be retained by any of our references and should be eligible for garbage collection)\n        if (parent && parent.$$childHead === this) parent.$$childHead = this.$$nextSibling;\n        if (parent && parent.$$childTail === this) parent.$$childTail = this.$$prevSibling;\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\n\n        // Disable listeners, watchers and apply/digest methods\n        this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;\n        this.$on = this.$watch = this.$watchGroup = function() { return noop; };\n        this.$$listeners = {};\n\n        // Disconnect the next sibling to prevent `cleanUpScope` destroying those too\n        this.$$nextSibling = null;\n        cleanUpScope(this);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$eval\n       * @kind function\n       *\n       * @description\n       * Executes the `expression` on the current scope and returns the result. Any exceptions in\n       * the expression are propagated (uncaught). This is useful when evaluating AngularJS\n       * expressions.\n       *\n       * @example\n       * ```js\n           var scope = ng.$rootScope.Scope();\n           scope.a = 1;\n           scope.b = 2;\n\n           expect(scope.$eval('a+b')).toEqual(3);\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\n       * ```\n       *\n       * @param {(string|function())=} expression An AngularJS expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       * @returns {*} The result of evaluating the expression.\n       */\n      $eval: function(expr, locals) {\n        return $parse(expr)(this, locals);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$evalAsync\n       * @kind function\n       *\n       * @description\n       * Executes the expression on the current scope at a later point in time.\n       *\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only\n       * that:\n       *\n       *   - it will execute after the function that scheduled the evaluation (preferably before DOM\n       *     rendering).\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\n       *     `expression` execution.\n       *\n       * Any exceptions from the execution of the expression are forwarded to the\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle\n       * will be scheduled. However, it is encouraged to always call code that changes the model\n       * from within an `$apply` call. That includes code evaluated via `$evalAsync`.\n       *\n       * @param {(string|function())=} expression An AngularJS expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       */\n      $evalAsync: function(expr, locals) {\n        // if we are outside of an $digest loop and this is the first time we are scheduling async\n        // task also schedule async auto-flush\n        if (!$rootScope.$$phase && !asyncQueue.length) {\n          $browser.defer(function() {\n            if (asyncQueue.length) {\n              $rootScope.$digest();\n            }\n          }, null, '$evalAsync');\n        }\n\n        asyncQueue.push({scope: this, fn: $parse(expr), locals: locals});\n      },\n\n      $$postDigest: function(fn) {\n        postDigestQueue.push(fn);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$apply\n       * @kind function\n       *\n       * @description\n       * `$apply()` is used to execute an expression in AngularJS from outside of the AngularJS\n       * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).\n       * Because we are calling into the AngularJS framework we need to perform proper scope life\n       * cycle of {@link ng.$exceptionHandler exception handling},\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\n       *\n       * **Life cycle: Pseudo-Code of `$apply()`**\n       *\n       * ```js\n           function $apply(expr) {\n             try {\n               return $eval(expr);\n             } catch (e) {\n               $exceptionHandler(e);\n             } finally {\n               $root.$digest();\n             }\n           }\n       * ```\n       *\n       *\n       * Scope's `$apply()` method transitions through the following stages:\n       *\n       * 1. The {@link guide/expression expression} is executed using the\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\n       * 2. Any exceptions from the execution of the expression are forwarded to the\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the\n       *    expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\n       *\n       *\n       * @param {(string|function())=} exp An AngularJS expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       *\n       * @returns {*} The result of evaluating the expression.\n       */\n      $apply: function(expr) {\n        try {\n          beginPhase('$apply');\n          try {\n            return this.$eval(expr);\n          } finally {\n            clearPhase();\n          }\n        } catch (e) {\n          $exceptionHandler(e);\n        } finally {\n          try {\n            $rootScope.$digest();\n          } catch (e) {\n            $exceptionHandler(e);\n            // eslint-disable-next-line no-unsafe-finally\n            throw e;\n          }\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$applyAsync\n       * @kind function\n       *\n       * @description\n       * Schedule the invocation of $apply to occur at a later time. The actual time difference\n       * varies across browsers, but is typically around ~10 milliseconds.\n       *\n       * This can be used to queue up multiple expressions which need to be evaluated in the same\n       * digest.\n       *\n       * @param {(string|function())=} exp An AngularJS expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       */\n      $applyAsync: function(expr) {\n        var scope = this;\n        if (expr) {\n          applyAsyncQueue.push($applyAsyncExpression);\n        }\n        expr = $parse(expr);\n        scheduleApplyAsync();\n\n        function $applyAsyncExpression() {\n          scope.$eval(expr);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$on\n       * @kind function\n       *\n       * @description\n       * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for\n       * discussion of event life cycle.\n       *\n       * The event listener function format is: `function(event, args...)`. The `event` object\n       * passed into the listener has the following attributes:\n       *\n       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or\n       *     `$broadcast`-ed.\n       *   - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the\n       *     event propagates through the scope hierarchy, this property is set to null.\n       *   - `name` - `{string}`: name of the event.\n       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel\n       *     further event propagation (available only for events that were `$emit`-ed).\n       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag\n       *     to true.\n       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.\n       *\n       * @param {string} name Event name to listen on.\n       * @param {function(event, ...args)} listener Function to call when the event is emitted.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $on: function(name, listener) {\n        var namedListeners = this.$$listeners[name];\n        if (!namedListeners) {\n          this.$$listeners[name] = namedListeners = [];\n        }\n        namedListeners.push(listener);\n\n        var current = this;\n        do {\n          if (!current.$$listenerCount[name]) {\n            current.$$listenerCount[name] = 0;\n          }\n          current.$$listenerCount[name]++;\n        } while ((current = current.$parent));\n\n        var self = this;\n        return function() {\n          var indexOfListener = namedListeners.indexOf(listener);\n          if (indexOfListener !== -1) {\n            // Use delete in the hope of the browser deallocating the memory for the array entry,\n            // while not shifting the array indexes of other listeners.\n            // See issue https://github.com/angular/angular.js/issues/16135\n            delete namedListeners[indexOfListener];\n            decrementListenerCount(self, 1, name);\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$emit\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$emit` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event traverses upwards toward the root scope and calls all\n       * registered listeners along the way. The event will stop propagating if one of the listeners\n       * cancels it.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to emit.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).\n       */\n      $emit: function(name, args) {\n        var empty = [],\n            namedListeners,\n            scope = this,\n            stopPropagation = false,\n            event = {\n              name: name,\n              targetScope: scope,\n              stopPropagation: function() {stopPropagation = true;},\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            i, length;\n\n        do {\n          namedListeners = scope.$$listeners[name] || empty;\n          event.currentScope = scope;\n          for (i = 0, length = namedListeners.length; i < length; i++) {\n\n            // if listeners were deregistered, defragment the array\n            if (!namedListeners[i]) {\n              namedListeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n            try {\n              //allow all listeners attached to the current scope to run\n              namedListeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          //if any listener on the current scope stops propagation, prevent bubbling\n          if (stopPropagation) {\n            break;\n          }\n          //traverse upwards\n          scope = scope.$parent;\n        } while (scope);\n\n        event.currentScope = null;\n\n        return event;\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$broadcast\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event propagates to all direct and indirect scopes of the current\n       * scope and calls all registered listeners along the way. The event cannot be canceled.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to broadcast.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\n       */\n      $broadcast: function(name, args) {\n        var target = this,\n            current = target,\n            next = target,\n            event = {\n              name: name,\n              targetScope: target,\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            };\n\n        if (!target.$$listenerCount[name]) return event;\n\n        var listenerArgs = concat([event], arguments, 1),\n            listeners, i, length;\n\n        //down while you can, then up and next sibling or up and next sibling until back at root\n        while ((current = next)) {\n          event.currentScope = current;\n          listeners = current.$$listeners[name] || [];\n          for (i = 0, length = listeners.length; i < length; i++) {\n            // if listeners were deregistered, defragment the array\n            if (!listeners[i]) {\n              listeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n\n            try {\n              listeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n\n          // Insanity Warning: scope depth-first traversal\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\n          // this piece should be kept in sync with the traversal in $digest\n          // (though it differs due to having the extra check for $$listenerCount and\n          // does not check $$suspended)\n          if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||\n              (current !== target && current.$$nextSibling)))) {\n            while (current !== target && !(next = current.$$nextSibling)) {\n              current = current.$parent;\n            }\n          }\n        }\n\n        event.currentScope = null;\n        return event;\n      }\n    };\n\n    var $rootScope = new Scope();\n\n    //The internal queues. Expose them on the $rootScope for debugging/testing purposes.\n    var asyncQueue = $rootScope.$$asyncQueue = [];\n    var postDigestQueue = $rootScope.$$postDigestQueue = [];\n    var applyAsyncQueue = $rootScope.$$applyAsyncQueue = [];\n\n    var postDigestQueuePosition = 0;\n\n    return $rootScope;\n\n\n    function beginPhase(phase) {\n      if ($rootScope.$$phase) {\n        throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);\n      }\n\n      $rootScope.$$phase = phase;\n    }\n\n    function clearPhase() {\n      $rootScope.$$phase = null;\n    }\n\n    function incrementWatchersCount(current, count) {\n      do {\n        current.$$watchersCount += count;\n      } while ((current = current.$parent));\n    }\n\n    function decrementListenerCount(current, count, name) {\n      do {\n        current.$$listenerCount[name] -= count;\n\n        if (current.$$listenerCount[name] === 0) {\n          delete current.$$listenerCount[name];\n        }\n      } while ((current = current.$parent));\n    }\n\n    /**\n     * function used as an initial value for watchers.\n     * because it's unique we can easily tell it apart from other values\n     */\n    function initWatchVal() {}\n\n    function flushApplyAsync() {\n      while (applyAsyncQueue.length) {\n        try {\n          applyAsyncQueue.shift()();\n        } catch (e) {\n          $exceptionHandler(e);\n        }\n      }\n      applyAsyncId = null;\n    }\n\n    function scheduleApplyAsync() {\n      if (applyAsyncId === null) {\n        applyAsyncId = $browser.defer(function() {\n          $rootScope.$apply(flushApplyAsync);\n        }, null, '$applyAsync');\n      }\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $rootElement\n *\n * @description\n * The root element of AngularJS application. This is either the element where {@link\n * ng.directive:ngApp ngApp} was declared or the element passed into\n * {@link angular.bootstrap}. The element represents the root element of application. It is also the\n * location where the application's {@link auto.$injector $injector} service gets\n * published, and can be retrieved using `$rootElement.injector()`.\n */\n\n\n// the implementation is in angular.bootstrap\n\n/**\n * @this\n * @description\n * Private service to sanitize uris for links and images. Used by $compile and $sanitize.\n */\nfunction $$SanitizeUriProvider() {\n\n  var aHrefSanitizationWhitelist = /^\\s*(https?|s?ftp|mailto|tel|file):/,\n    imgSrcSanitizationWhitelist = /^\\s*((https?|ftp|file|blob):|data:image\\/)/;\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via HTML anchor links.\n   *\n   * Any url due to be assigned to an `a[href]` attribute via interpolation is marked as requiring\n   * the $sce.URL security context. When interpolation occurs a call is made to `$sce.trustAsUrl(url)`\n   * which in turn may call `$$sanitizeUri(url, isMedia)` to sanitize the potentially malicious URL.\n   *\n   * If the URL matches the `aHrefSanitizationWhitelist` regular expression, it is returned unchanged.\n   *\n   * If there is no match the URL is returned prefixed with `'unsafe:'` to ensure that when it is written\n   * to the DOM it is inactive and potentially malicious code will not be executed.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      aHrefSanitizationWhitelist = regexp;\n      return this;\n    }\n    return aHrefSanitizationWhitelist;\n  };\n\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via HTML image src links.\n   *\n   * Any URL due to be assigned to an `img[src]` attribute via interpolation is marked as requiring\n   * the $sce.MEDIA_URL security context. When interpolation occurs a call is made to\n   * `$sce.trustAsMediaUrl(url)` which in turn may call `$$sanitizeUri(url, isMedia)` to sanitize\n   * the potentially malicious URL.\n   *\n   * If the URL matches the `aImgSanitizationWhitelist` regular expression, it is returned unchanged.\n   *\n   * If there is no match the URL is returned prefixed with `'unsafe:'` to ensure that when it is written\n   * to the DOM it is inactive and potentially malicious code will not be executed.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      imgSrcSanitizationWhitelist = regexp;\n      return this;\n    }\n    return imgSrcSanitizationWhitelist;\n  };\n\n  this.$get = function() {\n    return function sanitizeUri(uri, isMediaUrl) {\n      // if (!uri) return uri;\n      var regex = isMediaUrl ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;\n      var normalizedVal = urlResolve(uri && uri.trim()).href;\n      if (normalizedVal !== '' && !normalizedVal.match(regex)) {\n        return 'unsafe:' + normalizedVal;\n      }\n      return uri;\n    };\n  };\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* exported $SceProvider, $SceDelegateProvider */\n\nvar $sceMinErr = minErr('$sce');\n\nvar SCE_CONTEXTS = {\n  // HTML is used when there's HTML rendered (e.g. ng-bind-html, iframe srcdoc binding).\n  HTML: 'html',\n\n  // Style statements or stylesheets. Currently unused in AngularJS.\n  CSS: 'css',\n\n  // An URL used in a context where it refers to the source of media, which are not expected to be run\n  // as scripts, such as an image, audio, video, etc.\n  MEDIA_URL: 'mediaUrl',\n\n  // An URL used in a context where it does not refer to a resource that loads code.\n  // A value that can be trusted as a URL can also trusted as a MEDIA_URL.\n  URL: 'url',\n\n  // RESOURCE_URL is a subtype of URL used where the referred-to resource could be interpreted as\n  // code. (e.g. ng-include, script src binding, templateUrl)\n  // A value that can be trusted as a RESOURCE_URL, can also trusted as a URL and a MEDIA_URL.\n  RESOURCE_URL: 'resourceUrl',\n\n  // Script. Currently unused in AngularJS.\n  JS: 'js'\n};\n\n// Helper functions follow.\n\nvar UNDERSCORE_LOWERCASE_REGEXP = /_([a-z])/g;\n\nfunction snakeToCamel(name) {\n  return name\n    .replace(UNDERSCORE_LOWERCASE_REGEXP, fnCamelCaseReplace);\n}\n\nfunction adjustMatcher(matcher) {\n  if (matcher === 'self') {\n    return matcher;\n  } else if (isString(matcher)) {\n    // Strings match exactly except for 2 wildcards - '*' and '**'.\n    // '*' matches any character except those from the set ':/.?&'.\n    // '**' matches any character (like .* in a RegExp).\n    // More than 2 *'s raises an error as it's ill defined.\n    if (matcher.indexOf('***') > -1) {\n      throw $sceMinErr('iwcard',\n          'Illegal sequence *** in string matcher.  String: {0}', matcher);\n    }\n    matcher = escapeForRegexp(matcher).\n                  replace(/\\\\\\*\\\\\\*/g, '.*').\n                  replace(/\\\\\\*/g, '[^:/.?&;]*');\n    return new RegExp('^' + matcher + '$');\n  } else if (isRegExp(matcher)) {\n    // The only other type of matcher allowed is a Regexp.\n    // Match entire URL / disallow partial matches.\n    // Flags are reset (i.e. no global, ignoreCase or multiline)\n    return new RegExp('^' + matcher.source + '$');\n  } else {\n    throw $sceMinErr('imatcher',\n        'Matchers may only be \"self\", string patterns or RegExp objects');\n  }\n}\n\n\nfunction adjustMatchers(matchers) {\n  var adjustedMatchers = [];\n  if (isDefined(matchers)) {\n    forEach(matchers, function(matcher) {\n      adjustedMatchers.push(adjustMatcher(matcher));\n    });\n  }\n  return adjustedMatchers;\n}\n\n\n/**\n * @ngdoc service\n * @name $sceDelegate\n * @kind function\n *\n * @description\n *\n * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict\n * Contextual Escaping (SCE)} services to AngularJS.\n *\n * For an overview of this service and the functionnality it provides in AngularJS, see the main\n * page for {@link ng.$sce SCE}. The current page is targeted for developers who need to alter how\n * SCE works in their application, which shouldn't be needed in most cases.\n *\n * <div class=\"alert alert-danger\">\n * AngularJS strongly relies on contextual escaping for the security of bindings: disabling or\n * modifying this might cause cross site scripting (XSS) vulnerabilities. For libraries owners,\n * changes to this service will also influence users, so be extra careful and document your changes.\n * </div>\n *\n * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of\n * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is\n * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to\n * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things\n * work because `$sce` delegates to `$sceDelegate` for these operations.\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.\n *\n * The default instance of `$sceDelegate` should work out of the box with little pain.  While you\n * can override it completely to change the behavior of `$sce`, the common case would\n * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting\n * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as\n * templates.  Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist\n * $sceDelegateProvider.resourceUrlWhitelist} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n */\n\n/**\n * @ngdoc provider\n * @name $sceDelegateProvider\n * @this\n *\n * @description\n *\n * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate\n * $sceDelegate service}, used as a delegate for {@link ng.$sce Strict Contextual Escaping (SCE)}.\n *\n * The `$sceDelegateProvider` allows one to get/set the whitelists and blacklists used to ensure\n * that the URLs used for sourcing AngularJS templates and other script-running URLs are safe (all\n * places that use the `$sce.RESOURCE_URL` context). See\n * {@link ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist}\n * and\n * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist},\n *\n * For the general details about this service in AngularJS, read the main page for {@link ng.$sce\n * Strict Contextual Escaping (SCE)}.\n *\n * **Example**:  Consider the following case. <a name=\"example\"></a>\n *\n * - your app is hosted at url `http://myapp.example.com/`\n * - but some of your templates are hosted on other domains you control such as\n *   `http://srv01.assets.example.com/`, `http://srv02.assets.example.com/`, etc.\n * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.\n *\n * Here is what a secure configuration for this scenario might look like:\n *\n * ```\n *  angular.module('myApp', []).config(function($sceDelegateProvider) {\n *    $sceDelegateProvider.resourceUrlWhitelist([\n *      // Allow same origin resource loads.\n *      'self',\n *      // Allow loading from our assets domain.  Notice the difference between * and **.\n *      'http://srv*.assets.example.com/**'\n *    ]);\n *\n *    // The blacklist overrides the whitelist so the open redirect here is blocked.\n *    $sceDelegateProvider.resourceUrlBlacklist([\n *      'http://myapp.example.com/clickThru**'\n *    ]);\n *  });\n * ```\n * Note that an empty whitelist will block every resource URL from being loaded, and will require\n * you to manually mark each one as trusted with `$sce.trustAsResourceUrl`. However, templates\n * requested by {@link ng.$templateRequest $templateRequest} that are present in\n * {@link ng.$templateCache $templateCache} will not go through this check. If you have a mechanism\n * to populate your templates in that cache at config time, then it is a good idea to remove 'self'\n * from that whitelist. This helps to mitigate the security impact of certain types of issues, like\n * for instance attacker-controlled `ng-includes`.\n */\n\nfunction $SceDelegateProvider() {\n  this.SCE_CONTEXTS = SCE_CONTEXTS;\n\n  // Resource URLs can also be trusted by policy.\n  var resourceUrlWhitelist = ['self'],\n      resourceUrlBlacklist = [];\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlWhitelist\n   * @kind function\n   *\n   * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   * @return {Array} The currently set whitelist array.\n   *\n   * @description\n   * Sets/Gets the whitelist of trusted resource URLs.\n   *\n   * The **default value** when no whitelist has been explicitly set is `['self']` allowing only\n   * same origin resource requests.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** the default whitelist of 'self' is not recommended if your app shares its origin\n   * with other apps! It is a good idea to limit it to only your application's directory.\n   * </div>\n   */\n  this.resourceUrlWhitelist = function(value) {\n    if (arguments.length) {\n      resourceUrlWhitelist = adjustMatchers(value);\n    }\n    return resourceUrlWhitelist;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlBlacklist\n   * @kind function\n   *\n   * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.</p><p>\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.</p><p>\n   *     The typical usage for the blacklist is to **block\n   *     [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as\n   *     these would otherwise be trusted but actually return content from the redirected domain.\n   *     </p><p>\n   *     Finally, **the blacklist overrides the whitelist** and has the final say.\n   *\n   * @return {Array} The currently set blacklist array.\n   *\n   * @description\n   * Sets/Gets the blacklist of trusted resource URLs.\n   *\n   * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there\n   * is no blacklist.)\n   */\n\n  this.resourceUrlBlacklist = function(value) {\n    if (arguments.length) {\n      resourceUrlBlacklist = adjustMatchers(value);\n    }\n    return resourceUrlBlacklist;\n  };\n\n  this.$get = ['$injector', '$$sanitizeUri', function($injector, $$sanitizeUri) {\n\n    var htmlSanitizer = function htmlSanitizer(html) {\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    };\n\n    if ($injector.has('$sanitize')) {\n      htmlSanitizer = $injector.get('$sanitize');\n    }\n\n\n    function matchUrl(matcher, parsedUrl) {\n      if (matcher === 'self') {\n        return urlIsSameOrigin(parsedUrl) || urlIsSameOriginAsBaseUrl(parsedUrl);\n      } else {\n        // definitely a regex.  See adjustMatchers()\n        return !!matcher.exec(parsedUrl.href);\n      }\n    }\n\n    function isResourceUrlAllowedByPolicy(url) {\n      var parsedUrl = urlResolve(url.toString());\n      var i, n, allowed = false;\n      // Ensure that at least one item from the whitelist allows this url.\n      for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {\n        if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {\n          allowed = true;\n          break;\n        }\n      }\n      if (allowed) {\n        // Ensure that no item from the blacklist blocked this url.\n        for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {\n          if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {\n            allowed = false;\n            break;\n          }\n        }\n      }\n      return allowed;\n    }\n\n    function generateHolderType(Base) {\n      var holderType = function TrustedValueHolderType(trustedValue) {\n        this.$$unwrapTrustedValue = function() {\n          return trustedValue;\n        };\n      };\n      if (Base) {\n        holderType.prototype = new Base();\n      }\n      holderType.prototype.valueOf = function sceValueOf() {\n        return this.$$unwrapTrustedValue();\n      };\n      holderType.prototype.toString = function sceToString() {\n        return this.$$unwrapTrustedValue().toString();\n      };\n      return holderType;\n    }\n\n    var trustedValueHolderBase = generateHolderType(),\n        byType = {};\n\n    byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.MEDIA_URL] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.URL] = generateHolderType(byType[SCE_CONTEXTS.MEDIA_URL]);\n    byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#trustAs\n     *\n     * @description\n     * Returns a trusted representation of the parameter for the specified context. This trusted\n     * object will later on be used as-is, without any security check, by bindings or directives\n     * that require this security context.\n     * For instance, marking a string as trusted for the `$sce.HTML` context will entirely bypass\n     * the potential `$sanitize` call in corresponding `$sce.HTML` bindings or directives, such as\n     * `ng-bind-html`. Note that in most cases you won't need to call this function: if you have the\n     * sanitizer loaded, passing the value itself will render all the HTML that does not pose a\n     * security risk.\n     *\n     * See {@link ng.$sceDelegate#getTrusted getTrusted} for the function that will consume those\n     * trusted values, and {@link ng.$sce $sce} for general documentation about strict contextual\n     * escaping.\n     *\n     * @param {string} type The context in which this value is safe for use, e.g. `$sce.URL`,\n     *     `$sce.RESOURCE_URL`, `$sce.HTML`, `$sce.JS` or `$sce.CSS`.\n     *\n     * @param {*} value The value that should be considered trusted.\n     * @return {*} A trusted representation of value, that can be used in the given context.\n     */\n    function trustAs(type, trustedValue) {\n      var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (!Constructor) {\n        throw $sceMinErr('icontext',\n            'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',\n            type, trustedValue);\n      }\n      if (trustedValue === null || isUndefined(trustedValue) || trustedValue === '') {\n        return trustedValue;\n      }\n      // All the current contexts in SCE_CONTEXTS happen to be strings.  In order to avoid trusting\n      // mutable objects, we ensure here that the value passed in is actually a string.\n      if (typeof trustedValue !== 'string') {\n        throw $sceMinErr('itype',\n            'Attempted to trust a non-string value in a content requiring a string: Context: {0}',\n            type);\n      }\n      return new Constructor(trustedValue);\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#valueOf\n     *\n     * @description\n     * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs\n     * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.\n     *\n     * If the passed parameter is not a value that had been returned by {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, it must be returned as-is.\n     *\n     * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}\n     *     call or anything else.\n     * @return {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns\n     *     `value` unchanged.\n     */\n    function valueOf(maybeTrusted) {\n      if (maybeTrusted instanceof trustedValueHolderBase) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      } else {\n        return maybeTrusted;\n      }\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#getTrusted\n     *\n     * @description\n     * Given an object and a security context in which to assign it, returns a value that's safe to\n     * use in this context, which was represented by the parameter. To do so, this function either\n     * unwraps the safe type it has been given (for instance, a {@link ng.$sceDelegate#trustAs\n     * `$sceDelegate.trustAs`} result), or it might try to sanitize the value given, depending on\n     * the context and sanitizer availablility.\n     *\n     * The contexts that can be sanitized are $sce.MEDIA_URL, $sce.URL and $sce.HTML. The first two are available\n     * by default, and the third one relies on the `$sanitize` service (which may be loaded through\n     * the `ngSanitize` module). Furthermore, for $sce.RESOURCE_URL context, a plain string may be\n     * accepted if the resource url policy defined by {@link ng.$sceDelegateProvider#resourceUrlWhitelist\n     * `$sceDelegateProvider.resourceUrlWhitelist`} and {@link ng.$sceDelegateProvider#resourceUrlBlacklist\n     * `$sceDelegateProvider.resourceUrlBlacklist`} accepts that resource.\n     *\n     * This function will throw if the safe type isn't appropriate for this context, or if the\n     * value given cannot be accepted in the context (which might be caused by sanitization not\n     * being available, or the value not being recognized as safe).\n     *\n     * <div class=\"alert alert-danger\">\n     * Disabling auto-escaping is extremely dangerous, it usually creates a Cross Site Scripting\n     * (XSS) vulnerability in your application.\n     * </div>\n     *\n     * @param {string} type The context in which this value is to be used (such as `$sce.HTML`).\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} call, or anything else (which will not be considered trusted.)\n     * @return {*} A version of the value that's safe to use in the given context, or throws an\n     *     exception if this is impossible.\n     */\n    function getTrusted(type, maybeTrusted) {\n      if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') {\n        return maybeTrusted;\n      }\n      var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      // If maybeTrusted is a trusted class instance or subclass instance, then unwrap and return\n      // as-is.\n      if (constructor && maybeTrusted instanceof constructor) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      }\n\n      // If maybeTrusted is a trusted class instance but not of the correct trusted type\n      // then unwrap it and allow it to pass through to the rest of the checks\n      if (isFunction(maybeTrusted.$$unwrapTrustedValue)) {\n        maybeTrusted = maybeTrusted.$$unwrapTrustedValue();\n      }\n\n      // If we get here, then we will either sanitize the value or throw an exception.\n      if (type === SCE_CONTEXTS.MEDIA_URL || type === SCE_CONTEXTS.URL) {\n        // we attempt to sanitize non-resource URLs\n        return $$sanitizeUri(maybeTrusted.toString(), type === SCE_CONTEXTS.MEDIA_URL);\n      } else if (type === SCE_CONTEXTS.RESOURCE_URL) {\n        if (isResourceUrlAllowedByPolicy(maybeTrusted)) {\n          return maybeTrusted;\n        } else {\n          throw $sceMinErr('insecurl',\n              'Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}',\n              maybeTrusted.toString());\n        }\n      } else if (type === SCE_CONTEXTS.HTML) {\n        // htmlSanitizer throws its own error when no sanitizer is available.\n        return htmlSanitizer(maybeTrusted);\n      }\n      // Default error when the $sce service has no way to make the input safe.\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    }\n\n    return { trustAs: trustAs,\n             getTrusted: getTrusted,\n             valueOf: valueOf };\n  }];\n}\n\n\n/**\n * @ngdoc provider\n * @name $sceProvider\n * @this\n *\n * @description\n *\n * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.\n * -   enable/disable Strict Contextual Escaping (SCE) in a module\n * -   override the default implementation with a custom delegate\n *\n * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.\n */\n\n/**\n * @ngdoc service\n * @name $sce\n * @kind function\n *\n * @description\n *\n * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.\n *\n * ## Strict Contextual Escaping\n *\n * Strict Contextual Escaping (SCE) is a mode in which AngularJS constrains bindings to only render\n * trusted values. Its goal is to assist in writing code in a way that (a) is secure by default, and\n * (b) makes auditing for security vulnerabilities such as XSS, clickjacking, etc. a lot easier.\n *\n * ### Overview\n *\n * To systematically block XSS security bugs, AngularJS treats all values as untrusted by default in\n * HTML or sensitive URL bindings. When binding untrusted values, AngularJS will automatically\n * run security checks on them (sanitizations, whitelists, depending on context), or throw when it\n * cannot guarantee the security of the result. That behavior depends strongly on contexts: HTML\n * can be sanitized, but template URLs cannot, for instance.\n *\n * To illustrate this, consider the `ng-bind-html` directive. It renders its value directly as HTML:\n * we call that the *context*. When given an untrusted input, AngularJS will attempt to sanitize it\n * before rendering if a sanitizer is available, and throw otherwise. To bypass sanitization and\n * render the input as-is, you will need to mark it as trusted for that context before attempting\n * to bind it.\n *\n * As of version 1.2, AngularJS ships with SCE enabled by default.\n *\n * ### In practice\n *\n * Here's an example of a binding in a privileged context:\n *\n * ```\n * <input ng-model=\"userHtml\" aria-label=\"User input\">\n * <div ng-bind-html=\"userHtml\"></div>\n * ```\n *\n * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE\n * disabled, this application allows the user to render arbitrary HTML into the DIV, which would\n * be an XSS security bug. In a more realistic example, one may be rendering user comments, blog\n * articles, etc. via bindings. (HTML is just one example of a context where rendering user\n * controlled input creates security vulnerabilities.)\n *\n * For the case of HTML, you might use a library, either on the client side, or on the server side,\n * to sanitize unsafe HTML before binding to the value and rendering it in the document.\n *\n * How would you ensure that every place that used these types of bindings was bound to a value that\n * was sanitized by your library (or returned as safe for rendering by your server?)  How can you\n * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some\n * properties/fields and forgot to update the binding to the sanitized value?\n *\n * To be secure by default, AngularJS makes sure bindings go through that sanitization, or\n * any similar validation process, unless there's a good reason to trust the given value in this\n * context.  That trust is formalized with a function call. This means that as a developer, you\n * can assume all untrusted bindings are safe. Then, to audit your code for binding security issues,\n * you just need to ensure the values you mark as trusted indeed are safe - because they were\n * received from your server, sanitized by your library, etc. You can organize your codebase to\n * help with this - perhaps allowing only the files in a specific directory to do this.\n * Ensuring that the internal API exposed by that code doesn't markup arbitrary values as safe then\n * becomes a more manageable task.\n *\n * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}\n * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to\n * build the trusted versions of your values.\n *\n * ### How does it work?\n *\n * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted\n * $sce.getTrusted(context, value)} rather than to the value directly.  Think of this function as\n * a way to enforce the required security context in your data sink. Directives use {@link\n * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs\n * the {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. Also,\n * when binding without directives, AngularJS will understand the context of your bindings\n * automatically.\n *\n * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link\n * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly\n * simplified):\n *\n * ```\n * var ngBindHtmlDirective = ['$sce', function($sce) {\n *   return function(scope, element, attr) {\n *     scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {\n *       element.html(value || '');\n *     });\n *   };\n * }];\n * ```\n *\n * ### Impact on loading templates\n *\n * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as\n * `templateUrl`'s specified by {@link guide/directive directives}.\n *\n * By default, AngularJS only loads templates from the same domain and protocol as the application\n * document.  This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or\n * protocols, you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist\n * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.\n *\n * *Please note*:\n * The browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy apply in addition to this and may further restrict whether the template is successfully\n * loaded.  This means that without the right CORS policy, loading templates from a different domain\n * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some\n * browsers.\n *\n * ### This feels like too much overhead\n *\n * It's important to remember that SCE only applies to interpolation expressions.\n *\n * If your expressions are constant literals, they're automatically trusted and you don't need to\n * call `$sce.trustAs` on them (e.g.\n * `<div ng-bind-html=\"'<b>implicitly trusted</b>'\"></div>`) just works (remember to include the\n * `ngSanitize` module). The `$sceDelegate` will also use the `$sanitize` service if it is available\n * when binding untrusted values to `$sce.HTML` context.\n * AngularJS provides an implementation in `angular-sanitize.js`, and if you\n * wish to use it, you will also need to depend on the {@link ngSanitize `ngSanitize`} module in\n * your application.\n *\n * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load\n * templates in `ng-include` from your application's domain without having to even know about SCE.\n * It blocks loading templates from other domains or loading templates over http from an https\n * served document.  You can change these by setting your own custom {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.\n *\n * This significantly reduces the overhead.  It is far easier to pay the small overhead and have an\n * application that's secure and can be audited to verify that with much more ease than bolting\n * security onto an application later.\n *\n * <a name=\"contexts\"></a>\n * ### What trusted context types are supported?\n *\n * | Context             | Notes          |\n * |---------------------|----------------|\n * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |\n * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently unused.  Feel free to use it in your own directives. |\n * | `$sce.MEDIA_URL`    | For URLs that are safe to render as media. Is automatically converted from string by sanitizing when needed. |\n * | `$sce.URL`          | For URLs that are safe to follow as links. Is automatically converted from string by sanitizing when needed. Note that `$sce.URL` makes a stronger statement about the URL than `$sce.MEDIA_URL` does and therefore contexts requiring values trusted for `$sce.URL` can be used anywhere that values trusted for `$sce.MEDIA_URL` are required.|\n * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` or `$sce.MEDIA_URL` do and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` or `$sce.MEDIA_URL` are required. <br><br> The {@link $sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider#resourceUrlWhitelist()} and {@link $sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider#resourceUrlBlacklist()} can be used to restrict trusted origins for `RESOURCE_URL` |\n * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently unused.  Feel free to use it in your own directives. |\n *\n *\n * <div class=\"alert alert-warning\">\n * Be aware that, before AngularJS 1.7.0, `a[href]` and `img[src]` used to sanitize their\n * interpolated values directly rather than rely upon {@link ng.$sce#getTrusted `$sce.getTrusted`}.\n *\n * **As of 1.7.0, this is no longer the case.**\n *\n * Now such interpolations are marked as requiring `$sce.URL` (for `a[href]`) or `$sce.MEDIA_URL`\n * (for `img[src]`), so that the sanitization happens (via `$sce.getTrusted...`) when the `$interpolate`\n * service evaluates the expressions.\n * </div>\n *\n * There are no CSS or JS context bindings in AngularJS currently, so their corresponding `$sce.trustAs`\n * functions aren't useful yet. This might evolve.\n *\n * ### Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name=\"resourceUrlPatternItem\"></a>\n *\n *  Each element in these arrays must be one of the following:\n *\n *  - **'self'**\n *    - The special **string**, `'self'`, can be used to match against all URLs of the **same\n *      domain** as the application document using the **same protocol**.\n *  - **String** (except the special value `'self'`)\n *    - The string is matched against the full *normalized / absolute URL* of the resource\n *      being tested (substring matches are not good enough.)\n *    - There are exactly **two wildcard sequences** - `*` and `**`.  All other characters\n *      match themselves.\n *    - `*`: matches zero or more occurrences of any character other than one of the following 6\n *      characters: '`:`', '`/`', '`.`', '`?`', '`&`' and '`;`'.  It's a useful wildcard for use\n *      in a whitelist.\n *    - `**`: matches zero or more occurrences of *any* character.  As such, it's not\n *      appropriate for use in a scheme, domain, etc. as it would match too much.  (e.g.\n *      http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might\n *      not have been the intention.)  Its usage at the very end of the path is ok.  (e.g.\n *      http://foo.example.com/templates/**).\n *  - **RegExp** (*see caveat below*)\n *    - *Caveat*:  While regular expressions are powerful and offer great flexibility,  their syntax\n *      (and all the inevitable escaping) makes them *harder to maintain*.  It's easy to\n *      accidentally introduce a bug when one updates a complex expression (imho, all regexes should\n *      have good test coverage).  For instance, the use of `.` in the regex is correct only in a\n *      small number of cases.  A `.` character in the regex used when matching the scheme or a\n *      subdomain could be matched against a `:` or literal `.` that was likely not intended.   It\n *      is highly recommended to use the string patterns and only fall back to regular expressions\n *      as a last resort.\n *    - The regular expression must be an instance of RegExp (i.e. not a string.)  It is\n *      matched against the **entire** *normalized / absolute URL* of the resource being tested\n *      (even when the RegExp did not have the `^` and `$` codes.)  In addition, any flags\n *      present on the RegExp (such as multiline, global, ignoreCase) are ignored.\n *    - If you are generating your JavaScript from some other templating engine (not\n *      recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),\n *      remember to escape your regular expression (and be aware that you might need more than\n *      one level of escaping depending on your templating engine and the way you interpolated\n *      the value.)  Do make use of your platform's escaping mechanism as it might be good\n *      enough before coding your own.  E.g. Ruby has\n *      [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)\n *      and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).\n *      Javascript lacks a similar built in function for escaping.  Take a look at Google\n *      Closure library's [goog.string.regExpEscape(s)](\n *      http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.\n *\n * ### Show me an example using SCE.\n *\n * <example module=\"mySceApp\" deps=\"angular-sanitize.js\" name=\"sce-service\">\n * <file name=\"index.html\">\n *   <div ng-controller=\"AppController as myCtrl\">\n *     <i ng-bind-html=\"myCtrl.explicitlyTrustedHtml\" id=\"explicitlyTrustedHtml\"></i><br><br>\n *     <b>User comments</b><br>\n *     By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when\n *     $sanitize is available.  If $sanitize isn't available, this results in an error instead of an\n *     exploit.\n *     <div class=\"well\">\n *       <div ng-repeat=\"userComment in myCtrl.userComments\">\n *         <b>{{userComment.name}}</b>:\n *         <span ng-bind-html=\"userComment.htmlComment\" class=\"htmlComment\"></span>\n *         <br>\n *       </div>\n *     </div>\n *   </div>\n * </file>\n *\n * <file name=\"script.js\">\n *   angular.module('mySceApp', ['ngSanitize'])\n *     .controller('AppController', ['$http', '$templateCache', '$sce',\n *       function AppController($http, $templateCache, $sce) {\n *         var self = this;\n *         $http.get('test_data.json', {cache: $templateCache}).then(function(response) {\n *           self.userComments = response.data;\n *         });\n *         self.explicitlyTrustedHtml = $sce.trustAsHtml(\n *             '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *             'sanitization.&quot;\">Hover over this text.</span>');\n *       }]);\n * </file>\n *\n * <file name=\"test_data.json\">\n * [\n *   { \"name\": \"Alice\",\n *     \"htmlComment\":\n *         \"<span onmouseover='this.textContent=\\\"PWN3D!\\\"'>Is <i>anyone</i> reading this?</span>\"\n *   },\n *   { \"name\": \"Bob\",\n *     \"htmlComment\": \"<i>Yes!</i>  Am I the only other one?\"\n *   }\n * ]\n * </file>\n *\n * <file name=\"protractor.js\" type=\"protractor\">\n *   describe('SCE doc demo', function() {\n *     it('should sanitize untrusted values', function() {\n *       expect(element.all(by.css('.htmlComment')).first().getAttribute('innerHTML'))\n *           .toBe('<span>Is <i>anyone</i> reading this?</span>');\n *     });\n *\n *     it('should NOT sanitize explicitly trusted values', function() {\n *       expect(element(by.id('explicitlyTrustedHtml')).getAttribute('innerHTML')).toBe(\n *           '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *           'sanitization.&quot;\">Hover over this text.</span>');\n *     });\n *   });\n * </file>\n * </example>\n *\n *\n *\n * ## Can I disable SCE completely?\n *\n * Yes, you can.  However, this is strongly discouraged.  SCE gives you a lot of security benefits\n * for little coding overhead.  It will be much harder to take an SCE disabled application and\n * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE\n * for cases where you have a lot of existing code that was written before SCE was introduced and\n * you're migrating them a module at a time. Also do note that this is an app-wide setting, so if\n * you are writing a library, you will cause security bugs applications using it.\n *\n * That said, here's how you can completely disable SCE:\n *\n * ```\n * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {\n *   // Completely disable SCE.  For demonstration purposes only!\n *   // Do not use in new projects or libraries.\n *   $sceProvider.enabled(false);\n * });\n * ```\n *\n */\n\nfunction $SceProvider() {\n  var enabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $sceProvider#enabled\n   * @kind function\n   *\n   * @param {boolean=} value If provided, then enables/disables SCE application-wide.\n   * @return {boolean} True if SCE is enabled, false otherwise.\n   *\n   * @description\n   * Enables/disables SCE and returns the current value.\n   */\n  this.enabled = function(value) {\n    if (arguments.length) {\n      enabled = !!value;\n    }\n    return enabled;\n  };\n\n\n  /* Design notes on the default implementation for SCE.\n   *\n   * The API contract for the SCE delegate\n   * -------------------------------------\n   * The SCE delegate object must provide the following 3 methods:\n   *\n   * - trustAs(contextEnum, value)\n   *     This method is used to tell the SCE service that the provided value is OK to use in the\n   *     contexts specified by contextEnum.  It must return an object that will be accepted by\n   *     getTrusted() for a compatible contextEnum and return this value.\n   *\n   * - valueOf(value)\n   *     For values that were not produced by trustAs(), return them as is.  For values that were\n   *     produced by trustAs(), return the corresponding input value to trustAs.  Basically, if\n   *     trustAs is wrapping the given values into some type, this operation unwraps it when given\n   *     such a value.\n   *\n   * - getTrusted(contextEnum, value)\n   *     This function should return the value that is safe to use in the context specified by\n   *     contextEnum or throw and exception otherwise.\n   *\n   * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be\n   * opaque or wrapped in some holder object.  That happens to be an implementation detail.  For\n   * instance, an implementation could maintain a registry of all trusted objects by context.  In\n   * such a case, trustAs() would return the same object that was passed in.  getTrusted() would\n   * return the same object passed in if it was found in the registry under a compatible context or\n   * throw an exception otherwise.  An implementation might only wrap values some of the time based\n   * on some criteria.  getTrusted() might return a value and not throw an exception for special\n   * constants or objects even if not wrapped.  All such implementations fulfill this contract.\n   *\n   *\n   * A note on the inheritance model for SCE contexts\n   * ------------------------------------------------\n   * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types.  This\n   * is purely an implementation details.\n   *\n   * The contract is simply this:\n   *\n   *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)\n   *     will also succeed.\n   *\n   * Inheritance happens to capture this in a natural way. In some future, we may not use\n   * inheritance anymore. That is OK because no code outside of sce.js and sceSpecs.js would need to\n   * be aware of this detail.\n   */\n\n  this.$get = ['$parse', '$sceDelegate', function(\n                $parse,   $sceDelegate) {\n    // Support: IE 9-11 only\n    // Prereq: Ensure that we're not running in IE<11 quirks mode.  In that mode, IE < 11 allow\n    // the \"expression(javascript expression)\" syntax which is insecure.\n    if (enabled && msie < 8) {\n      throw $sceMinErr('iequirks',\n        'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' +\n        'mode.  You can fix this by adding the text <!doctype html> to the top of your HTML ' +\n        'document.  See http://docs.angularjs.org/api/ng.$sce for more information.');\n    }\n\n    var sce = shallowCopy(SCE_CONTEXTS);\n\n    /**\n     * @ngdoc method\n     * @name $sce#isEnabled\n     * @kind function\n     *\n     * @return {Boolean} True if SCE is enabled, false otherwise.  If you want to set the value, you\n     *     have to do it at module config time on {@link ng.$sceProvider $sceProvider}.\n     *\n     * @description\n     * Returns a boolean indicating if SCE is enabled.\n     */\n    sce.isEnabled = function() {\n      return enabled;\n    };\n    sce.trustAs = $sceDelegate.trustAs;\n    sce.getTrusted = $sceDelegate.getTrusted;\n    sce.valueOf = $sceDelegate.valueOf;\n\n    if (!enabled) {\n      sce.trustAs = sce.getTrusted = function(type, value) { return value; };\n      sce.valueOf = identity;\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAs\n     *\n     * @description\n     * Converts AngularJS {@link guide/expression expression} into a function.  This is like {@link\n     * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it\n     * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,\n     * *result*)}\n     *\n     * @param {string} type The SCE context in which this result will be used.\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n    sce.parseAs = function sceParseAs(type, expr) {\n      var parsed = $parse(expr);\n      if (parsed.literal && parsed.constant) {\n        return parsed;\n      } else {\n        return $parse(expr, function(value) {\n          return sce.getTrusted(type, value);\n        });\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAs\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, returns a\n     * wrapped object that represents your value, and the trust you have in its safety for the given\n     * context. AngularJS can then use that value as-is in bindings of the specified secure context.\n     * This is used in bindings for `ng-bind-html`, `ng-include`, and most `src` attribute\n     * interpolations. See {@link ng.$sce $sce} for strict contextual escaping.\n     *\n     * @param {string} type The context in which this value is safe for use, e.g. `$sce.URL`,\n     *     `$sce.RESOURCE_URL`, `$sce.HTML`, `$sce.JS` or `$sce.CSS`.\n     *\n     * @param {*} value The value that that should be considered trusted.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in the context you specified.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsHtml(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.HTML` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.HTML` context (like `ng-bind-html`).\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsCss(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.CSS, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.CSS` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant\n     *     of your `value` in `$sce.CSS` context. This context is currently unused, so there are\n     *     almost no reasons to use this function so far.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.URL` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.URL` context. That context is currently unused, so there are almost no reasons\n     *     to use this function so far.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.RESOURCE_URL` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.RESOURCE_URL` context (template URLs in `ng-include`, most `src` attribute\n     *     bindings, ...)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsJs(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}\n     *\n     * @param {*} value The value to mark as trusted for `$sce.JS` context.\n     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`\n     *     in `$sce.JS` context. That context is currently unused, so there are almost no reasons to\n     *     use this function so far.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrusted\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}.  As such,\n     * takes any input, and either returns a value that's safe to use in the specified context,\n     * or throws an exception. This function is aware of trusted values created by the `trustAs`\n     * function and its shorthands, and when contexts are appropriate, returns the unwrapped value\n     * as-is. Finally, this function can also throw when there is no way to turn `maybeTrusted` in a\n     * safe value (e.g., no sanitization is available or possible.)\n     *\n     * @param {string} type The context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs\n     *     `$sce.trustAs`} call, or anything else (which will not be considered trusted.)\n     * @return {*} A version of the value that's safe to use in the given context, or throws an\n     *     exception if this is impossible.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedHtml(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.HTML, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedCss\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedCss(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.CSS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sceDelegate.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedJs\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedJs(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @return {*} The return value of `$sce.getTrusted($sce.JS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsHtml(expression string)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsCss(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsResourceUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsJs(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @return {function(context, locals)} A function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the\n     *      strings are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values\n     *      in `context`.\n     */\n\n    // Shorthand delegations.\n    var parse = sce.parseAs,\n        getTrusted = sce.getTrusted,\n        trustAs = sce.trustAs;\n\n    forEach(SCE_CONTEXTS, function(enumValue, name) {\n      var lName = lowercase(name);\n      sce[snakeToCamel('parse_as_' + lName)] = function(expr) {\n        return parse(enumValue, expr);\n      };\n      sce[snakeToCamel('get_trusted_' + lName)] = function(value) {\n        return getTrusted(enumValue, value);\n      };\n      sce[snakeToCamel('trust_as_' + lName)] = function(value) {\n        return trustAs(enumValue, value);\n      };\n    });\n\n    return sce;\n  }];\n}\n\n/* exported $SnifferProvider */\n\n/**\n * !!! This is an undocumented \"private\" service !!!\n *\n * @name $sniffer\n * @requires $window\n * @requires $document\n * @this\n *\n * @property {boolean} history Does the browser support html5 history api ?\n * @property {boolean} transitions Does the browser support CSS transition events ?\n * @property {boolean} animations Does the browser support CSS animation events ?\n *\n * @description\n * This is very simple implementation of testing browser's features.\n */\nfunction $SnifferProvider() {\n  this.$get = ['$window', '$document', function($window, $document) {\n    var eventSupport = {},\n        // Chrome Packaged Apps are not allowed to access `history.pushState`.\n        // If not sandboxed, they can be detected by the presence of `chrome.app.runtime`\n        // (see https://developer.chrome.com/apps/api_index). If sandboxed, they can be detected by\n        // the presence of an extension runtime ID and the absence of other Chrome runtime APIs\n        // (see https://developer.chrome.com/apps/manifest/sandbox).\n        // (NW.js apps have access to Chrome APIs, but do support `history`.)\n        isNw = $window.nw && $window.nw.process,\n        isChromePackagedApp =\n            !isNw &&\n            $window.chrome &&\n            ($window.chrome.app && $window.chrome.app.runtime ||\n                !$window.chrome.app && $window.chrome.runtime && $window.chrome.runtime.id),\n        hasHistoryPushState = !isChromePackagedApp && $window.history && $window.history.pushState,\n        android =\n          toInt((/android (\\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),\n        boxee = /Boxee/i.test(($window.navigator || {}).userAgent),\n        document = $document[0] || {},\n        bodyStyle = document.body && document.body.style,\n        transitions = false,\n        animations = false;\n\n    if (bodyStyle) {\n      // Support: Android <5, Blackberry Browser 10, default Chrome in Android 4.4.x\n      // Mentioned browsers need a -webkit- prefix for transitions & animations.\n      transitions = !!('transition' in bodyStyle || 'webkitTransition' in bodyStyle);\n      animations = !!('animation' in bodyStyle || 'webkitAnimation' in bodyStyle);\n    }\n\n\n    return {\n      // Android has history.pushState, but it does not update location correctly\n      // so let's not use the history API at all.\n      // http://code.google.com/p/android/issues/detail?id=17471\n      // https://github.com/angular/angular.js/issues/904\n\n      // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has\n      // so let's not use the history API also\n      // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined\n      history: !!(hasHistoryPushState && !(android < 4) && !boxee),\n      hasEvent: function(event) {\n        // Support: IE 9-11 only\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\n        // it. In particular the event is not fired when backspace or delete key are pressed or\n        // when cut operation is performed.\n        // IE10+ implements 'input' event but it erroneously fires under various situations,\n        // e.g. when placeholder changes, or a form is focused.\n        if (event === 'input' && msie) return false;\n\n        if (isUndefined(eventSupport[event])) {\n          var divElm = document.createElement('div');\n          eventSupport[event] = 'on' + event in divElm;\n        }\n\n        return eventSupport[event];\n      },\n      csp: csp(),\n      transitions: transitions,\n      animations: animations,\n      android: android\n    };\n  }];\n}\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $$taskTrackerFactory\n * @description\n * A function to create `TaskTracker` instances.\n *\n * A `TaskTracker` can keep track of pending tasks (grouped by type) and can notify interested\n * parties when all pending tasks (or tasks of a specific type) have been completed.\n *\n * @param {$log} log - A logger instance (such as `$log`). Used to log error during callback\n *     execution.\n *\n * @this\n */\nfunction $$TaskTrackerFactoryProvider() {\n  this.$get = valueFn(function(log) { return new TaskTracker(log); });\n}\n\nfunction TaskTracker(log) {\n  var self = this;\n  var taskCounts = {};\n  var taskCallbacks = [];\n\n  var ALL_TASKS_TYPE = self.ALL_TASKS_TYPE = '$$all$$';\n  var DEFAULT_TASK_TYPE = self.DEFAULT_TASK_TYPE = '$$default$$';\n\n  /**\n   * Execute the specified function and decrement the appropriate `taskCounts` counter.\n   * If the counter reaches 0, all corresponding `taskCallbacks` are executed.\n   *\n   * @param {Function} fn - The function to execute.\n   * @param {string=} [taskType=DEFAULT_TASK_TYPE] - The type of task that is being completed.\n   */\n  self.completeTask = completeTask;\n\n  /**\n   * Increase the task count for the specified task type (or the default task type if non is\n   * specified).\n   *\n   * @param {string=} [taskType=DEFAULT_TASK_TYPE] - The type of task whose count will be increased.\n   */\n  self.incTaskCount = incTaskCount;\n\n  /**\n   * Execute the specified callback when all pending tasks have been completed.\n   *\n   * If there are no pending tasks, the callback is executed immediately. You can optionally limit\n   * the tasks that will be waited for to a specific type, by passing a `taskType`.\n   *\n   * @param {function} callback - The function to call when there are no pending tasks.\n   * @param {string=} [taskType=ALL_TASKS_TYPE] - The type of tasks that will be waited for.\n   */\n  self.notifyWhenNoPendingTasks = notifyWhenNoPendingTasks;\n\n  function completeTask(fn, taskType) {\n    taskType = taskType || DEFAULT_TASK_TYPE;\n\n    try {\n      fn();\n    } finally {\n      decTaskCount(taskType);\n\n      var countForType = taskCounts[taskType];\n      var countForAll = taskCounts[ALL_TASKS_TYPE];\n\n      // If at least one of the queues (`ALL_TASKS_TYPE` or `taskType`) is empty, run callbacks.\n      if (!countForAll || !countForType) {\n        var getNextCallback = !countForAll ? getLastCallback : getLastCallbackForType;\n        var nextCb;\n\n        while ((nextCb = getNextCallback(taskType))) {\n          try {\n            nextCb();\n          } catch (e) {\n            log.error(e);\n          }\n        }\n      }\n    }\n  }\n\n  function decTaskCount(taskType) {\n    taskType = taskType || DEFAULT_TASK_TYPE;\n    if (taskCounts[taskType]) {\n      taskCounts[taskType]--;\n      taskCounts[ALL_TASKS_TYPE]--;\n    }\n  }\n\n  function getLastCallback() {\n    var cbInfo = taskCallbacks.pop();\n    return cbInfo && cbInfo.cb;\n  }\n\n  function getLastCallbackForType(taskType) {\n    for (var i = taskCallbacks.length - 1; i >= 0; --i) {\n      var cbInfo = taskCallbacks[i];\n      if (cbInfo.type === taskType) {\n        taskCallbacks.splice(i, 1);\n        return cbInfo.cb;\n      }\n    }\n  }\n\n  function incTaskCount(taskType) {\n    taskType = taskType || DEFAULT_TASK_TYPE;\n    taskCounts[taskType] = (taskCounts[taskType] || 0) + 1;\n    taskCounts[ALL_TASKS_TYPE] = (taskCounts[ALL_TASKS_TYPE] || 0) + 1;\n  }\n\n  function notifyWhenNoPendingTasks(callback, taskType) {\n    taskType = taskType || ALL_TASKS_TYPE;\n    if (!taskCounts[taskType]) {\n      callback();\n    } else {\n      taskCallbacks.push({type: taskType, cb: callback});\n    }\n  }\n}\n\nvar $templateRequestMinErr = minErr('$templateRequest');\n\n/**\n * @ngdoc provider\n * @name $templateRequestProvider\n * @this\n *\n * @description\n * Used to configure the options passed to the {@link $http} service when making a template request.\n *\n * For example, it can be used for specifying the \"Accept\" header that is sent to the server, when\n * requesting a template.\n */\nfunction $TemplateRequestProvider() {\n\n  var httpOptions;\n\n  /**\n   * @ngdoc method\n   * @name $templateRequestProvider#httpOptions\n   * @description\n   * The options to be passed to the {@link $http} service when making the request.\n   * You can use this to override options such as the \"Accept\" header for template requests.\n   *\n   * The {@link $templateRequest} will set the `cache` and the `transformResponse` properties of the\n   * options if not overridden here.\n   *\n   * @param {string=} value new value for the {@link $http} options.\n   * @returns {string|self} Returns the {@link $http} options when used as getter and self if used as setter.\n   */\n  this.httpOptions = function(val) {\n    if (val) {\n      httpOptions = val;\n      return this;\n    }\n    return httpOptions;\n  };\n\n  /**\n   * @ngdoc service\n   * @name $templateRequest\n   *\n   * @description\n   * The `$templateRequest` service runs security checks then downloads the provided template using\n   * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request\n   * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the\n   * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the\n   * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted\n   * when `tpl` is of type string and `$templateCache` has the matching entry.\n   *\n   * If you want to pass custom options to the `$http` service, such as setting the Accept header you\n   * can configure this via {@link $templateRequestProvider#httpOptions}.\n   *\n   * `$templateRequest` is used internally by {@link $compile}, {@link ngRoute.$route}, and directives such\n   * as {@link ngInclude} to download and cache templates.\n   *\n   * 3rd party modules should use `$templateRequest` if their services or directives are loading\n   * templates.\n   *\n   * @param {string|TrustedResourceUrl} tpl The HTTP request template URL\n   * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty\n   *\n   * @return {Promise} a promise for the HTTP response data of the given URL.\n   *\n   * @property {number} totalPendingRequests total amount of pending template requests being downloaded.\n   */\n  this.$get = ['$exceptionHandler', '$templateCache', '$http', '$q', '$sce',\n    function($exceptionHandler, $templateCache, $http, $q, $sce) {\n\n      function handleRequestFn(tpl, ignoreRequestError) {\n        handleRequestFn.totalPendingRequests++;\n\n        // We consider the template cache holds only trusted templates, so\n        // there's no need to go through whitelisting again for keys that already\n        // are included in there. This also makes AngularJS accept any script\n        // directive, no matter its name. However, we still need to unwrap trusted\n        // types.\n        if (!isString(tpl) || isUndefined($templateCache.get(tpl))) {\n          tpl = $sce.getTrustedResourceUrl(tpl);\n        }\n\n        var transformResponse = $http.defaults && $http.defaults.transformResponse;\n\n        if (isArray(transformResponse)) {\n          transformResponse = transformResponse.filter(function(transformer) {\n            return transformer !== defaultHttpResponseTransform;\n          });\n        } else if (transformResponse === defaultHttpResponseTransform) {\n          transformResponse = null;\n        }\n\n        return $http.get(tpl, extend({\n            cache: $templateCache,\n            transformResponse: transformResponse\n          }, httpOptions))\n          .finally(function() {\n            handleRequestFn.totalPendingRequests--;\n          })\n          .then(function(response) {\n            return $templateCache.put(tpl, response.data);\n          }, handleError);\n\n        function handleError(resp) {\n          if (!ignoreRequestError) {\n            resp = $templateRequestMinErr('tpload',\n                'Failed to load template: {0} (HTTP status: {1} {2})',\n                tpl, resp.status, resp.statusText);\n\n            $exceptionHandler(resp);\n          }\n\n          return $q.reject(resp);\n        }\n      }\n\n      handleRequestFn.totalPendingRequests = 0;\n\n      return handleRequestFn;\n    }\n  ];\n}\n\n/** @this */\nfunction $$TestabilityProvider() {\n  this.$get = ['$rootScope', '$browser', '$location',\n       function($rootScope,   $browser,   $location) {\n\n    /**\n     * @name $testability\n     *\n     * @description\n     * The private $$testability service provides a collection of methods for use when debugging\n     * or by automated test and debugging tools.\n     */\n    var testability = {};\n\n    /**\n     * @name $$testability#findBindings\n     *\n     * @description\n     * Returns an array of elements that are bound (via ng-bind or {{}})\n     * to expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The binding expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression. Filters and whitespace are ignored.\n     */\n    testability.findBindings = function(element, expression, opt_exactMatch) {\n      var bindings = element.getElementsByClassName('ng-binding');\n      var matches = [];\n      forEach(bindings, function(binding) {\n        var dataBinding = angular.element(binding).data('$binding');\n        if (dataBinding) {\n          forEach(dataBinding, function(bindingName) {\n            if (opt_exactMatch) {\n              var matcher = new RegExp('(^|\\\\s)' + escapeForRegexp(expression) + '(\\\\s|\\\\||$)');\n              if (matcher.test(bindingName)) {\n                matches.push(binding);\n              }\n            } else {\n              if (bindingName.indexOf(expression) !== -1) {\n                matches.push(binding);\n              }\n            }\n          });\n        }\n      });\n      return matches;\n    };\n\n    /**\n     * @name $$testability#findModels\n     *\n     * @description\n     * Returns an array of elements that are two-way found via ng-model to\n     * expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The model expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression.\n     */\n    testability.findModels = function(element, expression, opt_exactMatch) {\n      var prefixes = ['ng-', 'data-ng-', 'ng\\\\:'];\n      for (var p = 0; p < prefixes.length; ++p) {\n        var attributeEquals = opt_exactMatch ? '=' : '*=';\n        var selector = '[' + prefixes[p] + 'model' + attributeEquals + '\"' + expression + '\"]';\n        var elements = element.querySelectorAll(selector);\n        if (elements.length) {\n          return elements;\n        }\n      }\n    };\n\n    /**\n     * @name $$testability#getLocation\n     *\n     * @description\n     * Shortcut for getting the location in a browser agnostic way. Returns\n     *     the path, search, and hash. (e.g. /path?a=b#hash)\n     */\n    testability.getLocation = function() {\n      return $location.url();\n    };\n\n    /**\n     * @name $$testability#setLocation\n     *\n     * @description\n     * Shortcut for navigating to a location without doing a full page reload.\n     *\n     * @param {string} url The location url (path, search and hash,\n     *     e.g. /path?a=b#hash) to go to.\n     */\n    testability.setLocation = function(url) {\n      if (url !== $location.url()) {\n        $location.url(url);\n        $rootScope.$digest();\n      }\n    };\n\n    /**\n     * @name $$testability#whenStable\n     *\n     * @description\n     * Calls the callback when all pending tasks are completed.\n     *\n     * Types of tasks waited for include:\n     * - Pending timeouts (via {@link $timeout}).\n     * - Pending HTTP requests (via {@link $http}).\n     * - In-progress route transitions (via {@link $route}).\n     * - Pending tasks scheduled via {@link $rootScope#$applyAsync}.\n     * - Pending tasks scheduled via {@link $rootScope#$evalAsync}.\n     *   These include tasks scheduled via `$evalAsync()` indirectly (such as {@link $q} promises).\n     *\n     * @param {function} callback\n     */\n    testability.whenStable = function(callback) {\n      $browser.notifyWhenNoOutstandingRequests(callback);\n    };\n\n    return testability;\n  }];\n}\n\nvar $timeoutMinErr = minErr('$timeout');\n\n/** @this */\nfunction $TimeoutProvider() {\n  this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',\n       function($rootScope,   $browser,   $q,   $$q,   $exceptionHandler) {\n\n    var deferreds = {};\n\n\n    /**\n     * @ngdoc service\n     * @name $timeout\n     *\n     * @description\n     * AngularJS's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\n     * block and delegates any exceptions to\n     * {@link ng.$exceptionHandler $exceptionHandler} service.\n     *\n     * The return value of calling `$timeout` is a promise, which will be resolved when\n     * the delay has passed and the timeout function, if provided, is executed.\n     *\n     * To cancel a timeout request, call `$timeout.cancel(promise)`.\n     *\n     * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\n     * synchronously flush the queue of deferred functions.\n     *\n     * If you only want a promise that will be resolved after some specified delay\n     * then you can call `$timeout` without the `fn` function.\n     *\n     * @param {function()=} fn A function, whose execution should be delayed.\n     * @param {number=} [delay=0] Delay in milliseconds.\n     * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n     *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n     * @param {...*=} Pass additional parameters to the executed function.\n     * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise\n     *   will be resolved with the return value of the `fn` function.\n     *\n     */\n    function timeout(fn, delay, invokeApply) {\n      if (!isFunction(fn)) {\n        invokeApply = delay;\n        delay = fn;\n        fn = noop;\n      }\n\n      var args = sliceArgs(arguments, 3),\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise,\n          timeoutId;\n\n      timeoutId = $browser.defer(function() {\n        try {\n          deferred.resolve(fn.apply(null, args));\n        } catch (e) {\n          deferred.reject(e);\n          $exceptionHandler(e);\n        } finally {\n          delete deferreds[promise.$$timeoutId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n      }, delay, '$timeout');\n\n      promise.$$timeoutId = timeoutId;\n      deferreds[timeoutId] = deferred;\n\n      return promise;\n    }\n\n\n    /**\n     * @ngdoc method\n     * @name $timeout#cancel\n     *\n     * @description\n     * Cancels a task associated with the `promise`. As a result of this, the promise will be\n     * resolved with a rejection.\n     *\n     * @param {Promise=} promise Promise returned by the `$timeout` function.\n     * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n     *   canceled.\n     */\n    timeout.cancel = function(promise) {\n      if (!promise) return false;\n\n      if (!promise.hasOwnProperty('$$timeoutId')) {\n        throw $timeoutMinErr('badprom',\n            '`$timeout.cancel()` called with a promise that was not generated by `$timeout()`.');\n      }\n\n      if (!deferreds.hasOwnProperty(promise.$$timeoutId)) return false;\n\n      var id = promise.$$timeoutId;\n      var deferred = deferreds[id];\n\n      // Timeout cancels should not report an unhandled promise.\n      markQExceptionHandled(deferred.promise);\n      deferred.reject('canceled');\n      delete deferreds[id];\n\n      return $browser.defer.cancel(id);\n    };\n\n    return timeout;\n  }];\n}\n\n// NOTE:  The usage of window and document instead of $window and $document here is\n// deliberate.  This service depends on the specific behavior of anchor nodes created by the\n// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\n// cause us to break tests.  In addition, when the browser resolves a URL for XHR, it\n// doesn't know about mocked locations and resolves URLs to the real document - which is\n// exactly the behavior needed here.  There is little value is mocking these out for this\n// service.\nvar urlParsingNode = window.document.createElement('a');\nvar originUrl = urlResolve(window.location.href);\nvar baseUrlParsingNode;\n\nurlParsingNode.href = 'http://[::1]';\n\n// Support: IE 9-11 only, Edge 16-17 only (fixed in 18 Preview)\n// IE/Edge don't wrap IPv6 addresses' hostnames in square brackets\n// when parsed out of an anchor element.\nvar ipv6InBrackets = urlParsingNode.hostname === '[::1]';\n\n/**\n *\n * Implementation Notes for non-IE browsers\n * ----------------------------------------\n * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\n * results both in the normalizing and parsing of the URL.  Normalizing means that a relative\n * URL will be resolved into an absolute URL in the context of the application document.\n * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related\n * properties are all populated to reflect the normalized URL.  This approach has wide\n * compatibility - Safari 1+, Mozilla 1+ etc.  See\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *\n * Implementation Notes for IE\n * ---------------------------\n * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other\n * browsers.  However, the parsed components will not be set if the URL assigned did not specify\n * them.  (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.)  We\n * work around that by performing the parsing in a 2nd step by taking a previously normalized\n * URL (e.g. by assigning to a.href) and assigning it a.href again.  This correctly populates the\n * properties such as protocol, hostname, port, etc.\n *\n * References:\n *   http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\n *   http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *   http://url.spec.whatwg.org/#urlutils\n *   https://github.com/angular/angular.js/pull/2902\n *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\n *\n * @kind function\n * @param {string|object} url The URL to be parsed. If `url` is not a string, it will be returned\n *     unchanged.\n * @description Normalizes and parses a URL.\n * @returns {object} Returns the normalized URL as a dictionary.\n *\n *   | member name   | Description                                                            |\n *   |---------------|------------------------------------------------------------------------|\n *   | href          | A normalized version of the provided URL if it was not an absolute URL |\n *   | protocol      | The protocol without the trailing colon                                |\n *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |\n *   | search        | The search params, minus the question mark                             |\n *   | hash          | The hash string, minus the hash symbol                                 |\n *   | hostname      | The hostname                                                           |\n *   | port          | The port, without \":\"                                                  |\n *   | pathname      | The pathname, beginning with \"/\"                                       |\n *\n */\nfunction urlResolve(url) {\n  if (!isString(url)) return url;\n\n  var href = url;\n\n  // Support: IE 9-11 only\n  if (msie) {\n    // Normalize before parse.  Refer Implementation Notes on why this is\n    // done in two steps on IE.\n    urlParsingNode.setAttribute('href', href);\n    href = urlParsingNode.href;\n  }\n\n  urlParsingNode.setAttribute('href', href);\n\n  var hostname = urlParsingNode.hostname;\n\n  if (!ipv6InBrackets && hostname.indexOf(':') > -1) {\n    hostname = '[' + hostname + ']';\n  }\n\n  return {\n    href: urlParsingNode.href,\n    protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n    host: urlParsingNode.host,\n    search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n    hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n    hostname: hostname,\n    port: urlParsingNode.port,\n    pathname: (urlParsingNode.pathname.charAt(0) === '/')\n      ? urlParsingNode.pathname\n      : '/' + urlParsingNode.pathname\n  };\n}\n\n/**\n * Parse a request URL and determine whether this is a same-origin request as the application\n * document.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the request is for the same origin as the application document.\n */\nfunction urlIsSameOrigin(requestUrl) {\n  return urlsAreSameOrigin(requestUrl, originUrl);\n}\n\n/**\n * Parse a request URL and determine whether it is same-origin as the current document base URL.\n *\n * Note: The base URL is usually the same as the document location (`location.href`) but can\n * be overriden by using the `<base>` tag.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the URL is same-origin as the document base URL.\n */\nfunction urlIsSameOriginAsBaseUrl(requestUrl) {\n  return urlsAreSameOrigin(requestUrl, getBaseUrl());\n}\n\n/**\n * Create a function that can check a URL's origin against a list of allowed/whitelisted origins.\n * The current location's origin is implicitly trusted.\n *\n * @param {string[]} whitelistedOriginUrls - A list of URLs (strings), whose origins are trusted.\n *\n * @returns {Function} - A function that receives a URL (string or parsed URL object) and returns\n *     whether it is of an allowed origin.\n */\nfunction urlIsAllowedOriginFactory(whitelistedOriginUrls) {\n  var parsedAllowedOriginUrls = [originUrl].concat(whitelistedOriginUrls.map(urlResolve));\n\n  /**\n   * Check whether the specified URL (string or parsed URL object) has an origin that is allowed\n   * based on a list of whitelisted-origin URLs. The current location's origin is implicitly\n   * trusted.\n   *\n   * @param {string|Object} requestUrl - The URL to be checked (provided as a string that will be\n   *     resolved or a parsed URL object).\n   *\n   * @returns {boolean} - Whether the specified URL is of an allowed origin.\n   */\n  return function urlIsAllowedOrigin(requestUrl) {\n    var parsedUrl = urlResolve(requestUrl);\n    return parsedAllowedOriginUrls.some(urlsAreSameOrigin.bind(null, parsedUrl));\n  };\n}\n\n/**\n * Determine if two URLs share the same origin.\n *\n * @param {string|Object} url1 - First URL to compare as a string or a normalized URL in the form of\n *     a dictionary object returned by `urlResolve()`.\n * @param {string|object} url2 - Second URL to compare as a string or a normalized URL in the form\n *     of a dictionary object returned by `urlResolve()`.\n *\n * @returns {boolean} - True if both URLs have the same origin, and false otherwise.\n */\nfunction urlsAreSameOrigin(url1, url2) {\n  url1 = urlResolve(url1);\n  url2 = urlResolve(url2);\n\n  return (url1.protocol === url2.protocol &&\n          url1.host === url2.host);\n}\n\n/**\n * Returns the current document base URL.\n * @returns {string}\n */\nfunction getBaseUrl() {\n  if (window.document.baseURI) {\n    return window.document.baseURI;\n  }\n\n  // `document.baseURI` is available everywhere except IE\n  if (!baseUrlParsingNode) {\n    baseUrlParsingNode = window.document.createElement('a');\n    baseUrlParsingNode.href = '.';\n\n    // Work-around for IE bug described in Implementation Notes. The fix in `urlResolve()` is not\n    // suitable here because we need to track changes to the base URL.\n    baseUrlParsingNode = baseUrlParsingNode.cloneNode(false);\n  }\n  return baseUrlParsingNode.href;\n}\n\n/**\n * @ngdoc service\n * @name $window\n * @this\n *\n * @description\n * A reference to the browser's `window` object. While `window`\n * is globally available in JavaScript, it causes testability problems, because\n * it is a global variable. In AngularJS we always refer to it through the\n * `$window` service, so it may be overridden, removed or mocked for testing.\n *\n * Expressions, like the one defined for the `ngClick` directive in the example\n * below, are evaluated with respect to the current scope.  Therefore, there is\n * no risk of inadvertently coding in a dependency on a global value in such an\n * expression.\n *\n * @example\n   <example module=\"windowExample\" name=\"window-service\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('windowExample', [])\n           .controller('ExampleController', ['$scope', '$window', function($scope, $window) {\n             $scope.greeting = 'Hello, World!';\n             $scope.doGreeting = function(greeting) {\n               $window.alert(greeting);\n             };\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"text\" ng-model=\"greeting\" aria-label=\"greeting\" />\n         <button ng-click=\"doGreeting(greeting)\">ALERT</button>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n      it('should display the greeting in the input box', function() {\n       element(by.model('greeting')).sendKeys('Hello, E2E Tests');\n       // If we click the button it will block the test runner\n       // element(':button').click();\n      });\n     </file>\n   </example>\n */\nfunction $WindowProvider() {\n  this.$get = valueFn(window);\n}\n\n/**\n * @name $$cookieReader\n * @requires $document\n *\n * @description\n * This is a private service for reading cookies used by $http and ngCookies\n *\n * @return {Object} a key/value map of the current cookies\n */\nfunction $$CookieReader($document) {\n  var rawDocument = $document[0] || {};\n  var lastCookies = {};\n  var lastCookieString = '';\n\n  function safeGetCookie(rawDocument) {\n    try {\n      return rawDocument.cookie || '';\n    } catch (e) {\n      return '';\n    }\n  }\n\n  function safeDecodeURIComponent(str) {\n    try {\n      return decodeURIComponent(str);\n    } catch (e) {\n      return str;\n    }\n  }\n\n  return function() {\n    var cookieArray, cookie, i, index, name;\n    var currentCookieString = safeGetCookie(rawDocument);\n\n    if (currentCookieString !== lastCookieString) {\n      lastCookieString = currentCookieString;\n      cookieArray = lastCookieString.split('; ');\n      lastCookies = {};\n\n      for (i = 0; i < cookieArray.length; i++) {\n        cookie = cookieArray[i];\n        index = cookie.indexOf('=');\n        if (index > 0) { //ignore nameless cookies\n          name = safeDecodeURIComponent(cookie.substring(0, index));\n          // the first value that is seen for a cookie is the most\n          // specific one.  values for the same cookie name that\n          // follow are for less specific paths.\n          if (isUndefined(lastCookies[name])) {\n            lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));\n          }\n        }\n      }\n    }\n    return lastCookies;\n  };\n}\n\n$$CookieReader.$inject = ['$document'];\n\n/** @this */\nfunction $$CookieReaderProvider() {\n  this.$get = $$CookieReader;\n}\n\n/* global currencyFilter: true,\n dateFilter: true,\n filterFilter: true,\n jsonFilter: true,\n limitToFilter: true,\n lowercaseFilter: true,\n numberFilter: true,\n orderByFilter: true,\n uppercaseFilter: true,\n */\n\n/**\n * @ngdoc provider\n * @name $filterProvider\n * @description\n *\n * Filters are just functions which transform input to an output. However filters need to be\n * Dependency Injected. To achieve this a filter definition consists of a factory function which is\n * annotated with dependencies and is responsible for creating a filter function.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Filter names must be valid AngularJS {@link expression} identifiers, such as `uppercase` or `orderBy`.\n * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n * (`myapp_subsection_filterx`).\n * </div>\n *\n * ```js\n *   // Filter registration\n *   function MyModule($provide, $filterProvider) {\n *     // create a service to demonstrate injection (not always needed)\n *     $provide.value('greet', function(name){\n *       return 'Hello ' + name + '!';\n *     });\n *\n *     // register a filter factory which uses the\n *     // greet service to demonstrate DI.\n *     $filterProvider.register('greet', function(greet){\n *       // return the filter function which uses the greet service\n *       // to generate salutation\n *       return function(text) {\n *         // filters need to be forgiving so check input validity\n *         return text && greet(text) || text;\n *       };\n *     });\n *   }\n * ```\n *\n * The filter function is registered with the `$injector` under the filter name suffix with\n * `Filter`.\n *\n * ```js\n *   it('should be the same instance', inject(\n *     function($filterProvider) {\n *       $filterProvider.register('reverse', function(){\n *         return ...;\n *       });\n *     },\n *     function($filter, reverseFilter) {\n *       expect($filter('reverse')).toBe(reverseFilter);\n *     });\n * ```\n *\n *\n * For more information about how AngularJS filters work, and how to create your own filters, see\n * {@link guide/filter Filters} in the AngularJS Developer Guide.\n */\n\n/**\n * @ngdoc service\n * @name $filter\n * @kind function\n * @description\n * Filters are used for formatting data displayed to the user.\n *\n * They can be used in view templates, controllers or services. AngularJS comes\n * with a collection of [built-in filters](api/ng/filter), but it is easy to\n * define your own as well.\n *\n * The general syntax in templates is as follows:\n *\n * ```html\n * {{ expression [| filter_name[:parameter_value] ... ] }}\n * ```\n *\n * @param {String} name Name of the filter function to retrieve\n * @return {Function} the filter function\n * @example\n   <example name=\"$filter\" module=\"filterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"MainCtrl\">\n        <h3>{{ originalText }}</h3>\n        <h3>{{ filteredText }}</h3>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n      angular.module('filterExample', [])\n      .controller('MainCtrl', function($scope, $filter) {\n        $scope.originalText = 'hello';\n        $scope.filteredText = $filter('uppercase')($scope.originalText);\n      });\n     </file>\n   </example>\n  */\n$FilterProvider.$inject = ['$provide'];\n/** @this */\nfunction $FilterProvider($provide) {\n  var suffix = 'Filter';\n\n  /**\n   * @ngdoc method\n   * @name $filterProvider#register\n   * @param {string|Object} name Name of the filter function, or an object map of filters where\n   *    the keys are the filter names and the values are the filter factories.\n   *\n   *    <div class=\"alert alert-warning\">\n   *    **Note:** Filter names must be valid AngularJS {@link expression} identifiers, such as `uppercase` or `orderBy`.\n   *    Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n   *    your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n   *    (`myapp_subsection_filterx`).\n   *    </div>\n    * @param {Function} factory If the first argument was a string, a factory function for the filter to be registered.\n   * @returns {Object} Registered filter instance, or if a map of filters was provided then a map\n   *    of the registered filter instances.\n   */\n  function register(name, factory) {\n    if (isObject(name)) {\n      var filters = {};\n      forEach(name, function(filter, key) {\n        filters[key] = register(key, filter);\n      });\n      return filters;\n    } else {\n      return $provide.factory(name + suffix, factory);\n    }\n  }\n  this.register = register;\n\n  this.$get = ['$injector', function($injector) {\n    return function(name) {\n      return $injector.get(name + suffix);\n    };\n  }];\n\n  ////////////////////////////////////////\n\n  /* global\n    currencyFilter: false,\n    dateFilter: false,\n    filterFilter: false,\n    jsonFilter: false,\n    limitToFilter: false,\n    lowercaseFilter: false,\n    numberFilter: false,\n    orderByFilter: false,\n    uppercaseFilter: false\n  */\n\n  register('currency', currencyFilter);\n  register('date', dateFilter);\n  register('filter', filterFilter);\n  register('json', jsonFilter);\n  register('limitTo', limitToFilter);\n  register('lowercase', lowercaseFilter);\n  register('number', numberFilter);\n  register('orderBy', orderByFilter);\n  register('uppercase', uppercaseFilter);\n}\n\n/**\n * @ngdoc filter\n * @name filter\n * @kind function\n *\n * @description\n * Selects a subset of items from `array` and returns it as a new array.\n *\n * @param {Array} array The source array.\n * <div class=\"alert alert-info\">\n *   **Note**: If the array contains objects that reference themselves, filtering is not possible.\n * </div>\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\n *   `array`.\n *\n *   Can be one of:\n *\n *   - `string`: The string is used for matching against the contents of the `array`. All strings or\n *     objects with string properties in `array` that match this string will be returned. This also\n *     applies to nested object properties.\n *     The predicate can be negated by prefixing the string with `!`.\n *\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\n *     property name (`$` by default) can be used (e.g. as in `{$: \"text\"}`) to accept a match\n *     against any property of the object or its nested object properties. That's equivalent to the\n *     simple substring match with a `string` as described above. The special property name can be\n *     overwritten, using the `anyPropertyKey` parameter.\n *     The predicate can be negated by prefixing the string with `!`.\n *     For example `{name: \"!M\"}` predicate will return an array of items which have property `name`\n *     not containing \"M\".\n *\n *     Note that a named property will match properties on the same level only, while the special\n *     `$` property will match properties on the same level or deeper. E.g. an array item like\n *     `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but\n *     **will** be matched by `{$: 'John'}`.\n *\n *   - `function(value, index, array)`: A predicate function can be used to write arbitrary filters.\n *     The function is called for each element of the array, with the element, its index, and\n *     the entire array itself as arguments.\n *\n *     The final result is an array of those elements that the predicate returned true for.\n *\n * @param {function(actual, expected)|true|false} [comparator] Comparator which is used in\n *     determining if values retrieved using `expression` (when it is not a function) should be\n *     considered a match based on the expected value (from the filter expression) and actual\n *     value (from the object in the array).\n *\n *   Can be one of:\n *\n *   - `function(actual, expected)`:\n *     The function will be given the object value and the predicate value to compare and\n *     should return true if both values should be considered equal.\n *\n *   - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`.\n *     This is essentially strict comparison of expected and actual.\n *\n *   - `false`: A short hand for a function which will look for a substring match in a case\n *     insensitive way. Primitive values are converted to strings. Objects are not compared against\n *     primitives, unless they have a custom `toString` method (e.g. `Date` objects).\n *\n *\n *   Defaults to `false`.\n *\n * @param {string} [anyPropertyKey] The special property name that matches against any property.\n *     By default `$`.\n *\n * @example\n   <example name=\"filter-filter\">\n     <file name=\"index.html\">\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\n                                {name:'Mary', phone:'800-BIG-MARY'},\n                                {name:'Mike', phone:'555-4321'},\n                                {name:'Adam', phone:'555-5678'},\n                                {name:'Julie', phone:'555-8765'},\n                                {name:'Juliette', phone:'555-5678'}]\"></div>\n\n       <label>Search: <input ng-model=\"searchText\"></label>\n       <table id=\"searchTextResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\n           <td>{{friend.name}}</td>\n           <td>{{friend.phone}}</td>\n         </tr>\n       </table>\n       <hr>\n       <label>Any: <input ng-model=\"search.$\"></label> <br>\n       <label>Name only <input ng-model=\"search.name\"></label><br>\n       <label>Phone only <input ng-model=\"search.phone\"></label><br>\n       <label>Equality <input type=\"checkbox\" ng-model=\"strict\"></label><br>\n       <table id=\"searchObjResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friendObj in friends | filter:search:strict\">\n           <td>{{friendObj.name}}</td>\n           <td>{{friendObj.phone}}</td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var expectFriendNames = function(expectedNames, key) {\n         element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {\n           arr.forEach(function(wd, i) {\n             expect(wd.getText()).toMatch(expectedNames[i]);\n           });\n         });\n       };\n\n       it('should search across all fields when filtering with a string', function() {\n         var searchText = element(by.model('searchText'));\n         searchText.clear();\n         searchText.sendKeys('m');\n         expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');\n\n         searchText.clear();\n         searchText.sendKeys('76');\n         expectFriendNames(['John', 'Julie'], 'friend');\n       });\n\n       it('should search in specific fields when filtering with a predicate object', function() {\n         var searchAny = element(by.model('search.$'));\n         searchAny.clear();\n         searchAny.sendKeys('i');\n         expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');\n       });\n       it('should use a equal comparison when comparator is true', function() {\n         var searchName = element(by.model('search.name'));\n         var strict = element(by.model('strict'));\n         searchName.clear();\n         searchName.sendKeys('Julie');\n         strict.click();\n         expectFriendNames(['Julie'], 'friendObj');\n       });\n     </file>\n   </example>\n */\n\nfunction filterFilter() {\n  return function(array, expression, comparator, anyPropertyKey) {\n    if (!isArrayLike(array)) {\n      if (array == null) {\n        return array;\n      } else {\n        throw minErr('filter')('notarray', 'Expected array but received: {0}', array);\n      }\n    }\n\n    anyPropertyKey = anyPropertyKey || '$';\n    var expressionType = getTypeForFilter(expression);\n    var predicateFn;\n    var matchAgainstAnyProp;\n\n    switch (expressionType) {\n      case 'function':\n        predicateFn = expression;\n        break;\n      case 'boolean':\n      case 'null':\n      case 'number':\n      case 'string':\n        matchAgainstAnyProp = true;\n        // falls through\n      case 'object':\n        predicateFn = createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp);\n        break;\n      default:\n        return array;\n    }\n\n    return Array.prototype.filter.call(array, predicateFn);\n  };\n}\n\n// Helper functions for `filterFilter`\nfunction createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp) {\n  var shouldMatchPrimitives = isObject(expression) && (anyPropertyKey in expression);\n  var predicateFn;\n\n  if (comparator === true) {\n    comparator = equals;\n  } else if (!isFunction(comparator)) {\n    comparator = function(actual, expected) {\n      if (isUndefined(actual)) {\n        // No substring matching against `undefined`\n        return false;\n      }\n      if ((actual === null) || (expected === null)) {\n        // No substring matching against `null`; only match against `null`\n        return actual === expected;\n      }\n      if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) {\n        // Should not compare primitives against objects, unless they have custom `toString` method\n        return false;\n      }\n\n      actual = lowercase('' + actual);\n      expected = lowercase('' + expected);\n      return actual.indexOf(expected) !== -1;\n    };\n  }\n\n  predicateFn = function(item) {\n    if (shouldMatchPrimitives && !isObject(item)) {\n      return deepCompare(item, expression[anyPropertyKey], comparator, anyPropertyKey, false);\n    }\n    return deepCompare(item, expression, comparator, anyPropertyKey, matchAgainstAnyProp);\n  };\n\n  return predicateFn;\n}\n\nfunction deepCompare(actual, expected, comparator, anyPropertyKey, matchAgainstAnyProp, dontMatchWholeObject) {\n  var actualType = getTypeForFilter(actual);\n  var expectedType = getTypeForFilter(expected);\n\n  if ((expectedType === 'string') && (expected.charAt(0) === '!')) {\n    return !deepCompare(actual, expected.substring(1), comparator, anyPropertyKey, matchAgainstAnyProp);\n  } else if (isArray(actual)) {\n    // In case `actual` is an array, consider it a match\n    // if ANY of it's items matches `expected`\n    return actual.some(function(item) {\n      return deepCompare(item, expected, comparator, anyPropertyKey, matchAgainstAnyProp);\n    });\n  }\n\n  switch (actualType) {\n    case 'object':\n      var key;\n      if (matchAgainstAnyProp) {\n        for (key in actual) {\n          // Under certain, rare, circumstances, key may not be a string and `charAt` will be undefined\n          // See: https://github.com/angular/angular.js/issues/15644\n          if (key.charAt && (key.charAt(0) !== '$') &&\n              deepCompare(actual[key], expected, comparator, anyPropertyKey, true)) {\n            return true;\n          }\n        }\n        return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, anyPropertyKey, false);\n      } else if (expectedType === 'object') {\n        for (key in expected) {\n          var expectedVal = expected[key];\n          if (isFunction(expectedVal) || isUndefined(expectedVal)) {\n            continue;\n          }\n\n          var matchAnyProperty = key === anyPropertyKey;\n          var actualVal = matchAnyProperty ? actual : actual[key];\n          if (!deepCompare(actualVal, expectedVal, comparator, anyPropertyKey, matchAnyProperty, matchAnyProperty)) {\n            return false;\n          }\n        }\n        return true;\n      } else {\n        return comparator(actual, expected);\n      }\n    case 'function':\n      return false;\n    default:\n      return comparator(actual, expected);\n  }\n}\n\n// Used for easily differentiating between `null` and actual `object`\nfunction getTypeForFilter(val) {\n  return (val === null) ? 'null' : typeof val;\n}\n\nvar MAX_DIGITS = 22;\nvar DECIMAL_SEP = '.';\nvar ZERO_CHAR = '0';\n\n/**\n * @ngdoc filter\n * @name currency\n * @kind function\n *\n * @description\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\n * symbol for current locale is used.\n *\n * @param {number} amount Input to filter.\n * @param {string=} symbol Currency symbol or identifier to be displayed.\n * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale\n * @returns {string} Formatted number.\n *\n *\n * @example\n   <example module=\"currencyExample\" name=\"currency-filter\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('currencyExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.amount = 1234.56;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"number\" ng-model=\"amount\" aria-label=\"amount\"> <br>\n         default currency symbol ($): <span id=\"currency-default\">{{amount | currency}}</span><br>\n         custom currency identifier (USD$): <span id=\"currency-custom\">{{amount | currency:\"USD$\"}}</span><br>\n         no fractions (0): <span id=\"currency-no-fractions\">{{amount | currency:\"USD$\":0}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should init with 1234.56', function() {\n         expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');\n         expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235');\n       });\n       it('should update', function() {\n         if (browser.params.browser === 'safari') {\n           // Safari does not understand the minus key. See\n           // https://github.com/angular/protractor/issues/481\n           return;\n         }\n         element(by.model('amount')).clear();\n         element(by.model('amount')).sendKeys('-1234');\n         expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00');\n         expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234');\n       });\n     </file>\n   </example>\n */\ncurrencyFilter.$inject = ['$locale'];\nfunction currencyFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(amount, currencySymbol, fractionSize) {\n    if (isUndefined(currencySymbol)) {\n      currencySymbol = formats.CURRENCY_SYM;\n    }\n\n    if (isUndefined(fractionSize)) {\n      fractionSize = formats.PATTERNS[1].maxFrac;\n    }\n\n    // If the currency symbol is empty, trim whitespace around the symbol\n    var currencySymbolRe = !currencySymbol ? /\\s*\\u00A4\\s*/g : /\\u00A4/g;\n\n    // if null or undefined pass it through\n    return (amount == null)\n        ? amount\n        : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).\n            replace(currencySymbolRe, currencySymbol);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name number\n * @kind function\n *\n * @description\n * Formats a number as text.\n *\n * If the input is null or undefined, it will just be returned.\n * If the input is infinite (Infinity or -Infinity), the Infinity symbol '∞' or '-∞' is returned, respectively.\n * If the input is not a number an empty string is returned.\n *\n *\n * @param {number|string} number Number to format.\n * @param {(number|string)=} fractionSize Number of decimal places to round the number to.\n * If this is not provided then the fraction size is computed from the current locale's number\n * formatting pattern. In the case of the default locale, it will be 3.\n * @returns {string} Number rounded to `fractionSize` appropriately formatted based on the current\n *                   locale (e.g., in the en_US locale it will have \".\" as the decimal separator and\n *                   include \",\" group separators after each third digit).\n *\n * @example\n   <example module=\"numberFilterExample\" name=\"number-filter\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('numberFilterExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.val = 1234.56789;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>Enter number: <input ng-model='val'></label><br>\n         Default formatting: <span id='number-default'>{{val | number}}</span><br>\n         No fractions: <span>{{val | number:0}}</span><br>\n         Negative number: <span>{{-val | number:4}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format numbers', function() {\n         expect(element(by.id('number-default')).getText()).toBe('1,234.568');\n         expect(element(by.binding('val | number:0')).getText()).toBe('1,235');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');\n       });\n\n       it('should update', function() {\n         element(by.model('val')).clear();\n         element(by.model('val')).sendKeys('3374.333');\n         expect(element(by.id('number-default')).getText()).toBe('3,374.333');\n         expect(element(by.binding('val | number:0')).getText()).toBe('3,374');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');\n      });\n     </file>\n   </example>\n */\nnumberFilter.$inject = ['$locale'];\nfunction numberFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(number, fractionSize) {\n\n    // if null or undefined pass it through\n    return (number == null)\n        ? number\n        : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\n                       fractionSize);\n  };\n}\n\n/**\n * Parse a number (as a string) into three components that can be used\n * for formatting the number.\n *\n * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/)\n *\n * @param  {string} numStr The number to parse\n * @return {object} An object describing this number, containing the following keys:\n *  - d : an array of digits containing leading zeros as necessary\n *  - i : the number of the digits in `d` that are to the left of the decimal point\n *  - e : the exponent for numbers that would need more than `MAX_DIGITS` digits in `d`\n *\n */\nfunction parse(numStr) {\n  var exponent = 0, digits, numberOfIntegerDigits;\n  var i, j, zeros;\n\n  // Decimal point?\n  if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) {\n    numStr = numStr.replace(DECIMAL_SEP, '');\n  }\n\n  // Exponential form?\n  if ((i = numStr.search(/e/i)) > 0) {\n    // Work out the exponent.\n    if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i;\n    numberOfIntegerDigits += +numStr.slice(i + 1);\n    numStr = numStr.substring(0, i);\n  } else if (numberOfIntegerDigits < 0) {\n    // There was no decimal point or exponent so it is an integer.\n    numberOfIntegerDigits = numStr.length;\n  }\n\n  // Count the number of leading zeros.\n  for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) { /* empty */ }\n\n  if (i === (zeros = numStr.length)) {\n    // The digits are all zero.\n    digits = [0];\n    numberOfIntegerDigits = 1;\n  } else {\n    // Count the number of trailing zeros\n    zeros--;\n    while (numStr.charAt(zeros) === ZERO_CHAR) zeros--;\n\n    // Trailing zeros are insignificant so ignore them\n    numberOfIntegerDigits -= i;\n    digits = [];\n    // Convert string to array of digits without leading/trailing zeros.\n    for (j = 0; i <= zeros; i++, j++) {\n      digits[j] = +numStr.charAt(i);\n    }\n  }\n\n  // If the number overflows the maximum allowed digits then use an exponent.\n  if (numberOfIntegerDigits > MAX_DIGITS) {\n    digits = digits.splice(0, MAX_DIGITS - 1);\n    exponent = numberOfIntegerDigits - 1;\n    numberOfIntegerDigits = 1;\n  }\n\n  return { d: digits, e: exponent, i: numberOfIntegerDigits };\n}\n\n/**\n * Round the parsed number to the specified number of decimal places\n * This function changed the parsedNumber in-place\n */\nfunction roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {\n    var digits = parsedNumber.d;\n    var fractionLen = digits.length - parsedNumber.i;\n\n    // determine fractionSize if it is not specified; `+fractionSize` converts it to a number\n    fractionSize = (isUndefined(fractionSize)) ? Math.min(Math.max(minFrac, fractionLen), maxFrac) : +fractionSize;\n\n    // The index of the digit to where rounding is to occur\n    var roundAt = fractionSize + parsedNumber.i;\n    var digit = digits[roundAt];\n\n    if (roundAt > 0) {\n      // Drop fractional digits beyond `roundAt`\n      digits.splice(Math.max(parsedNumber.i, roundAt));\n\n      // Set non-fractional digits beyond `roundAt` to 0\n      for (var j = roundAt; j < digits.length; j++) {\n        digits[j] = 0;\n      }\n    } else {\n      // We rounded to zero so reset the parsedNumber\n      fractionLen = Math.max(0, fractionLen);\n      parsedNumber.i = 1;\n      digits.length = Math.max(1, roundAt = fractionSize + 1);\n      digits[0] = 0;\n      for (var i = 1; i < roundAt; i++) digits[i] = 0;\n    }\n\n    if (digit >= 5) {\n      if (roundAt - 1 < 0) {\n        for (var k = 0; k > roundAt; k--) {\n          digits.unshift(0);\n          parsedNumber.i++;\n        }\n        digits.unshift(1);\n        parsedNumber.i++;\n      } else {\n        digits[roundAt - 1]++;\n      }\n    }\n\n    // Pad out with zeros to get the required fraction length\n    for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0);\n\n\n    // Do any carrying, e.g. a digit was rounded up to 10\n    var carry = digits.reduceRight(function(carry, d, i, digits) {\n      d = d + carry;\n      digits[i] = d % 10;\n      return Math.floor(d / 10);\n    }, 0);\n    if (carry) {\n      digits.unshift(carry);\n      parsedNumber.i++;\n    }\n}\n\n/**\n * Format a number into a string\n * @param  {number} number       The number to format\n * @param  {{\n *           minFrac, // the minimum number of digits required in the fraction part of the number\n *           maxFrac, // the maximum number of digits required in the fraction part of the number\n *           gSize,   // number of digits in each group of separated digits\n *           lgSize,  // number of digits in the last group of digits before the decimal separator\n *           negPre,  // the string to go in front of a negative number (e.g. `-` or `(`))\n *           posPre,  // the string to go in front of a positive number\n *           negSuf,  // the string to go after a negative number (e.g. `)`)\n *           posSuf   // the string to go after a positive number\n *         }} pattern\n * @param  {string} groupSep     The string to separate groups of number (e.g. `,`)\n * @param  {string} decimalSep   The string to act as the decimal separator (e.g. `.`)\n * @param  {[type]} fractionSize The size of the fractional part of the number\n * @return {string}              The number formatted as a string\n */\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\n\n  if (!(isString(number) || isNumber(number)) || isNaN(number)) return '';\n\n  var isInfinity = !isFinite(number);\n  var isZero = false;\n  var numStr = Math.abs(number) + '',\n      formattedText = '',\n      parsedNumber;\n\n  if (isInfinity) {\n    formattedText = '\\u221e';\n  } else {\n    parsedNumber = parse(numStr);\n\n    roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac);\n\n    var digits = parsedNumber.d;\n    var integerLen = parsedNumber.i;\n    var exponent = parsedNumber.e;\n    var decimals = [];\n    isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true);\n\n    // pad zeros for small numbers\n    while (integerLen < 0) {\n      digits.unshift(0);\n      integerLen++;\n    }\n\n    // extract decimals digits\n    if (integerLen > 0) {\n      decimals = digits.splice(integerLen, digits.length);\n    } else {\n      decimals = digits;\n      digits = [0];\n    }\n\n    // format the integer digits with grouping separators\n    var groups = [];\n    if (digits.length >= pattern.lgSize) {\n      groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));\n    }\n    while (digits.length > pattern.gSize) {\n      groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));\n    }\n    if (digits.length) {\n      groups.unshift(digits.join(''));\n    }\n    formattedText = groups.join(groupSep);\n\n    // append the decimal digits\n    if (decimals.length) {\n      formattedText += decimalSep + decimals.join('');\n    }\n\n    if (exponent) {\n      formattedText += 'e+' + exponent;\n    }\n  }\n  if (number < 0 && !isZero) {\n    return pattern.negPre + formattedText + pattern.negSuf;\n  } else {\n    return pattern.posPre + formattedText + pattern.posSuf;\n  }\n}\n\nfunction padNumber(num, digits, trim, negWrap) {\n  var neg = '';\n  if (num < 0 || (negWrap && num <= 0)) {\n    if (negWrap) {\n      num = -num + 1;\n    } else {\n      num = -num;\n      neg = '-';\n    }\n  }\n  num = '' + num;\n  while (num.length < digits) num = ZERO_CHAR + num;\n  if (trim) {\n    num = num.substr(num.length - digits);\n  }\n  return neg + num;\n}\n\n\nfunction dateGetter(name, size, offset, trim, negWrap) {\n  offset = offset || 0;\n  return function(date) {\n    var value = date['get' + name]();\n    if (offset > 0 || value > -offset) {\n      value += offset;\n    }\n    if (value === 0 && offset === -12) value = 12;\n    return padNumber(value, size, trim, negWrap);\n  };\n}\n\nfunction dateStrGetter(name, shortForm, standAlone) {\n  return function(date, formats) {\n    var value = date['get' + name]();\n    var propPrefix = (standAlone ? 'STANDALONE' : '') + (shortForm ? 'SHORT' : '');\n    var get = uppercase(propPrefix + name);\n\n    return formats[get][value];\n  };\n}\n\nfunction timeZoneGetter(date, formats, offset) {\n  var zone = -1 * offset;\n  var paddedZone = (zone >= 0) ? '+' : '';\n\n  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +\n                padNumber(Math.abs(zone % 60), 2);\n\n  return paddedZone;\n}\n\nfunction getFirstThursdayOfYear(year) {\n    // 0 = index of January\n    var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();\n    // 4 = index of Thursday (+1 to account for 1st = 5)\n    // 11 = index of *next* Thursday (+1 account for 1st = 12)\n    return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);\n}\n\nfunction getThursdayThisWeek(datetime) {\n    return new Date(datetime.getFullYear(), datetime.getMonth(),\n      // 4 = index of Thursday\n      datetime.getDate() + (4 - datetime.getDay()));\n}\n\nfunction weekGetter(size) {\n   return function(date) {\n      var firstThurs = getFirstThursdayOfYear(date.getFullYear()),\n         thisThurs = getThursdayThisWeek(date);\n\n      var diff = +thisThurs - +firstThurs,\n         result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week\n\n      return padNumber(result, size);\n   };\n}\n\nfunction ampmGetter(date, formats) {\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\n}\n\nfunction eraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1];\n}\n\nfunction longEraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1];\n}\n\nvar DATE_FORMATS = {\n  yyyy: dateGetter('FullYear', 4, 0, false, true),\n    yy: dateGetter('FullYear', 2, 0, true, true),\n     y: dateGetter('FullYear', 1, 0, false, true),\n  MMMM: dateStrGetter('Month'),\n   MMM: dateStrGetter('Month', true),\n    MM: dateGetter('Month', 2, 1),\n     M: dateGetter('Month', 1, 1),\n  LLLL: dateStrGetter('Month', false, true),\n    dd: dateGetter('Date', 2),\n     d: dateGetter('Date', 1),\n    HH: dateGetter('Hours', 2),\n     H: dateGetter('Hours', 1),\n    hh: dateGetter('Hours', 2, -12),\n     h: dateGetter('Hours', 1, -12),\n    mm: dateGetter('Minutes', 2),\n     m: dateGetter('Minutes', 1),\n    ss: dateGetter('Seconds', 2),\n     s: dateGetter('Seconds', 1),\n     // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n     // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions\n   sss: dateGetter('Milliseconds', 3),\n  EEEE: dateStrGetter('Day'),\n   EEE: dateStrGetter('Day', true),\n     a: ampmGetter,\n     Z: timeZoneGetter,\n    ww: weekGetter(2),\n     w: weekGetter(1),\n     G: eraGetter,\n     GG: eraGetter,\n     GGG: eraGetter,\n     GGGG: longEraGetter\n};\n\nvar DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\\s\\S]*)/,\n    NUMBER_STRING = /^-?\\d+$/;\n\n/**\n * @ngdoc filter\n * @name date\n * @kind function\n *\n * @description\n *   Formats `date` to a string based on the requested `format`.\n *\n *   `format` string can be composed of the following elements:\n *\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\n *   * `'MMMM'`: Month in year (January-December)\n *   * `'MMM'`: Month in year (Jan-Dec)\n *   * `'MM'`: Month in year, padded (01-12)\n *   * `'M'`: Month in year (1-12)\n *   * `'LLLL'`: Stand-alone month in year (January-December)\n *   * `'dd'`: Day in month, padded (01-31)\n *   * `'d'`: Day in month (1-31)\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\n *   * `'EEE'`: Day in Week, (Sun-Sat)\n *   * `'HH'`: Hour in day, padded (00-23)\n *   * `'H'`: Hour in day (0-23)\n *   * `'hh'`: Hour in AM/PM, padded (01-12)\n *   * `'h'`: Hour in AM/PM, (1-12)\n *   * `'mm'`: Minute in hour, padded (00-59)\n *   * `'m'`: Minute in hour (0-59)\n *   * `'ss'`: Second in minute, padded (00-59)\n *   * `'s'`: Second in minute (0-59)\n *   * `'sss'`: Millisecond in second, padded (000-999)\n *   * `'a'`: AM/PM marker\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)\n *   * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year\n *   * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year\n *   * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD')\n *   * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini')\n *\n *   `format` string can also be one of the following predefined\n *   {@link guide/i18n localizable formats}:\n *\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\n *     (e.g. Sep 3, 2010 12:05:08 PM)\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 PM)\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US  locale\n *     (e.g. Friday, September 3, 2010)\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM)\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM)\n *\n *   `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g.\n *   `\"h 'in the morning'\"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence\n *   (e.g. `\"h 'o''clock'\"`).\n *\n *   Any other characters in the `format` string will be output as-is.\n *\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is\n *    specified in the string input, the time is considered to be in the local timezone.\n * @param {string=} format Formatting rules (see Description). If not specified,\n *    `mediumDate` is used.\n * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the\n *    continental US time zone abbreviations, but for general use, use a time zone offset, for\n *    example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)\n *    If not specified, the timezone of the browser will be used.\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\n *\n * @example\n   <example name=\"filter-date\">\n     <file name=\"index.html\">\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\n           <span>{{1288323623006 | date:'medium'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\n          <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\n          <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:\"MM/dd/yyyy 'at' h:mma\"}}</span>:\n          <span>{{'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"}}</span><br>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format date', function() {\n         expect(element(by.binding(\"1288323623006 | date:'medium'\")).getText()).\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\n         expect(element(by.binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).getText()).\n            toMatch(/2010-10-2\\d \\d{2}:\\d{2}:\\d{2} (-|\\+)?\\d{4}/);\n         expect(element(by.binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\n         expect(element(by.binding(\"'1288323623006' | date:\\\"MM/dd/yyyy 'at' h:mma\\\"\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 at \\d{1,2}:\\d{2}(AM|PM)/);\n       });\n     </file>\n   </example>\n */\ndateFilter.$inject = ['$locale'];\nfunction dateFilter($locale) {\n\n\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n                     // 1        2       3         4          5          6          7          8  9     10      11\n  function jsonStringToDate(string) {\n    var match;\n    if ((match = string.match(R_ISO8601_STR))) {\n      var date = new Date(0),\n          tzHour = 0,\n          tzMin  = 0,\n          dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,\n          timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n      if (match[9]) {\n        tzHour = toInt(match[9] + match[10]);\n        tzMin = toInt(match[9] + match[11]);\n      }\n      dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));\n      var h = toInt(match[4] || 0) - tzHour;\n      var m = toInt(match[5] || 0) - tzMin;\n      var s = toInt(match[6] || 0);\n      var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);\n      timeSetter.call(date, h, m, s, ms);\n      return date;\n    }\n    return string;\n  }\n\n\n  return function(date, format, timezone) {\n    var text = '',\n        parts = [],\n        fn, match;\n\n    format = format || 'mediumDate';\n    format = $locale.DATETIME_FORMATS[format] || format;\n    if (isString(date)) {\n      date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date);\n    }\n\n    if (isNumber(date)) {\n      date = new Date(date);\n    }\n\n    if (!isDate(date) || !isFinite(date.getTime())) {\n      return date;\n    }\n\n    while (format) {\n      match = DATE_FORMATS_SPLIT.exec(format);\n      if (match) {\n        parts = concat(parts, match, 1);\n        format = parts.pop();\n      } else {\n        parts.push(format);\n        format = null;\n      }\n    }\n\n    var dateTimezoneOffset = date.getTimezoneOffset();\n    if (timezone) {\n      dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n      date = convertTimezoneToLocal(date, timezone, true);\n    }\n    forEach(parts, function(value) {\n      fn = DATE_FORMATS[value];\n      text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset)\n                 : value === '\\'\\'' ? '\\'' : value.replace(/(^'|'$)/g, '').replace(/''/g, '\\'');\n    });\n\n    return text;\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name json\n * @kind function\n *\n * @description\n *   Allows you to convert a JavaScript object into JSON string.\n *\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\n *   the binding is automatically converted to JSON.\n *\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\n * @param {number=} spacing The number of spaces to use per indentation, defaults to 2.\n * @returns {string} JSON string.\n *\n *\n * @example\n   <example name=\"filter-json\">\n     <file name=\"index.html\">\n       <pre id=\"default-spacing\">{{ {'name':'value'} | json }}</pre>\n       <pre id=\"custom-spacing\">{{ {'name':'value'} | json:4 }}</pre>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should jsonify filtered objects', function() {\n         expect(element(by.id('default-spacing')).getText()).toMatch(/\\{\\n {2}\"name\": ?\"value\"\\n}/);\n         expect(element(by.id('custom-spacing')).getText()).toMatch(/\\{\\n {4}\"name\": ?\"value\"\\n}/);\n       });\n     </file>\n   </example>\n *\n */\nfunction jsonFilter() {\n  return function(object, spacing) {\n    if (isUndefined(spacing)) {\n        spacing = 2;\n    }\n    return toJson(object, spacing);\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name lowercase\n * @kind function\n * @description\n * Converts string to lowercase.\n *\n * See the {@link ng.uppercase uppercase filter documentation} for a functionally identical example.\n *\n * @see angular.lowercase\n */\nvar lowercaseFilter = valueFn(lowercase);\n\n\n/**\n * @ngdoc filter\n * @name uppercase\n * @kind function\n * @description\n * Converts string to uppercase.\n * @example\n   <example module=\"uppercaseFilterExample\" name=\"filter-uppercase\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('uppercaseFilterExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.title = 'This is a title';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <!-- This title should be formatted normally -->\n         <h1>{{title}}</h1>\n         <!-- This title should be capitalized -->\n         <h1>{{title | uppercase}}</h1>\n       </div>\n     </file>\n   </example>\n */\nvar uppercaseFilter = valueFn(uppercase);\n\n/**\n * @ngdoc filter\n * @name limitTo\n * @kind function\n *\n * @description\n * Creates a new array or string containing only a specified number of elements. The elements are\n * taken from either the beginning or the end of the source array, string or number, as specified by\n * the value and sign (positive or negative) of `limit`. Other array-like objects are also supported\n * (e.g. array subclasses, NodeLists, jqLite/jQuery collections etc). If a number is used as input,\n * it is converted to a string.\n *\n * @param {Array|ArrayLike|string|number} input - Array/array-like, string or number to be limited.\n * @param {string|number} limit - The length of the returned array or string. If the `limit` number\n *     is positive, `limit` number of items from the beginning of the source array/string are copied.\n *     If the number is negative, `limit` number  of items from the end of the source array/string\n *     are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined,\n *     the input will be returned unchanged.\n * @param {(string|number)=} begin - Index at which to begin limitation. As a negative index,\n *     `begin` indicates an offset from the end of `input`. Defaults to `0`.\n * @returns {Array|string} A new sub-array or substring of length `limit` or less if the input had\n *     less than `limit` elements.\n *\n * @example\n   <example module=\"limitToExample\" name=\"limit-to-filter\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('limitToExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.numbers = [1,2,3,4,5,6,7,8,9];\n             $scope.letters = \"abcdefghi\";\n             $scope.longNumber = 2345432342;\n             $scope.numLimit = 3;\n             $scope.letterLimit = 3;\n             $scope.longNumberLimit = 3;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>\n            Limit {{numbers}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"numLimit\">\n         </label>\n         <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>\n         <label>\n            Limit {{letters}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"letterLimit\">\n         </label>\n         <p>Output letters: {{ letters | limitTo:letterLimit }}</p>\n         <label>\n            Limit {{longNumber}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"longNumberLimit\">\n         </label>\n         <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var numLimitInput = element(by.model('numLimit'));\n       var letterLimitInput = element(by.model('letterLimit'));\n       var longNumberLimitInput = element(by.model('longNumberLimit'));\n       var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));\n       var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));\n       var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit'));\n\n       it('should limit the number array to first three items', function() {\n         expect(numLimitInput.getAttribute('value')).toBe('3');\n         expect(letterLimitInput.getAttribute('value')).toBe('3');\n         expect(longNumberLimitInput.getAttribute('value')).toBe('3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abc');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 234');\n       });\n\n       // There is a bug in safari and protractor that doesn't like the minus key\n       // it('should update the output when -3 is entered', function() {\n       //   numLimitInput.clear();\n       //   numLimitInput.sendKeys('-3');\n       //   letterLimitInput.clear();\n       //   letterLimitInput.sendKeys('-3');\n       //   longNumberLimitInput.clear();\n       //   longNumberLimitInput.sendKeys('-3');\n       //   expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');\n       //   expect(limitedLetters.getText()).toEqual('Output letters: ghi');\n       //   expect(limitedLongNumber.getText()).toEqual('Output long number: 342');\n       // });\n\n       it('should not exceed the maximum size of input array', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('100');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('100');\n         longNumberLimitInput.clear();\n         longNumberLimitInput.sendKeys('100');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342');\n       });\n     </file>\n   </example>\n*/\nfunction limitToFilter() {\n  return function(input, limit, begin) {\n    if (Math.abs(Number(limit)) === Infinity) {\n      limit = Number(limit);\n    } else {\n      limit = toInt(limit);\n    }\n    if (isNumberNaN(limit)) return input;\n\n    if (isNumber(input)) input = input.toString();\n    if (!isArrayLike(input)) return input;\n\n    begin = (!begin || isNaN(begin)) ? 0 : toInt(begin);\n    begin = (begin < 0) ? Math.max(0, input.length + begin) : begin;\n\n    if (limit >= 0) {\n      return sliceFn(input, begin, begin + limit);\n    } else {\n      if (begin === 0) {\n        return sliceFn(input, limit, input.length);\n      } else {\n        return sliceFn(input, Math.max(0, begin + limit), begin);\n      }\n    }\n  };\n}\n\nfunction sliceFn(input, begin, end) {\n  if (isString(input)) return input.slice(begin, end);\n\n  return slice.call(input, begin, end);\n}\n\n/**\n * @ngdoc filter\n * @name orderBy\n * @kind function\n *\n * @description\n * Returns an array containing the items from the specified `collection`, ordered by a `comparator`\n * function based on the values computed using the `expression` predicate.\n *\n * For example, `[{id: 'foo'}, {id: 'bar'}] | orderBy:'id'` would result in\n * `[{id: 'bar'}, {id: 'foo'}]`.\n *\n * The `collection` can be an Array or array-like object (e.g. NodeList, jQuery object, TypedArray,\n * String, etc).\n *\n * The `expression` can be a single predicate, or a list of predicates each serving as a tie-breaker\n * for the preceding one. The `expression` is evaluated against each item and the output is used\n * for comparing with other items.\n *\n * You can change the sorting order by setting `reverse` to `true`. By default, items are sorted in\n * ascending order.\n *\n * The comparison is done using the `comparator` function. If none is specified, a default, built-in\n * comparator is used (see below for details - in a nutshell, it compares numbers numerically and\n * strings alphabetically).\n *\n * ### Under the hood\n *\n * Ordering the specified `collection` happens in two phases:\n *\n * 1. All items are passed through the predicate (or predicates), and the returned values are saved\n *    along with their type (`string`, `number` etc). For example, an item `{label: 'foo'}`, passed\n *    through a predicate that extracts the value of the `label` property, would be transformed to:\n *    ```\n *    {\n *      value: 'foo',\n *      type: 'string',\n *      index: ...\n *    }\n *    ```\n *    **Note:** `null` values use `'null'` as their type.\n * 2. The comparator function is used to sort the items, based on the derived values, types and\n *    indices.\n *\n * If you use a custom comparator, it will be called with pairs of objects of the form\n * `{value: ..., type: '...', index: ...}` and is expected to return `0` if the objects are equal\n * (as far as the comparator is concerned), `-1` if the 1st one should be ranked higher than the\n * second, or `1` otherwise.\n *\n * In order to ensure that the sorting will be deterministic across platforms, if none of the\n * specified predicates can distinguish between two items, `orderBy` will automatically introduce a\n * dummy predicate that returns the item's index as `value`.\n * (If you are using a custom comparator, make sure it can handle this predicate as well.)\n *\n * If a custom comparator still can't distinguish between two items, then they will be sorted based\n * on their index using the built-in comparator.\n *\n * Finally, in an attempt to simplify things, if a predicate returns an object as the extracted\n * value for an item, `orderBy` will try to convert that object to a primitive value, before passing\n * it to the comparator. The following rules govern the conversion:\n *\n * 1. If the object has a `valueOf()` method that returns a primitive, its return value will be\n *    used instead.<br />\n *    (If the object has a `valueOf()` method that returns another object, then the returned object\n *    will be used in subsequent steps.)\n * 2. If the object has a custom `toString()` method (i.e. not the one inherited from `Object`) that\n *    returns a primitive, its return value will be used instead.<br />\n *    (If the object has a `toString()` method that returns another object, then the returned object\n *    will be used in subsequent steps.)\n * 3. No conversion; the object itself is used.\n *\n * ### The default comparator\n *\n * The default, built-in comparator should be sufficient for most usecases. In short, it compares\n * numbers numerically, strings alphabetically (and case-insensitively), for objects falls back to\n * using their index in the original collection, sorts values of different types by type and puts\n * `undefined` and `null` values at the end of the sorted list.\n *\n * More specifically, it follows these steps to determine the relative order of items:\n *\n * 1. If the compared values are of different types:\n *    - If one of the values is undefined, consider it \"greater than\" the other.\n *    - Else if one of the values is null, consider it \"greater than\" the other.\n *    - Else compare the types themselves alphabetically.\n * 2. If both values are of type `string`, compare them alphabetically in a case- and\n *    locale-insensitive way.\n * 3. If both values are objects, compare their indices instead.\n * 4. Otherwise, return:\n *    -  `0`, if the values are equal (by strict equality comparison, i.e. using `===`).\n *    - `-1`, if the 1st value is \"less than\" the 2nd value (compared using the `<` operator).\n *    -  `1`, otherwise.\n *\n * **Note:** If you notice numbers not being sorted as expected, make sure they are actually being\n *           saved as numbers and not strings.\n * **Note:** For the purpose of sorting, `null` and `undefined` are considered \"greater than\"\n *           any other value (with undefined \"greater than\" null). This effectively means that `null`\n *           and `undefined` values end up at the end of a list sorted in ascending order.\n * **Note:** `null` values use `'null'` as their type to be able to distinguish them from objects.\n *\n * @param {Array|ArrayLike} collection - The collection (array or array-like object) to sort.\n * @param {(Function|string|Array.<Function|string>)=} expression - A predicate (or list of\n *    predicates) to be used by the comparator to determine the order of elements.\n *\n *    Can be one of:\n *\n *    - `Function`: A getter function. This function will be called with each item as argument and\n *      the return value will be used for sorting.\n *    - `string`: An AngularJS expression. This expression will be evaluated against each item and the\n *      result will be used for sorting. For example, use `'label'` to sort by a property called\n *      `label` or `'label.substring(0, 3)'` to sort by the first 3 characters of the `label`\n *      property.<br />\n *      (The result of a constant expression is interpreted as a property name to be used for\n *      comparison. For example, use `'\"special name\"'` (note the extra pair of quotes) to sort by a\n *      property called `special name`.)<br />\n *      An expression can be optionally prefixed with `+` or `-` to control the sorting direction,\n *      ascending or descending. For example, `'+label'` or `'-label'`. If no property is provided,\n *      (e.g. `'+'` or `'-'`), the collection element itself is used in comparisons.\n *    - `Array`: An array of function and/or string predicates. If a predicate cannot determine the\n *      relative order of two items, the next predicate is used as a tie-breaker.\n *\n * **Note:** If the predicate is missing or empty then it defaults to `'+'`.\n *\n * @param {boolean=} reverse - If `true`, reverse the sorting order.\n * @param {(Function)=} comparator - The comparator function used to determine the relative order of\n *    value pairs. If omitted, the built-in comparator will be used.\n *\n * @returns {Array} - The sorted array.\n *\n *\n * @example\n * ### Ordering a table with `ngRepeat`\n *\n * The example below demonstrates a simple {@link ngRepeat ngRepeat}, where the data is sorted by\n * age in descending order (expression is set to `'-age'`). The `comparator` is not set, which means\n * it defaults to the built-in comparator.\n *\n   <example name=\"orderBy-static\" module=\"orderByExample1\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <table class=\"friends\">\n           <tr>\n             <th>Name</th>\n             <th>Phone Number</th>\n             <th>Age</th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:'-age'\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample1', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.friends = [\n             {name: 'John',   phone: '555-1212',  age: 10},\n             {name: 'Mary',   phone: '555-9876',  age: 19},\n             {name: 'Mike',   phone: '555-4321',  age: 21},\n             {name: 'Adam',   phone: '555-5678',  age: 35},\n             {name: 'Julie',  phone: '555-8765',  age: 29}\n           ];\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var names = element.all(by.repeater('friends').column('friend.name'));\n\n       it('should sort friends by age in reverse order', function() {\n         expect(names.get(0).getText()).toBe('Adam');\n         expect(names.get(1).getText()).toBe('Julie');\n         expect(names.get(2).getText()).toBe('Mike');\n         expect(names.get(3).getText()).toBe('Mary');\n         expect(names.get(4).getText()).toBe('John');\n       });\n     </file>\n   </example>\n * <hr />\n *\n * @example\n * ### Changing parameters dynamically\n *\n * All parameters can be changed dynamically. The next example shows how you can make the columns of\n * a table sortable, by binding the `expression` and `reverse` parameters to scope properties.\n *\n   <example name=\"orderBy-dynamic\" module=\"orderByExample2\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <pre>Sort by = {{propertyName}}; reverse = {{reverse}}</pre>\n         <hr/>\n         <button ng-click=\"propertyName = null; reverse = false\">Set to unsorted</button>\n         <hr/>\n         <table class=\"friends\">\n           <tr>\n             <th>\n               <button ng-click=\"sortBy('name')\">Name</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'name'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('phone')\">Phone Number</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'phone'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('age')\">Age</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'age'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:propertyName:reverse\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample2', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           var friends = [\n             {name: 'John',   phone: '555-1212',  age: 10},\n             {name: 'Mary',   phone: '555-9876',  age: 19},\n             {name: 'Mike',   phone: '555-4321',  age: 21},\n             {name: 'Adam',   phone: '555-5678',  age: 35},\n             {name: 'Julie',  phone: '555-8765',  age: 29}\n           ];\n\n           $scope.propertyName = 'age';\n           $scope.reverse = true;\n           $scope.friends = friends;\n\n           $scope.sortBy = function(propertyName) {\n             $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n             $scope.propertyName = propertyName;\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n\n       .sortorder:after {\n         content: '\\25b2';   // BLACK UP-POINTING TRIANGLE\n       }\n       .sortorder.reverse:after {\n         content: '\\25bc';   // BLACK DOWN-POINTING TRIANGLE\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var unsortButton = element(by.partialButtonText('unsorted'));\n       var nameHeader = element(by.partialButtonText('Name'));\n       var phoneHeader = element(by.partialButtonText('Phone'));\n       var ageHeader = element(by.partialButtonText('Age'));\n       var firstName = element(by.repeater('friends').column('friend.name').row(0));\n       var lastName = element(by.repeater('friends').column('friend.name').row(4));\n\n       it('should sort friends by some property, when clicking on the column header', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         phoneHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Mary');\n\n         nameHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('Mike');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n       });\n\n       it('should sort friends in reverse order, when clicking on the same column', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n       });\n\n       it('should restore the original order, when clicking \"Set to unsorted\"', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         unsortButton.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Julie');\n       });\n     </file>\n   </example>\n * <hr />\n *\n * @example\n * ### Using `orderBy` inside a controller\n *\n * It is also possible to call the `orderBy` filter manually, by injecting `orderByFilter`, and\n * calling it with the desired parameters. (Alternatively, you could inject the `$filter` factory\n * and retrieve the `orderBy` filter with `$filter('orderBy')`.)\n *\n   <example name=\"orderBy-call-manually\" module=\"orderByExample3\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <pre>Sort by = {{propertyName}}; reverse = {{reverse}}</pre>\n         <hr/>\n         <button ng-click=\"sortBy(null)\">Set to unsorted</button>\n         <hr/>\n         <table class=\"friends\">\n           <tr>\n             <th>\n               <button ng-click=\"sortBy('name')\">Name</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'name'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('phone')\">Phone Number</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'phone'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n             <th>\n               <button ng-click=\"sortBy('age')\">Age</button>\n               <span class=\"sortorder\" ng-show=\"propertyName === 'age'\" ng-class=\"{reverse: reverse}\"></span>\n             </th>\n           </tr>\n           <tr ng-repeat=\"friend in friends\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample3', [])\n         .controller('ExampleController', ['$scope', 'orderByFilter', function($scope, orderBy) {\n           var friends = [\n             {name: 'John',   phone: '555-1212',  age: 10},\n             {name: 'Mary',   phone: '555-9876',  age: 19},\n             {name: 'Mike',   phone: '555-4321',  age: 21},\n             {name: 'Adam',   phone: '555-5678',  age: 35},\n             {name: 'Julie',  phone: '555-8765',  age: 29}\n           ];\n\n           $scope.propertyName = 'age';\n           $scope.reverse = true;\n           $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse);\n\n           $scope.sortBy = function(propertyName) {\n             $scope.reverse = (propertyName !== null && $scope.propertyName === propertyName)\n                 ? !$scope.reverse : false;\n             $scope.propertyName = propertyName;\n             $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n\n       .sortorder:after {\n         content: '\\25b2';   // BLACK UP-POINTING TRIANGLE\n       }\n       .sortorder.reverse:after {\n         content: '\\25bc';   // BLACK DOWN-POINTING TRIANGLE\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var unsortButton = element(by.partialButtonText('unsorted'));\n       var nameHeader = element(by.partialButtonText('Name'));\n       var phoneHeader = element(by.partialButtonText('Phone'));\n       var ageHeader = element(by.partialButtonText('Age'));\n       var firstName = element(by.repeater('friends').column('friend.name').row(0));\n       var lastName = element(by.repeater('friends').column('friend.name').row(4));\n\n       it('should sort friends by some property, when clicking on the column header', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         phoneHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Mary');\n\n         nameHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('Mike');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n       });\n\n       it('should sort friends in reverse order, when clicking on the same column', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Adam');\n\n         ageHeader.click();\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n       });\n\n       it('should restore the original order, when clicking \"Set to unsorted\"', function() {\n         expect(firstName.getText()).toBe('Adam');\n         expect(lastName.getText()).toBe('John');\n\n         unsortButton.click();\n         expect(firstName.getText()).toBe('John');\n         expect(lastName.getText()).toBe('Julie');\n       });\n     </file>\n   </example>\n * <hr />\n *\n * @example\n * ### Using a custom comparator\n *\n * If you have very specific requirements about the way items are sorted, you can pass your own\n * comparator function. For example, you might need to compare some strings in a locale-sensitive\n * way. (When specifying a custom comparator, you also need to pass a value for the `reverse`\n * argument - passing `false` retains the default sorting order, i.e. ascending.)\n *\n   <example name=\"orderBy-custom-comparator\" module=\"orderByExample4\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <div class=\"friends-container custom-comparator\">\n           <h3>Locale-sensitive Comparator</h3>\n           <table class=\"friends\">\n             <tr>\n               <th>Name</th>\n               <th>Favorite Letter</th>\n             </tr>\n             <tr ng-repeat=\"friend in friends | orderBy:'favoriteLetter':false:localeSensitiveComparator\">\n               <td>{{friend.name}}</td>\n               <td>{{friend.favoriteLetter}}</td>\n             </tr>\n           </table>\n         </div>\n         <div class=\"friends-container default-comparator\">\n           <h3>Default Comparator</h3>\n           <table class=\"friends\">\n             <tr>\n               <th>Name</th>\n               <th>Favorite Letter</th>\n             </tr>\n             <tr ng-repeat=\"friend in friends | orderBy:'favoriteLetter'\">\n               <td>{{friend.name}}</td>\n               <td>{{friend.favoriteLetter}}</td>\n             </tr>\n           </table>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample4', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.friends = [\n             {name: 'John',   favoriteLetter: 'Ä'},\n             {name: 'Mary',   favoriteLetter: 'Ü'},\n             {name: 'Mike',   favoriteLetter: 'Ö'},\n             {name: 'Adam',   favoriteLetter: 'H'},\n             {name: 'Julie',  favoriteLetter: 'Z'}\n           ];\n\n           $scope.localeSensitiveComparator = function(v1, v2) {\n             // If we don't get strings, just compare by index\n             if (v1.type !== 'string' || v2.type !== 'string') {\n               return (v1.index < v2.index) ? -1 : 1;\n             }\n\n             // Compare strings alphabetically, taking locale into account\n             return v1.value.localeCompare(v2.value);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       .friends-container {\n         display: inline-block;\n         margin: 0 30px;\n       }\n\n       .friends {\n         border-collapse: collapse;\n       }\n\n       .friends th {\n         border-bottom: 1px solid;\n       }\n       .friends td, .friends th {\n         border-left: 1px solid;\n         padding: 5px 10px;\n       }\n       .friends td:first-child, .friends th:first-child {\n         border-left: none;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       // Element locators\n       var container = element(by.css('.custom-comparator'));\n       var names = container.all(by.repeater('friends').column('friend.name'));\n\n       it('should sort friends by favorite letter (in correct alphabetical order)', function() {\n         expect(names.get(0).getText()).toBe('John');\n         expect(names.get(1).getText()).toBe('Adam');\n         expect(names.get(2).getText()).toBe('Mike');\n         expect(names.get(3).getText()).toBe('Mary');\n         expect(names.get(4).getText()).toBe('Julie');\n       });\n     </file>\n   </example>\n *\n */\norderByFilter.$inject = ['$parse'];\nfunction orderByFilter($parse) {\n  return function(array, sortPredicate, reverseOrder, compareFn) {\n\n    if (array == null) return array;\n    if (!isArrayLike(array)) {\n      throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array);\n    }\n\n    if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; }\n    if (sortPredicate.length === 0) { sortPredicate = ['+']; }\n\n    var predicates = processPredicates(sortPredicate);\n\n    var descending = reverseOrder ? -1 : 1;\n\n    // Define the `compare()` function. Use a default comparator if none is specified.\n    var compare = isFunction(compareFn) ? compareFn : defaultCompare;\n\n    // The next three lines are a version of a Swartzian Transform idiom from Perl\n    // (sometimes called the Decorate-Sort-Undecorate idiom)\n    // See https://en.wikipedia.org/wiki/Schwartzian_transform\n    var compareValues = Array.prototype.map.call(array, getComparisonObject);\n    compareValues.sort(doComparison);\n    array = compareValues.map(function(item) { return item.value; });\n\n    return array;\n\n    function getComparisonObject(value, index) {\n      // NOTE: We are adding an extra `tieBreaker` value based on the element's index.\n      // This will be used to keep the sort stable when none of the input predicates can\n      // distinguish between two elements.\n      return {\n        value: value,\n        tieBreaker: {value: index, type: 'number', index: index},\n        predicateValues: predicates.map(function(predicate) {\n          return getPredicateValue(predicate.get(value), index);\n        })\n      };\n    }\n\n    function doComparison(v1, v2) {\n      for (var i = 0, ii = predicates.length; i < ii; i++) {\n        var result = compare(v1.predicateValues[i], v2.predicateValues[i]);\n        if (result) {\n          return result * predicates[i].descending * descending;\n        }\n      }\n\n      return (compare(v1.tieBreaker, v2.tieBreaker) || defaultCompare(v1.tieBreaker, v2.tieBreaker)) * descending;\n    }\n  };\n\n  function processPredicates(sortPredicates) {\n    return sortPredicates.map(function(predicate) {\n      var descending = 1, get = identity;\n\n      if (isFunction(predicate)) {\n        get = predicate;\n      } else if (isString(predicate)) {\n        if ((predicate.charAt(0) === '+' || predicate.charAt(0) === '-')) {\n          descending = predicate.charAt(0) === '-' ? -1 : 1;\n          predicate = predicate.substring(1);\n        }\n        if (predicate !== '') {\n          get = $parse(predicate);\n          if (get.constant) {\n            var key = get();\n            get = function(value) { return value[key]; };\n          }\n        }\n      }\n      return {get: get, descending: descending};\n    });\n  }\n\n  function isPrimitive(value) {\n    switch (typeof value) {\n      case 'number': /* falls through */\n      case 'boolean': /* falls through */\n      case 'string':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  function objectValue(value) {\n    // If `valueOf` is a valid function use that\n    if (isFunction(value.valueOf)) {\n      value = value.valueOf();\n      if (isPrimitive(value)) return value;\n    }\n    // If `toString` is a valid function and not the one from `Object.prototype` use that\n    if (hasCustomToString(value)) {\n      value = value.toString();\n      if (isPrimitive(value)) return value;\n    }\n\n    return value;\n  }\n\n  function getPredicateValue(value, index) {\n    var type = typeof value;\n    if (value === null) {\n      type = 'null';\n    } else if (type === 'object') {\n      value = objectValue(value);\n    }\n    return {value: value, type: type, index: index};\n  }\n\n  function defaultCompare(v1, v2) {\n    var result = 0;\n    var type1 = v1.type;\n    var type2 = v2.type;\n\n    if (type1 === type2) {\n      var value1 = v1.value;\n      var value2 = v2.value;\n\n      if (type1 === 'string') {\n        // Compare strings case-insensitively\n        value1 = value1.toLowerCase();\n        value2 = value2.toLowerCase();\n      } else if (type1 === 'object') {\n        // For basic objects, use the position of the object\n        // in the collection instead of the value\n        if (isObject(value1)) value1 = v1.index;\n        if (isObject(value2)) value2 = v2.index;\n      }\n\n      if (value1 !== value2) {\n        result = value1 < value2 ? -1 : 1;\n      }\n    } else {\n      result = (type1 === 'undefined') ? 1 :\n        (type2 === 'undefined') ? -1 :\n        (type1 === 'null') ? 1 :\n        (type2 === 'null') ? -1 :\n        (type1 < type2) ? -1 : 1;\n    }\n\n    return result;\n  }\n}\n\nfunction ngDirective(directive) {\n  if (isFunction(directive)) {\n    directive = {\n      link: directive\n    };\n  }\n  directive.restrict = directive.restrict || 'AC';\n  return valueFn(directive);\n}\n\n/**\n * @ngdoc directive\n * @name a\n * @restrict E\n *\n * @description\n * Modifies the default behavior of the html a tag so that the default action is prevented when\n * the href attribute is empty.\n *\n * For dynamically creating `href` attributes for a tags, see the {@link ng.ngHref `ngHref`} directive.\n */\nvar htmlAnchorDirective = valueFn({\n  restrict: 'E',\n  compile: function(element, attr) {\n    if (!attr.href && !attr.xlinkHref) {\n      return function(scope, element) {\n        // If the linked element is not an anchor tag anymore, do nothing\n        if (element[0].nodeName.toLowerCase() !== 'a') return;\n\n        // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\n        var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?\n                   'xlink:href' : 'href';\n        element.on('click', function(event) {\n          // if we have no href url, then don't navigate anywhere.\n          if (!element.attr(href)) {\n            event.preventDefault();\n          }\n        });\n      };\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngHref\n * @restrict A\n * @priority 99\n *\n * @description\n * Using AngularJS markup like `{{hash}}` in an href attribute will\n * make the link go to the wrong URL if the user clicks it before\n * AngularJS has a chance to replace the `{{hash}}` markup with its\n * value. Until AngularJS replaces the markup the link will be broken\n * and will most likely return a 404 error. The `ngHref` directive\n * solves this problem.\n *\n * The wrong way to write it:\n * ```html\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * @element A\n * @param {template} ngHref any string which can contain `{{}}` markup.\n *\n * @example\n * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes\n * in links and their different behaviors:\n    <example name=\"ng-href\">\n      <file name=\"index.html\">\n        <input ng-model=\"value\" /><br />\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should execute ng-click but not reload when href without value', function() {\n          element(by.id('link-1')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('1');\n          expect(element(by.id('link-1')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when href empty string', function() {\n          element(by.id('link-2')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('2');\n          expect(element(by.id('link-2')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click and change url when ng-href specified', function() {\n          expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\\/123$/);\n\n          element(by.id('link-3')).click();\n\n          // At this point, we navigate away from an AngularJS page, so we need\n          // to use browser.driver to get the base webdriver.\n\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/123$/);\n            });\n          }, 5000, 'page should navigate to /123');\n        });\n\n        it('should execute ng-click but not reload when href empty string and name specified', function() {\n          element(by.id('link-4')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('4');\n          expect(element(by.id('link-4')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when no href but name specified', function() {\n          element(by.id('link-5')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('5');\n          expect(element(by.id('link-5')).getAttribute('href')).toBe(null);\n        });\n\n        it('should only change url when only ng-href', function() {\n          element(by.model('value')).clear();\n          element(by.model('value')).sendKeys('6');\n          expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\\/6$/);\n\n          element(by.id('link-6')).click();\n\n          // At this point, we navigate away from an AngularJS page, so we need\n          // to use browser.driver to get the base webdriver.\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/6$/);\n            });\n          }, 5000, 'page should navigate to /6');\n        });\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSrc\n * @restrict A\n * @priority 99\n *\n * @description\n * Using AngularJS markup like `{{hash}}` in a `src` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until AngularJS replaces the expression inside\n * `{{hash}}`. The `ngSrc` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\" alt=\"Description\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\" alt=\"Description\" />\n * ```\n *\n * @element IMG\n * @param {template} ngSrc any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngSrcset\n * @restrict A\n * @priority 99\n *\n * @description\n * Using AngularJS markup like `{{hash}}` in a `srcset` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until AngularJS replaces the expression inside\n * `{{hash}}`. The `ngSrcset` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\" alt=\"Description\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\" alt=\"Description\" />\n * ```\n *\n * @element IMG\n * @param {template} ngSrcset any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngDisabled\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * This directive sets the `disabled` attribute on the element (typically a form control,\n * e.g. `input`, `button`, `select` etc.) if the\n * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `disabled`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example name=\"ng-disabled\">\n      <file name=\"index.html\">\n        <label>Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"></label><br/>\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle button', function() {\n          expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,\n *     then the `disabled` attribute will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngChecked\n * @restrict A\n * @priority 100\n *\n * @description\n * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy.\n *\n * Note that this directive should not be used together with {@link ngModel `ngModel`},\n * as this can lead to unexpected behavior.\n *\n * A special directive is necessary because we cannot use interpolation inside the `checked`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example name=\"ng-checked\">\n      <file name=\"index.html\">\n        <label>Check me to check both: <input type=\"checkbox\" ng-model=\"leader\"></label><br/>\n        <input id=\"checkFollower\" type=\"checkbox\" ng-checked=\"leader\" aria-label=\"Follower input\">\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should check both checkBoxes', function() {\n          expect(element(by.id('checkFollower')).getAttribute('checked')).toBeFalsy();\n          element(by.model('leader')).click();\n          expect(element(by.id('checkFollower')).getAttribute('checked')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,\n *     then the `checked` attribute will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngReadonly\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `readonly` attribute on the element, if the expression inside `ngReadonly` is truthy.\n * Note that `readonly` applies only to `input` elements with specific types. [See the input docs on\n * MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) for more information.\n *\n * A special directive is necessary because we cannot use interpolation inside the `readonly`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example name=\"ng-readonly\">\n      <file name=\"index.html\">\n        <label>Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"></label><br/>\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm AngularJS\" aria-label=\"Readonly field\" />\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle readonly attr', function() {\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,\n *     then special attribute \"readonly\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSelected\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `selected`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * <div class=\"alert alert-warning\">\n *   **Note:** `ngSelected` does not interact with the `select` and `ngModel` directives, it only\n *   sets the `selected` attribute on the element. If you are using `ngModel` on the select, you\n *   should not use `ngSelected` on the options, as `ngModel` will set the select value and\n *   selected options.\n * </div>\n *\n * @example\n    <example name=\"ng-selected\">\n      <file name=\"index.html\">\n        <label>Check me to select: <input type=\"checkbox\" ng-model=\"selected\"></label><br/>\n        <select aria-label=\"ngSelected demo\">\n          <option>Hello!</option>\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\n        </select>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should select Greetings!', function() {\n          expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();\n          element(by.model('selected')).click();\n          expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element OPTION\n * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,\n *     then special attribute \"selected\" will be set on the element\n */\n\n/**\n * @ngdoc directive\n * @name ngOpen\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `open` attribute on the element, if the expression inside `ngOpen` is truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `open`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * ## A note about browser compatibility\n *\n * Internet Explorer and Edge do not support the `details` element, it is\n * recommended to use {@link ng.ngShow} and {@link ng.ngHide} instead.\n *\n * @example\n     <example name=\"ng-open\">\n       <file name=\"index.html\">\n         <label>Toggle details: <input type=\"checkbox\" ng-model=\"open\"></label><br/>\n         <details id=\"details\" ng-open=\"open\">\n            <summary>List</summary>\n            <ul>\n              <li>Apple</li>\n              <li>Orange</li>\n              <li>Durian</li>\n            </ul>\n         </details>\n       </file>\n       <file name=\"protractor.js\" type=\"protractor\">\n         it('should toggle open', function() {\n           expect(element(by.id('details')).getAttribute('open')).toBeFalsy();\n           element(by.model('open')).click();\n           expect(element(by.id('details')).getAttribute('open')).toBeTruthy();\n         });\n       </file>\n     </example>\n *\n * @element DETAILS\n * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,\n *     then special attribute \"open\" will be set on the element\n */\n\nvar ngAttributeAliasDirectives = {};\n\n// boolean attrs are evaluated\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\n  // binding to multiple is not supported\n  if (propName === 'multiple') return;\n\n  function defaultLinkFn(scope, element, attr) {\n    scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {\n      attr.$set(attrName, !!value);\n    });\n  }\n\n  var normalized = directiveNormalize('ng-' + attrName);\n  var linkFn = defaultLinkFn;\n\n  if (propName === 'checked') {\n    linkFn = function(scope, element, attr) {\n      // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input\n      if (attr.ngModel !== attr[normalized]) {\n        defaultLinkFn(scope, element, attr);\n      }\n    };\n  }\n\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      restrict: 'A',\n      priority: 100,\n      link: linkFn\n    };\n  };\n});\n\n// aliased input attrs are evaluated\nforEach(ALIASED_ATTR, function(htmlAttr, ngAttr) {\n  ngAttributeAliasDirectives[ngAttr] = function() {\n    return {\n      priority: 100,\n      link: function(scope, element, attr) {\n        //special case ngPattern when a literal regular expression value\n        //is used as the expression (this way we don't have to watch anything).\n        if (ngAttr === 'ngPattern' && attr.ngPattern.charAt(0) === '/') {\n          var match = attr.ngPattern.match(REGEX_STRING_REGEXP);\n          if (match) {\n            attr.$set('ngPattern', new RegExp(match[1], match[2]));\n            return;\n          }\n        }\n\n        scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) {\n          attr.$set(ngAttr, value);\n        });\n      }\n    };\n  };\n});\n\n// ng-src, ng-srcset, ng-href are interpolated\nforEach(['src', 'srcset', 'href'], function(attrName) {\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = ['$sce', function($sce) {\n    return {\n      priority: 99, // it needs to run after the attributes are interpolated\n      link: function(scope, element, attr) {\n        var propName = attrName,\n            name = attrName;\n\n        if (attrName === 'href' &&\n            toString.call(element.prop('href')) === '[object SVGAnimatedString]') {\n          name = 'xlinkHref';\n          attr.$attr[name] = 'xlink:href';\n          propName = null;\n        }\n\n        // We need to sanitize the url at least once, in case it is a constant\n        // non-interpolated attribute.\n        attr.$set(normalized, $sce.getTrustedMediaUrl(attr[normalized]));\n\n        attr.$observe(normalized, function(value) {\n          if (!value) {\n            if (attrName === 'href') {\n              attr.$set(name, null);\n            }\n            return;\n          }\n\n          attr.$set(name, value);\n\n          // Support: IE 9-11 only\n          // On IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\n          // to set the property as well to achieve the desired effect.\n          // We use attr[attrName] value since $set might have sanitized the url.\n          if (msie && propName) element.prop(propName, attr[name]);\n        });\n      }\n    };\n  }];\n});\n\n/* global -nullFormCtrl, -PENDING_CLASS, -SUBMITTED_CLASS\n */\nvar nullFormCtrl = {\n  $addControl: noop,\n  $getControls: valueFn([]),\n  $$renameControl: nullFormRenameControl,\n  $removeControl: noop,\n  $setValidity: noop,\n  $setDirty: noop,\n  $setPristine: noop,\n  $setSubmitted: noop,\n  $$setSubmitted: noop\n},\nPENDING_CLASS = 'ng-pending',\nSUBMITTED_CLASS = 'ng-submitted';\n\nfunction nullFormRenameControl(control, name) {\n  control.$name = name;\n}\n\n/**\n * @ngdoc type\n * @name form.FormController\n *\n * @property {boolean} $pristine True if user has not interacted with the form yet.\n * @property {boolean} $dirty True if user has already interacted with the form.\n * @property {boolean} $valid True if all of the containing forms and controls are valid.\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\n * @property {boolean} $submitted True if user has submitted the form even if its invalid.\n *\n * @property {Object} $pending An object hash, containing references to controls or forms with\n *  pending validators, where:\n *\n *  - keys are validations tokens (error names).\n *  - values are arrays of controls or forms that have a pending validator for the given error name.\n *\n * See {@link form.FormController#$error $error} for a list of built-in validation tokens.\n *\n * @property {Object} $error An object hash, containing references to controls or forms with failing\n *  validators, where:\n *\n *  - keys are validation tokens (error names),\n *  - values are arrays of controls or forms that have a failing validator for the given error name.\n *\n *  Built-in validation tokens:\n *  - `email`\n *  - `max`\n *  - `maxlength`\n *  - `min`\n *  - `minlength`\n *  - `number`\n *  - `pattern`\n *  - `required`\n *  - `url`\n *  - `date`\n *  - `datetimelocal`\n *  - `time`\n *  - `week`\n *  - `month`\n *\n * @description\n * `FormController` keeps track of all its controls and nested forms as well as the state of them,\n * such as being valid/invalid or dirty/pristine.\n *\n * Each {@link ng.directive:form form} directive creates an instance\n * of `FormController`.\n *\n */\n//asks for $scope to fool the BC controller module\nFormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate'];\nfunction FormController($element, $attrs, $scope, $animate, $interpolate) {\n  this.$$controls = [];\n\n  // init state\n  this.$error = {};\n  this.$$success = {};\n  this.$pending = undefined;\n  this.$name = $interpolate($attrs.name || $attrs.ngForm || '')($scope);\n  this.$dirty = false;\n  this.$pristine = true;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$submitted = false;\n  this.$$parentForm = nullFormCtrl;\n\n  this.$$element = $element;\n  this.$$animate = $animate;\n\n  setupValidity(this);\n}\n\nFormController.prototype = {\n  /**\n   * @ngdoc method\n   * @name form.FormController#$rollbackViewValue\n   *\n   * @description\n   * Rollback all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is typically needed by the reset button of\n   * a form that uses `ng-model-options` to pend updates.\n   */\n  $rollbackViewValue: function() {\n    forEach(this.$$controls, function(control) {\n      control.$rollbackViewValue();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$commitViewValue\n   *\n   * @description\n   * Commit all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  $commitViewValue: function() {\n    forEach(this.$$controls, function(control) {\n      control.$commitViewValue();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$addControl\n   * @param {object} control control object, either a {@link form.FormController} or an\n   * {@link ngModel.NgModelController}\n   *\n   * @description\n   * Register a control with the form. Input elements using ngModelController do this automatically\n   * when they are linked.\n   *\n   * Note that the current state of the control will not be reflected on the new parent form. This\n   * is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine`\n   * state.\n   *\n   * However, if the method is used programmatically, for example by adding dynamically created controls,\n   * or controls that have been previously removed without destroying their corresponding DOM element,\n   * it's the developers responsibility to make sure the current state propagates to the parent form.\n   *\n   * For example, if an input control is added that is already `$dirty` and has `$error` properties,\n   * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form.\n   */\n  $addControl: function(control) {\n    // Breaking change - before, inputs whose name was \"hasOwnProperty\" were quietly ignored\n    // and not added to the scope.  Now we throw an error.\n    assertNotHasOwnProperty(control.$name, 'input');\n    this.$$controls.push(control);\n\n    if (control.$name) {\n      this[control.$name] = control;\n    }\n\n    control.$$parentForm = this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$getControls\n   * @returns {Array} the controls that are currently part of this form\n   *\n   * @description\n   * This method returns a **shallow copy** of the controls that are currently part of this form.\n   * The controls can be instances of {@link form.FormController `FormController`}\n   * ({@link ngForm \"child-forms\"}) and of {@link ngModel.NgModelController `NgModelController`}.\n   * If you need access to the controls of child-forms, you have to call `$getControls()`\n   * recursively on them.\n   * This can be used for example to iterate over all controls to validate them.\n   *\n   * The controls can be accessed normally, but adding to, or removing controls from the array has\n   * no effect on the form. Instead, use {@link form.FormController#$addControl `$addControl()`} and\n   * {@link form.FormController#$removeControl `$removeControl()`} for this use-case.\n   * Likewise, adding a control to, or removing a control from the form is not reflected\n   * in the shallow copy. That means you should get a fresh copy from `$getControls()` every time\n   * you need access to the controls.\n   */\n  $getControls: function() {\n    return shallowCopy(this.$$controls);\n  },\n\n  // Private API: rename a form control\n  $$renameControl: function(control, newName) {\n    var oldName = control.$name;\n\n    if (this[oldName] === control) {\n      delete this[oldName];\n    }\n    this[newName] = control;\n    control.$name = newName;\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$removeControl\n   * @param {object} control control object, either a {@link form.FormController} or an\n   * {@link ngModel.NgModelController}\n   *\n   * @description\n   * Deregister a control from the form.\n   *\n   * Input elements using ngModelController do this automatically when they are destroyed.\n   *\n   * Note that only the removed control's validation state (`$errors`etc.) will be removed from the\n   * form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be\n   * different from case to case. For example, removing the only `$dirty` control from a form may or\n   * may not mean that the form is still `$dirty`.\n   */\n  $removeControl: function(control) {\n    if (control.$name && this[control.$name] === control) {\n      delete this[control.$name];\n    }\n    forEach(this.$pending, function(value, name) {\n      // eslint-disable-next-line no-invalid-this\n      this.$setValidity(name, null, control);\n    }, this);\n    forEach(this.$error, function(value, name) {\n      // eslint-disable-next-line no-invalid-this\n      this.$setValidity(name, null, control);\n    }, this);\n    forEach(this.$$success, function(value, name) {\n      // eslint-disable-next-line no-invalid-this\n      this.$setValidity(name, null, control);\n    }, this);\n\n    arrayRemove(this.$$controls, control);\n    control.$$parentForm = nullFormCtrl;\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setDirty\n   *\n   * @description\n   * Sets the form to a dirty state.\n   *\n   * This method can be called to add the 'ng-dirty' class and set the form to a dirty\n   * state (ng-dirty class). This method will also propagate to parent forms.\n   */\n  $setDirty: function() {\n    this.$$animate.removeClass(this.$$element, PRISTINE_CLASS);\n    this.$$animate.addClass(this.$$element, DIRTY_CLASS);\n    this.$dirty = true;\n    this.$pristine = false;\n    this.$$parentForm.$setDirty();\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setPristine\n   *\n   * @description\n   * Sets the form to its pristine state.\n   *\n   * This method sets the form's `$pristine` state to true, the `$dirty` state to false, removes\n   * the `ng-dirty` class and adds the `ng-pristine` class. Additionally, it sets the `$submitted`\n   * state to false.\n   *\n   * This method will also propagate to all the controls contained in this form.\n   *\n   * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after\n   * saving or resetting it.\n   */\n  $setPristine: function() {\n    this.$$animate.setClass(this.$$element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);\n    this.$dirty = false;\n    this.$pristine = true;\n    this.$submitted = false;\n    forEach(this.$$controls, function(control) {\n      control.$setPristine();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setUntouched\n   *\n   * @description\n   * Sets the form to its untouched state.\n   *\n   * This method can be called to remove the 'ng-touched' class and set the form controls to their\n   * untouched state (ng-untouched class).\n   *\n   * Setting a form controls back to their untouched state is often useful when setting the form\n   * back to its pristine state.\n   */\n  $setUntouched: function() {\n    forEach(this.$$controls, function(control) {\n      control.$setUntouched();\n    });\n  },\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setSubmitted\n   *\n   * @description\n   * Sets the form to its `$submitted` state. This will also set `$submitted` on all child and\n   * parent forms of the form.\n   */\n  $setSubmitted: function() {\n    var rootForm = this;\n    while (rootForm.$$parentForm && (rootForm.$$parentForm !== nullFormCtrl)) {\n      rootForm = rootForm.$$parentForm;\n    }\n    rootForm.$$setSubmitted();\n  },\n\n  $$setSubmitted: function() {\n    this.$$animate.addClass(this.$$element, SUBMITTED_CLASS);\n    this.$submitted = true;\n    forEach(this.$$controls, function(control) {\n      if (control.$$setSubmitted) {\n        control.$$setSubmitted();\n      }\n    });\n  }\n};\n\n/**\n * @ngdoc method\n * @name form.FormController#$setValidity\n *\n * @description\n * Change the validity state of the form, and notify the parent form (if any).\n *\n * Application developers will rarely need to call this method directly. It is used internally, by\n * {@link ngModel.NgModelController#$setValidity NgModelController.$setValidity()}, to propagate a\n * control's validity state to the parent `FormController`.\n *\n * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be\n *        assigned to either `$error[validationErrorKey]` or `$pending[validationErrorKey]` (for\n *        unfulfilled `$asyncValidators`), so that it is available for data-binding. The\n *        `validationErrorKey` should be in camelCase and will get converted into dash-case for\n *        class name. Example: `myError` will result in `ng-valid-my-error` and\n *        `ng-invalid-my-error` classes and can be bound to as `{{ someForm.$error.myError }}`.\n * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending\n *        (undefined),  or skipped (null). Pending is used for unfulfilled `$asyncValidators`.\n *        Skipped is used by AngularJS when validators do not run because of parse errors and when\n *        `$asyncValidators` do not run because any of the `$validators` failed.\n * @param {NgModelController | FormController} controller - The controller whose validity state is\n *        triggering the change.\n */\naddSetValidityMethod({\n  clazz: FormController,\n  set: function(object, property, controller) {\n    var list = object[property];\n    if (!list) {\n      object[property] = [controller];\n    } else {\n      var index = list.indexOf(controller);\n      if (index === -1) {\n        list.push(controller);\n      }\n    }\n  },\n  unset: function(object, property, controller) {\n    var list = object[property];\n    if (!list) {\n      return;\n    }\n    arrayRemove(list, controller);\n    if (list.length === 0) {\n      delete object[property];\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngForm\n * @restrict EAC\n *\n * @description\n * Helper directive that makes it possible to create control groups inside a\n * {@link ng.directive:form `form`} directive.\n * These \"child forms\" can be used, for example, to determine the validity of a sub-group of\n * controls.\n *\n * <div class=\"alert alert-danger\">\n * **Note**: `ngForm` cannot be used as a replacement for `<form>`, because it lacks its\n * [built-in HTML functionality](https://html.spec.whatwg.org/#the-form-element).\n * Specifically, you cannot submit `ngForm` like a `<form>` tag. That means,\n * you cannot send data to the server with `ngForm`, or integrate it with\n * {@link ng.directive:ngSubmit `ngSubmit`}.\n * </div>\n *\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will\n *                              be published into the related scope, under this name.\n *\n */\n\n /**\n * @ngdoc directive\n * @name form\n * @restrict E\n *\n * @description\n * Directive that instantiates\n * {@link form.FormController FormController}.\n *\n * If the `name` attribute is specified, the form controller is published onto the current scope under\n * this name.\n *\n * ## Alias: {@link ng.directive:ngForm `ngForm`}\n *\n * In AngularJS, forms can be nested. This means that the outer form is valid when all of the child\n * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so\n * AngularJS provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to\n * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group\n * of controls needs to be determined.\n *\n * ## CSS classes\n *  - `ng-valid` is set if the form is valid.\n *  - `ng-invalid` is set if the form is invalid.\n *  - `ng-pending` is set if the form is pending.\n *  - `ng-pristine` is set if the form is pristine.\n *  - `ng-dirty` is set if the form is dirty.\n *  - `ng-submitted` is set if the form was submitted.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n *\n * ## Submitting a form and preventing the default action\n *\n * Since the role of forms in client-side AngularJS applications is different than in classical\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\n * to handle the form submission in an application-specific way.\n *\n * For this reason, AngularJS prevents the default action (form submission to the server) unless the\n * `<form>` element has an `action` attribute specified.\n *\n * You can use one of the following two ways to specify what javascript method should be called when\n * a form is submitted:\n *\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\n * - {@link ng.directive:ngClick ngClick} directive on the first\n  *  button or input field of type submit (input[type=submit])\n *\n * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}\n * or {@link ng.directive:ngClick ngClick} directives.\n * This is because of the following form submission rules in the HTML specification:\n *\n * - If a form has only one input field then hitting enter in this field triggers form submit\n * (`ngSubmit`)\n * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter\n * doesn't trigger submit\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\n *\n * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is\n * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * @animations\n * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.\n * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any\n * other validations that are performed within the form. Animations in ngForm are similar to how\n * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well\n * as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style a form element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-form {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-form.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n    <example name=\"ng-form\" deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"formExample\">\n      <file name=\"index.html\">\n       <script>\n         angular.module('formExample', [])\n           .controller('FormController', ['$scope', function($scope) {\n             $scope.userType = 'guest';\n           }]);\n       </script>\n       <style>\n        .my-form {\n          transition:all linear 0.5s;\n          background: transparent;\n        }\n        .my-form.ng-invalid {\n          background: red;\n        }\n       </style>\n       <form name=\"myForm\" ng-controller=\"FormController\" class=\"my-form\">\n         userType: <input name=\"input\" ng-model=\"userType\" required>\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">Required!</span><br>\n         <code>userType = {{userType}}</code><br>\n         <code>myForm.input.$valid = {{myForm.input.$valid}}</code><br>\n         <code>myForm.input.$error = {{myForm.input.$error}}</code><br>\n         <code>myForm.$valid = {{myForm.$valid}}</code><br>\n         <code>myForm.$error.required = {{!!myForm.$error.required}}</code><br>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should initialize to model', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n\n          expect(userType.getText()).toContain('guest');\n          expect(valid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var userInput = element(by.model('userType'));\n\n          userInput.clear();\n          userInput.sendKeys('');\n\n          expect(userType.getText()).toEqual('userType =');\n          expect(valid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n *\n * @param {string=} name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n */\nvar formDirectiveFactory = function(isNgForm) {\n  return ['$timeout', '$parse', function($timeout, $parse) {\n    var formDirective = {\n      name: 'form',\n      restrict: isNgForm ? 'EAC' : 'E',\n      require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form\n      controller: FormController,\n      compile: function ngFormCompile(formElement, attr) {\n        // Setup initial state of the control\n        formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);\n\n        var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false);\n\n        return {\n          pre: function ngFormPreLink(scope, formElement, attr, ctrls) {\n            var controller = ctrls[0];\n\n            // if `action` attr is not present on the form, prevent the default action (submission)\n            if (!('action' in attr)) {\n              // we can't use jq events because if a form is destroyed during submission the default\n              // action is not prevented. see #1238\n              //\n              // IE 9 is not affected because it doesn't fire a submit event and try to do a full\n              // page reload if the form was destroyed by submission of the form via a click handler\n              // on a button in the form. Looks like an IE9 specific bug.\n              var handleFormSubmission = function(event) {\n                scope.$apply(function() {\n                  controller.$commitViewValue();\n                  controller.$setSubmitted();\n                });\n\n                event.preventDefault();\n              };\n\n              formElement[0].addEventListener('submit', handleFormSubmission);\n\n              // unregister the preventDefault listener so that we don't not leak memory but in a\n              // way that will achieve the prevention of the default action.\n              formElement.on('$destroy', function() {\n                $timeout(function() {\n                  formElement[0].removeEventListener('submit', handleFormSubmission);\n                }, 0, false);\n              });\n            }\n\n            var parentFormCtrl = ctrls[1] || controller.$$parentForm;\n            parentFormCtrl.$addControl(controller);\n\n            var setter = nameAttr ? getSetter(controller.$name) : noop;\n\n            if (nameAttr) {\n              setter(scope, controller);\n              attr.$observe(nameAttr, function(newValue) {\n                if (controller.$name === newValue) return;\n                setter(scope, undefined);\n                controller.$$parentForm.$$renameControl(controller, newValue);\n                setter = getSetter(controller.$name);\n                setter(scope, controller);\n              });\n            }\n            formElement.on('$destroy', function() {\n              controller.$$parentForm.$removeControl(controller);\n              setter(scope, undefined);\n              extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\n            });\n          }\n        };\n      }\n    };\n\n    return formDirective;\n\n    function getSetter(expression) {\n      if (expression === '') {\n        //create an assignable expression, so forms with an empty name can be renamed later\n        return $parse('this[\"\"]').assign;\n      }\n      return $parse(expression).assign || noop;\n    }\n  }];\n};\n\nvar formDirective = formDirectiveFactory();\nvar ngFormDirective = formDirectiveFactory(true);\n\n\n\n// helper methods\nfunction setupValidity(instance) {\n  instance.$$classCache = {};\n  instance.$$classCache[INVALID_CLASS] = !(instance.$$classCache[VALID_CLASS] = instance.$$element.hasClass(VALID_CLASS));\n}\nfunction addSetValidityMethod(context) {\n  var clazz = context.clazz,\n      set = context.set,\n      unset = context.unset;\n\n  clazz.prototype.$setValidity = function(validationErrorKey, state, controller) {\n    if (isUndefined(state)) {\n      createAndSet(this, '$pending', validationErrorKey, controller);\n    } else {\n      unsetAndCleanup(this, '$pending', validationErrorKey, controller);\n    }\n    if (!isBoolean(state)) {\n      unset(this.$error, validationErrorKey, controller);\n      unset(this.$$success, validationErrorKey, controller);\n    } else {\n      if (state) {\n        unset(this.$error, validationErrorKey, controller);\n        set(this.$$success, validationErrorKey, controller);\n      } else {\n        set(this.$error, validationErrorKey, controller);\n        unset(this.$$success, validationErrorKey, controller);\n      }\n    }\n    if (this.$pending) {\n      cachedToggleClass(this, PENDING_CLASS, true);\n      this.$valid = this.$invalid = undefined;\n      toggleValidationCss(this, '', null);\n    } else {\n      cachedToggleClass(this, PENDING_CLASS, false);\n      this.$valid = isObjectEmpty(this.$error);\n      this.$invalid = !this.$valid;\n      toggleValidationCss(this, '', this.$valid);\n    }\n\n    // re-read the state as the set/unset methods could have\n    // combined state in this.$error[validationError] (used for forms),\n    // where setting/unsetting only increments/decrements the value,\n    // and does not replace it.\n    var combinedState;\n    if (this.$pending && this.$pending[validationErrorKey]) {\n      combinedState = undefined;\n    } else if (this.$error[validationErrorKey]) {\n      combinedState = false;\n    } else if (this.$$success[validationErrorKey]) {\n      combinedState = true;\n    } else {\n      combinedState = null;\n    }\n\n    toggleValidationCss(this, validationErrorKey, combinedState);\n    this.$$parentForm.$setValidity(validationErrorKey, combinedState, this);\n  };\n\n  function createAndSet(ctrl, name, value, controller) {\n    if (!ctrl[name]) {\n      ctrl[name] = {};\n    }\n    set(ctrl[name], value, controller);\n  }\n\n  function unsetAndCleanup(ctrl, name, value, controller) {\n    if (ctrl[name]) {\n      unset(ctrl[name], value, controller);\n    }\n    if (isObjectEmpty(ctrl[name])) {\n      ctrl[name] = undefined;\n    }\n  }\n\n  function cachedToggleClass(ctrl, className, switchValue) {\n    if (switchValue && !ctrl.$$classCache[className]) {\n      ctrl.$$animate.addClass(ctrl.$$element, className);\n      ctrl.$$classCache[className] = true;\n    } else if (!switchValue && ctrl.$$classCache[className]) {\n      ctrl.$$animate.removeClass(ctrl.$$element, className);\n      ctrl.$$classCache[className] = false;\n    }\n  }\n\n  function toggleValidationCss(ctrl, validationErrorKey, isValid) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n\n    cachedToggleClass(ctrl, VALID_CLASS + validationErrorKey, isValid === true);\n    cachedToggleClass(ctrl, INVALID_CLASS + validationErrorKey, isValid === false);\n  }\n}\n\nfunction isObjectEmpty(obj) {\n  if (obj) {\n    for (var prop in obj) {\n      if (obj.hasOwnProperty(prop)) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n/* global\n  VALID_CLASS: false,\n  INVALID_CLASS: false,\n  PRISTINE_CLASS: false,\n  DIRTY_CLASS: false,\n  ngModelMinErr: false\n*/\n\n// Regex code was initially obtained from SO prior to modification: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231\nvar ISO_DATE_REGEXP = /^\\d{4,}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+(?:[+-][0-2]\\d:[0-5]\\d|Z)$/;\n// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987)\n// Note: We are being more lenient, because browsers are too.\n//   1. Scheme\n//   2. Slashes\n//   3. Username\n//   4. Password\n//   5. Hostname\n//   6. Port\n//   7. Path\n//   8. Query\n//   9. Fragment\n//                 1111111111111111 222   333333    44444        55555555555555555555555     666     77777777     8888888     999\nvar URL_REGEXP = /^[a-z][a-z\\d.+-]*:\\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\\s:/?#]+|\\[[a-f\\d:]+])(?::\\d+)?(?:\\/[^?#]*)?(?:\\?[^#]*)?(?:#.*)?$/i;\n// eslint-disable-next-line max-len\nvar EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/;\nvar NUMBER_REGEXP = /^\\s*(-|\\+)?(\\d+|(\\d*(\\.\\d*)))([eE][+-]?\\d+)?\\s*$/;\nvar DATE_REGEXP = /^(\\d{4,})-(\\d{2})-(\\d{2})$/;\nvar DATETIMELOCAL_REGEXP = /^(\\d{4,})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\nvar WEEK_REGEXP = /^(\\d{4,})-W(\\d\\d)$/;\nvar MONTH_REGEXP = /^(\\d{4,})-(\\d\\d)$/;\nvar TIME_REGEXP = /^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\n\nvar PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown';\nvar PARTIAL_VALIDATION_TYPES = createMap();\nforEach('date,datetime-local,month,time,week'.split(','), function(type) {\n  PARTIAL_VALIDATION_TYPES[type] = true;\n});\n\nvar inputType = {\n\n  /**\n   * @ngdoc input\n   * @name input[text]\n   *\n   * @description\n   * Standard HTML text input with AngularJS data binding, inherited by most of the `input` elements.\n   *\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Adds `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {boolean=} [ngTrim=true] If set to false AngularJS will not automatically trim the input.\n   *    This parameter is ignored for input[type=password] controls, which will never trim the\n   *    input.\n   *\n   * @example\n      <example name=\"text-input-directive\" module=\"textInputExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('textInputExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 text: 'guest',\n                 word: /^\\s*\\w*\\s*$/\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Single word:\n             <input type=\"text\" name=\"input\" ng-model=\"example.text\"\n                    ng-pattern=\"example.word\" required ng-trim=\"false\">\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\n               Single word only!</span>\n           </div>\n           <code>text = {{example.text}}</code><br/>\n           <code>myForm.input.$valid = {{myForm.input.$valid}}</code><br/>\n           <code>myForm.input.$error = {{myForm.input.$error}}</code><br/>\n           <code>myForm.$valid = {{myForm.$valid}}</code><br/>\n           <code>myForm.$error.required = {{!!myForm.$error.required}}</code><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('example.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('guest');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if multi word', function() {\n            input.clear();\n            input.sendKeys('hello world');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'text': textInputType,\n\n    /**\n     * @ngdoc input\n     * @name input[date]\n     *\n     * @description\n     * Input with date validation and transformation. In browsers that do not yet support\n     * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601\n     * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many\n     * modern browsers do not yet support this input type, it is important to provide cues to users on the\n     * expected input format via a placeholder or label.\n     *\n     * The model must always be a Date object, otherwise AngularJS will throw an error.\n     * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n     *\n     * The timezone to be used to read/write the `Date` instance in the model can be defined using\n     * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n     *\n     * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n     * @param {string=} name Property name of the form under which the control is published.\n     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n     *   valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute\n     *   (e.g. `min=\"{{minDate | date:'yyyy-MM-dd'}}\"`). Note that `min` will also add native HTML5\n     *   constraint validation.\n     * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n     *   a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute\n     *   (e.g. `max=\"{{maxDate | date:'yyyy-MM-dd'}}\"`). Note that `max` will also add native HTML5\n     *   constraint validation.\n     * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string\n     *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n     * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string\n     *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n     * @param {string=} required Sets `required` validation error key if the value is not entered.\n     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n     *    `required` when you want to data-bind to the `required` attribute.\n     * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n     *    interaction with the input element.\n     *\n     * @example\n     <example name=\"date-input-directive\" module=\"dateInputExample\">\n     <file name=\"index.html\">\n       <script>\n          angular.module('dateInputExample', [])\n            .controller('DateController', ['$scope', function($scope) {\n              $scope.example = {\n                value: new Date(2013, 9, 22)\n              };\n            }]);\n       </script>\n       <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n          <label for=\"exampleInput\">Pick a date in 2013:</label>\n          <input type=\"date\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n              placeholder=\"yyyy-MM-dd\" min=\"2013-01-01\" max=\"2013-12-31\" required />\n          <div role=\"alert\">\n            <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n                Required!</span>\n            <span class=\"error\" ng-show=\"myForm.input.$error.date\">\n                Not a valid date!</span>\n           </div>\n           <tt>value = {{example.value | date: \"yyyy-MM-dd\"}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n       </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        var value = element(by.binding('example.value | date: \"yyyy-MM-dd\"'));\n        var valid = element(by.binding('myForm.input.$valid'));\n\n        // currently protractor/webdriver does not support\n        // sending keys to all known HTML5 input controls\n        // for various browsers (see https://github.com/angular/protractor/issues/562).\n        function setInput(val) {\n          // set the value of the element and force validation.\n          var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n          \"ipt.value = '\" + val + \"';\" +\n          \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n          browser.executeScript(scr);\n        }\n\n        it('should initialize to model', function() {\n          expect(value.getText()).toContain('2013-10-22');\n          expect(valid.getText()).toContain('myForm.input.$valid = true');\n        });\n\n        it('should be invalid if empty', function() {\n          setInput('');\n          expect(value.getText()).toEqual('value =');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n\n        it('should be invalid if over max', function() {\n          setInput('2015-01-01');\n          expect(value.getText()).toContain('');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n     </file>\n     </example>\n     */\n  'date': createDateInputType('date', DATE_REGEXP,\n         createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),\n         'yyyy-MM-dd'),\n\n   /**\n    * @ngdoc input\n    * @name input[datetime-local]\n    *\n    * @description\n    * Input with datetime validation and transformation. In browsers that do not yet support\n    * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`.\n    *\n    * The model must always be a Date object, otherwise AngularJS will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * The format of the displayed time can be adjusted with the\n    * {@link ng.directive:ngModelOptions#ngModelOptions-arguments ngModelOptions} `timeSecondsFormat`\n    * and `timeStripZeroSeconds`.\n    *\n    * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n    *   This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation\n    *   inside this attribute (e.g. `min=\"{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}\"`).\n    *   Note that `min` will also add native HTML5 constraint validation.\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n    *   This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation\n    *   inside this attribute (e.g. `max=\"{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}\"`).\n    *   Note that `max` will also add native HTML5 constraint validation.\n    * @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string\n    *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n    * @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string\n    *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"datetimelocal-input-directive\" module=\"dateExample\">\n    <file name=\"index.html\">\n      <script>\n        angular.module('dateExample', [])\n          .controller('DateController', ['$scope', function($scope) {\n            $scope.example = {\n              value: new Date(2010, 11, 28, 14, 57)\n            };\n          }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label for=\"exampleInput\">Pick a date between in 2013:</label>\n        <input type=\"datetime-local\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"yyyy-MM-ddTHH:mm:ss\" min=\"2001-01-01T00:00:00\" max=\"2013-12-31T00:00:00\" required />\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.datetimelocal\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"yyyy-MM-ddTHH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM-ddTHH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2010-12-28T14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01-01T23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,\n      createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']),\n      'yyyy-MM-ddTHH:mm:ss.sss'),\n\n  /**\n   * @ngdoc input\n   * @name input[time]\n   *\n   * @description\n   * Input with time validation and transformation. In browsers that do not yet support\n   * the HTML5 time input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a\n   * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`.\n   *\n   * The model must always be a Date object, otherwise AngularJS will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions#ngModelOptions-arguments ngModelOptions}. By default,\n   * this is the timezone of the browser.\n   *\n   * The format of the displayed time can be adjusted with the\n   * {@link ng.directive:ngModelOptions#ngModelOptions-arguments ngModelOptions} `timeSecondsFormat`\n   * and `timeStripZeroSeconds`.\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *   This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this\n   *   attribute (e.g. `min=\"{{minTime | date:'HH:mm:ss'}}\"`). Note that `min` will also add\n   *   native HTML5 constraint validation.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *   This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this\n   *   attribute (e.g. `max=\"{{maxTime | date:'HH:mm:ss'}}\"`). Note that `max` will also add\n   *   native HTML5 constraint validation.\n   * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the\n   *   `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n   * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the\n   *   `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"time-input-directive\" module=\"timeExample\">\n   <file name=\"index.html\">\n     <script>\n      angular.module('timeExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(1970, 0, 1, 14, 57, 0)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label for=\"exampleInput\">Pick a time between 8am and 5pm:</label>\n        <input type=\"time\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"HH:mm:ss\" min=\"08:00:00\" max=\"17:00:00\" required />\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.time\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"HH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"HH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'time': createDateInputType('time', TIME_REGEXP,\n      createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']),\n     'HH:mm:ss.sss'),\n\n   /**\n    * @ngdoc input\n    * @name input[week]\n    *\n    * @description\n    * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support\n    * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * week format (yyyy-W##), for example: `2013-W02`.\n    *\n    * The model must always be a Date object, otherwise AngularJS will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The value of the resulting Date object will be set to Thursday at 00:00:00 of the requested week,\n    * due to ISO-8601 week numbering standards. Information on ISO's system for numbering the weeks of the\n    * year can be found at: https://en.wikipedia.org/wiki/ISO_8601#Week_dates\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n    *   This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this\n    *   attribute (e.g. `min=\"{{minWeek | date:'yyyy-Www'}}\"`). Note that `min` will also add\n    *   native HTML5 constraint validation.\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n    *   This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this\n    *   attribute (e.g. `max=\"{{maxWeek | date:'yyyy-Www'}}\"`). Note that `max` will also add\n    *   native HTML5 constraint validation.\n    * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string\n    *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n    * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string\n    *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"week-input-directive\" module=\"weekExample\">\n    <file name=\"index.html\">\n      <script>\n      angular.module('weekExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 0, 3)\n          };\n        }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label>Pick a date between in 2013:\n          <input id=\"exampleInput\" type=\"week\" name=\"input\" ng-model=\"example.value\"\n                 placeholder=\"YYYY-W##\" min=\"2012-W32\"\n                 max=\"2013-W52\" required />\n        </label>\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.week\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"yyyy-Www\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-Www\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-W01');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-W01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),\n\n  /**\n   * @ngdoc input\n   * @name input[month]\n   *\n   * @description\n   * Input with month validation and transformation. In browsers that do not yet support\n   * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * month format (yyyy-MM), for example: `2009-01`.\n   *\n   * The model must always be a Date object, otherwise AngularJS will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   * If the model is not set to the first of the month, the next view to model update will set it\n   * to the first of the month.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *   This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this\n   *   attribute (e.g. `min=\"{{minMonth | date:'yyyy-MM'}}\"`). Note that `min` will also add\n   *   native HTML5 constraint validation.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *   This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this\n   *   attribute (e.g. `max=\"{{maxMonth | date:'yyyy-MM'}}\"`). Note that `max` will also add\n   *   native HTML5 constraint validation.\n   * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string\n   *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n   * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string\n   *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"month-input-directive\" module=\"monthExample\">\n   <file name=\"index.html\">\n     <script>\n      angular.module('monthExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 9, 1)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n       <label for=\"exampleInput\">Pick a month in 2013:</label>\n       <input id=\"exampleInput\" type=\"month\" name=\"input\" ng-model=\"example.value\"\n          placeholder=\"yyyy-MM\" min=\"2013-01\" max=\"2013-12\" required />\n       <div role=\"alert\">\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n         <span class=\"error\" ng-show=\"myForm.input.$error.month\">\n            Not a valid month!</span>\n       </div>\n       <tt>value = {{example.value | date: \"yyyy-MM\"}}</tt><br/>\n       <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n       <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n       <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n       <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-10');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'month': createDateInputType('month', MONTH_REGEXP,\n     createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),\n     'yyyy-MM'),\n\n  /**\n   * @ngdoc input\n   * @name input[number]\n   *\n   * @description\n   * Text input with number validation and transformation. Sets the `number` validation\n   * error if not a valid number.\n   *\n   * <div class=\"alert alert-warning\">\n   * The model must always be of type `number` otherwise AngularJS will throw an error.\n   * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt}\n   * error docs for more information and an example of how to convert your model if necessary.\n   * </div>\n   *\n   *\n   *\n   * @knownIssue\n   *\n   * ### HTML5 constraint validation and `allowInvalid`\n   *\n   * In browsers that follow the\n   * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29),\n   * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}.\n   * If a non-number is entered in the input, the browser will report the value as an empty string,\n   * which means the view / model values in `ngModel` and subsequently the scope value\n   * will also be an empty string.\n   *\n   * @knownIssue\n   *\n   * ### Large numbers and `step` validation\n   *\n   * The `step` validation will not work correctly for very large numbers (e.g. 9999999999) due to\n   * Javascript's arithmetic limitations. If you need to handle large numbers, purpose-built\n   * libraries (e.g. https://github.com/MikeMcl/big.js/), can be included into AngularJS by\n   * {@link guide/forms#modifying-built-in-validators overwriting the validators}\n   * for `number` and / or `step`, or by {@link guide/forms#custom-validation applying custom validators}\n   * to an `input[text]` element. The source for `input[number]` type can be used as a starting\n   * point for both implementations.\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *    Can be interpolated.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *    Can be interpolated.\n   * @param {string=} ngMin Like `min`, sets the `min` validation error key if the value entered is less than `ngMin`,\n   *    but does not trigger HTML5 native validation. Takes an expression.\n   * @param {string=} ngMax Like `max`, sets the `max` validation error key if the value entered is greater than `ngMax`,\n   *    but does not trigger HTML5 native validation. Takes an expression.\n   * @param {string=} step Sets the `step` validation error key if the value entered does not fit the `step` constraint.\n   *    Can be interpolated.\n   * @param {string=} ngStep Like `step`, sets the `step` validation error key if the value entered does not fit the `ngStep` constraint,\n   *    but does not trigger HTML5 native validation. Takes an expression.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"number-input-directive\" module=\"numberExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('numberExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 value: 12\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Number:\n             <input type=\"number\" name=\"input\" ng-model=\"example.value\"\n                    min=\"0\" max=\"99\" required>\n          </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.number\">\n               Not valid number!</span>\n           </div>\n           <tt>value = {{example.value}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var value = element(by.binding('example.value'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.value'));\n\n          it('should initialize to model', function() {\n            expect(value.getText()).toContain('12');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if over max', function() {\n            input.clear();\n            input.sendKeys('123');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'number': numberInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[url]\n   *\n   * @description\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\n   * valid URL.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex\n   * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify\n   * the built-in validators (see the {@link guide/forms Forms guide})\n   * </div>\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"url-input-directive\" module=\"urlExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('urlExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.url = {\n                 text: 'http://google.com'\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>URL:\n             <input type=\"url\" name=\"input\" ng-model=\"url.text\" required>\n           <label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.url\">\n               Not valid url!</span>\n           </div>\n           <tt>text = {{url.text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('url.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('url.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('http://google.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not url', function() {\n            input.clear();\n            input.sendKeys('box');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'url': urlInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[email]\n   *\n   * @description\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\n   * address.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex\n   * used in Chromium, which may not fulfill your app's requirements.\n   * If you need stricter (e.g. requiring a top-level domain), or more relaxed validation\n   * (e.g. allowing IPv6 address literals) you can use `ng-pattern` or\n   * modify the built-in validators (see the {@link guide/forms Forms guide}).\n   * </div>\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"email-input-directive\" module=\"emailExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('emailExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.email = {\n                 text: 'me@example.com'\n               };\n             }]);\n         </script>\n           <form name=\"myForm\" ng-controller=\"ExampleController\">\n             <label>Email:\n               <input type=\"email\" name=\"input\" ng-model=\"email.text\" required>\n             </label>\n             <div role=\"alert\">\n               <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n                 Required!</span>\n               <span class=\"error\" ng-show=\"myForm.input.$error.email\">\n                 Not valid email!</span>\n             </div>\n             <tt>text = {{email.text}}</tt><br/>\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\n           </form>\n         </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('email.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('email.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('me@example.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not email', function() {\n            input.clear();\n            input.sendKeys('xxx');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'email': emailInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[radio]\n   *\n   * @description\n   * HTML radio button.\n   *\n   * **Note:**<br>\n   * All inputs controlled by {@link ngModel ngModel} (including those of type `radio`) will use the\n   * value of their `name` attribute to determine the property under which their\n   * {@link ngModel.NgModelController NgModelController} will be published on the parent\n   * {@link form.FormController FormController}. Thus, if you use the same `name` for multiple\n   * inputs of a form (e.g. a group of radio inputs), only _one_ `NgModelController` will be\n   * published on the parent `FormController` under that name. The rest of the controllers will\n   * continue to work as expected, but you won't be able to access them as properties on the parent\n   * `FormController`.\n   *\n   * <div class=\"alert alert-info\">\n   *   <p>\n   *     In plain HTML forms, the `name` attribute is used to identify groups of radio inputs, so\n   *     that the browser can manage their state (checked/unchecked) based on the state of other\n   *     inputs in the same group.\n   *   </p>\n   *   <p>\n   *     In AngularJS forms, this is not necessary. The input's state will be updated based on the\n   *     value of the underlying model data.\n   *   </p>\n   * </div>\n   *\n   * <div class=\"alert alert-success\">\n   *   If you omit the `name` attribute on a radio input, `ngModel` will automatically assign it a\n   *   unique name.\n   * </div>\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string} value The value to which the `ngModel` expression should be set when selected.\n   *    Note that `value` only supports `string` values, i.e. the scope model needs to be a string,\n   *    too. Use `ngValue` if you need complex models (`number`, `object`, ...).\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {string} ngValue AngularJS expression to which `ngModel` will be be set when the radio\n   *    is selected. Should be used instead of the `value` attribute if you need\n   *    a non-string `ngModel` (`boolean`, `array`, ...).\n   *\n   * @example\n      <example name=\"radio-input-directive\" module=\"radioExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('radioExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.color = {\n                 name: 'blue'\n               };\n               $scope.specialValue = {\n                 \"id\": \"12345\",\n                 \"value\": \"green\"\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" value=\"red\">\n             Red\n           </label><br/>\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" ng-value=\"specialValue\">\n             Green\n           </label><br/>\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" value=\"blue\">\n             Blue\n           </label><br/>\n           <tt>color = {{color.name | json}}</tt><br/>\n          </form>\n          Note that `ng-value=\"specialValue\"` sets radio item's value to be the value of `$scope.specialValue`.\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var inputs = element.all(by.model('color.name'));\n            var color = element(by.binding('color.name'));\n\n            expect(color.getText()).toContain('blue');\n\n            inputs.get(0).click();\n            expect(color.getText()).toContain('red');\n\n            inputs.get(1).click();\n            expect(color.getText()).toContain('green');\n          });\n        </file>\n      </example>\n   */\n  'radio': radioInputType,\n\n  /**\n   * @ngdoc input\n   * @name input[range]\n   *\n   * @description\n   * Native range input with validation and transformation.\n   *\n   * The model for the range input must always be a `Number`.\n   *\n   * IE9 and other browsers that do not support the `range` type fall back\n   * to a text input without any default values for `min`, `max` and `step`. Model binding,\n   * validation and number parsing are nevertheless supported.\n   *\n   * Browsers that support range (latest Chrome, Safari, Firefox, Edge) treat `input[range]`\n   * in a way that never allows the input to hold an invalid value. That means:\n   * - any non-numerical value is set to `(max + min) / 2`.\n   * - any numerical value that is less than the current min val, or greater than the current max val\n   * is set to the min / max val respectively.\n   * - additionally, the current `step` is respected, so the nearest value that satisfies a step\n   * is used.\n   *\n   * See the [HTML Spec on input[type=range]](https://www.w3.org/TR/html5/forms.html#range-state-(type=range))\n   * for more info.\n   *\n   * This has the following consequences for AngularJS:\n   *\n   * Since the element value should always reflect the current model value, a range input\n   * will set the bound ngModel expression to the value that the browser has set for the\n   * input element. For example, in the following input `<input type=\"range\" ng-model=\"model.value\">`,\n   * if the application sets `model.value = null`, the browser will set the input to `'50'`.\n   * AngularJS will then set the model to `50`, to prevent input and model value being out of sync.\n   *\n   * That means the model for range will immediately be set to `50` after `ngModel` has been\n   * initialized. It also means a range input can never have the required error.\n   *\n   * This does not only affect changes to the model value, but also to the values of the `min`,\n   * `max`, and `step` attributes. When these change in a way that will cause the browser to modify\n   * the input value, AngularJS will also update the model value.\n   *\n   * Automatic value adjustment also means that a range input element can never have the `required`,\n   * `min`, or `max` errors.\n   *\n   * However, `step` is currently only fully implemented by Firefox. Other browsers have problems\n   * when the step value changes dynamically - they do not adjust the element value correctly, but\n   * instead may set the `stepMismatch` error. If that's the case, the AngularJS will set the `step`\n   * error on the input, and set the model to `undefined`.\n   *\n   * Note that `input[range]` is not compatible with`ngMax`, `ngMin`, and `ngStep`, because they do\n   * not set the `min` and `max` attributes, which means that the browser won't automatically adjust\n   * the input value based on their values, and will always assume min = 0, max = 100, and step = 1.\n   *\n   * @param {string}  ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation to ensure that the value entered is greater\n   *                  than `min`. Can be interpolated.\n   * @param {string=} max Sets the `max` validation to ensure that the value entered is less than `max`.\n   *                  Can be interpolated.\n   * @param {string=} step Sets the `step` validation to ensure that the value entered matches the `step`\n   *                  Can be interpolated.\n   * @param {expression=} ngChange AngularJS expression to be executed when the ngModel value changes due\n   *                      to user interaction with the input element.\n   * @param {expression=} ngChecked If the expression is truthy, then the `checked` attribute will be set on the\n   *                      element. **Note** : `ngChecked` should not be used alongside `ngModel`.\n   *                      Checkout {@link ng.directive:ngChecked ngChecked} for usage.\n   *\n   * @example\n      <example name=\"range-input-directive\" module=\"rangeExample\">\n        <file name=\"index.html\">\n          <script>\n            angular.module('rangeExample', [])\n              .controller('ExampleController', ['$scope', function($scope) {\n                $scope.value = 75;\n                $scope.min = 10;\n                $scope.max = 90;\n              }]);\n          </script>\n          <form name=\"myForm\" ng-controller=\"ExampleController\">\n\n            Model as range: <input type=\"range\" name=\"range\" ng-model=\"value\" min=\"{{min}}\"  max=\"{{max}}\">\n            <hr>\n            Model as number: <input type=\"number\" ng-model=\"value\"><br>\n            Min: <input type=\"number\" ng-model=\"min\"><br>\n            Max: <input type=\"number\" ng-model=\"max\"><br>\n            value = <code>{{value}}</code><br/>\n            myForm.range.$valid = <code>{{myForm.range.$valid}}</code><br/>\n            myForm.range.$error = <code>{{myForm.range.$error}}</code>\n          </form>\n        </file>\n      </example>\n\n   * ## Range Input with ngMin & ngMax attributes\n\n   * @example\n      <example name=\"range-input-directive-ng\" module=\"rangeExample\">\n        <file name=\"index.html\">\n          <script>\n            angular.module('rangeExample', [])\n              .controller('ExampleController', ['$scope', function($scope) {\n                $scope.value = 75;\n                $scope.min = 10;\n                $scope.max = 90;\n              }]);\n          </script>\n          <form name=\"myForm\" ng-controller=\"ExampleController\">\n            Model as range: <input type=\"range\" name=\"range\" ng-model=\"value\" ng-min=\"min\" ng-max=\"max\">\n            <hr>\n            Model as number: <input type=\"number\" ng-model=\"value\"><br>\n            Min: <input type=\"number\" ng-model=\"min\"><br>\n            Max: <input type=\"number\" ng-model=\"max\"><br>\n            value = <code>{{value}}</code><br/>\n            myForm.range.$valid = <code>{{myForm.range.$valid}}</code><br/>\n            myForm.range.$error = <code>{{myForm.range.$error}}</code>\n          </form>\n        </file>\n      </example>\n\n   */\n  'range': rangeInputType,\n\n  /**\n   * @ngdoc input\n   * @name input[checkbox]\n   *\n   * @description\n   * HTML checkbox.\n   *\n   * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {expression=} ngTrueValue The value to which the expression should be set when selected.\n   * @param {expression=} ngFalseValue The value to which the expression should be set when not selected.\n   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"checkbox-input-directive\" module=\"checkboxExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('checkboxExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.checkboxModel = {\n                value1 : true,\n                value2 : 'YES'\n              };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Value1:\n             <input type=\"checkbox\" ng-model=\"checkboxModel.value1\">\n           </label><br/>\n           <label>Value2:\n             <input type=\"checkbox\" ng-model=\"checkboxModel.value2\"\n                    ng-true-value=\"'YES'\" ng-false-value=\"'NO'\">\n            </label><br/>\n           <tt>value1 = {{checkboxModel.value1}}</tt><br/>\n           <tt>value2 = {{checkboxModel.value2}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var value1 = element(by.binding('checkboxModel.value1'));\n            var value2 = element(by.binding('checkboxModel.value2'));\n\n            expect(value1.getText()).toContain('true');\n            expect(value2.getText()).toContain('YES');\n\n            element(by.model('checkboxModel.value1')).click();\n            element(by.model('checkboxModel.value2')).click();\n\n            expect(value1.getText()).toContain('false');\n            expect(value2.getText()).toContain('NO');\n          });\n        </file>\n      </example>\n   */\n  'checkbox': checkboxInputType,\n\n  'hidden': noop,\n  'button': noop,\n  'submit': noop,\n  'reset': noop,\n  'file': noop\n};\n\nfunction stringBasedInputType(ctrl) {\n  ctrl.$formatters.push(function(value) {\n    return ctrl.$isEmpty(value) ? value : value.toString();\n  });\n}\n\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n}\n\nfunction baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  var type = lowercase(element[0].type);\n\n  // In composition mode, users are still inputting intermediate text buffer,\n  // hold the listener until composition is done.\n  // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent\n  if (!$sniffer.android) {\n    var composing = false;\n\n    element.on('compositionstart', function() {\n      composing = true;\n    });\n\n    // Support: IE9+\n    element.on('compositionupdate', function(ev) {\n      // End composition when ev.data is empty string on 'compositionupdate' event.\n      // When the input de-focusses (e.g. by clicking away), IE triggers 'compositionupdate'\n      // instead of 'compositionend'.\n      if (isUndefined(ev.data) || ev.data === '') {\n        composing = false;\n      }\n    });\n\n    element.on('compositionend', function() {\n      composing = false;\n      listener();\n    });\n  }\n\n  var timeout;\n\n  var listener = function(ev) {\n    if (timeout) {\n      $browser.defer.cancel(timeout);\n      timeout = null;\n    }\n    if (composing) return;\n    var value = element.val(),\n        event = ev && ev.type;\n\n    // By default we will trim the value\n    // If the attribute ng-trim exists we will avoid trimming\n    // If input type is 'password', the value is never trimmed\n    if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) {\n      value = trim(value);\n    }\n\n    // If a control is suffering from bad input (due to native validators), browsers discard its\n    // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the\n    // control's value is the same empty value twice in a row.\n    if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) {\n      ctrl.$setViewValue(value, event);\n    }\n  };\n\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\n  // input event on backspace, delete or cut\n  if ($sniffer.hasEvent('input')) {\n    element.on('input', listener);\n  } else {\n    var deferListener = function(ev, input, origValue) {\n      if (!timeout) {\n        timeout = $browser.defer(function() {\n          timeout = null;\n          if (!input || input.value !== origValue) {\n            listener(ev);\n          }\n        });\n      }\n    };\n\n    element.on('keydown', /** @this */ function(event) {\n      var key = event.keyCode;\n\n      // ignore\n      //    command            modifiers                   arrows\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\n\n      deferListener(event, this, this.value);\n    });\n\n    // if user modifies input value using context menu in IE, we need \"paste\", \"cut\" and \"drop\" events to catch it\n    if ($sniffer.hasEvent('paste')) {\n      element.on('paste cut drop', deferListener);\n    }\n  }\n\n  // if user paste into input using mouse on older browser\n  // or form autocomplete on newer browser, we need \"change\" event to catch it\n  element.on('change', listener);\n\n  // Some native input types (date-family) have the ability to change validity without\n  // firing any input/change events.\n  // For these event types, when native validators are present and the browser supports the type,\n  // check for validity changes on various DOM events.\n  if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) {\n    element.on(PARTIAL_VALIDATION_EVENTS, /** @this */ function(ev) {\n      if (!timeout) {\n        var validity = this[VALIDITY_STATE_PROPERTY];\n        var origBadInput = validity.badInput;\n        var origTypeMismatch = validity.typeMismatch;\n        timeout = $browser.defer(function() {\n          timeout = null;\n          if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) {\n            listener(ev);\n          }\n        });\n      }\n    });\n  }\n\n  ctrl.$render = function() {\n    // Workaround for Firefox validation #12102.\n    var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue;\n    if (element.val() !== value) {\n      element.val(value);\n    }\n  };\n}\n\nfunction weekParser(isoWeek, existingDate) {\n  if (isDate(isoWeek)) {\n    return isoWeek;\n  }\n\n  if (isString(isoWeek)) {\n    WEEK_REGEXP.lastIndex = 0;\n    var parts = WEEK_REGEXP.exec(isoWeek);\n    if (parts) {\n      var year = +parts[1],\n          week = +parts[2],\n          hours = 0,\n          minutes = 0,\n          seconds = 0,\n          milliseconds = 0,\n          firstThurs = getFirstThursdayOfYear(year),\n          addDays = (week - 1) * 7;\n\n      if (existingDate) {\n        hours = existingDate.getHours();\n        minutes = existingDate.getMinutes();\n        seconds = existingDate.getSeconds();\n        milliseconds = existingDate.getMilliseconds();\n      }\n\n      return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds);\n    }\n  }\n\n  return NaN;\n}\n\nfunction createDateParser(regexp, mapping) {\n  return function(iso, previousDate) {\n    var parts, map;\n\n    if (isDate(iso)) {\n      return iso;\n    }\n\n    if (isString(iso)) {\n      // When a date is JSON'ified to wraps itself inside of an extra\n      // set of double quotes. This makes the date parsing code unable\n      // to match the date string and parse it as a date.\n      if (iso.charAt(0) === '\"' && iso.charAt(iso.length - 1) === '\"') {\n        iso = iso.substring(1, iso.length - 1);\n      }\n      if (ISO_DATE_REGEXP.test(iso)) {\n        return new Date(iso);\n      }\n      regexp.lastIndex = 0;\n      parts = regexp.exec(iso);\n\n      if (parts) {\n        parts.shift();\n        if (previousDate) {\n          map = {\n            yyyy: previousDate.getFullYear(),\n            MM: previousDate.getMonth() + 1,\n            dd: previousDate.getDate(),\n            HH: previousDate.getHours(),\n            mm: previousDate.getMinutes(),\n            ss: previousDate.getSeconds(),\n            sss: previousDate.getMilliseconds() / 1000\n          };\n        } else {\n          map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 };\n        }\n\n        forEach(parts, function(part, index) {\n          if (index < mapping.length) {\n            map[mapping[index]] = +part;\n          }\n        });\n\n        var date = new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);\n        if (map.yyyy < 100) {\n          // In the constructor, 2-digit years map to 1900-1999.\n          // Use `setFullYear()` to set the correct year.\n          date.setFullYear(map.yyyy);\n        }\n\n        return date;\n      }\n    }\n\n    return NaN;\n  };\n}\n\nfunction createDateInputType(type, regexp, parseDate, format) {\n  return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {\n    badInputChecker(scope, element, attr, ctrl, type);\n    baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n    var isTimeType = type === 'time' || type === 'datetimelocal';\n    var previousDate;\n    var previousTimezone;\n\n    ctrl.$parsers.push(function(value) {\n      if (ctrl.$isEmpty(value)) return null;\n\n      if (regexp.test(value)) {\n        // Note: We cannot read ctrl.$modelValue, as there might be a different\n        // parser/formatter in the processing chain so that the model\n        // contains some different data format!\n        return parseDateAndConvertTimeZoneToLocal(value, previousDate);\n      }\n      ctrl.$$parserName = type;\n      return undefined;\n    });\n\n    ctrl.$formatters.push(function(value) {\n      if (value && !isDate(value)) {\n        throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);\n      }\n      if (isValidDate(value)) {\n        previousDate = value;\n        var timezone = ctrl.$options.getOption('timezone');\n\n        if (timezone) {\n          previousTimezone = timezone;\n          previousDate = convertTimezoneToLocal(previousDate, timezone, true);\n        }\n\n        return formatter(value, timezone);\n      } else {\n        previousDate = null;\n        previousTimezone = null;\n        return '';\n      }\n    });\n\n    if (isDefined(attr.min) || attr.ngMin) {\n      var minVal = attr.min || $parse(attr.ngMin)(scope);\n      var parsedMinVal = parseObservedDateValue(minVal);\n\n      ctrl.$validators.min = function(value) {\n        return !isValidDate(value) || isUndefined(parsedMinVal) || parseDate(value) >= parsedMinVal;\n      };\n      attr.$observe('min', function(val) {\n        if (val !== minVal) {\n          parsedMinVal = parseObservedDateValue(val);\n          minVal = val;\n          ctrl.$validate();\n        }\n      });\n    }\n\n    if (isDefined(attr.max) || attr.ngMax) {\n      var maxVal = attr.max || $parse(attr.ngMax)(scope);\n      var parsedMaxVal = parseObservedDateValue(maxVal);\n\n      ctrl.$validators.max = function(value) {\n        return !isValidDate(value) || isUndefined(parsedMaxVal) || parseDate(value) <= parsedMaxVal;\n      };\n      attr.$observe('max', function(val) {\n        if (val !== maxVal) {\n          parsedMaxVal = parseObservedDateValue(val);\n          maxVal = val;\n          ctrl.$validate();\n        }\n      });\n    }\n\n    function isValidDate(value) {\n      // Invalid Date: getTime() returns NaN\n      return value && !(value.getTime && value.getTime() !== value.getTime());\n    }\n\n    function parseObservedDateValue(val) {\n      return isDefined(val) && !isDate(val) ? parseDateAndConvertTimeZoneToLocal(val) || undefined : val;\n    }\n\n    function parseDateAndConvertTimeZoneToLocal(value, previousDate) {\n      var timezone = ctrl.$options.getOption('timezone');\n\n      if (previousTimezone && previousTimezone !== timezone) {\n        // If the timezone has changed, adjust the previousDate to the default timezone\n        // so that the new date is converted with the correct timezone offset\n        previousDate = addDateMinutes(previousDate, timezoneToOffset(previousTimezone));\n      }\n\n      var parsedDate = parseDate(value, previousDate);\n\n      if (!isNaN(parsedDate) && timezone) {\n        parsedDate = convertTimezoneToLocal(parsedDate, timezone);\n      }\n      return parsedDate;\n    }\n\n    function formatter(value, timezone) {\n      var targetFormat = format;\n\n      if (isTimeType && isString(ctrl.$options.getOption('timeSecondsFormat'))) {\n        targetFormat = format\n          .replace('ss.sss', ctrl.$options.getOption('timeSecondsFormat'))\n          .replace(/:$/, '');\n      }\n\n      var formatted =  $filter('date')(value, targetFormat, timezone);\n\n      if (isTimeType && ctrl.$options.getOption('timeStripZeroSeconds')) {\n        formatted = formatted.replace(/(?::00)?(?:\\.000)?$/, '');\n      }\n\n      return formatted;\n    }\n  };\n}\n\nfunction badInputChecker(scope, element, attr, ctrl, parserName) {\n  var node = element[0];\n  var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity);\n  if (nativeValidation) {\n    ctrl.$parsers.push(function(value) {\n      var validity = element.prop(VALIDITY_STATE_PROPERTY) || {};\n      if (validity.badInput || validity.typeMismatch) {\n        ctrl.$$parserName = parserName;\n        return undefined;\n      }\n\n      return value;\n    });\n  }\n}\n\nfunction numberFormatterParser(ctrl) {\n  ctrl.$parsers.push(function(value) {\n    if (ctrl.$isEmpty(value))      return null;\n    if (NUMBER_REGEXP.test(value)) return parseFloat(value);\n\n    ctrl.$$parserName = 'number';\n    return undefined;\n  });\n\n  ctrl.$formatters.push(function(value) {\n    if (!ctrl.$isEmpty(value)) {\n      if (!isNumber(value)) {\n        throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);\n      }\n      value = value.toString();\n    }\n    return value;\n  });\n}\n\nfunction parseNumberAttrVal(val) {\n  if (isDefined(val) && !isNumber(val)) {\n    val = parseFloat(val);\n  }\n  return !isNumberNaN(val) ? val : undefined;\n}\n\nfunction isNumberInteger(num) {\n  // See http://stackoverflow.com/questions/14636536/how-to-check-if-a-variable-is-an-integer-in-javascript#14794066\n  // (minus the assumption that `num` is a number)\n\n  // eslint-disable-next-line no-bitwise\n  return (num | 0) === num;\n}\n\nfunction countDecimals(num) {\n  var numString = num.toString();\n  var decimalSymbolIndex = numString.indexOf('.');\n\n  if (decimalSymbolIndex === -1) {\n    if (-1 < num && num < 1) {\n      // It may be in the exponential notation format (`1e-X`)\n      var match = /e-(\\d+)$/.exec(numString);\n\n      if (match) {\n        return Number(match[1]);\n      }\n    }\n\n    return 0;\n  }\n\n  return numString.length - decimalSymbolIndex - 1;\n}\n\nfunction isValidForStep(viewValue, stepBase, step) {\n  // At this point `stepBase` and `step` are expected to be non-NaN values\n  // and `viewValue` is expected to be a valid stringified number.\n  var value = Number(viewValue);\n\n  var isNonIntegerValue = !isNumberInteger(value);\n  var isNonIntegerStepBase = !isNumberInteger(stepBase);\n  var isNonIntegerStep = !isNumberInteger(step);\n\n  // Due to limitations in Floating Point Arithmetic (e.g. `0.3 - 0.2 !== 0.1` or\n  // `0.5 % 0.1 !== 0`), we need to convert all numbers to integers.\n  if (isNonIntegerValue || isNonIntegerStepBase || isNonIntegerStep) {\n    var valueDecimals = isNonIntegerValue ? countDecimals(value) : 0;\n    var stepBaseDecimals = isNonIntegerStepBase ? countDecimals(stepBase) : 0;\n    var stepDecimals = isNonIntegerStep ? countDecimals(step) : 0;\n\n    var decimalCount = Math.max(valueDecimals, stepBaseDecimals, stepDecimals);\n    var multiplier = Math.pow(10, decimalCount);\n\n    value = value * multiplier;\n    stepBase = stepBase * multiplier;\n    step = step * multiplier;\n\n    if (isNonIntegerValue) value = Math.round(value);\n    if (isNonIntegerStepBase) stepBase = Math.round(stepBase);\n    if (isNonIntegerStep) step = Math.round(step);\n  }\n\n  return (value - stepBase) % step === 0;\n}\n\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {\n  badInputChecker(scope, element, attr, ctrl, 'number');\n  numberFormatterParser(ctrl);\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var parsedMinVal;\n\n  if (isDefined(attr.min) || attr.ngMin) {\n    var minVal = attr.min || $parse(attr.ngMin)(scope);\n    parsedMinVal = parseNumberAttrVal(minVal);\n\n    ctrl.$validators.min = function(modelValue, viewValue) {\n      return ctrl.$isEmpty(viewValue) || isUndefined(parsedMinVal) || viewValue >= parsedMinVal;\n    };\n\n    attr.$observe('min', function(val) {\n      if (val !== minVal) {\n        parsedMinVal = parseNumberAttrVal(val);\n        minVal = val;\n        // TODO(matsko): implement validateLater to reduce number of validations\n        ctrl.$validate();\n      }\n    });\n  }\n\n  if (isDefined(attr.max) || attr.ngMax) {\n    var maxVal = attr.max || $parse(attr.ngMax)(scope);\n    var parsedMaxVal = parseNumberAttrVal(maxVal);\n\n    ctrl.$validators.max = function(modelValue, viewValue) {\n      return ctrl.$isEmpty(viewValue) || isUndefined(parsedMaxVal) || viewValue <= parsedMaxVal;\n    };\n\n    attr.$observe('max', function(val) {\n      if (val !== maxVal) {\n        parsedMaxVal = parseNumberAttrVal(val);\n        maxVal = val;\n        // TODO(matsko): implement validateLater to reduce number of validations\n        ctrl.$validate();\n      }\n    });\n  }\n\n  if (isDefined(attr.step) || attr.ngStep) {\n    var stepVal = attr.step || $parse(attr.ngStep)(scope);\n    var parsedStepVal = parseNumberAttrVal(stepVal);\n\n    ctrl.$validators.step = function(modelValue, viewValue) {\n      return ctrl.$isEmpty(viewValue) || isUndefined(parsedStepVal) ||\n        isValidForStep(viewValue, parsedMinVal || 0, parsedStepVal);\n    };\n\n    attr.$observe('step', function(val) {\n      // TODO(matsko): implement validateLater to reduce number of validations\n      if (val !== stepVal) {\n        parsedStepVal = parseNumberAttrVal(val);\n        stepVal = val;\n        ctrl.$validate();\n      }\n\n    });\n\n  }\n}\n\nfunction rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  badInputChecker(scope, element, attr, ctrl, 'range');\n  numberFormatterParser(ctrl);\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var supportsRange = ctrl.$$hasNativeValidators && element[0].type === 'range',\n      minVal = supportsRange ? 0 : undefined,\n      maxVal = supportsRange ? 100 : undefined,\n      stepVal = supportsRange ? 1 : undefined,\n      validity = element[0].validity,\n      hasMinAttr = isDefined(attr.min),\n      hasMaxAttr = isDefined(attr.max),\n      hasStepAttr = isDefined(attr.step);\n\n  var originalRender = ctrl.$render;\n\n  ctrl.$render = supportsRange && isDefined(validity.rangeUnderflow) && isDefined(validity.rangeOverflow) ?\n    //Browsers that implement range will set these values automatically, but reading the adjusted values after\n    //$render would cause the min / max validators to be applied with the wrong value\n    function rangeRender() {\n      originalRender();\n      ctrl.$setViewValue(element.val());\n    } :\n    originalRender;\n\n  if (hasMinAttr) {\n    minVal = parseNumberAttrVal(attr.min);\n\n    ctrl.$validators.min = supportsRange ?\n      // Since all browsers set the input to a valid value, we don't need to check validity\n      function noopMinValidator() { return true; } :\n      // non-support browsers validate the min val\n      function minValidator(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || isUndefined(minVal) || viewValue >= minVal;\n      };\n\n    setInitialValueAndObserver('min', minChange);\n  }\n\n  if (hasMaxAttr) {\n    maxVal = parseNumberAttrVal(attr.max);\n\n    ctrl.$validators.max = supportsRange ?\n      // Since all browsers set the input to a valid value, we don't need to check validity\n      function noopMaxValidator() { return true; } :\n      // non-support browsers validate the max val\n      function maxValidator(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || isUndefined(maxVal) || viewValue <= maxVal;\n      };\n\n    setInitialValueAndObserver('max', maxChange);\n  }\n\n  if (hasStepAttr) {\n    stepVal = parseNumberAttrVal(attr.step);\n\n    ctrl.$validators.step = supportsRange ?\n      function nativeStepValidator() {\n        // Currently, only FF implements the spec on step change correctly (i.e. adjusting the\n        // input element value to a valid value). It's possible that other browsers set the stepMismatch\n        // validity error instead, so we can at least report an error in that case.\n        return !validity.stepMismatch;\n      } :\n      // ngStep doesn't set the setp attr, so the browser doesn't adjust the input value as setting step would\n      function stepValidator(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) ||\n               isValidForStep(viewValue, minVal || 0, stepVal);\n      };\n\n    setInitialValueAndObserver('step', stepChange);\n  }\n\n  function setInitialValueAndObserver(htmlAttrName, changeFn) {\n    // interpolated attributes set the attribute value only after a digest, but we need the\n    // attribute value when the input is first rendered, so that the browser can adjust the\n    // input value based on the min/max value\n    element.attr(htmlAttrName, attr[htmlAttrName]);\n    var oldVal = attr[htmlAttrName];\n    attr.$observe(htmlAttrName, function wrappedObserver(val) {\n      if (val !== oldVal) {\n        oldVal = val;\n        changeFn(val);\n      }\n    });\n  }\n\n  function minChange(val) {\n    minVal = parseNumberAttrVal(val);\n    // ignore changes before model is initialized\n    if (isNumberNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    if (supportsRange) {\n      var elVal = element.val();\n      // IE11 doesn't set the el val correctly if the minVal is greater than the element value\n      if (minVal > elVal) {\n        elVal = minVal;\n        element.val(elVal);\n      }\n      ctrl.$setViewValue(elVal);\n    } else {\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    }\n  }\n\n  function maxChange(val) {\n    maxVal = parseNumberAttrVal(val);\n    // ignore changes before model is initialized\n    if (isNumberNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    if (supportsRange) {\n      var elVal = element.val();\n      // IE11 doesn't set the el val correctly if the maxVal is less than the element value\n      if (maxVal < elVal) {\n        element.val(maxVal);\n        // IE11 and Chrome don't set the value to the minVal when max < min\n        elVal = maxVal < minVal ? minVal : maxVal;\n      }\n      ctrl.$setViewValue(elVal);\n    } else {\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    }\n  }\n\n  function stepChange(val) {\n    stepVal = parseNumberAttrVal(val);\n    // ignore changes before model is initialized\n    if (isNumberNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    // Some browsers don't adjust the input value correctly, but set the stepMismatch error\n    if (!supportsRange) {\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    } else if (ctrl.$viewValue !== element.val()) {\n      ctrl.$setViewValue(element.val());\n    }\n  }\n}\n\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$validators.url = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || URL_REGEXP.test(value);\n  };\n}\n\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$validators.email = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);\n  };\n}\n\nfunction radioInputType(scope, element, attr, ctrl) {\n  var doTrim = !attr.ngTrim || trim(attr.ngTrim) !== 'false';\n  // make the name unique, if not defined\n  if (isUndefined(attr.name)) {\n    element.attr('name', nextUid());\n  }\n\n  var listener = function(ev) {\n    var value;\n    if (element[0].checked) {\n      value = attr.value;\n      if (doTrim) {\n        value = trim(value);\n      }\n      ctrl.$setViewValue(value, ev && ev.type);\n    }\n  };\n\n  element.on('change', listener);\n\n  ctrl.$render = function() {\n    var value = attr.value;\n    if (doTrim) {\n      value = trim(value);\n    }\n    element[0].checked = (value === ctrl.$viewValue);\n  };\n\n  attr.$observe('value', ctrl.$render);\n}\n\nfunction parseConstantExpr($parse, context, name, expression, fallback) {\n  var parseFn;\n  if (isDefined(expression)) {\n    parseFn = $parse(expression);\n    if (!parseFn.constant) {\n      throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' +\n                                   '`{1}`.', name, expression);\n    }\n    return parseFn(context);\n  }\n  return fallback;\n}\n\nfunction checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {\n  var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true);\n  var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false);\n\n  var listener = function(ev) {\n    ctrl.$setViewValue(element[0].checked, ev && ev.type);\n  };\n\n  element.on('change', listener);\n\n  ctrl.$render = function() {\n    element[0].checked = ctrl.$viewValue;\n  };\n\n  // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false`\n  // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert\n  // it to a boolean.\n  ctrl.$isEmpty = function(value) {\n    return value === false;\n  };\n\n  ctrl.$formatters.push(function(value) {\n    return equals(value, trueValue);\n  });\n\n  ctrl.$parsers.push(function(value) {\n    return value ? trueValue : falseValue;\n  });\n}\n\n\n/**\n * @ngdoc directive\n * @name textarea\n * @restrict E\n *\n * @description\n * HTML textarea element control with AngularJS data-binding. The data-binding and validation\n * properties of this element are exactly the same as those of the\n * {@link ng.directive:input input element}.\n *\n * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.\n *    If the expression evaluates to a RegExp object, then this is used directly.\n *    If the expression evaluates to a string, then it will be converted to a RegExp\n *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n *    `new RegExp('^abc$')`.<br />\n *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n *    start at the index of the last search's match, thus not taking the whole input value into\n *    account.\n * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false AngularJS will not automatically trim the input.\n *\n * @knownIssue\n *\n * When specifying the `placeholder` attribute of `<textarea>`, Internet Explorer will temporarily\n * insert the placeholder value as the textarea's content. If the placeholder value contains\n * interpolation (`{{ ... }}`), an error will be logged in the console when AngularJS tries to update\n * the value of the by-then-removed text node. This doesn't affect the functionality of the\n * textarea, but can be undesirable.\n *\n * You can work around this Internet Explorer issue by using `ng-attr-placeholder` instead of\n * `placeholder` on textareas, whenever you need interpolation in the placeholder value. You can\n * find more details on `ngAttr` in the\n * [Interpolation](guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes) section of the\n * Developer Guide.\n */\n\n\n/**\n * @ngdoc directive\n * @name input\n * @restrict E\n *\n * @description\n * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding,\n * input state control, and validation.\n * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Not every feature offered is available for all input types.\n * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`.\n * </div>\n *\n * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {boolean=} ngRequired Sets `required` attribute if set to true\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n *    value does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.\n *    If the expression evaluates to a RegExp object, then this is used directly.\n *    If the expression evaluates to a string, then it will be converted to a RegExp\n *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n *    `new RegExp('^abc$')`.<br />\n *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n *    start at the index of the last search's match, thus not taking the whole input value into\n *    account.\n * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false AngularJS will not automatically trim the input.\n *    This parameter is ignored for input[type=password] controls, which will never trim the\n *    input.\n *\n * @example\n    <example name=\"input-directive\" module=\"inputExample\">\n      <file name=\"index.html\">\n       <script>\n          angular.module('inputExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.user = {name: 'guest', last: 'visitor'};\n            }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <form name=\"myForm\">\n           <label>\n              User name:\n              <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\n              Required!</span>\n           </div>\n           <label>\n              Last name:\n              <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\n              ng-minlength=\"3\" ng-maxlength=\"10\">\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\n               Too short!</span>\n             <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\n               Too long!</span>\n           </div>\n         </form>\n         <hr>\n         <tt>user = {{user}}</tt><br/>\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br/>\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br/>\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br/>\n         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br/>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br/>\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br/>\n       </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var user = element(by.exactBinding('user'));\n        var userNameValid = element(by.binding('myForm.userName.$valid'));\n        var lastNameValid = element(by.binding('myForm.lastName.$valid'));\n        var lastNameError = element(by.binding('myForm.lastName.$error'));\n        var formValid = element(by.binding('myForm.$valid'));\n        var userNameInput = element(by.model('user.name'));\n        var userLastInput = element(by.model('user.last'));\n\n        it('should initialize to model', function() {\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty when required', function() {\n          userNameInput.clear();\n          userNameInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('false');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be valid if empty when min length is set', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"\"}');\n          expect(lastNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if less than required min length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('xx');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('minlength');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be invalid if longer than max length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('some ridiculously long name');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('maxlength');\n          expect(formValid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n */\nvar inputDirective = ['$browser', '$sniffer', '$filter', '$parse',\n    function($browser, $sniffer, $filter, $parse) {\n  return {\n    restrict: 'E',\n    require: ['?ngModel'],\n    link: {\n      pre: function(scope, element, attr, ctrls) {\n        if (ctrls[0]) {\n          (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,\n                                                              $browser, $filter, $parse);\n        }\n      }\n    }\n  };\n}];\n\n\nvar hiddenInputBrowserCacheDirective = function() {\n  var valueProperty = {\n    configurable: true,\n    enumerable: false,\n    get: function() {\n      return this.getAttribute('value') || '';\n    },\n    set: function(val) {\n      this.setAttribute('value', val);\n    }\n  };\n\n  return {\n    restrict: 'E',\n    priority: 200,\n    compile: function(_, attr) {\n      if (lowercase(attr.type) !== 'hidden') {\n        return;\n      }\n\n      return {\n        pre: function(scope, element, attr, ctrls) {\n          var node = element[0];\n\n          // Support: Edge\n          // Moving the DOM around prevents autofillling\n          if (node.parentNode) {\n            node.parentNode.insertBefore(node, node.nextSibling);\n          }\n\n          // Support: FF, IE\n          // Avoiding direct assignment to .value prevents autofillling\n          if (Object.defineProperty) {\n            Object.defineProperty(node, 'value', valueProperty);\n          }\n        }\n      };\n    }\n  };\n};\n\n\n\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\n/**\n * @ngdoc directive\n * @name ngValue\n * @restrict A\n * @priority 100\n *\n * @description\n * Binds the given expression to the value of the element.\n *\n * It is mainly used on {@link input[radio] `input[radio]`} and option elements,\n * so that when the element is selected, the {@link ngModel `ngModel`} of that element (or its\n * {@link select `select`} parent element) is set to the bound value. It is especially useful\n * for dynamically generated lists using {@link ngRepeat `ngRepeat`}, as shown below.\n *\n * It can also be used to achieve one-way binding of a given expression to an input element\n * such as an `input[text]` or a `textarea`, when that element does not use ngModel.\n *\n * @element ANY\n * @param {string=} ngValue AngularJS expression, whose value will be bound to the `value` attribute\n * and `value` property of the element.\n *\n * @example\n    <example name=\"ngValue-directive\" module=\"valueExample\">\n      <file name=\"index.html\">\n       <script>\n          angular.module('valueExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.names = ['pizza', 'unicorns', 'robots'];\n              $scope.my = { favorite: 'unicorns' };\n            }]);\n       </script>\n        <form ng-controller=\"ExampleController\">\n          <h2>Which is your favorite?</h2>\n            <label ng-repeat=\"name in names\" for=\"{{name}}\">\n              {{name}}\n              <input type=\"radio\"\n                     ng-model=\"my.favorite\"\n                     ng-value=\"name\"\n                     id=\"{{name}}\"\n                     name=\"favorite\">\n            </label>\n          <div>You chose {{my.favorite}}</div>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var favorite = element(by.binding('my.favorite'));\n\n        it('should initialize to model', function() {\n          expect(favorite.getText()).toContain('unicorns');\n        });\n        it('should bind the values to the inputs', function() {\n          element.all(by.model('my.favorite')).get(0).click();\n          expect(favorite.getText()).toContain('pizza');\n        });\n      </file>\n    </example>\n */\nvar ngValueDirective = function() {\n  /**\n   *  inputs use the value attribute as their default value if the value property is not set.\n   *  Once the value property has been set (by adding input), it will not react to changes to\n   *  the value attribute anymore. Setting both attribute and property fixes this behavior, and\n   *  makes it possible to use ngValue as a sort of one-way bind.\n   */\n  function updateElementValue(element, attr, value) {\n    // Support: IE9 only\n    // In IE9 values are converted to string (e.g. `input.value = null` results in `input.value === 'null'`).\n    var propValue = isDefined(value) ? value : (msie === 9) ? '' : null;\n    element.prop('value', propValue);\n    attr.$set('value', value);\n  }\n\n  return {\n    restrict: 'A',\n    priority: 100,\n    compile: function(tpl, tplAttr) {\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\n        return function ngValueConstantLink(scope, elm, attr) {\n          var value = scope.$eval(attr.ngValue);\n          updateElementValue(elm, attr, value);\n        };\n      } else {\n        return function ngValueLink(scope, elm, attr) {\n          scope.$watch(attr.ngValue, function valueWatchAction(value) {\n            updateElementValue(elm, attr, value);\n          });\n        };\n      }\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngBind\n * @restrict AC\n *\n * @description\n * The `ngBind` attribute tells AngularJS to replace the text content of the specified HTML element\n * with the value of a given expression, and to update the text content when the value of that\n * expression changes.\n *\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\n * `{{ expression }}` which is similar but less verbose.\n *\n * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily\n * displayed by the browser in its raw state before AngularJS compiles it. Since `ngBind` is an\n * element attribute, it makes the bindings invisible to the user while the page is loading.\n *\n * An alternative solution to this problem would be using the\n * {@link ng.directive:ngCloak ngCloak} directive.\n *\n *\n * @element ANY\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\n *\n * @example\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\n   <example module=\"bindExample\" name=\"ng-bind\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.name = 'Whirled';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>Enter name: <input type=\"text\" ng-model=\"name\"></label><br>\n         Hello <span ng-bind=\"name\"></span>!\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var nameInput = element(by.model('name'));\n\n         expect(element(by.binding('name')).getText()).toBe('Whirled');\n         nameInput.clear();\n         nameInput.sendKeys('world');\n         expect(element(by.binding('name')).getText()).toBe('world');\n       });\n     </file>\n   </example>\n */\nvar ngBindDirective = ['$compile', function($compile) {\n  return {\n    restrict: 'AC',\n    compile: function ngBindCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBind);\n        element = element[0];\n        scope.$watch(attr.ngBind, function ngBindWatchAction(value) {\n          element.textContent = stringify(value);\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindTemplate\n *\n * @description\n * The `ngBindTemplate` directive specifies that the element\n * text content should be replaced with the interpolation of the template\n * in the `ngBindTemplate` attribute.\n * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`\n * expressions. This directive is needed since some HTML elements\n * (such as TITLE and OPTION) cannot contain SPAN elements.\n *\n * @element ANY\n * @param {string} ngBindTemplate template of form\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\n *\n * @example\n * Try it here: enter text in text box and watch the greeting change.\n   <example module=\"bindExample\" name=\"ng-bind-template\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.salutation = 'Hello';\n             $scope.name = 'World';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n        <label>Salutation: <input type=\"text\" ng-model=\"salutation\"></label><br>\n        <label>Name: <input type=\"text\" ng-model=\"name\"></label><br>\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var salutationElem = element(by.binding('salutation'));\n         var salutationInput = element(by.model('salutation'));\n         var nameInput = element(by.model('name'));\n\n         expect(salutationElem.getText()).toBe('Hello World!');\n\n         salutationInput.clear();\n         salutationInput.sendKeys('Greetings');\n         nameInput.clear();\n         nameInput.sendKeys('user');\n\n         expect(salutationElem.getText()).toBe('Greetings user!');\n       });\n     </file>\n   </example>\n */\nvar ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate, $compile) {\n  return {\n    compile: function ngBindTemplateCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindTemplateLink(scope, element, attr) {\n        var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\n        $compile.$$addBindingInfo(element, interpolateFn.expressions);\n        element = element[0];\n        attr.$observe('ngBindTemplate', function(value) {\n          element.textContent = isUndefined(value) ? '' : value;\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindHtml\n *\n * @description\n * Evaluates the expression and inserts the resulting HTML into the element in a secure way. By default,\n * the resulting HTML content will be sanitized using the {@link ngSanitize.$sanitize $sanitize} service.\n * To utilize this functionality, ensure that `$sanitize` is available, for example, by including {@link\n * ngSanitize} in your module's dependencies (not in core AngularJS). In order to use {@link ngSanitize}\n * in your module's dependencies, you need to include \"angular-sanitize.js\" in your application.\n *\n * You may also bypass sanitization for values you know are safe. To do so, bind to\n * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}.  See the example\n * under {@link ng.$sce#show-me-an-example-using-sce- Strict Contextual Escaping (SCE)}.\n *\n * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you\n * will have an exception (instead of an exploit.)\n *\n * @element ANY\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\n *\n * @example\n\n   <example module=\"bindHtmlExample\" deps=\"angular-sanitize.js\" name=\"ng-bind-html\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n        <p ng-bind-html=\"myHTML\"></p>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n       angular.module('bindHtmlExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.myHTML =\n              'I am an <code>HTML</code>string with ' +\n              '<a href=\"#\">links!</a> and other <em>stuff</em>';\n         }]);\n     </file>\n\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind-html', function() {\n         expect(element(by.binding('myHTML')).getText()).toBe(\n             'I am an HTMLstring with links! and other stuff');\n       });\n     </file>\n   </example>\n */\nvar ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, $compile) {\n  return {\n    restrict: 'A',\n    compile: function ngBindHtmlCompile(tElement, tAttrs) {\n      var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);\n      var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function sceValueOf(val) {\n        // Unwrap the value to compare the actual inner safe value, not the wrapper object.\n        return $sce.valueOf(val);\n      });\n      $compile.$$addBindingClass(tElement);\n\n      return function ngBindHtmlLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBindHtml);\n\n        scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {\n          // The watched value is the unwrapped value. To avoid re-escaping, use the direct getter.\n          var value = ngBindHtmlGetter(scope);\n          element.html($sce.getTrustedHtml(value) || '');\n        });\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngChange\n * @restrict A\n *\n * @description\n * Evaluate the given expression when the user changes the input.\n * The expression is evaluated immediately, unlike the JavaScript onchange event\n * which only triggers at the end of a change (usually, when the user leaves the\n * form element or presses the return key).\n *\n * The `ngChange` expression is only evaluated when a change in the input value causes\n * a new value to be committed to the model.\n *\n * It will not be evaluated:\n * * if the value returned from the `$parsers` transformation pipeline has not changed\n * * if the input has continued to be invalid since the model will stay `null`\n * * if the model is changed programmatically and not by a change to the input value\n *\n *\n * Note, this directive requires `ngModel` to be present.\n *\n * @element ANY\n * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change\n * in input value.\n *\n * @example\n * <example name=\"ngChange-directive\" module=\"changeExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('changeExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.counter = 0;\n *           $scope.change = function() {\n *             $scope.counter++;\n *           };\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\n *       <tt>debug = {{confirmed}}</tt><br/>\n *       <tt>counter = {{counter}}</tt><br/>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var counter = element(by.binding('counter'));\n *     var debug = element(by.binding('confirmed'));\n *\n *     it('should evaluate the expression if changing from view', function() {\n *       expect(counter.getText()).toContain('0');\n *\n *       element(by.id('ng-change-example1')).click();\n *\n *       expect(counter.getText()).toContain('1');\n *       expect(debug.getText()).toContain('true');\n *     });\n *\n *     it('should not evaluate the expression if changing from model', function() {\n *       element(by.id('ng-change-example2')).click();\n\n *       expect(counter.getText()).toContain('0');\n *       expect(debug.getText()).toContain('true');\n *     });\n *   </file>\n * </example>\n */\nvar ngChangeDirective = valueFn({\n  restrict: 'A',\n  require: 'ngModel',\n  link: function(scope, element, attr, ctrl) {\n    ctrl.$viewChangeListeners.push(function() {\n      scope.$eval(attr.ngChange);\n    });\n  }\n});\n\n/* exported\n  ngClassDirective,\n  ngClassEvenDirective,\n  ngClassOddDirective\n*/\n\nfunction classDirective(name, selector) {\n  name = 'ngClass' + name;\n  var indexWatchExpression;\n\n  return ['$parse', function($parse) {\n    return {\n      restrict: 'AC',\n      link: function(scope, element, attr) {\n        var classCounts = element.data('$classCounts');\n        var oldModulo = true;\n        var oldClassString;\n\n        if (!classCounts) {\n          // Use createMap() to prevent class assumptions involving property\n          // names in Object.prototype\n          classCounts = createMap();\n          element.data('$classCounts', classCounts);\n        }\n\n        if (name !== 'ngClass') {\n          if (!indexWatchExpression) {\n            indexWatchExpression = $parse('$index', function moduloTwo($index) {\n              // eslint-disable-next-line no-bitwise\n              return $index & 1;\n            });\n          }\n\n          scope.$watch(indexWatchExpression, ngClassIndexWatchAction);\n        }\n\n        scope.$watch($parse(attr[name], toClassString), ngClassWatchAction);\n\n        function addClasses(classString) {\n          classString = digestClassCounts(split(classString), 1);\n          attr.$addClass(classString);\n        }\n\n        function removeClasses(classString) {\n          classString = digestClassCounts(split(classString), -1);\n          attr.$removeClass(classString);\n        }\n\n        function updateClasses(oldClassString, newClassString) {\n          var oldClassArray = split(oldClassString);\n          var newClassArray = split(newClassString);\n\n          var toRemoveArray = arrayDifference(oldClassArray, newClassArray);\n          var toAddArray = arrayDifference(newClassArray, oldClassArray);\n\n          var toRemoveString = digestClassCounts(toRemoveArray, -1);\n          var toAddString = digestClassCounts(toAddArray, 1);\n\n          attr.$addClass(toAddString);\n          attr.$removeClass(toRemoveString);\n        }\n\n        function digestClassCounts(classArray, count) {\n          var classesToUpdate = [];\n\n          forEach(classArray, function(className) {\n            if (count > 0 || classCounts[className]) {\n              classCounts[className] = (classCounts[className] || 0) + count;\n              if (classCounts[className] === +(count > 0)) {\n                classesToUpdate.push(className);\n              }\n            }\n          });\n\n          return classesToUpdate.join(' ');\n        }\n\n        function ngClassIndexWatchAction(newModulo) {\n          // This watch-action should run before the `ngClassWatchAction()`, thus it\n          // adds/removes `oldClassString`. If the `ngClass` expression has changed as well, the\n          // `ngClassWatchAction()` will update the classes.\n          if (newModulo === selector) {\n            addClasses(oldClassString);\n          } else {\n            removeClasses(oldClassString);\n          }\n\n          oldModulo = newModulo;\n        }\n\n        function ngClassWatchAction(newClassString) {\n          if (oldModulo === selector) {\n            updateClasses(oldClassString, newClassString);\n          }\n\n          oldClassString = newClassString;\n        }\n      }\n    };\n  }];\n\n  // Helpers\n  function arrayDifference(tokens1, tokens2) {\n    if (!tokens1 || !tokens1.length) return [];\n    if (!tokens2 || !tokens2.length) return tokens1;\n\n    var values = [];\n\n    outer:\n    for (var i = 0; i < tokens1.length; i++) {\n      var token = tokens1[i];\n      for (var j = 0; j < tokens2.length; j++) {\n        if (token === tokens2[j]) continue outer;\n      }\n      values.push(token);\n    }\n\n    return values;\n  }\n\n  function split(classString) {\n    return classString && classString.split(' ');\n  }\n\n  function toClassString(classValue) {\n    if (!classValue) return classValue;\n\n    var classString = classValue;\n\n    if (isArray(classValue)) {\n      classString = classValue.map(toClassString).join(' ');\n    } else if (isObject(classValue)) {\n      classString = Object.keys(classValue).\n        filter(function(key) { return classValue[key]; }).\n        join(' ');\n    } else if (!isString(classValue)) {\n      classString = classValue + '';\n    }\n\n    return classString;\n  }\n}\n\n/**\n * @ngdoc directive\n * @name ngClass\n * @restrict AC\n * @element ANY\n *\n * @description\n * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding\n * an expression that represents all classes to be added.\n *\n * The directive operates in three different ways, depending on which of three types the expression\n * evaluates to:\n *\n * 1. If the expression evaluates to a string, the string should be one or more space-delimited class\n * names.\n *\n * 2. If the expression evaluates to an object, then for each key-value pair of the\n * object with a truthy value the corresponding key is used as a class name.\n *\n * 3. If the expression evaluates to an array, each element of the array should either be a string as in\n * type 1 or an object as in type 2. This means that you can mix strings and objects together in an array\n * to give you more control over what CSS classes appear. See the code below for an example of this.\n *\n *\n * The directive won't add duplicate classes if a particular class was already set.\n *\n * When the expression changes, the previously added classes are removed and only then are the\n * new classes added.\n *\n * @knownIssue\n * You should not use {@link guide/interpolation interpolation} in the value of the `class`\n * attribute, when using the `ngClass` directive on the same element.\n * See {@link guide/interpolation#known-issues here} for more info.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |\n * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |\n * | {@link ng.$animate#setClass setClass} | just before classes are added and classes are removed from the element at the same time |\n *\n * ### ngClass and pre-existing CSS3 Transitions/Animations\n   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.\n   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder\n   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure\n   to view the step by step details of {@link $animate#addClass $animate.addClass} and\n   {@link $animate#removeClass $animate.removeClass}.\n *\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class\n *   names, an array, or a map of class names to boolean values. In the case of a map, the\n *   names of the properties whose values are truthy will be added as css classes to the\n *   element.\n *\n * @example\n * ### Basic\n   <example name=\"ng-class\">\n     <file name=\"index.html\">\n       <p ng-class=\"{strike: deleted, bold: important, 'has-error': error}\">Map Syntax Example</p>\n       <label>\n          <input type=\"checkbox\" ng-model=\"deleted\">\n          deleted (apply \"strike\" class)\n       </label><br>\n       <label>\n          <input type=\"checkbox\" ng-model=\"important\">\n          important (apply \"bold\" class)\n       </label><br>\n       <label>\n          <input type=\"checkbox\" ng-model=\"error\">\n          error (apply \"has-error\" class)\n       </label>\n       <hr>\n       <p ng-class=\"style\">Using String Syntax</p>\n       <input type=\"text\" ng-model=\"style\"\n              placeholder=\"Type: bold strike red\" aria-label=\"Type: bold strike red\">\n       <hr>\n       <p ng-class=\"[style1, style2, style3]\">Using Array Syntax</p>\n       <input ng-model=\"style1\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style2\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red 2\"><br>\n       <input ng-model=\"style3\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red 3\"><br>\n       <hr>\n       <p ng-class=\"[style4, {orange: warning}]\">Using Array and Map Syntax</p>\n       <input ng-model=\"style4\" placeholder=\"Type: bold, strike\" aria-label=\"Type: bold, strike\"><br>\n       <label><input type=\"checkbox\" ng-model=\"warning\"> warning (apply \"orange\" class)</label>\n     </file>\n     <file name=\"style.css\">\n       .strike {\n           text-decoration: line-through;\n       }\n       .bold {\n           font-weight: bold;\n       }\n       .red {\n           color: red;\n       }\n       .has-error {\n           color: red;\n           background-color: yellow;\n       }\n       .orange {\n           color: orange;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var ps = element.all(by.css('p'));\n\n       it('should let you toggle the class', function() {\n\n         expect(ps.first().getAttribute('class')).not.toMatch(/bold/);\n         expect(ps.first().getAttribute('class')).not.toMatch(/has-error/);\n\n         element(by.model('important')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/bold/);\n\n         element(by.model('error')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/has-error/);\n       });\n\n       it('should let you toggle string example', function() {\n         expect(ps.get(1).getAttribute('class')).toBe('');\n         element(by.model('style')).clear();\n         element(by.model('style')).sendKeys('red');\n         expect(ps.get(1).getAttribute('class')).toBe('red');\n       });\n\n       it('array example should have 3 classes', function() {\n         expect(ps.get(2).getAttribute('class')).toBe('');\n         element(by.model('style1')).sendKeys('bold');\n         element(by.model('style2')).sendKeys('strike');\n         element(by.model('style3')).sendKeys('red');\n         expect(ps.get(2).getAttribute('class')).toBe('bold strike red');\n       });\n\n       it('array with map example should have 2 classes', function() {\n         expect(ps.last().getAttribute('class')).toBe('');\n         element(by.model('style4')).sendKeys('bold');\n         element(by.model('warning')).click();\n         expect(ps.last().getAttribute('class')).toBe('bold orange');\n       });\n     </file>\n   </example>\n\n   @example\n   ### Animations\n\n   The example below demonstrates how to perform animations using ngClass.\n\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-class\">\n     <file name=\"index.html\">\n      <input id=\"setbtn\" type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\n      <input id=\"clearbtn\" type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\n      <br>\n      <span class=\"base-class\" ng-class=\"myVar\">Sample Text</span>\n     </file>\n     <file name=\"style.css\">\n       .base-class {\n         transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n       }\n\n       .base-class.my-class {\n         color: red;\n         font-size:3em;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class', function() {\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n\n         element(by.id('setbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).\n           toMatch(/my-class/);\n\n         element(by.id('clearbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n       });\n     </file>\n   </example>\n */\nvar ngClassDirective = classDirective('', true);\n\n/**\n * @ngdoc directive\n * @name ngClassOdd\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |\n * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |\n *\n * @element ANY\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example name=\"ng-class-odd\">\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}}\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n *\n * <hr />\n * @example\n * An example on how to implement animations using `ngClassOdd`:\n *\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-class-odd-animate\">\n     <file name=\"index.html\">\n       <div ng-init=\"items=['Item 3', 'Item 2', 'Item 1', 'Item 0']\">\n         <button ng-click=\"items.unshift('Item ' + items.length)\">Add item</button>\n         <hr />\n         <table>\n           <tr ng-repeat=\"item in items\" ng-class-odd=\"'odd'\">\n             <td>{{ item }}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         background: rgba(255, 255, 0, 0.25);\n       }\n\n       .odd-add, .odd-remove {\n         transition: 1.5s;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should add new entries to the beginning of the list', function() {\n         var button = element(by.buttonText('Add item'));\n         var rows = element.all(by.repeater('item in items'));\n\n         expect(rows.count()).toBe(4);\n         expect(rows.get(0).getText()).toBe('Item 3');\n         expect(rows.get(1).getText()).toBe('Item 2');\n\n         button.click();\n\n         expect(rows.count()).toBe(5);\n         expect(rows.get(0).getText()).toBe('Item 4');\n         expect(rows.get(1).getText()).toBe('Item 3');\n       });\n\n       it('should add odd class to odd entries', function() {\n         var button = element(by.buttonText('Add item'));\n         var rows = element.all(by.repeater('item in items'));\n\n         expect(rows.get(0).getAttribute('class')).toMatch(/odd/);\n         expect(rows.get(1).getAttribute('class')).not.toMatch(/odd/);\n\n         button.click();\n\n         expect(rows.get(0).getAttribute('class')).toMatch(/odd/);\n         expect(rows.get(1).getAttribute('class')).not.toMatch(/odd/);\n       });\n     </file>\n   </example>\n */\nvar ngClassOddDirective = classDirective('Odd', 0);\n\n/**\n * @ngdoc directive\n * @name ngClassEven\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |\n * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |\n *\n * @element ANY\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\n *   result of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example name=\"ng-class-even\">\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}} &nbsp; &nbsp; &nbsp;\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n *\n * <hr />\n * @example\n * An example on how to implement animations using `ngClassEven`:\n *\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-class-even-animate\">\n     <file name=\"index.html\">\n       <div ng-init=\"items=['Item 3', 'Item 2', 'Item 1', 'Item 0']\">\n         <button ng-click=\"items.unshift('Item ' + items.length)\">Add item</button>\n         <hr />\n         <table>\n           <tr ng-repeat=\"item in items\" ng-class-even=\"'even'\">\n             <td>{{ item }}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"style.css\">\n       .even {\n         background: rgba(255, 255, 0, 0.25);\n       }\n\n       .even-add, .even-remove {\n         transition: 1.5s;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should add new entries to the beginning of the list', function() {\n         var button = element(by.buttonText('Add item'));\n         var rows = element.all(by.repeater('item in items'));\n\n         expect(rows.count()).toBe(4);\n         expect(rows.get(0).getText()).toBe('Item 3');\n         expect(rows.get(1).getText()).toBe('Item 2');\n\n         button.click();\n\n         expect(rows.count()).toBe(5);\n         expect(rows.get(0).getText()).toBe('Item 4');\n         expect(rows.get(1).getText()).toBe('Item 3');\n       });\n\n       it('should add even class to even entries', function() {\n         var button = element(by.buttonText('Add item'));\n         var rows = element.all(by.repeater('item in items'));\n\n         expect(rows.get(0).getAttribute('class')).not.toMatch(/even/);\n         expect(rows.get(1).getAttribute('class')).toMatch(/even/);\n\n         button.click();\n\n         expect(rows.get(0).getAttribute('class')).not.toMatch(/even/);\n         expect(rows.get(1).getAttribute('class')).toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassEvenDirective = classDirective('Even', 1);\n\n/**\n * @ngdoc directive\n * @name ngCloak\n * @restrict AC\n *\n * @description\n * The `ngCloak` directive is used to prevent the AngularJS html template from being briefly\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\n * directive to avoid the undesirable flicker effect caused by the html template display.\n *\n * The directive can be applied to the `<body>` element, but the preferred usage is to apply\n * multiple `ngCloak` directives to small portions of the page to permit progressive rendering\n * of the browser view.\n *\n * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and\n * `angular.min.js`.\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```css\n * [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n *   display: none !important;\n * }\n * ```\n *\n * When this css rule is loaded by the browser, all html elements (including their children) that\n * are tagged with the `ngCloak` directive are hidden. When AngularJS encounters this directive\n * during the compilation of the template it deletes the `ngCloak` element attribute, making\n * the compiled element visible.\n *\n * For the best result, the `angular.js` script must be loaded in the head section of the html\n * document; alternatively, the css rule above must be included in the external stylesheet of the\n * application.\n *\n * @element ANY\n *\n * @example\n   <example name=\"ng-cloak\">\n     <file name=\"index.html\">\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\n        <div id=\"template2\" class=\"ng-cloak\">{{ 'world' }}</div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should remove the template directive and css class', function() {\n         expect($('#template1').getAttribute('ng-cloak')).\n           toBeNull();\n         expect($('#template2').getAttribute('ng-cloak')).\n           toBeNull();\n       });\n     </file>\n   </example>\n *\n */\nvar ngCloakDirective = ngDirective({\n  compile: function(element, attr) {\n    attr.$set('ngCloak', undefined);\n    element.removeClass('ng-cloak');\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngController\n *\n * @description\n * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular\n * supports the principles behind the Model-View-Controller design pattern.\n *\n * MVC components in angular:\n *\n * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties\n *   are accessed through bindings.\n * * View — The template (HTML with data bindings) that is rendered into the View.\n * * Controller — The `ngController` directive specifies a Controller class; the class contains business\n *   logic behind the application to decorate the scope with functions and values\n *\n * Note that you can also attach controllers to the DOM by declaring it in a route definition\n * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller\n * again using `ng-controller` in the template itself.  This will cause the controller to be attached\n * and executed twice.\n *\n * @element ANY\n * @scope\n * @priority 500\n * @param {expression} ngController Name of a constructor function registered with the current\n * {@link ng.$controllerProvider $controllerProvider} or an {@link guide/expression expression}\n * that on the current scope evaluates to a constructor function.\n *\n * The controller instance can be published into a scope property by specifying\n * `ng-controller=\"as propertyName\"`.\n *\n * @example\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\n * greeting are methods declared on the controller (see source tab). These methods can\n * easily be called from the AngularJS markup. Any changes to the data are automatically reflected\n * in the View without the need for a manual update.\n *\n * Two different declaration styles are included below:\n *\n * * one binds methods and properties directly onto the controller using `this`:\n * `ng-controller=\"SettingsController1 as settings\"`\n * * one injects `$scope` into the controller:\n * `ng-controller=\"SettingsController2\"`\n *\n * The second option is more common in the AngularJS community, and is generally used in boilerplates\n * and in this guide. However, there are advantages to binding properties directly to the controller\n * and avoiding scope.\n *\n * * Using `controller as` makes it obvious which controller you are accessing in the template when\n * multiple controllers apply to an element.\n * * If you are writing your controllers as classes you have easier access to the properties and\n * methods, which will appear on the scope, from inside the controller code.\n * * Since there is always a `.` in the bindings, you don't have to worry about prototypal\n * inheritance masking primitives.\n *\n * This example demonstrates the `controller as` syntax.\n *\n * <example name=\"ngControllerAs\" module=\"controllerAsExample\">\n *   <file name=\"index.html\">\n *    <div id=\"ctrl-as-exmpl\" ng-controller=\"SettingsController1 as settings\">\n *      <label>Name: <input type=\"text\" ng-model=\"settings.name\"/></label>\n *      <button ng-click=\"settings.greet()\">greet</button><br/>\n *      Contact:\n *      <ul>\n *        <li ng-repeat=\"contact in settings.contacts\">\n *          <select ng-model=\"contact.type\" aria-label=\"Contact method\" id=\"select_{{$index}}\">\n *             <option>phone</option>\n *             <option>email</option>\n *          </select>\n *          <input type=\"text\" ng-model=\"contact.value\" aria-labelledby=\"select_{{$index}}\" />\n *          <button ng-click=\"settings.clearContact(contact)\">clear</button>\n *          <button ng-click=\"settings.removeContact(contact)\" aria-label=\"Remove\">X</button>\n *        </li>\n *        <li><button ng-click=\"settings.addContact()\">add</button></li>\n *     </ul>\n *    </div>\n *   </file>\n *   <file name=\"app.js\">\n *    angular.module('controllerAsExample', [])\n *      .controller('SettingsController1', SettingsController1);\n *\n *    function SettingsController1() {\n *      this.name = 'John Smith';\n *      this.contacts = [\n *        {type: 'phone', value: '408 555 1212'},\n *        {type: 'email', value: 'john.smith@example.org'}\n *      ];\n *    }\n *\n *    SettingsController1.prototype.greet = function() {\n *      alert(this.name);\n *    };\n *\n *    SettingsController1.prototype.addContact = function() {\n *      this.contacts.push({type: 'email', value: 'yourname@example.org'});\n *    };\n *\n *    SettingsController1.prototype.removeContact = function(contactToRemove) {\n *     var index = this.contacts.indexOf(contactToRemove);\n *      this.contacts.splice(index, 1);\n *    };\n *\n *    SettingsController1.prototype.clearContact = function(contact) {\n *      contact.type = 'phone';\n *      contact.value = '';\n *    };\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it('should check controller as', function() {\n *       var container = element(by.id('ctrl-as-exmpl'));\n *         expect(container.element(by.model('settings.name'))\n *           .getAttribute('value')).toBe('John Smith');\n *\n *       var firstRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(0));\n *       var secondRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(1));\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('408 555 1212');\n *\n *       expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('john.smith@example.org');\n *\n *       firstRepeat.element(by.buttonText('clear')).click();\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('');\n *\n *       container.element(by.buttonText('add')).click();\n *\n *       expect(container.element(by.repeater('contact in settings.contacts').row(2))\n *           .element(by.model('contact.value'))\n *           .getAttribute('value'))\n *           .toBe('yourname@example.org');\n *     });\n *   </file>\n * </example>\n *\n * This example demonstrates the \"attach to `$scope`\" style of controller.\n *\n * <example name=\"ngController\" module=\"controllerExample\">\n *  <file name=\"index.html\">\n *   <div id=\"ctrl-exmpl\" ng-controller=\"SettingsController2\">\n *     <label>Name: <input type=\"text\" ng-model=\"name\"/></label>\n *     <button ng-click=\"greet()\">greet</button><br/>\n *     Contact:\n *     <ul>\n *       <li ng-repeat=\"contact in contacts\">\n *         <select ng-model=\"contact.type\" id=\"select_{{$index}}\">\n *            <option>phone</option>\n *            <option>email</option>\n *         </select>\n *         <input type=\"text\" ng-model=\"contact.value\" aria-labelledby=\"select_{{$index}}\" />\n *         <button ng-click=\"clearContact(contact)\">clear</button>\n *         <button ng-click=\"removeContact(contact)\">X</button>\n *       </li>\n *       <li>[ <button ng-click=\"addContact()\">add</button> ]</li>\n *    </ul>\n *   </div>\n *  </file>\n *  <file name=\"app.js\">\n *   angular.module('controllerExample', [])\n *     .controller('SettingsController2', ['$scope', SettingsController2]);\n *\n *   function SettingsController2($scope) {\n *     $scope.name = 'John Smith';\n *     $scope.contacts = [\n *       {type:'phone', value:'408 555 1212'},\n *       {type:'email', value:'john.smith@example.org'}\n *     ];\n *\n *     $scope.greet = function() {\n *       alert($scope.name);\n *     };\n *\n *     $scope.addContact = function() {\n *       $scope.contacts.push({type:'email', value:'yourname@example.org'});\n *     };\n *\n *     $scope.removeContact = function(contactToRemove) {\n *       var index = $scope.contacts.indexOf(contactToRemove);\n *       $scope.contacts.splice(index, 1);\n *     };\n *\n *     $scope.clearContact = function(contact) {\n *       contact.type = 'phone';\n *       contact.value = '';\n *     };\n *   }\n *  </file>\n *  <file name=\"protractor.js\" type=\"protractor\">\n *    it('should check controller', function() {\n *      var container = element(by.id('ctrl-exmpl'));\n *\n *      expect(container.element(by.model('name'))\n *          .getAttribute('value')).toBe('John Smith');\n *\n *      var firstRepeat =\n *          container.element(by.repeater('contact in contacts').row(0));\n *      var secondRepeat =\n *          container.element(by.repeater('contact in contacts').row(1));\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('408 555 1212');\n *      expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('john.smith@example.org');\n *\n *      firstRepeat.element(by.buttonText('clear')).click();\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('');\n *\n *      container.element(by.buttonText('add')).click();\n *\n *      expect(container.element(by.repeater('contact in contacts').row(2))\n *          .element(by.model('contact.value'))\n *          .getAttribute('value'))\n *          .toBe('yourname@example.org');\n *    });\n *  </file>\n *</example>\n\n */\nvar ngControllerDirective = [function() {\n  return {\n    restrict: 'A',\n    scope: true,\n    controller: '@',\n    priority: 500\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngCsp\n *\n * @restrict A\n * @element ANY\n * @description\n *\n * AngularJS has some features that can conflict with certain restrictions that are applied when using\n * [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) rules.\n *\n * If you intend to implement CSP with these rules then you must tell AngularJS not to use these\n * features.\n *\n * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.\n *\n *\n * The following default rules in CSP affect AngularJS:\n *\n * * The use of `eval()`, `Function(string)` and similar functions to dynamically create and execute\n * code from strings is forbidden. AngularJS makes use of this in the {@link $parse} service to\n * provide a 30% increase in the speed of evaluating AngularJS expressions. (This CSP rule can be\n * disabled with the CSP keyword `unsafe-eval`, but it is generally not recommended as it would\n * weaken the protections offered by CSP.)\n *\n * * The use of inline resources, such as inline `<script>` and `<style>` elements, are forbidden.\n * This prevents apps from injecting custom styles directly into the document. AngularJS makes use of\n * this to include some CSS rules (e.g. {@link ngCloak} and {@link ngHide}). To make these\n * directives work when a CSP rule is blocking inline styles, you must link to the `angular-csp.css`\n * in your HTML manually. (This CSP rule can be disabled with the CSP keyword `unsafe-inline`, but\n * it is generally not recommended as it would weaken the protections offered by CSP.)\n *\n * If you do not provide `ngCsp` then AngularJS tries to autodetect if CSP is blocking dynamic code\n * creation from strings (e.g., `unsafe-eval` not specified in CSP header) and automatically\n * deactivates this feature in the {@link $parse} service. This autodetection, however, triggers a\n * CSP error to be logged in the console:\n *\n * ```\n * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of\n * script in the following Content Security Policy directive: \"default-src 'self'\". Note that\n * 'script-src' was not explicitly set, so 'default-src' is used as a fallback.\n * ```\n *\n * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`\n * directive on an element of the HTML document that appears before the `<script>` tag that loads\n * the `angular.js` file.\n *\n * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*\n *\n * You can specify which of the CSP related AngularJS features should be deactivated by providing\n * a value for the `ng-csp` attribute. The options are as follows:\n *\n * * no-inline-style: this stops AngularJS from injecting CSS styles into the DOM\n *\n * * no-unsafe-eval: this stops AngularJS from optimizing $parse with unsafe eval of strings\n *\n * You can use these values in the following combinations:\n *\n *\n * * No declaration means that AngularJS will assume that you can do inline styles, but it will do\n * a runtime check for unsafe-eval. E.g. `<body>`. This is backwardly compatible with previous\n * versions of AngularJS.\n *\n * * A simple `ng-csp` (or `data-ng-csp`) attribute will tell AngularJS to deactivate both inline\n * styles and unsafe eval. E.g. `<body ng-csp>`. This is backwardly compatible with previous\n * versions of AngularJS.\n *\n * * Specifying only `no-unsafe-eval` tells AngularJS that we must not use eval, but that we can\n * inject inline styles. E.g. `<body ng-csp=\"no-unsafe-eval\">`.\n *\n * * Specifying only `no-inline-style` tells AngularJS that we must not inject styles, but that we can\n * run eval - no automatic check for unsafe eval will occur. E.g. `<body ng-csp=\"no-inline-style\">`\n *\n * * Specifying both `no-unsafe-eval` and `no-inline-style` tells AngularJS that we must not inject\n * styles nor use eval, which is the same as an empty: ng-csp.\n * E.g.`<body ng-csp=\"no-inline-style;no-unsafe-eval\">`\n *\n * @example\n *\n * This example shows how to apply the `ngCsp` directive to the `html` tag.\n   ```html\n     <!doctype html>\n     <html ng-app ng-csp>\n     ...\n     ...\n     </html>\n   ```\n\n  <!-- Note: the `.csp` suffix in the example name triggers CSP mode in our http server! -->\n  <example name=\"example.csp\" module=\"cspExample\" ng-csp=\"true\">\n    <file name=\"index.html\">\n      <div ng-controller=\"MainController as ctrl\">\n        <div>\n          <button ng-click=\"ctrl.inc()\" id=\"inc\">Increment</button>\n          <span id=\"counter\">\n            {{ctrl.counter}}\n          </span>\n        </div>\n\n        <div>\n          <button ng-click=\"ctrl.evil()\" id=\"evil\">Evil</button>\n          <span id=\"evilError\">\n            {{ctrl.evilError}}\n          </span>\n        </div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n       angular.module('cspExample', [])\n         .controller('MainController', function MainController() {\n            this.counter = 0;\n            this.inc = function() {\n              this.counter++;\n            };\n            this.evil = function() {\n              try {\n                eval('1+2'); // eslint-disable-line no-eval\n              } catch (e) {\n                this.evilError = e.message;\n              }\n            };\n          });\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var util, webdriver;\n\n      var incBtn = element(by.id('inc'));\n      var counter = element(by.id('counter'));\n      var evilBtn = element(by.id('evil'));\n      var evilError = element(by.id('evilError'));\n\n      function getAndClearSevereErrors() {\n        return browser.manage().logs().get('browser').then(function(browserLog) {\n          return browserLog.filter(function(logEntry) {\n            return logEntry.level.value > webdriver.logging.Level.WARNING.value;\n          });\n        });\n      }\n\n      function clearErrors() {\n        getAndClearSevereErrors();\n      }\n\n      function expectNoErrors() {\n        getAndClearSevereErrors().then(function(filteredLog) {\n          expect(filteredLog.length).toEqual(0);\n          if (filteredLog.length) {\n            console.log('browser console errors: ' + util.inspect(filteredLog));\n          }\n        });\n      }\n\n      function expectError(regex) {\n        getAndClearSevereErrors().then(function(filteredLog) {\n          var found = false;\n          filteredLog.forEach(function(log) {\n            if (log.message.match(regex)) {\n              found = true;\n            }\n          });\n          if (!found) {\n            throw new Error('expected an error that matches ' + regex);\n          }\n        });\n      }\n\n      beforeEach(function() {\n        util = require('util');\n        webdriver = require('selenium-webdriver');\n      });\n\n      // For now, we only test on Chrome,\n      // as Safari does not load the page with Protractor's injected scripts,\n      // and Firefox webdriver always disables content security policy (#6358)\n      if (browser.params.browser !== 'chrome') {\n        return;\n      }\n\n      it('should not report errors when the page is loaded', function() {\n        // clear errors so we are not dependent on previous tests\n        clearErrors();\n        // Need to reload the page as the page is already loaded when\n        // we come here\n        browser.driver.getCurrentUrl().then(function(url) {\n          browser.get(url);\n        });\n        expectNoErrors();\n      });\n\n      it('should evaluate expressions', function() {\n        expect(counter.getText()).toEqual('0');\n        incBtn.click();\n        expect(counter.getText()).toEqual('1');\n        expectNoErrors();\n      });\n\n      it('should throw and report an error when using \"eval\"', function() {\n        evilBtn.click();\n        expect(evilError.getText()).toMatch(/Content Security Policy/);\n        expectError(/Content Security Policy/);\n      });\n    </file>\n  </example>\n  */\n\n// `ngCsp` is not implemented as a proper directive any more, because we need it be processed while\n// we bootstrap the app (before `$parse` is instantiated). For this reason, we just have the `csp()`\n// fn that looks for the `ng-csp` attribute anywhere in the current doc.\n\n/**\n * @ngdoc directive\n * @name ngClick\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * The ngClick directive allows you to specify custom behavior when\n * an element is clicked.\n *\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\n * click. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-click\">\n     <file name=\"index.html\">\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\n        Increment\n      </button>\n      <span>\n        count: {{count}}\n      </span>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-click', function() {\n         expect(element(by.binding('count')).getText()).toMatch('0');\n         element(by.css('button')).click();\n         expect(element(by.binding('count')).getText()).toMatch('1');\n       });\n     </file>\n   </example>\n */\n/*\n * A collection of directives that allows creation of custom event handlers that are defined as\n * AngularJS expressions and are compiled and executed within the current scope.\n */\nvar ngEventDirectives = {};\n\n// For events that might fire synchronously during DOM manipulation\n// we need to execute their event handlers asynchronously using $evalAsync,\n// so that they are not executed in an inconsistent state.\nvar forceAsyncEvents = {\n  'blur': true,\n  'focus': true\n};\nforEach(\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),\n  function(eventName) {\n    var directiveName = directiveNormalize('ng-' + eventName);\n    ngEventDirectives[directiveName] = ['$parse', '$rootScope', '$exceptionHandler', function($parse, $rootScope, $exceptionHandler) {\n      return createEventDirective($parse, $rootScope, $exceptionHandler, directiveName, eventName, forceAsyncEvents[eventName]);\n    }];\n  }\n);\n\nfunction createEventDirective($parse, $rootScope, $exceptionHandler, directiveName, eventName, forceAsync) {\n  return {\n    restrict: 'A',\n    compile: function($element, attr) {\n      // NOTE:\n      // We expose the powerful `$event` object on the scope that provides access to the Window,\n      // etc. This is OK, because expressions are not sandboxed any more (and the expression\n      // sandbox was never meant to be a security feature anyway).\n      var fn = $parse(attr[directiveName]);\n      return function ngEventHandler(scope, element) {\n        element.on(eventName, function(event) {\n          var callback = function() {\n            fn(scope, {$event: event});\n          };\n\n          if (!$rootScope.$$phase) {\n            scope.$apply(callback);\n          } else if (forceAsync) {\n            scope.$evalAsync(callback);\n          } else {\n            try {\n              callback();\n            } catch (error) {\n              $exceptionHandler(error);\n            }\n          }\n        });\n      };\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name ngDblclick\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.\n *\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\n * a dblclick. (The Event object is available as `$event`)\n *\n * @example\n   <example name=\"ng-dblclick\">\n     <file name=\"index.html\">\n      <button ng-dblclick=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on double click)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousedown\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\n *\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\n * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mousedown\">\n     <file name=\"index.html\">\n      <button ng-mousedown=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse down)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseup\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * Specify custom behavior on mouseup event.\n *\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\n * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseup\">\n     <file name=\"index.html\">\n      <button ng-mouseup=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse up)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngMouseover\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * Specify custom behavior on mouseover event.\n *\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\n * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseover\">\n     <file name=\"index.html\">\n      <button ng-mouseover=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse is over)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseenter\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * Specify custom behavior on mouseenter event.\n *\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\n * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseenter\">\n     <file name=\"index.html\">\n      <button ng-mouseenter=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse enters)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseleave\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * Specify custom behavior on mouseleave event.\n *\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\n * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mouseleave\">\n     <file name=\"index.html\">\n      <button ng-mouseleave=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse leaves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousemove\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * Specify custom behavior on mousemove event.\n *\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\n * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-mousemove\">\n     <file name=\"index.html\">\n      <button ng-mousemove=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse moves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeydown\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * Specify custom behavior on keydown event.\n *\n * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon\n * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example name=\"ng-keydown\">\n     <file name=\"index.html\">\n      <input ng-keydown=\"count = count + 1\" ng-init=\"count=0\">\n      key down count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeyup\n * @restrict A\n * @element ANY\n * @priority 0\n *\n * @description\n * Specify custom behavior on keyup event.\n *\n * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon\n * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example name=\"ng-keyup\">\n     <file name=\"index.html\">\n       <p>Typing in the input box below updates the key count</p>\n       <input ng-keyup=\"count = count + 1\" ng-init=\"count=0\"> key up count: {{count}}\n\n       <p>Typing in the input box below updates the keycode</p>\n       <input ng-keyup=\"event=$event\">\n       <p>event keyCode: {{ event.keyCode }}</p>\n       <p>event altKey: {{ event.altKey }}</p>\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeypress\n * @restrict A\n * @element ANY\n *\n * @description\n * Specify custom behavior on keypress event.\n *\n * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon\n * keypress. ({@link guide/expression#-event- Event object is available as `$event`}\n * and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example name=\"ng-keypress\">\n     <file name=\"index.html\">\n      <input ng-keypress=\"count = count + 1\" ng-init=\"count=0\">\n      key press count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSubmit\n * @restrict A\n * @element form\n * @priority 0\n *\n * @description\n * Enables binding AngularJS expressions to onsubmit events.\n *\n * Additionally it prevents the default action (which for form means sending the request to the\n * server and reloading the current page), but only if the form does not contain `action`,\n * `data-action`, or `x-action` attributes.\n *\n * <div class=\"alert alert-warning\">\n * **Warning:** Be careful not to cause \"double-submission\" by using both the `ngClick` and\n * `ngSubmit` handlers together. See the\n * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}\n * for a detailed discussion of when `ngSubmit` may be triggered.\n * </div>\n *\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\n * ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example module=\"submitExample\" name=\"ng-submit\">\n     <file name=\"index.html\">\n      <script>\n        angular.module('submitExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.list = [];\n            $scope.text = 'hello';\n            $scope.submit = function() {\n              if ($scope.text) {\n                $scope.list.push(this.text);\n                $scope.text = '';\n              }\n            };\n          }]);\n      </script>\n      <form ng-submit=\"submit()\" ng-controller=\"ExampleController\">\n        Enter text and hit enter:\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\n        <pre>list={{list}}</pre>\n      </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-submit', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n         expect(element(by.model('text')).getAttribute('value')).toBe('');\n       });\n       it('should ignore empty strings', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n        });\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngFocus\n * @restrict A\n * @element window, input, select, textarea, a\n * @priority 0\n *\n * @description\n * Specify custom behavior on focus event.\n *\n * Note: As the `focus` event is executed synchronously when calling `input.focus()`\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon\n * focus. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngBlur\n * @restrict A\n * @element window, input, select, textarea, a\n * @priority 0\n *\n * @description\n * Specify custom behavior on blur event.\n *\n * A [blur event](https://developer.mozilla.org/en-US/docs/Web/Events/blur) fires when\n * an element has lost focus.\n *\n * Note: As the `blur` event is executed synchronously also during DOM manipulations\n * (e.g. removing a focussed input),\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon\n * blur. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngCopy\n * @restrict A\n * @element window, input, select, textarea, a\n * @priority 0\n *\n * @description\n * Specify custom behavior on copy event.\n *\n * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon\n * copy. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-copy\">\n     <file name=\"index.html\">\n      <input ng-copy=\"copied=true\" ng-init=\"copied=false; value='copy me'\" ng-model=\"value\">\n      copied: {{copied}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngCut\n * @restrict A\n * @element window, input, select, textarea, a\n * @priority 0\n *\n * @description\n * Specify custom behavior on cut event.\n *\n * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon\n * cut. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-cut\">\n     <file name=\"index.html\">\n      <input ng-cut=\"cut=true\" ng-init=\"cut=false; value='cut me'\" ng-model=\"value\">\n      cut: {{cut}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngPaste\n * @restrict A\n * @element window, input, select, textarea, a\n * @priority 0\n *\n * @description\n * Specify custom behavior on paste event.\n *\n * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon\n * paste. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example name=\"ng-paste\">\n     <file name=\"index.html\">\n      <input ng-paste=\"paste=true\" ng-init=\"paste=false\" placeholder='paste here'>\n      pasted: {{paste}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngIf\n * @restrict A\n * @multiElement\n *\n * @description\n * The `ngIf` directive removes or recreates a portion of the DOM tree based on an\n * {expression}. If the expression assigned to `ngIf` evaluates to a false\n * value then the element is removed from the DOM, otherwise a clone of the\n * element is reinserted into the DOM.\n *\n * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the\n * element in the DOM rather than changing its visibility via the `display` css property.  A common\n * case when this difference is significant is when using css selectors that rely on an element's\n * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.\n *\n * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope\n * is created when the element is restored.  The scope created within `ngIf` inherits from\n * its parent scope using\n * [prototypal inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance).\n * An important implication of this is if `ngModel` is used within `ngIf` to bind to\n * a javascript primitive defined in the parent scope. In this case any modifications made to the\n * variable within the child scope will override (hide) the value in the parent scope.\n *\n * Also, `ngIf` recreates elements using their compiled state. An example of this behavior\n * is if an element's class attribute is directly modified after it's compiled, using something like\n * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element\n * the added class will be lost because the original compiled state is used to regenerate the element.\n *\n * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`\n * and `leave` effects.\n *\n * @animations\n * | Animation                        | Occurs                               |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | just after the `ngIf` contents change and a new DOM element is created and injected into the `ngIf` container |\n * | {@link ng.$animate#leave leave}  | just before the `ngIf` contents are removed from the DOM |\n *\n * @element ANY\n * @scope\n * @priority 600\n * @param {expression} ngIf If the {@link guide/expression expression} is falsy then\n *     the element is removed from the DOM tree. If it is truthy a copy of the compiled\n *     element is added to the DOM tree.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-if\">\n    <file name=\"index.html\">\n      <label>Click me: <input type=\"checkbox\" ng-model=\"checked\" ng-init=\"checked=true\" /></label><br/>\n      Show when checked:\n      <span ng-if=\"checked\" class=\"animate-if\">\n        This is removed when the checkbox is unchecked.\n      </span>\n    </file>\n    <file name=\"animations.css\">\n      .animate-if {\n        background:white;\n        border:1px solid black;\n        padding:10px;\n      }\n\n      .animate-if.ng-enter, .animate-if.ng-leave {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n      }\n\n      .animate-if.ng-enter,\n      .animate-if.ng-leave.ng-leave-active {\n        opacity:0;\n      }\n\n      .animate-if.ng-leave,\n      .animate-if.ng-enter.ng-enter-active {\n        opacity:1;\n      }\n    </file>\n  </example>\n */\nvar ngIfDirective = ['$animate', '$compile', function($animate, $compile) {\n  return {\n    multiElement: true,\n    transclude: 'element',\n    priority: 600,\n    terminal: true,\n    restrict: 'A',\n    $$tlb: true,\n    link: function($scope, $element, $attr, ctrl, $transclude) {\n        var block, childScope, previousElements;\n        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {\n\n          if (value) {\n            if (!childScope) {\n              $transclude(function(clone, newScope) {\n                childScope = newScope;\n                clone[clone.length++] = $compile.$$createComment('end ngIf', $attr.ngIf);\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block = {\n                  clone: clone\n                };\n                $animate.enter(clone, $element.parent(), $element);\n              });\n            }\n          } else {\n            if (previousElements) {\n              previousElements.remove();\n              previousElements = null;\n            }\n            if (childScope) {\n              childScope.$destroy();\n              childScope = null;\n            }\n            if (block) {\n              previousElements = getBlockNodes(block.clone);\n              $animate.leave(previousElements).done(function(response) {\n                if (response !== false) previousElements = null;\n              });\n              block = null;\n            }\n          }\n        });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngInclude\n * @restrict ECA\n * @scope\n * @priority -400\n *\n * @description\n * Fetches, compiles and includes an external HTML fragment.\n *\n * By default, the template URL is restricted to the same domain and protocol as the\n * application document. This is done by calling {@link $sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols\n * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or\n * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to AngularJS's {@link\n * ng.$sce Strict Contextual Escaping}.\n *\n * In addition, the browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy may further restrict whether the template is successfully loaded.\n * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`\n * access on some browsers.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the expression changes, on the new include |\n * | {@link ng.$animate#leave leave}  | when the expression changes, on the old include |\n *\n * The enter and leave animation occur concurrently.\n *\n * @param {string} ngInclude|src AngularJS expression evaluating to URL. If the source is a string constant,\n *                 make sure you wrap it in **single** quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\n *                  <div class=\"alert alert-warning\">\n *                  **Note:** When using onload on SVG elements in IE11, the browser will try to call\n *                  a function with the name on the window element, which will usually throw a\n *                  \"function is undefined\" error. To fix this, you can instead use `data-onload` or a\n *                  different form that {@link guide/directive#normalization matches} `onload`.\n *                  </div>\n   *\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\n *\n * @example\n  <example module=\"includeExample\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-include\">\n    <file name=\"index.html\">\n     <div ng-controller=\"ExampleController\">\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\n        <option value=\"\">(blank)</option>\n       </select>\n       url of the template: <code>{{template.url}}</code>\n       <hr/>\n       <div class=\"slide-animate-container\">\n         <div class=\"slide-animate\" ng-include=\"template.url\"></div>\n       </div>\n     </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('includeExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.templates =\n            [{ name: 'template1.html', url: 'template1.html'},\n             { name: 'template2.html', url: 'template2.html'}];\n          $scope.template = $scope.templates[0];\n        }]);\n     </file>\n    <file name=\"template1.html\">\n      Content of template1.html\n    </file>\n    <file name=\"template2.html\">\n      Content of template2.html\n    </file>\n    <file name=\"animations.css\">\n      .slide-animate-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .slide-animate {\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter, .slide-animate.ng-leave {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n        display:block;\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter {\n        top:-50px;\n      }\n      .slide-animate.ng-enter.ng-enter-active {\n        top:0;\n      }\n\n      .slide-animate.ng-leave {\n        top:0;\n      }\n      .slide-animate.ng-leave.ng-leave-active {\n        top:50px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var templateSelect = element(by.model('template'));\n      var includeElem = element(by.css('[ng-include]'));\n\n      it('should load template1.html', function() {\n        expect(includeElem.getText()).toMatch(/Content of template1.html/);\n      });\n\n      it('should load template2.html', function() {\n        if (browser.params.browser === 'firefox') {\n          // Firefox can't handle using selects\n          // See https://github.com/angular/protractor/issues/480\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(2).click();\n        expect(includeElem.getText()).toMatch(/Content of template2.html/);\n      });\n\n      it('should change to blank', function() {\n        if (browser.params.browser === 'firefox') {\n          // Firefox can't handle using selects\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(0).click();\n        expect(includeElem.isPresent()).toBe(false);\n      });\n    </file>\n  </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentRequested\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted every time the ngInclude content is requested.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentLoaded\n * @eventType emit on the current ngInclude scope\n * @description\n * Emitted every time the ngInclude content is reloaded.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentError\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted when a template HTTP request yields an erroneous response (status < 200 || status > 299)\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\nvar ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate',\n                  function($templateRequest,   $anchorScroll,   $animate) {\n  return {\n    restrict: 'ECA',\n    priority: 400,\n    terminal: true,\n    transclude: 'element',\n    controller: angular.noop,\n    compile: function(element, attr) {\n      var srcExp = attr.ngInclude || attr.src,\n          onloadExp = attr.onload || '',\n          autoScrollExp = attr.autoscroll;\n\n      return function(scope, $element, $attr, ctrl, $transclude) {\n        var changeCounter = 0,\n            currentScope,\n            previousElement,\n            currentElement;\n\n        var cleanupLastIncludeContent = function() {\n          if (previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            $animate.leave(currentElement).done(function(response) {\n              if (response !== false) previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        };\n\n        scope.$watch(srcExp, function ngIncludeWatchAction(src) {\n          var afterAnimation = function(response) {\n            if (response !== false && isDefined(autoScrollExp) &&\n              (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                $anchorScroll();\n            }\n          };\n          var thisChangeId = ++changeCounter;\n\n          if (src) {\n            //set the 2nd param to true to ignore the template request error so that the inner\n            //contents and scope can be cleaned up.\n            $templateRequest(src, true).then(function(response) {\n              if (scope.$$destroyed) return;\n\n              if (thisChangeId !== changeCounter) return;\n              var newScope = scope.$new();\n              ctrl.template = response;\n\n              // Note: This will also link all children of ng-include that were contained in the original\n              // html. If that content contains controllers, ... they could pollute/change the scope.\n              // However, using ng-include on an element with additional content does not make sense...\n              // Note: We can't remove them in the cloneAttchFn of $transclude as that\n              // function is called before linking the content, which would apply child\n              // directives to non existing elements.\n              var clone = $transclude(newScope, function(clone) {\n                cleanupLastIncludeContent();\n                $animate.enter(clone, null, $element).done(afterAnimation);\n              });\n\n              currentScope = newScope;\n              currentElement = clone;\n\n              currentScope.$emit('$includeContentLoaded', src);\n              scope.$eval(onloadExp);\n            }, function() {\n              if (scope.$$destroyed) return;\n\n              if (thisChangeId === changeCounter) {\n                cleanupLastIncludeContent();\n                scope.$emit('$includeContentError', src);\n              }\n            });\n            scope.$emit('$includeContentRequested', src);\n          } else {\n            cleanupLastIncludeContent();\n            ctrl.template = null;\n          }\n        });\n      };\n    }\n  };\n}];\n\n// This directive is called during the $transclude call of the first `ngInclude` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngInclude\n// is called.\nvar ngIncludeFillContentDirective = ['$compile',\n  function($compile) {\n    return {\n      restrict: 'ECA',\n      priority: -400,\n      require: 'ngInclude',\n      link: function(scope, $element, $attr, ctrl) {\n        if (toString.call($element[0]).match(/SVG/)) {\n          // WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not\n          // support innerHTML, so detect this here and try to generate the contents\n          // specially.\n          $element.empty();\n          $compile(jqLiteBuildFragment(ctrl.template, window.document).childNodes)(scope,\n              function namespaceAdaptedClone(clone) {\n            $element.append(clone);\n          }, {futureParentElement: $element});\n          return;\n        }\n\n        $element.html(ctrl.template);\n        $compile($element.contents())(scope);\n      }\n    };\n  }];\n\n/**\n * @ngdoc directive\n * @name ngInit\n * @restrict AC\n * @priority 450\n * @element ANY\n *\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\n *\n * @description\n * The `ngInit` directive allows you to evaluate an expression in the\n * current scope.\n *\n * <div class=\"alert alert-danger\">\n * This directive can be abused to add unnecessary amounts of logic into your templates.\n * There are only a few appropriate uses of `ngInit`:\n * <ul>\n *   <li>aliasing special properties of {@link ng.directive:ngRepeat `ngRepeat`},\n *     as seen in the demo below.</li>\n *   <li>initializing data during development, or for examples, as seen throughout these docs.</li>\n *   <li>injecting data via server side scripting.</li>\n * </ul>\n *\n * Besides these few cases, you should use {@link guide/component Components} or\n * {@link guide/controller Controllers} rather than `ngInit` to initialize values on a scope.\n * </div>\n *\n * <div class=\"alert alert-warning\">\n * **Note**: If you have assignment in `ngInit` along with a {@link ng.$filter `filter`}, make\n * sure you have parentheses to ensure correct operator precedence:\n * <pre class=\"prettyprint\">\n * `<div ng-init=\"test1 = ($index | toString)\"></div>`\n * </pre>\n * </div>\n *\n * @example\n   <example module=\"initExample\" name=\"ng-init\">\n     <file name=\"index.html\">\n   <script>\n     angular.module('initExample', [])\n       .controller('ExampleController', ['$scope', function($scope) {\n         $scope.list = [['a', 'b'], ['c', 'd']];\n       }]);\n   </script>\n   <div ng-controller=\"ExampleController\">\n     <div ng-repeat=\"innerList in list\" ng-init=\"outerIndex = $index\">\n       <div ng-repeat=\"value in innerList\" ng-init=\"innerIndex = $index\">\n          <span class=\"example-init\">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>\n       </div>\n     </div>\n   </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should alias index positions', function() {\n         var elements = element.all(by.css('.example-init'));\n         expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');\n         expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');\n         expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');\n         expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');\n       });\n     </file>\n   </example>\n */\nvar ngInitDirective = ngDirective({\n  priority: 450,\n  compile: function() {\n    return {\n      pre: function(scope, element, attrs) {\n        scope.$eval(attrs.ngInit);\n      }\n    };\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngList\n * @restrict A\n * @priority 100\n *\n * @param {string=} ngList optional delimiter that should be used to split the value.\n *\n * @description\n * Text input that converts between a delimited string and an array of strings. The default\n * delimiter is a comma followed by a space - equivalent to `ng-list=\", \"`. You can specify a custom\n * delimiter as the value of the `ngList` attribute - for example, `ng-list=\" | \"`.\n *\n * The behaviour of the directive is affected by the use of the `ngTrim` attribute.\n * * If `ngTrim` is set to `\"false\"` then whitespace around both the separator and each\n *   list item is respected. This implies that the user of the directive is responsible for\n *   dealing with whitespace but also allows you to use whitespace as a delimiter, such as a\n *   tab or newline character.\n * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected\n *   when joining the list items back together) and whitespace around each list item is stripped\n *   before it is added to the model.\n *\n * @example\n * ### Validation\n *\n * <example name=\"ngList-directive\" module=\"listExample\">\n *   <file name=\"app.js\">\n *      angular.module('listExample', [])\n *        .controller('ExampleController', ['$scope', function($scope) {\n *          $scope.names = ['morpheus', 'neo', 'trinity'];\n *        }]);\n *   </file>\n *   <file name=\"index.html\">\n *    <form name=\"myForm\" ng-controller=\"ExampleController\">\n *      <label>List: <input name=\"namesInput\" ng-model=\"names\" ng-list required></label>\n *      <span role=\"alert\">\n *        <span class=\"error\" ng-show=\"myForm.namesInput.$error.required\">\n *        Required!</span>\n *      </span>\n *      <br>\n *      <tt>names = {{names}}</tt><br/>\n *      <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\n *      <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\n *      <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n *      <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n *     </form>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var listInput = element(by.model('names'));\n *     var names = element(by.exactBinding('names'));\n *     var valid = element(by.binding('myForm.namesInput.$valid'));\n *     var error = element(by.css('span.error'));\n *\n *     it('should initialize to model', function() {\n *       expect(names.getText()).toContain('[\"morpheus\",\"neo\",\"trinity\"]');\n *       expect(valid.getText()).toContain('true');\n *       expect(error.getCssValue('display')).toBe('none');\n *     });\n *\n *     it('should be invalid if empty', function() {\n *       listInput.clear();\n *       listInput.sendKeys('');\n *\n *       expect(names.getText()).toContain('');\n *       expect(valid.getText()).toContain('false');\n *       expect(error.getCssValue('display')).not.toBe('none');\n *     });\n *   </file>\n * </example>\n *\n * @example\n * ### Splitting on newline\n *\n * <example name=\"ngList-directive-newlines\">\n *   <file name=\"index.html\">\n *    <textarea ng-model=\"list\" ng-list=\"&#10;\" ng-trim=\"false\"></textarea>\n *    <pre>{{ list | json }}</pre>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it(\"should split the text by newlines\", function() {\n *       var listInput = element(by.model('list'));\n *       var output = element(by.binding('list | json'));\n *       listInput.sendKeys('abc\\ndef\\nghi');\n *       expect(output.getText()).toContain('[\\n  \"abc\",\\n  \"def\",\\n  \"ghi\"\\n]');\n *     });\n *   </file>\n * </example>\n *\n */\nvar ngListDirective = function() {\n  return {\n    restrict: 'A',\n    priority: 100,\n    require: 'ngModel',\n    link: function(scope, element, attr, ctrl) {\n      var ngList = attr.ngList || ', ';\n      var trimValues = attr.ngTrim !== 'false';\n      var separator = trimValues ? trim(ngList) : ngList;\n\n      var parse = function(viewValue) {\n        // If the viewValue is invalid (say required but empty) it will be `undefined`\n        if (isUndefined(viewValue)) return;\n\n        var list = [];\n\n        if (viewValue) {\n          forEach(viewValue.split(separator), function(value) {\n            if (value) list.push(trimValues ? trim(value) : value);\n          });\n        }\n\n        return list;\n      };\n\n      ctrl.$parsers.push(parse);\n      ctrl.$formatters.push(function(value) {\n        if (isArray(value)) {\n          return value.join(ngList);\n        }\n\n        return undefined;\n      });\n\n      // Override the standard $isEmpty because an empty array means the input is empty.\n      ctrl.$isEmpty = function(value) {\n        return !value || !value.length;\n      };\n    }\n  };\n};\n\n/* global VALID_CLASS: true,\n  INVALID_CLASS: true,\n  PRISTINE_CLASS: true,\n  DIRTY_CLASS: true,\n  UNTOUCHED_CLASS: true,\n  TOUCHED_CLASS: true,\n  PENDING_CLASS: true,\n  addSetValidityMethod: true,\n  setupValidity: true,\n  defaultModelOptions: false\n*/\n\n\nvar VALID_CLASS = 'ng-valid',\n    INVALID_CLASS = 'ng-invalid',\n    PRISTINE_CLASS = 'ng-pristine',\n    DIRTY_CLASS = 'ng-dirty',\n    UNTOUCHED_CLASS = 'ng-untouched',\n    TOUCHED_CLASS = 'ng-touched',\n    EMPTY_CLASS = 'ng-empty',\n    NOT_EMPTY_CLASS = 'ng-not-empty';\n\nvar ngModelMinErr = minErr('ngModel');\n\n/**\n * @ngdoc type\n * @name ngModel.NgModelController\n * @property {*} $viewValue The actual value from the control's view. For `input` elements, this is a\n * String. See {@link ngModel.NgModelController#$setViewValue} for information about when the $viewValue\n * is set.\n *\n * @property {*} $modelValue The value in the model that the control is bound to.\n *\n * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever\n *  the control updates the ngModelController with a new {@link ngModel.NgModelController#$viewValue\n    `$viewValue`} from the DOM, usually via user input.\n    See {@link ngModel.NgModelController#$setViewValue `$setViewValue()`} for a detailed lifecycle explanation.\n    Note that the `$parsers` are not called when the bound ngModel expression changes programmatically.\n\n  The functions are called in array order, each passing\n    its return value through to the next. The last return value is forwarded to the\n    {@link ngModel.NgModelController#$validators `$validators`} collection.\n\n  Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue\n    `$viewValue`}.\n\n  Returning `undefined` from a parser means a parse error occurred. In that case,\n    no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`\n    will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}\n    is set to `true`. The parse error is stored in `ngModel.$error.parse`.\n\n  This simple example shows a parser that would convert text input value to lowercase:\n * ```js\n * function parse(value) {\n *   if (value) {\n *     return value.toLowerCase();\n *   }\n * }\n * ngModelController.$parsers.push(parse);\n * ```\n\n *\n * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever\n    the bound ngModel expression changes programmatically. The `$formatters` are not called when the\n    value of the control is changed by user interaction.\n\n  Formatters are used to format / convert the {@link ngModel.NgModelController#$modelValue\n    `$modelValue`} for display in the control.\n\n  The functions are called in reverse array order, each passing the value through to the\n    next. The last return value is used as the actual DOM value.\n\n  This simple example shows a formatter that would convert the model value to uppercase:\n\n * ```js\n * function format(value) {\n *   if (value) {\n *     return value.toUpperCase();\n *   }\n * }\n * ngModel.$formatters.push(format);\n * ```\n *\n * @property {Object.<string, function>} $validators A collection of validators that are applied\n *      whenever the model value changes. The key value within the object refers to the name of the\n *      validator while the function refers to the validation operation. The validation operation is\n *      provided with the model value as an argument and must return a true or false value depending\n *      on the response of that validation.\n *\n * ```js\n * ngModel.$validators.validCharacters = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *   return /[0-9]+/.test(value) &&\n *          /[a-z]+/.test(value) &&\n *          /[A-Z]+/.test(value) &&\n *          /\\W+/.test(value);\n * };\n * ```\n *\n * @property {Object.<string, function>} $asyncValidators A collection of validations that are expected to\n *      perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided\n *      is expected to return a promise when it is run during the model validation process. Once the promise\n *      is delivered then the validation status will be set to true when fulfilled and false when rejected.\n *      When the asynchronous validators are triggered, each of the validators will run in parallel and the model\n *      value will only be updated once all validators have been fulfilled. As long as an asynchronous validator\n *      is unfulfilled, its key will be added to the controllers `$pending` property. Also, all asynchronous validators\n *      will only run once all synchronous validators have passed.\n *\n * Please note that if $http is used then it is important that the server returns a success HTTP response code\n * in order to fulfill the validation and a status level of `4xx` in order to reject the validation.\n *\n * ```js\n * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *\n *   // Lookup user by username\n *   return $http.get('/api/users/' + value).\n *      then(function resolved() {\n *        //username exists, this means validation fails\n *        return $q.reject('exists');\n *      }, function rejected() {\n *        //username does not exist, therefore this validation passes\n *        return true;\n *      });\n * };\n * ```\n *\n * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever\n *     a change to {@link ngModel.NgModelController#$viewValue `$viewValue`} has caused a change\n *     to {@link ngModel.NgModelController#$modelValue `$modelValue`}.\n *     It is called with no arguments, and its return value is ignored.\n *     This can be used in place of additional $watches against the model value.\n *\n * @property {Object} $error An object hash with all failing validator ids as keys.\n * @property {Object} $pending An object hash with all pending validator ids as keys.\n *\n * @property {boolean} $untouched True if control has not lost focus yet.\n * @property {boolean} $touched True if control has lost focus.\n * @property {boolean} $pristine True if user has not interacted with the control yet.\n * @property {boolean} $dirty True if user has already interacted with the control.\n * @property {boolean} $valid True if there is no error.\n * @property {boolean} $invalid True if at least one error on the control.\n * @property {string} $name The name attribute of the control.\n *\n * @description\n *\n * `NgModelController` provides API for the {@link ngModel `ngModel`} directive.\n * The controller contains services for data-binding, validation, CSS updates, and value formatting\n * and parsing. It purposefully does not contain any logic which deals with DOM rendering or\n * listening to DOM events.\n * Such DOM related logic should be provided by other directives which make use of\n * `NgModelController` for data-binding to control elements.\n * AngularJS provides this DOM logic for most {@link input `input`} elements.\n * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example\n * custom control example} that uses `ngModelController` to bind to `contenteditable` elements.\n *\n * @example\n * ### Custom Control Example\n * This example shows how to use `NgModelController` with a custom control to achieve\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\n * collaborate together to achieve the desired result.\n *\n * `contenteditable` is an HTML5 attribute, which tells the browser to let the element\n * contents be edited in place by the user.\n *\n * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}\n * module to automatically remove \"bad\" content like inline event listener (e.g. `<span onclick=\"...\">`).\n * However, as we are using `$sce` the model can still decide to provide unsafe content if it marks\n * that content using the `$sce` service.\n *\n * <example name=\"NgModelController\" module=\"customControl\" deps=\"angular-sanitize.js\">\n    <file name=\"style.css\">\n      [contenteditable] {\n        border: 1px solid black;\n        background-color: white;\n        min-height: 20px;\n      }\n\n      .ng-invalid {\n        border: 1px solid red;\n      }\n\n    </file>\n    <file name=\"script.js\">\n      angular.module('customControl', ['ngSanitize']).\n        directive('contenteditable', ['$sce', function($sce) {\n          return {\n            restrict: 'A', // only activate on element attribute\n            require: '?ngModel', // get a hold of NgModelController\n            link: function(scope, element, attrs, ngModel) {\n              if (!ngModel) return; // do nothing if no ng-model\n\n              // Specify how UI should be updated\n              ngModel.$render = function() {\n                element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));\n              };\n\n              // Listen for change events to enable binding\n              element.on('blur keyup change', function() {\n                scope.$evalAsync(read);\n              });\n              read(); // initialize\n\n              // Write data to the model\n              function read() {\n                var html = element.html();\n                // When we clear the content editable the browser leaves a <br> behind\n                // If strip-br attribute is provided then we strip this out\n                if (attrs.stripBr && html === '<br>') {\n                  html = '';\n                }\n                ngModel.$setViewValue(html);\n              }\n            }\n          };\n        }]);\n    </file>\n    <file name=\"index.html\">\n      <form name=\"myForm\">\n       <div contenteditable\n            name=\"myWidget\" ng-model=\"userContent\"\n            strip-br=\"true\"\n            required>Change me!</div>\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\n       <hr>\n       <textarea ng-model=\"userContent\" aria-label=\"Dynamic textarea\"></textarea>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n    it('should data-bind and become invalid', function() {\n      if (browser.params.browser === 'safari' || browser.params.browser === 'firefox') {\n        // SafariDriver can't handle contenteditable\n        // and Firefox driver can't clear contenteditables very well\n        return;\n      }\n      var contentEditable = element(by.css('[contenteditable]'));\n      var content = 'Change me!';\n\n      expect(contentEditable.getText()).toEqual(content);\n\n      contentEditable.clear();\n      contentEditable.sendKeys(protractor.Key.BACK_SPACE);\n      expect(contentEditable.getText()).toEqual('');\n      expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);\n    });\n    </file>\n * </example>\n *\n *\n */\nNgModelController.$inject = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$q', '$interpolate'];\nfunction NgModelController($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $q, $interpolate) {\n  this.$viewValue = Number.NaN;\n  this.$modelValue = Number.NaN;\n  this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity.\n  this.$validators = {};\n  this.$asyncValidators = {};\n  this.$parsers = [];\n  this.$formatters = [];\n  this.$viewChangeListeners = [];\n  this.$untouched = true;\n  this.$touched = false;\n  this.$pristine = true;\n  this.$dirty = false;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$error = {}; // keep invalid keys here\n  this.$$success = {}; // keep valid keys here\n  this.$pending = undefined; // keep pending keys here\n  this.$name = $interpolate($attr.name || '', false)($scope);\n  this.$$parentForm = nullFormCtrl;\n  this.$options = defaultModelOptions;\n  this.$$updateEvents = '';\n  // Attach the correct context to the event handler function for updateOn\n  this.$$updateEventHandler = this.$$updateEventHandler.bind(this);\n\n  this.$$parsedNgModel = $parse($attr.ngModel);\n  this.$$parsedNgModelAssign = this.$$parsedNgModel.assign;\n  this.$$ngModelGet = this.$$parsedNgModel;\n  this.$$ngModelSet = this.$$parsedNgModelAssign;\n  this.$$pendingDebounce = null;\n  this.$$parserValid = undefined;\n  this.$$parserName = 'parse';\n\n  this.$$currentValidationRunId = 0;\n\n  this.$$scope = $scope;\n  this.$$rootScope = $scope.$root;\n  this.$$attr = $attr;\n  this.$$element = $element;\n  this.$$animate = $animate;\n  this.$$timeout = $timeout;\n  this.$$parse = $parse;\n  this.$$q = $q;\n  this.$$exceptionHandler = $exceptionHandler;\n\n  setupValidity(this);\n  setupModelWatcher(this);\n}\n\nNgModelController.prototype = {\n  $$initGetterSetters: function() {\n    if (this.$options.getOption('getterSetter')) {\n      var invokeModelGetter = this.$$parse(this.$$attr.ngModel + '()'),\n          invokeModelSetter = this.$$parse(this.$$attr.ngModel + '($$$p)');\n\n      this.$$ngModelGet = function($scope) {\n        var modelValue = this.$$parsedNgModel($scope);\n        if (isFunction(modelValue)) {\n          modelValue = invokeModelGetter($scope);\n        }\n        return modelValue;\n      };\n      this.$$ngModelSet = function($scope, newValue) {\n        if (isFunction(this.$$parsedNgModel($scope))) {\n          invokeModelSetter($scope, {$$$p: newValue});\n        } else {\n          this.$$parsedNgModelAssign($scope, newValue);\n        }\n      };\n    } else if (!this.$$parsedNgModel.assign) {\n      throw ngModelMinErr('nonassign', 'Expression \\'{0}\\' is non-assignable. Element: {1}',\n          this.$$attr.ngModel, startingTag(this.$$element));\n    }\n  },\n\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$render\n   *\n   * @description\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\n   * directive will implement this method.\n   *\n   * The `$render()` method is invoked in the following situations:\n   *\n   * * `$rollbackViewValue()` is called.  If we are rolling back the view value to the last\n   *   committed value then `$render()` is called to update the input control.\n   * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and\n   *   the `$viewValue` are different from last time.\n   *\n   * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of\n   * `$modelValue` and `$viewValue` are actually different from their previous values. If `$modelValue`\n   * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be\n   * invoked if you only change a property on the objects.\n   */\n  $render: noop,\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$isEmpty\n   *\n   * @description\n   * This is called when we need to determine if the value of an input is empty.\n   *\n   * For instance, the required directive does this to work out if the input has data or not.\n   *\n   * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.\n   *\n   * You can override this for input directives whose concept of being empty is different from the\n   * default. The `checkboxInputType` directive does this because in its case a value of `false`\n   * implies empty.\n   *\n   * @param {*} value The value of the input to check for emptiness.\n   * @returns {boolean} True if `value` is \"empty\".\n   */\n  $isEmpty: function(value) {\n    // eslint-disable-next-line no-self-compare\n    return isUndefined(value) || value === '' || value === null || value !== value;\n  },\n\n  $$updateEmptyClasses: function(value) {\n    if (this.$isEmpty(value)) {\n      this.$$animate.removeClass(this.$$element, NOT_EMPTY_CLASS);\n      this.$$animate.addClass(this.$$element, EMPTY_CLASS);\n    } else {\n      this.$$animate.removeClass(this.$$element, EMPTY_CLASS);\n      this.$$animate.addClass(this.$$element, NOT_EMPTY_CLASS);\n    }\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setPristine\n   *\n   * @description\n   * Sets the control to its pristine state.\n   *\n   * This method can be called to remove the `ng-dirty` class and set the control to its pristine\n   * state (`ng-pristine` class). A model is considered to be pristine when the control\n   * has not been changed from when first compiled.\n   */\n  $setPristine: function() {\n    this.$dirty = false;\n    this.$pristine = true;\n    this.$$animate.removeClass(this.$$element, DIRTY_CLASS);\n    this.$$animate.addClass(this.$$element, PRISTINE_CLASS);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setDirty\n   *\n   * @description\n   * Sets the control to its dirty state.\n   *\n   * This method can be called to remove the `ng-pristine` class and set the control to its dirty\n   * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed\n   * from when first compiled.\n   */\n  $setDirty: function() {\n    this.$dirty = true;\n    this.$pristine = false;\n    this.$$animate.removeClass(this.$$element, PRISTINE_CLASS);\n    this.$$animate.addClass(this.$$element, DIRTY_CLASS);\n    this.$$parentForm.$setDirty();\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setUntouched\n   *\n   * @description\n   * Sets the control to its untouched state.\n   *\n   * This method can be called to remove the `ng-touched` class and set the control to its\n   * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched\n   * by default, however this function can be used to restore that state if the model has\n   * already been touched by the user.\n   */\n  $setUntouched: function() {\n    this.$touched = false;\n    this.$untouched = true;\n    this.$$animate.setClass(this.$$element, UNTOUCHED_CLASS, TOUCHED_CLASS);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setTouched\n   *\n   * @description\n   * Sets the control to its touched state.\n   *\n   * This method can be called to remove the `ng-untouched` class and set the control to its\n   * touched state (`ng-touched` class). A model is considered to be touched when the user has\n   * first focused the control element and then shifted focus away from the control (blur event).\n   */\n  $setTouched: function() {\n    this.$touched = true;\n    this.$untouched = false;\n    this.$$animate.setClass(this.$$element, TOUCHED_CLASS, UNTOUCHED_CLASS);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$rollbackViewValue\n   *\n   * @description\n   * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,\n   * which may be caused by a pending debounced event or because the input is waiting for some\n   * future event.\n   *\n   * If you have an input that uses `ng-model-options` to set up debounced updates or updates that\n   * depend on special events such as `blur`, there can be a period when the `$viewValue` is out of\n   * sync with the ngModel's `$modelValue`.\n   *\n   * In this case, you can use `$rollbackViewValue()` to manually cancel the debounced / future update\n   * and reset the input to the last committed view value.\n   *\n   * It is also possible that you run into difficulties if you try to update the ngModel's `$modelValue`\n   * programmatically before these debounced/future events have resolved/occurred, because AngularJS's\n   * dirty checking mechanism is not able to tell whether the model has actually changed or not.\n   *\n   * The `$rollbackViewValue()` method should be called before programmatically changing the model of an\n   * input which may have such events pending. This is important in order to make sure that the\n   * input field will be updated with the new model value and any pending operations are cancelled.\n   *\n   * @example\n   * <example name=\"ng-model-cancel-update\" module=\"cancel-update-example\">\n   *   <file name=\"app.js\">\n   *     angular.module('cancel-update-example', [])\n   *\n   *     .controller('CancelUpdateController', ['$scope', function($scope) {\n   *       $scope.model = {value1: '', value2: ''};\n   *\n   *       $scope.setEmpty = function(e, value, rollback) {\n   *         if (e.keyCode === 27) {\n   *           e.preventDefault();\n   *           if (rollback) {\n   *             $scope.myForm[value].$rollbackViewValue();\n   *           }\n   *           $scope.model[value] = '';\n   *         }\n   *       };\n   *     }]);\n   *   </file>\n   *   <file name=\"index.html\">\n   *     <div ng-controller=\"CancelUpdateController\">\n   *       <p>Both of these inputs are only updated if they are blurred. Hitting escape should\n   *       empty them. Follow these steps and observe the difference:</p>\n   *       <ol>\n   *         <li>Type something in the input. You will see that the model is not yet updated</li>\n   *         <li>Press the Escape key.\n   *           <ol>\n   *             <li> In the first example, nothing happens, because the model is already '', and no\n   *             update is detected. If you blur the input, the model will be set to the current view.\n   *             </li>\n   *             <li> In the second example, the pending update is cancelled, and the input is set back\n   *             to the last committed view value (''). Blurring the input does nothing.\n   *             </li>\n   *           </ol>\n   *         </li>\n   *       </ol>\n   *\n   *       <form name=\"myForm\" ng-model-options=\"{ updateOn: 'blur' }\">\n   *         <div>\n   *           <p id=\"inputDescription1\">Without $rollbackViewValue():</p>\n   *           <input name=\"value1\" aria-describedby=\"inputDescription1\" ng-model=\"model.value1\"\n   *                  ng-keydown=\"setEmpty($event, 'value1')\">\n   *           value1: \"{{ model.value1 }}\"\n   *         </div>\n   *\n   *         <div>\n   *           <p id=\"inputDescription2\">With $rollbackViewValue():</p>\n   *           <input name=\"value2\" aria-describedby=\"inputDescription2\" ng-model=\"model.value2\"\n   *                  ng-keydown=\"setEmpty($event, 'value2', true)\">\n   *           value2: \"{{ model.value2 }}\"\n   *         </div>\n   *       </form>\n   *     </div>\n   *   </file>\n       <file name=\"style.css\">\n          div {\n            display: table-cell;\n          }\n          div:nth-child(1) {\n            padding-right: 30px;\n          }\n\n        </file>\n   * </example>\n   */\n  $rollbackViewValue: function() {\n    this.$$timeout.cancel(this.$$pendingDebounce);\n    this.$viewValue = this.$$lastCommittedViewValue;\n    this.$render();\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$validate\n   *\n   * @description\n   * Runs each of the registered validators (first synchronous validators and then\n   * asynchronous validators).\n   * If the validity changes to invalid, the model will be set to `undefined`,\n   * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`.\n   * If the validity changes to valid, it will set the model to the last available valid\n   * `$modelValue`, i.e. either the last parsed value or the last value set from the scope.\n   */\n  $validate: function() {\n\n    // ignore $validate before model is initialized\n    if (isNumberNaN(this.$modelValue)) {\n      return;\n    }\n\n    var viewValue = this.$$lastCommittedViewValue;\n    // Note: we use the $$rawModelValue as $modelValue might have been\n    // set to undefined during a view -> model update that found validation\n    // errors. We can't parse the view here, since that could change\n    // the model although neither viewValue nor the model on the scope changed\n    var modelValue = this.$$rawModelValue;\n\n    var prevValid = this.$valid;\n    var prevModelValue = this.$modelValue;\n\n    var allowInvalid = this.$options.getOption('allowInvalid');\n\n    var that = this;\n    this.$$runValidators(modelValue, viewValue, function(allValid) {\n      // If there was no change in validity, don't update the model\n      // This prevents changing an invalid modelValue to undefined\n      if (!allowInvalid && prevValid !== allValid) {\n        // Note: Don't check this.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        that.$modelValue = allValid ? modelValue : undefined;\n\n        if (that.$modelValue !== prevModelValue) {\n          that.$$writeModelToScope();\n        }\n      }\n    });\n  },\n\n  $$runValidators: function(modelValue, viewValue, doneCallback) {\n    this.$$currentValidationRunId++;\n    var localValidationRunId = this.$$currentValidationRunId;\n    var that = this;\n\n    // check parser error\n    if (!processParseErrors()) {\n      validationDone(false);\n      return;\n    }\n    if (!processSyncValidators()) {\n      validationDone(false);\n      return;\n    }\n    processAsyncValidators();\n\n    function processParseErrors() {\n      var errorKey = that.$$parserName;\n\n      if (isUndefined(that.$$parserValid)) {\n        setValidity(errorKey, null);\n      } else {\n        if (!that.$$parserValid) {\n          forEach(that.$validators, function(v, name) {\n            setValidity(name, null);\n          });\n          forEach(that.$asyncValidators, function(v, name) {\n            setValidity(name, null);\n          });\n        }\n\n        // Set the parse error last, to prevent unsetting it, should a $validators key == parserName\n        setValidity(errorKey, that.$$parserValid);\n        return that.$$parserValid;\n      }\n      return true;\n    }\n\n    function processSyncValidators() {\n      var syncValidatorsValid = true;\n      forEach(that.$validators, function(validator, name) {\n        var result = Boolean(validator(modelValue, viewValue));\n        syncValidatorsValid = syncValidatorsValid && result;\n        setValidity(name, result);\n      });\n      if (!syncValidatorsValid) {\n        forEach(that.$asyncValidators, function(v, name) {\n          setValidity(name, null);\n        });\n        return false;\n      }\n      return true;\n    }\n\n    function processAsyncValidators() {\n      var validatorPromises = [];\n      var allValid = true;\n      forEach(that.$asyncValidators, function(validator, name) {\n        var promise = validator(modelValue, viewValue);\n        if (!isPromiseLike(promise)) {\n          throw ngModelMinErr('nopromise',\n            'Expected asynchronous validator to return a promise but got \\'{0}\\' instead.', promise);\n        }\n        setValidity(name, undefined);\n        validatorPromises.push(promise.then(function() {\n          setValidity(name, true);\n        }, function() {\n          allValid = false;\n          setValidity(name, false);\n        }));\n      });\n      if (!validatorPromises.length) {\n        validationDone(true);\n      } else {\n        that.$$q.all(validatorPromises).then(function() {\n          validationDone(allValid);\n        }, noop);\n      }\n    }\n\n    function setValidity(name, isValid) {\n      if (localValidationRunId === that.$$currentValidationRunId) {\n        that.$setValidity(name, isValid);\n      }\n    }\n\n    function validationDone(allValid) {\n      if (localValidationRunId === that.$$currentValidationRunId) {\n\n        doneCallback(allValid);\n      }\n    }\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$commitViewValue\n   *\n   * @description\n   * Commit a pending update to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  $commitViewValue: function() {\n    var viewValue = this.$viewValue;\n\n    this.$$timeout.cancel(this.$$pendingDebounce);\n\n    // If the view value has not changed then we should just exit, except in the case where there is\n    // a native validator on the element. In this case the validation state may have changed even though\n    // the viewValue has stayed empty.\n    if (this.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !this.$$hasNativeValidators)) {\n      return;\n    }\n    this.$$updateEmptyClasses(viewValue);\n    this.$$lastCommittedViewValue = viewValue;\n\n    // change to dirty\n    if (this.$pristine) {\n      this.$setDirty();\n    }\n    this.$$parseAndValidate();\n  },\n\n  $$parseAndValidate: function() {\n    var viewValue = this.$$lastCommittedViewValue;\n    var modelValue = viewValue;\n    var that = this;\n\n    this.$$parserValid = isUndefined(modelValue) ? undefined : true;\n\n    // Reset any previous parse error\n    this.$setValidity(this.$$parserName, null);\n    this.$$parserName = 'parse';\n\n    if (this.$$parserValid) {\n      for (var i = 0; i < this.$parsers.length; i++) {\n        modelValue = this.$parsers[i](modelValue);\n        if (isUndefined(modelValue)) {\n          this.$$parserValid = false;\n          break;\n        }\n      }\n    }\n    if (isNumberNaN(this.$modelValue)) {\n      // this.$modelValue has not been touched yet...\n      this.$modelValue = this.$$ngModelGet(this.$$scope);\n    }\n    var prevModelValue = this.$modelValue;\n    var allowInvalid = this.$options.getOption('allowInvalid');\n    this.$$rawModelValue = modelValue;\n\n    if (allowInvalid) {\n      this.$modelValue = modelValue;\n      writeToModelIfNeeded();\n    }\n\n    // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.\n    // This can happen if e.g. $setViewValue is called from inside a parser\n    this.$$runValidators(modelValue, this.$$lastCommittedViewValue, function(allValid) {\n      if (!allowInvalid) {\n        // Note: Don't check this.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        that.$modelValue = allValid ? modelValue : undefined;\n        writeToModelIfNeeded();\n      }\n    });\n\n    function writeToModelIfNeeded() {\n      if (that.$modelValue !== prevModelValue) {\n        that.$$writeModelToScope();\n      }\n    }\n  },\n\n  $$writeModelToScope: function() {\n    this.$$ngModelSet(this.$$scope, this.$modelValue);\n    forEach(this.$viewChangeListeners, function(listener) {\n      try {\n        listener();\n      } catch (e) {\n        // eslint-disable-next-line no-invalid-this\n        this.$$exceptionHandler(e);\n      }\n    }, this);\n  },\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setViewValue\n   *\n   * @description\n   * Update the view value.\n   *\n   * This method should be called when a control wants to change the view value; typically,\n   * this is done from within a DOM event handler. For example, the {@link ng.directive:input input}\n   * directive calls it when the value of the input changes and {@link ng.directive:select select}\n   * calls it when an option is selected.\n   *\n   * When `$setViewValue` is called, the new `value` will be staged for committing through the `$parsers`\n   * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged\n   * value is sent directly for processing through the `$parsers` pipeline. After this, the `$validators` and\n   * `$asyncValidators` are called and the value is applied to `$modelValue`.\n   * Finally, the value is set to the **expression** specified in the `ng-model` attribute and\n   * all the registered change listeners, in the `$viewChangeListeners` list are called.\n   *\n   * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`\n   * and the `default` trigger is not listed, all those actions will remain pending until one of the\n   * `updateOn` events is triggered on the DOM element.\n   * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}\n   * directive is used with a custom debounce for this particular event.\n   * Note that a `$digest` is only triggered once the `updateOn` events are fired, or if `debounce`\n   * is specified, once the timer runs out.\n   *\n   * When used with standard inputs, the view value will always be a string (which is in some cases\n   * parsed into another type, such as a `Date` object for `input[date]`.)\n   * However, custom controls might also pass objects to this method. In this case, we should make\n   * a copy of the object before passing it to `$setViewValue`. This is because `ngModel` does not\n   * perform a deep watch of objects, it only looks for a change of identity. If you only change\n   * the property of the object then ngModel will not realize that the object has changed and\n   * will not invoke the `$parsers` and `$validators` pipelines. For this reason, you should\n   * not change properties of the copy once it has been passed to `$setViewValue`.\n   * Otherwise you may cause the model value on the scope to change incorrectly.\n   *\n   * <div class=\"alert alert-info\">\n   * In any case, the value passed to the method should always reflect the current value\n   * of the control. For example, if you are calling `$setViewValue` for an input element,\n   * you should pass the input DOM value. Otherwise, the control and the scope model become\n   * out of sync. It's also important to note that `$setViewValue` does not call `$render` or change\n   * the control's DOM value in any way. If we want to change the control's DOM value\n   * programmatically, we should update the `ngModel` scope expression. Its new value will be\n   * picked up by the model controller, which will run it through the `$formatters`, `$render` it\n   * to update the DOM, and finally call `$validate` on it.\n   * </div>\n   *\n   * @param {*} value value from the view.\n   * @param {string} trigger Event that triggered the update.\n   */\n  $setViewValue: function(value, trigger) {\n    this.$viewValue = value;\n    if (this.$options.getOption('updateOnDefault')) {\n      this.$$debounceViewValueCommit(trigger);\n    }\n  },\n\n  $$debounceViewValueCommit: function(trigger) {\n    var debounceDelay = this.$options.getOption('debounce');\n\n    if (isNumber(debounceDelay[trigger])) {\n      debounceDelay = debounceDelay[trigger];\n    } else if (isNumber(debounceDelay['default']) &&\n      this.$options.getOption('updateOn').indexOf(trigger) === -1\n    ) {\n      debounceDelay = debounceDelay['default'];\n    } else if (isNumber(debounceDelay['*'])) {\n      debounceDelay = debounceDelay['*'];\n    }\n\n    this.$$timeout.cancel(this.$$pendingDebounce);\n    var that = this;\n    if (debounceDelay > 0) { // this fails if debounceDelay is an object\n      this.$$pendingDebounce = this.$$timeout(function() {\n        that.$commitViewValue();\n      }, debounceDelay);\n    } else if (this.$$rootScope.$$phase) {\n      this.$commitViewValue();\n    } else {\n      this.$$scope.$apply(function() {\n        that.$commitViewValue();\n      });\n    }\n  },\n\n  /**\n   * @ngdoc method\n   *\n   * @name ngModel.NgModelController#$overrideModelOptions\n   *\n   * @description\n   *\n   * Override the current model options settings programmatically.\n   *\n   * The previous `ModelOptions` value will not be modified. Instead, a\n   * new `ModelOptions` object will inherit from the previous one overriding\n   * or inheriting settings that are defined in the given parameter.\n   *\n   * See {@link ngModelOptions} for information about what options can be specified\n   * and how model option inheritance works.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** this function only affects the options set on the `ngModelController`,\n   * and not the options on the {@link ngModelOptions} directive from which they might have been\n   * obtained initially.\n   * </div>\n   *\n   * <div class=\"alert alert-danger\">\n   * **Note:** it is not possible to override the `getterSetter` option.\n   * </div>\n   *\n   * @param {Object} options a hash of settings to override the previous options\n   *\n   */\n  $overrideModelOptions: function(options) {\n    this.$options = this.$options.createChild(options);\n    this.$$setUpdateOnEvents();\n  },\n\n  /**\n   * @ngdoc method\n   *\n   * @name  ngModel.NgModelController#$processModelValue\n\n   * @description\n   *\n   * Runs the model -> view pipeline on the current\n   * {@link ngModel.NgModelController#$modelValue $modelValue}.\n   *\n   * The following actions are performed by this method:\n   *\n   * - the `$modelValue` is run through the {@link ngModel.NgModelController#$formatters $formatters}\n   * and the result is set to the {@link ngModel.NgModelController#$viewValue $viewValue}\n   * - the `ng-empty` or `ng-not-empty` class is set on the element\n   * - if the `$viewValue` has changed:\n   *   - {@link ngModel.NgModelController#$render $render} is called on the control\n   *   - the {@link ngModel.NgModelController#$validators $validators} are run and\n   *   the validation status is set.\n   *\n   * This method is called by ngModel internally when the bound scope value changes.\n   * Application developers usually do not have to call this function themselves.\n   *\n   * This function can be used when the `$viewValue` or the rendered DOM value are not correctly\n   * formatted and the `$modelValue` must be run through the `$formatters` again.\n   *\n   * @example\n   * Consider a text input with an autocomplete list (for fruit), where the items are\n   * objects with a name and an id.\n   * A user enters `ap` and then selects `Apricot` from the list.\n   * Based on this, the autocomplete widget will call `$setViewValue({name: 'Apricot', id: 443})`,\n   * but the rendered value will still be `ap`.\n   * The widget can then call `ctrl.$processModelValue()` to run the model -> view\n   * pipeline again, which formats the object to the string `Apricot`,\n   * then updates the `$viewValue`, and finally renders it in the DOM.\n   *\n   * <example module=\"inputExample\" name=\"ng-model-process\">\n     <file name=\"index.html\">\n      <div ng-controller=\"inputController\" style=\"display: flex;\">\n        <div style=\"margin-right: 30px;\">\n          Search Fruit:\n          <basic-autocomplete items=\"items\" on-select=\"selectedFruit = item\"></basic-autocomplete>\n        </div>\n        <div>\n          Model:<br>\n          <pre>{{selectedFruit | json}}</pre>\n        </div>\n      </div>\n     </file>\n     <file name=\"app.js\">\n      angular.module('inputExample', [])\n        .controller('inputController', function($scope) {\n          $scope.items = [\n            {name: 'Apricot', id: 443},\n            {name: 'Clementine', id: 972},\n            {name: 'Durian', id: 169},\n            {name: 'Jackfruit', id: 982},\n            {name: 'Strawberry', id: 863}\n          ];\n        })\n        .component('basicAutocomplete', {\n          bindings: {\n            items: '<',\n            onSelect: '&'\n          },\n          templateUrl: 'autocomplete.html',\n          controller: function($element, $scope) {\n            var that = this;\n            var ngModel;\n\n            that.$postLink = function() {\n              ngModel = $element.find('input').controller('ngModel');\n\n              ngModel.$formatters.push(function(value) {\n                return (value && value.name) || value;\n              });\n\n              ngModel.$parsers.push(function(value) {\n                var match = value;\n                for (var i = 0; i < that.items.length; i++) {\n                  if (that.items[i].name === value) {\n                    match = that.items[i];\n                    break;\n                  }\n                }\n\n                return match;\n              });\n            };\n\n            that.selectItem = function(item) {\n              ngModel.$setViewValue(item);\n              ngModel.$processModelValue();\n              that.onSelect({item: item});\n            };\n          }\n        });\n     </file>\n     <file name=\"autocomplete.html\">\n       <div>\n         <input type=\"search\" ng-model=\"$ctrl.searchTerm\" />\n         <ul>\n           <li ng-repeat=\"item in $ctrl.items | filter:$ctrl.searchTerm\">\n             <button ng-click=\"$ctrl.selectItem(item)\">{{ item.name }}</button>\n           </li>\n         </ul>\n       </div>\n     </file>\n   * </example>\n   *\n   */\n  $processModelValue: function() {\n    var viewValue = this.$$format();\n\n    if (this.$viewValue !== viewValue) {\n      this.$$updateEmptyClasses(viewValue);\n      this.$viewValue = this.$$lastCommittedViewValue = viewValue;\n      this.$render();\n      // It is possible that model and view value have been updated during render\n      this.$$runValidators(this.$modelValue, this.$viewValue, noop);\n    }\n  },\n\n  /**\n   * This method is called internally to run the $formatters on the $modelValue\n   */\n  $$format: function() {\n    var formatters = this.$formatters,\n        idx = formatters.length;\n\n    var viewValue = this.$modelValue;\n    while (idx--) {\n      viewValue = formatters[idx](viewValue);\n    }\n\n    return viewValue;\n  },\n\n  /**\n   * This method is called internally when the bound scope value changes.\n   */\n  $$setModelValue: function(modelValue) {\n    this.$modelValue = this.$$rawModelValue = modelValue;\n    this.$$parserValid = undefined;\n    this.$processModelValue();\n  },\n\n  $$setUpdateOnEvents: function() {\n    if (this.$$updateEvents) {\n      this.$$element.off(this.$$updateEvents, this.$$updateEventHandler);\n    }\n\n    this.$$updateEvents = this.$options.getOption('updateOn');\n    if (this.$$updateEvents) {\n      this.$$element.on(this.$$updateEvents, this.$$updateEventHandler);\n    }\n  },\n\n  $$updateEventHandler: function(ev) {\n    this.$$debounceViewValueCommit(ev && ev.type);\n  }\n};\n\nfunction setupModelWatcher(ctrl) {\n  // model -> value\n  // Note: we cannot use a normal scope.$watch as we want to detect the following:\n  // 1. scope value is 'a'\n  // 2. user enters 'b'\n  // 3. ng-change kicks in and reverts scope value to 'a'\n  //    -> scope value did not change since the last digest as\n  //       ng-change executes in apply phase\n  // 4. view should be changed back to 'a'\n  ctrl.$$scope.$watch(function ngModelWatch(scope) {\n    var modelValue = ctrl.$$ngModelGet(scope);\n\n    // if scope model value and ngModel value are out of sync\n    // This cannot be moved to the action function, because it would not catch the\n    // case where the model is changed in the ngChange function or the model setter\n    if (modelValue !== ctrl.$modelValue &&\n      // checks for NaN is needed to allow setting the model to NaN when there's an asyncValidator\n      // eslint-disable-next-line no-self-compare\n      (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)\n    ) {\n      ctrl.$$setModelValue(modelValue);\n    }\n\n    return modelValue;\n  });\n}\n\n/**\n * @ngdoc method\n * @name ngModel.NgModelController#$setValidity\n *\n * @description\n * Change the validity state, and notify the form.\n *\n * This method can be called within $parsers/$formatters or a custom validation implementation.\n * However, in most cases it should be sufficient to use the `ngModel.$validators` and\n * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically.\n *\n * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned\n *        to either `$error[validationErrorKey]` or `$pending[validationErrorKey]`\n *        (for unfulfilled `$asyncValidators`), so that it is available for data-binding.\n *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\n *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\n *        classes and can be bound to as `{{ someForm.someControl.$error.myError }}`.\n * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),\n *                          or skipped (null). Pending is used for unfulfilled `$asyncValidators`.\n *                          Skipped is used by AngularJS when validators do not run because of parse errors and\n *                          when `$asyncValidators` do not run because any of the `$validators` failed.\n */\naddSetValidityMethod({\n  clazz: NgModelController,\n  set: function(object, property) {\n    object[property] = true;\n  },\n  unset: function(object, property) {\n    delete object[property];\n  }\n});\n\n\n/**\n * @ngdoc directive\n * @name ngModel\n * @restrict A\n * @priority 1\n * @param {expression} ngModel assignable {@link guide/expression Expression} to bind to.\n *\n * @description\n * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a\n * property on the scope using {@link ngModel.NgModelController NgModelController},\n * which is created and exposed by this directive.\n *\n * `ngModel` is responsible for:\n *\n * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`\n *   require.\n * - Providing validation behavior (i.e. required, number, email, url).\n * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors).\n * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`,\n *   `ng-untouched`, `ng-empty`, `ng-not-empty`) including animations.\n * - Registering the control with its parent {@link ng.directive:form form}.\n *\n * Note: `ngModel` will try to bind to the property given by evaluating the expression on the\n * current scope. If the property doesn't already exist on this scope, it will be created\n * implicitly and added to the scope.\n *\n * For best practices on using `ngModel`, see:\n *\n *  - [Understanding Scopes](https://github.com/angular/angular.js/wiki/Understanding-Scopes)\n *\n * For basic examples, how to use `ngModel`, see:\n *\n *  - {@link ng.directive:input input}\n *    - {@link input[text] text}\n *    - {@link input[checkbox] checkbox}\n *    - {@link input[radio] radio}\n *    - {@link input[number] number}\n *    - {@link input[email] email}\n *    - {@link input[url] url}\n *    - {@link input[date] date}\n *    - {@link input[datetime-local] datetime-local}\n *    - {@link input[time] time}\n *    - {@link input[month] month}\n *    - {@link input[week] week}\n *  - {@link ng.directive:select select}\n *  - {@link ng.directive:textarea textarea}\n *\n * ## Complex Models (objects or collections)\n *\n * By default, `ngModel` watches the model by reference, not value. This is important to know when\n * binding inputs to models that are objects (e.g. `Date`) or collections (e.g. arrays). If only properties of the\n * object or collection change, `ngModel` will not be notified and so the input will not be  re-rendered.\n *\n * The model must be assigned an entirely new object or collection before a re-rendering will occur.\n *\n * Some directives have options that will cause them to use a custom `$watchCollection` on the model expression\n * - for example, `ngOptions` will do so when a `track by` clause is included in the comprehension expression or\n * if the select is given the `multiple` attribute.\n *\n * The `$watchCollection()` method only does a shallow comparison, meaning that changing properties deeper than the\n * first level of the object (or only changing the properties of an item in the collection if it's an array) will still\n * not trigger a re-rendering of the model.\n *\n * ## CSS classes\n * The following CSS classes are added and removed on the associated input/select/textarea element\n * depending on the validity of the model.\n *\n *  - `ng-valid`: the model is valid\n *  - `ng-invalid`: the model is invalid\n *  - `ng-valid-[key]`: for each valid key added by `$setValidity`\n *  - `ng-invalid-[key]`: for each invalid key added by `$setValidity`\n *  - `ng-pristine`: the control hasn't been interacted with yet\n *  - `ng-dirty`: the control has been interacted with\n *  - `ng-touched`: the control has been blurred\n *  - `ng-untouched`: the control hasn't been blurred\n *  - `ng-pending`: any `$asyncValidators` are unfulfilled\n *  - `ng-empty`: the view does not contain a value or the value is deemed \"empty\", as defined\n *     by the {@link ngModel.NgModelController#$isEmpty} method\n *  - `ng-not-empty`: the view contains a non-empty value\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n * @animations\n * Animations within models are triggered when any of the associated CSS classes are added and removed\n * on the input element which is attached to the model. These classes include: `.ng-pristine`, `.ng-dirty`,\n * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.\n * The animations that are triggered within ngModel are similar to how they work in ngClass and\n * animations can be hooked into using CSS transitions, keyframes as well as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style an input element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-input {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-input.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n * ### Basic Usage\n * <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"inputExample\" name=\"ng-model\">\n     <file name=\"index.html\">\n       <script>\n        angular.module('inputExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.val = '1';\n          }]);\n       </script>\n       <style>\n         .my-input {\n           transition:all linear 0.5s;\n           background: transparent;\n         }\n         .my-input.ng-invalid {\n           color:white;\n           background: red;\n         }\n       </style>\n       <p id=\"inputDescription\">\n        Update input to see transitions when valid/invalid.\n        Integer is a valid value.\n       </p>\n       <form name=\"testForm\" ng-controller=\"ExampleController\">\n         <input ng-model=\"val\" ng-pattern=\"/^\\d+$/\" name=\"anim\" class=\"my-input\"\n                aria-describedby=\"inputDescription\" />\n       </form>\n     </file>\n * </example>\n *\n * @example\n * ### Binding to a getter/setter\n *\n * Sometimes it's helpful to bind `ngModel` to a getter/setter function.  A getter/setter is a\n * function that returns a representation of the model when called with zero arguments, and sets\n * the internal state of a model when called with an argument. It's sometimes useful to use this\n * for models that have an internal representation that's different from what the model exposes\n * to the view.\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's best to keep getters fast because AngularJS is likely to call them more\n * frequently than other parts of your code.\n * </div>\n *\n * You use this behavior by adding `ng-model-options=\"{ getterSetter: true }\"` to an element that\n * has `ng-model` attached to it. You can also add `ng-model-options=\"{ getterSetter: true }\"` to\n * a `<form>`, which will enable this behavior for all `<input>`s within it. See\n * {@link ng.directive:ngModelOptions `ngModelOptions`} for more.\n *\n * The following example shows how to use `ngModel` with a getter/setter:\n *\n * @example\n * <example name=\"ngModel-getter-setter\" module=\"getterSetterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <form name=\"userForm\">\n           <label>Name:\n             <input type=\"text\" name=\"userName\"\n                    ng-model=\"user.name\"\n                    ng-model-options=\"{ getterSetter: true }\" />\n           </label>\n         </form>\n         <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n       </div>\n     </file>\n     <file name=\"app.js\">\n       angular.module('getterSetterExample', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           var _name = 'Brian';\n           $scope.user = {\n             name: function(newName) {\n              // Note that newName can be undefined for two reasons:\n              // 1. Because it is called as a getter and thus called with no arguments\n              // 2. Because the property should actually be set to undefined. This happens e.g. if the\n              //    input is invalid\n              return arguments.length ? (_name = newName) : _name;\n             }\n           };\n         }]);\n     </file>\n * </example>\n */\nvar ngModelDirective = ['$rootScope', function($rootScope) {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^?form', '^?ngModelOptions'],\n    controller: NgModelController,\n    // Prelink needs to run before any input directive\n    // so that we can set the NgModelOptions in NgModelController\n    // before anyone else uses it.\n    priority: 1,\n    compile: function ngModelCompile(element) {\n      // Setup initial state of the control\n      element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS);\n\n      return {\n        pre: function ngModelPreLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0],\n              formCtrl = ctrls[1] || modelCtrl.$$parentForm,\n              optionsCtrl = ctrls[2];\n\n          if (optionsCtrl) {\n            modelCtrl.$options = optionsCtrl.$options;\n          }\n\n          modelCtrl.$$initGetterSetters();\n\n          // notify others, especially parent forms\n          formCtrl.$addControl(modelCtrl);\n\n          attr.$observe('name', function(newValue) {\n            if (modelCtrl.$name !== newValue) {\n              modelCtrl.$$parentForm.$$renameControl(modelCtrl, newValue);\n            }\n          });\n\n          scope.$on('$destroy', function() {\n            modelCtrl.$$parentForm.$removeControl(modelCtrl);\n          });\n        },\n        post: function ngModelPostLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0];\n          modelCtrl.$$setUpdateOnEvents();\n\n          function setTouched() {\n            modelCtrl.$setTouched();\n          }\n\n          element.on('blur', function() {\n            if (modelCtrl.$touched) return;\n\n            if ($rootScope.$$phase) {\n              scope.$evalAsync(setTouched);\n            } else {\n              scope.$apply(setTouched);\n            }\n          });\n        }\n      };\n    }\n  };\n}];\n\n/* exported defaultModelOptions */\nvar defaultModelOptions;\nvar DEFAULT_REGEXP = /(\\s+|^)default(\\s+|$)/;\n\n/**\n * @ngdoc type\n * @name ModelOptions\n * @description\n * A container for the options set by the {@link ngModelOptions} directive\n */\nfunction ModelOptions(options) {\n  this.$$options = options;\n}\n\nModelOptions.prototype = {\n\n  /**\n   * @ngdoc method\n   * @name ModelOptions#getOption\n   * @param {string} name the name of the option to retrieve\n   * @returns {*} the value of the option\n   * @description\n   * Returns the value of the given option\n   */\n  getOption: function(name) {\n    return this.$$options[name];\n  },\n\n  /**\n   * @ngdoc method\n   * @name ModelOptions#createChild\n   * @param {Object} options a hash of options for the new child that will override the parent's options\n   * @return {ModelOptions} a new `ModelOptions` object initialized with the given options.\n   */\n  createChild: function(options) {\n    var inheritAll = false;\n\n    // make a shallow copy\n    options = extend({}, options);\n\n    // Inherit options from the parent if specified by the value `\"$inherit\"`\n    forEach(options, /** @this */ function(option, key) {\n      if (option === '$inherit') {\n        if (key === '*') {\n          inheritAll = true;\n        } else {\n          options[key] = this.$$options[key];\n          // `updateOn` is special so we must also inherit the `updateOnDefault` option\n          if (key === 'updateOn') {\n            options.updateOnDefault = this.$$options.updateOnDefault;\n          }\n        }\n      } else {\n        if (key === 'updateOn') {\n          // If the `updateOn` property contains the `default` event then we have to remove\n          // it from the event list and set the `updateOnDefault` flag.\n          options.updateOnDefault = false;\n          options[key] = trim(option.replace(DEFAULT_REGEXP, function() {\n            options.updateOnDefault = true;\n            return ' ';\n          }));\n        }\n      }\n    }, this);\n\n    if (inheritAll) {\n      // We have a property of the form: `\"*\": \"$inherit\"`\n      delete options['*'];\n      defaults(options, this.$$options);\n    }\n\n    // Finally add in any missing defaults\n    defaults(options, defaultModelOptions.$$options);\n\n    return new ModelOptions(options);\n  }\n};\n\n\ndefaultModelOptions = new ModelOptions({\n  updateOn: '',\n  updateOnDefault: true,\n  debounce: 0,\n  getterSetter: false,\n  allowInvalid: false,\n  timezone: null\n});\n\n\n/**\n * @ngdoc directive\n * @name ngModelOptions\n * @restrict A\n * @priority 10\n *\n * @description\n * This directive allows you to modify the behaviour of {@link ngModel} directives within your\n * application. You can specify an `ngModelOptions` directive on any element. All {@link ngModel}\n * directives will use the options of their nearest `ngModelOptions` ancestor.\n *\n * The `ngModelOptions` settings are found by evaluating the value of the attribute directive as\n * an AngularJS expression. This expression should evaluate to an object, whose properties contain\n * the settings. For example: `<div ng-model-options=\"{ debounce: 100 }\"`.\n *\n * ## Inheriting Options\n *\n * You can specify that an `ngModelOptions` setting should be inherited from a parent `ngModelOptions`\n * directive by giving it the value of `\"$inherit\"`.\n * Then it will inherit that setting from the first `ngModelOptions` directive found by traversing up the\n * DOM tree. If there is no ancestor element containing an `ngModelOptions` directive then default settings\n * will be used.\n *\n * For example given the following fragment of HTML\n *\n *\n * ```html\n * <div ng-model-options=\"{ allowInvalid: true, debounce: 200 }\">\n *   <form ng-model-options=\"{ updateOn: 'blur', allowInvalid: '$inherit' }\">\n *     <input ng-model-options=\"{ updateOn: 'default', allowInvalid: '$inherit' }\" />\n *   </form>\n * </div>\n * ```\n *\n * the `input` element will have the following settings\n *\n * ```js\n * { allowInvalid: true, updateOn: 'default', debounce: 0 }\n * ```\n *\n * Notice that the `debounce` setting was not inherited and used the default value instead.\n *\n * You can specify that all undefined settings are automatically inherited from an ancestor by\n * including a property with key of `\"*\"` and value of `\"$inherit\"`.\n *\n * For example given the following fragment of HTML\n *\n *\n * ```html\n * <div ng-model-options=\"{ allowInvalid: true, debounce: 200 }\">\n *   <form ng-model-options=\"{ updateOn: 'blur', \"*\": '$inherit' }\">\n *     <input ng-model-options=\"{ updateOn: 'default', \"*\": '$inherit' }\" />\n *   </form>\n * </div>\n * ```\n *\n * the `input` element will have the following settings\n *\n * ```js\n * { allowInvalid: true, updateOn: 'default', debounce: 200 }\n * ```\n *\n * Notice that the `debounce` setting now inherits the value from the outer `<div>` element.\n *\n * If you are creating a reusable component then you should be careful when using `\"*\": \"$inherit\"`\n * since you may inadvertently inherit a setting in the future that changes the behavior of your component.\n *\n *\n * ## Triggering and debouncing model updates\n *\n * The `updateOn` and `debounce` properties allow you to specify a custom list of events that will\n * trigger a model update and/or a debouncing delay so that the actual update only takes place when\n * a timer expires; this timer will be reset after another change takes place.\n *\n * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might\n * be different from the value in the actual model. This means that if you update the model you\n * should also invoke {@link ngModel.NgModelController#$rollbackViewValue} on the relevant input field in\n * order to make sure it is synchronized with the model and that any debounced action is canceled.\n *\n * The easiest way to reference the control's {@link ngModel.NgModelController#$rollbackViewValue}\n * method is by making sure the input is placed inside a form that has a `name` attribute. This is\n * important because `form` controllers are published to the related scope under the name in their\n * `name` attribute.\n *\n * Any pending changes will take place immediately when an enclosing form is submitted via the\n * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * ### Overriding immediate updates\n *\n * The following example shows how to override immediate updates. Changes on the inputs within the\n * form will update the model only when the control loses focus (blur event). If `escape` key is\n * pressed while the input field is focused, the value is reset to the value in the current model.\n *\n * <example name=\"ngModelOptions-directive-blur\" module=\"optionsExample\">\n *   <file name=\"index.html\">\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"userForm\">\n *         <label>\n *           Name:\n *           <input type=\"text\" name=\"userName\"\n *                  ng-model=\"user.name\"\n *                  ng-model-options=\"{ updateOn: 'blur' }\"\n *                  ng-keyup=\"cancel($event)\" />\n *         </label><br />\n *         <label>\n *           Other data:\n *           <input type=\"text\" ng-model=\"user.data\" />\n *         </label><br />\n *       </form>\n *       <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('optionsExample', [])\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         $scope.user = { name: 'say', data: '' };\n *\n *         $scope.cancel = function(e) {\n *           if (e.keyCode === 27) {\n *             $scope.userForm.userName.$rollbackViewValue();\n *           }\n *         };\n *       }]);\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var model = element(by.binding('user.name'));\n *     var input = element(by.model('user.name'));\n *     var other = element(by.model('user.data'));\n *\n *     it('should allow custom events', function() {\n *       input.sendKeys(' hello');\n *       input.click();\n *       expect(model.getText()).toEqual('say');\n *       other.click();\n *       expect(model.getText()).toEqual('say hello');\n *     });\n *\n *     it('should $rollbackViewValue when model changes', function() {\n *       input.sendKeys(' hello');\n *       expect(input.getAttribute('value')).toEqual('say hello');\n *       input.sendKeys(protractor.Key.ESCAPE);\n *       expect(input.getAttribute('value')).toEqual('say');\n *       other.click();\n *       expect(model.getText()).toEqual('say');\n *     });\n *   </file>\n * </example>\n *\n * ### Debouncing updates\n *\n * The next example shows how to debounce model changes. Model will be updated only 1 sec after last change.\n * If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.\n *\n * <example name=\"ngModelOptions-directive-debounce\" module=\"optionsExample\">\n *   <file name=\"index.html\">\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"userForm\">\n *         Name:\n *         <input type=\"text\" name=\"userName\"\n *                ng-model=\"user.name\"\n *                ng-model-options=\"{ debounce: 1000 }\" />\n *         <button ng-click=\"userForm.userName.$rollbackViewValue(); user.name=''\">Clear</button><br />\n *       </form>\n *       <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('optionsExample', [])\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         $scope.user = { name: 'say' };\n *       }]);\n *   </file>\n * </example>\n *\n * ### Default events, extra triggers, and catch-all debounce values\n *\n * This example shows the relationship between \"default\" update events and\n * additional `updateOn` triggers.\n *\n * `default` events are those that are bound to the control, and when fired, update the `$viewValue`\n * via {@link ngModel.NgModelController#$setViewValue $setViewValue}. Every event that is not listed\n * in `updateOn` is considered a \"default\" event, since different control types have different\n * default events.\n *\n * The control in this example updates by \"default\", \"click\", and \"blur\", with different `debounce`\n * values. You can see that \"click\" doesn't have an individual `debounce` value -\n * therefore it uses the `*` debounce value.\n *\n * There is also a button that calls {@link ngModel.NgModelController#$setViewValue $setViewValue}\n * directly with a \"custom\" event. Since \"custom\" is not defined in the `updateOn` list,\n * it is considered a \"default\" event and will update the\n * control if \"default\" is defined in `updateOn`, and will receive the \"default\" debounce value.\n * Note that this is just to illustrate how custom controls would possibly call `$setViewValue`.\n *\n * You can change the `updateOn` and `debounce` configuration to test different scenarios. This\n * is done with {@link ngModel.NgModelController#$overrideModelOptions $overrideModelOptions}.\n *\n  <example name=\"ngModelOptions-advanced\" module=\"optionsExample\">\n    <file name=\"index.html\">\n       <model-update-demo></model-update-demo>\n    </file>\n    <file name=\"app.js\">\n      angular.module('optionsExample', [])\n        .component('modelUpdateDemo', {\n          templateUrl: 'template.html',\n          controller: function() {\n            this.name = 'Chinua';\n\n            this.options = {\n              updateOn: 'default blur click',\n              debounce: {\n                default: 2000,\n                blur: 0,\n                '*': 1000\n              }\n            };\n\n            this.updateEvents = function() {\n              var eventList = this.options.updateOn.split(' ');\n              eventList.push('*');\n              var events = {};\n\n              for (var i = 0; i < eventList.length; i++) {\n                events[eventList[i]] = this.options.debounce[eventList[i]];\n              }\n\n              this.events = events;\n            };\n\n            this.updateOptions = function() {\n              var options = angular.extend(this.options, {\n                updateOn: Object.keys(this.events).join(' ').replace('*', ''),\n                debounce: this.events\n              });\n\n              this.form.input.$overrideModelOptions(options);\n            };\n\n            // Initialize the event form\n            this.updateEvents();\n          }\n        });\n    </file>\n    <file name=\"template.html\">\n      <form name=\"$ctrl.form\">\n        Input: <input type=\"text\" name=\"input\" ng-model=\"$ctrl.name\" ng-model-options=\"$ctrl.options\" />\n      </form>\n      Model: <tt>{{$ctrl.name}}</tt>\n      <hr>\n      <button ng-click=\"$ctrl.form.input.$setViewValue('some value', 'custom')\">Trigger setViewValue with 'some value' and 'custom' event</button>\n\n      <hr>\n      <form ng-submit=\"$ctrl.updateOptions()\">\n        <b>updateOn</b><br>\n        <input type=\"text\" ng-model=\"$ctrl.options.updateOn\" ng-change=\"$ctrl.updateEvents()\" ng-model-options=\"{debounce: 500}\">\n\n        <table>\n          <tr>\n            <th>Option</th>\n            <th>Debounce value</th>\n          </tr>\n          <tr ng-repeat=\"(key, value) in $ctrl.events\">\n            <td>{{key}}</td>\n            <td><input type=\"number\" ng-model=\"$ctrl.events[key]\" /></td>\n          </tr>\n        </table>\n\n        <br>\n        <input type=\"submit\" value=\"Update options\">\n      </form>\n    </file>\n  </example>\n *\n *\n * ## Model updates and validation\n *\n * The default behaviour in `ngModel` is that the model value is set to `undefined` when the\n * validation determines that the value is invalid. By setting the `allowInvalid` property to true,\n * the model will still be updated even if the value is invalid.\n *\n *\n * ## Connecting to the scope\n *\n * By setting the `getterSetter` property to true you are telling ngModel that the `ngModel` expression\n * on the scope refers to a \"getter/setter\" function rather than the value itself.\n *\n * The following example shows how to bind to getter/setters:\n *\n * <example name=\"ngModelOptions-directive-getter-setter\" module=\"getterSetterExample\">\n *   <file name=\"index.html\">\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"userForm\">\n *         <label>\n *           Name:\n *           <input type=\"text\" name=\"userName\"\n *                  ng-model=\"user.name\"\n *                  ng-model-options=\"{ getterSetter: true }\" />\n *         </label>\n *       </form>\n *       <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n *     </div>\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('getterSetterExample', [])\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         var _name = 'Brian';\n *         $scope.user = {\n *           name: function(newName) {\n *             return angular.isDefined(newName) ? (_name = newName) : _name;\n *           }\n *         };\n *       }]);\n *   </file>\n * </example>\n *\n *\n * ## Programmatically changing options\n *\n * The `ngModelOptions` expression is only evaluated once when the directive is linked; it is not\n * watched for changes. However, it is possible to override the options on a single\n * {@link ngModel.NgModelController} instance with\n * {@link ngModel.NgModelController#$overrideModelOptions `NgModelController#$overrideModelOptions()`}.\n * See also the example for\n * {@link ngModelOptions#default-events-extra-triggers-and-catch-all-debounce-values\n * Default events, extra triggers, and catch-all debounce values}.\n *\n *\n * ## Specifying timezones\n *\n * You can specify the timezone that date/time input directives expect by providing its name in the\n * `timezone` property.\n *\n *\n * ## Formatting the value of `time` and `datetime-local`\n *\n * With the options `timeSecondsFormat` and `timeStripZeroSeconds` it is possible to adjust the value\n * that is displayed in the control. Note that browsers may apply their own formatting\n * in the user interface.\n *\n   <example name=\"ngModelOptions-time-format\" module=\"timeExample\">\n     <file name=\"index.html\">\n       <time-example></time-example>\n     </file>\n     <file name=\"script.js\">\n        angular.module('timeExample', [])\n          .component('timeExample', {\n            templateUrl: 'timeExample.html',\n            controller: function() {\n              this.time = new Date(1970, 0, 1, 14, 57, 0);\n\n              this.options = {\n                timeSecondsFormat: 'ss',\n                timeStripZeroSeconds: true\n              };\n\n              this.optionChange = function() {\n                this.timeForm.timeFormatted.$overrideModelOptions(this.options);\n                this.time = new Date(this.time);\n              };\n            }\n          });\n     </file>\n     <file name=\"timeExample.html\">\n       <form name=\"$ctrl.timeForm\">\n         <strong>Default</strong>:\n         <input type=\"time\" ng-model=\"$ctrl.time\" step=\"any\" /><br>\n         <strong>With options</strong>:\n         <input type=\"time\" name=\"timeFormatted\" ng-model=\"$ctrl.time\" step=\"any\" ng-model-options=\"$ctrl.options\" />\n         <br>\n\n         Options:<br>\n         <code>timeSecondsFormat</code>:\n         <input\n           type=\"text\"\n           ng-model=\"$ctrl.options.timeSecondsFormat\"\n           ng-change=\"$ctrl.optionChange()\">\n         <br>\n         <code>timeStripZeroSeconds</code>:\n         <input\n           type=\"checkbox\"\n           ng-model=\"$ctrl.options.timeStripZeroSeconds\"\n           ng-change=\"$ctrl.optionChange()\">\n        </form>\n      </file>\n *  </example>\n *\n * @param {Object} ngModelOptions options to apply to {@link ngModel} directives on this element and\n *   and its descendents.\n *\n * **General options**:\n *\n *   - `updateOn`: string specifying which event should the input be bound to. You can set several\n *     events using an space delimited list. There is a special event called `default` that\n *     matches the default events belonging to the control. These are the events that are bound to\n *     the control, and when fired, update the `$viewValue` via `$setViewValue`.\n *\n *     `ngModelOptions` considers every event that is not listed in `updateOn` a \"default\" event,\n *     since different control types use different default events.\n *\n *     See also the section {@link ngModelOptions#triggering-and-debouncing-model-updates\n *     Triggering and debouncing model updates}.\n *\n *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A\n *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a\n *     custom value for each event. For example:\n *     ```\n *     ng-model-options=\"{\n *       updateOn: 'default blur',\n *       debounce: { 'default': 500, 'blur': 0 }\n *     }\"\n *     ```\n *     You can use the `*` key to specify a debounce value that applies to all events that are not\n *     specifically listed. In the following example, `mouseup` would have a debounce delay of 1000:\n *     ```\n *     ng-model-options=\"{\n *       updateOn: 'default blur mouseup',\n *       debounce: { 'default': 500, 'blur': 0, '*': 1000 }\n *     }\"\n *     ```\n *   - `allowInvalid`: boolean value which indicates that the model can be set with values that did\n *     not validate correctly instead of the default behavior of setting the model to undefined.\n *   - `getterSetter`: boolean value which determines whether or not to treat functions bound to\n *     `ngModel` as getters/setters.\n *\n *\n *  **Input-type specific options**:\n *\n *   - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for\n *     `<input type=\"date\" />`, `<input type=\"time\" />`, ... . It understands UTC/GMT and the\n *     continental US time zone abbreviations, but for general use, use a time zone offset, for\n *     example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)\n *     If not specified, the timezone of the browser will be used.\n *     Note that changing the timezone will have no effect on the current date, and is only applied after\n *     the next input / model change.\n *\n *   - `timeSecondsFormat`: Defines if the `time` and `datetime-local` types should show seconds and\n *     milliseconds. The option follows the format string of {@link date date filter}.\n *     By default, the options is `undefined` which is equal to `'ss.sss'` (seconds and milliseconds).\n *     The other options are `'ss'` (strips milliseconds), and `''` (empty string), which strips both\n *     seconds and milliseconds.\n *     Note that browsers that support `time` and `datetime-local` require the hour and minutes\n *     part of the time string, and may show the value differently in the user interface.\n *     {@link ngModelOptions#formatting-the-value-of-time-and-datetime-local- See the example}.\n *\n *   - `timeStripZeroSeconds`: Defines if the `time` and `datetime-local` types should strip the\n *     seconds and milliseconds from the formatted value if they are zero. This option is applied\n *     after `timeSecondsFormat`.\n *     This option can be used to make the formatting consistent over different browsers, as some\n *     browsers with support for `time` will natively hide the milliseconds and\n *     seconds if they are zero, but others won't, and browsers that don't implement these input\n *     types will always show the full string.\n *     {@link ngModelOptions#formatting-the-value-of-time-and-datetime-local- See the example}.\n *\n */\nvar ngModelOptionsDirective = function() {\n  NgModelOptionsController.$inject = ['$attrs', '$scope'];\n  function NgModelOptionsController($attrs, $scope) {\n    this.$$attrs = $attrs;\n    this.$$scope = $scope;\n  }\n  NgModelOptionsController.prototype = {\n    $onInit: function() {\n      var parentOptions = this.parentCtrl ? this.parentCtrl.$options : defaultModelOptions;\n      var modelOptionsDefinition = this.$$scope.$eval(this.$$attrs.ngModelOptions);\n\n      this.$options = parentOptions.createChild(modelOptionsDefinition);\n    }\n  };\n\n  return {\n    restrict: 'A',\n    // ngModelOptions needs to run before ngModel and input directives\n    priority: 10,\n    require: {parentCtrl: '?^^ngModelOptions'},\n    bindToController: true,\n    controller: NgModelOptionsController\n  };\n};\n\n\n// shallow copy over values from `src` that are not already specified on `dst`\nfunction defaults(dst, src) {\n  forEach(src, function(value, key) {\n    if (!isDefined(dst[key])) {\n      dst[key] = value;\n    }\n  });\n}\n\n/**\n * @ngdoc directive\n * @name ngNonBindable\n * @restrict AC\n * @priority 1000\n * @element ANY\n *\n * @description\n * The `ngNonBindable` directive tells AngularJS not to compile or bind the contents of the current\n * DOM element, including directives on the element itself that have a lower priority than\n * `ngNonBindable`. This is useful if the element contains what appears to be AngularJS directives\n * and bindings but which should be ignored by AngularJS. This could be the case if you have a site\n * that displays snippets of code, for instance.\n *\n * @example\n * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\n * but the one wrapped in `ngNonBindable` is left alone.\n *\n  <example name=\"ng-non-bindable\">\n    <file name=\"index.html\">\n      <div>Normal: {{1 + 2}}</div>\n      <div ng-non-bindable>Ignored: {{1 + 2}}</div>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n     it('should check ng-non-bindable', function() {\n       expect(element(by.binding('1 + 2')).getText()).toContain('3');\n       expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\n     });\n    </file>\n  </example>\n */\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\n\n/* exported ngOptionsDirective */\n\n/* global jqLiteRemove */\n\nvar ngOptionsMinErr = minErr('ngOptions');\n\n/**\n * @ngdoc directive\n * @name ngOptions\n * @restrict A\n *\n * @description\n *\n * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`\n * elements for the `<select>` element using the array or object obtained by evaluating the\n * `ngOptions` comprehension expression.\n *\n * In many cases, {@link ng.directive:ngRepeat ngRepeat} can be used on `<option>` elements instead of\n * `ngOptions` to achieve a similar result. However, `ngOptions` provides some benefits:\n * - more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the\n * comprehension expression\n * - reduced memory consumption by not creating a new scope for each repeated instance\n * - increased render speed by creating the options in a documentFragment instead of individually\n *\n * When an item in the `<select>` menu is selected, the array element or object property\n * represented by the selected option will be bound to the model identified by the `ngModel`\n * directive.\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * ## Complex Models (objects or collections)\n *\n * By default, `ngModel` watches the model by reference, not value. This is important to know when\n * binding the select to a model that is an object or a collection.\n *\n * One issue occurs if you want to preselect an option. For example, if you set\n * the model to an object that is equal to an object in your collection, `ngOptions` won't be able to set the selection,\n * because the objects are not identical. So by default, you should always reference the item in your collection\n * for preselections, e.g.: `$scope.selected = $scope.collection[3]`.\n *\n * Another solution is to use a `track by` clause, because then `ngOptions` will track the identity\n * of the item not by reference, but by the result of the `track by` expression. For example, if your\n * collection items have an id property, you would `track by item.id`.\n *\n * A different issue with objects or collections is that ngModel won't detect if an object property or\n * a collection item changes. For that reason, `ngOptions` additionally watches the model using\n * `$watchCollection`, when the expression contains a `track by` clause or the the select has the `multiple` attribute.\n * This allows ngOptions to trigger a re-rendering of the options even if the actual object/collection\n * has not changed identity, but only a property on the object or an item in the collection changes.\n *\n * Note that `$watchCollection` does a shallow comparison of the properties of the object (or the items in the collection\n * if the model is an array). This means that changing a property deeper than the first level inside the\n * object/collection will not trigger a re-rendering.\n *\n * ## `select` **`as`**\n *\n * Using `select` **`as`** will bind the result of the `select` expression to the model, but\n * the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)\n * or property name (for object data sources) of the value within the collection. If a **`track by`** expression\n * is used, the result of that expression will be set as the value of the `option` and `select` elements.\n *\n *\n * ### `select` **`as`** and **`track by`**\n *\n * <div class=\"alert alert-warning\">\n * Be careful when using `select` **`as`** and **`track by`** in the same expression.\n * </div>\n *\n * Given this array of items on the $scope:\n *\n * ```js\n * $scope.items = [{\n *   id: 1,\n *   label: 'aLabel',\n *   subItem: { name: 'aSubItem' }\n * }, {\n *   id: 2,\n *   label: 'bLabel',\n *   subItem: { name: 'bSubItem' }\n * }];\n * ```\n *\n * This will work:\n *\n * ```html\n * <select ng-options=\"item as item.label for item in items track by item.id\" ng-model=\"selected\"></select>\n * ```\n * ```js\n * $scope.selected = $scope.items[0];\n * ```\n *\n * but this will not work:\n *\n * ```html\n * <select ng-options=\"item.subItem as item.label for item in items track by item.id\" ng-model=\"selected\"></select>\n * ```\n * ```js\n * $scope.selected = $scope.items[0].subItem;\n * ```\n *\n * In both examples, the **`track by`** expression is applied successfully to each `item` in the\n * `items` array. Because the selected option has been set programmatically in the controller, the\n * **`track by`** expression is also applied to the `ngModel` value. In the first example, the\n * `ngModel` value is `items[0]` and the **`track by`** expression evaluates to `items[0].id` with\n * no issue. In the second example, the `ngModel` value is `items[0].subItem` and the **`track by`**\n * expression evaluates to `items[0].subItem.id` (which is undefined). As a result, the model value\n * is not matched against any `<option>` and the `<select>` appears as having no selected value.\n *\n *\n * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n * @param {comprehension_expression} ngOptions in one of the following forms:\n *\n *   * for array data sources:\n *     * `label` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array`\n *     * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *     * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *     * `label` **`for`** `value` **`in`** `array` | orderBy:`orderexpr` **`track by`** `trackexpr`\n *        (for including a filter with `track by`)\n *   * for object data sources:\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `label` **`disable when`** `disable` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`group by`** `group`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`disable when`** `disable`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *\n * Where:\n *\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\n *   * `value`: local variable which will refer to each item in the `array` or each property value\n *      of `object` during iteration.\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\n *   * `label`: The result of this expression will be the label for `<option>` element. The\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\n *      element. If not specified, `select` expression will default to `value`.\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\n *      DOM element.\n *   * `disable`: The result of this expression will be used to disable the rendered `<option>`\n *      element. Return `true` to disable.\n *   * `trackexpr`: Used when working with an array of objects. The result of this expression will be\n *      used to identify the objects in the array. The `trackexpr` will most likely refer to the\n *     `value` variable (e.g. `value.propertyName`). With this the selection is preserved\n *      even when the options are recreated (e.g. reloaded from the server).\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required The control is considered valid only if value is entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {string=} ngAttrSize sets the size of the select element dynamically. Uses the\n * {@link guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes ngAttr} directive.\n *\n * @example\n    <example module=\"selectExample\" name=\"select\">\n      <file name=\"index.html\">\n        <script>\n        angular.module('selectExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.colors = [\n              {name:'black', shade:'dark'},\n              {name:'white', shade:'light', notAnOption: true},\n              {name:'red', shade:'dark'},\n              {name:'blue', shade:'dark', notAnOption: true},\n              {name:'yellow', shade:'light', notAnOption: false}\n            ];\n            $scope.myColor = $scope.colors[2]; // red\n          }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          <ul>\n            <li ng-repeat=\"color in colors\">\n              <label>Name: <input ng-model=\"color.name\"></label>\n              <label><input type=\"checkbox\" ng-model=\"color.notAnOption\"> Disabled?</label>\n              <button ng-click=\"colors.splice($index, 1)\" aria-label=\"Remove\">X</button>\n            </li>\n            <li>\n              <button ng-click=\"colors.push({})\">add</button>\n            </li>\n          </ul>\n          <hr/>\n          <label>Color (null not allowed):\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\"></select>\n          </label><br/>\n          <label>Color (null allowed):\n          <span  class=\"nullable\">\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\">\n              <option value=\"\">-- choose color --</option>\n            </select>\n          </span></label><br/>\n\n          <label>Color grouped by shade:\n            <select ng-model=\"myColor\" ng-options=\"color.name group by color.shade for color in colors\">\n            </select>\n          </label><br/>\n\n          <label>Color grouped by shade, with some disabled:\n            <select ng-model=\"myColor\"\n                  ng-options=\"color.name group by color.shade disable when color.notAnOption for color in colors\">\n            </select>\n          </label><br/>\n\n\n\n          Select <button ng-click=\"myColor = { name:'not in list', shade: 'other' }\">bogus</button>.\n          <br/>\n          <hr/>\n          Currently selected: {{ {selected_color:myColor} }}\n          <div style=\"border:solid 1px black; height:20px\"\n               ng-style=\"{'background-color':myColor.name}\">\n          </div>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n         it('should check ng-options', function() {\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\n           element.all(by.model('myColor')).first().click();\n           element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\n           element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\n           element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\n         });\n      </file>\n    </example>\n */\n\n/* eslint-disable max-len */\n//                     //00001111111111000000000002222222222000000000000000000000333333333300000000000000000000000004444444444400000000000005555555555555000000000666666666666600000007777777777777000000000000000888888888800000000000000000009999999999\nvar NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([$\\w][$\\w]*)|(?:\\(\\s*([$\\w][$\\w]*)\\s*,\\s*([$\\w][$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/;\n                        // 1: value expression (valueFn)\n                        // 2: label expression (displayFn)\n                        // 3: group by expression (groupByFn)\n                        // 4: disable when expression (disableWhenFn)\n                        // 5: array item variable name\n                        // 6: object item key variable name\n                        // 7: object item value variable name\n                        // 8: collection expression\n                        // 9: track by expression\n/* eslint-enable */\n\n\nvar ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, $document, $parse) {\n\n  function parseOptionsExpression(optionsExp, selectElement, scope) {\n\n    var match = optionsExp.match(NG_OPTIONS_REGEXP);\n    if (!(match)) {\n      throw ngOptionsMinErr('iexp',\n        'Expected expression in form of ' +\n        '\\'_select_ (as _label_)? for (_key_,)?_value_ in _collection_\\'' +\n        ' but got \\'{0}\\'. Element: {1}',\n        optionsExp, startingTag(selectElement));\n    }\n\n    // Extract the parts from the ngOptions expression\n\n    // The variable name for the value of the item in the collection\n    var valueName = match[5] || match[7];\n    // The variable name for the key of the item in the collection\n    var keyName = match[6];\n\n    // An expression that generates the viewValue for an option if there is a label expression\n    var selectAs = / as /.test(match[0]) && match[1];\n    // An expression that is used to track the id of each object in the options collection\n    var trackBy = match[9];\n    // An expression that generates the viewValue for an option if there is no label expression\n    var valueFn = $parse(match[2] ? match[1] : valueName);\n    var selectAsFn = selectAs && $parse(selectAs);\n    var viewValueFn = selectAsFn || valueFn;\n    var trackByFn = trackBy && $parse(trackBy);\n\n    // Get the value by which we are going to track the option\n    // if we have a trackFn then use that (passing scope and locals)\n    // otherwise just hash the given viewValue\n    var getTrackByValueFn = trackBy ?\n                              function(value, locals) { return trackByFn(scope, locals); } :\n                              function getHashOfValue(value) { return hashKey(value); };\n    var getTrackByValue = function(value, key) {\n      return getTrackByValueFn(value, getLocals(value, key));\n    };\n\n    var displayFn = $parse(match[2] || match[1]);\n    var groupByFn = $parse(match[3] || '');\n    var disableWhenFn = $parse(match[4] || '');\n    var valuesFn = $parse(match[8]);\n\n    var locals = {};\n    var getLocals = keyName ? function(value, key) {\n      locals[keyName] = key;\n      locals[valueName] = value;\n      return locals;\n    } : function(value) {\n      locals[valueName] = value;\n      return locals;\n    };\n\n\n    function Option(selectValue, viewValue, label, group, disabled) {\n      this.selectValue = selectValue;\n      this.viewValue = viewValue;\n      this.label = label;\n      this.group = group;\n      this.disabled = disabled;\n    }\n\n    function getOptionValuesKeys(optionValues) {\n      var optionValuesKeys;\n\n      if (!keyName && isArrayLike(optionValues)) {\n        optionValuesKeys = optionValues;\n      } else {\n        // if object, extract keys, in enumeration order, unsorted\n        optionValuesKeys = [];\n        for (var itemKey in optionValues) {\n          if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {\n            optionValuesKeys.push(itemKey);\n          }\n        }\n      }\n      return optionValuesKeys;\n    }\n\n    return {\n      trackBy: trackBy,\n      getTrackByValue: getTrackByValue,\n      getWatchables: $parse(valuesFn, function(optionValues) {\n        // Create a collection of things that we would like to watch (watchedArray)\n        // so that they can all be watched using a single $watchCollection\n        // that only runs the handler once if anything changes\n        var watchedArray = [];\n        optionValues = optionValues || [];\n\n        var optionValuesKeys = getOptionValuesKeys(optionValues);\n        var optionValuesLength = optionValuesKeys.length;\n        for (var index = 0; index < optionValuesLength; index++) {\n          var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n          var value = optionValues[key];\n\n          var locals = getLocals(value, key);\n          var selectValue = getTrackByValueFn(value, locals);\n          watchedArray.push(selectValue);\n\n          // Only need to watch the displayFn if there is a specific label expression\n          if (match[2] || match[1]) {\n            var label = displayFn(scope, locals);\n            watchedArray.push(label);\n          }\n\n          // Only need to watch the disableWhenFn if there is a specific disable expression\n          if (match[4]) {\n            var disableWhen = disableWhenFn(scope, locals);\n            watchedArray.push(disableWhen);\n          }\n        }\n        return watchedArray;\n      }),\n\n      getOptions: function() {\n\n        var optionItems = [];\n        var selectValueMap = {};\n\n        // The option values were already computed in the `getWatchables` fn,\n        // which must have been called to trigger `getOptions`\n        var optionValues = valuesFn(scope) || [];\n        var optionValuesKeys = getOptionValuesKeys(optionValues);\n        var optionValuesLength = optionValuesKeys.length;\n\n        for (var index = 0; index < optionValuesLength; index++) {\n          var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n          var value = optionValues[key];\n          var locals = getLocals(value, key);\n          var viewValue = viewValueFn(scope, locals);\n          var selectValue = getTrackByValueFn(viewValue, locals);\n          var label = displayFn(scope, locals);\n          var group = groupByFn(scope, locals);\n          var disabled = disableWhenFn(scope, locals);\n          var optionItem = new Option(selectValue, viewValue, label, group, disabled);\n\n          optionItems.push(optionItem);\n          selectValueMap[selectValue] = optionItem;\n        }\n\n        return {\n          items: optionItems,\n          selectValueMap: selectValueMap,\n          getOptionFromViewValue: function(value) {\n            return selectValueMap[getTrackByValue(value)];\n          },\n          getViewValueFromOption: function(option) {\n            // If the viewValue could be an object that may be mutated by the application,\n            // we need to make a copy and not return the reference to the value on the option.\n            return trackBy ? copy(option.viewValue) : option.viewValue;\n          }\n        };\n      }\n    };\n  }\n\n\n  // Support: IE 9 only\n  // We can't just jqLite('<option>') since jqLite is not smart enough\n  // to create it in <select> and IE barfs otherwise.\n  var optionTemplate = window.document.createElement('option'),\n      optGroupTemplate = window.document.createElement('optgroup');\n\n    function ngOptionsPostLink(scope, selectElement, attr, ctrls) {\n\n      var selectCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n      var multiple = attr.multiple;\n\n      // The emptyOption allows the application developer to provide their own custom \"empty\"\n      // option when the viewValue does not match any of the option values.\n      for (var i = 0, children = selectElement.children(), ii = children.length; i < ii; i++) {\n        if (children[i].value === '') {\n          selectCtrl.hasEmptyOption = true;\n          selectCtrl.emptyOption = children.eq(i);\n          break;\n        }\n      }\n\n      // The empty option will be compiled and rendered before we first generate the options\n      selectElement.empty();\n\n      var providedEmptyOption = !!selectCtrl.emptyOption;\n\n      var unknownOption = jqLite(optionTemplate.cloneNode(false));\n      unknownOption.val('?');\n\n      var options;\n      var ngOptions = parseOptionsExpression(attr.ngOptions, selectElement, scope);\n      // This stores the newly created options before they are appended to the select.\n      // Since the contents are removed from the fragment when it is appended,\n      // we only need to create it once.\n      var listFragment = $document[0].createDocumentFragment();\n\n      // Overwrite the implementation. ngOptions doesn't use hashes\n      selectCtrl.generateUnknownOptionValue = function(val) {\n        return '?';\n      };\n\n      // Update the controller methods for multiple selectable options\n      if (!multiple) {\n\n        selectCtrl.writeValue = function writeNgOptionsValue(value) {\n          // The options might not be defined yet when ngModel tries to render\n          if (!options) return;\n\n          var selectedOption = selectElement[0].options[selectElement[0].selectedIndex];\n          var option = options.getOptionFromViewValue(value);\n\n          // Make sure to remove the selected attribute from the previously selected option\n          // Otherwise, screen readers might get confused\n          if (selectedOption) selectedOption.removeAttribute('selected');\n\n          if (option) {\n            // Don't update the option when it is already selected.\n            // For example, the browser will select the first option by default. In that case,\n            // most properties are set automatically - except the `selected` attribute, which we\n            // set always\n\n            if (selectElement[0].value !== option.selectValue) {\n              selectCtrl.removeUnknownOption();\n\n              selectElement[0].value = option.selectValue;\n              option.element.selected = true;\n            }\n\n            option.element.setAttribute('selected', 'selected');\n          } else {\n            selectCtrl.selectUnknownOrEmptyOption(value);\n          }\n        };\n\n        selectCtrl.readValue = function readNgOptionsValue() {\n\n          var selectedOption = options.selectValueMap[selectElement.val()];\n\n          if (selectedOption && !selectedOption.disabled) {\n            selectCtrl.unselectEmptyOption();\n            selectCtrl.removeUnknownOption();\n            return options.getViewValueFromOption(selectedOption);\n          }\n          return null;\n        };\n\n        // If we are using `track by` then we must watch the tracked value on the model\n        // since ngModel only watches for object identity change\n        // FIXME: When a user selects an option, this watch will fire needlessly\n        if (ngOptions.trackBy) {\n          scope.$watch(\n            function() { return ngOptions.getTrackByValue(ngModelCtrl.$viewValue); },\n            function() { ngModelCtrl.$render(); }\n          );\n        }\n\n      } else {\n\n        selectCtrl.writeValue = function writeNgOptionsMultiple(values) {\n          // The options might not be defined yet when ngModel tries to render\n          if (!options) return;\n\n          // Only set `<option>.selected` if necessary, in order to prevent some browsers from\n          // scrolling to `<option>` elements that are outside the `<select>` element's viewport.\n          var selectedOptions = values && values.map(getAndUpdateSelectedOption) || [];\n\n          options.items.forEach(function(option) {\n            if (option.element.selected && !includes(selectedOptions, option)) {\n              option.element.selected = false;\n            }\n          });\n        };\n\n\n        selectCtrl.readValue = function readNgOptionsMultiple() {\n          var selectedValues = selectElement.val() || [],\n              selections = [];\n\n          forEach(selectedValues, function(value) {\n            var option = options.selectValueMap[value];\n            if (option && !option.disabled) selections.push(options.getViewValueFromOption(option));\n          });\n\n          return selections;\n        };\n\n        // If we are using `track by` then we must watch these tracked values on the model\n        // since ngModel only watches for object identity change\n        if (ngOptions.trackBy) {\n\n          scope.$watchCollection(function() {\n            if (isArray(ngModelCtrl.$viewValue)) {\n              return ngModelCtrl.$viewValue.map(function(value) {\n                return ngOptions.getTrackByValue(value);\n              });\n            }\n          }, function() {\n            ngModelCtrl.$render();\n          });\n\n        }\n      }\n\n      if (providedEmptyOption) {\n\n        // compile the element since there might be bindings in it\n        $compile(selectCtrl.emptyOption)(scope);\n\n        selectElement.prepend(selectCtrl.emptyOption);\n\n        if (selectCtrl.emptyOption[0].nodeType === NODE_TYPE_COMMENT) {\n          // This means the empty option has currently no actual DOM node, probably because\n          // it has been modified by a transclusion directive.\n          selectCtrl.hasEmptyOption = false;\n\n          // Redefine the registerOption function, which will catch\n          // options that are added by ngIf etc. (rendering of the node is async because of\n          // lazy transclusion)\n          selectCtrl.registerOption = function(optionScope, optionEl) {\n            if (optionEl.val() === '') {\n              selectCtrl.hasEmptyOption = true;\n              selectCtrl.emptyOption = optionEl;\n              selectCtrl.emptyOption.removeClass('ng-scope');\n              // This ensures the new empty option is selected if previously no option was selected\n              ngModelCtrl.$render();\n\n              optionEl.on('$destroy', function() {\n                var needsRerender = selectCtrl.$isEmptyOptionSelected();\n\n                selectCtrl.hasEmptyOption = false;\n                selectCtrl.emptyOption = undefined;\n\n                if (needsRerender) ngModelCtrl.$render();\n              });\n            }\n          };\n\n        } else {\n          // remove the class, which is added automatically because we recompile the element and it\n          // becomes the compilation root\n          selectCtrl.emptyOption.removeClass('ng-scope');\n        }\n\n      }\n\n      // We will re-render the option elements if the option values or labels change\n      scope.$watchCollection(ngOptions.getWatchables, updateOptions);\n\n      // ------------------------------------------------------------------ //\n\n      function addOptionElement(option, parent) {\n        var optionElement = optionTemplate.cloneNode(false);\n        parent.appendChild(optionElement);\n        updateOptionElement(option, optionElement);\n      }\n\n      function getAndUpdateSelectedOption(viewValue) {\n        var option = options.getOptionFromViewValue(viewValue);\n        var element = option && option.element;\n\n        if (element && !element.selected) element.selected = true;\n\n        return option;\n      }\n\n      function updateOptionElement(option, element) {\n        option.element = element;\n        element.disabled = option.disabled;\n        // Support: IE 11 only, Edge 12-13 only\n        // NOTE: The label must be set before the value, otherwise IE 11 & Edge create unresponsive\n        // selects in certain circumstances when multiple selects are next to each other and display\n        // the option list in listbox style, i.e. the select is [multiple], or specifies a [size].\n        // See https://github.com/angular/angular.js/issues/11314 for more info.\n        // This is unfortunately untestable with unit / e2e tests\n        if (option.label !== element.label) {\n          element.label = option.label;\n          element.textContent = option.label;\n        }\n        element.value = option.selectValue;\n      }\n\n      function updateOptions() {\n        var previousValue = options && selectCtrl.readValue();\n\n        // We must remove all current options, but cannot simply set innerHTML = null\n        // since the providedEmptyOption might have an ngIf on it that inserts comments which we\n        // must preserve.\n        // Instead, iterate over the current option elements and remove them or their optgroup\n        // parents\n        if (options) {\n\n          for (var i = options.items.length - 1; i >= 0; i--) {\n            var option = options.items[i];\n            if (isDefined(option.group)) {\n              jqLiteRemove(option.element.parentNode);\n            } else {\n              jqLiteRemove(option.element);\n            }\n          }\n        }\n\n        options = ngOptions.getOptions();\n\n        var groupElementMap = {};\n\n        options.items.forEach(function addOption(option) {\n          var groupElement;\n\n          if (isDefined(option.group)) {\n\n            // This option is to live in a group\n            // See if we have already created this group\n            groupElement = groupElementMap[option.group];\n\n            if (!groupElement) {\n\n              groupElement = optGroupTemplate.cloneNode(false);\n              listFragment.appendChild(groupElement);\n\n              // Update the label on the group element\n              // \"null\" is special cased because of Safari\n              groupElement.label = option.group === null ? 'null' : option.group;\n\n              // Store it for use later\n              groupElementMap[option.group] = groupElement;\n            }\n\n            addOptionElement(option, groupElement);\n\n          } else {\n\n            // This option is not in a group\n            addOptionElement(option, listFragment);\n          }\n        });\n\n        selectElement[0].appendChild(listFragment);\n\n        ngModelCtrl.$render();\n\n        // Check to see if the value has changed due to the update to the options\n        if (!ngModelCtrl.$isEmpty(previousValue)) {\n          var nextValue = selectCtrl.readValue();\n          var isNotPrimitive = ngOptions.trackBy || multiple;\n          if (isNotPrimitive ? !equals(previousValue, nextValue) : previousValue !== nextValue) {\n            ngModelCtrl.$setViewValue(nextValue);\n            ngModelCtrl.$render();\n          }\n        }\n      }\n  }\n\n  return {\n    restrict: 'A',\n    terminal: true,\n    require: ['select', 'ngModel'],\n    link: {\n      pre: function ngOptionsPreLink(scope, selectElement, attr, ctrls) {\n        // Deactivate the SelectController.register method to prevent\n        // option directives from accidentally registering themselves\n        // (and unwanted $destroy handlers etc.)\n        ctrls[0].registerOption = noop;\n      },\n      post: ngOptionsPostLink\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngPluralize\n * @restrict EA\n *\n * @description\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\n * These rules are bundled with angular.js, but can be overridden\n * (see {@link guide/i18n AngularJS i18n} dev guide). You configure ngPluralize directive\n * by specifying the mappings between\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * and the strings to be displayed.\n *\n * ## Plural categories and explicit number rules\n * There are two\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * in AngularJS's default en-US locale: \"one\" and \"other\".\n *\n * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\n * any number that is not 1), an explicit number rule can only match one number. For example, the\n * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\n * and explicit number rules throughout the rest of this documentation.\n *\n * ## Configuring ngPluralize\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\n * You can also provide an optional attribute, `offset`.\n *\n * The value of the `count` attribute can be either a string or an {@link guide/expression\n * AngularJS expression}; these are evaluated on the current scope for its bound value.\n *\n * The `when` attribute specifies the mappings between plural categories and the actual\n * string to be displayed. The value of the attribute should be a JSON object.\n *\n * The following example shows how to configure ngPluralize:\n *\n * ```html\n * <ng-pluralize count=\"personCount\"\n                 when=\"{'0': 'Nobody is viewing.',\n *                      'one': '1 person is viewing.',\n *                      'other': '{} people are viewing.'}\">\n * </ng-pluralize>\n *```\n *\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\n * show \"a dozen people are viewing\".\n *\n * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\n * into pluralized strings. In the previous example, AngularJS will replace `{}` with\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\n * for <span ng-non-bindable>{{numberExpression}}</span>.\n *\n * If no rule is defined for a category, then an empty string is displayed and a warning is generated.\n * Note that some locales define more categories than `one` and `other`. For example, fr-fr defines `few` and `many`.\n *\n * ## Configuring ngPluralize with offset\n * The `offset` attribute allows further customization of pluralized text, which can result in\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\n * you might display \"John, Kate and 2 others are viewing this document\".\n * The offset attribute allows you to offset a number by any desired value.\n * Let's take a look at an example:\n *\n * ```html\n * <ng-pluralize count=\"personCount\" offset=2\n *               when=\"{'0': 'Nobody is viewing.',\n *                      '1': '{{person1}} is viewing.',\n *                      '2': '{{person1}} and {{person2}} are viewing.',\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n * </ng-pluralize>\n * ```\n *\n * Notice that we are still using two plural categories(one, other), but we added\n * three explicit number rules 0, 1 and 2.\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\n * When three people view the document, no explicit number rule is found, so\n * an offset of 2 is taken off 3, and AngularJS uses 1 to decide the plural category.\n * In this case, plural category 'one' is matched and \"John, Mary and one other person are viewing\"\n * is shown.\n *\n * Note that when you specify offsets, you must provide explicit number rules for\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\n * plural categories \"one\" and \"other\".\n *\n * @param {string|expression} count The variable to be bound to.\n * @param {string} when The mapping between plural category to its corresponding strings.\n * @param {number=} offset Offset to deduct from the total number.\n *\n * @example\n    <example module=\"pluralizeExample\" name=\"ng-pluralize\">\n      <file name=\"index.html\">\n        <script>\n          angular.module('pluralizeExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.person1 = 'Igor';\n              $scope.person2 = 'Misko';\n              $scope.personCount = 1;\n            }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          <label>Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /></label><br/>\n          <label>Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /></label><br/>\n          <label>Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /></label><br/>\n\n          <!--- Example with simple pluralization rules for en locale --->\n          Without Offset:\n          <ng-pluralize count=\"personCount\"\n                        when=\"{'0': 'Nobody is viewing.',\n                               'one': '1 person is viewing.',\n                               'other': '{} people are viewing.'}\">\n          </ng-pluralize><br>\n\n          <!--- Example with offset --->\n          With Offset(2):\n          <ng-pluralize count=\"personCount\" offset=2\n                        when=\"{'0': 'Nobody is viewing.',\n                               '1': '{{person1}} is viewing.',\n                               '2': '{{person1}} and {{person2}} are viewing.',\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n          </ng-pluralize>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should show correct pluralized string', function() {\n          var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var countInput = element(by.model('personCount'));\n\n          expect(withoutOffset.getText()).toEqual('1 person is viewing.');\n          expect(withOffset.getText()).toEqual('Igor is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('0');\n\n          expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\n          expect(withOffset.getText()).toEqual('Nobody is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('2');\n\n          expect(withoutOffset.getText()).toEqual('2 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('3');\n\n          expect(withoutOffset.getText()).toEqual('3 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('4');\n\n          expect(withoutOffset.getText()).toEqual('4 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\n        });\n        it('should show data-bound names', function() {\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var personCount = element(by.model('personCount'));\n          var person1 = element(by.model('person1'));\n          var person2 = element(by.model('person2'));\n          personCount.clear();\n          personCount.sendKeys('4');\n          person1.clear();\n          person1.sendKeys('Di');\n          person2.clear();\n          person2.sendKeys('Vojta');\n          expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\n        });\n      </file>\n    </example>\n */\nvar ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, $interpolate, $log) {\n  var BRACE = /{}/g,\n      IS_WHEN = /^when(Minus)?(.+)$/;\n\n  return {\n    link: function(scope, element, attr) {\n      var numberExp = attr.count,\n          whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\n          offset = attr.offset || 0,\n          whens = scope.$eval(whenExp) || {},\n          whensExpFns = {},\n          startSymbol = $interpolate.startSymbol(),\n          endSymbol = $interpolate.endSymbol(),\n          braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol,\n          watchRemover = angular.noop,\n          lastCount;\n\n      forEach(attr, function(expression, attributeName) {\n        var tmpMatch = IS_WHEN.exec(attributeName);\n        if (tmpMatch) {\n          var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]);\n          whens[whenKey] = element.attr(attr.$attr[attributeName]);\n        }\n      });\n      forEach(whens, function(expression, key) {\n        whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement));\n\n      });\n\n      scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) {\n        var count = parseFloat(newVal);\n        var countIsNaN = isNumberNaN(count);\n\n        if (!countIsNaN && !(count in whens)) {\n          // If an explicit number rule such as 1, 2, 3... is defined, just use it.\n          // Otherwise, check it against pluralization rules in $locale service.\n          count = $locale.pluralCat(count - offset);\n        }\n\n        // If both `count` and `lastCount` are NaN, we don't need to re-register a watch.\n        // In JS `NaN !== NaN`, so we have to explicitly check.\n        if ((count !== lastCount) && !(countIsNaN && isNumberNaN(lastCount))) {\n          watchRemover();\n          var whenExpFn = whensExpFns[count];\n          if (isUndefined(whenExpFn)) {\n            if (newVal != null) {\n              $log.debug('ngPluralize: no rule defined for \\'' + count + '\\' in ' + whenExp);\n            }\n            watchRemover = noop;\n            updateElementText();\n          } else {\n            watchRemover = scope.$watch(whenExpFn, updateElementText);\n          }\n          lastCount = count;\n        }\n      });\n\n      function updateElementText(newText) {\n        element.text(newText || '');\n      }\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRef\n * @restrict A\n *\n * @description\n * The `ngRef` attribute tells AngularJS to assign the controller of a component (or a directive)\n * to the given property in the current scope. It is also possible to add the jqlite-wrapped DOM\n * element to the scope.\n *\n * If the element with `ngRef` is destroyed `null` is assigned to the property.\n *\n * Note that if you want to assign from a child into the parent scope, you must initialize the\n * target property on the parent scope, otherwise `ngRef` will assign on the child scope.\n * This commonly happens when assigning elements or components wrapped in {@link ngIf} or\n * {@link ngRepeat}. See the second example below.\n *\n *\n * @element ANY\n * @param {string} ngRef property name - A valid AngularJS expression identifier to which the\n *                       controller or jqlite-wrapped DOM element will be bound.\n * @param {string=} ngRefRead read value - The name of a directive (or component) on this element,\n *                            or the special string `$element`. If a name is provided, `ngRef` will\n *                            assign the matching controller. If `$element` is provided, the element\n *                            itself is assigned (even if a controller is available).\n *\n *\n * @example\n * ### Simple toggle\n * This example shows how the controller of the component toggle\n * is reused in the template through the scope to use its logic.\n * <example name=\"ng-ref-component\" module=\"myApp\">\n *   <file name=\"index.html\">\n *     <my-toggle ng-ref=\"myToggle\"></my-toggle>\n *     <button ng-click=\"myToggle.toggle()\">Toggle</button>\n *     <div ng-show=\"myToggle.isOpen()\">\n *       You are using a component in the same template to show it.\n *     </div>\n *   </file>\n *   <file name=\"index.js\">\n *     angular.module('myApp', [])\n *     .component('myToggle', {\n *       controller: function ToggleController() {\n *         var opened = false;\n *         this.isOpen = function() { return opened; };\n *         this.toggle = function() { opened = !opened; };\n *       }\n *     });\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      it('should publish the toggle into the scope', function() {\n *        var toggle = element(by.buttonText('Toggle'));\n *        expect(toggle.evaluate('myToggle.isOpen()')).toEqual(false);\n *        toggle.click();\n *        expect(toggle.evaluate('myToggle.isOpen()')).toEqual(true);\n *      });\n *   </file>\n * </example>\n *\n * @example\n * ### ngRef inside scopes\n * This example shows how `ngRef` works with child scopes. The `ngRepeat`-ed `myWrapper` components\n * are assigned to the scope of `myRoot`, because the `toggles` property has been initialized.\n * The repeated `myToggle` components are published to the child scopes created by `ngRepeat`.\n * `ngIf` behaves similarly - the assignment of `myToggle` happens in the `ngIf` child scope,\n * because the target property has not been initialized on the `myRoot` component controller.\n *\n * <example name=\"ng-ref-scopes\" module=\"myApp\">\n *   <file name=\"index.html\">\n *     <my-root></my-root>\n *   </file>\n *   <file name=\"index.js\">\n *     angular.module('myApp', [])\n *     .component('myRoot', {\n *       templateUrl: 'root.html',\n *       controller: function() {\n *         this.wrappers = []; // initialize the array so that the wrappers are assigned into the parent scope\n *       }\n *     })\n *     .component('myToggle', {\n *       template: '<strong>myToggle</strong><button ng-click=\"$ctrl.toggle()\" ng-transclude></button>',\n *       transclude: true,\n *       controller: function ToggleController() {\n *         var opened = false;\n *         this.isOpen = function() { return opened; };\n *         this.toggle = function() { opened = !opened; };\n *       }\n *     })\n *     .component('myWrapper', {\n *       transclude: true,\n *       template: '<strong>myWrapper</strong>' +\n *         '<div>ngRepeatToggle.isOpen(): {{$ctrl.ngRepeatToggle.isOpen() | json}}</div>' +\n *         '<my-toggle ng-ref=\"$ctrl.ngRepeatToggle\"><ng-transclude></ng-transclude></my-toggle>'\n *     });\n *   </file>\n *   <file name=\"root.html\">\n *     <strong>myRoot</strong>\n *     <my-toggle ng-ref=\"$ctrl.outerToggle\">Outer Toggle</my-toggle>\n *     <div>outerToggle.isOpen(): {{$ctrl.outerToggle.isOpen() | json}}</div>\n *     <div><em>wrappers assigned to root</em><br>\n *     <div ng-repeat=\"wrapper in $ctrl.wrappers\">\n *       wrapper.ngRepeatToggle.isOpen(): {{wrapper.ngRepeatToggle.isOpen() | json}}\n *     </div>\n *\n *     <ul>\n *       <li ng-repeat=\"(index, value) in [1,2,3]\">\n *         <strong>ngRepeat</strong>\n *         <div>outerToggle.isOpen(): {{$ctrl.outerToggle.isOpen() | json}}</div>\n *         <my-wrapper ng-ref=\"$ctrl.wrappers[index]\">ngRepeat Toggle {{$index + 1}}</my-wrapper>\n *       </li>\n *     </ul>\n *\n *     <div>ngIfToggle.isOpen(): {{ngIfToggle.isOpen()}} // This is always undefined because it's\n *       assigned to the child scope created by ngIf.\n *     </div>\n *     <div ng-if=\"true\">\n          <strong>ngIf</strong>\n *        <my-toggle ng-ref=\"ngIfToggle\">ngIf Toggle</my-toggle>\n *        <div>ngIfToggle.isOpen(): {{ngIfToggle.isOpen() | json}}</div>\n *        <div>outerToggle.isOpen(): {{$ctrl.outerToggle.isOpen() | json}}</div>\n *     </div>\n *   </file>\n *   <file name=\"styles.css\">\n *     ul {\n *       list-style: none;\n *       padding-left: 0;\n *     }\n *\n *     li[ng-repeat] {\n *       background: lightgreen;\n *       padding: 8px;\n *       margin: 8px;\n *     }\n *\n *     [ng-if] {\n *       background: lightgrey;\n *       padding: 8px;\n *     }\n *\n *     my-root {\n *       background: lightgoldenrodyellow;\n *       padding: 8px;\n *       display: block;\n *     }\n *\n *     my-wrapper {\n *       background: lightsalmon;\n *       padding: 8px;\n *       display: block;\n *     }\n *\n *     my-toggle {\n *       background: lightblue;\n *       padding: 8px;\n *       display: block;\n *     }\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      var OuterToggle = function() {\n *        this.toggle = function() {\n *          element(by.buttonText('Outer Toggle')).click();\n *        };\n *        this.isOpen = function() {\n *          return element.all(by.binding('outerToggle.isOpen()')).first().getText();\n *        };\n *      };\n *      var NgRepeatToggle = function(i) {\n *        var parent = element.all(by.repeater('(index, value) in [1,2,3]')).get(i - 1);\n *        this.toggle = function() {\n *          element(by.buttonText('ngRepeat Toggle ' + i)).click();\n *        };\n *        this.isOpen = function() {\n *          return parent.element(by.binding('ngRepeatToggle.isOpen() | json')).getText();\n *        };\n *        this.isOuterOpen = function() {\n *          return parent.element(by.binding('outerToggle.isOpen() | json')).getText();\n *        };\n *      };\n *      var NgRepeatToggles = function() {\n *        var toggles = [1,2,3].map(function(i) { return new NgRepeatToggle(i); });\n *        this.forEach = function(fn) {\n *          toggles.forEach(fn);\n *        };\n *        this.isOuterOpen = function(i) {\n *          return toggles[i - 1].isOuterOpen();\n *        };\n *      };\n *      var NgIfToggle = function() {\n *        var parent = element(by.css('[ng-if]'));\n *        this.toggle = function() {\n *          element(by.buttonText('ngIf Toggle')).click();\n *        };\n *        this.isOpen = function() {\n *          return by.binding('ngIfToggle.isOpen() | json').getText();\n *        };\n *        this.isOuterOpen = function() {\n *          return parent.element(by.binding('outerToggle.isOpen() | json')).getText();\n *        };\n *      };\n *\n *      it('should toggle the outer toggle', function() {\n *        var outerToggle = new OuterToggle();\n *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): false');\n *        outerToggle.toggle();\n *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): true');\n *      });\n *\n *      it('should toggle all outer toggles', function() {\n *        var outerToggle = new OuterToggle();\n *        var repeatToggles = new NgRepeatToggles();\n *        var ifToggle = new NgIfToggle();\n *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): false');\n *        expect(repeatToggles.isOuterOpen(1)).toEqual('outerToggle.isOpen(): false');\n *        expect(repeatToggles.isOuterOpen(2)).toEqual('outerToggle.isOpen(): false');\n *        expect(repeatToggles.isOuterOpen(3)).toEqual('outerToggle.isOpen(): false');\n *        expect(ifToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): false');\n *        outerToggle.toggle();\n *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): true');\n *        expect(repeatToggles.isOuterOpen(1)).toEqual('outerToggle.isOpen(): true');\n *        expect(repeatToggles.isOuterOpen(2)).toEqual('outerToggle.isOpen(): true');\n *        expect(repeatToggles.isOuterOpen(3)).toEqual('outerToggle.isOpen(): true');\n *        expect(ifToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): true');\n *      });\n *\n *      it('should toggle each repeat iteration separately', function() {\n *        var repeatToggles = new NgRepeatToggles();\n *\n *        repeatToggles.forEach(function(repeatToggle) {\n *          expect(repeatToggle.isOpen()).toEqual('ngRepeatToggle.isOpen(): false');\n *          expect(repeatToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): false');\n *          repeatToggle.toggle();\n *          expect(repeatToggle.isOpen()).toEqual('ngRepeatToggle.isOpen(): true');\n *          expect(repeatToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): false');\n *        });\n *      });\n *   </file>\n * </example>\n *\n */\n\nvar ngRefMinErr = minErr('ngRef');\n\nvar ngRefDirective = ['$parse', function($parse) {\n  return {\n    priority: -1, // Needed for compatibility with element transclusion on the same element\n    restrict: 'A',\n    compile: function(tElement, tAttrs) {\n      // Get the expected controller name, converts <data-some-thing> into \"someThing\"\n      var controllerName = directiveNormalize(nodeName_(tElement));\n\n      // Get the expression for value binding\n      var getter = $parse(tAttrs.ngRef);\n      var setter = getter.assign || function() {\n        throw ngRefMinErr('nonassign', 'Expression in ngRef=\"{0}\" is non-assignable!', tAttrs.ngRef);\n      };\n\n      return function(scope, element, attrs) {\n        var refValue;\n\n        if (attrs.hasOwnProperty('ngRefRead')) {\n          if (attrs.ngRefRead === '$element') {\n            refValue = element;\n          } else {\n            refValue = element.data('$' + attrs.ngRefRead + 'Controller');\n\n            if (!refValue) {\n              throw ngRefMinErr(\n                'noctrl',\n                'The controller for ngRefRead=\"{0}\" could not be found on ngRef=\"{1}\"',\n                attrs.ngRefRead,\n                tAttrs.ngRef\n              );\n            }\n          }\n        } else {\n          refValue = element.data('$' + controllerName + 'Controller');\n        }\n\n        refValue = refValue || element;\n\n        setter(scope, refValue);\n\n        // when the element is removed, remove it (nullify it)\n        element.on('$destroy', function() {\n          // only remove it if value has not changed,\n          // because animations (and other procedures) may duplicate elements\n          if (getter(scope) === refValue) {\n            setter(scope, null);\n          }\n        });\n      };\n    }\n  };\n}];\n\n/* exported ngRepeatDirective */\n\n/**\n * @ngdoc directive\n * @name ngRepeat\n * @multiElement\n * @restrict A\n *\n * @description\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\n * instance gets its own scope, where the given loop variable is set to the current collection item,\n * and `$index` is set to the item index or key.\n *\n * Special properties are exposed on the local scope of each template instance, including:\n *\n * | Variable  | Type            | Details                                                                     |\n * |-----------|-----------------|-----------------------------------------------------------------------------|\n * | `$index`  | {@type number}  | iterator offset of the repeated element (0..length-1)                       |\n * | `$first`  | {@type boolean} | true if the repeated element is first in the iterator.                      |\n * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\n * | `$last`   | {@type boolean} | true if the repeated element is last in the iterator.                       |\n * | `$even`   | {@type boolean} | true if the iterator position `$index` is even (otherwise false).           |\n * | `$odd`    | {@type boolean} | true if the iterator position `$index` is odd (otherwise false).            |\n *\n * <div class=\"alert alert-info\">\n *   Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\n *   This may be useful when, for instance, nesting ngRepeats.\n * </div>\n *\n *\n * ## Iterating over object properties\n *\n * It is possible to get `ngRepeat` to iterate over the properties of an object using the following\n * syntax:\n *\n * ```js\n * <div ng-repeat=\"(key, value) in myObj\"> ... </div>\n * ```\n *\n * However, there are a few limitations compared to array iteration:\n *\n * - The JavaScript specification does not define the order of keys\n *   returned for an object, so AngularJS relies on the order returned by the browser\n *   when running `for key in myObj`. Browsers generally follow the strategy of providing\n *   keys in the order in which they were defined, although there are exceptions when keys are deleted\n *   and reinstated. See the\n *   [MDN page on `delete` for more info](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Cross-browser_notes).\n *\n * - `ngRepeat` will silently *ignore* object keys starting with `$`, because\n *   it's a prefix used by AngularJS for public (`$`) and private (`$$`) properties.\n *\n * - The built-in filters {@link ng.orderBy orderBy} and {@link ng.filter filter} do not work with\n *   objects, and will throw an error if used with one.\n *\n * If you are hitting any of these limitations, the recommended workaround is to convert your object into an array\n * that is sorted into the order that you prefer before providing it to `ngRepeat`. You could\n * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter)\n * or implement a `$watch` on the object yourself.\n *\n *\n * ## Tracking and Duplicates\n *\n * `ngRepeat` uses {@link $rootScope.Scope#$watchCollection $watchCollection} to detect changes in\n * the collection. When a change happens, `ngRepeat` then makes the corresponding changes to the DOM:\n *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n *\n * To minimize creation of DOM elements, `ngRepeat` uses a function\n * to \"keep track\" of all items in the collection and their corresponding DOM elements.\n * For example, if an item is added to the collection, `ngRepeat` will know that all other items\n * already have DOM elements, and will not re-render them.\n *\n * All different types of tracking functions, their syntax, and their support for duplicate\n * items in collections can be found in the\n * {@link ngRepeat#ngRepeat-arguments ngRepeat expression description}.\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** If you are working with objects that have a unique identifier property, you\n * should track by this identifier instead of the object instance,\n * e.g. `item in items track by item.id`.\n * Should you reload your data later, `ngRepeat` will not have to rebuild the DOM elements for items\n * it has already rendered, even if the JavaScript objects in the collection have been substituted\n * for new ones. For large collections, this significantly improves rendering performance.\n * </div>\n *\n * ### Effects of DOM Element re-use\n *\n * When DOM elements are re-used, ngRepeat updates the scope for the element, which will\n * automatically update any active bindings on the template. However, other\n * functionality will not be updated, because the element is not re-created:\n *\n * - Directives are not re-compiled\n * - {@link guide/expression#one-time-binding one-time expressions} on the repeated template are not\n * updated if they have stabilized.\n *\n * The above affects all kinds of element re-use due to tracking, but may be especially visible\n * when tracking by `$index` due to the way ngRepeat re-uses elements.\n *\n * The following example shows the effects of different actions with tracking:\n\n  <example module=\"ngRepeat\" name=\"ngRepeat-tracking\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"script.js\">\n      angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) {\n        var friends = [\n          {name:'John', age:25},\n          {name:'Mary', age:40},\n          {name:'Peter', age:85}\n        ];\n\n        $scope.removeFirst = function() {\n          $scope.friends.shift();\n        };\n\n        $scope.updateAge = function() {\n          $scope.friends.forEach(function(el) {\n            el.age = el.age + 5;\n          });\n        };\n\n        $scope.copy = function() {\n          $scope.friends = angular.copy($scope.friends);\n        };\n\n        $scope.reset = function() {\n          $scope.friends = angular.copy(friends);\n        };\n\n        $scope.reset();\n      });\n    </file>\n    <file name=\"index.html\">\n      <div ng-controller=\"repeatController\">\n        <ol>\n          <li>When you click \"Update Age\", only the first list updates the age, because all others have\n          a one-time binding on the age property. If you then click \"Copy\", the current friend list\n          is copied, and now the second list updates the age, because the identity of the collection items\n          has changed and the list must be re-rendered. The 3rd and 4th list stay the same, because all the\n          items are already known according to their tracking functions.\n          </li>\n          <li>When you click \"Remove First\", the 4th list has the wrong age on both remaining items. This is\n          due to tracking by $index: when the first collection item is removed, ngRepeat reuses the first\n          DOM element for the new first collection item, and so on. Since the age property is one-time\n          bound, the value remains from the collection item which was previously at this index.\n          </li>\n        </ol>\n\n        <button ng-click=\"removeFirst()\">Remove First</button>\n        <button ng-click=\"updateAge()\">Update Age</button>\n        <button ng-click=\"copy()\">Copy</button>\n        <br><button ng-click=\"reset()\">Reset List</button>\n        <br>\n        <code>track by $id(friend)</code> (default):\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends\">\n            {{friend.name}} is {{friend.age}} years old.\n          </li>\n        </ul>\n        <code>track by $id(friend)</code> (default), with age one-time binding:\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends\">\n            {{friend.name}} is {{::friend.age}} years old.\n          </li>\n        </ul>\n        <code>track by friend.name</code>, with age one-time binding:\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends track by friend.name\">\n            {{friend.name}}  is {{::friend.age}} years old.\n          </li>\n        </ul>\n        <code>track by $index</code>, with age one-time binding:\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends track by $index\">\n            {{friend.name}} is {{::friend.age}} years old.\n          </li>\n        </ul>\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .example-animate-container {\n        background:white;\n        border:1px solid black;\n        list-style:none;\n        margin:0;\n        padding:0 10px;\n      }\n\n      .animate-repeat {\n        line-height:30px;\n        list-style:none;\n        box-sizing:border-box;\n      }\n\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter,\n      .animate-repeat.ng-leave {\n        transition:all linear 0.5s;\n      }\n\n      .animate-repeat.ng-leave.ng-leave-active,\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter {\n        opacity:0;\n        max-height:0;\n      }\n\n      .animate-repeat.ng-leave,\n      .animate-repeat.ng-move.ng-move-active,\n      .animate-repeat.ng-enter.ng-enter-active {\n        opacity:1;\n        max-height:30px;\n      }\n    </file>\n  </example>\n\n *\n * ## Special repeat start and end points\n * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\n * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\n * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\n * up to and including the ending HTML tag where **ng-repeat-end** is placed.\n *\n * The example below makes use of this feature:\n * ```html\n *   <header ng-repeat-start=\"item in items\">\n *     Header {{ item }}\n *   </header>\n *   <div class=\"body\">\n *     Body {{ item }}\n *   </div>\n *   <footer ng-repeat-end>\n *     Footer {{ item }}\n *   </footer>\n * ```\n *\n * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\n * ```html\n *   <header>\n *     Header A\n *   </header>\n *   <div class=\"body\">\n *     Body A\n *   </div>\n *   <footer>\n *     Footer A\n *   </footer>\n *   <header>\n *     Header B\n *   </header>\n *   <div class=\"body\">\n *     Body B\n *   </div>\n *   <footer>\n *     Footer B\n *   </footer>\n * ```\n *\n * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\n * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter} | when a new item is added to the list or when an item is revealed after a filter |\n * | {@link ng.$animate#leave leave} | when an item is removed from the list or when an item is filtered out |\n * | {@link ng.$animate#move move } | when an adjacent item is filtered out causing a reorder or when the item contents are reordered |\n *\n * See the example below for defining CSS animations with ngRepeat.\n *\n * @element ANY\n * @scope\n * @priority 1000\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\n *   formats are currently supported:\n *\n *   * `variable in expression` – where variable is the user defined loop variable and `expression`\n *     is a scope expression giving the collection to enumerate.\n *\n *     For example: `album in artist.albums`.\n *\n *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\n *     and `expression` is the scope expression giving the collection to enumerate.\n *\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\n *\n *   * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression\n *     which can be used to associate the objects in the collection with the DOM elements. If no tracking expression\n *     is specified, ng-repeat associates elements by identity. It is an error to have\n *     more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are\n *     mapped to the same DOM element, which is not possible.)\n *\n *     *Default tracking: $id()*: `item in items` is equivalent to `item in items track by $id(item)`.\n *     This implies that the DOM elements will be associated by item identity in the collection.\n *\n *     The built-in `$id()` function can be used to assign a unique\n *     `$$hashKey` property to each item in the collection. This property is then used as a key to associated DOM elements\n *     with the corresponding item in the collection by identity. Moving the same object would move\n *     the DOM element in the same way in the DOM.\n *     Note that the default id function does not support duplicate primitive values (`number`, `string`),\n *     but supports duplictae non-primitive values (`object`) that are *equal* in shape.\n *\n *     *Custom Expression*: It is possible to use any AngularJS expression to compute the tracking\n *     id, for example with a function, or using a property on the collection items.\n *     `item in items track by item.id` is a typical pattern when the items have a unique identifier,\n *     e.g. database id. In this case the object identity does not matter. Two objects are considered\n *     equivalent as long as their `id` property is same.\n *     Tracking by unique identifier is the most performant way and should be used whenever possible.\n *\n *     *$index*: This special property tracks the collection items by their index, and\n *     re-uses the DOM elements that match that index, e.g. `item in items track by $index`. This can\n *     be used for a performance improvement if no unique identfier is available and the identity of\n *     the collection items cannot be easily computed. It also allows duplicates.\n *\n *     <div class=\"alert alert-warning\">\n *       <strong>Note:</strong> Re-using DOM elements can have unforeseen effects. Read the\n *       {@link ngRepeat#tracking-and-duplicates section on tracking and duplicates} for\n *       more info.\n *     </div>\n *\n *     <div class=\"alert alert-warning\">\n *       <strong>Note:</strong> the `track by` expression must come last - after any filters, and the alias expression:\n *       `item in items | filter:searchText as results  track by item.id`\n *     </div>\n *\n *   * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the\n *     intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message\n *     when a filter is active on the repeater, but the filtered result set is empty.\n *\n *     For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after\n *     the items have been processed through the filter.\n *\n *     Please note that `as [variable name] is not an operator but rather a part of ngRepeat\n *     micro-syntax so it can be used only after all filters (and not as operator, inside an expression).\n *\n *     For example: `item in items | filter : x | orderBy : order | limitTo : limit as results track by item.id` .\n *\n * @example\n * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed\n * results by name or by age. New (entering) and removed (leaving) items are animated.\n  <example module=\"ngRepeat\" name=\"ngRepeat\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-controller=\"repeatController\">\n        I have {{friends.length}} friends. They are:\n        <input type=\"search\" ng-model=\"q\" placeholder=\"filter friends...\" aria-label=\"filter friends\" />\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends | filter:q as results track by friend.name\">\n            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\n          </li>\n          <li class=\"animate-repeat\" ng-if=\"results.length === 0\">\n            <strong>No results found...</strong>\n          </li>\n        </ul>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) {\n        $scope.friends = [\n          {name:'John', age:25, gender:'boy'},\n          {name:'Jessie', age:30, gender:'girl'},\n          {name:'Johanna', age:28, gender:'girl'},\n          {name:'Joy', age:15, gender:'girl'},\n          {name:'Mary', age:28, gender:'girl'},\n          {name:'Peter', age:95, gender:'boy'},\n          {name:'Sebastian', age:50, gender:'boy'},\n          {name:'Erika', age:27, gender:'girl'},\n          {name:'Patrick', age:40, gender:'boy'},\n          {name:'Samantha', age:60, gender:'girl'}\n        ];\n      });\n    </file>\n    <file name=\"animations.css\">\n      .example-animate-container {\n        background:white;\n        border:1px solid black;\n        list-style:none;\n        margin:0;\n        padding:0 10px;\n      }\n\n      .animate-repeat {\n        line-height:30px;\n        list-style:none;\n        box-sizing:border-box;\n      }\n\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter,\n      .animate-repeat.ng-leave {\n        transition:all linear 0.5s;\n      }\n\n      .animate-repeat.ng-leave.ng-leave-active,\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter {\n        opacity:0;\n        max-height:0;\n      }\n\n      .animate-repeat.ng-leave,\n      .animate-repeat.ng-move.ng-move-active,\n      .animate-repeat.ng-enter.ng-enter-active {\n        opacity:1;\n        max-height:30px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var friends = element.all(by.repeater('friend in friends'));\n\n      it('should render initial data set', function() {\n        expect(friends.count()).toBe(10);\n        expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\n        expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\n        expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\n        expect(element(by.binding('friends.length')).getText())\n            .toMatch(\"I have 10 friends. They are:\");\n      });\n\n       it('should update repeater when filter predicate changes', function() {\n         expect(friends.count()).toBe(10);\n\n         element(by.model('q')).sendKeys('ma');\n\n         expect(friends.count()).toBe(2);\n         expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\n         expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\n       });\n      </file>\n    </example>\n */\nvar ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $animate, $compile) {\n  var NG_REMOVED = '$$NG_REMOVED';\n  var ngRepeatMinErr = minErr('ngRepeat');\n\n  var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) {\n    // TODO(perf): generate setters to shave off ~40ms or 1-1.5%\n    scope[valueIdentifier] = value;\n    if (keyIdentifier) scope[keyIdentifier] = key;\n    scope.$index = index;\n    scope.$first = (index === 0);\n    scope.$last = (index === (arrayLength - 1));\n    scope.$middle = !(scope.$first || scope.$last);\n    // eslint-disable-next-line no-bitwise\n    scope.$odd = !(scope.$even = (index & 1) === 0);\n  };\n\n  var getBlockStart = function(block) {\n    return block.clone[0];\n  };\n\n  var getBlockEnd = function(block) {\n    return block.clone[block.clone.length - 1];\n  };\n\n  var trackByIdArrayFn = function($scope, key, value) {\n    return hashKey(value);\n  };\n\n  var trackByIdObjFn = function($scope, key) {\n    return key;\n  };\n\n  return {\n    restrict: 'A',\n    multiElement: true,\n    transclude: 'element',\n    priority: 1000,\n    terminal: true,\n    $$tlb: true,\n    compile: function ngRepeatCompile($element, $attr) {\n      var expression = $attr.ngRepeat;\n      var ngRepeatEndComment = $compile.$$createComment('end ngRepeat', expression);\n\n      var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iexp', 'Expected expression in form of \\'_item_ in _collection_[ track by _id_]\\' but got \\'{0}\\'.',\n            expression);\n      }\n\n      var lhs = match[1];\n      var rhs = match[2];\n      var aliasAs = match[3];\n      var trackByExp = match[4];\n\n      match = lhs.match(/^(?:(\\s*[$\\w]+)|\\(\\s*([$\\w]+)\\s*,\\s*([$\\w]+)\\s*\\))$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iidexp', '\\'_item_\\' in \\'_item_ in _collection_\\' should be an identifier or \\'(_key_, _value_)\\' expression, but got \\'{0}\\'.',\n            lhs);\n      }\n      var valueIdentifier = match[3] || match[1];\n      var keyIdentifier = match[2];\n\n      if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) ||\n          /^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(aliasAs))) {\n        throw ngRepeatMinErr('badident', 'alias \\'{0}\\' is invalid --- must be a valid JS identifier which is not a reserved name.',\n          aliasAs);\n      }\n\n      var trackByIdExpFn;\n\n      if (trackByExp) {\n        var hashFnLocals = {$id: hashKey};\n        var trackByExpGetter = $parse(trackByExp);\n\n        trackByIdExpFn = function($scope, key, value, index) {\n          // assign key, value, and $index to the locals so that they can be used in hash functions\n          if (keyIdentifier) hashFnLocals[keyIdentifier] = key;\n          hashFnLocals[valueIdentifier] = value;\n          hashFnLocals.$index = index;\n          return trackByExpGetter($scope, hashFnLocals);\n        };\n      }\n\n      return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {\n\n        // Store a list of elements from previous run. This is a hash where key is the item from the\n        // iterator, and the value is objects with following properties.\n        //   - scope: bound scope\n        //   - clone: previous element.\n        //   - index: position\n        //\n        // We are using no-proto object so that we don't need to guard against inherited props via\n        // hasOwnProperty.\n        var lastBlockMap = createMap();\n\n        //watch props\n        $scope.$watchCollection(rhs, function ngRepeatAction(collection) {\n          var index, length,\n              previousNode = $element[0],     // node that cloned nodes should be inserted after\n                                              // initialized to the comment node anchor\n              nextNode,\n              // Same as lastBlockMap but it has the current state. It will become the\n              // lastBlockMap on the next iteration.\n              nextBlockMap = createMap(),\n              collectionLength,\n              key, value, // key/value of iteration\n              trackById,\n              trackByIdFn,\n              collectionKeys,\n              block,       // last object information {scope, element, id}\n              nextBlockOrder,\n              elementsToRemove;\n\n          if (aliasAs) {\n            $scope[aliasAs] = collection;\n          }\n\n          if (isArrayLike(collection)) {\n            collectionKeys = collection;\n            trackByIdFn = trackByIdExpFn || trackByIdArrayFn;\n          } else {\n            trackByIdFn = trackByIdExpFn || trackByIdObjFn;\n            // if object, extract keys, in enumeration order, unsorted\n            collectionKeys = [];\n            for (var itemKey in collection) {\n              if (hasOwnProperty.call(collection, itemKey) && itemKey.charAt(0) !== '$') {\n                collectionKeys.push(itemKey);\n              }\n            }\n          }\n\n          collectionLength = collectionKeys.length;\n          nextBlockOrder = new Array(collectionLength);\n\n          // locate existing items\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            trackById = trackByIdFn($scope, key, value, index);\n            if (lastBlockMap[trackById]) {\n              // found previously seen block\n              block = lastBlockMap[trackById];\n              delete lastBlockMap[trackById];\n              nextBlockMap[trackById] = block;\n              nextBlockOrder[index] = block;\n            } else if (nextBlockMap[trackById]) {\n              // if collision detected. restore lastBlockMap and throw an error\n              forEach(nextBlockOrder, function(block) {\n                if (block && block.scope) lastBlockMap[block.id] = block;\n              });\n              throw ngRepeatMinErr('dupes',\n                  'Duplicates in a repeater are not allowed. Use \\'track by\\' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}',\n                  expression, trackById, value);\n            } else {\n              // new never before seen block\n              nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};\n              nextBlockMap[trackById] = true;\n            }\n          }\n\n          // Clear the value property from the hashFnLocals object to prevent a reference to the last value\n          // being leaked into the ngRepeatCompile function scope\n          if (hashFnLocals) {\n            hashFnLocals[valueIdentifier] = undefined;\n          }\n\n          // remove leftover items\n          for (var blockKey in lastBlockMap) {\n            block = lastBlockMap[blockKey];\n            elementsToRemove = getBlockNodes(block.clone);\n            $animate.leave(elementsToRemove);\n            if (elementsToRemove[0].parentNode) {\n              // if the element was not removed yet because of pending animation, mark it as deleted\n              // so that we can ignore it later\n              for (index = 0, length = elementsToRemove.length; index < length; index++) {\n                elementsToRemove[index][NG_REMOVED] = true;\n              }\n            }\n            block.scope.$destroy();\n          }\n\n          // we are not using forEach for perf reasons (trying to avoid #call)\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            block = nextBlockOrder[index];\n\n            if (block.scope) {\n              // if we have already seen this object, then we need to reuse the\n              // associated scope/element\n\n              nextNode = previousNode;\n\n              // skip nodes that are already pending removal via leave animation\n              do {\n                nextNode = nextNode.nextSibling;\n              } while (nextNode && nextNode[NG_REMOVED]);\n\n              if (getBlockStart(block) !== nextNode) {\n                // existing item which got moved\n                $animate.move(getBlockNodes(block.clone), null, previousNode);\n              }\n              previousNode = getBlockEnd(block);\n              updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n            } else {\n              // new item which we don't know about\n              $transclude(function ngRepeatTransclude(clone, scope) {\n                block.scope = scope;\n                // http://jsperf.com/clone-vs-createcomment\n                var endNode = ngRepeatEndComment.cloneNode(false);\n                clone[clone.length++] = endNode;\n\n                $animate.enter(clone, null, previousNode);\n                previousNode = endNode;\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block.clone = clone;\n                nextBlockMap[block.id] = block;\n                updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n              });\n            }\n          }\n          lastBlockMap = nextBlockMap;\n        });\n      };\n    }\n  };\n}];\n\nvar NG_HIDE_CLASS = 'ng-hide';\nvar NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n/**\n * @ngdoc directive\n * @name ngShow\n * @multiElement\n *\n * @description\n * The `ngShow` directive shows or hides the given HTML element based on the expression provided to\n * the `ngShow` attribute.\n *\n * The element is shown or hidden by removing or adding the `.ng-hide` CSS class onto the element.\n * The `.ng-hide` CSS class is predefined in AngularJS and sets the display style to none (using an\n * `!important` flag). For CSP mode please add `angular-csp.css` to your HTML file (see\n * {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is visible) -->\n * <div ng-show=\"myValue\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is hidden) -->\n * <div ng-show=\"myValue\" class=\"ng-hide\"></div>\n * ```\n *\n * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added\n * to the class attribute on the element causing it to become hidden. When truthy, the `.ng-hide`\n * CSS class is removed from the element causing the element not to appear hidden.\n *\n * ## Why is `!important` used?\n *\n * You may be wondering why `!important` is used for the `.ng-hide` CSS class. This is because the\n * `.ng-hide` selector can be easily overridden by heavier selectors. For example, something as\n * simple as changing the display style on a HTML list item would make hidden elements appear\n * visible. This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using `!important`, the show and hide behavior will work as expected despite any clash between\n * CSS selector specificity (when `!important` isn't used with any conflicting styles). If a\n * developer chooses to override the styling to change how to hide an element then it is just a\n * matter of using `!important` in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none !important`. If you\n * wish to change the hide behavior with `ngShow`/`ngHide`, you can simply overwrite the styles for\n * the `.ng-hide` CSS class. Note that the selector that needs to be used is actually\n * `.ng-hide:not(.ng-hide-animate)` to cope with extra animation classes that can be added.\n *\n * ```css\n * .ng-hide:not(.ng-hide-animate) {\n *   /&#42; These are just alternative ways of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override anything in CSS and the animations will work around the\n * display style.\n *\n * @animations\n * | Animation                                           | Occurs                                                                                                        |\n * |-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden. |\n * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngShow` expression evaluates to a truthy value and just before contents are set to visible.        |\n *\n * Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the\n * directive expression is true and false. This system works like the animation system present with\n * `ngClass` except that you must also include the `!important` flag to override the display\n * property so that the elements are not actually hidden during the animation.\n *\n * ```css\n * /&#42; A working example can be found at the bottom of this page. &#42;/\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition: all 0.5s linear;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property\n * to block during animation states - ngAnimate will automatically handle the style toggling for you.\n *\n * @element ANY\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy/falsy then the\n *                            element is shown/hidden respectively.\n *\n * @example\n * A simple example, animating the element's opacity:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-show-simple\">\n    <file name=\"index.html\">\n      Show: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngShow\"><br />\n      <div class=\"check-element animate-show-hide\" ng-show=\"checked\">\n        I show up when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .animate-show-hide.ng-hide {\n        opacity: 0;\n      }\n\n      .animate-show-hide.ng-hide-add,\n      .animate-show-hide.ng-hide-remove {\n        transition: all linear 0.5s;\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngShow', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(false);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(true);\n      });\n    </file>\n  </example>\n *\n * <hr />\n * @example\n * A more complex example, featuring different show/hide animations:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-show-complex\">\n    <file name=\"index.html\">\n      Show: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngShow\"><br />\n      <div class=\"check-element funky-show-hide\" ng-show=\"checked\">\n        I show up when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      body {\n        overflow: hidden;\n        perspective: 1000px;\n      }\n\n      .funky-show-hide.ng-hide-add {\n        transform: rotateZ(0);\n        transform-origin: right;\n        transition: all 0.5s ease-in-out;\n      }\n\n      .funky-show-hide.ng-hide-add.ng-hide-add-active {\n        transform: rotateZ(-135deg);\n      }\n\n      .funky-show-hide.ng-hide-remove {\n        transform: rotateY(90deg);\n        transform-origin: left;\n        transition: all 0.5s ease;\n      }\n\n      .funky-show-hide.ng-hide-remove.ng-hide-remove-active {\n        transform: rotateY(0);\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngShow', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(false);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(true);\n      });\n    </file>\n  </example>\n *\n * @knownIssue\n *\n * ### Flickering when using ngShow to toggle between elements\n *\n * When using {@link ngShow} and / or {@link ngHide} to toggle between elements, it can\n * happen that both the element to show and the element to hide are visible for a very short time.\n *\n * This usually happens when the {@link ngAnimate ngAnimate module} is included, but no actual animations\n * are defined for {@link ngShow} / {@link ngHide}. Internet Explorer is affected more often than\n * other browsers.\n *\n * There are several way to mitigate this problem:\n *\n * - {@link guide/animations#how-to-selectively-enable-disable-and-skip-animations Disable animations on the affected elements}.\n * - Use {@link ngIf} or {@link ngSwitch} instead of {@link ngShow} / {@link ngHide}.\n * - Use the special CSS selector `ng-hide.ng-hide-animate` to set `{display: none}` or similar on the affected elements.\n * - Use `ng-class=\"{'ng-hide': expression}` instead of instead of {@link ngShow} / {@link ngHide}.\n * - Define an animation on the affected elements.\n */\nvar ngShowDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngShow, function ngShowWatchAction(value) {\n        // we're adding a temporary, animation-specific class for ng-hide since this way\n        // we can control when the element is actually displayed on screen without having\n        // to have a global/greedy CSS selector that breaks when other animations are run.\n        // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845\n        $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngHide\n * @multiElement\n *\n * @description\n * The `ngHide` directive shows or hides the given HTML element based on the expression provided to\n * the `ngHide` attribute.\n *\n * The element is shown or hidden by removing or adding the `.ng-hide` CSS class onto the element.\n * The `.ng-hide` CSS class is predefined in AngularJS and sets the display style to none (using an\n * `!important` flag). For CSP mode please add `angular-csp.css` to your HTML file (see\n * {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is hidden) -->\n * <div ng-hide=\"myValue\" class=\"ng-hide\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is visible) -->\n * <div ng-hide=\"myValue\"></div>\n * ```\n *\n * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added\n * to the class attribute on the element causing it to become hidden. When falsy, the `.ng-hide`\n * CSS class is removed from the element causing the element not to appear hidden.\n *\n * ## Why is `!important` used?\n *\n * You may be wondering why `!important` is used for the `.ng-hide` CSS class. This is because the\n * `.ng-hide` selector can be easily overridden by heavier selectors. For example, something as\n * simple as changing the display style on a HTML list item would make hidden elements appear\n * visible. This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using `!important`, the show and hide behavior will work as expected despite any clash between\n * CSS selector specificity (when `!important` isn't used with any conflicting styles). If a\n * developer chooses to override the styling to change how to hide an element then it is just a\n * matter of using `!important` in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none !important`. If you\n * wish to change the hide behavior with `ngShow`/`ngHide`, you can simply overwrite the styles for\n * the `.ng-hide` CSS class. Note that the selector that needs to be used is actually\n * `.ng-hide:not(.ng-hide-animate)` to cope with extra animation classes that can be added.\n *\n * ```css\n * .ng-hide:not(.ng-hide-animate) {\n *   /&#42; These are just alternative ways of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the\n * display style.\n *\n * @animations\n * | Animation                                           | Occurs                                                                                                     |\n * |-----------------------------------------------------|------------------------------------------------------------------------------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden.  |\n * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible. |\n *\n * Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the\n * directive expression is true and false. This system works like the animation system present with\n * `ngClass` except that you must also include the `!important` flag to override the display\n * property so that the elements are not actually hidden during the animation.\n *\n * ```css\n * /&#42; A working example can be found at the bottom of this page. &#42;/\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition: all 0.5s linear;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property\n * to block during animation states - ngAnimate will automatically handle the style toggling for you.\n *\n * @element ANY\n * @param {expression} ngHide If the {@link guide/expression expression} is truthy/falsy then the\n *                            element is hidden/shown respectively.\n *\n * @example\n * A simple example, animating the element's opacity:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-hide-simple\">\n    <file name=\"index.html\">\n      Hide: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngHide\"><br />\n      <div class=\"check-element animate-show-hide\" ng-hide=\"checked\">\n        I hide when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .animate-show-hide.ng-hide {\n        opacity: 0;\n      }\n\n      .animate-show-hide.ng-hide-add,\n      .animate-show-hide.ng-hide-remove {\n        transition: all linear 0.5s;\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngHide', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(true);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(false);\n      });\n    </file>\n  </example>\n *\n * <hr />\n * @example\n * A more complex example, featuring different show/hide animations:\n *\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-hide-complex\">\n    <file name=\"index.html\">\n      Hide: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngHide\"><br />\n      <div class=\"check-element funky-show-hide\" ng-hide=\"checked\">\n        I hide when your checkbox is checked.\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      body {\n        overflow: hidden;\n        perspective: 1000px;\n      }\n\n      .funky-show-hide.ng-hide-add {\n        transform: rotateZ(0);\n        transform-origin: right;\n        transition: all 0.5s ease-in-out;\n      }\n\n      .funky-show-hide.ng-hide-add.ng-hide-add-active {\n        transform: rotateZ(-135deg);\n      }\n\n      .funky-show-hide.ng-hide-remove {\n        transform: rotateY(90deg);\n        transform-origin: left;\n        transition: all 0.5s ease;\n      }\n\n      .funky-show-hide.ng-hide-remove.ng-hide-remove-active {\n        transform: rotateY(0);\n      }\n\n      .check-element {\n        border: 1px solid black;\n        opacity: 1;\n        padding: 10px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should check ngHide', function() {\n        var checkbox = element(by.model('checked'));\n        var checkElem = element(by.css('.check-element'));\n\n        expect(checkElem.isDisplayed()).toBe(true);\n        checkbox.click();\n        expect(checkElem.isDisplayed()).toBe(false);\n      });\n    </file>\n  </example>\n *\n * @knownIssue\n *\n * ### Flickering when using ngHide to toggle between elements\n *\n * When using {@link ngShow} and / or {@link ngHide} to toggle between elements, it can\n * happen that both the element to show and the element to hide are visible for a very short time.\n *\n * This usually happens when the {@link ngAnimate ngAnimate module} is included, but no actual animations\n * are defined for {@link ngShow} / {@link ngHide}. Internet Explorer is affected more often than\n * other browsers.\n *\n * There are several way to mitigate this problem:\n *\n * - {@link guide/animations#how-to-selectively-enable-disable-and-skip-animations Disable animations on the affected elements}.\n * - Use {@link ngIf} or {@link ngSwitch} instead of {@link ngShow} / {@link ngHide}.\n * - Use the special CSS selector `ng-hide.ng-hide-animate` to set `{display: none}` or similar on the affected elements.\n * - Use `ng-class=\"{'ng-hide': expression}` instead of instead of {@link ngShow} / {@link ngHide}.\n * - Define an animation on the affected elements.\n */\nvar ngHideDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngHide, function ngHideWatchAction(value) {\n        // The comment inside of the ngShowDirective explains why we add and\n        // remove a temporary class for the show/hide animation\n        $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngStyle\n * @restrict AC\n *\n * @description\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\n *\n * @knownIssue\n * You should not use {@link guide/interpolation interpolation} in the value of the `style`\n * attribute, when using the `ngStyle` directive on the same element.\n * See {@link guide/interpolation#known-issues here} for more info.\n *\n * @element ANY\n * @param {expression} ngStyle\n *\n * {@link guide/expression Expression} which evals to an\n * object whose keys are CSS style names and values are corresponding values for those CSS\n * keys.\n *\n * Since some CSS style names are not valid keys for an object, they must be quoted.\n * See the 'background-color' style in the example below.\n *\n * @example\n   <example name=\"ng-style\">\n     <file name=\"index.html\">\n        <input type=\"button\" value=\"set color\" ng-click=\"myStyle={color:'red'}\">\n        <input type=\"button\" value=\"set background\" ng-click=\"myStyle={'background-color':'blue'}\">\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\n        <br/>\n        <span ng-style=\"myStyle\">Sample Text</span>\n        <pre>myStyle={{myStyle}}</pre>\n     </file>\n     <file name=\"style.css\">\n       span {\n         color: black;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var colorSpan = element(by.css('span'));\n\n       it('should check ng-style', function() {\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n         element(by.css('input[value=\\'set color\\']')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\n         element(by.css('input[value=clear]')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n       });\n     </file>\n   </example>\n */\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\n  scope.$watchCollection(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\n    if (oldStyles && (newStyles !== oldStyles)) {\n      if (!newStyles) {\n        newStyles = {};\n      }\n      forEach(oldStyles, function(val, style) {\n        if (newStyles[style] == null) {\n          newStyles[style] = '';\n        }\n      });\n    }\n    if (newStyles) element.css(newStyles);\n  });\n});\n\n/**\n * @ngdoc directive\n * @name ngSwitch\n * @restrict EA\n *\n * @description\n * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\n * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\n * as specified in the template.\n *\n * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\n * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\n * matches the value obtained from the evaluated expression. In other words, you define a container element\n * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\n * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\n * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\n * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\n * attribute is displayed.\n *\n * <div class=\"alert alert-info\">\n * Be aware that the attribute values to match against cannot be expressions. They are interpreted\n * as literal string values to match against.\n * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\n * value of the expression `$scope.someVal`.\n * </div>\n\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | after the ngSwitch contents change and the matched child element is placed inside the container |\n * | {@link ng.$animate#leave leave}  | after the ngSwitch contents change and just before the former contents are removed from the DOM |\n *\n * @usage\n *\n * ```\n * <ANY ng-switch=\"expression\">\n *   <ANY ng-switch-when=\"matchValue1\">...</ANY>\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\n *   <ANY ng-switch-default>...</ANY>\n * </ANY>\n * ```\n *\n *\n * @scope\n * @priority 1200\n * @param {*} ngSwitch|on expression to match against <code>ng-switch-when</code>.\n * On child elements add:\n *\n * * `ngSwitchWhen`: the case statement to match against. If match then this\n *   case will be displayed. If the same match appears multiple times, all the\n *   elements will be displayed. It is possible to associate multiple values to\n *   the same `ngSwitchWhen` by defining the optional attribute\n *   `ngSwitchWhenSeparator`. The separator will be used to split the value of\n *   the `ngSwitchWhen` attribute into multiple tokens, and the element will show\n *   if any of the `ngSwitch` evaluates to any of these tokens.\n * * `ngSwitchDefault`: the default case when no other case match. If there\n *   are multiple default cases, all of them will be displayed when no other\n *   case match.\n *\n *\n * @example\n  <example module=\"switchExample\" deps=\"angular-animate.js\" animations=\"true\" name=\"ng-switch\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <select ng-model=\"selection\" ng-options=\"item for item in items\">\n        </select>\n        <code>selection={{selection}}</code>\n        <hr/>\n        <div class=\"animate-switch-container\"\n          ng-switch on=\"selection\">\n            <div class=\"animate-switch\" ng-switch-when=\"settings|options\" ng-switch-when-separator=\"|\">Settings Div</div>\n            <div class=\"animate-switch\" ng-switch-when=\"home\">Home Span</div>\n            <div class=\"animate-switch\" ng-switch-default>default</div>\n        </div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('switchExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.items = ['settings', 'home', 'options', 'other'];\n          $scope.selection = $scope.items[0];\n        }]);\n    </file>\n    <file name=\"animations.css\">\n      .animate-switch-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .animate-switch {\n        padding:10px;\n      }\n\n      .animate-switch.ng-animate {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n      }\n\n      .animate-switch.ng-leave.ng-leave-active,\n      .animate-switch.ng-enter {\n        top:-50px;\n      }\n      .animate-switch.ng-leave,\n      .animate-switch.ng-enter.ng-enter-active {\n        top:0;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var switchElem = element(by.css('[ng-switch]'));\n      var select = element(by.model('selection'));\n\n      it('should start in settings', function() {\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should change to home', function() {\n        select.all(by.css('option')).get(1).click();\n        expect(switchElem.getText()).toMatch(/Home Span/);\n      });\n      it('should change to settings via \"options\"', function() {\n        select.all(by.css('option')).get(2).click();\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should select default', function() {\n        select.all(by.css('option')).get(3).click();\n        expect(switchElem.getText()).toMatch(/default/);\n      });\n    </file>\n  </example>\n */\nvar ngSwitchDirective = ['$animate', '$compile', function($animate, $compile) {\n  return {\n    require: 'ngSwitch',\n\n    // asks for $scope to fool the BC controller module\n    controller: ['$scope', function NgSwitchController() {\n     this.cases = {};\n    }],\n    link: function(scope, element, attr, ngSwitchController) {\n      var watchExpr = attr.ngSwitch || attr.on,\n          selectedTranscludes = [],\n          selectedElements = [],\n          previousLeaveAnimations = [],\n          selectedScopes = [];\n\n      var spliceFactory = function(array, index) {\n          return function(response) {\n            if (response !== false) array.splice(index, 1);\n          };\n      };\n\n      scope.$watch(watchExpr, function ngSwitchWatchAction(value) {\n        var i, ii;\n\n        // Start with the last, in case the array is modified during the loop\n        while (previousLeaveAnimations.length) {\n          $animate.cancel(previousLeaveAnimations.pop());\n        }\n\n        for (i = 0, ii = selectedScopes.length; i < ii; ++i) {\n          var selected = getBlockNodes(selectedElements[i].clone);\n          selectedScopes[i].$destroy();\n          var runner = previousLeaveAnimations[i] = $animate.leave(selected);\n          runner.done(spliceFactory(previousLeaveAnimations, i));\n        }\n\n        selectedElements.length = 0;\n        selectedScopes.length = 0;\n\n        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\n          forEach(selectedTranscludes, function(selectedTransclude) {\n            selectedTransclude.transclude(function(caseElement, selectedScope) {\n              selectedScopes.push(selectedScope);\n              var anchor = selectedTransclude.element;\n              caseElement[caseElement.length++] = $compile.$$createComment('end ngSwitchWhen');\n              var block = { clone: caseElement };\n\n              selectedElements.push(block);\n              $animate.enter(caseElement, anchor.parent(), anchor);\n            });\n          });\n        }\n      });\n    }\n  };\n}];\n\nvar ngSwitchWhenDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attrs, ctrl, $transclude) {\n\n    var cases = attrs.ngSwitchWhen.split(attrs.ngSwitchWhenSeparator).sort().filter(\n      // Filter duplicate cases\n      function(element, index, array) { return array[index - 1] !== element; }\n    );\n\n    forEach(cases, function(whenCase) {\n      ctrl.cases['!' + whenCase] = (ctrl.cases['!' + whenCase] || []);\n      ctrl.cases['!' + whenCase].push({ transclude: $transclude, element: element });\n    });\n  }\n});\n\nvar ngSwitchDefaultDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attr, ctrl, $transclude) {\n    ctrl.cases['?'] = (ctrl.cases['?'] || []);\n    ctrl.cases['?'].push({ transclude: $transclude, element: element });\n   }\n});\n\n/**\n * @ngdoc directive\n * @name ngTransclude\n * @restrict EAC\n *\n * @description\n * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\n *\n * You can specify that you want to insert a named transclusion slot, instead of the default slot, by providing the slot name\n * as the value of the `ng-transclude` or `ng-transclude-slot` attribute.\n *\n * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing\n * content of this element will be removed before the transcluded content is inserted.\n * If the transcluded content is empty (or only whitespace), the existing content is left intact. This lets you provide fallback\n * content in the case that no transcluded content is provided.\n *\n * @element ANY\n *\n * @param {string} ngTransclude|ngTranscludeSlot the name of the slot to insert at this point. If this is not provided, is empty\n *                                               or its value is the same as the name of the attribute then the default slot is used.\n *\n * @example\n * ### Basic transclusion\n * This example demonstrates basic transclusion of content into a component directive.\n * <example name=\"simpleTranscludeExample\" module=\"transcludeExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('transcludeExample', [])\n *        .directive('pane', function(){\n *           return {\n *             restrict: 'E',\n *             transclude: true,\n *             scope: { title:'@' },\n *             template: '<div style=\"border: 1px solid black;\">' +\n *                         '<div style=\"background-color: gray\">{{title}}</div>' +\n *                         '<ng-transclude></ng-transclude>' +\n *                       '</div>'\n *           };\n *       })\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         $scope.title = 'Lorem Ipsum';\n *         $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n *       }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <input ng-model=\"title\" aria-label=\"title\"> <br/>\n *       <textarea ng-model=\"text\" aria-label=\"text\"></textarea> <br/>\n *       <pane title=\"{{title}}\"><span>{{text}}</span></pane>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      it('should have transcluded', function() {\n *        var titleElement = element(by.model('title'));\n *        titleElement.clear();\n *        titleElement.sendKeys('TITLE');\n *        var textElement = element(by.model('text'));\n *        textElement.clear();\n *        textElement.sendKeys('TEXT');\n *        expect(element(by.binding('title')).getText()).toEqual('TITLE');\n *        expect(element(by.binding('text')).getText()).toEqual('TEXT');\n *      });\n *   </file>\n * </example>\n *\n * @example\n * ### Transclude fallback content\n * This example shows how to use `NgTransclude` with fallback content, that\n * is displayed if no transcluded content is provided.\n *\n * <example module=\"transcludeFallbackContentExample\" name=\"ng-transclude\">\n * <file name=\"index.html\">\n * <script>\n * angular.module('transcludeFallbackContentExample', [])\n * .directive('myButton', function(){\n *             return {\n *               restrict: 'E',\n *               transclude: true,\n *               scope: true,\n *               template: '<button style=\"cursor: pointer;\">' +\n *                           '<ng-transclude>' +\n *                             '<b style=\"color: red;\">Button1</b>' +\n *                           '</ng-transclude>' +\n *                         '</button>'\n *             };\n *         });\n * </script>\n * <!-- fallback button content -->\n * <my-button id=\"fallback\"></my-button>\n * <!-- modified button content -->\n * <my-button id=\"modified\">\n *   <i style=\"color: green;\">Button2</i>\n * </my-button>\n * </file>\n * <file name=\"protractor.js\" type=\"protractor\">\n * it('should have different transclude element content', function() {\n *          expect(element(by.id('fallback')).getText()).toBe('Button1');\n *          expect(element(by.id('modified')).getText()).toBe('Button2');\n *        });\n * </file>\n * </example>\n *\n * @example\n * ### Multi-slot transclusion\n * This example demonstrates using multi-slot transclusion in a component directive.\n * <example name=\"multiSlotTranscludeExample\" module=\"multiSlotTranscludeExample\">\n *   <file name=\"index.html\">\n *    <style>\n *      .title, .footer {\n *        background-color: gray\n *      }\n *    </style>\n *    <div ng-controller=\"ExampleController\">\n *      <input ng-model=\"title\" aria-label=\"title\"> <br/>\n *      <textarea ng-model=\"text\" aria-label=\"text\"></textarea> <br/>\n *      <pane>\n *        <pane-title><a ng-href=\"{{link}}\">{{title}}</a></pane-title>\n *        <pane-body><p>{{text}}</p></pane-body>\n *      </pane>\n *    </div>\n *   </file>\n *   <file name=\"app.js\">\n *    angular.module('multiSlotTranscludeExample', [])\n *     .directive('pane', function() {\n *        return {\n *          restrict: 'E',\n *          transclude: {\n *            'title': '?paneTitle',\n *            'body': 'paneBody',\n *            'footer': '?paneFooter'\n *          },\n *          template: '<div style=\"border: 1px solid black;\">' +\n *                      '<div class=\"title\" ng-transclude=\"title\">Fallback Title</div>' +\n *                      '<div ng-transclude=\"body\"></div>' +\n *                      '<div class=\"footer\" ng-transclude=\"footer\">Fallback Footer</div>' +\n *                    '</div>'\n *        };\n *    })\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.title = 'Lorem Ipsum';\n *      $scope.link = 'https://google.com';\n *      $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n *    }]);\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      it('should have transcluded the title and the body', function() {\n *        var titleElement = element(by.model('title'));\n *        titleElement.clear();\n *        titleElement.sendKeys('TITLE');\n *        var textElement = element(by.model('text'));\n *        textElement.clear();\n *        textElement.sendKeys('TEXT');\n *        expect(element(by.css('.title')).getText()).toEqual('TITLE');\n *        expect(element(by.binding('text')).getText()).toEqual('TEXT');\n *        expect(element(by.css('.footer')).getText()).toEqual('Fallback Footer');\n *      });\n *   </file>\n * </example>\n */\nvar ngTranscludeMinErr = minErr('ngTransclude');\nvar ngTranscludeDirective = ['$compile', function($compile) {\n  return {\n    restrict: 'EAC',\n    compile: function ngTranscludeCompile(tElement) {\n\n      // Remove and cache any original content to act as a fallback\n      var fallbackLinkFn = $compile(tElement.contents());\n      tElement.empty();\n\n      return function ngTranscludePostLink($scope, $element, $attrs, controller, $transclude) {\n\n        if (!$transclude) {\n          throw ngTranscludeMinErr('orphan',\n          'Illegal use of ngTransclude directive in the template! ' +\n          'No parent directive that requires a transclusion found. ' +\n          'Element: {0}',\n          startingTag($element));\n        }\n\n\n        // If the attribute is of the form: `ng-transclude=\"ng-transclude\"` then treat it like the default\n        if ($attrs.ngTransclude === $attrs.$attr.ngTransclude) {\n          $attrs.ngTransclude = '';\n        }\n        var slotName = $attrs.ngTransclude || $attrs.ngTranscludeSlot;\n\n        // If the slot is required and no transclusion content is provided then this call will throw an error\n        $transclude(ngTranscludeCloneAttachFn, null, slotName);\n\n        // If the slot is optional and no transclusion content is provided then use the fallback content\n        if (slotName && !$transclude.isSlotFilled(slotName)) {\n          useFallbackContent();\n        }\n\n        function ngTranscludeCloneAttachFn(clone, transcludedScope) {\n          if (clone.length && notWhitespace(clone)) {\n            $element.append(clone);\n          } else {\n            useFallbackContent();\n            // There is nothing linked against the transcluded scope since no content was available,\n            // so it should be safe to clean up the generated scope.\n            transcludedScope.$destroy();\n          }\n        }\n\n        function useFallbackContent() {\n          // Since this is the fallback content rather than the transcluded content,\n          // we link against the scope of this directive rather than the transcluded scope\n          fallbackLinkFn($scope, function(clone) {\n            $element.append(clone);\n          });\n        }\n\n        function notWhitespace(nodes) {\n          for (var i = 0, ii = nodes.length; i < ii; i++) {\n            var node = nodes[i];\n            if (node.nodeType !== NODE_TYPE_TEXT || node.nodeValue.trim()) {\n              return true;\n            }\n          }\n        }\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name script\n * @restrict E\n *\n * @description\n * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the\n * template can be used by {@link ng.directive:ngInclude `ngInclude`},\n * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the\n * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be\n * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.\n *\n * @param {string} type Must be set to `'text/ng-template'`.\n * @param {string} id Cache name of the template.\n *\n * @example\n  <example  name=\"script-tag\">\n    <file name=\"index.html\">\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\n        Content of the template.\n      </script>\n\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should load template defined inside script tag', function() {\n        element(by.css('#tpl-link')).click();\n        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\n      });\n    </file>\n  </example>\n */\nvar scriptDirective = ['$templateCache', function($templateCache) {\n  return {\n    restrict: 'E',\n    terminal: true,\n    compile: function(element, attr) {\n      if (attr.type === 'text/ng-template') {\n        var templateUrl = attr.id,\n            text = element[0].text;\n\n        $templateCache.put(templateUrl, text);\n      }\n    }\n  };\n}];\n\n/* exported selectDirective, optionDirective */\n\nvar noopNgModelController = { $setViewValue: noop, $render: noop };\n\nfunction setOptionSelectedStatus(optionEl, value) {\n  optionEl.prop('selected', value);\n  /**\n   * When unselecting an option, setting the property to null / false should be enough\n   * However, screenreaders might react to the selected attribute instead, see\n   * https://github.com/angular/angular.js/issues/14419\n   * Note: \"selected\" is a boolean attr and will be removed when the \"value\" arg in attr() is false\n   * or null\n   */\n  optionEl.attr('selected', value);\n}\n\n/**\n * @ngdoc type\n * @name  select.SelectController\n *\n * @description\n * The controller for the {@link ng.select select} directive. The controller exposes\n * a few utility methods that can be used to augment the behavior of a regular or an\n * {@link ng.ngOptions ngOptions} select element.\n *\n * @example\n * ### Set a custom error when the unknown option is selected\n *\n * This example sets a custom error \"unknownValue\" on the ngModelController\n * when the select element's unknown option is selected, i.e. when the model is set to a value\n * that is not matched by any option.\n *\n * <example name=\"select-unknown-value-error\" module=\"staticSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"testSelect\"> Single select: </label><br>\n *     <select name=\"testSelect\" ng-model=\"selected\" unknown-value-error>\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *     <span class=\"error\" ng-if=\"myForm.testSelect.$error.unknownValue\">\n *       Error: The current model doesn't match any option</span><br>\n *\n *     <button ng-click=\"forceUnknownOption()\">Force unknown option</button><br>\n *   </form>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('staticSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.selected = null;\n *\n *      $scope.forceUnknownOption = function() {\n *        $scope.selected = 'nonsense';\n *      };\n *   }])\n *   .directive('unknownValueError', function() {\n *     return {\n *       require: ['ngModel', 'select'],\n *       link: function(scope, element, attrs, ctrls) {\n *         var ngModelCtrl = ctrls[0];\n *         var selectCtrl = ctrls[1];\n *\n *         ngModelCtrl.$validators.unknownValue = function(modelValue, viewValue) {\n *           if (selectCtrl.$isUnknownOptionSelected()) {\n *             return false;\n *           }\n *\n *           return true;\n *         };\n *       }\n *\n *     };\n *   });\n * </file>\n *</example>\n *\n *\n * @example\n * ### Set the \"required\" error when the unknown option is selected.\n *\n * By default, the \"required\" error on the ngModelController is only set on a required select\n * when the empty option is selected. This example adds a custom directive that also sets the\n * error when the unknown option is selected.\n *\n * <example name=\"select-unknown-value-required\" module=\"staticSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"testSelect\"> Select: </label><br>\n *     <select name=\"testSelect\" ng-model=\"selected\" required unknown-value-required>\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *     <span class=\"error\" ng-if=\"myForm.testSelect.$error.required\">Error: Please select a value</span><br>\n *\n *     <button ng-click=\"forceUnknownOption()\">Force unknown option</button><br>\n *   </form>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('staticSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.selected = null;\n *\n *      $scope.forceUnknownOption = function() {\n *        $scope.selected = 'nonsense';\n *      };\n *   }])\n *   .directive('unknownValueRequired', function() {\n *     return {\n *       priority: 1, // This directive must run after the required directive has added its validator\n *       require: ['ngModel', 'select'],\n *       link: function(scope, element, attrs, ctrls) {\n *         var ngModelCtrl = ctrls[0];\n *         var selectCtrl = ctrls[1];\n *\n *         var originalRequiredValidator = ngModelCtrl.$validators.required;\n *\n *         ngModelCtrl.$validators.required = function() {\n *           if (attrs.required && selectCtrl.$isUnknownOptionSelected()) {\n *             return false;\n *           }\n *\n *           return originalRequiredValidator.apply(this, arguments);\n *         };\n *       }\n *     };\n *   });\n * </file>\n * <file name=\"protractor.js\" type=\"protractor\">\n *  it('should show the error message when the unknown option is selected', function() {\n\n      var error = element(by.className('error'));\n\n      expect(error.getText()).toBe('Error: Please select a value');\n\n      element(by.cssContainingText('option', 'Option 1')).click();\n\n      expect(error.isPresent()).toBe(false);\n\n      element(by.tagName('button')).click();\n\n      expect(error.getText()).toBe('Error: Please select a value');\n    });\n * </file>\n *</example>\n *\n *\n */\nvar SelectController =\n        ['$element', '$scope', /** @this */ function($element, $scope) {\n\n  var self = this,\n      optionsMap = new NgMap();\n\n  self.selectValueMap = {}; // Keys are the hashed values, values the original values\n\n  // If the ngModel doesn't get provided then provide a dummy noop version to prevent errors\n  self.ngModelCtrl = noopNgModelController;\n  self.multiple = false;\n\n  // The \"unknown\" option is one that is prepended to the list if the viewValue\n  // does not match any of the options. When it is rendered the value of the unknown\n  // option is '? XXX ?' where XXX is the hashKey of the value that is not known.\n  //\n  // Support: IE 9 only\n  // We can't just jqLite('<option>') since jqLite is not smart enough\n  // to create it in <select> and IE barfs otherwise.\n  self.unknownOption = jqLite(window.document.createElement('option'));\n\n  // The empty option is an option with the value '' that the application developer can\n  // provide inside the select. It is always selectable and indicates that a \"null\" selection has\n  // been made by the user.\n  // If the select has an empty option, and the model of the select is set to \"undefined\" or \"null\",\n  // the empty option is selected.\n  // If the model is set to a different unmatched value, the unknown option is rendered and\n  // selected, i.e both are present, because a \"null\" selection and an unknown value are different.\n  self.hasEmptyOption = false;\n  self.emptyOption = undefined;\n\n  self.renderUnknownOption = function(val) {\n    var unknownVal = self.generateUnknownOptionValue(val);\n    self.unknownOption.val(unknownVal);\n    $element.prepend(self.unknownOption);\n    setOptionSelectedStatus(self.unknownOption, true);\n    $element.val(unknownVal);\n  };\n\n  self.updateUnknownOption = function(val) {\n    var unknownVal = self.generateUnknownOptionValue(val);\n    self.unknownOption.val(unknownVal);\n    setOptionSelectedStatus(self.unknownOption, true);\n    $element.val(unknownVal);\n  };\n\n  self.generateUnknownOptionValue = function(val) {\n    return '? ' + hashKey(val) + ' ?';\n  };\n\n  self.removeUnknownOption = function() {\n    if (self.unknownOption.parent()) self.unknownOption.remove();\n  };\n\n  self.selectEmptyOption = function() {\n    if (self.emptyOption) {\n      $element.val('');\n      setOptionSelectedStatus(self.emptyOption, true);\n    }\n  };\n\n  self.unselectEmptyOption = function() {\n    if (self.hasEmptyOption) {\n      setOptionSelectedStatus(self.emptyOption, false);\n    }\n  };\n\n  $scope.$on('$destroy', function() {\n    // disable unknown option so that we don't do work when the whole select is being destroyed\n    self.renderUnknownOption = noop;\n  });\n\n  // Read the value of the select control, the implementation of this changes depending\n  // upon whether the select can have multiple values and whether ngOptions is at work.\n  self.readValue = function readSingleValue() {\n    var val = $element.val();\n    // ngValue added option values are stored in the selectValueMap, normal interpolations are not\n    var realVal = val in self.selectValueMap ? self.selectValueMap[val] : val;\n\n    if (self.hasOption(realVal)) {\n      return realVal;\n    }\n\n    return null;\n  };\n\n\n  // Write the value to the select control, the implementation of this changes depending\n  // upon whether the select can have multiple values and whether ngOptions is at work.\n  self.writeValue = function writeSingleValue(value) {\n    // Make sure to remove the selected attribute from the previously selected option\n    // Otherwise, screen readers might get confused\n    var currentlySelectedOption = $element[0].options[$element[0].selectedIndex];\n    if (currentlySelectedOption) setOptionSelectedStatus(jqLite(currentlySelectedOption), false);\n\n    if (self.hasOption(value)) {\n      self.removeUnknownOption();\n\n      var hashedVal = hashKey(value);\n      $element.val(hashedVal in self.selectValueMap ? hashedVal : value);\n\n      // Set selected attribute and property on selected option for screen readers\n      var selectedOption = $element[0].options[$element[0].selectedIndex];\n      setOptionSelectedStatus(jqLite(selectedOption), true);\n    } else {\n      self.selectUnknownOrEmptyOption(value);\n    }\n  };\n\n\n  // Tell the select control that an option, with the given value, has been added\n  self.addOption = function(value, element) {\n    // Skip comment nodes, as they only pollute the `optionsMap`\n    if (element[0].nodeType === NODE_TYPE_COMMENT) return;\n\n    assertNotHasOwnProperty(value, '\"option value\"');\n    if (value === '') {\n      self.hasEmptyOption = true;\n      self.emptyOption = element;\n    }\n    var count = optionsMap.get(value) || 0;\n    optionsMap.set(value, count + 1);\n    // Only render at the end of a digest. This improves render performance when many options\n    // are added during a digest and ensures all relevant options are correctly marked as selected\n    scheduleRender();\n  };\n\n  // Tell the select control that an option, with the given value, has been removed\n  self.removeOption = function(value) {\n    var count = optionsMap.get(value);\n    if (count) {\n      if (count === 1) {\n        optionsMap.delete(value);\n        if (value === '') {\n          self.hasEmptyOption = false;\n          self.emptyOption = undefined;\n        }\n      } else {\n        optionsMap.set(value, count - 1);\n      }\n    }\n  };\n\n  // Check whether the select control has an option matching the given value\n  self.hasOption = function(value) {\n    return !!optionsMap.get(value);\n  };\n\n  /**\n   * @ngdoc method\n   * @name select.SelectController#$hasEmptyOption\n   *\n   * @description\n   *\n   * Returns `true` if the select element currently has an empty option\n   * element, i.e. an option that signifies that the select is empty / the selection is null.\n   *\n   */\n  self.$hasEmptyOption = function() {\n    return self.hasEmptyOption;\n  };\n\n  /**\n   * @ngdoc method\n   * @name select.SelectController#$isUnknownOptionSelected\n   *\n   * @description\n   *\n   * Returns `true` if the select element's unknown option is selected. The unknown option is added\n   * and automatically selected whenever the select model doesn't match any option.\n   *\n   */\n  self.$isUnknownOptionSelected = function() {\n    // Presence of the unknown option means it is selected\n    return $element[0].options[0] === self.unknownOption[0];\n  };\n\n  /**\n   * @ngdoc method\n   * @name select.SelectController#$isEmptyOptionSelected\n   *\n   * @description\n   *\n   * Returns `true` if the select element has an empty option and this empty option is currently\n   * selected. Returns `false` if the select element has no empty option or it is not selected.\n   *\n   */\n  self.$isEmptyOptionSelected = function() {\n    return self.hasEmptyOption && $element[0].options[$element[0].selectedIndex] === self.emptyOption[0];\n  };\n\n  self.selectUnknownOrEmptyOption = function(value) {\n    if (value == null && self.emptyOption) {\n      self.removeUnknownOption();\n      self.selectEmptyOption();\n    } else if (self.unknownOption.parent().length) {\n      self.updateUnknownOption(value);\n    } else {\n      self.renderUnknownOption(value);\n    }\n  };\n\n  var renderScheduled = false;\n  function scheduleRender() {\n    if (renderScheduled) return;\n    renderScheduled = true;\n    $scope.$$postDigest(function() {\n      renderScheduled = false;\n      self.ngModelCtrl.$render();\n    });\n  }\n\n  var updateScheduled = false;\n  function scheduleViewValueUpdate(renderAfter) {\n    if (updateScheduled) return;\n\n    updateScheduled = true;\n\n    $scope.$$postDigest(function() {\n      if ($scope.$$destroyed) return;\n\n      updateScheduled = false;\n      self.ngModelCtrl.$setViewValue(self.readValue());\n      if (renderAfter) self.ngModelCtrl.$render();\n    });\n  }\n\n\n  self.registerOption = function(optionScope, optionElement, optionAttrs, interpolateValueFn, interpolateTextFn) {\n\n    if (optionAttrs.$attr.ngValue) {\n      // The value attribute is set by ngValue\n      var oldVal, hashedVal;\n      optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {\n\n        var removal;\n        var previouslySelected = optionElement.prop('selected');\n\n        if (isDefined(hashedVal)) {\n          self.removeOption(oldVal);\n          delete self.selectValueMap[hashedVal];\n          removal = true;\n        }\n\n        hashedVal = hashKey(newVal);\n        oldVal = newVal;\n        self.selectValueMap[hashedVal] = newVal;\n        self.addOption(newVal, optionElement);\n        // Set the attribute directly instead of using optionAttrs.$set - this stops the observer\n        // from firing a second time. Other $observers on value will also get the result of the\n        // ngValue expression, not the hashed value\n        optionElement.attr('value', hashedVal);\n\n        if (removal && previouslySelected) {\n          scheduleViewValueUpdate();\n        }\n\n      });\n    } else if (interpolateValueFn) {\n      // The value attribute is interpolated\n      optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {\n        // This method is overwritten in ngOptions and has side-effects!\n        self.readValue();\n\n        var removal;\n        var previouslySelected = optionElement.prop('selected');\n\n        if (isDefined(oldVal)) {\n          self.removeOption(oldVal);\n          removal = true;\n        }\n        oldVal = newVal;\n        self.addOption(newVal, optionElement);\n\n        if (removal && previouslySelected) {\n          scheduleViewValueUpdate();\n        }\n      });\n    } else if (interpolateTextFn) {\n      // The text content is interpolated\n      optionScope.$watch(interpolateTextFn, function interpolateWatchAction(newVal, oldVal) {\n        optionAttrs.$set('value', newVal);\n        var previouslySelected = optionElement.prop('selected');\n        if (oldVal !== newVal) {\n          self.removeOption(oldVal);\n        }\n        self.addOption(newVal, optionElement);\n\n        if (oldVal && previouslySelected) {\n          scheduleViewValueUpdate();\n        }\n      });\n    } else {\n      // The value attribute is static\n      self.addOption(optionAttrs.value, optionElement);\n    }\n\n\n    optionAttrs.$observe('disabled', function(newVal) {\n\n      // Since model updates will also select disabled options (like ngOptions),\n      // we only have to handle options becoming disabled, not enabled\n\n      if (newVal === 'true' || newVal && optionElement.prop('selected')) {\n        if (self.multiple) {\n          scheduleViewValueUpdate(true);\n        } else {\n          self.ngModelCtrl.$setViewValue(null);\n          self.ngModelCtrl.$render();\n        }\n      }\n    });\n\n    optionElement.on('$destroy', function() {\n      var currentValue = self.readValue();\n      var removeValue = optionAttrs.value;\n\n      self.removeOption(removeValue);\n      scheduleRender();\n\n      if (self.multiple && currentValue && currentValue.indexOf(removeValue) !== -1 ||\n          currentValue === removeValue\n      ) {\n        // When multiple (selected) options are destroyed at the same time, we don't want\n        // to run a model update for each of them. Instead, run a single update in the $$postDigest\n        scheduleViewValueUpdate(true);\n      }\n    });\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name select\n * @restrict E\n *\n * @description\n * HTML `select` element with AngularJS data-binding.\n *\n * The `select` directive is used together with {@link ngModel `ngModel`} to provide data-binding\n * between the scope and the `<select>` control (including setting default values).\n * It also handles dynamic `<option>` elements, which can be added using the {@link ngRepeat `ngRepeat}` or\n * {@link ngOptions `ngOptions`} directives.\n *\n * When an item in the `<select>` menu is selected, the value of the selected option will be bound\n * to the model identified by the `ngModel` directive. With static or repeated options, this is\n * the content of the `value` attribute or the textContent of the `<option>`, if the value attribute is missing.\n * Value and textContent can be interpolated.\n *\n * The {@link select.SelectController select controller} exposes utility functions that can be used\n * to manipulate the select's behavior.\n *\n * ## Matching model and option values\n *\n * In general, the match between the model and an option is evaluated by strictly comparing the model\n * value against the value of the available options.\n *\n * If you are setting the option value with the option's `value` attribute, or textContent, the\n * value will always be a `string` which means that the model value must also be a string.\n * Otherwise the `select` directive cannot match them correctly.\n *\n * To bind the model to a non-string value, you can use one of the following strategies:\n * - the {@link ng.ngOptions `ngOptions`} directive\n *   ({@link ng.select#using-select-with-ngoptions-and-setting-a-default-value})\n * - the {@link ng.ngValue `ngValue`} directive, which allows arbitrary expressions to be\n *   option values ({@link ng.select#using-ngvalue-to-bind-the-model-to-an-array-of-objects Example})\n * - model $parsers / $formatters to convert the string value\n *   ({@link ng.select#binding-select-to-a-non-string-value-via-ngmodel-parsing-formatting Example})\n *\n * If the viewValue of `ngModel` does not match any of the options, then the control\n * will automatically add an \"unknown\" option, which it then removes when the mismatch is resolved.\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * ## Choosing between `ngRepeat` and `ngOptions`\n *\n * In many cases, `ngRepeat` can be used on `<option>` elements instead of {@link ng.directive:ngOptions\n * ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits:\n * - more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the\n * comprehension expression\n * - reduced memory consumption by not creating a new scope for each repeated instance\n * - increased render speed by creating the options in a documentFragment instead of individually\n *\n * Specifically, select with repeated options slows down significantly starting at 2000 options in\n * Chrome and Internet Explorer / Edge.\n *\n *\n * @param {string} ngModel Assignable AngularJS expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} multiple Allows multiple options to be selected. The selected values will be\n *     bound to the model as an array.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds required attribute and required validation constraint to\n * the element when the ngRequired expression evaluates to true. Use ngRequired instead of required\n * when you want to data-bind to the required attribute.\n * @param {string=} ngChange AngularJS expression to be executed when selected option(s) changes due to user\n *    interaction with the select element.\n * @param {string=} ngOptions sets the options that the select is populated with and defines what is\n * set on the model on selection. See {@link ngOptions `ngOptions`}.\n * @param {string=} ngAttrSize sets the size of the select element dynamically. Uses the\n * {@link guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes ngAttr} directive.\n *\n *\n * @example\n * ### Simple `select` elements with static options\n *\n * <example name=\"static-select\" module=\"staticSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"singleSelect\"> Single select: </label><br>\n *     <select name=\"singleSelect\" ng-model=\"data.singleSelect\">\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *\n *     <label for=\"singleSelect\"> Single select with \"not selected\" option and dynamic option values: </label><br>\n *     <select name=\"singleSelect\" id=\"singleSelect\" ng-model=\"data.singleSelect\">\n *       <option value=\"\">---Please select---</option> <!-- not selected / blank option -->\n *       <option value=\"{{data.option1}}\">Option 1</option> <!-- interpolation -->\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *     <button ng-click=\"forceUnknownOption()\">Force unknown option</button><br>\n *     <tt>singleSelect = {{data.singleSelect}}</tt>\n *\n *     <hr>\n *     <label for=\"multipleSelect\"> Multiple select: </label><br>\n *     <select name=\"multipleSelect\" id=\"multipleSelect\" ng-model=\"data.multipleSelect\" multiple>\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *       <option value=\"option-3\">Option 3</option>\n *     </select><br>\n *     <tt>multipleSelect = {{data.multipleSelect}}</tt><br/>\n *   </form>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('staticSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       singleSelect: null,\n *       multipleSelect: [],\n *       option1: 'option-1'\n *      };\n *\n *      $scope.forceUnknownOption = function() {\n *        $scope.data.singleSelect = 'nonsense';\n *      };\n *   }]);\n * </file>\n *</example>\n *\n * @example\n * ### Using `ngRepeat` to generate `select` options\n * <example name=\"select-ngrepeat\" module=\"ngrepeatSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"repeatSelect\"> Repeat select: </label>\n *     <select name=\"repeatSelect\" id=\"repeatSelect\" ng-model=\"data.model\">\n *       <option ng-repeat=\"option in data.availableOptions\" value=\"{{option.id}}\">{{option.name}}</option>\n *     </select>\n *   </form>\n *   <hr>\n *   <tt>model = {{data.model}}</tt><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('ngrepeatSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       model: null,\n *       availableOptions: [\n *         {id: '1', name: 'Option A'},\n *         {id: '2', name: 'Option B'},\n *         {id: '3', name: 'Option C'}\n *       ]\n *      };\n *   }]);\n * </file>\n *</example>\n *\n * @example\n * ### Using `ngValue` to bind the model to an array of objects\n * <example name=\"select-ngvalue\" module=\"ngvalueSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"ngvalueselect\"> ngvalue select: </label>\n *     <select size=\"6\" name=\"ngvalueselect\" ng-model=\"data.model\" multiple>\n *       <option ng-repeat=\"option in data.availableOptions\" ng-value=\"option.value\">{{option.name}}</option>\n *     </select>\n *   </form>\n *   <hr>\n *   <pre>model = {{data.model | json}}</pre><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('ngvalueSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       model: null,\n *       availableOptions: [\n           {value: 'myString', name: 'string'},\n           {value: 1, name: 'integer'},\n           {value: true, name: 'boolean'},\n           {value: null, name: 'null'},\n           {value: {prop: 'value'}, name: 'object'},\n           {value: ['a'], name: 'array'}\n *       ]\n *      };\n *   }]);\n * </file>\n *</example>\n *\n * @example\n * ### Using `select` with `ngOptions` and setting a default value\n * See the {@link ngOptions ngOptions documentation} for more `ngOptions` usage examples.\n *\n * <example name=\"select-with-default-values\" module=\"defaultValueSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"mySelect\">Make a choice:</label>\n *     <select name=\"mySelect\" id=\"mySelect\"\n *       ng-options=\"option.name for option in data.availableOptions track by option.id\"\n *       ng-model=\"data.selectedOption\"></select>\n *   </form>\n *   <hr>\n *   <tt>option = {{data.selectedOption}}</tt><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('defaultValueSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       availableOptions: [\n *         {id: '1', name: 'Option A'},\n *         {id: '2', name: 'Option B'},\n *         {id: '3', name: 'Option C'}\n *       ],\n *       selectedOption: {id: '3', name: 'Option C'} //This sets the default value of the select in the ui\n *       };\n *   }]);\n * </file>\n *</example>\n *\n * @example\n * ### Binding `select` to a non-string value via `ngModel` parsing / formatting\n *\n * <example name=\"select-with-non-string-options\" module=\"nonStringSelect\">\n *   <file name=\"index.html\">\n *     <select ng-model=\"model.id\" convert-to-number>\n *       <option value=\"0\">Zero</option>\n *       <option value=\"1\">One</option>\n *       <option value=\"2\">Two</option>\n *     </select>\n *     {{ model }}\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('nonStringSelect', [])\n *       .run(function($rootScope) {\n *         $rootScope.model = { id: 2 };\n *       })\n *       .directive('convertToNumber', function() {\n *         return {\n *           require: 'ngModel',\n *           link: function(scope, element, attrs, ngModel) {\n *             ngModel.$parsers.push(function(val) {\n *               return parseInt(val, 10);\n *             });\n *             ngModel.$formatters.push(function(val) {\n *               return '' + val;\n *             });\n *           }\n *         };\n *       });\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it('should initialize to model', function() {\n *       expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two');\n *     });\n *   </file>\n * </example>\n *\n */\nvar selectDirective = function() {\n\n  return {\n    restrict: 'E',\n    require: ['select', '?ngModel'],\n    controller: SelectController,\n    priority: 1,\n    link: {\n      pre: selectPreLink,\n      post: selectPostLink\n    }\n  };\n\n  function selectPreLink(scope, element, attr, ctrls) {\n\n      var selectCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n\n      // if ngModel is not defined, we don't need to do anything but set the registerOption\n      // function to noop, so options don't get added internally\n      if (!ngModelCtrl) {\n        selectCtrl.registerOption = noop;\n        return;\n      }\n\n\n      selectCtrl.ngModelCtrl = ngModelCtrl;\n\n      // When the selected item(s) changes we delegate getting the value of the select control\n      // to the `readValue` method, which can be changed if the select can have multiple\n      // selected values or if the options are being generated by `ngOptions`\n      element.on('change', function() {\n        selectCtrl.removeUnknownOption();\n        scope.$apply(function() {\n          ngModelCtrl.$setViewValue(selectCtrl.readValue());\n        });\n      });\n\n      // If the select allows multiple values then we need to modify how we read and write\n      // values from and to the control; also what it means for the value to be empty and\n      // we have to add an extra watch since ngModel doesn't work well with arrays - it\n      // doesn't trigger rendering if only an item in the array changes.\n      if (attr.multiple) {\n        selectCtrl.multiple = true;\n\n        // Read value now needs to check each option to see if it is selected\n        selectCtrl.readValue = function readMultipleValue() {\n          var array = [];\n          forEach(element.find('option'), function(option) {\n            if (option.selected && !option.disabled) {\n              var val = option.value;\n              array.push(val in selectCtrl.selectValueMap ? selectCtrl.selectValueMap[val] : val);\n            }\n          });\n          return array;\n        };\n\n        // Write value now needs to set the selected property of each matching option\n        selectCtrl.writeValue = function writeMultipleValue(value) {\n          forEach(element.find('option'), function(option) {\n            var shouldBeSelected = !!value && (includes(value, option.value) ||\n                                               includes(value, selectCtrl.selectValueMap[option.value]));\n            var currentlySelected = option.selected;\n\n            // Support: IE 9-11 only, Edge 12-15+\n            // In IE and Edge adding options to the selection via shift+click/UP/DOWN\n            // will de-select already selected options if \"selected\" on those options was set\n            // more than once (i.e. when the options were already selected)\n            // So we only modify the selected property if necessary.\n            // Note: this behavior cannot be replicated via unit tests because it only shows in the\n            // actual user interface.\n            if (shouldBeSelected !== currentlySelected) {\n              setOptionSelectedStatus(jqLite(option), shouldBeSelected);\n            }\n\n          });\n        };\n\n        // we have to do it on each watch since ngModel watches reference, but\n        // we need to work of an array, so we need to see if anything was inserted/removed\n        var lastView, lastViewRef = NaN;\n        scope.$watch(function selectMultipleWatch() {\n          if (lastViewRef === ngModelCtrl.$viewValue && !equals(lastView, ngModelCtrl.$viewValue)) {\n            lastView = shallowCopy(ngModelCtrl.$viewValue);\n            ngModelCtrl.$render();\n          }\n          lastViewRef = ngModelCtrl.$viewValue;\n        });\n\n        // If we are a multiple select then value is now a collection\n        // so the meaning of $isEmpty changes\n        ngModelCtrl.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n\n      }\n    }\n\n    function selectPostLink(scope, element, attrs, ctrls) {\n      // if ngModel is not defined, we don't need to do anything\n      var ngModelCtrl = ctrls[1];\n      if (!ngModelCtrl) return;\n\n      var selectCtrl = ctrls[0];\n\n      // We delegate rendering to the `writeValue` method, which can be changed\n      // if the select can have multiple selected values or if the options are being\n      // generated by `ngOptions`.\n      // This must be done in the postLink fn to prevent $render to be called before\n      // all nodes have been linked correctly.\n      ngModelCtrl.$render = function() {\n        selectCtrl.writeValue(ngModelCtrl.$viewValue);\n      };\n    }\n};\n\n\n// The option directive is purely designed to communicate the existence (or lack of)\n// of dynamically created (and destroyed) option elements to their containing select\n// directive via its controller.\nvar optionDirective = ['$interpolate', function($interpolate) {\n  return {\n    restrict: 'E',\n    priority: 100,\n    compile: function(element, attr) {\n      var interpolateValueFn, interpolateTextFn;\n\n      if (isDefined(attr.ngValue)) {\n        // Will be handled by registerOption\n      } else if (isDefined(attr.value)) {\n        // If the value attribute is defined, check if it contains an interpolation\n        interpolateValueFn = $interpolate(attr.value, true);\n      } else {\n        // If the value attribute is not defined then we fall back to the\n        // text content of the option element, which may be interpolated\n        interpolateTextFn = $interpolate(element.text(), true);\n        if (!interpolateTextFn) {\n          attr.$set('value', element.text());\n        }\n      }\n\n      return function(scope, element, attr) {\n        // This is an optimization over using ^^ since we don't want to have to search\n        // all the way to the root of the DOM for every single option element\n        var selectCtrlName = '$selectController',\n            parent = element.parent(),\n            selectCtrl = parent.data(selectCtrlName) ||\n              parent.parent().data(selectCtrlName); // in case we are in optgroup\n\n        if (selectCtrl) {\n          selectCtrl.registerOption(scope, element, attr, interpolateValueFn, interpolateTextFn);\n        }\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRequired\n * @restrict A\n *\n * @param {expression} ngRequired AngularJS expression. If it evaluates to `true`, it sets the\n *                                `required` attribute to the element and adds the `required`\n *                                {@link ngModel.NgModelController#$validators `validator`}.\n *\n * @description\n *\n * ngRequired adds the required {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for {@link input `input`} and {@link select `select`} controls, but can also be\n * applied to custom controls.\n *\n * The directive sets the `required` attribute on the element if the AngularJS expression inside\n * `ngRequired` evaluates to true. A special directive for setting `required` is necessary because we\n * cannot use interpolation inside `required`. See the {@link guide/interpolation interpolation guide}\n * for more info.\n *\n * The validator will set the `required` error key to true if the `required` attribute is set and\n * calling {@link ngModel.NgModelController#$isEmpty `NgModelController.$isEmpty`} with the\n * {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`} returns `true`. For example, the\n * `$isEmpty()` implementation for `input[text]` checks the length of the `$viewValue`. When developing\n * custom controls, `$isEmpty()` can be overwritten to account for a $viewValue that is not string-based.\n *\n * @example\n * <example name=\"ngRequiredDirective\" module=\"ngRequiredExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngRequiredExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.required = true;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"required\">Toggle required: </label>\n *         <input type=\"checkbox\" ng-model=\"required\" id=\"required\" />\n *         <br>\n *         <label for=\"input\">This input must be filled if `required` is true: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-required=\"required\" /><br>\n *         <hr>\n *         required error set? = <code>{{form.input.$error.required}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var required = element(by.binding('form.input.$error.required'));\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should set the required error', function() {\n         expect(required.getText()).toContain('true');\n\n         input.sendKeys('123');\n         expect(required.getText()).not.toContain('true');\n         expect(model.getText()).toContain('123');\n       });\n *   </file>\n * </example>\n */\nvar requiredDirective = ['$parse', function($parse) {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n      // For boolean attributes like required, presence means true\n      var value = attr.hasOwnProperty('required') || $parse(attr.ngRequired)(scope);\n\n      if (!attr.ngRequired) {\n        // force truthy in case we are on non input element\n        // (input elements do this automatically for boolean attributes like required)\n        attr.required = true;\n      }\n\n      ctrl.$validators.required = function(modelValue, viewValue) {\n        return !value || !ctrl.$isEmpty(viewValue);\n      };\n\n      attr.$observe('required', function(newVal) {\n\n        if (value !== newVal) {\n          value = newVal;\n          ctrl.$validate();\n        }\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngPattern\n * @restrict A\n *\n * @param {expression|RegExp} ngPattern AngularJS expression that must evaluate to a `RegExp` or a `String`\n *                                      parsable into a `RegExp`, or a `RegExp` literal. See above for\n *                                      more details.\n *\n * @description\n *\n * ngPattern adds the pattern {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `pattern` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * does not match a RegExp which is obtained from the `ngPattern` attribute value:\n * - the value is an AngularJS expression:\n *   - If the expression evaluates to a RegExp object, then this is used directly.\n *   - If the expression evaluates to a string, then it will be converted to a RegExp after wrapping it\n *     in `^` and `$` characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n * - If the value is a RegExp literal, e.g. `ngPattern=\"/^\\d+$/\"`, it is used directly.\n *\n * <div class=\"alert alert-info\">\n * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n * start at the index of the last search's match, thus not taking the whole input value into\n * account.\n * </div>\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `pattern` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngPattern` does not set the `pattern` attribute and therefore HTML5 constraint validation is\n *     not available.\n *   </li>\n *   <li>\n *     The `ngPattern` attribute must be an expression, while the `pattern` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngPatternDirective\" module=\"ngPatternExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngPatternExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.regex = '\\\\d+';\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"regex\">Set a pattern (regex string): </label>\n *         <input type=\"text\" ng-model=\"regex\" id=\"regex\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current pattern: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-pattern=\"regex\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default pattern', function() {\n         input.sendKeys('aaa');\n         expect(model.getText()).not.toContain('aaa');\n\n         input.clear().then(function() {\n           input.sendKeys('123');\n           expect(model.getText()).toContain('123');\n         });\n       });\n *   </file>\n * </example>\n */\nvar patternDirective = ['$parse', function($parse) {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    compile: function(tElm, tAttr) {\n      var patternExp;\n      var parseFn;\n\n      if (tAttr.ngPattern) {\n        patternExp = tAttr.ngPattern;\n\n        // ngPattern might be a scope expression, or an inlined regex, which is not parsable.\n        // We get value of the attribute here, so we can compare the old and the new value\n        // in the observer to avoid unnecessary validations\n        if (tAttr.ngPattern.charAt(0) === '/' && REGEX_STRING_REGEXP.test(tAttr.ngPattern)) {\n          parseFn = function() { return tAttr.ngPattern; };\n        } else {\n          parseFn = $parse(tAttr.ngPattern);\n        }\n      }\n\n      return function(scope, elm, attr, ctrl) {\n        if (!ctrl) return;\n\n        var attrVal = attr.pattern;\n\n        if (attr.ngPattern) {\n          attrVal = parseFn(scope);\n        } else {\n          patternExp = attr.pattern;\n        }\n\n        var regexp = parsePatternAttr(attrVal, patternExp, elm);\n\n        attr.$observe('pattern', function(newVal) {\n          var oldRegexp = regexp;\n\n          regexp = parsePatternAttr(newVal, patternExp, elm);\n\n          if ((oldRegexp && oldRegexp.toString()) !== (regexp && regexp.toString())) {\n            ctrl.$validate();\n          }\n        });\n\n        ctrl.$validators.pattern = function(modelValue, viewValue) {\n          // HTML5 pattern constraint validates the input value, so we validate the viewValue\n          return ctrl.$isEmpty(viewValue) || isUndefined(regexp) || regexp.test(viewValue);\n        };\n      };\n    }\n\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngMaxlength\n * @restrict A\n *\n * @param {expression} ngMaxlength AngularJS expression that must evaluate to a `Number` or `String`\n *                                 parsable into a `Number`. Used as value for the `maxlength`\n *                                 {@link ngModel.NgModelController#$validators validator}.\n *\n * @description\n *\n * ngMaxlength adds the maxlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `maxlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is longer than the integer obtained by evaluating the AngularJS expression given in the\n * `ngMaxlength` attribute value.\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `maxlength` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngMaxlength` does not set the `maxlength` attribute and therefore HTML5 constraint\n *     validation is not available.\n *   </li>\n *   <li>\n *     The `ngMaxlength` attribute must be an expression, while the `maxlength` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngMaxlengthDirective\" module=\"ngMaxlengthExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngMaxlengthExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.maxlength = 5;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"maxlength\">Set a maxlength: </label>\n *         <input type=\"number\" ng-model=\"maxlength\" id=\"maxlength\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current maxlength: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-maxlength=\"maxlength\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default maxlength', function() {\n         input.sendKeys('abcdef');\n         expect(model.getText()).not.toContain('abcdef');\n\n         input.clear().then(function() {\n           input.sendKeys('abcde');\n           expect(model.getText()).toContain('abcde');\n         });\n       });\n *   </file>\n * </example>\n */\nvar maxlengthDirective = ['$parse', function($parse) {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var maxlength = attr.maxlength || $parse(attr.ngMaxlength)(scope);\n      var maxlengthParsed = parseLength(maxlength);\n\n      attr.$observe('maxlength', function(value) {\n        if (maxlength !== value) {\n          maxlengthParsed = parseLength(value);\n          maxlength = value;\n          ctrl.$validate();\n        }\n      });\n      ctrl.$validators.maxlength = function(modelValue, viewValue) {\n        return (maxlengthParsed < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlengthParsed);\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngMinlength\n * @restrict A\n *\n * @param {expression} ngMinlength AngularJS expression that must evaluate to a `Number` or `String`\n *                                 parsable into a `Number`. Used as value for the `minlength`\n *                                 {@link ngModel.NgModelController#$validators validator}.\n *\n * @description\n *\n * ngMinlength adds the minlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `minlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is shorter than the integer obtained by evaluating the AngularJS expression given in the\n * `ngMinlength` attribute value.\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `minlength` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngMinlength` does not set the `minlength` attribute and therefore HTML5 constraint\n *     validation is not available.\n *   </li>\n *   <li>\n *     The `ngMinlength` value must be an expression, while the `minlength` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngMinlengthDirective\" module=\"ngMinlengthExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngMinlengthExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.minlength = 3;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"minlength\">Set a minlength: </label>\n *         <input type=\"number\" ng-model=\"minlength\" id=\"minlength\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current minlength: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-minlength=\"minlength\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default minlength', function() {\n         input.sendKeys('ab');\n         expect(model.getText()).not.toContain('ab');\n\n         input.sendKeys('abc');\n         expect(model.getText()).toContain('abc');\n       });\n *   </file>\n * </example>\n */\nvar minlengthDirective = ['$parse', function($parse) {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var minlength = attr.minlength || $parse(attr.ngMinlength)(scope);\n      var minlengthParsed = parseLength(minlength) || -1;\n\n      attr.$observe('minlength', function(value) {\n        if (minlength !== value) {\n          minlengthParsed = parseLength(value) || -1;\n          minlength = value;\n          ctrl.$validate();\n        }\n\n      });\n      ctrl.$validators.minlength = function(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || viewValue.length >= minlengthParsed;\n      };\n    }\n  };\n}];\n\n\nfunction parsePatternAttr(regex, patternExp, elm) {\n  if (!regex) return undefined;\n\n  if (isString(regex)) {\n    regex = new RegExp('^' + regex + '$');\n  }\n\n  if (!regex.test) {\n    throw minErr('ngPattern')('noregexp',\n      'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,\n      regex, startingTag(elm));\n  }\n\n  return regex;\n}\n\nfunction parseLength(val) {\n  var intVal = toInt(val);\n  return isNumberNaN(intVal) ? -1 : intVal;\n}\n\nif (window.angular.bootstrap) {\n  // AngularJS is already loaded, so we can return here...\n  if (window.console) {\n    console.log('WARNING: Tried to load AngularJS more than once.');\n  }\n  return;\n}\n\n// try to bind to jquery now so that one can write jqLite(fn)\n// but we will rebind on bootstrap again.\nbindJQuery();\n\npublishExternalAPI(angular);\n\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-us\",\n  \"localeID\": \"en_US\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n\n  jqLite(function() {\n    angularInit(window.document, bootstrap);\n  });\n\n})(window);\n\n!window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');"
  },
  {
    "path": "app/vendor/angular/errors.json",
    "content": "{\"id\":\"ng\",\"generated\":\"Tue Mar 12 2019 09:40:19 GMT+0000 (UTC)\",\"errors\":{\"ng\":{\"areq\":\"Argument '{0}' is {1}\",\"cpta\":\"Can't copy! TypedArray destination cannot be mutated.\",\"test\":\"no injector found for element argument to getTestability\",\"cpws\":\"Can't copy! Making copies of Window or Scope instances is not supported.\",\"aobj\":\"Argument '{0}' must be an object\",\"btstrpd\":\"App already bootstrapped with this element '{0}'\",\"cpi\":\"Can't copy! Source and destination are identical.\",\"badname\":\"hasOwnProperty is not a valid {0} name\"},\"$http\":{\"baddata\":\"Data must be a valid JSON object. Received: \\\"{0}\\\". Parse error: \\\"{1}\\\"\",\"badreq\":\"Http request configuration url must be a string or a $sce trusted object.  Received: {0}\",\"badjsonp\":\"Illegal use of callback param, \\\"{0}\\\", in url, \\\"{1}\\\"\"},\"ngPattern\":{\"noregexp\":\"Expected {0} to be a RegExp but was {1}. Element: {2}\"},\"$parse\":{\"ueoe\":\"Unexpected end of expression: {0}\",\"lexerr\":\"Lexer Error: {0} at column{1} in expression [{2}].\",\"esc\":\"IMPOSSIBLE\",\"lval\":\"Trying to assign a value to a non l-value\",\"syntax\":\"Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].\"},\"orderBy\":{\"notarray\":\"Expected array but received: {0}\"},\"$q\":{\"norslvr\":\"Expected resolverFn, got '{0}'\",\"qcycle\":\"Expected promise to be resolved with value other than itself '{0}'\"},\"$injector\":{\"pget\":\"Provider '{0}' must define $get factory method.\",\"cdep\":\"Circular dependency found: {0}\",\"nomod\":\"Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.\",\"strictdi\":\"{0} is not using explicit annotation and cannot be invoked in strict mode\",\"modulerr\":\"Failed to instantiate module {0} due to:\\n{1}\",\"undef\":\"Provider '{0}' must return a value from $get factory method.\",\"unpr\":\"Unknown provider: {0}\",\"itkn\":\"Incorrect injection token! Expected service name as string, got {0}\"},\"ngTransclude\":{\"orphan\":\"Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}\"},\"ngModel\":{\"nopromise\":\"Expected asynchronous validator to return a promise but got '{0}' instead.\",\"nonassign\":\"Expression '{0}' is non-assignable. Element: {1}\",\"datefmt\":\"Expected `{0}` to be a date\",\"constexpr\":\"Expected constant expression for `{0}`, but saw `{1}`.\",\"numfmt\":\"Expected `{0}` to be a number\"},\"ngOptions\":{\"iexp\":\"Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}\"},\"$rootScope\":{\"inprog\":\"{0} already in progress\",\"infdig\":\"{0} $digest() iterations reached. Aborting!\\nWatchers fired in the last 5 iterations: {1}\"},\"$compile\":{\"selmulti\":\"Binding to the 'multiple' attribute is not supported. Element: {0}\",\"ctreq\":\"Controller '{0}', required by directive '{1}', can't be found!\",\"tplrt\":\"Template for directive '{0}' must have exactly one root element. {1}\",\"iscp\":\"Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}\",\"baddir\":\"Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces\",\"multilink\":\"This element has already been linked.\",\"noctrl\":\"Cannot bind to controller without directive '{0}'s controller.\",\"srcset\":\"Can't pass trusted values to `{0}`: \\\"{1}\\\"\",\"multidir\":\"Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}\",\"badrestrict\":\"Restrict property '{0}' of directive '{1}' is invalid\",\"uterdir\":\"Unterminated attribute, found '{0}' but no matching '{1}' found.\",\"ctxoverride\":\"Property context '{0}.{1}' already set to '{2}', cannot override to '{3}'.\",\"infchng\":\"{0} $onChanges() iterations reached. Aborting!\\n\",\"reqslot\":\"Required transclusion slot `{0}` was not filled.\",\"nodomevents\":\"Interpolations for HTML DOM event attributes are disallowed\",\"nonassign\":\"Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!\",\"missingattr\":\"Attribute '{0}' of '{1}' is non-optional and must be set!\",\"noslot\":\"No parent directive that requires a transclusion with slot name \\\"{0}\\\". Element: {1}\"},\"ngRepeat\":{\"badident\":\"alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.\",\"iexp\":\"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\"dupes\":\"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}\",\"iidexp\":\"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\"},\"$sce\":{\"imatcher\":\"Matchers may only be \\\"self\\\", string patterns or RegExp objects\",\"icontext\":\"Attempted to trust a value in invalid context. Context: {0}; Value: {1}\",\"iwcard\":\"Illegal sequence *** in string matcher.  String: {0}\",\"insecurl\":\"Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}\",\"iequirks\":\"Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.\",\"unsafe\":\"Attempting to use an unsafe value in a safe context.\",\"itype\":\"Attempted to trust a non-string value in a content requiring a string: Context: {0}\"},\"$timeout\":{\"badprom\":\"`$timeout.cancel()` called with a promise that was not generated by `$timeout()`.\"},\"ngRef\":{\"nonassign\":\"Expression in ngRef=\\\"{0}\\\" is non-assignable!\",\"noctrl\":\"The controller for ngRefRead=\\\"{0}\\\" could not be found on ngRef=\\\"{1}\\\"\"},\"$controller\":{\"ctrlfmt\":\"Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.\",\"ctrlreg\":\"The controller with the name '{0}' is not registered.\",\"noscp\":\"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\"},\"jqLite\":{\"offargs\":\"jqLite#off() does not support the `selector` argument\",\"onargs\":\"jqLite#on() does not support the `selector` or `eventData` parameters\",\"nosel\":\"Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element\"},\"$animate\":{\"notcsel\":\"Expecting class selector starting with '.' got '{0}'.\",\"nongcls\":\"$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \\\"{0}\\\" CSS class.\"},\"$templateRequest\":{\"tpload\":\"Failed to load template: {0} (HTTP status: {1} {2})\"},\"filter\":{\"notarray\":\"Expected array but received: {0}\"},\"$interval\":{\"badprom\":\"`$interval.cancel()` called with a promise that was not generated by `$interval()`.\"},\"$location\":{\"nostate\":\"History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API\",\"badpath\":\"Invalid url \\\"{0}\\\".\",\"ipthprfx\":\"Invalid url \\\"{0}\\\", missing path prefix \\\"{1}\\\".\",\"isrcharg\":\"The first argument of the `$location#search()` call must be a string or an object.\",\"nobase\":\"$location in HTML5 mode requires a <base> tag to be present!\"},\"$cacheFactory\":{\"iid\":\"CacheId '{0}' is already taken!\"},\"$interpolate\":{\"noconcat\":\"Error while interpolating: {0}\\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce\",\"interr\":\"Can't interpolate: {0}\\n{1}\",\"nochgmustache\":\"angular-message-format.js currently does not allow you to use custom start and end symbols for interpolation.\",\"reqcomma\":\"Expected a comma after the keyword “{0}” at line {1}, column {2} of text “{3}”\",\"untermstr\":\"The string beginning at line {0}, column {1} is unterminated in text “{2}”\",\"badexpr\":\"Unexpected operator “{0}” at line {1}, column {2} in text. Was expecting “{3}”. Text: “{4}”\",\"dupvalue\":\"The choice “{0}” is specified more than once. Duplicate key is at line {1}, column {2} in text “{3}”\",\"unsafe\":\"Use of select/plural MessageFormat syntax is currently disallowed in a secure context ({0}).  At line {1}, column {2} of text “{3}”\",\"reqother\":\"“other” is a required option.\",\"reqendinterp\":\"Expecting end of interpolation symbol, “{0}”, at line {1}, column {2} in text “{3}”\",\"reqarg\":\"Expected one of “plural” or “select” at line {0}, column {1} of text “{2}”\",\"wantstring\":\"Expected the beginning of a string at line {0}, column {1} in text “{2}”\",\"logicbug\":\"The messageformat parser has encountered an internal error.  Please file a github issue against the AngularJS project and provide this message text that triggers the bug.  Text: “{0}”\",\"reqopenbrace\":\"The plural choice “{0}” must be followed by a message in braces at line {1}, column {2} in text “{3}”\",\"unknarg\":\"Unsupported keyword “{0}” at line {0}, column {1}. Only “plural” and “select” are currently supported.  Text: “{3}”\",\"reqendbrace\":\"The plural/select choice “{0}” message starting at line {1}, column {2} does not have an ending closing brace. Text “{3}”\"},\"$resource\":{\"badargs\":\"Expected up to 4 arguments [params, data, success, error], got {0} arguments\",\"badmember\":\"Dotted member path \\\"@{0}\\\" is invalid.\",\"badname\":\"hasOwnProperty is not a valid parameter name.\",\"badcfg\":\"Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})\"},\"$route\":{\"norout\":\"Tried updating route with no current route\"},\"linky\":{\"notstring\":\"Expected string but received: {0}\"},\"$sanitize\":{\"noinert\":\"Can't create an inert html document\",\"uinput\":\"Failed to sanitize html because the input is unstable\",\"elclob\":\"Failed to sanitize html because the element is clobbered: {0}\"}}}"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_af-na.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vm.\",\n      \"nm.\"\n    ],\n    \"DAY\": [\n      \"Sondag\",\n      \"Maandag\",\n      \"Dinsdag\",\n      \"Woensdag\",\n      \"Donderdag\",\n      \"Vrydag\",\n      \"Saterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.C.\",\n      \"n.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januarie\",\n      \"Februarie\",\n      \"Maart\",\n      \"April\",\n      \"Mei\",\n      \"Junie\",\n      \"Julie\",\n      \"Augustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Ma.\",\n      \"Di.\",\n      \"Wo.\",\n      \"Do.\",\n      \"Vr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"Mrt.\",\n      \"Apr.\",\n      \"Mei\",\n      \"Jun.\",\n      \"Jul.\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januarie\",\n      \"Februarie\",\n      \"Maart\",\n      \"April\",\n      \"Mei\",\n      \"Junie\",\n      \"Julie\",\n      \"Augustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"af-na\",\n  \"localeID\": \"af_NA\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_af-za.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vm.\",\n      \"nm.\"\n    ],\n    \"DAY\": [\n      \"Sondag\",\n      \"Maandag\",\n      \"Dinsdag\",\n      \"Woensdag\",\n      \"Donderdag\",\n      \"Vrydag\",\n      \"Saterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.C.\",\n      \"n.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januarie\",\n      \"Februarie\",\n      \"Maart\",\n      \"April\",\n      \"Mei\",\n      \"Junie\",\n      \"Julie\",\n      \"Augustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Ma.\",\n      \"Di.\",\n      \"Wo.\",\n      \"Do.\",\n      \"Vr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"Mrt.\",\n      \"Apr.\",\n      \"Mei\",\n      \"Jun.\",\n      \"Jul.\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januarie\",\n      \"Februarie\",\n      \"Maart\",\n      \"April\",\n      \"Mei\",\n      \"Junie\",\n      \"Julie\",\n      \"Augustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"af-za\",\n  \"localeID\": \"af_ZA\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_af.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vm.\",\n      \"nm.\"\n    ],\n    \"DAY\": [\n      \"Sondag\",\n      \"Maandag\",\n      \"Dinsdag\",\n      \"Woensdag\",\n      \"Donderdag\",\n      \"Vrydag\",\n      \"Saterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.C.\",\n      \"n.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januarie\",\n      \"Februarie\",\n      \"Maart\",\n      \"April\",\n      \"Mei\",\n      \"Junie\",\n      \"Julie\",\n      \"Augustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Ma.\",\n      \"Di.\",\n      \"Wo.\",\n      \"Do.\",\n      \"Vr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"Mrt.\",\n      \"Apr.\",\n      \"Mei\",\n      \"Jun.\",\n      \"Jul.\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januarie\",\n      \"Februarie\",\n      \"Maart\",\n      \"April\",\n      \"Mei\",\n      \"Junie\",\n      \"Julie\",\n      \"Augustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"af\",\n  \"localeID\": \"af\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_agq-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.g\",\n      \"a.k\"\n    ],\n    \"DAY\": [\n      \"tsu\\u0294nts\\u0268\",\n      \"tsu\\u0294ukp\\u00e0\",\n      \"tsu\\u0294ugh\\u0254e\",\n      \"tsu\\u0294ut\\u0254\\u0300ml\\u00f2\",\n      \"tsu\\u0294um\\u00e8\",\n      \"tsu\\u0294ugh\\u0268\\u0302m\",\n      \"tsu\\u0294ndz\\u0268k\\u0254\\u0294\\u0254\"\n    ],\n    \"ERANAMES\": [\n      \"S\\u011be K\\u0268\\u0300lesto\",\n      \"B\\u01cea K\\u0268\\u0300lesto\"\n    ],\n    \"ERAS\": [\n      \"SK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300n\\u00f9m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300k\\u0197\\u0300z\\u00f9\\u0294\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300d\\u0289\\u0300gh\\u00e0\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u01ceaf\\u0289\\u0304gh\\u0101\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8s\\u00e8e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300nz\\u00f9gh\\u00f2\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300d\\u00f9mlo\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300kw\\u00eef\\u0254\\u0300e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300f\\u0289\\u0300gh\\u00e0dzugh\\u00f9\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300gh\\u01d4uwel\\u0254\\u0300m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300chwa\\u0294\\u00e0kaa wo\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8fw\\u00f2o\"\n    ],\n    \"SHORTDAY\": [\n      \"nts\",\n      \"kpa\",\n      \"gh\\u0254\",\n      \"t\\u0254m\",\n      \"ume\",\n      \"gh\\u0268\",\n      \"dzk\"\n    ],\n    \"SHORTMONTH\": [\n      \"n\\u00f9m\",\n      \"k\\u0268z\",\n      \"t\\u0268d\",\n      \"taa\",\n      \"see\",\n      \"nzu\",\n      \"dum\",\n      \"f\\u0254e\",\n      \"dzu\",\n      \"l\\u0254m\",\n      \"kaa\",\n      \"fwo\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300n\\u00f9m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300k\\u0197\\u0300z\\u00f9\\u0294\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300d\\u0289\\u0300gh\\u00e0\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u01ceaf\\u0289\\u0304gh\\u0101\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8s\\u00e8e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300nz\\u00f9gh\\u00f2\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300d\\u00f9mlo\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300kw\\u00eef\\u0254\\u0300e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300f\\u0289\\u0300gh\\u00e0dzugh\\u00f9\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300gh\\u01d4uwel\\u0254\\u0300m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300chwa\\u0294\\u00e0kaa wo\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8fw\\u00f2o\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"agq-cm\",\n  \"localeID\": \"agq_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_agq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.g\",\n      \"a.k\"\n    ],\n    \"DAY\": [\n      \"tsu\\u0294nts\\u0268\",\n      \"tsu\\u0294ukp\\u00e0\",\n      \"tsu\\u0294ugh\\u0254e\",\n      \"tsu\\u0294ut\\u0254\\u0300ml\\u00f2\",\n      \"tsu\\u0294um\\u00e8\",\n      \"tsu\\u0294ugh\\u0268\\u0302m\",\n      \"tsu\\u0294ndz\\u0268k\\u0254\\u0294\\u0254\"\n    ],\n    \"ERANAMES\": [\n      \"S\\u011be K\\u0268\\u0300lesto\",\n      \"B\\u01cea K\\u0268\\u0300lesto\"\n    ],\n    \"ERAS\": [\n      \"SK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300n\\u00f9m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300k\\u0197\\u0300z\\u00f9\\u0294\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300d\\u0289\\u0300gh\\u00e0\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u01ceaf\\u0289\\u0304gh\\u0101\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8s\\u00e8e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300nz\\u00f9gh\\u00f2\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300d\\u00f9mlo\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300kw\\u00eef\\u0254\\u0300e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300f\\u0289\\u0300gh\\u00e0dzugh\\u00f9\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300gh\\u01d4uwel\\u0254\\u0300m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300chwa\\u0294\\u00e0kaa wo\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8fw\\u00f2o\"\n    ],\n    \"SHORTDAY\": [\n      \"nts\",\n      \"kpa\",\n      \"gh\\u0254\",\n      \"t\\u0254m\",\n      \"ume\",\n      \"gh\\u0268\",\n      \"dzk\"\n    ],\n    \"SHORTMONTH\": [\n      \"n\\u00f9m\",\n      \"k\\u0268z\",\n      \"t\\u0268d\",\n      \"taa\",\n      \"see\",\n      \"nzu\",\n      \"dum\",\n      \"f\\u0254e\",\n      \"dzu\",\n      \"l\\u0254m\",\n      \"kaa\",\n      \"fwo\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300n\\u00f9m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300k\\u0197\\u0300z\\u00f9\\u0294\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300d\\u0289\\u0300gh\\u00e0\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u01ceaf\\u0289\\u0304gh\\u0101\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8s\\u00e8e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300nz\\u00f9gh\\u00f2\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300d\\u00f9mlo\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300kw\\u00eef\\u0254\\u0300e\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300t\\u0197\\u0300f\\u0289\\u0300gh\\u00e0dzugh\\u00f9\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300gh\\u01d4uwel\\u0254\\u0300m\",\n      \"ndz\\u0254\\u0300\\u014b\\u0254\\u0300chwa\\u0294\\u00e0kaa wo\",\n      \"ndz\\u0254\\u0300\\u014b\\u00e8fw\\u00f2o\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"agq\",\n  \"localeID\": \"agq\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ak-gh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AN\",\n      \"EW\"\n    ],\n    \"DAY\": [\n      \"Kwesida\",\n      \"Dwowda\",\n      \"Benada\",\n      \"Wukuda\",\n      \"Yawda\",\n      \"Fida\",\n      \"Memeneda\"\n    ],\n    \"ERANAMES\": [\n      \"Ansa Kristo\",\n      \"Kristo Ekyiri\"\n    ],\n    \"ERAS\": [\n      \"AK\",\n      \"KE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Sanda-\\u0186p\\u025bp\\u0254n\",\n      \"Kwakwar-\\u0186gyefuo\",\n      \"Eb\\u0254w-\\u0186benem\",\n      \"Eb\\u0254bira-Oforisuo\",\n      \"Esusow Aketseaba-K\\u0254t\\u0254nimba\",\n      \"Obirade-Ay\\u025bwohomumu\",\n      \"Ay\\u025bwoho-Kitawonsa\",\n      \"Difuu-\\u0186sandaa\",\n      \"Fankwa-\\u0190b\\u0254\",\n      \"\\u0186b\\u025bs\\u025b-Ahinime\",\n      \"\\u0186ber\\u025bf\\u025bw-Obubuo\",\n      \"Mumu-\\u0186p\\u025bnimba\"\n    ],\n    \"SHORTDAY\": [\n      \"Kwe\",\n      \"Dwo\",\n      \"Ben\",\n      \"Wuk\",\n      \"Yaw\",\n      \"Fia\",\n      \"Mem\"\n    ],\n    \"SHORTMONTH\": [\n      \"S-\\u0186\",\n      \"K-\\u0186\",\n      \"E-\\u0186\",\n      \"E-O\",\n      \"E-K\",\n      \"O-A\",\n      \"A-K\",\n      \"D-\\u0186\",\n      \"F-\\u0190\",\n      \"\\u0186-A\",\n      \"\\u0186-O\",\n      \"M-\\u0186\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Sanda-\\u0186p\\u025bp\\u0254n\",\n      \"Kwakwar-\\u0186gyefuo\",\n      \"Eb\\u0254w-\\u0186benem\",\n      \"Eb\\u0254bira-Oforisuo\",\n      \"Esusow Aketseaba-K\\u0254t\\u0254nimba\",\n      \"Obirade-Ay\\u025bwohomumu\",\n      \"Ay\\u025bwoho-Kitawonsa\",\n      \"Difuu-\\u0186sandaa\",\n      \"Fankwa-\\u0190b\\u0254\",\n      \"\\u0186b\\u025bs\\u025b-Ahinime\",\n      \"\\u0186ber\\u025bf\\u025bw-Obubuo\",\n      \"Mumu-\\u0186p\\u025bnimba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y MMMM dd\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"yy/MM/dd h:mm a\",\n    \"shortDate\": \"yy/MM/dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GHS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ak-gh\",\n  \"localeID\": \"ak_GH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ak.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AN\",\n      \"EW\"\n    ],\n    \"DAY\": [\n      \"Kwesida\",\n      \"Dwowda\",\n      \"Benada\",\n      \"Wukuda\",\n      \"Yawda\",\n      \"Fida\",\n      \"Memeneda\"\n    ],\n    \"ERANAMES\": [\n      \"Ansa Kristo\",\n      \"Kristo Ekyiri\"\n    ],\n    \"ERAS\": [\n      \"AK\",\n      \"KE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Sanda-\\u0186p\\u025bp\\u0254n\",\n      \"Kwakwar-\\u0186gyefuo\",\n      \"Eb\\u0254w-\\u0186benem\",\n      \"Eb\\u0254bira-Oforisuo\",\n      \"Esusow Aketseaba-K\\u0254t\\u0254nimba\",\n      \"Obirade-Ay\\u025bwohomumu\",\n      \"Ay\\u025bwoho-Kitawonsa\",\n      \"Difuu-\\u0186sandaa\",\n      \"Fankwa-\\u0190b\\u0254\",\n      \"\\u0186b\\u025bs\\u025b-Ahinime\",\n      \"\\u0186ber\\u025bf\\u025bw-Obubuo\",\n      \"Mumu-\\u0186p\\u025bnimba\"\n    ],\n    \"SHORTDAY\": [\n      \"Kwe\",\n      \"Dwo\",\n      \"Ben\",\n      \"Wuk\",\n      \"Yaw\",\n      \"Fia\",\n      \"Mem\"\n    ],\n    \"SHORTMONTH\": [\n      \"S-\\u0186\",\n      \"K-\\u0186\",\n      \"E-\\u0186\",\n      \"E-O\",\n      \"E-K\",\n      \"O-A\",\n      \"A-K\",\n      \"D-\\u0186\",\n      \"F-\\u0190\",\n      \"\\u0186-A\",\n      \"\\u0186-O\",\n      \"M-\\u0186\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Sanda-\\u0186p\\u025bp\\u0254n\",\n      \"Kwakwar-\\u0186gyefuo\",\n      \"Eb\\u0254w-\\u0186benem\",\n      \"Eb\\u0254bira-Oforisuo\",\n      \"Esusow Aketseaba-K\\u0254t\\u0254nimba\",\n      \"Obirade-Ay\\u025bwohomumu\",\n      \"Ay\\u025bwoho-Kitawonsa\",\n      \"Difuu-\\u0186sandaa\",\n      \"Fankwa-\\u0190b\\u0254\",\n      \"\\u0186b\\u025bs\\u025b-Ahinime\",\n      \"\\u0186ber\\u025bf\\u025bw-Obubuo\",\n      \"Mumu-\\u0186p\\u025bnimba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y MMMM dd\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"yy/MM/dd h:mm a\",\n    \"shortDate\": \"yy/MM/dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GHS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ak\",\n  \"localeID\": \"ak\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_am-et.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u1325\\u12cb\\u1275\",\n      \"\\u12a8\\u1230\\u12d3\\u1275\"\n    ],\n    \"DAY\": [\n      \"\\u12a5\\u1211\\u12f5\",\n      \"\\u1230\\u129e\",\n      \"\\u121b\\u12ad\\u1230\\u129e\",\n      \"\\u1228\\u1261\\u12d5\",\n      \"\\u1210\\u1219\\u1235\",\n      \"\\u12d3\\u122d\\u1265\",\n      \"\\u1245\\u12f3\\u121c\"\n    ],\n    \"ERANAMES\": [\n      \"\\u12d3\\u1218\\u1270 \\u12d3\\u1208\\u121d\",\n      \"\\u12d3\\u1218\\u1270 \\u121d\\u1215\\u1228\\u1275\"\n    ],\n    \"ERAS\": [\n      \"\\u12d3/\\u12d3\",\n      \"\\u12d3/\\u121d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1303\\u1295\\u12e9\\u12c8\\u122a\",\n      \"\\u134c\\u1265\\u1229\\u12c8\\u122a\",\n      \"\\u121b\\u122d\\u127d\",\n      \"\\u12a4\\u1355\\u122a\\u120d\",\n      \"\\u121c\\u12ed\",\n      \"\\u1301\\u1295\",\n      \"\\u1301\\u120b\\u12ed\",\n      \"\\u12a6\\u1308\\u1235\\u1275\",\n      \"\\u1234\\u1355\\u1274\\u121d\\u1260\\u122d\",\n      \"\\u12a6\\u12ad\\u1276\\u1260\\u122d\",\n      \"\\u1296\\u126c\\u121d\\u1260\\u122d\",\n      \"\\u12f2\\u1234\\u121d\\u1260\\u122d\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u12a5\\u1211\\u12f5\",\n      \"\\u1230\\u129e\",\n      \"\\u121b\\u12ad\\u1230\",\n      \"\\u1228\\u1261\\u12d5\",\n      \"\\u1210\\u1219\\u1235\",\n      \"\\u12d3\\u122d\\u1265\",\n      \"\\u1245\\u12f3\\u121c\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1303\\u1295\\u12e9\",\n      \"\\u134c\\u1265\\u1229\",\n      \"\\u121b\\u122d\\u127d\",\n      \"\\u12a4\\u1355\\u122a\",\n      \"\\u121c\\u12ed\",\n      \"\\u1301\\u1295\",\n      \"\\u1301\\u120b\\u12ed\",\n      \"\\u12a6\\u1308\\u1235\",\n      \"\\u1234\\u1355\\u1274\",\n      \"\\u12a6\\u12ad\\u1276\",\n      \"\\u1296\\u126c\\u121d\",\n      \"\\u12f2\\u1234\\u121d\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1303\\u1295\\u12e9\\u12c8\\u122a\",\n      \"\\u134c\\u1265\\u1229\\u12c8\\u122a\",\n      \"\\u121b\\u122d\\u127d\",\n      \"\\u12a4\\u1355\\u122a\\u120d\",\n      \"\\u121c\\u12ed\",\n      \"\\u1301\\u1295\",\n      \"\\u1301\\u120b\\u12ed\",\n      \"\\u12a6\\u1308\\u1235\\u1275\",\n      \"\\u1234\\u1355\\u1274\\u121d\\u1260\\u122d\",\n      \"\\u12a6\\u12ad\\u1276\\u1260\\u122d\",\n      \"\\u1296\\u126c\\u121d\\u1260\\u122d\",\n      \"\\u12f2\\u1234\\u121d\\u1260\\u122d\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE \\u1363d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Birr\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"am-et\",\n  \"localeID\": \"am_ET\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_am.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u1325\\u12cb\\u1275\",\n      \"\\u12a8\\u1230\\u12d3\\u1275\"\n    ],\n    \"DAY\": [\n      \"\\u12a5\\u1211\\u12f5\",\n      \"\\u1230\\u129e\",\n      \"\\u121b\\u12ad\\u1230\\u129e\",\n      \"\\u1228\\u1261\\u12d5\",\n      \"\\u1210\\u1219\\u1235\",\n      \"\\u12d3\\u122d\\u1265\",\n      \"\\u1245\\u12f3\\u121c\"\n    ],\n    \"ERANAMES\": [\n      \"\\u12d3\\u1218\\u1270 \\u12d3\\u1208\\u121d\",\n      \"\\u12d3\\u1218\\u1270 \\u121d\\u1215\\u1228\\u1275\"\n    ],\n    \"ERAS\": [\n      \"\\u12d3/\\u12d3\",\n      \"\\u12d3/\\u121d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1303\\u1295\\u12e9\\u12c8\\u122a\",\n      \"\\u134c\\u1265\\u1229\\u12c8\\u122a\",\n      \"\\u121b\\u122d\\u127d\",\n      \"\\u12a4\\u1355\\u122a\\u120d\",\n      \"\\u121c\\u12ed\",\n      \"\\u1301\\u1295\",\n      \"\\u1301\\u120b\\u12ed\",\n      \"\\u12a6\\u1308\\u1235\\u1275\",\n      \"\\u1234\\u1355\\u1274\\u121d\\u1260\\u122d\",\n      \"\\u12a6\\u12ad\\u1276\\u1260\\u122d\",\n      \"\\u1296\\u126c\\u121d\\u1260\\u122d\",\n      \"\\u12f2\\u1234\\u121d\\u1260\\u122d\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u12a5\\u1211\\u12f5\",\n      \"\\u1230\\u129e\",\n      \"\\u121b\\u12ad\\u1230\",\n      \"\\u1228\\u1261\\u12d5\",\n      \"\\u1210\\u1219\\u1235\",\n      \"\\u12d3\\u122d\\u1265\",\n      \"\\u1245\\u12f3\\u121c\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1303\\u1295\\u12e9\",\n      \"\\u134c\\u1265\\u1229\",\n      \"\\u121b\\u122d\\u127d\",\n      \"\\u12a4\\u1355\\u122a\",\n      \"\\u121c\\u12ed\",\n      \"\\u1301\\u1295\",\n      \"\\u1301\\u120b\\u12ed\",\n      \"\\u12a6\\u1308\\u1235\",\n      \"\\u1234\\u1355\\u1274\",\n      \"\\u12a6\\u12ad\\u1276\",\n      \"\\u1296\\u126c\\u121d\",\n      \"\\u12f2\\u1234\\u121d\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1303\\u1295\\u12e9\\u12c8\\u122a\",\n      \"\\u134c\\u1265\\u1229\\u12c8\\u122a\",\n      \"\\u121b\\u122d\\u127d\",\n      \"\\u12a4\\u1355\\u122a\\u120d\",\n      \"\\u121c\\u12ed\",\n      \"\\u1301\\u1295\",\n      \"\\u1301\\u120b\\u12ed\",\n      \"\\u12a6\\u1308\\u1235\\u1275\",\n      \"\\u1234\\u1355\\u1274\\u121d\\u1260\\u122d\",\n      \"\\u12a6\\u12ad\\u1276\\u1260\\u122d\",\n      \"\\u1296\\u126c\\u121d\\u1260\\u122d\",\n      \"\\u12f2\\u1234\\u121d\\u1260\\u122d\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE \\u1363d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Birr\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"am\",\n  \"localeID\": \"am\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-001.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-001\",\n  \"localeID\": \"ar_001\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-ae.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-ae\",\n  \"localeID\": \"ar_AE\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-bh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 3,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-bh\",\n  \"localeID\": \"ar_BH\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-dj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Fdj\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-dj\",\n  \"localeID\": \"ar_DJ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-dz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0627\\u0646\\u0641\\u064a\",\n      \"\\u0641\\u064a\\u0641\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0641\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u062c\\u0648\\u0627\\u0646\",\n      \"\\u062c\\u0648\\u064a\\u0644\\u064a\\u0629\",\n      \"\\u0623\\u0648\\u062a\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u0641\\u064a\",\n      \"\\u0641\\u064a\\u0641\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0641\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u062c\\u0648\\u0627\\u0646\",\n      \"\\u062c\\u0648\\u064a\\u0644\\u064a\\u0629\",\n      \"\\u0623\\u0648\\u062a\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u0641\\u064a\",\n      \"\\u0641\\u064a\\u0641\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0641\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u062c\\u0648\\u0627\\u0646\",\n      \"\\u062c\\u0648\\u064a\\u0644\\u064a\\u0629\",\n      \"\\u0623\\u0648\\u062a\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ar-dz\",\n  \"localeID\": \"ar_DZ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-eg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-eg\",\n  \"localeID\": \"ar_EG\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-eh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ar-eh\",\n  \"localeID\": \"ar_EH\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-er.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Nfk\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-er\",\n  \"localeID\": \"ar_ER\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-il.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y H:mm:ss\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d\\u200f/M\\u200f/y H:mm\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20aa\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-il\",\n  \"localeID\": \"ar_IL\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-iq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-iq\",\n  \"localeID\": \"ar_IQ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-jo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 3,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-jo\",\n  \"localeID\": \"ar_JO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-km.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y HH:mm:ss\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d\\u200f/M\\u200f/y HH:mm\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CF\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-km\",\n  \"localeID\": \"ar_KM\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-kw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 3,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-kw\",\n  \"localeID\": \"ar_KW\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-lb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"L\\u00a3\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-lb\",\n  \"localeID\": \"ar_LB\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-ly.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 3,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ar-ly\",\n  \"localeID\": \"ar_LY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-ma.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\\u0632\",\n      \"\\u063a\\u0634\\u062a\",\n      \"\\u0634\\u062a\\u0646\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0646\\u0628\\u0631\",\n      \"\\u062f\\u062c\\u0646\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\\u0632\",\n      \"\\u063a\\u0634\\u062a\",\n      \"\\u0634\\u062a\\u0646\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0646\\u0628\\u0631\",\n      \"\\u062f\\u062c\\u0646\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\\u0632\",\n      \"\\u063a\\u0634\\u062a\",\n      \"\\u0634\\u062a\\u0646\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0646\\u0628\\u0631\",\n      \"\\u062f\\u062c\\u0646\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y HH:mm:ss\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d\\u200f/M\\u200f/y HH:mm\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ar-ma\",\n  \"localeID\": \"ar_MA\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-mr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0625\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0634\\u062a\",\n      \"\\u0634\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u062c\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0625\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0634\\u062a\",\n      \"\\u0634\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u062c\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0625\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0634\\u062a\",\n      \"\\u0634\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u062c\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MRO\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-mr\",\n  \"localeID\": \"ar_MR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-om.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 3,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-om\",\n  \"localeID\": \"ar_OM\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-ps.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20aa\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-ps\",\n  \"localeID\": \"ar_PS\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-qa.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-qa\",\n  \"localeID\": \"ar_QA\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-sa.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-sa\",\n  \"localeID\": \"ar_SA\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-sd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SDG\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-sd\",\n  \"localeID\": \"ar_SD\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-so.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SOS\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-so\",\n  \"localeID\": \"ar_SO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-ss.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-ss\",\n  \"localeID\": \"ar_SS\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-sy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0634\\u0628\\u0627\\u0637\",\n      \"\\u0622\\u0630\\u0627\\u0631\",\n      \"\\u0646\\u064a\\u0633\\u0627\\u0646\",\n      \"\\u0623\\u064a\\u0627\\u0631\",\n      \"\\u062d\\u0632\\u064a\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u0645\\u0648\\u0632\",\n      \"\\u0622\\u0628\",\n      \"\\u0623\\u064a\\u0644\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u064a\\u0646 \\u0627\\u0644\\u062b\\u0627\\u0646\\u064a\",\n      \"\\u0643\\u0627\\u0646\\u0648\\u0646 \\u0627\\u0644\\u0623\\u0648\\u0644\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-sy\",\n  \"localeID\": \"ar_SY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-td.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-td\",\n  \"localeID\": \"ar_TD\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-tn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0627\\u0646\\u0641\\u064a\",\n      \"\\u0641\\u064a\\u0641\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0641\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u062c\\u0648\\u0627\\u0646\",\n      \"\\u062c\\u0648\\u064a\\u0644\\u064a\\u0629\",\n      \"\\u0623\\u0648\\u062a\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u0641\\u064a\",\n      \"\\u0641\\u064a\\u0641\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0641\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u062c\\u0648\\u0627\\u0646\",\n      \"\\u062c\\u0648\\u064a\\u0644\\u064a\\u0629\",\n      \"\\u0623\\u0648\\u062a\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u0641\\u064a\",\n      \"\\u0641\\u064a\\u0641\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0641\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u062c\\u0648\\u0627\\u0646\",\n      \"\\u062c\\u0648\\u064a\\u0644\\u064a\\u0629\",\n      \"\\u0623\\u0648\\u062a\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 3,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ar-tn\",\n  \"localeID\": \"ar_TN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-xb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u061c\\u202eAM\\u202c\\u061c\",\n      \"\\u061c\\u202ePM\\u202c\\u061c\"\n    ],\n    \"DAY\": [\n      \"\\u061c\\u202eSunday\\u202c\\u061c\",\n      \"\\u061c\\u202eMonday\\u202c\\u061c\",\n      \"\\u061c\\u202eTuesday\\u202c\\u061c\",\n      \"\\u061c\\u202eWednesday\\u202c\\u061c\",\n      \"\\u061c\\u202eThursday\\u202c\\u061c\",\n      \"\\u061c\\u202eFriday\\u202c\\u061c\",\n      \"\\u061c\\u202eSaturday\\u202c\\u061c\"\n    ],\n    \"ERANAMES\": [\n      \"\\u061c\\u202eBefore\\u202c\\u061c \\u061c\\u202eChrist\\u202c\\u061c\",\n      \"\\u061c\\u202eAnno\\u202c\\u061c \\u061c\\u202eDomini\\u202c\\u061c\"\n    ],\n    \"ERAS\": [\n      \"\\u061c\\u202eBC\\u202c\\u061c\",\n      \"\\u061c\\u202eAD\\u202c\\u061c\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u061c\\u202eJanuary\\u202c\\u061c\",\n      \"\\u061c\\u202eFebruary\\u202c\\u061c\",\n      \"\\u061c\\u202eMarch\\u202c\\u061c\",\n      \"\\u061c\\u202eApril\\u202c\\u061c\",\n      \"\\u061c\\u202eMay\\u202c\\u061c\",\n      \"\\u061c\\u202eJune\\u202c\\u061c\",\n      \"\\u061c\\u202eJuly\\u202c\\u061c\",\n      \"\\u061c\\u202eAugust\\u202c\\u061c\",\n      \"\\u061c\\u202eSeptember\\u202c\\u061c\",\n      \"\\u061c\\u202eOctober\\u202c\\u061c\",\n      \"\\u061c\\u202eNovember\\u202c\\u061c\",\n      \"\\u061c\\u202eDecember\\u202c\\u061c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u061c\\u202eSun\\u202c\\u061c\",\n      \"\\u061c\\u202eMon\\u202c\\u061c\",\n      \"\\u061c\\u202eTue\\u202c\\u061c\",\n      \"\\u061c\\u202eWed\\u202c\\u061c\",\n      \"\\u061c\\u202eThu\\u202c\\u061c\",\n      \"\\u061c\\u202eFri\\u202c\\u061c\",\n      \"\\u061c\\u202eSat\\u202c\\u061c\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u061c\\u202eJan\\u202c\\u061c\",\n      \"\\u061c\\u202eFeb\\u202c\\u061c\",\n      \"\\u061c\\u202eMar\\u202c\\u061c\",\n      \"\\u061c\\u202eApr\\u202c\\u061c\",\n      \"\\u061c\\u202eMay\\u202c\\u061c\",\n      \"\\u061c\\u202eJun\\u202c\\u061c\",\n      \"\\u061c\\u202eJul\\u202c\\u061c\",\n      \"\\u061c\\u202eAug\\u202c\\u061c\",\n      \"\\u061c\\u202eSep\\u202c\\u061c\",\n      \"\\u061c\\u202eOct\\u202c\\u061c\",\n      \"\\u061c\\u202eNov\\u202c\\u061c\",\n      \"\\u061c\\u202eDec\\u202c\\u061c\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ar-xb\",\n  \"localeID\": \"ar_XB\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar-ye.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar-ye\",\n  \"localeID\": \"ar_YE\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ar.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0635\",\n      \"\\u0645\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0644\\u0645\\u064a\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u064a\\u0644\\u0627\\u062f\\u064a\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645\",\n      \"\\u0645\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u0644\\u0623\\u062d\\u062f\",\n      \"\\u0627\\u0644\\u0627\\u062b\\u0646\\u064a\\u0646\",\n      \"\\u0627\\u0644\\u062b\\u0644\\u0627\\u062b\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u0623\\u0631\\u0628\\u0639\\u0627\\u0621\",\n      \"\\u0627\\u0644\\u062e\\u0645\\u064a\\u0633\",\n      \"\\u0627\\u0644\\u062c\\u0645\\u0639\\u0629\",\n      \"\\u0627\\u0644\\u0633\\u0628\\u062a\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0646\\u0627\\u064a\\u0631\",\n      \"\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0623\\u0628\\u0631\\u064a\\u0644\",\n      \"\\u0645\\u0627\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0646\\u064a\\u0648\",\n      \"\\u064a\\u0648\\u0644\\u064a\\u0648\",\n      \"\\u0623\\u063a\\u0633\\u0637\\u0633\",\n      \"\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"dd\\u200f/MM\\u200f/y h:mm:ss a\",\n    \"mediumDate\": \"dd\\u200f/MM\\u200f/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d\\u200f/M\\u200f/y h:mm a\",\n    \"shortDate\": \"d\\u200f/M\\u200f/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ar\",\n  \"localeID\": \"ar\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n % 100 >= 3 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 99) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_as-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u09aa\\u09c2\\u09f0\\u09cd\\u09ac\\u09be\\u09b9\\u09cd\\u09a3\",\n      \"\\u0985\\u09aa\\u09f0\\u09be\\u09b9\\u09cd\\u09a3\"\n    ],\n    \"DAY\": [\n      \"\\u09a6\\u09c7\\u0993\\u09ac\\u09be\\u09f0\",\n      \"\\u09b8\\u09cb\\u09ae\\u09ac\\u09be\\u09f0\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\\u09ac\\u09be\\u09f0\",\n      \"\\u09ac\\u09c1\\u09a7\\u09ac\\u09be\\u09f0\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b7\\u09cd\\u09aa\\u09a4\\u09bf\\u09ac\\u09be\\u09f0\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09f0\\u09ac\\u09be\\u09f0\",\n      \"\\u09b6\\u09a8\\u09bf\\u09ac\\u09be\\u09f0\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09f0\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ae\\u09be\\u09f0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09f0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b7\\u09cd\\u099f\",\n      \"\\u099b\\u09c7\\u09aa\\u09cd\\u09a4\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09f0\",\n      \"\\u09a8\\u09f1\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u09a1\\u09bf\\u099a\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u09f0\\u09ac\\u09bf\",\n      \"\\u09b8\\u09cb\\u09ae\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\",\n      \"\\u09ac\\u09c1\\u09a7\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b7\\u09cd\\u09aa\\u09a4\\u09bf\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09f0\",\n      \"\\u09b6\\u09a8\\u09bf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09f0\\u09c1\",\n      \"\\u09ae\\u09be\\u09f0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09f0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\",\n      \"\\u09a8\\u09ad\\u09c7\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09f0\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ae\\u09be\\u09f0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09f0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b7\\u09cd\\u099f\",\n      \"\\u099b\\u09c7\\u09aa\\u09cd\\u09a4\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09f0\",\n      \"\\u09a8\\u09f1\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u09a1\\u09bf\\u099a\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"as-in\",\n  \"localeID\": \"as_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_as.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u09aa\\u09c2\\u09f0\\u09cd\\u09ac\\u09be\\u09b9\\u09cd\\u09a3\",\n      \"\\u0985\\u09aa\\u09f0\\u09be\\u09b9\\u09cd\\u09a3\"\n    ],\n    \"DAY\": [\n      \"\\u09a6\\u09c7\\u0993\\u09ac\\u09be\\u09f0\",\n      \"\\u09b8\\u09cb\\u09ae\\u09ac\\u09be\\u09f0\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\\u09ac\\u09be\\u09f0\",\n      \"\\u09ac\\u09c1\\u09a7\\u09ac\\u09be\\u09f0\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b7\\u09cd\\u09aa\\u09a4\\u09bf\\u09ac\\u09be\\u09f0\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09f0\\u09ac\\u09be\\u09f0\",\n      \"\\u09b6\\u09a8\\u09bf\\u09ac\\u09be\\u09f0\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09f0\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ae\\u09be\\u09f0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09f0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b7\\u09cd\\u099f\",\n      \"\\u099b\\u09c7\\u09aa\\u09cd\\u09a4\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09f0\",\n      \"\\u09a8\\u09f1\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u09a1\\u09bf\\u099a\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u09f0\\u09ac\\u09bf\",\n      \"\\u09b8\\u09cb\\u09ae\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\",\n      \"\\u09ac\\u09c1\\u09a7\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b7\\u09cd\\u09aa\\u09a4\\u09bf\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09f0\",\n      \"\\u09b6\\u09a8\\u09bf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09f0\\u09c1\",\n      \"\\u09ae\\u09be\\u09f0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09f0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\",\n      \"\\u09a8\\u09ad\\u09c7\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09f0\\u09c1\\u09f1\\u09be\\u09f0\\u09c0\",\n      \"\\u09ae\\u09be\\u09f0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09f0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b7\\u09cd\\u099f\",\n      \"\\u099b\\u09c7\\u09aa\\u09cd\\u09a4\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09f0\",\n      \"\\u09a8\\u09f1\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\",\n      \"\\u09a1\\u09bf\\u099a\\u09c7\\u09ae\\u09cd\\u09ac\\u09f0\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"as\",\n  \"localeID\": \"as\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_asa-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"icheheavo\",\n      \"ichamthi\"\n    ],\n    \"DAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla yakwe Yethu\",\n      \"Baada yakwe Yethu\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"BM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Ijm\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"asa-tz\",\n  \"localeID\": \"asa_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_asa.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"icheheavo\",\n      \"ichamthi\"\n    ],\n    \"DAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla yakwe Yethu\",\n      \"Baada yakwe Yethu\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"BM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Ijm\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"asa\",\n  \"localeID\": \"asa\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ast-es.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"de la ma\\u00f1ana\",\n      \"de la tarde\"\n    ],\n    \"DAY\": [\n      \"domingu\",\n      \"llunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"xueves\",\n      \"vienres\",\n      \"s\\u00e1badu\"\n    ],\n    \"ERANAMES\": [\n      \"enantes de Cristu\",\n      \"despu\\u00e9s de Cristu\"\n    ],\n    \"ERAS\": [\n      \"e.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de xineru\",\n      \"de febreru\",\n      \"de marzu\",\n      \"d\\u2019abril\",\n      \"de mayu\",\n      \"de xunu\",\n      \"de xunetu\",\n      \"d\\u2019agostu\",\n      \"de setiembre\",\n      \"d\\u2019ochobre\",\n      \"de payares\",\n      \"d\\u2019avientu\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"llu\",\n      \"mar\",\n      \"mi\\u00e9\",\n      \"xue\",\n      \"vie\",\n      \"s\\u00e1b\"\n    ],\n    \"SHORTMONTH\": [\n      \"xin\",\n      \"feb\",\n      \"mar\",\n      \"abr\",\n      \"may\",\n      \"xun\",\n      \"xnt\",\n      \"ago\",\n      \"set\",\n      \"och\",\n      \"pay\",\n      \"avi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"xineru\",\n      \"febreru\",\n      \"marzu\",\n      \"abril\",\n      \"mayu\",\n      \"xunu\",\n      \"xunetu\",\n      \"agostu\",\n      \"setiembre\",\n      \"ochobre\",\n      \"payares\",\n      \"avientu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ast-es\",\n  \"localeID\": \"ast_ES\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ast.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"de la ma\\u00f1ana\",\n      \"de la tarde\"\n    ],\n    \"DAY\": [\n      \"domingu\",\n      \"llunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"xueves\",\n      \"vienres\",\n      \"s\\u00e1badu\"\n    ],\n    \"ERANAMES\": [\n      \"enantes de Cristu\",\n      \"despu\\u00e9s de Cristu\"\n    ],\n    \"ERAS\": [\n      \"e.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de xineru\",\n      \"de febreru\",\n      \"de marzu\",\n      \"d\\u2019abril\",\n      \"de mayu\",\n      \"de xunu\",\n      \"de xunetu\",\n      \"d\\u2019agostu\",\n      \"de setiembre\",\n      \"d\\u2019ochobre\",\n      \"de payares\",\n      \"d\\u2019avientu\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"llu\",\n      \"mar\",\n      \"mi\\u00e9\",\n      \"xue\",\n      \"vie\",\n      \"s\\u00e1b\"\n    ],\n    \"SHORTMONTH\": [\n      \"xin\",\n      \"feb\",\n      \"mar\",\n      \"abr\",\n      \"may\",\n      \"xun\",\n      \"xnt\",\n      \"ago\",\n      \"set\",\n      \"och\",\n      \"pay\",\n      \"avi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"xineru\",\n      \"febreru\",\n      \"marzu\",\n      \"abril\",\n      \"mayu\",\n      \"xunu\",\n      \"xunetu\",\n      \"agostu\",\n      \"setiembre\",\n      \"ochobre\",\n      \"payares\",\n      \"avientu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ast\",\n  \"localeID\": \"ast\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_az-cyrl-az.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0410\\u041c\",\n      \"\\u041f\\u041c\"\n    ],\n    \"DAY\": [\n      \"\\u0431\\u0430\\u0437\\u0430\\u0440\",\n      \"\\u0431\\u0430\\u0437\\u0430\\u0440 \\u0435\\u0440\\u0442\\u04d9\\u0441\\u0438\",\n      \"\\u0447\\u04d9\\u0440\\u0448\\u04d9\\u043d\\u0431\\u04d9 \\u0430\\u0445\\u0448\\u0430\\u043c\\u044b\",\n      \"\\u0447\\u04d9\\u0440\\u0448\\u04d9\\u043d\\u0431\\u04d9\",\n      \"\\u04b9\\u04af\\u043c\\u04d9 \\u0430\\u0445\\u0448\\u0430\\u043c\\u044b\",\n      \"\\u04b9\\u04af\\u043c\\u04d9\",\n      \"\\u0448\\u04d9\\u043d\\u0431\\u04d9\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0435\\u0440\\u0430\\u043c\\u044b\\u0437\\u0434\\u0430\\u043d \\u04d9\\u0432\\u0432\\u04d9\\u043b\",\n      \"\\u0458\\u0435\\u043d\\u0438 \\u0435\\u0440\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0435.\\u04d9.\",\n      \"\\u0458.\\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u0458\\u0443\\u043d\",\n      \"\\u0438\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u043d\\u043e\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0411.\",\n      \"\\u0411.\\u0415.\",\n      \"\\u0427.\\u0410.\",\n      \"\\u0427.\",\n      \"\\u04b8.\\u0410.\",\n      \"\\u04b8.\",\n      \"\\u0428.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u0458\\u043d\",\n      \"\\u0438\\u0458\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043d\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0458\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0408\\u0430\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u041c\\u0430\\u0440\\u0442\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u0458\\u0443\\u043d\",\n      \"\\u0418\\u0458\\u0443\\u043b\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u041e\\u043a\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u041d\\u043e\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y, EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bc\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"az-cyrl-az\",\n  \"localeID\": \"az_Cyrl_AZ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_az-cyrl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0410\\u041c\",\n      \"\\u041f\\u041c\"\n    ],\n    \"DAY\": [\n      \"\\u0431\\u0430\\u0437\\u0430\\u0440\",\n      \"\\u0431\\u0430\\u0437\\u0430\\u0440 \\u0435\\u0440\\u0442\\u04d9\\u0441\\u0438\",\n      \"\\u0447\\u04d9\\u0440\\u0448\\u04d9\\u043d\\u0431\\u04d9 \\u0430\\u0445\\u0448\\u0430\\u043c\\u044b\",\n      \"\\u0447\\u04d9\\u0440\\u0448\\u04d9\\u043d\\u0431\\u04d9\",\n      \"\\u04b9\\u04af\\u043c\\u04d9 \\u0430\\u0445\\u0448\\u0430\\u043c\\u044b\",\n      \"\\u04b9\\u04af\\u043c\\u04d9\",\n      \"\\u0448\\u04d9\\u043d\\u0431\\u04d9\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0435\\u0440\\u0430\\u043c\\u044b\\u0437\\u0434\\u0430\\u043d \\u04d9\\u0432\\u0432\\u04d9\\u043b\",\n      \"\\u0458\\u0435\\u043d\\u0438 \\u0435\\u0440\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0435.\\u04d9.\",\n      \"\\u0458.\\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u0458\\u0443\\u043d\",\n      \"\\u0438\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u043d\\u043e\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0411.\",\n      \"\\u0411.\\u0415.\",\n      \"\\u0427.\\u0410.\",\n      \"\\u0427.\",\n      \"\\u04b8.\\u0410.\",\n      \"\\u04b8.\",\n      \"\\u0428.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u0458\\u043d\",\n      \"\\u0438\\u0458\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043d\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0458\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0408\\u0430\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u041c\\u0430\\u0440\\u0442\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u0458\\u0443\\u043d\",\n      \"\\u0418\\u0458\\u0443\\u043b\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u041e\\u043a\\u0442\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u041d\\u043e\\u0458\\u0430\\u0431\\u0440\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y, EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bc\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"az-cyrl\",\n  \"localeID\": \"az_Cyrl\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_az-latn-az.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"bazar\",\n      \"bazar ert\\u0259si\",\n      \"\\u00e7\\u0259r\\u015f\\u0259nb\\u0259 ax\\u015fam\\u0131\",\n      \"\\u00e7\\u0259r\\u015f\\u0259nb\\u0259\",\n      \"c\\u00fcm\\u0259 ax\\u015fam\\u0131\",\n      \"c\\u00fcm\\u0259\",\n      \"\\u015f\\u0259nb\\u0259\"\n    ],\n    \"ERANAMES\": [\n      \"eram\\u0131zdan \\u0259vv\\u0259l\",\n      \"yeni era\"\n    ],\n    \"ERAS\": [\n      \"e.\\u0259.\",\n      \"y.e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanvar\",\n      \"fevral\",\n      \"mart\",\n      \"aprel\",\n      \"may\",\n      \"iyun\",\n      \"iyul\",\n      \"avqust\",\n      \"sentyabr\",\n      \"oktyabr\",\n      \"noyabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"B.\",\n      \"B.E.\",\n      \"\\u00c7.A.\",\n      \"\\u00c7.\",\n      \"C.A.\",\n      \"C.\",\n      \"\\u015e.\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fev\",\n      \"mar\",\n      \"apr\",\n      \"may\",\n      \"iyn\",\n      \"iyl\",\n      \"avq\",\n      \"sen\",\n      \"okt\",\n      \"noy\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yanvar\",\n      \"Fevral\",\n      \"Mart\",\n      \"Aprel\",\n      \"May\",\n      \"\\u0130yun\",\n      \"\\u0130yul\",\n      \"Avqust\",\n      \"Sentyabr\",\n      \"Oktyabr\",\n      \"Noyabr\",\n      \"Dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y, EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bc\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"az-latn-az\",\n  \"localeID\": \"az_Latn_AZ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_az-latn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"bazar\",\n      \"bazar ert\\u0259si\",\n      \"\\u00e7\\u0259r\\u015f\\u0259nb\\u0259 ax\\u015fam\\u0131\",\n      \"\\u00e7\\u0259r\\u015f\\u0259nb\\u0259\",\n      \"c\\u00fcm\\u0259 ax\\u015fam\\u0131\",\n      \"c\\u00fcm\\u0259\",\n      \"\\u015f\\u0259nb\\u0259\"\n    ],\n    \"ERANAMES\": [\n      \"eram\\u0131zdan \\u0259vv\\u0259l\",\n      \"yeni era\"\n    ],\n    \"ERAS\": [\n      \"e.\\u0259.\",\n      \"y.e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanvar\",\n      \"fevral\",\n      \"mart\",\n      \"aprel\",\n      \"may\",\n      \"iyun\",\n      \"iyul\",\n      \"avqust\",\n      \"sentyabr\",\n      \"oktyabr\",\n      \"noyabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"B.\",\n      \"B.E.\",\n      \"\\u00c7.A.\",\n      \"\\u00c7.\",\n      \"C.A.\",\n      \"C.\",\n      \"\\u015e.\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fev\",\n      \"mar\",\n      \"apr\",\n      \"may\",\n      \"iyn\",\n      \"iyl\",\n      \"avq\",\n      \"sen\",\n      \"okt\",\n      \"noy\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yanvar\",\n      \"Fevral\",\n      \"Mart\",\n      \"Aprel\",\n      \"May\",\n      \"\\u0130yun\",\n      \"\\u0130yul\",\n      \"Avqust\",\n      \"Sentyabr\",\n      \"Oktyabr\",\n      \"Noyabr\",\n      \"Dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y, EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bc\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"az-latn\",\n  \"localeID\": \"az_Latn\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_az.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"bazar\",\n      \"bazar ert\\u0259si\",\n      \"\\u00e7\\u0259r\\u015f\\u0259nb\\u0259 ax\\u015fam\\u0131\",\n      \"\\u00e7\\u0259r\\u015f\\u0259nb\\u0259\",\n      \"c\\u00fcm\\u0259 ax\\u015fam\\u0131\",\n      \"c\\u00fcm\\u0259\",\n      \"\\u015f\\u0259nb\\u0259\"\n    ],\n    \"ERANAMES\": [\n      \"eram\\u0131zdan \\u0259vv\\u0259l\",\n      \"yeni era\"\n    ],\n    \"ERAS\": [\n      \"e.\\u0259.\",\n      \"y.e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanvar\",\n      \"fevral\",\n      \"mart\",\n      \"aprel\",\n      \"may\",\n      \"iyun\",\n      \"iyul\",\n      \"avqust\",\n      \"sentyabr\",\n      \"oktyabr\",\n      \"noyabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"B.\",\n      \"B.E.\",\n      \"\\u00c7.A.\",\n      \"\\u00c7.\",\n      \"C.A.\",\n      \"C.\",\n      \"\\u015e.\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fev\",\n      \"mar\",\n      \"apr\",\n      \"may\",\n      \"iyn\",\n      \"iyl\",\n      \"avq\",\n      \"sen\",\n      \"okt\",\n      \"noy\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yanvar\",\n      \"Fevral\",\n      \"Mart\",\n      \"Aprel\",\n      \"May\",\n      \"\\u0130yun\",\n      \"\\u0130yul\",\n      \"Avqust\",\n      \"Sentyabr\",\n      \"Oktyabr\",\n      \"Noyabr\",\n      \"Dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y, EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bc\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"az\",\n  \"localeID\": \"az\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bas-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"I bik\\u025b\\u0302gl\\u00e0\",\n      \"I \\u0253ugaj\\u0254p\"\n    ],\n    \"DAY\": [\n      \"\\u014bgw\\u00e0 n\\u0254\\u0302y\",\n      \"\\u014bgw\\u00e0 nja\\u014bgumba\",\n      \"\\u014bgw\\u00e0 \\u00fbm\",\n      \"\\u014bgw\\u00e0 \\u014bg\\u00ea\",\n      \"\\u014bgw\\u00e0 mb\\u0254k\",\n      \"\\u014bgw\\u00e0 k\\u0254\\u0254\",\n      \"\\u014bgw\\u00e0 j\\u00f4n\"\n    ],\n    \"ERANAMES\": [\n      \"bis\\u016b bi Yes\\u00f9 Kr\\u01d0st\\u00f2\",\n      \"i mb\\u016bs Yes\\u00f9 Kr\\u01d0st\\u00f2\"\n    ],\n    \"ERAS\": [\n      \"b.Y.K\",\n      \"m.Y.K\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"K\\u0254nd\\u0254\\u014b\",\n      \"M\\u00e0c\\u025b\\u0302l\",\n      \"M\\u00e0t\\u00f9mb\",\n      \"M\\u00e0top\",\n      \"M\\u0300puy\\u025b\",\n      \"H\\u00ecl\\u00f2nd\\u025b\\u0300\",\n      \"Nj\\u00e8b\\u00e0\",\n      \"H\\u00ecka\\u014b\",\n      \"D\\u00ecp\\u0254\\u0300s\",\n      \"B\\u00ec\\u00f2\\u00f4m\",\n      \"M\\u00e0y\\u025bs\\u00e8p\",\n      \"L\\u00ecbuy li \\u0144y\\u00e8e\"\n    ],\n    \"SHORTDAY\": [\n      \"n\\u0254y\",\n      \"nja\",\n      \"uum\",\n      \"\\u014bge\",\n      \"mb\\u0254\",\n      \"k\\u0254\\u0254\",\n      \"jon\"\n    ],\n    \"SHORTMONTH\": [\n      \"k\\u0254n\",\n      \"mac\",\n      \"mat\",\n      \"mto\",\n      \"mpu\",\n      \"hil\",\n      \"nje\",\n      \"hik\",\n      \"dip\",\n      \"bio\",\n      \"may\",\n      \"li\\u0253\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"K\\u0254nd\\u0254\\u014b\",\n      \"M\\u00e0c\\u025b\\u0302l\",\n      \"M\\u00e0t\\u00f9mb\",\n      \"M\\u00e0top\",\n      \"M\\u0300puy\\u025b\",\n      \"H\\u00ecl\\u00f2nd\\u025b\\u0300\",\n      \"Nj\\u00e8b\\u00e0\",\n      \"H\\u00ecka\\u014b\",\n      \"D\\u00ecp\\u0254\\u0300s\",\n      \"B\\u00ec\\u00f2\\u00f4m\",\n      \"M\\u00e0y\\u025bs\\u00e8p\",\n      \"L\\u00ecbuy li \\u0144y\\u00e8e\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bas-cm\",\n  \"localeID\": \"bas_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bas.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"I bik\\u025b\\u0302gl\\u00e0\",\n      \"I \\u0253ugaj\\u0254p\"\n    ],\n    \"DAY\": [\n      \"\\u014bgw\\u00e0 n\\u0254\\u0302y\",\n      \"\\u014bgw\\u00e0 nja\\u014bgumba\",\n      \"\\u014bgw\\u00e0 \\u00fbm\",\n      \"\\u014bgw\\u00e0 \\u014bg\\u00ea\",\n      \"\\u014bgw\\u00e0 mb\\u0254k\",\n      \"\\u014bgw\\u00e0 k\\u0254\\u0254\",\n      \"\\u014bgw\\u00e0 j\\u00f4n\"\n    ],\n    \"ERANAMES\": [\n      \"bis\\u016b bi Yes\\u00f9 Kr\\u01d0st\\u00f2\",\n      \"i mb\\u016bs Yes\\u00f9 Kr\\u01d0st\\u00f2\"\n    ],\n    \"ERAS\": [\n      \"b.Y.K\",\n      \"m.Y.K\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"K\\u0254nd\\u0254\\u014b\",\n      \"M\\u00e0c\\u025b\\u0302l\",\n      \"M\\u00e0t\\u00f9mb\",\n      \"M\\u00e0top\",\n      \"M\\u0300puy\\u025b\",\n      \"H\\u00ecl\\u00f2nd\\u025b\\u0300\",\n      \"Nj\\u00e8b\\u00e0\",\n      \"H\\u00ecka\\u014b\",\n      \"D\\u00ecp\\u0254\\u0300s\",\n      \"B\\u00ec\\u00f2\\u00f4m\",\n      \"M\\u00e0y\\u025bs\\u00e8p\",\n      \"L\\u00ecbuy li \\u0144y\\u00e8e\"\n    ],\n    \"SHORTDAY\": [\n      \"n\\u0254y\",\n      \"nja\",\n      \"uum\",\n      \"\\u014bge\",\n      \"mb\\u0254\",\n      \"k\\u0254\\u0254\",\n      \"jon\"\n    ],\n    \"SHORTMONTH\": [\n      \"k\\u0254n\",\n      \"mac\",\n      \"mat\",\n      \"mto\",\n      \"mpu\",\n      \"hil\",\n      \"nje\",\n      \"hik\",\n      \"dip\",\n      \"bio\",\n      \"may\",\n      \"li\\u0253\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"K\\u0254nd\\u0254\\u014b\",\n      \"M\\u00e0c\\u025b\\u0302l\",\n      \"M\\u00e0t\\u00f9mb\",\n      \"M\\u00e0top\",\n      \"M\\u0300puy\\u025b\",\n      \"H\\u00ecl\\u00f2nd\\u025b\\u0300\",\n      \"Nj\\u00e8b\\u00e0\",\n      \"H\\u00ecka\\u014b\",\n      \"D\\u00ecp\\u0254\\u0300s\",\n      \"B\\u00ec\\u00f2\\u00f4m\",\n      \"M\\u00e0y\\u025bs\\u00e8p\",\n      \"L\\u00ecbuy li \\u0144y\\u00e8e\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bas\",\n  \"localeID\": \"bas\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_be-by.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u044f\\u0434\\u0437\\u0435\\u043b\\u044f\",\n      \"\\u043f\\u0430\\u043d\\u044f\\u0434\\u0437\\u0435\\u043b\\u0430\\u043a\",\n      \"\\u0430\\u045e\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0435\\u0440\\u0430\\u0434\\u0430\",\n      \"\\u0447\\u0430\\u0446\\u0432\\u0435\\u0440\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0456\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u0430 \\u043d\\u0430\\u0440\\u0430\\u0434\\u0436\\u044d\\u043d\\u043d\\u044f \\u0425\\u0440\\u044b\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u0430\\u0434 \\u043d\\u0430\\u0440\\u0430\\u0434\\u0436\\u044d\\u043d\\u043d\\u044f \\u0425\\u0440\\u044b\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u0430 \\u043d.\\u044d.\",\n      \"\\u043d.\\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0441\\u0442\\u0443\\u0434\\u0437\\u0435\\u043d\\u044f\",\n      \"\\u043b\\u044e\\u0442\\u0430\\u0433\\u0430\",\n      \"\\u0441\\u0430\\u043a\\u0430\\u0432\\u0456\\u043a\\u0430\",\n      \"\\u043a\\u0440\\u0430\\u0441\\u0430\\u0432\\u0456\\u043a\\u0430\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0447\\u044d\\u0440\\u0432\\u0435\\u043d\\u044f\",\n      \"\\u043b\\u0456\\u043f\\u0435\\u043d\\u044f\",\n      \"\\u0436\\u043d\\u0456\\u045e\\u043d\\u044f\",\n      \"\\u0432\\u0435\\u0440\\u0430\\u0441\\u043d\\u044f\",\n      \"\\u043a\\u0430\\u0441\\u0442\\u0440\\u044b\\u0447\\u043d\\u0456\\u043a\\u0430\",\n      \"\\u043b\\u0456\\u0441\\u0442\\u0430\\u043f\\u0430\\u0434\\u0430\",\n      \"\\u0441\\u043d\\u0435\\u0436\\u043d\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\",\n      \"\\u043f\\u043d\",\n      \"\\u0430\\u045e\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0446\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0441\\u0442\\u0443\",\n      \"\\u043b\\u044e\\u0442\",\n      \"\\u0441\\u0430\\u043a\",\n      \"\\u043a\\u0440\\u0430\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0447\\u044d\\u0440\",\n      \"\\u043b\\u0456\\u043f\",\n      \"\\u0436\\u043d\\u0456\",\n      \"\\u0432\\u0435\\u0440\",\n      \"\\u043a\\u0430\\u0441\",\n      \"\\u043b\\u0456\\u0441\",\n      \"\\u0441\\u043d\\u0435\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0441\\u0442\\u0443\\u0434\\u0437\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u044e\\u0442\\u044b\",\n      \"\\u0441\\u0430\\u043a\\u0430\\u0432\\u0456\\u043a\",\n      \"\\u043a\\u0440\\u0430\\u0441\\u0430\\u0432\\u0456\\u043a\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0447\\u044d\\u0440\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u0456\\u043f\\u0435\\u043d\\u044c\",\n      \"\\u0436\\u043d\\u0456\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u0432\\u0435\\u0440\\u0430\\u0441\\u0435\\u043d\\u044c\",\n      \"\\u043a\\u0430\\u0441\\u0442\\u0440\\u044b\\u0447\\u043d\\u0456\\u043a\",\n      \"\\u043b\\u0456\\u0441\\u0442\\u0430\\u043f\\u0430\\u0434\",\n      \"\\u0441\\u043d\\u0435\\u0436\\u0430\\u043d\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d.MM.y HH:mm:ss\",\n    \"mediumDate\": \"d.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.MM.yy HH:mm\",\n    \"shortDate\": \"d.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"BYN\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"be-by\",\n  \"localeID\": \"be_BY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n % 10 == 1 && n % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (n % 10 == 0 || n % 10 >= 5 && n % 10 <= 9 || n % 100 >= 11 && n % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_be.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u044f\\u0434\\u0437\\u0435\\u043b\\u044f\",\n      \"\\u043f\\u0430\\u043d\\u044f\\u0434\\u0437\\u0435\\u043b\\u0430\\u043a\",\n      \"\\u0430\\u045e\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0435\\u0440\\u0430\\u0434\\u0430\",\n      \"\\u0447\\u0430\\u0446\\u0432\\u0435\\u0440\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0456\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u0430 \\u043d\\u0430\\u0440\\u0430\\u0434\\u0436\\u044d\\u043d\\u043d\\u044f \\u0425\\u0440\\u044b\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u0430\\u0434 \\u043d\\u0430\\u0440\\u0430\\u0434\\u0436\\u044d\\u043d\\u043d\\u044f \\u0425\\u0440\\u044b\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u0430 \\u043d.\\u044d.\",\n      \"\\u043d.\\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0441\\u0442\\u0443\\u0434\\u0437\\u0435\\u043d\\u044f\",\n      \"\\u043b\\u044e\\u0442\\u0430\\u0433\\u0430\",\n      \"\\u0441\\u0430\\u043a\\u0430\\u0432\\u0456\\u043a\\u0430\",\n      \"\\u043a\\u0440\\u0430\\u0441\\u0430\\u0432\\u0456\\u043a\\u0430\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0447\\u044d\\u0440\\u0432\\u0435\\u043d\\u044f\",\n      \"\\u043b\\u0456\\u043f\\u0435\\u043d\\u044f\",\n      \"\\u0436\\u043d\\u0456\\u045e\\u043d\\u044f\",\n      \"\\u0432\\u0435\\u0440\\u0430\\u0441\\u043d\\u044f\",\n      \"\\u043a\\u0430\\u0441\\u0442\\u0440\\u044b\\u0447\\u043d\\u0456\\u043a\\u0430\",\n      \"\\u043b\\u0456\\u0441\\u0442\\u0430\\u043f\\u0430\\u0434\\u0430\",\n      \"\\u0441\\u043d\\u0435\\u0436\\u043d\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\",\n      \"\\u043f\\u043d\",\n      \"\\u0430\\u045e\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0446\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0441\\u0442\\u0443\",\n      \"\\u043b\\u044e\\u0442\",\n      \"\\u0441\\u0430\\u043a\",\n      \"\\u043a\\u0440\\u0430\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0447\\u044d\\u0440\",\n      \"\\u043b\\u0456\\u043f\",\n      \"\\u0436\\u043d\\u0456\",\n      \"\\u0432\\u0435\\u0440\",\n      \"\\u043a\\u0430\\u0441\",\n      \"\\u043b\\u0456\\u0441\",\n      \"\\u0441\\u043d\\u0435\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0441\\u0442\\u0443\\u0434\\u0437\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u044e\\u0442\\u044b\",\n      \"\\u0441\\u0430\\u043a\\u0430\\u0432\\u0456\\u043a\",\n      \"\\u043a\\u0440\\u0430\\u0441\\u0430\\u0432\\u0456\\u043a\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0447\\u044d\\u0440\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u0456\\u043f\\u0435\\u043d\\u044c\",\n      \"\\u0436\\u043d\\u0456\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u0432\\u0435\\u0440\\u0430\\u0441\\u0435\\u043d\\u044c\",\n      \"\\u043a\\u0430\\u0441\\u0442\\u0440\\u044b\\u0447\\u043d\\u0456\\u043a\",\n      \"\\u043b\\u0456\\u0441\\u0442\\u0430\\u043f\\u0430\\u0434\",\n      \"\\u0441\\u043d\\u0435\\u0436\\u0430\\u043d\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d.MM.y HH:mm:ss\",\n    \"mediumDate\": \"d.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.MM.yy HH:mm\",\n    \"shortDate\": \"d.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"BYN\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"be\",\n  \"localeID\": \"be\",\n  \"pluralCat\": function(n, opt_precision) {  if (n % 10 == 1 && n % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (n % 10 == 0 || n % 10 >= 5 && n % 10 <= 9 || n % 100 >= 11 && n % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bem-zm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"uluchelo\",\n      \"akasuba\"\n    ],\n    \"DAY\": [\n      \"Pa Mulungu\",\n      \"Palichimo\",\n      \"Palichibuli\",\n      \"Palichitatu\",\n      \"Palichine\",\n      \"Palichisano\",\n      \"Pachibelushi\"\n    ],\n    \"ERANAMES\": [\n      \"Before Yesu\",\n      \"After Yesu\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Epreo\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Ogasti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Pa Mulungu\",\n      \"Palichimo\",\n      \"Palichibuli\",\n      \"Palichitatu\",\n      \"Palichine\",\n      \"Palichisano\",\n      \"Pachibelushi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Epr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Oga\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Epreo\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Ogasti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"ZMW\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"bem-zm\",\n  \"localeID\": \"bem_ZM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bem.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"uluchelo\",\n      \"akasuba\"\n    ],\n    \"DAY\": [\n      \"Pa Mulungu\",\n      \"Palichimo\",\n      \"Palichibuli\",\n      \"Palichitatu\",\n      \"Palichine\",\n      \"Palichisano\",\n      \"Pachibelushi\"\n    ],\n    \"ERANAMES\": [\n      \"Before Yesu\",\n      \"After Yesu\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Epreo\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Ogasti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Pa Mulungu\",\n      \"Palichimo\",\n      \"Palichibuli\",\n      \"Palichitatu\",\n      \"Palichine\",\n      \"Palichisano\",\n      \"Pachibelushi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Epr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Oga\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Epreo\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Ogasti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"ZMW\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"bem\",\n  \"localeID\": \"bem\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bez-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"pamilau\",\n      \"pamunyi\"\n    ],\n    \"DAY\": [\n      \"pa mulungu\",\n      \"pa shahuviluha\",\n      \"pa hivili\",\n      \"pa hidatu\",\n      \"pa hitayi\",\n      \"pa hihanu\",\n      \"pa shahulembela\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Mtwaa\",\n      \"Baada ya Mtwaa\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"BM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"pa mwedzi gwa hutala\",\n      \"pa mwedzi gwa wuvili\",\n      \"pa mwedzi gwa wudatu\",\n      \"pa mwedzi gwa wutai\",\n      \"pa mwedzi gwa wuhanu\",\n      \"pa mwedzi gwa sita\",\n      \"pa mwedzi gwa saba\",\n      \"pa mwedzi gwa nane\",\n      \"pa mwedzi gwa tisa\",\n      \"pa mwedzi gwa kumi\",\n      \"pa mwedzi gwa kumi na moja\",\n      \"pa mwedzi gwa kumi na mbili\"\n    ],\n    \"SHORTDAY\": [\n      \"Mul\",\n      \"Vil\",\n      \"Hiv\",\n      \"Hid\",\n      \"Hit\",\n      \"Hih\",\n      \"Lem\"\n    ],\n    \"SHORTMONTH\": [\n      \"Hut\",\n      \"Vil\",\n      \"Dat\",\n      \"Tai\",\n      \"Han\",\n      \"Sit\",\n      \"Sab\",\n      \"Nan\",\n      \"Tis\",\n      \"Kum\",\n      \"Kmj\",\n      \"Kmb\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"pa mwedzi gwa hutala\",\n      \"pa mwedzi gwa wuvili\",\n      \"pa mwedzi gwa wudatu\",\n      \"pa mwedzi gwa wutai\",\n      \"pa mwedzi gwa wuhanu\",\n      \"pa mwedzi gwa sita\",\n      \"pa mwedzi gwa saba\",\n      \"pa mwedzi gwa nane\",\n      \"pa mwedzi gwa tisa\",\n      \"pa mwedzi gwa kumi\",\n      \"pa mwedzi gwa kumi na moja\",\n      \"pa mwedzi gwa kumi na mbili\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bez-tz\",\n  \"localeID\": \"bez_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bez.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"pamilau\",\n      \"pamunyi\"\n    ],\n    \"DAY\": [\n      \"pa mulungu\",\n      \"pa shahuviluha\",\n      \"pa hivili\",\n      \"pa hidatu\",\n      \"pa hitayi\",\n      \"pa hihanu\",\n      \"pa shahulembela\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Mtwaa\",\n      \"Baada ya Mtwaa\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"BM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"pa mwedzi gwa hutala\",\n      \"pa mwedzi gwa wuvili\",\n      \"pa mwedzi gwa wudatu\",\n      \"pa mwedzi gwa wutai\",\n      \"pa mwedzi gwa wuhanu\",\n      \"pa mwedzi gwa sita\",\n      \"pa mwedzi gwa saba\",\n      \"pa mwedzi gwa nane\",\n      \"pa mwedzi gwa tisa\",\n      \"pa mwedzi gwa kumi\",\n      \"pa mwedzi gwa kumi na moja\",\n      \"pa mwedzi gwa kumi na mbili\"\n    ],\n    \"SHORTDAY\": [\n      \"Mul\",\n      \"Vil\",\n      \"Hiv\",\n      \"Hid\",\n      \"Hit\",\n      \"Hih\",\n      \"Lem\"\n    ],\n    \"SHORTMONTH\": [\n      \"Hut\",\n      \"Vil\",\n      \"Dat\",\n      \"Tai\",\n      \"Han\",\n      \"Sit\",\n      \"Sab\",\n      \"Nan\",\n      \"Tis\",\n      \"Kum\",\n      \"Kmj\",\n      \"Kmb\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"pa mwedzi gwa hutala\",\n      \"pa mwedzi gwa wuvili\",\n      \"pa mwedzi gwa wudatu\",\n      \"pa mwedzi gwa wutai\",\n      \"pa mwedzi gwa wuhanu\",\n      \"pa mwedzi gwa sita\",\n      \"pa mwedzi gwa saba\",\n      \"pa mwedzi gwa nane\",\n      \"pa mwedzi gwa tisa\",\n      \"pa mwedzi gwa kumi\",\n      \"pa mwedzi gwa kumi na moja\",\n      \"pa mwedzi gwa kumi na mbili\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bez\",\n  \"localeID\": \"bez\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bg-bg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440.\\u043e\\u0431.\",\n      \"\\u0441\\u043b.\\u043e\\u0431.\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u043b\\u044f\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u044f\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u044a\\u0440\\u0442\\u044a\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u044a\\u043a\",\n      \"\\u0441\\u044a\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435\\u0434\\u0438 \\u0425\\u0440\\u0438\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u043b\\u0435\\u0434 \\u0425\\u0440\\u0438\\u0441\\u0442\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u043f\\u0440.\\u0425\\u0440.\",\n      \"\\u0441\\u043b.\\u0425\\u0440.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u044e\\u043d\\u0438\",\n      \"\\u044e\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0443\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u044e\\u043d\\u0438\",\n      \"\\u044e\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043f\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0435\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u044e\\u043d\\u0438\",\n      \"\\u044e\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d.MM.y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d.MM.y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.MM.yy '\\u0433'. H:mm\",\n    \"shortDate\": \"d.MM.yy '\\u0433'.\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"lev\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 0,\n        \"lgSize\": 0,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bg-bg\",\n  \"localeID\": \"bg_BG\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440.\\u043e\\u0431.\",\n      \"\\u0441\\u043b.\\u043e\\u0431.\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u043b\\u044f\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u044f\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u044a\\u0440\\u0442\\u044a\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u044a\\u043a\",\n      \"\\u0441\\u044a\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435\\u0434\\u0438 \\u0425\\u0440\\u0438\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u043b\\u0435\\u0434 \\u0425\\u0440\\u0438\\u0441\\u0442\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u043f\\u0440.\\u0425\\u0440.\",\n      \"\\u0441\\u043b.\\u0425\\u0440.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u044e\\u043d\\u0438\",\n      \"\\u044e\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0443\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u044e\\u043d\\u0438\",\n      \"\\u044e\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043f\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0435\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u044e\\u043d\\u0438\",\n      \"\\u044e\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d.MM.y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d.MM.y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.MM.yy '\\u0433'. H:mm\",\n    \"shortDate\": \"d.MM.yy '\\u0433'.\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"lev\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 0,\n        \"lgSize\": 0,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bg\",\n  \"localeID\": \"bg\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bm-ml.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"kari\",\n      \"nt\\u025bn\\u025b\",\n      \"tarata\",\n      \"araba\",\n      \"alamisa\",\n      \"juma\",\n      \"sibiri\"\n    ],\n    \"ERANAMES\": [\n      \"jezu krisiti \\u0272\\u025b\",\n      \"jezu krisiti mink\\u025b\"\n    ],\n    \"ERAS\": [\n      \"J.-C. \\u0272\\u025b\",\n      \"ni J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"zanwuye\",\n      \"feburuye\",\n      \"marisi\",\n      \"awirili\",\n      \"m\\u025b\",\n      \"zuw\\u025bn\",\n      \"zuluye\",\n      \"uti\",\n      \"s\\u025btanburu\",\n      \"\\u0254kut\\u0254buru\",\n      \"nowanburu\",\n      \"desanburu\"\n    ],\n    \"SHORTDAY\": [\n      \"kar\",\n      \"nt\\u025b\",\n      \"tar\",\n      \"ara\",\n      \"ala\",\n      \"jum\",\n      \"sib\"\n    ],\n    \"SHORTMONTH\": [\n      \"zan\",\n      \"feb\",\n      \"mar\",\n      \"awi\",\n      \"m\\u025b\",\n      \"zuw\",\n      \"zul\",\n      \"uti\",\n      \"s\\u025bt\",\n      \"\\u0254ku\",\n      \"now\",\n      \"des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"zanwuye\",\n      \"feburuye\",\n      \"marisi\",\n      \"awirili\",\n      \"m\\u025b\",\n      \"zuw\\u025bn\",\n      \"zuluye\",\n      \"uti\",\n      \"s\\u025btanburu\",\n      \"\\u0254kut\\u0254buru\",\n      \"nowanburu\",\n      \"desanburu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"bm-ml\",\n  \"localeID\": \"bm_ML\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"kari\",\n      \"nt\\u025bn\\u025b\",\n      \"tarata\",\n      \"araba\",\n      \"alamisa\",\n      \"juma\",\n      \"sibiri\"\n    ],\n    \"ERANAMES\": [\n      \"jezu krisiti \\u0272\\u025b\",\n      \"jezu krisiti mink\\u025b\"\n    ],\n    \"ERAS\": [\n      \"J.-C. \\u0272\\u025b\",\n      \"ni J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"zanwuye\",\n      \"feburuye\",\n      \"marisi\",\n      \"awirili\",\n      \"m\\u025b\",\n      \"zuw\\u025bn\",\n      \"zuluye\",\n      \"uti\",\n      \"s\\u025btanburu\",\n      \"\\u0254kut\\u0254buru\",\n      \"nowanburu\",\n      \"desanburu\"\n    ],\n    \"SHORTDAY\": [\n      \"kar\",\n      \"nt\\u025b\",\n      \"tar\",\n      \"ara\",\n      \"ala\",\n      \"jum\",\n      \"sib\"\n    ],\n    \"SHORTMONTH\": [\n      \"zan\",\n      \"feb\",\n      \"mar\",\n      \"awi\",\n      \"m\\u025b\",\n      \"zuw\",\n      \"zul\",\n      \"uti\",\n      \"s\\u025bt\",\n      \"\\u0254ku\",\n      \"now\",\n      \"des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"zanwuye\",\n      \"feburuye\",\n      \"marisi\",\n      \"awirili\",\n      \"m\\u025b\",\n      \"zuw\\u025bn\",\n      \"zuluye\",\n      \"uti\",\n      \"s\\u025btanburu\",\n      \"\\u0254kut\\u0254buru\",\n      \"nowanburu\",\n      \"desanburu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"bm\",\n  \"localeID\": \"bm\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bn-bd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u09b0\\u09ac\\u09bf\\u09ac\\u09be\\u09b0\",\n      \"\\u09b8\\u09cb\\u09ae\\u09ac\\u09be\\u09b0\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\\u09ac\\u09be\\u09b0\",\n      \"\\u09ac\\u09c1\\u09a7\\u09ac\\u09be\\u09b0\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b8\\u09cd\\u09aa\\u09a4\\u09bf\\u09ac\\u09be\\u09b0\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09b0\\u09ac\\u09be\\u09b0\",\n      \"\\u09b6\\u09a8\\u09bf\\u09ac\\u09be\\u09b0\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0996\\u09cd\\u09b0\\u09bf\\u09b8\\u09cd\\u099f\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\",\n      \"\\u0996\\u09c3\\u09b7\\u09cd\\u099f\\u09be\\u09ac\\u09cd\\u09a6\"\n    ],\n    \"ERAS\": [\n      \"\\u0996\\u09cd\\u09b0\\u09bf\\u09b8\\u09cd\\u099f\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\",\n      \"\\u0996\\u09c3\\u09b7\\u09cd\\u099f\\u09be\\u09ac\\u09cd\\u09a6\"\n    ],\n    \"FIRSTDAYOFWEEK\": 4,\n    \"MONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09b0\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u09b0\\u09ac\\u09bf\",\n      \"\\u09b8\\u09cb\\u09ae\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\",\n      \"\\u09ac\\u09c1\\u09a7\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b8\\u09cd\\u09aa\\u09a4\\u09bf\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09b0\",\n      \"\\u09b6\\u09a8\\u09bf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\",\n      \"\\u09ab\\u09c7\\u09ac\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09b0\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u09f3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bn-bd\",\n  \"localeID\": \"bn_BD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bn-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u09b0\\u09ac\\u09bf\\u09ac\\u09be\\u09b0\",\n      \"\\u09b8\\u09cb\\u09ae\\u09ac\\u09be\\u09b0\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\\u09ac\\u09be\\u09b0\",\n      \"\\u09ac\\u09c1\\u09a7\\u09ac\\u09be\\u09b0\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b8\\u09cd\\u09aa\\u09a4\\u09bf\\u09ac\\u09be\\u09b0\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09b0\\u09ac\\u09be\\u09b0\",\n      \"\\u09b6\\u09a8\\u09bf\\u09ac\\u09be\\u09b0\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0996\\u09cd\\u09b0\\u09bf\\u09b8\\u09cd\\u099f\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\",\n      \"\\u0996\\u09c3\\u09b7\\u09cd\\u099f\\u09be\\u09ac\\u09cd\\u09a6\"\n    ],\n    \"ERAS\": [\n      \"\\u0996\\u09cd\\u09b0\\u09bf\\u09b8\\u09cd\\u099f\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\",\n      \"\\u0996\\u09c3\\u09b7\\u09cd\\u099f\\u09be\\u09ac\\u09cd\\u09a6\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09b0\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u09b0\\u09ac\\u09bf\",\n      \"\\u09b8\\u09cb\\u09ae\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\",\n      \"\\u09ac\\u09c1\\u09a7\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b8\\u09cd\\u09aa\\u09a4\\u09bf\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09b0\",\n      \"\\u09b6\\u09a8\\u09bf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\",\n      \"\\u09ab\\u09c7\\u09ac\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09b0\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bn-in\",\n  \"localeID\": \"bn_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u09b0\\u09ac\\u09bf\\u09ac\\u09be\\u09b0\",\n      \"\\u09b8\\u09cb\\u09ae\\u09ac\\u09be\\u09b0\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\\u09ac\\u09be\\u09b0\",\n      \"\\u09ac\\u09c1\\u09a7\\u09ac\\u09be\\u09b0\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b8\\u09cd\\u09aa\\u09a4\\u09bf\\u09ac\\u09be\\u09b0\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09b0\\u09ac\\u09be\\u09b0\",\n      \"\\u09b6\\u09a8\\u09bf\\u09ac\\u09be\\u09b0\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0996\\u09cd\\u09b0\\u09bf\\u09b8\\u09cd\\u099f\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\",\n      \"\\u0996\\u09c3\\u09b7\\u09cd\\u099f\\u09be\\u09ac\\u09cd\\u09a6\"\n    ],\n    \"ERAS\": [\n      \"\\u0996\\u09cd\\u09b0\\u09bf\\u09b8\\u09cd\\u099f\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\",\n      \"\\u0996\\u09c3\\u09b7\\u09cd\\u099f\\u09be\\u09ac\\u09cd\\u09a6\"\n    ],\n    \"FIRSTDAYOFWEEK\": 4,\n    \"MONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09b0\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u09b0\\u09ac\\u09bf\",\n      \"\\u09b8\\u09cb\\u09ae\",\n      \"\\u09ae\\u0999\\u09cd\\u0997\\u09b2\",\n      \"\\u09ac\\u09c1\\u09a7\",\n      \"\\u09ac\\u09c3\\u09b9\\u09b8\\u09cd\\u09aa\\u09a4\\u09bf\",\n      \"\\u09b6\\u09c1\\u0995\\u09cd\\u09b0\",\n      \"\\u09b6\\u09a8\\u09bf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\",\n      \"\\u09ab\\u09c7\\u09ac\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u099c\\u09be\\u09a8\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ab\\u09c7\\u09ac\\u09cd\\u09b0\\u09c1\\u09af\\u09bc\\u09be\\u09b0\\u09c0\",\n      \"\\u09ae\\u09be\\u09b0\\u09cd\\u099a\",\n      \"\\u098f\\u09aa\\u09cd\\u09b0\\u09bf\\u09b2\",\n      \"\\u09ae\\u09c7\",\n      \"\\u099c\\u09c1\\u09a8\",\n      \"\\u099c\\u09c1\\u09b2\\u09be\\u0987\",\n      \"\\u0986\\u0997\\u09b8\\u09cd\\u099f\",\n      \"\\u09b8\\u09c7\\u09aa\\u09cd\\u099f\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u0985\\u0995\\u09cd\\u099f\\u09cb\\u09ac\\u09b0\",\n      \"\\u09a8\\u09ad\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\",\n      \"\\u09a1\\u09bf\\u09b8\\u09c7\\u09ae\\u09cd\\u09ac\\u09b0\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u09f3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bn\",\n  \"localeID\": \"bn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bo-cn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0f66\\u0f94\\u0f0b\\u0f51\\u0fb2\\u0f7c\\u0f0b\",\n      \"\\u0f55\\u0fb1\\u0f72\\u0f0b\\u0f51\\u0fb2\\u0f7c\\u0f0b\"\n    ],\n    \"DAY\": [\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\\u0f66\\u0f94\\u0f7c\\u0f53\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\"\n    ],\n    \"ERAS\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\\u0f66\\u0f94\\u0f7c\\u0f53\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f44\\u0f0b\\u0f54\\u0f7c\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f22\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f23\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f24\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f25\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f26\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f27\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f28\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f29\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f20\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f21\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f22\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f44\\u0f0b\\u0f54\\u0f7c\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM\\u0f60\\u0f72\\u0f0b\\u0f5a\\u0f7a\\u0f66\\u0f0bd, EEEE\",\n    \"longDate\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by MMMM\\u0f60\\u0f72\\u0f0b\\u0f5a\\u0f7a\\u0f66\\u0f0bd\",\n    \"medium\": \"y \\u0f63\\u0f7c\\u0f60\\u0f72\\u0f0bMMM\\u0f5a\\u0f7a\\u0f66\\u0f0bd h:mm:ss a\",\n    \"mediumDate\": \"y \\u0f63\\u0f7c\\u0f60\\u0f72\\u0f0bMMM\\u0f5a\\u0f7a\\u0f66\\u0f0bd\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"bo-cn\",\n  \"localeID\": \"bo_CN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bo-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0f66\\u0f94\\u0f0b\\u0f51\\u0fb2\\u0f7c\\u0f0b\",\n      \"\\u0f55\\u0fb1\\u0f72\\u0f0b\\u0f51\\u0fb2\\u0f7c\\u0f0b\"\n    ],\n    \"DAY\": [\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\\u0f66\\u0f94\\u0f7c\\u0f53\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\"\n    ],\n    \"ERAS\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\\u0f66\\u0f94\\u0f7c\\u0f53\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f44\\u0f0b\\u0f54\\u0f7c\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f22\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f23\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f24\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f25\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f26\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f27\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f28\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f29\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f20\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f21\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f22\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f44\\u0f0b\\u0f54\\u0f7c\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y MMMM\\u0f60\\u0f72\\u0f0b\\u0f5a\\u0f7a\\u0f66\\u0f0bd, EEEE\",\n    \"longDate\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by MMMM\\u0f60\\u0f72\\u0f0b\\u0f5a\\u0f7a\\u0f66\\u0f0bd\",\n    \"medium\": \"y \\u0f63\\u0f7c\\u0f60\\u0f72\\u0f0bMMM\\u0f5a\\u0f7a\\u0f66\\u0f0bd h:mm:ss a\",\n    \"mediumDate\": \"y \\u0f63\\u0f7c\\u0f60\\u0f72\\u0f0bMMM\\u0f5a\\u0f7a\\u0f66\\u0f0bd\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"bo-in\",\n  \"localeID\": \"bo_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0f66\\u0f94\\u0f0b\\u0f51\\u0fb2\\u0f7c\\u0f0b\",\n      \"\\u0f55\\u0fb1\\u0f72\\u0f0b\\u0f51\\u0fb2\\u0f7c\\u0f0b\"\n    ],\n    \"DAY\": [\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\\u0f66\\u0f94\\u0f7c\\u0f53\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\"\n    ],\n    \"ERAS\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\\u0f66\\u0f94\\u0f7c\\u0f53\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f44\\u0f0b\\u0f54\\u0f7c\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f22\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f23\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f24\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f25\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f26\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f27\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f28\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f29\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f20\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f21\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f21\\u0f22\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f44\\u0f0b\\u0f54\\u0f7c\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM\\u0f60\\u0f72\\u0f0b\\u0f5a\\u0f7a\\u0f66\\u0f0bd, EEEE\",\n    \"longDate\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by MMMM\\u0f60\\u0f72\\u0f0b\\u0f5a\\u0f7a\\u0f66\\u0f0bd\",\n    \"medium\": \"y \\u0f63\\u0f7c\\u0f60\\u0f72\\u0f0bMMM\\u0f5a\\u0f7a\\u0f66\\u0f0bd h:mm:ss a\",\n    \"mediumDate\": \"y \\u0f63\\u0f7c\\u0f60\\u0f72\\u0f0bMMM\\u0f5a\\u0f7a\\u0f66\\u0f0bd\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"bo\",\n  \"localeID\": \"bo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_br-fr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"A.M.\",\n      \"G.M.\"\n    ],\n    \"DAY\": [\n      \"Sul\",\n      \"Lun\",\n      \"Meurzh\",\n      \"Merc\\u02bcher\",\n      \"Yaou\",\n      \"Gwener\",\n      \"Sadorn\"\n    ],\n    \"ERANAMES\": [\n      \"a-raok Jezuz-Krist\",\n      \"goude Jezuz-Krist\"\n    ],\n    \"ERAS\": [\n      \"a-raok J.K.\",\n      \"goude J.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Genver\",\n      \"C\\u02bchwevrer\",\n      \"Meurzh\",\n      \"Ebrel\",\n      \"Mae\",\n      \"Mezheven\",\n      \"Gouere\",\n      \"Eost\",\n      \"Gwengolo\",\n      \"Here\",\n      \"Du\",\n      \"Kerzu\"\n    ],\n    \"SHORTDAY\": [\n      \"Sul\",\n      \"Lun\",\n      \"Meu.\",\n      \"Mer.\",\n      \"Yaou\",\n      \"Gwe.\",\n      \"Sad.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Gen.\",\n      \"C\\u02bchwe.\",\n      \"Meur.\",\n      \"Ebr.\",\n      \"Mae\",\n      \"Mezh.\",\n      \"Goue.\",\n      \"Eost\",\n      \"Gwen.\",\n      \"Here\",\n      \"Du\",\n      \"Kzu.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Genver\",\n      \"C\\u02bchwevrer\",\n      \"Meurzh\",\n      \"Ebrel\",\n      \"Mae\",\n      \"Mezheven\",\n      \"Gouere\",\n      \"Eost\",\n      \"Gwengolo\",\n      \"Here\",\n      \"Du\",\n      \"Kerzu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"br-fr\",\n  \"localeID\": \"br_FR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91) {    return PLURAL_CATEGORY.ONE;  }  if (n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92) {    return PLURAL_CATEGORY.TWO;  }  if ((n % 10 >= 3 && n % 10 <= 4 || n % 10 == 9) && (n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 < 90 || n % 100 > 99)) {    return PLURAL_CATEGORY.FEW;  }  if (n != 0 && n % 1000000 == 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_br.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"A.M.\",\n      \"G.M.\"\n    ],\n    \"DAY\": [\n      \"Sul\",\n      \"Lun\",\n      \"Meurzh\",\n      \"Merc\\u02bcher\",\n      \"Yaou\",\n      \"Gwener\",\n      \"Sadorn\"\n    ],\n    \"ERANAMES\": [\n      \"a-raok Jezuz-Krist\",\n      \"goude Jezuz-Krist\"\n    ],\n    \"ERAS\": [\n      \"a-raok J.K.\",\n      \"goude J.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Genver\",\n      \"C\\u02bchwevrer\",\n      \"Meurzh\",\n      \"Ebrel\",\n      \"Mae\",\n      \"Mezheven\",\n      \"Gouere\",\n      \"Eost\",\n      \"Gwengolo\",\n      \"Here\",\n      \"Du\",\n      \"Kerzu\"\n    ],\n    \"SHORTDAY\": [\n      \"Sul\",\n      \"Lun\",\n      \"Meu.\",\n      \"Mer.\",\n      \"Yaou\",\n      \"Gwe.\",\n      \"Sad.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Gen.\",\n      \"C\\u02bchwe.\",\n      \"Meur.\",\n      \"Ebr.\",\n      \"Mae\",\n      \"Mezh.\",\n      \"Goue.\",\n      \"Eost\",\n      \"Gwen.\",\n      \"Here\",\n      \"Du\",\n      \"Kzu.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Genver\",\n      \"C\\u02bchwevrer\",\n      \"Meurzh\",\n      \"Ebrel\",\n      \"Mae\",\n      \"Mezheven\",\n      \"Gouere\",\n      \"Eost\",\n      \"Gwengolo\",\n      \"Here\",\n      \"Du\",\n      \"Kerzu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"br\",\n  \"localeID\": \"br\",\n  \"pluralCat\": function(n, opt_precision) {  if (n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91) {    return PLURAL_CATEGORY.ONE;  }  if (n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92) {    return PLURAL_CATEGORY.TWO;  }  if ((n % 10 >= 3 && n % 10 <= 4 || n % 10 == 9) && (n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 < 90 || n % 100 > 99)) {    return PLURAL_CATEGORY.FEW;  }  if (n != 0 && n % 1000000 == 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_brx-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092b\\u0941\\u0902\",\n      \"\\u092c\\u0947\\u0932\\u093e\\u0938\\u0947\"\n    ],\n    \"DAY\": [\n      \"\\u0930\\u092c\\u093f\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u092e\\u092c\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0932\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0926\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u093f\\u0938\\u0925\\u093f\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u0941\\u0916\\u0941\\u0930\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u0941\\u0928\\u093f\\u092c\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u093e.\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\"\n    ],\n    \"ERAS\": [\n      \"\\u0908\\u0938\\u093e.\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u0938\",\n      \"\\u090f\\u092b\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0907\",\n      \"\\u0906\\u0917\\u0938\\u094d\\u0925\",\n      \"\\u0938\\u0947\\u092c\\u0925\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0905\\u0916\\u0925\\u092c\\u0930\",\n      \"\\u0928\\u092c\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u092c\\u093f\",\n      \"\\u0938\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0932\",\n      \"\\u092c\\u0941\\u0926\",\n      \"\\u092c\\u093f\\u0938\\u0925\\u093f\",\n      \"\\u0938\\u0941\\u0916\\u0941\\u0930\",\n      \"\\u0938\\u0941\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u0938\",\n      \"\\u090f\\u092b\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0907\",\n      \"\\u0906\\u0917\\u0938\\u094d\\u0925\",\n      \"\\u0938\\u0947\\u092c\\u0925\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0905\\u0916\\u0925\\u092c\\u0930\",\n      \"\\u0928\\u092c\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u0938\",\n      \"\\u090f\\u092b\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0907\",\n      \"\\u0906\\u0917\\u0938\\u094d\\u0925\",\n      \"\\u0938\\u0947\\u092c\\u0925\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0905\\u0916\\u0925\\u092c\\u0930\",\n      \"\\u0928\\u092c\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"brx-in\",\n  \"localeID\": \"brx_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_brx.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092b\\u0941\\u0902\",\n      \"\\u092c\\u0947\\u0932\\u093e\\u0938\\u0947\"\n    ],\n    \"DAY\": [\n      \"\\u0930\\u092c\\u093f\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u092e\\u092c\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0932\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0926\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u093f\\u0938\\u0925\\u093f\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u0941\\u0916\\u0941\\u0930\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u0941\\u0928\\u093f\\u092c\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u093e.\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\"\n    ],\n    \"ERAS\": [\n      \"\\u0908\\u0938\\u093e.\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u0938\",\n      \"\\u090f\\u092b\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0907\",\n      \"\\u0906\\u0917\\u0938\\u094d\\u0925\",\n      \"\\u0938\\u0947\\u092c\\u0925\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0905\\u0916\\u0925\\u092c\\u0930\",\n      \"\\u0928\\u092c\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u092c\\u093f\",\n      \"\\u0938\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0932\",\n      \"\\u092c\\u0941\\u0926\",\n      \"\\u092c\\u093f\\u0938\\u0925\\u093f\",\n      \"\\u0938\\u0941\\u0916\\u0941\\u0930\",\n      \"\\u0938\\u0941\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u0938\",\n      \"\\u090f\\u092b\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0907\",\n      \"\\u0906\\u0917\\u0938\\u094d\\u0925\",\n      \"\\u0938\\u0947\\u092c\\u0925\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0905\\u0916\\u0925\\u092c\\u0930\",\n      \"\\u0928\\u092c\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u0938\",\n      \"\\u090f\\u092b\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0907\",\n      \"\\u0906\\u0917\\u0938\\u094d\\u0925\",\n      \"\\u0938\\u0947\\u092c\\u0925\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0905\\u0916\\u0925\\u092c\\u0930\",\n      \"\\u0928\\u092c\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0947\\u091c\\u094d\\u092c\\u093c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"brx\",\n  \"localeID\": \"brx\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bs-cyrl-ba.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e\\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0438\\u0458\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u041f\\u0440\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u041d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434\",\n      \"\\u043f\\u043e\\u043d\",\n      \"\\u0443\\u0442\\u043e\",\n      \"\\u0441\\u0440\\u0438\",\n      \"\\u0447\\u0435\\u0442\",\n      \"\\u043f\\u0435\\u0442\",\n      \"\\u0441\\u0443\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d\",\n      \"\\u0444\\u0435\\u0431\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043f\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0432\",\n      \"\\u0434\\u0435\\u0446\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bs-cyrl-ba\",\n  \"localeID\": \"bs_Cyrl_BA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bs-cyrl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e\\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0438\\u0458\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u041f\\u0440\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u041d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434\",\n      \"\\u043f\\u043e\\u043d\",\n      \"\\u0443\\u0442\\u043e\",\n      \"\\u0441\\u0440\\u0438\",\n      \"\\u0447\\u0435\\u0442\",\n      \"\\u043f\\u0435\\u0442\",\n      \"\\u0441\\u0443\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d\",\n      \"\\u0444\\u0435\\u0431\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043f\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0432\",\n      \"\\u0434\\u0435\\u0446\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bs-cyrl\",\n  \"localeID\": \"bs_Cyrl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bs-latn-ba.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"prijepodne\",\n      \"popodne\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedjeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sri\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y.\",\n    \"longDate\": \"d. MMMM y.\",\n    \"medium\": \"d. MMM. y. HH:mm:ss\",\n    \"mediumDate\": \"d. MMM. y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bs-latn-ba\",\n  \"localeID\": \"bs_Latn_BA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bs-latn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"prijepodne\",\n      \"popodne\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedjeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sri\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y.\",\n    \"longDate\": \"d. MMMM y.\",\n    \"medium\": \"d. MMM. y. HH:mm:ss\",\n    \"mediumDate\": \"d. MMM. y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bs-latn\",\n  \"localeID\": \"bs_Latn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_bs.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"prijepodne\",\n      \"popodne\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedjeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sri\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y.\",\n    \"longDate\": \"d. MMMM y.\",\n    \"medium\": \"d. MMM. y. HH:mm:ss\",\n    \"mediumDate\": \"d. MMM. y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"bs\",\n  \"localeID\": \"bs\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ca-ad.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"diumenge\",\n      \"dilluns\",\n      \"dimarts\",\n      \"dimecres\",\n      \"dijous\",\n      \"divendres\",\n      \"dissabte\"\n    ],\n    \"ERANAMES\": [\n      \"abans de Crist\",\n      \"despr\\u00e9s de Crist\"\n    ],\n    \"ERAS\": [\n      \"aC\",\n      \"dC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de gener\",\n      \"de febrer\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abril\",\n      \"de maig\",\n      \"de juny\",\n      \"de juliol\",\n      \"d\\u2019agost\",\n      \"de setembre\",\n      \"d\\u2019octubre\",\n      \"de novembre\",\n      \"de desembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dg.\",\n      \"dl.\",\n      \"dt.\",\n      \"dc.\",\n      \"dj.\",\n      \"dv.\",\n      \"ds.\"\n    ],\n    \"SHORTMONTH\": [\n      \"de gen.\",\n      \"de febr.\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abr.\",\n      \"de maig\",\n      \"de juny\",\n      \"de jul.\",\n      \"d\\u2019ag.\",\n      \"de set.\",\n      \"d\\u2019oct.\",\n      \"de nov.\",\n      \"de des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gener\",\n      \"febrer\",\n      \"mar\\u00e7\",\n      \"abril\",\n      \"maig\",\n      \"juny\",\n      \"juliol\",\n      \"agost\",\n      \"setembre\",\n      \"octubre\",\n      \"novembre\",\n      \"desembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ca-ad\",\n  \"localeID\": \"ca_AD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ca-es-valencia.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"diumenge\",\n      \"dilluns\",\n      \"dimarts\",\n      \"dimecres\",\n      \"dijous\",\n      \"divendres\",\n      \"dissabte\"\n    ],\n    \"ERANAMES\": [\n      \"abans de Crist\",\n      \"despr\\u00e9s de Crist\"\n    ],\n    \"ERAS\": [\n      \"aC\",\n      \"dC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de gener\",\n      \"de febrer\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abril\",\n      \"de maig\",\n      \"de juny\",\n      \"de juliol\",\n      \"d\\u2019agost\",\n      \"de setembre\",\n      \"d\\u2019octubre\",\n      \"de novembre\",\n      \"de desembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dg.\",\n      \"dl.\",\n      \"dt.\",\n      \"dc.\",\n      \"dj.\",\n      \"dv.\",\n      \"ds.\"\n    ],\n    \"SHORTMONTH\": [\n      \"gen.\",\n      \"febr.\",\n      \"mar\\u00e7\",\n      \"abr.\",\n      \"maig\",\n      \"juny\",\n      \"jul.\",\n      \"ag.\",\n      \"set.\",\n      \"oct.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gener\",\n      \"febrer\",\n      \"mar\\u00e7\",\n      \"abril\",\n      \"maig\",\n      \"juny\",\n      \"juliol\",\n      \"agost\",\n      \"setembre\",\n      \"octubre\",\n      \"novembre\",\n      \"desembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ca-es-valencia\",\n  \"localeID\": \"ca_ES_VALENCIA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ca-es.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"diumenge\",\n      \"dilluns\",\n      \"dimarts\",\n      \"dimecres\",\n      \"dijous\",\n      \"divendres\",\n      \"dissabte\"\n    ],\n    \"ERANAMES\": [\n      \"abans de Crist\",\n      \"despr\\u00e9s de Crist\"\n    ],\n    \"ERAS\": [\n      \"aC\",\n      \"dC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de gener\",\n      \"de febrer\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abril\",\n      \"de maig\",\n      \"de juny\",\n      \"de juliol\",\n      \"d\\u2019agost\",\n      \"de setembre\",\n      \"d\\u2019octubre\",\n      \"de novembre\",\n      \"de desembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dg.\",\n      \"dl.\",\n      \"dt.\",\n      \"dc.\",\n      \"dj.\",\n      \"dv.\",\n      \"ds.\"\n    ],\n    \"SHORTMONTH\": [\n      \"de gen.\",\n      \"de febr.\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abr.\",\n      \"de maig\",\n      \"de juny\",\n      \"de jul.\",\n      \"d\\u2019ag.\",\n      \"de set.\",\n      \"d\\u2019oct.\",\n      \"de nov.\",\n      \"de des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gener\",\n      \"febrer\",\n      \"mar\\u00e7\",\n      \"abril\",\n      \"maig\",\n      \"juny\",\n      \"juliol\",\n      \"agost\",\n      \"setembre\",\n      \"octubre\",\n      \"novembre\",\n      \"desembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ca-es\",\n  \"localeID\": \"ca_ES\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ca-fr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"diumenge\",\n      \"dilluns\",\n      \"dimarts\",\n      \"dimecres\",\n      \"dijous\",\n      \"divendres\",\n      \"dissabte\"\n    ],\n    \"ERANAMES\": [\n      \"abans de Crist\",\n      \"despr\\u00e9s de Crist\"\n    ],\n    \"ERAS\": [\n      \"aC\",\n      \"dC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de gener\",\n      \"de febrer\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abril\",\n      \"de maig\",\n      \"de juny\",\n      \"de juliol\",\n      \"d\\u2019agost\",\n      \"de setembre\",\n      \"d\\u2019octubre\",\n      \"de novembre\",\n      \"de desembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dg.\",\n      \"dl.\",\n      \"dt.\",\n      \"dc.\",\n      \"dj.\",\n      \"dv.\",\n      \"ds.\"\n    ],\n    \"SHORTMONTH\": [\n      \"de gen.\",\n      \"de febr.\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abr.\",\n      \"de maig\",\n      \"de juny\",\n      \"de jul.\",\n      \"d\\u2019ag.\",\n      \"de set.\",\n      \"d\\u2019oct.\",\n      \"de nov.\",\n      \"de des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gener\",\n      \"febrer\",\n      \"mar\\u00e7\",\n      \"abril\",\n      \"maig\",\n      \"juny\",\n      \"juliol\",\n      \"agost\",\n      \"setembre\",\n      \"octubre\",\n      \"novembre\",\n      \"desembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ca-fr\",\n  \"localeID\": \"ca_FR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ca-it.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"diumenge\",\n      \"dilluns\",\n      \"dimarts\",\n      \"dimecres\",\n      \"dijous\",\n      \"divendres\",\n      \"dissabte\"\n    ],\n    \"ERANAMES\": [\n      \"abans de Crist\",\n      \"despr\\u00e9s de Crist\"\n    ],\n    \"ERAS\": [\n      \"aC\",\n      \"dC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de gener\",\n      \"de febrer\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abril\",\n      \"de maig\",\n      \"de juny\",\n      \"de juliol\",\n      \"d\\u2019agost\",\n      \"de setembre\",\n      \"d\\u2019octubre\",\n      \"de novembre\",\n      \"de desembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dg.\",\n      \"dl.\",\n      \"dt.\",\n      \"dc.\",\n      \"dj.\",\n      \"dv.\",\n      \"ds.\"\n    ],\n    \"SHORTMONTH\": [\n      \"de gen.\",\n      \"de febr.\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abr.\",\n      \"de maig\",\n      \"de juny\",\n      \"de jul.\",\n      \"d\\u2019ag.\",\n      \"de set.\",\n      \"d\\u2019oct.\",\n      \"de nov.\",\n      \"de des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gener\",\n      \"febrer\",\n      \"mar\\u00e7\",\n      \"abril\",\n      \"maig\",\n      \"juny\",\n      \"juliol\",\n      \"agost\",\n      \"setembre\",\n      \"octubre\",\n      \"novembre\",\n      \"desembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ca-it\",\n  \"localeID\": \"ca_IT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ca.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"diumenge\",\n      \"dilluns\",\n      \"dimarts\",\n      \"dimecres\",\n      \"dijous\",\n      \"divendres\",\n      \"dissabte\"\n    ],\n    \"ERANAMES\": [\n      \"abans de Crist\",\n      \"despr\\u00e9s de Crist\"\n    ],\n    \"ERAS\": [\n      \"aC\",\n      \"dC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"de gener\",\n      \"de febrer\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abril\",\n      \"de maig\",\n      \"de juny\",\n      \"de juliol\",\n      \"d\\u2019agost\",\n      \"de setembre\",\n      \"d\\u2019octubre\",\n      \"de novembre\",\n      \"de desembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dg.\",\n      \"dl.\",\n      \"dt.\",\n      \"dc.\",\n      \"dj.\",\n      \"dv.\",\n      \"ds.\"\n    ],\n    \"SHORTMONTH\": [\n      \"de gen.\",\n      \"de febr.\",\n      \"de mar\\u00e7\",\n      \"d\\u2019abr.\",\n      \"de maig\",\n      \"de juny\",\n      \"de jul.\",\n      \"d\\u2019ag.\",\n      \"de set.\",\n      \"d\\u2019oct.\",\n      \"de nov.\",\n      \"de des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gener\",\n      \"febrer\",\n      \"mar\\u00e7\",\n      \"abril\",\n      \"maig\",\n      \"juny\",\n      \"juliol\",\n      \"agost\",\n      \"setembre\",\n      \"octubre\",\n      \"novembre\",\n      \"desembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM 'de' y\",\n    \"longDate\": \"d MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ca\",\n  \"localeID\": \"ca\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ce-ru.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u043a\\u04c0\\u0438\\u0440\\u0430\\u043d\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u043e\\u0440\\u0448\\u043e\\u0442\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u0438\\u043d\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043a\\u0445\\u0430\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u0435\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043f\\u04c0\\u0435\\u0440\\u0430\\u0441\\u043a\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u043e\\u0442 \\u0434\\u0435\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043a\\u04c0\\u0438\\u0440\\u0430\\u043d\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u043e\\u0440\\u0448\\u043e\\u0442\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u0438\\u043d\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043a\\u0445\\u0430\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u0435\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043f\\u04c0\\u0435\\u0440\\u0430\\u0441\\u043a\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u043e\\u0442 \\u0434\\u0435\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\",\n      \"\\u0438\\u044e\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043d\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u044f\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ce-ru\",\n  \"localeID\": \"ce_RU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ce.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u043a\\u04c0\\u0438\\u0440\\u0430\\u043d\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u043e\\u0440\\u0448\\u043e\\u0442\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u0438\\u043d\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043a\\u0445\\u0430\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u0435\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043f\\u04c0\\u0435\\u0440\\u0430\\u0441\\u043a\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u043e\\u0442 \\u0434\\u0435\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043a\\u04c0\\u0438\\u0440\\u0430\\u043d\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u043e\\u0440\\u0448\\u043e\\u0442\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u0438\\u043d\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043a\\u0445\\u0430\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u0435\\u0430\\u0440\\u0438\\u043d \\u0434\\u0435\",\n      \"\\u043f\\u04c0\\u0435\\u0440\\u0430\\u0441\\u043a\\u0430\\u043d \\u0434\\u0435\",\n      \"\\u0448\\u043e\\u0442 \\u0434\\u0435\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\",\n      \"\\u0438\\u044e\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043d\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u044f\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ce\",\n  \"localeID\": \"ce\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cgg-ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sande\",\n      \"Orwokubanza\",\n      \"Orwakabiri\",\n      \"Orwakashatu\",\n      \"Orwakana\",\n      \"Orwakataano\",\n      \"Orwamukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kurisito Atakaijire\",\n      \"Kurisito Yaijire\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"SHORTDAY\": [\n      \"SAN\",\n      \"ORK\",\n      \"OKB\",\n      \"OKS\",\n      \"OKN\",\n      \"OKT\",\n      \"OMK\"\n    ],\n    \"SHORTMONTH\": [\n      \"KBZ\",\n      \"KBR\",\n      \"KST\",\n      \"KKN\",\n      \"KTN\",\n      \"KMK\",\n      \"KMS\",\n      \"KMN\",\n      \"KMW\",\n      \"KKM\",\n      \"KNK\",\n      \"KNB\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"cgg-ug\",\n  \"localeID\": \"cgg_UG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cgg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sande\",\n      \"Orwokubanza\",\n      \"Orwakabiri\",\n      \"Orwakashatu\",\n      \"Orwakana\",\n      \"Orwakataano\",\n      \"Orwamukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kurisito Atakaijire\",\n      \"Kurisito Yaijire\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"SHORTDAY\": [\n      \"SAN\",\n      \"ORK\",\n      \"OKB\",\n      \"OKS\",\n      \"OKN\",\n      \"OKT\",\n      \"OMK\"\n    ],\n    \"SHORTMONTH\": [\n      \"KBZ\",\n      \"KBR\",\n      \"KST\",\n      \"KKN\",\n      \"KTN\",\n      \"KMK\",\n      \"KMS\",\n      \"KMN\",\n      \"KMW\",\n      \"KKM\",\n      \"KNK\",\n      \"KNB\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"cgg\",\n  \"localeID\": \"cgg\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_chr-us.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u13cc\\u13be\\u13b4\",\n      \"\\u13d2\\u13af\\u13f1\\u13a2\\u13d7\\u13e2\"\n    ],\n    \"DAY\": [\n      \"\\u13a4\\u13be\\u13d9\\u13d3\\u13c6\\u13cd\\u13ac\",\n      \"\\u13a4\\u13be\\u13d9\\u13d3\\u13c9\\u13c5\\u13af\",\n      \"\\u13d4\\u13b5\\u13c1\\u13a2\\u13a6\",\n      \"\\u13e6\\u13a2\\u13c1\\u13a2\\u13a6\",\n      \"\\u13c5\\u13a9\\u13c1\\u13a2\\u13a6\",\n      \"\\u13e7\\u13be\\u13a9\\u13b6\\u13cd\\u13d7\",\n      \"\\u13a4\\u13be\\u13d9\\u13d3\\u13c8\\u13d5\\u13be\"\n    ],\n    \"ERANAMES\": [\n      \"\\u13e7\\u13d3\\u13b7\\u13b8 \\u13a4\\u13b7\\u13af\\u13cd\\u13d7 \\u13a6\\u13b6\\u13c1\\u13db\",\n      \"\\u13a0\\u13c3 \\u13d9\\u13bb\\u13c2\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u13a4\\u13c3\\u13b8\\u13d4\\u13c5\",\n      \"\\u13a7\\u13a6\\u13b5\",\n      \"\\u13a0\\u13c5\\u13f1\",\n      \"\\u13a7\\u13ec\\u13c2\",\n      \"\\u13a0\\u13c2\\u13cd\\u13ac\\u13d8\",\n      \"\\u13d5\\u13ad\\u13b7\\u13f1\",\n      \"\\u13ab\\u13f0\\u13c9\\u13c2\",\n      \"\\u13a6\\u13b6\\u13c2\",\n      \"\\u13da\\u13b5\\u13cd\\u13d7\",\n      \"\\u13da\\u13c2\\u13c5\\u13d7\",\n      \"\\u13c5\\u13d3\\u13d5\\u13c6\",\n      \"\\u13a5\\u13cd\\u13a9\\u13f1\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u13c6\\u13cd\\u13ac\",\n      \"\\u13c9\\u13c5\\u13af\",\n      \"\\u13d4\\u13b5\\u13c1\",\n      \"\\u13e6\\u13a2\\u13c1\",\n      \"\\u13c5\\u13a9\\u13c1\",\n      \"\\u13e7\\u13be\\u13a9\",\n      \"\\u13c8\\u13d5\\u13be\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u13a4\\u13c3\",\n      \"\\u13a7\\u13a6\",\n      \"\\u13a0\\u13c5\",\n      \"\\u13a7\\u13ec\",\n      \"\\u13a0\\u13c2\",\n      \"\\u13d5\\u13ad\",\n      \"\\u13ab\\u13f0\",\n      \"\\u13a6\\u13b6\",\n      \"\\u13da\\u13b5\",\n      \"\\u13da\\u13c2\",\n      \"\\u13c5\\u13d3\",\n      \"\\u13a5\\u13cd\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u13a4\\u13c3\\u13b8\\u13d4\\u13c5\",\n      \"\\u13a7\\u13a6\\u13b5\",\n      \"\\u13a0\\u13c5\\u13f1\",\n      \"\\u13a7\\u13ec\\u13c2\",\n      \"\\u13a0\\u13c2\\u13cd\\u13ac\\u13d8\",\n      \"\\u13d5\\u13ad\\u13b7\\u13f1\",\n      \"\\u13ab\\u13f0\\u13c9\\u13c2\",\n      \"\\u13a6\\u13b6\\u13c2\",\n      \"\\u13da\\u13b5\\u13cd\\u13d7\",\n      \"\\u13da\\u13c2\\u13c5\\u13d7\",\n      \"\\u13c5\\u13d3\\u13d5\\u13c6\",\n      \"\\u13a5\\u13cd\\u13a9\\u13f1\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"chr-us\",\n  \"localeID\": \"chr_US\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_chr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u13cc\\u13be\\u13b4\",\n      \"\\u13d2\\u13af\\u13f1\\u13a2\\u13d7\\u13e2\"\n    ],\n    \"DAY\": [\n      \"\\u13a4\\u13be\\u13d9\\u13d3\\u13c6\\u13cd\\u13ac\",\n      \"\\u13a4\\u13be\\u13d9\\u13d3\\u13c9\\u13c5\\u13af\",\n      \"\\u13d4\\u13b5\\u13c1\\u13a2\\u13a6\",\n      \"\\u13e6\\u13a2\\u13c1\\u13a2\\u13a6\",\n      \"\\u13c5\\u13a9\\u13c1\\u13a2\\u13a6\",\n      \"\\u13e7\\u13be\\u13a9\\u13b6\\u13cd\\u13d7\",\n      \"\\u13a4\\u13be\\u13d9\\u13d3\\u13c8\\u13d5\\u13be\"\n    ],\n    \"ERANAMES\": [\n      \"\\u13e7\\u13d3\\u13b7\\u13b8 \\u13a4\\u13b7\\u13af\\u13cd\\u13d7 \\u13a6\\u13b6\\u13c1\\u13db\",\n      \"\\u13a0\\u13c3 \\u13d9\\u13bb\\u13c2\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u13a4\\u13c3\\u13b8\\u13d4\\u13c5\",\n      \"\\u13a7\\u13a6\\u13b5\",\n      \"\\u13a0\\u13c5\\u13f1\",\n      \"\\u13a7\\u13ec\\u13c2\",\n      \"\\u13a0\\u13c2\\u13cd\\u13ac\\u13d8\",\n      \"\\u13d5\\u13ad\\u13b7\\u13f1\",\n      \"\\u13ab\\u13f0\\u13c9\\u13c2\",\n      \"\\u13a6\\u13b6\\u13c2\",\n      \"\\u13da\\u13b5\\u13cd\\u13d7\",\n      \"\\u13da\\u13c2\\u13c5\\u13d7\",\n      \"\\u13c5\\u13d3\\u13d5\\u13c6\",\n      \"\\u13a5\\u13cd\\u13a9\\u13f1\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u13c6\\u13cd\\u13ac\",\n      \"\\u13c9\\u13c5\\u13af\",\n      \"\\u13d4\\u13b5\\u13c1\",\n      \"\\u13e6\\u13a2\\u13c1\",\n      \"\\u13c5\\u13a9\\u13c1\",\n      \"\\u13e7\\u13be\\u13a9\",\n      \"\\u13c8\\u13d5\\u13be\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u13a4\\u13c3\",\n      \"\\u13a7\\u13a6\",\n      \"\\u13a0\\u13c5\",\n      \"\\u13a7\\u13ec\",\n      \"\\u13a0\\u13c2\",\n      \"\\u13d5\\u13ad\",\n      \"\\u13ab\\u13f0\",\n      \"\\u13a6\\u13b6\",\n      \"\\u13da\\u13b5\",\n      \"\\u13da\\u13c2\",\n      \"\\u13c5\\u13d3\",\n      \"\\u13a5\\u13cd\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u13a4\\u13c3\\u13b8\\u13d4\\u13c5\",\n      \"\\u13a7\\u13a6\\u13b5\",\n      \"\\u13a0\\u13c5\\u13f1\",\n      \"\\u13a7\\u13ec\\u13c2\",\n      \"\\u13a0\\u13c2\\u13cd\\u13ac\\u13d8\",\n      \"\\u13d5\\u13ad\\u13b7\\u13f1\",\n      \"\\u13ab\\u13f0\\u13c9\\u13c2\",\n      \"\\u13a6\\u13b6\\u13c2\",\n      \"\\u13da\\u13b5\\u13cd\\u13d7\",\n      \"\\u13da\\u13c2\\u13c5\\u13d7\",\n      \"\\u13c5\\u13d3\\u13d5\\u13c6\",\n      \"\\u13a5\\u13cd\\u13a9\\u13f1\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"chr\",\n  \"localeID\": \"chr\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb-arab-iq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e.\\u0646\",\n      \"\\u0632\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ckb-arab-iq\",\n  \"localeID\": \"ckb_Arab_IQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb-arab-ir.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e.\\u0646\",\n      \"\\u0632\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ckb-arab-ir\",\n  \"localeID\": \"ckb_Arab_IR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb-arab.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e.\\u0646\",\n      \"\\u0632\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ckb-arab\",\n  \"localeID\": \"ckb_Arab\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb-iq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ckb-iq\",\n  \"localeID\": \"ckb_IQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb-ir.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      4\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ckb-ir\",\n  \"localeID\": \"ckb_IR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb-latn-iq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e.\\u0646\",\n      \"\\u0632\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ckb-latn-iq\",\n  \"localeID\": \"ckb_Latn_IQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb-latn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e.\\u0646\",\n      \"\\u0632\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ckb-latn\",\n  \"localeID\": \"ckb_Latn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ckb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0628.\\u0646\",\n      \"\\u062f.\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u067e\\u06ce\\u0634 \\u0632\\u0627\\u06cc\\u06cc\\u0646\",\n      \"\\u0632\\u0627\\u06cc\\u06cc\\u0646\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06d5\\u06a9\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u062f\\u0648\\u0648\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0633\\u06ce\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u0686\\u0648\\u0627\\u0631\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u067e\\u06ce\\u0646\\u062c\\u0634\\u06d5\\u0645\\u0645\\u06d5\",\n      \"\\u06be\\u06d5\\u06cc\\u0646\\u06cc\",\n      \"\\u0634\\u06d5\\u0645\\u0645\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0648\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u0634\\u0648\\u0628\\u0627\\u062a\",\n      \"\\u0626\\u0627\\u0632\\u0627\\u0631\",\n      \"\\u0646\\u06cc\\u0633\\u0627\\u0646\",\n      \"\\u0626\\u0627\\u06cc\\u0627\\u0631\",\n      \"\\u062d\\u0648\\u0632\\u06d5\\u06cc\\u0631\\u0627\\u0646\",\n      \"\\u062a\\u06d5\\u0645\\u0648\\u0648\\u0632\",\n      \"\\u0626\\u0627\\u0628\",\n      \"\\u0626\\u06d5\\u06cc\\u0644\\u0648\\u0648\\u0644\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\",\n      \"\\u062a\\u0634\\u0631\\u06cc\\u0646\\u06cc \\u062f\\u0648\\u0648\\u06d5\\u0645\",\n      \"\\u06a9\\u0627\\u0646\\u0648\\u0646\\u06cc \\u06cc\\u06d5\\u06a9\\u06d5\\u0645\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"d\\u06cc MMMM\\u06cc y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ckb\",\n  \"localeID\": \"ckb\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cs-cz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dop.\",\n      \"odp.\"\n    ],\n    \"DAY\": [\n      \"ned\\u011ble\",\n      \"pond\\u011bl\\u00ed\",\n      \"\\u00fater\\u00fd\",\n      \"st\\u0159eda\",\n      \"\\u010dtvrtek\",\n      \"p\\u00e1tek\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"p\\u0159. n. l.\",\n      \"n. l.\"\n    ],\n    \"ERAS\": [\n      \"p\\u0159. n. l.\",\n      \"n. l.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ledna\",\n      \"\\u00fanora\",\n      \"b\\u0159ezna\",\n      \"dubna\",\n      \"kv\\u011btna\",\n      \"\\u010dervna\",\n      \"\\u010dervence\",\n      \"srpna\",\n      \"z\\u00e1\\u0159\\u00ed\",\n      \"\\u0159\\u00edjna\",\n      \"listopadu\",\n      \"prosince\"\n    ],\n    \"SHORTDAY\": [\n      \"ne\",\n      \"po\",\n      \"\\u00fat\",\n      \"st\",\n      \"\\u010dt\",\n      \"p\\u00e1\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"led\",\n      \"\\u00fano\",\n      \"b\\u0159e\",\n      \"dub\",\n      \"kv\\u011b\",\n      \"\\u010dvn\",\n      \"\\u010dvc\",\n      \"srp\",\n      \"z\\u00e1\\u0159\",\n      \"\\u0159\\u00edj\",\n      \"lis\",\n      \"pro\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"leden\",\n      \"\\u00fanor\",\n      \"b\\u0159ezen\",\n      \"duben\",\n      \"kv\\u011bten\",\n      \"\\u010derven\",\n      \"\\u010dervenec\",\n      \"srpen\",\n      \"z\\u00e1\\u0159\\u00ed\",\n      \"\\u0159\\u00edjen\",\n      \"listopad\",\n      \"prosinec\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. M. y H:mm:ss\",\n    \"mediumDate\": \"d. M. y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.yy H:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"K\\u010d\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"cs-cz\",\n  \"localeID\": \"cs_CZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (i >= 2 && i <= 4 && vf.v == 0) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v != 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cs.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dop.\",\n      \"odp.\"\n    ],\n    \"DAY\": [\n      \"ned\\u011ble\",\n      \"pond\\u011bl\\u00ed\",\n      \"\\u00fater\\u00fd\",\n      \"st\\u0159eda\",\n      \"\\u010dtvrtek\",\n      \"p\\u00e1tek\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"p\\u0159. n. l.\",\n      \"n. l.\"\n    ],\n    \"ERAS\": [\n      \"p\\u0159. n. l.\",\n      \"n. l.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ledna\",\n      \"\\u00fanora\",\n      \"b\\u0159ezna\",\n      \"dubna\",\n      \"kv\\u011btna\",\n      \"\\u010dervna\",\n      \"\\u010dervence\",\n      \"srpna\",\n      \"z\\u00e1\\u0159\\u00ed\",\n      \"\\u0159\\u00edjna\",\n      \"listopadu\",\n      \"prosince\"\n    ],\n    \"SHORTDAY\": [\n      \"ne\",\n      \"po\",\n      \"\\u00fat\",\n      \"st\",\n      \"\\u010dt\",\n      \"p\\u00e1\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"led\",\n      \"\\u00fano\",\n      \"b\\u0159e\",\n      \"dub\",\n      \"kv\\u011b\",\n      \"\\u010dvn\",\n      \"\\u010dvc\",\n      \"srp\",\n      \"z\\u00e1\\u0159\",\n      \"\\u0159\\u00edj\",\n      \"lis\",\n      \"pro\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"leden\",\n      \"\\u00fanor\",\n      \"b\\u0159ezen\",\n      \"duben\",\n      \"kv\\u011bten\",\n      \"\\u010derven\",\n      \"\\u010dervenec\",\n      \"srpen\",\n      \"z\\u00e1\\u0159\\u00ed\",\n      \"\\u0159\\u00edjen\",\n      \"listopad\",\n      \"prosinec\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. M. y H:mm:ss\",\n    \"mediumDate\": \"d. M. y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.yy H:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"K\\u010d\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"cs\",\n  \"localeID\": \"cs\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (i >= 2 && i <= 4 && vf.v == 0) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v != 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cu-ru.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0463\\u0301\\u043b\\u0467\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0463\\u0301\\u043b\\u044c\\u043d\\u0438\\u043a\\u044a\",\n      \"\\u0432\\u0442\\u043e\\u0301\\u0440\\u043d\\u0438\\u043a\\u044a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\\u0300\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0442\\u043e\\u0301\\u043a\\u044a\",\n      \"\\u043f\\u0467\\u0442\\u043e\\u0301\\u043a\\u044a\",\n      \"\\u0441\\ua64b\\u0431\\u0431\\u0461\\u0301\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435\\u0301\\u0434\\u044a \\u0440.\\u00a0\\u0445.\",\n      \"\\u043f\\u043e \\u0440.\\u00a0\\u0445.\"\n    ],\n    \"ERAS\": [\n      \"\\u043f\\u0440\\u0435\\u0301\\u0434\\u044a \\u0440.\\u00a0\\u0445.\",\n      \"\\u043f\\u043e \\u0440.\\u00a0\\u0445.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0456\\u0486\\u0430\\u043d\\u043d\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0430\",\n      \"\\u0444\\u0435\\u0432\\u0440\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0430\",\n      \"\\u043c\\u0430\\u0301\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u0486\\u043f\\u0440\\u0456\\u0301\\u043b\\u043b\\u0457\\u0430\",\n      \"\\u043c\\u0430\\u0301\\u0457\\u0430\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043d\\u0457\\u0430\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043b\\u0457\\u0430\",\n      \"\\u0430\\u0486\\u0301\\u0475\\u0433\\ua64b\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0430\",\n      \"\\u047b\\u0486\\u043a\\u0442\\u0461\\u0301\\u0432\\u0440\\u0457\\u0430\",\n      \"\\u043d\\u043e\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0430\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0430\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\\u2de7\\u0487\\u0467\",\n      \"\\u043f\\u043d\\u2de3\\u0435\",\n      \"\\u0432\\u0442\\u043e\\u2dec\\u0487\",\n      \"\\u0441\\u0440\\u2de3\\u0435\",\n      \"\\u0447\\u0435\\u2de6\\u0487\",\n      \"\\u043f\\u0467\\u2de6\\u0487\",\n      \"\\u0441\\ua64b\\u2de0\\u0487\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0456\\u0486\\u0430\\u2de9\\u0487\",\n      \"\\u0444\\u0435\\u2de1\\u0487\",\n      \"\\u043c\\u0430\\u2dec\\u0487\",\n      \"\\u0430\\u0486\\u043f\\u2dec\\u0487\",\n      \"\\u043c\\u0430\\ua675\",\n      \"\\u0456\\u0486\\ua64b\\u2de9\\u0487\",\n      \"\\u0456\\u0486\\ua64b\\u2de7\\u0487\",\n      \"\\u0430\\u0486\\u0301\\u0475\\u2de2\\u0487\",\n      \"\\u0441\\u0435\\u2deb\\u0487\",\n      \"\\u047b\\u0486\\u043a\\u2dee\",\n      \"\\u043d\\u043e\\u0435\\u2de8\",\n      \"\\u0434\\u0435\\u2de6\\u0487\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0456\\u0486\\u0430\\u043d\\u043d\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0439\",\n      \"\\u0444\\u0435\\u0432\\u0440\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0439\",\n      \"\\u043c\\u0430\\u0301\\u0440\\u0442\\u044a\",\n      \"\\u0430\\u0486\\u043f\\u0440\\u0456\\u0301\\u043b\\u043b\\u0457\\u0439\",\n      \"\\u043c\\u0430\\u0301\\u0457\\u0439\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043d\\u0457\\u0439\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043b\\u0457\\u0439\",\n      \"\\u0430\\u0486\\u0301\\u0475\\u0433\\ua64b\\u0441\\u0442\\u044a\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0439\",\n      \"\\u047b\\u0486\\u043a\\u0442\\u0461\\u0301\\u0432\\u0440\\u0457\\u0439\",\n      \"\\u043d\\u043e\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0439\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0439\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM '\\u043b'. y.\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y.MM.dd HH:mm\",\n    \"shortDate\": \"y.MM.dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"cu-ru\",\n  \"localeID\": \"cu_RU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0463\\u0301\\u043b\\u0467\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0463\\u0301\\u043b\\u044c\\u043d\\u0438\\u043a\\u044a\",\n      \"\\u0432\\u0442\\u043e\\u0301\\u0440\\u043d\\u0438\\u043a\\u044a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\\u0300\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0442\\u043e\\u0301\\u043a\\u044a\",\n      \"\\u043f\\u0467\\u0442\\u043e\\u0301\\u043a\\u044a\",\n      \"\\u0441\\ua64b\\u0431\\u0431\\u0461\\u0301\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435\\u0301\\u0434\\u044a \\u0440.\\u00a0\\u0445.\",\n      \"\\u043f\\u043e \\u0440.\\u00a0\\u0445.\"\n    ],\n    \"ERAS\": [\n      \"\\u043f\\u0440\\u0435\\u0301\\u0434\\u044a \\u0440.\\u00a0\\u0445.\",\n      \"\\u043f\\u043e \\u0440.\\u00a0\\u0445.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0456\\u0486\\u0430\\u043d\\u043d\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0430\",\n      \"\\u0444\\u0435\\u0432\\u0440\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0430\",\n      \"\\u043c\\u0430\\u0301\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u0486\\u043f\\u0440\\u0456\\u0301\\u043b\\u043b\\u0457\\u0430\",\n      \"\\u043c\\u0430\\u0301\\u0457\\u0430\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043d\\u0457\\u0430\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043b\\u0457\\u0430\",\n      \"\\u0430\\u0486\\u0301\\u0475\\u0433\\ua64b\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0430\",\n      \"\\u047b\\u0486\\u043a\\u0442\\u0461\\u0301\\u0432\\u0440\\u0457\\u0430\",\n      \"\\u043d\\u043e\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0430\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0430\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\\u2de7\\u0487\\u0467\",\n      \"\\u043f\\u043d\\u2de3\\u0435\",\n      \"\\u0432\\u0442\\u043e\\u2dec\\u0487\",\n      \"\\u0441\\u0440\\u2de3\\u0435\",\n      \"\\u0447\\u0435\\u2de6\\u0487\",\n      \"\\u043f\\u0467\\u2de6\\u0487\",\n      \"\\u0441\\ua64b\\u2de0\\u0487\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0456\\u0486\\u0430\\u2de9\\u0487\",\n      \"\\u0444\\u0435\\u2de1\\u0487\",\n      \"\\u043c\\u0430\\u2dec\\u0487\",\n      \"\\u0430\\u0486\\u043f\\u2dec\\u0487\",\n      \"\\u043c\\u0430\\ua675\",\n      \"\\u0456\\u0486\\ua64b\\u2de9\\u0487\",\n      \"\\u0456\\u0486\\ua64b\\u2de7\\u0487\",\n      \"\\u0430\\u0486\\u0301\\u0475\\u2de2\\u0487\",\n      \"\\u0441\\u0435\\u2deb\\u0487\",\n      \"\\u047b\\u0486\\u043a\\u2dee\",\n      \"\\u043d\\u043e\\u0435\\u2de8\",\n      \"\\u0434\\u0435\\u2de6\\u0487\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0456\\u0486\\u0430\\u043d\\u043d\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0439\",\n      \"\\u0444\\u0435\\u0432\\u0440\\ua64b\\u0430\\u0301\\u0440\\u0457\\u0439\",\n      \"\\u043c\\u0430\\u0301\\u0440\\u0442\\u044a\",\n      \"\\u0430\\u0486\\u043f\\u0440\\u0456\\u0301\\u043b\\u043b\\u0457\\u0439\",\n      \"\\u043c\\u0430\\u0301\\u0457\\u0439\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043d\\u0457\\u0439\",\n      \"\\u0456\\u0486\\ua64b\\u0301\\u043b\\u0457\\u0439\",\n      \"\\u0430\\u0486\\u0301\\u0475\\u0433\\ua64b\\u0441\\u0442\\u044a\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0439\",\n      \"\\u047b\\u0486\\u043a\\u0442\\u0461\\u0301\\u0432\\u0440\\u0457\\u0439\",\n      \"\\u043d\\u043e\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0439\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u0301\\u043c\\u0432\\u0440\\u0457\\u0439\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM '\\u043b'. y.\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y.MM.dd HH:mm\",\n    \"shortDate\": \"y.MM.dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"cu\",\n  \"localeID\": \"cu\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cy-gb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"yb\",\n      \"yh\"\n    ],\n    \"DAY\": [\n      \"Dydd Sul\",\n      \"Dydd Llun\",\n      \"Dydd Mawrth\",\n      \"Dydd Mercher\",\n      \"Dydd Iau\",\n      \"Dydd Gwener\",\n      \"Dydd Sadwrn\"\n    ],\n    \"ERANAMES\": [\n      \"Cyn Crist\",\n      \"Oed Crist\"\n    ],\n    \"ERAS\": [\n      \"CC\",\n      \"OC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ionawr\",\n      \"Chwefror\",\n      \"Mawrth\",\n      \"Ebrill\",\n      \"Mai\",\n      \"Mehefin\",\n      \"Gorffennaf\",\n      \"Awst\",\n      \"Medi\",\n      \"Hydref\",\n      \"Tachwedd\",\n      \"Rhagfyr\"\n    ],\n    \"SHORTDAY\": [\n      \"Sul\",\n      \"Llun\",\n      \"Maw\",\n      \"Mer\",\n      \"Iau\",\n      \"Gwen\",\n      \"Sad\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ion\",\n      \"Chwef\",\n      \"Maw\",\n      \"Ebrill\",\n      \"Mai\",\n      \"Meh\",\n      \"Gorff\",\n      \"Awst\",\n      \"Medi\",\n      \"Hyd\",\n      \"Tach\",\n      \"Rhag\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ionawr\",\n      \"Chwefror\",\n      \"Mawrth\",\n      \"Ebrill\",\n      \"Mai\",\n      \"Mehefin\",\n      \"Gorffennaf\",\n      \"Awst\",\n      \"Medi\",\n      \"Hydref\",\n      \"Tachwedd\",\n      \"Rhagfyr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"cy-gb\",\n  \"localeID\": \"cy_GB\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n == 3) {    return PLURAL_CATEGORY.FEW;  }  if (n == 6) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_cy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"yb\",\n      \"yh\"\n    ],\n    \"DAY\": [\n      \"Dydd Sul\",\n      \"Dydd Llun\",\n      \"Dydd Mawrth\",\n      \"Dydd Mercher\",\n      \"Dydd Iau\",\n      \"Dydd Gwener\",\n      \"Dydd Sadwrn\"\n    ],\n    \"ERANAMES\": [\n      \"Cyn Crist\",\n      \"Oed Crist\"\n    ],\n    \"ERAS\": [\n      \"CC\",\n      \"OC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ionawr\",\n      \"Chwefror\",\n      \"Mawrth\",\n      \"Ebrill\",\n      \"Mai\",\n      \"Mehefin\",\n      \"Gorffennaf\",\n      \"Awst\",\n      \"Medi\",\n      \"Hydref\",\n      \"Tachwedd\",\n      \"Rhagfyr\"\n    ],\n    \"SHORTDAY\": [\n      \"Sul\",\n      \"Llun\",\n      \"Maw\",\n      \"Mer\",\n      \"Iau\",\n      \"Gwen\",\n      \"Sad\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ion\",\n      \"Chwef\",\n      \"Maw\",\n      \"Ebrill\",\n      \"Mai\",\n      \"Meh\",\n      \"Gorff\",\n      \"Awst\",\n      \"Medi\",\n      \"Hyd\",\n      \"Tach\",\n      \"Rhag\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ionawr\",\n      \"Chwefror\",\n      \"Mawrth\",\n      \"Ebrill\",\n      \"Mai\",\n      \"Mehefin\",\n      \"Gorffennaf\",\n      \"Awst\",\n      \"Medi\",\n      \"Hydref\",\n      \"Tachwedd\",\n      \"Rhagfyr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"cy\",\n  \"localeID\": \"cy\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 0) {    return PLURAL_CATEGORY.ZERO;  }  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n == 3) {    return PLURAL_CATEGORY.FEW;  }  if (n == 6) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_da-dk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\nfunction getWT(v, f) {\n  if (f === 0) {\n    return {w: 0, t: 0};\n  }\n\n  while ((f % 10) === 0) {\n    f /= 10;\n    v--;\n  }\n\n  return {w: v, t: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marts\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"maj\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marts\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE 'den' d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH.mm.ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"dd/MM/y HH.mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"da-dk\",\n  \"localeID\": \"da_DK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  var wt = getWT(vf.v, vf.f);  if (n == 1 || wt.t != 0 && (i == 0 || i == 1)) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_da-gl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\nfunction getWT(v, f) {\n  if (f === 0) {\n    return {w: 0, t: 0};\n  }\n\n  while ((f % 10) === 0) {\n    f /= 10;\n    v--;\n  }\n\n  return {w: v, t: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marts\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"maj\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marts\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE 'den' d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y h.mm.ss a\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"h.mm.ss a\",\n    \"short\": \"dd/MM/y h.mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h.mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"da-gl\",\n  \"localeID\": \"da_GL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  var wt = getWT(vf.v, vf.f);  if (n == 1 || wt.t != 0 && (i == 0 || i == 1)) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_da.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\nfunction getWT(v, f) {\n  if (f === 0) {\n    return {w: 0, t: 0};\n  }\n\n  while ((f % 10) === 0) {\n    f /= 10;\n    v--;\n  }\n\n  return {w: v, t: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marts\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"maj\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marts\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE 'den' d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH.mm.ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"dd/MM/y HH.mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"da\",\n  \"localeID\": \"da\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  var wt = getWT(vf.v, vf.f);  if (n == 1 || wt.t != 0 && (i == 0 || i == 1)) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dav-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Luma lwa K\",\n      \"luma lwa p\"\n    ],\n    \"DAY\": [\n      \"Ituku ja jumwa\",\n      \"Kuramuka jimweri\",\n      \"Kuramuka kawi\",\n      \"Kuramuka kadadu\",\n      \"Kuramuka kana\",\n      \"Kuramuka kasanu\",\n      \"Kifula nguwo\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristo\",\n      \"Baada ya Kristo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mori ghwa imbiri\",\n      \"Mori ghwa kawi\",\n      \"Mori ghwa kadadu\",\n      \"Mori ghwa kana\",\n      \"Mori ghwa kasanu\",\n      \"Mori ghwa karandadu\",\n      \"Mori ghwa mfungade\",\n      \"Mori ghwa wunyanya\",\n      \"Mori ghwa ikenda\",\n      \"Mori ghwa ikumi\",\n      \"Mori ghwa ikumi na imweri\",\n      \"Mori ghwa ikumi na iwi\"\n    ],\n    \"SHORTDAY\": [\n      \"Jum\",\n      \"Jim\",\n      \"Kaw\",\n      \"Kad\",\n      \"Kan\",\n      \"Kas\",\n      \"Ngu\"\n    ],\n    \"SHORTMONTH\": [\n      \"Imb\",\n      \"Kaw\",\n      \"Kad\",\n      \"Kan\",\n      \"Kas\",\n      \"Kar\",\n      \"Mfu\",\n      \"Wun\",\n      \"Ike\",\n      \"Iku\",\n      \"Imw\",\n      \"Iwi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mori ghwa imbiri\",\n      \"Mori ghwa kawi\",\n      \"Mori ghwa kadadu\",\n      \"Mori ghwa kana\",\n      \"Mori ghwa kasanu\",\n      \"Mori ghwa karandadu\",\n      \"Mori ghwa mfungade\",\n      \"Mori ghwa wunyanya\",\n      \"Mori ghwa ikenda\",\n      \"Mori ghwa ikumi\",\n      \"Mori ghwa ikumi na imweri\",\n      \"Mori ghwa ikumi na iwi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"dav-ke\",\n  \"localeID\": \"dav_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dav.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Luma lwa K\",\n      \"luma lwa p\"\n    ],\n    \"DAY\": [\n      \"Ituku ja jumwa\",\n      \"Kuramuka jimweri\",\n      \"Kuramuka kawi\",\n      \"Kuramuka kadadu\",\n      \"Kuramuka kana\",\n      \"Kuramuka kasanu\",\n      \"Kifula nguwo\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristo\",\n      \"Baada ya Kristo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mori ghwa imbiri\",\n      \"Mori ghwa kawi\",\n      \"Mori ghwa kadadu\",\n      \"Mori ghwa kana\",\n      \"Mori ghwa kasanu\",\n      \"Mori ghwa karandadu\",\n      \"Mori ghwa mfungade\",\n      \"Mori ghwa wunyanya\",\n      \"Mori ghwa ikenda\",\n      \"Mori ghwa ikumi\",\n      \"Mori ghwa ikumi na imweri\",\n      \"Mori ghwa ikumi na iwi\"\n    ],\n    \"SHORTDAY\": [\n      \"Jum\",\n      \"Jim\",\n      \"Kaw\",\n      \"Kad\",\n      \"Kan\",\n      \"Kas\",\n      \"Ngu\"\n    ],\n    \"SHORTMONTH\": [\n      \"Imb\",\n      \"Kaw\",\n      \"Kad\",\n      \"Kan\",\n      \"Kas\",\n      \"Kar\",\n      \"Mfu\",\n      \"Wun\",\n      \"Ike\",\n      \"Iku\",\n      \"Imw\",\n      \"Iwi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mori ghwa imbiri\",\n      \"Mori ghwa kawi\",\n      \"Mori ghwa kadadu\",\n      \"Mori ghwa kana\",\n      \"Mori ghwa kasanu\",\n      \"Mori ghwa karandadu\",\n      \"Mori ghwa mfungade\",\n      \"Mori ghwa wunyanya\",\n      \"Mori ghwa ikenda\",\n      \"Mori ghwa ikumi\",\n      \"Mori ghwa ikumi na imweri\",\n      \"Mori ghwa ikumi na iwi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"dav\",\n  \"localeID\": \"dav\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de-at.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"J\\u00e4nner\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"J\\u00e4n.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"J\\u00e4nner\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"de-at\",\n  \"localeID\": \"de_AT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de-be.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"de-be\",\n  \"localeID\": \"de_BE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"de-ch\",\n  \"localeID\": \"de_CH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de-de.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"de-de\",\n  \"localeID\": \"de_DE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de-it.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"J\\u00e4nner\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"J\\u00e4n.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"J\\u00e4nner\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"de-it\",\n  \"localeID\": \"de_IT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de-li.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"de-li\",\n  \"localeID\": \"de_LI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de-lu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"de-lu\",\n  \"localeID\": \"de_LU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_de.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"vorm.\",\n      \"nachm.\"\n    ],\n    \"DAY\": [\n      \"Sonntag\",\n      \"Montag\",\n      \"Dienstag\",\n      \"Mittwoch\",\n      \"Donnerstag\",\n      \"Freitag\",\n      \"Samstag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"So.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Mi.\",\n      \"Do.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4rz\",\n      \"Apr.\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"de\",\n  \"localeID\": \"de\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dje-ne.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Subbaahi\",\n      \"Zaarikay b\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atinni\",\n      \"Atalaata\",\n      \"Alarba\",\n      \"Alhamisi\",\n      \"Alzuma\",\n      \"Asibti\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa zamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alz\",\n      \"Asi\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dje-ne\",\n  \"localeID\": \"dje_NE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dje.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Subbaahi\",\n      \"Zaarikay b\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atinni\",\n      \"Atalaata\",\n      \"Alarba\",\n      \"Alhamisi\",\n      \"Alzuma\",\n      \"Asibti\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa zamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alz\",\n      \"Asi\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dje\",\n  \"localeID\": \"dje\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dsb-de.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dopo\\u0142dnja\",\n      \"w\\u00f3tpo\\u0142dnja\"\n    ],\n    \"DAY\": [\n      \"nje\\u017aela\",\n      \"p\\u00f3nje\\u017aele\",\n      \"wa\\u0142tora\",\n      \"srjoda\",\n      \"stw\\u00f3rtk\",\n      \"p\\u011btk\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"p\\u015bed Kristusowym naro\\u017aenim\",\n      \"p\\u00f3 Kristusowem naro\\u017aenju\"\n    ],\n    \"ERAS\": [\n      \"p\\u015b.Chr.n.\",\n      \"p\\u00f3 Chr.n.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januara\",\n      \"februara\",\n      \"m\\u011brca\",\n      \"apryla\",\n      \"maja\",\n      \"junija\",\n      \"julija\",\n      \"awgusta\",\n      \"septembra\",\n      \"oktobra\",\n      \"nowembra\",\n      \"decembra\"\n    ],\n    \"SHORTDAY\": [\n      \"nje\",\n      \"p\\u00f3n\",\n      \"wa\\u0142\",\n      \"srj\",\n      \"stw\",\n      \"p\\u011bt\",\n      \"sob\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"m\\u011br.\",\n      \"apr.\",\n      \"maj.\",\n      \"jun.\",\n      \"jul.\",\n      \"awg.\",\n      \"sep.\",\n      \"okt.\",\n      \"now.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"m\\u011brc\",\n      \"apryl\",\n      \"maj\",\n      \"junij\",\n      \"julij\",\n      \"awgust\",\n      \"september\",\n      \"oktober\",\n      \"nowember\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d.M.y H:mm:ss\",\n    \"mediumDate\": \"d.M.y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.M.yy H:mm\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dsb-de\",\n  \"localeID\": \"dsb_DE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dsb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dopo\\u0142dnja\",\n      \"w\\u00f3tpo\\u0142dnja\"\n    ],\n    \"DAY\": [\n      \"nje\\u017aela\",\n      \"p\\u00f3nje\\u017aele\",\n      \"wa\\u0142tora\",\n      \"srjoda\",\n      \"stw\\u00f3rtk\",\n      \"p\\u011btk\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"p\\u015bed Kristusowym naro\\u017aenim\",\n      \"p\\u00f3 Kristusowem naro\\u017aenju\"\n    ],\n    \"ERAS\": [\n      \"p\\u015b.Chr.n.\",\n      \"p\\u00f3 Chr.n.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januara\",\n      \"februara\",\n      \"m\\u011brca\",\n      \"apryla\",\n      \"maja\",\n      \"junija\",\n      \"julija\",\n      \"awgusta\",\n      \"septembra\",\n      \"oktobra\",\n      \"nowembra\",\n      \"decembra\"\n    ],\n    \"SHORTDAY\": [\n      \"nje\",\n      \"p\\u00f3n\",\n      \"wa\\u0142\",\n      \"srj\",\n      \"stw\",\n      \"p\\u011bt\",\n      \"sob\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"m\\u011br.\",\n      \"apr.\",\n      \"maj.\",\n      \"jun.\",\n      \"jul.\",\n      \"awg.\",\n      \"sep.\",\n      \"okt.\",\n      \"now.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"m\\u011brc\",\n      \"apryl\",\n      \"maj\",\n      \"junij\",\n      \"julij\",\n      \"awgust\",\n      \"september\",\n      \"oktober\",\n      \"nowember\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d.M.y H:mm:ss\",\n    \"mediumDate\": \"d.M.y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.M.yy H:mm\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dsb\",\n  \"localeID\": \"dsb\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dua-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"idi\\u0253a\",\n      \"eby\\u00e1mu\"\n    ],\n    \"DAY\": [\n      \"\\u00e9ti\",\n      \"m\\u0254\\u0301s\\u00fa\",\n      \"kwas\\u00fa\",\n      \"muk\\u0254\\u0301s\\u00fa\",\n      \"\\u014bgis\\u00fa\",\n      \"\\u0257\\u00f3n\\u025bs\\u00fa\",\n      \"esa\\u0253as\\u00fa\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0253oso \\u0253w\\u00e1 y\\u00e1\\u0253e l\\u00e1\",\n      \"mb\\u00fasa kw\\u00e9di a Y\\u00e9s\"\n    ],\n    \"ERAS\": [\n      \"\\u0253.Ys\",\n      \"mb.Ys\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"dim\\u0254\\u0301di\",\n      \"\\u014bg\\u0254nd\\u025b\",\n      \"s\\u0254\\u014b\\u025b\",\n      \"di\\u0253\\u00e1\\u0253\\u00e1\",\n      \"emiasele\",\n      \"es\\u0254p\\u025bs\\u0254p\\u025b\",\n      \"madi\\u0253\\u025b\\u0301d\\u00ed\\u0253\\u025b\\u0301\",\n      \"di\\u014bgindi\",\n      \"ny\\u025bt\\u025bki\",\n      \"may\\u00e9s\\u025b\\u0301\",\n      \"tin\\u00edn\\u00ed\",\n      \"el\\u00e1\\u014bg\\u025b\\u0301\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u00e9t\",\n      \"m\\u0254\\u0301s\",\n      \"kwa\",\n      \"muk\",\n      \"\\u014bgi\",\n      \"\\u0257\\u00f3n\",\n      \"esa\"\n    ],\n    \"SHORTMONTH\": [\n      \"di\",\n      \"\\u014bg\\u0254n\",\n      \"s\\u0254\\u014b\",\n      \"di\\u0253\",\n      \"emi\",\n      \"es\\u0254\",\n      \"mad\",\n      \"di\\u014b\",\n      \"ny\\u025bt\",\n      \"may\",\n      \"tin\",\n      \"el\\u00e1\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"dim\\u0254\\u0301di\",\n      \"\\u014bg\\u0254nd\\u025b\",\n      \"s\\u0254\\u014b\\u025b\",\n      \"di\\u0253\\u00e1\\u0253\\u00e1\",\n      \"emiasele\",\n      \"es\\u0254p\\u025bs\\u0254p\\u025b\",\n      \"madi\\u0253\\u025b\\u0301d\\u00ed\\u0253\\u025b\\u0301\",\n      \"di\\u014bgindi\",\n      \"ny\\u025bt\\u025bki\",\n      \"may\\u00e9s\\u025b\\u0301\",\n      \"tin\\u00edn\\u00ed\",\n      \"el\\u00e1\\u014bg\\u025b\\u0301\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dua-cm\",\n  \"localeID\": \"dua_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dua.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"idi\\u0253a\",\n      \"eby\\u00e1mu\"\n    ],\n    \"DAY\": [\n      \"\\u00e9ti\",\n      \"m\\u0254\\u0301s\\u00fa\",\n      \"kwas\\u00fa\",\n      \"muk\\u0254\\u0301s\\u00fa\",\n      \"\\u014bgis\\u00fa\",\n      \"\\u0257\\u00f3n\\u025bs\\u00fa\",\n      \"esa\\u0253as\\u00fa\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0253oso \\u0253w\\u00e1 y\\u00e1\\u0253e l\\u00e1\",\n      \"mb\\u00fasa kw\\u00e9di a Y\\u00e9s\"\n    ],\n    \"ERAS\": [\n      \"\\u0253.Ys\",\n      \"mb.Ys\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"dim\\u0254\\u0301di\",\n      \"\\u014bg\\u0254nd\\u025b\",\n      \"s\\u0254\\u014b\\u025b\",\n      \"di\\u0253\\u00e1\\u0253\\u00e1\",\n      \"emiasele\",\n      \"es\\u0254p\\u025bs\\u0254p\\u025b\",\n      \"madi\\u0253\\u025b\\u0301d\\u00ed\\u0253\\u025b\\u0301\",\n      \"di\\u014bgindi\",\n      \"ny\\u025bt\\u025bki\",\n      \"may\\u00e9s\\u025b\\u0301\",\n      \"tin\\u00edn\\u00ed\",\n      \"el\\u00e1\\u014bg\\u025b\\u0301\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u00e9t\",\n      \"m\\u0254\\u0301s\",\n      \"kwa\",\n      \"muk\",\n      \"\\u014bgi\",\n      \"\\u0257\\u00f3n\",\n      \"esa\"\n    ],\n    \"SHORTMONTH\": [\n      \"di\",\n      \"\\u014bg\\u0254n\",\n      \"s\\u0254\\u014b\",\n      \"di\\u0253\",\n      \"emi\",\n      \"es\\u0254\",\n      \"mad\",\n      \"di\\u014b\",\n      \"ny\\u025bt\",\n      \"may\",\n      \"tin\",\n      \"el\\u00e1\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"dim\\u0254\\u0301di\",\n      \"\\u014bg\\u0254nd\\u025b\",\n      \"s\\u0254\\u014b\\u025b\",\n      \"di\\u0253\\u00e1\\u0253\\u00e1\",\n      \"emiasele\",\n      \"es\\u0254p\\u025bs\\u0254p\\u025b\",\n      \"madi\\u0253\\u025b\\u0301d\\u00ed\\u0253\\u025b\\u0301\",\n      \"di\\u014bgindi\",\n      \"ny\\u025bt\\u025bki\",\n      \"may\\u00e9s\\u025b\\u0301\",\n      \"tin\\u00edn\\u00ed\",\n      \"el\\u00e1\\u014bg\\u025b\\u0301\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dua\",\n  \"localeID\": \"dua\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dyo-sn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Dimas\",\n      \"Tene\\u014b\",\n      \"Talata\",\n      \"Alarbay\",\n      \"Aramisay\",\n      \"Arjuma\",\n      \"Sibiti\"\n    ],\n    \"ERANAMES\": [\n      \"Ari\\u014buu Yeesu\",\n      \"Atoo\\u014be Yeesu\"\n    ],\n    \"ERAS\": [\n      \"ArY\",\n      \"AtY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Sanvie\",\n      \"F\\u00e9birie\",\n      \"Mars\",\n      \"Aburil\",\n      \"Mee\",\n      \"Sue\\u014b\",\n      \"S\\u00fauyee\",\n      \"Ut\",\n      \"Settembar\",\n      \"Oktobar\",\n      \"Novembar\",\n      \"Disambar\"\n    ],\n    \"SHORTDAY\": [\n      \"Dim\",\n      \"Ten\",\n      \"Tal\",\n      \"Ala\",\n      \"Ara\",\n      \"Arj\",\n      \"Sib\"\n    ],\n    \"SHORTMONTH\": [\n      \"Sa\",\n      \"Fe\",\n      \"Ma\",\n      \"Ab\",\n      \"Me\",\n      \"Su\",\n      \"S\\u00fa\",\n      \"Ut\",\n      \"Se\",\n      \"Ok\",\n      \"No\",\n      \"De\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Sanvie\",\n      \"F\\u00e9birie\",\n      \"Mars\",\n      \"Aburil\",\n      \"Mee\",\n      \"Sue\\u014b\",\n      \"S\\u00fauyee\",\n      \"Ut\",\n      \"Settembar\",\n      \"Oktobar\",\n      \"Novembar\",\n      \"Disambar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dyo-sn\",\n  \"localeID\": \"dyo_SN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dyo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Dimas\",\n      \"Tene\\u014b\",\n      \"Talata\",\n      \"Alarbay\",\n      \"Aramisay\",\n      \"Arjuma\",\n      \"Sibiti\"\n    ],\n    \"ERANAMES\": [\n      \"Ari\\u014buu Yeesu\",\n      \"Atoo\\u014be Yeesu\"\n    ],\n    \"ERAS\": [\n      \"ArY\",\n      \"AtY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Sanvie\",\n      \"F\\u00e9birie\",\n      \"Mars\",\n      \"Aburil\",\n      \"Mee\",\n      \"Sue\\u014b\",\n      \"S\\u00fauyee\",\n      \"Ut\",\n      \"Settembar\",\n      \"Oktobar\",\n      \"Novembar\",\n      \"Disambar\"\n    ],\n    \"SHORTDAY\": [\n      \"Dim\",\n      \"Ten\",\n      \"Tal\",\n      \"Ala\",\n      \"Ara\",\n      \"Arj\",\n      \"Sib\"\n    ],\n    \"SHORTMONTH\": [\n      \"Sa\",\n      \"Fe\",\n      \"Ma\",\n      \"Ab\",\n      \"Me\",\n      \"Su\",\n      \"S\\u00fa\",\n      \"Ut\",\n      \"Se\",\n      \"Ok\",\n      \"No\",\n      \"De\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Sanvie\",\n      \"F\\u00e9birie\",\n      \"Mars\",\n      \"Aburil\",\n      \"Mee\",\n      \"Sue\\u014b\",\n      \"S\\u00fauyee\",\n      \"Ut\",\n      \"Settembar\",\n      \"Oktobar\",\n      \"Novembar\",\n      \"Disambar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"dyo\",\n  \"localeID\": \"dyo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dz-bt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0f66\\u0f94\\u0f0b\\u0f46\\u0f0b\",\n      \"\\u0f55\\u0fb1\\u0f72\\u0f0b\\u0f46\\u0f0b\"\n    ],\n    \"DAY\": [\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f44\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\",\n      \"\\u0f58\\u0f72\\u0f62\\u0f0b\",\n      \"\\u0f63\\u0fb7\\u0f42\\u0f0b\",\n      \"\\u0f55\\u0f74\\u0f62\\u0f0b\",\n      \"\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\",\n      \"\\u0f49\\u0f72\\u0f0b\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0f21\",\n      \"\\u0f22\",\n      \"\\u0f23\",\n      \"\\u0f24\",\n      \"\\u0f25\",\n      \"\\u0f26\",\n      \"\\u0f27\",\n      \"\\u0f28\",\n      \"\\u0f29\",\n      \"\\u0f21\\u0f20\",\n      \"\\u0f21\\u0f21\",\n      \"12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f44\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, \\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by MMMM \\u0f5a\\u0f7a\\u0f66\\u0f0bdd\",\n    \"longDate\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by MMMM \\u0f5a\\u0f7a\\u0f66\\u0f0b dd\",\n    \"medium\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by \\u0f5f\\u0fb3\\u0f0bMMM \\u0f5a\\u0f7a\\u0f66\\u0f0bdd \\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0bh:mm:ss a\",\n    \"mediumDate\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by \\u0f5f\\u0fb3\\u0f0bMMM \\u0f5a\\u0f7a\\u0f66\\u0f0bdd\",\n    \"mediumTime\": \"\\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0bh:mm:ss a\",\n    \"short\": \"y-MM-dd \\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0b h \\u0f66\\u0f90\\u0f62\\u0f0b\\u0f58\\u0f0b mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"\\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0b h \\u0f66\\u0f90\\u0f62\\u0f0b\\u0f58\\u0f0b mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Nu.\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"dz-bt\",\n  \"localeID\": \"dz_BT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_dz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0f66\\u0f94\\u0f0b\\u0f46\\u0f0b\",\n      \"\\u0f55\\u0fb1\\u0f72\\u0f0b\\u0f46\\u0f0b\"\n    ],\n    \"DAY\": [\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f58\\u0f72\\u0f42\\u0f0b\\u0f51\\u0f58\\u0f62\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f63\\u0fb7\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f55\\u0f74\\u0f62\\u0f0b\\u0f56\\u0f74\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f54\\u0f0b\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f42\\u0f5f\\u0f60\\u0f0b\\u0f49\\u0f72\\u0f0b\\u0f58\\u0f0b\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f44\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0f5f\\u0fb3\\u0f0b\",\n      \"\\u0f58\\u0f72\\u0f62\\u0f0b\",\n      \"\\u0f63\\u0fb7\\u0f42\\u0f0b\",\n      \"\\u0f55\\u0f74\\u0f62\\u0f0b\",\n      \"\\u0f66\\u0f44\\u0f66\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0f7a\\u0f53\\u0f0b\",\n      \"\\u0f49\\u0f72\\u0f0b\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0f21\",\n      \"\\u0f22\",\n      \"\\u0f23\",\n      \"\\u0f24\",\n      \"\\u0f25\",\n      \"\\u0f26\",\n      \"\\u0f27\",\n      \"\\u0f28\",\n      \"\\u0f29\",\n      \"\\u0f21\\u0f20\",\n      \"\\u0f21\\u0f21\",\n      \"12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f44\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f42\\u0f66\\u0f74\\u0f58\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f5e\\u0f72\\u0f0b\\u0f54\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f63\\u0f94\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0fb2\\u0f74\\u0f42\\u0f0b\\u0f54\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f51\\u0f74\\u0f53\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f62\\u0f92\\u0fb1\\u0f51\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f51\\u0f42\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f45\\u0f72\\u0f42\\u0f0b\\u0f54\\u0f0b\",\n      \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f5f\\u0fb3\\u0f0b\\u0f56\\u0f45\\u0f74\\u0f0b\\u0f42\\u0f49\\u0f72\\u0f66\\u0f0b\\u0f54\\u0f0b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, \\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by MMMM \\u0f5a\\u0f7a\\u0f66\\u0f0bdd\",\n    \"longDate\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by MMMM \\u0f5a\\u0f7a\\u0f66\\u0f0b dd\",\n    \"medium\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by \\u0f5f\\u0fb3\\u0f0bMMM \\u0f5a\\u0f7a\\u0f66\\u0f0bdd \\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0bh:mm:ss a\",\n    \"mediumDate\": \"\\u0f66\\u0fa4\\u0fb1\\u0f72\\u0f0b\\u0f63\\u0f7c\\u0f0by \\u0f5f\\u0fb3\\u0f0bMMM \\u0f5a\\u0f7a\\u0f66\\u0f0bdd\",\n    \"mediumTime\": \"\\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0bh:mm:ss a\",\n    \"short\": \"y-MM-dd \\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0b h \\u0f66\\u0f90\\u0f62\\u0f0b\\u0f58\\u0f0b mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"\\u0f46\\u0f74\\u0f0b\\u0f5a\\u0f7c\\u0f51\\u0f0b h \\u0f66\\u0f90\\u0f62\\u0f0b\\u0f58\\u0f0b mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Nu.\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"dz\",\n  \"localeID\": \"dz\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ebu-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"KI\",\n      \"UT\"\n    ],\n    \"DAY\": [\n      \"Kiumia\",\n      \"Njumatatu\",\n      \"Njumaine\",\n      \"Njumatano\",\n      \"Aramithi\",\n      \"Njumaa\",\n      \"NJumamothii\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Kristo\",\n      \"Thutha wa Kristo\"\n    ],\n    \"ERAS\": [\n      \"MK\",\n      \"TK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mweri wa mbere\",\n      \"Mweri wa ka\\u0129ri\",\n      \"Mweri wa kathat\\u0169\",\n      \"Mweri wa kana\",\n      \"Mweri wa gatano\",\n      \"Mweri wa gatantat\\u0169\",\n      \"Mweri wa m\\u0169gwanja\",\n      \"Mweri wa kanana\",\n      \"Mweri wa kenda\",\n      \"Mweri wa ik\\u0169mi\",\n      \"Mweri wa ik\\u0169mi na \\u0169mwe\",\n      \"Mweri wa ik\\u0169mi na Ka\\u0129r\\u0129\"\n    ],\n    \"SHORTDAY\": [\n      \"Kma\",\n      \"Tat\",\n      \"Ine\",\n      \"Tan\",\n      \"Arm\",\n      \"Maa\",\n      \"NMM\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mbe\",\n      \"Kai\",\n      \"Kat\",\n      \"Kan\",\n      \"Gat\",\n      \"Gan\",\n      \"Mug\",\n      \"Knn\",\n      \"Ken\",\n      \"Iku\",\n      \"Imw\",\n      \"Igi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mweri wa mbere\",\n      \"Mweri wa ka\\u0129ri\",\n      \"Mweri wa kathat\\u0169\",\n      \"Mweri wa kana\",\n      \"Mweri wa gatano\",\n      \"Mweri wa gatantat\\u0169\",\n      \"Mweri wa m\\u0169gwanja\",\n      \"Mweri wa kanana\",\n      \"Mweri wa kenda\",\n      \"Mweri wa ik\\u0169mi\",\n      \"Mweri wa ik\\u0169mi na \\u0169mwe\",\n      \"Mweri wa ik\\u0169mi na Ka\\u0129r\\u0129\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ebu-ke\",\n  \"localeID\": \"ebu_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ebu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"KI\",\n      \"UT\"\n    ],\n    \"DAY\": [\n      \"Kiumia\",\n      \"Njumatatu\",\n      \"Njumaine\",\n      \"Njumatano\",\n      \"Aramithi\",\n      \"Njumaa\",\n      \"NJumamothii\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Kristo\",\n      \"Thutha wa Kristo\"\n    ],\n    \"ERAS\": [\n      \"MK\",\n      \"TK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mweri wa mbere\",\n      \"Mweri wa ka\\u0129ri\",\n      \"Mweri wa kathat\\u0169\",\n      \"Mweri wa kana\",\n      \"Mweri wa gatano\",\n      \"Mweri wa gatantat\\u0169\",\n      \"Mweri wa m\\u0169gwanja\",\n      \"Mweri wa kanana\",\n      \"Mweri wa kenda\",\n      \"Mweri wa ik\\u0169mi\",\n      \"Mweri wa ik\\u0169mi na \\u0169mwe\",\n      \"Mweri wa ik\\u0169mi na Ka\\u0129r\\u0129\"\n    ],\n    \"SHORTDAY\": [\n      \"Kma\",\n      \"Tat\",\n      \"Ine\",\n      \"Tan\",\n      \"Arm\",\n      \"Maa\",\n      \"NMM\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mbe\",\n      \"Kai\",\n      \"Kat\",\n      \"Kan\",\n      \"Gat\",\n      \"Gan\",\n      \"Mug\",\n      \"Knn\",\n      \"Ken\",\n      \"Iku\",\n      \"Imw\",\n      \"Igi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mweri wa mbere\",\n      \"Mweri wa ka\\u0129ri\",\n      \"Mweri wa kathat\\u0169\",\n      \"Mweri wa kana\",\n      \"Mweri wa gatano\",\n      \"Mweri wa gatantat\\u0169\",\n      \"Mweri wa m\\u0169gwanja\",\n      \"Mweri wa kanana\",\n      \"Mweri wa kenda\",\n      \"Mweri wa ik\\u0169mi\",\n      \"Mweri wa ik\\u0169mi na \\u0169mwe\",\n      \"Mweri wa ik\\u0169mi na Ka\\u0129r\\u0129\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ebu\",\n  \"localeID\": \"ebu\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ee-gh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u014bdi\",\n      \"\\u0263etr\\u0254\"\n    ],\n    \"DAY\": [\n      \"k\\u0254si\\u0256a\",\n      \"dzo\\u0256a\",\n      \"bla\\u0256a\",\n      \"ku\\u0256a\",\n      \"yawo\\u0256a\",\n      \"fi\\u0256a\",\n      \"memle\\u0256a\"\n    ],\n    \"ERANAMES\": [\n      \"Hafi Yesu Va Do \\u014bg\\u0254\",\n      \"Yesu \\u014a\\u0254li\"\n    ],\n    \"ERAS\": [\n      \"hY\",\n      \"Y\\u014b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"dzove\",\n      \"dzodze\",\n      \"tedoxe\",\n      \"af\\u0254f\\u0129e\",\n      \"dama\",\n      \"masa\",\n      \"siaml\\u0254m\",\n      \"deasiamime\",\n      \"any\\u0254ny\\u0254\",\n      \"kele\",\n      \"ade\\u025bmekp\\u0254xe\",\n      \"dzome\"\n    ],\n    \"SHORTDAY\": [\n      \"k\\u0254s\",\n      \"dzo\",\n      \"bla\",\n      \"ku\\u0256\",\n      \"yaw\",\n      \"fi\\u0256\",\n      \"mem\"\n    ],\n    \"SHORTMONTH\": [\n      \"dzv\",\n      \"dzd\",\n      \"ted\",\n      \"af\\u0254\",\n      \"dam\",\n      \"mas\",\n      \"sia\",\n      \"dea\",\n      \"any\",\n      \"kel\",\n      \"ade\",\n      \"dzm\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"dzove\",\n      \"dzodze\",\n      \"tedoxe\",\n      \"af\\u0254f\\u0129e\",\n      \"dama\",\n      \"masa\",\n      \"siaml\\u0254m\",\n      \"deasiamime\",\n      \"any\\u0254ny\\u0254\",\n      \"kele\",\n      \"ade\\u025bmekp\\u0254xe\",\n      \"dzome\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d 'lia' y\",\n    \"longDate\": \"MMMM d 'lia' y\",\n    \"medium\": \"MMM d 'lia', y a 'ga' h:mm:ss\",\n    \"mediumDate\": \"MMM d 'lia', y\",\n    \"mediumTime\": \"a 'ga' h:mm:ss\",\n    \"short\": \"M/d/yy a 'ga' h:mm\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"a 'ga' h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GHS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ee-gh\",\n  \"localeID\": \"ee_GH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ee-tg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u014bdi\",\n      \"\\u0263etr\\u0254\"\n    ],\n    \"DAY\": [\n      \"k\\u0254si\\u0256a\",\n      \"dzo\\u0256a\",\n      \"bla\\u0256a\",\n      \"ku\\u0256a\",\n      \"yawo\\u0256a\",\n      \"fi\\u0256a\",\n      \"memle\\u0256a\"\n    ],\n    \"ERANAMES\": [\n      \"Hafi Yesu Va Do \\u014bg\\u0254\",\n      \"Yesu \\u014a\\u0254li\"\n    ],\n    \"ERAS\": [\n      \"hY\",\n      \"Y\\u014b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"dzove\",\n      \"dzodze\",\n      \"tedoxe\",\n      \"af\\u0254f\\u0129e\",\n      \"dama\",\n      \"masa\",\n      \"siaml\\u0254m\",\n      \"deasiamime\",\n      \"any\\u0254ny\\u0254\",\n      \"kele\",\n      \"ade\\u025bmekp\\u0254xe\",\n      \"dzome\"\n    ],\n    \"SHORTDAY\": [\n      \"k\\u0254s\",\n      \"dzo\",\n      \"bla\",\n      \"ku\\u0256\",\n      \"yaw\",\n      \"fi\\u0256\",\n      \"mem\"\n    ],\n    \"SHORTMONTH\": [\n      \"dzv\",\n      \"dzd\",\n      \"ted\",\n      \"af\\u0254\",\n      \"dam\",\n      \"mas\",\n      \"sia\",\n      \"dea\",\n      \"any\",\n      \"kel\",\n      \"ade\",\n      \"dzm\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"dzove\",\n      \"dzodze\",\n      \"tedoxe\",\n      \"af\\u0254f\\u0129e\",\n      \"dama\",\n      \"masa\",\n      \"siaml\\u0254m\",\n      \"deasiamime\",\n      \"any\\u0254ny\\u0254\",\n      \"kele\",\n      \"ade\\u025bmekp\\u0254xe\",\n      \"dzome\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d 'lia' y\",\n    \"longDate\": \"MMMM d 'lia' y\",\n    \"medium\": \"MMM d 'lia', y HH:mm:ss\",\n    \"mediumDate\": \"MMM d 'lia', y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"M/d/yy HH:mm\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ee-tg\",\n  \"localeID\": \"ee_TG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ee.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u014bdi\",\n      \"\\u0263etr\\u0254\"\n    ],\n    \"DAY\": [\n      \"k\\u0254si\\u0256a\",\n      \"dzo\\u0256a\",\n      \"bla\\u0256a\",\n      \"ku\\u0256a\",\n      \"yawo\\u0256a\",\n      \"fi\\u0256a\",\n      \"memle\\u0256a\"\n    ],\n    \"ERANAMES\": [\n      \"Hafi Yesu Va Do \\u014bg\\u0254\",\n      \"Yesu \\u014a\\u0254li\"\n    ],\n    \"ERAS\": [\n      \"hY\",\n      \"Y\\u014b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"dzove\",\n      \"dzodze\",\n      \"tedoxe\",\n      \"af\\u0254f\\u0129e\",\n      \"dama\",\n      \"masa\",\n      \"siaml\\u0254m\",\n      \"deasiamime\",\n      \"any\\u0254ny\\u0254\",\n      \"kele\",\n      \"ade\\u025bmekp\\u0254xe\",\n      \"dzome\"\n    ],\n    \"SHORTDAY\": [\n      \"k\\u0254s\",\n      \"dzo\",\n      \"bla\",\n      \"ku\\u0256\",\n      \"yaw\",\n      \"fi\\u0256\",\n      \"mem\"\n    ],\n    \"SHORTMONTH\": [\n      \"dzv\",\n      \"dzd\",\n      \"ted\",\n      \"af\\u0254\",\n      \"dam\",\n      \"mas\",\n      \"sia\",\n      \"dea\",\n      \"any\",\n      \"kel\",\n      \"ade\",\n      \"dzm\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"dzove\",\n      \"dzodze\",\n      \"tedoxe\",\n      \"af\\u0254f\\u0129e\",\n      \"dama\",\n      \"masa\",\n      \"siaml\\u0254m\",\n      \"deasiamime\",\n      \"any\\u0254ny\\u0254\",\n      \"kele\",\n      \"ade\\u025bmekp\\u0254xe\",\n      \"dzome\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d 'lia' y\",\n    \"longDate\": \"MMMM d 'lia' y\",\n    \"medium\": \"MMM d 'lia', y a 'ga' h:mm:ss\",\n    \"mediumDate\": \"MMM d 'lia', y\",\n    \"mediumTime\": \"a 'ga' h:mm:ss\",\n    \"short\": \"M/d/yy a 'ga' h:mm\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"a 'ga' h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GHS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ee\",\n  \"localeID\": \"ee\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_el-cy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u03c0.\\u03bc.\",\n      \"\\u03bc.\\u03bc.\"\n    ],\n    \"DAY\": [\n      \"\\u039a\\u03c5\\u03c1\\u03b9\\u03b1\\u03ba\\u03ae\",\n      \"\\u0394\\u03b5\\u03c5\\u03c4\\u03ad\\u03c1\\u03b1\",\n      \"\\u03a4\\u03c1\\u03af\\u03c4\\u03b7\",\n      \"\\u03a4\\u03b5\\u03c4\\u03ac\\u03c1\\u03c4\\u03b7\",\n      \"\\u03a0\\u03ad\\u03bc\\u03c0\\u03c4\\u03b7\",\n      \"\\u03a0\\u03b1\\u03c1\\u03b1\\u03c3\\u03ba\\u03b5\\u03c5\\u03ae\",\n      \"\\u03a3\\u03ac\\u03b2\\u03b2\\u03b1\\u03c4\\u03bf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u03c0\\u03c1\\u03bf \\u03a7\\u03c1\\u03b9\\u03c3\\u03c4\\u03bf\\u03cd\",\n      \"\\u03bc\\u03b5\\u03c4\\u03ac \\u03a7\\u03c1\\u03b9\\u03c3\\u03c4\\u03cc\\u03bd\"\n    ],\n    \"ERAS\": [\n      \"\\u03c0.\\u03a7.\",\n      \"\\u03bc.\\u03a7.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0399\\u03b1\\u03bd\\u03bf\\u03c5\\u03b1\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u03a6\\u03b5\\u03b2\\u03c1\\u03bf\\u03c5\\u03b1\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039c\\u03b1\\u03c1\\u03c4\\u03af\\u03bf\\u03c5\",\n      \"\\u0391\\u03c0\\u03c1\\u03b9\\u03bb\\u03af\\u03bf\\u03c5\",\n      \"\\u039c\\u03b1\\u0390\\u03bf\\u03c5\",\n      \"\\u0399\\u03bf\\u03c5\\u03bd\\u03af\\u03bf\\u03c5\",\n      \"\\u0399\\u03bf\\u03c5\\u03bb\\u03af\\u03bf\\u03c5\",\n      \"\\u0391\\u03c5\\u03b3\\u03bf\\u03cd\\u03c3\\u03c4\\u03bf\\u03c5\",\n      \"\\u03a3\\u03b5\\u03c0\\u03c4\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039f\\u03ba\\u03c4\\u03c9\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039d\\u03bf\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u0394\\u03b5\\u03ba\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u039a\\u03c5\\u03c1\",\n      \"\\u0394\\u03b5\\u03c5\",\n      \"\\u03a4\\u03c1\\u03af\",\n      \"\\u03a4\\u03b5\\u03c4\",\n      \"\\u03a0\\u03ad\\u03bc\",\n      \"\\u03a0\\u03b1\\u03c1\",\n      \"\\u03a3\\u03ac\\u03b2\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0399\\u03b1\\u03bd\",\n      \"\\u03a6\\u03b5\\u03b2\",\n      \"\\u039c\\u03b1\\u03c1\",\n      \"\\u0391\\u03c0\\u03c1\",\n      \"\\u039c\\u03b1\\u0390\",\n      \"\\u0399\\u03bf\\u03c5\\u03bd\",\n      \"\\u0399\\u03bf\\u03c5\\u03bb\",\n      \"\\u0391\\u03c5\\u03b3\",\n      \"\\u03a3\\u03b5\\u03c0\",\n      \"\\u039f\\u03ba\\u03c4\",\n      \"\\u039d\\u03bf\\u03b5\",\n      \"\\u0394\\u03b5\\u03ba\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0399\\u03b1\\u03bd\\u03bf\\u03c5\\u03ac\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u03a6\\u03b5\\u03b2\\u03c1\\u03bf\\u03c5\\u03ac\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039c\\u03ac\\u03c1\\u03c4\\u03b9\\u03bf\\u03c2\",\n      \"\\u0391\\u03c0\\u03c1\\u03af\\u03bb\\u03b9\\u03bf\\u03c2\",\n      \"\\u039c\\u03ac\\u03b9\\u03bf\\u03c2\",\n      \"\\u0399\\u03bf\\u03cd\\u03bd\\u03b9\\u03bf\\u03c2\",\n      \"\\u0399\\u03bf\\u03cd\\u03bb\\u03b9\\u03bf\\u03c2\",\n      \"\\u0391\\u03cd\\u03b3\\u03bf\\u03c5\\u03c3\\u03c4\\u03bf\\u03c2\",\n      \"\\u03a3\\u03b5\\u03c0\\u03c4\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039f\\u03ba\\u03c4\\u03ce\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039d\\u03bf\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u0394\\u03b5\\u03ba\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"el-cy\",\n  \"localeID\": \"el_CY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_el-gr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u03c0.\\u03bc.\",\n      \"\\u03bc.\\u03bc.\"\n    ],\n    \"DAY\": [\n      \"\\u039a\\u03c5\\u03c1\\u03b9\\u03b1\\u03ba\\u03ae\",\n      \"\\u0394\\u03b5\\u03c5\\u03c4\\u03ad\\u03c1\\u03b1\",\n      \"\\u03a4\\u03c1\\u03af\\u03c4\\u03b7\",\n      \"\\u03a4\\u03b5\\u03c4\\u03ac\\u03c1\\u03c4\\u03b7\",\n      \"\\u03a0\\u03ad\\u03bc\\u03c0\\u03c4\\u03b7\",\n      \"\\u03a0\\u03b1\\u03c1\\u03b1\\u03c3\\u03ba\\u03b5\\u03c5\\u03ae\",\n      \"\\u03a3\\u03ac\\u03b2\\u03b2\\u03b1\\u03c4\\u03bf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u03c0\\u03c1\\u03bf \\u03a7\\u03c1\\u03b9\\u03c3\\u03c4\\u03bf\\u03cd\",\n      \"\\u03bc\\u03b5\\u03c4\\u03ac \\u03a7\\u03c1\\u03b9\\u03c3\\u03c4\\u03cc\\u03bd\"\n    ],\n    \"ERAS\": [\n      \"\\u03c0.\\u03a7.\",\n      \"\\u03bc.\\u03a7.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0399\\u03b1\\u03bd\\u03bf\\u03c5\\u03b1\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u03a6\\u03b5\\u03b2\\u03c1\\u03bf\\u03c5\\u03b1\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039c\\u03b1\\u03c1\\u03c4\\u03af\\u03bf\\u03c5\",\n      \"\\u0391\\u03c0\\u03c1\\u03b9\\u03bb\\u03af\\u03bf\\u03c5\",\n      \"\\u039c\\u03b1\\u0390\\u03bf\\u03c5\",\n      \"\\u0399\\u03bf\\u03c5\\u03bd\\u03af\\u03bf\\u03c5\",\n      \"\\u0399\\u03bf\\u03c5\\u03bb\\u03af\\u03bf\\u03c5\",\n      \"\\u0391\\u03c5\\u03b3\\u03bf\\u03cd\\u03c3\\u03c4\\u03bf\\u03c5\",\n      \"\\u03a3\\u03b5\\u03c0\\u03c4\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039f\\u03ba\\u03c4\\u03c9\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039d\\u03bf\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u0394\\u03b5\\u03ba\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u039a\\u03c5\\u03c1\",\n      \"\\u0394\\u03b5\\u03c5\",\n      \"\\u03a4\\u03c1\\u03af\",\n      \"\\u03a4\\u03b5\\u03c4\",\n      \"\\u03a0\\u03ad\\u03bc\",\n      \"\\u03a0\\u03b1\\u03c1\",\n      \"\\u03a3\\u03ac\\u03b2\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0399\\u03b1\\u03bd\",\n      \"\\u03a6\\u03b5\\u03b2\",\n      \"\\u039c\\u03b1\\u03c1\",\n      \"\\u0391\\u03c0\\u03c1\",\n      \"\\u039c\\u03b1\\u0390\",\n      \"\\u0399\\u03bf\\u03c5\\u03bd\",\n      \"\\u0399\\u03bf\\u03c5\\u03bb\",\n      \"\\u0391\\u03c5\\u03b3\",\n      \"\\u03a3\\u03b5\\u03c0\",\n      \"\\u039f\\u03ba\\u03c4\",\n      \"\\u039d\\u03bf\\u03b5\",\n      \"\\u0394\\u03b5\\u03ba\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0399\\u03b1\\u03bd\\u03bf\\u03c5\\u03ac\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u03a6\\u03b5\\u03b2\\u03c1\\u03bf\\u03c5\\u03ac\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039c\\u03ac\\u03c1\\u03c4\\u03b9\\u03bf\\u03c2\",\n      \"\\u0391\\u03c0\\u03c1\\u03af\\u03bb\\u03b9\\u03bf\\u03c2\",\n      \"\\u039c\\u03ac\\u03b9\\u03bf\\u03c2\",\n      \"\\u0399\\u03bf\\u03cd\\u03bd\\u03b9\\u03bf\\u03c2\",\n      \"\\u0399\\u03bf\\u03cd\\u03bb\\u03b9\\u03bf\\u03c2\",\n      \"\\u0391\\u03cd\\u03b3\\u03bf\\u03c5\\u03c3\\u03c4\\u03bf\\u03c2\",\n      \"\\u03a3\\u03b5\\u03c0\\u03c4\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039f\\u03ba\\u03c4\\u03ce\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039d\\u03bf\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u0394\\u03b5\\u03ba\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"el-gr\",\n  \"localeID\": \"el_GR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_el.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u03c0.\\u03bc.\",\n      \"\\u03bc.\\u03bc.\"\n    ],\n    \"DAY\": [\n      \"\\u039a\\u03c5\\u03c1\\u03b9\\u03b1\\u03ba\\u03ae\",\n      \"\\u0394\\u03b5\\u03c5\\u03c4\\u03ad\\u03c1\\u03b1\",\n      \"\\u03a4\\u03c1\\u03af\\u03c4\\u03b7\",\n      \"\\u03a4\\u03b5\\u03c4\\u03ac\\u03c1\\u03c4\\u03b7\",\n      \"\\u03a0\\u03ad\\u03bc\\u03c0\\u03c4\\u03b7\",\n      \"\\u03a0\\u03b1\\u03c1\\u03b1\\u03c3\\u03ba\\u03b5\\u03c5\\u03ae\",\n      \"\\u03a3\\u03ac\\u03b2\\u03b2\\u03b1\\u03c4\\u03bf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u03c0\\u03c1\\u03bf \\u03a7\\u03c1\\u03b9\\u03c3\\u03c4\\u03bf\\u03cd\",\n      \"\\u03bc\\u03b5\\u03c4\\u03ac \\u03a7\\u03c1\\u03b9\\u03c3\\u03c4\\u03cc\\u03bd\"\n    ],\n    \"ERAS\": [\n      \"\\u03c0.\\u03a7.\",\n      \"\\u03bc.\\u03a7.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0399\\u03b1\\u03bd\\u03bf\\u03c5\\u03b1\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u03a6\\u03b5\\u03b2\\u03c1\\u03bf\\u03c5\\u03b1\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039c\\u03b1\\u03c1\\u03c4\\u03af\\u03bf\\u03c5\",\n      \"\\u0391\\u03c0\\u03c1\\u03b9\\u03bb\\u03af\\u03bf\\u03c5\",\n      \"\\u039c\\u03b1\\u0390\\u03bf\\u03c5\",\n      \"\\u0399\\u03bf\\u03c5\\u03bd\\u03af\\u03bf\\u03c5\",\n      \"\\u0399\\u03bf\\u03c5\\u03bb\\u03af\\u03bf\\u03c5\",\n      \"\\u0391\\u03c5\\u03b3\\u03bf\\u03cd\\u03c3\\u03c4\\u03bf\\u03c5\",\n      \"\\u03a3\\u03b5\\u03c0\\u03c4\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039f\\u03ba\\u03c4\\u03c9\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u039d\\u03bf\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\",\n      \"\\u0394\\u03b5\\u03ba\\u03b5\\u03bc\\u03b2\\u03c1\\u03af\\u03bf\\u03c5\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u039a\\u03c5\\u03c1\",\n      \"\\u0394\\u03b5\\u03c5\",\n      \"\\u03a4\\u03c1\\u03af\",\n      \"\\u03a4\\u03b5\\u03c4\",\n      \"\\u03a0\\u03ad\\u03bc\",\n      \"\\u03a0\\u03b1\\u03c1\",\n      \"\\u03a3\\u03ac\\u03b2\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0399\\u03b1\\u03bd\",\n      \"\\u03a6\\u03b5\\u03b2\",\n      \"\\u039c\\u03b1\\u03c1\",\n      \"\\u0391\\u03c0\\u03c1\",\n      \"\\u039c\\u03b1\\u0390\",\n      \"\\u0399\\u03bf\\u03c5\\u03bd\",\n      \"\\u0399\\u03bf\\u03c5\\u03bb\",\n      \"\\u0391\\u03c5\\u03b3\",\n      \"\\u03a3\\u03b5\\u03c0\",\n      \"\\u039f\\u03ba\\u03c4\",\n      \"\\u039d\\u03bf\\u03b5\",\n      \"\\u0394\\u03b5\\u03ba\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0399\\u03b1\\u03bd\\u03bf\\u03c5\\u03ac\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u03a6\\u03b5\\u03b2\\u03c1\\u03bf\\u03c5\\u03ac\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039c\\u03ac\\u03c1\\u03c4\\u03b9\\u03bf\\u03c2\",\n      \"\\u0391\\u03c0\\u03c1\\u03af\\u03bb\\u03b9\\u03bf\\u03c2\",\n      \"\\u039c\\u03ac\\u03b9\\u03bf\\u03c2\",\n      \"\\u0399\\u03bf\\u03cd\\u03bd\\u03b9\\u03bf\\u03c2\",\n      \"\\u0399\\u03bf\\u03cd\\u03bb\\u03b9\\u03bf\\u03c2\",\n      \"\\u0391\\u03cd\\u03b3\\u03bf\\u03c5\\u03c3\\u03c4\\u03bf\\u03c2\",\n      \"\\u03a3\\u03b5\\u03c0\\u03c4\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039f\\u03ba\\u03c4\\u03ce\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u039d\\u03bf\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\",\n      \"\\u0394\\u03b5\\u03ba\\u03ad\\u03bc\\u03b2\\u03c1\\u03b9\\u03bf\\u03c2\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"el\",\n  \"localeID\": \"el\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-001.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-001\",\n  \"localeID\": \"en_001\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-150.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"en-150\",\n  \"localeID\": \"en_150\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ag.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ag\",\n  \"localeID\": \"en_AG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ai.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ai\",\n  \"localeID\": \"en_AI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-as.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-as\",\n  \"localeID\": \"en_AS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-at.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-at\",\n  \"localeID\": \"en_AT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-au.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun.\",\n      \"Mon.\",\n      \"Tue.\",\n      \"Wed.\",\n      \"Thu.\",\n      \"Fri.\",\n      \"Sat.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"Mar.\",\n      \"Apr.\",\n      \"May\",\n      \"Jun.\",\n      \"Jul.\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Oct.\",\n      \"Nov.\",\n      \"Dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-au\",\n  \"localeID\": \"en_AU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-bb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-bb\",\n  \"localeID\": \"en_BB\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-be.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"en-be\",\n  \"localeID\": \"en_BE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-bi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FBu\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-bi\",\n  \"localeID\": \"en_BI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-bm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-bm\",\n  \"localeID\": \"en_BM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-bs.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-bs\",\n  \"localeID\": \"en_BS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-bw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"P\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-bw\",\n  \"localeID\": \"en_BW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-bz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y HH:mm:ss\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-bz\",\n  \"localeID\": \"en_BZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ca.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ca\",\n  \"localeID\": \"en_CA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-cc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-cc\",\n  \"localeID\": \"en_CC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ch\",\n  \"localeID\": \"en_CH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ck.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ck\",\n  \"localeID\": \"en_CK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-cm\",\n  \"localeID\": \"en_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-cx.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-cx\",\n  \"localeID\": \"en_CX\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-cy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-cy\",\n  \"localeID\": \"en_CY\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-de.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-de\",\n  \"localeID\": \"en_DE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-dg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-dg\",\n  \"localeID\": \"en_DG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-dk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH.mm.ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"dd/MM/y HH.mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"en-dk\",\n  \"localeID\": \"en_DK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-dm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-dm\",\n  \"localeID\": \"en_DM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-er.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Nfk\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-er\",\n  \"localeID\": \"en_ER\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-fi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y H.mm.ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H.mm.ss\",\n    \"short\": \"dd/MM/y H.mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"H.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-fi\",\n  \"localeID\": \"en_FI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-fj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-fj\",\n  \"localeID\": \"en_FJ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-fk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-fk\",\n  \"localeID\": \"en_FK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-fm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-fm\",\n  \"localeID\": \"en_FM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gb\",\n  \"localeID\": \"en_GB\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gd\",\n  \"localeID\": \"en_GD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gg\",\n  \"localeID\": \"en_GG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GHS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gh\",\n  \"localeID\": \"en_GH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gi\",\n  \"localeID\": \"en_GI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GMD\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gm\",\n  \"localeID\": \"en_GM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gu\",\n  \"localeID\": \"en_GU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-gy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-gy\",\n  \"localeID\": \"en_GY\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-hk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/y h:mm a\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-hk\",\n  \"localeID\": \"en_HK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ie.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ie\",\n  \"localeID\": \"en_IE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-il.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd/MM/y H:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20aa\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-il\",\n  \"localeID\": \"en_IL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-im.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-im\",\n  \"localeID\": \"en_IM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-in\",\n  \"localeID\": \"en_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-io.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-io\",\n  \"localeID\": \"en_IO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-iso.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y MMMM dd\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yyyy-MM-dd HH:mm\",\n    \"shortDate\": \"yyyy-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-iso\",\n  \"localeID\": \"en_ISO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-je.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-je\",\n  \"localeID\": \"en_JE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-jm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-jm\",\n  \"localeID\": \"en_JM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ke\",\n  \"localeID\": \"en_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ki.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ki\",\n  \"localeID\": \"en_KI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-kn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-kn\",\n  \"localeID\": \"en_KN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ky.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ky\",\n  \"localeID\": \"en_KY\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-lc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-lc\",\n  \"localeID\": \"en_LC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-lr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-lr\",\n  \"localeID\": \"en_LR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ls.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ls\",\n  \"localeID\": \"en_LS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-mg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ar\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-mg\",\n  \"localeID\": \"en_MG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-mh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-mh\",\n  \"localeID\": \"en_MH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-mo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MOP\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-mo\",\n  \"localeID\": \"en_MO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-mp.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-mp\",\n  \"localeID\": \"en_MP\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ms.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ms\",\n  \"localeID\": \"en_MS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-mt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-mt\",\n  \"localeID\": \"en_MT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-mu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MURs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-mu\",\n  \"localeID\": \"en_MU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-mw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MWK\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-mw\",\n  \"localeID\": \"en_MW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-my.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RM\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-my\",\n  \"localeID\": \"en_MY\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-na.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-na\",\n  \"localeID\": \"en_NA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-nf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-nf\",\n  \"localeID\": \"en_NF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ng.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a6\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ng\",\n  \"localeID\": \"en_NG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-nl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-nl\",\n  \"localeID\": \"en_NL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-nr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-nr\",\n  \"localeID\": \"en_NR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-nu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-nu\",\n  \"localeID\": \"en_NU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-nz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d/MM/y h:mm:ss a\",\n    \"mediumDate\": \"d/MM/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/yy h:mm a\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-nz\",\n  \"localeID\": \"en_NZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-pg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"PGK\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-pg\",\n  \"localeID\": \"en_PG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ph.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b1\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ph\",\n  \"localeID\": \"en_PH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-pk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-pk\",\n  \"localeID\": \"en_PK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-pn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-pn\",\n  \"localeID\": \"en_PN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-pr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-pr\",\n  \"localeID\": \"en_PR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-pw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-pw\",\n  \"localeID\": \"en_PW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-rw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-rw\",\n  \"localeID\": \"en_RW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sb\",\n  \"localeID\": \"en_SB\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SCR\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sc\",\n  \"localeID\": \"en_SC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SDG\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sd\",\n  \"localeID\": \"en_SD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-se.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"en-se\",\n  \"localeID\": \"en_SE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sg\",\n  \"localeID\": \"en_SG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sh\",\n  \"localeID\": \"en_SH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-si.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-si\",\n  \"localeID\": \"en_SI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SLL\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sl\",\n  \"localeID\": \"en_SL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ss.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ss\",\n  \"localeID\": \"en_SS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sx.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"NAf.\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sx\",\n  \"localeID\": \"en_SX\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-sz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SZL\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-sz\",\n  \"localeID\": \"en_SZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-tc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-tc\",\n  \"localeID\": \"en_TC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-tk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-tk\",\n  \"localeID\": \"en_TK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-to.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"T$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-to\",\n  \"localeID\": \"en_TO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-tt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-tt\",\n  \"localeID\": \"en_TT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-tv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-tv\",\n  \"localeID\": \"en_TV\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-tz\",\n  \"localeID\": \"en_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ug\",\n  \"localeID\": \"en_UG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-um.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-um\",\n  \"localeID\": \"en_UM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-us-posix.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 0,\n        \"lgSize\": 0,\n        \"maxFrac\": 6,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 0,\n        \"lgSize\": 0,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-us-posix\",\n  \"localeID\": \"en_US_POSIX\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-us.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-us\",\n  \"localeID\": \"en_US\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-vc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-vc\",\n  \"localeID\": \"en_VC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-vg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-vg\",\n  \"localeID\": \"en_VG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-vi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-vi\",\n  \"localeID\": \"en_VI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-vu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"VUV\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-vu\",\n  \"localeID\": \"en_VU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-ws.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"WST\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-ws\",\n  \"localeID\": \"en_WS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-xa.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"[\\u00c5\\u1e40 one]\",\n      \"[\\u00de\\u1e40 one]\"\n    ],\n    \"DAY\": [\n      \"[\\u0160\\u00fb\\u00f1\\u00f0\\u00e5\\u00fd one]\",\n      \"[\\u1e40\\u00f6\\u00f1\\u00f0\\u00e5\\u00fd one]\",\n      \"[\\u0162\\u00fb\\u00e9\\u0161\\u00f0\\u00e5\\u00fd one]\",\n      \"[\\u0174\\u00e9\\u00f0\\u00f1\\u00e9\\u0161\\u00f0\\u00e5\\u00fd one two]\",\n      \"[\\u0162\\u0125\\u00fb\\u0155\\u0161\\u00f0\\u00e5\\u00fd one]\",\n      \"[\\u0191\\u0155\\u00ee\\u00f0\\u00e5\\u00fd one]\",\n      \"[\\u0160\\u00e5\\u0163\\u00fb\\u0155\\u00f0\\u00e5\\u00fd one]\"\n    ],\n    \"ERANAMES\": [\n      \"[\\u0181\\u00e9\\u0192\\u00f6\\u0155\\u00e9\\u2003\\u00c7\\u0125\\u0155\\u00ee\\u0161\\u0163 one two]\",\n      \"[\\u00c5\\u00f1\\u00f1\\u00f6\\u2003\\u00d0\\u00f6\\u0271\\u00ee\\u00f1\\u00ee one two]\"\n    ],\n    \"ERAS\": [\n      \"[\\u0181\\u00c7 one]\",\n      \"[\\u00c5\\u00d0 one]\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"[\\u0134\\u00e5\\u00f1\\u00fb\\u00e5\\u0155\\u00fd one]\",\n      \"[\\u0191\\u00e9\\u0180\\u0155\\u00fb\\u00e5\\u0155\\u00fd one]\",\n      \"[\\u1e40\\u00e5\\u0155\\u00e7\\u0125 one]\",\n      \"[\\u00c5\\u00fe\\u0155\\u00ee\\u013c one]\",\n      \"[\\u1e40\\u00e5\\u00fd one]\",\n      \"[\\u0134\\u00fb\\u00f1\\u00e9 one]\",\n      \"[\\u0134\\u00fb\\u013c\\u00fd one]\",\n      \"[\\u00c5\\u00fb\\u011d\\u00fb\\u0161\\u0163 one]\",\n      \"[\\u0160\\u00e9\\u00fe\\u0163\\u00e9\\u0271\\u0180\\u00e9\\u0155 one two]\",\n      \"[\\u00d6\\u00e7\\u0163\\u00f6\\u0180\\u00e9\\u0155 one]\",\n      \"[\\u00d1\\u00f6\\u1e7d\\u00e9\\u0271\\u0180\\u00e9\\u0155 one]\",\n      \"[\\u00d0\\u00e9\\u00e7\\u00e9\\u0271\\u0180\\u00e9\\u0155 one]\"\n    ],\n    \"SHORTDAY\": [\n      \"[\\u0160\\u00fb\\u00f1 one]\",\n      \"[\\u1e40\\u00f6\\u00f1 one]\",\n      \"[\\u0162\\u00fb\\u00e9 one]\",\n      \"[\\u0174\\u00e9\\u00f0 one]\",\n      \"[\\u0162\\u0125\\u00fb one]\",\n      \"[\\u0191\\u0155\\u00ee one]\",\n      \"[\\u0160\\u00e5\\u0163 one]\"\n    ],\n    \"SHORTMONTH\": [\n      \"[\\u0134\\u00e5\\u00f1 one]\",\n      \"[\\u0191\\u00e9\\u0180 one]\",\n      \"[\\u1e40\\u00e5\\u0155 one]\",\n      \"[\\u00c5\\u00fe\\u0155 one]\",\n      \"[\\u1e40\\u00e5\\u00fd one]\",\n      \"[\\u0134\\u00fb\\u00f1 one]\",\n      \"[\\u0134\\u00fb\\u013c one]\",\n      \"[\\u00c5\\u00fb\\u011d one]\",\n      \"[\\u0160\\u00e9\\u00fe one]\",\n      \"[\\u00d6\\u00e7\\u0163 one]\",\n      \"[\\u00d1\\u00f6\\u1e7d one]\",\n      \"[\\u00d0\\u00e9\\u00e7 one]\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"[\\u0134\\u00e5\\u00f1\\u00fb\\u00e5\\u0155\\u00fd one]\",\n      \"[\\u0191\\u00e9\\u0180\\u0155\\u00fb\\u00e5\\u0155\\u00fd one]\",\n      \"[\\u1e40\\u00e5\\u0155\\u00e7\\u0125 one]\",\n      \"[\\u00c5\\u00fe\\u0155\\u00ee\\u013c one]\",\n      \"[\\u1e40\\u00e5\\u00fd one]\",\n      \"[\\u0134\\u00fb\\u00f1\\u00e9 one]\",\n      \"[\\u0134\\u00fb\\u013c\\u00fd one]\",\n      \"[\\u00c5\\u00fb\\u011d\\u00fb\\u0161\\u0163 one]\",\n      \"[\\u0160\\u00e9\\u00fe\\u0163\\u00e9\\u0271\\u0180\\u00e9\\u0155 one two]\",\n      \"[\\u00d6\\u00e7\\u0163\\u00f6\\u0180\\u00e9\\u0155 one]\",\n      \"[\\u00d1\\u00f6\\u1e7d\\u00e9\\u0271\\u0180\\u00e9\\u0155 one]\",\n      \"[\\u00d0\\u00e9\\u00e7\\u00e9\\u0271\\u0180\\u00e9\\u0155 one]\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"[EEEE, MMMM d, y]\",\n    \"longDate\": \"[MMMM d, y]\",\n    \"medium\": \"[MMM d, y] [h:mm:ss a]\",\n    \"mediumDate\": \"[MMM d, y]\",\n    \"mediumTime\": \"[h:mm:ss a]\",\n    \"short\": \"[M/d/yy] [h:mm a]\",\n    \"shortDate\": \"[M/d/yy]\",\n    \"shortTime\": \"[h:mm a]\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-xa\",\n  \"localeID\": \"en_XA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-za.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y/MM/dd HH:mm\",\n    \"shortDate\": \"y/MM/dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-za\",\n  \"localeID\": \"en_ZA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-zm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"ZMW\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-zm\",\n  \"localeID\": \"en_ZM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en-zw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd MMM,y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM,y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-zw\",\n  \"localeID\": \"en_ZW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_en.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en\",\n  \"localeID\": \"en\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_eo-001.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"atm\",\n      \"ptm\"\n    ],\n    \"DAY\": [\n      \"diman\\u0109o\",\n      \"lundo\",\n      \"mardo\",\n      \"merkredo\",\n      \"\\u0135a\\u016ddo\",\n      \"vendredo\",\n      \"sabato\"\n    ],\n    \"ERANAMES\": [\n      \"aK\",\n      \"pK\"\n    ],\n    \"ERAS\": [\n      \"aK\",\n      \"pK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januaro\",\n      \"februaro\",\n      \"marto\",\n      \"aprilo\",\n      \"majo\",\n      \"junio\",\n      \"julio\",\n      \"a\\u016dgusto\",\n      \"septembro\",\n      \"oktobro\",\n      \"novembro\",\n      \"decembro\"\n    ],\n    \"SHORTDAY\": [\n      \"di\",\n      \"lu\",\n      \"ma\",\n      \"me\",\n      \"\\u0135a\",\n      \"ve\",\n      \"sa\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"a\\u016dg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januaro\",\n      \"februaro\",\n      \"marto\",\n      \"aprilo\",\n      \"majo\",\n      \"junio\",\n      \"julio\",\n      \"a\\u016dgusto\",\n      \"septembro\",\n      \"oktobro\",\n      \"novembro\",\n      \"decembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d-'a' 'de' MMMM y\",\n    \"longDate\": \"y-MMMM-dd\",\n    \"medium\": \"y-MMM-dd HH:mm:ss\",\n    \"mediumDate\": \"y-MMM-dd\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yy-MM-dd HH:mm\",\n    \"shortDate\": \"yy-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"eo-001\",\n  \"localeID\": \"eo_001\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_eo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"atm\",\n      \"ptm\"\n    ],\n    \"DAY\": [\n      \"diman\\u0109o\",\n      \"lundo\",\n      \"mardo\",\n      \"merkredo\",\n      \"\\u0135a\\u016ddo\",\n      \"vendredo\",\n      \"sabato\"\n    ],\n    \"ERANAMES\": [\n      \"aK\",\n      \"pK\"\n    ],\n    \"ERAS\": [\n      \"aK\",\n      \"pK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januaro\",\n      \"februaro\",\n      \"marto\",\n      \"aprilo\",\n      \"majo\",\n      \"junio\",\n      \"julio\",\n      \"a\\u016dgusto\",\n      \"septembro\",\n      \"oktobro\",\n      \"novembro\",\n      \"decembro\"\n    ],\n    \"SHORTDAY\": [\n      \"di\",\n      \"lu\",\n      \"ma\",\n      \"me\",\n      \"\\u0135a\",\n      \"ve\",\n      \"sa\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"a\\u016dg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januaro\",\n      \"februaro\",\n      \"marto\",\n      \"aprilo\",\n      \"majo\",\n      \"junio\",\n      \"julio\",\n      \"a\\u016dgusto\",\n      \"septembro\",\n      \"oktobro\",\n      \"novembro\",\n      \"decembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d-'a' 'de' MMMM y\",\n    \"longDate\": \"y-MMMM-dd\",\n    \"medium\": \"y-MMM-dd HH:mm:ss\",\n    \"mediumDate\": \"y-MMM-dd\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yy-MM-dd HH:mm\",\n    \"shortDate\": \"yy-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"eo\",\n  \"localeID\": \"eo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-419.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-419\",\n  \"localeID\": \"es_419\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-ar.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-ar\",\n  \"localeID\": \"es_AR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-bo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM 'de' y HH:mm:ss\",\n    \"mediumDate\": \"d MMM 'de' y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Bs\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-bo\",\n  \"localeID\": \"es_BO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-br.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-br\",\n  \"localeID\": \"es_BR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-bz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-bz\",\n  \"localeID\": \"es_BZ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-cl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd-MM-y HH:mm:ss\",\n    \"mediumDate\": \"dd-MM-y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-cl\",\n  \"localeID\": \"es_CL\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-co.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d/MM/y h:mm:ss a\",\n    \"mediumDate\": \"d/MM/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/yy h:mm a\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-co\",\n  \"localeID\": \"es_CO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-cr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a1\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-cr\",\n  \"localeID\": \"es_CR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-cu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-cu\",\n  \"localeID\": \"es_CU\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-do.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RD$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-do\",\n  \"localeID\": \"es_DO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-ea.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"es-ea\",\n  \"localeID\": \"es_EA\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-ec.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-ec\",\n  \"localeID\": \"es_EC\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-es.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"es-es\",\n  \"localeID\": \"es_ES\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-gq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-gq\",\n  \"localeID\": \"es_GQ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-gt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d/MM/y HH:mm:ss\",\n    \"mediumDate\": \"d/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/MM/yy HH:mm\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Q\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-gt\",\n  \"localeID\": \"es_GT\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-hn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE dd 'de' MMMM 'de' y\",\n    \"longDate\": \"dd 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"L\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-hn\",\n  \"localeID\": \"es_HN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-ic.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"es-ic\",\n  \"localeID\": \"es_IC\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-mx.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene\",\n      \"feb\",\n      \"mar\",\n      \"abr\",\n      \"may\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"sep\",\n      \"oct\",\n      \"nov\",\n      \"dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-mx\",\n  \"localeID\": \"es_MX\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-ni.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"C$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-ni\",\n  \"localeID\": \"es_NI\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-pa.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"MM/dd/y h:mm:ss a\",\n    \"mediumDate\": \"MM/dd/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"MM/dd/yy h:mm a\",\n    \"shortDate\": \"MM/dd/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"B/.\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-pa\",\n  \"localeID\": \"es_PA\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-pe.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"setiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"set.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Enero\",\n      \"Febrero\",\n      \"Marzo\",\n      \"Abril\",\n      \"Mayo\",\n      \"Junio\",\n      \"Julio\",\n      \"Agosto\",\n      \"Setiembre\",\n      \"Octubre\",\n      \"Noviembre\",\n      \"Diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/MM/yy HH:mm\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"S/.\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-pe\",\n  \"localeID\": \"es_PE\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-ph.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b1\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"es-ph\",\n  \"localeID\": \"es_PH\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-pr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"MM/dd/y h:mm:ss a\",\n    \"mediumDate\": \"MM/dd/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"MM/dd/yy h:mm a\",\n    \"shortDate\": \"MM/dd/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-pr\",\n  \"localeID\": \"es_PR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-py.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Gs.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-py\",\n  \"localeID\": \"es_PY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-sv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-sv\",\n  \"localeID\": \"es_SV\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-us.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sep.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-us\",\n  \"localeID\": \"es_US\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-uy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"setiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"set.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Enero\",\n      \"Febrero\",\n      \"Marzo\",\n      \"Abril\",\n      \"Mayo\",\n      \"Junio\",\n      \"Julio\",\n      \"Agosto\",\n      \"Setiembre\",\n      \"Octubre\",\n      \"Noviembre\",\n      \"Diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-uy\",\n  \"localeID\": \"es_UY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es-ve.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Bs\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"es-ve\",\n  \"localeID\": \"es_VE\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_es.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a. m.\",\n      \"p. m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"lunes\",\n      \"martes\",\n      \"mi\\u00e9rcoles\",\n      \"jueves\",\n      \"viernes\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despu\\u00e9s de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a. C.\",\n      \"d. C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"lun.\",\n      \"mar.\",\n      \"mi\\u00e9.\",\n      \"jue.\",\n      \"vie.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ene.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"may.\",\n      \"jun.\",\n      \"jul.\",\n      \"ago.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dic.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"enero\",\n      \"febrero\",\n      \"marzo\",\n      \"abril\",\n      \"mayo\",\n      \"junio\",\n      \"julio\",\n      \"agosto\",\n      \"septiembre\",\n      \"octubre\",\n      \"noviembre\",\n      \"diciembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/yy H:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"es\",\n  \"localeID\": \"es\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_et-ee.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"p\\u00fchap\\u00e4ev\",\n      \"esmasp\\u00e4ev\",\n      \"teisip\\u00e4ev\",\n      \"kolmap\\u00e4ev\",\n      \"neljap\\u00e4ev\",\n      \"reede\",\n      \"laup\\u00e4ev\"\n    ],\n    \"ERANAMES\": [\n      \"enne Kristust\",\n      \"p\\u00e4rast Kristust\"\n    ],\n    \"ERAS\": [\n      \"eKr\",\n      \"pKr\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"jaanuar\",\n      \"veebruar\",\n      \"m\\u00e4rts\",\n      \"aprill\",\n      \"mai\",\n      \"juuni\",\n      \"juuli\",\n      \"august\",\n      \"september\",\n      \"oktoober\",\n      \"november\",\n      \"detsember\"\n    ],\n    \"SHORTDAY\": [\n      \"P\",\n      \"E\",\n      \"T\",\n      \"K\",\n      \"N\",\n      \"R\",\n      \"L\"\n    ],\n    \"SHORTMONTH\": [\n      \"jaan\",\n      \"veebr\",\n      \"m\\u00e4rts\",\n      \"apr\",\n      \"mai\",\n      \"juuni\",\n      \"juuli\",\n      \"aug\",\n      \"sept\",\n      \"okt\",\n      \"nov\",\n      \"dets\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"jaanuar\",\n      \"veebruar\",\n      \"m\\u00e4rts\",\n      \"aprill\",\n      \"mai\",\n      \"juuni\",\n      \"juuli\",\n      \"august\",\n      \"september\",\n      \"oktoober\",\n      \"november\",\n      \"detsember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"et-ee\",\n  \"localeID\": \"et_EE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_et.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"p\\u00fchap\\u00e4ev\",\n      \"esmasp\\u00e4ev\",\n      \"teisip\\u00e4ev\",\n      \"kolmap\\u00e4ev\",\n      \"neljap\\u00e4ev\",\n      \"reede\",\n      \"laup\\u00e4ev\"\n    ],\n    \"ERANAMES\": [\n      \"enne Kristust\",\n      \"p\\u00e4rast Kristust\"\n    ],\n    \"ERAS\": [\n      \"eKr\",\n      \"pKr\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"jaanuar\",\n      \"veebruar\",\n      \"m\\u00e4rts\",\n      \"aprill\",\n      \"mai\",\n      \"juuni\",\n      \"juuli\",\n      \"august\",\n      \"september\",\n      \"oktoober\",\n      \"november\",\n      \"detsember\"\n    ],\n    \"SHORTDAY\": [\n      \"P\",\n      \"E\",\n      \"T\",\n      \"K\",\n      \"N\",\n      \"R\",\n      \"L\"\n    ],\n    \"SHORTMONTH\": [\n      \"jaan\",\n      \"veebr\",\n      \"m\\u00e4rts\",\n      \"apr\",\n      \"mai\",\n      \"juuni\",\n      \"juuli\",\n      \"aug\",\n      \"sept\",\n      \"okt\",\n      \"nov\",\n      \"dets\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"jaanuar\",\n      \"veebruar\",\n      \"m\\u00e4rts\",\n      \"aprill\",\n      \"mai\",\n      \"juuni\",\n      \"juuli\",\n      \"august\",\n      \"september\",\n      \"oktoober\",\n      \"november\",\n      \"detsember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"et\",\n  \"localeID\": \"et\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_eu-es.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"igandea\",\n      \"astelehena\",\n      \"asteartea\",\n      \"asteazkena\",\n      \"osteguna\",\n      \"ostirala\",\n      \"larunbata\"\n    ],\n    \"ERANAMES\": [\n      \"K.a.\",\n      \"Kristo ondoren\"\n    ],\n    \"ERAS\": [\n      \"K.a.\",\n      \"K.o.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"urtarrila\",\n      \"otsaila\",\n      \"martxoa\",\n      \"apirila\",\n      \"maiatza\",\n      \"ekaina\",\n      \"uztaila\",\n      \"abuztua\",\n      \"iraila\",\n      \"urria\",\n      \"azaroa\",\n      \"abendua\"\n    ],\n    \"SHORTDAY\": [\n      \"ig.\",\n      \"al.\",\n      \"ar.\",\n      \"az.\",\n      \"og.\",\n      \"or.\",\n      \"lr.\"\n    ],\n    \"SHORTMONTH\": [\n      \"urt.\",\n      \"ots.\",\n      \"mar.\",\n      \"api.\",\n      \"mai.\",\n      \"eka.\",\n      \"uzt.\",\n      \"abu.\",\n      \"ira.\",\n      \"urr.\",\n      \"aza.\",\n      \"abe.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"urtarrila\",\n      \"Otsaila\",\n      \"Martxoa\",\n      \"Apirila\",\n      \"Maiatza\",\n      \"Ekaina\",\n      \"Uztaila\",\n      \"Abuztua\",\n      \"Iraila\",\n      \"Urria\",\n      \"Azaroa\",\n      \"Abendua\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y('e')'ko' MMMM d, EEEE\",\n    \"longDate\": \"y('e')'ko' MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yy/M/d HH:mm\",\n    \"shortDate\": \"yy/M/d\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"eu-es\",\n  \"localeID\": \"eu_ES\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_eu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"igandea\",\n      \"astelehena\",\n      \"asteartea\",\n      \"asteazkena\",\n      \"osteguna\",\n      \"ostirala\",\n      \"larunbata\"\n    ],\n    \"ERANAMES\": [\n      \"K.a.\",\n      \"Kristo ondoren\"\n    ],\n    \"ERAS\": [\n      \"K.a.\",\n      \"K.o.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"urtarrila\",\n      \"otsaila\",\n      \"martxoa\",\n      \"apirila\",\n      \"maiatza\",\n      \"ekaina\",\n      \"uztaila\",\n      \"abuztua\",\n      \"iraila\",\n      \"urria\",\n      \"azaroa\",\n      \"abendua\"\n    ],\n    \"SHORTDAY\": [\n      \"ig.\",\n      \"al.\",\n      \"ar.\",\n      \"az.\",\n      \"og.\",\n      \"or.\",\n      \"lr.\"\n    ],\n    \"SHORTMONTH\": [\n      \"urt.\",\n      \"ots.\",\n      \"mar.\",\n      \"api.\",\n      \"mai.\",\n      \"eka.\",\n      \"uzt.\",\n      \"abu.\",\n      \"ira.\",\n      \"urr.\",\n      \"aza.\",\n      \"abe.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"urtarrila\",\n      \"Otsaila\",\n      \"Martxoa\",\n      \"Apirila\",\n      \"Maiatza\",\n      \"Ekaina\",\n      \"Uztaila\",\n      \"Abuztua\",\n      \"Iraila\",\n      \"Urria\",\n      \"Azaroa\",\n      \"Abendua\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y('e')'ko' MMMM d, EEEE\",\n    \"longDate\": \"y('e')'ko' MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yy/M/d HH:mm\",\n    \"shortDate\": \"yy/M/d\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"eu\",\n  \"localeID\": \"eu\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ewo-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"k\\u00edk\\u00edr\\u00edg\",\n      \"ng\\u0259g\\u00f3g\\u0259le\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301nd\\u0254\",\n      \"m\\u0254\\u0301ndi\",\n      \"s\\u0254\\u0301nd\\u0254 m\\u0259l\\u00fa m\\u0259\\u0301b\\u025b\\u030c\",\n      \"s\\u0254\\u0301nd\\u0254 m\\u0259l\\u00fa m\\u0259\\u0301l\\u025b\\u0301\",\n      \"s\\u0254\\u0301nd\\u0254 m\\u0259l\\u00fa m\\u0259\\u0301nyi\",\n      \"f\\u00falad\\u00e9\",\n      \"s\\u00e9rad\\u00e9\"\n    ],\n    \"ERANAMES\": [\n      \"os\\u00fas\\u00faa Y\\u00e9sus kiri\",\n      \"\\u00e1mvus Y\\u00e9sus Kir\\u00eds\"\n    ],\n    \"ERAS\": [\n      \"oyk\",\n      \"ayk\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ng\\u0254n os\\u00fa\",\n      \"ng\\u0254n b\\u025b\\u030c\",\n      \"ng\\u0254n l\\u00e1la\",\n      \"ng\\u0254n nyina\",\n      \"ng\\u0254n t\\u00e1na\",\n      \"ng\\u0254n sam\\u0259na\",\n      \"ng\\u0254n zamgb\\u00e1la\",\n      \"ng\\u0254n mwom\",\n      \"ng\\u0254n ebul\\u00fa\",\n      \"ng\\u0254n aw\\u00f3m\",\n      \"ng\\u0254n aw\\u00f3m ai dzi\\u00e1\",\n      \"ng\\u0254n aw\\u00f3m ai b\\u025b\\u030c\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254\\u0301n\",\n      \"m\\u0254\\u0301n\",\n      \"smb\",\n      \"sml\",\n      \"smn\",\n      \"f\\u00fal\",\n      \"s\\u00e9r\"\n    ],\n    \"SHORTMONTH\": [\n      \"ngo\",\n      \"ngb\",\n      \"ngl\",\n      \"ngn\",\n      \"ngt\",\n      \"ngs\",\n      \"ngz\",\n      \"ngm\",\n      \"nge\",\n      \"nga\",\n      \"ngad\",\n      \"ngab\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ng\\u0254n os\\u00fa\",\n      \"ng\\u0254n b\\u025b\\u030c\",\n      \"ng\\u0254n l\\u00e1la\",\n      \"ng\\u0254n nyina\",\n      \"ng\\u0254n t\\u00e1na\",\n      \"ng\\u0254n sam\\u0259na\",\n      \"ng\\u0254n zamgb\\u00e1la\",\n      \"ng\\u0254n mwom\",\n      \"ng\\u0254n ebul\\u00fa\",\n      \"ng\\u0254n aw\\u00f3m\",\n      \"ng\\u0254n aw\\u00f3m ai dzi\\u00e1\",\n      \"ng\\u0254n aw\\u00f3m ai b\\u025b\\u030c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ewo-cm\",\n  \"localeID\": \"ewo_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ewo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"k\\u00edk\\u00edr\\u00edg\",\n      \"ng\\u0259g\\u00f3g\\u0259le\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301nd\\u0254\",\n      \"m\\u0254\\u0301ndi\",\n      \"s\\u0254\\u0301nd\\u0254 m\\u0259l\\u00fa m\\u0259\\u0301b\\u025b\\u030c\",\n      \"s\\u0254\\u0301nd\\u0254 m\\u0259l\\u00fa m\\u0259\\u0301l\\u025b\\u0301\",\n      \"s\\u0254\\u0301nd\\u0254 m\\u0259l\\u00fa m\\u0259\\u0301nyi\",\n      \"f\\u00falad\\u00e9\",\n      \"s\\u00e9rad\\u00e9\"\n    ],\n    \"ERANAMES\": [\n      \"os\\u00fas\\u00faa Y\\u00e9sus kiri\",\n      \"\\u00e1mvus Y\\u00e9sus Kir\\u00eds\"\n    ],\n    \"ERAS\": [\n      \"oyk\",\n      \"ayk\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ng\\u0254n os\\u00fa\",\n      \"ng\\u0254n b\\u025b\\u030c\",\n      \"ng\\u0254n l\\u00e1la\",\n      \"ng\\u0254n nyina\",\n      \"ng\\u0254n t\\u00e1na\",\n      \"ng\\u0254n sam\\u0259na\",\n      \"ng\\u0254n zamgb\\u00e1la\",\n      \"ng\\u0254n mwom\",\n      \"ng\\u0254n ebul\\u00fa\",\n      \"ng\\u0254n aw\\u00f3m\",\n      \"ng\\u0254n aw\\u00f3m ai dzi\\u00e1\",\n      \"ng\\u0254n aw\\u00f3m ai b\\u025b\\u030c\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254\\u0301n\",\n      \"m\\u0254\\u0301n\",\n      \"smb\",\n      \"sml\",\n      \"smn\",\n      \"f\\u00fal\",\n      \"s\\u00e9r\"\n    ],\n    \"SHORTMONTH\": [\n      \"ngo\",\n      \"ngb\",\n      \"ngl\",\n      \"ngn\",\n      \"ngt\",\n      \"ngs\",\n      \"ngz\",\n      \"ngm\",\n      \"nge\",\n      \"nga\",\n      \"ngad\",\n      \"ngab\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ng\\u0254n os\\u00fa\",\n      \"ng\\u0254n b\\u025b\\u030c\",\n      \"ng\\u0254n l\\u00e1la\",\n      \"ng\\u0254n nyina\",\n      \"ng\\u0254n t\\u00e1na\",\n      \"ng\\u0254n sam\\u0259na\",\n      \"ng\\u0254n zamgb\\u00e1la\",\n      \"ng\\u0254n mwom\",\n      \"ng\\u0254n ebul\\u00fa\",\n      \"ng\\u0254n aw\\u00f3m\",\n      \"ng\\u0254n aw\\u00f3m ai dzi\\u00e1\",\n      \"ng\\u0254n aw\\u00f3m ai b\\u025b\\u030c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ewo\",\n  \"localeID\": \"ewo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fa-af.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0642\\u0628\\u0644\\u200c\\u0627\\u0632\\u0638\\u0647\\u0631\",\n      \"\\u0628\\u0639\\u062f\\u0627\\u0632\\u0638\\u0647\\u0631\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0632 \\u0645\\u06cc\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u06cc\\u0644\\u0627\\u062f\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645.\",\n      \"\\u0645.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      3,\n      4\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y/M/d H:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Af.\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"fa-af\",\n  \"localeID\": \"fa_AF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fa-ir.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0642\\u0628\\u0644\\u200c\\u0627\\u0632\\u0638\\u0647\\u0631\",\n      \"\\u0628\\u0639\\u062f\\u0627\\u0632\\u0638\\u0647\\u0631\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0632 \\u0645\\u06cc\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u06cc\\u0644\\u0627\\u062f\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645.\",\n      \"\\u0645.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\\u0654\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\\u0654\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\\u0654\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\\u0654\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\\u0654\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\\u0654\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\\u0654\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\\u0654\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      4\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y/M/d H:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"\\u061c-\",\n        \"negSuf\": \"\\u00a0\\u061c\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u061c\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fa-ir\",\n  \"localeID\": \"fa_IR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fa.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0642\\u0628\\u0644\\u200c\\u0627\\u0632\\u0638\\u0647\\u0631\",\n      \"\\u0628\\u0639\\u062f\\u0627\\u0632\\u0638\\u0647\\u0631\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0627\\u0632 \\u0645\\u06cc\\u0644\\u0627\\u062f\",\n      \"\\u0645\\u06cc\\u0644\\u0627\\u062f\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u0642.\\u0645.\",\n      \"\\u0645.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\\u0654\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\\u0654\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\\u0654\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\\u0654\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\\u0654\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\\u0654\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\\u0654\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\\u0654\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      4\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y/M/d H:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u061c-\",\n        \"negSuf\": \"\\u00a0\\u061c\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u061c\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fa\",\n  \"localeID\": \"fa\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ff-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"subaka\",\n      \"kikii\\u0257e\"\n    ],\n    \"DAY\": [\n      \"dewo\",\n      \"aa\\u0253nde\",\n      \"mawbaare\",\n      \"njeslaare\",\n      \"naasaande\",\n      \"mawnde\",\n      \"hoore-biir\"\n    ],\n    \"ERANAMES\": [\n      \"Hade Iisa\",\n      \"Caggal Iisa\"\n    ],\n    \"ERAS\": [\n      \"H-I\",\n      \"C-I\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"SHORTDAY\": [\n      \"dew\",\n      \"aa\\u0253\",\n      \"maw\",\n      \"nje\",\n      \"naa\",\n      \"mwd\",\n      \"hbi\"\n    ],\n    \"SHORTMONTH\": [\n      \"sii\",\n      \"col\",\n      \"mbo\",\n      \"see\",\n      \"duu\",\n      \"kor\",\n      \"mor\",\n      \"juk\",\n      \"slt\",\n      \"yar\",\n      \"jol\",\n      \"bow\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ff-cm\",\n  \"localeID\": \"ff_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ff-gn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"subaka\",\n      \"kikii\\u0257e\"\n    ],\n    \"DAY\": [\n      \"dewo\",\n      \"aa\\u0253nde\",\n      \"mawbaare\",\n      \"njeslaare\",\n      \"naasaande\",\n      \"mawnde\",\n      \"hoore-biir\"\n    ],\n    \"ERANAMES\": [\n      \"Hade Iisa\",\n      \"Caggal Iisa\"\n    ],\n    \"ERAS\": [\n      \"H-I\",\n      \"C-I\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"SHORTDAY\": [\n      \"dew\",\n      \"aa\\u0253\",\n      \"maw\",\n      \"nje\",\n      \"naa\",\n      \"mwd\",\n      \"hbi\"\n    ],\n    \"SHORTMONTH\": [\n      \"sii\",\n      \"col\",\n      \"mbo\",\n      \"see\",\n      \"duu\",\n      \"kor\",\n      \"mor\",\n      \"juk\",\n      \"slt\",\n      \"yar\",\n      \"jol\",\n      \"bow\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FG\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ff-gn\",\n  \"localeID\": \"ff_GN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ff-mr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"subaka\",\n      \"kikii\\u0257e\"\n    ],\n    \"DAY\": [\n      \"dewo\",\n      \"aa\\u0253nde\",\n      \"mawbaare\",\n      \"njeslaare\",\n      \"naasaande\",\n      \"mawnde\",\n      \"hoore-biir\"\n    ],\n    \"ERANAMES\": [\n      \"Hade Iisa\",\n      \"Caggal Iisa\"\n    ],\n    \"ERAS\": [\n      \"H-I\",\n      \"C-I\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"SHORTDAY\": [\n      \"dew\",\n      \"aa\\u0253\",\n      \"maw\",\n      \"nje\",\n      \"naa\",\n      \"mwd\",\n      \"hbi\"\n    ],\n    \"SHORTMONTH\": [\n      \"sii\",\n      \"col\",\n      \"mbo\",\n      \"see\",\n      \"duu\",\n      \"kor\",\n      \"mor\",\n      \"juk\",\n      \"slt\",\n      \"yar\",\n      \"jol\",\n      \"bow\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/y h:mm a\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MRO\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ff-mr\",\n  \"localeID\": \"ff_MR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ff-sn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"subaka\",\n      \"kikii\\u0257e\"\n    ],\n    \"DAY\": [\n      \"dewo\",\n      \"aa\\u0253nde\",\n      \"mawbaare\",\n      \"njeslaare\",\n      \"naasaande\",\n      \"mawnde\",\n      \"hoore-biir\"\n    ],\n    \"ERANAMES\": [\n      \"Hade Iisa\",\n      \"Caggal Iisa\"\n    ],\n    \"ERAS\": [\n      \"H-I\",\n      \"C-I\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"SHORTDAY\": [\n      \"dew\",\n      \"aa\\u0253\",\n      \"maw\",\n      \"nje\",\n      \"naa\",\n      \"mwd\",\n      \"hbi\"\n    ],\n    \"SHORTMONTH\": [\n      \"sii\",\n      \"col\",\n      \"mbo\",\n      \"see\",\n      \"duu\",\n      \"kor\",\n      \"mor\",\n      \"juk\",\n      \"slt\",\n      \"yar\",\n      \"jol\",\n      \"bow\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ff-sn\",\n  \"localeID\": \"ff_SN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ff.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"subaka\",\n      \"kikii\\u0257e\"\n    ],\n    \"DAY\": [\n      \"dewo\",\n      \"aa\\u0253nde\",\n      \"mawbaare\",\n      \"njeslaare\",\n      \"naasaande\",\n      \"mawnde\",\n      \"hoore-biir\"\n    ],\n    \"ERANAMES\": [\n      \"Hade Iisa\",\n      \"Caggal Iisa\"\n    ],\n    \"ERAS\": [\n      \"H-I\",\n      \"C-I\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"SHORTDAY\": [\n      \"dew\",\n      \"aa\\u0253\",\n      \"maw\",\n      \"nje\",\n      \"naa\",\n      \"mwd\",\n      \"hbi\"\n    ],\n    \"SHORTMONTH\": [\n      \"sii\",\n      \"col\",\n      \"mbo\",\n      \"see\",\n      \"duu\",\n      \"kor\",\n      \"mor\",\n      \"juk\",\n      \"slt\",\n      \"yar\",\n      \"jol\",\n      \"bow\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"siilo\",\n      \"colte\",\n      \"mbooy\",\n      \"see\\u0257to\",\n      \"duujal\",\n      \"korse\",\n      \"morso\",\n      \"juko\",\n      \"siilto\",\n      \"yarkomaa\",\n      \"jolal\",\n      \"bowte\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ff\",\n  \"localeID\": \"ff\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fi-fi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ap.\",\n      \"ip.\"\n    ],\n    \"DAY\": [\n      \"sunnuntaina\",\n      \"maanantaina\",\n      \"tiistaina\",\n      \"keskiviikkona\",\n      \"torstaina\",\n      \"perjantaina\",\n      \"lauantaina\"\n    ],\n    \"ERANAMES\": [\n      \"ennen Kristuksen syntym\\u00e4\\u00e4\",\n      \"j\\u00e4lkeen Kristuksen syntym\\u00e4n\"\n    ],\n    \"ERAS\": [\n      \"eKr.\",\n      \"jKr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"tammikuuta\",\n      \"helmikuuta\",\n      \"maaliskuuta\",\n      \"huhtikuuta\",\n      \"toukokuuta\",\n      \"kes\\u00e4kuuta\",\n      \"hein\\u00e4kuuta\",\n      \"elokuuta\",\n      \"syyskuuta\",\n      \"lokakuuta\",\n      \"marraskuuta\",\n      \"joulukuuta\"\n    ],\n    \"SHORTDAY\": [\n      \"su\",\n      \"ma\",\n      \"ti\",\n      \"ke\",\n      \"to\",\n      \"pe\",\n      \"la\"\n    ],\n    \"SHORTMONTH\": [\n      \"tammik.\",\n      \"helmik.\",\n      \"maalisk.\",\n      \"huhtik.\",\n      \"toukok.\",\n      \"kes\\u00e4k.\",\n      \"hein\\u00e4k.\",\n      \"elok.\",\n      \"syysk.\",\n      \"lokak.\",\n      \"marrask.\",\n      \"jouluk.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"tammikuu\",\n      \"helmikuu\",\n      \"maaliskuu\",\n      \"huhtikuu\",\n      \"toukokuu\",\n      \"kes\\u00e4kuu\",\n      \"hein\\u00e4kuu\",\n      \"elokuu\",\n      \"syyskuu\",\n      \"lokakuu\",\n      \"marraskuu\",\n      \"joulukuu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"cccc d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d.M.y H.mm.ss\",\n    \"mediumDate\": \"d.M.y\",\n    \"mediumTime\": \"H.mm.ss\",\n    \"short\": \"d.M.y H.mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"H.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fi-fi\",\n  \"localeID\": \"fi_FI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ap.\",\n      \"ip.\"\n    ],\n    \"DAY\": [\n      \"sunnuntaina\",\n      \"maanantaina\",\n      \"tiistaina\",\n      \"keskiviikkona\",\n      \"torstaina\",\n      \"perjantaina\",\n      \"lauantaina\"\n    ],\n    \"ERANAMES\": [\n      \"ennen Kristuksen syntym\\u00e4\\u00e4\",\n      \"j\\u00e4lkeen Kristuksen syntym\\u00e4n\"\n    ],\n    \"ERAS\": [\n      \"eKr.\",\n      \"jKr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"tammikuuta\",\n      \"helmikuuta\",\n      \"maaliskuuta\",\n      \"huhtikuuta\",\n      \"toukokuuta\",\n      \"kes\\u00e4kuuta\",\n      \"hein\\u00e4kuuta\",\n      \"elokuuta\",\n      \"syyskuuta\",\n      \"lokakuuta\",\n      \"marraskuuta\",\n      \"joulukuuta\"\n    ],\n    \"SHORTDAY\": [\n      \"su\",\n      \"ma\",\n      \"ti\",\n      \"ke\",\n      \"to\",\n      \"pe\",\n      \"la\"\n    ],\n    \"SHORTMONTH\": [\n      \"tammik.\",\n      \"helmik.\",\n      \"maalisk.\",\n      \"huhtik.\",\n      \"toukok.\",\n      \"kes\\u00e4k.\",\n      \"hein\\u00e4k.\",\n      \"elok.\",\n      \"syysk.\",\n      \"lokak.\",\n      \"marrask.\",\n      \"jouluk.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"tammikuu\",\n      \"helmikuu\",\n      \"maaliskuu\",\n      \"huhtikuu\",\n      \"toukokuu\",\n      \"kes\\u00e4kuu\",\n      \"hein\\u00e4kuu\",\n      \"elokuu\",\n      \"syyskuu\",\n      \"lokakuu\",\n      \"marraskuu\",\n      \"joulukuu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"cccc d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d.M.y H.mm.ss\",\n    \"mediumDate\": \"d.M.y\",\n    \"mediumTime\": \"H.mm.ss\",\n    \"short\": \"d.M.y H.mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"H.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fi\",\n  \"localeID\": \"fi\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fil-ph.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Linggo\",\n      \"Lunes\",\n      \"Martes\",\n      \"Miyerkules\",\n      \"Huwebes\",\n      \"Biyernes\",\n      \"Sabado\"\n    ],\n    \"ERANAMES\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Enero\",\n      \"Pebrero\",\n      \"Marso\",\n      \"Abril\",\n      \"Mayo\",\n      \"Hunyo\",\n      \"Hulyo\",\n      \"Agosto\",\n      \"Setyembre\",\n      \"Oktubre\",\n      \"Nobyembre\",\n      \"Disyembre\"\n    ],\n    \"SHORTDAY\": [\n      \"Lin\",\n      \"Lun\",\n      \"Mar\",\n      \"Miy\",\n      \"Huw\",\n      \"Biy\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ene\",\n      \"Peb\",\n      \"Mar\",\n      \"Abr\",\n      \"May\",\n      \"Hun\",\n      \"Hul\",\n      \"Ago\",\n      \"Set\",\n      \"Okt\",\n      \"Nob\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Enero\",\n      \"Pebrero\",\n      \"Marso\",\n      \"Abril\",\n      \"Mayo\",\n      \"Hunyo\",\n      \"Hulyo\",\n      \"Agosto\",\n      \"Setyembre\",\n      \"Oktubre\",\n      \"Nobyembre\",\n      \"Disyembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b1\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"fil-ph\",\n  \"localeID\": \"fil_PH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && (i == 1 || i == 2 || i == 3) || vf.v == 0 && i % 10 != 4 && i % 10 != 6 && i % 10 != 9 || vf.v != 0 && vf.f % 10 != 4 && vf.f % 10 != 6 && vf.f % 10 != 9) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fil.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Linggo\",\n      \"Lunes\",\n      \"Martes\",\n      \"Miyerkules\",\n      \"Huwebes\",\n      \"Biyernes\",\n      \"Sabado\"\n    ],\n    \"ERANAMES\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Enero\",\n      \"Pebrero\",\n      \"Marso\",\n      \"Abril\",\n      \"Mayo\",\n      \"Hunyo\",\n      \"Hulyo\",\n      \"Agosto\",\n      \"Setyembre\",\n      \"Oktubre\",\n      \"Nobyembre\",\n      \"Disyembre\"\n    ],\n    \"SHORTDAY\": [\n      \"Lin\",\n      \"Lun\",\n      \"Mar\",\n      \"Miy\",\n      \"Huw\",\n      \"Biy\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ene\",\n      \"Peb\",\n      \"Mar\",\n      \"Abr\",\n      \"May\",\n      \"Hun\",\n      \"Hul\",\n      \"Ago\",\n      \"Set\",\n      \"Okt\",\n      \"Nob\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Enero\",\n      \"Pebrero\",\n      \"Marso\",\n      \"Abril\",\n      \"Mayo\",\n      \"Hunyo\",\n      \"Hulyo\",\n      \"Agosto\",\n      \"Setyembre\",\n      \"Oktubre\",\n      \"Nobyembre\",\n      \"Disyembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b1\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"fil\",\n  \"localeID\": \"fil\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && (i == 1 || i == 2 || i == 3) || vf.v == 0 && i % 10 != 4 && i % 10 != 6 && i % 10 != 9 || vf.v != 0 && vf.f % 10 != 4 && vf.f % 10 != 6 && vf.f % 10 != 9) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fo-dk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"sunnudagur\",\n      \"m\\u00e1nadagur\",\n      \"t\\u00fdsdagur\",\n      \"mikudagur\",\n      \"h\\u00f3sdagur\",\n      \"fr\\u00edggjadagur\",\n      \"leygardagur\"\n    ],\n    \"ERANAMES\": [\n      \"fyri Krist\",\n      \"eftir Krist\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"sun.\",\n      \"m\\u00e1n.\",\n      \"t\\u00fds.\",\n      \"mik.\",\n      \"h\\u00f3s.\",\n      \"fr\\u00ed.\",\n      \"ley.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fo-dk\",\n  \"localeID\": \"fo_DK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fo-fo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"sunnudagur\",\n      \"m\\u00e1nadagur\",\n      \"t\\u00fdsdagur\",\n      \"mikudagur\",\n      \"h\\u00f3sdagur\",\n      \"fr\\u00edggjadagur\",\n      \"leygardagur\"\n    ],\n    \"ERANAMES\": [\n      \"fyri Krist\",\n      \"eftir Krist\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"sun.\",\n      \"m\\u00e1n.\",\n      \"t\\u00fds.\",\n      \"mik.\",\n      \"h\\u00f3s.\",\n      \"fr\\u00ed.\",\n      \"ley.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fo-fo\",\n  \"localeID\": \"fo_FO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"sunnudagur\",\n      \"m\\u00e1nadagur\",\n      \"t\\u00fdsdagur\",\n      \"mikudagur\",\n      \"h\\u00f3sdagur\",\n      \"fr\\u00edggjadagur\",\n      \"leygardagur\"\n    ],\n    \"ERANAMES\": [\n      \"fyri Krist\",\n      \"eftir Krist\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"sun.\",\n      \"m\\u00e1n.\",\n      \"t\\u00fds.\",\n      \"mik.\",\n      \"h\\u00f3s.\",\n      \"fr\\u00ed.\",\n      \"ley.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fo\",\n  \"localeID\": \"fo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-be.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/MM/yy HH:mm\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-be\",\n  \"localeID\": \"fr_BE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-bf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-bf\",\n  \"localeID\": \"fr_BF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-bi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FBu\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-bi\",\n  \"localeID\": \"fr_BI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-bj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-bj\",\n  \"localeID\": \"fr_BJ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-bl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-bl\",\n  \"localeID\": \"fr_BL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ca.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juill.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yy-MM-dd HH 'h' mm\",\n    \"shortDate\": \"yy-MM-dd\",\n    \"shortTime\": \"HH 'h' mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ca\",\n  \"localeID\": \"fr_CA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-cd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FrCD\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-cd\",\n  \"localeID\": \"fr_CD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-cf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-cf\",\n  \"localeID\": \"fr_CF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-cg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-cg\",\n  \"localeID\": \"fr_CG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ch\",\n  \"localeID\": \"fr_CH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ci.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ci\",\n  \"localeID\": \"fr_CI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"matin\",\n      \"soir\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-cm\",\n  \"localeID\": \"fr_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-dj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Fdj\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-dj\",\n  \"localeID\": \"fr_DJ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-dz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-dz\",\n  \"localeID\": \"fr_DZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-fr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-fr\",\n  \"localeID\": \"fr_FR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ga.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ga\",\n  \"localeID\": \"fr_GA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-gf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-gf\",\n  \"localeID\": \"fr_GF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-gn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FG\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-gn\",\n  \"localeID\": \"fr_GN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-gp.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-gp\",\n  \"localeID\": \"fr_GP\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-gq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-gq\",\n  \"localeID\": \"fr_GQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ht.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"HTG\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ht\",\n  \"localeID\": \"fr_HT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-km.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-km\",\n  \"localeID\": \"fr_KM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-lu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-lu\",\n  \"localeID\": \"fr_LU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ma.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"f\\u00e9v.\",\n      \"mar.\",\n      \"avr.\",\n      \"mai\",\n      \"jui.\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ma\",\n  \"localeID\": \"fr_MA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-mc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-mc\",\n  \"localeID\": \"fr_MC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-mf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-mf\",\n  \"localeID\": \"fr_MF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-mg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ar\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-mg\",\n  \"localeID\": \"fr_MG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ml.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ml\",\n  \"localeID\": \"fr_ML\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-mq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-mq\",\n  \"localeID\": \"fr_MQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-mr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MRO\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-mr\",\n  \"localeID\": \"fr_MR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-mu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MURs\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-mu\",\n  \"localeID\": \"fr_MU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-nc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFP\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-nc\",\n  \"localeID\": \"fr_NC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-ne.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-ne\",\n  \"localeID\": \"fr_NE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-pf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFP\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-pf\",\n  \"localeID\": \"fr_PF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-pm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-pm\",\n  \"localeID\": \"fr_PM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-re.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-re\",\n  \"localeID\": \"fr_RE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-rw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-rw\",\n  \"localeID\": \"fr_RW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-sc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SCR\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-sc\",\n  \"localeID\": \"fr_SC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-sn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-sn\",\n  \"localeID\": \"fr_SN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-sy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-sy\",\n  \"localeID\": \"fr_SY\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-td.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-td\",\n  \"localeID\": \"fr_TD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-tg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-tg\",\n  \"localeID\": \"fr_TG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-tn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 3,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-tn\",\n  \"localeID\": \"fr_TN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-vu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"VUV\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-vu\",\n  \"localeID\": \"fr_VU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-wf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFP\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-wf\",\n  \"localeID\": \"fr_WF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr-yt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr-yt\",\n  \"localeID\": \"fr_YT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimanche\",\n      \"lundi\",\n      \"mardi\",\n      \"mercredi\",\n      \"jeudi\",\n      \"vendredi\",\n      \"samedi\"\n    ],\n    \"ERANAMES\": [\n      \"avant J\\u00e9sus-Christ\",\n      \"apr\\u00e8s J\\u00e9sus-Christ\"\n    ],\n    \"ERAS\": [\n      \"av. J.-C.\",\n      \"ap. J.-C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dim.\",\n      \"lun.\",\n      \"mar.\",\n      \"mer.\",\n      \"jeu.\",\n      \"ven.\",\n      \"sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"f\\u00e9vr.\",\n      \"mars\",\n      \"avr.\",\n      \"mai\",\n      \"juin\",\n      \"juil.\",\n      \"ao\\u00fbt\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"d\\u00e9c.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janvier\",\n      \"f\\u00e9vrier\",\n      \"mars\",\n      \"avril\",\n      \"mai\",\n      \"juin\",\n      \"juillet\",\n      \"ao\\u00fbt\",\n      \"septembre\",\n      \"octobre\",\n      \"novembre\",\n      \"d\\u00e9cembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"fr\",\n  \"localeID\": \"fr\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fur-it.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.\",\n      \"p.\"\n    ],\n    \"DAY\": [\n      \"domenie\",\n      \"lunis\",\n      \"martars\",\n      \"miercus\",\n      \"joibe\",\n      \"vinars\",\n      \"sabide\"\n    ],\n    \"ERANAMES\": [\n      \"pdC\",\n      \"ddC\"\n    ],\n    \"ERAS\": [\n      \"pdC\",\n      \"ddC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Zen\\u00e2r\",\n      \"Fevr\\u00e2r\",\n      \"Mar\\u00e7\",\n      \"Avr\\u00eel\",\n      \"Mai\",\n      \"Jugn\",\n      \"Lui\",\n      \"Avost\",\n      \"Setembar\",\n      \"Otubar\",\n      \"Novembar\",\n      \"Dicembar\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"lun\",\n      \"mar\",\n      \"mie\",\n      \"joi\",\n      \"vin\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Zen\",\n      \"Fev\",\n      \"Mar\",\n      \"Avr\",\n      \"Mai\",\n      \"Jug\",\n      \"Lui\",\n      \"Avo\",\n      \"Set\",\n      \"Otu\",\n      \"Nov\",\n      \"Dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Zen\\u00e2r\",\n      \"Fevr\\u00e2r\",\n      \"Mar\\u00e7\",\n      \"Avr\\u00eel\",\n      \"Mai\",\n      \"Jugn\",\n      \"Lui\",\n      \"Avost\",\n      \"Setembar\",\n      \"Otubar\",\n      \"Novembar\",\n      \"Dicembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d 'di' MMMM 'dal' y\",\n    \"longDate\": \"d 'di' MMMM 'dal' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"fur-it\",\n  \"localeID\": \"fur_IT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fur.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.\",\n      \"p.\"\n    ],\n    \"DAY\": [\n      \"domenie\",\n      \"lunis\",\n      \"martars\",\n      \"miercus\",\n      \"joibe\",\n      \"vinars\",\n      \"sabide\"\n    ],\n    \"ERANAMES\": [\n      \"pdC\",\n      \"ddC\"\n    ],\n    \"ERAS\": [\n      \"pdC\",\n      \"ddC\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Zen\\u00e2r\",\n      \"Fevr\\u00e2r\",\n      \"Mar\\u00e7\",\n      \"Avr\\u00eel\",\n      \"Mai\",\n      \"Jugn\",\n      \"Lui\",\n      \"Avost\",\n      \"Setembar\",\n      \"Otubar\",\n      \"Novembar\",\n      \"Dicembar\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"lun\",\n      \"mar\",\n      \"mie\",\n      \"joi\",\n      \"vin\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Zen\",\n      \"Fev\",\n      \"Mar\",\n      \"Avr\",\n      \"Mai\",\n      \"Jug\",\n      \"Lui\",\n      \"Avo\",\n      \"Set\",\n      \"Otu\",\n      \"Nov\",\n      \"Dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Zen\\u00e2r\",\n      \"Fevr\\u00e2r\",\n      \"Mar\\u00e7\",\n      \"Avr\\u00eel\",\n      \"Mai\",\n      \"Jugn\",\n      \"Lui\",\n      \"Avost\",\n      \"Setembar\",\n      \"Otubar\",\n      \"Novembar\",\n      \"Dicembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d 'di' MMMM 'dal' y\",\n    \"longDate\": \"d 'di' MMMM 'dal' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"fur\",\n  \"localeID\": \"fur\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fy-nl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"snein\",\n      \"moandei\",\n      \"tiisdei\",\n      \"woansdei\",\n      \"tongersdei\",\n      \"freed\",\n      \"sneon\"\n    ],\n    \"ERANAMES\": [\n      \"Foar Kristus\",\n      \"nei Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"n.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jannewaris\",\n      \"Febrewaris\",\n      \"Maart\",\n      \"April\",\n      \"Maaie\",\n      \"Juny\",\n      \"July\",\n      \"Augustus\",\n      \"Septimber\",\n      \"Oktober\",\n      \"Novimber\",\n      \"Desimber\"\n    ],\n    \"SHORTDAY\": [\n      \"si\",\n      \"mo\",\n      \"ti\",\n      \"wo\",\n      \"to\",\n      \"fr\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mrt\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jannewaris\",\n      \"Febrewaris\",\n      \"Maart\",\n      \"April\",\n      \"Maaie\",\n      \"Juny\",\n      \"July\",\n      \"Augustus\",\n      \"Septimber\",\n      \"Oktober\",\n      \"Novimber\",\n      \"Desimber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0\",\n        \"negSuf\": \"-\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"fy-nl\",\n  \"localeID\": \"fy_NL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_fy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"snein\",\n      \"moandei\",\n      \"tiisdei\",\n      \"woansdei\",\n      \"tongersdei\",\n      \"freed\",\n      \"sneon\"\n    ],\n    \"ERANAMES\": [\n      \"Foar Kristus\",\n      \"nei Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"n.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jannewaris\",\n      \"Febrewaris\",\n      \"Maart\",\n      \"April\",\n      \"Maaie\",\n      \"Juny\",\n      \"July\",\n      \"Augustus\",\n      \"Septimber\",\n      \"Oktober\",\n      \"Novimber\",\n      \"Desimber\"\n    ],\n    \"SHORTDAY\": [\n      \"si\",\n      \"mo\",\n      \"ti\",\n      \"wo\",\n      \"to\",\n      \"fr\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mrt\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jannewaris\",\n      \"Febrewaris\",\n      \"Maart\",\n      \"April\",\n      \"Maaie\",\n      \"Juny\",\n      \"July\",\n      \"Augustus\",\n      \"Septimber\",\n      \"Oktober\",\n      \"Novimber\",\n      \"Desimber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0\",\n        \"negSuf\": \"-\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"fy\",\n  \"localeID\": \"fy\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ga-ie.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"D\\u00e9 Domhnaigh\",\n      \"D\\u00e9 Luain\",\n      \"D\\u00e9 M\\u00e1irt\",\n      \"D\\u00e9 C\\u00e9adaoin\",\n      \"D\\u00e9ardaoin\",\n      \"D\\u00e9 hAoine\",\n      \"D\\u00e9 Sathairn\"\n    ],\n    \"ERANAMES\": [\n      \"Roimh Chr\\u00edost\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Ean\\u00e1ir\",\n      \"Feabhra\",\n      \"M\\u00e1rta\",\n      \"Aibre\\u00e1n\",\n      \"Bealtaine\",\n      \"Meitheamh\",\n      \"I\\u00fail\",\n      \"L\\u00fanasa\",\n      \"Me\\u00e1n F\\u00f3mhair\",\n      \"Deireadh F\\u00f3mhair\",\n      \"Samhain\",\n      \"Nollaig\"\n    ],\n    \"SHORTDAY\": [\n      \"Domh\",\n      \"Luan\",\n      \"M\\u00e1irt\",\n      \"C\\u00e9ad\",\n      \"D\\u00e9ar\",\n      \"Aoine\",\n      \"Sath\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ean\",\n      \"Feabh\",\n      \"M\\u00e1rta\",\n      \"Aib\",\n      \"Beal\",\n      \"Meith\",\n      \"I\\u00fail\",\n      \"L\\u00fan\",\n      \"MF\\u00f3mh\",\n      \"DF\\u00f3mh\",\n      \"Samh\",\n      \"Noll\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ean\\u00e1ir\",\n      \"Feabhra\",\n      \"M\\u00e1rta\",\n      \"Aibre\\u00e1n\",\n      \"Bealtaine\",\n      \"Meitheamh\",\n      \"I\\u00fail\",\n      \"L\\u00fanasa\",\n      \"Me\\u00e1n F\\u00f3mhair\",\n      \"Deireadh F\\u00f3mhair\",\n      \"Samhain\",\n      \"Nollaig\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ga-ie\",\n  \"localeID\": \"ga_IE\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n >= 3 && n <= 6) {    return PLURAL_CATEGORY.FEW;  }  if (n >= 7 && n <= 10) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ga.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"D\\u00e9 Domhnaigh\",\n      \"D\\u00e9 Luain\",\n      \"D\\u00e9 M\\u00e1irt\",\n      \"D\\u00e9 C\\u00e9adaoin\",\n      \"D\\u00e9ardaoin\",\n      \"D\\u00e9 hAoine\",\n      \"D\\u00e9 Sathairn\"\n    ],\n    \"ERANAMES\": [\n      \"Roimh Chr\\u00edost\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Ean\\u00e1ir\",\n      \"Feabhra\",\n      \"M\\u00e1rta\",\n      \"Aibre\\u00e1n\",\n      \"Bealtaine\",\n      \"Meitheamh\",\n      \"I\\u00fail\",\n      \"L\\u00fanasa\",\n      \"Me\\u00e1n F\\u00f3mhair\",\n      \"Deireadh F\\u00f3mhair\",\n      \"Samhain\",\n      \"Nollaig\"\n    ],\n    \"SHORTDAY\": [\n      \"Domh\",\n      \"Luan\",\n      \"M\\u00e1irt\",\n      \"C\\u00e9ad\",\n      \"D\\u00e9ar\",\n      \"Aoine\",\n      \"Sath\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ean\",\n      \"Feabh\",\n      \"M\\u00e1rta\",\n      \"Aib\",\n      \"Beal\",\n      \"Meith\",\n      \"I\\u00fail\",\n      \"L\\u00fan\",\n      \"MF\\u00f3mh\",\n      \"DF\\u00f3mh\",\n      \"Samh\",\n      \"Noll\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ean\\u00e1ir\",\n      \"Feabhra\",\n      \"M\\u00e1rta\",\n      \"Aibre\\u00e1n\",\n      \"Bealtaine\",\n      \"Meitheamh\",\n      \"I\\u00fail\",\n      \"L\\u00fanasa\",\n      \"Me\\u00e1n F\\u00f3mhair\",\n      \"Deireadh F\\u00f3mhair\",\n      \"Samhain\",\n      \"Nollaig\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ga\",\n  \"localeID\": \"ga\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 2) {    return PLURAL_CATEGORY.TWO;  }  if (n >= 3 && n <= 6) {    return PLURAL_CATEGORY.FEW;  }  if (n >= 7 && n <= 10) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gd-gb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"m\",\n      \"f\"\n    ],\n    \"DAY\": [\n      \"DiD\\u00f2mhnaich\",\n      \"DiLuain\",\n      \"DiM\\u00e0irt\",\n      \"DiCiadain\",\n      \"DiarDaoin\",\n      \"DihAoine\",\n      \"DiSathairne\"\n    ],\n    \"ERANAMES\": [\n      \"Ro Chr\\u00ecosta\",\n      \"An d\\u00e8idh Chr\\u00ecosta\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"dhen Fhaoilleach\",\n      \"dhen Ghearran\",\n      \"dhen Mh\\u00e0rt\",\n      \"dhen Ghiblean\",\n      \"dhen Ch\\u00e8itean\",\n      \"dhen \\u00d2gmhios\",\n      \"dhen Iuchar\",\n      \"dhen L\\u00f9nastal\",\n      \"dhen t-Sultain\",\n      \"dhen D\\u00e0mhair\",\n      \"dhen t-Samhain\",\n      \"dhen D\\u00f9bhlachd\"\n    ],\n    \"SHORTDAY\": [\n      \"DiD\",\n      \"DiL\",\n      \"DiM\",\n      \"DiC\",\n      \"Dia\",\n      \"Dih\",\n      \"DiS\"\n    ],\n    \"SHORTMONTH\": [\n      \"Faoi\",\n      \"Gearr\",\n      \"M\\u00e0rt\",\n      \"Gibl\",\n      \"C\\u00e8it\",\n      \"\\u00d2gmh\",\n      \"Iuch\",\n      \"L\\u00f9na\",\n      \"Sult\",\n      \"D\\u00e0mh\",\n      \"Samh\",\n      \"D\\u00f9bh\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Am Faoilleach\",\n      \"An Gearran\",\n      \"Am M\\u00e0rt\",\n      \"An Giblean\",\n      \"An C\\u00e8itean\",\n      \"An t-\\u00d2gmhios\",\n      \"An t-Iuchar\",\n      \"An L\\u00f9nastal\",\n      \"An t-Sultain\",\n      \"An D\\u00e0mhair\",\n      \"An t-Samhain\",\n      \"An D\\u00f9bhlachd\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d'mh' MMMM y\",\n    \"longDate\": \"d'mh' MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"gd-gb\",\n  \"localeID\": \"gd_GB\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"m\",\n      \"f\"\n    ],\n    \"DAY\": [\n      \"DiD\\u00f2mhnaich\",\n      \"DiLuain\",\n      \"DiM\\u00e0irt\",\n      \"DiCiadain\",\n      \"DiarDaoin\",\n      \"DihAoine\",\n      \"DiSathairne\"\n    ],\n    \"ERANAMES\": [\n      \"Ro Chr\\u00ecosta\",\n      \"An d\\u00e8idh Chr\\u00ecosta\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"dhen Fhaoilleach\",\n      \"dhen Ghearran\",\n      \"dhen Mh\\u00e0rt\",\n      \"dhen Ghiblean\",\n      \"dhen Ch\\u00e8itean\",\n      \"dhen \\u00d2gmhios\",\n      \"dhen Iuchar\",\n      \"dhen L\\u00f9nastal\",\n      \"dhen t-Sultain\",\n      \"dhen D\\u00e0mhair\",\n      \"dhen t-Samhain\",\n      \"dhen D\\u00f9bhlachd\"\n    ],\n    \"SHORTDAY\": [\n      \"DiD\",\n      \"DiL\",\n      \"DiM\",\n      \"DiC\",\n      \"Dia\",\n      \"Dih\",\n      \"DiS\"\n    ],\n    \"SHORTMONTH\": [\n      \"Faoi\",\n      \"Gearr\",\n      \"M\\u00e0rt\",\n      \"Gibl\",\n      \"C\\u00e8it\",\n      \"\\u00d2gmh\",\n      \"Iuch\",\n      \"L\\u00f9na\",\n      \"Sult\",\n      \"D\\u00e0mh\",\n      \"Samh\",\n      \"D\\u00f9bh\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Am Faoilleach\",\n      \"An Gearran\",\n      \"Am M\\u00e0rt\",\n      \"An Giblean\",\n      \"An C\\u00e8itean\",\n      \"An t-\\u00d2gmhios\",\n      \"An t-Iuchar\",\n      \"An L\\u00f9nastal\",\n      \"An t-Sultain\",\n      \"An D\\u00e0mhair\",\n      \"An t-Samhain\",\n      \"An D\\u00f9bhlachd\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d'mh' MMMM y\",\n    \"longDate\": \"d'mh' MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"gd\",\n  \"localeID\": \"gd\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gl-es.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"luns\",\n      \"martes\",\n      \"m\\u00e9rcores\",\n      \"xoves\",\n      \"venres\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"xaneiro\",\n      \"febreiro\",\n      \"marzo\",\n      \"abril\",\n      \"maio\",\n      \"xu\\u00f1o\",\n      \"xullo\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"decembro\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"luns\",\n      \"mar.\",\n      \"m\\u00e9r.\",\n      \"xov.\",\n      \"ven.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"xan.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"maio\",\n      \"xu\\u00f1o\",\n      \"xul.\",\n      \"ago.\",\n      \"set.\",\n      \"out.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Xaneiro\",\n      \"Febreiro\",\n      \"Marzo\",\n      \"Abril\",\n      \"Maio\",\n      \"Xu\\u00f1o\",\n      \"Xullo\",\n      \"Agosto\",\n      \"Setembro\",\n      \"Outubro\",\n      \"Novembro\",\n      \"Decembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d 'de' MMM 'de' y HH:mm:ss\",\n    \"mediumDate\": \"d 'de' MMM 'de' y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"gl-es\",\n  \"localeID\": \"gl_ES\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"luns\",\n      \"martes\",\n      \"m\\u00e9rcores\",\n      \"xoves\",\n      \"venres\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"despois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"xaneiro\",\n      \"febreiro\",\n      \"marzo\",\n      \"abril\",\n      \"maio\",\n      \"xu\\u00f1o\",\n      \"xullo\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"decembro\"\n    ],\n    \"SHORTDAY\": [\n      \"dom.\",\n      \"luns\",\n      \"mar.\",\n      \"m\\u00e9r.\",\n      \"xov.\",\n      \"ven.\",\n      \"s\\u00e1b.\"\n    ],\n    \"SHORTMONTH\": [\n      \"xan.\",\n      \"feb.\",\n      \"mar.\",\n      \"abr.\",\n      \"maio\",\n      \"xu\\u00f1o\",\n      \"xul.\",\n      \"ago.\",\n      \"set.\",\n      \"out.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Xaneiro\",\n      \"Febreiro\",\n      \"Marzo\",\n      \"Abril\",\n      \"Maio\",\n      \"Xu\\u00f1o\",\n      \"Xullo\",\n      \"Agosto\",\n      \"Setembro\",\n      \"Outubro\",\n      \"Novembro\",\n      \"Decembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d 'de' MMM 'de' y HH:mm:ss\",\n    \"mediumDate\": \"d 'de' MMM 'de' y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"gl\",\n  \"localeID\": \"gl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gsw-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am Vormittag\",\n      \"am Namittag\"\n    ],\n    \"DAY\": [\n      \"Sunntig\",\n      \"M\\u00e4\\u00e4ntig\",\n      \"Ziischtig\",\n      \"Mittwuch\",\n      \"Dunschtig\",\n      \"Friitig\",\n      \"Samschtig\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"SHORTDAY\": [\n      \"Su.\",\n      \"M\\u00e4.\",\n      \"Zi.\",\n      \"Mi.\",\n      \"Du.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"M\\u00e4r\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"gsw-ch\",\n  \"localeID\": \"gsw_CH\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gsw-fr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am Vormittag\",\n      \"am Namittag\"\n    ],\n    \"DAY\": [\n      \"Sunntig\",\n      \"M\\u00e4\\u00e4ntig\",\n      \"Ziischtig\",\n      \"Mittwuch\",\n      \"Dunschtig\",\n      \"Friitig\",\n      \"Samschtig\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"SHORTDAY\": [\n      \"Su.\",\n      \"M\\u00e4.\",\n      \"Zi.\",\n      \"Mi.\",\n      \"Du.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"M\\u00e4r\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"gsw-fr\",\n  \"localeID\": \"gsw_FR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gsw-li.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am Vormittag\",\n      \"am Namittag\"\n    ],\n    \"DAY\": [\n      \"Sunntig\",\n      \"M\\u00e4\\u00e4ntig\",\n      \"Ziischtig\",\n      \"Mittwuch\",\n      \"Dunschtig\",\n      \"Friitig\",\n      \"Samschtig\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"SHORTDAY\": [\n      \"Su.\",\n      \"M\\u00e4.\",\n      \"Zi.\",\n      \"Mi.\",\n      \"Du.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"M\\u00e4r\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"gsw-li\",\n  \"localeID\": \"gsw_LI\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gsw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am Vormittag\",\n      \"am Namittag\"\n    ],\n    \"DAY\": [\n      \"Sunntig\",\n      \"M\\u00e4\\u00e4ntig\",\n      \"Ziischtig\",\n      \"Mittwuch\",\n      \"Dunschtig\",\n      \"Friitig\",\n      \"Samschtig\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"SHORTDAY\": [\n      \"Su.\",\n      \"M\\u00e4.\",\n      \"Zi.\",\n      \"Mi.\",\n      \"Du.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"M\\u00e4r\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4rz\",\n      \"April\",\n      \"Mai\",\n      \"Juni\",\n      \"Juli\",\n      \"Auguscht\",\n      \"Sept\\u00e4mber\",\n      \"Oktoober\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"dd.MM.y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"gsw\",\n  \"localeID\": \"gsw\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gu-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0ab0\\u0ab5\\u0abf\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0ab8\\u0acb\\u0aae\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0aae\\u0a82\\u0a97\\u0ab3\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0aac\\u0ac1\\u0aa7\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0a97\\u0ac1\\u0ab0\\u0ac1\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0ab6\\u0ac1\\u0a95\\u0acd\\u0ab0\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0ab6\\u0aa8\\u0abf\\u0ab5\\u0abe\\u0ab0\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0a88\\u0ab8\\u0ab5\\u0ac0\\u0ab8\\u0aa8 \\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0ac7\",\n      \"\\u0a87\\u0ab8\\u0ab5\\u0ac0\\u0ab8\\u0aa8\"\n    ],\n    \"ERAS\": [\n      \"\\u0a88.\\u0ab8.\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0ac7\",\n      \"\\u0a88.\\u0ab8.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0a9c\\u0abe\\u0aa8\\u0acd\\u0aaf\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aab\\u0ac7\\u0aac\\u0acd\\u0ab0\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aae\\u0abe\\u0ab0\\u0acd\\u0a9a\",\n      \"\\u0a8f\\u0aaa\\u0acd\\u0ab0\\u0abf\\u0ab2\",\n      \"\\u0aae\\u0ac7\",\n      \"\\u0a9c\\u0ac2\\u0aa8\",\n      \"\\u0a9c\\u0ac1\\u0ab2\\u0abe\\u0a88\",\n      \"\\u0a91\\u0a97\\u0ab8\\u0acd\\u0a9f\",\n      \"\\u0ab8\\u0aaa\\u0acd\\u0a9f\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0a91\\u0a95\\u0acd\\u0a9f\\u0acb\\u0aac\\u0ab0\",\n      \"\\u0aa8\\u0ab5\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0aa1\\u0abf\\u0ab8\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0ab0\\u0ab5\\u0abf\",\n      \"\\u0ab8\\u0acb\\u0aae\",\n      \"\\u0aae\\u0a82\\u0a97\\u0ab3\",\n      \"\\u0aac\\u0ac1\\u0aa7\",\n      \"\\u0a97\\u0ac1\\u0ab0\\u0ac1\",\n      \"\\u0ab6\\u0ac1\\u0a95\\u0acd\\u0ab0\",\n      \"\\u0ab6\\u0aa8\\u0abf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0a9c\\u0abe\\u0aa8\\u0acd\\u0aaf\\u0ac1\",\n      \"\\u0aab\\u0ac7\\u0aac\\u0acd\\u0ab0\\u0ac1\",\n      \"\\u0aae\\u0abe\\u0ab0\\u0acd\\u0a9a\",\n      \"\\u0a8f\\u0aaa\\u0acd\\u0ab0\\u0abf\\u0ab2\",\n      \"\\u0aae\\u0ac7\",\n      \"\\u0a9c\\u0ac2\\u0aa8\",\n      \"\\u0a9c\\u0ac1\\u0ab2\\u0abe\\u0a88\",\n      \"\\u0a91\\u0a97\\u0ab8\\u0acd\\u0a9f\",\n      \"\\u0ab8\\u0aaa\\u0acd\\u0a9f\\u0ac7\",\n      \"\\u0a91\\u0a95\\u0acd\\u0a9f\\u0acb\",\n      \"\\u0aa8\\u0ab5\\u0ac7\",\n      \"\\u0aa1\\u0abf\\u0ab8\\u0ac7\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0a9c\\u0abe\\u0aa8\\u0acd\\u0aaf\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aab\\u0ac7\\u0aac\\u0acd\\u0ab0\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aae\\u0abe\\u0ab0\\u0acd\\u0a9a\",\n      \"\\u0a8f\\u0aaa\\u0acd\\u0ab0\\u0abf\\u0ab2\",\n      \"\\u0aae\\u0ac7\",\n      \"\\u0a9c\\u0ac2\\u0aa8\",\n      \"\\u0a9c\\u0ac1\\u0ab2\\u0abe\\u0a88\",\n      \"\\u0a91\\u0a97\\u0ab8\\u0acd\\u0a9f\",\n      \"\\u0ab8\\u0aaa\\u0acd\\u0a9f\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0a91\\u0a95\\u0acd\\u0a9f\\u0acb\\u0aac\\u0ab0\",\n      \"\\u0aa8\\u0ab5\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0aa1\\u0abf\\u0ab8\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y hh:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"hh:mm:ss a\",\n    \"short\": \"d/M/yy hh:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"hh:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"gu-in\",\n  \"localeID\": \"gu_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0ab0\\u0ab5\\u0abf\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0ab8\\u0acb\\u0aae\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0aae\\u0a82\\u0a97\\u0ab3\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0aac\\u0ac1\\u0aa7\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0a97\\u0ac1\\u0ab0\\u0ac1\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0ab6\\u0ac1\\u0a95\\u0acd\\u0ab0\\u0ab5\\u0abe\\u0ab0\",\n      \"\\u0ab6\\u0aa8\\u0abf\\u0ab5\\u0abe\\u0ab0\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0a88\\u0ab8\\u0ab5\\u0ac0\\u0ab8\\u0aa8 \\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0ac7\",\n      \"\\u0a87\\u0ab8\\u0ab5\\u0ac0\\u0ab8\\u0aa8\"\n    ],\n    \"ERAS\": [\n      \"\\u0a88.\\u0ab8.\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0ac7\",\n      \"\\u0a88.\\u0ab8.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0a9c\\u0abe\\u0aa8\\u0acd\\u0aaf\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aab\\u0ac7\\u0aac\\u0acd\\u0ab0\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aae\\u0abe\\u0ab0\\u0acd\\u0a9a\",\n      \"\\u0a8f\\u0aaa\\u0acd\\u0ab0\\u0abf\\u0ab2\",\n      \"\\u0aae\\u0ac7\",\n      \"\\u0a9c\\u0ac2\\u0aa8\",\n      \"\\u0a9c\\u0ac1\\u0ab2\\u0abe\\u0a88\",\n      \"\\u0a91\\u0a97\\u0ab8\\u0acd\\u0a9f\",\n      \"\\u0ab8\\u0aaa\\u0acd\\u0a9f\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0a91\\u0a95\\u0acd\\u0a9f\\u0acb\\u0aac\\u0ab0\",\n      \"\\u0aa8\\u0ab5\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0aa1\\u0abf\\u0ab8\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0ab0\\u0ab5\\u0abf\",\n      \"\\u0ab8\\u0acb\\u0aae\",\n      \"\\u0aae\\u0a82\\u0a97\\u0ab3\",\n      \"\\u0aac\\u0ac1\\u0aa7\",\n      \"\\u0a97\\u0ac1\\u0ab0\\u0ac1\",\n      \"\\u0ab6\\u0ac1\\u0a95\\u0acd\\u0ab0\",\n      \"\\u0ab6\\u0aa8\\u0abf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0a9c\\u0abe\\u0aa8\\u0acd\\u0aaf\\u0ac1\",\n      \"\\u0aab\\u0ac7\\u0aac\\u0acd\\u0ab0\\u0ac1\",\n      \"\\u0aae\\u0abe\\u0ab0\\u0acd\\u0a9a\",\n      \"\\u0a8f\\u0aaa\\u0acd\\u0ab0\\u0abf\\u0ab2\",\n      \"\\u0aae\\u0ac7\",\n      \"\\u0a9c\\u0ac2\\u0aa8\",\n      \"\\u0a9c\\u0ac1\\u0ab2\\u0abe\\u0a88\",\n      \"\\u0a91\\u0a97\\u0ab8\\u0acd\\u0a9f\",\n      \"\\u0ab8\\u0aaa\\u0acd\\u0a9f\\u0ac7\",\n      \"\\u0a91\\u0a95\\u0acd\\u0a9f\\u0acb\",\n      \"\\u0aa8\\u0ab5\\u0ac7\",\n      \"\\u0aa1\\u0abf\\u0ab8\\u0ac7\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0a9c\\u0abe\\u0aa8\\u0acd\\u0aaf\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aab\\u0ac7\\u0aac\\u0acd\\u0ab0\\u0ac1\\u0a86\\u0ab0\\u0ac0\",\n      \"\\u0aae\\u0abe\\u0ab0\\u0acd\\u0a9a\",\n      \"\\u0a8f\\u0aaa\\u0acd\\u0ab0\\u0abf\\u0ab2\",\n      \"\\u0aae\\u0ac7\",\n      \"\\u0a9c\\u0ac2\\u0aa8\",\n      \"\\u0a9c\\u0ac1\\u0ab2\\u0abe\\u0a88\",\n      \"\\u0a91\\u0a97\\u0ab8\\u0acd\\u0a9f\",\n      \"\\u0ab8\\u0aaa\\u0acd\\u0a9f\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0a91\\u0a95\\u0acd\\u0a9f\\u0acb\\u0aac\\u0ab0\",\n      \"\\u0aa8\\u0ab5\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\",\n      \"\\u0aa1\\u0abf\\u0ab8\\u0ac7\\u0aae\\u0acd\\u0aac\\u0ab0\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y hh:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"hh:mm:ss a\",\n    \"short\": \"d/M/yy hh:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"hh:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"gu\",\n  \"localeID\": \"gu\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_guz-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Mambia\",\n      \"Mog\"\n    ],\n    \"DAY\": [\n      \"Chumapiri\",\n      \"Chumatato\",\n      \"Chumaine\",\n      \"Chumatano\",\n      \"Aramisi\",\n      \"Ichuma\",\n      \"Esabato\"\n    ],\n    \"ERANAMES\": [\n      \"Yeso ataiborwa\",\n      \"Yeso kaiboirwe\"\n    ],\n    \"ERAS\": [\n      \"YA\",\n      \"YK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Chanuari\",\n      \"Feburari\",\n      \"Machi\",\n      \"Apiriri\",\n      \"Mei\",\n      \"Juni\",\n      \"Chulai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Okitoba\",\n      \"Nobemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Cpr\",\n      \"Ctt\",\n      \"Cmn\",\n      \"Cmt\",\n      \"Ars\",\n      \"Icm\",\n      \"Est\"\n    ],\n    \"SHORTMONTH\": [\n      \"Can\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Cul\",\n      \"Agt\",\n      \"Sep\",\n      \"Okt\",\n      \"Nob\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Chanuari\",\n      \"Feburari\",\n      \"Machi\",\n      \"Apiriri\",\n      \"Mei\",\n      \"Juni\",\n      \"Chulai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Okitoba\",\n      \"Nobemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"guz-ke\",\n  \"localeID\": \"guz_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_guz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Mambia\",\n      \"Mog\"\n    ],\n    \"DAY\": [\n      \"Chumapiri\",\n      \"Chumatato\",\n      \"Chumaine\",\n      \"Chumatano\",\n      \"Aramisi\",\n      \"Ichuma\",\n      \"Esabato\"\n    ],\n    \"ERANAMES\": [\n      \"Yeso ataiborwa\",\n      \"Yeso kaiboirwe\"\n    ],\n    \"ERAS\": [\n      \"YA\",\n      \"YK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Chanuari\",\n      \"Feburari\",\n      \"Machi\",\n      \"Apiriri\",\n      \"Mei\",\n      \"Juni\",\n      \"Chulai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Okitoba\",\n      \"Nobemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Cpr\",\n      \"Ctt\",\n      \"Cmn\",\n      \"Cmt\",\n      \"Ars\",\n      \"Icm\",\n      \"Est\"\n    ],\n    \"SHORTMONTH\": [\n      \"Can\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Cul\",\n      \"Agt\",\n      \"Sep\",\n      \"Okt\",\n      \"Nob\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Chanuari\",\n      \"Feburari\",\n      \"Machi\",\n      \"Apiriri\",\n      \"Mei\",\n      \"Juni\",\n      \"Chulai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Okitoba\",\n      \"Nobemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"guz\",\n  \"localeID\": \"guz\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gv-im.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Jedoonee\",\n      \"Jelhein\",\n      \"Jemayrt\",\n      \"Jercean\",\n      \"Jerdein\",\n      \"Jeheiney\",\n      \"Jesarn\"\n    ],\n    \"ERANAMES\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jerrey-geuree\",\n      \"Toshiaght-arree\",\n      \"Mayrnt\",\n      \"Averil\",\n      \"Boaldyn\",\n      \"Mean-souree\",\n      \"Jerrey-souree\",\n      \"Luanistyn\",\n      \"Mean-fouyir\",\n      \"Jerrey-fouyir\",\n      \"Mee Houney\",\n      \"Mee ny Nollick\"\n    ],\n    \"SHORTDAY\": [\n      \"Jed\",\n      \"Jel\",\n      \"Jem\",\n      \"Jerc\",\n      \"Jerd\",\n      \"Jeh\",\n      \"Jes\"\n    ],\n    \"SHORTMONTH\": [\n      \"J-guer\",\n      \"T-arree\",\n      \"Mayrnt\",\n      \"Avrril\",\n      \"Boaldyn\",\n      \"M-souree\",\n      \"J-souree\",\n      \"Luanistyn\",\n      \"M-fouyir\",\n      \"J-fouyir\",\n      \"M-Houney\",\n      \"M-Nollick\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jerrey-geuree\",\n      \"Toshiaght-arree\",\n      \"Mayrnt\",\n      \"Averil\",\n      \"Boaldyn\",\n      \"Mean-souree\",\n      \"Jerrey-souree\",\n      \"Luanistyn\",\n      \"Mean-fouyir\",\n      \"Jerrey-fouyir\",\n      \"Mee Houney\",\n      \"Mee ny Nollick\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"gv-im\",\n  \"localeID\": \"gv_IM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_gv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Jedoonee\",\n      \"Jelhein\",\n      \"Jemayrt\",\n      \"Jercean\",\n      \"Jerdein\",\n      \"Jeheiney\",\n      \"Jesarn\"\n    ],\n    \"ERANAMES\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jerrey-geuree\",\n      \"Toshiaght-arree\",\n      \"Mayrnt\",\n      \"Averil\",\n      \"Boaldyn\",\n      \"Mean-souree\",\n      \"Jerrey-souree\",\n      \"Luanistyn\",\n      \"Mean-fouyir\",\n      \"Jerrey-fouyir\",\n      \"Mee Houney\",\n      \"Mee ny Nollick\"\n    ],\n    \"SHORTDAY\": [\n      \"Jed\",\n      \"Jel\",\n      \"Jem\",\n      \"Jerc\",\n      \"Jerd\",\n      \"Jeh\",\n      \"Jes\"\n    ],\n    \"SHORTMONTH\": [\n      \"J-guer\",\n      \"T-arree\",\n      \"Mayrnt\",\n      \"Avrril\",\n      \"Boaldyn\",\n      \"M-souree\",\n      \"J-souree\",\n      \"Luanistyn\",\n      \"M-fouyir\",\n      \"J-fouyir\",\n      \"M-Houney\",\n      \"M-Nollick\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jerrey-geuree\",\n      \"Toshiaght-arree\",\n      \"Mayrnt\",\n      \"Averil\",\n      \"Boaldyn\",\n      \"Mean-souree\",\n      \"Jerrey-souree\",\n      \"Luanistyn\",\n      \"Mean-fouyir\",\n      \"Jerrey-fouyir\",\n      \"Mee Houney\",\n      \"Mee ny Nollick\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"gv\",\n  \"localeID\": \"gv\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ha-gh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Lahadi\",\n      \"Litinin\",\n      \"Talata\",\n      \"Laraba\",\n      \"Alhamis\",\n      \"Jumma\\u02bca\",\n      \"Asabar\"\n    ],\n    \"ERANAMES\": [\n      \"Kafin haihuwar annab\",\n      \"Bayan haihuwar annab\"\n    ],\n    \"ERAS\": [\n      \"KHAI\",\n      \"BHAI\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"SHORTDAY\": [\n      \"Lah\",\n      \"Lit\",\n      \"Tal\",\n      \"Lar\",\n      \"Alh\",\n      \"Jum\",\n      \"Asa\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fab\",\n      \"Mar\",\n      \"Afi\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"Agu\",\n      \"Sat\",\n      \"Okt\",\n      \"Nuw\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GHS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ha-gh\",\n  \"localeID\": \"ha_GH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ha-ne.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Lahadi\",\n      \"Litinin\",\n      \"Talata\",\n      \"Laraba\",\n      \"Alhamis\",\n      \"Jumma\\u02bca\",\n      \"Asabar\"\n    ],\n    \"ERANAMES\": [\n      \"Kafin haihuwar annab\",\n      \"Bayan haihuwar annab\"\n    ],\n    \"ERAS\": [\n      \"KHAI\",\n      \"BHAI\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"SHORTDAY\": [\n      \"Lah\",\n      \"Lit\",\n      \"Tal\",\n      \"Lar\",\n      \"Alh\",\n      \"Jum\",\n      \"Asa\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fab\",\n      \"Mar\",\n      \"Afi\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"Agu\",\n      \"Sat\",\n      \"Okt\",\n      \"Nuw\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ha-ne\",\n  \"localeID\": \"ha_NE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ha-ng.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Lahadi\",\n      \"Litinin\",\n      \"Talata\",\n      \"Laraba\",\n      \"Alhamis\",\n      \"Jumma\\u02bca\",\n      \"Asabar\"\n    ],\n    \"ERANAMES\": [\n      \"Kafin haihuwar annab\",\n      \"Bayan haihuwar annab\"\n    ],\n    \"ERAS\": [\n      \"KHAI\",\n      \"BHAI\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"SHORTDAY\": [\n      \"Lah\",\n      \"Lit\",\n      \"Tal\",\n      \"Lar\",\n      \"Alh\",\n      \"Jum\",\n      \"Asa\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fab\",\n      \"Mar\",\n      \"Afi\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"Agu\",\n      \"Sat\",\n      \"Okt\",\n      \"Nuw\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a6\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ha-ng\",\n  \"localeID\": \"ha_NG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ha.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Lahadi\",\n      \"Litinin\",\n      \"Talata\",\n      \"Laraba\",\n      \"Alhamis\",\n      \"Jumma\\u02bca\",\n      \"Asabar\"\n    ],\n    \"ERANAMES\": [\n      \"Kafin haihuwar annab\",\n      \"Bayan haihuwar annab\"\n    ],\n    \"ERAS\": [\n      \"KHAI\",\n      \"BHAI\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"SHORTDAY\": [\n      \"Lah\",\n      \"Lit\",\n      \"Tal\",\n      \"Lar\",\n      \"Alh\",\n      \"Jum\",\n      \"Asa\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fab\",\n      \"Mar\",\n      \"Afi\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"Agu\",\n      \"Sat\",\n      \"Okt\",\n      \"Nuw\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janairu\",\n      \"Faburairu\",\n      \"Maris\",\n      \"Afirilu\",\n      \"Mayu\",\n      \"Yuni\",\n      \"Yuli\",\n      \"Agusta\",\n      \"Satumba\",\n      \"Oktoba\",\n      \"Nuwamba\",\n      \"Disamba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a6\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ha\",\n  \"localeID\": \"ha\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_haw-us.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"L\\u0101pule\",\n      \"Po\\u02bbakahi\",\n      \"Po\\u02bbalua\",\n      \"Po\\u02bbakolu\",\n      \"Po\\u02bbah\\u0101\",\n      \"Po\\u02bbalima\",\n      \"Po\\u02bbaono\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Ianuali\",\n      \"Pepeluali\",\n      \"Malaki\",\n      \"\\u02bbApelila\",\n      \"Mei\",\n      \"Iune\",\n      \"Iulai\",\n      \"\\u02bbAukake\",\n      \"Kepakemapa\",\n      \"\\u02bbOkakopa\",\n      \"Nowemapa\",\n      \"Kekemapa\"\n    ],\n    \"SHORTDAY\": [\n      \"LP\",\n      \"P1\",\n      \"P2\",\n      \"P3\",\n      \"P4\",\n      \"P5\",\n      \"P6\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ian.\",\n      \"Pep.\",\n      \"Mal.\",\n      \"\\u02bbAp.\",\n      \"Mei\",\n      \"Iun.\",\n      \"Iul.\",\n      \"\\u02bbAu.\",\n      \"Kep.\",\n      \"\\u02bbOk.\",\n      \"Now.\",\n      \"Kek.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ianuali\",\n      \"Pepeluali\",\n      \"Malaki\",\n      \"\\u02bbApelila\",\n      \"Mei\",\n      \"Iune\",\n      \"Iulai\",\n      \"\\u02bbAukake\",\n      \"Kepakemapa\",\n      \"\\u02bbOkakopa\",\n      \"Nowemapa\",\n      \"Kekemapa\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"haw-us\",\n  \"localeID\": \"haw_US\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_haw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"L\\u0101pule\",\n      \"Po\\u02bbakahi\",\n      \"Po\\u02bbalua\",\n      \"Po\\u02bbakolu\",\n      \"Po\\u02bbah\\u0101\",\n      \"Po\\u02bbalima\",\n      \"Po\\u02bbaono\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Ianuali\",\n      \"Pepeluali\",\n      \"Malaki\",\n      \"\\u02bbApelila\",\n      \"Mei\",\n      \"Iune\",\n      \"Iulai\",\n      \"\\u02bbAukake\",\n      \"Kepakemapa\",\n      \"\\u02bbOkakopa\",\n      \"Nowemapa\",\n      \"Kekemapa\"\n    ],\n    \"SHORTDAY\": [\n      \"LP\",\n      \"P1\",\n      \"P2\",\n      \"P3\",\n      \"P4\",\n      \"P5\",\n      \"P6\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ian.\",\n      \"Pep.\",\n      \"Mal.\",\n      \"\\u02bbAp.\",\n      \"Mei\",\n      \"Iun.\",\n      \"Iul.\",\n      \"\\u02bbAu.\",\n      \"Kep.\",\n      \"\\u02bbOk.\",\n      \"Now.\",\n      \"Kek.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ianuali\",\n      \"Pepeluali\",\n      \"Malaki\",\n      \"\\u02bbApelila\",\n      \"Mei\",\n      \"Iune\",\n      \"Iulai\",\n      \"\\u02bbAukake\",\n      \"Kepakemapa\",\n      \"\\u02bbOkakopa\",\n      \"Nowemapa\",\n      \"Kekemapa\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"haw\",\n  \"localeID\": \"haw\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_he-il.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d4\\u05f4\\u05e6\",\n      \"\\u05d0\\u05d7\\u05d4\\u05f4\\u05e6\"\n    ],\n    \"DAY\": [\n      \"\\u05d9\\u05d5\\u05dd \\u05e8\\u05d0\\u05e9\\u05d5\\u05df\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05dc\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e8\\u05d1\\u05d9\\u05e2\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d7\\u05de\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05d1\\u05ea\"\n    ],\n    \"ERANAMES\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d9 \\u05d4\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\",\n      \"\\u05dc\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\"\n    ],\n    \"ERAS\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d4\\u05f4\\u05e1\",\n      \"\\u05dc\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05d0\\u05e8\",\n      \"\\u05e4\\u05d1\\u05e8\\u05d5\\u05d0\\u05e8\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e4\\u05d8\\u05de\\u05d1\\u05e8\",\n      \"\\u05d0\\u05d5\\u05e7\\u05d8\\u05d5\\u05d1\\u05e8\",\n      \"\\u05e0\\u05d5\\u05d1\\u05de\\u05d1\\u05e8\",\n      \"\\u05d3\\u05e6\\u05de\\u05d1\\u05e8\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u05d9\\u05d5\\u05dd \\u05d0\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d1\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d2\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d3\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d4\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d5\\u05f3\",\n      \"\\u05e9\\u05d1\\u05ea\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05f3\",\n      \"\\u05e4\\u05d1\\u05e8\\u05f3\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05f3\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05f3\",\n      \"\\u05e1\\u05e4\\u05d8\\u05f3\",\n      \"\\u05d0\\u05d5\\u05e7\\u05f3\",\n      \"\\u05e0\\u05d5\\u05d1\\u05f3\",\n      \"\\u05d3\\u05e6\\u05de\\u05f3\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05d0\\u05e8\",\n      \"\\u05e4\\u05d1\\u05e8\\u05d5\\u05d0\\u05e8\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e4\\u05d8\\u05de\\u05d1\\u05e8\",\n      \"\\u05d0\\u05d5\\u05e7\\u05d8\\u05d5\\u05d1\\u05e8\",\n      \"\\u05e0\\u05d5\\u05d1\\u05de\\u05d1\\u05e8\",\n      \"\\u05d3\\u05e6\\u05de\\u05d1\\u05e8\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE, d \\u05d1MMMM y\",\n    \"longDate\": \"d \\u05d1MMMM y\",\n    \"medium\": \"d \\u05d1MMM y H:mm:ss\",\n    \"mediumDate\": \"d \\u05d1MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.M.y H:mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20aa\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u200f-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\\u200f\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"he-il\",\n  \"localeID\": \"he_IL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (i == 2 && vf.v == 0) {    return PLURAL_CATEGORY.TWO;  }  if (vf.v == 0 && (n < 0 || n > 10) && n % 10 == 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_he.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d4\\u05f4\\u05e6\",\n      \"\\u05d0\\u05d7\\u05d4\\u05f4\\u05e6\"\n    ],\n    \"DAY\": [\n      \"\\u05d9\\u05d5\\u05dd \\u05e8\\u05d0\\u05e9\\u05d5\\u05df\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05dc\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e8\\u05d1\\u05d9\\u05e2\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d7\\u05de\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05d1\\u05ea\"\n    ],\n    \"ERANAMES\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d9 \\u05d4\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\",\n      \"\\u05dc\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\"\n    ],\n    \"ERAS\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d4\\u05f4\\u05e1\",\n      \"\\u05dc\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05d0\\u05e8\",\n      \"\\u05e4\\u05d1\\u05e8\\u05d5\\u05d0\\u05e8\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e4\\u05d8\\u05de\\u05d1\\u05e8\",\n      \"\\u05d0\\u05d5\\u05e7\\u05d8\\u05d5\\u05d1\\u05e8\",\n      \"\\u05e0\\u05d5\\u05d1\\u05de\\u05d1\\u05e8\",\n      \"\\u05d3\\u05e6\\u05de\\u05d1\\u05e8\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u05d9\\u05d5\\u05dd \\u05d0\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d1\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d2\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d3\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d4\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d5\\u05f3\",\n      \"\\u05e9\\u05d1\\u05ea\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05f3\",\n      \"\\u05e4\\u05d1\\u05e8\\u05f3\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05f3\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05f3\",\n      \"\\u05e1\\u05e4\\u05d8\\u05f3\",\n      \"\\u05d0\\u05d5\\u05e7\\u05f3\",\n      \"\\u05e0\\u05d5\\u05d1\\u05f3\",\n      \"\\u05d3\\u05e6\\u05de\\u05f3\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05d0\\u05e8\",\n      \"\\u05e4\\u05d1\\u05e8\\u05d5\\u05d0\\u05e8\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e4\\u05d8\\u05de\\u05d1\\u05e8\",\n      \"\\u05d0\\u05d5\\u05e7\\u05d8\\u05d5\\u05d1\\u05e8\",\n      \"\\u05e0\\u05d5\\u05d1\\u05de\\u05d1\\u05e8\",\n      \"\\u05d3\\u05e6\\u05de\\u05d1\\u05e8\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE, d \\u05d1MMMM y\",\n    \"longDate\": \"d \\u05d1MMMM y\",\n    \"medium\": \"d \\u05d1MMM y H:mm:ss\",\n    \"mediumDate\": \"d \\u05d1MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.M.y H:mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20aa\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u200f-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\\u200f\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"he\",\n  \"localeID\": \"he\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (i == 2 && vf.v == 0) {    return PLURAL_CATEGORY.TWO;  }  if (vf.v == 0 && (n < 0 || n > 10) && n % 10 == 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hi-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"\\u0930\\u0935\\u093f\\u0935\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u0935\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0932\\u0935\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u0935\\u093e\\u0930\",\n      \"\\u0917\\u0941\\u0930\\u0941\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u0935\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u093e-\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0908\\u0938\\u0935\\u0940 \\u0938\\u0928\"\n    ],\n    \"ERAS\": [\n      \"\\u0908\\u0938\\u093e-\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0908\\u0938\\u094d\\u0935\\u0940\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u093c\\u0930\\u0935\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u0948\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u0924\",\n      \"\\u0938\\u093f\\u0924\\u0902\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u0924\\u0942\\u092c\\u0930\",\n      \"\\u0928\\u0935\\u0902\\u092c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0902\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u0935\\u093f\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0932\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u0917\\u0941\\u0930\\u0941\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u0928\\u0970\",\n      \"\\u092b\\u093c\\u0930\\u0970\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u0948\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0970\",\n      \"\\u0905\\u0917\\u0970\",\n      \"\\u0938\\u093f\\u0924\\u0970\",\n      \"\\u0905\\u0915\\u094d\\u0924\\u0942\\u0970\",\n      \"\\u0928\\u0935\\u0970\",\n      \"\\u0926\\u093f\\u0938\\u0970\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u093c\\u0930\\u0935\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u0948\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u0924\",\n      \"\\u0938\\u093f\\u0924\\u0902\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u0924\\u0942\\u092c\\u0930\",\n      \"\\u0928\\u0935\\u0902\\u092c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0902\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd/MM/y h:mm:ss a\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"hi-in\",\n  \"localeID\": \"hi_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"\\u0930\\u0935\\u093f\\u0935\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u0935\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0932\\u0935\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u0935\\u093e\\u0930\",\n      \"\\u0917\\u0941\\u0930\\u0941\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u0935\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u093e-\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0908\\u0938\\u0935\\u0940 \\u0938\\u0928\"\n    ],\n    \"ERAS\": [\n      \"\\u0908\\u0938\\u093e-\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0908\\u0938\\u094d\\u0935\\u0940\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u093c\\u0930\\u0935\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u0948\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u0924\",\n      \"\\u0938\\u093f\\u0924\\u0902\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u0924\\u0942\\u092c\\u0930\",\n      \"\\u0928\\u0935\\u0902\\u092c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0902\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u0935\\u093f\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0932\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u0917\\u0941\\u0930\\u0941\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u0928\\u0970\",\n      \"\\u092b\\u093c\\u0930\\u0970\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u0948\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0970\",\n      \"\\u0905\\u0917\\u0970\",\n      \"\\u0938\\u093f\\u0924\\u0970\",\n      \"\\u0905\\u0915\\u094d\\u0924\\u0942\\u0970\",\n      \"\\u0928\\u0935\\u0970\",\n      \"\\u0926\\u093f\\u0938\\u0970\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u093c\\u0930\\u0935\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u0948\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u0924\",\n      \"\\u0938\\u093f\\u0924\\u0902\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u0924\\u0942\\u092c\\u0930\",\n      \"\\u0928\\u0935\\u0902\\u092c\\u0930\",\n      \"\\u0926\\u093f\\u0938\\u0902\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd/MM/y h:mm:ss a\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"hi\",\n  \"localeID\": \"hi\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hr-ba.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedjeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije Krista\",\n      \"poslije Krista\"\n    ],\n    \"ERAS\": [\n      \"pr. Kr.\",\n      \"po. Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"sije\\u010dnja\",\n      \"velja\\u010de\",\n      \"o\\u017eujka\",\n      \"travnja\",\n      \"svibnja\",\n      \"lipnja\",\n      \"srpnja\",\n      \"kolovoza\",\n      \"rujna\",\n      \"listopada\",\n      \"studenoga\",\n      \"prosinca\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sri\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"sij\",\n      \"velj\",\n      \"o\\u017eu\",\n      \"tra\",\n      \"svi\",\n      \"lip\",\n      \"srp\",\n      \"kol\",\n      \"ruj\",\n      \"lis\",\n      \"stu\",\n      \"pro\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"sije\\u010danj\",\n      \"velja\\u010da\",\n      \"o\\u017eujak\",\n      \"travanj\",\n      \"svibanj\",\n      \"lipanj\",\n      \"srpanj\",\n      \"kolovoz\",\n      \"rujan\",\n      \"listopad\",\n      \"studeni\",\n      \"prosinac\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y.\",\n    \"longDate\": \"d. MMMM y.\",\n    \"medium\": \"d. MMM y. HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d. M. yy. HH:mm\",\n    \"shortDate\": \"d. M. yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"hr-ba\",\n  \"localeID\": \"hr_BA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hr-hr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedjeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije Krista\",\n      \"poslije Krista\"\n    ],\n    \"ERAS\": [\n      \"pr. Kr.\",\n      \"po. Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"sije\\u010dnja\",\n      \"velja\\u010de\",\n      \"o\\u017eujka\",\n      \"travnja\",\n      \"svibnja\",\n      \"lipnja\",\n      \"srpnja\",\n      \"kolovoza\",\n      \"rujna\",\n      \"listopada\",\n      \"studenoga\",\n      \"prosinca\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sri\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"sij\",\n      \"velj\",\n      \"o\\u017eu\",\n      \"tra\",\n      \"svi\",\n      \"lip\",\n      \"srp\",\n      \"kol\",\n      \"ruj\",\n      \"lis\",\n      \"stu\",\n      \"pro\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"sije\\u010danj\",\n      \"velja\\u010da\",\n      \"o\\u017eujak\",\n      \"travanj\",\n      \"svibanj\",\n      \"lipanj\",\n      \"srpanj\",\n      \"kolovoz\",\n      \"rujan\",\n      \"listopad\",\n      \"studeni\",\n      \"prosinac\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y.\",\n    \"longDate\": \"d. MMMM y.\",\n    \"medium\": \"d. MMM y. HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd. MM. y. HH:mm\",\n    \"shortDate\": \"dd. MM. y.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kn\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"hr-hr\",\n  \"localeID\": \"hr_HR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedjeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije Krista\",\n      \"poslije Krista\"\n    ],\n    \"ERAS\": [\n      \"pr. Kr.\",\n      \"po. Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"sije\\u010dnja\",\n      \"velja\\u010de\",\n      \"o\\u017eujka\",\n      \"travnja\",\n      \"svibnja\",\n      \"lipnja\",\n      \"srpnja\",\n      \"kolovoza\",\n      \"rujna\",\n      \"listopada\",\n      \"studenoga\",\n      \"prosinca\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sri\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"sij\",\n      \"velj\",\n      \"o\\u017eu\",\n      \"tra\",\n      \"svi\",\n      \"lip\",\n      \"srp\",\n      \"kol\",\n      \"ruj\",\n      \"lis\",\n      \"stu\",\n      \"pro\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"sije\\u010danj\",\n      \"velja\\u010da\",\n      \"o\\u017eujak\",\n      \"travanj\",\n      \"svibanj\",\n      \"lipanj\",\n      \"srpanj\",\n      \"kolovoz\",\n      \"rujan\",\n      \"listopad\",\n      \"studeni\",\n      \"prosinac\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y.\",\n    \"longDate\": \"d. MMMM y.\",\n    \"medium\": \"d. MMM y. HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd. MM. y. HH:mm\",\n    \"shortDate\": \"dd. MM. y.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kn\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"hr\",\n  \"localeID\": \"hr\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hsb-de.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dopo\\u0142dnja\",\n      \"popo\\u0142dnju\"\n    ],\n    \"DAY\": [\n      \"njed\\u017aela\",\n      \"p\\u00f3nd\\u017aela\",\n      \"wutora\",\n      \"srjeda\",\n      \"\\u0161tw\\u00f3rtk\",\n      \"pjatk\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"p\\u0159ed Chrystowym narod\\u017aenjom\",\n      \"po Chrystowym narod\\u017aenju\"\n    ],\n    \"ERAS\": [\n      \"p\\u0159.Chr.n.\",\n      \"po Chr.n.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januara\",\n      \"februara\",\n      \"m\\u011brca\",\n      \"apryla\",\n      \"meje\",\n      \"junija\",\n      \"julija\",\n      \"awgusta\",\n      \"septembra\",\n      \"oktobra\",\n      \"nowembra\",\n      \"decembra\"\n    ],\n    \"SHORTDAY\": [\n      \"nje\",\n      \"p\\u00f3n\",\n      \"wut\",\n      \"srj\",\n      \"\\u0161tw\",\n      \"pja\",\n      \"sob\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"m\\u011br.\",\n      \"apr.\",\n      \"mej.\",\n      \"jun.\",\n      \"jul.\",\n      \"awg.\",\n      \"sep.\",\n      \"okt.\",\n      \"now.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"m\\u011brc\",\n      \"apryl\",\n      \"meja\",\n      \"junij\",\n      \"julij\",\n      \"awgust\",\n      \"september\",\n      \"oktober\",\n      \"nowember\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d.M.y H:mm:ss\",\n    \"mediumDate\": \"d.M.y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.M.yy H:mm 'hod\\u017a'.\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"H:mm 'hod\\u017a'.\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"hsb-de\",\n  \"localeID\": \"hsb_DE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hsb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dopo\\u0142dnja\",\n      \"popo\\u0142dnju\"\n    ],\n    \"DAY\": [\n      \"njed\\u017aela\",\n      \"p\\u00f3nd\\u017aela\",\n      \"wutora\",\n      \"srjeda\",\n      \"\\u0161tw\\u00f3rtk\",\n      \"pjatk\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"p\\u0159ed Chrystowym narod\\u017aenjom\",\n      \"po Chrystowym narod\\u017aenju\"\n    ],\n    \"ERAS\": [\n      \"p\\u0159.Chr.n.\",\n      \"po Chr.n.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januara\",\n      \"februara\",\n      \"m\\u011brca\",\n      \"apryla\",\n      \"meje\",\n      \"junija\",\n      \"julija\",\n      \"awgusta\",\n      \"septembra\",\n      \"oktobra\",\n      \"nowembra\",\n      \"decembra\"\n    ],\n    \"SHORTDAY\": [\n      \"nje\",\n      \"p\\u00f3n\",\n      \"wut\",\n      \"srj\",\n      \"\\u0161tw\",\n      \"pja\",\n      \"sob\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"m\\u011br.\",\n      \"apr.\",\n      \"mej.\",\n      \"jun.\",\n      \"jul.\",\n      \"awg.\",\n      \"sep.\",\n      \"okt.\",\n      \"now.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"m\\u011brc\",\n      \"apryl\",\n      \"meja\",\n      \"junij\",\n      \"julij\",\n      \"awgust\",\n      \"september\",\n      \"oktober\",\n      \"nowember\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d.M.y H:mm:ss\",\n    \"mediumDate\": \"d.M.y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.M.yy H:mm 'hod\\u017a'.\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"H:mm 'hod\\u017a'.\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"hsb\",\n  \"localeID\": \"hsb\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hu-hu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"de.\",\n      \"du.\"\n    ],\n    \"DAY\": [\n      \"vas\\u00e1rnap\",\n      \"h\\u00e9tf\\u0151\",\n      \"kedd\",\n      \"szerda\",\n      \"cs\\u00fct\\u00f6rt\\u00f6k\",\n      \"p\\u00e9ntek\",\n      \"szombat\"\n    ],\n    \"ERANAMES\": [\n      \"id\\u0151sz\\u00e1m\\u00edt\\u00e1sunk el\\u0151tt\",\n      \"id\\u0151sz\\u00e1m\\u00edt\\u00e1sunk szerint\"\n    ],\n    \"ERAS\": [\n      \"i. e.\",\n      \"i. sz.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janu\\u00e1r\",\n      \"febru\\u00e1r\",\n      \"m\\u00e1rcius\",\n      \"\\u00e1prilis\",\n      \"m\\u00e1jus\",\n      \"j\\u00fanius\",\n      \"j\\u00falius\",\n      \"augusztus\",\n      \"szeptember\",\n      \"okt\\u00f3ber\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"V\",\n      \"H\",\n      \"K\",\n      \"Sze\",\n      \"Cs\",\n      \"P\",\n      \"Szo\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"febr.\",\n      \"m\\u00e1rc.\",\n      \"\\u00e1pr.\",\n      \"m\\u00e1j.\",\n      \"j\\u00fan.\",\n      \"j\\u00fal.\",\n      \"aug.\",\n      \"szept.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janu\\u00e1r\",\n      \"febru\\u00e1r\",\n      \"m\\u00e1rcius\",\n      \"\\u00e1prilis\",\n      \"m\\u00e1jus\",\n      \"j\\u00fanius\",\n      \"j\\u00falius\",\n      \"augusztus\",\n      \"szeptember\",\n      \"okt\\u00f3ber\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y. MMMM d., EEEE\",\n    \"longDate\": \"y. MMMM d.\",\n    \"medium\": \"y. MMM d. H:mm:ss\",\n    \"mediumDate\": \"y. MMM d.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y. MM. dd. H:mm\",\n    \"shortDate\": \"y. MM. dd.\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ft\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"hu-hu\",\n  \"localeID\": \"hu_HU\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"de.\",\n      \"du.\"\n    ],\n    \"DAY\": [\n      \"vas\\u00e1rnap\",\n      \"h\\u00e9tf\\u0151\",\n      \"kedd\",\n      \"szerda\",\n      \"cs\\u00fct\\u00f6rt\\u00f6k\",\n      \"p\\u00e9ntek\",\n      \"szombat\"\n    ],\n    \"ERANAMES\": [\n      \"id\\u0151sz\\u00e1m\\u00edt\\u00e1sunk el\\u0151tt\",\n      \"id\\u0151sz\\u00e1m\\u00edt\\u00e1sunk szerint\"\n    ],\n    \"ERAS\": [\n      \"i. e.\",\n      \"i. sz.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janu\\u00e1r\",\n      \"febru\\u00e1r\",\n      \"m\\u00e1rcius\",\n      \"\\u00e1prilis\",\n      \"m\\u00e1jus\",\n      \"j\\u00fanius\",\n      \"j\\u00falius\",\n      \"augusztus\",\n      \"szeptember\",\n      \"okt\\u00f3ber\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"V\",\n      \"H\",\n      \"K\",\n      \"Sze\",\n      \"Cs\",\n      \"P\",\n      \"Szo\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"febr.\",\n      \"m\\u00e1rc.\",\n      \"\\u00e1pr.\",\n      \"m\\u00e1j.\",\n      \"j\\u00fan.\",\n      \"j\\u00fal.\",\n      \"aug.\",\n      \"szept.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janu\\u00e1r\",\n      \"febru\\u00e1r\",\n      \"m\\u00e1rcius\",\n      \"\\u00e1prilis\",\n      \"m\\u00e1jus\",\n      \"j\\u00fanius\",\n      \"j\\u00falius\",\n      \"augusztus\",\n      \"szeptember\",\n      \"okt\\u00f3ber\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y. MMMM d., EEEE\",\n    \"longDate\": \"y. MMMM d.\",\n    \"medium\": \"y. MMM d. H:mm:ss\",\n    \"mediumDate\": \"y. MMM d.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y. MM. dd. H:mm\",\n    \"shortDate\": \"y. MM. dd.\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ft\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"hu\",\n  \"localeID\": \"hu\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hy-am.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u056f\\u056b\\u0580\\u0561\\u056f\\u056b\",\n      \"\\u0565\\u0580\\u056f\\u0578\\u0582\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0565\\u0580\\u0565\\u0584\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0579\\u0578\\u0580\\u0565\\u0584\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0570\\u056b\\u0576\\u0563\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0578\\u0582\\u0580\\u0562\\u0561\\u0569\",\n      \"\\u0577\\u0561\\u0562\\u0561\\u0569\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0554\\u0580\\u056b\\u057d\\u057f\\u0578\\u057d\\u056b\\u0581 \\u0561\\u057c\\u0561\\u057b\",\n      \"\\u0554\\u0580\\u056b\\u057d\\u057f\\u0578\\u057d\\u056b\\u0581 \\u0570\\u0565\\u057f\\u0578\"\n    ],\n    \"ERAS\": [\n      \"\\u0574.\\u0569.\\u0561.\",\n      \"\\u0574.\\u0569.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0570\\u0578\\u0582\\u0576\\u057e\\u0561\\u0580\\u056b\",\n      \"\\u0583\\u0565\\u057f\\u0580\\u057e\\u0561\\u0580\\u056b\",\n      \"\\u0574\\u0561\\u0580\\u057f\\u056b\",\n      \"\\u0561\\u057a\\u0580\\u056b\\u056c\\u056b\",\n      \"\\u0574\\u0561\\u0575\\u056b\\u057d\\u056b\",\n      \"\\u0570\\u0578\\u0582\\u0576\\u056b\\u057d\\u056b\",\n      \"\\u0570\\u0578\\u0582\\u056c\\u056b\\u057d\\u056b\",\n      \"\\u0585\\u0563\\u0578\\u057d\\u057f\\u0578\\u057d\\u056b\",\n      \"\\u057d\\u0565\\u057a\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\",\n      \"\\u0570\\u0578\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\",\n      \"\\u0576\\u0578\\u0575\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\",\n      \"\\u0564\\u0565\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u056f\\u056b\\u0580\",\n      \"\\u0565\\u0580\\u056f\",\n      \"\\u0565\\u0580\\u0584\",\n      \"\\u0579\\u0580\\u0584\",\n      \"\\u0570\\u0576\\u0563\",\n      \"\\u0578\\u0582\\u0580\",\n      \"\\u0577\\u0562\\u0569\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0570\\u0576\\u057e\",\n      \"\\u0583\\u057f\\u057e\",\n      \"\\u0574\\u0580\\u057f\",\n      \"\\u0561\\u057a\\u0580\",\n      \"\\u0574\\u0575\\u057d\",\n      \"\\u0570\\u0576\\u057d\",\n      \"\\u0570\\u056c\\u057d\",\n      \"\\u0585\\u0563\\u057d\",\n      \"\\u057d\\u0565\\u057a\",\n      \"\\u0570\\u0578\\u056f\",\n      \"\\u0576\\u0578\\u0575\",\n      \"\\u0564\\u0565\\u056f\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0570\\u0578\\u0582\\u0576\\u057e\\u0561\\u0580\",\n      \"\\u0583\\u0565\\u057f\\u0580\\u057e\\u0561\\u0580\",\n      \"\\u0574\\u0561\\u0580\\u057f\",\n      \"\\u0561\\u057a\\u0580\\u056b\\u056c\",\n      \"\\u0574\\u0561\\u0575\\u056b\\u057d\",\n      \"\\u0570\\u0578\\u0582\\u0576\\u056b\\u057d\",\n      \"\\u0570\\u0578\\u0582\\u056c\\u056b\\u057d\",\n      \"\\u0585\\u0563\\u0578\\u057d\\u057f\\u0578\\u057d\",\n      \"\\u057d\\u0565\\u057a\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\",\n      \"\\u0570\\u0578\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\",\n      \"\\u0576\\u0578\\u0575\\u0565\\u0574\\u0562\\u0565\\u0580\",\n      \"\\u0564\\u0565\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y \\u0569. MMMM d, EEEE\",\n    \"longDate\": \"dd MMMM, y \\u0569.\",\n    \"medium\": \"dd MMM, y \\u0569. HH:mm:ss\",\n    \"mediumDate\": \"dd MMM, y \\u0569.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Dram\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"hy-am\",\n  \"localeID\": \"hy_AM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_hy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u056f\\u056b\\u0580\\u0561\\u056f\\u056b\",\n      \"\\u0565\\u0580\\u056f\\u0578\\u0582\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0565\\u0580\\u0565\\u0584\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0579\\u0578\\u0580\\u0565\\u0584\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0570\\u056b\\u0576\\u0563\\u0577\\u0561\\u0562\\u0569\\u056b\",\n      \"\\u0578\\u0582\\u0580\\u0562\\u0561\\u0569\",\n      \"\\u0577\\u0561\\u0562\\u0561\\u0569\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0554\\u0580\\u056b\\u057d\\u057f\\u0578\\u057d\\u056b\\u0581 \\u0561\\u057c\\u0561\\u057b\",\n      \"\\u0554\\u0580\\u056b\\u057d\\u057f\\u0578\\u057d\\u056b\\u0581 \\u0570\\u0565\\u057f\\u0578\"\n    ],\n    \"ERAS\": [\n      \"\\u0574.\\u0569.\\u0561.\",\n      \"\\u0574.\\u0569.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0570\\u0578\\u0582\\u0576\\u057e\\u0561\\u0580\\u056b\",\n      \"\\u0583\\u0565\\u057f\\u0580\\u057e\\u0561\\u0580\\u056b\",\n      \"\\u0574\\u0561\\u0580\\u057f\\u056b\",\n      \"\\u0561\\u057a\\u0580\\u056b\\u056c\\u056b\",\n      \"\\u0574\\u0561\\u0575\\u056b\\u057d\\u056b\",\n      \"\\u0570\\u0578\\u0582\\u0576\\u056b\\u057d\\u056b\",\n      \"\\u0570\\u0578\\u0582\\u056c\\u056b\\u057d\\u056b\",\n      \"\\u0585\\u0563\\u0578\\u057d\\u057f\\u0578\\u057d\\u056b\",\n      \"\\u057d\\u0565\\u057a\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\",\n      \"\\u0570\\u0578\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\",\n      \"\\u0576\\u0578\\u0575\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\",\n      \"\\u0564\\u0565\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\\u056b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u056f\\u056b\\u0580\",\n      \"\\u0565\\u0580\\u056f\",\n      \"\\u0565\\u0580\\u0584\",\n      \"\\u0579\\u0580\\u0584\",\n      \"\\u0570\\u0576\\u0563\",\n      \"\\u0578\\u0582\\u0580\",\n      \"\\u0577\\u0562\\u0569\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0570\\u0576\\u057e\",\n      \"\\u0583\\u057f\\u057e\",\n      \"\\u0574\\u0580\\u057f\",\n      \"\\u0561\\u057a\\u0580\",\n      \"\\u0574\\u0575\\u057d\",\n      \"\\u0570\\u0576\\u057d\",\n      \"\\u0570\\u056c\\u057d\",\n      \"\\u0585\\u0563\\u057d\",\n      \"\\u057d\\u0565\\u057a\",\n      \"\\u0570\\u0578\\u056f\",\n      \"\\u0576\\u0578\\u0575\",\n      \"\\u0564\\u0565\\u056f\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0570\\u0578\\u0582\\u0576\\u057e\\u0561\\u0580\",\n      \"\\u0583\\u0565\\u057f\\u0580\\u057e\\u0561\\u0580\",\n      \"\\u0574\\u0561\\u0580\\u057f\",\n      \"\\u0561\\u057a\\u0580\\u056b\\u056c\",\n      \"\\u0574\\u0561\\u0575\\u056b\\u057d\",\n      \"\\u0570\\u0578\\u0582\\u0576\\u056b\\u057d\",\n      \"\\u0570\\u0578\\u0582\\u056c\\u056b\\u057d\",\n      \"\\u0585\\u0563\\u0578\\u057d\\u057f\\u0578\\u057d\",\n      \"\\u057d\\u0565\\u057a\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\",\n      \"\\u0570\\u0578\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\",\n      \"\\u0576\\u0578\\u0575\\u0565\\u0574\\u0562\\u0565\\u0580\",\n      \"\\u0564\\u0565\\u056f\\u057f\\u0565\\u0574\\u0562\\u0565\\u0580\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y \\u0569. MMMM d, EEEE\",\n    \"longDate\": \"dd MMMM, y \\u0569.\",\n    \"medium\": \"dd MMM, y \\u0569. HH:mm:ss\",\n    \"mediumDate\": \"dd MMM, y \\u0569.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Dram\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"hy\",\n  \"localeID\": \"hy\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || i == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_id-id.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Minggu\",\n      \"Senin\",\n      \"Selasa\",\n      \"Rabu\",\n      \"Kamis\",\n      \"Jumat\",\n      \"Sabtu\"\n    ],\n    \"ERANAMES\": [\n      \"Sebelum Masehi\",\n      \"Masehi\"\n    ],\n    \"ERAS\": [\n      \"SM\",\n      \"M\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Maret\",\n      \"April\",\n      \"Mei\",\n      \"Juni\",\n      \"Juli\",\n      \"Agustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"SHORTDAY\": [\n      \"Min\",\n      \"Sen\",\n      \"Sel\",\n      \"Rab\",\n      \"Kam\",\n      \"Jum\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Agt\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Maret\",\n      \"April\",\n      \"Mei\",\n      \"Juni\",\n      \"Juli\",\n      \"Agustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH.mm.ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"dd/MM/yy HH.mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rp\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"id-id\",\n  \"localeID\": \"id_ID\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_id.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Minggu\",\n      \"Senin\",\n      \"Selasa\",\n      \"Rabu\",\n      \"Kamis\",\n      \"Jumat\",\n      \"Sabtu\"\n    ],\n    \"ERANAMES\": [\n      \"Sebelum Masehi\",\n      \"Masehi\"\n    ],\n    \"ERAS\": [\n      \"SM\",\n      \"M\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Maret\",\n      \"April\",\n      \"Mei\",\n      \"Juni\",\n      \"Juli\",\n      \"Agustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"SHORTDAY\": [\n      \"Min\",\n      \"Sen\",\n      \"Sel\",\n      \"Rab\",\n      \"Kam\",\n      \"Jum\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Agt\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Maret\",\n      \"April\",\n      \"Mei\",\n      \"Juni\",\n      \"Juli\",\n      \"Agustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH.mm.ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"dd/MM/yy HH.mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rp\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"id\",\n  \"localeID\": \"id\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ig-ng.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"A.M.\",\n      \"P.M.\"\n    ],\n    \"DAY\": [\n      \"Mb\\u1ecds\\u1ecb \\u1ee4ka\",\n      \"M\\u1ecdnde\",\n      \"Tiuzdee\",\n      \"Wenezdee\",\n      \"T\\u1ecd\\u1ecdzdee\",\n      \"Fra\\u1ecbdee\",\n      \"Sat\\u1ecddee\"\n    ],\n    \"ERANAMES\": [\n      \"Tupu Kristi\",\n      \"Af\\u1ecd Kristi\"\n    ],\n    \"ERAS\": [\n      \"T.K.\",\n      \"A.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jen\\u1ee5war\\u1ecb\",\n      \"Febr\\u1ee5war\\u1ecb\",\n      \"Maach\\u1ecb\",\n      \"Eprel\",\n      \"Mee\",\n      \"Juun\",\n      \"Jula\\u1ecb\",\n      \"\\u1eccg\\u1ecd\\u1ecdst\",\n      \"Septemba\",\n      \"\\u1eccktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u1ee4ka\",\n      \"M\\u1ecdn\",\n      \"Tiu\",\n      \"Wen\",\n      \"T\\u1ecd\\u1ecd\",\n      \"Fra\\u1ecb\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jen\",\n      \"Feb\",\n      \"Maa\",\n      \"Epr\",\n      \"Mee\",\n      \"Juu\",\n      \"Jul\",\n      \"\\u1eccg\\u1ecd\",\n      \"Sep\",\n      \"\\u1ecckt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jen\\u1ee5war\\u1ecb\",\n      \"Febr\\u1ee5war\\u1ecb\",\n      \"Maach\\u1ecb\",\n      \"Eprel\",\n      \"Mee\",\n      \"Juun\",\n      \"Jula\\u1ecb\",\n      \"\\u1eccg\\u1ecd\\u1ecdst\",\n      \"Septemba\",\n      \"\\u1eccktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a6\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ig-ng\",\n  \"localeID\": \"ig_NG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ig.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"A.M.\",\n      \"P.M.\"\n    ],\n    \"DAY\": [\n      \"Mb\\u1ecds\\u1ecb \\u1ee4ka\",\n      \"M\\u1ecdnde\",\n      \"Tiuzdee\",\n      \"Wenezdee\",\n      \"T\\u1ecd\\u1ecdzdee\",\n      \"Fra\\u1ecbdee\",\n      \"Sat\\u1ecddee\"\n    ],\n    \"ERANAMES\": [\n      \"Tupu Kristi\",\n      \"Af\\u1ecd Kristi\"\n    ],\n    \"ERAS\": [\n      \"T.K.\",\n      \"A.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jen\\u1ee5war\\u1ecb\",\n      \"Febr\\u1ee5war\\u1ecb\",\n      \"Maach\\u1ecb\",\n      \"Eprel\",\n      \"Mee\",\n      \"Juun\",\n      \"Jula\\u1ecb\",\n      \"\\u1eccg\\u1ecd\\u1ecdst\",\n      \"Septemba\",\n      \"\\u1eccktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u1ee4ka\",\n      \"M\\u1ecdn\",\n      \"Tiu\",\n      \"Wen\",\n      \"T\\u1ecd\\u1ecd\",\n      \"Fra\\u1ecb\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jen\",\n      \"Feb\",\n      \"Maa\",\n      \"Epr\",\n      \"Mee\",\n      \"Juu\",\n      \"Jul\",\n      \"\\u1eccg\\u1ecd\",\n      \"Sep\",\n      \"\\u1ecckt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jen\\u1ee5war\\u1ecb\",\n      \"Febr\\u1ee5war\\u1ecb\",\n      \"Maach\\u1ecb\",\n      \"Eprel\",\n      \"Mee\",\n      \"Juun\",\n      \"Jula\\u1ecb\",\n      \"\\u1eccg\\u1ecd\\u1ecdst\",\n      \"Septemba\",\n      \"\\u1eccktoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a6\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ig\",\n  \"localeID\": \"ig\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ii-cn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\ua3b8\\ua111\",\n      \"\\ua06f\\ua2d2\"\n    ],\n    \"DAY\": [\n      \"\\ua46d\\ua18f\\ua44d\",\n      \"\\ua18f\\ua282\\ua2cd\",\n      \"\\ua18f\\ua282\\ua44d\",\n      \"\\ua18f\\ua282\\ua315\",\n      \"\\ua18f\\ua282\\ua1d6\",\n      \"\\ua18f\\ua282\\ua26c\",\n      \"\\ua18f\\ua282\\ua0d8\"\n    ],\n    \"ERANAMES\": [\n      \"\\ua0c5\\ua2ca\\ua0bf\",\n      \"\\ua0c5\\ua2ca\\ua282\"\n    ],\n    \"ERAS\": [\n      \"\\ua0c5\\ua2ca\\ua0bf\",\n      \"\\ua0c5\\ua2ca\\ua282\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\ua2cd\\ua1aa\",\n      \"\\ua44d\\ua1aa\",\n      \"\\ua315\\ua1aa\",\n      \"\\ua1d6\\ua1aa\",\n      \"\\ua26c\\ua1aa\",\n      \"\\ua0d8\\ua1aa\",\n      \"\\ua3c3\\ua1aa\",\n      \"\\ua246\\ua1aa\",\n      \"\\ua22c\\ua1aa\",\n      \"\\ua2b0\\ua1aa\",\n      \"\\ua2b0\\ua2aa\\ua1aa\",\n      \"\\ua2b0\\ua44b\\ua1aa\"\n    ],\n    \"SHORTDAY\": [\n      \"\\ua46d\\ua18f\",\n      \"\\ua18f\\ua2cd\",\n      \"\\ua18f\\ua44d\",\n      \"\\ua18f\\ua315\",\n      \"\\ua18f\\ua1d6\",\n      \"\\ua18f\\ua26c\",\n      \"\\ua18f\\ua0d8\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\ua2cd\\ua1aa\",\n      \"\\ua44d\\ua1aa\",\n      \"\\ua315\\ua1aa\",\n      \"\\ua1d6\\ua1aa\",\n      \"\\ua26c\\ua1aa\",\n      \"\\ua0d8\\ua1aa\",\n      \"\\ua3c3\\ua1aa\",\n      \"\\ua246\\ua1aa\",\n      \"\\ua22c\\ua1aa\",\n      \"\\ua2b0\\ua1aa\",\n      \"\\ua2b0\\ua2aa\\ua1aa\",\n      \"\\ua2b0\\ua44b\\ua1aa\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\ua2cd\\ua1aa\",\n      \"\\ua44d\\ua1aa\",\n      \"\\ua315\\ua1aa\",\n      \"\\ua1d6\\ua1aa\",\n      \"\\ua26c\\ua1aa\",\n      \"\\ua0d8\\ua1aa\",\n      \"\\ua3c3\\ua1aa\",\n      \"\\ua246\\ua1aa\",\n      \"\\ua22c\\ua1aa\",\n      \"\\ua2b0\\ua1aa\",\n      \"\\ua2b0\\ua2aa\\ua1aa\",\n      \"\\ua2b0\\ua44b\\ua1aa\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ii-cn\",\n  \"localeID\": \"ii_CN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ii.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\ua3b8\\ua111\",\n      \"\\ua06f\\ua2d2\"\n    ],\n    \"DAY\": [\n      \"\\ua46d\\ua18f\\ua44d\",\n      \"\\ua18f\\ua282\\ua2cd\",\n      \"\\ua18f\\ua282\\ua44d\",\n      \"\\ua18f\\ua282\\ua315\",\n      \"\\ua18f\\ua282\\ua1d6\",\n      \"\\ua18f\\ua282\\ua26c\",\n      \"\\ua18f\\ua282\\ua0d8\"\n    ],\n    \"ERANAMES\": [\n      \"\\ua0c5\\ua2ca\\ua0bf\",\n      \"\\ua0c5\\ua2ca\\ua282\"\n    ],\n    \"ERAS\": [\n      \"\\ua0c5\\ua2ca\\ua0bf\",\n      \"\\ua0c5\\ua2ca\\ua282\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\ua2cd\\ua1aa\",\n      \"\\ua44d\\ua1aa\",\n      \"\\ua315\\ua1aa\",\n      \"\\ua1d6\\ua1aa\",\n      \"\\ua26c\\ua1aa\",\n      \"\\ua0d8\\ua1aa\",\n      \"\\ua3c3\\ua1aa\",\n      \"\\ua246\\ua1aa\",\n      \"\\ua22c\\ua1aa\",\n      \"\\ua2b0\\ua1aa\",\n      \"\\ua2b0\\ua2aa\\ua1aa\",\n      \"\\ua2b0\\ua44b\\ua1aa\"\n    ],\n    \"SHORTDAY\": [\n      \"\\ua46d\\ua18f\",\n      \"\\ua18f\\ua2cd\",\n      \"\\ua18f\\ua44d\",\n      \"\\ua18f\\ua315\",\n      \"\\ua18f\\ua1d6\",\n      \"\\ua18f\\ua26c\",\n      \"\\ua18f\\ua0d8\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\ua2cd\\ua1aa\",\n      \"\\ua44d\\ua1aa\",\n      \"\\ua315\\ua1aa\",\n      \"\\ua1d6\\ua1aa\",\n      \"\\ua26c\\ua1aa\",\n      \"\\ua0d8\\ua1aa\",\n      \"\\ua3c3\\ua1aa\",\n      \"\\ua246\\ua1aa\",\n      \"\\ua22c\\ua1aa\",\n      \"\\ua2b0\\ua1aa\",\n      \"\\ua2b0\\ua2aa\\ua1aa\",\n      \"\\ua2b0\\ua44b\\ua1aa\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\ua2cd\\ua1aa\",\n      \"\\ua44d\\ua1aa\",\n      \"\\ua315\\ua1aa\",\n      \"\\ua1d6\\ua1aa\",\n      \"\\ua26c\\ua1aa\",\n      \"\\ua0d8\\ua1aa\",\n      \"\\ua3c3\\ua1aa\",\n      \"\\ua246\\ua1aa\",\n      \"\\ua22c\\ua1aa\",\n      \"\\ua2b0\\ua1aa\",\n      \"\\ua2b0\\ua2aa\\ua1aa\",\n      \"\\ua2b0\\ua44b\\ua1aa\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ii\",\n  \"localeID\": \"ii\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Minggu\",\n      \"Senin\",\n      \"Selasa\",\n      \"Rabu\",\n      \"Kamis\",\n      \"Jumat\",\n      \"Sabtu\"\n    ],\n    \"ERANAMES\": [\n      \"Sebelum Masehi\",\n      \"Masehi\"\n    ],\n    \"ERAS\": [\n      \"SM\",\n      \"M\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Maret\",\n      \"April\",\n      \"Mei\",\n      \"Juni\",\n      \"Juli\",\n      \"Agustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"SHORTDAY\": [\n      \"Min\",\n      \"Sen\",\n      \"Sel\",\n      \"Rab\",\n      \"Kam\",\n      \"Jum\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Agt\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Maret\",\n      \"April\",\n      \"Mei\",\n      \"Juni\",\n      \"Juli\",\n      \"Agustus\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH.mm.ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"dd/MM/yy HH.mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rp\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"in\",\n  \"localeID\": \"in\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_is-is.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\nfunction getWT(v, f) {\n  if (f === 0) {\n    return {w: 0, t: 0};\n  }\n\n  while ((f % 10) === 0) {\n    f /= 10;\n    v--;\n  }\n\n  return {w: v, t: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"f.h.\",\n      \"e.h.\"\n    ],\n    \"DAY\": [\n      \"sunnudagur\",\n      \"m\\u00e1nudagur\",\n      \"\\u00feri\\u00f0judagur\",\n      \"mi\\u00f0vikudagur\",\n      \"fimmtudagur\",\n      \"f\\u00f6studagur\",\n      \"laugardagur\"\n    ],\n    \"ERANAMES\": [\n      \"fyrir Krist\",\n      \"eftir Krist\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"jan\\u00faar\",\n      \"febr\\u00faar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"ma\\u00ed\",\n      \"j\\u00fan\\u00ed\",\n      \"j\\u00fal\\u00ed\",\n      \"\\u00e1g\\u00fast\",\n      \"september\",\n      \"okt\\u00f3ber\",\n      \"n\\u00f3vember\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"sun.\",\n      \"m\\u00e1n.\",\n      \"\\u00feri.\",\n      \"mi\\u00f0.\",\n      \"fim.\",\n      \"f\\u00f6s.\",\n      \"lau.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"ma\\u00ed\",\n      \"j\\u00fan.\",\n      \"j\\u00fal.\",\n      \"\\u00e1g\\u00fa.\",\n      \"sep.\",\n      \"okt.\",\n      \"n\\u00f3v.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"jan\\u00faar\",\n      \"febr\\u00faar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"ma\\u00ed\",\n      \"j\\u00fan\\u00ed\",\n      \"j\\u00fal\\u00ed\",\n      \"\\u00e1g\\u00fast\",\n      \"september\",\n      \"okt\\u00f3ber\",\n      \"n\\u00f3vember\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.y HH:mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"is-is\",\n  \"localeID\": \"is_IS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  var wt = getWT(vf.v, vf.f);  if (wt.t == 0 && i % 10 == 1 && i % 100 != 11 || wt.t != 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_is.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\nfunction getWT(v, f) {\n  if (f === 0) {\n    return {w: 0, t: 0};\n  }\n\n  while ((f % 10) === 0) {\n    f /= 10;\n    v--;\n  }\n\n  return {w: v, t: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"f.h.\",\n      \"e.h.\"\n    ],\n    \"DAY\": [\n      \"sunnudagur\",\n      \"m\\u00e1nudagur\",\n      \"\\u00feri\\u00f0judagur\",\n      \"mi\\u00f0vikudagur\",\n      \"fimmtudagur\",\n      \"f\\u00f6studagur\",\n      \"laugardagur\"\n    ],\n    \"ERANAMES\": [\n      \"fyrir Krist\",\n      \"eftir Krist\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"jan\\u00faar\",\n      \"febr\\u00faar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"ma\\u00ed\",\n      \"j\\u00fan\\u00ed\",\n      \"j\\u00fal\\u00ed\",\n      \"\\u00e1g\\u00fast\",\n      \"september\",\n      \"okt\\u00f3ber\",\n      \"n\\u00f3vember\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"sun.\",\n      \"m\\u00e1n.\",\n      \"\\u00feri.\",\n      \"mi\\u00f0.\",\n      \"fim.\",\n      \"f\\u00f6s.\",\n      \"lau.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"ma\\u00ed\",\n      \"j\\u00fan.\",\n      \"j\\u00fal.\",\n      \"\\u00e1g\\u00fa.\",\n      \"sep.\",\n      \"okt.\",\n      \"n\\u00f3v.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"jan\\u00faar\",\n      \"febr\\u00faar\",\n      \"mars\",\n      \"apr\\u00edl\",\n      \"ma\\u00ed\",\n      \"j\\u00fan\\u00ed\",\n      \"j\\u00fal\\u00ed\",\n      \"\\u00e1g\\u00fast\",\n      \"september\",\n      \"okt\\u00f3ber\",\n      \"n\\u00f3vember\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.y HH:mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"is\",\n  \"localeID\": \"is\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  var wt = getWT(vf.v, vf.f);  if (wt.t == 0 && i % 10 == 1 && i % 100 != 11 || wt.t != 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_it-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"domenica\",\n      \"luned\\u00ec\",\n      \"marted\\u00ec\",\n      \"mercoled\\u00ec\",\n      \"gioved\\u00ec\",\n      \"venerd\\u00ec\",\n      \"sabato\"\n    ],\n    \"ERANAMES\": [\n      \"avanti Cristo\",\n      \"dopo Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"lun\",\n      \"mar\",\n      \"mer\",\n      \"gio\",\n      \"ven\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"gen\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"mag\",\n      \"giu\",\n      \"lug\",\n      \"ago\",\n      \"set\",\n      \"ott\",\n      \"nov\",\n      \"dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"it-ch\",\n  \"localeID\": \"it_CH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_it-it.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"domenica\",\n      \"luned\\u00ec\",\n      \"marted\\u00ec\",\n      \"mercoled\\u00ec\",\n      \"gioved\\u00ec\",\n      \"venerd\\u00ec\",\n      \"sabato\"\n    ],\n    \"ERANAMES\": [\n      \"avanti Cristo\",\n      \"dopo Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"lun\",\n      \"mar\",\n      \"mer\",\n      \"gio\",\n      \"ven\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"gen\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"mag\",\n      \"giu\",\n      \"lug\",\n      \"ago\",\n      \"set\",\n      \"ott\",\n      \"nov\",\n      \"dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"it-it\",\n  \"localeID\": \"it_IT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_it-sm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"domenica\",\n      \"luned\\u00ec\",\n      \"marted\\u00ec\",\n      \"mercoled\\u00ec\",\n      \"gioved\\u00ec\",\n      \"venerd\\u00ec\",\n      \"sabato\"\n    ],\n    \"ERANAMES\": [\n      \"avanti Cristo\",\n      \"dopo Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"lun\",\n      \"mar\",\n      \"mer\",\n      \"gio\",\n      \"ven\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"gen\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"mag\",\n      \"giu\",\n      \"lug\",\n      \"ago\",\n      \"set\",\n      \"ott\",\n      \"nov\",\n      \"dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"it-sm\",\n  \"localeID\": \"it_SM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_it-va.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"domenica\",\n      \"luned\\u00ec\",\n      \"marted\\u00ec\",\n      \"mercoled\\u00ec\",\n      \"gioved\\u00ec\",\n      \"venerd\\u00ec\",\n      \"sabato\"\n    ],\n    \"ERANAMES\": [\n      \"avanti Cristo\",\n      \"dopo Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"lun\",\n      \"mar\",\n      \"mer\",\n      \"gio\",\n      \"ven\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"gen\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"mag\",\n      \"giu\",\n      \"lug\",\n      \"ago\",\n      \"set\",\n      \"ott\",\n      \"nov\",\n      \"dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"it-va\",\n  \"localeID\": \"it_VA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_it.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"domenica\",\n      \"luned\\u00ec\",\n      \"marted\\u00ec\",\n      \"mercoled\\u00ec\",\n      \"gioved\\u00ec\",\n      \"venerd\\u00ec\",\n      \"sabato\"\n    ],\n    \"ERANAMES\": [\n      \"avanti Cristo\",\n      \"dopo Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"lun\",\n      \"mar\",\n      \"mer\",\n      \"gio\",\n      \"ven\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"gen\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"mag\",\n      \"giu\",\n      \"lug\",\n      \"ago\",\n      \"set\",\n      \"ott\",\n      \"nov\",\n      \"dic\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"gennaio\",\n      \"febbraio\",\n      \"marzo\",\n      \"aprile\",\n      \"maggio\",\n      \"giugno\",\n      \"luglio\",\n      \"agosto\",\n      \"settembre\",\n      \"ottobre\",\n      \"novembre\",\n      \"dicembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"it\",\n  \"localeID\": \"it\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_iw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d4\\u05f4\\u05e6\",\n      \"\\u05d0\\u05d7\\u05d4\\u05f4\\u05e6\"\n    ],\n    \"DAY\": [\n      \"\\u05d9\\u05d5\\u05dd \\u05e8\\u05d0\\u05e9\\u05d5\\u05df\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05dc\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e8\\u05d1\\u05d9\\u05e2\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d7\\u05de\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05d9\\u05e9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dd \\u05e9\\u05d1\\u05ea\"\n    ],\n    \"ERANAMES\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d9 \\u05d4\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\",\n      \"\\u05dc\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\"\n    ],\n    \"ERAS\": [\n      \"\\u05dc\\u05e4\\u05e0\\u05d4\\u05f4\\u05e1\",\n      \"\\u05dc\\u05e1\\u05e4\\u05d9\\u05e8\\u05d4\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05d0\\u05e8\",\n      \"\\u05e4\\u05d1\\u05e8\\u05d5\\u05d0\\u05e8\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e4\\u05d8\\u05de\\u05d1\\u05e8\",\n      \"\\u05d0\\u05d5\\u05e7\\u05d8\\u05d5\\u05d1\\u05e8\",\n      \"\\u05e0\\u05d5\\u05d1\\u05de\\u05d1\\u05e8\",\n      \"\\u05d3\\u05e6\\u05de\\u05d1\\u05e8\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u05d9\\u05d5\\u05dd \\u05d0\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d1\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d2\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d3\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d4\\u05f3\",\n      \"\\u05d9\\u05d5\\u05dd \\u05d5\\u05f3\",\n      \"\\u05e9\\u05d1\\u05ea\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05f3\",\n      \"\\u05e4\\u05d1\\u05e8\\u05f3\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05f3\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05f3\",\n      \"\\u05e1\\u05e4\\u05d8\\u05f3\",\n      \"\\u05d0\\u05d5\\u05e7\\u05f3\",\n      \"\\u05e0\\u05d5\\u05d1\\u05f3\",\n      \"\\u05d3\\u05e6\\u05de\\u05f3\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u05d9\\u05e0\\u05d5\\u05d0\\u05e8\",\n      \"\\u05e4\\u05d1\\u05e8\\u05d5\\u05d0\\u05e8\",\n      \"\\u05de\\u05e8\\u05e5\",\n      \"\\u05d0\\u05e4\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e4\\u05d8\\u05de\\u05d1\\u05e8\",\n      \"\\u05d0\\u05d5\\u05e7\\u05d8\\u05d5\\u05d1\\u05e8\",\n      \"\\u05e0\\u05d5\\u05d1\\u05de\\u05d1\\u05e8\",\n      \"\\u05d3\\u05e6\\u05de\\u05d1\\u05e8\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE, d \\u05d1MMMM y\",\n    \"longDate\": \"d \\u05d1MMMM y\",\n    \"medium\": \"d \\u05d1MMM y H:mm:ss\",\n    \"mediumDate\": \"d \\u05d1MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d.M.y H:mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20aa\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u200f-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\\u200f\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"iw\",\n  \"localeID\": \"iw\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (i == 2 && vf.v == 0) {    return PLURAL_CATEGORY.TWO;  }  if (vf.v == 0 && (n < 0 || n > 10) && n % 10 == 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ja-jp.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u5348\\u524d\",\n      \"\\u5348\\u5f8c\"\n    ],\n    \"DAY\": [\n      \"\\u65e5\\u66dc\\u65e5\",\n      \"\\u6708\\u66dc\\u65e5\",\n      \"\\u706b\\u66dc\\u65e5\",\n      \"\\u6c34\\u66dc\\u65e5\",\n      \"\\u6728\\u66dc\\u65e5\",\n      \"\\u91d1\\u66dc\\u65e5\",\n      \"\\u571f\\u66dc\\u65e5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u7d00\\u5143\\u524d\",\n      \"\\u897f\\u66a6\"\n    ],\n    \"ERAS\": [\n      \"\\u7d00\\u5143\\u524d\",\n      \"\\u897f\\u66a6\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u65e5\",\n      \"\\u6708\",\n      \"\\u706b\",\n      \"\\u6c34\",\n      \"\\u6728\",\n      \"\\u91d1\",\n      \"\\u571f\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y/MM/dd H:mm:ss\",\n    \"mediumDate\": \"y/MM/dd\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y/MM/dd H:mm\",\n    \"shortDate\": \"y/MM/dd\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ja-jp\",\n  \"localeID\": \"ja_JP\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ja.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u5348\\u524d\",\n      \"\\u5348\\u5f8c\"\n    ],\n    \"DAY\": [\n      \"\\u65e5\\u66dc\\u65e5\",\n      \"\\u6708\\u66dc\\u65e5\",\n      \"\\u706b\\u66dc\\u65e5\",\n      \"\\u6c34\\u66dc\\u65e5\",\n      \"\\u6728\\u66dc\\u65e5\",\n      \"\\u91d1\\u66dc\\u65e5\",\n      \"\\u571f\\u66dc\\u65e5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u7d00\\u5143\\u524d\",\n      \"\\u897f\\u66a6\"\n    ],\n    \"ERAS\": [\n      \"\\u7d00\\u5143\\u524d\",\n      \"\\u897f\\u66a6\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u65e5\",\n      \"\\u6708\",\n      \"\\u706b\",\n      \"\\u6c34\",\n      \"\\u6728\",\n      \"\\u91d1\",\n      \"\\u571f\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y/MM/dd H:mm:ss\",\n    \"mediumDate\": \"y/MM/dd\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y/MM/dd H:mm\",\n    \"shortDate\": \"y/MM/dd\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ja\",\n  \"localeID\": \"ja\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_jgo-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"mba\\ua78cmba\\ua78c\",\n      \"\\u014bka mb\\u0254\\u0301t nji\"\n    ],\n    \"DAY\": [\n      \"S\\u0254\\u0301ndi\",\n      \"M\\u0254\\u0301ndi\",\n      \"\\u00c1pta M\\u0254\\u0301ndi\",\n      \"W\\u025b\\u0301n\\u025bs\\u025bd\\u025b\",\n      \"T\\u0254\\u0301s\\u025bd\\u025b\",\n      \"F\\u025bl\\u00e2y\\u025bd\\u025b\",\n      \"S\\u00e1sid\\u025b\"\n    ],\n    \"ERANAMES\": [\n      \"ts\\u025btts\\u025bt m\\u025b\\u014bgu\\ua78c mi \\u025b\\u0301 l\\u025b\\u025bn\\u025b K\\u025bl\\u00eds\\u025bt\\u0254 g\\u0254 \\u0144\\u0254\\u0301\",\n      \"ts\\u025btts\\u025bt m\\u025b\\u014bgu\\ua78c mi \\u025b\\u0301 f\\u00fan\\u025b K\\u025bl\\u00eds\\u025bt\\u0254 t\\u0254\\u0301 m\\u0254\\u0301\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ndu\\u014bmbi Sa\\u014b\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301p\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301t\\u00e1t\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301kwa\",\n      \"P\\u025bsa\\u014b Pataa\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301nt\\u00fak\\u00fa\",\n      \"P\\u025bsa\\u014b Saamb\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301f\\u0254m\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301pf\\u00fa\\ua78b\\u00fa\",\n      \"P\\u025bsa\\u014b N\\u025bg\\u025b\\u0301m\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpm\\u0254\\u0301\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpp\\u00e1\"\n    ],\n    \"SHORTDAY\": [\n      \"S\\u0254\\u0301ndi\",\n      \"M\\u0254\\u0301ndi\",\n      \"\\u00c1pta M\\u0254\\u0301ndi\",\n      \"W\\u025b\\u0301n\\u025bs\\u025bd\\u025b\",\n      \"T\\u0254\\u0301s\\u025bd\\u025b\",\n      \"F\\u025bl\\u00e2y\\u025bd\\u025b\",\n      \"S\\u00e1sid\\u025b\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ndu\\u014bmbi Sa\\u014b\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301p\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301t\\u00e1t\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301kwa\",\n      \"P\\u025bsa\\u014b Pataa\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301nt\\u00fak\\u00fa\",\n      \"P\\u025bsa\\u014b Saamb\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301f\\u0254m\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301pf\\u00fa\\ua78b\\u00fa\",\n      \"P\\u025bsa\\u014b N\\u025bg\\u025b\\u0301m\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpm\\u0254\\u0301\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpp\\u00e1\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ndu\\u014bmbi Sa\\u014b\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301p\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301t\\u00e1t\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301kwa\",\n      \"P\\u025bsa\\u014b Pataa\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301nt\\u00fak\\u00fa\",\n      \"P\\u025bsa\\u014b Saamb\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301f\\u0254m\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301pf\\u00fa\\ua78b\\u00fa\",\n      \"P\\u025bsa\\u014b N\\u025bg\\u025b\\u0301m\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpm\\u0254\\u0301\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpp\\u00e1\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y MMMM dd\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"jgo-cm\",\n  \"localeID\": \"jgo_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_jgo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"mba\\ua78cmba\\ua78c\",\n      \"\\u014bka mb\\u0254\\u0301t nji\"\n    ],\n    \"DAY\": [\n      \"S\\u0254\\u0301ndi\",\n      \"M\\u0254\\u0301ndi\",\n      \"\\u00c1pta M\\u0254\\u0301ndi\",\n      \"W\\u025b\\u0301n\\u025bs\\u025bd\\u025b\",\n      \"T\\u0254\\u0301s\\u025bd\\u025b\",\n      \"F\\u025bl\\u00e2y\\u025bd\\u025b\",\n      \"S\\u00e1sid\\u025b\"\n    ],\n    \"ERANAMES\": [\n      \"ts\\u025btts\\u025bt m\\u025b\\u014bgu\\ua78c mi \\u025b\\u0301 l\\u025b\\u025bn\\u025b K\\u025bl\\u00eds\\u025bt\\u0254 g\\u0254 \\u0144\\u0254\\u0301\",\n      \"ts\\u025btts\\u025bt m\\u025b\\u014bgu\\ua78c mi \\u025b\\u0301 f\\u00fan\\u025b K\\u025bl\\u00eds\\u025bt\\u0254 t\\u0254\\u0301 m\\u0254\\u0301\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ndu\\u014bmbi Sa\\u014b\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301p\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301t\\u00e1t\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301kwa\",\n      \"P\\u025bsa\\u014b Pataa\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301nt\\u00fak\\u00fa\",\n      \"P\\u025bsa\\u014b Saamb\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301f\\u0254m\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301pf\\u00fa\\ua78b\\u00fa\",\n      \"P\\u025bsa\\u014b N\\u025bg\\u025b\\u0301m\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpm\\u0254\\u0301\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpp\\u00e1\"\n    ],\n    \"SHORTDAY\": [\n      \"S\\u0254\\u0301ndi\",\n      \"M\\u0254\\u0301ndi\",\n      \"\\u00c1pta M\\u0254\\u0301ndi\",\n      \"W\\u025b\\u0301n\\u025bs\\u025bd\\u025b\",\n      \"T\\u0254\\u0301s\\u025bd\\u025b\",\n      \"F\\u025bl\\u00e2y\\u025bd\\u025b\",\n      \"S\\u00e1sid\\u025b\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ndu\\u014bmbi Sa\\u014b\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301p\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301t\\u00e1t\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301kwa\",\n      \"P\\u025bsa\\u014b Pataa\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301nt\\u00fak\\u00fa\",\n      \"P\\u025bsa\\u014b Saamb\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301f\\u0254m\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301pf\\u00fa\\ua78b\\u00fa\",\n      \"P\\u025bsa\\u014b N\\u025bg\\u025b\\u0301m\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpm\\u0254\\u0301\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpp\\u00e1\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ndu\\u014bmbi Sa\\u014b\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301p\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301t\\u00e1t\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301kwa\",\n      \"P\\u025bsa\\u014b Pataa\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301nt\\u00fak\\u00fa\",\n      \"P\\u025bsa\\u014b Saamb\\u00e1\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301f\\u0254m\",\n      \"P\\u025bsa\\u014b P\\u025b\\u0301n\\u025b\\u0301pf\\u00fa\\ua78b\\u00fa\",\n      \"P\\u025bsa\\u014b N\\u025bg\\u025b\\u0301m\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpm\\u0254\\u0301\",\n      \"P\\u025bsa\\u014b Nts\\u0254\\u030cpp\\u00e1\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y MMMM dd\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"jgo\",\n  \"localeID\": \"jgo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_jmc-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"utuko\",\n      \"kyiukonyi\"\n    ],\n    \"DAY\": [\n      \"Jumapilyi\",\n      \"Jumatatuu\",\n      \"Jumanne\",\n      \"Jumatanu\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristu\",\n      \"Baada ya Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"jmc-tz\",\n  \"localeID\": \"jmc_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_jmc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"utuko\",\n      \"kyiukonyi\"\n    ],\n    \"DAY\": [\n      \"Jumapilyi\",\n      \"Jumatatuu\",\n      \"Jumanne\",\n      \"Jumatanu\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristu\",\n      \"Baada ya Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"jmc\",\n  \"localeID\": \"jmc\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ka-ge.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u10d9\\u10d5\\u10d8\\u10e0\\u10d0\",\n      \"\\u10dd\\u10e0\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10e1\\u10d0\\u10db\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10dd\\u10d7\\u10ee\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10ee\\u10e3\\u10d7\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10de\\u10d0\\u10e0\\u10d0\\u10e1\\u10d9\\u10d4\\u10d5\\u10d8\",\n      \"\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\"\n    ],\n    \"ERANAMES\": [\n      \"\\u10eb\\u10d5\\u10d4\\u10da\\u10d8 \\u10ec\\u10d4\\u10da\\u10d7\\u10d0\\u10e6\\u10e0\\u10d8\\u10ea\\u10ee\\u10d5\\u10d8\\u10d7\",\n      \"\\u10d0\\u10ee\\u10d0\\u10da\\u10d8 \\u10ec\\u10d4\\u10da\\u10d7\\u10d0\\u10e6\\u10e0\\u10d8\\u10ea\\u10ee\\u10d5\\u10d8\\u10d7\"\n    ],\n    \"ERAS\": [\n      \"\\u10eb\\u10d5. \\u10ec.\",\n      \"\\u10d0\\u10ee. \\u10ec.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u10d8\\u10d0\\u10dc\\u10d5\\u10d0\\u10e0\\u10d8\",\n      \"\\u10d7\\u10d4\\u10d1\\u10d4\\u10e0\\u10d5\\u10d0\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10e0\\u10e2\\u10d8\",\n      \"\\u10d0\\u10de\\u10e0\\u10d8\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10dc\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10da\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d0\\u10d2\\u10d5\\u10d8\\u10e1\\u10e2\\u10dd\",\n      \"\\u10e1\\u10d4\\u10e5\\u10e2\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dd\\u10e5\\u10e2\\u10dd\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dc\\u10dd\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10d3\\u10d4\\u10d9\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u10d9\\u10d5\\u10d8\",\n      \"\\u10dd\\u10e0\\u10e8\",\n      \"\\u10e1\\u10d0\\u10db\",\n      \"\\u10dd\\u10d7\\u10ee\",\n      \"\\u10ee\\u10e3\\u10d7\",\n      \"\\u10de\\u10d0\\u10e0\",\n      \"\\u10e8\\u10d0\\u10d1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u10d8\\u10d0\\u10dc\",\n      \"\\u10d7\\u10d4\\u10d1\",\n      \"\\u10db\\u10d0\\u10e0\",\n      \"\\u10d0\\u10de\\u10e0\",\n      \"\\u10db\\u10d0\\u10d8\",\n      \"\\u10d8\\u10d5\\u10dc\",\n      \"\\u10d8\\u10d5\\u10da\",\n      \"\\u10d0\\u10d2\\u10d5\",\n      \"\\u10e1\\u10d4\\u10e5\",\n      \"\\u10dd\\u10e5\\u10e2\",\n      \"\\u10dc\\u10dd\\u10d4\",\n      \"\\u10d3\\u10d4\\u10d9\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u10d8\\u10d0\\u10dc\\u10d5\\u10d0\\u10e0\\u10d8\",\n      \"\\u10d7\\u10d4\\u10d1\\u10d4\\u10e0\\u10d5\\u10d0\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10e0\\u10e2\\u10d8\",\n      \"\\u10d0\\u10de\\u10e0\\u10d8\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10dc\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10da\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d0\\u10d2\\u10d5\\u10d8\\u10e1\\u10e2\\u10dd\",\n      \"\\u10e1\\u10d4\\u10e5\\u10e2\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dd\\u10e5\\u10e2\\u10dd\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dc\\u10dd\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10d3\\u10d4\\u10d9\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM. y HH:mm:ss\",\n    \"mediumDate\": \"d MMM. y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GEL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ka-ge\",\n  \"localeID\": \"ka_GE\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ka.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u10d9\\u10d5\\u10d8\\u10e0\\u10d0\",\n      \"\\u10dd\\u10e0\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10e1\\u10d0\\u10db\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10dd\\u10d7\\u10ee\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10ee\\u10e3\\u10d7\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\",\n      \"\\u10de\\u10d0\\u10e0\\u10d0\\u10e1\\u10d9\\u10d4\\u10d5\\u10d8\",\n      \"\\u10e8\\u10d0\\u10d1\\u10d0\\u10d7\\u10d8\"\n    ],\n    \"ERANAMES\": [\n      \"\\u10eb\\u10d5\\u10d4\\u10da\\u10d8 \\u10ec\\u10d4\\u10da\\u10d7\\u10d0\\u10e6\\u10e0\\u10d8\\u10ea\\u10ee\\u10d5\\u10d8\\u10d7\",\n      \"\\u10d0\\u10ee\\u10d0\\u10da\\u10d8 \\u10ec\\u10d4\\u10da\\u10d7\\u10d0\\u10e6\\u10e0\\u10d8\\u10ea\\u10ee\\u10d5\\u10d8\\u10d7\"\n    ],\n    \"ERAS\": [\n      \"\\u10eb\\u10d5. \\u10ec.\",\n      \"\\u10d0\\u10ee. \\u10ec.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u10d8\\u10d0\\u10dc\\u10d5\\u10d0\\u10e0\\u10d8\",\n      \"\\u10d7\\u10d4\\u10d1\\u10d4\\u10e0\\u10d5\\u10d0\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10e0\\u10e2\\u10d8\",\n      \"\\u10d0\\u10de\\u10e0\\u10d8\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10dc\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10da\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d0\\u10d2\\u10d5\\u10d8\\u10e1\\u10e2\\u10dd\",\n      \"\\u10e1\\u10d4\\u10e5\\u10e2\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dd\\u10e5\\u10e2\\u10dd\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dc\\u10dd\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10d3\\u10d4\\u10d9\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u10d9\\u10d5\\u10d8\",\n      \"\\u10dd\\u10e0\\u10e8\",\n      \"\\u10e1\\u10d0\\u10db\",\n      \"\\u10dd\\u10d7\\u10ee\",\n      \"\\u10ee\\u10e3\\u10d7\",\n      \"\\u10de\\u10d0\\u10e0\",\n      \"\\u10e8\\u10d0\\u10d1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u10d8\\u10d0\\u10dc\",\n      \"\\u10d7\\u10d4\\u10d1\",\n      \"\\u10db\\u10d0\\u10e0\",\n      \"\\u10d0\\u10de\\u10e0\",\n      \"\\u10db\\u10d0\\u10d8\",\n      \"\\u10d8\\u10d5\\u10dc\",\n      \"\\u10d8\\u10d5\\u10da\",\n      \"\\u10d0\\u10d2\\u10d5\",\n      \"\\u10e1\\u10d4\\u10e5\",\n      \"\\u10dd\\u10e5\\u10e2\",\n      \"\\u10dc\\u10dd\\u10d4\",\n      \"\\u10d3\\u10d4\\u10d9\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u10d8\\u10d0\\u10dc\\u10d5\\u10d0\\u10e0\\u10d8\",\n      \"\\u10d7\\u10d4\\u10d1\\u10d4\\u10e0\\u10d5\\u10d0\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10e0\\u10e2\\u10d8\",\n      \"\\u10d0\\u10de\\u10e0\\u10d8\\u10da\\u10d8\",\n      \"\\u10db\\u10d0\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10dc\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d8\\u10d5\\u10da\\u10d8\\u10e1\\u10d8\",\n      \"\\u10d0\\u10d2\\u10d5\\u10d8\\u10e1\\u10e2\\u10dd\",\n      \"\\u10e1\\u10d4\\u10e5\\u10e2\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dd\\u10e5\\u10e2\\u10dd\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10dc\\u10dd\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\",\n      \"\\u10d3\\u10d4\\u10d9\\u10d4\\u10db\\u10d1\\u10d4\\u10e0\\u10d8\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM. y HH:mm:ss\",\n    \"mediumDate\": \"d MMM. y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GEL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ka\",\n  \"localeID\": \"ka\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kab-dz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"n tufat\",\n      \"n tmeddit\"\n    ],\n    \"DAY\": [\n      \"Yanass\",\n      \"Sanass\",\n      \"Kra\\u1e0dass\",\n      \"Ku\\u1e93ass\",\n      \"Samass\",\n      \"S\\u1e0disass\",\n      \"Sayass\"\n    ],\n    \"ERANAMES\": [\n      \"send talalit n \\u0190isa\",\n      \"seld talalit n \\u0190isa\"\n    ],\n    \"ERAS\": [\n      \"snd. T.\\u0190\",\n      \"sld. T.\\u0190\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"Yennayer\",\n      \"Fu\\u1e5bar\",\n      \"Me\\u0263res\",\n      \"Yebrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyu\",\n      \"\\u0194uct\",\n      \"Ctembe\\u1e5b\",\n      \"Tube\\u1e5b\",\n      \"Nunembe\\u1e5b\",\n      \"Du\\u01e7embe\\u1e5b\"\n    ],\n    \"SHORTDAY\": [\n      \"Yan\",\n      \"San\",\n      \"Kra\\u1e0d\",\n      \"Ku\\u1e93\",\n      \"Sam\",\n      \"S\\u1e0dis\",\n      \"Say\"\n    ],\n    \"SHORTMONTH\": [\n      \"Yen\",\n      \"Fur\",\n      \"Me\\u0263\",\n      \"Yeb\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"\\u0194uc\",\n      \"Cte\",\n      \"Tub\",\n      \"Nun\",\n      \"Du\\u01e7\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yennayer\",\n      \"Fu\\u1e5bar\",\n      \"Me\\u0263res\",\n      \"Yebrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyu\",\n      \"\\u0194uct\",\n      \"Ctembe\\u1e5b\",\n      \"Tube\\u1e5b\",\n      \"Nunembe\\u1e5b\",\n      \"Du\\u01e7embe\\u1e5b\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/y h:mm a\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"kab-dz\",\n  \"localeID\": \"kab_DZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kab.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"n tufat\",\n      \"n tmeddit\"\n    ],\n    \"DAY\": [\n      \"Yanass\",\n      \"Sanass\",\n      \"Kra\\u1e0dass\",\n      \"Ku\\u1e93ass\",\n      \"Samass\",\n      \"S\\u1e0disass\",\n      \"Sayass\"\n    ],\n    \"ERANAMES\": [\n      \"send talalit n \\u0190isa\",\n      \"seld talalit n \\u0190isa\"\n    ],\n    \"ERAS\": [\n      \"snd. T.\\u0190\",\n      \"sld. T.\\u0190\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"Yennayer\",\n      \"Fu\\u1e5bar\",\n      \"Me\\u0263res\",\n      \"Yebrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyu\",\n      \"\\u0194uct\",\n      \"Ctembe\\u1e5b\",\n      \"Tube\\u1e5b\",\n      \"Nunembe\\u1e5b\",\n      \"Du\\u01e7embe\\u1e5b\"\n    ],\n    \"SHORTDAY\": [\n      \"Yan\",\n      \"San\",\n      \"Kra\\u1e0d\",\n      \"Ku\\u1e93\",\n      \"Sam\",\n      \"S\\u1e0dis\",\n      \"Say\"\n    ],\n    \"SHORTMONTH\": [\n      \"Yen\",\n      \"Fur\",\n      \"Me\\u0263\",\n      \"Yeb\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"\\u0194uc\",\n      \"Cte\",\n      \"Tub\",\n      \"Nun\",\n      \"Du\\u01e7\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yennayer\",\n      \"Fu\\u1e5bar\",\n      \"Me\\u0263res\",\n      \"Yebrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyu\",\n      \"\\u0194uct\",\n      \"Ctembe\\u1e5b\",\n      \"Tube\\u1e5b\",\n      \"Nunembe\\u1e5b\",\n      \"Du\\u01e7embe\\u1e5b\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/y h:mm a\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"kab\",\n  \"localeID\": \"kab\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kam-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0128yakwakya\",\n      \"\\u0128yaw\\u0129oo\"\n    ],\n    \"DAY\": [\n      \"Wa kyumwa\",\n      \"Wa kwamb\\u0129l\\u0129lya\",\n      \"Wa kel\\u0129\",\n      \"Wa katat\\u0169\",\n      \"Wa kana\",\n      \"Wa katano\",\n      \"Wa thanthat\\u0169\"\n    ],\n    \"ERANAMES\": [\n      \"Mbee wa Yes\\u0169\",\n      \"\\u0128tina wa Yes\\u0169\"\n    ],\n    \"ERAS\": [\n      \"MY\",\n      \"IY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mwai wa mbee\",\n      \"Mwai wa kel\\u0129\",\n      \"Mwai wa katat\\u0169\",\n      \"Mwai wa kana\",\n      \"Mwai wa katano\",\n      \"Mwai wa thanthat\\u0169\",\n      \"Mwai wa muonza\",\n      \"Mwai wa nyaanya\",\n      \"Mwai wa kenda\",\n      \"Mwai wa \\u0129kumi\",\n      \"Mwai wa \\u0129kumi na \\u0129mwe\",\n      \"Mwai wa \\u0129kumi na il\\u0129\"\n    ],\n    \"SHORTDAY\": [\n      \"Wky\",\n      \"Wkw\",\n      \"Wkl\",\n      \"Wt\\u0169\",\n      \"Wkn\",\n      \"Wtn\",\n      \"Wth\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mbe\",\n      \"Kel\",\n      \"Kt\\u0169\",\n      \"Kan\",\n      \"Ktn\",\n      \"Tha\",\n      \"Moo\",\n      \"Nya\",\n      \"Knd\",\n      \"\\u0128ku\",\n      \"\\u0128km\",\n      \"\\u0128kl\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mwai wa mbee\",\n      \"Mwai wa kel\\u0129\",\n      \"Mwai wa katat\\u0169\",\n      \"Mwai wa kana\",\n      \"Mwai wa katano\",\n      \"Mwai wa thanthat\\u0169\",\n      \"Mwai wa muonza\",\n      \"Mwai wa nyaanya\",\n      \"Mwai wa kenda\",\n      \"Mwai wa \\u0129kumi\",\n      \"Mwai wa \\u0129kumi na \\u0129mwe\",\n      \"Mwai wa \\u0129kumi na il\\u0129\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kam-ke\",\n  \"localeID\": \"kam_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kam.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0128yakwakya\",\n      \"\\u0128yaw\\u0129oo\"\n    ],\n    \"DAY\": [\n      \"Wa kyumwa\",\n      \"Wa kwamb\\u0129l\\u0129lya\",\n      \"Wa kel\\u0129\",\n      \"Wa katat\\u0169\",\n      \"Wa kana\",\n      \"Wa katano\",\n      \"Wa thanthat\\u0169\"\n    ],\n    \"ERANAMES\": [\n      \"Mbee wa Yes\\u0169\",\n      \"\\u0128tina wa Yes\\u0169\"\n    ],\n    \"ERAS\": [\n      \"MY\",\n      \"IY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mwai wa mbee\",\n      \"Mwai wa kel\\u0129\",\n      \"Mwai wa katat\\u0169\",\n      \"Mwai wa kana\",\n      \"Mwai wa katano\",\n      \"Mwai wa thanthat\\u0169\",\n      \"Mwai wa muonza\",\n      \"Mwai wa nyaanya\",\n      \"Mwai wa kenda\",\n      \"Mwai wa \\u0129kumi\",\n      \"Mwai wa \\u0129kumi na \\u0129mwe\",\n      \"Mwai wa \\u0129kumi na il\\u0129\"\n    ],\n    \"SHORTDAY\": [\n      \"Wky\",\n      \"Wkw\",\n      \"Wkl\",\n      \"Wt\\u0169\",\n      \"Wkn\",\n      \"Wtn\",\n      \"Wth\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mbe\",\n      \"Kel\",\n      \"Kt\\u0169\",\n      \"Kan\",\n      \"Ktn\",\n      \"Tha\",\n      \"Moo\",\n      \"Nya\",\n      \"Knd\",\n      \"\\u0128ku\",\n      \"\\u0128km\",\n      \"\\u0128kl\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mwai wa mbee\",\n      \"Mwai wa kel\\u0129\",\n      \"Mwai wa katat\\u0169\",\n      \"Mwai wa kana\",\n      \"Mwai wa katano\",\n      \"Mwai wa thanthat\\u0169\",\n      \"Mwai wa muonza\",\n      \"Mwai wa nyaanya\",\n      \"Mwai wa kenda\",\n      \"Mwai wa \\u0129kumi\",\n      \"Mwai wa \\u0129kumi na \\u0129mwe\",\n      \"Mwai wa \\u0129kumi na il\\u0129\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kam\",\n  \"localeID\": \"kam\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kde-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Muhi\",\n      \"Chilo\"\n    ],\n    \"DAY\": [\n      \"Liduva lyapili\",\n      \"Liduva lyatatu\",\n      \"Liduva lyanchechi\",\n      \"Liduva lyannyano\",\n      \"Liduva lyannyano na linji\",\n      \"Liduva lyannyano na mavili\",\n      \"Liduva litandi\"\n    ],\n    \"ERANAMES\": [\n      \"Akanapawa Yesu\",\n      \"Nankuida Yesu\"\n    ],\n    \"ERAS\": [\n      \"AY\",\n      \"NY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mwedi Ntandi\",\n      \"Mwedi wa Pili\",\n      \"Mwedi wa Tatu\",\n      \"Mwedi wa Nchechi\",\n      \"Mwedi wa Nnyano\",\n      \"Mwedi wa Nnyano na Umo\",\n      \"Mwedi wa Nnyano na Mivili\",\n      \"Mwedi wa Nnyano na Mitatu\",\n      \"Mwedi wa Nnyano na Nchechi\",\n      \"Mwedi wa Nnyano na Nnyano\",\n      \"Mwedi wa Nnyano na Nnyano na U\",\n      \"Mwedi wa Nnyano na Nnyano na M\"\n    ],\n    \"SHORTDAY\": [\n      \"Ll2\",\n      \"Ll3\",\n      \"Ll4\",\n      \"Ll5\",\n      \"Ll6\",\n      \"Ll7\",\n      \"Ll1\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mwedi Ntandi\",\n      \"Mwedi wa Pili\",\n      \"Mwedi wa Tatu\",\n      \"Mwedi wa Nchechi\",\n      \"Mwedi wa Nnyano\",\n      \"Mwedi wa Nnyano na Umo\",\n      \"Mwedi wa Nnyano na Mivili\",\n      \"Mwedi wa Nnyano na Mitatu\",\n      \"Mwedi wa Nnyano na Nchechi\",\n      \"Mwedi wa Nnyano na Nnyano\",\n      \"Mwedi wa Nnyano na Nnyano na U\",\n      \"Mwedi wa Nnyano na Nnyano na M\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kde-tz\",\n  \"localeID\": \"kde_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kde.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Muhi\",\n      \"Chilo\"\n    ],\n    \"DAY\": [\n      \"Liduva lyapili\",\n      \"Liduva lyatatu\",\n      \"Liduva lyanchechi\",\n      \"Liduva lyannyano\",\n      \"Liduva lyannyano na linji\",\n      \"Liduva lyannyano na mavili\",\n      \"Liduva litandi\"\n    ],\n    \"ERANAMES\": [\n      \"Akanapawa Yesu\",\n      \"Nankuida Yesu\"\n    ],\n    \"ERAS\": [\n      \"AY\",\n      \"NY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mwedi Ntandi\",\n      \"Mwedi wa Pili\",\n      \"Mwedi wa Tatu\",\n      \"Mwedi wa Nchechi\",\n      \"Mwedi wa Nnyano\",\n      \"Mwedi wa Nnyano na Umo\",\n      \"Mwedi wa Nnyano na Mivili\",\n      \"Mwedi wa Nnyano na Mitatu\",\n      \"Mwedi wa Nnyano na Nchechi\",\n      \"Mwedi wa Nnyano na Nnyano\",\n      \"Mwedi wa Nnyano na Nnyano na U\",\n      \"Mwedi wa Nnyano na Nnyano na M\"\n    ],\n    \"SHORTDAY\": [\n      \"Ll2\",\n      \"Ll3\",\n      \"Ll4\",\n      \"Ll5\",\n      \"Ll6\",\n      \"Ll7\",\n      \"Ll1\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mwedi Ntandi\",\n      \"Mwedi wa Pili\",\n      \"Mwedi wa Tatu\",\n      \"Mwedi wa Nchechi\",\n      \"Mwedi wa Nnyano\",\n      \"Mwedi wa Nnyano na Umo\",\n      \"Mwedi wa Nnyano na Mivili\",\n      \"Mwedi wa Nnyano na Mitatu\",\n      \"Mwedi wa Nnyano na Nchechi\",\n      \"Mwedi wa Nnyano na Nnyano\",\n      \"Mwedi wa Nnyano na Nnyano na U\",\n      \"Mwedi wa Nnyano na Nnyano na M\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kde\",\n  \"localeID\": \"kde\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kea-cv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"dumingu\",\n      \"sigunda-fera\",\n      \"tersa-fera\",\n      \"kuarta-fera\",\n      \"kinta-fera\",\n      \"sesta-fera\",\n      \"sabadu\"\n    ],\n    \"ERANAMES\": [\n      \"Antis di Kristu\",\n      \"Dispos di Kristu\"\n    ],\n    \"ERAS\": [\n      \"AK\",\n      \"DK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janeru\",\n      \"Febreru\",\n      \"Marsu\",\n      \"Abril\",\n      \"Maiu\",\n      \"Junhu\",\n      \"Julhu\",\n      \"Agostu\",\n      \"Setenbru\",\n      \"Otubru\",\n      \"Nuvenbru\",\n      \"Dizenbru\"\n    ],\n    \"SHORTDAY\": [\n      \"dum\",\n      \"sig\",\n      \"ter\",\n      \"kua\",\n      \"kin\",\n      \"ses\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Abr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Set\",\n      \"Otu\",\n      \"Nuv\",\n      \"Diz\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janeru\",\n      \"Febreru\",\n      \"Marsu\",\n      \"Abril\",\n      \"Maiu\",\n      \"Junhu\",\n      \"Julhu\",\n      \"Agostu\",\n      \"Setenbru\",\n      \"Otubru\",\n      \"Nuvenbru\",\n      \"Dizenbru\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'di' MMMM 'di' y\",\n    \"longDate\": \"d 'di' MMMM 'di' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CVE\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"kea-cv\",\n  \"localeID\": \"kea_CV\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kea.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"dumingu\",\n      \"sigunda-fera\",\n      \"tersa-fera\",\n      \"kuarta-fera\",\n      \"kinta-fera\",\n      \"sesta-fera\",\n      \"sabadu\"\n    ],\n    \"ERANAMES\": [\n      \"Antis di Kristu\",\n      \"Dispos di Kristu\"\n    ],\n    \"ERAS\": [\n      \"AK\",\n      \"DK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janeru\",\n      \"Febreru\",\n      \"Marsu\",\n      \"Abril\",\n      \"Maiu\",\n      \"Junhu\",\n      \"Julhu\",\n      \"Agostu\",\n      \"Setenbru\",\n      \"Otubru\",\n      \"Nuvenbru\",\n      \"Dizenbru\"\n    ],\n    \"SHORTDAY\": [\n      \"dum\",\n      \"sig\",\n      \"ter\",\n      \"kua\",\n      \"kin\",\n      \"ses\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Abr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Set\",\n      \"Otu\",\n      \"Nuv\",\n      \"Diz\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janeru\",\n      \"Febreru\",\n      \"Marsu\",\n      \"Abril\",\n      \"Maiu\",\n      \"Junhu\",\n      \"Julhu\",\n      \"Agostu\",\n      \"Setenbru\",\n      \"Otubru\",\n      \"Nuvenbru\",\n      \"Dizenbru\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'di' MMMM 'di' y\",\n    \"longDate\": \"d 'di' MMMM 'di' y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CVE\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"kea\",\n  \"localeID\": \"kea\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_khq-ml.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Adduha\",\n      \"Aluula\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atini\",\n      \"Atalata\",\n      \"Alarba\",\n      \"Alhamiisa\",\n      \"Aljuma\",\n      \"Assabdu\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa jamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alj\",\n      \"Ass\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"khq-ml\",\n  \"localeID\": \"khq_ML\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_khq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Adduha\",\n      \"Aluula\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atini\",\n      \"Atalata\",\n      \"Alarba\",\n      \"Alhamiisa\",\n      \"Aljuma\",\n      \"Assabdu\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa jamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alj\",\n      \"Ass\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"khq\",\n  \"localeID\": \"khq\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ki-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Kiroko\",\n      \"Hwa\\u0129-in\\u0129\"\n    ],\n    \"DAY\": [\n      \"Kiumia\",\n      \"Njumatat\\u0169\",\n      \"Njumaine\",\n      \"Njumatana\",\n      \"Aramithi\",\n      \"Njumaa\",\n      \"Njumamothi\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Kristo\",\n      \"Thutha wa Kristo\"\n    ],\n    \"ERAS\": [\n      \"MK\",\n      \"TK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Njenuar\\u0129\",\n      \"Mwere wa ker\\u0129\",\n      \"Mwere wa gatat\\u0169\",\n      \"Mwere wa kana\",\n      \"Mwere wa gatano\",\n      \"Mwere wa gatandat\\u0169\",\n      \"Mwere wa m\\u0169gwanja\",\n      \"Mwere wa kanana\",\n      \"Mwere wa kenda\",\n      \"Mwere wa ik\\u0169mi\",\n      \"Mwere wa ik\\u0169mi na \\u0169mwe\",\n      \"Ndithemba\"\n    ],\n    \"SHORTDAY\": [\n      \"KMA\",\n      \"NTT\",\n      \"NMN\",\n      \"NMT\",\n      \"ART\",\n      \"NMA\",\n      \"NMM\"\n    ],\n    \"SHORTMONTH\": [\n      \"JEN\",\n      \"WKR\",\n      \"WGT\",\n      \"WKN\",\n      \"WTN\",\n      \"WTD\",\n      \"WMJ\",\n      \"WNN\",\n      \"WKD\",\n      \"WIK\",\n      \"WMW\",\n      \"DIT\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Njenuar\\u0129\",\n      \"Mwere wa ker\\u0129\",\n      \"Mwere wa gatat\\u0169\",\n      \"Mwere wa kana\",\n      \"Mwere wa gatano\",\n      \"Mwere wa gatandat\\u0169\",\n      \"Mwere wa m\\u0169gwanja\",\n      \"Mwere wa kanana\",\n      \"Mwere wa kenda\",\n      \"Mwere wa ik\\u0169mi\",\n      \"Mwere wa ik\\u0169mi na \\u0169mwe\",\n      \"Ndithemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ki-ke\",\n  \"localeID\": \"ki_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ki.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Kiroko\",\n      \"Hwa\\u0129-in\\u0129\"\n    ],\n    \"DAY\": [\n      \"Kiumia\",\n      \"Njumatat\\u0169\",\n      \"Njumaine\",\n      \"Njumatana\",\n      \"Aramithi\",\n      \"Njumaa\",\n      \"Njumamothi\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Kristo\",\n      \"Thutha wa Kristo\"\n    ],\n    \"ERAS\": [\n      \"MK\",\n      \"TK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Njenuar\\u0129\",\n      \"Mwere wa ker\\u0129\",\n      \"Mwere wa gatat\\u0169\",\n      \"Mwere wa kana\",\n      \"Mwere wa gatano\",\n      \"Mwere wa gatandat\\u0169\",\n      \"Mwere wa m\\u0169gwanja\",\n      \"Mwere wa kanana\",\n      \"Mwere wa kenda\",\n      \"Mwere wa ik\\u0169mi\",\n      \"Mwere wa ik\\u0169mi na \\u0169mwe\",\n      \"Ndithemba\"\n    ],\n    \"SHORTDAY\": [\n      \"KMA\",\n      \"NTT\",\n      \"NMN\",\n      \"NMT\",\n      \"ART\",\n      \"NMA\",\n      \"NMM\"\n    ],\n    \"SHORTMONTH\": [\n      \"JEN\",\n      \"WKR\",\n      \"WGT\",\n      \"WKN\",\n      \"WTN\",\n      \"WTD\",\n      \"WMJ\",\n      \"WNN\",\n      \"WKD\",\n      \"WIK\",\n      \"WMW\",\n      \"DIT\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Njenuar\\u0129\",\n      \"Mwere wa ker\\u0129\",\n      \"Mwere wa gatat\\u0169\",\n      \"Mwere wa kana\",\n      \"Mwere wa gatano\",\n      \"Mwere wa gatandat\\u0169\",\n      \"Mwere wa m\\u0169gwanja\",\n      \"Mwere wa kanana\",\n      \"Mwere wa kenda\",\n      \"Mwere wa ik\\u0169mi\",\n      \"Mwere wa ik\\u0169mi na \\u0169mwe\",\n      \"Ndithemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ki\",\n  \"localeID\": \"ki\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kk-kz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0436\\u0435\\u043a\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0434\\u04af\\u0439\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0441\\u0435\\u0439\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0441\\u04d9\\u0440\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0431\\u0435\\u0439\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0436\\u04b1\\u043c\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0431\\u0456\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0411\\u0456\\u0437\\u0434\\u0456\\u04a3 \\u0437\\u0430\\u043c\\u0430\\u043d\\u044b\\u043c\\u044b\\u0437\\u0493\\u0430 \\u0434\\u0435\\u0439\\u0456\\u043d\",\n      \"\\u0411\\u0456\\u0437\\u0434\\u0456\\u04a3 \\u0437\\u0430\\u043c\\u0430\\u043d\\u044b\\u043c\\u044b\\u0437\"\n    ],\n    \"ERAS\": [\n      \"\\u0431.\\u0437.\\u0434.\",\n      \"\\u0431.\\u0437.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u049b\\u0430\\u04a3\\u0442\\u0430\\u0440\",\n      \"\\u0430\\u049b\\u043f\\u0430\\u043d\",\n      \"\\u043d\\u0430\\u0443\\u0440\\u044b\\u0437\",\n      \"\\u0441\\u04d9\\u0443\\u0456\\u0440\",\n      \"\\u043c\\u0430\\u043c\\u044b\\u0440\",\n      \"\\u043c\\u0430\\u0443\\u0441\\u044b\\u043c\",\n      \"\\u0448\\u0456\\u043b\\u0434\\u0435\",\n      \"\\u0442\\u0430\\u043c\\u044b\\u0437\",\n      \"\\u049b\\u044b\\u0440\\u043a\\u04af\\u0439\\u0435\\u043a\",\n      \"\\u049b\\u0430\\u0437\\u0430\\u043d\",\n      \"\\u049b\\u0430\\u0440\\u0430\\u0448\\u0430\",\n      \"\\u0436\\u0435\\u043b\\u0442\\u043e\\u049b\\u0441\\u0430\\u043d\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0416\\u0441\",\n      \"\\u0414\\u0441\",\n      \"\\u0421\\u0441\",\n      \"\\u0421\\u0440\",\n      \"\\u0411\\u0441\",\n      \"\\u0416\\u043c\",\n      \"\\u0421\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u049b\\u0430\\u04a3.\",\n      \"\\u0430\\u049b\\u043f.\",\n      \"\\u043d\\u0430\\u0443.\",\n      \"\\u0441\\u04d9\\u0443.\",\n      \"\\u043c\\u0430\\u043c.\",\n      \"\\u043c\\u0430\\u0443.\",\n      \"\\u0448\\u0456\\u043b.\",\n      \"\\u0442\\u0430\\u043c.\",\n      \"\\u049b\\u044b\\u0440.\",\n      \"\\u049b\\u0430\\u0437.\",\n      \"\\u049b\\u0430\\u0440.\",\n      \"\\u0436\\u0435\\u043b.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u049a\\u0430\\u04a3\\u0442\\u0430\\u0440\",\n      \"\\u0410\\u049b\\u043f\\u0430\\u043d\",\n      \"\\u041d\\u0430\\u0443\\u0440\\u044b\\u0437\",\n      \"\\u0421\\u04d9\\u0443\\u0456\\u0440\",\n      \"\\u041c\\u0430\\u043c\\u044b\\u0440\",\n      \"\\u041c\\u0430\\u0443\\u0441\\u044b\\u043c\",\n      \"\\u0428\\u0456\\u043b\\u0434\\u0435\",\n      \"\\u0422\\u0430\\u043c\\u044b\\u0437\",\n      \"\\u049a\\u044b\\u0440\\u043a\\u04af\\u0439\\u0435\\u043a\",\n      \"\\u049a\\u0430\\u0437\\u0430\\u043d\",\n      \"\\u049a\\u0430\\u0440\\u0430\\u0448\\u0430\",\n      \"\\u0416\\u0435\\u043b\\u0442\\u043e\\u049b\\u0441\\u0430\\u043d\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y '\\u0436'. d MMMM, EEEE\",\n    \"longDate\": \"y '\\u0436'. d MMMM\",\n    \"medium\": \"y '\\u0436'. dd MMM HH:mm:ss\",\n    \"mediumDate\": \"y '\\u0436'. dd MMM\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b8\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"kk-kz\",\n  \"localeID\": \"kk_KZ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0436\\u0435\\u043a\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0434\\u04af\\u0439\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0441\\u0435\\u0439\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0441\\u04d9\\u0440\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0431\\u0435\\u0439\\u0441\\u0435\\u043d\\u0431\\u0456\",\n      \"\\u0436\\u04b1\\u043c\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0431\\u0456\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0411\\u0456\\u0437\\u0434\\u0456\\u04a3 \\u0437\\u0430\\u043c\\u0430\\u043d\\u044b\\u043c\\u044b\\u0437\\u0493\\u0430 \\u0434\\u0435\\u0439\\u0456\\u043d\",\n      \"\\u0411\\u0456\\u0437\\u0434\\u0456\\u04a3 \\u0437\\u0430\\u043c\\u0430\\u043d\\u044b\\u043c\\u044b\\u0437\"\n    ],\n    \"ERAS\": [\n      \"\\u0431.\\u0437.\\u0434.\",\n      \"\\u0431.\\u0437.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u049b\\u0430\\u04a3\\u0442\\u0430\\u0440\",\n      \"\\u0430\\u049b\\u043f\\u0430\\u043d\",\n      \"\\u043d\\u0430\\u0443\\u0440\\u044b\\u0437\",\n      \"\\u0441\\u04d9\\u0443\\u0456\\u0440\",\n      \"\\u043c\\u0430\\u043c\\u044b\\u0440\",\n      \"\\u043c\\u0430\\u0443\\u0441\\u044b\\u043c\",\n      \"\\u0448\\u0456\\u043b\\u0434\\u0435\",\n      \"\\u0442\\u0430\\u043c\\u044b\\u0437\",\n      \"\\u049b\\u044b\\u0440\\u043a\\u04af\\u0439\\u0435\\u043a\",\n      \"\\u049b\\u0430\\u0437\\u0430\\u043d\",\n      \"\\u049b\\u0430\\u0440\\u0430\\u0448\\u0430\",\n      \"\\u0436\\u0435\\u043b\\u0442\\u043e\\u049b\\u0441\\u0430\\u043d\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0416\\u0441\",\n      \"\\u0414\\u0441\",\n      \"\\u0421\\u0441\",\n      \"\\u0421\\u0440\",\n      \"\\u0411\\u0441\",\n      \"\\u0416\\u043c\",\n      \"\\u0421\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u049b\\u0430\\u04a3.\",\n      \"\\u0430\\u049b\\u043f.\",\n      \"\\u043d\\u0430\\u0443.\",\n      \"\\u0441\\u04d9\\u0443.\",\n      \"\\u043c\\u0430\\u043c.\",\n      \"\\u043c\\u0430\\u0443.\",\n      \"\\u0448\\u0456\\u043b.\",\n      \"\\u0442\\u0430\\u043c.\",\n      \"\\u049b\\u044b\\u0440.\",\n      \"\\u049b\\u0430\\u0437.\",\n      \"\\u049b\\u0430\\u0440.\",\n      \"\\u0436\\u0435\\u043b.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u049a\\u0430\\u04a3\\u0442\\u0430\\u0440\",\n      \"\\u0410\\u049b\\u043f\\u0430\\u043d\",\n      \"\\u041d\\u0430\\u0443\\u0440\\u044b\\u0437\",\n      \"\\u0421\\u04d9\\u0443\\u0456\\u0440\",\n      \"\\u041c\\u0430\\u043c\\u044b\\u0440\",\n      \"\\u041c\\u0430\\u0443\\u0441\\u044b\\u043c\",\n      \"\\u0428\\u0456\\u043b\\u0434\\u0435\",\n      \"\\u0422\\u0430\\u043c\\u044b\\u0437\",\n      \"\\u049a\\u044b\\u0440\\u043a\\u04af\\u0439\\u0435\\u043a\",\n      \"\\u049a\\u0430\\u0437\\u0430\\u043d\",\n      \"\\u049a\\u0430\\u0440\\u0430\\u0448\\u0430\",\n      \"\\u0416\\u0435\\u043b\\u0442\\u043e\\u049b\\u0441\\u0430\\u043d\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y '\\u0436'. d MMMM, EEEE\",\n    \"longDate\": \"y '\\u0436'. d MMMM\",\n    \"medium\": \"y '\\u0436'. dd MMM HH:mm:ss\",\n    \"mediumDate\": \"y '\\u0436'. dd MMM\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b8\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"kk\",\n  \"localeID\": \"kk\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kkj-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"s\\u0254ndi\",\n      \"lundi\",\n      \"mardi\",\n      \"m\\u025brk\\u025br\\u025bdi\",\n      \"yedi\",\n      \"va\\u014bd\\u025br\\u025bdi\",\n      \"m\\u0254n\\u0254 s\\u0254ndi\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"pamba\",\n      \"wanja\",\n      \"mbiy\\u0254 m\\u025bndo\\u014bg\\u0254\",\n      \"Ny\\u0254l\\u0254mb\\u0254\\u014bg\\u0254\",\n      \"M\\u0254n\\u0254 \\u014bgbanja\",\n      \"Nya\\u014bgw\\u025b \\u014bgbanja\",\n      \"ku\\u014bgw\\u025b\",\n      \"f\\u025b\",\n      \"njapi\",\n      \"nyukul\",\n      \"11\",\n      \"\\u0253ul\\u0253us\\u025b\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254ndi\",\n      \"lundi\",\n      \"mardi\",\n      \"m\\u025brk\\u025br\\u025bdi\",\n      \"yedi\",\n      \"va\\u014bd\\u025br\\u025bdi\",\n      \"m\\u0254n\\u0254 s\\u0254ndi\"\n    ],\n    \"SHORTMONTH\": [\n      \"pamba\",\n      \"wanja\",\n      \"mbiy\\u0254 m\\u025bndo\\u014bg\\u0254\",\n      \"Ny\\u0254l\\u0254mb\\u0254\\u014bg\\u0254\",\n      \"M\\u0254n\\u0254 \\u014bgbanja\",\n      \"Nya\\u014bgw\\u025b \\u014bgbanja\",\n      \"ku\\u014bgw\\u025b\",\n      \"f\\u025b\",\n      \"njapi\",\n      \"nyukul\",\n      \"11\",\n      \"\\u0253ul\\u0253us\\u025b\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"pamba\",\n      \"wanja\",\n      \"mbiy\\u0254 m\\u025bndo\\u014bg\\u0254\",\n      \"Ny\\u0254l\\u0254mb\\u0254\\u014bg\\u0254\",\n      \"M\\u0254n\\u0254 \\u014bgbanja\",\n      \"Nya\\u014bgw\\u025b \\u014bgbanja\",\n      \"ku\\u014bgw\\u025b\",\n      \"f\\u025b\",\n      \"njapi\",\n      \"nyukul\",\n      \"11\",\n      \"\\u0253ul\\u0253us\\u025b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM y HH:mm\",\n    \"shortDate\": \"dd/MM y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kkj-cm\",\n  \"localeID\": \"kkj_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kkj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"s\\u0254ndi\",\n      \"lundi\",\n      \"mardi\",\n      \"m\\u025brk\\u025br\\u025bdi\",\n      \"yedi\",\n      \"va\\u014bd\\u025br\\u025bdi\",\n      \"m\\u0254n\\u0254 s\\u0254ndi\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"pamba\",\n      \"wanja\",\n      \"mbiy\\u0254 m\\u025bndo\\u014bg\\u0254\",\n      \"Ny\\u0254l\\u0254mb\\u0254\\u014bg\\u0254\",\n      \"M\\u0254n\\u0254 \\u014bgbanja\",\n      \"Nya\\u014bgw\\u025b \\u014bgbanja\",\n      \"ku\\u014bgw\\u025b\",\n      \"f\\u025b\",\n      \"njapi\",\n      \"nyukul\",\n      \"11\",\n      \"\\u0253ul\\u0253us\\u025b\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254ndi\",\n      \"lundi\",\n      \"mardi\",\n      \"m\\u025brk\\u025br\\u025bdi\",\n      \"yedi\",\n      \"va\\u014bd\\u025br\\u025bdi\",\n      \"m\\u0254n\\u0254 s\\u0254ndi\"\n    ],\n    \"SHORTMONTH\": [\n      \"pamba\",\n      \"wanja\",\n      \"mbiy\\u0254 m\\u025bndo\\u014bg\\u0254\",\n      \"Ny\\u0254l\\u0254mb\\u0254\\u014bg\\u0254\",\n      \"M\\u0254n\\u0254 \\u014bgbanja\",\n      \"Nya\\u014bgw\\u025b \\u014bgbanja\",\n      \"ku\\u014bgw\\u025b\",\n      \"f\\u025b\",\n      \"njapi\",\n      \"nyukul\",\n      \"11\",\n      \"\\u0253ul\\u0253us\\u025b\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"pamba\",\n      \"wanja\",\n      \"mbiy\\u0254 m\\u025bndo\\u014bg\\u0254\",\n      \"Ny\\u0254l\\u0254mb\\u0254\\u014bg\\u0254\",\n      \"M\\u0254n\\u0254 \\u014bgbanja\",\n      \"Nya\\u014bgw\\u025b \\u014bgbanja\",\n      \"ku\\u014bgw\\u025b\",\n      \"f\\u025b\",\n      \"njapi\",\n      \"nyukul\",\n      \"11\",\n      \"\\u0253ul\\u0253us\\u025b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM y HH:mm\",\n    \"shortDate\": \"dd/MM y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kkj\",\n  \"localeID\": \"kkj\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kl-gl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"sabaat\",\n      \"ataasinngorneq\",\n      \"marlunngorneq\",\n      \"pingasunngorneq\",\n      \"sisamanngorneq\",\n      \"tallimanngorneq\",\n      \"arfininngorneq\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"martsi\",\n      \"aprili\",\n      \"maji\",\n      \"juni\",\n      \"juli\",\n      \"augustusi\",\n      \"septemberi\",\n      \"oktoberi\",\n      \"novemberi\",\n      \"decemberi\"\n    ],\n    \"SHORTDAY\": [\n      \"sab\",\n      \"ata\",\n      \"mar\",\n      \"pin\",\n      \"sis\",\n      \"tal\",\n      \"arf\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"aug\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"martsi\",\n      \"aprili\",\n      \"maji\",\n      \"juni\",\n      \"juli\",\n      \"augustusi\",\n      \"septemberi\",\n      \"oktoberi\",\n      \"novemberi\",\n      \"decemberi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kl-gl\",\n  \"localeID\": \"kl_GL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"sabaat\",\n      \"ataasinngorneq\",\n      \"marlunngorneq\",\n      \"pingasunngorneq\",\n      \"sisamanngorneq\",\n      \"tallimanngorneq\",\n      \"arfininngorneq\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"martsi\",\n      \"aprili\",\n      \"maji\",\n      \"juni\",\n      \"juli\",\n      \"augustusi\",\n      \"septemberi\",\n      \"oktoberi\",\n      \"novemberi\",\n      \"decemberi\"\n    ],\n    \"SHORTDAY\": [\n      \"sab\",\n      \"ata\",\n      \"mar\",\n      \"pin\",\n      \"sis\",\n      \"tal\",\n      \"arf\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"aug\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"martsi\",\n      \"aprili\",\n      \"maji\",\n      \"juni\",\n      \"juli\",\n      \"augustusi\",\n      \"septemberi\",\n      \"oktoberi\",\n      \"novemberi\",\n      \"decemberi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kl\",\n  \"localeID\": \"kl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kln-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"karoon\",\n      \"kooskoliny\"\n    ],\n    \"DAY\": [\n      \"Kotisap\",\n      \"Kotaai\",\n      \"Koaeng\\u2019\",\n      \"Kosomok\",\n      \"Koang\\u2019wan\",\n      \"Komuut\",\n      \"Kolo\"\n    ],\n    \"ERANAMES\": [\n      \"Amait kesich Jesu\",\n      \"Kokakesich Jesu\"\n    ],\n    \"ERAS\": [\n      \"AM\",\n      \"KO\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mulgul\",\n      \"Ng\\u2019atyaato\",\n      \"Kiptaamo\",\n      \"Iwootkuut\",\n      \"Mamuut\",\n      \"Paagi\",\n      \"Ng\\u2019eiyeet\",\n      \"Rooptui\",\n      \"Bureet\",\n      \"Epeeso\",\n      \"Kipsuunde ne taai\",\n      \"Kipsuunde nebo aeng\\u2019\"\n    ],\n    \"SHORTDAY\": [\n      \"Kts\",\n      \"Kot\",\n      \"Koo\",\n      \"Kos\",\n      \"Koa\",\n      \"Kom\",\n      \"Kol\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mul\",\n      \"Ngat\",\n      \"Taa\",\n      \"Iwo\",\n      \"Mam\",\n      \"Paa\",\n      \"Nge\",\n      \"Roo\",\n      \"Bur\",\n      \"Epe\",\n      \"Kpt\",\n      \"Kpa\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mulgul\",\n      \"Ng\\u2019atyaato\",\n      \"Kiptaamo\",\n      \"Iwootkuut\",\n      \"Mamuut\",\n      \"Paagi\",\n      \"Ng\\u2019eiyeet\",\n      \"Rooptui\",\n      \"Bureet\",\n      \"Epeeso\",\n      \"Kipsuunde ne taai\",\n      \"Kipsuunde nebo aeng\\u2019\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kln-ke\",\n  \"localeID\": \"kln_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kln.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"karoon\",\n      \"kooskoliny\"\n    ],\n    \"DAY\": [\n      \"Kotisap\",\n      \"Kotaai\",\n      \"Koaeng\\u2019\",\n      \"Kosomok\",\n      \"Koang\\u2019wan\",\n      \"Komuut\",\n      \"Kolo\"\n    ],\n    \"ERANAMES\": [\n      \"Amait kesich Jesu\",\n      \"Kokakesich Jesu\"\n    ],\n    \"ERAS\": [\n      \"AM\",\n      \"KO\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mulgul\",\n      \"Ng\\u2019atyaato\",\n      \"Kiptaamo\",\n      \"Iwootkuut\",\n      \"Mamuut\",\n      \"Paagi\",\n      \"Ng\\u2019eiyeet\",\n      \"Rooptui\",\n      \"Bureet\",\n      \"Epeeso\",\n      \"Kipsuunde ne taai\",\n      \"Kipsuunde nebo aeng\\u2019\"\n    ],\n    \"SHORTDAY\": [\n      \"Kts\",\n      \"Kot\",\n      \"Koo\",\n      \"Kos\",\n      \"Koa\",\n      \"Kom\",\n      \"Kol\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mul\",\n      \"Ngat\",\n      \"Taa\",\n      \"Iwo\",\n      \"Mam\",\n      \"Paa\",\n      \"Nge\",\n      \"Roo\",\n      \"Bur\",\n      \"Epe\",\n      \"Kpt\",\n      \"Kpa\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mulgul\",\n      \"Ng\\u2019atyaato\",\n      \"Kiptaamo\",\n      \"Iwootkuut\",\n      \"Mamuut\",\n      \"Paagi\",\n      \"Ng\\u2019eiyeet\",\n      \"Rooptui\",\n      \"Bureet\",\n      \"Epeeso\",\n      \"Kipsuunde ne taai\",\n      \"Kipsuunde nebo aeng\\u2019\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kln\",\n  \"localeID\": \"kln\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_km-kh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u17a2\\u17b6\\u1791\\u17b7\\u178f\\u17d2\\u1799\",\n      \"\\u1785\\u17d0\\u1793\\u17d2\\u1791\",\n      \"\\u17a2\\u1784\\u17d2\\u1782\\u17b6\\u179a\",\n      \"\\u1796\\u17bb\\u1792\",\n      \"\\u1796\\u17d2\\u179a\\u17a0\\u179f\\u17d2\\u1794\\u178f\\u17b7\\u17cd\",\n      \"\\u179f\\u17bb\\u1780\\u17d2\\u179a\",\n      \"\\u179f\\u17c5\\u179a\\u17cd\"\n    ],\n    \"ERANAMES\": [\n      \"\\u1798\\u17bb\\u1793\\u200b\\u1782\\u17d2\\u179a\\u17b7\\u179f\\u17d2\\u178f\\u179f\\u1780\\u179a\\u17b6\\u1787\",\n      \"\\u1782\\u17d2\\u179a\\u17b7\\u179f\\u17d2\\u178f\\u179f\\u1780\\u179a\\u17b6\\u1787\"\n    ],\n    \"ERAS\": [\n      \"\\u1798\\u17bb\\u1793 \\u1782.\\u179f.\",\n      \"\\u1782.\\u179f.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1798\\u1780\\u179a\\u17b6\",\n      \"\\u1780\\u17bb\\u1798\\u17d2\\u1797\\u17c8\",\n      \"\\u1798\\u17b8\\u1793\\u17b6\",\n      \"\\u1798\\u17c1\\u179f\\u17b6\",\n      \"\\u17a7\\u179f\\u1797\\u17b6\",\n      \"\\u1798\\u17b7\\u1790\\u17bb\\u1793\\u17b6\",\n      \"\\u1780\\u1780\\u17d2\\u1780\\u178a\\u17b6\",\n      \"\\u179f\\u17b8\\u17a0\\u17b6\",\n      \"\\u1780\\u1789\\u17d2\\u1789\\u17b6\",\n      \"\\u178f\\u17bb\\u179b\\u17b6\",\n      \"\\u179c\\u17b7\\u1785\\u17d2\\u1786\\u17b7\\u1780\\u17b6\",\n      \"\\u1792\\u17d2\\u1793\\u17bc\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u17a2\\u17b6\\u1791\\u17b7\\u178f\\u17d2\\u1799\",\n      \"\\u1785\\u17d0\\u1793\\u17d2\\u1791\",\n      \"\\u17a2\\u1784\\u17d2\\u1782\\u17b6\\u179a\",\n      \"\\u1796\\u17bb\\u1792\",\n      \"\\u1796\\u17d2\\u179a\\u17a0\\u179f\\u17d2\\u1794\\u178f\\u17b7\\u17cd\",\n      \"\\u179f\\u17bb\\u1780\\u17d2\\u179a\",\n      \"\\u179f\\u17c5\\u179a\\u17cd\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1798\\u1780\\u179a\\u17b6\",\n      \"\\u1780\\u17bb\\u1798\\u17d2\\u1797\\u17c8\",\n      \"\\u1798\\u17b8\\u1793\\u17b6\",\n      \"\\u1798\\u17c1\\u179f\\u17b6\",\n      \"\\u17a7\\u179f\\u1797\\u17b6\",\n      \"\\u1798\\u17b7\\u1790\\u17bb\\u1793\\u17b6\",\n      \"\\u1780\\u1780\\u17d2\\u1780\\u178a\\u17b6\",\n      \"\\u179f\\u17b8\\u17a0\\u17b6\",\n      \"\\u1780\\u1789\\u17d2\\u1789\\u17b6\",\n      \"\\u178f\\u17bb\\u179b\\u17b6\",\n      \"\\u179c\\u17b7\\u1785\\u17d2\\u1786\\u17b7\\u1780\\u17b6\",\n      \"\\u1792\\u17d2\\u1793\\u17bc\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1798\\u1780\\u179a\\u17b6\",\n      \"\\u1780\\u17bb\\u1798\\u17d2\\u1797\\u17c8\",\n      \"\\u1798\\u17b8\\u1793\\u17b6\",\n      \"\\u1798\\u17c1\\u179f\\u17b6\",\n      \"\\u17a7\\u179f\\u1797\\u17b6\",\n      \"\\u1798\\u17b7\\u1790\\u17bb\\u1793\\u17b6\",\n      \"\\u1780\\u1780\\u17d2\\u1780\\u178a\\u17b6\",\n      \"\\u179f\\u17b8\\u17a0\\u17b6\",\n      \"\\u1780\\u1789\\u17d2\\u1789\\u17b6\",\n      \"\\u178f\\u17bb\\u179b\\u17b6\",\n      \"\\u179c\\u17b7\\u1785\\u17d2\\u1786\\u17b7\\u1780\\u17b6\",\n      \"\\u1792\\u17d2\\u1793\\u17bc\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Riel\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"km-kh\",\n  \"localeID\": \"km_KH\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_km.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u17a2\\u17b6\\u1791\\u17b7\\u178f\\u17d2\\u1799\",\n      \"\\u1785\\u17d0\\u1793\\u17d2\\u1791\",\n      \"\\u17a2\\u1784\\u17d2\\u1782\\u17b6\\u179a\",\n      \"\\u1796\\u17bb\\u1792\",\n      \"\\u1796\\u17d2\\u179a\\u17a0\\u179f\\u17d2\\u1794\\u178f\\u17b7\\u17cd\",\n      \"\\u179f\\u17bb\\u1780\\u17d2\\u179a\",\n      \"\\u179f\\u17c5\\u179a\\u17cd\"\n    ],\n    \"ERANAMES\": [\n      \"\\u1798\\u17bb\\u1793\\u200b\\u1782\\u17d2\\u179a\\u17b7\\u179f\\u17d2\\u178f\\u179f\\u1780\\u179a\\u17b6\\u1787\",\n      \"\\u1782\\u17d2\\u179a\\u17b7\\u179f\\u17d2\\u178f\\u179f\\u1780\\u179a\\u17b6\\u1787\"\n    ],\n    \"ERAS\": [\n      \"\\u1798\\u17bb\\u1793 \\u1782.\\u179f.\",\n      \"\\u1782.\\u179f.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1798\\u1780\\u179a\\u17b6\",\n      \"\\u1780\\u17bb\\u1798\\u17d2\\u1797\\u17c8\",\n      \"\\u1798\\u17b8\\u1793\\u17b6\",\n      \"\\u1798\\u17c1\\u179f\\u17b6\",\n      \"\\u17a7\\u179f\\u1797\\u17b6\",\n      \"\\u1798\\u17b7\\u1790\\u17bb\\u1793\\u17b6\",\n      \"\\u1780\\u1780\\u17d2\\u1780\\u178a\\u17b6\",\n      \"\\u179f\\u17b8\\u17a0\\u17b6\",\n      \"\\u1780\\u1789\\u17d2\\u1789\\u17b6\",\n      \"\\u178f\\u17bb\\u179b\\u17b6\",\n      \"\\u179c\\u17b7\\u1785\\u17d2\\u1786\\u17b7\\u1780\\u17b6\",\n      \"\\u1792\\u17d2\\u1793\\u17bc\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u17a2\\u17b6\\u1791\\u17b7\\u178f\\u17d2\\u1799\",\n      \"\\u1785\\u17d0\\u1793\\u17d2\\u1791\",\n      \"\\u17a2\\u1784\\u17d2\\u1782\\u17b6\\u179a\",\n      \"\\u1796\\u17bb\\u1792\",\n      \"\\u1796\\u17d2\\u179a\\u17a0\\u179f\\u17d2\\u1794\\u178f\\u17b7\\u17cd\",\n      \"\\u179f\\u17bb\\u1780\\u17d2\\u179a\",\n      \"\\u179f\\u17c5\\u179a\\u17cd\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1798\\u1780\\u179a\\u17b6\",\n      \"\\u1780\\u17bb\\u1798\\u17d2\\u1797\\u17c8\",\n      \"\\u1798\\u17b8\\u1793\\u17b6\",\n      \"\\u1798\\u17c1\\u179f\\u17b6\",\n      \"\\u17a7\\u179f\\u1797\\u17b6\",\n      \"\\u1798\\u17b7\\u1790\\u17bb\\u1793\\u17b6\",\n      \"\\u1780\\u1780\\u17d2\\u1780\\u178a\\u17b6\",\n      \"\\u179f\\u17b8\\u17a0\\u17b6\",\n      \"\\u1780\\u1789\\u17d2\\u1789\\u17b6\",\n      \"\\u178f\\u17bb\\u179b\\u17b6\",\n      \"\\u179c\\u17b7\\u1785\\u17d2\\u1786\\u17b7\\u1780\\u17b6\",\n      \"\\u1792\\u17d2\\u1793\\u17bc\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1798\\u1780\\u179a\\u17b6\",\n      \"\\u1780\\u17bb\\u1798\\u17d2\\u1797\\u17c8\",\n      \"\\u1798\\u17b8\\u1793\\u17b6\",\n      \"\\u1798\\u17c1\\u179f\\u17b6\",\n      \"\\u17a7\\u179f\\u1797\\u17b6\",\n      \"\\u1798\\u17b7\\u1790\\u17bb\\u1793\\u17b6\",\n      \"\\u1780\\u1780\\u17d2\\u1780\\u178a\\u17b6\",\n      \"\\u179f\\u17b8\\u17a0\\u17b6\",\n      \"\\u1780\\u1789\\u17d2\\u1789\\u17b6\",\n      \"\\u178f\\u17bb\\u179b\\u17b6\",\n      \"\\u179c\\u17b7\\u1785\\u17d2\\u1786\\u17b7\\u1780\\u17b6\",\n      \"\\u1792\\u17d2\\u1793\\u17bc\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Riel\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"km\",\n  \"localeID\": \"km\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kn-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0caa\\u0cc2\\u0cb0\\u0ccd\\u0cb5\\u0cbe\\u0cb9\\u0ccd\\u0ca8\",\n      \"\\u0c85\\u0caa\\u0cb0\\u0cbe\\u0cb9\\u0ccd\\u0ca8\"\n    ],\n    \"DAY\": [\n      \"\\u0cad\\u0cbe\\u0ca8\\u0cc1\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cb8\\u0ccb\\u0cae\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cae\\u0c82\\u0c97\\u0cb3\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cac\\u0cc1\\u0ca7\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0c97\\u0cc1\\u0cb0\\u0cc1\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cb6\\u0cc1\\u0c95\\u0ccd\\u0cb0\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cb6\\u0ca8\\u0cbf\\u0cb5\\u0cbe\\u0cb0\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0cb8\\u0ccd\\u0ca4 \\u0caa\\u0cc2\\u0cb0\\u0ccd\\u0cb5\",\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0cb8\\u0ccd\\u0ca4 \\u0cb6\\u0c95\"\n    ],\n    \"ERAS\": [\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf.\\u0caa\\u0cc2\",\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf.\\u0cb6\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0c9c\\u0ca8\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cab\\u0cc6\\u0cac\\u0ccd\\u0cb0\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cae\\u0cbe\\u0cb0\\u0ccd\\u0c9a\\u0ccd\",\n      \"\\u0c8f\\u0caa\\u0ccd\\u0cb0\\u0cbf\\u0cb2\\u0ccd\",\n      \"\\u0cae\\u0cc7\",\n      \"\\u0c9c\\u0cc2\\u0ca8\\u0ccd\",\n      \"\\u0c9c\\u0cc1\\u0cb2\\u0cc8\",\n      \"\\u0c86\\u0c97\\u0cb8\\u0ccd\\u0c9f\\u0ccd\",\n      \"\\u0cb8\\u0cc6\\u0caa\\u0ccd\\u0c9f\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0c85\\u0c95\\u0ccd\\u0c9f\\u0ccb\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca8\\u0cb5\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca1\\u0cbf\\u0cb8\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0cad\\u0cbe\\u0ca8\\u0cc1\",\n      \"\\u0cb8\\u0ccb\\u0cae\",\n      \"\\u0cae\\u0c82\\u0c97\\u0cb3\",\n      \"\\u0cac\\u0cc1\\u0ca7\",\n      \"\\u0c97\\u0cc1\\u0cb0\\u0cc1\",\n      \"\\u0cb6\\u0cc1\\u0c95\\u0ccd\\u0cb0\",\n      \"\\u0cb6\\u0ca8\\u0cbf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0c9c\\u0ca8\",\n      \"\\u0cab\\u0cc6\\u0cac\\u0ccd\\u0cb0\",\n      \"\\u0cae\\u0cbe\\u0cb0\\u0ccd\\u0c9a\\u0ccd\",\n      \"\\u0c8f\\u0caa\\u0ccd\\u0cb0\\u0cbf\",\n      \"\\u0cae\\u0cc7\",\n      \"\\u0c9c\\u0cc2\\u0ca8\\u0ccd\",\n      \"\\u0c9c\\u0cc1\\u0cb2\\u0cc8\",\n      \"\\u0c86\\u0c97\",\n      \"\\u0cb8\\u0cc6\\u0caa\\u0ccd\\u0c9f\\u0cc6\\u0c82\",\n      \"\\u0c85\\u0c95\\u0ccd\\u0c9f\\u0ccb\",\n      \"\\u0ca8\\u0cb5\\u0cc6\\u0c82\",\n      \"\\u0ca1\\u0cbf\\u0cb8\\u0cc6\\u0c82\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0c9c\\u0ca8\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cab\\u0cc6\\u0cac\\u0ccd\\u0cb0\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cae\\u0cbe\\u0cb0\\u0ccd\\u0c9a\\u0ccd\",\n      \"\\u0c8f\\u0caa\\u0ccd\\u0cb0\\u0cbf\\u0cb2\\u0ccd\",\n      \"\\u0cae\\u0cc7\",\n      \"\\u0c9c\\u0cc2\\u0ca8\\u0ccd\",\n      \"\\u0c9c\\u0cc1\\u0cb2\\u0cc8\",\n      \"\\u0c86\\u0c97\\u0cb8\\u0ccd\\u0c9f\\u0ccd\",\n      \"\\u0cb8\\u0cc6\\u0caa\\u0ccd\\u0c9f\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0c85\\u0c95\\u0ccd\\u0c9f\\u0ccb\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca8\\u0cb5\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca1\\u0cbf\\u0cb8\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y hh:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"hh:mm:ss a\",\n    \"short\": \"d/M/yy hh:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"hh:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kn-in\",\n  \"localeID\": \"kn_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0caa\\u0cc2\\u0cb0\\u0ccd\\u0cb5\\u0cbe\\u0cb9\\u0ccd\\u0ca8\",\n      \"\\u0c85\\u0caa\\u0cb0\\u0cbe\\u0cb9\\u0ccd\\u0ca8\"\n    ],\n    \"DAY\": [\n      \"\\u0cad\\u0cbe\\u0ca8\\u0cc1\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cb8\\u0ccb\\u0cae\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cae\\u0c82\\u0c97\\u0cb3\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cac\\u0cc1\\u0ca7\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0c97\\u0cc1\\u0cb0\\u0cc1\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cb6\\u0cc1\\u0c95\\u0ccd\\u0cb0\\u0cb5\\u0cbe\\u0cb0\",\n      \"\\u0cb6\\u0ca8\\u0cbf\\u0cb5\\u0cbe\\u0cb0\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0cb8\\u0ccd\\u0ca4 \\u0caa\\u0cc2\\u0cb0\\u0ccd\\u0cb5\",\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0cb8\\u0ccd\\u0ca4 \\u0cb6\\u0c95\"\n    ],\n    \"ERAS\": [\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf.\\u0caa\\u0cc2\",\n      \"\\u0c95\\u0ccd\\u0cb0\\u0cbf.\\u0cb6\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0c9c\\u0ca8\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cab\\u0cc6\\u0cac\\u0ccd\\u0cb0\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cae\\u0cbe\\u0cb0\\u0ccd\\u0c9a\\u0ccd\",\n      \"\\u0c8f\\u0caa\\u0ccd\\u0cb0\\u0cbf\\u0cb2\\u0ccd\",\n      \"\\u0cae\\u0cc7\",\n      \"\\u0c9c\\u0cc2\\u0ca8\\u0ccd\",\n      \"\\u0c9c\\u0cc1\\u0cb2\\u0cc8\",\n      \"\\u0c86\\u0c97\\u0cb8\\u0ccd\\u0c9f\\u0ccd\",\n      \"\\u0cb8\\u0cc6\\u0caa\\u0ccd\\u0c9f\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0c85\\u0c95\\u0ccd\\u0c9f\\u0ccb\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca8\\u0cb5\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca1\\u0cbf\\u0cb8\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0cad\\u0cbe\\u0ca8\\u0cc1\",\n      \"\\u0cb8\\u0ccb\\u0cae\",\n      \"\\u0cae\\u0c82\\u0c97\\u0cb3\",\n      \"\\u0cac\\u0cc1\\u0ca7\",\n      \"\\u0c97\\u0cc1\\u0cb0\\u0cc1\",\n      \"\\u0cb6\\u0cc1\\u0c95\\u0ccd\\u0cb0\",\n      \"\\u0cb6\\u0ca8\\u0cbf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0c9c\\u0ca8\",\n      \"\\u0cab\\u0cc6\\u0cac\\u0ccd\\u0cb0\",\n      \"\\u0cae\\u0cbe\\u0cb0\\u0ccd\\u0c9a\\u0ccd\",\n      \"\\u0c8f\\u0caa\\u0ccd\\u0cb0\\u0cbf\",\n      \"\\u0cae\\u0cc7\",\n      \"\\u0c9c\\u0cc2\\u0ca8\\u0ccd\",\n      \"\\u0c9c\\u0cc1\\u0cb2\\u0cc8\",\n      \"\\u0c86\\u0c97\",\n      \"\\u0cb8\\u0cc6\\u0caa\\u0ccd\\u0c9f\\u0cc6\\u0c82\",\n      \"\\u0c85\\u0c95\\u0ccd\\u0c9f\\u0ccb\",\n      \"\\u0ca8\\u0cb5\\u0cc6\\u0c82\",\n      \"\\u0ca1\\u0cbf\\u0cb8\\u0cc6\\u0c82\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0c9c\\u0ca8\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cab\\u0cc6\\u0cac\\u0ccd\\u0cb0\\u0cb5\\u0cb0\\u0cbf\",\n      \"\\u0cae\\u0cbe\\u0cb0\\u0ccd\\u0c9a\\u0ccd\",\n      \"\\u0c8f\\u0caa\\u0ccd\\u0cb0\\u0cbf\\u0cb2\\u0ccd\",\n      \"\\u0cae\\u0cc7\",\n      \"\\u0c9c\\u0cc2\\u0ca8\\u0ccd\",\n      \"\\u0c9c\\u0cc1\\u0cb2\\u0cc8\",\n      \"\\u0c86\\u0c97\\u0cb8\\u0ccd\\u0c9f\\u0ccd\",\n      \"\\u0cb8\\u0cc6\\u0caa\\u0ccd\\u0c9f\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0c85\\u0c95\\u0ccd\\u0c9f\\u0ccb\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca8\\u0cb5\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\",\n      \"\\u0ca1\\u0cbf\\u0cb8\\u0cc6\\u0c82\\u0cac\\u0cb0\\u0ccd\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y hh:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"hh:mm:ss a\",\n    \"short\": \"d/M/yy hh:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"hh:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kn\",\n  \"localeID\": \"kn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ko-kp.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\uc624\\uc804\",\n      \"\\uc624\\ud6c4\"\n    ],\n    \"DAY\": [\n      \"\\uc77c\\uc694\\uc77c\",\n      \"\\uc6d4\\uc694\\uc77c\",\n      \"\\ud654\\uc694\\uc77c\",\n      \"\\uc218\\uc694\\uc77c\",\n      \"\\ubaa9\\uc694\\uc77c\",\n      \"\\uae08\\uc694\\uc77c\",\n      \"\\ud1a0\\uc694\\uc77c\"\n    ],\n    \"ERANAMES\": [\n      \"\\uae30\\uc6d0\\uc804\",\n      \"\\uc11c\\uae30\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"SHORTDAY\": [\n      \"\\uc77c\",\n      \"\\uc6d4\",\n      \"\\ud654\",\n      \"\\uc218\",\n      \"\\ubaa9\",\n      \"\\uae08\",\n      \"\\ud1a0\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\ub144 M\\uc6d4 d\\uc77c EEEE\",\n    \"longDate\": \"y\\ub144 M\\uc6d4 d\\uc77c\",\n    \"medium\": \"y. M. d. a h:mm:ss\",\n    \"mediumDate\": \"y. M. d.\",\n    \"mediumTime\": \"a h:mm:ss\",\n    \"short\": \"yy. M. d. a h:mm\",\n    \"shortDate\": \"yy. M. d.\",\n    \"shortTime\": \"a h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a9KP\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ko-kp\",\n  \"localeID\": \"ko_KP\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ko-kr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\uc624\\uc804\",\n      \"\\uc624\\ud6c4\"\n    ],\n    \"DAY\": [\n      \"\\uc77c\\uc694\\uc77c\",\n      \"\\uc6d4\\uc694\\uc77c\",\n      \"\\ud654\\uc694\\uc77c\",\n      \"\\uc218\\uc694\\uc77c\",\n      \"\\ubaa9\\uc694\\uc77c\",\n      \"\\uae08\\uc694\\uc77c\",\n      \"\\ud1a0\\uc694\\uc77c\"\n    ],\n    \"ERANAMES\": [\n      \"\\uae30\\uc6d0\\uc804\",\n      \"\\uc11c\\uae30\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"SHORTDAY\": [\n      \"\\uc77c\",\n      \"\\uc6d4\",\n      \"\\ud654\",\n      \"\\uc218\",\n      \"\\ubaa9\",\n      \"\\uae08\",\n      \"\\ud1a0\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\ub144 M\\uc6d4 d\\uc77c EEEE\",\n    \"longDate\": \"y\\ub144 M\\uc6d4 d\\uc77c\",\n    \"medium\": \"y. M. d. a h:mm:ss\",\n    \"mediumDate\": \"y. M. d.\",\n    \"mediumTime\": \"a h:mm:ss\",\n    \"short\": \"yy. M. d. a h:mm\",\n    \"shortDate\": \"yy. M. d.\",\n    \"shortTime\": \"a h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ko-kr\",\n  \"localeID\": \"ko_KR\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ko.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\uc624\\uc804\",\n      \"\\uc624\\ud6c4\"\n    ],\n    \"DAY\": [\n      \"\\uc77c\\uc694\\uc77c\",\n      \"\\uc6d4\\uc694\\uc77c\",\n      \"\\ud654\\uc694\\uc77c\",\n      \"\\uc218\\uc694\\uc77c\",\n      \"\\ubaa9\\uc694\\uc77c\",\n      \"\\uae08\\uc694\\uc77c\",\n      \"\\ud1a0\\uc694\\uc77c\"\n    ],\n    \"ERANAMES\": [\n      \"\\uae30\\uc6d0\\uc804\",\n      \"\\uc11c\\uae30\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"SHORTDAY\": [\n      \"\\uc77c\",\n      \"\\uc6d4\",\n      \"\\ud654\",\n      \"\\uc218\",\n      \"\\ubaa9\",\n      \"\\uae08\",\n      \"\\ud1a0\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\uc6d4\",\n      \"2\\uc6d4\",\n      \"3\\uc6d4\",\n      \"4\\uc6d4\",\n      \"5\\uc6d4\",\n      \"6\\uc6d4\",\n      \"7\\uc6d4\",\n      \"8\\uc6d4\",\n      \"9\\uc6d4\",\n      \"10\\uc6d4\",\n      \"11\\uc6d4\",\n      \"12\\uc6d4\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\ub144 M\\uc6d4 d\\uc77c EEEE\",\n    \"longDate\": \"y\\ub144 M\\uc6d4 d\\uc77c\",\n    \"medium\": \"y. M. d. a h:mm:ss\",\n    \"mediumDate\": \"y. M. d.\",\n    \"mediumTime\": \"a h:mm:ss\",\n    \"short\": \"yy. M. d. a h:mm\",\n    \"shortDate\": \"yy. M. d.\",\n    \"shortTime\": \"a h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ko\",\n  \"localeID\": \"ko\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kok-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092e.\\u092a\\u0942.\",\n      \"\\u092e.\\u0928\\u0902.\"\n    ],\n    \"DAY\": [\n      \"\\u0906\\u0926\\u093f\\u0924\\u094d\\u092f\\u0935\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u0935\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0933\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u0935\\u093e\\u0930\",\n      \"\\u0917\\u0941\\u0930\\u0941\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u0935\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u0936\\u0916\\u093e\"\n    ],\n    \"ERAS\": [\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u0936\\u0916\\u093e\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0913\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0913\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u0935\\u093f\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0933\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u0917\\u0941\\u0930\\u0941\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0913\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0913\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0913\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0913\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kok-in\",\n  \"localeID\": \"kok_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kok.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092e.\\u092a\\u0942.\",\n      \"\\u092e.\\u0928\\u0902.\"\n    ],\n    \"DAY\": [\n      \"\\u0906\\u0926\\u093f\\u0924\\u094d\\u092f\\u0935\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u0935\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0933\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u0935\\u093e\\u0930\",\n      \"\\u0917\\u0941\\u0930\\u0941\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u0935\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u0936\\u0916\\u093e\"\n    ],\n    \"ERAS\": [\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0915\\u094d\\u0930\\u093f\\u0938\\u094d\\u0924\\u0936\\u0916\\u093e\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0913\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0913\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u0935\\u093f\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0933\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u0917\\u0941\\u0930\\u0941\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0913\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0913\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0913\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0913\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kok\",\n  \"localeID\": \"kok\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ks-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u064e\\u062a\\u06be\\u0648\\u0627\\u0631\",\n      \"\\u0698\\u0654\\u0646\\u065b\\u062f\\u0631\\u0655\\u0631\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u065a\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u062f\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0631\\u065b\\u066e\\u06ea\\u0633\\u0648\\u0627\\u0631\",\n      \"\\u062c\\u064f\\u0645\\u06c1\",\n      \"\\u0628\\u0679\\u0648\\u0627\\u0631\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0655\\u0644 \\u0645\\u0633\\u06cc\\u0656\\u062d\",\n      \"\\u0639\\u06cc\\u0656\\u0633\\u0648\\u06cc \\u0633\\u0646\\u06c1\\u0655\"\n    ],\n    \"ERAS\": [\n      \"\\u0628\\u06cc \\u0633\\u06cc\",\n      \"\\u0627\\u06d2 \\u0688\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0624\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0624\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0655\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\\u0654\",\n      \"\\u062c\\u0648\\u0657\\u0646\",\n      \"\\u062c\\u0648\\u0657\\u0644\\u0627\\u06cc\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0657\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0622\\u062a\\u06be\\u0648\\u0627\\u0631\",\n      \"\\u0698\\u0654\\u0646\\u065b\\u062f\\u0655\\u0631\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u065a\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u062f\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0631\\u065b\\u066e\\u06ea\\u0633\\u0648\\u0627\\u0631\",\n      \"\\u062c\\u064f\\u0645\\u06c1\",\n      \"\\u0628\\u0679\\u0648\\u0627\\u0631\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0624\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0624\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0655\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\\u0654\",\n      \"\\u062c\\u0648\\u0657\\u0646\",\n      \"\\u062c\\u0648\\u0657\\u0644\\u0627\\u06cc\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0657\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0624\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0624\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0655\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\\u0654\",\n      \"\\u062c\\u0648\\u0657\\u0646\",\n      \"\\u062c\\u0648\\u0657\\u0644\\u0627\\u06cc\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0657\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ks-in\",\n  \"localeID\": \"ks_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ks.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u064e\\u062a\\u06be\\u0648\\u0627\\u0631\",\n      \"\\u0698\\u0654\\u0646\\u065b\\u062f\\u0631\\u0655\\u0631\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u065a\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u062f\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0631\\u065b\\u066e\\u06ea\\u0633\\u0648\\u0627\\u0631\",\n      \"\\u062c\\u064f\\u0645\\u06c1\",\n      \"\\u0628\\u0679\\u0648\\u0627\\u0631\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0655\\u0644 \\u0645\\u0633\\u06cc\\u0656\\u062d\",\n      \"\\u0639\\u06cc\\u0656\\u0633\\u0648\\u06cc \\u0633\\u0646\\u06c1\\u0655\"\n    ],\n    \"ERAS\": [\n      \"\\u0628\\u06cc \\u0633\\u06cc\",\n      \"\\u0627\\u06d2 \\u0688\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0624\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0624\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0655\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\\u0654\",\n      \"\\u062c\\u0648\\u0657\\u0646\",\n      \"\\u062c\\u0648\\u0657\\u0644\\u0627\\u06cc\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0657\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0622\\u062a\\u06be\\u0648\\u0627\\u0631\",\n      \"\\u0698\\u0654\\u0646\\u065b\\u062f\\u0655\\u0631\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u065a\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0648\\u062f\\u0648\\u0627\\u0631\",\n      \"\\u0628\\u0631\\u065b\\u066e\\u06ea\\u0633\\u0648\\u0627\\u0631\",\n      \"\\u062c\\u064f\\u0645\\u06c1\",\n      \"\\u0628\\u0679\\u0648\\u0627\\u0631\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0624\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0624\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0655\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\\u0654\",\n      \"\\u062c\\u0648\\u0657\\u0646\",\n      \"\\u062c\\u0648\\u0657\\u0644\\u0627\\u06cc\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0657\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0624\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0624\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0655\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\\u0654\",\n      \"\\u062c\\u0648\\u0657\\u0646\",\n      \"\\u062c\\u0648\\u0657\\u0644\\u0627\\u06cc\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0657\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ks\",\n  \"localeID\": \"ks\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ksb-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"makeo\",\n      \"nyiaghuo\"\n    ],\n    \"DAY\": [\n      \"Jumaapii\",\n      \"Jumaatatu\",\n      \"Jumaane\",\n      \"Jumaatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumaamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Klisto\",\n      \"Baada ya Klisto\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januali\",\n      \"Febluali\",\n      \"Machi\",\n      \"Aplili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jmn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januali\",\n      \"Febluali\",\n      \"Machi\",\n      \"Aplili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ksb-tz\",\n  \"localeID\": \"ksb_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ksb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"makeo\",\n      \"nyiaghuo\"\n    ],\n    \"DAY\": [\n      \"Jumaapii\",\n      \"Jumaatatu\",\n      \"Jumaane\",\n      \"Jumaatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumaamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Klisto\",\n      \"Baada ya Klisto\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januali\",\n      \"Febluali\",\n      \"Machi\",\n      \"Aplili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jmn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januali\",\n      \"Febluali\",\n      \"Machi\",\n      \"Aplili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ksb\",\n  \"localeID\": \"ksb\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ksf-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"s\\u00e1r\\u00faw\\u00e1\",\n      \"c\\u025b\\u025b\\u0301nko\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301nd\\u01dd\",\n      \"l\\u01ddnd\\u00ed\",\n      \"maad\\u00ed\",\n      \"m\\u025bkr\\u025bd\\u00ed\",\n      \"j\\u01dd\\u01ddd\\u00ed\",\n      \"j\\u00famb\\u00e1\",\n      \"samd\\u00ed\"\n    ],\n    \"ERANAMES\": [\n      \"di Y\\u025b\\u0301sus ak\\u00e1 y\\u00e1l\\u025b\",\n      \"c\\u00e1m\\u025b\\u025bn k\\u01dd k\\u01ddb\\u0254pka Y\"\n    ],\n    \"ERAS\": [\n      \"d.Y.\",\n      \"k.Y.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u014bw\\u00ed\\u00ed a nt\\u0254\\u0301nt\\u0254\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd b\\u025b\\u0301\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd r\\u00e1\\u00e1\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1an\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1af\\u0254k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1ab\\u025b\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1araa\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1anin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u0254\\u0301k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u025b\\u0301\\u025b\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254\\u0301n\",\n      \"l\\u01ddn\",\n      \"maa\",\n      \"m\\u025bk\",\n      \"j\\u01dd\\u01dd\",\n      \"j\\u00fam\",\n      \"sam\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u014b1\",\n      \"\\u014b2\",\n      \"\\u014b3\",\n      \"\\u014b4\",\n      \"\\u014b5\",\n      \"\\u014b6\",\n      \"\\u014b7\",\n      \"\\u014b8\",\n      \"\\u014b9\",\n      \"\\u014b10\",\n      \"\\u014b11\",\n      \"\\u014b12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u014bw\\u00ed\\u00ed a nt\\u0254\\u0301nt\\u0254\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd b\\u025b\\u0301\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd r\\u00e1\\u00e1\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1an\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1af\\u0254k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1ab\\u025b\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1araa\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1anin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u0254\\u0301k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u025b\\u0301\\u025b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ksf-cm\",\n  \"localeID\": \"ksf_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ksf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"s\\u00e1r\\u00faw\\u00e1\",\n      \"c\\u025b\\u025b\\u0301nko\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301nd\\u01dd\",\n      \"l\\u01ddnd\\u00ed\",\n      \"maad\\u00ed\",\n      \"m\\u025bkr\\u025bd\\u00ed\",\n      \"j\\u01dd\\u01ddd\\u00ed\",\n      \"j\\u00famb\\u00e1\",\n      \"samd\\u00ed\"\n    ],\n    \"ERANAMES\": [\n      \"di Y\\u025b\\u0301sus ak\\u00e1 y\\u00e1l\\u025b\",\n      \"c\\u00e1m\\u025b\\u025bn k\\u01dd k\\u01ddb\\u0254pka Y\"\n    ],\n    \"ERAS\": [\n      \"d.Y.\",\n      \"k.Y.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u014bw\\u00ed\\u00ed a nt\\u0254\\u0301nt\\u0254\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd b\\u025b\\u0301\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd r\\u00e1\\u00e1\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1an\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1af\\u0254k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1ab\\u025b\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1araa\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1anin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u0254\\u0301k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u025b\\u0301\\u025b\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254\\u0301n\",\n      \"l\\u01ddn\",\n      \"maa\",\n      \"m\\u025bk\",\n      \"j\\u01dd\\u01dd\",\n      \"j\\u00fam\",\n      \"sam\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u014b1\",\n      \"\\u014b2\",\n      \"\\u014b3\",\n      \"\\u014b4\",\n      \"\\u014b5\",\n      \"\\u014b6\",\n      \"\\u014b7\",\n      \"\\u014b8\",\n      \"\\u014b9\",\n      \"\\u014b10\",\n      \"\\u014b11\",\n      \"\\u014b12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u014bw\\u00ed\\u00ed a nt\\u0254\\u0301nt\\u0254\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd b\\u025b\\u0301\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd r\\u00e1\\u00e1\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1an\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1af\\u0254k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1ab\\u025b\\u025b\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1araa\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd t\\u00e1anin\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u0254\\u0301k\",\n      \"\\u014bw\\u00ed\\u00ed ak\\u01dd nt\\u025bk di b\\u025b\\u0301\\u025b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ksf\",\n  \"localeID\": \"ksf\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ksh-de.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Uhr v\\u00f6rmiddaachs\",\n      \"Uhr nommendaachs\"\n    ],\n    \"DAY\": [\n      \"Sunndaach\",\n      \"Mohndaach\",\n      \"Dinnsdaach\",\n      \"Metwoch\",\n      \"Dunnersdaach\",\n      \"Friidaach\",\n      \"Samsdaach\"\n    ],\n    \"ERANAMES\": [\n      \"v\\u00fcr Krestos\",\n      \"noh Krestos\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jannewa\",\n      \"F\\u00e4browa\",\n      \"M\\u00e4\\u00e4z\",\n      \"Aprell\",\n      \"Mai\",\n      \"Juuni\",\n      \"Juuli\",\n      \"Oujo\\u00df\",\n      \"Sept\\u00e4mber\",\n      \"Oktohber\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"SHORTDAY\": [\n      \"Su.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Me.\",\n      \"Du.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"F\\u00e4b\",\n      \"M\\u00e4z\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Ouj\",\n      \"S\\u00e4p\",\n      \"Okt\",\n      \"Nov\",\n      \"Dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jannewa\",\n      \"F\\u00e4browa\",\n      \"M\\u00e4\\u00e4z\",\n      \"Aprell\",\n      \"Mai\",\n      \"Juuni\",\n      \"Juuli\",\n      \"Oujo\\u00df\",\n      \"Sept\\u00e4mber\",\n      \"Oktohber\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, 'd\\u00e4' d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM. y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM. y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d. M. y HH:mm\",\n    \"shortDate\": \"d. M. y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ksh-de\",\n  \"localeID\": \"ksh_DE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ksh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Uhr v\\u00f6rmiddaachs\",\n      \"Uhr nommendaachs\"\n    ],\n    \"DAY\": [\n      \"Sunndaach\",\n      \"Mohndaach\",\n      \"Dinnsdaach\",\n      \"Metwoch\",\n      \"Dunnersdaach\",\n      \"Friidaach\",\n      \"Samsdaach\"\n    ],\n    \"ERANAMES\": [\n      \"v\\u00fcr Krestos\",\n      \"noh Krestos\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jannewa\",\n      \"F\\u00e4browa\",\n      \"M\\u00e4\\u00e4z\",\n      \"Aprell\",\n      \"Mai\",\n      \"Juuni\",\n      \"Juuli\",\n      \"Oujo\\u00df\",\n      \"Sept\\u00e4mber\",\n      \"Oktohber\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"SHORTDAY\": [\n      \"Su.\",\n      \"Mo.\",\n      \"Di.\",\n      \"Me.\",\n      \"Du.\",\n      \"Fr.\",\n      \"Sa.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"F\\u00e4b\",\n      \"M\\u00e4z\",\n      \"Apr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Ouj\",\n      \"S\\u00e4p\",\n      \"Okt\",\n      \"Nov\",\n      \"Dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jannewa\",\n      \"F\\u00e4browa\",\n      \"M\\u00e4\\u00e4z\",\n      \"Aprell\",\n      \"Mai\",\n      \"Juuni\",\n      \"Juuli\",\n      \"Oujo\\u00df\",\n      \"Sept\\u00e4mber\",\n      \"Oktohber\",\n      \"Nov\\u00e4mber\",\n      \"Dez\\u00e4mber\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, 'd\\u00e4' d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM. y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM. y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d. M. y HH:mm\",\n    \"shortDate\": \"d. M. y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ksh\",\n  \"localeID\": \"ksh\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kw-gb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"dy Sul\",\n      \"dy Lun\",\n      \"dy Meurth\",\n      \"dy Merher\",\n      \"dy Yow\",\n      \"dy Gwener\",\n      \"dy Sadorn\"\n    ],\n    \"ERANAMES\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"mis Genver\",\n      \"mis Hwevrer\",\n      \"mis Meurth\",\n      \"mis Ebrel\",\n      \"mis Me\",\n      \"mis Metheven\",\n      \"mis Gortheren\",\n      \"mis Est\",\n      \"mis Gwynngala\",\n      \"mis Hedra\",\n      \"mis Du\",\n      \"mis Kevardhu\"\n    ],\n    \"SHORTDAY\": [\n      \"Sul\",\n      \"Lun\",\n      \"Mth\",\n      \"Mhr\",\n      \"Yow\",\n      \"Gwe\",\n      \"Sad\"\n    ],\n    \"SHORTMONTH\": [\n      \"Gen\",\n      \"Hwe\",\n      \"Meu\",\n      \"Ebr\",\n      \"Me\",\n      \"Met\",\n      \"Gor\",\n      \"Est\",\n      \"Gwn\",\n      \"Hed\",\n      \"Du\",\n      \"Kev\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"mis Genver\",\n      \"mis Hwevrer\",\n      \"mis Meurth\",\n      \"mis Ebrel\",\n      \"mis Me\",\n      \"mis Metheven\",\n      \"mis Gortheren\",\n      \"mis Est\",\n      \"mis Gwynngala\",\n      \"mis Hedra\",\n      \"mis Du\",\n      \"mis Kevardhu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kw-gb\",\n  \"localeID\": \"kw_GB\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_kw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"dy Sul\",\n      \"dy Lun\",\n      \"dy Meurth\",\n      \"dy Merher\",\n      \"dy Yow\",\n      \"dy Gwener\",\n      \"dy Sadorn\"\n    ],\n    \"ERANAMES\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"RC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"mis Genver\",\n      \"mis Hwevrer\",\n      \"mis Meurth\",\n      \"mis Ebrel\",\n      \"mis Me\",\n      \"mis Metheven\",\n      \"mis Gortheren\",\n      \"mis Est\",\n      \"mis Gwynngala\",\n      \"mis Hedra\",\n      \"mis Du\",\n      \"mis Kevardhu\"\n    ],\n    \"SHORTDAY\": [\n      \"Sul\",\n      \"Lun\",\n      \"Mth\",\n      \"Mhr\",\n      \"Yow\",\n      \"Gwe\",\n      \"Sad\"\n    ],\n    \"SHORTMONTH\": [\n      \"Gen\",\n      \"Hwe\",\n      \"Meu\",\n      \"Ebr\",\n      \"Me\",\n      \"Met\",\n      \"Gor\",\n      \"Est\",\n      \"Gwn\",\n      \"Hed\",\n      \"Du\",\n      \"Kev\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"mis Genver\",\n      \"mis Hwevrer\",\n      \"mis Meurth\",\n      \"mis Ebrel\",\n      \"mis Me\",\n      \"mis Metheven\",\n      \"mis Gortheren\",\n      \"mis Est\",\n      \"mis Gwynngala\",\n      \"mis Hedra\",\n      \"mis Du\",\n      \"mis Kevardhu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"kw\",\n  \"localeID\": \"kw\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ky-kg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0442\\u0430\\u04a3\\u043a\\u044b\",\n      \"\\u0442\\u04af\\u0448\\u0442\\u04e9\\u043d \\u043a\\u0438\\u0439\\u0438\\u043d\\u043a\\u0438\"\n    ],\n    \"DAY\": [\n      \"\\u0436\\u0435\\u043a\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0434\\u04af\\u0439\\u0448\\u04e9\\u043c\\u0431\\u04af\",\n      \"\\u0448\\u0435\\u0439\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0448\\u0430\\u0440\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0431\\u0435\\u0439\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0436\\u0443\\u043c\\u0430\",\n      \"\\u0438\\u0448\\u0435\\u043c\\u0431\\u0438\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0431\\u0438\\u0437\\u0434\\u0438\\u043d \\u0437\\u0430\\u043c\\u0430\\u043d\\u0433\\u0430 \\u0447\\u0435\\u0439\\u0438\\u043d\",\n      \"\\u0431\\u0438\\u0437\\u0434\\u0438\\u043d \\u0437\\u0430\\u043c\\u0430\\u043d\"\n    ],\n    \"ERAS\": [\n      \"\\u0431.\\u0437.\\u0447.\",\n      \"\\u0431.\\u0437.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0436\\u0435\\u043a.\",\n      \"\\u0434\\u04af\\u0439.\",\n      \"\\u0448\\u0435\\u0439\\u0448.\",\n      \"\\u0448\\u0430\\u0440\\u0448.\",\n      \"\\u0431\\u0435\\u0439\\u0448.\",\n      \"\\u0436\\u0443\\u043c\\u0430\",\n      \"\\u0438\\u0448\\u043c.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0440\\u0442\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u044e\\u043d\\u044c\",\n      \"\\u0418\\u044e\\u043b\\u044c\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y-'\\u0436'., d-MMMM, EEEE\",\n    \"longDate\": \"y-'\\u0436'., d-MMMM\",\n    \"medium\": \"y-'\\u0436'., d-MMM HH:mm:ss\",\n    \"mediumDate\": \"y-'\\u0436'., d-MMM\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KGS\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ky-kg\",\n  \"localeID\": \"ky_KG\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ky.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0442\\u0430\\u04a3\\u043a\\u044b\",\n      \"\\u0442\\u04af\\u0448\\u0442\\u04e9\\u043d \\u043a\\u0438\\u0439\\u0438\\u043d\\u043a\\u0438\"\n    ],\n    \"DAY\": [\n      \"\\u0436\\u0435\\u043a\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0434\\u04af\\u0439\\u0448\\u04e9\\u043c\\u0431\\u04af\",\n      \"\\u0448\\u0435\\u0439\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0448\\u0430\\u0440\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0431\\u0435\\u0439\\u0448\\u0435\\u043c\\u0431\\u0438\",\n      \"\\u0436\\u0443\\u043c\\u0430\",\n      \"\\u0438\\u0448\\u0435\\u043c\\u0431\\u0438\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0431\\u0438\\u0437\\u0434\\u0438\\u043d \\u0437\\u0430\\u043c\\u0430\\u043d\\u0433\\u0430 \\u0447\\u0435\\u0439\\u0438\\u043d\",\n      \"\\u0431\\u0438\\u0437\\u0434\\u0438\\u043d \\u0437\\u0430\\u043c\\u0430\\u043d\"\n    ],\n    \"ERAS\": [\n      \"\\u0431.\\u0437.\\u0447.\",\n      \"\\u0431.\\u0437.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0436\\u0435\\u043a.\",\n      \"\\u0434\\u04af\\u0439.\",\n      \"\\u0448\\u0435\\u0439\\u0448.\",\n      \"\\u0448\\u0430\\u0440\\u0448.\",\n      \"\\u0431\\u0435\\u0439\\u0448.\",\n      \"\\u0436\\u0443\\u043c\\u0430\",\n      \"\\u0438\\u0448\\u043c.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0440\\u0442\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u044e\\u043d\\u044c\",\n      \"\\u0418\\u044e\\u043b\\u044c\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y-'\\u0436'., d-MMMM, EEEE\",\n    \"longDate\": \"y-'\\u0436'., d-MMMM\",\n    \"medium\": \"y-'\\u0436'., d-MMM HH:mm:ss\",\n    \"mediumDate\": \"y-'\\u0436'., d-MMM\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KGS\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ky\",\n  \"localeID\": \"ky\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lag-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"TOO\",\n      \"MUU\"\n    ],\n    \"DAY\": [\n      \"Jumap\\u00ediri\",\n      \"Jumat\\u00e1tu\",\n      \"Juma\\u00edne\",\n      \"Jumat\\u00e1ano\",\n      \"Alam\\u00edisi\",\n      \"Ijum\\u00e1a\",\n      \"Jumam\\u00f3osi\"\n    ],\n    \"ERANAMES\": [\n      \"K\\u0268r\\u0268sit\\u0289 s\\u0268 anavyaal\",\n      \"K\\u0268r\\u0268sit\\u0289 akavyaalwe\"\n    ],\n    \"ERAS\": [\n      \"KSA\",\n      \"KA\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"K\\u0289f\\u00fangat\\u0268\",\n      \"K\\u0289naan\\u0268\",\n      \"K\\u0289keenda\",\n      \"Kwiikumi\",\n      \"Kwiinyamb\\u00e1la\",\n      \"Kwiidwaata\",\n      \"K\\u0289m\\u0289\\u0289nch\\u0268\",\n      \"K\\u0289v\\u0268\\u0268r\\u0268\",\n      \"K\\u0289saat\\u0289\",\n      \"Kwiinyi\",\n      \"K\\u0289saano\",\n      \"K\\u0289sasat\\u0289\"\n    ],\n    \"SHORTDAY\": [\n      \"P\\u00edili\",\n      \"T\\u00e1atu\",\n      \"\\u00cdne\",\n      \"T\\u00e1ano\",\n      \"Alh\",\n      \"Ijm\",\n      \"M\\u00f3osi\"\n    ],\n    \"SHORTMONTH\": [\n      \"F\\u00fangat\\u0268\",\n      \"Naan\\u0268\",\n      \"Keenda\",\n      \"Ik\\u00fami\",\n      \"Inyambala\",\n      \"Idwaata\",\n      \"M\\u0289\\u0289nch\\u0268\",\n      \"V\\u0268\\u0268r\\u0268\",\n      \"Saat\\u0289\",\n      \"Inyi\",\n      \"Saano\",\n      \"Sasat\\u0289\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"K\\u0289f\\u00fangat\\u0268\",\n      \"K\\u0289naan\\u0268\",\n      \"K\\u0289keenda\",\n      \"Kwiikumi\",\n      \"Kwiinyamb\\u00e1la\",\n      \"Kwiidwaata\",\n      \"K\\u0289m\\u0289\\u0289nch\\u0268\",\n      \"K\\u0289v\\u0268\\u0268r\\u0268\",\n      \"K\\u0289saat\\u0289\",\n      \"Kwiinyi\",\n      \"K\\u0289saano\",\n      \"K\\u0289sasat\\u0289\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lag-tz\",\n  \"localeID\": \"lag_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lag.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"TOO\",\n      \"MUU\"\n    ],\n    \"DAY\": [\n      \"Jumap\\u00ediri\",\n      \"Jumat\\u00e1tu\",\n      \"Juma\\u00edne\",\n      \"Jumat\\u00e1ano\",\n      \"Alam\\u00edisi\",\n      \"Ijum\\u00e1a\",\n      \"Jumam\\u00f3osi\"\n    ],\n    \"ERANAMES\": [\n      \"K\\u0268r\\u0268sit\\u0289 s\\u0268 anavyaal\",\n      \"K\\u0268r\\u0268sit\\u0289 akavyaalwe\"\n    ],\n    \"ERAS\": [\n      \"KSA\",\n      \"KA\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"K\\u0289f\\u00fangat\\u0268\",\n      \"K\\u0289naan\\u0268\",\n      \"K\\u0289keenda\",\n      \"Kwiikumi\",\n      \"Kwiinyamb\\u00e1la\",\n      \"Kwiidwaata\",\n      \"K\\u0289m\\u0289\\u0289nch\\u0268\",\n      \"K\\u0289v\\u0268\\u0268r\\u0268\",\n      \"K\\u0289saat\\u0289\",\n      \"Kwiinyi\",\n      \"K\\u0289saano\",\n      \"K\\u0289sasat\\u0289\"\n    ],\n    \"SHORTDAY\": [\n      \"P\\u00edili\",\n      \"T\\u00e1atu\",\n      \"\\u00cdne\",\n      \"T\\u00e1ano\",\n      \"Alh\",\n      \"Ijm\",\n      \"M\\u00f3osi\"\n    ],\n    \"SHORTMONTH\": [\n      \"F\\u00fangat\\u0268\",\n      \"Naan\\u0268\",\n      \"Keenda\",\n      \"Ik\\u00fami\",\n      \"Inyambala\",\n      \"Idwaata\",\n      \"M\\u0289\\u0289nch\\u0268\",\n      \"V\\u0268\\u0268r\\u0268\",\n      \"Saat\\u0289\",\n      \"Inyi\",\n      \"Saano\",\n      \"Sasat\\u0289\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"K\\u0289f\\u00fangat\\u0268\",\n      \"K\\u0289naan\\u0268\",\n      \"K\\u0289keenda\",\n      \"Kwiikumi\",\n      \"Kwiinyamb\\u00e1la\",\n      \"Kwiidwaata\",\n      \"K\\u0289m\\u0289\\u0289nch\\u0268\",\n      \"K\\u0289v\\u0268\\u0268r\\u0268\",\n      \"K\\u0289saat\\u0289\",\n      \"Kwiinyi\",\n      \"K\\u0289saano\",\n      \"K\\u0289sasat\\u0289\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lag\",\n  \"localeID\": \"lag\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lb-lu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"moies\",\n      \"nom\\u00ebttes\"\n    ],\n    \"DAY\": [\n      \"Sonndeg\",\n      \"M\\u00e9indeg\",\n      \"D\\u00ebnschdeg\",\n      \"M\\u00ebttwoch\",\n      \"Donneschdeg\",\n      \"Freideg\",\n      \"Samschdeg\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4erz\",\n      \"Abr\\u00ebll\",\n      \"Mee\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"Son.\",\n      \"M\\u00e9i.\",\n      \"D\\u00ebn.\",\n      \"M\\u00ebt.\",\n      \"Don.\",\n      \"Fre.\",\n      \"Sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4e.\",\n      \"Abr.\",\n      \"Mee\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4erz\",\n      \"Abr\\u00ebll\",\n      \"Mee\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lb-lu\",\n  \"localeID\": \"lb_LU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"moies\",\n      \"nom\\u00ebttes\"\n    ],\n    \"DAY\": [\n      \"Sonndeg\",\n      \"M\\u00e9indeg\",\n      \"D\\u00ebnschdeg\",\n      \"M\\u00ebttwoch\",\n      \"Donneschdeg\",\n      \"Freideg\",\n      \"Samschdeg\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4erz\",\n      \"Abr\\u00ebll\",\n      \"Mee\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"SHORTDAY\": [\n      \"Son.\",\n      \"M\\u00e9i.\",\n      \"D\\u00ebn.\",\n      \"M\\u00ebt.\",\n      \"Don.\",\n      \"Fre.\",\n      \"Sam.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan.\",\n      \"Feb.\",\n      \"M\\u00e4e.\",\n      \"Abr.\",\n      \"Mee\",\n      \"Juni\",\n      \"Juli\",\n      \"Aug.\",\n      \"Sep.\",\n      \"Okt.\",\n      \"Nov.\",\n      \"Dez.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\",\n      \"Februar\",\n      \"M\\u00e4erz\",\n      \"Abr\\u00ebll\",\n      \"Mee\",\n      \"Juni\",\n      \"Juli\",\n      \"August\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Dezember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lb\",\n  \"localeID\": \"lb\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lg-ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sabbiiti\",\n      \"Balaza\",\n      \"Lwakubiri\",\n      \"Lwakusatu\",\n      \"Lwakuna\",\n      \"Lwakutaano\",\n      \"Lwamukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kulisito nga tannaza\",\n      \"Bukya Kulisito Azaal\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Sab\",\n      \"Bal\",\n      \"Lw2\",\n      \"Lw3\",\n      \"Lw4\",\n      \"Lw5\",\n      \"Lw6\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apu\",\n      \"Maa\",\n      \"Juu\",\n      \"Jul\",\n      \"Agu\",\n      \"Seb\",\n      \"Oki\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lg-ug\",\n  \"localeID\": \"lg_UG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sabbiiti\",\n      \"Balaza\",\n      \"Lwakubiri\",\n      \"Lwakusatu\",\n      \"Lwakuna\",\n      \"Lwakutaano\",\n      \"Lwamukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kulisito nga tannaza\",\n      \"Bukya Kulisito Azaal\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Sab\",\n      \"Bal\",\n      \"Lw2\",\n      \"Lw3\",\n      \"Lw4\",\n      \"Lw5\",\n      \"Lw6\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apu\",\n      \"Maa\",\n      \"Juu\",\n      \"Jul\",\n      \"Agu\",\n      \"Seb\",\n      \"Oki\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lg\",\n  \"localeID\": \"lg\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lkt-us.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"A\\u014bp\\u00e9tuwak\\u021fa\\u014b\",\n      \"A\\u014bp\\u00e9tuwa\\u014b\\u017ei\",\n      \"A\\u014bp\\u00e9tunu\\u014bpa\",\n      \"A\\u014bp\\u00e9tuyamni\",\n      \"A\\u014bp\\u00e9tutopa\",\n      \"A\\u014bp\\u00e9tuzapta\\u014b\",\n      \"Ow\\u00e1\\u014bgyu\\u017ea\\u017eapi\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Wi\\u00f3the\\u021fika W\\u00ed\",\n      \"Thiy\\u00f3\\u021feyu\\u014bka W\\u00ed\",\n      \"I\\u0161t\\u00e1wi\\u010dhayaza\\u014b W\\u00ed\",\n      \"P\\u021fe\\u017e\\u00edt\\u021fo W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pet\\u021fo W\\u00ed\",\n      \"W\\u00edpazuk\\u021fa-wa\\u0161t\\u00e9 W\\u00ed\",\n      \"\\u010cha\\u014bp\\u021f\\u00e1sapa W\\u00ed\",\n      \"Was\\u00fat\\u021fu\\u014b W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe\\u01e7i W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe-kasn\\u00e1 W\\u00ed\",\n      \"Wan\\u00edyetu W\\u00ed\",\n      \"T\\u021fah\\u00e9kap\\u0161u\\u014b W\\u00ed\"\n    ],\n    \"SHORTDAY\": [\n      \"A\\u014bp\\u00e9tuwak\\u021fa\\u014b\",\n      \"A\\u014bp\\u00e9tuwa\\u014b\\u017ei\",\n      \"A\\u014bp\\u00e9tunu\\u014bpa\",\n      \"A\\u014bp\\u00e9tuyamni\",\n      \"A\\u014bp\\u00e9tutopa\",\n      \"A\\u014bp\\u00e9tuzapta\\u014b\",\n      \"Ow\\u00e1\\u014bgyu\\u017ea\\u017eapi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Wi\\u00f3the\\u021fika W\\u00ed\",\n      \"Thiy\\u00f3\\u021feyu\\u014bka W\\u00ed\",\n      \"I\\u0161t\\u00e1wi\\u010dhayaza\\u014b W\\u00ed\",\n      \"P\\u021fe\\u017e\\u00edt\\u021fo W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pet\\u021fo W\\u00ed\",\n      \"W\\u00edpazuk\\u021fa-wa\\u0161t\\u00e9 W\\u00ed\",\n      \"\\u010cha\\u014bp\\u021f\\u00e1sapa W\\u00ed\",\n      \"Was\\u00fat\\u021fu\\u014b W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe\\u01e7i W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe-kasn\\u00e1 W\\u00ed\",\n      \"Wan\\u00edyetu W\\u00ed\",\n      \"T\\u021fah\\u00e9kap\\u0161u\\u014b W\\u00ed\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Wi\\u00f3the\\u021fika W\\u00ed\",\n      \"Thiy\\u00f3\\u021feyu\\u014bka W\\u00ed\",\n      \"I\\u0161t\\u00e1wi\\u010dhayaza\\u014b W\\u00ed\",\n      \"P\\u021fe\\u017e\\u00edt\\u021fo W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pet\\u021fo W\\u00ed\",\n      \"W\\u00edpazuk\\u021fa-wa\\u0161t\\u00e9 W\\u00ed\",\n      \"\\u010cha\\u014bp\\u021f\\u00e1sapa W\\u00ed\",\n      \"Was\\u00fat\\u021fu\\u014b W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe\\u01e7i W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe-kasn\\u00e1 W\\u00ed\",\n      \"Wan\\u00edyetu W\\u00ed\",\n      \"T\\u021fah\\u00e9kap\\u0161u\\u014b W\\u00ed\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lkt-us\",\n  \"localeID\": \"lkt_US\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lkt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"A\\u014bp\\u00e9tuwak\\u021fa\\u014b\",\n      \"A\\u014bp\\u00e9tuwa\\u014b\\u017ei\",\n      \"A\\u014bp\\u00e9tunu\\u014bpa\",\n      \"A\\u014bp\\u00e9tuyamni\",\n      \"A\\u014bp\\u00e9tutopa\",\n      \"A\\u014bp\\u00e9tuzapta\\u014b\",\n      \"Ow\\u00e1\\u014bgyu\\u017ea\\u017eapi\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Wi\\u00f3the\\u021fika W\\u00ed\",\n      \"Thiy\\u00f3\\u021feyu\\u014bka W\\u00ed\",\n      \"I\\u0161t\\u00e1wi\\u010dhayaza\\u014b W\\u00ed\",\n      \"P\\u021fe\\u017e\\u00edt\\u021fo W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pet\\u021fo W\\u00ed\",\n      \"W\\u00edpazuk\\u021fa-wa\\u0161t\\u00e9 W\\u00ed\",\n      \"\\u010cha\\u014bp\\u021f\\u00e1sapa W\\u00ed\",\n      \"Was\\u00fat\\u021fu\\u014b W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe\\u01e7i W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe-kasn\\u00e1 W\\u00ed\",\n      \"Wan\\u00edyetu W\\u00ed\",\n      \"T\\u021fah\\u00e9kap\\u0161u\\u014b W\\u00ed\"\n    ],\n    \"SHORTDAY\": [\n      \"A\\u014bp\\u00e9tuwak\\u021fa\\u014b\",\n      \"A\\u014bp\\u00e9tuwa\\u014b\\u017ei\",\n      \"A\\u014bp\\u00e9tunu\\u014bpa\",\n      \"A\\u014bp\\u00e9tuyamni\",\n      \"A\\u014bp\\u00e9tutopa\",\n      \"A\\u014bp\\u00e9tuzapta\\u014b\",\n      \"Ow\\u00e1\\u014bgyu\\u017ea\\u017eapi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Wi\\u00f3the\\u021fika W\\u00ed\",\n      \"Thiy\\u00f3\\u021feyu\\u014bka W\\u00ed\",\n      \"I\\u0161t\\u00e1wi\\u010dhayaza\\u014b W\\u00ed\",\n      \"P\\u021fe\\u017e\\u00edt\\u021fo W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pet\\u021fo W\\u00ed\",\n      \"W\\u00edpazuk\\u021fa-wa\\u0161t\\u00e9 W\\u00ed\",\n      \"\\u010cha\\u014bp\\u021f\\u00e1sapa W\\u00ed\",\n      \"Was\\u00fat\\u021fu\\u014b W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe\\u01e7i W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe-kasn\\u00e1 W\\u00ed\",\n      \"Wan\\u00edyetu W\\u00ed\",\n      \"T\\u021fah\\u00e9kap\\u0161u\\u014b W\\u00ed\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Wi\\u00f3the\\u021fika W\\u00ed\",\n      \"Thiy\\u00f3\\u021feyu\\u014bka W\\u00ed\",\n      \"I\\u0161t\\u00e1wi\\u010dhayaza\\u014b W\\u00ed\",\n      \"P\\u021fe\\u017e\\u00edt\\u021fo W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pet\\u021fo W\\u00ed\",\n      \"W\\u00edpazuk\\u021fa-wa\\u0161t\\u00e9 W\\u00ed\",\n      \"\\u010cha\\u014bp\\u021f\\u00e1sapa W\\u00ed\",\n      \"Was\\u00fat\\u021fu\\u014b W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe\\u01e7i W\\u00ed\",\n      \"\\u010cha\\u014bw\\u00e1pe-kasn\\u00e1 W\\u00ed\",\n      \"Wan\\u00edyetu W\\u00ed\",\n      \"T\\u021fah\\u00e9kap\\u0161u\\u014b W\\u00ed\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lkt\",\n  \"localeID\": \"lkt\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ln-ao.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"nt\\u0254\\u0301ng\\u0254\\u0301\",\n      \"mp\\u00f3kwa\"\n    ],\n    \"DAY\": [\n      \"eyenga\",\n      \"mok\\u0254l\\u0254 mwa yambo\",\n      \"mok\\u0254l\\u0254 mwa m\\u00edbal\\u00e9\",\n      \"mok\\u0254l\\u0254 mwa m\\u00eds\\u00e1to\",\n      \"mok\\u0254l\\u0254 ya m\\u00edn\\u00e9i\",\n      \"mok\\u0254l\\u0254 ya m\\u00edt\\u00e1no\",\n      \"mp\\u0254\\u0301s\\u0254\"\n    ],\n    \"ERANAMES\": [\n      \"Yambo ya Y\\u00e9zu Kr\\u00eds\",\n      \"Nsima ya Y\\u00e9zu Kr\\u00eds\"\n    ],\n    \"ERAS\": [\n      \"lib\\u00f3so ya\",\n      \"nsima ya Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"SHORTDAY\": [\n      \"eye\",\n      \"ybo\",\n      \"mbl\",\n      \"mst\",\n      \"min\",\n      \"mtn\",\n      \"mps\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fbl\",\n      \"msi\",\n      \"apl\",\n      \"mai\",\n      \"yun\",\n      \"yul\",\n      \"agt\",\n      \"stb\",\n      \"\\u0254tb\",\n      \"nvb\",\n      \"dsb\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Kz\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ln-ao\",\n  \"localeID\": \"ln_AO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ln-cd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"nt\\u0254\\u0301ng\\u0254\\u0301\",\n      \"mp\\u00f3kwa\"\n    ],\n    \"DAY\": [\n      \"eyenga\",\n      \"mok\\u0254l\\u0254 mwa yambo\",\n      \"mok\\u0254l\\u0254 mwa m\\u00edbal\\u00e9\",\n      \"mok\\u0254l\\u0254 mwa m\\u00eds\\u00e1to\",\n      \"mok\\u0254l\\u0254 ya m\\u00edn\\u00e9i\",\n      \"mok\\u0254l\\u0254 ya m\\u00edt\\u00e1no\",\n      \"mp\\u0254\\u0301s\\u0254\"\n    ],\n    \"ERANAMES\": [\n      \"Yambo ya Y\\u00e9zu Kr\\u00eds\",\n      \"Nsima ya Y\\u00e9zu Kr\\u00eds\"\n    ],\n    \"ERAS\": [\n      \"lib\\u00f3so ya\",\n      \"nsima ya Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"SHORTDAY\": [\n      \"eye\",\n      \"ybo\",\n      \"mbl\",\n      \"mst\",\n      \"min\",\n      \"mtn\",\n      \"mps\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fbl\",\n      \"msi\",\n      \"apl\",\n      \"mai\",\n      \"yun\",\n      \"yul\",\n      \"agt\",\n      \"stb\",\n      \"\\u0254tb\",\n      \"nvb\",\n      \"dsb\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FrCD\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ln-cd\",\n  \"localeID\": \"ln_CD\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ln-cf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"nt\\u0254\\u0301ng\\u0254\\u0301\",\n      \"mp\\u00f3kwa\"\n    ],\n    \"DAY\": [\n      \"eyenga\",\n      \"mok\\u0254l\\u0254 mwa yambo\",\n      \"mok\\u0254l\\u0254 mwa m\\u00edbal\\u00e9\",\n      \"mok\\u0254l\\u0254 mwa m\\u00eds\\u00e1to\",\n      \"mok\\u0254l\\u0254 ya m\\u00edn\\u00e9i\",\n      \"mok\\u0254l\\u0254 ya m\\u00edt\\u00e1no\",\n      \"mp\\u0254\\u0301s\\u0254\"\n    ],\n    \"ERANAMES\": [\n      \"Yambo ya Y\\u00e9zu Kr\\u00eds\",\n      \"Nsima ya Y\\u00e9zu Kr\\u00eds\"\n    ],\n    \"ERAS\": [\n      \"lib\\u00f3so ya\",\n      \"nsima ya Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"SHORTDAY\": [\n      \"eye\",\n      \"ybo\",\n      \"mbl\",\n      \"mst\",\n      \"min\",\n      \"mtn\",\n      \"mps\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fbl\",\n      \"msi\",\n      \"apl\",\n      \"mai\",\n      \"yun\",\n      \"yul\",\n      \"agt\",\n      \"stb\",\n      \"\\u0254tb\",\n      \"nvb\",\n      \"dsb\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ln-cf\",\n  \"localeID\": \"ln_CF\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ln-cg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"nt\\u0254\\u0301ng\\u0254\\u0301\",\n      \"mp\\u00f3kwa\"\n    ],\n    \"DAY\": [\n      \"eyenga\",\n      \"mok\\u0254l\\u0254 mwa yambo\",\n      \"mok\\u0254l\\u0254 mwa m\\u00edbal\\u00e9\",\n      \"mok\\u0254l\\u0254 mwa m\\u00eds\\u00e1to\",\n      \"mok\\u0254l\\u0254 ya m\\u00edn\\u00e9i\",\n      \"mok\\u0254l\\u0254 ya m\\u00edt\\u00e1no\",\n      \"mp\\u0254\\u0301s\\u0254\"\n    ],\n    \"ERANAMES\": [\n      \"Yambo ya Y\\u00e9zu Kr\\u00eds\",\n      \"Nsima ya Y\\u00e9zu Kr\\u00eds\"\n    ],\n    \"ERAS\": [\n      \"lib\\u00f3so ya\",\n      \"nsima ya Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"SHORTDAY\": [\n      \"eye\",\n      \"ybo\",\n      \"mbl\",\n      \"mst\",\n      \"min\",\n      \"mtn\",\n      \"mps\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fbl\",\n      \"msi\",\n      \"apl\",\n      \"mai\",\n      \"yun\",\n      \"yul\",\n      \"agt\",\n      \"stb\",\n      \"\\u0254tb\",\n      \"nvb\",\n      \"dsb\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ln-cg\",\n  \"localeID\": \"ln_CG\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ln.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"nt\\u0254\\u0301ng\\u0254\\u0301\",\n      \"mp\\u00f3kwa\"\n    ],\n    \"DAY\": [\n      \"eyenga\",\n      \"mok\\u0254l\\u0254 mwa yambo\",\n      \"mok\\u0254l\\u0254 mwa m\\u00edbal\\u00e9\",\n      \"mok\\u0254l\\u0254 mwa m\\u00eds\\u00e1to\",\n      \"mok\\u0254l\\u0254 ya m\\u00edn\\u00e9i\",\n      \"mok\\u0254l\\u0254 ya m\\u00edt\\u00e1no\",\n      \"mp\\u0254\\u0301s\\u0254\"\n    ],\n    \"ERANAMES\": [\n      \"Yambo ya Y\\u00e9zu Kr\\u00eds\",\n      \"Nsima ya Y\\u00e9zu Kr\\u00eds\"\n    ],\n    \"ERAS\": [\n      \"lib\\u00f3so ya\",\n      \"nsima ya Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"SHORTDAY\": [\n      \"eye\",\n      \"ybo\",\n      \"mbl\",\n      \"mst\",\n      \"min\",\n      \"mtn\",\n      \"mps\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fbl\",\n      \"msi\",\n      \"apl\",\n      \"mai\",\n      \"yun\",\n      \"yul\",\n      \"agt\",\n      \"stb\",\n      \"\\u0254tb\",\n      \"nvb\",\n      \"dsb\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"s\\u00e1nz\\u00e1 ya yambo\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edbal\\u00e9\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00eds\\u00e1to\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00ednei\",\n      \"s\\u00e1nz\\u00e1 ya m\\u00edt\\u00e1no\",\n      \"s\\u00e1nz\\u00e1 ya mot\\u00f3b\\u00e1\",\n      \"s\\u00e1nz\\u00e1 ya nsambo\",\n      \"s\\u00e1nz\\u00e1 ya mwambe\",\n      \"s\\u00e1nz\\u00e1 ya libwa\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u0254\\u030ck\\u0254\\u0301\",\n      \"s\\u00e1nz\\u00e1 ya z\\u00f3mi na m\\u00edbal\\u00e9\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FrCD\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ln\",\n  \"localeID\": \"ln\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lo-la.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0e81\\u0ec8\\u0ead\\u0e99\\u0e97\\u0ec8\\u0ebd\\u0e87\",\n      \"\\u0eab\\u0ebc\\u0eb1\\u0e87\\u0e97\\u0ec8\\u0ebd\\u0e87\"\n    ],\n    \"DAY\": [\n      \"\\u0ea7\\u0eb1\\u0e99\\u0ead\\u0eb2\\u0e97\\u0eb4\\u0e94\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0e88\\u0eb1\\u0e99\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0ead\\u0eb1\\u0e87\\u0e84\\u0eb2\\u0e99\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0e9e\\u0eb8\\u0e94\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0e9e\\u0eb0\\u0eab\\u0eb1\\u0e94\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0eaa\\u0eb8\\u0e81\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0ec0\\u0eaa\\u0ebb\\u0eb2\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0e81\\u0ec8\\u0ead\\u0e99\\u0e84\\u0ea3\\u0eb4\\u0e94\\u0eaa\\u0eb1\\u0e81\\u0e81\\u0eb0\\u0ea5\\u0eb2\\u0e94\",\n      \"\\u0e84\\u0ea3\\u0eb4\\u0e94\\u0eaa\\u0eb1\\u0e81\\u0e81\\u0eb0\\u0ea5\\u0eb2\\u0e94\"\n    ],\n    \"ERAS\": [\n      \"\\u0e81\\u0ec8\\u0ead\\u0e99 \\u0e84.\\u0eaa.\",\n      \"\\u0e84.\\u0eaa.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0ea1\\u0eb1\\u0e87\\u0e81\\u0ead\\u0e99\",\n      \"\\u0e81\\u0eb8\\u0ea1\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb5\\u0e99\\u0eb2\",\n      \"\\u0ec0\\u0ea1\\u0eaa\\u0eb2\",\n      \"\\u0e9e\\u0eb6\\u0e94\\u0eaa\\u0eb0\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb4\\u0e96\\u0eb8\\u0e99\\u0eb2\",\n      \"\\u0e81\\u0ecd\\u0ea5\\u0eb0\\u0e81\\u0ebb\\u0e94\",\n      \"\\u0eaa\\u0eb4\\u0e87\\u0eab\\u0eb2\",\n      \"\\u0e81\\u0eb1\\u0e99\\u0e8d\\u0eb2\",\n      \"\\u0e95\\u0eb8\\u0ea5\\u0eb2\",\n      \"\\u0e9e\\u0eb0\\u0e88\\u0eb4\\u0e81\",\n      \"\\u0e97\\u0eb1\\u0e99\\u0ea7\\u0eb2\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0ead\\u0eb2\\u0e97\\u0eb4\\u0e94\",\n      \"\\u0e88\\u0eb1\\u0e99\",\n      \"\\u0ead\\u0eb1\\u0e87\\u0e84\\u0eb2\\u0e99\",\n      \"\\u0e9e\\u0eb8\\u0e94\",\n      \"\\u0e9e\\u0eb0\\u0eab\\u0eb1\\u0e94\",\n      \"\\u0eaa\\u0eb8\\u0e81\",\n      \"\\u0ec0\\u0eaa\\u0ebb\\u0eb2\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0ea1.\\u0e81.\",\n      \"\\u0e81.\\u0e9e.\",\n      \"\\u0ea1.\\u0e99.\",\n      \"\\u0ea1.\\u0eaa.\",\n      \"\\u0e9e.\\u0e9e.\",\n      \"\\u0ea1\\u0eb4.\\u0e96.\",\n      \"\\u0e81.\\u0ea5.\",\n      \"\\u0eaa.\\u0eab.\",\n      \"\\u0e81.\\u0e8d.\",\n      \"\\u0e95.\\u0ea5.\",\n      \"\\u0e9e.\\u0e88.\",\n      \"\\u0e97.\\u0ea7.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0ea1\\u0eb1\\u0e87\\u0e81\\u0ead\\u0e99\",\n      \"\\u0e81\\u0eb8\\u0ea1\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb5\\u0e99\\u0eb2\",\n      \"\\u0ec0\\u0ea1\\u0eaa\\u0eb2\",\n      \"\\u0e9e\\u0eb6\\u0e94\\u0eaa\\u0eb0\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb4\\u0e96\\u0eb8\\u0e99\\u0eb2\",\n      \"\\u0e81\\u0ecd\\u0ea5\\u0eb0\\u0e81\\u0ebb\\u0e94\",\n      \"\\u0eaa\\u0eb4\\u0e87\\u0eab\\u0eb2\",\n      \"\\u0e81\\u0eb1\\u0e99\\u0e8d\\u0eb2\",\n      \"\\u0e95\\u0eb8\\u0ea5\\u0eb2\",\n      \"\\u0e9e\\u0eb0\\u0e88\\u0eb4\\u0e81\",\n      \"\\u0e97\\u0eb1\\u0e99\\u0ea7\\u0eb2\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE \\u0e97\\u0eb5 d MMMM G y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/y H:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ad\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lo-la\",\n  \"localeID\": \"lo_LA\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0e81\\u0ec8\\u0ead\\u0e99\\u0e97\\u0ec8\\u0ebd\\u0e87\",\n      \"\\u0eab\\u0ebc\\u0eb1\\u0e87\\u0e97\\u0ec8\\u0ebd\\u0e87\"\n    ],\n    \"DAY\": [\n      \"\\u0ea7\\u0eb1\\u0e99\\u0ead\\u0eb2\\u0e97\\u0eb4\\u0e94\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0e88\\u0eb1\\u0e99\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0ead\\u0eb1\\u0e87\\u0e84\\u0eb2\\u0e99\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0e9e\\u0eb8\\u0e94\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0e9e\\u0eb0\\u0eab\\u0eb1\\u0e94\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0eaa\\u0eb8\\u0e81\",\n      \"\\u0ea7\\u0eb1\\u0e99\\u0ec0\\u0eaa\\u0ebb\\u0eb2\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0e81\\u0ec8\\u0ead\\u0e99\\u0e84\\u0ea3\\u0eb4\\u0e94\\u0eaa\\u0eb1\\u0e81\\u0e81\\u0eb0\\u0ea5\\u0eb2\\u0e94\",\n      \"\\u0e84\\u0ea3\\u0eb4\\u0e94\\u0eaa\\u0eb1\\u0e81\\u0e81\\u0eb0\\u0ea5\\u0eb2\\u0e94\"\n    ],\n    \"ERAS\": [\n      \"\\u0e81\\u0ec8\\u0ead\\u0e99 \\u0e84.\\u0eaa.\",\n      \"\\u0e84.\\u0eaa.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0ea1\\u0eb1\\u0e87\\u0e81\\u0ead\\u0e99\",\n      \"\\u0e81\\u0eb8\\u0ea1\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb5\\u0e99\\u0eb2\",\n      \"\\u0ec0\\u0ea1\\u0eaa\\u0eb2\",\n      \"\\u0e9e\\u0eb6\\u0e94\\u0eaa\\u0eb0\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb4\\u0e96\\u0eb8\\u0e99\\u0eb2\",\n      \"\\u0e81\\u0ecd\\u0ea5\\u0eb0\\u0e81\\u0ebb\\u0e94\",\n      \"\\u0eaa\\u0eb4\\u0e87\\u0eab\\u0eb2\",\n      \"\\u0e81\\u0eb1\\u0e99\\u0e8d\\u0eb2\",\n      \"\\u0e95\\u0eb8\\u0ea5\\u0eb2\",\n      \"\\u0e9e\\u0eb0\\u0e88\\u0eb4\\u0e81\",\n      \"\\u0e97\\u0eb1\\u0e99\\u0ea7\\u0eb2\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0ead\\u0eb2\\u0e97\\u0eb4\\u0e94\",\n      \"\\u0e88\\u0eb1\\u0e99\",\n      \"\\u0ead\\u0eb1\\u0e87\\u0e84\\u0eb2\\u0e99\",\n      \"\\u0e9e\\u0eb8\\u0e94\",\n      \"\\u0e9e\\u0eb0\\u0eab\\u0eb1\\u0e94\",\n      \"\\u0eaa\\u0eb8\\u0e81\",\n      \"\\u0ec0\\u0eaa\\u0ebb\\u0eb2\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0ea1.\\u0e81.\",\n      \"\\u0e81.\\u0e9e.\",\n      \"\\u0ea1.\\u0e99.\",\n      \"\\u0ea1.\\u0eaa.\",\n      \"\\u0e9e.\\u0e9e.\",\n      \"\\u0ea1\\u0eb4.\\u0e96.\",\n      \"\\u0e81.\\u0ea5.\",\n      \"\\u0eaa.\\u0eab.\",\n      \"\\u0e81.\\u0e8d.\",\n      \"\\u0e95.\\u0ea5.\",\n      \"\\u0e9e.\\u0e88.\",\n      \"\\u0e97.\\u0ea7.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0ea1\\u0eb1\\u0e87\\u0e81\\u0ead\\u0e99\",\n      \"\\u0e81\\u0eb8\\u0ea1\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb5\\u0e99\\u0eb2\",\n      \"\\u0ec0\\u0ea1\\u0eaa\\u0eb2\",\n      \"\\u0e9e\\u0eb6\\u0e94\\u0eaa\\u0eb0\\u0e9e\\u0eb2\",\n      \"\\u0ea1\\u0eb4\\u0e96\\u0eb8\\u0e99\\u0eb2\",\n      \"\\u0e81\\u0ecd\\u0ea5\\u0eb0\\u0e81\\u0ebb\\u0e94\",\n      \"\\u0eaa\\u0eb4\\u0e87\\u0eab\\u0eb2\",\n      \"\\u0e81\\u0eb1\\u0e99\\u0e8d\\u0eb2\",\n      \"\\u0e95\\u0eb8\\u0ea5\\u0eb2\",\n      \"\\u0e9e\\u0eb0\\u0e88\\u0eb4\\u0e81\",\n      \"\\u0e97\\u0eb1\\u0e99\\u0ea7\\u0eb2\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE \\u0e97\\u0eb5 d MMMM G y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y H:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d/M/y H:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ad\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lo\",\n  \"localeID\": \"lo\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lrc-iq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lrc-iq\",\n  \"localeID\": \"lrc_IQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lrc-ir.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      4\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lrc-ir\",\n  \"localeID\": \"lrc_IR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lrc.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0627\\u0646\\u06a4\\u06cc\\u06d5\",\n      \"\\u0641\\u0626\\u06a4\\u0631\\u06cc\\u06d5\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u06a4\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0659\\u0623\\u0646\",\n      \"\\u062c\\u0648\\u0659\\u0644\\u0627\",\n      \"\\u0622\\u06af\\u0648\\u0633\\u062a\",\n      \"\\u0633\\u0626\\u067e\\u062a\\u0627\\u0645\\u0631\",\n      \"\\u0626\\u0648\\u06a9\\u062a\\u0648\\u06a4\\u0631\",\n      \"\\u0646\\u0648\\u06a4\\u0627\\u0645\\u0631\",\n      \"\\u062f\\u0626\\u0633\\u0627\\u0645\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      4\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"lrc\",\n  \"localeID\": \"lrc\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lt-lt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"prie\\u0161piet\",\n      \"popiet\"\n    ],\n    \"DAY\": [\n      \"sekmadienis\",\n      \"pirmadienis\",\n      \"antradienis\",\n      \"tre\\u010diadienis\",\n      \"ketvirtadienis\",\n      \"penktadienis\",\n      \"\\u0161e\\u0161tadienis\"\n    ],\n    \"ERANAMES\": [\n      \"prie\\u0161 Krist\\u0173\",\n      \"po Kristaus\"\n    ],\n    \"ERAS\": [\n      \"pr. Kr.\",\n      \"po Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"sausio\",\n      \"vasario\",\n      \"kovo\",\n      \"baland\\u017eio\",\n      \"gegu\\u017e\\u0117s\",\n      \"bir\\u017eelio\",\n      \"liepos\",\n      \"rugpj\\u016b\\u010dio\",\n      \"rugs\\u0117jo\",\n      \"spalio\",\n      \"lapkri\\u010dio\",\n      \"gruod\\u017eio\"\n    ],\n    \"SHORTDAY\": [\n      \"sk\",\n      \"pr\",\n      \"an\",\n      \"tr\",\n      \"kt\",\n      \"pn\",\n      \"\\u0161t\"\n    ],\n    \"SHORTMONTH\": [\n      \"saus.\",\n      \"vas.\",\n      \"kov.\",\n      \"bal.\",\n      \"geg.\",\n      \"bir\\u017e.\",\n      \"liep.\",\n      \"rugp.\",\n      \"rugs.\",\n      \"spal.\",\n      \"lapkr.\",\n      \"gruod.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"sausis\",\n      \"vasaris\",\n      \"kovas\",\n      \"balandis\",\n      \"gegu\\u017e\\u0117\",\n      \"bir\\u017eelis\",\n      \"liepa\",\n      \"rugpj\\u016btis\",\n      \"rugs\\u0117jis\",\n      \"spalis\",\n      \"lapkritis\",\n      \"gruodis\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y 'm'. MMMM d 'd'., EEEE\",\n    \"longDate\": \"y 'm'. MMMM d 'd'.\",\n    \"medium\": \"y-MM-dd HH:mm:ss\",\n    \"mediumDate\": \"y-MM-dd\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lt-lt\",\n  \"localeID\": \"lt_LT\",\n  \"pluralCat\": function(n, opt_precision) {  var vf = getVF(n, opt_precision);  if (n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) {    return PLURAL_CATEGORY.ONE;  }  if (n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.f != 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"prie\\u0161piet\",\n      \"popiet\"\n    ],\n    \"DAY\": [\n      \"sekmadienis\",\n      \"pirmadienis\",\n      \"antradienis\",\n      \"tre\\u010diadienis\",\n      \"ketvirtadienis\",\n      \"penktadienis\",\n      \"\\u0161e\\u0161tadienis\"\n    ],\n    \"ERANAMES\": [\n      \"prie\\u0161 Krist\\u0173\",\n      \"po Kristaus\"\n    ],\n    \"ERAS\": [\n      \"pr. Kr.\",\n      \"po Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"sausio\",\n      \"vasario\",\n      \"kovo\",\n      \"baland\\u017eio\",\n      \"gegu\\u017e\\u0117s\",\n      \"bir\\u017eelio\",\n      \"liepos\",\n      \"rugpj\\u016b\\u010dio\",\n      \"rugs\\u0117jo\",\n      \"spalio\",\n      \"lapkri\\u010dio\",\n      \"gruod\\u017eio\"\n    ],\n    \"SHORTDAY\": [\n      \"sk\",\n      \"pr\",\n      \"an\",\n      \"tr\",\n      \"kt\",\n      \"pn\",\n      \"\\u0161t\"\n    ],\n    \"SHORTMONTH\": [\n      \"saus.\",\n      \"vas.\",\n      \"kov.\",\n      \"bal.\",\n      \"geg.\",\n      \"bir\\u017e.\",\n      \"liep.\",\n      \"rugp.\",\n      \"rugs.\",\n      \"spal.\",\n      \"lapkr.\",\n      \"gruod.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"sausis\",\n      \"vasaris\",\n      \"kovas\",\n      \"balandis\",\n      \"gegu\\u017e\\u0117\",\n      \"bir\\u017eelis\",\n      \"liepa\",\n      \"rugpj\\u016btis\",\n      \"rugs\\u0117jis\",\n      \"spalis\",\n      \"lapkritis\",\n      \"gruodis\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y 'm'. MMMM d 'd'., EEEE\",\n    \"longDate\": \"y 'm'. MMMM d 'd'.\",\n    \"medium\": \"y-MM-dd HH:mm:ss\",\n    \"mediumDate\": \"y-MM-dd\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lt\",\n  \"localeID\": \"lt\",\n  \"pluralCat\": function(n, opt_precision) {  var vf = getVF(n, opt_precision);  if (n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) {    return PLURAL_CATEGORY.ONE;  }  if (n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.f != 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lu-cd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Dinda\",\n      \"Dilolo\"\n    ],\n    \"DAY\": [\n      \"Lumingu\",\n      \"Nkodya\",\n      \"Nd\\u00e0ay\\u00e0\",\n      \"Ndang\\u00f9\",\n      \"Nj\\u00f2wa\",\n      \"Ng\\u00f2vya\",\n      \"Lubingu\"\n    ],\n    \"ERANAMES\": [\n      \"Kumpala kwa Yezu Kli\",\n      \"Kunyima kwa Yezu Kli\"\n    ],\n    \"ERAS\": [\n      \"kmp. Y.K.\",\n      \"kny. Y. K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ciongo\",\n      \"L\\u00f9ishi\",\n      \"Lus\\u00f2lo\",\n      \"M\\u00f9uy\\u00e0\",\n      \"Lum\\u00f9ng\\u00f9l\\u00f9\",\n      \"Lufuimi\",\n      \"Kab\\u00e0l\\u00e0sh\\u00ecp\\u00f9\",\n      \"L\\u00f9sh\\u00eck\\u00e0\",\n      \"Lutongolo\",\n      \"Lung\\u00f9di\",\n      \"Kasw\\u00e8k\\u00e8s\\u00e8\",\n      \"Cisw\\u00e0\"\n    ],\n    \"SHORTDAY\": [\n      \"Lum\",\n      \"Nko\",\n      \"Ndy\",\n      \"Ndg\",\n      \"Njw\",\n      \"Ngv\",\n      \"Lub\"\n    ],\n    \"SHORTMONTH\": [\n      \"Cio\",\n      \"Lui\",\n      \"Lus\",\n      \"Muu\",\n      \"Lum\",\n      \"Luf\",\n      \"Kab\",\n      \"Lush\",\n      \"Lut\",\n      \"Lun\",\n      \"Kas\",\n      \"Cis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ciongo\",\n      \"L\\u00f9ishi\",\n      \"Lus\\u00f2lo\",\n      \"M\\u00f9uy\\u00e0\",\n      \"Lum\\u00f9ng\\u00f9l\\u00f9\",\n      \"Lufuimi\",\n      \"Kab\\u00e0l\\u00e0sh\\u00ecp\\u00f9\",\n      \"L\\u00f9sh\\u00eck\\u00e0\",\n      \"Lutongolo\",\n      \"Lung\\u00f9di\",\n      \"Kasw\\u00e8k\\u00e8s\\u00e8\",\n      \"Cisw\\u00e0\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FrCD\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lu-cd\",\n  \"localeID\": \"lu_CD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Dinda\",\n      \"Dilolo\"\n    ],\n    \"DAY\": [\n      \"Lumingu\",\n      \"Nkodya\",\n      \"Nd\\u00e0ay\\u00e0\",\n      \"Ndang\\u00f9\",\n      \"Nj\\u00f2wa\",\n      \"Ng\\u00f2vya\",\n      \"Lubingu\"\n    ],\n    \"ERANAMES\": [\n      \"Kumpala kwa Yezu Kli\",\n      \"Kunyima kwa Yezu Kli\"\n    ],\n    \"ERAS\": [\n      \"kmp. Y.K.\",\n      \"kny. Y. K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ciongo\",\n      \"L\\u00f9ishi\",\n      \"Lus\\u00f2lo\",\n      \"M\\u00f9uy\\u00e0\",\n      \"Lum\\u00f9ng\\u00f9l\\u00f9\",\n      \"Lufuimi\",\n      \"Kab\\u00e0l\\u00e0sh\\u00ecp\\u00f9\",\n      \"L\\u00f9sh\\u00eck\\u00e0\",\n      \"Lutongolo\",\n      \"Lung\\u00f9di\",\n      \"Kasw\\u00e8k\\u00e8s\\u00e8\",\n      \"Cisw\\u00e0\"\n    ],\n    \"SHORTDAY\": [\n      \"Lum\",\n      \"Nko\",\n      \"Ndy\",\n      \"Ndg\",\n      \"Njw\",\n      \"Ngv\",\n      \"Lub\"\n    ],\n    \"SHORTMONTH\": [\n      \"Cio\",\n      \"Lui\",\n      \"Lus\",\n      \"Muu\",\n      \"Lum\",\n      \"Luf\",\n      \"Kab\",\n      \"Lush\",\n      \"Lut\",\n      \"Lun\",\n      \"Kas\",\n      \"Cis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ciongo\",\n      \"L\\u00f9ishi\",\n      \"Lus\\u00f2lo\",\n      \"M\\u00f9uy\\u00e0\",\n      \"Lum\\u00f9ng\\u00f9l\\u00f9\",\n      \"Lufuimi\",\n      \"Kab\\u00e0l\\u00e0sh\\u00ecp\\u00f9\",\n      \"L\\u00f9sh\\u00eck\\u00e0\",\n      \"Lutongolo\",\n      \"Lung\\u00f9di\",\n      \"Kasw\\u00e8k\\u00e8s\\u00e8\",\n      \"Cisw\\u00e0\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FrCD\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lu\",\n  \"localeID\": \"lu\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_luo-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"OD\",\n      \"OT\"\n    ],\n    \"DAY\": [\n      \"Jumapil\",\n      \"Wuok Tich\",\n      \"Tich Ariyo\",\n      \"Tich Adek\",\n      \"Tich Ang\\u2019wen\",\n      \"Tich Abich\",\n      \"Ngeso\"\n    ],\n    \"ERANAMES\": [\n      \"Kapok Kristo obiro\",\n      \"Ka Kristo osebiro\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Dwe mar Achiel\",\n      \"Dwe mar Ariyo\",\n      \"Dwe mar Adek\",\n      \"Dwe mar Ang\\u2019wen\",\n      \"Dwe mar Abich\",\n      \"Dwe mar Auchiel\",\n      \"Dwe mar Abiriyo\",\n      \"Dwe mar Aboro\",\n      \"Dwe mar Ochiko\",\n      \"Dwe mar Apar\",\n      \"Dwe mar gi achiel\",\n      \"Dwe mar Apar gi ariyo\"\n    ],\n    \"SHORTDAY\": [\n      \"JMP\",\n      \"WUT\",\n      \"TAR\",\n      \"TAD\",\n      \"TAN\",\n      \"TAB\",\n      \"NGS\"\n    ],\n    \"SHORTMONTH\": [\n      \"DAC\",\n      \"DAR\",\n      \"DAD\",\n      \"DAN\",\n      \"DAH\",\n      \"DAU\",\n      \"DAO\",\n      \"DAB\",\n      \"DOC\",\n      \"DAP\",\n      \"DGI\",\n      \"DAG\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Dwe mar Achiel\",\n      \"Dwe mar Ariyo\",\n      \"Dwe mar Adek\",\n      \"Dwe mar Ang\\u2019wen\",\n      \"Dwe mar Abich\",\n      \"Dwe mar Auchiel\",\n      \"Dwe mar Abiriyo\",\n      \"Dwe mar Aboro\",\n      \"Dwe mar Ochiko\",\n      \"Dwe mar Apar\",\n      \"Dwe mar gi achiel\",\n      \"Dwe mar Apar gi ariyo\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"luo-ke\",\n  \"localeID\": \"luo_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_luo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"OD\",\n      \"OT\"\n    ],\n    \"DAY\": [\n      \"Jumapil\",\n      \"Wuok Tich\",\n      \"Tich Ariyo\",\n      \"Tich Adek\",\n      \"Tich Ang\\u2019wen\",\n      \"Tich Abich\",\n      \"Ngeso\"\n    ],\n    \"ERANAMES\": [\n      \"Kapok Kristo obiro\",\n      \"Ka Kristo osebiro\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Dwe mar Achiel\",\n      \"Dwe mar Ariyo\",\n      \"Dwe mar Adek\",\n      \"Dwe mar Ang\\u2019wen\",\n      \"Dwe mar Abich\",\n      \"Dwe mar Auchiel\",\n      \"Dwe mar Abiriyo\",\n      \"Dwe mar Aboro\",\n      \"Dwe mar Ochiko\",\n      \"Dwe mar Apar\",\n      \"Dwe mar gi achiel\",\n      \"Dwe mar Apar gi ariyo\"\n    ],\n    \"SHORTDAY\": [\n      \"JMP\",\n      \"WUT\",\n      \"TAR\",\n      \"TAD\",\n      \"TAN\",\n      \"TAB\",\n      \"NGS\"\n    ],\n    \"SHORTMONTH\": [\n      \"DAC\",\n      \"DAR\",\n      \"DAD\",\n      \"DAN\",\n      \"DAH\",\n      \"DAU\",\n      \"DAO\",\n      \"DAB\",\n      \"DOC\",\n      \"DAP\",\n      \"DGI\",\n      \"DAG\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Dwe mar Achiel\",\n      \"Dwe mar Ariyo\",\n      \"Dwe mar Adek\",\n      \"Dwe mar Ang\\u2019wen\",\n      \"Dwe mar Abich\",\n      \"Dwe mar Auchiel\",\n      \"Dwe mar Abiriyo\",\n      \"Dwe mar Aboro\",\n      \"Dwe mar Ochiko\",\n      \"Dwe mar Apar\",\n      \"Dwe mar gi achiel\",\n      \"Dwe mar Apar gi ariyo\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"luo\",\n  \"localeID\": \"luo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_luy-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Jumapiri\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Murwa wa Kanne\",\n      \"Murwa wa Katano\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Imberi ya Kuuza Kwa\",\n      \"Muhiga Kuvita Kuuza\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"J2\",\n      \"J3\",\n      \"J4\",\n      \"J5\",\n      \"Al\",\n      \"Ij\",\n      \"J1\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"luy-ke\",\n  \"localeID\": \"luy_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_luy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Jumapiri\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Murwa wa Kanne\",\n      \"Murwa wa Katano\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Imberi ya Kuuza Kwa\",\n      \"Muhiga Kuvita Kuuza\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"J2\",\n      \"J3\",\n      \"J4\",\n      \"J5\",\n      \"Al\",\n      \"Ij\",\n      \"J1\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"luy\",\n  \"localeID\": \"luy\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lv-lv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"priek\\u0161pusdien\\u0101\",\n      \"p\\u0113cpusdien\\u0101\"\n    ],\n    \"DAY\": [\n      \"sv\\u0113tdiena\",\n      \"pirmdiena\",\n      \"otrdiena\",\n      \"tre\\u0161diena\",\n      \"ceturtdiena\",\n      \"piektdiena\",\n      \"sestdiena\"\n    ],\n    \"ERANAMES\": [\n      \"pirms m\\u016bsu \\u0113ras\",\n      \"m\\u016bsu \\u0113r\\u0101\"\n    ],\n    \"ERAS\": [\n      \"p.m.\\u0113.\",\n      \"m.\\u0113.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janv\\u0101ris\",\n      \"febru\\u0101ris\",\n      \"marts\",\n      \"apr\\u012blis\",\n      \"maijs\",\n      \"j\\u016bnijs\",\n      \"j\\u016blijs\",\n      \"augusts\",\n      \"septembris\",\n      \"oktobris\",\n      \"novembris\",\n      \"decembris\"\n    ],\n    \"SHORTDAY\": [\n      \"sv\\u0113td.\",\n      \"pirmd.\",\n      \"otrd.\",\n      \"tre\\u0161d.\",\n      \"ceturtd.\",\n      \"piektd.\",\n      \"sestd.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"febr.\",\n      \"marts\",\n      \"apr.\",\n      \"maijs\",\n      \"j\\u016bn.\",\n      \"j\\u016bl.\",\n      \"aug.\",\n      \"sept.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janv\\u0101ris\",\n      \"febru\\u0101ris\",\n      \"marts\",\n      \"apr\\u012blis\",\n      \"maijs\",\n      \"j\\u016bnijs\",\n      \"j\\u016blijs\",\n      \"augusts\",\n      \"septembris\",\n      \"oktobris\",\n      \"novembris\",\n      \"decembris\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y. 'gada' d. MMMM\",\n    \"longDate\": \"y. 'gada' d. MMMM\",\n    \"medium\": \"y. 'gada' d. MMM HH:mm:ss\",\n    \"mediumDate\": \"y. 'gada' d. MMM\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lv-lv\",\n  \"localeID\": \"lv_LV\",\n  \"pluralCat\": function(n, opt_precision) {  var vf = getVF(n, opt_precision);  if (n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19 || vf.v == 2 && vf.f % 100 >= 11 && vf.f % 100 <= 19) {    return PLURAL_CATEGORY.ZERO;  }  if (n % 10 == 1 && n % 100 != 11 || vf.v == 2 && vf.f % 10 == 1 && vf.f % 100 != 11 || vf.v != 2 && vf.f % 10 == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_lv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"priek\\u0161pusdien\\u0101\",\n      \"p\\u0113cpusdien\\u0101\"\n    ],\n    \"DAY\": [\n      \"sv\\u0113tdiena\",\n      \"pirmdiena\",\n      \"otrdiena\",\n      \"tre\\u0161diena\",\n      \"ceturtdiena\",\n      \"piektdiena\",\n      \"sestdiena\"\n    ],\n    \"ERANAMES\": [\n      \"pirms m\\u016bsu \\u0113ras\",\n      \"m\\u016bsu \\u0113r\\u0101\"\n    ],\n    \"ERAS\": [\n      \"p.m.\\u0113.\",\n      \"m.\\u0113.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janv\\u0101ris\",\n      \"febru\\u0101ris\",\n      \"marts\",\n      \"apr\\u012blis\",\n      \"maijs\",\n      \"j\\u016bnijs\",\n      \"j\\u016blijs\",\n      \"augusts\",\n      \"septembris\",\n      \"oktobris\",\n      \"novembris\",\n      \"decembris\"\n    ],\n    \"SHORTDAY\": [\n      \"sv\\u0113td.\",\n      \"pirmd.\",\n      \"otrd.\",\n      \"tre\\u0161d.\",\n      \"ceturtd.\",\n      \"piektd.\",\n      \"sestd.\"\n    ],\n    \"SHORTMONTH\": [\n      \"janv.\",\n      \"febr.\",\n      \"marts\",\n      \"apr.\",\n      \"maijs\",\n      \"j\\u016bn.\",\n      \"j\\u016bl.\",\n      \"aug.\",\n      \"sept.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janv\\u0101ris\",\n      \"febru\\u0101ris\",\n      \"marts\",\n      \"apr\\u012blis\",\n      \"maijs\",\n      \"j\\u016bnijs\",\n      \"j\\u016blijs\",\n      \"augusts\",\n      \"septembris\",\n      \"oktobris\",\n      \"novembris\",\n      \"decembris\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y. 'gada' d. MMMM\",\n    \"longDate\": \"y. 'gada' d. MMMM\",\n    \"medium\": \"y. 'gada' d. MMM HH:mm:ss\",\n    \"mediumDate\": \"y. 'gada' d. MMM\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"lv\",\n  \"localeID\": \"lv\",\n  \"pluralCat\": function(n, opt_precision) {  var vf = getVF(n, opt_precision);  if (n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19 || vf.v == 2 && vf.f % 100 >= 11 && vf.f % 100 <= 19) {    return PLURAL_CATEGORY.ZERO;  }  if (n % 10 == 1 && n % 100 != 11 || vf.v == 2 && vf.f % 10 == 1 && vf.f % 100 != 11 || vf.v != 2 && vf.f % 10 == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mas-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0190nkak\\u025bny\\u00e1\",\n      \"\\u0190nd\\u00e1m\\u00e2\"\n    ],\n    \"DAY\": [\n      \"Jumap\\u00edl\\u00ed\",\n      \"Jumat\\u00e1tu\",\n      \"Jumane\",\n      \"Jumat\\u00e1n\\u0254\",\n      \"Ala\\u00e1misi\",\n      \"Jum\\u00e1a\",\n      \"Jumam\\u00f3si\"\n    ],\n    \"ERANAMES\": [\n      \"Me\\u00edn\\u014d Y\\u025b\\u0301s\\u0289\",\n      \"E\\u00edn\\u014d Y\\u025b\\u0301s\\u0289\"\n    ],\n    \"ERAS\": [\n      \"MY\",\n      \"EY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Oladal\\u0289\\u0301\",\n      \"Ar\\u00e1t\",\n      \"\\u0186\\u025bn\\u0268\\u0301\\u0254\\u0268\\u014b\\u0254k\",\n      \"Olodoy\\u00ed\\u00f3r\\u00ed\\u00ea ink\\u00f3k\\u00fa\\u00e2\",\n      \"Oloil\\u00e9p\\u016bny\\u012b\\u0113 ink\\u00f3k\\u00fa\\u00e2\",\n      \"K\\u00faj\\u00fa\\u0254r\\u0254k\",\n      \"M\\u00f3rus\\u00e1sin\",\n      \"\\u0186l\\u0254\\u0301\\u0268\\u0301b\\u0254\\u0301r\\u00e1r\\u025b\",\n      \"K\\u00fash\\u00een\",\n      \"Olg\\u00edsan\",\n      \"P\\u0289sh\\u0289\\u0301ka\",\n      \"Nt\\u0289\\u0301\\u014b\\u0289\\u0301s\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Dal\",\n      \"Ar\\u00e1\",\n      \"\\u0186\\u025bn\",\n      \"Doy\",\n      \"L\\u00e9p\",\n      \"Rok\",\n      \"S\\u00e1s\",\n      \"B\\u0254\\u0301r\",\n      \"K\\u00fas\",\n      \"G\\u00eds\",\n      \"Sh\\u0289\\u0301\",\n      \"Nt\\u0289\\u0301\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Oladal\\u0289\\u0301\",\n      \"Ar\\u00e1t\",\n      \"\\u0186\\u025bn\\u0268\\u0301\\u0254\\u0268\\u014b\\u0254k\",\n      \"Olodoy\\u00ed\\u00f3r\\u00ed\\u00ea ink\\u00f3k\\u00fa\\u00e2\",\n      \"Oloil\\u00e9p\\u016bny\\u012b\\u0113 ink\\u00f3k\\u00fa\\u00e2\",\n      \"K\\u00faj\\u00fa\\u0254r\\u0254k\",\n      \"M\\u00f3rus\\u00e1sin\",\n      \"\\u0186l\\u0254\\u0301\\u0268\\u0301b\\u0254\\u0301r\\u00e1r\\u025b\",\n      \"K\\u00fash\\u00een\",\n      \"Olg\\u00edsan\",\n      \"P\\u0289sh\\u0289\\u0301ka\",\n      \"Nt\\u0289\\u0301\\u014b\\u0289\\u0301s\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mas-ke\",\n  \"localeID\": \"mas_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mas-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0190nkak\\u025bny\\u00e1\",\n      \"\\u0190nd\\u00e1m\\u00e2\"\n    ],\n    \"DAY\": [\n      \"Jumap\\u00edl\\u00ed\",\n      \"Jumat\\u00e1tu\",\n      \"Jumane\",\n      \"Jumat\\u00e1n\\u0254\",\n      \"Ala\\u00e1misi\",\n      \"Jum\\u00e1a\",\n      \"Jumam\\u00f3si\"\n    ],\n    \"ERANAMES\": [\n      \"Me\\u00edn\\u014d Y\\u025b\\u0301s\\u0289\",\n      \"E\\u00edn\\u014d Y\\u025b\\u0301s\\u0289\"\n    ],\n    \"ERAS\": [\n      \"MY\",\n      \"EY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Oladal\\u0289\\u0301\",\n      \"Ar\\u00e1t\",\n      \"\\u0186\\u025bn\\u0268\\u0301\\u0254\\u0268\\u014b\\u0254k\",\n      \"Olodoy\\u00ed\\u00f3r\\u00ed\\u00ea ink\\u00f3k\\u00fa\\u00e2\",\n      \"Oloil\\u00e9p\\u016bny\\u012b\\u0113 ink\\u00f3k\\u00fa\\u00e2\",\n      \"K\\u00faj\\u00fa\\u0254r\\u0254k\",\n      \"M\\u00f3rus\\u00e1sin\",\n      \"\\u0186l\\u0254\\u0301\\u0268\\u0301b\\u0254\\u0301r\\u00e1r\\u025b\",\n      \"K\\u00fash\\u00een\",\n      \"Olg\\u00edsan\",\n      \"P\\u0289sh\\u0289\\u0301ka\",\n      \"Nt\\u0289\\u0301\\u014b\\u0289\\u0301s\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Dal\",\n      \"Ar\\u00e1\",\n      \"\\u0186\\u025bn\",\n      \"Doy\",\n      \"L\\u00e9p\",\n      \"Rok\",\n      \"S\\u00e1s\",\n      \"B\\u0254\\u0301r\",\n      \"K\\u00fas\",\n      \"G\\u00eds\",\n      \"Sh\\u0289\\u0301\",\n      \"Nt\\u0289\\u0301\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Oladal\\u0289\\u0301\",\n      \"Ar\\u00e1t\",\n      \"\\u0186\\u025bn\\u0268\\u0301\\u0254\\u0268\\u014b\\u0254k\",\n      \"Olodoy\\u00ed\\u00f3r\\u00ed\\u00ea ink\\u00f3k\\u00fa\\u00e2\",\n      \"Oloil\\u00e9p\\u016bny\\u012b\\u0113 ink\\u00f3k\\u00fa\\u00e2\",\n      \"K\\u00faj\\u00fa\\u0254r\\u0254k\",\n      \"M\\u00f3rus\\u00e1sin\",\n      \"\\u0186l\\u0254\\u0301\\u0268\\u0301b\\u0254\\u0301r\\u00e1r\\u025b\",\n      \"K\\u00fash\\u00een\",\n      \"Olg\\u00edsan\",\n      \"P\\u0289sh\\u0289\\u0301ka\",\n      \"Nt\\u0289\\u0301\\u014b\\u0289\\u0301s\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mas-tz\",\n  \"localeID\": \"mas_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mas.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0190nkak\\u025bny\\u00e1\",\n      \"\\u0190nd\\u00e1m\\u00e2\"\n    ],\n    \"DAY\": [\n      \"Jumap\\u00edl\\u00ed\",\n      \"Jumat\\u00e1tu\",\n      \"Jumane\",\n      \"Jumat\\u00e1n\\u0254\",\n      \"Ala\\u00e1misi\",\n      \"Jum\\u00e1a\",\n      \"Jumam\\u00f3si\"\n    ],\n    \"ERANAMES\": [\n      \"Me\\u00edn\\u014d Y\\u025b\\u0301s\\u0289\",\n      \"E\\u00edn\\u014d Y\\u025b\\u0301s\\u0289\"\n    ],\n    \"ERAS\": [\n      \"MY\",\n      \"EY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Oladal\\u0289\\u0301\",\n      \"Ar\\u00e1t\",\n      \"\\u0186\\u025bn\\u0268\\u0301\\u0254\\u0268\\u014b\\u0254k\",\n      \"Olodoy\\u00ed\\u00f3r\\u00ed\\u00ea ink\\u00f3k\\u00fa\\u00e2\",\n      \"Oloil\\u00e9p\\u016bny\\u012b\\u0113 ink\\u00f3k\\u00fa\\u00e2\",\n      \"K\\u00faj\\u00fa\\u0254r\\u0254k\",\n      \"M\\u00f3rus\\u00e1sin\",\n      \"\\u0186l\\u0254\\u0301\\u0268\\u0301b\\u0254\\u0301r\\u00e1r\\u025b\",\n      \"K\\u00fash\\u00een\",\n      \"Olg\\u00edsan\",\n      \"P\\u0289sh\\u0289\\u0301ka\",\n      \"Nt\\u0289\\u0301\\u014b\\u0289\\u0301s\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Dal\",\n      \"Ar\\u00e1\",\n      \"\\u0186\\u025bn\",\n      \"Doy\",\n      \"L\\u00e9p\",\n      \"Rok\",\n      \"S\\u00e1s\",\n      \"B\\u0254\\u0301r\",\n      \"K\\u00fas\",\n      \"G\\u00eds\",\n      \"Sh\\u0289\\u0301\",\n      \"Nt\\u0289\\u0301\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Oladal\\u0289\\u0301\",\n      \"Ar\\u00e1t\",\n      \"\\u0186\\u025bn\\u0268\\u0301\\u0254\\u0268\\u014b\\u0254k\",\n      \"Olodoy\\u00ed\\u00f3r\\u00ed\\u00ea ink\\u00f3k\\u00fa\\u00e2\",\n      \"Oloil\\u00e9p\\u016bny\\u012b\\u0113 ink\\u00f3k\\u00fa\\u00e2\",\n      \"K\\u00faj\\u00fa\\u0254r\\u0254k\",\n      \"M\\u00f3rus\\u00e1sin\",\n      \"\\u0186l\\u0254\\u0301\\u0268\\u0301b\\u0254\\u0301r\\u00e1r\\u025b\",\n      \"K\\u00fash\\u00een\",\n      \"Olg\\u00edsan\",\n      \"P\\u0289sh\\u0289\\u0301ka\",\n      \"Nt\\u0289\\u0301\\u014b\\u0289\\u0301s\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mas\",\n  \"localeID\": \"mas\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mer-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"R\\u0168\",\n      \"\\u0168G\"\n    ],\n    \"DAY\": [\n      \"Kiumia\",\n      \"Muramuko\",\n      \"Wairi\",\n      \"Wethatu\",\n      \"Wena\",\n      \"Wetano\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Krist\\u0169\",\n      \"Nyuma ya Krist\\u0169\"\n    ],\n    \"ERAS\": [\n      \"MK\",\n      \"NK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januar\\u0129\",\n      \"Feburuar\\u0129\",\n      \"Machi\",\n      \"\\u0128pur\\u0169\",\n      \"M\\u0129\\u0129\",\n      \"Njuni\",\n      \"Njura\\u0129\",\n      \"Agasti\",\n      \"Septemba\",\n      \"Okt\\u0169ba\",\n      \"Novemba\",\n      \"Dicemba\"\n    ],\n    \"SHORTDAY\": [\n      \"KIU\",\n      \"MRA\",\n      \"WAI\",\n      \"WET\",\n      \"WEN\",\n      \"WTN\",\n      \"JUM\"\n    ],\n    \"SHORTMONTH\": [\n      \"JAN\",\n      \"FEB\",\n      \"MAC\",\n      \"\\u0128PU\",\n      \"M\\u0128\\u0128\",\n      \"NJU\",\n      \"NJR\",\n      \"AGA\",\n      \"SPT\",\n      \"OKT\",\n      \"NOV\",\n      \"DEC\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\\u0129\",\n      \"Feburuar\\u0129\",\n      \"Machi\",\n      \"\\u0128pur\\u0169\",\n      \"M\\u0129\\u0129\",\n      \"Njuni\",\n      \"Njura\\u0129\",\n      \"Agasti\",\n      \"Septemba\",\n      \"Okt\\u0169ba\",\n      \"Novemba\",\n      \"Dicemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mer-ke\",\n  \"localeID\": \"mer_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mer.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"R\\u0168\",\n      \"\\u0168G\"\n    ],\n    \"DAY\": [\n      \"Kiumia\",\n      \"Muramuko\",\n      \"Wairi\",\n      \"Wethatu\",\n      \"Wena\",\n      \"Wetano\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Krist\\u0169\",\n      \"Nyuma ya Krist\\u0169\"\n    ],\n    \"ERAS\": [\n      \"MK\",\n      \"NK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januar\\u0129\",\n      \"Feburuar\\u0129\",\n      \"Machi\",\n      \"\\u0128pur\\u0169\",\n      \"M\\u0129\\u0129\",\n      \"Njuni\",\n      \"Njura\\u0129\",\n      \"Agasti\",\n      \"Septemba\",\n      \"Okt\\u0169ba\",\n      \"Novemba\",\n      \"Dicemba\"\n    ],\n    \"SHORTDAY\": [\n      \"KIU\",\n      \"MRA\",\n      \"WAI\",\n      \"WET\",\n      \"WEN\",\n      \"WTN\",\n      \"JUM\"\n    ],\n    \"SHORTMONTH\": [\n      \"JAN\",\n      \"FEB\",\n      \"MAC\",\n      \"\\u0128PU\",\n      \"M\\u0128\\u0128\",\n      \"NJU\",\n      \"NJR\",\n      \"AGA\",\n      \"SPT\",\n      \"OKT\",\n      \"NOV\",\n      \"DEC\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januar\\u0129\",\n      \"Feburuar\\u0129\",\n      \"Machi\",\n      \"\\u0128pur\\u0169\",\n      \"M\\u0129\\u0129\",\n      \"Njuni\",\n      \"Njura\\u0129\",\n      \"Agasti\",\n      \"Septemba\",\n      \"Okt\\u0169ba\",\n      \"Novemba\",\n      \"Dicemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mer\",\n  \"localeID\": \"mer\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mfe-mu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimans\",\n      \"lindi\",\n      \"mardi\",\n      \"merkredi\",\n      \"zedi\",\n      \"vandredi\",\n      \"samdi\"\n    ],\n    \"ERANAMES\": [\n      \"avan Zezi-Krist\",\n      \"apre Zezi-Krist\"\n    ],\n    \"ERAS\": [\n      \"av. Z-K\",\n      \"ap. Z-K\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"zanvie\",\n      \"fevriye\",\n      \"mars\",\n      \"avril\",\n      \"me\",\n      \"zin\",\n      \"zilye\",\n      \"out\",\n      \"septam\",\n      \"oktob\",\n      \"novam\",\n      \"desam\"\n    ],\n    \"SHORTDAY\": [\n      \"dim\",\n      \"lin\",\n      \"mar\",\n      \"mer\",\n      \"ze\",\n      \"van\",\n      \"sam\"\n    ],\n    \"SHORTMONTH\": [\n      \"zan\",\n      \"fev\",\n      \"mar\",\n      \"avr\",\n      \"me\",\n      \"zin\",\n      \"zil\",\n      \"out\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"zanvie\",\n      \"fevriye\",\n      \"mars\",\n      \"avril\",\n      \"me\",\n      \"zin\",\n      \"zilye\",\n      \"out\",\n      \"septam\",\n      \"oktob\",\n      \"novam\",\n      \"desam\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MURs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mfe-mu\",\n  \"localeID\": \"mfe_MU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mfe.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dimans\",\n      \"lindi\",\n      \"mardi\",\n      \"merkredi\",\n      \"zedi\",\n      \"vandredi\",\n      \"samdi\"\n    ],\n    \"ERANAMES\": [\n      \"avan Zezi-Krist\",\n      \"apre Zezi-Krist\"\n    ],\n    \"ERAS\": [\n      \"av. Z-K\",\n      \"ap. Z-K\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"zanvie\",\n      \"fevriye\",\n      \"mars\",\n      \"avril\",\n      \"me\",\n      \"zin\",\n      \"zilye\",\n      \"out\",\n      \"septam\",\n      \"oktob\",\n      \"novam\",\n      \"desam\"\n    ],\n    \"SHORTDAY\": [\n      \"dim\",\n      \"lin\",\n      \"mar\",\n      \"mer\",\n      \"ze\",\n      \"van\",\n      \"sam\"\n    ],\n    \"SHORTMONTH\": [\n      \"zan\",\n      \"fev\",\n      \"mar\",\n      \"avr\",\n      \"me\",\n      \"zin\",\n      \"zil\",\n      \"out\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"zanvie\",\n      \"fevriye\",\n      \"mars\",\n      \"avril\",\n      \"me\",\n      \"zin\",\n      \"zilye\",\n      \"out\",\n      \"septam\",\n      \"oktob\",\n      \"novam\",\n      \"desam\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MURs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mfe\",\n  \"localeID\": \"mfe\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mg-mg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Alahady\",\n      \"Alatsinainy\",\n      \"Talata\",\n      \"Alarobia\",\n      \"Alakamisy\",\n      \"Zoma\",\n      \"Asabotsy\"\n    ],\n    \"ERANAMES\": [\n      \"Alohan\\u2019i JK\",\n      \"Aorian\\u2019i JK\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janoary\",\n      \"Febroary\",\n      \"Martsa\",\n      \"Aprily\",\n      \"Mey\",\n      \"Jona\",\n      \"Jolay\",\n      \"Aogositra\",\n      \"Septambra\",\n      \"Oktobra\",\n      \"Novambra\",\n      \"Desambra\"\n    ],\n    \"SHORTDAY\": [\n      \"Alah\",\n      \"Alats\",\n      \"Tal\",\n      \"Alar\",\n      \"Alak\",\n      \"Zom\",\n      \"Asab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"Mey\",\n      \"Jon\",\n      \"Jol\",\n      \"Aog\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janoary\",\n      \"Febroary\",\n      \"Martsa\",\n      \"Aprily\",\n      \"Mey\",\n      \"Jona\",\n      \"Jolay\",\n      \"Aogositra\",\n      \"Septambra\",\n      \"Oktobra\",\n      \"Novambra\",\n      \"Desambra\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ar\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mg-mg\",\n  \"localeID\": \"mg_MG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Alahady\",\n      \"Alatsinainy\",\n      \"Talata\",\n      \"Alarobia\",\n      \"Alakamisy\",\n      \"Zoma\",\n      \"Asabotsy\"\n    ],\n    \"ERANAMES\": [\n      \"Alohan\\u2019i JK\",\n      \"Aorian\\u2019i JK\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janoary\",\n      \"Febroary\",\n      \"Martsa\",\n      \"Aprily\",\n      \"Mey\",\n      \"Jona\",\n      \"Jolay\",\n      \"Aogositra\",\n      \"Septambra\",\n      \"Oktobra\",\n      \"Novambra\",\n      \"Desambra\"\n    ],\n    \"SHORTDAY\": [\n      \"Alah\",\n      \"Alats\",\n      \"Tal\",\n      \"Alar\",\n      \"Alak\",\n      \"Zom\",\n      \"Asab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"Mey\",\n      \"Jon\",\n      \"Jol\",\n      \"Aog\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janoary\",\n      \"Febroary\",\n      \"Martsa\",\n      \"Aprily\",\n      \"Mey\",\n      \"Jona\",\n      \"Jolay\",\n      \"Aogositra\",\n      \"Septambra\",\n      \"Oktobra\",\n      \"Novambra\",\n      \"Desambra\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ar\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mg\",\n  \"localeID\": \"mg\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mgh-mz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"wichishu\",\n      \"mchochil\\u2019l\"\n    ],\n    \"DAY\": [\n      \"Sabato\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Arahamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Hinapiya yesu\",\n      \"Yopia yesu\"\n    ],\n    \"ERAS\": [\n      \"HY\",\n      \"YY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mweri wo kwanza\",\n      \"Mweri wo unayeli\",\n      \"Mweri wo uneraru\",\n      \"Mweri wo unecheshe\",\n      \"Mweri wo unethanu\",\n      \"Mweri wo thanu na mocha\",\n      \"Mweri wo saba\",\n      \"Mweri wo nane\",\n      \"Mweri wo tisa\",\n      \"Mweri wo kumi\",\n      \"Mweri wo kumi na moja\",\n      \"Mweri wo kumi na yel\\u2019li\"\n    ],\n    \"SHORTDAY\": [\n      \"Sab\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Ara\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Kwa\",\n      \"Una\",\n      \"Rar\",\n      \"Che\",\n      \"Tha\",\n      \"Moc\",\n      \"Sab\",\n      \"Nan\",\n      \"Tis\",\n      \"Kum\",\n      \"Moj\",\n      \"Yel\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mweri wo kwanza\",\n      \"Mweri wo unayeli\",\n      \"Mweri wo uneraru\",\n      \"Mweri wo unecheshe\",\n      \"Mweri wo unethanu\",\n      \"Mweri wo thanu na mocha\",\n      \"Mweri wo saba\",\n      \"Mweri wo nane\",\n      \"Mweri wo tisa\",\n      \"Mweri wo kumi\",\n      \"Mweri wo kumi na moja\",\n      \"Mweri wo kumi na yel\\u2019li\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MTn\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mgh-mz\",\n  \"localeID\": \"mgh_MZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mgh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"wichishu\",\n      \"mchochil\\u2019l\"\n    ],\n    \"DAY\": [\n      \"Sabato\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Arahamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Hinapiya yesu\",\n      \"Yopia yesu\"\n    ],\n    \"ERAS\": [\n      \"HY\",\n      \"YY\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Mweri wo kwanza\",\n      \"Mweri wo unayeli\",\n      \"Mweri wo uneraru\",\n      \"Mweri wo unecheshe\",\n      \"Mweri wo unethanu\",\n      \"Mweri wo thanu na mocha\",\n      \"Mweri wo saba\",\n      \"Mweri wo nane\",\n      \"Mweri wo tisa\",\n      \"Mweri wo kumi\",\n      \"Mweri wo kumi na moja\",\n      \"Mweri wo kumi na yel\\u2019li\"\n    ],\n    \"SHORTDAY\": [\n      \"Sab\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Ara\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Kwa\",\n      \"Una\",\n      \"Rar\",\n      \"Che\",\n      \"Tha\",\n      \"Moc\",\n      \"Sab\",\n      \"Nan\",\n      \"Tis\",\n      \"Kum\",\n      \"Moj\",\n      \"Yel\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mweri wo kwanza\",\n      \"Mweri wo unayeli\",\n      \"Mweri wo uneraru\",\n      \"Mweri wo unecheshe\",\n      \"Mweri wo unethanu\",\n      \"Mweri wo thanu na mocha\",\n      \"Mweri wo saba\",\n      \"Mweri wo nane\",\n      \"Mweri wo tisa\",\n      \"Mweri wo kumi\",\n      \"Mweri wo kumi na moja\",\n      \"Mweri wo kumi na yel\\u2019li\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MTn\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mgh\",\n  \"localeID\": \"mgh\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mgo-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Aneg 1\",\n      \"Aneg 2\",\n      \"Aneg 3\",\n      \"Aneg 4\",\n      \"Aneg 5\",\n      \"Aneg 6\",\n      \"Aneg 7\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"im\\u0259g mbegtug\",\n      \"imeg \\u00e0b\\u00f9b\\u00ec\",\n      \"imeg mb\\u0259\\u014bchubi\",\n      \"im\\u0259g ngw\\u0259\\u0300t\",\n      \"im\\u0259g fog\",\n      \"im\\u0259g ichiib\\u0254d\",\n      \"im\\u0259g \\u00e0d\\u00f9mb\\u0259\\u0300\\u014b\",\n      \"im\\u0259g ichika\",\n      \"im\\u0259g kud\",\n      \"im\\u0259g t\\u00e8si\\u02bce\",\n      \"im\\u0259g z\\u00f2\",\n      \"im\\u0259g krizmed\"\n    ],\n    \"SHORTDAY\": [\n      \"Aneg 1\",\n      \"Aneg 2\",\n      \"Aneg 3\",\n      \"Aneg 4\",\n      \"Aneg 5\",\n      \"Aneg 6\",\n      \"Aneg 7\"\n    ],\n    \"SHORTMONTH\": [\n      \"mbegtug\",\n      \"imeg \\u00e0b\\u00f9b\\u00ec\",\n      \"imeg mb\\u0259\\u014bchubi\",\n      \"im\\u0259g ngw\\u0259\\u0300t\",\n      \"im\\u0259g fog\",\n      \"im\\u0259g ichiib\\u0254d\",\n      \"im\\u0259g \\u00e0d\\u00f9mb\\u0259\\u0300\\u014b\",\n      \"im\\u0259g ichika\",\n      \"im\\u0259g kud\",\n      \"im\\u0259g t\\u00e8si\\u02bce\",\n      \"im\\u0259g z\\u00f2\",\n      \"im\\u0259g krizmed\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"im\\u0259g mbegtug\",\n      \"imeg \\u00e0b\\u00f9b\\u00ec\",\n      \"imeg mb\\u0259\\u014bchubi\",\n      \"im\\u0259g ngw\\u0259\\u0300t\",\n      \"im\\u0259g fog\",\n      \"im\\u0259g ichiib\\u0254d\",\n      \"im\\u0259g \\u00e0d\\u00f9mb\\u0259\\u0300\\u014b\",\n      \"im\\u0259g ichika\",\n      \"im\\u0259g kud\",\n      \"im\\u0259g t\\u00e8si\\u02bce\",\n      \"im\\u0259g z\\u00f2\",\n      \"im\\u0259g krizmed\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y MMMM dd\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mgo-cm\",\n  \"localeID\": \"mgo_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mgo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Aneg 1\",\n      \"Aneg 2\",\n      \"Aneg 3\",\n      \"Aneg 4\",\n      \"Aneg 5\",\n      \"Aneg 6\",\n      \"Aneg 7\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"im\\u0259g mbegtug\",\n      \"imeg \\u00e0b\\u00f9b\\u00ec\",\n      \"imeg mb\\u0259\\u014bchubi\",\n      \"im\\u0259g ngw\\u0259\\u0300t\",\n      \"im\\u0259g fog\",\n      \"im\\u0259g ichiib\\u0254d\",\n      \"im\\u0259g \\u00e0d\\u00f9mb\\u0259\\u0300\\u014b\",\n      \"im\\u0259g ichika\",\n      \"im\\u0259g kud\",\n      \"im\\u0259g t\\u00e8si\\u02bce\",\n      \"im\\u0259g z\\u00f2\",\n      \"im\\u0259g krizmed\"\n    ],\n    \"SHORTDAY\": [\n      \"Aneg 1\",\n      \"Aneg 2\",\n      \"Aneg 3\",\n      \"Aneg 4\",\n      \"Aneg 5\",\n      \"Aneg 6\",\n      \"Aneg 7\"\n    ],\n    \"SHORTMONTH\": [\n      \"mbegtug\",\n      \"imeg \\u00e0b\\u00f9b\\u00ec\",\n      \"imeg mb\\u0259\\u014bchubi\",\n      \"im\\u0259g ngw\\u0259\\u0300t\",\n      \"im\\u0259g fog\",\n      \"im\\u0259g ichiib\\u0254d\",\n      \"im\\u0259g \\u00e0d\\u00f9mb\\u0259\\u0300\\u014b\",\n      \"im\\u0259g ichika\",\n      \"im\\u0259g kud\",\n      \"im\\u0259g t\\u00e8si\\u02bce\",\n      \"im\\u0259g z\\u00f2\",\n      \"im\\u0259g krizmed\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"im\\u0259g mbegtug\",\n      \"imeg \\u00e0b\\u00f9b\\u00ec\",\n      \"imeg mb\\u0259\\u014bchubi\",\n      \"im\\u0259g ngw\\u0259\\u0300t\",\n      \"im\\u0259g fog\",\n      \"im\\u0259g ichiib\\u0254d\",\n      \"im\\u0259g \\u00e0d\\u00f9mb\\u0259\\u0300\\u014b\",\n      \"im\\u0259g ichika\",\n      \"im\\u0259g kud\",\n      \"im\\u0259g t\\u00e8si\\u02bce\",\n      \"im\\u0259g z\\u00f2\",\n      \"im\\u0259g krizmed\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y MMMM dd\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mgo\",\n  \"localeID\": \"mgo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mk-mk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435\\u0442\\u043f\\u043b\\u0430\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e\\u043f\\u043b\\u0430\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u043b\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u043e\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u043e\\u043a\",\n      \"\\u0441\\u0430\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435\\u0434 \\u043d\\u0430\\u0448\\u0430\\u0442\\u0430 \\u0435\\u0440\\u0430\",\n      \"\\u043e\\u0434 \\u043d\\u0430\\u0448\\u0430\\u0442\\u0430 \\u0435\\u0440\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u043f\\u0440.\\u043d.\\u0435.\",\n      \"\\u043d.\\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434.\",\n      \"\\u043f\\u043e\\u043d.\",\n      \"\\u0432\\u0442.\",\n      \"\\u0441\\u0440\\u0435.\",\n      \"\\u0447\\u0435\\u0442.\",\n      \"\\u043f\\u0435\\u0442.\",\n      \"\\u0441\\u0430\\u0431.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d.\",\n      \"\\u0444\\u0435\\u0432.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d.\",\n      \"\\u0458\\u0443\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043f\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u0435\\u043c.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd.M.y HH:mm:ss\",\n    \"mediumDate\": \"dd.M.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.M.yy HH:mm\",\n    \"shortDate\": \"dd.M.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"mk-mk\",\n  \"localeID\": \"mk_MK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 || vf.f % 10 == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435\\u0442\\u043f\\u043b\\u0430\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e\\u043f\\u043b\\u0430\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u043b\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u043e\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u043e\\u043a\",\n      \"\\u0441\\u0430\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435\\u0434 \\u043d\\u0430\\u0448\\u0430\\u0442\\u0430 \\u0435\\u0440\\u0430\",\n      \"\\u043e\\u0434 \\u043d\\u0430\\u0448\\u0430\\u0442\\u0430 \\u0435\\u0440\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u043f\\u0440.\\u043d.\\u0435.\",\n      \"\\u043d.\\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434.\",\n      \"\\u043f\\u043e\\u043d.\",\n      \"\\u0432\\u0442.\",\n      \"\\u0441\\u0440\\u0435.\",\n      \"\\u0447\\u0435\\u0442.\",\n      \"\\u043f\\u0435\\u0442.\",\n      \"\\u0441\\u0430\\u0431.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d.\",\n      \"\\u0444\\u0435\\u0432.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d.\",\n      \"\\u0458\\u0443\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043f\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u0435\\u043c.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0443\\u0430\\u0440\\u0438\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\\u0438\",\n      \"\\u0458\\u0443\\u043b\\u0438\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u043d\\u043e\\u0435\\u043c\\u0432\\u0440\\u0438\",\n      \"\\u0434\\u0435\\u043a\\u0435\\u043c\\u0432\\u0440\\u0438\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd.M.y HH:mm:ss\",\n    \"mediumDate\": \"dd.M.y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.M.yy HH:mm\",\n    \"shortDate\": \"dd.M.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"mk\",\n  \"localeID\": \"mk\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 || vf.f % 10 == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ml-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0d1e\\u0d3e\\u0d2f\\u0d31\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d24\\u0d3f\\u0d19\\u0d4d\\u0d15\\u0d33\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d1a\\u0d4a\\u0d35\\u0d4d\\u0d35\\u0d3e\\u0d34\\u0d4d\\u0d1a\",\n      \"\\u0d2c\\u0d41\\u0d27\\u0d28\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d35\\u0d4d\\u0d2f\\u0d3e\\u0d34\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d35\\u0d46\\u0d33\\u0d4d\\u0d33\\u0d3f\\u0d2f\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d36\\u0d28\\u0d3f\\u0d2f\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0d15\\u0d4d\\u0d30\\u0d3f\\u0d38\\u0d4d\\u200c\\u0d24\\u0d41\\u0d35\\u0d3f\\u0d28\\u0d4d \\u0d2e\\u0d41\\u0d2e\\u0d4d\\u0d2a\\u0d4d\",\n      \"\\u0d06\\u0d28\\u0d4d\\u0d28\\u0d4b \\u0d21\\u0d4a\\u0d2e\\u0d3f\\u0d28\\u0d3f\"\n    ],\n    \"ERAS\": [\n      \"\\u0d15\\u0d4d\\u0d30\\u0d3f.\\u0d2e\\u0d41.\",\n      \"\\u0d0e\\u0d21\\u0d3f\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0d1c\\u0d28\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2b\\u0d46\\u0d2c\\u0d4d\\u0d30\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2e\\u0d3e\\u0d7c\\u0d1a\\u0d4d\\u0d1a\\u0d4d\",\n      \"\\u0d0f\\u0d2a\\u0d4d\\u0d30\\u0d3f\\u0d7d\",\n      \"\\u0d2e\\u0d47\\u0d2f\\u0d4d\",\n      \"\\u0d1c\\u0d42\\u0d7a\",\n      \"\\u0d1c\\u0d42\\u0d32\\u0d48\",\n      \"\\u0d13\\u0d17\\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d4d\",\n      \"\\u0d38\\u0d46\\u0d2a\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d12\\u0d15\\u0d4d\\u200c\\u0d1f\\u0d4b\\u0d2c\\u0d7c\",\n      \"\\u0d28\\u0d35\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d21\\u0d3f\\u0d38\\u0d02\\u0d2c\\u0d7c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0d1e\\u0d3e\\u0d2f\\u0d7c\",\n      \"\\u0d24\\u0d3f\\u0d19\\u0d4d\\u0d15\\u0d7e\",\n      \"\\u0d1a\\u0d4a\\u0d35\\u0d4d\\u0d35\",\n      \"\\u0d2c\\u0d41\\u0d27\\u0d7b\",\n      \"\\u0d35\\u0d4d\\u0d2f\\u0d3e\\u0d34\\u0d02\",\n      \"\\u0d35\\u0d46\\u0d33\\u0d4d\\u0d33\\u0d3f\",\n      \"\\u0d36\\u0d28\\u0d3f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0d1c\\u0d28\\u0d41\",\n      \"\\u0d2b\\u0d46\\u0d2c\\u0d4d\\u0d30\\u0d41\",\n      \"\\u0d2e\\u0d3e\\u0d7c\",\n      \"\\u0d0f\\u0d2a\\u0d4d\\u0d30\\u0d3f\",\n      \"\\u0d2e\\u0d47\\u0d2f\\u0d4d\",\n      \"\\u0d1c\\u0d42\\u0d7a\",\n      \"\\u0d1c\\u0d42\\u0d32\\u0d48\",\n      \"\\u0d13\\u0d17\",\n      \"\\u0d38\\u0d46\\u0d2a\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d02\",\n      \"\\u0d12\\u0d15\\u0d4d\\u0d1f\\u0d4b\",\n      \"\\u0d28\\u0d35\\u0d02\",\n      \"\\u0d21\\u0d3f\\u0d38\\u0d02\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0d1c\\u0d28\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2b\\u0d46\\u0d2c\\u0d4d\\u0d30\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2e\\u0d3e\\u0d7c\\u0d1a\\u0d4d\\u0d1a\\u0d4d\",\n      \"\\u0d0f\\u0d2a\\u0d4d\\u0d30\\u0d3f\\u0d7d\",\n      \"\\u0d2e\\u0d47\\u0d2f\\u0d4d\",\n      \"\\u0d1c\\u0d42\\u0d7a\",\n      \"\\u0d1c\\u0d42\\u0d32\\u0d48\",\n      \"\\u0d13\\u0d17\\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d4d\",\n      \"\\u0d38\\u0d46\\u0d2a\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d12\\u0d15\\u0d4d\\u200c\\u0d1f\\u0d4b\\u0d2c\\u0d7c\",\n      \"\\u0d28\\u0d35\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d21\\u0d3f\\u0d38\\u0d02\\u0d2c\\u0d7c\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y, MMMM d, EEEE\",\n    \"longDate\": \"y, MMMM d\",\n    \"medium\": \"y, MMM d h:mm:ss a\",\n    \"mediumDate\": \"y, MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ml-in\",\n  \"localeID\": \"ml_IN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ml.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0d1e\\u0d3e\\u0d2f\\u0d31\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d24\\u0d3f\\u0d19\\u0d4d\\u0d15\\u0d33\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d1a\\u0d4a\\u0d35\\u0d4d\\u0d35\\u0d3e\\u0d34\\u0d4d\\u0d1a\",\n      \"\\u0d2c\\u0d41\\u0d27\\u0d28\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d35\\u0d4d\\u0d2f\\u0d3e\\u0d34\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d35\\u0d46\\u0d33\\u0d4d\\u0d33\\u0d3f\\u0d2f\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\",\n      \"\\u0d36\\u0d28\\u0d3f\\u0d2f\\u0d3e\\u0d34\\u0d4d\\u200c\\u0d1a\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0d15\\u0d4d\\u0d30\\u0d3f\\u0d38\\u0d4d\\u200c\\u0d24\\u0d41\\u0d35\\u0d3f\\u0d28\\u0d4d \\u0d2e\\u0d41\\u0d2e\\u0d4d\\u0d2a\\u0d4d\",\n      \"\\u0d06\\u0d28\\u0d4d\\u0d28\\u0d4b \\u0d21\\u0d4a\\u0d2e\\u0d3f\\u0d28\\u0d3f\"\n    ],\n    \"ERAS\": [\n      \"\\u0d15\\u0d4d\\u0d30\\u0d3f.\\u0d2e\\u0d41.\",\n      \"\\u0d0e\\u0d21\\u0d3f\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0d1c\\u0d28\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2b\\u0d46\\u0d2c\\u0d4d\\u0d30\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2e\\u0d3e\\u0d7c\\u0d1a\\u0d4d\\u0d1a\\u0d4d\",\n      \"\\u0d0f\\u0d2a\\u0d4d\\u0d30\\u0d3f\\u0d7d\",\n      \"\\u0d2e\\u0d47\\u0d2f\\u0d4d\",\n      \"\\u0d1c\\u0d42\\u0d7a\",\n      \"\\u0d1c\\u0d42\\u0d32\\u0d48\",\n      \"\\u0d13\\u0d17\\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d4d\",\n      \"\\u0d38\\u0d46\\u0d2a\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d12\\u0d15\\u0d4d\\u200c\\u0d1f\\u0d4b\\u0d2c\\u0d7c\",\n      \"\\u0d28\\u0d35\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d21\\u0d3f\\u0d38\\u0d02\\u0d2c\\u0d7c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0d1e\\u0d3e\\u0d2f\\u0d7c\",\n      \"\\u0d24\\u0d3f\\u0d19\\u0d4d\\u0d15\\u0d7e\",\n      \"\\u0d1a\\u0d4a\\u0d35\\u0d4d\\u0d35\",\n      \"\\u0d2c\\u0d41\\u0d27\\u0d7b\",\n      \"\\u0d35\\u0d4d\\u0d2f\\u0d3e\\u0d34\\u0d02\",\n      \"\\u0d35\\u0d46\\u0d33\\u0d4d\\u0d33\\u0d3f\",\n      \"\\u0d36\\u0d28\\u0d3f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0d1c\\u0d28\\u0d41\",\n      \"\\u0d2b\\u0d46\\u0d2c\\u0d4d\\u0d30\\u0d41\",\n      \"\\u0d2e\\u0d3e\\u0d7c\",\n      \"\\u0d0f\\u0d2a\\u0d4d\\u0d30\\u0d3f\",\n      \"\\u0d2e\\u0d47\\u0d2f\\u0d4d\",\n      \"\\u0d1c\\u0d42\\u0d7a\",\n      \"\\u0d1c\\u0d42\\u0d32\\u0d48\",\n      \"\\u0d13\\u0d17\",\n      \"\\u0d38\\u0d46\\u0d2a\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d02\",\n      \"\\u0d12\\u0d15\\u0d4d\\u0d1f\\u0d4b\",\n      \"\\u0d28\\u0d35\\u0d02\",\n      \"\\u0d21\\u0d3f\\u0d38\\u0d02\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0d1c\\u0d28\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2b\\u0d46\\u0d2c\\u0d4d\\u0d30\\u0d41\\u0d35\\u0d30\\u0d3f\",\n      \"\\u0d2e\\u0d3e\\u0d7c\\u0d1a\\u0d4d\\u0d1a\\u0d4d\",\n      \"\\u0d0f\\u0d2a\\u0d4d\\u0d30\\u0d3f\\u0d7d\",\n      \"\\u0d2e\\u0d47\\u0d2f\\u0d4d\",\n      \"\\u0d1c\\u0d42\\u0d7a\",\n      \"\\u0d1c\\u0d42\\u0d32\\u0d48\",\n      \"\\u0d13\\u0d17\\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d4d\",\n      \"\\u0d38\\u0d46\\u0d2a\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d12\\u0d15\\u0d4d\\u200c\\u0d1f\\u0d4b\\u0d2c\\u0d7c\",\n      \"\\u0d28\\u0d35\\u0d02\\u0d2c\\u0d7c\",\n      \"\\u0d21\\u0d3f\\u0d38\\u0d02\\u0d2c\\u0d7c\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y, MMMM d, EEEE\",\n    \"longDate\": \"y, MMMM d\",\n    \"medium\": \"y, MMM d h:mm:ss a\",\n    \"mediumDate\": \"y, MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ml\",\n  \"localeID\": \"ml\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mn-mn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u04af.\\u04e9\",\n      \"\\u04af.\\u0445\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u044f\\u043c\",\n      \"\\u0434\\u0430\\u0432\\u0430\\u0430\",\n      \"\\u043c\\u044f\\u0433\\u043c\\u0430\\u0440\",\n      \"\\u043b\\u0445\\u0430\\u0433\\u0432\\u0430\",\n      \"\\u043f\\u04af\\u0440\\u044d\\u0432\",\n      \"\\u0431\\u0430\\u0430\\u0441\\u0430\\u043d\",\n      \"\\u0431\\u044f\\u043c\\u0431\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043c\\u0430\\u043d\\u0430\\u0439 \\u044d\\u0440\\u0438\\u043d\\u0438\\u0439 \\u04e9\\u043c\\u043d\\u04e9\\u0445\",\n      \"\\u043c\\u0430\\u043d\\u0430\\u0439 \\u044d\\u0440\\u0438\\u043d\\u0438\\u0439\"\n    ],\n    \"ERAS\": [\n      \"\\u043c.\\u044d.\\u04e9\",\n      \"\\u043c.\\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u041d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0425\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0413\\u0443\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u04e9\\u0440\\u04e9\\u0432\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0422\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0417\\u0443\\u0440\\u0433\\u0430\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u043e\\u043b\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u041d\\u0430\\u0439\\u043c\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0415\\u0441\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u043d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u0445\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u041d\\u044f\",\n      \"\\u0414\\u0430\",\n      \"\\u041c\\u044f\",\n      \"\\u041b\\u0445\",\n      \"\\u041f\\u04af\",\n      \"\\u0411\\u0430\",\n      \"\\u0411\\u044f\"\n    ],\n    \"SHORTMONTH\": [\n      \"1-\\u0440 \\u0441\\u0430\\u0440\",\n      \"2-\\u0440 \\u0441\\u0430\\u0440\",\n      \"3-\\u0440 \\u0441\\u0430\\u0440\",\n      \"4-\\u0440 \\u0441\\u0430\\u0440\",\n      \"5-\\u0440 \\u0441\\u0430\\u0440\",\n      \"6-\\u0440 \\u0441\\u0430\\u0440\",\n      \"7-\\u0440 \\u0441\\u0430\\u0440\",\n      \"8-\\u0440 \\u0441\\u0430\\u0440\",\n      \"9-\\u0440 \\u0441\\u0430\\u0440\",\n      \"10-\\u0440 \\u0441\\u0430\\u0440\",\n      \"11-\\u0440 \\u0441\\u0430\\u0440\",\n      \"12-\\u0440 \\u0441\\u0430\\u0440\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u041d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0425\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0413\\u0443\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u04e9\\u0440\\u04e9\\u0432\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0422\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0417\\u0443\\u0440\\u0433\\u0430\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u043e\\u043b\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u041d\\u0430\\u0439\\u043c\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0415\\u0441\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u043d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u0445\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y '\\u043e\\u043d\\u044b' MM '\\u0441\\u0430\\u0440\\u044b\\u043d' d\",\n    \"longDate\": \"y'\\u043e\\u043d\\u044b' MMMM'\\u0441\\u0430\\u0440\\u044b\\u043d' d'\\u04e9\\u0434\\u04e9\\u0440'\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ae\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mn-mn\",\n  \"localeID\": \"mn_MN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u04af.\\u04e9\",\n      \"\\u04af.\\u0445\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u044f\\u043c\",\n      \"\\u0434\\u0430\\u0432\\u0430\\u0430\",\n      \"\\u043c\\u044f\\u0433\\u043c\\u0430\\u0440\",\n      \"\\u043b\\u0445\\u0430\\u0433\\u0432\\u0430\",\n      \"\\u043f\\u04af\\u0440\\u044d\\u0432\",\n      \"\\u0431\\u0430\\u0430\\u0441\\u0430\\u043d\",\n      \"\\u0431\\u044f\\u043c\\u0431\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043c\\u0430\\u043d\\u0430\\u0439 \\u044d\\u0440\\u0438\\u043d\\u0438\\u0439 \\u04e9\\u043c\\u043d\\u04e9\\u0445\",\n      \"\\u043c\\u0430\\u043d\\u0430\\u0439 \\u044d\\u0440\\u0438\\u043d\\u0438\\u0439\"\n    ],\n    \"ERAS\": [\n      \"\\u043c.\\u044d.\\u04e9\",\n      \"\\u043c.\\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u041d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0425\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0413\\u0443\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u04e9\\u0440\\u04e9\\u0432\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0422\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0417\\u0443\\u0440\\u0433\\u0430\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u043e\\u043b\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u041d\\u0430\\u0439\\u043c\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0415\\u0441\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u043d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u0445\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u041d\\u044f\",\n      \"\\u0414\\u0430\",\n      \"\\u041c\\u044f\",\n      \"\\u041b\\u0445\",\n      \"\\u041f\\u04af\",\n      \"\\u0411\\u0430\",\n      \"\\u0411\\u044f\"\n    ],\n    \"SHORTMONTH\": [\n      \"1-\\u0440 \\u0441\\u0430\\u0440\",\n      \"2-\\u0440 \\u0441\\u0430\\u0440\",\n      \"3-\\u0440 \\u0441\\u0430\\u0440\",\n      \"4-\\u0440 \\u0441\\u0430\\u0440\",\n      \"5-\\u0440 \\u0441\\u0430\\u0440\",\n      \"6-\\u0440 \\u0441\\u0430\\u0440\",\n      \"7-\\u0440 \\u0441\\u0430\\u0440\",\n      \"8-\\u0440 \\u0441\\u0430\\u0440\",\n      \"9-\\u0440 \\u0441\\u0430\\u0440\",\n      \"10-\\u0440 \\u0441\\u0430\\u0440\",\n      \"11-\\u0440 \\u0441\\u0430\\u0440\",\n      \"12-\\u0440 \\u0441\\u0430\\u0440\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u041d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0425\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0413\\u0443\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u04e9\\u0440\\u04e9\\u0432\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0422\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0417\\u0443\\u0440\\u0433\\u0430\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0414\\u043e\\u043b\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u041d\\u0430\\u0439\\u043c\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0415\\u0441\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0430\\u0432\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u043d\\u044d\\u0433\\u0434\\u04af\\u0433\\u044d\\u044d\\u0440 \\u0441\\u0430\\u0440\",\n      \"\\u0410\\u0440\\u0432\\u0430\\u043d \\u0445\\u043e\\u0451\\u0440\\u0434\\u0443\\u0433\\u0430\\u0430\\u0440 \\u0441\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y '\\u043e\\u043d\\u044b' MM '\\u0441\\u0430\\u0440\\u044b\\u043d' d\",\n    \"longDate\": \"y'\\u043e\\u043d\\u044b' MMMM'\\u0441\\u0430\\u0440\\u044b\\u043d' d'\\u04e9\\u0434\\u04e9\\u0440'\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ae\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mn\",\n  \"localeID\": \"mn\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"duminic\\u0103\",\n      \"luni\",\n      \"mar\\u021bi\",\n      \"miercuri\",\n      \"joi\",\n      \"vineri\",\n      \"s\\u00e2mb\\u0103t\\u0103\"\n    ],\n    \"ERANAMES\": [\n      \"\\u00eenainte de Hristos\",\n      \"dup\\u0103 Hristos\"\n    ],\n    \"ERAS\": [\n      \"\\u00ee.Hr.\",\n      \"d.Hr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"SHORTDAY\": [\n      \"Dum\",\n      \"Lun\",\n      \"Mar\",\n      \"Mie\",\n      \"Joi\",\n      \"Vin\",\n      \"S\\u00e2m\"\n    ],\n    \"SHORTMONTH\": [\n      \"ian.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"iun.\",\n      \"iul.\",\n      \"aug.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MDL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"mo\",\n  \"localeID\": \"mo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v != 0 || n == 0 || n != 1 && n % 100 >= 1 && n % 100 <= 19) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mr-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092e.\\u092a\\u0942.\",\n      \"\\u092e.\\u0909.\"\n    ],\n    \"DAY\": [\n      \"\\u0930\\u0935\\u093f\\u0935\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u0935\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0933\\u0935\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u0935\\u093e\\u0930\",\n      \"\\u0917\\u0941\\u0930\\u0941\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u0935\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u0935\\u0940\\u0938\\u0928\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0908\\u0938\\u0935\\u0940\\u0938\\u0928\"\n    ],\n    \"ERAS\": [\n      \"\\u0907. \\u0938. \\u092a\\u0942.\",\n      \"\\u0907. \\u0938.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0911\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0911\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u0935\\u093f\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0933\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u0917\\u0941\\u0930\\u0941\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0911\\u0917\",\n      \"\\u0938\\u092a\\u094d\\u091f\\u0947\\u0902\",\n      \"\\u0911\\u0915\\u094d\\u091f\\u094b\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0911\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0911\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mr-in\",\n  \"localeID\": \"mr_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092e.\\u092a\\u0942.\",\n      \"\\u092e.\\u0909.\"\n    ],\n    \"DAY\": [\n      \"\\u0930\\u0935\\u093f\\u0935\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u0935\\u093e\\u0930\",\n      \"\\u092e\\u0902\\u0917\\u0933\\u0935\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u0935\\u093e\\u0930\",\n      \"\\u0917\\u0941\\u0930\\u0941\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u0935\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u0935\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u0935\\u0940\\u0938\\u0928\\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0908\\u0938\\u0935\\u0940\\u0938\\u0928\"\n    ],\n    \"ERAS\": [\n      \"\\u0907. \\u0938. \\u092a\\u0942.\",\n      \"\\u0907. \\u0938.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0911\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0911\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0930\\u0935\\u093f\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0902\\u0917\\u0933\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u0917\\u0941\\u0930\\u0941\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0911\\u0917\",\n      \"\\u0938\\u092a\\u094d\\u091f\\u0947\\u0902\",\n      \"\\u0911\\u0915\\u094d\\u091f\\u094b\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u093e\\u0928\\u0947\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0935\\u093e\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u090f\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0942\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u0948\",\n      \"\\u0911\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u092a\\u094d\\u091f\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0911\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u0935\\u094d\\u0939\\u0947\\u0902\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u0902\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mr\",\n  \"localeID\": \"mr\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ms-bn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"PG\",\n      \"PTG\"\n    ],\n    \"DAY\": [\n      \"Ahad\",\n      \"Isnin\",\n      \"Selasa\",\n      \"Rabu\",\n      \"Khamis\",\n      \"Jumaat\",\n      \"Sabtu\"\n    ],\n    \"ERANAMES\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"ERAS\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"SHORTDAY\": [\n      \"Ahd\",\n      \"Isn\",\n      \"Sel\",\n      \"Rab\",\n      \"Kha\",\n      \"Jum\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ogo\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/yy h:mm a\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ms-bn\",\n  \"localeID\": \"ms_BN\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ms-my.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"PG\",\n      \"PTG\"\n    ],\n    \"DAY\": [\n      \"Ahad\",\n      \"Isnin\",\n      \"Selasa\",\n      \"Rabu\",\n      \"Khamis\",\n      \"Jumaat\",\n      \"Sabtu\"\n    ],\n    \"ERANAMES\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"ERAS\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"SHORTDAY\": [\n      \"Ahd\",\n      \"Isn\",\n      \"Sel\",\n      \"Rab\",\n      \"Kha\",\n      \"Jum\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ogo\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/yy h:mm a\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RM\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ms-my\",\n  \"localeID\": \"ms_MY\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ms-sg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"PG\",\n      \"PTG\"\n    ],\n    \"DAY\": [\n      \"Ahad\",\n      \"Isnin\",\n      \"Selasa\",\n      \"Rabu\",\n      \"Khamis\",\n      \"Jumaat\",\n      \"Sabtu\"\n    ],\n    \"ERANAMES\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"ERAS\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"SHORTDAY\": [\n      \"Ahd\",\n      \"Isn\",\n      \"Sel\",\n      \"Rab\",\n      \"Kha\",\n      \"Jum\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ogo\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/yy h:mm a\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ms-sg\",\n  \"localeID\": \"ms_SG\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ms.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"PG\",\n      \"PTG\"\n    ],\n    \"DAY\": [\n      \"Ahad\",\n      \"Isnin\",\n      \"Selasa\",\n      \"Rabu\",\n      \"Khamis\",\n      \"Jumaat\",\n      \"Sabtu\"\n    ],\n    \"ERANAMES\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"ERAS\": [\n      \"S.M.\",\n      \"TM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"SHORTDAY\": [\n      \"Ahd\",\n      \"Isn\",\n      \"Sel\",\n      \"Rab\",\n      \"Kha\",\n      \"Jum\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ogo\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Mac\",\n      \"April\",\n      \"Mei\",\n      \"Jun\",\n      \"Julai\",\n      \"Ogos\",\n      \"September\",\n      \"Oktober\",\n      \"November\",\n      \"Disember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/yy h:mm a\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RM\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ms\",\n  \"localeID\": \"ms\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mt-mt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Il-\\u0126add\",\n      \"It-Tnejn\",\n      \"It-Tlieta\",\n      \"L-Erbg\\u0127a\",\n      \"Il-\\u0126amis\",\n      \"Il-\\u0120img\\u0127a\",\n      \"Is-Sibt\"\n    ],\n    \"ERANAMES\": [\n      \"Qabel Kristu\",\n      \"Wara Kristu\"\n    ],\n    \"ERAS\": [\n      \"QK\",\n      \"WK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Jannar\",\n      \"Frar\",\n      \"Marzu\",\n      \"April\",\n      \"Mejju\",\n      \"\\u0120unju\",\n      \"Lulju\",\n      \"Awwissu\",\n      \"Settembru\",\n      \"Ottubru\",\n      \"Novembru\",\n      \"Di\\u010bembru\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0126ad\",\n      \"Tne\",\n      \"Tli\",\n      \"Erb\",\n      \"\\u0126am\",\n      \"\\u0120im\",\n      \"Sib\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fra\",\n      \"Mar\",\n      \"Apr\",\n      \"Mej\",\n      \"\\u0120un\",\n      \"Lul\",\n      \"Aww\",\n      \"Set\",\n      \"Ott\",\n      \"Nov\",\n      \"Di\\u010b\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jannar\",\n      \"Frar\",\n      \"Marzu\",\n      \"April\",\n      \"Mejju\",\n      \"\\u0120unju\",\n      \"Lulju\",\n      \"Awwissu\",\n      \"Settembru\",\n      \"Ottubru\",\n      \"Novembru\",\n      \"Di\\u010bembru\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'ta'\\u2019 MMMM y\",\n    \"longDate\": \"d 'ta'\\u2019 MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mt-mt\",\n  \"localeID\": \"mt_MT\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 0 || n % 100 >= 2 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 19) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Il-\\u0126add\",\n      \"It-Tnejn\",\n      \"It-Tlieta\",\n      \"L-Erbg\\u0127a\",\n      \"Il-\\u0126amis\",\n      \"Il-\\u0120img\\u0127a\",\n      \"Is-Sibt\"\n    ],\n    \"ERANAMES\": [\n      \"Qabel Kristu\",\n      \"Wara Kristu\"\n    ],\n    \"ERAS\": [\n      \"QK\",\n      \"WK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Jannar\",\n      \"Frar\",\n      \"Marzu\",\n      \"April\",\n      \"Mejju\",\n      \"\\u0120unju\",\n      \"Lulju\",\n      \"Awwissu\",\n      \"Settembru\",\n      \"Ottubru\",\n      \"Novembru\",\n      \"Di\\u010bembru\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0126ad\",\n      \"Tne\",\n      \"Tli\",\n      \"Erb\",\n      \"\\u0126am\",\n      \"\\u0120im\",\n      \"Sib\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fra\",\n      \"Mar\",\n      \"Apr\",\n      \"Mej\",\n      \"\\u0120un\",\n      \"Lul\",\n      \"Aww\",\n      \"Set\",\n      \"Ott\",\n      \"Nov\",\n      \"Di\\u010b\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jannar\",\n      \"Frar\",\n      \"Marzu\",\n      \"April\",\n      \"Mejju\",\n      \"\\u0120unju\",\n      \"Lulju\",\n      \"Awwissu\",\n      \"Settembru\",\n      \"Ottubru\",\n      \"Novembru\",\n      \"Di\\u010bembru\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'ta'\\u2019 MMMM y\",\n    \"longDate\": \"d 'ta'\\u2019 MMMM y\",\n    \"medium\": \"dd MMM y HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mt\",\n  \"localeID\": \"mt\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  if (n == 0 || n % 100 >= 2 && n % 100 <= 10) {    return PLURAL_CATEGORY.FEW;  }  if (n % 100 >= 11 && n % 100 <= 19) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mua-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"comme\",\n      \"lilli\"\n    ],\n    \"DAY\": [\n      \"Com\\u2019yakke\",\n      \"Comlaa\\u0257ii\",\n      \"Comzyii\\u0257ii\",\n      \"Comkolle\",\n      \"Comkald\\u01dd\\u0253lii\",\n      \"Comgaisuu\",\n      \"Comzye\\u0253suu\"\n    ],\n    \"ERANAMES\": [\n      \"K\\u01ddPel Kristu\",\n      \"Pel Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"PK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"F\\u0129i Loo\",\n      \"Cokcwakla\\u014bne\",\n      \"Cokcwaklii\",\n      \"F\\u0129i Marfoo\",\n      \"Mad\\u01dd\\u01dduut\\u01ddbija\\u014b\",\n      \"Mam\\u01dd\\u014bgw\\u00e3afahbii\",\n      \"Mam\\u01dd\\u014bgw\\u00e3alii\",\n      \"Mad\\u01ddmbii\",\n      \"F\\u0129i D\\u01dd\\u0253lii\",\n      \"F\\u0129i Munda\\u014b\",\n      \"F\\u0129i Gwahlle\",\n      \"F\\u0129i Yuru\"\n    ],\n    \"SHORTDAY\": [\n      \"Cya\",\n      \"Cla\",\n      \"Czi\",\n      \"Cko\",\n      \"Cka\",\n      \"Cga\",\n      \"Cze\"\n    ],\n    \"SHORTMONTH\": [\n      \"FLO\",\n      \"CLA\",\n      \"CKI\",\n      \"FMF\",\n      \"MAD\",\n      \"MBI\",\n      \"MLI\",\n      \"MAM\",\n      \"FDE\",\n      \"FMU\",\n      \"FGW\",\n      \"FYU\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"F\\u0129i Loo\",\n      \"Cokcwakla\\u014bne\",\n      \"Cokcwaklii\",\n      \"F\\u0129i Marfoo\",\n      \"Mad\\u01dd\\u01dduut\\u01ddbija\\u014b\",\n      \"Mam\\u01dd\\u014bgw\\u00e3afahbii\",\n      \"Mam\\u01dd\\u014bgw\\u00e3alii\",\n      \"Mad\\u01ddmbii\",\n      \"F\\u0129i D\\u01dd\\u0253lii\",\n      \"F\\u0129i Munda\\u014b\",\n      \"F\\u0129i Gwahlle\",\n      \"F\\u0129i Yuru\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mua-cm\",\n  \"localeID\": \"mua_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mua.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"comme\",\n      \"lilli\"\n    ],\n    \"DAY\": [\n      \"Com\\u2019yakke\",\n      \"Comlaa\\u0257ii\",\n      \"Comzyii\\u0257ii\",\n      \"Comkolle\",\n      \"Comkald\\u01dd\\u0253lii\",\n      \"Comgaisuu\",\n      \"Comzye\\u0253suu\"\n    ],\n    \"ERANAMES\": [\n      \"K\\u01ddPel Kristu\",\n      \"Pel Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"PK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"F\\u0129i Loo\",\n      \"Cokcwakla\\u014bne\",\n      \"Cokcwaklii\",\n      \"F\\u0129i Marfoo\",\n      \"Mad\\u01dd\\u01dduut\\u01ddbija\\u014b\",\n      \"Mam\\u01dd\\u014bgw\\u00e3afahbii\",\n      \"Mam\\u01dd\\u014bgw\\u00e3alii\",\n      \"Mad\\u01ddmbii\",\n      \"F\\u0129i D\\u01dd\\u0253lii\",\n      \"F\\u0129i Munda\\u014b\",\n      \"F\\u0129i Gwahlle\",\n      \"F\\u0129i Yuru\"\n    ],\n    \"SHORTDAY\": [\n      \"Cya\",\n      \"Cla\",\n      \"Czi\",\n      \"Cko\",\n      \"Cka\",\n      \"Cga\",\n      \"Cze\"\n    ],\n    \"SHORTMONTH\": [\n      \"FLO\",\n      \"CLA\",\n      \"CKI\",\n      \"FMF\",\n      \"MAD\",\n      \"MBI\",\n      \"MLI\",\n      \"MAM\",\n      \"FDE\",\n      \"FMU\",\n      \"FGW\",\n      \"FYU\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"F\\u0129i Loo\",\n      \"Cokcwakla\\u014bne\",\n      \"Cokcwaklii\",\n      \"F\\u0129i Marfoo\",\n      \"Mad\\u01dd\\u01dduut\\u01ddbija\\u014b\",\n      \"Mam\\u01dd\\u014bgw\\u00e3afahbii\",\n      \"Mam\\u01dd\\u014bgw\\u00e3alii\",\n      \"Mad\\u01ddmbii\",\n      \"F\\u0129i D\\u01dd\\u0253lii\",\n      \"F\\u0129i Munda\\u014b\",\n      \"F\\u0129i Gwahlle\",\n      \"F\\u0129i Yuru\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mua\",\n  \"localeID\": \"mua\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_my-mm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u1014\\u1036\\u1014\\u1000\\u103a\",\n      \"\\u100a\\u1014\\u1031\"\n    ],\n    \"DAY\": [\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u1002\\u1014\\u103d\\u1031\",\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u101c\\u102c\",\n      \"\\u1021\\u1004\\u103a\\u1039\\u1002\\u102b\",\n      \"\\u1017\\u102f\\u1012\\u1039\\u1013\\u101f\\u1030\\u1038\",\n      \"\\u1000\\u103c\\u102c\\u101e\\u1015\\u1010\\u1031\\u1038\",\n      \"\\u101e\\u1031\\u102c\\u1000\\u103c\\u102c\",\n      \"\\u1005\\u1014\\u1031\"\n    ],\n    \"ERANAMES\": [\n      \"\\u1001\\u101b\\u1005\\u103a\\u1010\\u1031\\u102c\\u103a \\u1019\\u1015\\u1031\\u102b\\u103a\\u1019\\u102e\\u1014\\u103e\\u1005\\u103a\",\n      \"\\u1001\\u101b\\u1005\\u103a\\u1014\\u103e\\u1005\\u103a\"\n    ],\n    \"ERAS\": [\n      \"\\u1018\\u102e\\u1005\\u102e\",\n      \"\\u1021\\u1031\\u1012\\u102e\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1007\\u1014\\u103a\\u1014\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1016\\u1031\\u1016\\u1031\\u102c\\u103a\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1019\\u1010\\u103a\",\n      \"\\u1027\\u1015\\u103c\\u102e\",\n      \"\\u1019\\u1031\",\n      \"\\u1007\\u103d\\u1014\\u103a\",\n      \"\\u1007\\u1030\\u101c\\u102d\\u102f\\u1004\\u103a\",\n      \"\\u1029\\u1002\\u102f\\u1010\\u103a\",\n      \"\\u1005\\u1000\\u103a\\u1010\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1021\\u1031\\u102c\\u1000\\u103a\\u1010\\u102d\\u102f\\u1018\\u102c\",\n      \"\\u1014\\u102d\\u102f\\u101d\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1012\\u102e\\u1007\\u1004\\u103a\\u1018\\u102c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u1002\\u1014\\u103d\\u1031\",\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u101c\\u102c\",\n      \"\\u1021\\u1004\\u103a\\u1039\\u1002\\u102b\",\n      \"\\u1017\\u102f\\u1012\\u1039\\u1013\\u101f\\u1030\\u1038\",\n      \"\\u1000\\u103c\\u102c\\u101e\\u1015\\u1010\\u1031\\u1038\",\n      \"\\u101e\\u1031\\u102c\\u1000\\u103c\\u102c\",\n      \"\\u1005\\u1014\\u1031\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1007\\u1014\\u103a\",\n      \"\\u1016\\u1031\",\n      \"\\u1019\\u1010\\u103a\",\n      \"\\u1027\",\n      \"\\u1019\\u1031\",\n      \"\\u1007\\u103d\\u1014\\u103a\",\n      \"\\u1007\\u1030\",\n      \"\\u1029\",\n      \"\\u1005\\u1000\\u103a\",\n      \"\\u1021\\u1031\\u102c\\u1000\\u103a\",\n      \"\\u1014\\u102d\\u102f\",\n      \"\\u1012\\u102e\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1007\\u1014\\u103a\\u1014\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1016\\u1031\\u1016\\u1031\\u102c\\u103a\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1019\\u1010\\u103a\",\n      \"\\u1027\\u1015\\u103c\\u102e\",\n      \"\\u1019\\u1031\",\n      \"\\u1007\\u103d\\u1014\\u103a\",\n      \"\\u1007\\u1030\\u101c\\u102d\\u102f\\u1004\\u103a\",\n      \"\\u1029\\u1002\\u102f\\u1010\\u103a\",\n      \"\\u1005\\u1000\\u103a\\u1010\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1021\\u1031\\u102c\\u1000\\u103a\\u1010\\u102d\\u102f\\u1018\\u102c\",\n      \"\\u1014\\u102d\\u102f\\u101d\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1012\\u102e\\u1007\\u1004\\u103a\\u1018\\u102c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"K\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"my-mm\",\n  \"localeID\": \"my_MM\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_my.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u1014\\u1036\\u1014\\u1000\\u103a\",\n      \"\\u100a\\u1014\\u1031\"\n    ],\n    \"DAY\": [\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u1002\\u1014\\u103d\\u1031\",\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u101c\\u102c\",\n      \"\\u1021\\u1004\\u103a\\u1039\\u1002\\u102b\",\n      \"\\u1017\\u102f\\u1012\\u1039\\u1013\\u101f\\u1030\\u1038\",\n      \"\\u1000\\u103c\\u102c\\u101e\\u1015\\u1010\\u1031\\u1038\",\n      \"\\u101e\\u1031\\u102c\\u1000\\u103c\\u102c\",\n      \"\\u1005\\u1014\\u1031\"\n    ],\n    \"ERANAMES\": [\n      \"\\u1001\\u101b\\u1005\\u103a\\u1010\\u1031\\u102c\\u103a \\u1019\\u1015\\u1031\\u102b\\u103a\\u1019\\u102e\\u1014\\u103e\\u1005\\u103a\",\n      \"\\u1001\\u101b\\u1005\\u103a\\u1014\\u103e\\u1005\\u103a\"\n    ],\n    \"ERAS\": [\n      \"\\u1018\\u102e\\u1005\\u102e\",\n      \"\\u1021\\u1031\\u1012\\u102e\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1007\\u1014\\u103a\\u1014\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1016\\u1031\\u1016\\u1031\\u102c\\u103a\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1019\\u1010\\u103a\",\n      \"\\u1027\\u1015\\u103c\\u102e\",\n      \"\\u1019\\u1031\",\n      \"\\u1007\\u103d\\u1014\\u103a\",\n      \"\\u1007\\u1030\\u101c\\u102d\\u102f\\u1004\\u103a\",\n      \"\\u1029\\u1002\\u102f\\u1010\\u103a\",\n      \"\\u1005\\u1000\\u103a\\u1010\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1021\\u1031\\u102c\\u1000\\u103a\\u1010\\u102d\\u102f\\u1018\\u102c\",\n      \"\\u1014\\u102d\\u102f\\u101d\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1012\\u102e\\u1007\\u1004\\u103a\\u1018\\u102c\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u1002\\u1014\\u103d\\u1031\",\n      \"\\u1010\\u1014\\u1004\\u103a\\u1039\\u101c\\u102c\",\n      \"\\u1021\\u1004\\u103a\\u1039\\u1002\\u102b\",\n      \"\\u1017\\u102f\\u1012\\u1039\\u1013\\u101f\\u1030\\u1038\",\n      \"\\u1000\\u103c\\u102c\\u101e\\u1015\\u1010\\u1031\\u1038\",\n      \"\\u101e\\u1031\\u102c\\u1000\\u103c\\u102c\",\n      \"\\u1005\\u1014\\u1031\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1007\\u1014\\u103a\",\n      \"\\u1016\\u1031\",\n      \"\\u1019\\u1010\\u103a\",\n      \"\\u1027\",\n      \"\\u1019\\u1031\",\n      \"\\u1007\\u103d\\u1014\\u103a\",\n      \"\\u1007\\u1030\",\n      \"\\u1029\",\n      \"\\u1005\\u1000\\u103a\",\n      \"\\u1021\\u1031\\u102c\\u1000\\u103a\",\n      \"\\u1014\\u102d\\u102f\",\n      \"\\u1012\\u102e\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1007\\u1014\\u103a\\u1014\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1016\\u1031\\u1016\\u1031\\u102c\\u103a\\u101d\\u102b\\u101b\\u102e\",\n      \"\\u1019\\u1010\\u103a\",\n      \"\\u1027\\u1015\\u103c\\u102e\",\n      \"\\u1019\\u1031\",\n      \"\\u1007\\u103d\\u1014\\u103a\",\n      \"\\u1007\\u1030\\u101c\\u102d\\u102f\\u1004\\u103a\",\n      \"\\u1029\\u1002\\u102f\\u1010\\u103a\",\n      \"\\u1005\\u1000\\u103a\\u1010\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1021\\u1031\\u102c\\u1000\\u103a\\u1010\\u102d\\u102f\\u1018\\u102c\",\n      \"\\u1014\\u102d\\u102f\\u101d\\u1004\\u103a\\u1018\\u102c\",\n      \"\\u1012\\u102e\\u1007\\u1004\\u103a\\u1018\\u102c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"K\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"my\",\n  \"localeID\": \"my\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mzn-ir.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u06cc\\u0644\\u0627\\u062f\",\n      \"\\u0628\\u0639\\u062f \\u0645\\u06cc\\u0644\\u0627\\u062f\"\n    ],\n    \"ERAS\": [\n      \"\\u067e.\\u0645\",\n      \"\\u0645.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      4\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mzn-ir\",\n  \"localeID\": \"mzn_IR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_mzn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u06cc\\u0644\\u0627\\u062f\",\n      \"\\u0628\\u0639\\u062f \\u0645\\u06cc\\u0644\\u0627\\u062f\"\n    ],\n    \"ERAS\": [\n      \"\\u067e.\\u0645\",\n      \"\\u0645.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0698\\u0627\\u0646\\u0648\\u06cc\\u0647\",\n      \"\\u0641\\u0648\\u0631\\u06cc\\u0647\",\n      \"\\u0645\\u0627\\u0631\\u0633\",\n      \"\\u0622\\u0648\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0647\",\n      \"\\u0698\\u0648\\u0626\\u0646\",\n      \"\\u0698\\u0648\\u0626\\u06cc\\u0647\",\n      \"\\u0627\\u0648\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0627\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0627\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      4\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rial\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"mzn\",\n  \"localeID\": \"mzn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_naq-na.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u01c1goagas\",\n      \"\\u01c3uias\"\n    ],\n    \"DAY\": [\n      \"Sontaxtsees\",\n      \"Mantaxtsees\",\n      \"Denstaxtsees\",\n      \"Wunstaxtsees\",\n      \"Dondertaxtsees\",\n      \"Fraitaxtsees\",\n      \"Satertaxtsees\"\n    ],\n    \"ERANAMES\": [\n      \"Xristub ai\\u01c3\\u00e2\",\n      \"Xristub khao\\u01c3g\\u00e2\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u01c3Khanni\",\n      \"\\u01c3Khan\\u01c0g\\u00f4ab\",\n      \"\\u01c0Khuu\\u01c1kh\\u00e2b\",\n      \"\\u01c3H\\u00f4a\\u01c2khaib\",\n      \"\\u01c3Khaits\\u00e2b\",\n      \"Gama\\u01c0aeb\",\n      \"\\u01c2Khoesaob\",\n      \"Ao\\u01c1khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"Tara\\u01c0khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"\\u01c2N\\u00fb\\u01c1n\\u00e2iseb\",\n      \"\\u01c0Hoo\\u01c2gaeb\",\n      \"H\\u00f4asore\\u01c1kh\\u00e2b\"\n    ],\n    \"SHORTDAY\": [\n      \"Son\",\n      \"Ma\",\n      \"De\",\n      \"Wu\",\n      \"Do\",\n      \"Fr\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u01c3Khanni\",\n      \"\\u01c3Khan\\u01c0g\\u00f4ab\",\n      \"\\u01c0Khuu\\u01c1kh\\u00e2b\",\n      \"\\u01c3H\\u00f4a\\u01c2khaib\",\n      \"\\u01c3Khaits\\u00e2b\",\n      \"Gama\\u01c0aeb\",\n      \"\\u01c2Khoesaob\",\n      \"Ao\\u01c1khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"Tara\\u01c0khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"\\u01c2N\\u00fb\\u01c1n\\u00e2iseb\",\n      \"\\u01c0Hoo\\u01c2gaeb\",\n      \"H\\u00f4asore\\u01c1kh\\u00e2b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"naq-na\",\n  \"localeID\": \"naq_NA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_naq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u01c1goagas\",\n      \"\\u01c3uias\"\n    ],\n    \"DAY\": [\n      \"Sontaxtsees\",\n      \"Mantaxtsees\",\n      \"Denstaxtsees\",\n      \"Wunstaxtsees\",\n      \"Dondertaxtsees\",\n      \"Fraitaxtsees\",\n      \"Satertaxtsees\"\n    ],\n    \"ERANAMES\": [\n      \"Xristub ai\\u01c3\\u00e2\",\n      \"Xristub khao\\u01c3g\\u00e2\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u01c3Khanni\",\n      \"\\u01c3Khan\\u01c0g\\u00f4ab\",\n      \"\\u01c0Khuu\\u01c1kh\\u00e2b\",\n      \"\\u01c3H\\u00f4a\\u01c2khaib\",\n      \"\\u01c3Khaits\\u00e2b\",\n      \"Gama\\u01c0aeb\",\n      \"\\u01c2Khoesaob\",\n      \"Ao\\u01c1khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"Tara\\u01c0khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"\\u01c2N\\u00fb\\u01c1n\\u00e2iseb\",\n      \"\\u01c0Hoo\\u01c2gaeb\",\n      \"H\\u00f4asore\\u01c1kh\\u00e2b\"\n    ],\n    \"SHORTDAY\": [\n      \"Son\",\n      \"Ma\",\n      \"De\",\n      \"Wu\",\n      \"Do\",\n      \"Fr\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u01c3Khanni\",\n      \"\\u01c3Khan\\u01c0g\\u00f4ab\",\n      \"\\u01c0Khuu\\u01c1kh\\u00e2b\",\n      \"\\u01c3H\\u00f4a\\u01c2khaib\",\n      \"\\u01c3Khaits\\u00e2b\",\n      \"Gama\\u01c0aeb\",\n      \"\\u01c2Khoesaob\",\n      \"Ao\\u01c1khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"Tara\\u01c0khuum\\u00fb\\u01c1kh\\u00e2b\",\n      \"\\u01c2N\\u00fb\\u01c1n\\u00e2iseb\",\n      \"\\u01c0Hoo\\u01c2gaeb\",\n      \"H\\u00f4asore\\u01c1kh\\u00e2b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"naq\",\n  \"localeID\": \"naq\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nb-no.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f8r Kristus\",\n      \"etter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nb-no\",\n  \"localeID\": \"nb_NO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nb-sj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f8r Kristus\",\n      \"etter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nb-sj\",\n  \"localeID\": \"nb_SJ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nb.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f8r Kristus\",\n      \"etter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nb\",\n  \"localeID\": \"nb\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nd-zw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sonto\",\n      \"Mvulo\",\n      \"Sibili\",\n      \"Sithathu\",\n      \"Sine\",\n      \"Sihlanu\",\n      \"Mgqibelo\"\n    ],\n    \"ERANAMES\": [\n      \"UKristo angakabuyi\",\n      \"Ukristo ebuyile\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Zibandlela\",\n      \"Nhlolanja\",\n      \"Mbimbitho\",\n      \"Mabasa\",\n      \"Nkwenkwezi\",\n      \"Nhlangula\",\n      \"Ntulikazi\",\n      \"Ncwabakazi\",\n      \"Mpandula\",\n      \"Mfumfu\",\n      \"Lwezi\",\n      \"Mpalakazi\"\n    ],\n    \"SHORTDAY\": [\n      \"Son\",\n      \"Mvu\",\n      \"Sib\",\n      \"Sit\",\n      \"Sin\",\n      \"Sih\",\n      \"Mgq\"\n    ],\n    \"SHORTMONTH\": [\n      \"Zib\",\n      \"Nhlo\",\n      \"Mbi\",\n      \"Mab\",\n      \"Nkw\",\n      \"Nhla\",\n      \"Ntu\",\n      \"Ncw\",\n      \"Mpan\",\n      \"Mfu\",\n      \"Lwe\",\n      \"Mpal\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Zibandlela\",\n      \"Nhlolanja\",\n      \"Mbimbitho\",\n      \"Mabasa\",\n      \"Nkwenkwezi\",\n      \"Nhlangula\",\n      \"Ntulikazi\",\n      \"Ncwabakazi\",\n      \"Mpandula\",\n      \"Mfumfu\",\n      \"Lwezi\",\n      \"Mpalakazi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nd-zw\",\n  \"localeID\": \"nd_ZW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sonto\",\n      \"Mvulo\",\n      \"Sibili\",\n      \"Sithathu\",\n      \"Sine\",\n      \"Sihlanu\",\n      \"Mgqibelo\"\n    ],\n    \"ERANAMES\": [\n      \"UKristo angakabuyi\",\n      \"Ukristo ebuyile\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Zibandlela\",\n      \"Nhlolanja\",\n      \"Mbimbitho\",\n      \"Mabasa\",\n      \"Nkwenkwezi\",\n      \"Nhlangula\",\n      \"Ntulikazi\",\n      \"Ncwabakazi\",\n      \"Mpandula\",\n      \"Mfumfu\",\n      \"Lwezi\",\n      \"Mpalakazi\"\n    ],\n    \"SHORTDAY\": [\n      \"Son\",\n      \"Mvu\",\n      \"Sib\",\n      \"Sit\",\n      \"Sin\",\n      \"Sih\",\n      \"Mgq\"\n    ],\n    \"SHORTMONTH\": [\n      \"Zib\",\n      \"Nhlo\",\n      \"Mbi\",\n      \"Mab\",\n      \"Nkw\",\n      \"Nhla\",\n      \"Ntu\",\n      \"Ncw\",\n      \"Mpan\",\n      \"Mfu\",\n      \"Lwe\",\n      \"Mpal\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Zibandlela\",\n      \"Nhlolanja\",\n      \"Mbimbitho\",\n      \"Mabasa\",\n      \"Nkwenkwezi\",\n      \"Nhlangula\",\n      \"Ntulikazi\",\n      \"Ncwabakazi\",\n      \"Mpandula\",\n      \"Mfumfu\",\n      \"Lwezi\",\n      \"Mpalakazi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nd\",\n  \"localeID\": \"nd\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nds-de.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nds-de\",\n  \"localeID\": \"nds_DE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nds-nl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nds-nl\",\n  \"localeID\": \"nds_NL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nds.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"M01\",\n      \"M02\",\n      \"M03\",\n      \"M04\",\n      \"M05\",\n      \"M06\",\n      \"M07\",\n      \"M08\",\n      \"M09\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nds\",\n  \"localeID\": \"nds\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ne-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092a\\u0942\\u0930\\u094d\\u0935\\u093e\\u0939\\u094d\\u0928\",\n      \"\\u0905\\u092a\\u0930\\u093e\\u0939\\u094d\\u0928\"\n    ],\n    \"DAY\": [\n      \"\\u0906\\u0907\\u0924\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u092c\\u093e\\u0930\",\n      \"\\u092e\\u0919\\u094d\\u0917\\u0932\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u093f\\u0939\\u093f\\u092c\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u092c\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u092c\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u093e \\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\\u094d\"\n    ],\n    \"ERAS\": [\n      \"\\u0908\\u0938\\u093e \\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\\u094d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0906\\u0907\\u0924\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0919\\u094d\\u0917\\u0932\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u092c\\u093f\\u0939\\u093f\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ne-in\",\n  \"localeID\": \"ne_IN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ne-np.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092a\\u0942\\u0930\\u094d\\u0935\\u093e\\u0939\\u094d\\u0928\",\n      \"\\u0905\\u092a\\u0930\\u093e\\u0939\\u094d\\u0928\"\n    ],\n    \"DAY\": [\n      \"\\u0906\\u0907\\u0924\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u092c\\u093e\\u0930\",\n      \"\\u092e\\u0919\\u094d\\u0917\\u0932\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u093f\\u0939\\u093f\\u092c\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u092c\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u092c\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u093e \\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\\u094d\"\n    ],\n    \"ERAS\": [\n      \"\\u0908\\u0938\\u093e \\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\\u094d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0906\\u0907\\u0924\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0919\\u094d\\u0917\\u0932\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u092c\\u093f\\u0939\\u093f\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ne-np\",\n  \"localeID\": \"ne_NP\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ne.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u092a\\u0942\\u0930\\u094d\\u0935\\u093e\\u0939\\u094d\\u0928\",\n      \"\\u0905\\u092a\\u0930\\u093e\\u0939\\u094d\\u0928\"\n    ],\n    \"DAY\": [\n      \"\\u0906\\u0907\\u0924\\u092c\\u093e\\u0930\",\n      \"\\u0938\\u094b\\u092e\\u092c\\u093e\\u0930\",\n      \"\\u092e\\u0919\\u094d\\u0917\\u0932\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u0941\\u0927\\u092c\\u093e\\u0930\",\n      \"\\u092c\\u093f\\u0939\\u093f\\u092c\\u093e\\u0930\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\\u092c\\u093e\\u0930\",\n      \"\\u0936\\u0928\\u093f\\u092c\\u093e\\u0930\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0908\\u0938\\u093e \\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\\u094d\"\n    ],\n    \"ERAS\": [\n      \"\\u0908\\u0938\\u093e \\u092a\\u0942\\u0930\\u094d\\u0935\",\n      \"\\u0938\\u0928\\u094d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0908\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0906\\u0907\\u0924\",\n      \"\\u0938\\u094b\\u092e\",\n      \"\\u092e\\u0919\\u094d\\u0917\\u0932\",\n      \"\\u092c\\u0941\\u0927\",\n      \"\\u092c\\u093f\\u0939\\u093f\",\n      \"\\u0936\\u0941\\u0915\\u094d\\u0930\",\n      \"\\u0936\\u0928\\u093f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u091c\\u0928\\u0935\\u0930\\u0940\",\n      \"\\u092b\\u0947\\u092c\\u094d\\u0930\\u0941\\u0905\\u0930\\u0940\",\n      \"\\u092e\\u093e\\u0930\\u094d\\u091a\",\n      \"\\u0905\\u092a\\u094d\\u0930\\u093f\\u0932\",\n      \"\\u092e\\u0947\",\n      \"\\u091c\\u0941\\u0928\",\n      \"\\u091c\\u0941\\u0932\\u093e\\u0908\",\n      \"\\u0905\\u0917\\u0938\\u094d\\u091f\",\n      \"\\u0938\\u0947\\u092a\\u094d\\u091f\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0905\\u0915\\u094d\\u091f\\u094b\\u092c\\u0930\",\n      \"\\u0928\\u094b\\u092d\\u0947\\u092e\\u094d\\u092c\\u0930\",\n      \"\\u0921\\u093f\\u0938\\u0947\\u092e\\u094d\\u092c\\u0930\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ne\",\n  \"localeID\": \"ne\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl-aw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Afl.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nl-aw\",\n  \"localeID\": \"nl_AW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl-be.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/MM/yy HH:mm\",\n    \"shortDate\": \"d/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"nl-be\",\n  \"localeID\": \"nl_BE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl-bq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nl-bq\",\n  \"localeID\": \"nl_BQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl-cw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"NAf.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nl-cw\",\n  \"localeID\": \"nl_CW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl-nl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nl-nl\",\n  \"localeID\": \"nl_NL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl-sr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nl-sr\",\n  \"localeID\": \"nl_SR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl-sx.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"NAf.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nl-sx\",\n  \"localeID\": \"nl_SX\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"zondag\",\n      \"maandag\",\n      \"dinsdag\",\n      \"woensdag\",\n      \"donderdag\",\n      \"vrijdag\",\n      \"zaterdag\"\n    ],\n    \"ERANAMES\": [\n      \"voor Christus\",\n      \"na Christus\"\n    ],\n    \"ERAS\": [\n      \"v.Chr.\",\n      \"n.Chr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"zo\",\n      \"ma\",\n      \"di\",\n      \"wo\",\n      \"do\",\n      \"vr\",\n      \"za\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mrt.\",\n      \"apr.\",\n      \"mei\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"maart\",\n      \"april\",\n      \"mei\",\n      \"juni\",\n      \"juli\",\n      \"augustus\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4\\u00a0-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nl\",\n  \"localeID\": \"nl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nmg-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"man\\u00e1\",\n      \"kug\\u00fa\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301nd\\u0254\",\n      \"m\\u0254\\u0301nd\\u0254\",\n      \"s\\u0254\\u0301nd\\u0254 maf\\u00fa m\\u00e1ba\",\n      \"s\\u0254\\u0301nd\\u0254 maf\\u00fa m\\u00e1lal\",\n      \"s\\u0254\\u0301nd\\u0254 maf\\u00fa m\\u00e1na\",\n      \"mab\\u00e1g\\u00e1 m\\u00e1 sukul\",\n      \"s\\u00e1sadi\"\n    ],\n    \"ERANAMES\": [\n      \"B\\u00f3 Lahl\\u025b\\u0304\",\n      \"Pfi\\u025b Bur\\u012b\"\n    ],\n    \"ERAS\": [\n      \"BL\",\n      \"PB\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ngw\\u025bn mat\\u00e1hra\",\n      \"ngw\\u025bn \\u0144mba\",\n      \"ngw\\u025bn \\u0144lal\",\n      \"ngw\\u025bn \\u0144na\",\n      \"ngw\\u025bn \\u0144tan\",\n      \"ngw\\u025bn \\u0144tu\\u00f3\",\n      \"ngw\\u025bn h\\u025bmbu\\u025br\\u00ed\",\n      \"ngw\\u025bn l\\u0254mbi\",\n      \"ngw\\u025bn r\\u025bbvu\\u00e2\",\n      \"ngw\\u025bn wum\",\n      \"ngw\\u025bn wum nav\\u01d4r\",\n      \"kr\\u00edsimin\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254\\u0301n\",\n      \"m\\u0254\\u0301n\",\n      \"smb\",\n      \"sml\",\n      \"smn\",\n      \"mbs\",\n      \"sas\"\n    ],\n    \"SHORTMONTH\": [\n      \"ng1\",\n      \"ng2\",\n      \"ng3\",\n      \"ng4\",\n      \"ng5\",\n      \"ng6\",\n      \"ng7\",\n      \"ng8\",\n      \"ng9\",\n      \"ng10\",\n      \"ng11\",\n      \"kris\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ngw\\u025bn mat\\u00e1hra\",\n      \"ngw\\u025bn \\u0144mba\",\n      \"ngw\\u025bn \\u0144lal\",\n      \"ngw\\u025bn \\u0144na\",\n      \"ngw\\u025bn \\u0144tan\",\n      \"ngw\\u025bn \\u0144tu\\u00f3\",\n      \"ngw\\u025bn h\\u025bmbu\\u025br\\u00ed\",\n      \"ngw\\u025bn l\\u0254mbi\",\n      \"ngw\\u025bn r\\u025bbvu\\u00e2\",\n      \"ngw\\u025bn wum\",\n      \"ngw\\u025bn wum nav\\u01d4r\",\n      \"kr\\u00edsimin\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"nmg-cm\",\n  \"localeID\": \"nmg_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nmg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"man\\u00e1\",\n      \"kug\\u00fa\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301nd\\u0254\",\n      \"m\\u0254\\u0301nd\\u0254\",\n      \"s\\u0254\\u0301nd\\u0254 maf\\u00fa m\\u00e1ba\",\n      \"s\\u0254\\u0301nd\\u0254 maf\\u00fa m\\u00e1lal\",\n      \"s\\u0254\\u0301nd\\u0254 maf\\u00fa m\\u00e1na\",\n      \"mab\\u00e1g\\u00e1 m\\u00e1 sukul\",\n      \"s\\u00e1sadi\"\n    ],\n    \"ERANAMES\": [\n      \"B\\u00f3 Lahl\\u025b\\u0304\",\n      \"Pfi\\u025b Bur\\u012b\"\n    ],\n    \"ERAS\": [\n      \"BL\",\n      \"PB\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ngw\\u025bn mat\\u00e1hra\",\n      \"ngw\\u025bn \\u0144mba\",\n      \"ngw\\u025bn \\u0144lal\",\n      \"ngw\\u025bn \\u0144na\",\n      \"ngw\\u025bn \\u0144tan\",\n      \"ngw\\u025bn \\u0144tu\\u00f3\",\n      \"ngw\\u025bn h\\u025bmbu\\u025br\\u00ed\",\n      \"ngw\\u025bn l\\u0254mbi\",\n      \"ngw\\u025bn r\\u025bbvu\\u00e2\",\n      \"ngw\\u025bn wum\",\n      \"ngw\\u025bn wum nav\\u01d4r\",\n      \"kr\\u00edsimin\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u0254\\u0301n\",\n      \"m\\u0254\\u0301n\",\n      \"smb\",\n      \"sml\",\n      \"smn\",\n      \"mbs\",\n      \"sas\"\n    ],\n    \"SHORTMONTH\": [\n      \"ng1\",\n      \"ng2\",\n      \"ng3\",\n      \"ng4\",\n      \"ng5\",\n      \"ng6\",\n      \"ng7\",\n      \"ng8\",\n      \"ng9\",\n      \"ng10\",\n      \"ng11\",\n      \"kris\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ngw\\u025bn mat\\u00e1hra\",\n      \"ngw\\u025bn \\u0144mba\",\n      \"ngw\\u025bn \\u0144lal\",\n      \"ngw\\u025bn \\u0144na\",\n      \"ngw\\u025bn \\u0144tan\",\n      \"ngw\\u025bn \\u0144tu\\u00f3\",\n      \"ngw\\u025bn h\\u025bmbu\\u025br\\u00ed\",\n      \"ngw\\u025bn l\\u0254mbi\",\n      \"ngw\\u025bn r\\u025bbvu\\u00e2\",\n      \"ngw\\u025bn wum\",\n      \"ngw\\u025bn wum nav\\u01d4r\",\n      \"kr\\u00edsimin\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"nmg\",\n  \"localeID\": \"nmg\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nn-no.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"formiddag\",\n      \"ettermiddag\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"m\\u00e5ndag\",\n      \"tysdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"laurdag\"\n    ],\n    \"ERANAMES\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8.\",\n      \"m\\u00e5.\",\n      \"ty.\",\n      \"on.\",\n      \"to.\",\n      \"fr.\",\n      \"la.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mars\",\n      \"apr.\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"nn-no\",\n  \"localeID\": \"nn_NO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"formiddag\",\n      \"ettermiddag\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"m\\u00e5ndag\",\n      \"tysdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"laurdag\"\n    ],\n    \"ERANAMES\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8.\",\n      \"m\\u00e5.\",\n      \"ty.\",\n      \"on.\",\n      \"to.\",\n      \"fr.\",\n      \"la.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mars\",\n      \"apr.\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"nn\",\n  \"localeID\": \"nn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nnh-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"mba\\u02bc\\u00e1mba\\u02bc\",\n      \"ncw\\u00f2nz\\u00e9m\"\n    ],\n    \"DAY\": [\n      \"ly\\u025b\\u02bc\\u025b\\u0301 s\\u1e85\\u00ed\\u014bt\\u00e8\",\n      \"mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"ts\\u00e8ts\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 tsets\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mvf\\u00f2 m\\u00e0ga ly\\u025b\\u030c\\u02bc\",\n      \"m\\u00e0ga ly\\u025b\\u030c\\u02bc\"\n    ],\n    \"ERANAMES\": [\n      \"m\\u00e9 zy\\u00e9 Y\\u011bs\\u00f4\",\n      \"m\\u00e9 g\\u00ffo \\u0144zy\\u00e9 Y\\u011bs\\u00f4\"\n    ],\n    \"ERAS\": [\n      \"m.z.Y.\",\n      \"m.g.n.Y.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"sa\\u014b tsets\\u025b\\u0300\\u025b l\\u00f9m\",\n      \"sa\\u014b k\\u00e0g ngw\\u00f3\\u014b\",\n      \"sa\\u014b lepy\\u00e8 sh\\u00fam\",\n      \"sa\\u014b c\\u00ff\\u00f3\",\n      \"sa\\u014b ts\\u025b\\u0300\\u025b c\\u00ff\\u00f3\",\n      \"sa\\u014b nj\\u00ffol\\u00e1\\u02bc\",\n      \"sa\\u014b ty\\u025b\\u0300b ty\\u025b\\u0300b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b ngw\\u0254\\u0300\\u02bc mb\\u00ff\\u025b\",\n      \"sa\\u014b t\\u00e0\\u014ba tsets\\u00e1\\u02bc\",\n      \"sa\\u014b mejwo\\u014b\\u00f3\",\n      \"sa\\u014b l\\u00f9m\"\n    ],\n    \"SHORTDAY\": [\n      \"ly\\u025b\\u02bc\\u025b\\u0301 s\\u1e85\\u00ed\\u014bt\\u00e8\",\n      \"mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"ts\\u00e8ts\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 tsets\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mvf\\u00f2 m\\u00e0ga ly\\u025b\\u030c\\u02bc\",\n      \"m\\u00e0ga ly\\u025b\\u030c\\u02bc\"\n    ],\n    \"SHORTMONTH\": [\n      \"sa\\u014b tsets\\u025b\\u0300\\u025b l\\u00f9m\",\n      \"sa\\u014b k\\u00e0g ngw\\u00f3\\u014b\",\n      \"sa\\u014b lepy\\u00e8 sh\\u00fam\",\n      \"sa\\u014b c\\u00ff\\u00f3\",\n      \"sa\\u014b ts\\u025b\\u0300\\u025b c\\u00ff\\u00f3\",\n      \"sa\\u014b nj\\u00ffol\\u00e1\\u02bc\",\n      \"sa\\u014b ty\\u025b\\u0300b ty\\u025b\\u0300b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b ngw\\u0254\\u0300\\u02bc mb\\u00ff\\u025b\",\n      \"sa\\u014b t\\u00e0\\u014ba tsets\\u00e1\\u02bc\",\n      \"sa\\u014b mejwo\\u014b\\u00f3\",\n      \"sa\\u014b l\\u00f9m\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"sa\\u014b tsets\\u025b\\u0300\\u025b l\\u00f9m\",\n      \"sa\\u014b k\\u00e0g ngw\\u00f3\\u014b\",\n      \"sa\\u014b lepy\\u00e8 sh\\u00fam\",\n      \"sa\\u014b c\\u00ff\\u00f3\",\n      \"sa\\u014b ts\\u025b\\u0300\\u025b c\\u00ff\\u00f3\",\n      \"sa\\u014b nj\\u00ffol\\u00e1\\u02bc\",\n      \"sa\\u014b ty\\u025b\\u0300b ty\\u025b\\u0300b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b ngw\\u0254\\u0300\\u02bc mb\\u00ff\\u025b\",\n      \"sa\\u014b t\\u00e0\\u014ba tsets\\u00e1\\u02bc\",\n      \"sa\\u014b mejwo\\u014b\\u00f3\",\n      \"sa\\u014b l\\u00f9m\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE , 'ly\\u025b'\\u030c\\u02bc d 'na' MMMM, y\",\n    \"longDate\": \"'ly\\u025b'\\u030c\\u02bc d 'na' MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nnh-cm\",\n  \"localeID\": \"nnh_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nnh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"mba\\u02bc\\u00e1mba\\u02bc\",\n      \"ncw\\u00f2nz\\u00e9m\"\n    ],\n    \"DAY\": [\n      \"ly\\u025b\\u02bc\\u025b\\u0301 s\\u1e85\\u00ed\\u014bt\\u00e8\",\n      \"mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"ts\\u00e8ts\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 tsets\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mvf\\u00f2 m\\u00e0ga ly\\u025b\\u030c\\u02bc\",\n      \"m\\u00e0ga ly\\u025b\\u030c\\u02bc\"\n    ],\n    \"ERANAMES\": [\n      \"m\\u00e9 zy\\u00e9 Y\\u011bs\\u00f4\",\n      \"m\\u00e9 g\\u00ffo \\u0144zy\\u00e9 Y\\u011bs\\u00f4\"\n    ],\n    \"ERAS\": [\n      \"m.z.Y.\",\n      \"m.g.n.Y.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"sa\\u014b tsets\\u025b\\u0300\\u025b l\\u00f9m\",\n      \"sa\\u014b k\\u00e0g ngw\\u00f3\\u014b\",\n      \"sa\\u014b lepy\\u00e8 sh\\u00fam\",\n      \"sa\\u014b c\\u00ff\\u00f3\",\n      \"sa\\u014b ts\\u025b\\u0300\\u025b c\\u00ff\\u00f3\",\n      \"sa\\u014b nj\\u00ffol\\u00e1\\u02bc\",\n      \"sa\\u014b ty\\u025b\\u0300b ty\\u025b\\u0300b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b ngw\\u0254\\u0300\\u02bc mb\\u00ff\\u025b\",\n      \"sa\\u014b t\\u00e0\\u014ba tsets\\u00e1\\u02bc\",\n      \"sa\\u014b mejwo\\u014b\\u00f3\",\n      \"sa\\u014b l\\u00f9m\"\n    ],\n    \"SHORTDAY\": [\n      \"ly\\u025b\\u02bc\\u025b\\u0301 s\\u1e85\\u00ed\\u014bt\\u00e8\",\n      \"mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 mvf\\u00f2 ly\\u025b\\u030c\\u02bc\",\n      \"ts\\u00e8ts\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mb\\u0254\\u0301\\u0254nt\\u00e8 tsets\\u025b\\u0300\\u025b ly\\u025b\\u030c\\u02bc\",\n      \"mvf\\u00f2 m\\u00e0ga ly\\u025b\\u030c\\u02bc\",\n      \"m\\u00e0ga ly\\u025b\\u030c\\u02bc\"\n    ],\n    \"SHORTMONTH\": [\n      \"sa\\u014b tsets\\u025b\\u0300\\u025b l\\u00f9m\",\n      \"sa\\u014b k\\u00e0g ngw\\u00f3\\u014b\",\n      \"sa\\u014b lepy\\u00e8 sh\\u00fam\",\n      \"sa\\u014b c\\u00ff\\u00f3\",\n      \"sa\\u014b ts\\u025b\\u0300\\u025b c\\u00ff\\u00f3\",\n      \"sa\\u014b nj\\u00ffol\\u00e1\\u02bc\",\n      \"sa\\u014b ty\\u025b\\u0300b ty\\u025b\\u0300b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b ngw\\u0254\\u0300\\u02bc mb\\u00ff\\u025b\",\n      \"sa\\u014b t\\u00e0\\u014ba tsets\\u00e1\\u02bc\",\n      \"sa\\u014b mejwo\\u014b\\u00f3\",\n      \"sa\\u014b l\\u00f9m\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"sa\\u014b tsets\\u025b\\u0300\\u025b l\\u00f9m\",\n      \"sa\\u014b k\\u00e0g ngw\\u00f3\\u014b\",\n      \"sa\\u014b lepy\\u00e8 sh\\u00fam\",\n      \"sa\\u014b c\\u00ff\\u00f3\",\n      \"sa\\u014b ts\\u025b\\u0300\\u025b c\\u00ff\\u00f3\",\n      \"sa\\u014b nj\\u00ffol\\u00e1\\u02bc\",\n      \"sa\\u014b ty\\u025b\\u0300b ty\\u025b\\u0300b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b mb\\u0289\\u0300\\u014b\",\n      \"sa\\u014b ngw\\u0254\\u0300\\u02bc mb\\u00ff\\u025b\",\n      \"sa\\u014b t\\u00e0\\u014ba tsets\\u00e1\\u02bc\",\n      \"sa\\u014b mejwo\\u014b\\u00f3\",\n      \"sa\\u014b l\\u00f9m\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE , 'ly\\u025b'\\u030c\\u02bc d 'na' MMMM, y\",\n    \"longDate\": \"'ly\\u025b'\\u030c\\u02bc d 'na' MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nnh\",\n  \"localeID\": \"nnh\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_no-no.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f8r Kristus\",\n      \"etter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"no-no\",\n  \"localeID\": \"no_NO\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_no.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"s\\u00f8ndag\",\n      \"mandag\",\n      \"tirsdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f8rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f8r Kristus\",\n      \"etter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f8n.\",\n      \"man.\",\n      \"tir.\",\n      \"ons.\",\n      \"tor.\",\n      \"fre.\",\n      \"l\\u00f8r.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"jun.\",\n      \"jul.\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"des.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mars\",\n      \"april\",\n      \"mai\",\n      \"juni\",\n      \"juli\",\n      \"august\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"desember\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"no\",\n  \"localeID\": \"no\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nus-ss.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"RW\",\n      \"T\\u014a\"\n    ],\n    \"DAY\": [\n      \"C\\u00e4\\u014b ku\\u0254th\",\n      \"Jiec la\\u0331t\",\n      \"R\\u025bw l\\u00e4tni\",\n      \"Di\\u0254\\u0331k l\\u00e4tni\",\n      \"\\u014auaan l\\u00e4tni\",\n      \"Dhieec l\\u00e4tni\",\n      \"B\\u00e4k\\u025bl l\\u00e4tni\"\n    ],\n    \"ERANAMES\": [\n      \"A ka\\u0331n Yecu ni dap\",\n      \"\\u0190 ca Yecu dap\"\n    ],\n    \"ERAS\": [\n      \"AY\",\n      \"\\u0190Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Tiop thar p\\u025bt\",\n      \"P\\u025bt\",\n      \"Du\\u0254\\u0331\\u0254\\u0331\\u014b\",\n      \"Guak\",\n      \"Du\\u00e4t\",\n      \"Kornyoot\",\n      \"Pay yie\\u0331tni\",\n      \"Tho\\u0331o\\u0331r\",\n      \"T\\u025b\\u025br\",\n      \"Laath\",\n      \"Kur\",\n      \"Tio\\u0331p in di\\u0331i\\u0331t\"\n    ],\n    \"SHORTDAY\": [\n      \"C\\u00e4\\u014b\",\n      \"Jiec\",\n      \"R\\u025bw\",\n      \"Di\\u0254\\u0331k\",\n      \"\\u014auaan\",\n      \"Dhieec\",\n      \"B\\u00e4k\\u025bl\"\n    ],\n    \"SHORTMONTH\": [\n      \"Tiop\",\n      \"P\\u025bt\",\n      \"Du\\u0254\\u0331\\u0254\\u0331\",\n      \"Guak\",\n      \"Du\\u00e4\",\n      \"Kor\",\n      \"Pay\",\n      \"Thoo\",\n      \"T\\u025b\\u025b\",\n      \"Laa\",\n      \"Kur\",\n      \"Tid\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Tiop thar p\\u025bt\",\n      \"P\\u025bt\",\n      \"Du\\u0254\\u0331\\u0254\\u0331\\u014b\",\n      \"Guak\",\n      \"Du\\u00e4t\",\n      \"Kornyoot\",\n      \"Pay yie\\u0331tni\",\n      \"Tho\\u0331o\\u0331r\",\n      \"T\\u025b\\u025br\",\n      \"Laath\",\n      \"Kur\",\n      \"Tio\\u0331p in di\\u0331i\\u0331t\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/y h:mm a\",\n    \"shortDate\": \"d/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nus-ss\",\n  \"localeID\": \"nus_SS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nus.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"RW\",\n      \"T\\u014a\"\n    ],\n    \"DAY\": [\n      \"C\\u00e4\\u014b ku\\u0254th\",\n      \"Jiec la\\u0331t\",\n      \"R\\u025bw l\\u00e4tni\",\n      \"Di\\u0254\\u0331k l\\u00e4tni\",\n      \"\\u014auaan l\\u00e4tni\",\n      \"Dhieec l\\u00e4tni\",\n      \"B\\u00e4k\\u025bl l\\u00e4tni\"\n    ],\n    \"ERANAMES\": [\n      \"A ka\\u0331n Yecu ni dap\",\n      \"\\u0190 ca Yecu dap\"\n    ],\n    \"ERAS\": [\n      \"AY\",\n      \"\\u0190Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Tiop thar p\\u025bt\",\n      \"P\\u025bt\",\n      \"Du\\u0254\\u0331\\u0254\\u0331\\u014b\",\n      \"Guak\",\n      \"Du\\u00e4t\",\n      \"Kornyoot\",\n      \"Pay yie\\u0331tni\",\n      \"Tho\\u0331o\\u0331r\",\n      \"T\\u025b\\u025br\",\n      \"Laath\",\n      \"Kur\",\n      \"Tio\\u0331p in di\\u0331i\\u0331t\"\n    ],\n    \"SHORTDAY\": [\n      \"C\\u00e4\\u014b\",\n      \"Jiec\",\n      \"R\\u025bw\",\n      \"Di\\u0254\\u0331k\",\n      \"\\u014auaan\",\n      \"Dhieec\",\n      \"B\\u00e4k\\u025bl\"\n    ],\n    \"SHORTMONTH\": [\n      \"Tiop\",\n      \"P\\u025bt\",\n      \"Du\\u0254\\u0331\\u0254\\u0331\",\n      \"Guak\",\n      \"Du\\u00e4\",\n      \"Kor\",\n      \"Pay\",\n      \"Thoo\",\n      \"T\\u025b\\u025b\",\n      \"Laa\",\n      \"Kur\",\n      \"Tid\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Tiop thar p\\u025bt\",\n      \"P\\u025bt\",\n      \"Du\\u0254\\u0331\\u0254\\u0331\\u014b\",\n      \"Guak\",\n      \"Du\\u00e4t\",\n      \"Kornyoot\",\n      \"Pay yie\\u0331tni\",\n      \"Tho\\u0331o\\u0331r\",\n      \"T\\u025b\\u025br\",\n      \"Laath\",\n      \"Kur\",\n      \"Tio\\u0331p in di\\u0331i\\u0331t\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/MM/y h:mm a\",\n    \"shortDate\": \"d/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a3\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nus\",\n  \"localeID\": \"nus\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nyn-ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sande\",\n      \"Orwokubanza\",\n      \"Orwakabiri\",\n      \"Orwakashatu\",\n      \"Orwakana\",\n      \"Orwakataano\",\n      \"Orwamukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kurisito Atakaijire\",\n      \"Kurisito Yaijire\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"SHORTDAY\": [\n      \"SAN\",\n      \"ORK\",\n      \"OKB\",\n      \"OKS\",\n      \"OKN\",\n      \"OKT\",\n      \"OMK\"\n    ],\n    \"SHORTMONTH\": [\n      \"KBZ\",\n      \"KBR\",\n      \"KST\",\n      \"KKN\",\n      \"KTN\",\n      \"KMK\",\n      \"KMS\",\n      \"KMN\",\n      \"KMW\",\n      \"KKM\",\n      \"KNK\",\n      \"KNB\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nyn-ug\",\n  \"localeID\": \"nyn_UG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_nyn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sande\",\n      \"Orwokubanza\",\n      \"Orwakabiri\",\n      \"Orwakashatu\",\n      \"Orwakana\",\n      \"Orwakataano\",\n      \"Orwamukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kurisito Atakaijire\",\n      \"Kurisito Yaijire\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"SHORTDAY\": [\n      \"SAN\",\n      \"ORK\",\n      \"OKB\",\n      \"OKS\",\n      \"OKN\",\n      \"OKT\",\n      \"OMK\"\n    ],\n    \"SHORTMONTH\": [\n      \"KBZ\",\n      \"KBR\",\n      \"KST\",\n      \"KKN\",\n      \"KTN\",\n      \"KMK\",\n      \"KMS\",\n      \"KMN\",\n      \"KMW\",\n      \"KKM\",\n      \"KNK\",\n      \"KNB\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Okwokubanza\",\n      \"Okwakabiri\",\n      \"Okwakashatu\",\n      \"Okwakana\",\n      \"Okwakataana\",\n      \"Okwamukaaga\",\n      \"Okwamushanju\",\n      \"Okwamunaana\",\n      \"Okwamwenda\",\n      \"Okwaikumi\",\n      \"Okwaikumi na kumwe\",\n      \"Okwaikumi na ibiri\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"nyn\",\n  \"localeID\": \"nyn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_om-et.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"WD\",\n      \"WB\"\n    ],\n    \"DAY\": [\n      \"Dilbata\",\n      \"Wiixata\",\n      \"Qibxata\",\n      \"Roobii\",\n      \"Kamiisa\",\n      \"Jimaata\",\n      \"Sanbata\"\n    ],\n    \"ERANAMES\": [\n      \"Dheengadda Jeesu\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Amajjii\",\n      \"Guraandhala\",\n      \"Bitooteessa\",\n      \"Elba\",\n      \"Caamsa\",\n      \"Waxabajjii\",\n      \"Adooleessa\",\n      \"Hagayya\",\n      \"Fuulbana\",\n      \"Onkololeessa\",\n      \"Sadaasa\",\n      \"Muddee\"\n    ],\n    \"SHORTDAY\": [\n      \"Dil\",\n      \"Wix\",\n      \"Qib\",\n      \"Rob\",\n      \"Kam\",\n      \"Jim\",\n      \"San\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ama\",\n      \"Gur\",\n      \"Bit\",\n      \"Elb\",\n      \"Cam\",\n      \"Wax\",\n      \"Ado\",\n      \"Hag\",\n      \"Ful\",\n      \"Onk\",\n      \"Sad\",\n      \"Mud\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Amajjii\",\n      \"Guraandhala\",\n      \"Bitooteessa\",\n      \"Elba\",\n      \"Caamsa\",\n      \"Waxabajjii\",\n      \"Adooleessa\",\n      \"Hagayya\",\n      \"Fuulbana\",\n      \"Onkololeessa\",\n      \"Sadaasa\",\n      \"Muddee\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Birr\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"om-et\",\n  \"localeID\": \"om_ET\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_om-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"WD\",\n      \"WB\"\n    ],\n    \"DAY\": [\n      \"Dilbata\",\n      \"Wiixata\",\n      \"Qibxata\",\n      \"Roobii\",\n      \"Kamiisa\",\n      \"Jimaata\",\n      \"Sanbata\"\n    ],\n    \"ERANAMES\": [\n      \"Dheengadda Jeesu\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"KD\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Amajjii\",\n      \"Guraandhala\",\n      \"Bitooteessa\",\n      \"Elba\",\n      \"Caamsa\",\n      \"Waxabajjii\",\n      \"Adooleessa\",\n      \"Hagayya\",\n      \"Fuulbana\",\n      \"Onkololeessa\",\n      \"Sadaasa\",\n      \"Muddee\"\n    ],\n    \"SHORTDAY\": [\n      \"Dil\",\n      \"Wix\",\n      \"Qib\",\n      \"Rob\",\n      \"Kam\",\n      \"Jim\",\n      \"San\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ama\",\n      \"Gur\",\n      \"Bit\",\n      \"Elb\",\n      \"Cam\",\n      \"Wax\",\n      \"Ado\",\n      \"Hag\",\n      \"Ful\",\n      \"Onk\",\n      \"Sad\",\n      \"Mud\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Amajjii\",\n      \"Guraandhala\",\n      \"Bitooteessa\",\n      \"Elba\",\n      \"Caamsa\",\n      \"Waxabajjii\",\n      \"Adooleessa\",\n      \"Hagayya\",\n      \"Fuulbana\",\n      \"Onkololeessa\",\n      \"Sadaasa\",\n      \"Muddee\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y HH:mm:ss\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"om-ke\",\n  \"localeID\": \"om_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_om.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"WD\",\n      \"WB\"\n    ],\n    \"DAY\": [\n      \"Dilbata\",\n      \"Wiixata\",\n      \"Qibxata\",\n      \"Roobii\",\n      \"Kamiisa\",\n      \"Jimaata\",\n      \"Sanbata\"\n    ],\n    \"ERANAMES\": [\n      \"Dheengadda Jeesu\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Amajjii\",\n      \"Guraandhala\",\n      \"Bitooteessa\",\n      \"Elba\",\n      \"Caamsa\",\n      \"Waxabajjii\",\n      \"Adooleessa\",\n      \"Hagayya\",\n      \"Fuulbana\",\n      \"Onkololeessa\",\n      \"Sadaasa\",\n      \"Muddee\"\n    ],\n    \"SHORTDAY\": [\n      \"Dil\",\n      \"Wix\",\n      \"Qib\",\n      \"Rob\",\n      \"Kam\",\n      \"Jim\",\n      \"San\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ama\",\n      \"Gur\",\n      \"Bit\",\n      \"Elb\",\n      \"Cam\",\n      \"Wax\",\n      \"Ado\",\n      \"Hag\",\n      \"Ful\",\n      \"Onk\",\n      \"Sad\",\n      \"Mud\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Amajjii\",\n      \"Guraandhala\",\n      \"Bitooteessa\",\n      \"Elba\",\n      \"Caamsa\",\n      \"Waxabajjii\",\n      \"Adooleessa\",\n      \"Hagayya\",\n      \"Fuulbana\",\n      \"Onkololeessa\",\n      \"Sadaasa\",\n      \"Muddee\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Birr\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"om\",\n  \"localeID\": \"om\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_or-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"\\u0b30\\u0b2c\\u0b3f\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b38\\u0b4b\\u0b2e\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b2e\\u0b19\\u0b4d\\u0b17\\u0b33\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b2c\\u0b41\\u0b27\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b17\\u0b41\\u0b30\\u0b41\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b36\\u0b41\\u0b15\\u0b4d\\u0b30\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b36\\u0b28\\u0b3f\\u0b2c\\u0b3e\\u0b30\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0b1c\\u0b3e\\u0b28\\u0b41\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2b\\u0b47\\u0b2c\\u0b43\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2e\\u0b3e\\u0b30\\u0b4d\\u0b1a\\u0b4d\\u0b1a\",\n      \"\\u0b05\\u0b2a\\u0b4d\\u0b30\\u0b47\\u0b32\",\n      \"\\u0b2e\\u0b07\",\n      \"\\u0b1c\\u0b41\\u0b28\",\n      \"\\u0b1c\\u0b41\\u0b32\\u0b3e\\u0b07\",\n      \"\\u0b05\\u0b17\\u0b37\\u0b4d\\u0b1f\",\n      \"\\u0b38\\u0b47\\u0b2a\\u0b4d\\u0b1f\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b05\\u0b15\\u0b4d\\u0b1f\\u0b4b\\u0b2c\\u0b30\",\n      \"\\u0b28\\u0b2d\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b21\\u0b3f\\u0b38\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0b30\\u0b2c\\u0b3f\",\n      \"\\u0b38\\u0b4b\\u0b2e\",\n      \"\\u0b2e\\u0b19\\u0b4d\\u0b17\\u0b33\",\n      \"\\u0b2c\\u0b41\\u0b27\",\n      \"\\u0b17\\u0b41\\u0b30\\u0b41\",\n      \"\\u0b36\\u0b41\\u0b15\\u0b4d\\u0b30\",\n      \"\\u0b36\\u0b28\\u0b3f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0b1c\\u0b3e\\u0b28\\u0b41\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2b\\u0b47\\u0b2c\\u0b43\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2e\\u0b3e\\u0b30\\u0b4d\\u0b1a\\u0b4d\\u0b1a\",\n      \"\\u0b05\\u0b2a\\u0b4d\\u0b30\\u0b47\\u0b32\",\n      \"\\u0b2e\\u0b07\",\n      \"\\u0b1c\\u0b41\\u0b28\",\n      \"\\u0b1c\\u0b41\\u0b32\\u0b3e\\u0b07\",\n      \"\\u0b05\\u0b17\\u0b37\\u0b4d\\u0b1f\",\n      \"\\u0b38\\u0b47\\u0b2a\\u0b4d\\u0b1f\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b05\\u0b15\\u0b4d\\u0b1f\\u0b4b\\u0b2c\\u0b30\",\n      \"\\u0b28\\u0b2d\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b21\\u0b3f\\u0b38\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0b1c\\u0b3e\\u0b28\\u0b41\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2b\\u0b47\\u0b2c\\u0b43\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2e\\u0b3e\\u0b30\\u0b4d\\u0b1a\\u0b4d\\u0b1a\",\n      \"\\u0b05\\u0b2a\\u0b4d\\u0b30\\u0b47\\u0b32\",\n      \"\\u0b2e\\u0b07\",\n      \"\\u0b1c\\u0b41\\u0b28\",\n      \"\\u0b1c\\u0b41\\u0b32\\u0b3e\\u0b07\",\n      \"\\u0b05\\u0b17\\u0b37\\u0b4d\\u0b1f\",\n      \"\\u0b38\\u0b47\\u0b2a\\u0b4d\\u0b1f\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b05\\u0b15\\u0b4d\\u0b1f\\u0b4b\\u0b2c\\u0b30\",\n      \"\\u0b28\\u0b2d\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b21\\u0b3f\\u0b38\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d-M-yy h:mm a\",\n    \"shortDate\": \"d-M-yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"or-in\",\n  \"localeID\": \"or_IN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_or.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"am\",\n      \"pm\"\n    ],\n    \"DAY\": [\n      \"\\u0b30\\u0b2c\\u0b3f\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b38\\u0b4b\\u0b2e\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b2e\\u0b19\\u0b4d\\u0b17\\u0b33\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b2c\\u0b41\\u0b27\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b17\\u0b41\\u0b30\\u0b41\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b36\\u0b41\\u0b15\\u0b4d\\u0b30\\u0b2c\\u0b3e\\u0b30\",\n      \"\\u0b36\\u0b28\\u0b3f\\u0b2c\\u0b3e\\u0b30\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0b1c\\u0b3e\\u0b28\\u0b41\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2b\\u0b47\\u0b2c\\u0b43\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2e\\u0b3e\\u0b30\\u0b4d\\u0b1a\\u0b4d\\u0b1a\",\n      \"\\u0b05\\u0b2a\\u0b4d\\u0b30\\u0b47\\u0b32\",\n      \"\\u0b2e\\u0b07\",\n      \"\\u0b1c\\u0b41\\u0b28\",\n      \"\\u0b1c\\u0b41\\u0b32\\u0b3e\\u0b07\",\n      \"\\u0b05\\u0b17\\u0b37\\u0b4d\\u0b1f\",\n      \"\\u0b38\\u0b47\\u0b2a\\u0b4d\\u0b1f\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b05\\u0b15\\u0b4d\\u0b1f\\u0b4b\\u0b2c\\u0b30\",\n      \"\\u0b28\\u0b2d\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b21\\u0b3f\\u0b38\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0b30\\u0b2c\\u0b3f\",\n      \"\\u0b38\\u0b4b\\u0b2e\",\n      \"\\u0b2e\\u0b19\\u0b4d\\u0b17\\u0b33\",\n      \"\\u0b2c\\u0b41\\u0b27\",\n      \"\\u0b17\\u0b41\\u0b30\\u0b41\",\n      \"\\u0b36\\u0b41\\u0b15\\u0b4d\\u0b30\",\n      \"\\u0b36\\u0b28\\u0b3f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0b1c\\u0b3e\\u0b28\\u0b41\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2b\\u0b47\\u0b2c\\u0b43\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2e\\u0b3e\\u0b30\\u0b4d\\u0b1a\\u0b4d\\u0b1a\",\n      \"\\u0b05\\u0b2a\\u0b4d\\u0b30\\u0b47\\u0b32\",\n      \"\\u0b2e\\u0b07\",\n      \"\\u0b1c\\u0b41\\u0b28\",\n      \"\\u0b1c\\u0b41\\u0b32\\u0b3e\\u0b07\",\n      \"\\u0b05\\u0b17\\u0b37\\u0b4d\\u0b1f\",\n      \"\\u0b38\\u0b47\\u0b2a\\u0b4d\\u0b1f\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b05\\u0b15\\u0b4d\\u0b1f\\u0b4b\\u0b2c\\u0b30\",\n      \"\\u0b28\\u0b2d\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b21\\u0b3f\\u0b38\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0b1c\\u0b3e\\u0b28\\u0b41\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2b\\u0b47\\u0b2c\\u0b43\\u0b06\\u0b30\\u0b40\",\n      \"\\u0b2e\\u0b3e\\u0b30\\u0b4d\\u0b1a\\u0b4d\\u0b1a\",\n      \"\\u0b05\\u0b2a\\u0b4d\\u0b30\\u0b47\\u0b32\",\n      \"\\u0b2e\\u0b07\",\n      \"\\u0b1c\\u0b41\\u0b28\",\n      \"\\u0b1c\\u0b41\\u0b32\\u0b3e\\u0b07\",\n      \"\\u0b05\\u0b17\\u0b37\\u0b4d\\u0b1f\",\n      \"\\u0b38\\u0b47\\u0b2a\\u0b4d\\u0b1f\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b05\\u0b15\\u0b4d\\u0b1f\\u0b4b\\u0b2c\\u0b30\",\n      \"\\u0b28\\u0b2d\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\",\n      \"\\u0b21\\u0b3f\\u0b38\\u0b47\\u0b2e\\u0b4d\\u0b2c\\u0b30\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d-M-yy h:mm a\",\n    \"shortDate\": \"d-M-yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"or\",\n  \"localeID\": \"or\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_os-ge.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u04d5\\u043c\\u0431\\u0438\\u0441\\u0431\\u043e\\u043d\\u044b \\u0440\\u0430\\u0437\\u043c\\u04d5\",\n      \"\\u04d5\\u043c\\u0431\\u0438\\u0441\\u0431\\u043e\\u043d\\u044b \\u0444\\u04d5\\u0441\\u0442\\u04d5\"\n    ],\n    \"DAY\": [\n      \"\\u0445\\u0443\\u044b\\u0446\\u0430\\u0443\\u0431\\u043e\\u043d\",\n      \"\\u043a\\u044a\\u0443\\u044b\\u0440\\u0438\\u0441\\u04d5\\u0440\",\n      \"\\u0434\\u044b\\u0446\\u0446\\u04d5\\u0433\",\n      \"\\u04d5\\u0440\\u0442\\u044b\\u0446\\u0446\\u04d5\\u0433\",\n      \"\\u0446\\u044b\\u043f\\u043f\\u04d5\\u0440\\u04d5\\u043c\",\n      \"\\u043c\\u0430\\u0439\\u0440\\u04d5\\u043c\\u0431\\u043e\\u043d\",\n      \"\\u0441\\u0430\\u0431\\u0430\\u0442\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043d.\\u0434.\\u0430.\",\n      \"\\u043d.\\u0434.\"\n    ],\n    \"ERAS\": [\n      \"\\u043d.\\u0434.\\u0430.\",\n      \"\\u043d.\\u0434.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044b\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044b\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u044a\\u0438\\u0439\\u044b\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044b\",\n      \"\\u043c\\u0430\\u0439\\u044b\",\n      \"\\u0438\\u044e\\u043d\\u044b\",\n      \"\\u0438\\u044e\\u043b\\u044b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u044b\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0445\\u0446\\u0431\",\n      \"\\u043a\\u0440\\u0441\",\n      \"\\u0434\\u0446\\u0433\",\n      \"\\u04d5\\u0440\\u0442\",\n      \"\\u0446\\u043f\\u0440\",\n      \"\\u043c\\u0440\\u0431\",\n      \"\\u0441\\u0431\\u0442\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0439\\u044b\",\n      \"\\u0438\\u044e\\u043d\\u044b\",\n      \"\\u0438\\u044e\\u043b\\u044b\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0440\\u0442\\u044a\\u0438\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u044e\\u043d\\u044c\",\n      \"\\u0418\\u044e\\u043b\\u044c\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y '\\u0430\\u0437'\",\n    \"longDate\": \"d MMMM, y '\\u0430\\u0437'\",\n    \"medium\": \"dd MMM y '\\u0430\\u0437' HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y '\\u0430\\u0437'\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GEL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"os-ge\",\n  \"localeID\": \"os_GE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_os-ru.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u04d5\\u043c\\u0431\\u0438\\u0441\\u0431\\u043e\\u043d\\u044b \\u0440\\u0430\\u0437\\u043c\\u04d5\",\n      \"\\u04d5\\u043c\\u0431\\u0438\\u0441\\u0431\\u043e\\u043d\\u044b \\u0444\\u04d5\\u0441\\u0442\\u04d5\"\n    ],\n    \"DAY\": [\n      \"\\u0445\\u0443\\u044b\\u0446\\u0430\\u0443\\u0431\\u043e\\u043d\",\n      \"\\u043a\\u044a\\u0443\\u044b\\u0440\\u0438\\u0441\\u04d5\\u0440\",\n      \"\\u0434\\u044b\\u0446\\u0446\\u04d5\\u0433\",\n      \"\\u04d5\\u0440\\u0442\\u044b\\u0446\\u0446\\u04d5\\u0433\",\n      \"\\u0446\\u044b\\u043f\\u043f\\u04d5\\u0440\\u04d5\\u043c\",\n      \"\\u043c\\u0430\\u0439\\u0440\\u04d5\\u043c\\u0431\\u043e\\u043d\",\n      \"\\u0441\\u0430\\u0431\\u0430\\u0442\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043d.\\u0434.\\u0430.\",\n      \"\\u043d.\\u0434.\"\n    ],\n    \"ERAS\": [\n      \"\\u043d.\\u0434.\\u0430.\",\n      \"\\u043d.\\u0434.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044b\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044b\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u044a\\u0438\\u0439\\u044b\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044b\",\n      \"\\u043c\\u0430\\u0439\\u044b\",\n      \"\\u0438\\u044e\\u043d\\u044b\",\n      \"\\u0438\\u044e\\u043b\\u044b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u044b\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0445\\u0446\\u0431\",\n      \"\\u043a\\u0440\\u0441\",\n      \"\\u0434\\u0446\\u0433\",\n      \"\\u04d5\\u0440\\u0442\",\n      \"\\u0446\\u043f\\u0440\",\n      \"\\u043c\\u0440\\u0431\",\n      \"\\u0441\\u0431\\u0442\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0439\\u044b\",\n      \"\\u0438\\u044e\\u043d\\u044b\",\n      \"\\u0438\\u044e\\u043b\\u044b\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0440\\u0442\\u044a\\u0438\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u044e\\u043d\\u044c\",\n      \"\\u0418\\u044e\\u043b\\u044c\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y '\\u0430\\u0437'\",\n    \"longDate\": \"d MMMM, y '\\u0430\\u0437'\",\n    \"medium\": \"dd MMM y '\\u0430\\u0437' HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y '\\u0430\\u0437'\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"os-ru\",\n  \"localeID\": \"os_RU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_os.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u04d5\\u043c\\u0431\\u0438\\u0441\\u0431\\u043e\\u043d\\u044b \\u0440\\u0430\\u0437\\u043c\\u04d5\",\n      \"\\u04d5\\u043c\\u0431\\u0438\\u0441\\u0431\\u043e\\u043d\\u044b \\u0444\\u04d5\\u0441\\u0442\\u04d5\"\n    ],\n    \"DAY\": [\n      \"\\u0445\\u0443\\u044b\\u0446\\u0430\\u0443\\u0431\\u043e\\u043d\",\n      \"\\u043a\\u044a\\u0443\\u044b\\u0440\\u0438\\u0441\\u04d5\\u0440\",\n      \"\\u0434\\u044b\\u0446\\u0446\\u04d5\\u0433\",\n      \"\\u04d5\\u0440\\u0442\\u044b\\u0446\\u0446\\u04d5\\u0433\",\n      \"\\u0446\\u044b\\u043f\\u043f\\u04d5\\u0440\\u04d5\\u043c\",\n      \"\\u043c\\u0430\\u0439\\u0440\\u04d5\\u043c\\u0431\\u043e\\u043d\",\n      \"\\u0441\\u0430\\u0431\\u0430\\u0442\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043d.\\u0434.\\u0430.\",\n      \"\\u043d.\\u0434.\"\n    ],\n    \"ERAS\": [\n      \"\\u043d.\\u0434.\\u0430.\",\n      \"\\u043d.\\u0434.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044b\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044b\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u044a\\u0438\\u0439\\u044b\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044b\",\n      \"\\u043c\\u0430\\u0439\\u044b\",\n      \"\\u0438\\u044e\\u043d\\u044b\",\n      \"\\u0438\\u044e\\u043b\\u044b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u044b\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044b\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0445\\u0446\\u0431\",\n      \"\\u043a\\u0440\\u0441\",\n      \"\\u0434\\u0446\\u0433\",\n      \"\\u04d5\\u0440\\u0442\",\n      \"\\u0446\\u043f\\u0440\",\n      \"\\u043c\\u0440\\u0431\",\n      \"\\u0441\\u0431\\u0442\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0439\\u044b\",\n      \"\\u0438\\u044e\\u043d\\u044b\",\n      \"\\u0438\\u044e\\u043b\\u044b\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0440\\u0442\\u044a\\u0438\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u044e\\u043d\\u044c\",\n      \"\\u0418\\u044e\\u043b\\u044c\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y '\\u0430\\u0437'\",\n    \"longDate\": \"d MMMM, y '\\u0430\\u0437'\",\n    \"medium\": \"dd MMM y '\\u0430\\u0437' HH:mm:ss\",\n    \"mediumDate\": \"dd MMM y '\\u0430\\u0437'\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"GEL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"os\",\n  \"localeID\": \"os\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pa-arab-pk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u067e\\u06cc\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u064f\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0627\\u064a\\u0633\\u0627\\u067e\\u0648\\u0631\\u0648\",\n      \"\\u0633\\u06ba\"\n    ],\n    \"ERAS\": [\n      \"\\u0627\\u064a\\u0633\\u0627\\u067e\\u0648\\u0631\\u0648\",\n      \"\\u0633\\u06ba\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u067e\\u06cc\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u064f\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"pa-arab-pk\",\n  \"localeID\": \"pa_Arab_PK\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pa-arab.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u067e\\u06cc\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u064f\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0627\\u064a\\u0633\\u0627\\u067e\\u0648\\u0631\\u0648\",\n      \"\\u0633\\u06ba\"\n    ],\n    \"ERAS\": [\n      \"\\u0627\\u064a\\u0633\\u0627\\u067e\\u0648\\u0631\\u0648\",\n      \"\\u0633\\u06ba\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u067e\\u06cc\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u064f\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"pa-arab\",\n  \"localeID\": \"pa_Arab\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pa-guru-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0a2a\\u0a42.\\u0a26\\u0a41.\",\n      \"\\u0a2c\\u0a3e.\\u0a26\\u0a41.\"\n    ],\n    \"DAY\": [\n      \"\\u0a10\\u0a24\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a4b\\u0a2e\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a2e\\u0a70\\u0a17\\u0a32\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a2c\\u0a41\\u0a71\\u0a27\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a35\\u0a40\\u0a30\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a41\\u0a71\\u0a15\\u0a30\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a28\\u0a3f\\u0a71\\u0a1a\\u0a30\\u0a35\\u0a3e\\u0a30\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0a08\\u0a38\\u0a35\\u0a40 \\u0a2a\\u0a42\\u0a30\\u0a35\",\n      \"\\u0a08\\u0a38\\u0a35\\u0a40 \\u0a38\\u0a70\\u0a28\"\n    ],\n    \"ERAS\": [\n      \"\\u0a08. \\u0a2a\\u0a42.\",\n      \"\\u0a38\\u0a70\\u0a28\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0a1c\\u0a28\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2b\\u0a3c\\u0a30\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\\u0a32\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\\u0a08\",\n      \"\\u0a05\\u0a17\\u0a38\\u0a24\",\n      \"\\u0a38\\u0a24\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\\u0a2c\\u0a30\",\n      \"\\u0a28\\u0a35\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a26\\u0a38\\u0a70\\u0a2c\\u0a30\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0a10\\u0a24\",\n      \"\\u0a38\\u0a4b\\u0a2e\",\n      \"\\u0a2e\\u0a70\\u0a17\\u0a32\",\n      \"\\u0a2c\\u0a41\\u0a71\\u0a27\",\n      \"\\u0a35\\u0a40\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a41\\u0a71\\u0a15\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a28\\u0a3f\\u0a71\\u0a1a\\u0a30\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0a1c\\u0a28\",\n      \"\\u0a2b\\u0a3c\\u0a30\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\",\n      \"\\u0a05\\u0a17\",\n      \"\\u0a38\\u0a24\\u0a70\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\",\n      \"\\u0a28\\u0a35\\u0a70\",\n      \"\\u0a26\\u0a38\\u0a70\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0a1c\\u0a28\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2b\\u0a3c\\u0a30\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\\u0a32\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\\u0a08\",\n      \"\\u0a05\\u0a17\\u0a38\\u0a24\",\n      \"\\u0a38\\u0a24\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\\u0a2c\\u0a30\",\n      \"\\u0a28\\u0a35\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a26\\u0a38\\u0a70\\u0a2c\\u0a30\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"pa-guru-in\",\n  \"localeID\": \"pa_Guru_IN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pa-guru.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0a2a\\u0a42.\\u0a26\\u0a41.\",\n      \"\\u0a2c\\u0a3e.\\u0a26\\u0a41.\"\n    ],\n    \"DAY\": [\n      \"\\u0a10\\u0a24\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a4b\\u0a2e\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a2e\\u0a70\\u0a17\\u0a32\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a2c\\u0a41\\u0a71\\u0a27\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a35\\u0a40\\u0a30\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a41\\u0a71\\u0a15\\u0a30\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a28\\u0a3f\\u0a71\\u0a1a\\u0a30\\u0a35\\u0a3e\\u0a30\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0a08\\u0a38\\u0a35\\u0a40 \\u0a2a\\u0a42\\u0a30\\u0a35\",\n      \"\\u0a08\\u0a38\\u0a35\\u0a40 \\u0a38\\u0a70\\u0a28\"\n    ],\n    \"ERAS\": [\n      \"\\u0a08. \\u0a2a\\u0a42.\",\n      \"\\u0a38\\u0a70\\u0a28\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0a1c\\u0a28\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2b\\u0a3c\\u0a30\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\\u0a32\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\\u0a08\",\n      \"\\u0a05\\u0a17\\u0a38\\u0a24\",\n      \"\\u0a38\\u0a24\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\\u0a2c\\u0a30\",\n      \"\\u0a28\\u0a35\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a26\\u0a38\\u0a70\\u0a2c\\u0a30\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0a10\\u0a24\",\n      \"\\u0a38\\u0a4b\\u0a2e\",\n      \"\\u0a2e\\u0a70\\u0a17\\u0a32\",\n      \"\\u0a2c\\u0a41\\u0a71\\u0a27\",\n      \"\\u0a35\\u0a40\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a41\\u0a71\\u0a15\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a28\\u0a3f\\u0a71\\u0a1a\\u0a30\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0a1c\\u0a28\",\n      \"\\u0a2b\\u0a3c\\u0a30\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\",\n      \"\\u0a05\\u0a17\",\n      \"\\u0a38\\u0a24\\u0a70\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\",\n      \"\\u0a28\\u0a35\\u0a70\",\n      \"\\u0a26\\u0a38\\u0a70\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0a1c\\u0a28\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2b\\u0a3c\\u0a30\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\\u0a32\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\\u0a08\",\n      \"\\u0a05\\u0a17\\u0a38\\u0a24\",\n      \"\\u0a38\\u0a24\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\\u0a2c\\u0a30\",\n      \"\\u0a28\\u0a35\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a26\\u0a38\\u0a70\\u0a2c\\u0a30\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"pa-guru\",\n  \"localeID\": \"pa_Guru\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pa.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0a2a\\u0a42.\\u0a26\\u0a41.\",\n      \"\\u0a2c\\u0a3e.\\u0a26\\u0a41.\"\n    ],\n    \"DAY\": [\n      \"\\u0a10\\u0a24\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a4b\\u0a2e\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a2e\\u0a70\\u0a17\\u0a32\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a2c\\u0a41\\u0a71\\u0a27\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a35\\u0a40\\u0a30\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a41\\u0a71\\u0a15\\u0a30\\u0a35\\u0a3e\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a28\\u0a3f\\u0a71\\u0a1a\\u0a30\\u0a35\\u0a3e\\u0a30\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0a08\\u0a38\\u0a35\\u0a40 \\u0a2a\\u0a42\\u0a30\\u0a35\",\n      \"\\u0a08\\u0a38\\u0a35\\u0a40 \\u0a38\\u0a70\\u0a28\"\n    ],\n    \"ERAS\": [\n      \"\\u0a08. \\u0a2a\\u0a42.\",\n      \"\\u0a38\\u0a70\\u0a28\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0a1c\\u0a28\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2b\\u0a3c\\u0a30\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\\u0a32\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\\u0a08\",\n      \"\\u0a05\\u0a17\\u0a38\\u0a24\",\n      \"\\u0a38\\u0a24\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\\u0a2c\\u0a30\",\n      \"\\u0a28\\u0a35\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a26\\u0a38\\u0a70\\u0a2c\\u0a30\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0a10\\u0a24\",\n      \"\\u0a38\\u0a4b\\u0a2e\",\n      \"\\u0a2e\\u0a70\\u0a17\\u0a32\",\n      \"\\u0a2c\\u0a41\\u0a71\\u0a27\",\n      \"\\u0a35\\u0a40\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a41\\u0a71\\u0a15\\u0a30\",\n      \"\\u0a38\\u0a3c\\u0a28\\u0a3f\\u0a71\\u0a1a\\u0a30\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0a1c\\u0a28\",\n      \"\\u0a2b\\u0a3c\\u0a30\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\",\n      \"\\u0a05\\u0a17\",\n      \"\\u0a38\\u0a24\\u0a70\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\",\n      \"\\u0a28\\u0a35\\u0a70\",\n      \"\\u0a26\\u0a38\\u0a70\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0a1c\\u0a28\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2b\\u0a3c\\u0a30\\u0a35\\u0a30\\u0a40\",\n      \"\\u0a2e\\u0a3e\\u0a30\\u0a1a\",\n      \"\\u0a05\\u0a2a\\u0a4d\\u0a30\\u0a48\\u0a32\",\n      \"\\u0a2e\\u0a08\",\n      \"\\u0a1c\\u0a42\\u0a28\",\n      \"\\u0a1c\\u0a41\\u0a32\\u0a3e\\u0a08\",\n      \"\\u0a05\\u0a17\\u0a38\\u0a24\",\n      \"\\u0a38\\u0a24\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a05\\u0a15\\u0a24\\u0a42\\u0a2c\\u0a30\",\n      \"\\u0a28\\u0a35\\u0a70\\u0a2c\\u0a30\",\n      \"\\u0a26\\u0a38\\u0a70\\u0a2c\\u0a30\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"pa\",\n  \"localeID\": \"pa\",\n  \"pluralCat\": function(n, opt_precision) {  if (n >= 0 && n <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pl-pl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"niedziela\",\n      \"poniedzia\\u0142ek\",\n      \"wtorek\",\n      \"\\u015broda\",\n      \"czwartek\",\n      \"pi\\u0105tek\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"przed nasz\\u0105 er\\u0105\",\n      \"naszej ery\"\n    ],\n    \"ERAS\": [\n      \"p.n.e.\",\n      \"n.e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"stycznia\",\n      \"lutego\",\n      \"marca\",\n      \"kwietnia\",\n      \"maja\",\n      \"czerwca\",\n      \"lipca\",\n      \"sierpnia\",\n      \"wrze\\u015bnia\",\n      \"pa\\u017adziernika\",\n      \"listopada\",\n      \"grudnia\"\n    ],\n    \"SHORTDAY\": [\n      \"niedz.\",\n      \"pon.\",\n      \"wt.\",\n      \"\\u015br.\",\n      \"czw.\",\n      \"pt.\",\n      \"sob.\"\n    ],\n    \"SHORTMONTH\": [\n      \"sty\",\n      \"lut\",\n      \"mar\",\n      \"kwi\",\n      \"maj\",\n      \"cze\",\n      \"lip\",\n      \"sie\",\n      \"wrz\",\n      \"pa\\u017a\",\n      \"lis\",\n      \"gru\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"stycze\\u0144\",\n      \"luty\",\n      \"marzec\",\n      \"kwiecie\\u0144\",\n      \"maj\",\n      \"czerwiec\",\n      \"lipiec\",\n      \"sierpie\\u0144\",\n      \"wrzesie\\u0144\",\n      \"pa\\u017adziernik\",\n      \"listopad\",\n      \"grudzie\\u0144\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"z\\u0142\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pl-pl\",\n  \"localeID\": \"pl_PL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i != 1 && i % 10 >= 0 && i % 10 <= 1 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 12 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"niedziela\",\n      \"poniedzia\\u0142ek\",\n      \"wtorek\",\n      \"\\u015broda\",\n      \"czwartek\",\n      \"pi\\u0105tek\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"przed nasz\\u0105 er\\u0105\",\n      \"naszej ery\"\n    ],\n    \"ERAS\": [\n      \"p.n.e.\",\n      \"n.e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"stycznia\",\n      \"lutego\",\n      \"marca\",\n      \"kwietnia\",\n      \"maja\",\n      \"czerwca\",\n      \"lipca\",\n      \"sierpnia\",\n      \"wrze\\u015bnia\",\n      \"pa\\u017adziernika\",\n      \"listopada\",\n      \"grudnia\"\n    ],\n    \"SHORTDAY\": [\n      \"niedz.\",\n      \"pon.\",\n      \"wt.\",\n      \"\\u015br.\",\n      \"czw.\",\n      \"pt.\",\n      \"sob.\"\n    ],\n    \"SHORTMONTH\": [\n      \"sty\",\n      \"lut\",\n      \"mar\",\n      \"kwi\",\n      \"maj\",\n      \"cze\",\n      \"lip\",\n      \"sie\",\n      \"wrz\",\n      \"pa\\u017a\",\n      \"lis\",\n      \"gru\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"stycze\\u0144\",\n      \"luty\",\n      \"marzec\",\n      \"kwiecie\\u0144\",\n      \"maj\",\n      \"czerwiec\",\n      \"lipiec\",\n      \"sierpie\\u0144\",\n      \"wrzesie\\u0144\",\n      \"pa\\u017adziernik\",\n      \"listopad\",\n      \"grudzie\\u0144\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"z\\u0142\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pl\",\n  \"localeID\": \"pl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i != 1 && i % 10 >= 0 && i % 10 <= 1 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 12 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_prg-001.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ankst\\u0101inan\",\n      \"pa pussideinan\"\n    ],\n    \"DAY\": [\n      \"nad\\u012bli\",\n      \"panad\\u012bli\",\n      \"wisas\\u012bdis\",\n      \"pussisawaiti\",\n      \"ketwirtiks\",\n      \"p\\u0113ntniks\",\n      \"sabattika\"\n    ],\n    \"ERANAMES\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"rags\",\n      \"wassarins\",\n      \"p\\u016blis\",\n      \"sakkis\",\n      \"zallaws\",\n      \"s\\u012bmenis\",\n      \"l\\u012bpa\",\n      \"daggis\",\n      \"sillins\",\n      \"spallins\",\n      \"lapkr\\u016btis\",\n      \"sallaws\"\n    ],\n    \"SHORTDAY\": [\n      \"nad\",\n      \"pan\",\n      \"wis\",\n      \"pus\",\n      \"ket\",\n      \"p\\u0113n\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"rag\",\n      \"was\",\n      \"p\\u016bl\",\n      \"sak\",\n      \"zal\",\n      \"s\\u012bm\",\n      \"l\\u012bp\",\n      \"dag\",\n      \"sil\",\n      \"spa\",\n      \"lap\",\n      \"sal\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"rags\",\n      \"wassarins\",\n      \"p\\u016blis\",\n      \"sakkis\",\n      \"zallaws\",\n      \"s\\u012bmenis\",\n      \"l\\u012bpa\",\n      \"daggis\",\n      \"sillins\",\n      \"spallins\",\n      \"lapkr\\u016btis\",\n      \"sallaws\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y 'mettas' d. MMMM\",\n    \"longDate\": \"y 'mettas' d. MMMM\",\n    \"medium\": \"dd.MM 'st'. y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM 'st'. y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"prg-001\",\n  \"localeID\": \"prg_001\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_prg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ankst\\u0101inan\",\n      \"pa pussideinan\"\n    ],\n    \"DAY\": [\n      \"nad\\u012bli\",\n      \"panad\\u012bli\",\n      \"wisas\\u012bdis\",\n      \"pussisawaiti\",\n      \"ketwirtiks\",\n      \"p\\u0113ntniks\",\n      \"sabattika\"\n    ],\n    \"ERANAMES\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"rags\",\n      \"wassarins\",\n      \"p\\u016blis\",\n      \"sakkis\",\n      \"zallaws\",\n      \"s\\u012bmenis\",\n      \"l\\u012bpa\",\n      \"daggis\",\n      \"sillins\",\n      \"spallins\",\n      \"lapkr\\u016btis\",\n      \"sallaws\"\n    ],\n    \"SHORTDAY\": [\n      \"nad\",\n      \"pan\",\n      \"wis\",\n      \"pus\",\n      \"ket\",\n      \"p\\u0113n\",\n      \"sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"rag\",\n      \"was\",\n      \"p\\u016bl\",\n      \"sak\",\n      \"zal\",\n      \"s\\u012bm\",\n      \"l\\u012bp\",\n      \"dag\",\n      \"sil\",\n      \"spa\",\n      \"lap\",\n      \"sal\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"rags\",\n      \"wassarins\",\n      \"p\\u016blis\",\n      \"sakkis\",\n      \"zallaws\",\n      \"s\\u012bmenis\",\n      \"l\\u012bpa\",\n      \"daggis\",\n      \"sillins\",\n      \"spallins\",\n      \"lapkr\\u016btis\",\n      \"sallaws\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, y 'mettas' d. MMMM\",\n    \"longDate\": \"y 'mettas' d. MMMM\",\n    \"medium\": \"dd.MM 'st'. y HH:mm:ss\",\n    \"mediumDate\": \"dd.MM 'st'. y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"prg\",\n  \"localeID\": \"prg\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ps-af.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u063a.\\u0645.\",\n      \"\\u063a.\\u0648.\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0644\\u0647 \\u0645\\u06cc\\u0644\\u0627\\u062f \\u0685\\u062e\\u0647 \\u0648\\u0693\\u0627\\u0646\\u062f\\u06d0\",\n      \"\\u0644\\u0647 \\u0645\\u06cc\\u0644\\u0627\\u062f \\u0685\\u062e\\u0647 \\u0648\\u0631\\u0648\\u0633\\u062a\\u0647\"\n    ],\n    \"ERAS\": [\n      \"\\u0644\\u0647 \\u0645\\u06cc\\u0644\\u0627\\u062f \\u0648\\u0693\\u0627\\u0646\\u062f\\u06d0\",\n      \"\\u0645.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u064a\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cd\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06ab\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u064a\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cd\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06ab\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u064a\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cd\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06ab\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      3,\n      4\n    ],\n    \"fullDate\": \"EEEE \\u062f y \\u062f MMMM d\",\n    \"longDate\": \"\\u062f y \\u062f MMMM d\",\n    \"medium\": \"y MMM d H:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y/M/d H:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Af.\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ps-af\",\n  \"localeID\": \"ps_AF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ps.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u063a.\\u0645.\",\n      \"\\u063a.\\u0648.\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0644\\u0647 \\u0645\\u06cc\\u0644\\u0627\\u062f \\u0685\\u062e\\u0647 \\u0648\\u0693\\u0627\\u0646\\u062f\\u06d0\",\n      \"\\u0644\\u0647 \\u0645\\u06cc\\u0644\\u0627\\u062f \\u0685\\u062e\\u0647 \\u0648\\u0631\\u0648\\u0633\\u062a\\u0647\"\n    ],\n    \"ERAS\": [\n      \"\\u0644\\u0647 \\u0645\\u06cc\\u0644\\u0627\\u062f \\u0648\\u0693\\u0627\\u0646\\u062f\\u06d0\",\n      \"\\u0645.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u064a\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cd\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06ab\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u064a\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cd\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06ab\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u064a\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u064a\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cd\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06ab\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      3,\n      4\n    ],\n    \"fullDate\": \"EEEE \\u062f y \\u062f MMMM d\",\n    \"longDate\": \"\\u062f y \\u062f MMMM d\",\n    \"medium\": \"y MMM d H:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"y/M/d H:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Af.\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ps\",\n  \"localeID\": \"ps\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-ao.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Kz\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-ao\",\n  \"localeID\": \"pt_AO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-br.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"seg\",\n      \"ter\",\n      \"qua\",\n      \"qui\",\n      \"sex\",\n      \"s\\u00e1b\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d 'de' MMM 'de' y HH:mm:ss\",\n    \"mediumDate\": \"d 'de' MMM 'de' y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"pt-br\",\n  \"localeID\": \"pt_BR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-ch\",\n  \"localeID\": \"pt_CH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-cv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CVE\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-cv\",\n  \"localeID\": \"pt_CV\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-gq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-gq\",\n  \"localeID\": \"pt_GQ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-gw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-gw\",\n  \"localeID\": \"pt_GW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-lu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-lu\",\n  \"localeID\": \"pt_LU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-mo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y h:mm:ss a\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MOP\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-mo\",\n  \"localeID\": \"pt_MO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-mz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MTn\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-mz\",\n  \"localeID\": \"pt_MZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-pt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-pt\",\n  \"localeID\": \"pt_PT\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-st.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Db\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-st\",\n  \"localeID\": \"pt_ST\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt-tl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"da manh\\u00e3\",\n      \"da tarde\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"domingo\",\n      \"segunda\",\n      \"ter\\u00e7a\",\n      \"quarta\",\n      \"quinta\",\n      \"sexta\",\n      \"s\\u00e1bado\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"dd/MM/y HH:mm:ss\",\n    \"mediumDate\": \"dd/MM/y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"pt-tl\",\n  \"localeID\": \"pt_TL\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_pt.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"domingo\",\n      \"segunda-feira\",\n      \"ter\\u00e7a-feira\",\n      \"quarta-feira\",\n      \"quinta-feira\",\n      \"sexta-feira\",\n      \"s\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"antes de Cristo\",\n      \"depois de Cristo\"\n    ],\n    \"ERAS\": [\n      \"a.C.\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"SHORTDAY\": [\n      \"dom\",\n      \"seg\",\n      \"ter\",\n      \"qua\",\n      \"qui\",\n      \"sex\",\n      \"s\\u00e1b\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"fev\",\n      \"mar\",\n      \"abr\",\n      \"mai\",\n      \"jun\",\n      \"jul\",\n      \"ago\",\n      \"set\",\n      \"out\",\n      \"nov\",\n      \"dez\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janeiro\",\n      \"fevereiro\",\n      \"mar\\u00e7o\",\n      \"abril\",\n      \"maio\",\n      \"junho\",\n      \"julho\",\n      \"agosto\",\n      \"setembro\",\n      \"outubro\",\n      \"novembro\",\n      \"dezembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d 'de' MMM 'de' y HH:mm:ss\",\n    \"mediumDate\": \"d 'de' MMM 'de' y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R$\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"pt\",\n  \"localeID\": \"pt\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i >= 0 && i <= 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_qu-bo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Domingo\",\n      \"Lunes\",\n      \"Martes\",\n      \"Mi\\u00e9rcoles\",\n      \"Jueves\",\n      \"Viernes\",\n      \"S\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"SHORTDAY\": [\n      \"Dom\",\n      \"Lun\",\n      \"Mar\",\n      \"Mi\\u00e9\",\n      \"Jue\",\n      \"Vie\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Qul\",\n      \"Hat\",\n      \"Pau\",\n      \"Ayr\",\n      \"Aym\",\n      \"Int\",\n      \"Ant\",\n      \"Qha\",\n      \"Uma\",\n      \"Kan\",\n      \"Aya\",\n      \"Kap\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Bs\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"qu-bo\",\n  \"localeID\": \"qu_BO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_qu-ec.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Domingo\",\n      \"Lunes\",\n      \"Martes\",\n      \"Mi\\u00e9rcoles\",\n      \"Jueves\",\n      \"Viernes\",\n      \"S\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"SHORTDAY\": [\n      \"Dom\",\n      \"Lun\",\n      \"Mar\",\n      \"Mi\\u00e9\",\n      \"Jue\",\n      \"Vie\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Qul\",\n      \"Hat\",\n      \"Pau\",\n      \"Ayr\",\n      \"Aym\",\n      \"Int\",\n      \"Ant\",\n      \"Qha\",\n      \"Uma\",\n      \"Kan\",\n      \"Aya\",\n      \"Kap\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"qu-ec\",\n  \"localeID\": \"qu_EC\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_qu-pe.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Domingo\",\n      \"Lunes\",\n      \"Martes\",\n      \"Mi\\u00e9rcoles\",\n      \"Jueves\",\n      \"Viernes\",\n      \"S\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"SHORTDAY\": [\n      \"Dom\",\n      \"Lun\",\n      \"Mar\",\n      \"Mi\\u00e9\",\n      \"Jue\",\n      \"Vie\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Qul\",\n      \"Hat\",\n      \"Pau\",\n      \"Ayr\",\n      \"Aym\",\n      \"Int\",\n      \"Ant\",\n      \"Qha\",\n      \"Uma\",\n      \"Kan\",\n      \"Aya\",\n      \"Kap\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"S/.\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"qu-pe\",\n  \"localeID\": \"qu_PE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_qu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"Domingo\",\n      \"Lunes\",\n      \"Martes\",\n      \"Mi\\u00e9rcoles\",\n      \"Jueves\",\n      \"Viernes\",\n      \"S\\u00e1bado\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"d.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"SHORTDAY\": [\n      \"Dom\",\n      \"Lun\",\n      \"Mar\",\n      \"Mi\\u00e9\",\n      \"Jue\",\n      \"Vie\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Qul\",\n      \"Hat\",\n      \"Pau\",\n      \"Ayr\",\n      \"Aym\",\n      \"Int\",\n      \"Ant\",\n      \"Qha\",\n      \"Uma\",\n      \"Kan\",\n      \"Aya\",\n      \"Kap\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Qulla puquy\",\n      \"Hatun puquy\",\n      \"Pauqar waray\",\n      \"Ayriwa\",\n      \"Aymuray\",\n      \"Inti raymi\",\n      \"Anta Sitwa\",\n      \"Qhapaq Sitwa\",\n      \"Uma raymi\",\n      \"Kantaray\",\n      \"Ayamarq\\u02bca\",\n      \"Kapaq Raymi\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"S/.\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"qu\",\n  \"localeID\": \"qu\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rm-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dumengia\",\n      \"glindesdi\",\n      \"mardi\",\n      \"mesemna\",\n      \"gievgia\",\n      \"venderdi\",\n      \"sonda\"\n    ],\n    \"ERANAMES\": [\n      \"avant Cristus\",\n      \"suenter Cristus\"\n    ],\n    \"ERAS\": [\n      \"av. Cr.\",\n      \"s. Cr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"schaner\",\n      \"favrer\",\n      \"mars\",\n      \"avrigl\",\n      \"matg\",\n      \"zercladur\",\n      \"fanadur\",\n      \"avust\",\n      \"settember\",\n      \"october\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"du\",\n      \"gli\",\n      \"ma\",\n      \"me\",\n      \"gie\",\n      \"ve\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"schan.\",\n      \"favr.\",\n      \"mars\",\n      \"avr.\",\n      \"matg\",\n      \"zercl.\",\n      \"fan.\",\n      \"avust\",\n      \"sett.\",\n      \"oct.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"schaner\",\n      \"favrer\",\n      \"mars\",\n      \"avrigl\",\n      \"matg\",\n      \"zercladur\",\n      \"fanadur\",\n      \"avust\",\n      \"settember\",\n      \"october\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, 'ils' d 'da' MMMM y\",\n    \"longDate\": \"d 'da' MMMM y\",\n    \"medium\": \"dd-MM-y HH:mm:ss\",\n    \"mediumDate\": \"dd-MM-y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"rm-ch\",\n  \"localeID\": \"rm_CH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"dumengia\",\n      \"glindesdi\",\n      \"mardi\",\n      \"mesemna\",\n      \"gievgia\",\n      \"venderdi\",\n      \"sonda\"\n    ],\n    \"ERANAMES\": [\n      \"avant Cristus\",\n      \"suenter Cristus\"\n    ],\n    \"ERAS\": [\n      \"av. Cr.\",\n      \"s. Cr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"schaner\",\n      \"favrer\",\n      \"mars\",\n      \"avrigl\",\n      \"matg\",\n      \"zercladur\",\n      \"fanadur\",\n      \"avust\",\n      \"settember\",\n      \"october\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"du\",\n      \"gli\",\n      \"ma\",\n      \"me\",\n      \"gie\",\n      \"ve\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"schan.\",\n      \"favr.\",\n      \"mars\",\n      \"avr.\",\n      \"matg\",\n      \"zercl.\",\n      \"fan.\",\n      \"avust\",\n      \"sett.\",\n      \"oct.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"schaner\",\n      \"favrer\",\n      \"mars\",\n      \"avrigl\",\n      \"matg\",\n      \"zercladur\",\n      \"fanadur\",\n      \"avust\",\n      \"settember\",\n      \"october\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, 'ils' d 'da' MMMM y\",\n    \"longDate\": \"d 'da' MMMM y\",\n    \"medium\": \"dd-MM-y HH:mm:ss\",\n    \"mediumDate\": \"dd-MM-y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-yy HH:mm\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"rm\",\n  \"localeID\": \"rm\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rn-bi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Z.MU.\",\n      \"Z.MW.\"\n    ],\n    \"DAY\": [\n      \"Ku w\\u2019indwi\",\n      \"Ku wa mbere\",\n      \"Ku wa kabiri\",\n      \"Ku wa gatatu\",\n      \"Ku wa kane\",\n      \"Ku wa gatanu\",\n      \"Ku wa gatandatu\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Yezu\",\n      \"Nyuma ya Yezu\"\n    ],\n    \"ERAS\": [\n      \"Mb.Y.\",\n      \"Ny.Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Nzero\",\n      \"Ruhuhuma\",\n      \"Ntwarante\",\n      \"Ndamukiza\",\n      \"Rusama\",\n      \"Ruheshi\",\n      \"Mukakaro\",\n      \"Nyandagaro\",\n      \"Nyakanga\",\n      \"Gitugutu\",\n      \"Munyonyo\",\n      \"Kigarama\"\n    ],\n    \"SHORTDAY\": [\n      \"cu.\",\n      \"mbe.\",\n      \"kab.\",\n      \"gtu.\",\n      \"kan.\",\n      \"gnu.\",\n      \"gnd.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mut.\",\n      \"Gas.\",\n      \"Wer.\",\n      \"Mat.\",\n      \"Gic.\",\n      \"Kam.\",\n      \"Nya.\",\n      \"Kan.\",\n      \"Nze.\",\n      \"Ukw.\",\n      \"Ugu.\",\n      \"Uku.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Nzero\",\n      \"Ruhuhuma\",\n      \"Ntwarante\",\n      \"Ndamukiza\",\n      \"Rusama\",\n      \"Ruheshi\",\n      \"Mukakaro\",\n      \"Nyandagaro\",\n      \"Nyakanga\",\n      \"Gitugutu\",\n      \"Munyonyo\",\n      \"Kigarama\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FBu\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"rn-bi\",\n  \"localeID\": \"rn_BI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Z.MU.\",\n      \"Z.MW.\"\n    ],\n    \"DAY\": [\n      \"Ku w\\u2019indwi\",\n      \"Ku wa mbere\",\n      \"Ku wa kabiri\",\n      \"Ku wa gatatu\",\n      \"Ku wa kane\",\n      \"Ku wa gatanu\",\n      \"Ku wa gatandatu\"\n    ],\n    \"ERANAMES\": [\n      \"Mbere ya Yezu\",\n      \"Nyuma ya Yezu\"\n    ],\n    \"ERAS\": [\n      \"Mb.Y.\",\n      \"Ny.Y\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Nzero\",\n      \"Ruhuhuma\",\n      \"Ntwarante\",\n      \"Ndamukiza\",\n      \"Rusama\",\n      \"Ruheshi\",\n      \"Mukakaro\",\n      \"Nyandagaro\",\n      \"Nyakanga\",\n      \"Gitugutu\",\n      \"Munyonyo\",\n      \"Kigarama\"\n    ],\n    \"SHORTDAY\": [\n      \"cu.\",\n      \"mbe.\",\n      \"kab.\",\n      \"gtu.\",\n      \"kan.\",\n      \"gnu.\",\n      \"gnd.\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mut.\",\n      \"Gas.\",\n      \"Wer.\",\n      \"Mat.\",\n      \"Gic.\",\n      \"Kam.\",\n      \"Nya.\",\n      \"Kan.\",\n      \"Nze.\",\n      \"Ukw.\",\n      \"Ugu.\",\n      \"Uku.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Nzero\",\n      \"Ruhuhuma\",\n      \"Ntwarante\",\n      \"Ndamukiza\",\n      \"Rusama\",\n      \"Ruheshi\",\n      \"Mukakaro\",\n      \"Nyandagaro\",\n      \"Nyakanga\",\n      \"Gitugutu\",\n      \"Munyonyo\",\n      \"Kigarama\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FBu\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"rn\",\n  \"localeID\": \"rn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ro-md.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"duminic\\u0103\",\n      \"luni\",\n      \"mar\\u021bi\",\n      \"miercuri\",\n      \"joi\",\n      \"vineri\",\n      \"s\\u00e2mb\\u0103t\\u0103\"\n    ],\n    \"ERANAMES\": [\n      \"\\u00eenainte de Hristos\",\n      \"dup\\u0103 Hristos\"\n    ],\n    \"ERAS\": [\n      \"\\u00ee.Hr.\",\n      \"d.Hr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"SHORTDAY\": [\n      \"Dum\",\n      \"Lun\",\n      \"Mar\",\n      \"Mie\",\n      \"Joi\",\n      \"Vin\",\n      \"S\\u00e2m\"\n    ],\n    \"SHORTMONTH\": [\n      \"ian.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"iun.\",\n      \"iul.\",\n      \"aug.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MDL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ro-md\",\n  \"localeID\": \"ro_MD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v != 0 || n == 0 || n != 1 && n % 100 >= 1 && n % 100 <= 19) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ro-ro.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"duminic\\u0103\",\n      \"luni\",\n      \"mar\\u021bi\",\n      \"miercuri\",\n      \"joi\",\n      \"vineri\",\n      \"s\\u00e2mb\\u0103t\\u0103\"\n    ],\n    \"ERANAMES\": [\n      \"\\u00eenainte de Hristos\",\n      \"dup\\u0103 Hristos\"\n    ],\n    \"ERAS\": [\n      \"\\u00ee.Hr.\",\n      \"d.Hr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"SHORTDAY\": [\n      \"dum.\",\n      \"lun.\",\n      \"mar.\",\n      \"mie.\",\n      \"joi\",\n      \"vin.\",\n      \"s\\u00e2m.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ian.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"iun.\",\n      \"iul.\",\n      \"aug.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RON\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ro-ro\",\n  \"localeID\": \"ro_RO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v != 0 || n == 0 || n != 1 && n % 100 >= 1 && n % 100 <= 19) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ro.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"a.m.\",\n      \"p.m.\"\n    ],\n    \"DAY\": [\n      \"duminic\\u0103\",\n      \"luni\",\n      \"mar\\u021bi\",\n      \"miercuri\",\n      \"joi\",\n      \"vineri\",\n      \"s\\u00e2mb\\u0103t\\u0103\"\n    ],\n    \"ERANAMES\": [\n      \"\\u00eenainte de Hristos\",\n      \"dup\\u0103 Hristos\"\n    ],\n    \"ERAS\": [\n      \"\\u00ee.Hr.\",\n      \"d.Hr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"SHORTDAY\": [\n      \"dum.\",\n      \"lun.\",\n      \"mar.\",\n      \"mie.\",\n      \"joi\",\n      \"vin.\",\n      \"s\\u00e2m.\"\n    ],\n    \"SHORTMONTH\": [\n      \"ian.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"mai\",\n      \"iun.\",\n      \"iul.\",\n      \"aug.\",\n      \"sept.\",\n      \"oct.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"ianuarie\",\n      \"februarie\",\n      \"martie\",\n      \"aprilie\",\n      \"mai\",\n      \"iunie\",\n      \"iulie\",\n      \"august\",\n      \"septembrie\",\n      \"octombrie\",\n      \"noiembrie\",\n      \"decembrie\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RON\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ro\",\n  \"localeID\": \"ro\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v != 0 || n == 0 || n != 1 && n % 100 >= 1 && n % 100 <= 19) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rof-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"kang\\u2019ama\",\n      \"kingoto\"\n    ],\n    \"DAY\": [\n      \"Ijumapili\",\n      \"Ijumatatu\",\n      \"Ijumanne\",\n      \"Ijumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Ijumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Mayesu\",\n      \"Baada ya Mayesu\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"BM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mweri wa kwanza\",\n      \"Mweri wa kaili\",\n      \"Mweri wa katatu\",\n      \"Mweri wa kaana\",\n      \"Mweri wa tanu\",\n      \"Mweri wa sita\",\n      \"Mweri wa saba\",\n      \"Mweri wa nane\",\n      \"Mweri wa tisa\",\n      \"Mweri wa ikumi\",\n      \"Mweri wa ikumi na moja\",\n      \"Mweri wa ikumi na mbili\"\n    ],\n    \"SHORTDAY\": [\n      \"Ijp\",\n      \"Ijt\",\n      \"Ijn\",\n      \"Ijtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Ijm\"\n    ],\n    \"SHORTMONTH\": [\n      \"M1\",\n      \"M2\",\n      \"M3\",\n      \"M4\",\n      \"M5\",\n      \"M6\",\n      \"M7\",\n      \"M8\",\n      \"M9\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mweri wa kwanza\",\n      \"Mweri wa kaili\",\n      \"Mweri wa katatu\",\n      \"Mweri wa kaana\",\n      \"Mweri wa tanu\",\n      \"Mweri wa sita\",\n      \"Mweri wa saba\",\n      \"Mweri wa nane\",\n      \"Mweri wa tisa\",\n      \"Mweri wa ikumi\",\n      \"Mweri wa ikumi na moja\",\n      \"Mweri wa ikumi na mbili\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"rof-tz\",\n  \"localeID\": \"rof_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rof.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"kang\\u2019ama\",\n      \"kingoto\"\n    ],\n    \"DAY\": [\n      \"Ijumapili\",\n      \"Ijumatatu\",\n      \"Ijumanne\",\n      \"Ijumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Ijumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Mayesu\",\n      \"Baada ya Mayesu\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"BM\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mweri wa kwanza\",\n      \"Mweri wa kaili\",\n      \"Mweri wa katatu\",\n      \"Mweri wa kaana\",\n      \"Mweri wa tanu\",\n      \"Mweri wa sita\",\n      \"Mweri wa saba\",\n      \"Mweri wa nane\",\n      \"Mweri wa tisa\",\n      \"Mweri wa ikumi\",\n      \"Mweri wa ikumi na moja\",\n      \"Mweri wa ikumi na mbili\"\n    ],\n    \"SHORTDAY\": [\n      \"Ijp\",\n      \"Ijt\",\n      \"Ijn\",\n      \"Ijtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Ijm\"\n    ],\n    \"SHORTMONTH\": [\n      \"M1\",\n      \"M2\",\n      \"M3\",\n      \"M4\",\n      \"M5\",\n      \"M6\",\n      \"M7\",\n      \"M8\",\n      \"M9\",\n      \"M10\",\n      \"M11\",\n      \"M12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mweri wa kwanza\",\n      \"Mweri wa kaili\",\n      \"Mweri wa katatu\",\n      \"Mweri wa kaana\",\n      \"Mweri wa tanu\",\n      \"Mweri wa sita\",\n      \"Mweri wa saba\",\n      \"Mweri wa nane\",\n      \"Mweri wa tisa\",\n      \"Mweri wa ikumi\",\n      \"Mweri wa ikumi na moja\",\n      \"Mweri wa ikumi na mbili\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"rof\",\n  \"localeID\": \"rof\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ru-by.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u0432\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u043e\\u0442 \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u044d.\",\n      \"\\u043d. \\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d\\u044f\",\n      \"\\u0438\\u044e\\u043b\\u044f\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0432\\u0441\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432\\u0440.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f\\u0431.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d MMM y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.y H:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"BYN\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ru-by\",\n  \"localeID\": \"ru_BY\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ru-kg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u0432\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u043e\\u0442 \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u044d.\",\n      \"\\u043d. \\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d\\u044f\",\n      \"\\u0438\\u044e\\u043b\\u044f\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0432\\u0441\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432\\u0440.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f\\u0431.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d MMM y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.y H:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KGS\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ru-kg\",\n  \"localeID\": \"ru_KG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ru-kz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u0432\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u043e\\u0442 \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u044d.\",\n      \"\\u043d. \\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d\\u044f\",\n      \"\\u0438\\u044e\\u043b\\u044f\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0432\\u0441\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432\\u0440.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f\\u0431.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d MMM y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.y H:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b8\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ru-kz\",\n  \"localeID\": \"ru_KZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ru-md.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u0432\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u043e\\u0442 \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u044d.\",\n      \"\\u043d. \\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d\\u044f\",\n      \"\\u0438\\u044e\\u043b\\u044f\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0432\\u0441\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432\\u0440.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f\\u0431.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d MMM y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.y H:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MDL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ru-md\",\n  \"localeID\": \"ru_MD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ru-ru.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u0432\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u043e\\u0442 \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u044d.\",\n      \"\\u043d. \\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d\\u044f\",\n      \"\\u0438\\u044e\\u043b\\u044f\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0432\\u0441\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432\\u0440.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f\\u0431.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d MMM y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.y H:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ru-ru\",\n  \"localeID\": \"ru_RU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ru-ua.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0432\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u043e\\u0442 \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u044d.\",\n      \"\\u043d. \\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d\\u044f\",\n      \"\\u0438\\u044e\\u043b\\u044f\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0432\\u0441\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432\\u0440.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f\\u0431.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d MMM y '\\u0433'. HH:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0433'.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u0433\\u0440\\u043d.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ru-ua\",\n  \"localeID\": \"ru_UA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ru.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0414\\u041f\",\n      \"\\u041f\\u041f\"\n    ],\n    \"DAY\": [\n      \"\\u0432\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\",\n      \"\\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\",\n      \"\\u043f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\",\n      \"\\u0441\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\",\n      \"\\u043e\\u0442 \\u0420\\u043e\\u0436\\u0434\\u0435\\u0441\\u0442\\u0432\\u0430 \\u0425\\u0440\\u0438\\u0441\\u0442\\u043e\\u0432\\u0430\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u044d.\",\n      \"\\u043d. \\u044d.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u0440\\u0442\\u0430\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d\\u044f\",\n      \"\\u0438\\u044e\\u043b\\u044f\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0432\\u0441\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432.\",\n      \"\\u0444\\u0435\\u0432\\u0440.\",\n      \"\\u043c\\u0430\\u0440.\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u044f\",\n      \"\\u0438\\u044e\\u043d.\",\n      \"\\u0438\\u044e\\u043b.\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043d\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u044f\\u0431.\",\n      \"\\u0434\\u0435\\u043a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\\u044c\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\\u044c\",\n      \"\\u0438\\u044e\\u043b\\u044c\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\\u044c\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0433'.\",\n    \"longDate\": \"d MMMM y '\\u0433'.\",\n    \"medium\": \"d MMM y '\\u0433'. H:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0433'.\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"dd.MM.y H:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ru\",\n  \"localeID\": \"ru\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rw-rw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Ku cyumweru\",\n      \"Kuwa mbere\",\n      \"Kuwa kabiri\",\n      \"Kuwa gatatu\",\n      \"Kuwa kane\",\n      \"Kuwa gatanu\",\n      \"Kuwa gatandatu\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mutarama\",\n      \"Gashyantare\",\n      \"Werurwe\",\n      \"Mata\",\n      \"Gicuransi\",\n      \"Kamena\",\n      \"Nyakanga\",\n      \"Kanama\",\n      \"Nzeli\",\n      \"Ukwakira\",\n      \"Ugushyingo\",\n      \"Ukuboza\"\n    ],\n    \"SHORTDAY\": [\n      \"cyu.\",\n      \"mbe.\",\n      \"kab.\",\n      \"gtu.\",\n      \"kan.\",\n      \"gnu.\",\n      \"gnd.\"\n    ],\n    \"SHORTMONTH\": [\n      \"mut.\",\n      \"gas.\",\n      \"wer.\",\n      \"mat.\",\n      \"gic.\",\n      \"kam.\",\n      \"nya.\",\n      \"kan.\",\n      \"nze.\",\n      \"ukw.\",\n      \"ugu.\",\n      \"uku.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mutarama\",\n      \"Gashyantare\",\n      \"Werurwe\",\n      \"Mata\",\n      \"Gicuransi\",\n      \"Kamena\",\n      \"Nyakanga\",\n      \"Kanama\",\n      \"Nzeli\",\n      \"Ukwakira\",\n      \"Ugushyingo\",\n      \"Ukuboza\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"rw-rw\",\n  \"localeID\": \"rw_RW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Ku cyumweru\",\n      \"Kuwa mbere\",\n      \"Kuwa kabiri\",\n      \"Kuwa gatatu\",\n      \"Kuwa kane\",\n      \"Kuwa gatanu\",\n      \"Kuwa gatandatu\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mutarama\",\n      \"Gashyantare\",\n      \"Werurwe\",\n      \"Mata\",\n      \"Gicuransi\",\n      \"Kamena\",\n      \"Nyakanga\",\n      \"Kanama\",\n      \"Nzeli\",\n      \"Ukwakira\",\n      \"Ugushyingo\",\n      \"Ukuboza\"\n    ],\n    \"SHORTDAY\": [\n      \"cyu.\",\n      \"mbe.\",\n      \"kab.\",\n      \"gtu.\",\n      \"kan.\",\n      \"gnu.\",\n      \"gnd.\"\n    ],\n    \"SHORTMONTH\": [\n      \"mut.\",\n      \"gas.\",\n      \"wer.\",\n      \"mat.\",\n      \"gic.\",\n      \"kam.\",\n      \"nya.\",\n      \"kan.\",\n      \"nze.\",\n      \"ukw.\",\n      \"ugu.\",\n      \"uku.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mutarama\",\n      \"Gashyantare\",\n      \"Werurwe\",\n      \"Mata\",\n      \"Gicuransi\",\n      \"Kamena\",\n      \"Nyakanga\",\n      \"Kanama\",\n      \"Nzeli\",\n      \"Ukwakira\",\n      \"Ugushyingo\",\n      \"Ukuboza\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"rw\",\n  \"localeID\": \"rw\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rwk-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"utuko\",\n      \"kyiukonyi\"\n    ],\n    \"DAY\": [\n      \"Jumapilyi\",\n      \"Jumatatuu\",\n      \"Jumanne\",\n      \"Jumatanu\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristu\",\n      \"Baada ya Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"rwk-tz\",\n  \"localeID\": \"rwk_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_rwk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"utuko\",\n      \"kyiukonyi\"\n    ],\n    \"DAY\": [\n      \"Jumapilyi\",\n      \"Jumatatuu\",\n      \"Jumanne\",\n      \"Jumatanu\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristu\",\n      \"Baada ya Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"rwk\",\n  \"localeID\": \"rwk\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sah-ru.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u042d\\u0418\",\n      \"\\u042d\\u041a\"\n    ],\n    \"DAY\": [\n      \"\\u0431\\u0430\\u0441\\u043a\\u044b\\u04bb\\u044b\\u0430\\u043d\\u043d\\u044c\\u0430\",\n      \"\\u0431\\u044d\\u043d\\u0438\\u0434\\u0438\\u044d\\u043d\\u043d\\u044c\\u0438\\u043a\",\n      \"\\u043e\\u043f\\u0442\\u0443\\u043e\\u0440\\u0443\\u043d\\u043d\\u044c\\u0443\\u043a\",\n      \"\\u0441\\u044d\\u0440\\u044d\\u0434\\u044d\",\n      \"\\u0447\\u044d\\u043f\\u043f\\u0438\\u044d\\u0440\",\n      \"\\u0411\\u044d\\u044d\\u0442\\u0438\\u04a5\\u0441\\u044d\",\n      \"\\u0441\\u0443\\u0431\\u0443\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0431. \\u044d. \\u0438.\",\n      \"\\u0431. \\u044d\"\n    ],\n    \"ERAS\": [\n      \"\\u0431. \\u044d. \\u0438.\",\n      \"\\u0431. \\u044d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0422\\u043e\\u0445\\u0441\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u041e\\u043b\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u041a\\u0443\\u043b\\u0443\\u043d \\u0442\\u0443\\u0442\\u0430\\u0440\",\n      \"\\u041c\\u0443\\u0443\\u0441 \\u0443\\u0441\\u0442\\u0430\\u0440\",\n      \"\\u042b\\u0430\\u043c \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0411\\u044d\\u0441 \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u041e\\u0442 \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0410\\u0442\\u044b\\u0440\\u0434\\u044c\\u044b\\u0445 \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0411\\u0430\\u043b\\u0430\\u0495\\u0430\\u043d \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0410\\u043b\\u0442\\u044b\\u043d\\u043d\\u044c\\u044b\",\n      \"\\u0421\\u044d\\u0442\\u0438\\u043d\\u043d\\u044c\\u0438\",\n      \"\\u0430\\u0445\\u0441\\u044b\\u043d\\u043d\\u044c\\u044b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0431\\u0441\",\n      \"\\u0431\\u043d\",\n      \"\\u043e\\u043f\",\n      \"\\u0441\\u044d\",\n      \"\\u0447\\u043f\",\n      \"\\u0431\\u044d\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0422\\u043e\\u0445\\u0441\",\n      \"\\u041e\\u043b\\u0443\\u043d\",\n      \"\\u041a\\u043b\\u043d\",\n      \"\\u041c\\u0441\\u0443\",\n      \"\\u042b\\u0430\\u043c\",\n      \"\\u0411\\u044d\\u0441\",\n      \"\\u041e\\u0442\\u0439\",\n      \"\\u0410\\u0442\\u0440\",\n      \"\\u0411\\u043b\\u0495\",\n      \"\\u0410\\u043b\\u0442\",\n      \"\\u0421\\u044d\\u0442\",\n      \"\\u0410\\u0445\\u0441\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0442\\u043e\\u0445\\u0441\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u043e\\u043b\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u043a\\u0443\\u043b\\u0443\\u043d \\u0442\\u0443\\u0442\\u0430\\u0440\",\n      \"\\u043c\\u0443\\u0443\\u0441 \\u0443\\u0441\\u0442\\u0430\\u0440\",\n      \"\\u044b\\u0430\\u043c \\u044b\\u0439\\u0430\",\n      \"\\u0431\\u044d\\u0441 \\u044b\\u0439\\u0430\",\n      \"\\u043e\\u0442 \\u044b\\u0439\\u0430\",\n      \"\\u0430\\u0442\\u044b\\u0440\\u0434\\u044c\\u044b\\u0445 \\u044b\\u0439\\u0430\",\n      \"\\u0431\\u0430\\u043b\\u0430\\u0495\\u0430\\u043d \\u044b\\u0439\\u0430\",\n      \"\\u0430\\u043b\\u0442\\u044b\\u043d\\u043d\\u044c\\u044b\",\n      \"\\u0441\\u044d\\u0442\\u0438\\u043d\\u043d\\u044c\\u0438\",\n      \"\\u0430\\u0445\\u0441\\u044b\\u043d\\u043d\\u044c\\u044b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y '\\u0441\\u044b\\u043b' MMMM d '\\u043a\\u04af\\u043d\\u044d', EEEE\",\n    \"longDate\": \"y, MMMM d\",\n    \"medium\": \"y, MMM d HH:mm:ss\",\n    \"mediumDate\": \"y, MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yy/M/d HH:mm\",\n    \"shortDate\": \"yy/M/d\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sah-ru\",\n  \"localeID\": \"sah_RU\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sah.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u042d\\u0418\",\n      \"\\u042d\\u041a\"\n    ],\n    \"DAY\": [\n      \"\\u0431\\u0430\\u0441\\u043a\\u044b\\u04bb\\u044b\\u0430\\u043d\\u043d\\u044c\\u0430\",\n      \"\\u0431\\u044d\\u043d\\u0438\\u0434\\u0438\\u044d\\u043d\\u043d\\u044c\\u0438\\u043a\",\n      \"\\u043e\\u043f\\u0442\\u0443\\u043e\\u0440\\u0443\\u043d\\u043d\\u044c\\u0443\\u043a\",\n      \"\\u0441\\u044d\\u0440\\u044d\\u0434\\u044d\",\n      \"\\u0447\\u044d\\u043f\\u043f\\u0438\\u044d\\u0440\",\n      \"\\u0411\\u044d\\u044d\\u0442\\u0438\\u04a5\\u0441\\u044d\",\n      \"\\u0441\\u0443\\u0431\\u0443\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0431. \\u044d. \\u0438.\",\n      \"\\u0431. \\u044d\"\n    ],\n    \"ERAS\": [\n      \"\\u0431. \\u044d. \\u0438.\",\n      \"\\u0431. \\u044d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0422\\u043e\\u0445\\u0441\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u041e\\u043b\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u041a\\u0443\\u043b\\u0443\\u043d \\u0442\\u0443\\u0442\\u0430\\u0440\",\n      \"\\u041c\\u0443\\u0443\\u0441 \\u0443\\u0441\\u0442\\u0430\\u0440\",\n      \"\\u042b\\u0430\\u043c \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0411\\u044d\\u0441 \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u041e\\u0442 \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0410\\u0442\\u044b\\u0440\\u0434\\u044c\\u044b\\u0445 \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0411\\u0430\\u043b\\u0430\\u0495\\u0430\\u043d \\u044b\\u0439\\u044b\\u043d\",\n      \"\\u0410\\u043b\\u0442\\u044b\\u043d\\u043d\\u044c\\u044b\",\n      \"\\u0421\\u044d\\u0442\\u0438\\u043d\\u043d\\u044c\\u0438\",\n      \"\\u0430\\u0445\\u0441\\u044b\\u043d\\u043d\\u044c\\u044b\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0431\\u0441\",\n      \"\\u0431\\u043d\",\n      \"\\u043e\\u043f\",\n      \"\\u0441\\u044d\",\n      \"\\u0447\\u043f\",\n      \"\\u0431\\u044d\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0422\\u043e\\u0445\\u0441\",\n      \"\\u041e\\u043b\\u0443\\u043d\",\n      \"\\u041a\\u043b\\u043d\",\n      \"\\u041c\\u0441\\u0443\",\n      \"\\u042b\\u0430\\u043c\",\n      \"\\u0411\\u044d\\u0441\",\n      \"\\u041e\\u0442\\u0439\",\n      \"\\u0410\\u0442\\u0440\",\n      \"\\u0411\\u043b\\u0495\",\n      \"\\u0410\\u043b\\u0442\",\n      \"\\u0421\\u044d\\u0442\",\n      \"\\u0410\\u0445\\u0441\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0442\\u043e\\u0445\\u0441\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u043e\\u043b\\u0443\\u043d\\u043d\\u044c\\u0443\",\n      \"\\u043a\\u0443\\u043b\\u0443\\u043d \\u0442\\u0443\\u0442\\u0430\\u0440\",\n      \"\\u043c\\u0443\\u0443\\u0441 \\u0443\\u0441\\u0442\\u0430\\u0440\",\n      \"\\u044b\\u0430\\u043c \\u044b\\u0439\\u0430\",\n      \"\\u0431\\u044d\\u0441 \\u044b\\u0439\\u0430\",\n      \"\\u043e\\u0442 \\u044b\\u0439\\u0430\",\n      \"\\u0430\\u0442\\u044b\\u0440\\u0434\\u044c\\u044b\\u0445 \\u044b\\u0439\\u0430\",\n      \"\\u0431\\u0430\\u043b\\u0430\\u0495\\u0430\\u043d \\u044b\\u0439\\u0430\",\n      \"\\u0430\\u043b\\u0442\\u044b\\u043d\\u043d\\u044c\\u044b\",\n      \"\\u0441\\u044d\\u0442\\u0438\\u043d\\u043d\\u044c\\u0438\",\n      \"\\u0430\\u0445\\u0441\\u044b\\u043d\\u043d\\u044c\\u044b\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y '\\u0441\\u044b\\u043b' MMMM d '\\u043a\\u04af\\u043d\\u044d', EEEE\",\n    \"longDate\": \"y, MMMM d\",\n    \"medium\": \"y, MMM d HH:mm:ss\",\n    \"mediumDate\": \"y, MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"yy/M/d HH:mm\",\n    \"shortDate\": \"yy/M/d\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20bd\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sah\",\n  \"localeID\": \"sah\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_saq-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Tesiran\",\n      \"Teipa\"\n    ],\n    \"DAY\": [\n      \"Mderot ee are\",\n      \"Mderot ee kuni\",\n      \"Mderot ee ong\\u2019wan\",\n      \"Mderot ee inet\",\n      \"Mderot ee ile\",\n      \"Mderot ee sapa\",\n      \"Mderot ee kwe\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Christo\",\n      \"Baada ya Christo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Lapa le obo\",\n      \"Lapa le waare\",\n      \"Lapa le okuni\",\n      \"Lapa le ong\\u2019wan\",\n      \"Lapa le imet\",\n      \"Lapa le ile\",\n      \"Lapa le sapa\",\n      \"Lapa le isiet\",\n      \"Lapa le saal\",\n      \"Lapa le tomon\",\n      \"Lapa le tomon obo\",\n      \"Lapa le tomon waare\"\n    ],\n    \"SHORTDAY\": [\n      \"Are\",\n      \"Kun\",\n      \"Ong\",\n      \"Ine\",\n      \"Ile\",\n      \"Sap\",\n      \"Kwe\"\n    ],\n    \"SHORTMONTH\": [\n      \"Obo\",\n      \"Waa\",\n      \"Oku\",\n      \"Ong\",\n      \"Ime\",\n      \"Ile\",\n      \"Sap\",\n      \"Isi\",\n      \"Saa\",\n      \"Tom\",\n      \"Tob\",\n      \"Tow\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Lapa le obo\",\n      \"Lapa le waare\",\n      \"Lapa le okuni\",\n      \"Lapa le ong\\u2019wan\",\n      \"Lapa le imet\",\n      \"Lapa le ile\",\n      \"Lapa le sapa\",\n      \"Lapa le isiet\",\n      \"Lapa le saal\",\n      \"Lapa le tomon\",\n      \"Lapa le tomon obo\",\n      \"Lapa le tomon waare\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"saq-ke\",\n  \"localeID\": \"saq_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_saq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Tesiran\",\n      \"Teipa\"\n    ],\n    \"DAY\": [\n      \"Mderot ee are\",\n      \"Mderot ee kuni\",\n      \"Mderot ee ong\\u2019wan\",\n      \"Mderot ee inet\",\n      \"Mderot ee ile\",\n      \"Mderot ee sapa\",\n      \"Mderot ee kwe\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Christo\",\n      \"Baada ya Christo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Lapa le obo\",\n      \"Lapa le waare\",\n      \"Lapa le okuni\",\n      \"Lapa le ong\\u2019wan\",\n      \"Lapa le imet\",\n      \"Lapa le ile\",\n      \"Lapa le sapa\",\n      \"Lapa le isiet\",\n      \"Lapa le saal\",\n      \"Lapa le tomon\",\n      \"Lapa le tomon obo\",\n      \"Lapa le tomon waare\"\n    ],\n    \"SHORTDAY\": [\n      \"Are\",\n      \"Kun\",\n      \"Ong\",\n      \"Ine\",\n      \"Ile\",\n      \"Sap\",\n      \"Kwe\"\n    ],\n    \"SHORTMONTH\": [\n      \"Obo\",\n      \"Waa\",\n      \"Oku\",\n      \"Ong\",\n      \"Ime\",\n      \"Ile\",\n      \"Sap\",\n      \"Isi\",\n      \"Saa\",\n      \"Tom\",\n      \"Tob\",\n      \"Tow\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Lapa le obo\",\n      \"Lapa le waare\",\n      \"Lapa le okuni\",\n      \"Lapa le ong\\u2019wan\",\n      \"Lapa le imet\",\n      \"Lapa le ile\",\n      \"Lapa le sapa\",\n      \"Lapa le isiet\",\n      \"Lapa le saal\",\n      \"Lapa le tomon\",\n      \"Lapa le tomon obo\",\n      \"Lapa le tomon waare\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"saq\",\n  \"localeID\": \"saq\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sbp-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Lwamilawu\",\n      \"Pashamihe\"\n    ],\n    \"DAY\": [\n      \"Mulungu\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alahamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Ashanali uKilisito\",\n      \"Pamwandi ya Kilisto\"\n    ],\n    \"ERAS\": [\n      \"AK\",\n      \"PK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mupalangulwa\",\n      \"Mwitope\",\n      \"Mushende\",\n      \"Munyi\",\n      \"Mushende Magali\",\n      \"Mujimbi\",\n      \"Mushipepo\",\n      \"Mupuguto\",\n      \"Munyense\",\n      \"Mokhu\",\n      \"Musongandembwe\",\n      \"Muhaano\"\n    ],\n    \"SHORTDAY\": [\n      \"Mul\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mup\",\n      \"Mwi\",\n      \"Msh\",\n      \"Mun\",\n      \"Mag\",\n      \"Muj\",\n      \"Msp\",\n      \"Mpg\",\n      \"Mye\",\n      \"Mok\",\n      \"Mus\",\n      \"Muh\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mupalangulwa\",\n      \"Mwitope\",\n      \"Mushende\",\n      \"Munyi\",\n      \"Mushende Magali\",\n      \"Mujimbi\",\n      \"Mushipepo\",\n      \"Mupuguto\",\n      \"Munyense\",\n      \"Mokhu\",\n      \"Musongandembwe\",\n      \"Muhaano\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sbp-tz\",\n  \"localeID\": \"sbp_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sbp.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Lwamilawu\",\n      \"Pashamihe\"\n    ],\n    \"DAY\": [\n      \"Mulungu\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alahamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Ashanali uKilisito\",\n      \"Pamwandi ya Kilisto\"\n    ],\n    \"ERAS\": [\n      \"AK\",\n      \"PK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Mupalangulwa\",\n      \"Mwitope\",\n      \"Mushende\",\n      \"Munyi\",\n      \"Mushende Magali\",\n      \"Mujimbi\",\n      \"Mushipepo\",\n      \"Mupuguto\",\n      \"Munyense\",\n      \"Mokhu\",\n      \"Musongandembwe\",\n      \"Muhaano\"\n    ],\n    \"SHORTDAY\": [\n      \"Mul\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Mup\",\n      \"Mwi\",\n      \"Msh\",\n      \"Mun\",\n      \"Mag\",\n      \"Muj\",\n      \"Msp\",\n      \"Mpg\",\n      \"Mye\",\n      \"Mok\",\n      \"Mus\",\n      \"Muh\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Mupalangulwa\",\n      \"Mwitope\",\n      \"Mushende\",\n      \"Munyi\",\n      \"Mushende Magali\",\n      \"Mujimbi\",\n      \"Mushipepo\",\n      \"Mupuguto\",\n      \"Munyense\",\n      \"Mokhu\",\n      \"Musongandembwe\",\n      \"Muhaano\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sbp\",\n  \"localeID\": \"sbp\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_se-fi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"i\\u0111itbeaivet\",\n      \"eahketbeaivet\"\n    ],\n    \"DAY\": [\n      \"sotnabeaivi\",\n      \"vuoss\\u00e1rgga\",\n      \"ma\\u014b\\u014beb\\u00e1rgga\",\n      \"gaskavahku\",\n      \"duorastaga\",\n      \"bearjadaga\",\n      \"l\\u00e1vvardaga\"\n    ],\n    \"ERANAMES\": [\n      \"ovdal Kristtusa\",\n      \"ma\\u014b\\u014bel Kristtusa\"\n    ],\n    \"ERAS\": [\n      \"o.Kr.\",\n      \"m.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"SHORTDAY\": [\n      \"sotn\",\n      \"vuos\",\n      \"ma\\u014b\",\n      \"gask\",\n      \"duor\",\n      \"bear\",\n      \"l\\u00e1v\"\n    ],\n    \"SHORTMONTH\": [\n      \"o\\u0111\\u0111j\",\n      \"guov\",\n      \"njuk\",\n      \"cuo\",\n      \"mies\",\n      \"geas\",\n      \"suoi\",\n      \"borg\",\n      \"\\u010dak\\u010d\",\n      \"golg\",\n      \"sk\\u00e1b\",\n      \"juov\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"se-fi\",\n  \"localeID\": \"se_FI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_se-no.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"i\\u0111itbeaivet\",\n      \"eahketbeaivet\"\n    ],\n    \"DAY\": [\n      \"sotnabeaivi\",\n      \"vuoss\\u00e1rga\",\n      \"ma\\u014b\\u014beb\\u00e1rga\",\n      \"gaskavahkku\",\n      \"duorasdat\",\n      \"bearjadat\",\n      \"l\\u00e1vvardat\"\n    ],\n    \"ERANAMES\": [\n      \"ovdal Kristtusa\",\n      \"ma\\u014b\\u014bel Kristtusa\"\n    ],\n    \"ERAS\": [\n      \"o.Kr.\",\n      \"m.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"SHORTDAY\": [\n      \"sotn\",\n      \"vuos\",\n      \"ma\\u014b\",\n      \"gask\",\n      \"duor\",\n      \"bear\",\n      \"l\\u00e1v\"\n    ],\n    \"SHORTMONTH\": [\n      \"o\\u0111\\u0111j\",\n      \"guov\",\n      \"njuk\",\n      \"cuo\",\n      \"mies\",\n      \"geas\",\n      \"suoi\",\n      \"borg\",\n      \"\\u010dak\\u010d\",\n      \"golg\",\n      \"sk\\u00e1b\",\n      \"juov\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"se-no\",\n  \"localeID\": \"se_NO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_se-se.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"i\\u0111itbeaivet\",\n      \"eahketbeaivet\"\n    ],\n    \"DAY\": [\n      \"sotnabeaivi\",\n      \"vuoss\\u00e1rga\",\n      \"ma\\u014b\\u014beb\\u00e1rga\",\n      \"gaskavahkku\",\n      \"duorasdat\",\n      \"bearjadat\",\n      \"l\\u00e1vvardat\"\n    ],\n    \"ERANAMES\": [\n      \"ovdal Kristtusa\",\n      \"ma\\u014b\\u014bel Kristtusa\"\n    ],\n    \"ERAS\": [\n      \"o.Kr.\",\n      \"m.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"SHORTDAY\": [\n      \"sotn\",\n      \"vuos\",\n      \"ma\\u014b\",\n      \"gask\",\n      \"duor\",\n      \"bear\",\n      \"l\\u00e1v\"\n    ],\n    \"SHORTMONTH\": [\n      \"o\\u0111\\u0111j\",\n      \"guov\",\n      \"njuk\",\n      \"cuo\",\n      \"mies\",\n      \"geas\",\n      \"suoi\",\n      \"borg\",\n      \"\\u010dak\\u010d\",\n      \"golg\",\n      \"sk\\u00e1b\",\n      \"juov\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"se-se\",\n  \"localeID\": \"se_SE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_se.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"i\\u0111itbeaivet\",\n      \"eahketbeaivet\"\n    ],\n    \"DAY\": [\n      \"sotnabeaivi\",\n      \"vuoss\\u00e1rga\",\n      \"ma\\u014b\\u014beb\\u00e1rga\",\n      \"gaskavahkku\",\n      \"duorasdat\",\n      \"bearjadat\",\n      \"l\\u00e1vvardat\"\n    ],\n    \"ERANAMES\": [\n      \"ovdal Kristtusa\",\n      \"ma\\u014b\\u014bel Kristtusa\"\n    ],\n    \"ERAS\": [\n      \"o.Kr.\",\n      \"m.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"SHORTDAY\": [\n      \"sotn\",\n      \"vuos\",\n      \"ma\\u014b\",\n      \"gask\",\n      \"duor\",\n      \"bear\",\n      \"l\\u00e1v\"\n    ],\n    \"SHORTMONTH\": [\n      \"o\\u0111\\u0111j\",\n      \"guov\",\n      \"njuk\",\n      \"cuo\",\n      \"mies\",\n      \"geas\",\n      \"suoi\",\n      \"borg\",\n      \"\\u010dak\\u010d\",\n      \"golg\",\n      \"sk\\u00e1b\",\n      \"juov\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"o\\u0111\\u0111ajagem\\u00e1nnu\",\n      \"guovvam\\u00e1nnu\",\n      \"njuk\\u010dam\\u00e1nnu\",\n      \"cuo\\u014bom\\u00e1nnu\",\n      \"miessem\\u00e1nnu\",\n      \"geassem\\u00e1nnu\",\n      \"suoidnem\\u00e1nnu\",\n      \"borgem\\u00e1nnu\",\n      \"\\u010dak\\u010dam\\u00e1nnu\",\n      \"golggotm\\u00e1nnu\",\n      \"sk\\u00e1bmam\\u00e1nnu\",\n      \"juovlam\\u00e1nnu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"se\",\n  \"localeID\": \"se\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_seh-mz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Dimingu\",\n      \"Chiposi\",\n      \"Chipiri\",\n      \"Chitatu\",\n      \"Chinai\",\n      \"Chishanu\",\n      \"Sabudu\"\n    ],\n    \"ERANAMES\": [\n      \"Antes de Cristo\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"AC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Janeiro\",\n      \"Fevreiro\",\n      \"Marco\",\n      \"Abril\",\n      \"Maio\",\n      \"Junho\",\n      \"Julho\",\n      \"Augusto\",\n      \"Setembro\",\n      \"Otubro\",\n      \"Novembro\",\n      \"Decembro\"\n    ],\n    \"SHORTDAY\": [\n      \"Dim\",\n      \"Pos\",\n      \"Pir\",\n      \"Tat\",\n      \"Nai\",\n      \"Sha\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fev\",\n      \"Mar\",\n      \"Abr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Set\",\n      \"Otu\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janeiro\",\n      \"Fevreiro\",\n      \"Marco\",\n      \"Abril\",\n      \"Maio\",\n      \"Junho\",\n      \"Julho\",\n      \"Augusto\",\n      \"Setembro\",\n      \"Otubro\",\n      \"Novembro\",\n      \"Decembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d 'de' MMM 'de' y HH:mm:ss\",\n    \"mediumDate\": \"d 'de' MMM 'de' y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MTn\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"seh-mz\",\n  \"localeID\": \"seh_MZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_seh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Dimingu\",\n      \"Chiposi\",\n      \"Chipiri\",\n      \"Chitatu\",\n      \"Chinai\",\n      \"Chishanu\",\n      \"Sabudu\"\n    ],\n    \"ERANAMES\": [\n      \"Antes de Cristo\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"AC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Janeiro\",\n      \"Fevreiro\",\n      \"Marco\",\n      \"Abril\",\n      \"Maio\",\n      \"Junho\",\n      \"Julho\",\n      \"Augusto\",\n      \"Setembro\",\n      \"Otubro\",\n      \"Novembro\",\n      \"Decembro\"\n    ],\n    \"SHORTDAY\": [\n      \"Dim\",\n      \"Pos\",\n      \"Pir\",\n      \"Tat\",\n      \"Nai\",\n      \"Sha\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Fev\",\n      \"Mar\",\n      \"Abr\",\n      \"Mai\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Set\",\n      \"Otu\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janeiro\",\n      \"Fevreiro\",\n      \"Marco\",\n      \"Abril\",\n      \"Maio\",\n      \"Junho\",\n      \"Julho\",\n      \"Augusto\",\n      \"Setembro\",\n      \"Otubro\",\n      \"Novembro\",\n      \"Decembro\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d 'de' MMMM 'de' y\",\n    \"longDate\": \"d 'de' MMMM 'de' y\",\n    \"medium\": \"d 'de' MMM 'de' y HH:mm:ss\",\n    \"mediumDate\": \"d 'de' MMM 'de' y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MTn\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"seh\",\n  \"localeID\": \"seh\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ses-ml.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Adduha\",\n      \"Aluula\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atinni\",\n      \"Atalaata\",\n      \"Alarba\",\n      \"Alhamiisa\",\n      \"Alzuma\",\n      \"Asibti\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa zamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alz\",\n      \"Asi\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ses-ml\",\n  \"localeID\": \"ses_ML\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ses.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Adduha\",\n      \"Aluula\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atinni\",\n      \"Atalaata\",\n      \"Alarba\",\n      \"Alhamiisa\",\n      \"Alzuma\",\n      \"Asibti\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa zamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alz\",\n      \"Asi\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"ses\",\n  \"localeID\": \"ses\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sg-cf.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ND\",\n      \"LK\"\n    ],\n    \"DAY\": [\n      \"Bikua-\\u00f4ko\",\n      \"B\\u00efkua-\\u00fbse\",\n      \"B\\u00efkua-pt\\u00e2\",\n      \"B\\u00efkua-us\\u00ef\\u00f6\",\n      \"B\\u00efkua-ok\\u00fc\",\n      \"L\\u00e2p\\u00f4s\\u00f6\",\n      \"L\\u00e2yenga\"\n    ],\n    \"ERANAMES\": [\n      \"K\\u00f4zo na Kr\\u00eestu\",\n      \"Na pek\\u00f4 t\\u00ee Kr\\u00eestu\"\n    ],\n    \"ERAS\": [\n      \"KnK\",\n      \"NpK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Nyenye\",\n      \"Fulund\\u00efgi\",\n      \"Mb\\u00e4ng\\u00fc\",\n      \"Ngub\\u00f9e\",\n      \"B\\u00eal\\u00e4w\\u00fc\",\n      \"F\\u00f6ndo\",\n      \"Lengua\",\n      \"K\\u00fck\\u00fcr\\u00fc\",\n      \"Mvuka\",\n      \"Ngberere\",\n      \"Nab\\u00e4nd\\u00fcru\",\n      \"Kakauka\"\n    ],\n    \"SHORTDAY\": [\n      \"Bk1\",\n      \"Bk2\",\n      \"Bk3\",\n      \"Bk4\",\n      \"Bk5\",\n      \"L\\u00e2p\",\n      \"L\\u00e2y\"\n    ],\n    \"SHORTMONTH\": [\n      \"Nye\",\n      \"Ful\",\n      \"Mb\\u00e4\",\n      \"Ngu\",\n      \"B\\u00eal\",\n      \"F\\u00f6n\",\n      \"Len\",\n      \"K\\u00fck\",\n      \"Mvu\",\n      \"Ngb\",\n      \"Nab\",\n      \"Kak\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Nyenye\",\n      \"Fulund\\u00efgi\",\n      \"Mb\\u00e4ng\\u00fc\",\n      \"Ngub\\u00f9e\",\n      \"B\\u00eal\\u00e4w\\u00fc\",\n      \"F\\u00f6ndo\",\n      \"Lengua\",\n      \"K\\u00fck\\u00fcr\\u00fc\",\n      \"Mvuka\",\n      \"Ngberere\",\n      \"Nab\\u00e4nd\\u00fcru\",\n      \"Kakauka\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sg-cf\",\n  \"localeID\": \"sg_CF\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ND\",\n      \"LK\"\n    ],\n    \"DAY\": [\n      \"Bikua-\\u00f4ko\",\n      \"B\\u00efkua-\\u00fbse\",\n      \"B\\u00efkua-pt\\u00e2\",\n      \"B\\u00efkua-us\\u00ef\\u00f6\",\n      \"B\\u00efkua-ok\\u00fc\",\n      \"L\\u00e2p\\u00f4s\\u00f6\",\n      \"L\\u00e2yenga\"\n    ],\n    \"ERANAMES\": [\n      \"K\\u00f4zo na Kr\\u00eestu\",\n      \"Na pek\\u00f4 t\\u00ee Kr\\u00eestu\"\n    ],\n    \"ERAS\": [\n      \"KnK\",\n      \"NpK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Nyenye\",\n      \"Fulund\\u00efgi\",\n      \"Mb\\u00e4ng\\u00fc\",\n      \"Ngub\\u00f9e\",\n      \"B\\u00eal\\u00e4w\\u00fc\",\n      \"F\\u00f6ndo\",\n      \"Lengua\",\n      \"K\\u00fck\\u00fcr\\u00fc\",\n      \"Mvuka\",\n      \"Ngberere\",\n      \"Nab\\u00e4nd\\u00fcru\",\n      \"Kakauka\"\n    ],\n    \"SHORTDAY\": [\n      \"Bk1\",\n      \"Bk2\",\n      \"Bk3\",\n      \"Bk4\",\n      \"Bk5\",\n      \"L\\u00e2p\",\n      \"L\\u00e2y\"\n    ],\n    \"SHORTMONTH\": [\n      \"Nye\",\n      \"Ful\",\n      \"Mb\\u00e4\",\n      \"Ngu\",\n      \"B\\u00eal\",\n      \"F\\u00f6n\",\n      \"Len\",\n      \"K\\u00fck\",\n      \"Mvu\",\n      \"Ngb\",\n      \"Nab\",\n      \"Kak\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Nyenye\",\n      \"Fulund\\u00efgi\",\n      \"Mb\\u00e4ng\\u00fc\",\n      \"Ngub\\u00f9e\",\n      \"B\\u00eal\\u00e4w\\u00fc\",\n      \"F\\u00f6ndo\",\n      \"Lengua\",\n      \"K\\u00fck\\u00fcr\\u00fc\",\n      \"Mvuka\",\n      \"Ngberere\",\n      \"Nab\\u00e4nd\\u00fcru\",\n      \"Kakauka\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"\\u00a4-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sg\",\n  \"localeID\": \"sg\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"pre podne\",\n      \"po podne\"\n    ],\n    \"DAY\": [\n      \"nedelja\",\n      \"ponedeljak\",\n      \"utorak\",\n      \"sreda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"pre nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sre\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sh\",\n  \"localeID\": \"sh\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_shi-latn-ma.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"tifawt\",\n      \"tadgg\\u02b7at\"\n    ],\n    \"DAY\": [\n      \"asamas\",\n      \"aynas\",\n      \"asinas\",\n      \"ak\\u1e5bas\",\n      \"akwas\",\n      \"asimwas\",\n      \"asi\\u1e0dyas\"\n    ],\n    \"ERANAMES\": [\n      \"dat n \\u025bisa\",\n      \"dffir n \\u025bisa\"\n    ],\n    \"ERAS\": [\n      \"da\\u025b\",\n      \"df\\u025b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"innayr\",\n      \"b\\u1e5bay\\u1e5b\",\n      \"ma\\u1e5b\\u1e63\",\n      \"ibrir\",\n      \"mayyu\",\n      \"yunyu\",\n      \"yulyuz\",\n      \"\\u0263uct\",\n      \"cutanbir\",\n      \"ktubr\",\n      \"nuwanbir\",\n      \"dujanbir\"\n    ],\n    \"SHORTDAY\": [\n      \"asa\",\n      \"ayn\",\n      \"asi\",\n      \"ak\\u1e5b\",\n      \"akw\",\n      \"asim\",\n      \"asi\\u1e0d\"\n    ],\n    \"SHORTMONTH\": [\n      \"inn\",\n      \"b\\u1e5ba\",\n      \"ma\\u1e5b\",\n      \"ibr\",\n      \"may\",\n      \"yun\",\n      \"yul\",\n      \"\\u0263uc\",\n      \"cut\",\n      \"ktu\",\n      \"nuw\",\n      \"duj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"innayr\",\n      \"b\\u1e5bay\\u1e5b\",\n      \"ma\\u1e5b\\u1e63\",\n      \"ibrir\",\n      \"mayyu\",\n      \"yunyu\",\n      \"yulyuz\",\n      \"\\u0263uct\",\n      \"cutanbir\",\n      \"ktubr\",\n      \"nuwanbir\",\n      \"dujanbir\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"shi-latn-ma\",\n  \"localeID\": \"shi_Latn_MA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_shi-latn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"tifawt\",\n      \"tadgg\\u02b7at\"\n    ],\n    \"DAY\": [\n      \"asamas\",\n      \"aynas\",\n      \"asinas\",\n      \"ak\\u1e5bas\",\n      \"akwas\",\n      \"asimwas\",\n      \"asi\\u1e0dyas\"\n    ],\n    \"ERANAMES\": [\n      \"dat n \\u025bisa\",\n      \"dffir n \\u025bisa\"\n    ],\n    \"ERAS\": [\n      \"da\\u025b\",\n      \"df\\u025b\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"innayr\",\n      \"b\\u1e5bay\\u1e5b\",\n      \"ma\\u1e5b\\u1e63\",\n      \"ibrir\",\n      \"mayyu\",\n      \"yunyu\",\n      \"yulyuz\",\n      \"\\u0263uct\",\n      \"cutanbir\",\n      \"ktubr\",\n      \"nuwanbir\",\n      \"dujanbir\"\n    ],\n    \"SHORTDAY\": [\n      \"asa\",\n      \"ayn\",\n      \"asi\",\n      \"ak\\u1e5b\",\n      \"akw\",\n      \"asim\",\n      \"asi\\u1e0d\"\n    ],\n    \"SHORTMONTH\": [\n      \"inn\",\n      \"b\\u1e5ba\",\n      \"ma\\u1e5b\",\n      \"ibr\",\n      \"may\",\n      \"yun\",\n      \"yul\",\n      \"\\u0263uc\",\n      \"cut\",\n      \"ktu\",\n      \"nuw\",\n      \"duj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"innayr\",\n      \"b\\u1e5bay\\u1e5b\",\n      \"ma\\u1e5b\\u1e63\",\n      \"ibrir\",\n      \"mayyu\",\n      \"yunyu\",\n      \"yulyuz\",\n      \"\\u0263uct\",\n      \"cutanbir\",\n      \"ktubr\",\n      \"nuwanbir\",\n      \"dujanbir\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"shi-latn\",\n  \"localeID\": \"shi_Latn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_shi-tfng-ma.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u2d5c\\u2d49\\u2d3c\\u2d30\\u2d61\\u2d5c\",\n      \"\\u2d5c\\u2d30\\u2d37\\u2d33\\u2d33\\u2d6f\\u2d30\\u2d5c\"\n    ],\n    \"DAY\": [\n      \"\\u2d30\\u2d59\\u2d30\\u2d4e\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d62\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d55\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d59\\u2d49\\u2d4e\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\\u2d62\\u2d30\\u2d59\"\n    ],\n    \"ERANAMES\": [\n      \"\\u2d37\\u2d30\\u2d5c \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\",\n      \"\\u2d37\\u2d3c\\u2d3c\\u2d49\\u2d54 \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\"\n    ],\n    \"ERAS\": [\n      \"\\u2d37\\u2d30\\u2d44\",\n      \"\\u2d37\\u2d3c\\u2d44\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u2d30\\u2d59\\u2d30\",\n      \"\\u2d30\\u2d62\\u2d4f\",\n      \"\\u2d30\\u2d59\\u2d49\",\n      \"\\u2d30\\u2d3d\\u2d55\",\n      \"\\u2d30\\u2d3d\\u2d61\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4e\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\",\n      \"\\u2d31\\u2d55\\u2d30\",\n      \"\\u2d4e\\u2d30\\u2d55\",\n      \"\\u2d49\\u2d31\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\",\n      \"\\u2d62\\u2d53\\u2d4f\",\n      \"\\u2d62\\u2d53\\u2d4d\",\n      \"\\u2d56\\u2d53\\u2d5b\",\n      \"\\u2d5b\\u2d53\\u2d5c\",\n      \"\\u2d3d\\u2d5c\\u2d53\",\n      \"\\u2d4f\\u2d53\\u2d61\",\n      \"\\u2d37\\u2d53\\u2d4a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"shi-tfng-ma\",\n  \"localeID\": \"shi_Tfng_MA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_shi-tfng.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u2d5c\\u2d49\\u2d3c\\u2d30\\u2d61\\u2d5c\",\n      \"\\u2d5c\\u2d30\\u2d37\\u2d33\\u2d33\\u2d6f\\u2d30\\u2d5c\"\n    ],\n    \"DAY\": [\n      \"\\u2d30\\u2d59\\u2d30\\u2d4e\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d62\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d55\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d59\\u2d49\\u2d4e\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\\u2d62\\u2d30\\u2d59\"\n    ],\n    \"ERANAMES\": [\n      \"\\u2d37\\u2d30\\u2d5c \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\",\n      \"\\u2d37\\u2d3c\\u2d3c\\u2d49\\u2d54 \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\"\n    ],\n    \"ERAS\": [\n      \"\\u2d37\\u2d30\\u2d44\",\n      \"\\u2d37\\u2d3c\\u2d44\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u2d30\\u2d59\\u2d30\",\n      \"\\u2d30\\u2d62\\u2d4f\",\n      \"\\u2d30\\u2d59\\u2d49\",\n      \"\\u2d30\\u2d3d\\u2d55\",\n      \"\\u2d30\\u2d3d\\u2d61\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4e\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\",\n      \"\\u2d31\\u2d55\\u2d30\",\n      \"\\u2d4e\\u2d30\\u2d55\",\n      \"\\u2d49\\u2d31\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\",\n      \"\\u2d62\\u2d53\\u2d4f\",\n      \"\\u2d62\\u2d53\\u2d4d\",\n      \"\\u2d56\\u2d53\\u2d5b\",\n      \"\\u2d5b\\u2d53\\u2d5c\",\n      \"\\u2d3d\\u2d5c\\u2d53\",\n      \"\\u2d4f\\u2d53\\u2d61\",\n      \"\\u2d37\\u2d53\\u2d4a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"shi-tfng\",\n  \"localeID\": \"shi_Tfng\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_shi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u2d5c\\u2d49\\u2d3c\\u2d30\\u2d61\\u2d5c\",\n      \"\\u2d5c\\u2d30\\u2d37\\u2d33\\u2d33\\u2d6f\\u2d30\\u2d5c\"\n    ],\n    \"DAY\": [\n      \"\\u2d30\\u2d59\\u2d30\\u2d4e\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d62\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d55\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d59\\u2d49\\u2d4e\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\\u2d62\\u2d30\\u2d59\"\n    ],\n    \"ERANAMES\": [\n      \"\\u2d37\\u2d30\\u2d5c \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\",\n      \"\\u2d37\\u2d3c\\u2d3c\\u2d49\\u2d54 \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\"\n    ],\n    \"ERAS\": [\n      \"\\u2d37\\u2d30\\u2d44\",\n      \"\\u2d37\\u2d3c\\u2d44\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u2d30\\u2d59\\u2d30\",\n      \"\\u2d30\\u2d62\\u2d4f\",\n      \"\\u2d30\\u2d59\\u2d49\",\n      \"\\u2d30\\u2d3d\\u2d55\",\n      \"\\u2d30\\u2d3d\\u2d61\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4e\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\",\n      \"\\u2d31\\u2d55\\u2d30\",\n      \"\\u2d4e\\u2d30\\u2d55\",\n      \"\\u2d49\\u2d31\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\",\n      \"\\u2d62\\u2d53\\u2d4f\",\n      \"\\u2d62\\u2d53\\u2d4d\",\n      \"\\u2d56\\u2d53\\u2d5b\",\n      \"\\u2d5b\\u2d53\\u2d5c\",\n      \"\\u2d3d\\u2d5c\\u2d53\",\n      \"\\u2d4f\\u2d53\\u2d61\",\n      \"\\u2d37\\u2d53\\u2d4a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"shi\",\n  \"localeID\": \"shi\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_si-lk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0db4\\u0dd9.\\u0dc0.\",\n      \"\\u0db4.\\u0dc0.\"\n    ],\n    \"DAY\": [\n      \"\\u0d89\\u0dbb\\u0dd2\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0db3\\u0dd4\\u0daf\\u0dcf\",\n      \"\\u0d85\\u0d9f\\u0dc4\\u0dbb\\u0dd4\\u0dc0\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0db6\\u0daf\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0db6\\u0dca\\u200d\\u0dbb\\u0dc4\\u0dc3\\u0dca\\u0db4\\u0dad\\u0dd2\\u0db1\\u0dca\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0dd2\\u0d9a\\u0dd4\\u0dbb\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0dd9\\u0db1\\u0dc3\\u0dd4\\u0dbb\\u0dcf\\u0daf\\u0dcf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2\\u0dc3\\u0dca\\u0dad\\u0dd4 \\u0db4\\u0dd6\\u0dbb\\u0dca\\u0dc0\",\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2\\u0dc3\\u0dca\\u0dad\\u0dd4 \\u0dc0\\u0dbb\\u0dca\\u0dc2\"\n    ],\n    \"ERAS\": [\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2.\\u0db4\\u0dd6.\",\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2.\\u0dc0.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0da2\\u0db1\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db4\\u0dd9\\u0db6\\u0dbb\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db8\\u0dcf\\u0dbb\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0d85\\u0db4\\u0dca\\u200d\\u0dbb\\u0dda\\u0dbd\\u0dca\",\n      \"\\u0db8\\u0dd0\\u0dba\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0db1\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0dbd\\u0dd2\",\n      \"\\u0d85\\u0d9c\\u0ddd\\u0dc3\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0dc3\\u0dd0\\u0db4\\u0dca\\u0dad\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0d94\\u0d9a\\u0dca\\u0dad\\u0ddd\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0db1\\u0ddc\\u0dc0\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0daf\\u0dd9\\u0dc3\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0d89\\u0dbb\\u0dd2\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0db3\\u0dd4\\u0daf\\u0dcf\",\n      \"\\u0d85\\u0d9f\\u0dc4\",\n      \"\\u0db6\\u0daf\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0db6\\u0dca\\u200d\\u0dbb\\u0dc4\\u0dc3\\u0dca\",\n      \"\\u0dc3\\u0dd2\\u0d9a\\u0dd4\",\n      \"\\u0dc3\\u0dd9\\u0db1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0da2\\u0db1\",\n      \"\\u0db4\\u0dd9\\u0db6\",\n      \"\\u0db8\\u0dcf\\u0dbb\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0d85\\u0db4\\u0dca\\u200d\\u0dbb\\u0dda\\u0dbd\\u0dca\",\n      \"\\u0db8\\u0dd0\\u0dba\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0db1\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0dbd\\u0dd2\",\n      \"\\u0d85\\u0d9c\\u0ddd\",\n      \"\\u0dc3\\u0dd0\\u0db4\\u0dca\",\n      \"\\u0d94\\u0d9a\\u0dca\",\n      \"\\u0db1\\u0ddc\\u0dc0\\u0dd0\",\n      \"\\u0daf\\u0dd9\\u0dc3\\u0dd0\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0da2\\u0db1\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db4\\u0dd9\\u0db6\\u0dbb\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db8\\u0dcf\\u0dbb\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0d85\\u0db4\\u0dca\\u200d\\u0dbb\\u0dda\\u0dbd\\u0dca\",\n      \"\\u0db8\\u0dd0\\u0dba\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0db1\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0dbd\\u0dd2\",\n      \"\\u0d85\\u0d9c\\u0ddd\\u0dc3\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0dc3\\u0dd0\\u0db4\\u0dca\\u0dad\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0d94\\u0d9a\\u0dca\\u0dad\\u0ddd\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0db1\\u0ddc\\u0dc0\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0daf\\u0dd9\\u0dc3\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH.mm.ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"y-MM-dd HH.mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"si-lk\",\n  \"localeID\": \"si_LK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if ((n == 0 || n == 1) || i == 0 && vf.f == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_si.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0db4\\u0dd9.\\u0dc0.\",\n      \"\\u0db4.\\u0dc0.\"\n    ],\n    \"DAY\": [\n      \"\\u0d89\\u0dbb\\u0dd2\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0db3\\u0dd4\\u0daf\\u0dcf\",\n      \"\\u0d85\\u0d9f\\u0dc4\\u0dbb\\u0dd4\\u0dc0\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0db6\\u0daf\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0db6\\u0dca\\u200d\\u0dbb\\u0dc4\\u0dc3\\u0dca\\u0db4\\u0dad\\u0dd2\\u0db1\\u0dca\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0dd2\\u0d9a\\u0dd4\\u0dbb\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0dd9\\u0db1\\u0dc3\\u0dd4\\u0dbb\\u0dcf\\u0daf\\u0dcf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2\\u0dc3\\u0dca\\u0dad\\u0dd4 \\u0db4\\u0dd6\\u0dbb\\u0dca\\u0dc0\",\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2\\u0dc3\\u0dca\\u0dad\\u0dd4 \\u0dc0\\u0dbb\\u0dca\\u0dc2\"\n    ],\n    \"ERAS\": [\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2.\\u0db4\\u0dd6.\",\n      \"\\u0d9a\\u0dca\\u200d\\u0dbb\\u0dd2.\\u0dc0.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0da2\\u0db1\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db4\\u0dd9\\u0db6\\u0dbb\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db8\\u0dcf\\u0dbb\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0d85\\u0db4\\u0dca\\u200d\\u0dbb\\u0dda\\u0dbd\\u0dca\",\n      \"\\u0db8\\u0dd0\\u0dba\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0db1\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0dbd\\u0dd2\",\n      \"\\u0d85\\u0d9c\\u0ddd\\u0dc3\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0dc3\\u0dd0\\u0db4\\u0dca\\u0dad\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0d94\\u0d9a\\u0dca\\u0dad\\u0ddd\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0db1\\u0ddc\\u0dc0\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0daf\\u0dd9\\u0dc3\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0d89\\u0dbb\\u0dd2\\u0daf\\u0dcf\",\n      \"\\u0dc3\\u0db3\\u0dd4\\u0daf\\u0dcf\",\n      \"\\u0d85\\u0d9f\\u0dc4\",\n      \"\\u0db6\\u0daf\\u0dcf\\u0daf\\u0dcf\",\n      \"\\u0db6\\u0dca\\u200d\\u0dbb\\u0dc4\\u0dc3\\u0dca\",\n      \"\\u0dc3\\u0dd2\\u0d9a\\u0dd4\",\n      \"\\u0dc3\\u0dd9\\u0db1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0da2\\u0db1\",\n      \"\\u0db4\\u0dd9\\u0db6\",\n      \"\\u0db8\\u0dcf\\u0dbb\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0d85\\u0db4\\u0dca\\u200d\\u0dbb\\u0dda\\u0dbd\\u0dca\",\n      \"\\u0db8\\u0dd0\\u0dba\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0db1\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0dbd\\u0dd2\",\n      \"\\u0d85\\u0d9c\\u0ddd\",\n      \"\\u0dc3\\u0dd0\\u0db4\\u0dca\",\n      \"\\u0d94\\u0d9a\\u0dca\",\n      \"\\u0db1\\u0ddc\\u0dc0\\u0dd0\",\n      \"\\u0daf\\u0dd9\\u0dc3\\u0dd0\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0da2\\u0db1\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db4\\u0dd9\\u0db6\\u0dbb\\u0dc0\\u0dcf\\u0dbb\\u0dd2\",\n      \"\\u0db8\\u0dcf\\u0dbb\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0d85\\u0db4\\u0dca\\u200d\\u0dbb\\u0dda\\u0dbd\\u0dca\",\n      \"\\u0db8\\u0dd0\\u0dba\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0db1\\u0dd2\",\n      \"\\u0da2\\u0dd6\\u0dbd\\u0dd2\",\n      \"\\u0d85\\u0d9c\\u0ddd\\u0dc3\\u0dca\\u0dad\\u0dd4\",\n      \"\\u0dc3\\u0dd0\\u0db4\\u0dca\\u0dad\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0d94\\u0d9a\\u0dca\\u0dad\\u0ddd\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0db1\\u0ddc\\u0dc0\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\",\n      \"\\u0daf\\u0dd9\\u0dc3\\u0dd0\\u0db8\\u0dca\\u0db6\\u0dbb\\u0dca\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH.mm.ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH.mm.ss\",\n    \"short\": \"y-MM-dd HH.mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"si\",\n  \"localeID\": \"si\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if ((n == 0 || n == 1) || i == 0 && vf.f == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sk-sk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"nede\\u013ea\",\n      \"pondelok\",\n      \"utorok\",\n      \"streda\",\n      \"\\u0161tvrtok\",\n      \"piatok\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"pred Kristom\",\n      \"po Kristovi\"\n    ],\n    \"ERAS\": [\n      \"pred Kr.\",\n      \"po Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janu\\u00e1ra\",\n      \"febru\\u00e1ra\",\n      \"marca\",\n      \"apr\\u00edla\",\n      \"m\\u00e1ja\",\n      \"j\\u00fana\",\n      \"j\\u00fala\",\n      \"augusta\",\n      \"septembra\",\n      \"okt\\u00f3bra\",\n      \"novembra\",\n      \"decembra\"\n    ],\n    \"SHORTDAY\": [\n      \"ne\",\n      \"po\",\n      \"ut\",\n      \"st\",\n      \"\\u0161t\",\n      \"pi\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"m\\u00e1j\",\n      \"j\\u00fan\",\n      \"j\\u00fal\",\n      \"aug\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janu\\u00e1r\",\n      \"febru\\u00e1r\",\n      \"marec\",\n      \"apr\\u00edl\",\n      \"m\\u00e1j\",\n      \"j\\u00fan\",\n      \"j\\u00fal\",\n      \"august\",\n      \"september\",\n      \"okt\\u00f3ber\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. M. y H:mm:ss\",\n    \"mediumDate\": \"d. M. y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d. M. y H:mm\",\n    \"shortDate\": \"d. M. y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sk-sk\",\n  \"localeID\": \"sk_SK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (i >= 2 && i <= 4 && vf.v == 0) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v != 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"nede\\u013ea\",\n      \"pondelok\",\n      \"utorok\",\n      \"streda\",\n      \"\\u0161tvrtok\",\n      \"piatok\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"pred Kristom\",\n      \"po Kristovi\"\n    ],\n    \"ERAS\": [\n      \"pred Kr.\",\n      \"po Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janu\\u00e1ra\",\n      \"febru\\u00e1ra\",\n      \"marca\",\n      \"apr\\u00edla\",\n      \"m\\u00e1ja\",\n      \"j\\u00fana\",\n      \"j\\u00fala\",\n      \"augusta\",\n      \"septembra\",\n      \"okt\\u00f3bra\",\n      \"novembra\",\n      \"decembra\"\n    ],\n    \"SHORTDAY\": [\n      \"ne\",\n      \"po\",\n      \"ut\",\n      \"st\",\n      \"\\u0161t\",\n      \"pi\",\n      \"so\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"m\\u00e1j\",\n      \"j\\u00fan\",\n      \"j\\u00fal\",\n      \"aug\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"janu\\u00e1r\",\n      \"febru\\u00e1r\",\n      \"marec\",\n      \"apr\\u00edl\",\n      \"m\\u00e1j\",\n      \"j\\u00fan\",\n      \"j\\u00fal\",\n      \"august\",\n      \"september\",\n      \"okt\\u00f3ber\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. M. y H:mm:ss\",\n    \"mediumDate\": \"d. M. y\",\n    \"mediumTime\": \"H:mm:ss\",\n    \"short\": \"d. M. y H:mm\",\n    \"shortDate\": \"d. M. y\",\n    \"shortTime\": \"H:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sk\",\n  \"localeID\": \"sk\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  if (i >= 2 && i <= 4 && vf.v == 0) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v != 0) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sl-si.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dop.\",\n      \"pop.\"\n    ],\n    \"DAY\": [\n      \"nedelja\",\n      \"ponedeljek\",\n      \"torek\",\n      \"sreda\",\n      \"\\u010detrtek\",\n      \"petek\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"pred Kristusom\",\n      \"po Kristusu\"\n    ],\n    \"ERAS\": [\n      \"pr. Kr.\",\n      \"po Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marec\",\n      \"april\",\n      \"maj\",\n      \"junij\",\n      \"julij\",\n      \"avgust\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"ned.\",\n      \"pon.\",\n      \"tor.\",\n      \"sre.\",\n      \"\\u010det.\",\n      \"pet.\",\n      \"sob.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"maj\",\n      \"jun.\",\n      \"jul.\",\n      \"avg.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marec\",\n      \"april\",\n      \"maj\",\n      \"junij\",\n      \"julij\",\n      \"avgust\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y\",\n    \"longDate\": \"dd. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d. MM. yy HH:mm\",\n    \"shortDate\": \"d. MM. yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sl-si\",\n  \"localeID\": \"sl_SI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 100 == 1) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 100 == 2) {    return PLURAL_CATEGORY.TWO;  }  if (vf.v == 0 && i % 100 >= 3 && i % 100 <= 4 || vf.v != 0) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"dop.\",\n      \"pop.\"\n    ],\n    \"DAY\": [\n      \"nedelja\",\n      \"ponedeljek\",\n      \"torek\",\n      \"sreda\",\n      \"\\u010detrtek\",\n      \"petek\",\n      \"sobota\"\n    ],\n    \"ERANAMES\": [\n      \"pred Kristusom\",\n      \"po Kristusu\"\n    ],\n    \"ERAS\": [\n      \"pr. Kr.\",\n      \"po Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marec\",\n      \"april\",\n      \"maj\",\n      \"junij\",\n      \"julij\",\n      \"avgust\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"ned.\",\n      \"pon.\",\n      \"tor.\",\n      \"sre.\",\n      \"\\u010det.\",\n      \"pet.\",\n      \"sob.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mar.\",\n      \"apr.\",\n      \"maj\",\n      \"jun.\",\n      \"jul.\",\n      \"avg.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"marec\",\n      \"april\",\n      \"maj\",\n      \"junij\",\n      \"julij\",\n      \"avgust\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y\",\n    \"longDate\": \"dd. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d. MM. yy HH:mm\",\n    \"shortDate\": \"d. MM. yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sl\",\n  \"localeID\": \"sl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 100 == 1) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 100 == 2) {    return PLURAL_CATEGORY.TWO;  }  if (vf.v == 0 && i % 100 >= 3 && i % 100 <= 4 || vf.v != 0) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_smn-fi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ip.\",\n      \"ep.\"\n    ],\n    \"DAY\": [\n      \"pasepeeivi\",\n      \"vuossaarg\\u00e2\",\n      \"majebaarg\\u00e2\",\n      \"koskoho\",\n      \"tuor\\u00e2stuv\",\n      \"v\\u00e1stuppeeivi\",\n      \"l\\u00e1vurduv\"\n    ],\n    \"ERANAMES\": [\n      \"Ovdil Kristus \\u0161odd\\u00e2m\",\n      \"ma\\u014ba Kristus \\u0161odd\\u00e2m\"\n    ],\n    \"ERAS\": [\n      \"oKr.\",\n      \"mKr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"u\\u0111\\u0111\\u00e2ivem\\u00e1\\u00e1nu\",\n      \"kuov\\u00e2m\\u00e1\\u00e1nu\",\n      \"njuh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"cu\\u00e1\\u014buim\\u00e1\\u00e1nu\",\n      \"vyesim\\u00e1\\u00e1nu\",\n      \"kesim\\u00e1\\u00e1nu\",\n      \"syeinim\\u00e1\\u00e1nu\",\n      \"porgem\\u00e1\\u00e1nu\",\n      \"\\u010doh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"roovv\\u00e2dm\\u00e1\\u00e1nu\",\n      \"skamm\\u00e2m\\u00e1\\u00e1nu\",\n      \"juovl\\u00e2m\\u00e1\\u00e1nu\"\n    ],\n    \"SHORTDAY\": [\n      \"pas\",\n      \"vuo\",\n      \"maj\",\n      \"kos\",\n      \"tuo\",\n      \"v\\u00e1s\",\n      \"l\\u00e1v\"\n    ],\n    \"SHORTMONTH\": [\n      \"u\\u0111iv\",\n      \"kuov\\u00e2\",\n      \"njuh\\u010d\\u00e2\",\n      \"cu\\u00e1\\u014bui\",\n      \"vyesi\",\n      \"kesi\",\n      \"syeini\",\n      \"porge\",\n      \"\\u010doh\\u010d\\u00e2\",\n      \"roovv\\u00e2d\",\n      \"skamm\\u00e2\",\n      \"juovl\\u00e2\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"u\\u0111\\u0111\\u00e2ivem\\u00e1\\u00e1nu\",\n      \"kuov\\u00e2m\\u00e1\\u00e1nu\",\n      \"njuh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"cu\\u00e1\\u014buim\\u00e1\\u00e1nu\",\n      \"vyesim\\u00e1\\u00e1nu\",\n      \"kesim\\u00e1\\u00e1nu\",\n      \"syeinim\\u00e1\\u00e1nu\",\n      \"porgem\\u00e1\\u00e1nu\",\n      \"\\u010doh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"roovv\\u00e2dm\\u00e1\\u00e1nu\",\n      \"skamm\\u00e2m\\u00e1\\u00e1nu\",\n      \"juovl\\u00e2m\\u00e1\\u00e1nu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"cccc, MMMM d. y\",\n    \"longDate\": \"MMMM d. y\",\n    \"medium\": \"MMM d. y H.mm.ss\",\n    \"mediumDate\": \"MMM d. y\",\n    \"mediumTime\": \"H.mm.ss\",\n    \"short\": \"d.M.y H.mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"H.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"smn-fi\",\n  \"localeID\": \"smn_FI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_smn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ip.\",\n      \"ep.\"\n    ],\n    \"DAY\": [\n      \"pasepeeivi\",\n      \"vuossaarg\\u00e2\",\n      \"majebaarg\\u00e2\",\n      \"koskoho\",\n      \"tuor\\u00e2stuv\",\n      \"v\\u00e1stuppeeivi\",\n      \"l\\u00e1vurduv\"\n    ],\n    \"ERANAMES\": [\n      \"Ovdil Kristus \\u0161odd\\u00e2m\",\n      \"ma\\u014ba Kristus \\u0161odd\\u00e2m\"\n    ],\n    \"ERAS\": [\n      \"oKr.\",\n      \"mKr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"u\\u0111\\u0111\\u00e2ivem\\u00e1\\u00e1nu\",\n      \"kuov\\u00e2m\\u00e1\\u00e1nu\",\n      \"njuh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"cu\\u00e1\\u014buim\\u00e1\\u00e1nu\",\n      \"vyesim\\u00e1\\u00e1nu\",\n      \"kesim\\u00e1\\u00e1nu\",\n      \"syeinim\\u00e1\\u00e1nu\",\n      \"porgem\\u00e1\\u00e1nu\",\n      \"\\u010doh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"roovv\\u00e2dm\\u00e1\\u00e1nu\",\n      \"skamm\\u00e2m\\u00e1\\u00e1nu\",\n      \"juovl\\u00e2m\\u00e1\\u00e1nu\"\n    ],\n    \"SHORTDAY\": [\n      \"pas\",\n      \"vuo\",\n      \"maj\",\n      \"kos\",\n      \"tuo\",\n      \"v\\u00e1s\",\n      \"l\\u00e1v\"\n    ],\n    \"SHORTMONTH\": [\n      \"u\\u0111iv\",\n      \"kuov\\u00e2\",\n      \"njuh\\u010d\\u00e2\",\n      \"cu\\u00e1\\u014bui\",\n      \"vyesi\",\n      \"kesi\",\n      \"syeini\",\n      \"porge\",\n      \"\\u010doh\\u010d\\u00e2\",\n      \"roovv\\u00e2d\",\n      \"skamm\\u00e2\",\n      \"juovl\\u00e2\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"u\\u0111\\u0111\\u00e2ivem\\u00e1\\u00e1nu\",\n      \"kuov\\u00e2m\\u00e1\\u00e1nu\",\n      \"njuh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"cu\\u00e1\\u014buim\\u00e1\\u00e1nu\",\n      \"vyesim\\u00e1\\u00e1nu\",\n      \"kesim\\u00e1\\u00e1nu\",\n      \"syeinim\\u00e1\\u00e1nu\",\n      \"porgem\\u00e1\\u00e1nu\",\n      \"\\u010doh\\u010d\\u00e2m\\u00e1\\u00e1nu\",\n      \"roovv\\u00e2dm\\u00e1\\u00e1nu\",\n      \"skamm\\u00e2m\\u00e1\\u00e1nu\",\n      \"juovl\\u00e2m\\u00e1\\u00e1nu\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"cccc, MMMM d. y\",\n    \"longDate\": \"MMMM d. y\",\n    \"medium\": \"MMM d. y H.mm.ss\",\n    \"mediumDate\": \"MMM d. y\",\n    \"mediumTime\": \"H.mm.ss\",\n    \"short\": \"d.M.y H.mm\",\n    \"shortDate\": \"d.M.y\",\n    \"shortTime\": \"H.mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"smn\",\n  \"localeID\": \"smn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sn-zw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Svondo\",\n      \"Muvhuro\",\n      \"Chipiri\",\n      \"Chitatu\",\n      \"China\",\n      \"Chishanu\",\n      \"Mugovera\"\n    ],\n    \"ERANAMES\": [\n      \"Kristo asati auya\",\n      \"mugore ramambo vedu\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Ndira\",\n      \"Kukadzi\",\n      \"Kurume\",\n      \"Kubvumbi\",\n      \"Chivabvu\",\n      \"Chikumi\",\n      \"Chikunguru\",\n      \"Nyamavhuvhu\",\n      \"Gunyana\",\n      \"Gumiguru\",\n      \"Mbudzi\",\n      \"Zvita\"\n    ],\n    \"SHORTDAY\": [\n      \"Svo\",\n      \"Muv\",\n      \"Chp\",\n      \"Cht\",\n      \"Chn\",\n      \"Chs\",\n      \"Mug\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ndi\",\n      \"Kuk\",\n      \"Kur\",\n      \"Kub\",\n      \"Chv\",\n      \"Chk\",\n      \"Chg\",\n      \"Nya\",\n      \"Gun\",\n      \"Gum\",\n      \"Mbu\",\n      \"Zvi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ndira\",\n      \"Kukadzi\",\n      \"Kurume\",\n      \"Kubvumbi\",\n      \"Chivabvu\",\n      \"Chikumi\",\n      \"Chikunguru\",\n      \"Nyamavhuvhu\",\n      \"Gunyana\",\n      \"Gumiguru\",\n      \"Mbudzi\",\n      \"Zvita\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sn-zw\",\n  \"localeID\": \"sn_ZW\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Svondo\",\n      \"Muvhuro\",\n      \"Chipiri\",\n      \"Chitatu\",\n      \"China\",\n      \"Chishanu\",\n      \"Mugovera\"\n    ],\n    \"ERANAMES\": [\n      \"Kristo asati auya\",\n      \"mugore ramambo vedu\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Ndira\",\n      \"Kukadzi\",\n      \"Kurume\",\n      \"Kubvumbi\",\n      \"Chivabvu\",\n      \"Chikumi\",\n      \"Chikunguru\",\n      \"Nyamavhuvhu\",\n      \"Gunyana\",\n      \"Gumiguru\",\n      \"Mbudzi\",\n      \"Zvita\"\n    ],\n    \"SHORTDAY\": [\n      \"Svo\",\n      \"Muv\",\n      \"Chp\",\n      \"Cht\",\n      \"Chn\",\n      \"Chs\",\n      \"Mug\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ndi\",\n      \"Kuk\",\n      \"Kur\",\n      \"Kub\",\n      \"Chv\",\n      \"Chk\",\n      \"Chg\",\n      \"Nya\",\n      \"Gun\",\n      \"Gum\",\n      \"Mbu\",\n      \"Zvi\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ndira\",\n      \"Kukadzi\",\n      \"Kurume\",\n      \"Kubvumbi\",\n      \"Chivabvu\",\n      \"Chikumi\",\n      \"Chikunguru\",\n      \"Nyamavhuvhu\",\n      \"Gunyana\",\n      \"Gumiguru\",\n      \"Mbudzi\",\n      \"Zvita\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sn\",\n  \"localeID\": \"sn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_so-dj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"sn.\",\n      \"gn.\"\n    ],\n    \"DAY\": [\n      \"Axad\",\n      \"Isniin\",\n      \"Talaado\",\n      \"Arbaco\",\n      \"Khamiis\",\n      \"Jimco\",\n      \"Sabti\"\n    ],\n    \"ERANAMES\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"ERAS\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"SHORTDAY\": [\n      \"Axd\",\n      \"Isn\",\n      \"Tal\",\n      \"Arb\",\n      \"Kha\",\n      \"Jim\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Kob\",\n      \"Lab\",\n      \"Sad\",\n      \"Afr\",\n      \"Sha\",\n      \"Lix\",\n      \"Tod\",\n      \"Sid\",\n      \"Sag\",\n      \"Tob\",\n      \"KIT\",\n      \"LIT\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM dd, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Fdj\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"so-dj\",\n  \"localeID\": \"so_DJ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_so-et.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"sn.\",\n      \"gn.\"\n    ],\n    \"DAY\": [\n      \"Axad\",\n      \"Isniin\",\n      \"Talaado\",\n      \"Arbaco\",\n      \"Khamiis\",\n      \"Jimco\",\n      \"Sabti\"\n    ],\n    \"ERANAMES\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"ERAS\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"SHORTDAY\": [\n      \"Axd\",\n      \"Isn\",\n      \"Tal\",\n      \"Arb\",\n      \"Kha\",\n      \"Jim\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Kob\",\n      \"Lab\",\n      \"Sad\",\n      \"Afr\",\n      \"Sha\",\n      \"Lix\",\n      \"Tod\",\n      \"Sid\",\n      \"Sag\",\n      \"Tob\",\n      \"KIT\",\n      \"LIT\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM dd, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Birr\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"so-et\",\n  \"localeID\": \"so_ET\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_so-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"sn.\",\n      \"gn.\"\n    ],\n    \"DAY\": [\n      \"Axad\",\n      \"Isniin\",\n      \"Talaado\",\n      \"Arbaco\",\n      \"Khamiis\",\n      \"Jimco\",\n      \"Sabti\"\n    ],\n    \"ERANAMES\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"ERAS\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"SHORTDAY\": [\n      \"Axd\",\n      \"Isn\",\n      \"Tal\",\n      \"Arb\",\n      \"Kha\",\n      \"Jim\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Kob\",\n      \"Lab\",\n      \"Sad\",\n      \"Afr\",\n      \"Sha\",\n      \"Lix\",\n      \"Tod\",\n      \"Sid\",\n      \"Sag\",\n      \"Tob\",\n      \"KIT\",\n      \"LIT\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM dd, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y HH:mm:ss\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"so-ke\",\n  \"localeID\": \"so_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_so-so.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"sn.\",\n      \"gn.\"\n    ],\n    \"DAY\": [\n      \"Axad\",\n      \"Isniin\",\n      \"Talaado\",\n      \"Arbaco\",\n      \"Khamiis\",\n      \"Jimco\",\n      \"Sabti\"\n    ],\n    \"ERANAMES\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"ERAS\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"SHORTDAY\": [\n      \"Axd\",\n      \"Isn\",\n      \"Tal\",\n      \"Arb\",\n      \"Kha\",\n      \"Jim\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Kob\",\n      \"Lab\",\n      \"Sad\",\n      \"Afr\",\n      \"Sha\",\n      \"Lix\",\n      \"Tod\",\n      \"Sid\",\n      \"Sag\",\n      \"Tob\",\n      \"KIT\",\n      \"LIT\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM dd, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SOS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"so-so\",\n  \"localeID\": \"so_SO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_so.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"sn.\",\n      \"gn.\"\n    ],\n    \"DAY\": [\n      \"Axad\",\n      \"Isniin\",\n      \"Talaado\",\n      \"Arbaco\",\n      \"Khamiis\",\n      \"Jimco\",\n      \"Sabti\"\n    ],\n    \"ERANAMES\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"ERAS\": [\n      \"CK\",\n      \"CD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"SHORTDAY\": [\n      \"Axd\",\n      \"Isn\",\n      \"Tal\",\n      \"Arb\",\n      \"Kha\",\n      \"Jim\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Kob\",\n      \"Lab\",\n      \"Sad\",\n      \"Afr\",\n      \"Sha\",\n      \"Lix\",\n      \"Tod\",\n      \"Sid\",\n      \"Sag\",\n      \"Tob\",\n      \"KIT\",\n      \"LIT\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Bisha Koobaad\",\n      \"Bisha Labaad\",\n      \"Bisha Saddexaad\",\n      \"Bisha Afraad\",\n      \"Bisha Shanaad\",\n      \"Bisha Lixaad\",\n      \"Bisha Todobaad\",\n      \"Bisha Sideedaad\",\n      \"Bisha Sagaalaad\",\n      \"Bisha Tobnaad\",\n      \"Bisha Kow iyo Tobnaad\",\n      \"Bisha Laba iyo Tobnaad\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM dd, y\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"SOS\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"so\",\n  \"localeID\": \"so\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sq-al.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"e paradites\",\n      \"e pasdites\"\n    ],\n    \"DAY\": [\n      \"e diel\",\n      \"e h\\u00ebn\\u00eb\",\n      \"e mart\\u00eb\",\n      \"e m\\u00ebrkur\\u00eb\",\n      \"e enjte\",\n      \"e premte\",\n      \"e shtun\\u00eb\"\n    ],\n    \"ERANAMES\": [\n      \"para Krishtit\",\n      \"mbas Krishtit\"\n    ],\n    \"ERAS\": [\n      \"p.K.\",\n      \"mb.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janar\",\n      \"shkurt\",\n      \"mars\",\n      \"prill\",\n      \"maj\",\n      \"qershor\",\n      \"korrik\",\n      \"gusht\",\n      \"shtator\",\n      \"tetor\",\n      \"n\\u00ebntor\",\n      \"dhjetor\"\n    ],\n    \"SHORTDAY\": [\n      \"Die\",\n      \"H\\u00ebn\",\n      \"Mar\",\n      \"M\\u00ebr\",\n      \"Enj\",\n      \"Pre\",\n      \"Sht\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"shk\",\n      \"mar\",\n      \"pri\",\n      \"maj\",\n      \"qer\",\n      \"kor\",\n      \"gsh\",\n      \"sht\",\n      \"tet\",\n      \"n\\u00ebn\",\n      \"dhj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janar\",\n      \"Shkurt\",\n      \"Mars\",\n      \"Prill\",\n      \"Maj\",\n      \"Qershor\",\n      \"Korrik\",\n      \"Gusht\",\n      \"Shtator\",\n      \"Tetor\",\n      \"N\\u00ebntor\",\n      \"Dhjetor\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d.M.yy h:mm a\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Lek\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sq-al\",\n  \"localeID\": \"sq_AL\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sq-mk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"e paradites\",\n      \"e pasdites\"\n    ],\n    \"DAY\": [\n      \"e diel\",\n      \"e h\\u00ebn\\u00eb\",\n      \"e mart\\u00eb\",\n      \"e m\\u00ebrkur\\u00eb\",\n      \"e enjte\",\n      \"e premte\",\n      \"e shtun\\u00eb\"\n    ],\n    \"ERANAMES\": [\n      \"para Krishtit\",\n      \"mbas Krishtit\"\n    ],\n    \"ERAS\": [\n      \"p.K.\",\n      \"mb.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janar\",\n      \"shkurt\",\n      \"mars\",\n      \"prill\",\n      \"maj\",\n      \"qershor\",\n      \"korrik\",\n      \"gusht\",\n      \"shtator\",\n      \"tetor\",\n      \"n\\u00ebntor\",\n      \"dhjetor\"\n    ],\n    \"SHORTDAY\": [\n      \"Die\",\n      \"H\\u00ebn\",\n      \"Mar\",\n      \"M\\u00ebr\",\n      \"Enj\",\n      \"Pre\",\n      \"Sht\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"shk\",\n      \"mar\",\n      \"pri\",\n      \"maj\",\n      \"qer\",\n      \"kor\",\n      \"gsh\",\n      \"sht\",\n      \"tet\",\n      \"n\\u00ebn\",\n      \"dhj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janar\",\n      \"Shkurt\",\n      \"Mars\",\n      \"Prill\",\n      \"Maj\",\n      \"Qershor\",\n      \"Korrik\",\n      \"Gusht\",\n      \"Shtator\",\n      \"Tetor\",\n      \"N\\u00ebntor\",\n      \"Dhjetor\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy HH:mm\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sq-mk\",\n  \"localeID\": \"sq_MK\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sq-xk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"e paradites\",\n      \"e pasdites\"\n    ],\n    \"DAY\": [\n      \"e diel\",\n      \"e h\\u00ebn\\u00eb\",\n      \"e mart\\u00eb\",\n      \"e m\\u00ebrkur\\u00eb\",\n      \"e enjte\",\n      \"e premte\",\n      \"e shtun\\u00eb\"\n    ],\n    \"ERANAMES\": [\n      \"para Krishtit\",\n      \"mbas Krishtit\"\n    ],\n    \"ERAS\": [\n      \"p.K.\",\n      \"mb.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janar\",\n      \"shkurt\",\n      \"mars\",\n      \"prill\",\n      \"maj\",\n      \"qershor\",\n      \"korrik\",\n      \"gusht\",\n      \"shtator\",\n      \"tetor\",\n      \"n\\u00ebntor\",\n      \"dhjetor\"\n    ],\n    \"SHORTDAY\": [\n      \"Die\",\n      \"H\\u00ebn\",\n      \"Mar\",\n      \"M\\u00ebr\",\n      \"Enj\",\n      \"Pre\",\n      \"Sht\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"shk\",\n      \"mar\",\n      \"pri\",\n      \"maj\",\n      \"qer\",\n      \"kor\",\n      \"gsh\",\n      \"sht\",\n      \"tet\",\n      \"n\\u00ebn\",\n      \"dhj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janar\",\n      \"Shkurt\",\n      \"Mars\",\n      \"Prill\",\n      \"Maj\",\n      \"Qershor\",\n      \"Korrik\",\n      \"Gusht\",\n      \"Shtator\",\n      \"Tetor\",\n      \"N\\u00ebntor\",\n      \"Dhjetor\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy HH:mm\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sq-xk\",\n  \"localeID\": \"sq_XK\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"e paradites\",\n      \"e pasdites\"\n    ],\n    \"DAY\": [\n      \"e diel\",\n      \"e h\\u00ebn\\u00eb\",\n      \"e mart\\u00eb\",\n      \"e m\\u00ebrkur\\u00eb\",\n      \"e enjte\",\n      \"e premte\",\n      \"e shtun\\u00eb\"\n    ],\n    \"ERANAMES\": [\n      \"para Krishtit\",\n      \"mbas Krishtit\"\n    ],\n    \"ERAS\": [\n      \"p.K.\",\n      \"mb.K.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"janar\",\n      \"shkurt\",\n      \"mars\",\n      \"prill\",\n      \"maj\",\n      \"qershor\",\n      \"korrik\",\n      \"gusht\",\n      \"shtator\",\n      \"tetor\",\n      \"n\\u00ebntor\",\n      \"dhjetor\"\n    ],\n    \"SHORTDAY\": [\n      \"Die\",\n      \"H\\u00ebn\",\n      \"Mar\",\n      \"M\\u00ebr\",\n      \"Enj\",\n      \"Pre\",\n      \"Sht\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"shk\",\n      \"mar\",\n      \"pri\",\n      \"maj\",\n      \"qer\",\n      \"kor\",\n      \"gsh\",\n      \"sht\",\n      \"tet\",\n      \"n\\u00ebn\",\n      \"dhj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janar\",\n      \"Shkurt\",\n      \"Mars\",\n      \"Prill\",\n      \"Maj\",\n      \"Qershor\",\n      \"Korrik\",\n      \"Gusht\",\n      \"Shtator\",\n      \"Tetor\",\n      \"N\\u00ebntor\",\n      \"Dhjetor\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d.M.yy h:mm a\",\n    \"shortDate\": \"d.M.yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Lek\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sq\",\n  \"localeID\": \"sq\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-cyrl-ba.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0438\\u0458\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e \\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0458\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0438\\u0458\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0438\\u0458\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434.\",\n      \"\\u043f\\u043e\\u043d.\",\n      \"\\u0443\\u0442.\",\n      \"\\u0441\\u0440.\",\n      \"\\u0447\\u0435\\u0442.\",\n      \"\\u043f\\u0435\\u0442.\",\n      \"\\u0441\\u0443\\u0431.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d.\",\n      \"\\u0444\\u0435\\u0431.\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043f\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u0432.\",\n      \"\\u0434\\u0435\\u0446.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-cyrl-ba\",\n  \"localeID\": \"sr_Cyrl_BA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-cyrl-me.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0438\\u0458\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e \\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0458\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0438\\u0458\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0438\\u0458\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434.\",\n      \"\\u043f\\u043e\\u043d.\",\n      \"\\u0443\\u0442.\",\n      \"\\u0441\\u0440.\",\n      \"\\u0447\\u0435\\u0442.\",\n      \"\\u043f\\u0435\\u0442.\",\n      \"\\u0441\\u0443\\u0431.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d.\",\n      \"\\u0444\\u0435\\u0431.\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043f\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u0432.\",\n      \"\\u0434\\u0435\\u0446.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-cyrl-me\",\n  \"localeID\": \"sr_Cyrl_ME\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-cyrl-rs.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e \\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434\",\n      \"\\u043f\\u043e\\u043d\",\n      \"\\u0443\\u0442\\u043e\",\n      \"\\u0441\\u0440\\u0435\",\n      \"\\u0447\\u0435\\u0442\",\n      \"\\u043f\\u0435\\u0442\",\n      \"\\u0441\\u0443\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d\",\n      \"\\u0444\\u0435\\u0431\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043f\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0432\",\n      \"\\u0434\\u0435\\u0446\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-cyrl-rs\",\n  \"localeID\": \"sr_Cyrl_RS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-cyrl-xk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e \\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434.\",\n      \"\\u043f\\u043e\\u043d.\",\n      \"\\u0443\\u0442.\",\n      \"\\u0441\\u0440.\",\n      \"\\u0447\\u0435\\u0442.\",\n      \"\\u043f\\u0435\\u0442.\",\n      \"\\u0441\\u0443\\u0431.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d.\",\n      \"\\u0444\\u0435\\u0431.\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440.\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433.\",\n      \"\\u0441\\u0435\\u043f\\u0442.\",\n      \"\\u043e\\u043a\\u0442.\",\n      \"\\u043d\\u043e\\u0432.\",\n      \"\\u0434\\u0435\\u0446.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-cyrl-xk\",\n  \"localeID\": \"sr_Cyrl_XK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-cyrl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e \\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434\",\n      \"\\u043f\\u043e\\u043d\",\n      \"\\u0443\\u0442\\u043e\",\n      \"\\u0441\\u0440\\u0435\",\n      \"\\u0447\\u0435\\u0442\",\n      \"\\u043f\\u0435\\u0442\",\n      \"\\u0441\\u0443\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d\",\n      \"\\u0444\\u0435\\u0431\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043f\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0432\",\n      \"\\u0434\\u0435\\u0446\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-cyrl\",\n  \"localeID\": \"sr_Cyrl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-latn-ba.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"prije podne\",\n      \"po podne\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned.\",\n      \"pon.\",\n      \"ut.\",\n      \"sr.\",\n      \"\\u010det.\",\n      \"pet.\",\n      \"sub.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mart\",\n      \"apr.\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg.\",\n      \"sept.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"KM\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-latn-ba\",\n  \"localeID\": \"sr_Latn_BA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-latn-me.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"prije podne\",\n      \"po podne\"\n    ],\n    \"DAY\": [\n      \"nedjelja\",\n      \"ponedeljak\",\n      \"utorak\",\n      \"srijeda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"prije nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned.\",\n      \"pon.\",\n      \"ut.\",\n      \"sr.\",\n      \"\\u010det.\",\n      \"pet.\",\n      \"sub.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mart\",\n      \"apr.\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg.\",\n      \"sept.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-latn-me\",\n  \"localeID\": \"sr_Latn_ME\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-latn-rs.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"pre podne\",\n      \"po podne\"\n    ],\n    \"DAY\": [\n      \"nedelja\",\n      \"ponedeljak\",\n      \"utorak\",\n      \"sreda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"pre nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sre\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-latn-rs\",\n  \"localeID\": \"sr_Latn_RS\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-latn-xk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"pre podne\",\n      \"po podne\"\n    ],\n    \"DAY\": [\n      \"nedelja\",\n      \"ponedeljak\",\n      \"utorak\",\n      \"sreda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"pre nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned.\",\n      \"pon.\",\n      \"ut.\",\n      \"sr.\",\n      \"\\u010det.\",\n      \"pet.\",\n      \"sub.\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mart\",\n      \"apr.\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg.\",\n      \"sept.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-latn-xk\",\n  \"localeID\": \"sr_Latn_XK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr-latn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"pre podne\",\n      \"po podne\"\n    ],\n    \"DAY\": [\n      \"nedelja\",\n      \"ponedeljak\",\n      \"utorak\",\n      \"sreda\",\n      \"\\u010detvrtak\",\n      \"petak\",\n      \"subota\"\n    ],\n    \"ERANAMES\": [\n      \"pre nove ere\",\n      \"nove ere\"\n    ],\n    \"ERAS\": [\n      \"p. n. e.\",\n      \"n. e.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"SHORTDAY\": [\n      \"ned\",\n      \"pon\",\n      \"uto\",\n      \"sre\",\n      \"\\u010det\",\n      \"pet\",\n      \"sub\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan\",\n      \"feb\",\n      \"mar\",\n      \"apr\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avg\",\n      \"sep\",\n      \"okt\",\n      \"nov\",\n      \"dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januar\",\n      \"februar\",\n      \"mart\",\n      \"april\",\n      \"maj\",\n      \"jun\",\n      \"jul\",\n      \"avgust\",\n      \"septembar\",\n      \"oktobar\",\n      \"novembar\",\n      \"decembar\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr-latn\",\n  \"localeID\": \"sr_Latn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u043f\\u0440\\u0435 \\u043f\\u043e\\u0434\\u043d\\u0435\",\n      \"\\u043f\\u043e \\u043f\\u043e\\u0434\\u043d\\u0435\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\",\n      \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\",\n      \"\\u0441\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\",\n      \"\\u043f\\u0435\\u0442\\u0430\\u043a\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043f\\u0440\\u0435 \\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\",\n      \"\\u043d\\u043e\\u0432\\u0435 \\u0435\\u0440\\u0435\"\n    ],\n    \"ERAS\": [\n      \"\\u043f. \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0435\\u0434\",\n      \"\\u043f\\u043e\\u043d\",\n      \"\\u0443\\u0442\\u043e\",\n      \"\\u0441\\u0440\\u0435\",\n      \"\\u0447\\u0435\\u0442\",\n      \"\\u043f\\u0435\\u0442\",\n      \"\\u0441\\u0443\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0458\\u0430\\u043d\",\n      \"\\u0444\\u0435\\u0431\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043f\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u0432\",\n      \"\\u0434\\u0435\\u0446\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0438\\u043b\",\n      \"\\u043c\\u0430\\u0458\",\n      \"\\u0458\\u0443\\u043d\",\n      \"\\u0458\\u0443\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\",\n      \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\",\n      \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd. MMMM y.\",\n    \"longDate\": \"dd. MMMM y.\",\n    \"medium\": \"dd.MM.y. HH:mm:ss\",\n    \"mediumDate\": \"dd.MM.y.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.M.yy. HH:mm\",\n    \"shortDate\": \"d.M.yy.\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"din\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sr\",\n  \"localeID\": \"sr\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sv-ax.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"fm\",\n      \"em\"\n    ],\n    \"DAY\": [\n      \"s\\u00f6ndag\",\n      \"m\\u00e5ndag\",\n      \"tisdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f6rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f6re Kristus\",\n      \"efter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f6n\",\n      \"m\\u00e5n\",\n      \"tis\",\n      \"ons\",\n      \"tors\",\n      \"fre\",\n      \"l\\u00f6r\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mars\",\n      \"apr.\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sv-ax\",\n  \"localeID\": \"sv_AX\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sv-fi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"fm\",\n      \"em\"\n    ],\n    \"DAY\": [\n      \"s\\u00f6ndag\",\n      \"m\\u00e5ndag\",\n      \"tisdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f6rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f6re Kristus\",\n      \"efter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f6n\",\n      \"m\\u00e5n\",\n      \"tis\",\n      \"ons\",\n      \"tors\",\n      \"fre\",\n      \"l\\u00f6r\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mars\",\n      \"apr.\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd-MM-y HH:mm\",\n    \"shortDate\": \"dd-MM-y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sv-fi\",\n  \"localeID\": \"sv_FI\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sv-se.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"fm\",\n      \"em\"\n    ],\n    \"DAY\": [\n      \"s\\u00f6ndag\",\n      \"m\\u00e5ndag\",\n      \"tisdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f6rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f6re Kristus\",\n      \"efter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f6n\",\n      \"m\\u00e5n\",\n      \"tis\",\n      \"ons\",\n      \"tors\",\n      \"fre\",\n      \"l\\u00f6r\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mars\",\n      \"apr.\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sv-se\",\n  \"localeID\": \"sv_SE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sv.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"fm\",\n      \"em\"\n    ],\n    \"DAY\": [\n      \"s\\u00f6ndag\",\n      \"m\\u00e5ndag\",\n      \"tisdag\",\n      \"onsdag\",\n      \"torsdag\",\n      \"fredag\",\n      \"l\\u00f6rdag\"\n    ],\n    \"ERANAMES\": [\n      \"f\\u00f6re Kristus\",\n      \"efter Kristus\"\n    ],\n    \"ERAS\": [\n      \"f.Kr.\",\n      \"e.Kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"SHORTDAY\": [\n      \"s\\u00f6n\",\n      \"m\\u00e5n\",\n      \"tis\",\n      \"ons\",\n      \"tors\",\n      \"fre\",\n      \"l\\u00f6r\"\n    ],\n    \"SHORTMONTH\": [\n      \"jan.\",\n      \"feb.\",\n      \"mars\",\n      \"apr.\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"aug.\",\n      \"sep.\",\n      \"okt.\",\n      \"nov.\",\n      \"dec.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"januari\",\n      \"februari\",\n      \"mars\",\n      \"april\",\n      \"maj\",\n      \"juni\",\n      \"juli\",\n      \"augusti\",\n      \"september\",\n      \"oktober\",\n      \"november\",\n      \"december\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"kr\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"sv\",\n  \"localeID\": \"sv\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sw-cd.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Asubuhi\",\n      \"Mchana\"\n    ],\n    \"DAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristo\",\n      \"Baada ya Kristo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FrCD\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sw-cd\",\n  \"localeID\": \"sw_CD\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sw-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristo\",\n      \"Baada ya Kristo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sw-ke\",\n  \"localeID\": \"sw_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sw-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Asubuhi\",\n      \"Mchana\"\n    ],\n    \"DAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristo\",\n      \"Baada ya Kristo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sw-tz\",\n  \"localeID\": \"sw_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sw-ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Asubuhi\",\n      \"Mchana\"\n    ],\n    \"DAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristo\",\n      \"Baada ya Kristo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sw-ug\",\n  \"localeID\": \"sw_UG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_sw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Asubuhi\",\n      \"Mchana\"\n    ],\n    \"DAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristo\",\n      \"Baada ya Kristo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jumapili\",\n      \"Jumatatu\",\n      \"Jumanne\",\n      \"Jumatano\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprili\",\n      \"Mei\",\n      \"Juni\",\n      \"Julai\",\n      \"Agosti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"sw\",\n  \"localeID\": \"sw\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ta-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0bae\\u0bc1\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\",\n      \"\\u0baa\\u0bbf\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\"\n    ],\n    \"DAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf\\u0bb1\\u0bc1\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd\\u0bb5\\u0bbe\\u0baf\\u0bcd\",\n      \"\\u0baa\\u0bc1\\u0ba4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe\\u0bb4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd\\u0bb3\\u0bbf\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0b95\\u0bbf\\u0bb1\\u0bbf\\u0bb8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bae\\u0bc1\\u0ba9\\u0bcd\",\n      \"\\u0b85\\u0ba9\\u0bcd\\u0ba9\\u0bcb \\u0b9f\\u0bcb\\u0bae\\u0bbf\\u0ba9\\u0bbf\"\n    ],\n    \"ERAS\": [\n      \"\\u0b95\\u0bbf.\\u0bae\\u0bc1.\",\n      \"\\u0b95\\u0bbf.\\u0baa\\u0bbf.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf.\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd.\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd.\",\n      \"\\u0baa\\u0bc1\\u0ba4.\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe.\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd.\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0b9c\\u0ba9.\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd.\",\n      \"\\u0b8f\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95.\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd.\",\n      \"\\u0b85\\u0b95\\u0bcd.\",\n      \"\\u0ba8\\u0bb5.\",\n      \"\\u0b9f\\u0bbf\\u0b9a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y a h:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"a h:mm:ss\",\n    \"short\": \"d/M/yy a h:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"a h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ta-in\",\n  \"localeID\": \"ta_IN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ta-lk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0bae\\u0bc1\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\",\n      \"\\u0baa\\u0bbf\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\"\n    ],\n    \"DAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf\\u0bb1\\u0bc1\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd\\u0bb5\\u0bbe\\u0baf\\u0bcd\",\n      \"\\u0baa\\u0bc1\\u0ba4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe\\u0bb4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd\\u0bb3\\u0bbf\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0b95\\u0bbf\\u0bb1\\u0bbf\\u0bb8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bae\\u0bc1\\u0ba9\\u0bcd\",\n      \"\\u0b85\\u0ba9\\u0bcd\\u0ba9\\u0bcb \\u0b9f\\u0bcb\\u0bae\\u0bbf\\u0ba9\\u0bbf\"\n    ],\n    \"ERAS\": [\n      \"\\u0b95\\u0bbf.\\u0bae\\u0bc1.\",\n      \"\\u0b95\\u0bbf.\\u0baa\\u0bbf.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf.\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd.\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd.\",\n      \"\\u0baa\\u0bc1\\u0ba4.\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe.\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd.\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0b9c\\u0ba9.\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd.\",\n      \"\\u0b8f\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95.\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd.\",\n      \"\\u0b85\\u0b95\\u0bcd.\",\n      \"\\u0ba8\\u0bb5.\",\n      \"\\u0b9f\\u0bbf\\u0b9a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ta-lk\",\n  \"localeID\": \"ta_LK\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ta-my.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0bae\\u0bc1\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\",\n      \"\\u0baa\\u0bbf\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\"\n    ],\n    \"DAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf\\u0bb1\\u0bc1\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd\\u0bb5\\u0bbe\\u0baf\\u0bcd\",\n      \"\\u0baa\\u0bc1\\u0ba4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe\\u0bb4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd\\u0bb3\\u0bbf\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0b95\\u0bbf\\u0bb1\\u0bbf\\u0bb8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bae\\u0bc1\\u0ba9\\u0bcd\",\n      \"\\u0b85\\u0ba9\\u0bcd\\u0ba9\\u0bcb \\u0b9f\\u0bcb\\u0bae\\u0bbf\\u0ba9\\u0bbf\"\n    ],\n    \"ERAS\": [\n      \"\\u0b95\\u0bbf.\\u0bae\\u0bc1.\",\n      \"\\u0b95\\u0bbf.\\u0baa\\u0bbf.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf.\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd.\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd.\",\n      \"\\u0baa\\u0bc1\\u0ba4.\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe.\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd.\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0b9c\\u0ba9.\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd.\",\n      \"\\u0b8f\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95.\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd.\",\n      \"\\u0b85\\u0b95\\u0bcd.\",\n      \"\\u0ba8\\u0bb5.\",\n      \"\\u0b9f\\u0bbf\\u0b9a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y a h:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"a h:mm:ss\",\n    \"short\": \"d/M/yy a h:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"a h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"RM\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ta-my\",\n  \"localeID\": \"ta_MY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ta-sg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0bae\\u0bc1\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\",\n      \"\\u0baa\\u0bbf\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\"\n    ],\n    \"DAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf\\u0bb1\\u0bc1\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd\\u0bb5\\u0bbe\\u0baf\\u0bcd\",\n      \"\\u0baa\\u0bc1\\u0ba4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe\\u0bb4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd\\u0bb3\\u0bbf\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0b95\\u0bbf\\u0bb1\\u0bbf\\u0bb8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bae\\u0bc1\\u0ba9\\u0bcd\",\n      \"\\u0b85\\u0ba9\\u0bcd\\u0ba9\\u0bcb \\u0b9f\\u0bcb\\u0bae\\u0bbf\\u0ba9\\u0bbf\"\n    ],\n    \"ERAS\": [\n      \"\\u0b95\\u0bbf.\\u0bae\\u0bc1.\",\n      \"\\u0b95\\u0bbf.\\u0baa\\u0bbf.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf.\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd.\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd.\",\n      \"\\u0baa\\u0bc1\\u0ba4.\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe.\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd.\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0b9c\\u0ba9.\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd.\",\n      \"\\u0b8f\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95.\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd.\",\n      \"\\u0b85\\u0b95\\u0bcd.\",\n      \"\\u0ba8\\u0bb5.\",\n      \"\\u0b9f\\u0bbf\\u0b9a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y a h:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"a h:mm:ss\",\n    \"short\": \"d/M/yy a h:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"a h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ta-sg\",\n  \"localeID\": \"ta_SG\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ta.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0bae\\u0bc1\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\",\n      \"\\u0baa\\u0bbf\\u0bb1\\u0bcd\\u0baa\\u0b95\\u0bb2\\u0bcd\"\n    ],\n    \"DAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf\\u0bb1\\u0bc1\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd\\u0bb5\\u0bbe\\u0baf\\u0bcd\",\n      \"\\u0baa\\u0bc1\\u0ba4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe\\u0bb4\\u0ba9\\u0bcd\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd\\u0bb3\\u0bbf\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0b95\\u0bbf\\u0bb1\\u0bbf\\u0bb8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bae\\u0bc1\\u0ba9\\u0bcd\",\n      \"\\u0b85\\u0ba9\\u0bcd\\u0ba9\\u0bcb \\u0b9f\\u0bcb\\u0bae\\u0bbf\\u0ba9\\u0bbf\"\n    ],\n    \"ERAS\": [\n      \"\\u0b95\\u0bbf.\\u0bae\\u0bc1.\",\n      \"\\u0b95\\u0bbf.\\u0baa\\u0bbf.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0b9e\\u0bbe\\u0baf\\u0bbf.\",\n      \"\\u0ba4\\u0bbf\\u0b99\\u0bcd.\",\n      \"\\u0b9a\\u0bc6\\u0bb5\\u0bcd.\",\n      \"\\u0baa\\u0bc1\\u0ba4.\",\n      \"\\u0bb5\\u0bbf\\u0baf\\u0bbe.\",\n      \"\\u0bb5\\u0bc6\\u0bb3\\u0bcd.\",\n      \"\\u0b9a\\u0ba9\\u0bbf\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0b9c\\u0ba9.\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd.\",\n      \"\\u0b8f\\u0baa\\u0bcd.\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95.\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd.\",\n      \"\\u0b85\\u0b95\\u0bcd.\",\n      \"\\u0ba8\\u0bb5.\",\n      \"\\u0b9f\\u0bbf\\u0b9a.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0b9c\\u0ba9\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0baa\\u0bbf\\u0baa\\u0bcd\\u0bb0\\u0bb5\\u0bb0\\u0bbf\",\n      \"\\u0bae\\u0bbe\\u0bb0\\u0bcd\\u0b9a\\u0bcd\",\n      \"\\u0b8f\\u0baa\\u0bcd\\u0bb0\\u0bb2\\u0bcd\",\n      \"\\u0bae\\u0bc7\",\n      \"\\u0b9c\\u0bc2\\u0ba9\\u0bcd\",\n      \"\\u0b9c\\u0bc2\\u0bb2\\u0bc8\",\n      \"\\u0b86\\u0b95\\u0bb8\\u0bcd\\u0b9f\\u0bcd\",\n      \"\\u0b9a\\u0bc6\\u0baa\\u0bcd\\u0b9f\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b85\\u0b95\\u0bcd\\u0b9f\\u0bcb\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0ba8\\u0bb5\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\",\n      \"\\u0b9f\\u0bbf\\u0b9a\\u0bae\\u0bcd\\u0baa\\u0bb0\\u0bcd\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y a h:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"a h:mm:ss\",\n    \"short\": \"d/M/yy a h:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"a h:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ta\",\n  \"localeID\": \"ta\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_te-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0c06\\u0c26\\u0c3f\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c38\\u0c4b\\u0c2e\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c2e\\u0c02\\u0c17\\u0c33\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c2c\\u0c41\\u0c27\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c17\\u0c41\\u0c30\\u0c41\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c36\\u0c41\\u0c15\\u0c4d\\u0c30\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c36\\u0c28\\u0c3f\\u0c35\\u0c3e\\u0c30\\u0c02\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c38\\u0c4d\\u0c24\\u0c41 \\u0c2a\\u0c42\\u0c30\\u0c4d\\u0c35\\u0c02\",\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c38\\u0c4d\\u0c24\\u0c41 \\u0c36\\u0c15\\u0c02\"\n    ],\n    \"ERAS\": [\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c2a\\u0c42\",\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c36\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0c1c\\u0c28\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2b\\u0c3f\\u0c2c\\u0c4d\\u0c30\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2e\\u0c3e\\u0c30\\u0c4d\\u0c1a\\u0c3f\",\n      \"\\u0c0f\\u0c2a\\u0c4d\\u0c30\\u0c3f\\u0c32\\u0c4d\",\n      \"\\u0c2e\\u0c47\",\n      \"\\u0c1c\\u0c42\\u0c28\\u0c4d\",\n      \"\\u0c1c\\u0c41\\u0c32\\u0c48\",\n      \"\\u0c06\\u0c17\\u0c38\\u0c4d\\u0c1f\\u0c41\",\n      \"\\u0c38\\u0c46\\u0c2a\\u0c4d\\u0c1f\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c05\\u0c15\\u0c4d\\u0c1f\\u0c4b\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c28\\u0c35\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c21\\u0c3f\\u0c38\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0c06\\u0c26\\u0c3f\",\n      \"\\u0c38\\u0c4b\\u0c2e\",\n      \"\\u0c2e\\u0c02\\u0c17\\u0c33\",\n      \"\\u0c2c\\u0c41\\u0c27\",\n      \"\\u0c17\\u0c41\\u0c30\\u0c41\",\n      \"\\u0c36\\u0c41\\u0c15\\u0c4d\\u0c30\",\n      \"\\u0c36\\u0c28\\u0c3f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0c1c\\u0c28\",\n      \"\\u0c2b\\u0c3f\\u0c2c\\u0c4d\\u0c30\",\n      \"\\u0c2e\\u0c3e\\u0c30\\u0c4d\\u0c1a\\u0c3f\",\n      \"\\u0c0f\\u0c2a\\u0c4d\\u0c30\\u0c3f\",\n      \"\\u0c2e\\u0c47\",\n      \"\\u0c1c\\u0c42\\u0c28\\u0c4d\",\n      \"\\u0c1c\\u0c41\\u0c32\\u0c48\",\n      \"\\u0c06\\u0c17\",\n      \"\\u0c38\\u0c46\\u0c2a\\u0c4d\\u0c1f\\u0c46\\u0c02\",\n      \"\\u0c05\\u0c15\\u0c4d\\u0c1f\\u0c4b\",\n      \"\\u0c28\\u0c35\\u0c02\",\n      \"\\u0c21\\u0c3f\\u0c38\\u0c46\\u0c02\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0c1c\\u0c28\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2b\\u0c3f\\u0c2c\\u0c4d\\u0c30\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2e\\u0c3e\\u0c30\\u0c4d\\u0c1a\\u0c3f\",\n      \"\\u0c0f\\u0c2a\\u0c4d\\u0c30\\u0c3f\\u0c32\\u0c4d\",\n      \"\\u0c2e\\u0c47\",\n      \"\\u0c1c\\u0c42\\u0c28\\u0c4d\",\n      \"\\u0c1c\\u0c41\\u0c32\\u0c48\",\n      \"\\u0c06\\u0c17\\u0c38\\u0c4d\\u0c1f\\u0c41\",\n      \"\\u0c38\\u0c46\\u0c2a\\u0c4d\\u0c1f\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c05\\u0c15\\u0c4d\\u0c1f\\u0c4b\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c28\\u0c35\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c21\\u0c3f\\u0c38\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"d, MMMM y, EEEE\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd-MM-yy h:mm a\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"te-in\",\n  \"localeID\": \"te_IN\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_te.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0c06\\u0c26\\u0c3f\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c38\\u0c4b\\u0c2e\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c2e\\u0c02\\u0c17\\u0c33\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c2c\\u0c41\\u0c27\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c17\\u0c41\\u0c30\\u0c41\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c36\\u0c41\\u0c15\\u0c4d\\u0c30\\u0c35\\u0c3e\\u0c30\\u0c02\",\n      \"\\u0c36\\u0c28\\u0c3f\\u0c35\\u0c3e\\u0c30\\u0c02\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c38\\u0c4d\\u0c24\\u0c41 \\u0c2a\\u0c42\\u0c30\\u0c4d\\u0c35\\u0c02\",\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c38\\u0c4d\\u0c24\\u0c41 \\u0c36\\u0c15\\u0c02\"\n    ],\n    \"ERAS\": [\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c2a\\u0c42\",\n      \"\\u0c15\\u0c4d\\u0c30\\u0c40\\u0c36\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0c1c\\u0c28\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2b\\u0c3f\\u0c2c\\u0c4d\\u0c30\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2e\\u0c3e\\u0c30\\u0c4d\\u0c1a\\u0c3f\",\n      \"\\u0c0f\\u0c2a\\u0c4d\\u0c30\\u0c3f\\u0c32\\u0c4d\",\n      \"\\u0c2e\\u0c47\",\n      \"\\u0c1c\\u0c42\\u0c28\\u0c4d\",\n      \"\\u0c1c\\u0c41\\u0c32\\u0c48\",\n      \"\\u0c06\\u0c17\\u0c38\\u0c4d\\u0c1f\\u0c41\",\n      \"\\u0c38\\u0c46\\u0c2a\\u0c4d\\u0c1f\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c05\\u0c15\\u0c4d\\u0c1f\\u0c4b\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c28\\u0c35\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c21\\u0c3f\\u0c38\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0c06\\u0c26\\u0c3f\",\n      \"\\u0c38\\u0c4b\\u0c2e\",\n      \"\\u0c2e\\u0c02\\u0c17\\u0c33\",\n      \"\\u0c2c\\u0c41\\u0c27\",\n      \"\\u0c17\\u0c41\\u0c30\\u0c41\",\n      \"\\u0c36\\u0c41\\u0c15\\u0c4d\\u0c30\",\n      \"\\u0c36\\u0c28\\u0c3f\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0c1c\\u0c28\",\n      \"\\u0c2b\\u0c3f\\u0c2c\\u0c4d\\u0c30\",\n      \"\\u0c2e\\u0c3e\\u0c30\\u0c4d\\u0c1a\\u0c3f\",\n      \"\\u0c0f\\u0c2a\\u0c4d\\u0c30\\u0c3f\",\n      \"\\u0c2e\\u0c47\",\n      \"\\u0c1c\\u0c42\\u0c28\\u0c4d\",\n      \"\\u0c1c\\u0c41\\u0c32\\u0c48\",\n      \"\\u0c06\\u0c17\",\n      \"\\u0c38\\u0c46\\u0c2a\\u0c4d\\u0c1f\\u0c46\\u0c02\",\n      \"\\u0c05\\u0c15\\u0c4d\\u0c1f\\u0c4b\",\n      \"\\u0c28\\u0c35\\u0c02\",\n      \"\\u0c21\\u0c3f\\u0c38\\u0c46\\u0c02\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0c1c\\u0c28\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2b\\u0c3f\\u0c2c\\u0c4d\\u0c30\\u0c35\\u0c30\\u0c3f\",\n      \"\\u0c2e\\u0c3e\\u0c30\\u0c4d\\u0c1a\\u0c3f\",\n      \"\\u0c0f\\u0c2a\\u0c4d\\u0c30\\u0c3f\\u0c32\\u0c4d\",\n      \"\\u0c2e\\u0c47\",\n      \"\\u0c1c\\u0c42\\u0c28\\u0c4d\",\n      \"\\u0c1c\\u0c41\\u0c32\\u0c48\",\n      \"\\u0c06\\u0c17\\u0c38\\u0c4d\\u0c1f\\u0c41\",\n      \"\\u0c38\\u0c46\\u0c2a\\u0c4d\\u0c1f\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c05\\u0c15\\u0c4d\\u0c1f\\u0c4b\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c28\\u0c35\\u0c02\\u0c2c\\u0c30\\u0c4d\",\n      \"\\u0c21\\u0c3f\\u0c38\\u0c46\\u0c02\\u0c2c\\u0c30\\u0c4d\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"d, MMMM y, EEEE\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y h:mm:ss a\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd-MM-yy h:mm a\",\n    \"shortDate\": \"dd-MM-yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"te\",\n  \"localeID\": \"te\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_teo-ke.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Taparachu\",\n      \"Ebongi\"\n    ],\n    \"DAY\": [\n      \"Nakaejuma\",\n      \"Nakaebarasa\",\n      \"Nakaare\",\n      \"Nakauni\",\n      \"Nakaung\\u2019on\",\n      \"Nakakany\",\n      \"Nakasabiti\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Christo\",\n      \"Baada ya Christo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Orara\",\n      \"Omuk\",\n      \"Okwamg\\u2019\",\n      \"Odung\\u2019el\",\n      \"Omaruk\",\n      \"Omodok\\u2019king\\u2019ol\",\n      \"Ojola\",\n      \"Opedel\",\n      \"Osokosokoma\",\n      \"Otibar\",\n      \"Olabor\",\n      \"Opoo\"\n    ],\n    \"SHORTDAY\": [\n      \"Jum\",\n      \"Bar\",\n      \"Aar\",\n      \"Uni\",\n      \"Ung\",\n      \"Kan\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Rar\",\n      \"Muk\",\n      \"Kwa\",\n      \"Dun\",\n      \"Mar\",\n      \"Mod\",\n      \"Jol\",\n      \"Ped\",\n      \"Sok\",\n      \"Tib\",\n      \"Lab\",\n      \"Poo\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Orara\",\n      \"Omuk\",\n      \"Okwamg\\u2019\",\n      \"Odung\\u2019el\",\n      \"Omaruk\",\n      \"Omodok\\u2019king\\u2019ol\",\n      \"Ojola\",\n      \"Opedel\",\n      \"Osokosokoma\",\n      \"Otibar\",\n      \"Olabor\",\n      \"Opoo\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Ksh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"teo-ke\",\n  \"localeID\": \"teo_KE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_teo-ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Taparachu\",\n      \"Ebongi\"\n    ],\n    \"DAY\": [\n      \"Nakaejuma\",\n      \"Nakaebarasa\",\n      \"Nakaare\",\n      \"Nakauni\",\n      \"Nakaung\\u2019on\",\n      \"Nakakany\",\n      \"Nakasabiti\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Christo\",\n      \"Baada ya Christo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Orara\",\n      \"Omuk\",\n      \"Okwamg\\u2019\",\n      \"Odung\\u2019el\",\n      \"Omaruk\",\n      \"Omodok\\u2019king\\u2019ol\",\n      \"Ojola\",\n      \"Opedel\",\n      \"Osokosokoma\",\n      \"Otibar\",\n      \"Olabor\",\n      \"Opoo\"\n    ],\n    \"SHORTDAY\": [\n      \"Jum\",\n      \"Bar\",\n      \"Aar\",\n      \"Uni\",\n      \"Ung\",\n      \"Kan\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Rar\",\n      \"Muk\",\n      \"Kwa\",\n      \"Dun\",\n      \"Mar\",\n      \"Mod\",\n      \"Jol\",\n      \"Ped\",\n      \"Sok\",\n      \"Tib\",\n      \"Lab\",\n      \"Poo\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Orara\",\n      \"Omuk\",\n      \"Okwamg\\u2019\",\n      \"Odung\\u2019el\",\n      \"Omaruk\",\n      \"Omodok\\u2019king\\u2019ol\",\n      \"Ojola\",\n      \"Opedel\",\n      \"Osokosokoma\",\n      \"Otibar\",\n      \"Olabor\",\n      \"Opoo\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"teo-ug\",\n  \"localeID\": \"teo_UG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_teo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Taparachu\",\n      \"Ebongi\"\n    ],\n    \"DAY\": [\n      \"Nakaejuma\",\n      \"Nakaebarasa\",\n      \"Nakaare\",\n      \"Nakauni\",\n      \"Nakaung\\u2019on\",\n      \"Nakakany\",\n      \"Nakasabiti\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Christo\",\n      \"Baada ya Christo\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Orara\",\n      \"Omuk\",\n      \"Okwamg\\u2019\",\n      \"Odung\\u2019el\",\n      \"Omaruk\",\n      \"Omodok\\u2019king\\u2019ol\",\n      \"Ojola\",\n      \"Opedel\",\n      \"Osokosokoma\",\n      \"Otibar\",\n      \"Olabor\",\n      \"Opoo\"\n    ],\n    \"SHORTDAY\": [\n      \"Jum\",\n      \"Bar\",\n      \"Aar\",\n      \"Uni\",\n      \"Ung\",\n      \"Kan\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Rar\",\n      \"Muk\",\n      \"Kwa\",\n      \"Dun\",\n      \"Mar\",\n      \"Mod\",\n      \"Jol\",\n      \"Ped\",\n      \"Sok\",\n      \"Tib\",\n      \"Lab\",\n      \"Poo\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Orara\",\n      \"Omuk\",\n      \"Okwamg\\u2019\",\n      \"Odung\\u2019el\",\n      \"Omaruk\",\n      \"Omodok\\u2019king\\u2019ol\",\n      \"Ojola\",\n      \"Opedel\",\n      \"Osokosokoma\",\n      \"Otibar\",\n      \"Olabor\",\n      \"Opoo\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"teo\",\n  \"localeID\": \"teo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_th-th.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0e01\\u0e48\\u0e2d\\u0e19\\u0e40\\u0e17\\u0e35\\u0e48\\u0e22\\u0e07\",\n      \"\\u0e2b\\u0e25\\u0e31\\u0e07\\u0e40\\u0e17\\u0e35\\u0e48\\u0e22\\u0e07\"\n    ],\n    \"DAY\": [\n      \"\\u0e27\\u0e31\\u0e19\\u0e2d\\u0e32\\u0e17\\u0e34\\u0e15\\u0e22\\u0e4c\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e08\\u0e31\\u0e19\\u0e17\\u0e23\\u0e4c\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e2d\\u0e31\\u0e07\\u0e04\\u0e32\\u0e23\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e1e\\u0e38\\u0e18\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e1e\\u0e24\\u0e2b\\u0e31\\u0e2a\\u0e1a\\u0e14\\u0e35\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e28\\u0e38\\u0e01\\u0e23\\u0e4c\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e40\\u0e2a\\u0e32\\u0e23\\u0e4c\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0e1b\\u0e35\\u0e01\\u0e48\\u0e2d\\u0e19\\u0e04\\u0e23\\u0e34\\u0e2a\\u0e15\\u0e4c\\u0e28\\u0e31\\u0e01\\u0e23\\u0e32\\u0e0a\",\n      \"\\u0e04\\u0e23\\u0e34\\u0e2a\\u0e15\\u0e4c\\u0e28\\u0e31\\u0e01\\u0e23\\u0e32\\u0e0a\"\n    ],\n    \"ERAS\": [\n      \"\\u0e1b\\u0e35\\u0e01\\u0e48\\u0e2d\\u0e19 \\u0e04.\\u0e28.\",\n      \"\\u0e04.\\u0e28.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0e21\\u0e01\\u0e23\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e38\\u0e21\\u0e20\\u0e32\\u0e1e\\u0e31\\u0e19\\u0e18\\u0e4c\",\n      \"\\u0e21\\u0e35\\u0e19\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e40\\u0e21\\u0e29\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e1e\\u0e24\\u0e29\\u0e20\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e21\\u0e34\\u0e16\\u0e38\\u0e19\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e01\\u0e23\\u0e01\\u0e0e\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e2a\\u0e34\\u0e07\\u0e2b\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e15\\u0e38\\u0e25\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e1e\\u0e24\\u0e28\\u0e08\\u0e34\\u0e01\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e18\\u0e31\\u0e19\\u0e27\\u0e32\\u0e04\\u0e21\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0e2d\\u0e32.\",\n      \"\\u0e08.\",\n      \"\\u0e2d.\",\n      \"\\u0e1e.\",\n      \"\\u0e1e\\u0e24.\",\n      \"\\u0e28.\",\n      \"\\u0e2a.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0e21.\\u0e04.\",\n      \"\\u0e01.\\u0e1e.\",\n      \"\\u0e21\\u0e35.\\u0e04.\",\n      \"\\u0e40\\u0e21.\\u0e22.\",\n      \"\\u0e1e.\\u0e04.\",\n      \"\\u0e21\\u0e34.\\u0e22.\",\n      \"\\u0e01.\\u0e04.\",\n      \"\\u0e2a.\\u0e04.\",\n      \"\\u0e01.\\u0e22.\",\n      \"\\u0e15.\\u0e04.\",\n      \"\\u0e1e.\\u0e22.\",\n      \"\\u0e18.\\u0e04.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0e21\\u0e01\\u0e23\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e38\\u0e21\\u0e20\\u0e32\\u0e1e\\u0e31\\u0e19\\u0e18\\u0e4c\",\n      \"\\u0e21\\u0e35\\u0e19\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e40\\u0e21\\u0e29\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e1e\\u0e24\\u0e29\\u0e20\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e21\\u0e34\\u0e16\\u0e38\\u0e19\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e01\\u0e23\\u0e01\\u0e0e\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e2a\\u0e34\\u0e07\\u0e2b\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e15\\u0e38\\u0e25\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e1e\\u0e24\\u0e28\\u0e08\\u0e34\\u0e01\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e18\\u0e31\\u0e19\\u0e27\\u0e32\\u0e04\\u0e21\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u0e17\\u0e35\\u0e48 d MMMM G y\",\n    \"longDate\": \"d MMMM G y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u0e3f\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"th-th\",\n  \"localeID\": \"th_TH\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_th.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0e01\\u0e48\\u0e2d\\u0e19\\u0e40\\u0e17\\u0e35\\u0e48\\u0e22\\u0e07\",\n      \"\\u0e2b\\u0e25\\u0e31\\u0e07\\u0e40\\u0e17\\u0e35\\u0e48\\u0e22\\u0e07\"\n    ],\n    \"DAY\": [\n      \"\\u0e27\\u0e31\\u0e19\\u0e2d\\u0e32\\u0e17\\u0e34\\u0e15\\u0e22\\u0e4c\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e08\\u0e31\\u0e19\\u0e17\\u0e23\\u0e4c\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e2d\\u0e31\\u0e07\\u0e04\\u0e32\\u0e23\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e1e\\u0e38\\u0e18\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e1e\\u0e24\\u0e2b\\u0e31\\u0e2a\\u0e1a\\u0e14\\u0e35\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e28\\u0e38\\u0e01\\u0e23\\u0e4c\",\n      \"\\u0e27\\u0e31\\u0e19\\u0e40\\u0e2a\\u0e32\\u0e23\\u0e4c\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0e1b\\u0e35\\u0e01\\u0e48\\u0e2d\\u0e19\\u0e04\\u0e23\\u0e34\\u0e2a\\u0e15\\u0e4c\\u0e28\\u0e31\\u0e01\\u0e23\\u0e32\\u0e0a\",\n      \"\\u0e04\\u0e23\\u0e34\\u0e2a\\u0e15\\u0e4c\\u0e28\\u0e31\\u0e01\\u0e23\\u0e32\\u0e0a\"\n    ],\n    \"ERAS\": [\n      \"\\u0e1b\\u0e35\\u0e01\\u0e48\\u0e2d\\u0e19 \\u0e04.\\u0e28.\",\n      \"\\u0e04.\\u0e28.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u0e21\\u0e01\\u0e23\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e38\\u0e21\\u0e20\\u0e32\\u0e1e\\u0e31\\u0e19\\u0e18\\u0e4c\",\n      \"\\u0e21\\u0e35\\u0e19\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e40\\u0e21\\u0e29\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e1e\\u0e24\\u0e29\\u0e20\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e21\\u0e34\\u0e16\\u0e38\\u0e19\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e01\\u0e23\\u0e01\\u0e0e\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e2a\\u0e34\\u0e07\\u0e2b\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e15\\u0e38\\u0e25\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e1e\\u0e24\\u0e28\\u0e08\\u0e34\\u0e01\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e18\\u0e31\\u0e19\\u0e27\\u0e32\\u0e04\\u0e21\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0e2d\\u0e32.\",\n      \"\\u0e08.\",\n      \"\\u0e2d.\",\n      \"\\u0e1e.\",\n      \"\\u0e1e\\u0e24.\",\n      \"\\u0e28.\",\n      \"\\u0e2a.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0e21.\\u0e04.\",\n      \"\\u0e01.\\u0e1e.\",\n      \"\\u0e21\\u0e35.\\u0e04.\",\n      \"\\u0e40\\u0e21.\\u0e22.\",\n      \"\\u0e1e.\\u0e04.\",\n      \"\\u0e21\\u0e34.\\u0e22.\",\n      \"\\u0e01.\\u0e04.\",\n      \"\\u0e2a.\\u0e04.\",\n      \"\\u0e01.\\u0e22.\",\n      \"\\u0e15.\\u0e04.\",\n      \"\\u0e1e.\\u0e22.\",\n      \"\\u0e18.\\u0e04.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0e21\\u0e01\\u0e23\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e38\\u0e21\\u0e20\\u0e32\\u0e1e\\u0e31\\u0e19\\u0e18\\u0e4c\",\n      \"\\u0e21\\u0e35\\u0e19\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e40\\u0e21\\u0e29\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e1e\\u0e24\\u0e29\\u0e20\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e21\\u0e34\\u0e16\\u0e38\\u0e19\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e01\\u0e23\\u0e01\\u0e0e\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e2a\\u0e34\\u0e07\\u0e2b\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e01\\u0e31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e15\\u0e38\\u0e25\\u0e32\\u0e04\\u0e21\",\n      \"\\u0e1e\\u0e24\\u0e28\\u0e08\\u0e34\\u0e01\\u0e32\\u0e22\\u0e19\",\n      \"\\u0e18\\u0e31\\u0e19\\u0e27\\u0e32\\u0e04\\u0e21\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u0e17\\u0e35\\u0e48 d MMMM G y\",\n    \"longDate\": \"d MMMM G y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/yy HH:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u0e3f\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"th\",\n  \"localeID\": \"th\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ti-er.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u1295\\u1309\\u1206 \\u1230\\u12d3\\u1270\",\n      \"\\u12f5\\u1215\\u122d \\u1230\\u12d3\\u1275\"\n    ],\n    \"DAY\": [\n      \"\\u1230\\u1295\\u1260\\u1275\",\n      \"\\u1230\\u1291\\u12ed\",\n      \"\\u1220\\u1209\\u1235\",\n      \"\\u1228\\u1261\\u12d5\",\n      \"\\u1283\\u1219\\u1235\",\n      \"\\u12d3\\u122d\\u1262\",\n      \"\\u1240\\u12f3\\u121d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u12d3\\u1218\\u1270 \\u12d3\\u1208\\u121d\",\n      \"\\u12d3\\u1218\\u1270 \\u121d\\u1205\\u1228\\u1275\"\n    ],\n    \"ERAS\": [\n      \"\\u12d3/\\u12d3\",\n      \"\\u12d3/\\u121d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\\u1272\\u1275\",\n      \"\\u1218\\u130b\\u1262\\u1275\",\n      \"\\u121a\\u12eb\\u12dd\\u12eb\",\n      \"\\u130d\\u1295\\u1266\\u1275\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\\u1208\",\n      \"\\u1290\\u1213\\u1230\",\n      \"\\u1218\\u1235\\u12a8\\u1228\\u121d\",\n      \"\\u1325\\u1245\\u121d\\u1272\",\n      \"\\u1215\\u12f3\\u122d\",\n      \"\\u1273\\u1215\\u1233\\u1235\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u1230\\u1295\",\n      \"\\u1230\\u1291\",\n      \"\\u1230\\u1209\",\n      \"\\u1228\\u1261\",\n      \"\\u1213\\u1219\",\n      \"\\u12d3\\u122d\",\n      \"\\u1240\\u12f3\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\",\n      \"\\u1218\\u130b\",\n      \"\\u121a\\u12eb\",\n      \"\\u130d\\u1295\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\",\n      \"\\u1290\\u1213\",\n      \"\\u1218\\u1235\",\n      \"\\u1325\\u1245\",\n      \"\\u1215\\u12f3\",\n      \"\\u1273\\u1215\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\\u1272\\u1275\",\n      \"\\u1218\\u130b\\u1262\\u1275\",\n      \"\\u121a\\u12eb\\u12dd\\u12eb\",\n      \"\\u130d\\u1295\\u1266\\u1275\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\\u1208\",\n      \"\\u1290\\u1213\\u1230\",\n      \"\\u1218\\u1235\\u12a8\\u1228\\u121d\",\n      \"\\u1325\\u1245\\u121d\\u1272\",\n      \"\\u1215\\u12f3\\u122d\",\n      \"\\u1273\\u1215\\u1233\\u1235\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u1363 dd MMMM \\u1218\\u12d3\\u120d\\u1272 y G\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Nfk\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ti-er\",\n  \"localeID\": \"ti_ER\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ti-et.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u1295\\u1309\\u1206 \\u1230\\u12d3\\u1270\",\n      \"\\u12f5\\u1215\\u122d \\u1230\\u12d3\\u1275\"\n    ],\n    \"DAY\": [\n      \"\\u1230\\u1295\\u1260\\u1275\",\n      \"\\u1230\\u1291\\u12ed\",\n      \"\\u1220\\u1209\\u1235\",\n      \"\\u1228\\u1261\\u12d5\",\n      \"\\u1283\\u1219\\u1235\",\n      \"\\u12d3\\u122d\\u1262\",\n      \"\\u1240\\u12f3\\u121d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u12d3/\\u12d3\",\n      \"\\u12d3\\u1218\\u1270 \\u121d\\u1205\\u1228\\u1275\"\n    ],\n    \"ERAS\": [\n      \"\\u12d3/\\u12d3\",\n      \"\\u12d3/\\u121d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\\u1272\\u1275\",\n      \"\\u1218\\u130b\\u1262\\u1275\",\n      \"\\u121a\\u12eb\\u12dd\\u12eb\",\n      \"\\u130d\\u1295\\u1266\\u1275\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\\u1208\",\n      \"\\u1290\\u1213\\u1230\",\n      \"\\u1218\\u1235\\u12a8\\u1228\\u121d\",\n      \"\\u1325\\u1245\\u121d\\u1272\",\n      \"\\u1215\\u12f3\\u122d\",\n      \"\\u1273\\u1215\\u1233\\u1235\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u1230\\u1295\",\n      \"\\u1230\\u1291\",\n      \"\\u1230\\u1209\",\n      \"\\u1228\\u1261\",\n      \"\\u1213\\u1219\",\n      \"\\u12d3\\u122d\",\n      \"\\u1240\\u12f3\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\",\n      \"\\u1218\\u130b\",\n      \"\\u121a\\u12eb\",\n      \"\\u130d\\u1295\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\",\n      \"\\u1290\\u1213\",\n      \"\\u1218\\u1235\",\n      \"\\u1325\\u1245\",\n      \"\\u1215\\u12f3\",\n      \"\\u1273\\u1215\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\\u1272\\u1275\",\n      \"\\u1218\\u130b\\u1262\\u1275\",\n      \"\\u121a\\u12eb\\u12dd\\u12eb\",\n      \"\\u130d\\u1295\\u1266\\u1275\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\\u1208\",\n      \"\\u1290\\u1213\\u1230\",\n      \"\\u1218\\u1235\\u12a8\\u1228\\u121d\",\n      \"\\u1325\\u1245\\u121d\\u1272\",\n      \"\\u1215\\u12f3\\u122d\",\n      \"\\u1273\\u1215\\u1233\\u1235\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u1363 dd MMMM \\u1218\\u12d3\\u120d\\u1272 y G\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Birr\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ti-et\",\n  \"localeID\": \"ti_ET\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ti.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u1295\\u1309\\u1206 \\u1230\\u12d3\\u1270\",\n      \"\\u12f5\\u1215\\u122d \\u1230\\u12d3\\u1275\"\n    ],\n    \"DAY\": [\n      \"\\u1230\\u1295\\u1260\\u1275\",\n      \"\\u1230\\u1291\\u12ed\",\n      \"\\u1220\\u1209\\u1235\",\n      \"\\u1228\\u1261\\u12d5\",\n      \"\\u1283\\u1219\\u1235\",\n      \"\\u12d3\\u122d\\u1262\",\n      \"\\u1240\\u12f3\\u121d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u12d3/\\u12d3\",\n      \"\\u12d3\\u1218\\u1270 \\u121d\\u1205\\u1228\\u1275\"\n    ],\n    \"ERAS\": [\n      \"\\u12d3/\\u12d3\",\n      \"\\u12d3/\\u121d\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\\u1272\\u1275\",\n      \"\\u1218\\u130b\\u1262\\u1275\",\n      \"\\u121a\\u12eb\\u12dd\\u12eb\",\n      \"\\u130d\\u1295\\u1266\\u1275\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\\u1208\",\n      \"\\u1290\\u1213\\u1230\",\n      \"\\u1218\\u1235\\u12a8\\u1228\\u121d\",\n      \"\\u1325\\u1245\\u121d\\u1272\",\n      \"\\u1215\\u12f3\\u122d\",\n      \"\\u1273\\u1215\\u1233\\u1235\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u1230\\u1295\",\n      \"\\u1230\\u1291\",\n      \"\\u1230\\u1209\",\n      \"\\u1228\\u1261\",\n      \"\\u1213\\u1219\",\n      \"\\u12d3\\u122d\",\n      \"\\u1240\\u12f3\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\",\n      \"\\u1218\\u130b\",\n      \"\\u121a\\u12eb\",\n      \"\\u130d\\u1295\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\",\n      \"\\u1290\\u1213\",\n      \"\\u1218\\u1235\",\n      \"\\u1325\\u1245\",\n      \"\\u1215\\u12f3\",\n      \"\\u1273\\u1215\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u1325\\u122a\",\n      \"\\u1208\\u12ab\\u1272\\u1275\",\n      \"\\u1218\\u130b\\u1262\\u1275\",\n      \"\\u121a\\u12eb\\u12dd\\u12eb\",\n      \"\\u130d\\u1295\\u1266\\u1275\",\n      \"\\u1230\\u1290\",\n      \"\\u1213\\u121d\\u1208\",\n      \"\\u1290\\u1213\\u1230\",\n      \"\\u1218\\u1235\\u12a8\\u1228\\u121d\",\n      \"\\u1325\\u1245\\u121d\\u1272\",\n      \"\\u1215\\u12f3\\u122d\",\n      \"\\u1273\\u1215\\u1233\\u1235\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u1363 dd MMMM \\u1218\\u12d3\\u120d\\u1272 y G\",\n    \"longDate\": \"dd MMMM y\",\n    \"medium\": \"dd-MMM-y h:mm:ss a\",\n    \"mediumDate\": \"dd-MMM-y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/yy h:mm a\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Birr\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ti\",\n  \"localeID\": \"ti\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tk-tm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u00fdek\\u015fenbe\",\n      \"du\\u015fenbe\",\n      \"si\\u015fenbe\",\n      \"\\u00e7ar\\u015fenbe\",\n      \"pen\\u015fenbe\",\n      \"anna\",\n      \"\\u015fenbe\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u00fdanwar\",\n      \"fewral\",\n      \"mart\",\n      \"aprel\",\n      \"ma\\u00fd\",\n      \"i\\u00fdun\",\n      \"i\\u00fdul\",\n      \"awgust\",\n      \"sent\\u00fdabr\",\n      \"okt\\u00fdabr\",\n      \"no\\u00fdabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u00fdb\",\n      \"db\",\n      \"sb\",\n      \"\\u00e7b\",\n      \"pb\",\n      \"an\",\n      \"\\u015fb\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u00fdan\",\n      \"few\",\n      \"mart\",\n      \"apr\",\n      \"ma\\u00fd\",\n      \"i\\u00fdun\",\n      \"i\\u00fdul\",\n      \"awg\",\n      \"sen\",\n      \"okt\",\n      \"no\\u00fd\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u00fdanwar\",\n      \"fewral\",\n      \"mart\",\n      \"aprel\",\n      \"ma\\u00fd\",\n      \"i\\u00fdun\",\n      \"i\\u00fdul\",\n      \"awgust\",\n      \"sent\\u00fdabr\",\n      \"okt\\u00fdabr\",\n      \"no\\u00fdabr\",\n      \"dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TMT\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"tk-tm\",\n  \"localeID\": \"tk_TM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u00fdek\\u015fenbe\",\n      \"du\\u015fenbe\",\n      \"si\\u015fenbe\",\n      \"\\u00e7ar\\u015fenbe\",\n      \"pen\\u015fenbe\",\n      \"anna\",\n      \"\\u015fenbe\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u00fdanwar\",\n      \"fewral\",\n      \"mart\",\n      \"aprel\",\n      \"ma\\u00fd\",\n      \"i\\u00fdun\",\n      \"i\\u00fdul\",\n      \"awgust\",\n      \"sent\\u00fdabr\",\n      \"okt\\u00fdabr\",\n      \"no\\u00fdabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u00fdb\",\n      \"db\",\n      \"sb\",\n      \"\\u00e7b\",\n      \"pb\",\n      \"an\",\n      \"\\u015fb\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u00fdan\",\n      \"few\",\n      \"mart\",\n      \"apr\",\n      \"ma\\u00fd\",\n      \"i\\u00fdun\",\n      \"i\\u00fdul\",\n      \"awg\",\n      \"sen\",\n      \"okt\",\n      \"no\\u00fd\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u00fdanwar\",\n      \"fewral\",\n      \"mart\",\n      \"aprel\",\n      \"ma\\u00fd\",\n      \"i\\u00fdun\",\n      \"i\\u00fdul\",\n      \"awgust\",\n      \"sent\\u00fdabr\",\n      \"okt\\u00fdabr\",\n      \"no\\u00fdabr\",\n      \"dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.y HH:mm\",\n    \"shortDate\": \"dd.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TMT\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"tk\",\n  \"localeID\": \"tk\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Linggo\",\n      \"Lunes\",\n      \"Martes\",\n      \"Miyerkules\",\n      \"Huwebes\",\n      \"Biyernes\",\n      \"Sabado\"\n    ],\n    \"ERANAMES\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"Enero\",\n      \"Pebrero\",\n      \"Marso\",\n      \"Abril\",\n      \"Mayo\",\n      \"Hunyo\",\n      \"Hulyo\",\n      \"Agosto\",\n      \"Setyembre\",\n      \"Oktubre\",\n      \"Nobyembre\",\n      \"Disyembre\"\n    ],\n    \"SHORTDAY\": [\n      \"Lin\",\n      \"Lun\",\n      \"Mar\",\n      \"Miy\",\n      \"Huw\",\n      \"Biy\",\n      \"Sab\"\n    ],\n    \"SHORTMONTH\": [\n      \"Ene\",\n      \"Peb\",\n      \"Mar\",\n      \"Abr\",\n      \"May\",\n      \"Hun\",\n      \"Hul\",\n      \"Ago\",\n      \"Set\",\n      \"Okt\",\n      \"Nob\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Enero\",\n      \"Pebrero\",\n      \"Marso\",\n      \"Abril\",\n      \"Mayo\",\n      \"Hunyo\",\n      \"Hulyo\",\n      \"Agosto\",\n      \"Setyembre\",\n      \"Oktubre\",\n      \"Nobyembre\",\n      \"Disyembre\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b1\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"tl\",\n  \"localeID\": \"tl\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && (i == 1 || i == 2 || i == 3) || vf.v == 0 && i % 10 != 4 && i % 10 != 6 && i % 10 != 9 || vf.v != 0 && vf.f % 10 != 4 && vf.f % 10 != 6 && vf.f % 10 != 9) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_to-to.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"hengihengi\",\n      \"efiafi\"\n    ],\n    \"DAY\": [\n      \"S\\u0101pate\",\n      \"M\\u014dnite\",\n      \"T\\u016bsite\",\n      \"Pulelulu\",\n      \"Tu\\u02bbapulelulu\",\n      \"Falaite\",\n      \"Tokonaki\"\n    ],\n    \"ERANAMES\": [\n      \"ki mu\\u02bba\",\n      \"ta\\u02bbu \\u02bbo S\\u012bs\\u016b\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"TS\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"S\\u0101nuali\",\n      \"F\\u0113pueli\",\n      \"Ma\\u02bbasi\",\n      \"\\u02bbEpeleli\",\n      \"M\\u0113\",\n      \"Sune\",\n      \"Siulai\",\n      \"\\u02bbAokosi\",\n      \"Sepitema\",\n      \"\\u02bbOkatopa\",\n      \"N\\u014dvema\",\n      \"T\\u012bsema\"\n    ],\n    \"SHORTDAY\": [\n      \"S\\u0101p\",\n      \"M\\u014dn\",\n      \"T\\u016bs\",\n      \"Pul\",\n      \"Tu\\u02bba\",\n      \"Fal\",\n      \"Tok\"\n    ],\n    \"SHORTMONTH\": [\n      \"S\\u0101n\",\n      \"F\\u0113p\",\n      \"Ma\\u02bba\",\n      \"\\u02bbEpe\",\n      \"M\\u0113\",\n      \"Sun\",\n      \"Siu\",\n      \"\\u02bbAok\",\n      \"Sep\",\n      \"\\u02bbOka\",\n      \"N\\u014dv\",\n      \"T\\u012bs\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"S\\u0101nuali\",\n      \"F\\u0113pueli\",\n      \"Ma\\u02bbasi\",\n      \"\\u02bbEpeleli\",\n      \"M\\u0113\",\n      \"Sune\",\n      \"Siulai\",\n      \"\\u02bbAokosi\",\n      \"Sepitema\",\n      \"\\u02bbOkatopa\",\n      \"N\\u014dvema\",\n      \"T\\u012bsema\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"T$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"to-to\",\n  \"localeID\": \"to_TO\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_to.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"hengihengi\",\n      \"efiafi\"\n    ],\n    \"DAY\": [\n      \"S\\u0101pate\",\n      \"M\\u014dnite\",\n      \"T\\u016bsite\",\n      \"Pulelulu\",\n      \"Tu\\u02bbapulelulu\",\n      \"Falaite\",\n      \"Tokonaki\"\n    ],\n    \"ERANAMES\": [\n      \"ki mu\\u02bba\",\n      \"ta\\u02bbu \\u02bbo S\\u012bs\\u016b\"\n    ],\n    \"ERAS\": [\n      \"KM\",\n      \"TS\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"S\\u0101nuali\",\n      \"F\\u0113pueli\",\n      \"Ma\\u02bbasi\",\n      \"\\u02bbEpeleli\",\n      \"M\\u0113\",\n      \"Sune\",\n      \"Siulai\",\n      \"\\u02bbAokosi\",\n      \"Sepitema\",\n      \"\\u02bbOkatopa\",\n      \"N\\u014dvema\",\n      \"T\\u012bsema\"\n    ],\n    \"SHORTDAY\": [\n      \"S\\u0101p\",\n      \"M\\u014dn\",\n      \"T\\u016bs\",\n      \"Pul\",\n      \"Tu\\u02bba\",\n      \"Fal\",\n      \"Tok\"\n    ],\n    \"SHORTMONTH\": [\n      \"S\\u0101n\",\n      \"F\\u0113p\",\n      \"Ma\\u02bba\",\n      \"\\u02bbEpe\",\n      \"M\\u0113\",\n      \"Sun\",\n      \"Siu\",\n      \"\\u02bbAok\",\n      \"Sep\",\n      \"\\u02bbOka\",\n      \"N\\u014dv\",\n      \"T\\u012bs\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"S\\u0101nuali\",\n      \"F\\u0113pueli\",\n      \"Ma\\u02bbasi\",\n      \"\\u02bbEpeleli\",\n      \"M\\u0113\",\n      \"Sune\",\n      \"Siulai\",\n      \"\\u02bbAokosi\",\n      \"Sepitema\",\n      \"\\u02bbOkatopa\",\n      \"N\\u014dvema\",\n      \"T\\u012bsema\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"T$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"to\",\n  \"localeID\": \"to\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tr-cy.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u00d6\\u00d6\",\n      \"\\u00d6S\"\n    ],\n    \"DAY\": [\n      \"Pazar\",\n      \"Pazartesi\",\n      \"Sal\\u0131\",\n      \"\\u00c7ar\\u015famba\",\n      \"Per\\u015fembe\",\n      \"Cuma\",\n      \"Cumartesi\"\n    ],\n    \"ERANAMES\": [\n      \"Milattan \\u00d6nce\",\n      \"Milattan Sonra\"\n    ],\n    \"ERAS\": [\n      \"M\\u00d6\",\n      \"MS\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ocak\",\n      \"\\u015eubat\",\n      \"Mart\",\n      \"Nisan\",\n      \"May\\u0131s\",\n      \"Haziran\",\n      \"Temmuz\",\n      \"A\\u011fustos\",\n      \"Eyl\\u00fcl\",\n      \"Ekim\",\n      \"Kas\\u0131m\",\n      \"Aral\\u0131k\"\n    ],\n    \"SHORTDAY\": [\n      \"Paz\",\n      \"Pzt\",\n      \"Sal\",\n      \"\\u00c7ar\",\n      \"Per\",\n      \"Cum\",\n      \"Cmt\"\n    ],\n    \"SHORTMONTH\": [\n      \"Oca\",\n      \"\\u015eub\",\n      \"Mar\",\n      \"Nis\",\n      \"May\",\n      \"Haz\",\n      \"Tem\",\n      \"A\\u011fu\",\n      \"Eyl\",\n      \"Eki\",\n      \"Kas\",\n      \"Ara\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ocak\",\n      \"\\u015eubat\",\n      \"Mart\",\n      \"Nisan\",\n      \"May\\u0131s\",\n      \"Haziran\",\n      \"Temmuz\",\n      \"A\\u011fustos\",\n      \"Eyl\\u00fcl\",\n      \"Ekim\",\n      \"Kas\\u0131m\",\n      \"Aral\\u0131k\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d.MM.y h:mm a\",\n    \"shortDate\": \"d.MM.y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"tr-cy\",\n  \"localeID\": \"tr_CY\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tr-tr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u00d6\\u00d6\",\n      \"\\u00d6S\"\n    ],\n    \"DAY\": [\n      \"Pazar\",\n      \"Pazartesi\",\n      \"Sal\\u0131\",\n      \"\\u00c7ar\\u015famba\",\n      \"Per\\u015fembe\",\n      \"Cuma\",\n      \"Cumartesi\"\n    ],\n    \"ERANAMES\": [\n      \"Milattan \\u00d6nce\",\n      \"Milattan Sonra\"\n    ],\n    \"ERAS\": [\n      \"M\\u00d6\",\n      \"MS\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ocak\",\n      \"\\u015eubat\",\n      \"Mart\",\n      \"Nisan\",\n      \"May\\u0131s\",\n      \"Haziran\",\n      \"Temmuz\",\n      \"A\\u011fustos\",\n      \"Eyl\\u00fcl\",\n      \"Ekim\",\n      \"Kas\\u0131m\",\n      \"Aral\\u0131k\"\n    ],\n    \"SHORTDAY\": [\n      \"Paz\",\n      \"Pzt\",\n      \"Sal\",\n      \"\\u00c7ar\",\n      \"Per\",\n      \"Cum\",\n      \"Cmt\"\n    ],\n    \"SHORTMONTH\": [\n      \"Oca\",\n      \"\\u015eub\",\n      \"Mar\",\n      \"Nis\",\n      \"May\",\n      \"Haz\",\n      \"Tem\",\n      \"A\\u011fu\",\n      \"Eyl\",\n      \"Eki\",\n      \"Kas\",\n      \"Ara\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ocak\",\n      \"\\u015eubat\",\n      \"Mart\",\n      \"Nisan\",\n      \"May\\u0131s\",\n      \"Haziran\",\n      \"Temmuz\",\n      \"A\\u011fustos\",\n      \"Eyl\\u00fcl\",\n      \"Ekim\",\n      \"Kas\\u0131m\",\n      \"Aral\\u0131k\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.MM.y HH:mm\",\n    \"shortDate\": \"d.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"tr-tr\",\n  \"localeID\": \"tr_TR\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u00d6\\u00d6\",\n      \"\\u00d6S\"\n    ],\n    \"DAY\": [\n      \"Pazar\",\n      \"Pazartesi\",\n      \"Sal\\u0131\",\n      \"\\u00c7ar\\u015famba\",\n      \"Per\\u015fembe\",\n      \"Cuma\",\n      \"Cumartesi\"\n    ],\n    \"ERANAMES\": [\n      \"Milattan \\u00d6nce\",\n      \"Milattan Sonra\"\n    ],\n    \"ERAS\": [\n      \"M\\u00d6\",\n      \"MS\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Ocak\",\n      \"\\u015eubat\",\n      \"Mart\",\n      \"Nisan\",\n      \"May\\u0131s\",\n      \"Haziran\",\n      \"Temmuz\",\n      \"A\\u011fustos\",\n      \"Eyl\\u00fcl\",\n      \"Ekim\",\n      \"Kas\\u0131m\",\n      \"Aral\\u0131k\"\n    ],\n    \"SHORTDAY\": [\n      \"Paz\",\n      \"Pzt\",\n      \"Sal\",\n      \"\\u00c7ar\",\n      \"Per\",\n      \"Cum\",\n      \"Cmt\"\n    ],\n    \"SHORTMONTH\": [\n      \"Oca\",\n      \"\\u015eub\",\n      \"Mar\",\n      \"Nis\",\n      \"May\",\n      \"Haz\",\n      \"Tem\",\n      \"A\\u011fu\",\n      \"Eyl\",\n      \"Eki\",\n      \"Kas\",\n      \"Ara\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Ocak\",\n      \"\\u015eubat\",\n      \"Mart\",\n      \"Nisan\",\n      \"May\\u0131s\",\n      \"Haziran\",\n      \"Temmuz\",\n      \"A\\u011fustos\",\n      \"Eyl\\u00fcl\",\n      \"Ekim\",\n      \"Kas\\u0131m\",\n      \"Aral\\u0131k\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"d MMMM y EEEE\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d.MM.y HH:mm\",\n    \"shortDate\": \"d.MM.y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TL\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"tr\",\n  \"localeID\": \"tr\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_twq-ne.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Subbaahi\",\n      \"Zaarikay b\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atinni\",\n      \"Atalaata\",\n      \"Alarba\",\n      \"Alhamiisa\",\n      \"Alzuma\",\n      \"Asibti\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa zamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alz\",\n      \"Asi\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"twq-ne\",\n  \"localeID\": \"twq_NE\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_twq.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Subbaahi\",\n      \"Zaarikay b\"\n    ],\n    \"DAY\": [\n      \"Alhadi\",\n      \"Atinni\",\n      \"Atalaata\",\n      \"Alarba\",\n      \"Alhamiisa\",\n      \"Alzuma\",\n      \"Asibti\"\n    ],\n    \"ERANAMES\": [\n      \"Isaa jine\",\n      \"Isaa zamanoo\"\n    ],\n    \"ERAS\": [\n      \"IJ\",\n      \"IZ\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"SHORTDAY\": [\n      \"Alh\",\n      \"Ati\",\n      \"Ata\",\n      \"Ala\",\n      \"Alm\",\n      \"Alz\",\n      \"Asi\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u017dan\",\n      \"Fee\",\n      \"Mar\",\n      \"Awi\",\n      \"Me\",\n      \"\\u017duw\",\n      \"\\u017duy\",\n      \"Ut\",\n      \"Sek\",\n      \"Okt\",\n      \"Noo\",\n      \"Dee\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u017danwiye\",\n      \"Feewiriye\",\n      \"Marsi\",\n      \"Awiril\",\n      \"Me\",\n      \"\\u017duwe\\u014b\",\n      \"\\u017duyye\",\n      \"Ut\",\n      \"Sektanbur\",\n      \"Oktoobur\",\n      \"Noowanbur\",\n      \"Deesanbur\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"twq\",\n  \"localeID\": \"twq\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tzm-ma.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Zdat azal\",\n      \"\\u1e0ceffir aza\"\n    ],\n    \"DAY\": [\n      \"Asamas\",\n      \"Aynas\",\n      \"Asinas\",\n      \"Akras\",\n      \"Akwas\",\n      \"Asimwas\",\n      \"Asi\\u1e0dyas\"\n    ],\n    \"ERANAMES\": [\n      \"Zdat \\u0190isa (TA\\u0194)\",\n      \"\\u1e0ceffir \\u0190isa (TA\\u0194)\"\n    ],\n    \"ERAS\": [\n      \"Z\\u0190\",\n      \"\\u1e0c\\u0190\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"Yennayer\",\n      \"Yebrayer\",\n      \"Mars\",\n      \"Ibrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyuz\",\n      \"\\u0194uct\",\n      \"Cutanbir\",\n      \"K\\u1e6duber\",\n      \"Nwanbir\",\n      \"Dujanbir\"\n    ],\n    \"SHORTDAY\": [\n      \"Asa\",\n      \"Ayn\",\n      \"Asn\",\n      \"Akr\",\n      \"Akw\",\n      \"Asm\",\n      \"As\\u1e0d\"\n    ],\n    \"SHORTMONTH\": [\n      \"Yen\",\n      \"Yeb\",\n      \"Mar\",\n      \"Ibr\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"\\u0194uc\",\n      \"Cut\",\n      \"K\\u1e6du\",\n      \"Nwa\",\n      \"Duj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yennayer\",\n      \"Yebrayer\",\n      \"Mars\",\n      \"Ibrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyuz\",\n      \"\\u0194uct\",\n      \"Cutanbir\",\n      \"K\\u1e6duber\",\n      \"Nwanbir\",\n      \"Dujanbir\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"tzm-ma\",\n  \"localeID\": \"tzm_MA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_tzm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Zdat azal\",\n      \"\\u1e0ceffir aza\"\n    ],\n    \"DAY\": [\n      \"Asamas\",\n      \"Aynas\",\n      \"Asinas\",\n      \"Akras\",\n      \"Akwas\",\n      \"Asimwas\",\n      \"Asi\\u1e0dyas\"\n    ],\n    \"ERANAMES\": [\n      \"Zdat \\u0190isa (TA\\u0194)\",\n      \"\\u1e0ceffir \\u0190isa (TA\\u0194)\"\n    ],\n    \"ERAS\": [\n      \"Z\\u0190\",\n      \"\\u1e0c\\u0190\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"Yennayer\",\n      \"Yebrayer\",\n      \"Mars\",\n      \"Ibrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyuz\",\n      \"\\u0194uct\",\n      \"Cutanbir\",\n      \"K\\u1e6duber\",\n      \"Nwanbir\",\n      \"Dujanbir\"\n    ],\n    \"SHORTDAY\": [\n      \"Asa\",\n      \"Ayn\",\n      \"Asn\",\n      \"Akr\",\n      \"Akw\",\n      \"Asm\",\n      \"As\\u1e0d\"\n    ],\n    \"SHORTMONTH\": [\n      \"Yen\",\n      \"Yeb\",\n      \"Mar\",\n      \"Ibr\",\n      \"May\",\n      \"Yun\",\n      \"Yul\",\n      \"\\u0194uc\",\n      \"Cut\",\n      \"K\\u1e6du\",\n      \"Nwa\",\n      \"Duj\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yennayer\",\n      \"Yebrayer\",\n      \"Mars\",\n      \"Ibrir\",\n      \"Mayyu\",\n      \"Yunyu\",\n      \"Yulyuz\",\n      \"\\u0194uct\",\n      \"Cutanbir\",\n      \"K\\u1e6duber\",\n      \"Nwanbir\",\n      \"Dujanbir\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"tzm\",\n  \"localeID\": \"tzm\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ug-cn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0686\\u06c8\\u0634\\u062a\\u0649\\u0646 \\u0628\\u06c7\\u0631\\u06c7\\u0646\",\n      \"\\u0686\\u06c8\\u0634\\u062a\\u0649\\u0646 \\u0643\\u06d0\\u064a\\u0649\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u064a\\u06d5\\u0643\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u062f\\u06c8\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u0633\\u06d5\\u064a\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u0686\\u0627\\u0631\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u067e\\u06d5\\u064a\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u062c\\u06c8\\u0645\\u06d5\",\n      \"\\u0634\\u06d5\\u0646\\u0628\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0645\\u0649\\u0644\\u0627\\u062f\\u0649\\u064a\\u06d5\\u062f\\u0649\\u0646 \\u0628\\u06c7\\u0631\\u06c7\\u0646\",\n      \"\\u0645\\u0649\\u0644\\u0627\\u062f\\u0649\\u064a\\u06d5\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"\\u0645\\u0649\\u0644\\u0627\\u062f\\u0649\\u064a\\u06d5\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u064a\\u0627\\u0646\\u06cb\\u0627\\u0631\",\n      \"\\u0641\\u06d0\\u06cb\\u0631\\u0627\\u0644\",\n      \"\\u0645\\u0627\\u0631\\u062a\",\n      \"\\u0626\\u0627\\u067e\\u0631\\u06d0\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0646\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0644\",\n      \"\\u0626\\u0627\\u06cb\\u063a\\u06c7\\u0633\\u062a\",\n      \"\\u0633\\u06d0\\u0646\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0626\\u06c6\\u0643\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0646\\u0648\\u064a\\u0627\\u0628\\u0649\\u0631\",\n      \"\\u062f\\u06d0\\u0643\\u0627\\u0628\\u0649\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u064a\\u06d5\",\n      \"\\u062f\\u06c8\",\n      \"\\u0633\\u06d5\",\n      \"\\u0686\\u0627\",\n      \"\\u067e\\u06d5\",\n      \"\\u062c\\u06c8\",\n      \"\\u0634\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0627\\u0646\\u06cb\\u0627\\u0631\",\n      \"\\u0641\\u06d0\\u06cb\\u0631\\u0627\\u0644\",\n      \"\\u0645\\u0627\\u0631\\u062a\",\n      \"\\u0626\\u0627\\u067e\\u0631\\u06d0\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0646\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0644\",\n      \"\\u0626\\u0627\\u06cb\\u063a\\u06c7\\u0633\\u062a\",\n      \"\\u0633\\u06d0\\u0646\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0626\\u06c6\\u0643\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0646\\u0648\\u064a\\u0627\\u0628\\u0649\\u0631\",\n      \"\\u062f\\u06d0\\u0643\\u0627\\u0628\\u0649\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0627\\u0646\\u06cb\\u0627\\u0631\",\n      \"\\u0641\\u06d0\\u06cb\\u0631\\u0627\\u0644\",\n      \"\\u0645\\u0627\\u0631\\u062a\",\n      \"\\u0626\\u0627\\u067e\\u0631\\u06d0\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0646\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0644\",\n      \"\\u0626\\u0627\\u06cb\\u063a\\u06c7\\u0633\\u062a\",\n      \"\\u0633\\u06d0\\u0646\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0626\\u06c6\\u0643\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0646\\u0648\\u064a\\u0627\\u0628\\u0649\\u0631\",\n      \"\\u062f\\u06d0\\u0643\\u0627\\u0628\\u0649\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y d-MMMM\\u060c EEEE\",\n    \"longDate\": \"d-MMMM\\u060c y\",\n    \"medium\": \"d-MMM\\u060c y h:mm:ss a\",\n    \"mediumDate\": \"d-MMM\\u060c y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ug-cn\",\n  \"localeID\": \"ug_CN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0686\\u06c8\\u0634\\u062a\\u0649\\u0646 \\u0628\\u06c7\\u0631\\u06c7\\u0646\",\n      \"\\u0686\\u06c8\\u0634\\u062a\\u0649\\u0646 \\u0643\\u06d0\\u064a\\u0649\\u0646\"\n    ],\n    \"DAY\": [\n      \"\\u064a\\u06d5\\u0643\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u062f\\u06c8\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u0633\\u06d5\\u064a\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u0686\\u0627\\u0631\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u067e\\u06d5\\u064a\\u0634\\u06d5\\u0646\\u0628\\u06d5\",\n      \"\\u062c\\u06c8\\u0645\\u06d5\",\n      \"\\u0634\\u06d5\\u0646\\u0628\\u06d5\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0645\\u0649\\u0644\\u0627\\u062f\\u0649\\u064a\\u06d5\\u062f\\u0649\\u0646 \\u0628\\u06c7\\u0631\\u06c7\\u0646\",\n      \"\\u0645\\u0649\\u0644\\u0627\\u062f\\u0649\\u064a\\u06d5\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"\\u0645\\u0649\\u0644\\u0627\\u062f\\u0649\\u064a\\u06d5\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u064a\\u0627\\u0646\\u06cb\\u0627\\u0631\",\n      \"\\u0641\\u06d0\\u06cb\\u0631\\u0627\\u0644\",\n      \"\\u0645\\u0627\\u0631\\u062a\",\n      \"\\u0626\\u0627\\u067e\\u0631\\u06d0\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0646\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0644\",\n      \"\\u0626\\u0627\\u06cb\\u063a\\u06c7\\u0633\\u062a\",\n      \"\\u0633\\u06d0\\u0646\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0626\\u06c6\\u0643\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0646\\u0648\\u064a\\u0627\\u0628\\u0649\\u0631\",\n      \"\\u062f\\u06d0\\u0643\\u0627\\u0628\\u0649\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u064a\\u06d5\",\n      \"\\u062f\\u06c8\",\n      \"\\u0633\\u06d5\",\n      \"\\u0686\\u0627\",\n      \"\\u067e\\u06d5\",\n      \"\\u062c\\u06c8\",\n      \"\\u0634\\u06d5\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u064a\\u0627\\u0646\\u06cb\\u0627\\u0631\",\n      \"\\u0641\\u06d0\\u06cb\\u0631\\u0627\\u0644\",\n      \"\\u0645\\u0627\\u0631\\u062a\",\n      \"\\u0626\\u0627\\u067e\\u0631\\u06d0\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0646\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0644\",\n      \"\\u0626\\u0627\\u06cb\\u063a\\u06c7\\u0633\\u062a\",\n      \"\\u0633\\u06d0\\u0646\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0626\\u06c6\\u0643\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0646\\u0648\\u064a\\u0627\\u0628\\u0649\\u0631\",\n      \"\\u062f\\u06d0\\u0643\\u0627\\u0628\\u0649\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u064a\\u0627\\u0646\\u06cb\\u0627\\u0631\",\n      \"\\u0641\\u06d0\\u06cb\\u0631\\u0627\\u0644\",\n      \"\\u0645\\u0627\\u0631\\u062a\",\n      \"\\u0626\\u0627\\u067e\\u0631\\u06d0\\u0644\",\n      \"\\u0645\\u0627\\u064a\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0646\",\n      \"\\u0626\\u0649\\u064a\\u06c7\\u0644\",\n      \"\\u0626\\u0627\\u06cb\\u063a\\u06c7\\u0633\\u062a\",\n      \"\\u0633\\u06d0\\u0646\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0626\\u06c6\\u0643\\u062a\\u06d5\\u0628\\u0649\\u0631\",\n      \"\\u0646\\u0648\\u064a\\u0627\\u0628\\u0649\\u0631\",\n      \"\\u062f\\u06d0\\u0643\\u0627\\u0628\\u0649\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y d-MMMM\\u060c EEEE\",\n    \"longDate\": \"d-MMMM\\u060c y\",\n    \"medium\": \"d-MMM\\u060c y h:mm:ss a\",\n    \"mediumDate\": \"d-MMM\\u060c y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"y-MM-dd h:mm a\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ug\",\n  \"localeID\": \"ug\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uk-ua.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0434\\u043f\",\n      \"\\u043f\\u043f\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0456\\u043b\\u044f\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0456\\u043b\\u043e\\u043a\",\n      \"\\u0432\\u0456\\u0432\\u0442\\u043e\\u0440\\u043e\\u043a\",\n      \"\\u0441\\u0435\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\",\n      \"\\u043f\\u02bc\\u044f\\u0442\\u043d\\u0438\\u0446\\u044f\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u043d\\u0430\\u0448\\u043e\\u0457 \\u0435\\u0440\\u0438\",\n      \"\\u043d\\u0430\\u0448\\u043e\\u0457 \\u0435\\u0440\\u0438\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0441\\u0456\\u0447\\u043d\\u044f\",\n      \"\\u043b\\u044e\\u0442\\u043e\\u0433\\u043e\",\n      \"\\u0431\\u0435\\u0440\\u0435\\u0437\\u043d\\u044f\",\n      \"\\u043a\\u0432\\u0456\\u0442\\u043d\\u044f\",\n      \"\\u0442\\u0440\\u0430\\u0432\\u043d\\u044f\",\n      \"\\u0447\\u0435\\u0440\\u0432\\u043d\\u044f\",\n      \"\\u043b\\u0438\\u043f\\u043d\\u044f\",\n      \"\\u0441\\u0435\\u0440\\u043f\\u043d\\u044f\",\n      \"\\u0432\\u0435\\u0440\\u0435\\u0441\\u043d\\u044f\",\n      \"\\u0436\\u043e\\u0432\\u0442\\u043d\\u044f\",\n      \"\\u043b\\u0438\\u0441\\u0442\\u043e\\u043f\\u0430\\u0434\\u0430\",\n      \"\\u0433\\u0440\\u0443\\u0434\\u043d\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0441\\u0456\\u0447.\",\n      \"\\u043b\\u044e\\u0442.\",\n      \"\\u0431\\u0435\\u0440.\",\n      \"\\u043a\\u0432\\u0456\\u0442.\",\n      \"\\u0442\\u0440\\u0430\\u0432.\",\n      \"\\u0447\\u0435\\u0440\\u0432.\",\n      \"\\u043b\\u0438\\u043f.\",\n      \"\\u0441\\u0435\\u0440\\u043f.\",\n      \"\\u0432\\u0435\\u0440.\",\n      \"\\u0436\\u043e\\u0432\\u0442.\",\n      \"\\u043b\\u0438\\u0441\\u0442.\",\n      \"\\u0433\\u0440\\u0443\\u0434.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0441\\u0456\\u0447\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u044e\\u0442\\u0438\\u0439\",\n      \"\\u0431\\u0435\\u0440\\u0435\\u0437\\u0435\\u043d\\u044c\",\n      \"\\u043a\\u0432\\u0456\\u0442\\u0435\\u043d\\u044c\",\n      \"\\u0442\\u0440\\u0430\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u0447\\u0435\\u0440\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u0438\\u043f\\u0435\\u043d\\u044c\",\n      \"\\u0441\\u0435\\u0440\\u043f\\u0435\\u043d\\u044c\",\n      \"\\u0432\\u0435\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\",\n      \"\\u0436\\u043e\\u0432\\u0442\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u0438\\u0441\\u0442\\u043e\\u043f\\u0430\\u0434\",\n      \"\\u0433\\u0440\\u0443\\u0434\\u0435\\u043d\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0440'.\",\n    \"longDate\": \"d MMMM y '\\u0440'.\",\n    \"medium\": \"d MMM y '\\u0440'. HH:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0440'.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u0433\\u0440\\u043d.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"uk-ua\",\n  \"localeID\": \"uk_UA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0434\\u043f\",\n      \"\\u043f\\u043f\"\n    ],\n    \"DAY\": [\n      \"\\u043d\\u0435\\u0434\\u0456\\u043b\\u044f\",\n      \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0456\\u043b\\u043e\\u043a\",\n      \"\\u0432\\u0456\\u0432\\u0442\\u043e\\u0440\\u043e\\u043a\",\n      \"\\u0441\\u0435\\u0440\\u0435\\u0434\\u0430\",\n      \"\\u0447\\u0435\\u0442\\u0432\\u0435\\u0440\",\n      \"\\u043f\\u02bc\\u044f\\u0442\\u043d\\u0438\\u0446\\u044f\",\n      \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0434\\u043e \\u043d\\u0430\\u0448\\u043e\\u0457 \\u0435\\u0440\\u0438\",\n      \"\\u043d\\u0430\\u0448\\u043e\\u0457 \\u0435\\u0440\\u0438\"\n    ],\n    \"ERAS\": [\n      \"\\u0434\\u043e \\u043d. \\u0435.\",\n      \"\\u043d. \\u0435.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u0441\\u0456\\u0447\\u043d\\u044f\",\n      \"\\u043b\\u044e\\u0442\\u043e\\u0433\\u043e\",\n      \"\\u0431\\u0435\\u0440\\u0435\\u0437\\u043d\\u044f\",\n      \"\\u043a\\u0432\\u0456\\u0442\\u043d\\u044f\",\n      \"\\u0442\\u0440\\u0430\\u0432\\u043d\\u044f\",\n      \"\\u0447\\u0435\\u0440\\u0432\\u043d\\u044f\",\n      \"\\u043b\\u0438\\u043f\\u043d\\u044f\",\n      \"\\u0441\\u0435\\u0440\\u043f\\u043d\\u044f\",\n      \"\\u0432\\u0435\\u0440\\u0435\\u0441\\u043d\\u044f\",\n      \"\\u0436\\u043e\\u0432\\u0442\\u043d\\u044f\",\n      \"\\u043b\\u0438\\u0441\\u0442\\u043e\\u043f\\u0430\\u0434\\u0430\",\n      \"\\u0433\\u0440\\u0443\\u0434\\u043d\\u044f\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u043d\\u0434\",\n      \"\\u043f\\u043d\",\n      \"\\u0432\\u0442\",\n      \"\\u0441\\u0440\",\n      \"\\u0447\\u0442\",\n      \"\\u043f\\u0442\",\n      \"\\u0441\\u0431\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u0441\\u0456\\u0447.\",\n      \"\\u043b\\u044e\\u0442.\",\n      \"\\u0431\\u0435\\u0440.\",\n      \"\\u043a\\u0432\\u0456\\u0442.\",\n      \"\\u0442\\u0440\\u0430\\u0432.\",\n      \"\\u0447\\u0435\\u0440\\u0432.\",\n      \"\\u043b\\u0438\\u043f.\",\n      \"\\u0441\\u0435\\u0440\\u043f.\",\n      \"\\u0432\\u0435\\u0440.\",\n      \"\\u0436\\u043e\\u0432\\u0442.\",\n      \"\\u043b\\u0438\\u0441\\u0442.\",\n      \"\\u0433\\u0440\\u0443\\u0434.\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u0441\\u0456\\u0447\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u044e\\u0442\\u0438\\u0439\",\n      \"\\u0431\\u0435\\u0440\\u0435\\u0437\\u0435\\u043d\\u044c\",\n      \"\\u043a\\u0432\\u0456\\u0442\\u0435\\u043d\\u044c\",\n      \"\\u0442\\u0440\\u0430\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u0447\\u0435\\u0440\\u0432\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u0438\\u043f\\u0435\\u043d\\u044c\",\n      \"\\u0441\\u0435\\u0440\\u043f\\u0435\\u043d\\u044c\",\n      \"\\u0432\\u0435\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\",\n      \"\\u0436\\u043e\\u0432\\u0442\\u0435\\u043d\\u044c\",\n      \"\\u043b\\u0438\\u0441\\u0442\\u043e\\u043f\\u0430\\u0434\",\n      \"\\u0433\\u0440\\u0443\\u0434\\u0435\\u043d\\u044c\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y '\\u0440'.\",\n    \"longDate\": \"d MMMM y '\\u0440'.\",\n    \"medium\": \"d MMM y '\\u0440'. HH:mm:ss\",\n    \"mediumDate\": \"d MMM y '\\u0440'.\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd.MM.yy HH:mm\",\n    \"shortDate\": \"dd.MM.yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u0433\\u0440\\u043d.\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"uk\",\n  \"localeID\": \"uk\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {    return PLURAL_CATEGORY.ONE;  }  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {    return PLURAL_CATEGORY.FEW;  }  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {    return PLURAL_CATEGORY.MANY;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ur-in.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u067e\\u06cc\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u0633\\u06cc\\u062d\",\n      \"\\u0639\\u06cc\\u0633\\u0648\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u0633\\u06cc\\u062d\",\n      \"\\u0639\\u06cc\\u0633\\u0648\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u067e\\u06cc\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      6,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20b9\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ur-in\",\n  \"localeID\": \"ur_IN\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ur-pk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u0633\\u0648\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u0633\\u06cc\\u062d\",\n      \"\\u0639\\u06cc\\u0633\\u0648\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u0633\\u06cc\\u062d\",\n      \"\\u0639\\u06cc\\u0633\\u0648\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u0633\\u0648\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ur-pk\",\n  \"localeID\": \"ur_PK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_ur.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u0633\\u0648\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"ERANAMES\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u0633\\u06cc\\u062d\",\n      \"\\u0639\\u06cc\\u0633\\u0648\\u06cc\"\n    ],\n    \"ERAS\": [\n      \"\\u0642\\u0628\\u0644 \\u0645\\u0633\\u06cc\\u062d\",\n      \"\\u0639\\u06cc\\u0633\\u0648\\u06cc\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u0627\\u062a\\u0648\\u0627\\u0631\",\n      \"\\u0633\\u0648\\u0645\\u0648\\u0627\\u0631\",\n      \"\\u0645\\u0646\\u06af\\u0644\",\n      \"\\u0628\\u062f\\u06be\",\n      \"\\u062c\\u0645\\u0639\\u0631\\u0627\\u062a\",\n      \"\\u062c\\u0645\\u0639\\u06c1\",\n      \"\\u06c1\\u0641\\u062a\\u06c1\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u0626\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u0626\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE\\u060c d MMMM\\u060c y\",\n    \"longDate\": \"d MMMM\\u060c y\",\n    \"medium\": \"y MMM d h:mm:ss a\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"d/M/yy h:mm a\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Rs\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 2,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"ur\",\n  \"localeID\": \"ur\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uz-arab-af.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc.\",\n      \"\\u062f.\",\n      \"\\u0633.\",\n      \"\\u0686.\",\n      \"\\u067e.\",\n      \"\\u062c.\",\n      \"\\u0634.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\",\n      \"\\u0641\\u0628\\u0631\",\n      \"\\u0645\\u0627\\u0631\",\n      \"\\u0627\\u067e\\u0631\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\",\n      \"\\u0627\\u06af\\u0633\",\n      \"\\u0633\\u067e\\u062a\",\n      \"\\u0627\\u06a9\\u062a\",\n      \"\\u0646\\u0648\\u0645\",\n      \"\\u062f\\u0633\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      3,\n      4\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Af.\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"uz-arab-af\",\n  \"localeID\": \"uz_Arab_AF\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uz-arab.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\u06cc\\u06a9\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062f\\u0648\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0633\\u0647\\u200c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u067e\\u0646\\u062c\\u0634\\u0646\\u0628\\u0647\",\n      \"\\u062c\\u0645\\u0639\\u0647\",\n      \"\\u0634\\u0646\\u0628\\u0647\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u06cc.\",\n      \"\\u062f.\",\n      \"\\u0633.\",\n      \"\\u0686.\",\n      \"\\u067e.\",\n      \"\\u062c.\",\n      \"\\u0634.\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u062c\\u0646\\u0648\",\n      \"\\u0641\\u0628\\u0631\",\n      \"\\u0645\\u0627\\u0631\",\n      \"\\u0627\\u067e\\u0631\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\",\n      \"\\u0627\\u06af\\u0633\",\n      \"\\u0633\\u067e\\u062a\",\n      \"\\u0627\\u06a9\\u062a\",\n      \"\\u0646\\u0648\\u0645\",\n      \"\\u062f\\u0633\\u0645\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u062c\\u0646\\u0648\\u0631\\u06cc\",\n      \"\\u0641\\u0628\\u0631\\u0648\\u0631\\u06cc\",\n      \"\\u0645\\u0627\\u0631\\u0686\",\n      \"\\u0627\\u067e\\u0631\\u06cc\\u0644\",\n      \"\\u0645\\u06cc\",\n      \"\\u062c\\u0648\\u0646\",\n      \"\\u062c\\u0648\\u0644\\u0627\\u06cc\",\n      \"\\u0627\\u06af\\u0633\\u062a\",\n      \"\\u0633\\u067e\\u062a\\u0645\\u0628\\u0631\",\n      \"\\u0627\\u06a9\\u062a\\u0648\\u0628\\u0631\",\n      \"\\u0646\\u0648\\u0645\\u0628\\u0631\",\n      \"\\u062f\\u0633\\u0645\\u0628\\u0631\"\n    ],\n    \"WEEKENDRANGE\": [\n      3,\n      4\n    ],\n    \"fullDate\": \"y MMMM d, EEEE\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM d HH:mm:ss\",\n    \"mediumDate\": \"y MMM d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"Af.\",\n    \"DECIMAL_SEP\": \"\\u066b\",\n    \"GROUP_SEP\": \"\\u066c\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"uz-arab\",\n  \"localeID\": \"uz_Arab\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uz-cyrl-uz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0422\\u041e\",\n      \"\\u0422\\u041a\"\n    ],\n    \"DAY\": [\n      \"\\u044f\\u043a\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0434\\u0443\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0441\\u0435\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0447\\u043e\\u0440\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u043f\\u0430\\u0439\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0436\\u0443\\u043c\\u0430\",\n      \"\\u0448\\u0430\\u043d\\u0431\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043c\\u0438\\u043b\\u043e\\u0434\\u0434\\u0430\\u043d \\u0430\\u0432\\u0432\\u0430\\u043b\\u0433\\u0438\",\n      \"\\u043c\\u0438\\u043b\\u043e\\u0434\\u0438\\u0439\"\n    ],\n    \"ERAS\": [\n      \"\\u043c.\\u0430.\",\n      \"\\u043c\\u0438\\u043b\\u043e\\u0434\\u0438\\u0439\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\",\n      \"\\u0438\\u044e\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u044f\\u043a\\u0448\",\n      \"\\u0434\\u0443\\u0448\",\n      \"\\u0441\\u0435\\u0448\",\n      \"\\u0447\\u043e\\u0440\",\n      \"\\u043f\\u0430\\u0439\",\n      \"\\u0436\\u0443\\u043c\",\n      \"\\u0448\\u0430\\u043d\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\",\n      \"\\u0438\\u044e\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043d\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u044f\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u042f\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u041c\\u0430\\u0440\\u0442\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u044e\\u043d\",\n      \"\\u0418\\u044e\\u043b\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u041d\\u043e\\u044f\\u0431\\u0440\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"so\\u02bcm\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"uz-cyrl-uz\",\n  \"localeID\": \"uz_Cyrl_UZ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uz-cyrl.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u0422\\u041e\",\n      \"\\u0422\\u041a\"\n    ],\n    \"DAY\": [\n      \"\\u044f\\u043a\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0434\\u0443\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0441\\u0435\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0447\\u043e\\u0440\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u043f\\u0430\\u0439\\u0448\\u0430\\u043d\\u0431\\u0430\",\n      \"\\u0436\\u0443\\u043c\\u0430\",\n      \"\\u0448\\u0430\\u043d\\u0431\\u0430\"\n    ],\n    \"ERANAMES\": [\n      \"\\u043c\\u0438\\u043b\\u043e\\u0434\\u0434\\u0430\\u043d \\u0430\\u0432\\u0432\\u0430\\u043b\\u0433\\u0438\",\n      \"\\u043c\\u0438\\u043b\\u043e\\u0434\\u0438\\u0439\"\n    ],\n    \"ERAS\": [\n      \"\\u043c.\\u0430.\",\n      \"\\u043c\\u0438\\u043b\\u043e\\u0434\\u0438\\u0439\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u044f\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u043c\\u0430\\u0440\\u0442\",\n      \"\\u0430\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\",\n      \"\\u0438\\u044e\\u043b\",\n      \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u043d\\u043e\\u044f\\u0431\\u0440\",\n      \"\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u044f\\u043a\\u0448\",\n      \"\\u0434\\u0443\\u0448\",\n      \"\\u0441\\u0435\\u0448\",\n      \"\\u0447\\u043e\\u0440\",\n      \"\\u043f\\u0430\\u0439\",\n      \"\\u0436\\u0443\\u043c\",\n      \"\\u0448\\u0430\\u043d\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u044f\\u043d\\u0432\",\n      \"\\u0444\\u0435\\u0432\",\n      \"\\u043c\\u0430\\u0440\",\n      \"\\u0430\\u043f\\u0440\",\n      \"\\u043c\\u0430\\u0439\",\n      \"\\u0438\\u044e\\u043d\",\n      \"\\u0438\\u044e\\u043b\",\n      \"\\u0430\\u0432\\u0433\",\n      \"\\u0441\\u0435\\u043d\",\n      \"\\u043e\\u043a\\u0442\",\n      \"\\u043d\\u043e\\u044f\",\n      \"\\u0434\\u0435\\u043a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u042f\\u043d\\u0432\\u0430\\u0440\",\n      \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\",\n      \"\\u041c\\u0430\\u0440\\u0442\",\n      \"\\u0410\\u043f\\u0440\\u0435\\u043b\",\n      \"\\u041c\\u0430\\u0439\",\n      \"\\u0418\\u044e\\u043d\",\n      \"\\u0418\\u044e\\u043b\",\n      \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\",\n      \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\",\n      \"\\u041d\\u043e\\u044f\\u0431\\u0440\",\n      \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, dd MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"so\\u02bcm\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"uz-cyrl\",\n  \"localeID\": \"uz_Cyrl\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uz-latn-uz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"TO\",\n      \"TK\"\n    ],\n    \"DAY\": [\n      \"yakshanba\",\n      \"dushanba\",\n      \"seshanba\",\n      \"chorshanba\",\n      \"payshanba\",\n      \"juma\",\n      \"shanba\"\n    ],\n    \"ERANAMES\": [\n      \"miloddan avvalgi\",\n      \"milodiy\"\n    ],\n    \"ERAS\": [\n      \"m.a.\",\n      \"milodiy\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanvar\",\n      \"fevral\",\n      \"mart\",\n      \"aprel\",\n      \"may\",\n      \"iyun\",\n      \"iyul\",\n      \"avgust\",\n      \"sentabr\",\n      \"oktabr\",\n      \"noyabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"Yak\",\n      \"Dush\",\n      \"Sesh\",\n      \"Chor\",\n      \"Pay\",\n      \"Jum\",\n      \"Shan\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fev\",\n      \"mar\",\n      \"apr\",\n      \"may\",\n      \"iyn\",\n      \"iyl\",\n      \"avg\",\n      \"sen\",\n      \"okt\",\n      \"noy\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yanvar\",\n      \"Fevral\",\n      \"Mart\",\n      \"Aprel\",\n      \"May\",\n      \"Iyun\",\n      \"Iyul\",\n      \"Avgust\",\n      \"Sentabr\",\n      \"Oktabr\",\n      \"Noyabr\",\n      \"Dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d-MMMM, y\",\n    \"longDate\": \"d-MMMM, y\",\n    \"medium\": \"d-MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d-MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"so\\u02bcm\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"uz-latn-uz\",\n  \"localeID\": \"uz_Latn_UZ\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uz-latn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"TO\",\n      \"TK\"\n    ],\n    \"DAY\": [\n      \"yakshanba\",\n      \"dushanba\",\n      \"seshanba\",\n      \"chorshanba\",\n      \"payshanba\",\n      \"juma\",\n      \"shanba\"\n    ],\n    \"ERANAMES\": [\n      \"miloddan avvalgi\",\n      \"milodiy\"\n    ],\n    \"ERAS\": [\n      \"m.a.\",\n      \"milodiy\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanvar\",\n      \"fevral\",\n      \"mart\",\n      \"aprel\",\n      \"may\",\n      \"iyun\",\n      \"iyul\",\n      \"avgust\",\n      \"sentabr\",\n      \"oktabr\",\n      \"noyabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"Yak\",\n      \"Dush\",\n      \"Sesh\",\n      \"Chor\",\n      \"Pay\",\n      \"Jum\",\n      \"Shan\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fev\",\n      \"mar\",\n      \"apr\",\n      \"may\",\n      \"iyn\",\n      \"iyl\",\n      \"avg\",\n      \"sen\",\n      \"okt\",\n      \"noy\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yanvar\",\n      \"Fevral\",\n      \"Mart\",\n      \"Aprel\",\n      \"May\",\n      \"Iyun\",\n      \"Iyul\",\n      \"Avgust\",\n      \"Sentabr\",\n      \"Oktabr\",\n      \"Noyabr\",\n      \"Dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d-MMMM, y\",\n    \"longDate\": \"d-MMMM, y\",\n    \"medium\": \"d-MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d-MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"so\\u02bcm\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"uz-latn\",\n  \"localeID\": \"uz_Latn\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_uz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"TO\",\n      \"TK\"\n    ],\n    \"DAY\": [\n      \"yakshanba\",\n      \"dushanba\",\n      \"seshanba\",\n      \"chorshanba\",\n      \"payshanba\",\n      \"juma\",\n      \"shanba\"\n    ],\n    \"ERANAMES\": [\n      \"miloddan avvalgi\",\n      \"milodiy\"\n    ],\n    \"ERAS\": [\n      \"m.a.\",\n      \"milodiy\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanvar\",\n      \"fevral\",\n      \"mart\",\n      \"aprel\",\n      \"may\",\n      \"iyun\",\n      \"iyul\",\n      \"avgust\",\n      \"sentabr\",\n      \"oktabr\",\n      \"noyabr\",\n      \"dekabr\"\n    ],\n    \"SHORTDAY\": [\n      \"Yak\",\n      \"Dush\",\n      \"Sesh\",\n      \"Chor\",\n      \"Pay\",\n      \"Jum\",\n      \"Shan\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"fev\",\n      \"mar\",\n      \"apr\",\n      \"may\",\n      \"iyn\",\n      \"iyl\",\n      \"avg\",\n      \"sen\",\n      \"okt\",\n      \"noy\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Yanvar\",\n      \"Fevral\",\n      \"Mart\",\n      \"Aprel\",\n      \"May\",\n      \"Iyun\",\n      \"Iyul\",\n      \"Avgust\",\n      \"Sentabr\",\n      \"Oktabr\",\n      \"Noyabr\",\n      \"Dekabr\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d-MMMM, y\",\n    \"longDate\": \"d-MMMM, y\",\n    \"medium\": \"d-MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d-MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"so\\u02bcm\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"uz\",\n  \"localeID\": \"uz\",\n  \"pluralCat\": function(n, opt_precision) {  if (n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vai-latn-lr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"lahadi\",\n      \"t\\u025b\\u025bn\\u025b\\u025b\",\n      \"talata\",\n      \"alaba\",\n      \"aimisa\",\n      \"aijima\",\n      \"si\\u0253iti\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"luukao kem\\u00e3\",\n      \"\\u0253anda\\u0253u\",\n      \"v\\u0254\\u0254\",\n      \"fulu\",\n      \"goo\",\n      \"6\",\n      \"7\",\n      \"k\\u0254nde\",\n      \"saah\",\n      \"galo\",\n      \"kenpkato \\u0253olol\\u0254\",\n      \"luukao l\\u0254ma\"\n    ],\n    \"SHORTDAY\": [\n      \"lahadi\",\n      \"t\\u025b\\u025bn\\u025b\\u025b\",\n      \"talata\",\n      \"alaba\",\n      \"aimisa\",\n      \"aijima\",\n      \"si\\u0253iti\"\n    ],\n    \"SHORTMONTH\": [\n      \"luukao kem\\u00e3\",\n      \"\\u0253anda\\u0253u\",\n      \"v\\u0254\\u0254\",\n      \"fulu\",\n      \"goo\",\n      \"6\",\n      \"7\",\n      \"k\\u0254nde\",\n      \"saah\",\n      \"galo\",\n      \"kenpkato \\u0253olol\\u0254\",\n      \"luukao l\\u0254ma\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"luukao kem\\u00e3\",\n      \"\\u0253anda\\u0253u\",\n      \"v\\u0254\\u0254\",\n      \"fulu\",\n      \"goo\",\n      \"6\",\n      \"7\",\n      \"k\\u0254nde\",\n      \"saah\",\n      \"galo\",\n      \"kenpkato \\u0253olol\\u0254\",\n      \"luukao l\\u0254ma\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vai-latn-lr\",\n  \"localeID\": \"vai_Latn_LR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vai-latn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"lahadi\",\n      \"t\\u025b\\u025bn\\u025b\\u025b\",\n      \"talata\",\n      \"alaba\",\n      \"aimisa\",\n      \"aijima\",\n      \"si\\u0253iti\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"luukao kem\\u00e3\",\n      \"\\u0253anda\\u0253u\",\n      \"v\\u0254\\u0254\",\n      \"fulu\",\n      \"goo\",\n      \"6\",\n      \"7\",\n      \"k\\u0254nde\",\n      \"saah\",\n      \"galo\",\n      \"kenpkato \\u0253olol\\u0254\",\n      \"luukao l\\u0254ma\"\n    ],\n    \"SHORTDAY\": [\n      \"lahadi\",\n      \"t\\u025b\\u025bn\\u025b\\u025b\",\n      \"talata\",\n      \"alaba\",\n      \"aimisa\",\n      \"aijima\",\n      \"si\\u0253iti\"\n    ],\n    \"SHORTMONTH\": [\n      \"luukao kem\\u00e3\",\n      \"\\u0253anda\\u0253u\",\n      \"v\\u0254\\u0254\",\n      \"fulu\",\n      \"goo\",\n      \"6\",\n      \"7\",\n      \"k\\u0254nde\",\n      \"saah\",\n      \"galo\",\n      \"kenpkato \\u0253olol\\u0254\",\n      \"luukao l\\u0254ma\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"luukao kem\\u00e3\",\n      \"\\u0253anda\\u0253u\",\n      \"v\\u0254\\u0254\",\n      \"fulu\",\n      \"goo\",\n      \"6\",\n      \"7\",\n      \"k\\u0254nde\",\n      \"saah\",\n      \"galo\",\n      \"kenpkato \\u0253olol\\u0254\",\n      \"luukao l\\u0254ma\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vai-latn\",\n  \"localeID\": \"vai_Latn\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vai-vaii-lr.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\ua55e\\ua54c\\ua535\",\n      \"\\ua5f3\\ua5e1\\ua609\",\n      \"\\ua55a\\ua55e\\ua55a\",\n      \"\\ua549\\ua55e\\ua552\",\n      \"\\ua549\\ua524\\ua546\\ua562\",\n      \"\\ua549\\ua524\\ua540\\ua56e\",\n      \"\\ua53b\\ua52c\\ua533\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"SHORTDAY\": [\n      \"\\ua55e\\ua54c\\ua535\",\n      \"\\ua5f3\\ua5e1\\ua609\",\n      \"\\ua55a\\ua55e\\ua55a\",\n      \"\\ua549\\ua55e\\ua552\",\n      \"\\ua549\\ua524\\ua546\\ua562\",\n      \"\\ua549\\ua524\\ua540\\ua56e\",\n      \"\\ua53b\\ua52c\\ua533\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vai-vaii-lr\",\n  \"localeID\": \"vai_Vaii_LR\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vai-vaii.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\ua55e\\ua54c\\ua535\",\n      \"\\ua5f3\\ua5e1\\ua609\",\n      \"\\ua55a\\ua55e\\ua55a\",\n      \"\\ua549\\ua55e\\ua552\",\n      \"\\ua549\\ua524\\ua546\\ua562\",\n      \"\\ua549\\ua524\\ua540\\ua56e\",\n      \"\\ua53b\\ua52c\\ua533\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"SHORTDAY\": [\n      \"\\ua55e\\ua54c\\ua535\",\n      \"\\ua5f3\\ua5e1\\ua609\",\n      \"\\ua55a\\ua55e\\ua55a\",\n      \"\\ua549\\ua55e\\ua552\",\n      \"\\ua549\\ua524\\ua546\\ua562\",\n      \"\\ua549\\ua524\\ua540\\ua56e\",\n      \"\\ua53b\\ua52c\\ua533\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vai-vaii\",\n  \"localeID\": \"vai_Vaii\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vai.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"\\ua55e\\ua54c\\ua535\",\n      \"\\ua5f3\\ua5e1\\ua609\",\n      \"\\ua55a\\ua55e\\ua55a\",\n      \"\\ua549\\ua55e\\ua552\",\n      \"\\ua549\\ua524\\ua546\\ua562\",\n      \"\\ua549\\ua524\\ua540\\ua56e\",\n      \"\\ua53b\\ua52c\\ua533\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"SHORTDAY\": [\n      \"\\ua55e\\ua54c\\ua535\",\n      \"\\ua5f3\\ua5e1\\ua609\",\n      \"\\ua55a\\ua55e\\ua55a\",\n      \"\\ua549\\ua55e\\ua552\",\n      \"\\ua549\\ua524\\ua546\\ua562\",\n      \"\\ua549\\ua524\\ua540\\ua56e\",\n      \"\\ua53b\\ua52c\\ua533\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\ua5a8\\ua56a\\ua583 \\ua51e\\ua56e\",\n      \"\\ua552\\ua561\\ua59d\\ua595\",\n      \"\\ua57e\\ua5ba\",\n      \"\\ua5a2\\ua595\",\n      \"\\ua591\\ua571\",\n      \"6\",\n      \"7\",\n      \"\\ua5db\\ua515\",\n      \"\\ua562\\ua54c\",\n      \"\\ua56d\\ua583\",\n      \"\\ua51e\\ua60b\\ua554\\ua57f \\ua578\\ua583\\ua5cf\",\n      \"\\ua5a8\\ua56a\\ua571 \\ua5cf\\ua56e\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y h:mm:ss a\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"dd/MM/y h:mm a\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vai\",\n  \"localeID\": \"vai\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vi-vn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"SA\",\n      \"CH\"\n    ],\n    \"DAY\": [\n      \"Ch\\u1ee7 Nh\\u1eadt\",\n      \"Th\\u1ee9 Hai\",\n      \"Th\\u1ee9 Ba\",\n      \"Th\\u1ee9 T\\u01b0\",\n      \"Th\\u1ee9 N\\u0103m\",\n      \"Th\\u1ee9 S\\u00e1u\",\n      \"Th\\u1ee9 B\\u1ea3y\"\n    ],\n    \"ERANAMES\": [\n      \"Tr\\u01b0\\u1edbc CN\",\n      \"sau CN\"\n    ],\n    \"ERAS\": [\n      \"Tr\\u01b0\\u1edbc CN\",\n      \"sau CN\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"th\\u00e1ng 1\",\n      \"th\\u00e1ng 2\",\n      \"th\\u00e1ng 3\",\n      \"th\\u00e1ng 4\",\n      \"th\\u00e1ng 5\",\n      \"th\\u00e1ng 6\",\n      \"th\\u00e1ng 7\",\n      \"th\\u00e1ng 8\",\n      \"th\\u00e1ng 9\",\n      \"th\\u00e1ng 10\",\n      \"th\\u00e1ng 11\",\n      \"th\\u00e1ng 12\"\n    ],\n    \"SHORTDAY\": [\n      \"CN\",\n      \"Th 2\",\n      \"Th 3\",\n      \"Th 4\",\n      \"Th 5\",\n      \"Th 6\",\n      \"Th 7\"\n    ],\n    \"SHORTMONTH\": [\n      \"thg 1\",\n      \"thg 2\",\n      \"thg 3\",\n      \"thg 4\",\n      \"thg 5\",\n      \"thg 6\",\n      \"thg 7\",\n      \"thg 8\",\n      \"thg 9\",\n      \"thg 10\",\n      \"thg 11\",\n      \"thg 12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Th\\u00e1ng 1\",\n      \"Th\\u00e1ng 2\",\n      \"Th\\u00e1ng 3\",\n      \"Th\\u00e1ng 4\",\n      \"Th\\u00e1ng 5\",\n      \"Th\\u00e1ng 6\",\n      \"Th\\u00e1ng 7\",\n      \"Th\\u00e1ng 8\",\n      \"Th\\u00e1ng 9\",\n      \"Th\\u00e1ng 10\",\n      \"Th\\u00e1ng 11\",\n      \"Th\\u00e1ng 12\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ab\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vi-vn\",\n  \"localeID\": \"vi_VN\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"SA\",\n      \"CH\"\n    ],\n    \"DAY\": [\n      \"Ch\\u1ee7 Nh\\u1eadt\",\n      \"Th\\u1ee9 Hai\",\n      \"Th\\u1ee9 Ba\",\n      \"Th\\u1ee9 T\\u01b0\",\n      \"Th\\u1ee9 N\\u0103m\",\n      \"Th\\u1ee9 S\\u00e1u\",\n      \"Th\\u1ee9 B\\u1ea3y\"\n    ],\n    \"ERANAMES\": [\n      \"Tr\\u01b0\\u1edbc CN\",\n      \"sau CN\"\n    ],\n    \"ERAS\": [\n      \"Tr\\u01b0\\u1edbc CN\",\n      \"sau CN\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"th\\u00e1ng 1\",\n      \"th\\u00e1ng 2\",\n      \"th\\u00e1ng 3\",\n      \"th\\u00e1ng 4\",\n      \"th\\u00e1ng 5\",\n      \"th\\u00e1ng 6\",\n      \"th\\u00e1ng 7\",\n      \"th\\u00e1ng 8\",\n      \"th\\u00e1ng 9\",\n      \"th\\u00e1ng 10\",\n      \"th\\u00e1ng 11\",\n      \"th\\u00e1ng 12\"\n    ],\n    \"SHORTDAY\": [\n      \"CN\",\n      \"Th 2\",\n      \"Th 3\",\n      \"Th 4\",\n      \"Th 5\",\n      \"Th 6\",\n      \"Th 7\"\n    ],\n    \"SHORTMONTH\": [\n      \"thg 1\",\n      \"thg 2\",\n      \"thg 3\",\n      \"thg 4\",\n      \"thg 5\",\n      \"thg 6\",\n      \"thg 7\",\n      \"thg 8\",\n      \"thg 9\",\n      \"thg 10\",\n      \"thg 11\",\n      \"thg 12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Th\\u00e1ng 1\",\n      \"Th\\u00e1ng 2\",\n      \"Th\\u00e1ng 3\",\n      \"Th\\u00e1ng 4\",\n      \"Th\\u00e1ng 5\",\n      \"Th\\u00e1ng 6\",\n      \"Th\\u00e1ng 7\",\n      \"Th\\u00e1ng 8\",\n      \"Th\\u00e1ng 9\",\n      \"Th\\u00e1ng 10\",\n      \"Th\\u00e1ng 11\",\n      \"Th\\u00e1ng 12\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM, y\",\n    \"longDate\": \"d MMMM, y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ab\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \".\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vi\",\n  \"localeID\": \"vi\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vo-001.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"sudel\",\n      \"mudel\",\n      \"tudel\",\n      \"vedel\",\n      \"d\\u00f6del\",\n      \"fridel\",\n      \"z\\u00e4del\"\n    ],\n    \"ERANAMES\": [\n      \"b. t. kr.\",\n      \"p. t. kr.\"\n    ],\n    \"ERAS\": [\n      \"b. t. kr.\",\n      \"p. t. kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanul\",\n      \"febul\",\n      \"m\\u00e4zul\",\n      \"prilul\",\n      \"mayul\",\n      \"yunul\",\n      \"yulul\",\n      \"gustul\",\n      \"setul\",\n      \"tobul\",\n      \"novul\",\n      \"dekul\"\n    ],\n    \"SHORTDAY\": [\n      \"su.\",\n      \"mu.\",\n      \"tu.\",\n      \"ve.\",\n      \"d\\u00f6.\",\n      \"fr.\",\n      \"z\\u00e4.\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"feb\",\n      \"m\\u00e4z\",\n      \"prl\",\n      \"may\",\n      \"yun\",\n      \"yul\",\n      \"gst\",\n      \"set\",\n      \"ton\",\n      \"nov\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"yanul\",\n      \"febul\",\n      \"m\\u00e4zul\",\n      \"prilul\",\n      \"mayul\",\n      \"yunul\",\n      \"yulul\",\n      \"gustul\",\n      \"setul\",\n      \"tobul\",\n      \"novul\",\n      \"dekul\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM'a' 'd'. d'id'\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM. d HH:mm:ss\",\n    \"mediumDate\": \"y MMM. d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vo-001\",\n  \"localeID\": \"vo_001\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"sudel\",\n      \"mudel\",\n      \"tudel\",\n      \"vedel\",\n      \"d\\u00f6del\",\n      \"fridel\",\n      \"z\\u00e4del\"\n    ],\n    \"ERANAMES\": [\n      \"b. t. kr.\",\n      \"p. t. kr.\"\n    ],\n    \"ERAS\": [\n      \"b. t. kr.\",\n      \"p. t. kr.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"yanul\",\n      \"febul\",\n      \"m\\u00e4zul\",\n      \"prilul\",\n      \"mayul\",\n      \"yunul\",\n      \"yulul\",\n      \"gustul\",\n      \"setul\",\n      \"tobul\",\n      \"novul\",\n      \"dekul\"\n    ],\n    \"SHORTDAY\": [\n      \"su.\",\n      \"mu.\",\n      \"tu.\",\n      \"ve.\",\n      \"d\\u00f6.\",\n      \"fr.\",\n      \"z\\u00e4.\"\n    ],\n    \"SHORTMONTH\": [\n      \"yan\",\n      \"feb\",\n      \"m\\u00e4z\",\n      \"prl\",\n      \"may\",\n      \"yun\",\n      \"yul\",\n      \"gst\",\n      \"set\",\n      \"ton\",\n      \"nov\",\n      \"dek\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"yanul\",\n      \"febul\",\n      \"m\\u00e4zul\",\n      \"prilul\",\n      \"mayul\",\n      \"yunul\",\n      \"yulul\",\n      \"gustul\",\n      \"setul\",\n      \"tobul\",\n      \"novul\",\n      \"dekul\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y MMMM'a' 'd'. d'id'\",\n    \"longDate\": \"y MMMM d\",\n    \"medium\": \"y MMM. d HH:mm:ss\",\n    \"mediumDate\": \"y MMM. d\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vo\",\n  \"localeID\": \"vo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vun-tz.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"utuko\",\n      \"kyiukonyi\"\n    ],\n    \"DAY\": [\n      \"Jumapilyi\",\n      \"Jumatatuu\",\n      \"Jumanne\",\n      \"Jumatanu\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristu\",\n      \"Baada ya Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vun-tz\",\n  \"localeID\": \"vun_TZ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_vun.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"utuko\",\n      \"kyiukonyi\"\n    ],\n    \"DAY\": [\n      \"Jumapilyi\",\n      \"Jumatatuu\",\n      \"Jumanne\",\n      \"Jumatanu\",\n      \"Alhamisi\",\n      \"Ijumaa\",\n      \"Jumamosi\"\n    ],\n    \"ERANAMES\": [\n      \"Kabla ya Kristu\",\n      \"Baada ya Kristu\"\n    ],\n    \"ERAS\": [\n      \"KK\",\n      \"BK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Jpi\",\n      \"Jtt\",\n      \"Jnn\",\n      \"Jtn\",\n      \"Alh\",\n      \"Iju\",\n      \"Jmo\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mac\",\n      \"Apr\",\n      \"Mei\",\n      \"Jun\",\n      \"Jul\",\n      \"Ago\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januari\",\n      \"Februari\",\n      \"Machi\",\n      \"Aprilyi\",\n      \"Mei\",\n      \"Junyi\",\n      \"Julyai\",\n      \"Agusti\",\n      \"Septemba\",\n      \"Oktoba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"TSh\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"vun\",\n  \"localeID\": \"vun\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_wae-ch.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunntag\",\n      \"M\\u00e4ntag\",\n      \"Zi\\u0161tag\",\n      \"Mittwu\\u010d\",\n      \"Fr\\u00f3ntag\",\n      \"Fritag\",\n      \"Sam\\u0161tag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jenner\",\n      \"Hornig\",\n      \"M\\u00e4rze\",\n      \"Abrille\",\n      \"Meije\",\n      \"Br\\u00e1\\u010det\",\n      \"Heiwet\",\n      \"\\u00d6ig\\u0161te\",\n      \"Herb\\u0161tm\\u00e1net\",\n      \"W\\u00edm\\u00e1net\",\n      \"Winterm\\u00e1net\",\n      \"Chri\\u0161tm\\u00e1net\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"M\\u00e4n\",\n      \"Zi\\u0161\",\n      \"Mit\",\n      \"Fr\\u00f3\",\n      \"Fri\",\n      \"Sam\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jen\",\n      \"Hor\",\n      \"M\\u00e4r\",\n      \"Abr\",\n      \"Mei\",\n      \"Br\\u00e1\",\n      \"Hei\",\n      \"\\u00d6ig\",\n      \"Her\",\n      \"W\\u00edm\",\n      \"Win\",\n      \"Chr\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jenner\",\n      \"Hornig\",\n      \"M\\u00e4rze\",\n      \"Abrille\",\n      \"Meije\",\n      \"Br\\u00e1\\u010det\",\n      \"Heiwet\",\n      \"\\u00d6ig\\u0161te\",\n      \"Herb\\u0161tm\\u00e1net\",\n      \"W\\u00edm\\u00e1net\",\n      \"Winterm\\u00e1net\",\n      \"Chri\\u0161tm\\u00e1net\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"wae-ch\",\n  \"localeID\": \"wae_CH\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_wae.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunntag\",\n      \"M\\u00e4ntag\",\n      \"Zi\\u0161tag\",\n      \"Mittwu\\u010d\",\n      \"Fr\\u00f3ntag\",\n      \"Fritag\",\n      \"Sam\\u0161tag\"\n    ],\n    \"ERANAMES\": [\n      \"v. Chr.\",\n      \"n. Chr\"\n    ],\n    \"ERAS\": [\n      \"v. Chr.\",\n      \"n. Chr\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Jenner\",\n      \"Hornig\",\n      \"M\\u00e4rze\",\n      \"Abrille\",\n      \"Meije\",\n      \"Br\\u00e1\\u010det\",\n      \"Heiwet\",\n      \"\\u00d6ig\\u0161te\",\n      \"Herb\\u0161tm\\u00e1net\",\n      \"W\\u00edm\\u00e1net\",\n      \"Winterm\\u00e1net\",\n      \"Chri\\u0161tm\\u00e1net\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"M\\u00e4n\",\n      \"Zi\\u0161\",\n      \"Mit\",\n      \"Fr\\u00f3\",\n      \"Fri\",\n      \"Sam\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jen\",\n      \"Hor\",\n      \"M\\u00e4r\",\n      \"Abr\",\n      \"Mei\",\n      \"Br\\u00e1\",\n      \"Hei\",\n      \"\\u00d6ig\",\n      \"Her\",\n      \"W\\u00edm\",\n      \"Win\",\n      \"Chr\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Jenner\",\n      \"Hornig\",\n      \"M\\u00e4rze\",\n      \"Abrille\",\n      \"Meije\",\n      \"Br\\u00e1\\u010det\",\n      \"Heiwet\",\n      \"\\u00d6ig\\u0161te\",\n      \"Herb\\u0161tm\\u00e1net\",\n      \"W\\u00edm\\u00e1net\",\n      \"Winterm\\u00e1net\",\n      \"Chri\\u0161tm\\u00e1net\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d. MMMM y\",\n    \"longDate\": \"d. MMMM y\",\n    \"medium\": \"d. MMM y HH:mm:ss\",\n    \"mediumDate\": \"d. MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"y-MM-dd HH:mm\",\n    \"shortDate\": \"y-MM-dd\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CHF\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u2019\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"wae\",\n  \"localeID\": \"wae\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_xog-ug.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Munkyo\",\n      \"Eigulo\"\n    ],\n    \"DAY\": [\n      \"Sabiiti\",\n      \"Balaza\",\n      \"Owokubili\",\n      \"Owokusatu\",\n      \"Olokuna\",\n      \"Olokutaanu\",\n      \"Olomukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kulisto nga azilawo\",\n      \"Kulisto nga affile\"\n    ],\n    \"ERAS\": [\n      \"AZ\",\n      \"AF\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Sabi\",\n      \"Bala\",\n      \"Kubi\",\n      \"Kusa\",\n      \"Kuna\",\n      \"Kuta\",\n      \"Muka\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apu\",\n      \"Maa\",\n      \"Juu\",\n      \"Jul\",\n      \"Agu\",\n      \"Seb\",\n      \"Oki\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"xog-ug\",\n  \"localeID\": \"xog_UG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_xog.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"Munkyo\",\n      \"Eigulo\"\n    ],\n    \"DAY\": [\n      \"Sabiiti\",\n      \"Balaza\",\n      \"Owokubili\",\n      \"Owokusatu\",\n      \"Olokuna\",\n      \"Olokutaanu\",\n      \"Olomukaaga\"\n    ],\n    \"ERANAMES\": [\n      \"Kulisto nga azilawo\",\n      \"Kulisto nga affile\"\n    ],\n    \"ERAS\": [\n      \"AZ\",\n      \"AF\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Sabi\",\n      \"Bala\",\n      \"Kubi\",\n      \"Kusa\",\n      \"Kuna\",\n      \"Kuta\",\n      \"Muka\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apu\",\n      \"Maa\",\n      \"Juu\",\n      \"Jul\",\n      \"Agu\",\n      \"Seb\",\n      \"Oki\",\n      \"Nov\",\n      \"Des\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Janwaliyo\",\n      \"Febwaliyo\",\n      \"Marisi\",\n      \"Apuli\",\n      \"Maayi\",\n      \"Juuni\",\n      \"Julaayi\",\n      \"Agusito\",\n      \"Sebuttemba\",\n      \"Okitobba\",\n      \"Novemba\",\n      \"Desemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"UGX\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"xog\",\n  \"localeID\": \"xog\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yav-cm.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ki\\u025bm\\u025b\\u0301\\u025bm\",\n      \"kis\\u025b\\u0301nd\\u025b\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301ndi\\u025b\",\n      \"m\\u00f3ndie\",\n      \"mu\\u00e1ny\\u00e1\\u014bm\\u00f3ndie\",\n      \"met\\u00fakp\\u00ed\\u00e1p\\u025b\",\n      \"k\\u00fap\\u00e9limet\\u00fakpiap\\u025b\",\n      \"fel\\u00e9te\",\n      \"s\\u00e9sel\\u00e9\"\n    ],\n    \"ERANAMES\": [\n      \"katikup\\u00eden Y\\u00e9suse\",\n      \"\\u00e9k\\u00e9l\\u00e9mk\\u00fanup\\u00ed\\u00e9n n\"\n    ],\n    \"ERAS\": [\n      \"k.Y.\",\n      \"+J.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"pik\\u00edt\\u00edk\\u00edtie, o\\u00f3l\\u00ed \\u00fa kut\\u00faan\",\n      \"si\\u025by\\u025b\\u0301, o\\u00f3li \\u00fa k\\u00e1nd\\u00ed\\u025b\",\n      \"\\u0254ns\\u00famb\\u0254l, o\\u00f3li \\u00fa k\\u00e1t\\u00e1t\\u00fa\\u025b\",\n      \"mesi\\u014b, o\\u00f3li \\u00fa k\\u00e9nie\",\n      \"ensil, o\\u00f3li \\u00fa k\\u00e1t\\u00e1nu\\u025b\",\n      \"\\u0254s\\u0254n\",\n      \"efute\",\n      \"pisuy\\u00fa\",\n      \"im\\u025b\\u014b i pu\\u0254s\",\n      \"im\\u025b\\u014b i put\\u00fak,o\\u00f3li \\u00fa k\\u00e1t\\u00ed\\u025b\",\n      \"makandik\\u025b\",\n      \"pil\\u0254nd\\u0254\\u0301\"\n    ],\n    \"SHORTDAY\": [\n      \"sd\",\n      \"md\",\n      \"mw\",\n      \"et\",\n      \"kl\",\n      \"fl\",\n      \"ss\"\n    ],\n    \"SHORTMONTH\": [\n      \"o.1\",\n      \"o.2\",\n      \"o.3\",\n      \"o.4\",\n      \"o.5\",\n      \"o.6\",\n      \"o.7\",\n      \"o.8\",\n      \"o.9\",\n      \"o.10\",\n      \"o.11\",\n      \"o.12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"pik\\u00edt\\u00edk\\u00edtie, o\\u00f3l\\u00ed \\u00fa kut\\u00faan\",\n      \"si\\u025by\\u025b\\u0301, o\\u00f3li \\u00fa k\\u00e1nd\\u00ed\\u025b\",\n      \"\\u0254ns\\u00famb\\u0254l, o\\u00f3li \\u00fa k\\u00e1t\\u00e1t\\u00fa\\u025b\",\n      \"mesi\\u014b, o\\u00f3li \\u00fa k\\u00e9nie\",\n      \"ensil, o\\u00f3li \\u00fa k\\u00e1t\\u00e1nu\\u025b\",\n      \"\\u0254s\\u0254n\",\n      \"efute\",\n      \"pisuy\\u00fa\",\n      \"im\\u025b\\u014b i pu\\u0254s\",\n      \"im\\u025b\\u014b i put\\u00fak,o\\u00f3li \\u00fa k\\u00e1t\\u00ed\\u025b\",\n      \"makandik\\u025b\",\n      \"pil\\u0254nd\\u0254\\u0301\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"yav-cm\",\n  \"localeID\": \"yav_CM\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yav.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"ki\\u025bm\\u025b\\u0301\\u025bm\",\n      \"kis\\u025b\\u0301nd\\u025b\"\n    ],\n    \"DAY\": [\n      \"s\\u0254\\u0301ndi\\u025b\",\n      \"m\\u00f3ndie\",\n      \"mu\\u00e1ny\\u00e1\\u014bm\\u00f3ndie\",\n      \"met\\u00fakp\\u00ed\\u00e1p\\u025b\",\n      \"k\\u00fap\\u00e9limet\\u00fakpiap\\u025b\",\n      \"fel\\u00e9te\",\n      \"s\\u00e9sel\\u00e9\"\n    ],\n    \"ERANAMES\": [\n      \"katikup\\u00eden Y\\u00e9suse\",\n      \"\\u00e9k\\u00e9l\\u00e9mk\\u00fanup\\u00ed\\u00e9n n\"\n    ],\n    \"ERAS\": [\n      \"k.Y.\",\n      \"+J.C.\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"pik\\u00edt\\u00edk\\u00edtie, o\\u00f3l\\u00ed \\u00fa kut\\u00faan\",\n      \"si\\u025by\\u025b\\u0301, o\\u00f3li \\u00fa k\\u00e1nd\\u00ed\\u025b\",\n      \"\\u0254ns\\u00famb\\u0254l, o\\u00f3li \\u00fa k\\u00e1t\\u00e1t\\u00fa\\u025b\",\n      \"mesi\\u014b, o\\u00f3li \\u00fa k\\u00e9nie\",\n      \"ensil, o\\u00f3li \\u00fa k\\u00e1t\\u00e1nu\\u025b\",\n      \"\\u0254s\\u0254n\",\n      \"efute\",\n      \"pisuy\\u00fa\",\n      \"im\\u025b\\u014b i pu\\u0254s\",\n      \"im\\u025b\\u014b i put\\u00fak,o\\u00f3li \\u00fa k\\u00e1t\\u00ed\\u025b\",\n      \"makandik\\u025b\",\n      \"pil\\u0254nd\\u0254\\u0301\"\n    ],\n    \"SHORTDAY\": [\n      \"sd\",\n      \"md\",\n      \"mw\",\n      \"et\",\n      \"kl\",\n      \"fl\",\n      \"ss\"\n    ],\n    \"SHORTMONTH\": [\n      \"o.1\",\n      \"o.2\",\n      \"o.3\",\n      \"o.4\",\n      \"o.5\",\n      \"o.6\",\n      \"o.7\",\n      \"o.8\",\n      \"o.9\",\n      \"o.10\",\n      \"o.11\",\n      \"o.12\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"pik\\u00edt\\u00edk\\u00edtie, o\\u00f3l\\u00ed \\u00fa kut\\u00faan\",\n      \"si\\u025by\\u025b\\u0301, o\\u00f3li \\u00fa k\\u00e1nd\\u00ed\\u025b\",\n      \"\\u0254ns\\u00famb\\u0254l, o\\u00f3li \\u00fa k\\u00e1t\\u00e1t\\u00fa\\u025b\",\n      \"mesi\\u014b, o\\u00f3li \\u00fa k\\u00e9nie\",\n      \"ensil, o\\u00f3li \\u00fa k\\u00e1t\\u00e1nu\\u025b\",\n      \"\\u0254s\\u0254n\",\n      \"efute\",\n      \"pisuy\\u00fa\",\n      \"im\\u025b\\u014b i pu\\u0254s\",\n      \"im\\u025b\\u014b i put\\u00fak,o\\u00f3li \\u00fa k\\u00e1t\\u00ed\\u025b\",\n      \"makandik\\u025b\",\n      \"pil\\u0254nd\\u0254\\u0301\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"FCFA\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a0\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a0\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"yav\",\n  \"localeID\": \"yav\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yi-001.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u05e4\\u05bf\\u05d0\\u05b7\\u05e8\\u05de\\u05d9\\u05d8\\u05d0\\u05b8\\u05d2\",\n      \"\\u05e0\\u05d0\\u05b8\\u05db\\u05de\\u05d9\\u05d8\\u05d0\\u05b8\\u05d2\"\n    ],\n    \"DAY\": [\n      \"\\u05d6\\u05d5\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d0\\u05b8\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05d3\\u05d9\\u05e0\\u05e1\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d9\\u05d8\\u05d5\\u05d5\\u05d0\\u05da\",\n      \"\\u05d3\\u05d0\\u05e0\\u05e2\\u05e8\\u05e9\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e4\\u05bf\\u05e8\\u05f2\\u05b7\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e9\\u05d1\\u05ea\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u05d9\\u05d0\\u05b7\\u05e0\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05e4\\u05bf\\u05e2\\u05d1\\u05e8\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05de\\u05e2\\u05e8\\u05e5\",\n      \"\\u05d0\\u05b7\\u05e4\\u05bc\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d9\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e2\\u05e4\\u05bc\\u05d8\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d0\\u05e7\\u05d8\\u05d0\\u05d1\\u05e2\\u05e8\",\n      \"\\u05e0\\u05d0\\u05d5\\u05d5\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d3\\u05e2\\u05e6\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u05d6\\u05d5\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d0\\u05b8\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05d3\\u05d9\\u05e0\\u05e1\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d9\\u05d8\\u05d5\\u05d5\\u05d0\\u05da\",\n      \"\\u05d3\\u05d0\\u05e0\\u05e2\\u05e8\\u05e9\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e4\\u05bf\\u05e8\\u05f2\\u05b7\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e9\\u05d1\\u05ea\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u05d9\\u05d0\\u05b7\\u05e0\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05e4\\u05bf\\u05e2\\u05d1\\u05e8\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05de\\u05e2\\u05e8\\u05e5\",\n      \"\\u05d0\\u05b7\\u05e4\\u05bc\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d9\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e2\\u05e4\\u05bc\\u05d8\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d0\\u05e7\\u05d8\\u05d0\\u05d1\\u05e2\\u05e8\",\n      \"\\u05e0\\u05d0\\u05d5\\u05d5\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d3\\u05e2\\u05e6\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u05d9\\u05d0\\u05b7\\u05e0\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05e4\\u05bf\\u05e2\\u05d1\\u05e8\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05de\\u05e2\\u05e8\\u05e5\",\n      \"\\u05d0\\u05b7\\u05e4\\u05bc\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d9\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e2\\u05e4\\u05bc\\u05d8\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d0\\u05e7\\u05d8\\u05d0\\u05d1\\u05e2\\u05e8\",\n      \"\\u05e0\\u05d0\\u05d5\\u05d5\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d3\\u05e2\\u05e6\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d\\u05d8\\u05df MMMM y\",\n    \"longDate\": \"d\\u05d8\\u05df MMMM y\",\n    \"medium\": \"d\\u05d8\\u05df MMM y HH:mm:ss\",\n    \"mediumDate\": \"d\\u05d8\\u05df MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"yi-001\",\n  \"localeID\": \"yi_001\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yi.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u05e4\\u05bf\\u05d0\\u05b7\\u05e8\\u05de\\u05d9\\u05d8\\u05d0\\u05b8\\u05d2\",\n      \"\\u05e0\\u05d0\\u05b8\\u05db\\u05de\\u05d9\\u05d8\\u05d0\\u05b8\\u05d2\"\n    ],\n    \"DAY\": [\n      \"\\u05d6\\u05d5\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d0\\u05b8\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05d3\\u05d9\\u05e0\\u05e1\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d9\\u05d8\\u05d5\\u05d5\\u05d0\\u05da\",\n      \"\\u05d3\\u05d0\\u05e0\\u05e2\\u05e8\\u05e9\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e4\\u05bf\\u05e8\\u05f2\\u05b7\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e9\\u05d1\\u05ea\"\n    ],\n    \"ERANAMES\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"CE\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"\\u05d9\\u05d0\\u05b7\\u05e0\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05e4\\u05bf\\u05e2\\u05d1\\u05e8\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05de\\u05e2\\u05e8\\u05e5\",\n      \"\\u05d0\\u05b7\\u05e4\\u05bc\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d9\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e2\\u05e4\\u05bc\\u05d8\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d0\\u05e7\\u05d8\\u05d0\\u05d1\\u05e2\\u05e8\",\n      \"\\u05e0\\u05d0\\u05d5\\u05d5\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d3\\u05e2\\u05e6\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u05d6\\u05d5\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d0\\u05b8\\u05e0\\u05d8\\u05d9\\u05e7\",\n      \"\\u05d3\\u05d9\\u05e0\\u05e1\\u05d8\\u05d9\\u05e7\",\n      \"\\u05de\\u05d9\\u05d8\\u05d5\\u05d5\\u05d0\\u05da\",\n      \"\\u05d3\\u05d0\\u05e0\\u05e2\\u05e8\\u05e9\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e4\\u05bf\\u05e8\\u05f2\\u05b7\\u05d8\\u05d9\\u05e7\",\n      \"\\u05e9\\u05d1\\u05ea\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u05d9\\u05d0\\u05b7\\u05e0\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05e4\\u05bf\\u05e2\\u05d1\\u05e8\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05de\\u05e2\\u05e8\\u05e5\",\n      \"\\u05d0\\u05b7\\u05e4\\u05bc\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d9\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e2\\u05e4\\u05bc\\u05d8\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d0\\u05e7\\u05d8\\u05d0\\u05d1\\u05e2\\u05e8\",\n      \"\\u05e0\\u05d0\\u05d5\\u05d5\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d3\\u05e2\\u05e6\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u05d9\\u05d0\\u05b7\\u05e0\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05e4\\u05bf\\u05e2\\u05d1\\u05e8\\u05d5\\u05d0\\u05b7\\u05e8\",\n      \"\\u05de\\u05e2\\u05e8\\u05e5\",\n      \"\\u05d0\\u05b7\\u05e4\\u05bc\\u05e8\\u05d9\\u05dc\",\n      \"\\u05de\\u05d9\\u05d9\",\n      \"\\u05d9\\u05d5\\u05e0\\u05d9\",\n      \"\\u05d9\\u05d5\\u05dc\\u05d9\",\n      \"\\u05d0\\u05d5\\u05d9\\u05d2\\u05d5\\u05e1\\u05d8\",\n      \"\\u05e1\\u05e2\\u05e4\\u05bc\\u05d8\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d0\\u05e7\\u05d8\\u05d0\\u05d1\\u05e2\\u05e8\",\n      \"\\u05e0\\u05d0\\u05d5\\u05d5\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\",\n      \"\\u05d3\\u05e2\\u05e6\\u05e2\\u05de\\u05d1\\u05e2\\u05e8\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d\\u05d8\\u05df MMMM y\",\n    \"longDate\": \"d\\u05d8\\u05df MMMM y\",\n    \"medium\": \"d\\u05d8\\u05df MMM y HH:mm:ss\",\n    \"mediumDate\": \"d\\u05d8\\u05df MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/yy HH:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20ac\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\\u00a0\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\\u00a0\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"yi\",\n  \"localeID\": \"yi\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yo-bj.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u00c0\\u00e1r\\u0254\\u0300\",\n      \"\\u0186\\u0300s\\u00e1n\"\n    ],\n    \"DAY\": [\n      \"\\u0186j\\u0254\\u0301 \\u00c0\\u00eck\\u00fa\",\n      \"\\u0186j\\u0254\\u0301 Aj\\u00e9\",\n      \"\\u0186j\\u0254\\u0301 \\u00ccs\\u025b\\u0301gun\",\n      \"\\u0186j\\u0254\\u0301r\\u00fa\",\n      \"\\u0186j\\u0254\\u0301b\\u0254\",\n      \"\\u0186j\\u0254\\u0301 \\u0190t\\u00ec\",\n      \"\\u0186j\\u0254\\u0301 \\u00c0b\\u00e1m\\u025b\\u0301ta\"\n    ],\n    \"ERANAMES\": [\n      \"Saju Kristi\",\n      \"Lehin Kristi\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"LK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"Osh\\u00f9 Sh\\u025b\\u0301r\\u025b\\u0301\",\n      \"Osh\\u00f9 \\u00c8r\\u00e8l\\u00e8\",\n      \"Osh\\u00f9 \\u0190r\\u025b\\u0300n\\u00e0\",\n      \"Osh\\u00f9 \\u00ccgb\\u00e9\",\n      \"Osh\\u00f9 \\u0190\\u0300bibi\",\n      \"Osh\\u00f9 \\u00d2k\\u00fadu\",\n      \"Osh\\u00f9 Ag\\u025bm\\u0254\",\n      \"Osh\\u00f9 \\u00d2g\\u00fan\",\n      \"Osh\\u00f9 Owewe\",\n      \"Osh\\u00f9 \\u0186\\u0300w\\u00e0r\\u00e0\",\n      \"Osh\\u00f9 B\\u00e9l\\u00fa\",\n      \"Osh\\u00f9 \\u0186\\u0300p\\u025b\\u0300\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u00c0\\u00eck\\u00fa\",\n      \"Aj\\u00e9\",\n      \"\\u00ccs\\u025b\\u0301gun\",\n      \"\\u0186j\\u0254\\u0301r\\u00fa\",\n      \"\\u0186j\\u0254\\u0301b\\u0254\",\n      \"\\u0190t\\u00ec\",\n      \"\\u00c0b\\u00e1m\\u025b\\u0301ta\"\n    ],\n    \"SHORTMONTH\": [\n      \"Sh\\u025b\\u0301r\\u025b\\u0301\",\n      \"\\u00c8r\\u00e8l\\u00e8\",\n      \"\\u0190r\\u025b\\u0300n\\u00e0\",\n      \"\\u00ccgb\\u00e9\",\n      \"\\u0190\\u0300bibi\",\n      \"\\u00d2k\\u00fadu\",\n      \"Ag\\u025bm\\u0254\",\n      \"\\u00d2g\\u00fan\",\n      \"Owewe\",\n      \"\\u0186\\u0300w\\u00e0r\\u00e0\",\n      \"B\\u00e9l\\u00fa\",\n      \"\\u0186\\u0300p\\u025b\\u0300\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Osh\\u00f9 Sh\\u025b\\u0301r\\u025b\\u0301\",\n      \"Osh\\u00f9 \\u00c8r\\u00e8l\\u00e8\",\n      \"Osh\\u00f9 \\u0190r\\u025b\\u0300n\\u00e0\",\n      \"Osh\\u00f9 \\u00ccgb\\u00e9\",\n      \"Osh\\u00f9 \\u0190\\u0300bibi\",\n      \"Osh\\u00f9 \\u00d2k\\u00fadu\",\n      \"Osh\\u00f9 Ag\\u025bm\\u0254\",\n      \"Osh\\u00f9 \\u00d2g\\u00fan\",\n      \"Osh\\u00f9 Owewe\",\n      \"Osh\\u00f9 \\u0186\\u0300w\\u00e0r\\u00e0\",\n      \"Osh\\u00f9 B\\u00e9l\\u00fa\",\n      \"Osh\\u00f9 \\u0186\\u0300p\\u025b\\u0300\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"CFA\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 0,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"yo-bj\",\n  \"localeID\": \"yo_BJ\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yo-ng.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u00c0\\u00e1r\\u1ecd\\u0300\",\n      \"\\u1ecc\\u0300s\\u00e1n\"\n    ],\n    \"DAY\": [\n      \"\\u1eccj\\u1ecd\\u0301 \\u00c0\\u00eck\\u00fa\",\n      \"\\u1eccj\\u1ecd\\u0301 Aj\\u00e9\",\n      \"\\u1eccj\\u1ecd\\u0301 \\u00ccs\\u1eb9\\u0301gun\",\n      \"\\u1eccj\\u1ecd\\u0301r\\u00fa\",\n      \"\\u1eccj\\u1ecd\\u0301b\\u1ecd\",\n      \"\\u1eccj\\u1ecd\\u0301 \\u1eb8t\\u00ec\",\n      \"\\u1eccj\\u1ecd\\u0301 \\u00c0b\\u00e1m\\u1eb9\\u0301ta\"\n    ],\n    \"ERANAMES\": [\n      \"Saju Kristi\",\n      \"Lehin Kristi\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"LK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"O\\u1e63\\u00f9 \\u1e62\\u1eb9\\u0301r\\u1eb9\\u0301\",\n      \"O\\u1e63\\u00f9 \\u00c8r\\u00e8l\\u00e8\",\n      \"O\\u1e63\\u00f9 \\u1eb8r\\u1eb9\\u0300n\\u00e0\",\n      \"O\\u1e63\\u00f9 \\u00ccgb\\u00e9\",\n      \"O\\u1e63\\u00f9 \\u1eb8\\u0300bibi\",\n      \"O\\u1e63\\u00f9 \\u00d2k\\u00fadu\",\n      \"O\\u1e63\\u00f9 Ag\\u1eb9m\\u1ecd\",\n      \"O\\u1e63\\u00f9 \\u00d2g\\u00fan\",\n      \"O\\u1e63\\u00f9 Owewe\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300w\\u00e0r\\u00e0\",\n      \"O\\u1e63\\u00f9 B\\u00e9l\\u00fa\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300p\\u1eb9\\u0300\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u00c0\\u00eck\\u00fa\",\n      \"Aj\\u00e9\",\n      \"\\u00ccs\\u1eb9\\u0301gun\",\n      \"\\u1eccj\\u1ecd\\u0301r\\u00fa\",\n      \"\\u1eccj\\u1ecd\\u0301b\\u1ecd\",\n      \"\\u1eb8t\\u00ec\",\n      \"\\u00c0b\\u00e1m\\u1eb9\\u0301ta\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1e62\\u1eb9\\u0301r\\u1eb9\\u0301\",\n      \"\\u00c8r\\u00e8l\\u00e8\",\n      \"\\u1eb8r\\u1eb9\\u0300n\\u00e0\",\n      \"\\u00ccgb\\u00e9\",\n      \"\\u1eb8\\u0300bibi\",\n      \"\\u00d2k\\u00fadu\",\n      \"Ag\\u1eb9m\\u1ecd\",\n      \"\\u00d2g\\u00fan\",\n      \"Owewe\",\n      \"\\u1ecc\\u0300w\\u00e0r\\u00e0\",\n      \"B\\u00e9l\\u00fa\",\n      \"\\u1ecc\\u0300p\\u1eb9\\u0300\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"O\\u1e63\\u00f9 \\u1e62\\u1eb9\\u0301r\\u1eb9\\u0301\",\n      \"O\\u1e63\\u00f9 \\u00c8r\\u00e8l\\u00e8\",\n      \"O\\u1e63\\u00f9 \\u1eb8r\\u1eb9\\u0300n\\u00e0\",\n      \"O\\u1e63\\u00f9 \\u00ccgb\\u00e9\",\n      \"O\\u1e63\\u00f9 \\u1eb8\\u0300bibi\",\n      \"O\\u1e63\\u00f9 \\u00d2k\\u00fadu\",\n      \"O\\u1e63\\u00f9 Ag\\u1eb9m\\u1ecd\",\n      \"O\\u1e63\\u00f9 \\u00d2g\\u00fan\",\n      \"O\\u1e63\\u00f9 Owewe\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300w\\u00e0r\\u00e0\",\n      \"O\\u1e63\\u00f9 B\\u00e9l\\u00fa\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300p\\u1eb9\\u0300\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a6\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"yo-ng\",\n  \"localeID\": \"yo_NG\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u00c0\\u00e1r\\u1ecd\\u0300\",\n      \"\\u1ecc\\u0300s\\u00e1n\"\n    ],\n    \"DAY\": [\n      \"\\u1eccj\\u1ecd\\u0301 \\u00c0\\u00eck\\u00fa\",\n      \"\\u1eccj\\u1ecd\\u0301 Aj\\u00e9\",\n      \"\\u1eccj\\u1ecd\\u0301 \\u00ccs\\u1eb9\\u0301gun\",\n      \"\\u1eccj\\u1ecd\\u0301r\\u00fa\",\n      \"\\u1eccj\\u1ecd\\u0301b\\u1ecd\",\n      \"\\u1eccj\\u1ecd\\u0301 \\u1eb8t\\u00ec\",\n      \"\\u1eccj\\u1ecd\\u0301 \\u00c0b\\u00e1m\\u1eb9\\u0301ta\"\n    ],\n    \"ERANAMES\": [\n      \"Saju Kristi\",\n      \"Lehin Kristi\"\n    ],\n    \"ERAS\": [\n      \"BCE\",\n      \"LK\"\n    ],\n    \"FIRSTDAYOFWEEK\": 0,\n    \"MONTH\": [\n      \"O\\u1e63\\u00f9 \\u1e62\\u1eb9\\u0301r\\u1eb9\\u0301\",\n      \"O\\u1e63\\u00f9 \\u00c8r\\u00e8l\\u00e8\",\n      \"O\\u1e63\\u00f9 \\u1eb8r\\u1eb9\\u0300n\\u00e0\",\n      \"O\\u1e63\\u00f9 \\u00ccgb\\u00e9\",\n      \"O\\u1e63\\u00f9 \\u1eb8\\u0300bibi\",\n      \"O\\u1e63\\u00f9 \\u00d2k\\u00fadu\",\n      \"O\\u1e63\\u00f9 Ag\\u1eb9m\\u1ecd\",\n      \"O\\u1e63\\u00f9 \\u00d2g\\u00fan\",\n      \"O\\u1e63\\u00f9 Owewe\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300w\\u00e0r\\u00e0\",\n      \"O\\u1e63\\u00f9 B\\u00e9l\\u00fa\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300p\\u1eb9\\u0300\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u00c0\\u00eck\\u00fa\",\n      \"Aj\\u00e9\",\n      \"\\u00ccs\\u1eb9\\u0301gun\",\n      \"\\u1eccj\\u1ecd\\u0301r\\u00fa\",\n      \"\\u1eccj\\u1ecd\\u0301b\\u1ecd\",\n      \"\\u1eb8t\\u00ec\",\n      \"\\u00c0b\\u00e1m\\u1eb9\\u0301ta\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u1e62\\u1eb9\\u0301r\\u1eb9\\u0301\",\n      \"\\u00c8r\\u00e8l\\u00e8\",\n      \"\\u1eb8r\\u1eb9\\u0300n\\u00e0\",\n      \"\\u00ccgb\\u00e9\",\n      \"\\u1eb8\\u0300bibi\",\n      \"\\u00d2k\\u00fadu\",\n      \"Ag\\u1eb9m\\u1ecd\",\n      \"\\u00d2g\\u00fan\",\n      \"Owewe\",\n      \"\\u1ecc\\u0300w\\u00e0r\\u00e0\",\n      \"B\\u00e9l\\u00fa\",\n      \"\\u1ecc\\u0300p\\u1eb9\\u0300\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"O\\u1e63\\u00f9 \\u1e62\\u1eb9\\u0301r\\u1eb9\\u0301\",\n      \"O\\u1e63\\u00f9 \\u00c8r\\u00e8l\\u00e8\",\n      \"O\\u1e63\\u00f9 \\u1eb8r\\u1eb9\\u0300n\\u00e0\",\n      \"O\\u1e63\\u00f9 \\u00ccgb\\u00e9\",\n      \"O\\u1e63\\u00f9 \\u1eb8\\u0300bibi\",\n      \"O\\u1e63\\u00f9 \\u00d2k\\u00fadu\",\n      \"O\\u1e63\\u00f9 Ag\\u1eb9m\\u1ecd\",\n      \"O\\u1e63\\u00f9 \\u00d2g\\u00fan\",\n      \"O\\u1e63\\u00f9 Owewe\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300w\\u00e0r\\u00e0\",\n      \"O\\u1e63\\u00f9 B\\u00e9l\\u00fa\",\n      \"O\\u1e63\\u00f9 \\u1ecc\\u0300p\\u1eb9\\u0300\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM y HH:mm:ss\",\n    \"mediumDate\": \"d MMM y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"dd/MM/y HH:mm\",\n    \"shortDate\": \"dd/MM/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u20a6\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"yo\",\n  \"localeID\": \"yo\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yue-hk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5 EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"yue-hk\",\n  \"localeID\": \"yue_HK\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_yue.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5 EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"yue\",\n  \"localeID\": \"yue\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zgh-ma.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u2d5c\\u2d49\\u2d3c\\u2d30\\u2d61\\u2d5c\",\n      \"\\u2d5c\\u2d30\\u2d37\\u2d33\\u2d33\\u2d6f\\u2d30\\u2d5c\"\n    ],\n    \"DAY\": [\n      \"\\u2d30\\u2d59\\u2d30\\u2d4e\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d62\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d55\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4e\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\\u2d62\\u2d30\\u2d59\"\n    ],\n    \"ERANAMES\": [\n      \"\\u2d37\\u2d30\\u2d5c \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\",\n      \"\\u2d37\\u2d3c\\u2d3c\\u2d49\\u2d54 \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\"\n    ],\n    \"ERAS\": [\n      \"\\u2d37\\u2d30\\u2d44\",\n      \"\\u2d37\\u2d3c\\u2d44\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u2d30\\u2d59\\u2d30\",\n      \"\\u2d30\\u2d62\\u2d4f\",\n      \"\\u2d30\\u2d59\\u2d49\",\n      \"\\u2d30\\u2d3d\\u2d55\",\n      \"\\u2d30\\u2d3d\\u2d61\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4e\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\",\n      \"\\u2d31\\u2d55\\u2d30\",\n      \"\\u2d4e\\u2d30\\u2d55\",\n      \"\\u2d49\\u2d31\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\",\n      \"\\u2d62\\u2d53\\u2d4f\",\n      \"\\u2d62\\u2d53\\u2d4d\",\n      \"\\u2d56\\u2d53\\u2d5b\",\n      \"\\u2d5b\\u2d53\\u2d5c\",\n      \"\\u2d3d\\u2d5c\\u2d53\",\n      \"\\u2d4f\\u2d53\\u2d61\",\n      \"\\u2d37\\u2d53\\u2d4a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"zgh-ma\",\n  \"localeID\": \"zgh_MA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zgh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u2d5c\\u2d49\\u2d3c\\u2d30\\u2d61\\u2d5c\",\n      \"\\u2d5c\\u2d30\\u2d37\\u2d33\\u2d33\\u2d6f\\u2d30\\u2d5c\"\n    ],\n    \"DAY\": [\n      \"\\u2d30\\u2d59\\u2d30\\u2d4e\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d62\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4f\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d55\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d3d\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4e\\u2d61\\u2d30\\u2d59\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\\u2d62\\u2d30\\u2d59\"\n    ],\n    \"ERANAMES\": [\n      \"\\u2d37\\u2d30\\u2d5c \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\",\n      \"\\u2d37\\u2d3c\\u2d3c\\u2d49\\u2d54 \\u2d4f \\u2d44\\u2d49\\u2d59\\u2d30\"\n    ],\n    \"ERAS\": [\n      \"\\u2d37\\u2d30\\u2d44\",\n      \"\\u2d37\\u2d3c\\u2d44\"\n    ],\n    \"FIRSTDAYOFWEEK\": 5,\n    \"MONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u2d30\\u2d59\\u2d30\",\n      \"\\u2d30\\u2d62\\u2d4f\",\n      \"\\u2d30\\u2d59\\u2d49\",\n      \"\\u2d30\\u2d3d\\u2d55\",\n      \"\\u2d30\\u2d3d\\u2d61\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d4e\",\n      \"\\u2d30\\u2d59\\u2d49\\u2d39\"\n    ],\n    \"SHORTMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\",\n      \"\\u2d31\\u2d55\\u2d30\",\n      \"\\u2d4e\\u2d30\\u2d55\",\n      \"\\u2d49\\u2d31\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\",\n      \"\\u2d62\\u2d53\\u2d4f\",\n      \"\\u2d62\\u2d53\\u2d4d\",\n      \"\\u2d56\\u2d53\\u2d5b\",\n      \"\\u2d5b\\u2d53\\u2d5c\",\n      \"\\u2d3d\\u2d5c\\u2d53\",\n      \"\\u2d4f\\u2d53\\u2d61\",\n      \"\\u2d37\\u2d53\\u2d4a\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u2d49\\u2d4f\\u2d4f\\u2d30\\u2d62\\u2d54\",\n      \"\\u2d31\\u2d55\\u2d30\\u2d62\\u2d55\",\n      \"\\u2d4e\\u2d30\\u2d55\\u2d5a\",\n      \"\\u2d49\\u2d31\\u2d54\\u2d49\\u2d54\",\n      \"\\u2d4e\\u2d30\\u2d62\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4f\\u2d62\\u2d53\",\n      \"\\u2d62\\u2d53\\u2d4d\\u2d62\\u2d53\\u2d63\",\n      \"\\u2d56\\u2d53\\u2d5b\\u2d5c\",\n      \"\\u2d5b\\u2d53\\u2d5c\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d3d\\u2d5c\\u2d53\\u2d31\\u2d54\",\n      \"\\u2d4f\\u2d53\\u2d61\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\",\n      \"\\u2d37\\u2d53\\u2d4a\\u2d30\\u2d4f\\u2d31\\u2d49\\u2d54\"\n    ],\n    \"WEEKENDRANGE\": [\n      4,\n      5\n    ],\n    \"fullDate\": \"EEEE d MMMM y\",\n    \"longDate\": \"d MMMM y\",\n    \"medium\": \"d MMM, y HH:mm:ss\",\n    \"mediumDate\": \"d MMM, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"d/M/y HH:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"dh\",\n    \"DECIMAL_SEP\": \",\",\n    \"GROUP_SEP\": \"\\u00a0\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\\u00a4\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\\u00a4\"\n      }\n    ]\n  },\n  \"id\": \"zgh\",\n  \"localeID\": \"zgh\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-cn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u5468\\u65e5\",\n      \"\\u5468\\u4e00\",\n      \"\\u5468\\u4e8c\",\n      \"\\u5468\\u4e09\",\n      \"\\u5468\\u56db\",\n      \"\\u5468\\u4e94\",\n      \"\\u5468\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-cn\",\n  \"localeID\": \"zh_CN\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hans-cn.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u5468\\u65e5\",\n      \"\\u5468\\u4e00\",\n      \"\\u5468\\u4e8c\",\n      \"\\u5468\\u4e09\",\n      \"\\u5468\\u56db\",\n      \"\\u5468\\u4e94\",\n      \"\\u5468\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hans-cn\",\n  \"localeID\": \"zh_Hans_CN\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hans-hk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u5468\\u65e5\",\n      \"\\u5468\\u4e00\",\n      \"\\u5468\\u4e8c\",\n      \"\\u5468\\u4e09\",\n      \"\\u5468\\u56db\",\n      \"\\u5468\\u4e94\",\n      \"\\u5468\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"d/M/yy ah:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hans-hk\",\n  \"localeID\": \"zh_Hans_HK\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hans-mo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u5468\\u65e5\",\n      \"\\u5468\\u4e00\",\n      \"\\u5468\\u4e8c\",\n      \"\\u5468\\u4e09\",\n      \"\\u5468\\u56db\",\n      \"\\u5468\\u4e94\",\n      \"\\u5468\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"d/M/yy ah:mm\",\n    \"shortDate\": \"d/M/yy\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MOP\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hans-mo\",\n  \"localeID\": \"zh_Hans_MO\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hans-sg.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u5468\\u65e5\",\n      \"\\u5468\\u4e00\",\n      \"\\u5468\\u4e8c\",\n      \"\\u5468\\u4e09\",\n      \"\\u5468\\u56db\",\n      \"\\u5468\\u4e94\",\n      \"\\u5468\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"dd/MM/yy ah:mm\",\n    \"shortDate\": \"dd/MM/yy\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hans-sg\",\n  \"localeID\": \"zh_Hans_SG\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hans.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u5468\\u65e5\",\n      \"\\u5468\\u4e00\",\n      \"\\u5468\\u4e8c\",\n      \"\\u5468\\u4e09\",\n      \"\\u5468\\u56db\",\n      \"\\u5468\\u4e94\",\n      \"\\u5468\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hans\",\n  \"localeID\": \"zh_Hans\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hant-hk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"d/M/y ah:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hant-hk\",\n  \"localeID\": \"zh_Hant_HK\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hant-mo.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"d/M/y ah:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"MOP\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hant-mo\",\n  \"localeID\": \"zh_Hant_MO\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hant-tw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5 EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"NT$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hant-tw\",\n  \"localeID\": \"zh_Hant_TW\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hant.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5 EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"NT$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hant\",\n  \"localeID\": \"zh_Hant\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-hk.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"d/M/y ah:mm\",\n    \"shortDate\": \"d/M/y\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-hk\",\n  \"localeID\": \"zh_HK\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh-tw.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u897f\\u5143\\u524d\",\n      \"\\u897f\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u9031\\u65e5\",\n      \"\\u9031\\u4e00\",\n      \"\\u9031\\u4e8c\",\n      \"\\u9031\\u4e09\",\n      \"\\u9031\\u56db\",\n      \"\\u9031\\u4e94\",\n      \"\\u9031\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5 EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"NT$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh-tw\",\n  \"localeID\": \"zh_TW\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zh.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"\\u4e0a\\u5348\",\n      \"\\u4e0b\\u5348\"\n    ],\n    \"DAY\": [\n      \"\\u661f\\u671f\\u65e5\",\n      \"\\u661f\\u671f\\u4e00\",\n      \"\\u661f\\u671f\\u4e8c\",\n      \"\\u661f\\u671f\\u4e09\",\n      \"\\u661f\\u671f\\u56db\",\n      \"\\u661f\\u671f\\u4e94\",\n      \"\\u661f\\u671f\\u516d\"\n    ],\n    \"ERANAMES\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"ERAS\": [\n      \"\\u516c\\u5143\\u524d\",\n      \"\\u516c\\u5143\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"SHORTDAY\": [\n      \"\\u5468\\u65e5\",\n      \"\\u5468\\u4e00\",\n      \"\\u5468\\u4e8c\",\n      \"\\u5468\\u4e09\",\n      \"\\u5468\\u56db\",\n      \"\\u5468\\u4e94\",\n      \"\\u5468\\u516d\"\n    ],\n    \"SHORTMONTH\": [\n      \"1\\u6708\",\n      \"2\\u6708\",\n      \"3\\u6708\",\n      \"4\\u6708\",\n      \"5\\u6708\",\n      \"6\\u6708\",\n      \"7\\u6708\",\n      \"8\\u6708\",\n      \"9\\u6708\",\n      \"10\\u6708\",\n      \"11\\u6708\",\n      \"12\\u6708\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"\\u4e00\\u6708\",\n      \"\\u4e8c\\u6708\",\n      \"\\u4e09\\u6708\",\n      \"\\u56db\\u6708\",\n      \"\\u4e94\\u6708\",\n      \"\\u516d\\u6708\",\n      \"\\u4e03\\u6708\",\n      \"\\u516b\\u6708\",\n      \"\\u4e5d\\u6708\",\n      \"\\u5341\\u6708\",\n      \"\\u5341\\u4e00\\u6708\",\n      \"\\u5341\\u4e8c\\u6708\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"y\\u5e74M\\u6708d\\u65e5EEEE\",\n    \"longDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"medium\": \"y\\u5e74M\\u6708d\\u65e5 ah:mm:ss\",\n    \"mediumDate\": \"y\\u5e74M\\u6708d\\u65e5\",\n    \"mediumTime\": \"ah:mm:ss\",\n    \"short\": \"y/M/d ah:mm\",\n    \"shortDate\": \"y/M/d\",\n    \"shortTime\": \"ah:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"\\u00a5\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zh\",\n  \"localeID\": \"zh\",\n  \"pluralCat\": function(n, opt_precision) {  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zu-za.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"ISonto\",\n      \"UMsombuluko\",\n      \"ULwesibili\",\n      \"ULwesithathu\",\n      \"ULwesine\",\n      \"ULwesihlanu\",\n      \"UMgqibelo\"\n    ],\n    \"ERANAMES\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"UMasingana\",\n      \"Februwari\",\n      \"Mashi\",\n      \"Ephreli\",\n      \"Meyi\",\n      \"Juni\",\n      \"Julayi\",\n      \"Agasti\",\n      \"Septhemba\",\n      \"Okthoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Son\",\n      \"Mso\",\n      \"Bil\",\n      \"Tha\",\n      \"Sin\",\n      \"Hla\",\n      \"Mgq\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mas\",\n      \"Eph\",\n      \"Mey\",\n      \"Jun\",\n      \"Jul\",\n      \"Aga\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januwari\",\n      \"Februwari\",\n      \"Mashi\",\n      \"Ephreli\",\n      \"Meyi\",\n      \"Juni\",\n      \"Julayi\",\n      \"Agasti\",\n      \"Septhemba\",\n      \"Okthoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y HH:mm:ss\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"M/d/yy HH:mm\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zu-za\",\n  \"localeID\": \"zu_ZA\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/i18n/angular-locale_zu.js",
    "content": "'use strict';\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"ISonto\",\n      \"UMsombuluko\",\n      \"ULwesibili\",\n      \"ULwesithathu\",\n      \"ULwesine\",\n      \"ULwesihlanu\",\n      \"UMgqibelo\"\n    ],\n    \"ERANAMES\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"UMasingana\",\n      \"Februwari\",\n      \"Mashi\",\n      \"Ephreli\",\n      \"Meyi\",\n      \"Juni\",\n      \"Julayi\",\n      \"Agasti\",\n      \"Septhemba\",\n      \"Okthoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"SHORTDAY\": [\n      \"Son\",\n      \"Mso\",\n      \"Bil\",\n      \"Tha\",\n      \"Sin\",\n      \"Hla\",\n      \"Mgq\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mas\",\n      \"Eph\",\n      \"Mey\",\n      \"Jun\",\n      \"Jul\",\n      \"Aga\",\n      \"Sep\",\n      \"Okt\",\n      \"Nov\",\n      \"Dis\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"Januwari\",\n      \"Februwari\",\n      \"Mashi\",\n      \"Ephreli\",\n      \"Meyi\",\n      \"Juni\",\n      \"Julayi\",\n      \"Agasti\",\n      \"Septhemba\",\n      \"Okthoba\",\n      \"Novemba\",\n      \"Disemba\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y HH:mm:ss\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"HH:mm:ss\",\n    \"short\": \"M/d/yy HH:mm\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"HH:mm\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"R\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"zu\",\n  \"localeID\": \"zu\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  if (i == 0 || n == 1) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n"
  },
  {
    "path": "app/vendor/angular/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n  <url>\n    <loc>https://docs.angularjs.org/api</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$animate/nongcls</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$animate/notcsel</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$cacheFactory/iid</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/baddir</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/badrestrict</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/ctreq</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/ctxoverride</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/infchng</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/iscp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/missingattr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/multidir</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/multilink</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/noctrl</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/nodomevents</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/nonassign</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/noslot</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/reqslot</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/selmulti</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/srcset</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/tplrt</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile/uterdir</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$controller/ctrlfmt</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$controller/ctrlreg</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$controller/noscp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$http/baddata</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$http/badjsonp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$http/badreq</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/cdep</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/itkn</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/modulerr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/nomod</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/pget</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/strictdi</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/undef</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector/unpr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/badexpr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/dupvalue</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/interr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/logicbug</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/nochgmustache</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/noconcat</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/reqarg</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/reqcomma</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/reqendbrace</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/reqendinterp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/reqopenbrace</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/reqother</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/unknarg</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/unsafe</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/untermstr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate/wantstring</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interval/badprom</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$location/badpath</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$location/ipthprfx</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$location/isrcharg</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$location/nobase</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$location/nostate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$parse/esc</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$parse/lexerr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$parse/lval</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$parse/syntax</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$parse/ueoe</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$q/norslvr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$q/qcycle</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$resource/badargs</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$resource/badcfg</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$resource/badmember</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$resource/badname</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$rootScope/infdig</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$rootScope/inprog</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$route/norout</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sanitize/elclob</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sanitize/noinert</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sanitize/uinput</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce/icontext</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce/iequirks</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce/imatcher</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce/insecurl</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce/itype</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce/iwcard</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce/unsafe</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$templateRequest/tpload</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$timeout/badprom</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/filter/notarray</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/jqLite/nosel</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/jqLite/offargs</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/jqLite/onargs</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/linky/notstring</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/aobj</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/areq</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/badname</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/btstrpd</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/cpi</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/cpta</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/cpws</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng/test</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngModel/constexpr</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngModel/datefmt</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngModel/nonassign</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngModel/nopromise</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngModel/numfmt</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngOptions/iexp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngPattern/noregexp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRef/noctrl</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRef/nonassign</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRepeat/badident</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRepeat/dupes</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRepeat/iexp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRepeat/iidexp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngTransclude/orphan</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/orderBy/notarray</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/$location</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/accessibility</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/animations</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/bootstrap</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/compiler</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/component-router</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/component</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/concepts</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/controller</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/css-styling</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/databinding</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/decorators</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/di</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/directive</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/e2e-testing</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/expression</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/external-resources</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/filter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/forms</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/i18n</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/ie</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/interpolation</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/introduction</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/migration</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/module</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/production</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/providers</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/scope</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/security</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/services</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/templates</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/guide/unit-testing</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/misc/contribute</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/misc/downloading</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/misc/faq</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/misc</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/misc/started</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/misc/version-support-status</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_00</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_01</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_02</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_03</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_04</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_05</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_06</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_07</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_08</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_09</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_10</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_11</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_12</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_13</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/step_14</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/tutorial/the_end</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.forEach</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.extend</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.merge</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.noop</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.identity</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isUndefined</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isDefined</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isObject</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isString</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isNumber</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isDate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isArray</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isFunction</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.isElement</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.copy</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.equals</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngJq</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.bind</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.toJson</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.fromJson</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngApp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.bootstrap</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.reloadWithDebugInfo</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/object/angular.version</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.injector</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/auto</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/auto/service/$injector</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/auto/service/$provide</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.element</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/angular.Module</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.module</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function/angular.errorHandlingConfig</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$anchorScrollProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$anchorScroll</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$animateProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$animate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$animateCss</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$cacheFactory</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/$cacheFactory.Cache</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$templateCache</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$compile</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngProp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngOn</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$compileProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/$compile.directive.Attributes</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$controllerProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$controller</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/a</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngHref</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngSrc</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngSrcset</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngDisabled</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngChecked</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngReadonly</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngSelected</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngOpen</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/form.FormController</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngForm</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/form</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[text]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[date]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[datetime-local]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[time]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[week]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[month]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[number]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[url]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[email]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[radio]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[range]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input/input[checkbox]</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/textarea</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/input</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngValue</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngBind</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngBindTemplate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngBindHtml</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngChange</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngClass</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngClassOdd</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngClassEven</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngCloak</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngController</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngCsp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngClick</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngDblclick</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMousedown</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMouseup</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMouseover</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMouseenter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMouseleave</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMousemove</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngKeydown</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngKeyup</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngKeypress</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngSubmit</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngFocus</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngBlur</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngCopy</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngCut</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngPaste</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngIf</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngInclude</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngInit</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngList</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/ngModel.NgModelController</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngModel</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/ModelOptions</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngModelOptions</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngNonBindable</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngOptions</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngPluralize</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngRef</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngRepeat</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngShow</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngHide</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngStyle</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngSwitch</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngTransclude</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/script</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/select.SelectController</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/select</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngRequired</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngPattern</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMaxlength</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive/ngMinlength</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$document</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$exceptionHandler</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$filterProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$filter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/filter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/currency</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/number</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/date</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/json</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/lowercase</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/uppercase</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/limitTo</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter/orderBy</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$httpParamSerializer</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$httpParamSerializerJQLike</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$httpProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$http</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$xhrFactory</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$httpBackend</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$interpolateProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$interpolate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$interval</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$jsonpCallbacks</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$locale</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$location</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$locationProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$log</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$logProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$parse</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$parseProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$q</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$qProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$rootElement</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$rootScopeProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$rootScope</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type/$rootScope.Scope</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$sceDelegate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$sceDelegateProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$sceProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$sce</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider/$templateRequestProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$templateRequest</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$timeout</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service/$window</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAnimate/directive/ngAnimateChildren</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAnimate/service/$animateCss</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAnimate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAnimate/service/$animate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAnimate/directive/ngAnimateSwap</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAria</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAria/provider/$ariaProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAria/service/$aria</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/type/Router</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/type/ChildRouter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/type/RootRouter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/type/ComponentInstruction</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/type/RouteDefinition</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/type/RouteParams</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/directive/ngOutlet</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/service/$rootRouter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/service/$routerRootComponent</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngCookies</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngCookies/provider/$cookiesProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngCookies/service/$cookies</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessageFormat</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessages</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessages/directive/ngMessages</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessages/directive/ngMessagesInclude</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessages/directive/ngMessage</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessages/directive/ngMessageExp</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessages/directive/ngMessageDefault</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/object/angular.mock</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$flushPendingTasks</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$verifyNoPendingTasks</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/provider/$exceptionHandlerProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$exceptionHandler</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$log</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$interval</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/type/angular.mock.TzDate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$animate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/function/angular.mock.dump</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$httpBackend</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$timeout</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$controller</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service/$componentController</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMockE2E</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMockE2E/service/$httpBackend</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/type/$rootScope.Scope</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/function/angular.mock.module</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/function/angular.mock.module.sharedInjector</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/function/angular.mock.inject</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/function/browserTrigger</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngParseExt</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngResource</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngResource/provider/$resourceProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngResource/service/$resource</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute/directive/ngView</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute/provider/$routeProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute/service/$route</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute/service/$routeParams</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngSanitize/filter/linky</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngSanitize</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngSanitize/service/$sanitize</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngSanitize/provider/$sanitizeProvider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngTouch/directive/ngSwipeLeft</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngTouch/directive/ngSwipeRight</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngTouch/service/$swipe</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngTouch</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$animate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$cacheFactory</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$compile</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$controller</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$http</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$injector</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interpolate</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$interval</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$location</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$parse</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$q</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$resource</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$rootScope</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$route</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sanitize</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$sce</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$templateRequest</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/$timeout</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/filter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/jqLite</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/linky</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ng</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngModel</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngOptions</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngPattern</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRef</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngRepeat</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/ngTransclude</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/error/orderBy</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/function</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/directive</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/object</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/type</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/provider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/input</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ng/filter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/auto/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAnimate/directive</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAnimate/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAria/provider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngAria/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/type</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/directive</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngComponentRouter/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngCookies/provider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngCookies/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMessages/directive</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/object</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/provider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/type</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMock/function</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngMockE2E/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngResource/provider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngResource/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute/directive</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute/provider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngRoute/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngSanitize/filter</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngSanitize/service</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngSanitize/provider</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngTouch/directive</loc>\n  </url>\n  <url>\n    <loc>https://docs.angularjs.org/api/ngTouch/service</loc>\n  </url>\n</urlset>"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-aria.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngAria\n * @description\n *\n * The `ngAria` module provides support for common\n * [<abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr>](http://www.w3.org/TR/wai-aria/)\n * attributes that convey state or semantic information about the application for users\n * of assistive technologies, such as screen readers.\n *\n * ## Usage\n *\n * For ngAria to do its magic, simply include the module `ngAria` as a dependency. The following\n * directives are supported:\n * `ngModel`, `ngChecked`, `ngReadonly`, `ngRequired`, `ngValue`, `ngDisabled`, `ngShow`, `ngHide`,\n * `ngClick`, `ngDblClick`, and `ngMessages`.\n *\n * Below is a more detailed breakdown of the attributes handled by ngAria:\n *\n * | Directive                                   | Supported Attributes                                                                                |\n * |---------------------------------------------|-----------------------------------------------------------------------------------------------------|\n * | {@link ng.directive:ngModel ngModel}        | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required, input roles |\n * | {@link ng.directive:ngDisabled ngDisabled}  | aria-disabled                                                                                       |\n * | {@link ng.directive:ngRequired ngRequired}  | aria-required                                                                                       |\n * | {@link ng.directive:ngChecked ngChecked}    | aria-checked                                                                                        |\n * | {@link ng.directive:ngReadonly ngReadonly}  | aria-readonly                                                                                       |\n * | {@link ng.directive:ngValue ngValue}        | aria-checked                                                                                        |\n * | {@link ng.directive:ngShow ngShow}          | aria-hidden                                                                                         |\n * | {@link ng.directive:ngHide ngHide}          | aria-hidden                                                                                         |\n * | {@link ng.directive:ngDblclick ngDblclick}  | tabindex                                                                                            |\n * | {@link module:ngMessages ngMessages}        | aria-live                                                                                           |\n * | {@link ng.directive:ngClick ngClick}        | tabindex, keydown event, button role                                                                |\n *\n * Find out more information about each directive by reading the\n * {@link guide/accessibility ngAria Developer Guide}.\n *\n * ## Example\n * Using ngDisabled with ngAria:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\">\n * ```\n * Becomes:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\" aria-disabled=\"true\">\n * ```\n *\n * ## Disabling Specific Attributes\n * It is possible to disable individual attributes added by ngAria with the\n * {@link ngAria.$ariaProvider#config config} method. For more details, see the\n * {@link guide/accessibility Developer Guide}.\n *\n * ## Disabling `ngAria` on Specific Elements\n * It is possible to make `ngAria` ignore a specific element, by adding the `ng-aria-disable`\n * attribute on it. Note that only the element itself (and not its child elements) will be ignored.\n */\nvar ARIA_DISABLE_ATTR = 'ngAriaDisable';\n\nvar ngAriaModule = angular.module('ngAria', ['ng']).\n                        info({ angularVersion: '1.7.8' }).\n                        provider('$aria', $AriaProvider);\n\n/**\n* Internal Utilities\n*/\nvar nodeBlackList = ['BUTTON', 'A', 'INPUT', 'TEXTAREA', 'SELECT', 'DETAILS', 'SUMMARY'];\n\nvar isNodeOneOf = function(elem, nodeTypeArray) {\n  if (nodeTypeArray.indexOf(elem[0].nodeName) !== -1) {\n    return true;\n  }\n};\n/**\n * @ngdoc provider\n * @name $ariaProvider\n * @this\n *\n * @description\n *\n * Used for configuring the ARIA attributes injected and managed by ngAria.\n *\n * ```js\n * angular.module('myApp', ['ngAria'], function config($ariaProvider) {\n *   $ariaProvider.config({\n *     ariaValue: true,\n *     tabindex: false\n *   });\n * });\n *```\n *\n * ## Dependencies\n * Requires the {@link ngAria} module to be installed.\n *\n */\nfunction $AriaProvider() {\n  var config = {\n    ariaHidden: true,\n    ariaChecked: true,\n    ariaReadonly: true,\n    ariaDisabled: true,\n    ariaRequired: true,\n    ariaInvalid: true,\n    ariaValue: true,\n    tabindex: true,\n    bindKeydown: true,\n    bindRoleForClick: true\n  };\n\n  /**\n   * @ngdoc method\n   * @name $ariaProvider#config\n   *\n   * @param {object} config object to enable/disable specific ARIA attributes\n   *\n   *  - **ariaHidden** – `{boolean}` – Enables/disables aria-hidden tags\n   *  - **ariaChecked** – `{boolean}` – Enables/disables aria-checked tags\n   *  - **ariaReadonly** – `{boolean}` – Enables/disables aria-readonly tags\n   *  - **ariaDisabled** – `{boolean}` – Enables/disables aria-disabled tags\n   *  - **ariaRequired** – `{boolean}` – Enables/disables aria-required tags\n   *  - **ariaInvalid** – `{boolean}` – Enables/disables aria-invalid tags\n   *  - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and\n   *    aria-valuenow tags\n   *  - **tabindex** – `{boolean}` – Enables/disables tabindex tags\n   *  - **bindKeydown** – `{boolean}` – Enables/disables keyboard event binding on non-interactive\n   *    elements (such as `div` or `li`) using ng-click, making them more accessible to users of\n   *    assistive technologies\n   *  - **bindRoleForClick** – `{boolean}` – Adds role=button to non-interactive elements (such as\n   *    `div` or `li`) using ng-click, making them more accessible to users of assistive\n   *    technologies\n   *\n   * @description\n   * Enables/disables various ARIA attributes\n   */\n  this.config = function(newConfig) {\n    config = angular.extend(config, newConfig);\n  };\n\n  function watchExpr(attrName, ariaAttr, nodeBlackList, negate) {\n    return function(scope, elem, attr) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      var ariaCamelName = attr.$normalize(ariaAttr);\n      if (config[ariaCamelName] && !isNodeOneOf(elem, nodeBlackList) && !attr[ariaCamelName]) {\n        scope.$watch(attr[attrName], function(boolVal) {\n          // ensure boolean value\n          boolVal = negate ? !boolVal : !!boolVal;\n          elem.attr(ariaAttr, boolVal);\n        });\n      }\n    };\n  }\n  /**\n   * @ngdoc service\n   * @name $aria\n   *\n   * @description\n   * @priority 200\n   *\n   * The $aria service contains helper methods for applying common\n   * [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.\n   *\n   * ngAria injects common accessibility attributes that tell assistive technologies when HTML\n   * elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,\n   * let's review a code snippet from ngAria itself:\n   *\n   *```js\n   * ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {\n   *   return $aria.$$watchExpr('ngDisabled', 'aria-disabled', nodeBlackList, false);\n   * }])\n   *```\n   * Shown above, the ngAria module creates a directive with the same signature as the\n   * traditional `ng-disabled` directive. But this ngAria version is dedicated to\n   * solely managing accessibility attributes on custom elements. The internal `$aria` service is\n   * used to watch the boolean attribute `ngDisabled`. If it has not been explicitly set by the\n   * developer, `aria-disabled` is injected as an attribute with its value synchronized to the\n   * value in `ngDisabled`.\n   *\n   * Because ngAria hooks into the `ng-disabled` directive, developers do not have to do\n   * anything to enable this feature. The `aria-disabled` attribute is automatically managed\n   * simply as a silent side-effect of using `ng-disabled` with the ngAria module.\n   *\n   * The full list of directives that interface with ngAria:\n   * * **ngModel**\n   * * **ngChecked**\n   * * **ngReadonly**\n   * * **ngRequired**\n   * * **ngDisabled**\n   * * **ngValue**\n   * * **ngShow**\n   * * **ngHide**\n   * * **ngClick**\n   * * **ngDblclick**\n   * * **ngMessages**\n   *\n   * Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each\n   * directive.\n   *\n   *\n   * ## Dependencies\n   * Requires the {@link ngAria} module to be installed.\n   */\n  this.$get = function() {\n    return {\n      config: function(key) {\n        return config[key];\n      },\n      $$watchExpr: watchExpr\n    };\n  };\n}\n\n\nngAriaModule.directive('ngShow', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngShow', 'aria-hidden', [], true);\n}])\n.directive('ngHide', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngHide', 'aria-hidden', [], false);\n}])\n.directive('ngValue', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngValue', 'aria-checked', nodeBlackList, false);\n}])\n.directive('ngChecked', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngChecked', 'aria-checked', nodeBlackList, false);\n}])\n.directive('ngReadonly', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngReadonly', 'aria-readonly', nodeBlackList, false);\n}])\n.directive('ngRequired', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngRequired', 'aria-required', nodeBlackList, false);\n}])\n.directive('ngModel', ['$aria', function($aria) {\n\n  function shouldAttachAttr(attr, normalizedAttr, elem, allowBlacklistEls) {\n    return $aria.config(normalizedAttr) &&\n      !elem.attr(attr) &&\n      (allowBlacklistEls || !isNodeOneOf(elem, nodeBlackList)) &&\n      (elem.attr('type') !== 'hidden' || elem[0].nodeName !== 'INPUT');\n  }\n\n  function shouldAttachRole(role, elem) {\n    // if element does not have role attribute\n    // AND element type is equal to role (if custom element has a type equaling shape) <-- remove?\n    // AND element is not in nodeBlackList\n    return !elem.attr('role') && (elem.attr('type') === role) && !isNodeOneOf(elem, nodeBlackList);\n  }\n\n  function getShape(attr, elem) {\n    var type = attr.type,\n        role = attr.role;\n\n    return ((type || role) === 'checkbox' || role === 'menuitemcheckbox') ? 'checkbox' :\n           ((type || role) === 'radio'    || role === 'menuitemradio') ? 'radio' :\n           (type === 'range'              || role === 'progressbar' || role === 'slider') ? 'range' : '';\n  }\n\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    priority: 200, //Make sure watches are fired after any other directives that affect the ngModel value\n    compile: function(elem, attr) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      var shape = getShape(attr, elem);\n\n      return {\n        post: function(scope, elem, attr, ngModel) {\n          var needsTabIndex = shouldAttachAttr('tabindex', 'tabindex', elem, false);\n\n          function ngAriaWatchModelValue() {\n            return ngModel.$modelValue;\n          }\n\n          function getRadioReaction(newVal) {\n            // Strict comparison would cause a BC\n            // eslint-disable-next-line eqeqeq\n            var boolVal = (attr.value == ngModel.$viewValue);\n            elem.attr('aria-checked', boolVal);\n          }\n\n          function getCheckboxReaction() {\n            elem.attr('aria-checked', !ngModel.$isEmpty(ngModel.$viewValue));\n          }\n\n          switch (shape) {\n            case 'radio':\n            case 'checkbox':\n              if (shouldAttachRole(shape, elem)) {\n                elem.attr('role', shape);\n              }\n              if (shouldAttachAttr('aria-checked', 'ariaChecked', elem, false)) {\n                scope.$watch(ngAriaWatchModelValue, shape === 'radio' ?\n                    getRadioReaction : getCheckboxReaction);\n              }\n              if (needsTabIndex) {\n                elem.attr('tabindex', 0);\n              }\n              break;\n            case 'range':\n              if (shouldAttachRole(shape, elem)) {\n                elem.attr('role', 'slider');\n              }\n              if ($aria.config('ariaValue')) {\n                var needsAriaValuemin = !elem.attr('aria-valuemin') &&\n                    (attr.hasOwnProperty('min') || attr.hasOwnProperty('ngMin'));\n                var needsAriaValuemax = !elem.attr('aria-valuemax') &&\n                    (attr.hasOwnProperty('max') || attr.hasOwnProperty('ngMax'));\n                var needsAriaValuenow = !elem.attr('aria-valuenow');\n\n                if (needsAriaValuemin) {\n                  attr.$observe('min', function ngAriaValueMinReaction(newVal) {\n                    elem.attr('aria-valuemin', newVal);\n                  });\n                }\n                if (needsAriaValuemax) {\n                  attr.$observe('max', function ngAriaValueMinReaction(newVal) {\n                    elem.attr('aria-valuemax', newVal);\n                  });\n                }\n                if (needsAriaValuenow) {\n                  scope.$watch(ngAriaWatchModelValue, function ngAriaValueNowReaction(newVal) {\n                    elem.attr('aria-valuenow', newVal);\n                  });\n                }\n              }\n              if (needsTabIndex) {\n                elem.attr('tabindex', 0);\n              }\n              break;\n          }\n\n          if (!attr.hasOwnProperty('ngRequired') && ngModel.$validators.required\n            && shouldAttachAttr('aria-required', 'ariaRequired', elem, false)) {\n            // ngModel.$error.required is undefined on custom controls\n            attr.$observe('required', function() {\n              elem.attr('aria-required', !!attr['required']);\n            });\n          }\n\n          if (shouldAttachAttr('aria-invalid', 'ariaInvalid', elem, true)) {\n            scope.$watch(function ngAriaInvalidWatch() {\n              return ngModel.$invalid;\n            }, function ngAriaInvalidReaction(newVal) {\n              elem.attr('aria-invalid', !!newVal);\n            });\n          }\n        }\n      };\n    }\n  };\n}])\n.directive('ngDisabled', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngDisabled', 'aria-disabled', nodeBlackList, false);\n}])\n.directive('ngMessages', function() {\n  return {\n    restrict: 'A',\n    require: '?ngMessages',\n    link: function(scope, elem, attr, ngMessages) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      if (!elem.attr('aria-live')) {\n        elem.attr('aria-live', 'assertive');\n      }\n    }\n  };\n})\n.directive('ngClick',['$aria', '$parse', function($aria, $parse) {\n  return {\n    restrict: 'A',\n    compile: function(elem, attr) {\n      if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n      var fn = $parse(attr.ngClick);\n      return function(scope, elem, attr) {\n\n        if (!isNodeOneOf(elem, nodeBlackList)) {\n\n          if ($aria.config('bindRoleForClick') && !elem.attr('role')) {\n            elem.attr('role', 'button');\n          }\n\n          if ($aria.config('tabindex') && !elem.attr('tabindex')) {\n            elem.attr('tabindex', 0);\n          }\n\n          if ($aria.config('bindKeydown') && !attr.ngKeydown && !attr.ngKeypress && !attr.ngKeyup) {\n            elem.on('keydown', function(event) {\n              var keyCode = event.which || event.keyCode;\n\n              if (keyCode === 13 || keyCode === 32) {\n                // If the event is triggered on a non-interactive element ...\n                if (nodeBlackList.indexOf(event.target.nodeName) === -1 && !event.target.isContentEditable) {\n                  // ... prevent the default browser behavior (e.g. scrolling when pressing spacebar)\n                  // See https://github.com/angular/angular.js/issues/16664\n                  event.preventDefault();\n                }\n                scope.$apply(callback);\n              }\n\n              function callback() {\n                fn(scope, { $event: event });\n              }\n            });\n          }\n        }\n      };\n    }\n  };\n}])\n.directive('ngDblclick', ['$aria', function($aria) {\n  return function(scope, elem, attr) {\n    if (attr.hasOwnProperty(ARIA_DISABLE_ATTR)) return;\n\n    if ($aria.config('tabindex') && !elem.attr('tabindex') && !isNodeOneOf(elem, nodeBlackList)) {\n      elem.attr('tabindex', 0);\n    }\n  };\n}]);\n\n/* globals nodeBlackList false */\n\ndescribe('$aria', function() {\n  var scope, $compile, element;\n\n  beforeEach(module('ngAria'));\n\n  afterEach(function() {\n    dealoc(element);\n  });\n\n  describe('with `ngAriaDisable`', function() {\n    beforeEach(injectScopeAndCompiler);\n    beforeEach(function() {\n      jasmine.addMatchers({\n        toHaveAttribute: function toHaveAttributeMatcher() {\n          return {\n            compare: function toHaveAttributeCompare(element, attr) {\n              var node = element[0];\n              var pass = node.hasAttribute(attr);\n              var message = 'Expected `' + node.outerHTML + '` ' + (pass ? 'not ' : '') +\n                            'to have attribute `' + attr + '`.';\n\n              return {\n                pass: pass,\n                message: message\n              };\n            }\n          };\n        }\n      });\n    });\n\n    // ariaChecked\n    it('should not attach aria-checked to custom checkbox', function() {\n      compileElement('<div role=\"checkbox\" ng-model=\"val\" ng-aria-disable></div>');\n\n      scope.$apply('val = false');\n      expect(element).not.toHaveAttribute('aria-checked');\n\n      scope.$apply('val = true');\n      expect(element).not.toHaveAttribute('aria-checked');\n    });\n\n    it('should not attach aria-checked to custom radio controls', function() {\n      compileElement(\n          '<div role=\"radio\" ng-model=\"val\" value=\"one\" ng-aria-disable></div>' +\n          '<div role=\"radio\" ng-model=\"val\" value=\"two\" ng-aria-disable></div>');\n\n      var radio1 = element.eq(0);\n      var radio2 = element.eq(1);\n\n      scope.$apply('val = \"one\"');\n      expect(radio1).not.toHaveAttribute('aria-checked');\n      expect(radio2).not.toHaveAttribute('aria-checked');\n\n      scope.$apply('val = \"two\"');\n      expect(radio1).not.toHaveAttribute('aria-checked');\n      expect(radio2).not.toHaveAttribute('aria-checked');\n    });\n\n    // ariaDisabled\n    it('should not attach aria-disabled to custom controls', function() {\n      compileElement('<div ng-disabled=\"val\" ng-aria-disable></div>');\n\n      scope.$apply('val = false');\n      expect(element).not.toHaveAttribute('aria-disabled');\n\n      scope.$apply('val = true');\n      expect(element).not.toHaveAttribute('aria-disabled');\n    });\n\n    // ariaHidden\n    it('should not attach aria-hidden to `ngShow`', function() {\n      compileElement('<div ng-show=\"val\" ng-aria-disable></div>');\n\n      scope.$apply('val = false');\n      expect(element).not.toHaveAttribute('aria-hidden');\n\n      scope.$apply('val = true');\n      expect(element).not.toHaveAttribute('aria-hidden');\n    });\n\n    it('should not attach aria-hidden to `ngHide`', function() {\n      compileElement('<div ng-hide=\"val\" ng-aria-disable></div>');\n\n      scope.$apply('val = false');\n      expect(element).not.toHaveAttribute('aria-hidden');\n\n      scope.$apply('val = true');\n      expect(element).not.toHaveAttribute('aria-hidden');\n    });\n\n    // ariaInvalid\n    it('should not attach aria-invalid to input', function() {\n      compileElement('<input ng-model=\"val\" ng-minlength=\"10\" ng-aria-disable />');\n\n      scope.$apply('val = \"lt 10\"');\n      expect(element).not.toHaveAttribute('aria-invalid');\n\n      scope.$apply('val = \"gt 10 characters\"');\n      expect(element).not.toHaveAttribute('aria-invalid');\n    });\n\n    it('should not attach aria-invalid to custom controls', function() {\n      compileElement('<div role=\"textbox\" ng-model=\"val\" ng-minlength=\"10\" ng-aria-disable></div>');\n\n      scope.$apply('val = \"lt 10\"');\n      expect(element).not.toHaveAttribute('aria-invalid');\n\n      scope.$apply('val = \"gt 10 characters\"');\n      expect(element).not.toHaveAttribute('aria-invalid');\n    });\n\n    // ariaLive\n    it('should not attach aria-live to `ngMessages`', function() {\n      compileElement('<div ng-messages=\"val\" ng-aria-disable>');\n      expect(element).not.toHaveAttribute('aria-live');\n    });\n\n    // ariaReadonly\n    it('should not attach aria-readonly to custom controls', function() {\n      compileElement('<div ng-readonly=\"val\" ng-aria-disable></div>');\n\n      scope.$apply('val = false');\n      expect(element).not.toHaveAttribute('aria-readonly');\n\n      scope.$apply('val = true');\n      expect(element).not.toHaveAttribute('aria-readonly');\n    });\n\n    // ariaRequired\n    it('should not attach aria-required to custom controls with `required`', function() {\n      compileElement('<div ng-model=\"val\" required ng-aria-disable></div>');\n      expect(element).not.toHaveAttribute('aria-required');\n    });\n\n    it('should not attach aria-required to custom controls with `ngRequired`', function() {\n      compileElement('<div ng-model=\"val\" ng-required=\"val\" ng-aria-disable></div>');\n\n      scope.$apply('val = false');\n      expect(element).not.toHaveAttribute('aria-required');\n\n      scope.$apply('val = true');\n      expect(element).not.toHaveAttribute('aria-required');\n    });\n\n    // ariaValue\n    it('should not attach aria-value* to input[range]', function() {\n      compileElement('<input type=\"range\" ng-model=\"val\" min=\"0\" max=\"100\" ng-aria-disable />');\n\n      expect(element).not.toHaveAttribute('aria-valuemax');\n      expect(element).not.toHaveAttribute('aria-valuemin');\n      expect(element).not.toHaveAttribute('aria-valuenow');\n\n      scope.$apply('val = 50');\n      expect(element).not.toHaveAttribute('aria-valuemax');\n      expect(element).not.toHaveAttribute('aria-valuemin');\n      expect(element).not.toHaveAttribute('aria-valuenow');\n\n      scope.$apply('val = 150');\n      expect(element).not.toHaveAttribute('aria-valuemax');\n      expect(element).not.toHaveAttribute('aria-valuemin');\n      expect(element).not.toHaveAttribute('aria-valuenow');\n    });\n\n    it('should not attach aria-value* to custom controls', function() {\n      compileElement(\n          '<div role=\"progressbar\" ng-model=\"val\" min=\"0\" max=\"100\" ng-aria-disable></div>' +\n          '<div role=\"slider\" ng-model=\"val\" min=\"0\" max=\"100\" ng-aria-disable></div>');\n\n      var progressbar = element.eq(0);\n      var slider = element.eq(1);\n\n      ['aria-valuemax', 'aria-valuemin', 'aria-valuenow'].forEach(function(attr) {\n        expect(progressbar).not.toHaveAttribute(attr);\n        expect(slider).not.toHaveAttribute(attr);\n      });\n\n      scope.$apply('val = 50');\n      ['aria-valuemax', 'aria-valuemin', 'aria-valuenow'].forEach(function(attr) {\n        expect(progressbar).not.toHaveAttribute(attr);\n        expect(slider).not.toHaveAttribute(attr);\n      });\n\n      scope.$apply('val = 150');\n      ['aria-valuemax', 'aria-valuemin', 'aria-valuenow'].forEach(function(attr) {\n        expect(progressbar).not.toHaveAttribute(attr);\n        expect(slider).not.toHaveAttribute(attr);\n      });\n    });\n\n    // bindKeypress\n    it('should not bind keypress to `ngClick`', function() {\n      scope.onClick = jasmine.createSpy('onClick');\n      compileElement(\n          '<div ng-click=\"onClick()\" tabindex=\"0\" ng-aria-disable></div>' +\n          '<ul><li ng-click=\"onClick()\" tabindex=\"0\" ng-aria-disable></li></ul>');\n\n      var div = element.find('div');\n      var li = element.find('li');\n\n      div.triggerHandler({type: 'keypress', keyCode: 32});\n      li.triggerHandler({type: 'keypress', keyCode: 32});\n\n      expect(scope.onClick).not.toHaveBeenCalled();\n    });\n\n    // bindRoleForClick\n    it('should not attach role to custom controls', function() {\n      compileElement(\n          '<div ng-click=\"onClick()\" ng-aria-disable></div>' +\n          '<div type=\"checkbox\" ng-model=\"val\" ng-aria-disable></div>' +\n          '<div type=\"radio\" ng-model=\"val\" ng-aria-disable></div>' +\n          '<div type=\"range\" ng-model=\"val\" ng-aria-disable></div>');\n\n      expect(element.eq(0)).not.toHaveAttribute('role');\n      expect(element.eq(1)).not.toHaveAttribute('role');\n      expect(element.eq(2)).not.toHaveAttribute('role');\n      expect(element.eq(3)).not.toHaveAttribute('role');\n    });\n\n    // tabindex\n    it('should not attach tabindex to custom controls', function() {\n      compileElement(\n          '<div role=\"checkbox\" ng-model=\"val\" ng-aria-disable></div>' +\n          '<div role=\"slider\" ng-model=\"val\" ng-aria-disable></div>');\n\n      expect(element.eq(0)).not.toHaveAttribute('tabindex');\n      expect(element.eq(1)).not.toHaveAttribute('tabindex');\n    });\n\n    it('should not attach tabindex to `ngClick` or `ngDblclick`', function() {\n      compileElement(\n          '<div ng-click=\"onClick()\" ng-aria-disable></div>' +\n          '<div ng-dblclick=\"onDblclick()\" ng-aria-disable></div>');\n\n      expect(element.eq(0)).not.toHaveAttribute('tabindex');\n      expect(element.eq(1)).not.toHaveAttribute('tabindex');\n    });\n  });\n\n  describe('aria-hidden', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    it('should attach aria-hidden to ng-show', function() {\n      compileElement('<div ng-show=\"val\"></div>');\n      scope.$apply('val = false');\n      expect(element.attr('aria-hidden')).toBe('true');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-hidden')).toBe('false');\n    });\n\n    it('should attach aria-hidden to ng-hide', function() {\n      compileElement('<div ng-hide=\"val\"></div>');\n      scope.$apply('val = false');\n      expect(element.attr('aria-hidden')).toBe('false');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-hidden')).toBe('true');\n    });\n\n    it('should not change aria-hidden if it is already present on ng-show', function() {\n      compileElement('<div ng-show=\"val\" aria-hidden=\"userSetValue\"></div>');\n      expect(element.attr('aria-hidden')).toBe('userSetValue');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-hidden')).toBe('userSetValue');\n    });\n\n    it('should not change aria-hidden if it is already present on ng-hide', function() {\n      compileElement('<div ng-hide=\"val\" aria-hidden=\"userSetValue\"></div>');\n      expect(element.attr('aria-hidden')).toBe('userSetValue');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-hidden')).toBe('userSetValue');\n    });\n\n    it('should always set aria-hidden to a boolean value', function() {\n      compileElement('<div ng-hide=\"val\"></div>');\n\n      scope.$apply('val = \"test angular\"');\n      expect(element.attr('aria-hidden')).toBe('true');\n\n      scope.$apply('val = null');\n      expect(element.attr('aria-hidden')).toBe('false');\n\n      scope.$apply('val = {}');\n      expect(element.attr('aria-hidden')).toBe('true');\n\n\n      compileElement('<div ng-show=\"val\"></div>');\n\n      scope.$apply('val = \"test angular\"');\n      expect(element.attr('aria-hidden')).toBe('false');\n\n      scope.$apply('val = null');\n      expect(element.attr('aria-hidden')).toBe('true');\n\n      scope.$apply('val = {}');\n      expect(element.attr('aria-hidden')).toBe('false');\n    });\n  });\n\n  describe('aria-hidden when disabled', function() {\n    beforeEach(configAriaProvider({\n      ariaHidden: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not attach aria-hidden', function() {\n      scope.$apply('val = false');\n      compileElement('<div ng-show=\"val\"></div>');\n      expect(element.attr('aria-hidden')).toBeUndefined();\n\n      compileElement('<div ng-hide=\"val\"></div>');\n      expect(element.attr('aria-hidden')).toBeUndefined();\n    });\n  });\n\n  describe('aria-checked', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not attach itself to native input type=\"checkbox\"', function() {\n      compileElement('<input type=\"checkbox\" ng-model=\"val\">');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-checked')).toBeUndefined();\n\n      scope.$apply('val = false');\n      expect(element.attr('aria-checked')).toBeUndefined();\n    });\n\n    it('should attach itself to custom checkbox', function() {\n      compileElement('<div role=\"checkbox\" ng-model=\"val\"></div>');\n\n      scope.$apply('val = \"checked\"');\n      expect(element.attr('aria-checked')).toBe('true');\n\n      scope.$apply('val = null');\n      expect(element.attr('aria-checked')).toBe('false');\n    });\n\n    it('should use `$isEmpty()` to determine if the checkbox is checked',\n      function() {\n        compileElement('<div role=\"checkbox\" ng-model=\"val\"></div>');\n        var ctrl = element.controller('ngModel');\n        ctrl.$isEmpty = function(value) {\n          return value === 'not-checked';\n        };\n\n        scope.$apply('val = true');\n        expect(ctrl.$modelValue).toBe(true);\n        expect(element.attr('aria-checked')).toBe('true');\n\n        scope.$apply('val = false');\n        expect(ctrl.$modelValue).toBe(false);\n        expect(element.attr('aria-checked')).toBe('true');\n\n        scope.$apply('val = \"not-checked\"');\n        expect(ctrl.$modelValue).toBe('not-checked');\n        expect(element.attr('aria-checked')).toBe('false');\n\n        scope.$apply('val = \"checked\"');\n        expect(ctrl.$modelValue).toBe('checked');\n        expect(element.attr('aria-checked')).toBe('true');\n      }\n    );\n\n    it('should not handle native checkbox with ngChecked', function() {\n      var element = $compile('<input type=\"checkbox\" ng-checked=\"val\">')(scope);\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-checked')).toBeUndefined();\n\n      scope.$apply('val = false');\n      expect(element.attr('aria-checked')).toBeUndefined();\n    });\n\n    it('should handle custom checkbox with ngChecked', function() {\n      var element = $compile('<div role=\"checkbox\" ng-checked=\"val\">')(scope);\n\n      scope.$apply('val = true');\n      expect(element.eq(0).attr('aria-checked')).toBe('true');\n\n      scope.$apply('val = false');\n      expect(element.eq(0).attr('aria-checked')).toBe('false');\n    });\n\n    it('should not attach to native input type=\"radio\"', function() {\n      var element = $compile('<input type=\"radio\" ng-model=\"val\" value=\"one\">' +\n                             '<input type=\"radio\" ng-model=\"val\" value=\"two\">')(scope);\n\n      scope.$apply('val=\\'one\\'');\n      expect(element.eq(0).attr('aria-checked')).toBeUndefined();\n      expect(element.eq(1).attr('aria-checked')).toBeUndefined();\n\n      scope.$apply('val=\\'two\\'');\n      expect(element.eq(0).attr('aria-checked')).toBeUndefined();\n      expect(element.eq(1).attr('aria-checked')).toBeUndefined();\n    });\n\n    it('should attach to custom radio controls', function() {\n      var element = $compile('<div role=\"radio\" ng-model=\"val\" value=\"one\"></div>' +\n          '<div role=\"radio\" ng-model=\"val\" value=\"two\"></div>')(scope);\n\n      scope.$apply('val=\\'one\\'');\n      expect(element.eq(0).attr('aria-checked')).toBe('true');\n      expect(element.eq(1).attr('aria-checked')).toBe('false');\n\n      scope.$apply('val=\\'two\\'');\n      expect(element.eq(0).attr('aria-checked')).toBe('false');\n      expect(element.eq(1).attr('aria-checked')).toBe('true');\n    });\n\n    it('should handle custom radios with integer model values', function() {\n      var element = $compile('<div role=\"radio\" ng-model=\"val\" value=\"0\"></div>' +\n          '<div role=\"radio\" ng-model=\"val\" value=\"1\"></div>')(scope);\n\n      scope.$apply('val=0');\n      expect(element.eq(0).attr('aria-checked')).toBe('true');\n      expect(element.eq(1).attr('aria-checked')).toBe('false');\n\n      scope.$apply('val=1');\n      expect(element.eq(0).attr('aria-checked')).toBe('false');\n      expect(element.eq(1).attr('aria-checked')).toBe('true');\n    });\n\n    it('should handle radios with boolean model values using ngValue', function() {\n      var element = $compile('<div role=\"radio\" ng-model=\"val\" ng-value=\"valExp\"></div>' +\n          '<div role=\"radio\" ng-model=\"val\" ng-value=\"valExp2\"></div>')(scope);\n\n      scope.$apply(function() {\n        scope.valExp = true;\n        scope.valExp2 = false;\n        scope.val = true;\n      });\n      expect(element.eq(0).attr('aria-checked')).toBe('true');\n      expect(element.eq(1).attr('aria-checked')).toBe('false');\n\n      scope.$apply('val = false');\n      expect(element.eq(0).attr('aria-checked')).toBe('false');\n      expect(element.eq(1).attr('aria-checked')).toBe('true');\n    });\n\n    it('should attach itself to role=\"menuitemradio\"', function() {\n      scope.val = 'one';\n      compileElement('<div role=\"menuitemradio\" ng-model=\"val\" value=\"one\"></div>');\n      expect(element.attr('aria-checked')).toBe('true');\n\n      scope.$apply('val = \\'two\\'');\n      expect(element.attr('aria-checked')).toBe('false');\n    });\n\n    it('should attach itself to role=\"menuitemcheckbox\"', function() {\n      compileElement('<div role=\"menuitemcheckbox\" ng-model=\"val\"></div>');\n\n      scope.$apply('val = \"checked\"');\n      expect(element.attr('aria-checked')).toBe('true');\n\n      scope.$apply('val = null');\n      expect(element.attr('aria-checked')).toBe('false');\n    });\n\n    it('should not attach itself if an aria-checked value is already present', function() {\n      var element = [\n        $compile('<div role=\\'radio\\' ng-model=\\'val\\' value=\\'{{val3}}\\' aria-checked=\\'userSetValue\\'></div>')(scope),\n        $compile('<div role=\\'menuitemradio\\' ng-model=\\'val\\' value=\\'{{val3}}\\' aria-checked=\\'userSetValue\\'></div>')(scope),\n        $compile('<div role=\\'checkbox\\' checked=\\'checked\\' aria-checked=\\'userSetValue\\'></div>')(scope),\n        $compile('<div role=\\'menuitemcheckbox\\' checked=\\'checked\\' aria-checked=\\'userSetValue\\'></div>')(scope)\n      ];\n      scope.$apply('val1=true;val2=\\'one\\';val3=\\'1\\'');\n      expectAriaAttrOnEachElement(element, 'aria-checked', 'userSetValue');\n    });\n  });\n\n  describe('roles for custom inputs', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    it('should add missing role=\"button\" to custom input', function() {\n      compileElement('<div ng-click=\"someFunction()\"></div>');\n      expect(element.attr('role')).toBe('button');\n    });\n\n    it('should not add role=\"button\" to anchor', function() {\n      compileElement('<a ng-click=\"someFunction()\"></a>');\n      expect(element.attr('role')).not.toBe('button');\n    });\n\n    it('should add missing role=\"checkbox\" to custom input', function() {\n      compileElement('<div type=\"checkbox\" ng-model=\"val\"></div>');\n      expect(element.attr('role')).toBe('checkbox');\n    });\n\n    it('should not add a role to a native checkbox', function() {\n      compileElement('<input type=\"checkbox\" ng-model=\"val\"/>');\n      expect(element.attr('role')).toBeUndefined();\n    });\n\n    it('should add missing role=\"radio\" to custom input', function() {\n      compileElement('<div type=\"radio\" ng-model=\"val\"></div>');\n      expect(element.attr('role')).toBe('radio');\n    });\n\n    it('should not add a role to a native radio button', function() {\n      compileElement('<input type=\"radio\" ng-model=\"val\"/>');\n      expect(element.attr('role')).toBeUndefined();\n    });\n\n    it('should add missing role=\"slider\" to custom input', function() {\n      compileElement('<div type=\"range\" ng-model=\"val\"></div>');\n      expect(element.attr('role')).toBe('slider');\n    });\n\n    it('should not add a role to a native range input', function() {\n      compileElement('<input type=\"range\" ng-model=\"val\"/>');\n      expect(element.attr('role')).toBeUndefined();\n    });\n\n    they('should not add role to native $prop controls', {\n      input: '<input type=\"text\" ng-model=\"val\">',\n      select: '<select type=\"checkbox\" ng-model=\"val\"></select>',\n      textarea: '<textarea type=\"checkbox\" ng-model=\"val\"></textarea>',\n      button: '<button ng-click=\"doClick()\"></button>',\n      summary: '<summary ng-click=\"doClick()\"></summary>',\n      details: '<details ng-click=\"doClick()\"></details>',\n      a: '<a ng-click=\"doClick()\"></a>'\n    }, function(tmpl) {\n      var element = $compile(tmpl)(scope);\n      expect(element.attr('role')).toBeUndefined();\n    });\n  });\n\n  describe('aria-checked when disabled', function() {\n    beforeEach(configAriaProvider({\n      ariaChecked: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not attach aria-checked', function() {\n      compileElement('<div role=\\'radio\\' ng-model=\\'val\\' value=\\'{{val}}\\'></div>');\n      expect(element.attr('aria-checked')).toBeUndefined();\n\n      compileElement('<div role=\\'menuitemradio\\' ng-model=\\'val\\' value=\\'{{val}}\\'></div>');\n      expect(element.attr('aria-checked')).toBeUndefined();\n\n      compileElement('<div role=\\'checkbox\\' checked=\\'checked\\'></div>');\n      expect(element.attr('aria-checked')).toBeUndefined();\n\n      compileElement('<div role=\\'menuitemcheckbox\\' checked=\\'checked\\'></div>');\n      expect(element.attr('aria-checked')).toBeUndefined();\n    });\n  });\n\n  describe('aria-disabled', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    they('should not attach itself to native $prop controls', {\n      input: '<input ng-disabled=\"val\">',\n      textarea: '<textarea ng-disabled=\"val\"></textarea>',\n      select: '<select ng-disabled=\"val\"></select>',\n      button: '<button ng-disabled=\"val\"></button>'\n    }, function(tmpl) {\n      var element = $compile(tmpl)(scope);\n      scope.$apply('val = true');\n\n      expect(element.attr('disabled')).toBeDefined();\n      expect(element.attr('aria-disabled')).toBeUndefined();\n    });\n\n    it('should attach itself to custom controls', function() {\n      compileElement('<div ng-disabled=\"val\"></div>');\n      expect(element.attr('aria-disabled')).toBe('false');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-disabled')).toBe('true');\n\n    });\n\n    it('should not attach itself if an aria-disabled attribute is already present', function() {\n      compileElement('<div ng-disabled=\"val\" aria-disabled=\"userSetValue\"></div>');\n\n      expect(element.attr('aria-disabled')).toBe('userSetValue');\n    });\n\n\n    it('should always set aria-disabled to a boolean value', function() {\n      compileElement('<div ng-disabled=\"val\"></div>');\n\n      scope.$apply('val = \"test angular\"');\n      expect(element.attr('aria-disabled')).toBe('true');\n\n      scope.$apply('val = null');\n      expect(element.attr('aria-disabled')).toBe('false');\n\n      scope.$apply('val = {}');\n      expect(element.attr('aria-disabled')).toBe('true');\n    });\n  });\n\n  describe('aria-disabled when disabled', function() {\n    beforeEach(configAriaProvider({\n      ariaDisabled: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not attach aria-disabled', function() {\n      compileElement('<div ng-disabled=\"val\"></div>');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-disabled')).toBeUndefined();\n    });\n  });\n\n  describe('aria-invalid', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    it('should attach aria-invalid to input', function() {\n      compileElement('<input ng-model=\"txtInput\" ng-minlength=\"10\">');\n      scope.$apply('txtInput=\\'LTten\\'');\n      expect(element.attr('aria-invalid')).toBe('true');\n\n      scope.$apply('txtInput=\\'morethantencharacters\\'');\n      expect(element.attr('aria-invalid')).toBe('false');\n    });\n\n    it('should attach aria-invalid to custom controls', function() {\n      compileElement('<div ng-model=\"txtInput\" role=\"textbox\" ng-minlength=\"10\"></div>');\n      scope.$apply('txtInput=\\'LTten\\'');\n      expect(element.attr('aria-invalid')).toBe('true');\n\n      scope.$apply('txtInput=\\'morethantencharacters\\'');\n      expect(element.attr('aria-invalid')).toBe('false');\n    });\n\n    it('should not attach itself if aria-invalid is already present', function() {\n      compileElement('<input ng-model=\"txtInput\" ng-minlength=\"10\" aria-invalid=\"userSetValue\">');\n      scope.$apply('txtInput=\\'LTten\\'');\n      expect(element.attr('aria-invalid')).toBe('userSetValue');\n    });\n\n    it('should not attach if input is type=\"hidden\"', function() {\n      compileElement('<input type=\"hidden\" ng-model=\"txtInput\">');\n      expect(element.attr('aria-invalid')).toBeUndefined();\n    });\n\n\n    it('should attach aria-invalid to custom control that is type=\"hidden\"', function() {\n      compileElement('<div ng-model=\"txtInput\" type=\"hidden\" role=\"textbox\" ng-minlength=\"10\"></div>');\n      scope.$apply('txtInput=\\'LTten\\'');\n      expect(element.attr('aria-invalid')).toBe('true');\n\n      scope.$apply('txtInput=\\'morethantencharacters\\'');\n      expect(element.attr('aria-invalid')).toBe('false');\n    });\n  });\n\n  describe('aria-invalid when disabled', function() {\n    beforeEach(configAriaProvider({\n      ariaInvalid: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not attach aria-invalid if the option is disabled', function() {\n      scope.$apply('txtInput=\\'LTten\\'');\n      compileElement('<input ng-model=\"txtInput\" ng-minlength=\"10\">');\n      expect(element.attr('aria-invalid')).toBeUndefined();\n    });\n  });\n\n  describe('aria-readonly', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    they('should not attach itself to native $prop controls', {\n      input: '<input ng-readonly=\"val\">',\n      textarea: '<textarea ng-readonly=\"val\"></textarea>',\n      select: '<select ng-readonly=\"val\"></select>',\n      button: '<button ng-readonly=\"val\"></button>'\n    }, function(tmpl) {\n      var element = $compile(tmpl)(scope);\n      scope.$apply('val = true');\n\n      expect(element.attr('readonly')).toBeDefined();\n      expect(element.attr('aria-readonly')).toBeUndefined();\n    });\n\n    it('should attach itself to custom controls', function() {\n      compileElement('<div ng-readonly=\"val\"></div>');\n      expect(element.attr('aria-readonly')).toBe('false');\n\n      scope.$apply('val = true');\n      expect(element.attr('aria-readonly')).toBe('true');\n\n    });\n\n    it('should not attach itself if an aria-readonly attribute is already present', function() {\n      compileElement('<div ng-readonly=\"val\" aria-readonly=\"userSetValue\"></div>');\n\n      expect(element.attr('aria-readonly')).toBe('userSetValue');\n    });\n\n    it('should always set aria-readonly to a boolean value', function() {\n      compileElement('<div ng-readonly=\"val\"></div>');\n\n      scope.$apply('val = \"test angular\"');\n      expect(element.attr('aria-readonly')).toBe('true');\n\n      scope.$apply('val = null');\n      expect(element.attr('aria-readonly')).toBe('false');\n\n      scope.$apply('val = {}');\n      expect(element.attr('aria-readonly')).toBe('true');\n    });\n  });\n\n  describe('aria-readonly when disabled', function() {\n    beforeEach(configAriaProvider({\n      ariaReadonly: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not add the aria-readonly attribute', function() {\n      compileElement('<input ng-model=\\'val\\' readonly>');\n      expect(element.attr('aria-readonly')).toBeUndefined();\n\n      compileElement('<div ng-model=\\'val\\' ng-readonly=\\'true\\'></div>');\n      expect(element.attr('aria-readonly')).toBeUndefined();\n    });\n  });\n\n  describe('aria-required', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not attach to input', function() {\n      compileElement('<input ng-model=\"val\" required>');\n      expect(element.attr('aria-required')).toBeUndefined();\n    });\n\n    it('should attach to custom controls with ngModel and required', function() {\n      compileElement('<div ng-model=\"val\" role=\"checkbox\" required></div>');\n      expect(element.attr('aria-required')).toBe('true');\n    });\n\n    it('should set aria-required to false when ng-required is false', function() {\n      compileElement('<div role=\\'checkbox\\' ng-required=\\'false\\' ng-model=\\'val\\'></div>');\n      expect(element.attr('aria-required')).toBe('false');\n    });\n\n    it('should attach to custom controls with ngRequired', function() {\n      compileElement('<div role=\"checkbox\" ng-model=\"val\" ng-required=\"true\"></div>');\n      expect(element.attr('aria-required')).toBe('true');\n    });\n\n    it('should not attach itself if aria-required is already present', function() {\n      compileElement('<div role=\\'checkbox\\' ng-model=\\'val\\' ng-required=\\'true\\' aria-required=\\'userSetValue\\'></div>');\n      expect(element.attr('aria-required')).toBe('userSetValue');\n    });\n  });\n\n  describe('aria-required when disabled', function() {\n    beforeEach(configAriaProvider({\n      ariaRequired: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not add the aria-required attribute', function() {\n      compileElement('<input ng-model=\\'val\\' required>');\n      expect(element.attr('aria-required')).toBeUndefined();\n\n      compileElement('<div ng-model=\\'val\\' ng-required=\\'true\\'></div>');\n      expect(element.attr('aria-required')).toBeUndefined();\n    });\n  });\n\n  describe('aria-value', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    it('should attach to input type=\"range\"', function() {\n      var element = [\n        $compile('<input type=\"range\" ng-model=\"val\" min=\"0\" max=\"100\">')(scope),\n        $compile('<div role=\"progressbar\" min=\"0\" max=\"100\" ng-model=\"val\">')(scope),\n        $compile('<div role=\"slider\" min=\"0\" max=\"100\" ng-model=\"val\">')(scope)\n      ];\n\n      scope.$apply('val = 50');\n      expectAriaAttrOnEachElement(element, 'aria-valuenow', '50');\n      expectAriaAttrOnEachElement(element, 'aria-valuemin', '0');\n      expectAriaAttrOnEachElement(element, 'aria-valuemax', '100');\n\n      scope.$apply('val = 90');\n      expectAriaAttrOnEachElement(element, 'aria-valuenow', '90');\n    });\n\n    it('should not attach if aria-value* is already present', function() {\n      var element = [\n        $compile('<input type=\"range\" ng-model=\"val\" min=\"0\" max=\"100\" aria-valuenow=\"userSetValue1\" aria-valuemin=\"userSetValue2\" aria-valuemax=\"userSetValue3\">')(scope),\n        $compile('<div role=\"progressbar\" min=\"0\" max=\"100\" ng-model=\"val\" aria-valuenow=\"userSetValue1\" aria-valuemin=\"userSetValue2\" aria-valuemax=\"userSetValue3\">')(scope),\n        $compile('<div role=\"slider\" min=\"0\" max=\"100\" ng-model=\"val\" aria-valuenow=\"userSetValue1\" aria-valuemin=\"userSetValue2\" aria-valuemax=\"userSetValue3\">')(scope)\n      ];\n\n      scope.$apply('val = 50');\n      expectAriaAttrOnEachElement(element, 'aria-valuenow', 'userSetValue1');\n      expectAriaAttrOnEachElement(element, 'aria-valuemin', 'userSetValue2');\n      expectAriaAttrOnEachElement(element, 'aria-valuemax', 'userSetValue3');\n    });\n\n\n    it('should update `aria-valuemin/max` when `min/max` changes dynamically', function() {\n      scope.$apply('min = 25; max = 75');\n      compileElement('<input type=\"range\" ng-model=\"val\" min=\"{{min}}\" max=\"{{max}}\" />');\n\n      expect(element.attr('aria-valuemin')).toBe('25');\n      expect(element.attr('aria-valuemax')).toBe('75');\n\n      scope.$apply('min = 0');\n      expect(element.attr('aria-valuemin')).toBe('0');\n\n      scope.$apply('max = 100');\n      expect(element.attr('aria-valuemax')).toBe('100');\n    });\n\n\n    it('should update `aria-valuemin/max` when `ng-min/ng-max` changes dynamically', function() {\n      scope.$apply('min = 25; max = 75');\n      compileElement('<input type=\"range\" ng-model=\"val\" ng-min=\"min\" ng-max=\"max\" />');\n\n      expect(element.attr('aria-valuemin')).toBe('25');\n      expect(element.attr('aria-valuemax')).toBe('75');\n\n      scope.$apply('min = 0');\n      expect(element.attr('aria-valuemin')).toBe('0');\n\n      scope.$apply('max = 100');\n      expect(element.attr('aria-valuemax')).toBe('100');\n    });\n  });\n\n  describe('announcing ngMessages', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    it('should attach aria-live', function() {\n      var element = [\n        $compile('<div ng-messages=\"myForm.myName.$error\">')(scope)\n      ];\n      expectAriaAttrOnEachElement(element, 'aria-live', 'assertive');\n    });\n  });\n\n  describe('aria-value when disabled', function() {\n    beforeEach(configAriaProvider({\n      ariaValue: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not attach itself', function() {\n      scope.$apply('val = 50');\n\n      compileElement('<input type=\"range\" ng-model=\"val\" min=\"0\" max=\"100\">');\n      expect(element.attr('aria-valuenow')).toBeUndefined();\n      expect(element.attr('aria-valuemin')).toBeUndefined();\n      expect(element.attr('aria-valuemax')).toBeUndefined();\n\n      compileElement('<div role=\"progressbar\" min=\"0\" max=\"100\" ng-model=\"val\">');\n      expect(element.attr('aria-valuenow')).toBeUndefined();\n      expect(element.attr('aria-valuemin')).toBeUndefined();\n      expect(element.attr('aria-valuemax')).toBeUndefined();\n    });\n  });\n\n  describe('tabindex', function() {\n    beforeEach(injectScopeAndCompiler);\n\n    they('should not attach to native control $prop', {\n      'button': '<button ng-click=\\'something\\'></button>',\n      'a': '<a ng-href=\\'#/something\\'>',\n      'input[text]': '<input type=\\'text\\' ng-model=\\'val\\'>',\n      'input[radio]': '<input type=\\'radio\\' ng-model=\\'val\\'>',\n      'input[checkbox]': '<input type=\\'checkbox\\' ng-model=\\'val\\'>',\n      'textarea': '<textarea ng-model=\\'val\\'></textarea>',\n      'select': '<select ng-model=\\'val\\'></select>',\n      'details': '<details ng-model=\\'val\\'></details>'\n    }, function(html) {\n        compileElement(html);\n        expect(element.attr('tabindex')).toBeUndefined();\n    });\n\n    it('should not attach to random ng-model elements', function() {\n      compileElement('<div ng-model=\"val\"></div>');\n      expect(element.attr('tabindex')).toBeUndefined();\n    });\n\n    it('should attach tabindex to custom inputs', function() {\n      compileElement('<div role=\"checkbox\" ng-model=\"val\"></div>');\n      expect(element.attr('tabindex')).toBe('0');\n\n      compileElement('<div role=\"slider\" ng-model=\"val\"></div>');\n      expect(element.attr('tabindex')).toBe('0');\n    });\n\n    it('should attach to ng-click and ng-dblclick', function() {\n      compileElement('<div ng-click=\"someAction()\"></div>');\n      expect(element.attr('tabindex')).toBe('0');\n\n      compileElement('<div ng-dblclick=\"someAction()\"></div>');\n      expect(element.attr('tabindex')).toBe('0');\n    });\n\n    it('should not attach tabindex if it is already on an element', function() {\n      compileElement('<div role=\"button\" tabindex=\"userSetValue\"></div>');\n      expect(element.attr('tabindex')).toBe('userSetValue');\n\n      compileElement('<div role=\"checkbox\" tabindex=\"userSetValue\"></div>');\n      expect(element.attr('tabindex')).toBe('userSetValue');\n\n      compileElement('<div ng-click=\"someAction()\" tabindex=\"userSetValue\"></div>');\n      expect(element.attr('tabindex')).toBe('userSetValue');\n\n      compileElement('<div ng-dblclick=\"someAction()\" tabindex=\"userSetValue\"></div>');\n      expect(element.attr('tabindex')).toBe('userSetValue');\n    });\n  });\n\n  describe('accessible actions', function() {\n    var clickEvents;\n\n    beforeEach(injectScopeAndCompiler);\n    beforeEach(function() {\n      clickEvents = [];\n      scope.onClick = jasmine.createSpy('onClick').and.callFake(function(evt) {\n        var nodeName = evt ? evt.target.nodeName.toLowerCase() : '';\n        var prevented = !!(evt && evt.isDefaultPrevented());\n        clickEvents.push(nodeName + '(' + prevented + ')');\n      });\n    });\n\n    it('should trigger a click from the keyboard (and prevent default action)', function() {\n      compileElement(\n        '<section>' +\n          '<div ng-click=\"onClick($event)\"></div>' +\n          '<ul><li ng-click=\"onClick($event)\"></li></ul>' +\n        '</section>');\n\n      var divElement = element.find('div');\n      var liElement = element.find('li');\n\n      divElement.triggerHandler({type: 'keydown', keyCode: 13});\n      liElement.triggerHandler({type: 'keydown', keyCode: 13});\n      divElement.triggerHandler({type: 'keydown', keyCode: 32});\n      liElement.triggerHandler({type: 'keydown', keyCode: 32});\n\n      expect(clickEvents).toEqual(['div(true)', 'li(true)', 'div(true)', 'li(true)']);\n    });\n\n    it('should trigger a click in browsers that provide `event.which` instead of `event.keyCode`',\n      function() {\n        compileElement(\n          '<section>' +\n            '<div ng-click=\"onClick($event)\"></div>' +\n            '<ul><li ng-click=\"onClick($event)\"></li></ul>' +\n          '</section>');\n\n        var divElement = element.find('div');\n        var liElement = element.find('li');\n\n        divElement.triggerHandler({type: 'keydown', which: 13});\n        liElement.triggerHandler({type: 'keydown', which: 13});\n        divElement.triggerHandler({type: 'keydown', which: 32});\n        liElement.triggerHandler({type: 'keydown', which: 32});\n\n        expect(clickEvents).toEqual(['div(true)', 'li(true)', 'div(true)', 'li(true)']);\n      }\n    );\n\n    it('should not prevent default keyboard action if the target element has editable content',\n      inject(function($document) {\n        // Note:\n        // `contenteditable` is an enumarated (not a boolean) attribute (see\n        // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable).\n        // We need to check the following conditions:\n        //   - No attribute.\n        //   - Value: \"\"\n        //   - Value: \"true\"\n        //   - Value: \"false\"\n\n        function eventFor(keyCode) {\n          return {bubbles: true, cancelable: true, keyCode: keyCode};\n        }\n\n        compileElement(\n          '<section>' +\n            // No attribute.\n            '<div id=\"no-attribute\">' +\n              '<div ng-click=\"onClick($event)\"></div>' +\n              '<ul ng-click=\"onClick($event)\"><li></li></ul>' +\n            '</div>' +\n\n            // Value: \"\"\n            '<div id=\"value-empty\">' +\n              '<div ng-click=\"onClick($event)\" contenteditable=\"\"></div>' +\n              '<ul ng-click=\"onClick($event)\"><li contenteditable=\"\"></li></ul>' +\n            '</div>' +\n\n            // Value: \"true\"\n            '<div id=\"value-true\">' +\n              '<div ng-click=\"onClick($event)\" contenteditable=\"true\"></div>' +\n              '<ul ng-click=\"onClick($event)\"><li contenteditable=\"true\"></li></ul>' +\n            '</div>' +\n\n            // Value: \"false\"\n            '<div id=\"value-false\">' +\n              '<div ng-click=\"onClick($event)\" contenteditable=\"false\"></div>' +\n              '<ul ng-click=\"onClick($event)\"><li contenteditable=\"false\"></li></ul>' +\n            '</div>' +\n          '</section>');\n\n        // Support: Safari 11-12+\n        // Attach to DOM, because otherwise Safari will not update the `isContentEditable` property\n        // based on the `contenteditable` attribute.\n        $document.find('body').append(element);\n\n        var containers = element.children();\n        var container;\n\n        // Using `browserTrigger()`, because it supports event bubbling.\n\n        // No attribute | Elements are not editable.\n        container = containers.eq(0);\n        browserTrigger(container.find('div'), 'keydown', eventFor(13));\n        browserTrigger(container.find('ul'), 'keydown', eventFor(32));\n        browserTrigger(container.find('li'), 'keydown', eventFor(13));\n\n        expect(clickEvents).toEqual(['div(true)', 'ul(true)', 'li(true)']);\n\n        // Value: \"\" | Elements are editable.\n        clickEvents = [];\n        container = containers.eq(1);\n        browserTrigger(container.find('div'), 'keydown', eventFor(32));\n        browserTrigger(container.find('ul'), 'keydown', eventFor(13));\n        browserTrigger(container.find('li'), 'keydown', eventFor(32));\n\n        expect(clickEvents).toEqual(['div(false)', 'ul(true)', 'li(false)']);\n\n        // Value: \"true\" | Elements are editable.\n        clickEvents = [];\n        container = containers.eq(2);\n        browserTrigger(container.find('div'), 'keydown', eventFor(13));\n        browserTrigger(container.find('ul'), 'keydown', eventFor(32));\n        browserTrigger(container.find('li'), 'keydown', eventFor(13));\n\n        expect(clickEvents).toEqual(['div(false)', 'ul(true)', 'li(false)']);\n\n        // Value: \"false\" | Elements are not editable.\n        clickEvents = [];\n        container = containers.eq(3);\n        browserTrigger(container.find('div'), 'keydown', eventFor(32));\n        browserTrigger(container.find('ul'), 'keydown', eventFor(13));\n        browserTrigger(container.find('li'), 'keydown', eventFor(32));\n\n        expect(clickEvents).toEqual(['div(true)', 'ul(true)', 'li(true)']);\n      })\n    );\n\n    they('should not prevent default keyboard action if an interactive $type element' +\n      'is nested inside ng-click', nodeBlackList, function(elementType) {\n        function createHTML(type) {\n          return '<' + type + '></' + type + '>';\n        }\n\n        compileElement(\n          '<section>' +\n            '<div ng-click=\"onClick($event)\">' + createHTML(elementType) + '</div>' +\n          '</section>');\n\n        var divElement = element.find('div');\n        var interactiveElement = element.find(elementType);\n\n        // Use browserTrigger because it supports event bubbling\n        // 13 Enter\n        browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 13});\n        expect(clickEvents).toEqual([elementType.toLowerCase() + '(false)']);\n\n        clickEvents = [];\n\n        // 32 Space\n        browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 32});\n        expect(clickEvents).toEqual([elementType.toLowerCase() + '(false)']);\n      }\n    );\n\n    they('should not bind to key events if there is existing `ng-$prop`',\n      ['keydown', 'keypress', 'keyup'], function(eventName) {\n        scope.onKeyEvent = jasmine.createSpy('onKeyEvent');\n        compileElement('<div ng-click=\"onClick()\" ng-' + eventName + '=\"onKeyEvent()\"></div>');\n\n        element.triggerHandler({type: eventName, keyCode: 13});\n        element.triggerHandler({type: eventName, keyCode: 32});\n\n        expect(scope.onClick).not.toHaveBeenCalled();\n        expect(scope.onKeyEvent).toHaveBeenCalledTimes(2);\n      }\n    );\n\n    it('should update bindings when keydown is handled', function() {\n      scope.count = 0;\n      compileElement('<div ng-click=\"count = count + 1\">Count: {{ count }}</div>');\n\n      expect(element.text()).toBe('Count: 0');\n\n      element.triggerHandler({type: 'keydown', keyCode: 13});\n      expect(element.text()).toBe('Count: 1');\n\n      element.triggerHandler({type: 'keydown', keyCode: 32});\n      expect(element.text()).toBe('Count: 2');\n    });\n\n    it('should pass `$event` to `ng-click` handler as local', function() {\n      compileElement('<div ng-click=\"event = $event\">{{ event.type }}{{ event.keyCode }}</div>');\n      expect(element.text()).toBe('');\n\n      element.triggerHandler({type: 'keydown', keyCode: 13});\n      expect(element.text()).toBe('keydown13');\n\n      element.triggerHandler({type: 'keydown', keyCode: 32});\n      expect(element.text()).toBe('keydown32');\n    });\n\n    it('should not bind keydown to natively interactive elements', function() {\n      compileElement('<button ng-click=\"onClick()\">Click me</button>');\n\n      element.triggerHandler({type: 'keydown', keyCode: 13});\n      element.triggerHandler({type: 'keydown', keyCode: 32});\n\n      expect(scope.onClick).not.toHaveBeenCalled();\n    });\n  });\n\n  describe('actions when bindRoleForClick is set to false', function() {\n    beforeEach(configAriaProvider({\n      bindRoleForClick: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not add a button role', function() {\n      compileElement('<radio-group ng-click=\"something\"></radio-group>');\n      expect(element.attr('role')).toBeUndefined();\n    });\n  });\n\n  describe('actions when bindKeydown is set to false', function() {\n    beforeEach(configAriaProvider({\n      bindKeydown: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not trigger click', function() {\n      scope.someAction = jasmine.createSpy('someAction');\n\n      element = $compile('<div ng-click=\"someAction()\" tabindex=\"0\"></div>')(scope);\n\n      element.triggerHandler({type: 'keydown', keyCode: 13});\n      element.triggerHandler({type: 'keydown', keyCode: 32});\n      element.triggerHandler({type: 'keypress', keyCode: 13});\n      element.triggerHandler({type: 'keypress', keyCode: 32});\n      element.triggerHandler({type: 'keyup', keyCode: 13});\n      element.triggerHandler({type: 'keyup', keyCode: 32});\n\n      expect(scope.someAction).not.toHaveBeenCalled();\n\n      element.triggerHandler({type: 'click', keyCode: 32});\n\n      expect(scope.someAction).toHaveBeenCalledOnce();\n    });\n  });\n\n  describe('tabindex when disabled', function() {\n    beforeEach(configAriaProvider({\n      tabindex: false\n    }));\n    beforeEach(injectScopeAndCompiler);\n\n    it('should not add a tabindex attribute', function() {\n      compileElement('<div role=\"button\"></div>');\n      expect(element.attr('tabindex')).toBeUndefined();\n\n      compileElement('<div role=\"checkbox\"></div>');\n      expect(element.attr('tabindex')).toBeUndefined();\n\n      compileElement('<div ng-click=\"someAction()\"></div>');\n      expect(element.attr('tabindex')).toBeUndefined();\n\n      compileElement('<div ng-dblclick=\"someAction()\"></div>');\n      expect(element.attr('tabindex')).toBeUndefined();\n    });\n  });\n\n  describe('ngModel', function() {\n    it('should not break when manually compiling', function() {\n      module(function($compileProvider) {\n        $compileProvider.directive('foo', function() {\n          return {\n            priority: 10,\n            terminal: true,\n            link: function(scope, elem) {\n              $compile(elem, null, 10)(scope);\n            }\n          };\n        });\n      });\n\n      injectScopeAndCompiler();\n      compileElement('<div role=\"checkbox\" ng-model=\"value\" foo />');\n\n      // Just check an arbitrary feature to make sure it worked\n      expect(element.attr('tabindex')).toBe('0');\n    });\n  });\n\n  // Helpers\n  function compileElement(inputHtml) {\n    element = $compile(inputHtml)(scope);\n    scope.$digest();\n  }\n\n  function configAriaProvider(config) {\n    return function() {\n      module(function($ariaProvider) {\n        $ariaProvider.config(config);\n      });\n    };\n  }\n\n  function expectAriaAttrOnEachElement(elem, ariaAttr, expected) {\n    angular.forEach(elem, function(val) {\n      expect(angular.element(val).attr(ariaAttr)).toBe(expected);\n    });\n  }\n\n  function injectScopeAndCompiler() {\n    return inject(function(_$compile_, _$rootScope_) {\n      $compile = _$compile_;\n      scope = _$rootScope_;\n    });\n  }\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-cookies.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngCookies\n * @description\n *\n * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.\n *\n * See {@link ngCookies.$cookies `$cookies`} for usage.\n */\n\n\nangular.module('ngCookies', ['ng']).\n  info({ angularVersion: '1.7.8' }).\n  /**\n   * @ngdoc provider\n   * @name $cookiesProvider\n   * @description\n   * Use `$cookiesProvider` to change the default behavior of the {@link ngCookies.$cookies $cookies} service.\n   * */\n   provider('$cookies', [/** @this */function $CookiesProvider() {\n    /**\n     * @ngdoc property\n     * @name $cookiesProvider#defaults\n     * @description\n     *\n     * Object containing default options to pass when setting cookies.\n     *\n     * The object may have following properties:\n     *\n     * - **path** - `{string}` - The cookie will be available only for this path and its\n     *   sub-paths. By default, this is the URL that appears in your `<base>` tag.\n     * - **domain** - `{string}` - The cookie will be available only for this domain and\n     *   its sub-domains. For security reasons the user agent will not accept the cookie\n     *   if the current domain is not a sub-domain of this domain or equal to it.\n     * - **expires** - `{string|Date}` - String of the form \"Wdy, DD Mon YYYY HH:MM:SS GMT\"\n     *   or a Date object indicating the exact date/time this cookie will expire.\n     * - **secure** - `{boolean}` - If `true`, then the cookie will only be available through a\n     *   secured connection.\n     * - **samesite** - `{string}` - prevents the browser from sending the cookie along with cross-site requests.\n     *   Accepts the values `lax` and `strict`. See the [OWASP Wiki](https://www.owasp.org/index.php/SameSite)\n     *   for more info. Note that as of May 2018, not all browsers support `SameSite`,\n     *   so it cannot be used as a single measure against Cross-Site-Request-Forgery (CSRF) attacks.\n     *\n     * Note: By default, the address that appears in your `<base>` tag will be used as the path.\n     * This is important so that cookies will be visible for all routes when html5mode is enabled.\n     *\n     * @example\n     *\n     * ```js\n     * angular.module('cookiesProviderExample', ['ngCookies'])\n     *   .config(['$cookiesProvider', function($cookiesProvider) {\n     *     // Setting default options\n     *     $cookiesProvider.defaults.domain = 'foo.com';\n     *     $cookiesProvider.defaults.secure = true;\n     *   }]);\n     * ```\n     **/\n    var defaults = this.defaults = {};\n\n    function calcOptions(options) {\n      return options ? angular.extend({}, defaults, options) : defaults;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $cookies\n     *\n     * @description\n     * Provides read/write access to browser's cookies.\n     *\n     * <div class=\"alert alert-info\">\n     * Up until AngularJS 1.3, `$cookies` exposed properties that represented the\n     * current browser cookie values. In version 1.4, this behavior has changed, and\n     * `$cookies` now provides a standard api of getters, setters etc.\n     * </div>\n     *\n     * Requires the {@link ngCookies `ngCookies`} module to be installed.\n     *\n     * @example\n     *\n     * ```js\n     * angular.module('cookiesExample', ['ngCookies'])\n     *   .controller('ExampleController', ['$cookies', function($cookies) {\n     *     // Retrieving a cookie\n     *     var favoriteCookie = $cookies.get('myFavorite');\n     *     // Setting a cookie\n     *     $cookies.put('myFavorite', 'oatmeal');\n     *   }]);\n     * ```\n     */\n    this.$get = ['$$cookieReader', '$$cookieWriter', function($$cookieReader, $$cookieWriter) {\n      return {\n        /**\n         * @ngdoc method\n         * @name $cookies#get\n         *\n         * @description\n         * Returns the value of given cookie key\n         *\n         * @param {string} key Id to use for lookup.\n         * @returns {string} Raw cookie value.\n         */\n        get: function(key) {\n          return $$cookieReader()[key];\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#getObject\n         *\n         * @description\n         * Returns the deserialized value of given cookie key\n         *\n         * @param {string} key Id to use for lookup.\n         * @returns {Object} Deserialized cookie value.\n         */\n        getObject: function(key) {\n          var value = this.get(key);\n          return value ? angular.fromJson(value) : value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#getAll\n         *\n         * @description\n         * Returns a key value object with all the cookies\n         *\n         * @returns {Object} All cookies\n         */\n        getAll: function() {\n          return $$cookieReader();\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#put\n         *\n         * @description\n         * Sets a value for given cookie key\n         *\n         * @param {string} key Id for the `value`.\n         * @param {string} value Raw value to be stored.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        put: function(key, value, options) {\n          $$cookieWriter(key, value, calcOptions(options));\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#putObject\n         *\n         * @description\n         * Serializes and sets a value for given cookie key\n         *\n         * @param {string} key Id for the `value`.\n         * @param {Object} value Value to be stored.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        putObject: function(key, value, options) {\n          this.put(key, angular.toJson(value), options);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookies#remove\n         *\n         * @description\n         * Remove given cookie\n         *\n         * @param {string} key Id of the key-value pair to delete.\n         * @param {Object=} options Options object.\n         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}\n         */\n        remove: function(key, options) {\n          $$cookieWriter(key, undefined, calcOptions(options));\n        }\n      };\n    }];\n  }]);\n\n/**\n * @name $$cookieWriter\n * @requires $document\n *\n * @description\n * This is a private service for writing cookies\n *\n * @param {string} name Cookie name\n * @param {string=} value Cookie value (if undefined, cookie will be deleted)\n * @param {Object=} options Object with options that need to be stored for the cookie.\n */\nfunction $$CookieWriter($document, $log, $browser) {\n  var cookiePath = $browser.baseHref();\n  var rawDocument = $document[0];\n\n  function buildCookieString(name, value, options) {\n    var path, expires;\n    options = options || {};\n    expires = options.expires;\n    path = angular.isDefined(options.path) ? options.path : cookiePath;\n    if (angular.isUndefined(value)) {\n      expires = 'Thu, 01 Jan 1970 00:00:00 GMT';\n      value = '';\n    }\n    if (angular.isString(expires)) {\n      expires = new Date(expires);\n    }\n\n    var str = encodeURIComponent(name) + '=' + encodeURIComponent(value);\n    str += path ? ';path=' + path : '';\n    str += options.domain ? ';domain=' + options.domain : '';\n    str += expires ? ';expires=' + expires.toUTCString() : '';\n    str += options.secure ? ';secure' : '';\n    str += options.samesite ? ';samesite=' + options.samesite : '';\n\n    // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:\n    // - 300 cookies\n    // - 20 cookies per unique domain\n    // - 4096 bytes per cookie\n    var cookieLength = str.length + 1;\n    if (cookieLength > 4096) {\n      $log.warn('Cookie \\'' + name +\n        '\\' possibly not set or overflowed because it was too large (' +\n        cookieLength + ' > 4096 bytes)!');\n    }\n\n    return str;\n  }\n\n  return function(name, value, options) {\n    rawDocument.cookie = buildCookieString(name, value, options);\n  };\n}\n\n$$CookieWriter.$inject = ['$document', '$log', '$browser'];\n\nangular.module('ngCookies').provider('$$cookieWriter', /** @this */ function $$CookieWriterProvider() {\n  this.$get = $$CookieWriter;\n});\n\ndescribe('$cookies', function() {\n  var mockedCookies;\n\n  beforeEach(function() {\n    mockedCookies = {};\n    module('ngCookies', {\n      $$cookieWriter: jasmine.createSpy('$$cookieWriter').and.callFake(function(name, value) {\n        mockedCookies[name] = value;\n      }),\n      $$cookieReader: function() {\n        return mockedCookies;\n      }\n    });\n  });\n\n\n  it('should serialize objects to json', inject(function($cookies) {\n    $cookies.putObject('objectCookie', {id: 123, name: 'blah'});\n    expect($cookies.get('objectCookie')).toEqual('{\"id\":123,\"name\":\"blah\"}');\n  }));\n\n\n  it('should deserialize json to object', inject(function($cookies) {\n    $cookies.put('objectCookie', '{\"id\":123,\"name\":\"blah\"}');\n    expect($cookies.getObject('objectCookie')).toEqual({id: 123, name: 'blah'});\n  }));\n\n\n  it('should delete objects from the store when remove is called', inject(function($cookies) {\n    $cookies.putObject('gonner', { 'I\\'ll':'Be Back'});\n    expect($cookies.get('gonner')).toEqual('{\"I\\'ll\":\"Be Back\"}');\n    $cookies.remove('gonner');\n    expect($cookies.get('gonner')).toEqual(undefined);\n  }));\n\n\n  it('should handle empty string value cookies', inject(function($cookies) {\n    $cookies.putObject('emptyCookie','');\n    expect($cookies.get('emptyCookie')).toEqual('\"\"');\n    expect($cookies.getObject('emptyCookie')).toEqual('');\n    mockedCookies['blankCookie'] = '';\n    expect($cookies.getObject('blankCookie')).toEqual('');\n  }));\n\n\n  it('should put cookie value without serializing', inject(function($cookies) {\n    $cookies.put('name', 'value');\n    $cookies.put('name2', '\"value2\"');\n    expect($cookies.get('name')).toEqual('value');\n    expect($cookies.getObject('name2')).toEqual('value2');\n  }));\n\n\n  it('should get cookie value without deserializing', inject(function($cookies) {\n    $cookies.put('name', 'value');\n    $cookies.putObject('name2', 'value2');\n    expect($cookies.get('name')).toEqual('value');\n    expect($cookies.get('name2')).toEqual('\"value2\"');\n  }));\n\n  it('should get all the cookies', inject(function($cookies) {\n    $cookies.put('name', 'value');\n    $cookies.putObject('name2', 'value2');\n    expect($cookies.getAll()).toEqual({name: 'value', name2: '\"value2\"'});\n  }));\n\n\n  it('should pass options on put', inject(function($cookies, $$cookieWriter) {\n    $cookies.put('name', 'value', {path: '/a/b'});\n    expect($$cookieWriter).toHaveBeenCalledWith('name', 'value', {path: '/a/b'});\n  }));\n\n\n  it('should pass options on putObject', inject(function($cookies, $$cookieWriter) {\n    $cookies.putObject('name', 'value', {path: '/a/b'});\n    expect($$cookieWriter).toHaveBeenCalledWith('name', '\"value\"', {path: '/a/b'});\n  }));\n\n\n  it('should pass options on remove', inject(function($cookies, $$cookieWriter) {\n    $cookies.remove('name', {path: '/a/b'});\n    expect($$cookieWriter).toHaveBeenCalledWith('name', undefined, {path: '/a/b'});\n  }));\n\n\n  it('should pass default options on put', function() {\n    module(function($cookiesProvider) {\n      $cookiesProvider.defaults.secure = true;\n    });\n    inject(function($cookies, $$cookieWriter) {\n      $cookies.put('name', 'value', {path: '/a/b'});\n      expect($$cookieWriter).toHaveBeenCalledWith('name', 'value', {path: '/a/b', secure: true});\n    });\n  });\n\n\n  it('should pass default options on putObject', function() {\n    module(function($cookiesProvider) {\n      $cookiesProvider.defaults.secure = true;\n    });\n    inject(function($cookies, $$cookieWriter) {\n      $cookies.putObject('name', 'value', {path: '/a/b'});\n      expect($$cookieWriter).toHaveBeenCalledWith('name', '\"value\"', {path: '/a/b', secure: true});\n    });\n  });\n\n\n  it('should pass default options on remove', function() {\n    module(function($cookiesProvider) {\n      $cookiesProvider.defaults.secure = true;\n    });\n    inject(function($cookies, $$cookieWriter) {\n      $cookies.remove('name', {path: '/a/b'});\n      expect($$cookieWriter).toHaveBeenCalledWith('name', undefined, {path: '/a/b', secure: true});\n    });\n  });\n\n\n  it('should let passed options override default options', function() {\n    module(function($cookiesProvider) {\n      $cookiesProvider.defaults.secure = true;\n    });\n    inject(function($cookies, $$cookieWriter) {\n      $cookies.put('name', 'value', {secure: false});\n      expect($$cookieWriter).toHaveBeenCalledWith('name', 'value', {secure: false});\n    });\n  });\n\n\n  it('should pass default options if no options are passed', function() {\n    module(function($cookiesProvider) {\n      $cookiesProvider.defaults.secure = true;\n    });\n    inject(function($cookies, $$cookieWriter) {\n      $cookies.put('name', 'value');\n      expect($$cookieWriter).toHaveBeenCalledWith('name', 'value', {secure: true});\n    });\n  });\n\n });\n\ndescribe('$$cookieWriter', function() {\n  var $$cookieWriter, document;\n\n  function deleteAllCookies() {\n    var cookies = document.cookie.split(';');\n    var path = window.location.pathname;\n\n    for (var i = 0; i < cookies.length; i++) {\n      var cookie = cookies[i];\n      var eqPos = cookie.indexOf('=');\n      var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n      var parts = path.split('/');\n      while (parts.length) {\n        document.cookie = name + '=;path=' + (parts.join('/') || '/') + ';expires=Thu, 01 Jan 1970 00:00:00 GMT';\n        parts.pop();\n      }\n    }\n  }\n\n  beforeEach(function() {\n    document = window.document;\n    deleteAllCookies();\n    expect(document.cookie).toEqual('');\n\n    module('ngCookies');\n    inject(function(_$$cookieWriter_) {\n      $$cookieWriter = _$$cookieWriter_;\n    });\n  });\n\n\n  afterEach(function() {\n    deleteAllCookies();\n    expect(document.cookie).toEqual('');\n  });\n\n\n  describe('remove via $$cookieWriter(cookieName, undefined)', function() {\n\n    it('should remove a cookie when it is present', function() {\n      document.cookie = 'foo=bar;path=/';\n\n      $$cookieWriter('foo', undefined);\n\n      expect(document.cookie).toEqual('');\n    });\n\n\n    it('should do nothing when an nonexisting cookie is being removed', function() {\n      $$cookieWriter('doesntexist', undefined);\n      expect(document.cookie).toEqual('');\n    });\n  });\n\n\n  describe('put via $$cookieWriter(cookieName, string)', function() {\n\n    it('should create and store a cookie', function() {\n      $$cookieWriter('cookieName', 'cookie=Value');\n      expect(document.cookie).toMatch(/cookieName=cookie%3DValue;? ?/);\n    });\n\n\n    it('should overwrite an existing unsynced cookie', function() {\n      document.cookie = 'cookie=new;path=/';\n\n      var oldVal = $$cookieWriter('cookie', 'newer');\n\n      expect(document.cookie).toEqual('cookie=newer');\n      expect(oldVal).not.toBeDefined();\n    });\n\n    it('should encode both name and value', function() {\n      $$cookieWriter('cookie1=', 'val;ue');\n      $$cookieWriter('cookie2=bar;baz', 'val=ue');\n\n      var rawCookies = document.cookie.split('; '); //order is not guaranteed, so we need to parse\n      expect(rawCookies.length).toEqual(2);\n      expect(rawCookies).toContain('cookie1%3D=val%3Bue');\n      expect(rawCookies).toContain('cookie2%3Dbar%3Bbaz=val%3Due');\n    });\n\n    it('should log warnings when 4kb per cookie storage limit is reached', inject(function($log) {\n      var i, longVal = '', cookieStr;\n\n      for (i = 0; i < 4083; i++) {\n        longVal += 'x';\n      }\n\n      cookieStr = document.cookie;\n      $$cookieWriter('x', longVal); //total size 4093-4096, so it should go through\n      expect(document.cookie).not.toEqual(cookieStr);\n      expect(document.cookie).toEqual('x=' + longVal);\n      expect($log.warn.logs).toEqual([]);\n\n      $$cookieWriter('x', longVal + 'xxxx'); //total size 4097-4099, a warning should be logged\n      expect($log.warn.logs).toEqual(\n        [['Cookie \\'x\\' possibly not set or overflowed because it was too large (4097 > 4096 ' +\n           'bytes)!']]);\n\n      //force browser to dropped a cookie and make sure that the cache is not out of sync\n      $$cookieWriter('x', 'shortVal');\n      expect(document.cookie).toEqual('x=shortVal'); //needed to prime the cache\n      cookieStr = document.cookie;\n      $$cookieWriter('x', longVal + longVal + longVal); //should be too long for all browsers\n\n      if (document.cookie !== cookieStr) {\n        this.fail(new Error('browser didn\\'t drop long cookie when it was expected. make the ' +\n            'cookie in this test longer'));\n      }\n\n      expect(document.cookie).toEqual('x=shortVal');\n      $log.reset();\n    }));\n  });\n\n  describe('put via $$cookieWriter(cookieName, string), if no <base href> ', function() {\n    beforeEach(inject(function($browser) {\n      $browser.$$baseHref = undefined;\n    }));\n\n    it('should default path in cookie to \"\" (empty string)', function() {\n      $$cookieWriter('cookie', 'bender');\n      // This only fails in Safari and IE when cookiePath returns undefined\n      // Where it now succeeds since baseHref return '' instead of undefined\n      expect(document.cookie).toEqual('cookie=bender');\n    });\n  });\n});\n\ndescribe('cookie options', function() {\n  var fakeDocument, $$cookieWriter;\n  var isUndefined = angular.isUndefined;\n\n  function getLastCookieAssignment(key) {\n    return fakeDocument[0].cookie\n              .split(';')\n              .reduce(function(prev, value) {\n                var pair = value.split('=', 2);\n                if (pair[0] === key) {\n                  if (isUndefined(prev)) {\n                    return isUndefined(pair[1]) ? true : pair[1];\n                  } else {\n                    throw new Error('duplicate key in cookie string');\n                  }\n                } else {\n                  return prev;\n                }\n              }, undefined);\n  }\n\n  beforeEach(function() {\n    fakeDocument = [{cookie: ''}];\n    module('ngCookies', {$document: fakeDocument});\n    inject(function($browser) {\n      $browser.$$baseHref = '/a/b';\n    });\n    inject(function(_$$cookieWriter_) {\n      $$cookieWriter = _$$cookieWriter_;\n    });\n  });\n\n  it('should use baseHref as default path', function() {\n    $$cookieWriter('name', 'value');\n    expect(getLastCookieAssignment('path')).toBe('/a/b');\n  });\n\n  it('should accept path option', function() {\n    $$cookieWriter('name', 'value', {path: '/c/d'});\n    expect(getLastCookieAssignment('path')).toBe('/c/d');\n  });\n\n  it('should accept domain option', function() {\n    $$cookieWriter('name', 'value', {domain: '.example.com'});\n    expect(getLastCookieAssignment('domain')).toBe('.example.com');\n  });\n\n  it('should accept secure option', function() {\n    $$cookieWriter('name', 'value', {secure: true});\n    expect(getLastCookieAssignment('secure')).toBe(true);\n  });\n\n  it('should accept samesite option when value is lax', function() {\n    $$cookieWriter('name', 'value', {samesite: 'lax'});\n    expect(getLastCookieAssignment('samesite')).toBe('lax');\n  });\n\n  it('should accept samesite option when value is strict', function() {\n    $$cookieWriter('name', 'value', {samesite: 'strict'});\n    expect(getLastCookieAssignment('samesite')).toBe('strict');\n  });\n\n  it('should accept expires option on set', function() {\n    $$cookieWriter('name', 'value', {expires: 'Fri, 19 Dec 2014 00:00:00 GMT'});\n    expect(getLastCookieAssignment('expires')).toMatch(/^Fri, 19 Dec 2014 00:00:00 (UTC|GMT)$/);\n  });\n\n  it('should always use epoch time as expire time on remove', function() {\n    $$cookieWriter('name', undefined, {expires: 'Fri, 19 Dec 2014 00:00:00 GMT'});\n    expect(getLastCookieAssignment('expires')).toMatch(/^Thu, 0?1 Jan 1970 00:00:00 (UTC|GMT)$/);\n  });\n\n  it('should accept date object as expires option', function() {\n    $$cookieWriter('name', 'value', {expires: new Date(Date.UTC(1981, 11, 27))});\n    expect(getLastCookieAssignment('expires')).toMatch(/^Sun, 27 Dec 1981 00:00:00 (UTC|GMT)$/);\n  });\n\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-message-format.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global isFunction: false */\n/* global noop: false */\n/* global toJson: false */\n/* global $$stringify: false */\n\n// Convert an index into the string into line/column for use in error messages\n// As such, this doesn't have to be efficient.\nfunction indexToLineAndColumn(text, index) {\n  var lines = text.split(/\\n/g);\n  for (var i = 0; i < lines.length; i++) {\n    var line = lines[i];\n    if (index >= line.length) {\n      index -= line.length;\n    } else {\n      return { line: i + 1, column: index + 1 };\n    }\n  }\n}\nvar PARSE_CACHE_FOR_TEXT_LITERALS = Object.create(null);\n\nfunction parseTextLiteral(text) {\n  var cachedFn = PARSE_CACHE_FOR_TEXT_LITERALS[text];\n  if (cachedFn != null) {\n    return cachedFn;\n  }\n  function parsedFn(context) { return text; }\n  parsedFn['$$watchDelegate'] = function watchDelegate(scope, listener, objectEquality) {\n    var unwatch = scope['$watch'](noop,\n        function textLiteralWatcher() {\n          listener(text, text, scope);\n          unwatch();\n        },\n        objectEquality);\n    return unwatch;\n  };\n  PARSE_CACHE_FOR_TEXT_LITERALS[text] = parsedFn;\n  parsedFn['exp'] = text; // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n  parsedFn['expressions'] = []; // Require this to call $compile.$$addBindingInfo() which allows Protractor to find elements by binding.\n  return parsedFn;\n}\n\nfunction subtractOffset(expressionFn, offset) {\n  if (offset === 0) {\n    return expressionFn;\n  }\n  function minusOffset(value) {\n    return (value == null) ? value : value - offset;\n  }\n  function parsedFn(context) { return minusOffset(expressionFn(context)); }\n  var unwatch;\n  parsedFn['$$watchDelegate'] = function watchDelegate(scope, listener, objectEquality) {\n    unwatch = scope['$watch'](expressionFn,\n        function pluralExpressionWatchListener(newValue, oldValue) {\n          listener(minusOffset(newValue), minusOffset(oldValue), scope);\n        },\n        objectEquality);\n    return unwatch;\n  };\n  return parsedFn;\n}\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: false */\n/* global isFunction: false */\n/* global noop: false */\n\n/**\n * @constructor\n * @private\n */\nfunction MessageSelectorBase(expressionFn, choices) {\n  var self = this;\n  this.expressionFn = expressionFn;\n  this.choices = choices;\n  if (choices['other'] === undefined) {\n    throw $interpolateMinErr('reqother', '“other” is a required option.');\n  }\n  this.parsedFn = function(context) { return self.getResult(context); };\n  this.parsedFn['$$watchDelegate'] = function $$watchDelegate(scope, listener, objectEquality) {\n    return self.watchDelegate(scope, listener, objectEquality);\n  };\n  this.parsedFn['exp'] = expressionFn['exp'];\n  this.parsedFn['expressions'] = expressionFn['expressions'];\n}\n\nMessageSelectorBase.prototype.getMessageFn = function getMessageFn(value) {\n  return this.choices[this.categorizeValue(value)];\n};\n\nMessageSelectorBase.prototype.getResult = function getResult(context) {\n  return this.getMessageFn(this.expressionFn(context))(context);\n};\n\nMessageSelectorBase.prototype.watchDelegate = function watchDelegate(scope, listener, objectEquality) {\n  var watchers = new MessageSelectorWatchers(this, scope, listener, objectEquality);\n  return function() { watchers.cancelWatch(); };\n};\n\n/**\n * @constructor\n * @private\n */\nfunction MessageSelectorWatchers(msgSelector, scope, listener, objectEquality) {\n  var self = this;\n  this.scope = scope;\n  this.msgSelector = msgSelector;\n  this.listener = listener;\n  this.objectEquality = objectEquality;\n  this.lastMessage = undefined;\n  this.messageFnWatcher = noop;\n  var expressionFnListener = function(newValue, oldValue) { return self.expressionFnListener(newValue, oldValue); };\n  this.expressionFnWatcher = scope['$watch'](msgSelector.expressionFn, expressionFnListener, objectEquality);\n}\n\nMessageSelectorWatchers.prototype.expressionFnListener = function expressionFnListener(newValue, oldValue) {\n  var self = this;\n  this.messageFnWatcher();\n  var messageFnListener = function(newMessage, oldMessage) { return self.messageFnListener(newMessage, oldMessage); };\n  var messageFn = this.msgSelector.getMessageFn(newValue);\n  this.messageFnWatcher = this.scope['$watch'](messageFn, messageFnListener, this.objectEquality);\n};\n\nMessageSelectorWatchers.prototype.messageFnListener = function messageFnListener(newMessage, oldMessage) {\n  this.listener.call(null, newMessage, newMessage === oldMessage ? newMessage : this.lastMessage, this.scope);\n  this.lastMessage = newMessage;\n};\n\nMessageSelectorWatchers.prototype.cancelWatch = function cancelWatch() {\n  this.expressionFnWatcher();\n  this.messageFnWatcher();\n};\n\n/**\n * @constructor\n * @extends MessageSelectorBase\n * @private\n */\nfunction SelectMessage(expressionFn, choices) {\n  MessageSelectorBase.call(this, expressionFn, choices);\n}\n\nfunction SelectMessageProto() {}\nSelectMessageProto.prototype = MessageSelectorBase.prototype;\n\nSelectMessage.prototype = new SelectMessageProto();\nSelectMessage.prototype.categorizeValue = function categorizeSelectValue(value) {\n  return (this.choices[value] !== undefined) ? value : 'other';\n};\n\n/**\n * @constructor\n * @extends MessageSelectorBase\n * @private\n */\nfunction PluralMessage(expressionFn, choices, offset, pluralCat) {\n  MessageSelectorBase.call(this, expressionFn, choices);\n  this.offset = offset;\n  this.pluralCat = pluralCat;\n}\n\nfunction PluralMessageProto() {}\nPluralMessageProto.prototype = MessageSelectorBase.prototype;\n\nPluralMessage.prototype = new PluralMessageProto();\nPluralMessage.prototype.categorizeValue = function categorizePluralValue(value) {\n  if (isNaN(value)) {\n    return 'other';\n  } else if (this.choices[value] !== undefined) {\n    return value;\n  } else {\n    var category = this.pluralCat(value - this.offset);\n    return (this.choices[category] !== undefined) ? category : 'other';\n  }\n};\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: false */\n/* global isFunction: false */\n/* global parseTextLiteral: false */\n\n/**\n * @constructor\n * @private\n */\nfunction InterpolationParts(trustedContext, allOrNothing) {\n  this.trustedContext = trustedContext;\n  this.allOrNothing = allOrNothing;\n  this.textParts = [];\n  this.expressionFns = [];\n  this.expressionIndices = [];\n  this.partialText = '';\n  this.concatParts = null;\n}\n\nInterpolationParts.prototype.flushPartialText = function flushPartialText() {\n  if (this.partialText) {\n    if (this.concatParts == null) {\n      this.textParts.push(this.partialText);\n    } else {\n      this.textParts.push(this.concatParts.join(''));\n      this.concatParts = null;\n    }\n    this.partialText = '';\n  }\n};\n\nInterpolationParts.prototype.addText = function addText(text) {\n  if (text.length) {\n    if (!this.partialText) {\n      this.partialText = text;\n    } else if (this.concatParts) {\n      this.concatParts.push(text);\n    } else {\n      this.concatParts = [this.partialText, text];\n    }\n  }\n};\n\nInterpolationParts.prototype.addExpressionFn = function addExpressionFn(expressionFn) {\n  this.flushPartialText();\n  this.expressionIndices.push(this.textParts.length);\n  this.expressionFns.push(expressionFn);\n  this.textParts.push('');\n};\n\nInterpolationParts.prototype.getExpressionValues = function getExpressionValues(context) {\n  var expressionValues = new Array(this.expressionFns.length);\n  for (var i = 0; i < this.expressionFns.length; i++) {\n    expressionValues[i] = this.expressionFns[i](context);\n  }\n  return expressionValues;\n};\n\nInterpolationParts.prototype.getResult = function getResult(expressionValues) {\n  for (var i = 0; i < this.expressionIndices.length; i++) {\n    var expressionValue = expressionValues[i];\n    if (this.allOrNothing && expressionValue === undefined) return;\n    this.textParts[this.expressionIndices[i]] = expressionValue;\n  }\n  return this.textParts.join('');\n};\n\n\nInterpolationParts.prototype.toParsedFn = function toParsedFn(mustHaveExpression, originalText) {\n  var self = this;\n  this.flushPartialText();\n  if (mustHaveExpression && this.expressionFns.length === 0) {\n    return undefined;\n  }\n  if (this.textParts.length === 0) {\n    return parseTextLiteral('');\n  }\n  if (this.trustedContext && this.textParts.length > 1) {\n    $interpolateMinErr['throwNoconcat'](originalText);\n  }\n  if (this.expressionFns.length === 0) {\n    if (this.textParts.length !== 1) { this.errorInParseLogic(); }\n    return parseTextLiteral(this.textParts[0]);\n  }\n  var parsedFn = function(context) {\n    return self.getResult(self.getExpressionValues(context));\n  };\n  parsedFn['$$watchDelegate'] = function $$watchDelegate(scope, listener, objectEquality) {\n    return self.watchDelegate(scope, listener, objectEquality);\n  };\n\n  parsedFn['exp'] = originalText; // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n  parsedFn['expressions'] = new Array(this.expressionFns.length); // Require this to call $compile.$$addBindingInfo() which allows Protractor to find elements by binding.\n  for (var i = 0; i < this.expressionFns.length; i++) {\n    parsedFn['expressions'][i] = this.expressionFns[i]['exp'];\n  }\n\n  return parsedFn;\n};\n\nInterpolationParts.prototype.watchDelegate = function watchDelegate(scope, listener, objectEquality) {\n  var watcher = new InterpolationPartsWatcher(this, scope, listener, objectEquality);\n  return function() { watcher.cancelWatch(); };\n};\n\nfunction InterpolationPartsWatcher(interpolationParts, scope, listener, objectEquality) {\n  this.interpolationParts = interpolationParts;\n  this.scope = scope;\n  this.previousResult = (undefined);\n  this.listener = listener;\n  var self = this;\n  this.expressionFnsWatcher = scope['$watchGroup'](interpolationParts.expressionFns, function(newExpressionValues, oldExpressionValues) {\n    self.watchListener(newExpressionValues, oldExpressionValues);\n  });\n}\n\nInterpolationPartsWatcher.prototype.watchListener = function watchListener(newExpressionValues, oldExpressionValues) {\n  var result = this.interpolationParts.getResult(newExpressionValues);\n  this.listener.call(null, result, newExpressionValues === oldExpressionValues ? result : this.previousResult, this.scope);\n  this.previousResult = result;\n};\n\nInterpolationPartsWatcher.prototype.cancelWatch = function cancelWatch() {\n  this.expressionFnsWatcher();\n};\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: false */\n/* global indexToLineAndColumn: false */\n/* global InterpolationParts: false */\n/* global PluralMessage: false */\n/* global SelectMessage: false */\n/* global subtractOffset: false */\n\n// The params src and dst are exactly one of two types: NestedParserState or MessageFormatParser.\n// This function is fully optimized by V8. (inspect via IRHydra or --trace-deopt.)\n// The idea behind writing it this way is to avoid repeating oneself.  This is the ONE place where\n// the parser state that is saved/restored when parsing nested mustaches is specified.\nfunction copyNestedParserState(src, dst) {\n  dst.expressionFn = src.expressionFn;\n  dst.expressionMinusOffsetFn = src.expressionMinusOffsetFn;\n  dst.pluralOffset = src.pluralOffset;\n  dst.choices = src.choices;\n  dst.choiceKey = src.choiceKey;\n  dst.interpolationParts = src.interpolationParts;\n  dst.ruleChoiceKeyword = src.ruleChoiceKeyword;\n  dst.msgStartIndex = src.msgStartIndex;\n  dst.expressionStartIndex = src.expressionStartIndex;\n}\n\nfunction NestedParserState(parser) {\n  copyNestedParserState(parser, this);\n}\n\n/**\n * @constructor\n * @private\n */\nfunction MessageFormatParser(text, startIndex, $parse, pluralCat, stringifier,\n                             mustHaveExpression, trustedContext, allOrNothing) {\n  this.text = text;\n  this.index = startIndex || 0;\n  this.$parse = $parse;\n  this.pluralCat = pluralCat;\n  this.stringifier = stringifier;\n  this.mustHaveExpression = !!mustHaveExpression;\n  this.trustedContext = trustedContext;\n  this.allOrNothing = !!allOrNothing;\n  this.expressionFn = null;\n  this.expressionMinusOffsetFn = null;\n  this.pluralOffset = null;\n  this.choices = null;\n  this.choiceKey = null;\n  this.interpolationParts = null;\n  this.msgStartIndex = null;\n  this.nestedStateStack = [];\n  this.parsedFn = null;\n  this.rule = null;\n  this.ruleStack = null;\n  this.ruleChoiceKeyword = null;\n  this.interpNestLevel = null;\n  this.expressionStartIndex = null;\n  this.stringStartIndex = null;\n  this.stringQuote = null;\n  this.stringInterestsRe = null;\n  this.angularOperatorStack = null;\n  this.textPart = null;\n}\n\n// preserve v8 optimization.\nvar EMPTY_STATE = new NestedParserState(new MessageFormatParser(\n        /* text= */ '', /* startIndex= */ 0, /* $parse= */ null, /* pluralCat= */ null, /* stringifier= */ null,\n        /* mustHaveExpression= */ false, /* trustedContext= */ null, /* allOrNothing */ false));\n\nMessageFormatParser.prototype.pushState = function pushState() {\n  this.nestedStateStack.push(new NestedParserState(this));\n  copyNestedParserState(EMPTY_STATE, this);\n};\n\nMessageFormatParser.prototype.popState = function popState() {\n  if (this.nestedStateStack.length === 0) {\n    this.errorInParseLogic();\n  }\n  var previousState = this.nestedStateStack.pop();\n  copyNestedParserState(previousState, this);\n};\n\n// Oh my JavaScript!  Who knew you couldn't match a regex at a specific\n// location in a string but will always search forward?!\n// Apparently you'll be growing this ability via the sticky flag (y) in\n// ES6.  I'll just to work around you for now.\nMessageFormatParser.prototype.matchRe = function matchRe(re, search) {\n  re.lastIndex = this.index;\n  var match = re.exec(this.text);\n  if (match != null && (search === true || (match.index === this.index))) {\n    this.index = re.lastIndex;\n    return match;\n  }\n  return null;\n};\n\nMessageFormatParser.prototype.searchRe = function searchRe(re) {\n  return this.matchRe(re, true);\n};\n\n\nMessageFormatParser.prototype.consumeRe = function consumeRe(re) {\n  // Without the sticky flag, we can't use the .test() method to consume a\n  // match at the current index.  Instead, we'll use the slower .exec() method\n  // and verify match.index.\n  return !!this.matchRe(re);\n};\n\n// Run through our grammar avoiding deeply nested function call chains.\nMessageFormatParser.prototype.run = function run(initialRule) {\n  this.ruleStack = [initialRule];\n  do {\n    this.rule = this.ruleStack.pop();\n    while (this.rule) {\n      this.rule();\n    }\n    this.assertRuleOrNull(this.rule);\n  } while (this.ruleStack.length > 0);\n};\n\nMessageFormatParser.prototype.errorInParseLogic = function errorInParseLogic() {\n    throw $interpolateMinErr('logicbug',\n        'The messageformat parser has encountered an internal error.  Please file a github issue against the AngularJS project and provide this message text that triggers the bug.  Text: “{0}”',\n        this.text);\n};\n\nMessageFormatParser.prototype.assertRuleOrNull = function assertRuleOrNull(rule) {\n  if (rule === undefined) {\n    this.errorInParseLogic();\n  }\n};\n\nvar NEXT_WORD_RE = /\\s*(\\w+)\\s*/g;\nMessageFormatParser.prototype.errorExpecting = function errorExpecting() {\n  // What was wrong with the syntax? Unsupported type, missing comma, or something else?\n  var match = this.matchRe(NEXT_WORD_RE), position;\n  if (match == null) {\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqarg',\n        'Expected one of “plural” or “select” at line {0}, column {1} of text “{2}”',\n        position.line, position.column, this.text);\n  }\n  var word = match[1];\n  if (word === 'select' || word === 'plural') {\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqcomma',\n        'Expected a comma after the keyword “{0}” at line {1}, column {2} of text “{3}”',\n        word, position.line, position.column, this.text);\n  } else {\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('unknarg',\n        'Unsupported keyword “{0}” at line {0}, column {1}. Only “plural” and “select” are currently supported.  Text: “{3}”',\n        word, position.line, position.column, this.text);\n  }\n};\n\nvar STRING_START_RE = /['\"]/g;\nMessageFormatParser.prototype.ruleString = function ruleString() {\n  var match = this.matchRe(STRING_START_RE);\n  if (match == null) {\n    var position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('wantstring',\n        'Expected the beginning of a string at line {0}, column {1} in text “{2}”',\n        position.line, position.column, this.text);\n  }\n  this.startStringAtMatch(match);\n};\n\nMessageFormatParser.prototype.startStringAtMatch = function startStringAtMatch(match) {\n  this.stringStartIndex = match.index;\n  this.stringQuote = match[0];\n  this.stringInterestsRe = this.stringQuote === '\\'' ? SQUOTED_STRING_INTEREST_RE : DQUOTED_STRING_INTEREST_RE;\n  this.rule = this.ruleInsideString;\n};\n\nvar SQUOTED_STRING_INTEREST_RE = /\\\\(?:\\\\|'|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}|[0-7]{3}|\\r\\n|\\n|[\\s\\S])|'/g;\nvar DQUOTED_STRING_INTEREST_RE = /\\\\(?:\\\\|\"|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}|[0-7]{3}|\\r\\n|\\n|[\\s\\S])|\"/g;\nMessageFormatParser.prototype.ruleInsideString = function ruleInsideString() {\n  var match = this.searchRe(this.stringInterestsRe);\n  if (match == null) {\n    var position = indexToLineAndColumn(this.text, this.stringStartIndex);\n    throw $interpolateMinErr('untermstr',\n        'The string beginning at line {0}, column {1} is unterminated in text “{2}”',\n        position.line, position.column, this.text);\n  }\n  if (match[0] === this.stringQuote) {\n    this.rule = null;\n  }\n};\n\nvar PLURAL_OR_SELECT_ARG_TYPE_RE = /\\s*(plural|select)\\s*,\\s*/g;\nMessageFormatParser.prototype.rulePluralOrSelect = function rulePluralOrSelect() {\n  var match = this.searchRe(PLURAL_OR_SELECT_ARG_TYPE_RE);\n  if (match == null) {\n    this.errorExpecting();\n  }\n  var argType = match[1];\n  switch (argType) {\n    case 'plural': this.rule = this.rulePluralStyle; break;\n    case 'select': this.rule = this.ruleSelectStyle; break;\n    default: this.errorInParseLogic();\n  }\n};\n\nMessageFormatParser.prototype.rulePluralStyle = function rulePluralStyle() {\n  this.choices = Object.create(null);\n  this.ruleChoiceKeyword = this.rulePluralValueOrKeyword;\n  this.rule = this.rulePluralOffset;\n};\n\nMessageFormatParser.prototype.ruleSelectStyle = function ruleSelectStyle() {\n  this.choices = Object.create(null);\n  this.ruleChoiceKeyword = this.ruleSelectKeyword;\n  this.rule = this.ruleSelectKeyword;\n};\n\nvar NUMBER_RE = /[0]|(?:[1-9][0-9]*)/g;\nvar PLURAL_OFFSET_RE = new RegExp('\\\\s*offset\\\\s*:\\\\s*(' + NUMBER_RE.source + ')', 'g');\n\nMessageFormatParser.prototype.rulePluralOffset = function rulePluralOffset() {\n  var match = this.matchRe(PLURAL_OFFSET_RE);\n  this.pluralOffset = (match == null) ? 0 : parseInt(match[1], 10);\n  this.expressionMinusOffsetFn = subtractOffset(this.expressionFn, this.pluralOffset);\n  this.rule = this.rulePluralValueOrKeyword;\n};\n\nMessageFormatParser.prototype.assertChoiceKeyIsNew = function assertChoiceKeyIsNew(choiceKey, index) {\n  if (this.choices[choiceKey] !== undefined) {\n    var position = indexToLineAndColumn(this.text, index);\n    throw $interpolateMinErr('dupvalue',\n        'The choice “{0}” is specified more than once. Duplicate key is at line {1}, column {2} in text “{3}”',\n        choiceKey, position.line, position.column, this.text);\n  }\n};\n\nvar SELECT_KEYWORD = /\\s*(\\w+)/g;\nMessageFormatParser.prototype.ruleSelectKeyword = function ruleSelectKeyword() {\n  var match = this.matchRe(SELECT_KEYWORD);\n  if (match == null) {\n    this.parsedFn = new SelectMessage(this.expressionFn, this.choices).parsedFn;\n    this.rule = null;\n    return;\n  }\n  this.choiceKey = match[1];\n  this.assertChoiceKeyIsNew(this.choiceKey, match.index);\n  this.rule = this.ruleMessageText;\n};\n\nvar EXPLICIT_VALUE_OR_KEYWORD_RE = new RegExp('\\\\s*(?:(?:=(' + NUMBER_RE.source + '))|(\\\\w+))', 'g');\nMessageFormatParser.prototype.rulePluralValueOrKeyword = function rulePluralValueOrKeyword() {\n  var match = this.matchRe(EXPLICIT_VALUE_OR_KEYWORD_RE);\n  if (match == null) {\n    this.parsedFn = new PluralMessage(this.expressionFn, this.choices, this.pluralOffset, this.pluralCat).parsedFn;\n    this.rule = null;\n    return;\n  }\n  if (match[1] != null) {\n    this.choiceKey = parseInt(match[1], 10);\n  } else {\n    this.choiceKey = match[2];\n  }\n  this.assertChoiceKeyIsNew(this.choiceKey, match.index);\n  this.rule = this.ruleMessageText;\n};\n\nvar BRACE_OPEN_RE = /\\s*\\{/g;\nvar BRACE_CLOSE_RE = /}/g;\nMessageFormatParser.prototype.ruleMessageText = function ruleMessageText() {\n  if (!this.consumeRe(BRACE_OPEN_RE)) {\n    var position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqopenbrace',\n        'The plural choice “{0}” must be followed by a message in braces at line {1}, column {2} in text “{3}”',\n        this.choiceKey, position.line, position.column, this.text);\n  }\n  this.msgStartIndex = this.index;\n  this.interpolationParts = new InterpolationParts(this.trustedContext, this.allOrNothing);\n  this.rule = this.ruleInInterpolationOrMessageText;\n};\n\n// Note: Since \"\\\" is used as an escape character, don't allow it to be part of the\n// startSymbol/endSymbol when I add the feature to allow them to be redefined.\nvar INTERP_OR_END_MESSAGE_RE = /\\\\.|{{|}/g;\nvar INTERP_OR_PLURALVALUE_OR_END_MESSAGE_RE = /\\\\.|{{|#|}/g;\nvar ESCAPE_OR_MUSTACHE_BEGIN_RE = /\\\\.|{{/g;\nMessageFormatParser.prototype.advanceInInterpolationOrMessageText = function advanceInInterpolationOrMessageText() {\n  var currentIndex = this.index, match;\n  if (this.ruleChoiceKeyword == null) { // interpolation\n    match = this.searchRe(ESCAPE_OR_MUSTACHE_BEGIN_RE);\n    if (match == null) { // End of interpolation text.  Nothing more to process.\n      this.textPart = this.text.substring(currentIndex);\n      this.index = this.text.length;\n      return null;\n    }\n  } else {\n    match = this.searchRe(this.ruleChoiceKeyword === this.rulePluralValueOrKeyword ?\n                          INTERP_OR_PLURALVALUE_OR_END_MESSAGE_RE : INTERP_OR_END_MESSAGE_RE);\n    if (match == null) {\n      var position = indexToLineAndColumn(this.text, this.msgStartIndex);\n      throw $interpolateMinErr('reqendbrace',\n          'The plural/select choice “{0}” message starting at line {1}, column {2} does not have an ending closing brace. Text “{3}”',\n          this.choiceKey, position.line, position.column, this.text);\n    }\n  }\n  // match is non-null.\n  var token = match[0];\n  this.textPart = this.text.substring(currentIndex, match.index);\n  return token;\n};\n\nMessageFormatParser.prototype.ruleInInterpolationOrMessageText = function ruleInInterpolationOrMessageText() {\n  var currentIndex = this.index;\n  var token = this.advanceInInterpolationOrMessageText();\n  if (token == null) {\n    // End of interpolation text.  Nothing more to process.\n    this.index = this.text.length;\n    this.interpolationParts.addText(this.text.substring(currentIndex));\n    this.rule = null;\n    return;\n  }\n  if (token[0] === '\\\\') {\n    // unescape next character and continue\n    this.interpolationParts.addText(this.textPart + token[1]);\n    return;\n  }\n  this.interpolationParts.addText(this.textPart);\n  if (token === '{{') {\n    this.pushState();\n    this.ruleStack.push(this.ruleEndMustacheInInterpolationOrMessage);\n    this.rule = this.ruleEnteredMustache;\n  } else if (token === '}') {\n    this.choices[this.choiceKey] = this.interpolationParts.toParsedFn(/*mustHaveExpression=*/false, this.text);\n    this.rule = this.ruleChoiceKeyword;\n  } else if (token === '#') {\n    this.interpolationParts.addExpressionFn(this.expressionMinusOffsetFn);\n  } else {\n    this.errorInParseLogic();\n  }\n};\n\nMessageFormatParser.prototype.ruleInterpolate = function ruleInterpolate() {\n  this.interpolationParts = new InterpolationParts(this.trustedContext, this.allOrNothing);\n  this.rule = this.ruleInInterpolation;\n};\n\nMessageFormatParser.prototype.ruleInInterpolation = function ruleInInterpolation() {\n  var currentIndex = this.index;\n  var match = this.searchRe(ESCAPE_OR_MUSTACHE_BEGIN_RE);\n  if (match == null) {\n    // End of interpolation text.  Nothing more to process.\n    this.index = this.text.length;\n    this.interpolationParts.addText(this.text.substring(currentIndex));\n    this.parsedFn = this.interpolationParts.toParsedFn(this.mustHaveExpression, this.text);\n    this.rule = null;\n    return;\n  }\n  var token = match[0];\n  if (token[0] === '\\\\') {\n    // unescape next character and continue\n    this.interpolationParts.addText(this.text.substring(currentIndex, match.index) + token[1]);\n    return;\n  }\n  this.interpolationParts.addText(this.text.substring(currentIndex, match.index));\n  this.pushState();\n  this.ruleStack.push(this.ruleInterpolationEndMustache);\n  this.rule = this.ruleEnteredMustache;\n};\n\nMessageFormatParser.prototype.ruleInterpolationEndMustache = function ruleInterpolationEndMustache() {\n  var expressionFn = this.parsedFn;\n  this.popState();\n  this.interpolationParts.addExpressionFn(expressionFn);\n  this.rule = this.ruleInInterpolation;\n};\n\nMessageFormatParser.prototype.ruleEnteredMustache = function ruleEnteredMustache() {\n  this.parsedFn = null;\n  this.ruleStack.push(this.ruleEndMustache);\n  this.rule = this.ruleAngularExpression;\n};\n\nMessageFormatParser.prototype.ruleEndMustacheInInterpolationOrMessage = function ruleEndMustacheInInterpolationOrMessage() {\n  var expressionFn = this.parsedFn;\n  this.popState();\n  this.interpolationParts.addExpressionFn(expressionFn);\n  this.rule = this.ruleInInterpolationOrMessageText;\n};\n\n\n\nvar INTERP_END_RE = /\\s*}}/g;\nMessageFormatParser.prototype.ruleEndMustache = function ruleEndMustache() {\n  var match = this.matchRe(INTERP_END_RE);\n  if (match == null) {\n    var position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('reqendinterp',\n        'Expecting end of interpolation symbol, “{0}”, at line {1}, column {2} in text “{3}”',\n        '}}', position.line, position.column, this.text);\n  }\n  if (this.parsedFn == null) {\n    // If we parsed a MessageFormat extension, (e.g. select/plural today, maybe more some other\n    // day), then the result *has* to be a string and those rules would have already set\n    // this.parsedFn.  If there was no MessageFormat extension, then there is no requirement to\n    // stringify the result and parsedFn isn't set.  We set it here.  While we could have set it\n    // unconditionally when exiting the AngularJS expression, I intend for us to not just replace\n    // $interpolate, but also to replace $parse in a future version (so ng-bind can work), and in\n    // such a case we do not want to unnecessarily stringify something if it's not going to be used\n    // in a string context.\n    this.parsedFn = this.$parse(this.expressionFn, this.stringifier);\n    this.parsedFn['exp'] = this.expressionFn['exp']; // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n    this.parsedFn['expressions'] = this.expressionFn['expressions']; // Require this to call $compile.$$addBindingInfo() which allows Protractor to find elements by binding.\n  }\n  this.rule = null;\n};\n\nMessageFormatParser.prototype.ruleAngularExpression = function ruleAngularExpression() {\n  this.angularOperatorStack = [];\n  this.expressionStartIndex = this.index;\n  this.rule = this.ruleInAngularExpression;\n};\n\nfunction getEndOperator(opBegin) {\n  switch (opBegin) {\n    case '{': return '}';\n    case '[': return ']';\n    case '(': return ')';\n    default: return null;\n  }\n}\n\nfunction getBeginOperator(opEnd) {\n  switch (opEnd) {\n    case '}': return '{';\n    case ']': return '[';\n    case ')': return '(';\n    default: return null;\n  }\n}\n\n// TODO(chirayu): The interpolation endSymbol must also be accounted for. It\n// just so happens that \"}\" is an operator so it's in the list below.  But we\n// should support any other type of start/end interpolation symbol.\nvar INTERESTING_OPERATORS_RE = /[[\\]{}()'\",]/g;\nMessageFormatParser.prototype.ruleInAngularExpression = function ruleInAngularExpression() {\n  var match = this.searchRe(INTERESTING_OPERATORS_RE);\n  var position;\n  if (match == null) {\n    if (this.angularOperatorStack.length === 0) {\n      // This is the end of the AngularJS expression so this is actually a\n      // success.  Note that when inside an interpolation, this means we even\n      // consumed the closing interpolation symbols if they were curlies.  This\n      // is NOT an error at this point but will become an error further up the\n      // stack when the part that saw the opening curlies is unable to find the\n      // closing ones.\n      this.index = this.text.length;\n      this.expressionFn = this.$parse(this.text.substring(this.expressionStartIndex, this.index));\n      // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n      this.expressionFn['exp'] = this.text.substring(this.expressionStartIndex, this.index);\n      this.expressionFn['expressions'] = this.expressionFn['expressions'];\n      this.rule = null;\n      return;\n    }\n    var innermostOperator = this.angularOperatorStack[0];\n    throw $interpolateMinErr('badexpr',\n        'Unexpected end of AngularJS expression.  Expecting operator “{0}” at the end of the text “{1}”',\n        this.getEndOperator(innermostOperator), this.text);\n  }\n  var operator = match[0];\n  if (operator === '\\'' || operator === '\"') {\n    this.ruleStack.push(this.ruleInAngularExpression);\n    this.startStringAtMatch(match);\n    return;\n  }\n  if (operator === ',') {\n    if (this.trustedContext) {\n      position = indexToLineAndColumn(this.text, this.index);\n      throw $interpolateMinErr('unsafe',\n          'Use of select/plural MessageFormat syntax is currently disallowed in a secure context ({0}).  At line {1}, column {2} of text “{3}”',\n          this.trustedContext, position.line, position.column, this.text);\n    }\n    // only the top level comma has relevance.\n    if (this.angularOperatorStack.length === 0) {\n      // todo: does this need to be trimmed?\n      this.expressionFn = this.$parse(this.text.substring(this.expressionStartIndex, match.index));\n      // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n      this.expressionFn['exp'] = this.text.substring(this.expressionStartIndex, match.index);\n      this.expressionFn['expressions'] = this.expressionFn['expressions'];\n      this.rule = null;\n      this.rule = this.rulePluralOrSelect;\n    }\n    return;\n  }\n  if (getEndOperator(operator) != null) {\n    this.angularOperatorStack.unshift(operator);\n    return;\n  }\n  var beginOperator = getBeginOperator(operator);\n  if (beginOperator == null) {\n    this.errorInParseLogic();\n  }\n  if (this.angularOperatorStack.length > 0) {\n    if (beginOperator === this.angularOperatorStack[0]) {\n      this.angularOperatorStack.shift();\n      return;\n    }\n    position = indexToLineAndColumn(this.text, this.index);\n    throw $interpolateMinErr('badexpr',\n        'Unexpected operator “{0}” at line {1}, column {2} in text. Was expecting “{3}”. Text: “{4}”',\n        operator, position.line, position.column, getEndOperator(this.angularOperatorStack[0]), this.text);\n  }\n  // We are trying to pop off the operator stack but there really isn't anything to pop off.\n  this.index = match.index;\n  this.expressionFn = this.$parse(this.text.substring(this.expressionStartIndex, this.index));\n  // Needed to pretend to be $interpolate for tests copied from interpolateSpec.js\n  this.expressionFn['exp'] = this.text.substring(this.expressionStartIndex, this.index);\n  this.expressionFn['expressions'] = this.expressionFn['expressions'];\n  this.rule = null;\n};\n\n// NOTE: ADVANCED_OPTIMIZATIONS mode.\n//\n// This file is compiled with Closure compiler's ADVANCED_OPTIMIZATIONS flag! Be wary of using\n// constructs incompatible with that mode.\n\n/* global $interpolateMinErr: true */\n/* global isFunction: true */\n/* global noop: true */\n/* global toJson: true */\n/* global MessageFormatParser: false */\n\n/**\n * @ngdoc module\n * @name ngMessageFormat\n * @packageName angular-message-format\n *\n * @description\n *\n * ## What is  ngMessageFormat?\n *\n * The ngMessageFormat module extends the AngularJS {@link ng.$interpolate `$interpolate`} service\n * with a syntax for handling pluralization and gender specific messages, which is based on the\n * [ICU MessageFormat syntax][ICU].\n *\n * See [the design doc][ngMessageFormat doc] for more information.\n *\n * [ICU]: http://userguide.icu-project.org/formatparse/messages#TOC-MessageFormat\n * [ngMessageFormat doc]: https://docs.google.com/a/google.com/document/d/1pbtW2yvtmFBikfRrJd8VAsabiFkKezmYZ_PbgdjQOVU/edit\n *\n * ## Examples\n *\n * ### Gender\n *\n * This example uses the \"select\" keyword to specify the message based on gender.\n *\n * <example name=\"ngMessageFormat-example-gender\" module=\"msgFmtExample\" deps=\"angular-message-format.js\">\n * <file name=\"index.html\">\n *  <div ng-controller=\"AppController\">\n *    Select Recipient:<br>\n      <select ng-model=\"recipient\" ng-options=\"person as person.name for person in recipients\">\n      </select>\n      <p>{{recipient.gender, select,\n                male {{{recipient.name}} unwrapped his gift. }\n                female {{{recipient.name}} unwrapped her gift. }\n                other {{{recipient.name}} unwrapped their gift. }\n      }}</p>\n *  </div>\n * </file>\n * <file name=\"script.js\">\n *   function Person(name, gender) {\n *     this.name = name;\n *     this.gender = gender;\n *   }\n *\n *   var alice   = new Person('Alice', 'female'),\n *       bob     = new Person('Bob', 'male'),\n *       ashley = new Person('Ashley', '');\n *\n *   angular.module('msgFmtExample', ['ngMessageFormat'])\n *     .controller('AppController', ['$scope', function($scope) {\n *         $scope.recipients = [alice, bob, ashley];\n *         $scope.recipient = $scope.recipients[0];\n *       }]);\n * </file>\n * </example>\n *\n * ### Plural\n *\n * This example shows how the \"plural\" keyword is used to account for a variable number of entities.\n * The \"#\" variable holds the current number and can be embedded in the message.\n *\n * Note that \"=1\" takes precedence over \"one\".\n *\n * The example also shows the \"offset\" keyword, which allows you to offset the value of the \"#\" variable.\n *\n * <example name=\"ngMessageFormat-example-plural\" module=\"msgFmtExample\" deps=\"angular-message-format.js\">\n * <file name=\"index.html\">\n *   <div ng-controller=\"AppController\">\n *    <button ng-click=\"recipients.pop()\" id=\"decreaseRecipients\">decreaseRecipients</button><br>\n *    Select recipients:<br>\n *    <select multiple size=5 ng-model=\"recipients\" ng-options=\"person as person.name for person in people\">\n *    </select><br>\n *     <p>{{recipients.length, plural, offset:1\n *             =0    {{{sender.name}} gave no gifts (\\#=#)}\n *             =1    {{{sender.name}} gave a gift to {{recipients[0].name}} (\\#=#)}\n *             one   {{{sender.name}} gave {{recipients[0].name}} and one other person a gift (\\#=#)}\n *             other {{{sender.name}} gave {{recipients[0].name}} and # other people a gift (\\#=#)}\n *           }}</p>\n *   </div>\n * </file>\n *\n * <file name=\"script.js\">\n *   function Person(name, gender) {\n *     this.name = name;\n *     this.gender = gender;\n *   }\n *\n *   var alice   = new Person('Alice', 'female'),\n *       bob     = new Person('Bob', 'male'),\n *       sarah     = new Person('Sarah', 'female'),\n *       harry   = new Person('Harry Potter', 'male'),\n *       ashley   = new Person('Ashley', '');\n *\n *   angular.module('msgFmtExample', ['ngMessageFormat'])\n *     .controller('AppController', ['$scope', function($scope) {\n *         $scope.people = [alice, bob, sarah, ashley];\n *         $scope.recipients = [alice, bob, sarah];\n *         $scope.sender = harry;\n *       }]);\n * </file>\n *\n * <file name=\"protractor.js\" type=\"protractor\">\n *   describe('MessageFormat plural', function() {\n *\n *     it('should pluralize initial values', function() {\n *       var messageElem = element(by.binding('recipients.length')),\n *           decreaseRecipientsBtn = element(by.id('decreaseRecipients'));\n *\n *       expect(messageElem.getText()).toEqual('Harry Potter gave Alice and 2 other people a gift (#=2)');\n *       decreaseRecipientsBtn.click();\n *       expect(messageElem.getText()).toEqual('Harry Potter gave Alice and one other person a gift (#=1)');\n *       decreaseRecipientsBtn.click();\n *       expect(messageElem.getText()).toEqual('Harry Potter gave a gift to Alice (#=0)');\n *       decreaseRecipientsBtn.click();\n *       expect(messageElem.getText()).toEqual('Harry Potter gave no gifts (#=-1)');\n *     });\n *   });\n * </file>\n * </example>\n *\n * ### Plural and Gender together\n *\n * This example shows how you can specify gender rules for specific plural matches - in this case,\n * =1 is special cased for gender.\n * <example name=\"ngMessageFormat-example-plural-gender\" module=\"msgFmtExample\" deps=\"angular-message-format.js\">\n *   <file name=\"index.html\">\n *     <div ng-controller=\"AppController\">\n       Select recipients:<br>\n       <select multiple size=5 ng-model=\"recipients\" ng-options=\"person as person.name for person in people\">\n       </select><br>\n        <p>{{recipients.length, plural,\n          =0 {{{sender.name}} has not given any gifts to anyone.}\n          =1 {  {{recipients[0].gender, select,\n                 female { {{sender.name}} gave {{recipients[0].name}} her gift.}\n                 male { {{sender.name}} gave {{recipients[0].name}} his gift.}\n                 other { {{sender.name}} gave {{recipients[0].name}} their gift.}\n                }}\n              }\n          other {{{sender.name}} gave {{recipients.length}} people gifts.}\n          }}</p>\n      </file>\n *    <file name=\"script.js\">\n *      function Person(name, gender) {\n *        this.name = name;\n *        this.gender = gender;\n *      }\n *\n *      var alice   = new Person('Alice', 'female'),\n *          bob     = new Person('Bob', 'male'),\n *          harry   = new Person('Harry Potter', 'male'),\n *          ashley   = new Person('Ashley', '');\n *\n *      angular.module('msgFmtExample', ['ngMessageFormat'])\n *        .controller('AppController', ['$scope', function($scope) {\n *            $scope.people = [alice, bob, ashley];\n *            $scope.recipients = [alice];\n *            $scope.sender = harry;\n *          }]);\n *    </file>\n    </example>\n */\n\nvar $$MessageFormatFactory = ['$parse', '$locale', '$sce', '$exceptionHandler', function $$messageFormat(\n                               $parse,   $locale,   $sce,   $exceptionHandler) {\n\n  function getStringifier(trustedContext, allOrNothing, text) {\n    return function stringifier(value) {\n      try {\n        value = trustedContext ? $sce['getTrusted'](trustedContext, value) : $sce['valueOf'](value);\n        return allOrNothing && (value === undefined) ? value : $$stringify(value);\n      } catch (err) {\n        $exceptionHandler($interpolateMinErr['interr'](text, err));\n      }\n    };\n  }\n\n  function interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n    var stringifier = getStringifier(trustedContext, allOrNothing, text);\n    var parser = new MessageFormatParser(text, 0, $parse, $locale['pluralCat'], stringifier,\n                                         mustHaveExpression, trustedContext, allOrNothing);\n    parser.run(parser.ruleInterpolate);\n    return parser.parsedFn;\n  }\n\n  return {\n    'interpolate': interpolate\n  };\n}];\n\nvar $$interpolateDecorator = ['$$messageFormat', '$delegate', function $$interpolateDecorator($$messageFormat, $interpolate) {\n  if ($interpolate['startSymbol']() !== '{{' || $interpolate['endSymbol']() !== '}}') {\n    throw $interpolateMinErr('nochgmustache', 'angular-message-format.js currently does not allow you to use custom start and end symbols for interpolation.');\n  }\n  var interpolate = $$messageFormat['interpolate'];\n  interpolate['startSymbol'] = $interpolate['startSymbol'];\n  interpolate['endSymbol'] = $interpolate['endSymbol'];\n  return interpolate;\n}];\n\nvar $interpolateMinErr;\nvar isFunction;\nvar noop;\nvar toJson;\nvar $$stringify;\n\nvar ngModule = window['angular']['module']('ngMessageFormat', ['ng']);\nngModule['info']({ 'angularVersion': '1.7.8' });\nngModule['factory']('$$messageFormat', $$MessageFormatFactory);\nngModule['config'](['$provide', function($provide) {\n  $interpolateMinErr = window['angular']['$interpolateMinErr'];\n  isFunction = window['angular']['isFunction'];\n  noop = window['angular']['noop'];\n  toJson = window['angular']['toJson'];\n  $$stringify = window['angular']['$$stringify'];\n\n  $provide['decorator']('$interpolate', $$interpolateDecorator);\n}]);\n\n/* TODO: Add tests for:\n • Whitespace preservation in messages.\n • Whitespace ignored around syntax except for offset:N.\n • Escaping for curlies and the # symbol.\n • # symbol value.\n • # symbol value when gender is nested inside plural.\n • Error with nested # symbol.\n • parser error messages.\n • caching.\n • watched expressions.\n • test parsing AngularJS expressions\n • test the different regexes\n • test the different starting rules\n*/\n\ndescribe('$$ngMessageFormat', function() {\n  describe('core', function() {\n    var $$messageFormat, $parse, $interpolate, $locale, $rootScope;\n\n    function Person(name, gender) {\n      this.name = name;\n      this.gender = gender;\n    }\n\n    var alice   = new Person('Alice', 'female'),\n        bob     = new Person('Bob', 'male'),\n        charlie = new Person('Charlie', 'male'),\n        harry   = new Person('Harry Potter', 'male');\n\n    function initScope($scope) {\n      $scope.recipients = [alice, bob, charlie];\n      $scope.sender = harry;\n    }\n\n    beforeEach(module('ngMessageFormat'));\n\n    beforeEach(function() {\n      inject(['$$messageFormat', '$parse', '$locale', '$interpolate', '$rootScope', function(\n                 messageFormat,    parse,    locale,    interpolate,    rootScope) {\n        $$messageFormat = messageFormat;\n        $parse = parse;\n        $interpolate = interpolate;\n        $locale = locale;\n        $rootScope = rootScope;\n        initScope(rootScope);\n      }]);\n    });\n\n    describe('mustache', function() {\n      function assertMustache(text, expected) {\n        var parsedFn = $interpolate(text);\n        expect(parsedFn($rootScope)).toEqual(expected);\n      }\n\n      it('should suppress falsy objects', function() {\n        assertMustache('{{undefined}}', '');\n        assertMustache('{{null}}', '');\n        assertMustache('{{a.b}}', '');\n      });\n\n      it('should jsonify objects', function() {\n        assertMustache('{{ {} }}', '{}');\n        assertMustache('{{ true }}', 'true');\n        assertMustache('{{ false }}', 'false');\n        assertMustache('{{ 1 }}', '1');\n        assertMustache('{{ \\'1\\' }}', '1');\n        assertMustache('{{ sender }}', '{\"name\":\"Harry Potter\",\"gender\":\"male\"}');\n      });\n\n      it('should return function that can be called with no context', inject(function($interpolate) {\n        expect($interpolate('{{sender.name}}')()).toEqual('');\n      }));\n\n      describe('watchable', function() {\n        it('ckck', function() {\n          var calls = [];\n          $rootScope.$watch($interpolate('{{::name}}'), function(val) {\n            calls.push(val);\n          });\n\n          $rootScope.$apply();\n          expect(calls.length).toBe(1);\n\n          $rootScope.name = 'foo';\n          $rootScope.$apply();\n          expect(calls.length).toBe(2);\n          expect(calls[1]).toBe('foo');\n\n          $rootScope.name = 'bar';\n          $rootScope.$apply();\n          expect(calls.length).toBe(2);\n        });\n\n\n        it('should stop watching strings with no expressions after first execution', function() {\n          var spy = jasmine.createSpy();\n          $rootScope.$watch($$messageFormat.interpolate('foo'), spy);\n          $rootScope.$digest();\n          expect($rootScope.$countWatchers()).toBe(0);\n          expect(spy).toHaveBeenCalledWith('foo', 'foo', $rootScope);\n          expect(spy).toHaveBeenCalledTimes(1);\n        });\n\n        it('should stop watching strings with only constant expressions after first execution', function() {\n          var spy = jasmine.createSpy();\n          $rootScope.$watch($$messageFormat.interpolate('foo {{42}}'), spy);\n          $rootScope.$digest();\n          expect($rootScope.$countWatchers()).toBe(0);\n          expect(spy).toHaveBeenCalledWith('foo 42', 'foo 42', $rootScope);\n          expect(spy).toHaveBeenCalledTimes(1);\n        });\n\n\n      });\n\n      describe('plural', function() {\n        it('no interpolation', function() {\n          var text = '' +\n            '{{recipients.length, plural,\\n' +\n            '    =0    {You gave no gifts}\\n' +\n            '    =1    {You gave one person a gift}\\n' +\n            // \"=1\" should override \"one\" for exact value.\n            '    one   {YOU SHOULD NEVER SEE THIS MESSAGE}\\n' +\n            '    other {You gave some people gifts}\\n' +\n            '}}';\n          var parsedFn = $interpolate(text, /*mustHaveExpression=*/true);\n          expect(parsedFn.expressions.length).toBe(1);\n          expect(parsedFn.expressions[0]).toEqual('recipients.length');\n\n          $rootScope.recipients.length = 2;\n          expect(parsedFn($rootScope)).toEqual('You gave some people gifts');\n\n          $rootScope.recipients.length = 1;\n          expect(parsedFn($rootScope)).toEqual('You gave one person a gift');\n\n          $rootScope.recipients.length = 0;\n          expect(parsedFn($rootScope)).toEqual('You gave no gifts');\n        });\n\n        it('with interpolation', function() {\n          var text = '' +\n            '{{recipients.length, plural,\\n' +\n            '    =0    {{{sender.name}} gave no gifts}\\n' +\n            '    =1    {{{sender.name}} gave one gift to {{recipients[0].name}}}\\n' +\n            // \"=1\" should override \"one\" for exact value.\n            '    one   {YOU SHOULD NEVER SEE THIS MESSAGE}\\n' +\n            '    other {{{sender.name}} gave them a gift}\\n' +\n            '}}';\n          var parsedFn = $interpolate(text, /*mustHaveExpression=*/true);\n          expect(parsedFn.expressions.length).toBe(1);\n          expect(parsedFn.expressions[0]).toEqual('recipients.length');\n\n          $rootScope.recipients.length = 2;\n          expect(parsedFn($rootScope)).toEqual('Harry Potter gave them a gift');\n\n          $rootScope.recipients.length = 1;\n          expect(parsedFn($rootScope)).toEqual('Harry Potter gave one gift to Alice');\n\n          $rootScope.recipients.length = 0;\n          expect(parsedFn($rootScope)).toEqual('Harry Potter gave no gifts');\n        });\n\n        it('with offset, interpolation, \"#\" symbol with and without escaping', function() {\n          var text = '' +\n            '{{recipients.length, plural, offset:1\\n' +\n            // NOTE: It's nonsensical to use \"#\" for \"=0\" with a positive offset.\n            '    =0    {{{sender.name}} gave no gifts (\\\\#=#)}\\n' +\n            '    =1    {{{sender.name}} gave one gift to {{recipients[0].name}} (\\\\#=#)}\\n' +\n            '    one   {{{sender.name}} gave {{recipients[0].name}} and one other person a gift (\\\\#=#)}\\n' +\n            '    other {{{sender.name}} gave {{recipients[0].name}} and # other people a gift (\\\\#=#)}\\n' +\n            '}}';\n          var parsedFn = $interpolate(text, /*mustHaveExpression=*/true);\n          expect(parsedFn.expressions.length).toBe(1);\n          expect(parsedFn.expressions[0]).toEqual('recipients.length');\n\n          $rootScope.recipients.length = 3;\n          // \"#\" should get replaced with the value of \"recipients.length - offset\"\n          expect(parsedFn($rootScope)).toEqual('Harry Potter gave Alice and 2 other people a gift (#=2)');\n\n          $rootScope.recipients.length = 2;\n          expect(parsedFn($rootScope)).toEqual('Harry Potter gave Alice and one other person a gift (#=1)');\n\n          $rootScope.recipients.length = 1;\n          expect(parsedFn($rootScope)).toEqual('Harry Potter gave one gift to Alice (#=0)');\n\n          $rootScope.recipients.length = 0;\n          expect(parsedFn($rootScope)).toEqual('Harry Potter gave no gifts (#=-1)');\n        });\n      });\n\n      it('nested plural and select', function() {\n        var text = '' +\n          '{{recipients.length, plural,\\n' +\n          '    =0 {You gave no gifts}\\n' +\n          '    =1 {{{recipients[0].gender, select,\\n' +\n          '            male {You gave him a gift. -{{sender.name}}}\\n' +\n          '            female {You gave her a gift. -{{sender.name}}}\\n' +\n          '            other {You gave them a gift. -{{sender.name}}}\\n' +\n          '        }}\\n' +\n          '       }\\n' +\n          '    other {You gave {{recipients.length}} people gifts. -{{sender.name}}}\\n' +\n          '}}';\n        var parsedFn = $interpolate(text, /*mustHaveExpression=*/true);\n        expect(parsedFn.expressions.length).toBe(1);\n        expect(parsedFn.expressions[0]).toEqual('recipients.length');\n        var result = parsedFn($rootScope);\n        expect(result).toEqual('You gave 3 people gifts. -Harry Potter');\n      });\n    });\n\n    describe('interpolate', function() {\n      function assertInterpolation(text, expected) {\n        var parsedFn = $$messageFormat.interpolate(text);\n        expect(parsedFn($rootScope)).toEqual(expected);\n      }\n\n      it('should interpolate a plain string', function() {\n        assertInterpolation(' Hello, world! ', ' Hello, world! ');\n      });\n\n      it('should interpolate a simple expression', function() {\n        assertInterpolation('Hello, {{sender.name}}!', 'Hello, Harry Potter!');\n      });\n    });\n  });\n\n\n  /* NOTE: This describe block includes a copy of interpolateSpec.js to test that\n   *       $$messageFormat.interpolate behaves the same as $interpolate.\n   *       ONLY the following changes have been made.\n   *       - Add beforeEach(module('ngMessageFormat')) at top level of describe()\n   *       - Add extra \"}\" for it('should not unescape markers within expressions'). Original\n   *         $interpolate has a bug/feature where a \"}}\" inside a string is also treated as a\n   *         closing symbol.  The new service understands the string context and fixes this.\n   *       - All tests for startSymbol/endSymbol have been commented out.  The new service does not\n   *         allow you to change them as of now.\n   *       - Instead, I've added tests to assert that we throw an exception if used with redefined\n   *         startSymbol/endSymbol.  These tests are listed right in the beginning before the\n   *         others.  allow you to change them as of now.\n   */\n  describe('$interpolate', function() {\n    beforeEach(module('ngMessageFormat'));\n\n    describe('startSymbol', function() {\n      it('should expose the startSymbol in run phase', inject(function($interpolate) {\n        expect($interpolate.startSymbol()).toBe('{{');\n      }));\n      describe('redefinition', function() {\n        beforeEach(module(function($interpolateProvider) {\n          expect($interpolateProvider.startSymbol()).toBe('{{');\n          $interpolateProvider.startSymbol('((');\n        }));\n        it('should not work when the startSymbol is redefined', function() {\n          expect(function() {\n            inject(inject(function($interpolate) {}));\n          }).toThrowMinErr('$interpolate', 'nochgmustache');\n        });\n      });\n    });\n\n    describe('endSymbol', function() {\n      it('should expose the endSymbol in run phase', inject(function($interpolate) {\n        expect($interpolate.endSymbol()).toBe('}}');\n      }));\n      describe('redefinition', function() {\n        beforeEach(module(function($interpolateProvider) {\n          expect($interpolateProvider.endSymbol()).toBe('}}');\n          $interpolateProvider.endSymbol('))');\n        }));\n        it('should not work when the endSymbol is redefined', function() {\n          expect(function() {\n            inject(inject(function($interpolate) {}));\n          }).toThrowMinErr('$interpolate', 'nochgmustache');\n        });\n      });\n    });\n\n    it('should return the interpolation object when there are no bindings and textOnly is undefined',\n        inject(function($interpolate) {\n      var interpolateFn = $interpolate('some text');\n\n      expect(interpolateFn.exp).toBe('some text');\n      expect(interpolateFn.expressions).toEqual([]);\n\n      expect(interpolateFn({})).toBe('some text');\n    }));\n\n\n    it('should return undefined when there are no bindings and textOnly is set to true',\n        inject(function($interpolate) {\n      expect($interpolate('some text', true)).toBeUndefined();\n    }));\n\n    it('should return undefined when there are bindings and strict is set to true',\n        inject(function($interpolate) {\n      expect($interpolate('test {{foo}}', false, null, true)({})).toBeUndefined();\n    }));\n\n    it('should suppress falsy objects', inject(function($interpolate) {\n      expect($interpolate('{{undefined}}')({})).toEqual('');\n      expect($interpolate('{{null}}')({})).toEqual('');\n      expect($interpolate('{{a.b}}')({})).toEqual('');\n    }));\n\n    it('should jsonify objects', inject(function($interpolate) {\n      expect($interpolate('{{ {} }}')({})).toEqual('{}');\n      expect($interpolate('{{ true }}')({})).toEqual('true');\n      expect($interpolate('{{ false }}')({})).toEqual('false');\n    }));\n\n\n    it('should use custom toString when present', inject(function($interpolate, $rootScope) {\n       var context = {\n        a: {\n          toString: function() {\n            return 'foo';\n          }\n        }\n      };\n\n      expect($interpolate('{{ a }}')(context)).toEqual('foo');\n    }));\n\n    it('should NOT use toString on array objects', inject(function($interpolate) {\n      expect($interpolate('{{a}}')({ a: [] })).toEqual('[]');\n    }));\n\n\n    it('should NOT use toString on Date objects', inject(function($interpolate) {\n      var date = new Date(2014, 10, 10);\n      expect($interpolate('{{a}}')({ a: date })).toBe(JSON.stringify(date));\n      expect($interpolate('{{a}}')({ a: date })).not.toEqual(date.toString());\n    }));\n\n\n    it('should return interpolation function', inject(function($interpolate, $rootScope) {\n      var interpolateFn = $interpolate('Hello {{name}}!');\n\n      expect(interpolateFn.exp).toBe('Hello {{name}}!');\n      expect(interpolateFn.expressions).toEqual(['name']);\n\n      var scope = $rootScope.$new();\n      scope.name = 'Bubu';\n\n      expect(interpolateFn(scope)).toBe('Hello Bubu!');\n    }));\n\n\n    it('should ignore undefined model', inject(function($interpolate) {\n      expect($interpolate('Hello {{\\'World\\'}}{{foo}}')({})).toBe('Hello World');\n    }));\n\n\n    it('should interpolate with undefined context', inject(function($interpolate) {\n      expect($interpolate('Hello, world!{{bloop}}')()).toBe('Hello, world!');\n    }));\n\n    describe('watching', function() {\n      it('should be watchable with any input types', inject(function($interpolate, $rootScope) {\n        var lastVal;\n        $rootScope.$watch($interpolate('{{i}}'), function(val) {\n          lastVal = val;\n        });\n        $rootScope.$apply();\n        expect(lastVal).toBe('');\n\n        $rootScope.i = null;\n        $rootScope.$apply();\n        expect(lastVal).toBe('');\n\n        $rootScope.i = '';\n        $rootScope.$apply();\n        expect(lastVal).toBe('');\n\n        $rootScope.i = 0;\n        $rootScope.$apply();\n        expect(lastVal).toBe('0');\n\n        $rootScope.i = [0];\n        $rootScope.$apply();\n        expect(lastVal).toBe('[0]');\n\n        $rootScope.i = {a: 1, b: 2};\n        $rootScope.$apply();\n        expect(lastVal).toBe('{\"a\":1,\"b\":2}');\n      }));\n\n      it('should be watchable with literal values', inject(function($interpolate, $rootScope) {\n        var lastVal;\n        $rootScope.$watch($interpolate('{{1}}{{\"2\"}}{{true}}{{[false]}}{{ {a: 2} }}'), function(val) {\n          lastVal = val;\n        });\n        $rootScope.$apply();\n        expect(lastVal).toBe('12true[false]{\"a\":2}');\n\n        expect($rootScope.$countWatchers()).toBe(0);\n      }));\n\n      it('should respect one-time bindings for each individual expression', inject(function($interpolate, $rootScope) {\n        var calls = [];\n        $rootScope.$watch($interpolate('{{::a | limitTo:1}} {{::s}} {{::i | number}}'), function(val) {\n          calls.push(val);\n        });\n\n        $rootScope.$apply();\n        expect(calls.length).toBe(1);\n\n        $rootScope.a = [1];\n        $rootScope.$apply();\n        expect(calls.length).toBe(2);\n        expect(calls[1]).toBe('[1]  ');\n\n        $rootScope.a = [0];\n        $rootScope.$apply();\n        expect(calls.length).toBe(2);\n\n        $rootScope.i = $rootScope.a = 123;\n        $rootScope.s = 'str!';\n        $rootScope.$apply();\n        expect(calls.length).toBe(3);\n        expect(calls[2]).toBe('[1] str! 123');\n\n        expect($rootScope.$countWatchers()).toBe(0);\n      }));\n\n      it('should stop watching strings with no expressions after first execution',\n        inject(function($interpolate, $rootScope) {\n          var spy = jasmine.createSpy();\n          $rootScope.$watch($interpolate('foo'), spy);\n          $rootScope.$digest();\n          expect($rootScope.$countWatchers()).toBe(0);\n          expect(spy).toHaveBeenCalledWith('foo', 'foo', $rootScope);\n          expect(spy).toHaveBeenCalledTimes(1);\n        })\n      );\n\n      it('should stop watching strings with only constant expressions after first execution',\n        inject(function($interpolate, $rootScope) {\n          var spy = jasmine.createSpy();\n          $rootScope.$watch($interpolate('foo {{42}}'), spy);\n          $rootScope.$digest();\n          expect($rootScope.$countWatchers()).toBe(0);\n          expect(spy).toHaveBeenCalledWith('foo 42', 'foo 42', $rootScope);\n          expect(spy).toHaveBeenCalledTimes(1);\n        })\n      );\n    });\n\n    describe('interpolation escaping', function() {\n      var obj;\n      beforeEach(function() {\n        obj = {foo: 'Hello', bar: 'World'};\n      });\n\n\n      it('should support escaping interpolation signs', inject(function($interpolate) {\n        expect($interpolate('{{foo}} \\\\{\\\\{bar\\\\}\\\\}')(obj)).toBe('Hello {{bar}}');\n        expect($interpolate('\\\\{\\\\{foo\\\\}\\\\} {{bar}}')(obj)).toBe('{{foo}} World');\n      }));\n\n\n      it('should unescape multiple expressions', inject(function($interpolate) {\n        expect($interpolate('\\\\{\\\\{foo\\\\}\\\\}\\\\{\\\\{bar\\\\}\\\\} {{foo}}')(obj)).toBe('{{foo}}{{bar}} Hello');\n        expect($interpolate('{{foo}}\\\\{\\\\{foo\\\\}\\\\}\\\\{\\\\{bar\\\\}\\\\}')(obj)).toBe('Hello{{foo}}{{bar}}');\n        expect($interpolate('\\\\{\\\\{foo\\\\}\\\\}{{foo}}\\\\{\\\\{bar\\\\}\\\\}')(obj)).toBe('{{foo}}Hello{{bar}}');\n        expect($interpolate('{{foo}}\\\\{\\\\{foo\\\\}\\\\}{{bar}}\\\\{\\\\{bar\\\\}\\\\}{{foo}}')(obj)).toBe('Hello{{foo}}World{{bar}}Hello');\n      }));\n\n\n      /*\n       *it('should support escaping custom interpolation start/end symbols', function() {\n       *  module(function($interpolateProvider) {\n       *    $interpolateProvider.startSymbol('[[');\n       *    $interpolateProvider.endSymbol(']]');\n       *  });\n       *  inject(function($interpolate) {\n       *    expect($interpolate('[[foo]] \\\\[\\\\[bar\\\\]\\\\]')(obj)).toBe('Hello [[bar]]');\n       *  });\n       *});\n       */\n\n\n      it('should unescape incomplete escaped expressions', inject(function($interpolate) {\n        expect($interpolate('\\\\{\\\\{foo{{foo}}')(obj)).toBe('{{fooHello');\n        expect($interpolate('\\\\}\\\\}foo{{foo}}')(obj)).toBe('}}fooHello');\n        expect($interpolate('foo{{foo}}\\\\{\\\\{')(obj)).toBe('fooHello{{');\n        expect($interpolate('foo{{foo}}\\\\}\\\\}')(obj)).toBe('fooHello}}');\n      }));\n\n\n      it('should not unescape markers within expressions', inject(function($interpolate) {\n        expect($interpolate('{{\"\\\\\\\\{\\\\\\\\{Hello, world!\\\\\\\\}\\\\\\\\}\"}}')(obj)).toBe('\\\\{\\\\{Hello, world!\\\\}\\\\}');\n        expect($interpolate('{{\"\\\\{\\\\{Hello, world!\\\\}\\\\}\"}}')(obj)).toBe('{{Hello, world!}}');\n        expect(function() {\n          $interpolate('{{\\\\{\\\\{foo\\\\}\\\\}}}')(obj);\n        }).toThrowMinErr('$parse', 'lexerr',\n          'Lexer Error: Unexpected next character  at columns 0-0 [\\\\] in expression [\\\\{\\\\{foo\\\\}\\\\}]');\n      }));\n\n\n      // This test demonstrates that the web-server is responsible for escaping every single instance\n      // of interpolation start/end markers in an expression which they do not wish to evaluate,\n      // because AngularJS will not protect them from being evaluated (due to the added complexity\n      // and maintenance burden of context-sensitive escaping)\n      it('should evaluate expressions between escaped start/end symbols', inject(function($interpolate) {\n        expect($interpolate('\\\\{\\\\{Hello, {{bar}}!\\\\}\\\\}')(obj)).toBe('{{Hello, World!}}');\n      }));\n    });\n\n\n    describe('interpolating in a trusted context', function() {\n      var sce;\n      beforeEach(function() {\n        function log() {}\n        var fakeLog = {log: log, warn: log, info: log, error: log};\n        module(function($provide, $sceProvider) {\n          $provide.value('$log', fakeLog);\n          $sceProvider.enabled(true);\n        });\n        inject(['$sce', function($sce) { sce = $sce; }]);\n      });\n\n      it('should NOT interpolate non-trusted expressions', inject(function($interpolate, $rootScope) {\n        var scope = $rootScope.$new();\n        scope.foo = 'foo';\n\n        expect(function() {\n          $interpolate('{{foo}}', true, sce.CSS)(scope);\n        }).toThrowMinErr('$interpolate', 'interr');\n      }));\n\n      it('should NOT interpolate mistyped expressions', inject(function($interpolate, $rootScope) {\n        var scope = $rootScope.$new();\n        scope.foo = sce.trustAsCss('foo');\n\n        expect(function() {\n          $interpolate('{{foo}}', true, sce.HTML)(scope);\n        }).toThrowMinErr('$interpolate', 'interr');\n      }));\n\n      it('should interpolate trusted expressions in a regular context', inject(function($interpolate) {\n        var foo = sce.trustAsCss('foo');\n        expect($interpolate('{{foo}}', true)({foo: foo})).toBe('foo');\n      }));\n\n      it('should interpolate trusted expressions in a specific trustedContext', inject(function($interpolate) {\n        var foo = sce.trustAsCss('foo');\n        expect($interpolate('{{foo}}', true, sce.CSS)({foo: foo})).toBe('foo');\n      }));\n\n      // The concatenation of trusted values does not necessarily result in a trusted value.  (For\n      // instance, you can construct evil JS code by putting together pieces of JS strings that are by\n      // themselves safe to execute in isolation.)\n      it('should NOT interpolate trusted expressions with multiple parts', inject(function($interpolate) {\n        var foo = sce.trustAsCss('foo');\n        var bar = sce.trustAsCss('bar');\n        expect(function() {\n          return $interpolate('{{foo}}{{bar}}', true, sce.CSS)({foo: foo, bar: bar});\n        }).toThrowMinErr(\n                  '$interpolate', 'noconcat', 'Error while interpolating: {{foo}}{{bar}}\\n' +\n                  'Strict Contextual Escaping disallows interpolations that concatenate multiple ' +\n                  'expressions when a trusted value is required.  See ' +\n                  'http://docs.angularjs.org/api/ng.$sce');\n      }));\n    });\n\n\n/*\n *    describe('provider', function() {\n *      beforeEach(module(function($interpolateProvider) {\n *        $interpolateProvider.startSymbol('--');\n *        $interpolateProvider.endSymbol('--');\n *      }));\n *\n *      it('should not get confused with same markers', inject(function($interpolate) {\n *        expect($interpolate('---').expressions).toEqual([]);\n *        expect($interpolate('----')({})).toEqual('');\n *        expect($interpolate('--1--')({})).toEqual('1');\n *      }));\n *    });\n */\n\n    describe('parseBindings', function() {\n      it('should Parse Text With No Bindings', inject(function($interpolate) {\n        expect($interpolate('a').expressions).toEqual([]);\n      }));\n\n      it('should Parse Empty Text', inject(function($interpolate) {\n        expect($interpolate('').expressions).toEqual([]);\n      }));\n\n      it('should Parse Inner Binding', inject(function($interpolate) {\n        var interpolateFn = $interpolate('a{{b}}C'),\n            expressions = interpolateFn.expressions;\n        expect(expressions).toEqual(['b']);\n        expect(interpolateFn({b: 123})).toEqual('a123C');\n      }));\n\n      it('should Parse Ending Binding', inject(function($interpolate) {\n        var interpolateFn = $interpolate('a{{b}}'),\n          expressions = interpolateFn.expressions;\n        expect(expressions).toEqual(['b']);\n        expect(interpolateFn({b: 123})).toEqual('a123');\n      }));\n\n      it('should Parse Begging Binding', inject(function($interpolate) {\n        var interpolateFn = $interpolate('{{b}}c'),\n          expressions = interpolateFn.expressions;\n        expect(expressions).toEqual(['b']);\n        expect(interpolateFn({b: 123})).toEqual('123c');\n      }));\n\n      it('should Parse Loan Binding', inject(function($interpolate) {\n        var interpolateFn = $interpolate('{{b}}'),\n          expressions = interpolateFn.expressions;\n        expect(expressions).toEqual(['b']);\n        expect(interpolateFn({b: 123})).toEqual('123');\n      }));\n\n      it('should Parse Two Bindings', inject(function($interpolate) {\n        var interpolateFn = $interpolate('{{b}}{{c}}'),\n          expressions = interpolateFn.expressions;\n        expect(expressions).toEqual(['b', 'c']);\n        expect(interpolateFn({b: 111, c: 222})).toEqual('111222');\n      }));\n\n      it('should Parse Two Bindings With Text In Middle', inject(function($interpolate) {\n        var interpolateFn = $interpolate('{{b}}x{{c}}'),\n          expressions = interpolateFn.expressions;\n        expect(expressions).toEqual(['b', 'c']);\n        expect(interpolateFn({b: 111, c: 222})).toEqual('111x222');\n      }));\n\n      it('should Parse Multiline', inject(function($interpolate) {\n        var interpolateFn = $interpolate('\"X\\nY{{A\\n+B}}C\\nD\"'),\n          expressions = interpolateFn.expressions;\n        expect(expressions).toEqual(['A\\n+B']);\n        expect(interpolateFn({'A': 'aa', 'B': 'bb'})).toEqual('\"X\\nYaabbC\\nD\"');\n      }));\n    });\n\n\n    describe('isTrustedContext', function() {\n      it('should NOT interpolate a multi-part expression when isTrustedContext is true', inject(function($interpolate) {\n        var isTrustedContext = true;\n        expect(function() {\n            $interpolate('constant/{{var}}', true, isTrustedContext);\n          }).toThrowMinErr(\n              '$interpolate', 'noconcat', 'Error while interpolating: constant/{{var}}\\nStrict ' +\n              'Contextual Escaping disallows interpolations that concatenate multiple expressions ' +\n              'when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce');\n        expect(function() {\n          $interpolate('{{var}}/constant', true, isTrustedContext);\n        }).toThrowMinErr(\n            '$interpolate', 'noconcat', 'Error while interpolating: {{var}}/constant\\nStrict ' +\n              'Contextual Escaping disallows interpolations that concatenate multiple expressions ' +\n              'when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce');\n        expect(function() {\n            $interpolate('{{foo}}{{bar}}', true, isTrustedContext);\n          }).toThrowMinErr(\n              '$interpolate', 'noconcat', 'Error while interpolating: {{foo}}{{bar}}\\nStrict ' +\n              'Contextual Escaping disallows interpolations that concatenate multiple expressions ' +\n              'when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce');\n      }));\n\n      it('should interpolate a multi-part expression when isTrustedContext is false', inject(function($interpolate) {\n        expect($interpolate('some/{{id}}')({})).toEqual('some/');\n        expect($interpolate('some/{{id}}')({id: 1})).toEqual('some/1');\n        expect($interpolate('{{foo}}{{bar}}')({foo: 1, bar: 2})).toEqual('12');\n      }));\n    });\n\n/*\n *    describe('startSymbol', function() {\n *\n *      beforeEach(module(function($interpolateProvider) {\n *        expect($interpolateProvider.startSymbol()).toBe('{{');\n *        $interpolateProvider.startSymbol('((');\n *      }));\n *\n *\n *      it('should expose the startSymbol in config phase', module(function($interpolateProvider) {\n *        expect($interpolateProvider.startSymbol()).toBe('((');\n *      }));\n *\n *\n *      it('should expose the startSymbol in run phase', inject(function($interpolate) {\n *        expect($interpolate.startSymbol()).toBe('((');\n *      }));\n *\n *\n *      it('should not get confused by matching start and end symbols', function() {\n *        module(function($interpolateProvider) {\n *          $interpolateProvider.startSymbol('--');\n *          $interpolateProvider.endSymbol('--');\n *        });\n *\n *        inject(function($interpolate) {\n *          expect($interpolate('---').expressions).toEqual([]);\n *          expect($interpolate('----')({})).toEqual('');\n *          expect($interpolate('--1--')({})).toEqual('1');\n *        });\n *      });\n *    });\n */\n\n\n/*\n *    describe('endSymbol', function() {\n *\n *      beforeEach(module(function($interpolateProvider) {\n *        expect($interpolateProvider.endSymbol()).toBe('}}');\n *        $interpolateProvider.endSymbol('))');\n *      }));\n *\n *\n *      it('should expose the endSymbol in config phase', module(function($interpolateProvider) {\n *        expect($interpolateProvider.endSymbol()).toBe('))');\n *      }));\n *\n *\n *      it('should expose the endSymbol in run phase', inject(function($interpolate) {\n *        expect($interpolate.endSymbol()).toBe('))');\n *      }));\n *    });\n */\n\n  });  // end of tests copied from $interpolate\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-messages.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar forEach;\nvar isArray;\nvar isString;\nvar jqLite;\n\n/**\n * @ngdoc module\n * @name ngMessages\n * @description\n *\n * The `ngMessages` module provides enhanced support for displaying messages within templates\n * (typically within forms or when rendering message objects that return key/value data).\n * Instead of relying on JavaScript code and/or complex ng-if statements within your form template to\n * show and hide error messages specific to the state of an input field, the `ngMessages` and\n * `ngMessage` directives are designed to handle the complexity, inheritance and priority\n * sequencing based on the order of how the messages are defined in the template.\n *\n * Currently, the ngMessages module only contains the code for the `ngMessages`, `ngMessagesInclude`\n * `ngMessage`, `ngMessageExp` and `ngMessageDefault` directives.\n *\n * ## Usage\n * The `ngMessages` directive allows keys in a key/value collection to be associated with a child element\n * (or 'message') that will show or hide based on the truthiness of that key's value in the collection. A common use\n * case for `ngMessages` is to display error messages for inputs using the `$error` object exposed by the\n * {@link ngModel ngModel} directive.\n *\n * The child elements of the `ngMessages` directive are matched to the collection keys by a `ngMessage` or\n * `ngMessageExp` directive. The value of these attributes must match a key in the collection that is provided by\n * the `ngMessages` directive.\n *\n * Consider the following example, which illustrates a typical use case of `ngMessages`. Within the form `myForm` we\n * have a text input named `myField` which is bound to the scope variable `field` using the {@link ngModel ngModel}\n * directive.\n *\n * The `myField` field is a required input of type `email` with a maximum length of 15 characters.\n *\n * ```html\n * <form name=\"myForm\">\n *   <label>\n *     Enter text:\n *     <input type=\"email\" ng-model=\"field\" name=\"myField\" required maxlength=\"15\" />\n *   </label>\n *   <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *     <div ng-message=\"required\">Please enter a value for this field.</div>\n *     <div ng-message=\"email\">This field must be a valid email address.</div>\n *     <div ng-message=\"maxlength\">This field can be at most 15 characters long.</div>\n *   </div>\n * </form>\n * ```\n *\n * In order to show error messages corresponding to `myField` we first create an element with an `ngMessages` attribute\n * set to the `$error` object owned by the `myField` input in our `myForm` form.\n *\n * Within this element we then create separate elements for each of the possible errors that `myField` could have.\n * The `ngMessage` attribute is used to declare which element(s) will appear for which error - for example,\n * setting `ng-message=\"required\"` specifies that this particular element should be displayed when there\n * is no value present for the required field `myField` (because the key `required` will be `true` in the object\n * `myForm.myField.$error`).\n *\n * ### Message order\n *\n * By default, `ngMessages` will only display one message for a particular key/value collection at any time. If more\n * than one message (or error) key is currently true, then which message is shown is determined by the order of messages\n * in the HTML template code (messages declared first are prioritised). This mechanism means the developer does not have\n * to prioritize messages using custom JavaScript code.\n *\n * Given the following error object for our example (which informs us that the field `myField` currently has both the\n * `required` and `email` errors):\n *\n * ```javascript\n * <!-- keep in mind that ngModel automatically sets these error flags -->\n * myField.$error = { required : true, email: true, maxlength: false };\n * ```\n * The `required` message will be displayed to the user since it appears before the `email` message in the DOM.\n * Once the user types a single character, the `required` message will disappear (since the field now has a value)\n * but the `email` message will be visible because it is still applicable.\n *\n * ### Displaying multiple messages at the same time\n *\n * While `ngMessages` will by default only display one error element at a time, the `ng-messages-multiple` attribute can\n * be applied to the `ngMessages` container element to cause it to display all applicable error messages at once:\n *\n * ```html\n * <!-- attribute-style usage -->\n * <div ng-messages=\"myForm.myField.$error\" ng-messages-multiple>...</div>\n *\n * <!-- element-style usage -->\n * <ng-messages for=\"myForm.myField.$error\" multiple>...</ng-messages>\n * ```\n *\n * ## Reusing and Overriding Messages\n * In addition to prioritization, ngMessages also allows for including messages from a remote or an inline\n * template. This allows for generic collection of messages to be reused across multiple parts of an\n * application.\n *\n * ```html\n * <script type=\"text/ng-template\" id=\"error-messages\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n * </script>\n *\n * <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *   <div ng-messages-include=\"error-messages\"></div>\n * </div>\n * ```\n *\n * However, including generic messages may not be useful enough to match all input fields, therefore,\n * `ngMessages` provides the ability to override messages defined in the remote template by redefining\n * them within the directive container.\n *\n * ```html\n * <!-- a generic template of error messages known as \"my-custom-messages\" -->\n * <script type=\"text/ng-template\" id=\"my-custom-messages\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n * </script>\n *\n * <form name=\"myForm\">\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            id=\"email\"\n *            name=\"myEmail\"\n *            ng-model=\"email\"\n *            minlength=\"5\"\n *            required />\n *   </label>\n *   <!-- any ng-message elements that appear BEFORE the ng-messages-include will\n *        override the messages present in the ng-messages-include template -->\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <!-- this required message has overridden the template message -->\n *     <div ng-message=\"required\">You did not enter your email address</div>\n *\n *     <!-- this is a brand new message and will appear last in the prioritization -->\n *     <div ng-message=\"email\">Your email address is invalid</div>\n *\n *     <!-- and here are the generic error messages -->\n *     <div ng-messages-include=\"my-custom-messages\"></div>\n *   </div>\n * </form>\n * ```\n *\n * In the example HTML code above the message that is set on required will override the corresponding\n * required message defined within the remote template. Therefore, with particular input fields (such\n * email addresses, date fields, autocomplete inputs, etc...), specialized error messages can be applied\n * while more generic messages can be used to handle other, more general input errors.\n *\n * ## Dynamic Messaging\n * ngMessages also supports using expressions to dynamically change key values. Using arrays and\n * repeaters to list messages is also supported. This means that the code below will be able to\n * fully adapt itself and display the appropriate message when any of the expression data changes:\n *\n * ```html\n * <form name=\"myForm\">\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            name=\"myEmail\"\n *            ng-model=\"email\"\n *            minlength=\"5\"\n *            required />\n *   </label>\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <div ng-message=\"required\">You did not enter your email address</div>\n *     <div ng-repeat=\"errorMessage in errorMessages\">\n *       <!-- use ng-message-exp for a message whose key is given by an expression -->\n *       <div ng-message-exp=\"errorMessage.type\">{{ errorMessage.text }}</div>\n *     </div>\n *   </div>\n * </form>\n * ```\n *\n * The `errorMessage.type` expression can be a string value or it can be an array so\n * that multiple errors can be associated with a single error message:\n *\n * ```html\n *   <label>\n *     Email address\n *     <input type=\"email\"\n *            ng-model=\"data.email\"\n *            name=\"myEmail\"\n *            ng-minlength=\"5\"\n *            ng-maxlength=\"100\"\n *            required />\n *   </label>\n *   <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *     <div ng-message-exp=\"'required'\">You did not enter your email address</div>\n *     <div ng-message-exp=\"['minlength', 'maxlength']\">\n *       Your email must be between 5 and 100 characters long\n *     </div>\n *   </div>\n * ```\n *\n * Feel free to use other structural directives such as ng-if and ng-switch to further control\n * what messages are active and when. Be careful, if you place ng-message on the same element\n * as these structural directives, AngularJS may not be able to determine if a message is active\n * or not. Therefore it is best to place the ng-message on a child element of the structural\n * directive.\n *\n * ```html\n * <div ng-messages=\"myForm.myEmail.$error\" role=\"alert\">\n *   <div ng-if=\"showRequiredError\">\n *     <div ng-message=\"required\">Please enter something</div>\n *   </div>\n * </div>\n * ```\n *\n * ## Animations\n * If the `ngAnimate` module is active within the application then the `ngMessages`, `ngMessage` and\n * `ngMessageExp` directives will trigger animations whenever any messages are added and removed from\n * the DOM by the `ngMessages` directive.\n *\n * Whenever the `ngMessages` directive contains one or more visible messages then the `.ng-active` CSS\n * class will be added to the element. The `.ng-inactive` CSS class will be applied when there are no\n * messages present. Therefore, CSS transitions and keyframes as well as JavaScript animations can\n * hook into the animations whenever these classes are added/removed.\n *\n * Let's say that our HTML code for our messages container looks like so:\n *\n * ```html\n * <div ng-messages=\"myMessages\" class=\"my-messages\" role=\"alert\">\n *   <div ng-message=\"alert\" class=\"some-message\">...</div>\n *   <div ng-message=\"fail\" class=\"some-message\">...</div>\n * </div>\n * ```\n *\n * Then the CSS animation code for the message container looks like so:\n *\n * ```css\n * .my-messages {\n *   transition:1s linear all;\n * }\n * .my-messages.ng-active {\n *   // messages are visible\n * }\n * .my-messages.ng-inactive {\n *   // messages are hidden\n * }\n * ```\n *\n * Whenever an inner message is attached (becomes visible) or removed (becomes hidden) then the enter\n * and leave animation is triggered for each particular element bound to the `ngMessage` directive.\n *\n * Therefore, the CSS code for the inner messages looks like so:\n *\n * ```css\n * .some-message {\n *   transition:1s linear all;\n * }\n *\n * .some-message.ng-enter {}\n * .some-message.ng-enter.ng-enter-active {}\n *\n * .some-message.ng-leave {}\n * .some-message.ng-leave.ng-leave-active {}\n * ```\n *\n * {@link ngAnimate See the ngAnimate docs} to learn how to use JavaScript animations or to learn\n * more about ngAnimate.\n *\n * ## Displaying a default message\n * If the ngMessages renders no inner ngMessage directive (i.e. when none of the truthy\n * keys are matched by a defined message), then it will render a default message\n * using the {@link ngMessageDefault} directive.\n * Note that matched messages will always take precedence over unmatched messages. That means\n * the default message will not be displayed when another message is matched. This is also\n * true for `ng-messages-multiple`.\n *\n * ```html\n * <div ng-messages=\"myForm.myField.$error\" role=\"alert\">\n *   <div ng-message=\"required\">This field is required</div>\n *   <div ng-message=\"minlength\">This field is too short</div>\n *   <div ng-message-default>This field has an input error</div>\n * </div>\n * ```\n *\n\n */\nangular.module('ngMessages', [], function initAngularHelpers() {\n  // Access helpers from AngularJS core.\n  // Do it inside a `config` block to ensure `window.angular` is available.\n  forEach = angular.forEach;\n  isArray = angular.isArray;\n  isString = angular.isString;\n  jqLite = angular.element;\n})\n  .info({ angularVersion: '1.7.8' })\n\n  /**\n   * @ngdoc directive\n   * @module ngMessages\n   * @name ngMessages\n   * @restrict AE\n   *\n   * @description\n   * `ngMessages` is a directive that is designed to show and hide messages based on the state\n   * of a key/value object that it listens on. The directive itself complements error message\n   * reporting with the `ngModel` $error object (which stores a key/value state of validation errors).\n   *\n   * `ngMessages` manages the state of internal messages within its container element. The internal\n   * messages use the `ngMessage` directive and will be inserted/removed from the page depending\n   * on if they're present within the key/value object. By default, only one message will be displayed\n   * at a time and this depends on the prioritization of the messages within the template. (This can\n   * be changed by using the `ng-messages-multiple` or `multiple` attribute on the directive container.)\n   *\n   * A remote template can also be used (With {@link ngMessagesInclude}) to promote message\n   * reusability and messages can also be overridden.\n   *\n   * A default message can also be displayed when no `ngMessage` directive is inserted, using the\n   * {@link ngMessageDefault} directive.\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   *   <ANY ng-message-exp=\"expressionValue\">...</ANY>\n   *   <ANY ng-message-default>...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   *   <ng-message when-exp=\"expressionValue\">...</ng-message>\n   *   <ng-message-default>...</ng-message-default>\n   * </ng-messages>\n   * ```\n   *\n   * @param {string} ngMessages an AngularJS expression evaluating to a key/value object\n   *                 (this is typically the $error object on an ngModel instance).\n   * @param {string=} ngMessagesMultiple|multiple when set, all messages will be displayed with true\n   *\n   * @example\n   * <example name=\"ngMessages-directive\" module=\"ngMessagesExample\"\n   *          deps=\"angular-messages.js\"\n   *          animations=\"true\" fixBase=\"true\">\n   *   <file name=\"index.html\">\n   *     <form name=\"myForm\">\n   *       <label>\n   *         Enter your name:\n   *         <input type=\"text\"\n   *                name=\"myName\"\n   *                ng-model=\"name\"\n   *                ng-minlength=\"5\"\n   *                ng-maxlength=\"20\"\n   *                required />\n   *       </label>\n   *       <pre>myForm.myName.$error = {{ myForm.myName.$error | json }}</pre>\n   *\n   *       <div ng-messages=\"myForm.myName.$error\" style=\"color:maroon\" role=\"alert\">\n   *         <div ng-message=\"required\">You did not enter a field</div>\n   *         <div ng-message=\"minlength\">Your field is too short</div>\n   *         <div ng-message=\"maxlength\">Your field is too long</div>\n   *         <div ng-message-default>This field has an input error</div>\n   *       </div>\n   *     </form>\n   *   </file>\n   *   <file name=\"script.js\">\n   *     angular.module('ngMessagesExample', ['ngMessages']);\n   *   </file>\n   * </example>\n   */\n  .directive('ngMessages', ['$animate', function($animate) {\n    var ACTIVE_CLASS = 'ng-active';\n    var INACTIVE_CLASS = 'ng-inactive';\n\n    return {\n      require: 'ngMessages',\n      restrict: 'AE',\n      controller: ['$element', '$scope', '$attrs', function NgMessagesCtrl($element, $scope, $attrs) {\n        var ctrl = this;\n        var latestKey = 0;\n        var nextAttachId = 0;\n\n        this.getAttachId = function getAttachId() { return nextAttachId++; };\n\n        var messages = this.messages = {};\n        var renderLater, cachedCollection;\n\n        this.render = function(collection) {\n          collection = collection || {};\n\n          renderLater = false;\n          cachedCollection = collection;\n\n          // this is true if the attribute is empty or if the attribute value is truthy\n          var multiple = isAttrTruthy($scope, $attrs.ngMessagesMultiple) ||\n                         isAttrTruthy($scope, $attrs.multiple);\n\n          var unmatchedMessages = [];\n          var matchedKeys = {};\n          var truthyKeys = 0;\n          var messageItem = ctrl.head;\n          var messageFound = false;\n          var totalMessages = 0;\n\n          // we use != instead of !== to allow for both undefined and null values\n          while (messageItem != null) {\n            totalMessages++;\n            var messageCtrl = messageItem.message;\n\n            var messageUsed = false;\n            if (!messageFound) {\n              forEach(collection, function(value, key) {\n                if (truthy(value) && !messageUsed) {\n                  truthyKeys++;\n\n                  if (messageCtrl.test(key)) {\n                    // this is to prevent the same error name from showing up twice\n                    if (matchedKeys[key]) return;\n                    matchedKeys[key] = true;\n\n                    messageUsed = true;\n                    messageCtrl.attach();\n                  }\n                }\n              });\n            }\n\n            if (messageUsed) {\n              // unless we want to display multiple messages then we should\n              // set a flag here to avoid displaying the next message in the list\n              messageFound = !multiple;\n            } else {\n              unmatchedMessages.push(messageCtrl);\n            }\n\n            messageItem = messageItem.next;\n          }\n\n          forEach(unmatchedMessages, function(messageCtrl) {\n            messageCtrl.detach();\n          });\n\n          var messageMatched = unmatchedMessages.length !== totalMessages;\n          var attachDefault = ctrl.default && !messageMatched && truthyKeys > 0;\n\n          if (attachDefault) {\n            ctrl.default.attach();\n          } else if (ctrl.default) {\n            ctrl.default.detach();\n          }\n\n          if (messageMatched || attachDefault) {\n            $animate.setClass($element, ACTIVE_CLASS, INACTIVE_CLASS);\n          } else {\n            $animate.setClass($element, INACTIVE_CLASS, ACTIVE_CLASS);\n          }\n        };\n\n        $scope.$watchCollection($attrs.ngMessages || $attrs['for'], ctrl.render);\n\n        this.reRender = function() {\n          if (!renderLater) {\n            renderLater = true;\n            $scope.$evalAsync(function() {\n              if (renderLater && cachedCollection) {\n                ctrl.render(cachedCollection);\n              }\n            });\n          }\n        };\n\n        this.register = function(comment, messageCtrl, isDefault) {\n          if (isDefault) {\n            ctrl.default = messageCtrl;\n          } else {\n            var nextKey = latestKey.toString();\n            messages[nextKey] = {\n              message: messageCtrl\n            };\n            insertMessageNode($element[0], comment, nextKey);\n            comment.$$ngMessageNode = nextKey;\n            latestKey++;\n          }\n\n          ctrl.reRender();\n        };\n\n        this.deregister = function(comment, isDefault) {\n          if (isDefault) {\n            delete ctrl.default;\n          } else {\n            var key = comment.$$ngMessageNode;\n            delete comment.$$ngMessageNode;\n            removeMessageNode($element[0], comment, key);\n            delete messages[key];\n          }\n          ctrl.reRender();\n        };\n\n        function findPreviousMessage(parent, comment) {\n          var prevNode = comment;\n          var parentLookup = [];\n\n          while (prevNode && prevNode !== parent) {\n            var prevKey = prevNode.$$ngMessageNode;\n            if (prevKey && prevKey.length) {\n              return messages[prevKey];\n            }\n\n            // dive deeper into the DOM and examine its children for any ngMessage\n            // comments that may be in an element that appears deeper in the list\n            if (prevNode.childNodes.length && parentLookup.indexOf(prevNode) === -1) {\n              parentLookup.push(prevNode);\n              prevNode = prevNode.childNodes[prevNode.childNodes.length - 1];\n            } else if (prevNode.previousSibling) {\n              prevNode = prevNode.previousSibling;\n            } else {\n              prevNode = prevNode.parentNode;\n              parentLookup.push(prevNode);\n            }\n          }\n        }\n\n        function insertMessageNode(parent, comment, key) {\n          var messageNode = messages[key];\n          if (!ctrl.head) {\n            ctrl.head = messageNode;\n          } else {\n            var match = findPreviousMessage(parent, comment);\n            if (match) {\n              messageNode.next = match.next;\n              match.next = messageNode;\n            } else {\n              messageNode.next = ctrl.head;\n              ctrl.head = messageNode;\n            }\n          }\n        }\n\n        function removeMessageNode(parent, comment, key) {\n          var messageNode = messages[key];\n\n          // This message node may have already been removed by a call to deregister()\n          if (!messageNode) return;\n\n          var match = findPreviousMessage(parent, comment);\n          if (match) {\n            match.next = messageNode.next;\n          } else {\n            ctrl.head = messageNode.next;\n          }\n        }\n      }]\n    };\n\n    function isAttrTruthy(scope, attr) {\n     return (isString(attr) && attr.length === 0) || //empty attribute\n            truthy(scope.$eval(attr));\n    }\n\n    function truthy(val) {\n      return isString(val) ? val.length : !!val;\n    }\n  }])\n\n  /**\n   * @ngdoc directive\n   * @name ngMessagesInclude\n   * @restrict AE\n   * @scope\n   *\n   * @description\n   * `ngMessagesInclude` is a directive with the purpose to import existing ngMessage template\n   * code from a remote template and place the downloaded template code into the exact spot\n   * that the ngMessagesInclude directive is placed within the ngMessages container. This allows\n   * for a series of pre-defined messages to be reused and also allows for the developer to\n   * determine what messages are overridden due to the placement of the ngMessagesInclude directive.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-messages-include=\"remoteTplString\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-messages-include src=\"expressionValue1\">...</ng-messages-include>\n   * </ng-messages>\n   * ```\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @param {string} ngMessagesInclude|src a string value corresponding to the remote template.\n   */\n  .directive('ngMessagesInclude',\n    ['$templateRequest', '$document', '$compile', function($templateRequest, $document, $compile) {\n\n    return {\n      restrict: 'AE',\n      require: '^^ngMessages', // we only require this for validation sake\n      link: function($scope, element, attrs) {\n        var src = attrs.ngMessagesInclude || attrs.src;\n        $templateRequest(src).then(function(html) {\n          if ($scope.$$destroyed) return;\n\n          if (isString(html) && !html.trim()) {\n            // Empty template - nothing to compile\n            replaceElementWithMarker(element, src);\n          } else {\n            // Non-empty template - compile and link\n            $compile(html)($scope, function(contents) {\n              element.after(contents);\n              replaceElementWithMarker(element, src);\n            });\n          }\n        });\n      }\n    };\n\n    // Helpers\n    function replaceElementWithMarker(element, src) {\n      // A comment marker is placed for debugging purposes\n      var comment = $compile.$$createComment ?\n          $compile.$$createComment('ngMessagesInclude', src) :\n          $document[0].createComment(' ngMessagesInclude: ' + src + ' ');\n      var marker = jqLite(comment);\n      element.after(marker);\n\n      // Don't pollute the DOM anymore by keeping an empty directive element\n      element.remove();\n    }\n  }])\n\n  /**\n   * @ngdoc directive\n   * @name ngMessage\n   * @restrict AE\n   * @scope\n   * @priority 1\n   *\n   * @description\n   * `ngMessage` is a directive with the purpose to show and hide a particular message.\n   * For `ngMessage` to operate, a parent `ngMessages` directive on a parent DOM element\n   * must be situated since it determines which messages are visible based on the state\n   * of the provided key/value map that `ngMessages` listens on.\n   *\n   * More information about using `ngMessage` can be found in the\n   * {@link module:ngMessages `ngMessages` module documentation}.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   * </ng-messages>\n   * ```\n   *\n   * @param {expression} ngMessage|when a string value corresponding to the message key.\n   */\n  .directive('ngMessage', ngMessageDirectiveFactory())\n\n\n  /**\n   * @ngdoc directive\n   * @name ngMessageExp\n   * @restrict AE\n   * @priority 1\n   * @scope\n   *\n   * @description\n   * `ngMessageExp` is the same as {@link directive:ngMessage `ngMessage`}, but instead of a static\n   * value, it accepts an expression to be evaluated for the message key.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\">\n   *   <ANY ng-message-exp=\"expressionValue\">...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\">\n   *   <ng-message when-exp=\"expressionValue\">...</ng-message>\n   * </ng-messages>\n   * ```\n   *\n   * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.\n   *\n   * @param {expression} ngMessageExp|whenExp an expression value corresponding to the message key.\n   */\n  .directive('ngMessageExp', ngMessageDirectiveFactory())\n\n  /**\n   * @ngdoc directive\n   * @name ngMessageDefault\n   * @restrict AE\n   * @scope\n   *\n   * @description\n   * `ngMessageDefault` is a directive with the purpose to show and hide a default message for\n   * {@link directive:ngMessages}, when none of provided messages matches.\n   *\n   * More information about using `ngMessageDefault` can be found in the\n   * {@link module:ngMessages `ngMessages` module documentation}.\n   *\n   * @usage\n   * ```html\n   * <!-- using attribute directives -->\n   * <ANY ng-messages=\"expression\" role=\"alert\">\n   *   <ANY ng-message=\"stringValue\">...</ANY>\n   *   <ANY ng-message=\"stringValue1, stringValue2, ...\">...</ANY>\n   *   <ANY ng-message-default>...</ANY>\n   * </ANY>\n   *\n   * <!-- or by using element directives -->\n   * <ng-messages for=\"expression\" role=\"alert\">\n   *   <ng-message when=\"stringValue\">...</ng-message>\n   *   <ng-message when=\"stringValue1, stringValue2, ...\">...</ng-message>\n   *   <ng-message-default>...</ng-message-default>\n   * </ng-messages>\n   *\n  */\n  .directive('ngMessageDefault', ngMessageDirectiveFactory(true));\n\nfunction ngMessageDirectiveFactory(isDefault) {\n  return ['$animate', function($animate) {\n    return {\n      restrict: 'AE',\n      transclude: 'element',\n      priority: 1, // must run before ngBind, otherwise the text is set on the comment\n      terminal: true,\n      require: '^^ngMessages',\n      link: function(scope, element, attrs, ngMessagesCtrl, $transclude) {\n        var commentNode, records, staticExp, dynamicExp;\n\n        if (!isDefault) {\n          commentNode = element[0];\n          staticExp = attrs.ngMessage || attrs.when;\n          dynamicExp = attrs.ngMessageExp || attrs.whenExp;\n\n          var assignRecords = function(items) {\n            records = items\n                ? (isArray(items)\n                      ? items\n                      : items.split(/[\\s,]+/))\n                : null;\n            ngMessagesCtrl.reRender();\n          };\n\n          if (dynamicExp) {\n            assignRecords(scope.$eval(dynamicExp));\n            scope.$watchCollection(dynamicExp, assignRecords);\n          } else {\n            assignRecords(staticExp);\n          }\n        }\n\n        var currentElement, messageCtrl;\n        ngMessagesCtrl.register(commentNode, messageCtrl = {\n          test: function(name) {\n            return contains(records, name);\n          },\n          attach: function() {\n            if (!currentElement) {\n              $transclude(function(elm, newScope) {\n                $animate.enter(elm, null, element);\n                currentElement = elm;\n\n                // Each time we attach this node to a message we get a new id that we can match\n                // when we are destroying the node later.\n                var $$attachId = currentElement.$$attachId = ngMessagesCtrl.getAttachId();\n\n                // in the event that the element or a parent element is destroyed\n                // by another structural directive then it's time\n                // to deregister the message from the controller\n                currentElement.on('$destroy', function() {\n                  // If the message element was removed via a call to `detach` then `currentElement` will be null\n                  // So this handler only handles cases where something else removed the message element.\n                  if (currentElement && currentElement.$$attachId === $$attachId) {\n                    ngMessagesCtrl.deregister(commentNode, isDefault);\n                    messageCtrl.detach();\n                  }\n                  newScope.$destroy();\n                });\n              });\n            }\n          },\n          detach: function() {\n            if (currentElement) {\n              var elm = currentElement;\n              currentElement = null;\n              $animate.leave(elm);\n            }\n          }\n        }, isDefault);\n\n        // We need to ensure that this directive deregisters itself when it no longer exists\n        // Normally this is done when the attached element is destroyed; but if this directive\n        // gets removed before we attach the message to the DOM there is nothing to watch\n        // in which case we must deregister when the containing scope is destroyed.\n        scope.$on('$destroy', function() {\n          ngMessagesCtrl.deregister(commentNode, isDefault);\n        });\n      }\n    };\n  }];\n\n  function contains(collection, key) {\n    if (collection) {\n      return isArray(collection)\n          ? collection.indexOf(key) >= 0\n          : collection.hasOwnProperty(key);\n    }\n  }\n}\n\ndescribe('ngMessages', function() {\n  beforeEach(inject.strictDi());\n  beforeEach(module('ngMessages'));\n\n  function messageChildren(element) {\n    return (element.length ? element[0] : element).querySelectorAll('[ng-message], [ng-message-exp]');\n  }\n\n  function s(str) {\n    return str.replace(/\\s+/g,'');\n  }\n\n  function trim(value) {\n    return isString(value) ? value.trim() : value;\n  }\n\n  var element;\n  afterEach(function() {\n    dealoc(element);\n  });\n\n  it('should render based off of a hashmap collection', inject(function($rootScope, $compile) {\n    element = $compile('<div ng-messages=\"col\">' +\n                       '  <div ng-message=\"val\">Message is set</div>' +\n                       '</div>')($rootScope);\n    $rootScope.$digest();\n\n    expect(element.text()).not.toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { val: true };\n    });\n\n    expect(element.text()).toContain('Message is set');\n  }));\n\n  it('should render the same message if multiple message keys match', inject(function($rootScope, $compile) {\n    element = $compile('<div ng-messages=\"col\">' +\n                       '  <div ng-message=\"one, two, three\">Message is set</div>' +\n                       '</div>')($rootScope);\n    $rootScope.$digest();\n\n    expect(element.text()).not.toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { one: true };\n    });\n\n    expect(element.text()).toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { two: true, one: false };\n    });\n\n    expect(element.text()).toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { three: true, two: false };\n    });\n\n    expect(element.text()).toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { three: false };\n    });\n\n    expect(element.text()).not.toContain('Message is set');\n  }));\n\n  it('should use the when attribute when an element directive is used',\n    inject(function($rootScope, $compile) {\n\n    element = $compile('<ng-messages for=\"col\">' +\n                       '  <ng-message when=\"val\">Message is set</div>' +\n                       '</ng-messages>')($rootScope);\n    $rootScope.$digest();\n\n    expect(element.text()).not.toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { val: true };\n    });\n\n    expect(element.text()).toContain('Message is set');\n  }));\n\n  it('should render the same message if multiple message keys match based on the when attribute', inject(function($rootScope, $compile) {\n    element = $compile('<ng-messages for=\"col\">' +\n                       '  <ng-message when=\" one two three \">Message is set</div>' +\n                       '</ng-messages>')($rootScope);\n    $rootScope.$digest();\n\n    expect(element.text()).not.toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { one: true };\n    });\n\n    expect(element.text()).toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { two: true, one: false };\n    });\n\n    expect(element.text()).toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { three: true, two: false };\n    });\n\n    expect(element.text()).toContain('Message is set');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { three: false };\n    });\n\n    expect(element.text()).not.toContain('Message is set');\n  }));\n\n  it('should allow a dynamic expression to be set when ng-message-exp is used',\n    inject(function($rootScope, $compile) {\n\n    element = $compile('<div ng-messages=\"col\">' +\n                       '  <div ng-message-exp=\"variable\">Message is crazy</div>' +\n                       '</div>')($rootScope);\n    $rootScope.$digest();\n\n    expect(element.text()).not.toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.variable = 'error';\n      $rootScope.col = { error: true };\n    });\n\n    expect(element.text()).toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { error: false, failure: true };\n    });\n\n    expect(element.text()).not.toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.variable = ['failure'];\n    });\n\n    expect(element.text()).toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.variable = null;\n    });\n\n    expect(element.text()).not.toContain('Message is crazy');\n  }));\n\n  it('should allow a dynamic expression to be set when the when-exp attribute is used',\n    inject(function($rootScope, $compile) {\n\n    element = $compile('<ng-messages for=\"col\">' +\n                       '  <ng-message when-exp=\"variable\">Message is crazy</ng-message>' +\n                       '</ng-messages>')($rootScope);\n    $rootScope.$digest();\n\n    expect(element.text()).not.toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.variable = 'error, failure';\n      $rootScope.col = { error: true };\n    });\n\n    expect(element.text()).toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { error: false, failure: true };\n    });\n\n    expect(element.text()).toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.variable = [];\n    });\n\n    expect(element.text()).not.toContain('Message is crazy');\n\n    $rootScope.$apply(function() {\n      $rootScope.variable = null;\n    });\n\n    expect(element.text()).not.toContain('Message is crazy');\n  }));\n\n  they('should render empty when $prop is used as a collection value',\n    { 'null': null,\n      'false': false,\n      '0': 0,\n      '[]': [],\n      '[{}]': [{}],\n      '': '',\n      '{ val2 : true }': { val2: true } },\n  function(prop) {\n    inject(function($rootScope, $compile) {\n      element = $compile('<div ng-messages=\"col\">' +\n                         '  <div ng-message=\"val\">Message is set</div>' +\n                         '</div>')($rootScope);\n      $rootScope.$digest();\n\n      $rootScope.$apply(function() {\n        $rootScope.col = prop;\n      });\n      expect(element.text()).not.toContain('Message is set');\n    });\n  });\n\n  they('should insert and remove matching inner elements when $prop is used as a value',\n    { 'true': true,\n      '1': 1,\n      '{}': {},\n      '[]': [],\n      '[null]': [null] },\n  function(prop) {\n    inject(function($rootScope, $compile) {\n\n      element = $compile('<div ng-messages=\"col\">' +\n                         '  <div ng-message=\"blue\">This message is blue</div>' +\n                         '  <div ng-message=\"red\">This message is red</div>' +\n                         '</div>')($rootScope);\n\n      $rootScope.$apply(function() {\n        $rootScope.col = {};\n      });\n\n      expect(messageChildren(element).length).toBe(0);\n      expect(trim(element.text())).toEqual('');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = {\n          blue: true,\n          red: false\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(1);\n      expect(trim(element.text())).toEqual('This message is blue');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = {\n          red: prop\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(1);\n      expect(trim(element.text())).toEqual('This message is red');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = null;\n      });\n      expect(messageChildren(element).length).toBe(0);\n      expect(trim(element.text())).toEqual('');\n\n\n      $rootScope.$apply(function() {\n        $rootScope.col = {\n          blue: 0,\n          red: null\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(0);\n      expect(trim(element.text())).toEqual('');\n    });\n  });\n\n  it('should display the elements in the order defined in the DOM',\n    inject(function($rootScope, $compile) {\n\n    element = $compile('<div ng-messages=\"col\">' +\n                       '  <div ng-message=\"one\">Message#one</div>' +\n                       '  <div ng-message=\"two\">Message#two</div>' +\n                       '  <div ng-message=\"three\">Message#three</div>' +\n                       '</div>')($rootScope);\n\n    $rootScope.$apply(function() {\n      $rootScope.col = {\n        three: true,\n        one: true,\n        two: true\n      };\n    });\n\n    angular.forEach(['one','two','three'], function(key) {\n      expect(s(element.text())).toEqual('Message#' + key);\n\n      $rootScope.$apply(function() {\n        $rootScope.col[key] = false;\n      });\n    });\n\n    expect(s(element.text())).toEqual('');\n  }));\n\n  it('should add ng-active/ng-inactive CSS classes to the element when errors are/aren\\'t displayed',\n    inject(function($rootScope, $compile) {\n\n    element = $compile('<div ng-messages=\"col\">' +\n                       '  <div ng-message=\"ready\">This message is ready</div>' +\n                       '</div>')($rootScope);\n\n    $rootScope.$apply(function() {\n      $rootScope.col = {};\n    });\n\n    expect(element.hasClass('ng-active')).toBe(false);\n    expect(element.hasClass('ng-inactive')).toBe(true);\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { ready: true };\n    });\n\n    expect(element.hasClass('ng-active')).toBe(true);\n    expect(element.hasClass('ng-inactive')).toBe(false);\n  }));\n\n  it('should automatically re-render the messages when other directives dynamically change them',\n    inject(function($rootScope, $compile) {\n\n    element = $compile('<div ng-messages=\"col\">' +\n                       '  <div ng-message=\"primary\">Enter something</div>' +\n                       '  <div ng-repeat=\"item in items\">' +\n                       '    <div ng-message-exp=\"item.name\">{{ item.text }}</div>' +\n                       '  </div>' +\n                       '</div>')($rootScope);\n\n    $rootScope.$apply(function() {\n      $rootScope.col = {};\n      $rootScope.items = [\n        { text: 'Your age is incorrect', name: 'age' },\n        { text: 'You\\'re too tall man!', name: 'height' },\n        { text: 'Your hair is too long', name: 'hair' }\n      ];\n    });\n\n    expect(messageChildren(element).length).toBe(0);\n    expect(trim(element.text())).toEqual('');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { hair: true };\n    });\n\n    expect(messageChildren(element).length).toBe(1);\n    expect(trim(element.text())).toEqual('Your hair is too long');\n\n    $rootScope.$apply(function() {\n      $rootScope.col = { age: true, hair: true};\n    });\n\n    expect(messageChildren(element).length).toBe(1);\n    expect(trim(element.text())).toEqual('Your age is incorrect');\n\n    $rootScope.$apply(function() {\n      // remove the age!\n      $rootScope.items.shift();\n    });\n\n    expect(messageChildren(element).length).toBe(1);\n    expect(trim(element.text())).toEqual('Your hair is too long');\n\n    $rootScope.$apply(function() {\n      // remove the hair!\n      $rootScope.items.length = 0;\n      $rootScope.col.primary = true;\n    });\n\n    expect(messageChildren(element).length).toBe(1);\n    expect(trim(element.text())).toEqual('Enter something');\n  }));\n\n\n  it('should be compatible with ngBind',\n    inject(function($rootScope, $compile) {\n\n    element = $compile('<div ng-messages=\"col\">' +\n                       '        <div ng-message=\"required\" ng-bind=\"errorMessages.required\"></div>' +\n                       '        <div ng-message=\"extra\" ng-bind=\"errorMessages.extra\"></div>' +\n                       '</div>')($rootScope);\n\n    $rootScope.$apply(function() {\n      $rootScope.col = {\n        required: true,\n        extra: true\n      };\n      $rootScope.errorMessages = {\n        required: 'Fill in the text field.',\n        extra: 'Extra error message.'\n      };\n    });\n\n    expect(messageChildren(element).length).toBe(1);\n    expect(trim(element.text())).toEqual('Fill in the text field.');\n\n    $rootScope.$apply(function() {\n      $rootScope.col.required = false;\n      $rootScope.col.extra = true;\n    });\n\n    expect(messageChildren(element).length).toBe(1);\n    expect(trim(element.text())).toEqual('Extra error message.');\n\n    $rootScope.$apply(function() {\n      $rootScope.errorMessages.extra = 'New error message.';\n    });\n\n    expect(messageChildren(element).length).toBe(1);\n    expect(trim(element.text())).toEqual('New error message.');\n  }));\n\n\n  // issue #12856\n  it('should only detach the message object that is associated with the message node being removed',\n    inject(function($rootScope, $compile, $animate) {\n\n    // We are going to spy on the `leave` method to give us control over\n    // when the element is actually removed\n    spyOn($animate, 'leave');\n\n    // Create a basic ng-messages set up\n    element = $compile('<div ng-messages=\"col\">' +\n                       '  <div ng-message=\"primary\">Enter something</div>' +\n                       '</div>')($rootScope);\n\n    // Trigger the message to be displayed\n    $rootScope.col = { primary: true };\n    $rootScope.$digest();\n    expect(messageChildren(element).length).toEqual(1);\n    var oldMessageNode = messageChildren(element)[0];\n\n    // Remove the message\n    $rootScope.col = { primary: undefined };\n    $rootScope.$digest();\n\n    // Since we have spied on the `leave` method, the message node is still in the DOM\n    expect($animate.leave).toHaveBeenCalledOnce();\n    var nodeToRemove = $animate.leave.calls.mostRecent().args[0][0];\n    expect(nodeToRemove).toBe(oldMessageNode);\n    $animate.leave.calls.reset();\n\n    // Add the message back in\n    $rootScope.col = { primary: true };\n    $rootScope.$digest();\n\n    // Simulate the animation completing on the node\n    jqLite(nodeToRemove).remove();\n\n    // We should not get another call to `leave`\n    expect($animate.leave).not.toHaveBeenCalled();\n\n    // There should only be the new message node\n    expect(messageChildren(element).length).toEqual(1);\n    var newMessageNode = messageChildren(element)[0];\n    expect(newMessageNode).not.toBe(oldMessageNode);\n  }));\n\n  it('should render animations when the active/inactive classes are added/removed', function() {\n    module('ngAnimate');\n    module('ngAnimateMock');\n    inject(function($rootScope, $compile, $animate) {\n      element = $compile('<div ng-messages=\"col\">' +\n                         '  <div ng-message=\"ready\">This message is ready</div>' +\n                         '</div>')($rootScope);\n\n      $rootScope.$apply(function() {\n        $rootScope.col = {};\n      });\n\n      var event = $animate.queue.pop();\n      expect(event.event).toBe('setClass');\n      expect(event.args[1]).toBe('ng-inactive');\n      expect(event.args[2]).toBe('ng-active');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = { ready: true };\n      });\n\n      event = $animate.queue.pop();\n      expect(event.event).toBe('setClass');\n      expect(event.args[1]).toBe('ng-active');\n      expect(event.args[2]).toBe('ng-inactive');\n    });\n  });\n\n  describe('ngMessage nested nested inside elements', function() {\n\n    it('should not crash or leak memory when the messages are transcluded, the first message is ' +\n      'visible, and ngMessages is removed by ngIf', function() {\n\n      module(function($compileProvider) {\n        $compileProvider.directive('messageWrap', function() {\n          return {\n            transclude: true,\n            scope: {\n              col: '=col'\n            },\n            template: '<div ng-messages=\"col\"><ng-transclude></ng-transclude></div>'\n          };\n        });\n      });\n\n      inject(function($rootScope, $compile) {\n\n        element = $compile('<div><div ng-if=\"show\"><div message-wrap col=\"col\">' +\n                           '        <div ng-message=\"a\">A</div>' +\n                           '        <div ng-message=\"b\">B</div>' +\n                           '</div></div></div>')($rootScope);\n\n        $rootScope.$apply(function() {\n          $rootScope.show = true;\n          $rootScope.col = {\n            a: true,\n            b: true\n          };\n        });\n\n        expect(messageChildren(element).length).toBe(1);\n        expect(trim(element.text())).toEqual('A');\n\n        $rootScope.$apply('show = false');\n\n        expect(messageChildren(element).length).toBe(0);\n      });\n    });\n\n\n    it('should not crash when the first of two nested messages is removed', function() {\n      inject(function($rootScope, $compile) {\n\n        element = $compile(\n          '<div ng-messages=\"col\">' +\n            '<div class=\"wrapper\">' +\n              '<div remove-me ng-message=\"a\">A</div>' +\n              '<div ng-message=\"b\">B</div>' +\n            '</div>' +\n          '</div>'\n        )($rootScope);\n\n        $rootScope.$apply(function() {\n          $rootScope.col = {\n            a: true,\n            b: false\n          };\n        });\n\n        expect(messageChildren(element).length).toBe(1);\n        expect(trim(element.text())).toEqual('A');\n\n        var ctrl = element.controller('ngMessages');\n        var deregisterSpy = spyOn(ctrl, 'deregister').and.callThrough();\n\n        var nodeA = element[0].querySelector('[ng-message=\"a\"]');\n        jqLite(nodeA).remove();\n        $rootScope.$digest(); // The next digest triggers the error\n\n        // Make sure removing the element triggers the deregistration in ngMessages\n        expect(trim(deregisterSpy.calls.mostRecent().args[0].nodeValue)).toBe('ngMessage: a');\n        expect(messageChildren(element).length).toBe(0);\n      });\n    });\n\n\n    it('should not crash, but show deeply nested messages correctly after a message ' +\n      'has been removed', function() {\n      inject(function($rootScope, $compile) {\n\n        element = $compile(\n          '<div ng-messages=\"col\" ng-messages-multiple>' +\n            '<div class=\"another-wrapper\">' +\n              '<div ng-message=\"a\">A</div>' +\n              '<div class=\"wrapper\">' +\n                '<div ng-message=\"b\">B</div>' +\n                '<div ng-message=\"c\">C</div>' +\n              '</div>' +\n              '<div ng-message=\"d\">D</div>' +\n            '</div>' +\n          '</div>'\n        )($rootScope);\n\n        $rootScope.$apply(function() {\n          $rootScope.col = {\n            a: true,\n            b: true\n          };\n        });\n\n        expect(messageChildren(element).length).toBe(2);\n        expect(trim(element.text())).toEqual('AB');\n\n        var ctrl = element.controller('ngMessages');\n        var deregisterSpy = spyOn(ctrl, 'deregister').and.callThrough();\n\n        var nodeB = element[0].querySelector('[ng-message=\"b\"]');\n        jqLite(nodeB).remove();\n        $rootScope.$digest(); // The next digest triggers the error\n\n        // Make sure removing the element triggers the deregistration in ngMessages\n        expect(trim(deregisterSpy.calls.mostRecent().args[0].nodeValue)).toBe('ngMessage: b');\n        expect(messageChildren(element).length).toBe(1);\n        expect(trim(element.text())).toEqual('A');\n      });\n    });\n  });\n\n\n  it('should clean-up the ngMessage scope when a message is removed',\n    inject(function($compile, $rootScope) {\n\n      var html =\n          '<div ng-messages=\"items\">' +\n            '<div ng-message=\"a\">{{forA}}</div>' +\n          '</div>';\n\n      element = $compile(html)($rootScope);\n      $rootScope.$apply(function() {\n        $rootScope.forA = 'A';\n        $rootScope.items = {a: true};\n      });\n\n      expect(element.text()).toBe('A');\n      var watchers = $rootScope.$countWatchers();\n\n      $rootScope.$apply('items.a = false');\n\n      expect(element.text()).toBe('');\n      // We don't know exactly how many watchers are on the scope, only that there should be\n      // one less now\n      expect($rootScope.$countWatchers()).toBe(watchers - 1);\n    })\n  );\n\n  it('should unregister the ngMessage even if it was never attached',\n    inject(function($compile, $rootScope) {\n      var html =\n        '<div ng-messages=\"items\">' +\n          '<div ng-if=\"show\"><div ng-message=\"x\">ERROR</div></div>' +\n        '</div>';\n\n      element = $compile(html)($rootScope);\n\n      var ctrl = element.controller('ngMessages');\n\n      expect(messageChildren(element).length).toBe(0);\n      expect(Object.keys(ctrl.messages).length).toEqual(0);\n\n      $rootScope.$apply('show = true');\n      expect(messageChildren(element).length).toBe(0);\n      expect(Object.keys(ctrl.messages).length).toEqual(1);\n\n      $rootScope.$apply('show = false');\n      expect(messageChildren(element).length).toBe(0);\n      expect(Object.keys(ctrl.messages).length).toEqual(0);\n    })\n  );\n\n\n  describe('default message', function() {\n    it('should render a default message when no message matches', inject(function($rootScope, $compile) {\n      element = $compile('<div ng-messages=\"col\">' +\n                         '  <div ng-message=\"val\">Message is set</div>' +\n                         '  <div ng-message-default>Default message is set</div>' +\n                         '</div>')($rootScope);\n      $rootScope.$apply(function() {\n        $rootScope.col = { unexpected: false };\n      });\n\n      $rootScope.$digest();\n\n      expect(element.text().trim()).toBe('');\n      expect(element).not.toHaveClass('ng-active');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = { unexpected: true };\n      });\n\n      expect(element.text().trim()).toBe('Default message is set');\n      expect(element).toHaveClass('ng-active');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = { unexpected: false };\n      });\n\n      expect(element.text().trim()).toBe('');\n      expect(element).not.toHaveClass('ng-active');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = { val: true, unexpected: true };\n      });\n\n      expect(element.text().trim()).toBe('Message is set');\n      expect(element).toHaveClass('ng-active');\n    }));\n\n    it('should not render a default message with ng-messages-multiple if another error matches',\n      inject(function($rootScope, $compile) {\n        element = $compile('<div ng-messages=\"col\" ng-messages-multiple>' +\n                           '  <div ng-message=\"val\">Message is set</div>' +\n                           '  <div ng-message=\"other\">Other message is set</div>' +\n                           '  <div ng-message-default>Default message is set</div>' +\n                           '</div>')($rootScope);\n\n        expect(element.text().trim()).toBe('');\n\n        $rootScope.$apply(function() {\n          $rootScope.col = { val: true, other: false, unexpected: false };\n        });\n\n        expect(element.text().trim()).toBe('Message is set');\n\n        $rootScope.$apply(function() {\n          $rootScope.col = { val: true, other: true, unexpected: true };\n        });\n\n        expect(element.text().trim()).toBe('Message is set  Other message is set');\n\n        $rootScope.$apply(function() {\n          $rootScope.col = { val: false, other: false, unexpected: true };\n        });\n\n        expect(element.text().trim()).toBe('Default message is set');\n      })\n    );\n\n    it('should handle a default message with ngIf', inject(function($rootScope, $compile) {\n      element = $compile('<div ng-messages=\"col\">' +\n                         '  <div ng-message=\"val\">Message is set</div>' +\n                         '  <div ng-if=\"default\" ng-message-default>Default message is set</div>' +\n                         '</div>')($rootScope);\n      $rootScope.default = true;\n      $rootScope.col = {unexpected: true};\n      $rootScope.$digest();\n\n      expect(element.text().trim()).toBe('Default message is set');\n\n      $rootScope.$apply('default = false');\n\n      expect(element.text().trim()).toBe('');\n\n      $rootScope.$apply('default = true');\n\n      expect(element.text().trim()).toBe('Default message is set');\n\n      $rootScope.$apply(function() {\n        $rootScope.col = { val: true };\n      });\n\n      expect(element.text().trim()).toBe('Message is set');\n    }));\n  });\n\n  describe('when including templates', function() {\n    they('should work with a dynamic collection model which is managed by ngRepeat',\n      {'<div ng-messages-include=\"...\">': '<div ng-messages=\"item\">' +\n                                            '<div ng-messages-include=\"abc.html\"></div>' +\n                                          '</div>',\n       '<ng-messages-include src=\"...\">': '<ng-messages for=\"item\">' +\n                                            '<ng-messages-include src=\"abc.html\"></ng-messages-include>' +\n                                          '</ng-messages>'},\n    function(html) {\n      inject(function($compile, $rootScope, $templateCache) {\n        $templateCache.put('abc.html', '<div ng-message=\"a\">A</div>' +\n                                       '<div ng-message=\"b\">B</div>' +\n                                       '<div ng-message=\"c\">C</div>');\n\n        html = '<div><div ng-repeat=\"item in items\">' + html + '</div></div>';\n        $rootScope.items = [{},{},{}];\n\n        element = $compile(html)($rootScope);\n        $rootScope.$apply(function() {\n          $rootScope.items[0].a = true;\n          $rootScope.items[1].b = true;\n          $rootScope.items[2].c = true;\n        });\n\n        var elements = element[0].querySelectorAll('[ng-repeat]');\n\n        // all three collections should have at least one error showing up\n        expect(messageChildren(element).length).toBe(3);\n        expect(messageChildren(elements[0]).length).toBe(1);\n        expect(messageChildren(elements[1]).length).toBe(1);\n        expect(messageChildren(elements[2]).length).toBe(1);\n\n        // this is the standard order of the displayed error messages\n        expect(element.text().trim()).toBe('ABC');\n\n        $rootScope.$apply(function() {\n          $rootScope.items[0].a = false;\n          $rootScope.items[0].c = true;\n\n          $rootScope.items[1].b = false;\n\n          $rootScope.items[2].c = false;\n          $rootScope.items[2].a = true;\n        });\n\n        // with the 2nd item gone and the values changed\n        // we should see both 1 and 3 changed\n        expect(element.text().trim()).toBe('CA');\n\n        $rootScope.$apply(function() {\n          // add the value for the 2nd item back\n          $rootScope.items[1].b = true;\n          $rootScope.items.reverse();\n        });\n\n        // when reversed we get back to our original value\n        expect(element.text().trim()).toBe('ABC');\n      });\n    });\n\n    they('should remove the $prop element and place a comment anchor node where it used to be',\n      {'<div ng-messages-include=\"...\">': '<div ng-messages=\"data\">' +\n                                            '<div ng-messages-include=\"abc.html\"></div>' +\n                                          '</div>',\n       '<ng-messages-include src=\"...\">': '<ng-messages for=\"data\">' +\n                                            '<ng-messages-include src=\"abc.html\"></ng-messages-include>' +\n                                          '</ng-messages>'},\n    function(html) {\n      inject(function($compile, $rootScope, $templateCache) {\n        $templateCache.put('abc.html', '<div></div>');\n\n        element = $compile(html)($rootScope);\n        $rootScope.$digest();\n\n        var includeElement = element[0].querySelector('[ng-messages-include], ng-messages-include');\n        expect(includeElement).toBeFalsy();\n\n        var comment = element[0].childNodes[0];\n        expect(comment.nodeType).toBe(8);\n        expect(comment.nodeValue).toBe(' ngMessagesInclude: abc.html ');\n      });\n    });\n\n    they('should load a remote template using $prop',\n      {'<div ng-messages-include=\"...\">': '<div ng-messages=\"data\">' +\n                                            '<div ng-messages-include=\"abc.html\"></div>' +\n                                          '</div>',\n       '<ng-messages-include src=\"...\">': '<ng-messages for=\"data\">' +\n                                            '<ng-messages-include src=\"abc.html\"></ng-messages-include>' +\n                                          '</ng-messages>'},\n    function(html) {\n      inject(function($compile, $rootScope, $templateCache) {\n        $templateCache.put('abc.html', '<div ng-message=\"a\">A</div>' +\n                                       '<div ng-message=\"b\">B</div>' +\n                                       '<div ng-message=\"c\">C</div>');\n\n        element = $compile(html)($rootScope);\n        $rootScope.$apply(function() {\n          $rootScope.data = {\n            'a': 1,\n            'b': 2,\n            'c': 3\n          };\n        });\n\n        expect(messageChildren(element).length).toBe(1);\n        expect(trim(element.text())).toEqual('A');\n\n        $rootScope.$apply(function() {\n          $rootScope.data = {\n            'c': 3\n          };\n        });\n\n        expect(messageChildren(element).length).toBe(1);\n        expect(trim(element.text())).toEqual('C');\n      });\n    });\n\n    it('should cache the template after download',\n      inject(function($rootScope, $compile, $templateCache, $httpBackend) {\n\n      $httpBackend.expect('GET', 'tpl').respond(201, '<div>abc</div>');\n\n      expect($templateCache.get('tpl')).toBeUndefined();\n\n      element = $compile('<div ng-messages=\"data\"><div ng-messages-include=\"tpl\"></div></div>')($rootScope);\n\n      $rootScope.$digest();\n      $httpBackend.flush();\n\n      expect($templateCache.get('tpl')).toBeDefined();\n    }));\n\n    it('should re-render the messages after download without an extra digest',\n      inject(function($rootScope, $compile, $httpBackend) {\n\n      $httpBackend.expect('GET', 'my-messages').respond(201,\n        '<div ng-message=\"required\">You did not enter a value</div>');\n\n      element = $compile('<div ng-messages=\"data\">' +\n                         '  <div ng-messages-include=\"my-messages\"></div>' +\n                         '  <div ng-message=\"failed\">Your value is that of failure</div>' +\n                         '</div>')($rootScope);\n\n      $rootScope.data = {\n        required: true,\n        failed: true\n      };\n\n      $rootScope.$digest();\n\n      expect(messageChildren(element).length).toBe(1);\n      expect(trim(element.text())).toEqual('Your value is that of failure');\n\n      $httpBackend.flush();\n      $rootScope.$digest();\n\n      expect(messageChildren(element).length).toBe(1);\n      expect(trim(element.text())).toEqual('You did not enter a value');\n    }));\n\n    it('should allow for overriding the remote template messages within the element depending on where the remote template is placed',\n      inject(function($compile, $rootScope, $templateCache) {\n\n      $templateCache.put('abc.html', '<div ng-message=\"a\">A</div>' +\n                                     '<div ng-message=\"b\">B</div>' +\n                                     '<div ng-message=\"c\">C</div>');\n\n      element = $compile('<div ng-messages=\"data\">' +\n                         '  <div ng-message=\"a\">AAA</div>' +\n                         '  <div ng-messages-include=\"abc.html\"></div>' +\n                         '  <div ng-message=\"c\">CCC</div>' +\n                         '</div>')($rootScope);\n\n      $rootScope.$apply(function() {\n        $rootScope.data = {\n          'a': 1,\n          'b': 2,\n          'c': 3\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(1);\n      expect(trim(element.text())).toEqual('AAA');\n\n      $rootScope.$apply(function() {\n        $rootScope.data = {\n          'b': 2,\n          'c': 3\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(1);\n      expect(trim(element.text())).toEqual('B');\n\n      $rootScope.$apply(function() {\n        $rootScope.data = {\n          'c': 3\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(1);\n      expect(trim(element.text())).toEqual('C');\n    }));\n\n    it('should properly detect a previous message, even if it was registered later',\n      inject(function($compile, $rootScope, $templateCache) {\n        $templateCache.put('include.html', '<div ng-message=\"a\">A</div>');\n        var html =\n            '<div ng-messages=\"items\">' +\n              '<div ng-include=\"\\'include.html\\'\"></div>' +\n              '<div ng-message=\"b\">B</div>' +\n              '<div ng-message=\"c\">C</div>' +\n            '</div>';\n\n        element = $compile(html)($rootScope);\n        $rootScope.$apply('items = {b: true, c: true}');\n\n        expect(element.text()).toBe('B');\n\n        var ctrl = element.controller('ngMessages');\n        var deregisterSpy = spyOn(ctrl, 'deregister').and.callThrough();\n\n        var nodeB = element[0].querySelector('[ng-message=\"b\"]');\n        jqLite(nodeB).remove();\n\n        // Make sure removing the element triggers the deregistration in ngMessages\n        expect(trim(deregisterSpy.calls.mostRecent().args[0].nodeValue)).toBe('ngMessage: b');\n\n        $rootScope.$apply('items.a = true');\n\n        expect(element.text()).toBe('A');\n      })\n    );\n\n    it('should not throw if scope has been destroyed when template request is ready',\n      inject(function($rootScope, $httpBackend, $compile) {\n        $httpBackend.expectGET('messages.html').respond('<div ng-message=\"a\">A</div>');\n        $rootScope.show = true;\n        var html =\n            '<div ng-if=\"show\">' +\n              '<div ng-messages=\"items\">' +\n                '<div ng-messages-include=\"messages.html\"></div>' +\n              '</div>' +\n            '</div>';\n\n        element = $compile(html)($rootScope);\n        $rootScope.$digest();\n        $rootScope.show = false;\n        $rootScope.$digest();\n        expect(function() {\n          $httpBackend.flush();\n        }).not.toThrow();\n    }));\n\n    it('should not throw if the template is empty',\n      inject(function($compile, $rootScope, $templateCache) {\n        var html =\n            '<div ng-messages=\"items\">' +\n              '<div ng-messages-include=\"messages1.html\"></div>' +\n              '<div ng-messages-include=\"messages2.html\"></div>' +\n            '</div>';\n\n        $templateCache.put('messages1.html', '');\n        $templateCache.put('messages2.html', '   ');\n        element = $compile(html)($rootScope);\n        $rootScope.$digest();\n\n        expect(element.text()).toBe('');\n        expect(element.children().length).toBe(0);\n        expect(element.contents().length).toBe(2);\n      })\n    );\n  });\n\n  describe('when multiple', function() {\n    they('should show all truthy messages when the $prop attr is present',\n      { 'multiple': 'multiple',\n        'ng-messages-multiple': 'ng-messages-multiple' },\n    function(prop) {\n      inject(function($rootScope, $compile) {\n        element = $compile('<div ng-messages=\"data\" ' + prop + '>' +\n                           '  <div ng-message=\"one\">1</div>' +\n                           '  <div ng-message=\"two\">2</div>' +\n                           '  <div ng-message=\"three\">3</div>' +\n                           '</div>')($rootScope);\n\n        $rootScope.$apply(function() {\n          $rootScope.data = {\n            'one': true,\n            'two': false,\n            'three': true\n          };\n        });\n\n        expect(messageChildren(element).length).toBe(2);\n        expect(s(element.text())).toContain('13');\n      });\n    });\n\n    it('should render all truthy messages from a remote template',\n      inject(function($rootScope, $compile, $templateCache) {\n\n      $templateCache.put('xyz.html', '<div ng-message=\"x\">X</div>' +\n                                     '<div ng-message=\"y\">Y</div>' +\n                                     '<div ng-message=\"z\">Z</div>');\n\n      element = $compile('<div ng-messages=\"data\" ng-messages-multiple=\"true\">' +\n                           '<div ng-messages-include=\"xyz.html\"></div>' +\n                         '</div>')($rootScope);\n\n      $rootScope.$apply(function() {\n        $rootScope.data = {\n          'x': 'a',\n          'y': null,\n          'z': true\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(2);\n      expect(s(element.text())).toEqual('XZ');\n\n      $rootScope.$apply(function() {\n        $rootScope.data.y = {};\n      });\n\n      expect(messageChildren(element).length).toBe(3);\n      expect(s(element.text())).toEqual('XYZ');\n    }));\n\n    it('should render and override all truthy messages from a remote template',\n      inject(function($rootScope, $compile, $templateCache) {\n\n      $templateCache.put('xyz.html', '<div ng-message=\"x\">X</div>' +\n                                     '<div ng-message=\"y\">Y</div>' +\n                                     '<div ng-message=\"z\">Z</div>');\n\n      element = $compile('<div ng-messages=\"data\" ng-messages-multiple=\"true\">' +\n                            '<div ng-message=\"y\">YYY</div>' +\n                            '<div ng-message=\"z\">ZZZ</div>' +\n                            '<div ng-messages-include=\"xyz.html\"></div>' +\n                         '</div>')($rootScope);\n\n      $rootScope.$apply(function() {\n        $rootScope.data = {\n          'x': 'a',\n          'y': null,\n          'z': true\n        };\n      });\n\n      expect(messageChildren(element).length).toBe(2);\n      expect(s(element.text())).toEqual('ZZZX');\n\n      $rootScope.$apply(function() {\n        $rootScope.data.y = {};\n      });\n\n      expect(messageChildren(element).length).toBe(3);\n      expect(s(element.text())).toEqual('YYYZZZX');\n    }));\n  });\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-resource.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\nvar $resourceMinErr = angular.$$minErr('$resource');\n\n// Helper functions and regex to lookup a dotted path on an object\n// stopping at undefined/null.  The path must be composed of ASCII\n// identifiers (just like $parse)\nvar MEMBER_NAME_REGEX = /^(\\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;\n\nfunction isValidDottedPath(path) {\n  return (path != null && path !== '' && path !== 'hasOwnProperty' &&\n      MEMBER_NAME_REGEX.test('.' + path));\n}\n\nfunction lookupDottedPath(obj, path) {\n  if (!isValidDottedPath(path)) {\n    throw $resourceMinErr('badmember', 'Dotted member path \"@{0}\" is invalid.', path);\n  }\n  var keys = path.split('.');\n  for (var i = 0, ii = keys.length; i < ii && angular.isDefined(obj); i++) {\n    var key = keys[i];\n    obj = (obj !== null) ? obj[key] : undefined;\n  }\n  return obj;\n}\n\n/**\n * Create a shallow copy of an object and clear other fields from the destination\n */\nfunction shallowClearAndCopy(src, dst) {\n  dst = dst || {};\n\n  angular.forEach(dst, function(value, key) {\n    delete dst[key];\n  });\n\n  for (var key in src) {\n    if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n      dst[key] = src[key];\n    }\n  }\n\n  return dst;\n}\n\n/**\n * @ngdoc module\n * @name ngResource\n * @description\n *\n * The `ngResource` module provides interaction support with RESTful services\n * via the $resource service.\n *\n * See {@link ngResource.$resourceProvider} and {@link ngResource.$resource} for usage.\n */\n\n/**\n * @ngdoc provider\n * @name $resourceProvider\n *\n * @description\n *\n * Use `$resourceProvider` to change the default behavior of the {@link ngResource.$resource}\n * service.\n *\n * ## Dependencies\n * Requires the {@link ngResource } module to be installed.\n *\n */\n\n/**\n * @ngdoc service\n * @name $resource\n * @requires $http\n * @requires ng.$log\n * @requires $q\n * @requires ng.$timeout\n *\n * @description\n * A factory which creates a resource object that lets you interact with\n * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.\n *\n * The returned resource object has action methods which provide high-level behaviors without\n * the need to interact with the low level {@link ng.$http $http} service.\n *\n * Requires the {@link ngResource `ngResource`} module to be installed.\n *\n * By default, trailing slashes will be stripped from the calculated URLs,\n * which can pose problems with server backends that do not expect that\n * behavior.  This can be disabled by configuring the `$resourceProvider` like\n * this:\n *\n * ```js\n     app.config(['$resourceProvider', function($resourceProvider) {\n       // Don't strip trailing slashes from calculated URLs\n       $resourceProvider.defaults.stripTrailingSlashes = false;\n     }]);\n * ```\n *\n * @param {string} url A parameterized URL template with parameters prefixed by `:` as in\n *   `/user/:username`. If you are using a URL with a port number (e.g.\n *   `http://example.com:8080/api`), it will be respected.\n *\n *   If you are using a url with a suffix, just add the suffix, like this:\n *   `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`\n *   or even `$resource('http://example.com/resource/:resource_id.:format')`\n *   If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be\n *   collapsed down to a single `.`.  If you need this sequence to appear and not collapse then you\n *   can escape it with `/\\.`.\n *\n * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in\n *   `actions` methods. If a parameter value is a function, it will be called every time\n *   a param value needs to be obtained for a request (unless the param was overridden). The\n *   function will be passed the current data value as an argument.\n *\n *   Each key value in the parameter object is first bound to url template if present and then any\n *   excess keys are appended to the url search query after the `?`.\n *\n *   Given a template `/path/:verb` and parameter `{verb: 'greet', salutation: 'Hello'}` results in\n *   URL `/path/greet?salutation=Hello`.\n *\n *   If the parameter value is prefixed with `@`, then the value for that parameter will be\n *   extracted from the corresponding property on the `data` object (provided when calling actions\n *   with a request body).\n *   For example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of\n *   `someParam` will be `data.someProp`.\n *   Note that the parameter will be ignored, when calling a \"GET\" action method (i.e. an action\n *   method that does not accept a request body).\n *\n * @param {Object.<Object>=} actions Hash with declaration of custom actions that will be available\n *   in addition to the default set of resource actions (see below). If a custom action has the same\n *   key as a default action (e.g. `save`), then the default action will be *overwritten*, and not\n *   extended.\n *\n *   The declaration should be created in the format of {@link ng.$http#usage $http.config}:\n *\n *       {\n *         action1: {method:?, params:?, isArray:?, headers:?, ...},\n *         action2: {method:?, params:?, isArray:?, headers:?, ...},\n *         ...\n *       }\n *\n *   Where:\n *\n *   - **`action`** – {string} – The name of action. This name becomes the name of the method on\n *     your resource object.\n *   - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,\n *     `DELETE`, `JSONP`, etc).\n *   - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of\n *     the parameter value is a function, it will be called every time when a param value needs to\n *     be obtained for a request (unless the param was overridden). The function will be passed the\n *     current data value as an argument.\n *   - **`url`** – {string} – Action specific `url` override. The url templating is supported just\n *     like for the resource-level urls.\n *   - **`isArray`** – {boolean=} – If true then the returned object for this action is an array,\n *     see `returns` section.\n *   - **`transformRequest`** –\n *     `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n *     Transform function or an array of such functions. The transform function takes the http\n *     request body and headers and returns its transformed (typically serialized) version.\n *     By default, transformRequest will contain one function that checks if the request data is\n *     an object and serializes it using `angular.toJson`. To prevent this behavior, set\n *     `transformRequest` to an empty array: `transformRequest: []`\n *   - **`transformResponse`** –\n *     `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –\n *     Transform function or an array of such functions. The transform function takes the HTTP\n *     response body, headers and status and returns its transformed (typically deserialized)\n *     version.\n *     By default, transformResponse will contain one function that checks if the response looks\n *     like a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior,\n *     set `transformResponse` to an empty array: `transformResponse: []`\n *   - **`cache`** – `{boolean|Cache}` – A boolean value or object created with\n *     {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response.\n *     See {@link $http#caching $http Caching} for more information.\n *   - **`timeout`** – `{number}` – Timeout in milliseconds.<br />\n *     **Note:** In contrast to {@link ng.$http#usage $http.config}, {@link ng.$q promises} are\n *     **not** supported in `$resource`, because the same value would be used for multiple requests.\n *     If you are looking for a way to cancel requests, you should use the `cancellable` option.\n *   - **`cancellable`** – `{boolean}` – If true, the request made by a \"non-instance\" call will be\n *     cancelled (if not already completed) by calling `$cancelRequest()` on the call's return\n *     value. Calling `$cancelRequest()` for a non-cancellable or an already completed/cancelled\n *     request will have no effect.\n *   - **`withCredentials`** – `{boolean}` – Whether to set the `withCredentials` flag on the\n *     XHR object. See\n *     [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials)\n *     for more information.\n *   - **`responseType`** – `{string}` – See\n *     [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType).\n *   - **`interceptor`** – `{Object=}` – The interceptor object has four optional methods -\n *     `request`, `requestError`, `response`, and `responseError`. See\n *     {@link ng.$http#interceptors $http interceptors} for details. Note that\n *     `request`/`requestError` interceptors are applied before calling `$http`, thus before any\n *     global `$http` interceptors. Also, rejecting or throwing an error inside the `request`\n *     interceptor will result in calling the `responseError` interceptor.\n *     The resource instance or collection is available on the `resource` property of the\n *     `http response` object passed to `response`/`responseError` interceptors.\n *     Keep in mind that the associated promise will be resolved with the value returned by the\n *     response interceptors. Make sure you return an appropriate value and not the `response`\n *     object passed as input. For reference, the default `response` interceptor (which gets applied\n *     if you don't specify a custom one) returns `response.resource`.<br />\n *     See {@link ngResource.$resource#using-interceptors below} for an example of using\n *     interceptors in `$resource`.\n *   - **`hasBody`** – `{boolean}` – If true, then the request will have a body.\n *     If not specified, then only POST, PUT and PATCH requests will have a body. *\n * @param {Object} options Hash with custom settings that should extend the\n *   default `$resourceProvider` behavior.  The supported options are:\n *\n *   - **`stripTrailingSlashes`** – {boolean} – If true then the trailing\n *   slashes from any calculated URL will be stripped. (Defaults to true.)\n *   - **`cancellable`** – {boolean} – If true, the request made by a \"non-instance\" call will be\n *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return value.\n *   This can be overwritten per action. (Defaults to false.)\n *\n * @returns {Object} A resource \"class\" object with methods for the default set of resource actions\n *   optionally extended with custom `actions`. The default set contains these actions:\n *   ```js\n *   {\n *     'get':    {method: 'GET'},\n *     'save':   {method: 'POST'},\n *     'query':  {method: 'GET', isArray: true},\n *     'remove': {method: 'DELETE'},\n *     'delete': {method: 'DELETE'}\n *   }\n *   ```\n *\n *   Calling these methods invoke {@link ng.$http} with the specified http method, destination and\n *   parameters. When the data is returned from the server then the object is an instance of the\n *   resource class. The actions `save`, `remove` and `delete` are available on it as methods with\n *   the `$` prefix. This allows you to easily perform CRUD operations (create, read, update,\n *   delete) on server-side data like this:\n *   ```js\n *   var User = $resource('/user/:userId', {userId: '@id'});\n *   User.get({userId: 123}).$promise.then(function(user) {\n *     user.abc = true;\n *     user.$save();\n *   });\n *   ```\n *\n *   It is important to realize that invoking a `$resource` object method immediately returns an\n *   empty reference (object or array depending on `isArray`). Once the data is returned from the\n *   server the existing reference is populated with the actual data. This is a useful trick since\n *   usually the resource is assigned to a model which is then rendered by the view. Having an empty\n *   object results in no rendering, once the data arrives from the server then the object is\n *   populated with the data and the view automatically re-renders itself showing the new data. This\n *   means that in most cases one never has to write a callback function for the action methods.\n *\n *   The action methods on the class object or instance object can be invoked with the following\n *   parameters:\n *\n *   - \"class\" actions without a body: `Resource.action([parameters], [success], [error])`\n *   - \"class\" actions with a body: `Resource.action([parameters], postData, [success], [error])`\n *   - instance actions: `instance.$action([parameters], [success], [error])`\n *\n *\n *   When calling instance methods, the instance itself is used as the request body (if the action\n *   should have a body). By default, only actions using `POST`, `PUT` or `PATCH` have request\n *   bodies, but you can use the `hasBody` configuration option to specify whether an action\n *   should have a body or not (regardless of its HTTP method).\n *\n *\n *   Success callback is called with (value (Object|Array), responseHeaders (Function),\n *   status (number), statusText (string)) arguments, where `value` is the populated resource\n *   instance or collection object. The error callback is called with (httpResponse) argument.\n *\n *   Class actions return an empty instance (with the additional properties listed below).\n *   Instance actions return a promise for the operation.\n *\n *   The Resource instances and collections have these additional properties:\n *\n *   - `$promise`: The {@link ng.$q promise} of the original server interaction that created this\n *     instance or collection.\n *\n *     On success, the promise is resolved with the same resource instance or collection object,\n *     updated with data from server. This makes it easy to use in the\n *     {@link ngRoute.$routeProvider `resolve` section of `$routeProvider.when()`} to defer view\n *     rendering until the resource(s) are loaded.\n *\n *     On failure, the promise is rejected with the {@link ng.$http http response} object.\n *\n *     If an interceptor object was provided, the promise will instead be resolved with the value\n *     returned by the response interceptor (on success) or responceError interceptor (on failure).\n *\n *   - `$resolved`: `true` after first server interaction is completed (either with success or\n *      rejection), `false` before that. Knowing if the Resource has been resolved is useful in\n *      data-binding. If there is a response/responseError interceptor and it returns a promise,\n *      `$resolved` will wait for that too.\n *\n *   The Resource instances and collections have these additional methods:\n *\n *   - `$cancelRequest`: If there is a cancellable, pending request related to the instance or\n *      collection, calling this method will abort the request.\n *\n *   The Resource instances have these additional methods:\n *\n *   - `toJSON`: It returns a simple object without any of the extra properties added as part of\n *     the Resource API. This object can be serialized through {@link angular.toJson} safely\n *     without attaching AngularJS-specific fields. Notice that `JSON.stringify` (and\n *     `angular.toJson`) automatically use this method when serializing a Resource instance\n *     (see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON%28%29_behavior)).\n *\n * @example\n *\n * ### Basic usage\n *\n   ```js\n     // Define a CreditCard class\n     var CreditCard = $resource('/users/:userId/cards/:cardId',\n       {userId: 123, cardId: '@id'}, {\n         charge: {method: 'POST', params: {charge: true}}\n       });\n\n     // We can retrieve a collection from the server\n     var cards = CreditCard.query();\n         // GET: /users/123/cards\n         // server returns: [{id: 456, number: '1234', name: 'Smith'}]\n\n     // Wait for the request to complete\n     cards.$promise.then(function() {\n       var card = cards[0];\n\n       // Each item is an instance of CreditCard\n       expect(card instanceof CreditCard).toEqual(true);\n\n       // Non-GET methods are mapped onto the instances\n       card.name = 'J. Smith';\n       card.$save();\n           // POST: /users/123/cards/456 {id: 456, number: '1234', name: 'J. Smith'}\n           // server returns: {id: 456, number: '1234', name: 'J. Smith'}\n\n       // Our custom method is mapped as well (since it uses POST)\n       card.$charge({amount: 9.99});\n           // POST: /users/123/cards/456?amount=9.99&charge=true {id: 456, number: '1234', name: 'J. Smith'}\n     });\n\n     // We can create an instance as well\n     var newCard = new CreditCard({number: '0123'});\n     newCard.name = 'Mike Smith';\n\n     var savePromise = newCard.$save();\n         // POST: /users/123/cards {number: '0123', name: 'Mike Smith'}\n         // server returns: {id: 789, number: '0123', name: 'Mike Smith'}\n\n     savePromise.then(function() {\n       // Once the promise is resolved, the created instance\n       // is populated with the data returned by the server\n       expect(newCard.id).toEqual(789);\n     });\n   ```\n *\n * The object returned from a call to `$resource` is a resource \"class\" which has one \"static\"\n * method for each action in the definition.\n *\n * Calling these methods invokes `$http` on the `url` template with the given HTTP `method`,\n * `params` and `headers`.\n *\n * @example\n *\n * ### Accessing the response\n *\n * When the data is returned from the server then the object is an instance of the resource type and\n * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD\n * operations (create, read, update, delete) on server-side data.\n *\n   ```js\n     var User = $resource('/users/:userId', {userId: '@id'});\n     User.get({userId: 123}).$promise.then(function(user) {\n       user.abc = true;\n       user.$save();\n     });\n   ```\n *\n * It's worth noting that the success callback for `get`, `query` and other methods gets called with\n * the resource instance (populated with the data that came from the server) as well as an `$http`\n * header getter function, the HTTP status code and the response status text. So one could rewrite\n * the above example and get access to HTTP headers as follows:\n *\n   ```js\n     var User = $resource('/users/:userId', {userId: '@id'});\n     User.get({userId: 123}, function(user, getResponseHeaders) {\n       user.abc = true;\n       user.$save(function(user, putResponseHeaders) {\n         // `user` => saved `User` object\n         // `putResponseHeaders` => `$http` header getter\n       });\n     });\n   ```\n *\n * @example\n *\n * ### Creating custom actions\n *\n * In this example we create a custom method on our resource to make a PUT request:\n *\n   ```js\n      var app = angular.module('app', ['ngResource']);\n\n      // Some APIs expect a PUT request in the format URL/object/ID\n      // Here we are creating an 'update' method\n      app.factory('Notes', ['$resource', function($resource) {\n        return $resource('/notes/:id', {id: '@id'}, {\n          update: {method: 'PUT'}\n        });\n      }]);\n\n      // In our controller we get the ID from the URL using `$location`\n      app.controller('NotesCtrl', ['$location', 'Notes', function($location, Notes) {\n        // First, retrieve the corresponding `Note` object from the server\n        // (Assuming a URL of the form `.../notes?id=XYZ`)\n        var noteId = $location.search().id;\n        var note = Notes.get({id: noteId});\n\n        note.$promise.then(function() {\n          note.content = 'Hello, world!';\n\n          // Now call `update` to save the changes on the server\n          Notes.update(note);\n              // This will PUT /notes/ID with the note object as the request payload\n\n          // Since `update` is a non-GET method, it will also be available on the instance\n          // (prefixed with `$`), so we could replace the `Note.update()` call with:\n          //note.$update();\n        });\n      }]);\n   ```\n *\n * @example\n *\n * ### Cancelling requests\n *\n * If an action's configuration specifies that it is cancellable, you can cancel the request related\n * to an instance or collection (as long as it is a result of a \"non-instance\" call):\n *\n   ```js\n     // ...defining the `Hotel` resource...\n     var Hotel = $resource('/api/hotels/:id', {id: '@id'}, {\n       // Let's make the `query()` method cancellable\n       query: {method: 'get', isArray: true, cancellable: true}\n     });\n\n     // ...somewhere in the PlanVacationController...\n     ...\n     this.onDestinationChanged = function onDestinationChanged(destination) {\n       // We don't care about any pending request for hotels\n       // in a different destination any more\n       if (this.availableHotels) {\n         this.availableHotels.$cancelRequest();\n       }\n\n       // Let's query for hotels in `destination`\n       // (calls: /api/hotels?location=<destination>)\n       this.availableHotels = Hotel.query({location: destination});\n     };\n   ```\n *\n * @example\n *\n * ### Using interceptors\n *\n * You can use interceptors to transform the request or response, perform additional operations, and\n * modify the returned instance/collection. The following example, uses `request` and `response`\n * interceptors to augment the returned instance with additional info:\n *\n   ```js\n     var Thing = $resource('/api/things/:id', {id: '@id'}, {\n       save: {\n         method: 'POST',\n         interceptor: {\n           request: function(config) {\n             // Before the request is sent out, store a timestamp on the request config\n             config.requestTimestamp = Date.now();\n             return config;\n           },\n           response: function(response) {\n             // Get the instance from the response object\n             var instance = response.resource;\n\n             // Augment the instance with a custom `saveLatency` property, computed as the time\n             // between sending the request and receiving the response.\n             instance.saveLatency = Date.now() - response.config.requestTimestamp;\n\n             // Return the instance\n             return instance;\n           }\n         }\n       }\n     });\n\n     Thing.save({foo: 'bar'}).$promise.then(function(thing) {\n       console.log('That thing was saved in ' + thing.saveLatency + 'ms.');\n     });\n   ```\n *\n */\nangular.module('ngResource', ['ng']).\n  info({ angularVersion: '1.7.8' }).\n  provider('$resource', function ResourceProvider() {\n    var PROTOCOL_AND_IPV6_REGEX = /^https?:\\/\\/\\[[^\\]]*][^/]*/;\n\n    var provider = this;\n\n    /**\n     * @ngdoc property\n     * @name $resourceProvider#defaults\n     * @description\n     * Object containing default options used when creating `$resource` instances.\n     *\n     * The default values satisfy a wide range of usecases, but you may choose to overwrite any of\n     * them to further customize your instances. The available properties are:\n     *\n     * - **stripTrailingSlashes** – `{boolean}` – If true, then the trailing slashes from any\n     *   calculated URL will be stripped.<br />\n     *   (Defaults to true.)\n     * - **cancellable** – `{boolean}` – If true, the request made by a \"non-instance\" call will be\n     *   cancelled (if not already completed) by calling `$cancelRequest()` on the call's return\n     *   value. For more details, see {@link ngResource.$resource}. This can be overwritten per\n     *   resource class or action.<br />\n     *   (Defaults to false.)\n     * - **actions** - `{Object.<Object>}` - A hash with default actions declarations. Actions are\n     *   high-level methods corresponding to RESTful actions/methods on resources. An action may\n     *   specify what HTTP method to use, what URL to hit, if the return value will be a single\n     *   object or a collection (array) of objects etc. For more details, see\n     *   {@link ngResource.$resource}. The actions can also be enhanced or overwritten per resource\n     *   class.<br />\n     *   The default actions are:\n     *   ```js\n     *   {\n     *     get: {method: 'GET'},\n     *     save: {method: 'POST'},\n     *     query: {method: 'GET', isArray: true},\n     *     remove: {method: 'DELETE'},\n     *     delete: {method: 'DELETE'}\n     *   }\n     *   ```\n     *\n     * #### Example\n     *\n     * For example, you can specify a new `update` action that uses the `PUT` HTTP verb:\n     *\n     * ```js\n     *   angular.\n     *     module('myApp').\n     *     config(['$resourceProvider', function ($resourceProvider) {\n     *       $resourceProvider.defaults.actions.update = {\n     *         method: 'PUT'\n     *       };\n     *     }]);\n     * ```\n     *\n     * Or you can even overwrite the whole `actions` list and specify your own:\n     *\n     * ```js\n     *   angular.\n     *     module('myApp').\n     *     config(['$resourceProvider', function ($resourceProvider) {\n     *       $resourceProvider.defaults.actions = {\n     *         create: {method: 'POST'},\n     *         get:    {method: 'GET'},\n     *         getAll: {method: 'GET', isArray:true},\n     *         update: {method: 'PUT'},\n     *         delete: {method: 'DELETE'}\n     *       };\n     *     });\n     * ```\n     *\n     */\n    this.defaults = {\n      // Strip slashes by default\n      stripTrailingSlashes: true,\n\n      // Make non-instance requests cancellable (via `$cancelRequest()`)\n      cancellable: false,\n\n      // Default actions configuration\n      actions: {\n        'get': {method: 'GET'},\n        'save': {method: 'POST'},\n        'query': {method: 'GET', isArray: true},\n        'remove': {method: 'DELETE'},\n        'delete': {method: 'DELETE'}\n      }\n    };\n\n    this.$get = ['$http', '$log', '$q', '$timeout', function($http, $log, $q, $timeout) {\n\n      var noop = angular.noop,\n          forEach = angular.forEach,\n          extend = angular.extend,\n          copy = angular.copy,\n          isArray = angular.isArray,\n          isDefined = angular.isDefined,\n          isFunction = angular.isFunction,\n          isNumber = angular.isNumber,\n          encodeUriQuery = angular.$$encodeUriQuery,\n          encodeUriSegment = angular.$$encodeUriSegment;\n\n      function Route(template, defaults) {\n        this.template = template;\n        this.defaults = extend({}, provider.defaults, defaults);\n        this.urlParams = {};\n      }\n\n      Route.prototype = {\n        setUrlParams: function(config, params, actionUrl) {\n          var self = this,\n            url = actionUrl || self.template,\n            val,\n            encodedVal,\n            protocolAndIpv6 = '';\n\n          var urlParams = self.urlParams = Object.create(null);\n          forEach(url.split(/\\W/), function(param) {\n            if (param === 'hasOwnProperty') {\n              throw $resourceMinErr('badname', 'hasOwnProperty is not a valid parameter name.');\n            }\n            if (!(new RegExp('^\\\\d+$').test(param)) && param &&\n              (new RegExp('(^|[^\\\\\\\\]):' + param + '(\\\\W|$)').test(url))) {\n              urlParams[param] = {\n                isQueryParamValue: (new RegExp('\\\\?.*=:' + param + '(?:\\\\W|$)')).test(url)\n              };\n            }\n          });\n          url = url.replace(/\\\\:/g, ':');\n          url = url.replace(PROTOCOL_AND_IPV6_REGEX, function(match) {\n            protocolAndIpv6 = match;\n            return '';\n          });\n\n          params = params || {};\n          forEach(self.urlParams, function(paramInfo, urlParam) {\n            val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];\n            if (isDefined(val) && val !== null) {\n              if (paramInfo.isQueryParamValue) {\n                encodedVal = encodeUriQuery(val, true);\n              } else {\n                encodedVal = encodeUriSegment(val);\n              }\n              url = url.replace(new RegExp(':' + urlParam + '(\\\\W|$)', 'g'), function(match, p1) {\n                return encodedVal + p1;\n              });\n            } else {\n              url = url.replace(new RegExp('(/?):' + urlParam + '(\\\\W|$)', 'g'), function(match,\n                  leadingSlashes, tail) {\n                if (tail.charAt(0) === '/') {\n                  return tail;\n                } else {\n                  return leadingSlashes + tail;\n                }\n              });\n            }\n          });\n\n          // strip trailing slashes and set the url (unless this behavior is specifically disabled)\n          if (self.defaults.stripTrailingSlashes) {\n            url = url.replace(/\\/+$/, '') || '/';\n          }\n\n          // Collapse `/.` if found in the last URL path segment before the query.\n          // E.g. `http://url.com/id/.format?q=x` becomes `http://url.com/id.format?q=x`.\n          url = url.replace(/\\/\\.(?=\\w+($|\\?))/, '.');\n          // Replace escaped `/\\.` with `/.`.\n          // (If `\\.` comes from a param value, it will be encoded as `%5C.`.)\n          config.url = protocolAndIpv6 + url.replace(/\\/(\\\\|%5C)\\./, '/.');\n\n\n          // set params - delegate param encoding to $http\n          forEach(params, function(value, key) {\n            if (!self.urlParams[key]) {\n              config.params = config.params || {};\n              config.params[key] = value;\n            }\n          });\n        }\n      };\n\n\n      function resourceFactory(url, paramDefaults, actions, options) {\n        var route = new Route(url, options);\n\n        actions = extend({}, provider.defaults.actions, actions);\n\n        function extractParams(data, actionParams) {\n          var ids = {};\n          actionParams = extend({}, paramDefaults, actionParams);\n          forEach(actionParams, function(value, key) {\n            if (isFunction(value)) { value = value(data); }\n            ids[key] = value && value.charAt && value.charAt(0) === '@' ?\n              lookupDottedPath(data, value.substr(1)) : value;\n          });\n          return ids;\n        }\n\n        function defaultResponseInterceptor(response) {\n          return response.resource;\n        }\n\n        function Resource(value) {\n          shallowClearAndCopy(value || {}, this);\n        }\n\n        Resource.prototype.toJSON = function() {\n          var data = extend({}, this);\n          delete data.$promise;\n          delete data.$resolved;\n          delete data.$cancelRequest;\n          return data;\n        };\n\n        forEach(actions, function(action, name) {\n          var hasBody = action.hasBody === true || (action.hasBody !== false && /^(POST|PUT|PATCH)$/i.test(action.method));\n          var numericTimeout = action.timeout;\n          var cancellable = isDefined(action.cancellable) ?\n              action.cancellable : route.defaults.cancellable;\n\n          if (numericTimeout && !isNumber(numericTimeout)) {\n            $log.debug('ngResource:\\n' +\n                       '  Only numeric values are allowed as `timeout`.\\n' +\n                       '  Promises are not supported in $resource, because the same value would ' +\n                       'be used for multiple requests. If you are looking for a way to cancel ' +\n                       'requests, you should use the `cancellable` option.');\n            delete action.timeout;\n            numericTimeout = null;\n          }\n\n          Resource[name] = function(a1, a2, a3, a4) {\n            var params = {}, data, onSuccess, onError;\n\n            switch (arguments.length) {\n              case 4:\n                onError = a4;\n                onSuccess = a3;\n                // falls through\n              case 3:\n              case 2:\n                if (isFunction(a2)) {\n                  if (isFunction(a1)) {\n                    onSuccess = a1;\n                    onError = a2;\n                    break;\n                  }\n\n                  onSuccess = a2;\n                  onError = a3;\n                  // falls through\n                } else {\n                  params = a1;\n                  data = a2;\n                  onSuccess = a3;\n                  break;\n                }\n                // falls through\n              case 1:\n                if (isFunction(a1)) onSuccess = a1;\n                else if (hasBody) data = a1;\n                else params = a1;\n                break;\n              case 0: break;\n              default:\n                throw $resourceMinErr('badargs',\n                  'Expected up to 4 arguments [params, data, success, error], got {0} arguments',\n                  arguments.length);\n            }\n\n            var isInstanceCall = this instanceof Resource;\n            var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));\n            var httpConfig = {};\n            var requestInterceptor = action.interceptor && action.interceptor.request || undefined;\n            var requestErrorInterceptor = action.interceptor && action.interceptor.requestError ||\n              undefined;\n            var responseInterceptor = action.interceptor && action.interceptor.response ||\n              defaultResponseInterceptor;\n            var responseErrorInterceptor = action.interceptor && action.interceptor.responseError ||\n              $q.reject;\n            var successCallback = onSuccess ? function(val) {\n              onSuccess(val, response.headers, response.status, response.statusText);\n            } : undefined;\n            var errorCallback = onError || undefined;\n            var timeoutDeferred;\n            var numericTimeoutPromise;\n            var response;\n\n            forEach(action, function(value, key) {\n              switch (key) {\n                default:\n                  httpConfig[key] = copy(value);\n                  break;\n                case 'params':\n                case 'isArray':\n                case 'interceptor':\n                case 'cancellable':\n                  break;\n              }\n            });\n\n            if (!isInstanceCall && cancellable) {\n              timeoutDeferred = $q.defer();\n              httpConfig.timeout = timeoutDeferred.promise;\n\n              if (numericTimeout) {\n                numericTimeoutPromise = $timeout(timeoutDeferred.resolve, numericTimeout);\n              }\n            }\n\n            if (hasBody) httpConfig.data = data;\n            route.setUrlParams(httpConfig,\n              extend({}, extractParams(data, action.params || {}), params),\n              action.url);\n\n            // Start the promise chain\n            var promise = $q.\n              resolve(httpConfig).\n              then(requestInterceptor).\n              catch(requestErrorInterceptor).\n              then($http);\n\n            promise = promise.then(function(resp) {\n              var data = resp.data;\n\n              if (data) {\n                // Need to convert action.isArray to boolean in case it is undefined\n                if (isArray(data) !== (!!action.isArray)) {\n                  throw $resourceMinErr('badcfg',\n                      'Error in resource configuration for action `{0}`. Expected response to ' +\n                      'contain an {1} but got an {2} (Request: {3} {4})', name, action.isArray ? 'array' : 'object',\n                    isArray(data) ? 'array' : 'object', httpConfig.method, httpConfig.url);\n                }\n                if (action.isArray) {\n                  value.length = 0;\n                  forEach(data, function(item) {\n                    if (typeof item === 'object') {\n                      value.push(new Resource(item));\n                    } else {\n                      // Valid JSON values may be string literals, and these should not be converted\n                      // into objects. These items will not have access to the Resource prototype\n                      // methods, but unfortunately there\n                      value.push(item);\n                    }\n                  });\n                } else {\n                  var promise = value.$promise;     // Save the promise\n                  shallowClearAndCopy(data, value);\n                  value.$promise = promise;         // Restore the promise\n                }\n              }\n\n              resp.resource = value;\n              response = resp;\n              return responseInterceptor(resp);\n            }, function(rejectionOrResponse) {\n              rejectionOrResponse.resource = value;\n              response = rejectionOrResponse;\n              return responseErrorInterceptor(rejectionOrResponse);\n            });\n\n            promise = promise['finally'](function() {\n              value.$resolved = true;\n              if (!isInstanceCall && cancellable) {\n                value.$cancelRequest = noop;\n                $timeout.cancel(numericTimeoutPromise);\n                timeoutDeferred = numericTimeoutPromise = httpConfig.timeout = null;\n              }\n            });\n\n            // Run the `success`/`error` callbacks, but do not let them affect the returned promise.\n            promise.then(successCallback, errorCallback);\n\n            if (!isInstanceCall) {\n              // we are creating instance / collection\n              // - set the initial promise\n              // - return the instance / collection\n              value.$promise = promise;\n              value.$resolved = false;\n              if (cancellable) value.$cancelRequest = cancelRequest;\n\n              return value;\n            }\n\n            // instance call\n            return promise;\n\n            function cancelRequest(value) {\n              promise.catch(noop);\n              if (timeoutDeferred !== null) {\n                timeoutDeferred.resolve(value);\n              }\n            }\n          };\n\n\n          Resource.prototype['$' + name] = function(params, success, error) {\n            if (isFunction(params)) {\n              error = success; success = params; params = {};\n            }\n            var result = Resource[name].call(this, params, this, success, error);\n            return result.$promise || result;\n          };\n        });\n\n        return Resource;\n      }\n\n      return resourceFactory;\n    }];\n  });\n\ndescribe('resource', function() {\n  var noop = angular.noop;\n  var extend = angular.extend;\n\ndescribe('basic usage', function() {\n  var $resource, CreditCard, callback, $httpBackend, resourceProvider, $q;\n\n  beforeEach(module('ngResource'));\n\n  beforeEach(module(function($resourceProvider) {\n    resourceProvider = $resourceProvider;\n  }));\n\n  beforeEach(inject(function($injector) {\n    $httpBackend = $injector.get('$httpBackend');\n    $resource = $injector.get('$resource');\n    $q = $injector.get('$q');\n    CreditCard = $resource('/CreditCard/:id:verb', {id:'@id.key'}, {\n      charge:{\n        method:'post',\n        params:{verb:'!charge'}\n      },\n      patch: {\n        method: 'PATCH'\n      },\n      conditionalPut: {\n        method: 'PUT',\n        headers: {\n          'If-None-Match': '*'\n        }\n      }\n\n    });\n    callback = jasmine.createSpy('callback');\n  }));\n\n  afterEach(function() {\n    $httpBackend.verifyNoOutstandingExpectation();\n  });\n\n\n  describe('isValidDottedPath', function() {\n    /* global isValidDottedPath: false */\n    it('should support arbitrary dotted names', function() {\n      expect(isValidDottedPath('')).toBe(false);\n      expect(isValidDottedPath('1')).toBe(false);\n      expect(isValidDottedPath('1abc')).toBe(false);\n      expect(isValidDottedPath('.')).toBe(false);\n      expect(isValidDottedPath('$')).toBe(true);\n      expect(isValidDottedPath('@')).toBe(true);\n      expect(isValidDottedPath('a')).toBe(true);\n      expect(isValidDottedPath('A')).toBe(true);\n      expect(isValidDottedPath('a1')).toBe(true);\n      expect(isValidDottedPath('$a')).toBe(true);\n      expect(isValidDottedPath('$1')).toBe(true);\n      expect(isValidDottedPath('$$')).toBe(true);\n      expect(isValidDottedPath('$.$')).toBe(true);\n      expect(isValidDottedPath('.$')).toBe(false);\n      expect(isValidDottedPath('$.')).toBe(false);\n      expect(isValidDottedPath('@.')).toBe(false);\n      expect(isValidDottedPath('.@')).toBe(false);\n    });\n  });\n\n  describe('lookupDottedPath', function() {\n    /* global lookupDottedPath: false */\n    var data = {a: {b: 'foo', c: null, '@d':'d-foo'},'@b':'b-foo'};\n\n    it('should throw for invalid path', function() {\n      expect(function() {\n        lookupDottedPath(data, '.ckck');\n      }).toThrowMinErr('$resource', 'badmember',\n                       'Dotted member path \"@.ckck\" is invalid.');\n    });\n\n    it('should get dotted paths', function() {\n      expect(lookupDottedPath(data, 'a')).toEqual({b: 'foo', c: null, '@d':'d-foo'});\n      expect(lookupDottedPath(data, 'a.b')).toBe('foo');\n      expect(lookupDottedPath(data, 'a.c')).toBeNull();\n      expect(lookupDottedPath(data, 'a.@d')).toBe('d-foo');\n      expect(lookupDottedPath(data, '@b')).toBe('b-foo');\n    });\n\n    it('should skip over null/undefined members', function() {\n      expect(lookupDottedPath(data, 'a.b.c')).toBeUndefined();\n      expect(lookupDottedPath(data, 'a.c.c')).toBeUndefined();\n      expect(lookupDottedPath(data, 'a.b.c.d')).toBeUndefined();\n      expect(lookupDottedPath(data, 'NOT_EXIST')).toBeUndefined();\n    });\n  });\n\n  it('should not include a request body when calling $delete', function() {\n    $httpBackend.expect('DELETE', '/fooresource', null).respond({});\n    var Resource = $resource('/fooresource');\n    var resource = new Resource({ foo: 'bar' });\n\n    resource.$delete();\n    $httpBackend.flush();\n  });\n\n  it('should include a request body when calling custom method with hasBody is true', function() {\n    var instant = {name: 'info.txt'};\n    var condition = {at: '2038-01-19 03:14:08'};\n\n    $httpBackend.expect('CREATE', '/fooresource', instant).respond({fid: 42});\n    $httpBackend.expect('DELETE', '/fooresource', condition).respond({});\n\n    var r = $resource('/fooresource', {}, {\n      create: {method: 'CREATE', hasBody: true},\n      delete: {method: 'DELETE', hasBody: true}\n    });\n\n    var creationResponse = r.create(instant);\n    var deleteResponse = r.delete(condition);\n\n    $httpBackend.flush();\n\n    expect(creationResponse.fid).toBe(42);\n    expect(deleteResponse.$resolved).toBe(true);\n  });\n\n  it('should not include a request body if hasBody is false on POST, PUT and PATCH', function() {\n    function verifyRequest(method, url, data) {\n      expect(data).toBeUndefined();\n      return [200, {id: 42}];\n    }\n\n    $httpBackend.expect('POST', '/foo').respond(verifyRequest);\n    $httpBackend.expect('PUT', '/foo').respond(verifyRequest);\n    $httpBackend.expect('PATCH', '/foo').respond(verifyRequest);\n\n    var R = $resource('/foo', {}, {\n      post: {method: 'POST', hasBody: false},\n      put: {method: 'PUT', hasBody: false},\n      patch: {method: 'PATCH', hasBody: false}\n    });\n\n    var postResponse = R.post();\n    var putResponse = R.put();\n    var patchResponse = R.patch();\n\n    $httpBackend.flush();\n\n    expect(postResponse.id).toBe(42);\n    expect(putResponse.id).toBe(42);\n    expect(patchResponse.id).toBe(42);\n  });\n\n  it('should expect a body if hasBody is true', function() {\n    var username = 'yathos';\n    var loginRequest = {name: username, password: 'Smile'};\n    var user = {id: 1, name: username};\n\n    $httpBackend.expect('LOGIN', '/user/me', loginRequest).respond(user);\n\n    $httpBackend.expect('LOGOUT', '/user/me', null).respond(null);\n\n    var UserService = $resource('/user/me', {}, {\n      login: {method: 'LOGIN', hasBody: true},\n      logout: {method: 'LOGOUT', hasBody: false}\n    });\n\n    var loginResponse = UserService.login(loginRequest);\n    var logoutResponse = UserService.logout();\n\n    $httpBackend.flush();\n\n    expect(loginResponse.id).toBe(user.id);\n    expect(logoutResponse.$resolved).toBe(true);\n  });\n\n  it('should build resource', function() {\n    expect(typeof CreditCard).toBe('function');\n    expect(typeof CreditCard.get).toBe('function');\n    expect(typeof CreditCard.save).toBe('function');\n    expect(typeof CreditCard.remove).toBe('function');\n    expect(typeof CreditCard['delete']).toBe('function');\n    expect(typeof CreditCard.query).toBe('function');\n  });\n\n\n  describe('shallow copy', function() {\n    /* global shallowClearAndCopy */\n    it('should make a copy', function() {\n      var original = {key:{}};\n      var copy = shallowClearAndCopy(original);\n      expect(copy).toEqual(original);\n      expect(copy.key).toBe(original.key);\n    });\n\n\n    it('should omit \"$$\"-prefixed properties', function() {\n      var original = {$$some: true, $$: true};\n      var clone = {};\n\n      expect(shallowClearAndCopy(original, clone)).toBe(clone);\n      expect(clone.$$some).toBeUndefined();\n      expect(clone.$$).toBeUndefined();\n    });\n\n\n    it('should copy \"$\"-prefixed properties from copy', function() {\n      var original = {$some: true};\n      var clone = {};\n\n      expect(shallowClearAndCopy(original, clone)).toBe(clone);\n      expect(clone.$some).toBe(original.$some);\n    });\n\n\n    it('should omit properties from prototype chain', function() {\n      var original, clone = {};\n      function Func() {}\n      Func.prototype.hello = 'world';\n\n      original = new Func();\n      original.goodbye = 'world';\n\n      expect(shallowClearAndCopy(original, clone)).toBe(clone);\n      expect(clone.hello).toBeUndefined();\n      expect(clone.goodbye).toBe('world');\n    });\n  });\n\n\n  it('should not throw if response.data is the resource object', function() {\n    var data = {id:{key:123}, number:'9876'};\n    $httpBackend.expect('GET', '/CreditCard/123').respond(data);\n\n    var cc = CreditCard.get({id:123});\n    $httpBackend.flush();\n    expect(cc instanceof CreditCard).toBe(true);\n\n    $httpBackend.expect('POST', '/CreditCard/123', angular.toJson(data)).respond(cc);\n\n    cc.$save();\n    $httpBackend.flush();\n    expect(cc.id).toEqual({key:123});\n    expect(cc.number).toEqual('9876');\n  });\n\n\n  it('should default to empty parameters', function() {\n    $httpBackend.expect('GET', 'URL').respond({});\n    $resource('URL').query();\n  });\n\n\n  it('should ignore slashes of undefined parameters', function() {\n    var R = $resource('/Path/:a/:b/:c');\n\n    $httpBackend.when('GET', '/Path').respond('{}');\n    $httpBackend.when('GET', '/Path/0').respond('{}');\n    $httpBackend.when('GET', '/Path/false').respond('{}');\n    $httpBackend.when('GET', '/Path').respond('{}');\n    $httpBackend.when('GET', '/Path/').respond('{}');\n    $httpBackend.when('GET', '/Path/1').respond('{}');\n    $httpBackend.when('GET', '/Path/2/3').respond('{}');\n    $httpBackend.when('GET', '/Path/4/5').respond('{}');\n    $httpBackend.when('GET', '/Path/6/7/8').respond('{}');\n\n    R.get({});\n    R.get({a:0});\n    R.get({a:false});\n    R.get({a:null});\n    R.get({a:undefined});\n    R.get({a:''});\n    R.get({a:1});\n    R.get({a:2, b:3});\n    R.get({a:4, c:5});\n    R.get({a:6, b:7, c:8});\n  });\n\n  it('should not ignore leading slashes of undefined parameters that have non-slash trailing sequence', function() {\n    var R = $resource('/Path/:a.foo/:b.bar/:c.baz');\n\n    $httpBackend.when('GET', '/Path/.foo/.bar.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/0.foo/.bar.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/false.foo/.bar.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/.foo/.bar.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/.foo/.bar.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/1.foo/.bar.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/2.foo/3.bar.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/4.foo/.bar/5.baz').respond('{}');\n    $httpBackend.when('GET', '/Path/6.foo/7.bar/8.baz').respond('{}');\n\n    R.get({});\n    R.get({a:0});\n    R.get({a:false});\n    R.get({a:null});\n    R.get({a:undefined});\n    R.get({a:''});\n    R.get({a:1});\n    R.get({a:2, b:3});\n    R.get({a:4, c:5});\n    R.get({a:6, b:7, c:8});\n  });\n\n  it('should not collapsed the url into an empty string', function() {\n    var R = $resource('/:foo/:bar/');\n\n    $httpBackend.when('GET', '/').respond('{}');\n\n    R.get({});\n  });\n\n  it('should support escaping colons in url template', function() {\n    var R = $resource('http://localhost\\\\:8080/Path/:a/\\\\:stillPath/:b');\n\n    $httpBackend.expect('GET', 'http://localhost:8080/Path/foo/:stillPath/bar').respond();\n    R.get({a: 'foo', b: 'bar'});\n  });\n\n  it('should support an unescaped url', function() {\n    var R = $resource('http://localhost:8080/Path/:a');\n\n    $httpBackend.expect('GET', 'http://localhost:8080/Path/foo').respond();\n    R.get({a: 'foo'});\n  });\n\n\n  it('should correctly encode url params', function() {\n    var R = $resource('/Path/:a');\n\n    $httpBackend.expect('GET', '/Path/foo%231').respond('{}');\n    $httpBackend.expect('GET', '/Path/doh!@foo?bar=baz%231').respond('{}');\n    $httpBackend.expect('GET', '/Path/herp$').respond('{}');\n    $httpBackend.expect('GET', '/Path/foo;bar').respond('{}');\n    $httpBackend.expect('GET', '/Path/foo?bar=baz;qux').respond('{}');\n\n    R.get({a: 'foo#1'});\n    R.get({a: 'doh!@foo', bar: 'baz#1'});\n    R.get({a: 'herp$'});\n    R.get({a: 'foo;bar'});\n    R.get({a: 'foo', bar: 'baz;qux'});\n  });\n\n  it('should not encode @ in url params', function() {\n    //encodeURIComponent is too aggressive and doesn't follow http://www.ietf.org/rfc/rfc3986.txt\n    //with regards to the character set (pchar) allowed in path segments\n    //so we need this test to make sure that we don't over-encode the params and break stuff like\n    //buzz api which uses @self\n\n    var R = $resource('/Path/:a');\n    $httpBackend.expect('GET', '/Path/doh@fo%20o?!do%26h=g%3Da+h&:bar=$baz@1').respond('{}');\n    R.get({a: 'doh@fo o', ':bar': '$baz@1', '!do&h': 'g=a h'});\n  });\n\n  it('should encode array params', function() {\n    var R = $resource('/Path/:a');\n    $httpBackend.expect('GET', '/Path/doh&foo?bar=baz1&bar=baz2').respond('{}');\n    R.get({a: 'doh&foo', bar: ['baz1', 'baz2']});\n  });\n\n  it('should not encode string \"null\" to \"+\" in url params', function() {\n    var R = $resource('/Path/:a');\n    $httpBackend.expect('GET', '/Path/null').respond('{}');\n    R.get({a: 'null'});\n  });\n\n\n  it('should implicitly strip trailing slashes from URLs by default', function() {\n    var R = $resource('http://localhost:8080/Path/:a/');\n\n    $httpBackend.expect('GET', 'http://localhost:8080/Path/foo').respond();\n    R.get({a: 'foo'});\n  });\n\n  it('should support explicitly stripping trailing slashes from URLs', function() {\n    var R = $resource('http://localhost:8080/Path/:a/', {}, {}, {stripTrailingSlashes: true});\n\n    $httpBackend.expect('GET', 'http://localhost:8080/Path/foo').respond();\n    R.get({a: 'foo'});\n  });\n\n  it('should support explicitly keeping trailing slashes in URLs', function() {\n    var R = $resource('http://localhost:8080/Path/:a/', {}, {}, {stripTrailingSlashes: false});\n\n    $httpBackend.expect('GET', 'http://localhost:8080/Path/foo/').respond();\n    R.get({a: 'foo'});\n  });\n\n  it('should support provider-level configuration to strip trailing slashes in URLs', function() {\n    // Set the new behavior for all new resources created by overriding the\n    // provider configuration\n    resourceProvider.defaults.stripTrailingSlashes = false;\n\n    var R = $resource('http://localhost:8080/Path/:a/');\n\n    $httpBackend.expect('GET', 'http://localhost:8080/Path/foo/').respond();\n    R.get({a: 'foo'});\n  });\n\n  it('should support IPv6 URLs', function() {\n    test('http://[2620:0:861:ed1a::1]',        {ed1a: 'foo'}, 'http://[2620:0:861:ed1a::1]');\n    test('http://[2620:0:861:ed1a::1]/',       {ed1a: 'foo'}, 'http://[2620:0:861:ed1a::1]/');\n    test('http://[2620:0:861:ed1a::1]/:ed1a',  {ed1a: 'foo'}, 'http://[2620:0:861:ed1a::1]/foo');\n    test('http://[2620:0:861:ed1a::1]/:ed1a',  {},            'http://[2620:0:861:ed1a::1]/');\n    test('http://[2620:0:861:ed1a::1]/:ed1a/', {ed1a: 'foo'}, 'http://[2620:0:861:ed1a::1]/foo/');\n    test('http://[2620:0:861:ed1a::1]/:ed1a/', {},            'http://[2620:0:861:ed1a::1]/');\n\n    // Helpers\n    function test(templateUrl, params, actualUrl) {\n      var R = $resource(templateUrl, null, null, {stripTrailingSlashes: false});\n      $httpBackend.expect('GET', actualUrl).respond(null);\n      R.get(params);\n    }\n  });\n\n  it('should support params in the `hostname` part of the URL', function() {\n    test('http://:hostname',            {hostname: 'foo.com'},              'http://foo.com');\n    test('http://:hostname/',           {hostname: 'foo.com'},              'http://foo.com/');\n    test('http://:l2Domain.:l1Domain',  {l1Domain: 'com', l2Domain: 'bar'}, 'http://bar.com');\n    test('http://:l2Domain.:l1Domain/', {l1Domain: 'com', l2Domain: 'bar'}, 'http://bar.com/');\n    test('http://127.0.0.:octet',       {octet: 42},                        'http://127.0.0.42');\n    test('http://127.0.0.:octet/',      {octet: 42},                        'http://127.0.0.42/');\n\n    // Helpers\n    function test(templateUrl, params, actualUrl) {\n      var R = $resource(templateUrl, null, null, {stripTrailingSlashes: false});\n      $httpBackend.expect('GET', actualUrl).respond(null);\n      R.get(params);\n    }\n  });\n\n  it('should support overriding provider default trailing-slash stripping configuration', function() {\n    // Set the new behavior for all new resources created by overriding the\n    // provider configuration\n    resourceProvider.defaults.stripTrailingSlashes = false;\n\n    // Specific instances of $resource can still override the provider's default\n    var R = $resource('http://localhost:8080/Path/:a/', {}, {}, {stripTrailingSlashes: true});\n\n    $httpBackend.expect('GET', 'http://localhost:8080/Path/foo').respond();\n    R.get({a: 'foo'});\n  });\n\n\n  it('should allow relative paths in resource url', function() {\n    var R = $resource(':relativePath');\n    $httpBackend.expect('GET', 'data.json').respond('{}');\n    R.get({ relativePath: 'data.json' });\n  });\n\n  it('should handle + in url params', function() {\n    var R = $resource('/api/myapp/:myresource?from=:from&to=:to&histlen=:histlen');\n    $httpBackend.expect('GET', '/api/myapp/pear+apple?from=2012-04-01&to=2012-04-29&histlen=3').respond('{}');\n    R.get({ myresource: 'pear+apple', from: '2012-04-01', to: '2012-04-29', histlen: 3  });\n  });\n\n\n  it('should encode & in query params unless in query param value', function() {\n    var R1 = $resource('/Path/:a');\n    $httpBackend.expect('GET', '/Path/doh&foo?bar=baz%261').respond('{}');\n    R1.get({a: 'doh&foo', bar: 'baz&1'});\n\n    var R2 = $resource('/api/myapp/resource?:query');\n    $httpBackend.expect('GET', '/api/myapp/resource?foo&bar').respond('{}');\n    R2.get({query: 'foo&bar'});\n\n    var R3 = $resource('/api/myapp/resource?from=:from');\n    $httpBackend.expect('GET', '/api/myapp/resource?from=bar%20%26%20blanks').respond('{}');\n    R3.get({from: 'bar & blanks'});\n  });\n\n\n  it('should build resource with default param', function() {\n    $httpBackend.expect('GET', '/Order/123/Line/456.visa?minimum=0.05').respond({id: 'abc'});\n    var LineItem = $resource('/Order/:orderId/Line/:id:verb',\n                                  {orderId: '123', id: '@id.key', verb:'.visa', minimum: 0.05});\n    var item = LineItem.get({id: 456});\n    $httpBackend.flush();\n    expect(item).toEqualData({id:'abc'});\n  });\n\n\n  it('should support @_property lookups with underscores', function() {\n    $httpBackend.expect('GET', '/Order/123').respond({_id: {_key:'123'}, count: 0});\n    var LineItem = $resource('/Order/:_id', {_id: '@_id._key'});\n    var item = LineItem.get({_id: 123});\n    $httpBackend.flush();\n    expect(item).toEqualData({_id: {_key: '123'}, count: 0});\n    $httpBackend.expect('POST', '/Order/123').respond({_id: {_key:'123'}, count: 1});\n    item.$save();\n    $httpBackend.flush();\n    expect(item).toEqualData({_id: {_key: '123'}, count: 1});\n  });\n\n\n  it('should not pass default params between actions', function() {\n    var R = $resource('/Path', {}, {get: {method: 'GET', params: {objId: '1'}}, perform: {method: 'GET'}});\n\n    $httpBackend.expect('GET', '/Path?objId=1').respond('{}');\n    $httpBackend.expect('GET', '/Path').respond('{}');\n\n    R.get({});\n    R.perform({});\n  });\n\n\n  it('should build resource with action default param overriding default param', function() {\n    $httpBackend.expect('GET', '/Customer/123').respond({id: 'abc'});\n    var TypeItem = $resource('/:type/:typeId', {type: 'Order'},\n                                  {get: {method: 'GET', params: {type: 'Customer'}}});\n    var item = TypeItem.get({typeId: 123});\n\n    $httpBackend.flush();\n    expect(item).toEqualData({id: 'abc'});\n  });\n\n\n  it('should build resource with action default param reading the value from instance', function() {\n    $httpBackend.expect('POST', '/Customer/123').respond();\n    var R = $resource('/Customer/:id', {}, {post: {method: 'POST', params: {id: '@id'}}});\n\n    var inst = new R({id:123});\n    expect(inst.id).toBe(123);\n\n    inst.$post();\n  });\n\n\n  it('should not throw TypeError on null default params', function() {\n    $httpBackend.expect('GET', '/Path').respond('{}');\n    var R = $resource('/Path', {param: null}, {get: {method: 'GET'}});\n\n    expect(function() {\n      R.get({});\n    }).not.toThrow();\n  });\n\n\n  it('should handle multiple params with same name', function() {\n    var R = $resource('/:id/:id');\n\n    $httpBackend.when('GET').respond('{}');\n    $httpBackend.expect('GET', '/1/1');\n\n    R.get({id:1});\n  });\n\n\n  it('should throw an exception if a param is called \"hasOwnProperty\"', function() {\n    expect(function() {\n      $resource('/:hasOwnProperty').get();\n    }).toThrowMinErr('$resource','badname', 'hasOwnProperty is not a valid parameter name');\n  });\n\n\n  it('should create resource', function() {\n    $httpBackend.expect('POST', '/CreditCard', '{\"name\":\"misko\"}').respond({id: 123, name: 'misko'});\n\n    var cc = CreditCard.save({name: 'misko'}, callback);\n    expect(cc).toEqualData({name: 'misko'});\n    expect(callback).not.toHaveBeenCalled();\n\n    $httpBackend.flush();\n    expect(cc).toEqualData({id: 123, name: 'misko'});\n    expect(callback).toHaveBeenCalledOnce();\n    expect(callback.calls.mostRecent().args[0]).toEqual(cc);\n    expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n  });\n\n\n  it('should read resource', function() {\n    $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n    var cc = CreditCard.get({id: 123}, callback);\n\n    expect(cc instanceof CreditCard).toBeTruthy();\n    expect(cc).toEqualData({});\n    expect(callback).not.toHaveBeenCalled();\n\n    $httpBackend.flush();\n    expect(cc).toEqualData({id: 123, number: '9876'});\n    expect(callback.calls.mostRecent().args[0]).toEqual(cc);\n    expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n  });\n\n\n  it('should send correct headers', function() {\n    $httpBackend.expectPUT('/CreditCard/123', undefined, function(headers) {\n      return headers['If-None-Match'] === '*';\n    }).respond({id:123});\n\n    CreditCard.conditionalPut({id: {key:123}});\n  });\n\n\n  it('should read partial resource', function() {\n    $httpBackend.expect('GET', '/CreditCard').respond([{id:{key:123}}]);\n    var ccs = CreditCard.query();\n\n    $httpBackend.flush();\n    expect(ccs.length).toEqual(1);\n\n    var cc = ccs[0];\n    expect(cc instanceof CreditCard).toBe(true);\n    expect(cc.number).toBeUndefined();\n\n    $httpBackend.expect('GET', '/CreditCard/123').respond({id: {key: 123}, number: '9876'});\n    cc.$get(callback);\n    $httpBackend.flush();\n    expect(callback.calls.mostRecent().args[0]).toEqual(cc);\n    expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n    expect(cc.number).toEqual('9876');\n  });\n\n\n  it('should update resource', function() {\n    $httpBackend.expect('POST', '/CreditCard/123', '{\"id\":{\"key\":123},\"name\":\"misko\"}').\n                 respond({id: {key: 123}, name: 'rama'});\n\n    var cc = CreditCard.save({id: {key: 123}, name: 'misko'}, callback);\n    expect(cc).toEqualData({id:{key:123}, name:'misko'});\n    expect(callback).not.toHaveBeenCalled();\n    $httpBackend.flush();\n  });\n\n\n  it('should query resource', function() {\n    $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]);\n\n    var ccs = CreditCard.query({key: 'value'}, callback);\n    expect(ccs).toEqualData([]);\n    expect(callback).not.toHaveBeenCalled();\n\n    $httpBackend.flush();\n    expect(ccs).toEqualData([{id:1}, {id:2}]);\n    expect(callback.calls.mostRecent().args[0]).toEqual(ccs);\n    expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n  });\n\n\n  it('should have all arguments optional', function() {\n    $httpBackend.expect('GET', '/CreditCard').respond([{id:1}]);\n\n    var log = '';\n    var ccs = CreditCard.query(function() { log += 'cb;'; });\n\n    $httpBackend.flush();\n    expect(ccs).toEqualData([{id:1}]);\n    expect(log).toEqual('cb;');\n  });\n\n\n  it('should delete resource and call callback', function() {\n    $httpBackend.expect('DELETE', '/CreditCard/123').respond({});\n    CreditCard.remove({id:123}, callback);\n    expect(callback).not.toHaveBeenCalled();\n\n    $httpBackend.flush();\n    expect(callback.calls.mostRecent().args[0]).toEqualData({});\n    expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n\n    callback.calls.reset();\n    $httpBackend.expect('DELETE', '/CreditCard/333').respond(204, null);\n    CreditCard.remove({id:333}, callback);\n    expect(callback).not.toHaveBeenCalled();\n\n    $httpBackend.flush();\n    expect(callback.calls.mostRecent().args[0]).toEqualData({});\n    expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n  });\n\n\n  it('should post charge verb', function() {\n    $httpBackend.expect('POST', '/CreditCard/123!charge?amount=10', '{\"auth\":\"abc\"}').respond({success: 'ok'});\n    CreditCard.charge({id:123, amount:10}, {auth:'abc'}, callback);\n  });\n\n\n  it('should post charge verb on instance', function() {\n    $httpBackend.expect('POST', '/CreditCard/123!charge?amount=10',\n        '{\"id\":{\"key\":123},\"name\":\"misko\"}').respond({success: 'ok'});\n\n    var card = new CreditCard({id:{key:123}, name:'misko'});\n    card.$charge({amount:10}, callback);\n  });\n\n\n  it('should patch a resource', function() {\n    $httpBackend.expectPATCH('/CreditCard/123', '{\"name\":\"igor\"}').\n                     respond({id: 123, name: 'rama'});\n\n    var card = CreditCard.patch({id: 123}, {name: 'igor'}, callback);\n\n    expect(card).toEqualData({name: 'igor'});\n    expect(callback).not.toHaveBeenCalled();\n    $httpBackend.flush();\n    expect(callback).toHaveBeenCalled();\n    expect(card).toEqualData({id: 123, name: 'rama'});\n  });\n\n\n  it('should create on save', function() {\n    $httpBackend.expect('POST', '/CreditCard', '{\"name\":\"misko\"}').respond({id: 123}, {header1: 'a'});\n\n    var cc = new CreditCard();\n    expect(cc.$get).toBeDefined();\n    expect(cc.$query).toBeDefined();\n    expect(cc.$remove).toBeDefined();\n    expect(cc.$save).toBeDefined();\n\n    cc.name = 'misko';\n    cc.$save(callback);\n    expect(cc).toEqualData({name:'misko'});\n\n    $httpBackend.flush();\n    expect(cc).toEqualData({id:123});\n    expect(callback.calls.mostRecent().args[0]).toEqual(cc);\n    expect(callback.calls.mostRecent().args[1]()).toEqual(extend(Object.create(null), {header1: 'a'}));\n  });\n\n\n  it('should not mutate the resource object if response contains no body', function() {\n    var data = {id:{key:123}, number:'9876'};\n    $httpBackend.expect('GET', '/CreditCard/123').respond(data);\n\n    var cc = CreditCard.get({id:123});\n    $httpBackend.flush();\n    expect(cc instanceof CreditCard).toBe(true);\n\n    $httpBackend.expect('POST', '/CreditCard/123', angular.toJson(data)).respond('');\n    var idBefore = cc.id;\n\n    cc.$save();\n    $httpBackend.flush();\n    expect(idBefore).toEqual(cc.id);\n  });\n\n\n  it('should support dynamic default parameters (global)', function() {\n    var currentGroup = 'students',\n        Person = $resource('/Person/:group/:id', { group: function() { return currentGroup; }});\n\n    $httpBackend.expect('GET', '/Person/students/fedor').respond({id: 'fedor', email: 'f@f.com'});\n\n    var fedor = Person.get({id: 'fedor'});\n    $httpBackend.flush();\n\n    expect(fedor).toEqualData({id: 'fedor', email: 'f@f.com'});\n  });\n\n\n  it('should pass resource object to dynamic default parameters', function() {\n    var Person = $resource('/Person/:id', {\n      id: function(data) {\n        return data ? data.id : 'fedor';\n      }\n    });\n\n    $httpBackend.expect('GET', '/Person/fedor').respond(\n        {id: 'fedor', email: 'f@f.com', count: 1});\n\n    var fedor = Person.get();\n    $httpBackend.flush();\n\n    expect(fedor).toEqualData({id: 'fedor', email: 'f@f.com', count: 1});\n\n    $httpBackend.expect('POST', '/Person/fedor2').respond(\n        {id: 'fedor2', email: 'f2@f.com', count: 2});\n\n    fedor.id = 'fedor2';\n    fedor.$save();\n    $httpBackend.flush();\n\n    expect(fedor).toEqualData({id: 'fedor2', email: 'f2@f.com', count: 2});\n  });\n\n\n  it('should support dynamic default parameters (action specific)', function() {\n    var currentGroup = 'students',\n      Person = $resource('/Person/:group/:id', {}, {\n        fetch: {\n          method: 'GET',\n          params: {group: function() { return currentGroup; }}\n        }\n      });\n\n    $httpBackend.expect('GET', '/Person/students/fedor').respond({id: 'fedor', email: 'f@f.com'});\n\n    var fedor = Person.fetch({id: 'fedor'});\n    $httpBackend.flush();\n\n    expect(fedor).toEqualData({id: 'fedor', email: 'f@f.com'});\n  });\n\n\n  it('should exercise full stack', function() {\n    var Person = $resource('/Person/:id');\n\n    $httpBackend.expect('GET', '/Person/123').respond('\\n{\\n\"name\":\\n\"misko\"\\n}\\n');\n    var person = Person.get({id:123});\n    $httpBackend.flush();\n    expect(person.name).toEqual('misko');\n  });\n\n  it('should return a resource instance when calling a class method with a resource instance', function() {\n    $httpBackend.expect('GET', '/Person/123').respond('{\"name\":\"misko\"}');\n    var Person = $resource('/Person/:id');\n    var person = Person.get({id:123});\n    $httpBackend.flush();\n    $httpBackend.expect('POST', '/Person').respond('{\"name\":\"misko2\"}');\n\n    var person2 = Person.save(person);\n    $httpBackend.flush();\n\n    expect(person2).toEqual(jasmine.any(Person));\n  });\n\n  it('should not include $promise and $resolved when resource is toJson\\'ed', function() {\n    $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n    var cc = CreditCard.get({id: 123});\n    $httpBackend.flush();\n\n    cc.$myProp = 'still here';\n\n    expect(cc.$promise).toBeDefined();\n    expect(cc.$resolved).toBe(true);\n\n    var json = JSON.parse(angular.toJson(cc));\n    expect(json.$promise).not.toBeDefined();\n    expect(json.$resolved).not.toBeDefined();\n    expect(json).toEqual({id: 123, number: '9876', $myProp: 'still here'});\n  });\n\n  it('should not include $cancelRequest when resource is toJson\\'ed', function() {\n    $httpBackend.whenGET('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        cancellable: true\n      }\n    });\n\n    var card = CreditCard.get();\n    var json = card.toJSON();\n\n    expect(card.$cancelRequest).toBeDefined();\n    expect(json.$cancelRequest).toBeUndefined();\n  });\n\n\n  describe('promise api', function() {\n\n    var $rootScope;\n\n\n    beforeEach(inject(function(_$rootScope_) {\n      $rootScope = _$rootScope_;\n    }));\n\n\n    describe('single resource', function() {\n\n      it('should add $promise to the result object', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n        var cc = CreditCard.get({id: 123});\n\n        cc.$promise.then(callback);\n        expect(callback).not.toHaveBeenCalled();\n\n        $httpBackend.flush();\n\n        expect(callback).toHaveBeenCalledOnce();\n        expect(callback.calls.mostRecent().args[0]).toBe(cc);\n      });\n\n\n      it('should keep $promise around after resolution', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n        var cc = CreditCard.get({id: 123});\n\n        cc.$promise.then(callback);\n        $httpBackend.flush();\n\n        callback.calls.reset();\n\n        cc.$promise.then(callback);\n        $rootScope.$apply(); //flush async queue\n\n        expect(callback).toHaveBeenCalledOnce();\n      });\n\n\n      it('should keep the original promise after instance action', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n        $httpBackend.expect('POST', '/CreditCard/123').respond({id: 123, number: '9876'});\n\n        var cc = CreditCard.get({id: 123});\n        var originalPromise = cc.$promise;\n\n        cc.number = '666';\n        cc.$save({id: 123});\n\n        expect(cc.$promise).toBe(originalPromise);\n      });\n\n\n      it('should allow promise chaining', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n        var cc = CreditCard.get({id: 123});\n\n        cc.$promise.then(function(value) { return 'new value'; }).then(callback);\n        $httpBackend.flush();\n\n        expect(callback).toHaveBeenCalledOnceWith('new value');\n      });\n\n\n      it('should allow $promise error callback registration', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond(404, 'resource not found');\n        var cc = CreditCard.get({id: 123});\n\n        cc.$promise.then(null, callback);\n        $httpBackend.flush();\n\n        var response = callback.calls.mostRecent().args[0];\n\n        expect(response.data).toEqual('resource not found');\n        expect(response.status).toEqual(404);\n      });\n\n\n      it('should add $resolved boolean field to the result object', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n        var cc = CreditCard.get({id: 123});\n\n        expect(cc.$resolved).toBe(false);\n\n        cc.$promise.then(callback);\n        expect(cc.$resolved).toBe(false);\n\n        $httpBackend.flush();\n\n        expect(cc.$resolved).toBe(true);\n      });\n\n\n      it('should set $resolved field to true when an error occurs', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond(404, 'resource not found');\n        var cc = CreditCard.get({id: 123});\n\n        cc.$promise.then(null, callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnce();\n        expect(cc.$resolved).toBe(true);\n      });\n\n\n      it('should keep $resolved true in all subsequent interactions', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n        var cc = CreditCard.get({id: 123});\n        $httpBackend.flush();\n        expect(cc.$resolved).toBe(true);\n\n        $httpBackend.expect('POST', '/CreditCard/123').respond();\n        cc.$save({id: 123});\n        expect(cc.$resolved).toBe(true);\n        $httpBackend.flush();\n        expect(cc.$resolved).toBe(true);\n      });\n\n\n      it('should return promise from action method calls', function() {\n        $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});\n        var cc = new CreditCard({name: 'Mojo'});\n\n        expect(cc).toEqualData({name: 'Mojo'});\n\n        cc.$get({id:123}).then(callback);\n\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnce();\n        expect(cc).toEqualData({id: 123, number: '9876'});\n        callback.calls.reset();\n\n        $httpBackend.expect('POST', '/CreditCard').respond({id: 1, number: '9'});\n\n        cc.$save().then(callback);\n\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnce();\n        expect(cc).toEqualData({id: 1, number: '9'});\n      });\n\n\n      it('should allow parsing a value from headers', function() {\n        // https://github.com/angular/angular.js/pull/2607#issuecomment-17759933\n        $httpBackend.expect('POST', '/CreditCard').respond(201, '', {'Location': '/new-id'});\n\n        var parseUrlFromHeaders = function(response) {\n          var resource = response.resource;\n          resource.url = response.headers('Location');\n          return resource;\n        };\n\n        var CreditCard = $resource('/CreditCard', {}, {\n          save: {\n            method: 'post',\n            interceptor: {response: parseUrlFromHeaders}\n          }\n        });\n\n        var cc = new CreditCard({name: 'Me'});\n\n        cc.$save();\n        $httpBackend.flush();\n\n        expect(cc.url).toBe('/new-id');\n      });\n\n\n      it('should pass the same transformed value to success callbacks and to promises', function() {\n        $httpBackend.expect('GET', '/CreditCard').respond(200, { value: 'original' });\n\n        var transformResponse = function(response) {\n          return { value: 'transformed' };\n        };\n\n        var CreditCard = $resource('/CreditCard', {}, {\n          call: {\n            method: 'get',\n            interceptor: { response: transformResponse }\n          }\n        });\n\n        var successValue,\n            promiseValue;\n\n        var cc = new CreditCard({ name: 'Me' });\n\n        var req = cc.$call({}, function(result) {\n          successValue = result;\n        });\n        req.then(function(result) {\n          promiseValue = result;\n        });\n\n        $httpBackend.flush();\n        expect(successValue).toEqual({ value: 'transformed' });\n        expect(promiseValue).toEqual({ value: 'transformed' });\n        expect(successValue).toBe(promiseValue);\n      });\n    });\n\n\n    describe('resource collection', function() {\n\n      it('should add $promise to the result object', function() {\n        $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]);\n        var ccs = CreditCard.query({key: 'value'});\n\n        ccs.$promise.then(callback);\n        expect(callback).not.toHaveBeenCalled();\n\n        $httpBackend.flush();\n\n        expect(callback).toHaveBeenCalledOnce();\n        expect(callback.calls.mostRecent().args[0]).toBe(ccs);\n      });\n\n\n      it('should keep $promise around after resolution', function() {\n        $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]);\n        var ccs = CreditCard.query({key: 'value'});\n\n        ccs.$promise.then(callback);\n        $httpBackend.flush();\n\n        callback.calls.reset();\n\n        ccs.$promise.then(callback);\n        $rootScope.$apply(); //flush async queue\n\n        expect(callback).toHaveBeenCalledOnce();\n      });\n\n\n      it('should allow promise chaining', function() {\n        $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]);\n        var ccs = CreditCard.query({key: 'value'});\n\n        ccs.$promise.then(function(value) { return 'new value'; }).then(callback);\n        $httpBackend.flush();\n\n        expect(callback).toHaveBeenCalledOnceWith('new value');\n      });\n\n\n      it('should allow $promise error callback registration', function() {\n        $httpBackend.expect('GET', '/CreditCard?key=value').respond(404, 'resource not found');\n        var ccs = CreditCard.query({key: 'value'});\n\n        ccs.$promise.then(null, callback);\n        $httpBackend.flush();\n\n        var response = callback.calls.mostRecent().args[0];\n\n        expect(response.data).toEqual('resource not found');\n        expect(response.status).toEqual(404);\n      });\n\n\n      it('should add $resolved boolean field to the result object', function() {\n        $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]);\n        var ccs = CreditCard.query({key: 'value'}, callback);\n\n        expect(ccs.$resolved).toBe(false);\n\n        ccs.$promise.then(callback);\n        expect(ccs.$resolved).toBe(false);\n\n        $httpBackend.flush();\n\n        expect(ccs.$resolved).toBe(true);\n      });\n\n\n      it('should set $resolved field to true when an error occurs', function() {\n        $httpBackend.expect('GET', '/CreditCard?key=value').respond(404, 'resource not found');\n        var ccs = CreditCard.query({key: 'value'});\n\n        ccs.$promise.then(null, callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnce();\n        expect(ccs.$resolved).toBe(true);\n      });\n    });\n\n\n    describe('requestInterceptor', function() {\n      var rejectReason = {'lol':'cat'};\n      var successSpy, failureSpy;\n\n      beforeEach(function() {\n        successSpy = jasmine.createSpy('successSpy');\n        failureSpy = jasmine.createSpy('failureSpy');\n      });\n\n      it('should allow per action request interceptor that gets full configuration', function() {\n        var CreditCard = $resource('/CreditCard', {}, {\n          query: {\n            method: 'get',\n            isArray: true,\n            interceptor: {\n              request: function(httpConfig) {\n                callback(httpConfig);\n                return httpConfig;\n              }\n            }\n          }\n        });\n\n        $httpBackend.expect('GET', '/CreditCard').respond([{id: 1}]);\n\n        var resource = CreditCard.query();\n        resource.$promise.then(successSpy, failureSpy);\n\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnce();\n        expect(successSpy).toHaveBeenCalledOnce();\n        expect(failureSpy).not.toHaveBeenCalled();\n\n        expect(callback).toHaveBeenCalledWith({\n          'method': 'get',\n          'url': '/CreditCard'\n        });\n      });\n\n      it('should call $http with the value returned from requestInterceptor', function() {\n        var CreditCard = $resource('/CreditCard', {}, {\n          query: {\n            method: 'get',\n            isArray: true,\n            interceptor: {\n              request: function(httpConfig) {\n                httpConfig.url = '/DebitCard';\n                return httpConfig;\n              }\n            }\n          }\n        });\n\n        $httpBackend.expect('GET', '/DebitCard').respond([{id: 1}]);\n\n        var resource = CreditCard.query();\n        resource.$promise.then(successSpy, failureSpy);\n\n        $httpBackend.flush();\n        expect(successSpy).toHaveBeenCalledOnceWith(jasmine.arrayContaining([\n          jasmine.objectContaining({id: 1})\n        ]));\n        expect(failureSpy).not.toHaveBeenCalled();\n      });\n\n      it('should abort the operation if the requestInterceptor rejects the operation', function() {\n        var CreditCard = $resource('/CreditCard', {}, {\n          query: {\n            method: 'get',\n            isArray: true,\n            interceptor: {\n              request: function() {\n                return $q.reject(rejectReason);\n              }\n            }\n          }\n        });\n\n        var resource = CreditCard.query();\n        resource.$promise.then(successSpy, failureSpy);\n\n        // Make sure all promises resolve.\n        $rootScope.$apply();\n\n        // Ensure the resource promise was rejected\n        expect(resource.$resolved).toBeTruthy();\n        expect(successSpy).not.toHaveBeenCalled();\n        expect(failureSpy).toHaveBeenCalledOnceWith(rejectReason);\n\n        // Ensure that no requests were made.\n        $httpBackend.verifyNoOutstandingRequest();\n      });\n\n      it('should call requestErrorInterceptor if requestInterceptor rejects the operation', function() {\n        var CreditCard = $resource('/CreditCard', {}, {\n          query: {\n            method: 'get',\n            isArray: true,\n            interceptor: {\n              request: function() {\n                return $q.reject(rejectReason);\n              },\n              requestError: function(rejection) {\n                callback(rejection);\n                return $q.reject(rejection);\n              }\n            }\n          }\n        });\n\n        var resource = CreditCard.query();\n        resource.$promise.then(successSpy, failureSpy);\n        $rootScope.$digest();\n\n        expect(callback).toHaveBeenCalledOnceWith(rejectReason);\n        expect(successSpy).not.toHaveBeenCalled();\n        expect(failureSpy).toHaveBeenCalledOnceWith(rejectReason);\n\n        // Ensure that no requests were made.\n        $httpBackend.verifyNoOutstandingRequest();\n      });\n\n      it('should abort the operation if a requestErrorInterceptor rejects the operation', function() {\n        var CreditCard = $resource('/CreditCard', {}, {\n          query: {\n            method: 'get',\n            isArray: true,\n            interceptor: {\n              request: function() {\n                return $q.reject(rejectReason);\n              },\n              requestError: function(rejection) {\n                return $q.reject(rejection);\n              }\n            }\n          }\n        });\n\n        var resource = CreditCard.query();\n        resource.$promise.then(successSpy, failureSpy);\n        $rootScope.$apply();\n\n        expect(resource.$resolved).toBeTruthy();\n        expect(successSpy).not.toHaveBeenCalled();\n        expect(failureSpy).toHaveBeenCalledOnceWith(rejectReason);\n\n        // Ensure that no requests were made.\n        $httpBackend.verifyNoOutstandingRequest();\n      });\n\n      it('should continue the operation if a requestErrorInterceptor rescues it', function() {\n        var CreditCard = $resource('/CreditCard', {}, {\n          query: {\n            method: 'get',\n            isArray: true,\n            interceptor: {\n              request: function(httpConfig) {\n                return $q.reject(httpConfig);\n              },\n              requestError: function(httpConfig) {\n                return $q.resolve(httpConfig);\n              }\n            }\n          }\n        });\n\n        $httpBackend.expect('GET', '/CreditCard').respond([{id: 1}]);\n\n        var resource = CreditCard.query();\n        resource.$promise.then(successSpy, failureSpy);\n        $httpBackend.flush();\n\n        expect(resource.$resolved).toBeTruthy();\n        expect(successSpy).toHaveBeenCalledOnceWith(jasmine.arrayContaining([\n          jasmine.objectContaining({id: 1})\n        ]));\n        expect(failureSpy).not.toHaveBeenCalled();\n\n        $httpBackend.verifyNoOutstandingRequest();\n      });\n    });\n\n\n    describe('responseInterceptor', function() {\n      it('should allow per action response interceptor that gets full response', function() {\n        var response;\n\n        $httpBackend.expect('GET', '/CreditCard').respond(201, {id: 1}, {foo: 'bar'}, 'Ack');\n        CreditCard = $resource('/CreditCard', {}, {\n          get: {\n            method: 'get',\n            interceptor: {response: function(resp) { response = resp; }}\n          }\n        });\n\n        var cc = CreditCard.get();\n        $httpBackend.flush();\n\n        expect(response.resource).toBe(cc);\n        expect(response.config).toBeDefined();\n        expect(response.status).toBe(201);\n        expect(response.statusText).toBe('Ack');\n        expect(response.headers()).toEqual({foo: 'bar'});\n      });\n\n\n      it('should allow per action responseError interceptor that gets full response', function() {\n        var response;\n\n        $httpBackend.expect('GET', '/CreditCard').respond(404, {ignored: 'stuff'}, {foo: 'bar'}, 'Ack');\n        CreditCard = $resource('/CreditCard', {}, {\n          get: {\n            method: 'get',\n            interceptor: {responseError: function(resp) { response = resp; }}\n          }\n        });\n\n        var cc = CreditCard.get();\n        $httpBackend.flush();\n\n        expect(response.resource).toBe(cc);\n        expect(response.config).toBeDefined();\n        expect(response.status).toBe(404);\n        expect(response.statusText).toBe('Ack');\n        expect(response.headers()).toEqual({foo: 'bar'});\n      });\n\n\n      it('should fulfill the promise with the value returned by the response interceptor',\n        function() {\n          $httpBackend.whenGET('/CreditCard').respond(200);\n          CreditCard = $resource('/CreditCard', {}, {\n            test1: {\n              method: 'get',\n              interceptor: {response: function() { return 'foo'; }}\n            },\n            test2: {\n              method: 'get',\n              interceptor: {response: function() { return $q.resolve('bar'); }}\n            },\n            test3: {\n              method: 'get',\n              interceptor: {response: function() { return $q.reject('baz'); }}\n            }\n          });\n\n          CreditCard.test1().$promise.then(callback);\n          $httpBackend.flush();\n          expect(callback).toHaveBeenCalledOnceWith('foo');\n\n          callback.calls.reset();\n\n          CreditCard.test2().$promise.then(callback);\n          $httpBackend.flush();\n          expect(callback).toHaveBeenCalledOnceWith('bar');\n\n          callback.calls.reset();\n\n          CreditCard.test3().$promise.then(null, callback);\n          $httpBackend.flush();\n          expect(callback).toHaveBeenCalledOnceWith('baz');\n        }\n      );\n\n\n      it('should fulfill the promise with the value returned by the responseError interceptor',\n        function() {\n          $httpBackend.whenGET('/CreditCard').respond(404);\n          CreditCard = $resource('/CreditCard', {}, {\n            test1: {\n              method: 'get',\n              interceptor: {responseError: function() { return 'foo'; }}\n            },\n            test2: {\n              method: 'get',\n              interceptor: {responseError: function() { return $q.resolve('bar'); }}\n            },\n            test3: {\n              method: 'get',\n              interceptor: {responseError: function() { return $q.reject('baz'); }}\n            }\n          });\n\n          CreditCard.test1().$promise.then(callback);\n          $httpBackend.flush();\n          expect(callback).toHaveBeenCalledOnceWith('foo');\n\n          callback.calls.reset();\n\n          CreditCard.test2().$promise.then(callback);\n          $httpBackend.flush();\n          expect(callback).toHaveBeenCalledOnceWith('bar');\n\n          callback.calls.reset();\n\n          CreditCard.test3().$promise.then(null, callback);\n          $httpBackend.flush();\n          expect(callback).toHaveBeenCalledOnceWith('baz');\n        }\n      );\n\n\n      it('should call the success callback when response interceptor succeeds', function() {\n        $httpBackend.whenGET('/CreditCard').respond(200);\n        CreditCard = $resource('/CreditCard', {}, {\n          test1: {\n            method: 'get',\n            interceptor: {response: function() { return 'foo'; }}\n          },\n          test2: {\n            method: 'get',\n            interceptor: {response: function() { return $q.resolve('bar'); }}\n          }\n        });\n\n        CreditCard.test1(callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('foo', jasmine.any(Function), 200, '');\n\n        callback.calls.reset();\n\n        CreditCard.test2(callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('bar', jasmine.any(Function), 200, '');\n      });\n\n\n      it('should call the error callback when response interceptor fails', function() {\n        $httpBackend.whenGET('/CreditCard').respond(200);\n        CreditCard = $resource('/CreditCard', {}, {\n          test1: {\n            method: 'get',\n            interceptor: {response: function() { throw 'foo'; }}\n          },\n          test2: {\n            method: 'get',\n            interceptor: {response: function() { return $q.reject('bar'); }}\n          }\n        });\n\n        CreditCard.test1(noop, callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('foo');\n\n        callback.calls.reset();\n\n        CreditCard.test2(noop, callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('bar');\n      });\n\n\n      it('should call the success callback when responseError interceptor succeeds', function() {\n        $httpBackend.whenGET('/CreditCard').respond(404);\n        CreditCard = $resource('/CreditCard', {}, {\n          test1: {\n            method: 'get',\n            interceptor: {responseError: function() { return 'foo'; }}\n          },\n          test2: {\n            method: 'get',\n            interceptor: {responseError: function() { return $q.resolve('bar'); }}\n          }\n        });\n\n        CreditCard.test1(callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('foo', jasmine.any(Function), 404, '');\n\n        callback.calls.reset();\n\n        CreditCard.test2(callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('bar', jasmine.any(Function), 404, '');\n      });\n\n\n      it('should call the error callback when responseError interceptor fails', function() {\n        $httpBackend.whenGET('/CreditCard').respond(404);\n        CreditCard = $resource('/CreditCard', {}, {\n          test1: {\n            method: 'get',\n            interceptor: {responseError: function() { throw 'foo'; }}\n          },\n          test2: {\n            method: 'get',\n            interceptor: {responseError: function() { return $q.reject('bar'); }}\n          }\n        });\n\n        CreditCard.test1(noop, callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('foo');\n\n        callback.calls.reset();\n\n        CreditCard.test2(noop, callback);\n        $httpBackend.flush();\n        expect(callback).toHaveBeenCalledOnceWith('bar');\n      });\n    });\n  });\n\n\n  describe('success mode', function() {\n    it('should call the success callback (as 1st argument) on 2xx responses', function() {\n      var instance, headers, status, statusText;\n      var successCb = jasmine.createSpy('successCb').and.callFake(function(d, h, s, t) {\n        expect(d).toBe(instance);\n        expect(h()).toEqual(jasmine.objectContaining(headers));\n        expect(s).toBe(status);\n        expect(t).toBe(statusText);\n      });\n\n      instance = CreditCard.get(successCb);\n      headers = {foo: 'bar'};\n      status = 200;\n      statusText = 'OK';\n      $httpBackend.expect('GET', '/CreditCard').respond(status, {}, headers, statusText);\n      $httpBackend.flush();\n\n      expect(successCb).toHaveBeenCalledOnce();\n\n      instance = CreditCard.get(successCb);\n      headers = {baz: 'qux'};\n      status = 299;\n      statusText = 'KO';\n      $httpBackend.expect('GET', '/CreditCard').respond(status, {}, headers, statusText);\n      $httpBackend.flush();\n\n      expect(successCb).toHaveBeenCalledTimes(2);\n    });\n\n\n    it('should call the success callback (as 2nd argument) on 2xx responses', function() {\n      var instance, headers, status, statusText;\n      var successCb = jasmine.createSpy('successCb').and.callFake(function(d, h, s, t) {\n        expect(d).toBe(instance);\n        expect(h()).toEqual(jasmine.objectContaining(headers));\n        expect(s).toBe(status);\n        expect(t).toBe(statusText);\n      });\n\n      instance = CreditCard.get({id: 123}, successCb);\n      headers = {foo: 'bar'};\n      status = 200;\n      statusText = 'OK';\n      $httpBackend.expect('GET', '/CreditCard/123').respond(status, {}, headers, statusText);\n      $httpBackend.flush();\n\n      expect(successCb).toHaveBeenCalledOnce();\n\n      instance = CreditCard.get({id: 456}, successCb);\n      headers = {baz: 'qux'};\n      status = 299;\n      statusText = 'KO';\n      $httpBackend.expect('GET', '/CreditCard/456').respond(status, {}, headers, statusText);\n      $httpBackend.flush();\n\n      expect(successCb).toHaveBeenCalledTimes(2);\n    });\n  });\n\n  describe('failure mode', function() {\n    var ERROR_CODE = 500,\n        ERROR_RESPONSE = 'Server Error',\n        errorCB;\n\n    beforeEach(function() {\n      errorCB = jasmine.createSpy('error').and.callFake(function(response) {\n        expect(response.data).toBe(ERROR_RESPONSE);\n        expect(response.status).toBe(ERROR_CODE);\n      });\n    });\n\n\n    it('should call the error callback if provided on non 2xx response', function() {\n      $httpBackend.expect('GET', '/CreditCard/123').respond(ERROR_CODE, ERROR_RESPONSE);\n\n      CreditCard.get({id:123}, callback, errorCB);\n      $httpBackend.flush();\n      expect(errorCB).toHaveBeenCalledOnce();\n      expect(callback).not.toHaveBeenCalled();\n    });\n\n\n    it('should call the error callback if provided on non 2xx response (without data)', function() {\n      $httpBackend.expect('GET', '/CreditCard').respond(ERROR_CODE, ERROR_RESPONSE);\n\n      CreditCard.get(callback, errorCB);\n      $httpBackend.flush();\n      expect(errorCB).toHaveBeenCalledOnce();\n      expect(callback).not.toHaveBeenCalled();\n    });\n  });\n\n  it('should transform request/response', function() {\n    var Person = $resource('/Person/:id', {}, {\n      save: {\n        method: 'POST',\n        params: {id: '@id'},\n        transformRequest: function(data) {\n          return angular.toJson({ __id: data.id });\n        },\n        transformResponse: function(data) {\n          return { id: data.__id };\n        }\n      }\n    });\n\n    $httpBackend.expect('POST', '/Person/123', { __id: 123 }).respond({ __id: 456 });\n    var person = new Person({id:123});\n    person.$save();\n    $httpBackend.flush();\n    expect(person.id).toEqual(456);\n  });\n\n  describe('suffix parameter', function() {\n\n    describe('query', function() {\n      it('should add a suffix', function() {\n        $httpBackend.expect('GET', '/users.json').respond([{id: 1, name: 'user1'}]);\n        var UserService = $resource('/users/:id.json', {id: '@id'});\n        var user = UserService.query();\n        $httpBackend.flush();\n        expect(user).toEqualData([{id: 1, name: 'user1'}]);\n      });\n\n      it('should not require it if not provided', function() {\n        $httpBackend.expect('GET', '/users.json').respond([{id: 1, name: 'user1'}]);\n        var UserService = $resource('/users.json');\n        var user = UserService.query();\n        $httpBackend.flush();\n        expect(user).toEqualData([{id: 1, name: 'user1'}]);\n      });\n\n      it('should work when query parameters are supplied', function() {\n        $httpBackend.expect('GET', '/users.json?red=blue').respond([{id: 1, name: 'user1'}]);\n        var UserService = $resource('/users/:user_id.json', {user_id: '@id'});\n        var user = UserService.query({red: 'blue'});\n        $httpBackend.flush();\n        expect(user).toEqualData([{id: 1, name: 'user1'}]);\n      });\n\n      it('should work when query parameters are supplied and the format is a resource parameter', function() {\n        $httpBackend.expect('GET', '/users.json?red=blue').respond([{id: 1, name: 'user1'}]);\n        var UserService = $resource('/users/:user_id.:format', {user_id: '@id', format: 'json'});\n        var user = UserService.query({red: 'blue'});\n        $httpBackend.flush();\n        expect(user).toEqualData([{id: 1, name: 'user1'}]);\n      });\n\n      it('should work with the action is overridden', function() {\n        $httpBackend.expect('GET', '/users.json').respond([{id: 1, name: 'user1'}]);\n        var UserService = $resource('/users/:user_id', {user_id: '@id'}, {\n          query: {\n            method: 'GET',\n            url: '/users/:user_id.json',\n            isArray: true\n          }\n        });\n        var user = UserService.query();\n        $httpBackend.flush();\n        expect(user).toEqualData([{id: 1, name: 'user1'}]);\n      });\n\n      it('should not convert string literals in array into Resource objects', function() {\n        $httpBackend.expect('GET', '/names.json').respond(['mary', 'jane']);\n        var strings = $resource('/names.json').query();\n        $httpBackend.flush();\n        expect(strings).toEqualData(['mary', 'jane']);\n      });\n\n      it('should not convert number literals in array into Resource objects', function() {\n        $httpBackend.expect('GET', '/names.json').respond([213, 456]);\n        var numbers = $resource('/names.json').query();\n        $httpBackend.flush();\n        expect(numbers).toEqualData([213, 456]);\n      });\n\n      it('should not convert boolean literals in array into Resource objects', function() {\n        $httpBackend.expect('GET', '/names.json').respond([true, false]);\n        var bools = $resource('/names.json').query();\n        $httpBackend.flush();\n        expect(bools).toEqualData([true, false]);\n      });\n    });\n\n    describe('get', function() {\n      it('should add them to the id', function() {\n        $httpBackend.expect('GET', '/users/1.json').respond({id: 1, name: 'user1'});\n        var UserService = $resource('/users/:user_id.json', {user_id: '@id'});\n        var user = UserService.get({user_id: 1});\n        $httpBackend.flush();\n        expect(user).toEqualData({id: 1, name: 'user1'});\n      });\n\n      it('should work when an id and query parameters are supplied', function() {\n        $httpBackend.expect('GET', '/users/1.json?red=blue').respond({id: 1, name: 'user1'});\n        var UserService = $resource('/users/:user_id.json', {user_id: '@id'});\n        var user = UserService.get({user_id: 1, red: 'blue'});\n        $httpBackend.flush();\n        expect(user).toEqualData({id: 1, name: 'user1'});\n      });\n\n      it('should work when the format is a parameter', function() {\n        $httpBackend.expect('GET', '/users/1.json?red=blue').respond({id: 1, name: 'user1'});\n        var UserService = $resource('/users/:user_id.:format', {user_id: '@id', format: 'json'});\n        var user = UserService.get({user_id: 1, red: 'blue'});\n        $httpBackend.flush();\n        expect(user).toEqualData({id: 1, name: 'user1'});\n      });\n\n      it('should work with the action is overridden', function() {\n        $httpBackend.expect('GET', '/users/1.json').respond({id: 1, name: 'user1'});\n        var UserService = $resource('/users/:user_id', {user_id: '@id'}, {\n          get: {\n            method: 'GET',\n            url: '/users/:user_id.json'\n          }\n        });\n        var user = UserService.get({user_id: 1});\n        $httpBackend.flush();\n        expect(user).toEqualData({id: 1, name: 'user1'});\n      });\n    });\n\n    describe('save', function() {\n      it('should append the suffix', function() {\n        $httpBackend.expect('POST', '/users.json', '{\"name\":\"user1\"}').respond({id: 123, name: 'user1'});\n        var UserService = $resource('/users/:user_id.json', {user_id: '@id'});\n        var user = UserService.save({name: 'user1'}, callback);\n        expect(user).toEqualData({name: 'user1'});\n        expect(callback).not.toHaveBeenCalled();\n        $httpBackend.flush();\n        expect(user).toEqualData({id: 123, name: 'user1'});\n        expect(callback).toHaveBeenCalledOnce();\n        expect(callback.calls.mostRecent().args[0]).toEqual(user);\n        expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n      });\n\n      it('should append when an id is supplied', function() {\n        $httpBackend.expect('POST', '/users/123.json', '{\"id\":123,\"name\":\"newName\"}').respond({id: 123, name: 'newName'});\n        var UserService = $resource('/users/:user_id.json', {user_id: '@id'});\n        var user = UserService.save({id: 123, name: 'newName'}, callback);\n        expect(callback).not.toHaveBeenCalled();\n        $httpBackend.flush();\n        expect(user).toEqualData({id: 123, name: 'newName'});\n        expect(callback).toHaveBeenCalledOnce();\n        expect(callback.calls.mostRecent().args[0]).toEqual(user);\n        expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n      });\n\n      it('should append when an id is supplied and the format is a parameter', function() {\n        $httpBackend.expect('POST', '/users/123.json', '{\"id\":123,\"name\":\"newName\"}').respond({id: 123, name: 'newName'});\n        var UserService = $resource('/users/:user_id.:format', {user_id: '@id', format: 'json'});\n        var user = UserService.save({id: 123, name: 'newName'}, callback);\n        expect(callback).not.toHaveBeenCalled();\n        $httpBackend.flush();\n        expect(user).toEqualData({id: 123, name: 'newName'});\n        expect(callback).toHaveBeenCalledOnce();\n        expect(callback.calls.mostRecent().args[0]).toEqual(user);\n        expect(callback.calls.mostRecent().args[1]()).toEqual(Object.create(null));\n      });\n    });\n\n    describe('escaping /. with /\\\\.', function() {\n      it('should work with query()', function() {\n        $httpBackend.expect('GET', '/users/.json').respond();\n        $resource('/users/\\\\.json').query();\n      });\n      it('should work with get()', function() {\n        $httpBackend.expect('GET', '/users/.json').respond();\n        $resource('/users/\\\\.json').get();\n      });\n      it('should work with save()', function() {\n        $httpBackend.expect('POST', '/users/.json').respond();\n        $resource('/users/\\\\.json').save({});\n      });\n      it('should work with save() if dynamic params', function() {\n        $httpBackend.expect('POST', '/users/.json').respond();\n        $resource('/users/:json', {json: '\\\\.json'}).save({});\n      });\n      it('should work with query() if dynamic params', function() {\n        $httpBackend.expect('GET', '/users/.json').respond();\n        $resource('/users/:json', {json: '\\\\.json'}).query();\n      });\n      it('should work with get() if dynamic params', function() {\n        $httpBackend.expect('GET', '/users/.json').respond();\n        $resource('/users/:json', {json: '\\\\.json'}).get();\n      });\n    });\n  });\n\n  describe('action-level url override', function() {\n\n    it('should support overriding url template with static url', function() {\n      $httpBackend.expect('GET', '/override-url?type=Customer&typeId=123').respond({id: 'abc'});\n      var TypeItem = $resource('/:type/:typeId', {type: 'Order'}, {\n        get: {\n          method: 'GET',\n          params: {type: 'Customer'},\n          url: '/override-url'\n        }\n      });\n      var item = TypeItem.get({typeId: 123});\n      $httpBackend.flush();\n      expect(item).toEqualData({id: 'abc'});\n    });\n\n\n    it('should support overriding url template with a new template ending in param', function() {\n      //    url parameter in action, parameter ending the string\n      $httpBackend.expect('GET', '/Customer/123').respond({id: 'abc'});\n      var TypeItem = $resource('/foo/:type', {type: 'Order'}, {\n        get: {\n          method: 'GET',\n          params: {type: 'Customer'},\n          url: '/:type/:typeId'\n        }\n      });\n      var item = TypeItem.get({typeId: 123});\n      $httpBackend.flush();\n      expect(item).toEqualData({id: 'abc'});\n\n      //    url parameter in action, parameter not ending the string\n      $httpBackend.expect('GET', '/Customer/123/pay').respond({id: 'abc'});\n      TypeItem = $resource('/foo/:type', {type: 'Order'}, {\n        get: {\n          method: 'GET',\n          params: {type: 'Customer'},\n          url: '/:type/:typeId/pay'\n        }\n      });\n      item = TypeItem.get({typeId: 123});\n      $httpBackend.flush();\n      expect(item).toEqualData({id: 'abc'});\n    });\n\n\n    it('should support overriding url template with a new template ending in string', function() {\n      $httpBackend.expect('GET', '/Customer/123/pay').respond({id: 'abc'});\n      var TypeItem = $resource('/foo/:type', {type: 'Order'}, {\n        get: {\n          method: 'GET',\n          params: {type: 'Customer'},\n          url: '/:type/:typeId/pay'\n        }\n      });\n      var item = TypeItem.get({typeId: 123});\n      $httpBackend.flush();\n      expect(item).toEqualData({id: 'abc'});\n    });\n  });\n});\n\ndescribe('extra params', function() {\n  var $http;\n  var $httpBackend;\n  var $resource;\n  var $rootScope;\n\n  beforeEach(module('ngResource'));\n\n  beforeEach(module(function($provide) {\n    $provide.decorator('$http', function($delegate) {\n      return jasmine.createSpy('$http').and.callFake($delegate);\n    });\n  }));\n\n  beforeEach(inject(function(_$http_, _$httpBackend_, _$resource_, _$rootScope_) {\n    $http = _$http_;\n    $httpBackend = _$httpBackend_;\n    $resource = _$resource_;\n    $rootScope = _$rootScope_;\n  }));\n\n  afterEach(function() {\n    $httpBackend.verifyNoOutstandingExpectation();\n  });\n\n\n  it('should pass extra params to `$http` as `config.params`', function() {\n    $httpBackend.expectGET('/bar?baz=qux').respond('{}');\n\n    var R = $resource('/:foo');\n    R.get({foo: 'bar', baz: 'qux'});\n\n    $rootScope.$digest();\n    expect($http).toHaveBeenCalledWith(jasmine.objectContaining({params: {baz: 'qux'}}));\n  });\n\n  it('should pass extra params even if `Object.prototype` has properties with the same name',\n    function() {\n      $httpBackend.expectGET('/foo?toString=bar').respond('{}');\n\n      var R = $resource('/foo');\n      R.get({toString: 'bar'});\n    }\n  );\n});\n\ndescribe('errors', function() {\n  var $httpBackend, $resource;\n\n  beforeEach(module(function($exceptionHandlerProvider) {\n    $exceptionHandlerProvider.mode('log');\n  }));\n\n  beforeEach(module('ngResource'));\n\n  beforeEach(inject(function($injector) {\n    $httpBackend = $injector.get('$httpBackend');\n    $resource = $injector.get('$resource');\n  }));\n\n\n  it('should fail if action expects an object but response is an array', function() {\n    var successSpy = jasmine.createSpy('successSpy');\n    var failureSpy = jasmine.createSpy('failureSpy');\n\n    $httpBackend.expect('GET', '/Customer/123').respond({id: 'abc'});\n\n    $resource('/Customer/123').query()\n      .$promise.then(successSpy, function(e) { failureSpy(e.message); });\n    $httpBackend.flush();\n\n    expect(successSpy).not.toHaveBeenCalled();\n    expect(failureSpy).toHaveBeenCalled();\n    expect(failureSpy.calls.mostRecent().args[0]).toEqualMinErr('$resource', 'badcfg',\n        'Error in resource configuration for action `query`. ' +\n        'Expected response to contain an array but got an object (Request: GET /Customer/123)');\n  });\n\n  it('should fail if action expects an array but response is an object', function() {\n    var successSpy = jasmine.createSpy('successSpy');\n    var failureSpy = jasmine.createSpy('failureSpy');\n\n    $httpBackend.expect('GET', '/Customer/123').respond([1,2,3]);\n\n    $resource('/Customer/123').get()\n      .$promise.then(successSpy, function(e) { failureSpy(e.message); });\n    $httpBackend.flush();\n\n    expect(successSpy).not.toHaveBeenCalled();\n    expect(failureSpy).toHaveBeenCalled();\n    expect(failureSpy.calls.mostRecent().args[0]).toEqualMinErr('$resource', 'badcfg',\n        'Error in resource configuration for action `get`. ' +\n        'Expected response to contain an object but got an array (Request: GET /Customer/123)');\n  });\n});\n\ndescribe('handling rejections', function() {\n  var $exceptionHandler;\n  var $httpBackend;\n  var $resource;\n\n  beforeEach(module('ngResource'));\n  beforeEach(module(function($exceptionHandlerProvider) {\n    $exceptionHandlerProvider.mode('log');\n  }));\n\n  beforeEach(inject(function(_$exceptionHandler_, _$httpBackend_, _$resource_) {\n    $exceptionHandler = _$exceptionHandler_;\n    $httpBackend = _$httpBackend_;\n    $resource = _$resource_;\n\n    $httpBackend.whenGET('/CreditCard').respond(404);\n  }));\n\n\n  it('should reject the promise even when there is an error callback', function() {\n    var errorCb1 = jasmine.createSpy('errorCb1');\n    var errorCb2 = jasmine.createSpy('errorCb2');\n    var CreditCard = $resource('/CreditCard');\n\n    CreditCard.get(noop, errorCb1).$promise.catch(errorCb2);\n    $httpBackend.flush();\n\n    expect(errorCb1).toHaveBeenCalledOnce();\n    expect(errorCb2).toHaveBeenCalledOnce();\n  });\n\n\n  it('should report a PUR when no error callback or responseError interceptor is provided',\n    function() {\n      var CreditCard = $resource('/CreditCard');\n\n      CreditCard.get();\n      $httpBackend.flush();\n\n      expect($exceptionHandler.errors.length).toBe(1);\n      expect($exceptionHandler.errors[0]).toMatch(/^Possibly unhandled rejection/);\n    }\n  );\n\n\n  it('should not report a PUR when an error callback or responseError interceptor is provided',\n    function() {\n      var CreditCard = $resource('/CreditCard', {}, {\n        test1: {\n          method: 'GET'\n        },\n        test2: {\n          method: 'GET',\n          interceptor: {responseError: function() { return {}; }}\n        }\n      });\n\n      // With error callback\n      CreditCard.test1(noop, noop);\n      $httpBackend.flush();\n\n      expect($exceptionHandler.errors.length).toBe(0);\n\n      // With responseError interceptor\n      CreditCard.test2();\n      $httpBackend.flush();\n\n      expect($exceptionHandler.errors.length).toBe(0);\n\n      // With error callback and responseError interceptor\n      CreditCard.test2(noop, noop);\n      $httpBackend.flush();\n\n      expect($exceptionHandler.errors.length).toBe(0);\n    }\n  );\n\n\n  it('should report a PUR when the responseError interceptor returns a rejected promise',\n    inject(function($q) {\n      var CreditCard = $resource('/CreditCard', {}, {\n        test: {\n          method: 'GET',\n          interceptor: {responseError: function() { return $q.reject({}); }}\n        }\n      });\n\n      CreditCard.test();\n      $httpBackend.flush();\n\n      expect($exceptionHandler.errors.length).toBe(1);\n      expect($exceptionHandler.errors[0]).toMatch(/^Possibly unhandled rejection/);\n    })\n  );\n\n\n  it('should not swallow exceptions in success callback when error callback is provided',\n    function() {\n      $httpBackend.expectGET('/CreditCard/123').respond(null);\n      var CreditCard = $resource('/CreditCard/:id');\n      CreditCard.get({id: 123},\n          function(res) { throw new Error('should be caught'); },\n          function() {});\n\n      $httpBackend.flush();\n      expect($exceptionHandler.errors.length).toBe(1);\n      expect($exceptionHandler.errors[0]).toMatch(/^Error: should be caught/);\n    }\n  );\n\n\n  it('should not swallow exceptions in success callback when error callback is not provided',\n    function() {\n      $httpBackend.expectGET('/CreditCard/123').respond(null);\n      var CreditCard = $resource('/CreditCard/:id');\n      CreditCard.get({id: 123},\n          function(res) { throw new Error('should be caught'); });\n\n      $httpBackend.flush();\n      expect($exceptionHandler.errors.length).toBe(1);\n      expect($exceptionHandler.errors[0]).toMatch(/^Error: should be caught/);\n    }\n  );\n\n\n  it('should not swallow exceptions in success callback when error callback is provided and has responseError interceptor',\n    function() {\n      $httpBackend.expectGET('/CreditCard/123').respond(null);\n      var CreditCard = $resource('/CreditCard/:id', null, {\n        get: {\n          method: 'GET',\n          interceptor: {responseError: function() {}}\n        }\n      });\n\n      CreditCard.get({id: 123},\n          function(res) { throw new Error('should be caught'); },\n          function() {});\n\n      $httpBackend.flush();\n      expect($exceptionHandler.errors.length).toBe(1);\n      expect($exceptionHandler.errors[0]).toMatch(/^Error: should be caught/);\n    }\n  );\n\n\n  it('should not swallow exceptions in success callback when error callback is not provided and has responseError interceptor',\n    function() {\n      $httpBackend.expectGET('/CreditCard/123').respond(null);\n      var CreditCard = $resource('/CreditCard/:id', null, {\n        get: {\n          method: 'GET',\n          interceptor: {responseError: function() {}}\n        }\n      });\n\n      CreditCard.get({id: 123},\n          function(res) { throw new Error('should be caught'); });\n\n      $httpBackend.flush();\n      expect($exceptionHandler.errors.length).toBe(1);\n      expect($exceptionHandler.errors[0]).toMatch(/^Error: should be caught/);\n    }\n  );\n\n\n  it('should not propagate exceptions in success callback to the returned promise', function() {\n    var successCallbackSpy = jasmine.createSpy('successCallback').and.throwError('error');\n    var promiseResolveSpy = jasmine.createSpy('promiseResolve');\n    var promiseRejectSpy = jasmine.createSpy('promiseReject');\n\n    $httpBackend.expectGET('/CreditCard/123').respond(null);\n    var CreditCard = $resource('/CreditCard/:id');\n    CreditCard.get({id: 123}, successCallbackSpy).\n      $promise.then(promiseResolveSpy, promiseRejectSpy);\n\n    $httpBackend.flush();\n    expect(successCallbackSpy).toHaveBeenCalled();\n    expect(promiseResolveSpy).toHaveBeenCalledWith(jasmine.any(CreditCard));\n    expect(promiseRejectSpy).not.toHaveBeenCalled();\n  });\n\n\n  it('should not be able to recover from inside the error callback', function() {\n    var errorCallbackSpy = jasmine.createSpy('errorCallback').and.returnValue({id: 123});\n    var promiseResolveSpy = jasmine.createSpy('promiseResolve');\n    var promiseRejectSpy = jasmine.createSpy('promiseReject');\n\n    $httpBackend.expectGET('/CreditCard/123').respond(404);\n    var CreditCard = $resource('/CreditCard/:id');\n    CreditCard.get({id: 123}, noop, errorCallbackSpy).\n      $promise.then(promiseResolveSpy, promiseRejectSpy);\n\n    $httpBackend.flush();\n    expect(errorCallbackSpy).toHaveBeenCalled();\n    expect(promiseResolveSpy).not.toHaveBeenCalled();\n    expect(promiseRejectSpy).toHaveBeenCalledWith(jasmine.objectContaining({status: 404}));\n  });\n\n\n  describe('requestInterceptor', function() {\n    var rejectReason = {'lol':'cat'};\n    var $q, $rootScope;\n    var successSpy, failureSpy, callback;\n\n    beforeEach(inject(function(_$q_, _$rootScope_) {\n      $q = _$q_;\n      $rootScope = _$rootScope_;\n\n      successSpy = jasmine.createSpy('successSpy');\n      failureSpy = jasmine.createSpy('failureSpy');\n      callback = jasmine.createSpy();\n    }));\n\n    it('should call requestErrorInterceptor if requestInterceptor throws an error', function() {\n      var CreditCard = $resource('/CreditCard', {}, {\n        query: {\n          method: 'get',\n          isArray: true,\n          interceptor: {\n            request: function() {\n              throw rejectReason;\n            },\n            requestError: function(rejection) {\n              callback(rejection);\n              return $q.reject(rejection);\n            }\n          }\n        }\n      });\n\n      var resource = CreditCard.query();\n      resource.$promise.then(successSpy, failureSpy);\n      $rootScope.$apply();\n\n      expect(callback).toHaveBeenCalledOnce();\n      expect(callback).toHaveBeenCalledWith(rejectReason);\n      expect(successSpy).not.toHaveBeenCalled();\n      expect(failureSpy).toHaveBeenCalledOnce();\n      expect(failureSpy).toHaveBeenCalledWith(rejectReason);\n\n      // Ensure that no requests were made.\n      $httpBackend.verifyNoOutstandingRequest();\n    });\n\n    it('should abort the operation if a requestErrorInterceptor throws an exception', function() {\n      var CreditCard = $resource('/CreditCard', {}, {\n        query: {\n          method: 'get',\n          isArray: true,\n          interceptor: {\n            request: function() {\n              return $q.reject();\n            },\n            requestError: function() {\n              throw rejectReason;\n            }\n          }\n        }\n      });\n\n      var resource = CreditCard.query();\n      resource.$promise.then(successSpy, failureSpy);\n      $rootScope.$apply();\n\n      expect(resource.$resolved).toBeTruthy();\n      expect(successSpy).not.toHaveBeenCalled();\n      expect(failureSpy).toHaveBeenCalledOnce();\n      expect(failureSpy).toHaveBeenCalledWith(rejectReason);\n\n      // Ensure that no requests were made.\n      $httpBackend.verifyNoOutstandingRequest();\n    });\n  });\n});\n\ndescribe('cancelling requests', function() {\n  var httpSpy;\n  var $httpBackend;\n  var $resource;\n  var $timeout;\n\n  beforeEach(module('ngResource', function($provide) {\n    $provide.decorator('$http', function($delegate) {\n      httpSpy = jasmine.createSpy('$http').and.callFake($delegate);\n      return httpSpy;\n    });\n  }));\n\n  beforeEach(inject(function(_$httpBackend_, _$resource_, _$timeout_) {\n    $httpBackend = _$httpBackend_;\n    $resource = _$resource_;\n    $timeout = _$timeout_;\n  }));\n\n  it('should accept numeric timeouts in actions and pass them to $http', function() {\n    $httpBackend.whenGET('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        timeout: 10000\n      }\n    });\n\n    CreditCard.get();\n    $httpBackend.flush();\n\n    expect(httpSpy).toHaveBeenCalledOnce();\n    expect(httpSpy.calls.argsFor(0)[0].timeout).toBe(10000);\n  });\n\n  it('should delete non-numeric timeouts in actions and log a $debug message',\n    inject(function($log, $q) {\n      spyOn($log, 'debug');\n      $httpBackend.whenGET('/CreditCard').respond({});\n\n      var CreditCard = $resource('/CreditCard', {}, {\n        get: {\n          method: 'GET',\n          timeout: $q.defer().promise\n        }\n      });\n\n      CreditCard.get();\n      $httpBackend.flush();\n\n      expect(httpSpy).toHaveBeenCalledOnce();\n      expect(httpSpy.calls.argsFor(0)[0].timeout).toBeUndefined();\n      expect($log.debug).toHaveBeenCalledOnceWith('ngResource:\\n' +\n          '  Only numeric values are allowed as `timeout`.\\n' +\n          '  Promises are not supported in $resource, because the same value would ' +\n          'be used for multiple requests. If you are looking for a way to cancel ' +\n          'requests, you should use the `cancellable` option.');\n    })\n  );\n\n  it('should use `cancellable` value if passed a non-numeric `timeout` in an action',\n    inject(function($log, $q, $rootScope) {\n      spyOn($log, 'debug');\n      $httpBackend.whenGET('/CreditCard').respond({});\n\n      var CreditCard = $resource('/CreditCard', {}, {\n        get: {\n          method: 'GET',\n          timeout: $q.defer().promise,\n          cancellable: true\n        }\n      });\n\n      var creditCard = CreditCard.get();\n      $rootScope.$digest();\n      expect(creditCard.$cancelRequest).toBeDefined();\n      expect(httpSpy.calls.argsFor(0)[0].timeout).toEqual(jasmine.any($q));\n      expect(httpSpy.calls.argsFor(0)[0].timeout.then).toBeDefined();\n\n      expect($log.debug).toHaveBeenCalledOnceWith('ngResource:\\n' +\n          '  Only numeric values are allowed as `timeout`.\\n' +\n          '  Promises are not supported in $resource, because the same value would ' +\n          'be used for multiple requests. If you are looking for a way to cancel ' +\n          'requests, you should use the `cancellable` option.');\n    })\n  );\n\n  it('should not create a `$cancelRequest` method for instance calls', function() {\n    $httpBackend.whenPOST('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      save1: {\n        method: 'POST',\n        cancellable: false\n      },\n      save2: {\n        method: 'POST',\n        cancellable: true\n      }\n    });\n\n    var creditCard = new CreditCard();\n\n    var promise1 = creditCard.$save1();\n    expect(promise1.$cancelRequest).toBeUndefined();\n    expect(creditCard.$cancelRequest).toBeUndefined();\n\n    var promise2 = creditCard.$save2();\n    expect(promise2.$cancelRequest).toBeUndefined();\n    expect(creditCard.$cancelRequest).toBeUndefined();\n\n    $httpBackend.flush();\n    expect(promise1.$cancelRequest).toBeUndefined();\n    expect(promise2.$cancelRequest).toBeUndefined();\n    expect(creditCard.$cancelRequest).toBeUndefined();\n  });\n\n  it('should not create a `$cancelRequest` method for non-cancellable calls', function() {\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        cancellable: false\n      }\n    });\n\n    var creditCard = CreditCard.get();\n\n    expect(creditCard.$cancelRequest).toBeUndefined();\n  });\n\n  it('should also take into account `options.cancellable`', function() {\n    var options = {cancellable: true};\n    var CreditCard = $resource('/CreditCard', {}, {\n      get1: {method: 'GET', cancellable: false},\n      get2: {method: 'GET', cancellable: true},\n      get3: {method: 'GET'}\n    }, options);\n\n    var creditCard1 = CreditCard.get1();\n    var creditCard2 = CreditCard.get2();\n    var creditCard3 = CreditCard.get3();\n\n    expect(creditCard1.$cancelRequest).toBeUndefined();\n    expect(creditCard2.$cancelRequest).toBeDefined();\n    expect(creditCard3.$cancelRequest).toBeDefined();\n\n    options = {cancellable: false};\n    CreditCard = $resource('/CreditCard', {}, {\n      get1: {method: 'GET', cancellable: false},\n      get2: {method: 'GET', cancellable: true},\n      get3: {method: 'GET'}\n    }, options);\n\n    creditCard1 = CreditCard.get1();\n    creditCard2 = CreditCard.get2();\n    creditCard3 = CreditCard.get3();\n\n    expect(creditCard1.$cancelRequest).toBeUndefined();\n    expect(creditCard2.$cancelRequest).toBeDefined();\n    expect(creditCard3.$cancelRequest).toBeUndefined();\n  });\n\n  it('should accept numeric timeouts in cancellable actions and cancel the request when timeout occurs', function() {\n    $httpBackend.whenGET('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        timeout: 10000,\n        cancellable: true\n      }\n    });\n\n    var ccs = CreditCard.get();\n    ccs.$promise.catch(noop);\n    $timeout.flush();\n    expect($httpBackend.flush).toThrow(new Error('No pending request to flush !'));\n\n    CreditCard.get();\n    expect($httpBackend.flush).not.toThrow();\n\n  });\n\n  it('should cancel the request (if cancellable), when calling `$cancelRequest`', function() {\n    $httpBackend.whenGET('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        cancellable: true\n      }\n    });\n\n    var ccs = CreditCard.get();\n    ccs.$cancelRequest();\n    expect($httpBackend.flush).toThrow(new Error('No pending request to flush !'));\n\n    CreditCard.get();\n    expect($httpBackend.flush).not.toThrow();\n  });\n\n  it('should cancel the request, when calling `$cancelRequest` in cancellable actions with timeout defined', function() {\n    $httpBackend.whenGET('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        timeout: 10000,\n        cancellable: true\n      }\n    });\n\n    var ccs = CreditCard.get();\n    ccs.$cancelRequest();\n    expect($httpBackend.flush).toThrow(new Error('No pending request to flush !'));\n\n    CreditCard.get();\n    expect($httpBackend.flush).not.toThrow();\n  });\n\n  it('should reset `$cancelRequest` after the response arrives', function() {\n    $httpBackend.whenGET('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        cancellable: true\n      }\n    });\n\n    var creditCard = CreditCard.get();\n\n    expect(creditCard.$cancelRequest).not.toBe(noop);\n\n    $httpBackend.flush();\n\n    expect(creditCard.$cancelRequest).toBe(noop);\n  });\n\n  it('should not break when calling old `$cancelRequest` after the response arrives', function() {\n    $httpBackend.whenGET('/CreditCard').respond({});\n\n    var CreditCard = $resource('/CreditCard', {}, {\n      get: {\n        method: 'GET',\n        cancellable: true\n      }\n    });\n\n    var creditCard = CreditCard.get();\n    var cancelRequest = creditCard.$cancelRequest;\n\n    $httpBackend.flush();\n\n    expect(cancelRequest).not.toBe(noop);\n    expect(cancelRequest).not.toThrow();\n  });\n});\n\ndescribe('configuring `cancellable` on the provider', function() {\n  var $resource;\n\n  beforeEach(module('ngResource', function($resourceProvider) {\n    $resourceProvider.defaults.cancellable = true;\n  }));\n\n  beforeEach(inject(function(_$resource_) {\n    $resource = _$resource_;\n  }));\n\n  it('should also take into account `$resourceProvider.defaults.cancellable`', function() {\n    var CreditCard = $resource('/CreditCard', {}, {\n      get1: {method: 'GET', cancellable: false},\n      get2: {method: 'GET', cancellable: true},\n      get3: {method: 'GET'}\n    });\n\n    var creditCard1 = CreditCard.get1();\n    var creditCard2 = CreditCard.get2();\n    var creditCard3 = CreditCard.get3();\n\n    expect(creditCard1.$cancelRequest).toBeUndefined();\n    expect(creditCard2.$cancelRequest).toBeDefined();\n    expect(creditCard3.$cancelRequest).toBeDefined();\n  });\n});\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-route.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {\n\nvar ELEMENT_NODE = 1;\nvar COMMENT_NODE = 8;\n\nvar ADD_CLASS_SUFFIX = '-add';\nvar REMOVE_CLASS_SUFFIX = '-remove';\nvar EVENT_CLASS_PREFIX = 'ng-';\nvar ACTIVE_CLASS_SUFFIX = '-active';\nvar PREPARE_CLASS_SUFFIX = '-prepare';\n\nvar NG_ANIMATE_CLASSNAME = 'ng-animate';\nvar NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren';\n\n// Detect proper transitionend/animationend event names.\nvar CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;\n\n// If unprefixed events are not supported but webkit-prefixed are, use the latter.\n// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.\n// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`\n// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.\n// Register both events in case `window.onanimationend` is not supported because of that,\n// do the same for `transitionend` as Safari is likely to exhibit similar behavior.\n// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit\n// therefore there is no reason to test anymore for other vendor prefixes:\n// http://caniuse.com/#search=transition\nif ((window.ontransitionend === undefined) && (window.onwebkittransitionend !== undefined)) {\n  CSS_PREFIX = '-webkit-';\n  TRANSITION_PROP = 'WebkitTransition';\n  TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';\n} else {\n  TRANSITION_PROP = 'transition';\n  TRANSITIONEND_EVENT = 'transitionend';\n}\n\nif ((window.onanimationend === undefined) && (window.onwebkitanimationend !== undefined)) {\n  CSS_PREFIX = '-webkit-';\n  ANIMATION_PROP = 'WebkitAnimation';\n  ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';\n} else {\n  ANIMATION_PROP = 'animation';\n  ANIMATIONEND_EVENT = 'animationend';\n}\n\nvar DURATION_KEY = 'Duration';\nvar PROPERTY_KEY = 'Property';\nvar DELAY_KEY = 'Delay';\nvar TIMING_KEY = 'TimingFunction';\nvar ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';\nvar ANIMATION_PLAYSTATE_KEY = 'PlayState';\nvar SAFE_FAST_FORWARD_DURATION_VALUE = 9999;\n\nvar ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY;\nvar ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY;\nvar TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY;\nvar TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY;\n\nvar ngMinErr = angular.$$minErr('ng');\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', 'Argument \\'{0}\\' is {1}', (name || '?'), (reason || 'required'));\n  }\n  return arg;\n}\n\nfunction mergeClasses(a,b) {\n  if (!a && !b) return '';\n  if (!a) return b;\n  if (!b) return a;\n  if (isArray(a)) a = a.join(' ');\n  if (isArray(b)) b = b.join(' ');\n  return a + ' ' + b;\n}\n\nfunction packageStyles(options) {\n  var styles = {};\n  if (options && (options.to || options.from)) {\n    styles.to = options.to;\n    styles.from = options.from;\n  }\n  return styles;\n}\n\nfunction pendClasses(classes, fix, isPrefix) {\n  var className = '';\n  classes = isArray(classes)\n      ? classes\n      : classes && isString(classes) && classes.length\n          ? classes.split(/\\s+/)\n          : [];\n  forEach(classes, function(klass, i) {\n    if (klass && klass.length > 0) {\n      className += (i > 0) ? ' ' : '';\n      className += isPrefix ? fix + klass\n                            : klass + fix;\n    }\n  });\n  return className;\n}\n\nfunction removeFromArray(arr, val) {\n  var index = arr.indexOf(val);\n  if (val >= 0) {\n    arr.splice(index, 1);\n  }\n}\n\nfunction stripCommentsFromElement(element) {\n  if (element instanceof jqLite) {\n    switch (element.length) {\n      case 0:\n        return element;\n\n      case 1:\n        // there is no point of stripping anything if the element\n        // is the only element within the jqLite wrapper.\n        // (it's important that we retain the element instance.)\n        if (element[0].nodeType === ELEMENT_NODE) {\n          return element;\n        }\n        break;\n\n      default:\n        return jqLite(extractElementNode(element));\n    }\n  }\n\n  if (element.nodeType === ELEMENT_NODE) {\n    return jqLite(element);\n  }\n}\n\nfunction extractElementNode(element) {\n  if (!element[0]) return element;\n  for (var i = 0; i < element.length; i++) {\n    var elm = element[i];\n    if (elm.nodeType === ELEMENT_NODE) {\n      return elm;\n    }\n  }\n}\n\nfunction $$addClass($$jqLite, element, className) {\n  forEach(element, function(elm) {\n    $$jqLite.addClass(elm, className);\n  });\n}\n\nfunction $$removeClass($$jqLite, element, className) {\n  forEach(element, function(elm) {\n    $$jqLite.removeClass(elm, className);\n  });\n}\n\nfunction applyAnimationClassesFactory($$jqLite) {\n  return function(element, options) {\n    if (options.addClass) {\n      $$addClass($$jqLite, element, options.addClass);\n      options.addClass = null;\n    }\n    if (options.removeClass) {\n      $$removeClass($$jqLite, element, options.removeClass);\n      options.removeClass = null;\n    }\n  };\n}\n\nfunction prepareAnimationOptions(options) {\n  options = options || {};\n  if (!options.$$prepared) {\n    var domOperation = options.domOperation || noop;\n    options.domOperation = function() {\n      options.$$domOperationFired = true;\n      domOperation();\n      domOperation = noop;\n    };\n    options.$$prepared = true;\n  }\n  return options;\n}\n\nfunction applyAnimationStyles(element, options) {\n  applyAnimationFromStyles(element, options);\n  applyAnimationToStyles(element, options);\n}\n\nfunction applyAnimationFromStyles(element, options) {\n  if (options.from) {\n    element.css(options.from);\n    options.from = null;\n  }\n}\n\nfunction applyAnimationToStyles(element, options) {\n  if (options.to) {\n    element.css(options.to);\n    options.to = null;\n  }\n}\n\nfunction mergeAnimationDetails(element, oldAnimation, newAnimation) {\n  var target = oldAnimation.options || {};\n  var newOptions = newAnimation.options || {};\n\n  var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || '');\n  var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || '');\n  var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove);\n\n  if (newOptions.preparationClasses) {\n    target.preparationClasses = concatWithSpace(newOptions.preparationClasses, target.preparationClasses);\n    delete newOptions.preparationClasses;\n  }\n\n  // noop is basically when there is no callback; otherwise something has been set\n  var realDomOperation = target.domOperation !== noop ? target.domOperation : null;\n\n  extend(target, newOptions);\n\n  // TODO(matsko or sreeramu): proper fix is to maintain all animation callback in array and call at last,but now only leave has the callback so no issue with this.\n  if (realDomOperation) {\n    target.domOperation = realDomOperation;\n  }\n\n  if (classes.addClass) {\n    target.addClass = classes.addClass;\n  } else {\n    target.addClass = null;\n  }\n\n  if (classes.removeClass) {\n    target.removeClass = classes.removeClass;\n  } else {\n    target.removeClass = null;\n  }\n\n  oldAnimation.addClass = target.addClass;\n  oldAnimation.removeClass = target.removeClass;\n\n  return target;\n}\n\nfunction resolveElementClasses(existing, toAdd, toRemove) {\n  var ADD_CLASS = 1;\n  var REMOVE_CLASS = -1;\n\n  var flags = {};\n  existing = splitClassesToLookup(existing);\n\n  toAdd = splitClassesToLookup(toAdd);\n  forEach(toAdd, function(value, key) {\n    flags[key] = ADD_CLASS;\n  });\n\n  toRemove = splitClassesToLookup(toRemove);\n  forEach(toRemove, function(value, key) {\n    flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS;\n  });\n\n  var classes = {\n    addClass: '',\n    removeClass: ''\n  };\n\n  forEach(flags, function(val, klass) {\n    var prop, allow;\n    if (val === ADD_CLASS) {\n      prop = 'addClass';\n      allow = !existing[klass] || existing[klass + REMOVE_CLASS_SUFFIX];\n    } else if (val === REMOVE_CLASS) {\n      prop = 'removeClass';\n      allow = existing[klass] || existing[klass + ADD_CLASS_SUFFIX];\n    }\n    if (allow) {\n      if (classes[prop].length) {\n        classes[prop] += ' ';\n      }\n      classes[prop] += klass;\n    }\n  });\n\n  function splitClassesToLookup(classes) {\n    if (isString(classes)) {\n      classes = classes.split(' ');\n    }\n\n    var obj = {};\n    forEach(classes, function(klass) {\n      // sometimes the split leaves empty string values\n      // incase extra spaces were applied to the options\n      if (klass.length) {\n        obj[klass] = true;\n      }\n    });\n    return obj;\n  }\n\n  return classes;\n}\n\nfunction getDomNode(element) {\n  return (element instanceof jqLite) ? element[0] : element;\n}\n\nfunction applyGeneratedPreparationClasses($$jqLite, element, event, options) {\n  var classes = '';\n  if (event) {\n    classes = pendClasses(event, EVENT_CLASS_PREFIX, true);\n  }\n  if (options.addClass) {\n    classes = concatWithSpace(classes, pendClasses(options.addClass, ADD_CLASS_SUFFIX));\n  }\n  if (options.removeClass) {\n    classes = concatWithSpace(classes, pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX));\n  }\n  if (classes.length) {\n    options.preparationClasses = classes;\n    element.addClass(classes);\n  }\n}\n\nfunction clearGeneratedClasses(element, options) {\n  if (options.preparationClasses) {\n    element.removeClass(options.preparationClasses);\n    options.preparationClasses = null;\n  }\n  if (options.activeClasses) {\n    element.removeClass(options.activeClasses);\n    options.activeClasses = null;\n  }\n}\n\nfunction blockKeyframeAnimations(node, applyBlock) {\n  var value = applyBlock ? 'paused' : '';\n  var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY;\n  applyInlineStyle(node, [key, value]);\n  return [key, value];\n}\n\nfunction applyInlineStyle(node, styleTuple) {\n  var prop = styleTuple[0];\n  var value = styleTuple[1];\n  node.style[prop] = value;\n}\n\nfunction concatWithSpace(a,b) {\n  if (!a) return b;\n  if (!b) return a;\n  return a + ' ' + b;\n}\n\nvar helpers = {\n  blockTransitions: function(node, duration) {\n    // we use a negative delay value since it performs blocking\n    // yet it doesn't kill any existing transitions running on the\n    // same element which makes this safe for class-based animations\n    var value = duration ? '-' + duration + 's' : '';\n    applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]);\n    return [TRANSITION_DELAY_PROP, value];\n  }\n};\n\nvar $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {\n  var queue, cancelFn;\n\n  function scheduler(tasks) {\n    // we make a copy since RAFScheduler mutates the state\n    // of the passed in array variable and this would be difficult\n    // to track down on the outside code\n    queue = queue.concat(tasks);\n    nextTick();\n  }\n\n  queue = scheduler.queue = [];\n\n  /* waitUntilQuiet does two things:\n   * 1. It will run the FINAL `fn` value only when an uncanceled RAF has passed through\n   * 2. It will delay the next wave of tasks from running until the quiet `fn` has run.\n   *\n   * The motivation here is that animation code can request more time from the scheduler\n   * before the next wave runs. This allows for certain DOM properties such as classes to\n   * be resolved in time for the next animation to run.\n   */\n  scheduler.waitUntilQuiet = function(fn) {\n    if (cancelFn) cancelFn();\n\n    cancelFn = $$rAF(function() {\n      cancelFn = null;\n      fn();\n      nextTick();\n    });\n  };\n\n  return scheduler;\n\n  function nextTick() {\n    if (!queue.length) return;\n\n    var items = queue.shift();\n    for (var i = 0; i < items.length; i++) {\n      items[i]();\n    }\n\n    if (!cancelFn) {\n      $$rAF(function() {\n        if (!cancelFn) nextTick();\n      });\n    }\n  }\n}];\n\n/**\n * @ngdoc directive\n * @name ngAnimateChildren\n * @restrict AE\n * @element ANY\n *\n * @description\n *\n * ngAnimateChildren allows you to specify that children of this element should animate even if any\n * of the children's parents are currently animating. By default, when an element has an active `enter`, `leave`, or `move`\n * (structural) animation, child elements that also have an active structural animation are not animated.\n *\n * Note that even if `ngAnimateChildren` is set, no child animations will run when the parent element is removed from the DOM (`leave` animation).\n *\n *\n * @param {string} ngAnimateChildren If the value is empty, `true` or `on`,\n *     then child animations are allowed. If the value is `false`, child animations are not allowed.\n *\n * @example\n * <example module=\"ngAnimateChildren\" name=\"ngAnimateChildren\" deps=\"angular-animate.js\" animations=\"true\">\n     <file name=\"index.html\">\n       <div ng-controller=\"MainController as main\">\n         <label>Show container? <input type=\"checkbox\" ng-model=\"main.enterElement\" /></label>\n         <label>Animate children? <input type=\"checkbox\" ng-model=\"main.animateChildren\" /></label>\n         <hr>\n         <div ng-animate-children=\"{{main.animateChildren}}\">\n           <div ng-if=\"main.enterElement\" class=\"container\">\n             List of items:\n             <div ng-repeat=\"item in [0, 1, 2, 3]\" class=\"item\">Item {{item}}</div>\n           </div>\n         </div>\n       </div>\n     </file>\n     <file name=\"animations.css\">\n\n      .container.ng-enter,\n      .container.ng-leave {\n        transition: all ease 1.5s;\n      }\n\n      .container.ng-enter,\n      .container.ng-leave-active {\n        opacity: 0;\n      }\n\n      .container.ng-leave,\n      .container.ng-enter-active {\n        opacity: 1;\n      }\n\n      .item {\n        background: firebrick;\n        color: #FFF;\n        margin-bottom: 10px;\n      }\n\n      .item.ng-enter,\n      .item.ng-leave {\n        transition: transform 1.5s ease;\n      }\n\n      .item.ng-enter {\n        transform: translateX(50px);\n      }\n\n      .item.ng-enter-active {\n        transform: translateX(0);\n      }\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngAnimateChildren', ['ngAnimate'])\n        .controller('MainController', function MainController() {\n          this.animateChildren = false;\n          this.enterElement = false;\n        });\n    </file>\n  </example>\n */\nvar $$AnimateChildrenDirective = ['$interpolate', function($interpolate) {\n  return {\n    link: function(scope, element, attrs) {\n      var val = attrs.ngAnimateChildren;\n      if (isString(val) && val.length === 0) { //empty attribute\n        element.data(NG_ANIMATE_CHILDREN_DATA, true);\n      } else {\n        // Interpolate and set the value, so that it is available to\n        // animations that run right after compilation\n        setData($interpolate(val)(scope));\n        attrs.$observe('ngAnimateChildren', setData);\n      }\n\n      function setData(value) {\n        value = value === 'on' || value === 'true';\n        element.data(NG_ANIMATE_CHILDREN_DATA, value);\n      }\n    }\n  };\n}];\n\n/* exported $AnimateCssProvider */\n\nvar ANIMATE_TIMER_KEY = '$$animateCss';\n\n/**\n * @ngdoc service\n * @name $animateCss\n * @kind object\n *\n * @description\n * The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes\n * from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT\n * to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or\n * directives to create more complex animations that can be purely driven using CSS code.\n *\n * Note that only browsers that support CSS transitions and/or keyframe animations are capable of\n * rendering animations triggered via `$animateCss` (bad news for IE9 and lower).\n *\n * ## General Use\n * Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that\n * is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however,\n * any automatic control over cancelling animations and/or preventing animations from being run on\n * child elements will not be handled by AngularJS. For this to work as expected, please use `$animate` to\n * trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger\n * the CSS animation.\n *\n * The example below shows how we can create a folding animation on an element using `ng-if`:\n *\n * ```html\n * <!-- notice the `fold-animation` CSS class -->\n * <div ng-if=\"onOff\" class=\"fold-animation\">\n *   This element will go BOOM\n * </div>\n * <button ng-click=\"onOff=true\">Fold In</button>\n * ```\n *\n * Now we create the **JavaScript animation** that will trigger the CSS transition:\n *\n * ```js\n * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element, doneFn) {\n *       var height = element[0].offsetHeight;\n *       return $animateCss(element, {\n *         from: { height:'0px' },\n *         to: { height:height + 'px' },\n *         duration: 1 // one second\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * ## More Advanced Uses\n *\n * `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks\n * like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code.\n *\n * This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation,\n * applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with\n * `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order\n * to provide a working animation that will run in CSS.\n *\n * The example below showcases a more advanced version of the `.fold-animation` from the example above:\n *\n * ```js\n * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element, doneFn) {\n *       var height = element[0].offsetHeight;\n *       return $animateCss(element, {\n *         addClass: 'red large-text pulse-twice',\n *         easing: 'ease-out',\n *         from: { height:'0px' },\n *         to: { height:height + 'px' },\n *         duration: 1 // one second\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * Since we're adding/removing CSS classes then the CSS transition will also pick those up:\n *\n * ```css\n * /&#42; since a hardcoded duration value of 1 was provided in the JavaScript animation code,\n * the CSS classes below will be transitioned despite them being defined as regular CSS classes &#42;/\n * .red { background:red; }\n * .large-text { font-size:20px; }\n *\n * /&#42; we can also use a keyframe animation and $animateCss will make it work alongside the transition &#42;/\n * .pulse-twice {\n *   animation: 0.5s pulse linear 2;\n *   -webkit-animation: 0.5s pulse linear 2;\n * }\n *\n * @keyframes pulse {\n *   from { transform: scale(0.5); }\n *   to { transform: scale(1.5); }\n * }\n *\n * @-webkit-keyframes pulse {\n *   from { -webkit-transform: scale(0.5); }\n *   to { -webkit-transform: scale(1.5); }\n * }\n * ```\n *\n * Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen.\n *\n * ## How the Options are handled\n *\n * `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation\n * works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline\n * styles using the `from` and `to` properties.\n *\n * ```js\n * var animator = $animateCss(element, {\n *   from: { background:'red' },\n *   to: { background:'blue' }\n * });\n * animator.start();\n * ```\n *\n * ```css\n * .rotating-animation {\n *   animation:0.5s rotate linear;\n *   -webkit-animation:0.5s rotate linear;\n * }\n *\n * @keyframes rotate {\n *   from { transform: rotate(0deg); }\n *   to { transform: rotate(360deg); }\n * }\n *\n * @-webkit-keyframes rotate {\n *   from { -webkit-transform: rotate(0deg); }\n *   to { -webkit-transform: rotate(360deg); }\n * }\n * ```\n *\n * The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is\n * going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition\n * style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition\n * and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied\n * and spread across the transition and keyframe animation.\n *\n * ## What is returned\n *\n * `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually\n * start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are\n * added and removed on the element). Once `$animateCss` is called it will return an object with the following properties:\n *\n * ```js\n * var animator = $animateCss(element, { ... });\n * ```\n *\n * Now what do the contents of our `animator` variable look like:\n *\n * ```js\n * {\n *   // starts the animation\n *   start: Function,\n *\n *   // ends (aborts) the animation\n *   end: Function\n * }\n * ```\n *\n * To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends.\n * If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and styles may have been\n * applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties\n * and that changing them will not reconfigure the parameters of the animation.\n *\n * ### runner.done() vs runner.then()\n * It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the\n * runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**.\n * Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()`\n * unless you really need a digest to kick off afterwards.\n *\n * Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss\n * (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code).\n * Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works.\n *\n * @param {DOMElement} element the element that will be animated\n * @param {object} options the animation-related options that will be applied during the animation\n *\n * * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied\n * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.)\n * * `structural` - Indicates that the `ng-` prefix will be added to the event class. Setting to `false` or omitting will turn `ng-EVENT` and\n * `ng-EVENT-active` in `EVENT` and `EVENT-active`. Unused if `event` is omitted.\n * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both).\n * * `transitionStyle` - The raw CSS transition style that will be used (e.g. `1s linear all`).\n * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`).\n * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation.\n * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition.\n * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation.\n * * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation.\n * * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0`\n * is provided then the animation will be skipped entirely.\n * * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is\n * used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value\n * of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same\n * CSS delay value.\n * * `stagger` - A numeric time value representing the delay between successively animated elements\n * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.})\n * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a\n *   `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)\n * * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occurring on the classes being added and removed.)\n * * `cleanupStyles` - Whether or not the provided `from` and `to` styles will be removed once\n *    the animation is closed. This is useful for when the styles are used purely for the sake of\n *    the animation and do not have a lasting visual effect on the element (e.g. a collapse and open animation).\n *    By default this value is set to `false`.\n *\n * @return {object} an object with start and end methods and details about the animation.\n *\n * * `start` - The method to start the animation. This will return a `Promise` when called.\n * * `end` - This method will cancel the animation and remove all applied CSS classes and styles.\n */\nvar ONE_SECOND = 1000;\n\nvar ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\nvar CLOSING_TIME_BUFFER = 1.5;\n\nvar DETECT_CSS_PROPERTIES = {\n  transitionDuration:      TRANSITION_DURATION_PROP,\n  transitionDelay:         TRANSITION_DELAY_PROP,\n  transitionProperty:      TRANSITION_PROP + PROPERTY_KEY,\n  animationDuration:       ANIMATION_DURATION_PROP,\n  animationDelay:          ANIMATION_DELAY_PROP,\n  animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY\n};\n\nvar DETECT_STAGGER_CSS_PROPERTIES = {\n  transitionDuration:      TRANSITION_DURATION_PROP,\n  transitionDelay:         TRANSITION_DELAY_PROP,\n  animationDuration:       ANIMATION_DURATION_PROP,\n  animationDelay:          ANIMATION_DELAY_PROP\n};\n\nfunction getCssKeyframeDurationStyle(duration) {\n  return [ANIMATION_DURATION_PROP, duration + 's'];\n}\n\nfunction getCssDelayStyle(delay, isKeyframeAnimation) {\n  var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP;\n  return [prop, delay + 's'];\n}\n\nfunction computeCssStyles($window, element, properties) {\n  var styles = Object.create(null);\n  var detectedStyles = $window.getComputedStyle(element) || {};\n  forEach(properties, function(formalStyleName, actualStyleName) {\n    var val = detectedStyles[formalStyleName];\n    if (val) {\n      var c = val.charAt(0);\n\n      // only numerical-based values have a negative sign or digit as the first value\n      if (c === '-' || c === '+' || c >= 0) {\n        val = parseMaxTime(val);\n      }\n\n      // by setting this to null in the event that the delay is not set or is set directly as 0\n      // then we can still allow for negative values to be used later on and not mistake this\n      // value for being greater than any other negative value.\n      if (val === 0) {\n        val = null;\n      }\n      styles[actualStyleName] = val;\n    }\n  });\n\n  return styles;\n}\n\nfunction parseMaxTime(str) {\n  var maxValue = 0;\n  var values = str.split(/\\s*,\\s*/);\n  forEach(values, function(value) {\n    // it's always safe to consider only second values and omit `ms` values since\n    // getComputedStyle will always handle the conversion for us\n    if (value.charAt(value.length - 1) === 's') {\n      value = value.substring(0, value.length - 1);\n    }\n    value = parseFloat(value) || 0;\n    maxValue = maxValue ? Math.max(value, maxValue) : value;\n  });\n  return maxValue;\n}\n\nfunction truthyTimingValue(val) {\n  return val === 0 || val != null;\n}\n\nfunction getCssTransitionDurationStyle(duration, applyOnlyDuration) {\n  var style = TRANSITION_PROP;\n  var value = duration + 's';\n  if (applyOnlyDuration) {\n    style += DURATION_KEY;\n  } else {\n    value += ' linear all';\n  }\n  return [style, value];\n}\n\n// we do not reassign an already present style value since\n// if we detect the style property value again we may be\n// detecting styles that were added via the `from` styles.\n// We make use of `isDefined` here since an empty string\n// or null value (which is what getPropertyValue will return\n// for a non-existing style) will still be marked as a valid\n// value for the style (a falsy value implies that the style\n// is to be removed at the end of the animation). If we had a simple\n// \"OR\" statement then it would not be enough to catch that.\nfunction registerRestorableStyles(backup, node, properties) {\n  forEach(properties, function(prop) {\n    backup[prop] = isDefined(backup[prop])\n        ? backup[prop]\n        : node.style.getPropertyValue(prop);\n  });\n}\n\nvar $AnimateCssProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n\n  this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout', '$$animateCache',\n               '$$forceReflow', '$sniffer', '$$rAFScheduler', '$$animateQueue',\n       function($window,   $$jqLite,   $$AnimateRunner,   $timeout,   $$animateCache,\n                $$forceReflow,   $sniffer,   $$rAFScheduler, $$animateQueue) {\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function computeCachedCssStyles(node, className, cacheKey, allowNoDuration, properties) {\n      var timings = $$animateCache.get(cacheKey);\n\n      if (!timings) {\n        timings = computeCssStyles($window, node, properties);\n        if (timings.animationIterationCount === 'infinite') {\n          timings.animationIterationCount = 1;\n        }\n      }\n\n      // if a css animation has no duration we\n      // should mark that so that repeated addClass/removeClass calls are skipped\n      var hasDuration = allowNoDuration || (timings.transitionDuration > 0 || timings.animationDuration > 0);\n\n      // we keep putting this in multiple times even though the value and the cacheKey are the same\n      // because we're keeping an internal tally of how many duplicate animations are detected.\n      $$animateCache.put(cacheKey, timings, hasDuration);\n\n      return timings;\n    }\n\n    function computeCachedCssStaggerStyles(node, className, cacheKey, properties) {\n      var stagger;\n      var staggerCacheKey = 'stagger-' + cacheKey;\n\n      // if we have one or more existing matches of matching elements\n      // containing the same parent + CSS styles (which is how cacheKey works)\n      // then staggering is possible\n      if ($$animateCache.count(cacheKey) > 0) {\n        stagger = $$animateCache.get(staggerCacheKey);\n\n        if (!stagger) {\n          var staggerClassName = pendClasses(className, '-stagger');\n\n          $$jqLite.addClass(node, staggerClassName);\n\n          stagger = computeCssStyles($window, node, properties);\n\n          // force the conversion of a null value to zero incase not set\n          stagger.animationDuration = Math.max(stagger.animationDuration, 0);\n          stagger.transitionDuration = Math.max(stagger.transitionDuration, 0);\n\n          $$jqLite.removeClass(node, staggerClassName);\n\n          $$animateCache.put(staggerCacheKey, stagger, true);\n        }\n      }\n\n      return stagger || {};\n    }\n\n    var rafWaitQueue = [];\n    function waitUntilQuiet(callback) {\n      rafWaitQueue.push(callback);\n      $$rAFScheduler.waitUntilQuiet(function() {\n        $$animateCache.flush();\n\n        // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.\n        // PLEASE EXAMINE THE `$$forceReflow` service to understand why.\n        var pageWidth = $$forceReflow();\n\n        // we use a for loop to ensure that if the queue is changed\n        // during this looping then it will consider new requests\n        for (var i = 0; i < rafWaitQueue.length; i++) {\n          rafWaitQueue[i](pageWidth);\n        }\n        rafWaitQueue.length = 0;\n      });\n    }\n\n    function computeTimings(node, className, cacheKey, allowNoDuration) {\n      var timings = computeCachedCssStyles(node, className, cacheKey, allowNoDuration, DETECT_CSS_PROPERTIES);\n      var aD = timings.animationDelay;\n      var tD = timings.transitionDelay;\n      timings.maxDelay = aD && tD\n          ? Math.max(aD, tD)\n          : (aD || tD);\n      timings.maxDuration = Math.max(\n          timings.animationDuration * timings.animationIterationCount,\n          timings.transitionDuration);\n\n      return timings;\n    }\n\n    return function init(element, initialOptions) {\n      // all of the animation functions should create\n      // a copy of the options data, however, if a\n      // parent service has already created a copy then\n      // we should stick to using that\n      var options = initialOptions || {};\n      if (!options.$$prepared) {\n        options = prepareAnimationOptions(copy(options));\n      }\n\n      var restoreStyles = {};\n      var node = getDomNode(element);\n      if (!node\n          || !node.parentNode\n          || !$$animateQueue.enabled()) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var temporaryStyles = [];\n      var classes = element.attr('class');\n      var styles = packageStyles(options);\n      var animationClosed;\n      var animationPaused;\n      var animationCompleted;\n      var runner;\n      var runnerHost;\n      var maxDelay;\n      var maxDelayTime;\n      var maxDuration;\n      var maxDurationTime;\n      var startTime;\n      var events = [];\n\n      if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var method = options.event && isArray(options.event)\n            ? options.event.join(' ')\n            : options.event;\n\n      var isStructural = method && options.structural;\n      var structuralClassName = '';\n      var addRemoveClassName = '';\n\n      if (isStructural) {\n        structuralClassName = pendClasses(method, EVENT_CLASS_PREFIX, true);\n      } else if (method) {\n        structuralClassName = method;\n      }\n\n      if (options.addClass) {\n        addRemoveClassName += pendClasses(options.addClass, ADD_CLASS_SUFFIX);\n      }\n\n      if (options.removeClass) {\n        if (addRemoveClassName.length) {\n          addRemoveClassName += ' ';\n        }\n        addRemoveClassName += pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX);\n      }\n\n      // there may be a situation where a structural animation is combined together\n      // with CSS classes that need to resolve before the animation is computed.\n      // However this means that there is no explicit CSS code to block the animation\n      // from happening (by setting 0s none in the class name). If this is the case\n      // we need to apply the classes before the first rAF so we know to continue if\n      // there actually is a detected transition or keyframe animation\n      if (options.applyClassesEarly && addRemoveClassName.length) {\n        applyAnimationClasses(element, options);\n      }\n\n      var preparationClasses = [structuralClassName, addRemoveClassName].join(' ').trim();\n      var fullClassName = classes + ' ' + preparationClasses;\n      var hasToStyles = styles.to && Object.keys(styles.to).length > 0;\n      var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0;\n\n      // there is no way we can trigger an animation if no styles and\n      // no classes are being applied which would then trigger a transition,\n      // unless there a is raw keyframe value that is applied to the element.\n      if (!containsKeyframeAnimation\n           && !hasToStyles\n           && !preparationClasses) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var stagger, cacheKey = $$animateCache.cacheKey(node, method, options.addClass, options.removeClass);\n      if ($$animateCache.containsCachedAnimationWithoutDuration(cacheKey)) {\n        preparationClasses = null;\n        return closeAndReturnNoopAnimator();\n      }\n\n      if (options.stagger > 0) {\n        var staggerVal = parseFloat(options.stagger);\n        stagger = {\n          transitionDelay: staggerVal,\n          animationDelay: staggerVal,\n          transitionDuration: 0,\n          animationDuration: 0\n        };\n      } else {\n        stagger = computeCachedCssStaggerStyles(node, preparationClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES);\n      }\n\n      if (!options.$$skipPreparationClasses) {\n        $$jqLite.addClass(element, preparationClasses);\n      }\n\n      var applyOnlyDuration;\n\n      if (options.transitionStyle) {\n        var transitionStyle = [TRANSITION_PROP, options.transitionStyle];\n        applyInlineStyle(node, transitionStyle);\n        temporaryStyles.push(transitionStyle);\n      }\n\n      if (options.duration >= 0) {\n        applyOnlyDuration = node.style[TRANSITION_PROP].length > 0;\n        var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration);\n\n        // we set the duration so that it will be picked up by getComputedStyle later\n        applyInlineStyle(node, durationStyle);\n        temporaryStyles.push(durationStyle);\n      }\n\n      if (options.keyframeStyle) {\n        var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle];\n        applyInlineStyle(node, keyframeStyle);\n        temporaryStyles.push(keyframeStyle);\n      }\n\n      var itemIndex = stagger\n          ? options.staggerIndex >= 0\n              ? options.staggerIndex\n              : $$animateCache.count(cacheKey)\n          : 0;\n\n      var isFirst = itemIndex === 0;\n\n      // this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY\n      // without causing any combination of transitions to kick in. By adding a negative delay value\n      // it forces the setup class' transition to end immediately. We later then remove the negative\n      // transition delay to allow for the transition to naturally do it's thing. The beauty here is\n      // that if there is no transition defined then nothing will happen and this will also allow\n      // other transitions to be stacked on top of each other without any chopping them out.\n      if (isFirst && !options.skipBlocking) {\n        helpers.blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE);\n      }\n\n      var timings = computeTimings(node, fullClassName, cacheKey, !isStructural);\n      var relativeDelay = timings.maxDelay;\n      maxDelay = Math.max(relativeDelay, 0);\n      maxDuration = timings.maxDuration;\n\n      var flags = {};\n      flags.hasTransitions          = timings.transitionDuration > 0;\n      flags.hasAnimations           = timings.animationDuration > 0;\n      flags.hasTransitionAll        = flags.hasTransitions && timings.transitionProperty === 'all';\n      flags.applyTransitionDuration = hasToStyles && (\n                                        (flags.hasTransitions && !flags.hasTransitionAll)\n                                         || (flags.hasAnimations && !flags.hasTransitions));\n      flags.applyAnimationDuration  = options.duration && flags.hasAnimations;\n      flags.applyTransitionDelay    = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions);\n      flags.applyAnimationDelay     = truthyTimingValue(options.delay) && flags.hasAnimations;\n      flags.recalculateTimingStyles = addRemoveClassName.length > 0;\n\n      if (flags.applyTransitionDuration || flags.applyAnimationDuration) {\n        maxDuration = options.duration ? parseFloat(options.duration) : maxDuration;\n\n        if (flags.applyTransitionDuration) {\n          flags.hasTransitions = true;\n          timings.transitionDuration = maxDuration;\n          applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0;\n          temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration));\n        }\n\n        if (flags.applyAnimationDuration) {\n          flags.hasAnimations = true;\n          timings.animationDuration = maxDuration;\n          temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration));\n        }\n      }\n\n      if (maxDuration === 0 && !flags.recalculateTimingStyles) {\n        return closeAndReturnNoopAnimator();\n      }\n\n      var activeClasses = pendClasses(preparationClasses, ACTIVE_CLASS_SUFFIX);\n\n      if (options.delay != null) {\n        var delayStyle;\n        if (typeof options.delay !== 'boolean') {\n          delayStyle = parseFloat(options.delay);\n          // number in options.delay means we have to recalculate the delay for the closing timeout\n          maxDelay = Math.max(delayStyle, 0);\n        }\n\n        if (flags.applyTransitionDelay) {\n          temporaryStyles.push(getCssDelayStyle(delayStyle));\n        }\n\n        if (flags.applyAnimationDelay) {\n          temporaryStyles.push(getCssDelayStyle(delayStyle, true));\n        }\n      }\n\n      // we need to recalculate the delay value since we used a pre-emptive negative\n      // delay value and the delay value is required for the final event checking. This\n      // property will ensure that this will happen after the RAF phase has passed.\n      if (options.duration == null && timings.transitionDuration > 0) {\n        flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst;\n      }\n\n      maxDelayTime = maxDelay * ONE_SECOND;\n      maxDurationTime = maxDuration * ONE_SECOND;\n      if (!options.skipBlocking) {\n        flags.blockTransition = timings.transitionDuration > 0;\n        flags.blockKeyframeAnimation = timings.animationDuration > 0 &&\n                                       stagger.animationDelay > 0 &&\n                                       stagger.animationDuration === 0;\n      }\n\n      if (options.from) {\n        if (options.cleanupStyles) {\n          registerRestorableStyles(restoreStyles, node, Object.keys(options.from));\n        }\n        applyAnimationFromStyles(element, options);\n      }\n\n      if (flags.blockTransition || flags.blockKeyframeAnimation) {\n        applyBlocking(maxDuration);\n      } else if (!options.skipBlocking) {\n        helpers.blockTransitions(node, false);\n      }\n\n      // TODO(matsko): for 1.5 change this code to have an animator object for better debugging\n      return {\n        $$willAnimate: true,\n        end: endFn,\n        start: function() {\n          if (animationClosed) return;\n\n          runnerHost = {\n            end: endFn,\n            cancel: cancelFn,\n            resume: null, //this will be set during the start() phase\n            pause: null\n          };\n\n          runner = new $$AnimateRunner(runnerHost);\n\n          waitUntilQuiet(start);\n\n          // we don't have access to pause/resume the animation\n          // since it hasn't run yet. AnimateRunner will therefore\n          // set noop functions for resume and pause and they will\n          // later be overridden once the animation is triggered\n          return runner;\n        }\n      };\n\n      function endFn() {\n        close();\n      }\n\n      function cancelFn() {\n        close(true);\n      }\n\n      function close(rejected) {\n        // if the promise has been called already then we shouldn't close\n        // the animation again\n        if (animationClosed || (animationCompleted && animationPaused)) return;\n        animationClosed = true;\n        animationPaused = false;\n\n        if (preparationClasses && !options.$$skipPreparationClasses) {\n          $$jqLite.removeClass(element, preparationClasses);\n        }\n\n        if (activeClasses) {\n          $$jqLite.removeClass(element, activeClasses);\n        }\n\n        blockKeyframeAnimations(node, false);\n        helpers.blockTransitions(node, false);\n\n        forEach(temporaryStyles, function(entry) {\n          // There is only one way to remove inline style properties entirely from elements.\n          // By using `removeProperty` this works, but we need to convert camel-cased CSS\n          // styles down to hyphenated values.\n          node.style[entry[0]] = '';\n        });\n\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n\n        if (Object.keys(restoreStyles).length) {\n          forEach(restoreStyles, function(value, prop) {\n            if (value) {\n              node.style.setProperty(prop, value);\n            } else {\n              node.style.removeProperty(prop);\n            }\n          });\n        }\n\n        // the reason why we have this option is to allow a synchronous closing callback\n        // that is fired as SOON as the animation ends (when the CSS is removed) or if\n        // the animation never takes off at all. A good example is a leave animation since\n        // the element must be removed just after the animation is over or else the element\n        // will appear on screen for one animation frame causing an overbearing flicker.\n        if (options.onDone) {\n          options.onDone();\n        }\n\n        if (events && events.length) {\n          // Remove the transitionend / animationend listener(s)\n          element.off(events.join(' '), onAnimationProgress);\n        }\n\n        //Cancel the fallback closing timeout and remove the timer data\n        var animationTimerData = element.data(ANIMATE_TIMER_KEY);\n        if (animationTimerData) {\n          $timeout.cancel(animationTimerData[0].timer);\n          element.removeData(ANIMATE_TIMER_KEY);\n        }\n\n        // if the preparation function fails then the promise is not setup\n        if (runner) {\n          runner.complete(!rejected);\n        }\n      }\n\n      function applyBlocking(duration) {\n        if (flags.blockTransition) {\n          helpers.blockTransitions(node, duration);\n        }\n\n        if (flags.blockKeyframeAnimation) {\n          blockKeyframeAnimations(node, !!duration);\n        }\n      }\n\n      function closeAndReturnNoopAnimator() {\n        runner = new $$AnimateRunner({\n          end: endFn,\n          cancel: cancelFn\n        });\n\n        // should flush the cache animation\n        waitUntilQuiet(noop);\n        close();\n\n        return {\n          $$willAnimate: false,\n          start: function() {\n            return runner;\n          },\n          end: endFn\n        };\n      }\n\n      function onAnimationProgress(event) {\n        event.stopPropagation();\n        var ev = event.originalEvent || event;\n\n        if (ev.target !== node) {\n          // Since TransitionEvent / AnimationEvent bubble up,\n          // we have to ignore events by finished child animations\n          return;\n        }\n\n        // we now always use `Date.now()` due to the recent changes with\n        // event.timeStamp in Firefox, Webkit and Chrome (see #13494 for more info)\n        var timeStamp = ev.$manualTimeStamp || Date.now();\n\n        /* Firefox (or possibly just Gecko) likes to not round values up\n         * when a ms measurement is used for the animation */\n        var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));\n\n        /* $manualTimeStamp is a mocked timeStamp value which is set\n         * within browserTrigger(). This is only here so that tests can\n         * mock animations properly. Real events fallback to event.timeStamp,\n         * or, if they don't, then a timeStamp is automatically created for them.\n         * We're checking to see if the timeStamp surpasses the expected delay,\n         * but we're using elapsedTime instead of the timeStamp on the 2nd\n         * pre-condition since animationPauseds sometimes close off early */\n        if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n          // we set this flag to ensure that if the transition is paused then, when resumed,\n          // the animation will automatically close itself since transitions cannot be paused.\n          animationCompleted = true;\n          close();\n        }\n      }\n\n      function start() {\n        if (animationClosed) return;\n        if (!node.parentNode) {\n          close();\n          return;\n        }\n\n        // even though we only pause keyframe animations here the pause flag\n        // will still happen when transitions are used. Only the transition will\n        // not be paused since that is not possible. If the animation ends when\n        // paused then it will not complete until unpaused or cancelled.\n        var playPause = function(playAnimation) {\n          if (!animationCompleted) {\n            animationPaused = !playAnimation;\n            if (timings.animationDuration) {\n              var value = blockKeyframeAnimations(node, animationPaused);\n              if (animationPaused) {\n                temporaryStyles.push(value);\n              } else {\n                removeFromArray(temporaryStyles, value);\n              }\n            }\n          } else if (animationPaused && playAnimation) {\n            animationPaused = false;\n            close();\n          }\n        };\n\n        // checking the stagger duration prevents an accidentally cascade of the CSS delay style\n        // being inherited from the parent. If the transition duration is zero then we can safely\n        // rely that the delay value is an intentional stagger delay style.\n        var maxStagger = itemIndex > 0\n                         && ((timings.transitionDuration && stagger.transitionDuration === 0) ||\n                            (timings.animationDuration && stagger.animationDuration === 0))\n                         && Math.max(stagger.animationDelay, stagger.transitionDelay);\n        if (maxStagger) {\n          $timeout(triggerAnimationStart,\n                   Math.floor(maxStagger * itemIndex * ONE_SECOND),\n                   false);\n        } else {\n          triggerAnimationStart();\n        }\n\n        // this will decorate the existing promise runner with pause/resume methods\n        runnerHost.resume = function() {\n          playPause(true);\n        };\n\n        runnerHost.pause = function() {\n          playPause(false);\n        };\n\n        function triggerAnimationStart() {\n          // just incase a stagger animation kicks in when the animation\n          // itself was cancelled entirely\n          if (animationClosed) return;\n\n          applyBlocking(false);\n\n          forEach(temporaryStyles, function(entry) {\n            var key = entry[0];\n            var value = entry[1];\n            node.style[key] = value;\n          });\n\n          applyAnimationClasses(element, options);\n          $$jqLite.addClass(element, activeClasses);\n\n          if (flags.recalculateTimingStyles) {\n            fullClassName = node.getAttribute('class') + ' ' + preparationClasses;\n            cacheKey = $$animateCache.cacheKey(node, method, options.addClass, options.removeClass);\n\n            timings = computeTimings(node, fullClassName, cacheKey, false);\n            relativeDelay = timings.maxDelay;\n            maxDelay = Math.max(relativeDelay, 0);\n            maxDuration = timings.maxDuration;\n\n            if (maxDuration === 0) {\n              close();\n              return;\n            }\n\n            flags.hasTransitions = timings.transitionDuration > 0;\n            flags.hasAnimations = timings.animationDuration > 0;\n          }\n\n          if (flags.applyAnimationDelay) {\n            relativeDelay = typeof options.delay !== 'boolean' && truthyTimingValue(options.delay)\n                  ? parseFloat(options.delay)\n                  : relativeDelay;\n\n            maxDelay = Math.max(relativeDelay, 0);\n            timings.animationDelay = relativeDelay;\n            delayStyle = getCssDelayStyle(relativeDelay, true);\n            temporaryStyles.push(delayStyle);\n            node.style[delayStyle[0]] = delayStyle[1];\n          }\n\n          maxDelayTime = maxDelay * ONE_SECOND;\n          maxDurationTime = maxDuration * ONE_SECOND;\n\n          if (options.easing) {\n            var easeProp, easeVal = options.easing;\n            if (flags.hasTransitions) {\n              easeProp = TRANSITION_PROP + TIMING_KEY;\n              temporaryStyles.push([easeProp, easeVal]);\n              node.style[easeProp] = easeVal;\n            }\n            if (flags.hasAnimations) {\n              easeProp = ANIMATION_PROP + TIMING_KEY;\n              temporaryStyles.push([easeProp, easeVal]);\n              node.style[easeProp] = easeVal;\n            }\n          }\n\n          if (timings.transitionDuration) {\n            events.push(TRANSITIONEND_EVENT);\n          }\n\n          if (timings.animationDuration) {\n            events.push(ANIMATIONEND_EVENT);\n          }\n\n          startTime = Date.now();\n          var timerTime = maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime;\n          var endTime = startTime + timerTime;\n\n          var animationsData = element.data(ANIMATE_TIMER_KEY) || [];\n          var setupFallbackTimer = true;\n          if (animationsData.length) {\n            var currentTimerData = animationsData[0];\n            setupFallbackTimer = endTime > currentTimerData.expectedEndTime;\n            if (setupFallbackTimer) {\n              $timeout.cancel(currentTimerData.timer);\n            } else {\n              animationsData.push(close);\n            }\n          }\n\n          if (setupFallbackTimer) {\n            var timer = $timeout(onAnimationExpired, timerTime, false);\n            animationsData[0] = {\n              timer: timer,\n              expectedEndTime: endTime\n            };\n            animationsData.push(close);\n            element.data(ANIMATE_TIMER_KEY, animationsData);\n          }\n\n          if (events.length) {\n            element.on(events.join(' '), onAnimationProgress);\n          }\n\n          if (options.to) {\n            if (options.cleanupStyles) {\n              registerRestorableStyles(restoreStyles, node, Object.keys(options.to));\n            }\n            applyAnimationToStyles(element, options);\n          }\n        }\n\n        function onAnimationExpired() {\n          var animationsData = element.data(ANIMATE_TIMER_KEY);\n\n          // this will be false in the event that the element was\n          // removed from the DOM (via a leave animation or something\n          // similar)\n          if (animationsData) {\n            for (var i = 1; i < animationsData.length; i++) {\n              animationsData[i]();\n            }\n            element.removeData(ANIMATE_TIMER_KEY);\n          }\n        }\n      }\n    };\n  }];\n}];\n\nvar $$AnimateCssDriverProvider = ['$$animationProvider', /** @this */ function($$animationProvider) {\n  $$animationProvider.drivers.push('$$animateCssDriver');\n\n  var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim';\n  var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor';\n\n  var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out';\n  var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in';\n\n  function isDocumentFragment(node) {\n    return node.parentNode && node.parentNode.nodeType === 11;\n  }\n\n  this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$sniffer', '$$jqLite', '$document',\n       function($animateCss,   $rootScope,   $$AnimateRunner,   $rootElement,   $sniffer,   $$jqLite,   $document) {\n\n    // only browsers that support these properties can render animations\n    if (!$sniffer.animations && !$sniffer.transitions) return noop;\n\n    var bodyNode = $document[0].body;\n    var rootNode = getDomNode($rootElement);\n\n    var rootBodyElement = jqLite(\n      // this is to avoid using something that exists outside of the body\n      // we also special case the doc fragment case because our unit test code\n      // appends the $rootElement to the body after the app has been bootstrapped\n      isDocumentFragment(rootNode) || bodyNode.contains(rootNode) ? rootNode : bodyNode\n    );\n\n    return function initDriverFn(animationDetails) {\n      return animationDetails.from && animationDetails.to\n          ? prepareFromToAnchorAnimation(animationDetails.from,\n                                         animationDetails.to,\n                                         animationDetails.classes,\n                                         animationDetails.anchors)\n          : prepareRegularAnimation(animationDetails);\n    };\n\n    function filterCssClasses(classes) {\n      //remove all the `ng-` stuff\n      return classes.replace(/\\bng-\\S+\\b/g, '');\n    }\n\n    function getUniqueValues(a, b) {\n      if (isString(a)) a = a.split(' ');\n      if (isString(b)) b = b.split(' ');\n      return a.filter(function(val) {\n        return b.indexOf(val) === -1;\n      }).join(' ');\n    }\n\n    function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {\n      var clone = jqLite(getDomNode(outAnchor).cloneNode(true));\n      var startingClasses = filterCssClasses(getClassVal(clone));\n\n      outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);\n      inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME);\n\n      clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME);\n\n      rootBodyElement.append(clone);\n\n      var animatorIn, animatorOut = prepareOutAnimation();\n\n      // the user may not end up using the `out` animation and\n      // only making use of the `in` animation or vice-versa.\n      // In either case we should allow this and not assume the\n      // animation is over unless both animations are not used.\n      if (!animatorOut) {\n        animatorIn = prepareInAnimation();\n        if (!animatorIn) {\n          return end();\n        }\n      }\n\n      var startingAnimator = animatorOut || animatorIn;\n\n      return {\n        start: function() {\n          var runner;\n\n          var currentAnimation = startingAnimator.start();\n          currentAnimation.done(function() {\n            currentAnimation = null;\n            if (!animatorIn) {\n              animatorIn = prepareInAnimation();\n              if (animatorIn) {\n                currentAnimation = animatorIn.start();\n                currentAnimation.done(function() {\n                  currentAnimation = null;\n                  end();\n                  runner.complete();\n                });\n                return currentAnimation;\n              }\n            }\n            // in the event that there is no `in` animation\n            end();\n            runner.complete();\n          });\n\n          runner = new $$AnimateRunner({\n            end: endFn,\n            cancel: endFn\n          });\n\n          return runner;\n\n          function endFn() {\n            if (currentAnimation) {\n              currentAnimation.end();\n            }\n          }\n        }\n      };\n\n      function calculateAnchorStyles(anchor) {\n        var styles = {};\n\n        var coords = getDomNode(anchor).getBoundingClientRect();\n\n        // we iterate directly since safari messes up and doesn't return\n        // all the keys for the coords object when iterated\n        forEach(['width','height','top','left'], function(key) {\n          var value = coords[key];\n          switch (key) {\n            case 'top':\n              value += bodyNode.scrollTop;\n              break;\n            case 'left':\n              value += bodyNode.scrollLeft;\n              break;\n          }\n          styles[key] = Math.floor(value) + 'px';\n        });\n        return styles;\n      }\n\n      function prepareOutAnimation() {\n        var animator = $animateCss(clone, {\n          addClass: NG_OUT_ANCHOR_CLASS_NAME,\n          delay: true,\n          from: calculateAnchorStyles(outAnchor)\n        });\n\n        // read the comment within `prepareRegularAnimation` to understand\n        // why this check is necessary\n        return animator.$$willAnimate ? animator : null;\n      }\n\n      function getClassVal(element) {\n        return element.attr('class') || '';\n      }\n\n      function prepareInAnimation() {\n        var endingClasses = filterCssClasses(getClassVal(inAnchor));\n        var toAdd = getUniqueValues(endingClasses, startingClasses);\n        var toRemove = getUniqueValues(startingClasses, endingClasses);\n\n        var animator = $animateCss(clone, {\n          to: calculateAnchorStyles(inAnchor),\n          addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd,\n          removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove,\n          delay: true\n        });\n\n        // read the comment within `prepareRegularAnimation` to understand\n        // why this check is necessary\n        return animator.$$willAnimate ? animator : null;\n      }\n\n      function end() {\n        clone.remove();\n        outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);\n        inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME);\n      }\n    }\n\n    function prepareFromToAnchorAnimation(from, to, classes, anchors) {\n      var fromAnimation = prepareRegularAnimation(from, noop);\n      var toAnimation = prepareRegularAnimation(to, noop);\n\n      var anchorAnimations = [];\n      forEach(anchors, function(anchor) {\n        var outElement = anchor['out'];\n        var inElement = anchor['in'];\n        var animator = prepareAnchoredAnimation(classes, outElement, inElement);\n        if (animator) {\n          anchorAnimations.push(animator);\n        }\n      });\n\n      // no point in doing anything when there are no elements to animate\n      if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return;\n\n      return {\n        start: function() {\n          var animationRunners = [];\n\n          if (fromAnimation) {\n            animationRunners.push(fromAnimation.start());\n          }\n\n          if (toAnimation) {\n            animationRunners.push(toAnimation.start());\n          }\n\n          forEach(anchorAnimations, function(animation) {\n            animationRunners.push(animation.start());\n          });\n\n          var runner = new $$AnimateRunner({\n            end: endFn,\n            cancel: endFn // CSS-driven animations cannot be cancelled, only ended\n          });\n\n          $$AnimateRunner.all(animationRunners, function(status) {\n            runner.complete(status);\n          });\n\n          return runner;\n\n          function endFn() {\n            forEach(animationRunners, function(runner) {\n              runner.end();\n            });\n          }\n        }\n      };\n    }\n\n    function prepareRegularAnimation(animationDetails) {\n      var element = animationDetails.element;\n      var options = animationDetails.options || {};\n\n      if (animationDetails.structural) {\n        options.event = animationDetails.event;\n        options.structural = true;\n        options.applyClassesEarly = true;\n\n        // we special case the leave animation since we want to ensure that\n        // the element is removed as soon as the animation is over. Otherwise\n        // a flicker might appear or the element may not be removed at all\n        if (animationDetails.event === 'leave') {\n          options.onDone = options.domOperation;\n        }\n      }\n\n      // We assign the preparationClasses as the actual animation event since\n      // the internals of $animateCss will just suffix the event token values\n      // with `-active` to trigger the animation.\n      if (options.preparationClasses) {\n        options.event = concatWithSpace(options.event, options.preparationClasses);\n      }\n\n      var animator = $animateCss(element, options);\n\n      // the driver lookup code inside of $$animation attempts to spawn a\n      // driver one by one until a driver returns a.$$willAnimate animator object.\n      // $animateCss will always return an object, however, it will pass in\n      // a flag as a hint as to whether an animation was detected or not\n      return animator.$$willAnimate ? animator : null;\n    }\n  }];\n}];\n\n// TODO(matsko): use caching here to speed things up for detection\n// TODO(matsko): add documentation\n//  by the time...\n\nvar $$AnimateJsProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  this.$get = ['$injector', '$$AnimateRunner', '$$jqLite',\n       function($injector,   $$AnimateRunner,   $$jqLite) {\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n         // $animateJs(element, 'enter');\n    return function(element, event, classes, options) {\n      var animationClosed = false;\n\n      // the `classes` argument is optional and if it is not used\n      // then the classes will be resolved from the element's className\n      // property as well as options.addClass/options.removeClass.\n      if (arguments.length === 3 && isObject(classes)) {\n        options = classes;\n        classes = null;\n      }\n\n      options = prepareAnimationOptions(options);\n      if (!classes) {\n        classes = element.attr('class') || '';\n        if (options.addClass) {\n          classes += ' ' + options.addClass;\n        }\n        if (options.removeClass) {\n          classes += ' ' + options.removeClass;\n        }\n      }\n\n      var classesToAdd = options.addClass;\n      var classesToRemove = options.removeClass;\n\n      // the lookupAnimations function returns a series of animation objects that are\n      // matched up with one or more of the CSS classes. These animation objects are\n      // defined via the module.animation factory function. If nothing is detected then\n      // we don't return anything which then makes $animation query the next driver.\n      var animations = lookupAnimations(classes);\n      var before, after;\n      if (animations.length) {\n        var afterFn, beforeFn;\n        if (event === 'leave') {\n          beforeFn = 'leave';\n          afterFn = 'afterLeave'; // TODO(matsko): get rid of this\n        } else {\n          beforeFn = 'before' + event.charAt(0).toUpperCase() + event.substr(1);\n          afterFn = event;\n        }\n\n        if (event !== 'enter' && event !== 'move') {\n          before = packageAnimations(element, event, options, animations, beforeFn);\n        }\n        after  = packageAnimations(element, event, options, animations, afterFn);\n      }\n\n      // no matching animations\n      if (!before && !after) return;\n\n      function applyOptions() {\n        options.domOperation();\n        applyAnimationClasses(element, options);\n      }\n\n      function close() {\n        animationClosed = true;\n        applyOptions();\n        applyAnimationStyles(element, options);\n      }\n\n      var runner;\n\n      return {\n        $$willAnimate: true,\n        end: function() {\n          if (runner) {\n            runner.end();\n          } else {\n            close();\n            runner = new $$AnimateRunner();\n            runner.complete(true);\n          }\n          return runner;\n        },\n        start: function() {\n          if (runner) {\n            return runner;\n          }\n\n          runner = new $$AnimateRunner();\n          var closeActiveAnimations;\n          var chain = [];\n\n          if (before) {\n            chain.push(function(fn) {\n              closeActiveAnimations = before(fn);\n            });\n          }\n\n          if (chain.length) {\n            chain.push(function(fn) {\n              applyOptions();\n              fn(true);\n            });\n          } else {\n            applyOptions();\n          }\n\n          if (after) {\n            chain.push(function(fn) {\n              closeActiveAnimations = after(fn);\n            });\n          }\n\n          runner.setHost({\n            end: function() {\n              endAnimations();\n            },\n            cancel: function() {\n              endAnimations(true);\n            }\n          });\n\n          $$AnimateRunner.chain(chain, onComplete);\n          return runner;\n\n          function onComplete(success) {\n            close(success);\n            runner.complete(success);\n          }\n\n          function endAnimations(cancelled) {\n            if (!animationClosed) {\n              (closeActiveAnimations || noop)(cancelled);\n              onComplete(cancelled);\n            }\n          }\n        }\n      };\n\n      function executeAnimationFn(fn, element, event, options, onDone) {\n        var args;\n        switch (event) {\n          case 'animate':\n            args = [element, options.from, options.to, onDone];\n            break;\n\n          case 'setClass':\n            args = [element, classesToAdd, classesToRemove, onDone];\n            break;\n\n          case 'addClass':\n            args = [element, classesToAdd, onDone];\n            break;\n\n          case 'removeClass':\n            args = [element, classesToRemove, onDone];\n            break;\n\n          default:\n            args = [element, onDone];\n            break;\n        }\n\n        args.push(options);\n\n        var value = fn.apply(fn, args);\n        if (value) {\n          if (isFunction(value.start)) {\n            value = value.start();\n          }\n\n          if (value instanceof $$AnimateRunner) {\n            value.done(onDone);\n          } else if (isFunction(value)) {\n            // optional onEnd / onCancel callback\n            return value;\n          }\n        }\n\n        return noop;\n      }\n\n      function groupEventedAnimations(element, event, options, animations, fnName) {\n        var operations = [];\n        forEach(animations, function(ani) {\n          var animation = ani[fnName];\n          if (!animation) return;\n\n          // note that all of these animations will run in parallel\n          operations.push(function() {\n            var runner;\n            var endProgressCb;\n\n            var resolved = false;\n            var onAnimationComplete = function(rejected) {\n              if (!resolved) {\n                resolved = true;\n                (endProgressCb || noop)(rejected);\n                runner.complete(!rejected);\n              }\n            };\n\n            runner = new $$AnimateRunner({\n              end: function() {\n                onAnimationComplete();\n              },\n              cancel: function() {\n                onAnimationComplete(true);\n              }\n            });\n\n            endProgressCb = executeAnimationFn(animation, element, event, options, function(result) {\n              var cancelled = result === false;\n              onAnimationComplete(cancelled);\n            });\n\n            return runner;\n          });\n        });\n\n        return operations;\n      }\n\n      function packageAnimations(element, event, options, animations, fnName) {\n        var operations = groupEventedAnimations(element, event, options, animations, fnName);\n        if (operations.length === 0) {\n          var a, b;\n          if (fnName === 'beforeSetClass') {\n            a = groupEventedAnimations(element, 'removeClass', options, animations, 'beforeRemoveClass');\n            b = groupEventedAnimations(element, 'addClass', options, animations, 'beforeAddClass');\n          } else if (fnName === 'setClass') {\n            a = groupEventedAnimations(element, 'removeClass', options, animations, 'removeClass');\n            b = groupEventedAnimations(element, 'addClass', options, animations, 'addClass');\n          }\n\n          if (a) {\n            operations = operations.concat(a);\n          }\n          if (b) {\n            operations = operations.concat(b);\n          }\n        }\n\n        if (operations.length === 0) return;\n\n        // TODO(matsko): add documentation\n        return function startAnimation(callback) {\n          var runners = [];\n          if (operations.length) {\n            forEach(operations, function(animateFn) {\n              runners.push(animateFn());\n            });\n          }\n\n          if (runners.length) {\n            $$AnimateRunner.all(runners, callback);\n          }  else {\n            callback();\n          }\n\n          return function endFn(reject) {\n            forEach(runners, function(runner) {\n              if (reject) {\n                runner.cancel();\n              } else {\n                runner.end();\n              }\n            });\n          };\n        };\n      }\n    };\n\n    function lookupAnimations(classes) {\n      classes = isArray(classes) ? classes : classes.split(' ');\n      var matches = [], flagMap = {};\n      for (var i = 0; i < classes.length; i++) {\n        var klass = classes[i],\n            animationFactory = $animateProvider.$$registeredAnimations[klass];\n        if (animationFactory && !flagMap[klass]) {\n          matches.push($injector.get(animationFactory));\n          flagMap[klass] = true;\n        }\n      }\n      return matches;\n    }\n  }];\n}];\n\nvar $$AnimateJsDriverProvider = ['$$animationProvider', /** @this */ function($$animationProvider) {\n  $$animationProvider.drivers.push('$$animateJsDriver');\n  this.$get = ['$$animateJs', '$$AnimateRunner', function($$animateJs, $$AnimateRunner) {\n    return function initDriverFn(animationDetails) {\n      if (animationDetails.from && animationDetails.to) {\n        var fromAnimation = prepareAnimation(animationDetails.from);\n        var toAnimation = prepareAnimation(animationDetails.to);\n        if (!fromAnimation && !toAnimation) return;\n\n        return {\n          start: function() {\n            var animationRunners = [];\n\n            if (fromAnimation) {\n              animationRunners.push(fromAnimation.start());\n            }\n\n            if (toAnimation) {\n              animationRunners.push(toAnimation.start());\n            }\n\n            $$AnimateRunner.all(animationRunners, done);\n\n            var runner = new $$AnimateRunner({\n              end: endFnFactory(),\n              cancel: endFnFactory()\n            });\n\n            return runner;\n\n            function endFnFactory() {\n              return function() {\n                forEach(animationRunners, function(runner) {\n                  // at this point we cannot cancel animations for groups just yet. 1.5+\n                  runner.end();\n                });\n              };\n            }\n\n            function done(status) {\n              runner.complete(status);\n            }\n          }\n        };\n      } else {\n        return prepareAnimation(animationDetails);\n      }\n    };\n\n    function prepareAnimation(animationDetails) {\n      // TODO(matsko): make sure to check for grouped animations and delegate down to normal animations\n      var element = animationDetails.element;\n      var event = animationDetails.event;\n      var options = animationDetails.options;\n      var classes = animationDetails.classes;\n      return $$animateJs(element, event, classes, options);\n    }\n  }];\n}];\n\nvar NG_ANIMATE_ATTR_NAME = 'data-ng-animate';\nvar NG_ANIMATE_PIN_DATA = '$ngAnimatePin';\nvar $$AnimateQueueProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  var PRE_DIGEST_STATE = 1;\n  var RUNNING_STATE = 2;\n  var ONE_SPACE = ' ';\n\n  var rules = this.rules = {\n    skip: [],\n    cancel: [],\n    join: []\n  };\n\n  function getEventData(options) {\n    return {\n      addClass: options.addClass,\n      removeClass: options.removeClass,\n      from: options.from,\n      to: options.to\n    };\n  }\n\n  function makeTruthyCssClassMap(classString) {\n    if (!classString) {\n      return null;\n    }\n\n    var keys = classString.split(ONE_SPACE);\n    var map = Object.create(null);\n\n    forEach(keys, function(key) {\n      map[key] = true;\n    });\n    return map;\n  }\n\n  function hasMatchingClasses(newClassString, currentClassString) {\n    if (newClassString && currentClassString) {\n      var currentClassMap = makeTruthyCssClassMap(currentClassString);\n      return newClassString.split(ONE_SPACE).some(function(className) {\n        return currentClassMap[className];\n      });\n    }\n  }\n\n  function isAllowed(ruleType, currentAnimation, previousAnimation) {\n    return rules[ruleType].some(function(fn) {\n      return fn(currentAnimation, previousAnimation);\n    });\n  }\n\n  function hasAnimationClasses(animation, and) {\n    var a = (animation.addClass || '').length > 0;\n    var b = (animation.removeClass || '').length > 0;\n    return and ? a && b : a || b;\n  }\n\n  rules.join.push(function(newAnimation, currentAnimation) {\n    // if the new animation is class-based then we can just tack that on\n    return !newAnimation.structural && hasAnimationClasses(newAnimation);\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // there is no need to animate anything if no classes are being added and\n    // there is no structural animation that will be triggered\n    return !newAnimation.structural && !hasAnimationClasses(newAnimation);\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // why should we trigger a new structural animation if the element will\n    // be removed from the DOM anyway?\n    return currentAnimation.event === 'leave' && newAnimation.structural;\n  });\n\n  rules.skip.push(function(newAnimation, currentAnimation) {\n    // if there is an ongoing current animation then don't even bother running the class-based animation\n    return currentAnimation.structural && currentAnimation.state === RUNNING_STATE && !newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // there can never be two structural animations running at the same time\n    return currentAnimation.structural && newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // if the previous animation is already running, but the new animation will\n    // be triggered, but the new animation is structural\n    return currentAnimation.state === RUNNING_STATE && newAnimation.structural;\n  });\n\n  rules.cancel.push(function(newAnimation, currentAnimation) {\n    // cancel the animation if classes added / removed in both animation cancel each other out,\n    // but only if the current animation isn't structural\n\n    if (currentAnimation.structural) return false;\n\n    var nA = newAnimation.addClass;\n    var nR = newAnimation.removeClass;\n    var cA = currentAnimation.addClass;\n    var cR = currentAnimation.removeClass;\n\n    // early detection to save the global CPU shortage :)\n    if ((isUndefined(nA) && isUndefined(nR)) || (isUndefined(cA) && isUndefined(cR))) {\n      return false;\n    }\n\n    return hasMatchingClasses(nA, cR) || hasMatchingClasses(nR, cA);\n  });\n\n  this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$Map',\n               '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', '$$forceReflow',\n               '$$isDocumentHidden',\n       function($$rAF,   $rootScope,   $rootElement,   $document,   $$Map,\n                $$animation,   $$AnimateRunner,   $templateRequest,   $$jqLite,   $$forceReflow,\n                $$isDocumentHidden) {\n\n    var activeAnimationsLookup = new $$Map();\n    var disabledElementsLookup = new $$Map();\n    var animationsEnabled = null;\n\n    function removeFromDisabledElementsLookup(evt) {\n      disabledElementsLookup.delete(evt.target);\n    }\n\n    function postDigestTaskFactory() {\n      var postDigestCalled = false;\n      return function(fn) {\n        // we only issue a call to postDigest before\n        // it has first passed. This prevents any callbacks\n        // from not firing once the animation has completed\n        // since it will be out of the digest cycle.\n        if (postDigestCalled) {\n          fn();\n        } else {\n          $rootScope.$$postDigest(function() {\n            postDigestCalled = true;\n            fn();\n          });\n        }\n      };\n    }\n\n    // Wait until all directive and route-related templates are downloaded and\n    // compiled. The $templateRequest.totalPendingRequests variable keeps track of\n    // all of the remote templates being currently downloaded. If there are no\n    // templates currently downloading then the watcher will still fire anyway.\n    var deregisterWatch = $rootScope.$watch(\n      function() { return $templateRequest.totalPendingRequests === 0; },\n      function(isEmpty) {\n        if (!isEmpty) return;\n        deregisterWatch();\n\n        // Now that all templates have been downloaded, $animate will wait until\n        // the post digest queue is empty before enabling animations. By having two\n        // calls to $postDigest calls we can ensure that the flag is enabled at the\n        // very end of the post digest queue. Since all of the animations in $animate\n        // use $postDigest, it's important that the code below executes at the end.\n        // This basically means that the page is fully downloaded and compiled before\n        // any animations are triggered.\n        $rootScope.$$postDigest(function() {\n          $rootScope.$$postDigest(function() {\n            // we check for null directly in the event that the application already called\n            // .enabled() with whatever arguments that it provided it with\n            if (animationsEnabled === null) {\n              animationsEnabled = true;\n            }\n          });\n        });\n      }\n    );\n\n    var callbackRegistry = Object.create(null);\n\n    // remember that the `customFilter`/`classNameFilter` are set during the\n    // provider/config stage therefore we can optimize here and setup helper functions\n    var customFilter = $animateProvider.customFilter();\n    var classNameFilter = $animateProvider.classNameFilter();\n    var returnTrue = function() { return true; };\n\n    var isAnimatableByFilter = customFilter || returnTrue;\n    var isAnimatableClassName = !classNameFilter ? returnTrue : function(node, options) {\n      var className = [node.getAttribute('class'), options.addClass, options.removeClass].join(' ');\n      return classNameFilter.test(className);\n    };\n\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function normalizeAnimationDetails(element, animation) {\n      return mergeAnimationDetails(element, animation, {});\n    }\n\n    // IE9-11 has no method \"contains\" in SVG element and in Node.prototype. Bug #10259.\n    var contains = window.Node.prototype.contains || /** @this */ function(arg) {\n      // eslint-disable-next-line no-bitwise\n      return this === arg || !!(this.compareDocumentPosition(arg) & 16);\n    };\n\n    function findCallbacks(targetParentNode, targetNode, event) {\n      var matches = [];\n      var entries = callbackRegistry[event];\n      if (entries) {\n        forEach(entries, function(entry) {\n          if (contains.call(entry.node, targetNode)) {\n            matches.push(entry.callback);\n          } else if (event === 'leave' && contains.call(entry.node, targetParentNode)) {\n            matches.push(entry.callback);\n          }\n        });\n      }\n\n      return matches;\n    }\n\n    function filterFromRegistry(list, matchContainer, matchCallback) {\n      var containerNode = extractElementNode(matchContainer);\n      return list.filter(function(entry) {\n        var isMatch = entry.node === containerNode &&\n                        (!matchCallback || entry.callback === matchCallback);\n        return !isMatch;\n      });\n    }\n\n    function cleanupEventListeners(phase, node) {\n      if (phase === 'close' && !node.parentNode) {\n        // If the element is not attached to a parentNode, it has been removed by\n        // the domOperation, and we can safely remove the event callbacks\n        $animate.off(node);\n      }\n    }\n\n    var $animate = {\n      on: function(event, container, callback) {\n        var node = extractElementNode(container);\n        callbackRegistry[event] = callbackRegistry[event] || [];\n        callbackRegistry[event].push({\n          node: node,\n          callback: callback\n        });\n\n        // Remove the callback when the element is removed from the DOM\n        jqLite(container).on('$destroy', function() {\n          var animationDetails = activeAnimationsLookup.get(node);\n\n          if (!animationDetails) {\n            // If there's an animation ongoing, the callback calling code will remove\n            // the event listeners. If we'd remove here, the callbacks would be removed\n            // before the animation ends\n            $animate.off(event, container, callback);\n          }\n        });\n      },\n\n      off: function(event, container, callback) {\n        if (arguments.length === 1 && !isString(arguments[0])) {\n          container = arguments[0];\n          for (var eventType in callbackRegistry) {\n            callbackRegistry[eventType] = filterFromRegistry(callbackRegistry[eventType], container);\n          }\n\n          return;\n        }\n\n        var entries = callbackRegistry[event];\n        if (!entries) return;\n\n        callbackRegistry[event] = arguments.length === 1\n            ? null\n            : filterFromRegistry(entries, container, callback);\n      },\n\n      pin: function(element, parentElement) {\n        assertArg(isElement(element), 'element', 'not an element');\n        assertArg(isElement(parentElement), 'parentElement', 'not an element');\n        element.data(NG_ANIMATE_PIN_DATA, parentElement);\n      },\n\n      push: function(element, event, options, domOperation) {\n        options = options || {};\n        options.domOperation = domOperation;\n        return queueAnimation(element, event, options);\n      },\n\n      // this method has four signatures:\n      //  () - global getter\n      //  (bool) - global setter\n      //  (element) - element getter\n      //  (element, bool) - element setter<F37>\n      enabled: function(element, bool) {\n        var argCount = arguments.length;\n\n        if (argCount === 0) {\n          // () - Global getter\n          bool = !!animationsEnabled;\n        } else {\n          var hasElement = isElement(element);\n\n          if (!hasElement) {\n            // (bool) - Global setter\n            bool = animationsEnabled = !!element;\n          } else {\n            var node = getDomNode(element);\n\n            if (argCount === 1) {\n              // (element) - Element getter\n              bool = !disabledElementsLookup.get(node);\n            } else {\n              // (element, bool) - Element setter\n              if (!disabledElementsLookup.has(node)) {\n                // The element is added to the map for the first time.\n                // Create a listener to remove it on `$destroy` (to avoid memory leak).\n                jqLite(element).on('$destroy', removeFromDisabledElementsLookup);\n              }\n              disabledElementsLookup.set(node, !bool);\n            }\n          }\n        }\n\n        return bool;\n      }\n    };\n\n    return $animate;\n\n    function queueAnimation(originalElement, event, initialOptions) {\n      // we always make a copy of the options since\n      // there should never be any side effects on\n      // the input data when running `$animateCss`.\n      var options = copy(initialOptions);\n\n      var element = stripCommentsFromElement(originalElement);\n      var node = getDomNode(element);\n      var parentNode = node && node.parentNode;\n\n      options = prepareAnimationOptions(options);\n\n      // we create a fake runner with a working promise.\n      // These methods will become available after the digest has passed\n      var runner = new $$AnimateRunner();\n\n      // this is used to trigger callbacks in postDigest mode\n      var runInNextPostDigestOrNow = postDigestTaskFactory();\n\n      if (isArray(options.addClass)) {\n        options.addClass = options.addClass.join(' ');\n      }\n\n      if (options.addClass && !isString(options.addClass)) {\n        options.addClass = null;\n      }\n\n      if (isArray(options.removeClass)) {\n        options.removeClass = options.removeClass.join(' ');\n      }\n\n      if (options.removeClass && !isString(options.removeClass)) {\n        options.removeClass = null;\n      }\n\n      if (options.from && !isObject(options.from)) {\n        options.from = null;\n      }\n\n      if (options.to && !isObject(options.to)) {\n        options.to = null;\n      }\n\n      // If animations are hard-disabled for the whole application there is no need to continue.\n      // There are also situations where a directive issues an animation for a jqLite wrapper that\n      // contains only comment nodes. In this case, there is no way we can perform an animation.\n      if (!animationsEnabled ||\n          !node ||\n          !isAnimatableByFilter(node, event, initialOptions) ||\n          !isAnimatableClassName(node, options)) {\n        close();\n        return runner;\n      }\n\n      var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;\n\n      var documentHidden = $$isDocumentHidden();\n\n      // This is a hard disable of all animations the element itself, therefore  there is no need to\n      // continue further past this point if not enabled\n      // Animations are also disabled if the document is currently hidden (page is not visible\n      // to the user), because browsers slow down or do not flush calls to requestAnimationFrame\n      var skipAnimations = documentHidden || disabledElementsLookup.get(node);\n      var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {};\n      var hasExistingAnimation = !!existingAnimation.state;\n\n      // there is no point in traversing the same collection of parent ancestors if a followup\n      // animation will be run on the same element that already did all that checking work\n      if (!skipAnimations && (!hasExistingAnimation || existingAnimation.state !== PRE_DIGEST_STATE)) {\n        skipAnimations = !areAnimationsAllowed(node, parentNode, event);\n      }\n\n      if (skipAnimations) {\n        // Callbacks should fire even if the document is hidden (regression fix for issue #14120)\n        if (documentHidden) notifyProgress(runner, event, 'start', getEventData(options));\n        close();\n        if (documentHidden) notifyProgress(runner, event, 'close', getEventData(options));\n        return runner;\n      }\n\n      if (isStructural) {\n        closeChildAnimations(node);\n      }\n\n      var newAnimation = {\n        structural: isStructural,\n        element: element,\n        event: event,\n        addClass: options.addClass,\n        removeClass: options.removeClass,\n        close: close,\n        options: options,\n        runner: runner\n      };\n\n      if (hasExistingAnimation) {\n        var skipAnimationFlag = isAllowed('skip', newAnimation, existingAnimation);\n        if (skipAnimationFlag) {\n          if (existingAnimation.state === RUNNING_STATE) {\n            close();\n            return runner;\n          } else {\n            mergeAnimationDetails(element, existingAnimation, newAnimation);\n            return existingAnimation.runner;\n          }\n        }\n        var cancelAnimationFlag = isAllowed('cancel', newAnimation, existingAnimation);\n        if (cancelAnimationFlag) {\n          if (existingAnimation.state === RUNNING_STATE) {\n            // this will end the animation right away and it is safe\n            // to do so since the animation is already running and the\n            // runner callback code will run in async\n            existingAnimation.runner.end();\n          } else if (existingAnimation.structural) {\n            // this means that the animation is queued into a digest, but\n            // hasn't started yet. Therefore it is safe to run the close\n            // method which will call the runner methods in async.\n            existingAnimation.close();\n          } else {\n            // this will merge the new animation options into existing animation options\n            mergeAnimationDetails(element, existingAnimation, newAnimation);\n\n            return existingAnimation.runner;\n          }\n        } else {\n          // a joined animation means that this animation will take over the existing one\n          // so an example would involve a leave animation taking over an enter. Then when\n          // the postDigest kicks in the enter will be ignored.\n          var joinAnimationFlag = isAllowed('join', newAnimation, existingAnimation);\n          if (joinAnimationFlag) {\n            if (existingAnimation.state === RUNNING_STATE) {\n              normalizeAnimationDetails(element, newAnimation);\n            } else {\n              applyGeneratedPreparationClasses($$jqLite, element, isStructural ? event : null, options);\n\n              event = newAnimation.event = existingAnimation.event;\n              options = mergeAnimationDetails(element, existingAnimation, newAnimation);\n\n              //we return the same runner since only the option values of this animation will\n              //be fed into the `existingAnimation`.\n              return existingAnimation.runner;\n            }\n          }\n        }\n      } else {\n        // normalization in this case means that it removes redundant CSS classes that\n        // already exist (addClass) or do not exist (removeClass) on the element\n        normalizeAnimationDetails(element, newAnimation);\n      }\n\n      // when the options are merged and cleaned up we may end up not having to do\n      // an animation at all, therefore we should check this before issuing a post\n      // digest callback. Structural animations will always run no matter what.\n      var isValidAnimation = newAnimation.structural;\n      if (!isValidAnimation) {\n        // animate (from/to) can be quickly checked first, otherwise we check if any classes are present\n        isValidAnimation = (newAnimation.event === 'animate' && Object.keys(newAnimation.options.to || {}).length > 0)\n                            || hasAnimationClasses(newAnimation);\n      }\n\n      if (!isValidAnimation) {\n        close();\n        clearElementAnimationState(node);\n        return runner;\n      }\n\n      // the counter keeps track of cancelled animations\n      var counter = (existingAnimation.counter || 0) + 1;\n      newAnimation.counter = counter;\n\n      markElementAnimationState(node, PRE_DIGEST_STATE, newAnimation);\n\n      $rootScope.$$postDigest(function() {\n        // It is possible that the DOM nodes inside `originalElement` have been replaced. This can\n        // happen if the animated element is a transcluded clone and also has a `templateUrl`\n        // directive on it. Therefore, we must recreate `element` in order to interact with the\n        // actual DOM nodes.\n        // Note: We still need to use the old `node` for certain things, such as looking up in\n        //       HashMaps where it was used as the key.\n\n        element = stripCommentsFromElement(originalElement);\n\n        var animationDetails = activeAnimationsLookup.get(node);\n        var animationCancelled = !animationDetails;\n        animationDetails = animationDetails || {};\n\n        // if addClass/removeClass is called before something like enter then the\n        // registered parent element may not be present. The code below will ensure\n        // that a final value for parent element is obtained\n        var parentElement = element.parent() || [];\n\n        // animate/structural/class-based animations all have requirements. Otherwise there\n        // is no point in performing an animation. The parent node must also be set.\n        var isValidAnimation = parentElement.length > 0\n                                && (animationDetails.event === 'animate'\n                                    || animationDetails.structural\n                                    || hasAnimationClasses(animationDetails));\n\n        // this means that the previous animation was cancelled\n        // even if the follow-up animation is the same event\n        if (animationCancelled || animationDetails.counter !== counter || !isValidAnimation) {\n          // if another animation did not take over then we need\n          // to make sure that the domOperation and options are\n          // handled accordingly\n          if (animationCancelled) {\n            applyAnimationClasses(element, options);\n            applyAnimationStyles(element, options);\n          }\n\n          // if the event changed from something like enter to leave then we do\n          // it, otherwise if it's the same then the end result will be the same too\n          if (animationCancelled || (isStructural && animationDetails.event !== event)) {\n            options.domOperation();\n            runner.end();\n          }\n\n          // in the event that the element animation was not cancelled or a follow-up animation\n          // isn't allowed to animate from here then we need to clear the state of the element\n          // so that any future animations won't read the expired animation data.\n          if (!isValidAnimation) {\n            clearElementAnimationState(node);\n          }\n\n          return;\n        }\n\n        // this combined multiple class to addClass / removeClass into a setClass event\n        // so long as a structural event did not take over the animation\n        event = !animationDetails.structural && hasAnimationClasses(animationDetails, true)\n            ? 'setClass'\n            : animationDetails.event;\n\n        markElementAnimationState(node, RUNNING_STATE);\n        var realRunner = $$animation(element, event, animationDetails.options);\n\n        // this will update the runner's flow-control events based on\n        // the `realRunner` object.\n        runner.setHost(realRunner);\n        notifyProgress(runner, event, 'start', getEventData(options));\n\n        realRunner.done(function(status) {\n          close(!status);\n          var animationDetails = activeAnimationsLookup.get(node);\n          if (animationDetails && animationDetails.counter === counter) {\n            clearElementAnimationState(node);\n          }\n          notifyProgress(runner, event, 'close', getEventData(options));\n        });\n      });\n\n      return runner;\n\n      function notifyProgress(runner, event, phase, data) {\n        runInNextPostDigestOrNow(function() {\n          var callbacks = findCallbacks(parentNode, node, event);\n          if (callbacks.length) {\n            // do not optimize this call here to RAF because\n            // we don't know how heavy the callback code here will\n            // be and if this code is buffered then this can\n            // lead to a performance regression.\n            $$rAF(function() {\n              forEach(callbacks, function(callback) {\n                callback(element, phase, data);\n              });\n              cleanupEventListeners(phase, node);\n            });\n          } else {\n            cleanupEventListeners(phase, node);\n          }\n        });\n        runner.progress(event, phase, data);\n      }\n\n      function close(reject) {\n        clearGeneratedClasses(element, options);\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n        options.domOperation();\n        runner.complete(!reject);\n      }\n    }\n\n    function closeChildAnimations(node) {\n      var children = node.querySelectorAll('[' + NG_ANIMATE_ATTR_NAME + ']');\n      forEach(children, function(child) {\n        var state = parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME), 10);\n        var animationDetails = activeAnimationsLookup.get(child);\n        if (animationDetails) {\n          switch (state) {\n            case RUNNING_STATE:\n              animationDetails.runner.end();\n              /* falls through */\n            case PRE_DIGEST_STATE:\n              activeAnimationsLookup.delete(child);\n              break;\n          }\n        }\n      });\n    }\n\n    function clearElementAnimationState(node) {\n      node.removeAttribute(NG_ANIMATE_ATTR_NAME);\n      activeAnimationsLookup.delete(node);\n    }\n\n    /**\n     * This fn returns false if any of the following is true:\n     * a) animations on any parent element are disabled, and animations on the element aren't explicitly allowed\n     * b) a parent element has an ongoing structural animation, and animateChildren is false\n     * c) the element is not a child of the body\n     * d) the element is not a child of the $rootElement\n     */\n    function areAnimationsAllowed(node, parentNode, event) {\n      var bodyNode = $document[0].body;\n      var rootNode = getDomNode($rootElement);\n\n      var bodyNodeDetected = (node === bodyNode) || node.nodeName === 'HTML';\n      var rootNodeDetected = (node === rootNode);\n      var parentAnimationDetected = false;\n      var elementDisabled = disabledElementsLookup.get(node);\n      var animateChildren;\n\n      var parentHost = jqLite.data(node, NG_ANIMATE_PIN_DATA);\n      if (parentHost) {\n        parentNode = getDomNode(parentHost);\n      }\n\n      while (parentNode) {\n        if (!rootNodeDetected) {\n          // AngularJS doesn't want to attempt to animate elements outside of the application\n          // therefore we need to ensure that the rootElement is an ancestor of the current element\n          rootNodeDetected = (parentNode === rootNode);\n        }\n\n        if (parentNode.nodeType !== ELEMENT_NODE) {\n          // no point in inspecting the #document element\n          break;\n        }\n\n        var details = activeAnimationsLookup.get(parentNode) || {};\n        // either an enter, leave or move animation will commence\n        // therefore we can't allow any animations to take place\n        // but if a parent animation is class-based then that's ok\n        if (!parentAnimationDetected) {\n          var parentNodeDisabled = disabledElementsLookup.get(parentNode);\n\n          if (parentNodeDisabled === true && elementDisabled !== false) {\n            // disable animations if the user hasn't explicitly enabled animations on the\n            // current element\n            elementDisabled = true;\n            // element is disabled via parent element, no need to check anything else\n            break;\n          } else if (parentNodeDisabled === false) {\n            elementDisabled = false;\n          }\n          parentAnimationDetected = details.structural;\n        }\n\n        if (isUndefined(animateChildren) || animateChildren === true) {\n          var value = jqLite.data(parentNode, NG_ANIMATE_CHILDREN_DATA);\n          if (isDefined(value)) {\n            animateChildren = value;\n          }\n        }\n\n        // there is no need to continue traversing at this point\n        if (parentAnimationDetected && animateChildren === false) break;\n\n        if (!bodyNodeDetected) {\n          // we also need to ensure that the element is or will be a part of the body element\n          // otherwise it is pointless to even issue an animation to be rendered\n          bodyNodeDetected = (parentNode === bodyNode);\n        }\n\n        if (bodyNodeDetected && rootNodeDetected) {\n          // If both body and root have been found, any other checks are pointless,\n          // as no animation data should live outside the application\n          break;\n        }\n\n        if (!rootNodeDetected) {\n          // If `rootNode` is not detected, check if `parentNode` is pinned to another element\n          parentHost = jqLite.data(parentNode, NG_ANIMATE_PIN_DATA);\n          if (parentHost) {\n            // The pin target element becomes the next parent element\n            parentNode = getDomNode(parentHost);\n            continue;\n          }\n        }\n\n        parentNode = parentNode.parentNode;\n      }\n\n      var allowAnimation = (!parentAnimationDetected || animateChildren) && elementDisabled !== true;\n      return allowAnimation && rootNodeDetected && bodyNodeDetected;\n    }\n\n    function markElementAnimationState(node, state, details) {\n      details = details || {};\n      details.state = state;\n\n      node.setAttribute(NG_ANIMATE_ATTR_NAME, state);\n\n      var oldValue = activeAnimationsLookup.get(node);\n      var newValue = oldValue\n          ? extend(oldValue, details)\n          : details;\n      activeAnimationsLookup.set(node, newValue);\n    }\n  }];\n}];\n\n/** @this */\nvar $$AnimateCacheProvider = function() {\n\n  var KEY = '$$ngAnimateParentKey';\n  var parentCounter = 0;\n  var cache = Object.create(null);\n\n  this.$get = [function() {\n    return {\n      cacheKey: function(node, method, addClass, removeClass) {\n        var parentNode = node.parentNode;\n        var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter);\n        var parts = [parentID, method, node.getAttribute('class')];\n        if (addClass) {\n          parts.push(addClass);\n        }\n        if (removeClass) {\n          parts.push(removeClass);\n        }\n        return parts.join(' ');\n      },\n\n      containsCachedAnimationWithoutDuration: function(key) {\n        var entry = cache[key];\n\n        // nothing cached, so go ahead and animate\n        // otherwise it should be a valid animation\n        return (entry && !entry.isValid) || false;\n      },\n\n      flush: function() {\n        cache = Object.create(null);\n      },\n\n      count: function(key) {\n        var entry = cache[key];\n        return entry ? entry.total : 0;\n      },\n\n      get: function(key) {\n        var entry = cache[key];\n        return entry && entry.value;\n      },\n\n      put: function(key, value, isValid) {\n        if (!cache[key]) {\n          cache[key] = { total: 1, value: value, isValid: isValid };\n        } else {\n          cache[key].total++;\n          cache[key].value = value;\n        }\n      }\n    };\n  }];\n};\n\n/* exported $$AnimationProvider */\n\nvar $$AnimationProvider = ['$animateProvider', /** @this */ function($animateProvider) {\n  var NG_ANIMATE_REF_ATTR = 'ng-animate-ref';\n\n  var drivers = this.drivers = [];\n\n  var RUNNER_STORAGE_KEY = '$$animationRunner';\n  var PREPARE_CLASSES_KEY = '$$animatePrepareClasses';\n\n  function setRunner(element, runner) {\n    element.data(RUNNER_STORAGE_KEY, runner);\n  }\n\n  function removeRunner(element) {\n    element.removeData(RUNNER_STORAGE_KEY);\n  }\n\n  function getRunner(element) {\n    return element.data(RUNNER_STORAGE_KEY);\n  }\n\n  this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$Map', '$$rAFScheduler', '$$animateCache',\n       function($$jqLite,   $rootScope,   $injector,   $$AnimateRunner,   $$Map,   $$rAFScheduler, $$animateCache) {\n\n    var animationQueue = [];\n    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);\n\n    function sortAnimations(animations) {\n      var tree = { children: [] };\n      var i, lookup = new $$Map();\n\n      // this is done first beforehand so that the map\n      // is filled with a list of the elements that will be animated\n      for (i = 0; i < animations.length; i++) {\n        var animation = animations[i];\n        lookup.set(animation.domNode, animations[i] = {\n          domNode: animation.domNode,\n          element: animation.element,\n          fn: animation.fn,\n          children: []\n        });\n      }\n\n      for (i = 0; i < animations.length; i++) {\n        processNode(animations[i]);\n      }\n\n      return flatten(tree);\n\n      function processNode(entry) {\n        if (entry.processed) return entry;\n        entry.processed = true;\n\n        var elementNode = entry.domNode;\n        var parentNode = elementNode.parentNode;\n        lookup.set(elementNode, entry);\n\n        var parentEntry;\n        while (parentNode) {\n          parentEntry = lookup.get(parentNode);\n          if (parentEntry) {\n            if (!parentEntry.processed) {\n              parentEntry = processNode(parentEntry);\n            }\n            break;\n          }\n          parentNode = parentNode.parentNode;\n        }\n\n        (parentEntry || tree).children.push(entry);\n        return entry;\n      }\n\n      function flatten(tree) {\n        var result = [];\n        var queue = [];\n        var i;\n\n        for (i = 0; i < tree.children.length; i++) {\n          queue.push(tree.children[i]);\n        }\n\n        var remainingLevelEntries = queue.length;\n        var nextLevelEntries = 0;\n        var row = [];\n\n        for (i = 0; i < queue.length; i++) {\n          var entry = queue[i];\n          if (remainingLevelEntries <= 0) {\n            remainingLevelEntries = nextLevelEntries;\n            nextLevelEntries = 0;\n            result.push(row);\n            row = [];\n          }\n          row.push(entry);\n          entry.children.forEach(function(childEntry) {\n            nextLevelEntries++;\n            queue.push(childEntry);\n          });\n          remainingLevelEntries--;\n        }\n\n        if (row.length) {\n          result.push(row);\n        }\n\n        return result;\n      }\n    }\n\n    // TODO(matsko): document the signature in a better way\n    return function(element, event, options) {\n      options = prepareAnimationOptions(options);\n      var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;\n\n      // there is no animation at the current moment, however\n      // these runner methods will get later updated with the\n      // methods leading into the driver's end/cancel methods\n      // for now they just stop the animation from starting\n      var runner = new $$AnimateRunner({\n        end: function() { close(); },\n        cancel: function() { close(true); }\n      });\n\n      if (!drivers.length) {\n        close();\n        return runner;\n      }\n\n      var classes = mergeClasses(element.attr('class'), mergeClasses(options.addClass, options.removeClass));\n      var tempClasses = options.tempClasses;\n      if (tempClasses) {\n        classes += ' ' + tempClasses;\n        options.tempClasses = null;\n      }\n\n      if (isStructural) {\n        element.data(PREPARE_CLASSES_KEY, 'ng-' + event + PREPARE_CLASS_SUFFIX);\n      }\n\n      setRunner(element, runner);\n\n      animationQueue.push({\n        // this data is used by the postDigest code and passed into\n        // the driver step function\n        element: element,\n        classes: classes,\n        event: event,\n        structural: isStructural,\n        options: options,\n        beforeStart: beforeStart,\n        close: close\n      });\n\n      element.on('$destroy', handleDestroyedElement);\n\n      // we only want there to be one function called within the post digest\n      // block. This way we can group animations for all the animations that\n      // were apart of the same postDigest flush call.\n      if (animationQueue.length > 1) return runner;\n\n      $rootScope.$$postDigest(function() {\n        var animations = [];\n        forEach(animationQueue, function(entry) {\n          // the element was destroyed early on which removed the runner\n          // form its storage. This means we can't animate this element\n          // at all and it already has been closed due to destruction.\n          if (getRunner(entry.element)) {\n            animations.push(entry);\n          } else {\n            entry.close();\n          }\n        });\n\n        // now any future animations will be in another postDigest\n        animationQueue.length = 0;\n\n        var groupedAnimations = groupAnimations(animations);\n        var toBeSortedAnimations = [];\n\n        forEach(groupedAnimations, function(animationEntry) {\n          var element = animationEntry.from ? animationEntry.from.element : animationEntry.element;\n          var extraClasses = options.addClass;\n\n          extraClasses = (extraClasses ? (extraClasses + ' ') : '') + NG_ANIMATE_CLASSNAME;\n          var cacheKey = $$animateCache.cacheKey(element[0], animationEntry.event, extraClasses, options.removeClass);\n\n          toBeSortedAnimations.push({\n            element: element,\n            domNode: getDomNode(element),\n            fn: function triggerAnimationStart() {\n              var startAnimationFn, closeFn = animationEntry.close;\n\n              // in the event that we've cached the animation status for this element\n              // and it's in fact an invalid animation (something that has duration = 0)\n              // then we should skip all the heavy work from here on\n              if ($$animateCache.containsCachedAnimationWithoutDuration(cacheKey)) {\n                closeFn();\n                return;\n              }\n\n              // it's important that we apply the `ng-animate` CSS class and the\n              // temporary classes before we do any driver invoking since these\n              // CSS classes may be required for proper CSS detection.\n              animationEntry.beforeStart();\n\n              // in the event that the element was removed before the digest runs or\n              // during the RAF sequencing then we should not trigger the animation.\n              var targetElement = animationEntry.anchors\n                  ? (animationEntry.from.element || animationEntry.to.element)\n                  : animationEntry.element;\n\n              if (getRunner(targetElement)) {\n                var operation = invokeFirstDriver(animationEntry);\n                if (operation) {\n                  startAnimationFn = operation.start;\n                }\n              }\n\n              if (!startAnimationFn) {\n                closeFn();\n              } else {\n                var animationRunner = startAnimationFn();\n                animationRunner.done(function(status) {\n                  closeFn(!status);\n                });\n                updateAnimationRunners(animationEntry, animationRunner);\n              }\n            }\n          });\n        });\n\n        // we need to sort each of the animations in order of parent to child\n        // relationships. This ensures that the child classes are applied at the\n        // right time.\n        var finalAnimations = sortAnimations(toBeSortedAnimations);\n        for (var i = 0; i < finalAnimations.length; i++) {\n          var innerArray = finalAnimations[i];\n          for (var j = 0; j < innerArray.length; j++) {\n            var entry = innerArray[j];\n            var element = entry.element;\n\n            // the RAFScheduler code only uses functions\n            finalAnimations[i][j] = entry.fn;\n\n            // the first row of elements shouldn't have a prepare-class added to them\n            // since the elements are at the top of the animation hierarchy and they\n            // will be applied without a RAF having to pass...\n            if (i === 0) {\n              element.removeData(PREPARE_CLASSES_KEY);\n              continue;\n            }\n\n            var prepareClassName = element.data(PREPARE_CLASSES_KEY);\n            if (prepareClassName) {\n              $$jqLite.addClass(element, prepareClassName);\n            }\n          }\n        }\n\n        $$rAFScheduler(finalAnimations);\n      });\n\n      return runner;\n\n      // TODO(matsko): change to reference nodes\n      function getAnchorNodes(node) {\n        var SELECTOR = '[' + NG_ANIMATE_REF_ATTR + ']';\n        var items = node.hasAttribute(NG_ANIMATE_REF_ATTR)\n              ? [node]\n              : node.querySelectorAll(SELECTOR);\n        var anchors = [];\n        forEach(items, function(node) {\n          var attr = node.getAttribute(NG_ANIMATE_REF_ATTR);\n          if (attr && attr.length) {\n            anchors.push(node);\n          }\n        });\n        return anchors;\n      }\n\n      function groupAnimations(animations) {\n        var preparedAnimations = [];\n        var refLookup = {};\n        forEach(animations, function(animation, index) {\n          var element = animation.element;\n          var node = getDomNode(element);\n          var event = animation.event;\n          var enterOrMove = ['enter', 'move'].indexOf(event) >= 0;\n          var anchorNodes = animation.structural ? getAnchorNodes(node) : [];\n\n          if (anchorNodes.length) {\n            var direction = enterOrMove ? 'to' : 'from';\n\n            forEach(anchorNodes, function(anchor) {\n              var key = anchor.getAttribute(NG_ANIMATE_REF_ATTR);\n              refLookup[key] = refLookup[key] || {};\n              refLookup[key][direction] = {\n                animationID: index,\n                element: jqLite(anchor)\n              };\n            });\n          } else {\n            preparedAnimations.push(animation);\n          }\n        });\n\n        var usedIndicesLookup = {};\n        var anchorGroups = {};\n        forEach(refLookup, function(operations, key) {\n          var from = operations.from;\n          var to = operations.to;\n\n          if (!from || !to) {\n            // only one of these is set therefore we can't have an\n            // anchor animation since all three pieces are required\n            var index = from ? from.animationID : to.animationID;\n            var indexKey = index.toString();\n            if (!usedIndicesLookup[indexKey]) {\n              usedIndicesLookup[indexKey] = true;\n              preparedAnimations.push(animations[index]);\n            }\n            return;\n          }\n\n          var fromAnimation = animations[from.animationID];\n          var toAnimation = animations[to.animationID];\n          var lookupKey = from.animationID.toString();\n          if (!anchorGroups[lookupKey]) {\n            var group = anchorGroups[lookupKey] = {\n              structural: true,\n              beforeStart: function() {\n                fromAnimation.beforeStart();\n                toAnimation.beforeStart();\n              },\n              close: function() {\n                fromAnimation.close();\n                toAnimation.close();\n              },\n              classes: cssClassesIntersection(fromAnimation.classes, toAnimation.classes),\n              from: fromAnimation,\n              to: toAnimation,\n              anchors: [] // TODO(matsko): change to reference nodes\n            };\n\n            // the anchor animations require that the from and to elements both have at least\n            // one shared CSS class which effectively marries the two elements together to use\n            // the same animation driver and to properly sequence the anchor animation.\n            if (group.classes.length) {\n              preparedAnimations.push(group);\n            } else {\n              preparedAnimations.push(fromAnimation);\n              preparedAnimations.push(toAnimation);\n            }\n          }\n\n          anchorGroups[lookupKey].anchors.push({\n            'out': from.element, 'in': to.element\n          });\n        });\n\n        return preparedAnimations;\n      }\n\n      function cssClassesIntersection(a,b) {\n        a = a.split(' ');\n        b = b.split(' ');\n        var matches = [];\n\n        for (var i = 0; i < a.length; i++) {\n          var aa = a[i];\n          if (aa.substring(0,3) === 'ng-') continue;\n\n          for (var j = 0; j < b.length; j++) {\n            if (aa === b[j]) {\n              matches.push(aa);\n              break;\n            }\n          }\n        }\n\n        return matches.join(' ');\n      }\n\n      function invokeFirstDriver(animationDetails) {\n        // we loop in reverse order since the more general drivers (like CSS and JS)\n        // may attempt more elements, but custom drivers are more particular\n        for (var i = drivers.length - 1; i >= 0; i--) {\n          var driverName = drivers[i];\n          var factory = $injector.get(driverName);\n          var driver = factory(animationDetails);\n          if (driver) {\n            return driver;\n          }\n        }\n      }\n\n      function beforeStart() {\n        tempClasses = (tempClasses ? (tempClasses + ' ') : '') + NG_ANIMATE_CLASSNAME;\n        $$jqLite.addClass(element, tempClasses);\n\n        var prepareClassName = element.data(PREPARE_CLASSES_KEY);\n        if (prepareClassName) {\n          $$jqLite.removeClass(element, prepareClassName);\n          prepareClassName = null;\n        }\n      }\n\n      function updateAnimationRunners(animation, newRunner) {\n        if (animation.from && animation.to) {\n          update(animation.from.element);\n          update(animation.to.element);\n        } else {\n          update(animation.element);\n        }\n\n        function update(element) {\n          var runner = getRunner(element);\n          if (runner) runner.setHost(newRunner);\n        }\n      }\n\n      function handleDestroyedElement() {\n        var runner = getRunner(element);\n        if (runner && (event !== 'leave' || !options.$$domOperationFired)) {\n          runner.end();\n        }\n      }\n\n      function close(rejected) {\n        element.off('$destroy', handleDestroyedElement);\n        removeRunner(element);\n\n        applyAnimationClasses(element, options);\n        applyAnimationStyles(element, options);\n        options.domOperation();\n\n        if (tempClasses) {\n          $$jqLite.removeClass(element, tempClasses);\n        }\n\n        runner.complete(!rejected);\n      }\n    };\n  }];\n}];\n\n/**\n * @ngdoc directive\n * @name ngAnimateSwap\n * @restrict A\n * @scope\n *\n * @description\n *\n * ngAnimateSwap is a animation-oriented directive that allows for the container to\n * be removed and entered in whenever the associated expression changes. A\n * common usecase for this directive is a rotating banner or slider component which\n * contains one image being present at a time. When the active image changes\n * then the old image will perform a `leave` animation and the new element\n * will be inserted via an `enter` animation.\n *\n * @animations\n * | Animation                        | Occurs                               |\n * |----------------------------------|--------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the new element is inserted to the DOM  |\n * | {@link ng.$animate#leave leave}  | when the old element is removed from the DOM |\n *\n * @example\n * <example name=\"ngAnimateSwap-directive\" module=\"ngAnimateSwapExample\"\n *          deps=\"angular-animate.js\"\n *          animations=\"true\" fixBase=\"true\">\n *   <file name=\"index.html\">\n *     <div class=\"container\" ng-controller=\"AppCtrl\">\n *       <div ng-animate-swap=\"number\" class=\"cell swap-animation\" ng-class=\"colorClass(number)\">\n *         {{ number }}\n *       </div>\n *     </div>\n *   </file>\n *   <file name=\"script.js\">\n *     angular.module('ngAnimateSwapExample', ['ngAnimate'])\n *       .controller('AppCtrl', ['$scope', '$interval', function($scope, $interval) {\n *         $scope.number = 0;\n *         $interval(function() {\n *           $scope.number++;\n *         }, 1000);\n *\n *         var colors = ['red','blue','green','yellow','orange'];\n *         $scope.colorClass = function(number) {\n *           return colors[number % colors.length];\n *         };\n *       }]);\n *   </file>\n *  <file name=\"animations.css\">\n *  .container {\n *    height:250px;\n *    width:250px;\n *    position:relative;\n *    overflow:hidden;\n *    border:2px solid black;\n *  }\n *  .container .cell {\n *    font-size:150px;\n *    text-align:center;\n *    line-height:250px;\n *    position:absolute;\n *    top:0;\n *    left:0;\n *    right:0;\n *    border-bottom:2px solid black;\n *  }\n *  .swap-animation.ng-enter, .swap-animation.ng-leave {\n *    transition:0.5s linear all;\n *  }\n *  .swap-animation.ng-enter {\n *    top:-250px;\n *  }\n *  .swap-animation.ng-enter-active {\n *    top:0px;\n *  }\n *  .swap-animation.ng-leave {\n *    top:0px;\n *  }\n *  .swap-animation.ng-leave-active {\n *    top:250px;\n *  }\n *  .red { background:red; }\n *  .green { background:green; }\n *  .blue { background:blue; }\n *  .yellow { background:yellow; }\n *  .orange { background:orange; }\n *  </file>\n * </example>\n */\nvar ngAnimateSwapDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    transclude: 'element',\n    terminal: true,\n    priority: 550, // We use 550 here to ensure that the directive is caught before others,\n                   // but after `ngIf` (at priority 600).\n    link: function(scope, $element, attrs, ctrl, $transclude) {\n      var previousElement, previousScope;\n      scope.$watchCollection(attrs.ngAnimateSwap || attrs['for'], function(value) {\n        if (previousElement) {\n          $animate.leave(previousElement);\n        }\n        if (previousScope) {\n          previousScope.$destroy();\n          previousScope = null;\n        }\n        if (value || value === 0) {\n          $transclude(function(clone, childScope) {\n            previousElement = clone;\n            previousScope = childScope;\n            $animate.enter(clone, null, $element);\n          });\n        }\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc module\n * @name ngAnimate\n * @description\n *\n * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via\n * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` the animation hooks are enabled for an AngularJS app.\n *\n * ## Usage\n * Simply put, there are two ways to make use of animations when ngAnimate is used: by using **CSS** and **JavaScript**. The former works purely based\n * using CSS (by using matching CSS selectors/styles) and the latter triggers animations that are registered via `module.animation()`. For\n * both CSS and JS animations the sole requirement is to have a matching `CSS class` that exists both in the registered animation and within\n * the HTML element that the animation will be triggered on.\n *\n * ## Directive Support\n * The following directives are \"animation aware\":\n *\n * | Directive                                                                     | Supported Animations                                                      |\n * |-------------------------------------------------------------------------------|---------------------------------------------------------------------------|\n * | {@link ng.directive:form#animations form / ngForm}                            | add and remove ({@link ng.directive:form#css-classes various classes})    |\n * | {@link ngAnimate.directive:ngAnimateSwap#animations ngAnimateSwap}            | enter and leave                                                           |\n * | {@link ng.directive:ngClass#animations ngClass / {{class&#125;&#8203;&#125;}  | add and remove                                                            |\n * | {@link ng.directive:ngClassEven#animations ngClassEven}                       | add and remove                                                            |\n * | {@link ng.directive:ngClassOdd#animations ngClassOdd}                         | add and remove                                                            |\n * | {@link ng.directive:ngHide#animations ngHide}                                 | add and remove (the `ng-hide` class)                                      |\n * | {@link ng.directive:ngIf#animations ngIf}                                     | enter and leave                                                           |\n * | {@link ng.directive:ngInclude#animations ngInclude}                           | enter and leave                                                           |\n * | {@link module:ngMessages#animations ngMessage / ngMessageExp}                 | enter and leave                                                           |\n * | {@link module:ngMessages#animations ngMessages}                               | add and remove (the `ng-active`/`ng-inactive` classes)                    |\n * | {@link ng.directive:ngModel#animations ngModel}                               | add and remove ({@link ng.directive:ngModel#css-classes various classes}) |\n * | {@link ng.directive:ngRepeat#animations ngRepeat}                             | enter, leave, and move                                                    |\n * | {@link ng.directive:ngShow#animations ngShow}                                 | add and remove (the `ng-hide` class)                                      |\n * | {@link ng.directive:ngSwitch#animations ngSwitch}                             | enter and leave                                                           |\n * | {@link ngRoute.directive:ngView#animations ngView}                            | enter and leave                                                           |\n *\n * (More information can be found by visiting the documentation associated with each directive.)\n *\n * For a full breakdown of the steps involved during each animation event, refer to the\n * {@link ng.$animate `$animate` API docs}.\n *\n * ## CSS-based Animations\n *\n * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML\n * and CSS code we can create an animation that will be picked up by AngularJS when an underlying directive performs an operation.\n *\n * The example below shows how an `enter` animation can be made possible on an element using `ng-if`:\n *\n * ```html\n * <div ng-if=\"bool\" class=\"fade\">\n *    Fade me in out\n * </div>\n * <button ng-click=\"bool=true\">Fade In!</button>\n * <button ng-click=\"bool=false\">Fade Out!</button>\n * ```\n *\n * Notice the CSS class **fade**? We can now create the CSS transition code that references this class:\n *\n * ```css\n * /&#42; The starting CSS styles for the enter animation &#42;/\n * .fade.ng-enter {\n *   transition:0.5s linear all;\n *   opacity:0;\n * }\n *\n * /&#42; The finishing CSS styles for the enter animation &#42;/\n * .fade.ng-enter.ng-enter-active {\n *   opacity:1;\n * }\n * ```\n *\n * The key thing to remember here is that, depending on the animation event (which each of the directives above trigger depending on what's going on) two\n * generated CSS classes will be applied to the element; in the example above we have `.ng-enter` and `.ng-enter-active`. For CSS transitions, the transition\n * code **must** be defined within the starting CSS class (in this case `.ng-enter`). The destination class is what the transition will animate towards.\n *\n * If for example we wanted to create animations for `leave` and `move` (ngRepeat triggers move) then we can do so using the same CSS naming conventions:\n *\n * ```css\n * /&#42; now the element will fade out before it is removed from the DOM &#42;/\n * .fade.ng-leave {\n *   transition:0.5s linear all;\n *   opacity:1;\n * }\n * .fade.ng-leave.ng-leave-active {\n *   opacity:0;\n * }\n * ```\n *\n * We can also make use of **CSS Keyframes** by referencing the keyframe animation within the starting CSS class:\n *\n * ```css\n * /&#42; there is no need to define anything inside of the destination\n * CSS class since the keyframe will take charge of the animation &#42;/\n * .fade.ng-leave {\n *   animation: my_fade_animation 0.5s linear;\n *   -webkit-animation: my_fade_animation 0.5s linear;\n * }\n *\n * @keyframes my_fade_animation {\n *   from { opacity:1; }\n *   to { opacity:0; }\n * }\n *\n * @-webkit-keyframes my_fade_animation {\n *   from { opacity:1; }\n *   to { opacity:0; }\n * }\n * ```\n *\n * Feel free also mix transitions and keyframes together as well as any other CSS classes on the same element.\n *\n * ### CSS Class-based Animations\n *\n * Class-based animations (animations that are triggered via `ngClass`, `ngShow`, `ngHide` and some other directives) have a slightly different\n * naming convention. Class-based animations are basic enough that a standard transition or keyframe can be referenced on the class being added\n * and removed.\n *\n * For example if we wanted to do a CSS animation for `ngHide` then we place an animation on the `.ng-hide` CSS class:\n *\n * ```html\n * <div ng-show=\"bool\" class=\"fade\">\n *   Show and hide me\n * </div>\n * <button ng-click=\"bool=!bool\">Toggle</button>\n *\n * <style>\n * .fade.ng-hide {\n *   transition:0.5s linear all;\n *   opacity:0;\n * }\n * </style>\n * ```\n *\n * All that is going on here with ngShow/ngHide behind the scenes is the `.ng-hide` class is added/removed (when the hidden state is valid). Since\n * ngShow and ngHide are animation aware then we can match up a transition and ngAnimate handles the rest.\n *\n * In addition the addition and removal of the CSS class, ngAnimate also provides two helper methods that we can use to further decorate the animation\n * with CSS styles.\n *\n * ```html\n * <div ng-class=\"{on:onOff}\" class=\"highlight\">\n *   Highlight this box\n * </div>\n * <button ng-click=\"onOff=!onOff\">Toggle</button>\n *\n * <style>\n * .highlight {\n *   transition:0.5s linear all;\n * }\n * .highlight.on-add {\n *   background:white;\n * }\n * .highlight.on {\n *   background:yellow;\n * }\n * .highlight.on-remove {\n *   background:black;\n * }\n * </style>\n * ```\n *\n * We can also make use of CSS keyframes by placing them within the CSS classes.\n *\n *\n * ### CSS Staggering Animations\n * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a\n * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be\n * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for\n * the animation. The style property expected within the stagger class can either be a **transition-delay** or an\n * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).\n *\n * ```css\n * .my-animation.ng-enter {\n *   /&#42; standard transition code &#42;/\n *   transition: 1s linear all;\n *   opacity:0;\n * }\n * .my-animation.ng-enter-stagger {\n *   /&#42; this will have a 100ms delay between each successive leave animation &#42;/\n *   transition-delay: 0.1s;\n *\n *   /&#42; As of 1.4.4, this must always be set: it signals ngAnimate\n *     to not accidentally inherit a delay property from another CSS class &#42;/\n *   transition-duration: 0s;\n *\n *   /&#42; if you are using animations instead of transitions you should configure as follows:\n *     animation-delay: 0.1s;\n *     animation-duration: 0s; &#42;/\n * }\n * .my-animation.ng-enter.ng-enter-active {\n *   /&#42; standard transition styles &#42;/\n *   opacity:1;\n * }\n * ```\n *\n * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations\n * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this\n * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation\n * will also be reset if one or more animation frames have passed since the multiple calls to `$animate` were fired.\n *\n * The following code will issue the **ng-leave-stagger** event on the element provided:\n *\n * ```js\n * var kids = parent.children();\n *\n * $animate.leave(kids[0]); //stagger index=0\n * $animate.leave(kids[1]); //stagger index=1\n * $animate.leave(kids[2]); //stagger index=2\n * $animate.leave(kids[3]); //stagger index=3\n * $animate.leave(kids[4]); //stagger index=4\n *\n * window.requestAnimationFrame(function() {\n *   //stagger has reset itself\n *   $animate.leave(kids[5]); //stagger index=0\n *   $animate.leave(kids[6]); //stagger index=1\n *\n *   $scope.$digest();\n * });\n * ```\n *\n * Stagger animations are currently only supported within CSS-defined animations.\n *\n * ### The `ng-animate` CSS class\n *\n * When ngAnimate is animating an element it will apply the `ng-animate` CSS class to the element for the duration of the animation.\n * This is a temporary CSS class and it will be removed once the animation is over (for both JavaScript and CSS-based animations).\n *\n * Therefore, animations can be applied to an element using this temporary class directly via CSS.\n *\n * ```css\n * .zipper.ng-animate {\n *   transition:0.5s linear all;\n * }\n * .zipper.ng-enter {\n *   opacity:0;\n * }\n * .zipper.ng-enter.ng-enter-active {\n *   opacity:1;\n * }\n * .zipper.ng-leave {\n *   opacity:1;\n * }\n * .zipper.ng-leave.ng-leave-active {\n *   opacity:0;\n * }\n * ```\n *\n * (Note that the `ng-animate` CSS class is reserved and it cannot be applied on an element directly since ngAnimate will always remove\n * the CSS class once an animation has completed.)\n *\n *\n * ### The `ng-[event]-prepare` class\n *\n * This is a special class that can be used to prevent unwanted flickering / flash of content before\n * the actual animation starts. The class is added as soon as an animation is initialized, but removed\n * before the actual animation starts (after waiting for a $digest).\n * It is also only added for *structural* animations (`enter`, `move`, and `leave`).\n *\n * In practice, flickering can appear when nesting elements with structural animations such as `ngIf`\n * into elements that have class-based animations such as `ngClass`.\n *\n * ```html\n * <div ng-class=\"{red: myProp}\">\n *   <div ng-class=\"{blue: myProp}\">\n *     <div class=\"message\" ng-if=\"myProp\"></div>\n *   </div>\n * </div>\n * ```\n *\n * It is possible that during the `enter` animation, the `.message` div will be briefly visible before it starts animating.\n * In that case, you can add styles to the CSS that make sure the element stays hidden before the animation starts:\n *\n * ```css\n * .message.ng-enter-prepare {\n *   opacity: 0;\n * }\n * ```\n *\n * ### Animating between value changes\n *\n * Sometimes you need to animate between different expression states, whose values\n * don't necessary need to be known or referenced in CSS styles.\n * Unless possible with another {@link ngAnimate#directive-support \"animation aware\" directive},\n * that specific use case can always be covered with {@link ngAnimate.directive:ngAnimateSwap} as\n * can be seen in {@link ngAnimate.directive:ngAnimateSwap#examples this example}.\n *\n * Note that {@link ngAnimate.directive:ngAnimateSwap} is a *structural directive*, which means it\n * creates a new instance of the element (including any other/child directives it may have) and\n * links it to a new scope every time *swap* happens. In some cases this might not be desirable\n * (e.g. for performance reasons, or when you wish to retain internal state on the original\n * element instance).\n *\n * ## JavaScript-based Animations\n *\n * ngAnimate also allows for animations to be consumed by JavaScript code. The approach is similar to CSS-based animations (where there is a shared\n * CSS class that is referenced in our HTML code) but in addition we need to register the JavaScript animation on the module. By making use of the\n * `module.animation()` module function we can register the animation.\n *\n * Let's see an example of a enter/leave animation using `ngRepeat`:\n *\n * ```html\n * <div ng-repeat=\"item in items\" class=\"slide\">\n *   {{ item }}\n * </div>\n * ```\n *\n * See the **slide** CSS class? Let's use that class to define an animation that we'll structure in our module code by using `module.animation`:\n *\n * ```js\n * myModule.animation('.slide', [function() {\n *   return {\n *     // make note that other events (like addClass/removeClass)\n *     // have different function input parameters\n *     enter: function(element, doneFn) {\n *       jQuery(element).fadeIn(1000, doneFn);\n *\n *       // remember to call doneFn so that AngularJS\n *       // knows that the animation has concluded\n *     },\n *\n *     move: function(element, doneFn) {\n *       jQuery(element).fadeIn(1000, doneFn);\n *     },\n *\n *     leave: function(element, doneFn) {\n *       jQuery(element).fadeOut(1000, doneFn);\n *     }\n *   }\n * }]);\n * ```\n *\n * The nice thing about JS-based animations is that we can inject other services and make use of advanced animation libraries such as\n * greensock.js and velocity.js.\n *\n * If our animation code class-based (meaning that something like `ngClass`, `ngHide` and `ngShow` triggers it) then we can still define\n * our animations inside of the same registered animation, however, the function input arguments are a bit different:\n *\n * ```html\n * <div ng-class=\"color\" class=\"colorful\">\n *   this box is moody\n * </div>\n * <button ng-click=\"color='red'\">Change to red</button>\n * <button ng-click=\"color='blue'\">Change to blue</button>\n * <button ng-click=\"color='green'\">Change to green</button>\n * ```\n *\n * ```js\n * myModule.animation('.colorful', [function() {\n *   return {\n *     addClass: function(element, className, doneFn) {\n *       // do some cool animation and call the doneFn\n *     },\n *     removeClass: function(element, className, doneFn) {\n *       // do some cool animation and call the doneFn\n *     },\n *     setClass: function(element, addedClass, removedClass, doneFn) {\n *       // do some cool animation and call the doneFn\n *     }\n *   }\n * }]);\n * ```\n *\n * ## CSS + JS Animations Together\n *\n * AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of AngularJS,\n * defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking\n * charge of the animation**:\n *\n * ```html\n * <div ng-if=\"bool\" class=\"slide\">\n *   Slide in and out\n * </div>\n * ```\n *\n * ```js\n * myModule.animation('.slide', [function() {\n *   return {\n *     enter: function(element, doneFn) {\n *       jQuery(element).slideIn(1000, doneFn);\n *     }\n *   }\n * }]);\n * ```\n *\n * ```css\n * .slide.ng-enter {\n *   transition:0.5s linear all;\n *   transform:translateY(-100px);\n * }\n * .slide.ng-enter.ng-enter-active {\n *   transform:translateY(0);\n * }\n * ```\n *\n * Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the\n * lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from\n * our own JS-based animation code:\n *\n * ```js\n * myModule.animation('.slide', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element) {\n*        // this will trigger `.slide.ng-enter` and `.slide.ng-enter-active`.\n *       return $animateCss(element, {\n *         event: 'enter',\n *         structural: true\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * The nice thing here is that we can save bandwidth by sticking to our CSS-based animation code and we don't need to rely on a 3rd-party animation framework.\n *\n * The `$animateCss` service is very powerful since we can feed in all kinds of extra properties that will be evaluated and fed into a CSS transition or\n * keyframe animation. For example if we wanted to animate the height of an element while adding and removing classes then we can do so by providing that\n * data into `$animateCss` directly:\n *\n * ```js\n * myModule.animation('.slide', ['$animateCss', function($animateCss) {\n *   return {\n *     enter: function(element) {\n *       return $animateCss(element, {\n *         event: 'enter',\n *         structural: true,\n *         addClass: 'maroon-setting',\n *         from: { height:0 },\n *         to: { height: 200 }\n *       });\n *     }\n *   }\n * }]);\n * ```\n *\n * Now we can fill in the rest via our transition CSS code:\n *\n * ```css\n * /&#42; the transition tells ngAnimate to make the animation happen &#42;/\n * .slide.ng-enter { transition:0.5s linear all; }\n *\n * /&#42; this extra CSS class will be absorbed into the transition\n * since the $animateCss code is adding the class &#42;/\n * .maroon-setting { background:red; }\n * ```\n *\n * And `$animateCss` will figure out the rest. Just make sure to have the `done()` callback fire the `doneFn` function to signal when the animation is over.\n *\n * To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}.\n *\n * ## Animation Anchoring (via `ng-animate-ref`)\n *\n * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between\n * structural areas of an application (like views) by pairing up elements using an attribute\n * called `ng-animate-ref`.\n *\n * Let's say for example we have two views that are managed by `ng-view` and we want to show\n * that there is a relationship between two components situated in within these views. By using the\n * `ng-animate-ref` attribute we can identify that the two components are paired together and we\n * can then attach an animation, which is triggered when the view changes.\n *\n * Say for example we have the following template code:\n *\n * ```html\n * <!-- index.html -->\n * <div ng-view class=\"view-animation\">\n * </div>\n *\n * <!-- home.html -->\n * <a href=\"#/banner-page\">\n *   <img src=\"./banner.jpg\" class=\"banner\" ng-animate-ref=\"banner\">\n * </a>\n *\n * <!-- banner-page.html -->\n * <img src=\"./banner.jpg\" class=\"banner\" ng-animate-ref=\"banner\">\n * ```\n *\n * Now, when the view changes (once the link is clicked), ngAnimate will examine the\n * HTML contents to see if there is a match reference between any components in the view\n * that is leaving and the view that is entering. It will scan both the view which is being\n * removed (leave) and inserted (enter) to see if there are any paired DOM elements that\n * contain a matching ref value.\n *\n * The two images match since they share the same ref value. ngAnimate will now create a\n * transport element (which is a clone of the first image element) and it will then attempt\n * to animate to the position of the second image element in the next view. For the animation to\n * work a special CSS class called `ng-anchor` will be added to the transported element.\n *\n * We can now attach a transition onto the `.banner.ng-anchor` CSS class and then\n * ngAnimate will handle the entire transition for us as well as the addition and removal of\n * any changes of CSS classes between the elements:\n *\n * ```css\n * .banner.ng-anchor {\n *   /&#42; this animation will last for 1 second since there are\n *          two phases to the animation (an `in` and an `out` phase) &#42;/\n *   transition:0.5s linear all;\n * }\n * ```\n *\n * We also **must** include animations for the views that are being entered and removed\n * (otherwise anchoring wouldn't be possible since the new view would be inserted right away).\n *\n * ```css\n * .view-animation.ng-enter, .view-animation.ng-leave {\n *   transition:0.5s linear all;\n *   position:fixed;\n *   left:0;\n *   top:0;\n *   width:100%;\n * }\n * .view-animation.ng-enter {\n *   transform:translateX(100%);\n * }\n * .view-animation.ng-leave,\n * .view-animation.ng-enter.ng-enter-active {\n *   transform:translateX(0%);\n * }\n * .view-animation.ng-leave.ng-leave-active {\n *   transform:translateX(-100%);\n * }\n * ```\n *\n * Now we can jump back to the anchor animation. When the animation happens, there are two stages that occur:\n * an `out` and an `in` stage. The `out` stage happens first and that is when the element is animated away\n * from its origin. Once that animation is over then the `in` stage occurs which animates the\n * element to its destination. The reason why there are two animations is to give enough time\n * for the enter animation on the new element to be ready.\n *\n * The example above sets up a transition for both the in and out phases, but we can also target the out or\n * in phases directly via `ng-anchor-out` and `ng-anchor-in`.\n *\n * ```css\n * .banner.ng-anchor-out {\n *   transition: 0.5s linear all;\n *\n *   /&#42; the scale will be applied during the out animation,\n *          but will be animated away when the in animation runs &#42;/\n *   transform: scale(1.2);\n * }\n *\n * .banner.ng-anchor-in {\n *   transition: 1s linear all;\n * }\n * ```\n *\n *\n *\n *\n * ### Anchoring Demo\n *\n  <example module=\"anchoringExample\"\n           name=\"anchoringExample\"\n           id=\"anchoringExample\"\n           deps=\"angular-animate.js;angular-route.js\"\n           animations=\"true\">\n    <file name=\"index.html\">\n      <a href=\"#!/\">Home</a>\n      <hr />\n      <div class=\"view-container\">\n        <div ng-view class=\"view\"></div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('anchoringExample', ['ngAnimate', 'ngRoute'])\n        .config(['$routeProvider', function($routeProvider) {\n          $routeProvider.when('/', {\n            templateUrl: 'home.html',\n            controller: 'HomeController as home'\n          });\n          $routeProvider.when('/profile/:id', {\n            templateUrl: 'profile.html',\n            controller: 'ProfileController as profile'\n          });\n        }])\n        .run(['$rootScope', function($rootScope) {\n          $rootScope.records = [\n            { id: 1, title: 'Miss Beulah Roob' },\n            { id: 2, title: 'Trent Morissette' },\n            { id: 3, title: 'Miss Ava Pouros' },\n            { id: 4, title: 'Rod Pouros' },\n            { id: 5, title: 'Abdul Rice' },\n            { id: 6, title: 'Laurie Rutherford Sr.' },\n            { id: 7, title: 'Nakia McLaughlin' },\n            { id: 8, title: 'Jordon Blanda DVM' },\n            { id: 9, title: 'Rhoda Hand' },\n            { id: 10, title: 'Alexandrea Sauer' }\n          ];\n        }])\n        .controller('HomeController', [function() {\n          //empty\n        }])\n        .controller('ProfileController', ['$rootScope', '$routeParams',\n            function ProfileController($rootScope, $routeParams) {\n          var index = parseInt($routeParams.id, 10);\n          var record = $rootScope.records[index - 1];\n\n          this.title = record.title;\n          this.id = record.id;\n        }]);\n    </file>\n    <file name=\"home.html\">\n      <h2>Welcome to the home page</h1>\n      <p>Please click on an element</p>\n      <a class=\"record\"\n         ng-href=\"#!/profile/{{ record.id }}\"\n         ng-animate-ref=\"{{ record.id }}\"\n         ng-repeat=\"record in records\">\n        {{ record.title }}\n      </a>\n    </file>\n    <file name=\"profile.html\">\n      <div class=\"profile record\" ng-animate-ref=\"{{ profile.id }}\">\n        {{ profile.title }}\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .record {\n        display:block;\n        font-size:20px;\n      }\n      .profile {\n        background:black;\n        color:white;\n        font-size:100px;\n      }\n      .view-container {\n        position:relative;\n      }\n      .view-container > .view.ng-animate {\n        position:absolute;\n        top:0;\n        left:0;\n        width:100%;\n        min-height:500px;\n      }\n      .view.ng-enter, .view.ng-leave,\n      .record.ng-anchor {\n        transition:0.5s linear all;\n      }\n      .view.ng-enter {\n        transform:translateX(100%);\n      }\n      .view.ng-enter.ng-enter-active, .view.ng-leave {\n        transform:translateX(0%);\n      }\n      .view.ng-leave.ng-leave-active {\n        transform:translateX(-100%);\n      }\n      .record.ng-anchor-out {\n        background:red;\n      }\n    </file>\n  </example>\n *\n * ### How is the element transported?\n *\n * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting\n * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element\n * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The\n * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match\n * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied\n * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class\n * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element\n * will become visible since the shim class will be removed.\n *\n * ### How is the morphing handled?\n *\n * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out\n * what CSS classes differ between the starting element and the destination element. These different CSS classes\n * will be added/removed on the anchor element and a transition will be applied (the transition that is provided\n * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will\n * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that\n * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since\n * the cloned element is placed inside of root element which is likely close to the body element).\n *\n * Note that if the root element is on the `<html>` element then the cloned node will be placed inside of body.\n *\n *\n * ## Using $animate in your directive code\n *\n * So far we've explored how to feed in animations into an AngularJS application, but how do we trigger animations within our own directives in our application?\n * By injecting the `$animate` service into our directive code, we can trigger structural and class-based hooks which can then be consumed by animations. Let's\n * imagine we have a greeting box that shows and hides itself when the data changes\n *\n * ```html\n * <greeting-box active=\"onOrOff\">Hi there</greeting-box>\n * ```\n *\n * ```js\n * ngModule.directive('greetingBox', ['$animate', function($animate) {\n *   return function(scope, element, attrs) {\n *     attrs.$observe('active', function(value) {\n *       value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on');\n *     });\n *   });\n * }]);\n * ```\n *\n * Now the `on` CSS class is added and removed on the greeting box component. Now if we add a CSS class on top of the greeting box element\n * in our HTML code then we can trigger a CSS or JS animation to happen.\n *\n * ```css\n * /&#42; normally we would create a CSS class to reference on the element &#42;/\n * greeting-box.on { transition:0.5s linear all; background:green; color:white; }\n * ```\n *\n * The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's\n * possible be sure to visit the {@link ng.$animate $animate service API page}.\n *\n *\n * ## Callbacks and Promises\n *\n * When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger\n * an animation (within our directive code) then we can continue performing directive and scope related activities after the animation has\n * ended by chaining onto the returned promise that animation method returns.\n *\n * ```js\n * // somewhere within the depths of the directive\n * $animate.enter(element, parent).then(function() {\n *   //the animation has completed\n * });\n * ```\n *\n * (Note that earlier versions of AngularJS prior to v1.4 required the promise code to be wrapped using `$scope.$apply(...)`. This is not the case\n * anymore.)\n *\n * In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering\n * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view\n * routing controller to hook into that:\n *\n * ```js\n * ngModule.controller('HomePageController', ['$animate', function($animate) {\n *   $animate.on('enter', ngViewElement, function(element) {\n *     // the animation for this route has completed\n *   }]);\n * }])\n * ```\n *\n * (Note that you will need to trigger a digest within the callback to get AngularJS to notice any scope-related changes.)\n */\n\nvar copy;\nvar extend;\nvar forEach;\nvar isArray;\nvar isDefined;\nvar isElement;\nvar isFunction;\nvar isObject;\nvar isString;\nvar isUndefined;\nvar jqLite;\nvar noop;\n\n/**\n * @ngdoc service\n * @name $animate\n * @kind object\n *\n * @description\n * The ngAnimate `$animate` service documentation is the same for the core `$animate` service.\n *\n * Click here {@link ng.$animate to learn more about animations with `$animate`}.\n */\nangular.module('ngAnimate', [], function initAngularHelpers() {\n  // Access helpers from AngularJS core.\n  // Do it inside a `config` block to ensure `window.angular` is available.\n  noop        = angular.noop;\n  copy        = angular.copy;\n  extend      = angular.extend;\n  jqLite      = angular.element;\n  forEach     = angular.forEach;\n  isArray     = angular.isArray;\n  isString    = angular.isString;\n  isObject    = angular.isObject;\n  isUndefined = angular.isUndefined;\n  isDefined   = angular.isDefined;\n  isFunction  = angular.isFunction;\n  isElement   = angular.isElement;\n})\n  .info({ angularVersion: '1.7.8' })\n  .directive('ngAnimateSwap', ngAnimateSwapDirective)\n\n  .directive('ngAnimateChildren', $$AnimateChildrenDirective)\n  .factory('$$rAFScheduler', $$rAFSchedulerFactory)\n\n  .provider('$$animateQueue', $$AnimateQueueProvider)\n  .provider('$$animateCache', $$AnimateCacheProvider)\n  .provider('$$animation', $$AnimationProvider)\n\n  .provider('$animateCss', $AnimateCssProvider)\n  .provider('$$animateCssDriver', $$AnimateCssDriverProvider)\n\n  .provider('$$animateJs', $$AnimateJsProvider)\n  .provider('$$animateJsDriver', $$AnimateJsDriverProvider);\n\n\n})(window, window.angular);\n\n/* global shallowCopy: true */\n\n/**\n * Creates a shallow copy of an object, an array or a primitive.\n *\n * Assumes that there are no proto properties for objects.\n */\nfunction shallowCopy(src, dst) {\n  if (isArray(src)) {\n    dst = dst || [];\n\n    for (var i = 0, ii = src.length; i < ii; i++) {\n      dst[i] = src[i];\n    }\n  } else if (isObject(src)) {\n    dst = dst || {};\n\n    for (var key in src) {\n      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n        dst[key] = src[key];\n      }\n    }\n  }\n\n  return dst || src;\n}\n\n/* global routeToRegExp: true */\n\n/**\n * @param {string} path - The path to parse. (It is assumed to have query and hash stripped off.)\n * @param {Object} opts - Options.\n * @return {Object} - An object containing an array of path parameter names (`keys`) and a regular\n *     expression (`regexp`) that can be used to identify a matching URL and extract the path\n *     parameter values.\n *\n * @description\n * Parses the given path, extracting path parameter names and a regular expression to match URLs.\n *\n * Originally inspired by `pathRexp` in `visionmedia/express/lib/utils.js`.\n */\nfunction routeToRegExp(path, opts) {\n  var keys = [];\n\n  var pattern = path\n    .replace(/([().])/g, '\\\\$1')\n    .replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g, function(_, slash, key, option) {\n      var optional = option === '?' || option === '*?';\n      var star = option === '*' || option === '*?';\n      keys.push({name: key, optional: optional});\n      slash = slash || '';\n      return (\n        (optional ? '(?:' + slash : slash + '(?:') +\n        (star ? '(.+?)' : '([^/]+)') +\n        (optional ? '?)?' : ')')\n      );\n    })\n    .replace(/([/$*])/g, '\\\\$1');\n\n  if (opts.ignoreTrailingSlashes) {\n    pattern = pattern.replace(/\\/+$/, '') + '/*';\n  }\n\n  return {\n    keys: keys,\n    regexp: new RegExp(\n      '^' + pattern + '(?:[?#]|$)',\n      opts.caseInsensitiveMatch ? 'i' : ''\n    )\n  };\n}\n\n/* global routeToRegExp: false */\n/* global shallowCopy: false */\n\n// `isArray` and `isObject` are necessary for `shallowCopy()` (included via `src/shallowCopy.js`).\n// They are initialized inside the `$RouteProvider`, to ensure `window.angular` is available.\nvar isArray;\nvar isObject;\nvar isDefined;\nvar noop;\n\n/**\n * @ngdoc module\n * @name ngRoute\n * @description\n *\n * The `ngRoute` module provides routing and deeplinking services and directives for AngularJS apps.\n *\n * ## Example\n * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.\n *\n */\n/* global -ngRouteModule */\nvar ngRouteModule = angular.\n  module('ngRoute', []).\n  info({ angularVersion: '1.7.8' }).\n  provider('$route', $RouteProvider).\n  // Ensure `$route` will be instantiated in time to capture the initial `$locationChangeSuccess`\n  // event (unless explicitly disabled). This is necessary in case `ngView` is included in an\n  // asynchronously loaded template.\n  run(instantiateRoute);\nvar $routeMinErr = angular.$$minErr('ngRoute');\nvar isEagerInstantiationEnabled;\n\n\n/**\n * @ngdoc provider\n * @name $routeProvider\n * @this\n *\n * @description\n *\n * Used for configuring routes.\n *\n * ## Example\n * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.\n *\n * ## Dependencies\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n */\nfunction $RouteProvider() {\n  isArray = angular.isArray;\n  isObject = angular.isObject;\n  isDefined = angular.isDefined;\n  noop = angular.noop;\n\n  function inherit(parent, extra) {\n    return angular.extend(Object.create(parent), extra);\n  }\n\n  var routes = {};\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#when\n   *\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\n   *    contains redundant trailing slash or is missing one, the route will still match and the\n   *    `$location.path` will be updated to add or drop the trailing slash to exactly match the\n   *    route definition.\n   *\n   *    * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up\n   *        to the next slash are matched and stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain named groups starting with a colon and ending with a star:\n   *        e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain optional named groups with a question mark: e.g.`:name?`.\n   *\n   *    For example, routes like `/color/:color/largecode/:largecode*\\/edit` will match\n   *    `/color/brown/largecode/code/with/slashes/edit` and extract:\n   *\n   *    * `color: brown`\n   *    * `largecode: code/with/slashes`.\n   *\n   *\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\n   *    match.\n   *\n   *    Object properties:\n   *\n   *    - `controller` – `{(string|Function)=}` – Controller fn that should be associated with\n   *      newly created scope or the name of a {@link angular.Module#controller registered\n   *      controller} if passed as a string.\n   *    - `controllerAs` – `{string=}` – An identifier name for a reference to the controller.\n   *      If present, the controller will be published to scope under the `controllerAs` name.\n   *    - `template` – `{(string|Function)=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used by {@link\n   *      ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.\n   *      This property takes precedence over `templateUrl`.\n   *\n   *      If `template` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *      One of `template` or `templateUrl` is required.\n   *\n   *    - `templateUrl` – `{(string|Function)=}` – path or function that returns a path to an html\n   *      template that should be used by {@link ngRoute.directive:ngView ngView}.\n   *\n   *      If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *      One of `templateUrl` or `template` is required.\n   *\n   *    - `resolve` - `{Object.<string, Function>=}` - An optional map of dependencies which should\n   *      be injected into the controller. If any of these dependencies are promises, the router\n   *      will wait for them all to be resolved or one to be rejected before the controller is\n   *      instantiated.\n   *      If all the promises are resolved successfully, the values of the resolved promises are\n   *      injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is\n   *      fired. If any of the promises are rejected the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired.\n   *      For easier access to the resolved dependencies from the template, the `resolve` map will\n   *      be available on the scope of the route, under `$resolve` (by default) or a custom name\n   *      specified by the `resolveAs` property (see below). This can be particularly useful, when\n   *      working with {@link angular.Module#component components} as route templates.<br />\n   *      <div class=\"alert alert-warning\">\n   *        **Note:** If your scope already contains a property with this name, it will be hidden\n   *        or overwritten. Make sure, you specify an appropriate name for this property, that\n   *        does not collide with other properties on the scope.\n   *      </div>\n   *      The map object is:\n   *\n   *      - `key` – `{string}`: a name of a dependency to be injected into the controller.\n   *      - `factory` - `{string|Function}`: If `string` then it is an alias for a service.\n   *        Otherwise if function, then it is {@link auto.$injector#invoke injected}\n   *        and the return value is treated as the dependency. If the result is a promise, it is\n   *        resolved before its value is injected into the controller. Be aware that\n   *        `ngRoute.$routeParams` will still refer to the previous route within these resolve\n   *        functions.  Use `$route.current.params` to access the new route parameters, instead.\n   *\n   *    - `resolveAs` - `{string=}` - The name under which the `resolve` map will be available on\n   *      the scope of the route. If omitted, defaults to `$resolve`.\n   *\n   *    - `redirectTo` – `{(string|Function)=}` – value to update\n   *      {@link ng.$location $location} path with and trigger route redirection.\n   *\n   *      If `redirectTo` is a function, it will be called with the following parameters:\n   *\n   *      - `{Object.<string>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route templateUrl.\n   *      - `{string}` - current `$location.path()`\n   *      - `{Object}` - current `$location.search()`\n   *\n   *      The custom `redirectTo` function is expected to return a string which will be used\n   *      to update `$location.url()`. If the function throws an error, no further processing will\n   *      take place and the {@link ngRoute.$route#$routeChangeError $routeChangeError} event will\n   *      be fired.\n   *\n   *      Routes that specify `redirectTo` will not have their controllers, template functions\n   *      or resolves called, the `$location` will be changed to the redirect url and route\n   *      processing will stop. The exception to this is if the `redirectTo` is a function that\n   *      returns `undefined`. In this case the route transition occurs as though there was no\n   *      redirection.\n   *\n   *    - `resolveRedirectTo` – `{Function=}` – a function that will (eventually) return the value\n   *      to update {@link ng.$location $location} URL with and trigger route redirection. In\n   *      contrast to `redirectTo`, dependencies can be injected into `resolveRedirectTo` and the\n   *      return value can be either a string or a promise that will be resolved to a string.\n   *\n   *      Similar to `redirectTo`, if the return value is `undefined` (or a promise that gets\n   *      resolved to `undefined`), no redirection takes place and the route transition occurs as\n   *      though there was no redirection.\n   *\n   *      If the function throws an error or the returned promise gets rejected, no further\n   *      processing will take place and the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event will be fired.\n   *\n   *      `redirectTo` takes precedence over `resolveRedirectTo`, so specifying both on the same\n   *      route definition, will cause the latter to be ignored.\n   *\n   *    - `[reloadOnUrl=true]` - `{boolean=}` - reload route when any part of the URL changes\n   *      (including the path) even if the new URL maps to the same route.\n   *\n   *      If the option is set to `false` and the URL in the browser changes, but the new URL maps\n   *      to the same route, then a `$routeUpdate` event is broadcasted on the root scope (without\n   *      reloading the route).\n   *\n   *    - `[reloadOnSearch=true]` - `{boolean=}` - reload route when only `$location.search()`\n   *      or `$location.hash()` changes.\n   *\n   *      If the option is set to `false` and the URL in the browser changes, then a `$routeUpdate`\n   *      event is broadcasted on the root scope (without reloading the route).\n   *\n   *      <div class=\"alert alert-warning\">\n   *        **Note:** This option has no effect if `reloadOnUrl` is set to `false`.\n   *      </div>\n   *\n   *    - `[caseInsensitiveMatch=false]` - `{boolean=}` - match routes without being case sensitive\n   *\n   *      If the option is set to `true`, then the particular route can be matched without being\n   *      case sensitive\n   *\n   * @returns {Object} self\n   *\n   * @description\n   * Adds a new route definition to the `$route` service.\n   */\n  this.when = function(path, route) {\n    //copy original route object to preserve params inherited from proto chain\n    var routeCopy = shallowCopy(route);\n    if (angular.isUndefined(routeCopy.reloadOnUrl)) {\n      routeCopy.reloadOnUrl = true;\n    }\n    if (angular.isUndefined(routeCopy.reloadOnSearch)) {\n      routeCopy.reloadOnSearch = true;\n    }\n    if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {\n      routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;\n    }\n    routes[path] = angular.extend(\n      routeCopy,\n      {originalPath: path},\n      path && routeToRegExp(path, routeCopy)\n    );\n\n    // create redirection for trailing slashes\n    if (path) {\n      var redirectPath = (path[path.length - 1] === '/')\n            ? path.substr(0, path.length - 1)\n            : path + '/';\n\n      routes[redirectPath] = angular.extend(\n        {originalPath: path, redirectTo: path},\n        routeToRegExp(redirectPath, routeCopy)\n      );\n    }\n\n    return this;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $routeProvider#caseInsensitiveMatch\n   * @description\n   *\n   * A boolean property indicating if routes defined\n   * using this provider should be matched using a case insensitive\n   * algorithm. Defaults to `false`.\n   */\n  this.caseInsensitiveMatch = false;\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#otherwise\n   *\n   * @description\n   * Sets route definition that will be used on route change when no other route definition\n   * is matched.\n   *\n   * @param {Object|string} params Mapping information to be assigned to `$route.current`.\n   * If called with a string, the value maps to `redirectTo`.\n   * @returns {Object} self\n   */\n  this.otherwise = function(params) {\n    if (typeof params === 'string') {\n      params = {redirectTo: params};\n    }\n    this.when(null, params);\n    return this;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#eagerInstantiationEnabled\n   * @kind function\n   *\n   * @description\n   * Call this method as a setter to enable/disable eager instantiation of the\n   * {@link ngRoute.$route $route} service upon application bootstrap. You can also call it as a\n   * getter (i.e. without any arguments) to get the current value of the\n   * `eagerInstantiationEnabled` flag.\n   *\n   * Instantiating `$route` early is necessary for capturing the initial\n   * {@link ng.$location#$locationChangeStart $locationChangeStart} event and navigating to the\n   * appropriate route. Usually, `$route` is instantiated in time by the\n   * {@link ngRoute.ngView ngView} directive. Yet, in cases where `ngView` is included in an\n   * asynchronously loaded template (e.g. in another directive's template), the directive factory\n   * might not be called soon enough for `$route` to be instantiated _before_ the initial\n   * `$locationChangeSuccess` event is fired. Eager instantiation ensures that `$route` is always\n   * instantiated in time, regardless of when `ngView` will be loaded.\n   *\n   * The default value is true.\n   *\n   * **Note**:<br />\n   * You may want to disable the default behavior when unit-testing modules that depend on\n   * `ngRoute`, in order to avoid an unexpected request for the default route's template.\n   *\n   * @param {boolean=} enabled - If provided, update the internal `eagerInstantiationEnabled` flag.\n   *\n   * @returns {*} The current value of the `eagerInstantiationEnabled` flag if used as a getter or\n   *     itself (for chaining) if used as a setter.\n   */\n  isEagerInstantiationEnabled = true;\n  this.eagerInstantiationEnabled = function eagerInstantiationEnabled(enabled) {\n    if (isDefined(enabled)) {\n      isEagerInstantiationEnabled = enabled;\n      return this;\n    }\n\n    return isEagerInstantiationEnabled;\n  };\n\n\n  this.$get = ['$rootScope',\n               '$location',\n               '$routeParams',\n               '$q',\n               '$injector',\n               '$templateRequest',\n               '$sce',\n               '$browser',\n      function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce, $browser) {\n\n    /**\n     * @ngdoc service\n     * @name $route\n     * @requires $location\n     * @requires $routeParams\n     *\n     * @property {Object} current Reference to the current route definition.\n     * The route definition contains:\n     *\n     *   - `controller`: The controller constructor as defined in the route definition.\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\n     *     controller instantiation. The `locals` contain\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\n     *\n     *     - `$scope` - The current route scope.\n     *     - `$template` - The current route template HTML.\n     *\n     *     The `locals` will be assigned to the route scope's `$resolve` property. You can override\n     *     the property name, using `resolveAs` in the route definition. See\n     *     {@link ngRoute.$routeProvider $routeProvider} for more info.\n     *\n     * @property {Object} routes Object with all route configuration Objects as its properties.\n     *\n     * @description\n     * `$route` is used for deep-linking URLs to controllers and views (HTML partials).\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\n     *\n     * Requires the {@link ngRoute `ngRoute`} module to be installed.\n     *\n     * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.\n     *\n     * The `$route` service is typically used in conjunction with the\n     * {@link ngRoute.directive:ngView `ngView`} directive and the\n     * {@link ngRoute.$routeParams `$routeParams`} service.\n     *\n     * @example\n     * This example shows how changing the URL hash causes the `$route` to match a route against the\n     * URL, and the `ngView` pulls in the partial.\n     *\n     * <example name=\"$route-service\" module=\"ngRouteExample\"\n     *          deps=\"angular-route.js\" fixBase=\"true\">\n     *   <file name=\"index.html\">\n     *     <div ng-controller=\"MainController\">\n     *       Choose:\n     *       <a href=\"Book/Moby\">Moby</a> |\n     *       <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n     *       <a href=\"Book/Gatsby\">Gatsby</a> |\n     *       <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n     *       <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n     *\n     *       <div ng-view></div>\n     *\n     *       <hr />\n     *\n     *       <pre>$location.path() = {{$location.path()}}</pre>\n     *       <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\n     *       <pre>$route.current.params = {{$route.current.params}}</pre>\n     *       <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\n     *       <pre>$routeParams = {{$routeParams}}</pre>\n     *     </div>\n     *   </file>\n     *\n     *   <file name=\"book.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *   </file>\n     *\n     *   <file name=\"chapter.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *     Chapter Id: {{params.chapterId}}\n     *   </file>\n     *\n     *   <file name=\"script.js\">\n     *     angular.module('ngRouteExample', ['ngRoute'])\n     *\n     *      .controller('MainController', function($scope, $route, $routeParams, $location) {\n     *          $scope.$route = $route;\n     *          $scope.$location = $location;\n     *          $scope.$routeParams = $routeParams;\n     *      })\n     *\n     *      .controller('BookController', function($scope, $routeParams) {\n     *          $scope.name = 'BookController';\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *      .controller('ChapterController', function($scope, $routeParams) {\n     *          $scope.name = 'ChapterController';\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *     .config(function($routeProvider, $locationProvider) {\n     *       $routeProvider\n     *        .when('/Book/:bookId', {\n     *         templateUrl: 'book.html',\n     *         controller: 'BookController',\n     *         resolve: {\n     *           // I will cause a 1 second delay\n     *           delay: function($q, $timeout) {\n     *             var delay = $q.defer();\n     *             $timeout(delay.resolve, 1000);\n     *             return delay.promise;\n     *           }\n     *         }\n     *       })\n     *       .when('/Book/:bookId/ch/:chapterId', {\n     *         templateUrl: 'chapter.html',\n     *         controller: 'ChapterController'\n     *       });\n     *\n     *       // configure html5 to get links working on jsfiddle\n     *       $locationProvider.html5Mode(true);\n     *     });\n     *\n     *   </file>\n     *\n     *   <file name=\"protractor.js\" type=\"protractor\">\n     *     it('should load and compile correct template', function() {\n     *       element(by.linkText('Moby: Ch1')).click();\n     *       var content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller: ChapterController/);\n     *       expect(content).toMatch(/Book Id: Moby/);\n     *       expect(content).toMatch(/Chapter Id: 1/);\n     *\n     *       element(by.partialLinkText('Scarlet')).click();\n     *\n     *       content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller: BookController/);\n     *       expect(content).toMatch(/Book Id: Scarlet/);\n     *     });\n     *   </file>\n     * </example>\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeStart\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted before a route change. At this  point the route services starts\n     * resolving all of the dependencies needed for the route change to occur.\n     * Typically this involves fetching the view template as well as any dependencies\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\n     * `$routeChangeSuccess` is fired.\n     *\n     * The route change (and the `$location` change that triggered it) can be prevented\n     * by calling `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on}\n     * for more details about event object.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} next Future route information.\n     * @param {Route} current Current route information.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeSuccess\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted after a route change has happened successfully.\n     * The `resolve` dependencies are now available in the `current.locals` property.\n     *\n     * {@link ngRoute.directive:ngView ngView} listens for the directive\n     * to instantiate the controller and render the view.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} current Current route information.\n     * @param {Route|Undefined} previous Previous route information, or undefined if current is\n     * first route entered.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeError\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if a redirection function fails or any redirection or resolve promises are\n     * rejected.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current route information.\n     * @param {Route} previous Previous route information.\n     * @param {Route} rejection The thrown error or the rejection reason of the promise. Usually\n     * the rejection reason is the error that caused the promise to get rejected.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeUpdate\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if the same instance of a route (including template, controller instance,\n     * resolved dependencies, etc.) is being reused. This can happen if either `reloadOnSearch` or\n     * `reloadOnUrl` has been set to `false`.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current/previous route information.\n     */\n\n    var forceReload = false,\n        preparedRoute,\n        preparedRouteIsUpdateOnly,\n        $route = {\n          routes: routes,\n\n          /**\n           * @ngdoc method\n           * @name $route#reload\n           *\n           * @description\n           * Causes `$route` service to reload the current route even if\n           * {@link ng.$location $location} hasn't changed.\n           *\n           * As a result of that, {@link ngRoute.directive:ngView ngView}\n           * creates new scope and reinstantiates the controller.\n           */\n          reload: function() {\n            forceReload = true;\n\n            var fakeLocationEvent = {\n              defaultPrevented: false,\n              preventDefault: function fakePreventDefault() {\n                this.defaultPrevented = true;\n                forceReload = false;\n              }\n            };\n\n            $rootScope.$evalAsync(function() {\n              prepareRoute(fakeLocationEvent);\n              if (!fakeLocationEvent.defaultPrevented) commitRoute();\n            });\n          },\n\n          /**\n           * @ngdoc method\n           * @name $route#updateParams\n           *\n           * @description\n           * Causes `$route` service to update the current URL, replacing\n           * current route parameters with those specified in `newParams`.\n           * Provided property names that match the route's path segment\n           * definitions will be interpolated into the location's path, while\n           * remaining properties will be treated as query params.\n           *\n           * @param {!Object<string, string>} newParams mapping of URL parameter names to values\n           */\n          updateParams: function(newParams) {\n            if (this.current && this.current.$$route) {\n              newParams = angular.extend({}, this.current.params, newParams);\n              $location.path(interpolate(this.current.$$route.originalPath, newParams));\n              // interpolate modifies newParams, only query params are left\n              $location.search(newParams);\n            } else {\n              throw $routeMinErr('norout', 'Tried updating route with no current route');\n            }\n          }\n        };\n\n    $rootScope.$on('$locationChangeStart', prepareRoute);\n    $rootScope.$on('$locationChangeSuccess', commitRoute);\n\n    return $route;\n\n    /////////////////////////////////////////////////////\n\n    /**\n     * @param on {string} current url\n     * @param route {Object} route regexp to match the url against\n     * @return {?Object}\n     *\n     * @description\n     * Check if the route matches the current url.\n     *\n     * Inspired by match in\n     * visionmedia/express/lib/router/router.js.\n     */\n    function switchRouteMatcher(on, route) {\n      var keys = route.keys,\n          params = {};\n\n      if (!route.regexp) return null;\n\n      var m = route.regexp.exec(on);\n      if (!m) return null;\n\n      for (var i = 1, len = m.length; i < len; ++i) {\n        var key = keys[i - 1];\n\n        var val = m[i];\n\n        if (key && val) {\n          params[key.name] = val;\n        }\n      }\n      return params;\n    }\n\n    function prepareRoute($locationEvent) {\n      var lastRoute = $route.current;\n\n      preparedRoute = parseRoute();\n      preparedRouteIsUpdateOnly = isNavigationUpdateOnly(preparedRoute, lastRoute);\n\n      if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) {\n        if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) {\n          if ($locationEvent) {\n            $locationEvent.preventDefault();\n          }\n        }\n      }\n    }\n\n    function commitRoute() {\n      var lastRoute = $route.current;\n      var nextRoute = preparedRoute;\n\n      if (preparedRouteIsUpdateOnly) {\n        lastRoute.params = nextRoute.params;\n        angular.copy(lastRoute.params, $routeParams);\n        $rootScope.$broadcast('$routeUpdate', lastRoute);\n      } else if (nextRoute || lastRoute) {\n        forceReload = false;\n        $route.current = nextRoute;\n\n        var nextRoutePromise = $q.resolve(nextRoute);\n\n        $browser.$$incOutstandingRequestCount('$route');\n\n        nextRoutePromise.\n          then(getRedirectionData).\n          then(handlePossibleRedirection).\n          then(function(keepProcessingRoute) {\n            return keepProcessingRoute && nextRoutePromise.\n              then(resolveLocals).\n              then(function(locals) {\n                // after route change\n                if (nextRoute === $route.current) {\n                  if (nextRoute) {\n                    nextRoute.locals = locals;\n                    angular.copy(nextRoute.params, $routeParams);\n                  }\n                  $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);\n                }\n              });\n          }).catch(function(error) {\n            if (nextRoute === $route.current) {\n              $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);\n            }\n          }).finally(function() {\n            // Because `commitRoute()` is called from a `$rootScope.$evalAsync` block (see\n            // `$locationWatch`), this `$$completeOutstandingRequest()` call will not cause\n            // `outstandingRequestCount` to hit zero.  This is important in case we are redirecting\n            // to a new route which also requires some asynchronous work.\n\n            $browser.$$completeOutstandingRequest(noop, '$route');\n          });\n      }\n    }\n\n    function getRedirectionData(route) {\n      var data = {\n        route: route,\n        hasRedirection: false\n      };\n\n      if (route) {\n        if (route.redirectTo) {\n          if (angular.isString(route.redirectTo)) {\n            data.path = interpolate(route.redirectTo, route.params);\n            data.search = route.params;\n            data.hasRedirection = true;\n          } else {\n            var oldPath = $location.path();\n            var oldSearch = $location.search();\n            var newUrl = route.redirectTo(route.pathParams, oldPath, oldSearch);\n\n            if (angular.isDefined(newUrl)) {\n              data.url = newUrl;\n              data.hasRedirection = true;\n            }\n          }\n        } else if (route.resolveRedirectTo) {\n          return $q.\n            resolve($injector.invoke(route.resolveRedirectTo)).\n            then(function(newUrl) {\n              if (angular.isDefined(newUrl)) {\n                data.url = newUrl;\n                data.hasRedirection = true;\n              }\n\n              return data;\n            });\n        }\n      }\n\n      return data;\n    }\n\n    function handlePossibleRedirection(data) {\n      var keepProcessingRoute = true;\n\n      if (data.route !== $route.current) {\n        keepProcessingRoute = false;\n      } else if (data.hasRedirection) {\n        var oldUrl = $location.url();\n        var newUrl = data.url;\n\n        if (newUrl) {\n          $location.\n            url(newUrl).\n            replace();\n        } else {\n          newUrl = $location.\n            path(data.path).\n            search(data.search).\n            replace().\n            url();\n        }\n\n        if (newUrl !== oldUrl) {\n          // Exit out and don't process current next value,\n          // wait for next location change from redirect\n          keepProcessingRoute = false;\n        }\n      }\n\n      return keepProcessingRoute;\n    }\n\n    function resolveLocals(route) {\n      if (route) {\n        var locals = angular.extend({}, route.resolve);\n        angular.forEach(locals, function(value, key) {\n          locals[key] = angular.isString(value) ?\n              $injector.get(value) :\n              $injector.invoke(value, null, null, key);\n        });\n        var template = getTemplateFor(route);\n        if (angular.isDefined(template)) {\n          locals['$template'] = template;\n        }\n        return $q.all(locals);\n      }\n    }\n\n    function getTemplateFor(route) {\n      var template, templateUrl;\n      if (angular.isDefined(template = route.template)) {\n        if (angular.isFunction(template)) {\n          template = template(route.params);\n        }\n      } else if (angular.isDefined(templateUrl = route.templateUrl)) {\n        if (angular.isFunction(templateUrl)) {\n          templateUrl = templateUrl(route.params);\n        }\n        if (angular.isDefined(templateUrl)) {\n          route.loadedTemplateUrl = $sce.valueOf(templateUrl);\n          template = $templateRequest(templateUrl);\n        }\n      }\n      return template;\n    }\n\n    /**\n     * @returns {Object} the current active route, by matching it against the URL\n     */\n    function parseRoute() {\n      // Match a route\n      var params, match;\n      angular.forEach(routes, function(route, path) {\n        if (!match && (params = switchRouteMatcher($location.path(), route))) {\n          match = inherit(route, {\n            params: angular.extend({}, $location.search(), params),\n            pathParams: params});\n          match.$$route = route;\n        }\n      });\n      // No route matched; fallback to \"otherwise\" route\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\n    }\n\n    /**\n     * @param {Object} newRoute - The new route configuration (as returned by `parseRoute()`).\n     * @param {Object} oldRoute - The previous route configuration (as returned by `parseRoute()`).\n     * @returns {boolean} Whether this is an \"update-only\" navigation, i.e. the URL maps to the same\n     *                    route and it can be reused (based on the config and the type of change).\n     */\n    function isNavigationUpdateOnly(newRoute, oldRoute) {\n      // IF this is not a forced reload\n      return !forceReload\n          // AND both `newRoute`/`oldRoute` are defined\n          && newRoute && oldRoute\n          // AND they map to the same Route Definition Object\n          && (newRoute.$$route === oldRoute.$$route)\n          // AND `reloadOnUrl` is disabled\n          && (!newRoute.reloadOnUrl\n              // OR `reloadOnSearch` is disabled\n              || (!newRoute.reloadOnSearch\n                  // AND both routes have the same path params\n                  && angular.equals(newRoute.pathParams, oldRoute.pathParams)\n              )\n          );\n    }\n\n    /**\n     * @returns {string} interpolation of the redirect path with the parameters\n     */\n    function interpolate(string, params) {\n      var result = [];\n      angular.forEach((string || '').split(':'), function(segment, i) {\n        if (i === 0) {\n          result.push(segment);\n        } else {\n          var segmentMatch = segment.match(/(\\w+)(?:[?*])?(.*)/);\n          var key = segmentMatch[1];\n          result.push(params[key]);\n          result.push(segmentMatch[2] || '');\n          delete params[key];\n        }\n      });\n      return result.join('');\n    }\n  }];\n}\n\ninstantiateRoute.$inject = ['$injector'];\nfunction instantiateRoute($injector) {\n  if (isEagerInstantiationEnabled) {\n    // Instantiate `$route`\n    $injector.get('$route');\n  }\n}\n\nngRouteModule.provider('$routeParams', $RouteParamsProvider);\n\n\n/**\n * @ngdoc service\n * @name $routeParams\n * @requires $route\n * @this\n *\n * @description\n * The `$routeParams` service allows you to retrieve the current set of route parameters.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * The route parameters are a combination of {@link ng.$location `$location`}'s\n * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.\n * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.\n *\n * In case of parameter name collision, `path` params take precedence over `search` params.\n *\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\n * (but its properties will likely change) even when a route change occurs.\n *\n * Note that the `$routeParams` are only updated *after* a route change completes successfully.\n * This means that you cannot rely on `$routeParams` being correct in route resolve functions.\n * Instead you can use `$route.current.params` to access the new route's parameters.\n *\n * @example\n * ```js\n *  // Given:\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\n *  // Route: /Chapter/:chapterId/Section/:sectionId\n *  //\n *  // Then\n *  $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}\n * ```\n */\nfunction $RouteParamsProvider() {\n  this.$get = function() { return {}; };\n}\n\nngRouteModule.directive('ngView', ngViewFactory);\nngRouteModule.directive('ngView', ngViewFillContentFactory);\n\n\n/**\n * @ngdoc directive\n * @name ngView\n * @restrict ECA\n *\n * @description\n * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by\n * including the rendered template of the current route into the main layout (`index.html`) file.\n * Every time the current route changes, the included view changes with it according to the\n * configuration of the `$route` service.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the new element is inserted to the DOM |\n * | {@link ng.$animate#leave leave}  | when the old element is removed from to the DOM  |\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n * @param {string=} onload Expression to evaluate whenever the view updates.\n *\n * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the view is updated.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated\n *                    as an expression yields a truthy value.\n * @example\n    <example name=\"ngView-directive\" module=\"ngViewExample\"\n             deps=\"angular-route.js;angular-animate.js\"\n             animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n        <div ng-controller=\"MainCtrl as main\">\n          Choose:\n          <a href=\"Book/Moby\">Moby</a> |\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n          <a href=\"Book/Gatsby\">Gatsby</a> |\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n\n          <div class=\"view-animate-container\">\n            <div ng-view class=\"view-animate\"></div>\n          </div>\n          <hr />\n\n          <pre>$location.path() = {{main.$location.path()}}</pre>\n          <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>\n          <pre>$route.current.params = {{main.$route.current.params}}</pre>\n          <pre>$routeParams = {{main.$routeParams}}</pre>\n        </div>\n      </file>\n\n      <file name=\"book.html\">\n        <div>\n          controller: {{book.name}}<br />\n          Book Id: {{book.params.bookId}}<br />\n        </div>\n      </file>\n\n      <file name=\"chapter.html\">\n        <div>\n          controller: {{chapter.name}}<br />\n          Book Id: {{chapter.params.bookId}}<br />\n          Chapter Id: {{chapter.params.chapterId}}\n        </div>\n      </file>\n\n      <file name=\"animations.css\">\n        .view-animate-container {\n          position:relative;\n          height:100px!important;\n          background:white;\n          border:1px solid black;\n          height:40px;\n          overflow:hidden;\n        }\n\n        .view-animate {\n          padding:10px;\n        }\n\n        .view-animate.ng-enter, .view-animate.ng-leave {\n          transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n\n          display:block;\n          width:100%;\n          border-left:1px solid black;\n\n          position:absolute;\n          top:0;\n          left:0;\n          right:0;\n          bottom:0;\n          padding:10px;\n        }\n\n        .view-animate.ng-enter {\n          left:100%;\n        }\n        .view-animate.ng-enter.ng-enter-active {\n          left:0;\n        }\n        .view-animate.ng-leave.ng-leave-active {\n          left:-100%;\n        }\n      </file>\n\n      <file name=\"script.js\">\n        angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])\n          .config(['$routeProvider', '$locationProvider',\n            function($routeProvider, $locationProvider) {\n              $routeProvider\n                .when('/Book/:bookId', {\n                  templateUrl: 'book.html',\n                  controller: 'BookCtrl',\n                  controllerAs: 'book'\n                })\n                .when('/Book/:bookId/ch/:chapterId', {\n                  templateUrl: 'chapter.html',\n                  controller: 'ChapterCtrl',\n                  controllerAs: 'chapter'\n                });\n\n              $locationProvider.html5Mode(true);\n          }])\n          .controller('MainCtrl', ['$route', '$routeParams', '$location',\n            function MainCtrl($route, $routeParams, $location) {\n              this.$route = $route;\n              this.$location = $location;\n              this.$routeParams = $routeParams;\n          }])\n          .controller('BookCtrl', ['$routeParams', function BookCtrl($routeParams) {\n            this.name = 'BookCtrl';\n            this.params = $routeParams;\n          }])\n          .controller('ChapterCtrl', ['$routeParams', function ChapterCtrl($routeParams) {\n            this.name = 'ChapterCtrl';\n            this.params = $routeParams;\n          }]);\n\n      </file>\n\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should load and compile correct template', function() {\n          element(by.linkText('Moby: Ch1')).click();\n          var content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller: ChapterCtrl/);\n          expect(content).toMatch(/Book Id: Moby/);\n          expect(content).toMatch(/Chapter Id: 1/);\n\n          element(by.partialLinkText('Scarlet')).click();\n\n          content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller: BookCtrl/);\n          expect(content).toMatch(/Book Id: Scarlet/);\n        });\n      </file>\n    </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngView#$viewContentLoaded\n * @eventType emit on the current ngView scope\n * @description\n * Emitted every time the ngView content is reloaded.\n */\nngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];\nfunction ngViewFactory($route, $anchorScroll, $animate) {\n  return {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    link: function(scope, $element, attr, ctrl, $transclude) {\n        var currentScope,\n            currentElement,\n            previousLeaveAnimation,\n            autoScrollExp = attr.autoscroll,\n            onloadExp = attr.onload || '';\n\n        scope.$on('$routeChangeSuccess', update);\n        update();\n\n        function cleanupLastView() {\n          if (previousLeaveAnimation) {\n            $animate.cancel(previousLeaveAnimation);\n            previousLeaveAnimation = null;\n          }\n\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            previousLeaveAnimation = $animate.leave(currentElement);\n            previousLeaveAnimation.done(function(response) {\n              if (response !== false) previousLeaveAnimation = null;\n            });\n            currentElement = null;\n          }\n        }\n\n        function update() {\n          var locals = $route.current && $route.current.locals,\n              template = locals && locals.$template;\n\n          if (angular.isDefined(template)) {\n            var newScope = scope.$new();\n            var current = $route.current;\n\n            // Note: This will also link all children of ng-view that were contained in the original\n            // html. If that content contains controllers, ... they could pollute/change the scope.\n            // However, using ng-view on an element with additional content does not make sense...\n            // Note: We can't remove them in the cloneAttchFn of $transclude as that\n            // function is called before linking the content, which would apply child\n            // directives to non existing elements.\n            var clone = $transclude(newScope, function(clone) {\n              $animate.enter(clone, null, currentElement || $element).done(function onNgViewEnter(response) {\n                if (response !== false && angular.isDefined(autoScrollExp)\n                  && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                  $anchorScroll();\n                }\n              });\n              cleanupLastView();\n            });\n\n            currentElement = clone;\n            currentScope = current.scope = newScope;\n            currentScope.$emit('$viewContentLoaded');\n            currentScope.$eval(onloadExp);\n          } else {\n            cleanupLastView();\n          }\n        }\n    }\n  };\n}\n\n// This directive is called during the $transclude call of the first `ngView` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngView\n// is called.\nngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];\nfunction ngViewFillContentFactory($compile, $controller, $route) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    link: function(scope, $element) {\n      var current = $route.current,\n          locals = current.locals;\n\n      $element.html(locals.$template);\n\n      var link = $compile($element.contents());\n\n      if (current.controller) {\n        locals.$scope = scope;\n        var controller = $controller(current.controller, locals);\n        if (current.controllerAs) {\n          scope[current.controllerAs] = controller;\n        }\n        $element.data('$ngControllerController', controller);\n        $element.children().data('$ngControllerController', controller);\n      }\n      scope[current.resolveAs || '$resolve'] = locals;\n\n      link(scope);\n    }\n  };\n}\n\ndescribe('ngView', function() {\n\n  describe('basics', function() {\n    var element;\n\n    beforeEach(module('ngRoute'));\n\n    beforeEach(module(function($provide) {\n      return function($rootScope, $compile, $animate) {\n        element = $compile('<div><ng:view onload=\"load()\"></ng:view></div>')($rootScope);\n      };\n    }));\n\n\n    afterEach(function() {\n      dealoc(element);\n    });\n\n\n    it('should do nothing when no routes are defined',\n        inject(function($rootScope, $compile, $location) {\n      $location.path('/unknown');\n      $rootScope.$digest();\n      expect(element.text()).toEqual('');\n    }));\n\n\n    it('should instantiate controller after compiling the content', function() {\n      var log = [], controllerScope,\n          Ctrl = function($scope) {\n            controllerScope = $scope;\n            log.push('ctrl-init');\n          };\n\n      module(function($compileProvider, $routeProvider) {\n        $compileProvider.directive('compileLog', function() {\n          return {\n            compile: function() {\n              log.push('compile');\n            }\n          };\n        });\n\n        $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl});\n      });\n\n      inject(function($route, $rootScope, $templateCache, $location) {\n        $templateCache.put('/tpl.html', [200, '<div compile-log>partial</div>', {}]);\n        $location.path('/some');\n        $rootScope.$digest();\n\n        expect(controllerScope.$parent).toBe($rootScope);\n        expect(controllerScope).toBe($route.current.scope);\n        expect(log).toEqual(['compile', 'ctrl-init']);\n      });\n    });\n\n\n    it('should instantiate the associated controller when an empty template is downloaded', function() {\n      var log = [], controllerScope,\n          Ctrl = function($scope) {\n            controllerScope = $scope;\n            log.push('ctrl-init');\n          };\n\n      module(function($routeProvider) {\n        $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl});\n      });\n\n      inject(function($route, $rootScope, $templateCache, $location) {\n        $templateCache.put('/tpl.html', [200, '', {}]);\n        $location.path('/some');\n\n        expect(function() {\n          $rootScope.$digest();\n        }).not.toThrow();\n\n        expect(controllerScope).toBeDefined();\n      });\n    });\n\n\n    it('should instantiate controller with an alias', function() {\n      var log = [], controllerScope;\n\n      function Ctrl($scope) {\n        this.name = 'alias';\n        controllerScope = $scope;\n      }\n\n      module(function($compileProvider, $routeProvider) {\n        $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl, controllerAs: 'ctrl'});\n      });\n\n      inject(function($route, $rootScope, $templateCache, $location) {\n        $templateCache.put('/tpl.html', [200, '<div></div>', {}]);\n        $location.path('/some');\n        $rootScope.$digest();\n\n        expect(controllerScope.ctrl.name).toBe('alias');\n      });\n    });\n\n\n    it('should support string controller declaration', function() {\n      var MyCtrl = jasmine.createSpy('MyCtrl');\n\n      module(function($controllerProvider, $routeProvider) {\n        $controllerProvider.register('MyCtrl', ['$scope', MyCtrl]);\n        $routeProvider.when('/foo', {controller: 'MyCtrl', templateUrl: '/tpl.html'});\n      });\n\n      inject(function($route, $location, $rootScope, $templateCache) {\n        $templateCache.put('/tpl.html', [200, '<div></div>', {}]);\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        expect($route.current.controller).toBe('MyCtrl');\n        expect(MyCtrl).toHaveBeenCalledWith(element.children().scope());\n      });\n    });\n\n\n    it('should reference resolved locals in scope', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {\n          resolve: {\n            name: function() {\n              return 'shahar';\n            }\n          },\n          template: '<div>{{$resolve.name}}</div>'\n        });\n      });\n\n      inject(function($location, $rootScope) {\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect(element.text()).toEqual('shahar');\n      });\n    });\n\n\n    it('should allow to provide an alias for resolved locals using resolveAs', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {\n          resolveAs: 'myResolve',\n          resolve: {\n            name: function() {\n              return 'shahar';\n            }\n          },\n          template: '<div>{{myResolve.name}}</div>'\n        });\n      });\n\n      inject(function($location, $rootScope) {\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect(element.text()).toEqual('shahar');\n      });\n    });\n\n\n    it('should load content via xhr when route changes', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'myUrl1'});\n        $routeProvider.when('/bar', {templateUrl: 'myUrl2'});\n      });\n\n      inject(function($rootScope, $compile, $httpBackend, $location, $route) {\n        expect(element.text()).toEqual('');\n\n        $location.path('/foo');\n        $httpBackend.expect('GET', 'myUrl1').respond('<div>{{1+3}}</div>');\n        $rootScope.$digest();\n        $httpBackend.flush();\n        expect(element.text()).toEqual('4');\n\n        $location.path('/bar');\n        $httpBackend.expect('GET', 'myUrl2').respond('angular is da best');\n        $rootScope.$digest();\n        $httpBackend.flush();\n        expect(element.text()).toEqual('angular is da best');\n      });\n    });\n\n\n    it('should use inline content route changes', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {template: '<div>{{1+3}}</div>'});\n        $routeProvider.when('/bar', {template: 'AngularJS is da best'});\n        $routeProvider.when('/blank', {template: ''});\n      });\n\n      inject(function($rootScope, $compile, $location, $route) {\n        expect(element.text()).toEqual('');\n\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect(element.text()).toEqual('4');\n\n        $location.path('/bar');\n        $rootScope.$digest();\n        expect(element.text()).toEqual('AngularJS is da best');\n\n        $location.path('/blank');\n        $rootScope.$digest();\n        expect(element.text()).toEqual('');\n      });\n    });\n\n\n    it('should remove all content when location changes to an unknown route', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'myUrl1'});\n      });\n\n      inject(function($rootScope, $compile, $location, $httpBackend, $route) {\n        $location.path('/foo');\n        $httpBackend.expect('GET', 'myUrl1').respond('<div>{{1+3}}</div>');\n        $rootScope.$digest();\n        $httpBackend.flush();\n        expect(element.text()).toEqual('4');\n\n        $location.path('/unknown');\n        $rootScope.$digest();\n        expect(element.text()).toEqual('');\n      });\n    });\n\n\n    it('should chain scopes and propagate evals to the child scope', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'myUrl1'});\n      });\n\n      inject(function($rootScope, $compile, $location, $httpBackend, $route) {\n        $rootScope.parentVar = 'parent';\n\n        $location.path('/foo');\n        $httpBackend.expect('GET', 'myUrl1').respond('<div>{{parentVar}}</div>');\n        $rootScope.$digest();\n        $httpBackend.flush();\n        expect(element.text()).toEqual('parent');\n\n        $rootScope.parentVar = 'new parent';\n        $rootScope.$digest();\n        expect(element.text()).toEqual('new parent');\n      });\n    });\n\n\n    it('should be possible to nest ngView in ngInclude', function() {\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'viewPartial.html'});\n      });\n\n      inject(function($httpBackend, $location, $route, $compile, $rootScope) {\n        $httpBackend.whenGET('includePartial.html').respond('view: <ng:view></ng:view>');\n        $httpBackend.whenGET('viewPartial.html').respond('content');\n        $location.path('/foo');\n\n        var elm = $compile(\n          '<div>' +\n            'include: <ng:include src=\"\\'includePartial.html\\'\"> </ng:include>' +\n          '</div>')($rootScope);\n        $rootScope.$digest();\n        $httpBackend.flush();\n\n        expect(elm.text()).toEqual('include: view: content');\n        expect($route.current.templateUrl).toEqual('viewPartial.html');\n        dealoc(elm);\n      });\n    });\n\n\n    it('should initialize view template after the view controller was initialized even when ' +\n      'templates were cached', function() {\n      //this is a test for a regression that was introduced by making the ng-view cache sync\n      function ParentCtrl($scope) {\n        $scope.log.push('parent');\n      }\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {controller: ParentCtrl, templateUrl: 'viewPartial.html'});\n      });\n\n\n      inject(function($rootScope, $compile, $location, $httpBackend, $route) {\n        $rootScope.log = [];\n\n        $rootScope.ChildCtrl = function($scope) {\n          $scope.log.push('child');\n        };\n\n        $location.path('/foo');\n        $httpBackend.expect('GET', 'viewPartial.html').\n            respond('<div ng-init=\"log.push(\\'init\\')\">' +\n                      '<div ng-controller=\"ChildCtrl\"></div>' +\n                    '</div>');\n        $rootScope.$apply();\n        $httpBackend.flush();\n\n        expect($rootScope.log).toEqual(['parent', 'init', 'child']);\n\n        $location.path('/');\n        $rootScope.$apply();\n        expect($rootScope.log).toEqual(['parent', 'init', 'child']);\n\n        $rootScope.log = [];\n        $location.path('/foo');\n        $rootScope.$apply();\n\n        expect($rootScope.log).toEqual(['parent', 'init', 'child']);\n      });\n    });\n\n\n    it('should discard pending xhr callbacks if a new route is requested before the current ' +\n        'finished loading',  function() {\n      // this is a test for a bad race condition that affected feedback\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'myUrl1'});\n        $routeProvider.when('/bar', {templateUrl: 'myUrl2'});\n      });\n\n      inject(function($route, $rootScope, $location, $httpBackend) {\n        expect(element.text()).toEqual('');\n\n        $location.path('/foo');\n        $httpBackend.expect('GET', 'myUrl1').respond('<div>{{1+3}}</div>');\n        $rootScope.$digest();\n        $location.path('/bar');\n        $httpBackend.expect('GET', 'myUrl2').respond('<div>{{1+1}}</div>');\n        $rootScope.$digest();\n        $httpBackend.flush(); // now that we have two requests pending, flush!\n\n        expect(element.text()).toEqual('2');\n      });\n    });\n\n\n    it('should be async even if served from cache', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {controller: angular.noop, templateUrl: 'myUrl1'});\n      });\n\n      inject(function($route, $rootScope, $location, $templateCache) {\n        $templateCache.put('myUrl1', [200, 'my partial', {}]);\n        $location.path('/foo');\n\n        var called = 0;\n        // we want to assert only during first watch\n        $rootScope.$watch(function() {\n          if (!called) expect(element.text()).toBe('');\n          called++;\n        });\n\n        $rootScope.$digest();\n        expect(element.text()).toBe('my partial');\n      });\n    });\n\n    it('should fire $contentLoaded event when content compiled and linked', function() {\n      var log = [];\n      var logger = function(name) {\n        return function() {\n          log.push(name);\n        };\n      };\n      var Ctrl = function($scope) {\n        $scope.value = 'bound-value';\n        log.push('init-ctrl');\n      };\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: Ctrl});\n      });\n\n      inject(function($templateCache, $rootScope, $location) {\n        $rootScope.$on('$routeChangeStart', logger('$routeChangeStart'));\n        $rootScope.$on('$routeChangeSuccess', logger('$routeChangeSuccess'));\n        $rootScope.$on('$viewContentLoaded', logger('$viewContentLoaded'));\n\n        $templateCache.put('tpl.html', [200, '{{value}}', {}]);\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        expect(element.text()).toBe('bound-value');\n        expect(log).toEqual([\n          '$routeChangeStart', 'init-ctrl', '$viewContentLoaded', '$routeChangeSuccess'\n        ]);\n      });\n    });\n\n    it('should destroy previous scope', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'tpl.html'});\n      });\n\n      inject(function($templateCache, $rootScope, $location) {\n        $templateCache.put('tpl.html', [200, 'partial', {}]);\n\n        expect($rootScope.$$childHead).toBeNull();\n        expect($rootScope.$$childTail).toBeNull();\n\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        expect(element.text()).toBe('partial');\n        expect($rootScope.$$childHead).not.toBeNull();\n        expect($rootScope.$$childTail).not.toBeNull();\n\n        $location.path('/non/existing/route');\n        $rootScope.$digest();\n\n        expect(element.text()).toBe('');\n        expect($rootScope.$$childHead).toBeNull();\n        expect($rootScope.$$childTail).toBeNull();\n      });\n    });\n\n\n    it('should destroy previous scope if multiple route changes occur before server responds',\n        function() {\n      var log = [];\n      var createCtrl = function(name) {\n        return function($scope) {\n          log.push('init-' + name);\n          $scope.$on('$destroy', function() {log.push('destroy-' + name);});\n        };\n      };\n\n      module(function($routeProvider) {\n        $routeProvider.when('/one', {templateUrl: 'one.html', controller: createCtrl('ctrl1')});\n        $routeProvider.when('/two', {templateUrl: 'two.html', controller: createCtrl('ctrl2')});\n      });\n\n      inject(function($httpBackend, $rootScope, $location) {\n        $httpBackend.whenGET('one.html').respond('content 1');\n        $httpBackend.whenGET('two.html').respond('content 2');\n\n        $location.path('/one');\n        $rootScope.$digest();\n        $location.path('/two');\n        $rootScope.$digest();\n\n        $httpBackend.flush();\n        expect(element.text()).toBe('content 2');\n        expect(log).toEqual(['init-ctrl2']);\n\n        $location.path('/non-existing');\n        $rootScope.$digest();\n\n        expect(element.text()).toBe('');\n        expect(log).toEqual(['init-ctrl2', 'destroy-ctrl2']);\n\n        expect($rootScope.$$childHead).toBeNull();\n        expect($rootScope.$$childTail).toBeNull();\n      });\n    });\n\n\n    it('should $destroy scope after update and reload',  function() {\n      // this is a regression of bug, where $route doesn't copy scope when only updating\n\n      var log = [];\n\n      function logger(msg) {\n        return function() {\n          log.push(msg);\n        };\n      }\n\n      function createController(name) {\n        return function($scope) {\n          log.push('init-' + name);\n          $scope.$on('$destroy', logger('destroy-' + name));\n          $scope.$on('$routeUpdate', logger('route-update'));\n        };\n      }\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar', {templateUrl: 'tpl.html', controller: createController('bar')});\n        $routeProvider.when('/foo', {\n          templateUrl: 'tpl.html',\n          controller: createController('foo'),\n          reloadOnSearch: false\n        });\n      });\n\n      inject(function($templateCache, $location, $rootScope) {\n        $templateCache.put('tpl.html', [200, 'partial', {}]);\n\n        $location.url('/foo');\n        $rootScope.$digest();\n        expect(log).toEqual(['init-foo']);\n\n        $location.search({q: 'some'});\n        $rootScope.$digest();\n        expect(log).toEqual(['init-foo', 'route-update']);\n\n        $location.url('/bar');\n        $rootScope.$digest();\n        expect(log).toEqual(['init-foo', 'route-update', 'destroy-foo', 'init-bar']);\n      });\n    });\n\n\n    it('should evaluate onload expression after linking the content', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'tpl.html'});\n      });\n\n      inject(function($templateCache, $location, $rootScope) {\n        $templateCache.put('tpl.html', [200, '{{1+1}}', {}]);\n        $rootScope.load = jasmine.createSpy('onload');\n\n        $location.url('/foo');\n        $rootScope.$digest();\n        expect($rootScope.load).toHaveBeenCalledOnce();\n      });\n    });\n\n\n    it('should set $scope and $controllerController on the view elements (except for non-element nodes)', function() {\n      function MyCtrl($scope) {\n        $scope.state = 'WORKS';\n        $scope.ctrl = this;\n      }\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: MyCtrl});\n      });\n\n      inject(function($templateCache, $location, $rootScope, $route) {\n        // in the template the white-space before the div is an intentional non-element node,\n        // a text might get wrapped into span so it's safer to just use white space\n        $templateCache.put('tpl.html', [200, '   \\n   <div>{{state}}</div>', {}]);\n\n        $location.url('/foo');\n        $rootScope.$digest();\n        expect(element.text()).toEqual('   \\n   WORKS');\n\n        var div = element.find('div');\n        expect(div.parent()[0].nodeName.toUpperCase()).toBeOneOf('NG:VIEW', 'VIEW');\n\n        expect(div.scope()).toBe($route.current.scope);\n        expect(div.scope().hasOwnProperty('state')).toBe(true);\n        expect(div.scope().state).toEqual('WORKS');\n\n        expect(div.controller()).toBe($route.current.scope.ctrl);\n      });\n    });\n\n    it('should not set $scope or $controllerController on top level text elements in the view', function() {\n      function MyCtrl($scope) {}\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: MyCtrl});\n      });\n\n      inject(function($templateCache, $location, $rootScope, $route) {\n        $templateCache.put('tpl.html', '<div></div>  ');\n        $location.url('/foo');\n        $rootScope.$digest();\n\n        angular.forEach(element.contents(), function(node) {\n          if (node.nodeType === 3 /* text node */) {\n            expect(angular.element(node).scope()).not.toBe($route.current.scope);\n            expect(angular.element(node).controller()).not.toBeDefined();\n          } else if (node.nodeType === 8 /* comment node */) {\n            expect(angular.element(node).scope()).toBe(element.scope());\n            expect(angular.element(node).controller()).toBe(element.controller());\n          } else {\n            expect(angular.element(node).scope()).toBe($route.current.scope);\n            expect(angular.element(node).controller()).toBeDefined();\n          }\n        });\n      });\n    });\n\n\n    it('should not trigger a digest when the view is changed', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'myUrl1'});\n        $routeProvider.when('/bar', {templateUrl: 'myUrl2'});\n      });\n\n      inject(function($$rAF, $templateCache, $rootScope, $compile, $timeout, $location, $httpBackend) {\n        var spy = spyOn($rootScope, '$digest').and.callThrough();\n\n        $templateCache.put('myUrl1', 'my template content');\n        $templateCache.put('myUrl2', 'my other template content');\n\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        // The animation completion is async even without actual animations\n        $$rAF.flush();\n        expect(element.text()).toEqual('my template content');\n\n        $location.path('/bar');\n        $rootScope.$digest();\n        spy.calls.reset();\n\n        $$rAF.flush();\n        expect(element.text()).toEqual('my other template content');\n\n        expect(spy).not.toHaveBeenCalled();\n        // A digest may have been triggered asynchronously, so check the queue\n        $timeout.verifyNoPendingTasks();\n      });\n    });\n\n  });\n\n  describe('and transcludes', function() {\n    var element, directive;\n\n    beforeEach(module('ngRoute', function($compileProvider) {\n      element = null;\n      directive = $compileProvider.directive;\n    }));\n\n    afterEach(function() {\n      if (element) {\n        dealoc(element);\n      }\n    });\n\n    it('should allow access to directive controller from children when used in a replace template', function() {\n      var controller;\n      module(function($routeProvider) {\n        $routeProvider.when('/view', {templateUrl: 'view.html'});\n        directive('template', function() {\n          return {\n            template: '<div ng-view></div>',\n            replace: true,\n            controller: function() {\n              this.flag = true;\n            }\n          };\n        });\n\n        directive('test', function() {\n          return {\n            require: '^template',\n            link: function(scope, el, attr, ctrl) {\n              controller = ctrl;\n            }\n          };\n        });\n      });\n      inject(function($compile, $rootScope, $httpBackend, $location) {\n        $httpBackend.expectGET('view.html').respond('<div><div test></div></div>');\n        element = $compile('<div><div template></div></div>')($rootScope);\n        $location.url('/view');\n        $rootScope.$apply();\n        $httpBackend.flush();\n        expect(controller.flag).toBe(true);\n      });\n    });\n\n    it('should compile its content correctly (although we remove it later)', function() {\n      var testElement;\n      module(function($compileProvider, $routeProvider) {\n        $routeProvider.when('/view', {template: ' '});\n        var directive = $compileProvider.directive;\n        directive('test', function() {\n          return {\n            link: function(scope, element) {\n              testElement = element;\n            }\n          };\n        });\n      });\n      inject(function($compile, $rootScope, $location) {\n        element = $compile('<div><div ng-view><div test someAttr></div></div></div>')($rootScope);\n        $location.url('/view');\n        $rootScope.$apply();\n        expect(testElement[0].nodeName).toBe('DIV');\n      });\n\n    });\n\n    it('should link directives on the same element after the content has been loaded', function() {\n      var contentOnLink;\n      module(function($compileProvider, $routeProvider) {\n        $routeProvider.when('/view', {template: 'someContent'});\n        $compileProvider.directive('test', function() {\n          return {\n            link: function(scope, element) {\n              contentOnLink = element.text();\n            }\n          };\n        });\n      });\n      inject(function($compile, $rootScope, $location) {\n        element = $compile('<div><div ng-view test></div>')($rootScope);\n        $location.url('/view');\n        $rootScope.$apply();\n        expect(contentOnLink).toBe('someContent');\n      });\n    });\n\n    it('should add the content to the element before compiling it', function() {\n      var root;\n      module(function($compileProvider, $routeProvider) {\n        $routeProvider.when('/view', {template: '<span test></span>'});\n        $compileProvider.directive('test', function() {\n          return {\n            link: function(scope, element) {\n              root = element.parent().parent();\n            }\n          };\n        });\n      });\n      inject(function($compile, $rootScope, $location) {\n        element = $compile('<div><div ng-view></div>')($rootScope);\n        $location.url('/view');\n        $rootScope.$apply();\n        expect(root[0]).toBe(element[0]);\n      });\n    });\n  });\n\n  describe('animations', function() {\n    var body, element, $rootElement;\n\n    beforeEach(module('ngRoute'));\n\n    function html(content) {\n      $rootElement.html(content);\n      body.append($rootElement);\n      element = $rootElement.children().eq(0);\n      return element;\n    }\n\n    beforeEach(module(function() {\n      // we need to run animation on attached elements;\n      return function(_$rootElement_) {\n        $rootElement = _$rootElement_;\n        body = angular.element(window.document.body);\n      };\n    }));\n\n    afterEach(function() {\n      dealoc(body);\n      dealoc(element);\n    });\n\n\n    beforeEach(module(function($provide, $routeProvider) {\n      $routeProvider.when('/foo', {controller: angular.noop, templateUrl: '/foo.html'});\n      $routeProvider.when('/bar', {controller: angular.noop, templateUrl: '/bar.html'});\n      return function($templateCache) {\n        $templateCache.put('/foo.html', [200, '<div>data</div>', {}]);\n        $templateCache.put('/bar.html', [200, '<div>data2</div>', {}]);\n      };\n    }));\n\n    describe('hooks', function() {\n      beforeEach(module('ngAnimate'));\n      beforeEach(module('ngAnimateMock'));\n\n      it('should fire off the enter animation',\n          inject(function($compile, $rootScope, $location, $timeout, $animate) {\n            element = $compile(html('<div ng-view></div>'))($rootScope);\n\n            $location.path('/foo');\n            $rootScope.$digest();\n\n            var animation = $animate.queue.pop();\n            expect(animation.event).toBe('enter');\n          }));\n\n      it('should fire off the leave animation',\n          inject(function($compile, $rootScope, $location, $templateCache, $timeout, $animate) {\n\n        var item;\n        $templateCache.put('/foo.html', [200, '<div>foo</div>', {}]);\n        element = $compile(html('<div ng-view></div>'))($rootScope);\n\n        $location.path('/foo');\n        $rootScope.$digest();\n\n\n        $location.path('/');\n        $rootScope.$digest();\n\n        var animation = $animate.queue.pop();\n        expect(animation.event).toBe('leave');\n      }));\n\n      it('should animate two separate ngView elements',\n        inject(function($compile, $rootScope, $templateCache, $location, $animate) {\n          var item;\n          $rootScope.tpl = 'one';\n          element = $compile(html('<div ng-view></div>'))($rootScope);\n          $rootScope.$digest();\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          //we don't care about the enter animation for the first element\n          $animate.queue.pop();\n\n          $location.path('/bar');\n          $rootScope.$digest();\n\n          var animationB = $animate.queue.pop();\n          expect(animationB.event).toBe('leave');\n          var itemB = animationB.args[0];\n\n          var animationA = $animate.queue.pop();\n          expect(animationA.event).toBe('enter');\n          var itemA = animationA.args[0];\n\n          expect(itemA).not.toEqual(itemB);\n        })\n      );\n\n      it('should render ngClass on ngView',\n        inject(function($compile, $rootScope, $templateCache, $animate, $location) {\n\n          var item;\n          $rootScope.tpl = 'one';\n          $rootScope.klass = 'classy';\n          element = $compile(html('<div><div ng-view ng-class=\"klass\"></div></div>'))($rootScope);\n          $rootScope.$digest();\n\n          $location.path('/foo');\n          $rootScope.$digest();\n          $animate.flush();\n\n          //we don't care about the enter animation\n          $animate.queue.shift();\n\n          var animation = $animate.queue.shift();\n          expect(animation.event).toBe('addClass');\n\n          item = animation.element;\n          expect(item.hasClass('classy')).toBe(true);\n\n          $rootScope.klass = 'boring';\n          $rootScope.$digest();\n\n          expect($animate.queue.shift().event).toBe('addClass');\n          expect($animate.queue.shift().event).toBe('removeClass');\n\n          $animate.flush();\n\n          expect(item.hasClass('classy')).toBe(false);\n          expect(item.hasClass('boring')).toBe(true);\n\n          $location.path('/bar');\n          $rootScope.$digest();\n\n          //we don't care about the enter animation\n          $animate.queue.shift();\n\n          animation = $animate.queue.shift();\n          item = animation.element;\n          expect(animation.event).toBe('leave');\n\n          expect($animate.queue.shift().event).toBe('addClass');\n\n          expect(item.hasClass('boring')).toBe(true);\n        })\n      );\n\n      it('should not double compile when the route changes', function() {\n\n        var window;\n        module(function($routeProvider, $animateProvider, $provide) {\n          $routeProvider.when('/foo', {template: '<div ng-repeat=\"i in [1,2]\">{{i}}</div>'});\n          $routeProvider.when('/bar', {template: '<div ng-repeat=\"i in [3,4]\">{{i}}</div>'});\n          $animateProvider.register('.my-animation', function() {\n            return {\n              leave: function(element, done) {\n                done();\n              }\n            };\n          });\n        });\n\n        inject(function($rootScope, $compile, $location, $route, $timeout, $rootElement, $sniffer, $animate) {\n          element = $compile(html('<div><ng:view onload=\"load()\" class=\"my-animation\"></ng:view></div>'))($rootScope);\n          $animate.enabled(true);\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($animate.queue.shift().event).toBe('enter'); //ngView\n          expect($animate.queue.shift().event).toBe('enter'); //repeat 1\n          expect($animate.queue.shift().event).toBe('enter'); //repeat 2\n\n          expect(element.text()).toEqual('12');\n\n          $location.path('/bar');\n          $rootScope.$digest();\n\n          expect($animate.queue.shift().event).toBe('enter'); //ngView new\n          expect($animate.queue.shift().event).toBe('leave'); //ngView old\n\n          $rootScope.$digest();\n\n          expect($animate.queue.shift().event).toBe('enter'); //ngRepeat 3\n          expect($animate.queue.shift().event).toBe('enter'); //ngRepeat 4\n\n          $animate.flush();\n\n          expect(element.text()).toEqual('34');\n\n          function n(text) {\n            return text.replace(/\\r\\n/m, '').replace(/\\r\\n/m, '');\n          }\n        });\n      });\n\n      it('should destroy the previous leave animation if a new one takes place',\n        inject(function($compile, $rootScope, $animate, $location, $timeout) {\n          var $scope = $rootScope.$new();\n          element = $compile(html(\n            '<div>' +\n              '<div ng-view></div>' +\n            '</div>'\n          ))($scope);\n\n          $scope.$apply('value = true');\n\n          $location.path('/bar');\n          $rootScope.$digest();\n\n          var destroyed, inner = element.children(0);\n          inner.on('$destroy', function() {\n            destroyed = true;\n          });\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          $location.path('/bar');\n          $rootScope.$digest();\n\n          $location.path('/bar');\n          $rootScope.$digest();\n\n          expect(destroyed).toBe(true);\n        })\n      );\n    });\n\n\n    describe('autoscroll', function() {\n      var autoScrollSpy;\n\n      function spyOnAnchorScroll() {\n        return function($provide, $routeProvider) {\n          autoScrollSpy = jasmine.createSpy('$anchorScroll');\n          $provide.value('$anchorScroll', autoScrollSpy);\n          $routeProvider.when('/foo', {\n            controller: angular.noop,\n            template: '<div></div>'\n          });\n        };\n      }\n\n      function spyOnAnimateEnter() {\n        return function($animate) {\n          spyOn($animate, 'enter').and.callThrough();\n        };\n      }\n\n      function compileAndLink(tpl) {\n        return function($compile, $rootScope, $location) {\n          element = $compile(tpl)($rootScope);\n        };\n      }\n\n      beforeEach(module(spyOnAnchorScroll(), 'ngAnimateMock'));\n      beforeEach(inject(spyOnAnimateEnter()));\n\n      it('should call $anchorScroll if autoscroll attribute is present', inject(\n          compileAndLink('<div><ng:view autoscroll></ng:view></div>'),\n          function($rootScope, $animate, $timeout, $location) {\n\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        $animate.flush();\n        $rootScope.$digest();\n\n        expect($animate.queue.shift().event).toBe('enter');\n        expect(autoScrollSpy).toHaveBeenCalledOnce();\n      }));\n\n\n      it('should call $anchorScroll if autoscroll evaluates to true', inject(\n          compileAndLink('<div><ng:view src=\"tpl\" autoscroll=\"value\"></ng:view></div>'),\n          function($rootScope, $animate, $timeout, $location) {\n\n        $rootScope.value = true;\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        $animate.flush();\n        $rootScope.$digest();\n\n        expect($animate.queue.shift().event).toBe('enter');\n        expect(autoScrollSpy).toHaveBeenCalledOnce();\n      }));\n\n\n      it('should not call $anchorScroll if autoscroll attribute is not present', inject(\n          compileAndLink('<div><ng:view></ng:view></div>'),\n          function($rootScope, $location, $animate, $timeout) {\n\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect($animate.queue.shift().event).toBe('enter');\n\n        expect(autoScrollSpy).not.toHaveBeenCalled();\n      }));\n\n\n      it('should not call $anchorScroll if autoscroll evaluates to false', inject(\n          compileAndLink('<div><ng:view autoscroll=\"value\"></ng:view></div>'),\n          function($rootScope, $location, $animate, $timeout) {\n\n        $rootScope.value = false;\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect($animate.queue.shift().event).toBe('enter');\n\n        expect(autoScrollSpy).not.toHaveBeenCalled();\n      }));\n\n\n      it('should only call $anchorScroll after the \"enter\" animation completes', inject(\n        compileAndLink('<div><ng:view autoscroll></ng:view></div>'),\n        function($rootScope, $location, $animate, $timeout) {\n          $location.path('/foo');\n\n          expect($animate.enter).not.toHaveBeenCalled();\n          $rootScope.$digest();\n\n          expect(autoScrollSpy).not.toHaveBeenCalled();\n\n          expect($animate.queue.shift().event).toBe('enter');\n\n          $animate.flush();\n          $rootScope.$digest();\n\n          expect($animate.enter).toHaveBeenCalledOnce();\n          expect(autoScrollSpy).toHaveBeenCalledOnce();\n        }\n      ));\n    });\n  });\n\n  describe('in async template', function() {\n    beforeEach(module('ngRoute'));\n    beforeEach(module(function($compileProvider, $provide, $routeProvider) {\n      $compileProvider.directive('asyncView', function() {\n        return {templateUrl: 'async-view.html'};\n      });\n\n      $provide.decorator('$templateRequest', function($timeout) {\n        return function() {\n          return $timeout(angular.identity, 500, false, '<ng-view></ng-view>');\n        };\n      });\n\n      $routeProvider.when('/', {template: 'Hello, world!'});\n    }));\n\n\n    it('should work correctly upon initial page load',\n      // Injecting `$location` here is necessary, so that it gets instantiated early\n      inject(function($compile, $location, $rootScope, $timeout) {\n        var elem = $compile('<async-view></async-view>')($rootScope);\n        $rootScope.$digest();\n        $timeout.flush(500);\n\n        expect(elem.text()).toBe('Hello, world!');\n\n        dealoc(elem);\n      })\n    );\n  });\n});\n\ndescribe('$routeParams', function() {\n\n  beforeEach(module('ngRoute'));\n\n\n  it('should publish the params into a service',  function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/foo', {});\n      $routeProvider.when('/bar/:barId', {});\n    });\n\n    inject(function($rootScope, $route, $location, $routeParams) {\n      $location.path('/foo').search('a=b');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({a:'b'});\n\n      $location.path('/bar/123').search('x=abc');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({barId:'123', x:'abc'});\n    });\n  });\n\n  it('should correctly extract the params when a param name is part of the route',  function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/bar/:foo/:bar', {});\n    });\n\n    inject(function($rootScope, $route, $location, $routeParams) {\n      $location.path('/bar/foovalue/barvalue');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({bar:'barvalue', foo:'foovalue'});\n    });\n  });\n\n  it('should support route params not preceded by slashes', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/bar:barId/foo:fooId/', {});\n    });\n\n    inject(function($rootScope, $route, $location, $routeParams) {\n      $location.path('/barbarvalue/foofoovalue/');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({barId: 'barvalue', fooId: 'foovalue'});\n    });\n  });\n\n  it('should correctly extract the params when an optional param name is part of the route',  function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/bar/:foo?', {});\n      $routeProvider.when('/baz/:foo?/edit', {});\n      $routeProvider.when('/qux/:bar?/:baz?', {});\n    });\n\n    inject(function($rootScope, $route, $location, $routeParams) {\n      $location.path('/bar');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({});\n\n      $location.path('/bar/fooValue');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({foo: 'fooValue'});\n\n      $location.path('/baz/fooValue/edit');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({foo: 'fooValue'});\n\n      $location.path('/baz/edit');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({});\n\n      $location.path('/qux//bazValue');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({baz: 'bazValue'});\n\n    });\n  });\n\n  it('should correctly extract path params containing hashes and/or question marks', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/foo/:bar', {});\n      $routeProvider.when('/zoo/:bar/:baz/:qux', {});\n    });\n\n    inject(function($location, $rootScope, $routeParams) {\n      $location.path('/foo/bar?baz');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({bar: 'bar?baz'});\n\n      $location.path('/foo/bar?baz=val');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({bar: 'bar?baz=val'});\n\n      $location.path('/foo/bar#baz');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({bar: 'bar#baz'});\n\n      $location.path('/foo/bar?baz#qux');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({bar: 'bar?baz#qux'});\n\n      $location.path('/foo/bar?baz=val#qux');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({bar: 'bar?baz=val#qux'});\n\n      $location.path('/foo/bar#baz?qux');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({bar: 'bar#baz?qux'});\n\n      $location.path('/zoo/bar?p1=v1#h1/baz?p2=v2#h2/qux?p3=v3#h3');\n      $rootScope.$digest();\n      expect($routeParams).toEqual({\n        bar: 'bar?p1=v1#h1',\n        baz: 'baz?p2=v2#h2',\n        qux: 'qux?p3=v3#h3'\n      });\n    });\n  });\n\n});\n\ndescribe('$routeProvider', function() {\n  var $routeProvider;\n\n  beforeEach(module('ngRoute'));\n  beforeEach(module(function(_$routeProvider_) {\n    $routeProvider = _$routeProvider_;\n    $routeProvider.when('/foo', {template: 'Hello, world!'});\n  }));\n\n\n  it('should support enabling/disabling automatic instantiation upon initial load',\n    inject(function() {\n      expect($routeProvider.eagerInstantiationEnabled(true)).toBe($routeProvider);\n      expect($routeProvider.eagerInstantiationEnabled()).toBe(true);\n\n      expect($routeProvider.eagerInstantiationEnabled(false)).toBe($routeProvider);\n      expect($routeProvider.eagerInstantiationEnabled()).toBe(false);\n\n      expect($routeProvider.eagerInstantiationEnabled(true)).toBe($routeProvider);\n      expect($routeProvider.eagerInstantiationEnabled()).toBe(true);\n    })\n  );\n\n\n  it('should automatically instantiate `$route` upon initial load', function() {\n    inject(function($location, $rootScope) {\n      $location.path('/foo');\n      $rootScope.$digest();\n    });\n\n    inject(function($route) {\n      expect($route.current).toBeDefined();\n    });\n  });\n\n\n  it('should not automatically instantiate `$route` if disabled', function() {\n    module(function($routeProvider) {\n      $routeProvider.eagerInstantiationEnabled(false);\n    });\n\n    inject(function($location, $rootScope) {\n      $location.path('/foo');\n      $rootScope.$digest();\n    });\n\n    inject(function($route) {\n      expect($route.current).toBeUndefined();\n    });\n  });\n});\n\n\ndescribe('$route', function() {\n  var $httpBackend,\n      element;\n\n  beforeEach(module('ngRoute'));\n\n  beforeEach(module(function() {\n    return function(_$httpBackend_) {\n      $httpBackend = _$httpBackend_;\n      $httpBackend.when('GET', 'Chapter.html').respond('chapter');\n      $httpBackend.when('GET', 'test.html').respond('test');\n      $httpBackend.when('GET', 'foo.html').respond('foo');\n      $httpBackend.when('GET', 'bar.html').respond('bar');\n      $httpBackend.when('GET', 'baz.html').respond('baz');\n      $httpBackend.when('GET', 'http://example.com/trusted-template.html').respond('cross domain trusted template');\n      $httpBackend.when('GET', '404.html').respond('not found');\n    };\n  }));\n\n  afterEach(function() {\n    dealoc(element);\n  });\n\n\n  it('should allow cancellation via $locationChangeStart via $routeChangeStart', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/Edit', {\n        id: 'edit', template: 'Some edit functionality'\n      });\n      $routeProvider.when('/Home', {\n        id: 'home'\n      });\n    });\n    module(provideLog);\n    inject(function($route, $location, $rootScope, $compile, log) {\n      $rootScope.$on('$routeChangeStart', function(event, next, current) {\n        if (next.id === 'home' && current.scope.unsavedChanges) {\n          event.preventDefault();\n        }\n      });\n      element = $compile('<div><div ng-view></div></div>')($rootScope);\n      $rootScope.$apply(function() {\n        $location.path('/Edit');\n      });\n      $rootScope.$on('$routeChangeSuccess', log.fn('routeChangeSuccess'));\n      $rootScope.$on('$locationChangeSuccess', log.fn('locationChangeSuccess'));\n\n      // aborted route change\n      $rootScope.$apply(function() {\n        $route.current.scope.unsavedChanges = true;\n      });\n      $rootScope.$apply(function() {\n        $location.path('/Home');\n      });\n      expect($route.current.id).toBe('edit');\n      expect($location.path()).toBe('/Edit');\n      expect(log).toEqual([]);\n\n      // successful route change\n      $rootScope.$apply(function() {\n        $route.current.scope.unsavedChanges = false;\n      });\n      $rootScope.$apply(function() {\n        $location.path('/Home');\n      });\n      expect($route.current.id).toBe('home');\n      expect($location.path()).toBe('/Home');\n      expect(log).toEqual(['locationChangeSuccess', 'routeChangeSuccess']);\n    });\n  });\n\n  it('should allow redirects while handling $routeChangeStart', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/some', {\n        id: 'some', template: 'Some functionality'\n      });\n      $routeProvider.when('/redirect', {\n        id: 'redirect'\n      });\n    });\n    module(provideLog);\n    inject(function($route, $location, $rootScope, $compile, log) {\n      $rootScope.$on('$routeChangeStart', function(event, next, current) {\n        if (next.id === 'some') {\n          $location.path('/redirect');\n        }\n      });\n      $compile('<div><div ng-view></div></div>')($rootScope);\n      $rootScope.$on('$routeChangeStart', log.fn('routeChangeStart'));\n      $rootScope.$on('$routeChangeError', log.fn('routeChangeError'));\n      $rootScope.$on('$routeChangeSuccess', log.fn('routeChangeSuccess'));\n      $rootScope.$apply(function() {\n        $location.path('/some');\n      });\n\n      expect($route.current.id).toBe('redirect');\n      expect($location.path()).toBe('/redirect');\n      expect(log).toEqual(['routeChangeStart', 'routeChangeStart', 'routeChangeSuccess']);\n    });\n  });\n\n  it('should route and fire change event', function() {\n    var log = '',\n        lastRoute,\n        nextRoute;\n\n    module(function($routeProvider) {\n      $routeProvider.when('/Book/:book/Chapter/:chapter',\n          {controller: angular.noop, templateUrl: 'Chapter.html'});\n      $routeProvider.when('/Blank', {});\n    });\n    inject(function($route, $location, $rootScope) {\n      $rootScope.$on('$routeChangeStart', function(event, next, current) {\n        log += 'before();';\n        expect(current).toBe($route.current);\n        lastRoute = current;\n        nextRoute = next;\n      });\n      $rootScope.$on('$routeChangeSuccess', function(event, current, last) {\n        log += 'after();';\n        expect(current).toBe($route.current);\n        expect(lastRoute).toBe(last);\n        expect(nextRoute).toBe(current);\n      });\n\n      $location.path('/Book/Moby/Chapter/Intro').search('p=123');\n      $rootScope.$digest();\n      $httpBackend.flush();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', p:'123'});\n\n      log = '';\n      $location.path('/Blank').search('ignore');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({ignore:true});\n\n      log = '';\n      $location.path('/NONE');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current).toEqual(undefined);\n    });\n  });\n\n  it('should route and fire change event when catch-all params are used', function() {\n    var log = '',\n        lastRoute,\n        nextRoute;\n\n    module(function($routeProvider) {\n      $routeProvider.when('/Book1/:book/Chapter/:chapter/:highlight*/edit',\n          {controller: angular.noop, templateUrl: 'Chapter.html'});\n      $routeProvider.when('/Book2/:book/:highlight*/Chapter/:chapter',\n          {controller: angular.noop, templateUrl: 'Chapter.html'});\n      $routeProvider.when('/Blank', {});\n    });\n    inject(function($route, $location, $rootScope) {\n      $rootScope.$on('$routeChangeStart', function(event, next, current) {\n        log += 'before();';\n        expect(current).toBe($route.current);\n        lastRoute = current;\n        nextRoute = next;\n      });\n      $rootScope.$on('$routeChangeSuccess', function(event, current, last) {\n        log += 'after();';\n        expect(current).toBe($route.current);\n        expect(lastRoute).toBe(last);\n        expect(nextRoute).toBe(current);\n      });\n\n      $location.path('/Book1/Moby/Chapter/Intro/one/edit').search('p=123');\n      $rootScope.$digest();\n      $httpBackend.flush();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one', p:'123'});\n\n      log = '';\n      $location.path('/Blank').search('ignore');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({ignore:true});\n\n      log = '';\n      $location.path('/Book1/Moby/Chapter/Intro/one/two/edit').search('p=123');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one/two', p:'123'});\n\n      log = '';\n      $location.path('/Book2/Moby/one/two/Chapter/Intro').search('p=123');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one/two', p:'123'});\n\n      log = '';\n      $location.path('/NONE');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current).toEqual(undefined);\n    });\n  });\n\n\n  it('should route and fire change event correctly whenever the case insensitive flag is utilized', function() {\n    var log = '',\n        lastRoute,\n        nextRoute;\n\n    module(function($routeProvider) {\n      $routeProvider.when('/Book1/:book/Chapter/:chapter/:highlight*/edit',\n          {controller: angular.noop, templateUrl: 'Chapter.html', caseInsensitiveMatch: true});\n      $routeProvider.when('/Book2/:book/:highlight*/Chapter/:chapter',\n          {controller: angular.noop, templateUrl: 'Chapter.html'});\n      $routeProvider.when('/Blank', {});\n    });\n    inject(function($route, $location, $rootScope) {\n      $rootScope.$on('$routeChangeStart', function(event, next, current) {\n        log += 'before();';\n        expect(current).toBe($route.current);\n        lastRoute = current;\n        nextRoute = next;\n      });\n      $rootScope.$on('$routeChangeSuccess', function(event, current, last) {\n        log += 'after();';\n        expect(current).toBe($route.current);\n        expect(lastRoute).toBe(last);\n        expect(nextRoute).toBe(current);\n      });\n\n      $location.path('/Book1/Moby/Chapter/Intro/one/edit').search('p=123');\n      $rootScope.$digest();\n      $httpBackend.flush();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one', p:'123'});\n\n      log = '';\n      $location.path('/BOOK1/Moby/CHAPTER/Intro/one/EDIT').search('p=123');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one', p:'123'});\n\n      log = '';\n      $location.path('/Blank').search('ignore');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({ignore:true});\n\n      log = '';\n      $location.path('/BLANK');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current).toEqual(undefined);\n\n      log = '';\n      $location.path('/Book2/Moby/one/two/Chapter/Intro').search('p=123');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one/two', p:'123'});\n\n      log = '';\n      $location.path('/BOOK2/Moby/one/two/CHAPTER/Intro').search('p=123');\n      $rootScope.$digest();\n      expect(log).toEqual('before();after();');\n      expect($route.current).toEqual(undefined);\n    });\n  });\n\n  it('should allow configuring caseInsensitiveMatch on the route provider level', function() {\n    module(function($routeProvider) {\n      $routeProvider.caseInsensitiveMatch = true;\n      $routeProvider.when('/Blank', {template: 'blank'});\n      $routeProvider.otherwise({template: 'other'});\n    });\n    inject(function($route, $location, $rootScope) {\n      $location.path('/bLaNk');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('blank');\n    });\n  });\n\n  it('should allow overriding provider\\'s caseInsensitiveMatch setting on the route level', function() {\n    module(function($routeProvider) {\n      $routeProvider.caseInsensitiveMatch = true;\n      $routeProvider.when('/Blank', {template: 'blank', caseInsensitiveMatch: false});\n      $routeProvider.otherwise({template: 'other'});\n    });\n    inject(function($route, $location, $rootScope) {\n      $location.path('/bLaNk');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('other');\n    });\n  });\n\n  it('should not change route when location is canceled', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/somePath', {template: 'some path'});\n    });\n    inject(function($route, $location, $rootScope, $log) {\n      $rootScope.$on('$locationChangeStart', function(event) {\n        $log.info('$locationChangeStart');\n        event.preventDefault();\n      });\n\n      $rootScope.$on('$routeChangeSuccess', function(event) {\n        throw new Error('Should not get here');\n      });\n\n      $location.path('/somePath');\n      $rootScope.$digest();\n\n      expect($log.info.logs.shift()).toEqual(['$locationChangeStart']);\n    });\n  });\n\n\n  describe('should match a route that contains special chars in the path', function() {\n    beforeEach(module(function($routeProvider) {\n      $routeProvider.when('/$test.23/foo*(bar)/:baz', {templateUrl: 'test.html'});\n    }));\n\n    it('matches the full path', inject(function($route, $location, $rootScope) {\n      $location.path('/test');\n      $rootScope.$digest();\n      expect($route.current).toBeUndefined();\n    }));\n\n    it('matches literal .', inject(function($route, $location, $rootScope) {\n      $location.path('/$testX23/foo*(bar)/222');\n      $rootScope.$digest();\n      expect($route.current).toBeUndefined();\n    }));\n\n    it('matches literal *', inject(function($route, $location, $rootScope) {\n      $location.path('/$test.23/foooo(bar)/222');\n      $rootScope.$digest();\n      expect($route.current).toBeUndefined();\n    }));\n\n    it('treats backslashes normally', inject(function($route, $location, $rootScope) {\n      $location.path('/$test.23/foo*\\\\(bar)/222');\n      $rootScope.$digest();\n      expect($route.current).toBeUndefined();\n    }));\n\n    it('matches a URL with special chars', inject(function($route, $location, $rootScope) {\n      $location.path('/$test.23/foo*(bar)/~!@#$%^&*()_+=-`');\n      $rootScope.$digest();\n      expect($route.current).toBeDefined();\n    }));\n\n    it('should use route params inherited from prototype chain', function() {\n      function BaseRoute() {}\n      BaseRoute.prototype.templateUrl = 'foo.html';\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', new BaseRoute());\n      });\n\n      inject(function($route, $location, $rootScope) {\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect($route.current.templateUrl).toBe('foo.html');\n      });\n    });\n  });\n\n\n  describe('should match a route that contains optional params in the path', function() {\n    beforeEach(module(function($routeProvider) {\n      $routeProvider.when('/test/:opt?/:baz/edit', {templateUrl: 'test.html'});\n    }));\n\n    it('matches a URL with optional params', inject(function($route, $location, $rootScope) {\n      $location.path('/test/optValue/bazValue/edit');\n      $rootScope.$digest();\n      expect($route.current).toBeDefined();\n    }));\n\n    it('matches a URL without optional param', inject(function($route, $location, $rootScope) {\n      $location.path('/test//bazValue/edit');\n      $rootScope.$digest();\n      expect($route.current).toBeDefined();\n    }));\n\n    it('not match a URL with a required param', inject(function($route, $location, $rootScope) {\n      $location.path('///edit');\n      $rootScope.$digest();\n      expect($route.current).not.toBeDefined();\n    }));\n  });\n\n\n  it('should change route even when only search param changes', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/test', {templateUrl: 'test.html'});\n    });\n\n    inject(function($route, $location, $rootScope) {\n      var callback = jasmine.createSpy('onRouteChange');\n\n      $rootScope.$on('$routeChangeStart', callback);\n      $location.path('/test');\n      $rootScope.$digest();\n      callback.calls.reset();\n\n      $location.search({any: true});\n      $rootScope.$digest();\n\n      expect(callback).toHaveBeenCalled();\n    });\n  });\n\n\n  it('should allow routes to be defined with just templates without controllers', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/foo', {templateUrl: 'foo.html'});\n    });\n\n    inject(function($route, $location, $rootScope) {\n      var onChangeSpy = jasmine.createSpy('onChange');\n\n      $rootScope.$on('$routeChangeStart', onChangeSpy);\n      expect($route.current).toBeUndefined();\n      expect(onChangeSpy).not.toHaveBeenCalled();\n\n      $location.path('/foo');\n      $rootScope.$digest();\n\n      expect($route.current.templateUrl).toEqual('foo.html');\n      expect($route.current.controller).toBeUndefined();\n      expect(onChangeSpy).toHaveBeenCalled();\n    });\n  });\n\n\n  it('should chain whens and otherwise', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/foo', {templateUrl: 'foo.html'}).\n          otherwise({templateUrl: 'bar.html'}).\n          when('/baz', {templateUrl: 'baz.html'});\n    });\n\n    inject(function($route, $location, $rootScope) {\n      $rootScope.$digest();\n      expect($route.current.templateUrl).toBe('bar.html');\n\n      $location.url('/baz');\n      $rootScope.$digest();\n      expect($route.current.templateUrl).toBe('baz.html');\n    });\n  });\n\n\n  it('should skip routes with incomplete params', function() {\n    module(function($routeProvider) {\n      $routeProvider\n        .otherwise({template: 'other'})\n        .when('/pages/:page/:comment*', {template: 'comment'})\n        .when('/pages/:page', {template: 'page'})\n        .when('/pages', {template: 'index'})\n        .when('/foo/', {template: 'foo'})\n        .when('/foo/:bar', {template: 'bar'})\n        .when('/foo/:bar*/:baz', {template: 'baz'});\n    });\n\n    inject(function($route, $location, $rootScope) {\n      $location.url('/pages/');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('index');\n\n      $location.url('/pages/page/');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('page');\n\n      $location.url('/pages/page/1/');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('comment');\n\n      $location.url('/foo/');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('foo');\n\n      $location.url('/foo/bar/');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('bar');\n\n      $location.url('/foo/bar/baz/');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('baz');\n\n      $location.url('/something/');\n      $rootScope.$digest();\n      expect($route.current.template).toBe('other');\n    });\n  });\n\n\n  describe('otherwise', function() {\n\n    it('should handle unknown routes with \"otherwise\" route definition', function() {\n      function NotFoundCtrl() {}\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'foo.html'});\n        $routeProvider.otherwise({templateUrl: '404.html', controller: NotFoundCtrl});\n      });\n\n      inject(function($route, $location, $rootScope) {\n        var onChangeSpy = jasmine.createSpy('onChange');\n\n        $rootScope.$on('$routeChangeStart', onChangeSpy);\n        expect($route.current).toBeUndefined();\n        expect(onChangeSpy).not.toHaveBeenCalled();\n\n        $location.path('/unknownRoute');\n        $rootScope.$digest();\n\n        expect($route.current.templateUrl).toBe('404.html');\n        expect($route.current.controller).toBe(NotFoundCtrl);\n        expect(onChangeSpy).toHaveBeenCalled();\n\n        onChangeSpy.calls.reset();\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        expect($route.current.templateUrl).toEqual('foo.html');\n        expect($route.current.controller).toBeUndefined();\n        expect(onChangeSpy).toHaveBeenCalled();\n      });\n    });\n\n\n    it('should update $route.current and $route.next when default route is matched', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'foo.html'});\n        $routeProvider.otherwise({templateUrl: '404.html'});\n      });\n\n      inject(function($route, $location, $rootScope) {\n        var currentRoute, nextRoute,\n            onChangeSpy = jasmine.createSpy('onChange').and.callFake(function(e, next) {\n          currentRoute = $route.current;\n          nextRoute = next;\n        });\n\n\n        // init\n        $rootScope.$on('$routeChangeStart', onChangeSpy);\n        expect($route.current).toBeUndefined();\n        expect(onChangeSpy).not.toHaveBeenCalled();\n\n\n        // match otherwise route\n        $location.path('/unknownRoute');\n        $rootScope.$digest();\n\n        expect(currentRoute).toBeUndefined();\n        expect(nextRoute.templateUrl).toBe('404.html');\n        expect($route.current.templateUrl).toBe('404.html');\n        expect(onChangeSpy).toHaveBeenCalled();\n        onChangeSpy.calls.reset();\n\n        // match regular route\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        expect(currentRoute.templateUrl).toBe('404.html');\n        expect(nextRoute.templateUrl).toBe('foo.html');\n        expect($route.current.templateUrl).toEqual('foo.html');\n        expect(onChangeSpy).toHaveBeenCalled();\n        onChangeSpy.calls.reset();\n\n        // match otherwise route again\n        $location.path('/anotherUnknownRoute');\n        $rootScope.$digest();\n\n        expect(currentRoute.templateUrl).toBe('foo.html');\n        expect(nextRoute.templateUrl).toBe('404.html');\n        expect($route.current.templateUrl).toEqual('404.html');\n        expect(onChangeSpy).toHaveBeenCalled();\n      });\n    });\n\n\n    it('should interpret a string as a redirect route', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {templateUrl: 'foo.html'});\n        $routeProvider.when('/baz', {templateUrl: 'baz.html'});\n        $routeProvider.otherwise('/foo');\n      });\n\n      inject(function($route, $location, $rootScope) {\n        $location.path('/unknownRoute');\n        $rootScope.$digest();\n\n        expect($location.path()).toBe('/foo');\n        expect($route.current.templateUrl).toBe('foo.html');\n      });\n    });\n  });\n\n\n  describe('events', function() {\n    it('should not fire $routeChangeStart/Success during bootstrap (if no route)', function() {\n      var routeChangeSpy = jasmine.createSpy('route change');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/one', {}); // no otherwise defined\n      });\n\n      inject(function($rootScope, $route, $location) {\n        $rootScope.$on('$routeChangeStart', routeChangeSpy);\n        $rootScope.$on('$routeChangeSuccess', routeChangeSpy);\n\n        $rootScope.$digest();\n        expect(routeChangeSpy).not.toHaveBeenCalled();\n\n        $location.path('/no-route-here');\n        $rootScope.$digest();\n        expect(routeChangeSpy).not.toHaveBeenCalled();\n\n        $location.path('/one');\n        $rootScope.$digest();\n        expect(routeChangeSpy).toHaveBeenCalled();\n      });\n    });\n\n    it('should fire $routeChangeStart and resolve promises', function() {\n      var deferA,\n          deferB;\n\n      module(function($provide, $routeProvider) {\n        $provide.factory('b', function($q) {\n          deferB = $q.defer();\n          return deferB.promise;\n        });\n        $routeProvider.when('/path', { templateUrl: 'foo.html', resolve: {\n          a: ['$q', function($q) {\n            deferA = $q.defer();\n            return deferA.promise;\n          }],\n          b: 'b'\n        } });\n      });\n\n      inject(function($location, $route, $rootScope, $httpBackend) {\n        var log = '';\n\n        $httpBackend.expectGET('foo.html').respond('FOO');\n\n        $location.path('/path');\n        $rootScope.$digest();\n        expect(log).toEqual('');\n        $httpBackend.flush();\n        expect(log).toEqual('');\n        deferA.resolve();\n        $rootScope.$digest();\n        expect(log).toEqual('');\n        deferB.resolve();\n        $rootScope.$digest();\n        expect($route.current.locals.$template).toEqual('FOO');\n      });\n    });\n\n\n    it('should fire $routeChangeError event on resolution error', function() {\n      var deferA;\n\n      module(function($provide, $routeProvider) {\n        $routeProvider.when('/path', { template: 'foo', resolve: {\n          a: function($q) {\n            deferA = $q.defer();\n            return deferA.promise;\n          }\n        } });\n      });\n\n      inject(function($location, $route, $rootScope) {\n        var log = '';\n\n        $rootScope.$on('$routeChangeStart', function() { log += 'before();'; });\n        $rootScope.$on('$routeChangeError', function(e, n, l, reason) { log += 'failed(' + reason + ');'; });\n\n        $location.path('/path');\n        $rootScope.$digest();\n        expect(log).toEqual('before();');\n\n        deferA.reject('MyError');\n        $rootScope.$digest();\n        expect(log).toEqual('before();failed(MyError);');\n      });\n    });\n\n\n    it('should fetch templates', function() {\n      module(function($routeProvider) {\n        $routeProvider.\n          when('/r1', { templateUrl: 'r1.html' }).\n          when('/r2', { templateUrl: 'r2.html' });\n      });\n\n      inject(function($route, $httpBackend, $location, $rootScope) {\n        var log = '';\n        $rootScope.$on('$routeChangeStart', function(e, next) { log += '$before(' + next.templateUrl + ');'; });\n        $rootScope.$on('$routeChangeSuccess', function(e, next) { log += '$after(' + next.templateUrl + ');'; });\n\n        $httpBackend.expectGET('r1.html').respond('R1');\n        $httpBackend.expectGET('r2.html').respond('R2');\n\n        $location.path('/r1');\n        $rootScope.$digest();\n        expect(log).toBe('$before(r1.html);');\n\n        $location.path('/r2');\n        $rootScope.$digest();\n        expect(log).toBe('$before(r1.html);$before(r2.html);');\n\n        $httpBackend.flush();\n        expect(log).toBe('$before(r1.html);$before(r2.html);$after(r2.html);');\n        expect(log).not.toContain('$after(r1.html);');\n      });\n    });\n\n    it('should NOT load cross domain templates by default', function() {\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', { templateUrl: 'http://example.com/foo.html' });\n      });\n\n      inject(function($route, $location, $rootScope) {\n        var onError = jasmine.createSpy('onError');\n        var onSuccess = jasmine.createSpy('onSuccess');\n\n        $rootScope.$on('$routeChangeError', onError);\n        $rootScope.$on('$routeChangeSuccess', onSuccess);\n\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        expect(onSuccess).not.toHaveBeenCalled();\n        expect(onError).toHaveBeenCalled();\n        expect(onError.calls.mostRecent().args[3]).toEqualMinErr('$sce', 'insecurl',\n            'Blocked loading resource from url not allowed by $sceDelegate policy.  ' +\n            'URL: http://example.com/foo.html');\n      });\n    });\n\n    it('should load cross domain templates that are trusted', function() {\n      module(function($routeProvider, $sceDelegateProvider) {\n        $routeProvider.when('/foo', { templateUrl: 'http://example.com/foo.html' });\n        $sceDelegateProvider.resourceUrlWhitelist([/^http:\\/\\/example\\.com\\/foo\\.html$/]);\n      });\n\n      inject(function($route, $location, $rootScope) {\n        $httpBackend.whenGET('http://example.com/foo.html').respond('FOO BODY');\n        $location.path('/foo');\n        $rootScope.$digest();\n        $httpBackend.flush();\n        expect($route.current.locals.$template).toEqual('FOO BODY');\n      });\n    });\n\n    it('should not update $routeParams until $routeChangeSuccess', function() {\n      module(function($routeProvider) {\n        $routeProvider.\n          when('/r1/:id', { templateUrl: 'r1.html' }).\n          when('/r2/:id', { templateUrl: 'r2.html' });\n      });\n\n      inject(function($route, $httpBackend, $location, $rootScope, $routeParams) {\n        var log = '';\n        $rootScope.$on('$routeChangeStart', function(e, next) { log += '$before' + angular.toJson($routeParams) + ';'; });\n        $rootScope.$on('$routeChangeSuccess', function(e, next) { log += '$after' + angular.toJson($routeParams) + ';'; });\n\n        $httpBackend.whenGET('r1.html').respond('R1');\n        $httpBackend.whenGET('r2.html').respond('R2');\n\n        $location.path('/r1/1');\n        $rootScope.$digest();\n        expect(log).toBe('$before{};');\n        $httpBackend.flush();\n        expect(log).toBe('$before{};$after{\"id\":\"1\"};');\n\n        log = '';\n\n        $location.path('/r2/2');\n        $rootScope.$digest();\n        expect(log).toBe('$before{\"id\":\"1\"};');\n        $httpBackend.flush();\n        expect(log).toBe('$before{\"id\":\"1\"};$after{\"id\":\"2\"};');\n      });\n    });\n\n\n    it('should drop in progress route change when new route change occurs', function() {\n      module(function($routeProvider) {\n        $routeProvider.\n          when('/r1', { templateUrl: 'r1.html' }).\n          when('/r2', { templateUrl: 'r2.html' });\n      });\n\n      inject(function($route, $httpBackend, $location, $rootScope) {\n        var log = '';\n        $rootScope.$on('$routeChangeStart', function(e, next) { log += '$before(' + next.templateUrl + ');'; });\n        $rootScope.$on('$routeChangeSuccess', function(e, next) { log += '$after(' + next.templateUrl + ');'; });\n\n        $httpBackend.expectGET('r1.html').respond('R1');\n        $httpBackend.expectGET('r2.html').respond('R2');\n\n        $location.path('/r1');\n        $rootScope.$digest();\n        expect(log).toBe('$before(r1.html);');\n\n        $location.path('/r2');\n        $rootScope.$digest();\n        expect(log).toBe('$before(r1.html);$before(r2.html);');\n\n        $httpBackend.flush();\n        expect(log).toBe('$before(r1.html);$before(r2.html);$after(r2.html);');\n        expect(log).not.toContain('$after(r1.html);');\n      });\n    });\n\n\n    it('should throw an error when a template is not found', function() {\n      module(function($routeProvider, $exceptionHandlerProvider) {\n        $exceptionHandlerProvider.mode('log');\n        $routeProvider.\n          when('/r1', { templateUrl: 'r1.html' }).\n          when('/r2', { templateUrl: 'r2.html' }).\n          when('/r3', { templateUrl: 'r3.html' });\n      });\n\n      inject(function($route, $httpBackend, $location, $rootScope, $exceptionHandler) {\n        $httpBackend.expectGET('r1.html').respond(404, 'R1');\n        $location.path('/r1');\n        $rootScope.$digest();\n\n        $httpBackend.flush();\n        expect($exceptionHandler.errors.pop()).\n            toEqualMinErr('$templateRequest', 'tpload', 'Failed to load template: r1.html');\n\n        $httpBackend.expectGET('r2.html').respond('');\n        $location.path('/r2');\n        $rootScope.$digest();\n\n        $httpBackend.flush();\n        expect($exceptionHandler.errors.length).toBe(0);\n\n        $httpBackend.expectGET('r3.html').respond('abc');\n        $location.path('/r3');\n        $rootScope.$digest();\n\n        $httpBackend.flush();\n        expect($exceptionHandler.errors.length).toBe(0);\n      });\n    });\n\n\n    it('should catch local factory errors', function() {\n      var myError = new Error('MyError');\n      module(function($routeProvider) {\n        $routeProvider.when('/locals', {\n          resolve: {\n            a: function($q) {\n              throw myError;\n            }\n          }\n        });\n      });\n\n      inject(function($location, $route, $rootScope) {\n        spyOn($rootScope, '$broadcast').and.callThrough();\n\n        $location.path('/locals');\n        $rootScope.$digest();\n\n        expect($rootScope.$broadcast).toHaveBeenCalledWith(\n            '$routeChangeError', jasmine.any(Object), undefined, myError);\n      });\n    });\n  });\n\n\n  it('should match route with and without trailing slash', function() {\n    module(function($routeProvider) {\n      $routeProvider.when('/foo', {templateUrl: 'foo.html'});\n      $routeProvider.when('/bar/', {templateUrl: 'bar.html'});\n    });\n\n    inject(function($route, $location, $rootScope) {\n      $location.path('/foo');\n      $rootScope.$digest();\n      expect($location.path()).toBe('/foo');\n      expect($route.current.templateUrl).toBe('foo.html');\n\n      $location.path('/foo/');\n      $rootScope.$digest();\n      expect($location.path()).toBe('/foo');\n      expect($route.current.templateUrl).toBe('foo.html');\n\n      $location.path('/bar');\n      $rootScope.$digest();\n      expect($location.path()).toBe('/bar/');\n      expect($route.current.templateUrl).toBe('bar.html');\n\n      $location.path('/bar/');\n      $rootScope.$digest();\n      expect($location.path()).toBe('/bar/');\n      expect($route.current.templateUrl).toBe('bar.html');\n    });\n  });\n\n\n  it('should not get affected by modifying the route definition object after route registration',\n    function() {\n      module(function($routeProvider) {\n        var rdo = {};\n\n        rdo.templateUrl = 'foo.html';\n        $routeProvider.when('/foo', rdo);\n\n        rdo.templateUrl = 'bar.html';\n        $routeProvider.when('/bar', rdo);\n      });\n\n      inject(function($location, $rootScope, $route) {\n        $location.path('/bar');\n        $rootScope.$digest();\n        expect($location.path()).toBe('/bar');\n        expect($route.current.templateUrl).toBe('bar.html');\n\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect($location.path()).toBe('/foo');\n        expect($route.current.templateUrl).toBe('foo.html');\n      });\n    }\n  );\n\n\n  it('should use the property values of the passed in route definition object directly',\n    function() {\n      var $routeProvider;\n\n      module(function(_$routeProvider_) {\n        $routeProvider = _$routeProvider_;\n      });\n\n      inject(function($location, $rootScope, $route, $sce) {\n        var sceWrappedUrl = $sce.trustAsResourceUrl('foo.html');\n        $routeProvider.when('/foo', {templateUrl: sceWrappedUrl});\n\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect($location.path()).toBe('/foo');\n        expect($route.current.templateUrl).toBe(sceWrappedUrl);\n      });\n    }\n  );\n\n\n  it('should support custom `$sce` implementations', function() {\n    function MySafeResourceUrl(val) {\n      var self = this;\n      this._val = val;\n      this.getVal = function() {\n        return (this !== self) ? null : this._val;\n      };\n    }\n\n    var $routeProvider;\n\n    module(function($provide, _$routeProvider_) {\n      $routeProvider = _$routeProvider_;\n\n      $provide.decorator('$sce', function($delegate) {\n        function getVal(v) { return v.getVal ? v.getVal() : v; }\n        $delegate.trustAsResourceUrl = function(url) { return new MySafeResourceUrl(url); };\n        $delegate.getTrustedResourceUrl = function(v) { return getVal(v); };\n        $delegate.valueOf = function(v) { return getVal(v); };\n        return $delegate;\n      });\n    });\n\n    inject(function($location, $rootScope, $route, $sce) {\n      $routeProvider.when('/foo', {templateUrl: $sce.trustAsResourceUrl('foo.html')});\n\n      $location.path('/foo');\n      $rootScope.$digest();\n      expect($location.path()).toBe('/foo');\n      expect($sce.valueOf($route.current.templateUrl)).toBe('foo.html');\n    });\n  });\n\n\n  describe('redirection', function() {\n    describe('via `redirectTo`', function() {\n      it('should support redirection via redirectTo property by updating $location', function() {\n        module(function($routeProvider) {\n          $routeProvider.when('/', {redirectTo: '/foo'});\n          $routeProvider.when('/foo', {templateUrl: 'foo.html'});\n          $routeProvider.when('/bar', {templateUrl: 'bar.html'});\n          $routeProvider.when('/baz', {redirectTo: '/bar'});\n          $routeProvider.otherwise({templateUrl: '404.html'});\n        });\n\n        inject(function($route, $location, $rootScope) {\n          var onChangeSpy = jasmine.createSpy('onChange');\n\n          $rootScope.$on('$routeChangeStart', onChangeSpy);\n          expect($route.current).toBeUndefined();\n          expect(onChangeSpy).not.toHaveBeenCalled();\n\n          $location.path('/');\n          $rootScope.$digest();\n          expect($location.path()).toBe('/foo');\n          expect($route.current.templateUrl).toBe('foo.html');\n          expect(onChangeSpy).toHaveBeenCalledTimes(2);\n\n          onChangeSpy.calls.reset();\n          $location.path('/baz');\n          $rootScope.$digest();\n          expect($location.path()).toBe('/bar');\n          expect($route.current.templateUrl).toBe('bar.html');\n          expect(onChangeSpy).toHaveBeenCalledTimes(2);\n        });\n      });\n\n\n      it('should interpolate route vars in the redirected path from original path', function() {\n        module(function($routeProvider) {\n          $routeProvider.when('/foo/:id/foo/:subid/:extraId', {redirectTo: '/bar/:id/:subid/23'});\n          $routeProvider.when('/bar/:id/:subid/:subsubid', {templateUrl: 'bar.html'});\n          $routeProvider.when('/baz/:id/:path*', {redirectTo: '/path/:path/:id'});\n          $routeProvider.when('/path/:path*/:id', {templateUrl: 'foo.html'});\n        });\n\n        inject(function($route, $location, $rootScope) {\n          $location.path('/foo/id1/foo/subid3/gah');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/bar/id1/subid3/23');\n          expect($location.search()).toEqual({extraId: 'gah'});\n          expect($route.current.templateUrl).toEqual('bar.html');\n\n          $location.path('/baz/1/foovalue/barvalue');\n          $rootScope.$digest();\n          expect($location.path()).toEqual('/path/foovalue/barvalue/1');\n          expect($route.current.templateUrl).toEqual('foo.html');\n        });\n      });\n\n\n      it('should interpolate route vars in the redirected path from original search', function() {\n        module(function($routeProvider) {\n          $routeProvider.when('/bar/:id/:subid/:subsubid', {templateUrl: 'bar.html'});\n          $routeProvider.when('/foo/:id/:extra', {redirectTo: '/bar/:id/:subid/99'});\n        });\n\n        inject(function($route, $location, $rootScope) {\n          $location.path('/foo/id3/eId').search('subid=sid1&appended=true');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/bar/id3/sid1/99');\n          expect($location.search()).toEqual({appended: 'true', extra: 'eId'});\n          expect($route.current.templateUrl).toEqual('bar.html');\n        });\n      });\n\n\n      it('should properly process route params which are both eager and optional', function() {\n        module(function($routeProvider) {\n          $routeProvider.when('/foo/:param1*?/:param2', {templateUrl: 'foo.html'});\n        });\n\n        inject(function($location, $rootScope, $route) {\n          $location.path('/foo/bar1/bar2/bar3/baz');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/foo/bar1/bar2/bar3/baz');\n          expect($route.current.params.param1).toEqual('bar1/bar2/bar3');\n          expect($route.current.params.param2).toEqual('baz');\n          expect($route.current.templateUrl).toEqual('foo.html');\n\n          $location.path('/foo/baz');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/foo/baz');\n          expect($route.current.params.param1).toEqual(undefined);\n          expect($route.current.params.param2).toEqual('baz');\n          expect($route.current.templateUrl).toEqual('foo.html');\n\n        });\n      });\n\n\n      it('should properly interpolate optional and eager route vars ' +\n         'when redirecting from path with trailing slash', function() {\n        module(function($routeProvider) {\n          $routeProvider.when('/foo/:id?/:subid?', {templateUrl: 'foo.html'});\n          $routeProvider.when('/bar/:id*/:subid', {templateUrl: 'bar.html'});\n        });\n\n        inject(function($location, $rootScope, $route) {\n          $location.path('/foo/id1/subid2/');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/foo/id1/subid2');\n          expect($route.current.templateUrl).toEqual('foo.html');\n\n          $location.path('/bar/id1/extra/subid2/');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/bar/id1/extra/subid2');\n          expect($route.current.templateUrl).toEqual('bar.html');\n        });\n      });\n\n\n      it('should allow custom redirectTo function to be used', function() {\n        function customRedirectFn(routePathParams, path, search) {\n          expect(routePathParams).toEqual({id: 'id3'});\n          expect(path).toEqual('/foo/id3');\n          expect(search).toEqual({subid: 'sid1', appended: 'true'});\n          return '/custom';\n        }\n\n        module(function($routeProvider) {\n          $routeProvider.when('/foo/:id', {redirectTo: customRedirectFn});\n        });\n\n        inject(function($route, $location, $rootScope) {\n          $location.path('/foo/id3').search('subid=sid1&appended=true');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/custom');\n        });\n      });\n\n\n      it('should broadcast `$routeChangeError` when redirectTo throws', function() {\n        var error = new Error('Test');\n\n        module(function($routeProvider) {\n          $routeProvider.when('/foo', {redirectTo: function() { throw error; }});\n        });\n\n        inject(function($exceptionHandler, $location, $rootScope, $route) {\n          spyOn($rootScope, '$broadcast').and.callThrough();\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          var lastCallArgs = $rootScope.$broadcast.calls.mostRecent().args;\n          expect(lastCallArgs[0]).toBe('$routeChangeError');\n          expect(lastCallArgs[3]).toBe(error);\n        });\n      });\n\n\n      it('should replace the url when redirecting',  function() {\n        module(function($routeProvider) {\n          $routeProvider.when('/bar/:id', {templateUrl: 'bar.html'});\n          $routeProvider.when('/foo/:id/:extra', {redirectTo: '/bar/:id'});\n        });\n        inject(function($browser, $route, $location, $rootScope) {\n          var $browserUrl = spyOnlyCallsWithArgs($browser, 'url').and.callThrough();\n\n          $location.path('/foo/id3/eId');\n          $rootScope.$digest();\n\n          expect($location.path()).toEqual('/bar/id3');\n          expect($browserUrl.calls.mostRecent().args)\n              .toEqual(['http://server/#!/bar/id3?extra=eId', true, null]);\n        });\n      });\n\n\n      it('should not process route bits', function() {\n        var firstController = jasmine.createSpy('first controller spy');\n        var firstTemplate = jasmine.createSpy('first template spy').and.returnValue('redirected view');\n        var firstResolve = jasmine.createSpy('first resolve spy');\n        var secondController = jasmine.createSpy('second controller spy');\n        var secondTemplate = jasmine.createSpy('second template spy').and.returnValue('redirected view');\n        var secondResolve = jasmine.createSpy('second resolve spy');\n        module(function($routeProvider) {\n          $routeProvider.when('/redirect', {\n            template: firstTemplate,\n            redirectTo: '/redirected',\n            resolve: { value: firstResolve },\n            controller: firstController\n          });\n          $routeProvider.when('/redirected', {\n            template: secondTemplate,\n            resolve: { value: secondResolve },\n            controller: secondController\n          });\n        });\n        inject(function($route, $location, $rootScope, $compile) {\n          var element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n          $location.path('/redirect');\n          $rootScope.$digest();\n\n          expect(firstController).not.toHaveBeenCalled();\n          expect(firstTemplate).not.toHaveBeenCalled();\n          expect(firstResolve).not.toHaveBeenCalled();\n\n          expect(secondController).toHaveBeenCalled();\n          expect(secondTemplate).toHaveBeenCalled();\n          expect(secondResolve).toHaveBeenCalled();\n\n          dealoc(element);\n        });\n      });\n\n\n      it('should not redirect transition if `redirectTo` returns `undefined`', function() {\n        var controller = jasmine.createSpy('first controller spy');\n        var templateFn = jasmine.createSpy('first template spy').and.returnValue('redirected view');\n        module(function($routeProvider) {\n          $routeProvider.when('/redirect/to/undefined', {\n            template: templateFn,\n            redirectTo: function() {},\n            controller: controller\n          });\n        });\n        inject(function($route, $location, $rootScope, $compile) {\n          var element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n          $location.path('/redirect/to/undefined');\n          $rootScope.$digest();\n          expect(controller).toHaveBeenCalled();\n          expect(templateFn).toHaveBeenCalled();\n          expect($location.path()).toEqual('/redirect/to/undefined');\n          dealoc(element);\n        });\n      });\n    });\n\n    describe('via `resolveRedirectTo`', function() {\n      var $compile;\n      var $location;\n      var $rootScope;\n      var $route;\n\n      beforeEach(module(function() {\n        return function(_$compile_, _$location_, _$rootScope_, _$route_) {\n          $compile = _$compile_;\n          $location = _$location_;\n          $rootScope = _$rootScope_;\n          $route = _$route_;\n        };\n      }));\n\n\n      it('should be ignored if `redirectTo` is also present', function() {\n        var newUrl;\n        var getNewUrl = function() { return newUrl; };\n\n        var resolveRedirectToSpy = jasmine.createSpy('resolveRedirectTo').and.returnValue('/bar');\n        var redirectToSpy = jasmine.createSpy('redirectTo').and.callFake(getNewUrl);\n        var templateSpy = jasmine.createSpy('template').and.returnValue('Foo');\n\n        module(function($routeProvider) {\n          $routeProvider.\n            when('/foo', {\n              resolveRedirectTo: resolveRedirectToSpy,\n              redirectTo: redirectToSpy,\n              template: templateSpy\n            }).\n            when('/bar', {template: 'Bar'}).\n            when('/baz', {template: 'Baz'});\n        });\n\n        inject(function() {\n          newUrl = '/baz';\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/baz');\n          expect($route.current.template).toBe('Baz');\n          expect(resolveRedirectToSpy).not.toHaveBeenCalled();\n          expect(redirectToSpy).toHaveBeenCalled();\n          expect(templateSpy).not.toHaveBeenCalled();\n\n          redirectToSpy.calls.reset();\n\n          newUrl = undefined;\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/foo');\n          expect($route.current.template).toBe(templateSpy);\n          expect(resolveRedirectToSpy).not.toHaveBeenCalled();\n          expect(redirectToSpy).toHaveBeenCalled();\n          expect(templateSpy).toHaveBeenCalled();\n        });\n      });\n\n\n      it('should redirect to the returned url', function() {\n        module(function($routeProvider) {\n          $routeProvider.\n            when('/foo', {resolveRedirectTo: function() { return '/bar?baz=qux'; }}).\n            when('/bar', {template: 'Bar'});\n        });\n\n        inject(function() {\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/bar');\n          expect($location.search()).toEqual({baz: 'qux'});\n          expect($route.current.template).toBe('Bar');\n        });\n      });\n\n\n      it('should support returning a promise', function() {\n        module(function($routeProvider) {\n          $routeProvider.\n            when('/foo', {resolveRedirectTo: function($q) { return $q.resolve('/bar'); }}).\n            when('/bar', {template: 'Bar'});\n        });\n\n        inject(function() {\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/bar');\n          expect($route.current.template).toBe('Bar');\n        });\n      });\n\n\n      it('should support dependency injection', function() {\n        module(function($provide, $routeProvider) {\n          $provide.value('nextRoute', '/bar');\n\n          $routeProvider.\n            when('/foo', {\n              resolveRedirectTo: function(nextRoute) {\n                return nextRoute;\n              }\n            });\n        });\n\n        inject(function() {\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/bar');\n        });\n      });\n\n\n      it('should have access to the current routeParams via `$route.current.params`', function() {\n        module(function($routeProvider) {\n          $routeProvider.\n            when('/foo/:bar/baz/:qux', {\n              resolveRedirectTo: function($route) {\n                expect($route.current.params).toEqual(jasmine.objectContaining({\n                  bar: '1',\n                  qux: '2'\n                }));\n\n                return '/passed';\n              }\n            });\n        });\n\n        inject(function() {\n          $location.path('/foo/1/baz/2').search({bar: 'qux'});\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/passed');\n        });\n      });\n\n\n      it('should not process route bits until the promise is resolved', function() {\n        var spies = createSpies();\n        var called = false;\n        var deferred;\n\n        module(function($routeProvider) {\n          setupRoutes($routeProvider, spies, function($q) {\n            called = true;\n            deferred = $q.defer();\n            return deferred.promise;\n          });\n        });\n\n        inject(function() {\n          var element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/foo');\n          expect(called).toBe(true);\n          expect(spies.fooResolveSpy).not.toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.fooControllerSpy).not.toHaveBeenCalled();\n          expect(spies.barResolveSpy).not.toHaveBeenCalled();\n          expect(spies.barTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.barControllerSpy).not.toHaveBeenCalled();\n\n          deferred.resolve('/bar');\n          $rootScope.$digest();\n          expect($location.path()).toBe('/bar');\n          expect(spies.fooResolveSpy).not.toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.fooControllerSpy).not.toHaveBeenCalled();\n          expect(spies.barResolveSpy).toHaveBeenCalled();\n          expect(spies.barTemplateSpy).toHaveBeenCalled();\n          expect(spies.barControllerSpy).toHaveBeenCalled();\n\n          dealoc(element);\n        });\n      });\n\n\n      it('should not redirect if `undefined` is returned', function() {\n        var spies = createSpies();\n        var called = false;\n\n        module(function($routeProvider) {\n          setupRoutes($routeProvider, spies, function() {\n            called = true;\n            return undefined;\n          });\n        });\n\n        inject(function() {\n          var element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/foo');\n          expect(called).toBe(true);\n          expect(spies.fooResolveSpy).toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).toHaveBeenCalled();\n          expect(spies.fooControllerSpy).toHaveBeenCalled();\n          expect(spies.barResolveSpy).not.toHaveBeenCalled();\n          expect(spies.barTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.barControllerSpy).not.toHaveBeenCalled();\n\n          dealoc(element);\n        });\n      });\n\n\n      it('should not redirect if the returned promise resolves to `undefined`', function() {\n        var spies = createSpies();\n        var called = false;\n\n        module(function($routeProvider) {\n          setupRoutes($routeProvider, spies, function($q) {\n            called = true;\n            return $q.resolve(undefined);\n          });\n        });\n\n        inject(function() {\n          var element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/foo');\n          expect(called).toBe(true);\n          expect(spies.fooResolveSpy).toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).toHaveBeenCalled();\n          expect(spies.fooControllerSpy).toHaveBeenCalled();\n          expect(spies.barResolveSpy).not.toHaveBeenCalled();\n          expect(spies.barTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.barControllerSpy).not.toHaveBeenCalled();\n\n          dealoc(element);\n        });\n      });\n\n\n      it('should not redirect if the returned promise gets rejected', function() {\n        var spies = createSpies();\n        var called = false;\n\n        module(function($routeProvider) {\n          setupRoutes($routeProvider, spies, function($q) {\n            called = true;\n            return $q.reject('');\n          });\n        });\n\n        inject(function() {\n          spyOn($rootScope, '$broadcast').and.callThrough();\n\n          var element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/foo');\n          expect(called).toBe(true);\n          expect(spies.fooResolveSpy).not.toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.fooControllerSpy).not.toHaveBeenCalled();\n          expect(spies.barResolveSpy).not.toHaveBeenCalled();\n          expect(spies.barTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.barControllerSpy).not.toHaveBeenCalled();\n\n          var lastCallArgs = $rootScope.$broadcast.calls.mostRecent().args;\n          expect(lastCallArgs[0]).toBe('$routeChangeError');\n\n          dealoc(element);\n        });\n      });\n\n\n      it('should ignore previous redirection if newer transition happened', function() {\n        var spies = createSpies();\n        var called = false;\n        var deferred;\n\n        module(function($routeProvider) {\n          setupRoutes($routeProvider, spies, function($q) {\n            called = true;\n            deferred = $q.defer();\n            return deferred.promise;\n          });\n        });\n\n        inject(function() {\n          spyOn($location, 'url').and.callThrough();\n\n          var element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n\n          $location.path('/foo');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/foo');\n          expect(called).toBe(true);\n          expect(spies.fooResolveSpy).not.toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.fooControllerSpy).not.toHaveBeenCalled();\n          expect(spies.barResolveSpy).not.toHaveBeenCalled();\n          expect(spies.barTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.barControllerSpy).not.toHaveBeenCalled();\n          expect(spies.bazResolveSpy).not.toHaveBeenCalled();\n          expect(spies.bazTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.bazControllerSpy).not.toHaveBeenCalled();\n\n          $location.path('/baz');\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/baz');\n          expect(spies.fooResolveSpy).not.toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.fooControllerSpy).not.toHaveBeenCalled();\n          expect(spies.barResolveSpy).not.toHaveBeenCalled();\n          expect(spies.barTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.barControllerSpy).not.toHaveBeenCalled();\n          expect(spies.bazResolveSpy).toHaveBeenCalledOnce();\n          expect(spies.bazTemplateSpy).toHaveBeenCalledOnce();\n          expect(spies.bazControllerSpy).toHaveBeenCalledOnce();\n\n          deferred.resolve();\n          $rootScope.$digest();\n\n          expect($location.path()).toBe('/baz');\n          expect(spies.fooResolveSpy).not.toHaveBeenCalled();\n          expect(spies.fooTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.fooControllerSpy).not.toHaveBeenCalled();\n          expect(spies.barResolveSpy).not.toHaveBeenCalled();\n          expect(spies.barTemplateSpy).not.toHaveBeenCalled();\n          expect(spies.barControllerSpy).not.toHaveBeenCalled();\n          expect(spies.bazResolveSpy).toHaveBeenCalledOnce();\n          expect(spies.bazTemplateSpy).toHaveBeenCalledOnce();\n          expect(spies.bazControllerSpy).toHaveBeenCalledOnce();\n\n          dealoc(element);\n        });\n      });\n\n\n      // Helpers\n      function createSpies() {\n        return {\n          fooResolveSpy: jasmine.createSpy('fooResolve'),\n          fooTemplateSpy: jasmine.createSpy('fooTemplate').and.returnValue('Foo'),\n          fooControllerSpy: jasmine.createSpy('fooController'),\n          barResolveSpy: jasmine.createSpy('barResolve'),\n          barTemplateSpy: jasmine.createSpy('barTemplate').and.returnValue('Bar'),\n          barControllerSpy: jasmine.createSpy('barController'),\n          bazResolveSpy: jasmine.createSpy('bazResolve'),\n          bazTemplateSpy: jasmine.createSpy('bazTemplate').and.returnValue('Baz'),\n          bazControllerSpy: jasmine.createSpy('bazController')\n        };\n      }\n\n      function setupRoutes(routeProvider, spies, resolveRedirectToFn) {\n        routeProvider.\n          when('/foo', {\n            resolveRedirectTo: resolveRedirectToFn,\n            resolve: {_: spies.fooResolveSpy},\n            template: spies.fooTemplateSpy,\n            controller: spies.fooControllerSpy\n          }).\n          when('/bar', {\n            resolve: {_: spies.barResolveSpy},\n            template: spies.barTemplateSpy,\n            controller: spies.barControllerSpy\n          }).\n          when('/baz', {\n            resolve: {_: spies.bazResolveSpy},\n            template: spies.bazTemplateSpy,\n            controller: spies.bazControllerSpy\n          });\n      }\n    });\n  });\n\n\n  describe('reloadOnUrl', function() {\n    it('should reload when `reloadOnUrl` is true and `.url()` changes', function() {\n      var routeChange = jasmine.createSpy('routeChange');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/path/:param', {});\n      });\n\n      inject(function($location, $rootScope, $routeParams) {\n        $rootScope.$on('$routeChangeStart', routeChange);\n\n        // Initial load\n        $location.path('/path/foo');\n        $rootScope.$digest();\n        expect(routeChange).toHaveBeenCalledOnce();\n        expect($routeParams).toEqual({param: 'foo'});\n\n        routeChange.calls.reset();\n\n        // Reload on `path` change\n        $location.path('/path/bar');\n        $rootScope.$digest();\n        expect(routeChange).toHaveBeenCalledOnce();\n        expect($routeParams).toEqual({param: 'bar'});\n\n        routeChange.calls.reset();\n\n        // Reload on `search` change\n        $location.search('foo', 'bar');\n        $rootScope.$digest();\n        expect(routeChange).toHaveBeenCalledOnce();\n        expect($routeParams).toEqual({param: 'bar', foo: 'bar'});\n\n        routeChange.calls.reset();\n\n        // Reload on `hash` change\n        $location.hash('baz');\n        $rootScope.$digest();\n        expect(routeChange).toHaveBeenCalledOnce();\n        expect($routeParams).toEqual({param: 'bar', foo: 'bar'});\n      });\n    });\n\n\n    it('should reload when `reloadOnUrl` is false and URL maps to different route',\n      function() {\n        var routeChange = jasmine.createSpy('routeChange');\n        var routeUpdate = jasmine.createSpy('routeUpdate');\n\n        module(function($routeProvider) {\n          $routeProvider.\n            when('/path/:param', {reloadOnUrl: false}).\n            otherwise({});\n        });\n\n        inject(function($location, $rootScope, $routeParams) {\n          $rootScope.$on('$routeChangeStart', routeChange);\n          $rootScope.$on('$routeChangeSuccess', routeChange);\n          $rootScope.$on('$routeUpdate', routeUpdate);\n\n          expect(routeChange).not.toHaveBeenCalled();\n\n          // Initial load\n          $location.path('/path/foo');\n          $rootScope.$digest();\n          expect(routeChange).toHaveBeenCalledTimes(2);\n          expect(routeUpdate).not.toHaveBeenCalled();\n          expect($routeParams).toEqual({param: 'foo'});\n\n          routeChange.calls.reset();\n\n          // Route change\n          $location.path('/other/path/bar');\n          $rootScope.$digest();\n          expect(routeChange).toHaveBeenCalledTimes(2);\n          expect(routeUpdate).not.toHaveBeenCalled();\n          expect($routeParams).toEqual({});\n        });\n      }\n    );\n\n\n    it('should not reload when `reloadOnUrl` is false and URL maps to the same route',\n      function() {\n        var routeChange = jasmine.createSpy('routeChange');\n        var routeUpdate = jasmine.createSpy('routeUpdate');\n\n        module(function($routeProvider) {\n          $routeProvider.when('/path/:param', {reloadOnUrl: false});\n        });\n\n        inject(function($location, $rootScope, $routeParams) {\n          $rootScope.$on('$routeChangeStart', routeChange);\n          $rootScope.$on('$routeChangeSuccess', routeChange);\n          $rootScope.$on('$routeUpdate', routeUpdate);\n\n          expect(routeChange).not.toHaveBeenCalled();\n\n          // Initial load\n          $location.path('/path/foo');\n          $rootScope.$digest();\n          expect(routeChange).toHaveBeenCalledTimes(2);\n          expect(routeUpdate).not.toHaveBeenCalled();\n          expect($routeParams).toEqual({param: 'foo'});\n\n          routeChange.calls.reset();\n\n          // Route update (no reload)\n          $location.path('/path/bar').search('foo', 'bar').hash('baz');\n          $rootScope.$digest();\n          expect(routeChange).not.toHaveBeenCalled();\n          expect(routeUpdate).toHaveBeenCalledOnce();\n          expect($routeParams).toEqual({param: 'bar', foo: 'bar'});\n        });\n      }\n    );\n\n\n    it('should update `$routeParams` even when not reloading a route', function() {\n      var routeChange = jasmine.createSpy('routeChange');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/path/:param', {reloadOnUrl: false});\n      });\n\n      inject(function($location, $rootScope, $routeParams) {\n        $rootScope.$on('$routeChangeStart', routeChange);\n        $rootScope.$on('$routeChangeSuccess', routeChange);\n\n        expect(routeChange).not.toHaveBeenCalled();\n\n        // Initial load\n        $location.path('/path/foo');\n        $rootScope.$digest();\n        expect(routeChange).toHaveBeenCalledTimes(2);\n        expect($routeParams).toEqual({param: 'foo'});\n\n        routeChange.calls.reset();\n\n        // Route update (no reload)\n        $location.path('/path/bar');\n        $rootScope.$digest();\n        expect(routeChange).not.toHaveBeenCalled();\n        expect($routeParams).toEqual({param: 'bar'});\n      });\n    });\n\n\n    describe('with `$route.reload()`', function() {\n      var $location;\n      var $log;\n      var $rootScope;\n      var $route;\n      var routeChangeStart;\n      var routeChangeSuccess;\n\n      beforeEach(module(function($routeProvider) {\n        $routeProvider.when('/path/:param', {\n          template: '',\n          reloadOnUrl: false,\n          controller: function Controller($log) {\n            $log.debug('initialized');\n          }\n        });\n      }));\n\n      beforeEach(inject(function($compile, _$location_, _$log_, _$rootScope_, _$route_) {\n        $location = _$location_;\n        $log = _$log_;\n        $rootScope = _$rootScope_;\n        $route = _$route_;\n\n        routeChangeStart = jasmine.createSpy('routeChangeStart');\n        routeChangeSuccess = jasmine.createSpy('routeChangeSuccess');\n\n        $rootScope.$on('$routeChangeStart', routeChangeStart);\n        $rootScope.$on('$routeChangeSuccess', routeChangeSuccess);\n\n        element = $compile('<div><ng-view></ng-view></div>')($rootScope);\n      }));\n\n\n      it('should reload the current route', function() {\n        $location.path('/path/foo');\n        $rootScope.$digest();\n        expect($location.path()).toBe('/path/foo');\n        expect(routeChangeStart).toHaveBeenCalledOnce();\n        expect(routeChangeSuccess).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        routeChangeStart.calls.reset();\n        routeChangeSuccess.calls.reset();\n        $log.reset();\n\n        $route.reload();\n        $rootScope.$digest();\n        expect($location.path()).toBe('/path/foo');\n        expect(routeChangeStart).toHaveBeenCalledOnce();\n        expect(routeChangeSuccess).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        $log.reset();\n      });\n\n\n      it('should support preventing a route reload', function() {\n        $location.path('/path/foo');\n        $rootScope.$digest();\n        expect($location.path()).toBe('/path/foo');\n        expect(routeChangeStart).toHaveBeenCalledOnce();\n        expect(routeChangeSuccess).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        routeChangeStart.calls.reset();\n        routeChangeSuccess.calls.reset();\n        $log.reset();\n\n        routeChangeStart.and.callFake(function(evt) { evt.preventDefault(); });\n\n        $route.reload();\n        $rootScope.$digest();\n        expect($location.path()).toBe('/path/foo');\n        expect(routeChangeStart).toHaveBeenCalledOnce();\n        expect(routeChangeSuccess).not.toHaveBeenCalled();\n        expect($log.debug.logs).toEqual([]);\n      });\n\n\n      it('should reload the current route even if `reloadOnUrl` is disabled',\n        inject(function($routeParams) {\n          $location.path('/path/foo');\n          $rootScope.$digest();\n          expect(routeChangeStart).toHaveBeenCalledOnce();\n          expect(routeChangeSuccess).toHaveBeenCalledOnce();\n          expect($log.debug.logs).toEqual([['initialized']]);\n          expect($routeParams).toEqual({param: 'foo'});\n\n          routeChangeStart.calls.reset();\n          routeChangeSuccess.calls.reset();\n          $log.reset();\n\n          $location.path('/path/bar');\n          $rootScope.$digest();\n          expect(routeChangeStart).not.toHaveBeenCalled();\n          expect(routeChangeSuccess).not.toHaveBeenCalled();\n          expect($log.debug.logs).toEqual([]);\n          expect($routeParams).toEqual({param: 'bar'});\n\n          $route.reload();\n          $rootScope.$digest();\n          expect(routeChangeStart).toHaveBeenCalledOnce();\n          expect(routeChangeSuccess).toHaveBeenCalledOnce();\n          expect($log.debug.logs).toEqual([['initialized']]);\n          expect($routeParams).toEqual({param: 'bar'});\n\n          $log.reset();\n        })\n      );\n    });\n  });\n\n  describe('reloadOnSearch', function() {\n    it('should not have any effect if `reloadOnUrl` is false', function() {\n      var reloaded = jasmine.createSpy('route reload');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {\n          reloadOnUrl: false,\n          reloadOnSearch: true\n        });\n      });\n\n      inject(function($route, $location, $rootScope, $routeParams) {\n        $rootScope.$on('$routeChangeStart', reloaded);\n\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect(reloaded).toHaveBeenCalledOnce();\n        expect($routeParams).toEqual({});\n\n        reloaded.calls.reset();\n\n        // trigger reload (via .search())\n        $location.search({foo: 'bar'});\n        $rootScope.$digest();\n        expect(reloaded).not.toHaveBeenCalled();\n        expect($routeParams).toEqual({foo: 'bar'});\n\n        // trigger reload (via .hash())\n        $location.hash('baz');\n        $rootScope.$digest();\n        expect(reloaded).not.toHaveBeenCalled();\n        expect($routeParams).toEqual({foo: 'bar'});\n      });\n    });\n\n\n    it('should reload when `reloadOnSearch` is true and `.search()`/`.hash()` changes',\n      function() {\n        var reloaded = jasmine.createSpy('route reload');\n\n        module(function($routeProvider) {\n          $routeProvider.when('/foo', {controller: angular.noop});\n        });\n\n        inject(function($route, $location, $rootScope, $routeParams) {\n          $rootScope.$on('$routeChangeStart', reloaded);\n\n          $location.path('/foo');\n          $rootScope.$digest();\n          expect(reloaded).toHaveBeenCalledOnce();\n          expect($routeParams).toEqual({});\n\n          reloaded.calls.reset();\n\n          // trigger reload (via .search())\n          $location.search({foo: 'bar'});\n          $rootScope.$digest();\n          expect(reloaded).toHaveBeenCalledOnce();\n          expect($routeParams).toEqual({foo: 'bar'});\n\n          reloaded.calls.reset();\n\n          // trigger reload (via .hash())\n          $location.hash('baz');\n          $rootScope.$digest();\n          expect(reloaded).toHaveBeenCalledOnce();\n          expect($routeParams).toEqual({foo: 'bar'});\n        });\n      }\n    );\n\n\n    it('should not reload when `reloadOnSearch` is false and `.search()`/`.hash()` changes',\n      function() {\n        var routeChange = jasmine.createSpy('route change'),\n            routeUpdate = jasmine.createSpy('route update');\n\n        module(function($routeProvider) {\n          $routeProvider.when('/foo', {controller: angular.noop, reloadOnSearch: false});\n        });\n\n        inject(function($route, $location, $rootScope) {\n          $rootScope.$on('$routeChangeStart', routeChange);\n          $rootScope.$on('$routeChangeSuccess', routeChange);\n          $rootScope.$on('$routeUpdate', routeUpdate);\n\n          expect(routeChange).not.toHaveBeenCalled();\n\n          $location.path('/foo');\n          $rootScope.$digest();\n          expect(routeChange).toHaveBeenCalledTimes(2);\n          expect(routeUpdate).not.toHaveBeenCalled();\n\n          routeChange.calls.reset();\n\n          // don't trigger reload (via .search())\n          $location.search({foo: 'bar'});\n          $rootScope.$digest();\n          expect(routeChange).not.toHaveBeenCalled();\n          expect(routeUpdate).toHaveBeenCalledOnce();\n\n          routeUpdate.calls.reset();\n\n          // don't trigger reload (via .hash())\n          $location.hash('baz');\n          $rootScope.$digest();\n          expect(routeChange).not.toHaveBeenCalled();\n          expect(routeUpdate).toHaveBeenCalled();\n        });\n      }\n    );\n\n\n    it('should reload when `reloadOnSearch` is false and url differs only in route path param',\n      function() {\n        var routeChange = jasmine.createSpy('route change');\n\n        module(function($routeProvider) {\n          $routeProvider.when('/foo/:fooId', {controller: angular.noop, reloadOnSearch: false});\n        });\n\n        inject(function($route, $location, $rootScope) {\n          $rootScope.$on('$routeChangeStart', routeChange);\n          $rootScope.$on('$routeChangeSuccess', routeChange);\n\n          expect(routeChange).not.toHaveBeenCalled();\n\n          $location.path('/foo/aaa');\n          $rootScope.$digest();\n          expect(routeChange).toHaveBeenCalledTimes(2);\n          routeChange.calls.reset();\n\n          $location.path('/foo/bbb');\n          $rootScope.$digest();\n          expect(routeChange).toHaveBeenCalledTimes(2);\n          routeChange.calls.reset();\n\n          $location.search({foo: 'bar'}).hash('baz');\n          $rootScope.$digest();\n          expect(routeChange).not.toHaveBeenCalled();\n        });\n      }\n    );\n\n\n    it('should update params when `reloadOnSearch` is false and `.search()` changes', function() {\n      var routeParamsWatcher = jasmine.createSpy('routeParamsWatcher');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/foo', {controller: angular.noop});\n        $routeProvider.when('/bar/:barId', {controller: angular.noop, reloadOnSearch: false});\n      });\n\n      inject(function($route, $location, $rootScope, $routeParams) {\n        $rootScope.$watch(function() {\n          return $routeParams;\n        }, function(value) {\n          routeParamsWatcher(value);\n        }, true);\n\n        expect(routeParamsWatcher).not.toHaveBeenCalled();\n\n        $location.path('/foo');\n        $rootScope.$digest();\n        expect(routeParamsWatcher).toHaveBeenCalledWith({});\n        routeParamsWatcher.calls.reset();\n\n        // trigger reload\n        $location.search({foo: 'bar'});\n        $rootScope.$digest();\n        expect(routeParamsWatcher).toHaveBeenCalledWith({foo: 'bar'});\n        routeParamsWatcher.calls.reset();\n\n        $location.path('/bar/123').search({});\n        $rootScope.$digest();\n        expect(routeParamsWatcher).toHaveBeenCalledWith({barId: '123'});\n        routeParamsWatcher.calls.reset();\n\n        // don't trigger reload\n        $location.search({foo: 'bar'});\n        $rootScope.$digest();\n        expect(routeParamsWatcher).toHaveBeenCalledWith({barId: '123', foo: 'bar'});\n      });\n    });\n\n\n    it('should allow using a function as a template', function() {\n      var customTemplateWatcher = jasmine.createSpy('customTemplateWatcher');\n\n      function customTemplateFn(routePathParams) {\n        customTemplateWatcher(routePathParams);\n        expect(routePathParams).toEqual({id: 'id3'});\n        return '<h1>' + routePathParams.id + '</h1>';\n      }\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar/:id/:subid/:subsubid', {templateUrl: 'bar.html'});\n        $routeProvider.when('/foo/:id', {template: customTemplateFn});\n      });\n\n      inject(function($route, $location, $rootScope) {\n        $location.path('/foo/id3');\n        $rootScope.$digest();\n\n        expect(customTemplateWatcher).toHaveBeenCalledWith({id: 'id3'});\n      });\n    });\n\n\n    it('should allow using a function as a templateUrl', function() {\n      var customTemplateUrlWatcher = jasmine.createSpy('customTemplateUrlWatcher');\n\n      function customTemplateUrlFn(routePathParams) {\n        customTemplateUrlWatcher(routePathParams);\n        expect(routePathParams).toEqual({id: 'id3'});\n        return 'foo.html';\n      }\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar/:id/:subid/:subsubid', {templateUrl: 'bar.html'});\n        $routeProvider.when('/foo/:id', {templateUrl: customTemplateUrlFn});\n      });\n\n      inject(function($route, $location, $rootScope) {\n        $location.path('/foo/id3');\n        $rootScope.$digest();\n\n        expect(customTemplateUrlWatcher).toHaveBeenCalledWith({id: 'id3'});\n        expect($route.current.loadedTemplateUrl).toEqual('foo.html');\n      });\n    });\n\n\n    describe('with `$route.reload()`', function() {\n      var $location;\n      var $log;\n      var $rootScope;\n      var $route;\n      var routeChangeStartSpy;\n      var routeChangeSuccessSpy;\n\n      beforeEach(module(function($routeProvider) {\n        $routeProvider.when('/bar/:barId', {\n          template: '',\n          controller: controller,\n          reloadOnSearch: false\n        });\n\n        function controller($log) {\n          $log.debug('initialized');\n        }\n      }));\n      beforeEach(inject(function($compile, _$location_, _$log_, _$rootScope_, _$route_) {\n        $location = _$location_;\n        $log = _$log_;\n        $rootScope = _$rootScope_;\n        $route = _$route_;\n\n        routeChangeStartSpy = jasmine.createSpy('routeChangeStart');\n        routeChangeSuccessSpy = jasmine.createSpy('routeChangeSuccess');\n\n        $rootScope.$on('$routeChangeStart', routeChangeStartSpy);\n        $rootScope.$on('$routeChangeSuccess', routeChangeSuccessSpy);\n\n        element = $compile('<div><div ng-view></div></div>')($rootScope);\n      }));\n\n\n      it('should reload the current route', function() {\n        $location.path('/bar/123');\n        $rootScope.$digest();\n        expect($location.path()).toBe('/bar/123');\n        expect(routeChangeStartSpy).toHaveBeenCalledOnce();\n        expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        routeChangeStartSpy.calls.reset();\n        routeChangeSuccessSpy.calls.reset();\n        $log.reset();\n\n        $route.reload();\n        $rootScope.$digest();\n        expect($location.path()).toBe('/bar/123');\n        expect(routeChangeStartSpy).toHaveBeenCalledOnce();\n        expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        $log.reset();\n      });\n\n\n      it('should support preventing a route reload', function() {\n        $location.path('/bar/123');\n        $rootScope.$digest();\n        expect($location.path()).toBe('/bar/123');\n        expect(routeChangeStartSpy).toHaveBeenCalledOnce();\n        expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        routeChangeStartSpy.calls.reset();\n        routeChangeSuccessSpy.calls.reset();\n        $log.reset();\n\n        routeChangeStartSpy.and.callFake(function(evt) { evt.preventDefault(); });\n\n        $route.reload();\n        $rootScope.$digest();\n        expect($location.path()).toBe('/bar/123');\n        expect(routeChangeStartSpy).toHaveBeenCalledOnce();\n        expect(routeChangeSuccessSpy).not.toHaveBeenCalled();\n        expect($log.debug.logs).toEqual([]);\n      });\n\n\n      it('should reload even if reloadOnSearch is false', inject(function($routeParams) {\n        $location.path('/bar/123');\n        $rootScope.$digest();\n        expect($routeParams).toEqual({barId: '123'});\n        expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        routeChangeSuccessSpy.calls.reset();\n        $log.reset();\n\n        $location.search('a=b');\n        $rootScope.$digest();\n        expect($routeParams).toEqual({barId: '123', a: 'b'});\n        expect(routeChangeSuccessSpy).not.toHaveBeenCalled();\n        expect($log.debug.logs).toEqual([]);\n\n        routeChangeSuccessSpy.calls.reset();\n        $log.reset();\n\n        $location.hash('c');\n        $rootScope.$digest();\n        expect($routeParams).toEqual({barId: '123', a: 'b'});\n        expect(routeChangeSuccessSpy).not.toHaveBeenCalled();\n        expect($log.debug.logs).toEqual([]);\n\n        $route.reload();\n        $rootScope.$digest();\n        expect($routeParams).toEqual({barId: '123', a: 'b'});\n        expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();\n        expect($log.debug.logs).toEqual([['initialized']]);\n\n        $log.reset();\n      }));\n    });\n  });\n\n  describe('update', function() {\n    it('should support single-parameter route updating', function() {\n      var routeChangeSpy = jasmine.createSpy('route change');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar/:barId', {controller: angular.noop});\n      });\n\n      inject(function($route, $routeParams, $location, $rootScope) {\n        $rootScope.$on('$routeChangeSuccess', routeChangeSpy);\n\n        $location.path('/bar/1');\n        $rootScope.$digest();\n        routeChangeSpy.calls.reset();\n\n        $route.updateParams({barId: '2'});\n        $rootScope.$digest();\n\n        expect($routeParams).toEqual({barId: '2'});\n        expect(routeChangeSpy).toHaveBeenCalledOnce();\n        expect($location.path()).toEqual('/bar/2');\n      });\n    });\n\n    it('should support total multi-parameter route updating', function() {\n      var routeChangeSpy = jasmine.createSpy('route change');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar/:barId/:fooId/:spamId/:eggId', {controller: angular.noop});\n      });\n\n      inject(function($route, $routeParams, $location, $rootScope) {\n        $rootScope.$on('$routeChangeSuccess', routeChangeSpy);\n\n        $location.path('/bar/1/2/3/4');\n        $rootScope.$digest();\n        routeChangeSpy.calls.reset();\n\n        $route.updateParams({barId: '5', fooId: '6', spamId: '7', eggId: '8'});\n        $rootScope.$digest();\n\n        expect($routeParams).toEqual({barId: '5', fooId: '6', spamId: '7', eggId: '8'});\n        expect(routeChangeSpy).toHaveBeenCalledOnce();\n        expect($location.path()).toEqual('/bar/5/6/7/8');\n      });\n    });\n\n    it('should support partial multi-parameter route updating', function() {\n      var routeChangeSpy = jasmine.createSpy('route change');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar/:barId/:fooId/:spamId/:eggId', {controller: angular.noop});\n      });\n\n      inject(function($route, $routeParams, $location, $rootScope) {\n        $rootScope.$on('$routeChangeSuccess', routeChangeSpy);\n\n        $location.path('/bar/1/2/3/4');\n        $rootScope.$digest();\n        routeChangeSpy.calls.reset();\n\n        $route.updateParams({barId: '5', fooId: '6'});\n        $rootScope.$digest();\n\n        expect($routeParams).toEqual({barId: '5', fooId: '6', spamId: '3', eggId: '4'});\n        expect(routeChangeSpy).toHaveBeenCalledOnce();\n        expect($location.path()).toEqual('/bar/5/6/3/4');\n      });\n    });\n\n\n    it('should update query params when new properties are not in path', function() {\n      var routeChangeSpy = jasmine.createSpy('route change');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar/:barId/:fooId/:spamId/', {controller: angular.noop});\n      });\n\n      inject(function($route, $routeParams, $location, $rootScope) {\n        $rootScope.$on('$routeChangeSuccess', routeChangeSpy);\n\n        $location.path('/bar/1/2/3');\n        $location.search({initial: 'true'});\n        $rootScope.$digest();\n        routeChangeSpy.calls.reset();\n\n        $route.updateParams({barId: '5', fooId: '6', eggId: '4'});\n        $rootScope.$digest();\n\n        expect($routeParams).toEqual({barId: '5', fooId: '6', spamId: '3', eggId: '4', initial: 'true'});\n        expect(routeChangeSpy).toHaveBeenCalledOnce();\n        expect($location.path()).toEqual('/bar/5/6/3/');\n        expect($location.search()).toEqual({eggId: '4', initial: 'true'});\n      });\n    });\n\n    it('should not update query params when an optional property was previously not in path', function() {\n      var routeChangeSpy = jasmine.createSpy('route change');\n\n      module(function($routeProvider) {\n        $routeProvider.when('/bar/:barId/:fooId/:spamId/:eggId?', {controller: angular.noop});\n      });\n\n      inject(function($route, $routeParams, $location, $rootScope) {\n        $rootScope.$on('$routeChangeSuccess', routeChangeSpy);\n\n        $location.path('/bar/1/2/3');\n        $location.search({initial: 'true'});\n        $rootScope.$digest();\n        routeChangeSpy.calls.reset();\n\n        $route.updateParams({barId: '5', fooId: '6', eggId: '4'});\n        $rootScope.$digest();\n\n        expect($routeParams).toEqual({barId: '5', fooId: '6', spamId: '3', eggId: '4', initial: 'true'});\n        expect(routeChangeSpy).toHaveBeenCalledOnce();\n        expect($location.path()).toEqual('/bar/5/6/3/4');\n        expect($location.search()).toEqual({initial: 'true'});\n      });\n    });\n\n    it('should complain if called without an existing route', inject(function($route) {\n      expect(function() { $route.updateParams(); }).toThrowMinErr('ngRoute', 'norout');\n    }));\n  });\n\n  describe('testability', function() {\n    it('should wait for $resolve promises before calling callbacks', function() {\n      var deferred;\n\n      module(function($routeProvider) {\n        $routeProvider.when('/path', {\n          resolve: {\n            a: function($q) {\n              deferred = $q.defer();\n              return deferred.promise;\n            }\n          }\n        });\n      });\n\n      inject(function($browser, $location, $rootScope, $$testability) {\n        $location.path('/path');\n        $rootScope.$digest();\n\n        var callback = jasmine.createSpy('callback');\n        $$testability.whenStable(callback);\n        expect(callback).not.toHaveBeenCalled();\n\n        deferred.resolve();\n        $browser.defer.flush();\n        expect(callback).toHaveBeenCalled();\n      });\n    });\n\n    it('should call callback after $resolve promises are rejected', function() {\n      var deferred;\n\n      module(function($routeProvider) {\n        $routeProvider.when('/path', {\n          resolve: {\n            a: function($q) {\n              deferred = $q.defer();\n              return deferred.promise;\n            }\n          }\n        });\n      });\n\n      inject(function($browser, $location, $rootScope, $$testability) {\n        $location.path('/path');\n        $rootScope.$digest();\n\n        var callback = jasmine.createSpy('callback');\n        $$testability.whenStable(callback);\n        expect(callback).not.toHaveBeenCalled();\n\n        deferred.reject();\n        $browser.defer.flush();\n        expect(callback).toHaveBeenCalled();\n      });\n    });\n\n    it('should wait for resolveRedirectTo promises before calling callbacks', function() {\n      var deferred;\n\n      module(function($routeProvider) {\n        $routeProvider.when('/path', {\n          resolveRedirectTo: function($q) {\n            deferred = $q.defer();\n            return deferred.promise;\n          }\n        });\n      });\n\n      inject(function($browser, $location, $rootScope, $$testability) {\n        $location.path('/path');\n        $rootScope.$digest();\n\n        var callback = jasmine.createSpy('callback');\n        $$testability.whenStable(callback);\n        expect(callback).not.toHaveBeenCalled();\n\n        deferred.resolve();\n        $browser.defer.flush();\n        expect(callback).toHaveBeenCalled();\n      });\n    });\n\n    it('should call callback after resolveRedirectTo promises are rejected', function() {\n      var deferred;\n\n      module(function($routeProvider) {\n        $routeProvider.when('/path', {\n          resolveRedirectTo: function($q) {\n            deferred = $q.defer();\n            return deferred.promise;\n          }\n        });\n      });\n\n      inject(function($browser, $location, $rootScope, $$testability) {\n        $location.path('/path');\n        $rootScope.$digest();\n\n        var callback = jasmine.createSpy('callback');\n        $$testability.whenStable(callback);\n        expect(callback).not.toHaveBeenCalled();\n\n        deferred.reject();\n        $browser.defer.flush();\n        expect(callback).toHaveBeenCalled();\n      });\n    });\n\n    it('should wait for all route promises before calling callbacks', function() {\n      var deferreds = {};\n\n      module(function($routeProvider) {\n        addRouteWithAsyncRedirect('/foo', '/bar');\n        addRouteWithAsyncRedirect('/bar', '/baz');\n        addRouteWithAsyncRedirect('/baz', '/qux');\n        $routeProvider.when('/qux', {\n          resolve: {\n            a: function($q) {\n              var deferred = deferreds['/qux'] = $q.defer();\n              return deferred.promise;\n            }\n          }\n        });\n\n        // Helpers\n        function addRouteWithAsyncRedirect(fromPath, toPath) {\n          $routeProvider.when(fromPath, {\n            resolveRedirectTo: function($q) {\n              var deferred = deferreds[fromPath] = $q.defer();\n              return deferred.promise.then(function() { return toPath; });\n            }\n          });\n        }\n      });\n\n      inject(function($browser, $location, $rootScope, $$testability) {\n        $location.path('/foo');\n        $rootScope.$digest();\n\n        var callback = jasmine.createSpy('callback');\n        $$testability.whenStable(callback);\n        expect(callback).not.toHaveBeenCalled();\n\n        deferreds['/foo'].resolve();\n        $browser.defer.flush();\n        expect(callback).not.toHaveBeenCalled();\n\n        deferreds['/bar'].resolve();\n        $browser.defer.flush();\n        expect(callback).not.toHaveBeenCalled();\n\n        deferreds['/baz'].resolve();\n        $browser.defer.flush();\n        expect(callback).not.toHaveBeenCalled();\n\n        deferreds['/qux'].resolve();\n        $browser.defer.flush();\n        expect(callback).toHaveBeenCalled();\n      });\n    });\n  });\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-sanitize.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $sanitizeMinErr = angular.$$minErr('$sanitize');\nvar bind;\nvar extend;\nvar forEach;\nvar isArray;\nvar isDefined;\nvar lowercase;\nvar noop;\nvar nodeContains;\nvar htmlParser;\nvar htmlSanitizeWriter;\n\n/**\n * @ngdoc module\n * @name ngSanitize\n * @description\n *\n * The `ngSanitize` module provides functionality to sanitize HTML.\n *\n * See {@link ngSanitize.$sanitize `$sanitize`} for usage.\n */\n\n/**\n * @ngdoc service\n * @name $sanitize\n * @kind function\n *\n * @description\n *   Sanitizes an html string by stripping all potentially dangerous tokens.\n *\n *   The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are\n *   then serialized back to a properly escaped HTML string. This means that no unsafe input can make\n *   it into the returned string.\n *\n *   The whitelist for URL sanitization of attribute values is configured using the functions\n *   `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link $compileProvider}.\n *\n *   The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}.\n *\n * @param {string} html HTML input.\n * @returns {string} Sanitized HTML.\n *\n * @example\n   <example module=\"sanitizeExample\" deps=\"angular-sanitize.js\" name=\"sanitize-service\">\n   <file name=\"index.html\">\n     <script>\n         angular.module('sanitizeExample', ['ngSanitize'])\n           .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {\n             $scope.snippet =\n               '<p style=\"color:blue\">an html\\n' +\n               '<em onmouseover=\"this.textContent=\\'PWN3D!\\'\">click here</em>\\n' +\n               'snippet</p>';\n             $scope.deliberatelyTrustDangerousSnippet = function() {\n               return $sce.trustAsHtml($scope.snippet);\n             };\n           }]);\n     </script>\n     <div ng-controller=\"ExampleController\">\n        Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <td>Directive</td>\n           <td>How</td>\n           <td>Source</td>\n           <td>Rendered</td>\n         </tr>\n         <tr id=\"bind-html-with-sanitize\">\n           <td>ng-bind-html</td>\n           <td>Automatically uses $sanitize</td>\n           <td><pre>&lt;div ng-bind-html=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind-html=\"snippet\"></div></td>\n         </tr>\n         <tr id=\"bind-html-with-trust\">\n           <td>ng-bind-html</td>\n           <td>Bypass $sanitize by explicitly trusting the dangerous value</td>\n           <td>\n           <pre>&lt;div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"&gt;\n&lt;/div&gt;</pre>\n           </td>\n           <td><div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"></div></td>\n         </tr>\n         <tr id=\"bind-default\">\n           <td>ng-bind</td>\n           <td>Automatically escapes</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n       </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should sanitize the html snippet by default', function() {\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('<p>an html\\n<em>click here</em>\\nsnippet</p>');\n     });\n\n     it('should inline raw snippet if bound to a trusted value', function() {\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).\n         toBe(\"<p style=\\\"color:blue\\\">an html\\n\" +\n              \"<em onmouseover=\\\"this.textContent='PWN3D!'\\\">click here</em>\\n\" +\n              \"snippet</p>\");\n     });\n\n     it('should escape snippet without any filter', function() {\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).\n         toBe(\"&lt;p style=\\\"color:blue\\\"&gt;an html\\n\" +\n              \"&lt;em onmouseover=\\\"this.textContent='PWN3D!'\\\"&gt;click here&lt;/em&gt;\\n\" +\n              \"snippet&lt;/p&gt;\");\n     });\n\n     it('should update', function() {\n       element(by.model('snippet')).clear();\n       element(by.model('snippet')).sendKeys('new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('new <b>text</b>');\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).toBe(\n         'new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).toBe(\n         \"new &lt;b onclick=\\\"alert(1)\\\"&gt;text&lt;/b&gt;\");\n     });\n   </file>\n   </example>\n */\n\n\n/**\n * @ngdoc provider\n * @name $sanitizeProvider\n * @this\n *\n * @description\n * Creates and configures {@link $sanitize} instance.\n */\nfunction $SanitizeProvider() {\n  var hasBeenInstantiated = false;\n  var svgEnabled = false;\n\n  this.$get = ['$$sanitizeUri', function($$sanitizeUri) {\n    hasBeenInstantiated = true;\n    if (svgEnabled) {\n      extend(validElements, svgElements);\n    }\n    return function(html) {\n      var buf = [];\n      htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {\n        return !/^unsafe:/.test($$sanitizeUri(uri, isImage));\n      }));\n      return buf.join('');\n    };\n  }];\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#enableSvg\n   * @kind function\n   *\n   * @description\n   * Enables a subset of svg to be supported by the sanitizer.\n   *\n   * <div class=\"alert alert-warning\">\n   *   <p>By enabling this setting without taking other precautions, you might expose your\n   *   application to click-hijacking attacks. In these attacks, sanitized svg elements could be positioned\n   *   outside of the containing element and be rendered over other elements on the page (e.g. a login\n   *   link). Such behavior can then result in phishing incidents.</p>\n   *\n   *   <p>To protect against these, explicitly setup `overflow: hidden` css rule for all potential svg\n   *   tags within the sanitized content:</p>\n   *\n   *   <br>\n   *\n   *   <pre><code>\n   *   .rootOfTheIncludedContent svg {\n   *     overflow: hidden !important;\n   *   }\n   *   </code></pre>\n   * </div>\n   *\n   * @param {boolean=} flag Enable or disable SVG support in the sanitizer.\n   * @returns {boolean|$sanitizeProvider} Returns the currently configured value if called\n   *    without an argument or self for chaining otherwise.\n   */\n  this.enableSvg = function(enableSvg) {\n    if (isDefined(enableSvg)) {\n      svgEnabled = enableSvg;\n      return this;\n    } else {\n      return svgEnabled;\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#addValidElements\n   * @kind function\n   *\n   * @description\n   * Extends the built-in lists of valid HTML/SVG elements, i.e. elements that are considered safe\n   * and are not stripped off during sanitization. You can extend the following lists of elements:\n   *\n   * - `htmlElements`: A list of elements (tag names) to extend the current list of safe HTML\n   *   elements. HTML elements considered safe will not be removed during sanitization. All other\n   *   elements will be stripped off.\n   *\n   * - `htmlVoidElements`: This is similar to `htmlElements`, but marks the elements as\n   *   \"void elements\" (similar to HTML\n   *   [void elements](https://rawgit.com/w3c/html/html5.1-2/single-page.html#void-elements)). These\n   *   elements have no end tag and cannot have content.\n   *\n   * - `svgElements`: This is similar to `htmlElements`, but for SVG elements. This list is only\n   *   taken into account if SVG is {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for\n   *   `$sanitize`.\n   *\n   * <div class=\"alert alert-info\">\n   *   This method must be called during the {@link angular.Module#config config} phase. Once the\n   *   `$sanitize` service has been instantiated, this method has no effect.\n   * </div>\n   *\n   * <div class=\"alert alert-warning\">\n   *   Keep in mind that extending the built-in lists of elements may expose your app to XSS or\n   *   other vulnerabilities. Be very mindful of the elements you add.\n   * </div>\n   *\n   * @param {Array<String>|Object} elements - A list of valid HTML elements or an object with one or\n   *   more of the following properties:\n   *   - **htmlElements** - `{Array<String>}` - A list of elements to extend the current list of\n   *     HTML elements.\n   *   - **htmlVoidElements** - `{Array<String>}` - A list of elements to extend the current list of\n   *     void HTML elements; i.e. elements that do not have an end tag.\n   *   - **svgElements** - `{Array<String>}` - A list of elements to extend the current list of SVG\n   *     elements. The list of SVG elements is only taken into account if SVG is\n   *     {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for `$sanitize`.\n   *\n   * Passing an array (`[...]`) is equivalent to passing `{htmlElements: [...]}`.\n   *\n   * @return {$sanitizeProvider} Returns self for chaining.\n   */\n  this.addValidElements = function(elements) {\n    if (!hasBeenInstantiated) {\n      if (isArray(elements)) {\n        elements = {htmlElements: elements};\n      }\n\n      addElementsTo(svgElements, elements.svgElements);\n      addElementsTo(voidElements, elements.htmlVoidElements);\n      addElementsTo(validElements, elements.htmlVoidElements);\n      addElementsTo(validElements, elements.htmlElements);\n    }\n\n    return this;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#addValidAttrs\n   * @kind function\n   *\n   * @description\n   * Extends the built-in list of valid attributes, i.e. attributes that are considered safe and are\n   * not stripped off during sanitization.\n   *\n   * **Note**:\n   * The new attributes will not be treated as URI attributes, which means their values will not be\n   * sanitized as URIs using `$compileProvider`'s\n   * {@link ng.$compileProvider#aHrefSanitizationWhitelist aHrefSanitizationWhitelist} and\n   * {@link ng.$compileProvider#imgSrcSanitizationWhitelist imgSrcSanitizationWhitelist}.\n   *\n   * <div class=\"alert alert-info\">\n   *   This method must be called during the {@link angular.Module#config config} phase. Once the\n   *   `$sanitize` service has been instantiated, this method has no effect.\n   * </div>\n   *\n   * <div class=\"alert alert-warning\">\n   *   Keep in mind that extending the built-in list of attributes may expose your app to XSS or\n   *   other vulnerabilities. Be very mindful of the attributes you add.\n   * </div>\n   *\n   * @param {Array<String>} attrs - A list of valid attributes.\n   *\n   * @returns {$sanitizeProvider} Returns self for chaining.\n   */\n  this.addValidAttrs = function(attrs) {\n    if (!hasBeenInstantiated) {\n      extend(validAttrs, arrayToMap(attrs, true));\n    }\n    return this;\n  };\n\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n  // Private stuff\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n\n  bind = angular.bind;\n  extend = angular.extend;\n  forEach = angular.forEach;\n  isArray = angular.isArray;\n  isDefined = angular.isDefined;\n  lowercase = angular.$$lowercase;\n  noop = angular.noop;\n\n  htmlParser = htmlParserImpl;\n  htmlSanitizeWriter = htmlSanitizeWriterImpl;\n\n  nodeContains = window.Node.prototype.contains || /** @this */ function(arg) {\n    // eslint-disable-next-line no-bitwise\n    return !!(this.compareDocumentPosition(arg) & 16);\n  };\n\n  // Regular Expressions for parsing tags and attributes\n  var SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\n    // Match everything outside of normal chars and \" (quote character)\n    NON_ALPHANUMERIC_REGEXP = /([^#-~ |!])/g;\n\n\n  // Good source of info about elements and attributes\n  // http://dev.w3.org/html5/spec/Overview.html#semantics\n  // http://simon.html5.org/html-elements\n\n  // Safe Void Elements - HTML5\n  // http://dev.w3.org/html5/spec/Overview.html#void-elements\n  var voidElements = stringToMap('area,br,col,hr,img,wbr');\n\n  // Elements that you can, intentionally, leave open (and which close themselves)\n  // http://dev.w3.org/html5/spec/Overview.html#optional-tags\n  var optionalEndTagBlockElements = stringToMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'),\n      optionalEndTagInlineElements = stringToMap('rp,rt'),\n      optionalEndTagElements = extend({},\n                                              optionalEndTagInlineElements,\n                                              optionalEndTagBlockElements);\n\n  // Safe Block Elements - HTML5\n  var blockElements = extend({}, optionalEndTagBlockElements, stringToMap('address,article,' +\n          'aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +\n          'h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul'));\n\n  // Inline Elements - HTML5\n  var inlineElements = extend({}, optionalEndTagInlineElements, stringToMap('a,abbr,acronym,b,' +\n          'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,' +\n          'samp,small,span,strike,strong,sub,sup,time,tt,u,var'));\n\n  // SVG Elements\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements\n  // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted.\n  // They can potentially allow for arbitrary javascript to be executed. See #11290\n  var svgElements = stringToMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' +\n          'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' +\n          'radialGradient,rect,stop,svg,switch,text,title,tspan');\n\n  // Blocked Elements (will be stripped)\n  var blockedElements = stringToMap('script,style');\n\n  var validElements = extend({},\n                                     voidElements,\n                                     blockElements,\n                                     inlineElements,\n                                     optionalEndTagElements);\n\n  //Attributes that have href and hence need to be sanitized\n  var uriAttrs = stringToMap('background,cite,href,longdesc,src,xlink:href,xml:base');\n\n  var htmlAttrs = stringToMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +\n      'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +\n      'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +\n      'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' +\n      'valign,value,vspace,width');\n\n  // SVG attributes (without \"id\" and \"name\" attributes)\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes\n  var svgAttrs = stringToMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +\n      'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' +\n      'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' +\n      'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' +\n      'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' +\n      'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' +\n      'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' +\n      'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' +\n      'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' +\n      'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' +\n      'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' +\n      'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' +\n      'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' +\n      'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' +\n      'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true);\n\n  var validAttrs = extend({},\n                                  uriAttrs,\n                                  svgAttrs,\n                                  htmlAttrs);\n\n  function stringToMap(str, lowercaseKeys) {\n    return arrayToMap(str.split(','), lowercaseKeys);\n  }\n\n  function arrayToMap(items, lowercaseKeys) {\n    var obj = {}, i;\n    for (i = 0; i < items.length; i++) {\n      obj[lowercaseKeys ? lowercase(items[i]) : items[i]] = true;\n    }\n    return obj;\n  }\n\n  function addElementsTo(elementsMap, newElements) {\n    if (newElements && newElements.length) {\n      extend(elementsMap, arrayToMap(newElements));\n    }\n  }\n\n  /**\n   * Create an inert document that contains the dirty HTML that needs sanitizing\n   * Depending upon browser support we use one of three strategies for doing this.\n   * Support: Safari 10.x -> XHR strategy\n   * Support: Firefox -> DomParser strategy\n   */\n  var getInertBodyElement /* function(html: string): HTMLBodyElement */ = (function(window, document) {\n    var inertDocument;\n    if (document && document.implementation) {\n      inertDocument = document.implementation.createHTMLDocument('inert');\n    } else {\n      throw $sanitizeMinErr('noinert', 'Can\\'t create an inert html document');\n    }\n    var inertBodyElement = (inertDocument.documentElement || inertDocument.getDocumentElement()).querySelector('body');\n\n    // Check for the Safari 10.1 bug - which allows JS to run inside the SVG G element\n    inertBodyElement.innerHTML = '<svg><g onload=\"this.parentNode.remove()\"></g></svg>';\n    if (!inertBodyElement.querySelector('svg')) {\n      return getInertBodyElement_XHR;\n    } else {\n      // Check for the Firefox bug - which prevents the inner img JS from being sanitized\n      inertBodyElement.innerHTML = '<svg><p><style><img src=\"</style><img src=x onerror=alert(1)//\">';\n      if (inertBodyElement.querySelector('svg img')) {\n        return getInertBodyElement_DOMParser;\n      } else {\n        return getInertBodyElement_InertDocument;\n      }\n    }\n\n    function getInertBodyElement_XHR(html) {\n      // We add this dummy element to ensure that the rest of the content is parsed as expected\n      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.\n      html = '<remove></remove>' + html;\n      try {\n        html = encodeURI(html);\n      } catch (e) {\n        return undefined;\n      }\n      var xhr = new window.XMLHttpRequest();\n      xhr.responseType = 'document';\n      xhr.open('GET', 'data:text/html;charset=utf-8,' + html, false);\n      xhr.send(null);\n      var body = xhr.response.body;\n      body.firstChild.remove();\n      return body;\n    }\n\n    function getInertBodyElement_DOMParser(html) {\n      // We add this dummy element to ensure that the rest of the content is parsed as expected\n      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.\n      html = '<remove></remove>' + html;\n      try {\n        var body = new window.DOMParser().parseFromString(html, 'text/html').body;\n        body.firstChild.remove();\n        return body;\n      } catch (e) {\n        return undefined;\n      }\n    }\n\n    function getInertBodyElement_InertDocument(html) {\n      inertBodyElement.innerHTML = html;\n\n      // Support: IE 9-11 only\n      // strip custom-namespaced attributes on IE<=11\n      if (document.documentMode) {\n        stripCustomNsAttrs(inertBodyElement);\n      }\n\n      return inertBodyElement;\n    }\n  })(window, window.document);\n\n  /**\n   * @example\n   * htmlParser(htmlString, {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * });\n   *\n   * @param {string} html string\n   * @param {object} handler\n   */\n  function htmlParserImpl(html, handler) {\n    if (html === null || html === undefined) {\n      html = '';\n    } else if (typeof html !== 'string') {\n      html = '' + html;\n    }\n\n    var inertBodyElement = getInertBodyElement(html);\n    if (!inertBodyElement) return '';\n\n    //mXSS protection\n    var mXSSAttempts = 5;\n    do {\n      if (mXSSAttempts === 0) {\n        throw $sanitizeMinErr('uinput', 'Failed to sanitize html because the input is unstable');\n      }\n      mXSSAttempts--;\n\n      // trigger mXSS if it is going to happen by reading and writing the innerHTML\n      html = inertBodyElement.innerHTML;\n      inertBodyElement = getInertBodyElement(html);\n    } while (html !== inertBodyElement.innerHTML);\n\n    var node = inertBodyElement.firstChild;\n    while (node) {\n      switch (node.nodeType) {\n        case 1: // ELEMENT_NODE\n          handler.start(node.nodeName.toLowerCase(), attrToMap(node.attributes));\n          break;\n        case 3: // TEXT NODE\n          handler.chars(node.textContent);\n          break;\n      }\n\n      var nextNode;\n      if (!(nextNode = node.firstChild)) {\n        if (node.nodeType === 1) {\n          handler.end(node.nodeName.toLowerCase());\n        }\n        nextNode = getNonDescendant('nextSibling', node);\n        if (!nextNode) {\n          while (nextNode == null) {\n            node = getNonDescendant('parentNode', node);\n            if (node === inertBodyElement) break;\n            nextNode = getNonDescendant('nextSibling', node);\n            if (node.nodeType === 1) {\n              handler.end(node.nodeName.toLowerCase());\n            }\n          }\n        }\n      }\n      node = nextNode;\n    }\n\n    while ((node = inertBodyElement.firstChild)) {\n      inertBodyElement.removeChild(node);\n    }\n  }\n\n  function attrToMap(attrs) {\n    var map = {};\n    for (var i = 0, ii = attrs.length; i < ii; i++) {\n      var attr = attrs[i];\n      map[attr.name] = attr.value;\n    }\n    return map;\n  }\n\n\n  /**\n   * Escapes all potentially dangerous characters, so that the\n   * resulting string can be safely inserted into attribute or\n   * element text.\n   * @param value\n   * @returns {string} escaped text\n   */\n  function encodeEntities(value) {\n    return value.\n      replace(/&/g, '&amp;').\n      replace(SURROGATE_PAIR_REGEXP, function(value) {\n        var hi = value.charCodeAt(0);\n        var low = value.charCodeAt(1);\n        return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n      }).\n      replace(NON_ALPHANUMERIC_REGEXP, function(value) {\n        return '&#' + value.charCodeAt(0) + ';';\n      }).\n      replace(/</g, '&lt;').\n      replace(/>/g, '&gt;');\n  }\n\n  /**\n   * create an HTML/XML writer which writes to buffer\n   * @param {Array} buf use buf.join('') to get out sanitized html string\n   * @returns {object} in the form of {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * }\n   */\n  function htmlSanitizeWriterImpl(buf, uriValidator) {\n    var ignoreCurrentElement = false;\n    var out = bind(buf, buf.push);\n    return {\n      start: function(tag, attrs) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && blockedElements[tag]) {\n          ignoreCurrentElement = tag;\n        }\n        if (!ignoreCurrentElement && validElements[tag] === true) {\n          out('<');\n          out(tag);\n          forEach(attrs, function(value, key) {\n            var lkey = lowercase(key);\n            var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');\n            if (validAttrs[lkey] === true &&\n              (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {\n              out(' ');\n              out(key);\n              out('=\"');\n              out(encodeEntities(value));\n              out('\"');\n            }\n          });\n          out('>');\n        }\n      },\n      end: function(tag) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && validElements[tag] === true && voidElements[tag] !== true) {\n          out('</');\n          out(tag);\n          out('>');\n        }\n        // eslint-disable-next-line eqeqeq\n        if (tag == ignoreCurrentElement) {\n          ignoreCurrentElement = false;\n        }\n      },\n      chars: function(chars) {\n        if (!ignoreCurrentElement) {\n          out(encodeEntities(chars));\n        }\n      }\n    };\n  }\n\n\n  /**\n   * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1' attribute to declare\n   * ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo'). This is undesirable since we don't want\n   * to allow any of these custom attributes. This method strips them all.\n   *\n   * @param node Root element to process\n   */\n  function stripCustomNsAttrs(node) {\n    while (node) {\n      if (node.nodeType === window.Node.ELEMENT_NODE) {\n        var attrs = node.attributes;\n        for (var i = 0, l = attrs.length; i < l; i++) {\n          var attrNode = attrs[i];\n          var attrName = attrNode.name.toLowerCase();\n          if (attrName === 'xmlns:ns1' || attrName.lastIndexOf('ns1:', 0) === 0) {\n            node.removeAttributeNode(attrNode);\n            i--;\n            l--;\n          }\n        }\n      }\n\n      var nextNode = node.firstChild;\n      if (nextNode) {\n        stripCustomNsAttrs(nextNode);\n      }\n\n      node = getNonDescendant('nextSibling', node);\n    }\n  }\n\n  function getNonDescendant(propName, node) {\n    // An element is clobbered if its `propName` property points to one of its descendants\n    var nextNode = node[propName];\n    if (nextNode && nodeContains.call(node, nextNode)) {\n      throw $sanitizeMinErr('elclob', 'Failed to sanitize html because the element is clobbered: {0}', node.outerHTML || node.outerText);\n    }\n    return nextNode;\n  }\n}\n\nfunction sanitizeText(chars) {\n  var buf = [];\n  var writer = htmlSanitizeWriter(buf, noop);\n  writer.chars(chars);\n  return buf.join('');\n}\n\n\n// define ngSanitize module and register $sanitize service\nangular.module('ngSanitize', [])\n  .provider('$sanitize', $SanitizeProvider)\n  .info({ angularVersion: '1.7.8' });\n\n/**\n * @ngdoc filter\n * @name linky\n * @kind function\n *\n * @description\n * Finds links in text input and turns them into html links. Supports `http/https/ftp/sftp/mailto` and\n * plain email address links.\n *\n * Requires the {@link ngSanitize `ngSanitize`} module to be installed.\n *\n * @param {string} text Input text.\n * @param {string} [target] Window (`_blank|_self|_parent|_top`) or named frame to open links in.\n * @param {object|function(url)} [attributes] Add custom attributes to the link element.\n *\n *    Can be one of:\n *\n *    - `object`: A map of attributes\n *    - `function`: Takes the url as a parameter and returns a map of attributes\n *\n *    If the map of attributes contains a value for `target`, it overrides the value of\n *    the target parameter.\n *\n *\n * @returns {string} Html-linkified and {@link $sanitize sanitized} text.\n *\n * @usage\n   <span ng-bind-html=\"linky_expression | linky\"></span>\n *\n * @example\n   <example module=\"linkyExample\" deps=\"angular-sanitize.js\" name=\"linky-filter\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n       Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <th>Filter</th>\n           <th>Source</th>\n           <th>Rendered</th>\n         </tr>\n         <tr id=\"linky-filter\">\n           <td>linky filter</td>\n           <td>\n             <pre>&lt;div ng-bind-html=\"snippet | linky\"&gt;<br>&lt;/div&gt;</pre>\n           </td>\n           <td>\n             <div ng-bind-html=\"snippet | linky\"></div>\n           </td>\n         </tr>\n         <tr id=\"linky-target\">\n          <td>linky target</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"></div>\n          </td>\n         </tr>\n         <tr id=\"linky-custom-attributes\">\n          <td>linky custom attributes</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"></div>\n          </td>\n         </tr>\n         <tr id=\"escaped-html\">\n           <td>no filter</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"script.js\">\n       angular.module('linkyExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.snippet =\n             'Pretty text with some links:\\n' +\n             'http://angularjs.org/,\\n' +\n             'mailto:us@somewhere.org,\\n' +\n             'another@somewhere.org,\\n' +\n             'and one more: ftp://127.0.0.1/.';\n           $scope.snippetWithSingleURL = 'http://angularjs.org/';\n         }]);\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should linkify the snippet with urls', function() {\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);\n       });\n\n       it('should not linkify snippet without the linky filter', function() {\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);\n       });\n\n       it('should update', function() {\n         element(by.model('snippet')).clear();\n         element(by.model('snippet')).sendKeys('new http://link.');\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('new http://link.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())\n             .toBe('new http://link.');\n       });\n\n       it('should work with the target property', function() {\n        expect(element(by.id('linky-target')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_blank'\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');\n       });\n\n       it('should optionally add custom attributes', function() {\n        expect(element(by.id('linky-custom-attributes')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-custom-attributes a')).getAttribute('rel')).toEqual('nofollow');\n       });\n     </file>\n   </example>\n */\nangular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {\n  var LINKY_URL_REGEXP =\n        /((s?ftp|https?):\\/\\/|(www\\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s.;,(){}<>\"\\u201d\\u2019]/i,\n      MAILTO_REGEXP = /^mailto:/i;\n\n  var linkyMinErr = angular.$$minErr('linky');\n  var isDefined = angular.isDefined;\n  var isFunction = angular.isFunction;\n  var isObject = angular.isObject;\n  var isString = angular.isString;\n\n  return function(text, target, attributes) {\n    if (text == null || text === '') return text;\n    if (!isString(text)) throw linkyMinErr('notstring', 'Expected string but received: {0}', text);\n\n    var attributesFn =\n      isFunction(attributes) ? attributes :\n      isObject(attributes) ? function getAttributesObject() {return attributes;} :\n      function getEmptyAttributesObject() {return {};};\n\n    var match;\n    var raw = text;\n    var html = [];\n    var url;\n    var i;\n    while ((match = raw.match(LINKY_URL_REGEXP))) {\n      // We can not end in these as they are sometimes found at the end of the sentence\n      url = match[0];\n      // if we did not match ftp/http/www/mailto then assume mailto\n      if (!match[2] && !match[4]) {\n        url = (match[3] ? 'http://' : 'mailto:') + url;\n      }\n      i = match.index;\n      addText(raw.substr(0, i));\n      addLink(url, match[0].replace(MAILTO_REGEXP, ''));\n      raw = raw.substring(i + match[0].length);\n    }\n    addText(raw);\n    return $sanitize(html.join(''));\n\n    function addText(text) {\n      if (!text) {\n        return;\n      }\n      html.push(sanitizeText(text));\n    }\n\n    function addLink(url, text) {\n      var key, linkAttributes = attributesFn(url);\n      html.push('<a ');\n\n      for (key in linkAttributes) {\n        html.push(key + '=\"' + linkAttributes[key] + '\" ');\n      }\n\n      if (isDefined(target) && !('target' in linkAttributes)) {\n        html.push('target=\"',\n                  target,\n                  '\" ');\n      }\n      html.push('href=\"',\n                url.replace(/\"/g, '&quot;'),\n                '\">');\n      addText(text);\n      html.push('</a>');\n    }\n  };\n}]);\n\ndescribe('ngBindHtml', function() {\n  beforeEach(module('ngSanitize'));\n\n  it('should set html', inject(function($rootScope, $compile) {\n    var element = $compile('<div ng-bind-html=\"html\"></div>')($rootScope);\n    $rootScope.html = '<div unknown>hello</div>';\n    $rootScope.$digest();\n    expect(lowercase(element.html())).toEqual('<div>hello</div>');\n  }));\n\n\n  it('should reset html when value is null or undefined', inject(function($compile, $rootScope) {\n    var element = $compile('<div ng-bind-html=\"html\"></div>')($rootScope);\n\n    angular.forEach([null, undefined, ''], function(val) {\n      $rootScope.html = 'some val';\n      $rootScope.$digest();\n      expect(lowercase(element.html())).toEqual('some val');\n\n      $rootScope.html = val;\n      $rootScope.$digest();\n      expect(lowercase(element.html())).toEqual('');\n    });\n  }));\n});\n\ndescribe('linky', function() {\n  var linky;\n\n  beforeEach(module('ngSanitize'));\n\n  beforeEach(inject(function($filter) {\n    linky = $filter('linky');\n  }));\n\n  it('should do basic filter', function() {\n    expect(linky('http://ab/ (http://a/) <http://a/> http://1.2/v:~-123. c “http://example.com” ‘http://me.com’')).\n      toEqual('<a href=\"http://ab/\">http://ab/</a> ' +\n              '(<a href=\"http://a/\">http://a/</a>) ' +\n              '&lt;<a href=\"http://a/\">http://a/</a>&gt; ' +\n              '<a href=\"http://1.2/v:~-123\">http://1.2/v:~-123</a>. c ' +\n              '&#8220;<a href=\"http://example.com\">http://example.com</a>&#8221; ' +\n              '&#8216;<a href=\"http://me.com\">http://me.com</a>&#8217;');\n    expect(linky(undefined)).not.toBeDefined();\n  });\n\n  it('should return `undefined`/`null`/`\"\"` values unchanged', function() {\n    expect(linky(undefined)).toBeUndefined();\n    expect(linky(null)).toBe(null);\n    expect(linky('')).toBe('');\n  });\n\n  it('should throw an error when used with a non-string value (other than `undefined`/`null`)',\n    function() {\n      expect(function() { linky(false); }).\n        toThrowMinErr('linky', 'notstring', 'Expected string but received: false');\n\n      expect(function() { linky(true); }).\n        toThrowMinErr('linky', 'notstring', 'Expected string but received: true');\n\n      expect(function() { linky(0); }).\n        toThrowMinErr('linky', 'notstring', 'Expected string but received: 0');\n\n      expect(function() { linky(42); }).\n        toThrowMinErr('linky', 'notstring', 'Expected string but received: 42');\n\n      expect(function() { linky({}); }).\n        toThrowMinErr('linky', 'notstring', 'Expected string but received: {}');\n\n      expect(function() { linky([]); }).\n        toThrowMinErr('linky', 'notstring', 'Expected string but received: []');\n\n      expect(function() { linky(noop); }).\n        toThrowMinErr('linky', 'notstring', 'Expected string but received: function noop()');\n    }\n  );\n\n  it('should be case-insensitive', function() {\n    expect(linky('WWW.example.com')).toEqual('<a href=\"http://WWW.example.com\">WWW.example.com</a>');\n    expect(linky('WWW.EXAMPLE.COM')).toEqual('<a href=\"http://WWW.EXAMPLE.COM\">WWW.EXAMPLE.COM</a>');\n    expect(linky('HTTP://www.example.com')).toEqual('<a href=\"HTTP://www.example.com\">HTTP://www.example.com</a>');\n    expect(linky('HTTP://example.com')).toEqual('<a href=\"HTTP://example.com\">HTTP://example.com</a>');\n    expect(linky('HTTPS://www.example.com')).toEqual('<a href=\"HTTPS://www.example.com\">HTTPS://www.example.com</a>');\n    expect(linky('HTTPS://example.com')).toEqual('<a href=\"HTTPS://example.com\">HTTPS://example.com</a>');\n    expect(linky('FTP://www.example.com')).toEqual('<a href=\"FTP://www.example.com\">FTP://www.example.com</a>');\n    expect(linky('FTP://example.com')).toEqual('<a href=\"FTP://example.com\">FTP://example.com</a>');\n    expect(linky('SFTP://www.example.com')).toEqual('<a href=\"SFTP://www.example.com\">SFTP://www.example.com</a>');\n    expect(linky('SFTP://example.com')).toEqual('<a href=\"SFTP://example.com\">SFTP://example.com</a>');\n  });\n\n  it('should handle www.', function() {\n    expect(linky('www.example.com')).toEqual('<a href=\"http://www.example.com\">www.example.com</a>');\n  });\n\n  it('should handle mailto:', function() {\n    expect(linky('mailto:me@example.com')).\n                    toEqual('<a href=\"mailto:me@example.com\">me@example.com</a>');\n    expect(linky('me@example.com')).\n                    toEqual('<a href=\"mailto:me@example.com\">me@example.com</a>');\n    expect(linky('send email to me@example.com, but')).\n      toEqual('send email to <a href=\"mailto:me@example.com\">me@example.com</a>, but');\n    expect(linky('my email is \"me@example.com\"')).\n      toEqual('my email is &#34;<a href=\"mailto:me@example.com\">me@example.com</a>&#34;');\n  });\n\n  it('should handle quotes in the email', function() {\n    expect(linky('foo@\"bar\".com')).toEqual('<a href=\"mailto:foo@&#34;bar&#34;.com\">foo@&#34;bar&#34;.com</a>');\n  });\n\n  it('should handle target:', function() {\n    expect(linky('http://example.com', '_blank')).\n      toBeOneOf('<a target=\"_blank\" href=\"http://example.com\">http://example.com</a>',\n                '<a href=\"http://example.com\" target=\"_blank\">http://example.com</a>');\n    expect(linky('http://example.com', 'someNamedIFrame')).\n      toBeOneOf('<a target=\"someNamedIFrame\" href=\"http://example.com\">http://example.com</a>',\n                '<a href=\"http://example.com\" target=\"someNamedIFrame\">http://example.com</a>');\n  });\n\n  describe('custom attributes', function() {\n\n    it('should optionally add custom attributes', function() {\n      expect(linky('http://example.com', '_self', {rel: 'nofollow'})).\n        toBeOneOf('<a rel=\"nofollow\" target=\"_self\" href=\"http://example.com\">http://example.com</a>',\n                  '<a href=\"http://example.com\" target=\"_self\" rel=\"nofollow\">http://example.com</a>');\n    });\n\n\n    it('should override target parameter with custom attributes', function() {\n      expect(linky('http://example.com', '_self', {target: '_blank'})).\n        toBeOneOf('<a target=\"_blank\" href=\"http://example.com\">http://example.com</a>',\n                  '<a href=\"http://example.com\" target=\"_blank\">http://example.com</a>');\n    });\n\n\n    it('should optionally add custom attributes from function', function() {\n      expect(linky('http://example.com', '_self', function(url) {return {'class': 'blue'};})).\n        toBeOneOf('<a class=\"blue\" target=\"_self\" href=\"http://example.com\">http://example.com</a>',\n                  '<a href=\"http://example.com\" target=\"_self\" class=\"blue\">http://example.com</a>',\n                  '<a class=\"blue\" href=\"http://example.com\" target=\"_self\">http://example.com</a>');\n    });\n\n\n    it('should pass url as parameter to custom attribute function', function() {\n      var linkParameters = jasmine.createSpy('linkParameters').and.returnValue({'class': 'blue'});\n      linky('http://example.com', '_self', linkParameters);\n      expect(linkParameters).toHaveBeenCalledWith('http://example.com');\n    });\n\n\n    it('should call the attribute function for all links in the input', function() {\n      var attributeFn = jasmine.createSpy('attributeFn').and.returnValue({});\n      linky('http://example.com and http://google.com', '_self', attributeFn);\n      expect(attributeFn.calls.allArgs()).toEqual([['http://example.com'], ['http://google.com']]);\n    });\n\n\n    it('should strip unsafe attributes', function() {\n      expect(linky('http://example.com', '_self', {'class': 'blue', 'onclick': 'alert(\\'Hi\\')'})).\n        toBeOneOf('<a class=\"blue\" target=\"_self\" href=\"http://example.com\">http://example.com</a>',\n                  '<a href=\"http://example.com\" target=\"_self\" class=\"blue\">http://example.com</a>',\n                  '<a class=\"blue\" href=\"http://example.com\" target=\"_self\">http://example.com</a>');\n    });\n  });\n});\n\ndescribe('HTML', function() {\n  var ua = window.navigator.userAgent;\n  var isChrome = /Chrome/.test(ua) && !/Edge/.test(ua);\n\n  var expectHTML;\n\n  beforeEach(module('ngSanitize'));\n  beforeEach(function() {\n    expectHTML = function(html) {\n      var sanitize;\n      inject(function($sanitize) {\n        sanitize = $sanitize;\n      });\n      return expect(sanitize(html));\n    };\n  });\n\n  describe('htmlParser', function() {\n    /* global htmlParser */\n\n    var handler, start, text, comment;\n    beforeEach(function() {\n      text = '';\n      start = null;\n      handler = {\n        start: function(tag, attrs) {\n          start = {\n            tag: tag,\n            attrs: attrs\n          };\n          // Since different browsers handle newlines differently we trim\n          // so that it is easier to write tests.\n          for (var i = 0, ii = attrs.length; i < ii; i++) {\n            var keyValue = attrs[i];\n            var key = keyValue.key;\n            var value = keyValue.value;\n            attrs[key] = value.replace(/^\\s*/, '').replace(/\\s*$/, '');\n          }\n        },\n        chars: function(text_) {\n          text += text_;\n        },\n        end:function(tag) {\n          expect(tag).toEqual(start.tag);\n        },\n        comment:function(comment_) {\n          comment = comment_;\n        }\n      };\n      // Trigger the $sanitizer provider to execute, which initializes the `htmlParser` function.\n      inject(function($sanitize) {});\n    });\n\n    it('should not parse comments', function() {\n      htmlParser('<!--FOOBAR-->', handler);\n      expect(comment).not.toBeDefined();\n    });\n\n    it('should parse basic format', function() {\n      htmlParser('<tag attr=\"value\">text</tag>', handler);\n      expect(start).toEqual({tag:'tag', attrs:{attr:'value'}});\n      expect(text).toEqual('text');\n    });\n\n    it('should not treat \"<\" followed by a non-/ or non-letter as a tag', function() {\n      expectHTML('<- text1 text2 <1 text1 text2 <{', handler).\n        toBe('&lt;- text1 text2 &lt;1 text1 text2 &lt;{');\n    });\n\n    it('should accept tag delimiters such as \"<\" inside real tags', function() {\n      // Assert that the < is part of the text node content, and not part of a tag name.\n      htmlParser('<p> 10 < 100 </p>', handler);\n      expect(text).toEqual(' 10 < 100 ');\n    });\n\n    it('should parse newlines in tags', function() {\n      htmlParser('<tag\\n attr=\"value\"\\n>text</\\ntag\\n>', handler);\n      expect(start).toEqual({tag:'tag', attrs:{attr:'value'}});\n      expect(text).toEqual('text');\n    });\n\n    it('should parse newlines in attributes', function() {\n      htmlParser('<tag attr=\"\\nvalue\\n\">text</tag>', handler);\n      expect(start).toEqual({tag:'tag', attrs:{attr:'\\nvalue\\n'}});\n      expect(text).toEqual('text');\n    });\n\n    it('should parse namespace', function() {\n      htmlParser('<ns:t-a-g ns:a-t-t-r=\"\\nvalue\\n\">text</ns:t-a-g>', handler);\n      expect(start).toEqual({tag:'ns:t-a-g', attrs:{'ns:a-t-t-r':'\\nvalue\\n'}});\n      expect(text).toEqual('text');\n    });\n\n    it('should parse empty value attribute of node', function() {\n      htmlParser('<test-foo selected value=\"\">abc</test-foo>', handler);\n      expect(start).toEqual({tag:'test-foo', attrs:{selected:'', value:''}});\n      expect(text).toEqual('abc');\n    });\n  });\n\n  // THESE TESTS ARE EXECUTED WITH COMPILED ANGULAR\n  it('should echo html', function() {\n    expectHTML('hello<b class=\"1\\'23\" align=\\'\"\"\\'>world</b>.').\n       toBeOneOf('hello<b class=\"1\\'23\" align=\"&#34;&#34;\">world</b>.',\n                 'hello<b align=\"&#34;&#34;\" class=\"1\\'23\">world</b>.');\n  });\n\n  it('should remove script', function() {\n    expectHTML('a<SCRIPT>evil< / scrIpt >c.').toEqual('a');\n    expectHTML('a<SCRIPT>evil</scrIpt>c.').toEqual('ac.');\n  });\n\n  it('should remove script that has newline characters', function() {\n    expectHTML('a<SCRIPT\\n>\\n\\revil\\n\\r</scrIpt\\n >c.').toEqual('ac.');\n  });\n\n  it('should remove DOCTYPE header', function() {\n    expectHTML('<!DOCTYPE html>').toEqual('');\n    expectHTML('<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\\n\"http://www.w3.org/TR/html4/strict.dtd\">').toEqual('');\n    expectHTML('a<!DOCTYPE html>c.').toEqual('ac.');\n    expectHTML('a<!DocTyPe html>c.').toEqual('ac.');\n  });\n\n  it('should escape non-start tags', function() {\n    expectHTML('a< SCRIPT >A< SCRIPT >evil< / scrIpt >B< / scrIpt >c.').\n      toBe('a&lt; SCRIPT &gt;A&lt; SCRIPT &gt;evil&lt; / scrIpt &gt;B&lt; / scrIpt &gt;c.');\n  });\n\n  it('should remove attrs', function() {\n    expectHTML('a<div style=\"abc\">b</div>c').toEqual('a<div>b</div>c');\n  });\n\n  it('should handle large datasets', function() {\n    // Large is non-trivial to quantify, but handling ~100,000 should be sufficient for most purposes.\n    var largeNumber = 17; // 2^17 = 131,072\n    var result = '<div>b</div>';\n    // Ideally we would use repeat, but that isn't supported in IE.\n    for (var i = 0; i < largeNumber; i++) {\n      result += result;\n    }\n    expectHTML('a' + result + 'c').toEqual('a' + result + 'c');\n  });\n\n  it('should remove style', function() {\n    expectHTML('a<STyle>evil</stYle>c.').toEqual('ac.');\n  });\n\n  it('should remove style that has newline characters', function() {\n    expectHTML('a<STyle \\n>\\n\\revil\\n\\r</stYle\\n>c.').toEqual('ac.');\n  });\n\n  it('should remove script and style', function() {\n    expectHTML('a<STyle>evil<script></script></stYle>c.').toEqual('ac.');\n  });\n\n  it('should remove double nested script', function() {\n    expectHTML('a<SCRIPT>ev<script>evil</sCript>il</scrIpt>c.').toEqual('ailc.');\n  });\n\n  it('should remove unknown  names', function() {\n    expectHTML('a<xxx><B>b</B></xxx>c').toEqual('a<b>b</b>c');\n  });\n\n  it('should remove unsafe value', function() {\n    expectHTML('<a href=\"javascript:alert()\">').toEqual('<a></a>');\n    expectHTML('<img src=\"foo.gif\" usemap=\"#foomap\">').toEqual('<img src=\"foo.gif\">');\n  });\n\n  it('should handle self closed elements', function() {\n    expectHTML('a<hr/>c').toEqual('a<hr>c');\n  });\n\n  it('should handle namespace', function() {\n    expectHTML('a<my:hr/><my:div>b</my:div>c').toEqual('abc');\n  });\n\n  it('should handle entities', function() {\n    var everything = '<div rel=\"!@#$%^&amp;*()_+-={}[]:&#34;;\\'&lt;&gt;?,./`~ &#295;\">' +\n    '!@#$%^&amp;*()_+-={}[]:&#34;;\\'&lt;&gt;?,./`~ &#295;</div>';\n    expectHTML(everything).toEqual(everything);\n  });\n\n  it('should mangle improper html', function() {\n    // This text is encoded more than a real HTML parser would, but it should render the same.\n    expectHTML('< div rel=\"</div>\" alt=abc dir=\\'\"\\' >text< /div>').\n      toBe('&lt; div rel=&#34;&#34; alt=abc dir=\\'&#34;\\' &gt;text&lt; /div&gt;');\n  });\n\n  it('should mangle improper html2', function() {\n    // A proper HTML parser would clobber this more in most cases, but it looks reasonable.\n    expectHTML('< div rel=\"</div>\" / >').\n      toBe('&lt; div rel=&#34;&#34; / &gt;');\n  });\n\n  it('should ignore back slash as escape', function() {\n    expectHTML('<img alt=\"xxx\\\\\" title=\"><script>....\">').\n      toBeOneOf('<img alt=\"xxx\\\\\" title=\"&gt;&lt;script&gt;....\">',\n                '<img title=\"&gt;&lt;script&gt;....\" alt=\"xxx\\\\\">');\n  });\n\n  it('should ignore object attributes', function() {\n    expectHTML('<a constructor=\"hola\">:)</a>').\n      toEqual('<a>:)</a>');\n    expectHTML('<constructor constructor=\"hola\">:)</constructor>').\n      toEqual('');\n  });\n\n  it('should keep spaces as prefix/postfix', function() {\n    expectHTML(' a ').toEqual(' a ');\n  });\n\n  it('should allow multiline strings', function() {\n    expectHTML('\\na\\n').toEqual('&#10;a&#10;');\n  });\n\n  it('should accept tag delimiters such as \"<\" inside real tags (with nesting)', function() {\n    //this is an integrated version of the 'should accept tag delimiters such as \"<\" inside real tags' test\n    expectHTML('<p> 10 < <span>100</span> </p>')\n    .toEqual('<p> 10 &lt; <span>100</span> </p>');\n  });\n\n  it('should accept non-string arguments', function() {\n    expectHTML(null).toBe('');\n    expectHTML(undefined).toBe('');\n    expectHTML(42).toBe('42');\n    expectHTML({}).toBe('[object Object]');\n    expectHTML([1, 2, 3]).toBe('1,2,3');\n    expectHTML(true).toBe('true');\n    expectHTML(false).toBe('false');\n  });\n\n\n  it('should strip svg elements if not enabled via provider', function() {\n    expectHTML('<svg width=\"400px\" height=\"150px\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"50\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"3\" fill=\"red\"></svg>')\n      .toEqual('');\n  });\n\n  it('should prevent mXSS attacks', function() {\n    expectHTML('<a href=\"&#x3000;javascript:alert(1)\">CLICKME</a>').toBe('<a>CLICKME</a>');\n  });\n\n  it('should strip html comments', function() {\n    expectHTML('<!-- comment 1 --><p>text1<!-- comment 2 -->text2</p><!-- comment 3 -->')\n      .toEqual('<p>text1text2</p>');\n  });\n\n  describe('clobbered elements', function() {\n\n    it('should throw on a form with an input named \"parentNode\"', function() {\n      inject(function($sanitize) {\n\n        expect(function() {\n          $sanitize('<form><input name=\"parentNode\" /></form>');\n        }).toThrowMinErr('$sanitize', 'elclob');\n\n        expect(function() {\n          $sanitize('<form><div><div><input name=\"parentNode\" /></div></div></form>');\n        }).toThrowMinErr('$sanitize', 'elclob');\n      });\n    });\n\n    if (!/Edge\\/\\d{2,}/.test(window.navigator.userAgent)) {\n      // Skip test on Edge due to a browser bug.\n      it('should throw on a form with an input named \"nextSibling\"', function() {\n        inject(function($sanitize) {\n\n          expect(function() {\n            $sanitize('<form><input name=\"nextSibling\" /></form>');\n          }).toThrowMinErr('$sanitize', 'elclob');\n\n          expect(function() {\n            $sanitize('<form><div><div><input name=\"nextSibling\" /></div></div></form>');\n          }).toThrowMinErr('$sanitize', 'elclob');\n\n        });\n      });\n    }\n  });\n\n  // See https://github.com/cure53/DOMPurify/blob/a992d3a75031cb8bb032e5ea8399ba972bdf9a65/src/purify.js#L439-L449\n  it('should not allow JavaScript execution when creating inert document', inject(function($sanitize) {\n    $sanitize('<svg><g onload=\"window.xxx = 100\"></g></svg>');\n\n    expect(window.xxx).toBe(undefined);\n    delete window.xxx;\n  }));\n\n  // See https://github.com/cure53/DOMPurify/releases/tag/0.6.7\n  it('should not allow JavaScript hidden in badly formed HTML to get through sanitization (Firefox bug)', inject(function($sanitize) {\n    var doc = $sanitize('<svg><p><style><img src=\"</style><img src=x onerror=alert(1)//\">');\n    expect(doc).toEqual('<p><img src=\"x\"></p>');\n  }));\n\n  describe('Custom white-list support', function() {\n\n    var $sanitizeProvider;\n    beforeEach(module(function(_$sanitizeProvider_) {\n      $sanitizeProvider = _$sanitizeProvider_;\n\n      $sanitizeProvider.addValidElements(['foo']);\n      $sanitizeProvider.addValidElements({\n        htmlElements: ['foo-button', 'foo-video'],\n        htmlVoidElements: ['foo-input'],\n        svgElements: ['foo-svg']\n      });\n      $sanitizeProvider.addValidAttrs(['foo']);\n    }));\n\n    it('should allow custom white-listed element', function() {\n      expectHTML('<foo></foo>').toEqual('<foo></foo>');\n      expectHTML('<foo-button></foo-button>').toEqual('<foo-button></foo-button>');\n      expectHTML('<foo-video></foo-video>').toEqual('<foo-video></foo-video>');\n    });\n\n    it('should allow custom white-listed void element', function() {\n      expectHTML('<foo-input/>').toEqual('<foo-input>');\n    });\n\n    it('should allow custom white-listed void element to be used with closing tag', function() {\n      expectHTML('<foo-input></foo-input>').toEqual('<foo-input>');\n    });\n\n    it('should allow custom white-listed attribute', function() {\n      expectHTML('<foo-input foo=\"foo\"/>').toEqual('<foo-input foo=\"foo\">');\n    });\n\n    it('should ignore custom white-listed SVG element if SVG disabled', function() {\n      expectHTML('<foo-svg></foo-svg>').toEqual('');\n    });\n\n    it('should not allow add custom element after service has been instantiated', inject(function($sanitize) {\n      $sanitizeProvider.addValidElements(['bar']);\n      expectHTML('<bar></bar>').toEqual('');\n    }));\n  });\n\n  describe('SVG support', function() {\n\n    beforeEach(module(function($sanitizeProvider) {\n      $sanitizeProvider.enableSvg(true);\n      $sanitizeProvider.addValidElements({\n        svgElements: ['font-face-uri']\n      });\n    }));\n\n    it('should accept SVG tags', function() {\n      expectHTML('<svg width=\"400px\" height=\"150px\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"50\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"3\" fill=\"red\"></svg>')\n        .toBeOneOf('<svg width=\"400px\" height=\"150px\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"50\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"3\" fill=\"red\"></circle></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"150px\" width=\"400px\"><circle fill=\"red\" stroke-width=\"3\" stroke=\"black\" r=\"40\" cy=\"50\" cx=\"50\"></circle></svg>',\n                   '<svg width=\"400px\" height=\"150px\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"red\" stroke=\"black\" stroke-width=\"3\" cx=\"50\" cy=\"50\" r=\"40\"></circle></svg>',\n                   '<svg width=\"400px\" height=\"150px\" xmlns=\"http://www.w3.org/2000/svg\"><circle FILL=\"red\" STROKE=\"black\" STROKE-WIDTH=\"3\" cx=\"50\" cy=\"50\" r=\"40\"></circle></svg>');\n    });\n\n    it('should not ignore white-listed svg camelCased attributes', function() {\n      expectHTML('<svg preserveAspectRatio=\"true\"></svg>')\n        .toBeOneOf('<svg preserveAspectRatio=\"true\"></svg>',\n                   '<svg preserveAspectRatio=\"true\" xmlns=\"http://www.w3.org/2000/svg\"></svg>');\n\n    });\n\n    it('should allow custom white-listed SVG element', function() {\n      expectHTML('<font-face-uri></font-face-uri>').toEqual('<font-face-uri></font-face-uri>');\n    });\n\n    it('should sanitize SVG xlink:href attribute values', function() {\n      expectHTML('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a xlink:href=\"javascript:alert()\"></a></svg>')\n        .toBeOneOf('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a></a></svg>',\n                   '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\"><a></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a xmlns:xlink=\"http://www.w3.org/1999/xlink\"></a></svg>');\n\n      expectHTML('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a xlink:href=\"https://example.com\"></a></svg>')\n        .toBeOneOf('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a xlink:href=\"https://example.com\"></a></svg>',\n                   '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\"><a xlink:href=\"https://example.com\"></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a xlink:href=\"https://example.com\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"https://example.com\"></a></svg>');\n    });\n\n    it('should sanitize SVG xml:base attribute values', function() {\n      expectHTML('<svg xmlns=\"http://www.w3.org/2000/svg\"><a xml:base=\"javascript:alert(1)//\" href=\"#\"></a></svg>')\n        .toEqual('<svg xmlns=\"http://www.w3.org/2000/svg\"><a href=\"#\"></a></svg>');\n\n      expectHTML('<svg xmlns=\"http://www.w3.org/2000/svg\"><a xml:base=\"https://example.com\" href=\"#\"></a></svg>')\n        .toEqual('<svg xmlns=\"http://www.w3.org/2000/svg\"><a xml:base=\"https://example.com\" href=\"#\"></a></svg>');\n\n    });\n\n    it('should sanitize unknown namespaced SVG attributes', function() {\n      expectHTML('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a xlink:foo=\"javascript:alert()\"></a></svg>')\n        .toBeOneOf('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a></a></svg>',\n                   '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\"><a></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a></a></svg>');\n\n      expectHTML('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a xlink:bar=\"https://example.com\"></a></svg>')\n        .toBeOneOf('<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a></a></svg>',\n                   '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\"><a></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a></a></svg>');\n    });\n\n    it('should not accept SVG animation tags', function() {\n      expectHTML('<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a><text y=\"1em\">Click me</text><animate attributeName=\"xlink:href\" values=\"javascript:alert(1)\"/></a></svg>')\n        .toBeOneOf('<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a><text y=\"1em\">Click me</text></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><a><text y=\"1em\">Click me</text></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a><text y=\"1em\">Click me</text></a></svg>');\n\n      expectHTML('<svg><a xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"?\"><circle r=\"400\"></circle>' +\n        '<animate attributeName=\"xlink:href\" begin=\"0\" from=\"javascript:alert(1)\" to=\"&\" /></a></svg>')\n        .toBeOneOf('<svg><a xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"?\"><circle r=\"400\"></circle></a></svg>',\n                   '<svg><a xlink:href=\"?\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><circle r=\"400\"></circle></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a xlink:href=\"?\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><circle r=\"400\"></circle></a></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"><a xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"?\"><circle r=\"400\"></circle></a></svg>');\n    });\n\n    it('should not accept SVG `use` tags', function() {\n      expectHTML('<svg><use xlink:href=\"test.svg#xss\" /></svg>')\n        .toBeOneOf('<svg></svg>',\n                   '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"></svg>',\n                   '<svg xmlns=\"http://www.w3.org/2000/svg\"></svg>');\n    });\n  });\n\n\n  describe('htmlSanitizerWriter', function() {\n    /* global htmlSanitizeWriter: false */\n\n    var writer, html, uriValidator;\n    beforeEach(function() {\n      html = '';\n      uriValidator = jasmine.createSpy('uriValidator');\n      writer = htmlSanitizeWriter({push:function(text) {html += text;}}, uriValidator);\n    });\n\n    it('should write basic HTML', function() {\n      writer.chars('before');\n      writer.start('div', {rel:'123'}, false);\n      writer.chars('in');\n      writer.end('div');\n      writer.chars('after');\n\n      expect(html).toEqual('before<div rel=\"123\">in</div>after');\n    });\n\n    it('should escape text nodes', function() {\n      writer.chars('a<div>&</div>c');\n      expect(html).toEqual('a&lt;div&gt;&amp;&lt;/div&gt;c');\n    });\n\n    it('should escape IE script', function() {\n      writer.chars('&<>{}');\n      expect(html).toEqual('&amp;&lt;&gt;{}');\n    });\n\n    it('should escape attributes', function() {\n      writer.start('div', {rel:'!@#$%^&*()_+-={}[]:\";\\'<>?,./`~ \\n\\0\\r\\u0127'});\n      expect(html).toEqual('<div rel=\"!@#$%^&amp;*()_+-={}[]:&#34;;\\'&lt;&gt;?,./`~ &#10;&#0;&#13;&#295;\">');\n    });\n\n    it('should ignore misformed elements', function() {\n      writer.start('d>i&v', {});\n      expect(html).toEqual('');\n    });\n\n    it('should ignore unknown attributes', function() {\n      writer.start('div', {unknown:''});\n      expect(html).toEqual('<div>');\n    });\n\n    it('should handle surrogate pair', function() {\n      writer.chars(String.fromCharCode(55357, 56374));\n      expect(html).toEqual('&#128054;');\n    });\n\n    describe('explicitly disallow', function() {\n      it('should not allow attributes', function() {\n        writer.start('div', {id:'a', name:'a', style:'a'});\n        expect(html).toEqual('<div>');\n      });\n\n      it('should not allow tags', function() {\n        function tag(name) {\n          writer.start(name, {});\n          writer.end(name);\n        }\n        tag('frameset');\n        tag('frame');\n        tag('form');\n        tag('param');\n        tag('object');\n        tag('embed');\n        tag('textarea');\n        tag('input');\n        tag('button');\n        tag('option');\n        tag('select');\n        tag('script');\n        tag('style');\n        tag('link');\n        tag('base');\n        tag('basefont');\n        expect(html).toEqual('');\n      });\n    });\n\n    describe('uri validation', function() {\n      it('should call the uri validator', function() {\n        writer.start('a', {href:'someUrl'}, false);\n        expect(uriValidator).toHaveBeenCalledWith('someUrl', false);\n        uriValidator.calls.reset();\n        writer.start('img', {src:'someImgUrl'}, false);\n        expect(uriValidator).toHaveBeenCalledWith('someImgUrl', true);\n        uriValidator.calls.reset();\n        writer.start('someTag', {src:'someNonUrl'}, false);\n        expect(uriValidator).not.toHaveBeenCalled();\n      });\n\n      it('should drop non valid uri attributes', function() {\n        uriValidator.and.returnValue(false);\n        writer.start('a', {href:'someUrl'}, false);\n        expect(html).toEqual('<a>');\n\n        html = '';\n        uriValidator.and.returnValue(true);\n        writer.start('a', {href:'someUrl'}, false);\n        expect(html).toEqual('<a href=\"someUrl\">');\n      });\n    });\n  });\n\n  describe('uri checking', function() {\n    beforeEach(function() {\n      jasmine.addMatchers({\n        toBeValidUrl: function() {\n          return {\n            compare: function(actual) {\n              var sanitize;\n              inject(function($sanitize) {\n                sanitize = $sanitize;\n              });\n              var input = '<a href=\"' + actual + '\"></a>';\n              return { pass: sanitize(input) === input };\n            }\n          };\n        }\n      });\n    });\n\n    it('should use $$sanitizeUri for a[href] links', function() {\n      var $$sanitizeUri = jasmine.createSpy('$$sanitizeUri');\n      module(function($provide) {\n        $provide.value('$$sanitizeUri', $$sanitizeUri);\n      });\n      inject(function() {\n        $$sanitizeUri.and.returnValue('someUri');\n\n        expectHTML('<a href=\"someUri\"></a>').toEqual('<a href=\"someUri\"></a>');\n        expect($$sanitizeUri).toHaveBeenCalledWith('someUri', false);\n\n        $$sanitizeUri.and.returnValue('unsafe:someUri');\n        expectHTML('<a href=\"someUri\"></a>').toEqual('<a></a>');\n      });\n    });\n\n    it('should use $$sanitizeUri for img[src] links', function() {\n      var $$sanitizeUri = jasmine.createSpy('$$sanitizeUri');\n      module(function($provide) {\n        $provide.value('$$sanitizeUri', $$sanitizeUri);\n      });\n      inject(function() {\n        $$sanitizeUri.and.returnValue('someUri');\n\n        expectHTML('<img src=\"someUri\"/>').toEqual('<img src=\"someUri\">');\n        expect($$sanitizeUri).toHaveBeenCalledWith('someUri', true);\n\n        $$sanitizeUri.and.returnValue('unsafe:someUri');\n        expectHTML('<img src=\"someUri\"/>').toEqual('<img>');\n      });\n    });\n\n    it('should be URI', function() {\n      expect('').toBeValidUrl();\n      expect('http://abc').toBeValidUrl();\n      expect('HTTP://abc').toBeValidUrl();\n      expect('https://abc').toBeValidUrl();\n      expect('HTTPS://abc').toBeValidUrl();\n      expect('ftp://abc').toBeValidUrl();\n      expect('FTP://abc').toBeValidUrl();\n      expect('mailto:me@example.com').toBeValidUrl();\n      expect('MAILTO:me@example.com').toBeValidUrl();\n      expect('tel:123-123-1234').toBeValidUrl();\n      expect('TEL:123-123-1234').toBeValidUrl();\n      expect('#anchor').toBeValidUrl();\n      expect('/page1.md').toBeValidUrl();\n    });\n\n    it('should not be URI', function() {\n      // eslint-disable-next-line no-script-url\n      expect('javascript:alert').not.toBeValidUrl();\n    });\n\n    describe('javascript URLs', function() {\n      it('should ignore javascript:', function() {\n        // eslint-disable-next-line no-script-url\n        expect('JavaScript:abc').not.toBeValidUrl();\n        expect(' \\n Java\\n Script:abc').not.toBeValidUrl();\n        expect('http://JavaScript/my.js').toBeValidUrl();\n      });\n\n      it('should ignore dec encoded javascript:', function() {\n        expect('&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;').not.toBeValidUrl();\n        expect('&#106&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;').not.toBeValidUrl();\n        expect('&#106 &#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;').not.toBeValidUrl();\n      });\n\n      it('should ignore decimal with leading 0 encoded javascript:', function() {\n        expect('&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058').not.toBeValidUrl();\n        expect('&#0000106 &#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058').not.toBeValidUrl();\n        expect('&#0000106; &#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058').not.toBeValidUrl();\n      });\n\n      it('should ignore hex encoded javascript:', function() {\n        expect('&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A;').not.toBeValidUrl();\n        expect('&#x6A;&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A;').not.toBeValidUrl();\n        expect('&#x6A &#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A;').not.toBeValidUrl();\n      });\n\n      it('should ignore hex encoded whitespace javascript:', function() {\n        expect('jav&#x09;ascript:alert();').not.toBeValidUrl();\n        expect('jav&#x0A;ascript:alert();').not.toBeValidUrl();\n        expect('jav&#x0A ascript:alert();').not.toBeValidUrl();\n        expect('jav\\u0000ascript:alert();').not.toBeValidUrl();\n        expect('java\\u0000\\u0000script:alert();').not.toBeValidUrl();\n        expect(' &#14; java\\u0000\\u0000script:alert();').not.toBeValidUrl();\n      });\n    });\n  });\n\n  describe('sanitizeText', function() {\n    /* global sanitizeText: false */\n    it('should escape text', function() {\n      expect(sanitizeText('a<div>&</div>c')).toEqual('a&lt;div&gt;&amp;&lt;/div&gt;c');\n    });\n  });\n});\n\ndescribe('decodeEntities', function() {\n  var handler, text;\n\n  beforeEach(function() {\n    text = '';\n    handler = {\n      start: function() {},\n      chars: function(text_) {\n        text = text_;\n      },\n      end: function() {},\n      comment: function() {}\n    };\n    module('ngSanitize');\n  });\n\n  it('should unescape text', function() {\n    htmlParser('a&lt;div&gt;&amp;&lt;/div&gt;c', handler);\n    expect(text).toEqual('a<div>&</div>c');\n  });\n\n  it('should preserve whitespace', function() {\n    htmlParser('  a&amp;b ', handler);\n    expect(text).toEqual('  a&b ');\n  });\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/test-bundles/angular-touch.js",
    "content": "/**\n * @license AngularJS v1.7.8\n * (c) 2010-2018 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngTouch\n * @description\n *\n * The `ngTouch` module provides helpers for touch-enabled devices.\n * The implementation is based on jQuery Mobile touch event handling\n * ([jquerymobile.com](http://jquerymobile.com/)). *\n *\n * See {@link ngTouch.$swipe `$swipe`} for usage.\n *\n * @deprecated\n * sinceVersion=\"1.7.0\"\n * The ngTouch module with the {@link ngTouch.$swipe `$swipe`} service and\n * the {@link ngTouch.ngSwipeLeft} and {@link ngTouch.ngSwipeRight} directives are\n * deprecated. Instead, stand-alone libraries for touch handling and gesture interaction\n * should be used, for example [HammerJS](https://hammerjs.github.io/) (which is also used by\n * Angular).\n */\n\n// define ngTouch module\n/* global ngTouch */\nvar ngTouch = angular.module('ngTouch', []);\n\nngTouch.info({ angularVersion: '1.7.8' });\n\nfunction nodeName_(element) {\n  return angular.$$lowercase(element.nodeName || (element[0] && element[0].nodeName));\n}\n\n/* global ngTouch: false */\n\n    /**\n     * @ngdoc service\n     * @name $swipe\n     *\n     * @deprecated\n     * sinceVersion=\"1.7.0\"\n     *\n     * See the {@link ngTouch module} documentation for more information.\n     *\n     * @description\n     * The `$swipe` service is a service that abstracts the messier details of hold-and-drag swipe\n     * behavior, to make implementing swipe-related directives more convenient.\n     *\n     * Requires the {@link ngTouch `ngTouch`} module to be installed.\n     *\n     * `$swipe` is used by the `ngSwipeLeft` and `ngSwipeRight` directives in `ngTouch`.\n     *\n     * # Usage\n     * The `$swipe` service is an object with a single method: `bind`. `bind` takes an element\n     * which is to be watched for swipes, and an object with four handler functions. See the\n     * documentation for `bind` below.\n     */\n\nngTouch.factory('$swipe', [function() {\n  // The total distance in any direction before we make the call on swipe vs. scroll.\n  var MOVE_BUFFER_RADIUS = 10;\n\n  var POINTER_EVENTS = {\n    'mouse': {\n      start: 'mousedown',\n      move: 'mousemove',\n      end: 'mouseup'\n    },\n    'touch': {\n      start: 'touchstart',\n      move: 'touchmove',\n      end: 'touchend',\n      cancel: 'touchcancel'\n    },\n    'pointer': {\n      start: 'pointerdown',\n      move: 'pointermove',\n      end: 'pointerup',\n      cancel: 'pointercancel'\n    }\n  };\n\n  function getCoordinates(event) {\n    var originalEvent = event.originalEvent || event;\n    var touches = originalEvent.touches && originalEvent.touches.length ? originalEvent.touches : [originalEvent];\n    var e = (originalEvent.changedTouches && originalEvent.changedTouches[0]) || touches[0];\n\n    return {\n      x: e.clientX,\n      y: e.clientY\n    };\n  }\n\n  function getEvents(pointerTypes, eventType) {\n    var res = [];\n    angular.forEach(pointerTypes, function(pointerType) {\n      var eventName = POINTER_EVENTS[pointerType][eventType];\n      if (eventName) {\n        res.push(eventName);\n      }\n    });\n    return res.join(' ');\n  }\n\n  return {\n    /**\n     * @ngdoc method\n     * @name $swipe#bind\n     *\n     * @description\n     * The main method of `$swipe`. It takes an element to be watched for swipe motions, and an\n     * object containing event handlers.\n     * The pointer types that should be used can be specified via the optional\n     * third argument, which is an array of strings `'mouse'`, `'touch'` and `'pointer'`. By default,\n     * `$swipe` will listen for `mouse`, `touch` and `pointer` events.\n     *\n     * The four events are `start`, `move`, `end`, and `cancel`. `start`, `move`, and `end`\n     * receive as a parameter a coordinates object of the form `{ x: 150, y: 310 }` and the raw\n     * `event`. `cancel` receives the raw `event` as its single parameter.\n     *\n     * `start` is called on either `mousedown`, `touchstart` or `pointerdown`. After this event, `$swipe` is\n     * watching for `touchmove`, `mousemove` or `pointermove` events. These events are ignored until the total\n     * distance moved in either dimension exceeds a small threshold.\n     *\n     * Once this threshold is exceeded, either the horizontal or vertical delta is greater.\n     * - If the horizontal distance is greater, this is a swipe and `move` and `end` events follow.\n     * - If the vertical distance is greater, this is a scroll, and we let the browser take over.\n     *   A `cancel` event is sent.\n     *\n     * `move` is called on `mousemove`, `touchmove` and `pointermove` after the above logic has determined that\n     * a swipe is in progress.\n     *\n     * `end` is called when a swipe is successfully completed with a `touchend`, `mouseup` or `pointerup`.\n     *\n     * `cancel` is called either on a `touchcancel` or `pointercancel`  from the browser, or when we begin scrolling\n     * as described above.\n     *\n     */\n    bind: function(element, eventHandlers, pointerTypes) {\n      // Absolute total movement, used to control swipe vs. scroll.\n      var totalX, totalY;\n      // Coordinates of the start position.\n      var startCoords;\n      // Last event's position.\n      var lastPos;\n      // Whether a swipe is active.\n      var active = false;\n\n      pointerTypes = pointerTypes || ['mouse', 'touch', 'pointer'];\n      element.on(getEvents(pointerTypes, 'start'), function(event) {\n        startCoords = getCoordinates(event);\n        active = true;\n        totalX = 0;\n        totalY = 0;\n        lastPos = startCoords;\n        if (eventHandlers['start']) {\n          eventHandlers['start'](startCoords, event);\n        }\n      });\n      var events = getEvents(pointerTypes, 'cancel');\n      if (events) {\n        element.on(events, function(event) {\n          active = false;\n          if (eventHandlers['cancel']) {\n            eventHandlers['cancel'](event);\n          }\n        });\n      }\n\n      element.on(getEvents(pointerTypes, 'move'), function(event) {\n        if (!active) return;\n\n        // Android will send a touchcancel if it thinks we're starting to scroll.\n        // So when the total distance (+ or - or both) exceeds 10px in either direction,\n        // we either:\n        // - On totalX > totalY, we send preventDefault() and treat this as a swipe.\n        // - On totalY > totalX, we let the browser handle it as a scroll.\n\n        if (!startCoords) return;\n        var coords = getCoordinates(event);\n\n        totalX += Math.abs(coords.x - lastPos.x);\n        totalY += Math.abs(coords.y - lastPos.y);\n\n        lastPos = coords;\n\n        if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) {\n          return;\n        }\n\n        // One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll.\n        if (totalY > totalX) {\n          // Allow native scrolling to take over.\n          active = false;\n          if (eventHandlers['cancel']) {\n            eventHandlers['cancel'](event);\n          }\n          return;\n        } else {\n          // Prevent the browser from scrolling.\n          event.preventDefault();\n          if (eventHandlers['move']) {\n            eventHandlers['move'](coords, event);\n          }\n        }\n      });\n\n      element.on(getEvents(pointerTypes, 'end'), function(event) {\n        if (!active) return;\n        active = false;\n        if (eventHandlers['end']) {\n          eventHandlers['end'](getCoordinates(event), event);\n        }\n      });\n    }\n  };\n}]);\n\n/* global ngTouch: false */\n\n/**\n * @ngdoc directive\n * @name ngSwipeLeft\n *\n * @deprecated\n * sinceVersion=\"1.7.0\"\n *\n * See the {@link ngTouch module} documentation for more information.\n *\n * @description\n * Specify custom behavior when an element is swiped to the left on a touchscreen device.\n * A leftward swipe is a quick, right-to-left slide of the finger.\n * Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag\n * too.\n *\n * To disable the mouse click and drag functionality, add `ng-swipe-disable-mouse` to\n * the `ng-swipe-left` or `ng-swipe-right` DOM Element.\n *\n * Requires the {@link ngTouch `ngTouch`} module to be installed.\n *\n * @element ANY\n * @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate\n * upon left swipe. (Event object is available as `$event`)\n *\n * @example\n    <example module=\"ngSwipeLeftExample\" deps=\"angular-touch.js\" name=\"ng-swipe-left\">\n      <file name=\"index.html\">\n        <div ng-show=\"!showActions\" ng-swipe-left=\"showActions = true\">\n          Some list content, like an email in the inbox\n        </div>\n        <div ng-show=\"showActions\" ng-swipe-right=\"showActions = false\">\n          <button ng-click=\"reply()\">Reply</button>\n          <button ng-click=\"delete()\">Delete</button>\n        </div>\n      </file>\n      <file name=\"script.js\">\n        angular.module('ngSwipeLeftExample', ['ngTouch']);\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSwipeRight\n *\n * @deprecated\n * sinceVersion=\"1.7.0\"\n *\n * See the {@link ngTouch module} documentation for more information.\n *\n * @description\n * Specify custom behavior when an element is swiped to the right on a touchscreen device.\n * A rightward swipe is a quick, left-to-right slide of the finger.\n * Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag\n * too.\n *\n * Requires the {@link ngTouch `ngTouch`} module to be installed.\n *\n * @element ANY\n * @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate\n * upon right swipe. (Event object is available as `$event`)\n *\n * @example\n    <example module=\"ngSwipeRightExample\" deps=\"angular-touch.js\" name=\"ng-swipe-right\">\n      <file name=\"index.html\">\n        <div ng-show=\"!showActions\" ng-swipe-left=\"showActions = true\">\n          Some list content, like an email in the inbox\n        </div>\n        <div ng-show=\"showActions\" ng-swipe-right=\"showActions = false\">\n          <button ng-click=\"reply()\">Reply</button>\n          <button ng-click=\"delete()\">Delete</button>\n        </div>\n      </file>\n      <file name=\"script.js\">\n        angular.module('ngSwipeRightExample', ['ngTouch']);\n      </file>\n    </example>\n */\n\nfunction makeSwipeDirective(directiveName, direction, eventName) {\n  ngTouch.directive(directiveName, ['$parse', '$swipe', function($parse, $swipe) {\n    // The maximum vertical delta for a swipe should be less than 75px.\n    var MAX_VERTICAL_DISTANCE = 75;\n    // Vertical distance should not be more than a fraction of the horizontal distance.\n    var MAX_VERTICAL_RATIO = 0.3;\n    // At least a 30px lateral motion is necessary for a swipe.\n    var MIN_HORIZONTAL_DISTANCE = 30;\n\n    return function(scope, element, attr) {\n      var swipeHandler = $parse(attr[directiveName]);\n\n      var startCoords, valid;\n\n      function validSwipe(coords) {\n        // Check that it's within the coordinates.\n        // Absolute vertical distance must be within tolerances.\n        // Horizontal distance, we take the current X - the starting X.\n        // This is negative for leftward swipes and positive for rightward swipes.\n        // After multiplying by the direction (-1 for left, +1 for right), legal swipes\n        // (ie. same direction as the directive wants) will have a positive delta and\n        // illegal ones a negative delta.\n        // Therefore this delta must be positive, and larger than the minimum.\n        if (!startCoords) return false;\n        var deltaY = Math.abs(coords.y - startCoords.y);\n        var deltaX = (coords.x - startCoords.x) * direction;\n        return valid && // Short circuit for already-invalidated swipes.\n            deltaY < MAX_VERTICAL_DISTANCE &&\n            deltaX > 0 &&\n            deltaX > MIN_HORIZONTAL_DISTANCE &&\n            deltaY / deltaX < MAX_VERTICAL_RATIO;\n      }\n\n      var pointerTypes = ['touch'];\n      if (!angular.isDefined(attr['ngSwipeDisableMouse'])) {\n        pointerTypes.push('mouse');\n      }\n      $swipe.bind(element, {\n        'start': function(coords, event) {\n          startCoords = coords;\n          valid = true;\n        },\n        'cancel': function(event) {\n          valid = false;\n        },\n        'end': function(coords, event) {\n          if (validSwipe(coords)) {\n            scope.$apply(function() {\n              element.triggerHandler(eventName);\n              swipeHandler(scope, {$event: event});\n            });\n          }\n        }\n      }, pointerTypes);\n    };\n  }]);\n}\n\n// Left is negative X-coordinate, right is positive.\nmakeSwipeDirective('ngSwipeLeft', -1, 'swipeleft');\nmakeSwipeDirective('ngSwipeRight', 1, 'swiperight');\n\n// Wrapper to abstract over using touch events or mouse events.\nvar swipeTests = function(description, restrictBrowsers, startEvent, moveEvent, endEvent) {\n  describe('ngSwipe with ' + description + ' events', function() {\n    var element;\n\n    if (restrictBrowsers) {\n      // TODO(braden): Once we have other touch-friendly browsers on CI, allow them here.\n      // Currently Firefox and IE refuse to fire touch events.\n      var chrome = /chrome/.test(window.navigator.userAgent.toLowerCase());\n      if (!chrome) {\n        return;\n      }\n    }\n\n    beforeEach(function() {\n      module('ngTouch');\n    });\n\n    afterEach(function() {\n      dealoc(element);\n    });\n\n    it('should swipe to the left', inject(function($rootScope, $compile) {\n      element = $compile('<div ng-swipe-left=\"swiped = true\"></div>')($rootScope);\n      $rootScope.$digest();\n      expect($rootScope.swiped).toBeUndefined();\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 100,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n      expect($rootScope.swiped).toBe(true);\n    }));\n\n    it('should swipe to the right', inject(function($rootScope, $compile) {\n      element = $compile('<div ng-swipe-right=\"swiped = true\"></div>')($rootScope);\n      $rootScope.$digest();\n      expect($rootScope.swiped).toBeUndefined();\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 90,\n        y: 20\n      });\n      expect($rootScope.swiped).toBe(true);\n    }));\n\n    it('should only swipe given ng-swipe-disable-mouse attribute for touch events', inject(function($rootScope, $compile) {\n      element = $compile('<div ng-swipe-left=\"swiped = true\" ng-swipe-disable-mouse></div>')($rootScope);\n      $rootScope.$digest();\n      expect($rootScope.swiped).toBeUndefined();\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 100,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n      expect(!!$rootScope.swiped).toBe(description !== 'mouse');\n    }));\n\n    it('should pass event object', inject(function($rootScope, $compile) {\n      element = $compile('<div ng-swipe-left=\"event = $event\"></div>')($rootScope);\n      $rootScope.$digest();\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 100,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n      expect($rootScope.event).toBeDefined();\n    }));\n\n    it('should not swipe if you move too far vertically', inject(function($rootScope, $compile, $rootElement) {\n      element = $compile('<div ng-swipe-left=\"swiped = true\"></div>')($rootScope);\n      $rootElement.append(element);\n      $rootScope.$digest();\n\n      expect($rootScope.swiped).toBeUndefined();\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 90,\n        y: 20\n      });\n      browserTrigger(element, moveEvent, {\n        keys: [],\n        x: 70,\n        y: 200\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n\n      expect($rootScope.swiped).toBeUndefined();\n    }));\n\n    it('should not swipe if you slide only a short distance', inject(function($rootScope, $compile, $rootElement) {\n      element = $compile('<div ng-swipe-left=\"swiped = true\"></div>')($rootScope);\n      $rootElement.append(element);\n      $rootScope.$digest();\n\n      expect($rootScope.swiped).toBeUndefined();\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 90,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 80,\n        y: 20\n      });\n\n      expect($rootScope.swiped).toBeUndefined();\n    }));\n\n    it('should not swipe if the swipe leaves the element', inject(function($rootScope, $compile, $rootElement) {\n      element = $compile('<div ng-swipe-right=\"swiped = true\"></div>')($rootScope);\n      $rootElement.append(element);\n      $rootScope.$digest();\n\n      expect($rootScope.swiped).toBeUndefined();\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n      browserTrigger(element, moveEvent, {\n        keys: [],\n        x: 40,\n        y: 20\n      });\n\n      expect($rootScope.swiped).toBeUndefined();\n    }));\n\n    it('should not swipe if the swipe starts outside the element', inject(function($rootScope, $compile, $rootElement) {\n      element = $compile('<div ng-swipe-right=\"swiped = true\"></div>')($rootScope);\n      $rootElement.append(element);\n      $rootScope.$digest();\n\n      expect($rootScope.swiped).toBeUndefined();\n\n      browserTrigger(element, moveEvent, {\n        keys: [],\n        x: 10,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 90,\n        y: 20\n      });\n\n      expect($rootScope.swiped).toBeUndefined();\n    }));\n\n    it('should emit \"swipeleft\" events for left swipes', inject(function($rootScope, $compile, $rootElement) {\n      element = $compile('<div ng-swipe-left=\"swiped = true\"></div>')($rootScope);\n      $rootElement.append(element);\n      $rootScope.$digest();\n\n      expect($rootScope.swiped).toBeUndefined();\n      var eventFired = false;\n      element.on('swipeleft', function() {\n        eventFired = true;\n      });\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 100,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n      expect(eventFired).toEqual(true);\n    }));\n\n    it('should emit \"swiperight\" events for right swipes', inject(function($rootScope, $compile, $rootElement) {\n      element = $compile('<div ng-swipe-right=\"swiped = true\"></div>')($rootScope);\n      $rootElement.append(element);\n      $rootScope.$digest();\n\n      expect($rootScope.swiped).toBeUndefined();\n      var eventFired = false;\n      element.on('swiperight', function() {\n        eventFired = true;\n      });\n\n      browserTrigger(element, startEvent, {\n        keys: [],\n        x: 20,\n        y: 20\n      });\n      browserTrigger(element, endEvent, {\n        keys: [],\n        x: 100,\n        y: 20\n      });\n      expect(eventFired).toEqual(true);\n    }));\n  });\n};\n\nswipeTests('touch', /* restrictBrowsers */ true, 'touchstart', 'touchmove', 'touchend');\nswipeTests('mouse', /* restrictBrowsers */ false, 'mousedown', 'mousemove', 'mouseup');\n\ndescribe('$swipe', function() {\n  var element;\n  var events;\n\n  beforeEach(function() {\n    module('ngTouch');\n    inject(function($compile, $rootScope) {\n      element = $compile('<div></div>')($rootScope);\n    });\n    events = {\n      start: jasmine.createSpy('startSpy'),\n      move: jasmine.createSpy('moveSpy'),\n      cancel: jasmine.createSpy('cancelSpy'),\n      end: jasmine.createSpy('endSpy')\n    };\n  });\n\n  afterEach(function() {\n    dealoc(element);\n  });\n\n  describe('pointerTypes', function() {\n    var usedEvents;\n    var MOUSE_EVENTS = ['mousedown','mousemove','mouseup'].sort();\n    var TOUCH_EVENTS = ['touchcancel','touchend','touchmove','touchstart'].sort();\n    var POINTER_EVENTS = ['pointerdown', 'pointermove', 'pointerup', 'pointercancel'].sort();\n    var ALL_EVENTS = MOUSE_EVENTS.concat(TOUCH_EVENTS, POINTER_EVENTS).sort();\n\n    beforeEach(function() {\n      usedEvents = [];\n      spyOn(element, 'on').and.callFake(function(events) {\n        angular.forEach(events.split(/\\s+/), function(eventName) {\n          usedEvents.push(eventName);\n        });\n      });\n    });\n\n    it('should use mouse, touch and pointer by default', inject(function($swipe) {\n      $swipe.bind(element, events);\n      expect(usedEvents.sort()).toEqual(ALL_EVENTS);\n    }));\n\n    it('should only use mouse events for pointerType \"mouse\"', inject(function($swipe) {\n      $swipe.bind(element, events, ['mouse']);\n      expect(usedEvents.sort()).toEqual(MOUSE_EVENTS);\n    }));\n\n    it('should only use touch events for pointerType \"touch\"', inject(function($swipe) {\n      $swipe.bind(element, events, ['touch']);\n      expect(usedEvents.sort()).toEqual(TOUCH_EVENTS);\n    }));\n\n    it('should only use pointer events for pointerType \"pointer\"', inject(function($swipe) {\n      $swipe.bind(element, events, ['pointer']);\n      expect(usedEvents.sort()).toEqual(POINTER_EVENTS);\n    }));\n\n    it('should use mouse and touch if both are specified', inject(function($swipe) {\n      $swipe.bind(element, events, ['touch', 'mouse']);\n      expect(usedEvents.sort()).toEqual(MOUSE_EVENTS.concat(TOUCH_EVENTS).sort());\n    }));\n\n    it('should use mouse and pointer if both are specified', inject(function($swipe) {\n      $swipe.bind(element, events, ['mouse', 'pointer']);\n      expect(usedEvents.sort()).toEqual(MOUSE_EVENTS.concat(POINTER_EVENTS).sort());\n    }));\n\n    it('should use touch and pointer if both are specified', inject(function($swipe) {\n      $swipe.bind(element, events, ['touch', 'pointer']);\n      expect(usedEvents.sort()).toEqual(TOUCH_EVENTS.concat(POINTER_EVENTS).sort());\n    }));\n\n    it('should use mouse, touch and pointer if they are specified', inject(function($swipe) {\n      $swipe.bind(element, events, ['mouse', 'touch', 'pointer']);\n      expect(usedEvents.sort()).toEqual(ALL_EVENTS);\n    }));\n\n  });\n\n  swipeTests('touch', /* restrictBrowsers */ true, 'touchstart', 'touchmove', 'touchend');\n  swipeTests('pointer', /* restrictBrowsers */ true, 'pointerdown', 'pointermove', 'pointerup');\n  swipeTests('mouse', /* restrictBrowsers */ false, 'mousedown',  'mousemove', 'mouseup');\n\n  // Wrapper to abstract over using touch events or mouse events.\n  function swipeTests(description, restrictBrowsers, startEvent, moveEvent, endEvent) {\n    describe('$swipe with ' + description + ' events', function() {\n      if (restrictBrowsers) {\n        // TODO(braden): Once we have other touch-friendly browsers on CI, allow them here.\n        // Currently Firefox and IE refuse to fire touch events.\n        // Enable iPhone for manual testing.\n        if (!/chrome|iphone/i.test(window.navigator.userAgent)) {\n          return;\n        }\n      }\n\n      it('should trigger the \"start\" event', inject(function($swipe) {\n        $swipe.bind(element, events);\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, startEvent,{\n          keys: [],\n          x: 100,\n          y: 20\n        });\n\n        expect(events.start).toHaveBeenCalled();\n\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n      }));\n\n      it('should trigger the \"move\" event after a \"start\"', inject(function($swipe) {\n        $swipe.bind(element, events);\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, startEvent,{\n          keys: [],\n          x: 100,\n          y: 20\n        });\n\n        expect(events.start).toHaveBeenCalled();\n\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 140,\n          y: 20\n        });\n\n        expect(events.start).toHaveBeenCalled();\n        expect(events.move).toHaveBeenCalled();\n\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n      }));\n\n      it('should not trigger a \"move\" without a \"start\"', inject(function($swipe) {\n        $swipe.bind(element, events);\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 100,\n          y: 40\n        });\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n      }));\n\n      it('should not trigger an \"end\" without a \"start\"', inject(function($swipe) {\n        $swipe.bind(element, events);\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, endEvent,{\n          keys: [],\n          x: 100,\n          y: 40\n        });\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n      }));\n\n      it('should trigger a \"start\", many \"move\"s and an \"end\"', inject(function($swipe) {\n        $swipe.bind(element, events);\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, startEvent,{\n          keys: [],\n          x: 100,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 120,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 130,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 140,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 150,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 160,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 170,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 180,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n        expect(events.move).toHaveBeenCalledTimes(7);\n\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, endEvent,{\n          keys: [],\n          x: 200,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n        expect(events.move).toHaveBeenCalledTimes(7);\n        expect(events.end).toHaveBeenCalled();\n\n        expect(events.cancel).not.toHaveBeenCalled();\n      }));\n\n      it('should not start sending \"move\"s until enough horizontal motion is accumulated', inject(function($swipe) {\n        $swipe.bind(element, events);\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, startEvent,{\n          keys: [],\n          x: 100,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 101,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 105,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 110,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 115,\n          y: 40\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 120,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n        expect(events.move).toHaveBeenCalledTimes(3);\n\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, endEvent,{\n          keys: [],\n          x: 200,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n        expect(events.move).toHaveBeenCalledTimes(3);\n        expect(events.end).toHaveBeenCalled();\n\n        expect(events.cancel).not.toHaveBeenCalled();\n      }));\n\n      it('should stop sending anything after vertical motion dominates', inject(function($swipe) {\n        $swipe.bind(element, events);\n\n        expect(events.start).not.toHaveBeenCalled();\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, startEvent,{\n          keys: [],\n          x: 100,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.cancel).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 101,\n          y: 41\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 105,\n          y: 55\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 110,\n          y: 60\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 115,\n          y: 70\n        });\n        browserTrigger(element, moveEvent,{\n          keys: [],\n          x: 120,\n          y: 80\n        });\n\n        expect(events.start).toHaveBeenCalled();\n        expect(events.cancel).toHaveBeenCalled();\n\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n\n        browserTrigger(element, endEvent,{\n          keys: [],\n          x: 200,\n          y: 40\n        });\n\n        expect(events.start).toHaveBeenCalled();\n        expect(events.cancel).toHaveBeenCalled();\n\n        expect(events.move).not.toHaveBeenCalled();\n        expect(events.end).not.toHaveBeenCalled();\n      }));\n    });\n  }\n\n});\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "app/vendor/angular/version.json",
    "content": "{\"raw\":\"v1.7.8\",\"major\":1,\"minor\":7,\"patch\":8,\"prerelease\":[],\"build\":[],\"version\":\"1.7.8\",\"codeName\":\"enthusiastic-oblation\",\"full\":\"1.7.8\",\"branch\":\"v1.7.x\",\"cdn\":{\"raw\":\"v1.7.7\",\"major\":1,\"minor\":7,\"patch\":7,\"prerelease\":[],\"build\":[],\"version\":\"1.7.7\",\"docsUrl\":\"http://code.angularjs.org/1.7.7/docs\"}}"
  },
  {
    "path": "app/vendor/angular/version.txt",
    "content": "1.7.8"
  },
  {
    "path": "app/vendor/angular-media-player/angular-media-player.js",
    "content": "/**\n * MDN references for hackers:\n * ===========================\n * Media events on <audio> and <video> tags:\n * https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events\n * Properties and Methods:\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement\n * Internet Exploder version:\n * http://msdn.microsoft.com/en-us/library/ff975061(v=vs.85).aspx\n *\n * Understanding TimeRanges objects:\n * http://html5doctor.com/html5-audio-the-state-of-play/\n */\nangular.module('mediaPlayer', ['mediaPlayer.helpers'])\n.constant('mp.playerDefaults', {\n  // general properties\n  currentTrack: 0,\n  ended: undefined,\n  network: undefined,\n  playing: false,\n  seeking: false,\n  tracks: 0,\n  volume: 1,\n\n  // formatted properties\n  formatDuration: '00:00',\n  formatTime: '00:00',\n  loadPercent: 0\n})\n\n.directive('mediaPlayer', ['$rootScope', '$interpolate', '$timeout', 'mp.throttle', 'mp.playerDefaults',\n  function ($rootScope, $interpolate, $timeout, throttle, playerDefaults) {\n\n    var playerMethods = {\n      /**\n       * @usage load([mediaElement], [autoplay]);\n       *\n       * @param  {mediaElement Obj} mediaElement a single mediaElement, may contain multiple <source>(s)\n       * @param  {boolean} autoplay: flag to autostart loaded element\n       */\n      load: function (mediaElement, autoplay) {\n        // method overloading\n        if (typeof mediaElement === 'boolean') {\n          autoplay = mediaElement;\n          mediaElement = null;\n        } else if (typeof mediaElement === 'object') {\n          this.$clearSourceList();\n          this.$addSourceList(mediaElement);\n        }\n        this.$domEl.load();\n        this.ended = undefined;\n        if (autoplay) {\n          // ogv.js doesn't have support for canplay event yet\n          var canPlayEvent = this.$domEl.tagName == 'OGVJS' ? 'loadeddata' : 'canplay'\n          this.$element.one(canPlayEvent, this.play.bind(this));\n        }\n      },\n      /**\n       * resets the player (clear the <source>s) and reloads the playlist\n       *\n       * @usage reset([autoplay]);\n       * @param {boolean} autoplay: flag to autoplay once resetted\n       */\n      reset: function (autoplay) {\n        angular.extend(this, playerDefaults);\n        this.$clearSourceList();\n        this.load(this.$playlist, autoplay);\n      },\n      /**\n       * @usage play([index], [selectivePlay])\n       * @param {integer} index: playlist index (0...n), to start playing from\n       * @param {boolean} selectivePlay: only correct value is `true`, in which case will only play the specified,\n       *                                 or current, track. The default is to continue playing the next one.\n       */\n      play: function (index, selectivePlay) {\n        // method overloading\n        if (typeof index === 'boolean') {\n          selectivePlay = index;\n          index = undefined;\n        }\n        if (selectivePlay) {\n          this.$selective = true;\n        }\n\n        if (this.$playlist.length > index) {\n          this.currentTrack = index + 1;\n          return this.load(this.$playlist[index], true);\n        }\n        // readyState = HAVE_NOTHING (0) means there's nothing into the <audio>/<video> tag\n        if (!this.currentTrack && this.$domEl.readyState) { this.currentTrack++; }\n\n        // In case the stream is completed, reboot it with a load()\n        if (this.ended) {\n          this.load(true);\n        } else {\n          this.$domEl.play();\n        }\n      },\n      playPause: function (index, selectivePlay) {\n        // method overloading\n        if (typeof index === 'boolean') {\n          selectivePlay = index;\n          index = undefined;\n        }\n        if (selectivePlay) {\n          this.$selective = true;\n        }\n\n        if (typeof index === 'number' && index + 1 !== this.currentTrack) {\n          this.play(index);\n        } else if (this.playing) {\n          this.pause();\n        } else {\n          this.play();\n        }\n      },\n      pause: function () {\n        this.$domEl.pause();\n      },\n      stop: function () {\n        this.reset();\n      },\n      toggleMute: function () {\n        this.muted = this.$domEl.muted = !this.$domEl.muted;\n      },\n      next: function (autoplay) {\n        var self = this;\n        if (self.currentTrack && self.currentTrack < self.tracks) {\n          var wasPlaying = autoplay || self.playing;\n          self.pause();\n          $timeout(function () {\n            self.$clearSourceList();\n            self.$addSourceList(self.$playlist[self.currentTrack]);\n            self.load(wasPlaying); // setup autoplay here.\n            self.currentTrack++;\n          });\n        }\n      },\n      prev: function (autoplay) {\n        var self = this;\n        if (self.currentTrack && self.currentTrack - 1) {\n          var wasPlaying = autoplay || self.playing;\n          self.pause();\n          $timeout(function () {\n            self.$clearSourceList();\n            self.$addSourceList(self.$playlist[self.currentTrack - 2]);\n            self.load(wasPlaying); // setup autoplay here.\n            self.currentTrack--;\n          });\n        }\n      },\n      setPlaybackRate: function (value) {\n        this.$domEl.playbackRate = value;\n      },\n      setVolume: function (value) {\n        this.$domEl.volume = value;\n      },\n      seek: function (value) {\n        var doubleval = 0, valuesArr;\n        if (typeof value === 'string') {\n          valuesArr = value.split(':');\n          doubleval += parseInt(valuesArr.pop(), 10);\n          if (valuesArr.length) { doubleval += parseInt(valuesArr.pop(), 10) * 60; }\n          if (valuesArr.length) { doubleval += parseInt(valuesArr.pop(), 10) * 3600; }\n          if (!isNaN(doubleval)) {\n            return this.$domEl.currentTime = doubleval;\n          }\n        } else {\n          return this.$domEl.currentTime = value;\n        }\n      },\n      /**\n       * binds a specific event directly to the element\n       * @param  {string}   type   event name\n       * @param  {function} fn     callback\n       * @return {function}        unbind function, call it in order to remove the listener\n       */\n      on: function (type, fn) {\n        return this.$element.on(type, fn);\n      },\n      off: function (type, fn) {\n        return this.$element.off(type, fn);\n      },\n      one: function (type, fn) {\n        return this.$element.one(type, fn);\n      },\n      $addSourceList: function (sourceList) {\n        var self = this;\n        if (angular.isArray(sourceList)) {\n          angular.forEach(sourceList, function (singleElement, index) {\n            var sourceElem = document.createElement('SOURCE');\n            ['src', 'type', 'media'].forEach(function (key) { // use only a subset of the properties\n              if (singleElement[key] !== undefined) { // firefox is picky if you set undefined attributes\n                sourceElem.setAttribute(key, singleElement[key]);\n              }\n            });\n            self.$element.append(sourceElem);\n          });\n        } else if (angular.isObject(sourceList)) {\n          var sourceElem = document.createElement('SOURCE');\n          ['src', 'type', 'media'].forEach(function (key) {\n            if (sourceList[key] !== undefined) {\n              sourceElem.setAttribute(key, sourceList[key]);\n            }\n          });\n          self.$element.append(sourceElem);\n        }\n      },\n      $clearSourceList: function () {\n        this.$element.contents().remove();\n      },\n      $formatTime: function (seconds) {\n        if (seconds === Infinity) {\n          return '∞'; // If the data is streaming\n        }\n        var hours = parseInt(seconds / 3600, 10) % 24,\n            minutes = parseInt(seconds / 60, 10) % 60,\n            secs = parseInt(seconds % 60, 10),\n            result,\n            fragment = (minutes < 10 ? '0' + minutes : minutes) + ':' + (secs  < 10 ? '0' + secs : secs);\n        if (hours > 0) {\n          result = (hours < 10 ? '0' + hours : hours) + ':' + fragment;\n        } else {\n          result = fragment;\n        }\n        return result;\n      },\n      $attachPlaylist: function (pl) {\n        if (pl === undefined || pl === null) {\n          this.playlist = [];\n        } else {\n          this.$playlist = pl;\n        }\n      }\n    };\n\n    /**\n     * Binding function that gives life to AngularJS scope\n     * @param  {Scope}  au        Player Scope\n     * @param  {HTMLMediaElement} HTML5 element\n     * @param  {jQlite} element   <audio>/<video> element\n     * @return {function}\n     *\n     * Returns an unbinding function\n     */\n    var bindListeners = function (au, al, element) {\n      var updateTime = function (scope) {\n        scope.currentTime = al.currentTime;\n        scope.formatTime = scope.$formatTime(scope.currentTime);\n      }\n      var listeners = {\n        playing: function () {\n          au.$apply(function (scope) {\n            scope.playing = true;\n            scope.ended = false;\n          });\n        },\n        pause: function () {\n          au.$apply(function (scope) {\n            scope.playing = false;\n          });\n        },\n        ended: function () {\n          if (!au.$selective && au.currentTrack < au.tracks) {\n            au.next(true);\n          } else {\n            au.$apply(function (scope) {\n              scope.ended = true;\n              scope.playing = false; // IE9 does not throw 'pause' when file ends\n              updateTime(scope)\n            });\n          }\n        },\n        timeupdate: throttle(1000, false, function () {\n          au.$apply(function (scope) {\n            updateTime(scope)\n          });\n        }),\n        loadedmetadata: function () {\n          au.$apply(function (scope) {\n            if (!scope.currentTrack) { scope.currentTrack++; } // This is triggered *ONLY* the first time a <source> gets loaded.\n            scope.duration = al.duration;\n            scope.formatDuration = scope.$formatTime(scope.duration);\n            if (al.buffered.length) {\n              scope.loadPercent = Math.round((al.buffered.end(al.buffered.length - 1) / scope.duration) * 100);\n            }\n            updateTime(scope)\n          });\n        },\n        progress: function () {\n          if (au.$domEl.buffered.length) {\n            au.$apply(function (scope) {\n              scope.loadPercent = Math.round((al.buffered.end(al.buffered.length - 1) / scope.duration) * 100);\n              scope.network = 'progress';\n            });\n          }\n        },\n        volumechange: function () { // Sent when volume changes (both when the volume is set and when the muted attribute is changed).\n          au.$apply(function (scope) {\n            // scope.volume = Math.floor(al.volume * 100);\n            scope.volume = al.volume;\n            scope.muted = al.muted;\n          });\n        },\n        seeked: function () {\n          au.$apply(function (scope) {\n            scope.seeking = false;\n          });\n        },\n        seeking: function () {\n          au.$apply(function (scope) {\n            scope.seeking = true;\n          });\n        },\n        ratechange: function () {\n          au.$apply(function (scope) {\n            // scope.playbackRate = Math.floor(al.playbackRate * 100);\n            scope.playbackRate = al.playbackRate;\n          });\n        },\n        stalled: function () {\n          au.$apply(function (scope) {\n            scope.network = 'stalled';\n          });\n        },\n        suspend: function () {\n          au.$apply(function (scope) {\n            scope.network = 'suspend';\n          });\n        }\n      };\n\n      angular.forEach(listeners, function (f, listener) {\n        element.on(listener, f);\n      });\n    };\n\n    var MediaPlayer = function (element) {\n      var mediaScope = angular.extend($rootScope.$new(true), {\n        $element: element,\n        $domEl: element[0],\n        $playlist: undefined,\n\n        // bind TimeRanges structures to actual MediaElement\n        buffered: element[0].buffered,\n        played: element[0].played,\n        seekable: element[0].seekable,\n      }, playerDefaults, playerMethods);\n      bindListeners(mediaScope, element[0], element);\n      return mediaScope;\n    };\n\n    // creates a watch function bound to the specific player\n    // optimizable: closures eats ram\n    function playlistWatch(player) {\n      return function (playlistNew, playlistOld, watchScope) {\n        var currentTrack,\n            newTrackNum = null;\n\n        // on every playlist change, it refreshes the reference, safer/shorter approach\n        // than using multiple ifs and refresh only if it changed; there's no benefit in that\n        player.$attachPlaylist(playlistNew);\n        if (playlistNew === undefined && playlistOld !== undefined) {\n          return player.pause();\n        }\n\n        /**\n         * Playlist update logic:\n         * If the player has started ->\n         *   Check if the playing track is in the new Playlist [EXAMPLE BELOW]\n         *   If it is ->\n         *     Assign to it the new tracknumber\n         *   Else ->\n         *     If the new Playlist has some song ->\n         *       Pause the player, and get the new Playlist\n         *     Else ->\n         *       Reset the player, and await for orders\n         *\n         * Else (if the player hasn't started yet)\n         *   Just replace the <src> tags\n         *\n         * Example\n         * playlist: [a,b,c], playing: c, trackNum: 2\n         * ----delay 5 sec-----\n         * playlist: [f,a,b,c], playing: c, trackNum: 3\n         *\n         */\n        if (player.currentTrack) {\n          currentTrack = playlistOld ? playlistOld[player.currentTrack - 1] : -1;\n          for (var i = 0; i < playlistNew.length; i++) {\n            if (angular.equals(playlistNew[i], currentTrack)) { newTrackNum = i; break; }\n          }\n          if (newTrackNum !== null) { // currentTrack it's still in the new playlist, update trackNumber\n            player.currentTrack = newTrackNum + 1;\n            player.tracks = playlistNew.length;\n          } else { // currentTrack has been removed.\n            player.pause();\n            if (playlistNew.length) { // if the new playlist has some elements, replace actual.\n              $timeout(function () { // need $timeout because the mediaTag needs a little time to launch the 'pause' event\n                player.$clearSourceList();\n                player.$addSourceList(playlistNew[0]);\n                player.load();\n                player.tracks = playlistNew.length;\n              });\n            } else { // the new playlist has no elements, clear actual\n              player.reset();\n            }\n          }\n        } else if (playlistNew.length) { // new playlist has elements, load them\n          player.$clearSourceList();\n          player.$addSourceList(playlistNew[0]);\n          player.load();\n          player.tracks = playlistNew.length;\n        } else { // new playlist has no elements, clear actual\n          player.reset();\n        }\n      };\n    }\n\n    return {\n      /**\n       * The directive uses the Scope in which gets declared,\n       * so it can read/write it with ease.\n       * The only isolated Scope here gets created for the MediaPlayer.\n       */\n      scope: false,\n      link: function (scope, element, attrs, ctrl) {\n        var playlistName = attrs.playlist,\n            mediaName = attrs.mediaPlayer || attrs.playerControl;\n\n        var player = new MediaPlayer(element), playlist = scope[playlistName];\n        // create data-structures in the father Scope\n        if (playlistName === undefined) {\n          playlist = []; // local playlist gets defined as new\n        } else if (scope[playlistName] === undefined) {\n          playlist = scope[playlistName] = []; // define playlist on father scope\n        } else {\n          playlist = scope[playlistName];\n        }\n        if (mediaName !== undefined) {\n          scope.$eval(mediaName + ' = player', {player: player});\n        }\n\n        if (element[0].tagName !== 'AUDIO' && element[0].tagName !== 'VIDEO' && element[0].tagName !== 'OGVJS') {\n          return new Error('player directive works only when attached to an <audio>/<video> type tag');\n        }\n        var mediaElement = [],\n            sourceElements = element.find('source');\n\n        // create a single playlist element from <source> tag(s).\n        // if the <source> tag is one, use object notation...\n        if (sourceElements.length === 1) {\n          playlist.unshift({ src: sourceElements[0].src, type: sourceElements[0].type, media: sourceElements[0].media });\n        } else if (sourceElements.length > 1) { // otherwise use array notation\n          angular.forEach(sourceElements, function (sourceElement) {\n            mediaElement.push({ src: sourceElement.src, type: sourceElement.type, media: sourceElement.media });\n          });\n          // put mediaElement as first element in the playlist\n          playlist.unshift(mediaElement);\n        }\n\n        /**\n         * If the user wants to keep track of the playlist changes\n         * has to use data-playlist=\"variableName\" in the <audio>/<video> tag\n         *\n         * Otherwise: it will be created an empty playlist and attached to the player.\n         */\n        if (playlistName === undefined) {\n          player.$attachPlaylist(playlist); // empty playlist case\n        } else if (playlist.length) {\n          playlistWatch(player)(playlist, undefined, scope); // playlist already populated gets bootstrapped\n          scope.$watch(playlistName, playlistWatch(player), true); // then watch gets applied\n        } else {\n          scope.$watch(playlistName, playlistWatch(player), true); // playlist empty, only watch\n        }\n      }\n    };\n\n  }]\n);\n\nangular.module('mediaPlayer.helpers', [])\n.factory('mp.throttle', ['$timeout', function ($timeout) {\n  return function (delay, no_trailing, callback, debounce_mode) {\n    var timeout_id,\n    last_exec = 0;\n\n    if (typeof no_trailing !== 'boolean') {\n      debounce_mode = callback;\n      callback = no_trailing;\n      no_trailing = undefined;\n    }\n\n    var wrapper = function () {\n      var that = this,\n          elapsed = +new Date() - last_exec,\n          args = arguments,\n          exec = function () {\n            last_exec = +new Date();\n            callback.apply(that, args);\n          },\n          clear = function () {\n            timeout_id = undefined;\n          };\n\n      if (debounce_mode && !timeout_id) { exec(); }\n      if (timeout_id) { $timeout.cancel(timeout_id); }\n      if (debounce_mode === undefined && elapsed > delay) {\n        exec();\n      } else if (no_trailing !== true) {\n        timeout_id = $timeout(debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay);\n      }\n    };\n\n    return wrapper;\n  };\n}]);"
  },
  {
    "path": "app/vendor/angularjs-toaster/toaster.css",
    "content": "/*\n * Toastr\n * Version 2.0.1\n * Copyright 2012 John Papa and Hans Fjallemark.\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * Author: John Papa and Hans Fjallemark\n * Project: https://github.com/CodeSeven/toastr\n */\n.toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #ffffff;\n}\n.toast-message a:hover {\n  color: #cccccc;\n  text-decoration: none;\n}\n\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #ffffff;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n\n/*Additional properties for button version\n iOS requires the button element instead of an anchor tag.\n If you want the anchor version, it requires `href=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-center {\n  top: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-center {\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n.toast-center {\n  top: 45%;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  pointer-events: auto;\n  /*overrides*/\n\n}\n#toast-container.toast-center,\n#toast-container.toast-top-center,\n#toast-container.toast-bottom-center{\n  width: 100%;\n  pointer-events: none;\n}\n#toast-container.toast-center > div,\n#toast-container.toast-top-center > div,\n#toast-container.toast-bottom-center > div{\n  margin-left: auto;\n  margin-right: auto;\n  pointer-events: auto;\n}\n#toast-container.toast-center > button,\n#toast-container.toast-top-center > button,\n#toast-container.toast-bottom-center > button{\n  pointer-events: auto;\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > :hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n/*#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}*/\n#toast-container > .toast-wait {\n  background-image: url(\"data:image/gif;base64,R0lGODlhIAAgAIQAAAQCBISGhMzKzERCROTm5CQiJKyurHx+fPz+/ExOTOzu7Dw+PIyOjCwqLFRWVAwKDIyKjMzOzOzq7CQmJLy6vFRSVPTy9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCQAXACwAAAAAIAAgAAAF3eAljmRpnmh6VRSVqLDpIDTixOdUlFSNUDhSQUAT7ES9GnD0SFQAKWItMqr4bqKHVPDI+WiTkaOFFVlrFe83rDrT0qeIjwrT0iLdU0GOiBxhAA4VeSk6QYeIOAsQEAuJKgw+EI8nA18IA48JBAQvFxCXDI8SNAQikV+iiaQIpheWX5mJmxKeF6g0qpQmA4yOu8C7EwYWCgZswRcTFj4KyMAGlwYxDwcHhCXMXxYxBzQHKNo+3DDeCOAn0V/TddbYJA0K48gAEAFQicMWFsfwNA3JSgAIAAFfwIMIL4QAACH5BAkJABoALAAAAAAgACAAhAQCBIyKjERCRMzOzCQiJPTy9DQyNGRmZMTCxOTm5CwqLHx+fBQWFJyenNTW1Pz6/Dw6PGxubAwKDIyOjNTS1CQmJCwuLPz+/Dw+PHRydAAAAAAAAAAAAAAAAAAAAAAAAAXboCaOZGmeaKoxWcSosMkk15W8cZ7VdZaXkcEgQtrxfD9RhHchima1GwlCGUBSFCaFxMrgRtnLFhWujWHhs2nJc8KoVlWGQnEn7/i8XgOwWAB7JwoONQ4KgSQAZRcOgHgSCwsSIhZMNRZ5CzULIgaWF5h4mhecfIQ8jXmQkiODhYeIiRYGjrG2PxgBARi3IhNMAbcCnwI5BAQpAZ8TIwK6vCQVDwUVKL+WzAANTA210g/VJ8OWxQefByQE4dZMzBoInwh4zrtgn2p725YNthUFTNRuGYB3AYGBHCEAACH5BAkJAB0ALAAAAAAgACAAhAQCBISChFRWVMzKzCQiJOTm5GxqbCwuLJSWlPz6/NTW1AwODJSSlGRmZCwqLOzu7HR2dDQ2NAQGBISGhFxaXNTS1CQmJOzq7GxubDQyNKSmpPz+/Nza3AAAAAAAAAAAAAXfYCeOZGmeaKqurHBdAiuP17Zdc0lMAVHWt9yI8LA9fCPB4xEjARoNSWpis01kBpshFahurqzsZosiGpErScMAUO0maKF8Tq/bTQCIQgFp30cQXhB1BHEcXhx0FgkJFiOHVYlzi42AgoRxeRx8fn+en3UABwedKgsBAwMBCygOCjYKDisLFV4VrCUAtVUKpSZdXl8mB8EbByQWcQPFAyYZxccdB7sV0cvBzbmvvG0LBV4FrFTBYCWuNhyyHRTFFB20trh4BxmdYl4YIqepq0IRxRE+IfDCAFQHARo0NGERAgAh+QQJCQAgACwAAAAAIAAgAIUEAgSEgoRMTkzMyswcHhzk5uR0cnQUFhRcXlwsKiz09vQMCgyMiozU1tQkJiR8fnxkZmT8/vwEBgSEhoRcWlzU0tQkIiT08vR0dnQcGhxkYmQ0MjT8+vwMDgyMjozc2twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG+UCQcEgsGo/IpHLJXDweC6Z0+IhEHlOjRGIMWLHZoUZx0RQlAajxkFFKFFYFl5m5KNpIySU+X2bIBEoQZBBZGQdMElFhjI2Oj5AgHQEDAw8dQxYeDBaNHRVWVhWYCXsRFwmMXqFWEyAerB6MA6xWA6+xs7URt6VWqIwTu64gDh4eDp6goaORQ5OVAZjO1EgEGhB4RwAYDQ0YAEwIcBEKFEgYrBhLBORxgUYfrB9LELuF8fNDAAaVBuEg7NXCVyRdqHVCGLBiIIQAB1Yc4BXh9uEbwAXuyi2iQI7DuSwHdiFqCEGDtizLRFUDsaGAlQIbVoJYIEDAIiZBAAAh+QQJCQAbACwAAAAAIAAgAIQEAgSMioxcWlz08vQcHhysqqwMDgx8enwsKiykoqRkZmT8+vzEwsQMCgyUlpQkJiS0srQEBgSMjoxcXlz09vQkIiSsrqwUEhQ0MjRsamz8/vwAAAAAAAAAAAAAAAAAAAAF7+AmjmRpnmiqruz2PG0sIssCj4CQJAIgj4/abRNJaI6agu9kCAQaphdJgEQKUIFjgGWsahJYLdf7RTWfLKr3+jsBClVlG5Xb9eb4fImgUBBKDVB4ExRHFGwbGRQLGXMEhUgUfw2QC4IyCmSNDQtHlm2ZXgoiGQsUjW0EnUgLfyKBeYSeiHojfH61uS0GBisVEgEVLRcWRxAXKAgDRwMILMVIECgSVRIrBmS9JtRI1iMVBweuGxerSNolyszOIhjLGs0jEFXSKA8SEkMbcEgWIxfzNBxrw6AKgxIGkM05UOWALhERHJhysOThBgAVWYQAACH5BAkJABkALAAAAAAgACAAhAQGBIyKjERCRMzOzCwuLGRiZPz6/OTm5AwODLSytFRSVNTW1Dw6PHx6fAwKDJSSlERGRNTS1DQyNGxqbPz+/BQSFLy6vFRWVNza3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAXqYCaO5FgFwxBUZeu61ULNFMa+eBvQdJD/owFvFhkBBAwHsBQZUooZyWF2YOQkBNJu6ANMaQeli0AxSEwymi0DcUJeEgPlbEJFAghRe/h+Eeg/Dl9UYks5DF9VhksOAgKFi5GSSwh5kzgVCXIJNxknD5aSCTwJIw8zD5MITpanFKmSCHI8NxUPoJejNKWXLZkznL0vCJ3CxsckDpA/ChYJFzkTBgYTSxc80C4OswbLLhY8Fi/bMwYAJVgl4DTiL9LUJADrFuci1zTZLwD1IwU8BSQuWLCQb1EDHg2QiSDALYvCDAISJLDy8FIIACH5BAkJAB4ALAAAAAAgACAAhAQGBISGhFRSVNTW1CQiJKyqrGRmZOzu7CwuLIyOjGxubPz6/BQSFGRiZOTi5CwqLLy6vDQ2NIyKjFRWVCQmJKyurGxqbPT29DQyNJSSlHRydPz+/BQWFOzq7AAAAAAAAAXhoCeOJElYClGubOs117YtjWuvxCLLi3qbhc6h4FPsdorfiNI5dige43GT9AAkHUcCwCpMNxVP7tgTJY4J1uF7EBl0M8Ooueuo2SOCIkVa11kVX2E2EmgsFH4yBz4uAAkdHVstBAUHQ4xKmZqbnJ2bAhAQAiURGJ4eE0cTIxgzpp0QRxCsrp6xO7MjpaepO6unKxOhv8DFxsfIJBwaChw2DAkZDEocDjIOzi0ZMhlKUjIaLtsb3T8aR+EtDBkJ0yQUBQVQI9XX2ZsDMgMlyxr3mzE2XEgmotCGAARFIHiQ0FMIACH5BAkJABgALAAAAAAgACAAhAQCBISGhDw+POTi5CwuLLS2tPTy9BQSFJyenGRiZDQ2NIyOjLy+vPz6/BweHIyKjFRSVOzq7DQyNLy6vBQWFHRydDw6PPz+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXICaOZHkcZaquIjVd10SxtFrAcFGrVhBYIwoON9uNAsOA6DCEFTEKBEKxEjQvAtELNxkpGrAGNfW4Plpb2QgxRKjKzfPoVGLj3CnLNUv7hscpSDhKOxJSgDwPP0ZGAACMjAQFDQYFBJA0BAZDBpeYGBQVFUU3TV2YFAMwAzNgTQ2PkBVDFRiuQ7CYszi1pUOnkKmrM5qcnqiiTwQTDQ2Wn9DR0tPUfRKQEBEREDQSFw3XRhEwEd3f4TvjF+XWKgJ8JNnb0QkwCdUlCzAL+CQODAwc9BtIMAQAOw==\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51a351;\n}\n.toast-error {\n  background-color: #bd362f;\n}\n.toast-info {\n  background-color: #2f96b4;\n}\n.toast-wait {\n  background-color: #2f96b4;\n}\n.toast-warning {\n  background-color: #f89406;\n}\n\n#toast-container > .toast-info {\n  background-color: #404040;\n  border-radius: 3px;\n  box-shadow: 0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);\n  color: #fff;\n  line-height: 20px;\n  padding: 16px;\n  font-size: 13px;\n  text-align: center;\n}\n\n\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n}\n  }\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container  > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n}\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}\n\n /*\n  * AngularJS-Toaster\n  * Version 0.3\n */\n:not(.no-enter)#toast-container > div.ng-enter,\n:not(.no-leave)#toast-container > div.ng-leave\n{\n    -webkit-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n    -moz-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n    -ms-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n    -o-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n    transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n}\n\n:not(.no-enter)#toast-container > div.ng-enter.ng-enter-active,\n:not(.no-leave)#toast-container > div.ng-leave {\n    opacity: 0.8;\n}\n\n:not(.no-leave)#toast-container > div.ng-leave.ng-leave-active,\n:not(.no-enter)#toast-container > div.ng-enter {\n    opacity: 0;\n}"
  },
  {
    "path": "app/vendor/angularjs-toaster/toaster.js",
    "content": "/* global angular */\n(function(window, document) {\n    'use strict';\n\n    /*\n     * AngularJS Toaster\n     * Version: 2.0.0\n     *\n     * Copyright 2013-2016 Jiri Kavulak.\n     * All Rights Reserved.\n     * Use, reproduction, distribution, and modification of this code is subject to the terms and\n     * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n     *\n     * Author: Jiri Kavulak\n     * Related to project of John Papa, Hans Fjällemark and Nguyễn Thiện Hùng (thienhung1989)\n     */\n\n    angular.module('toaster', []).constant(\n        'toasterConfig', {\n            'limit': 0,                   // limits max number of toasts\n            'tap-to-dismiss': true,\n            'close-button': false,\n            'close-html': '<button class=\"toast-close-button\" type=\"button\">&times;</button>',\n            'newest-on-top': true,\n            'time-out': 5000,\n            'icon-classes': {\n                error: 'toast-error',\n                info: 'toast-info',\n                wait: 'toast-wait',\n                success: 'toast-success',\n                warning: 'toast-warning'\n            },\n            'body-output-type': '', // Options: '', 'trustedHtml', 'template', 'templateWithData', 'directive'\n            'body-template': 'toasterBodyTmpl.html',\n            'icon-class': 'toast-info',\n            'position-class': 'toast-top-right', // Options (see CSS):\n            // 'toast-top-full-width', 'toast-bottom-full-width', 'toast-center',\n            // 'toast-top-left', 'toast-top-center', 'toast-top-right',\n            // 'toast-bottom-left', 'toast-bottom-center', 'toast-bottom-right',\n            'title-class': 'toast-title',\n            'message-class': 'toast-message',\n            'prevent-duplicates': false,\n            'mouseover-timer-stop': true // stop timeout on mouseover and restart timer on mouseout\n        }\n    ).service(\n        'toaster', [\n            '$rootScope', 'toasterConfig', function($rootScope, toasterConfig) {\n                // http://stackoverflow.com/questions/26501688/a-typescript-guid-class\n                var Guid = (function() {\n                    var Guid = {};\n                    Guid.newGuid = function() {\n                        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n                            var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n                            return v.toString(16);\n                        });\n                    };\n                    return Guid;\n                }());\n\n                this.pop = function(type, title, body, timeout, bodyOutputType, clickHandler, toasterId, showCloseButton, toastId, onHideCallback) {\n                    if (angular.isObject(type)) {\n                        var params = type; // Enable named parameters as pop argument\n                        this.toast = {\n                            type: params.type,\n                            title: params.title,\n                            body: params.body,\n                            timeout: params.timeout,\n                            bodyOutputType: params.bodyOutputType,\n                            clickHandler: params.clickHandler,\n                            showCloseButton: params.showCloseButton,\n                            closeHtml: params.closeHtml,\n                            toastId: params.toastId,\n                            onShowCallback: params.onShowCallback,\n                            onHideCallback: params.onHideCallback,\n                            directiveData: params.directiveData\n                        };\n                        toasterId = params.toasterId;\n                    } else {\n                        this.toast = {\n                            type: type,\n                            title: title,\n                            body: body,\n                            timeout: timeout,\n                            bodyOutputType: bodyOutputType,\n                            clickHandler: clickHandler,\n                            showCloseButton: showCloseButton,\n                            toastId: toastId,\n                            onHideCallback: onHideCallback\n                        };\n                    }\n\n                    if (!this.toast.toastId || !this.toast.toastId.length) {\n                        this.toast.toastId = Guid.newGuid();\n                    }\n\n                    $rootScope.$emit('toaster-newToast', toasterId, this.toast.toastId);\n                    \n                    return {\n                        toasterId: toasterId,\n                        toastId: this.toast.toastId\n                    };\n                };\n\n                this.clear = function(toasterId, toastId) {\n                    if (angular.isObject(toasterId)) {\n                        $rootScope.$emit('toaster-clearToasts', toasterId.toasterId, toasterId.toastId);\n                    } else {\n                        $rootScope.$emit('toaster-clearToasts', toasterId, toastId);\n                    }\n                };\n\n                // Create one method per icon class, to allow to call toaster.info() and similar\n                for (var type in toasterConfig['icon-classes']) {\n                    this[type] = createTypeMethod(type);\n                }\n\n                function createTypeMethod(toasterType) {\n                    return function(title, body, timeout, bodyOutputType, clickHandler, toasterId, showCloseButton, toastId, onHideCallback) {\n                        if (angular.isString(title)) {\n                            return this.pop(\n                                toasterType,\n                                title,\n                                body,\n                                timeout,\n                                bodyOutputType,\n                                clickHandler,\n                                toasterId,\n                                showCloseButton,\n                                toastId,\n                                onHideCallback);\n                        } else { // 'title' is actually an object with options\n                            return this.pop(angular.extend(title, { type: toasterType }));\n                        }\n                    };\n                }\n            }]\n        ).factory(\n        'toasterEventRegistry', [\n            '$rootScope', function($rootScope) {\n                var deregisterNewToast = null, deregisterClearToasts = null, newToastEventSubscribers = [], clearToastsEventSubscribers = [], toasterFactory;\n\n                toasterFactory = {\n                    setup: function() {\n                        if (!deregisterNewToast) {\n                            deregisterNewToast = $rootScope.$on(\n                                'toaster-newToast', function(event, toasterId, toastId) {\n                                    for (var i = 0, len = newToastEventSubscribers.length; i < len; i++) {\n                                        newToastEventSubscribers[i](event, toasterId, toastId);\n                                    }\n                                });\n                        }\n\n                        if (!deregisterClearToasts) {\n                            deregisterClearToasts = $rootScope.$on(\n                                'toaster-clearToasts', function(event, toasterId, toastId) {\n                                    for (var i = 0, len = clearToastsEventSubscribers.length; i < len; i++) {\n                                        clearToastsEventSubscribers[i](event, toasterId, toastId);\n                                    }\n                                });\n                        }\n                    },\n\n                    subscribeToNewToastEvent: function(onNewToast) {\n                        newToastEventSubscribers.push(onNewToast);\n                    },\n                    subscribeToClearToastsEvent: function(onClearToasts) {\n                        clearToastsEventSubscribers.push(onClearToasts);\n                    },\n                    unsubscribeToNewToastEvent: function(onNewToast) {\n                        var index = newToastEventSubscribers.indexOf(onNewToast);\n                        if (index >= 0) {\n                            newToastEventSubscribers.splice(index, 1);\n                        }\n\n                        if (newToastEventSubscribers.length === 0) {\n                            deregisterNewToast();\n                            deregisterNewToast = null;\n                        }\n                    },\n                    unsubscribeToClearToastsEvent: function(onClearToasts) {\n                        var index = clearToastsEventSubscribers.indexOf(onClearToasts);\n                        if (index >= 0) {\n                            clearToastsEventSubscribers.splice(index, 1);\n                        }\n\n                        if (clearToastsEventSubscribers.length === 0) {\n                            deregisterClearToasts();\n                            deregisterClearToasts = null;\n                        }\n                    }\n                };\n                return {\n                    setup: toasterFactory.setup,\n                    subscribeToNewToastEvent: toasterFactory.subscribeToNewToastEvent,\n                    subscribeToClearToastsEvent: toasterFactory.subscribeToClearToastsEvent,\n                    unsubscribeToNewToastEvent: toasterFactory.unsubscribeToNewToastEvent,\n                    unsubscribeToClearToastsEvent: toasterFactory.unsubscribeToClearToastsEvent\n                };\n            }]\n        )\n        .directive('directiveTemplate', ['$compile', '$injector', function($compile, $injector) {\n            return {\n                restrict: 'A',\n                scope: {\n                    directiveName: '@directiveName',\n                    directiveData: '@directiveData'\n                },\n                replace: true,\n                link: function(scope, elm, attrs) {\n                    scope.$watch('directiveName', function(directiveName) {\n                        if (angular.isUndefined(directiveName) || directiveName.length <= 0)\n                            throw new Error('A valid directive name must be provided via the toast body argument when using bodyOutputType: directive');\n\n                        var directive;\n\n                        try {\n                            directive = $injector.get(attrs.$normalize(directiveName) + 'Directive');\n                        } catch (e) {\n                            throw new Error(directiveName + ' could not be found. ' +\n                                'The name should appear as it exists in the markup, not camelCased as it would appear in the directive declaration,' +\n                                ' e.g. directive-name not directiveName.');\n                        }\n\n\n                        var directiveDetails = directive[0];\n\n                        if (directiveDetails.scope !== true && directiveDetails.scope) {\n                            throw new Error('Cannot use a directive with an isolated scope. ' +\n                                'The scope must be either true or falsy (e.g. false/null/undefined). ' +\n                                'Occurred for directive ' + directiveName + '.');\n                        }\n\n                        if (directiveDetails.restrict.indexOf('A') < 0) {\n                            throw new Error('Directives must be usable as attributes. ' +\n                                'Add \"A\" to the restrict option (or remove the option entirely). Occurred for directive ' +\n                                directiveName + '.');\n                        }\n\n                        if (scope.directiveData)\n                            scope.directiveData = angular.fromJson(scope.directiveData);\n\n                        var template = $compile('<div ' + directiveName + '></div>')(scope);\n\n                        elm.append(template);\n                    });\n                }\n            };\n        }])\n        .directive(\n        'toasterContainer', [\n            '$parse', '$rootScope', '$interval', '$sce', 'toasterConfig', 'toaster', 'toasterEventRegistry',\n            function($parse, $rootScope, $interval, $sce, toasterConfig, toaster, toasterEventRegistry) {\n                return {\n                    replace: true,\n                    restrict: 'EA',\n                    scope: true, // creates an internal scope for this directive (one per directive instance)\n                    link: function(scope, elm, attrs) {\n                        var mergedConfig;\n\n                        // Merges configuration set in directive with default one\n                        mergedConfig = angular.extend({}, toasterConfig, scope.$eval(attrs.toasterOptions));\n\n                        scope.config = {\n                            toasterId: mergedConfig['toaster-id'],\n                            position: mergedConfig['position-class'],\n                            title: mergedConfig['title-class'],\n                            message: mergedConfig['message-class'],\n                            tap: mergedConfig['tap-to-dismiss'],\n                            closeButton: mergedConfig['close-button'],\n                            closeHtml: mergedConfig['close-html'],\n                            animation: mergedConfig['animation-class'],\n                            mouseoverTimer: mergedConfig['mouseover-timer-stop']\n                        };\n\n                        scope.$on(\n                            \"$destroy\", function() {\n                                toasterEventRegistry.unsubscribeToNewToastEvent(scope._onNewToast);\n                                toasterEventRegistry.unsubscribeToClearToastsEvent(scope._onClearToasts);\n                            }\n                        );\n\n                        function setTimeout(toast, time) {\n                            toast.timeoutPromise = $interval(\n                                function() {\n                                    scope.removeToast(toast.toastId);\n                                }, time, 1\n                            );\n                        }\n\n                        scope.configureTimer = function(toast) {\n                            var timeout = angular.isNumber(toast.timeout) ? toast.timeout : mergedConfig['time-out'];\n                            if (typeof timeout === \"object\") timeout = timeout[toast.type];\n                            if (timeout > 0) {\n                                setTimeout(toast, timeout);\n                            }\n                        };\n\n                        function addToast(toast, toastId) {\n                            toast.type = mergedConfig['icon-classes'][toast.type];\n                            if (!toast.type) {\n                                toast.type = mergedConfig['icon-class'];\n                            }\n\n                            if (mergedConfig['prevent-duplicates'] === true && scope.toasters.length) {\n                                if (scope.toasters[scope.toasters.length - 1].body === toast.body) {\n                                    return;\n                                } else {\n                                    var i, len, dupFound = false;\n                                    for (i = 0, len = scope.toasters.length; i < len; i++) {\n                                        if (scope.toasters[i].toastId === toastId) {\n                                            dupFound = true;\n                                            break;\n                                        }\n                                    }\n                                    \n                                    if (dupFound) return;\n                                }\n                            }\n\n\n                            // set the showCloseButton property on the toast so that\n                            // each template can bind directly to the property to show/hide\n                            // the close button\n                            var closeButton = mergedConfig['close-button'];\n\n                            // if toast.showCloseButton is a boolean value,\n                            // it was specifically overriden in the pop arguments\n                            if (typeof toast.showCloseButton === \"boolean\") {\n\n                            } else if (typeof closeButton === \"boolean\") {\n                                toast.showCloseButton = closeButton;\n                            } else if (typeof closeButton === \"object\") {\n                                var closeButtonForType = closeButton[toast.type];\n\n                                if (typeof closeButtonForType !== \"undefined\" && closeButtonForType !== null) {\n                                    toast.showCloseButton = closeButtonForType;\n                                }\n                            } else {\n                                // if an option was not set, default to false.\n                                toast.showCloseButton = false;\n                            }\n\n                            if (toast.showCloseButton) {\n                                toast.closeHtml = $sce.trustAsHtml(toast.closeHtml || scope.config.closeHtml);\n                            }\n\n                            // Set the toast.bodyOutputType to the default if it isn't set\n                            toast.bodyOutputType = toast.bodyOutputType || mergedConfig['body-output-type'];\n                            switch (toast.bodyOutputType) {\n                                case 'trustedHtml':\n                                    toast.html = $sce.trustAsHtml(toast.body);\n                                    break;\n                                case 'template':\n                                    toast.bodyTemplate = toast.body || mergedConfig['body-template'];\n                                    break;\n                                case 'templateWithData':\n                                    var fcGet = $parse(toast.body || mergedConfig['body-template']);\n                                    var templateWithData = fcGet(scope);\n                                    toast.bodyTemplate = templateWithData.template;\n                                    toast.data = templateWithData.data;\n                                    break;\n                                case 'directive':\n                                    toast.html = toast.body;\n                                    break;\n                            }\n\n                            scope.configureTimer(toast);\n\n                            if (mergedConfig['newest-on-top'] === true) {\n                                scope.toasters.unshift(toast);\n                                if (mergedConfig['limit'] > 0 && scope.toasters.length > mergedConfig['limit']) {\n                                    scope.toasters.pop();\n                                }\n                            } else {\n                                scope.toasters.push(toast);\n                                if (mergedConfig['limit'] > 0 && scope.toasters.length > mergedConfig['limit']) {\n                                    scope.toasters.shift();\n                                }\n                            }\n\n                            if (angular.isFunction(toast.onShowCallback)) {\n                                toast.onShowCallback();\n                            }\n                        }\n\n                        scope.removeToast = function(toastId) {\n                            var i, len;\n                            for (i = 0, len = scope.toasters.length; i < len; i++) {\n                                if (scope.toasters[i].toastId === toastId) {\n                                    removeToast(i);\n                                    break;\n                                }\n                            }\n                        };\n\n                        function removeToast(toastIndex) {\n                            var toast = scope.toasters[toastIndex];\n\n                            // toast is always defined since the index always has a match\n                            if (toast.timeoutPromise) {\n                                $interval.cancel(toast.timeoutPromise);\n                            }\n                            scope.toasters.splice(toastIndex, 1);\n\n                            if (angular.isFunction(toast.onHideCallback)) {\n                                toast.onHideCallback();\n                            }\n                        }\n\n                        function removeAllToasts(toastId) {\n                            for (var i = scope.toasters.length - 1; i >= 0; i--) {\n                                if (isUndefinedOrNull(toastId)) {\n                                    removeToast(i);\n                                } else {\n                                    if (scope.toasters[i].toastId == toastId) {\n                                        removeToast(i);\n                                    }\n                                }\n                            }\n                        }\n\n                        scope.toasters = [];\n\n                        function isUndefinedOrNull(val) {\n                            return angular.isUndefined(val) || val === null;\n                        }\n\n                        scope._onNewToast = function(event, toasterId, toastId) {\n                            // Compatibility: if toaster has no toasterId defined, and if call to display\n                            // hasn't either, then the request is for us\n\n                            if ((isUndefinedOrNull(scope.config.toasterId) && isUndefinedOrNull(toasterId)) || (!isUndefinedOrNull(scope.config.toasterId) && !isUndefinedOrNull(toasterId) && scope.config.toasterId == toasterId)) {\n                                addToast(toaster.toast, toastId);\n                            }\n                        };\n                        scope._onClearToasts = function(event, toasterId, toastId) {\n                            // Compatibility: if toaster has no toasterId defined, and if call to display\n                            // hasn't either, then the request is for us\n                            if (toasterId == '*' || (isUndefinedOrNull(scope.config.toasterId) && isUndefinedOrNull(toasterId)) || (!isUndefinedOrNull(scope.config.toasterId) && !isUndefinedOrNull(toasterId) && scope.config.toasterId == toasterId)) {\n                                removeAllToasts(toastId);\n                            }\n                        };\n\n                        toasterEventRegistry.setup();\n\n                        toasterEventRegistry.subscribeToNewToastEvent(scope._onNewToast);\n                        toasterEventRegistry.subscribeToClearToastsEvent(scope._onClearToasts);\n                    },\n                    controller: [\n                        '$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n                            // Called on mouseover\n                            $scope.stopTimer = function(toast) {\n                                if ($scope.config.mouseoverTimer === true) {\n                                    if (toast.timeoutPromise) {\n                                        $interval.cancel(toast.timeoutPromise);\n                                        toast.timeoutPromise = null;\n                                    }\n                                }\n                            };\n\n                            // Called on mouseout\n                            $scope.restartTimer = function(toast) {\n                                if ($scope.config.mouseoverTimer === true) {\n                                    if (!toast.timeoutPromise) {\n                                        $scope.configureTimer(toast);\n                                    }\n                                } else if (toast.timeoutPromise === null) {\n                                    $scope.removeToast(toast.toastId);\n                                }\n                            };\n\n                            $scope.click = function(toast, isCloseButton) {\n                                if ($scope.config.tap === true || (toast.showCloseButton === true && isCloseButton === true)) {\n                                    var removeToast = true;\n                                    if (toast.clickHandler) {\n                                        if (angular.isFunction(toast.clickHandler)) {\n                                            removeToast = toast.clickHandler(toast, isCloseButton);\n                                        } else if (angular.isFunction($scope.$parent.$eval(toast.clickHandler))) {\n                                            removeToast = $scope.$parent.$eval(toast.clickHandler)(toast, isCloseButton);\n                                        } else {\n                                            console.log(\"TOAST-NOTE: Your click handler is not inside a parent scope of toaster-container.\");\n                                        }\n                                    }\n                                    if (removeToast) {\n                                        $scope.removeToast(toast.toastId);\n                                    }\n                                }\n                            };\n                        }],\n                    template:\n                    '<div id=\"toast-container\" ng-class=\"[config.position, config.animation]\">' +\n                    '<div ng-repeat=\"toaster in toasters\" class=\"toast\" ng-class=\"toaster.type\" ng-click=\"click(toaster)\" ng-mouseover=\"stopTimer(toaster)\" ng-mouseout=\"restartTimer(toaster)\">' +\n                    '<div ng-if=\"toaster.showCloseButton\" ng-click=\"click(toaster, true)\" ng-bind-html=\"toaster.closeHtml\"></div>' +\n                    '<div ng-class=\"config.title\">{{toaster.title}}</div>' +\n                    '<div ng-class=\"config.message\" ng-switch on=\"toaster.bodyOutputType\">' +\n                    '<div ng-switch-when=\"trustedHtml\" ng-bind-html=\"toaster.html\"></div>' +\n                    '<div ng-switch-when=\"template\"><div ng-include=\"toaster.bodyTemplate\"></div></div>' +\n                    '<div ng-switch-when=\"templateWithData\"><div ng-include=\"toaster.bodyTemplate\"></div></div>' +\n                    '<div ng-switch-when=\"directive\"><div directive-template directive-name=\"{{toaster.html}}\" directive-data=\"{{toaster.directiveData}}\"></div></div>' +\n                    '<div ng-switch-default >{{toaster.body}}</div>' +\n                    '</div>' +\n                    '</div>' +\n                    '</div>'\n                };\n            }]\n        );\n})(window, document);"
  },
  {
    "path": "app/vendor/bootstrap/config.json",
    "content": "{\n  \"vars\": {\n    \"@gray-darker\": \"lighten(#000, 13.5%)\",\n    \"@gray-dark\": \"lighten(#000, 20%)\",\n    \"@gray\": \"lighten(#000, 33.5%)\",\n    \"@gray-light\": \"lighten(#000, 60%)\",\n    \"@gray-lighter\": \"lighten(#000, 93.5%)\",\n    \"@brand-primary\": \"#5d8db3\",\n    \"@brand-success\": \"#6AC065\",\n    \"@brand-info\": \"#5bc0de\",\n    \"@brand-warning\": \"#f0ad4e\",\n    \"@brand-danger\": \"#c05f5a\",\n    \"@body-bg\": \"#fff\",\n    \"@text-color\": \"#000\",\n    \"@link-color\": \"#3a6d99\",\n    \"@link-hover-color\": \"#3a6d99\",\n    \"@font-family-sans-serif\": \"\\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif\",\n    \"@font-family-serif\": \"Georgia, \\\"Times New Roman\\\", Times, serif\",\n    \"@font-family-monospace\": \"Menlo, Monaco, Consolas, \\\"Courier New\\\", monospace\",\n    \"@font-family-base\": \"@font-family-sans-serif\",\n    \"@font-size-base\": \"14px\",\n    \"@font-size-large\": \"ceil((@font-size-base * 1.25))\",\n    \"@font-size-small\": \"ceil((@font-size-base * 0.85))\",\n    \"@font-size-h1\": \"floor((@font-size-base * 2.6))\",\n    \"@font-size-h2\": \"floor((@font-size-base * 2.15))\",\n    \"@font-size-h3\": \"ceil((@font-size-base * 1.7))\",\n    \"@font-size-h4\": \"ceil((@font-size-base * 1.25))\",\n    \"@font-size-h5\": \"@font-size-base\",\n    \"@font-size-h6\": \"ceil((@font-size-base * 0.85))\",\n    \"@line-height-base\": \"1.428571429\",\n    \"@line-height-computed\": \"floor((@font-size-base * @line-height-base))\",\n    \"@headings-font-family\": \"inherit\",\n    \"@headings-font-weight\": \"500\",\n    \"@headings-line-height\": \"1.1\",\n    \"@headings-color\": \"inherit\",\n    \"@icon-font-path\": \"\\\"../fonts/\\\"\",\n    \"@icon-font-name\": \"\\\"glyphicons-halflings-regular\\\"\",\n    \"@icon-font-svg-id\": \"\\\"glyphicons_halflingsregular\\\"\",\n    \"@padding-base-vertical\": \"6px\",\n    \"@padding-base-horizontal\": \"12px\",\n    \"@padding-large-vertical\": \"10px\",\n    \"@padding-large-horizontal\": \"16px\",\n    \"@padding-small-vertical\": \"5px\",\n    \"@padding-small-horizontal\": \"10px\",\n    \"@padding-xs-vertical\": \"1px\",\n    \"@padding-xs-horizontal\": \"5px\",\n    \"@line-height-large\": \"1.33\",\n    \"@line-height-small\": \"1.5\",\n    \"@border-radius-base\": \"4px\",\n    \"@border-radius-large\": \"6px\",\n    \"@border-radius-small\": \"3px\",\n    \"@component-active-color\": \"#fff\",\n    \"@component-active-bg\": \"@brand-primary\",\n    \"@caret-width-base\": \"4px\",\n    \"@caret-width-large\": \"5px\",\n    \"@table-cell-padding\": \"8px\",\n    \"@table-condensed-cell-padding\": \"5px\",\n    \"@table-bg\": \"transparent\",\n    \"@table-bg-accent\": \"#f9f9f9\",\n    \"@table-bg-hover\": \"#f5f5f5\",\n    \"@table-bg-active\": \"@table-bg-hover\",\n    \"@table-border-color\": \"#ddd\",\n    \"@btn-font-weight\": \"normal\",\n    \"@btn-default-color\": \"#333\",\n    \"@btn-default-bg\": \"#fff\",\n    \"@btn-default-border\": \"#ccc\",\n    \"@btn-primary-color\": \"#fff\",\n    \"@btn-primary-bg\": \"@brand-primary\",\n    \"@btn-primary-border\": \"@btn-primary-bg\",\n    \"@btn-success-color\": \"#fff\",\n    \"@btn-success-bg\": \"@brand-success\",\n    \"@btn-success-border\": \"@btn-success-bg\",\n    \"@btn-info-color\": \"#fff\",\n    \"@btn-info-bg\": \"@brand-info\",\n    \"@btn-info-border\": \"@btn-info-bg\",\n    \"@btn-warning-color\": \"#fff\",\n    \"@btn-warning-bg\": \"@brand-warning\",\n    \"@btn-warning-border\": \"@btn-warning-bg\",\n    \"@btn-danger-color\": \"#fff\",\n    \"@btn-danger-bg\": \"@brand-danger\",\n    \"@btn-danger-border\": \"@btn-danger-bg\",\n    \"@btn-link-disabled-color\": \"@gray-light\",\n    \"@input-bg\": \"#fff\",\n    \"@input-bg-disabled\": \"@gray-lighter\",\n    \"@input-color\": \"#000\",\n    \"@input-border\": \"#ccc\",\n    \"@input-border-radius\": \"@border-radius-base\",\n    \"@input-border-focus\": \"#66afe9\",\n    \"@input-color-placeholder\": \"#9aa2ab\",\n    \"@input-height-base\": \"(@line-height-computed + (@padding-base-vertical * 2) + 2)\",\n    \"@input-height-large\": \"(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)\",\n    \"@input-height-small\": \"(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)\",\n    \"@legend-color\": \"@gray-dark\",\n    \"@legend-border-color\": \"#e5e5e5\",\n    \"@input-group-addon-bg\": \"@gray-lighter\",\n    \"@input-group-addon-border-color\": \"@input-border\",\n    \"@dropdown-bg\": \"#fff\",\n    \"@dropdown-border\": \"rgba(0,0,0,.15)\",\n    \"@dropdown-fallback-border\": \"#ccc\",\n    \"@dropdown-divider-bg\": \"#e5e5e5\",\n    \"@dropdown-link-color\": \"@gray-dark\",\n    \"@dropdown-link-hover-color\": \"darken(@gray-dark, 5%)\",\n    \"@dropdown-link-hover-bg\": \"#f5f5f5\",\n    \"@dropdown-link-active-color\": \"@component-active-color\",\n    \"@dropdown-link-active-bg\": \"@component-active-bg\",\n    \"@dropdown-link-disabled-color\": \"@gray-light\",\n    \"@dropdown-header-color\": \"@gray-light\",\n    \"@dropdown-caret-color\": \"#000\",\n    \"@screen-xs\": \"480px\",\n    \"@screen-xs-min\": \"@screen-xs\",\n    \"@screen-phone\": \"@screen-xs-min\",\n    \"@screen-sm\": \"768px\",\n    \"@screen-sm-min\": \"@screen-sm\",\n    \"@screen-tablet\": \"@screen-sm-min\",\n    \"@screen-md\": \"992px\",\n    \"@screen-md-min\": \"@screen-md\",\n    \"@screen-desktop\": \"@screen-md-min\",\n    \"@screen-lg\": \"1200px\",\n    \"@screen-lg-min\": \"@screen-lg\",\n    \"@screen-lg-desktop\": \"@screen-lg-min\",\n    \"@screen-xs-max\": \"(@screen-sm-min - 1)\",\n    \"@screen-sm-max\": \"(@screen-md-min - 1)\",\n    \"@screen-md-max\": \"(@screen-lg-min - 1)\",\n    \"@grid-columns\": \"12\",\n    \"@grid-gutter-width\": \"0\",\n    \"@grid-float-breakpoint\": \"@screen-xs\",\n    \"@grid-float-breakpoint-max\": \"(@grid-float-breakpoint - 1)\",\n    \"@container-tablet\": \"((720px + @grid-gutter-width))\",\n    \"@container-sm\": \"@container-tablet\",\n    \"@container-desktop\": \"((940px + @grid-gutter-width))\",\n    \"@container-md\": \"@container-desktop\",\n    \"@container-large-desktop\": \"((1140px + @grid-gutter-width))\",\n    \"@container-lg\": \"@container-large-desktop\",\n    \"@navbar-height\": \"44px\",\n    \"@navbar-margin-bottom\": \"@line-height-computed\",\n    \"@navbar-border-radius\": \"@border-radius-base\",\n    \"@navbar-padding-horizontal\": \"floor((@grid-gutter-width / 2))\",\n    \"@navbar-padding-vertical\": \"((@navbar-height - @line-height-computed) / 2)\",\n    \"@navbar-collapse-max-height\": \"340px\",\n    \"@navbar-default-color\": \"#777\",\n    \"@navbar-default-bg\": \"#f8f8f8\",\n    \"@navbar-default-border\": \"darken(@navbar-default-bg, 6.5%)\",\n    \"@navbar-default-link-color\": \"#777\",\n    \"@navbar-default-link-hover-color\": \"#333\",\n    \"@navbar-default-link-hover-bg\": \"transparent\",\n    \"@navbar-default-link-active-color\": \"#555\",\n    \"@navbar-default-link-active-bg\": \"darken(@navbar-default-bg, 6.5%)\",\n    \"@navbar-default-link-disabled-color\": \"#ccc\",\n    \"@navbar-default-link-disabled-bg\": \"transparent\",\n    \"@navbar-default-brand-color\": \"@navbar-default-link-color\",\n    \"@navbar-default-brand-hover-color\": \"darken(@navbar-default-brand-color, 10%)\",\n    \"@navbar-default-brand-hover-bg\": \"transparent\",\n    \"@navbar-default-toggle-hover-bg\": \"#ddd\",\n    \"@navbar-default-toggle-icon-bar-bg\": \"#888\",\n    \"@navbar-default-toggle-border-color\": \"#ddd\",\n    \"@navbar-inverse-color\": \"@gray-light\",\n    \"@navbar-inverse-bg\": \"#497495\",\n    \"@navbar-inverse-border\": \"darken(@navbar-inverse-bg, 10%)\",\n    \"@navbar-inverse-link-color\": \"@gray-light\",\n    \"@navbar-inverse-link-hover-color\": \"#fff\",\n    \"@navbar-inverse-link-hover-bg\": \"transparent\",\n    \"@navbar-inverse-link-active-color\": \"@navbar-inverse-link-hover-color\",\n    \"@navbar-inverse-link-active-bg\": \"darken(@navbar-inverse-bg, 10%)\",\n    \"@navbar-inverse-link-disabled-color\": \"#444\",\n    \"@navbar-inverse-link-disabled-bg\": \"transparent\",\n    \"@navbar-inverse-brand-color\": \"@navbar-inverse-link-color\",\n    \"@navbar-inverse-brand-hover-color\": \"#fff\",\n    \"@navbar-inverse-brand-hover-bg\": \"transparent\",\n    \"@navbar-inverse-toggle-hover-bg\": \"#333\",\n    \"@navbar-inverse-toggle-icon-bar-bg\": \"#fff\",\n    \"@navbar-inverse-toggle-border-color\": \"#333\",\n    \"@nav-link-padding\": \"10px 15px\",\n    \"@nav-link-hover-bg\": \"@gray-lighter\",\n    \"@nav-disabled-link-color\": \"@gray-light\",\n    \"@nav-disabled-link-hover-color\": \"@gray-light\",\n    \"@nav-open-link-hover-color\": \"#fff\",\n    \"@nav-tabs-border-color\": \"#ddd\",\n    \"@nav-tabs-link-hover-border-color\": \"@gray-lighter\",\n    \"@nav-tabs-active-link-hover-bg\": \"@body-bg\",\n    \"@nav-tabs-active-link-hover-color\": \"@gray\",\n    \"@nav-tabs-active-link-hover-border-color\": \"#ddd\",\n    \"@nav-tabs-justified-link-border-color\": \"#ddd\",\n    \"@nav-tabs-justified-active-link-border-color\": \"@body-bg\",\n    \"@nav-pills-border-radius\": \"@border-radius-base\",\n    \"@nav-pills-active-link-hover-bg\": \"@component-active-bg\",\n    \"@nav-pills-active-link-hover-color\": \"@component-active-color\",\n    \"@pagination-color\": \"@link-color\",\n    \"@pagination-bg\": \"#fff\",\n    \"@pagination-border\": \"#ddd\",\n    \"@pagination-hover-color\": \"@link-hover-color\",\n    \"@pagination-hover-bg\": \"@gray-lighter\",\n    \"@pagination-hover-border\": \"#ddd\",\n    \"@pagination-active-color\": \"#fff\",\n    \"@pagination-active-bg\": \"@brand-primary\",\n    \"@pagination-active-border\": \"@brand-primary\",\n    \"@pagination-disabled-color\": \"@gray-light\",\n    \"@pagination-disabled-bg\": \"#fff\",\n    \"@pagination-disabled-border\": \"#ddd\",\n    \"@pager-bg\": \"@pagination-bg\",\n    \"@pager-border\": \"@pagination-border\",\n    \"@pager-border-radius\": \"15px\",\n    \"@pager-hover-bg\": \"@pagination-hover-bg\",\n    \"@pager-active-bg\": \"@pagination-active-bg\",\n    \"@pager-active-color\": \"@pagination-active-color\",\n    \"@pager-disabled-color\": \"@pagination-disabled-color\",\n    \"@jumbotron-padding\": \"30px\",\n    \"@jumbotron-color\": \"inherit\",\n    \"@jumbotron-bg\": \"@gray-lighter\",\n    \"@jumbotron-heading-color\": \"inherit\",\n    \"@jumbotron-font-size\": \"ceil((@font-size-base * 1.5))\",\n    \"@state-success-text\": \"#3c763d\",\n    \"@state-success-bg\": \"#dff0d8\",\n    \"@state-success-border\": \"darken(spin(@state-success-bg, -10), 5%)\",\n    \"@state-info-text\": \"#31708f\",\n    \"@state-info-bg\": \"#d9edf7\",\n    \"@state-info-border\": \"darken(spin(@state-info-bg, -10), 7%)\",\n    \"@state-warning-text\": \"#8a6d3b\",\n    \"@state-warning-bg\": \"#fcf8e3\",\n    \"@state-warning-border\": \"darken(spin(@state-warning-bg, -10), 5%)\",\n    \"@state-danger-text\": \"#a94442\",\n    \"@state-danger-bg\": \"#f2dede\",\n    \"@state-danger-border\": \"darken(spin(@state-danger-bg, -10), 5%)\",\n    \"@tooltip-max-width\": \"200px\",\n    \"@tooltip-color\": \"#fff\",\n    \"@tooltip-bg\": \"#000\",\n    \"@tooltip-opacity\": \".9\",\n    \"@tooltip-arrow-width\": \"5px\",\n    \"@tooltip-arrow-color\": \"@tooltip-bg\",\n    \"@popover-bg\": \"#fff\",\n    \"@popover-max-width\": \"276px\",\n    \"@popover-border-color\": \"rgba(0,0,0,.2)\",\n    \"@popover-fallback-border-color\": \"#ccc\",\n    \"@popover-title-bg\": \"darken(@popover-bg, 3%)\",\n    \"@popover-arrow-width\": \"10px\",\n    \"@popover-arrow-color\": \"#fff\",\n    \"@popover-arrow-outer-width\": \"(@popover-arrow-width + 1)\",\n    \"@popover-arrow-outer-color\": \"fadein(@popover-border-color, 5%)\",\n    \"@popover-arrow-outer-fallback-color\": \"darken(@popover-fallback-border-color, 20%)\",\n    \"@label-default-bg\": \"@gray-light\",\n    \"@label-primary-bg\": \"@brand-primary\",\n    \"@label-success-bg\": \"@brand-success\",\n    \"@label-info-bg\": \"@brand-info\",\n    \"@label-warning-bg\": \"@brand-warning\",\n    \"@label-danger-bg\": \"@brand-danger\",\n    \"@label-color\": \"#fff\",\n    \"@label-link-hover-color\": \"#fff\",\n    \"@modal-inner-padding\": \"20px\",\n    \"@modal-title-padding\": \"15px\",\n    \"@modal-title-line-height\": \"@line-height-base\",\n    \"@modal-content-bg\": \"#fff\",\n    \"@modal-content-border-color\": \"rgba(0,0,0,.2)\",\n    \"@modal-content-fallback-border-color\": \"#999\",\n    \"@modal-backdrop-bg\": \"#000\",\n    \"@modal-backdrop-opacity\": \".5\",\n    \"@modal-header-border-color\": \"#e5e5e5\",\n    \"@modal-footer-border-color\": \"@modal-header-border-color\",\n    \"@modal-lg\": \"900px\",\n    \"@modal-md\": \"600px\",\n    \"@modal-sm\": \"300px\",\n    \"@alert-padding\": \"15px\",\n    \"@alert-border-radius\": \"@border-radius-base\",\n    \"@alert-link-font-weight\": \"bold\",\n    \"@alert-success-bg\": \"@state-success-bg\",\n    \"@alert-success-text\": \"@state-success-text\",\n    \"@alert-success-border\": \"@state-success-border\",\n    \"@alert-info-bg\": \"@state-info-bg\",\n    \"@alert-info-text\": \"@state-info-text\",\n    \"@alert-info-border\": \"@state-info-border\",\n    \"@alert-warning-bg\": \"@state-warning-bg\",\n    \"@alert-warning-text\": \"@state-warning-text\",\n    \"@alert-warning-border\": \"@state-warning-border\",\n    \"@alert-danger-bg\": \"@state-danger-bg\",\n    \"@alert-danger-text\": \"@state-danger-text\",\n    \"@alert-danger-border\": \"@state-danger-border\",\n    \"@progress-bg\": \"#f5f5f5\",\n    \"@progress-bar-color\": \"#fff\",\n    \"@progress-bar-bg\": \"@brand-primary\",\n    \"@progress-bar-success-bg\": \"@brand-success\",\n    \"@progress-bar-warning-bg\": \"@brand-warning\",\n    \"@progress-bar-danger-bg\": \"@brand-danger\",\n    \"@progress-bar-info-bg\": \"@brand-info\",\n    \"@list-group-bg\": \"#fff\",\n    \"@list-group-border\": \"#ddd\",\n    \"@list-group-border-radius\": \"@border-radius-base\",\n    \"@list-group-hover-bg\": \"#f5f5f5\",\n    \"@list-group-active-color\": \"@component-active-color\",\n    \"@list-group-active-bg\": \"@component-active-bg\",\n    \"@list-group-active-border\": \"@list-group-active-bg\",\n    \"@list-group-active-text-color\": \"lighten(@list-group-active-bg, 40%)\",\n    \"@list-group-disabled-color\": \"@gray-light\",\n    \"@list-group-disabled-bg\": \"@gray-lighter\",\n    \"@list-group-disabled-text-color\": \"@list-group-disabled-color\",\n    \"@list-group-link-color\": \"#555\",\n    \"@list-group-link-hover-color\": \"@list-group-link-color\",\n    \"@list-group-link-heading-color\": \"#333\",\n    \"@panel-bg\": \"#fff\",\n    \"@panel-body-padding\": \"15px\",\n    \"@panel-heading-padding\": \"10px 15px\",\n    \"@panel-footer-padding\": \"@panel-heading-padding\",\n    \"@panel-border-radius\": \"@border-radius-base\",\n    \"@panel-inner-border\": \"#ddd\",\n    \"@panel-footer-bg\": \"#f5f5f5\",\n    \"@panel-default-text\": \"@gray-dark\",\n    \"@panel-default-border\": \"#ddd\",\n    \"@panel-default-heading-bg\": \"#f5f5f5\",\n    \"@panel-primary-text\": \"#fff\",\n    \"@panel-primary-border\": \"@brand-primary\",\n    \"@panel-primary-heading-bg\": \"@brand-primary\",\n    \"@panel-success-text\": \"@state-success-text\",\n    \"@panel-success-border\": \"@state-success-border\",\n    \"@panel-success-heading-bg\": \"@state-success-bg\",\n    \"@panel-info-text\": \"@state-info-text\",\n    \"@panel-info-border\": \"@state-info-border\",\n    \"@panel-info-heading-bg\": \"@state-info-bg\",\n    \"@panel-warning-text\": \"@state-warning-text\",\n    \"@panel-warning-border\": \"@state-warning-border\",\n    \"@panel-warning-heading-bg\": \"@state-warning-bg\",\n    \"@panel-danger-text\": \"@state-danger-text\",\n    \"@panel-danger-border\": \"@state-danger-border\",\n    \"@panel-danger-heading-bg\": \"@state-danger-bg\",\n    \"@thumbnail-padding\": \"4px\",\n    \"@thumbnail-bg\": \"@body-bg\",\n    \"@thumbnail-border\": \"#ddd\",\n    \"@thumbnail-border-radius\": \"@border-radius-base\",\n    \"@thumbnail-caption-color\": \"@text-color\",\n    \"@thumbnail-caption-padding\": \"9px\",\n    \"@well-bg\": \"#f5f5f5\",\n    \"@well-border\": \"darken(@well-bg, 7%)\",\n    \"@badge-color\": \"#fff\",\n    \"@badge-link-hover-color\": \"#fff\",\n    \"@badge-bg\": \"@gray-light\",\n    \"@badge-active-color\": \"@link-color\",\n    \"@badge-active-bg\": \"#fff\",\n    \"@badge-font-weight\": \"bold\",\n    \"@badge-border-radius\": \"10px\",\n    \"@breadcrumb-padding-vertical\": \"8px\",\n    \"@breadcrumb-padding-horizontal\": \"15px\",\n    \"@breadcrumb-bg\": \"#f5f5f5\",\n    \"@breadcrumb-color\": \"#ccc\",\n    \"@breadcrumb-active-color\": \"@gray-light\",\n    \"@breadcrumb-separator\": \"\\\"/\\\"\",\n    \"@carousel-text-shadow\": \"0 1px 2px rgba(0,0,0,.6)\",\n    \"@carousel-control-color\": \"#fff\",\n    \"@carousel-control-width\": \"15%\",\n    \"@carousel-control-opacity\": \".5\",\n    \"@carousel-control-font-size\": \"20px\",\n    \"@carousel-indicator-active-bg\": \"#fff\",\n    \"@carousel-indicator-border-color\": \"#fff\",\n    \"@carousel-caption-color\": \"#fff\",\n    \"@close-font-weight\": \"bold\",\n    \"@close-color\": \"#000\",\n    \"@close-text-shadow\": \"0 1px 0 #fff\",\n    \"@code-color\": \"#c7254e\",\n    \"@code-bg\": \"#f9f2f4\",\n    \"@kbd-color\": \"#fff\",\n    \"@kbd-bg\": \"#333\",\n    \"@pre-bg\": \"#f5f5f5\",\n    \"@pre-color\": \"@gray-dark\",\n    \"@pre-border-color\": \"#ccc\",\n    \"@pre-scrollable-max-height\": \"340px\",\n    \"@component-offset-horizontal\": \"180px\",\n    \"@text-muted\": \"@gray-light\",\n    \"@abbr-border-color\": \"@gray-light\",\n    \"@headings-small-color\": \"@gray-light\",\n    \"@blockquote-small-color\": \"@gray-light\",\n    \"@blockquote-font-size\": \"(@font-size-base * 1.25)\",\n    \"@blockquote-border-color\": \"@gray-lighter\",\n    \"@page-header-border-color\": \"@gray-lighter\",\n    \"@dl-horizontal-offset\": \"@component-offset-horizontal\",\n    \"@hr-border\": \"@gray-lighter\"\n  },\n  \"css\": [\n    \"print.less\",\n    \"type.less\",\n    \"code.less\",\n    \"grid.less\",\n    \"tables.less\",\n    \"forms.less\",\n    \"buttons.less\",\n    \"responsive-utilities.less\",\n    \"button-groups.less\",\n    \"input-groups.less\",\n    \"navs.less\",\n    \"navbar.less\",\n    \"breadcrumbs.less\",\n    \"pagination.less\",\n    \"pager.less\",\n    \"labels.less\",\n    \"badges.less\",\n    \"jumbotron.less\",\n    \"thumbnails.less\",\n    \"alerts.less\",\n    \"progress-bars.less\",\n    \"media.less\",\n    \"list-group.less\",\n    \"panels.less\",\n    \"responsive-embed.less\",\n    \"wells.less\",\n    \"close.less\",\n    \"component-animations.less\",\n    \"dropdowns.less\",\n    \"tooltip.less\",\n    \"popovers.less\",\n    \"modals.less\",\n    \"carousel.less\"\n  ],\n  \"js\": [\n    \"alert.js\",\n    \"button.js\",\n    \"carousel.js\",\n    \"dropdown.js\",\n    \"modal.js\",\n    \"tooltip.js\",\n    \"popover.js\",\n    \"tab.js\",\n    \"affix.js\",\n    \"collapse.js\",\n    \"scrollspy.js\",\n    \"transition.js\"\n  ],\n  \"customizerUrl\": \"http://getbootstrap.com/customize/?id=ef8b2e1e74a6ba7423f1\"\n}"
  },
  {
    "path": "app/vendor/bootstrap/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.2.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=ef8b2e1e74a6ba7423f1)\n * Config saved to config.json and https://gist.github.com/ef8b2e1e74a6ba7423f1\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  text-shadow: 0 1px 0 #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #5d8db3 0%, #436e8f 100%);\n  background-image: -o-linear-gradient(top, #5d8db3 0%, #436e8f 100%);\n  background-image: linear-gradient(to bottom, #5d8db3 0%, #436e8f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5d8db3', endColorstr='#ff436e8f', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #406989;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #436e8f;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #436e8f;\n  border-color: #406989;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n  background-color: #436e8f;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #6ac065 0%, #49a543 100%);\n  background-image: -o-linear-gradient(top, #6ac065 0%, #49a543 100%);\n  background-image: linear-gradient(to bottom, #6ac065 0%, #49a543 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6ac065', endColorstr='#ff49a543', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #459d40;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #49a543;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #49a543;\n  border-color: #459d40;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n  background-color: #49a543;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #c05f5a 0%, #a0423d 100%);\n  background-image: -o-linear-gradient(top, #c05f5a 0%, #a0423d 100%);\n  background-image: linear-gradient(to bottom, #c05f5a 0%, #a0423d 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc05f5a', endColorstr='#ffa0423d', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #983f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #a0423d;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #a0423d;\n  border-color: #983f3a;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n  background-color: #a0423d;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-image: -webkit-linear-gradient(top, #5d8db3 0%, #4f80a8 100%);\n  background-image: -o-linear-gradient(top, #5d8db3 0%, #4f80a8 100%);\n  background-image: linear-gradient(to bottom, #5d8db3 0%, #4f80a8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5d8db3', endColorstr='#ff4f80a8', GradientType=0);\n  background-color: #4f80a8;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);\n  background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #608eb1 0%, #497495 100%);\n  background-image: -o-linear-gradient(top, #608eb1 0%, #497495 100%);\n  background-image: linear-gradient(to bottom, #608eb1 0%, #497495 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff608eb1', endColorstr='#ff497495', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #497495 0%, #4d7b9e 100%);\n  background-image: -o-linear-gradient(top, #497495 0%, #4d7b9e 100%);\n  background-image: linear-gradient(to bottom, #497495 0%, #4d7b9e 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff497495', endColorstr='#ff4d7b9e', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #5d8db3 0%, #477396 100%);\n  background-image: -o-linear-gradient(top, #5d8db3 0%, #477396 100%);\n  background-image: linear-gradient(to bottom, #5d8db3 0%, #477396 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5d8db3', endColorstr='#ff477396', GradientType=0);\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #6ac065 0%, #4cac46 100%);\n  background-image: -o-linear-gradient(top, #6ac065 0%, #4cac46 100%);\n  background-image: linear-gradient(to bottom, #6ac065 0%, #4cac46 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6ac065', endColorstr='#ff4cac46', GradientType=0);\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #c05f5a 0%, #a74540 100%);\n  background-image: -o-linear-gradient(top, #c05f5a 0%, #a74540 100%);\n  background-image: linear-gradient(to bottom, #c05f5a 0%, #a74540 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc05f5a', endColorstr='#ffa74540', GradientType=0);\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #477396;\n  background-image: -webkit-linear-gradient(top, #5d8db3 0%, #4b7a9f 100%);\n  background-image: -o-linear-gradient(top, #5d8db3 0%, #4b7a9f 100%);\n  background-image: linear-gradient(to bottom, #5d8db3 0%, #4b7a9f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5d8db3', endColorstr='#ff4b7a9f', GradientType=0);\n  border-color: #4b7a9f;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #5d8db3 0%, #4f80a8 100%);\n  background-image: -o-linear-gradient(top, #5d8db3 0%, #4f80a8 100%);\n  background-image: linear-gradient(to bottom, #5d8db3 0%, #4f80a8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5d8db3', endColorstr='#ff4f80a8', GradientType=0);\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n"
  },
  {
    "path": "app/vendor/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.2.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=ef8b2e1e74a6ba7423f1)\n * Config saved to config.json and https://gist.github.com/ef8b2e1e74a6ba7423f1\n */\n/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n@media print {\n  * {\n    text-shadow: none !important;\n    color: #000 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #000000;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #3a6d99;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #3a6d99;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  width: 100% \\9;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  width: 100% \\9;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\ncite {\n  font-style: normal;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #999999;\n}\n.text-primary {\n  color: #5d8db3;\n}\na.text-primary:hover {\n  color: #477396;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #5d8db3;\n}\na.bg-primary:hover {\n  background-color: #477396;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 480px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #999999;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #ffffff;\n  background-color: #333333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 0;\n  padding-right: 0;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 940px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1140px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 0;\n  padding-right: 0;\n}\n.row {\n  margin-left: 0;\n  margin-right: 0;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    overflow-x: auto;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #dddddd;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #000000;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #000000;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #9aa2ab;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #9aa2ab;\n}\n.form-control::-webkit-input-placeholder {\n  color: #9aa2ab;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: 34px;\n  line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n  line-height: 30px;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n  line-height: 46px;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  min-height: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm,\n.form-horizontal .form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.input-lg,\n.form-horizontal .form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 25px;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #404040;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: 0;\n  margin-right: 0;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  top: 0;\n  right: 0;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #333333;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #5d8db3;\n  border-color: #5d8db3;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #477396;\n  border-color: #436e8f;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #5d8db3;\n  border-color: #5d8db3;\n}\n.btn-primary .badge {\n  color: #5d8db3;\n  background-color: #ffffff;\n}\n.btn-success {\n  color: #ffffff;\n  background-color: #6ac065;\n  border-color: #6ac065;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #4cac46;\n  border-color: #49a543;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #6ac065;\n  border-color: #6ac065;\n}\n.btn-success .badge {\n  color: #6ac065;\n  background-color: #ffffff;\n}\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #5bc0de;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #31b0d5;\n  border-color: #2aabd2;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #5bc0de;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #ffffff;\n}\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ec971f;\n  border-color: #eb9316;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #ffffff;\n}\n.btn-danger {\n  color: #ffffff;\n  background-color: #c05f5a;\n  border-color: #c05f5a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #a74540;\n  border-color: #a0423d;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #c05f5a;\n  border-color: #c05f5a;\n}\n.btn-danger .badge {\n  color: #c05f5a;\n  background-color: #ffffff;\n}\n.btn-link {\n  color: #3a6d99;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #3a6d99;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  -o-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #5d8db3;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #999999;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 480px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: 0;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #000000;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #999999;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #3a6d99;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #5d8db3;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 44px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 480px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 480px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 0;\n  padding-left: 0;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 480px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: 0;\n  margin-left: 0;\n}\n@media (min-width: 480px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 480px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n}\n@media (min-width: 480px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 12px 0;\n  font-size: 18px;\n  line-height: 20px;\n  height: 44px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n@media (min-width: 480px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: 0;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 0;\n  padding: 9px 10px;\n  margin-top: 5px;\n  margin-bottom: 5px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 480px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 6px 0;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 479px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 480px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 12px;\n    padding-bottom: 12px;\n  }\n  .navbar-nav.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n@media (min-width: 480px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n.navbar-form {\n  margin-left: 0;\n  margin-right: 0;\n  padding: 10px 0;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 479px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n@media (min-width: 480px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 7px;\n  margin-bottom: 7px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 11px;\n  margin-bottom: 11px;\n}\n.navbar-text {\n  margin-top: 12px;\n  margin-bottom: 12px;\n}\n@media (min-width: 480px) {\n  .navbar-text {\n    float: left;\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #555555;\n}\n@media (max-width: 479px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n.navbar-default .btn-link {\n  color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #cccccc;\n}\n.navbar-inverse {\n  background-color: #497495;\n  border-color: #385973;\n}\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #385973;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #3d617d;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #385973;\n  color: #ffffff;\n}\n@media (max-width: 479px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #385973;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #385973;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #385973;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link {\n  color: #999999;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #cccccc;\n}\n.breadcrumb > .active {\n  color: #999999;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #3a6d99;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #3a6d99;\n  background-color: #eeeeee;\n  border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #5d8db3;\n  border-color: #5d8db3;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  background-color: #ffffff;\n  border-color: #dddddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  background-color: #ffffff;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #999999;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n.label-primary {\n  background-color: #5d8db3;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #477396;\n}\n.label-success {\n  background-color: #6ac065;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #4cac46;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #c05f5a;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #a74540;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #ffffff;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #999999;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #3a6d99;\n  background-color: #ffffff;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #3a6d99;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #000000;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #5d8db3;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar[aria-valuenow=\"1\"],\n.progress-bar[aria-valuenow=\"2\"] {\n  min-width: 30px;\n}\n.progress-bar[aria-valuenow=\"0\"] {\n  color: #999999;\n  min-width: 30px;\n  background-color: transparent;\n  background-image: none;\n  box-shadow: none;\n}\n.progress-bar-success {\n  background-color: #6ac065;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #c05f5a;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  color: #555555;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #999999;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #999999;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #5d8db3;\n  border-color: #5d8db3;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e8eff4;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body {\n  border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #dddddd;\n}\n.panel-primary {\n  border-color: #5d8db3;\n}\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #5d8db3;\n  border-color: #5d8db3;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #5d8db3;\n}\n.panel-primary > .panel-heading .badge {\n  color: #5d8db3;\n  background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #5d8db3;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate3d(0, -25%, 0);\n  transform: translate3d(0, -25%, 0);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n.modal-footer {\n  padding: 20px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  visibility: visible;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n"
  },
  {
    "path": "app/vendor/bootstrap/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.2.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=ef8b2e1e74a6ba7423f1)\n * Config saved to config.json and https://gist.github.com/ef8b2e1e74a6ba7423f1\n */\nif (typeof jQuery === \"undefined\") { throw new Error(\"Bootstrap's JavaScript requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: alert.js v3.2.0\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.2.0'\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.2.0\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.2.0'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] == null ? this.options[state] : data[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    Plugin.call($btn, 'toggle')\n    e.preventDefault()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.2.0\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.2.0'\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.2.0\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.2.0'\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.trigger('focus')\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=\"menu\"]' + desc + ', [role=\"listbox\"]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $parent = getParent($(this))\n      var relatedTarget = { relatedTarget: this }\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=\"menu\"], [role=\"listbox\"]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.2.0\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options        = options\n    this.$body          = $(document.body)\n    this.$element       = $(element)\n    this.$backdrop      =\n    this.isShown        = null\n    this.scrollbarWidth = 0\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.2.0'\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.setScrollbar()\n    this.escape()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.$body.removeClass('modal-open')\n\n    this.resetScrollbar()\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(150) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    if (document.body.clientWidth >= window.innerWidth) return\n    this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', '')\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.2.0\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.2.0'\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(document.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var $parent      = this.$element.parent()\n        var parentDim    = this.getPosition($parent)\n\n        placement = placement == 'bottom' && pos.top   + pos.height       + actualHeight - parentDim.scroll > parentDim.height ? 'top'    :\n                    placement == 'top'    && pos.top   - parentDim.scroll - actualHeight < 0                                   ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth      > parentDim.width                                    ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth      < parentDim.left                                     ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(150) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var arrowDelta          = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowPosition       = delta.left ? 'left'        : 'top'\n    var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    this.$element.removeAttr('aria-describedby')\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element.trigger('hidden.bs.' + that.type)\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {\n      scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),\n      width:  isBody ? $(window).width()  : $element.outerWidth(),\n      height: isBody ? $(window).height() : $element.outerHeight()\n    }, isBody ? { top: 0, left: 0 } : $element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    return (this.$tip = this.$tip || $(this.options.template))\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    clearTimeout(this.timeout)\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.2.0\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.2.0'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.2.0\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.VERSION = '3.2.0'\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.2.0\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.2.0'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin != null) this.$element.css('top', '')\n\n    var affixType = 'affix' + (affix ? '-' + affix : '')\n    var e         = $.Event(affixType + '.bs.affix')\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n    this.$element\n      .removeClass(Affix.RESET)\n      .addClass(affixType)\n      .trigger($.Event(affixType.replace('affix', 'affixed')))\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - this.$element.height() - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.2.0\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.2.0'\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      Plugin.call(actives, 'hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') option = !option\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var href\n    var $this   = $(this)\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=\"collapse\"][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.2.0\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var process  = $.proxy(this.process, this)\n\n    this.$body          = $('body')\n    this.$scrollElement = $(element).is('body') ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', process)\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.2.0'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = 'offset'\n    var offsetBase   = 0\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.offsets = []\n    this.targets = []\n    this.scrollHeight = this.getScrollHeight()\n\n    var self     = this\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop <= offsets[0]) {\n      return activeTarget != (i = targets[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.2.0\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "app/vendor/clipboard/clipboard.js",
    "content": "/*!\n * clipboard.js v1.5.12\n * https://zenorocha.github.io/clipboard.js\n *\n * Licensed MIT © Zeno Rocha\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Clipboard = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\nvar matches = require('matches-selector')\n\nmodule.exports = function (element, selector, checkYoSelf) {\n  var parent = checkYoSelf ? element : element.parentNode\n\n  while (parent && parent !== document) {\n    if (matches(parent, selector)) return parent;\n    parent = parent.parentNode\n  }\n}\n\n},{\"matches-selector\":5}],2:[function(require,module,exports){\nvar closest = require('closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(element, selector, type, callback, useCapture) {\n    var listenerFn = listener.apply(this, arguments);\n\n    element.addEventListener(type, listenerFn, useCapture);\n\n    return {\n        destroy: function() {\n            element.removeEventListener(type, listenerFn, useCapture);\n        }\n    }\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n    return function(e) {\n        e.delegateTarget = closest(e.target, selector, true);\n\n        if (e.delegateTarget) {\n            callback.call(element, e);\n        }\n    }\n}\n\nmodule.exports = delegate;\n\n},{\"closest\":1}],3:[function(require,module,exports){\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n    return value !== undefined\n        && value instanceof HTMLElement\n        && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n    var type = Object.prototype.toString.call(value);\n\n    return value !== undefined\n        && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n        && ('length' in value)\n        && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n    return typeof value === 'string'\n        || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n    var type = Object.prototype.toString.call(value);\n\n    return type === '[object Function]';\n};\n\n},{}],4:[function(require,module,exports){\nvar is = require('./is');\nvar delegate = require('delegate');\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n    if (!target && !type && !callback) {\n        throw new Error('Missing required arguments');\n    }\n\n    if (!is.string(type)) {\n        throw new TypeError('Second argument must be a String');\n    }\n\n    if (!is.fn(callback)) {\n        throw new TypeError('Third argument must be a Function');\n    }\n\n    if (is.node(target)) {\n        return listenNode(target, type, callback);\n    }\n    else if (is.nodeList(target)) {\n        return listenNodeList(target, type, callback);\n    }\n    else if (is.string(target)) {\n        return listenSelector(target, type, callback);\n    }\n    else {\n        throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n    }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n    node.addEventListener(type, callback);\n\n    return {\n        destroy: function() {\n            node.removeEventListener(type, callback);\n        }\n    }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n    Array.prototype.forEach.call(nodeList, function(node) {\n        node.addEventListener(type, callback);\n    });\n\n    return {\n        destroy: function() {\n            Array.prototype.forEach.call(nodeList, function(node) {\n                node.removeEventListener(type, callback);\n            });\n        }\n    }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n    return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n},{\"./is\":3,\"delegate\":2}],5:[function(require,module,exports){\n\n/**\n * Element prototype.\n */\n\nvar proto = Element.prototype;\n\n/**\n * Vendor function.\n */\n\nvar vendor = proto.matchesSelector\n  || proto.webkitMatchesSelector\n  || proto.mozMatchesSelector\n  || proto.msMatchesSelector\n  || proto.oMatchesSelector;\n\n/**\n * Expose `match()`.\n */\n\nmodule.exports = match;\n\n/**\n * Match `el` to `selector`.\n *\n * @param {Element} el\n * @param {String} selector\n * @return {Boolean}\n * @api public\n */\n\nfunction match(el, selector) {\n  if (vendor) return vendor.call(el, selector);\n  var nodes = el.parentNode.querySelectorAll(selector);\n  for (var i = 0; i < nodes.length; ++i) {\n    if (nodes[i] == el) return true;\n  }\n  return false;\n}\n},{}],6:[function(require,module,exports){\nfunction select(element) {\n    var selectedText;\n\n    if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n        element.focus();\n        element.setSelectionRange(0, element.value.length);\n\n        selectedText = element.value;\n    }\n    else {\n        if (element.hasAttribute('contenteditable')) {\n            element.focus();\n        }\n\n        var selection = window.getSelection();\n        var range = document.createRange();\n\n        range.selectNodeContents(element);\n        selection.removeAllRanges();\n        selection.addRange(range);\n\n        selectedText = selection.toString();\n    }\n\n    return selectedText;\n}\n\nmodule.exports = select;\n\n},{}],7:[function(require,module,exports){\nfunction E () {\n\t// Keep this empty so it's easier to inherit from\n  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n\ton: function (name, callback, ctx) {\n    var e = this.e || (this.e = {});\n\n    (e[name] || (e[name] = [])).push({\n      fn: callback,\n      ctx: ctx\n    });\n\n    return this;\n  },\n\n  once: function (name, callback, ctx) {\n    var self = this;\n    function listener () {\n      self.off(name, listener);\n      callback.apply(ctx, arguments);\n    };\n\n    listener._ = callback\n    return this.on(name, listener, ctx);\n  },\n\n  emit: function (name) {\n    var data = [].slice.call(arguments, 1);\n    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n    var i = 0;\n    var len = evtArr.length;\n\n    for (i; i < len; i++) {\n      evtArr[i].fn.apply(evtArr[i].ctx, data);\n    }\n\n    return this;\n  },\n\n  off: function (name, callback) {\n    var e = this.e || (this.e = {});\n    var evts = e[name];\n    var liveEvents = [];\n\n    if (evts && callback) {\n      for (var i = 0, len = evts.length; i < len; i++) {\n        if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n          liveEvents.push(evts[i]);\n      }\n    }\n\n    // Remove event from queue to prevent memory leak\n    // Suggested by https://github.com/lazd\n    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n    (liveEvents.length)\n      ? e[name] = liveEvents\n      : delete e[name];\n\n    return this;\n  }\n};\n\nmodule.exports = E;\n\n},{}],8:[function(require,module,exports){\n(function (global, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define(['module', 'select'], factory);\n    } else if (typeof exports !== \"undefined\") {\n        factory(module, require('select'));\n    } else {\n        var mod = {\n            exports: {}\n        };\n        factory(mod, global.select);\n        global.clipboardAction = mod.exports;\n    }\n})(this, function (module, _select) {\n    'use strict';\n\n    var _select2 = _interopRequireDefault(_select);\n\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n\n    var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n        return typeof obj;\n    } : function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n    };\n\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) {\n            throw new TypeError(\"Cannot call a class as a function\");\n        }\n    }\n\n    var _createClass = function () {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || false;\n                descriptor.configurable = true;\n                if (\"value\" in descriptor) descriptor.writable = true;\n                Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n\n        return function (Constructor, protoProps, staticProps) {\n            if (protoProps) defineProperties(Constructor.prototype, protoProps);\n            if (staticProps) defineProperties(Constructor, staticProps);\n            return Constructor;\n        };\n    }();\n\n    var ClipboardAction = function () {\n        /**\n         * @param {Object} options\n         */\n\n        function ClipboardAction(options) {\n            _classCallCheck(this, ClipboardAction);\n\n            this.resolveOptions(options);\n            this.initSelection();\n        }\n\n        /**\n         * Defines base properties passed from constructor.\n         * @param {Object} options\n         */\n\n\n        ClipboardAction.prototype.resolveOptions = function resolveOptions() {\n            var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n            this.action = options.action;\n            this.emitter = options.emitter;\n            this.target = options.target;\n            this.text = options.text;\n            this.trigger = options.trigger;\n\n            this.selectedText = '';\n        };\n\n        ClipboardAction.prototype.initSelection = function initSelection() {\n            if (this.text) {\n                this.selectFake();\n            } else if (this.target) {\n                this.selectTarget();\n            }\n        };\n\n        ClipboardAction.prototype.selectFake = function selectFake() {\n            var _this = this;\n\n            var isRTL = document.documentElement.getAttribute('dir') == 'rtl';\n\n            this.removeFake();\n\n            this.fakeHandlerCallback = function () {\n                return _this.removeFake();\n            };\n\n            setTimeout(function () {\n                _this.fakeHandler = document.body.addEventListener('click', _this.fakeHandlerCallback) || true;\n            }, 0);\n\n            this.fakeElem = document.createElement('textarea');\n            // Prevent zooming on iOS\n            this.fakeElem.style.fontSize = '12pt';\n            // Reset box model\n            this.fakeElem.style.border = '0';\n            this.fakeElem.style.padding = '0';\n            this.fakeElem.style.margin = '0';\n            // Move element out of screen horizontally\n            this.fakeElem.style.position = 'absolute';\n            this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';\n            // Move element to the same position vertically\n            this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px';\n            this.fakeElem.setAttribute('readonly', '');\n            this.fakeElem.value = this.text;\n\n            document.body.appendChild(this.fakeElem);\n\n            this.selectedText = (0, _select2.default)(this.fakeElem);\n            this.copyText();\n        };\n\n        ClipboardAction.prototype.removeFake = function removeFake() {\n            if (this.fakeHandler) {\n                document.body.removeEventListener('click', this.fakeHandlerCallback);\n                this.fakeHandler = null;\n                this.fakeHandlerCallback = null;\n            }\n\n            if (this.fakeElem) {\n                document.body.removeChild(this.fakeElem);\n                this.fakeElem = null;\n            }\n        };\n\n        ClipboardAction.prototype.selectTarget = function selectTarget() {\n            this.selectedText = (0, _select2.default)(this.target);\n            this.copyText();\n        };\n\n        ClipboardAction.prototype.copyText = function copyText() {\n            var succeeded = undefined;\n\n            try {\n                succeeded = document.execCommand(this.action);\n            } catch (err) {\n                succeeded = false;\n            }\n\n            this.handleResult(succeeded);\n        };\n\n        ClipboardAction.prototype.handleResult = function handleResult(succeeded) {\n            if (succeeded) {\n                this.emitter.emit('success', {\n                    action: this.action,\n                    text: this.selectedText,\n                    trigger: this.trigger,\n                    clearSelection: this.clearSelection.bind(this)\n                });\n            } else {\n                this.emitter.emit('error', {\n                    action: this.action,\n                    trigger: this.trigger,\n                    clearSelection: this.clearSelection.bind(this)\n                });\n            }\n        };\n\n        ClipboardAction.prototype.clearSelection = function clearSelection() {\n            if (this.target) {\n                this.target.blur();\n            }\n\n            window.getSelection().removeAllRanges();\n        };\n\n        ClipboardAction.prototype.destroy = function destroy() {\n            this.removeFake();\n        };\n\n        _createClass(ClipboardAction, [{\n            key: 'action',\n            set: function set() {\n                var action = arguments.length <= 0 || arguments[0] === undefined ? 'copy' : arguments[0];\n\n                this._action = action;\n\n                if (this._action !== 'copy' && this._action !== 'cut') {\n                    throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n                }\n            },\n            get: function get() {\n                return this._action;\n            }\n        }, {\n            key: 'target',\n            set: function set(target) {\n                if (target !== undefined) {\n                    if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {\n                        if (this.action === 'copy' && target.hasAttribute('disabled')) {\n                            throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n                        }\n\n                        if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n                            throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n                        }\n\n                        this._target = target;\n                    } else {\n                        throw new Error('Invalid \"target\" value, use a valid Element');\n                    }\n                }\n            },\n            get: function get() {\n                return this._target;\n            }\n        }]);\n\n        return ClipboardAction;\n    }();\n\n    module.exports = ClipboardAction;\n});\n\n},{\"select\":6}],9:[function(require,module,exports){\n(function (global, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory);\n    } else if (typeof exports !== \"undefined\") {\n        factory(module, require('./clipboard-action'), require('tiny-emitter'), require('good-listener'));\n    } else {\n        var mod = {\n            exports: {}\n        };\n        factory(mod, global.clipboardAction, global.tinyEmitter, global.goodListener);\n        global.clipboard = mod.exports;\n    }\n})(this, function (module, _clipboardAction, _tinyEmitter, _goodListener) {\n    'use strict';\n\n    var _clipboardAction2 = _interopRequireDefault(_clipboardAction);\n\n    var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);\n\n    var _goodListener2 = _interopRequireDefault(_goodListener);\n\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) {\n            throw new TypeError(\"Cannot call a class as a function\");\n        }\n    }\n\n    function _possibleConstructorReturn(self, call) {\n        if (!self) {\n            throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        }\n\n        return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n    }\n\n    function _inherits(subClass, superClass) {\n        if (typeof superClass !== \"function\" && superClass !== null) {\n            throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        }\n\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: false,\n                writable: true,\n                configurable: true\n            }\n        });\n        if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n    }\n\n    var Clipboard = function (_Emitter) {\n        _inherits(Clipboard, _Emitter);\n\n        /**\n         * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n         * @param {Object} options\n         */\n\n        function Clipboard(trigger, options) {\n            _classCallCheck(this, Clipboard);\n\n            var _this = _possibleConstructorReturn(this, _Emitter.call(this));\n\n            _this.resolveOptions(options);\n            _this.listenClick(trigger);\n            return _this;\n        }\n\n        /**\n         * Defines if attributes would be resolved using internal setter functions\n         * or custom functions that were passed in the constructor.\n         * @param {Object} options\n         */\n\n\n        Clipboard.prototype.resolveOptions = function resolveOptions() {\n            var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n            this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n            this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n            this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n        };\n\n        Clipboard.prototype.listenClick = function listenClick(trigger) {\n            var _this2 = this;\n\n            this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) {\n                return _this2.onClick(e);\n            });\n        };\n\n        Clipboard.prototype.onClick = function onClick(e) {\n            var trigger = e.delegateTarget || e.currentTarget;\n\n            if (this.clipboardAction) {\n                this.clipboardAction = null;\n            }\n\n            this.clipboardAction = new _clipboardAction2.default({\n                action: this.action(trigger),\n                target: this.target(trigger),\n                text: this.text(trigger),\n                trigger: trigger,\n                emitter: this\n            });\n        };\n\n        Clipboard.prototype.defaultAction = function defaultAction(trigger) {\n            return getAttributeValue('action', trigger);\n        };\n\n        Clipboard.prototype.defaultTarget = function defaultTarget(trigger) {\n            var selector = getAttributeValue('target', trigger);\n\n            if (selector) {\n                return document.querySelector(selector);\n            }\n        };\n\n        Clipboard.prototype.defaultText = function defaultText(trigger) {\n            return getAttributeValue('text', trigger);\n        };\n\n        Clipboard.prototype.destroy = function destroy() {\n            this.listener.destroy();\n\n            if (this.clipboardAction) {\n                this.clipboardAction.destroy();\n                this.clipboardAction = null;\n            }\n        };\n\n        return Clipboard;\n    }(_tinyEmitter2.default);\n\n    /**\n     * Helper function to retrieve attribute value.\n     * @param {String} suffix\n     * @param {Element} element\n     */\n    function getAttributeValue(suffix, element) {\n        var attribute = 'data-clipboard-' + suffix;\n\n        if (!element.hasAttribute(attribute)) {\n            return;\n        }\n\n        return element.getAttribute(attribute);\n    }\n\n    module.exports = Clipboard;\n});\n\n},{\"./clipboard-action\":8,\"good-listener\":4,\"tiny-emitter\":7}]},{},[9])(9)\n});"
  },
  {
    "path": "app/vendor/closure/long.js",
    "content": "// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\n * implementation is derived from LongLib in GWT.\n *\n */\n\n/**\n * This file also contains some modifications by Igor Zhukov in order to add custom scrollbars to EmojiMenu\n * See keyword `MODIFICATION` in source code.\n */\n\n/*! MODIFICATION\nThe following line was added by Igor Zhukov in order to make library compatibile with other app parts\n*/\nthis.goog = {provide: function () {}, math: {}};\n\n\ngoog.provide('goog.math.Long');\n\n\n\n/**\n * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\n * values as *signed* integers.  See the from* functions below for more\n * convenient ways of constructing Longs.\n *\n * The internal representation of a long is the two given signed, 32-bit values.\n * We use 32-bit pieces because these are the size of integers on which\n * Javascript performs bit-operations.  For operations like addition and\n * multiplication, we split each number into 16-bit pieces, which can easily be\n * multiplied within Javascript's floating-point representation without overflow\n * or change in sign.\n *\n * In the algorithms below, we frequently reduce the negative case to the\n * positive case by negating the input(s) and then post-processing the result.\n * Note that we must ALWAYS check specially whether those values are MIN_VALUE\n * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n * a positive number, it overflows back into a negative).  Not handling this\n * case would often result in infinite recursion.\n *\n * @param {number} low  The low (signed) 32 bits of the long.\n * @param {number} high  The high (signed) 32 bits of the long.\n * @constructor\n */\ngoog.math.Long = function(low, high) {\n  /**\n   * @type {number}\n   * @private\n   */\n  this.low_ = low | 0;  // force into 32 signed bits.\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.high_ = high | 0;  // force into 32 signed bits.\n};\n\n\n// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\n// from* methods on which they depend.\n\n\n/**\n * A cache of the Long representations of small integer values.\n * @type {!Object}\n * @private\n */\ngoog.math.Long.IntCache_ = {};\n\n\n/**\n * Returns a Long representing the given (32-bit) integer value.\n * @param {number} value The 32-bit integer in question.\n * @return {!goog.math.Long} The corresponding Long value.\n */\ngoog.math.Long.fromInt = function(value) {\n  if (-128 <= value && value < 128) {\n    var cachedObj = goog.math.Long.IntCache_[value];\n    if (cachedObj) {\n      return cachedObj;\n    }\n  }\n\n  var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\n  if (-128 <= value && value < 128) {\n    goog.math.Long.IntCache_[value] = obj;\n  }\n  return obj;\n};\n\n\n/**\n * Returns a Long representing the given value, provided that it is a finite\n * number.  Otherwise, zero is returned.\n * @param {number} value The number in question.\n * @return {!goog.math.Long} The corresponding Long value.\n */\ngoog.math.Long.fromNumber = function(value) {\n  if (isNaN(value) || !isFinite(value)) {\n    return goog.math.Long.ZERO;\n  } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\n    return goog.math.Long.MIN_VALUE;\n  } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\n    return goog.math.Long.MAX_VALUE;\n  } else if (value < 0) {\n    return goog.math.Long.fromNumber(-value).negate();\n  } else {\n    return new goog.math.Long(\n        (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\n        (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\n  }\n};\n\n\n/**\n * Returns a Long representing the 64-bit integer that comes by concatenating\n * the given high and low bits.  Each is assumed to use 32 bits.\n * @param {number} lowBits The low 32-bits.\n * @param {number} highBits The high 32-bits.\n * @return {!goog.math.Long} The corresponding Long value.\n */\ngoog.math.Long.fromBits = function(lowBits, highBits) {\n  return new goog.math.Long(lowBits, highBits);\n};\n\n\n/**\n * Returns a Long representation of the given string, written using the given\n * radix.\n * @param {string} str The textual representation of the Long.\n * @param {number=} opt_radix The radix in which the text is written.\n * @return {!goog.math.Long} The corresponding Long value.\n */\ngoog.math.Long.fromString = function(str, opt_radix) {\n  if (str.length == 0) {\n    throw Error('number format error: empty string');\n  }\n\n  var radix = opt_radix || 10;\n  if (radix < 2 || 36 < radix) {\n    throw Error('radix out of range: ' + radix);\n  }\n\n  if (str.charAt(0) == '-') {\n    return goog.math.Long.fromString(str.substring(1), radix).negate();\n  } else if (str.indexOf('-') >= 0) {\n    throw Error('number format error: interior \"-\" character: ' + str);\n  }\n\n  // Do several (8) digits each time through the loop, so as to\n  // minimize the calls to the very expensive emulated div.\n  var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\n\n  var result = goog.math.Long.ZERO;\n  for (var i = 0; i < str.length; i += 8) {\n    var size = Math.min(8, str.length - i);\n    var value = parseInt(str.substring(i, i + size), radix);\n    if (size < 8) {\n      var power = goog.math.Long.fromNumber(Math.pow(radix, size));\n      result = result.multiply(power).add(goog.math.Long.fromNumber(value));\n    } else {\n      result = result.multiply(radixToPower);\n      result = result.add(goog.math.Long.fromNumber(value));\n    }\n  }\n  return result;\n};\n\n\n// NOTE: the compiler should inline these constant values below and then remove\n// these variables, so there should be no runtime penalty for these.\n\n\n/**\n * Number used repeated below in calculations.  This must appear before the\n * first call to any from* function below.\n * @type {number}\n * @private\n */\ngoog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.math.Long.TWO_PWR_32_DBL_ =\n    goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.math.Long.TWO_PWR_31_DBL_ =\n    goog.math.Long.TWO_PWR_32_DBL_ / 2;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.math.Long.TWO_PWR_48_DBL_ =\n    goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.math.Long.TWO_PWR_64_DBL_ =\n    goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.math.Long.TWO_PWR_63_DBL_ =\n    goog.math.Long.TWO_PWR_64_DBL_ / 2;\n\n\n/** @type {!goog.math.Long} */\ngoog.math.Long.ZERO = goog.math.Long.fromInt(0);\n\n\n/** @type {!goog.math.Long} */\ngoog.math.Long.ONE = goog.math.Long.fromInt(1);\n\n\n/** @type {!goog.math.Long} */\ngoog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\n\n\n/** @type {!goog.math.Long} */\ngoog.math.Long.MAX_VALUE =\n    goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\n\n\n/** @type {!goog.math.Long} */\ngoog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\n\n\n/**\n * @type {!goog.math.Long}\n * @private\n */\ngoog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\n\n\n/** @return {number} The value, assuming it is a 32-bit integer. */\ngoog.math.Long.prototype.toInt = function() {\n  return this.low_;\n};\n\n\n/** @return {number} The closest floating-point representation to this value. */\ngoog.math.Long.prototype.toNumber = function() {\n  return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\n         this.getLowBitsUnsigned();\n};\n\n\n/**\n * @param {number=} opt_radix The radix in which the text should be written.\n * @return {string} The textual representation of this value.\n * @override\n */\ngoog.math.Long.prototype.toString = function(opt_radix) {\n  var radix = opt_radix || 10;\n  if (radix < 2 || 36 < radix) {\n    throw Error('radix out of range: ' + radix);\n  }\n\n  if (this.isZero()) {\n    return '0';\n  }\n\n  if (this.isNegative()) {\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      // We need to change the Long value before it can be negated, so we remove\n      // the bottom-most digit in this base and then recurse to do the rest.\n      var radixLong = goog.math.Long.fromNumber(radix);\n      var div = this.div(radixLong);\n      var rem = div.multiply(radixLong).subtract(this);\n      return div.toString(radix) + rem.toInt().toString(radix);\n    } else {\n      return '-' + this.negate().toString(radix);\n    }\n  }\n\n  // Do several (6) digits each time through the loop, so as to\n  // minimize the calls to the very expensive emulated div.\n  var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\n\n  var rem = this;\n  var result = '';\n  while (true) {\n    var remDiv = rem.div(radixToPower);\n    var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\n    var digits = intval.toString(radix);\n\n    rem = remDiv;\n    if (rem.isZero()) {\n      return digits + result;\n    } else {\n      while (digits.length < 6) {\n        digits = '0' + digits;\n      }\n      result = '' + digits + result;\n    }\n  }\n};\n\n\n/** @return {number} The high 32-bits as a signed value. */\ngoog.math.Long.prototype.getHighBits = function() {\n  return this.high_;\n};\n\n\n/** @return {number} The low 32-bits as a signed value. */\ngoog.math.Long.prototype.getLowBits = function() {\n  return this.low_;\n};\n\n\n/** @return {number} The low 32-bits as an unsigned value. */\ngoog.math.Long.prototype.getLowBitsUnsigned = function() {\n  return (this.low_ >= 0) ?\n      this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\n};\n\n\n/**\n * @return {number} Returns the number of bits needed to represent the absolute\n *     value of this Long.\n */\ngoog.math.Long.prototype.getNumBitsAbs = function() {\n  if (this.isNegative()) {\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      return 64;\n    } else {\n      return this.negate().getNumBitsAbs();\n    }\n  } else {\n    var val = this.high_ != 0 ? this.high_ : this.low_;\n    for (var bit = 31; bit > 0; bit--) {\n      if ((val & (1 << bit)) != 0) {\n        break;\n      }\n    }\n    return this.high_ != 0 ? bit + 33 : bit + 1;\n  }\n};\n\n\n/** @return {boolean} Whether this value is zero. */\ngoog.math.Long.prototype.isZero = function() {\n  return this.high_ == 0 && this.low_ == 0;\n};\n\n\n/** @return {boolean} Whether this value is negative. */\ngoog.math.Long.prototype.isNegative = function() {\n  return this.high_ < 0;\n};\n\n\n/** @return {boolean} Whether this value is odd. */\ngoog.math.Long.prototype.isOdd = function() {\n  return (this.low_ & 1) == 1;\n};\n\n\n/**\n * @param {goog.math.Long} other Long to compare against.\n * @return {boolean} Whether this Long equals the other.\n */\ngoog.math.Long.prototype.equals = function(other) {\n  return (this.high_ == other.high_) && (this.low_ == other.low_);\n};\n\n\n/**\n * @param {goog.math.Long} other Long to compare against.\n * @return {boolean} Whether this Long does not equal the other.\n */\ngoog.math.Long.prototype.notEquals = function(other) {\n  return (this.high_ != other.high_) || (this.low_ != other.low_);\n};\n\n\n/**\n * @param {goog.math.Long} other Long to compare against.\n * @return {boolean} Whether this Long is less than the other.\n */\ngoog.math.Long.prototype.lessThan = function(other) {\n  return this.compare(other) < 0;\n};\n\n\n/**\n * @param {goog.math.Long} other Long to compare against.\n * @return {boolean} Whether this Long is less than or equal to the other.\n */\ngoog.math.Long.prototype.lessThanOrEqual = function(other) {\n  return this.compare(other) <= 0;\n};\n\n\n/**\n * @param {goog.math.Long} other Long to compare against.\n * @return {boolean} Whether this Long is greater than the other.\n */\ngoog.math.Long.prototype.greaterThan = function(other) {\n  return this.compare(other) > 0;\n};\n\n\n/**\n * @param {goog.math.Long} other Long to compare against.\n * @return {boolean} Whether this Long is greater than or equal to the other.\n */\ngoog.math.Long.prototype.greaterThanOrEqual = function(other) {\n  return this.compare(other) >= 0;\n};\n\n\n/**\n * Compares this Long with the given one.\n * @param {goog.math.Long} other Long to compare against.\n * @return {number} 0 if they are the same, 1 if the this is greater, and -1\n *     if the given one is greater.\n */\ngoog.math.Long.prototype.compare = function(other) {\n  if (this.equals(other)) {\n    return 0;\n  }\n\n  var thisNeg = this.isNegative();\n  var otherNeg = other.isNegative();\n  if (thisNeg && !otherNeg) {\n    return -1;\n  }\n  if (!thisNeg && otherNeg) {\n    return 1;\n  }\n\n  // at this point, the signs are the same, so subtraction will not overflow\n  if (this.subtract(other).isNegative()) {\n    return -1;\n  } else {\n    return 1;\n  }\n};\n\n\n/** @return {!goog.math.Long} The negation of this value. */\ngoog.math.Long.prototype.negate = function() {\n  if (this.equals(goog.math.Long.MIN_VALUE)) {\n    return goog.math.Long.MIN_VALUE;\n  } else {\n    return this.not().add(goog.math.Long.ONE);\n  }\n};\n\n\n/**\n * Returns the sum of this and the given Long.\n * @param {goog.math.Long} other Long to add to this one.\n * @return {!goog.math.Long} The sum of this and the given Long.\n */\ngoog.math.Long.prototype.add = function(other) {\n  // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n  var a48 = this.high_ >>> 16;\n  var a32 = this.high_ & 0xFFFF;\n  var a16 = this.low_ >>> 16;\n  var a00 = this.low_ & 0xFFFF;\n\n  var b48 = other.high_ >>> 16;\n  var b32 = other.high_ & 0xFFFF;\n  var b16 = other.low_ >>> 16;\n  var b00 = other.low_ & 0xFFFF;\n\n  var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n  c00 += a00 + b00;\n  c16 += c00 >>> 16;\n  c00 &= 0xFFFF;\n  c16 += a16 + b16;\n  c32 += c16 >>> 16;\n  c16 &= 0xFFFF;\n  c32 += a32 + b32;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c48 += a48 + b48;\n  c48 &= 0xFFFF;\n  return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n};\n\n\n/**\n * Returns the difference of this and the given Long.\n * @param {goog.math.Long} other Long to subtract from this.\n * @return {!goog.math.Long} The difference of this and the given Long.\n */\ngoog.math.Long.prototype.subtract = function(other) {\n  return this.add(other.negate());\n};\n\n\n/**\n * Returns the product of this and the given long.\n * @param {goog.math.Long} other Long to multiply with this.\n * @return {!goog.math.Long} The product of this and the other.\n */\ngoog.math.Long.prototype.multiply = function(other) {\n  if (this.isZero()) {\n    return goog.math.Long.ZERO;\n  } else if (other.isZero()) {\n    return goog.math.Long.ZERO;\n  }\n\n  if (this.equals(goog.math.Long.MIN_VALUE)) {\n    return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n  } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n    return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n  }\n\n  if (this.isNegative()) {\n    if (other.isNegative()) {\n      return this.negate().multiply(other.negate());\n    } else {\n      return this.negate().multiply(other).negate();\n    }\n  } else if (other.isNegative()) {\n    return this.multiply(other.negate()).negate();\n  }\n\n  // If both longs are small, use float multiplication\n  if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\n      other.lessThan(goog.math.Long.TWO_PWR_24_)) {\n    return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\n  }\n\n  // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n  // We can skip products that would overflow.\n\n  var a48 = this.high_ >>> 16;\n  var a32 = this.high_ & 0xFFFF;\n  var a16 = this.low_ >>> 16;\n  var a00 = this.low_ & 0xFFFF;\n\n  var b48 = other.high_ >>> 16;\n  var b32 = other.high_ & 0xFFFF;\n  var b16 = other.low_ >>> 16;\n  var b00 = other.low_ & 0xFFFF;\n\n  var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n  c00 += a00 * b00;\n  c16 += c00 >>> 16;\n  c00 &= 0xFFFF;\n  c16 += a16 * b00;\n  c32 += c16 >>> 16;\n  c16 &= 0xFFFF;\n  c16 += a00 * b16;\n  c32 += c16 >>> 16;\n  c16 &= 0xFFFF;\n  c32 += a32 * b00;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c32 += a16 * b16;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c32 += a00 * b32;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n  c48 &= 0xFFFF;\n  return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n};\n\n\n/**\n * Returns this Long divided by the given one.\n * @param {goog.math.Long} other Long by which to divide.\n * @return {!goog.math.Long} This Long divided by the given one.\n */\ngoog.math.Long.prototype.div = function(other) {\n  if (other.isZero()) {\n    throw Error('division by zero');\n  } else if (this.isZero()) {\n    return goog.math.Long.ZERO;\n  }\n\n  if (this.equals(goog.math.Long.MIN_VALUE)) {\n    if (other.equals(goog.math.Long.ONE) ||\n        other.equals(goog.math.Long.NEG_ONE)) {\n      return goog.math.Long.MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\n    } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n      return goog.math.Long.ONE;\n    } else {\n      // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n      var halfThis = this.shiftRight(1);\n      var approx = halfThis.div(other).shiftLeft(1);\n      if (approx.equals(goog.math.Long.ZERO)) {\n        return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\n      } else {\n        var rem = this.subtract(other.multiply(approx));\n        var result = approx.add(rem.div(other));\n        return result;\n      }\n    }\n  } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n    return goog.math.Long.ZERO;\n  }\n\n  if (this.isNegative()) {\n    if (other.isNegative()) {\n      return this.negate().div(other.negate());\n    } else {\n      return this.negate().div(other).negate();\n    }\n  } else if (other.isNegative()) {\n    return this.div(other.negate()).negate();\n  }\n\n  // Repeat the following until the remainder is less than other:  find a\n  // floating-point that approximates remainder / other *from below*, add this\n  // into the result, and subtract it from the remainder.  It is critical that\n  // the approximate value is less than or equal to the real value so that the\n  // remainder never becomes negative.\n  var res = goog.math.Long.ZERO;\n  var rem = this;\n  while (rem.greaterThanOrEqual(other)) {\n    // Approximate the result of division. This may be a little greater or\n    // smaller than the actual value.\n    var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\n\n    // We will tweak the approximate result by changing it in the 48-th digit or\n    // the smallest non-fractional digit, whichever is larger.\n    var log2 = Math.ceil(Math.log(approx) / Math.LN2);\n    var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\n\n    // Decrease the approximation until it is smaller than the remainder.  Note\n    // that if it is too large, the product overflows and is negative.\n    var approxRes = goog.math.Long.fromNumber(approx);\n    var approxRem = approxRes.multiply(other);\n    while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\n      approx -= delta;\n      approxRes = goog.math.Long.fromNumber(approx);\n      approxRem = approxRes.multiply(other);\n    }\n\n    // We know the answer can't be zero... and actually, zero would cause\n    // infinite recursion since we would make no progress.\n    if (approxRes.isZero()) {\n      approxRes = goog.math.Long.ONE;\n    }\n\n    res = res.add(approxRes);\n    rem = rem.subtract(approxRem);\n  }\n  return res;\n};\n\n\n/**\n * Returns this Long modulo the given one.\n * @param {goog.math.Long} other Long by which to mod.\n * @return {!goog.math.Long} This Long modulo the given one.\n */\ngoog.math.Long.prototype.modulo = function(other) {\n  return this.subtract(this.div(other).multiply(other));\n};\n\n\n/** @return {!goog.math.Long} The bitwise-NOT of this value. */\ngoog.math.Long.prototype.not = function() {\n  return goog.math.Long.fromBits(~this.low_, ~this.high_);\n};\n\n\n/**\n * Returns the bitwise-AND of this Long and the given one.\n * @param {goog.math.Long} other The Long with which to AND.\n * @return {!goog.math.Long} The bitwise-AND of this and the other.\n */\ngoog.math.Long.prototype.and = function(other) {\n  return goog.math.Long.fromBits(this.low_ & other.low_,\n                                 this.high_ & other.high_);\n};\n\n\n/**\n * Returns the bitwise-OR of this Long and the given one.\n * @param {goog.math.Long} other The Long with which to OR.\n * @return {!goog.math.Long} The bitwise-OR of this and the other.\n */\ngoog.math.Long.prototype.or = function(other) {\n  return goog.math.Long.fromBits(this.low_ | other.low_,\n                                 this.high_ | other.high_);\n};\n\n\n/**\n * Returns the bitwise-XOR of this Long and the given one.\n * @param {goog.math.Long} other The Long with which to XOR.\n * @return {!goog.math.Long} The bitwise-XOR of this and the other.\n */\ngoog.math.Long.prototype.xor = function(other) {\n  return goog.math.Long.fromBits(this.low_ ^ other.low_,\n                                 this.high_ ^ other.high_);\n};\n\n\n/**\n * Returns this Long with bits shifted to the left by the given amount.\n * @param {number} numBits The number of bits by which to shift.\n * @return {!goog.math.Long} This shifted to the left by the given amount.\n */\ngoog.math.Long.prototype.shiftLeft = function(numBits) {\n  numBits &= 63;\n  if (numBits == 0) {\n    return this;\n  } else {\n    var low = this.low_;\n    if (numBits < 32) {\n      var high = this.high_;\n      return goog.math.Long.fromBits(\n          low << numBits,\n          (high << numBits) | (low >>> (32 - numBits)));\n    } else {\n      return goog.math.Long.fromBits(0, low << (numBits - 32));\n    }\n  }\n};\n\n\n/**\n * Returns this Long with bits shifted to the right by the given amount.\n * @param {number} numBits The number of bits by which to shift.\n * @return {!goog.math.Long} This shifted to the right by the given amount.\n */\ngoog.math.Long.prototype.shiftRight = function(numBits) {\n  numBits &= 63;\n  if (numBits == 0) {\n    return this;\n  } else {\n    var high = this.high_;\n    if (numBits < 32) {\n      var low = this.low_;\n      return goog.math.Long.fromBits(\n          (low >>> numBits) | (high << (32 - numBits)),\n          high >> numBits);\n    } else {\n      return goog.math.Long.fromBits(\n          high >> (numBits - 32),\n          high >= 0 ? 0 : -1);\n    }\n  }\n};\n\n\n/**\n * Returns this Long with bits shifted to the right by the given amount, with\n * the new top bits matching the current sign bit.\n * @param {number} numBits The number of bits by which to shift.\n * @return {!goog.math.Long} This shifted to the right by the given amount, with\n *     zeros placed into the new leading bits.\n */\ngoog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\n  numBits &= 63;\n  if (numBits == 0) {\n    return this;\n  } else {\n    var high = this.high_;\n    if (numBits < 32) {\n      var low = this.low_;\n      return goog.math.Long.fromBits(\n          (low >>> numBits) | (high << (32 - numBits)),\n          high >>> numBits);\n    } else if (numBits == 32) {\n      return goog.math.Long.fromBits(high, 0);\n    } else {\n      return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\n    }\n  }\n};"
  },
  {
    "path": "app/vendor/console-polyfill/console-polyfill.js",
    "content": "// Console-polyfill. MIT license.\n// https://github.com/paulmillr/console-polyfill\n// Make it safe to do console.log() always.\n(function (con) {\n  'use strict';\n  var prop, method;\n  var empty = {};\n  var dummy = function() {};\n  var properties = 'memory'.split(',');\n  var methods = ('assert,count,debug,dir,dirxml,error,exception,group,' +\n     'groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,' +\n     'time,timeEnd,trace,warn').split(',');\n  while (prop = properties.pop()) con[prop] = con[prop] || empty;\n  while (method = methods.pop()) con[method] = con[method] || dummy;\n})(this.console = this.console || {});\n\n// For Workers compatibility `window` object is replaced with `this` keyword"
  },
  {
    "path": "app/vendor/cryptoJS/THIRDPARTY_LICENSE",
    "content": "Copyright (c) 2009-2013 Jeff Mott\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "app/vendor/cryptoJS/crypto.js",
    "content": "/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\n/**\n * CryptoJS core components.\n */\nvar CryptoJS = CryptoJS || (function (Math, undefined) {\n    /**\n     * CryptoJS namespace.\n     */\n    var C = {};\n\n    /**\n     * Library namespace.\n     */\n    var C_lib = C.lib = {};\n\n    /**\n     * Base object for prototypal inheritance.\n     */\n    var Base = C_lib.Base = (function () {\n        function F() {}\n\n        return {\n            /**\n             * Creates a new object that inherits from this object.\n             *\n             * @param {Object} overrides Properties to copy into the new object.\n             *\n             * @return {Object} The new object.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var MyType = CryptoJS.lib.Base.extend({\n             *         field: 'value',\n             *\n             *         method: function () {\n             *         }\n             *     });\n             */\n            extend: function (overrides) {\n                // Spawn\n                F.prototype = this;\n                var subtype = new F();\n\n                // Augment\n                if (overrides) {\n                    subtype.mixIn(overrides);\n                }\n\n                // Create default initializer\n                if (!subtype.hasOwnProperty('init')) {\n                    subtype.init = function () {\n                        subtype.$super.init.apply(this, arguments);\n                    };\n                }\n\n                // Initializer's prototype is the subtype object\n                subtype.init.prototype = subtype;\n\n                // Reference supertype\n                subtype.$super = this;\n\n                return subtype;\n            },\n\n            /**\n             * Extends this object and runs the init method.\n             * Arguments to create() will be passed to init().\n             *\n             * @return {Object} The new object.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var instance = MyType.create();\n             */\n            create: function () {\n                var instance = this.extend();\n                instance.init.apply(instance, arguments);\n\n                return instance;\n            },\n\n            /**\n             * Initializes a newly created object.\n             * Override this method to add some logic when your objects are created.\n             *\n             * @example\n             *\n             *     var MyType = CryptoJS.lib.Base.extend({\n             *         init: function () {\n             *             // ...\n             *         }\n             *     });\n             */\n            init: function () {\n            },\n\n            /**\n             * Copies properties into this object.\n             *\n             * @param {Object} properties The properties to mix in.\n             *\n             * @example\n             *\n             *     MyType.mixIn({\n             *         field: 'value'\n             *     });\n             */\n            mixIn: function (properties) {\n                for (var propertyName in properties) {\n                    if (properties.hasOwnProperty(propertyName)) {\n                        this[propertyName] = properties[propertyName];\n                    }\n                }\n\n                // IE won't copy toString using the loop above\n                if (properties.hasOwnProperty('toString')) {\n                    this.toString = properties.toString;\n                }\n            },\n\n            /**\n             * Creates a copy of this object.\n             *\n             * @return {Object} The clone.\n             *\n             * @example\n             *\n             *     var clone = instance.clone();\n             */\n            clone: function () {\n                return this.init.prototype.extend(this);\n            }\n        };\n    }());\n\n    /**\n     * An array of 32-bit words.\n     *\n     * @property {Array} words The array of 32-bit words.\n     * @property {number} sigBytes The number of significant bytes in this word array.\n     */\n    var WordArray = C_lib.WordArray = Base.extend({\n        /**\n         * Initializes a newly created word array.\n         *\n         * @param {Array} words (Optional) An array of 32-bit words.\n         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.lib.WordArray.create();\n         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n         */\n        init: function (words, sigBytes) {\n            words = this.words = words || [];\n\n            if (sigBytes != undefined) {\n                this.sigBytes = sigBytes;\n            } else {\n                this.sigBytes = words.length * 4;\n            }\n        },\n\n        /**\n         * Converts this word array to a string.\n         *\n         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n         *\n         * @return {string} The stringified word array.\n         *\n         * @example\n         *\n         *     var string = wordArray + '';\n         *     var string = wordArray.toString();\n         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n         */\n        toString: function (encoder) {\n            return (encoder || Hex).stringify(this);\n        },\n\n        /**\n         * Concatenates a word array to this word array.\n         *\n         * @param {WordArray} wordArray The word array to append.\n         *\n         * @return {WordArray} This word array.\n         *\n         * @example\n         *\n         *     wordArray1.concat(wordArray2);\n         */\n        concat: function (wordArray) {\n            // Shortcuts\n            var thisWords = this.words;\n            var thatWords = wordArray.words;\n            var thisSigBytes = this.sigBytes;\n            var thatSigBytes = wordArray.sigBytes;\n\n            // Clamp excess bits\n            this.clamp();\n\n            // Concat\n            if (thisSigBytes % 4) {\n                // Copy one byte at a time\n                for (var i = 0; i < thatSigBytes; i++) {\n                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n                }\n            } else if (thatWords.length > 0xffff) {\n                // Copy one word at a time\n                for (var i = 0; i < thatSigBytes; i += 4) {\n                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n                }\n            } else {\n                // Copy all words at once\n                // thisWords.push.apply(thisWords, thatWords);\n\n                // HOTFIX from: https://code.google.com/p/crypto-js/issues/detail?id=90\n                for (var i = 0; i < thatWords.length; i++) {\n                  thisWords.push(thatWords[i]);\n                }\n            }\n            this.sigBytes += thatSigBytes;\n\n            // Chainable\n            return this;\n        },\n\n        /**\n         * Removes insignificant bits.\n         *\n         * @example\n         *\n         *     wordArray.clamp();\n         */\n        clamp: function () {\n            // Shortcuts\n            var words = this.words;\n            var sigBytes = this.sigBytes;\n\n            // Clamp\n            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n            words.length = Math.ceil(sigBytes / 4);\n        },\n\n        /**\n         * Creates a copy of this word array.\n         *\n         * @return {WordArray} The clone.\n         *\n         * @example\n         *\n         *     var clone = wordArray.clone();\n         */\n        clone: function () {\n            var clone = Base.clone.call(this);\n            clone.words = this.words.slice(0);\n\n            return clone;\n        },\n\n        /**\n         * Creates a word array filled with random bytes.\n         *\n         * @param {number} nBytes The number of random bytes to generate.\n         *\n         * @return {WordArray} The random word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n         */\n        random: function (nBytes) {\n            var words = [];\n            for (var i = 0; i < nBytes; i += 4) {\n                words.push((Math.random() * 0x100000000) | 0);\n            }\n\n            return new WordArray.init(words, nBytes);\n        }\n    });\n\n    /**\n     * Encoder namespace.\n     */\n    var C_enc = C.enc = {};\n\n    /**\n     * Hex encoding strategy.\n     */\n    var Hex = C_enc.Hex = {\n        /**\n         * Converts a word array to a hex string.\n         *\n         * @param {WordArray} wordArray The word array.\n         *\n         * @return {string} The hex string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n         */\n        stringify: function (wordArray) {\n            // Shortcuts\n            var words = wordArray.words;\n            var sigBytes = wordArray.sigBytes;\n\n            // Convert\n            var hexChars = [];\n            for (var i = 0; i < sigBytes; i++) {\n                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n                hexChars.push((bite >>> 4).toString(16));\n                hexChars.push((bite & 0x0f).toString(16));\n            }\n\n            return hexChars.join('');\n        },\n\n        /**\n         * Converts a hex string to a word array.\n         *\n         * @param {string} hexStr The hex string.\n         *\n         * @return {WordArray} The word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n         */\n        parse: function (hexStr) {\n            // Shortcut\n            var hexStrLength = hexStr.length;\n\n            // Convert\n            var words = [];\n            for (var i = 0; i < hexStrLength; i += 2) {\n                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n            }\n\n            return new WordArray.init(words, hexStrLength / 2);\n        }\n    };\n\n    /**\n     * Latin1 encoding strategy.\n     */\n    var Latin1 = C_enc.Latin1 = {\n        /**\n         * Converts a word array to a Latin1 string.\n         *\n         * @param {WordArray} wordArray The word array.\n         *\n         * @return {string} The Latin1 string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n         */\n        stringify: function (wordArray) {\n            // Shortcuts\n            var words = wordArray.words;\n            var sigBytes = wordArray.sigBytes;\n\n            // Convert\n            var latin1Chars = [];\n            for (var i = 0; i < sigBytes; i++) {\n                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n                latin1Chars.push(String.fromCharCode(bite));\n            }\n\n            return latin1Chars.join('');\n        },\n\n        /**\n         * Converts a Latin1 string to a word array.\n         *\n         * @param {string} latin1Str The Latin1 string.\n         *\n         * @return {WordArray} The word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n         */\n        parse: function (latin1Str) {\n            // Shortcut\n            var latin1StrLength = latin1Str.length;\n\n            // Convert\n            var words = [];\n            for (var i = 0; i < latin1StrLength; i++) {\n                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n            }\n\n            return new WordArray.init(words, latin1StrLength);\n        }\n    };\n\n    /**\n     * UTF-8 encoding strategy.\n     */\n    var Utf8 = C_enc.Utf8 = {\n        /**\n         * Converts a word array to a UTF-8 string.\n         *\n         * @param {WordArray} wordArray The word array.\n         *\n         * @return {string} The UTF-8 string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n         */\n        stringify: function (wordArray) {\n            try {\n                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n            } catch (e) {\n                throw new Error('Malformed UTF-8 data');\n            }\n        },\n\n        /**\n         * Converts a UTF-8 string to a word array.\n         *\n         * @param {string} utf8Str The UTF-8 string.\n         *\n         * @return {WordArray} The word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n         */\n        parse: function (utf8Str) {\n            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n        }\n    };\n\n    /**\n     * Abstract buffered block algorithm template.\n     *\n     * The property blockSize must be implemented in a concrete subtype.\n     *\n     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n     */\n    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n        /**\n         * Resets this block algorithm's data buffer to its initial state.\n         *\n         * @example\n         *\n         *     bufferedBlockAlgorithm.reset();\n         */\n        reset: function () {\n            // Initial values\n            this._data = new WordArray.init();\n            this._nDataBytes = 0;\n        },\n\n        /**\n         * Adds new data to this block algorithm's buffer.\n         *\n         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n         *\n         * @example\n         *\n         *     bufferedBlockAlgorithm._append('data');\n         *     bufferedBlockAlgorithm._append(wordArray);\n         */\n        _append: function (data) {\n            // Convert string to WordArray, else assume WordArray already\n            if (typeof data == 'string') {\n                data = Utf8.parse(data);\n            }\n\n            // Append\n            this._data.concat(data);\n            this._nDataBytes += data.sigBytes;\n        },\n\n        /**\n         * Processes available data blocks.\n         *\n         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n         *\n         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n         *\n         * @return {WordArray} The processed data.\n         *\n         * @example\n         *\n         *     var processedData = bufferedBlockAlgorithm._process();\n         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n         */\n        _process: function (doFlush) {\n            // Shortcuts\n            var data = this._data;\n            var dataWords = data.words;\n            var dataSigBytes = data.sigBytes;\n            var blockSize = this.blockSize;\n            var blockSizeBytes = blockSize * 4;\n\n            // Count blocks ready\n            var nBlocksReady = dataSigBytes / blockSizeBytes;\n            if (doFlush) {\n                // Round up to include partial blocks\n                nBlocksReady = Math.ceil(nBlocksReady);\n            } else {\n                // Round down to include only full blocks,\n                // less the number of blocks that must remain in the buffer\n                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n            }\n\n            // Count words ready\n            var nWordsReady = nBlocksReady * blockSize;\n\n            // Count bytes ready\n            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n            // Process blocks\n            if (nWordsReady) {\n                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n                    // Perform concrete-algorithm logic\n                    this._doProcessBlock(dataWords, offset);\n                }\n\n                // Remove processed words\n                var processedWords = dataWords.splice(0, nWordsReady);\n                data.sigBytes -= nBytesReady;\n            }\n\n            // Return processed words\n            return new WordArray.init(processedWords, nBytesReady);\n        },\n\n        /**\n         * Creates a copy of this object.\n         *\n         * @return {Object} The clone.\n         *\n         * @example\n         *\n         *     var clone = bufferedBlockAlgorithm.clone();\n         */\n        clone: function () {\n            var clone = Base.clone.call(this);\n            clone._data = this._data.clone();\n\n            return clone;\n        },\n\n        _minBufferSize: 0\n    });\n\n    /**\n     * Abstract hasher template.\n     *\n     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n     */\n    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n        /**\n         * Configuration options.\n         */\n        cfg: Base.extend(),\n\n        /**\n         * Initializes a newly created hasher.\n         *\n         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n         *\n         * @example\n         *\n         *     var hasher = CryptoJS.algo.SHA256.create();\n         */\n        init: function (cfg) {\n            // Apply config defaults\n            this.cfg = this.cfg.extend(cfg);\n\n            // Set initial values\n            this.reset();\n        },\n\n        /**\n         * Resets this hasher to its initial state.\n         *\n         * @example\n         *\n         *     hasher.reset();\n         */\n        reset: function () {\n            // Reset data buffer\n            BufferedBlockAlgorithm.reset.call(this);\n\n            // Perform concrete-hasher logic\n            this._doReset();\n        },\n\n        /**\n         * Updates this hasher with a message.\n         *\n         * @param {WordArray|string} messageUpdate The message to append.\n         *\n         * @return {Hasher} This hasher.\n         *\n         * @example\n         *\n         *     hasher.update('message');\n         *     hasher.update(wordArray);\n         */\n        update: function (messageUpdate) {\n            // Append\n            this._append(messageUpdate);\n\n            // Update the hash\n            this._process();\n\n            // Chainable\n            return this;\n        },\n\n        /**\n         * Finalizes the hash computation.\n         * Note that the finalize operation is effectively a destructive, read-once operation.\n         *\n         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n         *\n         * @return {WordArray} The hash.\n         *\n         * @example\n         *\n         *     var hash = hasher.finalize();\n         *     var hash = hasher.finalize('message');\n         *     var hash = hasher.finalize(wordArray);\n         */\n        finalize: function (messageUpdate) {\n            // Final message update\n            if (messageUpdate) {\n                this._append(messageUpdate);\n            }\n\n            // Perform concrete-hasher logic\n            var hash = this._doFinalize();\n\n            return hash;\n        },\n\n        blockSize: 512/32,\n\n        /**\n         * Creates a shortcut function to a hasher's object interface.\n         *\n         * @param {Hasher} hasher The hasher to create a helper for.\n         *\n         * @return {Function} The shortcut function.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n         */\n        _createHelper: function (hasher) {\n            return function (message, cfg) {\n                return new hasher.init(cfg).finalize(message);\n            };\n        },\n\n        /**\n         * Creates a shortcut function to the HMAC's object interface.\n         *\n         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n         *\n         * @return {Function} The shortcut function.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n         */\n        _createHmacHelper: function (hasher) {\n            return function (message, key) {\n                return new C_algo.HMAC.init(hasher, key).finalize(message);\n            };\n        }\n    });\n\n    /**\n     * Algorithm namespace.\n     */\n    var C_algo = C.algo = {};\n\n    return C;\n}(Math));\n\n\n\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\n/**\n * Cipher core components.\n */\nCryptoJS.lib.Cipher || (function (undefined) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var Base = C_lib.Base;\n    var WordArray = C_lib.WordArray;\n    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n    var C_enc = C.enc;\n    var Utf8 = C_enc.Utf8;\n    var Base64 = C_enc.Base64;\n    var C_algo = C.algo;\n    var EvpKDF = C_algo.EvpKDF;\n\n    /**\n     * Abstract base cipher template.\n     *\n     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n     */\n    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {WordArray} iv The IV to use for this operation.\n         */\n        cfg: Base.extend(),\n\n        /**\n         * Creates this cipher in encryption mode.\n         *\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {Cipher} A cipher instance.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n         */\n        createEncryptor: function (key, cfg) {\n            return this.create(this._ENC_XFORM_MODE, key, cfg);\n        },\n\n        /**\n         * Creates this cipher in decryption mode.\n         *\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {Cipher} A cipher instance.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n         */\n        createDecryptor: function (key, cfg) {\n            return this.create(this._DEC_XFORM_MODE, key, cfg);\n        },\n\n        /**\n         * Initializes a newly created cipher.\n         *\n         * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @example\n         *\n         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n         */\n        init: function (xformMode, key, cfg) {\n            // Apply config defaults\n            this.cfg = this.cfg.extend(cfg);\n\n            // Store transform mode and key\n            this._xformMode = xformMode;\n            this._key = key;\n\n            // Set initial values\n            this.reset();\n        },\n\n        /**\n         * Resets this cipher to its initial state.\n         *\n         * @example\n         *\n         *     cipher.reset();\n         */\n        reset: function () {\n            // Reset data buffer\n            BufferedBlockAlgorithm.reset.call(this);\n\n            // Perform concrete-cipher logic\n            this._doReset();\n        },\n\n        /**\n         * Adds data to be encrypted or decrypted.\n         *\n         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n         *\n         * @return {WordArray} The data after processing.\n         *\n         * @example\n         *\n         *     var encrypted = cipher.process('data');\n         *     var encrypted = cipher.process(wordArray);\n         */\n        process: function (dataUpdate) {\n            // Append\n            this._append(dataUpdate);\n\n            // Process available blocks\n            return this._process();\n        },\n\n        /**\n         * Finalizes the encryption or decryption process.\n         * Note that the finalize operation is effectively a destructive, read-once operation.\n         *\n         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n         *\n         * @return {WordArray} The data after final processing.\n         *\n         * @example\n         *\n         *     var encrypted = cipher.finalize();\n         *     var encrypted = cipher.finalize('data');\n         *     var encrypted = cipher.finalize(wordArray);\n         */\n        finalize: function (dataUpdate) {\n            // Final data update\n            if (dataUpdate) {\n                this._append(dataUpdate);\n            }\n\n            // Perform concrete-cipher logic\n            var finalProcessedData = this._doFinalize();\n\n            return finalProcessedData;\n        },\n\n        keySize: 128/32,\n\n        ivSize: 128/32,\n\n        _ENC_XFORM_MODE: 1,\n\n        _DEC_XFORM_MODE: 2,\n\n        /**\n         * Creates shortcut functions to a cipher's object interface.\n         *\n         * @param {Cipher} cipher The cipher to create a helper for.\n         *\n         * @return {Object} An object with encrypt and decrypt shortcut functions.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n         */\n        _createHelper: (function () {\n            function selectCipherStrategy(key) {\n                if (typeof key == 'string') {\n                    return PasswordBasedCipher;\n                } else {\n                    return SerializableCipher;\n                }\n            }\n\n            return function (cipher) {\n                return {\n                    encrypt: function (message, key, cfg) {\n                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n                    },\n\n                    decrypt: function (ciphertext, key, cfg) {\n                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n                    }\n                };\n            };\n        }())\n    });\n\n    /**\n     * Abstract base stream cipher template.\n     *\n     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n     */\n    var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n        _doFinalize: function () {\n            // Process partial blocks\n            var finalProcessedBlocks = this._process(!!'flush');\n\n            return finalProcessedBlocks;\n        },\n\n        blockSize: 1\n    });\n\n    /**\n     * Mode namespace.\n     */\n    var C_mode = C.mode = {};\n\n    /**\n     * Abstract base block cipher mode template.\n     */\n    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n        /**\n         * Creates this mode for encryption.\n         *\n         * @param {Cipher} cipher A block cipher instance.\n         * @param {Array} iv The IV words.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n         */\n        createEncryptor: function (cipher, iv) {\n            return this.Encryptor.create(cipher, iv);\n        },\n\n        /**\n         * Creates this mode for decryption.\n         *\n         * @param {Cipher} cipher A block cipher instance.\n         * @param {Array} iv The IV words.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n         */\n        createDecryptor: function (cipher, iv) {\n            return this.Decryptor.create(cipher, iv);\n        },\n\n        /**\n         * Initializes a newly created mode.\n         *\n         * @param {Cipher} cipher A block cipher instance.\n         * @param {Array} iv The IV words.\n         *\n         * @example\n         *\n         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n         */\n        init: function (cipher, iv) {\n            this._cipher = cipher;\n            this._iv = iv;\n        }\n    });\n\n    /**\n     * Cipher Block Chaining mode.\n     */\n    var CBC = C_mode.CBC = (function () {\n        /**\n         * Abstract base CBC mode.\n         */\n        var CBC = BlockCipherMode.extend();\n\n        /**\n         * CBC encryptor.\n         */\n        CBC.Encryptor = CBC.extend({\n            /**\n             * Processes the data block at offset.\n             *\n             * @param {Array} words The data words to operate on.\n             * @param {number} offset The offset where the block starts.\n             *\n             * @example\n             *\n             *     mode.processBlock(data.words, offset);\n             */\n            processBlock: function (words, offset) {\n                // Shortcuts\n                var cipher = this._cipher;\n                var blockSize = cipher.blockSize;\n\n                // XOR and encrypt\n                xorBlock.call(this, words, offset, blockSize);\n                cipher.encryptBlock(words, offset);\n\n                // Remember this block to use with next block\n                this._prevBlock = words.slice(offset, offset + blockSize);\n            }\n        });\n\n        /**\n         * CBC decryptor.\n         */\n        CBC.Decryptor = CBC.extend({\n            /**\n             * Processes the data block at offset.\n             *\n             * @param {Array} words The data words to operate on.\n             * @param {number} offset The offset where the block starts.\n             *\n             * @example\n             *\n             *     mode.processBlock(data.words, offset);\n             */\n            processBlock: function (words, offset) {\n                // Shortcuts\n                var cipher = this._cipher;\n                var blockSize = cipher.blockSize;\n\n                // Remember this block to use with next block\n                var thisBlock = words.slice(offset, offset + blockSize);\n\n                // Decrypt and XOR\n                cipher.decryptBlock(words, offset);\n                xorBlock.call(this, words, offset, blockSize);\n\n                // This block becomes the previous block\n                this._prevBlock = thisBlock;\n            }\n        });\n\n        function xorBlock(words, offset, blockSize) {\n            // Shortcut\n            var iv = this._iv;\n\n            // Choose mixing block\n            if (iv) {\n                var block = iv;\n\n                // Remove IV for subsequent blocks\n                this._iv = undefined;\n            } else {\n                var block = this._prevBlock;\n            }\n\n            // XOR blocks\n            for (var i = 0; i < blockSize; i++) {\n                words[offset + i] ^= block[i];\n            }\n        }\n\n        return CBC;\n    }());\n\n\n    /**\n     * Infinite Garble Extension mode.\n     */\n    var IGE = C_mode.IGE = (function () {\n        /**\n         * Abstract base IGE mode.\n         */\n        var IGE = BlockCipherMode.extend();\n\n        /**\n         * IGE encryptor.\n         */\n        IGE.Encryptor = IGE.extend({\n            /**\n             * Processes the data block at offset.\n             *\n             * @param {Array} words The data words to operate on.\n             * @param {number} offset The offset where the block starts.\n             *\n             * @example\n             *\n             *     mode.processBlock(data.words, offset);\n             */\n            processBlock: function (words, offset) {\n                // Shortcuts\n                var cipher = this._cipher;\n                var blockSize = cipher.blockSize;\n\n                if (this._ivp === undefined) {\n                  this._ivp = this._iv.slice(0, blockSize);\n                  this._iv2p = this._iv.slice(blockSize, blockSize + blockSize);\n                }\n\n\n                // Remember this block to use with next block\n                var nextIv2p = words.slice(offset, offset + blockSize);\n\n                // XOR with previous ciphertext\n                xorBlock(words, this._ivp, offset, blockSize);\n\n                // Block cipher\n                cipher.encryptBlock(words, offset);\n\n                // XOR with previous plaintext\n                xorBlock(words, this._iv2p, offset, blockSize);\n\n                this._ivp = words.slice(offset, offset + blockSize);\n                this._iv2p = nextIv2p;\n            }\n        });\n\n        /**\n         * IGE decryptor.\n         */\n        IGE.Decryptor = IGE.extend({\n            /**\n             * Processes the data block at offset.\n             *\n             * @param {Array} words The data words to operate on.\n             * @param {number} offset The offset where the block starts.\n             *\n             * @example\n             *\n             *     mode.processBlock(data.words, offset);\n             */\n            processBlock: function (words, offset) {\n                // Shortcuts\n                var cipher = this._cipher;\n                var blockSize = cipher.blockSize;\n\n                if (this._ivp === undefined) {\n                  this._ivp = this._iv.slice(0, blockSize);\n                  this._iv2p = this._iv.slice(blockSize, 2 * blockSize);\n                }\n\n                // Remember this block to use with next block\n                var nextIvp = words.slice(offset, offset + blockSize);\n\n                // XOR with previous ciphertext\n                xorBlock(words, this._iv2p, offset, blockSize);\n\n                // Block cipher\n                cipher.decryptBlock(words, offset);\n\n                // XOR with previous plaintext\n                xorBlock(words, this._ivp, offset, blockSize);\n\n                this._ivp = nextIvp;\n                this._iv2p = words.slice(offset, offset + blockSize);\n            }\n        });\n\n        function xorBlock(words, block, offset, blockSize) {\n            for (var i = 0; i < blockSize; i++) {\n                words[offset + i] ^= block[i];\n            }\n        }\n\n        return IGE;\n    }());\n\n    /**\n     * Padding namespace.\n     */\n    var C_pad = C.pad = {};\n\n    /**\n     * PKCS #5/7 padding strategy.\n     */\n    var Pkcs7 = C_pad.Pkcs7 = {\n        /**\n         * Pads data using the algorithm defined in PKCS #5/7.\n         *\n         * @param {WordArray} data The data to pad.\n         * @param {number} blockSize The multiple that the data should be padded to.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n         */\n        pad: function (data, blockSize) {\n            // Shortcut\n            var blockSizeBytes = blockSize * 4;\n\n            // Count padding bytes\n            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n            // Create padding word\n            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n            // Create padding\n            var paddingWords = [];\n            for (var i = 0; i < nPaddingBytes; i += 4) {\n                paddingWords.push(paddingWord);\n            }\n            var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n            // Add padding\n            data.concat(padding);\n        },\n\n        /**\n         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n         *\n         * @param {WordArray} data The data to unpad.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n         */\n        unpad: function (data) {\n            // Get number of padding bytes from last byte\n            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n            // Remove padding\n            data.sigBytes -= nPaddingBytes;\n        }\n    };\n\n    var NoPadding = C_pad.NoPadding = {\n        pad: function () {\n        },\n\n        unpad: function () {\n        }\n    };\n\n\n    /**\n     * Abstract base block cipher template.\n     *\n     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n     */\n    var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {Mode} mode The block mode to use. Default: CBC\n         * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n         */\n        cfg: Cipher.cfg.extend({\n            mode: CBC,\n            padding: Pkcs7\n        }),\n\n        reset: function () {\n            // Reset cipher\n            Cipher.reset.call(this);\n\n            // Shortcuts\n            var cfg = this.cfg;\n            var iv = cfg.iv;\n            var mode = cfg.mode;\n\n            // Reset block mode\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                var modeCreator = mode.createEncryptor;\n            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n                var modeCreator = mode.createDecryptor;\n\n                // Keep at least one block in the buffer for unpadding\n                this._minBufferSize = 1;\n            }\n            this._mode = modeCreator.call(mode, this, iv && iv.words);\n        },\n\n        _doProcessBlock: function (words, offset) {\n            this._mode.processBlock(words, offset);\n        },\n\n        _doFinalize: function () {\n            // Shortcut\n            var padding = this.cfg.padding;\n\n            // Finalize\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                // Pad data\n                padding.pad(this._data, this.blockSize);\n\n                // Process final blocks\n                var finalProcessedBlocks = this._process(!!'flush');\n            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n                // Process final blocks\n                var finalProcessedBlocks = this._process(!!'flush');\n\n                // Unpad data\n                padding.unpad(finalProcessedBlocks);\n            }\n\n            return finalProcessedBlocks;\n        },\n\n        blockSize: 128/32\n    });\n\n    /**\n     * A collection of cipher parameters.\n     *\n     * @property {WordArray} ciphertext The raw ciphertext.\n     * @property {WordArray} key The key to this ciphertext.\n     * @property {WordArray} iv The IV used in the ciphering operation.\n     * @property {WordArray} salt The salt used with a key derivation function.\n     * @property {Cipher} algorithm The cipher algorithm.\n     * @property {Mode} mode The block mode used in the ciphering operation.\n     * @property {Padding} padding The padding scheme used in the ciphering operation.\n     * @property {number} blockSize The block size of the cipher.\n     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n     */\n    var CipherParams = C_lib.CipherParams = Base.extend({\n        /**\n         * Initializes a newly created cipher params object.\n         *\n         * @param {Object} cipherParams An object with any of the possible cipher parameters.\n         *\n         * @example\n         *\n         *     var cipherParams = CryptoJS.lib.CipherParams.create({\n         *         ciphertext: ciphertextWordArray,\n         *         key: keyWordArray,\n         *         iv: ivWordArray,\n         *         salt: saltWordArray,\n         *         algorithm: CryptoJS.algo.AES,\n         *         mode: CryptoJS.mode.CBC,\n         *         padding: CryptoJS.pad.PKCS7,\n         *         blockSize: 4,\n         *         formatter: CryptoJS.format.OpenSSL\n         *     });\n         */\n        init: function (cipherParams) {\n            this.mixIn(cipherParams);\n        },\n\n        /**\n         * Converts this cipher params object to a string.\n         *\n         * @param {Format} formatter (Optional) The formatting strategy to use.\n         *\n         * @return {string} The stringified cipher params.\n         *\n         * @throws Error If neither the formatter nor the default formatter is set.\n         *\n         * @example\n         *\n         *     var string = cipherParams + '';\n         *     var string = cipherParams.toString();\n         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n         */\n        toString: function (formatter) {\n            return (formatter || this.formatter).stringify(this);\n        }\n    });\n\n    /**\n     * Format namespace.\n     */\n    var C_format = C.format = {};\n\n    /**\n     * OpenSSL formatting strategy.\n     */\n    var OpenSSLFormatter = C_format.OpenSSL = {\n        /**\n         * Converts a cipher params object to an OpenSSL-compatible string.\n         *\n         * @param {CipherParams} cipherParams The cipher params object.\n         *\n         * @return {string} The OpenSSL-compatible string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n         */\n        stringify: function (cipherParams) {\n            // Shortcuts\n            var ciphertext = cipherParams.ciphertext;\n            var salt = cipherParams.salt;\n\n            // Format\n            if (salt) {\n                var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n            } else {\n                var wordArray = ciphertext;\n            }\n\n            return wordArray.toString(Base64);\n        },\n\n        /**\n         * Converts an OpenSSL-compatible string to a cipher params object.\n         *\n         * @param {string} openSSLStr The OpenSSL-compatible string.\n         *\n         * @return {CipherParams} The cipher params object.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n         */\n        parse: function (openSSLStr) {\n            // Parse base64\n            var ciphertext = Base64.parse(openSSLStr);\n\n            // Shortcut\n            var ciphertextWords = ciphertext.words;\n\n            // Test for salt\n            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n                // Extract salt\n                var salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n                // Remove salt from ciphertext\n                ciphertextWords.splice(0, 4);\n                ciphertext.sigBytes -= 16;\n            }\n\n            return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n        }\n    };\n\n    /**\n     * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n     */\n    var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n         */\n        cfg: Base.extend({\n            format: OpenSSLFormatter\n        }),\n\n        /**\n         * Encrypts a message.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {WordArray|string} message The message to encrypt.\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {CipherParams} A cipher params object.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n         */\n        encrypt: function (cipher, message, key, cfg) {\n            // Apply config defaults\n            cfg = this.cfg.extend(cfg);\n\n            // Encrypt\n            var encryptor = cipher.createEncryptor(key, cfg);\n            var ciphertext = encryptor.finalize(message);\n\n            // Shortcut\n            var cipherCfg = encryptor.cfg;\n\n            // Create and return serializable cipher params\n            return CipherParams.create({\n                ciphertext: ciphertext,\n                key: key,\n                iv: cipherCfg.iv,\n                algorithm: cipher,\n                mode: cipherCfg.mode,\n                padding: cipherCfg.padding,\n                blockSize: cipher.blockSize,\n                formatter: cfg.format\n            });\n        },\n\n        /**\n         * Decrypts serialized ciphertext.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {WordArray} The plaintext.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n         */\n        decrypt: function (cipher, ciphertext, key, cfg) {\n            // Apply config defaults\n            cfg = this.cfg.extend(cfg);\n\n            // Convert string to CipherParams\n            ciphertext = this._parse(ciphertext, cfg.format);\n\n            // Decrypt\n            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n            return plaintext;\n        },\n\n        /**\n         * Converts serialized ciphertext to CipherParams,\n         * else assumed CipherParams already and returns ciphertext unchanged.\n         *\n         * @param {CipherParams|string} ciphertext The ciphertext.\n         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n         *\n         * @return {CipherParams} The unserialized ciphertext.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n         */\n        _parse: function (ciphertext, format) {\n            if (typeof ciphertext == 'string') {\n                return format.parse(ciphertext, this);\n            } else {\n                return ciphertext;\n            }\n        }\n    });\n\n    /**\n     * Key derivation function namespace.\n     */\n    var C_kdf = C.kdf = {};\n\n    /**\n     * OpenSSL key derivation function.\n     */\n    var OpenSSLKdf = C_kdf.OpenSSL = {\n        /**\n         * Derives a key and IV from a password.\n         *\n         * @param {string} password The password to derive from.\n         * @param {number} keySize The size in words of the key to generate.\n         * @param {number} ivSize The size in words of the IV to generate.\n         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n         *\n         * @return {CipherParams} A cipher params object with the key, IV, and salt.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n         */\n        execute: function (password, keySize, ivSize, salt) {\n            // Generate random salt\n            if (!salt) {\n                salt = WordArray.random(64/8);\n            }\n\n            // Derive key and IV\n            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\n            // Separate key and IV\n            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n            key.sigBytes = keySize * 4;\n\n            // Return params\n            return CipherParams.create({ key: key, iv: iv, salt: salt });\n        }\n    };\n\n    /**\n     * A serializable cipher wrapper that derives the key from a password,\n     * and returns ciphertext as a serializable cipher params object.\n     */\n    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n         */\n        cfg: SerializableCipher.cfg.extend({\n            kdf: OpenSSLKdf\n        }),\n\n        /**\n         * Encrypts a message using a password.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {WordArray|string} message The message to encrypt.\n         * @param {string} password The password.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {CipherParams} A cipher params object.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n         */\n        encrypt: function (cipher, message, password, cfg) {\n            // Apply config defaults\n            cfg = this.cfg.extend(cfg);\n\n            // Derive key and other params\n            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n            // Add IV to config\n            cfg.iv = derivedParams.iv;\n\n            // Encrypt\n            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n            // Mix in derived params\n            ciphertext.mixIn(derivedParams);\n\n            return ciphertext;\n        },\n\n        /**\n         * Decrypts serialized ciphertext using a password.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n         * @param {string} password The password.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {WordArray} The plaintext.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n         */\n        decrypt: function (cipher, ciphertext, password, cfg) {\n            // Apply config defaults\n            cfg = this.cfg.extend(cfg);\n\n            // Convert string to CipherParams\n            ciphertext = this._parse(ciphertext, cfg.format);\n\n            // Derive key and other params\n            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\n\n            // Add IV to config\n            cfg.iv = derivedParams.iv;\n\n            // Decrypt\n            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n            return plaintext;\n        }\n    });\n}());\n\n\n\n\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\n(function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var BlockCipher = C_lib.BlockCipher;\n    var C_algo = C.algo;\n\n    // Lookup tables\n    var SBOX = [];\n    var INV_SBOX = [];\n    var SUB_MIX_0 = [];\n    var SUB_MIX_1 = [];\n    var SUB_MIX_2 = [];\n    var SUB_MIX_3 = [];\n    var INV_SUB_MIX_0 = [];\n    var INV_SUB_MIX_1 = [];\n    var INV_SUB_MIX_2 = [];\n    var INV_SUB_MIX_3 = [];\n\n    // Compute lookup tables\n    (function () {\n        // Compute double table\n        var d = [];\n        for (var i = 0; i < 256; i++) {\n            if (i < 128) {\n                d[i] = i << 1;\n            } else {\n                d[i] = (i << 1) ^ 0x11b;\n            }\n        }\n\n        // Walk GF(2^8)\n        var x = 0;\n        var xi = 0;\n        for (var i = 0; i < 256; i++) {\n            // Compute sbox\n            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n            SBOX[x] = sx;\n            INV_SBOX[sx] = x;\n\n            // Compute multiplication\n            var x2 = d[x];\n            var x4 = d[x2];\n            var x8 = d[x4];\n\n            // Compute sub bytes, mix columns tables\n            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n            SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n            SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);\n            SUB_MIX_3[x] = t;\n\n            // Compute inv sub bytes, inv mix columns tables\n            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);\n            INV_SUB_MIX_3[sx] = t;\n\n            // Compute next counter\n            if (!x) {\n                x = xi = 1;\n            } else {\n                x = x2 ^ d[d[d[x8 ^ x2]]];\n                xi ^= d[d[xi]];\n            }\n        }\n    }());\n\n    // Precomputed Rcon lookup\n    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n    /**\n     * AES block cipher algorithm.\n     */\n    var AES = C_algo.AES = BlockCipher.extend({\n        _doReset: function () {\n            // Shortcuts\n            var key = this._key;\n            var keyWords = key.words;\n            var keySize = key.sigBytes / 4;\n\n            // Compute number of rounds\n            var nRounds = this._nRounds = keySize + 6\n\n            // Compute number of key schedule rows\n            var ksRows = (nRounds + 1) * 4;\n\n            // Compute key schedule\n            var keySchedule = this._keySchedule = [];\n            for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n                if (ksRow < keySize) {\n                    keySchedule[ksRow] = keyWords[ksRow];\n                } else {\n                    var t = keySchedule[ksRow - 1];\n\n                    if (!(ksRow % keySize)) {\n                        // Rot word\n                        t = (t << 8) | (t >>> 24);\n\n                        // Sub word\n                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n                        // Mix Rcon\n                        t ^= RCON[(ksRow / keySize) | 0] << 24;\n                    } else if (keySize > 6 && ksRow % keySize == 4) {\n                        // Sub word\n                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n                    }\n\n                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n                }\n            }\n\n            // Compute inv key schedule\n            var invKeySchedule = this._invKeySchedule = [];\n            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n                var ksRow = ksRows - invKsRow;\n\n                if (invKsRow % 4) {\n                    var t = keySchedule[ksRow];\n                } else {\n                    var t = keySchedule[ksRow - 4];\n                }\n\n                if (invKsRow < 4 || ksRow <= 4) {\n                    invKeySchedule[invKsRow] = t;\n                } else {\n                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n                }\n            }\n        },\n\n        encryptBlock: function (M, offset) {\n            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n        },\n\n        decryptBlock: function (M, offset) {\n            // Swap 2nd and 4th rows\n            var t = M[offset + 1];\n            M[offset + 1] = M[offset + 3];\n            M[offset + 3] = t;\n\n            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n            // Inv swap 2nd and 4th rows\n            var t = M[offset + 1];\n            M[offset + 1] = M[offset + 3];\n            M[offset + 3] = t;\n        },\n\n        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n            // Shortcut\n            var nRounds = this._nRounds;\n\n            // Get input, add round key\n            var s0 = M[offset]     ^ keySchedule[0];\n            var s1 = M[offset + 1] ^ keySchedule[1];\n            var s2 = M[offset + 2] ^ keySchedule[2];\n            var s3 = M[offset + 3] ^ keySchedule[3];\n\n            // Key schedule row counter\n            var ksRow = 4;\n\n            // Rounds\n            for (var round = 1; round < nRounds; round++) {\n                // Shift rows, sub bytes, mix columns, add round key\n                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n                // Update state\n                s0 = t0;\n                s1 = t1;\n                s2 = t2;\n                s3 = t3;\n            }\n\n            // Shift rows, sub bytes, add round key\n            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n            // Set output\n            M[offset]     = t0;\n            M[offset + 1] = t1;\n            M[offset + 2] = t2;\n            M[offset + 3] = t3;\n        },\n\n        keySize: 256/32\n    });\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n     */\n    C.AES = BlockCipher._createHelper(AES);\n}());\n\n\n\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\n(function (Math) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var Hasher = C_lib.Hasher;\n    var C_algo = C.algo;\n\n    // Initialization and round constants tables\n    var H = [];\n    var K = [];\n\n    // Compute constants\n    (function () {\n        function isPrime(n) {\n            var sqrtN = Math.sqrt(n);\n            for (var factor = 2; factor <= sqrtN; factor++) {\n                if (!(n % factor)) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        function getFractionalBits(n) {\n            return ((n - (n | 0)) * 0x100000000) | 0;\n        }\n\n        var n = 2;\n        var nPrime = 0;\n        while (nPrime < 64) {\n            if (isPrime(n)) {\n                if (nPrime < 8) {\n                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n                }\n                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n                nPrime++;\n            }\n\n            n++;\n        }\n    }());\n\n    // Reusable object\n    var W = [];\n\n    /**\n     * SHA-256 hash algorithm.\n     */\n    var SHA256 = C_algo.SHA256 = Hasher.extend({\n        _doReset: function () {\n            this._hash = new WordArray.init(H.slice(0));\n        },\n\n        _doProcessBlock: function (M, offset) {\n            // Shortcut\n            var H = this._hash.words;\n\n            // Working variables\n            var a = H[0];\n            var b = H[1];\n            var c = H[2];\n            var d = H[3];\n            var e = H[4];\n            var f = H[5];\n            var g = H[6];\n            var h = H[7];\n\n            // Computation\n            for (var i = 0; i < 64; i++) {\n                if (i < 16) {\n                    W[i] = M[offset + i] | 0;\n                } else {\n                    var gamma0x = W[i - 15];\n                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n                                   (gamma0x >>> 3);\n\n                    var gamma1x = W[i - 2];\n                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n                                   (gamma1x >>> 10);\n\n                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n                }\n\n                var ch  = (e & f) ^ (~e & g);\n                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n                var t1 = h + sigma1 + ch + K[i] + W[i];\n                var t2 = sigma0 + maj;\n\n                h = g;\n                g = f;\n                f = e;\n                e = (d + t1) | 0;\n                d = c;\n                c = b;\n                b = a;\n                a = (t1 + t2) | 0;\n            }\n\n            // Intermediate hash value\n            H[0] = (H[0] + a) | 0;\n            H[1] = (H[1] + b) | 0;\n            H[2] = (H[2] + c) | 0;\n            H[3] = (H[3] + d) | 0;\n            H[4] = (H[4] + e) | 0;\n            H[5] = (H[5] + f) | 0;\n            H[6] = (H[6] + g) | 0;\n            H[7] = (H[7] + h) | 0;\n        },\n\n        _doFinalize: function () {\n            // Shortcuts\n            var data = this._data;\n            var dataWords = data.words;\n\n            var nBitsTotal = this._nDataBytes * 8;\n            var nBitsLeft = data.sigBytes * 8;\n\n            // Add padding\n            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n            data.sigBytes = dataWords.length * 4;\n\n            // Hash final blocks\n            this._process();\n\n            // Return final computed hash\n            return this._hash;\n        },\n\n        clone: function () {\n            var clone = Hasher.clone.call(this);\n            clone._hash = this._hash.clone();\n\n            return clone;\n        }\n    });\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.SHA256('message');\n     *     var hash = CryptoJS.SHA256(wordArray);\n     */\n    C.SHA256 = Hasher._createHelper(SHA256);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacSHA256(message, key);\n     */\n    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n}(Math));\n"
  },
  {
    "path": "app/vendor/jquery/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v1.11.1\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-05-01T17:42Z\n */\n\n(function( global, factory ) {\n\n  if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n    // For CommonJS and CommonJS-like environments where a proper window is present,\n    // execute the factory and get jQuery\n    // For environments that do not inherently posses a window with a document\n    // (such as Node.js), expose a jQuery-making factory as module.exports\n    // This accentuates the need for the creation of a real window\n    // e.g. var jQuery = require(\"jquery\")(window);\n    // See ticket #14549 for more info\n    module.exports = global.document ?\n      factory( global, true ) :\n      function( w ) {\n        if ( !w.document ) {\n          throw new Error( \"jQuery requires a window with a document\" );\n        }\n        return factory( w );\n      };\n  } else {\n    factory( global );\n  }\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\n\nvar deletedIds = [];\n\nvar slice = deletedIds.slice;\n\nvar concat = deletedIds.concat;\n\nvar push = deletedIds.push;\n\nvar indexOf = deletedIds.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n  version = \"1.11.1\",\n\n  // Define a local copy of jQuery\n  jQuery = function( selector, context ) {\n    // The jQuery object is actually just the init constructor 'enhanced'\n    // Need init if jQuery is called (just allow error to be thrown if not included)\n    return new jQuery.fn.init( selector, context );\n  },\n\n  // Support: Android<4.1, IE<9\n  // Make sure we trim BOM and NBSP\n  rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n  // Matches dashed string for camelizing\n  rmsPrefix = /^-ms-/,\n  rdashAlpha = /-([\\da-z])/gi,\n\n  // Used by jQuery.camelCase as callback to replace()\n  fcamelCase = function( all, letter ) {\n    return letter.toUpperCase();\n  };\n\njQuery.fn = jQuery.prototype = {\n  // The current version of jQuery being used\n  jquery: version,\n\n  constructor: jQuery,\n\n  // Start with an empty selector\n  selector: \"\",\n\n  // The default length of a jQuery object is 0\n  length: 0,\n\n  toArray: function() {\n    return slice.call( this );\n  },\n\n  // Get the Nth element in the matched element set OR\n  // Get the whole matched element set as a clean array\n  get: function( num ) {\n    return num != null ?\n\n      // Return just the one element from the set\n      ( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n      // Return all the elements in a clean array\n      slice.call( this );\n  },\n\n  // Take an array of elements and push it onto the stack\n  // (returning the new matched element set)\n  pushStack: function( elems ) {\n\n    // Build a new jQuery matched element set\n    var ret = jQuery.merge( this.constructor(), elems );\n\n    // Add the old object onto the stack (as a reference)\n    ret.prevObject = this;\n    ret.context = this.context;\n\n    // Return the newly-formed element set\n    return ret;\n  },\n\n  // Execute a callback for every element in the matched set.\n  // (You can seed the arguments with an array of args, but this is\n  // only used internally.)\n  each: function( callback, args ) {\n    return jQuery.each( this, callback, args );\n  },\n\n  map: function( callback ) {\n    return this.pushStack( jQuery.map(this, function( elem, i ) {\n      return callback.call( elem, i, elem );\n    }));\n  },\n\n  slice: function() {\n    return this.pushStack( slice.apply( this, arguments ) );\n  },\n\n  first: function() {\n    return this.eq( 0 );\n  },\n\n  last: function() {\n    return this.eq( -1 );\n  },\n\n  eq: function( i ) {\n    var len = this.length,\n      j = +i + ( i < 0 ? len : 0 );\n    return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n  },\n\n  end: function() {\n    return this.prevObject || this.constructor(null);\n  },\n\n  // For internal use only.\n  // Behaves like an Array's method, not like a jQuery method.\n  push: push,\n  sort: deletedIds.sort,\n  splice: deletedIds.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n  var src, copyIsArray, copy, name, options, clone,\n    target = arguments[0] || {},\n    i = 1,\n    length = arguments.length,\n    deep = false;\n\n  // Handle a deep copy situation\n  if ( typeof target === \"boolean\" ) {\n    deep = target;\n\n    // skip the boolean and the target\n    target = arguments[ i ] || {};\n    i++;\n  }\n\n  // Handle case when target is a string or something (possible in deep copy)\n  if ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n    target = {};\n  }\n\n  // extend jQuery itself if only one argument is passed\n  if ( i === length ) {\n    target = this;\n    i--;\n  }\n\n  for ( ; i < length; i++ ) {\n    // Only deal with non-null/undefined values\n    if ( (options = arguments[ i ]) != null ) {\n      // Extend the base object\n      for ( name in options ) {\n        src = target[ name ];\n        copy = options[ name ];\n\n        // Prevent never-ending loop\n        if ( target === copy ) {\n          continue;\n        }\n\n        // Recurse if we're merging plain objects or arrays\n        if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n          if ( copyIsArray ) {\n            copyIsArray = false;\n            clone = src && jQuery.isArray(src) ? src : [];\n\n          } else {\n            clone = src && jQuery.isPlainObject(src) ? src : {};\n          }\n\n          // Never move original objects, clone them\n          target[ name ] = jQuery.extend( deep, clone, copy );\n\n        // Don't bring in undefined values\n        } else if ( copy !== undefined ) {\n          target[ name ] = copy;\n        }\n      }\n    }\n  }\n\n  // Return the modified object\n  return target;\n};\n\njQuery.extend({\n  // Unique for each copy of jQuery on the page\n  expando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n  // Assume jQuery is ready without the ready module\n  isReady: true,\n\n  error: function( msg ) {\n    throw new Error( msg );\n  },\n\n  noop: function() {},\n\n  // See test/unit/core.js for details concerning isFunction.\n  // Since version 1.3, DOM methods and functions like alert\n  // aren't supported. They return false on IE (#2968).\n  isFunction: function( obj ) {\n    return jQuery.type(obj) === \"function\";\n  },\n\n  isArray: Array.isArray || function( obj ) {\n    return jQuery.type(obj) === \"array\";\n  },\n\n  isWindow: function( obj ) {\n    /* jshint eqeqeq: false */\n    return obj != null && obj == obj.window;\n  },\n\n  isNumeric: function( obj ) {\n    // parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n    // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n    // subtraction forces infinities to NaN\n    return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;\n  },\n\n  isEmptyObject: function( obj ) {\n    var name;\n    for ( name in obj ) {\n      return false;\n    }\n    return true;\n  },\n\n  isPlainObject: function( obj ) {\n    var key;\n\n    // Must be an Object.\n    // Because of IE, we also have to check the presence of the constructor property.\n    // Make sure that DOM nodes and window objects don't pass through, as well\n    if ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n      return false;\n    }\n\n    try {\n      // Not own constructor property must be Object\n      if ( obj.constructor &&\n        !hasOwn.call(obj, \"constructor\") &&\n        !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n        return false;\n      }\n    } catch ( e ) {\n      // IE8,9 Will throw exceptions on certain host objects #9897\n      return false;\n    }\n\n    // Support: IE<9\n    // Handle iteration over inherited properties before own properties.\n    if ( support.ownLast ) {\n      for ( key in obj ) {\n        return hasOwn.call( obj, key );\n      }\n    }\n\n    // Own properties are enumerated firstly, so to speed up,\n    // if last one is own, then all properties are own.\n    for ( key in obj ) {}\n\n    return key === undefined || hasOwn.call( obj, key );\n  },\n\n  type: function( obj ) {\n    if ( obj == null ) {\n      return obj + \"\";\n    }\n    return typeof obj === \"object\" || typeof obj === \"function\" ?\n      class2type[ toString.call(obj) ] || \"object\" :\n      typeof obj;\n  },\n\n  // Evaluates a script in a global context\n  // Workarounds based on findings by Jim Driscoll\n  // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n  globalEval: function( data ) {\n    if ( data && jQuery.trim( data ) ) {\n      // We use execScript on Internet Explorer\n      // We use an anonymous function so that context is window\n      // rather than jQuery in Firefox\n      ( window.execScript || function( data ) {\n        window[ \"eval\" ].call( window, data );\n      } )( data );\n    }\n  },\n\n  // Convert dashed to camelCase; used by the css and data modules\n  // Microsoft forgot to hump their vendor prefix (#9572)\n  camelCase: function( string ) {\n    return string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n  },\n\n  nodeName: function( elem, name ) {\n    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n  },\n\n  // args is for internal usage only\n  each: function( obj, callback, args ) {\n    var value,\n      i = 0,\n      length = obj.length,\n      isArray = isArraylike( obj );\n\n    if ( args ) {\n      if ( isArray ) {\n        for ( ; i < length; i++ ) {\n          value = callback.apply( obj[ i ], args );\n\n          if ( value === false ) {\n            break;\n          }\n        }\n      } else {\n        for ( i in obj ) {\n          value = callback.apply( obj[ i ], args );\n\n          if ( value === false ) {\n            break;\n          }\n        }\n      }\n\n    // A special, fast, case for the most common use of each\n    } else {\n      if ( isArray ) {\n        for ( ; i < length; i++ ) {\n          value = callback.call( obj[ i ], i, obj[ i ] );\n\n          if ( value === false ) {\n            break;\n          }\n        }\n      } else {\n        for ( i in obj ) {\n          value = callback.call( obj[ i ], i, obj[ i ] );\n\n          if ( value === false ) {\n            break;\n          }\n        }\n      }\n    }\n\n    return obj;\n  },\n\n  // Support: Android<4.1, IE<9\n  trim: function( text ) {\n    return text == null ?\n      \"\" :\n      ( text + \"\" ).replace( rtrim, \"\" );\n  },\n\n  // results is for internal usage only\n  makeArray: function( arr, results ) {\n    var ret = results || [];\n\n    if ( arr != null ) {\n      if ( isArraylike( Object(arr) ) ) {\n        jQuery.merge( ret,\n          typeof arr === \"string\" ?\n          [ arr ] : arr\n        );\n      } else {\n        push.call( ret, arr );\n      }\n    }\n\n    return ret;\n  },\n\n  inArray: function( elem, arr, i ) {\n    var len;\n\n    if ( arr ) {\n      if ( indexOf ) {\n        return indexOf.call( arr, elem, i );\n      }\n\n      len = arr.length;\n      i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n      for ( ; i < len; i++ ) {\n        // Skip accessing in sparse arrays\n        if ( i in arr && arr[ i ] === elem ) {\n          return i;\n        }\n      }\n    }\n\n    return -1;\n  },\n\n  merge: function( first, second ) {\n    var len = +second.length,\n      j = 0,\n      i = first.length;\n\n    while ( j < len ) {\n      first[ i++ ] = second[ j++ ];\n    }\n\n    // Support: IE<9\n    // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)\n    if ( len !== len ) {\n      while ( second[j] !== undefined ) {\n        first[ i++ ] = second[ j++ ];\n      }\n    }\n\n    first.length = i;\n\n    return first;\n  },\n\n  grep: function( elems, callback, invert ) {\n    var callbackInverse,\n      matches = [],\n      i = 0,\n      length = elems.length,\n      callbackExpect = !invert;\n\n    // Go through the array, only saving the items\n    // that pass the validator function\n    for ( ; i < length; i++ ) {\n      callbackInverse = !callback( elems[ i ], i );\n      if ( callbackInverse !== callbackExpect ) {\n        matches.push( elems[ i ] );\n      }\n    }\n\n    return matches;\n  },\n\n  // arg is for internal usage only\n  map: function( elems, callback, arg ) {\n    var value,\n      i = 0,\n      length = elems.length,\n      isArray = isArraylike( elems ),\n      ret = [];\n\n    // Go through the array, translating each of the items to their new values\n    if ( isArray ) {\n      for ( ; i < length; i++ ) {\n        value = callback( elems[ i ], i, arg );\n\n        if ( value != null ) {\n          ret.push( value );\n        }\n      }\n\n    // Go through every key on the object,\n    } else {\n      for ( i in elems ) {\n        value = callback( elems[ i ], i, arg );\n\n        if ( value != null ) {\n          ret.push( value );\n        }\n      }\n    }\n\n    // Flatten any nested arrays\n    return concat.apply( [], ret );\n  },\n\n  // A global GUID counter for objects\n  guid: 1,\n\n  // Bind a function to a context, optionally partially applying any\n  // arguments.\n  proxy: function( fn, context ) {\n    var args, proxy, tmp;\n\n    if ( typeof context === \"string\" ) {\n      tmp = fn[ context ];\n      context = fn;\n      fn = tmp;\n    }\n\n    // Quick check to determine if target is callable, in the spec\n    // this throws a TypeError, but we will just return undefined.\n    if ( !jQuery.isFunction( fn ) ) {\n      return undefined;\n    }\n\n    // Simulated bind\n    args = slice.call( arguments, 2 );\n    proxy = function() {\n      return fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n    };\n\n    // Set the guid of unique handler to the same of original handler, so it can be removed\n    proxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n    return proxy;\n  },\n\n  now: function() {\n    return +( new Date() );\n  },\n\n  // jQuery.support is not used in Core but other projects attach their\n  // properties to it so it needs to exist.\n  support: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n  class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n  var length = obj.length,\n    type = jQuery.type( obj );\n\n  if ( type === \"function\" || jQuery.isWindow( obj ) ) {\n    return false;\n  }\n\n  if ( obj.nodeType === 1 && length ) {\n    return true;\n  }\n\n  return type === \"array\" || length === 0 ||\n    typeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v1.10.19\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-04-18\n */\n(function( window ) {\n\nvar i,\n  support,\n  Expr,\n  getText,\n  isXML,\n  tokenize,\n  compile,\n  select,\n  outermostContext,\n  sortInput,\n  hasDuplicate,\n\n  // Local document vars\n  setDocument,\n  document,\n  docElem,\n  documentIsHTML,\n  rbuggyQSA,\n  rbuggyMatches,\n  matches,\n  contains,\n\n  // Instance-specific data\n  expando = \"sizzle\" + -(new Date()),\n  preferredDoc = window.document,\n  dirruns = 0,\n  done = 0,\n  classCache = createCache(),\n  tokenCache = createCache(),\n  compilerCache = createCache(),\n  sortOrder = function( a, b ) {\n    if ( a === b ) {\n      hasDuplicate = true;\n    }\n    return 0;\n  },\n\n  // General-purpose constants\n  strundefined = typeof undefined,\n  MAX_NEGATIVE = 1 << 31,\n\n  // Instance methods\n  hasOwn = ({}).hasOwnProperty,\n  arr = [],\n  pop = arr.pop,\n  push_native = arr.push,\n  push = arr.push,\n  slice = arr.slice,\n  // Use a stripped-down indexOf if we can't use a native one\n  indexOf = arr.indexOf || function( elem ) {\n    var i = 0,\n      len = this.length;\n    for ( ; i < len; i++ ) {\n      if ( this[i] === elem ) {\n        return i;\n      }\n    }\n    return -1;\n  },\n\n  booleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n  // Regular expressions\n\n  // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n  whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n  // http://www.w3.org/TR/css3-syntax/#characters\n  characterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n  // Loosely modeled on CSS identifier characters\n  // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n  // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n  identifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n  // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n  attributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n    // Operator (capture 2)\n    \"*([*^$|!~]?=)\" + whitespace +\n    // \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n    \"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n    \"*\\\\]\",\n\n  pseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n    // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n    // 1. quoted (capture 3; capture 4 or capture 5)\n    \"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n    // 2. simple (capture 6)\n    \"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n    // 3. anything else (capture 2)\n    \".*\" +\n    \")\\\\)|)\",\n\n  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n  rtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n  rcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n  rcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n  rattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n  rpseudo = new RegExp( pseudos ),\n  ridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n  matchExpr = {\n    \"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n    \"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n    \"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n    \"ATTR\": new RegExp( \"^\" + attributes ),\n    \"PSEUDO\": new RegExp( \"^\" + pseudos ),\n    \"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n      \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n      \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n    \"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n    // For use in libraries implementing .is()\n    // We use this for POS matching in `select`\n    \"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n      whitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n  },\n\n  rinputs = /^(?:input|select|textarea|button)$/i,\n  rheader = /^h\\d$/i,\n\n  rnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n  // Easily-parseable/retrievable ID or TAG or CLASS selectors\n  rquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n  rsibling = /[+~]/,\n  rescape = /'|\\\\/g,\n\n  // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n  runescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n  funescape = function( _, escaped, escapedWhitespace ) {\n    var high = \"0x\" + escaped - 0x10000;\n    // NaN means non-codepoint\n    // Support: Firefox<24\n    // Workaround erroneous numeric interpretation of +\"0x\"\n    return high !== high || escapedWhitespace ?\n      escaped :\n      high < 0 ?\n        // BMP codepoint\n        String.fromCharCode( high + 0x10000 ) :\n        // Supplemental Plane codepoint (surrogate pair)\n        String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n  };\n\n// Optimize for push.apply( _, NodeList )\ntry {\n  push.apply(\n    (arr = slice.call( preferredDoc.childNodes )),\n    preferredDoc.childNodes\n  );\n  // Support: Android<4.0\n  // Detect silently failing push.apply\n  arr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n  push = { apply: arr.length ?\n\n    // Leverage slice if possible\n    function( target, els ) {\n      push_native.apply( target, slice.call(els) );\n    } :\n\n    // Support: IE<9\n    // Otherwise append directly\n    function( target, els ) {\n      var j = target.length,\n        i = 0;\n      // Can't trust NodeList.length\n      while ( (target[j++] = els[i++]) ) {}\n      target.length = j - 1;\n    }\n  };\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n  var match, elem, m, nodeType,\n    // QSA vars\n    i, groups, old, nid, newContext, newSelector;\n\n  if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n    setDocument( context );\n  }\n\n  context = context || document;\n  results = results || [];\n\n  if ( !selector || typeof selector !== \"string\" ) {\n    return results;\n  }\n\n  if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n    return [];\n  }\n\n  if ( documentIsHTML && !seed ) {\n\n    // Shortcuts\n    if ( (match = rquickExpr.exec( selector )) ) {\n      // Speed-up: Sizzle(\"#ID\")\n      if ( (m = match[1]) ) {\n        if ( nodeType === 9 ) {\n          elem = context.getElementById( m );\n          // Check parentNode to catch when Blackberry 4.6 returns\n          // nodes that are no longer in the document (jQuery #6963)\n          if ( elem && elem.parentNode ) {\n            // Handle the case where IE, Opera, and Webkit return items\n            // by name instead of ID\n            if ( elem.id === m ) {\n              results.push( elem );\n              return results;\n            }\n          } else {\n            return results;\n          }\n        } else {\n          // Context is not a document\n          if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n            contains( context, elem ) && elem.id === m ) {\n            results.push( elem );\n            return results;\n          }\n        }\n\n      // Speed-up: Sizzle(\"TAG\")\n      } else if ( match[2] ) {\n        push.apply( results, context.getElementsByTagName( selector ) );\n        return results;\n\n      // Speed-up: Sizzle(\".CLASS\")\n      } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n        push.apply( results, context.getElementsByClassName( m ) );\n        return results;\n      }\n    }\n\n    // QSA path\n    if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n      nid = old = expando;\n      newContext = context;\n      newSelector = nodeType === 9 && selector;\n\n      // qSA works strangely on Element-rooted queries\n      // We can work around this by specifying an extra ID on the root\n      // and working up from there (Thanks to Andrew Dupont for the technique)\n      // IE 8 doesn't work on object elements\n      if ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n        groups = tokenize( selector );\n\n        if ( (old = context.getAttribute(\"id\")) ) {\n          nid = old.replace( rescape, \"\\\\$&\" );\n        } else {\n          context.setAttribute( \"id\", nid );\n        }\n        nid = \"[id='\" + nid + \"'] \";\n\n        i = groups.length;\n        while ( i-- ) {\n          groups[i] = nid + toSelector( groups[i] );\n        }\n        newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n        newSelector = groups.join(\",\");\n      }\n\n      if ( newSelector ) {\n        try {\n          push.apply( results,\n            newContext.querySelectorAll( newSelector )\n          );\n          return results;\n        } catch(qsaError) {\n        } finally {\n          if ( !old ) {\n            context.removeAttribute(\"id\");\n          }\n        }\n      }\n    }\n  }\n\n  // All others\n  return select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *  property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *  deleting the oldest entry\n */\nfunction createCache() {\n  var keys = [];\n\n  function cache( key, value ) {\n    // Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n    if ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n      // Only keep the most recent entries\n      delete cache[ keys.shift() ];\n    }\n    return (cache[ key + \" \" ] = value);\n  }\n  return cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n  fn[ expando ] = true;\n  return fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n  var div = document.createElement(\"div\");\n\n  try {\n    return !!fn( div );\n  } catch (e) {\n    return false;\n  } finally {\n    // Remove from its parent by default\n    if ( div.parentNode ) {\n      div.parentNode.removeChild( div );\n    }\n    // release memory in IE\n    div = null;\n  }\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n  var arr = attrs.split(\"|\"),\n    i = attrs.length;\n\n  while ( i-- ) {\n    Expr.attrHandle[ arr[i] ] = handler;\n  }\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n  var cur = b && a,\n    diff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n      ( ~b.sourceIndex || MAX_NEGATIVE ) -\n      ( ~a.sourceIndex || MAX_NEGATIVE );\n\n  // Use IE sourceIndex if available on both nodes\n  if ( diff ) {\n    return diff;\n  }\n\n  // Check if b follows a\n  if ( cur ) {\n    while ( (cur = cur.nextSibling) ) {\n      if ( cur === b ) {\n        return -1;\n      }\n    }\n  }\n\n  return a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n  return function( elem ) {\n    var name = elem.nodeName.toLowerCase();\n    return name === \"input\" && elem.type === type;\n  };\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n  return function( elem ) {\n    var name = elem.nodeName.toLowerCase();\n    return (name === \"input\" || name === \"button\") && elem.type === type;\n  };\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n  return markFunction(function( argument ) {\n    argument = +argument;\n    return markFunction(function( seed, matches ) {\n      var j,\n        matchIndexes = fn( [], seed.length, argument ),\n        i = matchIndexes.length;\n\n      // Match elements found at the specified indexes\n      while ( i-- ) {\n        if ( seed[ (j = matchIndexes[i]) ] ) {\n          seed[j] = !(matches[j] = seed[j]);\n        }\n      }\n    });\n  });\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n  return context && typeof context.getElementsByTagName !== strundefined && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n  // documentElement is verified for cases where it doesn't yet exist\n  // (such as loading iframes in IE - #4833)\n  var documentElement = elem && (elem.ownerDocument || elem).documentElement;\n  return documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n  var hasCompare,\n    doc = node ? node.ownerDocument || node : preferredDoc,\n    parent = doc.defaultView;\n\n  // If no document and documentElement is available, return\n  if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n    return document;\n  }\n\n  // Set our document\n  document = doc;\n  docElem = doc.documentElement;\n\n  // Support tests\n  documentIsHTML = !isXML( doc );\n\n  // Support: IE>8\n  // If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n  // IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n  // IE6-8 do not support the defaultView property so parent will be undefined\n  if ( parent && parent !== parent.top ) {\n    // IE11 does not have attachEvent, so all must suffer\n    if ( parent.addEventListener ) {\n      parent.addEventListener( \"unload\", function() {\n        setDocument();\n      }, false );\n    } else if ( parent.attachEvent ) {\n      parent.attachEvent( \"onunload\", function() {\n        setDocument();\n      });\n    }\n  }\n\n  /* Attributes\n  ---------------------------------------------------------------------- */\n\n  // Support: IE<8\n  // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n  support.attributes = assert(function( div ) {\n    div.className = \"i\";\n    return !div.getAttribute(\"className\");\n  });\n\n  /* getElement(s)By*\n  ---------------------------------------------------------------------- */\n\n  // Check if getElementsByTagName(\"*\") returns only elements\n  support.getElementsByTagName = assert(function( div ) {\n    div.appendChild( doc.createComment(\"\") );\n    return !div.getElementsByTagName(\"*\").length;\n  });\n\n  // Check if getElementsByClassName can be trusted\n  support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {\n    div.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n    // Support: Safari<4\n    // Catch class over-caching\n    div.firstChild.className = \"i\";\n    // Support: Opera<10\n    // Catch gEBCN failure to find non-leading classes\n    return div.getElementsByClassName(\"i\").length === 2;\n  });\n\n  // Support: IE<10\n  // Check if getElementById returns elements by name\n  // The broken getElementById methods don't pick up programatically-set names,\n  // so use a roundabout getElementsByName test\n  support.getById = assert(function( div ) {\n    docElem.appendChild( div ).id = expando;\n    return !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n  });\n\n  // ID find and filter\n  if ( support.getById ) {\n    Expr.find[\"ID\"] = function( id, context ) {\n      if ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n        var m = context.getElementById( id );\n        // Check parentNode to catch when Blackberry 4.6 returns\n        // nodes that are no longer in the document #6963\n        return m && m.parentNode ? [ m ] : [];\n      }\n    };\n    Expr.filter[\"ID\"] = function( id ) {\n      var attrId = id.replace( runescape, funescape );\n      return function( elem ) {\n        return elem.getAttribute(\"id\") === attrId;\n      };\n    };\n  } else {\n    // Support: IE6/7\n    // getElementById is not reliable as a find shortcut\n    delete Expr.find[\"ID\"];\n\n    Expr.filter[\"ID\"] =  function( id ) {\n      var attrId = id.replace( runescape, funescape );\n      return function( elem ) {\n        var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n        return node && node.value === attrId;\n      };\n    };\n  }\n\n  // Tag\n  Expr.find[\"TAG\"] = support.getElementsByTagName ?\n    function( tag, context ) {\n      if ( typeof context.getElementsByTagName !== strundefined ) {\n        return context.getElementsByTagName( tag );\n      }\n    } :\n    function( tag, context ) {\n      var elem,\n        tmp = [],\n        i = 0,\n        results = context.getElementsByTagName( tag );\n\n      // Filter out possible comments\n      if ( tag === \"*\" ) {\n        while ( (elem = results[i++]) ) {\n          if ( elem.nodeType === 1 ) {\n            tmp.push( elem );\n          }\n        }\n\n        return tmp;\n      }\n      return results;\n    };\n\n  // Class\n  Expr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n    if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n      return context.getElementsByClassName( className );\n    }\n  };\n\n  /* QSA/matchesSelector\n  ---------------------------------------------------------------------- */\n\n  // QSA and matchesSelector support\n\n  // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n  rbuggyMatches = [];\n\n  // qSa(:focus) reports false when true (Chrome 21)\n  // We allow this because of a bug in IE8/9 that throws an error\n  // whenever `document.activeElement` is accessed on an iframe\n  // So, we allow :focus to pass through QSA all the time to avoid the IE error\n  // See http://bugs.jquery.com/ticket/13378\n  rbuggyQSA = [];\n\n  if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n    // Build QSA regex\n    // Regex strategy adopted from Diego Perini\n    assert(function( div ) {\n      // Select is set to empty string on purpose\n      // This is to test IE's treatment of not explicitly\n      // setting a boolean content attribute,\n      // since its presence should be enough\n      // http://bugs.jquery.com/ticket/12359\n      div.innerHTML = \"<select msallowclip=''><option selected=''></option></select>\";\n\n      // Support: IE8, Opera 11-12.16\n      // Nothing should be selected when empty strings follow ^= or $= or *=\n      // The test attribute must be unknown in Opera but \"safe\" for WinRT\n      // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n      if ( div.querySelectorAll(\"[msallowclip^='']\").length ) {\n        rbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n      }\n\n      // Support: IE8\n      // Boolean attributes and \"value\" are not treated correctly\n      if ( !div.querySelectorAll(\"[selected]\").length ) {\n        rbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n      }\n\n      // Webkit/Opera - :checked should return selected option elements\n      // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n      // IE8 throws error here and will not see later tests\n      if ( !div.querySelectorAll(\":checked\").length ) {\n        rbuggyQSA.push(\":checked\");\n      }\n    });\n\n    assert(function( div ) {\n      // Support: Windows 8 Native Apps\n      // The type and name attributes are restricted during .innerHTML assignment\n      var input = doc.createElement(\"input\");\n      input.setAttribute( \"type\", \"hidden\" );\n      div.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n      // Support: IE8\n      // Enforce case-sensitivity of name attribute\n      if ( div.querySelectorAll(\"[name=d]\").length ) {\n        rbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n      }\n\n      // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n      // IE8 throws error here and will not see later tests\n      if ( !div.querySelectorAll(\":enabled\").length ) {\n        rbuggyQSA.push( \":enabled\", \":disabled\" );\n      }\n\n      // Opera 10-11 does not throw on post-comma invalid pseudos\n      div.querySelectorAll(\"*,:x\");\n      rbuggyQSA.push(\",.*:\");\n    });\n  }\n\n  if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n    docElem.webkitMatchesSelector ||\n    docElem.mozMatchesSelector ||\n    docElem.oMatchesSelector ||\n    docElem.msMatchesSelector) )) ) {\n\n    assert(function( div ) {\n      // Check to see if it's possible to do matchesSelector\n      // on a disconnected node (IE 9)\n      support.disconnectedMatch = matches.call( div, \"div\" );\n\n      // This should fail with an exception\n      // Gecko does not error, returns false instead\n      matches.call( div, \"[s!='']:x\" );\n      rbuggyMatches.push( \"!=\", pseudos );\n    });\n  }\n\n  rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n  rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n  /* Contains\n  ---------------------------------------------------------------------- */\n  hasCompare = rnative.test( docElem.compareDocumentPosition );\n\n  // Element contains another\n  // Purposefully does not implement inclusive descendent\n  // As in, an element does not contain itself\n  contains = hasCompare || rnative.test( docElem.contains ) ?\n    function( a, b ) {\n      var adown = a.nodeType === 9 ? a.documentElement : a,\n        bup = b && b.parentNode;\n      return a === bup || !!( bup && bup.nodeType === 1 && (\n        adown.contains ?\n          adown.contains( bup ) :\n          a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n      ));\n    } :\n    function( a, b ) {\n      if ( b ) {\n        while ( (b = b.parentNode) ) {\n          if ( b === a ) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n\n  /* Sorting\n  ---------------------------------------------------------------------- */\n\n  // Document order sorting\n  sortOrder = hasCompare ?\n  function( a, b ) {\n\n    // Flag for duplicate removal\n    if ( a === b ) {\n      hasDuplicate = true;\n      return 0;\n    }\n\n    // Sort on method existence if only one input has compareDocumentPosition\n    var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n    if ( compare ) {\n      return compare;\n    }\n\n    // Calculate position if both inputs belong to the same document\n    compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n      a.compareDocumentPosition( b ) :\n\n      // Otherwise we know they are disconnected\n      1;\n\n    // Disconnected nodes\n    if ( compare & 1 ||\n      (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n      // Choose the first element that is related to our preferred document\n      if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n        return -1;\n      }\n      if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n        return 1;\n      }\n\n      // Maintain original order\n      return sortInput ?\n        ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n        0;\n    }\n\n    return compare & 4 ? -1 : 1;\n  } :\n  function( a, b ) {\n    // Exit early if the nodes are identical\n    if ( a === b ) {\n      hasDuplicate = true;\n      return 0;\n    }\n\n    var cur,\n      i = 0,\n      aup = a.parentNode,\n      bup = b.parentNode,\n      ap = [ a ],\n      bp = [ b ];\n\n    // Parentless nodes are either documents or disconnected\n    if ( !aup || !bup ) {\n      return a === doc ? -1 :\n        b === doc ? 1 :\n        aup ? -1 :\n        bup ? 1 :\n        sortInput ?\n        ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n        0;\n\n    // If the nodes are siblings, we can do a quick check\n    } else if ( aup === bup ) {\n      return siblingCheck( a, b );\n    }\n\n    // Otherwise we need full lists of their ancestors for comparison\n    cur = a;\n    while ( (cur = cur.parentNode) ) {\n      ap.unshift( cur );\n    }\n    cur = b;\n    while ( (cur = cur.parentNode) ) {\n      bp.unshift( cur );\n    }\n\n    // Walk down the tree looking for a discrepancy\n    while ( ap[i] === bp[i] ) {\n      i++;\n    }\n\n    return i ?\n      // Do a sibling check if the nodes have a common ancestor\n      siblingCheck( ap[i], bp[i] ) :\n\n      // Otherwise nodes in our document sort first\n      ap[i] === preferredDoc ? -1 :\n      bp[i] === preferredDoc ? 1 :\n      0;\n  };\n\n  return doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n  return Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n  // Set document vars if needed\n  if ( ( elem.ownerDocument || elem ) !== document ) {\n    setDocument( elem );\n  }\n\n  // Make sure that attribute selectors are quoted\n  expr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n  if ( support.matchesSelector && documentIsHTML &&\n    ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n    ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n    try {\n      var ret = matches.call( elem, expr );\n\n      // IE 9's matchesSelector returns false on disconnected nodes\n      if ( ret || support.disconnectedMatch ||\n          // As well, disconnected nodes are said to be in a document\n          // fragment in IE 9\n          elem.document && elem.document.nodeType !== 11 ) {\n        return ret;\n      }\n    } catch(e) {}\n  }\n\n  return Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n  // Set document vars if needed\n  if ( ( context.ownerDocument || context ) !== document ) {\n    setDocument( context );\n  }\n  return contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n  // Set document vars if needed\n  if ( ( elem.ownerDocument || elem ) !== document ) {\n    setDocument( elem );\n  }\n\n  var fn = Expr.attrHandle[ name.toLowerCase() ],\n    // Don't get fooled by Object.prototype properties (jQuery #13807)\n    val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n      fn( elem, name, !documentIsHTML ) :\n      undefined;\n\n  return val !== undefined ?\n    val :\n    support.attributes || !documentIsHTML ?\n      elem.getAttribute( name ) :\n      (val = elem.getAttributeNode(name)) && val.specified ?\n        val.value :\n        null;\n};\n\nSizzle.error = function( msg ) {\n  throw new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n  var elem,\n    duplicates = [],\n    j = 0,\n    i = 0;\n\n  // Unless we *know* we can detect duplicates, assume their presence\n  hasDuplicate = !support.detectDuplicates;\n  sortInput = !support.sortStable && results.slice( 0 );\n  results.sort( sortOrder );\n\n  if ( hasDuplicate ) {\n    while ( (elem = results[i++]) ) {\n      if ( elem === results[ i ] ) {\n        j = duplicates.push( i );\n      }\n    }\n    while ( j-- ) {\n      results.splice( duplicates[ j ], 1 );\n    }\n  }\n\n  // Clear input after sorting to release objects\n  // See https://github.com/jquery/sizzle/pull/225\n  sortInput = null;\n\n  return results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n  var node,\n    ret = \"\",\n    i = 0,\n    nodeType = elem.nodeType;\n\n  if ( !nodeType ) {\n    // If no nodeType, this is expected to be an array\n    while ( (node = elem[i++]) ) {\n      // Do not traverse comment nodes\n      ret += getText( node );\n    }\n  } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n    // Use textContent for elements\n    // innerText usage removed for consistency of new lines (jQuery #11153)\n    if ( typeof elem.textContent === \"string\" ) {\n      return elem.textContent;\n    } else {\n      // Traverse its children\n      for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n        ret += getText( elem );\n      }\n    }\n  } else if ( nodeType === 3 || nodeType === 4 ) {\n    return elem.nodeValue;\n  }\n  // Do not include comment or processing instruction nodes\n\n  return ret;\n};\n\nExpr = Sizzle.selectors = {\n\n  // Can be adjusted by the user\n  cacheLength: 50,\n\n  createPseudo: markFunction,\n\n  match: matchExpr,\n\n  attrHandle: {},\n\n  find: {},\n\n  relative: {\n    \">\": { dir: \"parentNode\", first: true },\n    \" \": { dir: \"parentNode\" },\n    \"+\": { dir: \"previousSibling\", first: true },\n    \"~\": { dir: \"previousSibling\" }\n  },\n\n  preFilter: {\n    \"ATTR\": function( match ) {\n      match[1] = match[1].replace( runescape, funescape );\n\n      // Move the given value to match[3] whether quoted or unquoted\n      match[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n      if ( match[2] === \"~=\" ) {\n        match[3] = \" \" + match[3] + \" \";\n      }\n\n      return match.slice( 0, 4 );\n    },\n\n    \"CHILD\": function( match ) {\n      /* matches from matchExpr[\"CHILD\"]\n        1 type (only|nth|...)\n        2 what (child|of-type)\n        3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n        4 xn-component of xn+y argument ([+-]?\\d*n|)\n        5 sign of xn-component\n        6 x of xn-component\n        7 sign of y-component\n        8 y of y-component\n      */\n      match[1] = match[1].toLowerCase();\n\n      if ( match[1].slice( 0, 3 ) === \"nth\" ) {\n        // nth-* requires argument\n        if ( !match[3] ) {\n          Sizzle.error( match[0] );\n        }\n\n        // numeric x and y parameters for Expr.filter.CHILD\n        // remember that false/true cast respectively to 0/1\n        match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n        match[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n      // other types prohibit arguments\n      } else if ( match[3] ) {\n        Sizzle.error( match[0] );\n      }\n\n      return match;\n    },\n\n    \"PSEUDO\": function( match ) {\n      var excess,\n        unquoted = !match[6] && match[2];\n\n      if ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n        return null;\n      }\n\n      // Accept quoted arguments as-is\n      if ( match[3] ) {\n        match[2] = match[4] || match[5] || \"\";\n\n      // Strip excess characters from unquoted arguments\n      } else if ( unquoted && rpseudo.test( unquoted ) &&\n        // Get excess from tokenize (recursively)\n        (excess = tokenize( unquoted, true )) &&\n        // advance to the next closing parenthesis\n        (excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n        // excess is a negative index\n        match[0] = match[0].slice( 0, excess );\n        match[2] = unquoted.slice( 0, excess );\n      }\n\n      // Return only captures needed by the pseudo filter method (type and argument)\n      return match.slice( 0, 3 );\n    }\n  },\n\n  filter: {\n\n    \"TAG\": function( nodeNameSelector ) {\n      var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n      return nodeNameSelector === \"*\" ?\n        function() { return true; } :\n        function( elem ) {\n          return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n        };\n    },\n\n    \"CLASS\": function( className ) {\n      var pattern = classCache[ className + \" \" ];\n\n      return pattern ||\n        (pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n        classCache( className, function( elem ) {\n          return pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n        });\n    },\n\n    \"ATTR\": function( name, operator, check ) {\n      return function( elem ) {\n        var result = Sizzle.attr( elem, name );\n\n        if ( result == null ) {\n          return operator === \"!=\";\n        }\n        if ( !operator ) {\n          return true;\n        }\n\n        result += \"\";\n\n        return operator === \"=\" ? result === check :\n          operator === \"!=\" ? result !== check :\n          operator === \"^=\" ? check && result.indexOf( check ) === 0 :\n          operator === \"*=\" ? check && result.indexOf( check ) > -1 :\n          operator === \"$=\" ? check && result.slice( -check.length ) === check :\n          operator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n          operator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n          false;\n      };\n    },\n\n    \"CHILD\": function( type, what, argument, first, last ) {\n      var simple = type.slice( 0, 3 ) !== \"nth\",\n        forward = type.slice( -4 ) !== \"last\",\n        ofType = what === \"of-type\";\n\n      return first === 1 && last === 0 ?\n\n        // Shortcut for :nth-*(n)\n        function( elem ) {\n          return !!elem.parentNode;\n        } :\n\n        function( elem, context, xml ) {\n          var cache, outerCache, node, diff, nodeIndex, start,\n            dir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n            parent = elem.parentNode,\n            name = ofType && elem.nodeName.toLowerCase(),\n            useCache = !xml && !ofType;\n\n          if ( parent ) {\n\n            // :(first|last|only)-(child|of-type)\n            if ( simple ) {\n              while ( dir ) {\n                node = elem;\n                while ( (node = node[ dir ]) ) {\n                  if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n                    return false;\n                  }\n                }\n                // Reverse direction for :only-* (if we haven't yet done so)\n                start = dir = type === \"only\" && !start && \"nextSibling\";\n              }\n              return true;\n            }\n\n            start = [ forward ? parent.firstChild : parent.lastChild ];\n\n            // non-xml :nth-child(...) stores cache data on `parent`\n            if ( forward && useCache ) {\n              // Seek `elem` from a previously-cached index\n              outerCache = parent[ expando ] || (parent[ expando ] = {});\n              cache = outerCache[ type ] || [];\n              nodeIndex = cache[0] === dirruns && cache[1];\n              diff = cache[0] === dirruns && cache[2];\n              node = nodeIndex && parent.childNodes[ nodeIndex ];\n\n              while ( (node = ++nodeIndex && node && node[ dir ] ||\n\n                // Fallback to seeking `elem` from the start\n                (diff = nodeIndex = 0) || start.pop()) ) {\n\n                // When found, cache indexes on `parent` and break\n                if ( node.nodeType === 1 && ++diff && node === elem ) {\n                  outerCache[ type ] = [ dirruns, nodeIndex, diff ];\n                  break;\n                }\n              }\n\n            // Use previously-cached element index if available\n            } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n              diff = cache[1];\n\n            // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n            } else {\n              // Use the same loop as above to seek `elem` from the start\n              while ( (node = ++nodeIndex && node && node[ dir ] ||\n                (diff = nodeIndex = 0) || start.pop()) ) {\n\n                if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n                  // Cache the index of each encountered element\n                  if ( useCache ) {\n                    (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n                  }\n\n                  if ( node === elem ) {\n                    break;\n                  }\n                }\n              }\n            }\n\n            // Incorporate the offset, then check against cycle size\n            diff -= last;\n            return diff === first || ( diff % first === 0 && diff / first >= 0 );\n          }\n        };\n    },\n\n    \"PSEUDO\": function( pseudo, argument ) {\n      // pseudo-class names are case-insensitive\n      // http://www.w3.org/TR/selectors/#pseudo-classes\n      // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n      // Remember that setFilters inherits from pseudos\n      var args,\n        fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n          Sizzle.error( \"unsupported pseudo: \" + pseudo );\n\n      // The user may use createPseudo to indicate that\n      // arguments are needed to create the filter function\n      // just as Sizzle does\n      if ( fn[ expando ] ) {\n        return fn( argument );\n      }\n\n      // But maintain support for old signatures\n      if ( fn.length > 1 ) {\n        args = [ pseudo, pseudo, \"\", argument ];\n        return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n          markFunction(function( seed, matches ) {\n            var idx,\n              matched = fn( seed, argument ),\n              i = matched.length;\n            while ( i-- ) {\n              idx = indexOf.call( seed, matched[i] );\n              seed[ idx ] = !( matches[ idx ] = matched[i] );\n            }\n          }) :\n          function( elem ) {\n            return fn( elem, 0, args );\n          };\n      }\n\n      return fn;\n    }\n  },\n\n  pseudos: {\n    // Potentially complex pseudos\n    \"not\": markFunction(function( selector ) {\n      // Trim the selector passed to compile\n      // to avoid treating leading and trailing\n      // spaces as combinators\n      var input = [],\n        results = [],\n        matcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n      return matcher[ expando ] ?\n        markFunction(function( seed, matches, context, xml ) {\n          var elem,\n            unmatched = matcher( seed, null, xml, [] ),\n            i = seed.length;\n\n          // Match elements unmatched by `matcher`\n          while ( i-- ) {\n            if ( (elem = unmatched[i]) ) {\n              seed[i] = !(matches[i] = elem);\n            }\n          }\n        }) :\n        function( elem, context, xml ) {\n          input[0] = elem;\n          matcher( input, null, xml, results );\n          return !results.pop();\n        };\n    }),\n\n    \"has\": markFunction(function( selector ) {\n      return function( elem ) {\n        return Sizzle( selector, elem ).length > 0;\n      };\n    }),\n\n    \"contains\": markFunction(function( text ) {\n      return function( elem ) {\n        return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n      };\n    }),\n\n    // \"Whether an element is represented by a :lang() selector\n    // is based solely on the element's language value\n    // being equal to the identifier C,\n    // or beginning with the identifier C immediately followed by \"-\".\n    // The matching of C against the element's language value is performed case-insensitively.\n    // The identifier C does not have to be a valid language name.\"\n    // http://www.w3.org/TR/selectors/#lang-pseudo\n    \"lang\": markFunction( function( lang ) {\n      // lang value must be a valid identifier\n      if ( !ridentifier.test(lang || \"\") ) {\n        Sizzle.error( \"unsupported lang: \" + lang );\n      }\n      lang = lang.replace( runescape, funescape ).toLowerCase();\n      return function( elem ) {\n        var elemLang;\n        do {\n          if ( (elemLang = documentIsHTML ?\n            elem.lang :\n            elem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n            elemLang = elemLang.toLowerCase();\n            return elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n          }\n        } while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n        return false;\n      };\n    }),\n\n    // Miscellaneous\n    \"target\": function( elem ) {\n      var hash = window.location && window.location.hash;\n      return hash && hash.slice( 1 ) === elem.id;\n    },\n\n    \"root\": function( elem ) {\n      return elem === docElem;\n    },\n\n    \"focus\": function( elem ) {\n      return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n    },\n\n    // Boolean properties\n    \"enabled\": function( elem ) {\n      return elem.disabled === false;\n    },\n\n    \"disabled\": function( elem ) {\n      return elem.disabled === true;\n    },\n\n    \"checked\": function( elem ) {\n      // In CSS3, :checked should return both checked and selected elements\n      // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n      var nodeName = elem.nodeName.toLowerCase();\n      return (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n    },\n\n    \"selected\": function( elem ) {\n      // Accessing this property makes selected-by-default\n      // options in Safari work properly\n      if ( elem.parentNode ) {\n        elem.parentNode.selectedIndex;\n      }\n\n      return elem.selected === true;\n    },\n\n    // Contents\n    \"empty\": function( elem ) {\n      // http://www.w3.org/TR/selectors/#empty-pseudo\n      // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n      //   but not by others (comment: 8; processing instruction: 7; etc.)\n      // nodeType < 6 works because attributes (2) do not appear as children\n      for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n        if ( elem.nodeType < 6 ) {\n          return false;\n        }\n      }\n      return true;\n    },\n\n    \"parent\": function( elem ) {\n      return !Expr.pseudos[\"empty\"]( elem );\n    },\n\n    // Element/input types\n    \"header\": function( elem ) {\n      return rheader.test( elem.nodeName );\n    },\n\n    \"input\": function( elem ) {\n      return rinputs.test( elem.nodeName );\n    },\n\n    \"button\": function( elem ) {\n      var name = elem.nodeName.toLowerCase();\n      return name === \"input\" && elem.type === \"button\" || name === \"button\";\n    },\n\n    \"text\": function( elem ) {\n      var attr;\n      return elem.nodeName.toLowerCase() === \"input\" &&\n        elem.type === \"text\" &&\n\n        // Support: IE<8\n        // New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n        ( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n    },\n\n    // Position-in-collection\n    \"first\": createPositionalPseudo(function() {\n      return [ 0 ];\n    }),\n\n    \"last\": createPositionalPseudo(function( matchIndexes, length ) {\n      return [ length - 1 ];\n    }),\n\n    \"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n      return [ argument < 0 ? argument + length : argument ];\n    }),\n\n    \"even\": createPositionalPseudo(function( matchIndexes, length ) {\n      var i = 0;\n      for ( ; i < length; i += 2 ) {\n        matchIndexes.push( i );\n      }\n      return matchIndexes;\n    }),\n\n    \"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n      var i = 1;\n      for ( ; i < length; i += 2 ) {\n        matchIndexes.push( i );\n      }\n      return matchIndexes;\n    }),\n\n    \"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n      var i = argument < 0 ? argument + length : argument;\n      for ( ; --i >= 0; ) {\n        matchIndexes.push( i );\n      }\n      return matchIndexes;\n    }),\n\n    \"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n      var i = argument < 0 ? argument + length : argument;\n      for ( ; ++i < length; ) {\n        matchIndexes.push( i );\n      }\n      return matchIndexes;\n    })\n  }\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n  Expr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n  Expr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n  var matched, match, tokens, type,\n    soFar, groups, preFilters,\n    cached = tokenCache[ selector + \" \" ];\n\n  if ( cached ) {\n    return parseOnly ? 0 : cached.slice( 0 );\n  }\n\n  soFar = selector;\n  groups = [];\n  preFilters = Expr.preFilter;\n\n  while ( soFar ) {\n\n    // Comma and first run\n    if ( !matched || (match = rcomma.exec( soFar )) ) {\n      if ( match ) {\n        // Don't consume trailing commas as valid\n        soFar = soFar.slice( match[0].length ) || soFar;\n      }\n      groups.push( (tokens = []) );\n    }\n\n    matched = false;\n\n    // Combinators\n    if ( (match = rcombinators.exec( soFar )) ) {\n      matched = match.shift();\n      tokens.push({\n        value: matched,\n        // Cast descendant combinators to space\n        type: match[0].replace( rtrim, \" \" )\n      });\n      soFar = soFar.slice( matched.length );\n    }\n\n    // Filters\n    for ( type in Expr.filter ) {\n      if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n        (match = preFilters[ type ]( match ))) ) {\n        matched = match.shift();\n        tokens.push({\n          value: matched,\n          type: type,\n          matches: match\n        });\n        soFar = soFar.slice( matched.length );\n      }\n    }\n\n    if ( !matched ) {\n      break;\n    }\n  }\n\n  // Return the length of the invalid excess\n  // if we're just parsing\n  // Otherwise, throw an error or return tokens\n  return parseOnly ?\n    soFar.length :\n    soFar ?\n      Sizzle.error( selector ) :\n      // Cache the tokens\n      tokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n  var i = 0,\n    len = tokens.length,\n    selector = \"\";\n  for ( ; i < len; i++ ) {\n    selector += tokens[i].value;\n  }\n  return selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n  var dir = combinator.dir,\n    checkNonElements = base && dir === \"parentNode\",\n    doneName = done++;\n\n  return combinator.first ?\n    // Check against closest ancestor/preceding element\n    function( elem, context, xml ) {\n      while ( (elem = elem[ dir ]) ) {\n        if ( elem.nodeType === 1 || checkNonElements ) {\n          return matcher( elem, context, xml );\n        }\n      }\n    } :\n\n    // Check against all ancestor/preceding elements\n    function( elem, context, xml ) {\n      var oldCache, outerCache,\n        newCache = [ dirruns, doneName ];\n\n      // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n      if ( xml ) {\n        while ( (elem = elem[ dir ]) ) {\n          if ( elem.nodeType === 1 || checkNonElements ) {\n            if ( matcher( elem, context, xml ) ) {\n              return true;\n            }\n          }\n        }\n      } else {\n        while ( (elem = elem[ dir ]) ) {\n          if ( elem.nodeType === 1 || checkNonElements ) {\n            outerCache = elem[ expando ] || (elem[ expando ] = {});\n            if ( (oldCache = outerCache[ dir ]) &&\n              oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n              // Assign to newCache so results back-propagate to previous elements\n              return (newCache[ 2 ] = oldCache[ 2 ]);\n            } else {\n              // Reuse newcache so results back-propagate to previous elements\n              outerCache[ dir ] = newCache;\n\n              // A match means we're done; a fail means we have to keep checking\n              if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n                return true;\n              }\n            }\n          }\n        }\n      }\n    };\n}\n\nfunction elementMatcher( matchers ) {\n  return matchers.length > 1 ?\n    function( elem, context, xml ) {\n      var i = matchers.length;\n      while ( i-- ) {\n        if ( !matchers[i]( elem, context, xml ) ) {\n          return false;\n        }\n      }\n      return true;\n    } :\n    matchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n  var i = 0,\n    len = contexts.length;\n  for ( ; i < len; i++ ) {\n    Sizzle( selector, contexts[i], results );\n  }\n  return results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n  var elem,\n    newUnmatched = [],\n    i = 0,\n    len = unmatched.length,\n    mapped = map != null;\n\n  for ( ; i < len; i++ ) {\n    if ( (elem = unmatched[i]) ) {\n      if ( !filter || filter( elem, context, xml ) ) {\n        newUnmatched.push( elem );\n        if ( mapped ) {\n          map.push( i );\n        }\n      }\n    }\n  }\n\n  return newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n  if ( postFilter && !postFilter[ expando ] ) {\n    postFilter = setMatcher( postFilter );\n  }\n  if ( postFinder && !postFinder[ expando ] ) {\n    postFinder = setMatcher( postFinder, postSelector );\n  }\n  return markFunction(function( seed, results, context, xml ) {\n    var temp, i, elem,\n      preMap = [],\n      postMap = [],\n      preexisting = results.length,\n\n      // Get initial elements from seed or context\n      elems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n      // Prefilter to get matcher input, preserving a map for seed-results synchronization\n      matcherIn = preFilter && ( seed || !selector ) ?\n        condense( elems, preMap, preFilter, context, xml ) :\n        elems,\n\n      matcherOut = matcher ?\n        // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n        postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n          // ...intermediate processing is necessary\n          [] :\n\n          // ...otherwise use results directly\n          results :\n        matcherIn;\n\n    // Find primary matches\n    if ( matcher ) {\n      matcher( matcherIn, matcherOut, context, xml );\n    }\n\n    // Apply postFilter\n    if ( postFilter ) {\n      temp = condense( matcherOut, postMap );\n      postFilter( temp, [], context, xml );\n\n      // Un-match failing elements by moving them back to matcherIn\n      i = temp.length;\n      while ( i-- ) {\n        if ( (elem = temp[i]) ) {\n          matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n        }\n      }\n    }\n\n    if ( seed ) {\n      if ( postFinder || preFilter ) {\n        if ( postFinder ) {\n          // Get the final matcherOut by condensing this intermediate into postFinder contexts\n          temp = [];\n          i = matcherOut.length;\n          while ( i-- ) {\n            if ( (elem = matcherOut[i]) ) {\n              // Restore matcherIn since elem is not yet a final match\n              temp.push( (matcherIn[i] = elem) );\n            }\n          }\n          postFinder( null, (matcherOut = []), temp, xml );\n        }\n\n        // Move matched elements from seed to results to keep them synchronized\n        i = matcherOut.length;\n        while ( i-- ) {\n          if ( (elem = matcherOut[i]) &&\n            (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n            seed[temp] = !(results[temp] = elem);\n          }\n        }\n      }\n\n    // Add elements to results, through postFinder if defined\n    } else {\n      matcherOut = condense(\n        matcherOut === results ?\n          matcherOut.splice( preexisting, matcherOut.length ) :\n          matcherOut\n      );\n      if ( postFinder ) {\n        postFinder( null, results, matcherOut, xml );\n      } else {\n        push.apply( results, matcherOut );\n      }\n    }\n  });\n}\n\nfunction matcherFromTokens( tokens ) {\n  var checkContext, matcher, j,\n    len = tokens.length,\n    leadingRelative = Expr.relative[ tokens[0].type ],\n    implicitRelative = leadingRelative || Expr.relative[\" \"],\n    i = leadingRelative ? 1 : 0,\n\n    // The foundational matcher ensures that elements are reachable from top-level context(s)\n    matchContext = addCombinator( function( elem ) {\n      return elem === checkContext;\n    }, implicitRelative, true ),\n    matchAnyContext = addCombinator( function( elem ) {\n      return indexOf.call( checkContext, elem ) > -1;\n    }, implicitRelative, true ),\n    matchers = [ function( elem, context, xml ) {\n      return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n        (checkContext = context).nodeType ?\n          matchContext( elem, context, xml ) :\n          matchAnyContext( elem, context, xml ) );\n    } ];\n\n  for ( ; i < len; i++ ) {\n    if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n      matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n    } else {\n      matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n      // Return special upon seeing a positional matcher\n      if ( matcher[ expando ] ) {\n        // Find the next relative operator (if any) for proper handling\n        j = ++i;\n        for ( ; j < len; j++ ) {\n          if ( Expr.relative[ tokens[j].type ] ) {\n            break;\n          }\n        }\n        return setMatcher(\n          i > 1 && elementMatcher( matchers ),\n          i > 1 && toSelector(\n            // If the preceding token was a descendant combinator, insert an implicit any-element `*`\n            tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n          ).replace( rtrim, \"$1\" ),\n          matcher,\n          i < j && matcherFromTokens( tokens.slice( i, j ) ),\n          j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n          j < len && toSelector( tokens )\n        );\n      }\n      matchers.push( matcher );\n    }\n  }\n\n  return elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n  var bySet = setMatchers.length > 0,\n    byElement = elementMatchers.length > 0,\n    superMatcher = function( seed, context, xml, results, outermost ) {\n      var elem, j, matcher,\n        matchedCount = 0,\n        i = \"0\",\n        unmatched = seed && [],\n        setMatched = [],\n        contextBackup = outermostContext,\n        // We must always have either seed elements or outermost context\n        elems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n        // Use integer dirruns iff this is the outermost matcher\n        dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n        len = elems.length;\n\n      if ( outermost ) {\n        outermostContext = context !== document && context;\n      }\n\n      // Add elements passing elementMatchers directly to results\n      // Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n      // Support: IE<9, Safari\n      // Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n      for ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n        if ( byElement && elem ) {\n          j = 0;\n          while ( (matcher = elementMatchers[j++]) ) {\n            if ( matcher( elem, context, xml ) ) {\n              results.push( elem );\n              break;\n            }\n          }\n          if ( outermost ) {\n            dirruns = dirrunsUnique;\n          }\n        }\n\n        // Track unmatched elements for set filters\n        if ( bySet ) {\n          // They will have gone through all possible matchers\n          if ( (elem = !matcher && elem) ) {\n            matchedCount--;\n          }\n\n          // Lengthen the array for every element, matched or not\n          if ( seed ) {\n            unmatched.push( elem );\n          }\n        }\n      }\n\n      // Apply set filters to unmatched elements\n      matchedCount += i;\n      if ( bySet && i !== matchedCount ) {\n        j = 0;\n        while ( (matcher = setMatchers[j++]) ) {\n          matcher( unmatched, setMatched, context, xml );\n        }\n\n        if ( seed ) {\n          // Reintegrate element matches to eliminate the need for sorting\n          if ( matchedCount > 0 ) {\n            while ( i-- ) {\n              if ( !(unmatched[i] || setMatched[i]) ) {\n                setMatched[i] = pop.call( results );\n              }\n            }\n          }\n\n          // Discard index placeholder values to get only actual matches\n          setMatched = condense( setMatched );\n        }\n\n        // Add matches to results\n        push.apply( results, setMatched );\n\n        // Seedless set matches succeeding multiple successful matchers stipulate sorting\n        if ( outermost && !seed && setMatched.length > 0 &&\n          ( matchedCount + setMatchers.length ) > 1 ) {\n\n          Sizzle.uniqueSort( results );\n        }\n      }\n\n      // Override manipulation of globals by nested matchers\n      if ( outermost ) {\n        dirruns = dirrunsUnique;\n        outermostContext = contextBackup;\n      }\n\n      return unmatched;\n    };\n\n  return bySet ?\n    markFunction( superMatcher ) :\n    superMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n  var i,\n    setMatchers = [],\n    elementMatchers = [],\n    cached = compilerCache[ selector + \" \" ];\n\n  if ( !cached ) {\n    // Generate a function of recursive functions that can be used to check each element\n    if ( !match ) {\n      match = tokenize( selector );\n    }\n    i = match.length;\n    while ( i-- ) {\n      cached = matcherFromTokens( match[i] );\n      if ( cached[ expando ] ) {\n        setMatchers.push( cached );\n      } else {\n        elementMatchers.push( cached );\n      }\n    }\n\n    // Cache the compiled function\n    cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n    // Save selector and tokenization\n    cached.selector = selector;\n  }\n  return cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n  var i, tokens, token, type, find,\n    compiled = typeof selector === \"function\" && selector,\n    match = !seed && tokenize( (selector = compiled.selector || selector) );\n\n  results = results || [];\n\n  // Try to minimize operations if there is no seed and only one group\n  if ( match.length === 1 ) {\n\n    // Take a shortcut and set the context if the root selector is an ID\n    tokens = match[0] = match[0].slice( 0 );\n    if ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n        support.getById && context.nodeType === 9 && documentIsHTML &&\n        Expr.relative[ tokens[1].type ] ) {\n\n      context = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n      if ( !context ) {\n        return results;\n\n      // Precompiled matchers will still verify ancestry, so step up a level\n      } else if ( compiled ) {\n        context = context.parentNode;\n      }\n\n      selector = selector.slice( tokens.shift().value.length );\n    }\n\n    // Fetch a seed set for right-to-left matching\n    i = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n    while ( i-- ) {\n      token = tokens[i];\n\n      // Abort if we hit a combinator\n      if ( Expr.relative[ (type = token.type) ] ) {\n        break;\n      }\n      if ( (find = Expr.find[ type ]) ) {\n        // Search, expanding context for leading sibling combinators\n        if ( (seed = find(\n          token.matches[0].replace( runescape, funescape ),\n          rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n        )) ) {\n\n          // If seed is empty or no tokens remain, we can return early\n          tokens.splice( i, 1 );\n          selector = seed.length && toSelector( tokens );\n          if ( !selector ) {\n            push.apply( results, seed );\n            return results;\n          }\n\n          break;\n        }\n      }\n    }\n  }\n\n  // Compile and execute a filtering function if one is not provided\n  // Provide `match` to avoid retokenization if we modified the selector above\n  ( compiled || compile( selector, match ) )(\n    seed,\n    context,\n    !documentIsHTML,\n    results,\n    rsibling.test( selector ) && testContext( context.parentNode ) || context\n  );\n  return results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n  // Should return 1, but returns 4 (following)\n  return div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n  div.innerHTML = \"<a href='#'></a>\";\n  return div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n  addHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n    if ( !isXML ) {\n      return elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n    }\n  });\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n  div.innerHTML = \"<input/>\";\n  div.firstChild.setAttribute( \"value\", \"\" );\n  return div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n  addHandle( \"value\", function( elem, name, isXML ) {\n    if ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n      return elem.defaultValue;\n    }\n  });\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n  return div.getAttribute(\"disabled\") == null;\n}) ) {\n  addHandle( booleans, function( elem, name, isXML ) {\n    var val;\n    if ( !isXML ) {\n      return elem[ name ] === true ? name.toLowerCase() :\n          (val = elem.getAttributeNode( name )) && val.specified ?\n          val.value :\n        null;\n    }\n  });\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n  if ( jQuery.isFunction( qualifier ) ) {\n    return jQuery.grep( elements, function( elem, i ) {\n      /* jshint -W018 */\n      return !!qualifier.call( elem, i, elem ) !== not;\n    });\n\n  }\n\n  if ( qualifier.nodeType ) {\n    return jQuery.grep( elements, function( elem ) {\n      return ( elem === qualifier ) !== not;\n    });\n\n  }\n\n  if ( typeof qualifier === \"string\" ) {\n    if ( risSimple.test( qualifier ) ) {\n      return jQuery.filter( qualifier, elements, not );\n    }\n\n    qualifier = jQuery.filter( qualifier, elements );\n  }\n\n  return jQuery.grep( elements, function( elem ) {\n    return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n  });\n}\n\njQuery.filter = function( expr, elems, not ) {\n  var elem = elems[ 0 ];\n\n  if ( not ) {\n    expr = \":not(\" + expr + \")\";\n  }\n\n  return elems.length === 1 && elem.nodeType === 1 ?\n    jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n    jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n      return elem.nodeType === 1;\n    }));\n};\n\njQuery.fn.extend({\n  find: function( selector ) {\n    var i,\n      ret = [],\n      self = this,\n      len = self.length;\n\n    if ( typeof selector !== \"string\" ) {\n      return this.pushStack( jQuery( selector ).filter(function() {\n        for ( i = 0; i < len; i++ ) {\n          if ( jQuery.contains( self[ i ], this ) ) {\n            return true;\n          }\n        }\n      }) );\n    }\n\n    for ( i = 0; i < len; i++ ) {\n      jQuery.find( selector, self[ i ], ret );\n    }\n\n    // Needed because $( selector, context ) becomes $( context ).find( selector )\n    ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n    ret.selector = this.selector ? this.selector + \" \" + selector : selector;\n    return ret;\n  },\n  filter: function( selector ) {\n    return this.pushStack( winnow(this, selector || [], false) );\n  },\n  not: function( selector ) {\n    return this.pushStack( winnow(this, selector || [], true) );\n  },\n  is: function( selector ) {\n    return !!winnow(\n      this,\n\n      // If this is a positional/relative selector, check membership in the returned set\n      // so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n      typeof selector === \"string\" && rneedsContext.test( selector ) ?\n        jQuery( selector ) :\n        selector || [],\n      false\n    ).length;\n  }\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n  // Use the correct document accordingly with window argument (sandbox)\n  document = window.document,\n\n  // A simple way to check for HTML strings\n  // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n  // Strict HTML recognition (#11290: must start with <)\n  rquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n  init = jQuery.fn.init = function( selector, context ) {\n    var match, elem;\n\n    // HANDLE: $(\"\"), $(null), $(undefined), $(false)\n    if ( !selector ) {\n      return this;\n    }\n\n    // Handle HTML strings\n    if ( typeof selector === \"string\" ) {\n      if ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n        // Assume that strings that start and end with <> are HTML and skip the regex check\n        match = [ null, selector, null ];\n\n      } else {\n        match = rquickExpr.exec( selector );\n      }\n\n      // Match html or make sure no context is specified for #id\n      if ( match && (match[1] || !context) ) {\n\n        // HANDLE: $(html) -> $(array)\n        if ( match[1] ) {\n          context = context instanceof jQuery ? context[0] : context;\n\n          // scripts is true for back-compat\n          // Intentionally let the error be thrown if parseHTML is not present\n          jQuery.merge( this, jQuery.parseHTML(\n            match[1],\n            context && context.nodeType ? context.ownerDocument || context : document,\n            true\n          ) );\n\n          // HANDLE: $(html, props)\n          if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n            for ( match in context ) {\n              // Properties of context are called as methods if possible\n              if ( jQuery.isFunction( this[ match ] ) ) {\n                this[ match ]( context[ match ] );\n\n              // ...and otherwise set as attributes\n              } else {\n                this.attr( match, context[ match ] );\n              }\n            }\n          }\n\n          return this;\n\n        // HANDLE: $(#id)\n        } else {\n          elem = document.getElementById( match[2] );\n\n          // Check parentNode to catch when Blackberry 4.6 returns\n          // nodes that are no longer in the document #6963\n          if ( elem && elem.parentNode ) {\n            // Handle the case where IE and Opera return items\n            // by name instead of ID\n            if ( elem.id !== match[2] ) {\n              return rootjQuery.find( selector );\n            }\n\n            // Otherwise, we inject the element directly into the jQuery object\n            this.length = 1;\n            this[0] = elem;\n          }\n\n          this.context = document;\n          this.selector = selector;\n          return this;\n        }\n\n      // HANDLE: $(expr, $(...))\n      } else if ( !context || context.jquery ) {\n        return ( context || rootjQuery ).find( selector );\n\n      // HANDLE: $(expr, context)\n      // (which is just equivalent to: $(context).find(expr)\n      } else {\n        return this.constructor( context ).find( selector );\n      }\n\n    // HANDLE: $(DOMElement)\n    } else if ( selector.nodeType ) {\n      this.context = this[0] = selector;\n      this.length = 1;\n      return this;\n\n    // HANDLE: $(function)\n    // Shortcut for document ready\n    } else if ( jQuery.isFunction( selector ) ) {\n      return typeof rootjQuery.ready !== \"undefined\" ?\n        rootjQuery.ready( selector ) :\n        // Execute immediately if ready is not present\n        selector( jQuery );\n    }\n\n    if ( selector.selector !== undefined ) {\n      this.selector = selector.selector;\n      this.context = selector.context;\n    }\n\n    return jQuery.makeArray( selector, this );\n  };\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n  // methods guaranteed to produce a unique set when starting from a unique set\n  guaranteedUnique = {\n    children: true,\n    contents: true,\n    next: true,\n    prev: true\n  };\n\njQuery.extend({\n  dir: function( elem, dir, until ) {\n    var matched = [],\n      cur = elem[ dir ];\n\n    while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n      if ( cur.nodeType === 1 ) {\n        matched.push( cur );\n      }\n      cur = cur[dir];\n    }\n    return matched;\n  },\n\n  sibling: function( n, elem ) {\n    var r = [];\n\n    for ( ; n; n = n.nextSibling ) {\n      if ( n.nodeType === 1 && n !== elem ) {\n        r.push( n );\n      }\n    }\n\n    return r;\n  }\n});\n\njQuery.fn.extend({\n  has: function( target ) {\n    var i,\n      targets = jQuery( target, this ),\n      len = targets.length;\n\n    return this.filter(function() {\n      for ( i = 0; i < len; i++ ) {\n        if ( jQuery.contains( this, targets[i] ) ) {\n          return true;\n        }\n      }\n    });\n  },\n\n  closest: function( selectors, context ) {\n    var cur,\n      i = 0,\n      l = this.length,\n      matched = [],\n      pos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n        jQuery( selectors, context || this.context ) :\n        0;\n\n    for ( ; i < l; i++ ) {\n      for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n        // Always skip document fragments\n        if ( cur.nodeType < 11 && (pos ?\n          pos.index(cur) > -1 :\n\n          // Don't pass non-elements to Sizzle\n          cur.nodeType === 1 &&\n            jQuery.find.matchesSelector(cur, selectors)) ) {\n\n          matched.push( cur );\n          break;\n        }\n      }\n    }\n\n    return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n  },\n\n  // Determine the position of an element within\n  // the matched set of elements\n  index: function( elem ) {\n\n    // No argument, return index in parent\n    if ( !elem ) {\n      return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n    }\n\n    // index in selector\n    if ( typeof elem === \"string\" ) {\n      return jQuery.inArray( this[0], jQuery( elem ) );\n    }\n\n    // Locate the position of the desired element\n    return jQuery.inArray(\n      // If it receives a jQuery object, the first element is used\n      elem.jquery ? elem[0] : elem, this );\n  },\n\n  add: function( selector, context ) {\n    return this.pushStack(\n      jQuery.unique(\n        jQuery.merge( this.get(), jQuery( selector, context ) )\n      )\n    );\n  },\n\n  addBack: function( selector ) {\n    return this.add( selector == null ?\n      this.prevObject : this.prevObject.filter(selector)\n    );\n  }\n});\n\nfunction sibling( cur, dir ) {\n  do {\n    cur = cur[ dir ];\n  } while ( cur && cur.nodeType !== 1 );\n\n  return cur;\n}\n\njQuery.each({\n  parent: function( elem ) {\n    var parent = elem.parentNode;\n    return parent && parent.nodeType !== 11 ? parent : null;\n  },\n  parents: function( elem ) {\n    return jQuery.dir( elem, \"parentNode\" );\n  },\n  parentsUntil: function( elem, i, until ) {\n    return jQuery.dir( elem, \"parentNode\", until );\n  },\n  next: function( elem ) {\n    return sibling( elem, \"nextSibling\" );\n  },\n  prev: function( elem ) {\n    return sibling( elem, \"previousSibling\" );\n  },\n  nextAll: function( elem ) {\n    return jQuery.dir( elem, \"nextSibling\" );\n  },\n  prevAll: function( elem ) {\n    return jQuery.dir( elem, \"previousSibling\" );\n  },\n  nextUntil: function( elem, i, until ) {\n    return jQuery.dir( elem, \"nextSibling\", until );\n  },\n  prevUntil: function( elem, i, until ) {\n    return jQuery.dir( elem, \"previousSibling\", until );\n  },\n  siblings: function( elem ) {\n    return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n  },\n  children: function( elem ) {\n    return jQuery.sibling( elem.firstChild );\n  },\n  contents: function( elem ) {\n    return jQuery.nodeName( elem, \"iframe\" ) ?\n      elem.contentDocument || elem.contentWindow.document :\n      jQuery.merge( [], elem.childNodes );\n  }\n}, function( name, fn ) {\n  jQuery.fn[ name ] = function( until, selector ) {\n    var ret = jQuery.map( this, fn, until );\n\n    if ( name.slice( -5 ) !== \"Until\" ) {\n      selector = until;\n    }\n\n    if ( selector && typeof selector === \"string\" ) {\n      ret = jQuery.filter( selector, ret );\n    }\n\n    if ( this.length > 1 ) {\n      // Remove duplicates\n      if ( !guaranteedUnique[ name ] ) {\n        ret = jQuery.unique( ret );\n      }\n\n      // Reverse order for parents* and prev-derivatives\n      if ( rparentsprev.test( name ) ) {\n        ret = ret.reverse();\n      }\n    }\n\n    return this.pushStack( ret );\n  };\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n  var object = optionsCache[ options ] = {};\n  jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n    object[ flag ] = true;\n  });\n  return object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *  options: an optional list of space-separated options that will change how\n *      the callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *  once:     will ensure the callback list can only be fired once (like a Deferred)\n *\n *  memory:     will keep track of previous values and will call any callback added\n *          after the list has been fired right away with the latest \"memorized\"\n *          values (like a Deferred)\n *\n *  unique:     will ensure a callback can only be added once (no duplicate in the list)\n *\n *  stopOnFalse:  interrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n  // Convert options from String-formatted to Object-formatted if needed\n  // (we check in cache first)\n  options = typeof options === \"string\" ?\n    ( optionsCache[ options ] || createOptions( options ) ) :\n    jQuery.extend( {}, options );\n\n  var // Flag to know if list is currently firing\n    firing,\n    // Last fire value (for non-forgettable lists)\n    memory,\n    // Flag to know if list was already fired\n    fired,\n    // End of the loop when firing\n    firingLength,\n    // Index of currently firing callback (modified by remove if needed)\n    firingIndex,\n    // First callback to fire (used internally by add and fireWith)\n    firingStart,\n    // Actual callback list\n    list = [],\n    // Stack of fire calls for repeatable lists\n    stack = !options.once && [],\n    // Fire callbacks\n    fire = function( data ) {\n      memory = options.memory && data;\n      fired = true;\n      firingIndex = firingStart || 0;\n      firingStart = 0;\n      firingLength = list.length;\n      firing = true;\n      for ( ; list && firingIndex < firingLength; firingIndex++ ) {\n        if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n          memory = false; // To prevent further calls using add\n          break;\n        }\n      }\n      firing = false;\n      if ( list ) {\n        if ( stack ) {\n          if ( stack.length ) {\n            fire( stack.shift() );\n          }\n        } else if ( memory ) {\n          list = [];\n        } else {\n          self.disable();\n        }\n      }\n    },\n    // Actual Callbacks object\n    self = {\n      // Add a callback or a collection of callbacks to the list\n      add: function() {\n        if ( list ) {\n          // First, we save the current length\n          var start = list.length;\n          (function add( args ) {\n            jQuery.each( args, function( _, arg ) {\n              var type = jQuery.type( arg );\n              if ( type === \"function\" ) {\n                if ( !options.unique || !self.has( arg ) ) {\n                  list.push( arg );\n                }\n              } else if ( arg && arg.length && type !== \"string\" ) {\n                // Inspect recursively\n                add( arg );\n              }\n            });\n          })( arguments );\n          // Do we need to add the callbacks to the\n          // current firing batch?\n          if ( firing ) {\n            firingLength = list.length;\n          // With memory, if we're not firing then\n          // we should call right away\n          } else if ( memory ) {\n            firingStart = start;\n            fire( memory );\n          }\n        }\n        return this;\n      },\n      // Remove a callback from the list\n      remove: function() {\n        if ( list ) {\n          jQuery.each( arguments, function( _, arg ) {\n            var index;\n            while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n              list.splice( index, 1 );\n              // Handle firing indexes\n              if ( firing ) {\n                if ( index <= firingLength ) {\n                  firingLength--;\n                }\n                if ( index <= firingIndex ) {\n                  firingIndex--;\n                }\n              }\n            }\n          });\n        }\n        return this;\n      },\n      // Check if a given callback is in the list.\n      // If no argument is given, return whether or not list has callbacks attached.\n      has: function( fn ) {\n        return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n      },\n      // Remove all callbacks from the list\n      empty: function() {\n        list = [];\n        firingLength = 0;\n        return this;\n      },\n      // Have the list do nothing anymore\n      disable: function() {\n        list = stack = memory = undefined;\n        return this;\n      },\n      // Is it disabled?\n      disabled: function() {\n        return !list;\n      },\n      // Lock the list in its current state\n      lock: function() {\n        stack = undefined;\n        if ( !memory ) {\n          self.disable();\n        }\n        return this;\n      },\n      // Is it locked?\n      locked: function() {\n        return !stack;\n      },\n      // Call all callbacks with the given context and arguments\n      fireWith: function( context, args ) {\n        if ( list && ( !fired || stack ) ) {\n          args = args || [];\n          args = [ context, args.slice ? args.slice() : args ];\n          if ( firing ) {\n            stack.push( args );\n          } else {\n            fire( args );\n          }\n        }\n        return this;\n      },\n      // Call all the callbacks with the given arguments\n      fire: function() {\n        self.fireWith( this, arguments );\n        return this;\n      },\n      // To know if the callbacks have already been called at least once\n      fired: function() {\n        return !!fired;\n      }\n    };\n\n  return self;\n};\n\n\njQuery.extend({\n\n  Deferred: function( func ) {\n    var tuples = [\n        // action, add listener, listener list, final state\n        [ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n        [ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n        [ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n      ],\n      state = \"pending\",\n      promise = {\n        state: function() {\n          return state;\n        },\n        always: function() {\n          deferred.done( arguments ).fail( arguments );\n          return this;\n        },\n        then: function( /* fnDone, fnFail, fnProgress */ ) {\n          var fns = arguments;\n          return jQuery.Deferred(function( newDefer ) {\n            jQuery.each( tuples, function( i, tuple ) {\n              var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n              // deferred[ done | fail | progress ] for forwarding actions to newDefer\n              deferred[ tuple[1] ](function() {\n                var returned = fn && fn.apply( this, arguments );\n                if ( returned && jQuery.isFunction( returned.promise ) ) {\n                  returned.promise()\n                    .done( newDefer.resolve )\n                    .fail( newDefer.reject )\n                    .progress( newDefer.notify );\n                } else {\n                  newDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n                }\n              });\n            });\n            fns = null;\n          }).promise();\n        },\n        // Get a promise for this deferred\n        // If obj is provided, the promise aspect is added to the object\n        promise: function( obj ) {\n          return obj != null ? jQuery.extend( obj, promise ) : promise;\n        }\n      },\n      deferred = {};\n\n    // Keep pipe for back-compat\n    promise.pipe = promise.then;\n\n    // Add list-specific methods\n    jQuery.each( tuples, function( i, tuple ) {\n      var list = tuple[ 2 ],\n        stateString = tuple[ 3 ];\n\n      // promise[ done | fail | progress ] = list.add\n      promise[ tuple[1] ] = list.add;\n\n      // Handle state\n      if ( stateString ) {\n        list.add(function() {\n          // state = [ resolved | rejected ]\n          state = stateString;\n\n        // [ reject_list | resolve_list ].disable; progress_list.lock\n        }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n      }\n\n      // deferred[ resolve | reject | notify ]\n      deferred[ tuple[0] ] = function() {\n        deferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n        return this;\n      };\n      deferred[ tuple[0] + \"With\" ] = list.fireWith;\n    });\n\n    // Make the deferred a promise\n    promise.promise( deferred );\n\n    // Call given func if any\n    if ( func ) {\n      func.call( deferred, deferred );\n    }\n\n    // All done!\n    return deferred;\n  },\n\n  // Deferred helper\n  when: function( subordinate /* , ..., subordinateN */ ) {\n    var i = 0,\n      resolveValues = slice.call( arguments ),\n      length = resolveValues.length,\n\n      // the count of uncompleted subordinates\n      remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n      // the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n      deferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n      // Update function for both resolve and progress values\n      updateFunc = function( i, contexts, values ) {\n        return function( value ) {\n          contexts[ i ] = this;\n          values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n          if ( values === progressValues ) {\n            deferred.notifyWith( contexts, values );\n\n          } else if ( !(--remaining) ) {\n            deferred.resolveWith( contexts, values );\n          }\n        };\n      },\n\n      progressValues, progressContexts, resolveContexts;\n\n    // add listeners to Deferred subordinates; treat others as resolved\n    if ( length > 1 ) {\n      progressValues = new Array( length );\n      progressContexts = new Array( length );\n      resolveContexts = new Array( length );\n      for ( ; i < length; i++ ) {\n        if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n          resolveValues[ i ].promise()\n            .done( updateFunc( i, resolveContexts, resolveValues ) )\n            .fail( deferred.reject )\n            .progress( updateFunc( i, progressContexts, progressValues ) );\n        } else {\n          --remaining;\n        }\n      }\n    }\n\n    // if we're not waiting on anything, resolve the master\n    if ( !remaining ) {\n      deferred.resolveWith( resolveContexts, resolveValues );\n    }\n\n    return deferred.promise();\n  }\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n  // Add the callback\n  jQuery.ready.promise().done( fn );\n\n  return this;\n};\n\njQuery.extend({\n  // Is the DOM ready to be used? Set to true once it occurs.\n  isReady: false,\n\n  // A counter to track how many items to wait for before\n  // the ready event fires. See #6781\n  readyWait: 1,\n\n  // Hold (or release) the ready event\n  holdReady: function( hold ) {\n    if ( hold ) {\n      jQuery.readyWait++;\n    } else {\n      jQuery.ready( true );\n    }\n  },\n\n  // Handle when the DOM is ready\n  ready: function( wait ) {\n\n    // Abort if there are pending holds or we're already ready\n    if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n      return;\n    }\n\n    // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n    if ( !document.body ) {\n      return setTimeout( jQuery.ready );\n    }\n\n    // Remember that the DOM is ready\n    jQuery.isReady = true;\n\n    // If a normal DOM Ready event fired, decrement, and wait if need be\n    if ( wait !== true && --jQuery.readyWait > 0 ) {\n      return;\n    }\n\n    // If there are functions bound, to execute\n    readyList.resolveWith( document, [ jQuery ] );\n\n    // Trigger any bound ready events\n    if ( jQuery.fn.triggerHandler ) {\n      jQuery( document ).triggerHandler( \"ready\" );\n      jQuery( document ).off( \"ready\" );\n    }\n  }\n});\n\n/**\n * Clean-up method for dom ready events\n */\nfunction detach() {\n  if ( document.addEventListener ) {\n    document.removeEventListener( \"DOMContentLoaded\", completed, false );\n    window.removeEventListener( \"load\", completed, false );\n\n  } else {\n    document.detachEvent( \"onreadystatechange\", completed );\n    window.detachEvent( \"onload\", completed );\n  }\n}\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n  // readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n  if ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n    detach();\n    jQuery.ready();\n  }\n}\n\njQuery.ready.promise = function( obj ) {\n  if ( !readyList ) {\n\n    readyList = jQuery.Deferred();\n\n    // Catch cases where $(document).ready() is called after the browser event has already occurred.\n    // we once tried to use readyState \"interactive\" here, but it caused issues like the one\n    // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n    if ( document.readyState === \"complete\" ) {\n      // Handle it asynchronously to allow scripts the opportunity to delay ready\n      setTimeout( jQuery.ready );\n\n    // Standards-based browsers support DOMContentLoaded\n    } else if ( document.addEventListener ) {\n      // Use the handy event callback\n      document.addEventListener( \"DOMContentLoaded\", completed, false );\n\n      // A fallback to window.onload, that will always work\n      window.addEventListener( \"load\", completed, false );\n\n    // If IE event model is used\n    } else {\n      // Ensure firing before onload, maybe late but safe also for iframes\n      document.attachEvent( \"onreadystatechange\", completed );\n\n      // A fallback to window.onload, that will always work\n      window.attachEvent( \"onload\", completed );\n\n      // If IE and not a frame\n      // continually check to see if the document is ready\n      var top = false;\n\n      try {\n        top = window.frameElement == null && document.documentElement;\n      } catch(e) {}\n\n      if ( top && top.doScroll ) {\n        (function doScrollCheck() {\n          if ( !jQuery.isReady ) {\n\n            try {\n              // Use the trick by Diego Perini\n              // http://javascript.nwbox.com/IEContentLoaded/\n              top.doScroll(\"left\");\n            } catch(e) {\n              return setTimeout( doScrollCheck, 50 );\n            }\n\n            // detach all dom ready events\n            detach();\n\n            // and execute any waiting functions\n            jQuery.ready();\n          }\n        })();\n      }\n    }\n  }\n  return readyList.promise( obj );\n};\n\n\nvar strundefined = typeof undefined;\n\n\n\n// Support: IE<9\n// Iteration over object's inherited properties before its own\nvar i;\nfor ( i in jQuery( support ) ) {\n  break;\n}\nsupport.ownLast = i !== \"0\";\n\n// Note: most support tests are defined in their respective modules.\n// false until the test is run\nsupport.inlineBlockNeedsLayout = false;\n\n// Execute ASAP in case we need to set body.style.zoom\njQuery(function() {\n  // Minified: var a,b,c,d\n  var val, div, body, container;\n\n  body = document.getElementsByTagName( \"body\" )[ 0 ];\n  if ( !body || !body.style ) {\n    // Return for frameset docs that don't have a body\n    return;\n  }\n\n  // Setup\n  div = document.createElement( \"div\" );\n  container = document.createElement( \"div\" );\n  container.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n  body.appendChild( container ).appendChild( div );\n\n  if ( typeof div.style.zoom !== strundefined ) {\n    // Support: IE<8\n    // Check if natively block-level elements act like inline-block\n    // elements when setting their display to 'inline' and giving\n    // them layout\n    div.style.cssText = \"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\";\n\n    support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;\n    if ( val ) {\n      // Prevent IE 6 from affecting layout for positioned elements #11048\n      // Prevent IE from shrinking the body in IE 7 mode #12869\n      // Support: IE<8\n      body.style.zoom = 1;\n    }\n  }\n\n  body.removeChild( container );\n});\n\n\n\n\n(function() {\n  var div = document.createElement( \"div\" );\n\n  // Execute the test only if not already executed in another module.\n  if (support.deleteExpando == null) {\n    // Support: IE<9\n    support.deleteExpando = true;\n    try {\n      delete div.test;\n    } catch( e ) {\n      support.deleteExpando = false;\n    }\n  }\n\n  // Null elements to avoid leaks in IE.\n  div = null;\n})();\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( elem ) {\n  var noData = jQuery.noData[ (elem.nodeName + \" \").toLowerCase() ],\n    nodeType = +elem.nodeType || 1;\n\n  // Do not set data on non-element DOM nodes because it will not be cleared (#8335).\n  return nodeType !== 1 && nodeType !== 9 ?\n    false :\n\n    // Nodes accept data unless otherwise specified; rejection can be conditional\n    !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n};\n\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n  rmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n  // If nothing was found internally, try to fetch any\n  // data from the HTML5 data-* attribute\n  if ( data === undefined && elem.nodeType === 1 ) {\n\n    var name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n    data = elem.getAttribute( name );\n\n    if ( typeof data === \"string\" ) {\n      try {\n        data = data === \"true\" ? true :\n          data === \"false\" ? false :\n          data === \"null\" ? null :\n          // Only convert to a number if it doesn't change the string\n          +data + \"\" === data ? +data :\n          rbrace.test( data ) ? jQuery.parseJSON( data ) :\n          data;\n      } catch( e ) {}\n\n      // Make sure we set the data so it isn't changed later\n      jQuery.data( elem, key, data );\n\n    } else {\n      data = undefined;\n    }\n  }\n\n  return data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n  var name;\n  for ( name in obj ) {\n\n    // if the public data object is empty, the private is still empty\n    if ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n      continue;\n    }\n    if ( name !== \"toJSON\" ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ) {\n  if ( !jQuery.acceptData( elem ) ) {\n    return;\n  }\n\n  var ret, thisCache,\n    internalKey = jQuery.expando,\n\n    // We have to handle DOM nodes and JS objects differently because IE6-7\n    // can't GC object references properly across the DOM-JS boundary\n    isNode = elem.nodeType,\n\n    // Only DOM nodes need the global jQuery cache; JS object data is\n    // attached directly to the object so GC can occur automatically\n    cache = isNode ? jQuery.cache : elem,\n\n    // Only defining an ID for JS objects if its cache already exists allows\n    // the code to shortcut on the same path as a DOM node with no cache\n    id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n  // Avoid doing any more work than we need to when trying to get data on an\n  // object that has no data at all\n  if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n    return;\n  }\n\n  if ( !id ) {\n    // Only DOM nodes need a new unique ID for each element since their data\n    // ends up in the global cache\n    if ( isNode ) {\n      id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;\n    } else {\n      id = internalKey;\n    }\n  }\n\n  if ( !cache[ id ] ) {\n    // Avoid exposing jQuery metadata on plain JS objects when the object\n    // is serialized using JSON.stringify\n    cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n  }\n\n  // An object can be passed to jQuery.data instead of a key/value pair; this gets\n  // shallow copied over onto the existing cache\n  if ( typeof name === \"object\" || typeof name === \"function\" ) {\n    if ( pvt ) {\n      cache[ id ] = jQuery.extend( cache[ id ], name );\n    } else {\n      cache[ id ].data = jQuery.extend( cache[ id ].data, name );\n    }\n  }\n\n  thisCache = cache[ id ];\n\n  // jQuery data() is stored in a separate object inside the object's internal data\n  // cache in order to avoid key collisions between internal data and user-defined\n  // data.\n  if ( !pvt ) {\n    if ( !thisCache.data ) {\n      thisCache.data = {};\n    }\n\n    thisCache = thisCache.data;\n  }\n\n  if ( data !== undefined ) {\n    thisCache[ jQuery.camelCase( name ) ] = data;\n  }\n\n  // Check for both converted-to-camel and non-converted data property names\n  // If a data property was specified\n  if ( typeof name === \"string\" ) {\n\n    // First Try to find as-is property data\n    ret = thisCache[ name ];\n\n    // Test for null|undefined property data\n    if ( ret == null ) {\n\n      // Try to find the camelCased property\n      ret = thisCache[ jQuery.camelCase( name ) ];\n    }\n  } else {\n    ret = thisCache;\n  }\n\n  return ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n  if ( !jQuery.acceptData( elem ) ) {\n    return;\n  }\n\n  var thisCache, i,\n    isNode = elem.nodeType,\n\n    // See jQuery.data for more information\n    cache = isNode ? jQuery.cache : elem,\n    id = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n  // If there is already no cache entry for this object, there is no\n  // purpose in continuing\n  if ( !cache[ id ] ) {\n    return;\n  }\n\n  if ( name ) {\n\n    thisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n    if ( thisCache ) {\n\n      // Support array or space separated string names for data keys\n      if ( !jQuery.isArray( name ) ) {\n\n        // try the string as a key before any manipulation\n        if ( name in thisCache ) {\n          name = [ name ];\n        } else {\n\n          // split the camel cased version by spaces unless a key with the spaces exists\n          name = jQuery.camelCase( name );\n          if ( name in thisCache ) {\n            name = [ name ];\n          } else {\n            name = name.split(\" \");\n          }\n        }\n      } else {\n        // If \"name\" is an array of keys...\n        // When data is initially created, via (\"key\", \"val\") signature,\n        // keys will be converted to camelCase.\n        // Since there is no way to tell _how_ a key was added, remove\n        // both plain key and camelCase key. #12786\n        // This will only penalize the array argument path.\n        name = name.concat( jQuery.map( name, jQuery.camelCase ) );\n      }\n\n      i = name.length;\n      while ( i-- ) {\n        delete thisCache[ name[i] ];\n      }\n\n      // If there is no data left in the cache, we want to continue\n      // and let the cache object itself get destroyed\n      if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n        return;\n      }\n    }\n  }\n\n  // See jQuery.data for more information\n  if ( !pvt ) {\n    delete cache[ id ].data;\n\n    // Don't destroy the parent cache unless the internal data object\n    // had been the only thing left in it\n    if ( !isEmptyDataObject( cache[ id ] ) ) {\n      return;\n    }\n  }\n\n  // Destroy the cache\n  if ( isNode ) {\n    jQuery.cleanData( [ elem ], true );\n\n  // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n  /* jshint eqeqeq: false */\n  } else if ( support.deleteExpando || cache != cache.window ) {\n    /* jshint eqeqeq: true */\n    delete cache[ id ];\n\n  // When all else fails, null\n  } else {\n    cache[ id ] = null;\n  }\n}\n\njQuery.extend({\n  cache: {},\n\n  // The following elements (space-suffixed to avoid Object.prototype collisions)\n  // throw uncatchable exceptions if you attempt to set expando properties\n  noData: {\n    \"applet \": true,\n    \"embed \": true,\n    // ...but Flash objects (which have this classid) *can* handle expandos\n    \"object \": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n  },\n\n  hasData: function( elem ) {\n    elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n    return !!elem && !isEmptyDataObject( elem );\n  },\n\n  data: function( elem, name, data ) {\n    return internalData( elem, name, data );\n  },\n\n  removeData: function( elem, name ) {\n    return internalRemoveData( elem, name );\n  },\n\n  // For internal use only.\n  _data: function( elem, name, data ) {\n    return internalData( elem, name, data, true );\n  },\n\n  _removeData: function( elem, name ) {\n    return internalRemoveData( elem, name, true );\n  }\n});\n\njQuery.fn.extend({\n  data: function( key, value ) {\n    var i, name, data,\n      elem = this[0],\n      attrs = elem && elem.attributes;\n\n    // Special expections of .data basically thwart jQuery.access,\n    // so implement the relevant behavior ourselves\n\n    // Gets all values\n    if ( key === undefined ) {\n      if ( this.length ) {\n        data = jQuery.data( elem );\n\n        if ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n          i = attrs.length;\n          while ( i-- ) {\n\n            // Support: IE11+\n            // The attrs elements can be null (#14894)\n            if ( attrs[ i ] ) {\n              name = attrs[ i ].name;\n              if ( name.indexOf( \"data-\" ) === 0 ) {\n                name = jQuery.camelCase( name.slice(5) );\n                dataAttr( elem, name, data[ name ] );\n              }\n            }\n          }\n          jQuery._data( elem, \"parsedAttrs\", true );\n        }\n      }\n\n      return data;\n    }\n\n    // Sets multiple values\n    if ( typeof key === \"object\" ) {\n      return this.each(function() {\n        jQuery.data( this, key );\n      });\n    }\n\n    return arguments.length > 1 ?\n\n      // Sets one value\n      this.each(function() {\n        jQuery.data( this, key, value );\n      }) :\n\n      // Gets one value\n      // Try to fetch any internally stored data first\n      elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;\n  },\n\n  removeData: function( key ) {\n    return this.each(function() {\n      jQuery.removeData( this, key );\n    });\n  }\n});\n\n\njQuery.extend({\n  queue: function( elem, type, data ) {\n    var queue;\n\n    if ( elem ) {\n      type = ( type || \"fx\" ) + \"queue\";\n      queue = jQuery._data( elem, type );\n\n      // Speed up dequeue by getting out quickly if this is just a lookup\n      if ( data ) {\n        if ( !queue || jQuery.isArray(data) ) {\n          queue = jQuery._data( elem, type, jQuery.makeArray(data) );\n        } else {\n          queue.push( data );\n        }\n      }\n      return queue || [];\n    }\n  },\n\n  dequeue: function( elem, type ) {\n    type = type || \"fx\";\n\n    var queue = jQuery.queue( elem, type ),\n      startLength = queue.length,\n      fn = queue.shift(),\n      hooks = jQuery._queueHooks( elem, type ),\n      next = function() {\n        jQuery.dequeue( elem, type );\n      };\n\n    // If the fx queue is dequeued, always remove the progress sentinel\n    if ( fn === \"inprogress\" ) {\n      fn = queue.shift();\n      startLength--;\n    }\n\n    if ( fn ) {\n\n      // Add a progress sentinel to prevent the fx queue from being\n      // automatically dequeued\n      if ( type === \"fx\" ) {\n        queue.unshift( \"inprogress\" );\n      }\n\n      // clear up the last queue stop function\n      delete hooks.stop;\n      fn.call( elem, next, hooks );\n    }\n\n    if ( !startLength && hooks ) {\n      hooks.empty.fire();\n    }\n  },\n\n  // not intended for public consumption - generates a queueHooks object, or returns the current one\n  _queueHooks: function( elem, type ) {\n    var key = type + \"queueHooks\";\n    return jQuery._data( elem, key ) || jQuery._data( elem, key, {\n      empty: jQuery.Callbacks(\"once memory\").add(function() {\n        jQuery._removeData( elem, type + \"queue\" );\n        jQuery._removeData( elem, key );\n      })\n    });\n  }\n});\n\njQuery.fn.extend({\n  queue: function( type, data ) {\n    var setter = 2;\n\n    if ( typeof type !== \"string\" ) {\n      data = type;\n      type = \"fx\";\n      setter--;\n    }\n\n    if ( arguments.length < setter ) {\n      return jQuery.queue( this[0], type );\n    }\n\n    return data === undefined ?\n      this :\n      this.each(function() {\n        var queue = jQuery.queue( this, type, data );\n\n        // ensure a hooks for this queue\n        jQuery._queueHooks( this, type );\n\n        if ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n          jQuery.dequeue( this, type );\n        }\n      });\n  },\n  dequeue: function( type ) {\n    return this.each(function() {\n      jQuery.dequeue( this, type );\n    });\n  },\n  clearQueue: function( type ) {\n    return this.queue( type || \"fx\", [] );\n  },\n  // Get a promise resolved when queues of a certain type\n  // are emptied (fx is the type by default)\n  promise: function( type, obj ) {\n    var tmp,\n      count = 1,\n      defer = jQuery.Deferred(),\n      elements = this,\n      i = this.length,\n      resolve = function() {\n        if ( !( --count ) ) {\n          defer.resolveWith( elements, [ elements ] );\n        }\n      };\n\n    if ( typeof type !== \"string\" ) {\n      obj = type;\n      type = undefined;\n    }\n    type = type || \"fx\";\n\n    while ( i-- ) {\n      tmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n      if ( tmp && tmp.empty ) {\n        count++;\n        tmp.empty.add( resolve );\n      }\n    }\n    resolve();\n    return defer.promise( obj );\n  }\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n    // isHidden might be called from jQuery#filter function;\n    // in that case, element will be second argument\n    elem = el || elem;\n    return jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n  };\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n  var i = 0,\n    length = elems.length,\n    bulk = key == null;\n\n  // Sets many values\n  if ( jQuery.type( key ) === \"object\" ) {\n    chainable = true;\n    for ( i in key ) {\n      jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n    }\n\n  // Sets one value\n  } else if ( value !== undefined ) {\n    chainable = true;\n\n    if ( !jQuery.isFunction( value ) ) {\n      raw = true;\n    }\n\n    if ( bulk ) {\n      // Bulk operations run against the entire set\n      if ( raw ) {\n        fn.call( elems, value );\n        fn = null;\n\n      // ...except when executing function values\n      } else {\n        bulk = fn;\n        fn = function( elem, key, value ) {\n          return bulk.call( jQuery( elem ), value );\n        };\n      }\n    }\n\n    if ( fn ) {\n      for ( ; i < length; i++ ) {\n        fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n      }\n    }\n  }\n\n  return chainable ?\n    elems :\n\n    // Gets\n    bulk ?\n      fn.call( elems ) :\n      length ? fn( elems[0], key ) : emptyGet;\n};\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n  // Minified: var a,b,c\n  var input = document.createElement( \"input\" ),\n    div = document.createElement( \"div\" ),\n    fragment = document.createDocumentFragment();\n\n  // Setup\n  div.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n  // IE strips leading whitespace when .innerHTML is used\n  support.leadingWhitespace = div.firstChild.nodeType === 3;\n\n  // Make sure that tbody elements aren't automatically inserted\n  // IE will insert them into empty tables\n  support.tbody = !div.getElementsByTagName( \"tbody\" ).length;\n\n  // Make sure that link elements get serialized correctly by innerHTML\n  // This requires a wrapper element in IE\n  support.htmlSerialize = !!div.getElementsByTagName( \"link\" ).length;\n\n  // Makes sure cloning an html5 element does not cause problems\n  // Where outerHTML is undefined, this still works\n  support.html5Clone =\n    document.createElement( \"nav\" ).cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n  // Check if a disconnected checkbox will retain its checked\n  // value of true after appended to the DOM (IE6/7)\n  input.type = \"checkbox\";\n  input.checked = true;\n  fragment.appendChild( input );\n  support.appendChecked = input.checked;\n\n  // Make sure textarea (and checkbox) defaultValue is properly cloned\n  // Support: IE6-IE11+\n  div.innerHTML = \"<textarea>x</textarea>\";\n  support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n  // #11217 - WebKit loses check when the name is after the checked attribute\n  fragment.appendChild( div );\n  div.innerHTML = \"<input type='radio' checked='checked' name='t'/>\";\n\n  // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n  // old WebKit doesn't clone checked state correctly in fragments\n  support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n  // Support: IE<9\n  // Opera does not clone events (and typeof div.attachEvent === undefined).\n  // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n  support.noCloneEvent = true;\n  if ( div.attachEvent ) {\n    div.attachEvent( \"onclick\", function() {\n      support.noCloneEvent = false;\n    });\n\n    div.cloneNode( true ).click();\n  }\n\n  // Execute the test only if not already executed in another module.\n  if (support.deleteExpando == null) {\n    // Support: IE<9\n    support.deleteExpando = true;\n    try {\n      delete div.test;\n    } catch( e ) {\n      support.deleteExpando = false;\n    }\n  }\n})();\n\n\n(function() {\n  var i, eventName,\n    div = document.createElement( \"div\" );\n\n  // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)\n  for ( i in { submit: true, change: true, focusin: true }) {\n    eventName = \"on\" + i;\n\n    if ( !(support[ i + \"Bubbles\" ] = eventName in window) ) {\n      // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n      div.setAttribute( eventName, \"t\" );\n      support[ i + \"Bubbles\" ] = div.attributes[ eventName ].expando === false;\n    }\n  }\n\n  // Null elements to avoid leaks in IE.\n  div = null;\n})();\n\n\nvar rformElems = /^(?:input|select|textarea)$/i,\n  rkeyEvent = /^key/,\n  rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n  rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n  rtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n  return true;\n}\n\nfunction returnFalse() {\n  return false;\n}\n\nfunction safeActiveElement() {\n  try {\n    return document.activeElement;\n  } catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n  global: {},\n\n  add: function( elem, types, handler, data, selector ) {\n    var tmp, events, t, handleObjIn,\n      special, eventHandle, handleObj,\n      handlers, type, namespaces, origType,\n      elemData = jQuery._data( elem );\n\n    // Don't attach events to noData or text/comment nodes (but allow plain objects)\n    if ( !elemData ) {\n      return;\n    }\n\n    // Caller can pass in an object of custom data in lieu of the handler\n    if ( handler.handler ) {\n      handleObjIn = handler;\n      handler = handleObjIn.handler;\n      selector = handleObjIn.selector;\n    }\n\n    // Make sure that the handler has a unique ID, used to find/remove it later\n    if ( !handler.guid ) {\n      handler.guid = jQuery.guid++;\n    }\n\n    // Init the element's event structure and main handler, if this is the first\n    if ( !(events = elemData.events) ) {\n      events = elemData.events = {};\n    }\n    if ( !(eventHandle = elemData.handle) ) {\n      eventHandle = elemData.handle = function( e ) {\n        // Discard the second event of a jQuery.event.trigger() and\n        // when an event is called after a page has unloaded\n        return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?\n          jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n          undefined;\n      };\n      // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n      eventHandle.elem = elem;\n    }\n\n    // Handle multiple events separated by a space\n    types = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n    t = types.length;\n    while ( t-- ) {\n      tmp = rtypenamespace.exec( types[t] ) || [];\n      type = origType = tmp[1];\n      namespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n      // There *must* be a type, no attaching namespace-only handlers\n      if ( !type ) {\n        continue;\n      }\n\n      // If event changes its type, use the special event handlers for the changed type\n      special = jQuery.event.special[ type ] || {};\n\n      // If selector defined, determine special event api type, otherwise given type\n      type = ( selector ? special.delegateType : special.bindType ) || type;\n\n      // Update special based on newly reset type\n      special = jQuery.event.special[ type ] || {};\n\n      // handleObj is passed to all event handlers\n      handleObj = jQuery.extend({\n        type: type,\n        origType: origType,\n        data: data,\n        handler: handler,\n        guid: handler.guid,\n        selector: selector,\n        needsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n        namespace: namespaces.join(\".\")\n      }, handleObjIn );\n\n      // Init the event handler queue if we're the first\n      if ( !(handlers = events[ type ]) ) {\n        handlers = events[ type ] = [];\n        handlers.delegateCount = 0;\n\n        // Only use addEventListener/attachEvent if the special events handler returns false\n        if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n          // Bind the global event handler to the element\n          if ( elem.addEventListener ) {\n            elem.addEventListener( type, eventHandle, false );\n\n          } else if ( elem.attachEvent ) {\n            elem.attachEvent( \"on\" + type, eventHandle );\n          }\n        }\n      }\n\n      if ( special.add ) {\n        special.add.call( elem, handleObj );\n\n        if ( !handleObj.handler.guid ) {\n          handleObj.handler.guid = handler.guid;\n        }\n      }\n\n      // Add to the element's handler list, delegates in front\n      if ( selector ) {\n        handlers.splice( handlers.delegateCount++, 0, handleObj );\n      } else {\n        handlers.push( handleObj );\n      }\n\n      // Keep track of which events have ever been used, for event optimization\n      jQuery.event.global[ type ] = true;\n    }\n\n    // Nullify elem to prevent memory leaks in IE\n    elem = null;\n  },\n\n  // Detach an event or set of events from an element\n  remove: function( elem, types, handler, selector, mappedTypes ) {\n    var j, handleObj, tmp,\n      origCount, t, events,\n      special, handlers, type,\n      namespaces, origType,\n      elemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n    if ( !elemData || !(events = elemData.events) ) {\n      return;\n    }\n\n    // Once for each type.namespace in types; type may be omitted\n    types = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n    t = types.length;\n    while ( t-- ) {\n      tmp = rtypenamespace.exec( types[t] ) || [];\n      type = origType = tmp[1];\n      namespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n      // Unbind all events (on this namespace, if provided) for the element\n      if ( !type ) {\n        for ( type in events ) {\n          jQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n        }\n        continue;\n      }\n\n      special = jQuery.event.special[ type ] || {};\n      type = ( selector ? special.delegateType : special.bindType ) || type;\n      handlers = events[ type ] || [];\n      tmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n      // Remove matching events\n      origCount = j = handlers.length;\n      while ( j-- ) {\n        handleObj = handlers[ j ];\n\n        if ( ( mappedTypes || origType === handleObj.origType ) &&\n          ( !handler || handler.guid === handleObj.guid ) &&\n          ( !tmp || tmp.test( handleObj.namespace ) ) &&\n          ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n          handlers.splice( j, 1 );\n\n          if ( handleObj.selector ) {\n            handlers.delegateCount--;\n          }\n          if ( special.remove ) {\n            special.remove.call( elem, handleObj );\n          }\n        }\n      }\n\n      // Remove generic event handler if we removed something and no more handlers exist\n      // (avoids potential for endless recursion during removal of special event handlers)\n      if ( origCount && !handlers.length ) {\n        if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n          jQuery.removeEvent( elem, type, elemData.handle );\n        }\n\n        delete events[ type ];\n      }\n    }\n\n    // Remove the expando if it's no longer used\n    if ( jQuery.isEmptyObject( events ) ) {\n      delete elemData.handle;\n\n      // removeData also checks for emptiness and clears the expando if empty\n      // so use it instead of delete\n      jQuery._removeData( elem, \"events\" );\n    }\n  },\n\n  trigger: function( event, data, elem, onlyHandlers ) {\n    var handle, ontype, cur,\n      bubbleType, special, tmp, i,\n      eventPath = [ elem || document ],\n      type = hasOwn.call( event, \"type\" ) ? event.type : event,\n      namespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n    cur = tmp = elem = elem || document;\n\n    // Don't do events on text and comment nodes\n    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n      return;\n    }\n\n    // focus/blur morphs to focusin/out; ensure we're not firing them right now\n    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n      return;\n    }\n\n    if ( type.indexOf(\".\") >= 0 ) {\n      // Namespaced trigger; create a regexp to match event type in handle()\n      namespaces = type.split(\".\");\n      type = namespaces.shift();\n      namespaces.sort();\n    }\n    ontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n    // Caller can pass in a jQuery.Event object, Object, or just an event type string\n    event = event[ jQuery.expando ] ?\n      event :\n      new jQuery.Event( type, typeof event === \"object\" && event );\n\n    // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n    event.isTrigger = onlyHandlers ? 2 : 3;\n    event.namespace = namespaces.join(\".\");\n    event.namespace_re = event.namespace ?\n      new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n      null;\n\n    // Clean up the event in case it is being reused\n    event.result = undefined;\n    if ( !event.target ) {\n      event.target = elem;\n    }\n\n    // Clone any incoming data and prepend the event, creating the handler arg list\n    data = data == null ?\n      [ event ] :\n      jQuery.makeArray( data, [ event ] );\n\n    // Allow special events to draw outside the lines\n    special = jQuery.event.special[ type ] || {};\n    if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n      return;\n    }\n\n    // Determine event propagation path in advance, per W3C events spec (#9951)\n    // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n    if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n      bubbleType = special.delegateType || type;\n      if ( !rfocusMorph.test( bubbleType + type ) ) {\n        cur = cur.parentNode;\n      }\n      for ( ; cur; cur = cur.parentNode ) {\n        eventPath.push( cur );\n        tmp = cur;\n      }\n\n      // Only add window if we got to document (e.g., not plain obj or detached DOM)\n      if ( tmp === (elem.ownerDocument || document) ) {\n        eventPath.push( tmp.defaultView || tmp.parentWindow || window );\n      }\n    }\n\n    // Fire handlers on the event path\n    i = 0;\n    while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n      event.type = i > 1 ?\n        bubbleType :\n        special.bindType || type;\n\n      // jQuery handler\n      handle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n      if ( handle ) {\n        handle.apply( cur, data );\n      }\n\n      // Native handler\n      handle = ontype && cur[ ontype ];\n      if ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n        event.result = handle.apply( cur, data );\n        if ( event.result === false ) {\n          event.preventDefault();\n        }\n      }\n    }\n    event.type = type;\n\n    // If nobody prevented the default action, do it now\n    if ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n      if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n        jQuery.acceptData( elem ) ) {\n\n        // Call a native DOM method on the target with the same name name as the event.\n        // Can't use an .isFunction() check here because IE6/7 fails that test.\n        // Don't do default actions on window, that's where global variables be (#6170)\n        if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n          // Don't re-trigger an onFOO event when we call its FOO() method\n          tmp = elem[ ontype ];\n\n          if ( tmp ) {\n            elem[ ontype ] = null;\n          }\n\n          // Prevent re-triggering of the same event, since we already bubbled it above\n          jQuery.event.triggered = type;\n          try {\n            elem[ type ]();\n          } catch ( e ) {\n            // IE<9 dies on focus/blur to hidden element (#1486,#12518)\n            // only reproducible on winXP IE8 native, not IE9 in IE8 mode\n          }\n          jQuery.event.triggered = undefined;\n\n          if ( tmp ) {\n            elem[ ontype ] = tmp;\n          }\n        }\n      }\n    }\n\n    return event.result;\n  },\n\n  dispatch: function( event ) {\n\n    // Make a writable jQuery.Event from the native event object\n    event = jQuery.event.fix( event );\n\n    var i, ret, handleObj, matched, j,\n      handlerQueue = [],\n      args = slice.call( arguments ),\n      handlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n      special = jQuery.event.special[ event.type ] || {};\n\n    // Use the fix-ed jQuery.Event rather than the (read-only) native event\n    args[0] = event;\n    event.delegateTarget = this;\n\n    // Call the preDispatch hook for the mapped type, and let it bail if desired\n    if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n      return;\n    }\n\n    // Determine handlers\n    handlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n    // Run delegates first; they may want to stop propagation beneath us\n    i = 0;\n    while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n      event.currentTarget = matched.elem;\n\n      j = 0;\n      while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n        // Triggered event must either 1) have no namespace, or\n        // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n        if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n          event.handleObj = handleObj;\n          event.data = handleObj.data;\n\n          ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n              .apply( matched.elem, args );\n\n          if ( ret !== undefined ) {\n            if ( (event.result = ret) === false ) {\n              event.preventDefault();\n              event.stopPropagation();\n            }\n          }\n        }\n      }\n    }\n\n    // Call the postDispatch hook for the mapped type\n    if ( special.postDispatch ) {\n      special.postDispatch.call( this, event );\n    }\n\n    return event.result;\n  },\n\n  handlers: function( event, handlers ) {\n    var sel, handleObj, matches, i,\n      handlerQueue = [],\n      delegateCount = handlers.delegateCount,\n      cur = event.target;\n\n    // Find delegate handlers\n    // Black-hole SVG <use> instance trees (#13180)\n    // Avoid non-left-click bubbling in Firefox (#3861)\n    if ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n      /* jshint eqeqeq: false */\n      for ( ; cur != this; cur = cur.parentNode || this ) {\n        /* jshint eqeqeq: true */\n\n        // Don't check non-elements (#13208)\n        // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n        if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n          matches = [];\n          for ( i = 0; i < delegateCount; i++ ) {\n            handleObj = handlers[ i ];\n\n            // Don't conflict with Object.prototype properties (#13203)\n            sel = handleObj.selector + \" \";\n\n            if ( matches[ sel ] === undefined ) {\n              matches[ sel ] = handleObj.needsContext ?\n                jQuery( sel, this ).index( cur ) >= 0 :\n                jQuery.find( sel, this, null, [ cur ] ).length;\n            }\n            if ( matches[ sel ] ) {\n              matches.push( handleObj );\n            }\n          }\n          if ( matches.length ) {\n            handlerQueue.push({ elem: cur, handlers: matches });\n          }\n        }\n      }\n    }\n\n    // Add the remaining (directly-bound) handlers\n    if ( delegateCount < handlers.length ) {\n      handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n    }\n\n    return handlerQueue;\n  },\n\n  fix: function( event ) {\n    if ( event[ jQuery.expando ] ) {\n      return event;\n    }\n\n    // Create a writable copy of the event object and normalize some properties\n    var i, prop, copy,\n      type = event.type,\n      originalEvent = event,\n      fixHook = this.fixHooks[ type ];\n\n    if ( !fixHook ) {\n      this.fixHooks[ type ] = fixHook =\n        rmouseEvent.test( type ) ? this.mouseHooks :\n        rkeyEvent.test( type ) ? this.keyHooks :\n        {};\n    }\n    copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n    event = new jQuery.Event( originalEvent );\n\n    i = copy.length;\n    while ( i-- ) {\n      prop = copy[ i ];\n      event[ prop ] = originalEvent[ prop ];\n    }\n\n    // Support: IE<9\n    // Fix target property (#1925)\n    if ( !event.target ) {\n      event.target = originalEvent.srcElement || document;\n    }\n\n    // Support: Chrome 23+, Safari?\n    // Target should not be a text node (#504, #13143)\n    if ( event.target.nodeType === 3 ) {\n      event.target = event.target.parentNode;\n    }\n\n    // Support: IE<9\n    // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n    event.metaKey = !!event.metaKey;\n\n    return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n  },\n\n  // Includes some event props shared by KeyEvent and MouseEvent\n  props: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n  fixHooks: {},\n\n  keyHooks: {\n    props: \"char charCode key keyCode\".split(\" \"),\n    filter: function( event, original ) {\n\n      // Add which for key events\n      if ( event.which == null ) {\n        event.which = original.charCode != null ? original.charCode : original.keyCode;\n      }\n\n      return event;\n    }\n  },\n\n  mouseHooks: {\n    props: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n    filter: function( event, original ) {\n      var body, eventDoc, doc,\n        button = original.button,\n        fromElement = original.fromElement;\n\n      // Calculate pageX/Y if missing and clientX/Y available\n      if ( event.pageX == null && original.clientX != null ) {\n        eventDoc = event.target.ownerDocument || document;\n        doc = eventDoc.documentElement;\n        body = eventDoc.body;\n\n        event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n        event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n      }\n\n      // Add relatedTarget, if necessary\n      if ( !event.relatedTarget && fromElement ) {\n        event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n      }\n\n      // Add which for click: 1 === left; 2 === middle; 3 === right\n      // Note: button is not normalized, so don't use it\n      if ( !event.which && button !== undefined ) {\n        event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n      }\n\n      return event;\n    }\n  },\n\n  special: {\n    load: {\n      // Prevent triggered image.load events from bubbling to window.load\n      noBubble: true\n    },\n    focus: {\n      // Fire native event if possible so blur/focus sequence is correct\n      trigger: function() {\n        if ( this !== safeActiveElement() && this.focus ) {\n          try {\n            this.focus();\n            return false;\n          } catch ( e ) {\n            // Support: IE<9\n            // If we error on focus to hidden element (#1486, #12518),\n            // let .trigger() run the handlers\n          }\n        }\n      },\n      delegateType: \"focusin\"\n    },\n    blur: {\n      trigger: function() {\n        if ( this === safeActiveElement() && this.blur ) {\n          this.blur();\n          return false;\n        }\n      },\n      delegateType: \"focusout\"\n    },\n    click: {\n      // For checkbox, fire native event so checked state will be right\n      trigger: function() {\n        if ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n          this.click();\n          return false;\n        }\n      },\n\n      // For cross-browser consistency, don't fire native .click() on links\n      _default: function( event ) {\n        return jQuery.nodeName( event.target, \"a\" );\n      }\n    },\n\n    beforeunload: {\n      postDispatch: function( event ) {\n\n        // Support: Firefox 20+\n        // Firefox doesn't alert if the returnValue field is not set.\n        if ( event.result !== undefined && event.originalEvent ) {\n          event.originalEvent.returnValue = event.result;\n        }\n      }\n    }\n  },\n\n  simulate: function( type, elem, event, bubble ) {\n    // Piggyback on a donor event to simulate a different one.\n    // Fake originalEvent to avoid donor's stopPropagation, but if the\n    // simulated event prevents default then we do the same on the donor.\n    var e = jQuery.extend(\n      new jQuery.Event(),\n      event,\n      {\n        type: type,\n        isSimulated: true,\n        originalEvent: {}\n      }\n    );\n    if ( bubble ) {\n      jQuery.event.trigger( e, null, elem );\n    } else {\n      jQuery.event.dispatch.call( elem, e );\n    }\n    if ( e.isDefaultPrevented() ) {\n      event.preventDefault();\n    }\n  }\n};\n\njQuery.removeEvent = document.removeEventListener ?\n  function( elem, type, handle ) {\n    if ( elem.removeEventListener ) {\n      elem.removeEventListener( type, handle, false );\n    }\n  } :\n  function( elem, type, handle ) {\n    var name = \"on\" + type;\n\n    if ( elem.detachEvent ) {\n\n      // #8545, #7054, preventing memory leaks for custom events in IE6-8\n      // detachEvent needed property on element, by name of that event, to properly expose it to GC\n      if ( typeof elem[ name ] === strundefined ) {\n        elem[ name ] = null;\n      }\n\n      elem.detachEvent( name, handle );\n    }\n  };\n\njQuery.Event = function( src, props ) {\n  // Allow instantiation without the 'new' keyword\n  if ( !(this instanceof jQuery.Event) ) {\n    return new jQuery.Event( src, props );\n  }\n\n  // Event object\n  if ( src && src.type ) {\n    this.originalEvent = src;\n    this.type = src.type;\n\n    // Events bubbling up the document may have been marked as prevented\n    // by a handler lower down the tree; reflect the correct value.\n    this.isDefaultPrevented = src.defaultPrevented ||\n        src.defaultPrevented === undefined &&\n        // Support: IE < 9, Android < 4.0\n        src.returnValue === false ?\n      returnTrue :\n      returnFalse;\n\n  // Event type\n  } else {\n    this.type = src;\n  }\n\n  // Put explicitly provided properties onto the event object\n  if ( props ) {\n    jQuery.extend( this, props );\n  }\n\n  // Create a timestamp if incoming event doesn't have one\n  this.timeStamp = src && src.timeStamp || jQuery.now();\n\n  // Mark it as fixed\n  this[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n  isDefaultPrevented: returnFalse,\n  isPropagationStopped: returnFalse,\n  isImmediatePropagationStopped: returnFalse,\n\n  preventDefault: function() {\n    var e = this.originalEvent;\n\n    this.isDefaultPrevented = returnTrue;\n    if ( !e ) {\n      return;\n    }\n\n    // If preventDefault exists, run it on the original event\n    if ( e.preventDefault ) {\n      e.preventDefault();\n\n    // Support: IE\n    // Otherwise set the returnValue property of the original event to false\n    } else {\n      e.returnValue = false;\n    }\n  },\n  stopPropagation: function() {\n    var e = this.originalEvent;\n\n    this.isPropagationStopped = returnTrue;\n    if ( !e ) {\n      return;\n    }\n    // If stopPropagation exists, run it on the original event\n    if ( e.stopPropagation ) {\n      e.stopPropagation();\n    }\n\n    // Support: IE\n    // Set the cancelBubble property of the original event to true\n    e.cancelBubble = true;\n  },\n  stopImmediatePropagation: function() {\n    var e = this.originalEvent;\n\n    this.isImmediatePropagationStopped = returnTrue;\n\n    if ( e && e.stopImmediatePropagation ) {\n      e.stopImmediatePropagation();\n    }\n\n    this.stopPropagation();\n  }\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n  mouseenter: \"mouseover\",\n  mouseleave: \"mouseout\",\n  pointerenter: \"pointerover\",\n  pointerleave: \"pointerout\"\n}, function( orig, fix ) {\n  jQuery.event.special[ orig ] = {\n    delegateType: fix,\n    bindType: fix,\n\n    handle: function( event ) {\n      var ret,\n        target = this,\n        related = event.relatedTarget,\n        handleObj = event.handleObj;\n\n      // For mousenter/leave call the handler if related is outside the target.\n      // NB: No relatedTarget if the mouse left/entered the browser window\n      if ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n        event.type = handleObj.origType;\n        ret = handleObj.handler.apply( this, arguments );\n        event.type = fix;\n      }\n      return ret;\n    }\n  };\n});\n\n// IE submit delegation\nif ( !support.submitBubbles ) {\n\n  jQuery.event.special.submit = {\n    setup: function() {\n      // Only need this for delegated form submit events\n      if ( jQuery.nodeName( this, \"form\" ) ) {\n        return false;\n      }\n\n      // Lazy-add a submit handler when a descendant form may potentially be submitted\n      jQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n        // Node name check avoids a VML-related crash in IE (#9807)\n        var elem = e.target,\n          form = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n        if ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n          jQuery.event.add( form, \"submit._submit\", function( event ) {\n            event._submit_bubble = true;\n          });\n          jQuery._data( form, \"submitBubbles\", true );\n        }\n      });\n      // return undefined since we don't need an event listener\n    },\n\n    postDispatch: function( event ) {\n      // If form was submitted by the user, bubble the event up the tree\n      if ( event._submit_bubble ) {\n        delete event._submit_bubble;\n        if ( this.parentNode && !event.isTrigger ) {\n          jQuery.event.simulate( \"submit\", this.parentNode, event, true );\n        }\n      }\n    },\n\n    teardown: function() {\n      // Only need this for delegated form submit events\n      if ( jQuery.nodeName( this, \"form\" ) ) {\n        return false;\n      }\n\n      // Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n      jQuery.event.remove( this, \"._submit\" );\n    }\n  };\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !support.changeBubbles ) {\n\n  jQuery.event.special.change = {\n\n    setup: function() {\n\n      if ( rformElems.test( this.nodeName ) ) {\n        // IE doesn't fire change on a check/radio until blur; trigger it on click\n        // after a propertychange. Eat the blur-change in special.change.handle.\n        // This still fires onchange a second time for check/radio after blur.\n        if ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n          jQuery.event.add( this, \"propertychange._change\", function( event ) {\n            if ( event.originalEvent.propertyName === \"checked\" ) {\n              this._just_changed = true;\n            }\n          });\n          jQuery.event.add( this, \"click._change\", function( event ) {\n            if ( this._just_changed && !event.isTrigger ) {\n              this._just_changed = false;\n            }\n            // Allow triggered, simulated change events (#11500)\n            jQuery.event.simulate( \"change\", this, event, true );\n          });\n        }\n        return false;\n      }\n      // Delegated event; lazy-add a change handler on descendant inputs\n      jQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n        var elem = e.target;\n\n        if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n          jQuery.event.add( elem, \"change._change\", function( event ) {\n            if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n              jQuery.event.simulate( \"change\", this.parentNode, event, true );\n            }\n          });\n          jQuery._data( elem, \"changeBubbles\", true );\n        }\n      });\n    },\n\n    handle: function( event ) {\n      var elem = event.target;\n\n      // Swallow native change events from checkbox/radio, we already triggered them above\n      if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n        return event.handleObj.handler.apply( this, arguments );\n      }\n    },\n\n    teardown: function() {\n      jQuery.event.remove( this, \"._change\" );\n\n      return !rformElems.test( this.nodeName );\n    }\n  };\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n  jQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n    // Attach a single capturing handler on the document while someone wants focusin/focusout\n    var handler = function( event ) {\n        jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n      };\n\n    jQuery.event.special[ fix ] = {\n      setup: function() {\n        var doc = this.ownerDocument || this,\n          attaches = jQuery._data( doc, fix );\n\n        if ( !attaches ) {\n          doc.addEventListener( orig, handler, true );\n        }\n        jQuery._data( doc, fix, ( attaches || 0 ) + 1 );\n      },\n      teardown: function() {\n        var doc = this.ownerDocument || this,\n          attaches = jQuery._data( doc, fix ) - 1;\n\n        if ( !attaches ) {\n          doc.removeEventListener( orig, handler, true );\n          jQuery._removeData( doc, fix );\n        } else {\n          jQuery._data( doc, fix, attaches );\n        }\n      }\n    };\n  });\n}\n\njQuery.fn.extend({\n\n  on: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n    var type, origFn;\n\n    // Types can be a map of types/handlers\n    if ( typeof types === \"object\" ) {\n      // ( types-Object, selector, data )\n      if ( typeof selector !== \"string\" ) {\n        // ( types-Object, data )\n        data = data || selector;\n        selector = undefined;\n      }\n      for ( type in types ) {\n        this.on( type, selector, data, types[ type ], one );\n      }\n      return this;\n    }\n\n    if ( data == null && fn == null ) {\n      // ( types, fn )\n      fn = selector;\n      data = selector = undefined;\n    } else if ( fn == null ) {\n      if ( typeof selector === \"string\" ) {\n        // ( types, selector, fn )\n        fn = data;\n        data = undefined;\n      } else {\n        // ( types, data, fn )\n        fn = data;\n        data = selector;\n        selector = undefined;\n      }\n    }\n    if ( fn === false ) {\n      fn = returnFalse;\n    } else if ( !fn ) {\n      return this;\n    }\n\n    if ( one === 1 ) {\n      origFn = fn;\n      fn = function( event ) {\n        // Can use an empty set, since event contains the info\n        jQuery().off( event );\n        return origFn.apply( this, arguments );\n      };\n      // Use same guid so caller can remove using origFn\n      fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n    }\n    return this.each( function() {\n      jQuery.event.add( this, types, fn, data, selector );\n    });\n  },\n  one: function( types, selector, data, fn ) {\n    return this.on( types, selector, data, fn, 1 );\n  },\n  off: function( types, selector, fn ) {\n    var handleObj, type;\n    if ( types && types.preventDefault && types.handleObj ) {\n      // ( event )  dispatched jQuery.Event\n      handleObj = types.handleObj;\n      jQuery( types.delegateTarget ).off(\n        handleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n        handleObj.selector,\n        handleObj.handler\n      );\n      return this;\n    }\n    if ( typeof types === \"object\" ) {\n      // ( types-object [, selector] )\n      for ( type in types ) {\n        this.off( type, selector, types[ type ] );\n      }\n      return this;\n    }\n    if ( selector === false || typeof selector === \"function\" ) {\n      // ( types [, fn] )\n      fn = selector;\n      selector = undefined;\n    }\n    if ( fn === false ) {\n      fn = returnFalse;\n    }\n    return this.each(function() {\n      jQuery.event.remove( this, types, fn, selector );\n    });\n  },\n\n  trigger: function( type, data ) {\n    return this.each(function() {\n      jQuery.event.trigger( type, data, this );\n    });\n  },\n  triggerHandler: function( type, data ) {\n    var elem = this[0];\n    if ( elem ) {\n      return jQuery.event.trigger( type, data, elem, true );\n    }\n  }\n});\n\n\nfunction createSafeFragment( document ) {\n  var list = nodeNames.split( \"|\" ),\n    safeFrag = document.createDocumentFragment();\n\n  if ( safeFrag.createElement ) {\n    while ( list.length ) {\n      safeFrag.createElement(\n        list.pop()\n      );\n    }\n  }\n  return safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n    \"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n  rinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n  rnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n  rleadingWhitespace = /^\\s+/,\n  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n  rtagName = /<([\\w:]+)/,\n  rtbody = /<tbody/i,\n  rhtml = /<|&#?\\w+;/,\n  rnoInnerhtml = /<(?:script|style|link)/i,\n  // checked=\"checked\" or checked\n  rchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n  rscriptType = /^$|\\/(?:java|ecma)script/i,\n  rscriptTypeMasked = /^true\\/(.*)/,\n  rcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n  // We have to close these tags to support XHTML (#13200)\n  wrapMap = {\n    option: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n    legend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n    area: [ 1, \"<map>\", \"</map>\" ],\n    param: [ 1, \"<object>\", \"</object>\" ],\n    thead: [ 1, \"<table>\", \"</table>\" ],\n    tr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n    col: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n    td: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n    // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n    // unless wrapped in a div with non-breaking characters in front of it.\n    _default: support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n  },\n  safeFragment = createSafeFragment( document ),\n  fragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\nfunction getAll( context, tag ) {\n  var elems, elem,\n    i = 0,\n    found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n      typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || \"*\" ) :\n      undefined;\n\n  if ( !found ) {\n    for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n      if ( !tag || jQuery.nodeName( elem, tag ) ) {\n        found.push( elem );\n      } else {\n        jQuery.merge( found, getAll( elem, tag ) );\n      }\n    }\n  }\n\n  return tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n    jQuery.merge( [ context ], found ) :\n    found;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n  if ( rcheckableType.test( elem.type ) ) {\n    elem.defaultChecked = elem.checked;\n  }\n}\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n  return jQuery.nodeName( elem, \"table\" ) &&\n    jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n    elem.getElementsByTagName(\"tbody\")[0] ||\n      elem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n    elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n  elem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n  return elem;\n}\nfunction restoreScript( elem ) {\n  var match = rscriptTypeMasked.exec( elem.type );\n  if ( match ) {\n    elem.type = match[1];\n  } else {\n    elem.removeAttribute(\"type\");\n  }\n  return elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n  var elem,\n    i = 0;\n  for ( ; (elem = elems[i]) != null; i++ ) {\n    jQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n  }\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n  if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n    return;\n  }\n\n  var type, i, l,\n    oldData = jQuery._data( src ),\n    curData = jQuery._data( dest, oldData ),\n    events = oldData.events;\n\n  if ( events ) {\n    delete curData.handle;\n    curData.events = {};\n\n    for ( type in events ) {\n      for ( i = 0, l = events[ type ].length; i < l; i++ ) {\n        jQuery.event.add( dest, type, events[ type ][ i ] );\n      }\n    }\n  }\n\n  // make the cloned public data object a copy from the original\n  if ( curData.data ) {\n    curData.data = jQuery.extend( {}, curData.data );\n  }\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n  var nodeName, e, data;\n\n  // We do not need to do anything for non-Elements\n  if ( dest.nodeType !== 1 ) {\n    return;\n  }\n\n  nodeName = dest.nodeName.toLowerCase();\n\n  // IE6-8 copies events bound via attachEvent when using cloneNode.\n  if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {\n    data = jQuery._data( dest );\n\n    for ( e in data.events ) {\n      jQuery.removeEvent( dest, e, data.handle );\n    }\n\n    // Event data gets referenced instead of copied if the expando gets copied too\n    dest.removeAttribute( jQuery.expando );\n  }\n\n  // IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n  if ( nodeName === \"script\" && dest.text !== src.text ) {\n    disableScript( dest ).text = src.text;\n    restoreScript( dest );\n\n  // IE6-10 improperly clones children of object elements using classid.\n  // IE10 throws NoModificationAllowedError if parent is null, #12132.\n  } else if ( nodeName === \"object\" ) {\n    if ( dest.parentNode ) {\n      dest.outerHTML = src.outerHTML;\n    }\n\n    // This path appears unavoidable for IE9. When cloning an object\n    // element in IE9, the outerHTML strategy above is not sufficient.\n    // If the src has innerHTML and the destination does not,\n    // copy the src.innerHTML into the dest.innerHTML. #10324\n    if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n      dest.innerHTML = src.innerHTML;\n    }\n\n  } else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n    // IE6-8 fails to persist the checked state of a cloned checkbox\n    // or radio button. Worse, IE6-7 fail to give the cloned element\n    // a checked appearance if the defaultChecked value isn't also set\n\n    dest.defaultChecked = dest.checked = src.checked;\n\n    // IE6-7 get confused and end up setting the value of a cloned\n    // checkbox/radio button to an empty string instead of \"on\"\n    if ( dest.value !== src.value ) {\n      dest.value = src.value;\n    }\n\n  // IE6-8 fails to return the selected option to the default selected\n  // state when cloning options\n  } else if ( nodeName === \"option\" ) {\n    dest.defaultSelected = dest.selected = src.defaultSelected;\n\n  // IE6-8 fails to set the defaultValue to the correct value when\n  // cloning other types of input fields\n  } else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n    dest.defaultValue = src.defaultValue;\n  }\n}\n\njQuery.extend({\n  clone: function( elem, dataAndEvents, deepDataAndEvents ) {\n    var destElements, node, clone, i, srcElements,\n      inPage = jQuery.contains( elem.ownerDocument, elem );\n\n    if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n      clone = elem.cloneNode( true );\n\n    // IE<=8 does not properly clone detached, unknown element nodes\n    } else {\n      fragmentDiv.innerHTML = elem.outerHTML;\n      fragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n    }\n\n    if ( (!support.noCloneEvent || !support.noCloneChecked) &&\n        (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n      // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n      destElements = getAll( clone );\n      srcElements = getAll( elem );\n\n      // Fix all IE cloning issues\n      for ( i = 0; (node = srcElements[i]) != null; ++i ) {\n        // Ensure that the destination node is not null; Fixes #9587\n        if ( destElements[i] ) {\n          fixCloneNodeIssues( node, destElements[i] );\n        }\n      }\n    }\n\n    // Copy the events from the original to the clone\n    if ( dataAndEvents ) {\n      if ( deepDataAndEvents ) {\n        srcElements = srcElements || getAll( elem );\n        destElements = destElements || getAll( clone );\n\n        for ( i = 0; (node = srcElements[i]) != null; i++ ) {\n          cloneCopyEvent( node, destElements[i] );\n        }\n      } else {\n        cloneCopyEvent( elem, clone );\n      }\n    }\n\n    // Preserve script evaluation history\n    destElements = getAll( clone, \"script\" );\n    if ( destElements.length > 0 ) {\n      setGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n    }\n\n    destElements = srcElements = node = null;\n\n    // Return the cloned set\n    return clone;\n  },\n\n  buildFragment: function( elems, context, scripts, selection ) {\n    var j, elem, contains,\n      tmp, tag, tbody, wrap,\n      l = elems.length,\n\n      // Ensure a safe fragment\n      safe = createSafeFragment( context ),\n\n      nodes = [],\n      i = 0;\n\n    for ( ; i < l; i++ ) {\n      elem = elems[ i ];\n\n      if ( elem || elem === 0 ) {\n\n        // Add nodes directly\n        if ( jQuery.type( elem ) === \"object\" ) {\n          jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n        // Convert non-html into a text node\n        } else if ( !rhtml.test( elem ) ) {\n          nodes.push( context.createTextNode( elem ) );\n\n        // Convert html into DOM nodes\n        } else {\n          tmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n          // Deserialize a standard representation\n          tag = (rtagName.exec( elem ) || [ \"\", \"\" ])[ 1 ].toLowerCase();\n          wrap = wrapMap[ tag ] || wrapMap._default;\n\n          tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n          // Descend through wrappers to the right content\n          j = wrap[0];\n          while ( j-- ) {\n            tmp = tmp.lastChild;\n          }\n\n          // Manually add leading whitespace removed by IE\n          if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n            nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n          }\n\n          // Remove IE's autoinserted <tbody> from table fragments\n          if ( !support.tbody ) {\n\n            // String was a <table>, *may* have spurious <tbody>\n            elem = tag === \"table\" && !rtbody.test( elem ) ?\n              tmp.firstChild :\n\n              // String was a bare <thead> or <tfoot>\n              wrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n                tmp :\n                0;\n\n            j = elem && elem.childNodes.length;\n            while ( j-- ) {\n              if ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n                elem.removeChild( tbody );\n              }\n            }\n          }\n\n          jQuery.merge( nodes, tmp.childNodes );\n\n          // Fix #12392 for WebKit and IE > 9\n          tmp.textContent = \"\";\n\n          // Fix #12392 for oldIE\n          while ( tmp.firstChild ) {\n            tmp.removeChild( tmp.firstChild );\n          }\n\n          // Remember the top-level container for proper cleanup\n          tmp = safe.lastChild;\n        }\n      }\n    }\n\n    // Fix #11356: Clear elements from fragment\n    if ( tmp ) {\n      safe.removeChild( tmp );\n    }\n\n    // Reset defaultChecked for any radios and checkboxes\n    // about to be appended to the DOM in IE 6/7 (#8060)\n    if ( !support.appendChecked ) {\n      jQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n    }\n\n    i = 0;\n    while ( (elem = nodes[ i++ ]) ) {\n\n      // #4087 - If origin and destination elements are the same, and this is\n      // that element, do not do anything\n      if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n        continue;\n      }\n\n      contains = jQuery.contains( elem.ownerDocument, elem );\n\n      // Append to fragment\n      tmp = getAll( safe.appendChild( elem ), \"script\" );\n\n      // Preserve script evaluation history\n      if ( contains ) {\n        setGlobalEval( tmp );\n      }\n\n      // Capture executables\n      if ( scripts ) {\n        j = 0;\n        while ( (elem = tmp[ j++ ]) ) {\n          if ( rscriptType.test( elem.type || \"\" ) ) {\n            scripts.push( elem );\n          }\n        }\n      }\n    }\n\n    tmp = null;\n\n    return safe;\n  },\n\n  cleanData: function( elems, /* internal */ acceptData ) {\n    var elem, type, id, data,\n      i = 0,\n      internalKey = jQuery.expando,\n      cache = jQuery.cache,\n      deleteExpando = support.deleteExpando,\n      special = jQuery.event.special;\n\n    for ( ; (elem = elems[i]) != null; i++ ) {\n      if ( acceptData || jQuery.acceptData( elem ) ) {\n\n        id = elem[ internalKey ];\n        data = id && cache[ id ];\n\n        if ( data ) {\n          if ( data.events ) {\n            for ( type in data.events ) {\n              if ( special[ type ] ) {\n                jQuery.event.remove( elem, type );\n\n              // This is a shortcut to avoid jQuery.event.remove's overhead\n              } else {\n                jQuery.removeEvent( elem, type, data.handle );\n              }\n            }\n          }\n\n          // Remove cache only if it was not already removed by jQuery.event.remove\n          if ( cache[ id ] ) {\n\n            delete cache[ id ];\n\n            // IE does not allow us to delete expando properties from nodes,\n            // nor does it have a removeAttribute function on Document nodes;\n            // we must handle all of these cases\n            if ( deleteExpando ) {\n              delete elem[ internalKey ];\n\n            } else if ( typeof elem.removeAttribute !== strundefined ) {\n              elem.removeAttribute( internalKey );\n\n            } else {\n              elem[ internalKey ] = null;\n            }\n\n            deletedIds.push( id );\n          }\n        }\n      }\n    }\n  }\n});\n\njQuery.fn.extend({\n  text: function( value ) {\n    return access( this, function( value ) {\n      return value === undefined ?\n        jQuery.text( this ) :\n        this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n    }, null, value, arguments.length );\n  },\n\n  append: function() {\n    return this.domManip( arguments, function( elem ) {\n      if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n        var target = manipulationTarget( this, elem );\n        target.appendChild( elem );\n      }\n    });\n  },\n\n  prepend: function() {\n    return this.domManip( arguments, function( elem ) {\n      if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n        var target = manipulationTarget( this, elem );\n        target.insertBefore( elem, target.firstChild );\n      }\n    });\n  },\n\n  before: function() {\n    return this.domManip( arguments, function( elem ) {\n      if ( this.parentNode ) {\n        this.parentNode.insertBefore( elem, this );\n      }\n    });\n  },\n\n  after: function() {\n    return this.domManip( arguments, function( elem ) {\n      if ( this.parentNode ) {\n        this.parentNode.insertBefore( elem, this.nextSibling );\n      }\n    });\n  },\n\n  remove: function( selector, keepData /* Internal Use Only */ ) {\n    var elem,\n      elems = selector ? jQuery.filter( selector, this ) : this,\n      i = 0;\n\n    for ( ; (elem = elems[i]) != null; i++ ) {\n\n      if ( !keepData && elem.nodeType === 1 ) {\n        jQuery.cleanData( getAll( elem ) );\n      }\n\n      if ( elem.parentNode ) {\n        if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n          setGlobalEval( getAll( elem, \"script\" ) );\n        }\n        elem.parentNode.removeChild( elem );\n      }\n    }\n\n    return this;\n  },\n\n  empty: function() {\n    var elem,\n      i = 0;\n\n    for ( ; (elem = this[i]) != null; i++ ) {\n      // Remove element nodes and prevent memory leaks\n      if ( elem.nodeType === 1 ) {\n        jQuery.cleanData( getAll( elem, false ) );\n      }\n\n      // Remove any remaining nodes\n      while ( elem.firstChild ) {\n        elem.removeChild( elem.firstChild );\n      }\n\n      // If this is a select, ensure that it displays empty (#12336)\n      // Support: IE<9\n      if ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n        elem.options.length = 0;\n      }\n    }\n\n    return this;\n  },\n\n  clone: function( dataAndEvents, deepDataAndEvents ) {\n    dataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n    deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n    return this.map(function() {\n      return jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n    });\n  },\n\n  html: function( value ) {\n    return access( this, function( value ) {\n      var elem = this[ 0 ] || {},\n        i = 0,\n        l = this.length;\n\n      if ( value === undefined ) {\n        return elem.nodeType === 1 ?\n          elem.innerHTML.replace( rinlinejQuery, \"\" ) :\n          undefined;\n      }\n\n      // See if we can take a shortcut and just use innerHTML\n      if ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n        ( support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n        ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n        !wrapMap[ (rtagName.exec( value ) || [ \"\", \"\" ])[ 1 ].toLowerCase() ] ) {\n\n        value = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n        try {\n          for (; i < l; i++ ) {\n            // Remove element nodes and prevent memory leaks\n            elem = this[i] || {};\n            if ( elem.nodeType === 1 ) {\n              jQuery.cleanData( getAll( elem, false ) );\n              elem.innerHTML = value;\n            }\n          }\n\n          elem = 0;\n\n        // If using innerHTML throws an exception, use the fallback method\n        } catch(e) {}\n      }\n\n      if ( elem ) {\n        this.empty().append( value );\n      }\n    }, null, value, arguments.length );\n  },\n\n  replaceWith: function() {\n    var arg = arguments[ 0 ];\n\n    // Make the changes, replacing each context element with the new content\n    this.domManip( arguments, function( elem ) {\n      arg = this.parentNode;\n\n      jQuery.cleanData( getAll( this ) );\n\n      if ( arg ) {\n        arg.replaceChild( elem, this );\n      }\n    });\n\n    // Force removal if there was no new content (e.g., from empty arguments)\n    return arg && (arg.length || arg.nodeType) ? this : this.remove();\n  },\n\n  detach: function( selector ) {\n    return this.remove( selector, true );\n  },\n\n  domManip: function( args, callback ) {\n\n    // Flatten any nested arrays\n    args = concat.apply( [], args );\n\n    var first, node, hasScripts,\n      scripts, doc, fragment,\n      i = 0,\n      l = this.length,\n      set = this,\n      iNoClone = l - 1,\n      value = args[0],\n      isFunction = jQuery.isFunction( value );\n\n    // We can't cloneNode fragments that contain checked, in WebKit\n    if ( isFunction ||\n        ( l > 1 && typeof value === \"string\" &&\n          !support.checkClone && rchecked.test( value ) ) ) {\n      return this.each(function( index ) {\n        var self = set.eq( index );\n        if ( isFunction ) {\n          args[0] = value.call( this, index, self.html() );\n        }\n        self.domManip( args, callback );\n      });\n    }\n\n    if ( l ) {\n      fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n      first = fragment.firstChild;\n\n      if ( fragment.childNodes.length === 1 ) {\n        fragment = first;\n      }\n\n      if ( first ) {\n        scripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n        hasScripts = scripts.length;\n\n        // Use the original fragment for the last item instead of the first because it can end up\n        // being emptied incorrectly in certain situations (#8070).\n        for ( ; i < l; i++ ) {\n          node = fragment;\n\n          if ( i !== iNoClone ) {\n            node = jQuery.clone( node, true, true );\n\n            // Keep references to cloned scripts for later restoration\n            if ( hasScripts ) {\n              jQuery.merge( scripts, getAll( node, \"script\" ) );\n            }\n          }\n\n          callback.call( this[i], node, i );\n        }\n\n        if ( hasScripts ) {\n          doc = scripts[ scripts.length - 1 ].ownerDocument;\n\n          // Reenable scripts\n          jQuery.map( scripts, restoreScript );\n\n          // Evaluate executable scripts on first document insertion\n          for ( i = 0; i < hasScripts; i++ ) {\n            node = scripts[ i ];\n            if ( rscriptType.test( node.type || \"\" ) &&\n              !jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n              if ( node.src ) {\n                // Optional AJAX dependency, but won't run scripts if not present\n                if ( jQuery._evalUrl ) {\n                  jQuery._evalUrl( node.src );\n                }\n              } else {\n                jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n              }\n            }\n          }\n        }\n\n        // Fix #11809: Avoid leaking memory\n        fragment = first = null;\n      }\n    }\n\n    return this;\n  }\n});\n\njQuery.each({\n  appendTo: \"append\",\n  prependTo: \"prepend\",\n  insertBefore: \"before\",\n  insertAfter: \"after\",\n  replaceAll: \"replaceWith\"\n}, function( name, original ) {\n  jQuery.fn[ name ] = function( selector ) {\n    var elems,\n      i = 0,\n      ret = [],\n      insert = jQuery( selector ),\n      last = insert.length - 1;\n\n    for ( ; i <= last; i++ ) {\n      elems = i === last ? this : this.clone(true);\n      jQuery( insert[i] )[ original ]( elems );\n\n      // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n      push.apply( ret, elems.get() );\n    }\n\n    return this.pushStack( ret );\n  };\n});\n\n\nvar iframe,\n  elemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n  var style,\n    elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n    // getDefaultComputedStyle might be reliably used only on attached element\n    display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n      // Use of this method is a temporary fix (more like optmization) until something better comes along,\n      // since it was removed from specification and supported only in FF\n      style.display : jQuery.css( elem[ 0 ], \"display\" );\n\n  // We don't have any data stored on the element,\n  // so use \"detach\" method as fast way to get rid of the element\n  elem.detach();\n\n  return display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n  var doc = document,\n    display = elemdisplay[ nodeName ];\n\n  if ( !display ) {\n    display = actualDisplay( nodeName, doc );\n\n    // If the simple way fails, read from inside an iframe\n    if ( display === \"none\" || !display ) {\n\n      // Use the already-created iframe if possible\n      iframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n      // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n      doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;\n\n      // Support: IE\n      doc.write();\n      doc.close();\n\n      display = actualDisplay( nodeName, doc );\n      iframe.detach();\n    }\n\n    // Store the correct default display\n    elemdisplay[ nodeName ] = display;\n  }\n\n  return display;\n}\n\n\n(function() {\n  var shrinkWrapBlocksVal;\n\n  support.shrinkWrapBlocks = function() {\n    if ( shrinkWrapBlocksVal != null ) {\n      return shrinkWrapBlocksVal;\n    }\n\n    // Will be changed later if needed.\n    shrinkWrapBlocksVal = false;\n\n    // Minified: var b,c,d\n    var div, body, container;\n\n    body = document.getElementsByTagName( \"body\" )[ 0 ];\n    if ( !body || !body.style ) {\n      // Test fired too early or in an unsupported environment, exit.\n      return;\n    }\n\n    // Setup\n    div = document.createElement( \"div\" );\n    container = document.createElement( \"div\" );\n    container.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n    body.appendChild( container ).appendChild( div );\n\n    // Support: IE6\n    // Check if elements with layout shrink-wrap their children\n    if ( typeof div.style.zoom !== strundefined ) {\n      // Reset CSS: box-sizing; display; margin; border\n      div.style.cssText =\n        // Support: Firefox<29, Android 2.3\n        // Vendor-prefix box-sizing\n        \"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n        \"box-sizing:content-box;display:block;margin:0;border:0;\" +\n        \"padding:1px;width:1px;zoom:1\";\n      div.appendChild( document.createElement( \"div\" ) ).style.width = \"5px\";\n      shrinkWrapBlocksVal = div.offsetWidth !== 3;\n    }\n\n    body.removeChild( container );\n\n    return shrinkWrapBlocksVal;\n  };\n\n})();\nvar rmargin = (/^margin/);\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\n\n\nvar getStyles, curCSS,\n  rposition = /^(top|right|bottom|left)$/;\n\nif ( window.getComputedStyle ) {\n  getStyles = function( elem ) {\n    return elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n  };\n\n  curCSS = function( elem, name, computed ) {\n    var width, minWidth, maxWidth, ret,\n      style = elem.style;\n\n    computed = computed || getStyles( elem );\n\n    // getPropertyValue is only needed for .css('filter') in IE9, see #12537\n    ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\n\n    if ( computed ) {\n\n      if ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n        ret = jQuery.style( elem, name );\n      }\n\n      // A tribute to the \"awesome hack by Dean Edwards\"\n      // Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n      // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n      // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n      if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n        // Remember the original values\n        width = style.width;\n        minWidth = style.minWidth;\n        maxWidth = style.maxWidth;\n\n        // Put in the new values to get a computed value out\n        style.minWidth = style.maxWidth = style.width = ret;\n        ret = computed.width;\n\n        // Revert the changed values\n        style.width = width;\n        style.minWidth = minWidth;\n        style.maxWidth = maxWidth;\n      }\n    }\n\n    // Support: IE\n    // IE returns zIndex value as an integer.\n    return ret === undefined ?\n      ret :\n      ret + \"\";\n  };\n} else if ( document.documentElement.currentStyle ) {\n  getStyles = function( elem ) {\n    return elem.currentStyle;\n  };\n\n  curCSS = function( elem, name, computed ) {\n    var left, rs, rsLeft, ret,\n      style = elem.style;\n\n    computed = computed || getStyles( elem );\n    ret = computed ? computed[ name ] : undefined;\n\n    // Avoid setting ret to empty string here\n    // so we don't default to auto\n    if ( ret == null && style && style[ name ] ) {\n      ret = style[ name ];\n    }\n\n    // From the awesome hack by Dean Edwards\n    // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n    // If we're not dealing with a regular pixel number\n    // but a number that has a weird ending, we need to convert it to pixels\n    // but not position css attributes, as those are proportional to the parent element instead\n    // and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n    if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n      // Remember the original values\n      left = style.left;\n      rs = elem.runtimeStyle;\n      rsLeft = rs && rs.left;\n\n      // Put in the new values to get a computed value out\n      if ( rsLeft ) {\n        rs.left = elem.currentStyle.left;\n      }\n      style.left = name === \"fontSize\" ? \"1em\" : ret;\n      ret = style.pixelLeft + \"px\";\n\n      // Revert the changed values\n      style.left = left;\n      if ( rsLeft ) {\n        rs.left = rsLeft;\n      }\n    }\n\n    // Support: IE\n    // IE returns zIndex value as an integer.\n    return ret === undefined ?\n      ret :\n      ret + \"\" || \"auto\";\n  };\n}\n\n\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n  // Define the hook, we'll check on the first run if it's really needed.\n  return {\n    get: function() {\n      var condition = conditionFn();\n\n      if ( condition == null ) {\n        // The test was not ready at this point; screw the hook this time\n        // but check again when needed next time.\n        return;\n      }\n\n      if ( condition ) {\n        // Hook not needed (or it's not possible to use it due to missing dependency),\n        // remove it.\n        // Since there are no other hooks for marginRight, remove the whole object.\n        delete this.get;\n        return;\n      }\n\n      // Hook needed; redefine it so that the support test is not executed again.\n\n      return (this.get = hookFn).apply( this, arguments );\n    }\n  };\n}\n\n\n(function() {\n  // Minified: var b,c,d,e,f,g, h,i\n  var div, style, a, pixelPositionVal, boxSizingReliableVal,\n    reliableHiddenOffsetsVal, reliableMarginRightVal;\n\n  // Setup\n  div = document.createElement( \"div\" );\n  div.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n  a = div.getElementsByTagName( \"a\" )[ 0 ];\n  style = a && a.style;\n\n  // Finish early in limited (non-browser) environments\n  if ( !style ) {\n    return;\n  }\n\n  style.cssText = \"float:left;opacity:.5\";\n\n  // Support: IE<9\n  // Make sure that element opacity exists (as opposed to filter)\n  support.opacity = style.opacity === \"0.5\";\n\n  // Verify style float existence\n  // (IE uses styleFloat instead of cssFloat)\n  support.cssFloat = !!style.cssFloat;\n\n  div.style.backgroundClip = \"content-box\";\n  div.cloneNode( true ).style.backgroundClip = \"\";\n  support.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n  // Support: Firefox<29, Android 2.3\n  // Vendor-prefix box-sizing\n  support.boxSizing = style.boxSizing === \"\" || style.MozBoxSizing === \"\" ||\n    style.WebkitBoxSizing === \"\";\n\n  jQuery.extend(support, {\n    reliableHiddenOffsets: function() {\n      if ( reliableHiddenOffsetsVal == null ) {\n        computeStyleTests();\n      }\n      return reliableHiddenOffsetsVal;\n    },\n\n    boxSizingReliable: function() {\n      if ( boxSizingReliableVal == null ) {\n        computeStyleTests();\n      }\n      return boxSizingReliableVal;\n    },\n\n    pixelPosition: function() {\n      if ( pixelPositionVal == null ) {\n        computeStyleTests();\n      }\n      return pixelPositionVal;\n    },\n\n    // Support: Android 2.3\n    reliableMarginRight: function() {\n      if ( reliableMarginRightVal == null ) {\n        computeStyleTests();\n      }\n      return reliableMarginRightVal;\n    }\n  });\n\n  function computeStyleTests() {\n    // Minified: var b,c,d,j\n    var div, body, container, contents;\n\n    body = document.getElementsByTagName( \"body\" )[ 0 ];\n    if ( !body || !body.style ) {\n      // Test fired too early or in an unsupported environment, exit.\n      return;\n    }\n\n    // Setup\n    div = document.createElement( \"div\" );\n    container = document.createElement( \"div\" );\n    container.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n    body.appendChild( container ).appendChild( div );\n\n    div.style.cssText =\n      // Support: Firefox<29, Android 2.3\n      // Vendor-prefix box-sizing\n      \"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n      \"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n      \"border:1px;padding:1px;width:4px;position:absolute\";\n\n    // Support: IE<9\n    // Assume reasonable values in the absence of getComputedStyle\n    pixelPositionVal = boxSizingReliableVal = false;\n    reliableMarginRightVal = true;\n\n    // Check for getComputedStyle so that this code is not run in IE<9.\n    if ( window.getComputedStyle ) {\n      pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n      boxSizingReliableVal =\n        ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n      // Support: Android 2.3\n      // Div with explicit width and no margin-right incorrectly\n      // gets computed margin-right based on width of container (#3333)\n      // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n      contents = div.appendChild( document.createElement( \"div\" ) );\n\n      // Reset CSS: box-sizing; display; margin; border; padding\n      contents.style.cssText = div.style.cssText =\n        // Support: Firefox<29, Android 2.3\n        // Vendor-prefix box-sizing\n        \"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n        \"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n      contents.style.marginRight = contents.style.width = \"0\";\n      div.style.width = \"1px\";\n\n      reliableMarginRightVal =\n        !parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );\n    }\n\n    // Support: IE8\n    // Check if table cells still have offsetWidth/Height when they are set\n    // to display:none and there are still other visible table cells in a\n    // table row; if so, offsetWidth/Height are not reliable for use when\n    // determining if an element has been hidden directly using\n    // display:none (it is still safe to use offsets if a parent element is\n    // hidden; don safety goggles and see bug #4512 for more information).\n    div.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n    contents = div.getElementsByTagName( \"td\" );\n    contents[ 0 ].style.cssText = \"margin:0;border:0;padding:0;display:none\";\n    reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n    if ( reliableHiddenOffsetsVal ) {\n      contents[ 0 ].style.display = \"\";\n      contents[ 1 ].style.display = \"none\";\n      reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n    }\n\n    body.removeChild( container );\n  }\n\n})();\n\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n  var ret, name,\n    old = {};\n\n  // Remember the old values, and insert the new ones\n  for ( name in options ) {\n    old[ name ] = elem.style[ name ];\n    elem.style[ name ] = options[ name ];\n  }\n\n  ret = callback.apply( elem, args || [] );\n\n  // Revert the old values\n  for ( name in options ) {\n    elem.style[ name ] = old[ name ];\n  }\n\n  return ret;\n};\n\n\nvar\n    ralpha = /alpha\\([^)]*\\)/i,\n  ropacity = /opacity\\s*=\\s*([^)]*)/,\n\n  // swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n  // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n  rdisplayswap = /^(none|table(?!-c[ea]).+)/,\n  rnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n  rrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n  cssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n  cssNormalTransform = {\n    letterSpacing: \"0\",\n    fontWeight: \"400\"\n  },\n\n  cssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n  // shortcut for names that are not vendor prefixed\n  if ( name in style ) {\n    return name;\n  }\n\n  // check for vendor prefixed names\n  var capName = name.charAt(0).toUpperCase() + name.slice(1),\n    origName = name,\n    i = cssPrefixes.length;\n\n  while ( i-- ) {\n    name = cssPrefixes[ i ] + capName;\n    if ( name in style ) {\n      return name;\n    }\n  }\n\n  return origName;\n}\n\nfunction showHide( elements, show ) {\n  var display, elem, hidden,\n    values = [],\n    index = 0,\n    length = elements.length;\n\n  for ( ; index < length; index++ ) {\n    elem = elements[ index ];\n    if ( !elem.style ) {\n      continue;\n    }\n\n    values[ index ] = jQuery._data( elem, \"olddisplay\" );\n    display = elem.style.display;\n    if ( show ) {\n      // Reset the inline display of this element to learn if it is\n      // being hidden by cascaded rules or not\n      if ( !values[ index ] && display === \"none\" ) {\n        elem.style.display = \"\";\n      }\n\n      // Set elements which have been overridden with display: none\n      // in a stylesheet to whatever the default browser style is\n      // for such an element\n      if ( elem.style.display === \"\" && isHidden( elem ) ) {\n        values[ index ] = jQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n      }\n    } else {\n      hidden = isHidden( elem );\n\n      if ( display && display !== \"none\" || !hidden ) {\n        jQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n      }\n    }\n  }\n\n  // Set the display of most of the elements in a second loop\n  // to avoid the constant reflow\n  for ( index = 0; index < length; index++ ) {\n    elem = elements[ index ];\n    if ( !elem.style ) {\n      continue;\n    }\n    if ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n      elem.style.display = show ? values[ index ] || \"\" : \"none\";\n    }\n  }\n\n  return elements;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n  var matches = rnumsplit.exec( value );\n  return matches ?\n    // Guard against undefined \"subtract\", e.g., when used as in cssHooks\n    Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n    value;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n  var i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n    // If we already have the right measurement, avoid augmentation\n    4 :\n    // Otherwise initialize for horizontal or vertical properties\n    name === \"width\" ? 1 : 0,\n\n    val = 0;\n\n  for ( ; i < 4; i += 2 ) {\n    // both box models exclude margin, so add it if we want it\n    if ( extra === \"margin\" ) {\n      val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n    }\n\n    if ( isBorderBox ) {\n      // border-box includes padding, so remove it if we want content\n      if ( extra === \"content\" ) {\n        val -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n      }\n\n      // at this point, extra isn't border nor margin, so remove border\n      if ( extra !== \"margin\" ) {\n        val -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n      }\n    } else {\n      // at this point, extra isn't content, so add padding\n      val += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n      // at this point, extra isn't content nor padding, so add border\n      if ( extra !== \"padding\" ) {\n        val += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n      }\n    }\n  }\n\n  return val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n  // Start with offset property, which is equivalent to the border-box value\n  var valueIsBorderBox = true,\n    val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n    styles = getStyles( elem ),\n    isBorderBox = support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n  // some non-html elements return undefined for offsetWidth, so check for null/undefined\n  // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n  // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n  if ( val <= 0 || val == null ) {\n    // Fall back to computed then uncomputed css if necessary\n    val = curCSS( elem, name, styles );\n    if ( val < 0 || val == null ) {\n      val = elem.style[ name ];\n    }\n\n    // Computed unit is not pixels. Stop here and return.\n    if ( rnumnonpx.test(val) ) {\n      return val;\n    }\n\n    // we need the check for style in case a browser which returns unreliable values\n    // for getComputedStyle silently falls back to the reliable elem.style\n    valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );\n\n    // Normalize \"\", auto, and prepare for extra\n    val = parseFloat( val ) || 0;\n  }\n\n  // use the active box-sizing model to add/subtract irrelevant styles\n  return ( val +\n    augmentWidthOrHeight(\n      elem,\n      name,\n      extra || ( isBorderBox ? \"border\" : \"content\" ),\n      valueIsBorderBox,\n      styles\n    )\n  ) + \"px\";\n}\n\njQuery.extend({\n  // Add in style property hooks for overriding the default\n  // behavior of getting and setting a style property\n  cssHooks: {\n    opacity: {\n      get: function( elem, computed ) {\n        if ( computed ) {\n          // We should always get a number back from opacity\n          var ret = curCSS( elem, \"opacity\" );\n          return ret === \"\" ? \"1\" : ret;\n        }\n      }\n    }\n  },\n\n  // Don't automatically add \"px\" to these possibly-unitless properties\n  cssNumber: {\n    \"columnCount\": true,\n    \"fillOpacity\": true,\n    \"flexGrow\": true,\n    \"flexShrink\": true,\n    \"fontWeight\": true,\n    \"lineHeight\": true,\n    \"opacity\": true,\n    \"order\": true,\n    \"orphans\": true,\n    \"widows\": true,\n    \"zIndex\": true,\n    \"zoom\": true\n  },\n\n  // Add in properties whose names you wish to fix before\n  // setting or getting the value\n  cssProps: {\n    // normalize float css property\n    \"float\": support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n  },\n\n  // Get and set the style property on a DOM Node\n  style: function( elem, name, value, extra ) {\n    // Don't set styles on text and comment nodes\n    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n      return;\n    }\n\n    // Make sure that we're working with the right name\n    var ret, type, hooks,\n      origName = jQuery.camelCase( name ),\n      style = elem.style;\n\n    name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n    // gets hook for the prefixed version\n    // followed by the unprefixed version\n    hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n    // Check if we're setting a value\n    if ( value !== undefined ) {\n      type = typeof value;\n\n      // convert relative number strings (+= or -=) to relative numbers. #7345\n      if ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n        value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n        // Fixes bug #9237\n        type = \"number\";\n      }\n\n      // Make sure that null and NaN values aren't set. See: #7116\n      if ( value == null || value !== value ) {\n        return;\n      }\n\n      // If a number was passed in, add 'px' to the (except for certain CSS properties)\n      if ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n        value += \"px\";\n      }\n\n      // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n      // but it would mean to define eight (for every problematic property) identical functions\n      if ( !support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n        style[ name ] = \"inherit\";\n      }\n\n      // If a hook was provided, use that value, otherwise just set the specified value\n      if ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n        // Support: IE\n        // Swallow errors from 'invalid' CSS values (#5509)\n        try {\n          style[ name ] = value;\n        } catch(e) {}\n      }\n\n    } else {\n      // If a hook was provided get the non-computed value from there\n      if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n        return ret;\n      }\n\n      // Otherwise just get the value from the style object\n      return style[ name ];\n    }\n  },\n\n  css: function( elem, name, extra, styles ) {\n    var num, val, hooks,\n      origName = jQuery.camelCase( name );\n\n    // Make sure that we're working with the right name\n    name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n    // gets hook for the prefixed version\n    // followed by the unprefixed version\n    hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n    // If a hook was provided get the computed value from there\n    if ( hooks && \"get\" in hooks ) {\n      val = hooks.get( elem, true, extra );\n    }\n\n    // Otherwise, if a way to get the computed value exists, use that\n    if ( val === undefined ) {\n      val = curCSS( elem, name, styles );\n    }\n\n    //convert \"normal\" to computed value\n    if ( val === \"normal\" && name in cssNormalTransform ) {\n      val = cssNormalTransform[ name ];\n    }\n\n    // Return, converting to number if forced or a qualifier was provided and val looks numeric\n    if ( extra === \"\" || extra ) {\n      num = parseFloat( val );\n      return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n    }\n    return val;\n  }\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n  jQuery.cssHooks[ name ] = {\n    get: function( elem, computed, extra ) {\n      if ( computed ) {\n        // certain elements can have dimension info if we invisibly show them\n        // however, it must have a current display style that would benefit from this\n        return rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n          jQuery.swap( elem, cssShow, function() {\n            return getWidthOrHeight( elem, name, extra );\n          }) :\n          getWidthOrHeight( elem, name, extra );\n      }\n    },\n\n    set: function( elem, value, extra ) {\n      var styles = extra && getStyles( elem );\n      return setPositiveNumber( elem, value, extra ?\n        augmentWidthOrHeight(\n          elem,\n          name,\n          extra,\n          support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n          styles\n        ) : 0\n      );\n    }\n  };\n});\n\nif ( !support.opacity ) {\n  jQuery.cssHooks.opacity = {\n    get: function( elem, computed ) {\n      // IE uses filters for opacity\n      return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n        ( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n        computed ? \"1\" : \"\";\n    },\n\n    set: function( elem, value ) {\n      var style = elem.style,\n        currentStyle = elem.currentStyle,\n        opacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n        filter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n      // IE has trouble with opacity if it does not have layout\n      // Force it by setting the zoom level\n      style.zoom = 1;\n\n      // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n      // if value === \"\", then remove inline opacity #12685\n      if ( ( value >= 1 || value === \"\" ) &&\n          jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n          style.removeAttribute ) {\n\n        // Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n        // if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n        // style.removeAttribute is IE Only, but so apparently is this code path...\n        style.removeAttribute( \"filter\" );\n\n        // if there is no filter style applied in a css rule or unset inline opacity, we are done\n        if ( value === \"\" || currentStyle && !currentStyle.filter ) {\n          return;\n        }\n      }\n\n      // otherwise, set new filter values\n      style.filter = ralpha.test( filter ) ?\n        filter.replace( ralpha, opacity ) :\n        filter + \" \" + opacity;\n    }\n  };\n}\n\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n  function( elem, computed ) {\n    if ( computed ) {\n      // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n      // Work around by temporarily setting element display to inline-block\n      return jQuery.swap( elem, { \"display\": \"inline-block\" },\n        curCSS, [ elem, \"marginRight\" ] );\n    }\n  }\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n  margin: \"\",\n  padding: \"\",\n  border: \"Width\"\n}, function( prefix, suffix ) {\n  jQuery.cssHooks[ prefix + suffix ] = {\n    expand: function( value ) {\n      var i = 0,\n        expanded = {},\n\n        // assumes a single number if not a string\n        parts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n      for ( ; i < 4; i++ ) {\n        expanded[ prefix + cssExpand[ i ] + suffix ] =\n          parts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n      }\n\n      return expanded;\n    }\n  };\n\n  if ( !rmargin.test( prefix ) ) {\n    jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n  }\n});\n\njQuery.fn.extend({\n  css: function( name, value ) {\n    return access( this, function( elem, name, value ) {\n      var styles, len,\n        map = {},\n        i = 0;\n\n      if ( jQuery.isArray( name ) ) {\n        styles = getStyles( elem );\n        len = name.length;\n\n        for ( ; i < len; i++ ) {\n          map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n        }\n\n        return map;\n      }\n\n      return value !== undefined ?\n        jQuery.style( elem, name, value ) :\n        jQuery.css( elem, name );\n    }, name, value, arguments.length > 1 );\n  },\n  show: function() {\n    return showHide( this, true );\n  },\n  hide: function() {\n    return showHide( this );\n  },\n  toggle: function( state ) {\n    if ( typeof state === \"boolean\" ) {\n      return state ? this.show() : this.hide();\n    }\n\n    return this.each(function() {\n      if ( isHidden( this ) ) {\n        jQuery( this ).show();\n      } else {\n        jQuery( this ).hide();\n      }\n    });\n  }\n});\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n  return new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n  constructor: Tween,\n  init: function( elem, options, prop, end, easing, unit ) {\n    this.elem = elem;\n    this.prop = prop;\n    this.easing = easing || \"swing\";\n    this.options = options;\n    this.start = this.now = this.cur();\n    this.end = end;\n    this.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n  },\n  cur: function() {\n    var hooks = Tween.propHooks[ this.prop ];\n\n    return hooks && hooks.get ?\n      hooks.get( this ) :\n      Tween.propHooks._default.get( this );\n  },\n  run: function( percent ) {\n    var eased,\n      hooks = Tween.propHooks[ this.prop ];\n\n    if ( this.options.duration ) {\n      this.pos = eased = jQuery.easing[ this.easing ](\n        percent, this.options.duration * percent, 0, 1, this.options.duration\n      );\n    } else {\n      this.pos = eased = percent;\n    }\n    this.now = ( this.end - this.start ) * eased + this.start;\n\n    if ( this.options.step ) {\n      this.options.step.call( this.elem, this.now, this );\n    }\n\n    if ( hooks && hooks.set ) {\n      hooks.set( this );\n    } else {\n      Tween.propHooks._default.set( this );\n    }\n    return this;\n  }\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n  _default: {\n    get: function( tween ) {\n      var result;\n\n      if ( tween.elem[ tween.prop ] != null &&\n        (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n        return tween.elem[ tween.prop ];\n      }\n\n      // passing an empty string as a 3rd parameter to .css will automatically\n      // attempt a parseFloat and fallback to a string if the parse fails\n      // so, simple values such as \"10px\" are parsed to Float.\n      // complex values such as \"rotate(1rad)\" are returned as is.\n      result = jQuery.css( tween.elem, tween.prop, \"\" );\n      // Empty strings, null, undefined and \"auto\" are converted to 0.\n      return !result || result === \"auto\" ? 0 : result;\n    },\n    set: function( tween ) {\n      // use step hook for back compat - use cssHook if its there - use .style if its\n      // available and use plain properties where available\n      if ( jQuery.fx.step[ tween.prop ] ) {\n        jQuery.fx.step[ tween.prop ]( tween );\n      } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n        jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n      } else {\n        tween.elem[ tween.prop ] = tween.now;\n      }\n    }\n  }\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n  set: function( tween ) {\n    if ( tween.elem.nodeType && tween.elem.parentNode ) {\n      tween.elem[ tween.prop ] = tween.now;\n    }\n  }\n};\n\njQuery.easing = {\n  linear: function( p ) {\n    return p;\n  },\n  swing: function( p ) {\n    return 0.5 - Math.cos( p * Math.PI ) / 2;\n  }\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n  fxNow, timerId,\n  rfxtypes = /^(?:toggle|show|hide)$/,\n  rfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n  rrun = /queueHooks$/,\n  animationPrefilters = [ defaultPrefilter ],\n  tweeners = {\n    \"*\": [ function( prop, value ) {\n      var tween = this.createTween( prop, value ),\n        target = tween.cur(),\n        parts = rfxnum.exec( value ),\n        unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n        // Starting value computation is required for potential unit mismatches\n        start = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n          rfxnum.exec( jQuery.css( tween.elem, prop ) ),\n        scale = 1,\n        maxIterations = 20;\n\n      if ( start && start[ 3 ] !== unit ) {\n        // Trust units reported by jQuery.css\n        unit = unit || start[ 3 ];\n\n        // Make sure we update the tween properties later on\n        parts = parts || [];\n\n        // Iteratively approximate from a nonzero starting point\n        start = +target || 1;\n\n        do {\n          // If previous iteration zeroed out, double until we get *something*\n          // Use a string for doubling factor so we don't accidentally see scale as unchanged below\n          scale = scale || \".5\";\n\n          // Adjust and apply\n          start = start / scale;\n          jQuery.style( tween.elem, prop, start + unit );\n\n        // Update scale, tolerating zero or NaN from tween.cur()\n        // And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n        } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n      }\n\n      // Update tween properties\n      if ( parts ) {\n        start = tween.start = +start || +target || 0;\n        tween.unit = unit;\n        // If a +=/-= token was provided, we're doing a relative animation\n        tween.end = parts[ 1 ] ?\n          start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n          +parts[ 2 ];\n      }\n\n      return tween;\n    } ]\n  };\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n  setTimeout(function() {\n    fxNow = undefined;\n  });\n  return ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n  var which,\n    attrs = { height: type },\n    i = 0;\n\n  // if we include width, step value is 1 to do all cssExpand values,\n  // if we don't include width, step value is 2 to skip over Left and Right\n  includeWidth = includeWidth ? 1 : 0;\n  for ( ; i < 4 ; i += 2 - includeWidth ) {\n    which = cssExpand[ i ];\n    attrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n  }\n\n  if ( includeWidth ) {\n    attrs.opacity = attrs.width = type;\n  }\n\n  return attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n  var tween,\n    collection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n    index = 0,\n    length = collection.length;\n  for ( ; index < length; index++ ) {\n    if ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n      // we're done with this property\n      return tween;\n    }\n  }\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n  /* jshint validthis: true */\n  var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n    anim = this,\n    orig = {},\n    style = elem.style,\n    hidden = elem.nodeType && isHidden( elem ),\n    dataShow = jQuery._data( elem, \"fxshow\" );\n\n  // handle queue: false promises\n  if ( !opts.queue ) {\n    hooks = jQuery._queueHooks( elem, \"fx\" );\n    if ( hooks.unqueued == null ) {\n      hooks.unqueued = 0;\n      oldfire = hooks.empty.fire;\n      hooks.empty.fire = function() {\n        if ( !hooks.unqueued ) {\n          oldfire();\n        }\n      };\n    }\n    hooks.unqueued++;\n\n    anim.always(function() {\n      // doing this makes sure that the complete handler will be called\n      // before this completes\n      anim.always(function() {\n        hooks.unqueued--;\n        if ( !jQuery.queue( elem, \"fx\" ).length ) {\n          hooks.empty.fire();\n        }\n      });\n    });\n  }\n\n  // height/width overflow pass\n  if ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n    // Make sure that nothing sneaks out\n    // Record all 3 overflow attributes because IE does not\n    // change the overflow attribute when overflowX and\n    // overflowY are set to the same value\n    opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n    // Set display property to inline-block for height/width\n    // animations on inline elements that are having width/height animated\n    display = jQuery.css( elem, \"display\" );\n\n    // Test default display if display is currently \"none\"\n    checkDisplay = display === \"none\" ?\n      jQuery._data( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n    if ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n      // inline-level elements accept inline-block;\n      // block-level elements need to be inline with layout\n      if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === \"inline\" ) {\n        style.display = \"inline-block\";\n      } else {\n        style.zoom = 1;\n      }\n    }\n  }\n\n  if ( opts.overflow ) {\n    style.overflow = \"hidden\";\n    if ( !support.shrinkWrapBlocks() ) {\n      anim.always(function() {\n        style.overflow = opts.overflow[ 0 ];\n        style.overflowX = opts.overflow[ 1 ];\n        style.overflowY = opts.overflow[ 2 ];\n      });\n    }\n  }\n\n  // show/hide pass\n  for ( prop in props ) {\n    value = props[ prop ];\n    if ( rfxtypes.exec( value ) ) {\n      delete props[ prop ];\n      toggle = toggle || value === \"toggle\";\n      if ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n        // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n        if ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n          hidden = true;\n        } else {\n          continue;\n        }\n      }\n      orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n    // Any non-fx value stops us from restoring the original display value\n    } else {\n      display = undefined;\n    }\n  }\n\n  if ( !jQuery.isEmptyObject( orig ) ) {\n    if ( dataShow ) {\n      if ( \"hidden\" in dataShow ) {\n        hidden = dataShow.hidden;\n      }\n    } else {\n      dataShow = jQuery._data( elem, \"fxshow\", {} );\n    }\n\n    // store state if its toggle - enables .stop().toggle() to \"reverse\"\n    if ( toggle ) {\n      dataShow.hidden = !hidden;\n    }\n    if ( hidden ) {\n      jQuery( elem ).show();\n    } else {\n      anim.done(function() {\n        jQuery( elem ).hide();\n      });\n    }\n    anim.done(function() {\n      var prop;\n      jQuery._removeData( elem, \"fxshow\" );\n      for ( prop in orig ) {\n        jQuery.style( elem, prop, orig[ prop ] );\n      }\n    });\n    for ( prop in orig ) {\n      tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n      if ( !( prop in dataShow ) ) {\n        dataShow[ prop ] = tween.start;\n        if ( hidden ) {\n          tween.end = tween.start;\n          tween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n        }\n      }\n    }\n\n  // If this is a noop like .hide().hide(), restore an overwritten display value\n  } else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n    style.display = display;\n  }\n}\n\nfunction propFilter( props, specialEasing ) {\n  var index, name, easing, value, hooks;\n\n  // camelCase, specialEasing and expand cssHook pass\n  for ( index in props ) {\n    name = jQuery.camelCase( index );\n    easing = specialEasing[ name ];\n    value = props[ index ];\n    if ( jQuery.isArray( value ) ) {\n      easing = value[ 1 ];\n      value = props[ index ] = value[ 0 ];\n    }\n\n    if ( index !== name ) {\n      props[ name ] = value;\n      delete props[ index ];\n    }\n\n    hooks = jQuery.cssHooks[ name ];\n    if ( hooks && \"expand\" in hooks ) {\n      value = hooks.expand( value );\n      delete props[ name ];\n\n      // not quite $.extend, this wont overwrite keys already present.\n      // also - reusing 'index' from above because we have the correct \"name\"\n      for ( index in value ) {\n        if ( !( index in props ) ) {\n          props[ index ] = value[ index ];\n          specialEasing[ index ] = easing;\n        }\n      }\n    } else {\n      specialEasing[ name ] = easing;\n    }\n  }\n}\n\nfunction Animation( elem, properties, options ) {\n  var result,\n    stopped,\n    index = 0,\n    length = animationPrefilters.length,\n    deferred = jQuery.Deferred().always( function() {\n      // don't match elem in the :animated selector\n      delete tick.elem;\n    }),\n    tick = function() {\n      if ( stopped ) {\n        return false;\n      }\n      var currentTime = fxNow || createFxNow(),\n        remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n        // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n        temp = remaining / animation.duration || 0,\n        percent = 1 - temp,\n        index = 0,\n        length = animation.tweens.length;\n\n      for ( ; index < length ; index++ ) {\n        animation.tweens[ index ].run( percent );\n      }\n\n      deferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n      if ( percent < 1 && length ) {\n        return remaining;\n      } else {\n        deferred.resolveWith( elem, [ animation ] );\n        return false;\n      }\n    },\n    animation = deferred.promise({\n      elem: elem,\n      props: jQuery.extend( {}, properties ),\n      opts: jQuery.extend( true, { specialEasing: {} }, options ),\n      originalProperties: properties,\n      originalOptions: options,\n      startTime: fxNow || createFxNow(),\n      duration: options.duration,\n      tweens: [],\n      createTween: function( prop, end ) {\n        var tween = jQuery.Tween( elem, animation.opts, prop, end,\n            animation.opts.specialEasing[ prop ] || animation.opts.easing );\n        animation.tweens.push( tween );\n        return tween;\n      },\n      stop: function( gotoEnd ) {\n        var index = 0,\n          // if we are going to the end, we want to run all the tweens\n          // otherwise we skip this part\n          length = gotoEnd ? animation.tweens.length : 0;\n        if ( stopped ) {\n          return this;\n        }\n        stopped = true;\n        for ( ; index < length ; index++ ) {\n          animation.tweens[ index ].run( 1 );\n        }\n\n        // resolve when we played the last frame\n        // otherwise, reject\n        if ( gotoEnd ) {\n          deferred.resolveWith( elem, [ animation, gotoEnd ] );\n        } else {\n          deferred.rejectWith( elem, [ animation, gotoEnd ] );\n        }\n        return this;\n      }\n    }),\n    props = animation.props;\n\n  propFilter( props, animation.opts.specialEasing );\n\n  for ( ; index < length ; index++ ) {\n    result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n    if ( result ) {\n      return result;\n    }\n  }\n\n  jQuery.map( props, createTween, animation );\n\n  if ( jQuery.isFunction( animation.opts.start ) ) {\n    animation.opts.start.call( elem, animation );\n  }\n\n  jQuery.fx.timer(\n    jQuery.extend( tick, {\n      elem: elem,\n      anim: animation,\n      queue: animation.opts.queue\n    })\n  );\n\n  // attach callbacks from options\n  return animation.progress( animation.opts.progress )\n    .done( animation.opts.done, animation.opts.complete )\n    .fail( animation.opts.fail )\n    .always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n  tweener: function( props, callback ) {\n    if ( jQuery.isFunction( props ) ) {\n      callback = props;\n      props = [ \"*\" ];\n    } else {\n      props = props.split(\" \");\n    }\n\n    var prop,\n      index = 0,\n      length = props.length;\n\n    for ( ; index < length ; index++ ) {\n      prop = props[ index ];\n      tweeners[ prop ] = tweeners[ prop ] || [];\n      tweeners[ prop ].unshift( callback );\n    }\n  },\n\n  prefilter: function( callback, prepend ) {\n    if ( prepend ) {\n      animationPrefilters.unshift( callback );\n    } else {\n      animationPrefilters.push( callback );\n    }\n  }\n});\n\njQuery.speed = function( speed, easing, fn ) {\n  var opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n    complete: fn || !fn && easing ||\n      jQuery.isFunction( speed ) && speed,\n    duration: speed,\n    easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n  };\n\n  opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n    opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n  // normalize opt.queue - true/undefined/null -> \"fx\"\n  if ( opt.queue == null || opt.queue === true ) {\n    opt.queue = \"fx\";\n  }\n\n  // Queueing\n  opt.old = opt.complete;\n\n  opt.complete = function() {\n    if ( jQuery.isFunction( opt.old ) ) {\n      opt.old.call( this );\n    }\n\n    if ( opt.queue ) {\n      jQuery.dequeue( this, opt.queue );\n    }\n  };\n\n  return opt;\n};\n\njQuery.fn.extend({\n  fadeTo: function( speed, to, easing, callback ) {\n\n    // show any hidden elements after setting opacity to 0\n    return this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n      // animate to the value specified\n      .end().animate({ opacity: to }, speed, easing, callback );\n  },\n  animate: function( prop, speed, easing, callback ) {\n    var empty = jQuery.isEmptyObject( prop ),\n      optall = jQuery.speed( speed, easing, callback ),\n      doAnimation = function() {\n        // Operate on a copy of prop so per-property easing won't be lost\n        var anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n        // Empty animations, or finishing resolves immediately\n        if ( empty || jQuery._data( this, \"finish\" ) ) {\n          anim.stop( true );\n        }\n      };\n      doAnimation.finish = doAnimation;\n\n    return empty || optall.queue === false ?\n      this.each( doAnimation ) :\n      this.queue( optall.queue, doAnimation );\n  },\n  stop: function( type, clearQueue, gotoEnd ) {\n    var stopQueue = function( hooks ) {\n      var stop = hooks.stop;\n      delete hooks.stop;\n      stop( gotoEnd );\n    };\n\n    if ( typeof type !== \"string\" ) {\n      gotoEnd = clearQueue;\n      clearQueue = type;\n      type = undefined;\n    }\n    if ( clearQueue && type !== false ) {\n      this.queue( type || \"fx\", [] );\n    }\n\n    return this.each(function() {\n      var dequeue = true,\n        index = type != null && type + \"queueHooks\",\n        timers = jQuery.timers,\n        data = jQuery._data( this );\n\n      if ( index ) {\n        if ( data[ index ] && data[ index ].stop ) {\n          stopQueue( data[ index ] );\n        }\n      } else {\n        for ( index in data ) {\n          if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n            stopQueue( data[ index ] );\n          }\n        }\n      }\n\n      for ( index = timers.length; index--; ) {\n        if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n          timers[ index ].anim.stop( gotoEnd );\n          dequeue = false;\n          timers.splice( index, 1 );\n        }\n      }\n\n      // start the next in the queue if the last step wasn't forced\n      // timers currently will call their complete callbacks, which will dequeue\n      // but only if they were gotoEnd\n      if ( dequeue || !gotoEnd ) {\n        jQuery.dequeue( this, type );\n      }\n    });\n  },\n  finish: function( type ) {\n    if ( type !== false ) {\n      type = type || \"fx\";\n    }\n    return this.each(function() {\n      var index,\n        data = jQuery._data( this ),\n        queue = data[ type + \"queue\" ],\n        hooks = data[ type + \"queueHooks\" ],\n        timers = jQuery.timers,\n        length = queue ? queue.length : 0;\n\n      // enable finishing flag on private data\n      data.finish = true;\n\n      // empty the queue first\n      jQuery.queue( this, type, [] );\n\n      if ( hooks && hooks.stop ) {\n        hooks.stop.call( this, true );\n      }\n\n      // look for any active animations, and finish them\n      for ( index = timers.length; index--; ) {\n        if ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n          timers[ index ].anim.stop( true );\n          timers.splice( index, 1 );\n        }\n      }\n\n      // look for any animations in the old queue and finish them\n      for ( index = 0; index < length; index++ ) {\n        if ( queue[ index ] && queue[ index ].finish ) {\n          queue[ index ].finish.call( this );\n        }\n      }\n\n      // turn off finishing flag\n      delete data.finish;\n    });\n  }\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n  var cssFn = jQuery.fn[ name ];\n  jQuery.fn[ name ] = function( speed, easing, callback ) {\n    return speed == null || typeof speed === \"boolean\" ?\n      cssFn.apply( this, arguments ) :\n      this.animate( genFx( name, true ), speed, easing, callback );\n  };\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n  slideDown: genFx(\"show\"),\n  slideUp: genFx(\"hide\"),\n  slideToggle: genFx(\"toggle\"),\n  fadeIn: { opacity: \"show\" },\n  fadeOut: { opacity: \"hide\" },\n  fadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n  jQuery.fn[ name ] = function( speed, easing, callback ) {\n    return this.animate( props, speed, easing, callback );\n  };\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n  var timer,\n    timers = jQuery.timers,\n    i = 0;\n\n  fxNow = jQuery.now();\n\n  for ( ; i < timers.length; i++ ) {\n    timer = timers[ i ];\n    // Checks the timer has not already been removed\n    if ( !timer() && timers[ i ] === timer ) {\n      timers.splice( i--, 1 );\n    }\n  }\n\n  if ( !timers.length ) {\n    jQuery.fx.stop();\n  }\n  fxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n  jQuery.timers.push( timer );\n  if ( timer() ) {\n    jQuery.fx.start();\n  } else {\n    jQuery.timers.pop();\n  }\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n  if ( !timerId ) {\n    timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n  }\n};\n\njQuery.fx.stop = function() {\n  clearInterval( timerId );\n  timerId = null;\n};\n\njQuery.fx.speeds = {\n  slow: 600,\n  fast: 200,\n  // Default speed\n  _default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n  time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n  type = type || \"fx\";\n\n  return this.queue( type, function( next, hooks ) {\n    var timeout = setTimeout( next, time );\n    hooks.stop = function() {\n      clearTimeout( timeout );\n    };\n  });\n};\n\n\n(function() {\n  // Minified: var a,b,c,d,e\n  var input, div, select, a, opt;\n\n  // Setup\n  div = document.createElement( \"div\" );\n  div.setAttribute( \"className\", \"t\" );\n  div.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n  a = div.getElementsByTagName(\"a\")[ 0 ];\n\n  // First batch of tests.\n  select = document.createElement(\"select\");\n  opt = select.appendChild( document.createElement(\"option\") );\n  input = div.getElementsByTagName(\"input\")[ 0 ];\n\n  a.style.cssText = \"top:1px\";\n\n  // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n  support.getSetAttribute = div.className !== \"t\";\n\n  // Get the style information from getAttribute\n  // (IE uses .cssText instead)\n  support.style = /top/.test( a.getAttribute(\"style\") );\n\n  // Make sure that URLs aren't manipulated\n  // (IE normalizes it by default)\n  support.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n  // Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n  support.checkOn = !!input.value;\n\n  // Make sure that a selected-by-default option has a working selected property.\n  // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n  support.optSelected = opt.selected;\n\n  // Tests for enctype support on a form (#6743)\n  support.enctype = !!document.createElement(\"form\").enctype;\n\n  // Make sure that the options inside disabled selects aren't marked as disabled\n  // (WebKit marks them as disabled)\n  select.disabled = true;\n  support.optDisabled = !opt.disabled;\n\n  // Support: IE8 only\n  // Check if we can trust getAttribute(\"value\")\n  input = document.createElement( \"input\" );\n  input.setAttribute( \"value\", \"\" );\n  support.input = input.getAttribute( \"value\" ) === \"\";\n\n  // Check if an input maintains its value after becoming a radio\n  input.value = \"t\";\n  input.setAttribute( \"type\", \"radio\" );\n  support.radioValue = input.value === \"t\";\n})();\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n  val: function( value ) {\n    var hooks, ret, isFunction,\n      elem = this[0];\n\n    if ( !arguments.length ) {\n      if ( elem ) {\n        hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n        if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n          return ret;\n        }\n\n        ret = elem.value;\n\n        return typeof ret === \"string\" ?\n          // handle most common string cases\n          ret.replace(rreturn, \"\") :\n          // handle cases where value is null/undef or number\n          ret == null ? \"\" : ret;\n      }\n\n      return;\n    }\n\n    isFunction = jQuery.isFunction( value );\n\n    return this.each(function( i ) {\n      var val;\n\n      if ( this.nodeType !== 1 ) {\n        return;\n      }\n\n      if ( isFunction ) {\n        val = value.call( this, i, jQuery( this ).val() );\n      } else {\n        val = value;\n      }\n\n      // Treat null/undefined as \"\"; convert numbers to string\n      if ( val == null ) {\n        val = \"\";\n      } else if ( typeof val === \"number\" ) {\n        val += \"\";\n      } else if ( jQuery.isArray( val ) ) {\n        val = jQuery.map( val, function( value ) {\n          return value == null ? \"\" : value + \"\";\n        });\n      }\n\n      hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n      // If set returns undefined, fall back to normal setting\n      if ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n        this.value = val;\n      }\n    });\n  }\n});\n\njQuery.extend({\n  valHooks: {\n    option: {\n      get: function( elem ) {\n        var val = jQuery.find.attr( elem, \"value\" );\n        return val != null ?\n          val :\n          // Support: IE10-11+\n          // option.text throws exceptions (#14686, #14858)\n          jQuery.trim( jQuery.text( elem ) );\n      }\n    },\n    select: {\n      get: function( elem ) {\n        var value, option,\n          options = elem.options,\n          index = elem.selectedIndex,\n          one = elem.type === \"select-one\" || index < 0,\n          values = one ? null : [],\n          max = one ? index + 1 : options.length,\n          i = index < 0 ?\n            max :\n            one ? index : 0;\n\n        // Loop through all the selected options\n        for ( ; i < max; i++ ) {\n          option = options[ i ];\n\n          // oldIE doesn't update selected after form reset (#2551)\n          if ( ( option.selected || i === index ) &&\n              // Don't return options that are disabled or in a disabled optgroup\n              ( support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n              ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n            // Get the specific value for the option\n            value = jQuery( option ).val();\n\n            // We don't need an array for one selects\n            if ( one ) {\n              return value;\n            }\n\n            // Multi-Selects return an array\n            values.push( value );\n          }\n        }\n\n        return values;\n      },\n\n      set: function( elem, value ) {\n        var optionSet, option,\n          options = elem.options,\n          values = jQuery.makeArray( value ),\n          i = options.length;\n\n        while ( i-- ) {\n          option = options[ i ];\n\n          if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {\n\n            // Support: IE6\n            // When new option element is added to select box we need to\n            // force reflow of newly added node in order to workaround delay\n            // of initialization properties\n            try {\n              option.selected = optionSet = true;\n\n            } catch ( _ ) {\n\n              // Will be executed only in IE6\n              option.scrollHeight;\n            }\n\n          } else {\n            option.selected = false;\n          }\n        }\n\n        // Force browsers to behave consistently when non-matching value is set\n        if ( !optionSet ) {\n          elem.selectedIndex = -1;\n        }\n\n        return options;\n      }\n    }\n  }\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n  jQuery.valHooks[ this ] = {\n    set: function( elem, value ) {\n      if ( jQuery.isArray( value ) ) {\n        return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n      }\n    }\n  };\n  if ( !support.checkOn ) {\n    jQuery.valHooks[ this ].get = function( elem ) {\n      // Support: Webkit\n      // \"\" is returned instead of \"on\" if a value isn't specified\n      return elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n    };\n  }\n});\n\n\n\n\nvar nodeHook, boolHook,\n  attrHandle = jQuery.expr.attrHandle,\n  ruseDefault = /^(?:checked|selected)$/i,\n  getSetAttribute = support.getSetAttribute,\n  getSetInput = support.input;\n\njQuery.fn.extend({\n  attr: function( name, value ) {\n    return access( this, jQuery.attr, name, value, arguments.length > 1 );\n  },\n\n  removeAttr: function( name ) {\n    return this.each(function() {\n      jQuery.removeAttr( this, name );\n    });\n  }\n});\n\njQuery.extend({\n  attr: function( elem, name, value ) {\n    var hooks, ret,\n      nType = elem.nodeType;\n\n    // don't get/set attributes on text, comment and attribute nodes\n    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n      return;\n    }\n\n    // Fallback to prop when attributes are not supported\n    if ( typeof elem.getAttribute === strundefined ) {\n      return jQuery.prop( elem, name, value );\n    }\n\n    // All attributes are lowercase\n    // Grab necessary hook if one is defined\n    if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n      name = name.toLowerCase();\n      hooks = jQuery.attrHooks[ name ] ||\n        ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n    }\n\n    if ( value !== undefined ) {\n\n      if ( value === null ) {\n        jQuery.removeAttr( elem, name );\n\n      } else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n        return ret;\n\n      } else {\n        elem.setAttribute( name, value + \"\" );\n        return value;\n      }\n\n    } else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n      return ret;\n\n    } else {\n      ret = jQuery.find.attr( elem, name );\n\n      // Non-existent attributes return null, we normalize to undefined\n      return ret == null ?\n        undefined :\n        ret;\n    }\n  },\n\n  removeAttr: function( elem, value ) {\n    var name, propName,\n      i = 0,\n      attrNames = value && value.match( rnotwhite );\n\n    if ( attrNames && elem.nodeType === 1 ) {\n      while ( (name = attrNames[i++]) ) {\n        propName = jQuery.propFix[ name ] || name;\n\n        // Boolean attributes get special treatment (#10870)\n        if ( jQuery.expr.match.bool.test( name ) ) {\n          // Set corresponding property to false\n          if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n            elem[ propName ] = false;\n          // Support: IE<9\n          // Also clear defaultChecked/defaultSelected (if appropriate)\n          } else {\n            elem[ jQuery.camelCase( \"default-\" + name ) ] =\n              elem[ propName ] = false;\n          }\n\n        // See #9699 for explanation of this approach (setting first, then removal)\n        } else {\n          jQuery.attr( elem, name, \"\" );\n        }\n\n        elem.removeAttribute( getSetAttribute ? name : propName );\n      }\n    }\n  },\n\n  attrHooks: {\n    type: {\n      set: function( elem, value ) {\n        if ( !support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n          // Setting the type on a radio button after the value resets the value in IE6-9\n          // Reset value to default in case type is set after value during creation\n          var val = elem.value;\n          elem.setAttribute( \"type\", value );\n          if ( val ) {\n            elem.value = val;\n          }\n          return value;\n        }\n      }\n    }\n  }\n});\n\n// Hook for boolean attributes\nboolHook = {\n  set: function( elem, value, name ) {\n    if ( value === false ) {\n      // Remove boolean attributes when set to false\n      jQuery.removeAttr( elem, name );\n    } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n      // IE<8 needs the *property* name\n      elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n    // Use defaultChecked and defaultSelected for oldIE\n    } else {\n      elem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n    }\n\n    return name;\n  }\n};\n\n// Retrieve booleans specially\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\n  var getter = attrHandle[ name ] || jQuery.find.attr;\n\n  attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n    function( elem, name, isXML ) {\n      var ret, handle;\n      if ( !isXML ) {\n        // Avoid an infinite loop by temporarily removing this function from the getter\n        handle = attrHandle[ name ];\n        attrHandle[ name ] = ret;\n        ret = getter( elem, name, isXML ) != null ?\n          name.toLowerCase() :\n          null;\n        attrHandle[ name ] = handle;\n      }\n      return ret;\n    } :\n    function( elem, name, isXML ) {\n      if ( !isXML ) {\n        return elem[ jQuery.camelCase( \"default-\" + name ) ] ?\n          name.toLowerCase() :\n          null;\n      }\n    };\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n  jQuery.attrHooks.value = {\n    set: function( elem, value, name ) {\n      if ( jQuery.nodeName( elem, \"input\" ) ) {\n        // Does not return so that setAttribute is also used\n        elem.defaultValue = value;\n      } else {\n        // Use nodeHook if defined (#1954); otherwise setAttribute is fine\n        return nodeHook && nodeHook.set( elem, value, name );\n      }\n    }\n  };\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n  // Use this for any attribute in IE6/7\n  // This fixes almost every IE6/7 issue\n  nodeHook = {\n    set: function( elem, value, name ) {\n      // Set the existing or create a new attribute node\n      var ret = elem.getAttributeNode( name );\n      if ( !ret ) {\n        elem.setAttributeNode(\n          (ret = elem.ownerDocument.createAttribute( name ))\n        );\n      }\n\n      ret.value = value += \"\";\n\n      // Break association with cloned elements by also using setAttribute (#9646)\n      if ( name === \"value\" || value === elem.getAttribute( name ) ) {\n        return value;\n      }\n    }\n  };\n\n  // Some attributes are constructed with empty-string values when not defined\n  attrHandle.id = attrHandle.name = attrHandle.coords =\n    function( elem, name, isXML ) {\n      var ret;\n      if ( !isXML ) {\n        return (ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n          ret.value :\n          null;\n      }\n    };\n\n  // Fixing value retrieval on a button requires this module\n  jQuery.valHooks.button = {\n    get: function( elem, name ) {\n      var ret = elem.getAttributeNode( name );\n      if ( ret && ret.specified ) {\n        return ret.value;\n      }\n    },\n    set: nodeHook.set\n  };\n\n  // Set contenteditable to false on removals(#10429)\n  // Setting to empty string throws an error as an invalid value\n  jQuery.attrHooks.contenteditable = {\n    set: function( elem, value, name ) {\n      nodeHook.set( elem, value === \"\" ? false : value, name );\n    }\n  };\n\n  // Set width and height to auto instead of 0 on empty string( Bug #8150 )\n  // This is for removals\n  jQuery.each([ \"width\", \"height\" ], function( i, name ) {\n    jQuery.attrHooks[ name ] = {\n      set: function( elem, value ) {\n        if ( value === \"\" ) {\n          elem.setAttribute( name, \"auto\" );\n          return value;\n        }\n      }\n    };\n  });\n}\n\nif ( !support.style ) {\n  jQuery.attrHooks.style = {\n    get: function( elem ) {\n      // Return undefined in the case of empty string\n      // Note: IE uppercases css property names, but if we were to .toLowerCase()\n      // .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n      return elem.style.cssText || undefined;\n    },\n    set: function( elem, value ) {\n      return ( elem.style.cssText = value + \"\" );\n    }\n  };\n}\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button|object)$/i,\n  rclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend({\n  prop: function( name, value ) {\n    return access( this, jQuery.prop, name, value, arguments.length > 1 );\n  },\n\n  removeProp: function( name ) {\n    name = jQuery.propFix[ name ] || name;\n    return this.each(function() {\n      // try/catch handles cases where IE balks (such as removing a property on window)\n      try {\n        this[ name ] = undefined;\n        delete this[ name ];\n      } catch( e ) {}\n    });\n  }\n});\n\njQuery.extend({\n  propFix: {\n    \"for\": \"htmlFor\",\n    \"class\": \"className\"\n  },\n\n  prop: function( elem, name, value ) {\n    var ret, hooks, notxml,\n      nType = elem.nodeType;\n\n    // don't get/set properties on text, comment and attribute nodes\n    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n      return;\n    }\n\n    notxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n    if ( notxml ) {\n      // Fix name and attach hooks\n      name = jQuery.propFix[ name ] || name;\n      hooks = jQuery.propHooks[ name ];\n    }\n\n    if ( value !== undefined ) {\n      return hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n        ret :\n        ( elem[ name ] = value );\n\n    } else {\n      return hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n        ret :\n        elem[ name ];\n    }\n  },\n\n  propHooks: {\n    tabIndex: {\n      get: function( elem ) {\n        // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n        // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n        // Use proper attribute retrieval(#12072)\n        var tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n        return tabindex ?\n          parseInt( tabindex, 10 ) :\n          rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n            0 :\n            -1;\n      }\n    }\n  }\n});\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !support.hrefNormalized ) {\n  // href/src property should get the full normalized URL (#10299/#12915)\n  jQuery.each([ \"href\", \"src\" ], function( i, name ) {\n    jQuery.propHooks[ name ] = {\n      get: function( elem ) {\n        return elem.getAttribute( name, 4 );\n      }\n    };\n  });\n}\n\n// Support: Safari, IE9+\n// mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !support.optSelected ) {\n  jQuery.propHooks.selected = {\n    get: function( elem ) {\n      var parent = elem.parentNode;\n\n      if ( parent ) {\n        parent.selectedIndex;\n\n        // Make sure that it also works with optgroups, see #5701\n        if ( parent.parentNode ) {\n          parent.parentNode.selectedIndex;\n        }\n      }\n      return null;\n    }\n  };\n}\n\njQuery.each([\n  \"tabIndex\",\n  \"readOnly\",\n  \"maxLength\",\n  \"cellSpacing\",\n  \"cellPadding\",\n  \"rowSpan\",\n  \"colSpan\",\n  \"useMap\",\n  \"frameBorder\",\n  \"contentEditable\"\n], function() {\n  jQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !support.enctype ) {\n  jQuery.propFix.enctype = \"encoding\";\n}\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n  addClass: function( value ) {\n    var classes, elem, cur, clazz, j, finalValue,\n      i = 0,\n      len = this.length,\n      proceed = typeof value === \"string\" && value;\n\n    if ( jQuery.isFunction( value ) ) {\n      return this.each(function( j ) {\n        jQuery( this ).addClass( value.call( this, j, this.className ) );\n      });\n    }\n\n    if ( proceed ) {\n      // The disjunction here is for better compressibility (see removeClass)\n      classes = ( value || \"\" ).match( rnotwhite ) || [];\n\n      for ( ; i < len; i++ ) {\n        elem = this[ i ];\n        cur = elem.nodeType === 1 && ( elem.className ?\n          ( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n          \" \"\n        );\n\n        if ( cur ) {\n          j = 0;\n          while ( (clazz = classes[j++]) ) {\n            if ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n              cur += clazz + \" \";\n            }\n          }\n\n          // only assign if different to avoid unneeded rendering.\n          finalValue = jQuery.trim( cur );\n          if ( elem.className !== finalValue ) {\n            elem.className = finalValue;\n          }\n        }\n      }\n    }\n\n    return this;\n  },\n\n  removeClass: function( value ) {\n    var classes, elem, cur, clazz, j, finalValue,\n      i = 0,\n      len = this.length,\n      proceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n    if ( jQuery.isFunction( value ) ) {\n      return this.each(function( j ) {\n        jQuery( this ).removeClass( value.call( this, j, this.className ) );\n      });\n    }\n    if ( proceed ) {\n      classes = ( value || \"\" ).match( rnotwhite ) || [];\n\n      for ( ; i < len; i++ ) {\n        elem = this[ i ];\n        // This expression is here for better compressibility (see addClass)\n        cur = elem.nodeType === 1 && ( elem.className ?\n          ( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n          \"\"\n        );\n\n        if ( cur ) {\n          j = 0;\n          while ( (clazz = classes[j++]) ) {\n            // Remove *all* instances\n            while ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n              cur = cur.replace( \" \" + clazz + \" \", \" \" );\n            }\n          }\n\n          // only assign if different to avoid unneeded rendering.\n          finalValue = value ? jQuery.trim( cur ) : \"\";\n          if ( elem.className !== finalValue ) {\n            elem.className = finalValue;\n          }\n        }\n      }\n    }\n\n    return this;\n  },\n\n  toggleClass: function( value, stateVal ) {\n    var type = typeof value;\n\n    if ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n      return stateVal ? this.addClass( value ) : this.removeClass( value );\n    }\n\n    if ( jQuery.isFunction( value ) ) {\n      return this.each(function( i ) {\n        jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n      });\n    }\n\n    return this.each(function() {\n      if ( type === \"string\" ) {\n        // toggle individual class names\n        var className,\n          i = 0,\n          self = jQuery( this ),\n          classNames = value.match( rnotwhite ) || [];\n\n        while ( (className = classNames[ i++ ]) ) {\n          // check each className given, space separated list\n          if ( self.hasClass( className ) ) {\n            self.removeClass( className );\n          } else {\n            self.addClass( className );\n          }\n        }\n\n      // Toggle whole class name\n      } else if ( type === strundefined || type === \"boolean\" ) {\n        if ( this.className ) {\n          // store className if set\n          jQuery._data( this, \"__className__\", this.className );\n        }\n\n        // If the element has a class name or if we're passed \"false\",\n        // then remove the whole classname (if there was one, the above saved it).\n        // Otherwise bring back whatever was previously saved (if anything),\n        // falling back to the empty string if nothing was stored.\n        this.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n      }\n    });\n  },\n\n  hasClass: function( selector ) {\n    var className = \" \" + selector + \" \",\n      i = 0,\n      l = this.length;\n    for ( ; i < l; i++ ) {\n      if ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n});\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n  \"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n  \"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n  // Handle event binding\n  jQuery.fn[ name ] = function( data, fn ) {\n    return arguments.length > 0 ?\n      this.on( name, null, data, fn ) :\n      this.trigger( name );\n  };\n});\n\njQuery.fn.extend({\n  hover: function( fnOver, fnOut ) {\n    return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n  },\n\n  bind: function( types, data, fn ) {\n    return this.on( types, null, data, fn );\n  },\n  unbind: function( types, fn ) {\n    return this.off( types, null, fn );\n  },\n\n  delegate: function( selector, types, data, fn ) {\n    return this.on( types, selector, data, fn );\n  },\n  undelegate: function( selector, types, fn ) {\n    // ( namespace ) or ( selector, types [, fn] )\n    return arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n  }\n});\n\n\nvar nonce = jQuery.now();\n\nvar rquery = (/\\?/);\n\n\n\nvar rvalidtokens = /(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;\n\njQuery.parseJSON = function( data ) {\n  // Attempt to parse using the native JSON parser first\n  if ( window.JSON && window.JSON.parse ) {\n    // Support: Android 2.3\n    // Workaround failure to string-cast null input\n    return window.JSON.parse( data + \"\" );\n  }\n\n  var requireNonComma,\n    depth = null,\n    str = jQuery.trim( data + \"\" );\n\n  // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains\n  // after removing valid tokens\n  return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {\n\n    // Force termination if we see a misplaced comma\n    if ( requireNonComma && comma ) {\n      depth = 0;\n    }\n\n    // Perform no more replacements after returning to outermost depth\n    if ( depth === 0 ) {\n      return token;\n    }\n\n    // Commas must not follow \"[\", \"{\", or \",\"\n    requireNonComma = open || comma;\n\n    // Determine new depth\n    // array/object open (\"[\" or \"{\"): depth += true - false (increment)\n    // array/object close (\"]\" or \"}\"): depth += false - true (decrement)\n    // other cases (\",\" or primitive): depth += true - true (numeric cast)\n    depth += !close - !open;\n\n    // Remove this token\n    return \"\";\n  }) ) ?\n    ( Function( \"return \" + str ) )() :\n    jQuery.error( \"Invalid JSON: \" + data );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n  var xml, tmp;\n  if ( !data || typeof data !== \"string\" ) {\n    return null;\n  }\n  try {\n    if ( window.DOMParser ) { // Standard\n      tmp = new DOMParser();\n      xml = tmp.parseFromString( data, \"text/xml\" );\n    } else { // IE\n      xml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n      xml.async = \"false\";\n      xml.loadXML( data );\n    }\n  } catch( e ) {\n    xml = undefined;\n  }\n  if ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n    jQuery.error( \"Invalid XML: \" + data );\n  }\n  return xml;\n};\n\n\nvar\n  // Document location\n  ajaxLocParts,\n  ajaxLocation,\n\n  rhash = /#.*$/,\n  rts = /([?&])_=[^&]*/,\n  rheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n  // #7653, #8125, #8152: local protocol detection\n  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n  rnoContent = /^(?:GET|HEAD)$/,\n  rprotocol = /^\\/\\//,\n  rurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n  /* Prefilters\n   * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n   * 2) These are called:\n   *    - BEFORE asking for a transport\n   *    - AFTER param serialization (s.data is a string if s.processData is true)\n   * 3) key is the dataType\n   * 4) the catchall symbol \"*\" can be used\n   * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n   */\n  prefilters = {},\n\n  /* Transports bindings\n   * 1) key is the dataType\n   * 2) the catchall symbol \"*\" can be used\n   * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n   */\n  transports = {},\n\n  // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n  allTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n  ajaxLocation = location.href;\n} catch( e ) {\n  // Use the href attribute of an A element\n  // since IE will modify it given document.location\n  ajaxLocation = document.createElement( \"a\" );\n  ajaxLocation.href = \"\";\n  ajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n  // dataTypeExpression is optional and defaults to \"*\"\n  return function( dataTypeExpression, func ) {\n\n    if ( typeof dataTypeExpression !== \"string\" ) {\n      func = dataTypeExpression;\n      dataTypeExpression = \"*\";\n    }\n\n    var dataType,\n      i = 0,\n      dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n    if ( jQuery.isFunction( func ) ) {\n      // For each dataType in the dataTypeExpression\n      while ( (dataType = dataTypes[i++]) ) {\n        // Prepend if requested\n        if ( dataType.charAt( 0 ) === \"+\" ) {\n          dataType = dataType.slice( 1 ) || \"*\";\n          (structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n        // Otherwise append\n        } else {\n          (structure[ dataType ] = structure[ dataType ] || []).push( func );\n        }\n      }\n    }\n  };\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n  var inspected = {},\n    seekingTransport = ( structure === transports );\n\n  function inspect( dataType ) {\n    var selected;\n    inspected[ dataType ] = true;\n    jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n      var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n      if ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n        options.dataTypes.unshift( dataTypeOrTransport );\n        inspect( dataTypeOrTransport );\n        return false;\n      } else if ( seekingTransport ) {\n        return !( selected = dataTypeOrTransport );\n      }\n    });\n    return selected;\n  }\n\n  return inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n  var deep, key,\n    flatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n  for ( key in src ) {\n    if ( src[ key ] !== undefined ) {\n      ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n    }\n  }\n  if ( deep ) {\n    jQuery.extend( true, target, deep );\n  }\n\n  return target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n  var firstDataType, ct, finalDataType, type,\n    contents = s.contents,\n    dataTypes = s.dataTypes;\n\n  // Remove auto dataType and get content-type in the process\n  while ( dataTypes[ 0 ] === \"*\" ) {\n    dataTypes.shift();\n    if ( ct === undefined ) {\n      ct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n    }\n  }\n\n  // Check if we're dealing with a known content-type\n  if ( ct ) {\n    for ( type in contents ) {\n      if ( contents[ type ] && contents[ type ].test( ct ) ) {\n        dataTypes.unshift( type );\n        break;\n      }\n    }\n  }\n\n  // Check to see if we have a response for the expected dataType\n  if ( dataTypes[ 0 ] in responses ) {\n    finalDataType = dataTypes[ 0 ];\n  } else {\n    // Try convertible dataTypes\n    for ( type in responses ) {\n      if ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n        finalDataType = type;\n        break;\n      }\n      if ( !firstDataType ) {\n        firstDataType = type;\n      }\n    }\n    // Or just use first one\n    finalDataType = finalDataType || firstDataType;\n  }\n\n  // If we found a dataType\n  // We add the dataType to the list if needed\n  // and return the corresponding response\n  if ( finalDataType ) {\n    if ( finalDataType !== dataTypes[ 0 ] ) {\n      dataTypes.unshift( finalDataType );\n    }\n    return responses[ finalDataType ];\n  }\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n  var conv2, current, conv, tmp, prev,\n    converters = {},\n    // Work with a copy of dataTypes in case we need to modify it for conversion\n    dataTypes = s.dataTypes.slice();\n\n  // Create converters map with lowercased keys\n  if ( dataTypes[ 1 ] ) {\n    for ( conv in s.converters ) {\n      converters[ conv.toLowerCase() ] = s.converters[ conv ];\n    }\n  }\n\n  current = dataTypes.shift();\n\n  // Convert to each sequential dataType\n  while ( current ) {\n\n    if ( s.responseFields[ current ] ) {\n      jqXHR[ s.responseFields[ current ] ] = response;\n    }\n\n    // Apply the dataFilter if provided\n    if ( !prev && isSuccess && s.dataFilter ) {\n      response = s.dataFilter( response, s.dataType );\n    }\n\n    prev = current;\n    current = dataTypes.shift();\n\n    if ( current ) {\n\n      // There's only work to do if current dataType is non-auto\n      if ( current === \"*\" ) {\n\n        current = prev;\n\n      // Convert response if prev dataType is non-auto and differs from current\n      } else if ( prev !== \"*\" && prev !== current ) {\n\n        // Seek a direct converter\n        conv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n        // If none found, seek a pair\n        if ( !conv ) {\n          for ( conv2 in converters ) {\n\n            // If conv2 outputs current\n            tmp = conv2.split( \" \" );\n            if ( tmp[ 1 ] === current ) {\n\n              // If prev can be converted to accepted input\n              conv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n                converters[ \"* \" + tmp[ 0 ] ];\n              if ( conv ) {\n                // Condense equivalence converters\n                if ( conv === true ) {\n                  conv = converters[ conv2 ];\n\n                // Otherwise, insert the intermediate dataType\n                } else if ( converters[ conv2 ] !== true ) {\n                  current = tmp[ 0 ];\n                  dataTypes.unshift( tmp[ 1 ] );\n                }\n                break;\n              }\n            }\n          }\n        }\n\n        // Apply converter (if not an equivalence)\n        if ( conv !== true ) {\n\n          // Unless errors are allowed to bubble, catch and return them\n          if ( conv && s[ \"throws\" ] ) {\n            response = conv( response );\n          } else {\n            try {\n              response = conv( response );\n            } catch ( e ) {\n              return { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n            }\n          }\n        }\n      }\n    }\n  }\n\n  return { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n  // Counter for holding the number of active queries\n  active: 0,\n\n  // Last-Modified header cache for next request\n  lastModified: {},\n  etag: {},\n\n  ajaxSettings: {\n    url: ajaxLocation,\n    type: \"GET\",\n    isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n    global: true,\n    processData: true,\n    async: true,\n    contentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n    /*\n    timeout: 0,\n    data: null,\n    dataType: null,\n    username: null,\n    password: null,\n    cache: null,\n    throws: false,\n    traditional: false,\n    headers: {},\n    */\n\n    accepts: {\n      \"*\": allTypes,\n      text: \"text/plain\",\n      html: \"text/html\",\n      xml: \"application/xml, text/xml\",\n      json: \"application/json, text/javascript\"\n    },\n\n    contents: {\n      xml: /xml/,\n      html: /html/,\n      json: /json/\n    },\n\n    responseFields: {\n      xml: \"responseXML\",\n      text: \"responseText\",\n      json: \"responseJSON\"\n    },\n\n    // Data converters\n    // Keys separate source (or catchall \"*\") and destination types with a single space\n    converters: {\n\n      // Convert anything to text\n      \"* text\": String,\n\n      // Text to html (true = no transformation)\n      \"text html\": true,\n\n      // Evaluate text as a json expression\n      \"text json\": jQuery.parseJSON,\n\n      // Parse text as xml\n      \"text xml\": jQuery.parseXML\n    },\n\n    // For options that shouldn't be deep extended:\n    // you can add your own custom options here if\n    // and when you create one that shouldn't be\n    // deep extended (see ajaxExtend)\n    flatOptions: {\n      url: true,\n      context: true\n    }\n  },\n\n  // Creates a full fledged settings object into target\n  // with both ajaxSettings and settings fields.\n  // If target is omitted, writes into ajaxSettings.\n  ajaxSetup: function( target, settings ) {\n    return settings ?\n\n      // Building a settings object\n      ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n      // Extending ajaxSettings\n      ajaxExtend( jQuery.ajaxSettings, target );\n  },\n\n  ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n  ajaxTransport: addToPrefiltersOrTransports( transports ),\n\n  // Main method\n  ajax: function( url, options ) {\n\n    // If url is an object, simulate pre-1.5 signature\n    if ( typeof url === \"object\" ) {\n      options = url;\n      url = undefined;\n    }\n\n    // Force options to be an object\n    options = options || {};\n\n    var // Cross-domain detection vars\n      parts,\n      // Loop variable\n      i,\n      // URL without anti-cache param\n      cacheURL,\n      // Response headers as string\n      responseHeadersString,\n      // timeout handle\n      timeoutTimer,\n\n      // To know if global events are to be dispatched\n      fireGlobals,\n\n      transport,\n      // Response headers\n      responseHeaders,\n      // Create the final options object\n      s = jQuery.ajaxSetup( {}, options ),\n      // Callbacks context\n      callbackContext = s.context || s,\n      // Context for global events is callbackContext if it is a DOM node or jQuery collection\n      globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n        jQuery( callbackContext ) :\n        jQuery.event,\n      // Deferreds\n      deferred = jQuery.Deferred(),\n      completeDeferred = jQuery.Callbacks(\"once memory\"),\n      // Status-dependent callbacks\n      statusCode = s.statusCode || {},\n      // Headers (they are sent all at once)\n      requestHeaders = {},\n      requestHeadersNames = {},\n      // The jqXHR state\n      state = 0,\n      // Default abort message\n      strAbort = \"canceled\",\n      // Fake xhr\n      jqXHR = {\n        readyState: 0,\n\n        // Builds headers hashtable if needed\n        getResponseHeader: function( key ) {\n          var match;\n          if ( state === 2 ) {\n            if ( !responseHeaders ) {\n              responseHeaders = {};\n              while ( (match = rheaders.exec( responseHeadersString )) ) {\n                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n              }\n            }\n            match = responseHeaders[ key.toLowerCase() ];\n          }\n          return match == null ? null : match;\n        },\n\n        // Raw string\n        getAllResponseHeaders: function() {\n          return state === 2 ? responseHeadersString : null;\n        },\n\n        // Caches the header\n        setRequestHeader: function( name, value ) {\n          var lname = name.toLowerCase();\n          if ( !state ) {\n            name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n            requestHeaders[ name ] = value;\n          }\n          return this;\n        },\n\n        // Overrides response content-type header\n        overrideMimeType: function( type ) {\n          if ( !state ) {\n            s.mimeType = type;\n          }\n          return this;\n        },\n\n        // Status-dependent callbacks\n        statusCode: function( map ) {\n          var code;\n          if ( map ) {\n            if ( state < 2 ) {\n              for ( code in map ) {\n                // Lazy-add the new callback in a way that preserves old ones\n                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n              }\n            } else {\n              // Execute the appropriate callbacks\n              jqXHR.always( map[ jqXHR.status ] );\n            }\n          }\n          return this;\n        },\n\n        // Cancel the request\n        abort: function( statusText ) {\n          var finalText = statusText || strAbort;\n          if ( transport ) {\n            transport.abort( finalText );\n          }\n          done( 0, finalText );\n          return this;\n        }\n      };\n\n    // Attach deferreds\n    deferred.promise( jqXHR ).complete = completeDeferred.add;\n    jqXHR.success = jqXHR.done;\n    jqXHR.error = jqXHR.fail;\n\n    // Remove hash character (#7531: and string promotion)\n    // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n    // Handle falsy url in the settings object (#10093: consistency with old signature)\n    // We also use the url parameter if available\n    s.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n    // Alias method option to type as per ticket #12004\n    s.type = options.method || options.type || s.method || s.type;\n\n    // Extract dataTypes list\n    s.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n    // A cross-domain request is in order when we have a protocol:host:port mismatch\n    if ( s.crossDomain == null ) {\n      parts = rurl.exec( s.url.toLowerCase() );\n      s.crossDomain = !!( parts &&\n        ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n          ( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n            ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n      );\n    }\n\n    // Convert data if not already a string\n    if ( s.data && s.processData && typeof s.data !== \"string\" ) {\n      s.data = jQuery.param( s.data, s.traditional );\n    }\n\n    // Apply prefilters\n    inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n    // If request was aborted inside a prefilter, stop there\n    if ( state === 2 ) {\n      return jqXHR;\n    }\n\n    // We can fire global events as of now if asked to\n    fireGlobals = s.global;\n\n    // Watch for a new set of requests\n    if ( fireGlobals && jQuery.active++ === 0 ) {\n      jQuery.event.trigger(\"ajaxStart\");\n    }\n\n    // Uppercase the type\n    s.type = s.type.toUpperCase();\n\n    // Determine if request has content\n    s.hasContent = !rnoContent.test( s.type );\n\n    // Save the URL in case we're toying with the If-Modified-Since\n    // and/or If-None-Match header later on\n    cacheURL = s.url;\n\n    // More options handling for requests with no content\n    if ( !s.hasContent ) {\n\n      // If data is available, append data to url\n      if ( s.data ) {\n        cacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n        // #9682: remove data so that it's not used in an eventual retry\n        delete s.data;\n      }\n\n      // Add anti-cache in url if needed\n      if ( s.cache === false ) {\n        s.url = rts.test( cacheURL ) ?\n\n          // If there is already a '_' parameter, set its value\n          cacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n          // Otherwise add one to the end\n          cacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n      }\n    }\n\n    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n    if ( s.ifModified ) {\n      if ( jQuery.lastModified[ cacheURL ] ) {\n        jqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n      }\n      if ( jQuery.etag[ cacheURL ] ) {\n        jqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n      }\n    }\n\n    // Set the correct header, if data is being sent\n    if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n      jqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n    }\n\n    // Set the Accepts header for the server, depending on the dataType\n    jqXHR.setRequestHeader(\n      \"Accept\",\n      s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n        s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n        s.accepts[ \"*\" ]\n    );\n\n    // Check for headers option\n    for ( i in s.headers ) {\n      jqXHR.setRequestHeader( i, s.headers[ i ] );\n    }\n\n    // Allow custom headers/mimetypes and early abort\n    if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n      // Abort if not done already and return\n      return jqXHR.abort();\n    }\n\n    // aborting is no longer a cancellation\n    strAbort = \"abort\";\n\n    // Install callbacks on deferreds\n    for ( i in { success: 1, error: 1, complete: 1 } ) {\n      jqXHR[ i ]( s[ i ] );\n    }\n\n    // Get transport\n    transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n    // If no transport, we auto-abort\n    if ( !transport ) {\n      done( -1, \"No Transport\" );\n    } else {\n      jqXHR.readyState = 1;\n\n      // Send global event\n      if ( fireGlobals ) {\n        globalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n      }\n      // Timeout\n      if ( s.async && s.timeout > 0 ) {\n        timeoutTimer = setTimeout(function() {\n          jqXHR.abort(\"timeout\");\n        }, s.timeout );\n      }\n\n      try {\n        state = 1;\n        transport.send( requestHeaders, done );\n      } catch ( e ) {\n        // Propagate exception as error if not done\n        if ( state < 2 ) {\n          done( -1, e );\n        // Simply rethrow otherwise\n        } else {\n          throw e;\n        }\n      }\n    }\n\n    // Callback for when everything is done\n    function done( status, nativeStatusText, responses, headers ) {\n      var isSuccess, success, error, response, modified,\n        statusText = nativeStatusText;\n\n      // Called once\n      if ( state === 2 ) {\n        return;\n      }\n\n      // State is \"done\" now\n      state = 2;\n\n      // Clear timeout if it exists\n      if ( timeoutTimer ) {\n        clearTimeout( timeoutTimer );\n      }\n\n      // Dereference transport for early garbage collection\n      // (no matter how long the jqXHR object will be used)\n      transport = undefined;\n\n      // Cache response headers\n      responseHeadersString = headers || \"\";\n\n      // Set readyState\n      jqXHR.readyState = status > 0 ? 4 : 0;\n\n      // Determine if successful\n      isSuccess = status >= 200 && status < 300 || status === 304;\n\n      // Get response data\n      if ( responses ) {\n        response = ajaxHandleResponses( s, jqXHR, responses );\n      }\n\n      // Convert no matter what (that way responseXXX fields are always set)\n      response = ajaxConvert( s, response, jqXHR, isSuccess );\n\n      // If successful, handle type chaining\n      if ( isSuccess ) {\n\n        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n        if ( s.ifModified ) {\n          modified = jqXHR.getResponseHeader(\"Last-Modified\");\n          if ( modified ) {\n            jQuery.lastModified[ cacheURL ] = modified;\n          }\n          modified = jqXHR.getResponseHeader(\"etag\");\n          if ( modified ) {\n            jQuery.etag[ cacheURL ] = modified;\n          }\n        }\n\n        // if no content\n        if ( status === 204 || s.type === \"HEAD\" ) {\n          statusText = \"nocontent\";\n\n        // if not modified\n        } else if ( status === 304 ) {\n          statusText = \"notmodified\";\n\n        // If we have data, let's convert it\n        } else {\n          statusText = response.state;\n          success = response.data;\n          error = response.error;\n          isSuccess = !error;\n        }\n      } else {\n        // We extract error from statusText\n        // then normalize statusText and status for non-aborts\n        error = statusText;\n        if ( status || !statusText ) {\n          statusText = \"error\";\n          if ( status < 0 ) {\n            status = 0;\n          }\n        }\n      }\n\n      // Set data for the fake xhr object\n      jqXHR.status = status;\n      jqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n      // Success/Error\n      if ( isSuccess ) {\n        deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n      } else {\n        deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n      }\n\n      // Status-dependent callbacks\n      jqXHR.statusCode( statusCode );\n      statusCode = undefined;\n\n      if ( fireGlobals ) {\n        globalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n          [ jqXHR, s, isSuccess ? success : error ] );\n      }\n\n      // Complete\n      completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n      if ( fireGlobals ) {\n        globalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n        // Handle the global AJAX counter\n        if ( !( --jQuery.active ) ) {\n          jQuery.event.trigger(\"ajaxStop\");\n        }\n      }\n    }\n\n    return jqXHR;\n  },\n\n  getJSON: function( url, data, callback ) {\n    return jQuery.get( url, data, callback, \"json\" );\n  },\n\n  getScript: function( url, callback ) {\n    return jQuery.get( url, undefined, callback, \"script\" );\n  }\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n  jQuery[ method ] = function( url, data, callback, type ) {\n    // shift arguments if data argument was omitted\n    if ( jQuery.isFunction( data ) ) {\n      type = type || callback;\n      callback = data;\n      data = undefined;\n    }\n\n    return jQuery.ajax({\n      url: url,\n      type: method,\n      dataType: type,\n      data: data,\n      success: callback\n    });\n  };\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n  jQuery.fn[ type ] = function( fn ) {\n    return this.on( type, fn );\n  };\n});\n\n\njQuery._evalUrl = function( url ) {\n  return jQuery.ajax({\n    url: url,\n    type: \"GET\",\n    dataType: \"script\",\n    async: false,\n    global: false,\n    \"throws\": true\n  });\n};\n\n\njQuery.fn.extend({\n  wrapAll: function( html ) {\n    if ( jQuery.isFunction( html ) ) {\n      return this.each(function(i) {\n        jQuery(this).wrapAll( html.call(this, i) );\n      });\n    }\n\n    if ( this[0] ) {\n      // The elements to wrap the target around\n      var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n      if ( this[0].parentNode ) {\n        wrap.insertBefore( this[0] );\n      }\n\n      wrap.map(function() {\n        var elem = this;\n\n        while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n          elem = elem.firstChild;\n        }\n\n        return elem;\n      }).append( this );\n    }\n\n    return this;\n  },\n\n  wrapInner: function( html ) {\n    if ( jQuery.isFunction( html ) ) {\n      return this.each(function(i) {\n        jQuery(this).wrapInner( html.call(this, i) );\n      });\n    }\n\n    return this.each(function() {\n      var self = jQuery( this ),\n        contents = self.contents();\n\n      if ( contents.length ) {\n        contents.wrapAll( html );\n\n      } else {\n        self.append( html );\n      }\n    });\n  },\n\n  wrap: function( html ) {\n    var isFunction = jQuery.isFunction( html );\n\n    return this.each(function(i) {\n      jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n    });\n  },\n\n  unwrap: function() {\n    return this.parent().each(function() {\n      if ( !jQuery.nodeName( this, \"body\" ) ) {\n        jQuery( this ).replaceWith( this.childNodes );\n      }\n    }).end();\n  }\n});\n\n\njQuery.expr.filters.hidden = function( elem ) {\n  // Support: Opera <= 12.12\n  // Opera reports offsetWidths and offsetHeights less than zero on some elements\n  return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n    (!support.reliableHiddenOffsets() &&\n      ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n};\n\njQuery.expr.filters.visible = function( elem ) {\n  return !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n  rbracket = /\\[\\]$/,\n  rCRLF = /\\r?\\n/g,\n  rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n  rsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n  var name;\n\n  if ( jQuery.isArray( obj ) ) {\n    // Serialize array item.\n    jQuery.each( obj, function( i, v ) {\n      if ( traditional || rbracket.test( prefix ) ) {\n        // Treat each array item as a scalar.\n        add( prefix, v );\n\n      } else {\n        // Item is non-scalar (array or object), encode its numeric index.\n        buildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n      }\n    });\n\n  } else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n    // Serialize object item.\n    for ( name in obj ) {\n      buildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n    }\n\n  } else {\n    // Serialize scalar item.\n    add( prefix, obj );\n  }\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n  var prefix,\n    s = [],\n    add = function( key, value ) {\n      // If value is a function, invoke it and return its value\n      value = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n      s[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n    };\n\n  // Set traditional to true for jQuery <= 1.3.2 behavior.\n  if ( traditional === undefined ) {\n    traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n  }\n\n  // If an array was passed in, assume that it is an array of form elements.\n  if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n    // Serialize the form elements\n    jQuery.each( a, function() {\n      add( this.name, this.value );\n    });\n\n  } else {\n    // If traditional, encode the \"old\" way (the way 1.3.2 or older\n    // did it), otherwise encode params recursively.\n    for ( prefix in a ) {\n      buildParams( prefix, a[ prefix ], traditional, add );\n    }\n  }\n\n  // Return the resulting serialization\n  return s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n  serialize: function() {\n    return jQuery.param( this.serializeArray() );\n  },\n  serializeArray: function() {\n    return this.map(function() {\n      // Can add propHook for \"elements\" to filter or add form elements\n      var elements = jQuery.prop( this, \"elements\" );\n      return elements ? jQuery.makeArray( elements ) : this;\n    })\n    .filter(function() {\n      var type = this.type;\n      // Use .is(\":disabled\") so that fieldset[disabled] works\n      return this.name && !jQuery( this ).is( \":disabled\" ) &&\n        rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n        ( this.checked || !rcheckableType.test( type ) );\n    })\n    .map(function( i, elem ) {\n      var val = jQuery( this ).val();\n\n      return val == null ?\n        null :\n        jQuery.isArray( val ) ?\n          jQuery.map( val, function( val ) {\n            return { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n          }) :\n          { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n    }).get();\n  }\n});\n\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?\n  // Support: IE6+\n  function() {\n\n    // XHR cannot access local files, always use ActiveX for that case\n    return !this.isLocal &&\n\n      // Support: IE7-8\n      // oldIE XHR does not support non-RFC2616 methods (#13240)\n      // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx\n      // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9\n      // Although this check for six methods instead of eight\n      // since IE also does not support \"trace\" and \"connect\"\n      /^(get|post|head|put|delete|options)$/i.test( this.type ) &&\n\n      createStandardXHR() || createActiveXHR();\n  } :\n  // For all other browsers, use the standard XMLHttpRequest object\n  createStandardXHR;\n\nvar xhrId = 0,\n  xhrCallbacks = {},\n  xhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE<10\n// Open requests must be manually aborted on unload (#5280)\nif ( window.ActiveXObject ) {\n  jQuery( window ).on( \"unload\", function() {\n    for ( var key in xhrCallbacks ) {\n      xhrCallbacks[ key ]( undefined, true );\n    }\n  });\n}\n\n// Determine support properties\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n  jQuery.ajaxTransport(function( options ) {\n    // Cross domain only allowed if supported through XMLHttpRequest\n    if ( !options.crossDomain || support.cors ) {\n\n      var callback;\n\n      return {\n        send: function( headers, complete ) {\n          var i,\n            xhr = options.xhr(),\n            id = ++xhrId;\n\n          // Open the socket\n          xhr.open( options.type, options.url, options.async, options.username, options.password );\n\n          // Apply custom fields if provided\n          if ( options.xhrFields ) {\n            for ( i in options.xhrFields ) {\n              xhr[ i ] = options.xhrFields[ i ];\n            }\n          }\n\n          // Override mime type if needed\n          if ( options.mimeType && xhr.overrideMimeType ) {\n            xhr.overrideMimeType( options.mimeType );\n          }\n\n          // X-Requested-With header\n          // For cross-domain requests, seeing as conditions for a preflight are\n          // akin to a jigsaw puzzle, we simply never set it to be sure.\n          // (it can always be set on a per-request basis or even using ajaxSetup)\n          // For same-domain requests, won't change header if already provided.\n          if ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n            headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n          }\n\n          // Set headers\n          for ( i in headers ) {\n            // Support: IE<9\n            // IE's ActiveXObject throws a 'Type Mismatch' exception when setting\n            // request header to a null-value.\n            //\n            // To keep consistent with other XHR implementations, cast the value\n            // to string and ignore `undefined`.\n            if ( headers[ i ] !== undefined ) {\n              xhr.setRequestHeader( i, headers[ i ] + \"\" );\n            }\n          }\n\n          // Do send the request\n          // This may raise an exception which is actually\n          // handled in jQuery.ajax (so no try/catch here)\n          xhr.send( ( options.hasContent && options.data ) || null );\n\n          // Listener\n          callback = function( _, isAbort ) {\n            var status, statusText, responses;\n\n            // Was never called and is aborted or complete\n            if ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n              // Clean up\n              delete xhrCallbacks[ id ];\n              callback = undefined;\n              xhr.onreadystatechange = jQuery.noop;\n\n              // Abort manually if needed\n              if ( isAbort ) {\n                if ( xhr.readyState !== 4 ) {\n                  xhr.abort();\n                }\n              } else {\n                responses = {};\n                status = xhr.status;\n\n                // Support: IE<10\n                // Accessing binary-data responseText throws an exception\n                // (#11426)\n                if ( typeof xhr.responseText === \"string\" ) {\n                  responses.text = xhr.responseText;\n                }\n\n                // Firefox throws an exception when accessing\n                // statusText for faulty cross-domain requests\n                try {\n                  statusText = xhr.statusText;\n                } catch( e ) {\n                  // We normalize with Webkit giving an empty statusText\n                  statusText = \"\";\n                }\n\n                // Filter status for non standard behaviors\n\n                // If the request is local and we have data: assume a success\n                // (success with no data won't get notified, that's the best we\n                // can do given current implementations)\n                if ( !status && options.isLocal && !options.crossDomain ) {\n                  status = responses.text ? 200 : 404;\n                // IE - #1450: sometimes returns 1223 when it should be 204\n                } else if ( status === 1223 ) {\n                  status = 204;\n                }\n              }\n            }\n\n            // Call complete if needed\n            if ( responses ) {\n              complete( status, statusText, responses, xhr.getAllResponseHeaders() );\n            }\n          };\n\n          if ( !options.async ) {\n            // if we're in sync mode we fire the callback\n            callback();\n          } else if ( xhr.readyState === 4 ) {\n            // (IE6 & IE7) if it's in cache and has been\n            // retrieved directly we need to fire the callback\n            setTimeout( callback );\n          } else {\n            // Add to the list of active xhr callbacks\n            xhr.onreadystatechange = xhrCallbacks[ id ] = callback;\n          }\n        },\n\n        abort: function() {\n          if ( callback ) {\n            callback( undefined, true );\n          }\n        }\n      };\n    }\n  });\n}\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n  try {\n    return new window.XMLHttpRequest();\n  } catch( e ) {}\n}\n\nfunction createActiveXHR() {\n  try {\n    return new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n  } catch( e ) {}\n}\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n  accepts: {\n    script: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n  },\n  contents: {\n    script: /(?:java|ecma)script/\n  },\n  converters: {\n    \"text script\": function( text ) {\n      jQuery.globalEval( text );\n      return text;\n    }\n  }\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n  if ( s.cache === undefined ) {\n    s.cache = false;\n  }\n  if ( s.crossDomain ) {\n    s.type = \"GET\";\n    s.global = false;\n  }\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n  // This transport only deals with cross domain requests\n  if ( s.crossDomain ) {\n\n    var script,\n      head = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n    return {\n\n      send: function( _, callback ) {\n\n        script = document.createElement(\"script\");\n\n        script.async = true;\n\n        if ( s.scriptCharset ) {\n          script.charset = s.scriptCharset;\n        }\n\n        script.src = s.url;\n\n        // Attach handlers for all browsers\n        script.onload = script.onreadystatechange = function( _, isAbort ) {\n\n          if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n            // Handle memory leak in IE\n            script.onload = script.onreadystatechange = null;\n\n            // Remove the script\n            if ( script.parentNode ) {\n              script.parentNode.removeChild( script );\n            }\n\n            // Dereference the script\n            script = null;\n\n            // Callback if not abort\n            if ( !isAbort ) {\n              callback( 200, \"success\" );\n            }\n          }\n        };\n\n        // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n        // Use native DOM manipulation to avoid our domManip AJAX trickery\n        head.insertBefore( script, head.firstChild );\n      },\n\n      abort: function() {\n        if ( script ) {\n          script.onload( undefined, true );\n        }\n      }\n    };\n  }\n});\n\n\n\n\nvar oldCallbacks = [],\n  rjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n  jsonp: \"callback\",\n  jsonpCallback: function() {\n    var callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n    this[ callback ] = true;\n    return callback;\n  }\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n  var callbackName, overwritten, responseContainer,\n    jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n      \"url\" :\n      typeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n    );\n\n  // Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n  if ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n    // Get callback name, remembering preexisting value associated with it\n    callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n      s.jsonpCallback() :\n      s.jsonpCallback;\n\n    // Insert callback into url or form data\n    if ( jsonProp ) {\n      s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n    } else if ( s.jsonp !== false ) {\n      s.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n    }\n\n    // Use data converter to retrieve json after script execution\n    s.converters[\"script json\"] = function() {\n      if ( !responseContainer ) {\n        jQuery.error( callbackName + \" was not called\" );\n      }\n      return responseContainer[ 0 ];\n    };\n\n    // force json dataType\n    s.dataTypes[ 0 ] = \"json\";\n\n    // Install callback\n    overwritten = window[ callbackName ];\n    window[ callbackName ] = function() {\n      responseContainer = arguments;\n    };\n\n    // Clean-up function (fires after converters)\n    jqXHR.always(function() {\n      // Restore preexisting value\n      window[ callbackName ] = overwritten;\n\n      // Save back as free\n      if ( s[ callbackName ] ) {\n        // make sure that re-using the options doesn't screw things around\n        s.jsonpCallback = originalSettings.jsonpCallback;\n\n        // save the callback name for future use\n        oldCallbacks.push( callbackName );\n      }\n\n      // Call if it was a function and we have a response\n      if ( responseContainer && jQuery.isFunction( overwritten ) ) {\n        overwritten( responseContainer[ 0 ] );\n      }\n\n      responseContainer = overwritten = undefined;\n    });\n\n    // Delegate to script\n    return \"script\";\n  }\n});\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n  if ( !data || typeof data !== \"string\" ) {\n    return null;\n  }\n  if ( typeof context === \"boolean\" ) {\n    keepScripts = context;\n    context = false;\n  }\n  context = context || document;\n\n  var parsed = rsingleTag.exec( data ),\n    scripts = !keepScripts && [];\n\n  // Single tag\n  if ( parsed ) {\n    return [ context.createElement( parsed[1] ) ];\n  }\n\n  parsed = jQuery.buildFragment( [ data ], context, scripts );\n\n  if ( scripts && scripts.length ) {\n    jQuery( scripts ).remove();\n  }\n\n  return jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n  if ( typeof url !== \"string\" && _load ) {\n    return _load.apply( this, arguments );\n  }\n\n  var selector, response, type,\n    self = this,\n    off = url.indexOf(\" \");\n\n  if ( off >= 0 ) {\n    selector = jQuery.trim( url.slice( off, url.length ) );\n    url = url.slice( 0, off );\n  }\n\n  // If it's a function\n  if ( jQuery.isFunction( params ) ) {\n\n    // We assume that it's the callback\n    callback = params;\n    params = undefined;\n\n  // Otherwise, build a param string\n  } else if ( params && typeof params === \"object\" ) {\n    type = \"POST\";\n  }\n\n  // If we have elements to modify, make the request\n  if ( self.length > 0 ) {\n    jQuery.ajax({\n      url: url,\n\n      // if \"type\" variable is undefined, then \"GET\" method will be used\n      type: type,\n      dataType: \"html\",\n      data: params\n    }).done(function( responseText ) {\n\n      // Save response for use in complete callback\n      response = arguments;\n\n      self.html( selector ?\n\n        // If a selector was specified, locate the right elements in a dummy div\n        // Exclude scripts to avoid IE 'Permission Denied' errors\n        jQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n        // Otherwise use the full result\n        responseText );\n\n    }).complete( callback && function( jqXHR, status ) {\n      self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n    });\n  }\n\n  return this;\n};\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n  return jQuery.grep(jQuery.timers, function( fn ) {\n    return elem === fn.elem;\n  }).length;\n};\n\n\n\n\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n  return jQuery.isWindow( elem ) ?\n    elem :\n    elem.nodeType === 9 ?\n      elem.defaultView || elem.parentWindow :\n      false;\n}\n\njQuery.offset = {\n  setOffset: function( elem, options, i ) {\n    var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n      position = jQuery.css( elem, \"position\" ),\n      curElem = jQuery( elem ),\n      props = {};\n\n    // set position first, in-case top/left are set even on static elem\n    if ( position === \"static\" ) {\n      elem.style.position = \"relative\";\n    }\n\n    curOffset = curElem.offset();\n    curCSSTop = jQuery.css( elem, \"top\" );\n    curCSSLeft = jQuery.css( elem, \"left\" );\n    calculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n      jQuery.inArray(\"auto\", [ curCSSTop, curCSSLeft ] ) > -1;\n\n    // need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n    if ( calculatePosition ) {\n      curPosition = curElem.position();\n      curTop = curPosition.top;\n      curLeft = curPosition.left;\n    } else {\n      curTop = parseFloat( curCSSTop ) || 0;\n      curLeft = parseFloat( curCSSLeft ) || 0;\n    }\n\n    if ( jQuery.isFunction( options ) ) {\n      options = options.call( elem, i, curOffset );\n    }\n\n    if ( options.top != null ) {\n      props.top = ( options.top - curOffset.top ) + curTop;\n    }\n    if ( options.left != null ) {\n      props.left = ( options.left - curOffset.left ) + curLeft;\n    }\n\n    if ( \"using\" in options ) {\n      options.using.call( elem, props );\n    } else {\n      curElem.css( props );\n    }\n  }\n};\n\njQuery.fn.extend({\n  offset: function( options ) {\n    if ( arguments.length ) {\n      return options === undefined ?\n        this :\n        this.each(function( i ) {\n          jQuery.offset.setOffset( this, options, i );\n        });\n    }\n\n    var docElem, win,\n      box = { top: 0, left: 0 },\n      elem = this[ 0 ],\n      doc = elem && elem.ownerDocument;\n\n    if ( !doc ) {\n      return;\n    }\n\n    docElem = doc.documentElement;\n\n    // Make sure it's not a disconnected DOM node\n    if ( !jQuery.contains( docElem, elem ) ) {\n      return box;\n    }\n\n    // If we don't have gBCR, just use 0,0 rather than error\n    // BlackBerry 5, iOS 3 (original iPhone)\n    if ( typeof elem.getBoundingClientRect !== strundefined ) {\n      box = elem.getBoundingClientRect();\n    }\n    win = getWindow( doc );\n    return {\n      top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n      left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n    };\n  },\n\n  position: function() {\n    if ( !this[ 0 ] ) {\n      return;\n    }\n\n    var offsetParent, offset,\n      parentOffset = { top: 0, left: 0 },\n      elem = this[ 0 ];\n\n    // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n    if ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n      // we assume that getBoundingClientRect is available when computed position is fixed\n      offset = elem.getBoundingClientRect();\n    } else {\n      // Get *real* offsetParent\n      offsetParent = this.offsetParent();\n\n      // Get correct offsets\n      offset = this.offset();\n      if ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n        parentOffset = offsetParent.offset();\n      }\n\n      // Add offsetParent borders\n      parentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n      parentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n    }\n\n    // Subtract parent offsets and element margins\n    // note: when an element has margin: auto the offsetLeft and marginLeft\n    // are the same in Safari causing offset.left to incorrectly be 0\n    return {\n      top:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n      left: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n    };\n  },\n\n  offsetParent: function() {\n    return this.map(function() {\n      var offsetParent = this.offsetParent || docElem;\n\n      while ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n        offsetParent = offsetParent.offsetParent;\n      }\n      return offsetParent || docElem;\n    });\n  }\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n  var top = /Y/.test( prop );\n\n  jQuery.fn[ method ] = function( val ) {\n    return access( this, function( elem, method, val ) {\n      var win = getWindow( elem );\n\n      if ( val === undefined ) {\n        return win ? (prop in win) ? win[ prop ] :\n          win.document.documentElement[ method ] :\n          elem[ method ];\n      }\n\n      if ( win ) {\n        win.scrollTo(\n          !top ? val : jQuery( win ).scrollLeft(),\n          top ? val : jQuery( win ).scrollTop()\n        );\n\n      } else {\n        elem[ method ] = val;\n      }\n    }, method, val, arguments.length, null );\n  };\n});\n\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// getComputedStyle returns percent when specified for top/left/bottom/right\n// rather than make the css module depend on the offset module, we just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n  jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n    function( elem, computed ) {\n      if ( computed ) {\n        computed = curCSS( elem, prop );\n        // if curCSS returns percentage, fallback to offset\n        return rnumnonpx.test( computed ) ?\n          jQuery( elem ).position()[ prop ] + \"px\" :\n          computed;\n      }\n    }\n  );\n});\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n  jQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n    // margin is only for outerHeight, outerWidth\n    jQuery.fn[ funcName ] = function( margin, value ) {\n      var chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n        extra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n      return access( this, function( elem, type, value ) {\n        var doc;\n\n        if ( jQuery.isWindow( elem ) ) {\n          // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n          // isn't a whole lot we can do. See pull request at this URL for discussion:\n          // https://github.com/jquery/jquery/pull/764\n          return elem.document.documentElement[ \"client\" + name ];\n        }\n\n        // Get document width or height\n        if ( elem.nodeType === 9 ) {\n          doc = elem.documentElement;\n\n          // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n          // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n          return Math.max(\n            elem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n            elem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n            doc[ \"client\" + name ]\n          );\n        }\n\n        return value === undefined ?\n          // Get width or height on the element, requesting but not forcing parseFloat\n          jQuery.css( elem, type, extra ) :\n\n          // Set width or height on the element\n          jQuery.style( elem, type, value, extra );\n      }, type, chainable ? margin : undefined, chainable, null );\n    };\n  });\n});\n\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n  return this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n  define( \"jquery\", [], function() {\n    return jQuery;\n  });\n}\n\n\n\n\nvar\n  // Map over jQuery in case of overwrite\n  _jQuery = window.jQuery,\n\n  // Map over the $ in case of overwrite\n  _$ = window.$;\n\njQuery.noConflict = function( deep ) {\n  if ( window.$ === jQuery ) {\n    window.$ = _$;\n  }\n\n  if ( deep && window.jQuery === jQuery ) {\n    window.jQuery = _jQuery;\n  }\n\n  return jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in\n// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n  window.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n\n}));"
  },
  {
    "path": "app/vendor/jquery.emojiarea/jquery.emojiarea-orig.js",
    "content": "/**\n * emojiarea - A rich textarea control that supports emojis, WYSIWYG-style.\n * Copyright (c) 2012 DIY Co\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@diy.org>\n */\n\n(function($, window, document) {\n\n  var ELEMENT_NODE = 1;\n  var TEXT_NODE = 3;\n  var TAGS_BLOCK = ['p', 'div', 'pre', 'form'];\n  var KEY_ESC = 27;\n  var KEY_TAB = 9;\n\n  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n  $.emojiarea = {\n    path: '',\n    icons: {},\n    defaults: {\n      button: null,\n      buttonLabel: 'Emojis',\n      buttonPosition: 'after'\n    }\n  };\n\n  $.fn.emojiarea = function(options) {\n    options = $.extend({}, $.emojiarea.defaults, options);\n    return this.each(function() {\n      var $textarea = $(this);\n      if ('contentEditable' in document.body && options.wysiwyg !== false) {\n        new EmojiArea_WYSIWYG($textarea, options);\n      } else {\n        new EmojiArea_Plain($textarea, options);\n      }\n    });\n  };\n\n  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n  var util = {};\n\n  util.restoreSelection = (function() {\n    if (window.getSelection) {\n      return function(savedSelection) {\n        var sel = window.getSelection();\n        sel.removeAllRanges();\n        for (var i = 0, len = savedSelection.length; i < len; ++i) {\n          sel.addRange(savedSelection[i]);\n        }\n      };\n    } else if (document.selection && document.selection.createRange) {\n      return function(savedSelection) {\n        if (savedSelection) {\n          savedSelection.select();\n        }\n      };\n    }\n  })();\n\n  util.saveSelection = (function() {\n    if (window.getSelection) {\n      return function() {\n        var sel = window.getSelection(), ranges = [];\n        if (sel.rangeCount) {\n          for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n            ranges.push(sel.getRangeAt(i));\n          }\n        }\n        return ranges;\n      };\n    } else if (document.selection && document.selection.createRange) {\n      return function() {\n        var sel = document.selection;\n        return (sel.type.toLowerCase() !== 'none') ? sel.createRange() : null;\n      };\n    }\n  })();\n\n  util.replaceSelection = (function() {\n    if (window.getSelection) {\n      return function(content) {\n        var range, sel = window.getSelection();\n        var node = typeof content === 'string' ? document.createTextNode(content) : content;\n        if (sel.getRangeAt && sel.rangeCount) {\n          range = sel.getRangeAt(0);\n          range.deleteContents();\n          range.insertNode(document.createTextNode(' '));\n          range.insertNode(node);\n          range.setStart(node, 0);\n\n          window.setTimeout(function() {\n            range = document.createRange();\n            range.setStartAfter(node);\n            range.collapse(true);\n            sel.removeAllRanges();\n            sel.addRange(range);\n          }, 0);\n        }\n      }\n    } else if (document.selection && document.selection.createRange) {\n      return function(content) {\n        var range = document.selection.createRange();\n        if (typeof content === 'string') {\n          range.text = content;\n        } else {\n          range.pasteHTML(content.outerHTML);\n        }\n      }\n    }\n  })();\n\n  util.insertAtCursor = function(text, el) {\n    text = ' ' + text;\n    var val = el.value, endIndex, startIndex, range;\n    if (typeof el.selectionStart != 'undefined' && typeof el.selectionEnd != 'undefined') {\n      startIndex = el.selectionStart;\n      endIndex = el.selectionEnd;\n      el.value = val.substring(0, startIndex) + text + val.substring(el.selectionEnd);\n      el.selectionStart = el.selectionEnd = startIndex + text.length;\n    } else if (typeof document.selection != 'undefined' && typeof document.selection.createRange != 'undefined') {\n      el.focus();\n      range = document.selection.createRange();\n      range.text = text;\n      range.select();\n    }\n  };\n\n  util.extend = function(a, b) {\n    if (typeof a === 'undefined' || !a) { a = {}; }\n    if (typeof b === 'object') {\n      for (var key in b) {\n        if (b.hasOwnProperty(key)) {\n          a[key] = b[key];\n        }\n      }\n    }\n    return a;\n  };\n\n  util.escapeRegex = function(str) {\n    return (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n  };\n\n  util.htmlEntities = function(str) {\n    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n  };\n\n  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n  var EmojiArea = function() {};\n\n  EmojiArea.prototype.setup = function() {\n    var self = this;\n\n    this.$editor.on('focus', function() { self.hasFocus = true; });\n    this.$editor.on('blur', function() { self.hasFocus = false; });\n\n    this.setupButton();\n  };\n\n  EmojiArea.prototype.setupButton = function() {\n    var self = this;\n    var $button;\n\n    if (this.options.button) {\n      $button = $(this.options.button);\n    } else if (this.options.button !== false) {\n      $button = $('<a href=\"javascript:void(0)\">');\n      $button.html(this.options.buttonLabel);\n      $button.addClass('emoji-button');\n      $button.attr({title: this.options.buttonLabel});\n      this.$editor[this.options.buttonPosition]($button);\n    } else {\n      $button = $('');\n    }\n\n    $button.on('click', function(e) {\n      EmojiMenu.show(self);\n      e.stopPropagation();\n    });\n\n    this.$button = $button;\n  };\n\n  EmojiArea.createIcon = function(emoji) {\n    var filename = $.emojiarea.icons[emoji];\n    var path = $.emojiarea.path || '';\n    if (path.length && path.charAt(path.length - 1) !== '/') {\n      path += '/';\n    }\n    return '<img src=\"' + path + filename + '\" alt=\"' + util.htmlEntities(emoji) + '\">';\n  };\n\n  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n  /**\n   * Editor (plain-text)\n   *\n   * @constructor\n   * @param {object} $textarea\n   * @param {object} options\n   */\n\n  var EmojiArea_Plain = function($textarea, options) {\n    this.options = options;\n    this.$textarea = $textarea;\n    this.$editor = $textarea;\n    this.setup();\n  };\n\n  EmojiArea_Plain.prototype.insert = function(emoji) {\n    if (!$.emojiarea.icons.hasOwnProperty(emoji)) return;\n    util.insertAtCursor(emoji, this.$textarea[0]);\n    this.$textarea.trigger('change');\n  };\n\n  EmojiArea_Plain.prototype.val = function() {\n    return this.$textarea.val();\n  };\n\n  util.extend(EmojiArea_Plain.prototype, EmojiArea.prototype);\n\n  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n  /**\n   * Editor (rich)\n   *\n   * @constructor\n   * @param {object} $textarea\n   * @param {object} options\n   */\n\n  var EmojiArea_WYSIWYG = function($textarea, options) {\n    var self = this;\n\n    this.options = options;\n    this.$textarea = $textarea;\n    this.$editor = $('<div>').addClass('emoji-wysiwyg-editor');\n    this.$editor.text($textarea.val());\n    this.$editor.attr({contenteditable: 'true'});\n    this.$editor.on('blur keyup paste', function() { return self.onChange.apply(self, arguments); });\n    this.$editor.on('mousedown focus', function() { document.execCommand('enableObjectResizing', false, false); });\n    this.$editor.on('blur', function() { document.execCommand('enableObjectResizing', true, true); });\n\n    var html = this.$editor.text();\n    var emojis = $.emojiarea.icons;\n    for (var key in emojis) {\n      if (emojis.hasOwnProperty(key)) {\n        html = html.replace(new RegExp(util.escapeRegex(key), 'g'), EmojiArea.createIcon(key));\n      }\n    }\n    this.$editor.html(html);\n\n    $textarea.hide().after(this.$editor);\n\n    this.setup();\n\n    this.$button.on('mousedown', function() {\n      if (self.hasFocus) {\n        self.selection = util.saveSelection();\n      }\n    });\n  };\n\n  EmojiArea_WYSIWYG.prototype.onChange = function() {\n    this.$textarea.val(this.val()).trigger('change');\n  };\n\n  EmojiArea_WYSIWYG.prototype.insert = function(emoji) {\n    var content;\n    var $img = $(EmojiArea.createIcon(emoji));\n    if ($img[0].attachEvent) {\n      $img[0].attachEvent('onresizestart', function(e) { e.returnValue = false; }, false);\n    }\n\n    this.$editor.trigger('focus');\n    if (this.selection) {\n      util.restoreSelection(this.selection);\n    }\n    try { util.replaceSelection($img[0]); } catch (e) {}\n    this.onChange();\n  };\n\n  EmojiArea_WYSIWYG.prototype.val = function() {\n    var lines = [];\n    var line  = [];\n\n    var flush = function() {\n      lines.push(line.join(''));\n      line = [];\n    };\n\n    var sanitizeNode = function(node) {\n      if (node.nodeType === TEXT_NODE) {\n        line.push(node.nodeValue);\n      } else if (node.nodeType === ELEMENT_NODE) {\n        var tagName = node.tagName.toLowerCase();\n        var isBlock = TAGS_BLOCK.indexOf(tagName) !== -1;\n\n        if (isBlock && line.length) flush();\n\n        if (tagName === 'img') {\n          var alt = node.getAttribute('alt') || '';\n          if (alt) line.push(alt);\n          return;\n        } else if (tagName === 'br') {\n          flush();\n        }\n\n        var children = node.childNodes;\n        for (var i = 0; i < children.length; i++) {\n          sanitizeNode(children[i]);\n        }\n\n        if (isBlock && line.length) flush();\n      }\n    };\n\n    var children = this.$editor[0].childNodes;\n    for (var i = 0; i < children.length; i++) {\n      sanitizeNode(children[i]);\n    }\n\n    if (line.length) flush();\n\n    return lines.join('\\n');\n  };\n\n  util.extend(EmojiArea_WYSIWYG.prototype, EmojiArea.prototype);\n\n  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n  /**\n   * Emoji Dropdown Menu\n   *\n   * @constructor\n   * @param {object} emojiarea\n   */\n  var EmojiMenu = function() {\n    var self = this;\n    var $body = $(document.body);\n    var $window = $(window);\n\n    this.visible = false;\n    this.emojiarea = null;\n    this.$menu = $('<div>');\n    this.$menu.addClass('emoji-menu');\n    this.$menu.hide();\n    this.$items = $('<div>').appendTo(this.$menu);\n\n    $body.append(this.$menu);\n\n    $body.on('keydown', function(e) {\n      if (e.keyCode === KEY_ESC || e.keyCode === KEY_TAB) {\n        self.hide();\n      }\n    });\n\n    $body.on('mouseup', function() {\n      self.hide();\n    });\n\n    $window.on('resize', function() {\n      if (self.visible) self.reposition();\n    });\n\n    this.$menu.on('mouseup', 'a', function(e) {\n      e.stopPropagation();\n      return false;\n    });\n\n    this.$menu.on('click', 'a', function(e) {\n      var emoji = $('.label', $(this)).text();\n      window.setTimeout(function() {\n        self.onItemSelected.apply(self, [emoji]);\n      }, 0);\n      e.stopPropagation();\n      return false;\n    });\n\n    this.load();\n  };\n\n  EmojiMenu.prototype.onItemSelected = function(emoji) {\n    this.emojiarea.insert(emoji);\n    this.hide();\n  };\n\n  EmojiMenu.prototype.load = function() {\n    var html = [];\n    var options = $.emojiarea.icons;\n    var path = $.emojiarea.path;\n    if (path.length && path.charAt(path.length - 1) !== '/') {\n      path += '/';\n    }\n\n    for (var key in options) {\n      if (options.hasOwnProperty(key)) {\n        var filename = options[key];\n        html.push('<a href=\"javascript:void(0)\" title=\"' + util.htmlEntities(key) + '\">' + EmojiArea.createIcon(key) + '<span class=\"label\">' + util.htmlEntities(key) + '</span></a>');\n      }\n    }\n\n    this.$items.html(html.join(''));\n  };\n\n  EmojiMenu.prototype.reposition = function() {\n    var $button = this.emojiarea.$button;\n    var offset = $button.offset();\n    offset.top += $button.outerHeight();\n    offset.left += Math.round($button.outerWidth() / 2);\n\n    this.$menu.css({\n      top: offset.top,\n      left: offset.left\n    });\n  };\n\n  EmojiMenu.prototype.hide = function(callback) {\n    if (this.emojiarea) {\n      this.emojiarea.menu = null;\n      this.emojiarea.$button.removeClass('on');\n      this.emojiarea = null;\n    }\n    this.visible = false;\n    this.$menu.hide();\n  };\n\n  EmojiMenu.prototype.show = function(emojiarea) {\n    if (this.emojiarea && this.emojiarea === emojiarea) return;\n    this.emojiarea = emojiarea;\n    this.emojiarea.menu = this;\n\n    this.reposition();\n    this.$menu.show();\n    this.visible = true;\n  };\n\n  EmojiMenu.show = (function() {\n    var menu = null;\n    return function(emojiarea) {\n      menu = menu || new EmojiMenu();\n      menu.show(emojiarea);\n    };\n  })();\n\n})(jQuery, window, document);"
  },
  {
    "path": "app/vendor/jquery.emojiarea/jquery.emojiarea.js",
    "content": "/**\n * emojiarea - A rich textarea control that supports emojis, WYSIWYG-style.\n * Copyright (c) 2012 DIY Co\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@diy.org>\n */\n\n /**\n * This file also contains some modifications by Igor Zhukov in order to add custom scrollbars to EmojiMenu\n * See keyword `MODIFICATION` in source code.\n */\n\n(function($, window, document) {\n\n\tvar ELEMENT_NODE = 1;\n\tvar TEXT_NODE = 3;\n\tvar TAGS_BLOCK = ['p', 'div', 'pre', 'form'];\n\tvar KEY_ESC = 27;\n\tvar KEY_TAB = 9;\n\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\t/*! MODIFICATION START\n\t Options 'spritesheetPath', 'spritesheetDimens', 'iconSize' added by Andre Staltz.\n\t */\n\t$.emojiarea = {\n\t\tpath: '',\n\t\tspritesheetPath: '',\n\t\tspritesheetDimens: [],\n\t\ticonSize: 20,\n\t\ticons: {},\n\t\tdefaults: {\n\t\t\tbutton: null,\n\t\t\tbuttonLabel: 'Emojis',\n\t\t\tbuttonPosition: 'after'\n\t\t}\n\t};\n\tvar defaultRecentEmojis = ':joy:,:kissing_heart:,:heart:,:heart_eyes:,:blush:,:grin:,:+1:,:relaxed:,:pensive:,:smile:,:sob:,:kiss:,:unamused:,:flushed:,:stuck_out_tongue_winking_eye:,:see_no_evil:,:wink:,:smiley:,:cry:,:stuck_out_tongue_closed_eyes:,:scream:,:rage:,:smirk:,:disappointed:,:sweat_smile:,:kissing_closed_eyes:,:speak_no_evil:,:relieved:,:grinning:,:yum:,:laughing:,:ok_hand:,:neutral_face:,:confused:'.split(',');\n\t/*! MODIFICATION END */\n\n\t$.fn.emojiarea = function(options) {\n\t\toptions = $.extend({}, $.emojiarea.defaults, options);\n\t\treturn this.each(function() {\n\t\t\tvar $textarea = $(this);\n\t\t\tif ('contentEditable' in document.body && options.wysiwyg !== false) {\n\t\t\t\tnew EmojiArea_WYSIWYG($textarea, options);\n\t\t\t} else {\n\t\t\t\tnew EmojiArea_Plain($textarea, options);\n\t\t\t}\n\t\t});\n\t};\n\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\tvar util = {};\n\n\tutil.restoreSelection = (function() {\n\t\tif (window.getSelection) {\n\t\t\treturn function(savedSelection) {\n\t\t\t\tvar sel = window.getSelection();\n\t\t\t\tsel.removeAllRanges();\n\t\t\t\tfor (var i = 0, len = savedSelection.length; i < len; ++i) {\n\t\t\t\t\tsel.addRange(savedSelection[i]);\n\t\t\t\t}\n\t\t\t};\n\t\t} else if (document.selection && document.selection.createRange) {\n\t\t\treturn function(savedSelection) {\n\t\t\t\tif (savedSelection) {\n\t\t\t\t\tsavedSelection.select();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t})();\n\n\tutil.saveSelection = (function() {\n\t\tif (window.getSelection) {\n\t\t\treturn function() {\n\t\t\t\tvar sel = window.getSelection(), ranges = [];\n\t\t\t\tif (sel.rangeCount) {\n\t\t\t\t\tfor (var i = 0, len = sel.rangeCount; i < len; ++i) {\n\t\t\t\t\t\tranges.push(sel.getRangeAt(i));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ranges;\n\t\t\t};\n\t\t} else if (document.selection && document.selection.createRange) {\n\t\t\treturn function() {\n\t\t\t\tvar sel = document.selection;\n\t\t\t\treturn (sel.type.toLowerCase() !== 'none') ? sel.createRange() : null;\n\t\t\t};\n\t\t}\n\t})();\n\n\tutil.replaceSelection = (function() {\n\t\tif (window.getSelection) {\n\t\t\treturn function(content) {\n\t\t\t\tvar range, sel = window.getSelection();\n\t\t\t\tvar node = typeof content === 'string' ? document.createTextNode(content) : content;\n\t\t\t\tif (sel.getRangeAt && sel.rangeCount) {\n\t\t\t\t\trange = sel.getRangeAt(0);\n\t\t\t\t\trange.deleteContents();\n\t\t\t\t\trange.insertNode(document.createTextNode(' '));\n\t\t\t\t\trange.insertNode(node);\n\t\t\t\t\trange.setStart(node, 0);\n\n\t\t\t\t\twindow.setTimeout(function() {\n\t\t\t\t\t\trange = document.createRange();\n\t\t\t\t\t\trange.setStartAfter(node);\n\t\t\t\t\t\trange.collapse(true);\n\t\t\t\t\t\tsel.removeAllRanges();\n\t\t\t\t\t\tsel.addRange(range);\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (document.selection && document.selection.createRange) {\n\t\t\treturn function(content) {\n\t\t\t\tvar range = document.selection.createRange();\n\t\t\t\tif (typeof content === 'string') {\n\t\t\t\t\trange.text = content;\n\t\t\t\t} else {\n\t\t\t\t\trange.pasteHTML(content.outerHTML);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})();\n\n\tutil.insertAtCursor = function(text, el) {\n\t\ttext = ' ' + text;\n\t\tvar val = el.value, endIndex, startIndex, range;\n\t\tif (typeof el.selectionStart != 'undefined' && typeof el.selectionEnd != 'undefined') {\n\t\t\tstartIndex = el.selectionStart;\n\t\t\tendIndex = el.selectionEnd;\n\t\t\tel.value = val.substring(0, startIndex) + text + val.substring(el.selectionEnd);\n\t\t\tel.selectionStart = el.selectionEnd = startIndex + text.length;\n\t\t} else if (typeof document.selection != 'undefined' && typeof document.selection.createRange != 'undefined') {\n\t\t\tel.focus();\n\t\t\trange = document.selection.createRange();\n\t\t\trange.text = text;\n\t\t\trange.select();\n\t\t}\n\t};\n\n\tutil.extend = function(a, b) {\n\t\tif (typeof a === 'undefined' || !a) { a = {}; }\n\t\tif (typeof b === 'object') {\n\t\t\tfor (var key in b) {\n\t\t\t\tif (b.hasOwnProperty(key)) {\n\t\t\t\t\ta[key] = b[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t};\n\n\tutil.escapeRegex = function(str) {\n\t\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n\t};\n\n\tutil.htmlEntities = function(str) {\n\t\treturn String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\t};\n\n\t/*! MODIFICATION START\n\t\t This function was added by Igor Zhukov to save recent used emojis.\n\t\t */\n\tutil.emojiInserted = function (emojiKey, menu, quickSelect) {\n\t\tConfigStorage.get('emojis_recent', function (curEmojis) {\n\t\t\tcurEmojis = curEmojis || defaultRecentEmojis || [];\n\t\t\tif (curEmojis.length && typeof curEmojis[0] === 'string') {\n\t\t\t\tvar newCurEmojis = [];\n\t\t\t\tfor (var i = 0, l = curEmojis.length; i < l; i++) {\n\t\t\t\t\tnewCurEmojis.push([curEmojis[i], 1]);\n\t\t\t\t}\n\t\t\t\tcurEmojis = newCurEmojis;\n\t\t\t}\n\n\t\t\tvar exists = false;\n\t\t\tfor (var i = 0, l = curEmojis.length; i < l; i++) {\n\t\t\t\tif (curEmojis[i][0] == emojiKey) {\n\t\t\t\t\texists = true;\n\t\t\t\t\tcurEmojis[i][1]++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (exists) {\n\t\t\t\tcurEmojis.sort(function (a, b) {\n\t\t\t\t\tif (a[1] == b[1]) return 0;\n\t\t\t\t\treturn a[1] > b[1] ? -1 : 1;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (curEmojis.length > 41) {\n\t\t\t\t\tcurEmojis = curEmojis.slice(0, 41);\n\t\t\t\t}\n\t\t\t\tcurEmojis.push([emojiKey, 1]);\n\t\t\t}\n\n\t\t\tConfigStorage.set({emojis_recent: curEmojis});\n\n\t\t\tif (quickSelect) {\n\t\t\t\tquickSelect.changed = true;\n\t\t\t}\n\t\t})\n\t};\n\t/*! MODIFICATION END */\n\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\tvar EmojiArea = function() {};\n\n\tEmojiArea.prototype.setup = function() {\n\t\tvar self = this;\n\n\t\tthis.$editor.on('focus', function() { self.hasFocus = true; });\n\t\tthis.$editor.on('blur', function() { self.hasFocus = false; });\n\n\t\tthis.setupButton();\n\n\t\tif (this.options.quickSelect) {\n\t\t\tvar $items = $(this.options.quickSelect);\n\t\t\tthis.quickSelect = new EmojiQuickSelectArea(self, $items);\n\t\t}\n\t};\n\n\tEmojiArea.prototype.setupButton = function() {\n\t\tvar self = this;\n\t\tvar $button;\n\n\t\tif (this.options.button) {\n\t\t\t$button = $(this.options.button);\n\t\t} else if (this.options.button !== false) {\n\t\t\t$button = $('<a href=\"javascript:void(0)\">');\n\t\t\t$button.html(this.options.buttonLabel);\n\t\t\t$button.addClass('emoji-button');\n\t\t\t$button.attr({title: this.options.buttonLabel});\n\t\t\tthis.$editor[this.options.buttonPosition]($button);\n\t\t} else {\n\t\t\t$button = $('');\n\t\t}\n\n\t\t$button.on('click', function(e) {\n\t\t\tEmojiMenu.show(self);\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tthis.$button = $button;\n\t};\n\n\t/*! MODIFICATION START\n\t This function was modified by Andre Staltz so that the icon is created from a spritesheet.\n\t */\n\tEmojiArea.createIcon = function(emoji, menu) {\n\t\tvar category = emoji[0];\n\t\tvar row = emoji[1];\n\t\tvar column = emoji[2];\n\t\tvar name = emoji[3];\n\t\tvar filename = $.emojiarea.spritesheetPath;\n\t\tvar iconSize = menu && Config.Mobile ? 26 : $.emojiarea.iconSize\n\t\tvar xoffset = -(iconSize * column);\n\t\tvar yoffset = -(iconSize * row);\n\t\tvar scaledWidth = ($.emojiarea.spritesheetDimens[category][1] * iconSize);\n\t\tvar scaledHeight = ($.emojiarea.spritesheetDimens[category][0] * iconSize);\n\n\t\tvar style = 'display:inline-block;';\n\t\tstyle += 'width:' + iconSize + 'px;';\n\t\tstyle += 'height:' + iconSize + 'px;';\n\t\tstyle += 'background:url(\\'' + filename.replace('!',category) + '\\') ' + xoffset + 'px ' + yoffset + 'px no-repeat;';\n\t\tstyle += 'background-size:' + scaledWidth + 'px ' + scaledHeight + 'px;';\n\t\treturn '<img src=\"img/blank.gif\" class=\"img\" style=\"'+ style +'\" alt=\"' + util.htmlEntities(name) + '\">';\n\t};\n\t/*! MODIFICATION END */\n\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\t/**\n\t * Editor (plain-text)\n\t *\n\t * @constructor\n\t * @param {object} $textarea\n\t * @param {object} options\n\t */\n\n\tvar EmojiArea_Plain = function($textarea, options) {\n\t\tthis.options = options;\n\t\tthis.$textarea = $textarea;\n\t\tthis.$editor = $textarea;\n\t\tthis.setup();\n\t};\n\n\tEmojiArea_Plain.prototype.insert = function(emoji) {\n\t\tif (!$.emojiarea.icons.hasOwnProperty(emoji)) return;\n\t\tutil.insertAtCursor(emoji, this.$textarea[0]);\n\t\t/* MODIFICATION: Following line was added by Igor Zhukov, in order to save recent emojis */\n\t\tutil.emojiInserted(emoji, this.menu, this.quickSelect);\n\t\tthis.$textarea.trigger('change');\n\t};\n\n\tEmojiArea_Plain.prototype.val = function() {\n\t\treturn this.$textarea.val();\n\t};\n\n\tutil.extend(EmojiArea_Plain.prototype, EmojiArea.prototype);\n\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\t/**\n\t * Editor (rich)\n\t *\n\t * @constructor\n\t * @param {object} $textarea\n\t * @param {object} options\n\t */\n\n\tvar EmojiArea_WYSIWYG = function($textarea, options) {\n\t\tvar self = this;\n\n\t\tthis.options = options || {};\n\t\tthis.$textarea = $textarea;\n\t\tthis.$editor = $('<div>').addClass('emoji-wysiwyg-editor');\n\t\tthis.$editor.text($textarea.val());\n\t\tthis.$editor.attr({contenteditable: 'true'});\n\t\t/*! MODIFICATION START\n\t\t\tFollowing code was modified by Igor Zhukov, in order to improve rich text paste\n\t\t*/\n\t\tvar changeEvents = 'blur change';\n\t\tif (!this.options.norealTime) {\n\t\t\tchangeEvents += ' keyup';\n\t\t}\n\t\tthis.$editor.on(changeEvents, function(e) { return self.onChange.apply(self, [e]); });\n\t\tthis.$editor.on('paste', function(e) { return self.onPaste.apply(self, [e]); });\n\t\t/*! MODIFICATION END */\n\n\t\tthis.$editor.on('mousedown focus', function() { document.execCommand('enableObjectResizing', false, false); });\n\t\tthis.$editor.on('blur', function() { document.execCommand('enableObjectResizing', true, true); });\n\n\t\tvar html = this.$editor.text();\n\t\tvar emojis = $.emojiarea.icons;\n\t\tfor (var key in emojis) {\n\t\t\tif (emojis.hasOwnProperty(key)) {\n\t\t\t\t/* MODIFICATION: Following line was modified by Andre Staltz, to use new implementation of createIcon function.*/\n\t\t\t\thtml = html.replace(new RegExp(util.escapeRegex(key), 'g'), EmojiArea.createIcon(emojis[key]));\n\t\t\t}\n\t\t}\n\t\tthis.$editor.html(html);\n\n\t\t$textarea.hide().after(this.$editor);\n\n\t\tthis.setup();\n\n\t\t/* MODIFICATION: Following line was modified by Igor Zhukov, in order to improve emoji insert behaviour */\n\t\t$(document.body).on('mousedown', function() {\n\t\t\tif (self.hasFocus) {\n\t\t\t\tself.selection = util.saveSelection();\n\t\t\t}\n\t\t});\n\t};\n\n\t/*! MODIFICATION START\n\t\t\tFollowing code was modified by Igor Zhukov, in order to improve rich text paste\n\t\t*/\n\tEmojiArea_WYSIWYG.prototype.onPaste = function(e) {\n\t\tvar cData = (e.originalEvent || e).clipboardData,\n\t\t\t\titems = cData && cData.items || [],\n\t\t\t\ti;\n\t\tfor (i = 0; i < items.length; i++) {\n\t\t\tif (items[i].kind == 'file') {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tvar text = (e.originalEvent || e).clipboardData.getData('text/plain'),\n\t\t\t\tself = this;\n\t\tsetTimeout(function () {\n\t\t\tself.onChange();\n\t\t}, 0);\n\t\tif (text.length) {\n\t\t\tdocument.execCommand('insertText', false, text);\n\t\t\treturn cancelEvent(e);\n\t\t}\n\t\treturn true;\n\t};\n\t/*! MODIFICATION END */\n\n\tEmojiArea_WYSIWYG.prototype.onChange = function(e) {\n\t\tthis.$textarea.val(this.val()).trigger('change');\n\t};\n\n\tEmojiArea_WYSIWYG.prototype.insert = function(emoji) {\n\t\tvar content;\n\t\t/* MODIFICATION: Following line was modified by Andre Staltz, to use new implementation of createIcon function.*/\n\t\tvar $img = $(EmojiArea.createIcon($.emojiarea.icons[emoji]));\n\t\tif ($img[0].attachEvent) {\n\t\t\t$img[0].attachEvent('onresizestart', function(e) { e.returnValue = false; }, false);\n\t\t}\n\n\t\tif (!this.hasFocus) {\n\t\t\tthis.$editor.trigger('focus');\n\t\t\tif (this.selection) {\n\t\t\t\tutil.restoreSelection(this.selection);\n\t\t\t}\n\t\t}\n\t\ttry { util.replaceSelection($img[0]); } catch (e) {}\n\n\t\t/*! MODIFICATION START\n\t\t\tFollowing code was modified by Igor Zhukov, in order to improve selection handling\n\t\t*/\n\t\tvar self = this;\n\t\tsetTimeout(function () {\n\t\t\tself.selection = util.saveSelection();\n\t\t}, 100);\n\t\t/*! MODIFICATION END */\n\n\t\t/* MODIFICATION: Following line was added by Igor Zhukov, in order to save recent emojis */\n\t\tutil.emojiInserted(emoji, this.menu, this.quickSelect);\n\n\n\t\tthis.onChange();\n\t};\n\n\tEmojiArea_WYSIWYG.prototype.val = function() {\n\t\tvar lines = [];\n\t\tvar line  = [];\n\n\t\tvar flush = function() {\n\t\t\tlines.push(line.join(''));\n\t\t\tline = [];\n\t\t};\n\n\t\tvar sanitizeNode = function(node) {\n\t\t\tif (node.nodeType === TEXT_NODE) {\n\t\t\t\tline.push(node.nodeValue);\n\t\t\t} else if (node.nodeType === ELEMENT_NODE) {\n\t\t\t\tvar tagName = node.tagName.toLowerCase();\n\t\t\t\tvar isBlock = TAGS_BLOCK.indexOf(tagName) !== -1;\n\n\t\t\t\tif (isBlock && line.length) flush();\n\n\t\t\t\tif (tagName === 'img') {\n\t\t\t\t\tvar alt = node.getAttribute('alt') || '';\n\t\t\t\t\tif (alt) line.push(alt);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (tagName === 'br') {\n\t\t\t\t\tflush();\n\t\t\t\t}\n\n\t\t\t\tvar children = node.childNodes;\n\t\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\t\tsanitizeNode(children[i]);\n\t\t\t\t}\n\n\t\t\t\tif (isBlock && line.length) flush();\n\t\t\t}\n\t\t};\n\n\t\tvar children = this.$editor[0].childNodes;\n\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\tsanitizeNode(children[i]);\n\t\t}\n\n\t\tif (line.length) flush();\n\n\t\treturn lines.join('\\n');\n\t};\n\n\tutil.extend(EmojiArea_WYSIWYG.prototype, EmojiArea.prototype);\n\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\t/**\n\t * Emoji Dropdown Menu\n\t *\n\t * @constructor\n\t * @param {object} emojiarea\n\t */\n\tvar EmojiMenu = function() {\n\t\tvar self = this;\n\t\tvar $body = $(document.body);\n\t\tvar $window = $(window);\n\n\t\tthis.visible = false;\n\t\tthis.emojiarea = null;\n\t\tthis.$menu = $('<div>');\n\t\tthis.$menu.addClass('emoji-menu');\n\t\tthis.$menu.hide();\n\n\t\t/*! MODIFICATION START\n\t\t\tFollowing code was modified by Igor Zhukov, in order to add scrollbars and tail to EmojiMenu\n\t\t\tAlso modified by Andre Staltz, to include tabs for categories, on the menu header.\n\t\t*/\n\t\tthis.$itemsTailWrap = $('<div class=\"emoji-items-wrap1\"></div>').appendTo(this.$menu);\n\t\tthis.$categoryTabs = $('<table class=\"emoji-menu-tabs\"><tr>' +\n\t\t'<td><a class=\"emoji-menu-tab icon-recent\" ></a></td>' +\n\t\t'<td><a class=\"emoji-menu-tab icon-smile\" ></a></td>' +\n\t\t'<td><a class=\"emoji-menu-tab icon-flower\"></a></td>' +\n\t\t'<td><a class=\"emoji-menu-tab icon-bell\"></a></td>' +\n\t\t'<td><a class=\"emoji-menu-tab icon-car\"></a></td>' +\n\t\t'<td><a class=\"emoji-menu-tab icon-grid\"></a></td>' +\n\t\t'</tr></table>').appendTo(this.$itemsTailWrap);\n\t\tthis.$itemsWrap = $('<div class=\"emoji-items-wrap nano mobile_scrollable_wrap\"></div>').appendTo(this.$itemsTailWrap);\n\t\tthis.$items = $('<div class=\"emoji-items nano-content\">').appendTo(this.$itemsWrap);\n\t\t/*! MODIFICATION END */\n\n\t\t$body.append(this.$menu);\n\n\t\t/*! MODIFICATION: Following 3 lines were added by Igor Zhukov, in order to add scrollbars to EmojiMenu  */\n\t\tif (!Config.Mobile) {\n\t\t\tthis.$itemsWrap.nanoScroller({preventPageScrolling: true, tabIndex: -1});\n\t\t}\n\n\t\t$body.on('keydown', function(e) {\n\t\t\tif (e.keyCode === KEY_ESC || e.keyCode === KEY_TAB) {\n\t\t\t\tself.hide();\n\t\t\t}\n\t\t});\n\n\t\t/*! MODIFICATION: Following 3 lines were added by Igor Zhukov, in order to hide menu on message submit with keyboard */\n\t\t$body.on('message_send', function(e) {\n\t\t\tself.hide();\n\t\t});\n\n\t\t$body.on('mouseup', function(e) {\n\t\t\t/*! MODIFICATION START\n\t\t\t\tFollowing code was added by Igor Zhukov, in order to prevent close on click on EmojiMenu scrollbar\n\t\t\t*/\n\t\t\te = e.originalEvent || e;\n\t\t\tvar target = e.originalTarget || e.target || window;\n\t\t\twhile (target && target != window) {\n\t\t\t\ttarget = target.parentNode;\n\t\t\t\tif (target == self.$menu[0] || self.emojiarea && target == self.emojiarea.$button[0]) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*! MODIFICATION END */\n\t\t\tself.hide();\n\t\t});\n\n\t\t$window.on('resize', function() {\n\t\t\tif (self.visible) self.reposition();\n\t\t});\n\n\t\tthis.$menu.on('mouseup', 'a', function(e) {\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t});\n\n\t\tthis.$menu.on('click', 'a', function(e) {\n\t\t\t/*! MODIFICATION START\n\t\t\t Following code was modified by Andre Staltz, to capture clicks on category tabs and change the category selection.\n\t\t\t */\n\t\t\tif ($(this).hasClass('emoji-menu-tab')) {\n\t\t\t\tif (self.getTabIndex(this) !== self.currentCategory) {\n\t\t\t\t\tself.selectCategory(self.getTabIndex(this));\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t/*! MODIFICATION END */\n\t\t\tvar emoji = $('.label', $(this)).text();\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tself.onItemSelected(emoji);\n\t\t\t\t/*! MODIFICATION START\n\t\t\t\t\tFollowing code was modified by Igor Zhukov, in order to close only on ctrl-, alt- emoji select\n\t\t\t\t*/\n\t\t\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\t\t\tself.hide();\n\t\t\t\t}\n\t\t\t\t/*! MODIFICATION END */\n\t\t\t}, 0);\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t});\n\n\t\t/* MODIFICATION: Following line was modified by Andre Staltz, in order to select a default category. */\n\t\tthis.selectCategory(0);\n\t};\n\n\t/*! MODIFICATION START\n\t Following code was added by Andre Staltz, to implement category selection.\n\t */\n\tEmojiMenu.prototype.getTabIndex = function(tab) {\n\t\treturn this.$categoryTabs.find('.emoji-menu-tab').index(tab);\n\t};\n\n\tEmojiMenu.prototype.selectCategory = function(category) {\n\t\tvar self = this;\n\t\tthis.$categoryTabs.find('.emoji-menu-tab').each(function(index) {\n\t\t\tif (index === category) {\n\t\t\t\tthis.className += '-selected';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.className = this.className.replace('-selected', '');\n\t\t\t}\n\t\t});\n\t\tthis.currentCategory = category;\n\t\tthis.load(category);\n\t\tif (!Config.Mobile) {\n\t    this.$itemsWrap.nanoScroller({ scroll: 'top' });\n\t\t}\n\t};\n\t/*! MODIFICATION END */\n\n\tEmojiMenu.prototype.onItemSelected = function(emoji) {\n\t\tthis.emojiarea.insert(emoji);\n\t};\n\n\t/* MODIFICATION:\n\t\tThe following function argument was modified by Andre Staltz, in order to load only icons from a category.\n\t\tAlso function was modified by Igor Zhukov in order to display recent emojis from localStorage\n\t*/\n\tEmojiMenu.prototype.load = function(category) {\n\t\tvar html = [];\n\t\tvar options = $.emojiarea.icons;\n\t\tvar path = $.emojiarea.path;\n\t\tvar self = this;\n\t\tif (path.length && path.charAt(path.length - 1) !== '/') {\n\t\t\tpath += '/';\n\t\t}\n\n\t\t/*! MODIFICATION: Following function was added by Igor Zhukov, in order to add scrollbars to EmojiMenu */\n\t\tvar updateItems = function () {\n\t\t\tself.$items.html(html.join(''));\n\n\t\t\tif (!Config.Mobile && self.$itemsWrap) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tself.$itemsWrap.nanoScroller();\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t}\n\n\t\tif (category > 0) {\n\t\t\tfor (var key in options) {\n\t\t\t\t/* MODIFICATION: The following 2 lines were modified by Andre Staltz, in order to load only icons from the specified category. */\n\t\t\t\tif (options.hasOwnProperty(key) && options[key][0] === (category - 1)) {\n\t\t\t\t\thtml.push('<a href=\"javascript:void(0)\" title=\"' + util.htmlEntities(key) + '\">' + EmojiArea.createIcon(options[key], true) + '<span class=\"label\">' + util.htmlEntities(key) + '</span></a>');\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdateItems();\n\t\t} else {\n\t\t\tConfigStorage.get('emojis_recent', function (curEmojis) {\n\t\t\t\tcurEmojis = curEmojis || defaultRecentEmojis || [];\n\t\t\t\tvar key, i;\n\t\t\t\tfor (i = 0; i < curEmojis.length; i++) {\n\t\t\t\t\tkey = curEmojis[i];\n\t\t\t\t\tif (Array.isArray(key)) {\n\t\t\t\t\t\tkey = key[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (options[key]) {\n\t\t\t\t\t\thtml.push('<a href=\"javascript:void(0)\" title=\"' + util.htmlEntities(key) + '\">' + EmojiArea.createIcon(options[key], true) + '<span class=\"label\">' + util.htmlEntities(key) + '</span></a>');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tupdateItems();\n\t\t\t});\n\t\t}\n\t};\n\n\tEmojiMenu.prototype.reposition = function() {\n\t\tvar $button = this.emojiarea.$button;\n\t\tvar offset = $button.offset();\n\t\toffset.top += $button.outerHeight();\n\t\toffset.left += Math.round($button.outerWidth() / 2);\n\n\t\tthis.$menu.css({\n\t\t\ttop: offset.top,\n\t\t\tleft: offset.left\n\t\t});\n\t};\n\n\tEmojiMenu.prototype.hide = function(callback) {\n\t\tif (this.emojiarea) {\n\t\t\tthis.emojiarea.menu = null;\n\t\t\tthis.emojiarea.$button.removeClass('on');\n\t\t\tthis.emojiarea = null;\n\t\t}\n\n\n\t\tthis.visible = false;\n\t\tthis.$menu.hide();\n\t};\n\n\tEmojiMenu.prototype.show = function(emojiarea) {\n\t\t/* MODIFICATION: Following line was modified by Igor Zhukov, in order to improve EmojiMenu behaviour */\n\t\tif (this.emojiarea && this.emojiarea === emojiarea) return this.hide();\n\t\temojiarea.$button.addClass('on');\n\t\tthis.emojiarea = emojiarea;\n\t\tthis.emojiarea.menu = this;\n\n\t\tthis.reposition();\n\t\tthis.$menu.show();\n\t\t/* MODIFICATION: Following 3 lines were added by Igor Zhukov, in order to update EmojiMenu contents */\n\t\tif (!this.currentCategory) {\n\t\t\tthis.load(0);\n\t\t}\n\t\tthis.visible = true;\n\t};\n\n\tEmojiMenu.show = (function() {\n\t\tvar menu = null;\n\t\treturn function(emojiarea) {\n\t\t\tmenu = menu || new EmojiMenu();\n\t\t\tmenu.show(emojiarea);\n\t\t};\n\t})();\n\n\tvar EmojiQuickSelectArea = function(emojiarea, $items) {\n\t\tvar self = this;\n\t\tvar $body = $(document.body);\n\n\t\tthis.emojiarea = emojiarea;\n\t\tthis.changed = false;\n\t\tthis.$items = $items;\n\n\t\tthis.load(0);\n\t\tthis.$items.on('mousedown', 'a', function(e) {\n\t\t\tvar emoji = $('.label', $(this)).text();\n\t\t\tself.onItemSelected(emoji);\n\t\t\tself.changed = true;\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t});\n\t\t$body.on('message_send', function(e) {\n\t\t\tif (self.changed) {\n\t\t\t\tself.load(0);\n\t\t\t\tself.changed = false;\n\t\t\t}\n\t\t});\n\t};\n\n\tutil.extend(EmojiQuickSelectArea.prototype, EmojiMenu.prototype);\n\n})(jQuery, window, document);\n"
  },
  {
    "path": "app/vendor/jquery.nanoscroller/nanoscroller.css",
    "content": "/** initial setup **/\n.nano {\n  position : relative;\n  width    : 100%;\n  height   : 100%;\n  overflow : hidden;\n}\n.nano > .nano-content {\n  position      : absolute;\n  overflow      : scroll;\n  overflow-x    : hidden;\n  top           : 0;\n  right         : 0;\n  bottom        : 0;\n  left          : 0;\n}\n.nano > .nano-content:focus {\n  outline: thin dotted;\n}\n.nano > .nano-content::-webkit-scrollbar {\n  display: none;\n}\n.has-scrollbar > .nano-content::-webkit-scrollbar {\n  display: block;\n}\n.nano > .nano-pane {\n  background : rgba(0,0,0,.25);\n  position   : absolute;\n  width      : 10px;\n  right      : 0;\n  top        : 0;\n  bottom     : 0;\n  visibility : hidden\\9; /* Target only IE7 and IE8 with this hack */\n  opacity    : .01;\n  -webkit-transition    : .2s;\n  -moz-transition       : .2s;\n  -o-transition         : .2s;\n  transition            : .2s;\n  -moz-border-radius    : 5px;\n  -webkit-border-radius : 5px;\n  border-radius         : 5px;\n}\n.nano > .nano-pane > .nano-slider {\n  background: #444;\n  background: rgba(0,0,0,.5);\n  position              : relative;\n  margin                : 0 1px;\n  -moz-border-radius    : 3px;\n  -webkit-border-radius : 3px;\n  border-radius         : 3px;\n}\n.nano:hover > .nano-pane, .nano-pane.active, .nano-pane.flashed {\n  visibility : visible\\9; /* Target only IE7 and IE8 with this hack */\n  opacity    : 0.99;\n}\n"
  },
  {
    "path": "app/vendor/jquery.nanoscroller/nanoscroller.js",
    "content": "/*! nanoScrollerJS - v0.8.4 - 2014\n* http://jamesflorentino.github.com/nanoScrollerJS/\n* Copyright (c) 2014 James Florentino; Licensed MIT */\n;(function($, window, document) {\n  \"use strict\";\n  var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, ENTER, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEENTER, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, cAF, defaults, getBrowserScrollbarWidth, hasTransform, isFFWithBuggyScrollbar, rAF, transform, _elementStyle, _prefixStyle, _vendor;\n  defaults = {\n\n    /**\n      a classname for the pane element.\n      @property paneClass\n      @type String\n      @default 'nano-pane'\n     */\n    paneClass: 'nano-pane',\n\n    /**\n      a classname for the slider element.\n      @property sliderClass\n      @type String\n      @default 'nano-slider'\n     */\n    sliderClass: 'nano-slider',\n\n    /**\n      a classname for the content element.\n      @property contentClass\n      @type String\n      @default 'nano-content'\n     */\n    contentClass: 'nano-content',\n\n    /**\n      a setting to enable native scrolling in iOS devices.\n      @property iOSNativeScrolling\n      @type Boolean\n      @default false\n     */\n    iOSNativeScrolling: false,\n\n    /**\n      a setting to prevent the rest of the page being\n      scrolled when user scrolls the `.content` element.\n      @property preventPageScrolling\n      @type Boolean\n      @default false\n     */\n    preventPageScrolling: false,\n\n    /**\n      a setting to disable binding to the resize event.\n      @property disableResize\n      @type Boolean\n      @default false\n     */\n    disableResize: false,\n\n    /**\n      a setting to make the scrollbar always visible.\n      @property alwaysVisible\n      @type Boolean\n      @default false\n     */\n    alwaysVisible: false,\n\n    /**\n      a default timeout for the `flash()` method.\n      @property flashDelay\n      @type Number\n      @default 1500\n     */\n    flashDelay: 1500,\n\n    /**\n      a minimum height for the `.slider` element.\n      @property sliderMinHeight\n      @type Number\n      @default 20\n     */\n    sliderMinHeight: 20,\n\n    /**\n      a maximum height for the `.slider` element.\n      @property sliderMaxHeight\n      @type Number\n      @default null\n     */\n    sliderMaxHeight: null,\n\n    /**\n      an alternate document context.\n      @property documentContext\n      @type Document\n      @default null\n     */\n    documentContext: null,\n\n    /**\n      an alternate window context.\n      @property windowContext\n      @type Window\n      @default null\n     */\n    windowContext: null\n  };\n\n  /**\n    @property SCROLLBAR\n    @type String\n    @static\n    @final\n    @private\n   */\n  SCROLLBAR = 'scrollbar';\n\n  /**\n    @property SCROLL\n    @type String\n    @static\n    @final\n    @private\n   */\n  SCROLL = 'scroll';\n\n  /**\n    @property MOUSEDOWN\n    @type String\n    @final\n    @private\n   */\n  MOUSEDOWN = 'mousedown';\n\n  /**\n    @property MOUSEENTER\n    @type String\n    @final\n    @private\n   */\n  MOUSEENTER = 'mouseenter';\n\n  /**\n    @property MOUSEMOVE\n    @type String\n    @static\n    @final\n    @private\n   */\n  MOUSEMOVE = 'mousemove';\n\n  /**\n    @property MOUSEWHEEL\n    @type String\n    @final\n    @private\n   */\n  MOUSEWHEEL = 'mousewheel';\n\n  /**\n    @property MOUSEUP\n    @type String\n    @static\n    @final\n    @private\n   */\n  MOUSEUP = 'mouseup';\n\n  /**\n    @property RESIZE\n    @type String\n    @final\n    @private\n   */\n  RESIZE = 'resize';\n\n  /**\n    @property DRAG\n    @type String\n    @static\n    @final\n    @private\n   */\n  DRAG = 'drag';\n\n  /**\n    @property ENTER\n    @type String\n    @static\n    @final\n    @private\n   */\n  ENTER = 'enter';\n\n  /**\n    @property UP\n    @type String\n    @static\n    @final\n    @private\n   */\n  UP = 'up';\n\n  /**\n    @property PANEDOWN\n    @type String\n    @static\n    @final\n    @private\n   */\n  PANEDOWN = 'panedown';\n\n  /**\n    @property DOMSCROLL\n    @type String\n    @static\n    @final\n    @private\n   */\n  DOMSCROLL = 'DOMMouseScroll';\n\n  /**\n    @property DOWN\n    @type String\n    @static\n    @final\n    @private\n   */\n  DOWN = 'down';\n\n  /**\n    @property WHEEL\n    @type String\n    @static\n    @final\n    @private\n   */\n  WHEEL = 'wheel';\n\n  /**\n    @property KEYDOWN\n    @type String\n    @static\n    @final\n    @private\n   */\n  KEYDOWN = 'keydown';\n\n  /**\n    @property KEYUP\n    @type String\n    @static\n    @final\n    @private\n   */\n  KEYUP = 'keyup';\n\n  /**\n    @property TOUCHMOVE\n    @type String\n    @static\n    @final\n    @private\n   */\n  TOUCHMOVE = 'touchmove';\n\n  /**\n    @property BROWSER_IS_IE7\n    @type Boolean\n    @static\n    @final\n    @private\n   */\n  BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject;\n\n  /**\n    @property BROWSER_SCROLLBAR_WIDTH\n    @type Number\n    @static\n    @default null\n    @private\n   */\n  BROWSER_SCROLLBAR_WIDTH = null;\n  rAF = window.requestAnimationFrame;\n  cAF = window.cancelAnimationFrame;\n  _elementStyle = document.createElement('div').style;\n  _vendor = (function() {\n    var i, transform, vendor, vendors, _i, _len;\n    vendors = ['t', 'webkitT', 'MozT', 'msT', 'OT'];\n    for (i = _i = 0, _len = vendors.length; _i < _len; i = ++_i) {\n      vendor = vendors[i];\n      transform = vendors[i] + 'ransform';\n      if (transform in _elementStyle) {\n        return vendors[i].substr(0, vendors[i].length - 1);\n      }\n    }\n    return false;\n  })();\n  _prefixStyle = function(style) {\n    if (_vendor === false) {\n      return false;\n    }\n    if (_vendor === '') {\n      return style;\n    }\n    return _vendor + style.charAt(0).toUpperCase() + style.substr(1);\n  };\n  transform = _prefixStyle('transform');\n  hasTransform = transform !== false;\n\n  /**\n    Returns browser's native scrollbar width\n    @method getBrowserScrollbarWidth\n    @return {Number} the scrollbar width in pixels\n    @static\n    @private\n   */\n  getBrowserScrollbarWidth = function() {\n    var outer, outerStyle, scrollbarWidth;\n    outer = document.createElement('div');\n    outerStyle = outer.style;\n    outerStyle.position = 'absolute';\n    outerStyle.width = '100px';\n    outerStyle.height = '100px';\n    outerStyle.overflow = SCROLL;\n    outerStyle.top = '-9999px';\n    document.body.appendChild(outer);\n    scrollbarWidth = outer.offsetWidth - outer.clientWidth;\n    document.body.removeChild(outer);\n    return scrollbarWidth;\n  };\n  isFFWithBuggyScrollbar = function() {\n    var isOSXFF, ua, version;\n    ua = window.navigator.userAgent;\n    isOSXFF = /(?=.+Mac OS X)(?=.+Firefox)/.test(ua);\n    if (!isOSXFF) {\n      return false;\n    }\n    version = /Firefox\\/\\d{2}\\./.exec(ua);\n    if (version) {\n      version = version[0].replace(/\\D+/g, '');\n    }\n    return isOSXFF && +version > 23;\n  };\n\n  /**\n    @class NanoScroll\n    @param element {HTMLElement|Node} the main element\n    @param options {Object} nanoScroller's options\n    @constructor\n   */\n  NanoScroll = (function() {\n    function NanoScroll(el, options) {\n      this.el = el;\n      this.options = options;\n      BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth());\n      this.$el = $(this.el);\n      this.doc = $(this.options.documentContext || document);\n      this.win = $(this.options.windowContext || window);\n      this.body = this.doc.find('body');\n      this.$content = this.$el.children(\".\" + options.contentClass);\n      this.$content.attr('tabindex', this.options.tabIndex || 0);\n      this.content = this.$content[0];\n      this.previousPosition = 0;\n      if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null || navigator.userAgent.match(/mobi.+Gecko/i))) {\n        this.nativeScrolling();\n      } else {\n        this.generate();\n      }\n      this.createEvents();\n      this.addEvents();\n      this.reset();\n    }\n\n\n    /**\n      Prevents the rest of the page being scrolled\n      when user scrolls the `.nano-content` element.\n      @method preventScrolling\n      @param event {Event}\n      @param direction {String} Scroll direction (up or down)\n      @private\n     */\n\n    NanoScroll.prototype.preventScrolling = function(e, direction) {\n      if (!this.isActive) {\n        return;\n      }\n      if (e.type === DOMSCROLL) {\n        if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) {\n          e.preventDefault();\n        }\n      } else if (e.type === MOUSEWHEEL) {\n        if (!e.originalEvent || !e.originalEvent.wheelDelta) {\n          return;\n        }\n        if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) {\n          e.preventDefault();\n        }\n      }\n    };\n\n\n    /**\n      Enable iOS native scrolling\n      @method nativeScrolling\n      @private\n     */\n\n    NanoScroll.prototype.nativeScrolling = function() {\n      this.$content.css({\n        WebkitOverflowScrolling: 'touch'\n      });\n      this.iOSNativeScrolling = true;\n      this.isActive = true;\n    };\n\n\n    /**\n      Updates those nanoScroller properties that\n      are related to current scrollbar position.\n      @method updateScrollValues\n      @private\n     */\n\n    NanoScroll.prototype.updateScrollValues = function() {\n      var content, direction;\n      content = this.content;\n      this.maxScrollTop = content.scrollHeight - content.clientHeight;\n      this.prevScrollTop = this.contentScrollTop || 0;\n      this.contentScrollTop = content.scrollTop;\n      direction = this.contentScrollTop > this.previousPosition ? \"down\" : this.contentScrollTop < this.previousPosition ? \"up\" : \"same\";\n      this.previousPosition = this.contentScrollTop;\n      if (direction !== \"same\") {\n        this.$el.trigger('update', {\n          position: this.contentScrollTop,\n          maximum: this.maxScrollTop,\n          direction: direction\n        });\n      }\n      if (!this.iOSNativeScrolling) {\n        this.maxSliderTop = this.paneHeight - this.sliderHeight;\n        this.sliderTop = this.maxScrollTop === 0 ? 0 : this.contentScrollTop * this.maxSliderTop / this.maxScrollTop;\n      }\n    };\n\n\n    /**\n      Updates CSS styles for current scroll position.\n      Uses CSS 2d transfroms and `window.requestAnimationFrame` if available.\n      @method setOnScrollStyles\n      @private\n     */\n\n    NanoScroll.prototype.setOnScrollStyles = function() {\n      var cssValue;\n      if (hasTransform) {\n        cssValue = {};\n        cssValue[transform] = \"translate(0, \" + this.sliderTop + \"px)\";\n      } else {\n        cssValue = {\n          top: this.sliderTop\n        };\n      }\n      if (rAF) {\n        if (cAF && this.scrollRAF) {\n          cAF(this.scrollRAF);\n        }\n        this.scrollRAF = rAF((function(_this) {\n          return function() {\n            _this.scrollRAF = null;\n            return _this.slider.css(cssValue);\n          };\n        })(this));\n      } else {\n        this.slider.css(cssValue);\n      }\n    };\n\n\n    /**\n      Creates event related methods\n      @method createEvents\n      @private\n     */\n\n    NanoScroll.prototype.createEvents = function() {\n      this.events = {\n        down: (function(_this) {\n          return function(e) {\n            _this.isBeingDragged = true;\n            _this.offsetY = e.pageY - _this.slider.offset().top;\n            if (!_this.slider.is(e.target)) {\n              _this.offsetY = 0;\n            }\n            _this.pane.addClass('active');\n            _this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]);\n            _this.body.bind(MOUSEENTER, _this.events[ENTER]);\n            return false;\n          };\n        })(this),\n        drag: (function(_this) {\n          return function(e) {\n            _this.sliderY = e.pageY - _this.$el.offset().top - _this.paneTop - (_this.offsetY || _this.sliderHeight * 0.5);\n            _this.scroll();\n            if (_this.contentScrollTop >= _this.maxScrollTop && _this.prevScrollTop !== _this.maxScrollTop) {\n              _this.$el.trigger('scrollend');\n            } else if (_this.contentScrollTop === 0 && _this.prevScrollTop !== 0) {\n              _this.$el.trigger('scrolltop');\n            }\n            return false;\n          };\n        })(this),\n        up: (function(_this) {\n          return function(e) {\n            _this.isBeingDragged = false;\n            _this.pane.removeClass('active');\n            _this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]);\n            _this.body.unbind(MOUSEENTER, _this.events[ENTER]);\n            return false;\n          };\n        })(this),\n        resize: (function(_this) {\n          return function(e) {\n            _this.reset();\n          };\n        })(this),\n        panedown: (function(_this) {\n          return function(e) {\n            _this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5);\n            _this.scroll();\n            _this.events.down(e);\n            return false;\n          };\n        })(this),\n        scroll: (function(_this) {\n          return function(e) {\n            _this.updateScrollValues();\n            if (_this.isBeingDragged) {\n              return;\n            }\n            if (!_this.iOSNativeScrolling) {\n              _this.sliderY = _this.sliderTop;\n              _this.setOnScrollStyles();\n            }\n            if (e == null) {\n              return;\n            }\n            if (_this.contentScrollTop >= _this.maxScrollTop) {\n              if (_this.options.preventPageScrolling) {\n                _this.preventScrolling(e, DOWN);\n              }\n              if (_this.prevScrollTop !== _this.maxScrollTop) {\n                _this.$el.trigger('scrollend');\n              }\n            } else if (_this.contentScrollTop === 0) {\n              if (_this.options.preventPageScrolling) {\n                _this.preventScrolling(e, UP);\n              }\n              if (_this.prevScrollTop !== 0) {\n                _this.$el.trigger('scrolltop');\n              }\n            }\n          };\n        })(this),\n        wheel: (function(_this) {\n          return function(e) {\n            var delta;\n            if (e == null) {\n              return;\n            }\n            delta = e.delta || e.wheelDelta || (e.originalEvent && e.originalEvent.wheelDelta) || -e.detail || (e.originalEvent && -e.originalEvent.detail);\n            if (delta) {\n              _this.sliderY += -delta / 3;\n            }\n            _this.scroll();\n            return false;\n          };\n        })(this),\n        enter: (function(_this) {\n          return function(e) {\n            var _ref;\n            if (!_this.isBeingDragged) {\n              return;\n            }\n            if ((e.buttons || e.which) !== 1) {\n              return (_ref = _this.events)[UP].apply(_ref, arguments);\n            }\n          };\n        })(this)\n      };\n    };\n\n\n    /**\n      Adds event listeners with jQuery.\n      @method addEvents\n      @private\n     */\n\n    NanoScroll.prototype.addEvents = function() {\n      var events;\n      this.removeEvents();\n      events = this.events;\n      if (!this.options.disableResize) {\n        this.win.bind(RESIZE, events[RESIZE]);\n      }\n      if (!this.iOSNativeScrolling) {\n        this.slider.bind(MOUSEDOWN, events[DOWN]);\n        this.pane.bind(MOUSEDOWN, events[PANEDOWN]).bind(\"\" + MOUSEWHEEL + \" \" + DOMSCROLL, events[WHEEL]);\n      }\n      this.$content.bind(\"\" + SCROLL + \" \" + MOUSEWHEEL + \" \" + DOMSCROLL + \" \" + TOUCHMOVE, events[SCROLL]);\n    };\n\n\n    /**\n      Removes event listeners with jQuery.\n      @method removeEvents\n      @private\n     */\n\n    NanoScroll.prototype.removeEvents = function() {\n      var events;\n      events = this.events;\n      this.win.unbind(RESIZE, events[RESIZE]);\n      if (!this.iOSNativeScrolling) {\n        this.slider.unbind();\n        this.pane.unbind();\n      }\n      this.$content.unbind(\"\" + SCROLL + \" \" + MOUSEWHEEL + \" \" + DOMSCROLL + \" \" + TOUCHMOVE, events[SCROLL]);\n    };\n\n\n    /**\n      Generates nanoScroller's scrollbar and elements for it.\n      @method generate\n      @chainable\n      @private\n     */\n\n    NanoScroll.prototype.generate = function() {\n      var contentClass, cssRule, currentPadding, options, pane, paneClass, sliderClass;\n      options = this.options;\n      paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass;\n      if (!(pane = this.$el.children(\".\" + paneClass)).length && !pane.children(\".\" + sliderClass).length) {\n        this.$el.append(\"<div class=\\\"\" + paneClass + \"\\\"><div class=\\\"\" + sliderClass + \"\\\" /></div>\");\n      }\n      this.pane = this.$el.children(\".\" + paneClass);\n      this.slider = this.pane.find(\".\" + sliderClass);\n      if (BROWSER_SCROLLBAR_WIDTH === 0 && isFFWithBuggyScrollbar()) {\n        currentPadding = window.getComputedStyle(this.content, null).getPropertyValue('padding-right').replace(/[^0-9.]+/g, '');\n        cssRule = {\n          right: -14,\n          paddingRight: +currentPadding + 14\n        };\n      } else if (BROWSER_SCROLLBAR_WIDTH) {\n        cssRule = {\n          right: -BROWSER_SCROLLBAR_WIDTH\n        };\n        this.$el.addClass('has-scrollbar');\n      }\n      if (cssRule != null) {\n        this.$content.css(cssRule);\n      }\n      return this;\n    };\n\n\n    /**\n      @method restore\n      @private\n     */\n\n    NanoScroll.prototype.restore = function() {\n      this.stopped = false;\n      if (!this.iOSNativeScrolling) {\n        this.pane.show();\n      }\n      this.addEvents();\n    };\n\n\n    /**\n      Resets nanoScroller's scrollbar.\n      @method reset\n      @chainable\n      @example\n          $(\".nano\").nanoScroller();\n     */\n\n    NanoScroll.prototype.reset = function() {\n      var content, contentHeight, contentPosition, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, parentMaxHeight, right, sliderHeight;\n      if (this.iOSNativeScrolling) {\n        this.contentHeight = this.content.scrollHeight;\n        return;\n      }\n      if (!this.$el.find(\".\" + this.options.paneClass).length) {\n        this.generate().stop();\n      }\n      if (this.stopped) {\n        this.restore();\n      }\n      content = this.content;\n      contentStyle = content.style;\n      contentStyleOverflowY = contentStyle.overflowY;\n      if (BROWSER_IS_IE7) {\n        this.$content.css({\n          height: this.$content.height()\n        });\n      }\n      contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH;\n      parentMaxHeight = parseInt(this.$el.css(\"max-height\"), 10);\n      if (parentMaxHeight > 0) {\n        this.$el.height(\"\");\n        this.$el.height(content.scrollHeight > parentMaxHeight ? parentMaxHeight : content.scrollHeight);\n      }\n      paneHeight = this.pane.outerHeight(false);\n      paneTop = parseInt(this.pane.css('top'), 10);\n      paneBottom = parseInt(this.pane.css('bottom'), 10);\n      paneOuterHeight = paneHeight + paneTop + paneBottom;\n      sliderHeight = Math.round(paneOuterHeight / contentHeight * paneOuterHeight);\n      if (sliderHeight < this.options.sliderMinHeight) {\n        sliderHeight = this.options.sliderMinHeight;\n      } else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) {\n        sliderHeight = this.options.sliderMaxHeight;\n      }\n      if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) {\n        sliderHeight += BROWSER_SCROLLBAR_WIDTH;\n      }\n      this.maxSliderTop = paneOuterHeight - sliderHeight;\n      this.contentHeight = contentHeight;\n      this.paneHeight = paneHeight;\n      this.paneOuterHeight = paneOuterHeight;\n      this.sliderHeight = sliderHeight;\n      this.paneTop = paneTop;\n      this.slider.height(sliderHeight);\n      this.events.scroll();\n      this.pane.show();\n      this.isActive = true;\n      if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) {\n        this.pane.hide();\n        this.isActive = false;\n      } else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) {\n        this.slider.hide();\n      } else {\n        this.slider.show();\n      }\n      this.$el.toggleClass('active-scrollbar', this.isActive);\n      this.pane.css({\n        opacity: (this.options.alwaysVisible ? 1 : ''),\n        visibility: (this.options.alwaysVisible ? 'visible' : '')\n      });\n      contentPosition = this.$content.css('position');\n      if (contentPosition === 'static' || contentPosition === 'relative') {\n        right = parseInt(this.$content.css('right'), 10);\n        if (right) {\n          this.$content.css({\n            right: '',\n            marginRight: right\n          });\n        }\n      }\n      return this;\n    };\n\n\n    /**\n      @method scroll\n      @private\n      @example\n          $(\".nano\").nanoScroller({ scroll: 'top' });\n     */\n\n    NanoScroll.prototype.scroll = function() {\n      if (!this.isActive) {\n        return;\n      }\n      this.sliderY = Math.max(0, this.sliderY);\n      this.sliderY = Math.min(this.maxSliderTop, this.sliderY);\n      this.$content.scrollTop(this.maxScrollTop * this.sliderY / this.maxSliderTop);\n      if (!this.iOSNativeScrolling) {\n        this.updateScrollValues();\n        this.setOnScrollStyles();\n      }\n      return this;\n    };\n\n\n    /**\n      Scroll at the bottom with an offset value\n      @method scrollBottom\n      @param offsetY {Number}\n      @chainable\n      @example\n          $(\".nano\").nanoScroller({ scrollBottom: value });\n     */\n\n    NanoScroll.prototype.scrollBottom = function(offsetY) {\n      if (!this.isActive) {\n        return;\n      }\n      this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL);\n      this.stop().restore();\n      return this;\n    };\n\n\n    /**\n      Scroll at the top with an offset value\n      @method scrollTop\n      @param offsetY {Number}\n      @chainable\n      @example\n          $(\".nano\").nanoScroller({ scrollTop: value });\n     */\n\n    NanoScroll.prototype.scrollTop = function(offsetY) {\n      if (!this.isActive) {\n        return;\n      }\n      this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL);\n      this.stop().restore();\n      return this;\n    };\n\n\n    /**\n      Scroll to an element\n      @method scrollTo\n      @param node {Node} A node to scroll to.\n      @chainable\n      @example\n          $(\".nano\").nanoScroller({ scrollTo: $('#a_node') });\n     */\n\n    NanoScroll.prototype.scrollTo = function(node) {\n      if (!this.isActive) {\n        return;\n      }\n      this.scrollTop(this.$el.find(node).get(0).offsetTop);\n      return this;\n    };\n\n\n    /**\n      To stop the operation.\n      This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI.\n      @method stop\n      @chainable\n      @example\n          $(\".nano\").nanoScroller({ stop: true });\n     */\n\n    NanoScroll.prototype.stop = function() {\n      if (cAF && this.scrollRAF) {\n        cAF(this.scrollRAF);\n        this.scrollRAF = null;\n      }\n      this.stopped = true;\n      this.removeEvents();\n      if (!this.iOSNativeScrolling) {\n        this.pane.hide();\n      }\n      return this;\n    };\n\n\n    /**\n      Destroys nanoScroller and restores browser's native scrollbar.\n      @method destroy\n      @chainable\n      @example\n          $(\".nano\").nanoScroller({ destroy: true });\n     */\n\n    NanoScroll.prototype.destroy = function() {\n      if (!this.stopped) {\n        this.stop();\n      }\n      if (!this.iOSNativeScrolling && this.pane.length) {\n        this.pane.remove();\n      }\n      if (BROWSER_IS_IE7) {\n        this.$content.height('');\n      }\n      this.$content.removeAttr('tabindex');\n      if (this.$el.hasClass('has-scrollbar')) {\n        this.$el.removeClass('has-scrollbar');\n        this.$content.css({\n          right: ''\n        });\n      }\n      return this;\n    };\n\n\n    /**\n      To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s).\n      Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him.\n      @method flash\n      @chainable\n      @example\n          $(\".nano\").nanoScroller({ flash: true });\n     */\n\n    NanoScroll.prototype.flash = function() {\n      if (this.iOSNativeScrolling) {\n        return;\n      }\n      if (!this.isActive) {\n        return;\n      }\n      this.reset();\n      this.pane.addClass('flashed');\n      setTimeout((function(_this) {\n        return function() {\n          _this.pane.removeClass('flashed');\n        };\n      })(this), this.options.flashDelay);\n      return this;\n    };\n\n    return NanoScroll;\n\n  })();\n  $.fn.nanoScroller = function(settings) {\n    return this.each(function() {\n      var options, scrollbar;\n      if (!(scrollbar = this.nanoscroller)) {\n        options = $.extend({}, defaults, settings);\n        this.nanoscroller = scrollbar = new NanoScroll(this, options);\n      }\n      if (settings && typeof settings === \"object\") {\n        $.extend(scrollbar.options, settings);\n        if (settings.scrollBottom != null) {\n          return scrollbar.scrollBottom(settings.scrollBottom);\n        }\n        if (settings.scrollTop != null) {\n          return scrollbar.scrollTop(settings.scrollTop);\n        }\n        if (settings.scrollTo) {\n          return scrollbar.scrollTo(settings.scrollTo);\n        }\n        if (settings.scroll === 'bottom') {\n          return scrollbar.scrollBottom(0);\n        }\n        if (settings.scroll === 'top') {\n          return scrollbar.scrollTop(0);\n        }\n        if (settings.scroll && settings.scroll instanceof $) {\n          return scrollbar.scrollTo(settings.scroll);\n        }\n        if (settings.stop) {\n          return scrollbar.stop();\n        }\n        if (settings.destroy) {\n          return scrollbar.destroy();\n        }\n        if (settings.flash) {\n          return scrollbar.flash();\n        }\n      }\n      return scrollbar.reset();\n    });\n  };\n  $.fn.nanoScroller.Constructor = NanoScroll;\n})(jQuery, window, document);\n\n"
  },
  {
    "path": "app/vendor/jsbn/THIRDPARTY_LICENSE",
    "content": "Licensing\n---------\n\nThis software is covered under the following copyright:\n\n/*\n * Copyright (c) 2003-2005  Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND, \n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY \n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  \n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n\nAddress all questions regarding this license to:\n\n  Tom Wu\n  tjw@cs.Stanford.EDU\n"
  },
  {
    "path": "app/vendor/jsbn/jsbn_combined.js",
    "content": "// Copyright (c) 2005  Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n\n// Basic JavaScript BN library - subset useful for RSA encryption.\n\n// Bits per digit\nvar dbits;\n\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = ((canary&0xffffff)==0xefcafe);\n\n// (public) Constructor\nfunction BigInteger(a,b,c) {\n  if(a != null)\n    if(\"number\" == typeof a) this.fromNumber(a,b,c);\n    else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n    else this.fromString(a,b);\n}\n\n// return new, unset BigInteger\nfunction nbi() { return new BigInteger(null); }\n\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\n\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1(i,x,w,j,c,n) {\n  while(--n >= 0) {\n    var v = x*this[i++]+w[j]+c;\n    c = Math.floor(v/0x4000000);\n    w[j++] = v&0x3ffffff;\n  }\n  return c;\n}\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2(i,x,w,j,c,n) {\n  var xl = x&0x7fff, xh = x>>15;\n  while(--n >= 0) {\n    var l = this[i]&0x7fff;\n    var h = this[i++]>>15;\n    var m = xh*l+h*xl;\n    l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n    c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n    w[j++] = l&0x3fffffff;\n  }\n  return c;\n}\n// Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3(i,x,w,j,c,n) {\n  var xl = x&0x3fff, xh = x>>14;\n  while(--n >= 0) {\n    var l = this[i]&0x3fff;\n    var h = this[i++]>>14;\n    var m = xh*l+h*xl;\n    l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n    c = (l>>28)+(m>>14)+xh*h;\n    w[j++] = l&0xfffffff;\n  }\n  return c;\n}\nif(j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n  BigInteger.prototype.am = am2;\n  dbits = 30;\n}\nelse if(j_lm && (navigator.appName != \"Netscape\")) {\n  BigInteger.prototype.am = am1;\n  dbits = 26;\n}\nelse { // Mozilla/Netscape seems to prefer am3\n  BigInteger.prototype.am = am3;\n  dbits = 28;\n}\n\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = ((1<<dbits)-1);\nBigInteger.prototype.DV = (1<<dbits);\n\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2,BI_FP);\nBigInteger.prototype.F1 = BI_FP-dbits;\nBigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n// Digit conversions\nvar BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nvar BI_RC = new Array();\nvar rr,vv;\nrr = \"0\".charCodeAt(0);\nfor(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\nrr = \"a\".charCodeAt(0);\nfor(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\nrr = \"A\".charCodeAt(0);\nfor(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\nfunction int2char(n) { return BI_RM.charAt(n); }\nfunction intAt(s,i) {\n  var c = BI_RC[s.charCodeAt(i)];\n  return (c==null)?-1:c;\n}\n\n// (protected) copy this to r\nfunction bnpCopyTo(r) {\n  for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n  r.t = this.t;\n  r.s = this.s;\n}\n\n// (protected) set from integer value x, -DV <= x < DV\nfunction bnpFromInt(x) {\n  this.t = 1;\n  this.s = (x<0)?-1:0;\n  if(x > 0) this[0] = x;\n  else if(x < -1) this[0] = x+this.DV;\n  else this.t = 0;\n}\n\n// return bigint initialized to value\nfunction nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n// (protected) set from string and radix\nfunction bnpFromString(s,b,signed) {\n  var k;\n  if(b == 16) k = 4;\n  else if(b == 8) k = 3;\n  else if(b == 256) k = 8; // byte array\n  else if(b == 2) k = 1;\n  else if(b == 32) k = 5;\n  else if(b == 4) k = 2;\n  else { this.fromRadix(s,b); return; }\n  this.t = 0;\n  this.s = 0;\n  var i = s.length, mi = false, sh = 0;\n  while(--i >= 0) {\n    var x = (k==8)?s[i]&0xff:intAt(s,i);\n    if(x < 0) {\n      if(s.charAt(i) == \"-\") mi = true;\n      continue;\n    }\n    mi = false;\n    if(sh == 0)\n      this[this.t++] = x;\n    else if(sh+k > this.DB) {\n      this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n      this[this.t++] = (x>>(this.DB-sh));\n    }\n    else\n      this[this.t-1] |= x<<sh;\n    sh += k;\n    if(sh >= this.DB) sh -= this.DB;\n  }\n  // Disabled due to '-' prefix in toString\n  if(k == 8 && (s[0]&0x80) != 0 && signed) {\n    this.s = -1;\n    if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n  }\n  this.clamp();\n  if(mi) BigInteger.ZERO.subTo(this,this);\n}\n\n// (protected) clamp off excess high words\nfunction bnpClamp() {\n  var c = this.s&this.DM;\n  while(this.t > 0 && this[this.t-1] == c) --this.t;\n}\n\n// (public) return string representation in given radix\nfunction bnToString(b) {\n  if(this.s < 0) return \"-\"+this.negate().toString(b);\n  var k;\n  if(b == 16) k = 4;\n  else if(b == 8) k = 3;\n  else if(b == 2) k = 1;\n  else if(b == 32) k = 5;\n  else if(b == 4) k = 2;\n  else return this.toRadix(b);\n  var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n  var p = this.DB-(i*this.DB)%k;\n  if(i-- > 0) {\n    if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n    while(i >= 0) {\n      if(p < k) {\n        d = (this[i]&((1<<p)-1))<<(k-p);\n        d |= this[--i]>>(p+=this.DB-k);\n      }\n      else {\n        d = (this[i]>>(p-=k))&km;\n        if(p <= 0) { p += this.DB; --i; }\n      }\n      if(d > 0) m = true;\n      if(m) r += int2char(d);\n    }\n  }\n  return m?r:\"0\";\n}\n\n// (public) -this\nfunction bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n// (public) |this|\nfunction bnAbs() { return (this.s<0)?this.negate():this; }\n\n// (public) return + if this > a, - if this < a, 0 if equal\nfunction bnCompareTo(a) {\n  var r = this.s-a.s;\n  if(r != 0) return r;\n  var i = this.t;\n  r = i-a.t;\n  if(r != 0) return (this.s<0)?-r:r;\n  while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n  return 0;\n}\n\n// returns bit length of the integer x\nfunction nbits(x) {\n  var r = 1, t;\n  if((t=x>>>16) != 0) { x = t; r += 16; }\n  if((t=x>>8) != 0) { x = t; r += 8; }\n  if((t=x>>4) != 0) { x = t; r += 4; }\n  if((t=x>>2) != 0) { x = t; r += 2; }\n  if((t=x>>1) != 0) { x = t; r += 1; }\n  return r;\n}\n\n// (public) return the number of bits in \"this\"\nfunction bnBitLength() {\n  if(this.t <= 0) return 0;\n  return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n}\n\n// (protected) r = this << n*DB\nfunction bnpDLShiftTo(n,r) {\n  var i;\n  for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n  for(i = n-1; i >= 0; --i) r[i] = 0;\n  r.t = this.t+n;\n  r.s = this.s;\n}\n\n// (protected) r = this >> n*DB\nfunction bnpDRShiftTo(n,r) {\n  for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n  r.t = Math.max(this.t-n,0);\n  r.s = this.s;\n}\n\n// (protected) r = this << n\nfunction bnpLShiftTo(n,r) {\n  var bs = n%this.DB;\n  var cbs = this.DB-bs;\n  var bm = (1<<cbs)-1;\n  var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n  for(i = this.t-1; i >= 0; --i) {\n    r[i+ds+1] = (this[i]>>cbs)|c;\n    c = (this[i]&bm)<<bs;\n  }\n  for(i = ds-1; i >= 0; --i) r[i] = 0;\n  r[ds] = c;\n  r.t = this.t+ds+1;\n  r.s = this.s;\n  r.clamp();\n}\n\n// (protected) r = this >> n\nfunction bnpRShiftTo(n,r) {\n  r.s = this.s;\n  var ds = Math.floor(n/this.DB);\n  if(ds >= this.t) { r.t = 0; return; }\n  var bs = n%this.DB;\n  var cbs = this.DB-bs;\n  var bm = (1<<bs)-1;\n  r[0] = this[ds]>>bs;\n  for(var i = ds+1; i < this.t; ++i) {\n    r[i-ds-1] |= (this[i]&bm)<<cbs;\n    r[i-ds] = this[i]>>bs;\n  }\n  if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n  r.t = this.t-ds;\n  r.clamp();\n}\n\n// (protected) r = this - a\nfunction bnpSubTo(a,r) {\n  var i = 0, c = 0, m = Math.min(a.t,this.t);\n  while(i < m) {\n    c += this[i]-a[i];\n    r[i++] = c&this.DM;\n    c >>= this.DB;\n  }\n  if(a.t < this.t) {\n    c -= a.s;\n    while(i < this.t) {\n      c += this[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c += this.s;\n  }\n  else {\n    c += this.s;\n    while(i < a.t) {\n      c -= a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c -= a.s;\n  }\n  r.s = (c<0)?-1:0;\n  if(c < -1) r[i++] = this.DV+c;\n  else if(c > 0) r[i++] = c;\n  r.t = i;\n  r.clamp();\n}\n\n// (protected) r = this * a, r != this,a (HAC 14.12)\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyTo(a,r) {\n  var x = this.abs(), y = a.abs();\n  var i = x.t;\n  r.t = i+y.t;\n  while(--i >= 0) r[i] = 0;\n  for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n  r.s = 0;\n  r.clamp();\n  if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n}\n\n// (protected) r = this^2, r != this (HAC 14.16)\nfunction bnpSquareTo(r) {\n  var x = this.abs();\n  var i = r.t = 2*x.t;\n  while(--i >= 0) r[i] = 0;\n  for(i = 0; i < x.t-1; ++i) {\n    var c = x.am(i,x[i],r,2*i,0,1);\n    if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n      r[i+x.t] -= x.DV;\n      r[i+x.t+1] = 1;\n    }\n  }\n  if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n  r.s = 0;\n  r.clamp();\n}\n\n// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n// r != q, this != m.  q or r may be null.\nfunction bnpDivRemTo(m,q,r) {\n  var pm = m.abs();\n  if(pm.t <= 0) return;\n  var pt = this.abs();\n  if(pt.t < pm.t) {\n    if(q != null) q.fromInt(0);\n    if(r != null) this.copyTo(r);\n    return;\n  }\n  if(r == null) r = nbi();\n  var y = nbi(), ts = this.s, ms = m.s;\n  var nsh = this.DB-nbits(pm[pm.t-1]);  // normalize modulus\n  if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n  else { pm.copyTo(y); pt.copyTo(r); }\n  var ys = y.t;\n  var y0 = y[ys-1];\n  if(y0 == 0) return;\n  var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n  var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n  var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n  y.dlShiftTo(j,t);\n  if(r.compareTo(t) >= 0) {\n    r[r.t++] = 1;\n    r.subTo(t,r);\n  }\n  BigInteger.ONE.dlShiftTo(ys,t);\n  t.subTo(y,y); // \"negative\" y so we can replace sub with am later\n  while(y.t < ys) y[y.t++] = 0;\n  while(--j >= 0) {\n    // Estimate quotient digit\n    var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n    if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {  // Try it out\n      y.dlShiftTo(j,t);\n      r.subTo(t,r);\n      while(r[i] < --qd) r.subTo(t,r);\n    }\n  }\n  if(q != null) {\n    r.drShiftTo(ys,q);\n    if(ts != ms) BigInteger.ZERO.subTo(q,q);\n  }\n  r.t = ys;\n  r.clamp();\n  if(nsh > 0) r.rShiftTo(nsh,r);  // Denormalize remainder\n  if(ts < 0) BigInteger.ZERO.subTo(r,r);\n}\n\n// (public) this mod a\nfunction bnMod(a) {\n  var r = nbi();\n  this.abs().divRemTo(a,null,r);\n  if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n  return r;\n}\n\n// Modular reduction using \"classic\" algorithm\nfunction Classic(m) { this.m = m; }\nfunction cConvert(x) {\n  if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n  else return x;\n}\nfunction cRevert(x) { return x; }\nfunction cReduce(x) { x.divRemTo(this.m,null,x); }\nfunction cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\nfunction cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\nClassic.prototype.convert = cConvert;\nClassic.prototype.revert = cRevert;\nClassic.prototype.reduce = cReduce;\nClassic.prototype.mulTo = cMulTo;\nClassic.prototype.sqrTo = cSqrTo;\n\n// (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n// justification:\n//         xy == 1 (mod m)\n//         xy =  1+km\n//   xy(2-xy) = (1+km)(1-km)\n// x[y(2-xy)] = 1-k^2m^2\n// x[y(2-xy)] == 1 (mod m^2)\n// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n// JS multiply \"overflows\" differently from C/C++, so care is needed here.\nfunction bnpInvDigit() {\n  if(this.t < 1) return 0;\n  var x = this[0];\n  if((x&1) == 0) return 0;\n  var y = x&3;    // y == 1/x mod 2^2\n  y = (y*(2-(x&0xf)*y))&0xf;  // y == 1/x mod 2^4\n  y = (y*(2-(x&0xff)*y))&0xff;  // y == 1/x mod 2^8\n  y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16\n  // last step - calculate inverse mod DV directly;\n  // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n  y = (y*(2-x*y%this.DV))%this.DV;    // y == 1/x mod 2^dbits\n  // we really want the negative inverse, and -DV < y < DV\n  return (y>0)?this.DV-y:-y;\n}\n\n// Montgomery reduction\nfunction Montgomery(m) {\n  this.m = m;\n  this.mp = m.invDigit();\n  this.mpl = this.mp&0x7fff;\n  this.mph = this.mp>>15;\n  this.um = (1<<(m.DB-15))-1;\n  this.mt2 = 2*m.t;\n}\n\n// xR mod m\nfunction montConvert(x) {\n  var r = nbi();\n  x.abs().dlShiftTo(this.m.t,r);\n  r.divRemTo(this.m,null,r);\n  if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n  return r;\n}\n\n// x/R mod m\nfunction montRevert(x) {\n  var r = nbi();\n  x.copyTo(r);\n  this.reduce(r);\n  return r;\n}\n\n// x = x/R mod m (HAC 14.32)\nfunction montReduce(x) {\n  while(x.t <= this.mt2)  // pad x so am has enough room later\n    x[x.t++] = 0;\n  for(var i = 0; i < this.m.t; ++i) {\n    // faster way of calculating u0 = x[i]*mp mod DV\n    var j = x[i]&0x7fff;\n    var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n    // use am to combine the multiply-shift-add into one call\n    j = i+this.m.t;\n    x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n    // propagate carry\n    while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n  }\n  x.clamp();\n  x.drShiftTo(this.m.t,x);\n  if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n}\n\n// r = \"x^2/R mod m\"; x != r\nfunction montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n// r = \"xy/R mod m\"; x,y != r\nfunction montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\nMontgomery.prototype.convert = montConvert;\nMontgomery.prototype.revert = montRevert;\nMontgomery.prototype.reduce = montReduce;\nMontgomery.prototype.mulTo = montMulTo;\nMontgomery.prototype.sqrTo = montSqrTo;\n\n// (protected) true iff this is even\nfunction bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n// (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\nfunction bnpExp(e,z) {\n  if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n  var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n  g.copyTo(r);\n  while(--i >= 0) {\n    z.sqrTo(r,r2);\n    if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n    else { var t = r; r = r2; r2 = t; }\n  }\n  return z.revert(r);\n}\n\n// (public) this^e % m, 0 <= e < 2^32\nfunction bnModPowInt(e,m) {\n  var z;\n  if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n  return this.exp(e,z);\n}\n\n// protected\nBigInteger.prototype.copyTo = bnpCopyTo;\nBigInteger.prototype.fromInt = bnpFromInt;\nBigInteger.prototype.fromString = bnpFromString;\nBigInteger.prototype.clamp = bnpClamp;\nBigInteger.prototype.dlShiftTo = bnpDLShiftTo;\nBigInteger.prototype.drShiftTo = bnpDRShiftTo;\nBigInteger.prototype.lShiftTo = bnpLShiftTo;\nBigInteger.prototype.rShiftTo = bnpRShiftTo;\nBigInteger.prototype.subTo = bnpSubTo;\nBigInteger.prototype.multiplyTo = bnpMultiplyTo;\nBigInteger.prototype.squareTo = bnpSquareTo;\nBigInteger.prototype.divRemTo = bnpDivRemTo;\nBigInteger.prototype.invDigit = bnpInvDigit;\nBigInteger.prototype.isEven = bnpIsEven;\nBigInteger.prototype.exp = bnpExp;\n\n// public\nBigInteger.prototype.toString = bnToString;\nBigInteger.prototype.negate = bnNegate;\nBigInteger.prototype.abs = bnAbs;\nBigInteger.prototype.compareTo = bnCompareTo;\nBigInteger.prototype.bitLength = bnBitLength;\nBigInteger.prototype.mod = bnMod;\nBigInteger.prototype.modPowInt = bnModPowInt;\n\n// \"constants\"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);\n\n\n\n// Copyright (c) 2005-2009  Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n\n// Extended JavaScript BN functions, required for RSA private ops.\n\n// Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n// Version 1.2: square() API, isProbablePrime fix\n\n// (public)\nfunction bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n// (public) return value as integer\nfunction bnIntValue() {\n  if(this.s < 0) {\n    if(this.t == 1) return this[0]-this.DV;\n    else if(this.t == 0) return -1;\n  }\n  else if(this.t == 1) return this[0];\n  else if(this.t == 0) return 0;\n  // assumes 16 < DB < 32\n  return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n}\n\n// (public) return value as byte\nfunction bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }\n\n// (public) return value as short (assumes DB>=16)\nfunction bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }\n\n// (protected) return x s.t. r^x < DV\nfunction bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n// (public) 0 if this == 0, 1 if this > 0\nfunction bnSigNum() {\n  if(this.s < 0) return -1;\n  else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n  else return 1;\n}\n\n// (protected) convert to radix string\nfunction bnpToRadix(b) {\n  if(b == null) b = 10;\n  if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n  var cs = this.chunkSize(b);\n  var a = Math.pow(b,cs);\n  var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n  this.divRemTo(d,y,z);\n  while(y.signum() > 0) {\n    r = (a+z.intValue()).toString(b).substr(1) + r;\n    y.divRemTo(d,y,z);\n  }\n  return z.intValue().toString(b) + r;\n}\n\n// (protected) convert from radix string\nfunction bnpFromRadix(s,b) {\n  this.fromInt(0);\n  if(b == null) b = 10;\n  var cs = this.chunkSize(b);\n  var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n  for(var i = 0; i < s.length; ++i) {\n    var x = intAt(s,i);\n    if(x < 0) {\n      if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n      continue;\n    }\n    w = b*w+x;\n    if(++j >= cs) {\n      this.dMultiply(d);\n      this.dAddOffset(w,0);\n      j = 0;\n      w = 0;\n    }\n  }\n  if(j > 0) {\n    this.dMultiply(Math.pow(b,j));\n    this.dAddOffset(w,0);\n  }\n  if(mi) BigInteger.ZERO.subTo(this,this);\n}\n\n// (protected) alternate constructor\nfunction bnpFromNumber(a,b,c) {\n  if(\"number\" == typeof b) {\n    // new BigInteger(int,int,RNG)\n    if(a < 2) this.fromInt(1);\n    else {\n      this.fromNumber(a,c);\n      if(!this.testBit(a-1))  // force MSB set\n        this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n      if(this.isEven()) this.dAddOffset(1,0); // force odd\n      while(!this.isProbablePrime(b)) {\n        this.dAddOffset(2,0);\n        if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n      }\n    }\n  }\n  else {\n    // new BigInteger(int,RNG)\n    var x = new Array(), t = a&7;\n    x.length = (a>>3)+1;\n    b.nextBytes(x);\n    if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n    this.fromString(x,256);\n  }\n}\n\n// (public) convert to bigendian byte array\nfunction bnToByteArray(signed) {\n  var i = this.t, r = new Array();\n  r[0] = this.s;\n  var p = this.DB-(i*this.DB)%8, d, k = 0;\n  if(i-- > 0) {\n    if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)\n      r[k++] = d|(this.s<<(this.DB-p));\n    while(i >= 0) {\n      if(p < 8) {\n        d = (this[i]&((1<<p)-1))<<(8-p);\n        d |= this[--i]>>(p+=this.DB-8);\n      }\n      else {\n        d = (this[i]>>(p-=8))&0xff;\n        if(p <= 0) { p += this.DB; --i; }\n      }\n      if(signed && (d&0x80) != 0) d |= -256;\n      if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n      if(k > 0 || d != this.s) r[k++] = d;\n    }\n  }\n  return r;\n}\n\nfunction bnEquals(a) { return(this.compareTo(a)==0); }\nfunction bnMin(a) { return(this.compareTo(a)<0)?this:a; }\nfunction bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n// (protected) r = this op a (bitwise)\nfunction bnpBitwiseTo(a,op,r) {\n  var i, f, m = Math.min(a.t,this.t);\n  for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);\n  if(a.t < this.t) {\n    f = a.s&this.DM;\n    for(i = m; i < this.t; ++i) r[i] = op(this[i],f);\n    r.t = this.t;\n  }\n  else {\n    f = this.s&this.DM;\n    for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);\n    r.t = a.t;\n  }\n  r.s = op(this.s,a.s);\n  r.clamp();\n}\n\n// (public) this & a\nfunction op_and(x,y) { return x&y; }\nfunction bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n// (public) this | a\nfunction op_or(x,y) { return x|y; }\nfunction bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n// (public) this ^ a\nfunction op_xor(x,y) { return x^y; }\nfunction bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n// (public) this & ~a\nfunction op_andnot(x,y) { return x&~y; }\nfunction bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n// (public) ~this\nfunction bnNot() {\n  var r = nbi();\n  for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];\n  r.t = this.t;\n  r.s = ~this.s;\n  return r;\n}\n\n// (public) this << n\nfunction bnShiftLeft(n) {\n  var r = nbi();\n  if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\n  return r;\n}\n\n// (public) this >> n\nfunction bnShiftRight(n) {\n  var r = nbi();\n  if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\n  return r;\n}\n\n// return index of lowest 1-bit in x, x < 2^31\nfunction lbit(x) {\n  if(x == 0) return -1;\n  var r = 0;\n  if((x&0xffff) == 0) { x >>= 16; r += 16; }\n  if((x&0xff) == 0) { x >>= 8; r += 8; }\n  if((x&0xf) == 0) { x >>= 4; r += 4; }\n  if((x&3) == 0) { x >>= 2; r += 2; }\n  if((x&1) == 0) ++r;\n  return r;\n}\n\n// (public) returns index of lowest 1-bit (or -1 if none)\nfunction bnGetLowestSetBit() {\n  for(var i = 0; i < this.t; ++i)\n    if(this[i] != 0) return i*this.DB+lbit(this[i]);\n  if(this.s < 0) return this.t*this.DB;\n  return -1;\n}\n\n// return number of 1 bits in x\nfunction cbit(x) {\n  var r = 0;\n  while(x != 0) { x &= x-1; ++r; }\n  return r;\n}\n\n// (public) return number of set bits\nfunction bnBitCount() {\n  var r = 0, x = this.s&this.DM;\n  for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);\n  return r;\n}\n\n// (public) true iff nth bit is set\nfunction bnTestBit(n) {\n  var j = Math.floor(n/this.DB);\n  if(j >= this.t) return(this.s!=0);\n  return((this[j]&(1<<(n%this.DB)))!=0);\n}\n\n// (protected) this op (1<<n)\nfunction bnpChangeBit(n,op) {\n  var r = BigInteger.ONE.shiftLeft(n);\n  this.bitwiseTo(r,op,r);\n  return r;\n}\n\n// (public) this | (1<<n)\nfunction bnSetBit(n) { return this.changeBit(n,op_or); }\n\n// (public) this & ~(1<<n)\nfunction bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n// (public) this ^ (1<<n)\nfunction bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n// (protected) r = this + a\nfunction bnpAddTo(a,r) {\n  var i = 0, c = 0, m = Math.min(a.t,this.t);\n  while(i < m) {\n    c += this[i]+a[i];\n    r[i++] = c&this.DM;\n    c >>= this.DB;\n  }\n  if(a.t < this.t) {\n    c += a.s;\n    while(i < this.t) {\n      c += this[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c += this.s;\n  }\n  else {\n    c += this.s;\n    while(i < a.t) {\n      c += a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c += a.s;\n  }\n  r.s = (c<0)?-1:0;\n  if(c > 0) r[i++] = c;\n  else if(c < -1) r[i++] = this.DV+c;\n  r.t = i;\n  r.clamp();\n}\n\n// (public) this + a\nfunction bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n// (public) this - a\nfunction bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n// (public) this * a\nfunction bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n// (public) this^2\nfunction bnSquare() { var r = nbi(); this.squareTo(r); return r; }\n\n// (public) this / a\nfunction bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n// (public) this % a\nfunction bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n// (public) [this/a,this%a]\nfunction bnDivideAndRemainder(a) {\n  var q = nbi(), r = nbi();\n  this.divRemTo(a,q,r);\n  return new Array(q,r);\n}\n\n// (protected) this *= n, this >= 0, 1 < n < DV\nfunction bnpDMultiply(n) {\n  this[this.t] = this.am(0,n-1,this,0,0,this.t);\n  ++this.t;\n  this.clamp();\n}\n\n// (protected) this += n << w words, this >= 0\nfunction bnpDAddOffset(n,w) {\n  if(n == 0) return;\n  while(this.t <= w) this[this.t++] = 0;\n  this[w] += n;\n  while(this[w] >= this.DV) {\n    this[w] -= this.DV;\n    if(++w >= this.t) this[this.t++] = 0;\n    ++this[w];\n  }\n}\n\n// A \"null\" reducer\nfunction NullExp() {}\nfunction nNop(x) { return x; }\nfunction nMulTo(x,y,r) { x.multiplyTo(y,r); }\nfunction nSqrTo(x,r) { x.squareTo(r); }\n\nNullExp.prototype.convert = nNop;\nNullExp.prototype.revert = nNop;\nNullExp.prototype.mulTo = nMulTo;\nNullExp.prototype.sqrTo = nSqrTo;\n\n// (public) this^e\nfunction bnPow(e) { return this.exp(e,new NullExp()); }\n\n// (protected) r = lower n words of \"this * a\", a.t <= n\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyLowerTo(a,n,r) {\n  var i = Math.min(this.t+a.t,n);\n  r.s = 0; // assumes a,this >= 0\n  r.t = i;\n  while(i > 0) r[--i] = 0;\n  var j;\n  for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);\n  for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);\n  r.clamp();\n}\n\n// (protected) r = \"this * a\" without lower n words, n > 0\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyUpperTo(a,n,r) {\n  --n;\n  var i = r.t = this.t+a.t-n;\n  r.s = 0; // assumes a,this >= 0\n  while(--i >= 0) r[i] = 0;\n  for(i = Math.max(n-this.t,0); i < a.t; ++i)\n    r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);\n  r.clamp();\n  r.drShiftTo(1,r);\n}\n\n// Barrett modular reduction\nfunction Barrett(m) {\n  // setup Barrett\n  this.r2 = nbi();\n  this.q3 = nbi();\n  BigInteger.ONE.dlShiftTo(2*m.t,this.r2);\n  this.mu = this.r2.divide(m);\n  this.m = m;\n}\n\nfunction barrettConvert(x) {\n  if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\n  else if(x.compareTo(this.m) < 0) return x;\n  else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n}\n\nfunction barrettRevert(x) { return x; }\n\n// x = x mod m (HAC 14.42)\nfunction barrettReduce(x) {\n  x.drShiftTo(this.m.t-1,this.r2);\n  if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\n  this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\n  this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\n  while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\n  x.subTo(this.r2,x);\n  while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n}\n\n// r = x^2 mod m; x != r\nfunction barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n// r = x*y mod m; x,y != r\nfunction barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\nBarrett.prototype.convert = barrettConvert;\nBarrett.prototype.revert = barrettRevert;\nBarrett.prototype.reduce = barrettReduce;\nBarrett.prototype.mulTo = barrettMulTo;\nBarrett.prototype.sqrTo = barrettSqrTo;\n\n// (public) this^e % m (HAC 14.85)\nfunction bnModPow(e,m) {\n  var i = e.bitLength(), k, r = nbv(1), z;\n  if(i <= 0) return r;\n  else if(i < 18) k = 1;\n  else if(i < 48) k = 3;\n  else if(i < 144) k = 4;\n  else if(i < 768) k = 5;\n  else k = 6;\n  if(i < 8)\n    z = new Classic(m);\n  else if(m.isEven())\n    z = new Barrett(m);\n  else\n    z = new Montgomery(m);\n\n  // precomputation\n  var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\n  g[1] = z.convert(this);\n  if(k > 1) {\n    var g2 = nbi();\n    z.sqrTo(g[1],g2);\n    while(n <= km) {\n      g[n] = nbi();\n      z.mulTo(g2,g[n-2],g[n]);\n      n += 2;\n    }\n  }\n\n  var j = e.t-1, w, is1 = true, r2 = nbi(), t;\n  i = nbits(e[j])-1;\n  while(j >= 0) {\n    if(i >= k1) w = (e[j]>>(i-k1))&km;\n    else {\n      w = (e[j]&((1<<(i+1))-1))<<(k1-i);\n      if(j > 0) w |= e[j-1]>>(this.DB+i-k1);\n    }\n\n    n = k;\n    while((w&1) == 0) { w >>= 1; --n; }\n    if((i -= n) < 0) { i += this.DB; --j; }\n    if(is1) { // ret == 1, don't bother squaring or multiplying it\n      g[w].copyTo(r);\n      is1 = false;\n    }\n    else {\n      while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n      if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n      z.mulTo(r2,g[w],r);\n    }\n\n    while(j >= 0 && (e[j]&(1<<i)) == 0) {\n      z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n      if(--i < 0) { i = this.DB-1; --j; }\n    }\n  }\n  return z.revert(r);\n}\n\n// (public) gcd(this,a) (HAC 14.54)\nfunction bnGCD(a) {\n  var x = (this.s<0)?this.negate():this.clone();\n  var y = (a.s<0)?a.negate():a.clone();\n  if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\n  var i = x.getLowestSetBit(), g = y.getLowestSetBit();\n  if(g < 0) return x;\n  if(i < g) g = i;\n  if(g > 0) {\n    x.rShiftTo(g,x);\n    y.rShiftTo(g,y);\n  }\n  while(x.signum() > 0) {\n    if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n    if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n    if(x.compareTo(y) >= 0) {\n      x.subTo(y,x);\n      x.rShiftTo(1,x);\n    }\n    else {\n      y.subTo(x,y);\n      y.rShiftTo(1,y);\n    }\n  }\n  if(g > 0) y.lShiftTo(g,y);\n  return y;\n}\n\n// (protected) this % n, n < 2^26\nfunction bnpModInt(n) {\n  if(n <= 0) return 0;\n  var d = this.DV%n, r = (this.s<0)?n-1:0;\n  if(this.t > 0)\n    if(d == 0) r = this[0]%n;\n    else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;\n  return r;\n}\n\n// (public) 1/this % m (HAC 14.61)\nfunction bnModInverse(m) {\n  var ac = m.isEven();\n  if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n  var u = m.clone(), v = this.clone();\n  var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\n  while(u.signum() != 0) {\n    while(u.isEven()) {\n      u.rShiftTo(1,u);\n      if(ac) {\n        if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n        a.rShiftTo(1,a);\n      }\n      else if(!b.isEven()) b.subTo(m,b);\n      b.rShiftTo(1,b);\n    }\n    while(v.isEven()) {\n      v.rShiftTo(1,v);\n      if(ac) {\n        if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n        c.rShiftTo(1,c);\n      }\n      else if(!d.isEven()) d.subTo(m,d);\n      d.rShiftTo(1,d);\n    }\n    if(u.compareTo(v) >= 0) {\n      u.subTo(v,u);\n      if(ac) a.subTo(c,a);\n      b.subTo(d,b);\n    }\n    else {\n      v.subTo(u,v);\n      if(ac) c.subTo(a,c);\n      d.subTo(b,d);\n    }\n  }\n  if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n  if(d.compareTo(m) >= 0) return d.subtract(m);\n  if(d.signum() < 0) d.addTo(m,d); else return d;\n  if(d.signum() < 0) return d.add(m); else return d;\n}\n\nvar lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];\nvar lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n// (public) test primality with certainty >= 1-.5^t\nfunction bnIsProbablePrime(t) {\n  var i, x = this.abs();\n  if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {\n    for(i = 0; i < lowprimes.length; ++i)\n      if(x[0] == lowprimes[i]) return true;\n    return false;\n  }\n  if(x.isEven()) return false;\n  i = 1;\n  while(i < lowprimes.length) {\n    var m = lowprimes[i], j = i+1;\n    while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n    m = x.modInt(m);\n    while(i < j) if(m%lowprimes[i++] == 0) return false;\n  }\n  return x.millerRabin(t);\n}\n\n// (protected) true if probably prime (HAC 4.24, Miller-Rabin)\nfunction bnpMillerRabin(t) {\n  var n1 = this.subtract(BigInteger.ONE);\n  var k = n1.getLowestSetBit();\n  if(k <= 0) return false;\n  var r = n1.shiftRight(k);\n  t = (t+1)>>1;\n  if(t > lowprimes.length) t = lowprimes.length;\n  var a = nbi();\n  for(var i = 0; i < t; ++i) {\n    //Pick bases at random, instead of starting at 2\n    a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);\n    var y = a.modPow(r,this);\n    if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n      var j = 1;\n      while(j++ < k && y.compareTo(n1) != 0) {\n        y = y.modPowInt(2,this);\n        if(y.compareTo(BigInteger.ONE) == 0) return false;\n      }\n      if(y.compareTo(n1) != 0) return false;\n    }\n  }\n  return true;\n}\n\n// protected\nBigInteger.prototype.chunkSize = bnpChunkSize;\nBigInteger.prototype.toRadix = bnpToRadix;\nBigInteger.prototype.fromRadix = bnpFromRadix;\nBigInteger.prototype.fromNumber = bnpFromNumber;\nBigInteger.prototype.bitwiseTo = bnpBitwiseTo;\nBigInteger.prototype.changeBit = bnpChangeBit;\nBigInteger.prototype.addTo = bnpAddTo;\nBigInteger.prototype.dMultiply = bnpDMultiply;\nBigInteger.prototype.dAddOffset = bnpDAddOffset;\nBigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\nBigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\nBigInteger.prototype.modInt = bnpModInt;\nBigInteger.prototype.millerRabin = bnpMillerRabin;\n\n// public\nBigInteger.prototype.clone = bnClone;\nBigInteger.prototype.intValue = bnIntValue;\nBigInteger.prototype.byteValue = bnByteValue;\nBigInteger.prototype.shortValue = bnShortValue;\nBigInteger.prototype.signum = bnSigNum;\nBigInteger.prototype.toByteArray = bnToByteArray;\nBigInteger.prototype.equals = bnEquals;\nBigInteger.prototype.min = bnMin;\nBigInteger.prototype.max = bnMax;\nBigInteger.prototype.and = bnAnd;\nBigInteger.prototype.or = bnOr;\nBigInteger.prototype.xor = bnXor;\nBigInteger.prototype.andNot = bnAndNot;\nBigInteger.prototype.not = bnNot;\nBigInteger.prototype.shiftLeft = bnShiftLeft;\nBigInteger.prototype.shiftRight = bnShiftRight;\nBigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\nBigInteger.prototype.bitCount = bnBitCount;\nBigInteger.prototype.testBit = bnTestBit;\nBigInteger.prototype.setBit = bnSetBit;\nBigInteger.prototype.clearBit = bnClearBit;\nBigInteger.prototype.flipBit = bnFlipBit;\nBigInteger.prototype.add = bnAdd;\nBigInteger.prototype.subtract = bnSubtract;\nBigInteger.prototype.multiply = bnMultiply;\nBigInteger.prototype.divide = bnDivide;\nBigInteger.prototype.remainder = bnRemainder;\nBigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\nBigInteger.prototype.modPow = bnModPow;\nBigInteger.prototype.modInverse = bnModInverse;\nBigInteger.prototype.pow = bnPow;\nBigInteger.prototype.gcd = bnGCD;\nBigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n// JSBN-specific extension\nBigInteger.prototype.square = bnSquare;\n\n// BigInteger interfaces not implemented in jsbn:\n\n// BigInteger(int signum, byte[] magnitude)\n// double doubleValue()\n// float floatValue()\n// int hashCode()\n// long longValue()\n// static BigInteger valueOf(long val)\n\n\n\n\n\n// Random number generator - requires a PRNG backend, e.g. prng4.js\n\n// For best results, put code like\n// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>\n// in your main HTML document.\n\nvar rng_state;\nvar rng_pool;\nvar rng_pptr;\n\n// Mix in a 32-bit integer into the pool\nfunction rng_seed_int(x) {\n  rng_pool[rng_pptr++] ^= x & 255;\n  rng_pool[rng_pptr++] ^= (x >> 8) & 255;\n  rng_pool[rng_pptr++] ^= (x >> 16) & 255;\n  rng_pool[rng_pptr++] ^= (x >> 24) & 255;\n  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;\n}\n\n// Mix in the current time (w/milliseconds) into the pool\nfunction rng_seed_time() {\n  rng_seed_int(new Date().getTime());\n}\n\n// Initialize the pool with junk if needed.\nif(rng_pool == null) {\n  rng_pool = new Array();\n  rng_pptr = 0;\n  var global = typeof window !== 'undefined' ? window : this;\n  var t;\n  if (global && global.crypto && global.crypto.getRandomValues) {\n    // Use webcrypto if available\n    var ua = new Uint8Array(32);\n    global.crypto.getRandomValues(ua);\n    for(t = 0; t < 32; ++t)\n      rng_pool[rng_pptr++] = ua[t];\n  }\n  if(navigator.appName == \"Netscape\" && navigator.appVersion < \"5\" && global && global.crypto) {\n    // Extract entropy (256 bits) from NS4 RNG if available\n    var z = global.crypto.random(32);\n    for(t = 0; t < z.length; ++t)\n      rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;\n  }\n  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()\n    t = Math.floor(65536 * Math.random());\n    rng_pool[rng_pptr++] = t >>> 8;\n    rng_pool[rng_pptr++] = t & 255;\n  }\n  rng_pptr = 0;\n  rng_seed_time();\n  //rng_seed_int(window.screenX);\n  //rng_seed_int(window.screenY);\n}\n\nfunction rng_get_byte() {\n  if(rng_state == null) {\n    rng_seed_time();\n    rng_state = prng_newstate();\n    rng_state.init(rng_pool);\n    for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)\n      rng_pool[rng_pptr] = 0;\n    rng_pptr = 0;\n    //rng_pool = null;\n  }\n  // TODO: allow reseeding after first request\n  return rng_state.next();\n}\n\nfunction rng_get_bytes(ba) {\n  var i;\n  for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();\n}\n\nfunction SecureRandom() {}\n\nSecureRandom.prototype.nextBytes = rng_get_bytes;\n\n\n\n// prng4.js - uses Arcfour as a PRNG\n\nfunction Arcfour() {\n  this.i = 0;\n  this.j = 0;\n  this.S = new Array();\n}\n\n// Initialize arcfour context from key, an array of ints, each from [0..255]\nfunction ARC4init(key) {\n  var i, j, t;\n  for(i = 0; i < 256; ++i)\n    this.S[i] = i;\n  j = 0;\n  for(i = 0; i < 256; ++i) {\n    j = (j + this.S[i] + key[i % key.length]) & 255;\n    t = this.S[i];\n    this.S[i] = this.S[j];\n    this.S[j] = t;\n  }\n  this.i = 0;\n  this.j = 0;\n}\n\nfunction ARC4next() {\n  var t;\n  this.i = (this.i + 1) & 255;\n  this.j = (this.j + this.S[this.i]) & 255;\n  t = this.S[this.i];\n  this.S[this.i] = this.S[this.j];\n  this.S[this.j] = t;\n  return this.S[(t + this.S[this.i]) & 255];\n}\n\nArcfour.prototype.init = ARC4init;\nArcfour.prototype.next = ARC4next;\n\n// Plug in your RNG constructor here\nfunction prng_newstate() {\n  return new Arcfour();\n}\n\n// Pool size must be a multiple of 4 and greater than 32.\n// An array of bytes the size of the pool will be passed to init()\nvar rng_psize = 256;\n"
  },
  {
    "path": "app/vendor/leemon_bigint/bigint.js",
    "content": "////////////////////////////////////////////////////////////////////////////////////////\n// Big Integer Library v. 5.5\n// Created 2000, last modified 2013\n// Leemon Baird\n// www.leemon.com\n//\n// Version history:\n// v 5.5  17 Mar 2013\n//   - two lines of a form like \"if (x<0) x+=n\" had the \"if\" changed to \"while\" to \n//     handle the case when x<-n. (Thanks to James Ansell for finding that bug)\n// v 5.4  3 Oct 2009\n//   - added \"var i\" to greaterShift() so i is not global. (Thanks to PŽter Szab— for finding that bug)\n//\n// v 5.3  21 Sep 2009\n//   - added randProbPrime(k) for probable primes\n//   - unrolled loop in mont_ (slightly faster)\n//   - millerRabin now takes a bigInt parameter rather than an int\n//\n// v 5.2  15 Sep 2009\n//   - fixed capitalization in call to int2bigInt in randBigInt\n//     (thanks to Emili Evripidou, Reinhold Behringer, and Samuel Macaleese for finding that bug)\n//\n// v 5.1  8 Oct 2007 \n//   - renamed inverseModInt_ to inverseModInt since it doesn't change its parameters\n//   - added functions GCD and randBigInt, which call GCD_ and randBigInt_\n//   - fixed a bug found by Rob Visser (see comment with his name below)\n//   - improved comments\n//\n// This file is public domain.   You can use it for any purpose without restriction.\n// I do not guarantee that it is correct, so use it at your own risk.  If you use \n// it for something interesting, I'd appreciate hearing about it.  If you find \n// any bugs or make any improvements, I'd appreciate hearing about those too.\n// It would also be nice if my name and URL were left in the comments.  But none \n// of that is required.\n//\n// This code defines a bigInt library for arbitrary-precision integers.\n// A bigInt is an array of integers storing the value in chunks of bpe bits, \n// little endian (buff[0] is the least significant word).\n// Negative bigInts are stored two's complement.  Almost all the functions treat\n// bigInts as nonnegative.  The few that view them as two's complement say so\n// in their comments.  Some functions assume their parameters have at least one \n// leading zero element. Functions with an underscore at the end of the name put\n// their answer into one of the arrays passed in, and have unpredictable behavior \n// in case of overflow, so the caller must make sure the arrays are big enough to \n// hold the answer.  But the average user should never have to call any of the \n// underscored functions.  Each important underscored function has a wrapper function \n// of the same name without the underscore that takes care of the details for you.  \n// For each underscored function where a parameter is modified, that same variable \n// must not be used as another argument too.  So, you cannot square x by doing \n// multMod_(x,x,n).  You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).\n// Or simply use the multMod(x,x,n) function without the underscore, where\n// such issues never arise, because non-underscored functions never change\n// their parameters; they always allocate new memory for the answer that is returned.\n//\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size.  This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must \n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix.  In some cases, integer \n// can be negative.  Negative bigInts are 2s complement.\n// \n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first \n// time they're called with a given parameter size.\n// \n// bigInt  add(x,y)               //return (x+y) for bigInts x and y.  \n// bigInt  addInt(x,n)            //return (x+n) where x is a bigInt and n is an integer.\n// string  bigInt2str(x,base)     //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int     bitSize(x)             //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt  dup(x)                 //return a copy of bigInt x\n// boolean equals(x,y)            //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y)         //is bigint x equal to integer y?\n// bigInt  expand(x,n)            //return a copy of x with at least n elements, adding leading zeros if needed\n// Array   findPrimes(n)          //return array of all primes less than integer n\n// bigInt  GCD(x,y)               //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y)           //is x>y?  (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt  int2bigInt(t,n,m)      //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt  inverseMod(x,n)        //return (x**(-1) mod n) for bigInts x and n.  If no inverse exists, it returns null\n// int     inverseModInt(x,n)     //return x**(-1) mod n, for integers x and n.  Return 0 if there is no inverse\n// boolean isZero(x)              //is the bigInt x equal to zero?\n// boolean millerRabin(x,b)       //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1<b<x)\n// boolean millerRabinInt(x,b)    //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is int,    1<b<x)\n// bigInt  mod(x,n)               //return a new bigInt equal to (x mod n) for bigInts x and n.\n// int     modInt(x,n)            //return x mod n for bigInt x and integer n.\n// bigInt  mult(x,y)              //return x*y for bigInts x and y. This is faster when y<x.\n// bigInt  multMod(x,y,n)         //return (x*y mod n) for bigInts x,y,n.  For greater speed, let y<x.\n// boolean negative(x)            //is bigInt x negative?\n// bigInt  powMod(x,y,n)          //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation.  0**0=1. Faster for odd n.\n// bigInt  randBigInt(n,s)        //return an n-bit random BigInt (n>=1).  If s=1, then the most significant of those n bits is set to 1.\n// bigInt  randTruePrime(k)       //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt  randProbPrime(k)       //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt  str2bigInt(s,b,n,m)    //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt  sub(x,y)               //return (x-y) for bigInts x and y.  Negative answers will be 2s complement\n// bigInt  trim(x,k)              //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array \n// passed in is large enough to hold the result. \n//\n// void    addInt_(x,n)          //do x=x+n where x is a bigInt and n is an integer\n// void    add_(x,y)             //do x=x+y for bigInts x and y\n// void    copy_(x,y)            //do x=y on bigInts x and y\n// void    copyInt_(x,n)         //do x=n on bigInt x and integer n\n// void    GCD_(x,y)             //set x to the greatest common divisor of bigInts x and y, (y is destroyed).  (This never overflows its array).\n// boolean inverseMod_(x,n)      //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void    mod_(x,n)             //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void    mult_(x,y)            //do x=x*y for bigInts x and y.\n// void    multMod_(x,y,n)       //do x=x*y  mod n for bigInts x,y,n.\n// void    powMod_(x,y,n)        //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation.  0**0=1.\n// void    randBigInt_(b,n,s)    //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void    randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void    sub_(x,y)             //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version. \n// They each write a bigInt result to one or more parameters.  The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results. \n//\n// void addShift_(x,y,ys)       //do x=x+(y<<(ys*bpe))\n// void carry_(x)               //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r)        //divide x by y giving quotient q and remainder r\n// int  divInt_(x,n)            //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// int  eGCD_(x,y,d,a,b)        //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x)               //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement.  (This never overflows its array).\n// void leftShift_(x,n)         //left shift bigInt x by n bits.  n<bpe.\n// void linComb_(x,y,a,b)       //do x=a*x+b*y for bigInts x and y and integers a and b\n// void linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys\n// void mont_(x,y,n,np)         //Montgomery multiplication (see comments where the function is defined)\n// void multInt_(x,n)           //do x=x*n where x is a bigInt and n is an integer.\n// void rightShift_(x,n)        //right shift bigInt x by n bits.  0 <= n < bpe. (This never overflows its array).\n// void squareMod_(x,n)         //do x=x*x  mod n for bigInts x,n\n// void subShift_(x,y,ys)       //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.\n//\n// The following functions are based on algorithms from the _Handbook of Applied Cryptography_\n//    powMod_()           = algorithm 14.94, Montgomery exponentiation\n//    eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_\n//    GCD_()              = algorothm 14.57, Lehmer's algorithm\n//    mont_()             = algorithm 14.36, Montgomery multiplication\n//    divide_()           = algorithm 14.20  Multiple-precision division\n//    squareMod_()        = algorithm 14.16  Multiple-precision squaring\n//    randTruePrime_()    = algorithm  4.62, Maurer's algorithm\n//    millerRabin()       = algorithm  4.24, Miller-Rabin algorithm\n//\n// Profiling shows:\n//     randTruePrime_() spends:\n//         10% of its time in calls to powMod_()\n//         85% of its time in calls to millerRabin()\n//     millerRabin() spends:\n//         99% of its time in calls to powMod_()   (always with a base of 2)\n//     powMod_() spends:\n//         94% of its time in calls to mont_()  (almost always with x==y)\n//\n// This suggests there are several ways to speed up this library slightly:\n//     - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)\n//         -- this should especially focus on being fast when raising 2 to a power mod n\n//     - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test\n//     - tune the parameters in randTruePrime_(), including c, m, and recLimit\n//     - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking\n//       within the loop when all the parameters are the same length.\n//\n// There are several ideas that look like they wouldn't help much at all:\n//     - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)\n//     - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)\n//     - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n//       followed by a Montgomery reduction.  The intermediate answer will be twice as long as x, so that\n//       method would be slower.  This is unfortunate because the code currently spends almost all of its time\n//       doing mont_(x,x,...), both for randTruePrime_() and powMod_().  A faster method for Montgomery squaring\n//       would have a large impact on the speed of randTruePrime_() and powMod_().  HAC has a couple of poorly-worded\n//       sentences that seem to imply it's faster to do a non-modular square followed by a single\n//       Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\n//globals\nbpe=0;         //bits stored per array element\nmask=0;        //AND this with an array element to chop it down to bpe bits\nradix=mask+1;  //equals 2^bpe.  A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\ndigitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\\\"+-';\n\n//initialize the global variables\nfor (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++);  //bpe=number of bits in the mantissa on this platform\nbpe>>=1;                   //bpe=number of bits in one element of the array representing the bigInt\nmask=(1<<bpe)-1;           //AND the mask with an integer to get its bpe least significant bits\nradix=mask+1;              //2^bpe.  a single 1 bit to the left of the first bit of mask\none=int2bigInt(1,1,1);     //constant used in powMod_()\n\n//the following global variables are scratchpad memory to \n//reduce dynamic memory allocation in the inner loop\nt=new Array(0);\nss=t;       //used in mult_()\ns0=t;       //used in multMod_(), squareMod_() \ns1=t;       //used in powMod_(), multMod_(), squareMod_() \ns2=t;       //used in powMod_(), multMod_()\ns3=t;       //used in powMod_()\ns4=t; s5=t; //used in mod_()\ns6=t;       //used in bigInt2str()\ns7=t;       //used in powMod_()\nT=t;        //used in GCD_()\nsa=t;       //used in mont_()\nmr_x1=t; mr_r=t; mr_a=t;                                      //used in millerRabin()\neg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t;               //used in eGCD_(), inverseMod_()\nmd_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()\n\nprimes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t; \n  s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_()\n  \nrpprb=t; //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\n\n//return array of all primes less than integer n\nfunction findPrimes(n) {\n  var i,s,p,ans;\n  s=new Array(n);\n  for (i=0;i<n;i++)\n    s[i]=0;\n  s[0]=2;\n  p=0;    //first p elements of s are primes, the rest are a sieve\n  for(;s[p]<n;) {                  //s[p] is the pth prime\n    for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]\n      s[i]=1;\n    p++;\n    s[p]=s[p-1]+1;\n    for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n  }\n  ans=new Array(p);\n  for(i=0;i<p;i++)\n    ans[i]=s[i];\n  return ans;\n}\n\n\n//does a single round of Miller-Rabin base b consider x to be a possible prime?\n//x is a bigInt, and b is an integer, with b<x\nfunction millerRabinInt(x,b) {\n  if (mr_x1.length!=x.length) {\n    mr_x1=dup(x);\n    mr_r=dup(x);\n    mr_a=dup(x);\n  }\n\n  copyInt_(mr_a,b);\n  return millerRabin(x,mr_a);\n}\n\n//does a single round of Miller-Rabin base b consider x to be a possible prime?\n//x and b are bigInts with b<x\nfunction millerRabin(x,b) {\n  var i,j,k,s;\n\n  if (mr_x1.length!=x.length) {\n    mr_x1=dup(x);\n    mr_r=dup(x);\n    mr_a=dup(x);\n  }\n\n  copy_(mr_a,b);\n  copy_(mr_r,x);\n  copy_(mr_x1,x);\n\n  addInt_(mr_r,-1);\n  addInt_(mr_x1,-1);\n\n  //s=the highest power of two that divides mr_r\n  k=0;\n  for (i=0;i<mr_r.length;i++)\n    for (j=1;j<mask;j<<=1)\n      if (x[i] & j) {\n        s=(k<mr_r.length+bpe ? k : 0); \n         i=mr_r.length;\n         j=mask;\n      } else\n        k++;\n\n  if (s)                \n    rightShift_(mr_r,s);\n\n  powMod_(mr_a,mr_r,x);\n\n  if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {\n    j=1;\n    while (j<=s-1 && !equals(mr_a,mr_x1)) {\n      squareMod_(mr_a,x);\n      if (equalsInt(mr_a,1)) {\n        return 0;\n      }\n      j++;\n    }\n    if (!equals(mr_a,mr_x1)) {\n      return 0;\n    }\n  }\n  return 1;  \n}\n\n//returns how many bits long the bigInt is, not counting leading zeros.\nfunction bitSize(x) {\n  var j,z,w;\n  for (j=x.length-1; (x[j]==0) && (j>0); j--);\n  for (z=0,w=x[j]; w; (w>>=1),z++);\n  z+=bpe*j;\n  return z;\n}\n\n//return a copy of x with at least n elements, adding leading zeros if needed\nfunction expand(x,n) {\n  var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);\n  copy_(ans,x);\n  return ans;\n}\n\n//return a k-bit true random prime using Maurer's algorithm.\nfunction randTruePrime(k) {\n  var ans=int2bigInt(0,k,0);\n  randTruePrime_(ans,k);\n  return trim(ans,1);\n}\n\n//return a k-bit random probable prime with probability of error < 2^-80\nfunction randProbPrime(k) {\n  if (k>=600) return randProbPrimeRounds(k,2); //numbers from HAC table 4.3\n  if (k>=550) return randProbPrimeRounds(k,4);\n  if (k>=500) return randProbPrimeRounds(k,5);\n  if (k>=400) return randProbPrimeRounds(k,6);\n  if (k>=350) return randProbPrimeRounds(k,7);\n  if (k>=300) return randProbPrimeRounds(k,9);\n  if (k>=250) return randProbPrimeRounds(k,12); //numbers from HAC table 4.4\n  if (k>=200) return randProbPrimeRounds(k,15);\n  if (k>=150) return randProbPrimeRounds(k,18);\n  if (k>=100) return randProbPrimeRounds(k,27);\n              return randProbPrimeRounds(k,40); //number from HAC remark 4.26 (only an estimate)\n}\n\n//return a k-bit probable random prime using n rounds of Miller Rabin (after trial division with small primes)\t\nfunction randProbPrimeRounds(k,n) {\n  var ans, i, divisible, B; \n  B=30000;  //B is largest prime to use in trial division\n  ans=int2bigInt(0,k,0);\n  \n  //optimization: try larger and smaller B to find the best limit.\n  \n  if (primes.length==0)\n    primes=findPrimes(30000);  //check for divisibility by primes <=30000\n\n  if (rpprb.length!=ans.length)\n    rpprb=dup(ans);\n\n  for (;;) { //keep trying random values for ans until one appears to be prime\n    //optimization: pick a random number times L=2*3*5*...*p, plus a \n    //   random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n    //   This can reduce the amount of random number generation.\n    \n    randBigInt_(ans,k,0); //ans = a random odd number to check\n    ans[0] |= 1; \n    divisible=0;\n  \n    //check ans for divisibility by small primes up to B\n    for (i=0; (i<primes.length) && (primes[i]<=B); i++)\n      if (modInt(ans,primes[i])==0 && !equalsInt(ans,primes[i])) {\n        divisible=1;\n        break;\n      }      \n    \n    //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n    \n    //do n rounds of Miller Rabin, with random bases less than ans\n    for (i=0; i<n && !divisible; i++) {\n      randBigInt_(rpprb,k,0);\n      while(!greater(ans,rpprb)) //pick a random rpprb that's < ans\n        randBigInt_(rpprb,k,0);\n      if (!millerRabin(ans,rpprb))\n        divisible=1;\n    }\n    \n    if(!divisible)\n      return ans;\n  }  \n}\n\n//return a new bigInt equal to (x mod n) for bigInts x and n.\nfunction mod(x,n) {\n  var ans=dup(x);\n  mod_(ans,n);\n  return trim(ans,1);\n}\n\n//return (x+n) where x is a bigInt and n is an integer.\nfunction addInt(x,n) {\n  var ans=expand(x,x.length+1);\n  addInt_(ans,n);\n  return trim(ans,1);\n}\n\n//return x*y for bigInts x and y. This is faster when y<x.\nfunction mult(x,y) {\n  var ans=expand(x,x.length+y.length);\n  mult_(ans,y);\n  return trim(ans,1);\n}\n\n//return (x**y mod n) where x,y,n are bigInts and ** is exponentiation.  0**0=1. Faster for odd n.\nfunction powMod(x,y,n) {\n  var ans=expand(x,n.length);  \n  powMod_(ans,trim(y,2),trim(n,2),0);  //this should work without the trim, but doesn't\n  return trim(ans,1);\n}\n\n//return (x-y) for bigInts x and y.  Negative answers will be 2s complement\nfunction sub(x,y) {\n  var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); \n  sub_(ans,y);\n  return trim(ans,1);\n}\n\n//return (x+y) for bigInts x and y.  \nfunction add(x,y) {\n  var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); \n  add_(ans,y);\n  return trim(ans,1);\n}\n\n//return (x**(-1) mod n) for bigInts x and n.  If no inverse exists, it returns null\nfunction inverseMod(x,n) {\n  var ans=expand(x,n.length); \n  var s;\n  s=inverseMod_(ans,n);\n  return s ? trim(ans,1) : null;\n}\n\n//return (x*y mod n) for bigInts x,y,n.  For greater speed, let y<x.\nfunction multMod(x,y,n) {\n  var ans=expand(x,n.length);\n  multMod_(ans,y,n);\n  return trim(ans,1);\n}\n\n//generate a k-bit true random prime using Maurer's algorithm,\n//and put it into ans.  The bigInt ans must be large enough to hold it.\nfunction randTruePrime_(ans,k) {\n  var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;\n\n  if (primes.length==0)\n    primes=findPrimes(30000);  //check for divisibility by primes <=30000\n\n  if (pows.length==0) {\n    pows=new Array(512);\n    for (j=0;j<512;j++) {\n      pows[j]=Math.pow(2,j/511.-1.);\n    }\n  }\n\n  //c and m should be tuned for a particular machine and value of k, to maximize speed\n  c=0.1;  //c=0.1 in HAC\n  m=20;   //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n  recLimit=20; //stop recursion when k <=recLimit.  Must have recLimit >= 2\n\n  if (s_i2.length!=ans.length) {\n    s_i2=dup(ans);\n    s_R =dup(ans);\n    s_n1=dup(ans);\n    s_r2=dup(ans);\n    s_d =dup(ans);\n    s_x1=dup(ans);\n    s_x2=dup(ans);\n    s_b =dup(ans);\n    s_n =dup(ans);\n    s_i =dup(ans);\n    s_rm=dup(ans);\n    s_q =dup(ans);\n    s_a =dup(ans);\n    s_aa=dup(ans);\n  }\n\n  if (k <= recLimit) {  //generate small random primes by trial division up to its square root\n    pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k)\n    copyInt_(ans,0);\n    for (dd=1;dd;) {\n      dd=0;\n      ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k));  //random, k-bit, odd integer, with msb 1\n      for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k)\n        if (0==(ans[0]%primes[j])) {\n          dd=1;\n          break;\n        }\n      }\n    }\n    carry_(ans);\n    return;\n  }\n\n  B=c*k*k;    //try small primes up to B (or all the primes[] array if the largest is less than B).\n  if (k>2*m)  //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n    for (r=1; k-k*r<=m; )\n      r=pows[Math.floor(Math.random()*512)];   //r=Math.pow(2,Math.random()-1);\n  else\n    r=.5;\n\n  //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n  recSize=Math.floor(r*k)+1;\n\n  randTruePrime_(s_q,recSize);\n  copyInt_(s_i2,0);\n  s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe));   //s_i2=2^(k-2)\n  divide_(s_i2,s_q,s_i,s_rm);                        //s_i=floor((2^(k-1))/(2q))\n\n  z=bitSize(s_i);\n\n  for (;;) {\n    for (;;) {  //generate z-bit numbers until one falls in the range [0,s_i-1]\n      randBigInt_(s_R,z,0);\n      if (greater(s_i,s_R))\n        break;\n    }                //now s_R is in the range [0,s_i-1]\n    addInt_(s_R,1);  //now s_R is in the range [1,s_i]\n    add_(s_R,s_i);   //now s_R is in the range [s_i+1,2*s_i]\n\n    copy_(s_n,s_q);\n    mult_(s_n,s_R); \n    multInt_(s_n,2);\n    addInt_(s_n,1);    //s_n=2*s_R*s_q+1\n    \n    copy_(s_r2,s_R);\n    multInt_(s_r2,2);  //s_r2=2*s_R\n\n    //check s_n for divisibility by small primes up to B\n    for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++)\n      if (modInt(s_n,primes[j])==0 && !equalsInt(s_n,primes[j])) {\n        divisible=1;\n        break;\n      }      \n\n    if (!divisible)    //if it passes small primes check, then try a single Miller-Rabin base 2\n      if (!millerRabinInt(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_ \n        divisible=1;\n\n    if (!divisible) {  //if it passes that test, continue checking s_n\n      addInt_(s_n,-3);\n      for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--);  //strip leading zeros\n      for (zz=0,w=s_n[j]; w; (w>>=1),zz++);\n      zz+=bpe*j;                             //zz=number of bits in s_n, ignoring leading zeros\n      for (;;) {  //generate z-bit numbers until one falls in the range [0,s_n-1]\n        randBigInt_(s_a,zz,0);\n        if (greater(s_n,s_a))\n          break;\n      }                //now s_a is in the range [0,s_n-1]\n      addInt_(s_n,3);  //now s_a is in the range [0,s_n-4]\n      addInt_(s_a,2);  //now s_a is in the range [2,s_n-2]\n      copy_(s_b,s_a);\n      copy_(s_n1,s_n);\n      addInt_(s_n1,-1);\n      powMod_(s_b,s_n1,s_n);   //s_b=s_a^(s_n-1) modulo s_n\n      addInt_(s_b,-1);\n      if (isZero(s_b)) {\n        copy_(s_b,s_a);\n        powMod_(s_b,s_r2,s_n);\n        addInt_(s_b,-1);\n        copy_(s_aa,s_n);\n        copy_(s_d,s_b);\n        GCD_(s_d,s_n);  //if s_b and s_n are relatively prime, then s_n is a prime\n        if (equalsInt(s_d,1)) {\n          copy_(ans,s_aa);\n          return;     //if we've made it this far, then s_n is absolutely guaranteed to be prime\n        }\n      }\n    }\n  }\n}\n\n//Return an n-bit random BigInt (n>=1).  If s=1, then the most significant of those n bits is set to 1.\nfunction randBigInt(n,s) {\n  var a,b;\n  a=Math.floor((n-1)/bpe)+2; //# array elements to hold the BigInt with a leading 0 element\n  b=int2bigInt(0,0,a);\n  randBigInt_(b,n,s);\n  return b;\n}\n\n//Set b to an n-bit random BigInt.  If s=1, then the most significant of those n bits is set to 1.\n//Array b must be big enough to hold the result. Must have n>=1\nfunction randBigInt_(b,n,s) {\n  var i,a;\n  for (i=0;i<b.length;i++)\n    b[i]=0;\n  a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt\n  for (i=0;i<a;i++) {\n    b[i]=Math.floor(Math.random()*(1<<(bpe-1)));\n  }\n  b[a-1] &= (2<<((n-1)%bpe))-1;\n  if (s==1)\n    b[a-1] |= (1<<((n-1)%bpe));\n}\n\n//Return the greatest common divisor of bigInts x and y (each with same number of elements).\nfunction GCD(x,y) {\n  var xc,yc;\n  xc=dup(x);\n  yc=dup(y);\n  GCD_(xc,yc);\n  return xc;\n}\n\n//set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n//y is destroyed.\nfunction GCD_(x,y) {\n  var i,xp,yp,A,B,C,D,q,sing;\n  if (T.length!=x.length)\n    T=dup(x);\n\n  sing=1;\n  while (sing) { //while y has nonzero elements other than y[0]\n    sing=0;\n    for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0\n      if (y[i]) {\n        sing=1;\n        break;\n      }\n    if (!sing) break; //quit when y all zero elements except possibly y[0]\n\n    for (i=x.length;!x[i] && i>=0;i--);  //find most significant element of x\n    xp=x[i];\n    yp=y[i];\n    A=1; B=0; C=0; D=1;\n    while ((yp+C) && (yp+D)) {\n      q =Math.floor((xp+A)/(yp+C));\n      qp=Math.floor((xp+B)/(yp+D));\n      if (q!=qp)\n        break;\n      t= A-q*C;   A=C;   C=t;    //  do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)      \n      t= B-q*D;   B=D;   D=t;\n      t=xp-q*yp; xp=yp; yp=t;\n    }\n    if (B) {\n      copy_(T,x);\n      linComb_(x,y,A,B); //x=A*x+B*y\n      linComb_(y,T,D,C); //y=D*y+C*T\n    } else {\n      mod_(x,y);\n      copy_(T,x);\n      copy_(x,y);\n      copy_(y,T);\n    } \n  }\n  if (y[0]==0)\n    return;\n  t=modInt(x,y[0]);\n  copyInt_(x,y[0]);\n  y[0]=t;\n  while (y[0]) {\n    x[0]%=y[0];\n    t=x[0]; x[0]=y[0]; y[0]=t;\n  }\n}\n\n//do x=x**(-1) mod n, for bigInts x and n.\n//If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n//The x array must be at least as large as the n array.\nfunction inverseMod_(x,n) {\n  var k=1+2*Math.max(x.length,n.length);\n\n  if(!(x[0]&1)  && !(n[0]&1)) {  //if both inputs are even, then inverse doesn't exist\n    copyInt_(x,0);\n    return 0;\n  }\n\n  if (eg_u.length!=k) {\n    eg_u=new Array(k);\n    eg_v=new Array(k);\n    eg_A=new Array(k);\n    eg_B=new Array(k);\n    eg_C=new Array(k);\n    eg_D=new Array(k);\n  }\n\n  copy_(eg_u,x);\n  copy_(eg_v,n);\n  copyInt_(eg_A,1);\n  copyInt_(eg_B,0);\n  copyInt_(eg_C,0);\n  copyInt_(eg_D,1);\n  for (;;) {\n    while(!(eg_u[0]&1)) {  //while eg_u is even\n      halve_(eg_u);\n      if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2\n        halve_(eg_A);\n        halve_(eg_B);      \n      } else {\n        add_(eg_A,n);  halve_(eg_A);\n        sub_(eg_B,x);  halve_(eg_B);\n      }\n    }\n\n    while (!(eg_v[0]&1)) {  //while eg_v is even\n      halve_(eg_v);\n      if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2\n        halve_(eg_C);\n        halve_(eg_D);      \n      } else {\n        add_(eg_C,n);  halve_(eg_C);\n        sub_(eg_D,x);  halve_(eg_D);\n      }\n    }\n\n    if (!greater(eg_v,eg_u)) { //eg_v <= eg_u\n      sub_(eg_u,eg_v);\n      sub_(eg_A,eg_C);\n      sub_(eg_B,eg_D);\n    } else {                   //eg_v > eg_u\n      sub_(eg_v,eg_u);\n      sub_(eg_C,eg_A);\n      sub_(eg_D,eg_B);\n    }\n  \n    if (equalsInt(eg_u,0)) {\n      while (negative(eg_C)) //make sure answer is nonnegative\n        add_(eg_C,n);\n      copy_(x,eg_C);\n\n      if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse\n        copyInt_(x,0);\n        return 0;\n      }\n      return 1;\n    }\n  }\n}\n\n//return x**(-1) mod n, for integers x and n.  Return 0 if there is no inverse\nfunction inverseModInt(x,n) {\n  var a=1,b=0,t;\n  for (;;) {\n    if (x==1) return a;\n    if (x==0) return 0;\n    b-=a*Math.floor(n/x);\n    n%=x;\n\n    if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to +=\n    if (n==0) return 0;\n    a-=b*Math.floor(x/n);\n    x%=n;\n  }\n}\n\n//this deprecated function is for backward compatibility only. \nfunction inverseModInt_(x,n) {\n   return inverseModInt(x,n);\n}\n\n\n//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n//     v = GCD_(x,y) = a*x-b*y\n//The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\nfunction eGCD_(x,y,v,a,b) {\n  var g=0;\n  var k=Math.max(x.length,y.length);\n  if (eg_u.length!=k) {\n    eg_u=new Array(k);\n    eg_A=new Array(k);\n    eg_B=new Array(k);\n    eg_C=new Array(k);\n    eg_D=new Array(k);\n  }\n  while(!(x[0]&1)  && !(y[0]&1)) {  //while x and y both even\n    halve_(x);\n    halve_(y);\n    g++;\n  }\n  copy_(eg_u,x);\n  copy_(v,y);\n  copyInt_(eg_A,1);\n  copyInt_(eg_B,0);\n  copyInt_(eg_C,0);\n  copyInt_(eg_D,1);\n  for (;;) {\n    while(!(eg_u[0]&1)) {  //while u is even\n      halve_(eg_u);\n      if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2\n        halve_(eg_A);\n        halve_(eg_B);      \n      } else {\n        add_(eg_A,y);  halve_(eg_A);\n        sub_(eg_B,x);  halve_(eg_B);\n      }\n    }\n\n    while (!(v[0]&1)) {  //while v is even\n      halve_(v);\n      if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2\n        halve_(eg_C);\n        halve_(eg_D);      \n      } else {\n        add_(eg_C,y);  halve_(eg_C);\n        sub_(eg_D,x);  halve_(eg_D);\n      }\n    }\n\n    if (!greater(v,eg_u)) { //v<=u\n      sub_(eg_u,v);\n      sub_(eg_A,eg_C);\n      sub_(eg_B,eg_D);\n    } else {                //v>u\n      sub_(v,eg_u);\n      sub_(eg_C,eg_A);\n      sub_(eg_D,eg_B);\n    }\n    if (equalsInt(eg_u,0)) {\n      while (negative(eg_C)) {   //make sure a (C) is nonnegative\n        add_(eg_C,y);\n        sub_(eg_D,x);\n      }\n      multInt_(eg_D,-1);  ///make sure b (D) is nonnegative\n      copy_(a,eg_C);\n      copy_(b,eg_D);\n      leftShift_(v,g);\n      return;\n    }\n  }\n}\n\n\n//is bigInt x negative?\nfunction negative(x) {\n  return ((x[x.length-1]>>(bpe-1))&1);\n}\n\n\n//is (x << (shift*bpe)) > y?\n//x and y are nonnegative bigInts\n//shift is a nonnegative integer\nfunction greaterShift(x,y,shift) {\n  var i, kx=x.length, ky=y.length;\n  k=((kx+shift)<ky) ? (kx+shift) : ky;\n  for (i=ky-1-shift; i<kx && i>=0; i++) \n    if (x[i]>0)\n      return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger\n  for (i=kx-1+shift; i<ky; i++)\n    if (y[i]>0)\n      return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n  for (i=k-1; i>=shift; i--)\n    if      (x[i-shift]>y[i]) return 1;\n    else if (x[i-shift]<y[i]) return 0;\n  return 0;\n}\n\n//is x > y? (x and y both nonnegative)\nfunction greater(x,y) {\n  var i;\n  var k=(x.length<y.length) ? x.length : y.length;\n\n  for (i=x.length;i<y.length;i++)\n    if (y[i])\n      return 0;  //y has more digits\n\n  for (i=y.length;i<x.length;i++)\n    if (x[i])\n      return 1;  //x has more digits\n\n  for (i=k-1;i>=0;i--)\n    if (x[i]>y[i])\n      return 1;\n    else if (x[i]<y[i])\n      return 0;\n  return 0;\n}\n\n//divide x by y giving quotient q and remainder r.  (q=floor(x/y),  r=x mod y).  All 4 are bigints.\n//x must have at least one leading zero element.\n//y must be nonzero.\n//q and r must be arrays that are exactly the same length as x. (Or q can have more).\n//Must have x.length >= y.length >= 2.\nfunction divide_(x,y,q,r) {\n  var kx, ky;\n  var i,j,y1,y2,c,a,b;\n  copy_(r,x);\n  for (ky=y.length;y[ky-1]==0;ky--); //ky is number of elements in y, not including leading zeros\n\n  //normalize: ensure the most significant element of y has its highest bit set  \n  b=y[ky-1];\n  for (a=0; b; a++)\n    b>>=1;  \n  a=bpe-a;  //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n  leftShift_(y,a);  //multiply both by 1<<a now, then divide both by that at the end\n  leftShift_(r,a);\n\n  //Rob Visser discovered a bug: the following line was originally just before the normalization.\n  for (kx=r.length;r[kx-1]==0 && kx>ky;kx--); //kx is number of elements in normalized x, not including leading zeros\n\n  copyInt_(q,0);                      // q=0\n  while (!greaterShift(y,r,kx-ky)) {  // while (leftShift_(y,kx-ky) <= r) {\n    subShift_(r,y,kx-ky);             //   r=r-leftShift_(y,kx-ky)\n    q[kx-ky]++;                       //   q[kx-ky]++;\n  }                                   // }\n\n  for (i=kx-1; i>=ky; i--) {\n    if (r[i]==y[ky-1])\n      q[i-ky]=mask;\n    else\n      q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);\t\n\n    //The following for(;;) loop is equivalent to the commented while loop, \n    //except that the uncommented version avoids overflow.\n    //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n    //  while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n    //    q[i-ky]--;    \n    for (;;) {\n      y2=(ky>1 ? y[ky-2] : 0)*q[i-ky];\n      c=y2>>bpe;\n      y2=y2 & mask;\n      y1=c+q[i-ky]*y[ky-1];\n      c=y1>>bpe;\n      y1=y1 & mask;\n\n      if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i]) \n        q[i-ky]--;\n      else\n        break;\n    }\n\n    linCombShift_(r,y,-q[i-ky],i-ky);    //r=r-q[i-ky]*leftShift_(y,i-ky)\n    if (negative(r)) {\n      addShift_(r,y,i-ky);         //r=r+leftShift_(y,i-ky)\n      q[i-ky]--;\n    }\n  }\n\n  rightShift_(y,a);  //undo the normalization step\n  rightShift_(r,a);  //undo the normalization step\n}\n\n//do carries and borrows so each element of the bigInt x fits in bpe bits.\nfunction carry_(x) {\n  var i,k,c,b;\n  k=x.length;\n  c=0;\n  for (i=0;i<k;i++) {\n    c+=x[i];\n    b=0;\n    if (c<0) {\n      b=-(c>>bpe);\n      c+=b*radix;\n    }\n    x[i]=c & mask;\n    c=(c>>bpe)-b;\n  }\n}\n\n//return x mod n for bigInt x and integer n.\nfunction modInt(x,n) {\n  var i,c=0;\n  for (i=x.length-1; i>=0; i--)\n    c=(c*radix+x[i])%n;\n  return c;\n}\n\n//convert the integer t into a bigInt with at least the given number of bits.\n//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n//Pad the array with leading zeros so that it has at least minSize elements.\n//There will always be at least one leading 0 element.\nfunction int2bigInt(t,bits,minSize) {   \n  var i,k;\n  k=Math.ceil(bits/bpe)+1;\n  k=minSize>k ? minSize : k;\n  buff=new Array(k);\n  copyInt_(buff,t);\n  return buff;\n}\n\n//return the bigInt given a string representation in a given base.  \n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\nfunction str2bigInt(s,base,minSize) {\n  var d, i, j, x, y, kk;\n  var k=s.length;\n  if (base==-1) { //comma-separated list of array elements in decimal\n    x=new Array(0);\n    for (;;) {\n      y=new Array(x.length+1);\n      for (i=0;i<x.length;i++)\n        y[i+1]=x[i];\n      y[0]=parseInt(s,10);\n      x=y;\n      d=s.indexOf(',',0);\n      if (d<1) \n        break;\n      s=s.substring(d+1);\n      if (s.length==0)\n        break;\n    }\n    if (x.length<minSize) {\n      y=new Array(minSize);\n      copy_(y,x);\n      return y;\n    }\n    return x;\n  }\n\n  x=int2bigInt(0,base*k,0);\n  for (i=0;i<k;i++) {\n    d=digitsStr.indexOf(s.substring(i,i+1),0);\n    if (base<=36 && d>=36)  //convert lowercase to uppercase if base<=36\n      d-=26;\n    if (d>=base || d<0) {   //stop at first illegal character\n      break;\n    }\n    multInt_(x,base);\n    addInt_(x,d);\n  }\n\n  for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n  k=minSize>k+1 ? minSize : k+1;\n  y=new Array(k);\n  kk=k<x.length ? k : x.length;\n  for (i=0;i<kk;i++)\n    y[i]=x[i];\n  for (;i<k;i++)\n    y[i]=0;\n  return y;\n}\n\n//is bigint x equal to integer y?\n//y must have less than bpe bits\nfunction equalsInt(x,y) {\n  var i;\n  if (x[0]!=y)\n    return 0;\n  for (i=1;i<x.length;i++)\n    if (x[i])\n      return 0;\n  return 1;\n}\n\n//are bigints x and y equal?\n//this works even if x and y are different lengths and have arbitrarily many leading zeros\nfunction equals(x,y) {\n  var i;\n  var k=x.length<y.length ? x.length : y.length;\n  for (i=0;i<k;i++)\n    if (x[i]!=y[i])\n      return 0;\n  if (x.length>y.length) {\n    for (;i<x.length;i++)\n      if (x[i])\n        return 0;\n  } else {\n    for (;i<y.length;i++)\n      if (y[i])\n        return 0;\n  }\n  return 1;\n}\n\n//is the bigInt x equal to zero?\nfunction isZero(x) {\n  var i;\n  for (i=0;i<x.length;i++)\n    if (x[i])\n      return 0;\n  return 1;\n}\n\n//convert a bigInt into a string in a given base, from base 2 up to base 95.\n//Base -1 prints the contents of the array representing the number.\nfunction bigInt2str(x,base) {\n  var i,t,s=\"\";\n\n  if (s6.length!=x.length) \n    s6=dup(x);\n  else\n    copy_(s6,x);\n\n  if (base==-1) { //return the list of array contents\n    for (i=x.length-1;i>0;i--)\n      s+=x[i]+',';\n    s+=x[0];\n  }\n  else { //return it in the given base\n    while (!isZero(s6)) {\n      t=divInt_(s6,base);  //t=s6 % base; s6=floor(s6/base);\n      s=digitsStr.substring(t,t+1)+s;\n    }\n  }\n  if (s.length==0)\n    s=\"0\";\n  return s;\n}\n\n//returns a duplicate of bigInt x\nfunction dup(x) {\n  var i;\n  buff=new Array(x.length);\n  copy_(buff,x);\n  return buff;\n}\n\n//do x=y on bigInts x and y.  x must be an array at least as big as y (not counting the leading zeros in y).\nfunction copy_(x,y) {\n  var i;\n  var k=x.length<y.length ? x.length : y.length;\n  for (i=0;i<k;i++)\n    x[i]=y[i];\n  for (i=k;i<x.length;i++)\n    x[i]=0;\n}\n\n//do x=y on bigInt x and integer y.  \nfunction copyInt_(x,n) {\n  var i,c;\n  for (c=n,i=0;i<x.length;i++) {\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n}\n\n//do x=x+n where x is a bigInt and n is an integer.\n//x must be large enough to hold the result.\nfunction addInt_(x,n) {\n  var i,k,c,b;\n  x[0]+=n;\n  k=x.length;\n  c=0;\n  for (i=0;i<k;i++) {\n    c+=x[i];\n    b=0;\n    if (c<0) {\n      b=-(c>>bpe);\n      c+=b*radix;\n    }\n    x[i]=c & mask;\n    c=(c>>bpe)-b;\n    if (!c) return; //stop carrying as soon as the carry is zero\n  }\n}\n\n//right shift bigInt x by n bits.  0 <= n < bpe.\nfunction rightShift_(x,n) {\n  var i;\n  var k=Math.floor(n/bpe);\n  if (k) {\n    for (i=0;i<x.length-k;i++) //right shift x by k elements\n      x[i]=x[i+k];\n    for (;i<x.length;i++)\n      x[i]=0;\n    n%=bpe;\n  }\n  for (i=0;i<x.length-1;i++) {\n    x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n));\n  }\n  x[i]>>=n;\n}\n\n//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\nfunction halve_(x) {\n  var i;\n  for (i=0;i<x.length-1;i++) {\n    x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1));\n  }\n  x[i]=(x[i]>>1) | (x[i] & (radix>>1));  //most significant bit stays the same\n}\n\n//left shift bigInt x by n bits.\nfunction leftShift_(x,n) {\n  var i;\n  var k=Math.floor(n/bpe);\n  if (k) {\n    for (i=x.length; i>=k; i--) //left shift x by k elements\n      x[i]=x[i-k];\n    for (;i>=0;i--)\n      x[i]=0;  \n    n%=bpe;\n  }\n  if (!n)\n    return;\n  for (i=x.length-1;i>0;i--) {\n    x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n)));\n  }\n  x[i]=mask & (x[i]<<n);\n}\n\n//do x=x*n where x is a bigInt and n is an integer.\n//x must be large enough to hold the result.\nfunction multInt_(x,n) {\n  var i,k,c,b;\n  if (!n)\n    return;\n  k=x.length;\n  c=0;\n  for (i=0;i<k;i++) {\n    c+=x[i]*n;\n    b=0;\n    if (c<0) {\n      b=-(c>>bpe);\n      c+=b*radix;\n    }\n    x[i]=c & mask;\n    c=(c>>bpe)-b;\n  }\n}\n\n//do x=floor(x/n) for bigInt x and integer n, and return the remainder\nfunction divInt_(x,n) {\n  var i,r=0,s;\n  for (i=x.length-1;i>=0;i--) {\n    s=r*radix+x[i];\n    x[i]=Math.floor(s/n);\n    r=s%n;\n  }\n  return r;\n}\n\n//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n//x must be large enough to hold the answer.\nfunction linComb_(x,y,a,b) {\n  var i,c,k,kk;\n  k=x.length<y.length ? x.length : y.length;\n  kk=x.length;\n  for (c=0,i=0;i<k;i++) {\n    c+=a*x[i]+b*y[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n  for (i=k;i<kk;i++) {\n    c+=a*x[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n}\n\n//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n//x must be large enough to hold the answer.\nfunction linCombShift_(x,y,b,ys) {\n  var i,c,k,kk;\n  k=x.length<ys+y.length ? x.length : ys+y.length;\n  kk=x.length;\n  for (c=0,i=ys;i<k;i++) {\n    c+=x[i]+b*y[i-ys];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n  for (i=k;c && i<kk;i++) {\n    c+=x[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n}\n\n//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.\n//x must be large enough to hold the answer.\nfunction addShift_(x,y,ys) {\n  var i,c,k,kk;\n  k=x.length<ys+y.length ? x.length : ys+y.length;\n  kk=x.length;\n  for (c=0,i=ys;i<k;i++) {\n    c+=x[i]+y[i-ys];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n  for (i=k;c && i<kk;i++) {\n    c+=x[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n}\n\n//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.\n//x must be large enough to hold the answer.\nfunction subShift_(x,y,ys) {\n  var i,c,k,kk;\n  k=x.length<ys+y.length ? x.length : ys+y.length;\n  kk=x.length;\n  for (c=0,i=ys;i<k;i++) {\n    c+=x[i]-y[i-ys];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n  for (i=k;c && i<kk;i++) {\n    c+=x[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n}\n\n//do x=x-y for bigInts x and y.\n//x must be large enough to hold the answer.\n//negative answers will be 2s complement\nfunction sub_(x,y) {\n  var i,c,k,kk;\n  k=x.length<y.length ? x.length : y.length;\n  for (c=0,i=0;i<k;i++) {\n    c+=x[i]-y[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n  for (i=k;c && i<x.length;i++) {\n    c+=x[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n}\n\n//do x=x+y for bigInts x and y.\n//x must be large enough to hold the answer.\nfunction add_(x,y) {\n  var i,c,k,kk;\n  k=x.length<y.length ? x.length : y.length;\n  for (c=0,i=0;i<k;i++) {\n    c+=x[i]+y[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n  for (i=k;c && i<x.length;i++) {\n    c+=x[i];\n    x[i]=c & mask;\n    c>>=bpe;\n  }\n}\n\n//do x=x*y for bigInts x and y.  This is faster when y<x.\nfunction mult_(x,y) {\n  var i;\n  if (ss.length!=2*x.length)\n    ss=new Array(2*x.length);\n  copyInt_(ss,0);\n  for (i=0;i<y.length;i++)\n    if (y[i])\n      linCombShift_(ss,x,y[i],i);   //ss=1*ss+y[i]*(x<<(i*bpe))\n  copy_(x,ss);\n}\n\n//do x=x mod n for bigInts x and n.\nfunction mod_(x,n) {\n  if (s4.length!=x.length)\n    s4=dup(x);\n  else\n    copy_(s4,x);\n  if (s5.length!=x.length)\n    s5=dup(x);  \n  divide_(s4,n,s5,x);  //x = remainder of s4 / n\n}\n\n//do x=x*y mod n for bigInts x,y,n.\n//for greater speed, let y<x.\nfunction multMod_(x,y,n) {\n  var i;\n  if (s0.length!=2*x.length)\n    s0=new Array(2*x.length);\n  copyInt_(s0,0);\n  for (i=0;i<y.length;i++)\n    if (y[i])\n      linCombShift_(s0,x,y[i],i);   //s0=1*s0+y[i]*(x<<(i*bpe))\n  mod_(s0,n);\n  copy_(x,s0);\n}\n\n//do x=x*x mod n for bigInts x,n.\nfunction squareMod_(x,n) {\n  var i,j,d,c,kx,kn,k;\n  for (kx=x.length; kx>0 && !x[kx-1]; kx--);  //ignore leading zeros in x\n  k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n\n  if (s0.length!=k) \n    s0=new Array(k);\n  copyInt_(s0,0);\n  for (i=0;i<kx;i++) {\n    c=s0[2*i]+x[i]*x[i];\n    s0[2*i]=c & mask;\n    c>>=bpe;\n    for (j=i+1;j<kx;j++) {\n      c=s0[i+j]+2*x[i]*x[j]+c;\n      s0[i+j]=(c & mask);\n      c>>=bpe;\n    }\n    s0[i+kx]=c;\n  }\n  mod_(s0,n);\n  copy_(x,s0);\n}\n\n//return x with exactly k leading zero elements\nfunction trim(x,k) {\n  var i,y;\n  for (i=x.length; i>0 && !x[i-1]; i--);\n  y=new Array(i+k);\n  copy_(y,x);\n  return y;\n}\n\n//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation.  0**0=1.\n//this is faster when n is odd.  x usually needs to have as many elements as n.\nfunction powMod_(x,y,n) {\n  var k1,k2,kn,np;\n  if(s7.length!=n.length)\n    s7=dup(n);\n\n  //for even modulus, use a simple square-and-multiply algorithm,\n  //rather than using the more complex Montgomery algorithm.\n  if ((n[0]&1)==0) {\n    copy_(s7,x);\n    copyInt_(x,1);\n    while(!equalsInt(y,0)) {\n      if (y[0]&1)\n        multMod_(x,s7,n);\n      divInt_(y,2);\n      squareMod_(s7,n); \n    }\n    return;\n  }\n\n  //calculate np from n for the Montgomery multiplications\n  copyInt_(s7,0);\n  for (kn=n.length;kn>0 && !n[kn-1];kn--);\n  np=radix-inverseModInt(modInt(n,radix),radix);\n  s7[kn]=1;\n  multMod_(x ,s7,n);   // x = x * 2**(kn*bp) mod n\n\n  if (s3.length!=x.length)\n    s3=dup(x);\n  else\n    copy_(s3,x);\n\n  for (k1=y.length-1;k1>0 & !y[k1]; k1--);  //k1=first nonzero element of y\n  if (y[k1]==0) {  //anything to the 0th power is 1\n    copyInt_(x,1);\n    return;\n  }\n  for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1);  //k2=position of first 1 bit in y[k1]\n  for (;;) {\n    if (!(k2>>=1)) {  //look at next bit of y\n      k1--;\n      if (k1<0) {\n        mont_(x,one,n,np);\n        return;\n      }\n      k2=1<<(bpe-1);\n    }    \n    mont_(x,x,n,np);\n\n    if (k2 & y[k1]) //if next bit is a 1\n      mont_(x,s3,n,np);\n  }\n}\n\n\n//do x=x*y*Ri mod n for bigInts x,y,n, \n//  where Ri = 2**(-kn*bpe) mod n, and kn is the \n//  number of elements in the n array, not \n//  counting leading zeros.  \n//x array must have at least as many elemnts as the n array\n//It's OK if x and y are the same variable.\n//must have:\n//  x,y < n\n//  n is odd\n//  np = -(n^(-1)) mod radix\nfunction mont_(x,y,n,np) {\n  var i,j,c,ui,t,ks;\n  var kn=n.length;\n  var ky=y.length;\n\n  if (sa.length!=kn)\n    sa=new Array(kn);\n    \n  copyInt_(sa,0);\n\n  for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n\n  for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y\n  ks=sa.length-1; //sa will never have more than this many nonzero elements.  \n\n  //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n  for (i=0; i<kn; i++) {\n    t=sa[0]+x[i]*y[0];\n    ui=((t & mask) * np) & mask;  //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n    c=(t+ui*n[0]) >> bpe;\n    t=x[i];\n    \n    //do sa=(sa+x[i]*y+ui*n)/b   where b=2**bpe.  Loop is unrolled 5-fold for speed\n    j=1;\n    for (;j<ky-4;) { c+=sa[j]+ui*n[j]+t*y[j];   sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j]+t*y[j];   sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j]+t*y[j];   sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j]+t*y[j];   sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j]+t*y[j];   sa[j-1]=c & mask;   c>>=bpe;   j++; }    \n    for (;j<ky;)   { c+=sa[j]+ui*n[j]+t*y[j];   sa[j-1]=c & mask;   c>>=bpe;   j++; }\n    for (;j<kn-4;) { c+=sa[j]+ui*n[j];          sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j];          sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j];          sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j];          sa[j-1]=c & mask;   c>>=bpe;   j++;\n                     c+=sa[j]+ui*n[j];          sa[j-1]=c & mask;   c>>=bpe;   j++; }  \n    for (;j<kn;)   { c+=sa[j]+ui*n[j];          sa[j-1]=c & mask;   c>>=bpe;   j++; }   \n    for (;j<ks;)   { c+=sa[j];                  sa[j-1]=c & mask;   c>>=bpe;   j++; }  \n    sa[j-1]=c & mask;\n  }\n\n  if (!greater(n,sa))\n    sub_(sa,n);\n  copy_(x,sa);\n}\n\n"
  },
  {
    "path": "app/vendor/libwebpjs/libwebp-0.1.13.js",
    "content": "var WebPZlib = (function WebPZlib() {\n    var dd = (function() {\n        var o = 32768;\n        var r = 0;\n        var s = 1;\n        var t = 2;\n        var u = 6;\n        var x = true;\n        var y = 32768;\n        var z = 64;\n        var A = 1024 * 8;\n        var B = 2 * o;\n        var C = 3;\n        var D = 258;\n        var E = 16;\n        var F = 0x2000;\n        var G = 13;\n        if (F > y) alert(\"error: zip_INBUFSIZ is too small\");\n        if ((o << 1) > (1 << E)) alert(\"error: zip_WSIZE is too large\");\n        if (G > E - 1) alert(\"error: zip_HASH_BITS is too large\");\n        if (G < 8 || D != 258) alert(\"error: Code too clever\");\n        var H = F;\n        var I = 1 << G;\n        var J = I - 1;\n        var K = o - 1;\n        var L = 0;\n        var M = 4096;\n        var N = D + C + 1;\n        var O = o - N;\n        var P = 1;\n        var Q = 15;\n        var R = 7;\n        var S = 29;\n        var T = 256;\n        var U = 256;\n        var V = T + 1 + S;\n        var W = 30;\n        var X = 19;\n        var Y = 16;\n        var Z = 17;\n        var de = 18;\n        var df = 2 * V + 1;\n        var dg = parseInt((G + C - 1) / C, 10);\n        var dh;\n        var di, zip_qtail;\n        var dj;\n        var dk = null;\n        var dl, zip_outoff;\n        var dm;\n        var dn;\n        var dp;\n        var dq;\n        var dr;\n        var ds;\n        var dt;\n        var du;\n        var dv;\n        var dw;\n        var dx;\n        var dy;\n        var dz;\n        var dA;\n        var dB;\n        var dC;\n        var dD;\n        var dE;\n        var dF;\n        var dG;\n        var dH;\n        var dI;\n        var dJ;\n        var dK;\n        var dL;\n        var dM;\n        var dN;\n        var dO;\n        var dP;\n        var dQ;\n        var dR;\n        var dS;\n        var dT;\n        var dU;\n        var dV;\n        var dW;\n        var dX;\n        var dY;\n        var dZ;\n        var ea;\n        var eb;\n        var ec;\n        var ed;\n        var ee;\n        var ef;\n        var eg;\n        var eh;\n        var ei;\n        var ej;\n        var ek;\n        var el = function() {\n            this.fc = 0;\n            this.dl = 0\n        };\n        var em = function() {\n            this.dyn_tree = null;\n            this.static_tree = null;\n            this.extra_bits = null;\n            this.extra_base = 0;\n            this.elems = 0;\n            this.max_length = 0;\n            this.max_code = 0\n        };\n        var en = function(a, b, c, d) {\n            this.good_length = a;\n            this.max_lazy = b;\n            this.nice_length = c;\n            this.max_chain = d\n        };\n        var eo = function() {\n            this.next = null;\n            this.len = 0;\n            this.ptr = new Array(A);\n            this.off = 0\n        };\n        var ep = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];\n        var eq = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];\n        var er = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7];\n        var es = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n        var et = [new en(0, 0, 0, 0), new en(4, 4, 8, 4), new en(4, 5, 16, 8), new en(4, 6, 32, 32), new en(4, 4, 16, 16), new en(8, 16, 32, 32), new en(8, 16, 128, 128), new en(8, 32, 128, 256), new en(32, 128, 258, 1024), new en(32, 258, 258, 4096)];\n        var eu = function(a) {\n            var i;\n            if (!a) a = u;\n            else if (a < 1) a = 1;\n            else if (a > 9) a = 9;\n            dH = a;\n            dj = false;\n            dD = false;\n            if (dk != null) return;\n            dh = di = zip_qtail = null;\n            dk = new Array(A);\n            dn = new Array(B);\n            dp = new Array(H);\n            dq = new Array(y + z);\n            dr = new Array(1 << E);\n            dK = new Array(df);\n            for (i = 0; i < df; i++) dK[i] = new el();\n            dL = new Array(2 * W + 1);\n            for (i = 0; i < 2 * W + 1; i++) dL[i] = new el();\n            dM = new Array(V + 2);\n            for (i = 0; i < V + 2; i++) dM[i] = new el();\n            dN = new Array(W);\n            for (i = 0; i < W; i++) dN[i] = new el();\n            dO = new Array(2 * X + 1);\n            for (i = 0; i < 2 * X + 1; i++) dO[i] = new el();\n            dP = new em();\n            dQ = new em();\n            dR = new em();\n            dS = new Array(Q + 1);\n            dT = new Array(2 * V + 1);\n            dW = new Array(2 * V + 1);\n            dX = new Array(D - C + 1);\n            dY = new Array(512);\n            dZ = new Array(S);\n            ea = new Array(W);\n            eb = new Array(parseInt(F / 8, 10))\n        };\n        var ev = function() {\n            dh = di = zip_qtail = null;\n            dk = null;\n            dn = null;\n            dp = null;\n            dq = null;\n            dr = null;\n            dK = null;\n            dL = null;\n            dM = null;\n            dN = null;\n            dO = null;\n            dP = null;\n            dQ = null;\n            dR = null;\n            dS = null;\n            dT = null;\n            dW = null;\n            dX = null;\n            dY = null;\n            dZ = null;\n            ea = null;\n            eb = null\n        };\n        var ew = function(p) {\n            p.next = dh;\n            dh = p\n        };\n        var ex = function() {\n            var p;\n            if (dh != null) {\n                p = dh;\n                dh = dh.next\n            } else p = new eo();\n            p.next = null;\n            p.len = p.off = 0;\n            return p\n        };\n        var ey = function(i) {\n            return dr[o + i]\n        };\n        var ez = function(i, a) {\n            return dr[o + i] = a\n        };\n        var eA = function(c) {\n            dk[zip_outoff + dl++] = c;\n            if (zip_outoff + dl == A) fg()\n        };\n        var eB = function(w) {\n            w &= 0xffff;\n            if (zip_outoff + dl < A - 2) {\n                dk[zip_outoff + dl++] = (w & 0xff);\n                dk[zip_outoff + dl++] = (w >>> 8)\n            } else {\n                eA(w & 0xff);\n                eA(w >>> 8)\n            }\n        };\n        var eC = function() {\n            dv = ((dv << dg) ^ (dn[dB + C - 1] & 0xff)) & J;\n            dw = ey(dv);\n            dr[dB & K] = dw;\n            ez(dv, dB)\n        };\n        var eD = function(c, a) {\n            fd(a[c].fc, a[c].dl)\n        };\n        var eE = function(a) {\n            return (a < 256 ? dY[a] : dY[256 + (a >> 7)]) & 0xff\n        };\n        var eF = function(a, n, m) {\n            return a[n].fc < a[m].fc || (a[n].fc == a[m].fc && dW[n] <= dW[m])\n        };\n        var eG = function(a, b, n) {\n            var i;\n            var l = ej.length;\n            for (i = 0; i < n && ek < l; i += 1) {\n                a[b + i] = ej[ek++]\n            }\n            return i\n        };\n        var eH = function() {\n            var j;\n            for (j = 0; j < I; j++) dr[o + j] = 0;\n            dG = et[dH].max_lazy;\n            dI = et[dH].good_length;\n            if (!x) dJ = et[dH].nice_length;\n            dF = et[dH].max_chain;\n            dB = 0;\n            du = 0;\n            dE = eG(dn, 0, 2 * o);\n            if (dE <= 0) {\n                dD = true;\n                dE = 0;\n                return\n            }\n            dD = false;\n            while (dE < N && !dD) eJ();\n            dv = 0;\n            for (j = 0; j < C - 1; j++) {\n                dv = ((dv << dg) ^ (dn[j] & 0xff)) & J\n            }\n        };\n        var eI = function(a) {\n            var b = dF;\n            var c = dB;\n            var d;\n            var e;\n            var f = dA;\n            var g = (dB > O ? dB - O : L);\n            var h = dB + D;\n            var i = dn[c + f - 1];\n            var j = dn[c + f];\n            if (dA >= dI) b >>= 2;\n            do {\n                d = a;\n                if (dn[d + f] != j || dn[d + f - 1] != i || dn[d] != dn[c] || dn[++d] != dn[c + 1]) {\n                    continue\n                }\n                c += 2;\n                d++;\n                do {} while (dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && c < h);\n                e = D - (h - c);\n                c = h - D;\n                if (e > f) {\n                    dC = a;\n                    f = e;\n                    if (x) {\n                        if (e >= D) break\n                    } else {\n                        if (e >= dJ) break\n                    }\n                    i = dn[c + f - 1];\n                    j = dn[c + f]\n                }\n            } while ((a = dr[a & K]) > g && --b != 0);\n            return f\n        };\n        var eJ = function() {\n            var n, m;\n            var a = B - dE - dB;\n            if (a == -1) {\n                a--\n            } else if (dB >= o + O) {\n                for (n = 0; n < o; n++) dn[n] = dn[n + o];\n                dC -= o;\n                dB -= o;\n                du -= o;\n                for (n = 0; n < I; n++) {\n                    m = ey(n);\n                    ez(n, m >= o ? m - o : L)\n                }\n                for (n = 0; n < o; n++) {\n                    m = dr[n];\n                    dr[n] = (m >= o ? m - o : L)\n                }\n                a += o\n            }\n            if (!dD) {\n                n = eG(dn, dB + dE, a);\n                if (n <= 0) dD = true;\n                else dE += n\n            }\n        };\n        var eK = function() {\n            while (dE != 0 && di == null) {\n                var a;\n                eC();\n                if (dw != L && dB - dw <= O) {\n                    dz = eI(dw);\n                    if (dz > dE) dz = dE\n                }\n                if (dz >= C) {\n                    a = fa(dB - dC, dz - C);\n                    dE -= dz;\n                    if (dz <= dG) {\n                        dz--;\n                        do {\n                            dB++;\n                            eC()\n                        } while (--dz != 0);\n                        dB++\n                    } else {\n                        dB += dz;\n                        dz = 0;\n                        dv = dn[dB] & 0xff;\n                        dv = ((dv << dg) ^ (dn[dB + 1] & 0xff)) & J\n                    }\n                } else {\n                    a = fa(0, dn[dB] & 0xff);\n                    dE--;\n                    dB++\n                }\n                if (a) {\n                    eZ(0);\n                    du = dB\n                }\n                while (dE < N && !dD) eJ()\n            }\n        };\n        var eL = function() {\n            while (dE != 0 && di == null) {\n                eC();\n                dA = dz;\n                dx = dC;\n                dz = C - 1;\n                if (dw != L && dA < dG && dB - dw <= O) {\n                    dz = eI(dw);\n                    if (dz > dE) dz = dE;\n                    if (dz == C && dB - dC > M) {\n                        dz--\n                    }\n                }\n                if (dA >= C && dz <= dA) {\n                    var a;\n                    a = fa(dB - 1 - dx, dA - C);\n                    dE -= dA - 1;\n                    dA -= 2;\n                    do {\n                        dB++;\n                        eC()\n                    } while (--dA != 0);\n                    dy = 0;\n                    dz = C - 1;\n                    dB++;\n                    if (a) {\n                        eZ(0);\n                        du = dB\n                    }\n                } else if (dy != 0) {\n                    if (fa(0, dn[dB - 1] & 0xff)) {\n                        eZ(0);\n                        du = dB\n                    }\n                    dB++;\n                    dE--\n                } else {\n                    dy = 1;\n                    dB++;\n                    dE--\n                }\n                while (dE < N && !dD) eJ()\n            }\n        };\n        var eM = function() {\n            if (dD) return;\n            ds = 0;\n            dt = 0;\n            eP();\n            eH();\n            di = null;\n            dl = 0;\n            zip_outoff = 0;\n            if (dH <= 3) {\n                dA = C - 1;\n                dz = 0\n            } else {\n                dz = C - 1;\n                dy = 0\n            }\n            dm = false\n        };\n        var eN = function(a, b, c) {\n            var n;\n            if (!dj) {\n                eM();\n                dj = true;\n                if (dE == 0) {\n                    dm = true;\n                    return 0\n                }\n            }\n            if ((n = eO(a, b, c)) == c) return c;\n            if (dm) return n;\n            if (dH <= 3) eK();\n            else eL();\n            if (dE == 0) {\n                if (dy != 0) {\n                    fa(0, dn[dB - 1] & 0xff)\n                }\n                eZ(1);\n                dm = true\n            }\n            return n + eO(a, n + b, c - n)\n        };\n        var eO = function(a, b, c) {\n            var n, i, j;\n            n = 0;\n            while (di != null && n < c) {\n                i = c - n;\n                if (i > di.len) i = di.len;\n                for (j = 0; j < i; j++) {\n                    a[b + n + j] = di.ptr[di.off + j]\n                }\n                di.off += i;\n                di.len -= i;\n                n += i;\n                if (di.len == 0) {\n                    var p;\n                    p = di;\n                    di = di.next;\n                    ew(p)\n                }\n            }\n            if (n == c) {\n                return n\n            }\n            if (zip_outoff < dl) {\n                i = c - n;\n                if (i > dl - zip_outoff) {\n                    i = dl - zip_outoff\n                }\n                for (j = 0; j < i; j++) {\n                    a[b + n + j] = dk[zip_outoff + j]\n                }\n                zip_outoff += i;\n                n += i;\n                if (dl == zip_outoff) {\n                    dl = zip_outoff = 0\n                }\n            }\n            return n\n        };\n        var eP = function() {\n            var n;\n            var a;\n            var b;\n            var c;\n            var d;\n            if (dN[0].dl != 0) return;\n            dP.dyn_tree = dK;\n            dP.static_tree = dM;\n            dP.extra_bits = ep;\n            dP.extra_base = T + 1;\n            dP.elems = V;\n            dP.max_length = Q;\n            dP.max_code = 0;\n            dQ.dyn_tree = dL;\n            dQ.static_tree = dN;\n            dQ.extra_bits = eq;\n            dQ.extra_base = 0;\n            dQ.elems = W;\n            dQ.max_length = Q;\n            dQ.max_code = 0;\n            dR.dyn_tree = dO;\n            dR.static_tree = null;\n            dR.extra_bits = er;\n            dR.extra_base = 0;\n            dR.elems = X;\n            dR.max_length = R;\n            dR.max_code = 0;\n            b = 0;\n            for (c = 0; c < S - 1; c++) {\n                dZ[c] = b;\n                for (n = 0; n < (1 << ep[c]); n++) dX[b++] = c\n            }\n            dX[b - 1] = c;\n            d = 0;\n            for (c = 0; c < 16; c++) {\n                ea[c] = d;\n                for (n = 0; n < (1 << eq[c]); n++) {\n                    dY[d++] = c\n                }\n            }\n            d >>= 7;\n            for (; c < W; c++) {\n                ea[c] = d << 7;\n                for (n = 0; n < (1 << (eq[c] - 7)); n++) dY[256 + d++] = c\n            }\n            for (a = 0; a <= Q; a++) dS[a] = 0;\n            n = 0;\n            while (n <= 143) {\n                dM[n++].dl = 8;\n                dS[8]++\n            }\n            while (n <= 255) {\n                dM[n++].dl = 9;\n                dS[9]++\n            }\n            while (n <= 279) {\n                dM[n++].dl = 7;\n                dS[7]++\n            }\n            while (n <= 287) {\n                dM[n++].dl = 8;\n                dS[8]++\n            }\n            eT(dM, V + 1);\n            for (n = 0; n < W; n++) {\n                dN[n].dl = 5;\n                dN[n].fc = fe(n, 5)\n            }\n            eQ()\n        };\n        var eQ = function() {\n            var n;\n            for (n = 0; n < V; n++) dK[n].fc = 0;\n            for (n = 0; n < W; n++) dL[n].fc = 0;\n            for (n = 0; n < X; n++) dO[n].fc = 0;\n            dK[U].fc = 1;\n            eh = ei = 0;\n            ec = ed = ee = 0;\n            ef = 0;\n            eg = 1\n        };\n        var eR = function(a, k) {\n            var v = dT[k];\n            var j = k << 1;\n            while (j <= dU) {\n                if (j < dU && eF(a, dT[j + 1], dT[j])) j++;\n                if (eF(a, v, dT[j])) break;\n                dT[k] = dT[j];\n                k = j;\n                j <<= 1\n            }\n            dT[k] = v\n        };\n        var eS = function(a) {\n            var b = a.dyn_tree;\n            var c = a.extra_bits;\n            var d = a.extra_base;\n            var e = a.max_code;\n            var g = a.max_length;\n            var i = a.static_tree;\n            var h;\n            var n, m;\n            var j;\n            var k;\n            var f;\n            var l = 0;\n            for (j = 0; j <= Q; j++) dS[j] = 0;\n            b[dT[dV]].dl = 0;\n            for (h = dV + 1; h < df; h++) {\n                n = dT[h];\n                j = b[b[n].dl].dl + 1;\n                if (j > g) {\n                    j = g;\n                    l++\n                }\n                b[n].dl = j;\n                if (n > e) continue;\n                dS[j]++;\n                k = 0;\n                if (n >= d) k = c[n - d];\n                f = b[n].fc;\n                eh += f * (j + k);\n                if (i != null) ei += f * (i[n].dl + k)\n            }\n            if (l == 0) return;\n            do {\n                j = g - 1;\n                while (dS[j] == 0) j--;\n                dS[j]--;\n                dS[j + 1] += 2;\n                dS[g]--;\n                l -= 2\n            } while (l > 0);\n            for (j = g; j != 0; j--) {\n                n = dS[j];\n                while (n != 0) {\n                    m = dT[--h];\n                    if (m > e) continue;\n                    if (b[m].dl != j) {\n                        eh += (j - b[m].dl) * b[m].fc;\n                        b[m].fc = j\n                    }\n                    n--\n                }\n            }\n        };\n        var eT = function(a, b) {\n            var c = new Array(Q + 1);\n            var d = 0;\n            var e;\n            var n;\n            for (e = 1; e <= Q; e++) {\n                d = ((d + dS[e - 1]) << 1);\n                c[e] = d\n            }\n            for (n = 0; n <= b; n++) {\n                var f = a[n].dl;\n                if (f == 0) continue;\n                a[n].fc = fe(c[f]++, f)\n            }\n        };\n        var eU = function(a) {\n            var b = a.dyn_tree;\n            var c = a.static_tree;\n            var d = a.elems;\n            var n, m;\n            var e = -1;\n            var f = d;\n            dU = 0;\n            dV = df;\n            for (n = 0; n < d; n++) {\n                if (b[n].fc != 0) {\n                    dT[++dU] = e = n;\n                    dW[n] = 0\n                } else b[n].dl = 0\n            }\n            while (dU < 2) {\n                var g = dT[++dU] = (e < 2 ? ++e : 0);\n                b[g].fc = 1;\n                dW[g] = 0;\n                eh--;\n                if (c != null) ei -= c[g].dl\n            }\n            a.max_code = e;\n            for (n = dU >> 1; n >= 1; n--) eR(b, n);\n            do {\n                n = dT[P];\n                dT[P] = dT[dU--];\n                eR(b, P);\n                m = dT[P];\n                dT[--dV] = n;\n                dT[--dV] = m;\n                b[f].fc = b[n].fc + b[m].fc;\n                if (dW[n] > dW[m] + 1) dW[f] = dW[n];\n                else dW[f] = dW[m] + 1;\n                b[n].dl = b[m].dl = f;\n                dT[P] = f++;\n                eR(b, P)\n            } while (dU >= 2);\n            dT[--dV] = dT[P];\n            eS(a);\n            eT(b, e)\n        };\n        var eV = function(a, b) {\n            var n;\n            var c = -1;\n            var d;\n            var e = a[0].dl;\n            var f = 0;\n            var g = 7;\n            var h = 4;\n            if (e == 0) {\n                g = 138;\n                h = 3\n            }\n            a[b + 1].dl = 0xffff;\n            for (n = 0; n <= b; n++) {\n                d = e;\n                e = a[n + 1].dl;\n                if (++f < g && d == e) continue;\n                else if (f < h) dO[d].fc += f;\n                else if (d != 0) {\n                    if (d != c) dO[d].fc++;\n                    dO[Y].fc++\n                } else if (f <= 10) dO[Z].fc++;\n                else dO[de].fc++;\n                f = 0;\n                c = d;\n                if (e == 0) {\n                    g = 138;\n                    h = 3\n                } else if (d == e) {\n                    g = 6;\n                    h = 3\n                } else {\n                    g = 7;\n                    h = 4\n                }\n            }\n        };\n        var eW = function(a, b) {\n            var n;\n            var c = -1;\n            var d;\n            var e = a[0].dl;\n            var f = 0;\n            var g = 7;\n            var h = 4;\n            if (e == 0) {\n                g = 138;\n                h = 3\n            }\n            for (n = 0; n <= b; n++) {\n                d = e;\n                e = a[n + 1].dl;\n                if (++f < g && d == e) {\n                    continue\n                } else if (f < h) {\n                    do {\n                        eD(d, dO)\n                    } while (--f != 0)\n                } else if (d != 0) {\n                    if (d != c) {\n                        eD(d, dO);\n                        f--\n                    }\n                    eD(Y, dO);\n                    fd(f - 3, 2)\n                } else if (f <= 10) {\n                    eD(Z, dO);\n                    fd(f - 3, 3)\n                } else {\n                    eD(de, dO);\n                    fd(f - 11, 7)\n                }\n                f = 0;\n                c = d;\n                if (e == 0) {\n                    g = 138;\n                    h = 3\n                } else if (d == e) {\n                    g = 6;\n                    h = 3\n                } else {\n                    g = 7;\n                    h = 4\n                }\n            }\n        };\n        var eX = function() {\n            var a;\n            eV(dK, dP.max_code);\n            eV(dL, dQ.max_code);\n            eU(dR);\n            for (a = X - 1; a >= 3; a--) {\n                if (dO[es[a]].dl != 0) break\n            }\n            eh += 3 * (a + 1) + 5 + 5 + 4;\n            return a\n        };\n        var eY = function(a, b, c) {\n            var d;\n            fd(a - 257, 5);\n            fd(b - 1, 5);\n            fd(c - 4, 4);\n            for (d = 0; d < c; d++) {\n                fd(dO[es[d]].dl, 3)\n            }\n            eW(dK, a - 1);\n            eW(dL, b - 1)\n        };\n        var eZ = function(a) {\n            var b, static_lenb;\n            var c;\n            var d;\n            d = dB - du;\n            eb[ee] = ef;\n            eU(dP);\n            eU(dQ);\n            c = eX();\n            b = (eh + 3 + 7) >> 3;\n            static_lenb = (ei + 3 + 7) >> 3;\n            if (static_lenb <= b) b = static_lenb;\n            if (d + 4 <= b && du >= 0) {\n                var i;\n                fd((r << 1) + a, 3);\n                ff();\n                eB(d);\n                eB(~d);\n                for (i = 0; i < d; i++) eA(dn[du + i])\n            } else if (static_lenb == b) {\n                fd((s << 1) + a, 3);\n                fb(dM, dN)\n            } else {\n                fd((t << 1) + a, 3);\n                eY(dP.max_code + 1, dQ.max_code + 1, c + 1);\n                fb(dK, dL)\n            }\n            eQ();\n            if (a != 0) ff()\n        };\n        var fa = function(a, b) {\n            dq[ec++] = b;\n            if (a == 0) {\n                dK[b].fc++\n            } else {\n                a--;\n                dK[dX[b] + T + 1].fc++;\n                dL[eE(a)].fc++;\n                dp[ed++] = a;\n                ef |= eg\n            }\n            eg <<= 1;\n            if ((ec & 7) == 0) {\n                eb[ee++] = ef;\n                ef = 0;\n                eg = 1\n            }\n            if (dH > 2 && (ec & 0xfff) == 0) {\n                var c = ec * 8;\n                var d = dB - du;\n                var e;\n                for (e = 0; e < W; e++) {\n                    c += dL[e].fc * (5 + eq[e])\n                }\n                c >>= 3;\n                if (ed < parseInt(ec / 2, 10) && c < parseInt(d / 2, 10)) return true\n            }\n            return (ec == F - 1 || ed == H)\n        };\n        var fb = function(a, b) {\n            var c;\n            var d;\n            var e = 0;\n            var f = 0;\n            var g = 0;\n            var h = 0;\n            var i;\n            var j;\n            if (ec != 0)\n                do {\n                    if ((e & 7) == 0) h = eb[g++];\n                    d = dq[e++] & 0xff;\n                    if ((h & 1) == 0) {\n                        eD(d, a)\n                    } else {\n                        i = dX[d];\n                        eD(i + T + 1, a);\n                        j = ep[i];\n                        if (j != 0) {\n                            d -= dZ[i];\n                            fd(d, j)\n                        }\n                        c = dp[f++];\n                        i = eE(c);\n                        eD(i, b);\n                        j = eq[i];\n                        if (j != 0) {\n                            c -= ea[i];\n                            fd(c, j)\n                        }\n                    }\n                    h >>= 1\n                } while (e < ec);\n            eD(U, a)\n        };\n        var fc = 16;\n        var fd = function(a, b) {\n            if (dt > fc - b) {\n                ds |= (a << dt);\n                eB(ds);\n                ds = (a >> (fc - dt));\n                dt += b - fc\n            } else {\n                ds |= a << dt;\n                dt += b\n            }\n        };\n        var fe = function(a, b) {\n            var c = 0;\n            do {\n                c |= a & 1;\n                a >>= 1;\n                c <<= 1\n            } while (--b > 0);\n            return c >> 1\n        };\n        var ff = function() {\n            if (dt > 8) {\n                eB(ds)\n            } else if (dt > 0) {\n                eA(ds)\n            }\n            ds = 0;\n            dt = 0\n        };\n        var fg = function() {\n            if (dl != 0) {\n                var q, i;\n                q = ex();\n                if (di == null) di = zip_qtail = q;\n                else zip_qtail = zip_qtail.next = q;\n                q.len = dl - zip_outoff;\n                for (i = 0; i < q.len; i++) q.ptr[i] = dk[zip_outoff + i];\n                dl = zip_outoff = 0\n            }\n        };\n        var fh = function(a, b) {\n            var i, j;\n            ej = a;\n            ek = 0;\n            if (typeof b == \"undefined\") {\n                b = u\n            }\n            eu(b);\n            var c = [0];\n            var d = [];\n            while ((i = eN(c, 0, c.length)) > 0) {\n                d.push(c[0])\n            }\n            ej = null;\n            return d\n        };\n        return fh\n    })();\n    var fi = (function() {\n        var D = 32768;\n        var E = 0;\n        var F = 1;\n        var G = 2;\n        var H = 9;\n        var I = 6;\n        var J = 32768;\n        var K = 64;\n        var L;\n        var M;\n        var N = null;\n        var O;\n        var P, fixed_bd;\n        var Q;\n        var R;\n        var S;\n        var T;\n        var U;\n        var V;\n        var W, zip_td;\n        var X, zip_bd;\n        var Y;\n        var Z;\n        var de = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff);\n        var df = new Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0);\n        var dg = new Array(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99);\n        var dh = new Array(1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577);\n        var di = new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13);\n        var dj = new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15);\n        var dk = function() {\n            this.next = null;\n            this.list = null\n        };\n        var dl = function() {\n            this.e = 0;\n            this.b = 0;\n            this.n = 0;\n            this.t = null\n        };\n        var dm = function(b, n, s, d, e, l) {\n            this.BMAX = 16;\n            this.N_MAX = 288;\n            this.status = 0;\n            this.root = null;\n            this.m = 0; {\n                var a;\n                var c = new Array(this.BMAX + 1);\n                var m;\n                var f;\n                var g;\n                var h;\n                var i;\n                var j;\n                var k;\n                var t = new Array(this.BMAX + 1);\n                var p;\n                var A;\n                var q;\n                var r = new dl();\n                var u = new Array(this.BMAX);\n                var v = new Array(this.N_MAX);\n                var w;\n                var x = new Array(this.BMAX + 1);\n                var B;\n                var y;\n                var z;\n                var o;\n                var C;\n                C = this.root = null;\n                for (i = 0; i < c.length; i++) c[i] = 0;\n                for (i = 0; i < t.length; i++) t[i] = 0;\n                for (i = 0; i < u.length; i++) u[i] = null;\n                for (i = 0; i < v.length; i++) v[i] = 0;\n                for (i = 0; i < x.length; i++) x[i] = 0;\n                m = n > 256 ? b[256] : this.BMAX;\n                p = b;\n                A = 0;\n                i = n;\n                do {\n                    c[p[A]]++;\n                    A++\n                } while (--i > 0);\n                if (c[0] == n) {\n                    this.root = null;\n                    this.m = 0;\n                    this.status = 0;\n                    return\n                }\n                for (j = 1; j <= this.BMAX; j++)\n                    if (c[j] != 0) break;\n                k = j;\n                if (l < j) l = j;\n                for (i = this.BMAX; i != 0; i--)\n                    if (c[i] != 0) break;\n                g = i;\n                if (l > i) l = i;\n                for (y = 1 << j; j < i; j++, y <<= 1)\n                    if ((y -= c[j]) < 0) {\n                        this.status = 2;\n                        this.m = l;\n                        return\n                    }\n                if ((y -= c[i]) < 0) {\n                    this.status = 2;\n                    this.m = l;\n                    return\n                }\n                c[i] += y;\n                x[1] = j = 0;\n                p = c;\n                A = 1;\n                B = 2;\n                while (--i > 0) x[B++] = (j += p[A++]);\n                p = b;\n                A = 0;\n                i = 0;\n                do {\n                    if ((j = p[A++]) != 0) v[x[j]++] = i\n                } while (++i < n);\n                n = x[g];\n                x[0] = i = 0;\n                p = v;\n                A = 0;\n                h = -1;\n                w = t[0] = 0;\n                q = null;\n                z = 0;\n                for (; k <= g; k++) {\n                    a = c[k];\n                    while (a-- > 0) {\n                        while (k > w + t[1 + h]) {\n                            w += t[1 + h];\n                            h++;\n                            z = (z = g - w) > l ? l : z;\n                            if ((f = 1 << (j = k - w)) > a + 1) {\n                                f -= a + 1;\n                                B = k;\n                                while (++j < z) {\n                                    if ((f <<= 1) <= c[++B]) break;\n                                    f -= c[B]\n                                }\n                            }\n                            if (w + j > m && w < m) j = m - w;\n                            z = 1 << j;\n                            t[1 + h] = j;\n                            q = new Array(z);\n                            for (o = 0; o < z; o++) {\n                                q[o] = new dl()\n                            }\n                            if (C == null) C = this.root = new dk();\n                            else C = C.next = new dk();\n                            C.next = null;\n                            C.list = q;\n                            u[h] = q;\n                            if (h > 0) {\n                                x[h] = i;\n                                r.b = t[h];\n                                r.e = 16 + j;\n                                r.t = q;\n                                j = (i & ((1 << w) - 1)) >> (w - t[h]);\n                                u[h - 1][j].e = r.e;\n                                u[h - 1][j].b = r.b;\n                                u[h - 1][j].n = r.n;\n                                u[h - 1][j].t = r.t\n                            }\n                        }\n                        r.b = k - w;\n                        if (A >= n) r.e = 99;\n                        else if (p[A] < s) {\n                            r.e = (p[A] < 256 ? 16 : 15);\n                            r.n = p[A++]\n                        } else {\n                            r.e = e[p[A] - s];\n                            r.n = d[p[A++] - s]\n                        }\n                        f = 1 << (k - w);\n                        for (j = i >> w; j < z; j += f) {\n                            q[j].e = r.e;\n                            q[j].b = r.b;\n                            q[j].n = r.n;\n                            q[j].t = r.t\n                        }\n                        for (j = 1 << (k - 1);\n                            (i & j) != 0; j >>= 1) i ^= j;\n                        i ^= j;\n                        while ((i & ((1 << w) - 1)) != x[h]) {\n                            w -= t[h];\n                            h--\n                        }\n                    }\n                }\n                this.m = t[1];\n                this.status = ((y != 0 && g != 1) ? 1 : 0)\n            }\n        };\n        var dn = function() {\n            if (Y.length == Z) return -1;\n            return Y[Z++]\n        };\n        var dp = function(n) {\n            while (R < n) {\n                Q |= dn() << R;\n                R += 8\n            }\n        };\n        var dq = function(n) {\n            return Q & de[n]\n        };\n        var dr = function(n) {\n            Q >>= n;\n            R -= n\n        };\n        var ds = function(a, b, c) {\n            var e;\n            var t;\n            var n;\n            if (c == 0) return 0;\n            n = 0;\n            for (;;) {\n                dp(X);\n                t = W.list[dq(X)];\n                e = t.e;\n                while (e > 16) {\n                    if (e == 99) return -1;\n                    dr(t.b);\n                    e -= 16;\n                    dp(e);\n                    t = t.t[dq(e)];\n                    e = t.e\n                }\n                dr(t.b);\n                if (e == 16) {\n                    M &= D - 1;\n                    a[b + n++] = L[M++] = t.n;\n                    if (n == c) return c;\n                    continue\n                }\n                if (e == 15) break;\n                dp(e);\n                U = t.n + dq(e);\n                dr(e);\n                dp(zip_bd);\n                t = zip_td.list[dq(zip_bd)];\n                e = t.e;\n                while (e > 16) {\n                    if (e == 99) return -1;\n                    dr(t.b);\n                    e -= 16;\n                    dp(e);\n                    t = t.t[dq(e)];\n                    e = t.e\n                }\n                dr(t.b);\n                dp(e);\n                V = M - t.n - dq(e);\n                dr(e);\n                while (U > 0 && n < c) {\n                    U--;\n                    V &= D - 1;\n                    M &= D - 1;\n                    a[b + n++] = L[M++] = L[V++]\n                }\n                if (n == c) return c\n            }\n            S = -1;\n            return n\n        };\n        var dt = function(a, b, c) {\n            var n;\n            n = R & 7;\n            dr(n);\n            dp(16);\n            n = dq(16);\n            dr(16);\n            dp(16);\n            if (n != ((~Q) & 0xffff)) return -1;\n            dr(16);\n            U = n;\n            n = 0;\n            while (U > 0 && n < c) {\n                U--;\n                M &= D - 1;\n                dp(8);\n                a[b + n++] = L[M++] = dq(8);\n                dr(8)\n            }\n            if (U == 0) S = -1;\n            return n\n        };\n        var du = function(a, b, c) {\n            if (N == null) {\n                var i;\n                var l = new Array(288);\n                var h;\n                for (i = 0; i < 144; i++) l[i] = 8;\n                for (; i < 256; i++) l[i] = 9;\n                for (; i < 280; i++) l[i] = 7;\n                for (; i < 288; i++) l[i] = 8;\n                P = 7;\n                h = new dm(l, 288, 257, df, dg, P);\n                if (h.status != 0) {\n                    alert(\"HufBuild error: \" + h.status);\n                    return -1\n                }\n                N = h.root;\n                P = h.m;\n                for (i = 0; i < 30; i++) l[i] = 5;\n                var d = 5;\n                h = new dm(l, 30, 0, dh, di, d);\n                if (h.status > 1) {\n                    N = null;\n                    alert(\"HufBuild error: \" + h.status);\n                    return -1\n                }\n                O = h.root;\n                d = h.m\n            }\n            W = N;\n            zip_td = O;\n            X = P;\n            zip_bd = d;\n            return ds(a, b, c)\n        };\n        var dv = function(a, b, c) {\n            var i;\n            var j;\n            var l;\n            var n;\n            var t;\n            var d;\n            var e;\n            var f;\n            var g = new Array(286 + 30);\n            var h;\n            for (i = 0; i < g.length; i++) g[i] = 0;\n            dp(5);\n            e = 257 + dq(5);\n            dr(5);\n            dp(5);\n            f = 1 + dq(5);\n            dr(5);\n            dp(4);\n            d = 4 + dq(4);\n            dr(4);\n            if (e > 286 || f > 30) return -1;\n            for (j = 0; j < d; j++) {\n                dp(3);\n                g[dj[j]] = dq(3);\n                dr(3)\n            }\n            for (; j < 19; j++) g[dj[j]] = 0;\n            X = 7;\n            h = new dm(g, 19, 19, null, null, X);\n            if (h.status != 0) return -1;\n            W = h.root;\n            X = h.m;\n            n = e + f;\n            i = l = 0;\n            while (i < n) {\n                dp(X);\n                t = W.list[dq(X)];\n                j = t.b;\n                dr(j);\n                j = t.n;\n                if (j < 16) g[i++] = l = j;\n                else if (j == 16) {\n                    dp(2);\n                    j = 3 + dq(2);\n                    dr(2);\n                    if (i + j > n) return -1;\n                    while (j-- > 0) g[i++] = l\n                } else if (j == 17) {\n                    dp(3);\n                    j = 3 + dq(3);\n                    dr(3);\n                    if (i + j > n) return -1;\n                    while (j-- > 0) g[i++] = 0;\n                    l = 0\n                } else {\n                    dp(7);\n                    j = 11 + dq(7);\n                    dr(7);\n                    if (i + j > n) return -1;\n                    while (j-- > 0) g[i++] = 0;\n                    l = 0\n                }\n            }\n            X = H;\n            h = new dm(g, e, 257, df, dg, X);\n            if (X == 0) h.status = 1;\n            if (h.status != 0) {\n                if (h.status == 1);\n                return -1\n            }\n            W = h.root;\n            X = h.m;\n            for (i = 0; i < f; i++) g[i] = g[i + e];\n            zip_bd = I;\n            h = new dm(g, f, 0, dh, di, zip_bd);\n            zip_td = h.root;\n            zip_bd = h.m;\n            if (zip_bd == 0 && e > 257) {\n                return -1\n            }\n            if (h.status == 1) {}\n            if (h.status != 0) return -1;\n            return ds(a, b, c)\n        };\n        var dw = function() {\n            var i;\n            if (L == null) L = new Array(2 * D);\n            M = 0;\n            Q = 0;\n            R = 0;\n            S = -1;\n            T = false;\n            U = V = 0;\n            W = null\n        };\n        var dx = function(a, b, c) {\n            var n, i;\n            n = 0;\n            while (n < c) {\n                if (T && S == -1) return n;\n                if (U > 0) {\n                    if (S != E) {\n                        while (U > 0 && n < c) {\n                            U--;\n                            V &= D - 1;\n                            M &= D - 1;\n                            a[b + n++] = L[M++] = L[V++]\n                        }\n                    } else {\n                        while (U > 0 && n < c) {\n                            U--;\n                            M &= D - 1;\n                            dp(8);\n                            a[b + n++] = L[M++] = dq(8);\n                            dr(8)\n                        }\n                        if (U == 0) S = -1\n                    }\n                    if (n == c) return n\n                }\n                if (S == -1) {\n                    if (T) break;\n                    dp(1);\n                    if (dq(1) != 0) T = true;\n                    dr(1);\n                    dp(2);\n                    S = dq(2);\n                    dr(2);\n                    W = null;\n                    U = 0\n                }\n                switch (S) {\n                    case 0:\n                        i = dt(a, b + n, c - n);\n                        break;\n                    case 1:\n                        if (W != null) i = ds(a, b + n, c - n);\n                        else i = du(a, b + n, c - n);\n                        break;\n                    case 2:\n                        if (W != null) i = ds(a, b + n, c - n);\n                        else i = dv(a, b + n, c - n);\n                        break;\n                    default:\n                        i = -1;\n                        break\n                }\n                if (i == -1) {\n                    if (T) return 0;\n                    return -1\n                }\n                n += i\n            }\n            return n\n        };\n        var dy = function(a) {\n            var i, j;\n            dw();\n            Y = a;\n            Z = 0;\n            var b = [0];\n            var c = [];\n            while ((i = dx(b, 0, b.length)) > 0) {\n                c.push(b[0])\n            }\n            Y = null;\n            return c\n        };\n        return dy\n    })();\n    var fj = function(c) {\n        var a = 1,\n            b = 0;\n        var i;\n        var d = c.length;\n        var e = 65521;\n        for (i = 0; i < d; i += 1) {\n            a = (a + c[i]) % e;\n            b = (b + a) % e\n        }\n        return (b << 16) | a\n    };\n    var fk = function(a, b) {\n        var i;\n        var c = fj(a);\n        var d = dd(a, b);\n        a = d;\n        a.unshift(0x78, 0xDA);\n        for (i = 0; i < 4; ++i) a.push(c >> i * 8 & 25);\n        return a\n    };\n    var fl = function(a) {\n        if (a.length < 6) {\n            throw \"DataError: Not enough input\";\n        }\n        var b = fi(a.slice(2, a.length - 4));\n        if (a.length > 6 && b.length === 0) {\n            throw \"DataError: Unable to inflate the data\";\n        }\n        return b\n    };\n    return {\n        'deflate': dd,\n        'inflate': fi,\n        'compress': fk,\n        'uncompress': fl\n    }\n})();\nvar char = 0,\n    short = 0,\n    int = 0,\n    long = 0,\n    void_ = 0;\nvar int8_t = char;\nvar uint8_t = char;\nvar int16_t = short;\nvar uint16_t = short;\nvar int32_t = int;\nvar uint32_t = int;\nvar uint64_t = long;\nvar int64_t = long;\nvar float = 0.00;\nvar size_t = 0;\nvar double = 0;\nvar score_t = int64_t;\n\nfunction cloneObjAttr(a) {\n    if (a instanceof Array) {\n        return a\n    }\n    if (a instanceof Object) {\n        var b = {};\n        for (var c in a) {\n            if (a.hasOwnProperty(c) && !(a instanceof Array)) b[c] = (a[c])\n        }\n        return b\n    }\n    throw new alert(\"Unable to copy obj! Its type isn't supported.\");\n}\n\nfunction newObjectIt(a) {\n    return JSON.parse(JSON.stringify(a))\n}\n\nfunction convertBinaryToArray(a) {\n    var b = new Array();\n    var c = a.length;\n    for (i = 0; i < c; ++i) b.push(a.charCodeAt(i));\n    return b\n}\n\nfunction int64BitLeft(a, b) {\n    var c = new Array();\n    var i;\n    for (i = 0; i < b; ++i) c[i] = '0';\n    bits = (a.toString(2) + '' + c.join(\"\"));\n    return parseInt(bits, 2)\n}\n\nfunction write32BitIn4Bytes(a, b, c) {\n    var i;\n    for (i = 3; i >= 0; --i) a[b + (3 - i)] = (c >> (8 * i)) & 0xff\n}\n\nfunction write4BytesIn32Bit(a, b) {\n    return ((a[b + 0] << 24) | (a[b + 1] << 16) | (a[b + 2] << 8) | a[b + 3])\n}\n\nfunction alert32BitIn4Bytes(a) {\n    var i, str = '';\n    for (i = 3; i >= 0; --i) str += ' ' + ((a >> (8 * i)) & 0xff);\n    alert(str)\n}\n\nfunction Byte2Hex(a) {\n    return '0x' + a.toString(16)\n}\n\nfunction memcpy(a, b, c, d, e) {\n    if (typeof a != 'string') {\n        for (i = 0; i < e; ++i) a[b + i] = c[d + i]\n    } else {\n        if (b > 0) alert('string offset is over 0');\n        a = c.slice(d, e);\n        return a\n    }\n}\n\nfunction memcpy2(a, b, c, d, e) {\n    var f = c.slice(0, d);\n    var g = c.slice(d, d + e);\n    var h = c.slice(d + e);\n    a.splice(0);\n    a.concat(f, g, h)\n}\n\nfunction memcpyArrM(b, c, d, e, f) {\n    for (i = 0; i < f; ++i) {\n        var g = b[c + i].length;\n        for (var a = 0; a < g; ++a) b[c + i][a] = d[e + i][a]\n    }\n}\n\nfunction ArrCopy(a) {\n    var b = new Array();\n    var c = a.length;\n    for (i = 0; i < c; ++i) {\n        b.push(a[i])\n    }\n    return b\n}\n\nfunction memset_wl(a, b) {\n    var c = new Array();\n    c.push(newObjectIt(a));\n    for (i = 0; i < b; ++i) c.push(newObjectIt(a));\n    c.push(0);\n    return c\n}\n\nfunction memset(a, b) {\n    var c = new Array();\n    for (i = 0; i < b; ++i) c.push(a);\n    c.push(0);\n    return c\n}\n\nfunction membuild_wl(a, b) {\n    var c = new Array();\n    c.push(newObjectIt(a));\n    for (i = 0; i < b; ++i) c.push(newObjectIt(a));\n    c.push(0);\n    return c\n}\n\nfunction membuild(a, b) {\n    var c = new Array();\n    for (i = 0; i < b; ++i) c.push(a);\n    c.push(0);\n    return c\n}\n\nfunction memset_(a, b, c, d) {\n    for (i = 0; i < d; ++i) a[b + i] = c\n}\n\nfunction malloc(a, b) {\n    var c = new Array();\n    for (i = 0; i < a; ++i) c.push(b);\n    c.push(0);\n    return c\n}\n\nfunction mallocStr(a, b) {\n    var c = new Array();\n    for (i = 0; i < a; ++i) c.push(' ');\n    return c.join(\"\")\n}\n\nfunction sizeof(a) {\n    return 1\n}\n\nfunction memcmp(a, b, s, c) {\n    var w = '';\n    for (i = 0; i < c; ++i) w += String.fromCharCode(a[b + i]);\n    if (s == w) return 0;\n    else return 1\n}\n\nfunction Arr(a, b) {\n    var c = new Array();\n    for (i = 0; i < a; ++i) c.push(b);\n    return c\n}\n\nfunction Arr_nOI(a, b) {\n    var c = new Array();\n    for (i = 0; i < a; ++i) c.push(newObjectIt(b));\n    return c\n}\n\nfunction ArrM(b, c) {\n    var d, resStr = new Array();\n    for (a = (b.length - 1); a >= 0; --a) c = newObjectIt(Arr(b[a], c));\n    return c\n}\n\nfunction assert(a) {\n    if (!a) {\n        throw new Error('assert :P');\n    }\n}\n\nfunction WebPDecoder() {\n    var N = 0x0002;\n    var O = 0,\n        MODE_RGBA = 1,\n        MODE_BGR = 2,\n        MODE_BGRA = 3,\n        MODE_ARGB = 4,\n        MODE_RGBA_4444 = 5,\n        MODE_RGB_565 = 6,\n        MODE_YUV = 7,\n        MODE_YUVA = 8,\n        MODE_LAST = 9;\n    this.WEBP_CSP_MODE = {\n        MODE_RGB: 0,\n        MODE_RGBA: 1,\n        MODE_BGR: 2,\n        MODE_BGRA: 3,\n        MODE_ARGB: 4,\n        MODE_RGBA_4444: 5,\n        MODE_RGB_565: 6,\n        MODE_YUV: 7,\n        MODE_YUVA: 8,\n        MODE_LAST: 9\n    };\n    var P = {\n        rgba: uint8_t,\n        rgba_off: 0,\n        stride: int,\n        size: int\n    };\n    var Q = {\n        y: uint8_t,\n        u: uint8_t,\n        v: uint8_t,\n        a: uint8_t,\n        y_off: uint8_t,\n        u_off: uint8_t,\n        v_off: uint8_t,\n        a_off: uint8_t,\n        y_stride: int,\n        u_stride: int,\n        v_stride: int,\n        a_stride: int,\n        y_size: int,\n        u_size: int,\n        v_size: int,\n        a_size: int\n    };\n    var R = {\n        colorspace: 'WEBP_CSP_MODE',\n        width: int,\n        height: int,\n        is_external_memory: int,\n        u: {\n            RGBA: P,\n            YUVA: Q\n        },\n        private_memory: null,\n        private_memory_off: uint8_t\n    };\n\n    function WebPInitDecBuffer(a) {\n        return WebPInitDecBufferInternal(a, N)\n    }\n    var T = 0,\n        VP8_STATUS_OUT_OF_MEMORY = 1,\n        VP8_STATUS_INVALID_PARAM = 2,\n        VP8_STATUS_BITSTREAM_ERROR = 3,\n        VP8_STATUS_UNSUPPORTED_FEATURE = 4,\n        VP8_STATUS_SUSPENDED = 5,\n        VP8_STATUS_USER_ABORT = 6,\n        VP8_STATUS_NOT_ENOUGH_DATA = 7;\n    this.VP8StatusCode = {\n        VP8_STATUS_OK: 0,\n        VP8_STATUS_OUT_OF_MEMORY: 1,\n        VP8_STATUS_INVALID_PARAM: 2,\n        VP8_STATUS_BITSTREAM_ERROR: 3,\n        VP8_STATUS_UNSUPPORTED_FEATURE: 4,\n        VP8_STATUS_SUSPENDED: 5,\n        VP8_STATUS_USER_ABORT: 6,\n        VP8_STATUS_NOT_ENOUGH_DATA: 7\n    };\n    var U = {\n        width: {\n            value: int\n        },\n        height: {\n            value: int\n        },\n        has_alpha: {\n            value: int\n        },\n        no_incremental_decoding: int,\n        rotate: int,\n        uv_sampling: int,\n        bitstream_version: int\n    };\n    this.WebPGetFeatures = function(a, b, c) {\n        return WebPGetFeaturesInternal(a, b, c, N)\n    };\n    var V = {\n        bypass_filtering: int,\n        no_fancy_upsampling: int,\n        use_cropping: int,\n        crop_left: int,\n        crop_top: int,\n        crop_width: int,\n        crop_height: int,\n        use_scaling: int,\n        scaled_width: int,\n        scaled_height: int,\n        force_rotation: int,\n        no_enhancement: int,\n        use_threads: int\n    };\n    this.WebPDecoderConfig = {\n        input: newObjectIt(U),\n        output: newObjectIt(R),\n        options: newObjectIt(V)\n    };\n    this.WebPInitDecoderConfig = function(a) {\n        return WebPInitDecoderConfigInternal(a, N)\n    };\n    var Y = {\n        width: int,\n        height: int,\n        mb_y: int,\n        mb_w: int,\n        mb_h: int,\n        y: uint8_t,\n        u: uint8_t,\n        v: uint8_t,\n        y_off: 0,\n        u_off: 0,\n        v_off: 0,\n        y_stride: int,\n        uv_stride: int,\n        opaque: void_,\n        put: 0,\n        setup: 0,\n        teardown: 0,\n        fancy_upsampling: int,\n        data_size: uint32_t,\n        data: uint8_t,\n        data_off: 0,\n        bypass_filtering: int,\n        use_cropping: int,\n        crop_left: int,\n        crop_right: int,\n        crop_top: int,\n        crop_bottom: int,\n        use_scaling: int,\n        scaled_width: int,\n        scaled_height: int,\n        a: uint8_t,\n        a_off: 0\n    };\n\n    function VP8InitIo(a) {\n        return VP8InitIoInternal(a, N)\n    };\n    var Z = {\n        x_expand: int,\n        fy_scale: int,\n        fx_scale: int,\n        fxy_scale: int64_t,\n        y_accum: int,\n        y_add: int,\n        y_sub: int,\n        x_add: int,\n        x_sub: int,\n        src_width: int,\n        src_height: int,\n        dst_width: int,\n        dst_height: int,\n        dst: uint8_t,\n        dst_off: 0,\n        dst_stride: int,\n        irow: int32_t,\n        irow_off: 0,\n        frow: int32_t,\n        frow_off: 0\n    };\n    var ba = {\n        output: newObjectIt(R),\n        tmp_y: uint8_t,\n        tmp_u: uint8_t,\n        tmp_v: uint8_t,\n        tmp_y_off: 0,\n        tmp_u_off: 0,\n        tmp_v_off: 0,\n        last_y: int,\n        options_: newObjectIt(V),\n        scaler_y: newObjectIt(Z),\n        scaler_u: newObjectIt(Z),\n        scaler_v: newObjectIt(Z),\n        scaler_a: newObjectIt(Z),\n        memory: void_,\n        emit: '(OutputFunc)',\n        emit_alpha: '(OutputFunc)'\n    };\n    var bb = {\n        buf_: uint8_t,\n        buf_off: null,\n        buf_end_: uint8_t,\n        eof_: int,\n        range_: uint32_t,\n        value_: uint32_t,\n        missing_: int\n    };\n\n    function VP8Get(a) {\n        return VP8GetValue(a, 1)\n    };\n\n    function VP8GetByte(a) {\n        assert(a);\n        if (a.buf_off < a.buf_end_) {\n            assert(a.buf_);\n            return (a.buf_[a.buf_off++])\n        }\n        a.eof_ = 1;\n        return 0xff\n    }\n\n    function VP8BitUpdate(a, b) {\n        var c = uint32_t;\n        var d = (b + 1) << 8;\n        if (a.missing_ > 0) {\n            a.value_ |= VP8GetByte(a) << a.missing_;\n            a.missing_ -= 8\n        }\n        c = (a.value_ >= d) + 0;\n        if (c) {\n            a.range_ -= b + 1;\n            a.value_ -= d\n        } else {\n            a.range_ = b\n        }\n        return c\n    }\n\n    function VP8Shift(a) {\n        var b = bc[a.range_];\n        a.range_ = bd[a.range_];\n        a.value_ <<= b;\n        a.missing_ += b\n    };\n\n    function VP8GetBit(a, b) {\n        var c = (a.range_ * b) >> 8;\n        var d = VP8BitUpdate(a, c);\n        if (a.range_ < 0x7f) {\n            VP8Shift(a)\n        }\n        return d\n    };\n\n    function VP8GetSigned(a, v) {\n        var b = a.range_ >> 1;\n        var c = VP8BitUpdate(a, b);\n        VP8Shift(a);\n        return c ? -v : v\n    };\n\n    function VP8InitBitReader(a, b, c, d) {\n        assert(a);\n        assert(b);\n        assert(d);\n        a.range_ = 255 - 1;\n        a.buf_ = b;\n        a.buf_off = c;\n        a.buf_end_ = d;\n        a.value_ = 0;\n        a.missing_ = 8;\n        a.eof_ = 0\n    };\n    var bc = new Array(7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0);\n    var bd = new Array(127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239, 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 127);\n\n    function VP8GetValue(a, b) {\n        var v = 0;\n        while (b-- > 0) {\n            v |= VP8GetBit(a, 0x80) << b\n        }\n        return v\n    };\n\n    function VP8GetSignedValue(a, b) {\n        var c = VP8GetValue(a, b);\n        return VP8Get(a) ? -c : c\n    };\n    var be = 0;\n    var bf = 1;\n    var bg = 2;\n    var bh = 0,\n        B_TM_PRED = 1,\n        B_VE_PRED = 2,\n        B_HE_PRED = 3,\n        B_RD_PRED = 4,\n        B_VR_PRED = 5,\n        B_LD_PRED = 6,\n        B_VL_PRED = 7,\n        B_HD_PRED = 8,\n        B_HU_PRED = 9,\n        NUM_BMODES = B_HU_PRED + 1 - bh,\n        DC_PRED = bh,\n        V_PRED = B_VE_PRED,\n        H_PRED = B_HE_PRED,\n        TM_PRED = B_TM_PRED,\n        B_PRED = NUM_BMODES,\n        B_DC_PRED_NOTOP = 4,\n        B_DC_PRED_NOLEFT = 5,\n        B_DC_PRED_NOTOPLEFT = 6,\n        NUM_B_DC_MODES = 7;\n    var bi = 3,\n        NUM_MB_SEGMENTS = 4,\n        NUM_REF_LF_DELTAS = 4,\n        NUM_MODE_LF_DELTAS = 4,\n        MAX_NUM_PARTITIONS = 8,\n        NUM_TYPES = 4,\n        NUM_BANDS = 8,\n        NUM_CTX = 3,\n        NUM_PROBAS = 11,\n        NUM_MV_PROBAS = 19;\n    var bj = 32;\n    var bk = (bj * 17 + bj * 9);\n    var bl = (bj * 17);\n    var bm = (bj * 1 + 8);\n    var bn = (bm + bj * 16 + bj);\n    var bo = (bn + 16);\n    var bp = {\n        key_frame_: uint8_t,\n        profile_: uint8_t,\n        show_: uint8_t,\n        partition_length_: uint32_t\n    };\n    var bq = {\n        width_: uint16_t,\n        height_: uint16_t,\n        xscale_: uint8_t,\n        yscale_: uint8_t,\n        colorspace_: uint8_t,\n        clamp_type_: uint8_t\n    };\n    var bs = {\n        use_segment_: int,\n        update_map_: int,\n        absolute_delta_: int,\n        quantizer_: Arr(NUM_MB_SEGMENTS, int8_t),\n        filter_strength_: Arr(NUM_MB_SEGMENTS, int8_t)\n    };\n    var bt = {\n        segments_: Arr(bi, uint8_t),\n        coeffs_: ArrM(new Array(NUM_TYPES, NUM_BANDS, NUM_CTX, NUM_PROBAS), uint8_t)\n    };\n    var bu = {\n        simple_: int,\n        level_: int,\n        sharpness_: int,\n        use_lf_delta_: int,\n        ref_lf_delta_: Arr(NUM_REF_LF_DELTAS, int),\n        mode_lf_delta_: Arr(NUM_REF_LF_DELTAS, int)\n    };\n    var bv = {\n        f_level_: int,\n        f_ilevel_: int,\n        f_inner_: int\n    };\n    var bw = {\n        nz_: int,\n        dc_nz_: int,\n        skip_: int\n    };\n    var bx = {\n        y1_mat_: Arr(2, uint16_t),\n        y2_mat_: Arr(2, uint16_t),\n        uv_mat_: Arr(2, uint16_t)\n    };\n    var by = {\n        id_: int,\n        mb_y_: int,\n        filter_row_: int,\n        f_info_: bv,\n        io_: Y\n    };\n    var bz = {\n        status_: 'VP8StatusCode',\n        ready_: int,\n        error_msg_: char,\n        br_: newObjectIt(bb),\n        frm_hdr_: newObjectIt(bp),\n        pic_hdr_: newObjectIt(bq),\n        filter_hdr_: newObjectIt(bu),\n        segment_hdr_: newObjectIt(bs),\n        worker_: 'WebPWorker',\n        use_threads_: int,\n        cache_id_: int,\n        num_caches_: int,\n        thread_ctx_: by,\n        mb_w_: int,\n        mb_h_: int,\n        tl_mb_x_: int,\n        tl_mb_y_: int,\n        br_mb_x_: int,\n        br_mb_y_: int,\n        num_parts_: int,\n        parts_: Arr_nOI(MAX_NUM_PARTITIONS, bb),\n        buffer_flags_: uint32_t,\n        dqm_: Arr_nOI(NUM_MB_SEGMENTS, bx),\n        proba_: newObjectIt(bt),\n        use_skip_proba_: int,\n        skip_p_: uint8_t,\n        intra_t_: uint8_t,\n        intra_l_: Arr(4, uint8_t),\n        y_t_: uint8_t,\n        u_t_: uint8_t,\n        v_t_: uint8_t,\n        mb_info_: newObjectIt(bw),\n        f_info_: newObjectIt(bv),\n        yuv_b_: uint8_t,\n        coeffs_: int16_t,\n        cache_y_: uint8_t,\n        cache_u_: uint8_t,\n        cache_v_: uint8_t,\n        cache_y_off: int,\n        cache_u_off: int,\n        cache_v_off: int,\n        cache_y_stride_: int,\n        cache_uv_stride_: int,\n        mem_: void_,\n        mem_size_: int,\n        mb_x_: int,\n        mb_y_: int,\n        is_i4x4_: uint8_t,\n        imodes_: Arr(16, uint8_t),\n        imodes_offset_: 0,\n        uvmode_: uint8_t,\n        segment_: uint8_t,\n        non_zero_: uint32_t,\n        non_zero_ac_: uint32_t,\n        filter_type_: int,\n        filter_row_: int,\n        filter_levels_: Arr(NUM_MB_SEGMENTS, uint8_t),\n        alpha_data_: uint8_t,\n        alpha_data_off: 0,\n        alpha_data_size_: size_t,\n        alpha_plane_: uint8_t,\n        alpha_plane_off: 0,\n        layer_colorspace_: int,\n        layer_data_: uint8_t,\n        layer_data_off: 0,\n        layer_data_size_: size_t\n    };\n\n    function VP8DecompressAlphaRows(a, b, c) {\n        var d = a.alpha_plane_;\n        var e = a.pic_hdr_.width_;\n        if (b < 0 || b + c > a.pic_hdr_.height_) {\n            return null\n        }\n        if (b == 0) {\n            var f = a.alpha_data_;\n            var g = a.alpha_data_off;\n            var h = a.alpha_data_size_;\n            var i = e * a.pic_hdr_.height_;\n            d = WebPZlib.uncompress(f.slice(g, g + h))\n        }\n        return (b == 0 ? d : (+b * e))\n    }\n    var bA = new Array(3, 4, 3, 4, 4, 2, 2, 1, 1);\n\n    function CheckDecBuffer(a) {\n        var b = 1;\n        var c = a.colorspace;\n        var d = a.width;\n        var e = a.height;\n        if (c >= MODE_YUV) {\n            var f = a.u.YUVA;\n            var g = f.y_stride * e;\n            var h = f.u_stride * parseInt((e + 1) / 2);\n            var i = f.v_stride * parseInt((e + 1) / 2);\n            var j = f.a_stride * e;\n            b &= (g <= f.y_size);\n            b &= (h <= f.u_size);\n            b &= (i <= f.v_size);\n            b &= (j <= f.a_size);\n            b &= (f.y_stride >= d);\n            b &= (f.u_stride >= parseInt(d + 1) / 2);\n            b &= (f.v_stride >= parseInt(d + 1) / 2);\n            if (f.a) {\n                b &= (f.a_stride >= d)\n            }\n        } else {\n            var f = a.u.RGBA;\n            b &= (f.stride * e <= f.size);\n            b &= (f.stride >= d * bA[c])\n        }\n        return b ? T : VP8_STATUS_INVALID_PARAM\n    }\n\n    function AllocateBuffer(a) {\n        var w = a.width;\n        var h = a.height;\n        if (w <= 0 || h <= 0) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        if (!a.is_external_memory && a.private_memory == null) {\n            var b = uint8_t;\n            var c = 0;\n            var d = a.colorspace;\n            var e = int;\n            var f = 0,\n                a_stride = 0;\n            var g = 0;\n            var i = uint64_t,\n                a_size = 0,\n                total_size = uint64_t;\n            e = w * bA[d];\n            i = e * h;\n            if (d >= MODE_YUV) {\n                f = parseInt((w + 1) / 2);\n                g = f * parseInt((h + 1) / 2);\n                if (d == MODE_YUVA) {\n                    a_stride = w;\n                    a_size = a_stride * h\n                }\n            }\n            total_size = i + 2 * g + a_size;\n            if ((total_size != total_size)) {\n                return VP8_STATUS_INVALID_PARAM\n            }\n            a.private_memory = b = malloc(total_size, size_t);\n            a.private_memory_off = c = 0;\n            if (b == null) {\n                return VP8_STATUS_OUT_OF_MEMORY\n            }\n            if (d >= MODE_YUV) {\n                var j = a.u.YUVA;\n                j.y = b;\n                j.y_off = c;\n                j.y_stride = e;\n                j.y_size = i;\n                j.u = b;\n                j.u_off = c + i;\n                j.u_stride = f;\n                j.u_size = g;\n                j.v = b;\n                j.v_off = c + i + g;\n                j.v_stride = f;\n                j.v_size = g;\n                if (d == MODE_YUVA) {\n                    j.a = b;\n                    j.a_off = c + i + 2 * g\n                }\n                j.a_size = a_size;\n                j.a_stride = a_stride\n            } else {\n                var j = a.u.RGBA;\n                j.rgba = b;\n                j.rgba_off = c;\n                j.stride = e;\n                j.size = i\n            }\n        }\n        return CheckDecBuffer(a)\n    }\n\n    function WebPAllocateDecBuffer(w, h, a, b) {\n        if (b == null || w <= 0 || h <= 0) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        if (a != null) {\n            if (a.use_cropping) {\n                var c = a.crop_width;\n                var d = a.crop_height;\n                var x = a.crop_left & ~1;\n                var y = a.crop_top & ~1;\n                if (x < 0 || y < 0 || c <= 0 || d <= 0 || x + c > w || y + d > h) {\n                    return VP8_STATUS_INVALID_PARAM\n                }\n                w = c;\n                h = d\n            }\n            if (a.use_scaling) {\n                if (a.scaled_width <= 0 || a.scaled_height <= 0) {\n                    return VP8_STATUS_INVALID_PARAM\n                }\n                w = a.scaled_width;\n                h = a.scaled_height\n            }\n        }\n        b.width = w;\n        b.height = h;\n        return AllocateBuffer(b)\n    }\n\n    function WebPInitDecBufferInternal(a, b) {\n        if (b != N) return 0;\n        if (!a) return 0;\n        memset_(a, 0, 0, sizeof(a) * a.length);\n        return 1\n    }\n    this.WebPFreeDecBuffer = function(a) {\n        if (a) {\n            if (!a.is_external_memory) a.private_memory = '';\n            a.private_memory_off = 0;\n            a.private_memory = a.private_memory_off = null\n        }\n    };\n\n    function WebPCopyDecBuffer(a, b) {\n        alert('todo: WebPCopyDecBuffer')\n    }\n\n    function WebPGrabDecBuffer(a, b) {\n        alert('todo: WebPGrabDecBuffer')\n    }\n\n    function VP8DecodeLayer(a) {\n        assert(a);\n        assert(a.layer_data_size_ > 0);\n        return 1\n    }\n    var bB = Arr((255 + 255 + 1), uint8_t);\n    var bC = Arr((255 + 255 + 1), uint8_t);\n    var bD = Arr((1020 + 1020 + 1), int8_t);\n    var bE = Arr((112 + 112 + 1), int8_t);\n    var bF = Arr((255 + 510 + 1), uint8_t);\n    var bG = 0;\n\n    function VP8DspInitTables(a) {\n        if (!bG) {\n            var i;\n            for (i = -255; i <= 255; ++i) {\n                bB[255 + i] = (i < 0) ? -i : i;\n                bC[255 + i] = bB[255 + i] >> 1\n            }\n            for (i = -1020; i <= 1020; ++i) {\n                bD[1020 + i] = (i < -128) ? -128 : (i > 127) ? 127 : i\n            }\n            for (i = -112; i <= 112; ++i) {\n                bE[112 + i] = (i < -16) ? -16 : (i > 15) ? 15 : i\n            }\n            for (i = -255; i <= 255 + 255; ++i) {\n                bF[255 + i] = (i < 0) ? 0 : (i > 255) ? 255 : i\n            }\n            bG = 1\n        }\n    };\n\n    function clip_8b(v) {\n        return (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255\n    };\n\n    function STORE(x, y, v) {\n        dst[dst_off + x + y * bj] = clip_8b(dst_off + dst[x + y * bj] + ((v) >> 3))\n    };\n    var bH = 20091 + (1 << 16);\n    var bI = 35468;\n\n    function MUL(a, b) {\n        return (((a) * (b)) >> 16)\n    }\n\n    function TransformOne(e, f, g, h) {\n        var C = Arr(4 * 4, 0),\n            tmp, tmp_off;\n        tmp_off = 0;\n        var i;\n        tmp = C;\n        for (i = 0; i < 4; ++i) {\n            var a = e[f + 0] + e[f + 8];\n            var b = e[f + 0] - e[f + 8];\n            var c = MUL(e[f + 4], bI) - MUL(e[f + 12], bH);\n            var d = MUL(e[f + 4], bH) + MUL(e[f + 12], bI);\n            tmp[tmp_off + 0] = a + d;\n            tmp[tmp_off + 1] = b + c;\n            tmp[tmp_off + 2] = b - c;\n            tmp[tmp_off + 3] = a - d;\n            tmp_off += 4;\n            f++\n        }\n        tmp_off = 0;\n        for (i = 0; i < 4; ++i) {\n            var j = tmp[tmp_off + 0] + 4;\n            var a = j + tmp[tmp_off + 8];\n            var b = j - tmp[tmp_off + 8];\n            var c = MUL(tmp[tmp_off + 4], bI) - MUL(tmp[tmp_off + 12], bH);\n            var d = MUL(tmp[tmp_off + 4], bH) + MUL(tmp[tmp_off + 12], bI);\n            g[h + 0 + 0 * bj] = clip_8b(g[h + 0 + 0 * bj] + ((a + d) >> 3));\n            g[h + 1 + 0 * bj] = clip_8b(g[h + 1 + 0 * bj] + ((b + c) >> 3));\n            g[h + 2 + 0 * bj] = clip_8b(g[h + 2 + 0 * bj] + ((b - c) >> 3));\n            g[h + 3 + 0 * bj] = clip_8b(g[h + 3 + 0 * bj] + ((a - d) >> 3));\n            tmp_off++;\n            h += bj\n        }\n    };\n\n    function TransformTwo(a, b, c, d, e) {\n        TransformOne(a, b, c, d);\n        if (e) {\n            TransformOne(a, b + 16, c, d + 4)\n        }\n    }\n\n    function TransformUV(a, b, c, d) {\n        bM(a, b + 0 * 16, c, d + 0, 1);\n        bM(a, b + 2 * 16, c, d + 4 * bj, 1)\n    }\n\n    function TransformDC(a, b, c, d) {\n        var e = a[b + 0] + 4;\n        var i, j;\n        for (j = 0; j < 4; ++j) {\n            for (i = 0; i < 4; ++i) {\n                var f = c[d + i + j * bj];\n                c[d + i + j * bj] = clip_8b(c[d + i + j * bj] + ((e) >> 3))\n            }\n        }\n    };\n\n    function TransformDCUV(a, b, c, d) {\n        if (a[b + 0 * 16]) TransformDC(a, b + 0 * 16, c, d + 0);\n        if (a[b + 1 * 16]) TransformDC(a, b + 1 * 16, c, d + 4);\n        if (a[b + 2 * 16]) TransformDC(a, b + 2 * 16, c, d + 4 * bj);\n        if (a[b + 3 * 16]) TransformDC(a, b + 3 * 16, c, d + 4 * bj + 4)\n    };\n\n    function TransformWHT(a, b) {\n        var c = Arr(16, int);\n        var i = int;\n        for (i = 0; i < 4; ++i) {\n            var d = a[0 + i] + a[12 + i];\n            var e = a[4 + i] + a[8 + i];\n            var f = a[4 + i] - a[8 + i];\n            var g = a[0 + i] - a[12 + i];\n            c[0 + i] = d + e;\n            c[8 + i] = d - e;\n            c[4 + i] = g + f;\n            c[12 + i] = g - f\n        }\n        for (i = 0; i < 4; ++i) {\n            var h = b[b.length - 1];\n            var j = c[0 + i * 4] + 3;\n            var d = j + c[3 + i * 4];\n            var e = c[1 + i * 4] + c[2 + i * 4];\n            var f = c[1 + i * 4] - c[2 + i * 4];\n            var g = j - c[3 + i * 4];\n            b[h + 0] = (d + e) >> 3;\n            b[h + 16] = (g + f) >> 3;\n            b[h + 32] = (d - e) >> 3;\n            b[h + 48] = (g - f) >> 3;\n            b[b.length - 1] += 64\n        }\n    };\n\n    function VP8TransformWHT(a, b) {\n        TransformWHT(a, b)\n    };\n\n    function OUT(x, y) {\n        dst[(x) + (y) * bj]\n    }\n\n    function TrueMotion(a, b, c) {\n        var d = a;\n        var e = b - bj;\n        var f = bF;\n        var g = +255 - d[e - 1];\n        var y;\n        for (y = 0; y < c; ++y) {\n            var h = f;\n            var i = g + a[b - 1];\n            var x;\n            for (x = 0; x < c; ++x) {\n                a[b + x] = h[i + d[e + x]]\n            }\n            b += bj\n        }\n    };\n\n    function TM4(a, b) {\n        TrueMotion(a, b, 4)\n    }\n\n    function TM8uv(a, b) {\n        TrueMotion(a, b, 8)\n    }\n\n    function TM16(a, b) {\n        TrueMotion(a, b, 16)\n    }\n\n    function VE16(a, b) {\n        var j;\n        for (j = 0; j < 16; ++j) {\n            memcpy(a, b + j * bj, a, b - bj, 16)\n        }\n    };\n\n    function HE16(a, b) {\n        var j;\n        for (j = 16; j > 0; --j) {\n            memset_(a, b + 0, a[b - 1], 16);\n            b += bj\n        }\n    };\n\n    function Put16(v, a, b) {\n        var j;\n        for (j = 0; j < 16; ++j) {\n            for (i = 0; i < (16); ++i) a[b + j * bj + i] = v\n        }\n    };\n\n    function DC16(a, b) {\n        var c = 16;\n        var j;\n        for (j = 0; j < 16; ++j) {\n            c += a[b - 1 + j * bj] + a[b + j - bj]\n        }\n        Put16(c >> 5, a, b)\n    };\n\n    function DC16NoTop(a, b) {\n        var c = 8;\n        var j;\n        for (j = 0; j < 16; ++j) {\n            c += a[b - 1 + j * bj]\n        }\n        Put16(c >> 4, a, b)\n    };\n\n    function DC16NoLeft(a, b) {\n        var c = 8;\n        var i;\n        for (i = 0; i < 16; ++i) {\n            c += a[b + i - bj]\n        }\n        Put16(c >> 4, a, b)\n    };\n\n    function DC16NoTopLeft(a, b) {\n        Put16(0x80, a, b)\n    };\n\n    function AVG3(a, b, c) {\n        return (((a) + 2 * (b) + (c) + 2) >> 2)\n    };\n\n    function AVG2(a, b) {\n        return (((a) + (b) + 1) >> 1)\n    };\n\n    function VE4(a, b) {\n        var c = a;\n        var d = b - bj;\n        var e = new Array();\n        e.push(AVG3(c[d - 1], c[d + 0], c[d + 1]));\n        e.push(AVG3(c[d + 0], c[d + 1], c[d + 2]));\n        e.push(AVG3(c[d + 1], c[d + 2], c[d + 3]));\n        e.push(AVG3(c[d + 2], c[d + 3], c[d + 4]));\n        var i;\n        for (i = 0; i < 4; ++i) {\n            memcpy(a, b + i * bj, e, 0, 4 * sizeof(e))\n        }\n    };\n\n    function HE4(a, b) {\n        var A = a[b - 1 - bj];\n        var B = a[b - 1];\n        var C = a[b - 1 + bj];\n        var D = a[b - 1 + 2 * bj];\n        var E = a[b - 1 + 3 * bj];\n        a[b + 0 + 0 * bj] = a[b + 1 + 0 * bj] = a[b + 2 + 0 * bj] = a[b + 3 + 0 * bj] = AVG3(A, B, C);\n        a[b + 0 + 1 * bj] = a[b + 1 + 1 * bj] = a[b + 2 + 1 * bj] = a[b + 3 + 1 * bj] = AVG3(B, C, D);\n        a[b + 0 + 2 * bj] = a[b + 1 + 2 * bj] = a[b + 2 + 2 * bj] = a[b + 3 + 2 * bj] = AVG3(C, D, E);\n        a[b + 0 + 3 * bj] = a[b + 1 + 3 * bj] = a[b + 2 + 3 * bj] = a[b + 3 + 3 * bj] = AVG3(D, E, E)\n    };\n\n    function DC4(a, b) {\n        var c = 4;\n        var i;\n        for (i = 0; i < 4; ++i) c += a[b + i - bj] + a[b - 1 + i * bj];\n        c >>= 3;\n        for (i = 0; i < 4; ++i) {\n            memset_(a, b + i * bj, c, 4)\n        }\n    };\n\n    function RD4(a, b) {\n        var I = a[b - 1 + 0 * bj];\n        var J = a[b - 1 + 1 * bj];\n        var K = a[b - 1 + 2 * bj];\n        var L = a[b - 1 + 3 * bj];\n        var X = a[b - 1 - bj];\n        var A = a[b + 0 - bj];\n        var B = a[b + 1 - bj];\n        var C = a[b + 2 - bj];\n        var D = a[b + 3 - bj];\n        a[b + (0) + (3) * bj] = AVG3(J, K, L);\n        a[b + (0) + (2) * bj] = a[b + (1) + (3) * bj] = AVG3(I, J, K);\n        a[b + (0) + (1) * bj] = a[b + (1) + (2) * bj] = a[b + (2) + (3) * bj] = AVG3(X, I, J);\n        a[b + (0) + (0) * bj] = a[b + (1) + (1) * bj] = a[b + (2) + (2) * bj] = a[b + (3) + (3) * bj] = AVG3(A, X, I);\n        a[b + (1) + (0) * bj] = a[b + (2) + (1) * bj] = a[b + (3) + (2) * bj] = AVG3(B, A, X);\n        a[b + (2) + (0) * bj] = a[b + (3) + (1) * bj] = AVG3(C, B, A);\n        a[b + (3) + (0) * bj] = AVG3(D, C, B)\n    };\n\n    function LD4(a, b) {\n        var A = a[b + 0 - bj];\n        var B = a[b + 1 - bj];\n        var C = a[b + 2 - bj];\n        var D = a[b + 3 - bj];\n        var E = a[b + 4 - bj];\n        var F = a[b + 5 - bj];\n        var G = a[b + 6 - bj];\n        var H = a[b + 7 - bj];\n        a[b + (0) + (0) * bj] = AVG3(A, B, C);\n        a[b + (1) + (0) * bj] = a[b + (0) + (1) * bj] = AVG3(B, C, D);\n        a[b + (2) + (0) * bj] = a[b + (1) + (1) * bj] = a[b + (0) + (2) * bj] = AVG3(C, D, E);\n        a[b + (3) + (0) * bj] = a[b + (2) + (1) * bj] = a[b + (1) + (2) * bj] = a[b + (0) + (3) * bj] = AVG3(D, E, F);\n        a[b + (3) + (1) * bj] = a[b + (2) + (2) * bj] = a[b + (1) + (3) * bj] = AVG3(E, F, G);\n        a[b + (3) + (2) * bj] = a[b + (2) + (3) * bj] = AVG3(F, G, H);\n        a[b + (3) + (3) * bj] = AVG3(G, H, H)\n    };\n\n    function VR4(a, b) {\n        var I = a[b - 1 + 0 * bj];\n        var J = a[b - 1 + 1 * bj];\n        var K = a[b - 1 + 2 * bj];\n        var X = a[b - 1 - bj];\n        var A = a[b + 0 - bj];\n        var B = a[b + 1 - bj];\n        var C = a[b + 2 - bj];\n        var D = a[b + 3 - bj];\n        a[b + (0) + (0) * bj] = a[b + (1) + (2) * bj] = AVG2(X, A);\n        a[b + (1) + (0) * bj] = a[b + (2) + (2) * bj] = AVG2(A, B);\n        a[b + (2) + (0) * bj] = a[b + (3) + (2) * bj] = AVG2(B, C);\n        a[b + (3) + (0) * bj] = AVG2(C, D);\n        a[b + (0) + (3) * bj] = AVG3(K, J, I);\n        a[b + (0) + (2) * bj] = AVG3(J, I, X);\n        a[b + (0) + (1) * bj] = a[b + (1) + (3) * bj] = AVG3(I, X, A);\n        a[b + (1) + (1) * bj] = a[b + (2) + (3) * bj] = AVG3(X, A, B);\n        a[b + (2) + (1) * bj] = a[b + (3) + (3) * bj] = AVG3(A, B, C);\n        a[b + (3) + (1) * bj] = AVG3(B, C, D)\n    };\n\n    function VL4(a, b) {\n        var A = a[b + 0 - bj];\n        var B = a[b + 1 - bj];\n        var C = a[b + 2 - bj];\n        var D = a[b + 3 - bj];\n        var E = a[b + 4 - bj];\n        var F = a[b + 5 - bj];\n        var G = a[b + 6 - bj];\n        var H = a[b + 7 - bj];\n        a[b + (0) + (0) * bj] = AVG2(A, B);\n        a[b + (1) + (0) * bj] = a[b + (0) + (2) * bj] = AVG2(B, C);\n        a[b + (2) + (0) * bj] = a[b + (1) + (2) * bj] = AVG2(C, D);\n        a[b + (3) + (0) * bj] = a[b + (2) + (2) * bj] = AVG2(D, E);\n        a[b + (0) + (1) * bj] = AVG3(A, B, C);\n        a[b + (1) + (1) * bj] = a[b + (0) + (3) * bj] = AVG3(B, C, D);\n        a[b + (2) + (1) * bj] = a[b + (1) + (3) * bj] = AVG3(C, D, E);\n        a[b + (3) + (1) * bj] = a[b + (2) + (3) * bj] = AVG3(D, E, F);\n        a[b + (3) + (2) * bj] = AVG3(E, F, G);\n        a[b + (3) + (3) * bj] = AVG3(F, G, H)\n    };\n\n    function HU4(a, b) {\n        var I = a[b - 1 + 0 * bj];\n        var J = a[b - 1 + 1 * bj];\n        var K = a[b - 1 + 2 * bj];\n        var L = a[b - 1 + 3 * bj];\n        a[b + (0) + (0) * bj] = AVG2(I, J);\n        a[b + (2) + (0) * bj] = a[b + (0) + (1) * bj] = AVG2(J, K);\n        a[b + (2) + (1) * bj] = a[b + (0) + (2) * bj] = AVG2(K, L);\n        a[b + (1) + (0) * bj] = AVG3(I, J, K);\n        a[b + (3) + (0) * bj] = a[b + (1) + (1) * bj] = AVG3(J, K, L);\n        a[b + (3) + (1) * bj] = a[b + (1) + (2) * bj] = AVG3(K, L, L);\n        a[b + (3) + (2) * bj] = a[b + (2) + (2) * bj] = a[b + (0) + (3) * bj] = a[b + (1) + (3) * bj] = a[b + (2) + (3) * bj] = a[b + (3) + (3) * bj] = L\n    };\n\n    function HD4(a, b) {\n        var I = a[b - 1 + 0 * bj];\n        var J = a[b - 1 + 1 * bj];\n        var K = a[b - 1 + 2 * bj];\n        var L = a[b - 1 + 3 * bj];\n        var X = a[b - 1 - bj];\n        var A = a[b + 0 - bj];\n        var B = a[b + 1 - bj];\n        var C = a[b + 2 - bj];\n        a[b + (0) + (0) * bj] = a[b + (2) + (1) * bj] = AVG2(I, X);\n        a[b + (0) + (1) * bj] = a[b + (2) + (2) * bj] = AVG2(J, I);\n        a[b + (0) + (2) * bj] = a[b + (2) + (3) * bj] = AVG2(K, J);\n        a[b + (0) + (3) * bj] = AVG2(L, K);\n        a[b + (3) + (0) * bj] = AVG3(A, B, C);\n        a[b + (2) + (0) * bj] = AVG3(X, A, B);\n        a[b + (1) + (0) * bj] = a[b + (3) + (1) * bj] = AVG3(I, X, A);\n        a[b + (1) + (1) * bj] = a[b + (3) + (2) * bj] = AVG3(J, I, X);\n        a[b + (1) + (2) * bj] = a[b + (3) + (3) * bj] = AVG3(K, J, I);\n        a[b + (1) + (3) * bj] = AVG3(L, K, J)\n    };\n\n    function VE8uv(a, b) {\n        var j;\n        for (j = 0; j < 8; ++j) {\n            memcpy(a, b + j * bj, a, b - bj, 8)\n        }\n    };\n\n    function HE8uv(a, b) {\n        var j;\n        for (j = 0; j < 8; ++j) {\n            memset_(a, b + 0, a[b - 1], 8);\n            b += bj\n        }\n    };\n\n    function Put8x8uv(v, a, b) {\n        var j, k;\n        for (j = 0; j < 8; ++j) {\n            for (k = 0; k < 8; ++k) a[b + k + j * bj] = v\n        }\n    };\n\n    function DC8uv(a, b) {\n        var c = 8;\n        var i;\n        for (i = 0; i < 8; ++i) {\n            c += a[b + i - bj] + a[b - 1 + i * bj]\n        }\n        Put8x8uv(((c >> 4) * 0x01), a, b)\n    };\n\n    function DC8uvNoLeft(a, b) {\n        var c = 4;\n        var i;\n        for (i = 0; i < 8; ++i) {\n            c += a[b + i - bj]\n        }\n        Put8x8uv(((c >> 3) * 0x01), a, b)\n    };\n\n    function DC8uvNoTop(a, b) {\n        var c = 4;\n        var i;\n        for (i = 0; i < 8; ++i) {\n            c += a[b - 1 + i * bj]\n        }\n        Put8x8uv(((c >> 3) * 0x01), a, b)\n    };\n\n    function DC8uvNoTopLeft(a, b) {\n        Put8x8uv(0x80, a, b)\n    };\n    var bJ = new Array(function(v, o) {\n        DC4(v, o)\n    }, function(v, o) {\n        TM4(v, o)\n    }, function(v, o) {\n        VE4(v, o)\n    }, function(v, o) {\n        HE4(v, o)\n    }, function(v, o) {\n        RD4(v, o)\n    }, function(v, o) {\n        VR4(v, o)\n    }, function(v, o) {\n        LD4(v, o)\n    }, function(v, o) {\n        VL4(v, o)\n    }, function(v, o) {\n        HD4(v, o)\n    }, function(v, o) {\n        HU4(v, o)\n    });\n    var bK = new Array(function(v, o) {\n        DC16(v, o)\n    }, function(v, o) {\n        TM16(v, o)\n    }, function(v, o) {\n        VE16(v, o)\n    }, function(v, o) {\n        HE16(v, o)\n    }, function(v, o) {\n        DC16NoTop(v, o)\n    }, function(v, o) {\n        DC16NoLeft(v, o)\n    }, function(v, o) {\n        DC16NoTopLeft(v, o)\n    });\n    var bL = new Array(function(v, o) {\n        DC8uv(v, o)\n    }, function(v, o) {\n        TM8uv(v, o)\n    }, function(v, o) {\n        VE8uv(v, o)\n    }, function(v, o) {\n        HE8uv(v, o)\n    }, function(v, o) {\n        DC8uvNoTop(v, o)\n    }, function(v, o) {\n        DC8uvNoLeft(v, o)\n    }, function(v, o) {\n        DC8uvNoTopLeft(v, o)\n    });\n\n    function do_filter2(p, b, c) {\n        var d = p[b - 2 * c],\n            p0 = p[b - c],\n            q0 = p[b + 0],\n            q1 = p[b + c];\n        var a = 3 * (q0 - p0) + bD[1020 + d - q1];\n        var e = bE[112 + ((a + 4) >> 3)];\n        var f = bE[112 + ((a + 3) >> 3)];\n        p[b - c] = bF[255 + p0 + f];\n        p[b + 0] = bF[255 + q0 - e]\n    };\n\n    function do_filter4(p, b, c) {\n        var d = p[b - 2 * c],\n            p0 = p[b - c],\n            q0 = p[b + 0],\n            q1 = p[b + c];\n        var a = 3 * (q0 - p0);\n        var e = bE[112 + ((a + 4) >> 3)];\n        var f = bE[112 + ((a + 3) >> 3)];\n        var g = (e + 1) >> 1;\n        p[b - 2 * c] = bF[255 + d + g];\n        p[b - c] = bF[255 + p0 + f];\n        p[b + 0] = bF[255 + q0 - e];\n        p[b + c] = bF[255 + q1 - g]\n    };\n\n    function do_filter6(p, b, c) {\n        var d = p[b - 3 * c],\n            p1 = p[b - 2 * c],\n            p0 = p[b - c];\n        var e = p[b + 0],\n            q1 = p[b + c],\n            q2 = p[b + 2 * c];\n        var a = bD[1020 + 3 * (e - p0) + bD[1020 + p1 - q1]];\n        var f = (27 * a + 63) >> 7;\n        var g = (18 * a + 63) >> 7;\n        var h = (9 * a + 63) >> 7;\n        p[b - 3 * c] = bF[255 + d + h];\n        p[b - 2 * c] = bF[255 + p1 + g];\n        p[b - c] = bF[255 + p0 + f];\n        p[b + 0] = bF[255 + e - f];\n        p[b + c] = bF[255 + q1 - g];\n        p[b + 2 * c] = bF[255 + q2 - h]\n    };\n\n    function hev(p, a, b, c) {\n        var d = p[a - 2 * b],\n            p0 = p[a - b],\n            q0 = p[a + 0],\n            q1 = p[a + b];\n        return (bB[255 + d - p0] > c) || (bB[255 + q1 - q0] > c)\n    };\n\n    function needs_filter(p, a, b, c) {\n        var d = p[a - 2 * b],\n            p0 = p[a - b],\n            q0 = p[a + 0],\n            q1 = p[a + b];\n        return (2 * bB[255 + p0 - q0] + bC[255 + d - q1]) <= c\n    };\n\n    function needs_filter2(p, a, b, t, c) {\n        var d = p[a - 4 * b],\n            p2 = p[a - 3 * b],\n            p1 = p[a - 2 * b],\n            p0 = p[a - b];\n        var e = p[a + 0],\n            q1 = p[a + b],\n            q2 = p[a + 2 * b],\n            q3 = p[a + 3 * b];\n        if ((2 * bB[255 + p0 - e] + bC[255 + p1 - q1]) > t) return 0;\n        return bB[255 + d - p2] <= c && bB[255 + p2 - p1] <= c && bB[255 + p1 - p0] <= c && bB[255 + q3 - q2] <= c && bB[255 + q2 - q1] <= c && bB[255 + q1 - e] <= c\n    };\n\n    function SimpleVFilter16(p, a, b, c) {\n        var i;\n        for (i = 0; i < 16; ++i) {\n            if (needs_filter(p, a + i, b, c)) {\n                do_filter2(p, a + i, b)\n            }\n        }\n    };\n\n    function SimpleHFilter16(p, a, b, c) {\n        var i;\n        for (i = 0; i < 16; ++i) {\n            if (needs_filter(p, a + i * b, 1, c)) {\n                do_filter2(p, a + i * b, 1)\n            }\n        }\n    };\n\n    function SimpleVFilter16i(p, a, b, c) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4 * b;\n            SimpleVFilter16(p, a + 0, b, c)\n        }\n    };\n\n    function SimpleHFilter16i(p, a, b, c) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4;\n            SimpleHFilter16(p, a + 0, b, c)\n        }\n    };\n\n    function FilterLoop26(p, a, b, c, d, e, f, g) {\n        while (d-- > 0) {\n            if (needs_filter2(p, a + 0, b, e, f)) {\n                if (hev(p, a + 0, b, g)) {\n                    do_filter2(p, a + 0, b)\n                } else {\n                    do_filter6(p, a + 0, b)\n                }\n            }\n            a += c\n        }\n    };\n\n    function FilterLoop24(p, a, b, c, d, e, f, g) {\n        while (d-- > 0) {\n            if (needs_filter2(p, a + 0, b, e, f)) {\n                if (hev(p, a + 0, b, g)) {\n                    do_filter2(p, a + 0, b)\n                } else {\n                    do_filter4(p, a + 0, b)\n                }\n            }\n            a += c\n        }\n    };\n\n    function VFilter16(p, a, b, c, d, e) {\n        FilterLoop26(p, a + 0, b, 1, 16, c, d, e)\n    }\n\n    function HFilter16(p, a, b, c, d, e) {\n        FilterLoop26(p, a + 0, 1, b, 16, c, d, e)\n    };\n\n    function VFilter16i(p, a, b, c, d, e) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4 * b;\n            FilterLoop24(p, a + 0, b, 1, 16, c, d, e)\n        }\n    };\n\n    function HFilter16i(p, a, b, c, d, e) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4;\n            FilterLoop24(p, a + 0, 1, b, 16, c, d, e)\n        }\n    };\n\n    function VFilter8(u, a, v, b, c, d, e, f) {\n        FilterLoop26(u, a, c, 1, 8, d, e, f);\n        FilterLoop26(v, b, c, 1, 8, d, e, f)\n    };\n\n    function HFilter8(u, a, v, b, c, d, e, f) {\n        FilterLoop26(u, a, 1, c, 8, d, e, f);\n        FilterLoop26(v, b, 1, c, 8, d, e, f)\n    };\n\n    function VFilter8i(u, a, v, b, c, d, e, f) {\n        FilterLoop24(u, a + 4 * c, c, 1, 8, d, e, f);\n        FilterLoop24(v, b + 4 * c, c, 1, 8, d, e, f)\n    };\n\n    function HFilter8i(u, a, v, b, c, d, e, f) {\n        FilterLoop24(u, a + 4, 1, c, 8, d, e, f);\n        FilterLoop24(v, b + 4, 1, c, 8, d, e, f)\n    };\n    var bM;\n    var bN;\n    var bO;\n    var bP;\n    var bQ;\n    var bR;\n    var bS;\n    var bT;\n    var bU;\n    var bV;\n    var bW;\n    var bX;\n    var bY;\n    var bZ;\n    var ca;\n    var cb;\n\n    function VP8DspInit(a) {\n        bM = TransformTwo;\n        bN = TransformUV;\n        bO = TransformDC;\n        bP = TransformDCUV;\n        bQ = VFilter16;\n        bR = HFilter16;\n        bS = VFilter8;\n        bT = HFilter8;\n        bU = VFilter16i;\n        bV = HFilter16i;\n        bW = VFilter8i;\n        bX = HFilter8i;\n        bY = SimpleVFilter16;\n        bZ = SimpleHFilter16;\n        ca = SimpleVFilter16i;\n        cb = SimpleHFilter16i\n    };\n    var cc = (32 - 1);\n    var cd = 3;\n    var ce = 1;\n\n    function InitThreadContext(a) {\n        a.cache_id_ = 0;\n        if (a.use_threads_) {\n            var b = a.worker_;\n            if (!WebPWorkerReset(b)) {\n                return VP8SetError(a, VP8_STATUS_OUT_OF_MEMORY, \"thread initialization failed.\")\n            }\n            b.data1 = a;\n            b.data2 = a.thread_ctx_.io_;\n            b.hook = VP8FinishRow;\n            a.num_caches_ = (a.filter_type_ > 0) ? cd : cd - 1\n        } else {\n            a.num_caches_ = ce\n        }\n        return 1\n    }\n    var cf = new Array(0, 2, 8);\n\n    function AllocateMemory(a) {\n        var b = a.num_caches_;\n        var c = a.mb_w_;\n        var d = 4 * c * sizeof(uint8_t);\n        var e = (16 + 8 + 8) * c;\n        var f = (c + 1) * sizeof(bw);\n        var g = (a.filter_type_ > 0) ? c * (a.use_threads_ ? 2 : 1) * sizeof(bv) : 0;\n        var h = bk * sizeof(a.yuv_b_);\n        var i = 384 * sizeof(a.coeffs_);\n        var j = (16 * b + parseInt(cf[a.filter_type_]) * 3 / 2);\n        var k = e * j;\n        var l = a.alpha_data_ ? (a.pic_hdr_.width_ * a.pic_hdr_.height_) : 0;\n        var m = d + e + f + g + h + i + k + l + cc;\n        var n = uint8_t,\n            mem_offset = 0;\n        if (m > a.mem_size_) {\n            a.mem_ = 0;\n            a.mem_size_ = 0;\n            if (a.mem_ == null) {\n                return VP8SetError(a, 'VP8_STATUS_OUT_OF_MEMORY', \"no memory during frame initialization.\")\n            }\n            a.mem_size_ = m\n        }\n        n = a.mem_;\n        a.intra_t_ = 205;\n        a.y_t_ = memset(205, (16 * c) * sizeof(a.y_t_));\n        a.u_t_ = memset(205, (8 * c) * sizeof(a.u_t_));\n        a.v_t_ = memset(205, (8 * c) * sizeof(a.v_t_));\n        a.f_info_ = g ? memset_wl(bv, g) : null;\n        a.f_info_off = g ? 0 : null;\n        a.thread_ctx_.id_ = 0;\n        a.thread_ctx_.f_info_ = a.f_info_;\n        if (a.use_threads_) {\n            a.thread_ctx_.f_info_off += c\n        }\n        assert((h & cc) == 0);\n        a.yuv_b_ = memset(205, h * sizeof(a.yuv_b_));\n        a.coeffs_ = -12851;\n        a.cache_y_stride_ = 16 * c;\n        a.cache_uv_stride_ = 8 * c; {\n            var o = cf[a.filter_type_];\n            var p = o * a.cache_y_stride_;\n            var q = (o / 2) * a.cache_uv_stride_;\n            a.cache_y_ = Arr(k, 205);\n            a.cache_y_off = +p;\n            a.cache_u_ = a.cache_y_;\n            a.cache_u_off = a.cache_y_off + 16 * b * a.cache_y_stride_ + q;\n            a.cache_v_ = a.cache_u_;\n            a.cache_v_off = a.cache_u_off + 8 * b * a.cache_uv_stride_ + q\n        }\n        a.alpha_plane_ = l ? Arr(l, uint8_t) : null;\n        a.mb_info_ = memset_wl(bw, f);\n        a.intra_t_ = memset(bh, d);\n        return 1\n    }\n\n    function InitIo(a, b) {\n        b.width = a.pic_hdr_.width_;\n        b.height = a.pic_hdr_.height_;\n        b.mb_y = 0;\n        b.y = a.cache_y_;\n        b.y_off = a.cache_y_off;\n        b.u = a.cache_u_;\n        b.u_off = a.cache_u_off;\n        b.v = a.cache_v_;\n        b.v_off = a.cache_v_off;\n        b.y_stride = a.cache_y_stride_;\n        b.uv_stride = a.cache_uv_stride_;\n        b.fancy_upsampling = 0;\n        b.a = null;\n        b.a_off = null\n    }\n\n    function VP8InitFrame(a, b) {\n        if (!InitThreadContext(a)) return 0;\n        if (!AllocateMemory(a)) return 0;\n        InitIo(a, b);\n        VP8DspInitTables();\n        VP8DspInit();\n        return 1\n    }\n\n    function hev_thresh_from_level(a, b) {\n        if (b) {\n            return (a >= 40) ? 2 : (a >= 15) ? 1 : 0\n        } else {\n            return (a >= 40) ? 3 : (a >= 20) ? 2 : (a >= 15) ? 1 : 0\n        }\n    }\n\n    function DoFilter(a, b, c) {\n        var d = a.thread_ctx_;\n        var e = a.cache_y_stride_;\n        var f = d.f_info_[1 + b];\n        var g = a.cache_y_;\n        var h = a.cache_y_off + d.id_ * 16 * e + b * 16;\n        var i = f.f_level_;\n        var j = f.f_ilevel_;\n        var k = 2 * i + j;\n        if (i == 0) {\n            return\n        }\n        if (a.filter_type_ == 1) {\n            if (b > 0) {\n                bZ(g, h, e, k + 4)\n            }\n            if (f.f_inner_) {\n                cb(g, h, e, k)\n            }\n            if (c > 0) {\n                bY(g, h, e, k + 4)\n            }\n            if (f.f_inner_) {\n                ca(g, h, e, k)\n            }\n        } else {\n            var l = a.cache_uv_stride_;\n            var m = a.cache_u_;\n            var n = a.cache_u_off + d.id_ * 8 * l + b * 8;\n            var o = a.cache_v_;\n            var p = a.cache_v_off + d.id_ * 8 * l + b * 8;\n            var q = hev_thresh_from_level(i, a.frm_hdr_.key_frame_);\n            if (b > 0) {\n                bR(g, h, e, k + 4, j, q);\n                bT(m, n, o, p, l, k + 4, j, q)\n            }\n            if (f.f_inner_) {\n                bV(g, h, e, k, j, q);\n                bX(m, n, o, p, l, k, j, q)\n            }\n            if (c > 0) {\n                bQ(g, h, e, k + 4, j, q);\n                bS(m, n, o, p, l, k + 4, j, q)\n            }\n            if (f.f_inner_) {\n                bU(g, h, e, k, j, q);\n                bW(m, n, o, p, l, k, j, q)\n            }\n        }\n    }\n\n    function FilterRow(a) {\n        var b = int;\n        var c = a.thread_ctx_.mb_y_;\n        assert(a.thread_ctx_.filter_row_);\n        for (b = a.tl_mb_x_; b < a.br_mb_x_; ++b) {\n            DoFilter(a, b, c)\n        }\n    }\n\n    function VP8StoreBlock(a) {\n        if (a.filter_type_ > 0) {\n            var b = a.f_info_[1 + a.mb_x_];\n            var c = a.mb_info_[1 + a.mb_x_].skip_;\n            var d = a.filter_levels_[a.segment_];\n            if (a.filter_hdr_.use_lf_delta_) {\n                d += a.filter_hdr_.ref_lf_delta_[0];\n                if (a.is_i4x4_) {\n                    d += a.filter_hdr_.mode_lf_delta_[0]\n                }\n            }\n            d = (d < 0) ? 0 : (d > 63) ? 63 : d;\n            b.f_level_ = d;\n            if (a.filter_hdr_.sharpness_ > 0) {\n                if (a.filter_hdr_.sharpness_ > 4) {\n                    d >>= 2\n                } else {\n                    d >>= 1\n                }\n                if (d > 9 - a.filter_hdr_.sharpness_) {\n                    d = 9 - a.filter_hdr_.sharpness_\n                }\n            }\n            b.f_ilevel_ = (d < 1) ? 1 : d;\n            b.f_inner_ = (!c || a.is_i4x4_) + 0\n        } {\n            var y;\n            var e = a.cache_id_ * 16 * a.cache_y_stride_;\n            var f = a.cache_id_ * 8 * a.cache_uv_stride_;\n            var g = a.cache_y_;\n            var h = a.cache_y_off + a.mb_x_ * 16 + e;\n            var i = a.cache_u_;\n            var j = a.cache_u_off + a.mb_x_ * 8 + f;\n            var k = a.cache_v_;\n            var l = a.cache_v_off + a.mb_x_ * 8 + f;\n            for (y = 0; y < 16; ++y) {\n                memcpy(g, h + y * a.cache_y_stride_, a.yuv_b_, +bm + y * bj, 16)\n            }\n            for (y = 0; y < 8; ++y) {\n                memcpy(i, j + y * a.cache_uv_stride_, a.yuv_b_, +bn + y * bj, 8);\n                memcpy(k, l + y * a.cache_uv_stride_, a.yuv_b_, +bo + y * bj, 8)\n            }\n        }\n    }\n\n    function MACROBLOCK_VPOS(a) {\n        return ((a) * 16)\n    }\n\n    function VP8FinishRow(a, b) {\n        var c = 1;\n        var d = a.thread_ctx_;\n        var e = cf[a.filter_type_];\n        var f = e * a.cache_y_stride_;\n        var g = parseInt(e / 2) * a.cache_uv_stride_;\n        var h = d.id_ * 16 * a.cache_y_stride_;\n        var i = d.id_ * 8 * a.cache_uv_stride_;\n        var j = a.cache_y_;\n        var k = a.cache_y_off - f + h;\n        var l = a.cache_u_;\n        var m = a.cache_u_off - g + i;\n        var n = a.cache_v_;\n        var o = a.cache_v_off - g + i;\n        var p = (d.mb_y_ == 0);\n        var q = (d.mb_y_ >= a.mb_h_ - 1) + 0;\n        var r = MACROBLOCK_VPOS(d.mb_y_);\n        var s = MACROBLOCK_VPOS(d.mb_y_ + 1);\n        if (d.filter_row_) {\n            FilterRow(a)\n        }\n        if (b.put) {\n            if (!p) {\n                r -= e;\n                b.y = j;\n                b.y_off = k;\n                b.u = l;\n                b.u_off = m;\n                b.v = n;\n                b.v_off = o\n            } else {\n                b.y = a.cache_y_;\n                b.y_off = a.cache_y_off + h;\n                b.u = a.cache_u_;\n                b.u_off = a.cache_u_off + i;\n                b.v = a.cache_v_;\n                b.v_off = a.cache_v_off + i\n            }\n            if (!q) {\n                s -= e\n            }\n            if (s > b.crop_bottom) {\n                s = b.crop_bottom\n            }\n            if (a.alpha_data_) {\n                if (r == 0) {\n                    b.a = VP8DecompressAlphaRows(a, r, s - r);\n                    b.a_off = 0\n                } else {\n                    b.a_off = VP8DecompressAlphaRows(a, r, s - r)\n                }\n                if (b.a == null) {\n                    return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, \"Could not decode alpha data.\")\n                }\n            }\n            if (r < b.crop_top) {\n                var t = b.crop_top - r;\n                r = b.crop_top;\n                assert(!(t & 1));\n                b.y_off += a.cache_y_stride_ * t;\n                b.u_off += a.cache_uv_stride_ * (t >> 1);\n                b.v_off += a.cache_uv_stride_ * (t >> 1);\n                if (b.a) {\n                    b.a_off += b.width * t\n                }\n            }\n            if (r < s) {\n                b.y_off += b.crop_left;\n                b.u_off += b.crop_left >> 1;\n                b.v_off += b.crop_left >> 1;\n                if (b.a) {\n                    b.a_off += b.crop_left\n                }\n                b.mb_y = r - b.crop_top;\n                b.mb_w = b.crop_right - b.crop_left;\n                b.mb_h = s - r;\n                c = b.put(b)\n            }\n        }\n        if (d.id_ + 1 == a.num_caches_) {\n            if (!q) {\n                memcpy(a.cache_y_, a.cache_y_off - f, j, k + 16 * a.cache_y_stride_, f);\n                memcpy(a.cache_u_, a.cache_u_off - g, l, m + 8 * a.cache_uv_stride_, g);\n                memcpy(a.cache_v_, a.cache_v_off - g, n, o + 8 * a.cache_uv_stride_, g)\n            }\n        }\n        return c\n    }\n\n    function VP8ProcessRow(a, b) {\n        var c = 1;\n        var d = a.thread_ctx_;\n        if (!a.use_threads_) {\n            d.mb_y_ = a.mb_y_;\n            d.filter_row_ = a.filter_row_;\n            c = VP8FinishRow(a, b)\n        } else {\n            var e = a.worker_;\n            c &= WebPWorkerSync(e);\n            assert(e.status_ == OK);\n            if (c) {\n                d.io_ = b;\n                d.id_ = a.cache_id_;\n                d.mb_y_ = a.mb_y_;\n                d.filter_row_ = a.filter_row_;\n                if (d.filter_row_) {\n                    var f = d.f_info_;\n                    d.f_info_ = a.f_info_;\n                    a.f_info_ = f\n                }\n                WebPWorkerLaunch(e);\n                if (++a.cache_id_ == a.num_caches_) {\n                    a.cache_id_ = 0\n                }\n            }\n        }\n        return c\n    }\n\n    function VP8EnterCritical(a, b) {\n        if (b.setup && !b.setup(b)) {\n            VP8SetError(a, VP8_STATUS_USER_ABORT, \"Frame setup failed\");\n            return a.status_\n        }\n        if (b.bypass_filtering) {\n            a.filter_type_ = 0\n        } {\n            var c = cf[a.filter_type_];\n            if (a.filter_type_ == 2) {\n                a.tl_mb_x_ = 0;\n                a.tl_mb_y_ = 0\n            } else {\n                a.tl_mb_y_ = b.crop_top >> 4;\n                a.tl_mb_x_ = b.crop_left >> 4\n            }\n            a.br_mb_y_ = (b.crop_bottom + 15 + c) >> 4;\n            a.br_mb_x_ = (b.crop_right + 15 + c) >> 4;\n            if (a.br_mb_x_ > a.mb_w_) {\n                a.br_mb_x_ = a.mb_w_\n            }\n            if (a.br_mb_y_ > a.mb_h_) {\n                a.br_mb_y_ = a.mb_h_\n            }\n        }\n        return T\n    }\n\n    function VP8ExitCritical(a, b) {\n        var c = 1;\n        if (a.use_threads_) {\n            c = WebPWorkerSync(a.worker_)\n        }\n        if (b.teardown) {\n            b.teardown(b)\n        }\n        return c\n    }\n    var cg = new Array(0 + 0 * bj, 4 + 0 * bj, 8 + 0 * bj, 12 + 0 * bj, 0 + 4 * bj, 4 + 4 * bj, 8 + 4 * bj, 12 + 4 * bj, 0 + 8 * bj, 4 + 8 * bj, 8 + 8 * bj, 12 + 8 * bj, 0 + 12 * bj, 4 + 12 * bj, 8 + 12 * bj, 12 + 12 * bj);\n\n    function CheckMode(a, b) {\n        if (b == bh) {\n            if (a.mb_x_ == 0) {\n                return (a.mb_y_ == 0) ? B_DC_PRED_NOTOPLEFT : B_DC_PRED_NOLEFT\n            } else {\n                return (a.mb_y_ == 0) ? B_DC_PRED_NOTOP : bh\n            }\n        }\n        return b\n    }\n\n    function Copy32b(a, b, c, d) {\n        for (i = 0; i < 4; ++i) a[b + i] = c[d + i]\n    }\n\n    function VP8ReconstructBlock(a) {\n        var b = a.yuv_b_;\n        var c = bm;\n        var d = a.yuv_b_;\n        var e = bn;\n        var f = a.yuv_b_;\n        var g = bo;\n        if (a.mb_x_ > 0) {\n            var j;\n            for (j = -1; j < 16; ++j) {\n                Copy32b(b, (c + j * bj - 4), b, (c + j * bj + 12))\n            }\n            for (j = -1; j < 8; ++j) {\n                Copy32b(d, (e + j * bj - 4), d, (e + j * bj + 4));\n                Copy32b(f, (g + j * bj - 4), f, (g + j * bj + 4))\n            }\n        } else {\n            var j;\n            for (j = 0; j < 16; ++j) {\n                b[c + j * bj - 1] = 129\n            }\n            for (j = 0; j < 8; ++j) {\n                d[e + j * bj - 1] = 129;\n                f[g + j * bj - 1] = 129\n            }\n            if (a.mb_y_ > 0) {\n                b[c - 1 - bj] = d[e - 1 - bj] = f[g - 1 - bj] = 129\n            }\n        } {\n            var h = a.y_t_;\n            var k = +a.mb_x_ * 16;\n            var l = a.u_t_;\n            var m = +a.mb_x_ * 8;\n            var o = a.v_t_;\n            var p = +a.mb_x_ * 8;\n            var q = a.coeffs_;\n            var n;\n            if (a.mb_y_ > 0) {\n                memcpy(b, c - bj, h, k, 16);\n                memcpy(d, e - bj, l, m, 8);\n                memcpy(f, g - bj, o, p, 8)\n            } else if (a.mb_x_ == 0) {\n                for (i = 0; i < (16 + 4 + 1); ++i) b[c - bj - 1 + i] = 127;\n                for (i = 0; i < (8 + 1); ++i) d[e - bj - 1 + i] = 127;\n                for (i = 0; i < (8 + 1); ++i) f[g - bj - 1 + i] = 127\n            }\n            if (a.is_i4x4_) {\n                var r = b;\n                var s = c - bj + 16;\n                if (a.mb_y_ > 0) {\n                    if (a.mb_x_ >= a.mb_w_ - 1) {\n                        r[s + 0] = r[s + 1] = r[s + 2] = r[s + 3] = h[k + 15]\n                    } else {\n                        memcpy(r, s + 0, h, k + 16, 4)\n                    }\n                }\n                for (ii = 0; ii < 4; ++ii) r[ii + s + bj * 4] = r[ii + s + 1 * bj * 4] = r[ii + s + 2 * bj * 4] = r[ii + s + 3 * bj * 4] = r[ii + s + 0 * 4];\n                for (n = 0; n < 16; n++) {\n                    var t = b;\n                    var u = c + cg[n];\n                    bJ[a.imodes_[n]](t, u);\n                    if (a.non_zero_ac_ & (1 << n)) {\n                        bM(q, +n * 16, t, u, 0)\n                    } else if (a.non_zero_ & (1 << n)) {\n                        bO(q, +n * 16, t, u)\n                    }\n                }\n            } else {\n                var v = CheckMode(a, a.imodes_[0]);\n                bK[v](b, c);\n                if (a.non_zero_) {\n                    for (n = 0; n < 16; n++) {\n                        var t = b;\n                        var u = c + cg[n];\n                        if (a.non_zero_ac_ & (1 << n)) {\n                            bM(q, +n * 16, t, u, 0)\n                        } else if (a.non_zero_ & (1 << n)) {\n                            bO(q, +n * 16, t, u)\n                        }\n                    }\n                }\n            } {\n                var v = CheckMode(a, a.uvmode_);\n                bL[v](d, e);\n                bL[v](f, g);\n                if (a.non_zero_ & 0x0f0000) {\n                    var w = a.coeffs_;\n                    var x = 16 * 16;\n                    if (a.non_zero_ac_ & 0x0f0000) {\n                        bN(w, x, d, e)\n                    } else {\n                        bP(w, x, d, e)\n                    }\n                }\n                if (a.non_zero_ & 0xf00000) {\n                    var y = a.coeffs_;\n                    var x = 20 * 16;\n                    if (a.non_zero_ac_ & 0xf00000) {\n                        bN(y, x, f, g)\n                    } else {\n                        bP(y, x, f, g)\n                    }\n                }\n                if (a.mb_y_ < (a.mb_h_ - 1)) {\n                    memcpy(h, k, b, c + 15 * bj, 16);\n                    memcpy(l, m, d, e + 7 * bj, 8);\n                    memcpy(o, p, f, g + 7 * bj, 8)\n                }\n            }\n        }\n    }\n\n    function clip(v, M) {\n        return v < 0 ? 0 : v > M ? M : v\n    }\n    var ci = new Array(4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157);\n    var cj = new Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284);\n\n    function VP8ParseQuant(a) {\n        var b = a.br_;\n        var c = VP8GetValue(b, 7);\n        var d = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;\n        var e = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;\n        var f = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;\n        var g = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;\n        var h = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;\n        var j = a.segment_hdr_;\n        var i = int;\n        for (i = 0; i < NUM_MB_SEGMENTS; ++i) {\n            var q = int;\n            if (j.use_segment_) {\n                q = j.quantizer_[i];\n                if (!j.absolute_delta_) {\n                    q += c\n                }\n            } else {\n                if (i > 0) {\n                    a.dqm_[i] = a.dqm_[0];\n                    continue\n                } else {\n                    q = c\n                }\n            } {\n                var m = a.dqm_[i];\n                m.y1_mat_[0] = ci[clip(q + d, 127)];\n                m.y1_mat_[1] = cj[clip(q + 0, 127)];\n                m.y2_mat_[0] = ci[clip(q + e, 127)] * 2;\n                m.y2_mat_[1] = parseInt(cj[clip(q + f, 127)] * 155 / 100);\n                if (m.y2_mat_[1] < 8) m.y2_mat_[1] = 8;\n                m.uv_mat_[0] = ci[clip(q + g, 117)];\n                m.uv_mat_[1] = cj[clip(q + h, 127)]\n            }\n        }\n    }\n    var ck = new Array(-bh, 1, -B_TM_PRED, 2, -B_VE_PRED, 3, 4, 6, -B_HE_PRED, 5, -B_RD_PRED, -B_VR_PRED, -B_LD_PRED, 7, -B_VL_PRED, 8, -B_HD_PRED, -B_HU_PRED);\n    var cl = new Array(new Array(new Array(new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128), new Array(189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128), new Array(106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128)), new Array(new Array(1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128), new Array(181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128), new Array(78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128)), new Array(new Array(1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128), new Array(184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128), new Array(77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128)), new Array(new Array(1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128), new Array(170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128), new Array(37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128)), new Array(new Array(1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128), new Array(207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128), new Array(102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128)), new Array(new Array(1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128), new Array(177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128), new Array(80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128)), new Array(new Array(1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128))), new Array(new Array(new Array(198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62), new Array(131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1), new Array(68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128)), new Array(new Array(1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128), new Array(184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128), new Array(81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128)), new Array(new Array(1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128), new Array(99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128), new Array(23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128)), new Array(new Array(1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128), new Array(109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128), new Array(44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128)), new Array(new Array(1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128), new Array(94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128), new Array(22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128)), new Array(new Array(1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128), new Array(124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128), new Array(35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128)), new Array(new Array(1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128), new Array(121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128), new Array(45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128)), new Array(new Array(1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128), new Array(203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128), new Array(137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128))), new Array(new Array(new Array(253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128), new Array(175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128), new Array(73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128)), new Array(new Array(1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128), new Array(239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128), new Array(155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128)), new Array(new Array(1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128), new Array(201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128), new Array(69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128)), new Array(new Array(1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128), new Array(223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128), new Array(141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128)), new Array(new Array(1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128), new Array(190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128), new Array(149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128), new Array(213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128), new Array(55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128))), new Array(new Array(new Array(202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255), new Array(126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128), new Array(61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128)), new Array(new Array(1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128), new Array(166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128), new Array(39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128)), new Array(new Array(1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128), new Array(124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128), new Array(24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128)), new Array(new Array(1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128), new Array(149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128), new Array(28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128)), new Array(new Array(1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128), new Array(123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128), new Array(20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128)), new Array(new Array(1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128), new Array(168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128), new Array(47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128)), new Array(new Array(1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128), new Array(141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128), new Array(42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128)), new Array(new Array(1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128))));\n    var cm = new Array(new Array(new Array(231, 120, 48, 89, 115, 113, 120, 152, 112), new Array(152, 179, 64, 126, 170, 118, 46, 70, 95), new Array(175, 69, 143, 80, 85, 82, 72, 155, 103), new Array(56, 58, 10, 171, 218, 189, 17, 13, 152), new Array(114, 26, 17, 163, 44, 195, 21, 10, 173), new Array(121, 24, 80, 195, 26, 62, 44, 64, 85), new Array(144, 71, 10, 38, 171, 213, 144, 34, 26), new Array(170, 46, 55, 19, 136, 160, 33, 206, 71), new Array(63, 20, 8, 114, 114, 208, 12, 9, 226), new Array(81, 40, 11, 96, 182, 84, 29, 16, 36)), new Array(new Array(134, 183, 89, 137, 98, 101, 106, 165, 148), new Array(72, 187, 100, 130, 157, 111, 32, 75, 80), new Array(66, 102, 167, 99, 74, 62, 40, 234, 128), new Array(41, 53, 9, 178, 241, 141, 26, 8, 107), new Array(74, 43, 26, 146, 73, 166, 49, 23, 157), new Array(65, 38, 105, 160, 51, 52, 31, 115, 128), new Array(104, 79, 12, 27, 217, 255, 87, 17, 7), new Array(87, 68, 71, 44, 114, 51, 15, 186, 23), new Array(47, 41, 14, 110, 182, 183, 21, 17, 194), new Array(66, 45, 25, 102, 197, 189, 23, 18, 22)), new Array(new Array(88, 88, 147, 150, 42, 46, 45, 196, 205), new Array(43, 97, 183, 117, 85, 38, 35, 179, 61), new Array(39, 53, 200, 87, 26, 21, 43, 232, 171), new Array(56, 34, 51, 104, 114, 102, 29, 93, 77), new Array(39, 28, 85, 171, 58, 165, 90, 98, 64), new Array(34, 22, 116, 206, 23, 34, 43, 166, 73), new Array(107, 54, 32, 26, 51, 1, 81, 43, 31), new Array(68, 25, 106, 22, 64, 171, 36, 225, 114), new Array(34, 19, 21, 102, 132, 188, 16, 76, 124), new Array(62, 18, 78, 95, 85, 57, 50, 48, 51)), new Array(new Array(193, 101, 35, 159, 215, 111, 89, 46, 111), new Array(60, 148, 31, 172, 219, 228, 21, 18, 111), new Array(112, 113, 77, 85, 179, 255, 38, 120, 114), new Array(40, 42, 1, 196, 245, 209, 10, 25, 109), new Array(88, 43, 29, 140, 166, 213, 37, 43, 154), new Array(61, 63, 30, 155, 67, 45, 68, 1, 209), new Array(100, 80, 8, 43, 154, 1, 51, 26, 71), new Array(142, 78, 78, 16, 255, 128, 34, 197, 171), new Array(41, 40, 5, 102, 211, 183, 4, 1, 221), new Array(51, 50, 17, 168, 209, 192, 23, 25, 82)), new Array(new Array(138, 31, 36, 171, 27, 166, 38, 44, 229), new Array(67, 87, 58, 169, 82, 115, 26, 59, 179), new Array(63, 59, 90, 180, 59, 166, 93, 73, 154), new Array(40, 40, 21, 116, 143, 209, 34, 39, 175), new Array(47, 15, 16, 183, 34, 223, 49, 45, 183), new Array(46, 17, 33, 183, 6, 98, 15, 32, 183), new Array(57, 46, 22, 24, 128, 1, 54, 17, 37), new Array(65, 32, 73, 115, 28, 128, 23, 128, 205), new Array(40, 3, 9, 115, 51, 192, 18, 6, 223), new Array(87, 37, 9, 115, 59, 77, 64, 21, 47)), new Array(new Array(104, 55, 44, 218, 9, 54, 53, 130, 226), new Array(64, 90, 70, 205, 40, 41, 23, 26, 57), new Array(54, 57, 112, 184, 5, 41, 38, 166, 213), new Array(30, 34, 26, 133, 152, 116, 10, 32, 134), new Array(39, 19, 53, 221, 26, 114, 32, 73, 255), new Array(31, 9, 65, 234, 2, 15, 1, 118, 73), new Array(75, 32, 12, 51, 192, 255, 160, 43, 51), new Array(88, 31, 35, 67, 102, 85, 55, 186, 85), new Array(56, 21, 23, 111, 59, 205, 45, 37, 192), new Array(55, 38, 70, 124, 73, 102, 1, 34, 98)), new Array(new Array(125, 98, 42, 88, 104, 85, 117, 175, 82), new Array(95, 84, 53, 89, 128, 100, 113, 101, 45), new Array(75, 79, 123, 47, 51, 128, 81, 171, 1), new Array(57, 17, 5, 71, 102, 57, 53, 41, 49), new Array(38, 33, 13, 121, 57, 73, 26, 1, 85), new Array(41, 10, 67, 138, 77, 110, 90, 47, 114), new Array(115, 21, 2, 10, 102, 255, 166, 23, 6), new Array(101, 29, 16, 10, 85, 128, 101, 196, 26), new Array(57, 18, 10, 102, 102, 213, 34, 20, 43), new Array(117, 20, 15, 36, 163, 128, 68, 1, 26)), new Array(new Array(102, 61, 71, 37, 34, 53, 31, 243, 192), new Array(69, 60, 71, 38, 73, 119, 28, 222, 37), new Array(68, 45, 128, 34, 1, 47, 11, 245, 171), new Array(62, 17, 19, 70, 146, 85, 55, 62, 70), new Array(37, 43, 37, 154, 100, 163, 85, 160, 1), new Array(63, 9, 92, 136, 28, 64, 32, 201, 85), new Array(75, 15, 9, 9, 64, 255, 184, 119, 16), new Array(86, 6, 28, 5, 64, 255, 25, 248, 1), new Array(56, 8, 17, 132, 137, 255, 55, 116, 128), new Array(58, 15, 20, 82, 135, 57, 26, 121, 40)), new Array(new Array(164, 50, 31, 137, 154, 133, 25, 35, 218), new Array(51, 103, 44, 131, 131, 123, 31, 6, 158), new Array(86, 40, 64, 135, 148, 224, 45, 183, 128), new Array(22, 26, 17, 131, 240, 154, 14, 1, 209), new Array(45, 16, 21, 91, 64, 222, 7, 1, 197), new Array(56, 21, 39, 155, 60, 138, 23, 102, 213), new Array(83, 12, 13, 54, 192, 255, 68, 47, 28), new Array(85, 26, 85, 85, 128, 128, 32, 146, 171), new Array(18, 11, 7, 63, 144, 171, 4, 4, 246), new Array(35, 27, 10, 146, 174, 171, 12, 26, 128)), new Array(new Array(190, 80, 35, 99, 180, 80, 126, 54, 45), new Array(85, 126, 47, 87, 176, 51, 41, 20, 32), new Array(101, 75, 128, 139, 118, 146, 116, 128, 85), new Array(56, 41, 15, 176, 236, 85, 37, 9, 62), new Array(71, 30, 17, 119, 118, 255, 17, 18, 138), new Array(101, 38, 60, 138, 55, 70, 43, 26, 142), new Array(146, 36, 19, 30, 171, 255, 97, 27, 20), new Array(138, 45, 61, 62, 219, 1, 81, 188, 64), new Array(32, 41, 20, 117, 151, 142, 20, 21, 163), new Array(112, 19, 12, 61, 195, 128, 48, 4, 24)));\n\n    function VP8ResetProba(a) {\n        for (i = 0; i < a.segments_.length; ++i) a.segments_[i] = 255;\n        a.coeffs_ = newObjectIt(cl)\n    }\n\n    function VP8ParseIntraMode(a, b) {\n        var c = b.intra_t_;\n        c[c.length - 1] = 0 + 4 * b.mb_x_;\n        var d = b.intra_l_;\n        b.is_i4x4_ = !VP8GetBit(a, 145);\n        if (!b.is_i4x4_) {\n            var e = VP8GetBit(a, 156) ? (VP8GetBit(a, 128) ? TM_PRED : H_PRED) : (VP8GetBit(a, 163) ? V_PRED : DC_PRED);\n            b.imodes_[0] = e;\n            for (i = 0; i < 4; ++i) c[i + c[c.length - 1]] = e;\n            for (i = 0; i < 4; ++i) d[i] = e\n        } else {\n            var f = b.imodes_;\n            var g = 0;\n            var y;\n            for (y = 0; y < 4; ++y) {\n                var e = d[y];\n                var x;\n                for (x = 0; x < 4; ++x) {\n                    var h = cm[c[c[c.length - 1] + x]][e];\n                    var i = 0;\n                    do {\n                        i = ck[2 * i + VP8GetBit(a, h[i])]\n                    } while (i > 0);\n                    e = -i;\n                    c[c[c.length - 1] + x] = e;\n                    f[g] = e;\n                    g++\n                }\n                d[y] = e\n            }\n        }\n        b.uvmode_ = !VP8GetBit(a, 142) ? DC_PRED : !VP8GetBit(a, 114) ? V_PRED : VP8GetBit(a, 183) ? TM_PRED : H_PRED\n    }\n    var cn = new Array(new Array(new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255), new Array(250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255), new Array(234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255), new Array(251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255), new Array(248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))));\n\n    function VP8ParseProba(a, d) {\n        var e = d.proba_;\n        var t, b, c, p;\n        for (t = 0; t < NUM_TYPES; ++t) {\n            for (b = 0; b < NUM_BANDS; ++b) {\n                for (c = 0; c < NUM_CTX; ++c) {\n                    for (p = 0; p < NUM_PROBAS; ++p) {\n                        if (VP8GetBit(a, cn[t][b][c][p])) {\n                            e.coeffs_[t][b][c][p] = VP8GetValue(a, 8)\n                        }\n                    }\n                }\n            }\n        }\n        d.use_skip_proba_ = VP8Get(a);\n        if (d.use_skip_proba_) {\n            d.skip_p_ = VP8GetValue(a, 8)\n        }\n    }\n    var co = 12;\n    var cp = 20;\n    this.WebPGetDecoderVersion = function(a) {\n        return (be << 16) | (bf << 8) | bg\n    };\n\n    function SetOk(a) {\n        a.status_ = 'VP8_STATUS_OK';\n        a.error_msg_ = \"OK\"\n    }\n    var cq;\n\n    function VP8InitIoInternal(a, b) {\n        if (b != N) {\n            alert('mismatch error');\n            return 0\n        }\n        if (a) {}\n        return 1\n    }\n    var cr;\n\n    function VP8New(a) {\n        var b = newObjectIt(bz);\n        if (b) {\n            SetOk(b);\n            b.ready_ = 0\n        }\n        return b\n    }\n\n    function VP8Delete(a) {\n        if (a) {\n            VP8Clear(a);\n            a = 0\n        }\n    }\n\n    function VP8SetError(a, b, c) {\n        a.status_ = b;\n        a.error_msg_ = c;\n        a.ready_ = 0;\n        alert(b + ': ' + c);\n        return 0\n    }\n\n    function get_le32(a, b) {\n        return a[b + 0] | (a[b + 1] << 8) | (a[b + 2] << 16) | (a[b + 3] << 24)\n    }\n\n    function VP8CheckAndSkipHeader(a, b, c, d, e, f) {\n        if (!a || !c || !d || !e) {\n            return 0\n        }\n        if (c.value >= 8) {\n            if (!memcmp(a, b.value, \"VP8 \", 4)) {\n                d.value = 1;\n                e.value = get_le32(a, b.value + 4);\n                if ((f.value >= co) && (e.value > f.value - co)) {\n                    return 0\n                }\n                b.value += 8;\n                c.value -= 8\n            } else {\n                d.value = 0;\n                e.value = 0\n            }\n        } else {\n            d.value = -1;\n            e.value = 0\n        }\n        return 1\n    }\n\n    function VP8GetInfo(a, b, c, d, e, f, g) {\n        if (c.value < 10) {\n            return 0\n        }\n        if (a[b.value + 3] != 0x9d || a[b.value + 4] != 0x01 || a[b.value + 5] != 0x2a) {\n            return 0\n        } else {\n            var i = a[b.value + 0] | (a[b.value + 1] << 8) | (a[b.value + 2] << 16);\n            var j = !(i & 1) + 0;\n            var w = ((a[b.value + 7] << 8) | a[b.value + 6]) & 0x3fff;\n            var h = ((a[b.value + 9] << 8) | a[b.value + 8]) & 0x3fff;\n            if (g) {\n                if (c.value < 11) return 0;\n                g.value = !!(a[b.value + 10] & 0x80)\n            }\n            if (!j) {\n                return 0\n            }\n            if (((i >> 1) & 7) > 3) {\n                return 0\n            }\n            if (!((i >> 4) & 1)) {\n                return 0\n            }\n            if (((i >> 5)) >= d) {\n                return 0\n            }\n            if (e) {\n                e.value = w\n            }\n            if (f) {\n                f.value = h\n            }\n            return 1\n        }\n    }\n\n    function VP8XGetInfo(a, b, c, d, e, f, g) {\n        if (!a || !c || !d) {\n            return 0\n        }\n        if (c.value >= cp) {\n            if (!memcmp(a, b.value, \"VP8X\", 4)) {\n                var h = get_le32(a, b.value + 4);\n                d.value = 1;\n                if (h.value != (cp - 8)) {\n                    return 0\n                }\n                if (g) {\n                    g.value = get_le32(a, b.value + 8)\n                }\n                if (e) {\n                    e.value = get_le32(a, b.value + 12)\n                }\n                if (f) {\n                    f.value = get_le32(a, b.value + 16)\n                }\n                b.value += cp;\n                c.value -= cp\n            } else {\n                d.value = 0\n            }\n        } else {\n            d.value = -1\n        }\n        return 1\n    }\n\n    function ResetSegmentHeader(a) {\n        assert(a);\n        a.use_segment_ = 0;\n        a.update_map_ = 0;\n        a.absolute_delta_ = 1;\n        for (i = 0; i < a.quantizer_.length; ++i) a.quantizer_[i] = 0;\n        for (i = 0; i < a.filter_strength_.length; ++i) a.filter_strength_[i] = 0\n    }\n\n    function ParseSegmentHeader(a, b, c) {\n        assert(a);\n        assert(b);\n        b.use_segment_ = VP8Get(a);\n        if (b.use_segment_) {\n            b.update_map_ = VP8Get(a);\n            if (VP8Get(a)) {\n                var s;\n                b.absolute_delta_ = VP8Get(a);\n                for (s = 0; s < NUM_MB_SEGMENTS; ++s) {\n                    b.quantizer_[s] = VP8Get(a) ? VP8GetSignedValue(a, 7) : 0\n                }\n                for (s = 0; s < NUM_MB_SEGMENTS; ++s) {\n                    b.filter_strength_[s] = VP8Get(a) ? VP8GetSignedValue(a, 6) : 0\n                }\n            }\n            if (b.update_map_) {\n                var s;\n                for (s = 0; s < bi; ++s) {\n                    c.segments_[s] = VP8Get(a) ? VP8GetValue(a, 8) : 255\n                }\n            }\n        } else {\n            b.update_map_ = 0\n        }\n        return !a.eof_\n    }\n\n    function ParsePartitions(a, b, c, d) {\n        var e = a.br_;\n        var f = b;\n        var g = c;\n        var h = b,\n            buf_end_off = c + d;\n        var i;\n        var j = 0;\n        var k = int;\n        var p = int;\n        a.num_parts_ = 1 << VP8GetValue(e, 2);\n        k = a.num_parts_ - 1;\n        i = b;\n        var j = c + k * 3;\n        if (buf_end_off < j) {\n            return 'VP8_STATUS_NOT_ENOUGH_DATA'\n        }\n        for (p = 0; p < k; ++p) {\n            var l = f[g + 0] | (f[g + 1] << 8) | (f[g + 2] << 16);\n            var m = i;\n            var n = j + l;\n            if (n > buf_end_off) m = h;\n            VP8InitBitReader(a.parts_[+p], i, j, n);\n            i = m;\n            j = n;\n            g += 3\n        }\n        VP8InitBitReader(a.parts_[+k], i, j, buf_end_off);\n        return (j < buf_end_off) ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED'\n    }\n\n    function ParseFilterHeader(a, b) {\n        var c = b.filter_hdr_;\n        c.simple_ = VP8Get(a);\n        c.level_ = VP8GetValue(a, 6);\n        c.sharpness_ = VP8GetValue(a, 3);\n        c.use_lf_delta_ = VP8Get(a);\n        if (c.use_lf_delta_) {\n            if (VP8Get(a)) {\n                var i;\n                for (i = 0; i < NUM_REF_LF_DELTAS; ++i) {\n                    if (VP8Get(a)) {\n                        c.ref_lf_delta_[i] = VP8GetSignedValue(a, 6)\n                    }\n                }\n                for (i = 0; i < NUM_MODE_LF_DELTAS; ++i) {\n                    if (VP8Get(a)) {\n                        c.mode_lf_delta_[i] = VP8GetSignedValue(a, 6)\n                    }\n                }\n            }\n        }\n        b.filter_type_ = (c.level_ == 0) ? 0 : c.simple_ ? 1 : 2;\n        if (b.filter_type_ > 0) {\n            if (b.segment_hdr_.use_segment_) {\n                var s;\n                for (s = 0; s < NUM_MB_SEGMENTS; ++s) {\n                    var d = b.segment_hdr_.filter_strength_[s];\n                    if (!b.segment_hdr_.absolute_delta_) {\n                        d += c.level_\n                    }\n                    b.filter_levels_[s] = d\n                }\n            } else {\n                b.filter_levels_[0] = c.level_\n            }\n        }\n        return !a.eof_\n    }\n    var cs, buf, buf_size;\n    var ct;\n\n    function VP8GetHeaders(a, b) {\n        var c = {\n            value: 0\n        };\n        var d = uint8_t;\n        var e = {\n            value: uint32_t\n        };\n        var f = {\n            value: uint32_t\n        };\n        var g = {\n            value: uint32_t\n        };\n        var h = {\n            value: 0\n        };\n        var i = {\n            value: 0\n        };\n        var j = newObjectIt(bp);\n        var k = newObjectIt(bq);\n        var l = newObjectIt(bb);\n        var m = 'VP8StatusCode';\n        if (a == null) {\n            alert('(dec == null)');\n            return 0\n        }\n        SetOk(a);\n        if (b == null) {\n            return VP8SetError(a, 'VP8_STATUS_INVALID_PARAM', \"null VP8Io passed to VP8GetHeaders()\")\n        }\n        d = b.data;\n        c.value = b.data_off;\n        e.value = b.data_size;\n        if (d == null || e.value <= 4) {\n            return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', \"Not enough data to parse frame header\")\n        }\n        if (!WebPCheckAndSkipRIFFHeader(d, c, e, f)) {\n            return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, \"RIFF: Invalid RIFF container\")\n        }\n        if (!VP8XGetInfo(d, c, e, h, null, null, null)) {\n            return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, \"RIFF: Invalid VP8X container\")\n        }\n        if (!VP8CheckAndSkipHeader(d, c, e, i, g, f)) {\n            return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, \"RIFF: Inconsistent size information.\")\n        }\n        if (i.value == -1) {\n            return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', \"RIFF: Inconsistent size information.\")\n        }\n        if (e.value < 4) {\n            return VP8SetError(a, VP8_STATUS_NOT_ENOUGH_DATA, \"RIFF: Truncated header.\")\n        }\n        c = c.value;\n        e = e.value; {\n            var n = d[c + 0] | (d[c + 1] << 8) | (d[c + 2] << 16);\n            j = a.frm_hdr_;\n            j.key_frame_ = !(n & 1) + 0;\n            j.profile_ = (n >> 1) & 7;\n            j.show_ = (n >> 4) & 1;\n            j.partition_length_ = (n >> 5);\n            if (j.profile_ > 3) return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', \"Incorrect keyframe parameters.\");\n            if (!j.show_) return VP8SetError(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', \"Frame not displayable.\");\n            c += 3;\n            e -= 3\n        }\n        k = a.pic_hdr_;\n        if (j.key_frame_) {\n            if (e < 7) {\n                return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', \"cannot parse picture header\")\n            }\n            if (Byte2Hex(d[c + 0]) != 0x9d || Byte2Hex(d[c + 1]) != 0x01 || Byte2Hex(d[c + 2]) != 0x2a) {\n                return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', \"Bad code word\")\n            }\n            k.width_ = ((d[c + 4] << 8) | d[c + 3]) & 0x3fff;\n            k.xscale_ = d[c + 4] >> 6;\n            k.height_ = ((d[c + 6] << 8) | d[c + 5]) & 0x3fff;\n            k.yscale_ = d[c + 6] >> 6;\n            c += 7;\n            e -= 7;\n            a.mb_w_ = (k.width_ + 15) >> 4;\n            a.mb_h_ = (k.height_ + 15) >> 4;\n            b.width = k.width_;\n            b.height = k.height_;\n            b.use_scaling = 0;\n            b.use_cropping = 0;\n            b.crop_top = 0;\n            b.crop_left = 0;\n            b.crop_right = b.width;\n            b.crop_bottom = b.height;\n            b.mb_w = b.width;\n            b.mb_h = b.height;\n            VP8ResetProba(a.proba_);\n            ResetSegmentHeader(a.segment_hdr_);\n            a.segment_ = 0\n        }\n        if (j.partition_length_ > e) {\n            return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', \"bad partition length\")\n        }\n        a.alpha_data_ = null;\n        a.alpha_data_size_ = 0;\n        var l = a.br_;\n        VP8InitBitReader(l, d, c, c + j.partition_length_);\n        c += j.partition_length_;\n        e -= j.partition_length_;\n        if (j.key_frame_) {\n            k.colorspace_ = VP8Get(l);\n            k.clamp_type_ = VP8Get(l)\n        }\n        if (!ParseSegmentHeader(l, a.segment_hdr_, a.proba_)) {\n            return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', \"cannot parse segment header\")\n        }\n        if (!ParseFilterHeader(l, a)) {\n            return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', \"cannot parse filter header\")\n        }\n        m = ParsePartitions(a, d, c, e);\n        if (m != 'VP8_STATUS_OK') {\n            return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', \"cannot parse partitions\")\n        }\n        VP8ParseQuant(a);\n        if (!j.key_frame_) {\n            return VP8SetError(a, VP8_STATUS_UNSUPPORTED_FEATURE, \"Not a key frame.\")\n        } else {\n            a.buffer_flags_ = 0x003 | 0x100\n        }\n        VP8Get(l);\n        VP8ParseProba(l, a);\n        if (a.pic_hdr_.colorspace_) {\n            var o = 8;\n            var p = 0x01;\n            var q = d;\n            ext_buf_off = c - o;\n            var r = size_t;\n            if (j.partition_length_ < o || q[ext_buf_off + o - 1] != p) {}\n            r = (q[ext_buf_off + 4] << 0) | (q[ext_buf_off + 5] << 8) | (q[ext_buf_off + 6] << 16);\n            if (j.partition_length_ < r + o) {\n                return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, \"RIFF: Inconsistent extra information.\")\n            }\n            a.alpha_data_ = (r > 0) ? q : null;\n            a.alpha_data_off = (r > 0) ? ext_buf_off - r : null;\n            a.alpha_data_size_ = r;\n            r = (q[ext_buf_off + 0] << 0) | (q[ext_buf_off + 1] << 8) | (q[ext_buf_off + 2] << 16);\n            a.layer_data_size_ = r;\n            a.layer_data_ = null;\n            a.layer_colorspace_ = q[ext_buf_off + 3]\n        }\n        a.ready_ = 1;\n        return 1\n    }\n    var cu = new Array(0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0);\n    var cv = new Array(173, 148, 140, 0);\n    var cw = new Array(176, 155, 140, 135, 0);\n    var cx = new Array(180, 157, 141, 134, 130, 0);\n    var cy = new Array(254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0);\n    var cz = new Array(cv, cw, cx, cy);\n    var cA = new Array(0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15);\n    var cB = ArrM(new Array(NUM_CTX, NUM_PROBAS), '');\n\n    function GetCoeffs(a, b, c, d, n, e) {\n        var p = b[cu[n]][c];\n        if (!VP8GetBit(a, p[0])) {\n            return 0\n        }\n        while (1) {\n            ++n;\n            if (!VP8GetBit(a, p[1])) {\n                p = b[cu[n]][0]\n            } else {\n                var v, j;\n                if (!VP8GetBit(a, p[2])) {\n                    p = b[cu[n]][1];\n                    v = 1\n                } else {\n                    if (!VP8GetBit(a, p[3])) {\n                        if (!VP8GetBit(a, p[4])) {\n                            v = 2\n                        } else {\n                            v = 3 + VP8GetBit(a, p[5])\n                        }\n                    } else {\n                        if (!VP8GetBit(a, p[6])) {\n                            if (!VP8GetBit(a, p[7])) {\n                                v = 5 + VP8GetBit(a, 159)\n                            } else {\n                                v = 7 + 2 * VP8GetBit(a, 165);\n                                v += VP8GetBit(a, 145)\n                            }\n                        } else {\n                            var f = uint8_t;\n                            var g = VP8GetBit(a, p[8]);\n                            var h = VP8GetBit(a, p[9 + g]);\n                            var k = 2 * g + h;\n                            v = 0;\n                            f = cz[k];\n                            var l;\n                            for (i = 0; i < (f.length - 1); ++i) {\n                                v += v + VP8GetBit(a, f[i])\n                            }\n                            v += 3 + (8 << k)\n                        }\n                    }\n                    p = b[cu[n]][2]\n                }\n                j = cA[n - 1];\n                e[e[e.length - 1] + j] = VP8GetSigned(a, v) * d[((j > 0) + 0)];\n                if (n == 16 || !VP8GetBit(a, p[0])) {\n                    return n\n                }\n            }\n            if (n == 16) {\n                return 16\n            }\n        }\n    }\n    var cC = {\n        i8: Arr(4, uint8_t),\n        i32: uint32_t\n    };\n    var cD = new Array(new Array(0, 0, 0, 0), new Array(1, 0, 0, 0), new Array(0, 1, 0, 0), new Array(1, 1, 0, 0), new Array(0, 0, 1, 0), new Array(1, 0, 1, 0), new Array(0, 1, 1, 0), new Array(1, 1, 1, 0), new Array(0, 0, 0, 1), new Array(1, 0, 0, 1), new Array(0, 1, 0, 1), new Array(1, 1, 0, 1), new Array(0, 0, 1, 1), new Array(1, 0, 1, 1), new Array(0, 1, 1, 1), new Array(1, 1, 1, 1));\n    var cE = 0x08040201;\n\n    function PACK(X, S) {\n        return ((((X[0] * 0x1000000 + X[1] * 0x10000 + X[2] * 0x100 + X[3] * 0x1) * cE) & 0xff000000) >> (S))\n    }\n\n    function ParseResiduals(a, b, c) {\n        var d, out_l_nz, first;\n        var e = cB;\n        var q = a.dqm_[a.segment_];\n        var f = a.coeffs_;\n        var g = a.mb_info_[1 - 1];\n        var h = Arr(4, 0),\n            nz_dc = Arr(4, 0);\n        var i = Arr(4, 0),\n            lnz = Arr(4, 0);\n        var j = 0;\n        var k = 0;\n        var x, y, ch;\n        f = memset(0, 384 * sizeof(f));\n        if (!a.is_i4x4_) {\n            var m = Arr(16, 0);\n            var n = b.dc_nz_ + g.dc_nz_;\n            b.dc_nz_ = g.dc_nz_ = (GetCoeffs(c, a.proba_.coeffs_[1], n, q.y2_mat_, 0, m) > 0) + 0;\n            first = 1;\n            e = a.proba_.coeffs_[0];\n            VP8TransformWHT(m, f);\n            f[f.length - 1] = 0\n        } else {\n            first = 0;\n            e = a.proba_.coeffs_[3]\n        }\n        i = ArrCopy(cD[b.nz_ & 0xf]);\n        lnz = ArrCopy(cD[g.nz_ & 0xf]);\n        for (y = 0; y < 4; ++y) {\n            var l = lnz[y];\n            for (x = 0; x < 4; ++x) {\n                var n = l + i[x];\n                var o = GetCoeffs(c, e, n, q.y1_mat_, first, f);\n                i[x] = l = (o > 0) + 0;\n                nz_dc[x] = ((f[f[f.length - 1] + 0] != 0) + 0);\n                h[x] = (o > 1) + 0;\n                f[f.length - 1] += 16\n            }\n            lnz[y] = l;\n            k |= PACK(nz_dc, 24 - y * 4);\n            j |= PACK(h, 24 - y * 4)\n        }\n        d = PACK(i, 24);\n        out_l_nz = PACK(lnz, 24);\n        i = ArrCopy(cD[b.nz_ >> 4]);\n        lnz = ArrCopy(cD[g.nz_ >> 4]);\n        for (ch = 0; ch < 4; ch += 2) {\n            for (y = 0; y < 2; ++y) {\n                var l = lnz[ch + y];\n                for (x = 0; x < 2; ++x) {\n                    var n = l + i[ch + x];\n                    var o = GetCoeffs(c, a.proba_.coeffs_[2], n, q.uv_mat_, 0, f);\n                    i[ch + x] = l = (o > 0) + 0;\n                    nz_dc[y * 2 + x] = ((f[f[f.length - 1] + 0] != 0) + 0);\n                    h[y * 2 + x] = (o > 1) + 0;\n                    f[f.length - 1] += 16\n                }\n                lnz[ch + y] = l\n            }\n            k |= PACK(nz_dc, 8 - ch * 2);\n            j |= PACK(h, 8 - ch * 2)\n        }\n        d |= PACK(i, 20);\n        out_l_nz |= PACK(lnz, 20);\n        b.nz_ = d;\n        g.nz_ = out_l_nz;\n        a.coeffs_ = f;\n        a.non_zero_ac_ = j + 0;\n        a.non_zero_ = j | k;\n        b.skip_ = (!a.non_zero_) + 0\n    }\n    var cF;\n\n    function VP8DecodeMB(a, b) {\n        var c = a.br_;\n        var d = a.mb_info_[1 - 1];\n        var e = a.mb_info_[1 + a.mb_x_];\n        if (a.segment_hdr_.update_map_) {\n            a.segment_ = !VP8GetBit(c, a.proba_.segments_[0]) ? 0 + VP8GetBit(c, a.proba_.segments_[1]) : 2 + VP8GetBit(c, a.proba_.segments_[2])\n        }\n        e.skip_ = a.use_skip_proba_ ? VP8GetBit(c, a.skip_p_) : 0;\n        VP8ParseIntraMode(c, a);\n        if (c.eof_) {\n            return 0\n        }\n        if (!e.skip_) {\n            ParseResiduals(a, e, b)\n        } else {\n            d.nz_ = e.nz_ = 0;\n            if (!a.is_i4x4_) {\n                d.dc_nz_ = e.dc_nz_ = 0\n            }\n            a.non_zero_ = 0;\n            a.non_zero_ac_ = 0\n        }\n        return (!b.eof_)\n    }\n\n    function VP8InitScanline(a) {\n        var b = a.mb_info_[1 - 1];\n        b.nz_ = 0;\n        b.dc_nz_ = 0;\n        memset_(a.intra_l_, 0, bh, a.intra_l_.length);\n        a.filter_row_ = ((a.filter_type_ > 0) && (a.mb_y_ >= a.tl_mb_y_) && (a.mb_y_ <= a.br_mb_y_)) + 0\n    }\n    var cG;\n\n    function ParseFrame(a, b) {\n        for (a.mb_y_ = 0; a.mb_y_ < a.br_mb_y_; ++a.mb_y_) {\n            cG = a.parts_[a.mb_y_ & (a.num_parts_ - 1)];\n            VP8InitScanline(a);\n            for (a.mb_x_ = 0; a.mb_x_ < a.mb_w_; a.mb_x_++) {\n                if (!VP8DecodeMB(a, cG)) {\n                    return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', \"Premature end-of-file encountered.\" + a.mb_x_ + ' ' + a.mb_y_)\n                }\n                VP8ReconstructBlock(a);\n                VP8StoreBlock(a)\n            }\n            if (!VP8ProcessRow(a, b)) {\n                return VP8SetError(a, 'VP8_STATUS_USER_ABORT', \"Output aborted.\")\n            }\n        }\n        if (a.use_threads_ && !WebPWorkerSync(a.worker_)) {\n            return 0\n        }\n        if (a.layer_data_size_ > 0) {\n            if (!VP8DecodeLayer(a)) {\n                return 0\n            }\n        }\n        return 1\n    }\n\n    function VP8Decode(a, b) {\n        var c = 0;\n        if (a == null) {\n            return 0\n        }\n        if (b == null) {\n            return VP8SetError(a, 'VP8_STATUS_INVALID_PARAM', \"NULL VP8Io parameter in VP8Decode().\")\n        }\n        if (!a.ready_) {\n            if (!VP8GetHeaders(a, b)) {\n                return 0\n            }\n        }\n        assert(a.ready_);\n        c = (VP8EnterCritical(a, b) == T);\n        if (c) {\n            if (c) c = VP8InitFrame(a, b);\n            if (c) c = ParseFrame(a, b);\n            c &= VP8ExitCritical(a, b)\n        }\n        if (!c) {\n            VP8Clear(a);\n            return 0\n        }\n        a.ready_ = 0;\n        return 1\n    }\n\n    function VP8Clear(a) {\n        if (a == null) {\n            return\n        }\n        if (a.use_threads_) {\n            WebPWorkerEnd(a.worker_)\n        }\n        if (a.mem_) {\n            a.mem_ = 0\n        }\n        a.mem_ = null;\n        a.mem_size_ = 0;\n        a.ready_ = 0\n    }\n    var cH = 16,\n        YUV_RANGE_MIN = -227,\n        YUV_RANGE_MAX = 256 + 226;\n\n    function VP8YuvToRgb(y, u, v, a, b) {\n        var c = cJ[v];\n        var d = (cK[v] + VP8kUToG[u]) >> cH;\n        var e = VP8kUToB[u];\n        a[b + 0] = cL[y + c - YUV_RANGE_MIN];\n        a[b + 1] = cL[y + d - YUV_RANGE_MIN];\n        a[b + 2] = cL[y + e - YUV_RANGE_MIN]\n    }\n\n    function VP8YuvToRgb565(y, u, v, a, b) {\n        var c = cJ[v];\n        var d = (cK[v] + VP8kUToG[u]) >> cH;\n        var e = VP8kUToB[u];\n        a[b + 0] = ((cL[y + c - YUV_RANGE_MIN] & 0xf8) | (cL[y + d - YUV_RANGE_MIN] >> 5));\n        a[b + 1] = (((cL[y + d - YUV_RANGE_MIN] << 3) & 0xe0) | (cL[y + e - YUV_RANGE_MIN] >> 3))\n    }\n\n    function VP8YuvToArgbKeepA(y, u, v, a, b) {\n        VP8YuvToRgb(y, u, v, a, b + 1)\n    }\n\n    function VP8YuvToArgb(y, u, v, a, b) {\n        a[b + 0] = 0xff;\n        VP8YuvToArgbKeepA(y, u, v, a, b)\n    }\n\n    function VP8YuvToRgba4444KeepA(y, u, v, a, b) {\n        var c = cJ[v];\n        var d = (cK[v] + VP8kUToG[u]) >> cH;\n        var e = VP8kUToB[u];\n        a[b + 0] = ((cM[y + c - YUV_RANGE_MIN] << 4) | cM[y + d - YUV_RANGE_MIN]);\n        a[b + 1] = ((a[b + 1] << 44) | (cM[y + e - YUV_RANGE_MIN] << 4))\n    }\n\n    function VP8YuvToRgba4444(y, u, v, a, b) {\n        a[b + 1] = 0x0f;\n        VP8YuvToRgba4444KeepA(y, u, v, a, b)\n    }\n\n    function VP8YuvToBgr(y, u, v, a, b) {\n        var c = cJ[v];\n        var d = (cK[v] + VP8kUToG[u]) >> cH;\n        var e = VP8kUToB[u];\n        a[b + 0] = cL[y + e - YUV_RANGE_MIN];\n        a[b + 1] = cL[y + d - YUV_RANGE_MIN];\n        a[b + 2] = cL[y + c - YUV_RANGE_MIN]\n    }\n\n    function VP8YuvToBgra(y, u, v, a, b) {\n        VP8YuvToBgr(y, u, v, a, b);\n        a[b + 3] = 0xff\n    }\n\n    function VP8YuvToRgba(y, u, v, a, b) {\n        VP8YuvToRgb(y, u, v, a, b);\n        a[b + 3] = 0xff\n    }\n    var cI = (1 << (cH - 1));\n    var cJ = Arr(256, int16_t),\n        VP8kUToB = Arr(256, int16_t);\n    var cK = Arr(256, int32_t),\n        VP8kUToG = Arr(256, int32_t);\n    var cL = Arr(YUV_RANGE_MAX - YUV_RANGE_MIN, uint8_t);\n    var cM = Arr(YUV_RANGE_MAX - YUV_RANGE_MIN, uint8_t);\n    var cN = 0;\n\n    function clip(v, a) {\n        return v < 0 ? 0 : v > a ? a : v\n    }\n\n    function VP8YUVInit(a) {\n        var i;\n        if (cN) {\n            return\n        }\n        for (i = 0; i < 256; ++i) {\n            cJ[i] = (89858 * (i - 128) + cI) >> cH;\n            VP8kUToG[i] = -22014 * (i - 128) + cI;\n            cK[i] = -45773 * (i - 128);\n            VP8kUToB[i] = (113618 * (i - 128) + cI) >> cH\n        }\n        for (i = YUV_RANGE_MIN; i < YUV_RANGE_MAX; ++i) {\n            var k = ((i - 16) * 76283 + cI) >> cH;\n            cL[i - YUV_RANGE_MIN] = clip(k, 255);\n            cM[i - YUV_RANGE_MIN] = clip((k + 8) >> 4, 15)\n        }\n        cN = 1\n    }\n\n    function LOAD_UV(u, v) {\n        return ((u) | ((v) << 16))\n    }\n\n    function FUNC_NAME(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) {\n        var x;\n        var t = (q - 1) >> 1;\n        var u = LOAD_UV(e[f + 0], g[h + 0]);\n        var v = LOAD_UV(i[j + 0], k[l + 0]);\n        if (a) {\n            var w = (3 * u + v + 0x00020002) >> 2;\n            r(a[b + 0], w & 0xff, (w >> 16), m, n)\n        }\n        if (c) {\n            var w = (3 * v + u + 0x00020002) >> 2;\n            r(c[d + 0], w & 0xff, (w >> 16), o, p)\n        }\n        for (x = 1; x <= t; ++x) {\n            var y = LOAD_UV(e[f + x], g[h + x]);\n            var z = LOAD_UV(i[j + x], k[l + x]);\n            var A = u + y + v + z + 0x00080008;\n            var B = (A + 2 * (y + v)) >> 3;\n            var C = (A + 2 * (u + z)) >> 3;\n            if (a) {\n                var w = (B + u) >> 1;\n                var D = (C + y) >> 1;\n                r(a[b + 2 * x - 1], w & 0xff, (w >> 16), m, n + (2 * x - 1) * s);\n                r(a[b + 2 * x - 0], D & 0xff, (D >> 16), m, n + (2 * x - 0) * s)\n            }\n            if (c) {\n                var w = (C + v) >> 1;\n                var D = (B + z) >> 1;\n                r(c[d + 2 * x - 1], w & 0xff, (w >> 16), o, p + (2 * x - 1) * s);\n                r(c[d + 2 * x + 0], D & 0xff, (D >> 16), o, p + (2 * x + 0) * s)\n            }\n            u = y;\n            v = z\n        }\n        if (!(q & 1)) {\n            if (a) {\n                var w = (3 * u + v + 0x00020002) >> 2;\n                r(a[b + q - 1], w & 0xff, (w >> 16), m, n + (q - 1) * s)\n            }\n            if (c) {\n                var w = (3 * v + u + 0x00020002) >> 2;\n                r(c[d + q - 1], w & 0xff, (w >> 16), o, p + (q - 1) * s)\n            }\n        }\n    }\n\n    function UpsampleRgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgb, 3)\n    }\n\n    function UpsampleBgrLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToBgr, 3)\n    }\n\n    function UpsampleRgbaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgba, 4)\n    }\n\n    function UpsampleBgraLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToBgra, 4)\n    }\n\n    function UpsampleArgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToArgb, 4)\n    }\n\n    function UpsampleRgba4444LinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgba4444, 2)\n    }\n\n    function UpsampleRgb565LinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgb565, 2)\n    }\n\n    function UpsampleRgbKeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgb, 4)\n    }\n\n    function UpsampleBgrKeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToBgr, 4)\n    }\n\n    function UpsampleArgbKeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToArgbKeepA, 4)\n    }\n\n    function UpsampleRgba4444KeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {\n        FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgba4444KeepA, 2)\n    }\n    var cO = new Array(MODE_LAST);\n    var cP = new Array(MODE_LAST);\n\n    function InitUpsamplers(a) {\n        cO[O] = UpsampleRgbLinePair;\n        cO[MODE_RGBA] = UpsampleRgbaLinePair;\n        cO[MODE_BGR] = UpsampleBgrLinePair;\n        cO[MODE_BGRA] = UpsampleBgraLinePair;\n        cO[MODE_ARGB] = UpsampleArgbLinePair;\n        cO[MODE_RGBA_4444] = UpsampleRgba4444LinePair;\n        cO[MODE_RGB_565] = UpsampleRgb565LinePair;\n        cP[O] = UpsampleRgbLinePair;\n        cP[MODE_RGBA] = UpsampleRgbKeepAlphaLinePair;\n        cP[MODE_BGR] = UpsampleBgrLinePair;\n        cP[MODE_BGRA] = UpsampleBgrKeepAlphaLinePair;\n        cP[MODE_ARGB] = UpsampleArgbKeepAlphaLinePair;\n        cP[MODE_RGBA_4444] = UpsampleRgba4444KeepAlphaLinePair;\n        cP[MODE_RGB_565] = UpsampleRgb565LinePair\n    }\n\n    function FUNC_NAME_SAMPLE(a, b, c, d, u, e, v, f, g, h, j, k, l, m, n) {\n        var i;\n        for (i = 0; i < l - 1; i += 2) {\n            m(a[b + 0], u[e + 0], v[f + 0], g, h);\n            m(a[b + 1], u[e + 0], v[f + 0], g, h + n);\n            m(c[d + 0], u[e + 0], v[f + 0], j, k);\n            m(c[d + 1], u[e + 0], v[f + 0], j, k + n);\n            b += 2;\n            d += 2;\n            e++;\n            f++;\n            h += 2 * n;\n            k += 2 * n\n        }\n        if (i == l - 1) {\n            m(a[b + 0], u[e + 0], v[f + 0], g, h);\n            m(c[d + 0], u[e + 0], v[f + 0], j, k)\n        }\n    }\n\n    function SampleRgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {\n        FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgb, 3)\n    }\n\n    function SampleBgrLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {\n        FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToBgr, 3)\n    }\n\n    function SampleRgbaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {\n        FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgba, 4)\n    }\n\n    function SampleBgraLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {\n        FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToBgra, 4)\n    }\n\n    function SampleArgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {\n        FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToArgb, 4)\n    }\n\n    function SampleRgba4444LinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {\n        FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgba4444, 2)\n    }\n\n    function SampleRgb565LinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {\n        FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgb565, 2)\n    }\n    var cQ = new Array(SampleRgbLinePair, SampleRgbaLinePair, SampleBgrLinePair, SampleBgraLinePair, SampleArgbLinePair, SampleRgba4444LinePair, SampleRgb565LinePair);\n\n    function FUNC_NAME_YUV444(y, a, u, b, v, c, d, e, f, g, h) {\n        var i;\n        for (i = 0; i < f; ++i) g(y[a + i], u[b + i], v[c + i], d[e + i * h], 0)\n    }\n\n    function Yuv444ToRgb(A, a, B, b, C, c, D, d, l) {\n        FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgb, 3)\n    }\n\n    function Yuv444ToBgr(A, a, B, b, C, c, D, d, l) {\n        FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToBgr, 3)\n    }\n\n    function Yuv444ToRgba(A, a, B, b, C, c, D, d, l) {\n        FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgba, 4)\n    }\n\n    function Yuv444ToBgra(A, a, B, b, C, c, D, d, l) {\n        FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToBgra, 4)\n    }\n\n    function Yuv444ToArgb(A, a, B, b, C, c, D, d, l) {\n        FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToArgb, 4)\n    }\n\n    function Yuv444ToRgba4444(A, a, B, b, C, c, D, d, l) {\n        FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgba4444, 2)\n    }\n\n    function Yuv444ToRgb565(A, a, B, b, C, c, D, d, l) {\n        FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgb565, 2)\n    }\n    var cR = new Array(Yuv444ToRgb, Yuv444ToRgba, Yuv444ToBgr, Yuv444ToBgra, Yuv444ToArgb, Yuv444ToRgba4444, Yuv444ToRgb565);\n\n    function EmitYUV(a, p) {\n        var b = p.output;\n        var c = b.u.YUVA;\n        var d = c.y;\n        var e = c.y_off + a.mb_y * c.y_stride;\n        var f = c.u;\n        var g = c.u_off + (a.mb_y >> 1) * c.u_stride;\n        var h = c.v;\n        var i = c.v_off + (a.mb_y >> 1) * c.v_stride;\n        var k = a.mb_w;\n        var l = a.mb_h;\n        var m = parseInt((k + 1) / 2);\n        var j;\n        for (j = 0; j < l; ++j) {\n            memcpy(d, e + j * c.y_stride, a.y, a.y_off + j * a.y_stride, k)\n        }\n        for (j = 0; j < (l + 1) / 2; ++j) {\n            memcpy(f, g + j * c.u_stride, a.u, a.u_off + j * a.uv_stride, m);\n            memcpy(h, i + j * c.v_stride, a.v, a.v_off + j * a.uv_stride, m)\n        }\n        return a.mb_h\n    }\n\n    function EmitSampledRGB(a, p) {\n        var b = p.output;\n        var c = b.u.RGBA;\n        var d = c.rgba;\n        var e = c.rgba_off + a.mb_y * c.stride;\n        var f = a.y;\n        var g = a.y_off;\n        var h = a.u;\n        var i = a.u_off;\n        var k = a.v;\n        var l = a.v_off;\n        var m = cQ[b.colorspace];\n        var n = a.mb_w;\n        var o = a.mb_h - 1;\n        var j;\n        for (j = 0; j < o; j += 2) {\n            m(f, g, f, g + a.y_stride, h, i, k, l, d, e, d, e + c.stride, n);\n            g += 2 * a.y_stride;\n            i += a.uv_stride;\n            l += a.uv_stride;\n            e += 2 * c.stride\n        }\n        if (j == o) {\n            m(f, g, f, g, h, i, k, l, d, e, d, e, n)\n        }\n        return a.mb_h\n    }\n\n    function EmitFancyRGB(a, p) {\n        var b = a.mb_h;\n        var c = p.output.u.RGBA;\n        var d = c.rgba;\n        var e = c.rgba_off + a.mb_y * c.stride;\n        var f = a.a ? cP[p.output.colorspace] : cO[p.output.colorspace];\n        var g = a.y;\n        var h = a.y_off;\n        var i = a.u;\n        var j = a.u_off;\n        var k = a.v;\n        var l = a.v_off;\n        var m = p.tmp_u;\n        var n = p.tmp_u_off;\n        var o = p.tmp_v;\n        var q = p.tmp_v_off;\n        var y = a.mb_y;\n        var r = a.mb_y + a.mb_h;\n        var s = a.mb_w;\n        var t = parseInt((s + 1) / 2);\n        if (y == 0) {\n            f(null, null, g, h, i, j, k, l, i, j, k, l, null, null, d, e, s)\n        } else {\n            f(p.tmp_y, p.tmp_y_off, g, h, m, n, o, q, i, j, k, l, d, e - c.stride, d, e, s);\n            b++\n        }\n        for (; y + 2 < r; y += 2) {\n            m = i;\n            n = j;\n            o = k;\n            q = l;\n            j += a.uv_stride;\n            l += a.uv_stride;\n            e += 2 * c.stride;\n            h += 2 * a.y_stride;\n            f(g, h - a.y_stride, g, h, m, n, o, q, i, j, k, l, d, e - c.stride, d, e, s)\n        }\n        h += a.y_stride;\n        if (a.crop_top + r < a.crop_bottom) {\n            memcpy(p.tmp_y, p.tmp_y_off, g, h, s * sizeof(p.tmp_y));\n            memcpy(p.tmp_u, p.tmp_u_off, i, j, t * sizeof(p.tmp_u));\n            memcpy(p.tmp_v, p.tmp_v_off, k, l, t * sizeof(p.tmp_v));\n            b--\n        } else {\n            if (!(r & 1)) {\n                f(g, h, null, null, i, j, k, l, i, j, k, l, d, e + c.stride, null, null, s)\n            }\n        }\n        return b\n    }\n\n    function EmitAlphaYUV(a, p) {\n        var b = a.mb_w;\n        var c = a.mb_h;\n        var j;\n        var d = p.output.u.YUVA;\n        var e = d.a;\n        var f = d.a_off + a.mb_y * d.a_stride;\n        var g = a.a;\n        var h = a.a_off;\n        if (g != null) {\n            for (j = 0; j < c; ++j) {\n                memcpy(e, f, g, h, b * sizeof(e));\n                h += a.width;\n                f += d.a_stride\n            }\n        }\n        return 0\n    }\n\n    function EmitAlphaRGB(a, p) {\n        var b = p.output.colorspace;\n        var c = b == MODE_ARGB ? 0 : (b == MODE_RGBA_4444 ? 1 : 3);\n        var d = b == MODE_RGBA_4444 ? 2 : 4;\n        var e = a.mb_w;\n        var f = a.mb_h;\n        var i, j;\n        var g = p.output.u.RGBA;\n        var h = g.rgba;\n        var k = g.rgba_off + a.mb_y * g.stride;\n        var l = a.a;\n        var m = a.a_off;\n        if (l != null) {\n            for (j = 0; j < f; ++j) {\n                for (i = 0; i < e; ++i) {\n                    h[k + d * i + c] = l[m + i]\n                }\n                m += a.width;\n                k += g.stride\n            }\n        }\n        return 0\n    }\n    var cS = 30;\n\n    function MULT(x, y) {\n        return (((x) * (y) + (1 << (cS - 1))) >> cS)\n    }\n\n    function InitRescaler(a, b, c, d, e, f, g, h, i, j, k, l, m, n) {\n        a.x_expand = (b < f) + 0;\n        a.src_width = b;\n        a.src_height = c;\n        a.dst_width = f;\n        a.dst_height = g;\n        a.dst = d;\n        a.dst_off = e;\n        a.dst_stride = h;\n        a.x_add = a.x_expand ? (j - 1) : i - j;\n        a.x_sub = a.x_expand ? (i - 1) : j;\n        a.y_accum = k;\n        a.y_add = k;\n        a.y_sub = l;\n        a.fx_scale = parseInt((1 << cS) / j);\n        a.fy_scale = parseInt((1 << cS) / l);\n        a.fxy_scale = a.x_expand ? parseInt(int64BitLeft(g, cS)) / (j * c) : parseInt(int64BitLeft(g, cS)) / (i * c);\n        a.irow = m;\n        a.irow_off = 0 * 4;\n        a.frow = m;\n        a.frow_off = n + f * 4\n    }\n\n    function ImportRow(a, b, c) {\n        var d = 0;\n        var e = int;\n        var f = 0;\n        if (!c.x_expand) {\n            var g = 0;\n            for (e = 0; e < c.dst_width; ++e) {\n                f += c.x_add;\n                for (; f > 0; f -= c.x_sub) {\n                    g += a[b + (d++)]\n                } {\n                    var h = a[b + (d++)];\n                    var i = h * (-f);\n                    write32BitIn4Bytes(c.frow, c.frow_off + e * 4, ((g + h) * c.x_sub - i));\n                    g = MULT(i, c.fx_scale)\n                }\n            }\n        } else {\n            var j = a[b + 0],\n                right = a[b + 0];\n            for (e = 0; e < c.dst_width; ++e) {\n                if (f < 0) {\n                    j = right;\n                    right = a[b + (++d)];\n                    f += c.x_add\n                }\n                write32BitIn4Bytes(c.frow, c.frow_off + e * 4, (right * c.x_add + (j - right) * f));\n                f -= c.x_sub\n            }\n        }\n        for (e = 0; e < c.dst_width; ++e) {\n            write32BitIn4Bytes(c.irow, c.irow_off + e * 4, (write4BytesIn32Bit(c.frow, c.frow_off + e * 4) + write4BytesIn32Bit(c.irow, c.irow_off + e * 4)))\n        }\n    }\n\n    function ExportRow(a) {\n        var b = int;\n        var c = a.fy_scale * (-a.y_accum);\n        assert(a.y_accum <= 0);\n        for (b = 0; b < a.dst_width; ++b) {\n            var d = MULT(write4BytesIn32Bit(a.frow, a.frow_off + b * 4), c);\n            var v = MULT(write4BytesIn32Bit(a.irow, a.irow_off + b * 4) - d, a.fxy_scale);\n            a.dst[a.dst_off + b] = (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255;\n            write32BitIn4Bytes(a.irow, a.irow_off + b * 4, d)\n        }\n        a.y_accum += a.y_add;\n        a.dst_off += a.dst_stride\n    }\n\n    function Rescale(a, b, c, d, e) {\n        var f = 0;\n        while (d-- > 0) {\n            ImportRow(a, e);\n            b += c;\n            e.y_accum -= e.y_sub;\n            while (e.y_accum <= 0) {\n                ExportRow(e);\n                f++\n            }\n        }\n        return f\n    }\n\n    function EmitRescaledYUV(a, p) {\n        var b = a.mb_h;\n        var c = (b + 1) >> 1;\n        var d = Rescale(a.y, a.y_off, a.y_stride, b, p.scaler_y);\n        Rescale(a.u, a.u_off, a.uv_stride, c, p.scaler_u);\n        Rescale(a.v, a.v_off, a.uv_stride, c, p.scaler_v);\n        return d\n    }\n\n    function EmitRescaledAlphaYUV(a, p) {\n        if (a.a != null) {\n            Rescale(a.a, a.a_off, a.width, a.mb_h, p.scaler_a)\n        }\n        return 0\n    }\n\n    function IsAlphaMode(a) {\n        return (a == MODE_RGBA || a == MODE_BGRA || a == MODE_ARGB || a == MODE_RGBA_4444 || a == MODE_YUVA)\n    }\n\n    function InitYUVRescaler(a, p) {\n        var b = IsAlphaMode(p.output.colorspace);\n        var c = p.output.u.YUVA;\n        var d = a.scaled_width;\n        var e = a.scaled_height;\n        var f = (d + 1) >> 1;\n        var g = (e + 1) >> 1;\n        var h = (a.mb_w + 1) >> 1;\n        var i = (a.mb_h + 1) >> 1;\n        var j = 2 * d;\n        var k = 2 * f;\n        var l = size_t;\n        var m = int32_t;\n        var n = 0;\n        l = j + 2 * k;\n        if (b) {\n            l += j\n        }\n        p.memory = malloc(l * sizeof(m) * 4, 0);\n        if (p.memory == null) {\n            return 0\n        }\n        m = p.memory;\n        n = 0;\n        InitRescaler(p.scaler_y, a.mb_w, a.mb_h, c.y, c.y_off, d, e, c.y_stride, a.mb_w, d, a.mb_h, e, m, n);\n        InitRescaler(p.scaler_u, h, i, c.u, c.u_off, f, g, c.u_stride, h, f, i, g, m, n + j);\n        InitRescaler(p.scaler_v, h, i, c.v, c.v_off, f, g, c.v_stride, h, f, i, g, m, n + j + k);\n        p.emit = EmitRescaledYUV;\n        if (b) {\n            InitRescaler(p.scaler_a, a.mb_w, a.mb_h, c.a, c.a_off, d, e, c.a_stride, a.mb_w, d, a.mb_h, e, m, n + j + 2 * k);\n            p.emit_alpha = EmitRescaledAlphaYUV\n        }\n        return 1\n    }\n\n    function Import(a, b, c, d, e) {\n        var f = 0;\n        while (f < d && e.y_accum > 0) {\n            ImportRow(a, b, e);\n            b += c;\n            ++f;\n            e.y_accum -= e.y_sub\n        }\n        return f\n    }\n\n    function ExportRGB(p, a) {\n        var b = cR[p.output.colorspace];\n        var c = p.output.u.RGBA;\n        var d = c.rgba;\n        var e = c.rgba_off + (p.last_y + a) * c.stride;\n        var f = 0;\n        while (p.scaler_y.y_accum <= 0 && p.scaler_u.y_accum <= 0) {\n            assert(p.last_y + a + f < p.output.height);\n            assert(p.scaler_u.y_accum == p.scaler_v.y_accum);\n            ExportRow(p.scaler_y);\n            ExportRow(p.scaler_u);\n            ExportRow(p.scaler_v);\n            b(p.scaler_y.dst, p.scaler_y.dst_off, p.scaler_u.dst, p.scaler_u.dst_off, p.scaler_v.dst, p.scaler_v.dst_off, d, e, p.scaler_y.dst_width);\n            e += c.stride;\n            f++\n        }\n        return f\n    }\n\n    function EmitRescaledRGB(a, p) {\n        var b = a.mb_h;\n        var c = (b + 1) >> 1;\n        var j = 0,\n            uv_j = 0;\n        var d = 0;\n        while (j < b) {\n            var e = Import(a.y, a.y_off + j * a.y_stride, a.y_stride, b - j, p.scaler_y);\n            var f = Import(a.u, a.u_off + uv_j * a.uv_stride, a.uv_stride, c - uv_j, p.scaler_u);\n            var g = Import(a.v, a.v_off + uv_j * a.uv_stride, a.uv_stride, c - uv_j, p.scaler_v);\n            assert(f == g);\n            j += e;\n            uv_j += f;\n            d += ExportRGB(p, d)\n        }\n        return d\n    }\n\n    function ExportAlpha(p, a) {\n        var b = p.output.u.RGBA;\n        var c = b.rgba;\n        var d = b.rgba_off + (p.last_y + a) * b.stride;\n        var e = 0;\n        while (p.scaler_a.y_accum <= 0) {\n            var i;\n            assert(p.last_y + a + e < p.output.height);\n            ExportRow(p.scaler_a);\n            for (i = 0; i < p.scaler_a.dst_width; ++i) {\n                c[d + 4 * i + 3] = p.scaler_a.dst[p.scaler_a.dst_off + i]\n            }\n            d += b.stride;\n            e++\n        }\n        return e\n    }\n\n    function EmitRescaledAlphaRGB(a, p) {\n        if (a.a != null) {\n            var j = 0,\n                pos = 0;\n            while (j < a.mb_h) {\n                j += Import(a.a, a.a_off + j * a.width, a.width, a.mb_h - j, p.scaler_a);\n                pos += ExportAlpha(p, pos)\n            }\n        }\n        return 0\n    }\n\n    function InitRGBRescaler(a, p) {\n        var b = IsAlphaMode(p.output.colorspace);\n        var c = a.scaled_width;\n        var d = a.scaled_height;\n        var e = (a.mb_w + 1) >> 1;\n        var f = (a.mb_h + 1) >> 1;\n        var g = 2 * c;\n        var h = int32_t;\n        var i = 0;\n        var j = uint8_t;\n        var k = 0;\n        var l = size_t,\n            tmp_size2 = size_t;\n        l = 3 * g;\n        tmp_size2 = 3 * c;\n        if (b) {\n            l += g;\n            tmp_size2 += c\n        }\n        p.memory = malloc(l * sizeof(h) * 4 + tmp_size2 * sizeof(j) * 1, 0);\n        p.memory_off = 0;\n        if (p.memory == null) {\n            slert('memory error');\n            return 0\n        }\n        h = p.memory;\n        i = p.memory_off;\n        j = h;\n        k = i + l * 1;\n        InitRescaler(p.scaler_y, a.mb_w, a.mb_h, j, k + 0 * c * 1, c, d, 0, a.mb_w, c, a.mb_h, d, h, i + 0 * g * 4);\n        InitRescaler(p.scaler_u, e, f, j, k + 1 * c * 1, c, d, 0, a.mb_w, 2 * c, a.mb_h, 2 * d, h, i + 1 * g * 4);\n        InitRescaler(p.scaler_v, e, f, j, k + 2 * c * 1, c, d, 0, a.mb_w, 2 * c, a.mb_h, 2 * d, h, i + 2 * g * 4);\n        p.emit = EmitRescaledRGB;\n        if (b) {\n            InitRescaler(p.scaler_a, a.mb_w, a.mb_h, j, k + 3 * c * 1, c, d, 0, a.mb_w, c, a.mb_h, d, h, i + 3 * g * 4);\n            p.emit_alpha = EmitRescaledAlphaRGB\n        }\n        return 1\n    }\n\n    function InitFromOptions(a, b) {\n        var W = b.width;\n        var H = b.height;\n        var x = 0,\n            y = 0,\n            w = W,\n            h = H;\n        b.use_cropping = (a != null) && (a.use_cropping > 0);\n        if (b.use_cropping) {\n            w = a.crop_width;\n            h = a.crop_height;\n            x = a.crop_left & ~1;\n            y = a.crop_top & ~1;\n            if (x < 0 || y < 0 || w <= 0 || h <= 0 || x + w > W || y + h > H) {\n                return 0\n            }\n        }\n        b.crop_left = x;\n        b.crop_top = y;\n        b.crop_right = x + w;\n        b.crop_bottom = y + h;\n        b.mb_w = w;\n        b.mb_h = h;\n        b.use_scaling = ((a != null) && (a.use_scaling > 0)) + 0;\n        if (b.use_scaling) {\n            if (a.scaled_width <= 0 || a.scaled_height <= 0) {\n                return 0\n            }\n            b.scaled_width = a.scaled_width;\n            b.scaled_height = a.scaled_height\n        }\n        b.bypass_filtering = a && a.bypass_filtering;\n        b.fancy_upsampling = ((a == null) || (!a.no_fancy_upsampling)) + 0;\n        if (b.use_scaling) {\n            b.bypass_filtering = (b.scaled_width < parseInt(W * 3 / 4)) + 0 && (b.scaled_height < parseInt(H * 3 / 4)) + 0;\n            b.fancy_upsampling = 0\n        }\n        return 1\n    }\n\n    function CustomSetup(a) {\n        var p = a.opaque;\n        var b = (p.output.colorspace < MODE_YUV);\n        p.memory = null;\n        p.emit = null;\n        p.emit_alpha = null;\n        if (!InitFromOptions(p.options_, a)) {\n            return 0\n        }\n        if (a.use_scaling) {\n            var c = b ? InitRGBRescaler(a, p) : InitYUVRescaler(a, p);\n            if (!c) {\n                alert('memory error #1');\n                return 0\n            }\n        } else {\n            if (b) {\n                p.emit = EmitSampledRGB;\n                if (a.fancy_upsampling) {\n                    var d = (a.mb_w + 1) >> 1;\n                    p.memory = malloc(a.mb_w + 2 * d, 205);\n                    if (p.memory == null) {\n                        alert('memory error #2');\n                        return 0\n                    }\n                    p.tmp_y = p.memory;\n                    p.tmp_y_off = 0;\n                    p.tmp_u = p.tmp_y;\n                    p.tmp_u_off = p.tmp_y_off + a.mb_w;\n                    p.tmp_v = p.tmp_u;\n                    p.tmp_v_off = p.tmp_u_off + d;\n                    p.emit = EmitFancyRGB;\n                    InitUpsamplers()\n                }\n            } else {\n                p.emit = EmitYUV\n            }\n            if (IsAlphaMode(p.output.colorspace)) {\n                p.emit_alpha = b ? EmitAlphaRGB : EmitAlphaYUV\n            }\n        }\n        if (b) {\n            VP8YUVInit()\n        }\n        return 1\n    }\n\n    function CustomPut(a) {\n        var p = a.opaque;\n        var b = a.mb_w;\n        var c = a.mb_h;\n        var d;\n        assert(!(a.mb_y & 1));\n        if (b <= 0 || c <= 0) {\n            return 0\n        }\n        d = p.emit(a, p);\n        p.last_y += d;\n        if (p.emit_alpha) {\n            p.emit_alpha(a, p)\n        }\n        return 1\n    }\n\n    function CustomTeardown(a) {\n        var p = a.opaque;\n        p.memory = '';\n        p.memory = null\n    }\n\n    function WebPInitCustomIo(b, c) {\n        c.put = function(a) {\n            return CustomPut(a)\n        };\n        c.setup = function(a) {\n            return CustomSetup(a)\n        };\n        c.teardown = function(a) {\n            return CustomTeardown(a)\n        };\n        c.opaque = b\n    }\n    var co = 12;\n    var cT = 10;\n    var cU = 4096;\n    var cV = 4096;\n    var cW = 0,\n        STATE_PARTS0 = 1,\n        STATE_DATA = 2,\n        STATE_DONE = 3,\n        STATE_ERROR = 4;\n    var cX = 0,\n        MEM_MODE_APPEND = 1,\n        MEM_MODE_MAP = 2;\n    var cY = {\n        mode_: 'MemBufferMode',\n        start_: uint32_t,\n        end_: uint32_t,\n        buf_size_: size_t,\n        buf_: uint8_t,\n        buf_off: 0,\n        part0_size_: size_t,\n        part0_buf_: uint8_t,\n        part0_buf_off: 0\n    };\n    var cZ = {\n        state_: \"DecState\",\n        params_: newObjectIt(ba),\n        dec_: newObjectIt(bz),\n        io_: newObjectIt(Y),\n        mem_: newObjectIt(cY),\n        output_: newObjectIt(R)\n    };\n    var da = {\n        left_: newObjectIt(bw),\n        info_: newObjectIt(bw),\n        intra_t_: Arr(4, uint8_t),\n        intra_l_: Arr(4, uint8_t),\n        br_: newObjectIt(bb),\n        token_br_: newObjectIt(bb)\n    };\n\n    function MemDataSize(a) {\n        return (a.end_ - a.start_)\n    }\n\n    function AppendToMemBuffer(a, b, c) {\n        var d = a.mem_;\n        var e = a.dec_;\n        var f = e.num_parts_ - 1;\n        assert(d.mode_ == MEM_MODE_APPEND);\n        if (d.end_ + c > d.buf_size_) {\n            var p;\n            var g = null;\n            var h = 0;\n            var i = parseInt((MemDataSize(d) + c + cU - 1) / cU);\n            var j = i * cU;\n            var k = d.buf_;\n            var l = d.buf_off + d.start_;\n            var g = malloc(j - 1, 205);\n            var h = 0;\n            if (!g) return 0;\n            memcpy(g, h, k, l, MemDataSize(d));\n            for (p = 0; p <= f; ++p) {\n                if (e.parts_[p].buf_off != null) {\n                    e.parts_[p].buf_ = g;\n                    e.parts_[p].buf_off = h + ((e.parts_[p].buf_off) - l);\n                    e.parts_[p].buf_end_ = h + ((e.parts_[p].buf_end_) - l)\n                }\n            }\n            d.buf_ = '';\n            d.buf_ = g;\n            d.buf_off = h;\n            d.buf_size_ = j;\n            d.end_ = MemDataSize(d);\n            d.start_ = 0\n        }\n        memcpy(d.buf_, d.buf_off + d.end_, b, 0, c);\n        d.end_ += c;\n        assert(d.end_ <= d.buf_size_);\n        if (f >= 0) {\n            e.parts_[f].buf_end_ = d.buf_off + d.end_\n        }\n        a.io_.data = d.buf_;\n        a.io_.data_off = d.buf_off;\n        a.io_.data_size = MemDataSize(d);\n        return 1\n    }\n\n    function RemapMemBuffer(a, b, c, d) {\n        var p;\n        var e = a.mem_;\n        var f = a.dec_;\n        var g = f.num_parts_ - 1;\n        var h = e.buf_;\n        var i = e.buf_off;\n        assert(e.mode_ == MEM_MODE_MAP);\n        if (d < e.buf_size_) {\n            alert('we cannot remap to a shorter buffer!');\n            return 0\n        }\n        for (p = 0; p <= g; ++p) {\n            if (f.parts_[p].buf_off != null) {\n                f.parts_[p].buf_ = b;\n                f.parts_[p].buf_off = c + ((f.parts_[p].buf_off) - i);\n                f.parts_[p].buf_end_ = c + ((f.parts_[p].buf_end_) - i)\n            }\n        }\n        if (g >= 0) {\n            f.parts_[g].buf_end_ = c + d\n        }\n        if (f.br_.buf_) {\n            f.br_.buf_ = b;\n            f.br_.buf_off = c + ((f.br_.buf_off) - i);\n            f.br_.buf_end_ = c + ((f.br_.buf_end_) - i)\n        }\n        e.buf_ = b;\n        e.buf_off = c;\n        e.end_ = e.buf_size_ = d;\n        a.io_.data = b;\n        a.io_.data_off = c;\n        a.io_.data_size = d;\n        return 1\n    }\n\n    function InitMemBuffer(a) {\n        a.mode_ = cX;\n        a.buf_ = 0;\n        a.buf_size_ = 0;\n        a.part0_buf_ = 0;\n        a.part0_size_ = 0\n    }\n\n    function ClearMemBuffer(a) {\n        assert(a);\n        if (a.mode_ == MEM_MODE_APPEND) {\n            a.buf_ = '';\n            a.buf_off = 0;\n            a.part0_buf_ = '';\n            a.part0_buf_off = ''\n        }\n    }\n\n    function CheckMemBufferMode(a, b) {\n        if (a.mode_ == cX) {\n            a.mode_ = b\n        } else if (a.mode_ != b) {\n            alert('we mixed the modes => error');\n            return 0\n        }\n        assert(a.mode_ == b);\n        return 1\n    }\n\n    function SaveContext(a, b, c) {\n        var d = a.br_;\n        var e = a.mb_info_[1 - 1];\n        var f = a.mb_info_[1 + a.mb_x_];\n        c.left_ = newObjectIt(e);\n        c.info_ = newObjectIt(f);\n        c.br_ = newObjectIt(d);\n        c.token_br_ = newObjectIt(b);\n        memcpy(c.intra_t_, 0, a.intra_t_, +4 * a.mb_x_, 4);\n        memcpy(c.intra_l_, 0, a.intra_l_, 0, 4)\n    }\n\n    function RestoreContext(a, b, c) {\n        var d = b.br_;\n        var e = b.mb_info_[1 - 1];\n        var f = b.mb_info_[1 + b.mb_x_];\n        e.dc_nz_ = a.left_.dc_nz_;\n        e.f_ilevel_ = a.left_.f_ilevel_;\n        e.f_inner_ = a.left_.f_inner_;\n        e.f_level_ = a.left_.f_level_;\n        e.nz_ = a.left_.nz_;\n        e.skip_ = a.left_.skip_;\n        f.dc_nz_ = a.info_.dc_nz_;\n        f.f_ilevel_ = a.info_.f_ilevel_;\n        f.f_inner_ = a.info_.f_inner_;\n        f.f_level_ = a.info_.f_level_;\n        f.nz_ = a.info_.nz_;\n        f.skip_ = a.info_.skip_;\n        b.br_.buf_end_ = a.br_.buf_end_;\n        b.br_.buf_off = a.br_.buf_off;\n        b.br_.eof_ = a.br_.eof_;\n        b.br_.missing_ = a.br_.missing_;\n        b.br_.range_ = a.br_.range_;\n        b.br_.value_ = a.br_.value_;\n        c.buf_end_ = (a.token_br_.buf_end_);\n        c.buf_off = (a.token_br_.buf_off);\n        c.eof_ = (a.token_br_.eof_);\n        c.missing_ = (a.token_br_.missing_);\n        c.range_ = (a.token_br_.range_);\n        c.value_ = (a.token_br_.value_);\n        memcpy(b.intra_t_, +4 * b.mb_x_, a.intra_t_, 0, 4);\n        memcpy(b.intra_l_, 0, a.intra_l_, 0, 4)\n    }\n\n    function IDecError(a, b) {\n        if (a.state_ == STATE_DATA) {\n            var c = a.io_;\n            if (c.teardown) {\n                c.teardown(c)\n            }\n        }\n        a.state_ = STATE_ERROR;\n        return b\n    }\n\n    function DecodeHeader(a) {\n        var b = uint32_t,\n            bits = uint32_t;\n        var c = a.mem_.buf_;\n        var d = {\n            value: (a.mem_.buf_off + a.mem_.start_)\n        };\n        var e = {\n            value: MemDataSize(a.mem_)\n        };\n        var f = {\n            value: uint32_t\n        };\n        var g = {\n            value: uint32_t\n        };\n        var h = {\n            value: 0\n        };\n        var i = {\n            value: 0\n        };\n        if (e.value < co) {\n            return VP8_STATUS_SUSPENDED\n        }\n        if (!WebPCheckAndSkipRIFFHeader(c, d, e, g)) {\n            return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)\n        }\n        if (!VP8XGetInfo(c, d, e, h, null, null, null)) {\n            return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)\n        }\n        if (h.value == -1) {\n            return VP8_STATUS_SUSPENDED\n        }\n        if (!VP8CheckAndSkipHeader(c, d, e, i, f, g)) {\n            return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)\n        }\n        if ((i.value == -1) && (f.value == 0)) {\n            return VP8_STATUS_SUSPENDED\n        }\n        if (e.value < cT) {\n            return VP8_STATUS_SUSPENDED\n        }\n        if (!VP8GetInfo(c, d, e, f, null, null, null)) {\n            return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)\n        }\n        e = e.value;\n        d = d.value;\n        b = a.mem_.end_ - e;\n        bits = c[d + 0] | (c[d + 1] << 8) | (c[d + 2] << 16);\n        a.mem_.part0_size_ = (bits >> 5) + cT;\n        a.mem_.start_ += b;\n        assert(a.mem_.start_ <= a.mem_.end_);\n        a.io_.data_size -= b;\n        a.io_.data = c;\n        a.io_.data_off = d;\n        a.state_ = STATE_PARTS0;\n        return T\n    }\n\n    function CopyParts0Data(a) {\n        var b = a.dec_.br_;\n        var c = b.buf_end_ - b.buf_off;\n        var d = a.mem_;\n        assert(c > 0);\n        assert(c <= d.part0_size_);\n        if (d.mode_ == MEM_MODE_APPEND) {\n            var e = malloc(c, uint8_t);\n            var f = 0;\n            if (!e) {\n                return 0\n            }\n            memcpy(e, f, b.buf_, b.buf_off, c);\n            d.part0_buf_ = e;\n            d.part0_buf_off = f;\n            d.start_ += c;\n            b.buf_ = e;\n            b.buf_off = f;\n            b.buf_end_ = f + c\n        } else {}\n        return 1\n    }\n\n    function DecodePartition0(a) {\n        var b = a.dec_;\n        var c = a.io_;\n        var d = a.params_;\n        var e = d.output;\n        if (MemDataSize(a.mem_) < a.mem_.part0_size_) {\n            return VP8_STATUS_SUSPENDED\n        }\n        if (!VP8GetHeaders(b, c)) {\n            var f = b.status_;\n            if (f == VP8_STATUS_SUSPENDED || f == VP8_STATUS_NOT_ENOUGH_DATA) {\n                return VP8_STATUS_SUSPENDED\n            }\n            return IDecError(a, f)\n        }\n        b.status_ = WebPAllocateDecBuffer(c.width, c.height, d.options_, e);\n        if (b.status_ != T) {\n            return IDecError(a, b.status_)\n        }\n        if (!CopyParts0Data(a)) {\n            return IDecError(a, VP8_STATUS_OUT_OF_MEMORY)\n        }\n        if (VP8EnterCritical(b, c) != T) {\n            return IDecError(a, b.status_)\n        }\n        a.state_ = STATE_DATA;\n        if (!VP8InitFrame(b, c)) {\n            return IDecError(a, b.status_)\n        }\n        return T\n    }\n\n    function DecodeRemaining(a) {\n        var b = newObjectIt(bb);\n        var c = a.dec_;\n        var d = a.io_;\n        assert(c.ready_);\n        b = c.br_;\n        for (; c.mb_y_ < c.mb_h_; ++c.mb_y_) {\n            var e = c.parts_[c.mb_y_ & (c.num_parts_ - 1)];\n            if (c.mb_x_ == 0) {\n                VP8InitScanline(c)\n            }\n            for (; c.mb_x_ < c.mb_w_; c.mb_x_++) {\n                var f = (da);\n                SaveContext(c, e, f);\n                if (!VP8DecodeMB(c, e)) {\n                    RestoreContext(f, c, e);\n                    if (c.num_parts_ == 1 && MemDataSize(a.mem_) > cV) {\n                        return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)\n                    }\n                    return VP8_STATUS_SUSPENDED\n                }\n                VP8ReconstructBlock(c);\n                VP8StoreBlock(c);\n                if (c.num_parts_ == 1) {\n                    a.mem_.start_ = e.buf_off - a.mem_.buf_off;\n                    assert(a.mem_.start_ <= a.mem_.end_)\n                }\n            }\n            if (!VP8ProcessRow(c, d)) {\n                return IDecError(a, VP8_STATUS_USER_ABORT)\n            }\n            c.mb_x_ = 0\n        }\n        if (!VP8ExitCritical(c, d)) {\n            return IDecError(a, VP8_STATUS_USER_ABORT)\n        }\n        c.ready_ = 0;\n        a.state_ = STATE_DONE;\n        return T\n    }\n\n    function IDecode(a) {\n        var b = VP8_STATUS_SUSPENDED;\n        assert(a.dec_);\n        if (a.state_ == cW) {\n            b = DecodeHeader(a)\n        }\n        if (a.state_ == STATE_PARTS0) {\n            b = DecodePartition0(a)\n        }\n        if (a.state_ == STATE_DATA) {\n            b = DecodeRemaining(a)\n        }\n        return b\n    }\n\n    function WebPINewDecoder(a) {\n        var b = newObjectIt(cZ);\n        if (b == null) {\n            return null\n        }\n        b.dec_ = VP8New();\n        if (b.dec_ == null) {\n            b = '';\n            return null\n        }\n        b.state_ = cW;\n        InitMemBuffer(b.mem_);\n        WebPInitDecBuffer(b.output_);\n        VP8InitIo(b.io_);\n        WebPResetDecParams(b.params_);\n        b.params_.output = a ? a : b.output_;\n        WebPInitCustomIo(b.params_, b.io_);\n        b.dec_.use_threads_ = 0;\n        return b\n    }\n    this.WebPIDecode = function(a, b, c) {\n        var d = newObjectIt(cZ);\n        if (a != null && b > 0 && c != null) {\n            if (this.WebPGetFeatures(a, b, c.input) != T) {\n                return null\n            }\n        }\n        d = WebPINewDecoder(c ? c.output : null);\n        if (!d) {\n            return null\n        }\n        if (c != null) {\n            d.params_.options_ = c.options_\n        }\n        return d\n    };\n    this.WebPIDelete = function(a) {\n        if (!a) return;\n        VP8Delete(a.dec_);\n        ClearMemBuffer(a.mem_);\n        this.WebPFreeDecBuffer(a.output_);\n        a = ''\n    };\n    this.WebPINew = function(a) {\n        a = a == 'MODE_RGB' ? O : a;\n        a = a == 'MODE_RGBA' ? MODE_RGBA : a;\n        a = a == 'MODE_BGR' ? MODE_BGR : a;\n        a = a == 'MODE_BGRA' ? MODE_BGRA : a;\n        a = a == 'MODE_YUV' ? MODE_YUV : a;\n        var b = WebPINewDecoder(null);\n        if (!b) return null;\n        b.output_.colorspace = a;\n        return b\n    };\n    this.WebPINewRGB = function(a, b, c, d) {\n        var e = newObjectIt(cZ);\n        if (a >= MODE_YUV) return null;\n        e = WebPINewDecoder(null);\n        if (e) return null;\n        e.output_.colorspace = a;\n        e.output_.is_external_memory = 1;\n        e.output_.u.RGBA.rgba = b;\n        e.output_.u.RGBA.stride = d;\n        e.output_.u.RGBA.size = c;\n        return e\n    };\n    this.WebPINewYUV = function(a, b, c, d, u, e, f, g, v, h, i, j) {\n        var k = WebPINewDecoder(null);\n        if (k) return null;\n        k.output_.colorspace = MODE_YUV;\n        k.output_.is_external_memory = 1;\n        k.output_.u.YUVA.y = a;\n        k.output_.u.YUVA.y = b;\n        k.output_.u.YUVA.y_stride = d;\n        k.output_.u.YUVA.y_size = c;\n        k.output_.u.YUVA.u = u;\n        k.output_.u.YUVA.u = e;\n        k.output_.u.YUVA.u_stride = g;\n        k.output_.u.YUVA.u_size = f;\n        k.output_.u.YUVA.v = v;\n        k.output_.u.YUVA.v = h;\n        k.output_.u.YUVA.v_stride = j;\n        k.output_.u.YUVA.v_size = i;\n        return k\n    };\n\n    function IDecCheckStatus(a) {\n        assert(a);\n        if (a.dec_ == null) {\n            return VP8_STATUS_USER_ABORT\n        }\n        if (a.state_ == STATE_ERROR) {\n            return VP8_STATUS_BITSTREAM_ERROR\n        }\n        if (a.state_ == STATE_DONE) {\n            return T\n        }\n        return VP8_STATUS_SUSPENDED\n    }\n    this.WebPIAppend = function(a, b, c) {\n        var d = 0;\n        if (a == null || b == null) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        d = IDecCheckStatus(a);\n        if (d != VP8_STATUS_SUSPENDED) {\n            return d\n        }\n        if (!CheckMemBufferMode(a.mem_, MEM_MODE_APPEND)) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        if (!AppendToMemBuffer(a, b, c)) {\n            return VP8_STATUS_OUT_OF_MEMORY\n        }\n        return IDecode(a)\n    };\n    this.WebPIUpdate = function(a, b, c) {\n        var d = 0;\n        if (a == null || b == null) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        d = IDecCheckStatus(a);\n        if (d != VP8_STATUS_SUSPENDED) {\n            return d\n        }\n        if (!CheckMemBufferMode(a.mem_, MEM_MODE_MAP)) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        if (!RemapMemBuffer(a, b, 0, c)) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        return IDecode(a)\n    };\n\n    function GetOutputBuffer(a) {\n        if (!a || !a.dec_ || a.state_ <= STATE_PARTS0) {\n            return null\n        }\n        return a.params_.output\n    }\n    this.WebPIDecodedArea = function(a, b, c, d, e) {\n        var f = GetOutputBuffer(a);\n        if (b) b.value = 0;\n        if (c) c.value = 0;\n        if (f) {\n            if (d) d.value = f.width;\n            if (e) e.value = a.params_.last_y\n        } else {\n            if (d) d.value = 0;\n            if (e) e.value = 0\n        }\n        return f\n    };\n    this.WebPIDecGetRGB = function(a, b, c, d, e) {\n        var f = GetOutputBuffer(a);\n        if (!f) return null;\n        if (f.colorspace >= MODE_YUV) {\n            return null\n        }\n        if (typeof b.value !== \"undefined\") b.value = a.params_.last_y;\n        if (typeof c.value !== \"undefined\") c.value = f.width;\n        if (typeof d.value !== \"undefined\") d.value = f.height;\n        if (typeof e.value !== \"undefined\") e.value = f.u.RGBA.stride;\n        return f.u.RGBA.rgba\n    };\n    this.WebPIDecGetYUV = function(a, b, u, v, c, d, e, f) {\n        var g = GetOutputBuffer(a);\n        if (!g) return null;\n        if (g.colorspace < MODE_YUV) {\n            return null\n        }\n        if (typeof b.value !== \"undefined\") b.value = g.u.YUVA.u;\n        if (typeof u.value !== \"undefined\") u.value = g.u.YUVA.u;\n        if (typeof v.value !== \"undefined\") v.value = g.u.YUVA.v;\n        if (typeof c.value !== \"undefined\") c.value = g.width;\n        if (typeof d.value !== \"undefined\") d.value = g.height;\n        if (typeof e.value !== \"undefined\") e.value = g.u.YUVA.y_stride;\n        if (typeof f.value !== \"undefined\") f.value = g.u.YUVA.u_stride;\n        return g.u.YUVA.y\n    };\n\n    function WebPISetIOHooks(a, b, c, d, e) {\n        if (!a || !a.dec_ || a.state_ > cW) {\n            return 0\n        }\n        a.io_.put = b;\n        a.io_.setup = c;\n        a.io_.teardown = d;\n        a.io_.opaque = e;\n        return 1\n    }\n    var co = 12;\n\n    function WebPCheckAndSkipRIFFHeader(a, b, c, d) {\n        if (c.value >= co && !memcmp(a, b.value, \"RIFF\", 4)) {\n            if (memcmp(a, b.value + 8, \"WEBP\", 4)) {\n                return 0\n            } else {\n                d.value = get_le32(a, b.value + 4);\n                if (d.value < co) {\n                    return 0\n                }\n                b.value += co;\n                c.value -= co\n            }\n        } else {\n            d.value = 0\n        }\n        return 1\n    }\n\n    function WebPResetDecParams(a) {\n        if (a) {}\n    }\n    var cq = '',\n        cr = '';\n\n    function DecodeInto(a, b, c, d) {\n        cr = new VP8New();\n        var e = T;\n        cq = newObjectIt(Y);\n        var f = 1;\n        assert(d);\n        if (cr == null) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        VP8InitIo(cq);\n        cq.data = a;\n        cq.data_off = b;\n        cq.data_size = c;\n        WebPInitCustomIo(d, cq);\n        cr.use_threads_ = 0;\n        if (!VP8GetHeaders(cr, cq)) {\n            e = VP8_STATUS_BITSTREAM_ERROR\n        } else {\n            e = WebPAllocateDecBuffer(cq.width, cq.height, d.options_, d.output);\n            if (e == T) {\n                if (!VP8Decode(cr, cq)) {\n                    e = cr.status_\n                }\n            }\n        }\n        VP8Delete(cr);\n        if (e != T) {\n            this.WebPFreeDecBuffer(d.output)\n        }\n        return e\n    };\n\n    function DecodeIntoRGBABuffer(a, b, c, d, e, f) {\n        var g = newObjectIt(ba);\n        var h = newObjectIt(R);\n        if (d == null) {\n            return null\n        }\n        WebPInitDecBuffer(h);\n        WebPResetDecParams(g);\n        g.output = h;\n        h.colorspace = a;\n        h.u.RGBA.rgba = d;\n        h.u.RGBA.rgba_off = 0;\n        h.u.RGBA.stride = e;\n        h.u.RGBA.size = f;\n        h.is_external_memory = 1;\n        if (DecodeInto(b, 0, c, g) != T) {\n            return null\n        }\n        return d\n    }\n\n    function WebPDecodeRGBInto(a, b, c, d, e) {\n        return DecodeIntoRGBABuffer(O, a, b, c, e, d)\n    }\n\n    function WebPDecodeRGBAInto(a, b, c, d, e) {\n        return DecodeIntoRGBABuffer(MODE_RGBA, a, b, c, e, d)\n    }\n\n    function WebPDecodeARGBInto(a, b, c, d, e) {\n        return DecodeIntoRGBABuffer(MODE_ARGB, a, b, c, e, d)\n    }\n\n    function WebPDecodeBGRInto(a, b, c, d, e) {\n        return DecodeIntoRGBABuffer(MODE_BGR, a, b, c, e, d)\n    }\n\n    function WebPDecodeBGRAInto(a, b, c, d, e) {\n        return DecodeIntoRGBABuffer(MODE_BGRA, a, b, c, e, d)\n    }\n\n    function WebPDecodeYUVInto(a, b, c, d, e, f, u, g, h, i, v, j, k, l) {\n        var m = newObjectIt(ba);\n        var n = newObjectIt(R);\n        if (c == null) return null;\n        WebPInitDecBuffer(n);\n        WebPResetDecParams(m);\n        m.output = n;\n        n.colorspace = MODE_YUV;\n        n.u.YUVA.y = c;\n        n.u.YUVA.y_off = d;\n        n.u.YUVA.y_stride = f;\n        n.u.YUVA.y_size = e;\n        n.u.YUVA.u = u;\n        n.u.YUVA.u_off = g;\n        n.u.YUVA.u_stride = i;\n        n.u.YUVA.u_size = h;\n        n.u.YUVA.v = v;\n        n.u.YUVA.v_off = j;\n        n.u.YUVA.v_stride = l;\n        n.u.YUVA.v_size = k;\n        n.is_external_memory = 1;\n        if (DecodeInto(a, 0, b, m) != T) {\n            return null\n        }\n        return c\n    }\n    var db = -1,\n        data_size = -1,\n        params_out = -1;\n    var dc = -1;\n\n    function Decode(a, b, c, d, e, f) {\n        data_off = {\n            value: 0\n        };\n        c = {\n            value: c\n        };\n        var g = newObjectIt(ba);\n        var h = newObjectIt(R);\n        WebPInitDecBuffer(h);\n        WebPResetDecParams(g);\n        g.output = h;\n        h.colorspace = a;\n        var o = {\n            data_off: {\n                value: 0\n            },\n            width: {\n                value: h.width\n            },\n            height: {\n                value: h.height\n            }\n        };\n        if (!WebPGetInfo(b, data_off, c, o.width, o.height)) {\n            return null\n        }\n        h.width = o.width.value;\n        h.height = o.height.value;\n        if (d) d.value = h.width.value;\n        if (e) e.value = h.height.value;\n        if (DecodeInto(b, data_off.value, c.value, g) != T) {\n            return null\n        }\n        if (f) {\n            WebPCopyDecBuffer(h, f)\n        }\n        return (a >= MODE_YUV) ? h.u.YUVA.y : h.u.RGBA.rgba\n    }\n    this.WebPDecodeRGB = function(a, b, c, d) {\n        return Decode(O, a, b, c, d, null)\n    };\n    this.WebPDecodeRGBA = function(a, b, c, d) {\n        return Decode(MODE_RGBA, a, b, c, d, null)\n    };\n    this.WebPDecodeRGBA_4444 = function(a, b, c, d) {\n        return Decode(MODE_RGBA_4444, a, b, c, d, null)\n    };\n    this.WebPDecodeARGB = function(a, b, c, d) {\n        return Decode(MODE_ARGB, a, b, c, d, null)\n    };\n    this.WebPDecodeBGR = function(a, b, c, d) {\n        return Decode(MODE_BGR, a, b, c, d, null)\n    };\n    this.WebPDecodeBGRA = function(a, b, c, d) {\n        return Decode(MODE_BGRA, a, b, c, d, null)\n    };\n\n    function DefaultFeatures(a) {\n        assert(a);\n        a.bitstream_version = 0\n    }\n\n    function GetFeatures(a, b, c, d) {\n        var e = {\n            value: 0\n        };\n        var f = {\n            value: 0\n        };\n        var g = {\n            value: 0\n        };\n        var h = {\n            value: 0\n        };\n        var i = {\n            value: 0\n        };\n        if (d == null) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        DefaultFeatures(d);\n        if (a == null || b == null || c.value == 0) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        if (!WebPCheckAndSkipRIFFHeader(a, b, c, f)) {\n            return VP8_STATUS_BITSTREAM_ERROR\n        }\n        if (!VP8XGetInfo(a, b, c, h, d.width, d.height, g)) {\n            return VP8_STATUS_BITSTREAM_ERROR\n        }\n        if (h.value > 0) {\n            return T\n        }\n        if (!VP8CheckAndSkipHeader(a, b, c, i, e, f)) {\n            return VP8_STATUS_BITSTREAM_ERROR\n        }\n        if (i.value == -1) {\n            return VP8_STATUS_BITSTREAM_ERROR\n        }\n        if (!i.value) {\n            e.value = c.value\n        }\n        if (!VP8GetInfo(a, b, c, e, d.width, d.height, d.has_alpha)) {\n            return VP8_STATUS_BITSTREAM_ERROR\n        }\n        return T\n    }\n\n    function WebPGetInfo(a, b, c, d, e) {\n        var f = newObjectIt(U);\n        if (GetFeatures(a, b, c, f) != T) {\n            return 0\n        }\n        if (d) {\n            d.value = f.width\n        }\n        if (e) {\n            e.value = f.height\n        }\n        return 1\n    }\n\n    function WebPInitDecoderConfigInternal(a, b) {\n        if (b != N) {\n            return 0\n        }\n        if (a == null) {\n            return 0\n        }\n        DefaultFeatures(a.input);\n        WebPInitDecBuffer(a.output);\n        return 1\n    }\n\n    function WebPGetFeaturesInternal(a, b, c, d) {\n        if (d != N) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        if (c == null) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        var e = {\n            value: 0\n        };\n        var b = {\n            value: b\n        };\n        return GetFeatures(a, e, b, c)\n    }\n    this.WebPDecode = function(a, b, c) {\n        var d = newObjectIt(ba);\n        var e = 'VP8StatusCode';\n        if (!c) {\n            return VP8_STATUS_INVALID_PARAM\n        }\n        var f = {\n            value: 0\n        };\n        b = {\n            value: b\n        };\n        e = GetFeatures(a, f, b, c.input);\n        if (e != T) {\n            return e\n        }\n        WebPResetDecParams(d);\n        d.output = c.output;\n        d.options_ = c.options;\n        e = DecodeInto(a, f.value, b.value, d);\n        return e\n    };\n    var dd, height;\n    var db = -1,\n        data_size = -1,\n        dd = -1,\n        height = -1,\n        params_out = -1;\n    var dc = -1\n}\n\nfunction WebPEncoder() {\n    var N = 0x0002;\n    var O = {\n        quality: float,\n        target_size: int,\n        target_PSNR: float,\n        method: int,\n        segments: int,\n        sns_strength: int,\n        filter_strength: int,\n        filter_sharpness: int,\n        filter_type: int,\n        autofilter: int,\n        pass: int,\n        show_compressed: int,\n        preprocessing: int,\n        partitions: int,\n        partition_limit: int,\n        alpha_compression: int\n    };\n    var P = {\n        WEBP_PRESET_DEFAULT: 0,\n        WEBP_PRESET_PICTURE: 1,\n        WEBP_PRESET_PHOTO: 2,\n        WEBP_PRESET_DRAWING: 3,\n        WEBP_PRESET_ICON: 4,\n        WEBP_PRESET_TEXT: 5\n    };\n\n    function WebPConfigPreset(a, b, c) {\n        return WebPConfigInitInternal(a, b, c, N)\n    }\n    var S = {\n        PSNR: Arr(4, float),\n        coded_size: int,\n        block_count: Arr(3, int),\n        header_bytes: Arr(2, int),\n        residual_bytes: ArrM(new Array(3, 4), int),\n        segment_size: Arr(4, int),\n        segment_quant: Arr(4, int),\n        segment_level: Arr(4, int),\n        alpha_data_size: int,\n        layer_data_size: int\n    };\n    var T = 0,\n        WEBP_YUV422 = 1,\n        WEBP_YUV444 = 2,\n        WEBP_YUV400 = 3,\n        WEBP_CSP_UV_MASK = 3,\n        WEBP_YUV420A = 4,\n        WEBP_YUV422A = 5,\n        WEBP_YUV444A = 6,\n        WEBP_YUV400A = 7,\n        WEBP_CSP_ALPHA_BIT = 4;\n    var U = 0,\n        VP8_ENC_ERROR_OUT_OF_MEMORY = 1,\n        VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY = 2,\n        VP8_ENC_ERROR_NULL_PARAMETER = 3,\n        VP8_ENC_ERROR_INVALID_CONFIGURATION = 4,\n        VP8_ENC_ERROR_BAD_DIMENSION = 5,\n        VP8_ENC_ERROR_PARTITION0_OVERFLOW = 6,\n        VP8_ENC_ERROR_PARTITION_OVERFLOW = 7,\n        VP8_ENC_ERROR_BAD_WRITE = 8;\n    var V = {\n        colorspace: 'WebPEncCSP',\n        width: int,\n        height: int,\n        y: uint8_t,\n        u: uint8_t,\n        v: uint8_t,\n        y_off: 0,\n        u_off: 0,\n        v_off: 0,\n        y_stride: int,\n        uv_stride: int,\n        a: uint8_t,\n        a_off: 0,\n        a_stride: int,\n        writer: function WebPWriterFunction() {},\n        custom_ptr: void_,\n        extra_info_type: int,\n        extra_info: uint8_t,\n        stats: newObjectIt(S),\n        stats_nozero: 1,\n        u0: uint8_t,\n        v0: uint8_t,\n        u0_off: 0,\n        v0_off: 0,\n        uv0_stride: int,\n        error_code: 'WebPEncodingError'\n    };\n\n    function WebPPictureInit(a) {\n        return WebPPictureInitInternal(a, N)\n    }\n    var Y = {\n        range_: int32_t,\n        value_: int32_t,\n        run_: int,\n        nb_bits_: int,\n        buf_: uint8_t,\n        buf_off: 0,\n        pos_: size_t,\n        max_pos_: size_t,\n        error_: int\n    };\n\n    function VP8BitWriterPos(a) {\n        return (a.pos_ + a.run_) * 8 + 8 + a.nb_bits_\n    }\n\n    function VP8BitWriterBuf(a) {\n        return a.buf_\n    }\n\n    function VP8BitWriterSize(a) {\n        return a.pos_\n    }\n    var Z = 0;\n    var ba = 1;\n    var bb = 2;\n    var bc = 64;\n    var bd = 0,\n        B_TM_PRED = 1,\n        B_VE_PRED = 2,\n        B_HE_PRED = 3,\n        B_RD_PRED = 4,\n        B_VR_PRED = 5,\n        B_LD_PRED = 6,\n        B_VL_PRED = 7,\n        B_HD_PRED = 8,\n        B_HU_PRED = 9,\n        NUM_BMODES = (B_HU_PRED + 1 - bd),\n        DC_PRED = bd,\n        V_PRED = B_VE_PRED,\n        H_PRED = B_HE_PRED,\n        TM_PRED = B_TM_PRED;\n    var be = 4,\n        MAX_NUM_PARTITIONS = 8,\n        NUM_TYPES = 4,\n        NUM_BANDS = 8,\n        NUM_CTX = 3,\n        NUM_PROBAS = 11,\n        MAX_LF_LEVELS = 64,\n        MAX_VARIABLE_LEVEL = 67;\n    var bf = 16;\n    var bg = (bf * 16);\n    var bh = (bf * 8);\n    var bi = (bg + bh);\n    var bj = (6 * 16 * bf + 12 * bf);\n    var bk = (0);\n    var bl = (bg);\n    var bm = (bl + 8);\n    var bn = 15;\n    var bo = (0 * 16 * bf);\n    var bp = (1 * 16 * bf);\n    var bq = (2 * 16 * bf);\n    var br = (3 * 16 * bf);\n    var bs = (4 * 16 * bf);\n    var bt = (4 * 16 * bf + 8 * bf);\n    var bu = (5 * 16 * bf);\n    var bv = (5 * 16 * bf + 8 * bf);\n    var bw = (6 * 16 * bf + 0);\n    var bx = (6 * 16 * bf + 4);\n    var by = (6 * 16 * bf + 8);\n    var bz = (6 * 16 * bf + 12);\n    var bA = (6 * 16 * bf + 4 * bf + 0);\n    var bB = (6 * 16 * bf + 4 * bf + 4);\n    var bC = (6 * 16 * bf + 4 * bf + 8);\n    var bD = (6 * 16 * bf + 4 * bf + 12);\n    var bE = (6 * 16 * bf + 8 * bf + 0);\n    var bF = (6 * 16 * bf + 8 * bf + 4);\n    var bG = (6 * 16 * bf + 8 * bf + 8);\n    var bH = 0x7fffffffffffff;\n    var bI = 17;\n\n    function BIAS(b) {\n        return ((b) << (bI - 8))\n    }\n\n    function QUANTDIV(n, a, B) {\n        return ((n * a + B) >> bI)\n    }\n    var bJ = ArrM(new Array(NUM_CTX, NUM_PROBAS), uint8_t);\n    var bK = ArrM(new Array(NUM_CTX, NUM_PROBAS, 2), uint64_t);\n    var bL = ArrM(new Array(NUM_CTX, (MAX_VARIABLE_LEVEL + 1)), uint16_t);\n    var bM = ArrM(new Array(be, MAX_LF_LEVELS), double);\n    var bN = {\n        num_segments_: int,\n        update_map_: int,\n        size_: int\n    };\n    var bO = {\n        segments_: Arr(3, uint8_t),\n        skip_proba_: uint8_t,\n        coeffs_: ArrM(new Array(NUM_TYPES, NUM_BANDS), bJ),\n        stats_: ArrM(new Array(NUM_TYPES, NUM_BANDS), bK),\n        level_cost_: ArrM(new Array(NUM_TYPES, NUM_BANDS), bL),\n        use_skip_proba_: int,\n        nb_skip_: int\n    };\n    var bP = {\n        simple_: int,\n        level_: int,\n        sharpness_: int,\n        i4x4_lf_delta_: int\n    };\n    var bQ = {\n        type_: 0,\n        uv_mode_: 0,\n        skip_: 0,\n        segment_: 0,\n        alpha_: uint8_t\n    };\n    var bR = {\n        q_: Arr(16, uint16_t),\n        iq_: Arr(16, uint16_t),\n        bias_: Arr(16, uint16_t),\n        zthresh_: Arr(16, uint16_t),\n        sharpen_: Arr(16, uint16_t)\n    };\n    var bS = {\n        y1_: newObjectIt(bR),\n        y2_: newObjectIt(bR),\n        uv_: newObjectIt(bR),\n        alpha_: int,\n        beta_: int,\n        quant_: int,\n        fstrength_: int,\n        lambda_i16_: int,\n        lambda_i4_: int,\n        lambda_uv_: int,\n        lambda_mode_: int,\n        lambda_trellis_: int,\n        tlambda_: int,\n        lambda_trellis_i16_: int,\n        lambda_trellis_i4_: int,\n        lambda_trellis_uv_: int\n    };\n    var bT = {\n        config_: newObjectIt(O),\n        pic_: newObjectIt(V),\n        filter_hdr_: newObjectIt(bP),\n        segment_hdr_: newObjectIt(bN),\n        profile_: int,\n        mb_w_: int,\n        mb_h_: int,\n        preds_w_: int,\n        num_parts_: int,\n        bw_: newObjectIt(Y),\n        parts_: Arr_nOI(MAX_NUM_PARTITIONS, Y),\n        has_alpha_: int,\n        alpha_data_: uint8_t,\n        alpha_data_off: 0,\n        alpha_data_size_: size_t,\n        use_layer_: int,\n        layer_bw_: Y,\n        layer_data_: uint8_t,\n        layer_data_off: 0,\n        layer_data_size_: size_t,\n        dqm_: Arr_nOI(be, bS),\n        base_quant_: int,\n        uv_alpha_: int,\n        dq_y1_dc_: int,\n        dq_y2_dc_: int,\n        dq_y2_ac_: int,\n        dq_uv_dc_: int,\n        dq_uv_ac_: int,\n        proba_: newObjectIt(bO),\n        proba_off: 0,\n        sse_: Arr(3, uint64_t),\n        sse_count_: uint64_t,\n        coded_size_: int,\n        residual_bytes_: ArrM(new Array(3, 4), int),\n        block_count_: Arr(3, int),\n        method_: int,\n        rd_opt_level_: int,\n        max_i4_header_bits_: int,\n        mb_info_: newObjectIt(bQ),\n        mb_info_off: 0,\n        preds_: uint8_t,\n        preds_off: 0,\n        nz_: uint32_t,\n        nz_off: 0,\n        yuv_in_: uint8_t,\n        yuv_in_off: 0,\n        yuv_out_: uint8_t,\n        yuv_out_off: 0,\n        yuv_out2_: uint8_t,\n        yuv_out2_off: 0,\n        yuv_p_: uint8_t,\n        yuv_p_off: 0,\n        y_top_: uint8_t,\n        y_top_off: 0,\n        uv_top_: uint8_t,\n        uv_top_off: 0,\n        y_left_: uint8_t,\n        y_left_off: 0,\n        u_left_: uint8_t,\n        u_left_off: 0,\n        v_left_: uint8_t,\n        v_left_off: 0,\n        lf_stats_: newObjectIt(bM)\n    };\n    var bU = {\n        D: score_t,\n        SD: score_t,\n        R: score_t,\n        score: score_t,\n        y_dc_levels: Arr(16, int16_t),\n        y_ac_levels: ArrM(new Array(16, 16), int16_t),\n        uv_levels: ArrM(new Array(4 + 4, 16), int16_t),\n        mode_i16: int,\n        modes_i4: Arr(16, int),\n        mode_uv: int,\n        nz: uint32_t\n    };\n    var bV = {\n        x_: int,\n        y_: int,\n        y_offset_: int,\n        uv_offset_: int,\n        y_stride_: int,\n        uv_stride_: int,\n        yuv_in_: uint8_t,\n        yuv_in_off: 0,\n        yuv_out_: uint8_t,\n        yuv_out_off: 0,\n        yuv_out2_: uint8_t,\n        yuv_out2_off: 0,\n        yuv_p_: uint8_t,\n        yuv_p_off: 0,\n        enc_: newObjectIt(bT),\n        mb_: newObjectIt(bQ),\n        mb_off: 0,\n        bw_: newObjectIt(Y),\n        preds_: uint8_t,\n        preds_off: 0,\n        nz_: uint32_t,\n        nz_off: 0,\n        i4_boundary_: Arr(37, uint8_t),\n        i4_boundary_off: 0,\n        i4_top_: uint8_t,\n        i4_top_off: 0,\n        i4_: int,\n        top_nz_: Arr(9, int),\n        left_nz_: Arr(9, int),\n        bit_count_: ArrM(Array(4, 3), uint64_t),\n        luma_bits_: uint64_t,\n        uv_bits_: uint64_t,\n        lf_stats_: newObjectIt(bM),\n        do_trellis_: int,\n        done_: int\n    };\n    var bW = 8192;\n\n    function CompressAlpha(a, b, c, d, e, f) {\n        var g = WebPZlib.compress(a.slice(b, b + c), (f ? 3 : 6));\n        d.val = g;\n        e.val = g.length;\n        return 1\n    }\n\n    function VP8EncInitAlpha(a) {\n        a.has_alpha_ = (a.pic_.a != null) + 0;\n        a.alpha_data_ = null;\n        a.alpha_data_size_ = 0\n    }\n\n    function VP8EncCodeAlphaBlock(a) {}\n\n    function VP8EncFinishAlpha(a) {\n        if (a.has_alpha_) {\n            var b = a.pic_;\n            assert(b.a);\n            a.alpha_data_ = {\n                val: a.alpha_data_\n            };\n            a.alpha_data_size_ = {\n                val: a.alpha_data_size\n            };\n            if (!CompressAlpha(b.a, 0, b.width * b.height, a.alpha_data_, a.alpha_data_size_, a.config_.alpha_compression)) {\n                return 0\n            }\n            a.alpha_data_ = a.alpha_data_.val;\n            a.alpha_data_size_ = a.alpha_data_size_.val\n        }\n        return 1\n    }\n\n    function VP8EncDeleteAlpha(a) {\n        a.alpha_data_ = '';\n        a.alpha_data_ = null;\n        a.alpha_data_size_ = 0;\n        a.has_alpha_ = 0\n    }\n\n    function VP8EncInitLayer(a) {\n        a.use_layer_ = (a.pic_.u0 != null) + 0;\n        a.layer_data_size_ = 0;\n        a.layer_data_ = null;\n        if (a.use_layer_) {\n            VP8BitWriterInit(a.layer_bw_, a.mb_w_ * a.mb_h_ * 3)\n        }\n    }\n\n    function VP8EncCodeLayerBlock(a) {}\n\n    function VP8EncFinishLayer(a) {\n        if (a.use_layer_) {\n            a.layer_data_ = VP8BitWriterFinish(a.layer_bw_);\n            a.layer_data_size_ = VP8BitWriterSize(a.layer_bw_)\n        }\n        return 1\n    }\n\n    function VP8EncDeleteLayer(a) {\n        a.layer_data_ = ''\n    }\n    var bX = 0x9d012a;\n    var bY = 10;\n    var bZ = 20;\n    var ca = (bZ - 8);\n    var cb = (1 << 19);\n    var cc = (1 << 24);\n\n    function PutLE32(a, b, c) {\n        a[b + 0] = (c >> 0) & 0xff;\n        a[b + 1] = (c >> 8) & 0xff;\n        a[b + 2] = (c >> 16) & 0xff;\n        a[b + 3] = (c >> 24) & 0xff\n    }\n\n    function PutHeader(a, b, c, d) {\n        var e = Arr(bY, uint8_t);\n        var f = new Array('R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P', 'V', 'P', '8', ' ');\n        var g = uint32_t;\n        if (b >= cb) {\n            return WebPEncodingSetError(d, VP8_ENC_ERROR_PARTITION0_OVERFLOW)\n        }\n        for (var i = 0; i < f.length; ++i) {\n            f[i] = f[i] != '0' ? String(f[i]).charCodeAt(0) : 0\n        }\n        PutLE32(f, +4, c + ca);\n        PutLE32(f, +16, c);\n        if (!d.writer(f, sizeof(f) * f.length, d)) {\n            return WebPEncodingSetError(d, VP8_ENC_ERROR_BAD_WRITE)\n        }\n        g = 0 | (a << 1) | (1 << 4) | (b << 5);\n        e[0] = g & 0xff;\n        e[1] = (g >> 8) & 0xff;\n        e[2] = (g >> 16) & 0xff;\n        e[3] = (bX >> 16) & 0xff;\n        e[4] = (bX >> 8) & 0xff;\n        e[5] = (bX >> 0) & 0xff;\n        e[6] = d.width & 0xff;\n        e[7] = d.width >> 8;\n        e[8] = d.height & 0xff;\n        e[9] = d.height >> 8;\n        return d.writer(e, sizeof(e) * e.length, d)\n    }\n\n    function PutSegmentHeader(a, b) {\n        var c = b.segment_hdr_;\n        var d = b.proba_;\n        if (VP8PutBitUniform(a, (c.num_segments_ > 1))) {\n            var e = 1;\n            var s;\n            VP8PutBitUniform(a, c.update_map_);\n            if (VP8PutBitUniform(a, e)) {\n                VP8PutBitUniform(a, 1);\n                for (s = 0; s < be; ++s) {\n                    VP8PutSignedValue(a, b.dqm_[s].quant_, 7)\n                }\n                for (s = 0; s < be; ++s) {\n                    VP8PutSignedValue(a, b.dqm_[s].fstrength_, 6)\n                }\n            }\n            if (c.update_map_) {\n                for (s = 0; s < 3; ++s) {\n                    if (VP8PutBitUniform(a, (d.segments_[s] != 255))) {\n                        VP8PutValue(a, d.segments_[s], 8)\n                    }\n                }\n            }\n        }\n    }\n\n    function PutFilterHeader(a, b) {\n        var c = (b.i4x4_lf_delta_ != 0) + 0;\n        VP8PutBitUniform(a, b.simple_);\n        VP8PutValue(a, b.level_, 6);\n        VP8PutValue(a, b.sharpness_, 3);\n        if (VP8PutBitUniform(a, c)) {\n            var d = (b.i4x4_lf_delta_ != 0);\n            if (VP8PutBitUniform(a, d)) {\n                VP8PutValue(a, 0, 4);\n                VP8PutSignedValue(a, b.i4x4_lf_delta_, 6);\n                VP8PutValue(a, 0, 3)\n            }\n        }\n    }\n\n    function PutQuant(a, b) {\n        VP8PutValue(a, b.base_quant_, 7);\n        VP8PutSignedValue(a, b.dq_y1_dc_, 4);\n        VP8PutSignedValue(a, b.dq_y2_dc_, 4);\n        VP8PutSignedValue(a, b.dq_y2_ac_, 4);\n        VP8PutSignedValue(a, b.dq_uv_dc_, 4);\n        VP8PutSignedValue(a, b.dq_uv_ac_, 4)\n    }\n\n    function EmitPartitionsSize(a, b) {\n        var c = Arr(3 * (MAX_NUM_PARTITIONS - 1), uint8_t);\n        var p;\n        for (p = 0; p < a.num_parts_ - 1; ++p) {\n            var d = VP8BitWriterSize(a.parts_[p]);\n            if (d >= cc) {\n                return WebPEncodingSetError(b, VP8_ENC_ERROR_PARTITION_OVERFLOW)\n            }\n            c[3 * p + 0] = (d >> 0) & 0xff;\n            c[3 * p + 1] = (d >> 8) & 0xff;\n            c[3 * p + 2] = (d >> 16) & 0xff\n        }\n        return p ? b.writer(c, 3 * p, b) : 1\n    }\n    var cd = 8;\n\n    function PutLE24(a, b, c) {\n        a[b + 0] = (c >> 0) & 0xff;\n        a[b + 1] = (c >> 8) & 0xff;\n        a[b + 2] = (c >> 16) & 0xff\n    }\n\n    function WriteExtensions(a) {\n        var b = Arr(cd, uint8_t);\n        var c = a.bw_;\n        var d = a.pic_;\n        PutLE24(b, +0, a.layer_data_size_);\n        b[3] = a.pic_.colorspace & WEBP_CSP_UV_MASK;\n        if (a.layer_data_size_ > 0) {\n            assert(a.use_layer_);\n            if (!VP8BitWriterAppend(a.parts_[a.num_parts_ - 1], a.layer_data_, a.layer_data_off, a.layer_data_size_)) {\n                return WebPEncodingSetError(d, VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY)\n            }\n        }\n        PutLE24(b, +4, a.alpha_data_size_);\n        if (a.alpha_data_size_ > 0) {\n            assert(a.has_alpha_);\n            if (!VP8BitWriterAppend(c, a.alpha_data_, a.alpha_data_off, a.alpha_data_size_)) {\n                return WebPEncodingSetError(d, VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY)\n            }\n        }\n        b[cd - 1] = 0x01;\n        if (!VP8BitWriterAppend(c, b, 0, cd)) {\n            return WebPEncodingSetError(d, VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY)\n        }\n        return 1\n    }\n\n    function GeneratePartition0(a) {\n        var b = a.bw_;\n        var c = a.mb_w_ * a.mb_h_;\n        var d = uint64_t,\n            pos2 = uint64_t,\n            pos3 = uint64_t;\n        var e = a.has_alpha_ || a.use_layer_;\n        d = VP8BitWriterPos(b);\n        VP8BitWriterInit(b, parseInt(c * 7 / 8));\n        VP8PutBitUniform(b, e);\n        VP8PutBitUniform(b, 0);\n        PutSegmentHeader(b, a);\n        PutFilterHeader(b, a.filter_hdr_);\n        VP8PutValue(b, a.config_.partitions, 2);\n        PutQuant(b, a);\n        VP8PutBitUniform(b, 0);\n        VP8WriteProbas(b, a.proba_);\n        pos2 = VP8BitWriterPos(b);\n        VP8CodeIntraModes(a);\n        VP8BitWriterFinish(b);\n        if (e && !WriteExtensions(a)) {\n            return 0\n        }\n        pos3 = VP8BitWriterPos(b);\n        if (a.pic_.stats_nozero) {\n            a.pic_.stats.header_bytes[0] = parseInt((pos2 - d + 7) >> 3);\n            a.pic_.stats.header_bytes[1] = parseInt((pos3 - pos2 + 7) >> 3);\n            a.pic_.stats.alpha_data_size = a.alpha_data_size_;\n            a.pic_.stats.layer_data_size = a.layer_data_size_\n        }\n        return !b.error_\n    }\n\n    function VP8EncWrite(a) {\n        var b = a.pic_;\n        var c = a.bw_;\n        var d = 0;\n        var e = size_t,\n            pad = size_t;\n        var p;\n        d = GeneratePartition0(a);\n        e = bY + VP8BitWriterSize(c) + 3 * (a.num_parts_ - 1);\n        for (p = 0; p < a.num_parts_; ++p) {\n            e += VP8BitWriterSize(a.parts_[p])\n        }\n        pad = e & 1;\n        e += pad; {\n            var f = VP8BitWriterBuf(c);\n            var g = VP8BitWriterSize(c);\n            d = d && PutHeader(a.profile_, g, e, b) && b.writer(f, g, b) && EmitPartitionsSize(a, b);\n            f = ''\n        }\n        for (p = 0; p < a.num_parts_; ++p) {\n            var h = VP8BitWriterBuf(a.parts_[p]);\n            var i = VP8BitWriterSize(a.parts_[p]);\n            if (i) d = d && b.writer(h, i, b);\n            h = ''\n        }\n        if (d && pad) {\n            var j = new Array(0);\n            d = b.writer(j, 1, b)\n        }\n        a.coded_size_ = e + bZ;\n        return d\n    }\n    var ce = Arr(255 + 255 + 1, uint8_t);\n    var cf = Arr(255 + 255 + 1, uint8_t);\n    var cg = Arr(1020 + 1020 + 1, int8_t);\n    var ci = Arr(112 + 112 + 1, int8_t);\n    var cj = Arr(255 + 510 + 1, uint8_t);\n    var ck = 0;\n\n    function InitTables(a) {\n        if (!ck) {\n            var i;\n            for (i = -255; i <= 255; ++i) {\n                ce[255 + i] = (i < 0) ? -i : i;\n                cf[255 + i] = ce[255 + i] >> 1\n            }\n            for (i = -1020; i <= 1020; ++i) {\n                cg[1020 + i] = (i < -128) ? -128 : (i > 127) ? 127 : i\n            }\n            for (i = -112; i <= 112; ++i) {\n                ci[112 + i] = (i < -16) ? -16 : (i > 15) ? 15 : i\n            }\n            for (i = -255; i <= 255 + 255; ++i) {\n                cj[255 + i] = (i < 0) ? 0 : (i > 255) ? 255 : i\n            }\n            ck = 1\n        }\n    }\n\n    function do_filter2(p, b, c) {\n        var d = p[b - 2 * c],\n            p0 = p[b - c],\n            q0 = p[b + 0],\n            q1 = p[b + c];\n        var a = 3 * (q0 - p0) + cg[1020 + d - q1];\n        var e = ci[112 + ((a + 4) >> 3)];\n        var f = ci[112 + ((a + 3) >> 3)];\n        p[b - c] = cj[255 + p0 + f];\n        p[b + 0] = cj[255 + q0 - e]\n    }\n\n    function do_filter4(p, b, c) {\n        var d = p[b - 2 * c],\n            p0 = p[b - c],\n            q0 = p[b + 0],\n            q1 = p[b + c];\n        var a = 3 * (q0 - p0);\n        var e = ci[112 + ((a + 4) >> 3)];\n        var f = ci[112 + ((a + 3) >> 3)];\n        var g = (e + 1) >> 1;\n        p[b - 2 * c] = cj[255 + d + g];\n        p[b - c] = cj[255 + p0 + f];\n        p[b + 0] = cj[255 + q0 - e];\n        p[b + c] = cj[255 + q1 - g]\n    }\n\n    function hev(p, a, b, c) {\n        var d = p[a - 2 * b],\n            p0 = p[a - b],\n            q0 = p[a + 0],\n            q1 = p[a + b];\n        return (ce[255 + d - p0] > c) || (ce[255 + q1 - q0] > c)\n    }\n\n    function needs_filter(p, a, b, c) {\n        var d = p[a - 2 * b],\n            p0 = p[a - b],\n            q0 = p[a + 0],\n            q1 = p[a + b];\n        return (2 * ce[255 + p0 - q0] + cf[255 + d - q1]) <= c\n    }\n\n    function needs_filter2(p, a, b, t, c) {\n        var d = p[a - 4 * b],\n            p2 = p[a - 3 * b],\n            p1 = p[a - 2 * b],\n            p0 = p[a - b];\n        var e = p[a + 0],\n            q1 = p[a + b],\n            q2 = p[a + 2 * b],\n            q3 = p[a + 3 * b];\n        if ((2 * ce[255 + p0 - e] + cf[255 + p1 - q1]) > t) return 0;\n        return ce[255 + d - p2] <= c && ce[255 + p2 - p1] <= c && ce[255 + p1 - p0] <= c && ce[255 + q3 - q2] <= c && ce[255 + q2 - q1] <= c && ce[255 + q1 - e] <= c\n    }\n\n    function SimpleVFilter16(p, a, b, c) {\n        var i;\n        for (i = 0; i < 16; ++i) {\n            if (needs_filter(p, a + i, b, c)) {\n                do_filter2(p, a + i, b)\n            }\n        }\n    }\n\n    function SimpleHFilter16(p, a, b, c) {\n        var i;\n        for (i = 0; i < 16; ++i) {\n            if (needs_filter(p, a + i * b, 1, c)) {\n                do_filter2(p, a + i * b, 1)\n            }\n        }\n    }\n\n    function SimpleVFilter16i(p, a, b, c) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4 * b;\n            SimpleVFilter16(p, a, b, c)\n        }\n    }\n\n    function SimpleHFilter16i(p, a, b, c) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4;\n            SimpleHFilter16(p, a, b, c)\n        }\n    }\n\n    function FilterLoop24(p, a, b, c, d, e, f, g) {\n        while (d-- > 0) {\n            if (needs_filter2(p, a, b, e, f)) {\n                if (hev(p, a, b, g)) {\n                    do_filter2(p, a, b)\n                } else {\n                    do_filter4(p, a, b)\n                }\n            }\n            a += c\n        }\n    }\n\n    function VFilter16i(p, a, b, c, d, e) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4 * b;\n            FilterLoop24(p, a, b, 1, 16, c, d, e)\n        }\n    }\n\n    function HFilter16i(p, a, b, c, d, e) {\n        var k;\n        for (k = 3; k > 0; --k) {\n            a += 4;\n            FilterLoop24(p, a, 1, b, 16, c, d, e)\n        }\n    }\n\n    function VFilter8i(u, a, v, b, c, d, e, f) {\n        FilterLoop24(u, a + 4 * c, c, 1, 8, d, e, f);\n        FilterLoop24(v, b + 4 * c, c, 1, 8, d, e, f)\n    }\n\n    function HFilter8i(u, a, v, b, c, d, e, f) {\n        FilterLoop24(u, a + 4, 1, c, 8, d, e, f);\n        FilterLoop24(v, b + 4, 1, c, 8, d, e, f)\n    }\n\n    function VP8EncVFilter16i(p, a, b, c, d, e) {\n        VFilter16i(p, a, b, c, d, e)\n    };\n\n    function VP8EncHFilter16i(p, a, b, c, d, e) {\n        HFilter16i(p, a, b, c, d, e)\n    };\n\n    function VP8EncVFilter8i(u, a, v, b, c, d, e, f) {\n        VFilter8i(u, a, v, b, c, d, e, f)\n    };\n\n    function VP8EncHFilter8i(u, a, v, b, c, d, e, f) {\n        HFilter8i(u, a, v, b, c, d, e, f)\n    };\n\n    function VP8EncSimpleVFilter16i(p, a, b, c) {\n        SimpleVFilter16i(p, a, b, c)\n    };\n\n    function VP8EncSimpleHFilter16i(p, a, b, c) {\n        SimpleHFilter16i(p, a, b, c)\n    };\n\n    function GetILevel(a, b) {\n        if (a > 0) {\n            if (a > 4) {\n                b >>= 2\n            } else {\n                b >>= 1\n            }\n            if (b > 9 - a) {\n                b = 9 - a\n            }\n        }\n        if (b < 1) b = 1;\n        return b\n    }\n\n    function DoFilter(a, b) {\n        var c = a.enc_;\n        var d = GetILevel(c.config_.filter_sharpness, b);\n        var e = 2 * b + d;\n        var f = a.yuv_out2_;\n        var g = a.yuv_out2_off + bk;\n        var h = a.yuv_out2_;\n        var i = a.yuv_out2_off + bl;\n        var j = a.yuv_out2_;\n        var k = a.yuv_out2_off + bm;\n        memcpy(f, g, a.yuv_out_, a.yuv_out_off, bi * sizeof(uint8_t));\n        if (c.filter_hdr_.simple_ == 1) {\n            VP8EncSimpleHFilter16i(f, g, bf, e);\n            VP8EncSimpleVFilter16i(f, g, bf, e)\n        } else {\n            var l = (b >= 40) ? 2 : (b >= 15) ? 1 : 0;\n            VP8EncHFilter16i(f, g, bf, e, d, l);\n            VP8EncHFilter8i(h, i, j, k, bf, e, d, l);\n            VP8EncVFilter16i(f, g, bf, e, d, l);\n            VP8EncVFilter8i(h, i, j, k, bf, e, d, l)\n        }\n    }\n    var cl = 3;\n    var cm = {\n        w: double,\n        xm: double,\n        ym: double,\n        xxm: double,\n        xym: double,\n        yym: double\n    };\n\n    function Accumulate(a, b, c, d, e, f, g, h, W, H, i) {\n        var j = (h - cl < 0) ? 0 : h - cl;\n        var k = (h + cl > H - 1) ? H - 1 : h + cl;\n        var l = (g - cl < 0) ? 0 : g - cl;\n        var m = (g + cl > W - 1) ? W - 1 : g + cl;\n        var x, y;\n        b += j * c;\n        e += j * f;\n        for (y = j; y <= k; ++y, b += c, e += f) {\n            for (x = l; x <= m; ++x) {\n                var n = a[b + x];\n                var o = d[e + x];\n                i.w += 1;\n                i.xm += n;\n                i.ym += o;\n                i.xxm += n * n;\n                i.xym += n * o;\n                i.yym += o * o\n            }\n        }\n    }\n\n    function GetSSIM(a) {\n        var b = a.xm * a.xm;\n        var c = a.ym * a.ym;\n        var d = a.xm * a.ym;\n        var e = a.w * a.w;\n        var f = a.xxm * a.w - b;\n        var g = a.yym * a.w - c;\n        var h = a.xym * a.w - d;\n        var i = double,\n            C2 = double;\n        var j = double;\n        var k = double;\n        if (f < 0.) f = 0.;\n        if (g < 0.) g = 0.;\n        i = 6.5025 * e;\n        C2 = 58.5225 * e;\n        j = (2 * d + i) * (2 * h + C2);\n        k = (b + c + i) * (f + g + C2);\n        return (k != 0) ? j / k : 0.\n    }\n\n    function GetMBSSIM(a, b, c, d) {\n        var x, y;\n        var s = {\n            w: double,\n            xm: double,\n            ym: double,\n            xxm: double,\n            xym: double,\n            yym: double\n        };\n        for (x = 3; x < 13; x++) {\n            for (y = 3; y < 13; y++) {\n                Accumulate(a, b + bk, bf, c, d + bk, bf, x, y, 16, 16, s)\n            }\n        }\n        for (x = 1; x < 7; x++) {\n            for (y = 1; y < 7; y++) {\n                Accumulate(a, b + bl, bf, c, d + bl, bf, x, y, 8, 8, s);\n                Accumulate(a, b + bm, bf, c, d + bm, bf, x, y, 8, 8, s)\n            }\n        }\n        return GetSSIM(s)\n    }\n\n    function VP8InitFilter(a) {\n        var s, i;\n        if (!a.lf_stats_) return;\n        InitTables();\n        for (s = 0; s < be; s++) {\n            for (i = 0; i < MAX_LF_LEVELS; i++) {\n                a.lf_stats_[s][i] = 0\n            }\n        }\n    }\n\n    function VP8StoreFilterStats(a) {\n        var d = int;\n        var s = a.mb_[a.mb_off].segment_;\n        var b = a.enc_.dqm_[s].fstrength_;\n        var c = -a.enc_.dqm_[s].quant_;\n        var e = a.enc_.dqm_[s].quant_;\n        var f = (e - c >= 4) ? 4 : 1;\n        if (!a.lf_stats_) return;\n        if (a.mb_[a.mb_off].type_ == 1 && a.mb_[a.mb_off].skip_) return;\n        a.lf_stats_[s][0] += GetMBSSIM(a.yuv_in_, a.yuv_in_off, a.yuv_out_, a.yuv_out_off);\n        for (d = c; d <= e; d += f) {\n            var g = b + d;\n            if (g <= 0 || g >= MAX_LF_LEVELS) {\n                continue\n            }\n            DoFilter(a, g);\n            a.lf_stats_[s][g] += GetMBSSIM(a.yuv_in_, a.yuv_in_off, a.yuv_out2_, a.yuv_out2_off)\n        }\n    }\n\n    function VP8AdjustFilterStrength(a) {\n        var s;\n        var b = a.enc_;\n        if (!a.lf_stats_) {\n            return\n        }\n        for (s = 0; s < be; s++) {\n            var i, best_level = 0;\n            var c = 1.00001 * a.lf_stats_[s][0];\n            for (i = 1; i < MAX_LF_LEVELS; i++) {\n                var v = a.lf_stats_[s][i];\n                if (v > c) {\n                    c = v;\n                    best_level = i\n                }\n            }\n            b.dqm_[s].fstrength_ = best_level\n        }\n    }\n\n    function BitWriterResize(a, b) {\n        var c = uint8_t;\n        var d = 0;\n        var e = size_t;\n        var f = a.pos_ + b;\n        if (f <= a.max_pos_) return 1;\n        e = 2 * a.max_pos_;\n        if (e < f) e = f;\n        if (e < 1024) e = 1024;\n        c = malloc(e, uint8_t);\n        if (c == null) {\n            a.error_ = 1;\n            return 0\n        }\n        if (a.pos_ > 0) memcpy(c, d, a.buf_, a.buf_off, a.pos_);\n        a.buf_ = '';\n        a.buf_ = c;\n        a.buf_off = d;\n        a.max_pos_ = e;\n        return 1\n    }\n\n    function kFlush(a) {\n        var s = 8 + a.nb_bits_;\n        var b = a.value_ >> s;\n        assert(a.nb_bits_ >= 0);\n        a.value_ -= b << s;\n        a.nb_bits_ -= 8;\n        if ((b & 0xff) != 0xff) {\n            var c = a.pos_;\n            if (c + a.run_ >= a.max_pos_) {\n                if (!BitWriterResize(a, a.run_ + 1)) {\n                    return\n                }\n            }\n            if (b & 0x100) {\n                if (c > 0) a.buf_[c - 1]++\n            }\n            if (a.run_ > 0) {\n                var d = (b & 0x100) ? 0x00 : 0xff;\n                for (; a.run_ > 0; --a.run_) a.buf_[c++] = d\n            }\n            a.buf_[c++] = (b > 255 ? b - 256 : b);\n            a.pos_ = c\n        } else {\n            a.run_++\n        }\n    }\n    var cn = new Array(7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0);\n    var co = new Array(127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239, 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 127);\n\n    function VP8PutBit(a, b, c) {\n        b = b ? 1 : 0;\n        var d = (a.range_ * c) >> 8;\n        if (b) {\n            a.value_ += d + 1;\n            a.range_ -= d + 1\n        } else {\n            a.range_ = d\n        }\n        if (a.range_ < 127) {\n            var e = cn[a.range_];\n            a.range_ = co[a.range_];\n            a.value_ <<= e;\n            a.nb_bits_ += e;\n            if (a.nb_bits_ > 0) kFlush(a)\n        }\n        return b\n    }\n\n    function VP8PutBitUniform(a, b) {\n        b = b ? 1 : 0;\n        var c = a.range_ >> 1;\n        if (b) {\n            a.value_ += c + 1;\n            a.range_ -= c + 1\n        } else {\n            a.range_ = c\n        }\n        if (a.range_ < 127) {\n            a.range_ = co[a.range_];\n            a.value_ <<= 1;\n            a.nb_bits_ += 1;\n            if (a.nb_bits_ > 0) kFlush(a)\n        }\n        return b\n    }\n\n    function VP8PutValue(a, b, c) {\n        var d;\n        for (d = 1 << (c - 1); d; d >>= 1) VP8PutBitUniform(a, b & d)\n    }\n\n    function VP8PutSignedValue(a, b, c) {\n        if (!VP8PutBitUniform(a, b != 0)) return;\n        if (b < 0) {\n            VP8PutValue(a, ((-b) << 1) | 1, c + 1)\n        } else {\n            VP8PutValue(a, b << 1, c + 1)\n        }\n    }\n\n    function VP8BitWriterInit(a, b) {\n        a.range_ = 255 - 1;\n        a.value_ = 0;\n        a.run_ = 0;\n        a.nb_bits_ = -8;\n        a.pos_ = 0;\n        a.max_pos_ = 0;\n        a.error_ = 0;\n        a.buf_ = null;\n        return (b > 0) ? BitWriterResize(a, b) : 1\n    }\n\n    function VP8BitWriterFinish(a) {\n        VP8PutValue(a, 0, 9 - a.nb_bits_);\n        a.nb_bits_ = 0;\n        kFlush(a);\n        return a.buf_\n    }\n\n    function VP8BitWriterAppend(a, b, c, d) {\n        assert(b);\n        if (a.nb_bits_ != -8) return 0;\n        if (!BitWriterResize(a, d)) return 0;\n        memcpy(a.buf_, a.buf_off + a.pos_, b, c, d);\n        a.pos_ += d;\n        return 1\n    }\n\n    function VP8BitCost(a, b) {\n        return !a ? cp[b] : cp[255 - b]\n    }\n\n    function VP8BranchCost(a, b, c) {\n        return a * VP8BitCost(1, c) + (b - a) * VP8BitCost(0, c)\n    }\n\n    function VP8LevelCost(a, b) {\n        return cr[b] + a[b > MAX_VARIABLE_LEVEL ? MAX_VARIABLE_LEVEL : b]\n    }\n    var cp = new Array(1792, 1792, 1792, 1536, 1536, 1408, 1366, 1280, 1280, 1216, 1178, 1152, 1110, 1076, 1061, 1024, 1024, 992, 968, 951, 939, 911, 896, 878, 871, 854, 838, 820, 811, 794, 786, 768, 768, 752, 740, 732, 720, 709, 704, 690, 683, 672, 666, 655, 647, 640, 631, 622, 615, 607, 598, 592, 586, 576, 572, 564, 559, 555, 547, 541, 534, 528, 522, 512, 512, 504, 500, 494, 488, 483, 477, 473, 467, 461, 458, 452, 448, 443, 438, 434, 427, 424, 419, 415, 410, 406, 403, 399, 394, 390, 384, 384, 377, 374, 370, 366, 362, 359, 355, 351, 347, 342, 342, 336, 333, 330, 326, 323, 320, 316, 312, 308, 305, 302, 299, 296, 293, 288, 287, 283, 280, 277, 274, 272, 268, 266, 262, 256, 256, 256, 251, 248, 245, 242, 240, 237, 234, 232, 228, 226, 223, 221, 218, 216, 214, 211, 208, 205, 203, 201, 198, 196, 192, 191, 188, 187, 183, 181, 179, 176, 175, 171, 171, 168, 165, 163, 160, 159, 156, 154, 152, 150, 148, 146, 144, 142, 139, 138, 135, 133, 131, 128, 128, 125, 123, 121, 119, 117, 115, 113, 111, 110, 107, 105, 103, 102, 100, 98, 96, 94, 92, 91, 89, 86, 86, 83, 82, 80, 77, 76, 74, 73, 71, 69, 67, 66, 64, 63, 61, 59, 57, 55, 54, 52, 51, 49, 47, 46, 44, 43, 41, 40, 38, 36, 35, 33, 32, 30, 29, 27, 25, 24, 22, 21, 19, 18, 16, 15, 13, 12, 10, 9, 7, 6, 4, 3);\n    var cq = new Array(new Array(0x001, 0x000), new Array(0x007, 0x001), new Array(0x00f, 0x005), new Array(0x00f, 0x00d), new Array(0x033, 0x003), new Array(0x033, 0x003), new Array(0x033, 0x023), new Array(0x033, 0x023), new Array(0x033, 0x023), new Array(0x033, 0x023), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x153));\n    var cr = new Array(0, 256, 256, 256, 256, 432, 618, 630, 731, 640, 640, 828, 901, 948, 1021, 1101, 1174, 1221, 1294, 1042, 1085, 1115, 1158, 1202, 1245, 1275, 1318, 1337, 1380, 1410, 1453, 1497, 1540, 1570, 1613, 1280, 1295, 1317, 1332, 1358, 1373, 1395, 1410, 1454, 1469, 1491, 1506, 1532, 1547, 1569, 1584, 1601, 1616, 1638, 1653, 1679, 1694, 1716, 1731, 1775, 1790, 1812, 1827, 1853, 1868, 1890, 1905, 1727, 1733, 1742, 1748, 1759, 1765, 1774, 1780, 1800, 1806, 1815, 1821, 1832, 1838, 1847, 1853, 1878, 1884, 1893, 1899, 1910, 1916, 1925, 1931, 1951, 1957, 1966, 1972, 1983, 1989, 1998, 2004, 2027, 2033, 2042, 2048, 2059, 2065, 2074, 2080, 2100, 2106, 2115, 2121, 2132, 2138, 2147, 2153, 2178, 2184, 2193, 2199, 2210, 2216, 2225, 2231, 2251, 2257, 2266, 2272, 2283, 2289, 2298, 2304, 2168, 2174, 2183, 2189, 2200, 2206, 2215, 2221, 2241, 2247, 2256, 2262, 2273, 2279, 2288, 2294, 2319, 2325, 2334, 2340, 2351, 2357, 2366, 2372, 2392, 2398, 2407, 2413, 2424, 2430, 2439, 2445, 2468, 2474, 2483, 2489, 2500, 2506, 2515, 2521, 2541, 2547, 2556, 2562, 2573, 2579, 2588, 2594, 2619, 2625, 2634, 2640, 2651, 2657, 2666, 2672, 2692, 2698, 2707, 2713, 2724, 2730, 2739, 2745, 2540, 2546, 2555, 2561, 2572, 2578, 2587, 2593, 2613, 2619, 2628, 2634, 2645, 2651, 2660, 2666, 2691, 2697, 2706, 2712, 2723, 2729, 2738, 2744, 2764, 2770, 2779, 2785, 2796, 2802, 2811, 2817, 2840, 2846, 2855, 2861, 2872, 2878, 2887, 2893, 2913, 2919, 2928, 2934, 2945, 2951, 2960, 2966, 2991, 2997, 3006, 3012, 3023, 3029, 3038, 3044, 3064, 3070, 3079, 3085, 3096, 3102, 3111, 3117, 2981, 2987, 2996, 3002, 3013, 3019, 3028, 3034, 3054, 3060, 3069, 3075, 3086, 3092, 3101, 3107, 3132, 3138, 3147, 3153, 3164, 3170, 3179, 3185, 3205, 3211, 3220, 3226, 3237, 3243, 3252, 3258, 3281, 3287, 3296, 3302, 3313, 3319, 3328, 3334, 3354, 3360, 3369, 3375, 3386, 3392, 3401, 3407, 3432, 3438, 3447, 3453, 3464, 3470, 3479, 3485, 3505, 3511, 3520, 3526, 3537, 3543, 3552, 3558, 2816, 2822, 2831, 2837, 2848, 2854, 2863, 2869, 2889, 2895, 2904, 2910, 2921, 2927, 2936, 2942, 2967, 2973, 2982, 2988, 2999, 3005, 3014, 3020, 3040, 3046, 3055, 3061, 3072, 3078, 3087, 3093, 3116, 3122, 3131, 3137, 3148, 3154, 3163, 3169, 3189, 3195, 3204, 3210, 3221, 3227, 3236, 3242, 3267, 3273, 3282, 3288, 3299, 3305, 3314, 3320, 3340, 3346, 3355, 3361, 3372, 3378, 3387, 3393, 3257, 3263, 3272, 3278, 3289, 3295, 3304, 3310, 3330, 3336, 3345, 3351, 3362, 3368, 3377, 3383, 3408, 3414, 3423, 3429, 3440, 3446, 3455, 3461, 3481, 3487, 3496, 3502, 3513, 3519, 3528, 3534, 3557, 3563, 3572, 3578, 3589, 3595, 3604, 3610, 3630, 3636, 3645, 3651, 3662, 3668, 3677, 3683, 3708, 3714, 3723, 3729, 3740, 3746, 3755, 3761, 3781, 3787, 3796, 3802, 3813, 3819, 3828, 3834, 3629, 3635, 3644, 3650, 3661, 3667, 3676, 3682, 3702, 3708, 3717, 3723, 3734, 3740, 3749, 3755, 3780, 3786, 3795, 3801, 3812, 3818, 3827, 3833, 3853, 3859, 3868, 3874, 3885, 3891, 3900, 3906, 3929, 3935, 3944, 3950, 3961, 3967, 3976, 3982, 4002, 4008, 4017, 4023, 4034, 4040, 4049, 4055, 4080, 4086, 4095, 4101, 4112, 4118, 4127, 4133, 4153, 4159, 4168, 4174, 4185, 4191, 4200, 4206, 4070, 4076, 4085, 4091, 4102, 4108, 4117, 4123, 4143, 4149, 4158, 4164, 4175, 4181, 4190, 4196, 4221, 4227, 4236, 4242, 4253, 4259, 4268, 4274, 4294, 4300, 4309, 4315, 4326, 4332, 4341, 4347, 4370, 4376, 4385, 4391, 4402, 4408, 4417, 4423, 4443, 4449, 4458, 4464, 4475, 4481, 4490, 4496, 4521, 4527, 4536, 4542, 4553, 4559, 4568, 4574, 4594, 4600, 4609, 4615, 4626, 4632, 4641, 4647, 3515, 3521, 3530, 3536, 3547, 3553, 3562, 3568, 3588, 3594, 3603, 3609, 3620, 3626, 3635, 3641, 3666, 3672, 3681, 3687, 3698, 3704, 3713, 3719, 3739, 3745, 3754, 3760, 3771, 3777, 3786, 3792, 3815, 3821, 3830, 3836, 3847, 3853, 3862, 3868, 3888, 3894, 3903, 3909, 3920, 3926, 3935, 3941, 3966, 3972, 3981, 3987, 3998, 4004, 4013, 4019, 4039, 4045, 4054, 4060, 4071, 4077, 4086, 4092, 3956, 3962, 3971, 3977, 3988, 3994, 4003, 4009, 4029, 4035, 4044, 4050, 4061, 4067, 4076, 4082, 4107, 4113, 4122, 4128, 4139, 4145, 4154, 4160, 4180, 4186, 4195, 4201, 4212, 4218, 4227, 4233, 4256, 4262, 4271, 4277, 4288, 4294, 4303, 4309, 4329, 4335, 4344, 4350, 4361, 4367, 4376, 4382, 4407, 4413, 4422, 4428, 4439, 4445, 4454, 4460, 4480, 4486, 4495, 4501, 4512, 4518, 4527, 4533, 4328, 4334, 4343, 4349, 4360, 4366, 4375, 4381, 4401, 4407, 4416, 4422, 4433, 4439, 4448, 4454, 4479, 4485, 4494, 4500, 4511, 4517, 4526, 4532, 4552, 4558, 4567, 4573, 4584, 4590, 4599, 4605, 4628, 4634, 4643, 4649, 4660, 4666, 4675, 4681, 4701, 4707, 4716, 4722, 4733, 4739, 4748, 4754, 4779, 4785, 4794, 4800, 4811, 4817, 4826, 4832, 4852, 4858, 4867, 4873, 4884, 4890, 4899, 4905, 4769, 4775, 4784, 4790, 4801, 4807, 4816, 4822, 4842, 4848, 4857, 4863, 4874, 4880, 4889, 4895, 4920, 4926, 4935, 4941, 4952, 4958, 4967, 4973, 4993, 4999, 5008, 5014, 5025, 5031, 5040, 5046, 5069, 5075, 5084, 5090, 5101, 5107, 5116, 5122, 5142, 5148, 5157, 5163, 5174, 5180, 5189, 5195, 5220, 5226, 5235, 5241, 5252, 5258, 5267, 5273, 5293, 5299, 5308, 5314, 5325, 5331, 5340, 5346, 4604, 4610, 4619, 4625, 4636, 4642, 4651, 4657, 4677, 4683, 4692, 4698, 4709, 4715, 4724, 4730, 4755, 4761, 4770, 4776, 4787, 4793, 4802, 4808, 4828, 4834, 4843, 4849, 4860, 4866, 4875, 4881, 4904, 4910, 4919, 4925, 4936, 4942, 4951, 4957, 4977, 4983, 4992, 4998, 5009, 5015, 5024, 5030, 5055, 5061, 5070, 5076, 5087, 5093, 5102, 5108, 5128, 5134, 5143, 5149, 5160, 5166, 5175, 5181, 5045, 5051, 5060, 5066, 5077, 5083, 5092, 5098, 5118, 5124, 5133, 5139, 5150, 5156, 5165, 5171, 5196, 5202, 5211, 5217, 5228, 5234, 5243, 5249, 5269, 5275, 5284, 5290, 5301, 5307, 5316, 5322, 5345, 5351, 5360, 5366, 5377, 5383, 5392, 5398, 5418, 5424, 5433, 5439, 5450, 5456, 5465, 5471, 5496, 5502, 5511, 5517, 5528, 5534, 5543, 5549, 5569, 5575, 5584, 5590, 5601, 5607, 5616, 5622, 5417, 5423, 5432, 5438, 5449, 5455, 5464, 5470, 5490, 5496, 5505, 5511, 5522, 5528, 5537, 5543, 5568, 5574, 5583, 5589, 5600, 5606, 5615, 5621, 5641, 5647, 5656, 5662, 5673, 5679, 5688, 5694, 5717, 5723, 5732, 5738, 5749, 5755, 5764, 5770, 5790, 5796, 5805, 5811, 5822, 5828, 5837, 5843, 5868, 5874, 5883, 5889, 5900, 5906, 5915, 5921, 5941, 5947, 5956, 5962, 5973, 5979, 5988, 5994, 5858, 5864, 5873, 5879, 5890, 5896, 5905, 5911, 5931, 5937, 5946, 5952, 5963, 5969, 5978, 5984, 6009, 6015, 6024, 6030, 6041, 6047, 6056, 6062, 6082, 6088, 6097, 6103, 6114, 6120, 6129, 6135, 6158, 6164, 6173, 6179, 6190, 6196, 6205, 6211, 6231, 6237, 6246, 6252, 6263, 6269, 6278, 6284, 6309, 6315, 6324, 6330, 6341, 6347, 6356, 6362, 6382, 6388, 6397, 6403, 6414, 6420, 6429, 6435, 3515, 3521, 3530, 3536, 3547, 3553, 3562, 3568, 3588, 3594, 3603, 3609, 3620, 3626, 3635, 3641, 3666, 3672, 3681, 3687, 3698, 3704, 3713, 3719, 3739, 3745, 3754, 3760, 3771, 3777, 3786, 3792, 3815, 3821, 3830, 3836, 3847, 3853, 3862, 3868, 3888, 3894, 3903, 3909, 3920, 3926, 3935, 3941, 3966, 3972, 3981, 3987, 3998, 4004, 4013, 4019, 4039, 4045, 4054, 4060, 4071, 4077, 4086, 4092, 3956, 3962, 3971, 3977, 3988, 3994, 4003, 4009, 4029, 4035, 4044, 4050, 4061, 4067, 4076, 4082, 4107, 4113, 4122, 4128, 4139, 4145, 4154, 4160, 4180, 4186, 4195, 4201, 4212, 4218, 4227, 4233, 4256, 4262, 4271, 4277, 4288, 4294, 4303, 4309, 4329, 4335, 4344, 4350, 4361, 4367, 4376, 4382, 4407, 4413, 4422, 4428, 4439, 4445, 4454, 4460, 4480, 4486, 4495, 4501, 4512, 4518, 4527, 4533, 4328, 4334, 4343, 4349, 4360, 4366, 4375, 4381, 4401, 4407, 4416, 4422, 4433, 4439, 4448, 4454, 4479, 4485, 4494, 4500, 4511, 4517, 4526, 4532, 4552, 4558, 4567, 4573, 4584, 4590, 4599, 4605, 4628, 4634, 4643, 4649, 4660, 4666, 4675, 4681, 4701, 4707, 4716, 4722, 4733, 4739, 4748, 4754, 4779, 4785, 4794, 4800, 4811, 4817, 4826, 4832, 4852, 4858, 4867, 4873, 4884, 4890, 4899, 4905, 4769, 4775, 4784, 4790, 4801, 4807, 4816, 4822, 4842, 4848, 4857, 4863, 4874, 4880, 4889, 4895, 4920, 4926, 4935, 4941, 4952, 4958, 4967, 4973, 4993, 4999, 5008, 5014, 5025, 5031, 5040, 5046, 5069, 5075, 5084, 5090, 5101, 5107, 5116, 5122, 5142, 5148, 5157, 5163, 5174, 5180, 5189, 5195, 5220, 5226, 5235, 5241, 5252, 5258, 5267, 5273, 5293, 5299, 5308, 5314, 5325, 5331, 5340, 5346, 4604, 4610, 4619, 4625, 4636, 4642, 4651, 4657, 4677, 4683, 4692, 4698, 4709, 4715, 4724, 4730, 4755, 4761, 4770, 4776, 4787, 4793, 4802, 4808, 4828, 4834, 4843, 4849, 4860, 4866, 4875, 4881, 4904, 4910, 4919, 4925, 4936, 4942, 4951, 4957, 4977, 4983, 4992, 4998, 5009, 5015, 5024, 5030, 5055, 5061, 5070, 5076, 5087, 5093, 5102, 5108, 5128, 5134, 5143, 5149, 5160, 5166, 5175, 5181, 5045, 5051, 5060, 5066, 5077, 5083, 5092, 5098, 5118, 5124, 5133, 5139, 5150, 5156, 5165, 5171, 5196, 5202, 5211, 5217, 5228, 5234, 5243, 5249, 5269, 5275, 5284, 5290, 5301, 5307, 5316, 5322, 5345, 5351, 5360, 5366, 5377, 5383, 5392, 5398, 5418, 5424, 5433, 5439, 5450, 5456, 5465, 5471, 5496, 5502, 5511, 5517, 5528, 5534, 5543, 5549, 5569, 5575, 5584, 5590, 5601, 5607, 5616, 5622, 5417, 5423, 5432, 5438, 5449, 5455, 5464, 5470, 5490, 5496, 5505, 5511, 5522, 5528, 5537, 5543, 5568, 5574, 5583, 5589, 5600, 5606, 5615, 5621, 5641, 5647, 5656, 5662, 5673, 5679, 5688, 5694, 5717, 5723, 5732, 5738, 5749, 5755, 5764, 5770, 5790, 5796, 5805, 5811, 5822, 5828, 5837, 5843, 5868, 5874, 5883, 5889, 5900, 5906, 5915, 5921, 5941, 5947, 5956, 5962, 5973, 5979, 5988, 5994, 5858, 5864, 5873, 5879, 5890, 5896, 5905, 5911, 5931, 5937, 5946, 5952, 5963, 5969, 5978, 5984, 6009, 6015, 6024, 6030, 6041, 6047, 6056, 6062, 6082, 6088, 6097, 6103, 6114, 6120, 6129, 6135, 6158, 6164, 6173, 6179, 6190, 6196, 6205, 6211, 6231, 6237, 6246, 6252, 6263, 6269, 6278, 6284, 6309, 6315, 6324, 6330, 6341, 6347, 6356, 6362, 6382, 6388, 6397, 6403, 6414, 6420, 6429, 6435, 5303, 5309, 5318, 5324, 5335, 5341, 5350, 5356, 5376, 5382, 5391, 5397, 5408, 5414, 5423, 5429, 5454, 5460, 5469, 5475, 5486, 5492, 5501, 5507, 5527, 5533, 5542, 5548, 5559, 5565, 5574, 5580, 5603, 5609, 5618, 5624, 5635, 5641, 5650, 5656, 5676, 5682, 5691, 5697, 5708, 5714, 5723, 5729, 5754, 5760, 5769, 5775, 5786, 5792, 5801, 5807, 5827, 5833, 5842, 5848, 5859, 5865, 5874, 5880, 5744, 5750, 5759, 5765, 5776, 5782, 5791, 5797, 5817, 5823, 5832, 5838, 5849, 5855, 5864, 5870, 5895, 5901, 5910, 5916, 5927, 5933, 5942, 5948, 5968, 5974, 5983, 5989, 6000, 6006, 6015, 6021, 6044, 6050, 6059, 6065, 6076, 6082, 6091, 6097, 6117, 6123, 6132, 6138, 6149, 6155, 6164, 6170, 6195, 6201, 6210, 6216, 6227, 6233, 6242, 6248, 6268, 6274, 6283, 6289, 6300, 6306, 6315, 6321, 6116, 6122, 6131, 6137, 6148, 6154, 6163, 6169, 6189, 6195, 6204, 6210, 6221, 6227, 6236, 6242, 6267, 6273, 6282, 6288, 6299, 6305, 6314, 6320, 6340, 6346, 6355, 6361, 6372, 6378, 6387, 6393, 6416, 6422, 6431, 6437, 6448, 6454, 6463, 6469, 6489, 6495, 6504, 6510, 6521, 6527, 6536, 6542, 6567, 6573, 6582, 6588, 6599, 6605, 6614, 6620, 6640, 6646, 6655, 6661, 6672, 6678, 6687, 6693, 6557, 6563, 6572, 6578, 6589, 6595, 6604, 6610, 6630, 6636, 6645, 6651, 6662, 6668, 6677, 6683, 6708, 6714, 6723, 6729, 6740, 6746, 6755, 6761, 6781, 6787, 6796, 6802, 6813, 6819, 6828, 6834, 6857, 6863, 6872, 6878, 6889, 6895, 6904, 6910, 6930, 6936, 6945, 6951, 6962, 6968, 6977, 6983, 7008, 7014, 7023, 7029, 7040, 7046, 7055, 7061, 7081, 7087, 7096, 7102, 7113, 7119, 7128, 7134, 6392, 6398, 6407, 6413, 6424, 6430, 6439, 6445, 6465, 6471, 6480, 6486, 6497, 6503, 6512, 6518, 6543, 6549, 6558, 6564, 6575, 6581, 6590, 6596, 6616, 6622, 6631, 6637, 6648, 6654, 6663, 6669, 6692, 6698, 6707, 6713, 6724, 6730, 6739, 6745, 6765, 6771, 6780, 6786, 6797, 6803, 6812, 6818, 6843, 6849, 6858, 6864, 6875, 6881, 6890, 6896, 6916, 6922, 6931, 6937, 6948, 6954, 6963, 6969, 6833, 6839, 6848, 6854, 6865, 6871, 6880, 6886, 6906, 6912, 6921, 6927, 6938, 6944, 6953, 6959, 6984, 6990, 6999, 7005, 7016, 7022, 7031, 7037, 7057, 7063, 7072, 7078, 7089, 7095, 7104, 7110, 7133, 7139, 7148, 7154, 7165, 7171, 7180, 7186, 7206, 7212, 7221, 7227, 7238, 7244, 7253, 7259, 7284, 7290, 7299, 7305, 7316, 7322, 7331, 7337, 7357, 7363, 7372, 7378, 7389, 7395, 7404, 7410, 7205, 7211, 7220, 7226, 7237, 7243, 7252, 7258, 7278, 7284, 7293, 7299, 7310, 7316, 7325, 7331, 7356, 7362, 7371, 7377, 7388, 7394, 7403, 7409, 7429, 7435, 7444, 7450, 7461, 7467, 7476, 7482, 7505, 7511, 7520, 7526, 7537, 7543, 7552, 7558, 7578, 7584, 7593, 7599, 7610, 7616, 7625, 7631, 7656, 7662, 7671, 7677, 7688, 7694, 7703, 7709, 7729, 7735, 7744, 7750, 7761);\n\n    function VariableLevelCost(a, b) {\n        var c = cq[a - 1][0];\n        var d = cq[a - 1][1];\n        var e = 0;\n        var i = int;\n        for (i = 2; c; ++i) {\n            if (c & 1) {\n                e += VP8BitCost(d & 1, b[i])\n            }\n            d >>= 1;\n            c >>= 1\n        }\n        return e\n    }\n\n    function VP8CalculateLevelCosts(a) {\n        var b, band, ctx;\n        for (b = 0; b < NUM_TYPES; ++b) {\n            for (band = 0; band < NUM_BANDS; ++band) {\n                for (ctx = 0; ctx < NUM_CTX; ++ctx) {\n                    var p = a.coeffs_[b][band][ctx];\n                    var c = a.level_cost_[b][band][ctx];\n                    var d = VP8BitCost(1, p[1]);\n                    var v;\n                    c[0] = VP8BitCost(0, p[1]);\n                    for (v = 1; v <= MAX_VARIABLE_LEVEL; ++v) {\n                        c[v] = d + VariableLevelCost(v, p)\n                    }\n                }\n            }\n        }\n    }\n    var cs = new Array(302, 984, 439, 642);\n    var ct = new Array(663, 919, 872, 919);\n    var cu = new Array(new Array(new Array(251, 1362, 1934, 2085, 2314, 2230, 1839, 1988, 2437, 2348), new Array(403, 680, 1507, 1519, 2060, 2005, 1992, 1914, 1924, 1733), new Array(353, 1121, 973, 1895, 2060, 1787, 1671, 1516, 2012, 1868), new Array(770, 852, 1581, 632, 1393, 1780, 1823, 1936, 1074, 1218), new Array(510, 1270, 1467, 1319, 847, 1279, 1792, 2094, 1080, 1353), new Array(488, 1322, 918, 1573, 1300, 883, 1814, 1752, 1756, 1502), new Array(425, 992, 1820, 1514, 1843, 2440, 937, 1771, 1924, 1129), new Array(363, 1248, 1257, 1970, 2194, 2385, 1569, 953, 1951, 1601), new Array(723, 1257, 1631, 964, 963, 1508, 1697, 1824, 671, 1418), new Array(635, 1038, 1573, 930, 1673, 1413, 1410, 1687, 1410, 749)), new Array(new Array(451, 613, 1345, 1702, 1870, 1716, 1728, 1766, 2190, 2310), new Array(678, 453, 1171, 1443, 1925, 1831, 2045, 1781, 1887, 1602), new Array(711, 666, 674, 1718, 1910, 1493, 1775, 1193, 2325, 2325), new Array(883, 854, 1583, 542, 1800, 1878, 1664, 2149, 1207, 1087), new Array(669, 994, 1248, 1122, 949, 1179, 1376, 1729, 1070, 1244), new Array(715, 1026, 715, 1350, 1430, 930, 1717, 1296, 1479, 1479), new Array(544, 841, 1656, 1450, 2094, 3883, 1010, 1759, 2076, 809), new Array(610, 855, 957, 1553, 2067, 1561, 1704, 824, 2066, 1226), new Array(833, 960, 1416, 819, 1277, 1619, 1501, 1617, 757, 1182), new Array(711, 964, 1252, 879, 1441, 1828, 1508, 1636, 1594, 734)), new Array(new Array(605, 764, 734, 1713, 1747, 1192, 1819, 1353, 1877, 2392), new Array(866, 641, 586, 1622, 2072, 1431, 1888, 1346, 2189, 1764), new Array(901, 851, 456, 2165, 2281, 1405, 1739, 1193, 2183, 2443), new Array(770, 1045, 952, 1078, 1342, 1191, 1436, 1063, 1303, 995), new Array(901, 1086, 727, 1170, 884, 1105, 1267, 1401, 1739, 1337), new Array(951, 1162, 595, 1488, 1388, 703, 1790, 1366, 2057, 1724), new Array(534, 986, 1273, 1987, 3273, 1485, 1024, 1399, 1583, 866), new Array(699, 1182, 695, 1978, 1726, 1986, 1326, 714, 1750, 1672), new Array(951, 1217, 1209, 920, 1062, 1441, 1548, 999, 952, 932), new Array(733, 1284, 784, 1256, 1557, 1098, 1257, 1357, 1414, 908)), new Array(new Array(316, 1075, 1653, 1220, 2145, 2051, 1730, 2131, 1884, 1790), new Array(745, 516, 1404, 894, 1599, 2375, 2013, 2105, 1475, 1381), new Array(516, 729, 1088, 1319, 1637, 3426, 1636, 1275, 1531, 1453), new Array(894, 943, 2138, 468, 1704, 2259, 2069, 1763, 1266, 1158), new Array(605, 1025, 1235, 871, 1170, 1767, 1493, 1500, 1104, 1258), new Array(739, 826, 1207, 1151, 1412, 846, 1305, 2726, 1014, 1569), new Array(558, 825, 1820, 1398, 3344, 1556, 1218, 1550, 1228, 878), new Array(429, 951, 1089, 1816, 3861, 3861, 1556, 969, 1568, 1828), new Array(883, 961, 1752, 769, 1468, 1810, 2081, 2346, 613, 1298), new Array(803, 895, 1372, 641, 1303, 1708, 1686, 1700, 1306, 1033)), new Array(new Array(439, 1267, 1270, 1579, 963, 1193, 1723, 1729, 1198, 1993), new Array(705, 725, 1029, 1153, 1176, 1103, 1821, 1567, 1259, 1574), new Array(723, 859, 802, 1253, 972, 1202, 1407, 1665, 1520, 1674), new Array(894, 960, 1254, 887, 1052, 1607, 1344, 1349, 865, 1150), new Array(833, 1312, 1337, 1205, 572, 1288, 1414, 1529, 1088, 1430), new Array(842, 1279, 1068, 1861, 862, 688, 1861, 1630, 1039, 1381), new Array(766, 938, 1279, 1546, 3338, 1550, 1031, 1542, 1288, 640), new Array(715, 1090, 835, 1609, 1100, 1100, 1603, 1019, 1102, 1617), new Array(894, 1813, 1500, 1188, 789, 1194, 1491, 1919, 617, 1333), new Array(610, 1076, 1644, 1281, 1283, 975, 1179, 1688, 1434, 889)), new Array(new Array(544, 971, 1146, 1849, 1221, 740, 1857, 1621, 1683, 2430), new Array(723, 705, 961, 1371, 1426, 821, 2081, 2079, 1839, 1380), new Array(783, 857, 703, 2145, 1419, 814, 1791, 1310, 1609, 2206), new Array(997, 1000, 1153, 792, 1229, 1162, 1810, 1418, 942, 979), new Array(901, 1226, 883, 1289, 793, 715, 1904, 1649, 1319, 3108), new Array(979, 1478, 782, 2216, 1454, 455, 3092, 1591, 1997, 1664), new Array(663, 1110, 1504, 1114, 1522, 3311, 676, 1522, 1530, 1024), new Array(605, 1138, 1153, 1314, 1569, 1315, 1157, 804, 1574, 1320), new Array(770, 1216, 1218, 1227, 869, 1384, 1232, 1375, 834, 1239), new Array(775, 1007, 843, 1216, 1225, 1074, 2527, 1479, 1149, 975)), new Array(new Array(477, 817, 1309, 1439, 1708, 1454, 1159, 1241, 1945, 1672), new Array(577, 796, 1112, 1271, 1618, 1458, 1087, 1345, 1831, 1265), new Array(663, 776, 753, 1940, 1690, 1690, 1227, 1097, 3149, 1361), new Array(766, 1299, 1744, 1161, 1565, 1106, 1045, 1230, 1232, 707), new Array(915, 1026, 1404, 1182, 1184, 851, 1428, 2425, 1043, 789), new Array(883, 1456, 790, 1082, 1086, 985, 1083, 1484, 1238, 1160), new Array(507, 1345, 2261, 1995, 1847, 3636, 653, 1761, 2287, 933), new Array(553, 1193, 1470, 2057, 2059, 2059, 833, 779, 2058, 1263), new Array(766, 1275, 1515, 1039, 957, 1554, 1286, 1540, 1289, 705), new Array(499, 1378, 1496, 1385, 1850, 1850, 1044, 2465, 1515, 720)), new Array(new Array(553, 930, 978, 2077, 1968, 1481, 1457, 761, 1957, 2362), new Array(694, 864, 905, 1720, 1670, 1621, 1429, 718, 2125, 1477), new Array(699, 968, 658, 3190, 2024, 1479, 1865, 750, 2060, 2320), new Array(733, 1308, 1296, 1062, 1576, 1322, 1062, 1112, 1172, 816), new Array(920, 927, 1052, 939, 947, 1156, 1152, 1073, 3056, 1268), new Array(723, 1534, 711, 1547, 1294, 892, 1553, 928, 1815, 1561), new Array(663, 1366, 1583, 2111, 1712, 3501, 522, 1155, 2130, 1133), new Array(614, 1731, 1188, 2343, 1944, 3733, 1287, 487, 3546, 1758), new Array(770, 1585, 1312, 826, 884, 2673, 1185, 1006, 1195, 1195), new Array(758, 1333, 1273, 1023, 1621, 1162, 1351, 833, 1479, 862)), new Array(new Array(376, 1193, 1446, 1149, 1545, 1577, 1870, 1789, 1175, 1823), new Array(803, 633, 1136, 1058, 1350, 1323, 1598, 2247, 1072, 1252), new Array(614, 1048, 943, 981, 1152, 1869, 1461, 1020, 1618, 1618), new Array(1107, 1085, 1282, 592, 1779, 1933, 1648, 2403, 691, 1246), new Array(851, 1309, 1223, 1243, 895, 1593, 1792, 2317, 627, 1076), new Array(770, 1216, 1030, 1125, 921, 981, 1629, 1131, 1049, 1646), new Array(626, 1469, 1456, 1081, 1489, 3278, 981, 1232, 1498, 733), new Array(617, 1201, 812, 1220, 1476, 1476, 1478, 970, 1228, 1488), new Array(1179, 1393, 1540, 999, 1243, 1503, 1916, 1925, 414, 1614), new Array(943, 1088, 1490, 682, 1112, 1372, 1756, 1505, 966, 966)), new Array(new Array(322, 1142, 1589, 1396, 2144, 1859, 1359, 1925, 2084, 1518), new Array(617, 625, 1241, 1234, 2121, 1615, 1524, 1858, 1720, 1004), new Array(553, 851, 786, 1299, 1452, 1560, 1372, 1561, 1967, 1713), new Array(770, 977, 1396, 568, 1893, 1639, 1540, 2108, 1430, 1013), new Array(684, 1120, 1375, 982, 930, 2719, 1638, 1643, 933, 993), new Array(553, 1103, 996, 1356, 1361, 1005, 1507, 1761, 1184, 1268), new Array(419, 1247, 1537, 1554, 1817, 3606, 1026, 1666, 1829, 923), new Array(439, 1139, 1101, 1257, 3710, 1922, 1205, 1040, 1931, 1529), new Array(979, 935, 1269, 847, 1202, 1286, 1530, 1535, 827, 1036), new Array(516, 1378, 1569, 1110, 1798, 1798, 1198, 2199, 1543, 712)));\n    var cv = {\n        first: int,\n        last: int,\n        coeffs: int16_t,\n        coeffs_off: 0,\n        coeff_type: int,\n        prob: newObjectIt(bJ),\n        stats: newObjectIt(bK),\n        cost: newObjectIt(bL)\n    };\n    var cw = new Array(0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0);\n    var cx = new Array(173, 148, 140);\n    var cy = new Array(176, 155, 140, 135);\n    var cz = new Array(180, 157, 141, 134, 130);\n    var cA = new Array(254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129);\n\n    function ResetStats(a, b) {\n        var c = a.proba_;\n        if (b) VP8CalculateLevelCosts(c);\n        c.nb_skip_ = 0\n    }\n\n    function CalcSkipProba(a, b) {\n        return parseInt(b ? (b - a) * 255 / b : 255)\n    }\n\n    function FinalizeSkipProba(a) {\n        var b = a.proba_;\n        var c = a.mb_w_ * a.mb_h_;\n        var d = b.nb_skip_;\n        var e = int;\n        b.skip_proba_ = CalcSkipProba(d, c);\n        b.use_skip_proba_ = (b.skip_proba_ < 250) + 0;\n        e = 256;\n        if (b.use_skip_proba_) {\n            e += d * VP8BitCost(1, b.skip_proba_) + (c - d) * VP8BitCost(0, b.skip_proba_);\n            e += 8 * 256\n        }\n        return e\n    }\n\n    function ResetTokenStats(a) {\n        var b = a.proba_;\n        b.stats = newObjectIt(bK)\n    }\n\n    function Record(a, b) {\n        b[0] += parseInt(a + 0);\n        b[1] += 1;\n        return a\n    }\n\n    function RecordCoeffs(a, b) {\n        var n = b.first;\n        var s = b.stats[cw[n]][a];\n        if (!Record(b.last >= 0, s[0])) {\n            return 0\n        }\n        while (1) {\n            var v = b.coeffs[n++];\n            if (!Record(v != 0, s[1])) {\n                s = b.stats[cw[n]][0];\n                continue\n            }\n            if (!Record(2 < (v + 1), s[2])) {\n                s = b.stats[cw[n]][1]\n            } else {\n                v = Math.abs(v);\n                if (v > MAX_VARIABLE_LEVEL) v = MAX_VARIABLE_LEVEL; {\n                    var c = cq[v - 1][1];\n                    var d = cq[v - 1][0];\n                    var i;\n                    for (i = 0;\n                        (d >>= 1) != 0; ++i) {\n                        var e = 2 << i;\n                        if (d & 1) Record(!!(c & e), s[3 + i])\n                    }\n                }\n                s = b.stats[cw[n]][2]\n            }\n            if (n == 16 || !Record(n <= b.last, s[0])) {\n                return 1\n            }\n        }\n    }\n\n    function CalcTokenProba(a, b) {\n        return a ? parseInt(((b - a) * 255 + b / 2) / b) : 255\n    }\n\n    function FinalizeTokenProbas(a) {\n        var d = a.proba_;\n        var e = 0;\n        var t, b, c, p;\n        for (t = 0; t < NUM_TYPES; ++t) {\n            for (b = 0; b < NUM_BANDS; ++b) {\n                for (c = 0; c < NUM_CTX; ++c) {\n                    for (p = 0; p < NUM_PROBAS; ++p) {\n                        var f = d.stats_[t][b][c][p];\n                        var g = dz[t][b][c][p];\n                        var h = dw[t][b][c][p];\n                        var i = CalcTokenProba(f[0], f[1]);\n                        var j = VP8BranchCost(f[0], f[1], h) + VP8BitCost(0, g);\n                        var k = VP8BranchCost(f[0], f[1], i) + VP8BitCost(1, g) + 8 * 256;\n                        var l = (j > k) + 0;\n                        e += VP8BitCost(l, g);\n                        if (l) {\n                            d.coeffs_[t][b][c][p] = i;\n                            e += 8 * 256\n                        } else {\n                            d.coeffs_[t][b][c][p] = h\n                        }\n                    }\n                }\n            }\n        }\n        return e\n    }\n\n    function InitResidual(a, b, c, d) {\n        d.coeff_type = b;\n        d.prob = c.proba_.coeffs_[b];\n        d.stats = c.proba_.stats_[b];\n        d.cost = c.proba_.level_cost_[b];\n        d.first = a\n    }\n\n    function SetResidualCoeffs(a, b) {\n        var n;\n        b.last = -1;\n        for (n = 15; n >= b.first; --n) {\n            if (a[n]) {\n                b.last = n;\n                break\n            }\n        }\n        b.coeffs = a\n    }\n\n    function GetResidualCost(a, b) {\n        var n = b.first;\n        var p = b.prob[cw[n]][a];\n        var t = b.cost[cw[n]][a];\n        var c = int;\n        c = VP8BitCost(b.last >= 0, p[0]);\n        if (b.last < 0) {\n            return c\n        }\n        while (n <= b.last) {\n            var v = b.coeffs[n++];\n            if (v == 0) {\n                p = b.prob[cw[n]][0];\n                t = b.cost[cw[n]][0];\n                continue\n            } else if (2 >= (v + 1)) {\n                c += VP8LevelCost(t, 1);\n                p = b.prob[cw[n]][1];\n                t = b.cost[cw[n]][1]\n            } else {\n                c += VP8LevelCost(t, Math.abs(v));\n                p = b.prob[cw[n]][2];\n                t = b.cost[cw[n]][2]\n            }\n            if (n < 16) {\n                c += VP8BitCost(n <= b.last, p[0])\n            }\n        }\n        return c\n    }\n    var cB = newObjectIt(cv);\n\n    function VP8GetCostLuma4(a, b) {\n        var x = (a.i4_ & 3) + 0,\n            y = (a.i4_ >> 2) + 0;\n        var c = (cB);\n        var R = 0;\n        var d = int;\n        InitResidual(0, 3, a.enc_, c);\n        d = a.top_nz_[x] + a.left_nz_[y];\n        SetResidualCoeffs(b, c);\n        R += GetResidualCost(d, c);\n        return R\n    }\n    var cC = newObjectIt(cv);\n\n    function VP8GetCostLuma16(a, b) {\n        var c = (cC);\n        var x, y = int;\n        var R = 0;\n        VP8IteratorNzToBytes(a);\n        InitResidual(0, 1, a.enc_, c);\n        SetResidualCoeffs(b.y_dc_levels, c);\n        R += GetResidualCost(a.top_nz_[8] + a.left_nz_[8], c);\n        InitResidual(1, 0, a.enc_, c);\n        for (y = 0; y < 4; ++y) {\n            for (x = 0; x < 4; ++x) {\n                var d = a.top_nz_[x] + a.left_nz_[y];\n                SetResidualCoeffs(b.y_ac_levels[x + y * 4], c);\n                R += GetResidualCost(d, c);\n                a.top_nz_[x] = a.left_nz_[y] = (c.last >= 0) + 0\n            }\n        }\n        return R\n    }\n    var cD = newObjectIt(cv);\n\n    function VP8GetCostUV(a, b) {\n        var c = (cD);\n        var d, x, y;\n        var R = 0;\n        VP8IteratorNzToBytes(a);\n        InitResidual(0, 2, a.enc_, c);\n        for (d = 0; d <= 2; d += 2) {\n            for (y = 0; y < 2; ++y) {\n                for (x = 0; x < 2; ++x) {\n                    var e = a.top_nz_[4 + d + x] + a.left_nz_[4 + d + y];\n                    SetResidualCoeffs(b.uv_levels[d * 2 + x + y * 2], c);\n                    R += GetResidualCost(e, c);\n                    a.top_nz_[4 + d + x] = a.left_nz_[4 + d + y] = (c.last >= 0) + 0\n                }\n            }\n        }\n        return R\n    }\n\n    function PutCoeffs(a, b, d) {\n        var n = d.first;\n        var p = d.prob[cw[n]][b];\n        if (!VP8PutBit(a, d.last >= 0, p[0])) {\n            return 0\n        }\n        while (n < 16) {\n            var c = d.coeffs[n++];\n            var e = (c < 0) + 0;\n            var v = e ? -c : c;\n            if (!VP8PutBit(a, v != 0, p[1])) {\n                p = d.prob[cw[n]][0];\n                continue\n            }\n            if (!VP8PutBit(a, v > 1, p[2])) {\n                p = d.prob[cw[n]][1]\n            } else {\n                if (!VP8PutBit(a, v > 4, p[3])) {\n                    if (VP8PutBit(a, v != 2, p[4])) VP8PutBit(a, v == 4, p[5])\n                } else if (!VP8PutBit(a, v > 10, p[6])) {\n                    if (!VP8PutBit(a, v > 6, p[7])) {\n                        VP8PutBit(a, v == 6, 159)\n                    } else {\n                        VP8PutBit(a, v >= 9, 165);\n                        VP8PutBit(a, !(v & 1), 145)\n                    }\n                } else {\n                    var f = int;\n                    var g;\n                    var h = 0;\n                    if (v < 3 + (8 << 1)) {\n                        VP8PutBit(a, 0, p[8]);\n                        VP8PutBit(a, 0, p[9]);\n                        v -= 3 + (8 << 0);\n                        f = 1 << 2;\n                        g = cx;\n                        h = 0\n                    } else if (v < 3 + (8 << 2)) {\n                        VP8PutBit(a, 0, p[8]);\n                        VP8PutBit(a, 1, p[9]);\n                        v -= 3 + (8 << 1);\n                        f = 1 << 3;\n                        g = cy;\n                        h = 0\n                    } else if (v < 3 + (8 << 3)) {\n                        VP8PutBit(a, 1, p[8]);\n                        VP8PutBit(a, 0, p[10]);\n                        v -= 3 + (8 << 2);\n                        f = 1 << 4;\n                        g = cz;\n                        h = 0\n                    } else {\n                        VP8PutBit(a, 1, p[8]);\n                        VP8PutBit(a, 1, p[10]);\n                        v -= 3 + (8 << 3);\n                        f = 1 << 10;\n                        g = cA;\n                        h = 0\n                    }\n                    while (f) {\n                        VP8PutBit(a, !!(v & f), g[h++]);\n                        f >>= 1\n                    }\n                }\n                p = d.prob[cw[n]][2]\n            }\n            VP8PutBitUniform(a, e);\n            if (n == 16 || !VP8PutBit(a, n <= d.last, p[0])) {\n                return 1\n            }\n        }\n        return 1\n    }\n    var cE = newObjectIt(cv);\n\n    function CodeResiduals(a, b, c) {\n        var x, y, ch;\n        var d = (cE);\n        var e = uint64_t,\n            pos2 = uint64_t,\n            pos3 = uint64_t;\n        var f = (b.mb_[b.mb_off].type_ == 1) + 0;\n        var g = b.mb_[b.mb_off].segment_;\n        VP8IteratorNzToBytes(b);\n        e = VP8BitWriterPos(a);\n        if (f) {\n            InitResidual(0, 1, b.enc_, d);\n            SetResidualCoeffs(c.y_dc_levels, d);\n            b.top_nz_[8] = b.left_nz_[8] = PutCoeffs(a, b.top_nz_[8] + b.left_nz_[8], d);\n            InitResidual(1, 0, b.enc_, d)\n        } else {\n            InitResidual(0, 3, b.enc_, d)\n        }\n        for (y = 0; y < 4; ++y) {\n            for (x = 0; x < 4; ++x) {\n                var h = b.top_nz_[x] + b.left_nz_[y];\n                SetResidualCoeffs(c.y_ac_levels[x + y * 4], d);\n                b.top_nz_[x] = b.left_nz_[y] = PutCoeffs(a, h, d)\n            }\n        }\n        pos2 = VP8BitWriterPos(a);\n        InitResidual(0, 2, b.enc_, d);\n        for (ch = 0; ch <= 2; ch += 2) {\n            for (y = 0; y < 2; ++y) {\n                for (x = 0; x < 2; ++x) {\n                    var h = b.top_nz_[4 + ch + x] + b.left_nz_[4 + ch + y];\n                    SetResidualCoeffs(c.uv_levels[ch * 2 + x + y * 2], d);\n                    b.top_nz_[4 + ch + x] = b.left_nz_[4 + ch + y] = PutCoeffs(a, h, d)\n                }\n            }\n        }\n        pos3 = VP8BitWriterPos(a);\n        b.luma_bits_ = pos2 - e;\n        b.uv_bits_ = pos3 - pos2;\n        b.bit_count_[g][f] += b.luma_bits_;\n        b.bit_count_[g][2] += b.uv_bits_;\n        VP8IteratorBytesToNz(b)\n    }\n    var cF = newObjectIt(cv);\n\n    function RecordResiduals(a, b) {\n        var x, y, ch;\n        var c = (cF);\n        VP8IteratorNzToBytes(a);\n        if (a.mb_[a.mb_off].type_ == 1) {\n            InitResidual(0, 1, a.enc_, c);\n            SetResidualCoeffs(b.y_dc_levels, c);\n            a.top_nz_[8] = a.left_nz_[8] = RecordCoeffs(a.top_nz_[8] + a.left_nz_[8], c);\n            InitResidual(1, 0, a.enc_, c)\n        } else {\n            InitResidual(0, 3, a.enc_, c)\n        }\n        for (y = 0; y < 4; ++y) {\n            for (x = 0; x < 4; ++x) {\n                var d = a.top_nz_[x] + a.left_nz_[y];\n                SetResidualCoeffs(b.y_ac_levels[x + y * 4], c);\n                a.top_nz_[x] = a.left_nz_[y] = RecordCoeffs(d, c)\n            }\n        }\n        InitResidual(0, 2, a.enc_, c);\n        for (ch = 0; ch <= 2; ch += 2) {\n            for (y = 0; y < 2; ++y) {\n                for (x = 0; x < 2; ++x) {\n                    var d = a.top_nz_[4 + ch + x] + a.left_nz_[4 + ch + y];\n                    SetResidualCoeffs(b.uv_levels[ch * 2 + x + y * 2], c);\n                    a.top_nz_[4 + ch + x] = a.left_nz_[4 + ch + y] = RecordCoeffs(d, c)\n                }\n            }\n        }\n        VP8IteratorBytesToNz(a)\n    }\n\n    function ResetSSE(a) {\n        memset_(a.sse_, 0, 0, sizeof(a.sse_) * 3);\n        a.sse_count_ = 0\n    }\n\n    function StoreSSE(a) {\n        var b = a.enc_;\n        var c = a.yuv_in_;\n        var d = a.yuv_in_off;\n        var e = a.yuv_out_;\n        var f = a.yuv_out_off;\n        b.sse_[0] += dM(c, d + bk, e, f + bk);\n        b.sse_[1] += dN(c, d + bl, e, f + bl);\n        b.sse_[2] += dN(c, d + bm, e, f + bm);\n        b.sse_count_ += 16 * 16\n    }\n\n    function StoreSideInfo(a) {\n        var c = a.enc_;\n        var d = a.mb_[a.mb_off];\n        var e = c.pic_;\n        if (e.stats_nozero) {\n            StoreSSE(a);\n            c.block_count_[0] += (d.type_ == 0) + 0;\n            c.block_count_[1] += (d.type_ == 1) + 0;\n            c.block_count_[2] += (d.skip_ != 0) + 0\n        }\n        if (e.extra_info) {\n            switch (e.extra_info_type) {\n                case 1:\n                    e.extra_info[a.x_ + a.y_ * c.mb_w_] = d.type_;\n                    break;\n                case 2:\n                    e.extra_info[a.x_ + a.y_ * c.mb_w_] = d.segment_;\n                    break;\n                case 3:\n                    e.extra_info[a.x_ + a.y_ * c.mb_w_] = c.dqm_[d.segment_].quant_;\n                    break;\n                case 4:\n                    e.extra_info[a.x_ + a.y_ * c.mb_w_] = (d.type_ == 1) ? a.preds_[a.preds_off + 0] : 0xff;\n                    break;\n                case 5:\n                    e.extra_info[a.x_ + a.y_ * c.mb_w_] = d.uv_mode_;\n                    break;\n                case 6:\n                    {\n                        var b = parseInt((a.luma_bits_ + a.uv_bits_ + 7) >> 3);\n                        e.extra_info[a.x_ + a.y_ * c.mb_w_] = (b > 255) ? 255 : b;\n                        break\n                    }\n                default:\n                    info = 0;\n                    break\n            }\n        }\n    }\n\n    function ResetAfterSkip(a) {\n        if (a.mb_[a.mb_off].type_ == 1) {\n            a.nz_[a.nz_off] = 0;\n            a.left_nz_[8] = 0\n        } else {\n            a.nz_[a.nz_off] &= (1 << 24)\n        }\n    }\n\n    function VP8EncLoop(a) {\n        var i, s, p;\n        var b = newObjectIt(bV);\n        var c = newObjectIt(bU);\n        var d = (!a.proba_.use_skip_proba_) + 0;\n        var e = a.rd_opt_level_;\n        var f = 5;\n        var g = parseInt(a.mb_w_ * a.mb_h_ * f / a.num_parts_);\n        for (p = 0; p < a.num_parts_; ++p) {\n            VP8BitWriterInit(a.parts_[+p], g)\n        }\n        ResetStats(a, (e != 0));\n        ResetSSE(a);\n        VP8IteratorInit(a, b);\n        VP8InitFilter(b);\n        do {\n            VP8IteratorImport(b);\n            if (!VP8Decimate(b, c, e) || (!a.proba_.use_skip_proba_)) {\n                CodeResiduals(b.bw_, b, c)\n            } else {\n                ResetAfterSkip(b)\n            }\n            if (a.has_alpha_) {\n                VP8EncCodeAlphaBlock(b)\n            }\n            if (a.use_layer_) {\n                VP8EncCodeLayerBlock(b)\n            }\n            StoreSideInfo(b);\n            VP8StoreFilterStats(b);\n            VP8IteratorExport(b)\n        } while (VP8IteratorNext(b, b.yuv_out_, b.yuv_out_off));\n        VP8AdjustFilterStrength(b);\n        for (p = 0; p < a.num_parts_; ++p) {\n            VP8BitWriterFinish(a.parts_[+p])\n        }\n        if (a.pic_.stats_nozero) {\n            for (i = 0; i <= 2; ++i) {\n                for (s = 0; s < be; ++s) {\n                    a.residual_bytes_[i][s] = parseInt((b.bit_count_[s][i] + 7) >> 3)\n                }\n            }\n        }\n        return 1\n    }\n    var cG = (15 + 20 + 10);\n\n    function OneStatPass(a, q, b, c, d) {\n        var e = newObjectIt(bV);\n        var f = 0;\n        var g = 0;\n        var h = c * 384;\n        if (q < 0.) {\n            q = 0\n        } else if (q > 100.) {\n            q = 100\n        }\n        VP8SetSegmentParams(a, q);\n        ResetStats(a, b != 0);\n        ResetTokenStats(a);\n        VP8IteratorInit(a, e);\n        var i = newObjectIt(bU);\n        do {\n            var j = (i);\n            VP8IteratorImport(e);\n            if (VP8Decimate(e, j, b)) {\n                a.proba_.nb_skip_++\n            }\n            RecordResiduals(e, j);\n            f += j.R;\n            g += j.D\n        } while (VP8IteratorNext(e, e.yuv_out_, e.yuv_out_off) && --c > 0);\n        f += FinalizeSkipProba(a);\n        f += FinalizeTokenProbas(a);\n        f += a.segment_hdr_.size_;\n        f = ((f + 1024) >> 11) + cG;\n        if (d) {\n            d.f = parseFloat(10. * (Math.LOG10E * Math.log(255. * 255. * h / g)))\n        }\n        return parseInt(f)\n    }\n    var cH = new Array(20, 15, 10, 8, 6, 4, 2, 1, 0);\n\n    function VP8StatLoop(a) {\n        var b = (a.config_.target_size > 0 || a.config_.target_PSNR > 0) + 0;\n        var c = (a.method_ < 2 && !b) + 0;\n        var q = parseFloat(a.config_.quality);\n        var d = int;\n        var e = int;\n        e = a.mb_w_ * a.mb_h_;\n        if (c && e > 100) e = 100;\n        if (!b) {\n            for (d = 0; d < a.config_.pass; ++d) {\n                var f = (a.method_ > 2) + 0;\n                OneStatPass(a, q, f, e, null)\n            }\n            return 1\n        }\n        for (d = 0; d < a.config_.pass && (cH[d] > 0); ++d) {\n            var f = 1;\n            var g = {\n                f: float\n            };\n            var h = int;\n            var i = OneStatPass(a, q, f, e, g);\n            if (a.config_.target_PSNR > 0) {\n                h = (g.f < a.config_.target_PSNR)\n            } else {\n                h = (i < a.config_.target_size)\n            }\n            if (h) {\n                q += cH[d]\n            } else {\n                q -= cH[d]\n            }\n        }\n        return 1\n    }\n\n    function InitLeft(a) {\n        var b = a.enc_;\n        b.y_left_[b.y_left_off - 1] = b.u_left_[b.u_left_off - 1] = b.v_left_[b.v_left_off - 1] = (a.y_) > 0 ? 129 : 127;\n        memset_(b.y_left_, b.y_left_off + 0, 129, 16);\n        memset_(b.u_left_, b.u_left_off + 0, 129, 8);\n        memset_(b.v_left_, b.v_left_off + 0, 129, 8);\n        a.left_nz_[8] = 0\n    }\n\n    function InitTop(a) {\n        var b = a.enc_;\n        var c = b.mb_w_ * 16;\n        memset_(b.y_top_, 0, 127, 2 * c);\n        memset_(b.nz_, b.nz_off + 0, 0, b.mb_w_ * sizeof(b.nz_))\n    }\n\n    function VP8IteratorReset(a) {\n        var b = a.enc_;\n        a.x_ = 0;\n        a.y_ = 0;\n        a.y_offset_ = 0;\n        a.uv_offset_ = 0;\n        a.mb_ = b.mb_info_;\n        a.mb_off = b.mb_info_off;\n        a.preds_ = b.preds_;\n        a.preds_off = b.preds_off;\n        a.nz_ = b.nz_;\n        a.nz_off = b.nz_off;\n        a.bw_ = b.parts_[0];\n        a.done_ = b.mb_w_ * b.mb_h_;\n        InitTop(a);\n        InitLeft(a);\n        a.bit_count_ = ArrM(Array(4, 3), 0);\n        a.do_trellis_ = 0\n    }\n\n    function VP8IteratorInit(a, b) {\n        b.enc_ = a;\n        b.y_stride_ = a.pic_.y_stride;\n        b.uv_stride_ = a.pic_.uv_stride;\n        b.yuv_in_ = a.yuv_in_;\n        b.yuv_out_ = a.yuv_out_;\n        b.yuv_out2_ = a.yuv_out2_;\n        b.yuv_p_ = a.yuv_p_;\n        b.lf_stats_ = a.lf_stats_;\n        VP8IteratorReset(b)\n    }\n\n    function VP8IteratorImport(a) {\n        var b = a.enc_;\n        var x = a.x_,\n            y = a.y_;\n        var c = b.pic_;\n        var d = c.y;\n        var e = c.y_off + (y * c.y_stride + x) * 16;\n        var f = c.u;\n        var g = c.u_off + (y * c.uv_stride + x) * 8;\n        var j = c.v;\n        var k = c.v_off + (y * c.uv_stride + x) * 8;\n        var l = a.yuv_in_;\n        var m = a.yuv_in_off + bk;\n        var n = a.yuv_in_;\n        var o = a.yuv_in_off + bl;\n        var p = a.yuv_in_;\n        var q = a.yuv_in_off + bm;\n        var w = (c.width - x * 16);\n        var h = (c.height - y * 16);\n        var i;\n        if (w > 16) w = 16;\n        if (h > 16) h = 16;\n        for (i = 0; i < h; ++i) {\n            memcpy(l, m, d, e, w);\n            if (w < 16) memset_(l, m + w, l[m + w - 1], 16 - w);\n            m += bf;\n            e += c.y_stride\n        }\n        for (i = h; i < 16; ++i) {\n            memcpy(l, m, l, m - bf, 16);\n            m += bf\n        }\n        w = parseInt((w + 1) / 2);\n        h = parseInt((h + 1) / 2);\n        for (i = 0; i < h; ++i) {\n            memcpy(n, o, f, g, w);\n            memcpy(p, q, j, k, w);\n            if (w < 8) {\n                memset_(n, o + w, n[o + w - 1], 8 - w);\n                memset_(p, q + w, p[q + w - 1], 8 - w)\n            }\n            o += bf;\n            q += bf;\n            g += c.uv_stride;\n            k += c.uv_stride\n        }\n        for (i = h; i < 8; ++i) {\n            memcpy(n, o, n, o - bf, 8);\n            memcpy(p, q, p, q - bf, 8);\n            o += bf;\n            q += bf\n        }\n    }\n\n    function VP8IteratorExport(a) {\n        var b = a.enc_;\n        if (b.config_.show_compressed) {\n            var x = a.x_,\n                y = a.y_;\n            var c = a.yuv_out_;\n            var d = a.yuv_out_off + bk;\n            var e = a.yuv_out_;\n            var f = a.yuv_out_off + bl;\n            var g = a.yuv_out_;\n            var j = a.yuv_out_off + bm;\n            var k = b.pic_;\n            var l = k.y;\n            var m = k.y_off + (y * k.y_stride + x) * 16;\n            var n = k.u;\n            var o = k.u_off + (y * k.uv_stride + x) * 8;\n            var p = k.v;\n            var q = k.v_off + (y * k.uv_stride + x) * 8;\n            var w = (k.width - x * 16);\n            var h = (k.height - y * 16);\n            var i;\n            if (w > 16) w = 16;\n            if (h > 16) h = 16;\n            for (i = 0; i < h; ++i) {\n                memcpy(l, m + i * k.y_stride, c, d + i * bf, w)\n            } {\n                var r = parseInt((w + 1) / 2);\n                var s = parseInt((h + 1) / 2);\n                for (i = 0; i < s; ++i) {\n                    memcpy(n, o + i * k.uv_stride, e, f + i * bf, r);\n                    memcpy(p, q + i * k.uv_stride, g, j + i * bf, r)\n                }\n            }\n        }\n    }\n\n    function BIT(a, n) {\n        return (!!((a) & (1 << (n)))) + 0\n    }\n\n    function VP8IteratorNzToBytes(a) {\n        var b = a.nz_[a.nz_off + 0],\n            lnz = a.nz_[a.nz_off - 1];\n        a.top_nz_[0] = BIT(b, 12);\n        a.top_nz_[1] = BIT(b, 13);\n        a.top_nz_[2] = BIT(b, 14);\n        a.top_nz_[3] = BIT(b, 15);\n        a.top_nz_[4] = BIT(b, 18);\n        a.top_nz_[5] = BIT(b, 19);\n        a.top_nz_[6] = BIT(b, 22);\n        a.top_nz_[7] = BIT(b, 23);\n        a.top_nz_[8] = BIT(b, 24);\n        a.left_nz_[0] = BIT(lnz, 3);\n        a.left_nz_[1] = BIT(lnz, 7);\n        a.left_nz_[2] = BIT(lnz, 11);\n        a.left_nz_[3] = BIT(lnz, 15);\n        a.left_nz_[4] = BIT(lnz, 17);\n        a.left_nz_[5] = BIT(lnz, 19);\n        a.left_nz_[6] = BIT(lnz, 21);\n        a.left_nz_[7] = BIT(lnz, 23)\n    }\n\n    function VP8IteratorBytesToNz(a) {\n        var b = 0;\n        b |= (a.top_nz_[0] << 12) | (a.top_nz_[1] << 13);\n        b |= (a.top_nz_[2] << 14) | (a.top_nz_[3] << 15);\n        b |= (a.top_nz_[4] << 18) | (a.top_nz_[5] << 19);\n        b |= (a.top_nz_[6] << 22) | (a.top_nz_[7] << 23);\n        b |= (a.top_nz_[8] << 24);\n        b |= (a.left_nz_[0] << 3) | (a.left_nz_[1] << 7);\n        b |= (a.left_nz_[2] << 11);\n        b |= (a.left_nz_[4] << 17) | (a.left_nz_[6] << 21);\n        a.nz_[a.nz_off] = b\n    }\n\n    function VP8IteratorNext(a, b, c) {\n        var d = a.enc_;\n        if (b) {\n            var x = a.x_,\n                y = a.y_;\n            var e = b;\n            var f = c + bk;\n            var g = b;\n            var h = c + bl;\n            if (x < d.mb_w_ - 1) {\n                var i;\n                for (i = 0; i < 16; ++i) {\n                    d.y_left_[d.y_left_off + i] = e[f + 15 + i * bf]\n                }\n                for (i = 0; i < 8; ++i) {\n                    d.u_left_[d.u_left_off + i] = g[h + 7 + i * bf];\n                    d.v_left_[d.v_left_off + i] = g[h + 15 + i * bf]\n                }\n                d.y_left_[d.y_left_off - 1] = d.y_top_[d.y_top_off + x * 16 + 15];\n                d.u_left_[d.u_left_off - 1] = d.uv_top_[d.uv_top_off + x * 16 + 0 + 7];\n                d.v_left_[d.v_left_off - 1] = d.uv_top_[d.uv_top_off + x * 16 + 8 + 7]\n            }\n            if (y < d.mb_h_ - 1) {\n                memcpy(d.y_top_, d.y_top_off + x * 16, e, f + 15 * bf, 16);\n                memcpy(d.uv_top_, d.uv_top_off + x * 16, g, h + 7 * bf, 8 + 8)\n            }\n        }\n        a.mb_off++;\n        a.preds_off += 4;\n        a.nz_off++;\n        a.x_++;\n        if (a.x_ == d.mb_w_) {\n            a.x_ = 0;\n            a.y_++;\n            a.bw_ = d.parts_[a.y_ & (d.num_parts_ - 1)];\n            a.preds_ = d.preds_;\n            a.preds_off = d.preds_off + a.y_ * 4 * d.preds_w_;\n            a.nz_ = d.nz_;\n            a.nz_off = d.nz_off;\n            InitLeft(a)\n        }\n        return (0 < --a.done_)\n    }\n\n    function VP8SetIntra16Mode(a, b) {\n        var y;\n        var c = a.preds_;\n        var d = a.preds_off;\n        for (y = 0; y < 4; ++y) {\n            memset_(c, d, b, 4);\n            d += a.enc_.preds_w_\n        }\n        a.mb_[a.mb_off].type_ = 1\n    }\n\n    function VP8SetIntra4Mode(a, b) {\n        var x, y;\n        var c = a.preds_;\n        var d = a.preds_off;\n        for (y = 0; y < 4; ++y) {\n            for (x = 0; x < 4; ++x) {\n                c[d + x] = b[x + y * 4]\n            }\n            d += a.enc_.preds_w_\n        }\n        a.mb_[a.mb_off].type_ = 0\n    }\n\n    function VP8SetIntraUVMode(a, b) {\n        a.mb_[a.mb_off].uv_mode_ = b\n    }\n\n    function VP8SetSkip(a, b) {\n        a.mb_[a.mb_off].skip_ = b\n    }\n\n    function VP8SetSegment(a, b) {\n        a.mb_[a.mb_off].segment_ = b\n    }\n    var cI = new Array(17, 21, 25, 29, 13, 17, 21, 25, 9, 13, 17, 21, 5, 9, 13, 17);\n\n    function VP8IteratorStartI4(a) {\n        var b = a.enc_;\n        var i;\n        a.i4_ = 0;\n        a.i4_top_ = a.i4_boundary_;\n        a.i4_top_off = +cI[0];\n        for (i = 0; i < 17; ++i) {\n            a.i4_boundary_[i] = b.y_left_[b.y_left_off + 15 - i]\n        }\n        for (i = 0; i < 16; ++i) {\n            a.i4_boundary_[17 + i] = b.y_top_[b.y_top_off + a.x_ * 16 + i]\n        }\n        if (a.x_ < b.mb_w_ - 1) {\n            for (i = 16; i < 16 + 4; ++i) {\n                a.i4_boundary_[17 + i] = b.y_top_[b.y_top_off + a.x_ * 16 + i]\n            }\n        } else {\n            for (i = 16; i < 16 + 4; ++i) {\n                a.i4_boundary_[17 + i] = a.i4_boundary_[17 + 15]\n            }\n        }\n        VP8IteratorNzToBytes(a)\n    }\n\n    function VP8IteratorRotateI4(a, b, c) {\n        var d = b;\n        var e = c + di[a.i4_];\n        var f = a.i4_top_;\n        var g = a.i4_top_off;\n        var i;\n        for (i = 0; i <= 3; ++i) {\n            f[g - 4 + i] = d[e + i + 3 * bf]\n        }\n        if ((a.i4_ & 3) != 3) {\n            for (i = 0; i <= 2; ++i) {\n                f[g + i] = d[e + 3 + (2 - i) * bf]\n            }\n        } else {\n            for (i = 0; i <= 3; ++i) {\n                f[g + i] = f[g + i + 4]\n            }\n        }\n        a.i4_++;\n        if (a.i4_ == 16) {\n            return 0\n        }\n        a.i4_top_ = a.i4_boundary_;\n        a.i4_top_off = +cI[a.i4_];\n        return 1\n    }\n    var bc = 64;\n    var cJ = 6;\n\n    function ClipAlpha(a) {\n        return a < 0 ? 0 : a > 255 ? 255 : a\n    }\n\n    function SmoothSegmentMap(a) {\n        var n, x, y = int;\n        var b = 0;\n        var w = a.mb_w_;\n        var h = a.mb_h_;\n        var c = 5;\n        var d = malloc(w * h * sizeof(uint8_t), uint8_t);\n        var e = a.mb_info_;\n        if (d == null) return;\n        for (y = 1; y < h - 1; ++y) {\n            for (x = 1; x < w - 1; ++x) {\n                var f = Arr(be, 0);\n                b = (x + w * y);\n                var g = e[b].segment_;\n                f[e[b - w - 1].segment_]++;\n                f[e[b - w + 0].segment_]++;\n                f[e[b - w + 1].segment_]++;\n                f[e[b - 1].segment_]++;\n                f[e[b + 1].segment_]++;\n                f[e[b + w - 1].segment_]++;\n                f[e[b + w + 0].segment_]++;\n                f[e[b + w + 1].segment_]++;\n                for (n = 0; n < be; ++n) {\n                    if (f[n] >= c) {\n                        e[b].segment_ = n\n                    }\n                }\n                d[x + y * w] = g\n            }\n        }\n        for (y = 1; y < h - 1; ++y) {\n            for (x = 1; x < w - 1; ++x) {\n                var e = a.mb_info_[x + w * y];\n                e.segment_ = d[x + y * w]\n            }\n        }\n        d = ''\n    }\n\n    function GetProba(a, b) {\n        var c = int;\n        var d = a + b;\n        if (d == 0) return 255;\n        c = parseInt((255 * a + d / 2) / d);\n        return c\n    }\n\n    function SetSegmentProbas(a) {\n        var p = Arr(be, 0);\n        var n = int;\n        for (n = 0; n < a.mb_w_ * a.mb_h_; ++n) {\n            var b = a.mb_info_[n];\n            p[b.segment_]++\n        }\n        if (a.pic_.stats_nozero) {\n            for (n = 0; n < be; ++n) {\n                a.pic_.stats.segment_size[n] = p[n]\n            }\n        }\n        if (a.segment_hdr_.num_segments_ > 1) {\n            var c = a.proba_.segments_;\n            c[0] = GetProba(p[0] + p[1], p[2] + p[3]);\n            c[1] = GetProba(p[0], p[1]);\n            c[2] = GetProba(p[2], p[3]);\n            a.segment_hdr_.update_map_ = (c[0] != 255) || (c[1] != 255) || (c[2] != 255) + 0;\n            a.segment_hdr_.size_ = p[0] * (VP8BitCost(0, c[0]) + VP8BitCost(0, c[1])) + p[1] * (VP8BitCost(0, c[0]) + VP8BitCost(1, c[1])) + p[2] * (VP8BitCost(1, c[0]) + VP8BitCost(0, c[2])) + p[3] * (VP8BitCost(1, c[0]) + VP8BitCost(1, c[2]))\n        } else {\n            a.segment_hdr_.update_map_ = 0;\n            a.segment_hdr_.size_ = 0\n        }\n    }\n\n    function clip(v, m, M) {\n        return v < m ? m : v > M ? M : v\n    }\n\n    function SetSegmentAlphas(a, b, c) {\n        var d = a.segment_hdr_.num_segments_;\n        var e = b[0],\n            maxx = b[0];\n        var n = int;\n        if (d > 1) {\n            for (n = 0; n < d; ++n) {\n                if (e > b[n]) e = b[n];\n                if (maxx < b[n]) maxx = b[n]\n            }\n        }\n        if (maxx == e) maxx = e + 1;\n        assert(c <= maxx && c >= e);\n        for (n = 0; n < d; ++n) {\n            var f = parseInt(255 * (b[n] - c) / (maxx - e));\n            var g = parseInt(255 * (b[n] - e) / (maxx - e));\n            a.dqm_[n].alpha_ = clip(f, -127, 127);\n            a.dqm_[n].beta_ = clip(g, 0, 255)\n        }\n    }\n\n    function AssignSegments(b, c) {\n        var d = b.segment_hdr_.num_segments_;\n        var e = Arr(be, int);\n        var f = int;\n        var g = Arr(256, int);\n        var a, n, k;\n        var h = 0,\n            max_a = 255,\n            range_a = int;\n        var i = Arr(be, int),\n            dist_accum = Arr(be, int);\n        for (n = 0; n < 256 && c[n] == 0; ++n) {}\n        h = n;\n        for (n = 255; n > h && c[n] == 0; --n) {}\n        max_a = n;\n        range_a = max_a - h;\n        for (n = 1, k = 0; n < 2 * d; n += 2) {\n            e[k++] = parseInt(h + (n * range_a) / (2 * d))\n        }\n        for (k = 0; k < cJ; ++k) {\n            var j = int;\n            var l = int;\n            for (n = 0; n < d; ++n) {\n                i[n] = 0;\n                dist_accum[n] = 0\n            }\n            var n = 0;\n            for (a = h; a <= max_a; ++a) {\n                if (c[a]) {\n                    while (n < d - 1 && Math.abs(a - e[n + 1]) < Math.abs(a - e[n])) {\n                        n++\n                    }\n                    g[a] = n;\n                    dist_accum[n] += a * c[a];\n                    i[n] += c[a]\n                }\n            }\n            l = 0;\n            f = 0;\n            j = 0;\n            for (n = 0; n < d; ++n) {\n                if (i[n]) {\n                    var m = parseInt((dist_accum[n] + i[n] / 2) / i[n]);\n                    l += Math.abs(e[n] - m);\n                    e[n] = m;\n                    f += m * i[n];\n                    j += i[n]\n                }\n            }\n            f = parseInt((f + j / 2) / j);\n            if (l < 5) break\n        }\n        for (n = 0; n < b.mb_w_ * b.mb_h_; ++n) {\n            var o = b.mb_info_[n];\n            var a = o.alpha_;\n            o.segment_ = g[a];\n            o.alpha_ = e[g[a]]\n        }\n        if (d > 1) {\n            var p = (b.config_.preprocessing & 1);\n            if (p) SmoothSegmentMap(b)\n        }\n        SetSegmentProbas(b);\n        SetSegmentAlphas(b, e, f)\n    }\n    var cK = 2;\n    var cL = 2;\n    var cM = 2;\n\n    function MBAnalyzeBestIntra16Mode(a) {\n        var b = (a.enc_.method_ >= 3) ? cK : 4;\n        var c;\n        var d = -1;\n        var e = 0;\n        VP8MakeLuma16Preds(a);\n        for (c = 0; c < b; ++c) {\n            var f = dE(a.yuv_in_, a.yuv_in_off + bk, a.yuv_p_, a.yuv_p_off + df[c], 0, 16);\n            if (f > d) {\n                d = f;\n                e = c\n            }\n        }\n        VP8SetIntra16Mode(a, e);\n        return d\n    }\n\n    function MBAnalyzeBestIntra4Mode(a, b) {\n        var c = Arr(16, int);\n        var d = (a.enc_.method_ >= 3) ? cL : NUM_BMODES;\n        var e = 0;\n        VP8IteratorStartI4(a);\n        do {\n            var f;\n            var g = -1;\n            var h = a.yuv_in_;\n            var i = a.yuv_in_off + bk + di[a.i4_];\n            VP8MakeIntra4Preds(a);\n            for (f = 0; f < d; ++f) {\n                var j = dE(h, i, a.yuv_p_, a.yuv_p_off + dh[f], 0, 1);\n                if (j > g) {\n                    g = j;\n                    c[a.i4_] = f\n                }\n            }\n            e += g\n        } while (VP8IteratorRotateI4(a, a.yuv_in_, a.yuv_in_off + bk));\n        if (e > b) {\n            VP8SetIntra4Mode(a, c);\n            b = ClipAlpha(e)\n        }\n        return b\n    }\n\n    function MBAnalyzeBestUVMode(a) {\n        var b = -1;\n        var c = 0;\n        var d = (a.enc_.method_ >= 3) ? cM : 4;\n        var e;\n        VP8MakeChroma8Preds(a);\n        for (e = 0; e < d; ++e) {\n            var f = dE(a.yuv_in_, a.yuv_in_off + bl, a.yuv_p_, a.yuv_p_off + dg[e], 16, 16 + 4 + 4);\n            if (f > b) {\n                b = f;\n                c = e\n            }\n        }\n        VP8SetIntraUVMode(a, c);\n        return b\n    }\n\n    function MBAnalyze(a, b, c) {\n        var d = a.enc_;\n        var e, best_uv_alpha = int;\n        VP8SetIntra16Mode(a, 0);\n        VP8SetSkip(a, 0);\n        VP8SetSegment(a, 0);\n        e = MBAnalyzeBestIntra16Mode(a);\n        if (d.method_ != 3) {\n            e = MBAnalyzeBestIntra4Mode(a, e)\n        }\n        best_uv_alpha = MBAnalyzeBestUVMode(a);\n        e = parseInt((e + best_uv_alpha + 1) / 2);\n        b[e]++;\n        c += best_uv_alpha;\n        a.mb_[a.mb_off].alpha_ = e;\n        return c\n    }\n\n    function VP8EncAnalyze(a) {\n        var b = Arr(256, 0);\n        var c = newObjectIt(bV);\n        VP8IteratorInit(a, c);\n        a.uv_alpha_ = 0;\n        do {\n            VP8IteratorImport(c);\n            a.uv_alpha_ = MBAnalyze(c, b, a.uv_alpha_)\n        } while (VP8IteratorNext(c, c.yuv_in_, c.yuv_in_off));\n        a.uv_alpha_ /= a.mb_w_ * a.mb_h_;\n        a.uv_alpha_ = parseInt(a.uv_alpha_);\n        AssignSegments(a, b);\n        return 1\n    }\n    var cN = 1;\n    var cO = 1;\n    var cP = 0;\n    var cQ = 1;\n    var cR = 64;\n    var cS = 30;\n    var cT = 100;\n    var cU = 0.9;\n\n    function MULT_8B(a, b) {\n        return (((a) * (b) + 128) >> 8)\n    }\n\n    function clip(v, m, M) {\n        return v < m ? m : v > M ? M : v\n    }\n    var cV = new Array(0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15);\n    var cW = new Array(4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157);\n    var cX = new Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284);\n    var cY = new Array(8, 8, 9, 10, 12, 13, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 62, 63, 65, 66, 68, 69, 71, 72, 74, 75, 77, 79, 80, 82, 83, 85, 86, 88, 89, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 124, 127, 130, 133, 136, 139, 142, 145, 148, 151, 155, 158, 161, 164, 167, 170, 173, 176, 179, 184, 189, 193, 198, 203, 207, 212, 217, 221, 226, 230, 235, 240, 244, 249, 254, 258, 263, 268, 274, 280, 286, 292, 299, 305, 311, 317, 323, 330, 336, 342, 348, 354, 362, 370, 379, 385, 393, 401, 409, 416, 424, 432, 440);\n    var cZ = new Array(0, 10, 20, 30, 10, 20, 30, 30, 20, 30, 30, 30, 30, 30, 30, 30);\n    var da = new Array(new Array(96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96), new Array(96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96), new Array(96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96));\n    var db = new Array(0, 30, 60, 90, 30, 60, 90, 90, 60, 90, 90, 90, 90, 90, 90, 90);\n\n    function ExpandMatrix(m, a) {\n        var i;\n        var b = 0;\n        for (i = 2; i < 16; ++i) {\n            m.q_[i] = m.q_[1]\n        }\n        for (i = 0; i < 16; ++i) {\n            var j = cV[i];\n            var c = da[a][j];\n            m.iq_[j] = parseInt((1 << bI) / m.q_[j]);\n            m.bias_[j] = BIAS(c);\n            m.zthresh_[j] = ((256 - c) * m.q_[j] + 127) >> 8;\n            m.sharpen_[j] = (db[j] * m.q_[j]) >> 11;\n            b += m.q_[j]\n        }\n        return (b + 8) >> 4\n    }\n\n    function SetupMatrices(a) {\n        var i;\n        var b = (a.method_ >= 4) ? a.config_.sns_strength : 0;\n        var c = a.segment_hdr_.num_segments_;\n        for (i = 0; i < c; ++i) {\n            var m = a.dqm_[i];\n            var q = m.quant_;\n            var d = int,\n                q16 = int,\n                quv = int;\n            m.y1_.q_[0] = cW[clip(q + a.dq_y1_dc_, 0, 127)];\n            m.y1_.q_[1] = cX[clip(q, 0, 127)];\n            m.y2_.q_[0] = cW[clip(q + a.dq_y2_dc_, 0, 127)] * 2;\n            m.y2_.q_[1] = cY[clip(q + a.dq_y2_ac_, 0, 127)];\n            m.uv_.q_[0] = cW[clip(q + a.dq_uv_dc_, 0, 117)];\n            m.uv_.q_[1] = cX[clip(q + a.dq_uv_ac_, 0, 127)];\n            d = ExpandMatrix(m.y1_, 0);\n            q16 = ExpandMatrix(m.y2_, 1);\n            quv = ExpandMatrix(m.uv_, 2); {\n                m.lambda_i4_ = (3 * d * d) >> 7;\n                m.lambda_i16_ = (3 * q16 * q16);\n                m.lambda_uv_ = (3 * quv * quv) >> 6;\n                m.lambda_mode_ = (1 * d * d) >> 7;\n                m.lambda_trellis_i4_ = (7 * d * d) >> 3;\n                m.lambda_trellis_i16_ = (q16 * q16) >> 2;\n                m.lambda_trellis_uv_ = (quv * quv) << 1;\n                m.tlambda_ = (b * d) >> 5\n            }\n        }\n    }\n    var dc = 3;\n\n    function SetupFilterStrength(a) {\n        var i;\n        var b = a.config_.filter_strength;\n        for (i = 0; i < be; ++i) {\n            var c = parseInt(b * 256 * a.dqm_[i].quant_ / 128);\n            var f = parseInt(c / (256 + a.dqm_[i].beta_));\n            a.dqm_[i].fstrength_ = (f < dc) ? 0 : (f > 63) ? 63 : f\n        }\n        a.filter_hdr_.level_ = a.dqm_[0].fstrength_;\n        a.filter_hdr_.simple_ = (a.config_.filter_type == 0) + 0;\n        a.filter_hdr_.sharpness_ = a.config_.filter_sharpness\n    }\n    var dd = (6);\n    var de = (-4);\n\n    function QualityToCompression(q) {\n        var c = q / 100.;\n        return (c < 0.75) ? c * (2. / 3.) : 2. * c - 1.\n    }\n\n    function VP8SetSegmentParams(a, b) {\n        var i;\n        var d, dq_uv_dc = int;\n        var e = a.config_.segments;\n        var f = cU * a.config_.sns_strength / 100. / 128.;\n        var g = QualityToCompression(b);\n        for (i = 0; i < e; ++i) {\n            var h = (1. - f * a.dqm_[i].alpha_) / 3.;\n            var c = Math.pow(g, h);\n            var q = parseInt((127. * (1. - c)));\n            assert(h > 0.);\n            a.dqm_[i].quant_ = clip(q, 0, 127)\n        }\n        a.base_quant_ = a.dqm_[0].quant_;\n        for (i = e; i < be; ++i) {\n            a.dqm_[i].quant_ = a.base_quant_\n        }\n        d = parseInt((a.uv_alpha_ - cR) * (dd - de) / (cT - cS));\n        d = parseInt(d * a.config_.sns_strength / 100);\n        d = clip(d, de, dd);\n        dq_uv_dc = parseInt(-4 * a.config_.sns_strength / 100);\n        dq_uv_dc = clip(dq_uv_dc, -15, 15);\n        a.dq_y1_dc_ = 0;\n        a.dq_y2_dc_ = 0;\n        a.dq_y2_ac_ = 0;\n        a.dq_uv_dc_ = dq_uv_dc;\n        a.dq_uv_ac_ = d;\n        SetupMatrices(a);\n        SetupFilterStrength(a)\n    }\n    var df = new Array(bo, bp, bq, br);\n    var dg = new Array(bs, bt, bu, bv);\n    var dh = new Array(bw, bx, by, bz, bA, bB, bC, bD, bE, bF);\n\n    function VP8MakeLuma16Preds(a) {\n        var b = a.enc_;\n        var c = a.x_ ? b.y_left_ : null;\n        var d = a.x_ ? b.y_left_off : null;\n        var e = a.y_ ? b.y_top_ : null;\n        var f = a.y_ ? b.y_top_off + a.x_ * 16 : null;\n        dK(a.yuv_p_, a.yuv_p_off, c, d, e, f)\n    }\n\n    function VP8MakeChroma8Preds(a) {\n        var b = a.enc_;\n        var c = a.x_ ? b.u_left_ : null;\n        var d = a.x_ ? b.u_left_off : null;\n        var e = a.y_ ? b.uv_top_ : null;\n        var f = a.y_ ? b.uv_top_off + a.x_ * 16 : null;\n        dL(a.yuv_p_, a.yuv_p_off, c, d, e, f)\n    }\n\n    function VP8MakeIntra4Preds(a) {\n        dJ(a.yuv_p_, a.yuv_p_off, a.i4_top_, a.i4_top_off)\n    }\n    var di = new Array(0 + 0 * bf, 4 + 0 * bf, 8 + 0 * bf, 12 + 0 * bf, 0 + 4 * bf, 4 + 4 * bf, 8 + 4 * bf, 12 + 4 * bf, 0 + 8 * bf, 4 + 8 * bf, 8 + 8 * bf, 12 + 8 * bf, 0 + 12 * bf, 4 + 12 * bf, 8 + 12 * bf, 12 + 12 * bf, 0 + 0 * bf, 4 + 0 * bf, 0 + 4 * bf, 4 + 4 * bf, 8 + 0 * bf, 12 + 0 * bf, 8 + 4 * bf, 12 + 4 * bf);\n    var dj = new Array(38, 32, 20, 9, 32, 28, 17, 7, 20, 17, 10, 4, 9, 7, 4, 2);\n    var dk = new Array(30, 27, 19, 11, 27, 24, 17, 10, 19, 17, 12, 8, 11, 10, 8, 6);\n\n    function InitScore(a) {\n        a.D = 0;\n        a.SD = 0;\n        a.R = 0;\n        a.nz = 0;\n        a.score = bH\n    }\n\n    function CopyScore(a, b) {\n        a.D = (b.D);\n        a.SD = (b.SD);\n        a.R = (b.R);\n        a.nz = (b.nz);\n        a.score = (b.score)\n    }\n\n    function AddScore(a, b) {\n        a.D += b.D;\n        a.SD += b.SD;\n        a.R += b.R;\n        a.nz |= b.nz;\n        a.score += b.score\n    }\n    var dl = {\n        prev: int,\n        level: int,\n        sign: int,\n        cost: score_t,\n        error: score_t,\n        ctx: int\n    };\n    var dm = 0;\n    var dn = 1;\n    var dp = (dm + 1 + dn);\n\n    function SetRDScore(a, b) {\n        b.score = b.R * a + 256 * (b.D + b.SD)\n    }\n\n    function RDScoreTrellis(a, b, c) {\n        return b * a + 256 * c\n    }\n\n    function TrellisQuantizeBlock(a, b, c, d, e, f, g) {\n        var h = a.enc_.proba_.coeffs_[e];\n        var i = a.enc_.proba_.level_cost_[e];\n        var k = (e == 0) ? 1 : 0;\n        var l = ArrM(new Array(17, dp), dl);\n        var o = new Array(-1, -1, -1);\n        var q = score_t;\n        var r;\n        var s = k - 1;\n        var n = int,\n            m = int,\n            p = int,\n            nz = int; {\n            var t = score_t;\n            var u = score_t;\n            var v = parseInt(f.q_[1] * f.q_[1] / 4);\n            var w = h[cw[k]][d][0];\n            u = 0;\n            for (n = k; n < 16; ++n) {\n                var j = cV[n];\n                var x = b[j] * b[j];\n                u += dk[j] * x;\n                if (x > v) s = n\n            }\n            if (s < 15) ++s;\n            t = VP8BitCost(0, w);\n            q = RDScoreTrellis(g, t, u);\n            n = k - 1;\n            for (m = -dm; m <= dn; ++m) {\n                l[n + 1][m + dm].cost = 0;\n                l[n + 1][m + dm].error = u;\n                l[n + 1][m + dm].ctx = d\n            }\n        }\n        for (n = k; n <= s; ++n) {\n            var j = cV[n];\n            var Q = f.q_[j];\n            var y = f.iq_[j];\n            var B = BIAS(0x00);\n            var z = (b[j] < 0) + 0;\n            var A = (z ? -b[j] : b[j]) + f.sharpen_[j];\n            var C;\n            if (A > 2047) A = 2047;\n            C = QUANTDIV(A, y, B);\n            for (m = -dm; m <= dn; ++m) {\n                var D = l[n + 1][m + dm];\n                var E, new_error;\n                var F = bH;\n                var G = C + m;\n                var w;\n                D.sign = z;\n                D.level = G;\n                D.ctx = (G == 0) ? 0 : (G == 1) ? 1 : 2;\n                if (G >= 2048 || G < 0) {\n                    D.cost = bH;\n                    continue\n                }\n                w = h[cw[n + 1]][D.ctx][0];\n                new_error = A - G * Q;\n                E = dk[j] * (A * A - new_error * new_error);\n                for (p = -dm; p <= dn; ++p) {\n                    var H = l[n - 1 + 1][p + dm];\n                    var I = H.ctx;\n                    var J = i[cw[n]][I];\n                    var K = H.error - E;\n                    var t = score_t,\n                        base_cost = score_t,\n                        score = score_t;\n                    if (H.cost >= bH) {\n                        continue\n                    }\n                    base_cost = H.cost + VP8LevelCost(J, G);\n                    t = base_cost;\n                    if (G && n < 15) {\n                        t += VP8BitCost(1, w)\n                    }\n                    score = RDScoreTrellis(g, t, K);\n                    if (score < F) {\n                        F = score;\n                        D.cost = t;\n                        D.error = K;\n                        D.prev = p\n                    }\n                    if (G) {\n                        t = base_cost;\n                        if (n < 15) t += VP8BitCost(0, w);\n                        score = RDScoreTrellis(g, t, K);\n                        if (score < q) {\n                            q = score;\n                            o[0] = n;\n                            o[1] = m;\n                            o[2] = p\n                        }\n                    }\n                }\n            }\n        }\n        memset_(b, +k, 0, (16 - k) * sizeof(b));\n        memset_(c, +k, 0, (16 - k) * sizeof(c));\n        if (o[0] == -1) {\n            return 0\n        }\n        n = o[0];\n        r = o[1];\n        l[n + 1][r + dm].prev = o[2];\n        nz = 0;\n        for (; n >= k; --n) {\n            var L = l[n + 1][r + dm];\n            var j = cV[n];\n            c[n] = L.sign ? -L.level : L.level;\n            nz |= (L.level != 0);\n            b[j] = c[n] * f.q_[j];\n            r = L.prev\n        }\n        return nz\n    }\n\n    function ReconstructIntra16(a, b, c, d, e) {\n        var f = a.enc_;\n        var g = a.yuv_p_;\n        var h = a.yuv_p_off + df[e];\n        var i = a.yuv_in_;\n        var j = a.yuv_in_off + bk;\n        var k = f.dqm_[a.mb_[a.mb_off].segment_];\n        var l = 0;\n        var n = int;\n        var m = ArrM(Array(16, 16), int16_t),\n            dc_tmp = Arr(16, int16_t);\n        for (n = 0; n < 16; ++n) {\n            dG(i, j + di[n], g, h + di[n], m[n])\n        }\n        dI(m, dc_tmp);\n        l |= dS(dc_tmp, b.y_dc_levels, 0, k.y2_) << 24;\n        if (cO && a.do_trellis_) {\n            var x, y;\n            VP8IteratorNzToBytes(a);\n            for (y = 0, n = 0; y < 4; ++y) {\n                for (x = 0; x < 4; ++x) {\n                    var o = a.top_nz_[x] + a.left_nz_[y];\n                    var p = TrellisQuantizeBlock(a, m[n], b.y_ac_levels[n], o, 0, k.y1_, k.lambda_trellis_i16_);\n                    a.top_nz_[x] = a.left_nz_[y] = p;\n                    l |= p << n;\n                    ++n\n                }\n            }\n        } else {\n            for (n = 0; n < 16; ++n) {\n                l |= dS(m[n], b.y_ac_levels[n], 1, k.y1_) << n\n            }\n        }\n        dH(dc_tmp, m);\n        for (n = 0; n < 16; n += 2) {\n            dF(g, h + di[n], m[n], 0, c, d + di[n], 1)\n        }\n        return l\n    }\n\n    function ReconstructIntra4(a, b, c, d, e, f, g) {\n        var h = a.enc_;\n        var i = a.yuv_p_;\n        var j = a.yuv_p_off + dh[g];\n        var k = h.dqm_[a.mb_[a.mb_off].segment_];\n        var l = 0;\n        var m = Arr(16, int16_t);\n        dG(c, d, i, j, m);\n        if (cN && a.do_trellis_) {\n            var x = a.i4_ & 3,\n                y = a.i4_ >> 2;\n            var n = a.top_nz_[x] + a.left_nz_[y];\n            l = TrellisQuantizeBlock(a, m, b, n, 3, k.y1_, k.lambda_trellis_i4_)\n        } else {\n            l = dS(m, b, 0, k.y1_)\n        }\n        dF(i, j, m, 0, e, f, 0);\n        return l\n    }\n\n    function ReconstructUV(a, b, c, d, e) {\n        var f = a.enc_;\n        var g = a.yuv_p_;\n        var h = a.yuv_p_off + dg[e];\n        var i = a.yuv_in_;\n        var j = a.yuv_in_off + bl;\n        var k = f.dqm_[a.mb_[a.mb_off].segment_];\n        var l = 0;\n        var n;\n        var m = ArrM(new Array(8, 16), int16_t);\n        for (n = 0; n < 8; ++n) {\n            dG(i, j + di[16 + n], g, h + di[16 + n], m[n])\n        }\n        if (cP && a.do_trellis_) {\n            var o, x, y;\n            for (o = 0; o <= 2; o += 2) {\n                n = 0;\n                for (y = 0; y < 2; ++y) {\n                    for (x = 0; x < 2; ++x) {\n                        var p = a.top_nz_[4 + o + x] + a.left_nz_[4 + o + y];\n                        var q = TrellisQuantizeBlock(a, m[n], b.uv_levels[n], p, 2, k.uv_, k.lambda_trellis_uv_);\n                        a.top_nz_[4 + o + x] = a.left_nz_[4 + o + y] = q;\n                        l |= q << n;\n                        ++n\n                    }\n                }\n            }\n        } else {\n            for (n = 0; n < 8; ++n) {\n                l |= dS(m[n], b.uv_levels[n], 0, k.uv_) << n\n            }\n        }\n        for (n = 0; n < 8; n += 1) {\n            dF(g, h + di[16 + n], m[n], 0, c, d + di[16 + n], 0)\n        }\n        return (l << 16)\n    }\n\n    function SwapPtr(a, c, b, d) {}\n\n    function SwapOut(a) {\n        var b = (a.yuv_out_);\n        var c = (a.yuv_out_off);\n        a.yuv_out_ = (a.yuv_out2_);\n        a.yuv_out_off = (a.yuv_out2_off);\n        a.yuv_out2_ = (b);\n        a.yuv_out2_off = (c)\n    }\n    var dq = newObjectIt(bU);\n\n    function PickBestIntra16(a, b) {\n        var c = a.enc_;\n        var d = c.dqm_[a.mb_[a.mb_off].segment_];\n        var e = d.lambda_i16_;\n        var f = d.tlambda_;\n        var g = a.yuv_in_;\n        var h = a.yuv_in_off + bk;\n        var i = (dq);\n        var j;\n        b.mode_i16 = -1;\n        for (j = 0; j < 4; ++j) {\n            var k = a.yuv_out2_;\n            var l = a.yuv_out2_off + bk;\n            var m = int;\n            m = ReconstructIntra16(a, i, k, l, j);\n            i.D = dM(g, h, k, l);\n            i.SD = f ? MULT_8B(f, dR(g, h, k, l, dj)) : 0;\n            i.R = VP8GetCostLuma16(a, i);\n            i.R += ct[j];\n            SetRDScore(e, i);\n            if (j == 0 || i.score < b.score) {\n                CopyScore(b, i);\n                b.mode_i16 = j;\n                b.nz = m;\n                memcpyArrM(b.y_ac_levels, 0, i.y_ac_levels, 0, i.y_ac_levels.length);\n                memcpy(b.y_dc_levels, 0, i.y_dc_levels, 0, i.y_dc_levels.length);\n                SwapOut(a)\n            }\n        }\n        SetRDScore(d.lambda_mode_, b);\n        VP8SetIntra16Mode(a, b.mode_i16)\n    }\n\n    function GetCostModeI4(a, b) {\n        var c = a.enc_.preds_w_;\n        var x = (a.i4_ & 3),\n            y = a.i4_ >> 2;\n        var d = (x == 0) ? a.preds_[a.preds_off + y * c - 1] : b[a.i4_ - 1];\n        var e = (y == 0) ? a.preds_[a.preds_off - c + x] : b[a.i4_ - 4];\n        return cu[e][d]\n    }\n    var dr = newObjectIt(bU);\n    var ds = newObjectIt(bU);\n    var dt = newObjectIt(bU);\n\n    function PickBestIntra4(a, b) {\n        var c = a.enc_;\n        var d = c.dqm_[a.mb_[a.mb_off].segment_];\n        var e = d.lambda_i4_;\n        var f = d.tlambda_;\n        var g = a.yuv_in_;\n        var h = a.yuv_in_off + bk;\n        var i = a.yuv_out2_;\n        var j = a.yuv_out2_off + bk;\n        var k = 0;\n        var l = (dr);\n        if (c.max_i4_header_bits_ == 0) {\n            return 0\n        }\n        InitScore(l);\n        l.score = 211;\n        VP8IteratorStartI4(a);\n        do {\n            var m = (ds);\n            var n;\n            var o = -1;\n            var p = g;\n            var q = h + di[a.i4_];\n            var r = GetCostModeI4(a, b.modes_i4);\n            var s = (i);\n            var t = (j + di[a.i4_]);\n            var u = (a.yuv_p_);\n            var v = (a.yuv_p_off + bG);\n            InitScore(m);\n            VP8MakeIntra4Preds(a);\n            for (n = 0; n < NUM_BMODES; ++n) {\n                var w = (dt);\n                var x = Arr(16, int16_t);\n                w.nz = ReconstructIntra4(a, x, p, q, u, v, n) << a.i4_;\n                w.D = dP(p, q, u, v);\n                w.SD = f ? MULT_8B(f, dQ(p, q, u, v, dj)) : 0;\n                w.R = VP8GetCostLuma4(a, x);\n                w.R += r[n];\n                SetRDScore(e, w);\n                if (o < 0 || w.score < m.score) {\n                    CopyScore(m, w);\n                    o = n;\n                    var y = (u);\n                    var z = (v);\n                    u = (s);\n                    v = (t);\n                    s = (y);\n                    t = (z);\n                    memcpy(l.y_ac_levels[a.i4_], 0, x, 0, sizeof(x) * 16)\n                }\n            }\n            SetRDScore(d.lambda_mode_, m);\n            AddScore(l, m);\n            k += r[o];\n            if (l.score >= b.score || k > c.max_i4_header_bits_) {\n                return 0\n            }\n            if (t != j + di[a.i4_]) dT(s, t, i, j + di[a.i4_]);\n            b.modes_i4[a.i4_] = o;\n            a.top_nz_[a.i4_ & 3] = a.left_nz_[a.i4_ >> 2] = (m.nz ? 1 : 0)\n        } while (VP8IteratorRotateI4(a, i, j));\n        CopyScore(b, l);\n        VP8SetIntra4Mode(a, b.modes_i4);\n        SwapOut(a);\n        memcpyArrM(b.y_ac_levels, 0, l.y_ac_levels, 0, b.y_ac_levels.length);\n        return 1\n    }\n    var du = newObjectIt(bU);\n    var dv = newObjectIt(bU);\n\n    function PickBestUV(a, b) {\n        var c = a.enc_;\n        var d = c.dqm_[a.mb_[a.mb_off].segment_];\n        var e = d.lambda_uv_;\n        var f = a.yuv_in_;\n        var g = a.yuv_in_off + bl;\n        var h = a.yuv_out2_;\n        var i = a.yuv_out2_off + bl;\n        var j = a.yuv_out_;\n        var k = a.yuv_out_off + bl;\n        var l = (du);\n        var m;\n        b.mode_uv = -1;\n        InitScore(l);\n        for (m = 0; m < 4; ++m) {\n            var n = (dv);\n            n.nz = ReconstructUV(a, n, h, i, m);\n            n.D = dO(f, g, h, i);\n            n.SD = 0;\n            n.R = VP8GetCostUV(a, n);\n            n.R += cs[m];\n            SetRDScore(e, n);\n            if (m == 0 || n.score < l.score) {\n                CopyScore(l, n);\n                b.mode_uv = m;\n                memcpyArrM(b.uv_levels, 0, n.uv_levels, 0, b.uv_levels.length);\n                memcpy(j, k, h, i, bh)\n            }\n        }\n        VP8SetIntraUVMode(a, b.mode_uv);\n        AddScore(b, l)\n    }\n\n    function SimpleQuantize(a, b) {\n        var c = a.enc_;\n        var d = (a.mb_[a.mb_off].type_ == 1);\n        var e = 0;\n        if (d) {\n            e = ReconstructIntra16(a, b, a.yuv_out_, a.yuv_out_off + bk, a.preds_[a.preds_off + 0])\n        } else {\n            VP8IteratorStartI4(a);\n            do {\n                var f = a.preds_[a.preds_off + (a.i4_ & 3) + (a.i4_ >> 2) * c.preds_w_];\n                var g = a.yuv_in_;\n                var h = a.yuv_in_off + bk + di[a.i4_];\n                var i = a.yuv_out_;\n                var j = a.yuv_out_off + bk + di[a.i4_];\n                VP8MakeIntra4Preds(a);\n                e |= ReconstructIntra4(a, b.y_ac_levels[a.i4_], g, h, i, j, f) << a.i4_\n            } while (VP8IteratorRotateI4(a, a.yuv_out_, a.yuv_out_off + bk))\n        }\n        e |= ReconstructUV(a, b, a.yuv_out_, a.yuv_out_off + bl, a.mb_[a.mb_off].uv_mode_);\n        b.nz = e\n    }\n\n    function VP8Decimate(a, b, c) {\n        var d = int;\n        InitScore(b);\n        VP8MakeLuma16Preds(a);\n        VP8MakeChroma8Preds(a);\n        if (c > 0) {\n            a.do_trellis_ = (c > 2) + 0;\n            PickBestIntra16(a, b);\n            if (a.enc_.method_ >= 2) {\n                PickBestIntra4(a, b)\n            }\n            PickBestUV(a, b);\n            if (c == 2) {\n                a.do_trellis_ = 1;\n                SimpleQuantize(a, b)\n            }\n        } else {\n            a.do_trellis_ = (a.enc_.method_ == 2) + 0;\n            SimpleQuantize(a, b)\n        }\n        d = (b.nz == 0) + 0;\n        VP8SetSkip(a, d);\n        return d\n    }\n    var dw = new Array(new Array(new Array(new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128), new Array(189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128), new Array(106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128)), new Array(new Array(1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128), new Array(181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128), new Array(78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128)), new Array(new Array(1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128), new Array(184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128), new Array(77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128)), new Array(new Array(1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128), new Array(170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128), new Array(37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128)), new Array(new Array(1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128), new Array(207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128), new Array(102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128)), new Array(new Array(1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128), new Array(177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128), new Array(80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128)), new Array(new Array(1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128))), new Array(new Array(new Array(198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62), new Array(131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1), new Array(68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128)), new Array(new Array(1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128), new Array(184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128), new Array(81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128)), new Array(new Array(1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128), new Array(99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128), new Array(23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128)), new Array(new Array(1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128), new Array(109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128), new Array(44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128)), new Array(new Array(1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128), new Array(94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128), new Array(22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128)), new Array(new Array(1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128), new Array(124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128), new Array(35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128)), new Array(new Array(1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128), new Array(121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128), new Array(45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128)), new Array(new Array(1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128), new Array(203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128), new Array(137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128))), new Array(new Array(new Array(253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128), new Array(175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128), new Array(73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128)), new Array(new Array(1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128), new Array(239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128), new Array(155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128)), new Array(new Array(1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128), new Array(201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128), new Array(69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128)), new Array(new Array(1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128), new Array(223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128), new Array(141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128)), new Array(new Array(1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128), new Array(190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128), new Array(149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128), new Array(213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128), new Array(55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128))), new Array(new Array(new Array(202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255), new Array(126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128), new Array(61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128)), new Array(new Array(1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128), new Array(166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128), new Array(39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128)), new Array(new Array(1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128), new Array(124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128), new Array(24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128)), new Array(new Array(1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128), new Array(149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128), new Array(28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128)), new Array(new Array(1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128), new Array(123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128), new Array(20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128)), new Array(new Array(1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128), new Array(168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128), new Array(47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128)), new Array(new Array(1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128), new Array(141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128), new Array(42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128)), new Array(new Array(1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128))));\n\n    function VP8DefaultProbas(a) {\n        var b = a.proba_;\n        for (var i = 0; i < b.segments_.length; ++i) b.segments_[i] = 255;\n        b.coeffs_ = newObjectIt(dw);\n        b.use_skip_proba_ = 0\n    }\n    var dx = new Array(new Array(new Array(231, 120, 48, 89, 115, 113, 120, 152, 112), new Array(152, 179, 64, 126, 170, 118, 46, 70, 95), new Array(175, 69, 143, 80, 85, 82, 72, 155, 103), new Array(56, 58, 10, 171, 218, 189, 17, 13, 152), new Array(114, 26, 17, 163, 44, 195, 21, 10, 173), new Array(121, 24, 80, 195, 26, 62, 44, 64, 85), new Array(144, 71, 10, 38, 171, 213, 144, 34, 26), new Array(170, 46, 55, 19, 136, 160, 33, 206, 71), new Array(63, 20, 8, 114, 114, 208, 12, 9, 226), new Array(81, 40, 11, 96, 182, 84, 29, 16, 36)), new Array(new Array(134, 183, 89, 137, 98, 101, 106, 165, 148), new Array(72, 187, 100, 130, 157, 111, 32, 75, 80), new Array(66, 102, 167, 99, 74, 62, 40, 234, 128), new Array(41, 53, 9, 178, 241, 141, 26, 8, 107), new Array(74, 43, 26, 146, 73, 166, 49, 23, 157), new Array(65, 38, 105, 160, 51, 52, 31, 115, 128), new Array(104, 79, 12, 27, 217, 255, 87, 17, 7), new Array(87, 68, 71, 44, 114, 51, 15, 186, 23), new Array(47, 41, 14, 110, 182, 183, 21, 17, 194), new Array(66, 45, 25, 102, 197, 189, 23, 18, 22)), new Array(new Array(88, 88, 147, 150, 42, 46, 45, 196, 205), new Array(43, 97, 183, 117, 85, 38, 35, 179, 61), new Array(39, 53, 200, 87, 26, 21, 43, 232, 171), new Array(56, 34, 51, 104, 114, 102, 29, 93, 77), new Array(39, 28, 85, 171, 58, 165, 90, 98, 64), new Array(34, 22, 116, 206, 23, 34, 43, 166, 73), new Array(107, 54, 32, 26, 51, 1, 81, 43, 31), new Array(68, 25, 106, 22, 64, 171, 36, 225, 114), new Array(34, 19, 21, 102, 132, 188, 16, 76, 124), new Array(62, 18, 78, 95, 85, 57, 50, 48, 51)), new Array(new Array(193, 101, 35, 159, 215, 111, 89, 46, 111), new Array(60, 148, 31, 172, 219, 228, 21, 18, 111), new Array(112, 113, 77, 85, 179, 255, 38, 120, 114), new Array(40, 42, 1, 196, 245, 209, 10, 25, 109), new Array(88, 43, 29, 140, 166, 213, 37, 43, 154), new Array(61, 63, 30, 155, 67, 45, 68, 1, 209), new Array(100, 80, 8, 43, 154, 1, 51, 26, 71), new Array(142, 78, 78, 16, 255, 128, 34, 197, 171), new Array(41, 40, 5, 102, 211, 183, 4, 1, 221), new Array(51, 50, 17, 168, 209, 192, 23, 25, 82)), new Array(new Array(138, 31, 36, 171, 27, 166, 38, 44, 229), new Array(67, 87, 58, 169, 82, 115, 26, 59, 179), new Array(63, 59, 90, 180, 59, 166, 93, 73, 154), new Array(40, 40, 21, 116, 143, 209, 34, 39, 175), new Array(47, 15, 16, 183, 34, 223, 49, 45, 183), new Array(46, 17, 33, 183, 6, 98, 15, 32, 183), new Array(57, 46, 22, 24, 128, 1, 54, 17, 37), new Array(65, 32, 73, 115, 28, 128, 23, 128, 205), new Array(40, 3, 9, 115, 51, 192, 18, 6, 223), new Array(87, 37, 9, 115, 59, 77, 64, 21, 47)), new Array(new Array(104, 55, 44, 218, 9, 54, 53, 130, 226), new Array(64, 90, 70, 205, 40, 41, 23, 26, 57), new Array(54, 57, 112, 184, 5, 41, 38, 166, 213), new Array(30, 34, 26, 133, 152, 116, 10, 32, 134), new Array(39, 19, 53, 221, 26, 114, 32, 73, 255), new Array(31, 9, 65, 234, 2, 15, 1, 118, 73), new Array(75, 32, 12, 51, 192, 255, 160, 43, 51), new Array(88, 31, 35, 67, 102, 85, 55, 186, 85), new Array(56, 21, 23, 111, 59, 205, 45, 37, 192), new Array(55, 38, 70, 124, 73, 102, 1, 34, 98)), new Array(new Array(125, 98, 42, 88, 104, 85, 117, 175, 82), new Array(95, 84, 53, 89, 128, 100, 113, 101, 45), new Array(75, 79, 123, 47, 51, 128, 81, 171, 1), new Array(57, 17, 5, 71, 102, 57, 53, 41, 49), new Array(38, 33, 13, 121, 57, 73, 26, 1, 85), new Array(41, 10, 67, 138, 77, 110, 90, 47, 114), new Array(115, 21, 2, 10, 102, 255, 166, 23, 6), new Array(101, 29, 16, 10, 85, 128, 101, 196, 26), new Array(57, 18, 10, 102, 102, 213, 34, 20, 43), new Array(117, 20, 15, 36, 163, 128, 68, 1, 26)), new Array(new Array(102, 61, 71, 37, 34, 53, 31, 243, 192), new Array(69, 60, 71, 38, 73, 119, 28, 222, 37), new Array(68, 45, 128, 34, 1, 47, 11, 245, 171), new Array(62, 17, 19, 70, 146, 85, 55, 62, 70), new Array(37, 43, 37, 154, 100, 163, 85, 160, 1), new Array(63, 9, 92, 136, 28, 64, 32, 201, 85), new Array(75, 15, 9, 9, 64, 255, 184, 119, 16), new Array(86, 6, 28, 5, 64, 255, 25, 248, 1), new Array(56, 8, 17, 132, 137, 255, 55, 116, 128), new Array(58, 15, 20, 82, 135, 57, 26, 121, 40)), new Array(new Array(164, 50, 31, 137, 154, 133, 25, 35, 218), new Array(51, 103, 44, 131, 131, 123, 31, 6, 158), new Array(86, 40, 64, 135, 148, 224, 45, 183, 128), new Array(22, 26, 17, 131, 240, 154, 14, 1, 209), new Array(45, 16, 21, 91, 64, 222, 7, 1, 197), new Array(56, 21, 39, 155, 60, 138, 23, 102, 213), new Array(83, 12, 13, 54, 192, 255, 68, 47, 28), new Array(85, 26, 85, 85, 128, 128, 32, 146, 171), new Array(18, 11, 7, 63, 144, 171, 4, 4, 246), new Array(35, 27, 10, 146, 174, 171, 12, 26, 128)), new Array(new Array(190, 80, 35, 99, 180, 80, 126, 54, 45), new Array(85, 126, 47, 87, 176, 51, 41, 20, 32), new Array(101, 75, 128, 139, 118, 146, 116, 128, 85), new Array(56, 41, 15, 176, 236, 85, 37, 9, 62), new Array(71, 30, 17, 119, 118, 255, 17, 18, 138), new Array(101, 38, 60, 138, 55, 70, 43, 26, 142), new Array(146, 36, 19, 30, 171, 255, 97, 27, 20), new Array(138, 45, 61, 62, 219, 1, 81, 188, 64), new Array(32, 41, 20, 117, 151, 142, 20, 21, 163), new Array(112, 19, 12, 61, 195, 128, 48, 4, 24)));\n\n    function PutI4Mode(a, b, c) {\n        if (VP8PutBit(a, b != bd, c[0])) {\n            if (VP8PutBit(a, b != B_TM_PRED, c[1])) {\n                if (VP8PutBit(a, b != B_VE_PRED, c[2])) {\n                    if (!VP8PutBit(a, b >= B_LD_PRED, c[3])) {\n                        if (VP8PutBit(a, b != B_HE_PRED, c[4])) {\n                            VP8PutBit(a, b != B_RD_PRED, c[5])\n                        }\n                    } else {\n                        if (VP8PutBit(a, b != B_LD_PRED, c[6])) {\n                            if (VP8PutBit(a, b != B_VL_PRED, c[7])) {\n                                VP8PutBit(a, b != B_HD_PRED, c[8])\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        return b\n    }\n\n    function PutI16Mode(a, b) {\n        if (VP8PutBit(a, (b == TM_PRED || b == H_PRED), 156)) {\n            VP8PutBit(a, b == TM_PRED, 128)\n        } else {\n            VP8PutBit(a, b == V_PRED, 163)\n        }\n    }\n\n    function PutUVMode(a, b) {\n        if (VP8PutBit(a, b != DC_PRED, 142)) {\n            if (VP8PutBit(a, b != V_PRED, 114)) {\n                VP8PutBit(a, b != H_PRED, 183)\n            }\n        }\n    }\n\n    function PutSegment(a, s, p, b) {\n        if (VP8PutBit(a, s >= 2, p[b + 0])) b += 1;\n        VP8PutBit(a, s & 1, p[b + 1])\n    }\n    var dy = newObjectIt(bV);\n\n    function VP8CodeIntraModes(a) {\n        var b = a.bw_;\n        var c = (dy);\n        VP8IteratorInit(a, c);\n        do {\n            var d = c.mb_[c.mb_off];\n            var e = c.preds_;\n            var f = c.preds_off;\n            if (a.segment_hdr_.update_map_) {\n                PutSegment(b, d.segment_, a.proba_.segments_, 0)\n            }\n            if (a.proba_.use_skip_proba_) {\n                VP8PutBit(b, d.skip_, a.proba_.skip_proba_)\n            }\n            if (VP8PutBit(b, (d.type_ != 0), 145)) {\n                PutI16Mode(b, e[f + 0])\n            } else {\n                var g = a.preds_w_;\n                var h = e;\n                var i = f - g;\n                var x, y;\n                for (y = 0; y < 4; ++y) {\n                    var j = e[f - 1];\n                    for (x = 0; x < 4; ++x) {\n                        var k = dx[h[i + x]][j];\n                        j = PutI4Mode(b, e[f + x], k)\n                    }\n                    i = f;\n                    f += g\n                }\n            }\n            PutUVMode(b, d.uv_mode_)\n        } while (VP8IteratorNext(c, 0, 0))\n    }\n    var dz = new Array(new Array(new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255), new Array(250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255), new Array(234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255), new Array(251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255), new Array(248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))));\n\n    function VP8WriteProbas(a, d) {\n        var t, b, c, p;\n        for (t = 0; t < NUM_TYPES; ++t) {\n            for (b = 0; b < NUM_BANDS; ++b) {\n                for (c = 0; c < NUM_CTX; ++c) {\n                    for (p = 0; p < NUM_PROBAS; ++p) {\n                        var e = d.coeffs_[t][b][c][p];\n                        var f = (e != dw[t][b][c][p]) + 0;\n                        if (VP8PutBit(a, f, dz[t][b][c][p])) {\n                            VP8PutValue(a, e, 8)\n                        }\n                    }\n                }\n            }\n        }\n        if (VP8PutBitUniform(a, d.use_skip_proba_)) {\n            VP8PutValue(a, d.skip_proba_, 8)\n        }\n    }\n\n    function ClipAlpha(a) {\n        return a < 0 ? 0 : a > 255 ? 255 : a\n    }\n\n    function VP8GetAlpha(a) {\n        var b = 0,\n            den = 0,\n            val = 0;\n        var k;\n        var c = int;\n        for (k = 0; k < bc; ++k) {\n            if (a[k + 1]) {\n                val += a[k + 1];\n                b += val * (k + 1);\n                den += (k + 1) * (k + 1)\n            }\n        }\n        c = den ? parseInt(10 * b / den - 5) : 0;\n        return ClipAlpha(c)\n    }\n\n    function CollectHistogram(a, b, c, d, e, f) {\n        var g = Arr(bc + 1, 0);\n        var h = Arr(16, int16_t);\n        var j, k;\n        for (j = e; j < f; ++j) {\n            dG(a, b + di[j], c, d + di[j], h);\n            for (k = 0; k < 16; ++k) {\n                var v = Math.abs(h[k]) >> 2;\n                h[k] = (v > bc) ? bc : v\n            }\n            for (k = 0; k < 16; ++k) {\n                g[h[k]]++\n            }\n        }\n        return VP8GetAlpha(g)\n    }\n    var cj = Arr((255 + 510 + 1), uint8_t);\n    var ck = 0;\n\n    function InitTables(a) {\n        if (!ck) {\n            var i;\n            for (i = -255; i <= 255 + 255; ++i) {\n                cj[255 + i] = (i < 0) ? 0 : (i > 255) ? 255 : i\n            }\n            ck = 1\n        }\n    }\n\n    function clip_8b(v) {\n        return (!(v & ~0xff)) ? v : v < 0 ? 0 : 255\n    }\n    var dA = 20091 + (1 << 16);\n    var dB = 35468;\n\n    function MUL(a, b) {\n        return (((a) * (b)) >> 16)\n    }\n    var C = Arr(4 * 4, int),\n        dD, tmp_off;\n    tmp_off = 0;\n\n    function ITransformOne(e, f, g, h, j, k) {\n        var C = Arr(4 * 4, int),\n            dD, tmp_off;\n        tmp_off = 0;\n        var i;\n        dD = C;\n        for (i = 0; i < 4; ++i) {\n            var a = g[h + 0] + g[h + 8];\n            var b = g[h + 0] - g[h + 8];\n            var c = ((g[h + 4] * dB) >> 16) - ((g[h + 12] * dA) >> 16);\n            var d = ((g[h + 4] * dA) >> 16) + ((g[h + 12] * dB) >> 16);\n            dD[tmp_off + 0] = a + d;\n            dD[tmp_off + 1] = b + c;\n            dD[tmp_off + 2] = b - c;\n            dD[tmp_off + 3] = a - d;\n            tmp_off += 4;\n            h++\n        }\n        tmp_off = 0;\n        for (i = 0; i < 4; ++i) {\n            var l = dD[tmp_off + 0] + 4;\n            var a = l + dD[tmp_off + 8];\n            var b = l - dD[tmp_off + 8];\n            var c = ((dD[tmp_off + 4] * dB) >> 16) - ((dD[tmp_off + 12] * dA) >> 16);\n            var d = ((dD[tmp_off + 4] * dA) >> 16) + ((dD[tmp_off + 12] * dB) >> 16);\n            j[k + 0 + i * bf] = clip_8b(e[f + 0 + i * bf] + ((a + d) >> 3));\n            j[k + 1 + i * bf] = clip_8b(e[f + 1 + i * bf] + ((b + c) >> 3));\n            j[k + 2 + i * bf] = clip_8b(e[f + 2 + i * bf] + ((b - c) >> 3));\n            j[k + 3 + i * bf] = clip_8b(e[f + 3 + i * bf] + ((a - d) >> 3));\n            tmp_off++\n        }\n    }\n\n    function ITransform(a, b, c, d, e, f, g) {\n        ITransformOne(a, b, c, d, e, f);\n        if (g) {\n            ITransformOne(a, b + 4, c, d + 16, e, f + 4)\n        }\n    }\n\n    function FTransform(a, b, c, d, e) {\n        var i;\n        for (i = 0; i < 4; ++i) {\n            var f = a[b + 0] - c[d + 0];\n            var g = a[b + 1] - c[d + 1];\n            var h = a[b + 2] - c[d + 2];\n            var j = a[b + 3] - c[d + 3];\n            var k = (f + j) << 3;\n            var l = (g + h) << 3;\n            var m = (g - h) << 3;\n            var n = (f - j) << 3;\n            dD[0 + i * 4] = (k + l) + 0;\n            dD[1 + i * 4] = (m * 2217 + n * 5352 + 14500) >> 12;\n            dD[2 + i * 4] = (k - l) + 0;\n            dD[3 + i * 4] = (n * 2217 - m * 5352 + 7500) >> 12;\n            b += bf, d += bf\n        }\n        for (i = 0; i < 4; ++i) {\n            var k = (dD[0 + i] + dD[12 + i]);\n            var l = (dD[4 + i] + dD[8 + i]);\n            var m = (dD[4 + i] - dD[8 + i]);\n            var n = (dD[0 + i] - dD[12 + i]);\n            e[0 + i] = (k + l + 7) >> 4;\n            e[4 + i] = ((m * 2217 + n * 5352 + 12000) >> 16) + (n != 0) + 0;\n            e[8 + i] = (k - l + 7) >> 4;\n            e[12 + i] = ((n * 2217 - m * 5352 + 51000) >> 16)\n        }\n        return e\n    }\n    var dC = 0;\n\n    function ITransformWHT(a, b) {\n        dC = 0;\n        var i;\n        for (i = 0; i < 4; ++i) {\n            var c = a[0 + i] + a[12 + i];\n            var d = a[4 + i] + a[8 + i];\n            var e = a[4 + i] - a[8 + i];\n            var f = a[0 + i] - a[12 + i];\n            dD[0 + i] = c + d;\n            dD[8 + i] = c - d;\n            dD[4 + i] = f + e;\n            dD[12 + i] = f - e\n        }\n        for (i = 0; i < 4; ++i) {\n            var g = dD[0 + i * 4] + 3;\n            var c = g + dD[3 + i * 4];\n            var d = dD[1 + i * 4] + dD[2 + i * 4];\n            var e = dD[1 + i * 4] - dD[2 + i * 4];\n            var f = g - dD[3 + i * 4];\n            b[dC + 0][0] = (c + d) >> 3;\n            b[dC + 1][0] = (f + e) >> 3;\n            b[dC + 2][0] = (c - d) >> 3;\n            b[dC + 3][0] = (f - e) >> 3;\n            dC += 4\n        }\n    }\n\n    function FTransformWHT(a, b) {\n        var c = 0;\n        var i;\n        for (i = 0; i < 4; ++i) {\n            var d = (a[c + 0][0] + a[c + 2][0]) << 2;\n            var e = (a[c + 1][0] + a[c + 3][0]) << 2;\n            var f = (a[c + 1][0] - a[c + 3][0]) << 2;\n            var g = (a[c + 0][0] - a[c + 2][0]) << 2;\n            dD[0 + i * 4] = (d + e) + (d != 0) + 0;\n            dD[1 + i * 4] = g + f;\n            dD[2 + i * 4] = g - f;\n            dD[3 + i * 4] = d - e;\n            c += 4\n        }\n        for (i = 0; i < 4; ++i) {\n            var d = (dD[0 + i] + dD[8 + i]);\n            var e = (dD[4 + i] + dD[12 + i]);\n            var f = (dD[4 + i] - dD[12 + i]);\n            var g = (dD[0 + i] - dD[8 + i]);\n            var h = d + e;\n            var j = g + f;\n            var k = g - f;\n            var l = d - e;\n            b[0 + i] = (h + (h > 0) + 3) >> 3;\n            b[4 + i] = (j + (j > 0) + 3) >> 3;\n            b[8 + i] = (k + (k > 0) + 3) >> 3;\n            b[12 + i] = (l + (l > 0) + 3) >> 3\n        }\n    }\n\n    function Fill(a, b, c, d) {\n        var j;\n        for (j = 0; j < d; ++j) {\n            memset_(a, b + j * bf, c, d)\n        }\n    }\n\n    function VerticalPred(a, b, c, d, e) {\n        var j;\n        if (c) {\n            for (j = 0; j < e; ++j) memcpy(b, a + j * bf, c, d, e)\n        } else {\n            Fill(b, a, 127, e)\n        }\n    }\n\n    function HorizontalPred(a, b, c, d, e) {\n        if (c) {\n            var j;\n            for (j = 0; j < e; ++j) {\n                memset_(b, a + j * bf, c[d + j], e)\n            }\n        } else {\n            Fill(b, a, 129, e)\n        }\n    }\n\n    function TrueMotion(a, b, c, d, e, f, g) {\n        var y;\n        if (c) {\n            if (e) {\n                var h = cj;\n                var i = +255 - c[d - 1];\n                for (y = 0; y < g; ++y) {\n                    var j = h;\n                    var k = i + c[d + y];\n                    var x;\n                    for (x = 0; x < g; ++x) {\n                        b[a + x] = j[k + e[f + x]]\n                    }\n                    a += bf\n                }\n            } else {\n                HorizontalPred(a, b, c, d, g)\n            }\n        } else {\n            if (e) {\n                VerticalPred(a, b, e, f, g)\n            } else {\n                Fill(b, a, 129, g)\n            }\n        }\n    }\n\n    function DCMode(a, b, c, d, e, f, g, h, i) {\n        var k = 0;\n        var j;\n        if (e) {\n            for (j = 0; j < g; ++j) k += e[f + j];\n            if (c) {\n                for (j = 0; j < g; ++j) k += c[d + j]\n            } else {\n                k += k\n            }\n            k = (k + h) >> i\n        } else if (c) {\n            for (j = 0; j < g; ++j) k += c[d + j];\n            k += k;\n            k = (k + h) >> i\n        } else {\n            k = 0x80\n        }\n        Fill(b, a, k, g)\n    }\n\n    function IntraChromaPreds(a, b, c, d, e, f) {\n        DCMode(bs + b, a, c, d, e, f, 8, 8, 4);\n        VerticalPred(bu + b, a, e, f, 8);\n        HorizontalPred(bv + b, a, c, d, 8);\n        TrueMotion(bt + b, a, c, d, e, f, 8);\n        b += 8;\n        if (e) f += 8;\n        if (c) d += 16;\n        DCMode(bs + b, a, c, d, e, f, 8, 8, 4);\n        VerticalPred(bu + b, a, e, f, 8);\n        HorizontalPred(bv + b, a, c, d, 8);\n        TrueMotion(bt + b, a, c, d, e, f, 8)\n    }\n\n    function Intra16Preds(a, b, c, d, e, f) {\n        DCMode(bo + b, a, c, d, e, f, 16, 16, 5);\n        VerticalPred(bq + b, a, e, f, 16);\n        HorizontalPred(br + b, a, c, d, 16);\n        TrueMotion(bp + b, a, c, d, e, f, 16)\n    }\n\n    function AVG3(a, b, c) {\n        return (((a) + 2 * (b) + (c) + 2) >> 2)\n    };\n\n    function AVG2(a, b) {\n        return (((a) + (b) + 1) >> 1)\n    };\n\n    function VE4(a, b, c, d) {\n        var e = new Array();\n        e.push(AVG3(c[d - 1], c[d + 0], c[d + 1]));\n        e.push(AVG3(c[d + 0], c[d + 1], c[d + 2]));\n        e.push(AVG3(c[d + 1], c[d + 2], c[d + 3]));\n        e.push(AVG3(c[d + 2], c[d + 3], c[d + 4]));\n        var i;\n        for (i = 0; i < 4; ++i) {\n            memcpy(b, a + i * bf, e, 0, 4)\n        }\n    }\n\n    function HE4(a, b, c, d) {\n        var X = c[d - 1];\n        var I = c[d - 2];\n        var J = c[d - 3];\n        var K = c[d - 4];\n        var L = c[d - 5];\n        b[a + 0 + 0 * bf] = b[a + 1 + 0 * bf] = b[a + 2 + 0 * bf] = b[a + 3 + 0 * bf] = AVG3(X, I, J);\n        b[a + 0 + 1 * bf] = b[a + 1 + 1 * bf] = b[a + 2 + 1 * bf] = b[a + 3 + 1 * bf] = AVG3(I, J, K);\n        b[a + 0 + 2 * bf] = b[a + 1 + 2 * bf] = b[a + 2 + 2 * bf] = b[a + 3 + 2 * bf] = AVG3(J, K, L);\n        b[a + 0 + 3 * bf] = b[a + 1 + 3 * bf] = b[a + 2 + 3 * bf] = b[a + 3 + 3 * bf] = AVG3(K, L, L)\n    }\n\n    function DC4(a, b, c, d) {\n        var e = 4;\n        var i;\n        for (i = 0; i < 4; ++i) e += c[d + i] + c[d - 5 + i];\n        Fill(b, a, e >> 3, 4)\n    }\n\n    function RD4(a, b, c, d) {\n        var X = c[d - 1];\n        var I = c[d - 2];\n        var J = c[d - 3];\n        var K = c[d - 4];\n        var L = c[d - 5];\n        var A = c[d + 0];\n        var B = c[d + 1];\n        var C = c[d + 2];\n        var D = c[d + 3];\n        b[a + (0) + (3) * bf] = AVG3(J, K, L);\n        b[a + (0) + (2) * bf] = b[a + (1) + (3) * bf] = AVG3(I, J, K);\n        b[a + (0) + (1) * bf] = b[a + (1) + (2) * bf] = b[a + (2) + (3) * bf] = AVG3(X, I, J);\n        b[a + (0) + (0) * bf] = b[a + (1) + (1) * bf] = b[a + (2) + (2) * bf] = b[a + (3) + (3) * bf] = AVG3(A, X, I);\n        b[a + (1) + (0) * bf] = b[a + (2) + (1) * bf] = b[a + (3) + (2) * bf] = AVG3(B, A, X);\n        b[a + (2) + (0) * bf] = b[a + (3) + (1) * bf] = AVG3(C, B, A);\n        b[a + (3) + (0) * bf] = AVG3(D, C, B)\n    }\n\n    function LD4(a, b, c, d) {\n        var A = c[d + 0];\n        var B = c[d + 1];\n        var C = c[d + 2];\n        var D = c[d + 3];\n        var E = c[d + 4];\n        var F = c[d + 5];\n        var G = c[d + 6];\n        var H = c[d + 7];\n        b[a + (0) + (0) * bf] = AVG3(A, B, C);\n        b[a + (1) + (0) * bf] = b[a + (0) + (1) * bf] = AVG3(B, C, D);\n        b[a + (2) + (0) * bf] = b[a + (1) + (1) * bf] = b[a + (0) + (2) * bf] = AVG3(C, D, E);\n        b[a + (3) + (0) * bf] = b[a + (2) + (1) * bf] = b[a + (1) + (2) * bf] = b[a + (0) + (3) * bf] = AVG3(D, E, F);\n        b[a + (3) + (1) * bf] = b[a + (2) + (2) * bf] = b[a + (1) + (3) * bf] = AVG3(E, F, G);\n        b[a + (3) + (2) * bf] = b[a + (2) + (3) * bf] = AVG3(F, G, H);\n        b[a + (3) + (3) * bf] = AVG3(G, H, H)\n    }\n\n    function VR4(a, b, c, d) {\n        var X = c[d - 1];\n        var I = c[d - 2];\n        var J = c[d - 3];\n        var K = c[d - 4];\n        var A = c[d + 0];\n        var B = c[d + 1];\n        var C = c[d + 2];\n        var D = c[d + 3];\n        b[a + (0) + (0) * bf] = b[a + (1) + (2) * bf] = AVG2(X, A);\n        b[a + (1) + (0) * bf] = b[a + (2) + (2) * bf] = AVG2(A, B);\n        b[a + (2) + (0) * bf] = b[a + (3) + (2) * bf] = AVG2(B, C);\n        b[a + (3) + (0) * bf] = AVG2(C, D);\n        b[a + (0) + (3) * bf] = AVG3(K, J, I);\n        b[a + (0) + (2) * bf] = AVG3(J, I, X);\n        b[a + (0) + (1) * bf] = b[a + (1) + (3) * bf] = AVG3(I, X, A);\n        b[a + (1) + (1) * bf] = b[a + (2) + (3) * bf] = AVG3(X, A, B);\n        b[a + (2) + (1) * bf] = b[a + (3) + (3) * bf] = AVG3(A, B, C);\n        b[a + (3) + (1) * bf] = AVG3(B, C, D)\n    }\n\n    function VL4(a, b, c, d) {\n        var A = c[d + 0];\n        var B = c[d + 1];\n        var C = c[d + 2];\n        var D = c[d + 3];\n        var E = c[d + 4];\n        var F = c[d + 5];\n        var G = c[d + 6];\n        var H = c[d + 7];\n        b[a + (0) + (0) * bf] = AVG2(A, B);\n        b[a + (1) + (0) * bf] = b[a + (0) + (2) * bf] = AVG2(B, C);\n        b[a + (2) + (0) * bf] = b[a + (1) + (2) * bf] = AVG2(C, D);\n        b[a + (3) + (0) * bf] = b[a + (2) + (2) * bf] = AVG2(D, E);\n        b[a + (0) + (1) * bf] = AVG3(A, B, C);\n        b[a + (1) + (1) * bf] = b[a + (0) + (3) * bf] = AVG3(B, C, D);\n        b[a + (2) + (1) * bf] = b[a + (1) + (3) * bf] = AVG3(C, D, E);\n        b[a + (3) + (1) * bf] = b[a + (2) + (3) * bf] = AVG3(D, E, F);\n        b[a + (3) + (2) * bf] = AVG3(E, F, G);\n        b[a + (3) + (3) * bf] = AVG3(F, G, H)\n    }\n\n    function HU4(a, b, c, d) {\n        var I = c[d - 2];\n        var J = c[d - 3];\n        var K = c[d - 4];\n        var L = c[d - 5];\n        b[a + (0) + (0) * bf] = AVG2(I, J);\n        b[a + (2) + (0) * bf] = b[a + (0) + (1) * bf] = AVG2(J, K);\n        b[a + (2) + (1) * bf] = b[a + (0) + (2) * bf] = AVG2(K, L);\n        b[a + (1) + (0) * bf] = AVG3(I, J, K);\n        b[a + (3) + (0) * bf] = b[a + (1) + (1) * bf] = AVG3(J, K, L);\n        b[a + (3) + (1) * bf] = b[a + (1) + (2) * bf] = AVG3(K, L, L);\n        b[a + (3) + (2) * bf] = b[a + (2) + (2) * bf] = b[a + (0) + (3) * bf] = b[a + (1) + (3) * bf] = b[a + (2) + (3) * bf] = b[a + (3) + (3) * bf] = L\n    }\n\n    function HD4(a, b, c, d) {\n        var X = c[d - 1];\n        var I = c[d - 2];\n        var J = c[d - 3];\n        var K = c[d - 4];\n        var L = c[d - 5];\n        var A = c[d + 0];\n        var B = c[d + 1];\n        var C = c[d + 2];\n        b[a + (0) + (0) * bf] = b[a + (2) + (1) * bf] = AVG2(I, X);\n        b[a + (0) + (1) * bf] = b[a + (2) + (2) * bf] = AVG2(J, I);\n        b[a + (0) + (2) * bf] = b[a + (2) + (3) * bf] = AVG2(K, J);\n        b[a + (0) + (3) * bf] = AVG2(L, K);\n        b[a + (3) + (0) * bf] = AVG3(A, B, C);\n        b[a + (2) + (0) * bf] = AVG3(X, A, B);\n        b[a + (1) + (0) * bf] = b[a + (3) + (1) * bf] = AVG3(I, X, A);\n        b[a + (1) + (1) * bf] = b[a + (3) + (2) * bf] = AVG3(J, I, X);\n        b[a + (1) + (2) * bf] = b[a + (3) + (3) * bf] = AVG3(K, J, I);\n        b[a + (1) + (3) * bf] = AVG3(L, K, J)\n    }\n\n    function TM4(a, b, c, d) {\n        var x, y;\n        var e = cj;\n        var f = +255 - c[d - 1];\n        for (y = 0; y < 4; ++y) {\n            var g = e;\n            var h = f + c[d - 2 - y];\n            for (x = 0; x < 4; ++x) {\n                b[a + x] = g[h + c[d + x]]\n            }\n            a += bf\n        }\n    }\n\n    function Intra4Preds(a, b, c, d) {\n        DC4(bw + b, a, c, d);\n        TM4(bx + b, a, c, d);\n        VE4(by + b, a, c, d);\n        HE4(bz + b, a, c, d);\n        RD4(bA + b, a, c, d);\n        VR4(bB + b, a, c, d);\n        LD4(bC + b, a, c, d);\n        VL4(bD + b, a, c, d);\n        HD4(bE + b, a, c, d);\n        HU4(bF + b, a, c, d)\n    }\n\n    function GetSSE(a, c, b, d, w, h) {\n        var e = 0;\n        var y, x;\n        for (y = 0; y < h; ++y) {\n            for (x = 0; x < w; ++x) {\n                var f = a[c + x] - b[d + x];\n                e += f * f\n            }\n            c += bf;\n            d += bf\n        }\n        return e\n    }\n\n    function SSE16x16(a, c, b, d) {\n        return GetSSE(a, c, b, d, 16, 16)\n    }\n\n    function SSE16x8(a, c, b, d) {\n        return GetSSE(a, c, b, d, 16, 8)\n    }\n\n    function SSE8x8(a, c, b, d) {\n        return GetSSE(a, c, b, d, 8, 8)\n    }\n\n    function SSE4x4(a, c, b, d) {\n        return GetSSE(a, c, b, d, 4, 4)\n    }\n    var dD = Arr(16, int);\n\n    function TTransform(a, b, w) {\n        var c = 0;\n        var i;\n        var d = 0;\n        for (i = 0; i < 4; ++i) {\n            var e = (a[b + 0] + a[b + 2]) << 2;\n            var f = (a[b + 1] + a[b + 3]) << 2;\n            var g = (a[b + 1] - a[b + 3]) << 2;\n            var h = (a[b + 0] - a[b + 2]) << 2;\n            dD[0 + i * 4] = e + f + (e != 0) + 0;\n            dD[1 + i * 4] = h + g;\n            dD[2 + i * 4] = h - g;\n            dD[3 + i * 4] = e - f;\n            b += bf\n        }\n        for (i = 0; i < 4; ++i) {\n            var e = (dD[0 + i] + dD[8 + i]);\n            var f = (dD[4 + i] + dD[12 + i]);\n            var g = (dD[4 + i] - dD[12 + i]);\n            var h = (dD[0 + i] - dD[8 + i]);\n            var j = e + f;\n            var k = h + g;\n            var l = h - g;\n            var m = e - f;\n            c += w[d + 0] * ((Math.abs(j) + 3) >> 3);\n            c += w[d + 4] * ((Math.abs(k) + 3) >> 3);\n            c += w[d + 8] * ((Math.abs(l) + 3) >> 3);\n            c += w[d + 12] * ((Math.abs(m) + 3) >> 3);\n            ++d\n        }\n        return c\n    }\n\n    function Disto4x4(a, c, b, d, w) {\n        var e = TTransform(a, c, w);\n        var f = TTransform(b, d, w);\n        return (Math.abs(f - e) + 8) >> 4\n    }\n\n    function Disto16x16(a, c, b, d, w) {\n        var D = 0;\n        var x, y = int;\n        for (y = 0; y < 16 * bf; y += 4 * bf) {\n            for (x = 0; x < 16; x += 4) {\n                D += Disto4x4(a, c + x + y, b, d + x + y, w)\n            }\n        }\n        return D\n    }\n\n    function QuantizeBlock(a, b, n, c) {\n        var d = -1;\n        for (; n < 16; ++n) {\n            var j = cV[n];\n            var e = (a[j] < 0);\n            var f = (e ? -a[j] : a[j]) + c.sharpen_[j];\n            if (f > 2047) f = 2047;\n            if (f > c.zthresh_[j]) {\n                var Q = c.q_[j];\n                var g = c.iq_[j];\n                var B = c.bias_[j];\n                b[n] = QUANTDIV(f, g, B);\n                if (e) b[n] = -b[n];\n                a[j] = b[n] * Q;\n                if (b[n]) d = n\n            } else {\n                b[n] = 0;\n                a[j] = 0\n            }\n        }\n        return (d >= 0) + 0\n    }\n\n    function Copy(a, b, c, d, e) {\n        var y;\n        for (y = 0; y < e; ++y) {\n            memcpy(c, d, a, b, e);\n            b += bf;\n            d += bf\n        }\n    }\n\n    function Copy4x4(a, b, c, d) {\n        Copy(a, b, c, d, 4)\n    }\n\n    function Copy8x8(a, b, c, d) {\n        Copy(a, b, c, d, 8)\n    }\n\n    function Copy16x16(a, b, c, d) {\n        Copy(a, b, c, d, 16)\n    }\n    var dE;\n    var dF;\n    var dG;\n    var dH;\n    var dI;\n    var dJ;\n    var dK;\n    var dL;\n    var dM;\n    var dN;\n    var dO;\n    var dP;\n    var dQ;\n    var dR;\n    var dS;\n    var dT;\n    var dU;\n    var dV;\n\n    function VP8EncDspInit(a) {\n        InitTables();\n        dE = CollectHistogram;\n        dF = ITransform;\n        dG = FTransform;\n        dH = ITransformWHT;\n        dI = FTransformWHT;\n        dJ = Intra4Preds;\n        dK = Intra16Preds;\n        dL = IntraChromaPreds;\n        dM = SSE16x16;\n        dN = SSE8x8;\n        dO = SSE16x8;\n        dP = SSE4x4;\n        dQ = Disto4x4;\n        dR = Disto16x16;\n        dS = QuantizeBlock;\n        dT = Copy4x4;\n        dU = Copy8x8;\n        dV = Copy16x16\n    }\n\n    function WebPConfigInitInternal(a, b, c, d) {\n        if (d != N) {\n            return 0\n        }\n        if (a == null) return 0;\n        a.quality = c;\n        a.target_size = 0;\n        a.target_PSNR = 0.;\n        a.method = 3;\n        a.sns_strength = 50;\n        a.filter_strength = 20;\n        a.filter_sharpness = 0;\n        a.filter_type = 0;\n        a.partitions = 0;\n        a.segments = 4;\n        a.pass = 1;\n        a.show_compressed = 0;\n        a.preprocessing = 0;\n        a.autofilter = 0;\n        a.alpha_compression = 0;\n        a.partition_limit = 0;\n        if (ea) {\n            a.quality = ea.quality ? ea.quality : c;\n            a.target_size = ea.target_size ? ea.target_size : 0;\n            a.target_PSNR = ea.target_PSNR ? ea.target_PSNR : 0.;\n            a.method = ea.method ? ea.method : 0;\n            a.sns_strength = ea.sns_strength ? ea.sns_strength : 50;\n            a.filter_strength = ea.filter_strength ? ea.filter_strength : 20;\n            a.filter_sharpness = ea.filter_sharpness ? ea.filter_sharpness : 0;\n            a.filter_type = ea.filter_type ? ea.filter_type : 0;\n            a.partitions = ea.partitions ? ea.partitions : 0;\n            a.segments = ea.segments ? ea.segments : 4;\n            a.pass = ea.pass ? ea.pass : 1;\n            a.show_compressed = ea.show_compressed ? ea.show_compressed : 0;\n            a.preprocessing = ea.preprocessing ? ea.preprocessing : 0;\n            a.autofilter = ea.autofilter ? ea.autofilter : 0;\n            a.alpha_compression = ea.alpha_compression ? ea.alpha_compression : 0;\n            a.partition_limit = ea.partition_limit ? ea.partition_limit : 0;\n            b = ea.Preset ? ea.preset : P.WEBP_PRESET_DEFAULT\n        }\n        switch (b) {\n            case P.WEBP_PRESET_PICTURE:\n                a.sns_strength = 80;\n                a.filter_sharpness = 4;\n                a.filter_strength = 35;\n                break;\n            case P.WEBP_PRESET_PHOTO:\n                a.sns_strength = 80;\n                a.filter_sharpness = 3;\n                a.filter_strength = 30;\n                break;\n            case P.WEBP_PRESET_DRAWING:\n                a.sns_strength = 25;\n                a.filter_sharpness = 6;\n                a.filter_strength = 10;\n                break;\n            case P.WEBP_PRESET_ICON:\n                a.sns_strength = 0;\n                a.filter_strength = 0;\n                break;\n            case P.WEBP_PRESET_TEXT:\n                a.sns_strength = 0;\n                a.filter_strength = 0;\n                a.segments = 2;\n                break;\n            case P.WEBP_PRESET_DEFAULT:\n            default:\n                break\n        }\n        return WebPValidateConfig(a)\n    }\n\n    function WebPValidateConfig(a) {\n        if (a == null) return 0;\n        if (a.quality < 0 || a.quality > 100) return 0;\n        if (a.target_size < 0) return 0;\n        if (a.target_PSNR < 0) return 0;\n        if (a.method < 0 || a.method > 6) return 0;\n        if (a.segments < 1 || a.segments > 4) return 0;\n        if (a.sns_strength < 0 || a.sns_strength > 100) return 0;\n        if (a.filter_strength < 0 || a.filter_strength > 100) return 0;\n        if (a.filter_sharpness < 0 || a.filter_sharpness > 7) return 0;\n        if (a.filter_type < 0 || a.filter_type > 1) return 0;\n        if (a.autofilter < 0 || a.autofilter > 1) return 0;\n        if (a.pass < 1 || a.pass > 10) return 0;\n        if (a.show_compressed < 0 || a.show_compressed > 1) return 0;\n        if (a.preprocessing < 0 || a.preprocessing > 1) return 0;\n        if (a.partitions < 0 || a.partitions > 3) return 0;\n        if (a.partition_limit < 0 || a.partition_limit > 100) return 0;\n        if (a.alpha_compression < 0) return 0;\n        return 1\n    }\n    var dW = 16384;\n    this.WebPGetEncoderVersion = function(a) {\n        return (Z << 16) | (ba << 8) | bb\n    };\n\n    function DummyWriter(a, b, c) {\n        return 1\n    }\n\n    function WebPPictureInitInternal(d, e) {\n        if (e != N) {\n            return 0\n        }\n        if (d) {\n            d = newObjectIt(V);\n            d.writer = function DummyWriter(a, b, c) {};\n            WebPEncodingSetError(d, U)\n        }\n        return 1\n    }\n\n    function ResetSegmentHeader(a) {\n        var b = a.segment_hdr_;\n        b.num_segments_ = a.config_.segments;\n        b.update_map_ = (b.num_segments_ > 1) + 0;\n        b.size_ = 0\n    }\n\n    function ResetFilterHeader(a) {\n        var b = a.filter_hdr_;\n        b.simple_ = 1;\n        b.level_ = 0;\n        b.sharpness_ = 0;\n        b.i4x4_lf_delta_ = 0\n    }\n\n    function ResetBoundaryPredictions(a) {\n        var i;\n        var b = a.preds_;\n        var c = a.preds_off - a.preds_w_;\n        var d = a.preds_;\n        var e = a.preds_off - 1;\n        for (i = -1; i < 4 * a.mb_w_; ++i) {\n            b[c + i] = bd\n        }\n        for (i = 0; i < 4 * a.mb_h_; ++i) {\n            d[e + i * a.preds_w_] = bd\n        }\n        a.nz_[1 - 1] = 0\n    }\n\n    function MapConfigToTools(a) {\n        var b = a.config_.method;\n        var c = 100 - a.config_.partition_limit;\n        a.method_ = b;\n        a.rd_opt_level_ = (b >= 6) ? 3 : (b >= 5) ? 2 : (b >= 3) ? 1 : 0;\n        a.max_i4_header_bits_ = parseInt(256 * 16 * 16 * (c * c) / (100 * 100))\n    }\n\n    function InitEncoder(a, b) {\n        var c = (a.filter_strength > 0) || (a.autofilter > 0);\n        var d = (b.width + 15) >> 4;\n        var e = (b.height + 15) >> 4;\n        var f = 4 * d + 1;\n        var g = 4 * e + 1;\n        var h = f * g * sizeof(uint8_t);\n        var i = d * 16;\n        var j = (d + 1) * sizeof(uint32_t);\n        var k = (3 * bi + bj) * sizeof(uint8_t);\n        var l = d * e * sizeof(bQ);\n        var m = (2 * i + 16 + 16 + 16 + 8 + 1 + 2 * bn) * sizeof(uint8_t);\n        var n = a.autofilter ? sizeof(bM) + bn : 0;\n        var o = newObjectIt(bT);\n        var p = uint8_t;\n        var q = sizeof(bT) + bn + k + l + h + m + j + n;\n        p = malloc(q, uint8_t);\n        if (p == null) {\n            WebPEncodingSetError(b, VP8_ENC_ERROR_OUT_OF_MEMORY);\n            return null\n        }\n        o.num_parts_ = 1 << a.partitions;\n        o.mb_w_ = d;\n        o.mb_h_ = e;\n        o.preds_w_ = f;\n        o.yuv_in_ = membuild(uint8_t, bi);\n        o.yuv_out_ = membuild(uint8_t, bi);\n        o.yuv_out2_ = membuild(uint8_t, bi);\n        o.yuv_p_ = membuild(uint8_t, bj);\n        o.mb_info_ = Arr_nOI(l, bQ);\n        o.preds_ = Arr((f * g * sizeof(uint8_t) + 1 + o.preds_w_), uint8_t);\n        o.preds_off = +1 + o.preds_w_;\n        o.nz_ = Arr(1 + j, uint8_t);\n        o.nz_off = 1;\n        o.lf_stats_ = n ? newObjectIt(bM) : null;\n        o.y_top_ = Arr((2 * i + (16) + (16 + 16) + (16) + (8)), uint8_t);\n        o.y_top_off = 0;\n        o.uv_top_ = o.y_top_;\n        o.uv_top_off = o.y_top_off + i;\n        o.y_left_ = o.uv_top_;\n        o.y_left_off = (2 * i) + (16);\n        o.u_left_ = o.y_left_;\n        o.u_left_off = o.y_left_off + (16 + 16);\n        o.v_left_ = o.u_left_;\n        o.v_left_off = o.u_left_off + (16);\n        o.config_ = a;\n        o.profile_ = c ? ((a.filter_type == 1) ? 0 : 1) : 2;\n        o.pic_ = b;\n        MapConfigToTools(o);\n        VP8EncDspInit();\n        VP8DefaultProbas(o);\n        ResetSegmentHeader(o);\n        ResetFilterHeader(o);\n        ResetBoundaryPredictions(o);\n        VP8EncInitAlpha(o);\n        VP8EncInitLayer(o);\n        return o\n    }\n\n    function DeleteEncoder(a) {\n        if (a) {\n            VP8EncDeleteAlpha(a);\n            VP8EncDeleteLayer(a);\n            a = ''\n        }\n    }\n\n    function GetPSNR(a, b) {\n        return a ? 10. * (Math.LOG10E * Math.log(255. * 255. * b / a)) : 99.\n    }\n\n    function FinalizePSNR(a) {\n        var b = a.pic_.stats;\n        var c = a.sse_count_;\n        var d = a.sse_;\n        b.PSNR[0] = parseFloat(GetPSNR(d[0], c));\n        b.PSNR[1] = parseFloat(GetPSNR(d[1], c / 4));\n        b.PSNR[2] = parseFloat(GetPSNR(d[2], c / 4));\n        b.PSNR[3] = parseFloat(GetPSNR(d[0] + d[1] + d[2], c * 3 / 2))\n    }\n\n    function StoreStats(a) {\n        var b = a.pic_.stats;\n        var c = a.pic_.stats_nozero;\n        if (c) {\n            var i, s;\n            for (i = 0; i < be; ++i) {\n                b.segment_level[i] = a.dqm_[i].fstrength_;\n                b.segment_quant[i] = a.dqm_[i].quant_;\n                for (s = 0; s <= 2; ++s) {\n                    b.residual_bytes[s][i] = a.residual_bytes_[s][i]\n                }\n            }\n            FinalizePSNR(a);\n            b.coded_size = a.coded_size_;\n            for (i = 0; i < 3; ++i) {\n                b.block_count[i] = a.block_count_[i]\n            }\n        }\n    }\n\n    function WebPEncodingSetError(a, b) {\n        assert(b <= VP8_ENC_ERROR_BAD_WRITE);\n        assert(b >= U);\n        a.error_code = b;\n        return 0\n    }\n\n    function WebPEncode(a, b) {\n        var c = newObjectIt(bT);\n        var d = int;\n        if (b == null) return 0;\n        WebPEncodingSetError(b, U);\n        if (a == null) return WebPEncodingSetError(b, VP8_ENC_ERROR_NULL_PARAMETER);\n        if (!WebPValidateConfig(a)) return WebPEncodingSetError(b, VP8_ENC_ERROR_INVALID_CONFIGURATION);\n        if (b.width <= 0 || b.height <= 0) return WebPEncodingSetError(b, VP8_ENC_ERROR_BAD_DIMENSION);\n        if (b.y == null || b.u == null || b.v == null) return WebPEncodingSetError(b, VP8_ENC_ERROR_NULL_PARAMETER);\n        if (b.width >= dW || b.height >= dW) return WebPEncodingSetError(b, VP8_ENC_ERROR_BAD_DIMENSION);\n        c = InitEncoder(a, b);\n        if (c == null) return 0;\n        d = VP8EncAnalyze(c) && VP8StatLoop(c) && VP8EncLoop(c) && VP8EncFinishAlpha(c) && VP8EncFinishLayer(c) && VP8EncWrite(c);\n        StoreStats(c);\n        DeleteEncoder(c);\n        return d\n    }\n\n    function WebPPictureAlloc(a) {\n        if (a.extra_info_type) AllocExtraInfo(a);\n        if (a) {\n            var b = a.colorspace & WEBP_CSP_UV_MASK;\n            var c = a.colorspace & WEBP_CSP_ALPHA_BIT;\n            var d = a.width;\n            var e = a.height;\n            var f = d;\n            var g = parseInt((d + 1) / 2);\n            var h = parseInt((e + 1) / 2);\n            var i = g;\n            var j = 0;\n            var k = int,\n                a_stride = int;\n            var l = uint64_t,\n                uv_size = uint64_t,\n                uv0_size = uint64_t,\n                a_size = uint64_t,\n                total_size = uint64_t;\n            var m = uint8_t;\n            var n = 0;\n            switch (b) {\n                case T:\n                    break;\n                case WEBP_YUV400:\n                    break;\n                case WEBP_YUV422:\n                    j = g;\n                    break;\n                case WEBP_YUV444:\n                    j = d;\n                    break;\n                default:\n                    return 0\n            }\n            uv0_size = e * j;\n            k = c ? d : 0;\n            a_stride = k;\n            l = f * e;\n            uv_size = i * h;\n            a_size = a_stride * e;\n            total_size = l + a_size + 2 * uv_size + 2 * uv0_size;\n            if (d <= 0 || e <= 0 || g < 0 || h < 0 || l >= (64 * 64 * 64 * 16 << 40) || total_size != total_size) {\n                return 0\n            }\n            a.y_stride = f;\n            a.uv_stride = i;\n            a.a_stride = a_stride;\n            a.uv0_stride = j;\n            WebPPictureFree(a);\n            a.y = malloc(total_size, uint8_t);\n            a.y_off = 0;\n            if (a.y == null) return 0;\n            a.u = a.y;\n            a.u_off = a.y_off + l;\n            a.v = a.u;\n            a.v_off = a.u_off + uv_size;\n            m = malloc(total_size, uint8_t);\n            if (m == null) return 0;\n            a.y = m;\n            a.y_off = n;\n            n += l;\n            a.u = m;\n            a.u_off = n;\n            n += uv_size;\n            a.v = m;\n            a.v_off = n;\n            n += uv_size;\n            if (a_size) {\n                a.a = malloc(a_size, uint8_t);\n                a.a_off = 0\n            }\n            if (uv0_size) {\n                a.u0 = m;\n                a.u0_off = n;\n                n += uv0_size;\n                a.v0 = m;\n                a.v0_off = n;\n                n += uv0_size\n            }\n        }\n        return 1\n    }\n\n    function WebPPictureGrabSpecs(a, b) {\n        if (a) b = a;\n        b.y = b.u = b.v = null;\n        b.y_off = b.u_off = b.v_off = null;\n        b.u0 = b.v0 = null;\n        b.u0_off = b.v0_off = null;\n        b.a = null;\n        b.a_off = null\n    }\n\n    function WebPPictureFree(a) {\n        if (a) {\n            a.y = '';\n            a.y = a.u = a.v = null;\n            a.y_off = a.u_off = a.v_off = 0;\n            WebPPictureGrabSpecs(null, a)\n        }\n    }\n    var dX = {\n        mem: uint8_t,\n        mem_off: 0,\n        max_size: size_t,\n        size: size_t,\n        size_off: 0\n    };\n\n    function InitMemoryWriter(a) {\n        a.mem = null;\n        a.mem_off = 0;\n        a.size = 0;\n        a.max_size = 0\n    }\n\n    function WebPMemoryWrite(a, b, c) {\n        var w = c.custom_ptr;\n        var d = size_t;\n        if (w == null) {\n            alert('w is null');\n            return 1\n        }\n        d = (w.size) + b;\n        if (d > w.max_size) {\n            var e = uint8_t;\n            var f = 0;\n            var g = w.max_size * 2;\n            if (g < d) g = d;\n            if (g < 8192) g = 8192;\n            e = malloc(g, uint8_t);\n            if (e == null) {\n                return 0\n            }\n            if ((w.size) > 0) {\n                memcpy(e, f, w.mem, 0, w.size)\n            }\n            w.mem = '';\n            w.mem = e;\n            w.max_size = g\n        }\n        if (b) {\n            memcpy((w.mem), +(w.size), a, 0, b);\n            w.size += b\n        }\n        return 1\n    }\n    var dY = 16;\n\n    function clip_uv(v) {\n        v = (v + (257 << (dY + 2 - 1))) >> (dY + 2);\n        return ((v & ~0xff) == 0) ? v : (v < 0) ? 0 : 255\n    }\n\n    function rgb_to_y(r, g, b) {\n        var a = (1 << (dY - 1)) + (16 << dY);\n        var c = 16839 * r + 33059 * g + 6420 * b;\n        return (c + a) >> dY\n    }\n\n    function rgb_to_u(r, g, b) {\n        return clip_uv(-9719 * r - 19081 * g + 28800 * b)\n    }\n\n    function rgb_to_v(r, g, b) {\n        return clip_uv(+28800 * r - 24116 * g - 4684 * b)\n    }\n\n    function MakeGray(a) {\n        var y;\n        var b = (a.width + 1) >> 1;\n        for (y = 0; y < ((a.height + 1) >> 1); ++y) {\n            memset_(a.u, a.u_off + y * a.uv_stride, 128, b);\n            memset_(a.v, a.v_off + y * a.uv_stride, 128, b)\n        }\n    }\n\n    function Import(h, i, j, k, l, m) {\n        var n = h.colorspace & WEBP_CSP_UV_MASK;\n        var x, y = int;\n        var o = i;\n        var p = +(l ? 2 : 0);\n        var q = i;\n        var s = +1;\n        var t = i;\n        var u = +(l ? 0 : 2);\n        var v = h.width;\n        var w = h.height;\n\n        function SUM4(a, b) {\n            return (a[b + 0] + a[b + k] + a[b + j] + a[b + j + k])\n        }\n\n        function SUM2H(a, b) {\n            return (2 * a[b + 0] + 2 * a[b + k])\n        }\n\n        function SUM2V(a, b) {\n            return (2 * a[b + 0] + 2 * a[b + j])\n        }\n\n        function SUM1(a, b) {\n            return (4 * a[b + 0])\n        }\n\n        function RGB_TO_UV(x, y, a) {\n            var c = (2 * (k * (x) + (y) * j));\n            var d = (x) + (y) * h.uv_stride;\n            var r = a(o, p + c);\n            var g = a(q, s + c);\n            var b = a(t, u + c);\n            h.u[h.u_off + d] = rgb_to_u(r, g, b);\n            h.v[h.v_off + d] = rgb_to_v(r, g, b)\n        }\n\n        function RGB_TO_UV0(a, c, y, d) {\n            var e = (k * (a) + (y) * j);\n            var f = (c) + (y) * h.uv0_stride;\n            var r = d(o, p + e);\n            var g = d(q, s + e);\n            var b = d(t, u + e);\n            h.u0[h.u0_off + f] = rgb_to_u(r, g, b);\n            h.v0[h.v0_off + f] = rgb_to_v(r, g, b)\n        }\n        for (y = 0; y < w; ++y) {\n            for (x = 0; x < v; ++x) {\n                var z = k * x + y * j;\n                h.y[h.y_off + x + y * h.y_stride] = rgb_to_y(o[p + z], q[s + z], t[u + z])\n            }\n        }\n        if (n != WEBP_YUV400) {\n            for (y = 0; y < (w >> 1); ++y) {\n                for (x = 0; x < (v >> 1); ++x) {\n                    RGB_TO_UV(x, y, SUM4)\n                }\n                if (h.width & 1) {\n                    RGB_TO_UV(x, y, SUM2V)\n                }\n            }\n            if (w & 1) {\n                for (x = 0; x < (v >> 1); ++x) {\n                    RGB_TO_UV(x, y, SUM2H)\n                }\n                if (v & 1) {\n                    RGB_TO_UV(x, y, SUM1)\n                }\n            }\n            if (n == WEBP_YUV422) {\n                for (y = 0; y < w; ++y) {\n                    for (x = 0; x < (v >> 1); ++x) {\n                        RGB_TO_UV0(2 * x, x, y, SUM2H)\n                    }\n                    if (v & 1) {\n                        RGB_TO_UV0(2 * x, x, y, SUM1)\n                    }\n                }\n            } else if (n == WEBP_YUV444) {\n                for (y = 0; y < w; ++y) {\n                    for (x = 0; x < v; ++x) {\n                        RGB_TO_UV0(x, x, y, SUM1)\n                    }\n                }\n            }\n        } else {\n            MakeGray(h)\n        }\n        if (m) {\n            var A = i;\n            var B = +3;\n            assert(k >= 4);\n            for (y = 0; y < w; ++y) {\n                for (x = 0; x < v; ++x) {\n                    h.a[h.a_off + x + y * h.a_stride] = A[B + k * x + y * j]\n                }\n            }\n        }\n        return 1\n    }\n\n    function WebPPictureImportRGB(a, b, c) {\n        a.colorspace &= ~WEBP_CSP_ALPHA_BIT;\n        if (!WebPPictureAlloc(a)) return 0;\n        return Import(a, b, c, 3, 0, 0)\n    }\n\n    function WebPPictureImportBGR(a, b, c) {\n        a.colorspace &= ~WEBP_CSP_ALPHA_BIT;\n        if (!WebPPictureAlloc(a)) return 0;\n        return Import(a, b, c, 3, 1, 0)\n    }\n\n    function WebPPictureImportRGBA(a, b, c) {\n        a.colorspace |= WEBP_CSP_ALPHA_BIT;\n        if (!WebPPictureAlloc(a)) return 0;\n        return Import(a, b, c, 4, 0, 1)\n    }\n\n    function WebPPictureImportBGRA(a, b, c) {\n        a.colorspace |= WEBP_CSP_ALPHA_BIT;\n        if (!WebPPictureAlloc(a)) return 0;\n        return Import(a, b, c, 4, 1, 1)\n    }\n    var dZ, pic_tmp;\n\n    function Encode(e, f, g, h, j, k, l) {\n        var m = 0;\n        var n = newObjectIt(V);\n        var o = newObjectIt(O);\n        var p = newObjectIt(dX);\n        var q = int;\n        n.extra_info_type = ea.extra_info_type ? ea.extra_info_type : 0;\n        if (!WebPConfigPreset(o, P.WEBP_PRESET_DEFAULT, k) || !WebPPictureInit(n)) {\n            return 0\n        }\n        n.width = f;\n        n.height = g;\n        n.writer = function(a, b, c, d) {\n            return WebPMemoryWrite(a, b, c, d)\n        };\n        n.custom_ptr = p;\n        p.mem = l.output;\n        p.size = m;\n        InitMemoryWriter(p);\n        q = j(n, e, h) && WebPEncode(o, n);\n        if (q) pic_stats = newObjectIt(n.stats);\n        else pic_stats = null;\n        if (q) pic_tmp = newObjectIt(n);\n        else pic_tmp = null;\n        WebPPictureFree(n);\n        if (!q) {\n            l = '';\n            l = null;\n            return 0\n        }\n        var r = new Array();\n        for (var i = 0; i < p.size; ++i) r.push(String.fromCharCode(p.mem[i]));\n        r = r.join(\"\");\n        l.output = r;\n        m = p.size;\n        return m\n    }\n    this.WebPEncodeRGB = function(a, w, h, b, q, c) {\n        return Encode(a, w, h, b, WebPPictureImportRGB, q, c)\n    };\n    this.WebPEncodeBGR = function(a, w, h, b, q, c) {\n        return Encode(a, w, h, b, WebPPictureImportBGR, q, c)\n    };\n    this.WebPEncodeRGBA = function(a, w, h, b, q, c) {\n        return Encode(a, w, h, b, WebPPictureImportRGBA, q, c)\n    };\n    this.WebPEncodeBGRA = function(a, w, h, b, q, c) {\n        return Encode(a, w, h, b, WebPPictureImportBGRA, q, c)\n    };\n    var ea = null;\n    this.WebPEncodeConfig = function(a) {\n        ea = a\n    };\n\n    function AllocExtraInfo(a) {\n        var b = parseInt((a.width + 15) / 16);\n        var c = parseInt((a.height + 15) / 16);\n        a.extra_info = malloc(b * c * sizeof(a.extra_info), uint8_t)\n    }\n    this.ReturnExtraInfo = function() {\n        function l(b, l) {\n            b = b + '';\n            var a = '',\n                i;\n            var c = l - (typeof b.length !== 'undefined' ? b.length : 1);\n            c = l < 0 ? 0 : c;\n            for (i = 0; i < c; ++i) a += ' ';\n            return a + b\n        };\n\n        function PrintByteCount(a, b, c) {\n            var s, str = '';\n            var d = 0;\n            for (s = 0; s < 4; ++s) {\n                str += \"| \" + l(a[s], 7) + \" \";\n                d += a[s];\n                if (c) c[s] += a[s]\n            }\n            return str + \"| \" + l(d, 7) + \"  (\" + ((100. * d / b).toFixed(1)) + \"%)\\n\"\n        };\n\n        function PrintPercents(a, b) {\n            var s, str = '';\n            for (s = 0; s < 4; ++s) {\n                str += \"|     \" + l(parseInt(100 * a[s] / b), 3) + \"%\"\n            }\n            return str + \"| \" + l(b, 7) + \"\\n\"\n        };\n\n        function PrintValues(a) {\n            var s, str = '';\n            for (s = 0; s < 4; ++s) {\n                str += \"| \" + l(a[s], 7) + \" \"\n            }\n            return str + \"|\\n\"\n        };\n        if (!pic_stats) return '';\n        var e = pic_stats;\n        var f = e.block_count[0];\n        var g = e.block_count[1];\n        var h = e.block_count[2];\n        var j = f + g;\n        str = \"\" + l(e.coded_size, 7) + \" bytes Y-U-V-All-PSNR \" + (e.PSNR[0].toFixed(2)) + \" \" + (e.PSNR[1].toFixed(2)) + \" \" + (e.PSNR[2].toFixed(2)) + \"   \" + (e.PSNR[3].toFixed(2)) + \" dB\\n\";\n        if (j > 0) {\n            var k = new Array(0, 0, 0, 0);\n            str += \"block count:  intra4: \" + f + \"\\n\" + \"              intra16: \" + g + \"  (-> \" + ((100. * g / j).toFixed(2)) + \"%)\\n\" + \"              skipped block: \" + h + \" (\" + ((100. * h / j).toFixed(2)) + \"%)\\n\" + \"bytes used:  header:         \" + l(e.header_bytes[0], 6) + \"  (\" + ((100. * e.header_bytes[0] / e.coded_size).toFixed(1)) + \"%)\\n\" + \"             mode-partition: \" + l(e.header_bytes[1], 6) + \"  (\" + ((100. * e.header_bytes[1] / e.coded_size).toFixed(1)) + \"%)\\n\" + \" Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total\\n\" + \"  intra4-coeffs:  \" + PrintByteCount(e.residual_bytes[0], e.coded_size, k) + \"\" + \" intra16-coeffs:  \" + PrintByteCount(e.residual_bytes[1], e.coded_size, k) + \"\" + \"  chroma coeffs:  \" + PrintByteCount(e.residual_bytes[2], e.coded_size, k) + \"\" + \"    macroblocks:  \" + PrintPercents(e.segment_size, j) + \"\" + \"      quantizer:  \" + PrintValues(e.segment_quant) + \"\" + \"   filter level:  \" + PrintValues(e.segment_level) + \"\" + \"------------------+---------+---------+---------+---------+-----------------\\n\" + \" segments total:  \" + PrintByteCount(k, e.coded_size, null) + \"\"\n        }\n        str += \"\";\n        if (pic_tmp.extra_info) {\n            var m = parseInt((pic_tmp.width + 15) / 16);\n            var n = parseInt((pic_tmp.height + 15) / 16);\n            var o = pic_tmp.extra_info_type;\n            var x, y;\n            for (y = 0; y < n; ++y) {\n                for (x = 0; x < m; ++x) {\n                    var c = pic_tmp.extra_info[x + y * m];\n                    if (o == 1) {\n                        var p = \"+.\";\n                        str += p[c % 2]\n                    } else if (o == 2) {\n                        var q = \".-*X\";\n                        str += q[c % 4]\n                    } else if (o == 3) {\n                        str += l(c, 2) + \" \"\n                    } else if (o == 6 || o == 7) {\n                        str += l(c, 3) + \" \"\n                    } else {\n                        str += \"0x\" + (c < 16 ? \"0\" : \"\") + c.toString(16) + \" \"\n                    }\n                }\n                str += \"\\n\"\n            }\n        }\n        return str\n    }\n}"
  },
  {
    "path": "app/vendor/libwebpjs/libwebp-0.2.0.js",
    "content": "// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n//  Software License Agreement:  http://www.webmproject.org/license/software/\n//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// 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,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n(function() {\n\n  var self;\n\n  var ca = void 0,\n    p = null,\n    s = 0,\n    x = 0,\n    la = s,\n    E = s,\n    bb = 0,\n    Mb = 0;\n\n  function M(F) {\n    return JSON.parse(JSON.stringify(F))\n  }\n\n  function N(F, G, w, D, S) {\n    for (i = 0; i < S; ++i) F[G + i] = w[D + i]\n  }\n\n  function Nb(F) {\n    var G = [],\n      w = F.length,\n      D;\n    for (D = 0; D < w; ++D) G.push(F[D]);\n    return G\n  }\n\n  function ic(F, G) {\n    var w = [];\n    w.push(M(F));\n    var D;\n    for (D = 0; D < G; ++D) w.push(M(F));\n    w.push(0);\n    return w\n  }\n\n  function rc(F, G) {\n    var w = [],\n      D;\n    for (D = 0; D < G; ++D) w.push(F);\n    w.push(0);\n    return w\n  }\n\n  function memmove (arr1, index1, arr2, index2, length) {\n    var i;\n    for (i = 0; i < length; i++) {\n      arr1[index1 + i] = arr2[index2 + i];\n    }\n  }\n\n  function jd(F, G, w, D) {\n    var S;\n    for (S = 0; S < D; ++S) F[G + S] = w\n  }\n\n  function kd(F, G, w, D) {\n    var S = \"\",\n      ga;\n    for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n    return w == S ? 0 : 1\n  }\n\n  function U(F, G) {\n    var w, D = [];\n    for (w = 0; w < F; ++w) D.push(G);\n    return D\n  }\n\n  function ld(F, G) {\n    var w, D = [];\n    for (w = 0; w < F; ++w) D.push(M(G));\n    return D\n  }\n\n  function md(F, G) {\n    var w;\n    for (w = F.length - 1; 0 <= w; --w) G = M(U(F[w], G));\n    return G\n  }\n\n  function $(F) {\n    if (!F) throw Error(\"assert :P\");\n  }\n  window.WebPDecoder = function() {\n    function F(a) {\n      return a == Ob || a == Pb || a == Bb || a == Qb\n    }\n\n    function G(a) {\n      return S(a, 1)\n    }\n\n    function w(a, b) {\n      var c = 1 + ((a.la - 1) * b >> 8),\n        d = c << 8,\n        e = s;\n      a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n      for (; 128 > a.la;) a.Z <<= 1, a.la <<= 1, 8 == ++a.gc && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n      return e\n    }\n\n    function D(a, b, c, d) {\n      d -= c;\n      2 <= d ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n      a.la = 255;\n      a.gc = 0\n    }\n\n    function S(a, b) {\n      for (var c = 0, d = s, d = b - 1; 0 <= d; d--) c |= w(a, 128) << d;\n      return c\n    }\n\n    function ga(a, b) {\n      var c =\n        S(a, b);\n      return G(a) ? -c : c\n    }\n\n    function Rb(a, b, c, d) {\n      var e = Mb;\n      $(a != p);\n      $(b != p);\n      $(4294967288 > d);\n      a.qa = b;\n      a.Ia = c;\n      a.ya = d;\n      a.T = 0;\n      a.Q = 0;\n      a.g = 0;\n      a.L = 0;\n      for (e = a.fa = 0; 4 > e && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q\n    }\n\n    function Sb(a) {\n      for (; 8 <= a.g && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8\n    }\n\n    function Da(a) {\n      8 <= a.g && Sb(a);\n      a.Q == a.ya && 32 == a.g && (a.L = 1)\n    }\n\n    function T(a, b) {\n      var c = 0;\n      $(0 <= b);\n      if (!a.L && b < gf) {\n        if (a.Q == a.ya && 32 <= a.g + b && (a.L = 1, 32 < a.g + b)) return c;\n        c = a.T >> a.g & hf[b];\n        a.g += b;\n        8 <= a.g && 8 <= a.g && Sb(a)\n      } else a.fa = 1;\n      return c\n    }\n\n    function ma(a) {\n      return a.Pa == a.gb\n    }\n\n    function nd(a, b) {\n      $(a != p);\n      if (0 == b) return 0;\n      a.gb = 2 * b - 1;\n      a.Y = ld(a.gb, jf);\n      if (a.Y == p) return 0;\n      a.Y[0].s = -1;\n      return a.Pa = 1\n    }\n\n    function ja(a) {\n      a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0)\n    }\n\n    function jc(a, b, c, d) {\n      for (var e = a.Y, g = 0, k = +a.gb; 0 < d--;) {\n        if (g >= k) return 0;\n        if (0 > e[g].s) {\n          if (ma(a)) return 0;\n          var h = a,\n            n = h.Y,\n            l = +h.Pa;\n          e[g].s = l - g;\n          h.Pa += 2;\n          n[l + 0].s = -1;\n          n[l + 1].s = -1\n        } else if (0 == e[g].s) return 0;\n        g += e[g].s + (c >> d & 1)\n      }\n      if (0 > e[g].s) e[g].s = 0;\n      else if (0 != e[g].s) return 0;\n      e[g].kc = b;\n      return 1\n    }\n\n    function od(a, b, c) {\n      var d =\n        s,\n        e = 0,\n        g = 0;\n      $(a != p);\n      $(b != p);\n      for (d = 0; d < c; ++d) 0 < b[d] && (++e, g = d);\n      if (!nd(a, e)) return 0;\n      if (1 == e) return 0 > g || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n      e = 0;\n      g = U(c, s);\n      if (g == p) return (e = e && ma(a)) || ja(a), e;\n      var k = s,\n        k = s,\n        d = U(Tb + 1, 0),\n        h = s,\n        n = U(Tb + 1, 0),\n        l = 0;\n      $(b != p);\n      $(0 < c);\n      $(g != p);\n      for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n      if (l > Tb) d = 0;\n      else {\n        for (k = 0; k < c; ++k) ++d[b[k]];\n        h = d[0] = 0;\n        n[0] = -1;\n        for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n        for (k = 0; k < c; ++k) g[k] = 0 < b[k] ? n[b[k]]++ : pd;\n        d = 1\n      }\n      if (!d) return (e = e && ma(a)) || ja(a), e;\n      for (d = 0; d < c; ++d)\n        if (0 < b[d] && !jc(a, d, g[d], b[d])) return (e =\n          e && ma(a)) || ja(a), e;\n        (e = ma(a)) || ja(a);\n      return e\n    }\n\n    function Ea(a, b, c, d, e, g, k) {\n      for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255\n    }\n\n    function qd(a, b, c) {\n      var d = a.P.l;\n      if (!(c = 0 > b || 0 > c || b + c > a.P.v))\n        if (c = 0 == b) {\n          a: {\n            var e = a.Ga,\n              g = a.G,\n              k = a.ub;\n            c = a.P.l;\n            var h = a.P.v,\n              n = a.Xb,\n              l = [p],\n              m = p,\n              f = h * c,\n              q = p,\n              r = p,\n              r = \"WEBP_FILTER_TYPE\",\n              u = s,\n              l = s,\n              v = 0,\n              C = s;\n            $(0 < c && 0 < h && d >= c);\n            $(e != p && n != p);\n            if (k <= Ub) c = 0;\n            else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || 0 != l) c = 0;\n            else {\n              if (C == kc) v = k >= f, l = e, m = g + Ub;\n              else {\n                l = U(f, 0);\n                m = 0;\n                if (l ==\n                  p) {\n                  c = 0;\n                  break a\n                }\n                var v = g + Ub,\n                  k = k - Ub,\n                  g = l,\n                  q = M(Vb),\n                  A = 0,\n                  z = sd();\n                z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A)\n              }\n              if (v) {\n                e = nf[r];\n                e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n                for (e = 0; 0 < h--;) N(n, e, f, C, c), C += c, e += d;\n                u == rd && (v = l == p || 0 >= m || 0 >= c ? 0 : 1)\n              }\n              c = v\n            }\n          }\n          c = !c\n        }\n      return c ? p : 0 == b ? a.Xb : +b * d\n    }\n\n    function of(a) {\n      var b = a.width,\n        c = a.height,\n        d = a.J;\n      if (0 >= b || 0 >= c || !(d >= Qa && d < Cc)) return ta;\n      if (!a.Fc && a.Jb == p) {\n        var e = p,\n          g = 0,\n          k = 0,\n          h = 0,\n          n = 0,\n          e = bb,\n          l = b * yd[d],\n          m = l * c;\n        d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n        e = m + 2 * h + n;\n        if (e != e) return ta;\n        e = U(e, 205);\n        if (e == p) return cb;\n        a.Jb = e;\n        a.jc = p;\n        d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k)\n      }\n      d = 1;\n      g = a.J;\n      k = a.width;\n      h = a.height;\n      g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d &=\n        a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n      return d ? L : ta\n    }\n\n    function zd(a, b, c, d) {\n      if (d == p || 0 >= a || 0 >= b) return ta;\n      if (c != p) {\n        if (c.Ua) {\n          var e = c.wc,\n            g = c.vc,\n            k = c.t & -2,\n            h = c.k & -2;\n          if (0 > k || 0 > h || 0 >= e || 0 >= g || k + e > a || h + g > b) return ta;\n          a = e;\n          b = g\n        }\n        if (c.I) {\n          if (0 >= c.Ba ||\n            0 >= c.Aa) return ta;\n          a = c.Ba;\n          b = c.Aa\n        }\n      }\n      d.width = a;\n      d.height = b;\n      return of(d)\n    }\n\n    function mb(a) {\n      return !(a & -256) ? a : 0 > a ? 0 : 255\n    }\n\n    function Ad(a, b, c, d) {\n      var e = U(16, 0),\n        g;\n      g = 0;\n      var k;\n      for (k = 0; 4 > k; ++k) {\n        var h = a[b + 0] + a[b + 8],\n          n = a[b + 0] - a[b + 8],\n          l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16),\n          m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n        e[g + 0] = h + m;\n        e[g + 1] = n + l;\n        e[g + 2] = n - l;\n        e[g + 3] = h - m;\n        g += 4;\n        b++\n      }\n      for (k = g = 0; 4 > k; ++k) a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d +\n        1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f\n    }\n\n    function pf(a, b, c, d, e) {\n      Ad(a, b, c, d);\n      e && Ad(a, b + 16, c, d + 4)\n    }\n\n    function qf(a, b, c, d) {\n      mc(a, b + 0, c, d + 0, 1);\n      mc(a, b + 32, c, d + 4 * f, 1)\n    }\n\n    function nc(a, b, c, d) {\n      a = a[b + 0] + 4;\n      var e;\n      for (e = 0; 4 > e; ++e)\n        for (b = 0; 4 > b; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3))\n    }\n\n    function rf(a, b, c, d) {\n      a[b + 0] && nc(a, b + 0, c, d + 0);\n      a[b + 16] && nc(a, b + 16, c, d + 4);\n      a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n      a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4)\n    }\n\n    function Dc(a, b, c) {\n      var d = b - f,\n        e = oa,\n        g = 255 - a[d - 1],\n        k;\n      for (k = 0; k <\n        c; ++k) {\n        var h = e,\n          n = g + a[b - 1],\n          l;\n        for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n        b += f\n      }\n    }\n\n    function Yb(a, b, c) {\n      var d;\n      for (d = 0; 16 > d; ++d)\n        for (i = 0; 16 > i; ++i) b[c + d * f + i] = a\n    }\n\n    function y(a, b, c) {\n      return a + 2 * b + c + 2 >> 2\n    }\n\n    function Zb(a, b, c) {\n      var d, e;\n      for (d = 0; 8 > d; ++d)\n        for (e = 0; 8 > e; ++e) b[c + e + d * f] = a\n    }\n\n    function nb(a, b, c) {\n      var d = a[b - c],\n        e = a[b + 0],\n        g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]],\n        k = oc[112 + (g + 4 >> 3)];\n      a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n      a[b + 0] = oa[255 + e - k]\n    }\n\n    function Bd(a, b, c, d) {\n      var e = a[b + 0],\n        g = a[b + c];\n      return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d\n    }\n\n    function Cd(a,\n      b, c, d, e) {\n      var g = a[b - 3 * c],\n        k = a[b - 2 * c],\n        h = a[b - c],\n        n = a[b + 0],\n        l = a[b + c],\n        m = a[b + 2 * c],\n        f = a[b + 3 * c];\n      return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e\n    }\n\n    function Dd(a, b, c, d) {\n      var e;\n      for (e = 0; 16 > e; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c)\n    }\n\n    function Ed(a, b, c, d) {\n      var e;\n      for (e = 0; 16 > e; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1)\n    }\n\n    function sf(a, b, c, d) {\n      var e;\n      for (e = 3; 0 < e; --e) b +=\n        4 * c, Dd(a, b + 0, c, d)\n    }\n\n    function tf(a, b, c, d) {\n      var e;\n      for (e = 3; 0 < e; --e) b += 4, Ed(a, b + 0, c, d)\n    }\n\n    function Fa(a, b, c, d, e, g, k, h) {\n      for (; 0 < e--;) {\n        if (Cd(a, b + 0, c, g, k))\n          if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n          else {\n            var n = a,\n              l = b + 0,\n              m = c,\n              f = n[l - 2 * m],\n              q = n[l - m],\n              r = n[l + 0],\n              u = n[l + m],\n              v = n[l + 2 * m],\n              C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]],\n              A = 27 * C + 63 >> 7,\n              z = 18 * C + 63 >> 7,\n              C = 9 * C + 63 >> 7;\n            n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n            n[l - 2 * m] = oa[255 + f + z];\n            n[l - m] = oa[255 + q + A];\n            n[l + 0] = oa[255 + r - A];\n            n[l + m] = oa[255 + u - z];\n            n[l + 2 * m] = oa[255 + v - C]\n          }\n        b += d\n      }\n    }\n\n    function Ga(a, b, c, d, e, g, k, h) {\n      for (; 0 < e--;) {\n        if (Cd(a, b + 0, c,\n            g, k))\n          if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n          else {\n            var n = a,\n              l = b + 0,\n              m = c,\n              f = n[l - m],\n              q = n[l + 0],\n              r = n[l + m],\n              u = 3 * (q - f),\n              v = oc[112 + (u + 4 >> 3)],\n              u = oc[112 + (u + 3 >> 3)],\n              C = v + 1 >> 1;\n            n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n            n[l - m] = oa[255 + f + u];\n            n[l + 0] = oa[255 + q - v];\n            n[l + m] = oa[255 + r - C]\n          }\n        b += d\n      }\n    }\n\n    function uf(a, b, c, d, e, g) {\n      Fa(a, b + 0, c, 1, 16, d, e, g)\n    }\n\n    function vf(a, b, c, d, e, g) {\n      Fa(a, b + 0, 1, c, 16, d, e, g)\n    }\n\n    function wf(a, b, c, d, e, g) {\n      var k;\n      for (k = 3; 0 < k; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g)\n    }\n\n    function xf(a, b, c, d, e, g) {\n      var k;\n      for (k = 3; 0 < k; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g)\n    }\n\n    function yf(a, b, c, d, e,\n      g, k, h) {\n      Fa(a, b, e, 1, 8, g, k, h);\n      Fa(c, d, e, 1, 8, g, k, h)\n    }\n\n    function zf(a, b, c, d, e, g, k, h) {\n      Fa(a, b, 1, e, 8, g, k, h);\n      Fa(c, d, 1, e, 8, g, k, h)\n    }\n\n    function Af(a, b, c, d, e, g, k, h) {\n      Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n      Ga(c, d + 4 * e, e, 1, 8, g, k, h)\n    }\n\n    function Bf(a, b, c, d, e, g, k, h) {\n      Ga(a, b + 4, 1, e, 8, g, k, h);\n      Ga(c, d + 4, 1, e, 8, g, k, h)\n    }\n\n    function Fd(a, b) {\n      return b == $b ? 0 == a.i ? 0 == a.d ? Cf : Df : 0 == a.d ? Ef : $b : b\n    }\n\n    function Ec(a, b, c, d) {\n      for (i = 0; 4 > i; ++i) a[b + i] = c[d + i]\n    }\n\n    function wa(a, b) {\n      return 0 > a ? 0 : a > b ? b : a\n    }\n\n    function Gd(a) {\n      a.a = \"VP8_STATUS_OK\";\n      a.xc = \"OK\"\n    }\n\n    function td(a) {\n      a >>> 8 != na >>> 8 && alert(\"mismatch error\")\n    }\n\n    function Y(a, b, c) {\n      a.a == L && (a.a = b, a.xc = c, a.za = 0);\n      // alert(b + \": \" + c);\n      return 0\n    }\n\n    function Hd(a, b) {\n      var c = [0],\n        d = x,\n        e = [Mb],\n        g = M(Id),\n        k = M(Jd),\n        h = M(Fc),\n        e = \"VP8StatusCode\",\n        g = M(Gc);\n      if (a == p) return alert(\"(dec == null)\"), 0;\n      Gd(a);\n      if (b == p) return Y(a, \"VP8_STATUS_INVALID_PARAM\", \"null VP8Io passed to VP8GetHeaders()\");\n      g.data = b.data;\n      g.b = b.b;\n      g.e = b.e;\n      g.b = [g.b];\n      g.e = [g.e];\n      g = [g];\n      e = Kd(g);\n      if (e != L) return Y(a, e, \"Incorrect/incomplete header.\");\n      g = g[0];\n      g.b = g.b[0];\n      g.e = g.e[0];\n      if (g.ia) return Y(a, W, \"Unexpected lossless format encountered.\");\n      a.Ga == p && ($(0 == a.ub), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n      d = g.data;\n      c = g.b + g.offset;\n      e = g.e - g.offset;\n      $(g.e >= g.offset);\n      if (4 > e[0]) return Y(a, Z, \"Truncated header.\");\n      h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n      g = a.Ac;\n      g.fb = !(h & 1) + 0;\n      g.Jc = h >> 1 & 7;\n      g.Nc = h >> 4 & 1;\n      g.Ra = h >> 5;\n      if (3 < g.Jc) return Y(a, \"VP8_STATUS_BITSTREAM_ERROR\", \"Incorrect keyframe parameters.\");\n      if (!g.Nc) return Y(a, \"VP8_STATUS_UNSUPPORTED_FEATURE\", \"Frame not displayable.\");\n      c += 3;\n      e -= 3;\n      k = a.P;\n      if (g.fb) {\n        if (7 > e) return Y(a, \"VP8_STATUS_NOT_ENOUGH_DATA\", \"cannot parse picture header\");\n        if (!(3 <=\n            e && 157 == d[c + 0] && 1 == d[c + 1] && 42 == d[c + 2])) return Y(a, \"VP8_STATUS_BITSTREAM_ERROR\", \"Bad code word\");\n        k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n        k.gd = d[c + 4] >> 6;\n        k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n        k.hd = d[c + 6] >> 6;\n        c += 7;\n        e -= 7;\n        a.Ma = k.l + 15 >> 4;\n        a.hb = k.v + 15 >> 4;\n        b.width = k.l;\n        b.height = k.v;\n        b.I = 0;\n        b.Ua = 0;\n        b.k = 0;\n        b.t = 0;\n        b.Ka = b.width;\n        b.K = b.height;\n        b.m = b.width;\n        b.h = b.height;\n        h = a.R;\n        for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n        h.z = M(Ff);\n        h = a.Ca;\n        $(h != p);\n        h.pb = 0;\n        h.ob = 0;\n        h.tb = 1;\n        for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n        for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n        a.Lb = 0\n      }\n      if (g.Ra >\n        e) return Y(a, \"VP8_STATUS_NOT_ENOUGH_DATA\", \"bad partition length\");\n      h = a.o;\n      D(h, d, c, c + g.Ra);\n      c += g.Ra;\n      e -= g.Ra;\n      g.fb && (k.uc = G(h), k.$c = G(h));\n      var k = h,\n        n = a.Ca,\n        l = a.R;\n      $(k != p);\n      $(n != p);\n      n.pb = G(k);\n      if (n.pb) {\n        n.ob = G(k);\n        if (G(k)) {\n          var m;\n          n.tb = G(k);\n          for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n          for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0\n        }\n        if (n.ob)\n          for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255\n      } else n.ob = 0;\n      if (k.Ab) return Y(a, \"VP8_STATUS_BITSTREAM_ERROR\", \"cannot parse segment header\");\n      k = h;\n      n = a.ga;\n      n.Oc = G(k);\n      n.Fb = S(k, 6);\n      n.kb = S(k, 3);\n      n.oc = G(k);\n      if (n.oc &&\n        G(k)) {\n        for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n        for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6))\n      }\n      a.A = 0 == n.Fb ? 0 : n.Oc ? 1 : 2;\n      if (0 < a.A)\n        if (a.Ca.pb)\n          for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n        else a.Zb[0] = n.Fb;\n      if (k.Ab) return Y(a, \"VP8_STATUS_BITSTREAM_ERROR\", \"cannot parse filter header\");\n      var k = d,\n        f = c,\n        n = f,\n        e = f + e;\n      m = 0;\n      var q = s,\n        r = s;\n      a.Hb = 1 << S(a.o, 2);\n      q = a.Hb - 1;\n      l = k;\n      m = f + 3 * q;\n      if (e < m) e = \"VP8_STATUS_NOT_ENOUGH_DATA\";\n      else {\n        for (r = 0; r < q; ++r) {\n          var f = l,\n            u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n          u > e && (f = k);\n          D(a.ic[+r], l, m, u);\n          l = f;\n          m = u;\n          n += 3\n        }\n        D(a.ic[+q], l, m, e);\n        e = m < e ? \"VP8_STATUS_OK\" : \"VP8_STATUS_SUSPENDED\"\n      }\n      if (\"VP8_STATUS_OK\" != e) return Y(a, \"VP8_STATUS_BITSTREAM_ERROR\", \"cannot parse partitions\");\n      q = a.o;\n      e = S(q, 7);\n      k = G(q) ? ga(q, 4) : 0;\n      n = G(q) ? ga(q, 4) : 0;\n      l = G(q) ? ga(q, 4) : 0;\n      m = G(q) ? ga(q, 4) : 0;\n      q = G(q) ? ga(q, 4) : 0;\n      r = a.Ca;\n      f = s;\n      for (f = 0; f < xa; ++f) {\n        u = s;\n        if (r.pb) u = r.Kb[f], r.tb || (u += e);\n        else if (0 < f) {\n          a.yb[f] = a.yb[0];\n          continue\n        } else u = e;\n        var v = a.yb[f];\n        v.sc[0] = Ic[wa(u + k, 127)];\n        v.sc[1] = Jc[wa(u + 0, 127)];\n        v.sb[0] = 2 * Ic[wa(u + n, 127)];\n        v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n        8 > v.sb[1] &&\n          (v.sb[1] = 8);\n        v.qc[0] = Ic[wa(u + m, 117)];\n        v.qc[1] = Jc[wa(u + q, 127)]\n      }\n      if (g.fb) a.Zc = 259;\n      else return Y(a, Hf, \"Not a key frame.\");\n      G(h);\n      e = a.R;\n      for (k = 0; k < Md; ++k)\n        for (n = 0; n < Nd; ++n)\n          for (l = 0; l < Kc; ++l)\n            for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n      a.pc = G(h);\n      a.pc && (a.Pc = S(h, 8));\n      if (a.P.uc) {\n        c -= 8;\n        h = Mb;\n        if (8 > g.Ra || 1 != d[c + 8 - 1]) return Y(a, W, \"RIFF: Inconsistent extra information.\");\n        h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n        a.fc = h;\n        a.dd = p;\n        a.cd = d[c + 3]\n      }\n      return a.za = 1\n    }\n\n    function Mc(a, b, c, d, e, g) {\n      var k = b[e][c];\n      if (!w(a, k[0])) return 0;\n      for (;;) {\n        ++e;\n        if (w(a, k[1])) {\n          var h;\n          if (w(a, k[2])) {\n            if (w(a, k[3]))\n              if (w(a, k[6])) {\n                h = x;\n                c = w(a, k[8]);\n                k = w(a, k[9 + c]);\n                k = 2 * c + k;\n                c = 0;\n                h = Jf[k];\n                var n;\n                for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n                c += 3 + (8 << k)\n              } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n            else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n            k = b[Nc[e]][2]\n          } else k = b[Nc[e]][1], c = 1;\n          h = Kf[e - 1];\n          g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(0 < h) + 0];\n          if (16 == e || !w(a, k[0])) return e\n        } else k = b[Nc[e]][0];\n        if (16 == e) return 16\n      }\n    }\n\n    function ob(a, b) {\n      return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf &\n        4278190080) >> b\n    }\n\n    function Mf(a, b) {\n      var c = 0;\n      if (a == p) return 0;\n      if (b == p) return Y(a, \"VP8_STATUS_INVALID_PARAM\", \"NULL VP8Io parameter in VP8Decode().\");\n      if (!a.za && !Hd(a, b)) return 0;\n      $(a.za);\n      var d;\n      if (b.Mb && !b.Mb(b)) Y(a, Nf, \"Frame setup failed\"), d = a.a;\n      else {\n        b.Za && (a.A = 0);\n        var e = uc[a.A];\n        2 == a.A ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, 0 > a.lb && (a.lb = 0), 0 > a.mb && (a.mb = 0));\n        a.Ya = b.K + 15 + e >> 4;\n        a.wb = b.Ka + 15 + e >> 4;\n        a.wb > a.Ma && (a.wb = a.Ma);\n        a.Ya > a.hb && (a.Ya = a.hb);\n        d = L\n      }\n      if (c = d == L) {\n        if (c) {\n          var g;\n          b: {\n            a.Ja = 0;\n            if (a.qb) {\n              var k = a.rc;\n              if (!WebPWorkerReset(k)) {\n                g =\n                  Y(a, cb, \"thread initialization failed.\");\n                break b\n              }\n              k.Qd = a;\n              k.Rd = a.oa.N;\n              k.Ud = FinishRow;\n              a.jb = 0 < a.A ? Od : Od - 1\n            } else a.jb = Of;\n            g = 1\n          }\n          var h;\n          if (!(h = !g)) {\n            var n;\n            b: {\n              var l = a.jb,\n                m = a.Ma,\n                t = 4 * m,\n                q = 32 * m,\n                r = m + 1,\n                u = 0 < a.A ? m * (a.qb ? 2 : 1) : 0,\n                v = Pf,\n                C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10)),\n                A = a.Ga != p ? a.P.l * a.P.v : 0,\n                z = t + q + r + u + v + 384 + C + A + Pd;\n              if (z != z) n = 0;\n              else {\n                if (z > a.Gb) {\n                  a.ib = 0;\n                  a.Gb = 0;\n                  if (a.ib == p) {\n                    n = Y(a, \"VP8_STATUS_OUT_OF_MEMORY\", \"no memory during frame initialization.\");\n                    break b\n                  }\n                  a.Gb = z\n                }\n                a.dc = 205;\n                a.Xc = rc(205, 16 * m);\n                a.Sc = rc(205, 8 * m);\n                a.Vc = rc(205, 8 * m);\n                a.M =\n                  u ? ic(Oc, u) : p;\n                a.Sd = u ? 0 : p;\n                a.oa.ha = 0;\n                a.oa.M = a.M;\n                $(0 == (v & Pd));\n                a.Ea = rc(205, 1 * v);\n                a.z = -12851;\n                a.H = 16 * m;\n                a.r = 8 * m;\n                var Ha = uc[a.A],\n                  G = Ha * a.H,\n                  y = Ha / 2 * a.r;\n                a.ca = U(C, 205);\n                a.da = +G;\n                a.aa = a.ca;\n                a.ba = a.da + 16 * l * a.H + y;\n                a.ra = a.aa;\n                a.sa = a.ba + 8 * l * a.r + y;\n                a.Xb = A ? U(A, x) : p;\n                a.La = ic(Qd, r);\n                a.dc = rc($b, t);\n                n = 1\n              }\n            }\n            h = !n\n          }\n          if (h) c = 0;\n          else {\n            b.width = a.P.l;\n            b.height = a.P.v;\n            b.w = 0;\n            b.y = a.ca;\n            b.D = a.da;\n            b.c = a.aa;\n            b.B = a.ba;\n            b.S = a.ra;\n            b.C = a.sa;\n            b.F = a.H;\n            b.Da = a.r;\n            b.p = p;\n            b.q = p;\n            if (!Rd) {\n              var B;\n              for (B = -255; 255 >= B; ++B) va[255 + B] = 0 > B ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n              for (B = -1020; 1020 >=\n                B; ++B) sc[1020 + B] = -128 > B ? -128 : 127 < B ? 127 : B;\n              for (B = -112; 112 >= B; ++B) oc[112 + B] = -16 > B ? -16 : 15 < B ? 15 : B;\n              for (B = -255; 510 >= B; ++B) oa[255 + B] = 0 > B ? 0 : 255 < B ? 255 : B;\n              Rd = 1\n            }\n            mc = pf;\n            Pc = qf;\n            Qc = nc;\n            Rc = rf;\n            Sd = uf;\n            Td = vf;\n            Ud = yf;\n            Vd = zf;\n            Wd = wf;\n            Xd = xf;\n            Yd = Af;\n            Zd = Bf;\n            $d = Dd;\n            ae = Ed;\n            be = sf;\n            ce = tf;\n            c = 1\n          }\n        }\n        if (c) a: {\n          for (a.d = 0; a.d < a.Ya; ++a.d) {\n            var Qf = a.ic[a.d & a.Hb - 1],\n              db = a,\n              F = db.La[0];\n            F.X = 0;\n            F.ua = 0;\n            jd(db.cc, 0, $b, db.cc.length);\n            db.W = (0 < db.A && db.d >= db.mb && db.d <= db.Ya) + 0;\n            for (a.i = 0; a.i < a.Ma; a.i++) {\n              var D;\n              var H = a,\n                T = Qf,\n                ya = H.o,\n                S = H.La[0],\n                J = H.La[1 + H.i];\n              H.Ca.ob && (H.Lb = !w(ya,\n                H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n              J.Nb = H.pc ? w(ya, H.Pc) : 0;\n              var O = H.dc;\n              O[O.length - 1] = 0 + 4 * H.i;\n              var Sc = H.cc;\n              H.wa = !w(ya, 145);\n              if (H.wa)\n                for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; 4 > Z; ++Z) {\n                  var V = Sc[Z],\n                    R;\n                  for (R = 0; 4 > R; ++R) {\n                    var ta = Rf[O[O[O.length - 1] + R]][V],\n                      za = 0;\n                    do za = Sf[2 * za + w(ya, ta[za])]; while (0 < za);\n                    V = -za;\n                    O[O[O.length - 1] + R] = V;\n                    ga[ja] = V;\n                    ja++\n                  }\n                  Sc[Z] = V\n                } else {\n                  var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n                  H.Eb[0] = V;\n                  for (za = 0; 4 > za; ++za) O[za + O[O.length - 1]] = V;\n                  for (za = 0; 4 > za; ++za) Sc[za] = V\n                }\n              H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe :\n                w(ya, 183) ? de : ee;\n              if (ya.Ab) D = 0;\n              else {\n                if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n                else {\n                  var ia = ca,\n                    ka = ca,\n                    sa = ca,\n                    wa = Tf,\n                    Aa = H.yb[H.Lb],\n                    aa = H.z,\n                    ma = H.La[0],\n                    ua = U(4, 0),\n                    xa = U(4, 0),\n                    ea = U(4, 0),\n                    pb = U(4, 0),\n                    na = 0,\n                    Ba = 0,\n                    pa = ca,\n                    qa = ca,\n                    Sa = ca,\n                    aa = rc(0, 384);\n                  if (H.wa) sa = 0, wa = H.R.z[3];\n                  else {\n                    var ab = U(16, 0),\n                      Ca = J.ua + ma.ua;\n                    J.ua = ma.ua = (0 < Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab)) + 0;\n                    for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; 4 > X; ++X) {\n                      var Da = qb[0 + X] + qb[12 + X],\n                        Ea = qb[4 + X] + qb[8 + X],\n                        Fa = qb[4 + X] - qb[8 + X],\n                        Ga = qb[0 + X] - qb[12 + X];\n                      La[0 + X] = Da + Ea;\n                      La[8 +\n                        X] = Da - Ea;\n                      La[4 + X] = Ga + Fa;\n                      La[12 + X] = Ga - Fa\n                    }\n                    for (X = 0; 4 > X; ++X) {\n                      var Oa = Ta[Ta.length - 1],\n                        lb = La[0 + 4 * X] + 3,\n                        Da = lb + La[3 + 4 * X],\n                        Ea = La[1 + 4 * X] + La[2 + 4 * X],\n                        Fa = La[1 + 4 * X] - La[2 + 4 * X],\n                        Ga = lb - La[3 + 4 * X];\n                      Ta[Oa + 0] = Da + Ea >> 3;\n                      Ta[Oa + 16] = Ga + Fa >> 3;\n                      Ta[Oa + 32] = Da - Ea >> 3;\n                      Ta[Oa + 48] = Ga - Fa >> 3;\n                      Ta[Ta.length - 1] += 64\n                    }\n                    aa[aa.length - 1] = 0\n                  }\n                  ea = Nb(vc[J.X & 15]);\n                  pb = Nb(vc[ma.X & 15]);\n                  for (qa = 0; 4 > qa; ++qa) {\n                    for (var Eb = pb[qa], pa = 0; 4 > pa; ++pa) {\n                      var Ca = Eb + ea[pa],\n                        Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n                      ea[pa] = Eb = (0 < Ka) + 0;\n                      xa[pa] = (0 != aa[aa[aa.length - 1] + 0]) + 0;\n                      ua[pa] = (1 < Ka) + 0;\n                      aa[aa.length -\n                        1] += 16\n                    }\n                    pb[qa] = Eb;\n                    Ba |= ob(xa, 24 - 4 * qa);\n                    na |= ob(ua, 24 - 4 * qa)\n                  }\n                  ia = ob(ea, 24);\n                  ka = ob(pb, 24);\n                  ea = Nb(vc[J.X >> 4]);\n                  pb = Nb(vc[ma.X >> 4]);\n                  for (Sa = 0; 4 > Sa; Sa += 2) {\n                    for (qa = 0; 2 > qa; ++qa) {\n                      Eb = pb[Sa + qa];\n                      for (pa = 0; 2 > pa; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (0 < Ka) + 0, xa[2 * qa + pa] = (0 != aa[aa[aa.length - 1] + 0]) + 0, ua[2 * qa + pa] = (1 < Ka) + 0, aa[aa.length - 1] += 16;\n                      pb[Sa + qa] = Eb\n                    }\n                    Ba |= ob(xa, 8 - 2 * Sa);\n                    na |= ob(ua, 8 - 2 * Sa)\n                  }\n                  ia |= ob(ea, 20);\n                  ka |= ob(pb, 20);\n                  J.X = ia;\n                  ma.X = ka;\n                  H.z = aa;\n                  H.Oa = na + 0;\n                  H.ja = na | Ba;\n                  J.Nb = !H.ja + 0\n                }\n                D = !T.Ab\n              }\n              if (!D) {\n                c = Y(a, \"VP8_STATUS_NOT_ENOUGH_DATA\",\n                  \"Premature end-of-file encountered.\" + a.i + \" \" + a.d);\n                break a\n              }\n              var P = a,\n                da = P.Ea,\n                Ma = Tc,\n                Ua = P.Ea,\n                Va = Uc,\n                Wa = P.Ea,\n                Xa = he;\n              if (0 < P.i) {\n                for (var ba = ca, ba = -1; 16 > ba; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n                for (ba = -1; 8 > ba; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4)\n              } else {\n                for (ba = 0; 16 > ba; ++ba) da[Ma + ba * f - 1] = 129;\n                for (ba = 0; 8 > ba; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n                0 < P.d && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129)\n              }\n              var Qa = P.Xc,\n                Ra = 16 * +P.i,\n                mb = P.Sc,\n                vb = 8 * +P.i,\n                wb = P.Vc,\n                xb = 8 * +P.i,\n                Za = P.z,\n                fa = ca;\n              if (0 < P.d) N(da, Ma - f, Qa, Ra,\n                16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n              else if (0 == P.i) {\n                for (i = 0; 21 > i; ++i) da[Ma - f - 1 + i] = 127;\n                for (i = 0; 9 > i; ++i) Ua[Va - f - 1 + i] = 127;\n                for (i = 0; 9 > i; ++i) Wa[Xa - f - 1 + i] = 127\n              }\n              if (P.wa) {\n                var Ya = Ma - f + 16;\n                0 < P.d && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n                for (var Fb = 0; 4 > Fb; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n                for (fa = 0; 16 > fa; fa++) {\n                  var ac = da,\n                    bc = Ma + ie[fa];\n                  Uf[P.Eb[fa]](ac, bc);\n                  P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc)\n                }\n              } else {\n                var $a =\n                  Fd(P, P.Eb[0]);\n                Vf[$a](da, Ma);\n                if (P.ja)\n                  for (fa = 0; 16 > fa; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc)\n              }\n              $a = Fd(P, P.Tc);\n              je[$a](Ua, Va);\n              je[$a](Wa, Xa);\n              if (P.ja & 983040) {\n                var zb = P.z,\n                  Pa = 256;\n                P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va)\n              }\n              if (P.ja & 15728640) {\n                var Ab = P.z,\n                  Pa = 320;\n                P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa)\n              }\n              P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n              var Q = a;\n              if (0 < Q.A) {\n                var kb = Q.M[1 + Q.i],\n                  Kb = Q.La[1 + Q.i].Nb,\n                  ha = Q.Zb[Q.Lb];\n                Q.ga.oc && (ha +=\n                  Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n                ha = 0 > ha ? 0 : 63 < ha ? 63 : ha;\n                kb.zc = ha;\n                0 < Q.ga.kb && (ha = 4 < Q.ga.kb ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n                kb.yc = 1 > ha ? 1 : ha;\n                kb.ab = (!Kb || Q.wa) + 0\n              }\n              for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; 16 > Ia; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n              for (Ia = 0; 8 > Ia; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8)\n            }\n            var K = a,\n              I = b,\n              cc = 1,\n              eb = K.oa;\n            if (K.qb) {\n              var nb = K.rc,\n                cc = cc & WebPWorkerSync(nb);\n              $(nb.a == OK);\n              if (cc) {\n                eb.N =\n                  I;\n                eb.ha = K.Ja;\n                eb.d = K.d;\n                eb.W = K.W;\n                if (eb.W) {\n                  var hc = eb.M;\n                  eb.M = K.M;\n                  K.M = hc\n                }\n                WebPWorkerLaunch(nb);\n                ++K.Ja == K.jb && (K.Ja = 0)\n              }\n            } else {\n              eb.d = K.d;\n              eb.W = K.W;\n              b: {\n                var Hb = 1,\n                  rb = K.oa,\n                  ib = uc[K.A],\n                  yb = ib * K.H,\n                  dc = parseInt(ib / 2) * K.r,\n                  Ib = 16 * rb.ha * K.H,\n                  jb = 8 * rb.ha * K.r,\n                  Jb = K.ca,\n                  Lb = K.da - yb + Ib,\n                  Ob = K.aa,\n                  Pb = K.ba - dc + jb,\n                  Rb = K.ra,\n                  Sb = K.sa - dc + jb,\n                  jc = 0 == rb.d,\n                  Tb = (rb.d >= K.hb - 1) + 0,\n                  ra = 16 * rb.d,\n                  fb = 16 * (rb.d + 1);\n                if (rb.W) {\n                  var pc = K,\n                    wc = s,\n                    kc = pc.oa.d;\n                  $(pc.oa.W);\n                  for (wc = pc.lb; wc < pc.wb; ++wc) {\n                    var Na = pc,\n                      ec = wc,\n                      Vb = kc,\n                      xc = Na.oa,\n                      gb = Na.H,\n                      fc = xc.M[1 + ec],\n                      sb = Na.ca,\n                      tb = Na.da + 16 * xc.ha *\n                      gb + 16 * ec,\n                      Gb = fc.zc,\n                      hb = fc.yc,\n                      Ja = 2 * Gb + hb;\n                    if (0 != Gb)\n                      if (1 == Na.A) 0 < ec && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), 0 < Vb && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n                      else {\n                        var gc = Na.r,\n                          yc = Na.aa,\n                          zc = Na.ba + 8 * xc.ha * gc + 8 * ec,\n                          Ac = Na.ra,\n                          Bc = Na.sa + 8 * xc.ha * gc + 8 * ec,\n                          ub = Na.Ac.fb ? 40 <= Gb ? 2 : 15 <= Gb ? 1 : 0 : 40 <= Gb ? 3 : 20 <= Gb ? 2 : 15 <= Gb ? 1 : 0;\n                        0 < ec && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n                        fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n                        0 < Vb && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n                        fc.ab && (Wd(sb, tb, gb,\n                          Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub))\n                      }\n                  }\n                }\n                if (I.put) {\n                  jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n                  Tb || (fb -= ib);\n                  fb > I.K && (fb = I.K);\n                  if (K.Ga != p && ra < fb && (0 == ra ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n                    cc = Y(K, W, \"Could not decode alpha data.\");\n                    break b\n                  }\n                  if (ra < I.k) {\n                    var qc = I.k - ra,\n                      ra = I.k;\n                    $(!(qc & 1));\n                    I.D += K.H * qc;\n                    I.B += K.r * (qc >> 1);\n                    I.C += K.r * (qc >> 1);\n                    I.p != p && (I.q += I.width * qc)\n                  }\n                  ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n                    I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I))\n                }\n                rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n                cc = Hb\n              }\n            }\n            if (!cc) {\n              c = Y(a, \"VP8_STATUS_USER_ABORT\", \"Output aborted.\");\n              break a\n            }\n          }\n          var Cb;\n          if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n            var Db;\n            if (Db = 0 < a.fc) $(a), $(0 < a.fc), Db = !1;\n            Cb = Db\n          }\n          c = Cb ? 0 : 1\n        }\n        var lc = c;\n        b.Pb && b.Pb(b);\n        c = lc & 1\n      }\n      if (!c) return ke(a), 0;\n      a.za = 0;\n      return c\n    }\n\n    function ke(a) {\n      a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0)\n    }\n\n    function Aa(a, b) {\n      return a + (1 << b) - 1 >> b\n    }\n\n    function hc(a, b, c, d, e) {\n      var g = vb[c] + wb[b] >> ea;\n      b = xb[b];\n      d[e + 0] = ia[a + Za[c] - J];\n      d[e + 1] = ia[a + g - J];\n      d[e + 2] = ia[a + b - J]\n    }\n\n    function le(a, b, c, d, e) {\n      var g = vb[c] + wb[b] >> ea;\n      b = xb[b];\n      d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n      d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3\n    }\n\n    function me(a, b, c, d, e) {\n      d[e + 0] = 255;\n      hc(a, b, c, d, e + 1)\n    }\n\n    function ne(a, b, c, d, e) {\n      var g = xb[b];\n      d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n      d[e + 1] = 15 | Hb[a + g - J] << 4\n    }\n\n    function Vc(a, b, c, d, e) {\n      var g = Za[c];\n      c = vb[c] + wb[b] >> ea;\n      d[e + 0] = ia[a + xb[b] - J];\n      d[e + 1] = ia[a + c - J];\n      d[e + 2] = ia[a + g - J]\n    }\n\n    function oe(a, b, c, d, e) {\n      Vc(a, b, c, d, e);\n      d[e + 3] = 255\n    }\n\n    function pe(a, b, c, d, e) {\n      hc(a, b, c, d, e);\n      d[e + 3] = 255\n    }\n\n    function ib(a, b, c) {\n      a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0\n    }\n\n    function ka(a, b) {\n      return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0\n    }\n\n    function $a(a) {\n      return 256 > a && 0 < a ? a : 0 >= a ? 0 : ~a >> 24 & 255\n    }\n\n    function yb(a, b) {\n      return $a(a + parseInt((a - b) / 2, 10))\n    }\n\n    function Wc() {\n      return qe\n    }\n\n    function Xc(a, b) {\n      a &= 255;\n      b &= 255;\n      127 < a && (a -= 256);\n      127 < b && (b -= 256);\n      return a * b >>> 5\n    }\n\n    function re(a,\n      b, c, d, e, g, k) {\n      var h = s,\n        n = 8 >> a.n,\n        l = a.U,\n        f = a.u;\n      if (8 > n) {\n        a = (1 << a.n) - 1;\n        for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n          b = 0;\n          for (var q = s, q = 0; q < l; ++q) 0 == (q & a) && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n\n        }\n      } else\n        for (h = b; h < c; ++h)\n          for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255]\n    }\n\n    function se(a, b, c, d, e) {\n      for (c = b + c; b < c;) {\n        var g = a[b++];\n        d[e++] = g >> 16 & 255;\n        d[e++] = g >> 8 & 255;\n        d[e++] = g >> 0 & 255;\n        d[e++] = g >> 24 & 255\n      }\n    }\n\n    function te(a, b, c, d, e) {\n      for (c = b + c; b < c;) {\n        var g = a[b++];\n        d[e++] = g >> 16 & 240 | g >> 12 & 15;\n        d[e++] = g >> 0 & 240 | g >> 28 & 15\n      }\n    }\n\n    function Ib(a, b, c, d, e) {\n      for (c = b + c; b < c;) {\n        var g =\n          a[b++];\n        d[e++] = g >> 24 & 255;\n        d[e++] = g >> 16 & 255;\n        d[e++] = g >> 8 & 255;\n        d[e++] = g >> 0 & 255\n      }\n    }\n\n    function ue(a, b, c, d) {\n      if (T(a, 8) != ve) return 0;\n      b[0] = T(a, we) + 1;\n      c[0] = T(a, we) + 1;\n      d[0] = T(a, 1);\n      T(a, Wf);\n      return 1\n    }\n\n    function xe(a, b) {\n      var c = s;\n      if (4 > a) return a + 1;\n      c = a - 2 >> 1;\n      return (2 + (a & 1) << c) + T(b, c) + 1\n    }\n\n    function Oa(a, b) {\n      if (b.Q + 8 > b.ya) {\n        var c = a.Y,\n          d = 0;\n        for ($(c != p); 0 != c[d].s;) {\n          var e = c,\n            g = b,\n            k = g.T >> g.g & 1;\n          g.L ? g.fa = 1 : (++g.g, 8 <= g.g && Sb(g), g.Q == g.ya && 32 == g.g && (g.L = 1));\n          d = d + e[d].s + k\n        }\n        return c[d].kc\n      }\n      c = a.Y;\n      d = 0;\n      for ($(c != p); 0 != c[d].s;) e = c, g = b.T >> b.g & 1, ++b.g, d = d +\n        e[d].s + g;\n      return c[d].kc\n    }\n\n    function zb(a, b) {\n      if (a != p)\n        for (var c = s, d = s, c = 0; c < b; ++c)\n          for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d])\n    }\n\n    function ye(a, b, c) {\n      b = 0 == a.eb ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n      $(b < a.hc);\n      return a.Db[+b]\n    }\n\n    function ze(a, b, c, d) {\n      var e = a.Na,\n        g = a.O,\n        k = g + b,\n        h = c,\n        f = d;\n      d = a.Xa;\n      c = a.vb;\n      for (N(d, c, h, f, a.l * b); 0 < e--;) {\n        b = a.nc[e];\n        var l = g,\n          m = k,\n          t = h,\n          q = f,\n          f = d,\n          h = c;\n        $(l < m);\n        $(m <= b.Vb);\n        switch (b.Qc) {\n          case Ae:\n            t = 0;\n            for (b = h + (m - l) * b.U; h < b;) {\n              var m = f,\n                q = h,\n                r = m[q] >> 8 & 255,\n                u = (m[q] & 16711935) >>> 0,\n                u = u + (r << 16 | r),\n                u = u & 16711935;\n              f[h++] = ((m[q] & 4278255360) >>>\n                0 | u) >>> 0;\n              32 == l && t++\n            }\n            break;\n          case Be:\n            var v = b,\n              C = l,\n              t = m,\n              q = f,\n              r = h,\n              u = v.U;\n            if (0 == C) {\n              var A = s;\n              ib(q, r, qe);\n              for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n              r += u;\n              ++C\n            }\n            for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n              var y = w,\n                B = v,\n                G = p;\n              ib(q, r, q[r - u + 0]);\n              G = Ce[y[B++] >> 8 & 15];\n              for (A = 1; A < u; ++A) {\n                var F = E;\n                0 == (A & z) && (G = Ce[y[B++] >> 8 & 15]);\n                F = G(q[r + A - 1], q, r + A - u);\n                ib(q, r + A, F)\n              }\n              r += u;\n              ++C;\n              0 == (C & z) && (v += Ha)\n            }\n            m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n            break;\n          case De:\n            t = b.U;\n            q = (1 << b.n) - 1;\n            r = Aa(t, b.n);\n            u = b.u;\n            for (b = +(l >> b.n) * r; l < m;) {\n              A = u;\n              C = b;\n              z = M(Xf);\n              Ha =\n                s;\n              for (Ha = 0; Ha < t; ++Ha) 0 == (Ha & q) && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n              h += t;\n              ++l;\n              0 == (l & q) && (b += r)\n            }\n            break;\n          case Ee:\n            t == f && 0 < b.n ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h)\n        }\n        h = d;\n        f = c\n      }\n    }\n\n    function Yf(a, b) {\n      var c = a.V,\n        d = a.Ha + a.l * a.O,\n        e = b - a.O;\n      if (!(0 >= e)) {\n        ze(a, e, c, d);\n        var g = a.N,\n          c = a.Xa,\n          k = [a.vb];\n        var d = a.O,\n          e = b,\n          h = k,\n          f = g.width;\n        $(d < e);\n        $(g.t < g.Ka);\n        e > g.K && (e = g.K);\n        if (d < g.k) {\n          var l = g.k - d,\n            d = g.k;\n          h[0] += f * l\n        }\n        d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n        if (d) {\n          k = k[0];\n          d = a.Ib;\n          e = g.width;\n          if (d.J < ua) {\n            var m = d.c.RGBA,\n              h = m.ma,\n              t = m.Sa + a.xa * m.f;\n            if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n            else {\n              for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; 0 < q--;) {\n                var r = c,\n                  u = k,\n                  v = l,\n                  C = h,\n                  A = t;\n                switch (f) {\n                  case Qa:\n                    for (v = u + v; u < v;) {\n                      var z = r[u++];\n                      C[A++] = z >> 16 & 255;\n                      C[A++] = z >> 8 & 255;\n                      C[A++] = z >> 0 & 255\n                    }\n                    break;\n                  case jb:\n                    se(r, u, v, C, A);\n                    break;\n                  case Ob:\n                    se(r, u, v, C, A);\n                    WebPApplyAlphaMultiply(C, 0, v,\n                      1, 0);\n                    break;\n                  case Zc:\n                    for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n                    break;\n                  case Pa:\n                    Ib(r, u, v, C, A);\n                    break;\n                  case Pb:\n                    Ib(r, u, v, C, A);\n                    WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n                    break;\n                  case Ab:\n                    Ib(r, u, v, C, A);\n                    break;\n                  case Bb:\n                    Ib(r, u, v, C, A);\n                    WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n                    break;\n                  case kb:\n                    te(r, u, v, C, A);\n                    break;\n                  case Qb:\n                    te(r, u, v, C, A);\n                    WebPApplyAlphaMultiply4444(C, v, 1, 0);\n                    break;\n                  case Fe:\n                    for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n                    break;\n                  default:\n                    $(0)\n                }\n                k += e;\n                t += m\n              }\n              c = g\n            }\n            a.xa += c\n          } else a.xa =\n            g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n          $(a.xa <= d.height)\n        }\n        a.O = b;\n        $(a.O <= a.v)\n      }\n    }\n\n    function lc(a, b, c, d, e, g) {\n      var k = 1,\n        h = 0,\n        f = 0,\n        l = a.o,\n        m = a.cb,\n        t = m.Db,\n        q = c,\n        r = c;\n      c += d * e;\n      e = Ba + Ge;\n      var u = e + m.xb,\n        v = 0 < m.xb ? m.Yb : p,\n        C = m.Dc,\n        A = !1;\n      $(t != p);\n      a: for (; !l.L && q < c;) {\n        var z = s;\n        A || (0 == (h & C) && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n        if (z < Ba || A) {\n          if (!A) {\n            var w = k = A = s,\n              y = s;\n            Da(l);\n            A = Oa(t.va[$f], l);\n            k = z;\n            Da(l);\n            w = Oa(t.va[ag], l);\n            Da(l);\n            y = Oa(t.va[bg], l);\n            b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w\n          }\n          A = !1;\n          ++q;\n          ++h;\n          if (h >= d && (h = 0, ++f, g != p && 0 == f %\n              $c && g(a, f), v != p))\n            for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k\n        } else if (z < e) {\n          w = w = s;\n          k = xe(z - Ba, l);\n          z = Oa(t.va[cg], l);\n          Da(l);\n          w = xe(z, l);\n          w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = 1 <= z ? z : 1);\n          z = s;\n          for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n          q += k;\n          for (h += k; h >= d;) h -= d, ++f, g != p && 0 == f % $c && g(a, f);\n          if (q < c && (t = ye(m, h, f), v != p))\n            for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k\n        } else if (z < u) {\n          A = z - e;\n          for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n          z = b;\n          w = q;\n          y = v;\n          $(A <= -1 >>> y.bb);\n          z[w] = y.ea[A];\n          A = !0;\n          continue a\n        }(k = !l.fa) || End\n      }\n      g != p && g(a, f);\n      l.fa || !k || l.L && q < c ? (k =\n        0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n      return k\n    }\n\n    function bd(a) {\n      $(a);\n      a.ac = p;\n      zb(a.Db, a.hc);\n      var b = a.Yb;\n      b != p && (b.ea = p, b.ea = p);\n      $(a)\n    }\n\n    function sd() {\n      var a = M(eg);\n      if (a == p) return p;\n      a.a = L;\n      a.Wa = cd;\n      a.Ob = cd;\n      return a\n    }\n\n    function sa(a) {\n      var b = s;\n      if (a != p) {\n        bd(a.cb);\n        a.V = p;\n        a.V = p;\n        for (b = 0; b < a.Na; ++b) {\n          var c = a.nc[b];\n          c.u = p;\n          c.u = p\n        }\n        a.Na = 0;\n        a.Ub = 0;\n        a.Mc = p;\n        a.Mc = p;\n        a.Ib = p\n      }\n    }\n\n    function Ka(a, b, c, d, e) {\n      var g = 1;\n      a = [a];\n      b = [b];\n      for (var k = d.o, h = d.cb, f = p, l = p, l = 0;;) {\n        if (c)\n          for (; g && T(k, 1);) {\n            var m = a,\n              t = b,\n              q = d,\n              r = 1,\n              u = q.o,\n              g = q.nc[q.Na],\n              v = T(u, 2);\n            if (q.Ub & 1 << v) g = 0;\n            else {\n              q.Ub |=\n                1 << v;\n              g.Qc = v;\n              g.U = m[0];\n              g.Vb = t[0];\n              g.u = [p];\n              g.b = 0;\n              ++q.Na;\n              $(q.Na <= Je);\n              switch (v) {\n                case Be:\n                case De:\n                  g.n = T(u, 3) + 2;\n                  r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n                  break;\n                case Ee:\n                  t = T(u, 8) + 1;\n                  r = 16 < t ? 0 : 4 < t ? 1 : 2 < t ? 2 : 3;\n                  m[0] = Aa(g.U, r);\n                  g.n = r;\n                  if (m = r = Ka(t, 1, 0, q, g.u))\n                    if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n                    else {\n                      var v = q.u[0],\n                        C = q.b;\n                      u[0] = q.u[0][q.b + 0];\n                      for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n                      for (; r < t; ++r) u[r] = 0;\n                      q.u[0] = p;\n                      q.b = p;\n                      q.u[0] = u;\n                      q.b = 0;\n                      m = 1\n                    }\n                  r = m;\n                  break;\n                case Ae:\n                  break;\n                default:\n                  $(0)\n              }\n              g.u = g.u[0];\n              g = r\n            }\n          }\n        if (g && T(k, 1) && (l = T(k, 4), g = 1 <= l && l <= fg, !g)) {\n          d.a = W;\n          break\n        }\n        if (g) a: {\n          var g = d,\n            A = a[0],\n            z = b[0],\n            m = l,\n            C = v = s,\n            C = g.o,\n            q = g.cb,\n            r = [p],\n            t = p,\n            u = 1;\n          if (c && T(C, 1)) {\n            var v = T(C, 3) + 2,\n              A = Aa(A, v),\n              w = Aa(z, v),\n              z = A * w;\n            if (!Ka(A, w, 0, g, r)) {\n              g.a = W;\n              zb(t, u);\n              g = 0;\n              break a\n            }\n            r = r[0];\n            q.eb = v;\n            for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1)\n          }\n          if (C.fa) zb(t, u), g = 0;\n          else if ($(65536 >= u), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n          else {\n            for (v = 0; v < u; ++v) {\n              z = t[v].va;\n              for (C = 0; C < Yc; ++C) {\n                A = hg[C];\n                0 == C && 0 < m && (A += 1 << m);\n                b: {\n                  var y = A,\n                    A = g,\n                    G = z[+C],\n                    B = 0,\n                    w = A.o;\n                  if (T(w, 1)) {\n                    var F = Array(2),\n                      D = Array(2),\n                      L = Array(2),\n                      B = T(w, 1) + 1,\n                      J = T(w, 1);\n                    F[0] = T(w, 0 == J ? 1 : 8);\n                    D[0] = 0;\n                    L[0] = B - 1;\n                    2 == B && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n                    c: {\n                      var J = 0,\n                        H = s;\n                      $(G != p);\n                      $(L != p);\n                      $(D != p);\n                      $(F != p);\n                      if (nd(G, B)) {\n                        for (H = 0; H < B; ++H)\n                          if (D[H] != pd) {\n                            if (0 > F[H] || F[H] >= y) {\n                              (J = J && ma(G)) || ja(G);\n                              B = J;\n                              break c\n                            }\n                            if (!jc(G, F[H], D[H], L[H])) {\n                              (J = J && ma(G)) || ja(G);\n                              B = J;\n                              break c\n                            }\n                          }(J = (J = 1) && ma(G)) || ja(G);\n                        B = J\n                      } else B = 0\n                    }\n                  } else {\n                    B = s;\n                    D = [];\n                    F = T(w, 4) + 4;\n                    if (F > Ke) {\n                      A.a = W;\n                      A = 0;\n                      break b\n                    }\n                    L = Array(y);\n                    if (L == p) {\n                      A.a =\n                        cb;\n                      A = 0;\n                      break b\n                    }\n                    for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n                    c: {\n                      var B = A,\n                        O = D,\n                        D = y,\n                        F = L,\n                        J = 0,\n                        H = B.o,\n                        S = s,\n                        V = s,\n                        Y = jg,\n                        Z = M(Le);\n                      if (od(Z, O, Ke)) {\n                        if (T(H, 1)) {\n                          if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n                            B.a = W;\n                            ja(Z);\n                            B = J;\n                            break c\n                          }\n                        } else V = D;\n                        for (S = 0; S < D;) {\n                          var R = s;\n                          if (0 == V--) break;\n                          Da(H);\n                          R = Oa(Z, H);\n                          if (R < Me) F[S++] = R, 0 != R && (Y = R);\n                          else {\n                            var O = R == kg,\n                              R = R - Me,\n                              ea = lg[R],\n                              R = T(H, mg[R]) + ea;\n                            if (S + R > D) {\n                              B.a = W;\n                              ja(Z);\n                              B = J;\n                              break c\n                            }\n                            for (O = O ? Y : 0; 0 < R--;) F[S++] = O\n                          }\n                        }\n                        J = 1;\n                        ja(Z);\n                        B = J\n                      } else B.a = W, B = 0\n                    }\n                    B && (B = od(G, L, y))\n                  }(B = B && !w.fa) ? A = 1: (A.a = W, A = 0)\n                }\n                if (!A) {\n                  zb(t, u);\n                  g = 0;\n                  break a\n                }\n              }\n            }\n            q.ac = r;\n            q.hc =\n              u;\n            q.Db = t;\n            g = 1\n          }\n        }\n        if (!g) {\n          d.a = W;\n          break\n        }\n        if (0 < l) {\n          if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(0 < l), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n            d.a = cb;\n            g = 0;\n            break\n          }\n        } else h.xb = 0;\n        l = d;\n        m = a[0];\n        q = b[0];\n        r = l.cb;\n        t = r.eb;\n        l.l = m;\n        l.v = q;\n        r.Ec = Aa(m, t);\n        r.Dc = 0 == t ? -1 : (1 << t) - 1;\n        if (c) {\n          d.Ob = Cb;\n          break\n        }\n        f = Array(a * b);\n        l = 0;\n        if (f == p) {\n          d.a = cb;\n          g = 0;\n          break\n        }\n        g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n        break\n      }\n      g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n      return g\n    }\n\n    function xd(a, b) {\n      var c = a.l * a.v,\n        d = c + b + b * $c;\n      $(a.l <= b);\n      a.V = Array(d);\n      a.Ha = 0;\n      if (a.V == p) return a.Xa =\n        p, a.a = cb, 0;\n      a.Xa = a.V;\n      a.vb = a.Ha + c + b;\n      return 1\n    }\n\n    function mf(a, b) {\n      var c = b - a.O,\n        d = a.V,\n        e = a.Ha + a.l * a.O;\n      if (!(0 >= c)) {\n        ze(a, c, d, e);\n        for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n        a.O = a.xa = b\n      }\n    }\n\n    function ng(a, b) {\n      var c = [s],\n        d = [s],\n        e = [s];\n      if (a == p) return 0;\n      if (b == p) return a.a = ta, 0;\n      a.N = b;\n      a.a = L;\n      Rb(a.o, b.data, b.b, b.e);\n      if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n      a.Ob = cd;\n      b.width = c[0];\n      b.height = d[0];\n      a.Wa = Cb;\n      return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1\n    }\n\n    function og(a) {\n      var b =\n        p,\n        c = p;\n      if (a == p) return 0;\n      b = a.N;\n      $(b != p);\n      c = b.ka;\n      $(c != p);\n      a.Ib = c.j;\n      a.Hc = c.Hc;\n      $(a.Ib != p);\n      if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n      if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n      a.Wa = Db;\n      if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n      c.ec = a.xa;\n      sa(a);\n      return 1\n    }\n\n    function wa(a, b) {\n      return 0 > a ? 0 : a > b ? b : a\n    }\n\n    function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n      var y, G = C - 1 >> 1,\n        F = e[g + 0] | k[h + 0] << 16,\n        B = f[l + 0] | m[t + 0] << 16;\n      if (a) {\n        var D = 3 * F + B + 131074 >> 2;\n        w(a[b + 0], D & 255, D >> 16, q, r)\n      }\n      c && (D =\n        3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n      for (y = 1; y <= G; ++y) {\n        var J = e[g + y] | k[h + y] << 16,\n          L = f[l + y] | m[t + y] << 16,\n          D = F + J + B + L + 524296,\n          O = D + 2 * (J + B) >> 3,\n          H = D + 2 * (F + L) >> 3;\n        a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n        c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n        F = J;\n        B = L\n      }\n      C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)))\n    }\n\n    function pg(a,\n      b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n      ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3)\n    }\n\n    function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n      ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3)\n    }\n\n    function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n      ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4)\n    }\n\n    function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n      ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4)\n    }\n\n    function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n      ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4)\n    }\n\n    function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n      ab(a, b, c, d, e, g, k, h,\n        f, l, m, t, q, r, u, v, w, ne, 2)\n    }\n\n    function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n      ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2)\n    }\n\n    function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n      var v;\n      for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n      v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t))\n    }\n\n    function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n      Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4)\n    }\n\n    function Te(a, b, c, d, e, g, k, f, n, l,\n      m, t, q) {\n      Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4)\n    }\n\n    function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n      Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4)\n    }\n\n    function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n      Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2)\n    }\n\n    function sg(a, b, c, d, e, g) {\n      for (; 0 < e--;) {\n        for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n          var t = n[l + 4 * m];\n          if (255 != t) {\n            var t = 32897 * t,\n              q = k,\n              r = f + 4 * m + 0;\n            k[f + 4 * m + 0] * t >>> 23;\n            q[r] = ca;\n            q = k;\n            r = f + 4 * m + 1;\n            k[f + 4 * m + 1] * t >>> 23;\n            q[r] = ca;\n            q = k;\n            r = f + 4 * m + 2;\n            k[f + 4 * m + 2] * t >>> 23;\n            q[r] = ca\n          }\n        }\n        b += g\n      }\n    }\n\n    function tg(a, b) {\n      var c = b.j.c.Va,\n        d = c.y,\n        e = c.D + a.w * c.F,\n        g = c.c,\n        k = c.B + (a.w >> 1) * c.nb,\n        f = c.S,\n        n = c.C + (a.w >> 1) * c.rb,\n        l = a.m,\n        m = a.h,\n        t = parseInt((l + 1) / 2, 10),\n        q = parseInt((m + 1) / 2, 10),\n        r;\n      for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n      for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n      return a.h\n    }\n\n    function ug(a, b) {\n      var c = b.j,\n        d = c.c.RGBA,\n        e = d.ma,\n        g = d.Sa + a.w * d.f,\n        k = a.y,\n        f = a.D,\n        n = a.c,\n        l = a.B,\n        m = a.S,\n        t = a.C,\n        c = vg[c.J],\n        q = a.m,\n        r = a.h - 1,\n        u;\n      for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n      u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n      return a.h\n    }\n\n    function wg(a, b) {\n      var c = a.h,\n        d = b.j.c.RGBA,\n        e = d.ma,\n        g = d.Sa + a.w * d.f,\n        k = V[b.j.J],\n        f = a.y,\n        n = a.D,\n        l = a.c,\n        m = a.B,\n        t = a.S,\n        q = a.C,\n        r = b.Qb,\n        u = b.Rb,\n        v = b.lc,\n        w = b.mc,\n        A = a.w,\n        z = a.w + a.h,\n        y = a.m,\n        D = parseInt((y + 1) / 2, 10);\n      0 == A ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n      for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n      n += a.F;\n      a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n        t, q, e, g + d.f, p, p, y);\n      return c\n    }\n\n    function xg(a, b) {\n      var c = a.p,\n        d = a.q,\n        e = b.j.c.Va,\n        g = a.m,\n        f = a.h,\n        h = e.p,\n        n = e.q + a.w * e.Fa,\n        c = a.p,\n        d = a.q,\n        l = s;\n      if (c != p)\n        for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n      else if (e.p != p)\n        for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n      return 0\n    }\n\n    function We(a, b, c) {\n      var d = a.w;\n      c[0] = a.h;\n      a.Bb && (0 == d ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n      return d\n    }\n\n    function yg(a, b) {\n      var c = a.p,\n        d = [a.q];\n      if (c != p) {\n        for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n            t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n          for (r = 0; r < e; ++r) {\n            var v = c[d + r];\n            m[t + 4 * r] = v;\n            q &= v\n          }\n          d += a.width;\n          t += h.f\n        }\n        255 != q && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f)\n      }\n      return 0\n    }\n\n    function zg(a, b) {\n      var c = a.p,\n        d = [a.q];\n      if (c != p) {\n        var e = a.m,\n          g = b.j.J,\n          f = b.j.c.RGBA,\n          h = [s],\n          n = We(a, d, h),\n          d = d[0],\n          l = f.ma,\n          n = f.Sa + n * f.f,\n          m = n + 1,\n          t = 15,\n          q = s;\n        for (j = 0; j < h[0]; ++j) {\n          for (q = 0; q < e; ++q) {\n            var r = c[d + q] >> 4;\n            l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n            t &= r\n          }\n          d += a.width;\n          m += f.f\n        }\n        15 != t && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f)\n      }\n      return 0\n    }\n\n    function vd(a) {\n      var b = a.ka,\n        c = b.j.J,\n        d = c <\n        ua,\n        e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n      b.memory = p;\n      b.$a = p;\n      b.zb = p;\n      b.ad = p;\n      if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n      if (a.I) {\n        if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert(\"memory error #1\"), 0\n      } else {\n        if (d) {\n          if (b.$a = ug, a.Bb) {\n            var g = a.m + 1 >> 1,\n              f = a.m + 2 * g,\n              h, n = [];\n            for (h = 0; h < f; ++h) n.push(205);\n            n.push(0);\n            b.memory = n;\n            if (b.memory == p) return alert(\"memory error #2\"), 0;\n            b.Sb = b.memory;\n            b.Tb = 0;\n            b.Qb = b.Sb;\n            b.Rb = b.Tb + a.m;\n            b.lc = b.Qb;\n            b.mc = b.Rb + g;\n            b.$a = wg;\n            V[Qa] = pg;\n            V[jb] = Oe;\n            V[Zc] = qg;\n            V[Pa] = Pe;\n            V[Ab] = Qe;\n            V[kb] = Re;\n            V[Fe] = rg\n          }\n        } else b.$a =\n          tg;\n        e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg)\n      }\n      if (d && !Xe) {\n        for (a = 0; 256 > a; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n        for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n        Xe = 1\n      }\n      return 1\n    }\n\n    function ud(a) {\n      var b = a.ka,\n        c = a.m,\n        d = a.h;\n      $(!(a.w & 1));\n      if (0 >= c || 0 >= d) return 0;\n      c = b.$a(a, b);\n      b.ec += c;\n      b.zb && b.zb(a, b);\n      return 1\n    }\n\n    function wd(a) {\n      a = a.ka;\n      a.memory = \"\";\n      a.memory = p\n    }\n\n    function ed(a,\n      b) {\n      return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16\n    }\n\n    function Kb(a, b) {\n      return (ed(a, b) | a[b + 3] << 24) >>> 0\n    }\n\n    function Ye(a, b, c, d, e, g, f) {\n      var h = 0,\n        n = [0],\n        l = \"VP8StatusCode\",\n        m = M(Gc);\n      if (a == p || c[0] < Lb) return Z;\n      m.data = a;\n      m.b = [b[0]];\n      m.e = [c[0]];\n      m.na = [m.na];\n      a: {\n        h = m.na;\n        $(a != p);\n        $(c != p);\n        $(h != p);\n        h[0] = 0;\n        if (c[0] >= Lb && !kd(a, b[0], \"RIFF\", O)) {\n          if (kd(a, b[0] + 8, \"WEBP\", O)) {\n            l = W;\n            break a\n          }\n          var t = Kb(a, b[0] + O);\n          if (t < O + R) {\n            l = W;\n            break a\n          }\n          h[0] = t;\n          b[0] += Lb;\n          c[0] -= Lb\n        } else h[0] = 0;\n        l = L\n      }\n      m.na = m.na[0];\n      if (l != L) return l;\n      h = 0 < m.na;\n      t = [0];\n      a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] =\n          0, c[0] < R) l = Z;\n        else {\n          if (!kd(a, b[0], \"VP8X\", O)) {\n            var q = s,\n              r = s,\n              u = E;\n            if (Kb(a, b[0] + O) != fd) {\n              l = W;\n              break a\n            }\n            if (c[0] < l) {\n              l = Z;\n              break a\n            }\n            u = Kb(a, b[0] + 8);\n            q = 1 + ed(a, b[0] + 12);\n            r = 1 + ed(a, b[0] + 15);\n            if (q * r >= Ag) {\n              l = W;\n              break a\n            }\n            t != p && (t[0] = u);\n            d != p && (d[0] = q);\n            e != p && (e[0] = r);\n            b[0] += l;\n            c[0] -= l;\n            n[0] = 1\n          }\n          l = L\n        }\n      if (l != L) return l;\n      if (!h && n[0]) return W;\n      g != p && (g[0] = !!(t[0] & Bg));\n      if (n && f == p) return L;\n      if (c < O) return Z;\n      if (h && n[0] || !h && !n[0] && !kd(a, b[0], \"ALPH\", O)) {\n        m.$ = [m.$];\n        m.G = [m.G];\n        m.pa = [m.pa];\n        a: {\n          var n = m.na,\n            h = m.$,\n            t = m.G,\n            l = m.pa,\n            q = x,\n            r = 0,\n            u = Mb,\n            v = O + R + fd;\n          $(a != p);\n          $(c != p);\n          q = a;\n          r = b[0];\n          u = c[0];\n          $(h != p);\n          $(l != p);\n          h[0] = p;\n          t[0] = p;\n          for (l[0] = 0;;) {\n            var w = E,\n              y = E;\n            b[0] = r;\n            c[0] = u;\n            if (u < R) {\n              l = Z;\n              break a\n            }\n            w = Kb(q, r + O);\n            y = R + w + 1 & -2;\n            v += y;\n            if (0 < n && v > n) {\n              l = W;\n              break a\n            }\n            if (u < y) {\n              l = Z;\n              break a\n            }\n            if (kd(q, r, \"ALPH\", O)) {\n              if (!kd(q, r, \"VP8 \", O) || !kd(q, \"VP8L\", O)) {\n                l = L;\n                break a\n              }\n            } else h[0] = q, t[0] = r + R, l[0] = w;\n            r += y;\n            u -= y\n          }\n          l = ca\n        }\n        m.$ = m.$[0];\n        m.G = m.G[0];\n        m.pa = m.pa[0];\n        if (l != L) return l\n      }\n      m.ta = [m.ta];\n      m.ia = [m.ia];\n      a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], \"VP8 \", O), l = !kd(a, b[0], \"VP8L\", O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n        else {\n          if (r || l) {\n            r = Kb(a, b[0] + O);\n            if (n >= q && r > n - q) {\n              l = W;\n              break a\n            }\n            h[0] = r;\n            b[0] += R;\n            c[0] -= R;\n            t[0] = l\n          } else t[0] = 1 <= c && a[b + 0] == ve, h[0] = c[0];\n          l = L\n        }\n      m.ta = m.ta[0];\n      m.ia = m.ia[0];\n      if (l != L) return l;\n      if (m.ta > Ze) return W;\n      if (m.ia) {\n        if (c[0] < $e) return Z;\n        n = b[0];\n        h = c[0];\n        d = d ? d[0] : p;\n        e = e ? e[0] : p;\n        t = g ? g[0] : p;\n        a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0)\n      } else {\n        if (c < bf) return Z;\n        n = b[0];\n        h = c[0];\n        d = d ? d[0] : p;\n        e = e ? e[0] : p;\n        !(a == p || h < bf) && 3 <= h - 3 && 157 == a[n + 3 + 0] && 1 == a[n +\n          3 + 1] && 42 == a[n + 3 + 2] ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || 3 < (h >> 1 & 7) || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0\n      }\n      if (!a) return W;\n      g != p && (g[0] |= m.$ != p);\n      f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n      return L\n    }\n\n    function Kd(a) {\n      $(a != p);\n      return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a)\n    }\n\n    function cf(a, b, c, d) {\n      var e = \"VP8StatusCode\",\n        g = M(Vb),\n        f = M(Gc);\n      f.data = a;\n      f.b = b;\n      f.e = c;\n      f.b = [f.b];\n      f.e = [f.e];\n      f = [f];\n      e = Kd(f);\n      if (e !=\n        L) return e;\n      f = f[0];\n      f.b = f.b[0];\n      f.e = f.e[0];\n      $(d != p);\n      td(na);\n      g.data = f.data;\n      g.b = b + f.offset;\n      g.e = f.e - f.offset;\n      g.put = ud;\n      g.Mb = vd;\n      g.Pb = wd;\n      g.ka = d;\n      if (f.ia) {\n        a = sd();\n        if (a == p) return cb;\n        ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n        a != p && sa(a)\n      } else {\n        e = M(Cg);\n        e != p && (Gd(e), e.za = 0, e.Hb = 1);\n        a = e;\n        if (a == p) return cb;\n        a.qb = 0;\n        a.Ga = f.$;\n        a.G = f.G;\n        a.ub = f.pa;\n        Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n        a != p && ke(a)\n      }\n      e != L && (self || this).Yc(d.j);\n      return e\n    }\n\n    function lb(a, b, c, d, e) {\n      var g = {\n        value: 0\n      };\n      c = {\n        value: c\n      };\n      var f = M(df),\n        h = M(gd);\n      f.j = h;\n      h.J = a;\n      var n = {\n          value: h.width\n        },\n        l = {\n          value: h.height\n        },\n        m;\n      m = c;\n      var t = M(ef);\n      hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n      if (!m) return p;\n      h.width = n.value;\n      h.height = l.value;\n      d != p && (d.value = h.width.value);\n      e != p && (e.value = h.height.value);\n      return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y\n    }\n\n    function hd(a, b, c, d) {\n      if (d == p || a == p) return ta;\n      $(d != p);\n      d.tc = 0;\n      d.width = [d.width];\n      d.height = [d.height];\n      d.$b = [d.$b];\n      return Ye(a, b, c, d.width, d.height, d.$b, p)\n    }\n\n    function Ne(a,\n      b, c) {\n      var d = b.width,\n        e = b.height,\n        g = 0,\n        f = 0,\n        h = d,\n        n = e;\n      b.Ua = a != p && 0 < a.Ua;\n      if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), 0 > g || 0 > f || 0 >= h || 0 >= n || g + h > d || f + n > e)) return 0;\n      b.t = g;\n      b.k = f;\n      b.Ka = g + h;\n      b.K = f + n;\n      b.m = h;\n      b.h = n;\n      b.I = a != p && 0 < a.I;\n      if (b.I) {\n        if (0 >= a.Ba || 0 >= a.Aa) return 0;\n        b.Ba = a.Ba;\n        b.Aa = a.Aa\n      }\n      b.Za = a && a.Za;\n      b.Bb = a == p || !a.ed;\n      b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n      return 1\n    }\n    var na = 512,\n      Qa = 0,\n      jb = 1,\n      Zc = 2,\n      Pa = 3,\n      Ab = 4,\n      kb = 5,\n      Fe = 6,\n      Ob = 7,\n      Pb = 8,\n      Bb = 9,\n      Qb = 10,\n      ua = 11,\n      Ra = 12,\n      Cc = 13;\n    this.WEBP_CSP_MODE = this.Cd = {\n      nd: 0,\n      od: 1,\n      kd: 2,\n      ld: 3,\n      jd: 4,\n      pd: 5,\n      qd: 6,\n      rd: 7,\n      sd: 8,\n      md: 9\n    };\n    var gd = {\n        J: \"WEBP_CSP_MODE\",\n        width: s,\n        height: s,\n        Fc: s,\n        c: {\n          RGBA: {\n            ma: x,\n            Sa: 0,\n            f: s,\n            size: Mb\n          },\n          Va: {\n            y: x,\n            c: x,\n            S: x,\n            p: x,\n            D: x,\n            B: x,\n            C: x,\n            q: x,\n            F: s,\n            nb: s,\n            rb: s,\n            Fa: s,\n            Wc: Mb,\n            Rc: Mb,\n            Uc: Mb,\n            Wb: Mb\n          }\n        },\n        Ic: U(4, E),\n        Jb: p,\n        jc: x\n      },\n      L = 0,\n      cb = 1,\n      ta = 2,\n      W = 3,\n      Hf = 4,\n      Ie = 5,\n      Nf = 6,\n      Z = 7;\n    this.VP8StatusCode = this.td = {\n      xd: 0,\n      yd: 1,\n      vd: 2,\n      ud: 3,\n      Ad: 4,\n      zd: 5,\n      Bd: 6,\n      wd: 7\n    };\n    var ef = {\n      width: {\n        value: s\n      },\n      height: {\n        value: s\n      },\n      $b: {\n        value: s\n      },\n      tc: s,\n      Yd: s,\n      rotate: s,\n      be: s,\n      Ic: U(3, E)\n    };\n    this.WebPGetFeatures = this.Md = function(a, b, c) {\n      var d = \"VP8StatusCode\";\n      na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n      return a\n    };\n    var ff = {\n      Za: s,\n      ed: s,\n      Ua: s,\n      t: s,\n      k: s,\n      wc: s,\n      vc: s,\n      I: s,\n      Ba: s,\n      Aa: s,\n      ae: s,\n      Td: s,\n      Xd: s,\n      Ic: U(6, E)\n    };\n    this.WebPDecoderConfig = this.Kd = {\n      input: M(ef),\n      j: M(gd),\n      options: M(ff)\n    };\n    this.WebPInitDecoderConfig = this.Nd = function(a) {\n      na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n      return a\n    };\n    var Vb = {\n        width: s,\n        height: s,\n        w: s,\n        m: s,\n        h: s,\n        y: x,\n        c: x,\n        S: x,\n        D: 0,\n        B: 0,\n        C: 0,\n        F: s,\n        Da: s,\n        ka: 0,\n        put: 0,\n        Mb: 0,\n        Pb: 0,\n        Bb: s,\n        e: Mb,\n        data: x,\n        b: 0,\n        Za: s,\n        Ua: s,\n        t: s,\n        Ka: s,\n        k: s,\n        K: s,\n        I: s,\n        Ba: s,\n        Aa: s,\n        p: x,\n        q: 0\n      },\n      df = {\n        j: M(gd),\n        Sb: x,\n        Qb: x,\n        lc: x,\n        Tb: 0,\n        Rb: 0,\n        mc: 0,\n        ec: s,\n        Qa: M(ff),\n        memory: 0,\n        $a: \"(OutputFunc)\",\n        zb: \"(OutputFunc)\",\n        ad: \"(OutputRowFunc)\"\n      },\n      Gc = {\n        data: x,\n        b: x,\n        e: Mb,\n        offset: Mb,\n        $: p,\n        G: x,\n        pa: Mb,\n        ta: Mb,\n        na: Mb,\n        ia: s\n      },\n      Fc = {\n        qa: x,\n        Ia: p,\n        Pd: x,\n        Ab: s,\n        la: E,\n        Z: E,\n        gc: s\n      },\n      af = {\n        T: bb,\n        qa: x,\n        Ia: x,\n        ya: Mb,\n        Q: Mb,\n        g: s,\n        L: s,\n        fa: s\n      },\n      gf = 25,\n      hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215],\n      bf = 10,\n      ve = 47,\n      we = 14,\n      Wf = 3,\n      $e = 5,\n      fg = 11,\n      Yc = 5,\n      qe = 4278190080,\n      jg = 8,\n      Tb = 15,\n      Ba = 256,\n      Ge = 24,\n      Je = 4,\n      Be = 0,\n      De = 1,\n      Ae = 2,\n      Ee = 3,\n      Ub = 1,\n      kc = 0,\n      kf = 1,\n      rd = 1,\n      O = 4,\n      R = 8,\n      Lb = 12,\n      fd = 10,\n      Bg = 16,\n      Ag = 1 * Math.pow(2, 32),\n      Ze = -1 - R - 1 >>> 0,\n      jf = {\n        kc: s,\n        s: s\n      },\n      Le = {\n        Y: \"HuffmanTreeNode*\",\n        gb: s,\n        Pa: s\n      },\n      pd = -1,\n      Dg = {\n        ea: E,\n        bb: s\n      },\n      ad = 506832829,\n      $b = 0,\n      ge = $b,\n      fe = 2,\n      ee = 3,\n      de = 1,\n      Ef = 4,\n      Df = 5,\n      Cf = 6,\n      Ld = 3,\n      xa = 4,\n      Hc = 4,\n      Gf = 4,\n      Md = 4,\n      Nd = 8,\n      Kc = 3,\n      Lc = 11,\n      f = 32,\n      Pf = 17 * f + 9 * f,\n      Tc = 1 * f + 8,\n      Uc = Tc + 16 * f + f,\n      he = Uc + 16,\n      Id = {\n        fb: x,\n        Jc: x,\n        Nc: x,\n        Ra: E\n      },\n      Jd = {\n        l: 0,\n        v: 0,\n        gd: x,\n        hd: x,\n        uc: x,\n        $c: x\n      },\n      Eg = {\n        pb: s,\n        ob: s,\n        tb: s,\n        Kb: U(xa, 0),\n        Cb: U(xa, 0)\n      },\n      Fg = {\n        Ta: U(Ld, x),\n        z: md([Md, Nd, Kc, Lc], x)\n      },\n      Gg = {\n        Oc: s,\n        Fb: s,\n        kb: s,\n        oc: s,\n        Lc: U(Hc, s),\n        Gc: U(Hc, s)\n      },\n      Oc = {\n        zc: s,\n        yc: s,\n        ab: s\n      },\n      Qd = {\n        X: s,\n        ua: s,\n        Nb: s\n      },\n      id = U(2, s),\n      Hg = {\n        sc: M(id),\n        sb: M(id),\n        qc: M(id)\n      },\n      Ig = {\n        ha: s,\n        d: s,\n        W: s,\n        M: Oc,\n        N: Vb\n      },\n      Cg = {\n        a: \"VP8StatusCode\",\n        za: s,\n        xc: 0,\n        o: M(Fc),\n        Ac: M(Id),\n        P: M(Jd),\n        ga: M(Gg),\n        Ca: M(Eg),\n        rc: \"WebPWorker\",\n        qb: s,\n        Ja: s,\n        jb: s,\n        oa: Ig,\n        Ma: s,\n        hb: s,\n        lb: s,\n        mb: s,\n        wb: s,\n        Ya: s,\n        Hb: s,\n        ic: ld(8, Fc),\n        Zc: E,\n        yb: ld(xa, Hg),\n        R: M(Fg),\n        pc: s,\n        Pc: x,\n        dc: x,\n        cc: U(4, x),\n        Xc: x,\n        Sc: x,\n        Vc: x,\n        La: M(Qd),\n        M: M(Oc),\n        Ea: x,\n        z: 0,\n        ca: x,\n        aa: x,\n        ra: x,\n        da: s,\n        ba: s,\n        sa: s,\n        H: s,\n        r: s,\n        ib: 0,\n        Gb: Mb,\n        i: s,\n        d: s,\n        wa: x,\n        Eb: U(16, x),\n        Vd: 0,\n        Tc: x,\n        Lb: x,\n        ja: E,\n        Oa: E,\n        A: s,\n        W: s,\n        Zb: U(xa, x),\n        Ga: p,\n        G: 0,\n        ub: Mb,\n        Xb: x,\n        Od: 0,\n        cd: s,\n        dd: x,\n        Wd: 0,\n        fc: Mb\n      },\n      Db = 0,\n      Cb = 1,\n      cd = 2,\n      Jg = {\n        Qc: \"VP8LImageTransformType\",\n        n: s,\n        U: s,\n        Vb: s,\n        u: E,\n        b: E\n      },\n      gg = {\n        va: ld(Yc, Le)\n      },\n      Kg = {\n        xb: s,\n        Yb: M(Dg),\n        Dc: s,\n        eb: s,\n        Ec: s,\n        ac: E,\n        bd: E,\n        hc: s,\n        Db: \"HTreeGroup\"\n      },\n      eg = {\n        a: \"VP8StatusCode\",\n        Wa: \"VP8LDecodeState\",\n        Ob: \"VP8LDecodeState\",\n        N: \"VP8Io\",\n        Ib: \"WebPDecBuffer\",\n        Hc: \"WebPDecBuffer\",\n        V: E,\n        Ha: E,\n        Xa: E,\n        vb: E,\n        o: M(af),\n        l: s,\n        v: s,\n        O: s,\n        xa: s,\n        cb: M(Kg),\n        Na: s,\n        nc: ld(Je, Jg),\n        Ub: E,\n        Mc: x,\n        $d: x,\n        Zd: \"*WebPRescaler\"\n      },\n      lf = 4,\n      nf = [p, function(a, b, c, d, e, g, f, h) {\n        var n = s,\n          l = h;\n        $(a != p);\n        $(f != p);\n        $(0 < c);\n        $(0 < d);\n        $(0 < e);\n        $(g >= c * e);\n        for (n = 0; n < d; ++n) 0 == n ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n          l += g, b += g, h += g\n      }, function(a, b, c, d, e, f, k, h) {\n        var n = s,\n          l = h;\n        $(a != p);\n        $(k != p);\n        $(0 < c);\n        $(0 < d);\n        $(0 < e);\n        $(f >= c * e);\n        N(k, h, a, b, e);\n        Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n        for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f\n      }, function(a, b, c, d, e, f, k, h) {\n        var n = h,\n          l = s;\n        $(a != p);\n        $(k != p);\n        $(0 < c);\n        $(0 < d);\n        $(0 < e);\n        $(f >= c * e);\n        N(k, h, a, b, e);\n        Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n        for (l = 1; l < d; ++l) {\n          var m = s,\n            n = n + f;\n          b += f;\n          h += f;\n          Ea(a, b, k, n - f, k, h, e);\n          for (m = e; m < c * e; ++m) {\n            var t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n            k[h + m] = a[b + m] + (0 > t ? 0 : 255 < t ? 255 : t) & 255\n          }\n        }\n      }],\n      yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n        2, 1, 1\n      ];\n    this.WebPFreeDecBuffer = this.Yc = function(a) {\n      a != p && (a.Fc || (a.Jb = \"\"), a.jc = 0, a.Jb = a.jc = p)\n    };\n    self = this;\n    var va = U(511, x),\n      tc = U(511, x),\n      sc = U(2041, 0),\n      oc = U(225, 0),\n      oa = U(766, x),\n      Rd = 0,\n      Xb = 85627,\n      Wb = 35468,\n      Uf = [function(a, b) {\n          var c = 4,\n            d;\n          for (d = 0; 4 > d; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n          c >>= 3;\n          for (d = 0; 4 > d; ++d) jd(a, b + d * f, c, 4)\n        }, function(a, b) {\n          Dc(a, b, 4)\n        }, function(a, b) {\n          var c = b - f,\n            d = [];\n          d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n          d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n          d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n          d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n          for (c = 0; 4 > c; ++c) N(a, b + c * f, d, 0, 4)\n        },\n        function(a, b) {\n          var c = a[b - 1],\n            d = a[b - 1 + f],\n            e = a[b - 1 + 2 * f],\n            g = a[b - 1 + 3 * f];\n          a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n          a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n          a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n          a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g)\n        },\n        function(a, b) {\n          var c = a[b - 1 + 0 * f],\n            d = a[b - 1 + 1 * f],\n            e = a[b - 1 + 2 * f],\n            g = a[b - 1 - f],\n            k = a[b + 0 - f],\n            h = a[b + 1 - f],\n            n = a[b + 2 - f],\n            l = a[b + 3 - f];\n          a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n          a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n          a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n          a[b +\n            0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n          a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n          a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n          a[b + 3 + 0 * f] = y(l, n, h)\n        },\n        function(a, b) {\n          var c = a[b - 1 + 0 * f],\n            d = a[b - 1 + 1 * f],\n            e = a[b - 1 + 2 * f],\n            g = a[b - 1 - f],\n            k = a[b + 0 - f],\n            h = a[b + 1 - f],\n            n = a[b + 2 - f],\n            l = a[b + 3 - f];\n          a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n          a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n          a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n          a[b + 3 + 0 * f] = n + l + 1 >> 1;\n          a[b + 0 + 3 * f] = y(e, d, c);\n          a[b + 0 + 2 * f] = y(d, c, g);\n          a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n          a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n          a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n          a[b + 3 + 1 * f] = y(h, n, l)\n        },\n        function(a, b) {\n          var c = a[b + 1 - f],\n            d = a[b + 2 - f],\n            e = a[b + 3 - f],\n            g = a[b + 4 - f],\n            k = a[b + 5 - f],\n            h = a[b + 6 - f],\n            n = a[b + 7 - f];\n          a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n          a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n          a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n          a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n          a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n          a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n          a[b + 3 + 3 * f] = y(h, n, n)\n        },\n        function(a, b) {\n          var c = a[b + 0 - f],\n            d = a[b + 1 - f],\n            e = a[b + 2 - f],\n            g = a[b + 3 - f],\n            k = a[b + 4 - f],\n            h = a[b + 5 - f],\n            n = a[b + 6 - f],\n            l = a[b + 7 - f];\n          a[b + 0 + 0 * f] = c + d + 1 >> 1;\n          a[b + 1 + 0 * f] = a[b +\n            0 + 2 * f] = d + e + 1 >> 1;\n          a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n          a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n          a[b + 0 + 1 * f] = y(c, d, e);\n          a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n          a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n          a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n          a[b + 3 + 2 * f] = y(k, h, n);\n          a[b + 3 + 3 * f] = y(h, n, l)\n        },\n        function(a, b) {\n          var c = a[b - 1 + 0 * f],\n            d = a[b - 1 + 1 * f],\n            e = a[b - 1 + 2 * f],\n            g = a[b - 1 + 3 * f],\n            k = a[b - 1 - f],\n            h = a[b + 0 - f],\n            n = a[b + 1 - f],\n            l = a[b + 2 - f];\n          a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n          a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n          a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n          a[b + 0 + 3 * f] = g + e + 1 >> 1;\n          a[b + 3 + 0 * f] = y(h, n, l);\n          a[b + 2 + 0 * f] = y(k, h, n);\n          a[b +\n            1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n          a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n          a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n          a[b + 1 + 3 * f] = y(g, e, d)\n        },\n        function(a, b) {\n          var c = a[b - 1 + 0 * f],\n            d = a[b - 1 + 1 * f],\n            e = a[b - 1 + 2 * f],\n            g = a[b - 1 + 3 * f];\n          a[b + 0 + 0 * f] = c + d + 1 >> 1;\n          a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n          a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n          a[b + 1 + 0 * f] = y(c, d, e);\n          a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n          a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n          a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g\n        }\n      ],\n      Vf = [function(a, b) {\n        var c = 16,\n          d;\n        for (d = 0; 16 > d; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n        Yb(c >> 5, a, b)\n      }, function(a,\n        b) {\n        Dc(a, b, 16)\n      }, function(a, b) {\n        var c;\n        for (c = 0; 16 > c; ++c) N(a, b + c * f, a, b - f, 16)\n      }, function(a, b) {\n        var c;\n        for (c = 16; 0 < c; --c) jd(a, b + 0, a[b - 1], 16), b += f\n      }, function(a, b) {\n        var c = 8,\n          d;\n        for (d = 0; 16 > d; ++d) c += a[b - 1 + d * f];\n        Yb(c >> 4, a, b)\n      }, function(a, b) {\n        var c = 8,\n          d;\n        for (d = 0; 16 > d; ++d) c += a[b + d - f];\n        Yb(c >> 4, a, b)\n      }, function(a, b) {\n        Yb(128, a, b)\n      }],\n      je = [function(a, b) {\n        var c = 8,\n          d;\n        for (d = 0; 8 > d; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n        Zb(1 * (c >> 4), a, b)\n      }, function(a, b) {\n        Dc(a, b, 8)\n      }, function(a, b) {\n        var c;\n        for (c = 0; 8 > c; ++c) N(a, b + c * f, a, b - f, 8)\n      }, function(a, b) {\n        var c;\n        for (c = 0; 8 > c; ++c) jd(a,\n          b + 0, a[b - 1], 8), b += f\n      }, function(a, b) {\n        var c = 4,\n          d;\n        for (d = 0; 8 > d; ++d) c += a[b - 1 + d * f];\n        Zb(1 * (c >> 3), a, b)\n      }, function(a, b) {\n        var c = 4,\n          d;\n        for (d = 0; 8 > d; ++d) c += a[b + d - f];\n        Zb(1 * (c >> 3), a, b)\n      }, function(a, b) {\n        Zb(128, a, b)\n      }],\n      mc, Pc, Qc, Rc, Sd, Td, Ud, Vd, Wd, Xd, Yd, Zd, $d, ae, be, ce, Pd = 31,\n      uc = [0, 2, 8],\n      Od = 3,\n      Of = 1,\n      ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f],\n      Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n        39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157\n      ],\n      Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n        98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284\n      ],\n      Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9],\n      Ff = [\n        [\n          [\n            [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n            [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n            [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]\n          ],\n          [\n            [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n            [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n              128\n            ],\n            [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128]\n          ],\n          [\n            [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n            [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n            [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128]\n          ],\n          [\n            [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n            [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n            [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128]\n          ],\n          [\n            [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n            [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n            [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128]\n          ],\n          [\n            [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n              128\n            ],\n            [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n            [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128]\n          ],\n          [\n            [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n            [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n            [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128]\n          ],\n          [\n            [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n            [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n            [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]\n          ]\n        ],\n        [\n          [\n            [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n            [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n            [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128]\n          ],\n          [\n            [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n            [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n            [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128]\n          ],\n          [\n            [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n            [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n            [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128]\n          ],\n          [\n            [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n            [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n            [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128]\n          ],\n          [\n            [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n            [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n            [22,\n              100, 174, 245, 186, 161, 255, 199, 128, 128, 128\n            ]\n          ],\n          [\n            [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n            [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n            [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128]\n          ],\n          [\n            [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n            [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n            [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128]\n          ],\n          [\n            [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n            [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n            [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128]\n          ]\n        ],\n        [\n          [\n            [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n            [175, 13,\n              224, 243, 193, 185, 249, 198, 255, 255, 128\n            ],\n            [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128]\n          ],\n          [\n            [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n            [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n            [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128]\n          ],\n          [\n            [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n            [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n            [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128]\n          ],\n          [\n            [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n            [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n            [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128]\n          ],\n          [\n            [1, 16, 248, 255,\n              255, 128, 128, 128, 128, 128, 128\n            ],\n            [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n            [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128]\n          ],\n          [\n            [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n            [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n            [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128]\n          ],\n          [\n            [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n            [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n            [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128]\n          ],\n          [\n            [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n            [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n            [128, 128, 128, 128,\n              128, 128, 128, 128, 128, 128, 128\n            ]\n          ]\n        ],\n        [\n          [\n            [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n            [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n            [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128]\n          ],\n          [\n            [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n            [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n            [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128]\n          ],\n          [\n            [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n            [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n            [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128]\n          ],\n          [\n            [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n            [149, 150, 226, 252, 216,\n              205, 255, 171, 128, 128, 128\n            ],\n            [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128]\n          ],\n          [\n            [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n            [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n            [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128]\n          ],\n          [\n            [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n            [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n            [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128]\n          ],\n          [\n            [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n            [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n            [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128]\n          ],\n          [\n            [1, 1, 255, 128, 128, 128, 128,\n              128, 128, 128, 128\n            ],\n            [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n            [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128]\n          ]\n        ]\n      ],\n      Rf = [\n        [\n          [231, 120, 48, 89, 115, 113, 120, 152, 112],\n          [152, 179, 64, 126, 170, 118, 46, 70, 95],\n          [175, 69, 143, 80, 85, 82, 72, 155, 103],\n          [56, 58, 10, 171, 218, 189, 17, 13, 152],\n          [114, 26, 17, 163, 44, 195, 21, 10, 173],\n          [121, 24, 80, 195, 26, 62, 44, 64, 85],\n          [144, 71, 10, 38, 171, 213, 144, 34, 26],\n          [170, 46, 55, 19, 136, 160, 33, 206, 71],\n          [63, 20, 8, 114, 114, 208, 12, 9, 226],\n          [81, 40, 11, 96, 182, 84, 29, 16, 36]\n        ],\n        [\n          [134, 183, 89, 137, 98, 101, 106, 165, 148],\n          [72, 187, 100, 130, 157, 111,\n            32, 75, 80\n          ],\n          [66, 102, 167, 99, 74, 62, 40, 234, 128],\n          [41, 53, 9, 178, 241, 141, 26, 8, 107],\n          [74, 43, 26, 146, 73, 166, 49, 23, 157],\n          [65, 38, 105, 160, 51, 52, 31, 115, 128],\n          [104, 79, 12, 27, 217, 255, 87, 17, 7],\n          [87, 68, 71, 44, 114, 51, 15, 186, 23],\n          [47, 41, 14, 110, 182, 183, 21, 17, 194],\n          [66, 45, 25, 102, 197, 189, 23, 18, 22]\n        ],\n        [\n          [88, 88, 147, 150, 42, 46, 45, 196, 205],\n          [43, 97, 183, 117, 85, 38, 35, 179, 61],\n          [39, 53, 200, 87, 26, 21, 43, 232, 171],\n          [56, 34, 51, 104, 114, 102, 29, 93, 77],\n          [39, 28, 85, 171, 58, 165, 90, 98, 64],\n          [34, 22, 116, 206, 23, 34, 43, 166, 73],\n          [107, 54, 32, 26, 51, 1, 81, 43, 31],\n          [68, 25, 106, 22,\n            64, 171, 36, 225, 114\n          ],\n          [34, 19, 21, 102, 132, 188, 16, 76, 124],\n          [62, 18, 78, 95, 85, 57, 50, 48, 51]\n        ],\n        [\n          [193, 101, 35, 159, 215, 111, 89, 46, 111],\n          [60, 148, 31, 172, 219, 228, 21, 18, 111],\n          [112, 113, 77, 85, 179, 255, 38, 120, 114],\n          [40, 42, 1, 196, 245, 209, 10, 25, 109],\n          [88, 43, 29, 140, 166, 213, 37, 43, 154],\n          [61, 63, 30, 155, 67, 45, 68, 1, 209],\n          [100, 80, 8, 43, 154, 1, 51, 26, 71],\n          [142, 78, 78, 16, 255, 128, 34, 197, 171],\n          [41, 40, 5, 102, 211, 183, 4, 1, 221],\n          [51, 50, 17, 168, 209, 192, 23, 25, 82]\n        ],\n        [\n          [138, 31, 36, 171, 27, 166, 38, 44, 229],\n          [67, 87, 58, 169, 82, 115, 26, 59, 179],\n          [63, 59, 90, 180, 59, 166, 93, 73,\n            154\n          ],\n          [40, 40, 21, 116, 143, 209, 34, 39, 175],\n          [47, 15, 16, 183, 34, 223, 49, 45, 183],\n          [46, 17, 33, 183, 6, 98, 15, 32, 183],\n          [57, 46, 22, 24, 128, 1, 54, 17, 37],\n          [65, 32, 73, 115, 28, 128, 23, 128, 205],\n          [40, 3, 9, 115, 51, 192, 18, 6, 223],\n          [87, 37, 9, 115, 59, 77, 64, 21, 47]\n        ],\n        [\n          [104, 55, 44, 218, 9, 54, 53, 130, 226],\n          [64, 90, 70, 205, 40, 41, 23, 26, 57],\n          [54, 57, 112, 184, 5, 41, 38, 166, 213],\n          [30, 34, 26, 133, 152, 116, 10, 32, 134],\n          [39, 19, 53, 221, 26, 114, 32, 73, 255],\n          [31, 9, 65, 234, 2, 15, 1, 118, 73],\n          [75, 32, 12, 51, 192, 255, 160, 43, 51],\n          [88, 31, 35, 67, 102, 85, 55, 186, 85],\n          [56, 21, 23, 111, 59, 205, 45, 37, 192],\n          [55, 38, 70, 124, 73, 102, 1, 34, 98]\n        ],\n        [\n          [125, 98, 42, 88, 104, 85, 117, 175, 82],\n          [95, 84, 53, 89, 128, 100, 113, 101, 45],\n          [75, 79, 123, 47, 51, 128, 81, 171, 1],\n          [57, 17, 5, 71, 102, 57, 53, 41, 49],\n          [38, 33, 13, 121, 57, 73, 26, 1, 85],\n          [41, 10, 67, 138, 77, 110, 90, 47, 114],\n          [115, 21, 2, 10, 102, 255, 166, 23, 6],\n          [101, 29, 16, 10, 85, 128, 101, 196, 26],\n          [57, 18, 10, 102, 102, 213, 34, 20, 43],\n          [117, 20, 15, 36, 163, 128, 68, 1, 26]\n        ],\n        [\n          [102, 61, 71, 37, 34, 53, 31, 243, 192],\n          [69, 60, 71, 38, 73, 119, 28, 222, 37],\n          [68, 45, 128, 34, 1, 47, 11, 245, 171],\n          [62, 17, 19, 70, 146, 85, 55, 62, 70],\n          [37, 43, 37, 154, 100, 163, 85, 160,\n            1\n          ],\n          [63, 9, 92, 136, 28, 64, 32, 201, 85],\n          [75, 15, 9, 9, 64, 255, 184, 119, 16],\n          [86, 6, 28, 5, 64, 255, 25, 248, 1],\n          [56, 8, 17, 132, 137, 255, 55, 116, 128],\n          [58, 15, 20, 82, 135, 57, 26, 121, 40]\n        ],\n        [\n          [164, 50, 31, 137, 154, 133, 25, 35, 218],\n          [51, 103, 44, 131, 131, 123, 31, 6, 158],\n          [86, 40, 64, 135, 148, 224, 45, 183, 128],\n          [22, 26, 17, 131, 240, 154, 14, 1, 209],\n          [45, 16, 21, 91, 64, 222, 7, 1, 197],\n          [56, 21, 39, 155, 60, 138, 23, 102, 213],\n          [83, 12, 13, 54, 192, 255, 68, 47, 28],\n          [85, 26, 85, 85, 128, 128, 32, 146, 171],\n          [18, 11, 7, 63, 144, 171, 4, 4, 246],\n          [35, 27, 10, 146, 174, 171, 12, 26, 128]\n        ],\n        [\n          [190, 80, 35, 99, 180, 80,\n            126, 54, 45\n          ],\n          [85, 126, 47, 87, 176, 51, 41, 20, 32],\n          [101, 75, 128, 139, 118, 146, 116, 128, 85],\n          [56, 41, 15, 176, 236, 85, 37, 9, 62],\n          [71, 30, 17, 119, 118, 255, 17, 18, 138],\n          [101, 38, 60, 138, 55, 70, 43, 26, 142],\n          [146, 36, 19, 30, 171, 255, 97, 27, 20],\n          [138, 45, 61, 62, 219, 1, 81, 188, 64],\n          [32, 41, 20, 117, 151, 142, 20, 21, 163],\n          [112, 19, 12, 61, 195, 128, 48, 4, 24]\n        ]\n      ],\n      If = [\n        [\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [223, 241,\n              252, 255, 255, 255, 255, 255, 255, 255, 255\n            ],\n            [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n            [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n            [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n            [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ]\n        ],\n        [\n          [\n            [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [225, 252, 241, 253, 255, 255, 254, 255,\n              255, 255, 255\n            ],\n            [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255]\n          ],\n          [\n            [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 253, 254, 255, 255,\n              255, 255, 255, 255, 255, 255\n            ],\n            [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n            [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255,\n              255, 255, 255, 255, 255, 255, 255, 255\n            ]\n          ]\n        ],\n        [\n          [\n            [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n            [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n            [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255]\n          ],\n          [\n            [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255,\n              255, 255\n            ]\n          ],\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ]\n        ],\n        [\n          [\n            [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n            [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n            [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n            [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n            [248, 254, 253, 255, 255, 255,\n              255, 255, 255, 255, 255\n            ],\n            [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n            [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 255, 253,\n              255, 255, 255, 255, 255, 255, 255, 255\n            ],\n            [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ],\n          [\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n            [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]\n          ]\n        ]\n      ];\n    this.WebPGetDecoderVersion = this.Ld = function() {\n      return 512\n    };\n    var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0],\n      Jf = [\n        [173, 148, 140, 0],\n        [176, 155, 140, 135, 0],\n        [180, 157, 141, 134, 130, 0],\n        [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0]\n      ],\n      Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n        9, 12, 13, 10, 7, 11, 14, 15\n      ],\n      Tf = md([Kc, Lc], \"\");\n    U(4, x);\n    var vc = [\n        [0, 0, 0, 0],\n        [1, 0, 0, 0],\n        [0, 1, 0, 0],\n        [1, 1, 0, 0],\n        [0, 0, 1, 0],\n        [1, 0, 1, 0],\n        [0, 1, 1, 0],\n        [1, 1, 1, 0],\n        [0, 0, 0, 1],\n        [1, 0, 0, 1],\n        [0, 1, 0, 1],\n        [1, 1, 0, 1],\n        [0, 0, 1, 1],\n        [1, 0, 1, 1],\n        [0, 1, 1, 1],\n        [1, 1, 1, 1]\n      ],\n      Lf = 134480385,\n      ea = 16,\n      J = -227,\n      dd = 482,\n      Ce = [Wc, function(a) {\n        return a\n      }, function(a, b, c) {\n        return b[c + 0]\n      }, function(a, b, c) {\n        return b[c + 1]\n      }, function(a, b, c) {\n        return b[c - 1]\n      }, function(a, b, c) {\n        return ka(ka(a, b[c + 1]), b[c + 0])\n      }, function(a, b, c) {\n        return ka(a, b[c - 1])\n      }, function(a, b, c) {\n        return ka(a, b[c + 0])\n      }, function(a,\n        b, c) {\n        return ka(b[c - 1], b[c + 0])\n      }, function(a, b, c) {\n        return ka(b[c + 0], b[c + 1])\n      }, function(a, b, c) {\n        return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]))\n      }, function(a, b, c) {\n        return 0 >= Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) ? b[c + 0] : a\n      }, function(a, b, c) {\n        return ($a((a >>\n          24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0\n      }, function(a, b, c) {\n        var d = b[c - 1];\n        a = ka(a, b[c + 0]);\n        return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0\n      }, Wc, Wc],\n      Xf = {\n        Cc: x,\n        Bc: x,\n        Kc: x\n      },\n      $c = 16,\n      Me = 16,\n      kg = 16,\n      mg = [2, 3, 7],\n      lg = [3, 3, 11],\n      Zf = 0,\n      $f = 1,\n      ag = 2,\n      bg = 3,\n      cg = 4,\n      hg = [Ba + Ge, Ba, Ba, Ba, 40],\n      Ke = 19,\n      ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n        6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n      ],\n      He = 120,\n      dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112],\n      Jb = 1 << ea - 1,\n      Za = U(256, 0),\n      xb = U(256, 0),\n      vb = U(256, la),\n      wb = U(256, la),\n      ia = U(dd - J, x),\n      Hb = U(dd -\n        J, x),\n      Xe = 0,\n      V = Array(Cc),\n      vg = [function(a, b, c, d, e, f, k, h, n, l, m, t, q) {\n        Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3)\n      }, Se, function(a, b, c, d, e, f, k, h, n, l, m, t, q) {\n        Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3)\n      }, Te, Ue, Ve, function(a, b, c, d, e, f, k, h, n, l, m, t, q) {\n        Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2)\n      }, Se, Te, Ue, Ve];\n    this.Hd = function(a, b, c, d) {\n      return lb(Qa, a, b, c, d)\n    };\n    this.Id = function(a, b, c, d) {\n      return lb(jb, a, b, c, d)\n    };\n    this.Jd = function(a, b, c, d) {\n      return lb(kb, a, b, c, d)\n    };\n    this.Ed = function(a, b, c, d) {\n      return lb(Ab, a, b, c, d)\n    };\n    this.Fd = function(a, b, c, d) {\n      return lb(Zc,\n        a, b, c, d)\n    };\n    this.Gd = function(a, b, c, d) {\n      return lb(Pa, a, b, c, d)\n    };\n    this.WebPDecode = this.Dd = function(a, b, c) {\n      var d = M(df),\n        e = \"VP8StatusCode\";\n      if (c == p) return ta;\n      e = hd(a, [0], [b], c.input);\n      if (e != L) return e == Z ? W : e;\n      d.j = c.j;\n      d.Qa = c.Qa;\n      return e = cf(a, 0, [b], d)\n    }\n  };\n\n})();"
  },
  {
    "path": "app/vendor/ogv.js/COPYING",
    "content": "ogv.js & ogv.swf wrapper and player code\n\nCopyright (c) 2013-2014 Brion Vibber and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "app/vendor/ogv.js/COPYING-ogg.txt",
    "content": "Copyright (c) 2002, Xiph.org Foundation\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n- Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n- Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\n- Neither the name of the Xiph.org Foundation nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "app/vendor/ogv.js/COPYING-opus.txt",
    "content": "Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,\n                    Jean-Marc Valin, Timothy B. Terriberry,\n                    CSIRO, Gregory Maxwell, Mark Borgerding,\n                    Erik de Castro Lopo\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n- Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n- Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\n- Neither the name of Internet Society, IETF or IETF Trust, nor the\nnames of specific contributors, may be used to endorse or promote\nproducts derived from this software without specific prior written\npermission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nOpus is subject to the royalty-free patent licenses which are\nspecified at:\n\nXiph.Org Foundation:\nhttps://datatracker.ietf.org/ipr/1524/\n\nMicrosoft Corporation:\nhttps://datatracker.ietf.org/ipr/1914/\n\nBroadcom Corporation:\nhttps://datatracker.ietf.org/ipr/1526/\n"
  },
  {
    "path": "app/vendor/ogv.js/COPYING-theora.txt",
    "content": "Copyright (C) 2002-2009 Xiph.org Foundation\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n- Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n- Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\n- Neither the name of the Xiph.org Foundation nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "app/vendor/ogv.js/COPYING-vorbis.txt",
    "content": "Copyright (c) 2002-2008 Xiph.org Foundation\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n- Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n- Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\n- Neither the name of the Xiph.org Foundation nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "app/vendor/ogv.js/LICENSE-nestegg.txt",
    "content": "Copyright © 2010 Mozilla Foundation\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "app/vendor/ogv.js/LICENSE-vpx.txt",
    "content": "Copyright (c) 2010, The WebM Project authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n  * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n\n  * Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in\n    the documentation and/or other materials provided with the\n    distribution.\n\n  * Neither the name of Google, nor the WebM Project, nor the names\n    of its contributors may be used to endorse or promote products\n    derived from this software without specific prior written\n    permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "app/vendor/ogv.js/PATENTS-vpx.txt",
    "content": "Additional IP Rights Grant (Patents)\n------------------------------------\n\n\"These implementations\" means the copyrightable works that implement the WebM\ncodecs distributed by Google as part of the WebM Project.\n\nGoogle hereby grants to you a perpetual, worldwide, non-exclusive, no-charge,\nroyalty-free, irrevocable (except as stated in this section) patent license to\nmake, have made, use, offer to sell, sell, import, transfer, and otherwise\nrun, modify and propagate the contents of these implementations of WebM, where\nsuch license applies only to those patent claims, both currently owned by\nGoogle and acquired in the future, licensable by Google that are necessarily\ninfringed by these implementations of WebM. This grant does not include claims\nthat would be infringed only as a consequence of further modification of these\nimplementations. If you or your agent or exclusive licensee institute or order\nor agree to the institution of patent litigation or any other patent\nenforcement activity against any entity (including a cross-claim or\ncounterclaim in a lawsuit) alleging that any of these implementations of WebM\nor any code incorporated within any of these implementations of WebM\nconstitute direct or contributory patent infringement, or inducement of\npatent infringement, then any patent rights granted to you under this License\nfor these implementations of WebM shall terminate as of the date such\nlitigation is filed.\n"
  },
  {
    "path": "app/vendor/ogv.js/README.md",
    "content": "ogv.js\n======\n\nMedia decoder and player for Ogg Vorbis/Opus/Theora and (experimentally) WebM video.\n\nBased around libogg, libvorbis, libtheora, libopus, libvpx, and libnestegg compiled to JavaScript with Emscripten.\n\n## Updates\n\n1.4.2 - 2017-04-24\n* support 8-bit 4:2:2 and 4:4:4 subsampling in VP9\n\n1.4.1 - 2017-04-07\n* fix for seek shortly after initialization\n* fix for some missing instance constants\n\n1.4.0 - 2017-04-06\n* fastSeek() is now fast; seeks to first keyframe found.\n* VP9 base profile support in WebM container (8-bit 4:2:0 only).\n* Safari no longer complains about missing es6-promise.map source map\n* Smoother playback on low-end machines prone to lag spikes: when A/V sync lags, keep audio running smoothly and resync video at the next keyframe. To restore previous behavior, set `sync: 'delay-audio'` in options.\n* Experimental Web Assembly builds of all modules; set `wasm: true` in options to force on.\n* `error` property now returns an `OGVMediaError` object instead of string.\n* Decode pipeline up to 3 frames deep to aid in momentary spikes.\n* Experimental multithreaded JS builds for VP8 and VP9; set `threading: true` in options to force on.\n* Fixed bad autodetection of files in root dir\n\n1.3.1 - 2017-02-24\n* Fix for seeking before load completes\n* Fix for bisection seeking in very short Ogg files\n\n1.3.0 - 2017-02-08\n* Separated XHR and caching out to stream-file package\n* more aggressive in-memory buffering should improve audio seek performance\n* improved seek precision on audio files\n* fix for Ogg files with stream id of 0\n\n1.2.1 - 2016-09-24\n* Performance fixed for playback of Ogg Theora with many duplicate frames (\"1000fps\" files from ffmpeg)\n* Report actual fps (ignoring dupe frames) for Ogg Theora\n* Delay loading when using preload=\"none\"\n* Fix regression in IE 10 network layer\n\n1.2.0 - 2016-09-19\n* Separated software and WebGL paths to yuv-canvas package\n* fixed regression in WebM frame rate handling\n* buffer up to 3 decoded frames for smoother playback\n* smoother audio in the face of short delays (drop late frame if next one is already decoded)\n* fixed regression in seeking non-indexed Ogg files\n* updated libvpx\n\n1.1.3 - 2016-06-27\n* fix play-during-seek bug that interacted with video.js badly\n\n1.1.2 - 2016-06-27\n* better a/v sync\n* muted autoplay works on iOS\n* numerous seeking-related race-condition fixes\n* more consistent performance on low-end machines\n* supports cross-domain hosting of worker and Flash audio shim\n* seeking now works in WebM as well as Ogg\n* cleaner multithreading\n* lots of little fixes\n\nSee more details and history in [CHANGES.md](https://github.com/brion/ogv.js/blob/master/CHANGES.md)\n\n## Current status\n\nSince August 2015, ogv.js can be seen in action [on Wikipedia and Wikimedia Commons](https://commons.wikimedia.org/wiki/Commons:Video) in Safari and IE/Edge where native Ogg and WebM playback is not available. (See [technical details on MediaWiki integration](https://www.mediawiki.org/wiki/Extension:TimedMediaHandler/ogv.js).)\n\nSee also a standalone demo with performance metrics at https://brionv.com/misc/ogv.js/demo/\n\n* streaming: yes (with Range header)\n* seeking: yes for Ogg and WebM (with Range header)\n* color: yes\n* audio: yes, with a/v sync (requires Web Audio or Flash)\n* background threading: yes (video, audio decoders in Workers)\n* [GPU accelerated drawing: yes (WebGL)](https://github.com/brion/ogv.js/wiki/GPU-acceleration)\n* GPU accelerated decoding: no\n* SIMD acceleration: no\n* Web Assembly: yes (experimental; set `options.wasm` to `true`)\n* multithreaded VP8, VP9: yes (experimental; set `options.threading` to `true`; requires `SharedArrayBuffer`)\n* controls: no (currently provided by demo or other UI harness)\n\nOgg files are fairly well supported, but WebM is still experimental and is disabled by default.\n\n\n## Goals\n\nLong-form goal is to create a drop-in replacement for the HTML5 video and audio tags which can be used for basic playback of Ogg Theora and Vorbis or WebM media on browsers that don't support Ogg or WebM natively.\n\nThe API isn't quite complete, but works pretty well.\n\n\n## Compatibility\n\nogv.js requires a fast JS engine with typed arrays, and either Web Audio or Flash for audio playback.\n\nThe primary target browsers are (testing 360p/30fps and up):\n* Safari 6.1/7/8/9/10 on Mac OS X 10.7-10.11\n* Safari on iOS 8/9/10 64-bit\n* Edge on Windows 10 desktop/tablet\n* Internet Explorer 10/11 on Windows 7/8/8.1/10 (desktop/tablet)\n\nAnd for lower-resolution files (testing 160p/15fps):\n* Safari on iOS 8/9/10 32-bit\n* Edge on Windows 10 Mobile\n* Internet Explorer 10/11 on Windows RT\n\nOlder versions of Safari have flaky JIT compilers. IE 9 and below lack typed arrays.\n\n(Note that Windows and Mac OS X can support Ogg and WebM by installing codecs or alternate browsers with built-in support, but this is not possible on iOS, Windows RT, or Windows 10 Mobile.)\n\nTesting browsers (these support .ogv and .webm natively):\n* Firefox 52\n* Chrome 57\n\n\n## Package installation\n\nPre-built releases of ogv.js are available as [.zip downloads from the GitHub releases page](https://github.com/brion/ogv.js/releases) and through the npm package manager.\n\nYou can load the `ogv.js` main entry point directly in a script tag, or bundle it through whatever build process you like. The other .js files and the .swf file (for audio in IE) must be made available for runtime loading, together in the same directory.\n\nogv.js will try to auto-detect the path to its resources based on the script element that loads ogv.js or ogv-support.js. If you load ogv.js through another bundler (such as browserify or MediaWiki's ResourceLoader) you may need to override this manually before instantiating players:\n\n```\n  // Path to ogv-demuxer-ogg.js, ogv-worker-audio.js, dynamicaudio.swf etc\n  OGVLoader.base = '/path/to/resources';\n```\n\nTo fetch from npm:\n\n```\nnpm install ogv\n```\n\nThe distribution-ready files will appear in 'node_modules/ogv/dist'.\n\nTo load the player library into your browserify or webpack project:\n\n```\nvar ogv = require('ogv');\n\n// Access public classes either as ogv.OGVPlayer or just OGVPlayer.\n// Your build/lint tools may be happier with ogv.OGVPlayer!\nogv.OGVLoader.base = '/path/to/resources';\nvar player = new ogv.OGVPlayer();\n```\n\n## Usage\n\nThe `OGVPlayer` class implements a player, and supports a subset of the events, properties and methods from [HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement) and [HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement).\n\n```\n  // Create a new player with the constructor\n  var player = new OGVPlayer();\n\n  // Or with options\n  var player = new OGVPlayer({\n    enableWebM: true\n  });\n\n  // Now treat it just like a video or audio element\n  containerElement.appendChild(player);\n  player.src = 'path/to/media.ogv';\n  player.play();\n  player.addEventListener('ended', function() {\n    // ta-da!\n  });\n```\n\nTo check for compatibility before creating a player, include `ogv-support.js` and use the `OGVCompat` API:\n\n```\n  if (OGVCompat.supported('OGVPlayer')) {\n    // go load the full player from ogv.js and instantiate stuff\n  }\n```\n\nThis will check for typed arrays, audio/Flash, blacklisted iOS versions, and super-slow/broken JIT compilers.\n\nIf you need a URL versioning/cache-buster parameter for dynamic loading of `ogv.js`, you can use the `OGVVersion` symbol provided by `ogv-support.js` or the even tinier `ogv-version.js`:\n\n```\n  var script = document.createElement('script');\n  script.src = 'ogv.js?version=' + encodeURIComponent(OGVVersion);\n  document.querySelector('head').appendChild(script);\n```\n\n## Distribution notes\n\nEntry points:\n* `ogv.js` contains the main runtime classes, including OGVPlayer, OGVLoader, and OGVCompat.\n* `ogv-support.js` contains the OGVCompat class and OGVVersion symbol, useful for checking for runtime support before loading the main `ogv.js`.\n* `ogv-version.js` contains only the OGVVersion symbol.\n\nThese entry points may be loaded directly from a script element, or concatenated into a larger project, or otherwise loaded as you like.\n\nFurther code modules are loaded at runtime, which must be available with their defined names together in a directory. If the files are not hosted same-origin to the web page that includes them, you will need to set up appropriate CORS headers to allow loading of the worker JS modules.\n\nDynamically loaded assets:\n* `ogv-worker-audio.js`, `ogv-worker-video.js`, and `pthread-main.js` are Worker entry points, used to run video and audio decoders in the background.\n* `ogv-demuxer-ogg.js` is used in playing .ogg, .oga, and .ogv files.\n* `ogv-demuxer-webm.js` is used in playing .webm files.\n* `ogv-decoder-audio-vorbis.js` and `ogv-decoder-audio-opus.js` are used in playing both Ogg and WebM files containing audio.\n* `ogv-decoder-video-theora.js` is used in playing .ogg and .ogv video files.\n* `ogv-decoder-video-vp8.js` and `ogv-decoder-video-vp9.js` are used in playing .webm video files.\n* `*-wasm.js` and `*-wasm.wasm` files are the Web Assembly versions of the above modules.\n* `*-mt.js` are the multithreaded versions of some of the above modules.\n* `dynamicaudio.swf` is the Flash audio shim, used for Internet Explorer 10/11.\n\nIf you know you will never use particular formats or codecs you can skip bundling them; for instance if you only need to play Ogg files you don't need `ogv-demuxer-webm.js` or `ogv-decoder-video-vp8.js` which are only used for WebM. Web Assembly and multithreaded modules are experimental and can be left out if not enabled in your runtime options.\n\n\n## Performance\n\nAs of 2015, for SD-or-less resolution basic Ogg Theora decoding speed is reliable on desktop and newer high-end mobile devices; current high-end desktops and laptops can even reach HD resolutions. Older and low-end mobile devices may have difficulty on any but audio and the lowest-resolution video files.\n\nWebM is much slower, and remains experimental.\n\n*Low-res targets*\n\nI've gotten acceptable performance for Vorbis audio and 160p/15fps Theora files on 32-bit iOS devices: iPhone 4s, iPod Touch 5th-gen and iPad 3. These have difficulty at 240p and above, and just won't keep up with higher resolutions.\n\nMeanwhile, newer 64-bit iPhones and iPads are comparable to low-end laptops, and videos at 360p and often 480p play acceptably. Since 32-bit and 64-bit iOS devices have the same user-agent, a benchmark must be used to approximately test minimum CPU speed.\n\n(On iOS, Safari performs significantly better than some alternative browsers that are unable to enable the JIT due to use of the old UIWebView API. Chrome 49 and Firefox for iOS are known to work using the newer WKWebView API internally. Again, a benchmark must be used to detect slow performance, as the browser remains otherwise compatible.)\n\n\nWindows on 32-bit ARM platforms is similar... IE 11 on Windows RT 8.1 on a Surface tablet (NVidia Tegra 3), and Edge on Windows 10 Mobile build 10166 on a Lumia 635, perform acceptably with audio and with 160p/15fps videos but have trouble starting around 240p.\n\n\nIn both cases, a native application looms as a possibly better alternative. See [OGVKit ](https://github.com/brion/OGVKit) and [OgvRt](https://github.com/brion/OgvRT) projects for experiments in those directions.\n\n\nNote that at these lower resolutions, Vorbis audio and Theora video decoding are about equally expensive operations -- dual-core phones and tablets should be able to eek out a little parallelism here thanks to audio and video being in separate Worker threads.\n\n\n*WebGL drawing acceleration*\n\nAccelerated YCbCr->RGB conversion and drawing is done using WebGL on supporting browsers, or through software CPU conversion if not. This is abstracted in the [yuv-canvas](https://github.com/brion/yuv-canvas) package, now separately installable.\n\nIt may be possible to do further acceleration of actual decoding operations using WebGL shaders, but this could be ... tricky. WebGL is also only available on the main thread, and there are no compute shaders yet so would have to use fragment shaders.\n\n\n## Difficulties\n\n*Threading*\n\nCurrently the video and audio codecs run in worker threads by default, while the demuxer\nand player logic run on the UI thread. This seems to work pretty well.\n\nThere is some overhead in extracting data out of each emscripten module's heap and in the thread-to-thread communications, but the parallelism and smoother main thread makes up for it.\n\n*Streaming download*\n\nIn Firefox, the 'moz-chunked-array' responseType on XHR is used to read data as ArrayBuffer chunks during download. Safari and Chrome use a 'binary string' read which requires manually converting input to ArrayBuffer chunks. In IE and Edge have an (MS-prefixed) Stream/StreamReader interface which can be used to read data on demand into ArrayBuffer objects, but it has proved problematic especially with intermediate proxies; as of 1.1.2 IE and Edge use the same chunked binary-string method as Safari and Chrome.\n\nThe Firefox and Safari/Chrome cases have been hacked up to do streaming buffering by chunking the requests at up to a megabyte each, using the HTTP Range header. For cross-site playback, this requires CORS setup to whitelist the Range header!\n\n[Safari has a bug with Range headers](https://bugs.webkit.org/show_bug.cgi?id=82672) which is worked around as necessary with a 'cache-busting' URL string parameter. Hopefully this will be fixed in future versions of Mac OS X and iOS.\n\n\n*Seeking*\n\nSeeking is implemented via the HTTP Range: header.\n\nFor Ogg files with keyframe indices in a skeleton index, seeking is very fast. Otherwise,  a bisection search is used to locate the target frame or audio position, which is very slow over the internet as it creates a lot of short-lived HTTP requests.\n\nFor WebM files with cues, efficient seeking is supported as well as of 1.1.2.\n\nAs with chunked streaming, cross-site playback requires CORS support for the Range header.\n\n\n*Audio output*\n\nAudio output is handled through the [AudioFeeder](https://github.com/brion/audio-feeder) library, which encapsulates use of Web Audio API or Flash depending on browser support:\n\nFirefox, Safari, Chrome, and Edge support the W3C Web Audio API.\n\nIE doesn't support Web Audio, but does bundle the Flash player in Windows 8/8.1/RT. A small Flash shim is included here and used as a fallback -- thanks to Maik Merten for hacking some pieces together and getting this working!\n\nA/V synchronization is performed on files with both audio and video, and seems to\nactually work. Yay!\n\nNote that autoplay with audio doesn't work on iOS Safari due to limitations with starting audio playback from event handlers; if playback is started outside an event handler, the player will hang due to broken audio.\n\nAs of 1.1.1, muting before script-triggered playback allows things to work:\n\n```\n  player = new OGVPlayer();\n  player.muted = true;\n  player.src = 'path/to/file-with-audio.ogv';\n  player.play();\n```\n\nYou can then unmute the video in response to a touch or click handler. Alternately if audio is not required, do not include an audio track in the file.\n\n\n*WebM*\n\nWebM support was added in June 2015, with some major issues finally worked out in May 2016. Initial VP9 support was added in February 2017. It remains experimental, but should be fully enabled in the future once a few more bugs are worked out.\n\nTo enable, set `enableWebM: true` in your `options` array.\n\nBeware that performance of WebM VP8 is much slower than Ogg Theora, and VP9 is slower still.\n\nFor best WebM decode speed, consider encoding VP8 with \"profile 1\" (simple deblocking filter) which will sacrifice quality modestly, mainly in high-motion scenes. When encoding with ffmpeg, this is the `-profile:v 1` option to the `libvpx` codec.\n\nIt is also recommended to use the `-slices` option for VP8, or `-tile-columns` for VP9, to maximize ability to use multithreaded decoding when available.\n\n\n## Upstream library notes\n\nWe've experimented with tremor (libivorbis), an integer-only variant of libvorbis. This actually does *not* decode faster, but does save about 200kb off our generated JavaScript, presumably thanks to not including an encoder in the library. However on slow devices like iPod Touch 5th-generation, it makes a significant negative impact on the decode time so we've gone back to libvorbis.\n\nThe Ogg Skeleton library (libskeleton) is a bit ... unfinished and is slightly modified here.\n\nlibvpx is slightly modified to work around emscripten threading limitations in the VP8 decoder.\n\n\n## Web Assembly\n\nExperimental Web Assembly (WASM) versions of the emscripten cross-compiled modules are also included, used if `options.wasm` is true.\n\nThe WASM versions of the modules are more compact than the cross-compiled asm.js-style JavaScript, and should download and parse faster. Some browsers may also compile the module differently, providing more consistent performance at the beginning of playback.\n\nCurrently Firefox and Chrome are the only release versions of browsers that support Web Assembly, but it's available in Safari Technical Preview and behind the 'experimental JS options' flag in Edge in Windows 10 version 1703.\n\nIf you are making a slim build and will not use the `wasm` option, you can leave out the `*-wasm.js` and `*-wasm.wasm` files.\n\n\n## Multithreading\n\nExperimental multithreaded VP8 and VP9 decoding up to 4 cores is available for VP8 and VP9 video, used if `options.threading` is true. This requires browser support for the new `SharedArrayBuffer` and `Atomics` APIs, currently available in Safari 10.1 / iOS 10.3 and in Firefox developer & nightly builds, and in Chrome behind a flag.\n\nThreading is not currently compatible with Web Assembly.\n\nSpeedups will only be noticeable when using the \"slices\" or \"token partitions\" option for VP8 encoding, or the \"tile columns\" option for VP9 encoding.\n\nCurrently, getting a successful multithreaded build requires a [patch to the emscripten compiler](https://github.com/kripken/emscripten/pull/5016); without this patch, the resulting multithreaded modules will build but fail to initialize correctly.\n\nIf you are making a slim build and will not use the `threading` option, you can leave out the `*-mt.js` files, as well as `pthread-main.js`.\n\n\n## Building JS components\n\nBuilding ogv.js is known to work on Mac OS X and Linux (tested Ubuntu 15.04).\n\n1. You will need autoconf, automake, libtool, pkg-config, and node (nodejs). These can be installed through Homebrew on Mac OS X, or through distribution-specific methods on Linux.\n2. Install [Emscripten](http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html); currently using the incoming branch (of what will be 1.38) for distribution builds for latest WASM support, plus [multithreading patch](https://github.com/kripken/emscripten/pull/5016)\n3. `git submodule update --init`\n4. Run `npm install` to install build utilities\n5. Run `make js` to configure and build the libraries and the C wrapper\n\n\n## Building the demo\n\nIf you did all the setup above, just run `make demo` or `make`. Look in build/demo/ and enjoy!\n\n\n## License\n\nlibogg, libvorbis, libtheora, libopus, nestegg, and libvpx are available under their respective licenses, and the JavaScript and C wrapper code in this repo is licensed under MIT.\n\nBased on build scripts from https://github.com/devongovett/ogg.js\n\n[AudioFeeder](https://github.com/brion/audio-feeder)'s dynamicaudio.as and other Flash-related bits are based on code under BSD license, (c) 2010 Ben Firshman.\n\nSee [AUTHORS.md](https://github.com/brion/ogv.js/blob/master/AUTHORS.md) and/or the git history for a list of contributors.\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-audio-opus-wasm.js",
    "content": "var OGVDecoderAudioOpusW\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderAudioOpusW = function(OGVDecoderAudioOpusW) {\n  OGVDecoderAudioOpusW = OGVDecoderAudioOpusW || {};\n  if (!OGVDecoderAudioOpusW.currentScriptUrl) OGVDecoderAudioOpusW.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderAudioOpusW;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderAudioOpusW=Module;var Module;if(!Module)Module=(typeof OGVDecoderAudioOpusW!==\"undefined\"?OGVDecoderAudioOpusW:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Memory===\"function\"){Module[\"wasmMemory\"]=new WebAssembly.Memory({\"initial\":TOTAL_MEMORY/WASM_PAGE_SIZE,\"maximum\":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\"wasmMemory\"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"fround\"]){var froundBuffer=new Float32Array(1);Math[\"fround\"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math[\"fround\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module[\"wasmJSMethod\"]||\"native-wasm\";Module[\"wasmJSMethod\"]=method;var wasmTextFile=Module[\"wasmTextFile\"]||\"ogv-decoder-audio-opus-wasm.wast\";var wasmBinaryFile=Module[\"wasmBinaryFile\"]||\"ogv-decoder-audio-opus-wasm.wasm\";var asmjsCodeFile=Module[\"asmjsCodeFile\"]||\"ogv-decoder-audio-opus-wasm.temp.asm.js\";if(typeof Module[\"locateFile\"]===\"function\"){wasmTextFile=Module[\"locateFile\"](wasmTextFile);wasmBinaryFile=Module[\"locateFile\"](wasmBinaryFile);asmjsCodeFile=Module[\"locateFile\"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={\"f64-rem\":(function(x,y){return x%y}),\"f64-to-int\":(function(x){return x|0}),\"i32s-div\":(function(x,y){return(x|0)/(y|0)|0}),\"i32u-div\":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\"i32s-rem\":(function(x,y){return(x|0)%(y|0)|0}),\"i32u-rem\":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\"debugger\":(function(){debugger})};var info={\"global\":null,\"env\":null,\"asm2wasm\":asm2wasmImports,\"parent\":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(\".\")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(\".\");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\"bad lookupImport to (\"+mod+\").\"+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module[\"buffer\"];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\"printErr\"](\"the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here\")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\"STATIC_BASE\"],Module[\"STATIC_BASE\"]+Module[\"STATIC_BUMP\"]),Module[\"STATIC_BASE\"])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function fixImports(imports){if(!0)return imports;var ret={};for(var i in imports){var fixed=i;if(fixed[0]==\"_\")fixed=fixed.substr(1);ret[fixed]=imports[i]}return ret}function getBinary(){var binary;if(Module[\"wasmBinary\"]){binary=Module[\"wasmBinary\"];binary=new Uint8Array(binary)}else if(Module[\"readBinary\"]){binary=Module[\"readBinary\"](wasmBinaryFile)}else{throw\"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)\"}return binary}function getBinaryPromise(){if(!Module[\"wasmBinary\"]&&typeof fetch===\"function\"){return fetch(wasmBinaryFile).then((function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doJustAsm(global,env,providedBuffer){if(typeof Module[\"asm\"]!==\"function\"||Module[\"asm\"]===methodHandler){if(!Module[\"asmPreload\"]){eval(Module[\"read\"](asmjsCodeFile))}else{Module[\"asm\"]=Module[\"asmPreload\"]}}if(typeof Module[\"asm\"]!==\"function\"){Module[\"printErr\"](\"asm evalling did not set the module properly\");return false}return Module[\"asm\"](global,env,providedBuffer)}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!==\"object\"){Module[\"printErr\"](\"no native wasm support detected\");return false}if(!(Module[\"wasmMemory\"]instanceof WebAssembly.Memory)){Module[\"printErr\"](\"no native wasm Memory in use\");return false}env[\"memory\"]=Module[\"wasmMemory\"];info[\"global\"]={\"NaN\":NaN,\"Infinity\":Infinity};info[\"global.Math\"]=global.Math;info[\"env\"]=env;function receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\"asm\"]=exports;Module[\"usingWasm\"]=true;removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){Module[\"printErr\"](\"Module.instantiateWasm callback failed with error: \"+e);return false}}getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\"instance\"])})).catch((function(reason){Module[\"printErr\"](\"failed to asynchronously prepare wasm: \"+reason);Module[\"quit\"](1,reason)}));return{}}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!==\"function\"){Module[\"printErr\"](\"WasmJS not detected - polyfill not bundled?\");return false}var wasmJS=WasmJS({});wasmJS[\"outside\"]=Module;wasmJS[\"info\"]=info;wasmJS[\"lookupImport\"]=lookupImport;assert(providedBuffer===Module[\"buffer\"]);info.global=global;info.env=env;assert(providedBuffer===Module[\"buffer\"]);env[\"memory\"]=providedBuffer;assert(env[\"memory\"]instanceof ArrayBuffer);wasmJS[\"providedTotalMemory\"]=Module[\"buffer\"].byteLength;var code;if(method===\"interpret-binary\"){code=getBinary()}else{code=Module[\"read\"](method==\"interpret-asm2wasm\"?asmjsCodeFile:wasmTextFile)}var temp;if(method==\"interpret-asm2wasm\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_asm2wasm\"](temp)}else if(method===\"interpret-s-expr\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_s_expr2wasm\"](temp)}else if(method===\"interpret-binary\"){temp=wasmJS[\"_malloc\"](code.length);wasmJS[\"HEAPU8\"].set(code,temp);wasmJS[\"_load_binary2wasm\"](temp,code.length)}else{throw\"what? \"+method}wasmJS[\"_free\"](temp);wasmJS[\"_instantiate\"](temp);if(Module[\"newBuffer\"]){mergeMemory(Module[\"newBuffer\"]);Module[\"newBuffer\"]=null}exports=wasmJS[\"asmExports\"];return exports}Module[\"asmPreload\"]=Module[\"asm\"];Module[\"reallocBuffer\"]=(function(size){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module[\"buffer\"];var oldSize=old.byteLength;if(Module[\"usingWasm\"]){try{var result=Module[\"wasmMemory\"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module[\"buffer\"]=Module[\"wasmMemory\"].buffer}else{return null}}catch(e){return null}}else{exports[\"__growWasmMemory\"]((size-oldSize)/wasmPageSize);return Module[\"buffer\"]!==old?Module[\"buffer\"]:null}});Module[\"asm\"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\"table\"]){var TABLE_SIZE=Module[\"wasmTableSize\"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module[\"wasmMaxTableSize\"];if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Table===\"function\"){if(MAX_TABLE_SIZE!==undefined){env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,\"maximum\":MAX_TABLE_SIZE,\"element\":\"anyfunc\"})}else{env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,element:\"anyfunc\"})}}else{env[\"table\"]=new Array(TABLE_SIZE)}Module[\"wasmTable\"]=env[\"table\"]}if(!env[\"memoryBase\"]){env[\"memoryBase\"]=Module[\"STATIC_BASE\"]}if(!env[\"tableBase\"]){env[\"tableBase\"]=0}var exports;var methods=method.split(\",\");for(var i=0;i<methods.length;i++){var curr=methods[i];if(curr===\"native-wasm\"){if(exports=doNativeWasm(global,env,providedBuffer))break}else if(curr===\"asmjs\"){if(exports=doJustAsm(global,env,providedBuffer))break}else if(curr===\"interpret-asm2wasm\"||curr===\"interpret-s-expr\"||curr===\"interpret-binary\"){if(exports=doWasmPolyfill(global,env,providedBuffer,curr))break}else{throw\"bad method: \"+curr}}if(!exports)throw\"no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods\";return exports});var methodHandler=Module[\"asm\"]}integrateWasmJS(Module);var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+27264;__ATINIT__.push();memoryInitializer=Module[\"wasmJSMethod\"].indexOf(\"asmjs\")>=0||Module[\"wasmJSMethod\"].indexOf(\"interpret-asm2wasm\")>=0?\"ogv-decoder-audio-opus-wasm.js.mem\":null;var STATIC_BUMP=27264;Module[\"STATIC_BASE\"]=STATIC_BASE;Module[\"STATIC_BUMP\"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_memset\"]=_memset;function _abort(){Module[\"abort\"]()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var _llvm_pow_f64=Math_pow;function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLVM_SAVEDSTACKS[p];self.LLVM_SAVEDSTACKS.splice(p,1);Runtime.stackRestore(ret)}function _ogvjs_callback_audio(buffers,channels,sampleCount){var HEAPU32=Module.HEAPU32;var HEAPF32=Module.HEAPF32;var outputBuffers=[];if(buffers!==0){var inPtr,inArray,inBuffer,outArray;for(var channel=0;channel<channels;channel++){inPtr=HEAPU32[buffers/4+channel];if(HEAPF32.buffer.slice){inBuffer=HEAPF32.buffer.slice(inPtr,inPtr+sampleCount*4);outArray=new Float32Array(inBuffer)}else{inArray=HEAPF32.subarray(inPtr/4,inPtr/4+sampleCount);outArray=new Float32Array(inArray)}outputBuffers.push(outArray)}}Module.audioBuffer=outputBuffers}function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDSTACKS){self.LLVM_SAVEDSTACKS=[]}self.LLVM_SAVEDSTACKS.push(Runtime.stackSave());return self.LLVM_SAVEDSTACKS.length-1}Module[\"_memmove\"]=_memmove;function _ogvjs_callback_init_audio(channels,rate){Module.audioFormat={channels:channels,rate:rate};Module.loadedMetadata=true}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\"wasmTableSize\"]=2;Module[\"wasmMaxTableSize\"]=2;function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_viiiiii\":invoke_viiiiii,\"_ogvjs_callback_init_audio\":_ogvjs_callback_init_audio,\"_llvm_pow_f64\":_llvm_pow_f64,\"_abort\":_abort,\"___setErrNo\":___setErrNo,\"_llvm_stacksave\":_llvm_stacksave,\"_ogvjs_callback_audio\":_ogvjs_callback_audio,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_llvm_stackrestore\":_llvm_stackrestore,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};var asm=Module[\"asm\"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\"asm\"]=asm;var _malloc=Module[\"_malloc\"]=(function(){return Module[\"asm\"][\"_malloc\"].apply(null,arguments)});var getTempRet0=Module[\"getTempRet0\"]=(function(){return Module[\"asm\"][\"getTempRet0\"].apply(null,arguments)});var _free=Module[\"_free\"]=(function(){return Module[\"asm\"][\"_free\"].apply(null,arguments)});var runPostSets=Module[\"runPostSets\"]=(function(){return Module[\"asm\"][\"runPostSets\"].apply(null,arguments)});var _ogv_audio_decoder_destroy=Module[\"_ogv_audio_decoder_destroy\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_destroy\"].apply(null,arguments)});var _ogv_audio_decoder_init=Module[\"_ogv_audio_decoder_init\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_init\"].apply(null,arguments)});var establishStackSpace=Module[\"establishStackSpace\"]=(function(){return Module[\"asm\"][\"establishStackSpace\"].apply(null,arguments)});var _memmove=Module[\"_memmove\"]=(function(){return Module[\"asm\"][\"_memmove\"].apply(null,arguments)});var _memset=Module[\"_memset\"]=(function(){return Module[\"asm\"][\"_memset\"].apply(null,arguments)});var _ogv_audio_decoder_process_header=Module[\"_ogv_audio_decoder_process_header\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_process_header\"].apply(null,arguments)});var _sbrk=Module[\"_sbrk\"]=(function(){return Module[\"asm\"][\"_sbrk\"].apply(null,arguments)});var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=(function(){return Module[\"asm\"][\"_emscripten_get_global_libc\"].apply(null,arguments)});var _memcpy=Module[\"_memcpy\"]=(function(){return Module[\"asm\"][\"_memcpy\"].apply(null,arguments)});var setTempRet0=Module[\"setTempRet0\"]=(function(){return Module[\"asm\"][\"setTempRet0\"].apply(null,arguments)});var stackAlloc=Module[\"stackAlloc\"]=(function(){return Module[\"asm\"][\"stackAlloc\"].apply(null,arguments)});var _ogv_audio_decoder_process_audio=Module[\"_ogv_audio_decoder_process_audio\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_process_audio\"].apply(null,arguments)});var setThrew=Module[\"setThrew\"]=(function(){return Module[\"asm\"][\"setThrew\"].apply(null,arguments)});var stackRestore=Module[\"stackRestore\"]=(function(){return Module[\"asm\"][\"stackRestore\"].apply(null,arguments)});var stackSave=Module[\"stackSave\"]=(function(){return Module[\"asm\"][\"stackSave\"].apply(null,arguments)});var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiiiii\"].apply(null,arguments)});Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;if(memoryInitializer){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];if(request.status!==200&&request.status!==0){console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}Module.loadedMetadata=!!options.audioFormat;Module.audioFormat=options.audioFormat||null;Module.audioBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_audio_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_header(buffer,len)}));callback(ret)});Module.processAudio=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_audio(buffer,len)}));callback(ret)});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n  return OGVDecoderAudioOpusW;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-audio-opus.js",
    "content": "var OGVDecoderAudioOpus\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderAudioOpus = function(OGVDecoderAudioOpus) {\n  OGVDecoderAudioOpus = OGVDecoderAudioOpus || {};\n  if (!OGVDecoderAudioOpus.currentScriptUrl) OGVDecoderAudioOpus.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderAudioOpus;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderAudioOpus=Module;var Module;if(!Module)Module=(typeof OGVDecoderAudioOpus!==\"undefined\"?OGVDecoderAudioOpus:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+25808;__ATINIT__.push();allocate([0,0,206,64,0,0,200,64,0,0,184,64,0,0,170,64,0,0,162,64,0,0,154,64,0,0,144,64,0,0,140,64,0,0,156,64,0,0,150,64,0,0,146,64,0,0,142,64,0,0,156,64,0,0,148,64,0,0,138,64,0,0,144,64,0,0,140,64,0,0,148,64,0,0,152,64,0,0,142,64,0,0,112,64,0,0,112,64,0,0,112,64,0,0,112,64,0,0,112,64,146,80,0,0,154,80,0,0,170,80,0,0,202,80,0,0,242,80,0,0,66,81,0,0,32,0,10,0,20,46,100,1,226,81,0,0,34,83,0,0,98,83,0,0,116,83,0,0,20,84,0,0,92,84,0,0,24,69,0,0,32,0,16,0,102,38,171,1,164,84,0,0,164,86,0,0,228,86,0,0,2,87,0,0,2,88,0,0,74,88,0,0,46,69,0,0,173,88,0,0,176,88,0,0,1,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,6,0,0,0,1,0,0,0,5,0,0,0,2,0,0,0,15,0,0,0,0,0,0,0,8,0,0,0,7,0,0,0,12,0,0,0,3,0,0,0,11,0,0,0,4,0,0,0,14,0,0,0,1,0,0,0,9,0,0,0,6,0,0,0,13,0,0,0,2,0,0,0,10,0,0,0,5,0,0,0,15,0,0,0,10,0,0,0,5,0,0,0,148,1,0,0,84,4,0,0,16,7,0,0,200,9,0,0,124,12,0,0,44,15,0,0,216,17,0,0,64,19,0,0,252,19,0,0,112,20,0,0,188,20,0,0,244,20,0,0,20,21,0,0,44,21,0,0,56,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,7,0,0,0,9,0,0,0,11,0,0,0,13,0,0,0,15,0,0,0,17,0,0,0,19,0,0,0,21,0,0,0,23,0,0,0,25,0,0,0,27,0,0,0,29,0,0,0,31,0,0,0,33,0,0,0,35,0,0,0,37,0,0,0,39,0,0,0,41,0,0,0,43,0,0,0,45,0,0,0,47,0,0,0,49,0,0,0,51,0,0,0,53,0,0,0,55,0,0,0,57,0,0,0,59,0,0,0,61,0,0,0,63,0,0,0,65,0,0,0,67,0,0,0,69,0,0,0,71,0,0,0,73,0,0,0,75,0,0,0,77,0,0,0,79,0,0,0,81,0,0,0,83,0,0,0,85,0,0,0,87,0,0,0,89,0,0,0,91,0,0,0,93,0,0,0,95,0,0,0,97,0,0,0,99,0,0,0,101,0,0,0,103,0,0,0,105,0,0,0,107,0,0,0,109,0,0,0,111,0,0,0,113,0,0,0,115,0,0,0,117,0,0,0,119,0,0,0,121,0,0,0,123,0,0,0,125,0,0,0,127,0,0,0,129,0,0,0,131,0,0,0,133,0,0,0,135,0,0,0,137,0,0,0,139,0,0,0,141,0,0,0,143,0,0,0,145,0,0,0,147,0,0,0,149,0,0,0,151,0,0,0,153,0,0,0,155,0,0,0,157,0,0,0,159,0,0,0,161,0,0,0,163,0,0,0,165,0,0,0,167,0,0,0,169,0,0,0,171,0,0,0,173,0,0,0,175,0,0,0,177,0,0,0,179,0,0,0,181,0,0,0,183,0,0,0,185,0,0,0,187,0,0,0,189,0,0,0,191,0,0,0,193,0,0,0,195,0,0,0,197,0,0,0,199,0,0,0,201,0,0,0,203,0,0,0,205,0,0,0,207,0,0,0,209,0,0,0,211,0,0,0,213,0,0,0,215,0,0,0,217,0,0,0,219,0,0,0,221,0,0,0,223,0,0,0,225,0,0,0,227,0,0,0,229,0,0,0,231,0,0,0,233,0,0,0,235,0,0,0,237,0,0,0,239,0,0,0,241,0,0,0,243,0,0,0,245,0,0,0,247,0,0,0,249,0,0,0,251,0,0,0,253,0,0,0,255,0,0,0,1,1,0,0,3,1,0,0,5,1,0,0,7,1,0,0,9,1,0,0,11,1,0,0,13,1,0,0,15,1,0,0,17,1,0,0,19,1,0,0,21,1,0,0,23,1,0,0,25,1,0,0,27,1,0,0,29,1,0,0,31,1,0,0,33,1,0,0,35,1,0,0,37,1,0,0,39,1,0,0,41,1,0,0,43,1,0,0,45,1,0,0,47,1,0,0,49,1,0,0,51,1,0,0,53,1,0,0,55,1,0,0,57,1,0,0,59,1,0,0,61,1,0,0,63,1,0,0,65,1,0,0,67,1,0,0,69,1,0,0,71,1,0,0,73,1,0,0,75,1,0,0,77,1,0,0,79,1,0,0,81,1,0,0,83,1,0,0,85,1,0,0,87,1,0,0,89,1,0,0,91,1,0,0,93,1,0,0,95,1,0,0,13,0,0,0,25,0,0,0,41,0,0,0,61,0,0,0,85,0,0,0,113,0,0,0,145,0,0,0,181,0,0,0,221,0,0,0,9,1,0,0,57,1,0,0,109,1,0,0,165,1,0,0,225,1,0,0,33,2,0,0,101,2,0,0,173,2,0,0,249,2,0,0,73,3,0,0,157,3,0,0,245,3,0,0,81,4,0,0,177,4,0,0,21,5,0,0,125,5,0,0,233,5,0,0,89,6,0,0,205,6,0,0,69,7,0,0,193,7,0,0,65,8,0,0,197,8,0,0,77,9,0,0,217,9,0,0,105,10,0,0,253,10,0,0,149,11,0,0,49,12,0,0,209,12,0,0,117,13,0,0,29,14,0,0,201,14,0,0,121,15,0,0,45,16,0,0,229,16,0,0,161,17,0,0,97,18,0,0,37,19,0,0,237,19,0,0,185,20,0,0,137,21,0,0,93,22,0,0,53,23,0,0,17,24,0,0,241,24,0,0,213,25,0,0,189,26,0,0,169,27,0,0,153,28,0,0,141,29,0,0,133,30,0,0,129,31,0,0,129,32,0,0,133,33,0,0,141,34,0,0,153,35,0,0,169,36,0,0,189,37,0,0,213,38,0,0,241,39,0,0,17,41,0,0,53,42,0,0,93,43,0,0,137,44,0,0,185,45,0,0,237,46,0,0,37,48,0,0,97,49,0,0,161,50,0,0,229,51,0,0,45,53,0,0,121,54,0,0,201,55,0,0,29,57,0,0,117,58,0,0,209,59,0,0,49,61,0,0,149,62,0,0,253,63,0,0,105,65,0,0,217,66,0,0,77,68,0,0,197,69,0,0,65,71,0,0,193,72,0,0,69,74,0,0,205,75,0,0,89,77,0,0,233,78,0,0,125,80,0,0,21,82,0,0,177,83,0,0,81,85,0,0,245,86,0,0,157,88,0,0,73,90,0,0,249,91,0,0,173,93,0,0,101,95,0,0,33,97,0,0,225,98,0,0,165,100,0,0,109,102,0,0,57,104,0,0,9,106,0,0,221,107,0,0,181,109,0,0,145,111,0,0,113,113,0,0,85,115,0,0,61,117,0,0,41,119,0,0,25,121,0,0,13,123,0,0,5,125,0,0,1,127,0,0,1,129,0,0,5,131,0,0,13,133,0,0,25,135,0,0,41,137,0,0,61,139,0,0,85,141,0,0,113,143,0,0,145,145,0,0,181,147,0,0,221,149,0,0,9,152,0,0,57,154,0,0,109,156,0,0,165,158,0,0,225,160,0,0,33,163,0,0,101,165,0,0,173,167,0,0,249,169,0,0,73,172,0,0,157,174,0,0,245,176,0,0,81,179,0,0,177,181,0,0,21,184,0,0,125,186,0,0,233,188,0,0,89,191,0,0,205,193,0,0,69,196,0,0,193,198,0,0,65,201,0,0,197,203,0,0,77,206,0,0,217,208,0,0,105,211,0,0,253,213,0,0,149,216,0,0,49,219,0,0,209,221,0,0,117,224,0,0,29,227,0,0,201,229,0,0,121,232,0,0,45,235,0,0,229,237,0,0,161,240,0,0,63,0,0,0,129,0,0,0,231,0,0,0,121,1,0,0,63,2,0,0,65,3,0,0,135,4,0,0,25,6,0,0,255,7,0,0,65,10,0,0,231,12,0,0,249,15,0,0,127,19,0,0,129,23,0,0,7,28,0,0,25,33,0,0,191,38,0,0,1,45,0,0,231,51,0,0,121,59,0,0,191,67,0,0,193,76,0,0,135,86,0,0,25,97,0,0,127,108,0,0,193,120,0,0,231,133,0,0,249,147,0,0,255,162,0,0,1,179,0,0,7,196,0,0,25,214,0,0,63,233,0,0,129,253,0,0,231,18,1,0,121,41,1,0,63,65,1,0,65,90,1,0,135,116,1,0,25,144,1,0,255,172,1,0,65,203,1,0,231,234,1,0,249,11,2,0,127,46,2,0,129,82,2,0,7,120,2,0,25,159,2,0,191,199,2,0,1,242,2,0,231,29,3,0,121,75,3,0,191,122,3,0,193,171,3,0,135,222,3,0,25,19,4,0,127,73,4,0,193,129,4,0,231,187,4,0,249,247,4,0,255,53,5,0,1,118,5,0,7,184,5,0,25,252,5,0,63,66,6,0,129,138,6,0,231,212,6,0,121,33,7,0,63,112,7,0,65,193,7,0,135,20,8,0,25,106,8,0,255,193,8,0,65,28,9,0,231,120,9,0,249,215,9,0,127,57,10,0,129,157,10,0,7,4,11,0,25,109,11,0,191,216,11,0,1,71,12,0,231,183,12,0,121,43,13,0,191,161,13,0,193,26,14,0,135,150,14,0,25,21,15,0,127,150,15,0,193,26,16,0,231,161,16,0,249,43,17,0,255,184,17,0,1,73,18,0,7,220,18,0,25,114,19,0,63,11,20,0,129,167,20,0,231,70,21,0,121,233,21,0,63,143,22,0,65,56,23,0,135,228,23,0,25,148,24,0,255,70,25,0,65,253,25,0,231,182,26,0,249,115,27,0,127,52,28,0,129,248,28,0,7,192,29,0,25,139,30,0,191,89,31,0,1,44,32,0,231,1,33,0,121,219,33,0,191,184,34,0,193,153,35,0,135,126,36,0,25,103,37,0,127,83,38,0,193,67,39,0,231,55,40,0,249,47,41,0,255,43,42,0,1,44,43,0,7,48,44,0,25,56,45,0,63,68,46,0,129,84,47,0,231,104,48,0,121,129,49,0,63,158,50,0,65,191,51,0,135,228,52,0,25,14,54,0,255,59,55,0,65,110,56,0,231,164,57,0,249,223,58,0,127,31,60,0,129,99,61,0,7,172,62,0,25,249,63,0,191,74,65,0,1,161,66,0,231,251,67,0,121,91,69,0,191,191,70,0,193,40,72,0,135,150,73,0,25,9,75,0,127,128,76,0,193,252,77,0,231,125,79,0,249,3,81,0,255,142,82,0,1,31,84,0,7,180,85,0,25,78,87,0,63,237,88,0,129,145,90,0,231,58,92,0,121,233,93,0,63,157,95,0,65,86,97,0,135,20,99,0,25,216,100,0,255,160,102,0,65,111,104,0,231,66,106,0,249,27,108,0,127,250,109,0,65,1,0,0,169,2,0,0,9,5,0,0,193,8,0,0,65,14,0,0,9,22,0,0,169,32,0,0,193,46,0,0,1,65,0,0,41,88,0,0,9,117,0,0,129,152,0,0,129,195,0,0,9,247,0,0,41,52,1,0,1,124,1,0,193,207,1,0,169,48,2,0,9,160,2,0,65,31,3,0,193,175,3,0,9,83,4,0,169,10,5,0,65,216,5,0,129,189,6,0,41,188,7,0,9,214,8,0,1,13,10,0,1,99,11,0,9,218,12,0,41,116,14,0,129,51,16,0,65,26,18,0,169,42,20,0,9,103,22,0,193,209,24,0,65,109,27,0,9,60,30,0,169,64,33,0,193,125,36,0,1,246,39,0,41,172,43,0,9,163,47,0,129,221,51,0,129,94,56,0,9,41,61,0,41,64,66,0,1,167,71,0,193,96,77,0,169,112,83,0,9,218,89,0,65,160,96,0,193,198,103,0,9,81,111,0,169,66,119,0,65,159,127,0,129,106,136,0,41,168,145,0,9,92,155,0,1,138,165,0,1,54,176,0,9,100,187,0,41,24,199,0,129,86,211,0,65,35,224,0,169,130,237,0,9,121,251,0,193,10,10,1,65,60,25,1,9,18,41,1,169,144,57,1,193,188,74,1,1,155,92,1,41,48,111,1,9,129,130,1,129,146,150,1,129,105,171,1,9,11,193,1,41,124,215,1,1,194,238,1,193,225,6,2,169,224,31,2,9,196,57,2,65,145,84,2,193,77,112,2,9,255,140,2,169,170,170,2,65,86,201,2,129,7,233,2,41,196,9,3,9,146,43,3,1,119,78,3,1,121,114,3,9,158,151,3,41,236,189,3,129,105,229,3,65,28,14,4,169,10,56,4,9,59,99,4,193,179,143,4,65,123,189,4,9,152,236,4,169,16,29,5,193,235,78,5,1,48,130,5,41,228,182,5,9,15,237,5,129,183,36,6,129,228,93,6,9,157,152,6,41,232,212,6,1,205,18,7,193,82,82,7,169,128,147,7,9,94,214,7,65,242,26,8,193,68,97,8,9,93,169,8,169,66,243,8,65,253,62,9,129,148,140,9,41,16,220,9,9,120,45,10,1,212,128,10,1,44,214,10,9,136,45,11,41,240,134,11,129,108,226,11,65,5,64,12,169,194,159,12,9,173,1,13,193,204,101,13,65,42,204,13,9,206,52,14,169,192,159,14,193,10,13,15,1,181,124,15,41,200,238,15,9,77,99,16,129,76,218,16,129,207,83,17,9,223,207,17,41,132,78,18,1,200,207,18,193,179,83,19,169,80,218,19,9,168,99,20,65,195,239,20,193,171,126,21,9,107,16,22,169,10,165,22,65,148,60,23,129,17,215,23,41,140,116,24,9,14,21,25,1,161,184,25,1,79,95,26,9,34,9,27,41,36,182,27,129,95,102,28,65,222,25,29,169,170,208,29,9,207,138,30,193,85,72,31,65,73,9,32,9,180,205,32,169,160,149,33,193,25,97,34,1,42,48,35,41,220,2,36,9,59,217,36,129,81,179,37,147,6,0,0,69,14,0,0,15,28,0,0,17,51,0,0,91,87,0,0,13,142,0,0,119,221,0,0,57,77,1,0,99,230,1,0,149,179,2,0,31,193,3,0,33,29,5,0,171,215,6,0,221,2,9,0,7,179,11,0,201,254,14,0,51,255,18,0,229,207,23,0,47,143,29,0,49,94,36,0,251,96,44,0,173,190,53,0,151,161,64,0,89,55,77,0,3,177,91,0,53,67,108,0,63,38,127,0,65,150,148,0,75,211,172,0,125,33,200,0,39,201,230,0,233,22,9,1,211,91,47,1,133,237,89,1,79,38,137,1,81,101,189,1,155,14,247,1,77,139,54,2,183,73,124,2,121,189,200,2,163,95,28,3,213,174,119,3,95,47,219,3,97,107,71,4,235,242,188,4,29,92,60,5,71,67,198,5,9,75,91,6,115,28,252,6,37,103,169,7,111,225,99,8,113,72,44,9,59,96,3,10,237,243,233,10,215,213,224,11,153,223,232,12,67,242,2,14,117,246,47,15,127,220,112,16,129,156,198,17,139,54,50,19,189,178,180,20,103,33,79,22,41,155,2,24,19,65,208,25,197,60,185,27,143,192,190,29,145,7,226,31,219,85,36,34,141,248,134,36,247,69,11,39,185,157,178,41,227,104,126,44,21,26,112,47,159,45,137,50,161,41,203,53,43,158,55,57,93,37,208,60,135,99,150,64,73,7,140,68,179,201,178,72,101,110,12,77,175,195,154,81,177,162,95,86,123,239,92,91,45,153,148,96,23,154,8,102,217,247,186,107,131,195,173,113,181,25,227,119,191,34,93,126,29,35,0,0,113,77,0,0,145,156,0,0,253,38,1,0,101,12,2,0,233,119,3,0,153,162,5,0,53,214,8,0,45,112,13,0,225,228,19,0,33,195,28,0,237,183,40,0,117,146,56,0,89,72,77,0,41,250,103,0,37,248,137,0,61,199,180,0,81,38,234,0,177,19,44,1,221,210,124,1,133,242,222,1,201,82,85,2,185,43,227,2,21,20,140,3,77,8,84,4,193,113,63,5,65,46,83,6,205,151,148,7,149,140,9,9,57,119,184,10,73,87,168,12,5,202,224,14,93,19,106,17,49,39,77,20,209,178,147,23,189,38,72,27,165,192,117,31,169,149,40,36,217,156,109,41,245,185,82,47,109,200,230,53,161,166,57,61,97,65,92,69,173,159,96,78,181,238,89,88,25,142,92,99,105,28,126,111,229,131,213,124,255,189,0,0,1,168,1,0,143,107,3,0,241,158,6,0,63,35,12,0,193,61,21,0,143,182,35,0,241,252,57,0,255,81,91,0,1,250,139,0,15,117,209,0,113,191,50,1,63,154,184,1,193,220,109,2,15,207,95,3,113,142,158,4,255,123,61,6,1,182,83,8,143,156,252,10,241,97,88,14,63,167,140,18,193,37,197,23,143,101,52,30,241,129,20,38,255,251,167,47,1,156,58,59,15,98,34,73,113,134,192,89,63,138,130,109,193,88,227,132,1,14,4,0,145,33,9,0,17,44,19,0,65,238,37,0,65,79,71,0,145,67,128,0,17,247,221,0,1,70,115,1,1,146,90,2,17,1,184,3,145,53,188,5,65,143,167,8,65,6,206,12,17,178,155,18,145,15,154,26,1,26,118,37,1,76,7,52,145,158,87,71,17,157,172,96,65,166,145,129,35,81,22,0,197,158,50,0,23,185,107,0,153,246,216,0,107,137,160,1,13,196,254,2,31,1,80,5,33,217,29,9,51,108,48,15,213,162,164,24,167,103,8,39,41,253,125,60,123,181,231,91,29,119,29,137,175,160,45,201,173,142,123,0,137,230,25,1,57,150,94,2,61,22,216,4,181,99,119,9,225,40,198,17,33,3,52,32,117,72,130,56,125,87,87,96,191,91,175,2,129,216,39,6,247,132,94,13,233,254,173,27,127,139,235,54,129,183,229,104,23,3,156,193,193,12,255,14,57,106,133,34,25,238,145,75,129,120,43,158,51,225,9,84,149,139,0,0,55,152,0,0,255,165,0,0,4,181,0,0,103,197,0,0,69,215,0,0,193,234,0,0,255,255,0,0,0,0,157,62,0,64,94,62,0,192,4,62,0,128,237,62,0,64,137,62,0,0,0,0,0,192,76,63,0,0,205,61,0,0,0,0,188,21,0,0,128,187,0,0,120,0,0,0,21,0,0,0,21,0,0,0,0,154,89,63,0,0,0,0,0,0,128,63,0,0,128,63,230,71,0,0,3,0,0,0,8,0,0,0,120,0,0,0,11,0,0,0,172,93,0,0,18,72,0,0,40,22,0,0,128,7,0,0,3,0,0,0,8,24,0,0,60,24,0,0,112,24,0,0,164,24,0,0,216,24,0,0,136,1,0,0,60,72,0,0,147,94,0,0,27,96,0,0,106,28,141,56,82,187,30,58,8,105,220,58,130,237,87,59,137,99,178,59,3,42,5,60,48,220,57,60,180,62,119,60,28,163,158,60,209,242,197,60,254,134,241,60,155,171,16,61,5,173,42,61,132,194,70,61,83,230,100,61,17,137,130,61,135,159,147,61,203,178,165,61,209,190,184,61,58,191,204,61,84,175,225,61,20,138,247,61,14,37,7,62,217,244,18,62,95,49,31,62,104,215,43,62,138,227,56,62,48,82,70,62,148,31,84,62,191,71,98,62,142,198,112,62,176,151,127,62,82,91,135,62,96,15,143,62,152,229,150,62,121,219,158,62,112,238,166,62,216,27,175,62,251,96,183,62,17,187,191,62,70,39,200,62,183,162,208,62,120,42,217,62,148,187,225,62,12,83,234,62,222,237,242,62,6,137,251,62,190,16,2,63,31,90,6,63,36,159,10,63,80,222,14,63,43,22,19,63,65,69,23,63,37,106,27,63,115,131,31,63,206,143,35,63,230,141,39,63,116,124,43,63,63,90,47,63,25,38,51,63,231,222,54,63,153,131,58,63,51,19,62,63,197,140,65,63,119,239,68,63,127,58,72,63,39,109,75,63,206,134,78,63,229,134,81,63,241,108,84,63,142,56,87,63,105,233,89,63,69,127,92,63,250,249,94,63,115,89,97,63,175,157,99,63,193,198,101,63,207,212,103,63,17,200,105,63,210,160,107,63,110,95,109,63,80,4,111,63,244,143,112,63,230,2,114,63,189,93,115,63,31,161,116,63,191,205,117,63,87,228,118,63,176,229,119,63,151,210,120,63,227,171,121,63,115,114,122,63,39,39,123,63,231,202,123,63,157,94,124,63,53,227,124,63,156,89,125,63,189,194,125,63,134,31,126,63,222,112,126,63,171,183,126,63,207,244,126,63,38,41,127,63,134,85,127,63,190,122,127,63,150,153,127,63,204,178,127,63,20,199,127,63,28,215,127,63,130,227,127,63,221,236,127,63,182,243,127,63,138,248,127,63,200,251,127,63,214,253,127,63,7,255,127,63,165,255,127,63,232,255,127,63,253,255,127,63,0,0,128,63,224,1,0,0,135,136,8,59,255,255,255,255,5,0,96,0,3,0,32,0,4,0,8,0,2,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,86,76,0,0,248,52,0,0,240,0,0,0,137,136,136,59,1,0,0,0,5,0,48,0,3,0,16,0,4,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,74,0,0,248,52,0,0,120,0,0,0,136,136,8,60,2,0,0,0,5,0,24,0,3,0,8,0,2,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,73,0,0,248,52,0,0,60,0,0,0,137,136,136,60,3,0,0,0,5,0,12,0,3,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,73,0,0,248,52,0,0,255,255,127,63,142,255,127,63,106,254,127,63,147,252,127,63,7,250,127,63,200,246,127,63,214,242,127,63,48,238,127,63,214,232,127,63,200,226,127,63,7,220,127,63,147,212,127,63,107,204,127,63,143,195,127,63,0,186,127,63,189,175,127,63,199,164,127,63,29,153,127,63,192,140,127,63,176,127,127,63,236,113,127,63,118,99,127,63,75,84,127,63,110,68,127,63,222,51,127,63,154,34,127,63,163,16,127,63,250,253,126,63,157,234,126,63,141,214,126,63,203,193,126,63,86,172,126,63,46,150,126,63,83,127,126,63,198,103,126,63,134,79,126,63,148,54,126,63,239,28,126,63,152,2,126,63,143,231,125,63,211,203,125,63,102,175,125,63,70,146,125,63,116,116,125,63,241,85,125,63,188,54,125,63,213,22,125,63,60,246,124,63,242,212,124,63,246,178,124,63,73,144,124,63,235,108,124,63,219,72,124,63,27,36,124,63,169,254,123,63,135,216,123,63,180,177,123,63,48,138,123,63,252,97,123,63,23,57,123,63,130,15,123,63,61,229,122,63,72,186,122,63,162,142,122,63,77,98,122,63,72,53,122,63,148,7,122,63,48,217,121,63,29,170,121,63,90,122,121,63,233,73,121,63,200,24,121,63,249,230,120,63,123,180,120,63,78,129,120,63,115,77,120,63,234,24,120,63,178,227,119,63,205,173,119,63,58,119,119,63,249,63,119,63,10,8,119,63,110,207,118,63,37,150,118,63,47,92,118,63,140,33,118,63,60,230,117,63,64,170,117,63,151,109,117,63,66,48,117,63,65,242,116,63,148,179,116,63,59,116,116,63,55,52,116,63,135,243,115,63,44,178,115,63,38,112,115,63,118,45,115,63,26,234,114,63,20,166,114,63,100,97,114,63,10,28,114,63,5,214,113,63,87,143,113,63,0,72,113,63,255,255,112,63,85,183,112,63,2,110,112,63,6,36,112,63,98,217,111,63,21,142,111,63,32,66,111,63,132,245,110,63,63,168,110,63,83,90,110,63,192,11,110,63,134,188,109,63,165,108,109,63,29,28,109,63,239,202,108,63,27,121,108,63,161,38,108,63,128,211,107,63,187,127,107,63,80,43,107,63,64,214,106,63,140,128,106,63,50,42,106,63,53,211,105,63,147,123,105,63,77,35,105,63,100,202,104,63,216,112,104,63,168,22,104,63,213,187,103,63,96,96,103,63,72,4,103,63,143,167,102,63,51,74,102,63,54,236,101,63,151,141,101,63,87,46,101,63,119,206,100,63,245,109,100,63,212,12,100,63,18,171,99,63,177,72,99,63,176,229,98,63,16,130,98,63,209,29,98,63,243,184,97,63,119,83,97,63,92,237,96,63,164,134,96,63,78,31,96,63,91,183,95,63,203,78,95,63,158,229,94,63,213,123,94,63,112,17,94,63,110,166,93,63,210,58,93,63,154,206,92,63,198,97,92,63,89,244,91,63,81,134,91,63,174,23,91,63,114,168,90,63,157,56,90,63,46,200,89,63,39,87,89,63,135,229,88,63,79,115,88,63,127,0,88,63,23,141,87,63,24,25,87,63,130,164,86,63,86,47,86,63,147,185,85,63,58,67,85,63,75,204,84,63,199,84,84,63,174,220,83,63,1,100,83,63,191,234,82,63,233,112,82,63,127,246,81,63,130,123,81,63,242,255,80,63,207,131,80,63,26,7,80,63,210,137,79,63,250,11,79,63,144,141,78,63,148,14,78,63,9,143,77,63,237,14,77,63,65,142,76,63,5,13,76,63,59,139,75,63,225,8,75,63,249,133,74,63,131,2,74,63,127,126,73,63,238,249,72,63,207,116,72,63,36,239,71,63,237,104,71,63,41,226,70,63,218,90,70,63,0,211,69,63,155,74,69,63,172,193,68,63,50,56,68,63,47,174,67,63,162,35,67,63,141,152,66,63,239,12,66,63,200,128,65,63,26,244,64,63,229,102,64,63,40,217,63,63,229,74,63,63,27,188,62,63,204,44,62,63,247,156,61,63,157,12,61,63,190,123,60,63,92,234,59,63,117,88,59,63,10,198,58,63,29,51,58,63,173,159,57,63,187,11,57,63,71,119,56,63,81,226,55,63,218,76,55,63,227,182,54,63,107,32,54,63,116,137,53,63,253,241,52,63,7,90,52,63,147,193,51,63,160,40,51,63,48,143,50,63,66,245,49,63,216,90,49,63,241,191,48,63,142,36,48,63,175,136,47,63,85,236,46,63,129,79,46,63,50,178,45,63,105,20,45,63,39,118,44,63,107,215,43,63,55,56,43,63,139,152,42,63,103,248,41,63,204,87,41,63,186,182,40,63,50,21,40,63,51,115,39,63,191,208,38,63,214,45,38,63,121,138,37,63,167,230,36,63,97,66,36,63,169,157,35,63,125,248,34,63,223,82,34,63,207,172,33,63,77,6,33,63,91,95,32,63,248,183,31,63,37,16,31,63,226,103,30,63,48,191,29,63,16,22,29,63,129,108,28,63,132,194,27,63,26,24,27,63,67,109,26,63,0,194,25,63,81,22,25,63,54,106,24,63,177,189,23,63,193,16,23,63,103,99,22,63,163,181,21,63,118,7,21,63,225,88,20,63,228,169,19,63,127,250,18,63,179,74,18,63,128,154,17,63,231,233,16,63,232,56,16,63,132,135,15,63,187,213,14,63,142,35,14,63,254,112,13,63,10,190,12,63,179,10,12,63,250,86,11,63,223,162,10,63,99,238,9,63,134,57,9,63,73,132,8,63,172,206,7,63,175,24,7,63,84,98,6,63,155,171,5,63,131,244,4,63,15,61,4,63,61,133,3,63,15,205,2,63,134,20,2,63,161,91,1,63,97,162,0,63,143,209,255,62,167,93,254,62,14,233,252,62,194,115,251,62,198,253,249,62,27,135,248,62,193,15,247,62,186,151,245,62,6,31,244,62,168,165,242,62,158,43,241,62,236,176,239,62,145,53,238,62,144,185,236,62,232,60,235,62,154,191,233,62,169,65,232,62,21,195,230,62,223,67,229,62,8,196,227,62,145,67,226,62,124,194,224,62,200,64,223,62,120,190,221,62,140,59,220,62,6,184,218,62,230,51,217,62,46,175,215,62,223,41,214,62,249,163,212,62,125,29,211,62,110,150,209,62,204,14,208,62,151,134,206,62,210,253,204,62,125,116,203,62,153,234,201,62,39,96,200,62,40,213,198,62,159,73,197,62,138,189,195,62,236,48,194,62,198,163,192,62,25,22,191,62,230,135,189,62,45,249,187,62,241,105,186,62,50,218,184,62,241,73,183,62,47,185,181,62,238,39,180,62,47,150,178,62,242,3,177,62,57,113,175,62,4,222,173,62,86,74,172,62,47,182,170,62,144,33,169,62,122,140,167,62,239,246,165,62,239,96,164,62,124,202,162,62,151,51,161,62,64,156,159,62,122,4,158,62,68,108,156,62,161,211,154,62,145,58,153,62,22,161,151,62,48,7,150,62,225,108,148,62,41,210,146,62,11,55,145,62,135,155,143,62,158,255,141,62,81,99,140,62,162,198,138,62,145,41,137,62,32,140,135,62,80,238,133,62,34,80,132,62,151,177,130,62,176,18,129,62,222,230,126,62,169,167,123,62,195,103,120,62,47,39,117,62,238,229,113,62,4,164,110,62,115,97,107,62,60,30,104,62,98,218,100,62,232,149,97,62,207,80,94,62,26,11,91,62,204,196,87,62,230,125,84,62,107,54,81,62,93,238,77,62,191,165,74,62,146,92,71,62,218,18,68,62,151,200,64,62,206,125,61,62,128,50,58,62,174,230,54,62,93,154,51,62,141,77,48,62,66,0,45,62,125,178,41,62,66,100,38,62,145,21,35,62,110,198,31,62,219,118,28,62,218,38,25,62,109,214,21,62,152,133,18,62,91,52,15,62,186,226,11,62,183,144,8,62,84,62,5,62,148,235,1,62,240,48,253,61,6,138,246,61,113,226,239,61,51,58,233,61,79,145,226,61,207,231,219,61,181,61,213,61,3,147,206,61,192,231,199,61,242,59,193,61,156,143,186,61,195,226,179,61,108,53,173,61,155,135,166,61,85,217,159,61,159,42,153,61,126,123,146,61,246,203,139,61,11,28,133,61,135,215,124,61,70,118,111,61,93,20,98,61,214,177,84,61,185,78,71,61,16,235,57,61,229,134,44,61,64,34,31,61,44,189,17,61,178,87,4,61,181,227,237,60,96,23,211,60,118,74,184,60,11,125,157,60,50,175,130,60,250,193,79,60,254,36,26,60,42,15,201,59,153,167,59,59,46,125,214,185,210,70,113,187,171,222,227,187,166,140,39,188,129,41,93,188,225,98,137,188,160,48,164,188,236,253,190,188,179,202,217,188,224,150,244,188,49,177,7,189,147,22,21,189,140,123,34,189,19,224,47,189,30,68,61,189,165,167,74,189,157,10,88,189,254,108,101,189,190,206,114,189,234,23,128,189,27,200,134,189,237,119,141,189,92,39,148,189,99,214,154,189,253,132,161,189,38,51,168,189,217,224,174,189,17,142,181,189,202,58,188,189,254,230,194,189,170,146,201,189,200,61,208,189,84,232,214,189,74,146,221,189,164,59,228,189,93,228,234,189,114,140,241,189,221,51,248,189,154,218,254,189,82,192,2,190,252,18,6,190,71,101,9,190,50,183,12,190,186,8,16,190,221,89,19,190,152,170,22,190,234,250,25,190,208,74,29,190,71,154,32,190,78,233,35,190,225,55,39,190,0,134,42,190,166,211,45,190,211,32,49,190,131,109,52,190,181,185,55,190,101,5,59,190,147,80,62,190,58,155,65,190,90,229,68,190,240,46,72,190,249,119,75,190,116,192,78,190,93,8,82,190,179,79,85,190,115,150,88,190,156,220,91,190,42,34,95,190,27,103,98,190,109,171,101,190,31,239,104,190,44,50,108,190,148,116,111,190,84,182,114,190,106,247,117,190,211,55,121,190,141,119,124,190,150,182,127,190,117,122,129,190,69,25,131,190,185,183,132,190,208,85,134,190,136,243,135,190,225,144,137,190,218,45,139,190,112,202,140,190,164,102,142,190,116,2,144,190,223,157,145,190,228,56,147,190,129,211,148,190,182,109,150,190,129,7,152,190,226,160,153,190,215,57,155,190,95,210,156,190,121,106,158,190,35,2,160,190,94,153,161,190,38,48,163,190,125,198,164,190,96,92,166,190,206,241,167,190,198,134,169,190,71,27,171,190,80,175,172,190,224,66,174,190,245,213,175,190,143,104,177,190,173,250,178,190,77,140,180,190,110,29,182,190,16,174,183,190,48,62,185,190,207,205,186,190,234,92,188,190,130,235,189,190,148,121,191,190,31,7,193,190,35,148,194,190,159,32,196,190,145,172,197,190,248,55,199,190,211,194,200,190,34,77,202,190,226,214,203,190,19,96,205,190,181,232,206,190,197,112,208,190,66,248,209,190,45,127,211,190,131,5,213,190,67,139,214,190,109,16,216,190,255,148,217,190,249,24,219,190,89,156,220,190,29,31,222,190,70,161,223,190,211,34,225,190,193,163,226,190,16,36,228,190,190,163,229,190,204,34,231,190,56,161,232,190,0,31,234,190,36,156,235,190,162,24,237,190,122,148,238,190,171,15,240,190,51,138,241,190,18,4,243,190,70,125,244,190,207,245,245,190,170,109,247,190,217,228,248,190,88,91,250,190,40,209,251,190,71,70,253,190,181,186,254,190,56,23,0,191,187,208,0,191,228,137,1,191,178,66,2,191,37,251,2,191,59,179,3,191,246,106,4,191,83,34,5,191,83,217,5,191,245,143,6,191,56,70,7,191,29,252,7,191,162,177,8,191,199,102,9,191,140,27,10,191,240,207,10,191,243,131,11,191,147,55,12,191,209,234,12,191,172,157,13,191,36,80,14,191,56,2,15,191,232,179,15,191,50,101,16,191,24,22,17,191,151,198,17,191,176,118,18,191,99,38,19,191,174,213,19,191,145,132,20,191,13,51,21,191,31,225,21,191,200,142,22,191,8,60,23,191,221,232,23,191,72,149,24,191,72,65,25,191,220,236,25,191,4,152,26,191,192,66,27,191,15,237,27,191,240,150,28,191,99,64,29,191,104,233,29,191,254,145,30,191,37,58,31,191,220,225,31,191,35,137,32,191,250,47,33,191,95,214,33,191,82,124,34,191,212,33,35,191,227,198,35,191,127,107,36,191,167,15,37,191,92,179,37,191,157,86,38,191,104,249,38,191,191,155,39,191,160,61,40,191,11,223,40,191,255,127,41,191,125,32,42,191,131,192,42,191,17,96,43,191,39,255,43,191,196,157,44,191,232,59,45,191,146,217,45,191,195,118,46,191,121,19,47,191,180,175,47,191,115,75,48,191,183,230,48,191,127,129,49,191,203,27,50,191,153,181,50,191,234,78,51,191,189,231,51,191,18,128,52,191,232,23,53,191,63,175,53,191,22,70,54,191,110,220,54,191,69,114,55,191,156,7,56,191,113,156,56,191,197,48,57,191,150,196,57,191,230,87,58,191,178,234,58,191,252,124,59,191,194,14,60,191,3,160,60,191,193,48,61,191,250,192,61,191,173,80,62,191,219,223,62,191,131,110,63,191,165,252,63,191,64,138,64,191,83,23,65,191,224,163,65,191,228,47,66,191,96,187,66,191,83,70,67,191,190,208,67,191,158,90,68,191,246,227,68,191,194,108,69,191,5,245,69,191,188,124,70,191,232,3,71,191,137,138,71,191,157,16,72,191,37,150,72,191,32,27,73,191,142,159,73,191,111,35,74,191,193,166,74,191,134,41,75,191,188,171,75,191,99,45,76,191,122,174,76,191,2,47,77,191,250,174,77,191,98,46,78,191,57,173,78,191,126,43,79,191,51,169,79,191,85,38,80,191,230,162,80,191,228,30,81,191,80,154,81,191,40,21,82,191,109,143,82,191,30,9,83,191,59,130,83,191,195,250,83,191,183,114,84,191,22,234,84,191,223,96,85,191,18,215,85,191,176,76,86,191,183,193,86,191,39,54,87,191,0,170,87,191,66,29,88,191,236,143,88,191,254,1,89,191,120,115,89,191,89,228,89,191,162,84,90,191,81,196,90,191,102,51,91,191,226,161,91,191,195,15,92,191,10,125,92,191,183,233,92,191,200,85,93,191,62,193,93,191,24,44,94,191,87,150,94,191,249,255,94,191,255,104,95,191,104,209,95,191,51,57,96,191,98,160,96,191,243,6,97,191,229,108,97,191,58,210,97,191,240,54,98,191,8,155,98,191,128,254,98,191,89,97,99,191,146,195,99,191,44,37,100,191,37,134,100,191,126,230,100,191,55,70,101,191,78,165,101,191,197,3,102,191,154,97,102,191,205,190,102,191,94,27,103,191,77,119,103,191,154,210,103,191,68,45,104,191,75,135,104,191,174,224,104,191,111,57,105,191,139,145,105,191,4,233,105,191,217,63,106,191,9,150,106,191,148,235,106,191,123,64,107,191,188,148,107,191,89,232,107,191,79,59,108,191,160,141,108,191,75,223,108,191,79,48,109,191,173,128,109,191,101,208,109,191,117,31,110,191,223,109,110,191,161,187,110,191,187,8,111,191,46,85,111,191,248,160,111,191,27,236,111,191,149,54,112,191,103,128,112,191,144,201,112,191,15,18,113,191,230,89,113,191,19,161,113,191,151,231,113,191,113,45,114,191,160,114,114,191,38,183,114,191,1,251,114,191,50,62,115,191,184,128,115,191,148,194,115,191,196,3,116,191,73,68,116,191,34,132,116,191,80,195,116,191,210,1,117,191,168,63,117,191,210,124,117,191,80,185,117,191,33,245,117,191,69,48,118,191,189,106,118,191,136,164,118,191,166,221,118,191,22,22,119,191,217,77,119,191,239,132,119,191,87,187,119,191,17,241,119,191,29,38,120,191,122,90,120,191,42,142,120,191,43,193,120,191,125,243,120,191,33,37,121,191,22,86,121,191,92,134,121,191,242,181,121,191,218,228,121,191,18,19,122,191,154,64,122,191,115,109,122,191,157,153,122,191,22,197,122,191,223,239,122,191,248,25,123,191,97,67,123,191,26,108,123,191,34,148,123,191,122,187,123,191,32,226,123,191,23,8,124,191,92,45,124,191,240,81,124,191,211,117,124,191,5,153,124,191,134,187,124,191,85,221,124,191,115,254,124,191,223,30,125,191,154,62,125,191,163,93,125,191,250,123,125,191,159,153,125,191,146,182,125,191,211,210,125,191,98,238,125,191,63,9,126,191,105,35,126,191,225,60,126,191,167,85,126,191,186,109,126,191,27,133,126,191,201,155,126,191,196,177,126,191,13,199,126,191,162,219,126,191,133,239,126,191,181,2,127,191,50,21,127,191,252,38,127,191,19,56,127,191,118,72,127,191,39,88,127,191,36,103,127,191,110,117,127,191,5,131,127,191,232,143,127,191,25,156,127,191,149,167,127,191,95,178,127,191,116,188,127,191,215,197,127,191,133,206,127,191,129,214,127,191,200,221,127,191,93,228,127,191,61,234,127,191,106,239,127,191,227,243,127,191,169,247,127,191,187,250,127,191,25,253,127,191,196,254,127,191,187,255,127,191,250,255,127,63,57,254,127,63,169,249,127,63,75,242,127,63,30,232,127,63,35,219,127,63,89,203,127,63,193,184,127,63,91,163,127,63,40,139,127,63,39,112,127,63,90,82,127,63],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([191,49,127,63,88,14,127,63,37,232,126,63,38,191,126,63,92,147,126,63,200,100,126,63,105,51,126,63,65,255,125,63,79,200,125,63,150,142,125,63,20,82,125,63,203,18,125,63,188,208,124,63,231,139,124,63,77,68,124,63,239,249,123,63,205,172,123,63,233,92,123,63,67,10,123,63,221,180,122,63,182,92,122,63,209,1,122,63,46,164,121,63,206,67,121,63,178,224,120,63,220,122,120,63,76,18,120,63,4,167,119,63,4,57,119,63,79,200,118,63,228,84,118,63,198,222,117,63,246,101,117,63,117,234,116,63,68,108,116,63,101,235,115,63,218,103,115,63,163,225,114,63,194,88,114,63,57,205,113,63,9,63,113,63,52,174,112,63,187,26,112,63,160,132,111,63,228,235,110,63,138,80,110,63,147,178,109,63,1,18,109,63,213,110,108,63,17,201,107,63,183,32,107,63,201,117,106,63,73,200,105,63,57,24,105,63,155,101,104,63,111,176,103,63,186,248,102,63,124,62,102,63,184,129,101,63,111,194,100,63,164,0,100,63,90,60,99,63,145,117,98,63,76,172,97,63,142,224,96,63,89,18,96,63,174,65,95,63,145,110,94,63,3,153,93,63,8,193,92,63,160,230,91,63,207,9,91,63,152,42,90,63,251,72,89,63,253,100,88,63,159,126,87,63,229,149,86,63,208,170,85,63,99,189,84,63,161,205,83,63,140,219,82,63,39,231,81,63,117,240,80,63,121,247,79,63,52,252,78,63,171,254,77,63,223,254,76,63,212,252,75,63,140,248,74,63,10,242,73,63,82,233,72,63,101,222,71,63,71,209,70,63,251,193,69,63,132,176,68,63,229,156,67,63,32,135,66,63,58,111,65,63,52,85,64,63,19,57,63,63,216,26,62,63,136,250,60,63,38,216,59,63,180,179,58,63,54,141,57,63,175,100,56,63,34,58,55,63,147,13,54,63,5,223,52,63,124,174,51,63,249,123,50,63,130,71,49,63,25,17,48,63,194,216,46,63,127,158,45,63,86,98,44,63,72,36,43,63,90,228,41,63,144,162,40,63,235,94,39,63,113,25,38,63,37,210,36,63,9,137,35,63,35,62,34,63,117,241,32,63,4,163,31,63,210,82,30,63,228,0,29,63,61,173,27,63,225,87,26,63,211,0,25,63,25,168,23,63,180,77,22,63,170,241,20,63,253,147,19,63,178,52,18,63,204,211,16,63,80,113,15,63,66,13,14,63,164,167,12,63,124,64,11,63,205,215,9,63,154,109,8,63,233,1,7,63,189,148,5,63,25,38,4,63,3,182,2,63,126,68,1,63,28,163,255,62,110,186,252,62,250,206,249,62,202,224,246,62,228,239,243,62,81,252,240,62,26,6,238,62,71,13,235,62,224,17,232,62,237,19,229,62,119,19,226,62,135,16,223,62,36,11,220,62,88,3,217,62,42,249,213,62,164,236,210,62,205,221,207,62,175,204,204,62,82,185,201,62,191,163,198,62,254,139,195,62,24,114,192,62,22,86,189,62,0,56,186,62,224,23,183,62,189,245,179,62,161,209,176,62,149,171,173,62,162,131,170,62,207,89,167,62,39,46,164,62,178,0,161,62,121,209,157,62,133,160,154,62,223,109,151,62,143,57,148,62,160,3,145,62,26,204,141,62,5,147,138,62,107,88,135,62,86,28,132,62,205,222,128,62,182,63,123,62,16,191,116,62,187,59,110,62,201,181,103,62,77,45,97,62,89,162,90,62,255,20,84,62,81,133,77,62,99,243,70,62,70,95,64,62,13,201,57,62,202,48,51,62,144,150,44,62,114,250,37,62,130,92,31,62,210,188,24,62,118,27,18,62,127,120,11,62,1,212,4,62,29,92,252,61,114,13,239,61,41,188,225,61,102,104,212,61,78,18,199,61,8,186,185,61,184,95,172,61,132,3,159,61,146,165,145,61,7,70,132,61,18,202,109,61,122,5,83,61,145,62,56,61,164,117,29,61,252,170,2,61,202,189,207,60,86,35,154,60,97,14,73,60,197,167,187,59,61,122,86,186,9,70,241,187,18,221,99,188,80,138,167,188,65,36,221,188,227,93,9,189,35,40,36,189,150,240,62,189,242,182,89,189,234,122,116,189,26,158,135,189,66,253,148,189,200,90,162,189,134,182,175,189,87,16,189,189,22,104,202,189,155,189,215,189,195,16,229,189,105,97,242,189,101,175,255,189,74,125,6,190,104,33,13,190,250,195,19,190,237,100,26,190,46,4,33,190,172,161,39,190,83,61,46,190,16,215,52,190,210,110,59,190,134,4,66,190,25,152,72,190,121,41,79,190,148,184,85,190,86,69,92,190,174,207,98,190,137,87,105,190,214,220,111,190,128,95,118,190,120,223,124,190,84,174,129,190,129,235,132,190,56,39,136,190,114,97,139,190,36,154,142,190,69,209,145,190,205,6,149,190,179,58,152,190,238,108,155,190,116,157,158,190,61,204,161,190,64,249,164,190,115,36,168,190,207,77,171,190,73,117,174,190,218,154,177,190,120,190,180,190,27,224,183,190,186,255,186,190,75,29,190,190,199,56,193,190,37,82,196,190,91,105,199,190,97,126,202,190,48,145,205,190,188,161,208,190,0,176,211,190,241,187,214,190,135,197,217,190,186,204,220,190,129,209,223,190,211,211,226,190,169,211,229,190,250,208,232,190,189,203,235,190,234,195,238,190,120,185,241,190,96,172,244,190,154,156,247,190,28,138,250,190,223,116,253,190,109,46,0,191,3,161,1,191,45,18,3,191,230,129,4,191,44,240,5,191,250,92,7,191,76,200,8,191,30,50,10,191,108,154,11,191,50,1,13,191,108,102,14,191,23,202,15,191,45,44,17,191,172,140,18,191,144,235,19,191,213,72,21,191,118,164,22,191,113,254,23,191,192,86,25,191,98,173,26,191,81,2,28,191,138,85,29,191,9,167,30,191,203,246,31,191,204,68,33,191,9,145,34,191,124,219,35,191,36,36,37,191,253,106,38,191,2,176,39,191,48,243,40,191,132,52,42,191,250,115,43,191,143,177,44,191,63,237,45,191,7,39,47,191,227,94,48,191,208,148,49,191,202,200,50,191,206,250,51,191,218,42,53,191,232,88,54,191,247,132,55,191,2,175,56,191,7,215,57,191,3,253,58,191,241,32,60,191,207,66,61,191,154,98,62,191,79,128,63,191,233,155,64,191,104,181,65,191,198,204,66,191,1,226,67,191,23,245,68,191,3,6,70,191,196,20,71,191,86,33,72,191,182,43,73,191,225,51,74,191,212,57,75,191,141,61,76,191,9,63,77,191,68,62,78,191,61,59,79,191,240,53,80,191,90,46,81,191,121,36,82,191,74,24,83,191,202,9,84,191,247,248,84,191,206,229,85,191,77,208,86,191,112,184,87,191,55,158,88,191,156,129,89,191,160,98,90,191,62,65,91,191,117,29,92,191,65,247,92,191,162,206,93,191,148,163,94,191,20,118,95,191,34,70,96,191,186,19,97,191,217,222,97,191,127,167,98,191,169,109,99,191,84,49,100,191,126,242,100,191,38,177,101,191,73,109,102,191,229,38,103,191,248,221,103,191,128,146,104,191,123,68,105,191,232,243,105,191,195,160,106,191,12,75,107,191,192,242,107,191,222,151,108,191,100,58,109,191,80,218,109,191,160,119,110,191,83,18,111,191,102,170,111,191,217,63,112,191,169,210,112,191,213,98,113,191,91,240,113,191,58,123,114,191,113,3,115,191,253,136,115,191,222,11,116,191,17,140,116,191,150,9,117,191,107,132,117,191,143,252,117,191,0,114,118,191,189,228,118,191,198,84,119,191,24,194,119,191,178,44,120,191,147,148,120,191,187,249,120,191,40,92,121,191,217,187,121,191,205,24,122,191,2,115,122,191,121,202,122,191,47,31,123,191,36,113,123,191,88,192,123,191,201,12,124,191,118,86,124,191,95,157,124,191,130,225,124,191,224,34,125,191,119,97,125,191,71,157,125,191,79,214,125,191,142,12,126,191,4,64,126,191,176,112,126,191,146,158,126,191,169,201,126,191,245,241,126,191,117,23,127,191,41,58,127,191,16,90,127,191,43,119,127,191,120,145,127,191,248,168,127,191,170,189,127,191,143,207,127,191,165,222,127,191,237,234,127,191,102,244,127,191,17,251,127,191,237,254,127,191,234,255,127,63,229,248,127,63,166,230,127,63,45,201,127,63,124,160,127,63,149,108,127,63,121,45,127,63,44,227,126,63,177,141,126,63,11,45,126,63,63,193,125,63,82,74,125,63,72,200,124,63,40,59,124,63,247,162,123,63,189,255,122,63,128,81,122,63,72,152,121,63,30,212,120,63,9,5,120,63,19,43,119,63,70,70,118,63,172,86,117,63,78,92,116,63,56,87,115,63,118,71,114,63,19,45,113,63,28,8,112,63,158,216,110,63,165,158,109,63,64,90,108,63,126,11,107,63,107,178,105,63,25,79,104,63,150,225,102,63,242,105,101,63,62,232,99,63,139,92,98,63,234,198,96,63,109,39,95,63,38,126,93,63,40,203,91,63,133,14,90,63,83,72,88,63,163,120,86,63,139,159,84,63,32,189,82,63,118,209,80,63,163,220,78,63,189,222,76,63,219,215,74,63,19,200,72,63,124,175,70,63,46,142,68,63,65,100,66,63,206,49,64,63,236,246,61,63,180,179,59,63,66,104,57,63,173,20,55,63,16,185,52,63,134,85,50,63,41,234,47,63,21,119,45,63,101,252,42,63,53,122,40,63,161,240,37,63,198,95,35,63,192,199,32,63,172,40,30,63,169,130,27,63,212,213,24,63,74,34,22,63,42,104,19,63,147,167,16,63,164,224,13,63,123,19,11,63,57,64,8,63,253,102,5,63,231,135,2,63,45,70,255,62,91,113,249,62,151,145,243,62,36,167,237,62,69,178,231,62,60,179,225,62,76,170,219,62,186,151,213,62,201,123,207,62,190,86,201,62,223,40,195,62,112,242,188,62,183,179,182,62,251,108,176,62,129,30,170,62,146,200,163,62,115,107,157,62,108,7,151,62,197,156,144,62,199,43,138,62,185,180,131,62,199,111,122,62,33,107,109,62,17,92,96,62,41,67,83,62,253,32,70,62,32,246,56,62,38,195,43,62,164,136,30,62,45,71,17,62,87,255,3,62,110,99,237,61,194,189,210,61,218,14,184,61,222,87,157,61,251,153,130,61,188,172,79,61,101,28,26,61,153,10,201,60,42,167,59,60,193,120,214,186,45,68,113,188,87,215,227,188,76,129,39,189,148,15,93,189,21,74,137,189,90,6,164,189,109,187,190,189,34,104,217,189,78,11,244,189,227,81,7,190,47,152,20,190,247,215,33,190,165,16,47,190,166,65,60,190,100,106,73,190,77,138,86,190,205,160,99,190,80,173,112,190,69,175,125,190,13,83,133,190,158,200,139,190,13,56,146,190,18,161,152,190,102,3,159,190,191,94,165,190,216,178,171,190,105,255,177,190,43,68,184,190,216,128,190,190,42,181,196,190,219,224,202,190,165,3,209,190,69,29,215,190,117,45,221,190,241,51,227,190,118,48,233,190,192,34,239,190,141,10,245,190,155,231,250,190,211,92,0,191,56,64,3,191,219,29,6,191,155,245,8,191,90,199,11,191,247,146,14,191,84,88,17,191,80,23,20,191,205,207,22,191,172,129,25,191,208,44,28,191,26,209,30,191,109,110,33,191,171,4,36,191,183,147,38,191,116,27,41,191,199,155,43,191,147,20,46,191,187,133,48,191,38,239,50,191,183,80,53,191,85,170,55,191,227,251,57,191,74,69,60,191,110,134,62,191,55,191,64,191,139,239,66,191,83,23,69,191,117,54,71,191,218,76,73,191,107,90,75,191,16,95,77,191,179,90,79,191,62,77,81,191,154,54,83,191,179,22,85,191,114,237,86,191,197,186,88,191,149,126,90,191,208,56,92,191,98,233,93,191,56,144,95,191,64,45,97,191,103,192,98,191,156,73,100,191,206,200,101,191,235,61,103,191,227,168,104,191,167,9,106,191,39,96,107,191,84,172,108,191,31,238,109,191,122,37,111,191,88,82,112,191,171,116,113,191,103,140,114,191,127,153,115,191,231,155,116,191,149,147,117,191,126,128,118,191,150,98,119,191,212,57,120,191,47,6,121,191,158,199,121,191,23,126,122,191,148,41,123,191,13,202,123,191,122,95,124,191,213,233,124,191,24,105,125,191,62,221,125,191,64,70,126,191,28,164,126,191,204,246,126,191,77,62,127,191,156,122,127,191,182,171,127,191,153,209,127,191,67,236,127,191,180,251,127,191,166,255,127,63,148,227,127,63,156,154,127,63,204,36,127,63,56,130,126,63,253,178,125,63,63,183,124,63,42,143,123,63,243,58,122,63,212,186,120,63,17,15,119,63,246,55,117,63,213,53,115,63,8,9,113,63,241,177,110,63,249,48,108,63,144,134,105,63,47,179,102,63,83,183,99,63,132,147,96,63,78,72,93,63,69,214,89,63,3,62,86,63,43,128,82,63,101,157,78,63,94,150,74,63,204,107,70,63,106,30,66,63,249,174,61,63,64,30,57,63,13,109,52,63,50,156,47,63,135,172,42,63,235,158,37,63,63,116,32,63,109,45,27,63,97,203,21,63,13,79,16,63,104,185,10,63,107,11,5,63,46,140,254,62,221,212,242,62,241,242,230,62,127,232,218,62,166,183,206,62,136,98,194,62,78,235,181,62,42,84,169,62,81,159,156,62,253,206,143,62,109,229,130,62,206,201,107,62,98,159,81,62,48,80,55,62,211,224,28,62,241,85,2,62,98,104,207,61,124,0,154,61,36,251,72,61,27,164,187,60,243,119,86,187,100,61,241,188,187,192,99,189,103,93,167,189,20,189,220,189,3,251,8,190,115,127,35,190,52,231,61,190,164,45,88,190,38,78,114,190,18,34,134,190,137,5,147,190,52,207,159,190,213,124,172,190,51,12,185,190,26,123,197,190,91,199,209,190,205,238,221,190,80,239,233,190,199,198,245,190,144,185,0,191,38,121,6,191,36,33,12,191,141,176,17,191,102,38,23,191,186,129,28,191,152,193,33,191,21,229,38,191,74,235,43,191,86,211,48,191,91,156,53,191,131,69,58,191,253,205,62,191,252,52,67,191,188,121,71,191,125,155,75,191,132,153,79,191,31,115,83,191,161,39,87,191,99,182,90,191,198,30,94,191,48,96,97,191,15,122,100,191,216,107,103,191,7,53,106,191,31,213,108,191,169,75,111,191,55,152,113,191,98,186,115,191,201,177,117,191,22,126,119,191,246,30,121,191,33,148,122,191,85,221,123,191,89,250,124,191,250,234,125,191,14,175,126,191,116,70,127,191,15,177,127,191,206,238,127,191,0,0,128,63,0,0,0,128,99,250,127,63,191,117,86,188,139,233,127,63,10,113,214,188,121,205,127,63,231,206,32,189,47,166,127,63,58,94,86,189,175,115,127,63,19,242,133,189,249,53,127,63,42,175,160,189,18,237,126,63,51,101,187,189,253,152,126,63,4,19,214,189,188,57,126,63,115,183,240,189,85,207,125,63,168,168,5,190,203,89,125,63,187,239,18,190,37,217,124,63,92,48,32,190,103,77,124,63,245,105,45,190,152,182,123,63,243,155,58,190,190,20,123,63,194,197,71,190,226,103,122,63,205,230,84,190,9,176,121,63,130,254,97,190,60,237,120,63,77,12,111,190,132,31,120,63,156,15,124,190,234,70,119,63,238,131,132,190,119,99,118,63,62,250,138,190,54,117,117,63,117,106,145,190,48,124,116,63,76,212,151,190,113,120,115,63,122,55,158,190,3,106,114,63,183,147,164,190,244,80,113,63,188,232,170,190,79,45,112,63,65,54,177,190,33,255,110,63,1,124,183,190,118,198,109,63,180,185,189,190,94,131,108,63,21,239,195,190,231,53,107,63,222,27,202,190,30,222,105,63,201,63,208,190,18,124,104,63,146,90,214,190,212,15,103,63,243,107,220,190,116,153,101,63,170,115,226,190,1,25,100,63,113,113,232,190,141,142,98,63,7,101,238,190,40,250,96,63,39,78,244,190,230,91,95,63,144,44,250,190,215,179,93,63,0,0,0,191,15,2,92,63,27,228,2,191,160,70,90,63,119,194,5,191,158,129,88,63,246,154,8,191,29,179,86,63,119,109,11,191,49,219,84,63,218,57,14,191,239,249,82,63,0,0,17,191,108,15,81,63,202,191,19,191,189,27,79,63,24,121,22,191,248,30,77,63,205,43,25,191,52,25,75,63,202,215,27,191,136,10,73,63,241,124,30,191,10,243,70,63,36,27,33,191,209,210,68,63,70,178,35,191,247,169,66,63,58,66,38,191,147,120,64,63,227,202,40,191,189,62,62,63,37,76,43,191,143,252,59,63,227,197,45,191,34,178,57,63,1,56,48,191,144,95,55,63,101,162,50,191,243,4,53,63,243,4,53,191,101,162,50,63,144,95,55,191,1,56,48,63,34,178,57,191,227,197,45,63,143,252,59,191,37,76,43,63,189,62,62,191,227,202,40,63,147,120,64,191,58,66,38,63,247,169,66,191,70,178,35,63,209,210,68,191,36,27,33,63,10,243,70,191,241,124,30,63,136,10,73,191,202,215,27,63,52,25,75,191,205,43,25,63,248,30,77,191,24,121,22,63,189,27,79,191,202,191,19,63,108,15,81,191,0,0,17,63,239,249,82,191,218,57,14,63,49,219,84,191,119,109,11,63,29,179,86,191,246,154,8,63,158,129,88,191,119,194,5,63,160,70,90,191,27,228,2,63,15,2,92,191,0,0,0,63,215,179,93,191,144,44,250,62,230,91,95,191,39,78,244,62,40,250,96,191,7,101,238,62,141,142,98,191,113,113,232,62,1,25,100,191,170,115,226,62,116,153,101,191,243,107,220,62,212,15,103,191,146,90,214,62,18,124,104,191,201,63,208,62,30,222,105,191,222,27,202,62,231,53,107,191,21,239,195,62,94,131,108,191,180,185,189,62,118,198,109,191,1,124,183,62,33,255,110,191,65,54,177,62,79,45,112,191,188,232,170,62,244,80,113,191,183,147,164,62,3,106,114,191,122,55,158,62,113,120,115,191,76,212,151,62,48,124,116,191,117,106,145,62,54,117,117,191,62,250,138,62,119,99,118,191,238,131,132,62,234,70,119,191,156,15,124,62,132,31,120,191,77,12,111,62,60,237,120,191,130,254,97,62,9,176,121,191,205,230,84,62,226,103,122,191,194,197,71,62,190,20,123,191,243,155,58,62,152,182,123,191,245,105,45,62,103,77,124,191,92,48,32,62,37,217,124,191,187,239,18,62,203,89,125,191,168,168,5,62,85,207,125,191,115,183,240,61,188,57,126,191,4,19,214,61,253,152,126,191,51,101,187,61,18,237,126,191,42,175,160,61,249,53,127,191,19,242,133,61,175,115,127,191,58,94,86,61,47,166,127,191,231,206,32,61,121,205,127,191,10,113,214,60,139,233,127,191,191,117,86,60,99,250,127,191,0,48,141,36,0,0,128,191,191,117,86,188,99,250,127,191,10,113,214,188,139,233,127,191,231,206,32,189,121,205,127,191,58,94,86,189,47,166,127,191,19,242,133,189,175,115,127,191,42,175,160,189,249,53,127,191,51,101,187,189,18,237,126,191,4,19,214,189,253,152,126,191,115,183,240,189,188,57,126,191,168,168,5,190,85,207,125,191,187,239,18,190,203,89,125,191,92,48,32,190,37,217,124,191,245,105,45,190,103,77,124,191,243,155,58,190,152,182,123,191,194,197,71,190,190,20,123,191,205,230,84,190,226,103,122,191,130,254,97,190,9,176,121,191,77,12,111,190,60,237,120,191,156,15,124,190,132,31,120,191,238,131,132,190,234,70,119,191,62,250,138,190,119,99,118,191,117,106,145,190,54,117,117,191,76,212,151,190,48,124,116,191,122,55,158,190,113,120,115,191,183,147,164,190,3,106,114,191,188,232,170,190,244,80,113,191,65,54,177,190,79,45,112,191,1,124,183,190,33,255,110,191,180,185,189,190,118,198,109,191,21,239,195,190,94,131,108,191,222,27,202,190,231,53,107,191,201,63,208,190,30,222,105,191,146,90,214,190,18,124,104,191,243,107,220,190,212,15,103,191,170,115,226,190,116,153,101,191,113,113,232,190,1,25,100,191,7,101,238,190,141,142,98,191,39,78,244,190,40,250,96,191,144,44,250,190,230,91,95,191,0,0,0,191,215,179,93,191,27,228,2,191,15,2,92,191,119,194,5,191,160,70,90,191,246,154,8,191,158,129,88,191,119,109,11,191,29,179,86,191,218,57,14,191,49,219,84,191,0,0,17,191,239,249,82,191,202,191,19,191,108,15,81,191,24,121,22,191,189,27,79,191,205,43,25,191,248,30,77,191,202,215,27,191,52,25,75,191,241,124,30,191,136,10,73,191,36,27,33,191,10,243,70,191,70,178,35,191,209,210,68,191,58,66,38,191,247,169,66,191,227,202,40,191,147,120,64,191,37,76,43,191,189,62,62,191,227,197,45,191,143,252,59,191,1,56,48,191,34,178,57,191,101,162,50,191,144,95,55,191,243,4,53,191,243,4,53,191,144,95,55,191,101,162,50,191,34,178,57,191,1,56,48,191,143,252,59,191,227,197,45,191,189,62,62,191,37,76,43,191,147,120,64,191,227,202,40,191,247,169,66,191,58,66,38,191,209,210,68,191,70,178,35,191,10,243,70,191,36,27,33,191,136,10,73,191,241,124,30,191,52,25,75,191,202,215,27,191,248,30,77,191,205,43,25,191,189,27,79,191,24,121,22,191,108,15,81,191,202,191,19,191,239,249,82,191,0,0,17,191,49,219,84,191,218,57,14,191,29,179,86,191,119,109,11,191,158,129,88,191,246,154,8,191,160,70,90,191,119,194,5,191,15,2,92,191,27,228,2,191,215,179,93,191,0,0,0,191,230,91,95,191,144,44,250,190,40,250,96,191,39,78,244,190,141,142,98,191,7,101,238,190,1,25,100,191,113,113,232,190,116,153,101,191,170,115,226,190,212,15,103,191,243,107,220,190,18,124,104,191,146,90,214,190,30,222,105,191,201,63,208,190,231,53,107,191,222,27,202,190,94,131,108,191,21,239,195,190,118,198,109,191,180,185,189,190,33,255,110,191,1,124,183,190,79,45,112,191,65,54,177,190,244,80,113,191,188,232,170,190,3,106,114,191,183,147,164,190,113,120,115,191,122,55,158,190,48,124,116,191,76,212,151,190,54,117,117,191,117,106,145,190,119,99,118,191,62,250,138,190,234,70,119,191,238,131,132,190,132,31,120,191,156,15,124,190,60,237,120,191,77,12,111,190,9,176,121,191,130,254,97,190,226,103,122,191,205,230,84,190,190,20,123,191,194,197,71,190,152,182,123,191,243,155,58,190,103,77,124,191,245,105,45,190,37,217,124,191,92,48,32,190,203,89,125,191,187,239,18,190,85,207,125,191,168,168,5,190,188,57,126,191,115,183,240,189,253,152,126,191,4,19,214,189,18,237,126,191,51,101,187,189,249,53,127,191,42,175,160,189,175,115,127,191,19,242,133,189,47,166,127,191,58,94,86,189,121,205,127,191,231,206,32,189,139,233,127,191,10,113,214,188,99,250,127,191,191,117,86,188,0,0,128,191,0,48,13,165,99,250,127,191,191,117,86,60,139,233,127,191,10,113,214,60,121,205,127,191,231,206,32,61,47,166,127,191,58,94,86,61,175,115,127,191,19,242,133,61,249,53,127,191,42,175,160,61,18,237,126,191,51,101,187,61,253,152,126,191,4,19,214,61,188,57,126,191,115,183,240,61,85,207,125,191,168,168,5,62,203,89,125,191,187,239,18,62,37,217,124,191,92,48,32,62,103,77,124,191,245,105,45,62,152,182,123,191,243,155,58,62,190,20,123,191,194,197,71,62,226,103,122,191,205,230,84,62,9,176,121,191,130,254,97,62,60,237,120,191,77,12,111,62,132,31,120,191,156,15,124,62,234,70,119,191,238,131,132,62,119,99,118,191,62,250,138,62,54,117,117,191,117,106,145,62,48,124,116,191,76,212,151,62,113,120,115,191,122,55,158,62,3,106,114,191,183,147,164,62,244,80,113,191,188,232,170,62,79,45,112,191,65,54,177,62,33,255,110,191,1,124,183,62,118,198,109,191,180,185,189,62,94,131,108,191,21,239,195,62,231,53,107,191,222,27,202,62,30,222,105,191,201,63,208,62,18,124,104,191,146,90,214,62,212,15,103,191,243,107,220,62,116,153,101,191,170,115,226,62,1,25,100,191,113,113,232,62,141,142,98,191,7,101,238,62,40,250,96,191,39,78,244,62,230,91,95,191,144,44,250,62,215,179,93,191,0,0,0,63,15,2,92,191,27,228,2,63,160,70,90,191,119,194,5,63,158,129,88,191,246,154,8,63,29,179,86,191,119,109,11,63,49,219,84,191,218,57,14,63,239,249,82,191,0,0,17,63,108,15,81,191,202,191,19,63,189,27,79,191,24,121,22,63,248,30,77,191,205,43,25,63,52,25,75,191,202,215,27,63,136,10,73,191,241,124,30,63,10,243,70,191,36,27,33,63,209,210,68,191,70,178,35,63,247,169,66,191,58,66,38,63,147,120,64,191,227,202,40,63,189,62,62,191,37,76,43,63,143,252,59,191,227,197,45,63,34,178,57,191,1,56,48,63,144,95,55,191,101,162,50,63,243,4,53,191,243,4,53,63,101,162,50,191,144,95,55,63,1,56,48,191,34,178,57,63,227,197,45,191,143,252,59,63,37,76,43,191,189,62,62,63,227,202,40,191,147,120,64,63,58,66,38,191,247,169,66,63,70,178,35,191,209,210,68,63,36,27,33,191,10,243,70,63,241,124,30,191,136,10,73,63,202,215,27,191,52,25,75,63,205,43,25,191,248,30,77,63,24,121,22,191,189,27,79,63,202,191,19,191,108,15,81,63,0,0,17,191,239,249,82,63,218,57,14,191,49,219,84,63,119,109,11,191,29,179,86,63,246,154,8,191,158,129,88,63,119,194,5,191,160,70,90,63,27,228,2,191,15,2,92,63,0,0,0,191,215,179,93,63,144,44,250,190,230,91,95,63,39,78,244,190,40,250,96,63,7,101,238,190,141,142,98,63,113,113,232,190,1,25,100,63,170,115,226,190,116,153,101,63,243,107,220,190,212,15,103,63,146,90,214,190,18,124,104,63,201,63,208,190,30,222,105,63,222,27,202,190,231,53,107,63,21,239,195,190,94,131,108,63,180,185,189,190,118,198,109,63,1,124,183,190,33,255,110,63,65,54,177,190,79,45,112,63,188,232,170,190,244,80,113,63,183,147,164,190,3,106,114,63,122,55,158,190,113,120,115,63,76,212,151,190,48,124,116,63,117,106,145,190,54,117,117,63,62,250,138,190,119,99,118,63,238,131,132,190,234,70,119,63,156,15,124,190,132,31,120,63,77,12,111,190,60,237,120,63,130,254,97,190,9,176,121,63,205,230,84,190,226,103,122,63,194,197,71,190,190,20,123,63,243,155,58,190,152,182,123,63,245,105,45,190,103,77,124,63,92,48,32,190,37,217,124,63,187,239,18,190,203,89,125,63,168,168,5,190,85,207,125,63,115,183,240,189,188,57,126,63,4,19,214,189,253,152,126,63,51,101,187,189,18,237,126,63,42,175,160,189,249,53,127,63,19,242,133,189,175,115,127,63,58,94,86,189,47,166,127,63,231,206,32,189,121,205,127,63,10,113,214,188,139,233,127,63,191,117,86,188,99,250,127,63,0,200,83,165,0,0,128,63,191,117,86,60,99,250,127,63,10,113,214,60,139,233,127,63,231,206,32,61,121,205,127,63,58,94,86,61,47,166,127,63,19,242,133,61,175,115,127,63,42,175,160,61,249,53,127,63,51,101,187,61,18,237,126,63,4,19,214,61,253,152,126,63,115,183,240,61,188,57,126,63,168,168,5,62,85,207,125,63,187,239,18,62,203,89,125,63,92,48,32,62,37,217,124,63,245,105,45,62,103,77,124,63,243,155,58,62,152,182,123,63,194,197,71,62,190,20,123,63,205,230,84,62,226,103,122,63,130,254,97,62,9,176,121,63,77,12,111,62,60,237,120,63,156,15,124,62,132,31,120,63,238,131,132,62,234,70,119,63,62,250,138,62,119,99,118,63,117,106,145,62,54,117,117,63,76,212,151,62,48,124,116,63,122,55,158,62,113,120,115,63,183,147,164,62,3,106,114,63,188,232,170,62,244,80,113,63,65,54,177,62,79,45,112,63,1,124,183,62,33,255,110,63,180,185,189,62,118,198,109,63,21,239,195,62,94,131,108,63,222,27,202,62,231,53,107,63,201,63,208,62,30,222,105,63,146,90,214,62,18,124,104,63,243,107,220,62,212,15,103,63,170,115,226,62,116,153,101,63,113,113,232,62,1,25,100,63,7,101,238,62,141,142,98,63,39,78,244,62,40,250,96,63,144,44,250,62,230,91,95,63,0,0,0,63,215,179,93,63,27,228,2,63,15,2,92,63,119,194,5,63,160,70,90,63,246,154,8,63,158,129,88,63,119,109,11,63,29,179,86,63,218,57,14,63,49,219,84,63,0,0,17,63,239,249,82,63,202,191,19,63,108,15,81,63,24,121,22,63,189,27,79,63,205,43,25,63,248,30,77,63,202,215,27,63,52,25,75,63,241,124,30,63,136,10,73,63,36,27,33,63,10,243,70,63,70,178,35,63,209,210,68,63,58,66,38,63,247,169,66,63,227,202,40,63,147,120,64,63,37,76,43,63,189,62,62,63,227,197,45,63,143,252,59,63,1,56,48,63,34,178,57,63,101,162,50,63,144,95,55,63,243,4,53,63,243,4,53,63,144,95,55,63,101,162,50,63,34,178,57,63,1,56,48,63,143,252,59,63,227,197,45,63,189,62,62,63,37,76,43,63,147,120,64,63,227,202,40,63,247,169,66,63,58,66,38,63,209,210,68,63,70,178,35,63,10,243,70,63,36,27,33,63,136,10,73,63,241,124,30,63,52,25,75,63,202,215,27,63,248,30,77,63,205,43,25,63,189,27,79,63,24,121,22,63,108,15,81,63,202,191,19,63,239,249,82,63,0,0,17,63,49,219,84,63,218,57,14,63,29,179,86,63,119,109,11,63,158,129,88,63,246,154,8,63,160,70,90,63,119,194,5,63,15,2,92,63,27,228,2,63,215,179,93,63,0,0,0,63,230,91,95,63,144,44,250,62,40,250,96,63,39,78,244,62,141,142,98,63,7,101,238,62,1,25,100,63,113,113,232,62,116,153,101,63,170,115,226,62,212,15,103,63,243,107,220,62,18,124,104,63,146,90,214,62,30,222,105,63,201,63,208,62,231,53,107,63,222,27,202,62,94,131,108,63,21,239,195,62,118,198,109,63,180,185,189,62,33,255,110,63,1,124,183,62,79,45,112,63,65,54,177,62,244,80,113,63,188,232,170,62,3,106,114,63,183,147,164,62,113,120,115,63,122,55,158,62,48,124,116,63,76,212,151,62,54,117,117,63,117,106,145,62,119,99,118,63,62,250,138,62,234,70,119,63,238,131,132,62,132,31,120,63,156,15,124,62,60,237,120,63,77,12,111,62,9,176,121,63,130,254,97,62,226,103,122,63,205,230,84,62,190,20,123,63,194,197,71,62,152,182,123,63,243,155,58,62,103,77,124,63,245,105,45,62,37,217,124,63,92,48,32,62,203,89,125,63,187,239,18,62,85,207,125,63,168,168,5,62,188,57,126,63,115,183,240,61,253,152,126,63,4,19,214,61,18,237,126,63,51,101,187,61,249,53,127,63,42,175,160,61,175,115,127,63,19,242,133,61,47,166,127,63,58,94,86,61,121,205,127,63,231,206,32,61,139,233,127,63,10,113,214,60,99,250,127,63,191,117,86,60,0,0,102,63,0,0,76,63,0,0,38,63,0,0,0,63,0,134,107,63,0,20,46,63,0,112,189,62,0,208,76,62,6,0,0,0,4,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250,0,3,0,6,0,3,0,3,0,3,0,4,0,3,0,3,0,3,0,205,1,100,0,3,0,40,0,3,0,3,0,3,0,5,0,14,0,14,0,10,0,11,0,3,0,8,0,9,0,7,0,3,0,91,1,92,202,190,216,182,223,154,226,156,230,120,236,122,244,204,252,52,3,134,11,136,19,100,25,102,29,74,32,66,39,164,53,100,0,240,0,32,0,100,0,205,60,0,48,0,32,0,32,254,31,246,31,234,31,216,31,194,31,168,31,136,31,98,31,58,31,10,31,216,30,160,30,98,30,34,30,220,29,144,29,66,29,238,28,150,28,58,28,216,27,114,27,10,27,156,26,42,26,180,25,58,25,188,24,60,24,182,23,46,23,160,22,16,22,126,21,232,20,78,20,176,19,16,19,110,18,200,17,30,17,116,16,198,15,22,15,100,14,174,13,248,12,64,12,132,11,200,10,10,10,74,9,138,8,198,7,2,7,62,6,120,5,178,4,234,3,34,3,90,2,146,1,202,0,0,0,54,255,110,254,166,253,222,252,22,252,78,251,136,250,194,249,254,248,58,248,118,247,182,246,246,245,56,245,124,244,192,243,8,243,82,242,156,241,234,240,58,240,140,239,226,238,56,238,146,237,240,236,80,236,178,235,24,235,130,234,240,233,96,233,210,232,74,232,196,231,68,231,198,230,76,230,214,229,100,229,246,228,142,228,40,228,198,227,106,227,18,227,190,226,112,226,36,226,222,225,158,225,96,225,40,225,246,224,198,224,158,224,120,224,88,224,62,224,40,224,22,224,10,224,2,224,0,224,42,175,213,201,207,255,64,0,17,0,99,255,97,1,16,254,163,0,39,43,189,86,217,255,6,0,91,0,86,255,186,0,23,0,128,252,192,24,216,77,237,255,220,255,102,0,167,255,232,255,72,1,73,252,8,10,37,62,135,199,61,201,64,0,128,0,134,255,36,0,54,1,0,253,72,2,51,36,69,69,12,0,128,0,18,0,114,255,32,1,139,255,159,252,27,16,123,56,104,2,13,200,246,255,39,0,58,0,210,255,172,255,120,0,184,0,197,254,227,253,4,5,4,21,64,35,230,62,198,196,243,255,0,0,20,0,26,0,5,0,225,255,213,255,252,255,65,0,90,0,7,0,99,255,8,255,212,255,81,2,47,6,52,10,199,12,228,87,5,197,3,0,242,255,236,255,241,255,2,0,25,0,37,0,25,0,240,255,185,255,149,255,177,255,50,0,36,1,111,2,214,3,8,5,184,5,148,107,103,196,17,0,12,0,8,0,1,0,246,255,234,255,226,255,224,255,234,255,3,0,44,0,100,0,168,0,243,0,61,1,125,1,173,1,199,1,189,0,168,253,105,2,103,119,117,0,97,255,210,251,8,116,52,0,221,0,168,246,116,110,252,255,17,2,234,242,229,102,208,255,246,2,140,240,165,93,176,255,137,3,117,239,6,83,157,255,204,3,130,239,102,71,149,255,199,3,139,240,39,59,153,255,128,3,97,242,174,46,165,255,5,3,207,244,94,34,185,255,99,2,161,247,152,22,210,255,169,1,161,250,180,11,0,64,202,69,27,76,255,82,130,90,179,98,162,107,96,117,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,10,0,12,0,14,0,16,0,20,0,24,0,28,0,34,0,40,0,48,0,60,0,78,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,8,0,8,0,16,0,16,0,16,0,21,0,21,0,24,0,29,0,34,0,36,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,41,0,41,0,41,0,82,0,82,0,123,0,164,0,200,0,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,41,0,41,0,41,0,123,0,123,0,123,0,164,0,164,0,240,0,10,1,27,1,39,1,41,0,41,0,41,0,41,0,41,0,41,0,41,0,41,0,123,0,123,0,123,0,123,0,240,0,240,0,240,0,10,1,10,1,49,1,62,1,72,1,80,1,123,0,123,0,123,0,123,0,123,0,123,0,123,0,123,0,240,0,240,0,240,0,240,0,49,1,49,1,49,1,62,1,62,1,87,1,95,1,102,1,108,1,240,0,240,0,240,0,240,0,240,0,240,0,240,0,240,0,49,1,49,1,49,1,49,1,87,1,87,1,87,1,95,1,95,1,114,1,120,1,126,1,131,1,0,0,12,0,24,0,36,0,48,0,4,0,16,0,28,0,40,0,52,0,8,0,20,0,32,0,44,0,56,0,1,0,13,0,25,0,37,0,49,0,5,0,17,0,29,0,41,0,53,0,9,0,21,0,33,0,45,0,57,0,2,0,14,0,26,0,38,0,50,0,6,0,18,0,30,0,42,0,54,0,10,0,22,0,34,0,46,0,58,0,3,0,15,0,27,0,39,0,51,0,7,0,19,0,31,0,43,0,55,0,11,0,23,0,35,0,47,0,59,0,0,0,24,0,48,0,72,0,96,0,8,0,32,0,56,0,80,0,104,0,16,0,40,0,64,0,88,0,112,0,4,0,28,0,52,0,76,0,100,0,12,0,36,0,60,0,84,0,108,0,20,0,44,0,68,0,92,0,116,0,1,0,25,0,49,0,73,0,97,0,9,0,33,0,57,0,81,0,105,0,17,0,41,0,65,0,89,0,113,0,5,0,29,0,53,0,77,0,101,0,13,0,37,0,61,0,85,0,109,0,21,0,45,0,69,0,93,0,117,0,2,0,26,0,50,0,74,0,98,0,10,0,34,0,58,0,82,0,106,0,18,0,42,0,66,0,90,0,114,0,6,0,30,0,54,0,78,0,102,0,14,0,38,0,62,0,86,0,110,0,22,0,46,0,70,0,94,0,118,0,3,0,27,0,51,0,75,0,99,0,11,0,35,0,59,0,83,0,107,0,19,0,43,0,67,0,91,0,115,0,7,0,31,0,55,0,79,0,103,0,15,0,39,0,63,0,87,0,111,0,23,0,47,0,71,0,95,0,119,0,0,0,48,0,96,0,144,0,192,0,16,0,64,0,112,0,160,0,208,0,32,0,80,0,128,0,176,0,224,0,4,0,52,0,100,0,148,0,196,0,20,0,68,0,116,0,164,0,212,0,36,0,84,0,132,0,180,0,228,0,8,0,56,0,104,0,152,0,200,0,24,0,72,0,120,0,168,0,216,0,40,0,88,0,136,0,184,0,232,0,12,0,60,0,108,0,156,0,204,0,28,0,76,0,124,0,172,0,220,0,44,0,92,0,140,0,188,0,236,0,1,0,49,0,97,0,145,0,193,0,17,0,65,0,113,0,161,0,209,0,33,0,81,0,129,0,177,0,225,0,5,0,53,0,101,0,149,0,197,0,21,0,69,0,117,0,165,0,213,0,37,0,85,0,133,0,181,0,229,0,9,0,57,0,105,0,153,0,201,0,25,0,73,0,121,0,169,0,217,0,41,0,89,0,137,0,185,0,233,0,13,0,61,0,109,0,157,0,205,0,29,0,77,0,125,0,173,0,221,0,45,0,93,0,141,0,189,0,237,0,2,0,50,0,98,0,146,0,194,0,18,0,66,0,114,0,162,0,210,0,34,0,82,0,130,0,178,0,226,0,6,0,54,0,102,0,150,0,198,0,22,0,70,0,118,0,166,0,214,0,38,0,86,0,134,0,182,0,230,0,10,0,58,0,106,0,154,0,202,0,26,0,74,0,122,0,170,0,218,0,42,0,90,0,138,0,186,0,234,0,14,0,62,0,110,0,158,0,206,0,30,0,78,0,126,0,174,0,222,0,46,0,94,0,142,0,190,0,238,0,3,0,51,0,99,0,147,0,195,0,19,0,67,0,115,0,163,0,211,0,35,0,83,0,131,0,179,0,227,0,7,0,55,0,103,0,151,0,199,0,23,0,71,0,119,0,167,0,215,0,39,0,87,0,135,0,183,0,231,0,11,0,59,0,107,0,155,0,203,0,27,0,75,0,123,0,171,0,219,0,43,0,91,0,139,0,187,0,235,0,15,0,63,0,111,0,159,0,207,0,31,0,79,0,127,0,175,0,223,0,47,0,95,0,143,0,191,0,239,0,0,0,96,0,192,0,32,1,128,1,32,0,128,0,224,0,64,1,160,1,64,0,160,0,0,1,96,1,192,1,8,0,104,0,200,0,40,1,136,1,40,0,136,0,232,0,72,1,168,1,72,0,168,0,8,1,104,1,200,1,16,0,112,0,208,0,48,1,144,1,48,0,144,0,240,0,80,1,176,1,80,0,176,0,16,1,112,1,208,1,24,0,120,0,216,0,56,1,152,1,56,0,152,0,248,0,88,1,184,1,88,0,184,0,24,1,120,1,216,1,4,0,100,0,196,0,36,1,132,1,36,0,132,0,228,0,68,1,164,1,68,0,164,0,4,1,100,1,196,1,12,0,108,0,204,0,44,1,140,1,44,0,140,0,236,0,76,1,172,1,76,0,172,0,12,1,108,1,204,1,20,0,116,0,212,0,52,1,148,1,52,0,148,0,244,0,84,1,180,1,84,0,180,0,20,1,116,1,212,1,28,0,124,0,220,0,60,1,156,1,60,0,156,0,252,0,92,1,188,1,92,0,188,0,28,1,124,1,220,1,1,0,97,0,193,0,33,1,129,1,33,0,129,0,225,0,65,1,161,1,65,0,161,0,1,1,97,1,193,1,9,0,105,0,201,0,41,1,137,1,41,0,137,0,233,0,73,1,169,1,73,0,169,0,9,1,105,1,201,1,17,0,113,0,209,0,49,1,145,1,49,0,145,0,241,0,81,1,177,1,81,0,177,0,17,1,113,1,209,1,25,0,121,0,217,0,57,1,153,1,57,0,153,0,249,0,89,1,185,1,89,0,185,0,25,1,121,1,217,1,5,0,101,0,197,0,37,1,133,1,37,0,133,0,229,0,69,1,165,1,69,0,165,0,5,1,101,1,197,1,13,0,109,0,205,0,45,1,141,1,45,0,141,0,237,0,77,1,173,1,77,0,173,0,13,1,109,1,205,1,21,0,117,0,213,0,53,1,149,1,53,0,149,0,245,0,85,1,181,1,85,0,181,0,21,1,117,1,213,1,29,0,125,0,221,0,61,1,157,1,61,0,157,0,253,0,93,1,189,1,93,0,189,0,29,1,125,1,221,1,2,0,98,0,194,0,34,1,130,1,34,0,130,0,226,0,66,1,162,1,66,0,162,0,2,1,98,1,194,1,10,0,106,0,202,0,42,1,138,1,42,0,138,0,234,0,74,1,170,1,74,0,170,0,10,1,106,1,202,1,18,0,114,0,210,0,50,1,146,1,50,0,146,0,242,0,82,1,178,1,82,0,178,0,18,1,114,1,210,1,26,0,122,0,218,0,58,1,154,1,58,0,154,0,250,0,90,1,186,1,90,0,186,0,26,1,122,1,218,1,6,0,102,0,198,0,38,1,134,1,38,0,134,0,230,0,70,1,166,1,70,0,166,0,6,1,102,1,198,1,14,0,110,0,206,0,46,1,142,1,46,0,142,0,238,0,78,1,174,1,78,0,174,0,14,1,110,1,206,1,22,0,118,0,214,0,54,1,150,1,54,0,150,0,246,0,86,1,182,1,86,0,182,0,22,1,118,1,214,1,30,0,126,0,222,0,62,1,158,1,62,0,158,0,254,0,94,1,190,1,94,0,190,0,30,1,126,1,222,1,3,0,99,0,195,0,35,1,131,1,35,0,131,0,227,0,67,1,163,1,67,0,163,0,3,1,99,1,195,1,11,0,107,0,203,0,43,1,139,1,43,0,139,0,235,0,75,1,171,1,75,0,171,0,11,1,107,1,203,1,19,0,115,0,211,0,51,1,147,1,51,0,147,0,243,0,83,1,179,1,83,0,179,0,19,1,115,1,211,1,27,0,123,0,219,0,59,1,155,1,59,0,155,0,251,0,91,1,187,1,91,0,187,0,27,1,123,1,219,1,7,0,103,0,199,0,39,1,135,1,39,0,135,0,231,0,71,1,167,1,71,0,167,0,7,1,103,1,199,1,15,0,111,0,207,0,47,1,143,1,47,0,143,0,239,0,79,1,175,1,79,0,175,0,15,1,111,1,207,1,23,0,119,0,215,0,55,1,151,1,55,0,151,0,247,0,87,1,183,1,87,0,183,0,23,1,119,1,215,1,31,0,127,0,223,0,63,1,159,1,63,0,159,0,255],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([95,1,191,1,95,0,191,0,31,1,127,1,223,1,184,126,154,121,154,121,102,102,184,126,51,115,210,6,138,58,171,152,198,26,169,100,246,216,0,255,0,255,0,255,0,255,0,255,0,254,1,0,1,255,0,254,0,253,2,0,1,255,0,254,0,253,3,0,1,255,224,112,44,15,3,2,1,0,254,237,192,132,70,23,4,0,255,252,226,155,61,11,2,0,250,245,234,203,71,50,42,38,35,33,31,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,179,99,0,71,56,43,30,21,12,6,0,199,165,144,124,109,96,84,71,61,51,42,32,23,15,8,0,241,225,211,199,187,175,164,153,142,132,123,114,105,96,88,80,72,64,57,50,44,38,33,29,24,20,16,12,9,5,2,0,4,6,24,7,5,0,0,2,0,0,12,28,41,13,252,247,15,42,25,14,1,254,62,41,247,246,37,65,252,3,250,4,66,7,248,16,14,38,253,33,13,22,39,23,12,255,36,64,27,250,249,10,55,43,17,1,1,8,1,1,6,245,74,53,247,244,55,76,244,8,253,3,93,27,252,26,39,59,3,248,2,0,77,11,9,248,22,44,250,7,40,9,26,3,9,249,20,101,249,4,3,248,42,26,0,241,33,68,2,23,254,55,46,254,15,3,255,21,16,41,250,27,61,39,5,245,42,88,4,1,254,60,65,6,252,255,251,73,56,1,247,19,94,29,247,0,12,99,6,4,8,237,102,46,243,3,2,13,3,2,9,235,84,72,238,245,46,104,234,8,18,38,48,23,0,240,70,83,235,11,5,245,117,22,248,250,23,117,244,3,3,248,95,28,4,246,15,77,60,241,255,4,124,2,252,3,38,84,24,231,2,13,42,13,31,21,252,56,46,255,255,35,79,243,19,249,65,88,247,242,20,4,81,49,227,20,0,75,3,239,5,247,44,92,248,1,253,22,69,31,250,95,41,244,5,39,67,16,252,1,0,250,120,55,220,243,44,122,4,232,81,5,11,3,7,2,0,9,10,88,12,35,60,83,108,132,157,180,206,228,15,32,55,77,101,125,151,175,201,225,19,42,66,89,114,137,162,184,209,230,12,25,50,72,97,120,147,172,200,223,26,44,69,90,114,135,159,180,205,225,13,22,53,80,106,130,156,180,205,228,15,25,44,64,90,115,142,168,196,222,19,24,62,82,100,120,145,168,190,214,22,31,50,79,103,120,151,170,203,227,21,29,45,65,106,124,150,171,196,224,30,49,75,97,121,142,165,186,209,229,19,25,52,70,93,116,143,166,192,219,26,34,62,75,97,118,145,167,194,217,25,33,56,70,91,113,143,165,196,223,21,34,51,72,97,117,145,171,196,222,20,29,50,67,90,117,144,168,197,221,22,31,48,66,95,117,146,168,196,222,24,33,51,77,116,134,158,180,200,224,21,28,70,87,106,124,149,170,194,217,26,33,53,64,83,117,152,173,204,225,27,34,65,95,108,129,155,174,210,225,20,26,72,99,113,131,154,176,200,219,34,43,61,78,93,114,155,177,205,229,23,29,54,97,124,138,163,179,209,229,30,38,56,89,118,129,158,178,200,231,21,29,49,63,85,111,142,163,193,222,27,48,77,103,133,158,179,196,215,232,29,47,74,99,124,151,176,198,220,237,33,42,61,76,93,121,155,174,207,225,29,53,87,112,136,154,170,188,208,227,24,30,52,84,131,150,166,186,203,229,37,48,64,84,104,118,156,177,201,230,212,178,148,129,108,96,85,82,79,77,61,59,57,56,51,49,48,45,42,41,40,38,36,34,31,30,21,12,10,3,1,0,255,245,244,236,233,225,217,203,190,176,175,161,149,136,125,114,102,91,81,71,60,52,43,35,28,20,19,18,12,11,5,0,179,138,140,148,151,149,153,151,163,116,67,82,59,92,72,100,89,92,16,0,0,0,0,99,66,36,36,34,36,34,34,34,34,83,69,36,52,34,116,102,70,68,68,176,102,68,68,34,65,85,68,84,36,116,141,152,139,170,132,187,184,216,137,132,249,168,185,139,104,102,100,68,68,178,218,185,185,170,244,216,187,187,170,244,187,187,219,138,103,155,184,185,137,116,183,155,152,136,132,217,184,184,170,164,217,171,155,139,244,169,184,185,170,164,216,223,218,138,214,143,188,218,168,244,141,136,155,170,168,138,220,219,139,164,219,202,216,137,168,186,246,185,139,116,185,219,185,138,100,100,134,100,102,34,68,68,100,68,168,203,221,218,168,167,154,136,104,70,164,246,171,137,139,137,155,218,219,139,255,254,253,238,14,3,2,1,0,255,254,252,218,35,3,2,1,0,255,254,250,208,59,4,2,1,0,255,254,246,194,71,10,2,1,0,255,252,236,183,82,8,2,1,0,255,252,235,180,90,17,2,1,0,255,248,224,171,97,30,4,1,0,255,254,236,173,95,37,7,1,0,255,255,255,131,6,145,255,255,255,255,255,236,93,15,96,255,255,255,255,255,194,83,25,71,221,255,255,255,255,162,73,34,66,162,255,255,255,210,126,73,43,57,173,255,255,255,201,125,71,48,58,130,255,255,255,166,110,73,57,62,104,210,255,255,251,123,65,55,68,100,171,255,7,23,38,54,69,85,100,116,131,147,162,178,193,208,223,239,13,25,41,55,69,83,98,112,127,142,157,171,187,203,220,236,15,21,34,51,61,78,92,106,126,136,152,167,185,205,225,240,10,21,36,50,63,79,95,110,126,141,157,173,189,205,221,237,17,20,37,51,59,78,89,107,123,134,150,164,184,205,224,240,10,15,32,51,67,81,96,112,129,142,158,173,189,204,220,236,8,21,37,51,65,79,98,113,126,138,155,168,179,192,209,218,12,15,34,55,63,78,87,108,118,131,148,167,185,203,219,236,16,19,32,36,56,79,91,108,118,136,154,171,186,204,220,237,11,28,43,58,74,89,105,120,135,150,165,180,196,211,226,241,6,16,33,46,60,75,92,107,123,137,156,169,185,199,214,225,11,19,30,44,57,74,89,105,121,135,152,169,186,202,218,234,12,19,29,46,57,71,88,100,120,132,148,165,182,199,216,233,17,23,35,46,56,77,92,106,123,134,152,167,185,204,222,237,14,17,45,53,63,75,89,107,115,132,151,171,188,206,221,240,9,16,29,40,56,71,88,103,119,137,154,171,189,205,222,237,16,19,36,48,57,76,87,105,118,132,150,167,185,202,218,236,12,17,29,54,71,81,94,104,126,136,149,164,182,201,221,237,15,28,47,62,79,97,115,129,142,155,168,180,194,208,223,238,8,14,30,45,62,78,94,111,127,143,159,175,192,207,223,239,17,30,49,62,79,92,107,119,132,145,160,174,190,204,220,235,14,19,36,45,61,76,91,108,121,138,154,172,189,205,222,238,12,18,31,45,60,76,91,107,123,138,154,171,187,204,221,236,13,17,31,43,53,70,83,103,114,131,149,167,185,203,220,237,17,22,35,42,58,78,93,110,125,139,155,170,188,206,224,240,8,15,34,50,67,83,99,115,131,146,162,178,193,209,224,239,13,16,41,66,73,86,95,111,128,137,150,163,183,206,225,241,17,25,37,52,63,75,92,102,119,132,144,160,175,191,212,231,19,31,49,65,83,100,117,133,147,161,174,187,200,213,227,242,18,31,52,68,88,103,117,126,138,149,163,177,192,207,223,239,16,29,47,61,76,90,106,119,133,147,161,176,193,209,224,240,15,21,35,50,61,73,86,97,110,119,129,141,175,198,218,237,225,204,201,184,183,175,158,154,153,135,119,115,113,110,109,99,98,95,79,68,52,50,48,45,43,32,31,27,18,10,3,0,255,251,235,230,212,201,196,182,167,166,163,151,138,124,110,104,90,78,76,70,69,57,45,34,24,21,11,6,5,4,3,0,175,148,160,176,178,173,174,164,177,174,196,182,198,192,182,68,62,66,60,72,117,85,90,118,136,151,142,160,142,155,0,0,0,0,0,0,0,1,100,102,102,68,68,36,34,96,164,107,158,185,180,185,139,102,64,66,36,34,34,0,1,32,208,139,141,191,152,185,155,104,96,171,104,166,102,102,102,132,1,0,0,0,0,16,16,0,80,109,78,107,185,139,103,101,208,212,141,139,173,153,123,103,36,0,0,0,0,0,0,1,48,0,0,0,0,0,0,32,68,135,123,119,119,103,69,98,68,103,120,118,118,102,71,98,134,136,157,184,182,153,139,134,208,168,248,75,189,143,121,107,32,49,34,34,34,0,17,2,210,235,139,123,185,137,105,134,98,135,104,182,100,183,171,134,100,70,68,70,66,66,34,131,64,166,102,68,36,2,1,0,134,166,102,68,34,34,66,132,212,246,158,139,107,107,87,102,100,219,125,122,137,118,103,132,114,135,137,105,171,106,50,34,164,214,141,143,185,151,121,103,192,34,0,0,0,0,0,1,208,109,74,187,134,249,159,137,102,110,154,118,87,101,119,101,0,2,0,36,36,66,68,35,96,164,102,100,36,0,2,33,167,138,174,102,100,84,2,2,100,107,120,119,36,197,24,0,255,254,253,244,12,3,2,1,0,255,254,252,224,38,3,2,1,0,255,254,251,209,57,4,2,1,0,255,254,244,195,69,4,2,1,0,255,251,232,184,84,7,2,1,0,255,254,240,186,86,14,2,1,0,255,254,239,178,91,30,5,1,0,255,248,227,177,100,19,2,1,0,255,255,255,156,4,154,255,255,255,255,255,227,102,15,92,255,255,255,255,255,213,83,24,72,236,255,255,255,255,150,76,33,63,214,255,255,255,190,121,77,43,55,185,255,255,255,245,137,71,43,59,139,255,255,255,255,131,66,50,66,107,194,255,255,166,116,76,55,53,125,255,255,249,247,246,245,244,234,210,202,201,200,197,174,82,59,56,55,54,46,22,12,11,10,9,7,0,64,0,203,150,0,215,195,166,125,110,82,0,120,0,128,64,0,232,158,10,0,230,0,243,221,192,181,0,171,85,0,192,128,64,0,205,154,102,51,0,213,171,128,85,43,0,224,192,160,128,96,64,32,0,100,40,16,7,3,1,0,253,250,244,233,212,182,150,131,120,110,98,85,72,60,49,40,32,25,19,15,13,11,9,8,7,6,5,4,3,2,1,0,210,208,206,203,199,193,183,168,142,104,74,52,37,27,20,14,10,6,4,2,0,223,201,183,167,152,138,124,111,98,88,79,70,62,56,50,44,39,35,31,27,24,21,18,16,14,12,10,8,6,4,3,2,1,0,188,176,155,138,119,97,67,43,26,10,0,165,119,80,61,47,35,27,20,14,9,4,0,113,63,0,125,51,26,18,15,12,11,10,9,8,7,6,5,4,3,2,1,0,198,105,45,22,15,12,11,10,9,8,7,6,5,4,3,2,1,0,213,162,116,83,59,43,32,24,18,15,12,9,7,6,5,3,2,0,239,187,116,59,28,16,11,10,9,8,7,6,5,4,3,2,1,0,250,229,188,135,86,51,30,19,13,10,8,6,5,4,3,2,1,0,249,235,213,185,156,128,103,83,66,53,42,33,26,21,17,13,10,0,254,249,235,206,164,118,77,46,27,16,10,7,5,4,3,2,1,0,255,253,249,239,220,191,156,119,85,57,37,23,15,10,6,4,2,0,255,253,251,246,237,223,203,179,152,124,98,75,55,40,29,21,15,0,255,254,253,247,220,162,106,67,42,28,18,12,9,6,4,3,2,0,241,190,178,132,87,74,41,14,0,223,193,157,140,106,57,39,18,0,128,0,214,42,0,235,128,21,0,244,184,72,11,0,248,214,128,42,7,0,248,225,170,80,25,5,0,251,236,198,126,54,18,3,0,250,238,211,159,82,35,15,5,0,250,231,203,168,128,88,53,25,6,0,252,238,216,185,148,108,71,40,18,4,0,253,243,225,199,166,128,90,57,31,13,3,0,254,246,233,212,183,147,109,73,44,23,10,2,0,255,250,240,223,198,166,128,90,58,33,16,6,1,0,255,251,244,231,210,181,146,110,75,46,25,12,5,1,0,255,253,248,238,221,196,164,128,92,60,35,18,8,3,1,0,255,253,249,242,229,208,180,146,110,76,48,27,14,7,3,1,0,129,0,207,50,0,236,129,20,0,245,185,72,10,0,249,213,129,42,6,0,250,226,169,87,27,4,0,251,233,194,130,62,20,4,0,250,236,207,160,99,47,17,3,0,255,240,217,182,131,81,41,11,1,0,255,254,233,201,159,107,61,20,2,1,0,255,249,233,206,170,128,86,50,23,7,1,0,255,250,238,217,186,148,108,70,39,18,6,1,0,255,252,243,226,200,166,128,90,56,30,13,4,1,0,255,252,245,231,209,180,146,110,76,47,25,11,4,1,0,255,253,248,237,219,194,163,128,93,62,37,19,8,3,1,0,255,254,250,241,226,205,177,145,111,79,51,30,15,6,2,1,0,129,0,203,54,0,234,129,23,0,245,184,73,10,0,250,215,129,41,5,0,252,232,173,86,24,3,0,253,240,200,129,56,15,2,0,253,244,217,164,94,38,10,1,0,253,245,226,189,132,71,27,7,1,0,253,246,231,203,159,105,56,23,6,1,0,255,248,235,213,179,133,85,47,19,5,1,0,255,254,243,221,194,159,117,70,37,12,2,1,0,255,254,248,234,208,171,128,85,48,22,8,2,1,0,255,254,250,240,220,189,149,107,67,36,16,6,2,1,0,255,254,251,243,227,201,166,128,90,55,29,13,5,2,1,0,255,254,252,246,234,213,183,147,109,73,43,22,10,4,2,1,0,130,0,200,58,0,231,130,26,0,244,184,76,12,0,249,214,130,43,6,0,252,232,173,87,24,3,0,253,241,203,131,56,14,2,0,254,246,221,167,94,35,8,1,0,254,249,232,193,130,65,23,5,1,0,255,251,239,211,162,99,45,15,4,1,0,255,251,243,223,186,131,74,33,11,3,1,0,255,252,245,230,202,158,105,57,24,8,2,1,0,255,253,247,235,214,179,132,84,44,19,7,2,1,0,255,254,250,240,223,196,159,112,69,36,15,6,2,1,0,255,254,253,245,231,209,176,136,93,55,27,11,3,2,1,0,255,254,253,252,239,221,194,158,117,76,42,18,4,3,2,1,0,0,0,2,5,9,14,20,27,35,44,54,65,77,90,104,119,135,254,49,67,77,82,93,99,198,11,18,24,31,36,45,255,46,66,78,87,94,104,208,14,21,32,42,51,66,255,94,104,109,112,115,118,248,53,69,80,88,95,102,0,1,0,0,0,1,0,0,1,255,1,255,2,254,2,254,3,253,0,1,0,1,255,2,255,2,254,3,254,3,0,2,255,255,255,0,0,1,1,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,255,2,1,0,1,1,0,0,255,255,0,0,1,255,0,1,255,0,255,1,254,2,254,254,2,253,2,3,253,252,3,252,4,4,251,5,250,251,6,249,6,5,8,247,0,0,1,0,0,0,0,0,0,0,255,1,0,0,1,255,0,1,255,255,1,255,2,1,255,2,254,254,2,254,2,2,3,253,0,1,0,0,0,0,0,0,1,0,1,0,0,1,255,1,0,0,2,1,255,2,255,255,2,255,2,2,255,3,254,254,254,3,0,1,0,0,1,0,1,255,2,255,2,255,2,3,254,3,254,254,4,4,253,5,253,252,6,252,6,5,251,8,250,251,249,9,0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3,0,3,12,15,48,51,60,63,192,195,204,207,240,243,252,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,80,75,69,63,56,49,40,34,29,20,18,10,0,0,0,0,0,0,0,0,110,100,90,84,78,71,65,58,51,45,39,32,26,20,12,0,0,0,0,0,0,118,110,103,93,86,80,75,70,65,59,53,47,40,31,23,15,4,0,0,0,0,126,119,112,104,95,89,83,78,72,66,60,54,47,39,32,25,17,12,1,0,0,134,127,120,114,103,97,91,85,78,72,66,60,54,47,41,35,29,23,16,10,1,144,137,130,124,113,107,101,95,88,82,76,70,64,57,51,45,39,33,26,15,1,152,145,138,132,123,117,111,105,98,92,86,80,74,67,61,55,49,43,36,20,1,162,155,148,142,133,127,121,115,108,102,96,90,84,77,71,65,59,53,46,30,1,172,165,158,152,143,137,131,125,118,112,106,100,94,87,81,75,69,63,56,45,20,200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104,40,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,40,15,23,28,31,34,36,38,39,41,42,43,44,45,46,47,47,49,50,51,52,53,54,55,55,57,58,59,60,61,62,63,63,65,66,67,68,69,70,71,71,40,20,33,41,48,53,57,61,64,66,69,71,73,75,76,78,80,82,85,87,89,91,92,94,96,98,101,103,105,107,108,110,112,114,117,119,121,123,124,126,128,40,23,39,51,60,67,73,79,83,87,91,94,97,100,102,105,107,111,115,118,121,124,126,129,131,135,139,142,145,148,150,153,155,159,163,166,169,172,174,177,179,35,28,49,65,78,89,99,107,114,120,126,132,136,141,145,149,153,159,165,171,176,180,185,189,192,199,205,211,216,220,225,229,232,239,245,251,21,33,58,79,97,112,125,137,148,157,166,174,182,189,195,201,207,217,227,235,243,251,17,35,63,86,106,123,139,152,165,177,187,197,206,214,222,230,237,250,25,31,55,75,91,105,117,128,138,146,154,161,168,174,180,185,190,200,208,215,222,229,235,240,245,255,16,36,65,89,110,128,144,159,173,185,196,207,217,226,234,242,250,11,41,74,103,128,151,172,191,209,225,241,255,9,43,79,110,138,163,186,207,227,246,12,39,71,99,123,144,164,182,198,214,228,241,253,9,44,81,113,142,168,192,214,235,255,7,49,90,127,160,191,220,247,6,51,95,134,170,203,234,7,47,87,123,155,184,212,237,6,52,97,137,174,208,240,5,57,106,151,192,231,5,59,111,158,202,243,5,55,103,147,187,224,5,60,113,161,206,248,4,65,122,175,224,4,67,127,182,234,224,224,224,224,224,224,224,224,160,160,160,160,185,185,185,178,178,168,134,61,37,224,224,224,224,224,224,224,224,240,240,240,240,207,207,207,198,198,183,144,66,40,160,160,160,160,160,160,160,160,185,185,185,185,193,193,193,183,183,172,138,64,38,240,240,240,240,240,240,240,240,207,207,207,207,204,204,204,193,193,180,143,66,40,185,185,185,185,185,185,185,185,193,193,193,193,193,193,193,183,183,172,138,65,39,207,207,207,207,207,207,207,207,204,204,204,204,201,201,201,188,188,176,141,66,40,193,193,193,193,193,193,193,193,193,193,193,193,194,194,194,184,184,173,139,65,39,204,204,204,204,204,204,204,204,201,201,201,201,198,198,198,187,187,175,140,66,40,0,8,13,16,19,21,23,24,26,27,28,29,30,31,32,32,33,34,34,35,36,36,37,37,72,127,65,129,66,128,65,128,64,128,62,128,64,128,64,128,92,78,92,79,92,78,90,79,116,41,115,40,114,40,132,26,132,26,145,17,161,12,176,10,177,11,24,179,48,138,54,135,54,132,53,134,56,133,55,132,55,132,61,114,70,96,74,88,75,88,87,74,89,66,91,67,100,59,108,50,120,40,122,37,97,43,78,50,83,78,84,81,88,75,86,74,87,71,90,73,93,74,93,74,109,40,114,36,117,34,117,34,143,17,145,18,146,19,162,12,165,10,178,7,189,6,190,8,177,9,23,178,54,115,63,102,66,98,69,99,74,89,71,91,73,91,78,89,86,80,92,66,93,64,102,59,103,60,104,60,117,52,123,44,138,35,133,31,97,38,77,45,61,90,93,60,105,42,107,41,110,45,116,38,113,38,112,38,124,26,132,27,136,19,140,20,155,14,159,16,158,18,170,13,177,10,187,8,192,6,175,9,159,10,21,178,59,110,71,86,75,85,84,83,91,66,88,73,87,72,92,75,98,72,105,58,107,54,115,52,114,55,112,56,129,51,132,40,150,33,140,29,98,35,77,42,42,121,96,66,108,43,111,40,117,44,123,32,120,36,119,33,127,33,134,34,139,21,147,23,152,20,158,25,154,26,166,21,173,16,184,13,184,10,150,13,139,15,22,178,63,114,74,82,84,83,92,82,103,62,96,72,96,67,101,73,107,72,113,55,118,52,125,52,118,52,117,55,135,49,137,39,157,32,145,29,97,33,77,40,2,1,0,2,1,0,25,23,2,0,126,124,119,109,87,41,19,9,4,2,0,0,15,8,7,4,11,12,3,2,13,10,5,6,9,14,1,0,9,6,3,4,5,8,1,2,7,6,0,3,0,7,3,0,1,10,0,2,6,18,10,12,4,0,2,0,0,0,9,4,7,4,0,3,12,7,7,255,255,79,112,117,115,72,101,97,100,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_bitshift64Ashr\"]=_bitshift64Ashr;Module[\"_i64Add\"]=_i64Add;Module[\"_memset\"]=_memset;function _abort(){Module[\"abort\"]()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var _llvm_pow_f64=Math_pow;Module[\"___muldsi3\"]=___muldsi3;Module[\"___muldi3\"]=___muldi3;function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLVM_SAVEDSTACKS[p];self.LLVM_SAVEDSTACKS.splice(p,1);Runtime.stackRestore(ret)}function _ogvjs_callback_audio(buffers,channels,sampleCount){var HEAPU32=Module.HEAPU32;var HEAPF32=Module.HEAPF32;var outputBuffers=[];if(buffers!==0){var inPtr,inArray,inBuffer,outArray;for(var channel=0;channel<channels;channel++){inPtr=HEAPU32[buffers/4+channel];if(HEAPF32.buffer.slice){inBuffer=HEAPF32.buffer.slice(inPtr,inPtr+sampleCount*4);outArray=new Float32Array(inBuffer)}else{inArray=HEAPF32.subarray(inPtr/4,inPtr/4+sampleCount);outArray=new Float32Array(inArray)}outputBuffers.push(outArray)}}Module.audioBuffer=outputBuffers}function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDSTACKS){self.LLVM_SAVEDSTACKS=[]}self.LLVM_SAVEDSTACKS.push(Runtime.stackSave());return self.LLVM_SAVEDSTACKS.length-1}Module[\"_memmove\"]=_memmove;function _ogvjs_callback_init_audio(channels,rate){Module.audioFormat={channels:channels,rate:rate};Module.loadedMetadata=true}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_viiiiii\":invoke_viiiiii,\"_ogvjs_callback_init_audio\":_ogvjs_callback_init_audio,\"_llvm_pow_f64\":_llvm_pow_f64,\"_abort\":_abort,\"___setErrNo\":___setErrNo,\"_llvm_stacksave\":_llvm_stacksave,\"_ogvjs_callback_audio\":_ogvjs_callback_audio,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_llvm_stackrestore\":_llvm_stackrestore,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;var C=0;var D=global.Math.floor;var E=global.Math.abs;var F=global.Math.sqrt;var G=global.Math.pow;var H=global.Math.cos;var I=global.Math.sin;var J=global.Math.tan;var K=global.Math.acos;var L=global.Math.asin;var M=global.Math.atan;var N=global.Math.atan2;var O=global.Math.exp;var P=global.Math.log;var Q=global.Math.ceil;var R=global.Math.imul;var S=global.Math.min;var T=global.Math.max;var U=global.Math.clz32;var V=env.abort;var W=env.assert;var X=env.enlargeMemory;var Y=env.getTotalMemory;var Z=env.abortOnCannotGrowMemory;var _=env.invoke_viiiiii;var $=env._ogvjs_callback_init_audio;var aa=env._llvm_pow_f64;var ba=env._abort;var ca=env.___setErrNo;var da=env._llvm_stacksave;var ea=env._ogvjs_callback_audio;var fa=env._emscripten_memcpy_big;var ga=env._llvm_stackrestore;var ha=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction ja(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function ka(){return l|0}function la(a){a=a|0;l=a}function ma(a,b){a=a|0;b=b|0;l=a;m=b}function na(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function oa(a){a=a|0;C=a}function pa(){return C|0}function qa(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=(R(1664525,c[d>>2]|0)|0)+1013904223|0;l=b;return a|0}function ra(a,d,e,f,h,i,j,k,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0;n=l;l=l+80|0;o=n+72|0;p=n+68|0;q=n+64|0;r=n+60|0;s=n+56|0;t=n+52|0;u=n+48|0;v=n+44|0;w=n+40|0;x=n+36|0;y=n+32|0;z=n+28|0;A=n+24|0;B=n+20|0;C=n+16|0;D=n+12|0;E=n+8|0;F=n+4|0;G=n;c[o>>2]=a;c[p>>2]=d;c[q>>2]=e;c[r>>2]=f;c[s>>2]=h;c[t>>2]=i;c[u>>2]=j;c[v>>2]=k;c[w>>2]=m;c[C>>2]=c[(c[o>>2]|0)+32>>2];c[y>>2]=R(c[u>>2]|0,c[(c[o>>2]|0)+44>>2]|0)|0;c[z>>2]=R(c[u>>2]|0,b[(c[C>>2]|0)+(c[t>>2]<<1)>>1]|0)|0;if((c[v>>2]|0)!=1){if((c[z>>2]|0)<((c[y>>2]|0)/(c[v>>2]|0)|0|0))H=c[z>>2]|0;else H=(c[y>>2]|0)/(c[v>>2]|0)|0;c[z>>2]=H}if(c[w>>2]|0){c[z>>2]=0;c[t>>2]=0;c[s>>2]=0}c[A>>2]=c[q>>2];c[B>>2]=(c[p>>2]|0)+((R(c[u>>2]|0,b[(c[C>>2]|0)+(c[s>>2]<<1)>>1]|0)|0)<<2);c[x>>2]=0;while(1){if((c[x>>2]|0)>=(R(c[u>>2]|0,b[(c[C>>2]|0)+(c[s>>2]<<1)>>1]|0)|0))break;p=c[A>>2]|0;c[A>>2]=p+4;g[p>>2]=0.0;c[x>>2]=(c[x>>2]|0)+1}c[x>>2]=c[s>>2];while(1){if((c[x>>2]|0)>=(c[t>>2]|0))break;c[D>>2]=R(c[u>>2]|0,b[(c[C>>2]|0)+(c[x>>2]<<1)>>1]|0)|0;c[E>>2]=R(c[u>>2]|0,b[(c[C>>2]|0)+((c[x>>2]|0)+1<<1)>>1]|0)|0;g[G>>2]=+g[(c[r>>2]|0)+(c[x>>2]<<2)>>2]+ +g[8+(c[x>>2]<<2)>>2];g[F>>2]=+O(+(+g[G>>2]*.6931471805599453));do{s=c[B>>2]|0;c[B>>2]=s+4;I=+g[s>>2]*+g[F>>2];s=c[A>>2]|0;c[A>>2]=s+4;g[s>>2]=I;s=(c[D>>2]|0)+1|0;c[D>>2]=s}while((s|0)<(c[E>>2]|0));c[x>>2]=(c[x>>2]|0)+1}He((c[q>>2]|0)+(c[z>>2]<<2)|0,0,(c[y>>2]|0)-(c[z>>2]|0)<<2|0)|0;l=n;return}function sa(a,e,f,h,i,j,k,m,n,o,p,q,r){a=a|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;var s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0;s=l;l=l+112|0;t=s+104|0;u=s+100|0;v=s+96|0;w=s+92|0;x=s+88|0;y=s+84|0;z=s+80|0;A=s+76|0;B=s+72|0;C=s+68|0;D=s+64|0;E=s+60|0;G=s+56|0;H=s+52|0;I=s+48|0;J=s+44|0;K=s+40|0;L=s+36|0;M=s+32|0;N=s+28|0;P=s+24|0;Q=s+20|0;S=s+16|0;T=s+12|0;U=s+8|0;V=s+4|0;W=s;c[t>>2]=a;c[u>>2]=e;c[v>>2]=f;c[w>>2]=h;c[x>>2]=i;c[y>>2]=j;c[z>>2]=k;c[A>>2]=m;c[B>>2]=n;c[C>>2]=o;c[D>>2]=p;c[E>>2]=q;c[G>>2]=r;c[I>>2]=c[z>>2];while(1){if((c[I>>2]|0)>=(c[A>>2]|0))break;c[L>>2]=(b[(c[(c[t>>2]|0)+32>>2]|0)+((c[I>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[t>>2]|0)+32>>2]|0)+(c[I>>2]<<1)>>1]|0);z=ta(1+(c[(c[E>>2]|0)+(c[I>>2]<<2)>>2]|0)|0,(b[(c[(c[t>>2]|0)+32>>2]|0)+((c[I>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[t>>2]|0)+32>>2]|0)+(c[I>>2]<<1)>>1]|0)|0)|0;c[P>>2]=z>>>(c[w>>2]|0);g[M>>2]=+O(+(+(c[P>>2]|0)*-.125*.6931471805599453))*.5;g[N>>2]=1.0/+F(+(+(c[L>>2]<<c[w>>2]|0)));c[H>>2]=0;do{c[W>>2]=0;z=R(c[H>>2]|0,c[(c[t>>2]|0)+8>>2]|0)|0;g[S>>2]=+g[(c[C>>2]|0)+(z+(c[I>>2]|0)<<2)>>2];z=R(c[H>>2]|0,c[(c[t>>2]|0)+8>>2]|0)|0;g[T>>2]=+g[(c[D>>2]|0)+(z+(c[I>>2]|0)<<2)>>2];if((c[x>>2]|0)==1){if(+g[S>>2]>+g[(c[C>>2]|0)+((c[(c[t>>2]|0)+8>>2]|0)+(c[I>>2]|0)<<2)>>2])X=+g[S>>2];else X=+g[(c[C>>2]|0)+((c[(c[t>>2]|0)+8>>2]|0)+(c[I>>2]|0)<<2)>>2];g[S>>2]=X;if(+g[T>>2]>+g[(c[D>>2]|0)+((c[(c[t>>2]|0)+8>>2]|0)+(c[I>>2]|0)<<2)>>2])Y=+g[T>>2];else Y=+g[(c[D>>2]|0)+((c[(c[t>>2]|0)+8>>2]|0)+(c[I>>2]|0)<<2)>>2];g[T>>2]=Y}z=R(c[H>>2]|0,c[(c[t>>2]|0)+8>>2]|0)|0;g[U>>2]=+g[(c[B>>2]|0)+(z+(c[I>>2]|0)<<2)>>2]-(+g[S>>2]<+g[T>>2]?+g[S>>2]:+g[T>>2]);g[U>>2]=0.0>+g[U>>2]?0.0:+g[U>>2];g[V>>2]=+O(+(-+g[U>>2]*.6931471805599453))*2.0;if((c[w>>2]|0)==3)g[V>>2]=+g[V>>2]*1.4142135381698608;g[V>>2]=+g[M>>2]<+g[V>>2]?+g[M>>2]:+g[V>>2];g[V>>2]=+g[V>>2]*+g[N>>2];z=(c[u>>2]|0)+((R(c[H>>2]|0,c[y>>2]|0)|0)<<2)|0;c[Q>>2]=z+(b[(c[(c[t>>2]|0)+32>>2]|0)+(c[I>>2]<<1)>>1]<<c[w>>2]<<2);c[K>>2]=0;while(1){if((c[K>>2]|0)>=(1<<c[w>>2]|0))break;z=R(c[I>>2]|0,c[x>>2]|0)|0;if(!(d[(c[v>>2]|0)+(z+(c[H>>2]|0))>>0]&1<<c[K>>2])){c[J>>2]=0;while(1){if((c[J>>2]|0)>=(c[L>>2]|0))break;c[G>>2]=qa(c[G>>2]|0)|0;Z=+g[V>>2];g[(c[Q>>2]|0)+((c[J>>2]<<c[w>>2])+(c[K>>2]|0)<<2)>>2]=c[G>>2]&32768|0?Z:-Z;c[J>>2]=(c[J>>2]|0)+1}c[W>>2]=1}c[K>>2]=(c[K>>2]|0)+1}if(c[W>>2]|0)ua(c[Q>>2]|0,c[L>>2]<<c[w>>2],1.0);z=(c[H>>2]|0)+1|0;c[H>>2]=z}while((z|0)<(c[x>>2]|0));c[I>>2]=(c[I>>2]|0)+1}l=s;return}function ta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>>>0)/((c[f>>2]|0)>>>0)|0|0}function ua(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;e=l;l=l+32|0;f=e+28|0;h=e+24|0;i=e+20|0;j=e+16|0;k=e+12|0;m=e+8|0;n=e+4|0;o=e;c[f>>2]=a;c[h>>2]=b;g[i>>2]=d;g[k>>2]=+va(c[f>>2]|0,c[f>>2]|0,c[h>>2]|0)+1.0000000036274937e-15;g[n>>2]=+g[k>>2];d=1.0/+F(+(+g[n>>2]));g[m>>2]=d*+g[i>>2];c[o>>2]=c[f>>2];c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[h>>2]|0))break;g[c[o>>2]>>2]=+g[m>>2]*+g[c[o>>2]>>2];c[o>>2]=(c[o>>2]|0)+4;c[j>>2]=(c[j>>2]|0)+1}l=e;return}function va(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0.0;e=l;l=l+32|0;f=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[f>>2]=a;c[h>>2]=b;c[i>>2]=d;g[k>>2]=0.0;c[j>>2]=0;while(1){m=+g[k>>2];if((c[j>>2]|0)>=(c[i>>2]|0))break;g[k>>2]=m+ +g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2];c[j>>2]=(c[j>>2]|0)+1}l=e;return +m}function wa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+32|0;f=e+24|0;h=e+20|0;i=e+16|0;j=e+12|0;k=e+8|0;m=e+4|0;n=e;c[f>>2]=a;c[h>>2]=b;c[i>>2]=d;c[h>>2]=c[h>>2]>>1;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[i>>2]|0))break;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[h>>2]|0))break;d=R(c[i>>2]<<1,c[k>>2]|0)|0;g[m>>2]=+g[(c[f>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]*.7071067690849304;d=R(c[i>>2]|0,(c[k>>2]<<1)+1|0)|0;g[n>>2]=+g[(c[f>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]*.7071067690849304;d=R(c[i>>2]<<1,c[k>>2]|0)|0;g[(c[f>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]=+g[m>>2]+ +g[n>>2];d=R(c[i>>2]|0,(c[k>>2]<<1)+1|0)|0;g[(c[f>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]=+g[m>>2]-+g[n>>2];c[k>>2]=(c[k>>2]|0)+1}c[j>>2]=(c[j>>2]|0)+1}l=e;return}function xa(e,f,h,i,j,k,m,n,o,p,q,r,s,t,u,v,w,x,y,z){e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0;A=l;l=l+240|0;B=A+232|0;C=A+228|0;D=A+224|0;E=A+220|0;F=A+216|0;G=A+212|0;H=A+208|0;I=A+204|0;J=A+200|0;K=A+196|0;L=A+192|0;M=A+188|0;N=A+184|0;O=A+180|0;P=A+176|0;Q=A+172|0;S=A+168|0;T=A+164|0;U=A+160|0;V=A+156|0;W=A+152|0;X=A+148|0;Y=A+144|0;Z=A+140|0;_=A+136|0;$=A+132|0;aa=A+128|0;ba=A+124|0;ca=A+120|0;ea=A+116|0;fa=A+112|0;ha=A+108|0;ia=A+104|0;ja=A+64|0;ka=A+60|0;la=A+56|0;ma=A+52|0;na=A+48|0;oa=A+44|0;pa=A+40|0;qa=A+36|0;ra=A+32|0;sa=A+28|0;ta=A+24|0;ua=A+20|0;va=A+16|0;wa=A+12|0;xa=A+8|0;Ca=A+4|0;Da=A;c[B>>2]=e;c[C>>2]=f;c[D>>2]=h;c[E>>2]=i;c[F>>2]=j;c[G>>2]=k;c[H>>2]=m;c[I>>2]=n;c[J>>2]=o;c[K>>2]=p;c[L>>2]=q;c[M>>2]=r;c[N>>2]=s;c[O>>2]=t;c[P>>2]=u;c[Q>>2]=v;c[S>>2]=w;c[T>>2]=x;c[U>>2]=y;c[V>>2]=z;c[Y>>2]=c[(c[C>>2]|0)+32>>2];c[ea>>2]=1;c[fa>>2]=c[G>>2]|0?2:1;c[ia>>2]=((c[B>>2]|0)!=0^1)&1;c[ba>>2]=1<<c[T>>2];c[aa>>2]=c[K>>2]|0?c[ba>>2]|0:1;c[ha>>2]=R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[D>>2]<<1)>>1]|0)|0;K=R(c[ba>>2]|0,b[(c[Y>>2]|0)+((c[(c[C>>2]|0)+8>>2]|0)-1<<1)>>1]|0)|0;z=R(c[fa>>2]|0,K-(c[ha>>2]|0)|0)|0;c[ka>>2]=da()|0;K=l;l=l+((1*(z<<2)|0)+15&-16)|0;c[Z>>2]=K;K=(c[Z>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+((c[(c[C>>2]|0)+8>>2]|0)-1<<1)>>1]|0)|0)<<2)|0;c[_>>2]=K+(0-(c[ha>>2]|0)<<2);c[$>>2]=(c[F>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+((c[(c[C>>2]|0)+8>>2]|0)-1<<1)>>1]|0)|0)<<2);c[ca>>2]=0;c[ja+32>>2]=c[I>>2];c[ja+24>>2]=c[S>>2];c[ja>>2]=c[B>>2];c[ja+12>>2]=c[N>>2];c[ja+4>>2]=c[C>>2];c[ja+36>>2]=c[c[V>>2]>>2];c[ja+16>>2]=c[L>>2];c[W>>2]=c[D>>2];while(1){if((c[W>>2]|0)>=(c[E>>2]|0))break;c[pa>>2]=-1;c[sa>>2]=0;c[ja+8>>2]=c[W>>2];c[va>>2]=(c[W>>2]|0)==((c[E>>2]|0)-1|0)&1;c[qa>>2]=(c[F>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0)<<2);if(c[G>>2]|0)c[ra>>2]=(c[G>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0)<<2);else c[ra>>2]=0;B=R(c[ba>>2]|0,b[(c[Y>>2]|0)+((c[W>>2]|0)+1<<1)>>1]|0)|0;c[na>>2]=B-(R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0);c[la>>2]=ya(c[S>>2]|0)|0;if((c[W>>2]|0)!=(c[D>>2]|0))c[Q>>2]=(c[Q>>2]|0)-(c[la>>2]|0);c[X>>2]=(c[P>>2]|0)-(c[la>>2]|0)-1;c[ja+28>>2]=c[X>>2];if((c[W>>2]|0)<=((c[U>>2]|0)-1|0)){if(3<((c[U>>2]|0)-(c[W>>2]|0)|0))Ea=3;else Ea=(c[U>>2]|0)-(c[W>>2]|0)|0;c[oa>>2]=za(c[Q>>2]|0,Ea)|0;if(((c[X>>2]|0)+1|0)<((c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0))Fa=(c[X>>2]|0)+1|0;else Fa=(c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0;do if(16383>=(Fa|0))if(((c[X>>2]|0)+1|0)<((c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0)){Ga=(c[X>>2]|0)+1|0;break}else{Ga=(c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0;break}else Ga=16383;while(0);do if(0<=(Ga|0)){if(((c[X>>2]|0)+1|0)<((c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0))Ha=(c[X>>2]|0)+1|0;else Ha=(c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0;if(16383>=(Ha|0))if(((c[X>>2]|0)+1|0)<((c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0)){Ia=(c[X>>2]|0)+1|0;break}else{Ia=(c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[oa>>2]|0)|0;break}else Ia=16383}else Ia=0;while(0);c[ma>>2]=Ia}else c[ma>>2]=0;if((c[ia>>2]|0?(B=R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0,(B-(c[na>>2]|0)|0)>=(R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[D>>2]<<1)>>1]|0)|0)):0)?(c[ea>>2]|0)!=0|(c[ca>>2]|0)==0:0)c[ca>>2]=c[W>>2];c[sa>>2]=c[(c[O>>2]|0)+(c[W>>2]<<2)>>2];c[ja+20>>2]=c[sa>>2];if((c[W>>2]|0)>=(c[(c[C>>2]|0)+12>>2]|0)){c[qa>>2]=c[Z>>2];if(c[G>>2]|0)c[ra>>2]=c[Z>>2];c[$>>2]=0}if((c[W>>2]|0)==((c[E>>2]|0)-1|0))c[$>>2]=0;if(c[ca>>2]|0?(c[L>>2]|0)!=3|(c[aa>>2]|0)>1|(c[sa>>2]|0)<0:0){B=R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[ca>>2]<<1)>>1]|0)|0;if(0>(B-(c[ha>>2]|0)-(c[na>>2]|0)|0))Ja=0;else{B=R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[ca>>2]<<1)>>1]|0)|0;Ja=B-(c[ha>>2]|0)-(c[na>>2]|0)|0}c[pa>>2]=Ja;c[wa>>2]=c[ca>>2];do{B=c[ba>>2]|0;I=c[Y>>2]|0;K=(c[wa>>2]|0)+-1|0;c[wa>>2]=K;z=R(B,b[I+(K<<1)>>1]|0)|0}while((z|0)>((c[pa>>2]|0)+(c[ha>>2]|0)|0));c[xa>>2]=(c[ca>>2]|0)-1;do{z=c[ba>>2]|0;K=c[Y>>2]|0;I=(c[xa>>2]|0)+1|0;c[xa>>2]=I;B=R(z,b[K+(I<<1)>>1]|0)|0}while((B|0)<((c[pa>>2]|0)+(c[ha>>2]|0)+(c[na>>2]|0)|0));c[ua>>2]=0;c[ta>>2]=0;c[Ca>>2]=c[wa>>2];do{B=d[(c[H>>2]|0)+((R(c[Ca>>2]|0,c[fa>>2]|0)|0)+0)>>0]|0;c[ta>>2]=c[ta>>2]|B;B=R(c[Ca>>2]|0,c[fa>>2]|0)|0;c[ua>>2]=c[ua>>2]|d[(c[H>>2]|0)+(B+(c[fa>>2]|0)-1)>>0];B=(c[Ca>>2]|0)+1|0;c[Ca>>2]=B}while((B|0)<(c[xa>>2]|0))}else{B=(1<<c[aa>>2])-1|0;c[ua>>2]=B;c[ta>>2]=B}a:do if((c[M>>2]|0?(c[W>>2]|0)==(c[N>>2]|0):0)?(c[M>>2]=0,c[ia>>2]|0):0){c[Da>>2]=0;while(1){B=R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0;if((c[Da>>2]|0)>=(B-(c[ha>>2]|0)|0))break a;g[(c[Z>>2]|0)+(c[Da>>2]<<2)>>2]=(+g[(c[Z>>2]|0)+(c[Da>>2]<<2)>>2]+ +g[(c[_>>2]|0)+(c[Da>>2]<<2)>>2])*.5;c[Da>>2]=(c[Da>>2]|0)+1}}while(0);if(c[M>>2]|0){if((c[pa>>2]|0)!=-1)Ka=(c[Z>>2]|0)+(c[pa>>2]<<2)|0;else Ka=0;if(c[va>>2]|0)La=0;else{B=(c[Z>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0)<<2)|0;La=B+(0-(c[ha>>2]|0)<<2)|0}c[ta>>2]=Aa(ja,c[qa>>2]|0,c[na>>2]|0,(c[ma>>2]|0)/2|0,c[aa>>2]|0,Ka,c[T>>2]|0,La,1.0,c[$>>2]|0,c[ta>>2]|0)|0;if((c[pa>>2]|0)!=-1)Ma=(c[_>>2]|0)+(c[pa>>2]<<2)|0;else Ma=0;if(c[va>>2]|0)Na=0;else{B=(c[_>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0)<<2)|0;Na=B+(0-(c[ha>>2]|0)<<2)|0}c[ua>>2]=Aa(ja,c[ra>>2]|0,c[na>>2]|0,(c[ma>>2]|0)/2|0,c[aa>>2]|0,Ma,c[T>>2]|0,Na,1.0,c[$>>2]|0,c[ua>>2]|0)|0}else{B=c[qa>>2]|0;if(c[ra>>2]|0){if((c[pa>>2]|0)!=-1)Oa=(c[Z>>2]|0)+(c[pa>>2]<<2)|0;else Oa=0;if(c[va>>2]|0)Pa=0;else{I=(c[Z>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0)<<2)|0;Pa=I+(0-(c[ha>>2]|0)<<2)|0}c[ta>>2]=Ba(ja,B,c[ra>>2]|0,c[na>>2]|0,c[ma>>2]|0,c[aa>>2]|0,Oa,c[T>>2]|0,Pa,c[$>>2]|0,c[ta>>2]|c[ua>>2])|0}else{if((c[pa>>2]|0)!=-1)Qa=(c[Z>>2]|0)+(c[pa>>2]<<2)|0;else Qa=0;if(c[va>>2]|0)Ra=0;else{I=(c[Z>>2]|0)+((R(c[ba>>2]|0,b[(c[Y>>2]|0)+(c[W>>2]<<1)>>1]|0)|0)<<2)|0;Ra=I+(0-(c[ha>>2]|0)<<2)|0}c[ta>>2]=Aa(ja,B,c[na>>2]|0,c[ma>>2]|0,c[aa>>2]|0,Qa,c[T>>2]|0,Ra,1.0,c[$>>2]|0,c[ta>>2]|c[ua>>2])|0}c[ua>>2]=c[ta>>2]}a[(c[H>>2]|0)+((R(c[W>>2]|0,c[fa>>2]|0)|0)+0)>>0]=c[ta>>2];B=R(c[W>>2]|0,c[fa>>2]|0)|0;a[(c[H>>2]|0)+(B+(c[fa>>2]|0)-1)>>0]=c[ua>>2];c[Q>>2]=(c[Q>>2]|0)+((c[(c[J>>2]|0)+(c[W>>2]<<2)>>2]|0)+(c[la>>2]|0));c[ea>>2]=(c[ma>>2]|0)>(c[na>>2]<<3|0)&1;c[W>>2]=(c[W>>2]|0)+1}c[c[V>>2]>>2]=c[ja+36>>2];ga(c[ka>>2]|0);l=A;return}function ya(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=l;l=l+32|0;d=b+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;c[d>>2]=a;c[e>>2]=c[(c[d>>2]|0)+20>>2]<<3;c[g>>2]=32-(U(c[(c[d>>2]|0)+28>>2]|0)|0);c[f>>2]=(c[(c[d>>2]|0)+28>>2]|0)>>>((c[g>>2]|0)-16|0);c[h>>2]=((c[f>>2]|0)>>>12)-8;c[h>>2]=(c[h>>2]|0)+((c[f>>2]|0)>>>0>(c[5492+(c[h>>2]<<2)>>2]|0)>>>0&1);c[g>>2]=(c[g>>2]<<3)+(c[h>>2]|0);l=b;return (c[e>>2]|0)-(c[g>>2]|0)|0}function za(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return (c[e>>2]|0)/(c[f>>2]|0)|0|0}function Aa(a,b,e,f,h,i,j,k,m,n,o){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=+m;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;p=l;l=l+112|0;q=p+100|0;r=p+96|0;s=p+92|0;t=p+88|0;u=p+84|0;v=p+80|0;w=p+76|0;x=p+72|0;y=p+68|0;z=p+64|0;A=p+60|0;B=p+56|0;C=p+52|0;D=p+48|0;E=p+44|0;G=p+40|0;H=p+36|0;I=p+32|0;J=p+28|0;K=p+24|0;L=p+20|0;M=p+16|0;N=p+12|0;O=p+8|0;P=p+4|0;Q=p;c[r>>2]=a;c[s>>2]=b;c[t>>2]=e;c[u>>2]=f;c[v>>2]=h;c[w>>2]=i;c[x>>2]=j;c[y>>2]=k;g[z>>2]=m;c[A>>2]=n;c[B>>2]=o;c[C>>2]=c[t>>2];c[D>>2]=c[t>>2];c[G>>2]=c[v>>2];c[H>>2]=0;c[I>>2]=0;c[K>>2]=0;c[L>>2]=((c[c[r>>2]>>2]|0)!=0^1)&1;c[N>>2]=c[c[r>>2]>>2];c[O>>2]=c[(c[r>>2]|0)+20>>2];c[J>>2]=(c[G>>2]|0)==1&1;c[D>>2]=ta(c[D>>2]|0,c[v>>2]|0)|0;if((c[t>>2]|0)==1){c[q>>2]=Ca(c[r>>2]|0,c[s>>2]|0,0,c[u>>2]|0,c[y>>2]|0)|0;R=c[q>>2]|0;l=p;return R|0}if((c[O>>2]|0)>0)c[I>>2]=c[O>>2];do if((c[A>>2]|0)!=0&(c[w>>2]|0)!=0){if((c[I>>2]|0)==0?!((c[D>>2]&1|0)==0&(c[O>>2]|0)<0|(c[G>>2]|0)>1):0)break;Ie(c[A>>2]|0,c[w>>2]|0,(c[t>>2]<<2)+0|0)|0;c[w>>2]=c[A>>2]}while(0);c[M>>2]=0;while(1){if((c[M>>2]|0)>=(c[I>>2]|0))break;if(c[N>>2]|0)wa(c[s>>2]|0,c[t>>2]>>c[M>>2],1<<c[M>>2]);if(c[w>>2]|0)wa(c[w>>2]|0,c[t>>2]>>c[M>>2],1<<c[M>>2]);c[B>>2]=d[23948+(c[B>>2]&15)>>0]|0|(d[23948+(c[B>>2]>>4)>>0]|0)<<2;c[M>>2]=(c[M>>2]|0)+1}c[v>>2]=c[v>>2]>>c[I>>2];c[D>>2]=c[D>>2]<<c[I>>2];while(1){if(!((c[D>>2]&1|0)==0?(c[O>>2]|0)<0:0))break;if(c[N>>2]|0)wa(c[s>>2]|0,c[D>>2]|0,c[v>>2]|0);if(c[w>>2]|0)wa(c[w>>2]|0,c[D>>2]|0,c[v>>2]|0);c[B>>2]=c[B>>2]|c[B>>2]<<c[v>>2];c[v>>2]=c[v>>2]<<1;c[D>>2]=c[D>>2]>>1;c[H>>2]=(c[H>>2]|0)+1;c[O>>2]=(c[O>>2]|0)+1}c[G>>2]=c[v>>2];c[E>>2]=c[D>>2];if((c[G>>2]|0)>1){if(c[N>>2]|0)db(c[s>>2]|0,c[D>>2]>>c[I>>2],c[G>>2]<<c[I>>2],c[J>>2]|0);if(c[w>>2]|0)db(c[w>>2]|0,c[D>>2]>>c[I>>2],c[G>>2]<<c[I>>2],c[J>>2]|0)}c[K>>2]=eb(c[r>>2]|0,c[s>>2]|0,c[t>>2]|0,c[u>>2]|0,c[v>>2]|0,c[w>>2]|0,c[x>>2]|0,+g[z>>2],c[B>>2]|0)|0;if(c[L>>2]|0){if((c[G>>2]|0)>1)fb(c[s>>2]|0,c[D>>2]>>c[I>>2],c[G>>2]<<c[I>>2],c[J>>2]|0);c[D>>2]=c[E>>2];c[v>>2]=c[G>>2];c[M>>2]=0;while(1){if((c[M>>2]|0)>=(c[H>>2]|0))break;c[v>>2]=c[v>>2]>>1;c[D>>2]=c[D>>2]<<1;c[K>>2]=c[K>>2]|(c[K>>2]|0)>>>(c[v>>2]|0);wa(c[s>>2]|0,c[D>>2]|0,c[v>>2]|0);c[M>>2]=(c[M>>2]|0)+1}c[M>>2]=0;while(1){if((c[M>>2]|0)>=(c[I>>2]|0))break;c[K>>2]=d[23964+(c[K>>2]|0)>>0];wa(c[s>>2]|0,c[C>>2]>>c[M>>2],1<<c[M>>2]);c[M>>2]=(c[M>>2]|0)+1}c[v>>2]=c[v>>2]<<c[I>>2];a:do if(c[y>>2]|0){g[Q>>2]=+F(+(+(c[C>>2]|0)));c[P>>2]=0;while(1){if((c[P>>2]|0)>=(c[C>>2]|0))break a;g[(c[y>>2]|0)+(c[P>>2]<<2)>>2]=+g[Q>>2]*+g[(c[s>>2]|0)+(c[P>>2]<<2)>>2];c[P>>2]=(c[P>>2]|0)+1}}while(0);c[K>>2]=c[K>>2]&(1<<c[v>>2])-1}c[q>>2]=c[K>>2];R=c[q>>2]|0;l=p;return R|0}function Ba(a,b,d,e,f,h,i,j,k,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;o=l;l=l+160|0;p=o+156|0;q=o+152|0;r=o+148|0;s=o+144|0;t=o+140|0;u=o+136|0;v=o+132|0;w=o+128|0;x=o+124|0;y=o+120|0;z=o+116|0;A=o+112|0;B=o+108|0;C=o+104|0;D=o+100|0;E=o+96|0;F=o+92|0;G=o+88|0;H=o+84|0;I=o+80|0;J=o+76|0;K=o+72|0;L=o+68|0;M=o+64|0;N=o+40|0;O=o+36|0;P=o+32|0;Q=o+28|0;R=o+24|0;S=o+20|0;T=o+16|0;U=o+12|0;V=o+8|0;W=o+4|0;X=o;c[q>>2]=a;c[r>>2]=b;c[s>>2]=d;c[t>>2]=e;c[u>>2]=f;c[v>>2]=h;c[w>>2]=i;c[x>>2]=j;c[y>>2]=k;c[z>>2]=m;c[A>>2]=n;c[B>>2]=0;c[C>>2]=0;c[D>>2]=0;g[E>>2]=0.0;g[F>>2]=0.0;c[G>>2]=0;c[H>>2]=((c[c[q>>2]>>2]|0)!=0^1)&1;c[P>>2]=c[c[q>>2]>>2];c[Q>>2]=c[(c[q>>2]|0)+24>>2];if((c[t>>2]|0)==1){c[p>>2]=Ca(c[q>>2]|0,c[r>>2]|0,c[s>>2]|0,c[u>>2]|0,c[y>>2]|0)|0;Y=c[p>>2]|0;l=o;return Y|0}c[O>>2]=c[A>>2];Da(c[q>>2]|0,N,c[r>>2]|0,c[s>>2]|0,c[t>>2]|0,u,c[v>>2]|0,c[v>>2]|0,c[x>>2]|0,1,A);c[D>>2]=c[N>>2];c[B>>2]=c[N+4>>2];c[C>>2]=c[N+8>>2];c[K>>2]=c[N+12>>2];c[L>>2]=c[N+16>>2];c[M>>2]=c[N+20>>2];g[E>>2]=+(c[B>>2]|0)*.000030517578125;g[F>>2]=+(c[C>>2]|0)*.000030517578125;do if((c[t>>2]|0)==2){c[S>>2]=0;c[I>>2]=c[u>>2];c[J>>2]=0;c[J>>2]=(c[L>>2]|0)!=0&(c[L>>2]|0)!=16384?8:0;c[I>>2]=(c[I>>2]|0)-(c[J>>2]|0);c[R>>2]=(c[L>>2]|0)>8192&1;C=(c[q>>2]|0)+28|0;c[C>>2]=(c[C>>2]|0)-((c[M>>2]|0)+(c[J>>2]|0));c[T>>2]=c[R>>2]|0?c[s>>2]|0:c[r>>2]|0;c[U>>2]=c[R>>2]|0?c[r>>2]|0:c[s>>2]|0;do if(c[J>>2]|0)if(c[P>>2]|0){c[S>>2]=+g[c[T>>2]>>2]*+g[(c[U>>2]|0)+4>>2]-+g[(c[T>>2]|0)+4>>2]*+g[c[U>>2]>>2]<0.0&1;Ea(c[Q>>2]|0,c[S>>2]|0,1);break}else{c[S>>2]=Fa(c[Q>>2]|0,1)|0;break}while(0);c[S>>2]=1-(c[S>>2]<<1);c[G>>2]=Aa(c[q>>2]|0,c[T>>2]|0,c[t>>2]|0,c[I>>2]|0,c[v>>2]|0,c[w>>2]|0,c[x>>2]|0,c[y>>2]|0,1.0,c[z>>2]|0,c[O>>2]|0)|0;g[c[U>>2]>>2]=+(0-(c[S>>2]|0)|0)*+g[(c[T>>2]|0)+4>>2];g[(c[U>>2]|0)+4>>2]=+(c[S>>2]|0)*+g[c[T>>2]>>2];if(c[H>>2]|0){g[c[r>>2]>>2]=+g[E>>2]*+g[c[r>>2]>>2];g[(c[r>>2]|0)+4>>2]=+g[E>>2]*+g[(c[r>>2]|0)+4>>2];g[c[s>>2]>>2]=+g[F>>2]*+g[c[s>>2]>>2];g[(c[s>>2]|0)+4>>2]=+g[F>>2]*+g[(c[s>>2]|0)+4>>2];g[V>>2]=+g[c[r>>2]>>2];g[c[r>>2]>>2]=+g[V>>2]-+g[c[s>>2]>>2];g[c[s>>2]>>2]=+g[V>>2]+ +g[c[s>>2]>>2];g[V>>2]=+g[(c[r>>2]|0)+4>>2];g[(c[r>>2]|0)+4>>2]=+g[V>>2]-+g[(c[s>>2]|0)+4>>2];g[(c[s>>2]|0)+4>>2]=+g[V>>2]+ +g[(c[s>>2]|0)+4>>2]}}else{C=c[u>>2]|0;if((c[u>>2]|0)<(((c[u>>2]|0)-(c[K>>2]|0)|0)/2|0|0))Z=C;else Z=(C-(c[K>>2]|0)|0)/2|0;if(0<=(Z|0)){C=c[u>>2]|0;if((c[u>>2]|0)<(((c[u>>2]|0)-(c[K>>2]|0)|0)/2|0|0))_=C;else _=(C-(c[K>>2]|0)|0)/2|0}else _=0;c[I>>2]=_;c[J>>2]=(c[u>>2]|0)-(c[I>>2]|0);C=(c[q>>2]|0)+28|0;c[C>>2]=(c[C>>2]|0)-(c[M>>2]|0);c[W>>2]=c[(c[q>>2]|0)+28>>2];C=c[q>>2]|0;if((c[I>>2]|0)>=(c[J>>2]|0)){c[G>>2]=Aa(C,c[r>>2]|0,c[t>>2]|0,c[I>>2]|0,c[v>>2]|0,c[w>>2]|0,c[x>>2]|0,c[y>>2]|0,1.0,c[z>>2]|0,c[A>>2]|0)|0;c[W>>2]=(c[I>>2]|0)-((c[W>>2]|0)-(c[(c[q>>2]|0)+28>>2]|0));if((c[W>>2]|0)>24&(c[L>>2]|0)!=0)c[J>>2]=(c[J>>2]|0)+((c[W>>2]|0)-24);B=Aa(c[q>>2]|0,c[s>>2]|0,c[t>>2]|0,c[J>>2]|0,c[v>>2]|0,0,c[x>>2]|0,0,+g[F>>2],0,c[A>>2]>>c[v>>2])|0;c[G>>2]=c[G>>2]|B;break}else{c[G>>2]=Aa(C,c[s>>2]|0,c[t>>2]|0,c[J>>2]|0,c[v>>2]|0,0,c[x>>2]|0,0,+g[F>>2],0,c[A>>2]>>c[v>>2])|0;c[W>>2]=(c[J>>2]|0)-((c[W>>2]|0)-(c[(c[q>>2]|0)+28>>2]|0));if((c[W>>2]|0)>24&(c[L>>2]|0)!=16384)c[I>>2]=(c[I>>2]|0)+((c[W>>2]|0)-24);C=Aa(c[q>>2]|0,c[r>>2]|0,c[t>>2]|0,c[I>>2]|0,c[v>>2]|0,c[w>>2]|0,c[x>>2]|0,c[y>>2]|0,1.0,c[z>>2]|0,c[A>>2]|0)|0;c[G>>2]=c[G>>2]|C;break}}while(0);a:do if(c[H>>2]|0){if((c[t>>2]|0)!=2)Ga(c[r>>2]|0,c[s>>2]|0,+g[E>>2],c[t>>2]|0);if(c[D>>2]|0){c[X>>2]=0;while(1){if((c[X>>2]|0)>=(c[t>>2]|0))break a;g[(c[s>>2]|0)+(c[X>>2]<<2)>>2]=-+g[(c[s>>2]|0)+(c[X>>2]<<2)>>2];c[X>>2]=(c[X>>2]|0)+1}}}while(0);c[p>>2]=c[G>>2];Y=c[p>>2]|0;l=o;return Y|0}function Ca(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=l;l=l+48|0;i=h+44|0;j=h+40|0;k=h+36|0;m=h+32|0;n=h+28|0;o=h+24|0;p=h+20|0;q=h+16|0;r=h+12|0;s=h+8|0;t=h+4|0;u=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=((c[c[i>>2]>>2]|0)!=0^1)&1;c[r>>2]=c[j>>2];c[s>>2]=c[c[i>>2]>>2];c[t>>2]=c[(c[i>>2]|0)+24>>2];c[q>>2]=(c[k>>2]|0)!=0&1;c[p>>2]=0;do{c[u>>2]=0;if((c[(c[i>>2]|0)+28>>2]|0)>=8){if(c[s>>2]|0){c[u>>2]=+g[c[r>>2]>>2]<0.0&1;Ea(c[t>>2]|0,c[u>>2]|0,1)}else c[u>>2]=Fa(c[t>>2]|0,1)|0;f=(c[i>>2]|0)+28|0;c[f>>2]=(c[f>>2]|0)-8;c[m>>2]=(c[m>>2]|0)-8}if(c[o>>2]|0)g[c[r>>2]>>2]=c[u>>2]|0?-1.0:1.0;c[r>>2]=c[k>>2];f=(c[p>>2]|0)+1|0;c[p>>2]=f}while((f|0)<(1+(c[q>>2]|0)|0));if(!(c[n>>2]|0)){l=h;return 1}g[c[n>>2]>>2]=+g[c[j>>2]>>2];l=h;return 1}function Da(a,d,e,f,h,i,j,k,m,n,o){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ua=0,va=0,wa=0,xa=0,za=0,Aa=0;p=l;l=l+160|0;q=p+148|0;r=p+144|0;s=p+140|0;t=p+136|0;u=p+132|0;v=p+128|0;w=p+124|0;x=p+120|0;y=p+116|0;z=p+112|0;A=p+108|0;B=p+104|0;C=p+100|0;D=p+96|0;E=p+92|0;F=p+88|0;G=p+84|0;H=p+80|0;I=p+76|0;J=p+72|0;K=p+68|0;L=p+64|0;M=p+60|0;N=p+56|0;O=p+52|0;P=p+48|0;Q=p+44|0;S=p+40|0;T=p+36|0;U=p+32|0;V=p+28|0;W=p+24|0;X=p+20|0;Y=p+16|0;Z=p+12|0;_=p+8|0;$=p+4|0;aa=p;c[q>>2]=a;c[r>>2]=d;c[s>>2]=e;c[t>>2]=f;c[u>>2]=h;c[v>>2]=i;c[w>>2]=j;c[x>>2]=k;c[y>>2]=m;c[z>>2]=n;c[A>>2]=o;c[C>>2]=0;c[K>>2]=0;c[L>>2]=c[c[q>>2]>>2];c[M>>2]=c[(c[q>>2]|0)+4>>2];c[N>>2]=c[(c[q>>2]|0)+8>>2];c[O>>2]=c[(c[q>>2]|0)+12>>2];c[P>>2]=c[(c[q>>2]|0)+24>>2];c[Q>>2]=c[(c[q>>2]|0)+32>>2];c[H>>2]=(b[(c[(c[M>>2]|0)+56>>2]|0)+(c[N>>2]<<1)>>1]|0)+(c[y>>2]<<3);c[I>>2]=(c[H>>2]>>1)-((c[z>>2]|0?(c[u>>2]|0)==2:0)?16:4);c[B>>2]=Ka(c[u>>2]|0,c[c[v>>2]>>2]|0,c[I>>2]|0,c[H>>2]|0,c[z>>2]|0)|0;if(c[z>>2]|0?(c[N>>2]|0)>=(c[O>>2]|0):0)c[B>>2]=1;if(c[L>>2]|0)c[C>>2]=La(c[s>>2]|0,c[t>>2]|0,c[z>>2]|0,c[u>>2]|0)|0;c[J>>2]=ya(c[P>>2]|0)|0;do if((c[B>>2]|0)!=1){if(c[L>>2]|0)c[C>>2]=(R(c[C>>2]|0,c[B>>2]|0)|0)+8192>>14;do if((c[z>>2]|0)!=0&(c[u>>2]|0)>2){c[S>>2]=3;c[T>>2]=c[C>>2];c[U>>2]=(c[B>>2]|0)/2|0;O=R(c[S>>2]|0,(c[U>>2]|0)+1|0)|0;c[V>>2]=O+(c[U>>2]|0);O=c[P>>2]|0;if(c[L>>2]|0){if((c[T>>2]|0)<=(c[U>>2]|0))ba=R(c[S>>2]|0,c[T>>2]|0)|0;else ba=(c[T>>2]|0)-1-(c[U>>2]|0)+(R((c[U>>2]|0)+1|0,c[S>>2]|0)|0)|0;if((c[T>>2]|0)<=(c[U>>2]|0))ca=R(c[S>>2]|0,(c[T>>2]|0)+1|0)|0;else ca=(c[T>>2]|0)-(c[U>>2]|0)+(R((c[U>>2]|0)+1|0,c[S>>2]|0)|0)|0;Ma(O,ba,ca,c[V>>2]|0);break}c[W>>2]=Na(O,c[V>>2]|0)|0;if((c[W>>2]|0)<(R((c[U>>2]|0)+1|0,c[S>>2]|0)|0))c[T>>2]=(c[W>>2]|0)/(c[S>>2]|0)|0;else c[T>>2]=(c[U>>2]|0)+1+((c[W>>2]|0)-(R((c[U>>2]|0)+1|0,c[S>>2]|0)|0));if((c[T>>2]|0)<=(c[U>>2]|0))da=R(c[S>>2]|0,c[T>>2]|0)|0;else da=(c[T>>2]|0)-1-(c[U>>2]|0)+(R((c[U>>2]|0)+1|0,c[S>>2]|0)|0)|0;if((c[T>>2]|0)<=(c[U>>2]|0))ea=R(c[S>>2]|0,(c[T>>2]|0)+1|0)|0;else ea=(c[T>>2]|0)-(c[U>>2]|0)+(R((c[U>>2]|0)+1|0,c[S>>2]|0)|0)|0;Oa(c[P>>2]|0,da,ea,c[V>>2]|0);c[C>>2]=c[T>>2]}else{if((c[x>>2]|0)>1|(c[z>>2]|0)!=0){O=c[P>>2]|0;if(c[L>>2]|0){Pa(O,c[C>>2]|0,(c[B>>2]|0)+1|0);break}else{c[C>>2]=Qa(O,(c[B>>2]|0)+1|0)|0;break}}c[X>>2]=1;c[Y>>2]=R((c[B>>2]>>1)+1|0,(c[B>>2]>>1)+1|0)|0;if(!(c[L>>2]|0)){c[_>>2]=0;c[$>>2]=Na(c[P>>2]|0,c[Y>>2]|0)|0;if((c[$>>2]|0)<((R(c[B>>2]>>1,(c[B>>2]>>1)+1|0)|0)>>1|0)){c[C>>2]=((Ra((c[$>>2]<<3)+1|0)|0)-1|0)>>>1;c[X>>2]=(c[C>>2]|0)+1;c[_>>2]=(R(c[C>>2]|0,(c[C>>2]|0)+1|0)|0)>>1}else{O=(c[B>>2]|0)+1<<1;c[C>>2]=(O-(Ra(((c[Y>>2]|0)-(c[$>>2]|0)-1<<3)+1|0)|0)|0)>>>1;c[X>>2]=(c[B>>2]|0)+1-(c[C>>2]|0);c[_>>2]=(c[Y>>2]|0)-((R((c[B>>2]|0)+1-(c[C>>2]|0)|0,(c[B>>2]|0)+2-(c[C>>2]|0)|0)|0)>>1)}Oa(c[P>>2]|0,c[_>>2]|0,(c[_>>2]|0)+(c[X>>2]|0)|0,c[Y>>2]|0);break}if((c[C>>2]|0)<=(c[B>>2]>>1|0))fa=(c[C>>2]|0)+1|0;else fa=(c[B>>2]|0)+1-(c[C>>2]|0)|0;c[X>>2]=fa;if((c[C>>2]|0)<=(c[B>>2]>>1|0))ga=(R(c[C>>2]|0,(c[C>>2]|0)+1|0)|0)>>1;else ga=(c[Y>>2]|0)-((R((c[B>>2]|0)+1-(c[C>>2]|0)|0,(c[B>>2]|0)+2-(c[C>>2]|0)|0)|0)>>1)|0;c[Z>>2]=ga;Ma(c[P>>2]|0,c[Z>>2]|0,(c[Z>>2]|0)+(c[X>>2]|0)|0,c[Y>>2]|0)}while(0);c[C>>2]=ta(c[C>>2]<<14,c[B>>2]|0)|0;if((c[L>>2]|0)!=0&(c[z>>2]|0)!=0)if(!(c[C>>2]|0)){Sa(c[M>>2]|0,c[s>>2]|0,c[t>>2]|0,c[Q>>2]|0,c[N>>2]|0,c[u>>2]|0);break}else{Ta(c[s>>2]|0,c[t>>2]|0,c[u>>2]|0);break}}else if(c[z>>2]|0){if(c[L>>2]|0){c[K>>2]=(c[C>>2]|0)>8192&1;a:do if(c[K>>2]|0){c[aa>>2]=0;while(1){if((c[aa>>2]|0)>=(c[u>>2]|0))break a;g[(c[t>>2]|0)+(c[aa>>2]<<2)>>2]=-+g[(c[t>>2]|0)+(c[aa>>2]<<2)>>2];c[aa>>2]=(c[aa>>2]|0)+1}}while(0);Sa(c[M>>2]|0,c[s>>2]|0,c[t>>2]|0,c[Q>>2]|0,c[N>>2]|0,c[u>>2]|0)}do if((c[c[v>>2]>>2]|0)>16?(c[(c[q>>2]|0)+28>>2]|0)>16:0){O=c[P>>2]|0;if(c[L>>2]|0){Ua(O,c[K>>2]|0,2);break}else{c[K>>2]=Va(O,2)|0;break}}else ha=60;while(0);if((ha|0)==60)c[K>>2]=0;c[C>>2]=0}while(0);ha=ya(c[P>>2]|0)|0;c[G>>2]=ha-(c[J>>2]|0);J=c[v>>2]|0;c[J>>2]=(c[J>>2]|0)-(c[G>>2]|0);if(!(c[C>>2]|0)){c[E>>2]=32767;c[F>>2]=0;J=c[A>>2]|0;c[J>>2]=c[J>>2]&(1<<c[w>>2])-1;c[D>>2]=-16384;ia=c[K>>2]|0;ja=c[r>>2]|0;c[ja>>2]=ia;ka=c[E>>2]|0;la=c[r>>2]|0;ma=la+4|0;c[ma>>2]=ka;na=c[F>>2]|0;oa=c[r>>2]|0;pa=oa+8|0;c[pa>>2]=na;qa=c[D>>2]|0;ra=c[r>>2]|0;sa=ra+12|0;c[sa>>2]=qa;ua=c[C>>2]|0;va=c[r>>2]|0;wa=va+16|0;c[wa>>2]=ua;xa=c[G>>2]|0;za=c[r>>2]|0;Aa=za+20|0;c[Aa>>2]=xa;l=p;return}if((c[C>>2]|0)==16384){c[E>>2]=0;c[F>>2]=32767;J=c[A>>2]|0;c[J>>2]=c[J>>2]&(1<<c[w>>2])-1<<c[w>>2];c[D>>2]=16384;ia=c[K>>2]|0;ja=c[r>>2]|0;c[ja>>2]=ia;ka=c[E>>2]|0;la=c[r>>2]|0;ma=la+4|0;c[ma>>2]=ka;na=c[F>>2]|0;oa=c[r>>2]|0;pa=oa+8|0;c[pa>>2]=na;qa=c[D>>2]|0;ra=c[r>>2]|0;sa=ra+12|0;c[sa>>2]=qa;ua=c[C>>2]|0;va=c[r>>2]|0;wa=va+16|0;c[wa>>2]=ua;xa=c[G>>2]|0;za=c[r>>2]|0;Aa=za+20|0;c[Aa>>2]=xa;l=p;return}else{c[E>>2]=(Wa(c[C>>2]&65535)|0)<<16>>16;c[F>>2]=(Wa(16384-(c[C>>2]|0)&65535)|0)<<16>>16;w=((c[u>>2]|0)-1<<7&65535)<<16>>16;c[D>>2]=16384+(R(w,((Xa(c[F>>2]|0,c[E>>2]|0)|0)&65535)<<16>>16)|0)>>15;ia=c[K>>2]|0;ja=c[r>>2]|0;c[ja>>2]=ia;ka=c[E>>2]|0;la=c[r>>2]|0;ma=la+4|0;c[ma>>2]=ka;na=c[F>>2]|0;oa=c[r>>2]|0;pa=oa+8|0;c[pa>>2]=na;qa=c[D>>2]|0;ra=c[r>>2]|0;sa=ra+12|0;c[sa>>2]=qa;ua=c[C>>2]|0;va=c[r>>2]|0;wa=va+16|0;c[wa>>2]=ua;xa=c[G>>2]|0;za=c[r>>2]|0;Aa=za+20|0;c[Aa>>2]=xa;l=p;return}}function Ea(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[i>>2]=c[(c[f>>2]|0)+12>>2];c[j>>2]=c[(c[f>>2]|0)+16>>2];if(((c[j>>2]|0)+(c[h>>2]|0)|0)>>>0>32)do{d=Ja(c[f>>2]|0,c[i>>2]&255)|0;b=(c[f>>2]|0)+44|0;c[b>>2]=c[b>>2]|d;c[i>>2]=(c[i>>2]|0)>>>8;c[j>>2]=(c[j>>2]|0)-8}while((c[j>>2]|0)>=8);c[i>>2]=c[i>>2]|c[g>>2]<<c[j>>2];c[j>>2]=(c[j>>2]|0)+(c[h>>2]|0);c[(c[f>>2]|0)+12>>2]=c[i>>2];c[(c[f>>2]|0)+16>>2]=c[j>>2];j=(c[f>>2]|0)+20|0;c[j>>2]=(c[j>>2]|0)+(c[h>>2]|0);l=e;return}function Fa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;i=d;c[e>>2]=a;c[f>>2]=b;c[g>>2]=c[(c[e>>2]|0)+12>>2];c[h>>2]=c[(c[e>>2]|0)+16>>2];if((c[h>>2]|0)>>>0<(c[f>>2]|0)>>>0)do{b=Ia(c[e>>2]|0)|0;c[g>>2]=c[g>>2]|b<<c[h>>2];c[h>>2]=(c[h>>2]|0)+8}while((c[h>>2]|0)<=24);c[i>>2]=c[g>>2]&(1<<c[f>>2])-1;c[g>>2]=(c[g>>2]|0)>>>(c[f>>2]|0);c[h>>2]=(c[h>>2]|0)-(c[f>>2]|0);c[(c[e>>2]|0)+12>>2]=c[g>>2];c[(c[e>>2]|0)+16>>2]=c[h>>2];h=(c[e>>2]|0)+20|0;c[h>>2]=(c[h>>2]|0)+(c[f>>2]|0);l=d;return c[i>>2]|0}function Ga(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=l;l=l+64|0;h=f+56|0;i=f+52|0;j=f+48|0;k=f+44|0;m=f+40|0;n=f+36|0;o=f+32|0;p=f+28|0;q=f+24|0;r=f+20|0;s=f+16|0;t=f+12|0;u=f+8|0;v=f+4|0;w=f;c[h>>2]=a;c[i>>2]=b;g[j>>2]=d;c[k>>2]=e;g[n>>2]=0.0;g[o>>2]=0.0;Ha(c[i>>2]|0,c[h>>2]|0,c[i>>2]|0,c[k>>2]|0,n,o);g[n>>2]=+g[j>>2]*+g[n>>2];g[r>>2]=+g[j>>2];g[p>>2]=+g[r>>2]*+g[r>>2]+ +g[o>>2]-+g[n>>2]*2.0;g[q>>2]=+g[r>>2]*+g[r>>2]+ +g[o>>2]+ +g[n>>2]*2.0;if(+g[q>>2]<6.000000284984708e-04|+g[p>>2]<6.000000284984708e-04){Ie(c[i>>2]|0,c[h>>2]|0,(c[k>>2]<<2)+0|0)|0;l=f;return}g[s>>2]=+g[p>>2];g[t>>2]=1.0/+F(+(+g[s>>2]));g[s>>2]=+g[q>>2];g[u>>2]=1.0/+F(+(+g[s>>2]));c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;g[w>>2]=+g[j>>2]*+g[(c[h>>2]|0)+(c[m>>2]<<2)>>2];g[v>>2]=+g[(c[i>>2]|0)+(c[m>>2]<<2)>>2];g[(c[h>>2]|0)+(c[m>>2]<<2)>>2]=+g[t>>2]*(+g[w>>2]-+g[v>>2]);g[(c[i>>2]|0)+(c[m>>2]<<2)>>2]=+g[u>>2]*(+g[w>>2]+ +g[v>>2]);c[m>>2]=(c[m>>2]|0)+1}l=f;return}function Ha(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;i=l;l=l+48|0;j=i+32|0;k=i+28|0;m=i+24|0;n=i+20|0;o=i+16|0;p=i+12|0;q=i+8|0;r=i+4|0;s=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;g[r>>2]=0.0;g[s>>2]=0.0;c[q>>2]=0;while(1){t=+g[r>>2];if((c[q>>2]|0)>=(c[n>>2]|0))break;g[r>>2]=t+ +g[(c[j>>2]|0)+(c[q>>2]<<2)>>2]*+g[(c[k>>2]|0)+(c[q>>2]<<2)>>2];g[s>>2]=+g[s>>2]+ +g[(c[j>>2]|0)+(c[q>>2]<<2)>>2]*+g[(c[m>>2]|0)+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}g[c[o>>2]>>2]=t;g[c[p>>2]>>2]=+g[s>>2];l=i;return}function Ia(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=l;l=l+16|0;e=b;c[e>>2]=a;if((c[(c[e>>2]|0)+8>>2]|0)>>>0>=(c[(c[e>>2]|0)+4>>2]|0)>>>0){f=0;l=b;return f|0}a=c[c[e>>2]>>2]|0;g=c[(c[e>>2]|0)+4>>2]|0;h=(c[e>>2]|0)+8|0;e=(c[h>>2]|0)+1|0;c[h>>2]=e;f=d[a+(g-e)>>0]|0;l=b;return f|0}function Ja(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[g>>2]=b;c[h>>2]=d;if(((c[(c[g>>2]|0)+24>>2]|0)+(c[(c[g>>2]|0)+8>>2]|0)|0)>>>0>=(c[(c[g>>2]|0)+4>>2]|0)>>>0){c[f>>2]=-1;i=c[f>>2]|0;l=e;return i|0}else{d=c[h>>2]&255;h=c[c[g>>2]>>2]|0;b=c[(c[g>>2]|0)+4>>2]|0;j=(c[g>>2]|0)+8|0;g=(c[j>>2]|0)+1|0;c[j>>2]=g;a[h+(b-g)>>0]=d;c[f>>2]=0;i=c[f>>2]|0;l=e;return i|0}return 0}function Ka(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=l;l=l+32|0;i=h+28|0;j=h+24|0;k=h+20|0;m=h+16|0;n=h+12|0;o=h+8|0;p=h+4|0;q=h;c[i>>2]=a;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[q>>2]=(c[i>>2]<<1)-1;if((c[n>>2]|0)!=0&(c[i>>2]|0)==2)c[q>>2]=(c[q>>2]|0)+-1;i=(c[j>>2]|0)+(R(c[q>>2]|0,c[k>>2]|0)|0)|0;c[p>>2]=za(i,c[q>>2]|0)|0;if(((c[j>>2]|0)-(c[m>>2]|0)-32|0)<(c[p>>2]|0))r=(c[j>>2]|0)-(c[m>>2]|0)-32|0;else r=c[p>>2]|0;c[p>>2]=r;c[p>>2]=64<(c[p>>2]|0)?64:c[p>>2]|0;if((c[p>>2]|0)<4){c[o>>2]=1;s=c[o>>2]|0;l=h;return s|0}else{c[o>>2]=b[18390+((c[p>>2]&7)<<1)>>1]>>14-(c[p>>2]>>3);c[o>>2]=(c[o>>2]|0)+1>>1<<1;s=c[o>>2]|0;l=h;return s|0}return 0}function La(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;f=l;l=l+48|0;h=f+44|0;i=f+40|0;j=f+36|0;k=f+32|0;m=f+28|0;n=f+24|0;o=f+20|0;p=f+16|0;q=f+12|0;r=f+8|0;s=f+4|0;t=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;g[r>>2]=1.0000000036274937e-15;g[q>>2]=1.0000000036274937e-15;a:do if(c[j>>2]|0){c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break a;g[s>>2]=+g[(c[h>>2]|0)+(c[m>>2]<<2)>>2]+ +g[(c[i>>2]|0)+(c[m>>2]<<2)>>2];g[t>>2]=+g[(c[h>>2]|0)+(c[m>>2]<<2)>>2]-+g[(c[i>>2]|0)+(c[m>>2]<<2)>>2];g[q>>2]=+g[q>>2]+ +g[s>>2]*+g[s>>2];g[r>>2]=+g[r>>2]+ +g[t>>2]*+g[t>>2];c[m>>2]=(c[m>>2]|0)+1}}else{u=+va(c[h>>2]|0,c[h>>2]|0,c[k>>2]|0);g[q>>2]=+g[q>>2]+u;u=+va(c[i>>2]|0,c[i>>2]|0,c[k>>2]|0);g[r>>2]=+g[r>>2]+u}while(0);g[o>>2]=+F(+(+g[q>>2]));g[p>>2]=+F(+(+g[r>>2]));c[n>>2]=~~+D(+(+N(+(+g[p>>2]),+(+g[o>>2]))*10430.3818359375+.5));l=f;return c[n>>2]|0}function Ma(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=cb(c[(c[g>>2]|0)+28>>2]|0,c[j>>2]|0)|0;if((c[h>>2]|0)>>>0>0){e=(c[(c[g>>2]|0)+28>>2]|0)-(R(c[k>>2]|0,(c[j>>2]|0)-(c[h>>2]|0)|0)|0)|0;d=(c[g>>2]|0)+32|0;c[d>>2]=(c[d>>2]|0)+e;e=R(c[k>>2]|0,(c[i>>2]|0)-(c[h>>2]|0)|0)|0;c[(c[g>>2]|0)+28>>2]=e;m=c[g>>2]|0;_a(m);l=f;return}else{e=R(c[k>>2]|0,(c[j>>2]|0)-(c[i>>2]|0)|0)|0;i=(c[g>>2]|0)+28|0;c[i>>2]=(c[i>>2]|0)-e;m=c[g>>2]|0;_a(m);l=f;return}}function Na(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[e>>2]=a;c[f>>2]=b;b=bb(c[(c[e>>2]|0)+28>>2]|0,c[f>>2]|0)|0;c[(c[e>>2]|0)+36>>2]=b;c[g>>2]=((c[(c[e>>2]|0)+32>>2]|0)>>>0)/((c[(c[e>>2]|0)+36>>2]|0)>>>0)|0;l=d;return (c[f>>2]|0)-((c[g>>2]|0)+1+((c[f>>2]|0)-((c[g>>2]|0)+1)&0-((c[f>>2]|0)>>>0<((c[g>>2]|0)+1|0)>>>0&1)))|0}function Oa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=R(c[(c[g>>2]|0)+36>>2]|0,(c[j>>2]|0)-(c[i>>2]|0)|0)|0;j=(c[g>>2]|0)+32|0;c[j>>2]=(c[j>>2]|0)-(c[k>>2]|0);j=c[g>>2]|0;if((c[h>>2]|0)>>>0>0){m=R(c[j+36>>2]|0,(c[i>>2]|0)-(c[h>>2]|0)|0)|0;n=c[g>>2]|0;o=n+28|0;c[o>>2]=m;p=c[g>>2]|0;Ya(p);l=f;return}else{m=(c[j+28>>2]|0)-(c[k>>2]|0)|0;n=c[g>>2]|0;o=n+28|0;c[o>>2]=m;p=c[g>>2]|0;Ya(p);l=f;return}}function Pa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[h>>2]=(c[h>>2]|0)+-1;c[k>>2]=32-(U(c[h>>2]|0)|0);if((c[k>>2]|0)>8){c[k>>2]=(c[k>>2]|0)-8;c[i>>2]=((c[h>>2]|0)>>>(c[k>>2]|0))+1;c[j>>2]=(c[g>>2]|0)>>>(c[k>>2]|0);Ma(c[f>>2]|0,c[j>>2]|0,(c[j>>2]|0)+1|0,c[i>>2]|0);Ea(c[f>>2]|0,c[g>>2]&(1<<c[k>>2])-1,c[k>>2]|0);l=e;return}else{Ma(c[f>>2]|0,c[g>>2]|0,(c[g>>2]|0)+1|0,(c[h>>2]|0)+1|0);l=e;return}}function Qa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;d=l;l=l+32|0;e=d+24|0;f=d+20|0;g=d+16|0;h=d+12|0;i=d+8|0;j=d+4|0;k=d;c[f>>2]=a;c[g>>2]=b;c[g>>2]=(c[g>>2]|0)+-1;c[j>>2]=32-(U(c[g>>2]|0)|0);if((c[j>>2]|0)<=8){c[g>>2]=(c[g>>2]|0)+1;c[i>>2]=Na(c[f>>2]|0,c[g>>2]|0)|0;Oa(c[f>>2]|0,c[i>>2]|0,(c[i>>2]|0)+1|0,c[g>>2]|0);c[e>>2]=c[i>>2];m=c[e>>2]|0;l=d;return m|0}c[j>>2]=(c[j>>2]|0)-8;c[h>>2]=((c[g>>2]|0)>>>(c[j>>2]|0))+1;c[i>>2]=Na(c[f>>2]|0,c[h>>2]|0)|0;Oa(c[f>>2]|0,c[i>>2]|0,(c[i>>2]|0)+1|0,c[h>>2]|0);h=c[i>>2]<<c[j>>2];c[k>>2]=h|(Fa(c[f>>2]|0,c[j>>2]|0)|0);if((c[k>>2]|0)>>>0<=(c[g>>2]|0)>>>0){c[e>>2]=c[k>>2];m=c[e>>2]|0;l=d;return m|0}else{c[(c[f>>2]|0)+44>>2]=1;c[e>>2]=c[g>>2];m=c[e>>2]|0;l=d;return m|0}return 0}function Ra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=l;l=l+32|0;d=b+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;c[d>>2]=a;c[f>>2]=0;c[g>>2]=32-(U(c[d>>2]|0)|0)-1>>1;c[e>>2]=1<<c[g>>2];do{c[h>>2]=(c[f>>2]<<1)+(c[e>>2]|0)<<c[g>>2];if((c[h>>2]|0)>>>0<=(c[d>>2]|0)>>>0){c[f>>2]=(c[f>>2]|0)+(c[e>>2]|0);c[d>>2]=(c[d>>2]|0)-(c[h>>2]|0)}c[e>>2]=(c[e>>2]|0)>>>1;c[g>>2]=(c[g>>2]|0)+-1}while((c[g>>2]|0)>=0);l=b;return c[f>>2]|0}function Sa(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;i=l;l=l+64|0;j=i+56|0;k=i+52|0;m=i+48|0;n=i+44|0;o=i+40|0;p=i+36|0;q=i+32|0;r=i+28|0;s=i+24|0;t=i+20|0;u=i+16|0;v=i+12|0;w=i+8|0;x=i+4|0;y=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[q>>2]=c[o>>2];g[u>>2]=+g[(c[n>>2]|0)+(c[q>>2]<<2)>>2];g[v>>2]=+g[(c[n>>2]|0)+((c[q>>2]|0)+(c[(c[j>>2]|0)+8>>2]|0)<<2)>>2];g[w>>2]=+F(+(+g[u>>2]*+g[u>>2]+1.0000000036274937e-15+ +g[v>>2]*+g[v>>2]))+1.0000000036274937e-15;g[s>>2]=+g[u>>2]/+g[w>>2];g[t>>2]=+g[v>>2]/+g[w>>2];c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[p>>2]|0))break;g[y>>2]=+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2];g[x>>2]=+g[(c[m>>2]|0)+(c[r>>2]<<2)>>2];g[(c[k>>2]|0)+(c[r>>2]<<2)>>2]=+g[s>>2]*+g[y>>2]+ +g[t>>2]*+g[x>>2];c[r>>2]=(c[r>>2]|0)+1}l=i;return}function Ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+20|0;h=e+16|0;i=e+12|0;j=e+8|0;k=e+4|0;m=e;c[f>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[i>>2]|0))break;g[m>>2]=+g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]*.7071067690849304;g[k>>2]=+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2]*.7071067690849304;g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]=+g[m>>2]+ +g[k>>2];g[(c[h>>2]|0)+(c[j>>2]<<2)>>2]=+g[k>>2]-+g[m>>2];c[j>>2]=(c[j>>2]|0)+1}l=e;return}function Ua(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[i>>2]=c[(c[f>>2]|0)+28>>2];c[k>>2]=c[(c[f>>2]|0)+32>>2];c[j>>2]=(c[i>>2]|0)>>>(c[h>>2]|0);c[i>>2]=(c[i>>2]|0)-(c[j>>2]|0);if(c[g>>2]|0)c[(c[f>>2]|0)+32>>2]=(c[k>>2]|0)+(c[i>>2]|0);c[(c[f>>2]|0)+28>>2]=c[g>>2]|0?c[j>>2]|0:c[i>>2]|0;_a(c[f>>2]|0);l=e;return}function Va(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+32|0;e=d+20|0;f=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;c[e>>2]=a;c[f>>2]=b;c[g>>2]=c[(c[e>>2]|0)+28>>2];c[h>>2]=c[(c[e>>2]|0)+32>>2];c[i>>2]=(c[g>>2]|0)>>>(c[f>>2]|0);c[j>>2]=(c[h>>2]|0)>>>0<(c[i>>2]|0)>>>0&1;if(!(c[j>>2]|0))c[(c[e>>2]|0)+32>>2]=(c[h>>2]|0)-(c[i>>2]|0);if(c[j>>2]|0){k=c[i>>2]|0;m=c[e>>2]|0;n=m+28|0;c[n>>2]=k;o=c[e>>2]|0;Ya(o);p=c[j>>2]|0;l=d;return p|0}else{k=(c[g>>2]|0)-(c[i>>2]|0)|0;m=c[e>>2]|0;n=m+28|0;c[n>>2]=k;o=c[e>>2]|0;Ya(o);p=c[j>>2]|0;l=d;return p|0}return 0}function Wa(a){a=a|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d+6|0;f=d;g=d+4|0;b[e>>1]=a;c[f>>2]=4096+(R(b[e>>1]|0,b[e>>1]|0)|0)>>13;b[g>>1]=c[f>>2];b[g>>1]=32767-(b[g>>1]|0)+(16384+(R(b[g>>1]|0,((16384+(R(b[g>>1]|0,(8277+(16384+(R(-626,b[g>>1]|0)|0)>>15)&65535)<<16>>16)|0)>>15)+-7651&65535)<<16>>16)|0)>>15);l=d;return 1+(b[g>>1]|0)&65535|0}function Xa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[e>>2]=a;c[f>>2]=b;c[g>>2]=32-(U(c[f>>2]|0)|0);c[h>>2]=32-(U(c[e>>2]|0)|0);c[f>>2]=c[f>>2]<<15-(c[g>>2]|0);c[e>>2]=c[e>>2]<<15-(c[h>>2]|0);b=((c[h>>2]|0)-(c[g>>2]|0)<<11)+(16384+(R((c[e>>2]&65535)<<16>>16,((16384+(R((c[e>>2]&65535)<<16>>16,-2597)|0)>>15)+7932&65535)<<16>>16)|0)>>15)|0;e=b-(16384+(R((c[f>>2]&65535)<<16>>16,((16384+(R((c[f>>2]&65535)<<16>>16,-2597)|0)>>15)+7932&65535)<<16>>16)|0)>>15)|0;l=d;return e|0}function Ya(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;while(1){if((c[(c[d>>2]|0)+28>>2]|0)>>>0>8388608)break;a=(c[d>>2]|0)+20|0;c[a>>2]=(c[a>>2]|0)+8;a=(c[d>>2]|0)+28|0;c[a>>2]=c[a>>2]<<8;c[e>>2]=c[(c[d>>2]|0)+40>>2];a=Za(c[d>>2]|0)|0;c[(c[d>>2]|0)+40>>2]=a;c[e>>2]=(c[e>>2]<<8|c[(c[d>>2]|0)+40>>2])>>1;c[(c[d>>2]|0)+32>>2]=(c[(c[d>>2]|0)+32>>2]<<8)+(255&~c[e>>2])&2147483647}l=b;return}function Za(a){a=a|0;var b=0,e=0,f=0,g=0;b=l;l=l+16|0;e=b;c[e>>2]=a;if((c[(c[e>>2]|0)+24>>2]|0)>>>0>=(c[(c[e>>2]|0)+4>>2]|0)>>>0){f=0;l=b;return f|0}a=c[c[e>>2]>>2]|0;g=(c[e>>2]|0)+24|0;e=c[g>>2]|0;c[g>>2]=e+1;f=d[a+e>>0]|0;l=b;return f|0}function _a(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;while(1){if((c[(c[d>>2]|0)+28>>2]|0)>>>0>8388608)break;$a(c[d>>2]|0,(c[(c[d>>2]|0)+32>>2]|0)>>>23);c[(c[d>>2]|0)+32>>2]=c[(c[d>>2]|0)+32>>2]<<8&2147483647;a=(c[d>>2]|0)+28|0;c[a>>2]=c[a>>2]<<8;a=(c[d>>2]|0)+20|0;c[a>>2]=(c[a>>2]|0)+8}l=b;return}function $a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[e>>2]=a;c[f>>2]=b;if((c[f>>2]|0)==255){b=(c[e>>2]|0)+36|0;c[b>>2]=(c[b>>2]|0)+1;l=d;return}c[g>>2]=c[f>>2]>>8;if((c[(c[e>>2]|0)+40>>2]|0)>=0){b=ab(c[e>>2]|0,(c[(c[e>>2]|0)+40>>2]|0)+(c[g>>2]|0)|0)|0;a=(c[e>>2]|0)+44|0;c[a>>2]=c[a>>2]|b}if((c[(c[e>>2]|0)+36>>2]|0)>>>0>0){c[h>>2]=255+(c[g>>2]|0)&255;do{g=ab(c[e>>2]|0,c[h>>2]|0)|0;b=(c[e>>2]|0)+44|0;c[b>>2]=c[b>>2]|g;g=(c[e>>2]|0)+36|0;b=(c[g>>2]|0)+-1|0;c[g>>2]=b}while(b>>>0>0)}c[(c[e>>2]|0)+40>>2]=c[f>>2]&255;l=d;return}function ab(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[g>>2]=b;c[h>>2]=d;if(((c[(c[g>>2]|0)+24>>2]|0)+(c[(c[g>>2]|0)+8>>2]|0)|0)>>>0>=(c[(c[g>>2]|0)+4>>2]|0)>>>0){c[f>>2]=-1;i=c[f>>2]|0;l=e;return i|0}else{d=c[h>>2]&255;h=c[c[g>>2]>>2]|0;b=(c[g>>2]|0)+24|0;g=c[b>>2]|0;c[b>>2]=g+1;a[h+g>>0]=d;c[f>>2]=0;i=c[f>>2]|0;l=e;return i|0}return 0}function bb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>>>0)/((c[f>>2]|0)>>>0)|0|0}function cb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>>>0)/((c[f>>2]|0)>>>0)|0|0}function db(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=l;l=l+48|0;h=f+32|0;i=f+28|0;j=f+24|0;k=f+20|0;m=f+16|0;n=f+12|0;o=f+8|0;p=f+4|0;q=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[o>>2]=R(c[i>>2]|0,c[j>>2]|0)|0;e=c[o>>2]|0;c[p>>2]=da()|0;d=l;l=l+((1*(e<<2)|0)+15&-16)|0;if(c[k>>2]|0){c[q>>2]=212+(c[j>>2]<<2)+-8;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[i>>2]|0))break;k=R(c[n>>2]|0,c[j>>2]|0)|0;e=R(c[(c[q>>2]|0)+(c[m>>2]<<2)>>2]|0,c[i>>2]|0)|0;g[d+(e+(c[n>>2]|0)<<2)>>2]=+g[(c[h>>2]|0)+(k+(c[m>>2]|0)<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}r=c[h>>2]|0;s=c[o>>2]|0;t=s<<2;u=c[h>>2]|0;v=u;w=d;x=v-w|0;y=(x|0)/4|0;z=0;A=t+z|0;Ie(r|0,d|0,A|0)|0;B=c[p>>2]|0;ga(B|0);l=f;return}else{c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[i>>2]|0))break;q=R(c[n>>2]|0,c[j>>2]|0)|0;k=R(c[m>>2]|0,c[i>>2]|0)|0;g[d+(k+(c[n>>2]|0)<<2)>>2]=+g[(c[h>>2]|0)+(q+(c[m>>2]|0)<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}r=c[h>>2]|0;s=c[o>>2]|0;t=s<<2;u=c[h>>2]|0;v=u;w=d;x=v-w|0;y=(x|0)/4|0;z=0;A=t+z|0;Ie(r|0,d|0,A|0)|0;B=c[p>>2]|0;ga(B|0);l=f;return}}function eb(a,e,f,h,i,j,k,m,n){a=a|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=+m;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;o=l;l=l+176|0;p=o+164|0;q=o+160|0;r=o+156|0;s=o+152|0;t=o+148|0;u=o+144|0;v=o+140|0;w=o+136|0;x=o+132|0;y=o+128|0;z=o+124|0;A=o+120|0;B=o+116|0;C=o+112|0;D=o+108|0;E=o+104|0;F=o+100|0;G=o+96|0;H=o+92|0;I=o+88|0;J=o+84|0;K=o+80|0;L=o+76|0;M=o+72|0;N=o+68|0;O=o+64|0;P=o+60|0;Q=o+56|0;S=o+52|0;T=o+48|0;U=o+24|0;V=o+20|0;W=o+16|0;X=o+12|0;Y=o+8|0;Z=o+4|0;_=o;c[p>>2]=a;c[q>>2]=e;c[r>>2]=f;c[s>>2]=h;c[t>>2]=i;c[u>>2]=j;c[v>>2]=k;g[w>>2]=m;c[x>>2]=n;c[B>>2]=0;c[C>>2]=0;c[D>>2]=c[t>>2];g[E>>2]=0.0;g[F>>2]=0.0;c[G>>2]=0;c[H>>2]=((c[c[p>>2]>>2]|0)!=0^1)&1;c[I>>2]=0;c[J>>2]=c[c[p>>2]>>2];c[K>>2]=c[(c[p>>2]|0)+4>>2];c[L>>2]=c[(c[p>>2]|0)+8>>2];c[M>>2]=c[(c[p>>2]|0)+16>>2];c[N>>2]=c[(c[p>>2]|0)+24>>2];n=R((c[v>>2]|0)+1|0,c[(c[K>>2]|0)+8>>2]|0)|0;c[y>>2]=(c[(c[K>>2]|0)+92+8>>2]|0)+(b[(c[(c[K>>2]|0)+92+4>>2]|0)+(n+(c[L>>2]|0)<<1)>>1]|0);if((c[v>>2]|0)!=-1?((c[r>>2]|0)>2?(c[s>>2]|0)>((d[(c[y>>2]|0)+(d[c[y>>2]>>0]|0)>>0]|0)+12|0):0):0){c[V>>2]=0;c[r>>2]=c[r>>2]>>1;c[I>>2]=(c[q>>2]|0)+(c[r>>2]<<2);c[v>>2]=(c[v>>2]|0)-1;if((c[t>>2]|0)==1)c[x>>2]=c[x>>2]&1|c[x>>2]<<1;c[t>>2]=(c[t>>2]|0)+1>>1;Da(c[p>>2]|0,U,c[q>>2]|0,c[I>>2]|0,c[r>>2]|0,s,c[t>>2]|0,c[D>>2]|0,c[v>>2]|0,0,x);c[B>>2]=c[U+4>>2];c[C>>2]=c[U+8>>2];c[Q>>2]=c[U+12>>2];c[S>>2]=c[U+16>>2];c[T>>2]=c[U+20>>2];g[E>>2]=+(c[B>>2]|0)*.000030517578125;g[F>>2]=+(c[C>>2]|0)*.000030517578125;do if((c[D>>2]|0)>1?c[S>>2]&16383|0:0){C=c[Q>>2]|0;if((c[S>>2]|0)>8192){c[Q>>2]=(c[Q>>2]|0)-(C>>4-(c[v>>2]|0));break}if(0<(C+(c[r>>2]<<3>>5-(c[v>>2]|0))|0))$=0;else $=(c[Q>>2]|0)+(c[r>>2]<<3>>5-(c[v>>2]|0))|0;c[Q>>2]=$}while(0);$=c[s>>2]|0;if((c[s>>2]|0)<(((c[s>>2]|0)-(c[Q>>2]|0)|0)/2|0|0))aa=$;else aa=($-(c[Q>>2]|0)|0)/2|0;if(0<=(aa|0)){aa=c[s>>2]|0;if((c[s>>2]|0)<(((c[s>>2]|0)-(c[Q>>2]|0)|0)/2|0|0))ba=aa;else ba=(aa-(c[Q>>2]|0)|0)/2|0}else ba=0;c[O>>2]=ba;c[P>>2]=(c[s>>2]|0)-(c[O>>2]|0);ba=(c[p>>2]|0)+28|0;c[ba>>2]=(c[ba>>2]|0)-(c[T>>2]|0);if(c[u>>2]|0)c[V>>2]=(c[u>>2]|0)+(c[r>>2]<<2);c[W>>2]=c[(c[p>>2]|0)+28>>2];T=c[p>>2]|0;if((c[O>>2]|0)>=(c[P>>2]|0)){c[G>>2]=eb(T,c[q>>2]|0,c[r>>2]|0,c[O>>2]|0,c[t>>2]|0,c[u>>2]|0,c[v>>2]|0,+g[w>>2]*+g[E>>2],c[x>>2]|0)|0;c[W>>2]=(c[O>>2]|0)-((c[W>>2]|0)-(c[(c[p>>2]|0)+28>>2]|0));if((c[W>>2]|0)>24&(c[S>>2]|0)!=0)c[P>>2]=(c[P>>2]|0)+((c[W>>2]|0)-24);ba=eb(c[p>>2]|0,c[I>>2]|0,c[r>>2]|0,c[P>>2]|0,c[t>>2]|0,c[V>>2]|0,c[v>>2]|0,+g[w>>2]*+g[F>>2],c[x>>2]>>c[t>>2])|0;c[G>>2]=c[G>>2]|ba<<(c[D>>2]>>1);ca=c[G>>2]|0;l=o;return ca|0}else{ba=eb(T,c[I>>2]|0,c[r>>2]|0,c[P>>2]|0,c[t>>2]|0,c[V>>2]|0,c[v>>2]|0,+g[w>>2]*+g[F>>2],c[x>>2]>>c[t>>2])|0;c[G>>2]=ba<<(c[D>>2]>>1);c[W>>2]=(c[P>>2]|0)-((c[W>>2]|0)-(c[(c[p>>2]|0)+28>>2]|0));if((c[W>>2]|0)>24&(c[S>>2]|0)!=16384)c[O>>2]=(c[O>>2]|0)+((c[W>>2]|0)-24);W=eb(c[p>>2]|0,c[q>>2]|0,c[r>>2]|0,c[O>>2]|0,c[t>>2]|0,c[u>>2]|0,c[v>>2]|0,+g[w>>2]*+g[E>>2],c[x>>2]|0)|0;c[G>>2]=c[G>>2]|W;ca=c[G>>2]|0;l=o;return ca|0}}c[z>>2]=gb(c[K>>2]|0,c[L>>2]|0,c[v>>2]|0,c[s>>2]|0)|0;c[A>>2]=hb(c[K>>2]|0,c[L>>2]|0,c[v>>2]|0,c[z>>2]|0)|0;s=c[p>>2]|0;W=c[A>>2]|0;while(1){E=s+28|0;c[E>>2]=(c[E>>2]|0)-W;if(!((c[(c[p>>2]|0)+28>>2]|0)<0?(c[z>>2]|0)>0:0))break;E=(c[p>>2]|0)+28|0;c[E>>2]=(c[E>>2]|0)+(c[A>>2]|0);c[z>>2]=(c[z>>2]|0)+-1;c[A>>2]=hb(c[K>>2]|0,c[L>>2]|0,c[v>>2]|0,c[z>>2]|0)|0;s=c[p>>2]|0;W=c[A>>2]|0}if(c[z>>2]|0){c[X>>2]=ib(c[z>>2]|0)|0;z=c[q>>2]|0;A=c[r>>2]|0;W=c[X>>2]|0;X=c[M>>2]|0;M=c[t>>2]|0;s=c[N>>2]|0;if(c[J>>2]|0){c[G>>2]=jb(z,A,W,X,M,s)|0;ca=c[G>>2]|0;l=o;return ca|0}else{c[G>>2]=kb(z,A,W,X,M,s,+g[w>>2])|0;ca=c[G>>2]|0;l=o;return ca|0}}if(!(c[H>>2]|0)){ca=c[G>>2]|0;l=o;return ca|0}c[Z>>2]=(1<<c[t>>2])-1;c[x>>2]=c[x>>2]&c[Z>>2];if(!(c[x>>2]|0)){He(c[q>>2]|0,0,c[r>>2]<<2|0)|0;ca=c[G>>2]|0;l=o;return ca|0}t=(c[u>>2]|0)==0;c[Y>>2]=0;if(t){while(1){if((c[Y>>2]|0)>=(c[r>>2]|0))break;t=qa(c[(c[p>>2]|0)+36>>2]|0)|0;c[(c[p>>2]|0)+36>>2]=t;g[(c[q>>2]|0)+(c[Y>>2]<<2)>>2]=+(c[(c[p>>2]|0)+36>>2]>>20|0);c[Y>>2]=(c[Y>>2]|0)+1}c[G>>2]=c[Z>>2]}else{while(1){if((c[Y>>2]|0)>=(c[r>>2]|0))break;Z=qa(c[(c[p>>2]|0)+36>>2]|0)|0;c[(c[p>>2]|0)+36>>2]=Z;g[_>>2]=.00390625;m=+g[_>>2];g[_>>2]=c[(c[p>>2]|0)+36>>2]&32768|0?m:-m;g[(c[q>>2]|0)+(c[Y>>2]<<2)>>2]=+g[(c[u>>2]|0)+(c[Y>>2]<<2)>>2]+ +g[_>>2];c[Y>>2]=(c[Y>>2]|0)+1}c[G>>2]=c[x>>2]}ua(c[q>>2]|0,c[r>>2]|0,+g[w>>2]);ca=c[G>>2]|0;l=o;return ca|0}function fb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=l;l=l+48|0;h=f+32|0;i=f+28|0;j=f+24|0;k=f+20|0;m=f+16|0;n=f+12|0;o=f+8|0;p=f+4|0;q=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[o>>2]=R(c[i>>2]|0,c[j>>2]|0)|0;e=c[o>>2]|0;c[p>>2]=da()|0;d=l;l=l+((1*(e<<2)|0)+15&-16)|0;if(c[k>>2]|0){c[q>>2]=212+(c[j>>2]<<2)+-8;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[i>>2]|0))break;k=R(c[(c[q>>2]|0)+(c[m>>2]<<2)>>2]|0,c[i>>2]|0)|0;e=R(c[n>>2]|0,c[j>>2]|0)|0;g[d+(e+(c[m>>2]|0)<<2)>>2]=+g[(c[h>>2]|0)+(k+(c[n>>2]|0)<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}r=c[h>>2]|0;s=c[o>>2]|0;t=s<<2;u=c[h>>2]|0;v=u;w=d;x=v-w|0;y=(x|0)/4|0;z=0;A=t+z|0;Ie(r|0,d|0,A|0)|0;B=c[p>>2]|0;ga(B|0);l=f;return}else{c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[i>>2]|0))break;q=R(c[m>>2]|0,c[i>>2]|0)|0;k=R(c[n>>2]|0,c[j>>2]|0)|0;g[d+(k+(c[m>>2]|0)<<2)>>2]=+g[(c[h>>2]|0)+(q+(c[n>>2]|0)<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}r=c[h>>2]|0;s=c[o>>2]|0;t=s<<2;u=c[h>>2]|0;v=u;w=d;x=v-w|0;y=(x|0)/4|0;z=0;A=t+z|0;Ie(r|0,d|0,A|0)|0;B=c[p>>2]|0;ga(B|0);l=f;return}}function gb(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=l;l=l+48|0;i=h+36|0;j=h+32|0;k=h+28|0;m=h+24|0;n=h+20|0;o=h+16|0;p=h+12|0;q=h+8|0;r=h+4|0;s=h;c[j>>2]=a;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[m>>2]=(c[m>>2]|0)+1;g=R(c[m>>2]|0,c[(c[j>>2]|0)+8>>2]|0)|0;c[r>>2]=(c[(c[j>>2]|0)+92+8>>2]|0)+(b[(c[(c[j>>2]|0)+92+4>>2]|0)+(g+(c[k>>2]|0)<<1)>>1]|0);c[p>>2]=0;c[q>>2]=d[c[r>>2]>>0];c[n>>2]=(c[n>>2]|0)+-1;c[o>>2]=0;while(1){if((c[o>>2]|0)>=6)break;c[s>>2]=(c[p>>2]|0)+(c[q>>2]|0)+1>>1;k=c[s>>2]|0;if((d[(c[r>>2]|0)+(c[s>>2]|0)>>0]|0)>=(c[n>>2]|0))c[q>>2]=k;else c[p>>2]=k;c[o>>2]=(c[o>>2]|0)+1}if(!(c[p>>2]|0))t=-1;else t=d[(c[r>>2]|0)+(c[p>>2]|0)>>0]|0;if(((c[n>>2]|0)-t|0)<=((d[(c[r>>2]|0)+(c[q>>2]|0)>>0]|0)-(c[n>>2]|0)|0)){c[i>>2]=c[p>>2];u=c[i>>2]|0;l=h;return u|0}else{c[i>>2]=c[q>>2];u=c[i>>2]|0;l=h;return u|0}return 0}function hb(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;h=l;l=l+32|0;i=h+16|0;j=h+12|0;k=h+8|0;m=h+4|0;n=h;c[i>>2]=a;c[j>>2]=e;c[k>>2]=f;c[m>>2]=g;c[k>>2]=(c[k>>2]|0)+1;g=R(c[k>>2]|0,c[(c[i>>2]|0)+8>>2]|0)|0;c[n>>2]=(c[(c[i>>2]|0)+92+8>>2]|0)+(b[(c[(c[i>>2]|0)+92+4>>2]|0)+(g+(c[j>>2]|0)<<1)>>1]|0);if(!(c[m>>2]|0)){o=0;l=h;return o|0}o=(d[(c[n>>2]|0)+(c[m>>2]|0)>>0]|0)+1|0;l=h;return o|0}function ib(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=c[d>>2]|0;if((c[d>>2]|0)<8){e=a;l=b;return e|0}e=8+(a&7)<<(c[d>>2]>>3)-1;l=b;return e|0}function jb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0;i=l;l=l+96|0;j=i+84|0;k=i+80|0;m=i+76|0;n=i+72|0;o=i+68|0;p=i+64|0;q=i+60|0;r=i+56|0;s=i+52|0;t=i+48|0;u=i+44|0;v=i+40|0;w=i+36|0;x=i+32|0;y=i+28|0;z=i+24|0;A=i+20|0;B=i+16|0;C=i+12|0;E=i+8|0;F=i+4|0;G=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;h=c[k>>2]|0;c[y>>2]=da()|0;f=l;l=l+((1*(h<<2)|0)+15&-16)|0;h=l;l=l+((1*(c[k>>2]<<2)|0)+15&-16)|0;e=l;l=l+((1*(c[k>>2]<<2)|0)+15&-16)|0;nb(c[j>>2]|0,c[k>>2]|0,1,c[o>>2]|0,c[m>>2]|0,c[n>>2]|0);g[u>>2]=0.0;c[r>>2]=0;do{n=e+(c[r>>2]<<2)|0;if(+g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]>0.0)g[n>>2]=1.0;else{g[n>>2]=-1.0;g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]=-+g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]}c[h+(c[r>>2]<<2)>>2]=0;g[f+(c[r>>2]<<2)>>2]=0.0;n=(c[r>>2]|0)+1|0;c[r>>2]=n}while((n|0)<(c[k>>2]|0));g[w>>2]=0.0;g[v>>2]=0.0;c[t>>2]=c[m>>2];if((c[m>>2]|0)>(c[k>>2]>>1|0)){c[r>>2]=0;do{g[u>>2]=+g[u>>2]+ +g[(c[j>>2]|0)+(c[r>>2]<<2)>>2];n=(c[r>>2]|0)+1|0;c[r>>2]=n}while((n|0)<(c[k>>2]|0));if(!(+g[u>>2]>1.0000000036274937e-15&+g[u>>2]<64.0)){g[c[j>>2]>>2]=1.0;c[r>>2]=1;do{g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]=0.0;n=(c[r>>2]|0)+1|0;c[r>>2]=n}while((n|0)<(c[k>>2]|0));g[u>>2]=1.0}g[z>>2]=+((c[m>>2]|0)-1|0)*(1.0/+g[u>>2]);c[r>>2]=0;do{u=~~+D(+(+g[z>>2]*+g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]));c[h+(c[r>>2]<<2)>>2]=u;g[f+(c[r>>2]<<2)>>2]=+(c[h+(c[r>>2]<<2)>>2]|0);g[w>>2]=+g[w>>2]+ +g[f+(c[r>>2]<<2)>>2]*+g[f+(c[r>>2]<<2)>>2];g[v>>2]=+g[v>>2]+ +g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]*+g[f+(c[r>>2]<<2)>>2];u=f+(c[r>>2]<<2)|0;g[u>>2]=+g[u>>2]*2.0;c[t>>2]=(c[t>>2]|0)-(c[h+(c[r>>2]<<2)>>2]|0);u=(c[r>>2]|0)+1|0;c[r>>2]=u}while((u|0)<(c[k>>2]|0))}if((c[t>>2]|0)>((c[k>>2]|0)+3|0)){g[A>>2]=+(c[t>>2]|0);g[w>>2]=+g[w>>2]+ +g[A>>2]*+g[A>>2];g[w>>2]=+g[w>>2]+ +g[A>>2]*+g[f>>2];c[h>>2]=(c[h>>2]|0)+(c[t>>2]|0);c[t>>2]=0}g[s>>2]=1.0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[t>>2]|0))break;g[C>>2]=-999999986991104.0;g[E>>2]=0.0;c[B>>2]=0;g[w>>2]=+g[w>>2]+1.0;c[r>>2]=0;do{g[F>>2]=+g[v>>2]+ +g[(c[j>>2]|0)+(c[r>>2]<<2)>>2];g[G>>2]=+g[w>>2]+ +g[f+(c[r>>2]<<2)>>2];g[F>>2]=+g[F>>2]*+g[F>>2];if(+g[E>>2]*+g[F>>2]>+g[G>>2]*+g[C>>2]){g[E>>2]=+g[G>>2];g[C>>2]=+g[F>>2];c[B>>2]=c[r>>2]}A=(c[r>>2]|0)+1|0;c[r>>2]=A}while((A|0)<(c[k>>2]|0));g[v>>2]=+g[v>>2]+ +g[(c[j>>2]|0)+(c[B>>2]<<2)>>2];g[w>>2]=+g[w>>2]+ +g[f+(c[B>>2]<<2)>>2];A=f+(c[B>>2]<<2)|0;g[A>>2]=+g[A>>2]+ +g[s>>2]*2.0;A=h+(c[B>>2]<<2)|0;c[A>>2]=(c[A>>2]|0)+1;c[q>>2]=(c[q>>2]|0)+1}c[r>>2]=0;do{g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]=+g[e+(c[r>>2]<<2)>>2]*+g[(c[j>>2]|0)+(c[r>>2]<<2)>>2];if(+g[e+(c[r>>2]<<2)>>2]<0.0)c[h+(c[r>>2]<<2)>>2]=0-(c[h+(c[r>>2]<<2)>>2]|0);q=(c[r>>2]|0)+1|0;c[r>>2]=q}while((q|0)<(c[k>>2]|0));sb(h,c[k>>2]|0,c[m>>2]|0,c[p>>2]|0);c[x>>2]=ob(h,c[k>>2]|0,c[o>>2]|0)|0;o=c[x>>2]|0;ga(c[y>>2]|0);l=i;return o|0}function kb(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=l;l=l+48|0;k=j+36|0;m=j+32|0;n=j+28|0;o=j+24|0;p=j+20|0;q=j+16|0;r=j+12|0;s=j+8|0;t=j+4|0;u=j;c[k>>2]=a;c[m>>2]=b;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=h;g[r>>2]=i;h=c[m>>2]|0;c[u>>2]=da()|0;f=l;l=l+((1*(h<<2)|0)+15&-16)|0;g[s>>2]=+lb(f,c[m>>2]|0,c[n>>2]|0,c[q>>2]|0);mb(f,c[k>>2]|0,c[m>>2]|0,+g[s>>2],+g[r>>2]);nb(c[k>>2]|0,c[m>>2]|0,-1,c[p>>2]|0,c[n>>2]|0,c[o>>2]|0);c[t>>2]=ob(f,c[m>>2]|0,c[p>>2]|0)|0;p=c[t>>2]|0;ga(c[u>>2]|0);l=j;return p|0}function lb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0.0;f=l;l=l+16|0;g=f+12|0;h=f+8|0;i=f+4|0;j=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;e=c[h>>2]|0;d=c[i>>2]|0;b=Qa(c[j>>2]|0,(c[(c[344+(((c[h>>2]|0)<(c[i>>2]|0)?c[h>>2]|0:c[i>>2]|0)<<2)>>2]|0)+(((c[h>>2]|0)>(c[i>>2]|0)?c[h>>2]|0:c[i>>2]|0)<<2)>>2]|0)+(c[(c[344+(((c[h>>2]|0)<((c[i>>2]|0)+1|0)?c[h>>2]|0:(c[i>>2]|0)+1|0)<<2)>>2]|0)+(((c[h>>2]|0)>((c[i>>2]|0)+1|0)?c[h>>2]|0:(c[i>>2]|0)+1|0)<<2)>>2]|0)|0)|0;k=+rb(e,d,b,c[g>>2]|0);l=f;return +k}function mb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=+f;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;h=l;l=l+32|0;i=h+28|0;j=h+24|0;k=h+20|0;m=h+16|0;n=h+12|0;o=h+8|0;p=h+4|0;q=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;g[m>>2]=e;g[n>>2]=f;g[p>>2]=+g[m>>2];f=1.0/+F(+(+g[p>>2]));g[q>>2]=f*+g[n>>2];c[o>>2]=0;do{g[(c[j>>2]|0)+(c[o>>2]<<2)>>2]=+g[q>>2]*+(c[(c[i>>2]|0)+(c[o>>2]<<2)>>2]|0);n=(c[o>>2]|0)+1|0;c[o>>2]=n}while((n|0)<(c[k>>2]|0));l=h;return}function nb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+64|0;j=i+48|0;k=i+44|0;m=i+40|0;n=i+36|0;o=i+32|0;p=i+28|0;q=i+24|0;r=i+20|0;s=i+16|0;t=i+12|0;u=i+8|0;v=i+4|0;w=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[v>>2]=0;if((c[p>>2]|0)==0?1:(c[o>>2]<<1|0)>=(c[k>>2]|0)){l=i;return}c[w>>2]=c[332+((c[p>>2]|0)-1<<2)>>2];g[t>>2]=+(c[k>>2]|0)*1.0/+((c[k>>2]|0)+(R(c[w>>2]|0,c[o>>2]|0)|0)|0);g[u>>2]=+g[t>>2]*+g[t>>2]*.5;g[r>>2]=+H(+(+g[u>>2]*1.5707963705062866));g[s>>2]=+H(+((1.0-+g[u>>2])*1.5707963705062866));a:do if((c[k>>2]|0)>=(c[n>>2]<<3|0)){c[v>>2]=1;while(1){u=R(c[v>>2]|0,c[v>>2]|0)|0;t=R(u+(c[v>>2]|0)|0,c[n>>2]|0)|0;if((t+(c[n>>2]>>2)|0)>=(c[k>>2]|0))break a;c[v>>2]=(c[v>>2]|0)+1}}while(0);c[k>>2]=pb(c[k>>2]|0,c[n>>2]|0)|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;if((c[m>>2]|0)>=0){t=(c[j>>2]|0)+((R(c[q>>2]|0,c[k>>2]|0)|0)<<2)|0;qb(t,c[k>>2]|0,1,+g[r>>2],-+g[s>>2]);if(c[v>>2]|0){t=(c[j>>2]|0)+((R(c[q>>2]|0,c[k>>2]|0)|0)<<2)|0;qb(t,c[k>>2]|0,c[v>>2]|0,+g[s>>2],-+g[r>>2])}}else{if(c[v>>2]|0){t=(c[j>>2]|0)+((R(c[q>>2]|0,c[k>>2]|0)|0)<<2)|0;qb(t,c[k>>2]|0,c[v>>2]|0,+g[s>>2],+g[r>>2])}t=(c[j>>2]|0)+((R(c[q>>2]|0,c[k>>2]|0)|0)<<2)|0;qb(t,c[k>>2]|0,1,+g[r>>2],+g[s>>2])}c[q>>2]=(c[q>>2]|0)+1}l=i;return}function ob(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;e=l;l=l+48|0;f=e+32|0;g=e+28|0;h=e+24|0;i=e+20|0;j=e+16|0;k=e+12|0;m=e+8|0;n=e+4|0;o=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if((c[i>>2]|0)<=1){c[f>>2]=1;p=c[f>>2]|0;l=e;return p|0}c[k>>2]=pb(c[h>>2]|0,c[i>>2]|0)|0;c[j>>2]=0;c[m>>2]=0;do{c[o>>2]=0;c[n>>2]=0;do{h=R(c[m>>2]|0,c[k>>2]|0)|0;c[o>>2]=c[o>>2]|c[(c[g>>2]|0)+(h+(c[n>>2]|0)<<2)>>2];h=(c[n>>2]|0)+1|0;c[n>>2]=h}while((h|0)<(c[k>>2]|0));c[j>>2]=c[j>>2]|((c[o>>2]|0)!=0&1)<<c[m>>2];h=(c[m>>2]|0)+1|0;c[m>>2]=h}while((h|0)<(c[i>>2]|0));c[f>>2]=c[j>>2];p=c[f>>2]|0;l=e;return p|0}function pb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>>>0)/((c[f>>2]|0)>>>0)|0|0}function qb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=+f;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=l;l=l+48|0;i=h+44|0;j=h+40|0;k=h+36|0;m=h+32|0;n=h+28|0;o=h+24|0;p=h+20|0;q=h+16|0;r=h+12|0;s=h+8|0;t=h+4|0;u=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;g[m>>2]=e;g[n>>2]=f;c[q>>2]=c[i>>2];g[p>>2]=-+g[n>>2];c[o>>2]=0;while(1){if((c[o>>2]|0)>=((c[j>>2]|0)-(c[k>>2]|0)|0))break;g[r>>2]=+g[c[q>>2]>>2];g[s>>2]=+g[(c[q>>2]|0)+(c[k>>2]<<2)>>2];g[(c[q>>2]|0)+(c[k>>2]<<2)>>2]=+g[m>>2]*+g[s>>2]+ +g[n>>2]*+g[r>>2];f=+g[m>>2]*+g[r>>2]+ +g[p>>2]*+g[s>>2];d=c[q>>2]|0;c[q>>2]=d+4;g[d>>2]=f;c[o>>2]=(c[o>>2]|0)+1}c[q>>2]=(c[i>>2]|0)+((c[j>>2]|0)-(c[k>>2]<<1)-1<<2);c[o>>2]=(c[j>>2]|0)-(c[k>>2]<<1)-1;while(1){if((c[o>>2]|0)<0)break;g[t>>2]=+g[c[q>>2]>>2];g[u>>2]=+g[(c[q>>2]|0)+(c[k>>2]<<2)>>2];g[(c[q>>2]|0)+(c[k>>2]<<2)>>2]=+g[m>>2]*+g[u>>2]+ +g[n>>2]*+g[t>>2];f=+g[m>>2]*+g[t>>2]+ +g[p>>2]*+g[u>>2];j=c[q>>2]|0;c[q>>2]=j+-4;g[j>>2]=f;c[o>>2]=(c[o>>2]|0)+-1}l=h;return}function rb(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0,J=0.0,K=0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0.0,aa=0,ba=0.0,ca=0.0,da=0.0,ea=0.0;h=l;l=l+48|0;i=h+36|0;j=h+32|0;k=h+28|0;m=h+24|0;n=h+20|0;o=h+16|0;p=h+12|0;q=h+40|0;r=h+8|0;s=h+4|0;t=h;c[i>>2]=a;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;g[r>>2]=0.0;while(1){u=c[j>>2]|0;if((c[i>>2]|0)<=2)break;do if((u|0)>=(c[i>>2]|0)){c[t>>2]=c[344+(c[i>>2]<<2)>>2];c[n>>2]=c[(c[t>>2]|0)+((c[j>>2]|0)+1<<2)>>2];c[o>>2]=0-((c[k>>2]|0)>>>0>=(c[n>>2]|0)>>>0&1);c[k>>2]=(c[k>>2]|0)-(c[n>>2]&c[o>>2]);c[p>>2]=c[j>>2];c[s>>2]=c[(c[t>>2]|0)+(c[i>>2]<<2)>>2];a:do if((c[s>>2]|0)>>>0>(c[k>>2]|0)>>>0){c[j>>2]=c[i>>2];do{f=(c[j>>2]|0)+-1|0;c[j>>2]=f;c[n>>2]=c[(c[344+(f<<2)>>2]|0)+(c[i>>2]<<2)>>2]}while((c[n>>2]|0)>>>0>(c[k>>2]|0)>>>0)}else{c[n>>2]=c[(c[t>>2]|0)+(c[j>>2]<<2)>>2];while(1){if((c[n>>2]|0)>>>0<=(c[k>>2]|0)>>>0)break a;c[j>>2]=(c[j>>2]|0)+-1;c[n>>2]=c[(c[t>>2]|0)+(c[j>>2]<<2)>>2]}}while(0);c[k>>2]=(c[k>>2]|0)-(c[n>>2]|0);b[q>>1]=(c[p>>2]|0)-(c[j>>2]|0)+(c[o>>2]|0)^c[o>>2];f=b[q>>1]|0;e=c[m>>2]|0;c[m>>2]=e+4;c[e>>2]=f;g[r>>2]=+g[r>>2]+ +(b[q>>1]|0)*+(b[q>>1]|0)}else{c[n>>2]=c[(c[344+(c[j>>2]<<2)>>2]|0)+(c[i>>2]<<2)>>2];c[s>>2]=c[(c[344+((c[j>>2]|0)+1<<2)>>2]|0)+(c[i>>2]<<2)>>2];if((c[n>>2]|0)>>>0<=(c[k>>2]|0)>>>0?(c[k>>2]|0)>>>0<(c[s>>2]|0)>>>0:0){c[k>>2]=(c[k>>2]|0)-(c[n>>2]|0);f=c[m>>2]|0;c[m>>2]=f+4;c[f>>2]=0;break}c[o>>2]=0-((c[k>>2]|0)>>>0>=(c[s>>2]|0)>>>0&1);c[k>>2]=(c[k>>2]|0)-(c[s>>2]&c[o>>2]);c[p>>2]=c[j>>2];do{f=(c[j>>2]|0)+-1|0;c[j>>2]=f;c[n>>2]=c[(c[344+(f<<2)>>2]|0)+(c[i>>2]<<2)>>2]}while((c[n>>2]|0)>>>0>(c[k>>2]|0)>>>0);c[k>>2]=(c[k>>2]|0)-(c[n>>2]|0);b[q>>1]=(c[p>>2]|0)-(c[j>>2]|0)+(c[o>>2]|0)^c[o>>2];f=b[q>>1]|0;e=c[m>>2]|0;c[m>>2]=e+4;c[e>>2]=f;g[r>>2]=+g[r>>2]+ +(b[q>>1]|0)*+(b[q>>1]|0)}while(0);c[i>>2]=(c[i>>2]|0)+-1}c[n>>2]=(u<<1)+1;c[o>>2]=0-((c[k>>2]|0)>>>0>=(c[n>>2]|0)>>>0&1);c[k>>2]=(c[k>>2]|0)-(c[n>>2]&c[o>>2]);c[p>>2]=c[j>>2];c[j>>2]=((c[k>>2]|0)+1|0)>>>1;if(!(c[j>>2]|0)){v=c[p>>2]|0;w=c[j>>2]|0;x=v-w|0;y=c[o>>2]|0;z=x+y|0;A=c[o>>2]|0;B=z^A;C=B&65535;b[q>>1]=C;D=b[q>>1]|0;E=D<<16>>16;F=c[m>>2]|0;G=F+4|0;c[m>>2]=G;c[F>>2]=E;H=+g[r>>2];I=b[q>>1]|0;J=+(I<<16>>16);K=b[q>>1]|0;L=+(K<<16>>16);M=J*L;N=H+M;g[r>>2]=N;O=c[k>>2]|0;P=0-O|0;c[o>>2]=P;Q=c[j>>2]|0;R=c[o>>2]|0;S=Q+R|0;T=c[o>>2]|0;U=S^T;V=U&65535;b[q>>1]=V;W=b[q>>1]|0;X=W<<16>>16;Y=c[m>>2]|0;c[Y>>2]=X;Z=+g[r>>2];_=b[q>>1]|0;$=+(_<<16>>16);aa=b[q>>1]|0;ba=+(aa<<16>>16);ca=$*ba;da=Z+ca;g[r>>2]=da;ea=+g[r>>2];l=h;return +ea}c[k>>2]=(c[k>>2]|0)-((c[j>>2]<<1)-1);v=c[p>>2]|0;w=c[j>>2]|0;x=v-w|0;y=c[o>>2]|0;z=x+y|0;A=c[o>>2]|0;B=z^A;C=B&65535;b[q>>1]=C;D=b[q>>1]|0;E=D<<16>>16;F=c[m>>2]|0;G=F+4|0;c[m>>2]=G;c[F>>2]=E;H=+g[r>>2];I=b[q>>1]|0;J=+(I<<16>>16);K=b[q>>1]|0;L=+(K<<16>>16);M=J*L;N=H+M;g[r>>2]=N;O=c[k>>2]|0;P=0-O|0;c[o>>2]=P;Q=c[j>>2]|0;R=c[o>>2]|0;S=Q+R|0;T=c[o>>2]|0;U=S^T;V=U&65535;b[q>>1]=V;W=b[q>>1]|0;X=W<<16>>16;Y=c[m>>2]|0;c[Y>>2]=X;Z=+g[r>>2];_=b[q>>1]|0;$=+(_<<16>>16);aa=b[q>>1]|0;ba=+(aa<<16>>16);ca=$*ba;da=Z+ca;g[r>>2]=da;ea=+g[r>>2];l=h;return +ea}function sb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=l;l=l+16|0;g=f+12|0;h=f+8|0;i=f+4|0;j=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;e=c[j>>2]|0;j=tb(c[h>>2]|0,c[g>>2]|0)|0;Pa(e,j,(c[(c[344+(((c[h>>2]|0)<(c[i>>2]|0)?c[h>>2]|0:c[i>>2]|0)<<2)>>2]|0)+(((c[h>>2]|0)>(c[i>>2]|0)?c[h>>2]|0:c[i>>2]|0)<<2)>>2]|0)+(c[(c[344+(((c[h>>2]|0)<((c[i>>2]|0)+1|0)?c[h>>2]|0:(c[i>>2]|0)+1|0)<<2)>>2]|0)+(((c[h>>2]|0)>((c[i>>2]|0)+1|0)?c[h>>2]|0:(c[i>>2]|0)+1|0)<<2)>>2]|0)|0);l=f;return}function tb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;d=l;l=l+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;i=d;c[e>>2]=a;c[f>>2]=b;c[h>>2]=(c[e>>2]|0)-1;c[g>>2]=(c[(c[f>>2]|0)+(c[h>>2]<<2)>>2]|0)<0&1;c[i>>2]=E(c[(c[f>>2]|0)+(c[h>>2]<<2)>>2]|0)|0;do{c[h>>2]=(c[h>>2]|0)+-1;if(((c[e>>2]|0)-(c[h>>2]|0)|0)<(c[i>>2]|0))j=(c[e>>2]|0)-(c[h>>2]|0)|0;else j=c[i>>2]|0;if(((c[e>>2]|0)-(c[h>>2]|0)|0)>(c[i>>2]|0))k=(c[e>>2]|0)-(c[h>>2]|0)|0;else k=c[i>>2]|0;c[g>>2]=(c[g>>2]|0)+(c[(c[344+(j<<2)>>2]|0)+(k<<2)>>2]|0);b=E(c[(c[f>>2]|0)+(c[h>>2]<<2)>>2]|0)|0;c[i>>2]=(c[i>>2]|0)+b;if((c[(c[f>>2]|0)+(c[h>>2]<<2)>>2]|0)<0){if(((c[e>>2]|0)-(c[h>>2]|0)|0)<((c[i>>2]|0)+1|0))m=(c[e>>2]|0)-(c[h>>2]|0)|0;else m=(c[i>>2]|0)+1|0;if(((c[e>>2]|0)-(c[h>>2]|0)|0)>((c[i>>2]|0)+1|0))n=(c[e>>2]|0)-(c[h>>2]|0)|0;else n=(c[i>>2]|0)+1|0;c[g>>2]=(c[g>>2]|0)+(c[(c[344+(m<<2)>>2]|0)+(n<<2)>>2]|0)}}while((c[h>>2]|0)>0);l=d;return c[g>>2]|0}function ub(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;a=c[d>>2]|0;a:do if((a|0)<16e3)if((a|0)<12e3){switch(a|0){case 8e3:break;default:{f=7;break a}}c[e>>2]=6;break}else{switch(a|0){case 12e3:break;default:{f=7;break a}}c[e>>2]=4;break}else{if((a|0)<24e3){switch(a|0){case 16e3:break;default:{f=7;break a}}c[e>>2]=3;break}if((a|0)<48e3){switch(a|0){case 24e3:break;default:{f=7;break a}}c[e>>2]=2;break}else{switch(a|0){case 48e3:break;default:{f=7;break a}}c[e>>2]=1;break}}while(0);if((f|0)==7)c[e>>2]=0;l=b;return c[e>>2]|0}function vb(a,b,d,e,f,h,i,j,k,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;o=l;l=l+96|0;p=o+92|0;q=o+88|0;r=o+84|0;s=o+80|0;t=o+76|0;u=o+72|0;v=o+68|0;w=o+64|0;x=o+60|0;y=o+56|0;z=o+52|0;A=o+48|0;B=o+44|0;C=o+40|0;D=o+36|0;E=o+32|0;F=o+28|0;G=o+24|0;H=o+20|0;I=o+16|0;J=o+12|0;K=o+8|0;L=o+4|0;M=o;c[p>>2]=a;c[q>>2]=b;c[r>>2]=d;c[s>>2]=e;c[t>>2]=f;g[u>>2]=h;g[v>>2]=i;c[w>>2]=j;c[x>>2]=k;c[y>>2]=m;c[z>>2]=n;if(+g[u>>2]==0.0&+g[v>>2]==0.0){if((c[q>>2]|0)==(c[p>>2]|0)){l=o;return}Le(c[p>>2]|0,c[q>>2]|0,(c[t>>2]<<2)+0|0)|0;l=o;return}g[B>>2]=+g[u>>2]*+g[5524+((c[w>>2]|0)*12|0)>>2];g[C>>2]=+g[u>>2]*+g[5524+((c[w>>2]|0)*12|0)+4>>2];g[D>>2]=+g[u>>2]*+g[5524+((c[w>>2]|0)*12|0)+8>>2];g[E>>2]=+g[v>>2]*+g[5524+((c[x>>2]|0)*12|0)>>2];g[F>>2]=+g[v>>2]*+g[5524+((c[x>>2]|0)*12|0)+4>>2];g[G>>2]=+g[v>>2]*+g[5524+((c[x>>2]|0)*12|0)+8>>2];g[I>>2]=+g[(c[q>>2]|0)+(0-(c[s>>2]|0)+1<<2)>>2];g[J>>2]=+g[(c[q>>2]|0)+(0-(c[s>>2]|0)<<2)>>2];g[K>>2]=+g[(c[q>>2]|0)+(0-(c[s>>2]|0)-1<<2)>>2];g[L>>2]=+g[(c[q>>2]|0)+(0-(c[s>>2]|0)-2<<2)>>2];if((+g[u>>2]==+g[v>>2]?(c[r>>2]|0)==(c[s>>2]|0):0)?(c[w>>2]|0)==(c[x>>2]|0):0)c[z>>2]=0;c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[z>>2]|0))break;g[H>>2]=+g[(c[q>>2]|0)+((c[A>>2]|0)-(c[s>>2]|0)+2<<2)>>2];g[M>>2]=+g[(c[y>>2]|0)+(c[A>>2]<<2)>>2]*+g[(c[y>>2]|0)+(c[A>>2]<<2)>>2];g[(c[p>>2]|0)+(c[A>>2]<<2)>>2]=+g[(c[q>>2]|0)+(c[A>>2]<<2)>>2]+(1.0-+g[M>>2])*+g[B>>2]*+g[(c[q>>2]|0)+((c[A>>2]|0)-(c[r>>2]|0)<<2)>>2]+(1.0-+g[M>>2])*+g[C>>2]*(+g[(c[q>>2]|0)+((c[A>>2]|0)-(c[r>>2]|0)+1<<2)>>2]+ +g[(c[q>>2]|0)+((c[A>>2]|0)-(c[r>>2]|0)-1<<2)>>2])+(1.0-+g[M>>2])*+g[D>>2]*(+g[(c[q>>2]|0)+((c[A>>2]|0)-(c[r>>2]|0)+2<<2)>>2]+ +g[(c[q>>2]|0)+((c[A>>2]|0)-(c[r>>2]|0)-2<<2)>>2])+ +g[M>>2]*+g[E>>2]*+g[J>>2]+ +g[M>>2]*+g[F>>2]*(+g[I>>2]+ +g[K>>2])+ +g[M>>2]*+g[G>>2]*(+g[H>>2]+ +g[L>>2]);g[L>>2]=+g[K>>2];g[K>>2]=+g[J>>2];g[J>>2]=+g[I>>2];g[I>>2]=+g[H>>2];c[A>>2]=(c[A>>2]|0)+1}if(!(+g[v>>2]==0.0)){wb((c[p>>2]|0)+(c[A>>2]<<2)|0,(c[q>>2]|0)+(c[A>>2]<<2)|0,c[s>>2]|0,(c[t>>2]|0)-(c[A>>2]|0)|0,+g[E>>2],+g[F>>2],+g[G>>2]);l=o;return}if((c[q>>2]|0)==(c[p>>2]|0)){l=o;return}Le((c[p>>2]|0)+(c[z>>2]<<2)|0,(c[q>>2]|0)+(c[z>>2]<<2)|0,((c[t>>2]|0)-(c[z>>2]|0)<<2)+0|0)|0;l=o;return}function wb(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=l;l=l+64|0;k=j+48|0;m=j+44|0;n=j+40|0;o=j+36|0;p=j+32|0;q=j+28|0;r=j+24|0;s=j+20|0;t=j+16|0;u=j+12|0;v=j+8|0;w=j+4|0;x=j;c[k>>2]=a;c[m>>2]=b;c[n>>2]=d;c[o>>2]=e;g[p>>2]=f;g[q>>2]=h;g[r>>2]=i;g[w>>2]=+g[(c[m>>2]|0)+(0-(c[n>>2]|0)-2<<2)>>2];g[v>>2]=+g[(c[m>>2]|0)+(0-(c[n>>2]|0)-1<<2)>>2];g[u>>2]=+g[(c[m>>2]|0)+(0-(c[n>>2]|0)<<2)>>2];g[t>>2]=+g[(c[m>>2]|0)+(0-(c[n>>2]|0)+1<<2)>>2];c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[o>>2]|0))break;g[s>>2]=+g[(c[m>>2]|0)+((c[x>>2]|0)-(c[n>>2]|0)+2<<2)>>2];g[(c[k>>2]|0)+(c[x>>2]<<2)>>2]=+g[(c[m>>2]|0)+(c[x>>2]<<2)>>2]+ +g[p>>2]*+g[u>>2]+ +g[q>>2]*(+g[t>>2]+ +g[v>>2])+ +g[r>>2]*(+g[s>>2]+ +g[w>>2]);g[w>>2]=+g[v>>2];g[v>>2]=+g[u>>2];g[u>>2]=+g[t>>2];g[t>>2]=+g[s>>2];c[x>>2]=(c[x>>2]|0)+1}l=j;return}function xb(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;h=l;l=l+32|0;i=h+20|0;j=h+16|0;k=h+12|0;m=h+8|0;n=h+4|0;o=h;c[i>>2]=a;c[j>>2]=e;c[k>>2]=f;c[m>>2]=g;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[(c[i>>2]|0)+8>>2]|0))break;c[o>>2]=(b[(c[(c[i>>2]|0)+32>>2]|0)+((c[n>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[i>>2]|0)+32>>2]|0)+(c[n>>2]<<1)>>1]|0)<<c[k>>2];g=R(c[(c[i>>2]|0)+8>>2]|0,(c[k>>2]<<1)+(c[m>>2]|0)-1|0)|0;f=R((d[(c[(c[i>>2]|0)+92+12>>2]|0)+(g+(c[n>>2]|0))>>0]|0)+64|0,c[m>>2]|0)|0;g=(R(f,c[o>>2]|0)|0)>>2;c[(c[j>>2]|0)+(c[n>>2]<<2)>>2]=g;c[n>>2]=(c[n>>2]|0)+1}l=h;return}function yb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=0;a:while(1){if((c[j>>2]|0)>=1){m=12;break}c[k>>2]=0;while(1){if((c[k>>2]|0)>=4)break;if((c[g>>2]|0)==(c[c[5560+(c[j>>2]<<2)>>2]>>2]|0)?(c[h>>2]<<c[k>>2]|0)==(R(c[(c[5560+(c[j>>2]<<2)>>2]|0)+44>>2]|0,c[(c[5560+(c[j>>2]<<2)>>2]|0)+40>>2]|0)|0):0){m=7;break a}c[k>>2]=(c[k>>2]|0)+1}c[j>>2]=(c[j>>2]|0)+1}if((m|0)==7){if(c[i>>2]|0)c[c[i>>2]>>2]=0;c[f>>2]=c[5560+(c[j>>2]<<2)>>2];n=c[f>>2]|0;l=e;return n|0}else if((m|0)==12){if(c[i>>2]|0)c[c[i>>2]>>2]=-1;c[f>>2]=0;n=c[f>>2]|0;l=e;return n|0}return 0}function zb(a,e,f,g,h,i,j,k,m,n,o,p,q,r,s,t,u,v,w){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0;x=l;l=l+160|0;y=x+144|0;z=x+140|0;A=x+136|0;B=x+132|0;C=x+128|0;D=x+124|0;E=x+120|0;F=x+116|0;G=x+112|0;H=x+108|0;I=x+104|0;J=x+100|0;K=x+96|0;L=x+92|0;M=x+88|0;N=x+84|0;O=x+80|0;P=x+76|0;Q=x+72|0;S=x+68|0;T=x+64|0;U=x+60|0;V=x+56|0;W=x+52|0;X=x+48|0;Y=x+44|0;Z=x+40|0;_=x+36|0;$=x+32|0;aa=x+28|0;ba=x+24|0;ca=x+20|0;ea=x+16|0;fa=x+12|0;ha=x+8|0;ia=x+4|0;ja=x;c[y>>2]=a;c[z>>2]=e;c[A>>2]=f;c[B>>2]=g;c[C>>2]=h;c[D>>2]=i;c[E>>2]=j;c[F>>2]=k;c[G>>2]=m;c[H>>2]=n;c[I>>2]=o;c[J>>2]=p;c[K>>2]=q;c[L>>2]=r;c[M>>2]=s;c[N>>2]=t;c[O>>2]=u;c[P>>2]=v;c[Q>>2]=w;c[G>>2]=(c[G>>2]|0)>0?c[G>>2]|0:0;c[U>>2]=c[(c[y>>2]|0)+8>>2];c[X>>2]=c[z>>2];c[Y>>2]=(c[G>>2]|0)>=8?8:0;c[G>>2]=(c[G>>2]|0)-(c[Y>>2]|0);c[_>>2]=0;c[Z>>2]=0;do if((c[L>>2]|0)==2){c[Z>>2]=d[24771+((c[A>>2]|0)-(c[z>>2]|0))>>0];if((c[Z>>2]|0)>(c[G>>2]|0)){c[Z>>2]=0;break}else{c[G>>2]=(c[G>>2]|0)-(c[Z>>2]|0);c[_>>2]=(c[G>>2]|0)>=8?8:0;c[G>>2]=(c[G>>2]|0)-(c[_>>2]|0);break}}while(0);w=c[U>>2]|0;c[$>>2]=da()|0;v=l;l=l+((1*(w<<2)|0)+15&-16)|0;w=l;l=l+((1*(c[U>>2]<<2)|0)+15&-16)|0;u=l;l=l+((1*(c[U>>2]<<2)|0)+15&-16)|0;t=l;l=l+((1*(c[U>>2]<<2)|0)+15&-16)|0;c[V>>2]=c[z>>2];while(1){if((c[V>>2]|0)>=(c[A>>2]|0))break;if((c[L>>2]<<3|0)>(((b[(c[(c[y>>2]|0)+32>>2]|0)+((c[V>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[y>>2]|0)+32>>2]|0)+(c[V>>2]<<1)>>1]|0)|0)*3<<c[M>>2]<<3>>4|0))ka=c[L>>2]<<3;else ka=((b[(c[(c[y>>2]|0)+32>>2]|0)+((c[V>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[y>>2]|0)+32>>2]|0)+(c[V>>2]<<1)>>1]|0)|0)*3<<c[M>>2]<<3>>4;c[u+(c[V>>2]<<2)>>2]=ka;s=R(c[L>>2]|0,(b[(c[(c[y>>2]|0)+32>>2]|0)+((c[V>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[y>>2]|0)+32>>2]|0)+(c[V>>2]<<1)>>1]|0)|0)|0;r=R(s,(c[D>>2]|0)-5-(c[M>>2]|0)|0)|0;s=R(r,(c[A>>2]|0)-(c[V>>2]|0)-1|0)|0;r=(R(s,1<<(c[M>>2]|0)+3)|0)>>6;c[t+(c[V>>2]<<2)>>2]=r;if(((b[(c[(c[y>>2]|0)+32>>2]|0)+((c[V>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[y>>2]|0)+32>>2]|0)+(c[V>>2]<<1)>>1]|0)<<c[M>>2]|0)==1){r=t+(c[V>>2]<<2)|0;c[r>>2]=(c[r>>2]|0)-(c[L>>2]<<3)}c[V>>2]=(c[V>>2]|0)+1}c[S>>2]=1;c[T>>2]=(c[(c[y>>2]|0)+48>>2]|0)-1;do{c[aa>>2]=0;c[ba>>2]=0;c[ca>>2]=(c[S>>2]|0)+(c[T>>2]|0)>>1;c[V>>2]=c[A>>2];while(1){D=c[V>>2]|0;c[V>>2]=D+-1;if((D|0)<=(c[z>>2]|0))break;c[fa>>2]=(b[(c[(c[y>>2]|0)+32>>2]|0)+((c[V>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[y>>2]|0)+32>>2]|0)+(c[V>>2]<<1)>>1]|0);D=R(c[L>>2]|0,c[fa>>2]|0)|0;ka=R(c[ca>>2]|0,c[U>>2]|0)|0;r=R(D,d[(c[(c[y>>2]|0)+52>>2]|0)+(ka+(c[V>>2]|0))>>0]|0)|0;c[ea>>2]=r<<c[M>>2]>>2;if((c[ea>>2]|0)>0){if(0>((c[ea>>2]|0)+(c[t+(c[V>>2]<<2)>>2]|0)|0))la=0;else la=(c[ea>>2]|0)+(c[t+(c[V>>2]<<2)>>2]|0)|0;c[ea>>2]=la}c[ea>>2]=(c[ea>>2]|0)+(c[(c[B>>2]|0)+(c[V>>2]<<2)>>2]|0);if(!(c[aa>>2]|0?1:(c[ea>>2]|0)>=(c[u+(c[V>>2]<<2)>>2]|0))){if((c[ea>>2]|0)<(c[L>>2]<<3|0))continue;c[ba>>2]=(c[ba>>2]|0)+(c[L>>2]<<3);continue}c[aa>>2]=1;if((c[ea>>2]|0)<(c[(c[C>>2]|0)+(c[V>>2]<<2)>>2]|0))ma=c[ea>>2]|0;else ma=c[(c[C>>2]|0)+(c[V>>2]<<2)>>2]|0;c[ba>>2]=(c[ba>>2]|0)+ma}r=c[ca>>2]|0;if((c[ba>>2]|0)>(c[G>>2]|0))c[T>>2]=r-1;else c[S>>2]=r+1}while((c[S>>2]|0)<=(c[T>>2]|0));ba=c[S>>2]|0;c[S>>2]=ba+-1;c[T>>2]=ba;c[V>>2]=c[z>>2];while(1){na=c[y>>2]|0;if((c[V>>2]|0)>=(c[A>>2]|0))break;c[ja>>2]=(b[(c[na+32>>2]|0)+((c[V>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[y>>2]|0)+32>>2]|0)+(c[V>>2]<<1)>>1]|0);ba=R(c[L>>2]|0,c[ja>>2]|0)|0;ca=R(c[S>>2]|0,c[U>>2]|0)|0;ma=R(ba,d[(c[(c[y>>2]|0)+52>>2]|0)+(ca+(c[V>>2]|0))>>0]|0)|0;c[ha>>2]=ma<<c[M>>2]>>2;if((c[T>>2]|0)>=(c[(c[y>>2]|0)+48>>2]|0))oa=c[(c[C>>2]|0)+(c[V>>2]<<2)>>2]|0;else{ma=R(c[L>>2]|0,c[ja>>2]|0)|0;ca=R(c[T>>2]|0,c[U>>2]|0)|0;ba=R(ma,d[(c[(c[y>>2]|0)+52>>2]|0)+(ca+(c[V>>2]|0))>>0]|0)|0;oa=ba<<c[M>>2]>>2}c[ia>>2]=oa;if((c[ha>>2]|0)>0){if(0>((c[ha>>2]|0)+(c[t+(c[V>>2]<<2)>>2]|0)|0))pa=0;else pa=(c[ha>>2]|0)+(c[t+(c[V>>2]<<2)>>2]|0)|0;c[ha>>2]=pa}if((c[ia>>2]|0)>0){if(0>((c[ia>>2]|0)+(c[t+(c[V>>2]<<2)>>2]|0)|0))qa=0;else qa=(c[ia>>2]|0)+(c[t+(c[V>>2]<<2)>>2]|0)|0;c[ia>>2]=qa}if((c[S>>2]|0)>0)c[ha>>2]=(c[ha>>2]|0)+(c[(c[B>>2]|0)+(c[V>>2]<<2)>>2]|0);c[ia>>2]=(c[ia>>2]|0)+(c[(c[B>>2]|0)+(c[V>>2]<<2)>>2]|0);if((c[(c[B>>2]|0)+(c[V>>2]<<2)>>2]|0)>0)c[X>>2]=c[V>>2];if(0>((c[ia>>2]|0)-(c[ha>>2]|0)|0))ra=0;else ra=(c[ia>>2]|0)-(c[ha>>2]|0)|0;c[ia>>2]=ra;c[v+(c[V>>2]<<2)>>2]=c[ha>>2];c[w+(c[V>>2]<<2)>>2]=c[ia>>2];c[V>>2]=(c[V>>2]|0)+1}c[W>>2]=Ab(na,c[z>>2]|0,c[A>>2]|0,c[X>>2]|0,v,w,u,c[C>>2]|0,c[G>>2]|0,c[H>>2]|0,c[Y>>2]|0,c[E>>2]|0,c[Z>>2]|0,c[F>>2]|0,c[_>>2]|0,c[I>>2]|0,c[J>>2]|0,c[K>>2]|0,c[L>>2]|0,c[M>>2]|0,c[N>>2]|0,c[O>>2]|0,c[P>>2]|0,c[Q>>2]|0)|0;Q=c[W>>2]|0;ga(c[$>>2]|0);l=x;return Q|0}function Ab(a,e,f,g,h,i,j,k,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;A=A|0;B=B|0;var C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Ra=0,Sa=0,Ta=0;C=l;l=l+224|0;D=C+208|0;E=C+204|0;F=C+200|0;G=C+196|0;H=C+192|0;I=C+188|0;J=C+184|0;K=C+180|0;L=C+176|0;M=C+172|0;N=C+168|0;O=C+164|0;P=C+160|0;Q=C+156|0;S=C+152|0;T=C+148|0;U=C+144|0;V=C+140|0;W=C+136|0;X=C+132|0;Y=C+128|0;Z=C+124|0;_=C+120|0;$=C+116|0;aa=C+112|0;ba=C+108|0;ca=C+104|0;da=C+100|0;ea=C+96|0;fa=C+92|0;ga=C+88|0;ha=C+84|0;ia=C+80|0;ja=C+76|0;ka=C+72|0;la=C+68|0;ma=C+64|0;na=C+60|0;oa=C+56|0;pa=C+52|0;qa=C+48|0;ra=C+44|0;sa=C+40|0;ta=C+36|0;ua=C+32|0;va=C+28|0;wa=C+24|0;xa=C+20|0;ya=C+16|0;za=C+12|0;Aa=C+8|0;Ba=C+4|0;Ca=C;c[D>>2]=a;c[E>>2]=e;c[F>>2]=f;c[G>>2]=g;c[H>>2]=h;c[I>>2]=i;c[J>>2]=j;c[K>>2]=k;c[L>>2]=m;c[M>>2]=n;c[N>>2]=o;c[O>>2]=p;c[P>>2]=q;c[Q>>2]=r;c[S>>2]=s;c[T>>2]=t;c[U>>2]=u;c[V>>2]=v;c[W>>2]=w;c[X>>2]=x;c[Y>>2]=y;c[Z>>2]=z;c[_>>2]=A;c[$>>2]=B;c[ha>>2]=-1;c[ia>>2]=c[W>>2]<<3;c[ga>>2]=(c[W>>2]|0)>1&1;c[fa>>2]=c[X>>2]<<3;c[ba>>2]=0;c[ca>>2]=64;c[da>>2]=0;while(1){if((c[da>>2]|0)>=6)break;c[na>>2]=(c[ba>>2]|0)+(c[ca>>2]|0)>>1;c[aa>>2]=0;c[la>>2]=0;c[ea>>2]=c[F>>2];while(1){B=c[ea>>2]|0;c[ea>>2]=B+-1;if((B|0)<=(c[E>>2]|0))break;c[oa>>2]=(c[(c[H>>2]|0)+(c[ea>>2]<<2)>>2]|0)+((R(c[na>>2]|0,c[(c[I>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0)>>6);if(!(c[la>>2]|0?1:(c[oa>>2]|0)>=(c[(c[J>>2]|0)+(c[ea>>2]<<2)>>2]|0))){if((c[oa>>2]|0)<(c[ia>>2]|0))continue;c[aa>>2]=(c[aa>>2]|0)+(c[ia>>2]|0);continue}c[la>>2]=1;if((c[oa>>2]|0)<(c[(c[K>>2]|0)+(c[ea>>2]<<2)>>2]|0))Da=c[oa>>2]|0;else Da=c[(c[K>>2]|0)+(c[ea>>2]<<2)>>2]|0;c[aa>>2]=(c[aa>>2]|0)+Da}B=c[na>>2]|0;if((c[aa>>2]|0)>(c[L>>2]|0))c[ca>>2]=B;else c[ba>>2]=B;c[da>>2]=(c[da>>2]|0)+1}c[aa>>2]=0;c[la>>2]=0;c[ea>>2]=c[F>>2];while(1){da=c[ea>>2]|0;c[ea>>2]=da+-1;if((da|0)<=(c[E>>2]|0))break;c[pa>>2]=(c[(c[H>>2]|0)+(c[ea>>2]<<2)>>2]|0)+((R(c[ba>>2]|0,c[(c[I>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0)>>6);do if(!(c[la>>2]|0?1:(c[pa>>2]|0)>=(c[(c[J>>2]|0)+(c[ea>>2]<<2)>>2]|0)))if((c[pa>>2]|0)>=(c[ia>>2]|0)){c[pa>>2]=c[ia>>2];break}else{c[pa>>2]=0;break}else c[la>>2]=1;while(0);if((c[pa>>2]|0)<(c[(c[K>>2]|0)+(c[ea>>2]<<2)>>2]|0))Ea=c[pa>>2]|0;else Ea=c[(c[K>>2]|0)+(c[ea>>2]<<2)>>2]|0;c[pa>>2]=Ea;c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]=c[pa>>2];c[aa>>2]=(c[aa>>2]|0)+(c[pa>>2]|0)}c[ha>>2]=c[F>>2];while(1){c[ea>>2]=(c[ha>>2]|0)-1;if((c[ea>>2]|0)<=(c[G>>2]|0)){Fa=29;break}c[ja>>2]=(c[L>>2]|0)-(c[aa>>2]|0);c[ka>>2]=Bb(c[ja>>2]|0,(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ha>>2]<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[E>>2]<<1)>>1]|0)|0)|0;pa=R((b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ha>>2]<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[E>>2]<<1)>>1]|0)|0,c[ka>>2]|0)|0;c[ja>>2]=(c[ja>>2]|0)-pa;if(((c[ja>>2]|0)-((b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ea>>2]<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[E>>2]<<1)>>1]|0))|0)>0)Ga=(c[ja>>2]|0)-((b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ea>>2]<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[E>>2]<<1)>>1]|0))|0;else Ga=0;c[sa>>2]=Ga;c[qa>>2]=(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ha>>2]<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ea>>2]<<1)>>1]|0);pa=(c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(R(c[ka>>2]|0,c[qa>>2]|0)|0)|0;c[ra>>2]=pa+(c[sa>>2]|0);if((c[(c[J>>2]|0)+(c[ea>>2]<<2)>>2]|0)>((c[ia>>2]|0)+8|0))Ha=c[(c[J>>2]|0)+(c[ea>>2]<<2)>>2]|0;else Ha=(c[ia>>2]|0)+8|0;if((c[ra>>2]|0)>=(Ha|0)){if(!(c[Z>>2]|0)){if(Va(c[Y>>2]|0,1)|0)break}else{if((c[ha>>2]|0)<=((c[E>>2]|0)+2|0)){Fa=40;break}pa=R((c[ea>>2]|0)<(c[_>>2]|0)?7:9,c[qa>>2]|0)|0;if((c[ra>>2]|0)>(pa<<c[X>>2]<<3>>4|0)?(c[ea>>2]|0)<=(c[$>>2]|0):0){Fa=40;break}Ua(c[Y>>2]|0,0,1)}c[aa>>2]=(c[aa>>2]|0)+8;c[ra>>2]=(c[ra>>2]|0)-8}c[aa>>2]=(c[aa>>2]|0)-((c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(c[P>>2]|0));if((c[P>>2]|0)>0)c[P>>2]=d[24771+((c[ea>>2]|0)-(c[E>>2]|0))>>0];c[aa>>2]=(c[aa>>2]|0)+(c[P>>2]|0);if((c[ra>>2]|0)>=(c[ia>>2]|0)){c[aa>>2]=(c[aa>>2]|0)+(c[ia>>2]|0);Ia=c[ia>>2]|0;Ja=(c[T>>2]|0)+(c[ea>>2]<<2)|0}else{Ia=0;Ja=(c[T>>2]|0)+(c[ea>>2]<<2)|0}c[Ja>>2]=Ia;c[ha>>2]=(c[ha>>2]|0)+-1}if((Fa|0)==29)c[L>>2]=(c[L>>2]|0)+(c[N>>2]|0);else if((Fa|0)==40)Ua(c[Y>>2]|0,1,1);do if((c[P>>2]|0)>0){if(!(c[Z>>2]|0)){Fa=c[E>>2]|0;N=Fa+(Qa(c[Y>>2]|0,(c[ha>>2]|0)+1-(c[E>>2]|0)|0)|0)|0;c[c[O>>2]>>2]=N;break}if((c[c[O>>2]>>2]|0)<(c[ha>>2]|0))Ka=c[c[O>>2]>>2]|0;else Ka=c[ha>>2]|0;c[c[O>>2]>>2]=Ka;Pa(c[Y>>2]|0,(c[c[O>>2]>>2]|0)-(c[E>>2]|0)|0,(c[ha>>2]|0)+1-(c[E>>2]|0)|0)}else c[c[O>>2]>>2]=0;while(0);if((c[c[O>>2]>>2]|0)<=(c[E>>2]|0)){c[L>>2]=(c[L>>2]|0)+(c[S>>2]|0);c[S>>2]=0}do if((c[S>>2]|0)>0){Ka=c[Y>>2]|0;if(c[Z>>2]|0){Ua(Ka,c[c[Q>>2]>>2]|0,1);break}else{P=Va(Ka,1)|0;c[c[Q>>2]>>2]=P;break}}else c[c[Q>>2]>>2]=0;while(0);c[ja>>2]=(c[L>>2]|0)-(c[aa>>2]|0);c[ka>>2]=Bb(c[ja>>2]|0,(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ha>>2]<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[E>>2]<<1)>>1]|0)|0)|0;aa=R((b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ha>>2]<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[E>>2]<<1)>>1]|0)|0,c[ka>>2]|0)|0;c[ja>>2]=(c[ja>>2]|0)-aa;c[ea>>2]=c[E>>2];while(1){if((c[ea>>2]|0)>=(c[ha>>2]|0))break;aa=R(c[ka>>2]|0,(b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ea>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ea>>2]<<1)>>1]|0)|0)|0;L=(c[T>>2]|0)+(c[ea>>2]<<2)|0;c[L>>2]=(c[L>>2]|0)+aa;c[ea>>2]=(c[ea>>2]|0)+1}c[ea>>2]=c[E>>2];while(1){if((c[ea>>2]|0)>=(c[ha>>2]|0))break;if((c[ja>>2]|0)<((b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ea>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ea>>2]<<1)>>1]|0)|0))La=c[ja>>2]|0;else La=(b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ea>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ea>>2]<<1)>>1]|0)|0;c[ta>>2]=La;ka=(c[T>>2]|0)+(c[ea>>2]<<2)|0;c[ka>>2]=(c[ka>>2]|0)+(c[ta>>2]|0);c[ja>>2]=(c[ja>>2]|0)-(c[ta>>2]|0);c[ea>>2]=(c[ea>>2]|0)+1}c[ma>>2]=0;c[ea>>2]=c[E>>2];while(1){if((c[ea>>2]|0)>=(c[ha>>2]|0))break;c[ua>>2]=(b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ea>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ea>>2]<<1)>>1]|0);c[va>>2]=c[ua>>2]<<c[X>>2];c[Aa>>2]=(c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(c[ma>>2]|0);E=c[Aa>>2]|0;if((c[va>>2]|0)>1){if((E-(c[(c[K>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0)>0)Ma=(c[Aa>>2]|0)-(c[(c[K>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0;else Ma=0;c[za>>2]=Ma;c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]=(c[Aa>>2]|0)-(c[za>>2]|0);ta=R(c[W>>2]|0,c[va>>2]|0)|0;if((c[W>>2]|0)==2&(c[va>>2]|0)>2?!(c[c[Q>>2]>>2]|0):0)Na=(c[ea>>2]|0)<(c[c[O>>2]>>2]|0);else Na=0;c[wa>>2]=ta+(Na?1:0);c[ya>>2]=R(c[wa>>2]|0,(b[(c[(c[D>>2]|0)+56>>2]|0)+(c[ea>>2]<<1)>>1]|0)+(c[fa>>2]|0)|0)|0;c[xa>>2]=(c[ya>>2]>>1)-((c[wa>>2]|0)*21|0);if((c[va>>2]|0)==2)c[xa>>2]=(c[xa>>2]|0)+(c[wa>>2]<<3>>2);if(((c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(c[xa>>2]|0)|0)>=(c[wa>>2]<<1<<3|0)){if(((c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(c[xa>>2]|0)|0)<((c[wa>>2]|0)*3<<3|0))c[xa>>2]=(c[xa>>2]|0)+(c[ya>>2]>>3)}else c[xa>>2]=(c[xa>>2]|0)+(c[ya>>2]>>2);if(0>((c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(c[xa>>2]|0)+(c[wa>>2]<<2)|0))Oa=0;else Oa=(c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(c[xa>>2]|0)+(c[wa>>2]<<2)|0;c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]=Oa;ta=(Bb(c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0,c[wa>>2]|0)|0)>>>3;c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]=ta;ta=R(c[W>>2]|0,c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0;if((ta|0)>(c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]>>3|0))c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]=c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]>>c[ga>>2]>>3;if((c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0)<8)Ra=c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0;else Ra=8;c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]=Ra;ta=R(c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0,c[wa>>2]<<3)|0;c[(c[V>>2]|0)+(c[ea>>2]<<2)>>2]=(ta|0)>=((c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]|0)+(c[xa>>2]|0)|0)&1;ta=(R(c[W>>2]|0,c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0)<<3;ja=(c[T>>2]|0)+(c[ea>>2]<<2)|0;c[ja>>2]=(c[ja>>2]|0)-ta}else{if(0>(E-(c[W>>2]<<3)|0))Sa=0;else Sa=(c[Aa>>2]|0)-(c[W>>2]<<3)|0;c[za>>2]=Sa;c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]=(c[Aa>>2]|0)-(c[za>>2]|0);c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]=0;c[(c[V>>2]|0)+(c[ea>>2]<<2)>>2]=1}if((c[za>>2]|0)>0){if((c[za>>2]>>(c[ga>>2]|0)+3|0)<(8-(c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0))Ta=c[za>>2]>>(c[ga>>2]|0)+3;else Ta=8-(c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0)|0;c[Ba>>2]=Ta;E=(c[U>>2]|0)+(c[ea>>2]<<2)|0;c[E>>2]=(c[E>>2]|0)+(c[Ba>>2]|0);c[Ca>>2]=(R(c[Ba>>2]|0,c[W>>2]|0)|0)<<3;c[(c[V>>2]|0)+(c[ea>>2]<<2)>>2]=(c[Ca>>2]|0)>=((c[za>>2]|0)-(c[ma>>2]|0)|0)&1;c[za>>2]=(c[za>>2]|0)-(c[Ca>>2]|0)}c[ma>>2]=c[za>>2];c[ea>>2]=(c[ea>>2]|0)+1}c[c[M>>2]>>2]=c[ma>>2];while(1){if((c[ea>>2]|0)>=(c[F>>2]|0))break;c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]=c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]>>c[ga>>2]>>3;c[(c[T>>2]|0)+(c[ea>>2]<<2)>>2]=0;c[(c[V>>2]|0)+(c[ea>>2]<<2)>>2]=(c[(c[U>>2]|0)+(c[ea>>2]<<2)>>2]|0)<1&1;c[ea>>2]=(c[ea>>2]|0)+1}l=C;return c[ha>>2]|0}function Bb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>>>0)/((c[f>>2]|0)>>>0)|0|0}function Cb(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(U(c[(c[d>>2]|0)+28>>2]|0)|0))|0;l=b;return a|0}function Db(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[e>>2]=a;c[f>>2]=b;c[g>>2]=32736-(c[e>>2]|0);e=(R(c[g>>2]|0,16384-(c[f>>2]|0)|0)|0)>>>15;l=d;return e|0}function Eb(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;e=l;l=l+64|0;f=e+60|0;g=e+56|0;h=e+52|0;i=e+48|0;j=e+44|0;k=e+40|0;m=e+8|0;n=e+4|0;o=e;c[f>>2]=a;c[g>>2]=d;if((c[(c[f>>2]|0)+8>>2]|0)>0)p=c[(c[f>>2]|0)+8>>2]|0;else p=0;c[o>>2]=p;c[m>>2]=1;c[k>>2]=0;do{c[j>>2]=b[(c[f>>2]|0)+12+(c[k>>2]<<1<<1)>>1];c[i>>2]=b[(c[f>>2]|0)+12+((c[k>>2]<<1)+1<<1)>>1];p=R(c[m+(c[k>>2]<<2)>>2]|0,c[j>>2]|0)|0;c[m+((c[k>>2]|0)+1<<2)>>2]=p;c[k>>2]=(c[k>>2]|0)+1}while((c[i>>2]|0)!=1);c[i>>2]=b[(c[f>>2]|0)+12+((c[k>>2]<<1)-1<<1)>>1];c[n>>2]=(c[k>>2]|0)-1;while(1){if((c[n>>2]|0)<0)break;if(c[n>>2]|0)c[h>>2]=b[(c[f>>2]|0)+12+((c[n>>2]<<1)-1<<1)>>1];else c[h>>2]=1;switch(b[(c[f>>2]|0)+12+(c[n>>2]<<1<<1)>>1]|0){case 2:{Fb(c[g>>2]|0,c[i>>2]|0,c[m+(c[n>>2]<<2)>>2]|0);break}case 4:{Gb(c[g>>2]|0,c[m+(c[n>>2]<<2)>>2]<<c[o>>2],c[f>>2]|0,c[i>>2]|0,c[m+(c[n>>2]<<2)>>2]|0,c[h>>2]|0);break}case 3:{Hb(c[g>>2]|0,c[m+(c[n>>2]<<2)>>2]<<c[o>>2],c[f>>2]|0,c[i>>2]|0,c[m+(c[n>>2]<<2)>>2]|0,c[h>>2]|0);break}case 5:{Ib(c[g>>2]|0,c[m+(c[n>>2]<<2)>>2]<<c[o>>2],c[f>>2]|0,c[i>>2]|0,c[m+(c[n>>2]<<2)>>2]|0,c[h>>2]|0);break}default:{}}c[i>>2]=c[h>>2];c[n>>2]=(c[n>>2]|0)+-1}l=e;return}function Fb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+28|0;h=e+20|0;i=e+16|0;j=e+12|0;k=e+8|0;m=e;c[f>>2]=a;c[e+24>>2]=b;c[h>>2]=d;g[k>>2]=.7071067690849304;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[h>>2]|0))break;c[i>>2]=(c[f>>2]|0)+32;d=c[i>>2]|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];g[c[i>>2]>>2]=+g[c[f>>2]>>2]-+g[m>>2];g[(c[i>>2]|0)+4>>2]=+g[(c[f>>2]|0)+4>>2]-+g[m+4>>2];d=c[f>>2]|0;g[d>>2]=+g[d>>2]+ +g[m>>2];d=(c[f>>2]|0)+4|0;g[d>>2]=+g[d>>2]+ +g[m+4>>2];g[m>>2]=(+g[(c[i>>2]|0)+8>>2]+ +g[(c[i>>2]|0)+8+4>>2])*+g[k>>2];g[m+4>>2]=(+g[(c[i>>2]|0)+8+4>>2]-+g[(c[i>>2]|0)+8>>2])*+g[k>>2];g[(c[i>>2]|0)+8>>2]=+g[(c[f>>2]|0)+8>>2]-+g[m>>2];g[(c[i>>2]|0)+8+4>>2]=+g[(c[f>>2]|0)+8+4>>2]-+g[m+4>>2];d=(c[f>>2]|0)+8|0;g[d>>2]=+g[d>>2]+ +g[m>>2];d=(c[f>>2]|0)+8+4|0;g[d>>2]=+g[d>>2]+ +g[m+4>>2];g[m>>2]=+g[(c[i>>2]|0)+16+4>>2];g[m+4>>2]=-+g[(c[i>>2]|0)+16>>2];g[(c[i>>2]|0)+16>>2]=+g[(c[f>>2]|0)+16>>2]-+g[m>>2];g[(c[i>>2]|0)+16+4>>2]=+g[(c[f>>2]|0)+16+4>>2]-+g[m+4>>2];d=(c[f>>2]|0)+16|0;g[d>>2]=+g[d>>2]+ +g[m>>2];d=(c[f>>2]|0)+16+4|0;g[d>>2]=+g[d>>2]+ +g[m+4>>2];g[m>>2]=(+g[(c[i>>2]|0)+24+4>>2]-+g[(c[i>>2]|0)+24>>2])*+g[k>>2];g[m+4>>2]=(-+g[(c[i>>2]|0)+24+4>>2]-+g[(c[i>>2]|0)+24>>2])*+g[k>>2];g[(c[i>>2]|0)+24>>2]=+g[(c[f>>2]|0)+24>>2]-+g[m>>2];g[(c[i>>2]|0)+24+4>>2]=+g[(c[f>>2]|0)+24+4>>2]-+g[m+4>>2];d=(c[f>>2]|0)+24|0;g[d>>2]=+g[d>>2]+ +g[m>>2];d=(c[f>>2]|0)+24+4|0;g[d>>2]=+g[d>>2]+ +g[m+4>>2];c[f>>2]=(c[f>>2]|0)+64;c[j>>2]=(c[j>>2]|0)+1}l=e;return}function Gb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;i=l;l=l+128|0;j=i+120|0;k=i+116|0;m=i+112|0;n=i+108|0;o=i+104|0;p=i+100|0;q=i+96|0;r=i+88|0;s=i+80|0;t=i+72|0;u=i+24|0;v=i+20|0;w=i+16|0;x=i+12|0;y=i+8|0;z=i+4|0;A=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;if((c[n>>2]|0)==1){c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;g[r>>2]=+g[c[j>>2]>>2]-+g[(c[j>>2]|0)+16>>2];g[r+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[(c[j>>2]|0)+16+4>>2];h=c[j>>2]|0;g[h>>2]=+g[h>>2]+ +g[(c[j>>2]|0)+16>>2];h=(c[j>>2]|0)+4|0;g[h>>2]=+g[h>>2]+ +g[(c[j>>2]|0)+16+4>>2];g[s>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[(c[j>>2]|0)+24>>2];g[s+4>>2]=+g[(c[j>>2]|0)+8+4>>2]+ +g[(c[j>>2]|0)+24+4>>2];g[(c[j>>2]|0)+16>>2]=+g[c[j>>2]>>2]-+g[s>>2];g[(c[j>>2]|0)+16+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[s+4>>2];h=c[j>>2]|0;g[h>>2]=+g[h>>2]+ +g[s>>2];h=(c[j>>2]|0)+4|0;g[h>>2]=+g[h>>2]+ +g[s+4>>2];g[s>>2]=+g[(c[j>>2]|0)+8>>2]-+g[(c[j>>2]|0)+24>>2];g[s+4>>2]=+g[(c[j>>2]|0)+8+4>>2]-+g[(c[j>>2]|0)+24+4>>2];g[(c[j>>2]|0)+8>>2]=+g[r>>2]+ +g[s+4>>2];g[(c[j>>2]|0)+8+4>>2]=+g[r+4>>2]-+g[s>>2];g[(c[j>>2]|0)+24>>2]=+g[r>>2]-+g[s+4>>2];g[(c[j>>2]|0)+24+4>>2]=+g[r+4>>2]+ +g[s>>2];c[j>>2]=(c[j>>2]|0)+32;c[q>>2]=(c[q>>2]|0)+1}l=i;return}c[y>>2]=c[n>>2]<<1;c[z>>2]=(c[n>>2]|0)*3;c[A>>2]=c[j>>2];c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;c[j>>2]=(c[A>>2]|0)+((R(c[q>>2]|0,c[p>>2]|0)|0)<<3);s=c[(c[m>>2]|0)+48>>2]|0;c[v>>2]=s;c[w>>2]=s;c[x>>2]=s;c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[n>>2]|0))break;g[u>>2]=+g[(c[j>>2]|0)+(c[n>>2]<<3)>>2]*+g[c[v>>2]>>2]-+g[(c[j>>2]|0)+(c[n>>2]<<3)+4>>2]*+g[(c[v>>2]|0)+4>>2];g[u+4>>2]=+g[(c[j>>2]|0)+(c[n>>2]<<3)>>2]*+g[(c[v>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[n>>2]<<3)+4>>2]*+g[c[v>>2]>>2];g[u+8>>2]=+g[(c[j>>2]|0)+(c[y>>2]<<3)>>2]*+g[c[w>>2]>>2]-+g[(c[j>>2]|0)+(c[y>>2]<<3)+4>>2]*+g[(c[w>>2]|0)+4>>2];g[u+8+4>>2]=+g[(c[j>>2]|0)+(c[y>>2]<<3)>>2]*+g[(c[w>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[y>>2]<<3)+4>>2]*+g[c[w>>2]>>2];g[u+16>>2]=+g[(c[j>>2]|0)+(c[z>>2]<<3)>>2]*+g[c[x>>2]>>2]-+g[(c[j>>2]|0)+(c[z>>2]<<3)+4>>2]*+g[(c[x>>2]|0)+4>>2];g[u+16+4>>2]=+g[(c[j>>2]|0)+(c[z>>2]<<3)>>2]*+g[(c[x>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[z>>2]<<3)+4>>2]*+g[c[x>>2]>>2];g[u+40>>2]=+g[c[j>>2]>>2]-+g[u+8>>2];g[u+40+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[u+8+4>>2];s=c[j>>2]|0;g[s>>2]=+g[s>>2]+ +g[u+8>>2];s=(c[j>>2]|0)+4|0;g[s>>2]=+g[s>>2]+ +g[u+8+4>>2];g[u+24>>2]=+g[u>>2]+ +g[u+16>>2];g[u+24+4>>2]=+g[u+4>>2]+ +g[u+16+4>>2];g[u+32>>2]=+g[u>>2]-+g[u+16>>2];g[u+32+4>>2]=+g[u+4>>2]-+g[u+16+4>>2];g[(c[j>>2]|0)+(c[y>>2]<<3)>>2]=+g[c[j>>2]>>2]-+g[u+24>>2];g[(c[j>>2]|0)+(c[y>>2]<<3)+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[u+24+4>>2];c[v>>2]=(c[v>>2]|0)+(c[k>>2]<<3);c[w>>2]=(c[w>>2]|0)+(c[k>>2]<<1<<3);c[x>>2]=(c[x>>2]|0)+((c[k>>2]|0)*3<<3);s=c[j>>2]|0;g[s>>2]=+g[s>>2]+ +g[u+24>>2];s=(c[j>>2]|0)+4|0;g[s>>2]=+g[s>>2]+ +g[u+24+4>>2];g[(c[j>>2]|0)+(c[n>>2]<<3)>>2]=+g[u+40>>2]+ +g[u+32+4>>2];g[(c[j>>2]|0)+(c[n>>2]<<3)+4>>2]=+g[u+40+4>>2]-+g[u+32>>2];g[(c[j>>2]|0)+(c[z>>2]<<3)>>2]=+g[u+40>>2]-+g[u+32+4>>2];g[(c[j>>2]|0)+(c[z>>2]<<3)+4>>2]=+g[u+40+4>>2]+ +g[u+32>>2];c[j>>2]=(c[j>>2]|0)+8;c[t>>2]=(c[t>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+1}l=i;return}function Hb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;i=l;l=l+112|0;j=i+96|0;k=i+92|0;m=i+88|0;n=i+84|0;o=i+80|0;p=i+76|0;q=i+72|0;r=i+68|0;s=i+64|0;t=i+60|0;u=i+56|0;v=i+16|0;w=i+8|0;x=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[s>>2]=c[n>>2]<<1;c[x>>2]=c[j>>2];h=(c[(c[m>>2]|0)+48>>2]|0)+((R(c[k>>2]|0,c[n>>2]|0)|0)<<3)|0;c[w>>2]=c[h>>2];c[w+4>>2]=c[h+4>>2];c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;c[j>>2]=(c[x>>2]|0)+((R(c[q>>2]|0,c[p>>2]|0)|0)<<3);h=c[(c[m>>2]|0)+48>>2]|0;c[u>>2]=h;c[t>>2]=h;c[r>>2]=c[n>>2];do{g[v+8>>2]=+g[(c[j>>2]|0)+(c[n>>2]<<3)>>2]*+g[c[t>>2]>>2]-+g[(c[j>>2]|0)+(c[n>>2]<<3)+4>>2]*+g[(c[t>>2]|0)+4>>2];g[v+8+4>>2]=+g[(c[j>>2]|0)+(c[n>>2]<<3)>>2]*+g[(c[t>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[n>>2]<<3)+4>>2]*+g[c[t>>2]>>2];g[v+16>>2]=+g[(c[j>>2]|0)+(c[s>>2]<<3)>>2]*+g[c[u>>2]>>2]-+g[(c[j>>2]|0)+(c[s>>2]<<3)+4>>2]*+g[(c[u>>2]|0)+4>>2];g[v+16+4>>2]=+g[(c[j>>2]|0)+(c[s>>2]<<3)>>2]*+g[(c[u>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[s>>2]<<3)+4>>2]*+g[c[u>>2]>>2];g[v+24>>2]=+g[v+8>>2]+ +g[v+16>>2];g[v+24+4>>2]=+g[v+8+4>>2]+ +g[v+16+4>>2];g[v>>2]=+g[v+8>>2]-+g[v+16>>2];g[v+4>>2]=+g[v+8+4>>2]-+g[v+16+4>>2];c[t>>2]=(c[t>>2]|0)+(c[k>>2]<<3);c[u>>2]=(c[u>>2]|0)+(c[k>>2]<<1<<3);g[(c[j>>2]|0)+(c[n>>2]<<3)>>2]=+g[c[j>>2]>>2]-+g[v+24>>2]*.5;g[(c[j>>2]|0)+(c[n>>2]<<3)+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[v+24+4>>2]*.5;g[v>>2]=+g[v>>2]*+g[w+4>>2];h=v+4|0;g[h>>2]=+g[h>>2]*+g[w+4>>2];h=c[j>>2]|0;g[h>>2]=+g[h>>2]+ +g[v+24>>2];h=(c[j>>2]|0)+4|0;g[h>>2]=+g[h>>2]+ +g[v+24+4>>2];g[(c[j>>2]|0)+(c[s>>2]<<3)>>2]=+g[(c[j>>2]|0)+(c[n>>2]<<3)>>2]+ +g[v+4>>2];g[(c[j>>2]|0)+(c[s>>2]<<3)+4>>2]=+g[(c[j>>2]|0)+(c[n>>2]<<3)+4>>2]-+g[v>>2];h=(c[j>>2]|0)+(c[n>>2]<<3)|0;g[h>>2]=+g[h>>2]-+g[v+4>>2];h=(c[j>>2]|0)+(c[n>>2]<<3)+4|0;g[h>>2]=+g[h>>2]+ +g[v>>2];c[j>>2]=(c[j>>2]|0)+8;h=(c[r>>2]|0)+-1|0;c[r>>2]=h}while((h|0)!=0);c[q>>2]=(c[q>>2]|0)+1}l=i;return}function Ib(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;i=l;l=l+192|0;j=i+184|0;k=i+180|0;m=i+176|0;n=i+172|0;o=i+168|0;p=i+164|0;q=i+160|0;r=i+156|0;s=i+152|0;t=i+148|0;u=i+144|0;v=i+140|0;w=i+136|0;x=i+32|0;y=i+24|0;z=i+16|0;A=i+8|0;B=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[B>>2]=c[j>>2];h=(c[(c[m>>2]|0)+48>>2]|0)+((R(c[k>>2]|0,c[n>>2]|0)|0)<<3)|0;c[z>>2]=c[h>>2];c[z+4>>2]=c[h+4>>2];h=(c[(c[m>>2]|0)+48>>2]|0)+((R(c[k>>2]<<1,c[n>>2]|0)|0)<<3)|0;c[A>>2]=c[h>>2];c[A+4>>2]=c[h+4>>2];c[y>>2]=c[(c[m>>2]|0)+48>>2];c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[o>>2]|0))break;c[j>>2]=(c[B>>2]|0)+((R(c[v>>2]|0,c[p>>2]|0)|0)<<3);c[q>>2]=c[j>>2];c[r>>2]=(c[q>>2]|0)+(c[n>>2]<<3);c[s>>2]=(c[q>>2]|0)+(c[n>>2]<<1<<3);c[t>>2]=(c[q>>2]|0)+((c[n>>2]|0)*3<<3);c[u>>2]=(c[q>>2]|0)+(c[n>>2]<<2<<3);c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[n>>2]|0))break;m=c[q>>2]|0;c[x>>2]=c[m>>2];c[x+4>>2]=c[m+4>>2];C=+g[c[r>>2]>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]|0,c[k>>2]|0)|0)<<3)>>2];g[x+8>>2]=C-+g[(c[r>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]|0,c[k>>2]|0)|0)<<3)+4>>2];C=+g[c[r>>2]>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]|0,c[k>>2]|0)|0)<<3)+4>>2];g[x+8+4>>2]=C+ +g[(c[r>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]|0,c[k>>2]|0)|0)<<3)>>2];C=+g[c[s>>2]>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<1,c[k>>2]|0)|0)<<3)>>2];g[x+16>>2]=C-+g[(c[s>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<1,c[k>>2]|0)|0)<<3)+4>>2];C=+g[c[s>>2]>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<1,c[k>>2]|0)|0)<<3)+4>>2];g[x+16+4>>2]=C+ +g[(c[s>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<1,c[k>>2]|0)|0)<<3)>>2];C=+g[c[t>>2]>>2]*+g[(c[y>>2]|0)+((R((c[w>>2]|0)*3|0,c[k>>2]|0)|0)<<3)>>2];g[x+24>>2]=C-+g[(c[t>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R((c[w>>2]|0)*3|0,c[k>>2]|0)|0)<<3)+4>>2];C=+g[c[t>>2]>>2]*+g[(c[y>>2]|0)+((R((c[w>>2]|0)*3|0,c[k>>2]|0)|0)<<3)+4>>2];g[x+24+4>>2]=C+ +g[(c[t>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R((c[w>>2]|0)*3|0,c[k>>2]|0)|0)<<3)>>2];C=+g[c[u>>2]>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<2,c[k>>2]|0)|0)<<3)>>2];g[x+32>>2]=C-+g[(c[u>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<2,c[k>>2]|0)|0)<<3)+4>>2];C=+g[c[u>>2]>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<2,c[k>>2]|0)|0)<<3)+4>>2];g[x+32+4>>2]=C+ +g[(c[u>>2]|0)+4>>2]*+g[(c[y>>2]|0)+((R(c[w>>2]<<2,c[k>>2]|0)|0)<<3)>>2];g[x+56>>2]=+g[x+8>>2]+ +g[x+32>>2];g[x+56+4>>2]=+g[x+8+4>>2]+ +g[x+32+4>>2];g[x+80>>2]=+g[x+8>>2]-+g[x+32>>2];g[x+80+4>>2]=+g[x+8+4>>2]-+g[x+32+4>>2];g[x+64>>2]=+g[x+16>>2]+ +g[x+24>>2];g[x+64+4>>2]=+g[x+16+4>>2]+ +g[x+24+4>>2];g[x+72>>2]=+g[x+16>>2]-+g[x+24>>2];g[x+72+4>>2]=+g[x+16+4>>2]-+g[x+24+4>>2];m=c[q>>2]|0;g[m>>2]=+g[m>>2]+(+g[x+56>>2]+ +g[x+64>>2]);m=(c[q>>2]|0)+4|0;g[m>>2]=+g[m>>2]+(+g[x+56+4>>2]+ +g[x+64+4>>2]);g[x+40>>2]=+g[x>>2]+ +g[x+56>>2]*+g[z>>2]+ +g[x+64>>2]*+g[A>>2];g[x+40+4>>2]=+g[x+4>>2]+ +g[x+56+4>>2]*+g[z>>2]+ +g[x+64+4>>2]*+g[A>>2];g[x+48>>2]=+g[x+80+4>>2]*+g[z+4>>2]+ +g[x+72+4>>2]*+g[A+4>>2];g[x+48+4>>2]=-(+g[x+80>>2]*+g[z+4>>2])-+g[x+72>>2]*+g[A+4>>2];g[c[r>>2]>>2]=+g[x+40>>2]-+g[x+48>>2];g[(c[r>>2]|0)+4>>2]=+g[x+40+4>>2]-+g[x+48+4>>2];g[c[u>>2]>>2]=+g[x+40>>2]+ +g[x+48>>2];g[(c[u>>2]|0)+4>>2]=+g[x+40+4>>2]+ +g[x+48+4>>2];g[x+88>>2]=+g[x>>2]+ +g[x+56>>2]*+g[A>>2]+ +g[x+64>>2]*+g[z>>2];g[x+88+4>>2]=+g[x+4>>2]+ +g[x+56+4>>2]*+g[A>>2]+ +g[x+64+4>>2]*+g[z>>2];g[x+96>>2]=-(+g[x+80+4>>2]*+g[A+4>>2])+ +g[x+72+4>>2]*+g[z+4>>2];g[x+96+4>>2]=+g[x+80>>2]*+g[A+4>>2]-+g[x+72>>2]*+g[z+4>>2];g[c[s>>2]>>2]=+g[x+88>>2]+ +g[x+96>>2];g[(c[s>>2]|0)+4>>2]=+g[x+88+4>>2]+ +g[x+96+4>>2];g[c[t>>2]>>2]=+g[x+88>>2]-+g[x+96>>2];g[(c[t>>2]|0)+4>>2]=+g[x+88+4>>2]-+g[x+96+4>>2];c[q>>2]=(c[q>>2]|0)+8;c[r>>2]=(c[r>>2]|0)+8;c[s>>2]=(c[s>>2]|0)+8;c[t>>2]=(c[t>>2]|0)+8;c[u>>2]=(c[u>>2]|0)+8;c[w>>2]=(c[w>>2]|0)+1}c[v>>2]=(c[v>>2]|0)+1}l=i;return}function Jb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=l;l=l+112|0;i=h+108|0;j=h+104|0;k=h+100|0;m=h+96|0;n=h+92|0;o=h+88|0;p=h+68|0;q=h+64|0;r=h+48|0;s=h+24|0;t=h+4|0;u=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;g[q>>2]=1.0;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[s+16>>2]=0;g[u>>2]=.800000011920929;c[o>>2]=1;while(1){v=c[c[i>>2]>>2]|0;if((c[o>>2]|0)>=(c[k>>2]>>1|0))break;g[(c[j>>2]|0)+(c[o>>2]<<2)>>2]=((+g[v+((c[o>>2]<<1)-1<<2)>>2]+ +g[(c[c[i>>2]>>2]|0)+((c[o>>2]<<1)+1<<2)>>2])*.5+ +g[(c[c[i>>2]>>2]|0)+(c[o>>2]<<1<<2)>>2])*.5;c[o>>2]=(c[o>>2]|0)+1}g[c[j>>2]>>2]=(+g[v+4>>2]*.5+ +g[c[c[i>>2]>>2]>>2])*.5;if((c[m>>2]|0)==2){c[o>>2]=1;while(1){w=c[(c[i>>2]|0)+4>>2]|0;if((c[o>>2]|0)>=(c[k>>2]>>1|0))break;m=(c[j>>2]|0)+(c[o>>2]<<2)|0;g[m>>2]=+g[m>>2]+((+g[w+((c[o>>2]<<1)-1<<2)>>2]+ +g[(c[(c[i>>2]|0)+4>>2]|0)+((c[o>>2]<<1)+1<<2)>>2])*.5+ +g[(c[(c[i>>2]|0)+4>>2]|0)+(c[o>>2]<<1<<2)>>2])*.5;c[o>>2]=(c[o>>2]|0)+1}m=c[j>>2]|0;g[m>>2]=+g[m>>2]+(+g[w+4>>2]*.5+ +g[c[(c[i>>2]|0)+4>>2]>>2])*.5}Pb(c[j>>2]|0,p,0,0,4,c[k>>2]>>1,c[n>>2]|0)|0;g[p>>2]=+g[p>>2]*1.000100016593933;c[o>>2]=1;while(1){if((c[o>>2]|0)>4)break;n=p+(c[o>>2]<<2)|0;g[n>>2]=+g[n>>2]-+g[p+(c[o>>2]<<2)>>2]*(+(c[o>>2]|0)*.00800000037997961)*(+(c[o>>2]|0)*.00800000037997961);c[o>>2]=(c[o>>2]|0)+1}Qb(r,p,4);c[o>>2]=0;while(1){if((c[o>>2]|0)>=4)break;g[q>>2]=+g[q>>2]*.8999999761581421;g[r+(c[o>>2]<<2)>>2]=+g[r+(c[o>>2]<<2)>>2]*+g[q>>2];c[o>>2]=(c[o>>2]|0)+1}g[t>>2]=+g[r>>2]+.800000011920929;g[t+4>>2]=+g[r+4>>2]+ +g[u>>2]*+g[r>>2];g[t+8>>2]=+g[r+8>>2]+ +g[u>>2]*+g[r+4>>2];g[t+12>>2]=+g[r+12>>2]+ +g[u>>2]*+g[r+8>>2];g[t+16>>2]=+g[u>>2]*+g[r+12>>2];Rb(c[j>>2]|0,t,c[j>>2]|0,c[k>>2]>>1,s);l=h;return}function Kb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,F=0;i=l;l=l+80|0;j=i+64|0;k=i+60|0;m=i+56|0;n=i+52|0;o=i+48|0;p=i+40|0;q=i+36|0;r=i+32|0;s=i+24|0;t=i+20|0;u=i+16|0;v=i+12|0;w=i+8|0;x=i+4|0;y=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[i+44>>2]=h;c[s>>2]=0;c[s+4>>2]=0;c[r>>2]=(c[m>>2]|0)+(c[n>>2]|0);h=c[m>>2]>>2;c[u>>2]=da()|0;f=l;l=l+((1*(h<<2)|0)+15&-16)|0;h=l;l=l+((1*(c[r>>2]>>2<<2)|0)+15&-16)|0;e=l;l=l+((1*(c[n>>2]>>1<<2)|0)+15&-16)|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[m>>2]>>2|0))break;g[f+(c[q>>2]<<2)>>2]=+g[(c[j>>2]|0)+(c[q>>2]<<1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[r>>2]>>2|0))break;g[h+(c[q>>2]<<2)>>2]=+g[(c[k>>2]|0)+(c[q>>2]<<1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}Mb(f,h,e,c[m>>2]>>2,c[n>>2]>>2);Nb(e,h,c[m>>2]>>2,c[n>>2]>>2,s);c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[n>>2]>>1|0))break;g[e+(c[p>>2]<<2)>>2]=0.0;if(!((E((c[p>>2]|0)-(c[s>>2]<<1)|0)|0)>2?(E((c[p>>2]|0)-(c[s+4>>2]<<1)|0)|0)>2:0)){g[v>>2]=+Lb(c[j>>2]|0,(c[k>>2]|0)+(c[p>>2]<<2)|0,c[m>>2]>>1);g[e+(c[p>>2]<<2)>>2]=-1.0>+g[v>>2]?-1.0:+g[v>>2]}c[p>>2]=(c[p>>2]|0)+1}Nb(e,c[k>>2]|0,c[m>>2]>>1,c[n>>2]>>1,s);if((c[s>>2]|0)>0?(c[s>>2]|0)<((c[n>>2]>>1)-1|0):0){g[w>>2]=+g[e+((c[s>>2]|0)-1<<2)>>2];g[x>>2]=+g[e+(c[s>>2]<<2)>>2];g[y>>2]=+g[e+((c[s>>2]|0)+1<<2)>>2];if(+g[y>>2]-+g[w>>2]>(+g[x>>2]-+g[w>>2])*.699999988079071){c[t>>2]=1;z=c[s>>2]|0;A=z<<1;B=c[t>>2]|0;C=A-B|0;D=c[o>>2]|0;c[D>>2]=C;F=c[u>>2]|0;ga(F|0);l=i;return}if(+g[w>>2]-+g[y>>2]>(+g[x>>2]-+g[y>>2])*.699999988079071){c[t>>2]=-1;z=c[s>>2]|0;A=z<<1;B=c[t>>2]|0;C=A-B|0;D=c[o>>2]|0;c[D>>2]=C;F=c[u>>2]|0;ga(F|0);l=i;return}else{c[t>>2]=0;z=c[s>>2]|0;A=z<<1;B=c[t>>2]|0;C=A-B|0;D=c[o>>2]|0;c[D>>2]=C;F=c[u>>2]|0;ga(F|0);l=i;return}}c[t>>2]=0;z=c[s>>2]|0;A=z<<1;B=c[t>>2]|0;C=A-B|0;D=c[o>>2]|0;c[D>>2]=C;F=c[u>>2]|0;ga(F|0);l=i;return}function Lb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0.0;e=l;l=l+32|0;f=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[f>>2]=a;c[h>>2]=b;c[i>>2]=d;g[k>>2]=0.0;c[j>>2]=0;while(1){m=+g[k>>2];if((c[j>>2]|0)>=(c[i>>2]|0))break;g[k>>2]=m+ +g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2];c[j>>2]=(c[j>>2]|0)+1}l=e;return +m}function Mb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;h=l;l=l+48|0;i=h+44|0;j=h+40|0;k=h+36|0;m=h+32|0;n=h+28|0;o=h+24|0;p=h+8|0;q=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=0;while(1){if((c[o>>2]|0)>=((c[n>>2]|0)-3|0))break;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;Ob(c[i>>2]|0,(c[j>>2]|0)+(c[o>>2]<<2)|0,p,c[m>>2]|0);g[(c[k>>2]|0)+(c[o>>2]<<2)>>2]=+g[p>>2];g[(c[k>>2]|0)+((c[o>>2]|0)+1<<2)>>2]=+g[p+4>>2];g[(c[k>>2]|0)+((c[o>>2]|0)+2<<2)>>2]=+g[p+8>>2];g[(c[k>>2]|0)+((c[o>>2]|0)+3<<2)>>2]=+g[p+12>>2];c[o>>2]=(c[o>>2]|0)+4}while(1){if((c[o>>2]|0)>=(c[n>>2]|0))break;g[q>>2]=+Lb(c[i>>2]|0,(c[j>>2]|0)+(c[o>>2]<<2)|0,c[m>>2]|0);g[(c[k>>2]|0)+(c[o>>2]<<2)>>2]=+g[q>>2];c[o>>2]=(c[o>>2]|0)+1}l=h;return}function Nb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=l;l=l+64|0;i=h+52|0;j=h+48|0;k=h+44|0;m=h+40|0;n=h+36|0;o=h+32|0;p=h+28|0;q=h+24|0;r=h+16|0;s=h+8|0;t=h+4|0;u=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;g[q>>2]=1.0;g[r>>2]=-1.0;g[r+4>>2]=-1.0;g[s>>2]=0.0;g[s+4>>2]=0.0;c[c[n>>2]>>2]=0;c[(c[n>>2]|0)+4>>2]=1;c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[k>>2]|0))break;g[q>>2]=+g[q>>2]+ +g[(c[j>>2]|0)+(c[p>>2]<<2)>>2]*+g[(c[j>>2]|0)+(c[p>>2]<<2)>>2];c[p>>2]=(c[p>>2]|0)+1}c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[m>>2]|0))break;if(+g[(c[i>>2]|0)+(c[o>>2]<<2)>>2]>0.0?(g[u>>2]=+g[(c[i>>2]|0)+(c[o>>2]<<2)>>2],g[u>>2]=+g[u>>2]*9.999999960041972e-13,g[t>>2]=+g[u>>2]*+g[u>>2],+g[t>>2]*+g[s+4>>2]>+g[r+4>>2]*+g[q>>2]):0){if(+g[t>>2]*+g[s>>2]>+g[r>>2]*+g[q>>2]){g[r+4>>2]=+g[r>>2];g[s+4>>2]=+g[s>>2];c[(c[n>>2]|0)+4>>2]=c[c[n>>2]>>2];g[r>>2]=+g[t>>2];g[s>>2]=+g[q>>2];v=c[o>>2]|0;w=c[n>>2]|0}else{g[r+4>>2]=+g[t>>2];g[s+4>>2]=+g[q>>2];v=c[o>>2]|0;w=(c[n>>2]|0)+4|0}c[w>>2]=v}g[q>>2]=+g[q>>2]+(+g[(c[j>>2]|0)+((c[o>>2]|0)+(c[k>>2]|0)<<2)>>2]*+g[(c[j>>2]|0)+((c[o>>2]|0)+(c[k>>2]|0)<<2)>>2]-+g[(c[j>>2]|0)+(c[o>>2]<<2)>>2]*+g[(c[j>>2]|0)+(c[o>>2]<<2)>>2]);g[q>>2]=1.0>+g[q>>2]?1.0:+g[q>>2];c[o>>2]=(c[o>>2]|0)+1}l=h;return}function Ob(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+64|0;h=f+48|0;i=f+44|0;j=f+40|0;k=f+36|0;m=f+32|0;n=f+28|0;o=f+24|0;p=f+20|0;q=f+16|0;r=f+12|0;s=f+8|0;t=f+4|0;u=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;g[q>>2]=0.0;e=c[i>>2]|0;c[i>>2]=e+4;g[n>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[o>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[p>>2]=+g[e>>2];c[m>>2]=0;while(1){if((c[m>>2]|0)>=((c[k>>2]|0)-3|0))break;e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[q>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[n>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[o>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[p>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[q>>2];e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[n>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[o>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[p>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[n>>2];e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[o>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[p>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[q>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[n>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[o>>2];e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[p>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[q>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[n>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[o>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[p>>2];c[m>>2]=(c[m>>2]|0)+4}r=c[m>>2]|0;c[m>>2]=r+1;if((r|0)<(c[k>>2]|0)){r=c[h>>2]|0;c[h>>2]=r+4;g[s>>2]=+g[r>>2];r=c[i>>2]|0;c[i>>2]=r+4;g[q>>2]=+g[r>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[s>>2]*+g[n>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[s>>2]*+g[o>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[s>>2]*+g[p>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[s>>2]*+g[q>>2]}s=c[m>>2]|0;c[m>>2]=s+1;if((s|0)<(c[k>>2]|0)){s=c[h>>2]|0;c[h>>2]=s+4;g[t>>2]=+g[s>>2];s=c[i>>2]|0;c[i>>2]=s+4;g[n>>2]=+g[s>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[t>>2]*+g[o>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[t>>2]*+g[p>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[t>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[t>>2]*+g[n>>2]}if((c[m>>2]|0)>=(c[k>>2]|0)){l=f;return}k=c[h>>2]|0;c[h>>2]=k+4;g[u>>2]=+g[k>>2];k=c[i>>2]|0;c[i>>2]=k+4;g[o>>2]=+g[k>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[u>>2]*+g[p>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[u>>2]*+g[q>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[u>>2]*+g[n>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[u>>2]*+g[o>>2];l=f;return}function Pb(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;j=l;l=l+64|0;k=j+52|0;m=j+48|0;n=j+44|0;o=j+40|0;p=j+36|0;q=j+32|0;r=j+24|0;s=j+20|0;t=j+16|0;u=j+12|0;v=j+8|0;w=j+4|0;x=j;c[k>>2]=a;c[m>>2]=b;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=h;c[j+28>>2]=i;c[u>>2]=(c[q>>2]|0)-(c[p>>2]|0);i=c[q>>2]|0;c[x>>2]=da()|0;h=l;l=l+((1*(i<<2)|0)+15&-16)|0;if(!(c[o>>2]|0))c[w>>2]=c[k>>2];else{c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[q>>2]|0))break;g[h+(c[s>>2]<<2)>>2]=+g[(c[k>>2]|0)+(c[s>>2]<<2)>>2];c[s>>2]=(c[s>>2]|0)+1}c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[o>>2]|0))break;g[h+(c[s>>2]<<2)>>2]=+g[(c[k>>2]|0)+(c[s>>2]<<2)>>2]*+g[(c[n>>2]|0)+(c[s>>2]<<2)>>2];g[h+((c[q>>2]|0)-(c[s>>2]|0)-1<<2)>>2]=+g[(c[k>>2]|0)+((c[q>>2]|0)-(c[s>>2]|0)-1<<2)>>2]*+g[(c[n>>2]|0)+(c[s>>2]<<2)>>2];c[s>>2]=(c[s>>2]|0)+1}c[w>>2]=h}c[v>>2]=0;Mb(c[w>>2]|0,c[w>>2]|0,c[m>>2]|0,c[u>>2]|0,(c[p>>2]|0)+1|0);c[t>>2]=0;while(1){if((c[t>>2]|0)>(c[p>>2]|0))break;c[s>>2]=(c[t>>2]|0)+(c[u>>2]|0);g[r>>2]=0.0;while(1){y=+g[r>>2];if((c[s>>2]|0)>=(c[q>>2]|0))break;g[r>>2]=y+ +g[(c[w>>2]|0)+(c[s>>2]<<2)>>2]*+g[(c[w>>2]|0)+((c[s>>2]|0)-(c[t>>2]|0)<<2)>>2];c[s>>2]=(c[s>>2]|0)+1}h=(c[m>>2]|0)+(c[t>>2]<<2)|0;g[h>>2]=+g[h>>2]+y;c[t>>2]=(c[t>>2]|0)+1}t=c[v>>2]|0;ga(c[x>>2]|0);l=j;return t|0}function Qb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=l;l=l+48|0;f=e+40|0;h=e+36|0;i=e+32|0;j=e+28|0;k=e+24|0;m=e+20|0;n=e+16|0;o=e+12|0;p=e+8|0;q=e+4|0;r=e;c[f>>2]=a;c[h>>2]=b;c[i>>2]=d;g[n>>2]=+g[c[h>>2]>>2];c[o>>2]=c[f>>2];c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[i>>2]|0))break;g[(c[o>>2]|0)+(c[j>>2]<<2)>>2]=0.0;c[j>>2]=(c[j>>2]|0)+1}if(!(+g[c[h>>2]>>2]!=0.0)){l=e;return}c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[i>>2]|0)){s=15;break}g[p>>2]=0.0;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[j>>2]|0))break;g[p>>2]=+g[p>>2]+ +g[(c[o>>2]|0)+(c[k>>2]<<2)>>2]*+g[(c[h>>2]|0)+((c[j>>2]|0)-(c[k>>2]|0)<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}g[p>>2]=+g[p>>2]+ +g[(c[h>>2]|0)+((c[j>>2]|0)+1<<2)>>2];g[m>>2]=-(+g[p>>2]/+g[n>>2]);g[(c[o>>2]|0)+(c[j>>2]<<2)>>2]=+g[m>>2];c[k>>2]=0;while(1){if((c[k>>2]|0)>=((c[j>>2]|0)+1>>1|0))break;g[q>>2]=+g[(c[o>>2]|0)+(c[k>>2]<<2)>>2];g[r>>2]=+g[(c[o>>2]|0)+((c[j>>2]|0)-1-(c[k>>2]|0)<<2)>>2];g[(c[o>>2]|0)+(c[k>>2]<<2)>>2]=+g[q>>2]+ +g[m>>2]*+g[r>>2];g[(c[o>>2]|0)+((c[j>>2]|0)-1-(c[k>>2]|0)<<2)>>2]=+g[r>>2]+ +g[m>>2]*+g[q>>2];c[k>>2]=(c[k>>2]|0)+1}g[n>>2]=+g[n>>2]-+g[m>>2]*+g[m>>2]*+g[n>>2];if(+g[n>>2]<+g[c[h>>2]>>2]*1.0000000474974513e-03){s=15;break}c[j>>2]=(c[j>>2]|0)+1}if((s|0)==15){l=e;return}}function Rb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;h=l;l=l+80|0;i=h+64|0;j=h+60|0;k=h+56|0;m=h+52|0;n=h+48|0;o=h+44|0;p=h+40|0;q=h+36|0;r=h+32|0;s=h+28|0;t=h+24|0;u=h+20|0;v=h+16|0;w=h+12|0;x=h+8|0;y=h+4|0;z=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;g[p>>2]=+g[c[j>>2]>>2];g[q>>2]=+g[(c[j>>2]|0)+4>>2];g[r>>2]=+g[(c[j>>2]|0)+8>>2];g[s>>2]=+g[(c[j>>2]|0)+12>>2];g[t>>2]=+g[(c[j>>2]|0)+16>>2];g[u>>2]=+g[c[n>>2]>>2];g[v>>2]=+g[(c[n>>2]|0)+4>>2];g[w>>2]=+g[(c[n>>2]|0)+8>>2];g[x>>2]=+g[(c[n>>2]|0)+12>>2];g[y>>2]=+g[(c[n>>2]|0)+16>>2];c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[m>>2]|0))break;g[z>>2]=+g[(c[i>>2]|0)+(c[o>>2]<<2)>>2];g[z>>2]=+g[z>>2]+ +g[p>>2]*+g[u>>2];g[z>>2]=+g[z>>2]+ +g[q>>2]*+g[v>>2];g[z>>2]=+g[z>>2]+ +g[r>>2]*+g[w>>2];g[z>>2]=+g[z>>2]+ +g[s>>2]*+g[x>>2];g[z>>2]=+g[z>>2]+ +g[t>>2]*+g[y>>2];g[y>>2]=+g[x>>2];g[x>>2]=+g[w>>2];g[w>>2]=+g[v>>2];g[v>>2]=+g[u>>2];g[u>>2]=+g[(c[i>>2]|0)+(c[o>>2]<<2)>>2];g[(c[k>>2]|0)+(c[o>>2]<<2)>>2]=+g[z>>2];c[o>>2]=(c[o>>2]|0)+1}g[c[n>>2]>>2]=+g[u>>2];g[(c[n>>2]|0)+4>>2]=+g[v>>2];g[(c[n>>2]|0)+8>>2]=+g[w>>2];g[(c[n>>2]|0)+12>>2]=+g[x>>2];g[(c[n>>2]|0)+16>>2]=+g[y>>2];l=h;return}function Sb(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=yb(48e3,960,0)|0;a=Tb(c[e>>2]|0,c[d>>2]|0)|0;l=b;return a|0}function Tb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[e>>2]=a;c[f>>2]=b;b=88+((R(c[f>>2]|0,2048+(c[(c[e>>2]|0)+4>>2]|0)|0)|0)-1<<2)|0;c[g>>2]=b+((c[f>>2]|0)*24<<2)+(c[(c[e>>2]|0)+8>>2]<<3<<2);l=d;return c[g>>2]|0}function Ub(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;d=c[g>>2]|0;b=yb(48e3,960,0)|0;c[j>>2]=Vb(d,b,c[i>>2]|0)|0;if(c[j>>2]|0){c[f>>2]=c[j>>2];k=c[f>>2]|0;l=e;return k|0}j=ub(c[h>>2]|0)|0;c[(c[g>>2]|0)+16>>2]=j;if(!(c[(c[g>>2]|0)+16>>2]|0)){c[f>>2]=-1;k=c[f>>2]|0;l=e;return k|0}else{c[f>>2]=0;k=c[f>>2]|0;l=e;return k|0}return 0}function Vb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if((c[i>>2]|0)<0|(c[i>>2]|0)>2){c[f>>2]=-1;j=c[f>>2]|0;l=e;return j|0}if(!(c[g>>2]|0)){c[f>>2]=-7;j=c[f>>2]|0;l=e;return j|0}else{d=c[g>>2]|0;He(d|0,0,Tb(c[h>>2]|0,c[i>>2]|0)|0)|0;c[c[g>>2]>>2]=c[h>>2];c[(c[g>>2]|0)+4>>2]=c[(c[h>>2]|0)+4>>2];h=c[i>>2]|0;c[(c[g>>2]|0)+8>>2]=h;c[(c[g>>2]|0)+12>>2]=h;c[(c[g>>2]|0)+16>>2]=1;c[(c[g>>2]|0)+20>>2]=0;c[(c[g>>2]|0)+24>>2]=c[(c[c[g>>2]>>2]|0)+12>>2];c[(c[g>>2]|0)+28>>2]=1;h=Wb()|0;c[(c[g>>2]|0)+32>>2]=h;c[(c[g>>2]|0)+48>>2]=0;Xb(c[g>>2]|0,4028,e)|0;c[f>>2]=0;j=c[f>>2]|0;l=e;return j|0}return 0}function Wb(){return 0}function Xb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;e=l;l=l+128|0;f=e+120|0;h=e+116|0;i=e+112|0;j=e+96|0;k=e+88|0;m=e+84|0;n=e+80|0;o=e+76|0;p=e+72|0;q=e+68|0;r=e+64|0;s=e+60|0;t=e+56|0;u=e+52|0;v=e+48|0;w=e+44|0;x=e+40|0;y=e+36|0;z=e+32|0;A=e+28|0;B=e+24|0;C=e+20|0;D=e+16|0;E=e+12|0;F=e+8|0;G=e+4|0;H=e;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;a:do switch(c[i>>2]|0){case 10010:{d=(c[j>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[j>>2]=d+4;c[m>>2]=b;c[k>>2]=c[m>>2];if((c[k>>2]|0)>=0?(c[k>>2]|0)<(c[(c[c[h>>2]>>2]|0)+8>>2]|0):0){c[(c[h>>2]|0)+20>>2]=c[k>>2];I=24}else I=25;break}case 10012:{b=(c[j>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[j>>2]=b+4;c[o>>2]=d;c[n>>2]=c[o>>2];if((c[n>>2]|0)>=1?(c[n>>2]|0)<=(c[(c[c[h>>2]>>2]|0)+8>>2]|0):0){c[(c[h>>2]|0)+24>>2]=c[n>>2];I=24}else I=25;break}case 10008:{d=(c[j>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[j>>2]=d+4;c[q>>2]=b;c[p>>2]=c[q>>2];if((c[p>>2]|0)<1|(c[p>>2]|0)>2)I=25;else{c[(c[h>>2]|0)+12>>2]=c[p>>2];I=24}break}case 10007:{b=(c[j>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[j>>2]=b+4;c[s>>2]=d;c[r>>2]=c[s>>2];if(!(c[r>>2]|0))I=25;else{c[c[r>>2]>>2]=c[(c[h>>2]|0)+40>>2];c[(c[h>>2]|0)+40>>2]=0;I=24}break}case 4027:{d=(c[j>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[j>>2]=d+4;c[u>>2]=b;c[t>>2]=c[u>>2];if(!(c[t>>2]|0))I=25;else{c[c[t>>2]>>2]=(c[(c[h>>2]|0)+4>>2]|0)/(c[(c[h>>2]|0)+16>>2]|0)|0;I=24}break}case 4028:{c[w>>2]=(c[h>>2]|0)+84+((R(2048+(c[(c[h>>2]|0)+4>>2]|0)|0,c[(c[h>>2]|0)+8>>2]|0)|0)<<2);c[x>>2]=(c[w>>2]|0)+((c[(c[h>>2]|0)+8>>2]|0)*24<<2);c[y>>2]=(c[x>>2]|0)+(c[(c[c[h>>2]>>2]|0)+8>>2]<<1<<2);c[z>>2]=(c[y>>2]|0)+(c[(c[c[h>>2]>>2]|0)+8>>2]<<1<<2);He((c[h>>2]|0)+36|0,0,(Tb(c[c[h>>2]>>2]|0,c[(c[h>>2]|0)+8>>2]|0)|0)-((c[h>>2]|0)+36-(c[h>>2]|0))|0)|0;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[(c[c[h>>2]>>2]|0)+8>>2]<<1|0)){I=24;break a}g[(c[z>>2]|0)+(c[v>>2]<<2)>>2]=-28.0;g[(c[y>>2]|0)+(c[v>>2]<<2)>>2]=-28.0;c[v>>2]=(c[v>>2]|0)+1}break}case 4033:{b=(c[j>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[j>>2]=b+4;c[B>>2]=d;c[A>>2]=c[B>>2];if(!(c[A>>2]|0))I=25;else{c[c[A>>2]>>2]=c[(c[h>>2]|0)+52>>2];I=24}break}case 10015:{d=(c[j>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[j>>2]=d+4;c[D>>2]=b;c[C>>2]=c[D>>2];if(!(c[C>>2]|0))I=25;else{c[c[C>>2]>>2]=c[c[h>>2]>>2];I=24}break}case 10016:{b=(c[j>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[j>>2]=b+4;c[F>>2]=d;c[E>>2]=c[F>>2];c[(c[h>>2]|0)+28>>2]=c[E>>2];I=24;break}case 4031:{d=(c[j>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[j>>2]=d+4;c[H>>2]=b;c[G>>2]=c[H>>2];if(!(c[G>>2]|0))I=25;else{c[c[G>>2]>>2]=c[(c[h>>2]|0)+36>>2];I=24}break}default:{c[f>>2]=-5;J=c[f>>2]|0;l=e;return J|0}}while(0);if((I|0)==24){c[f>>2]=0;J=c[f>>2]|0;l=e;return J|0}else if((I|0)==25){c[f>>2]=-1;J=c[f>>2]|0;l=e;return J|0}return 0}\nfunction Yb(a,d,e,f,h,i,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,ta=0,ua=0,va=0,wa=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Ga=0.0;k=l;l=l+288|0;m=k+280|0;n=k+276|0;o=k+272|0;p=k+268|0;q=k+264|0;r=k+260|0;s=k+256|0;t=k+252|0;u=k+248|0;v=k+244|0;w=k+240|0;x=k+236|0;y=k+232|0;z=k+184|0;A=k+176|0;B=k+168|0;C=k+164|0;D=k+160|0;E=k+156|0;F=k+152|0;G=k+148|0;H=k+144|0;I=k+140|0;J=k+136|0;K=k+132|0;L=k+128|0;M=k+124|0;N=k+120|0;O=k+116|0;P=k+112|0;Q=k+108|0;S=k+104|0;T=k+100|0;U=k+96|0;V=k+92|0;W=k+88|0;X=k+84|0;Y=k+80|0;Z=k+76|0;_=k+72|0;$=k+68|0;aa=k+64|0;ba=k+60|0;ca=k+56|0;ea=k+52|0;fa=k+48|0;ha=k+44|0;ia=k+40|0;ja=k+36|0;ka=k+32|0;la=k+28|0;ma=k+24|0;na=k+20|0;oa=k+16|0;pa=k+12|0;qa=k+8|0;ra=k+4|0;ta=k;c[n>>2]=a;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[s>>2]=i;c[t>>2]=j;c[K>>2]=c[(c[n>>2]|0)+8>>2];c[V>>2]=0;c[W>>2]=0;c[ba>>2]=0;c[ea>>2]=c[(c[n>>2]|0)+12>>2];c[fa>>2]=c[c[n>>2]>>2];c[ha>>2]=c[(c[fa>>2]|0)+8>>2];c[ia>>2]=c[(c[fa>>2]|0)+4>>2];c[ja>>2]=c[(c[fa>>2]|0)+32>>2];c[N>>2]=c[(c[n>>2]|0)+20>>2];c[O>>2]=c[(c[n>>2]|0)+24>>2];c[r>>2]=R(c[r>>2]|0,c[(c[n>>2]|0)+16>>2]|0)|0;c[C>>2]=(c[n>>2]|0)+84+((R(2048+(c[ia>>2]|0)|0,c[K>>2]|0)|0)<<2);c[D>>2]=(c[C>>2]|0)+((c[K>>2]|0)*24<<2);c[E>>2]=(c[D>>2]|0)+(c[ha>>2]<<1<<2);c[F>>2]=(c[E>>2]|0)+(c[ha>>2]<<1<<2);c[G>>2]=(c[F>>2]|0)+(c[ha>>2]<<1<<2);c[L>>2]=0;while(1){if((c[L>>2]|0)>(c[(c[fa>>2]|0)+36>>2]|0))break;if((c[(c[fa>>2]|0)+44>>2]<<c[L>>2]|0)==(c[r>>2]|0))break;c[L>>2]=(c[L>>2]|0)+1}if((c[L>>2]|0)>(c[(c[fa>>2]|0)+36>>2]|0)){c[m>>2]=-1;ua=c[m>>2]|0;l=k;return ua|0}c[M>>2]=1<<c[L>>2];if((c[p>>2]|0)<0|(c[p>>2]|0)>1275|(c[q>>2]|0)==0){c[m>>2]=-1;ua=c[m>>2]|0;l=k;return ua|0}c[w>>2]=R(c[M>>2]|0,c[(c[fa>>2]|0)+44>>2]|0)|0;c[u>>2]=0;do{C=(c[n>>2]|0)+84+((R(c[u>>2]|0,2048+(c[ia>>2]|0)|0)|0)<<2)|0;c[A+(c[u>>2]<<2)>>2]=C;c[B+(c[u>>2]<<2)>>2]=(c[A+(c[u>>2]<<2)>>2]|0)+8192+(0-(c[w>>2]|0)<<2);C=(c[u>>2]|0)+1|0;c[u>>2]=C}while((C|0)<(c[K>>2]|0));c[P>>2]=c[O>>2];if((c[P>>2]|0)>(c[(c[fa>>2]|0)+12>>2]|0))c[P>>2]=c[(c[fa>>2]|0)+12>>2];if((c[o>>2]|0)==0|(c[p>>2]|0)<=1){Zb(c[n>>2]|0,c[w>>2]|0,c[L>>2]|0);_b(B,c[q>>2]|0,c[w>>2]|0,c[K>>2]|0,c[(c[n>>2]|0)+16>>2]|0,(c[fa>>2]|0)+16|0,(c[n>>2]|0)+76|0,c[t>>2]|0);c[m>>2]=(c[r>>2]|0)/(c[(c[n>>2]|0)+16>>2]|0)|0;ua=c[m>>2]|0;l=k;return ua|0}if(!(c[s>>2]|0)){$b(z,c[o>>2]|0,c[p>>2]|0);c[s>>2]=z}a:do if((c[ea>>2]|0)==1){c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[ha>>2]|0))break a;if(+g[(c[D>>2]|0)+(c[v>>2]<<2)>>2]>+g[(c[D>>2]|0)+((c[ha>>2]|0)+(c[v>>2]|0)<<2)>>2])va=c[v>>2]|0;else va=(c[ha>>2]|0)+(c[v>>2]|0)|0;g[(c[D>>2]|0)+(c[v>>2]<<2)>>2]=+g[(c[D>>2]|0)+(va<<2)>>2];c[v>>2]=(c[v>>2]|0)+1}}while(0);c[X>>2]=c[p>>2]<<3;c[Z>>2]=ac(c[s>>2]|0)|0;do if((c[Z>>2]|0)<(c[X>>2]|0))if((c[Z>>2]|0)==1){c[ca>>2]=Va(c[s>>2]|0,15)|0;break}else{c[ca>>2]=0;break}else c[ca>>2]=1;while(0);if(c[ca>>2]|0){c[Z>>2]=c[p>>2]<<3;va=c[Z>>2]|0;z=va-(ac(c[s>>2]|0)|0)|0;va=(c[s>>2]|0)+20|0;c[va>>2]=(c[va>>2]|0)+z}g[U>>2]=0.0;c[T>>2]=0;c[$>>2]=0;if((c[N>>2]|0)==0?((c[Z>>2]|0)+16|0)<=(c[X>>2]|0):0){if(Va(c[s>>2]|0,1)|0){c[la>>2]=Qa(c[s>>2]|0,6)|0;z=16<<c[la>>2];c[T>>2]=z+(Fa(c[s>>2]|0,4+(c[la>>2]|0)|0)|0)-1;c[ka>>2]=Fa(c[s>>2]|0,3)|0;la=(ac(c[s>>2]|0)|0)+2|0;if((la|0)<=(c[X>>2]|0))c[$>>2]=bc(c[s>>2]|0,25134,2)|0;g[U>>2]=+((c[ka>>2]|0)+1|0)*.09375}c[Z>>2]=ac(c[s>>2]|0)|0}if((c[L>>2]|0)>0?((c[Z>>2]|0)+3|0)<=(c[X>>2]|0):0){c[I>>2]=Va(c[s>>2]|0,3)|0;c[Z>>2]=ac(c[s>>2]|0)|0}else c[I>>2]=0;if(c[I>>2]|0)c[H>>2]=c[M>>2];else c[H>>2]=0;if(((c[Z>>2]|0)+3|0)<=(c[X>>2]|0))wa=Va(c[s>>2]|0,3)|0;else wa=0;c[J>>2]=wa;cc(c[fa>>2]|0,c[N>>2]|0,c[O>>2]|0,c[D>>2]|0,c[J>>2]|0,c[s>>2]|0,c[ea>>2]|0,c[L>>2]|0);J=c[ha>>2]|0;c[ma>>2]=da()|0;wa=l;l=l+((1*(J<<2)|0)+15&-16)|0;dc(c[N>>2]|0,c[O>>2]|0,c[I>>2]|0,wa,c[L>>2]|0,c[s>>2]|0);c[Z>>2]=ac(c[s>>2]|0)|0;c[x>>2]=2;if(((c[Z>>2]|0)+4|0)<=(c[X>>2]|0))c[x>>2]=bc(c[s>>2]|0,25137,5)|0;J=l;l=l+((1*(c[ha>>2]<<2)|0)+15&-16)|0;xb(c[fa>>2]|0,J,c[L>>2]|0,c[ea>>2]|0);ka=l;l=l+((1*(c[ha>>2]<<2)|0)+15&-16)|0;c[_>>2]=6;c[X>>2]=c[X>>2]<<3;c[Z>>2]=ya(c[s>>2]|0)|0;c[v>>2]=c[N>>2];while(1){if((c[v>>2]|0)>=(c[O>>2]|0))break;la=R(c[ea>>2]|0,(b[(c[ja>>2]|0)+((c[v>>2]|0)+1<<1)>>1]|0)-(b[(c[ja>>2]|0)+(c[v>>2]<<1)>>1]|0)|0)|0;c[na>>2]=la<<c[L>>2];la=c[na>>2]|0;if((c[na>>2]<<3|0)<((48>(c[na>>2]|0)?48:c[na>>2]|0)|0))za=la<<3;else za=48>(la|0)?48:c[na>>2]|0;c[oa>>2]=za;c[pa>>2]=c[_>>2];c[qa>>2]=0;while(1){if(((c[Z>>2]|0)+(c[pa>>2]<<3)|0)>=(c[X>>2]|0))break;if((c[qa>>2]|0)>=(c[J+(c[v>>2]<<2)>>2]|0))break;c[ra>>2]=Va(c[s>>2]|0,c[pa>>2]|0)|0;c[Z>>2]=ya(c[s>>2]|0)|0;if(!(c[ra>>2]|0))break;c[qa>>2]=(c[qa>>2]|0)+(c[oa>>2]|0);c[X>>2]=(c[X>>2]|0)-(c[oa>>2]|0);c[pa>>2]=1}c[ka+(c[v>>2]<<2)>>2]=c[qa>>2];if((c[qa>>2]|0)>0)c[_>>2]=2>((c[_>>2]|0)-1|0)?2:(c[_>>2]|0)-1|0;c[v>>2]=(c[v>>2]|0)+1}_=l;l=l+((1*(c[ha>>2]<<2)|0)+15&-16)|0;if(((c[Z>>2]|0)+48|0)<=(c[X>>2]|0))Aa=bc(c[s>>2]|0,25141,7)|0;else Aa=5;c[S>>2]=Aa;Aa=c[p>>2]<<3<<3;c[y>>2]=Aa-(ya(c[s>>2]|0)|0)-1;if((c[I>>2]|0)!=0&(c[L>>2]|0)>=2)Ba=(c[y>>2]|0)>=((c[L>>2]|0)+2<<3|0);else Ba=0;c[aa>>2]=Ba?8:0;c[y>>2]=(c[y>>2]|0)-(c[aa>>2]|0);Ba=l;l=l+((1*(c[ha>>2]<<2)|0)+15&-16)|0;Aa=l;l=l+((1*(c[ha>>2]<<2)|0)+15&-16)|0;c[Q>>2]=zb(c[fa>>2]|0,c[N>>2]|0,c[O>>2]|0,ka,J,c[S>>2]|0,V,W,c[y>>2]|0,Y,Ba,_,Aa,c[ea>>2]|0,c[L>>2]|0,c[s>>2]|0,0,0,0)|0;ec(c[fa>>2]|0,c[N>>2]|0,c[O>>2]|0,c[D>>2]|0,_,c[s>>2]|0,c[ea>>2]|0);c[u>>2]=0;do{Le(c[A+(c[u>>2]<<2)>>2]|0,(c[A+(c[u>>2]<<2)>>2]|0)+(c[w>>2]<<2)|0,(2048-(c[w>>2]|0)+((c[ia>>2]|0)/2|0)<<2)+0|0)|0;y=(c[u>>2]|0)+1|0;c[u>>2]=y}while((y|0)<(c[K>>2]|0));A=R(c[ea>>2]|0,c[ha>>2]|0)|0;y=l;l=l+((1*A|0)+15&-16)|0;A=(R(c[ea>>2]|0,c[w>>2]|0)|0)<<2;S=l;l=l+((1*A|0)+15&-16)|0;xa(0,c[fa>>2]|0,c[N>>2]|0,c[O>>2]|0,S,(c[ea>>2]|0)==2?S+(c[w>>2]<<2)|0:0,y,0,Ba,c[H>>2]|0,c[x>>2]|0,c[W>>2]|0,c[V>>2]|0,wa,(c[p>>2]<<6)-(c[aa>>2]|0)|0,c[Y>>2]|0,c[s>>2]|0,c[L>>2]|0,c[Q>>2]|0,(c[n>>2]|0)+36|0);if((c[aa>>2]|0)>0)c[ba>>2]=Fa(c[s>>2]|0,1)|0;aa=c[fa>>2]|0;Q=c[N>>2]|0;Y=c[O>>2]|0;wa=c[D>>2]|0;V=c[p>>2]<<3;W=V-(ac(c[s>>2]|0)|0)|0;fc(aa,Q,Y,wa,_,Aa,W,c[s>>2]|0,c[ea>>2]|0);if(c[ba>>2]|0)sa(c[fa>>2]|0,S,y,c[L>>2]|0,c[ea>>2]|0,c[w>>2]|0,c[N>>2]|0,c[O>>2]|0,c[D>>2]|0,c[E>>2]|0,c[F>>2]|0,Ba,c[(c[n>>2]|0)+36>>2]|0);b:do if(c[ca>>2]|0){c[v>>2]=0;while(1){if((c[v>>2]|0)>=(R(c[ea>>2]|0,c[ha>>2]|0)|0))break b;g[(c[D>>2]|0)+(c[v>>2]<<2)>>2]=-28.0;c[v>>2]=(c[v>>2]|0)+1}}while(0);gc(c[fa>>2]|0,S,B,c[D>>2]|0,c[N>>2]|0,c[P>>2]|0,c[ea>>2]|0,c[K>>2]|0,c[I>>2]|0,c[L>>2]|0,c[(c[n>>2]|0)+16>>2]|0,c[ca>>2]|0);c[u>>2]=0;do{if((c[(c[n>>2]|0)+52>>2]|0)>15)Ca=c[(c[n>>2]|0)+52>>2]|0;else Ca=15;c[(c[n>>2]|0)+52>>2]=Ca;if((c[(c[n>>2]|0)+56>>2]|0)>15)Da=c[(c[n>>2]|0)+56>>2]|0;else Da=15;c[(c[n>>2]|0)+56>>2]=Da;vb(c[B+(c[u>>2]<<2)>>2]|0,c[B+(c[u>>2]<<2)>>2]|0,c[(c[n>>2]|0)+56>>2]|0,c[(c[n>>2]|0)+52>>2]|0,c[(c[fa>>2]|0)+44>>2]|0,+g[(c[n>>2]|0)+64>>2],+g[(c[n>>2]|0)+60>>2],c[(c[n>>2]|0)+72>>2]|0,c[(c[n>>2]|0)+68>>2]|0,c[(c[fa>>2]|0)+60>>2]|0,c[ia>>2]|0);if(c[L>>2]|0)vb((c[B+(c[u>>2]<<2)>>2]|0)+(c[(c[fa>>2]|0)+44>>2]<<2)|0,(c[B+(c[u>>2]<<2)>>2]|0)+(c[(c[fa>>2]|0)+44>>2]<<2)|0,c[(c[n>>2]|0)+52>>2]|0,c[T>>2]|0,(c[w>>2]|0)-(c[(c[fa>>2]|0)+44>>2]|0)|0,+g[(c[n>>2]|0)+60>>2],+g[U>>2],c[(c[n>>2]|0)+68>>2]|0,c[$>>2]|0,c[(c[fa>>2]|0)+60>>2]|0,c[ia>>2]|0);ca=(c[u>>2]|0)+1|0;c[u>>2]=ca}while((ca|0)<(c[K>>2]|0));c[(c[n>>2]|0)+56>>2]=c[(c[n>>2]|0)+52>>2];g[(c[n>>2]|0)+64>>2]=+g[(c[n>>2]|0)+60>>2];c[(c[n>>2]|0)+72>>2]=c[(c[n>>2]|0)+68>>2];c[(c[n>>2]|0)+52>>2]=c[T>>2];g[(c[n>>2]|0)+60>>2]=+g[U>>2];c[(c[n>>2]|0)+68>>2]=c[$>>2];if(c[L>>2]|0){c[(c[n>>2]|0)+56>>2]=c[(c[n>>2]|0)+52>>2];g[(c[n>>2]|0)+64>>2]=+g[(c[n>>2]|0)+60>>2];c[(c[n>>2]|0)+72>>2]=c[(c[n>>2]|0)+68>>2]}if((c[ea>>2]|0)==1)Ie((c[D>>2]|0)+(c[ha>>2]<<2)|0,c[D>>2]|0,(c[ha>>2]<<2)+0|0)|0;c:do if(c[I>>2]|0){c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[ha>>2]<<1|0))break c;if(+g[(c[E>>2]|0)+(c[v>>2]<<2)>>2]<+g[(c[D>>2]|0)+(c[v>>2]<<2)>>2])Ea=(c[E>>2]|0)+(c[v>>2]<<2)|0;else Ea=(c[D>>2]|0)+(c[v>>2]<<2)|0;g[(c[E>>2]|0)+(c[v>>2]<<2)>>2]=+g[Ea>>2];c[v>>2]=(c[v>>2]|0)+1}}else{Ie(c[F>>2]|0,c[E>>2]|0,(c[ha>>2]<<1<<2)+0|0)|0;Ie(c[E>>2]|0,c[D>>2]|0,(c[ha>>2]<<1<<2)+0|0)|0;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[ha>>2]<<1|0))break c;if(+g[(c[G>>2]|0)+(c[v>>2]<<2)>>2]+ +(c[M>>2]|0)*1.0000000474974513e-03<+g[(c[D>>2]|0)+(c[v>>2]<<2)>>2])Ga=+g[(c[G>>2]|0)+(c[v>>2]<<2)>>2]+ +(c[M>>2]|0)*1.0000000474974513e-03;else Ga=+g[(c[D>>2]|0)+(c[v>>2]<<2)>>2];g[(c[G>>2]|0)+(c[v>>2]<<2)>>2]=Ga;c[v>>2]=(c[v>>2]|0)+1}}while(0);c[u>>2]=0;do{c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[N>>2]|0))break;G=R(c[u>>2]|0,c[ha>>2]|0)|0;g[(c[D>>2]|0)+(G+(c[v>>2]|0)<<2)>>2]=0.0;G=R(c[u>>2]|0,c[ha>>2]|0)|0;g[(c[F>>2]|0)+(G+(c[v>>2]|0)<<2)>>2]=-28.0;G=R(c[u>>2]|0,c[ha>>2]|0)|0;g[(c[E>>2]|0)+(G+(c[v>>2]|0)<<2)>>2]=-28.0;c[v>>2]=(c[v>>2]|0)+1}c[v>>2]=c[O>>2];while(1){if((c[v>>2]|0)>=(c[ha>>2]|0))break;G=R(c[u>>2]|0,c[ha>>2]|0)|0;g[(c[D>>2]|0)+(G+(c[v>>2]|0)<<2)>>2]=0.0;G=R(c[u>>2]|0,c[ha>>2]|0)|0;g[(c[F>>2]|0)+(G+(c[v>>2]|0)<<2)>>2]=-28.0;G=R(c[u>>2]|0,c[ha>>2]|0)|0;g[(c[E>>2]|0)+(G+(c[v>>2]|0)<<2)>>2]=-28.0;c[v>>2]=(c[v>>2]|0)+1}G=(c[u>>2]|0)+1|0;c[u>>2]=G}while((G|0)<2);c[(c[n>>2]|0)+36>>2]=c[(c[s>>2]|0)+28>>2];_b(B,c[q>>2]|0,c[w>>2]|0,c[K>>2]|0,c[(c[n>>2]|0)+16>>2]|0,(c[fa>>2]|0)+16|0,(c[n>>2]|0)+76|0,c[t>>2]|0);c[(c[n>>2]|0)+48>>2]=0;t=ac(c[s>>2]|0)|0;if((t|0)>(c[p>>2]<<3|0)){c[m>>2]=-3;c[ta>>2]=1}else{if(hc(c[s>>2]|0)|0)c[(c[n>>2]|0)+40>>2]=1;c[m>>2]=(c[r>>2]|0)/(c[(c[n>>2]|0)+16>>2]|0)|0;c[ta>>2]=1}ga(c[ma>>2]|0);ua=c[m>>2]|0;l=k;return ua|0}function Zb(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,ra=0,sa=0,ta=0;f=l;l=l+4608|0;h=f+4604|0;i=f+4600|0;j=f+4596|0;k=f+4592|0;m=f+4588|0;n=f+4584|0;o=f+4576|0;p=f+4568|0;q=f+4560|0;r=f+4556|0;s=f+4552|0;t=f+4548|0;u=f+4544|0;v=f+4540|0;w=f+4536|0;x=f+4532|0;y=f+4528|0;z=f+4524|0;A=f+4520|0;B=f+4516|0;C=f+4512|0;D=f+4508|0;E=f+4504|0;G=f+4500|0;H=f+4496|0;I=f+4492|0;J=f+4488|0;K=f+4484|0;L=f+4480|0;M=f+4476|0;N=f+4472|0;O=f+4468|0;P=f+4464|0;Q=f+368|0;S=f+360|0;T=f+356|0;U=f+352|0;V=f+348|0;W=f+344|0;X=f+340|0;Y=f+336|0;Z=f+332|0;_=f+232|0;$=f+136|0;aa=f+128|0;ba=f+124|0;ca=f+120|0;ea=f+116|0;fa=f+112|0;ha=f+16|0;ia=f+12|0;ja=f+8|0;ka=f+4|0;la=f;c[h>>2]=a;c[i>>2]=d;c[j>>2]=e;c[n>>2]=c[(c[h>>2]|0)+8>>2];c[v>>2]=c[c[h>>2]>>2];c[w>>2]=c[(c[v>>2]|0)+8>>2];c[x>>2]=c[(c[v>>2]|0)+4>>2];c[B>>2]=c[(c[v>>2]|0)+32>>2];c[k>>2]=0;do{e=(c[h>>2]|0)+84+((R(c[k>>2]|0,2048+(c[x>>2]|0)|0)|0)<<2)|0;c[o+(c[k>>2]<<2)>>2]=e;c[p+(c[k>>2]<<2)>>2]=(c[o+(c[k>>2]<<2)>>2]|0)+8192+(0-(c[i>>2]|0)<<2);e=(c[k>>2]|0)+1|0;c[k>>2]=e}while((e|0)<(c[n>>2]|0));c[q>>2]=(c[h>>2]|0)+84+((R(2048+(c[x>>2]|0)|0,c[n>>2]|0)|0)<<2);c[r>>2]=(c[q>>2]|0)+((c[n>>2]|0)*24<<2);c[s>>2]=(c[r>>2]|0)+(c[w>>2]<<1<<2);c[t>>2]=(c[s>>2]|0)+(c[w>>2]<<1<<2);c[u>>2]=(c[t>>2]|0)+(c[w>>2]<<1<<2);c[z>>2]=c[(c[h>>2]|0)+48>>2];c[y>>2]=c[(c[h>>2]|0)+20>>2];c[A>>2]=((c[z>>2]|0)>=5?1:(c[y>>2]|0)!=0)&1;if(c[A>>2]|0){c[E>>2]=c[(c[h>>2]|0)+24>>2];if((c[E>>2]|0)<(c[(c[v>>2]|0)+12>>2]|0))ma=c[E>>2]|0;else ma=c[(c[v>>2]|0)+12>>2]|0;do if((c[y>>2]|0)<=(ma|0))if((c[E>>2]|0)<(c[(c[v>>2]|0)+12>>2]|0)){na=c[E>>2]|0;break}else{na=c[(c[v>>2]|0)+12>>2]|0;break}else na=c[y>>2]|0;while(0);c[G>>2]=na;na=R(c[n>>2]|0,c[i>>2]|0)|0;c[H>>2]=da()|0;ma=l;l=l+((1*(na<<2)|0)+15&-16)|0;if((c[z>>2]|0)>=5)c[D>>2]=c[u>>2];else{g[I>>2]=(c[z>>2]|0)==0?1.5:.5;c[k>>2]=0;do{c[m>>2]=c[y>>2];while(1){if((c[m>>2]|0)>=(c[E>>2]|0))break;u=R(c[k>>2]|0,c[w>>2]|0)|0;na=(c[r>>2]|0)+(u+(c[m>>2]|0)<<2)|0;g[na>>2]=+g[na>>2]-+g[I>>2];c[m>>2]=(c[m>>2]|0)+1}na=(c[k>>2]|0)+1|0;c[k>>2]=na}while((na|0)<(c[n>>2]|0));c[D>>2]=c[r>>2]}c[C>>2]=c[(c[h>>2]|0)+36>>2];c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[n>>2]|0))break;c[m>>2]=c[y>>2];while(1){if((c[m>>2]|0)>=(c[G>>2]|0))break;r=R(c[i>>2]|0,c[k>>2]|0)|0;c[K>>2]=r+(b[(c[B>>2]|0)+(c[m>>2]<<1)>>1]<<c[j>>2]);c[L>>2]=(b[(c[B>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0)-(b[(c[B>>2]|0)+(c[m>>2]<<1)>>1]|0)<<c[j>>2];c[J>>2]=0;while(1){if((c[J>>2]|0)>=(c[L>>2]|0))break;c[C>>2]=qa(c[C>>2]|0)|0;g[ma+((c[K>>2]|0)+(c[J>>2]|0)<<2)>>2]=+(c[C>>2]>>20|0);c[J>>2]=(c[J>>2]|0)+1}ua(ma+(c[K>>2]<<2)|0,c[L>>2]|0,1.0);c[m>>2]=(c[m>>2]|0)+1}c[k>>2]=(c[k>>2]|0)+1}c[(c[h>>2]|0)+36>>2]=c[C>>2];c[k>>2]=0;do{Le(c[o+(c[k>>2]<<2)>>2]|0,(c[o+(c[k>>2]<<2)>>2]|0)+(c[i>>2]<<2)|0,(2048-(c[i>>2]|0)+(c[x>>2]>>1)<<2)+0|0)|0;C=(c[k>>2]|0)+1|0;c[k>>2]=C}while((C|0)<(c[n>>2]|0));gc(c[v>>2]|0,ma,p,c[D>>2]|0,c[y>>2]|0,c[G>>2]|0,c[n>>2]|0,c[n>>2]|0,0,c[j>>2]|0,c[(c[h>>2]|0)+16>>2]|0,0);ga(c[H>>2]|0);oa=c[z>>2]|0;pa=oa+1|0;ra=c[h>>2]|0;sa=ra+48|0;c[sa>>2]=pa;l=f;return}g[N>>2]=1.0;if(!(c[z>>2]|0)){H=lc(o,c[n>>2]|0,c[(c[h>>2]|0)+32>>2]|0)|0;c[O>>2]=H;c[(c[h>>2]|0)+44>>2]=H}else{c[O>>2]=c[(c[h>>2]|0)+44>>2];g[N>>2]=.800000011920929}H=c[x>>2]|0;c[P>>2]=da()|0;j=l;l=l+((1*(H<<2)|0)+15&-16)|0;c[M>>2]=c[(c[v>>2]|0)+60>>2];c[k>>2]=0;do{g[U>>2]=0.0;c[V>>2]=c[o+(c[k>>2]<<2)>>2];c[m>>2]=0;while(1){if((c[m>>2]|0)>=1024)break;g[Q+(c[m>>2]<<2)>>2]=+g[(c[V>>2]|0)+(1024+(c[m>>2]|0)<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}if(!(c[z>>2]|0)){Pb(Q,_,c[M>>2]|0,c[x>>2]|0,24,1024,c[(c[h>>2]|0)+32>>2]|0)|0;g[_>>2]=+g[_>>2]*1.000100016593933;c[m>>2]=1;while(1){if((c[m>>2]|0)>24)break;v=_+(c[m>>2]<<2)|0;g[v>>2]=+g[v>>2]-+g[_+(c[m>>2]<<2)>>2]*6.400000711437315e-05*+(c[m>>2]|0)*+(c[m>>2]|0);c[m>>2]=(c[m>>2]|0)+1}Qb((c[q>>2]|0)+((c[k>>2]|0)*24<<2)|0,_,24)}c[Y>>2]=(c[O>>2]<<1|0)<1024?c[O>>2]<<1:1024;c[m>>2]=0;while(1){if((c[m>>2]|0)>=24)break;g[$+(c[m>>2]<<2)>>2]=+g[(c[V>>2]|0)+(2048-(c[Y>>2]|0)-1-(c[m>>2]|0)<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}mc(Q+4096+(0-(c[Y>>2]|0)<<2)|0,(c[q>>2]|0)+((c[k>>2]|0)*24<<2)|0,Q+4096+(0-(c[Y>>2]|0)<<2)|0,c[Y>>2]|0,24,$);g[aa>>2]=1.0;g[ba>>2]=1.0;c[ca>>2]=c[Y>>2]>>1;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[ca>>2]|0))break;g[ea>>2]=+g[Q+(1024-(c[ca>>2]|0)+(c[m>>2]|0)<<2)>>2];g[aa>>2]=+g[aa>>2]+ +g[ea>>2]*+g[ea>>2];g[ea>>2]=+g[Q+(1024-(c[ca>>2]<<1)+(c[m>>2]|0)<<2)>>2];g[ba>>2]=+g[ba>>2]+ +g[ea>>2]*+g[ea>>2];c[m>>2]=(c[m>>2]|0)+1}g[aa>>2]=+g[aa>>2]<+g[ba>>2]?+g[aa>>2]:+g[ba>>2];g[S>>2]=+F(+(+g[aa>>2]/+g[ba>>2]));Le(c[V>>2]|0,(c[V>>2]|0)+(c[i>>2]<<2)|0,(2048-(c[i>>2]|0)<<2)+0|0)|0;c[W>>2]=1024-(c[O>>2]|0);c[X>>2]=(c[i>>2]|0)+(c[x>>2]|0);g[T>>2]=+g[N>>2]*+g[S>>2];c[Z>>2]=0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[X>>2]|0))break;if((c[Z>>2]|0)>=(c[O>>2]|0)){c[Z>>2]=(c[Z>>2]|0)-(c[O>>2]|0);g[T>>2]=+g[T>>2]*+g[S>>2]}g[(c[V>>2]|0)+(2048-(c[i>>2]|0)+(c[m>>2]|0)<<2)>>2]=+g[T>>2]*+g[Q+((c[W>>2]|0)+(c[Z>>2]|0)<<2)>>2];g[fa>>2]=+g[(c[V>>2]|0)+(1024-(c[i>>2]|0)+(c[W>>2]|0)+(c[Z>>2]|0)<<2)>>2];g[U>>2]=+g[U>>2]+ +g[fa>>2]*+g[fa>>2];c[m>>2]=(c[m>>2]|0)+1;c[Z>>2]=(c[Z>>2]|0)+1}c[m>>2]=0;while(1){ta=c[V>>2]|0;if((c[m>>2]|0)>=24)break;g[ha+(c[m>>2]<<2)>>2]=+g[ta+(2048-(c[i>>2]|0)-1-(c[m>>2]|0)<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}nc(ta+8192+(0-(c[i>>2]|0)<<2)|0,(c[q>>2]|0)+((c[k>>2]|0)*24<<2)|0,(c[V>>2]|0)+8192+(0-(c[i>>2]|0)<<2)|0,c[X>>2]|0,24,ha);g[ia>>2]=0.0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[X>>2]|0))break;g[ja>>2]=+g[(c[V>>2]|0)+(2048-(c[i>>2]|0)+(c[m>>2]|0)<<2)>>2];g[ia>>2]=+g[ia>>2]+ +g[ja>>2]*+g[ja>>2];c[m>>2]=(c[m>>2]|0)+1}a:do if(+g[U>>2]>+g[ia>>2]*.20000000298023224){if(+g[U>>2]<+g[ia>>2]){g[ka>>2]=+F(+((+g[U>>2]+1.0)/(+g[ia>>2]+1.0)));c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[x>>2]|0))break;g[la>>2]=1.0-+g[(c[M>>2]|0)+(c[m>>2]<<2)>>2]*(1.0-+g[ka>>2]);g[(c[V>>2]|0)+(2048-(c[i>>2]|0)+(c[m>>2]|0)<<2)>>2]=+g[la>>2]*+g[(c[V>>2]|0)+(2048-(c[i>>2]|0)+(c[m>>2]|0)<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}c[m>>2]=c[x>>2];while(1){if((c[m>>2]|0)>=(c[X>>2]|0))break a;g[(c[V>>2]|0)+(2048-(c[i>>2]|0)+(c[m>>2]|0)<<2)>>2]=+g[ka>>2]*+g[(c[V>>2]|0)+(2048-(c[i>>2]|0)+(c[m>>2]|0)<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}}}else{c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[X>>2]|0))break a;g[(c[V>>2]|0)+(2048-(c[i>>2]|0)+(c[m>>2]|0)<<2)>>2]=0.0;c[m>>2]=(c[m>>2]|0)+1}}while(0);vb(j,(c[V>>2]|0)+8192|0,c[(c[h>>2]|0)+52>>2]|0,c[(c[h>>2]|0)+52>>2]|0,c[x>>2]|0,-+g[(c[h>>2]|0)+60>>2],-+g[(c[h>>2]|0)+60>>2],c[(c[h>>2]|0)+68>>2]|0,c[(c[h>>2]|0)+68>>2]|0,0,0);c[m>>2]=0;while(1){if((c[m>>2]|0)>=((c[x>>2]|0)/2|0|0))break;g[(c[V>>2]|0)+(2048+(c[m>>2]|0)<<2)>>2]=+g[(c[M>>2]|0)+(c[m>>2]<<2)>>2]*+g[j+((c[x>>2]|0)-1-(c[m>>2]|0)<<2)>>2]+ +g[(c[M>>2]|0)+((c[x>>2]|0)-(c[m>>2]|0)-1<<2)>>2]*+g[j+(c[m>>2]<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}v=(c[k>>2]|0)+1|0;c[k>>2]=v}while((v|0)<(c[n>>2]|0));ga(c[P>>2]|0);oa=c[z>>2]|0;pa=oa+1|0;ra=c[h>>2]|0;sa=ra+48|0;c[sa>>2]=pa;l=f;return}function _b(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0;k=l;l=l+80|0;m=k+72|0;n=k+68|0;o=k+64|0;p=k+60|0;q=k+56|0;r=k+52|0;s=k+48|0;t=k+40|0;u=k+36|0;v=k+32|0;w=k+28|0;x=k+24|0;y=k+20|0;z=k+16|0;A=k+12|0;B=k+8|0;C=k+4|0;D=k;c[m>>2]=a;c[n>>2]=b;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[s>>2]=i;c[k+44>>2]=j;c[v>>2]=0;j=c[o>>2]|0;c[x>>2]=da()|0;i=l;l=l+((1*(j<<2)|0)+15&-16)|0;g[w>>2]=+g[c[r>>2]>>2];c[u>>2]=(c[o>>2]|0)/(c[q>>2]|0)|0;c[t>>2]=0;do{g[B>>2]=+g[(c[s>>2]|0)+(c[t>>2]<<2)>>2];c[z>>2]=c[(c[m>>2]|0)+(c[t>>2]<<2)>>2];c[A>>2]=(c[n>>2]|0)+(c[t>>2]<<2);r=(c[q>>2]|0)>1;c[y>>2]=0;a:do if(r){while(1){if((c[y>>2]|0)>=(c[o>>2]|0))break;g[C>>2]=+g[(c[z>>2]|0)+(c[y>>2]<<2)>>2]+ +g[B>>2]+1.0000000031710769e-30;g[B>>2]=+g[w>>2]*+g[C>>2];g[i+(c[y>>2]<<2)>>2]=+g[C>>2];c[y>>2]=(c[y>>2]|0)+1}c[v>>2]=1}else while(1){if((c[y>>2]|0)>=(c[o>>2]|0))break a;g[D>>2]=+g[(c[z>>2]|0)+(c[y>>2]<<2)>>2]+ +g[B>>2]+1.0000000031710769e-30;g[B>>2]=+g[w>>2]*+g[D>>2];g[(c[A>>2]|0)+((R(c[y>>2]|0,c[p>>2]|0)|0)<<2)>>2]=+g[D>>2]*.000030517578125;c[y>>2]=(c[y>>2]|0)+1}while(0);g[(c[s>>2]|0)+(c[t>>2]<<2)>>2]=+g[B>>2];b:do if(c[v>>2]|0){c[y>>2]=0;while(1){if((c[y>>2]|0)>=(c[u>>2]|0))break b;E=+g[i+((R(c[y>>2]|0,c[q>>2]|0)|0)<<2)>>2]*.000030517578125;g[(c[A>>2]|0)+((R(c[y>>2]|0,c[p>>2]|0)|0)<<2)>>2]=E;c[y>>2]=(c[y>>2]|0)+1}}while(0);r=(c[t>>2]|0)+1|0;c[t>>2]=r}while((r|0)<(c[p>>2]|0));ga(c[x>>2]|0);l=k;return}function $b(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[c[f>>2]>>2]=c[g>>2];c[(c[f>>2]|0)+4>>2]=c[h>>2];c[(c[f>>2]|0)+8>>2]=0;c[(c[f>>2]|0)+12>>2]=0;c[(c[f>>2]|0)+16>>2]=0;c[(c[f>>2]|0)+20>>2]=9;c[(c[f>>2]|0)+24>>2]=0;c[(c[f>>2]|0)+28>>2]=128;h=Za(c[f>>2]|0)|0;c[(c[f>>2]|0)+40>>2]=h;c[(c[f>>2]|0)+32>>2]=(c[(c[f>>2]|0)+28>>2]|0)-1-(c[(c[f>>2]|0)+40>>2]>>1);c[(c[f>>2]|0)+44>>2]=0;Ya(c[f>>2]|0);l=e;return}function ac(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(U(c[(c[d>>2]|0)+28>>2]|0)|0))|0;l=b;return a|0}function bc(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+32|0;g=f+28|0;h=f+24|0;i=f+20|0;j=f+16|0;k=f+12|0;m=f+8|0;n=f+4|0;o=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=e;c[m>>2]=c[(c[g>>2]|0)+28>>2];c[k>>2]=c[(c[g>>2]|0)+32>>2];c[j>>2]=(c[m>>2]|0)>>>(c[i>>2]|0);c[o>>2]=-1;do{c[n>>2]=c[m>>2];i=c[j>>2]|0;e=c[h>>2]|0;b=(c[o>>2]|0)+1|0;c[o>>2]=b;c[m>>2]=R(i,d[e+b>>0]|0)|0}while((c[k>>2]|0)>>>0<(c[m>>2]|0)>>>0);c[(c[g>>2]|0)+32>>2]=(c[k>>2]|0)-(c[m>>2]|0);c[(c[g>>2]|0)+28>>2]=(c[n>>2]|0)-(c[m>>2]|0);Ya(c[g>>2]|0);l=f;return c[o>>2]|0}function cc(a,b,e,f,h,i,j,k){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0;m=l;l=l+96|0;n=m+80|0;o=m+76|0;p=m+72|0;q=m+68|0;r=m+64|0;s=m+60|0;t=m+56|0;u=m+52|0;v=m+48|0;w=m+44|0;x=m+40|0;y=m+32|0;z=m+28|0;A=m+24|0;B=m+20|0;C=m+16|0;D=m+12|0;E=m+8|0;F=m+4|0;G=m;c[n>>2]=a;c[o>>2]=b;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[s>>2]=i;c[t>>2]=j;c[u>>2]=k;c[v>>2]=24795+((c[u>>2]|0)*84|0)+((c[r>>2]|0)*42|0);c[y>>2]=0;c[y+4>>2]=0;if(c[r>>2]|0){g[z>>2]=0.0;g[A>>2]=.149993896484375}else{g[A>>2]=+g[17416+(c[u>>2]<<2)>>2];g[z>>2]=+g[17400+(c[u>>2]<<2)>>2]}c[B>>2]=c[(c[s>>2]|0)+4>>2]<<3;c[w>>2]=c[o>>2];while(1){if((c[w>>2]|0)>=(c[p>>2]|0))break;c[x>>2]=0;do{c[C>>2]=Cb(c[s>>2]|0)|0;do if(((c[B>>2]|0)-(c[C>>2]|0)|0)<15){if(((c[B>>2]|0)-(c[C>>2]|0)|0)>=2){c[D>>2]=bc(c[s>>2]|0,25131,2)|0;c[D>>2]=c[D>>2]>>1^0-(c[D>>2]&1);break}if(((c[B>>2]|0)-(c[C>>2]|0)|0)>=1){c[D>>2]=0-(Va(c[s>>2]|0,1)|0);break}else{c[D>>2]=-1;break}}else{c[G>>2]=((c[w>>2]|0)<20?c[w>>2]|0:20)<<1;c[D>>2]=jc(c[s>>2]|0,(d[(c[v>>2]|0)+(c[G>>2]|0)>>0]|0)<<7,(d[(c[v>>2]|0)+((c[G>>2]|0)+1)>>0]|0)<<6)|0}while(0);g[E>>2]=+(c[D>>2]|0);if(-9.0>+g[(c[q>>2]|0)+((c[w>>2]|0)+(R(c[x>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)<<2)>>2])H=-9.0;else H=+g[(c[q>>2]|0)+((c[w>>2]|0)+(R(c[x>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)<<2)>>2];g[(c[q>>2]|0)+((c[w>>2]|0)+(R(c[x>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)<<2)>>2]=H;I=+g[z>>2]*+g[(c[q>>2]|0)+((c[w>>2]|0)+(R(c[x>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)<<2)>>2];g[F>>2]=I+ +g[y+(c[x>>2]<<2)>>2]+ +g[E>>2];g[(c[q>>2]|0)+((c[w>>2]|0)+(R(c[x>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)<<2)>>2]=+g[F>>2];g[y+(c[x>>2]<<2)>>2]=+g[y+(c[x>>2]<<2)>>2]+ +g[E>>2]-+g[A>>2]*+g[E>>2];o=(c[x>>2]|0)+1|0;c[x>>2]=o}while((o|0)<(c[t>>2]|0));c[w>>2]=(c[w>>2]|0)+1}l=m;return}function dc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;i=l;l=l+64|0;j=i+52|0;k=i+48|0;m=i+44|0;n=i+40|0;o=i+36|0;p=i+32|0;q=i+28|0;r=i+24|0;s=i+20|0;t=i+16|0;u=i+12|0;v=i+8|0;w=i+4|0;x=i;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[p>>2]=h;c[w>>2]=c[(c[p>>2]|0)+4>>2]<<3;c[x>>2]=ac(c[p>>2]|0)|0;c[v>>2]=c[m>>2]|0?2:4;if((c[o>>2]|0)>0)y=((c[x>>2]|0)+(c[v>>2]|0)+1|0)>>>0<=(c[w>>2]|0)>>>0;else y=0;c[t>>2]=y&1;c[w>>2]=(c[w>>2]|0)-(c[t>>2]|0);c[r>>2]=0;c[u>>2]=0;c[q>>2]=c[j>>2];while(1){if((c[q>>2]|0)>=(c[k>>2]|0))break;if(((c[x>>2]|0)+(c[v>>2]|0)|0)>>>0<=(c[w>>2]|0)>>>0){y=Va(c[p>>2]|0,c[v>>2]|0)|0;c[r>>2]=c[r>>2]^y;c[x>>2]=ac(c[p>>2]|0)|0;c[u>>2]=c[u>>2]|c[r>>2]}c[(c[n>>2]|0)+(c[q>>2]<<2)>>2]=c[r>>2];c[v>>2]=c[m>>2]|0?4:5;c[q>>2]=(c[q>>2]|0)+1}c[s>>2]=0;if(c[t>>2]|0?(a[20526+(c[o>>2]<<3)+((c[m>>2]<<2)+0+(c[u>>2]|0))>>0]|0)!=(a[20526+(c[o>>2]<<3)+((c[m>>2]<<2)+2+(c[u>>2]|0))>>0]|0):0)c[s>>2]=Va(c[p>>2]|0,1)|0;c[q>>2]=c[j>>2];while(1){if((c[q>>2]|0)>=(c[k>>2]|0))break;c[(c[n>>2]|0)+(c[q>>2]<<2)>>2]=a[20526+(c[o>>2]<<3)+((c[m>>2]<<2)+(c[s>>2]<<1)+(c[(c[n>>2]|0)+(c[q>>2]<<2)>>2]|0))>>0];c[q>>2]=(c[q>>2]|0)+1}l=i;return}function ec(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=l;l=l+48|0;k=j+40|0;m=j+36|0;n=j+32|0;o=j+28|0;p=j+24|0;q=j+20|0;r=j+16|0;s=j+12|0;t=j+8|0;u=j+4|0;v=j;c[k>>2]=a;c[m>>2]=b;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=h;c[r>>2]=i;c[s>>2]=c[m>>2];while(1){if((c[s>>2]|0)>=(c[n>>2]|0))break;if((c[(c[p>>2]|0)+(c[s>>2]<<2)>>2]|0)>0){c[t>>2]=0;do{c[u>>2]=Fa(c[q>>2]|0,c[(c[p>>2]|0)+(c[s>>2]<<2)>>2]|0)|0;g[v>>2]=(+(c[u>>2]|0)+.5)*+(1<<14-(c[(c[p>>2]|0)+(c[s>>2]<<2)>>2]|0)|0)*.00006103515625-.5;m=(c[o>>2]|0)+((c[s>>2]|0)+(R(c[t>>2]|0,c[(c[k>>2]|0)+8>>2]|0)|0)<<2)|0;g[m>>2]=+g[m>>2]+ +g[v>>2];m=(c[t>>2]|0)+1|0;c[t>>2]=m}while((m|0)<(c[r>>2]|0))}c[s>>2]=(c[s>>2]|0)+1}l=j;return}function fc(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;m=l;l=l+64|0;n=m+52|0;o=m+48|0;p=m+44|0;q=m+40|0;r=m+36|0;s=m+32|0;t=m+28|0;u=m+24|0;v=m+20|0;w=m+16|0;x=m+12|0;y=m+8|0;z=m+4|0;A=m;c[n>>2]=a;c[o>>2]=b;c[p>>2]=d;c[q>>2]=e;c[r>>2]=f;c[s>>2]=h;c[t>>2]=i;c[u>>2]=j;c[v>>2]=k;c[x>>2]=0;while(1){if((c[x>>2]|0)>=2)break;c[w>>2]=c[o>>2];while(1){if((c[w>>2]|0)>=(c[p>>2]|0))break;if((c[t>>2]|0)<(c[v>>2]|0))break;if((c[(c[r>>2]|0)+(c[w>>2]<<2)>>2]|0)<8?(c[(c[s>>2]|0)+(c[w>>2]<<2)>>2]|0)==(c[x>>2]|0):0){c[y>>2]=0;do{c[z>>2]=Fa(c[u>>2]|0,1)|0;g[A>>2]=(+(c[z>>2]|0)-.5)*+(1<<14-(c[(c[r>>2]|0)+(c[w>>2]<<2)>>2]|0)-1|0)*.00006103515625;k=(c[q>>2]|0)+((c[w>>2]|0)+(R(c[y>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)<<2)|0;g[k>>2]=+g[k>>2]+ +g[A>>2];c[t>>2]=(c[t>>2]|0)+-1;k=(c[y>>2]|0)+1|0;c[y>>2]=k}while((k|0)<(c[v>>2]|0))}c[w>>2]=(c[w>>2]|0)+1}c[x>>2]=(c[x>>2]|0)+1}l=m;return}function gc(a,b,d,e,f,h,i,j,k,m,n,o){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;p=l;l=l+112|0;q=p+96|0;r=p+92|0;s=p+88|0;t=p+84|0;u=p+80|0;v=p+76|0;w=p+72|0;x=p+68|0;y=p+64|0;z=p+60|0;A=p+56|0;B=p+52|0;C=p+48|0;D=p+44|0;E=p+40|0;F=p+36|0;G=p+32|0;H=p+28|0;I=p+24|0;J=p+20|0;K=p+16|0;L=p+12|0;M=p+8|0;N=p+4|0;O=p;c[q>>2]=a;c[r>>2]=b;c[s>>2]=d;c[t>>2]=e;c[u>>2]=f;c[v>>2]=h;c[w>>2]=i;c[x>>2]=j;c[y>>2]=k;c[z>>2]=m;c[A>>2]=n;c[B>>2]=o;c[L>>2]=c[(c[q>>2]|0)+4>>2];c[K>>2]=c[(c[q>>2]|0)+8>>2];c[H>>2]=c[(c[q>>2]|0)+44>>2]<<c[z>>2];o=c[H>>2]|0;c[M>>2]=da()|0;n=l;l=l+((1*(o<<2)|0)+15&-16)|0;c[E>>2]=1<<c[z>>2];if(c[y>>2]|0){c[G>>2]=c[E>>2];c[I>>2]=c[(c[q>>2]|0)+44>>2];c[J>>2]=c[(c[q>>2]|0)+36>>2]}else{c[G>>2]=1;c[I>>2]=c[(c[q>>2]|0)+44>>2]<<c[z>>2];c[J>>2]=(c[(c[q>>2]|0)+36>>2]|0)-(c[z>>2]|0)}if((c[x>>2]|0)==2&(c[w>>2]|0)==1){ra(c[q>>2]|0,c[r>>2]|0,n,c[t>>2]|0,c[u>>2]|0,c[v>>2]|0,c[E>>2]|0,c[A>>2]|0,c[B>>2]|0);c[N>>2]=(c[(c[s>>2]|0)+4>>2]|0)+(((c[L>>2]|0)/2|0)<<2);Ie(c[N>>2]|0,n|0,(c[H>>2]<<2)+0|0)|0;c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[G>>2]|0))break;z=(c[c[s>>2]>>2]|0)+((R(c[I>>2]|0,c[F>>2]|0)|0)<<2)|0;ic((c[q>>2]|0)+64|0,(c[N>>2]|0)+(c[F>>2]<<2)|0,z,c[(c[q>>2]|0)+60>>2]|0,c[L>>2]|0,c[J>>2]|0,c[G>>2]|0);c[F>>2]=(c[F>>2]|0)+1}c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[G>>2]|0))break;N=(c[(c[s>>2]|0)+4>>2]|0)+((R(c[I>>2]|0,c[F>>2]|0)|0)<<2)|0;ic((c[q>>2]|0)+64|0,n+(c[F>>2]<<2)|0,N,c[(c[q>>2]|0)+60>>2]|0,c[L>>2]|0,c[J>>2]|0,c[G>>2]|0);c[F>>2]=(c[F>>2]|0)+1}P=c[M>>2]|0;ga(P|0);l=p;return}if(!((c[x>>2]|0)==1&(c[w>>2]|0)==2)){c[C>>2]=0;do{w=(c[r>>2]|0)+((R(c[C>>2]|0,c[H>>2]|0)|0)<<2)|0;N=(c[t>>2]|0)+((R(c[C>>2]|0,c[K>>2]|0)|0)<<2)|0;ra(c[q>>2]|0,w,n,N,c[u>>2]|0,c[v>>2]|0,c[E>>2]|0,c[A>>2]|0,c[B>>2]|0);c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[G>>2]|0))break;N=(c[(c[s>>2]|0)+(c[C>>2]<<2)>>2]|0)+((R(c[I>>2]|0,c[F>>2]|0)|0)<<2)|0;ic((c[q>>2]|0)+64|0,n+(c[F>>2]<<2)|0,N,c[(c[q>>2]|0)+60>>2]|0,c[L>>2]|0,c[J>>2]|0,c[G>>2]|0);c[F>>2]=(c[F>>2]|0)+1}N=(c[C>>2]|0)+1|0;c[C>>2]=N}while((N|0)<(c[x>>2]|0));P=c[M>>2]|0;ga(P|0);l=p;return}c[O>>2]=(c[c[s>>2]>>2]|0)+(((c[L>>2]|0)/2|0)<<2);ra(c[q>>2]|0,c[r>>2]|0,n,c[t>>2]|0,c[u>>2]|0,c[v>>2]|0,c[E>>2]|0,c[A>>2]|0,c[B>>2]|0);ra(c[q>>2]|0,(c[r>>2]|0)+(c[H>>2]<<2)|0,c[O>>2]|0,(c[t>>2]|0)+(c[K>>2]<<2)|0,c[u>>2]|0,c[v>>2]|0,c[E>>2]|0,c[A>>2]|0,c[B>>2]|0);c[D>>2]=0;while(1){if((c[D>>2]|0)>=(c[H>>2]|0))break;g[n+(c[D>>2]<<2)>>2]=(+g[n+(c[D>>2]<<2)>>2]+ +g[(c[O>>2]|0)+(c[D>>2]<<2)>>2])*.5;c[D>>2]=(c[D>>2]|0)+1}c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[G>>2]|0))break;D=(c[c[s>>2]>>2]|0)+((R(c[I>>2]|0,c[F>>2]|0)|0)<<2)|0;ic((c[q>>2]|0)+64|0,n+(c[F>>2]<<2)|0,D,c[(c[q>>2]|0)+60>>2]|0,c[L>>2]|0,c[J>>2]|0,c[G>>2]|0);c[F>>2]=(c[F>>2]|0)+1}P=c[M>>2]|0;ga(P|0);l=p;return}function hc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;l=b;return c[(c[d>>2]|0)+44>>2]|0}function ic(a,d,e,f,h,i,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0.0;k=l;l=l+144|0;m=k+136|0;n=k+132|0;o=k+128|0;p=k+124|0;q=k+120|0;r=k+116|0;s=k+112|0;t=k+108|0;u=k+104|0;v=k+100|0;w=k+96|0;x=k+92|0;y=k+88|0;z=k+84|0;A=k+80|0;B=k+76|0;C=k+72|0;D=k+68|0;E=k+64|0;F=k+60|0;G=k+56|0;H=k+52|0;I=k+48|0;J=k+44|0;K=k+40|0;L=k+36|0;M=k+32|0;N=k+28|0;O=k+24|0;P=k+20|0;Q=k+16|0;S=k+12|0;T=k+8|0;U=k+4|0;V=k;c[m>>2]=a;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=h;c[r>>2]=i;c[s>>2]=j;c[u>>2]=c[c[m>>2]>>2];c[x>>2]=c[(c[m>>2]|0)+24>>2];c[t>>2]=0;while(1){W=c[u>>2]>>1;if((c[t>>2]|0)>=(c[r>>2]|0))break;c[u>>2]=W;c[x>>2]=(c[x>>2]|0)+(c[u>>2]<<2);c[t>>2]=(c[t>>2]|0)+1}c[v>>2]=W;c[w>>2]=c[u>>2]>>2;c[y>>2]=c[n>>2];c[z>>2]=(c[n>>2]|0)+((R(c[s>>2]|0,(c[v>>2]|0)-1|0)|0)<<2);c[A>>2]=(c[o>>2]|0)+(c[q>>2]>>1<<2);c[B>>2]=c[x>>2];c[C>>2]=c[(c[(c[m>>2]|0)+8+(c[r>>2]<<2)>>2]|0)+44>>2];c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[w>>2]|0))break;n=c[C>>2]|0;c[C>>2]=n+2;c[D>>2]=b[n>>1];g[E>>2]=+g[c[z>>2]>>2]*+g[(c[B>>2]|0)+(c[t>>2]<<2)>>2]+ +g[c[y>>2]>>2]*+g[(c[B>>2]|0)+((c[w>>2]|0)+(c[t>>2]|0)<<2)>>2];g[F>>2]=+g[c[y>>2]>>2]*+g[(c[B>>2]|0)+(c[t>>2]<<2)>>2]-+g[c[z>>2]>>2]*+g[(c[B>>2]|0)+((c[w>>2]|0)+(c[t>>2]|0)<<2)>>2];g[(c[A>>2]|0)+((c[D>>2]<<1)+1<<2)>>2]=+g[E>>2];g[(c[A>>2]|0)+(c[D>>2]<<1<<2)>>2]=+g[F>>2];c[y>>2]=(c[y>>2]|0)+(c[s>>2]<<1<<2);c[z>>2]=(c[z>>2]|0)+(0-(c[s>>2]<<1)<<2);c[t>>2]=(c[t>>2]|0)+1}Eb(c[(c[m>>2]|0)+8+(c[r>>2]<<2)>>2]|0,(c[o>>2]|0)+(c[q>>2]>>1<<2)|0);c[G>>2]=(c[o>>2]|0)+(c[q>>2]>>1<<2);c[H>>2]=(c[o>>2]|0)+(c[q>>2]>>1<<2)+(c[v>>2]<<2)+-8;c[I>>2]=c[x>>2];c[t>>2]=0;while(1){if((c[t>>2]|0)>=((c[w>>2]|0)+1>>1|0))break;g[J>>2]=+g[(c[G>>2]|0)+4>>2];g[K>>2]=+g[c[G>>2]>>2];g[N>>2]=+g[(c[I>>2]|0)+(c[t>>2]<<2)>>2];g[O>>2]=+g[(c[I>>2]|0)+((c[w>>2]|0)+(c[t>>2]|0)<<2)>>2];g[L>>2]=+g[J>>2]*+g[N>>2]+ +g[K>>2]*+g[O>>2];g[M>>2]=+g[J>>2]*+g[O>>2]-+g[K>>2]*+g[N>>2];g[J>>2]=+g[(c[H>>2]|0)+4>>2];g[K>>2]=+g[c[H>>2]>>2];g[c[G>>2]>>2]=+g[L>>2];g[(c[H>>2]|0)+4>>2]=+g[M>>2];g[N>>2]=+g[(c[I>>2]|0)+((c[w>>2]|0)-(c[t>>2]|0)-1<<2)>>2];g[O>>2]=+g[(c[I>>2]|0)+((c[v>>2]|0)-(c[t>>2]|0)-1<<2)>>2];g[L>>2]=+g[J>>2]*+g[N>>2]+ +g[K>>2]*+g[O>>2];g[M>>2]=+g[J>>2]*+g[O>>2]-+g[K>>2]*+g[N>>2];g[c[H>>2]>>2]=+g[L>>2];g[(c[G>>2]|0)+4>>2]=+g[M>>2];c[G>>2]=(c[G>>2]|0)+8;c[H>>2]=(c[H>>2]|0)+-8;c[t>>2]=(c[t>>2]|0)+1}c[P>>2]=(c[o>>2]|0)+(c[q>>2]<<2)+-4;c[Q>>2]=c[o>>2];c[S>>2]=c[p>>2];c[T>>2]=(c[p>>2]|0)+(c[q>>2]<<2)+-4;c[t>>2]=0;while(1){if((c[t>>2]|0)>=((c[q>>2]|0)/2|0|0))break;g[U>>2]=+g[c[P>>2]>>2];g[V>>2]=+g[c[Q>>2]>>2];X=+g[c[T>>2]>>2]*+g[V>>2]-+g[c[S>>2]>>2]*+g[U>>2];p=c[Q>>2]|0;c[Q>>2]=p+4;g[p>>2]=X;X=+g[c[S>>2]>>2]*+g[V>>2]+ +g[c[T>>2]>>2]*+g[U>>2];p=c[P>>2]|0;c[P>>2]=p+-4;g[p>>2]=X;c[S>>2]=(c[S>>2]|0)+4;c[T>>2]=(c[T>>2]|0)+-4;c[t>>2]=(c[t>>2]|0)+1}l=k;return}function jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;e=l;l=l+32|0;f=e+24|0;g=e+20|0;h=e+16|0;i=e+12|0;j=e+8|0;k=e+4|0;m=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[i>>2]=0;c[k>>2]=kc(c[f>>2]|0,15)|0;c[j>>2]=0;do if((c[k>>2]|0)>>>0>=(c[g>>2]|0)>>>0){c[i>>2]=(c[i>>2]|0)+1;c[j>>2]=c[g>>2];c[g>>2]=(Db(c[g>>2]|0,c[h>>2]|0)|0)+1;while(1){if((c[g>>2]|0)>>>0>1)n=(c[k>>2]|0)>>>0>=((c[j>>2]|0)+(c[g>>2]<<1)|0)>>>0;else n=0;o=c[g>>2]|0;if(!n)break;c[g>>2]=o<<1;c[j>>2]=(c[j>>2]|0)+(c[g>>2]|0);c[g>>2]=(R((c[g>>2]|0)-2|0,c[h>>2]|0)|0)>>>15;c[g>>2]=(c[g>>2]|0)+1;c[i>>2]=(c[i>>2]|0)+1}if(o>>>0<=1){c[m>>2]=((c[k>>2]|0)-(c[j>>2]|0)|0)>>>1;c[i>>2]=(c[i>>2]|0)+(c[m>>2]|0);c[j>>2]=(c[j>>2]|0)+(c[m>>2]<<1)}if((c[k>>2]|0)>>>0<((c[j>>2]|0)+(c[g>>2]|0)|0)>>>0){c[i>>2]=0-(c[i>>2]|0);break}else{c[j>>2]=(c[j>>2]|0)+(c[g>>2]|0);break}}while(0);k=c[f>>2]|0;f=c[j>>2]|0;if(((c[j>>2]|0)+(c[g>>2]|0)|0)>>>0>=32768){p=32768;Oa(k,f,p,32768);q=c[i>>2]|0;l=e;return q|0}p=(c[j>>2]|0)+(c[g>>2]|0)|0;Oa(k,f,p,32768);q=c[i>>2]|0;l=e;return q|0}function kc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[e>>2]=a;c[f>>2]=b;c[(c[e>>2]|0)+36>>2]=(c[(c[e>>2]|0)+28>>2]|0)>>>(c[f>>2]|0);c[g>>2]=((c[(c[e>>2]|0)+32>>2]|0)>>>0)/((c[(c[e>>2]|0)+36>>2]|0)>>>0)|0;l=d;return (1<<c[f>>2])-((c[g>>2]|0)+1+((1<<c[f>>2])-((c[g>>2]|0)+1)&0-(1<<c[f>>2]>>>0<((c[g>>2]|0)+1|0)>>>0&1)))|0}function lc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+4112|0;f=e+4108|0;g=e+4104|0;h=e+4100|0;i=e+4096|0;j=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;Jb(c[f>>2]|0,j,2048,c[g>>2]|0,c[h>>2]|0);Kb(j+1440|0,j,1328,620,i,c[h>>2]|0);c[i>>2]=720-(c[i>>2]|0);l=e;return c[i>>2]|0}function mc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;i=l;l=l+64|0;j=i+56|0;k=i+52|0;m=i+48|0;n=i+44|0;o=i+40|0;p=i+36|0;q=i+32|0;r=i+28|0;s=i+24|0;t=i+8|0;u=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;h=c[o>>2]|0;c[s>>2]=da()|0;f=l;l=l+((1*(h<<2)|0)+15&-16)|0;h=l;l=l+((1*((c[n>>2]|0)+(c[o>>2]|0)<<2)|0)+15&-16)|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;g[f+(c[q>>2]<<2)>>2]=+g[(c[k>>2]|0)+((c[o>>2]|0)-(c[q>>2]|0)-1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;g[h+(c[q>>2]<<2)>>2]=+g[(c[p>>2]|0)+((c[o>>2]|0)-(c[q>>2]|0)-1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;g[h+((c[q>>2]|0)+(c[o>>2]|0)<<2)>>2]=+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;g[(c[p>>2]|0)+(c[q>>2]<<2)>>2]=+g[(c[j>>2]|0)+((c[n>>2]|0)-(c[q>>2]|0)-1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=((c[n>>2]|0)-3|0))break;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;oc(f,h+(c[q>>2]<<2)|0,t,c[o>>2]|0);g[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2]+ +g[t>>2];g[(c[m>>2]|0)+((c[q>>2]|0)+1<<2)>>2]=+g[(c[j>>2]|0)+((c[q>>2]|0)+1<<2)>>2]+ +g[t+4>>2];g[(c[m>>2]|0)+((c[q>>2]|0)+2<<2)>>2]=+g[(c[j>>2]|0)+((c[q>>2]|0)+2<<2)>>2]+ +g[t+8>>2];g[(c[m>>2]|0)+((c[q>>2]|0)+3<<2)>>2]=+g[(c[j>>2]|0)+((c[q>>2]|0)+3<<2)>>2]+ +g[t+12>>2];c[q>>2]=(c[q>>2]|0)+4}while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;g[u>>2]=0.0;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[u>>2]=+g[u>>2]+ +g[f+(c[r>>2]<<2)>>2]*+g[h+((c[q>>2]|0)+(c[r>>2]|0)<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}g[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2]+ +g[u>>2];c[q>>2]=(c[q>>2]|0)+1}ga(c[s>>2]|0);l=i;return}function nc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;i=l;l=l+64|0;j=i+56|0;k=i+52|0;m=i+48|0;n=i+44|0;o=i+40|0;p=i+36|0;q=i+32|0;r=i+28|0;s=i+24|0;t=i+8|0;u=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;h=c[o>>2]|0;c[s>>2]=da()|0;f=l;l=l+((1*(h<<2)|0)+15&-16)|0;h=l;l=l+((1*((c[n>>2]|0)+(c[o>>2]|0)<<2)|0)+15&-16)|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;g[f+(c[q>>2]<<2)>>2]=+g[(c[k>>2]|0)+((c[o>>2]|0)-(c[q>>2]|0)-1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;g[h+(c[q>>2]<<2)>>2]=-+g[(c[p>>2]|0)+((c[o>>2]|0)-(c[q>>2]|0)-1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}while(1){if((c[q>>2]|0)>=((c[n>>2]|0)+(c[o>>2]|0)|0))break;g[h+(c[q>>2]<<2)>>2]=0.0;c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=((c[n>>2]|0)-3|0))break;g[t>>2]=+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2];g[t+4>>2]=+g[(c[j>>2]|0)+((c[q>>2]|0)+1<<2)>>2];g[t+8>>2]=+g[(c[j>>2]|0)+((c[q>>2]|0)+2<<2)>>2];g[t+12>>2]=+g[(c[j>>2]|0)+((c[q>>2]|0)+3<<2)>>2];oc(f,h+(c[q>>2]<<2)|0,t,c[o>>2]|0);g[h+((c[q>>2]|0)+(c[o>>2]|0)<<2)>>2]=-+g[t>>2];g[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=+g[t>>2];g[t+4>>2]=+g[t+4>>2]+ +g[h+((c[q>>2]|0)+(c[o>>2]|0)<<2)>>2]*+g[c[k>>2]>>2];g[h+((c[q>>2]|0)+(c[o>>2]|0)+1<<2)>>2]=-+g[t+4>>2];g[(c[m>>2]|0)+((c[q>>2]|0)+1<<2)>>2]=+g[t+4>>2];g[t+8>>2]=+g[t+8>>2]+ +g[h+((c[q>>2]|0)+(c[o>>2]|0)+1<<2)>>2]*+g[c[k>>2]>>2];g[t+8>>2]=+g[t+8>>2]+ +g[h+((c[q>>2]|0)+(c[o>>2]|0)<<2)>>2]*+g[(c[k>>2]|0)+4>>2];g[h+((c[q>>2]|0)+(c[o>>2]|0)+2<<2)>>2]=-+g[t+8>>2];g[(c[m>>2]|0)+((c[q>>2]|0)+2<<2)>>2]=+g[t+8>>2];g[t+12>>2]=+g[t+12>>2]+ +g[h+((c[q>>2]|0)+(c[o>>2]|0)+2<<2)>>2]*+g[c[k>>2]>>2];g[t+12>>2]=+g[t+12>>2]+ +g[h+((c[q>>2]|0)+(c[o>>2]|0)+1<<2)>>2]*+g[(c[k>>2]|0)+4>>2];g[t+12>>2]=+g[t+12>>2]+ +g[h+((c[q>>2]|0)+(c[o>>2]|0)<<2)>>2]*+g[(c[k>>2]|0)+8>>2];g[h+((c[q>>2]|0)+(c[o>>2]|0)+3<<2)>>2]=-+g[t+12>>2];g[(c[m>>2]|0)+((c[q>>2]|0)+3<<2)>>2]=+g[t+12>>2];c[q>>2]=(c[q>>2]|0)+4}while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;g[u>>2]=+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2];c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[u>>2]=+g[u>>2]-+g[f+(c[r>>2]<<2)>>2]*+g[h+((c[q>>2]|0)+(c[r>>2]|0)<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}g[h+((c[q>>2]|0)+(c[o>>2]|0)<<2)>>2]=+g[u>>2];g[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=+g[u>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;g[(c[p>>2]|0)+(c[q>>2]<<2)>>2]=+g[(c[m>>2]|0)+((c[n>>2]|0)-(c[q>>2]|0)-1<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}ga(c[s>>2]|0);l=i;return}function oc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+64|0;h=f+48|0;i=f+44|0;j=f+40|0;k=f+36|0;m=f+32|0;n=f+28|0;o=f+24|0;p=f+20|0;q=f+16|0;r=f+12|0;s=f+8|0;t=f+4|0;u=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;g[q>>2]=0.0;e=c[i>>2]|0;c[i>>2]=e+4;g[n>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[o>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[p>>2]=+g[e>>2];c[m>>2]=0;while(1){if((c[m>>2]|0)>=((c[k>>2]|0)-3|0))break;e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[q>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[n>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[o>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[p>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[q>>2];e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[n>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[o>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[p>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[n>>2];e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[o>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[p>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[q>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[n>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[o>>2];e=c[h>>2]|0;c[h>>2]=e+4;g[r>>2]=+g[e>>2];e=c[i>>2]|0;c[i>>2]=e+4;g[p>>2]=+g[e>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[r>>2]*+g[q>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[r>>2]*+g[n>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[r>>2]*+g[o>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[r>>2]*+g[p>>2];c[m>>2]=(c[m>>2]|0)+4}r=c[m>>2]|0;c[m>>2]=r+1;if((r|0)<(c[k>>2]|0)){r=c[h>>2]|0;c[h>>2]=r+4;g[s>>2]=+g[r>>2];r=c[i>>2]|0;c[i>>2]=r+4;g[q>>2]=+g[r>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[s>>2]*+g[n>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[s>>2]*+g[o>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[s>>2]*+g[p>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[s>>2]*+g[q>>2]}s=c[m>>2]|0;c[m>>2]=s+1;if((s|0)<(c[k>>2]|0)){s=c[h>>2]|0;c[h>>2]=s+4;g[t>>2]=+g[s>>2];s=c[i>>2]|0;c[i>>2]=s+4;g[n>>2]=+g[s>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[t>>2]*+g[o>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[t>>2]*+g[p>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[t>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[t>>2]*+g[n>>2]}if((c[m>>2]|0)>=(c[k>>2]|0)){l=f;return}k=c[h>>2]|0;c[h>>2]=k+4;g[u>>2]=+g[k>>2];k=c[i>>2]|0;c[i>>2]=k+4;g[o>>2]=+g[k>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[u>>2]*+g[p>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[u>>2]*+g[q>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[u>>2]*+g[n>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[u>>2]*+g[o>>2];l=f;return}function pc(a){a=a|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[e>>2]=a;c[g>>2]=32767/((c[(c[e>>2]|0)+2340>>2]|0)+1|0)|0;c[h>>2]=0;c[f>>2]=0;while(1){if((c[f>>2]|0)>=(c[(c[e>>2]|0)+2340>>2]|0))break;c[h>>2]=(c[h>>2]|0)+(c[g>>2]|0);b[(c[e>>2]|0)+2772+1280+(c[f>>2]<<1)>>1]=c[h>>2];c[f>>2]=(c[f>>2]|0)+1}c[(c[e>>2]|0)+2772+1376>>2]=0;c[(c[e>>2]|0)+2772+1380>>2]=3176576;l=d;return}function qc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=l;l=l+80|0;h=g+36|0;i=g+32|0;j=g+28|0;k=g+24|0;m=g+20|0;n=g+16|0;o=g+12|0;p=g+8|0;q=g+40|0;r=g+4|0;s=g;c[h>>2]=a;c[i>>2]=d;c[j>>2]=e;c[k>>2]=f;c[r>>2]=(c[h>>2]|0)+2772;if((c[(c[h>>2]|0)+2316>>2]|0)!=(c[(c[r>>2]|0)+1384>>2]|0)){pc(c[h>>2]|0);c[(c[r>>2]|0)+1384>>2]=c[(c[h>>2]|0)+2316>>2]}a:do if((c[(c[h>>2]|0)+4160>>2]|0)==0?(c[(c[h>>2]|0)+4164>>2]|0)==0:0){c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[(c[h>>2]|0)+2340>>2]|0))break;f=(c[r>>2]|0)+1280+(c[m>>2]<<1)|0;b[f>>1]=(b[f>>1]|0)+((((b[(c[h>>2]|0)+2344+(c[m>>2]<<1)>>1]|0)-(b[(c[r>>2]|0)+1280+(c[m>>2]<<1)>>1]|0)>>16)*16348|0)+(((b[(c[h>>2]|0)+2344+(c[m>>2]<<1)>>1]|0)-(b[(c[r>>2]|0)+1280+(c[m>>2]<<1)>>1]|0)&65535)*16348>>16));c[m>>2]=(c[m>>2]|0)+1}c[p>>2]=0;c[n>>2]=0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[(c[h>>2]|0)+2324>>2]|0))break;if((c[(c[i>>2]|0)+16+(c[m>>2]<<2)>>2]|0)>(c[p>>2]|0)){c[p>>2]=c[(c[i>>2]|0)+16+(c[m>>2]<<2)>>2];c[n>>2]=c[m>>2]}c[m>>2]=(c[m>>2]|0)+1}Le((c[r>>2]|0)+(c[(c[h>>2]|0)+2332>>2]<<2)|0,c[r>>2]|0,(R((c[(c[h>>2]|0)+2324>>2]|0)-1|0,c[(c[h>>2]|0)+2332>>2]|0)|0)<<2|0)|0;f=(c[h>>2]|0)+4+((R(c[n>>2]|0,c[(c[h>>2]|0)+2332>>2]|0)|0)<<2)|0;Ie(c[r>>2]|0,f|0,c[(c[h>>2]|0)+2332>>2]<<2|0)|0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[(c[h>>2]|0)+2324>>2]|0))break a;f=(c[r>>2]|0)+1376|0;c[f>>2]=(c[f>>2]|0)+((((c[(c[i>>2]|0)+16+(c[m>>2]<<2)>>2]|0)-(c[(c[r>>2]|0)+1376>>2]|0)>>16)*4634|0)+(((c[(c[i>>2]|0)+16+(c[m>>2]<<2)>>2]|0)-(c[(c[r>>2]|0)+1376>>2]|0)&65535)*4634>>16));c[m>>2]=(c[m>>2]|0)+1}}while(0);if(!(c[(c[h>>2]|0)+4160>>2]|0)){He((c[r>>2]|0)+1312|0,0,c[(c[h>>2]|0)+2340>>2]<<2|0)|0;l=g;return}i=(c[k>>2]|0)+16|0;c[s>>2]=da()|0;n=l;l=l+((1*(i<<2)|0)+15&-16)|0;rc(n+64|0,c[r>>2]|0,c[(c[r>>2]|0)+1376>>2]|0,c[k>>2]|0,(c[r>>2]|0)+1380|0);sc(q,(c[r>>2]|0)+1280|0,c[(c[h>>2]|0)+2340>>2]|0);i=n;p=(c[r>>2]|0)+1312|0;f=i+64|0;do{c[i>>2]=c[p>>2];i=i+4|0;p=p+4|0}while((i|0)<(f|0));c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[o>>2]=c[(c[h>>2]|0)+2340>>2]>>1;e=R(c[n+(16+(c[m>>2]|0)-1<<2)>>2]>>16,b[q>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-1<<2)>>2]&65535,b[q>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-2<<2)>>2]>>16,b[q+2>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-2<<2)>>2]&65535,b[q+2>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-3<<2)>>2]>>16,b[q+4>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-3<<2)>>2]&65535,b[q+4>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-4<<2)>>2]>>16,b[q+6>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-4<<2)>>2]&65535,b[q+6>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-5<<2)>>2]>>16,b[q+8>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-5<<2)>>2]&65535,b[q+8>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-6<<2)>>2]>>16,b[q+10>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-6<<2)>>2]&65535,b[q+10>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-7<<2)>>2]>>16,b[q+12>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-7<<2)>>2]&65535,b[q+12>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-8<<2)>>2]>>16,b[q+14>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-8<<2)>>2]&65535,b[q+14>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-9<<2)>>2]>>16,b[q+16>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-9<<2)>>2]&65535,b[q+16>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-10<<2)>>2]>>16,b[q+18>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-10<<2)>>2]&65535,b[q+18>>1]|0)|0)>>16));if((c[(c[h>>2]|0)+2340>>2]|0)==16){e=R(c[n+(16+(c[m>>2]|0)-11<<2)>>2]>>16,b[q+20>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-11<<2)>>2]&65535,b[q+20>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-12<<2)>>2]>>16,b[q+22>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-12<<2)>>2]&65535,b[q+22>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-13<<2)>>2]>>16,b[q+24>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-13<<2)>>2]&65535,b[q+24>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-14<<2)>>2]>>16,b[q+26>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-14<<2)>>2]&65535,b[q+26>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-15<<2)>>2]>>16,b[q+28>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-15<<2)>>2]&65535,b[q+28>>1]|0)|0)>>16));e=R(c[n+(16+(c[m>>2]|0)-16<<2)>>2]>>16,b[q+30>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(e+((R(c[n+(16+(c[m>>2]|0)-16<<2)>>2]&65535,b[q+30>>1]|0)|0)>>16))}c[n+(16+(c[m>>2]|0)<<2)>>2]=(c[n+(16+(c[m>>2]|0)<<2)>>2]|0)+(c[o>>2]<<4);if(((b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0)+((c[o>>2]>>5)+1>>1)|0)<=32767)if(((b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0)+((c[o>>2]>>5)+1>>1)|0)<-32768)t=-32768;else t=(b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0)+((c[o>>2]>>5)+1>>1)|0;else t=32767;b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]=t;c[m>>2]=(c[m>>2]|0)+1}i=(c[r>>2]|0)+1312|0;p=n+(c[k>>2]<<2)|0;f=i+64|0;do{c[i>>2]=c[p>>2];i=i+4|0;p=p+4|0}while((i|0)<(f|0));ga(c[s>>2]|0);l=g;return}function rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=l;l=l+48|0;h=g+32|0;i=g+28|0;j=g+24|0;k=g+20|0;m=g+16|0;n=g+12|0;o=g+8|0;p=g+4|0;q=g;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[q>>2]=255;while(1){if((c[q>>2]|0)<=(c[k>>2]|0))break;c[q>>2]=c[q>>2]>>1}c[n>>2]=c[c[m>>2]>>2];c[o>>2]=0;while(1){r=c[n>>2]|0;if((c[o>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=907633515+(R(r,196314165)|0);c[p>>2]=c[n>>2]>>24&c[q>>2];f=R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]>>16,(c[j>>2]>>4&65535)<<16>>16)|0;e=f+((R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]&65535,(c[j>>2]>>4&65535)<<16>>16)|0)>>16)|0;if((e+(R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]|0,(c[j>>2]>>4>>15)+1>>1)|0)|0)<=32767){e=R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]>>16,(c[j>>2]>>4&65535)<<16>>16)|0;f=e+((R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]&65535,(c[j>>2]>>4&65535)<<16>>16)|0)>>16)|0;if((f+(R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]|0,(c[j>>2]>>4>>15)+1>>1)|0)|0)<-32768)s=-32768;else{f=R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]>>16,(c[j>>2]>>4&65535)<<16>>16)|0;e=f+((R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]&65535,(c[j>>2]>>4&65535)<<16>>16)|0)>>16)|0;s=e+(R(c[(c[i>>2]|0)+(c[p>>2]<<2)>>2]|0,(c[j>>2]>>4>>15)+1>>1)|0)|0}}else s=32767;c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]=(s&65535)<<16>>16;c[o>>2]=(c[o>>2]|0)+1}c[c[m>>2]>>2]=r;l=g;return}function sc(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=l;l=l+272|0;h=g+264|0;i=g+260|0;j=g+256|0;k=g+252|0;m=g+248|0;n=g+244|0;o=g+240|0;p=g+176|0;q=g+140|0;r=g+104|0;s=g+100|0;t=g+96|0;u=g+92|0;v=g+88|0;w=g+84|0;x=g+80|0;y=g+16|0;z=g+12|0;A=g+8|0;B=g+4|0;C=g;c[h>>2]=a;c[i>>2]=e;c[j>>2]=f;c[B>>2]=0;c[k>>2]=(c[j>>2]|0)==16?25152:25168;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[u>>2]=b[(c[i>>2]|0)+(c[m>>2]<<1)>>1]>>8;c[v>>2]=(b[(c[i>>2]|0)+(c[m>>2]<<1)>>1]|0)-(c[u>>2]<<8);c[w>>2]=b[17790+(c[u>>2]<<1)>>1];c[x>>2]=(b[17790+((c[u>>2]|0)+1<<1)>>1]|0)-(c[w>>2]|0);f=((c[w>>2]<<8)+(R(c[x>>2]|0,c[v>>2]|0)|0)>>3)+1>>1;c[p+(d[(c[k>>2]|0)+(c[m>>2]|0)>>0]<<2)>>2]=f;c[m>>2]=(c[m>>2]|0)+1}c[o>>2]=c[j>>2]>>1;tc(q,p,c[o>>2]|0);tc(r,p+4|0,c[o>>2]|0);c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[o>>2]|0))break;c[s>>2]=(c[q+((c[m>>2]|0)+1<<2)>>2]|0)+(c[q+(c[m>>2]<<2)>>2]|0);c[t>>2]=(c[r+((c[m>>2]|0)+1<<2)>>2]|0)-(c[r+(c[m>>2]<<2)>>2]|0);c[y+(c[m>>2]<<2)>>2]=0-(c[t>>2]|0)-(c[s>>2]|0);c[y+((c[j>>2]|0)-(c[m>>2]|0)-1<<2)>>2]=(c[t>>2]|0)-(c[s>>2]|0);c[m>>2]=(c[m>>2]|0)+1}c[n>>2]=0;while(1){if((c[n>>2]|0)>=10)break;c[z>>2]=0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;s=c[y+(c[m>>2]<<2)>>2]|0;c[A>>2]=(c[y+(c[m>>2]<<2)>>2]|0)>0?s:0-s|0;if((c[A>>2]|0)>(c[z>>2]|0)){c[z>>2]=c[A>>2];c[B>>2]=c[m>>2]}c[m>>2]=(c[m>>2]|0)+1}c[z>>2]=(c[z>>2]>>4)+1>>1;if((c[z>>2]|0)<=32767)break;c[z>>2]=(c[z>>2]|0)<163838?c[z>>2]|0:163838;c[C>>2]=65470-(((c[z>>2]|0)-32767<<14|0)/((R(c[z>>2]|0,(c[B>>2]|0)+1|0)|0)>>2|0)|0);uc(y,c[j>>2]|0,c[C>>2]|0);c[n>>2]=(c[n>>2]|0)+1}C=(c[n>>2]|0)==10;c[m>>2]=0;a:do if(C)while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break a;if(((c[y+(c[m>>2]<<2)>>2]>>4)+1>>1|0)<=32767)if(((c[y+(c[m>>2]<<2)>>2]>>4)+1>>1|0)<-32768)D=-32768;else D=(c[y+(c[m>>2]<<2)>>2]>>4)+1>>1;else D=32767;b[(c[h>>2]|0)+(c[m>>2]<<1)>>1]=D;c[y+(c[m>>2]<<2)>>2]=b[(c[h>>2]|0)+(c[m>>2]<<1)>>1]<<5;c[m>>2]=(c[m>>2]|0)+1}else while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break a;b[(c[h>>2]|0)+(c[m>>2]<<1)>>1]=(c[y+(c[m>>2]<<2)>>2]>>4)+1>>1;c[m>>2]=(c[m>>2]|0)+1}while(0);c[n>>2]=0;while(1){if((c[n>>2]|0)>=16){E=31;break}if((vc(c[h>>2]|0,c[j>>2]|0)|0)>=107374){E=31;break}uc(y,c[j>>2]|0,65536-(2<<c[n>>2])|0);c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;b[(c[h>>2]|0)+(c[m>>2]<<1)>>1]=(c[y+(c[m>>2]<<2)>>2]>>4)+1>>1;c[m>>2]=(c[m>>2]|0)+1}c[n>>2]=(c[n>>2]|0)+1}if((E|0)==31){l=g;return}}function tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[c[f>>2]>>2]=65536;c[(c[f>>2]|0)+4>>2]=0-(c[c[g>>2]>>2]|0);c[i>>2]=1;while(1){if((c[i>>2]|0)>=(c[h>>2]|0))break;c[k>>2]=c[(c[g>>2]|0)+(c[i>>2]<<1<<2)>>2];d=c[(c[f>>2]|0)+((c[i>>2]|0)-1<<2)>>2]<<1;b=c[k>>2]|0;a=c[(c[f>>2]|0)+(c[i>>2]<<2)>>2]|0;m=Ke(b|0,((b|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=Fe(m|0,C|0,15)|0;m=Ge(a|0,C|0,1,0)|0;a=Fe(m|0,C|0,1)|0;c[(c[f>>2]|0)+((c[i>>2]|0)+1<<2)>>2]=d-a;c[j>>2]=c[i>>2];while(1){if((c[j>>2]|0)<=1)break;a=c[(c[f>>2]|0)+((c[j>>2]|0)-2<<2)>>2]|0;d=c[k>>2]|0;m=c[(c[f>>2]|0)+((c[j>>2]|0)-1<<2)>>2]|0;b=Ke(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;m=Fe(b|0,C|0,15)|0;b=Ge(m|0,C|0,1,0)|0;m=Fe(b|0,C|0,1)|0;b=(c[f>>2]|0)+(c[j>>2]<<2)|0;c[b>>2]=(c[b>>2]|0)+(a-m);c[j>>2]=(c[j>>2]|0)+-1}m=(c[f>>2]|0)+4|0;c[m>>2]=(c[m>>2]|0)-(c[k>>2]|0);c[i>>2]=(c[i>>2]|0)+1}l=e;return}function uc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=(c[h>>2]|0)-65536;c[i>>2]=0;while(1){k=c[h>>2]>>16;m=c[f>>2]|0;if((c[i>>2]|0)>=((c[g>>2]|0)-1|0))break;d=R(k,(c[m+(c[i>>2]<<2)>>2]&65535)<<16>>16)|0;b=d+((R(c[h>>2]&65535,(c[(c[f>>2]|0)+(c[i>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;d=b+(R(c[h>>2]|0,(c[(c[f>>2]|0)+(c[i>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[f>>2]|0)+(c[i>>2]<<2)>>2]=d;d=((R(c[h>>2]|0,c[j>>2]|0)|0)>>15)+1>>1;c[h>>2]=(c[h>>2]|0)+d;c[i>>2]=(c[i>>2]|0)+1}i=R(k,(c[m+((c[g>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0;m=i+((R(c[h>>2]&65535,(c[(c[f>>2]|0)+((c[g>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0)>>16)|0;i=m+(R(c[h>>2]|0,(c[(c[f>>2]|0)+((c[g>>2]|0)-1<<2)>>2]>>15)+1>>1)|0)|0;c[(c[f>>2]|0)+((c[g>>2]|0)-1<<2)>>2]=i;l=e;return}function vc(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+160|0;f=e+148|0;g=e+144|0;h=e+140|0;i=e+136|0;j=e+8|0;k=e+4|0;m=e;c[g>>2]=a;c[h>>2]=d;c[m>>2]=0;c[k>>2]=j+((c[h>>2]&1)<<6);c[i>>2]=0;while(1){if((c[i>>2]|0)>=(c[h>>2]|0))break;c[m>>2]=(c[m>>2]|0)+(b[(c[g>>2]|0)+(c[i>>2]<<1)>>1]|0);c[(c[k>>2]|0)+(c[i>>2]<<2)>>2]=b[(c[g>>2]|0)+(c[i>>2]<<1)>>1]<<12;c[i>>2]=(c[i>>2]|0)+1}if((c[m>>2]|0)>=4096){c[f>>2]=0;n=c[f>>2]|0;l=e;return n|0}else{c[f>>2]=wc(j,c[h>>2]|0)|0;n=c[f>>2]|0;l=e;return n|0}return 0}function wc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=l;l=l+64|0;e=d+48|0;f=d+44|0;g=d+40|0;h=d+36|0;i=d+32|0;j=d+28|0;k=d+24|0;m=d+20|0;n=d+16|0;o=d+12|0;p=d+8|0;q=d+4|0;r=d;c[f>>2]=a;c[g>>2]=b;c[r>>2]=(c[f>>2]|0)+((c[g>>2]&1)<<6);c[k>>2]=1073741824;c[h>>2]=(c[g>>2]|0)-1;while(1){s=c[r>>2]|0;if((c[h>>2]|0)<=0)break;if((c[s+(c[h>>2]<<2)>>2]|0)>16773022){t=5;break}if((c[(c[r>>2]|0)+(c[h>>2]<<2)>>2]|0)<-16773022){t=5;break}c[m>>2]=0-(c[(c[r>>2]|0)+(c[h>>2]<<2)>>2]<<7);g=c[m>>2]|0;b=c[m>>2]|0;a=Ke(g|0,((g|0)<0)<<31>>31|0,b|0,((b|0)<0)<<31>>31|0)|0;b=Fe(a|0,C|0,32)|0;c[n>>2]=1073741824-b;b=c[n>>2]|0;c[j>>2]=32-(xc((c[n>>2]|0)>0?b:0-b|0)|0);c[o>>2]=yc(c[n>>2]|0,(c[j>>2]|0)+30|0)|0;b=c[k>>2]|0;a=c[n>>2]|0;g=Ke(b|0,((b|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=Fe(g|0,C|0,32)|0;c[k>>2]=a<<2;c[q>>2]=c[r>>2];c[r>>2]=(c[f>>2]|0)+((c[h>>2]&1)<<6);c[i>>2]=0;while(1){if((c[i>>2]|0)>=(c[h>>2]|0))break;a=c[(c[q>>2]|0)+(c[i>>2]<<2)>>2]|0;g=c[(c[q>>2]|0)+((c[h>>2]|0)-(c[i>>2]|0)-1<<2)>>2]|0;b=c[m>>2]|0;u=Ke(g|0,((g|0)<0)<<31>>31|0,b|0,((b|0)<0)<<31>>31|0)|0;b=Fe(u|0,C|0,30)|0;u=Ge(b|0,C|0,1,0)|0;b=Fe(u|0,C|0,1)|0;c[p>>2]=a-b;b=(c[j>>2]|0)==1;a=c[p>>2]|0;u=c[o>>2]|0;g=Ke(a|0,((a|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;u=C;if(b){b=Fe(g|0,u|0,1)|0;a=C;v=c[p>>2]|0;w=c[o>>2]|0;x=Ke(v|0,((v|0)<0)<<31>>31|0,w|0,((w|0)<0)<<31>>31|0)|0;w=Ge(b|0,a|0,x&1|0,0)|0;y=C;z=w}else{w=Fe(g|0,u|0,(c[j>>2]|0)-1|0)|0;u=Ge(w|0,C|0,1,0)|0;w=Fe(u|0,C|0,1)|0;y=C;z=w}c[(c[r>>2]|0)+(c[i>>2]<<2)>>2]=z;c[i>>2]=(c[i>>2]|0)+1}c[h>>2]=(c[h>>2]|0)+-1}if((t|0)==5){c[e>>2]=0;A=c[e>>2]|0;l=d;return A|0}if((c[s>>2]|0)<=16773022?(c[c[r>>2]>>2]|0)>=-16773022:0){c[m>>2]=0-(c[c[r>>2]>>2]<<7);r=c[m>>2]|0;s=c[m>>2]|0;m=Ke(r|0,((r|0)<0)<<31>>31|0,s|0,((s|0)<0)<<31>>31|0)|0;s=Fe(m|0,C|0,32)|0;c[n>>2]=1073741824-s;s=c[k>>2]|0;m=c[n>>2]|0;n=Ke(s|0,((s|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;m=Fe(n|0,C|0,32)|0;c[k>>2]=m<<2;c[e>>2]=c[k>>2];A=c[e>>2]|0;l=d;return A|0}c[e>>2]=0;A=c[e>>2]|0;l=d;return A|0}function xc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b;c[d>>2]=a;if(!(c[d>>2]|0)){e=32;l=b;return e|0}e=32-(32-(U(c[d>>2]|0)|0))|0;l=b;return e|0}function yc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+48|0;e=d+32|0;f=d+28|0;g=d+24|0;h=d+20|0;i=d+16|0;j=d+12|0;k=d+8|0;m=d+4|0;n=d;c[f>>2]=a;c[g>>2]=b;b=c[f>>2]|0;c[h>>2]=(xc((c[f>>2]|0)>0?b:0-b|0)|0)-1;c[k>>2]=c[f>>2]<<c[h>>2];c[j>>2]=536870911/(c[k>>2]>>16|0)|0;c[n>>2]=c[j>>2]<<16;f=R(c[k>>2]>>16,(c[j>>2]&65535)<<16>>16)|0;c[m>>2]=536870912-(f+((R(c[k>>2]&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))<<3;k=R(c[m>>2]>>16,(c[j>>2]&65535)<<16>>16)|0;f=(c[n>>2]|0)+(k+((R(c[m>>2]&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))|0;c[n>>2]=f+(R(c[m>>2]|0,(c[j>>2]>>15)+1>>1)|0);c[i>>2]=61-(c[h>>2]|0)-(c[g>>2]|0);g=c[i>>2]|0;if((c[i>>2]|0)>0)if((g|0)<32){c[e>>2]=c[n>>2]>>c[i>>2];o=c[e>>2]|0;l=d;return o|0}else{c[e>>2]=0;o=c[e>>2]|0;l=d;return o|0}h=c[n>>2]|0;j=0-(c[i>>2]|0)|0;do if((-2147483648>>0-g|0)>(2147483647>>0-(c[i>>2]|0)|0)){if((h|0)>(-2147483648>>j|0)){p=-2147483648>>0-(c[i>>2]|0);break}if((c[n>>2]|0)<(2147483647>>0-(c[i>>2]|0)|0)){p=2147483647>>0-(c[i>>2]|0);break}else{p=c[n>>2]|0;break}}else{if((h|0)>(2147483647>>j|0)){p=2147483647>>0-(c[i>>2]|0);break}if((c[n>>2]|0)<(-2147483648>>0-(c[i>>2]|0)|0)){p=-2147483648>>0-(c[i>>2]|0);break}else{p=c[n>>2]|0;break}}while(0);c[e>>2]=p<<0-(c[i>>2]|0);o=c[e>>2]|0;l=d;return o|0}function zc(d,e,f,g,h,i){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;j=l;l=l+48|0;k=j+40|0;m=j+36|0;n=j+32|0;o=j+28|0;p=j+24|0;q=j+20|0;r=j+16|0;s=j+12|0;t=j+8|0;u=j+44|0;v=j+4|0;w=j;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[p>>2]=h;c[q>>2]=i;a[u+1>>0]=0;c[v>>2]=c[m>>2];c[r>>2]=(((c[p>>2]|0)+(c[o>>2]<<1)&65535)<<16>>16)*7;c[w>>2]=23696+(c[r>>2]|0);c[n>>2]=(c[n>>2]|0)+8>>4;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;c[t>>2]=c[(c[q>>2]|0)+(c[r>>2]<<2)>>2];a:do if((c[t>>2]|0)>0){a[u>>0]=a[(c[w>>2]|0)+((c[t>>2]&31|0)<6?c[t>>2]&31:6)>>0]|0;c[s>>2]=0;while(1){if((c[s>>2]|0)>=16)break a;if((b[(c[v>>2]|0)+(c[s>>2]<<1)>>1]|0)>0){o=((bc(c[k>>2]|0,u,8)|0)<<1)-1|0;p=(c[v>>2]|0)+(c[s>>2]<<1)|0;b[p>>1]=R(b[p>>1]|0,o)|0}c[s>>2]=(c[s>>2]|0)+1}}while(0);c[v>>2]=(c[v>>2]|0)+32;c[r>>2]=(c[r>>2]|0)+1}l=j;return}function Ac(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;He(c[d>>2]|0,0,4260)|0;c[(c[d>>2]|0)+2376>>2]=1;c[c[d>>2]>>2]=65536;pc(c[d>>2]|0);Bc(c[d>>2]|0);l=b;return 0}function Bc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;c[(c[d>>2]|0)+4168>>2]=c[(c[d>>2]|0)+2328>>2]<<7;c[(c[d>>2]|0)+4168+72>>2]=65536;c[(c[d>>2]|0)+4168+72+4>>2]=65536;c[(c[d>>2]|0)+4168+88>>2]=20;c[(c[d>>2]|0)+4168+84>>2]=2;l=b;return}function Cc(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;h=l;l=l+144|0;i=h+96|0;j=h+92|0;k=h+88|0;m=h+84|0;n=h+80|0;o=h+76|0;p=h+72|0;q=h+68|0;r=h+64|0;s=h+60|0;t=h+56|0;u=h+52|0;v=h+48|0;w=h+44|0;x=h+104|0;y=h+40|0;z=h+36|0;A=h+32|0;B=h+28|0;C=h+24|0;D=h+20|0;E=h+16|0;F=h+12|0;G=h+8|0;H=h+4|0;I=h;c[i>>2]=d;c[j>>2]=e;c[k>>2]=f;c[m>>2]=g;c[p>>2]=0;g=c[(c[i>>2]|0)+2336>>2]|0;c[I>>2]=da()|0;f=l;l=l+((1*(g<<1)|0)+15&-16)|0;g=l;l=l+((1*((c[(c[i>>2]|0)+2336>>2]|0)+(c[(c[i>>2]|0)+2328>>2]|0)<<2)|0)+15&-16)|0;e=l;l=l+((1*(c[(c[i>>2]|0)+2332>>2]<<2)|0)+15&-16)|0;d=l;l=l+((1*((c[(c[i>>2]|0)+2332>>2]|0)+16<<2)|0)+15&-16)|0;c[E>>2]=b[17776+(a[(c[i>>2]|0)+2736+29>>0]>>1<<2)+(a[(c[i>>2]|0)+2736+30>>0]<<1)>>1];if((a[(c[i>>2]|0)+2736+31>>0]|0)<4)c[s>>2]=1;else c[s>>2]=0;c[D>>2]=a[(c[i>>2]|0)+2736+34>>0];c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[(c[i>>2]|0)+2328>>2]|0))break;c[D>>2]=907633515+(R(c[D>>2]|0,196314165)|0);c[(c[i>>2]|0)+4+(c[n>>2]<<2)>>2]=b[(c[m>>2]|0)+(c[n>>2]<<1)>>1]<<14;J=(c[i>>2]|0)+4+(c[n>>2]<<2)|0;K=c[J>>2]|0;if((c[(c[i>>2]|0)+4+(c[n>>2]<<2)>>2]|0)<=0){if((K|0)<0){L=(c[i>>2]|0)+4+(c[n>>2]<<2)|0;c[L>>2]=(c[L>>2]|0)+1280}}else c[J>>2]=K-1280;K=(c[i>>2]|0)+4+(c[n>>2]<<2)|0;c[K>>2]=(c[K>>2]|0)+(c[E>>2]<<4);if((c[D>>2]|0)<0)c[(c[i>>2]|0)+4+(c[n>>2]<<2)>>2]=0-(c[(c[i>>2]|0)+4+(c[n>>2]<<2)>>2]|0);c[D>>2]=(c[D>>2]|0)+(b[(c[m>>2]|0)+(c[n>>2]<<1)>>1]|0);c[n>>2]=(c[n>>2]|0)+1}m=d;D=(c[i>>2]|0)+1284|0;E=m+64|0;do{c[m>>2]=c[D>>2];m=m+4|0;D=D+4|0}while((m|0)<(E|0));c[G>>2]=(c[i>>2]|0)+4;c[w>>2]=c[k>>2];c[r>>2]=c[(c[i>>2]|0)+2336>>2];c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[(c[i>>2]|0)+2324>>2]|0))break;c[H>>2]=e;c[u>>2]=(c[j>>2]|0)+32+(c[o>>2]>>1<<5);Ie(x|0,c[u>>2]|0,c[(c[i>>2]|0)+2340>>2]<<1|0)|0;c[v>>2]=(c[j>>2]|0)+96+((c[o>>2]|0)*5<<1);c[t>>2]=a[(c[i>>2]|0)+2736+29>>0];c[A>>2]=c[(c[j>>2]|0)+16+(c[o>>2]<<2)>>2]>>6;c[B>>2]=Dc(c[(c[j>>2]|0)+16+(c[o>>2]<<2)>>2]|0,47)|0;a:do if((c[(c[j>>2]|0)+16+(c[o>>2]<<2)>>2]|0)!=(c[c[i>>2]>>2]|0)){c[C>>2]=Ec(c[c[i>>2]>>2]|0,c[(c[j>>2]|0)+16+(c[o>>2]<<2)>>2]|0,16)|0;c[n>>2]=0;while(1){if((c[n>>2]|0)>=16)break a;K=R(c[C>>2]>>16,(c[d+(c[n>>2]<<2)>>2]&65535)<<16>>16)|0;J=K+((R(c[C>>2]&65535,(c[d+(c[n>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;K=J+(R(c[C>>2]|0,(c[d+(c[n>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[d+(c[n>>2]<<2)>>2]=K;c[n>>2]=(c[n>>2]|0)+1}}else c[C>>2]=65536;while(0);c[c[i>>2]>>2]=c[(c[j>>2]|0)+16+(c[o>>2]<<2)>>2];if((c[(c[i>>2]|0)+4160>>2]|0?(c[(c[i>>2]|0)+4164>>2]|0)==2:0)?((c[o>>2]|0)<2?(a[(c[i>>2]|0)+2736+29>>0]|0)!=2:0):0){K=c[v>>2]|0;b[K>>1]=0;b[K+2>>1]=0;b[K+4>>1]=0;b[K+6>>1]=0;b[K+8>>1]=0;b[(c[v>>2]|0)+4>>1]=4096;c[t>>2]=2;c[(c[j>>2]|0)+(c[o>>2]<<2)>>2]=c[(c[i>>2]|0)+2308>>2]}b:do if((c[t>>2]|0)==2){c[p>>2]=c[(c[j>>2]|0)+(c[o>>2]<<2)>>2];if(c[o>>2]|0?!((c[o>>2]|0)==2&(c[s>>2]|0)!=0):0){if((c[C>>2]|0)==65536)break;c[n>>2]=0;while(1){if((c[n>>2]|0)>=((c[p>>2]|0)+2|0))break b;K=R(c[C>>2]>>16,(c[g+((c[r>>2]|0)-(c[n>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0;J=K+((R(c[C>>2]&65535,(c[g+((c[r>>2]|0)-(c[n>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0)>>16)|0;K=J+(R(c[C>>2]|0,(c[g+((c[r>>2]|0)-(c[n>>2]|0)-1<<2)>>2]>>15)+1>>1)|0)|0;c[g+((c[r>>2]|0)-(c[n>>2]|0)-1<<2)>>2]=K;c[n>>2]=(c[n>>2]|0)+1}}c[q>>2]=(c[(c[i>>2]|0)+2336>>2]|0)-(c[p>>2]|0)-(c[(c[i>>2]|0)+2340>>2]|0)-2;if((c[o>>2]|0)==2)Ie((c[i>>2]|0)+1348+(c[(c[i>>2]|0)+2336>>2]<<1)|0,c[k>>2]|0,c[(c[i>>2]|0)+2332>>2]<<1<<1|0)|0;K=(c[i>>2]|0)+1348+((c[q>>2]|0)+(R(c[o>>2]|0,c[(c[i>>2]|0)+2332>>2]|0)|0)<<1)|0;Fc(f+(c[q>>2]<<1)|0,K,c[u>>2]|0,(c[(c[i>>2]|0)+2336>>2]|0)-(c[q>>2]|0)|0,c[(c[i>>2]|0)+2340>>2]|0);if(!(c[o>>2]|0)){K=R(c[B>>2]>>16,(c[(c[j>>2]|0)+136>>2]&65535)<<16>>16)|0;c[B>>2]=K+((R(c[B>>2]&65535,(c[(c[j>>2]|0)+136>>2]&65535)<<16>>16)|0)>>16)<<2}c[n>>2]=0;while(1){if((c[n>>2]|0)>=((c[p>>2]|0)+2|0))break b;K=R(c[B>>2]>>16,b[f+((c[(c[i>>2]|0)+2336>>2]|0)-(c[n>>2]|0)-1<<1)>>1]|0)|0;J=K+((R(c[B>>2]&65535,b[f+((c[(c[i>>2]|0)+2336>>2]|0)-(c[n>>2]|0)-1<<1)>>1]|0)|0)>>16)|0;c[g+((c[r>>2]|0)-(c[n>>2]|0)-1<<2)>>2]=J;c[n>>2]=(c[n>>2]|0)+1}}while(0);c:do if((c[t>>2]|0)==2){c[F>>2]=g+((c[r>>2]|0)-(c[p>>2]|0)+2<<2);c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[(c[i>>2]|0)+2332>>2]|0))break c;c[y>>2]=2;J=R(c[c[F>>2]>>2]>>16,b[c[v>>2]>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(J+((R(c[c[F>>2]>>2]&65535,b[c[v>>2]>>1]|0)|0)>>16));J=R(c[(c[F>>2]|0)+-4>>2]>>16,b[(c[v>>2]|0)+2>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(J+((R(c[(c[F>>2]|0)+-4>>2]&65535,b[(c[v>>2]|0)+2>>1]|0)|0)>>16));J=R(c[(c[F>>2]|0)+-8>>2]>>16,b[(c[v>>2]|0)+4>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(J+((R(c[(c[F>>2]|0)+-8>>2]&65535,b[(c[v>>2]|0)+4>>1]|0)|0)>>16));J=R(c[(c[F>>2]|0)+-12>>2]>>16,b[(c[v>>2]|0)+6>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(J+((R(c[(c[F>>2]|0)+-12>>2]&65535,b[(c[v>>2]|0)+6>>1]|0)|0)>>16));J=R(c[(c[F>>2]|0)+-16>>2]>>16,b[(c[v>>2]|0)+8>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(J+((R(c[(c[F>>2]|0)+-16>>2]&65535,b[(c[v>>2]|0)+8>>1]|0)|0)>>16));c[F>>2]=(c[F>>2]|0)+4;c[(c[H>>2]|0)+(c[n>>2]<<2)>>2]=(c[(c[G>>2]|0)+(c[n>>2]<<2)>>2]|0)+(c[y>>2]<<1);c[g+(c[r>>2]<<2)>>2]=c[(c[H>>2]|0)+(c[n>>2]<<2)>>2]<<1;c[r>>2]=(c[r>>2]|0)+1;c[n>>2]=(c[n>>2]|0)+1}}else c[H>>2]=c[G>>2];while(0);c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[(c[i>>2]|0)+2332>>2]|0))break;c[z>>2]=c[(c[i>>2]|0)+2340>>2]>>1;J=R(c[d+(16+(c[n>>2]|0)-1<<2)>>2]>>16,b[x>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-1<<2)>>2]&65535,b[x>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-2<<2)>>2]>>16,b[x+2>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-2<<2)>>2]&65535,b[x+2>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-3<<2)>>2]>>16,b[x+4>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-3<<2)>>2]&65535,b[x+4>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-4<<2)>>2]>>16,b[x+6>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-4<<2)>>2]&65535,b[x+6>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-5<<2)>>2]>>16,b[x+8>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-5<<2)>>2]&65535,b[x+8>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-6<<2)>>2]>>16,b[x+10>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-6<<2)>>2]&65535,b[x+10>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-7<<2)>>2]>>16,b[x+12>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-7<<2)>>2]&65535,b[x+12>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-8<<2)>>2]>>16,b[x+14>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-8<<2)>>2]&65535,b[x+14>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-9<<2)>>2]>>16,b[x+16>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-9<<2)>>2]&65535,b[x+16>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-10<<2)>>2]>>16,b[x+18>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-10<<2)>>2]&65535,b[x+18>>1]|0)|0)>>16));if((c[(c[i>>2]|0)+2340>>2]|0)==16){J=R(c[d+(16+(c[n>>2]|0)-11<<2)>>2]>>16,b[x+20>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-11<<2)>>2]&65535,b[x+20>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-12<<2)>>2]>>16,b[x+22>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-12<<2)>>2]&65535,b[x+22>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-13<<2)>>2]>>16,b[x+24>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-13<<2)>>2]&65535,b[x+24>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-14<<2)>>2]>>16,b[x+26>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-14<<2)>>2]&65535,b[x+26>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-15<<2)>>2]>>16,b[x+28>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-15<<2)>>2]&65535,b[x+28>>1]|0)|0)>>16));J=R(c[d+(16+(c[n>>2]|0)-16<<2)>>2]>>16,b[x+30>>1]|0)|0;c[z>>2]=(c[z>>2]|0)+(J+((R(c[d+(16+(c[n>>2]|0)-16<<2)>>2]&65535,b[x+30>>1]|0)|0)>>16))}c[d+(16+(c[n>>2]|0)<<2)>>2]=(c[(c[H>>2]|0)+(c[n>>2]<<2)>>2]|0)+(c[z>>2]<<4);J=R(c[d+(16+(c[n>>2]|0)<<2)>>2]>>16,(c[A>>2]&65535)<<16>>16)|0;K=J+((R(c[d+(16+(c[n>>2]|0)<<2)>>2]&65535,(c[A>>2]&65535)<<16>>16)|0)>>16)|0;if(((K+(R(c[d+(16+(c[n>>2]|0)<<2)>>2]|0,(c[A>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){K=R(c[d+(16+(c[n>>2]|0)<<2)>>2]>>16,(c[A>>2]&65535)<<16>>16)|0;J=K+((R(c[d+(16+(c[n>>2]|0)<<2)>>2]&65535,(c[A>>2]&65535)<<16>>16)|0)>>16)|0;if(((J+(R(c[d+(16+(c[n>>2]|0)<<2)>>2]|0,(c[A>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)M=-32768;else{J=R(c[d+(16+(c[n>>2]|0)<<2)>>2]>>16,(c[A>>2]&65535)<<16>>16)|0;K=J+((R(c[d+(16+(c[n>>2]|0)<<2)>>2]&65535,(c[A>>2]&65535)<<16>>16)|0)>>16)|0;M=(K+(R(c[d+(16+(c[n>>2]|0)<<2)>>2]|0,(c[A>>2]>>15)+1>>1)|0)>>7)+1>>1}}else M=32767;b[(c[w>>2]|0)+(c[n>>2]<<1)>>1]=M;c[n>>2]=(c[n>>2]|0)+1}m=d;D=d+(c[(c[i>>2]|0)+2332>>2]<<2)|0;E=m+64|0;do{c[m>>2]=c[D>>2];m=m+4|0;D=D+4|0}while((m|0)<(E|0));c[G>>2]=(c[G>>2]|0)+(c[(c[i>>2]|0)+2332>>2]<<2);c[w>>2]=(c[w>>2]|0)+(c[(c[i>>2]|0)+2332>>2]<<1);c[o>>2]=(c[o>>2]|0)+1}m=(c[i>>2]|0)+1284|0;D=d;E=m+64|0;do{c[m>>2]=c[D>>2];m=m+4|0;D=D+4|0}while((m|0)<(E|0));ga(c[I>>2]|0);l=h;return}function Dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+48|0;e=d+32|0;f=d+28|0;g=d+24|0;h=d+20|0;i=d+16|0;j=d+12|0;k=d+8|0;m=d+4|0;n=d;c[f>>2]=a;c[g>>2]=b;b=c[f>>2]|0;c[h>>2]=(Gc((c[f>>2]|0)>0?b:0-b|0)|0)-1;c[k>>2]=c[f>>2]<<c[h>>2];c[j>>2]=536870911/(c[k>>2]>>16|0)|0;c[n>>2]=c[j>>2]<<16;f=R(c[k>>2]>>16,(c[j>>2]&65535)<<16>>16)|0;c[m>>2]=536870912-(f+((R(c[k>>2]&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))<<3;k=R(c[m>>2]>>16,(c[j>>2]&65535)<<16>>16)|0;f=(c[n>>2]|0)+(k+((R(c[m>>2]&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))|0;c[n>>2]=f+(R(c[m>>2]|0,(c[j>>2]>>15)+1>>1)|0);c[i>>2]=61-(c[h>>2]|0)-(c[g>>2]|0);g=c[i>>2]|0;if((c[i>>2]|0)>0)if((g|0)<32){c[e>>2]=c[n>>2]>>c[i>>2];o=c[e>>2]|0;l=d;return o|0}else{c[e>>2]=0;o=c[e>>2]|0;l=d;return o|0}h=c[n>>2]|0;j=0-(c[i>>2]|0)|0;do if((-2147483648>>0-g|0)>(2147483647>>0-(c[i>>2]|0)|0)){if((h|0)>(-2147483648>>j|0)){p=-2147483648>>0-(c[i>>2]|0);break}if((c[n>>2]|0)<(2147483647>>0-(c[i>>2]|0)|0)){p=2147483647>>0-(c[i>>2]|0);break}else{p=c[n>>2]|0;break}}else{if((h|0)>(2147483647>>j|0)){p=2147483647>>0-(c[i>>2]|0);break}if((c[n>>2]|0)<(-2147483648>>0-(c[i>>2]|0)|0)){p=-2147483648>>0-(c[i>>2]|0);break}else{p=c[n>>2]|0;break}}while(0);c[e>>2]=p<<0-(c[i>>2]|0);o=c[e>>2]|0;l=d;return o|0}function Ec(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=l;l=l+48|0;f=e+40|0;g=e+36|0;h=e+32|0;i=e+28|0;j=e+24|0;k=e+20|0;m=e+16|0;n=e+12|0;o=e+8|0;p=e+4|0;q=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;d=c[g>>2]|0;c[j>>2]=(Gc((c[g>>2]|0)>0?d:0-d|0)|0)-1;c[o>>2]=c[g>>2]<<c[j>>2];g=c[h>>2]|0;c[k>>2]=(Gc((c[h>>2]|0)>0?g:0-g|0)|0)-1;c[p>>2]=c[h>>2]<<c[k>>2];c[n>>2]=536870911/(c[p>>2]>>16|0)|0;h=R(c[o>>2]>>16,(c[n>>2]&65535)<<16>>16)|0;c[q>>2]=h+((R(c[o>>2]&65535,(c[n>>2]&65535)<<16>>16)|0)>>16);h=c[o>>2]|0;g=c[p>>2]|0;p=c[q>>2]|0;d=Ke(g|0,((g|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=Fe(d|0,C|0,32)|0;c[o>>2]=h-(p<<3);p=R(c[o>>2]>>16,(c[n>>2]&65535)<<16>>16)|0;c[q>>2]=(c[q>>2]|0)+(p+((R(c[o>>2]&65535,(c[n>>2]&65535)<<16>>16)|0)>>16));c[m>>2]=29+(c[j>>2]|0)-(c[k>>2]|0)-(c[i>>2]|0);i=c[m>>2]|0;if((c[m>>2]|0)>=0)if((i|0)<32){c[f>>2]=c[q>>2]>>c[m>>2];r=c[f>>2]|0;l=e;return r|0}else{c[f>>2]=0;r=c[f>>2]|0;l=e;return r|0}k=c[q>>2]|0;j=0-(c[m>>2]|0)|0;do if((-2147483648>>0-i|0)>(2147483647>>0-(c[m>>2]|0)|0)){if((k|0)>(-2147483648>>j|0)){s=-2147483648>>0-(c[m>>2]|0);break}if((c[q>>2]|0)<(2147483647>>0-(c[m>>2]|0)|0)){s=2147483647>>0-(c[m>>2]|0);break}else{s=c[q>>2]|0;break}}else{if((k|0)>(2147483647>>j|0)){s=2147483647>>0-(c[m>>2]|0);break}if((c[q>>2]|0)<(-2147483648>>0-(c[m>>2]|0)|0)){s=-2147483648>>0-(c[m>>2]|0);break}else{s=c[q>>2]|0;break}}while(0);c[f>>2]=s<<0-(c[m>>2]|0);r=c[f>>2]|0;l=e;return r|0}function Fc(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=l;l=l+48|0;i=h+36|0;j=h+32|0;k=h+28|0;m=h+24|0;n=h+20|0;o=h+16|0;p=h+12|0;q=h+8|0;r=h+4|0;s=h;c[i>>2]=a;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[p>>2]=c[n>>2];while(1){if((c[p>>2]|0)>=(c[m>>2]|0))break;c[s>>2]=(c[j>>2]|0)+((c[p>>2]|0)-1<<1);c[q>>2]=R(b[c[s>>2]>>1]|0,b[c[k>>2]>>1]|0)|0;c[q>>2]=(c[q>>2]|0)+(R(b[(c[s>>2]|0)+-2>>1]|0,b[(c[k>>2]|0)+2>>1]|0)|0);c[q>>2]=(c[q>>2]|0)+(R(b[(c[s>>2]|0)+-4>>1]|0,b[(c[k>>2]|0)+4>>1]|0)|0);c[q>>2]=(c[q>>2]|0)+(R(b[(c[s>>2]|0)+-6>>1]|0,b[(c[k>>2]|0)+6>>1]|0)|0);c[q>>2]=(c[q>>2]|0)+(R(b[(c[s>>2]|0)+-8>>1]|0,b[(c[k>>2]|0)+8>>1]|0)|0);c[q>>2]=(c[q>>2]|0)+(R(b[(c[s>>2]|0)+-10>>1]|0,b[(c[k>>2]|0)+10>>1]|0)|0);c[o>>2]=6;while(1){if((c[o>>2]|0)>=(c[n>>2]|0))break;c[q>>2]=(c[q>>2]|0)+(R(b[(c[s>>2]|0)+(0-(c[o>>2]|0)<<1)>>1]|0,b[(c[k>>2]|0)+(c[o>>2]<<1)>>1]|0)|0);c[q>>2]=(c[q>>2]|0)+(R(b[(c[s>>2]|0)+(0-(c[o>>2]|0)-1<<1)>>1]|0,b[(c[k>>2]|0)+((c[o>>2]|0)+1<<1)>>1]|0)|0);c[o>>2]=(c[o>>2]|0)+2}c[q>>2]=(b[(c[s>>2]|0)+2>>1]<<12)-(c[q>>2]|0);c[r>>2]=(c[q>>2]>>11)+1>>1;if((c[r>>2]|0)>32767)t=32767;else t=(c[r>>2]|0)<-32768?-32768:c[r>>2]|0;b[(c[i>>2]|0)+(c[p>>2]<<1)>>1]=t;c[p>>2]=(c[p>>2]|0)+1}He(c[i>>2]|0,0,c[n>>2]<<1|0)|0;l=h;return}function Gc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b;c[d>>2]=a;if(!(c[d>>2]|0)){e=32;l=b;return e|0}e=32-(32-(U(c[d>>2]|0)|0))|0;l=b;return e|0}function Hc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;i=l;l=l+192|0;j=i+176|0;k=i+172|0;m=i+168|0;n=i+164|0;o=i+160|0;p=i+156|0;q=i+152|0;r=i+148|0;s=i+144|0;t=i+4|0;u=i;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[p>>2]=h;c[s>>2]=0;c[q>>2]=c[(c[j>>2]|0)+2328>>2];c[t+136>>2]=0;do if(!(c[o>>2]|0))v=4;else{if((c[o>>2]|0)==2?(c[(c[j>>2]|0)+2420+(c[(c[j>>2]|0)+2388>>2]<<2)>>2]|0)==1:0){v=4;break}Lc(c[j>>2]|0,t,c[m>>2]|0,1)}while(0);if((v|0)==4){v=(c[q>>2]|0)+16-1&-16;c[u>>2]=da()|0;h=l;l=l+((1*(v<<1)|0)+15&-16)|0;Ic(c[j>>2]|0,c[k>>2]|0,c[(c[j>>2]|0)+2388>>2]|0,c[o>>2]|0,c[p>>2]|0);Jc(c[k>>2]|0,h,a[(c[j>>2]|0)+2736+29>>0]|0,a[(c[j>>2]|0)+2736+30>>0]|0,c[(c[j>>2]|0)+2328>>2]|0);Kc(c[j>>2]|0,t,c[p>>2]|0);Cc(c[j>>2]|0,t,c[m>>2]|0,h);Lc(c[j>>2]|0,t,c[m>>2]|0,0);c[(c[j>>2]|0)+4160>>2]=0;c[(c[j>>2]|0)+4164>>2]=a[(c[j>>2]|0)+2736+29>>0];c[(c[j>>2]|0)+2376>>2]=0;ga(c[u>>2]|0)}c[r>>2]=(c[(c[j>>2]|0)+2336>>2]|0)-(c[(c[j>>2]|0)+2328>>2]|0);Le((c[j>>2]|0)+1348|0,(c[j>>2]|0)+1348+(c[(c[j>>2]|0)+2328>>2]<<1)|0,c[r>>2]<<1|0)|0;Ie((c[j>>2]|0)+1348+(c[r>>2]<<1)|0,c[m>>2]|0,c[(c[j>>2]|0)+2328>>2]<<1|0)|0;Mc(c[j>>2]|0,c[m>>2]|0,c[q>>2]|0);qc(c[j>>2]|0,t,c[m>>2]|0,c[q>>2]|0);c[(c[j>>2]|0)+2308>>2]=c[t+((c[(c[j>>2]|0)+2324>>2]|0)-1<<2)>>2];c[c[n>>2]>>2]=c[q>>2];l=i;return c[s>>2]|0}function Ic(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;i=l;l=l+96|0;j=i+36|0;k=i+32|0;m=i+28|0;n=i+24|0;o=i+20|0;p=i+16|0;q=i+12|0;r=i+8|0;s=i+4|0;t=i;u=i+40|0;v=i+72|0;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=h;if(!(c[n>>2]|0)?!(c[(c[j>>2]|0)+2404+(c[m>>2]<<2)>>2]|0):0)c[r>>2]=bc(c[k>>2]|0,22720,8)|0;else c[r>>2]=(bc(c[k>>2]|0,22716,8)|0)+2;a[(c[j>>2]|0)+2736+29>>0]=c[r>>2]>>1;a[(c[j>>2]|0)+2736+30>>0]=c[r>>2]&1;m=c[k>>2]|0;if((c[o>>2]|0)==2){n=(bc(m,20582,8)|0)&255;a[(c[j>>2]|0)+2736>>0]=n}else{n=(bc(m,20558+(a[(c[j>>2]|0)+2736+29>>0]<<3)|0,8)|0)<<3&255;a[(c[j>>2]|0)+2736>>0]=n;n=((bc(c[k>>2]|0,22745,8)|0)&255)<<24>>24;m=(c[j>>2]|0)+2736|0;a[m>>0]=(a[m>>0]|0)+n}c[p>>2]=1;while(1){w=c[k>>2]|0;if((c[p>>2]|0)>=(c[(c[j>>2]|0)+2324>>2]|0))break;n=(bc(w,20582,8)|0)&255;a[(c[j>>2]|0)+2736+(c[p>>2]|0)>>0]=n;c[p>>2]=(c[p>>2]|0)+1}n=(bc(w,(c[(c[(c[j>>2]|0)+2732>>2]|0)+12>>2]|0)+(R(a[(c[j>>2]|0)+2736+29>>0]>>1,b[c[(c[j>>2]|0)+2732>>2]>>1]|0)|0)|0,8)|0)&255;a[(c[j>>2]|0)+2736+8>>0]=n;dd(u,v,c[(c[j>>2]|0)+2732>>2]|0,a[(c[j>>2]|0)+2736+8>>0]|0);c[p>>2]=0;while(1){if((c[p>>2]|0)>=(b[(c[(c[j>>2]|0)+2732>>2]|0)+2>>1]|0))break;c[r>>2]=bc(c[k>>2]|0,(c[(c[(c[j>>2]|0)+2732>>2]|0)+24>>2]|0)+(b[u+(c[p>>2]<<1)>>1]|0)|0,8)|0;if(c[r>>2]|0){if((c[r>>2]|0)==8){v=bc(c[k>>2]|0,22753,8)|0;c[r>>2]=(c[r>>2]|0)+v}}else{v=bc(c[k>>2]|0,22753,8)|0;c[r>>2]=(c[r>>2]|0)-v}a[(c[j>>2]|0)+2736+8+((c[p>>2]|0)+1)>>0]=(c[r>>2]|0)-4;c[p>>2]=(c[p>>2]|0)+1}if((c[(c[j>>2]|0)+2324>>2]|0)==4){p=(bc(c[k>>2]|0,22722,8)|0)&255;x=p;y=c[j>>2]|0}else{x=4;y=c[j>>2]|0}a[y+2736+31>>0]=x;if((a[(c[j>>2]|0)+2736+29>>0]|0)!=2){z=c[j>>2]|0;A=z+2736|0;B=A+29|0;C=a[B>>0]|0;D=C<<24>>24;E=c[j>>2]|0;F=E+2396|0;c[F>>2]=D;G=c[k>>2]|0;H=bc(G,22730,8)|0;I=H&255;J=c[j>>2]|0;K=J+2736|0;L=K+34|0;a[L>>0]=I;l=i;return}c[s>>2]=1;if(((c[o>>2]|0)==2?(c[(c[j>>2]|0)+2396>>2]|0)==2:0)?(c[t>>2]=((bc(c[k>>2]|0,22792,8)|0)&65535)<<16>>16,(c[t>>2]|0)>0):0){c[t>>2]=(c[t>>2]|0)-9;b[(c[j>>2]|0)+2736+26>>1]=(b[(c[j>>2]|0)+2400>>1]|0)+(c[t>>2]|0);c[s>>2]=0}if(c[s>>2]|0){s=((bc(c[k>>2]|0,22760,8)|0)&65535)<<16>>16;t=(R(s,c[(c[j>>2]|0)+2316>>2]>>1)|0)&65535;b[(c[j>>2]|0)+2736+26>>1]=t;t=((bc(c[k>>2]|0,c[(c[j>>2]|0)+2380>>2]|0,8)|0)&65535)<<16>>16;s=(c[j>>2]|0)+2736+26|0;b[s>>1]=(b[s>>1]|0)+t}b[(c[j>>2]|0)+2400>>1]=b[(c[j>>2]|0)+2736+26>>1]|0;t=(bc(c[k>>2]|0,c[(c[j>>2]|0)+2384>>2]|0,8)|0)&255;a[(c[j>>2]|0)+2736+28>>0]=t;t=(bc(c[k>>2]|0,20623,8)|0)&255;a[(c[j>>2]|0)+2736+32>>0]=t;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[(c[j>>2]|0)+2324>>2]|0))break;t=(bc(c[k>>2]|0,c[108+(a[(c[j>>2]|0)+2736+32>>0]<<2)>>2]|0,8)|0)&255;a[(c[j>>2]|0)+2736+4+(c[q>>2]|0)>>0]=t;c[q>>2]=(c[q>>2]|0)+1}if(!(c[o>>2]|0)){o=(bc(c[k>>2]|0,22713,8)|0)&255;M=o;N=c[j>>2]|0}else{M=0;N=c[j>>2]|0}a[N+2736+33>>0]=M;z=c[j>>2]|0;A=z+2736|0;B=A+29|0;C=a[B>>0]|0;D=C<<24>>24;E=c[j>>2]|0;F=E+2396|0;c[F>>2]=D;G=c[k>>2]|0;H=bc(G,22730,8)|0;I=H&255;J=c[j>>2]|0;K=J+2736|0;L=K+34|0;a[L>>0]=I;l=i;return}function Jc(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;h=l;l=l+224|0;i=h+212|0;j=h+208|0;k=h+204|0;m=h+200|0;n=h+196|0;o=h+192|0;p=h+188|0;q=h+184|0;r=h+180|0;s=h+176|0;t=h+172|0;u=h+168|0;v=h+88|0;w=h+8|0;x=h+4|0;y=h;c[i>>2]=a;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[u>>2]=bc(c[i>>2]|0,23053+((c[k>>2]>>1)*9|0)|0,8)|0;c[r>>2]=c[n>>2]>>4;if((c[r>>2]<<4|0)<(c[n>>2]|0))c[r>>2]=(c[r>>2]|0)+1;c[y>>2]=22873+((c[u>>2]|0)*18|0);c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[r>>2]|0))break;c[w+(c[o>>2]<<2)>>2]=0;u=bc(c[i>>2]|0,c[y>>2]|0,8)|0;g=c[o>>2]|0;f=u;while(1){c[v+(g<<2)>>2]=f;z=c[o>>2]|0;if((c[v+(c[o>>2]<<2)>>2]|0)!=17)break;u=w+(z<<2)|0;c[u>>2]=(c[u>>2]|0)+1;u=bc(c[i>>2]|0,23035+((c[w+(c[o>>2]<<2)>>2]|0)==10&1)|0,8)|0;g=c[o>>2]|0;f=u}c[o>>2]=z+1}c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[r>>2]|0))break;z=(c[j>>2]|0)+((c[o>>2]&65535)<<16>>16<<4<<1)|0;if((c[v+(c[o>>2]<<2)>>2]|0)>0)td(z,c[i>>2]|0,c[v+(c[o>>2]<<2)>>2]|0);else{y=z;z=y+32|0;do{b[y>>1]=0;y=y+2|0}while((y|0)<(z|0))}c[o>>2]=(c[o>>2]|0)+1}c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[r>>2]|0))break;if((c[w+(c[o>>2]<<2)>>2]|0)>0){c[t>>2]=c[w+(c[o>>2]<<2)>>2];c[x>>2]=(c[j>>2]|0)+((c[o>>2]&65535)<<16>>16<<4<<1);c[q>>2]=0;while(1){if((c[q>>2]|0)>=16)break;c[s>>2]=b[(c[x>>2]|0)+(c[q>>2]<<1)>>1];c[p>>2]=0;while(1){A=c[s>>2]|0;if((c[p>>2]|0)>=(c[t>>2]|0))break;c[s>>2]=A<<1;y=bc(c[i>>2]|0,22711,8)|0;c[s>>2]=(c[s>>2]|0)+y;c[p>>2]=(c[p>>2]|0)+1}b[(c[x>>2]|0)+(c[q>>2]<<1)>>1]=A;c[q>>2]=(c[q>>2]|0)+1}y=v+(c[o>>2]<<2)|0;c[y>>2]=c[y>>2]|c[t>>2]<<5}c[o>>2]=(c[o>>2]|0)+1}zc(c[i>>2]|0,c[j>>2]|0,c[n>>2]|0,c[k>>2]|0,c[m>>2]|0,v);l=h;return}function Kc(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=l;l=l+96|0;h=g+24|0;i=g+20|0;j=g+16|0;k=g+12|0;m=g+8|0;n=g+4|0;o=g+64|0;p=g+32|0;q=g;c[h>>2]=d;c[i>>2]=e;c[j>>2]=f;ad((c[i>>2]|0)+16|0,(c[h>>2]|0)+2736|0,(c[h>>2]|0)+2312|0,(c[j>>2]|0)==2&1,c[(c[h>>2]|0)+2324>>2]|0);bd(o,(c[h>>2]|0)+2736+8|0,c[(c[h>>2]|0)+2732>>2]|0);sc((c[i>>2]|0)+32+32|0,o,c[(c[h>>2]|0)+2340>>2]|0);if((c[(c[h>>2]|0)+2376>>2]|0)==1)a[(c[h>>2]|0)+2736+31>>0]=4;if((a[(c[h>>2]|0)+2736+31>>0]|0)<4){c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[(c[h>>2]|0)+2340>>2]|0))break;j=(b[(c[h>>2]|0)+2344+(c[k>>2]<<1)>>1]|0)+((R(a[(c[h>>2]|0)+2736+31>>0]|0,(b[o+(c[k>>2]<<1)>>1]|0)-(b[(c[h>>2]|0)+2344+(c[k>>2]<<1)>>1]|0)|0)|0)>>2)&65535;b[p+(c[k>>2]<<1)>>1]=j;c[k>>2]=(c[k>>2]|0)+1}sc((c[i>>2]|0)+32|0,p,c[(c[h>>2]|0)+2340>>2]|0)}else Ie((c[i>>2]|0)+32|0,(c[i>>2]|0)+32+32|0,c[(c[h>>2]|0)+2340>>2]<<1|0)|0;Ie((c[h>>2]|0)+2344|0,o|0,c[(c[h>>2]|0)+2340>>2]<<1|0)|0;if(c[(c[h>>2]|0)+4160>>2]|0){Yc((c[i>>2]|0)+32|0,c[(c[h>>2]|0)+2340>>2]|0,63570);Yc((c[i>>2]|0)+32+32|0,c[(c[h>>2]|0)+2340>>2]|0,63570)}if((a[(c[h>>2]|0)+2736+29>>0]|0)!=2){He(c[i>>2]|0,0,c[(c[h>>2]|0)+2324>>2]<<2|0)|0;He((c[i>>2]|0)+96|0,0,(c[(c[h>>2]|0)+2324>>2]|0)*5<<1|0)|0;a[(c[h>>2]|0)+2736+32>>0]=0;r=0;s=c[i>>2]|0;t=s+136|0;c[t>>2]=r;l=g;return}cd(b[(c[h>>2]|0)+2736+26>>1]|0,a[(c[h>>2]|0)+2736+28>>0]|0,c[i>>2]|0,c[(c[h>>2]|0)+2316>>2]|0,c[(c[h>>2]|0)+2324>>2]|0);c[q>>2]=c[120+(a[(c[h>>2]|0)+2736+32>>0]<<2)>>2];c[m>>2]=0;while(1){u=(c[h>>2]|0)+2736|0;if((c[m>>2]|0)>=(c[(c[h>>2]|0)+2324>>2]|0))break;c[n>>2]=a[u+4+(c[m>>2]|0)>>0];c[k>>2]=0;while(1){if((c[k>>2]|0)>=5)break;b[(c[i>>2]|0)+96+(((c[m>>2]|0)*5|0)+(c[k>>2]|0)<<1)>>1]=a[(c[q>>2]|0)+(((c[n>>2]|0)*5|0)+(c[k>>2]|0))>>0]<<7;c[k>>2]=(c[k>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}c[n>>2]=a[u+33>>0];r=b[17784+(c[n>>2]<<1)>>1]|0;s=c[i>>2]|0;t=s+136|0;c[t>>2]=r;l=g;return}function Lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=l;l=l+16|0;g=f+12|0;h=f+8|0;i=f+4|0;j=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;if((c[(c[g>>2]|0)+2316>>2]|0)!=(c[(c[g>>2]|0)+4168+80>>2]|0)){Bc(c[g>>2]|0);c[(c[g>>2]|0)+4168+80>>2]=c[(c[g>>2]|0)+2316>>2]}e=c[g>>2]|0;d=c[h>>2]|0;if(c[j>>2]|0){Tc(e,d,c[i>>2]|0);i=(c[g>>2]|0)+4160|0;c[i>>2]=(c[i>>2]|0)+1;l=f;return}else{Uc(e,d);l=f;return}}function Mc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+48|0;g=f+40|0;h=f+36|0;i=f+32|0;j=f+28|0;k=f+24|0;m=f+20|0;n=f+16|0;o=f+12|0;p=f+8|0;q=f+4|0;r=f;c[g>>2]=a;c[h>>2]=d;c[i>>2]=e;c[n>>2]=(c[g>>2]|0)+4168;if(c[(c[g>>2]|0)+4160>>2]|0){Nc((c[n>>2]|0)+60|0,(c[n>>2]|0)+64|0,c[h>>2]|0,c[i>>2]|0);s=1;t=c[n>>2]|0;u=t+48|0;c[u>>2]=s;l=f;return}a:do if(c[(c[g>>2]|0)+4168+48>>2]|0){Nc(m,k,c[h>>2]|0,c[i>>2]|0);if((c[k>>2]|0)<=(c[(c[n>>2]|0)+64>>2]|0)){if((c[k>>2]|0)<(c[(c[n>>2]|0)+64>>2]|0))c[m>>2]=c[m>>2]>>(c[(c[n>>2]|0)+64>>2]|0)-(c[k>>2]|0)}else c[(c[n>>2]|0)+60>>2]=c[(c[n>>2]|0)+60>>2]>>(c[k>>2]|0)-(c[(c[n>>2]|0)+64>>2]|0);if((c[m>>2]|0)>(c[(c[n>>2]|0)+60>>2]|0)){c[p>>2]=Oc(c[(c[n>>2]|0)+60>>2]|0)|0;c[p>>2]=(c[p>>2]|0)-1;c[(c[n>>2]|0)+60>>2]=c[(c[n>>2]|0)+60>>2]<<c[p>>2];e=c[m>>2]|0;c[m>>2]=e>>(Pc(24-(c[p>>2]|0)|0,0)|0);c[o>>2]=(c[(c[n>>2]|0)+60>>2]|0)/(((c[m>>2]|0)>1?c[m>>2]|0:1)|0)|0;c[q>>2]=(Qc(c[o>>2]|0)|0)<<4;c[r>>2]=(65536-(c[q>>2]|0)|0)/(c[i>>2]|0)|0;c[r>>2]=c[r>>2]<<2;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[i>>2]|0))break a;e=R(c[q>>2]>>16,b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0)|0;d=e+((R(c[q>>2]&65535,b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0)|0)>>16)&65535;b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]=d;c[q>>2]=(c[q>>2]|0)+(c[r>>2]|0);if((c[q>>2]|0)>65536)break a;c[j>>2]=(c[j>>2]|0)+1}}}while(0);s=0;t=c[n>>2]|0;u=t+48|0;c[u>>2]=s;l=f;return}function Nc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=l;l=l+32|0;h=g+28|0;i=g+24|0;j=g+20|0;k=g+16|0;m=g+12|0;n=g+8|0;o=g+4|0;p=g;c[h>>2]=a;c[i>>2]=d;c[j>>2]=e;c[k>>2]=f;c[p>>2]=0;c[n>>2]=0;c[k>>2]=(c[k>>2]|0)+-1;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[p>>2]=(c[p>>2]|0)+(R(b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0,b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0)|0);c[p>>2]=(c[p>>2]|0)+(R(b[(c[j>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0,b[(c[j>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0)|0);if((c[p>>2]|0)<0){q=4;break}c[m>>2]=(c[m>>2]|0)+2}if((q|0)==4){c[p>>2]=(c[p>>2]|0)>>>2;c[n>>2]=2}while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[o>>2]=R(b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0,b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(R(b[(c[j>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0,b[(c[j>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0)|0);c[p>>2]=(c[p>>2]|0)+((c[o>>2]|0)>>>(c[n>>2]|0));if((c[p>>2]|0)<0){c[p>>2]=(c[p>>2]|0)>>>2;c[n>>2]=(c[n>>2]|0)+2}c[m>>2]=(c[m>>2]|0)+2}if((c[m>>2]|0)==(c[k>>2]|0)){c[o>>2]=R(b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0,b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]|0)|0;c[p>>2]=(c[p>>2]|0)+(c[o>>2]>>c[n>>2])}if(!(c[p>>2]&-1073741824)){r=c[n>>2]|0;s=c[i>>2]|0;c[s>>2]=r;t=c[p>>2]|0;u=c[h>>2]|0;c[u>>2]=t;l=g;return}c[p>>2]=(c[p>>2]|0)>>>2;c[n>>2]=(c[n>>2]|0)+2;r=c[n>>2]|0;s=c[i>>2]|0;c[s>>2]=r;t=c[p>>2]|0;u=c[h>>2]|0;c[u>>2]=t;l=g;return}function Oc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b;c[d>>2]=a;if(!(c[d>>2]|0)){e=32;l=b;return e|0}e=32-(32-(U(c[d>>2]|0)|0))|0;l=b;return e|0}function Pc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function Qc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=l;l=l+32|0;d=b+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;c[e>>2]=a;if((c[e>>2]|0)<=0){c[d>>2]=0;i=c[d>>2]|0;l=b;return i|0}Rc(c[e>>2]|0,g,h);if(c[g>>2]&1|0)c[f>>2]=32768;else c[f>>2]=46214;c[f>>2]=c[f>>2]>>(c[g>>2]>>1);g=R(c[f>>2]>>16,(((c[h>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[f>>2]=(c[f>>2]|0)+(g+((R(c[f>>2]&65535,(((c[h>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[d>>2]=c[f>>2];i=c[d>>2]|0;l=b;return i|0}function Rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[i>>2]=Oc(c[f>>2]|0)|0;c[c[g>>2]>>2]=c[i>>2];g=(Sc(c[f>>2]|0,24-(c[i>>2]|0)|0)|0)&127;c[c[h>>2]>>2]=g;l=e;return}function Sc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+32|0;e=d+20|0;f=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=c[f>>2];c[i>>2]=c[g>>2];c[j>>2]=0-(c[g>>2]|0);if(!(c[g>>2]|0)){c[e>>2]=c[f>>2];k=c[e>>2]|0;l=d;return k|0}f=c[h>>2]|0;if((c[g>>2]|0)<0){c[e>>2]=f<<c[j>>2]|(c[h>>2]|0)>>>(32-(c[j>>2]|0)|0);k=c[e>>2]|0;l=d;return k|0}else{c[e>>2]=f<<32-(c[i>>2]|0)|(c[h>>2]|0)>>>(c[i>>2]|0);k=c[e>>2]|0;l=d;return k|0}return 0}function Tc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0;f=l;l=l+160|0;g=f+116|0;h=f+112|0;i=f+108|0;j=f+104|0;k=f+100|0;m=f+96|0;n=f+92|0;o=f+88|0;p=f+84|0;q=f+80|0;r=f+76|0;s=f+72|0;t=f+68|0;u=f+64|0;v=f+60|0;w=f+56|0;x=f+52|0;y=f+48|0;z=f+44|0;A=f+40|0;B=f+36|0;C=f+152|0;D=f+32|0;E=f+28|0;F=f+120|0;G=f+24|0;H=f+16|0;I=f+8|0;J=f+4|0;K=f;c[g>>2]=a;c[h>>2]=d;c[i>>2]=e;c[G>>2]=(c[g>>2]|0)+4168;e=(c[(c[g>>2]|0)+2336>>2]|0)+(c[(c[g>>2]|0)+2328>>2]|0)|0;c[I>>2]=da()|0;d=l;l=l+((1*(e<<2)|0)+15&-16)|0;e=l;l=l+((1*(c[(c[g>>2]|0)+2336>>2]<<1)|0)+15&-16)|0;c[H>>2]=c[(c[G>>2]|0)+72>>2]>>6;c[H+4>>2]=c[(c[G>>2]|0)+72+4>>2]>>6;if(c[(c[g>>2]|0)+2376>>2]|0){L=(c[G>>2]|0)+14|0;M=L+32|0;do{b[L>>1]=0;L=L+2|0}while((L|0)<(M|0))}Vc(w,q,x,r,(c[g>>2]|0)+4|0,H,c[(c[g>>2]|0)+2332>>2]|0,c[(c[g>>2]|0)+2324>>2]|0);a=(c[g>>2]|0)+4|0;N=c[(c[G>>2]|0)+84>>2]|0;if((c[w>>2]>>c[r>>2]|0)<(c[x>>2]>>c[q>>2]|0))c[y>>2]=a+((Wc(0,(R(N-1|0,c[(c[G>>2]|0)+88>>2]|0)|0)-128|0)|0)<<2);else c[y>>2]=a+((Wc(0,(R(N,c[(c[G>>2]|0)+88>>2]|0)|0)-128|0)|0)<<2);c[D>>2]=(c[G>>2]|0)+4;b[C>>1]=b[(c[G>>2]|0)+56>>1]|0;c[t>>2]=b[20502+((Xc(1,c[(c[g>>2]|0)+4160>>2]|0)|0)<<1)>>1];N=(c[(c[g>>2]|0)+4164>>2]|0)==2;a=Xc(1,c[(c[g>>2]|0)+4160>>2]|0)|0;if(N)c[u>>2]=b[20506+(a<<1)>>1];else c[u>>2]=b[20510+(a<<1)>>1];Yc((c[G>>2]|0)+14|0,c[(c[g>>2]|0)+2340>>2]|0,64881);Ie(F|0,(c[G>>2]|0)+14|0,c[(c[g>>2]|0)+2340>>2]<<1|0)|0;do if(!(c[(c[g>>2]|0)+4160>>2]|0)){b[C>>1]=16384;if((c[(c[g>>2]|0)+4164>>2]|0)!=2){c[J>>2]=vc((c[G>>2]|0)+14|0,c[(c[g>>2]|0)+2340>>2]|0)|0;c[K>>2]=_c(134217728,c[J>>2]|0)|0;c[K>>2]=Pc(4194304,c[K>>2]|0)|0;c[K>>2]=c[K>>2]<<3;a=R(c[K>>2]>>16,(c[u>>2]&65535)<<16>>16)|0;c[u>>2]=a+((R(c[K>>2]&65535,(c[u>>2]&65535)<<16>>16)|0)>>16)>>14;break}c[j>>2]=0;while(1){if((c[j>>2]|0)>=5)break;b[C>>1]=(b[C>>1]|0)-(b[(c[D>>2]|0)+(c[j>>2]<<1)>>1]|0);c[j>>2]=(c[j>>2]|0)+1}b[C>>1]=Zc(3277,b[C>>1]|0)|0;b[C>>1]=(R(b[C>>1]|0,b[(c[G>>2]|0)+68>>1]|0)|0)>>14}while(0);c[s>>2]=c[(c[G>>2]|0)+52>>2];c[n>>2]=(c[c[G>>2]>>2]>>7)+1>>1;c[p>>2]=c[(c[g>>2]|0)+2336>>2];c[o>>2]=(c[(c[g>>2]|0)+2336>>2]|0)-(c[n>>2]|0)-(c[(c[g>>2]|0)+2340>>2]|0)-2;Fc(e+(c[o>>2]<<1)|0,(c[g>>2]|0)+1348+(c[o>>2]<<1)|0,F,(c[(c[g>>2]|0)+2336>>2]|0)-(c[o>>2]|0)|0,c[(c[g>>2]|0)+2340>>2]|0);c[v>>2]=$c(c[(c[G>>2]|0)+72+4>>2]|0,46)|0;c[v>>2]=(c[v>>2]|0)<1073741823?c[v>>2]|0:1073741823;c[j>>2]=(c[o>>2]|0)+(c[(c[g>>2]|0)+2340>>2]|0);while(1){if((c[j>>2]|0)>=(c[(c[g>>2]|0)+2336>>2]|0))break;K=R(c[v>>2]>>16,b[e+(c[j>>2]<<1)>>1]|0)|0;J=K+((R(c[v>>2]&65535,b[e+(c[j>>2]<<1)>>1]|0)|0)>>16)|0;c[d+(c[j>>2]<<2)>>2]=J;c[j>>2]=(c[j>>2]|0)+1}c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[(c[g>>2]|0)+2324>>2]|0))break;c[z>>2]=d+((c[p>>2]|0)-(c[n>>2]|0)+2<<2);c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[(c[g>>2]|0)+2332>>2]|0))break;c[B>>2]=2;e=R(c[c[z>>2]>>2]>>16,b[c[D>>2]>>1]|0)|0;c[B>>2]=(c[B>>2]|0)+(e+((R(c[c[z>>2]>>2]&65535,b[c[D>>2]>>1]|0)|0)>>16));e=R(c[(c[z>>2]|0)+-4>>2]>>16,b[(c[D>>2]|0)+2>>1]|0)|0;c[B>>2]=(c[B>>2]|0)+(e+((R(c[(c[z>>2]|0)+-4>>2]&65535,b[(c[D>>2]|0)+2>>1]|0)|0)>>16));e=R(c[(c[z>>2]|0)+-8>>2]>>16,b[(c[D>>2]|0)+4>>1]|0)|0;c[B>>2]=(c[B>>2]|0)+(e+((R(c[(c[z>>2]|0)+-8>>2]&65535,b[(c[D>>2]|0)+4>>1]|0)|0)>>16));e=R(c[(c[z>>2]|0)+-12>>2]>>16,b[(c[D>>2]|0)+6>>1]|0)|0;c[B>>2]=(c[B>>2]|0)+(e+((R(c[(c[z>>2]|0)+-12>>2]&65535,b[(c[D>>2]|0)+6>>1]|0)|0)>>16));e=R(c[(c[z>>2]|0)+-16>>2]>>16,b[(c[D>>2]|0)+8>>1]|0)|0;c[B>>2]=(c[B>>2]|0)+(e+((R(c[(c[z>>2]|0)+-16>>2]&65535,b[(c[D>>2]|0)+8>>1]|0)|0)>>16));c[z>>2]=(c[z>>2]|0)+4;c[s>>2]=907633515+(R(c[s>>2]|0,196314165)|0);c[o>>2]=c[s>>2]>>25&127;e=R(c[(c[y>>2]|0)+(c[o>>2]<<2)>>2]>>16,b[C>>1]|0)|0;v=(c[B>>2]|0)+(e+((R(c[(c[y>>2]|0)+(c[o>>2]<<2)>>2]&65535,b[C>>1]|0)|0)>>16))<<2;c[d+(c[p>>2]<<2)>>2]=v;c[p>>2]=(c[p>>2]|0)+1;c[j>>2]=(c[j>>2]|0)+1}c[k>>2]=0;while(1){if((c[k>>2]|0)>=5)break;v=(R((c[t>>2]&65535)<<16>>16,b[(c[D>>2]|0)+(c[k>>2]<<1)>>1]|0)|0)>>15&65535;b[(c[D>>2]|0)+(c[k>>2]<<1)>>1]=v;c[k>>2]=(c[k>>2]|0)+1}b[C>>1]=(R(b[C>>1]|0,(c[u>>2]&65535)<<16>>16)|0)>>15;c[c[G>>2]>>2]=(c[c[G>>2]>>2]|0)+(((c[c[G>>2]>>2]>>16)*655|0)+((c[c[G>>2]>>2]&65535)*655>>16));v=_c(c[c[G>>2]>>2]|0,((c[(c[g>>2]|0)+2316>>2]&65535)<<16>>16)*18<<8)|0;c[c[G>>2]>>2]=v;c[n>>2]=(c[c[G>>2]>>2]>>7)+1>>1;c[m>>2]=(c[m>>2]|0)+1}c[E>>2]=d+((c[(c[g>>2]|0)+2336>>2]|0)-16<<2);L=c[E>>2]|0;d=(c[g>>2]|0)+1284|0;M=L+64|0;do{c[L>>2]=c[d>>2];L=L+4|0;d=d+4|0}while((L|0)<(M|0));c[j>>2]=0;while(1){O=c[g>>2]|0;if((c[j>>2]|0)>=(c[(c[g>>2]|0)+2328>>2]|0))break;c[A>>2]=c[O+2340>>2]>>1;m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-1<<2)>>2]>>16,b[F>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-1<<2)>>2]&65535,b[F>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-2<<2)>>2]>>16,b[F+2>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-2<<2)>>2]&65535,b[F+2>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-3<<2)>>2]>>16,b[F+4>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-3<<2)>>2]&65535,b[F+4>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-4<<2)>>2]>>16,b[F+6>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-4<<2)>>2]&65535,b[F+6>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-5<<2)>>2]>>16,b[F+8>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-5<<2)>>2]&65535,b[F+8>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-6<<2)>>2]>>16,b[F+10>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-6<<2)>>2]&65535,b[F+10>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-7<<2)>>2]>>16,b[F+12>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-7<<2)>>2]&65535,b[F+12>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-8<<2)>>2]>>16,b[F+14>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-8<<2)>>2]&65535,b[F+14>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-9<<2)>>2]>>16,b[F+16>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-9<<2)>>2]&65535,b[F+16>>1]|0)|0)>>16));m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-10<<2)>>2]>>16,b[F+18>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-10<<2)>>2]&65535,b[F+18>>1]|0)|0)>>16));c[k>>2]=10;while(1){if((c[k>>2]|0)>=(c[(c[g>>2]|0)+2340>>2]|0))break;m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-(c[k>>2]|0)-1<<2)>>2]>>16,b[F+(c[k>>2]<<1)>>1]|0)|0;c[A>>2]=(c[A>>2]|0)+(m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)-(c[k>>2]|0)-1<<2)>>2]&65535,b[F+(c[k>>2]<<1)>>1]|0)|0)>>16));c[k>>2]=(c[k>>2]|0)+1}c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]=(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0)+(c[A>>2]<<4);m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;u=m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((u+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){u=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;m=u+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((m+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)P=-32768;else{m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;u=m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;P=(u+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1}}else P=32767;if((P|0)<=32767){u=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;m=u+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((m+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;u=m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((u+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)Q=-32768;else{u=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;m=u+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;Q=(m+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1}}else Q=32767;if((Q|0)>=-32768){m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;u=m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((u+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){u=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;m=u+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((m+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)S=-32768;else{m=R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]>>16,(c[H+4>>2]&65535)<<16>>16)|0;u=m+((R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]&65535,(c[H+4>>2]&65535)<<16>>16)|0)>>16)|0;S=(u+(R(c[(c[E>>2]|0)+(16+(c[j>>2]|0)<<2)>>2]|0,(c[H+4>>2]>>15)+1>>1)|0)>>7)+1>>1}}else S=32767}else S=-32768}else S=32767;b[(c[i>>2]|0)+(c[j>>2]<<1)>>1]=S;c[j>>2]=(c[j>>2]|0)+1}L=O+1284|0;d=(c[E>>2]|0)+(c[(c[g>>2]|0)+2328>>2]<<2)|0;M=L+64|0;do{c[L>>2]=c[d>>2];L=L+4|0;d=d+4|0}while((L|0)<(M|0));c[(c[G>>2]|0)+52>>2]=c[s>>2];b[(c[G>>2]|0)+56>>1]=b[C>>1]|0;c[j>>2]=0;while(1){if((c[j>>2]|0)>=4)break;c[(c[h>>2]|0)+(c[j>>2]<<2)>>2]=c[n>>2];c[j>>2]=(c[j>>2]|0)+1}ga(c[I>>2]|0);l=f;return}function Uc(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;f=l;l=l+48|0;g=f+40|0;h=f+36|0;i=f+32|0;j=f+28|0;k=f+24|0;m=f+20|0;n=f+16|0;o=f+12|0;p=f+8|0;q=f+4|0;r=f;c[g>>2]=d;c[h>>2]=e;c[n>>2]=(c[g>>2]|0)+4168;c[(c[g>>2]|0)+4164>>2]=a[(c[g>>2]|0)+2736+29>>0];c[i>>2]=0;a:do if((a[(c[g>>2]|0)+2736+29>>0]|0)==2){c[m>>2]=0;while(1){e=R(c[m>>2]|0,c[(c[g>>2]|0)+2332>>2]|0)|0;if((e|0)>=(c[(c[h>>2]|0)+((c[(c[g>>2]|0)+2324>>2]|0)-1<<2)>>2]|0))break;if((c[m>>2]|0)==(c[(c[g>>2]|0)+2324>>2]|0))break;c[j>>2]=0;c[k>>2]=0;while(1){if((c[k>>2]|0)>=5)break;c[j>>2]=(c[j>>2]|0)+(b[(c[h>>2]|0)+96+((((c[(c[g>>2]|0)+2324>>2]|0)-1-(c[m>>2]|0)|0)*5|0)+(c[k>>2]|0)<<1)>>1]|0);c[k>>2]=(c[k>>2]|0)+1}if((c[j>>2]|0)>(c[i>>2]|0)){c[i>>2]=c[j>>2];e=(c[n>>2]|0)+4|0;d=(c[h>>2]|0)+96+((((c[(c[g>>2]|0)+2324>>2]|0)-1-(c[m>>2]|0)&65535)<<16>>16)*5<<1)|0;b[e>>1]=b[d>>1]|0;b[e+2>>1]=b[d+2>>1]|0;b[e+4>>1]=b[d+4>>1]|0;b[e+6>>1]=b[d+6>>1]|0;b[e+8>>1]=b[d+8>>1]|0;c[c[n>>2]>>2]=c[(c[h>>2]|0)+((c[(c[g>>2]|0)+2324>>2]|0)-1-(c[m>>2]|0)<<2)>>2]<<8}c[m>>2]=(c[m>>2]|0)+1}d=(c[n>>2]|0)+4|0;c[d>>2]=0;c[d+4>>2]=0;b[d+8>>1]=0;b[(c[n>>2]|0)+4+4>>1]=c[i>>2];if((c[i>>2]|0)<11469){c[p>>2]=11744256;c[o>>2]=(c[p>>2]|0)/(((c[i>>2]|0)>1?c[i>>2]|0:1)|0)|0;c[k>>2]=0;while(1){if((c[k>>2]|0)>=5)break a;d=(R(b[(c[n>>2]|0)+4+(c[k>>2]<<1)>>1]|0,(c[o>>2]&65535)<<16>>16)|0)>>10&65535;b[(c[n>>2]|0)+4+(c[k>>2]<<1)>>1]=d;c[k>>2]=(c[k>>2]|0)+1}}if((c[i>>2]|0)>15565){c[r>>2]=255016960;c[q>>2]=(c[r>>2]|0)/(((c[i>>2]|0)>1?c[i>>2]|0:1)|0)|0;c[k>>2]=0;while(1){if((c[k>>2]|0)>=5)break a;d=(R(b[(c[n>>2]|0)+4+(c[k>>2]<<1)>>1]|0,(c[q>>2]&65535)<<16>>16)|0)>>14&65535;b[(c[n>>2]|0)+4+(c[k>>2]<<1)>>1]=d;c[k>>2]=(c[k>>2]|0)+1}}}else{c[c[n>>2]>>2]=((c[(c[g>>2]|0)+2316>>2]&65535)<<16>>16)*18<<8;d=(c[n>>2]|0)+4|0;c[d>>2]=0;c[d+4>>2]=0;b[d+8>>1]=0}while(0);Ie((c[n>>2]|0)+14|0,(c[h>>2]|0)+32+32|0,c[(c[g>>2]|0)+2340>>2]<<1|0)|0;b[(c[n>>2]|0)+68>>1]=c[(c[h>>2]|0)+136>>2];k=(c[n>>2]|0)+72|0;q=(c[h>>2]|0)+16+((c[(c[g>>2]|0)+2324>>2]|0)-2<<2)|0;c[k>>2]=c[q>>2];c[k+4>>2]=c[q+4>>2];c[(c[n>>2]|0)+88>>2]=c[(c[g>>2]|0)+2332>>2];c[(c[n>>2]|0)+84>>2]=c[(c[g>>2]|0)+2324>>2];l=f;return}function Vc(a,d,e,f,g,h,i,j){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;k=l;l=l+48|0;m=k+44|0;n=k+40|0;o=k+36|0;p=k+32|0;q=k+28|0;r=k+24|0;s=k+20|0;t=k+16|0;u=k+12|0;v=k+8|0;w=k+4|0;x=k;c[m>>2]=a;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=g;c[r>>2]=h;c[s>>2]=i;c[t>>2]=j;j=c[s>>2]<<1;c[x>>2]=da()|0;i=l;l=l+((1*(j<<1)|0)+15&-16)|0;c[w>>2]=i;c[v>>2]=0;while(1){if((c[v>>2]|0)>=2)break;c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[s>>2]|0))break;j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]>>16;h=R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]&65535)<<16>>16)|0;j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]&65535;g=h+((R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]|0;if((g+(R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]>>15)+1>>1)|0)>>8|0)<=32767){j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]>>16;g=R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]&65535)<<16>>16)|0;j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]&65535;h=g+((R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]|0;if((h+(R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]>>15)+1>>1)|0)>>8|0)<-32768)y=-32768;else{j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]>>16;h=R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]&65535)<<16>>16)|0;j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]&65535;g=h+((R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;j=c[(c[q>>2]|0)+((c[u>>2]|0)+(R((c[v>>2]|0)+(c[t>>2]|0)-2|0,c[s>>2]|0)|0)<<2)>>2]|0;y=g+(R(j,(c[(c[r>>2]|0)+(c[v>>2]<<2)>>2]>>15)+1>>1)|0)>>8}}else y=32767;b[(c[w>>2]|0)+(c[u>>2]<<1)>>1]=y;c[u>>2]=(c[u>>2]|0)+1}c[w>>2]=(c[w>>2]|0)+(c[s>>2]<<1);c[v>>2]=(c[v>>2]|0)+1}Nc(c[m>>2]|0,c[n>>2]|0,i,c[s>>2]|0);Nc(c[o>>2]|0,c[p>>2]|0,i+(c[s>>2]<<1)|0,c[s>>2]|0);ga(c[x>>2]|0);l=k;return}function Wc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function Xc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)<(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function Yc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[g>>2]=a;c[h>>2]=d;c[i>>2]=e;c[k>>2]=(c[i>>2]|0)-65536;c[j>>2]=0;while(1){m=c[i>>2]|0;n=c[g>>2]|0;if((c[j>>2]|0)>=((c[h>>2]|0)-1|0))break;e=((R(m,b[n+(c[j>>2]<<1)>>1]|0)|0)>>15)+1>>1&65535;b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]=e;e=((R(c[i>>2]|0,c[k>>2]|0)|0)>>15)+1>>1;c[i>>2]=(c[i>>2]|0)+e;c[j>>2]=(c[j>>2]|0)+1}j=((R(m,b[n+((c[h>>2]|0)-1<<1)>>1]|0)|0)>>15)+1>>1&65535;b[(c[g>>2]|0)+((c[h>>2]|0)-1<<1)>>1]=j;l=f;return}function Zc(a,c){a=a|0;c=c|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+2|0;f=d;b[e>>1]=a;b[f>>1]=c;l=d;return ((b[e>>1]|0)>(b[f>>1]|0)?b[e>>1]|0:b[f>>1]|0)&65535|0}function _c(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)<(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function $c(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+48|0;e=d+32|0;f=d+28|0;g=d+24|0;h=d+20|0;i=d+16|0;j=d+12|0;k=d+8|0;m=d+4|0;n=d;c[f>>2]=a;c[g>>2]=b;b=c[f>>2]|0;c[h>>2]=(Oc((c[f>>2]|0)>0?b:0-b|0)|0)-1;c[k>>2]=c[f>>2]<<c[h>>2];c[j>>2]=536870911/(c[k>>2]>>16|0)|0;c[n>>2]=c[j>>2]<<16;f=R(c[k>>2]>>16,(c[j>>2]&65535)<<16>>16)|0;c[m>>2]=536870912-(f+((R(c[k>>2]&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))<<3;k=R(c[m>>2]>>16,(c[j>>2]&65535)<<16>>16)|0;f=(c[n>>2]|0)+(k+((R(c[m>>2]&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))|0;c[n>>2]=f+(R(c[m>>2]|0,(c[j>>2]>>15)+1>>1)|0);c[i>>2]=61-(c[h>>2]|0)-(c[g>>2]|0);g=c[i>>2]|0;if((c[i>>2]|0)>0)if((g|0)<32){c[e>>2]=c[n>>2]>>c[i>>2];o=c[e>>2]|0;l=d;return o|0}else{c[e>>2]=0;o=c[e>>2]|0;l=d;return o|0}h=c[n>>2]|0;j=0-(c[i>>2]|0)|0;do if((-2147483648>>0-g|0)>(2147483647>>0-(c[i>>2]|0)|0)){if((h|0)>(-2147483648>>j|0)){p=-2147483648>>0-(c[i>>2]|0);break}if((c[n>>2]|0)<(2147483647>>0-(c[i>>2]|0)|0)){p=2147483647>>0-(c[i>>2]|0);break}else{p=c[n>>2]|0;break}}else{if((h|0)>(2147483647>>j|0)){p=2147483647>>0-(c[i>>2]|0);break}if((c[n>>2]|0)<(-2147483648>>0-(c[i>>2]|0)|0)){p=-2147483648>>0-(c[i>>2]|0);break}else{p=c[n>>2]|0;break}}while(0);c[e>>2]=p<<0-(c[i>>2]|0);o=c[e>>2]|0;l=d;return o|0}function ad(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=l;l=l+32|0;i=h+28|0;j=h+24|0;k=h+20|0;m=h+16|0;n=h+12|0;o=h+8|0;p=h+4|0;q=h;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[n>>2]|0))break;g=a[(c[j>>2]|0)+(c[o>>2]|0)>>0]|0;if((c[o>>2]|0)==0&(c[m>>2]|0)==0){f=(qd(g,(a[c[k>>2]>>0]|0)-16|0)|0)&255;a[c[k>>2]>>0]=f}else{c[p>>2]=g+-4;c[q>>2]=8+(a[c[k>>2]>>0]|0);g=c[p>>2]|0;if((c[p>>2]|0)>(c[q>>2]|0)){r=(g<<1)-(c[q>>2]|0)|0;s=c[k>>2]|0}else{r=g;s=c[k>>2]|0}a[s>>0]=(a[s>>0]|0)+r}if((a[c[k>>2]>>0]|0)<=63)if((a[c[k>>2]>>0]|0)<0)t=0;else t=a[c[k>>2]>>0]|0;else t=63;a[c[k>>2]>>0]=t;g=sd(rd(((a[c[k>>2]>>0]<<16>>16)*29|0)+((a[c[k>>2]>>0]<<16>>16)*7281>>16)+2090|0,3967)|0)|0;c[(c[i>>2]|0)+(c[o>>2]<<2)>>2]=g;c[o>>2]=(c[o>>2]|0)+1}l=h;return}function bd(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=l;l=l+144|0;i=h+24|0;j=h+20|0;k=h+16|0;m=h+12|0;n=h+128|0;o=h+96|0;p=h+64|0;q=h+32|0;r=h+8|0;s=h+4|0;t=h;c[i>>2]=e;c[j>>2]=f;c[k>>2]=g;c[t>>2]=(c[(c[k>>2]|0)+8>>2]|0)+(R(a[c[j>>2]>>0]|0,b[(c[k>>2]|0)+2>>1]|0)|0);c[m>>2]=0;while(1){if((c[m>>2]|0)>=(b[(c[k>>2]|0)+2>>1]|0))break;b[(c[i>>2]|0)+(c[m>>2]<<1)>>1]=d[(c[t>>2]|0)+(c[m>>2]|0)>>0]<<7;c[m>>2]=(c[m>>2]|0)+1}dd(o,n,c[k>>2]|0,a[c[j>>2]>>0]|0);ed(p,(c[j>>2]|0)+1|0,n,b[(c[k>>2]|0)+4>>1]|0,b[(c[k>>2]|0)+2>>1]|0);fd(q,c[i>>2]|0,b[(c[k>>2]|0)+2>>1]|0);c[m>>2]=0;while(1){if((c[m>>2]|0)>=(b[(c[k>>2]|0)+2>>1]|0))break;c[r>>2]=gd(b[q+(c[m>>2]<<1)>>1]<<16)|0;c[s>>2]=(b[(c[i>>2]|0)+(c[m>>2]<<1)>>1]|0)+((b[p+(c[m>>2]<<1)>>1]<<14|0)/(c[r>>2]|0)|0);if((c[s>>2]|0)>32767)u=32767;else u=(c[s>>2]|0)<0?0:c[s>>2]|0;b[(c[i>>2]|0)+(c[m>>2]<<1)>>1]=u;c[m>>2]=(c[m>>2]|0)+1}hd(c[i>>2]|0,c[(c[k>>2]|0)+32>>2]|0,b[(c[k>>2]|0)+2>>1]|0);l=h;return}\nfunction cd(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;i=l;l=l+48|0;j=i+36|0;k=i+38|0;m=i+32|0;n=i+28|0;o=i+24|0;p=i+20|0;q=i+16|0;r=i+12|0;s=i+8|0;t=i+4|0;u=i;b[j>>1]=d;a[k>>0]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=h;h=(c[o>>2]|0)==4;do if((c[n>>2]|0)==8)if(h){c[u>>2]=23768;c[t>>2]=11;break}else{c[u>>2]=23738;c[t>>2]=3;break}else if(h){c[u>>2]=23812;c[t>>2]=34;break}else{c[u>>2]=23744;c[t>>2]=12;break}while(0);c[r>>2]=(c[n>>2]&65535)<<16>>16<<1;c[s>>2]=((c[n>>2]&65535)<<16>>16)*18;c[p>>2]=(c[r>>2]|0)+(b[j>>1]|0);c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;j=R(c[q>>2]|0,c[t>>2]|0)|0;c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=(c[p>>2]|0)+(a[(c[u>>2]|0)+(j+(a[k>>0]|0))>>0]|0);j=c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0;do if((c[r>>2]|0)>(c[s>>2]|0)){if((j|0)>(c[r>>2]|0)){v=c[r>>2]|0;break}if((c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0)<(c[s>>2]|0)){v=c[s>>2]|0;break}else{v=c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0;break}}else{if((j|0)>(c[s>>2]|0)){v=c[s>>2]|0;break}if((c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0)<(c[r>>2]|0)){v=c[r>>2]|0;break}else{v=c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0;break}}while(0);c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=v;c[q>>2]=(c[q>>2]|0)+1}l=i;return}function dd(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;i=l;l=l+32|0;j=i+20|0;k=i+16|0;m=i+12|0;n=i+8|0;o=i+4|0;p=i+24|0;q=i;c[j>>2]=e;c[k>>2]=f;c[m>>2]=g;c[n>>2]=h;c[q>>2]=(c[(c[m>>2]|0)+20>>2]|0)+((R(c[n>>2]|0,b[(c[m>>2]|0)+2>>1]|0)|0)/2|0);c[o>>2]=0;while(1){if((c[o>>2]|0)>=(b[(c[m>>2]|0)+2>>1]|0))break;n=c[q>>2]|0;c[q>>2]=n+1;a[p>>0]=a[n>>0]|0;b[(c[j>>2]|0)+(c[o>>2]<<1)>>1]=((d[p>>0]>>1&7)<<16>>16)*9;n=a[(c[(c[m>>2]|0)+16>>2]|0)+((c[o>>2]|0)+(R(d[p>>0]&1,(b[(c[m>>2]|0)+2>>1]|0)-1|0)|0))>>0]|0;a[(c[k>>2]|0)+(c[o>>2]|0)>>0]=n;b[(c[j>>2]|0)+((c[o>>2]|0)+1<<1)>>1]=((d[p>>0]>>5&7)<<16>>16)*9;n=a[(c[(c[m>>2]|0)+16>>2]|0)+((c[o>>2]|0)+(R(d[p>>0]>>4&1,(b[(c[m>>2]|0)+2>>1]|0)-1|0)|0)+1)>>0]|0;a[(c[k>>2]|0)+((c[o>>2]|0)+1)>>0]=n;c[o>>2]=(c[o>>2]|0)+2}l=i;return}function ed(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=l;l=l+32|0;k=j+24|0;m=j+20|0;n=j+16|0;o=j+12|0;p=j+28|0;q=j+8|0;r=j+4|0;s=j;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=h;b[p>>1]=i;c[r>>2]=0;c[q>>2]=(b[p>>1]|0)-1;while(1){if((c[q>>2]|0)<0)break;c[s>>2]=(R((c[r>>2]&65535)<<16>>16,d[(c[n>>2]|0)+(c[q>>2]|0)>>0]|0)|0)>>8;c[r>>2]=a[(c[m>>2]|0)+(c[q>>2]|0)>>0]<<10;p=c[r>>2]|0;if((c[r>>2]|0)<=0){if((p|0)<0)c[r>>2]=(c[r>>2]|0)+102}else c[r>>2]=p-102;p=R(c[r>>2]>>16,(c[o>>2]&65535)<<16>>16)|0;c[r>>2]=(c[s>>2]|0)+(p+((R(c[r>>2]&65535,(c[o>>2]&65535)<<16>>16)|0)>>16));b[(c[k>>2]|0)+(c[q>>2]<<1)>>1]=c[r>>2];c[q>>2]=(c[q>>2]|0)+-1}l=j;return}function fd(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[g>>2]=a;c[h>>2]=d;c[i>>2]=e;c[k>>2]=od(b[c[h>>2]>>1]|0,1)|0;c[k>>2]=131072/(c[k>>2]|0)|0;c[m>>2]=od((b[(c[h>>2]|0)+2>>1]|0)-(b[c[h>>2]>>1]|0)|0,1)|0;c[m>>2]=131072/(c[m>>2]|0)|0;e=(pd((c[k>>2]|0)+(c[m>>2]|0)|0,32767)|0)&65535;b[c[g>>2]>>1]=e;c[j>>2]=1;while(1){n=c[h>>2]|0;if((c[j>>2]|0)>=((c[i>>2]|0)-1|0))break;c[k>>2]=od((b[n+((c[j>>2]|0)+1<<1)>>1]|0)-(b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0)|0,1)|0;c[k>>2]=131072/(c[k>>2]|0)|0;e=(pd((c[k>>2]|0)+(c[m>>2]|0)|0,32767)|0)&65535;b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]=e;c[m>>2]=od((b[(c[h>>2]|0)+((c[j>>2]|0)+2<<1)>>1]|0)-(b[(c[h>>2]|0)+((c[j>>2]|0)+1<<1)>>1]|0)|0,1)|0;c[m>>2]=131072/(c[m>>2]|0)|0;e=(pd((c[k>>2]|0)+(c[m>>2]|0)|0,32767)|0)&65535;b[(c[g>>2]|0)+((c[j>>2]|0)+1<<1)>>1]=e;c[j>>2]=(c[j>>2]|0)+2}c[k>>2]=od(32768-(b[n+((c[i>>2]|0)-1<<1)>>1]|0)|0,1)|0;c[k>>2]=131072/(c[k>>2]|0)|0;n=(pd((c[k>>2]|0)+(c[m>>2]|0)|0,32767)|0)&65535;b[(c[g>>2]|0)+((c[i>>2]|0)-1<<1)>>1]=n;l=f;return}function gd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=l;l=l+32|0;d=b+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;c[e>>2]=a;if((c[e>>2]|0)<=0){c[d>>2]=0;i=c[d>>2]|0;l=b;return i|0}ld(c[e>>2]|0,g,h);if(c[g>>2]&1|0)c[f>>2]=32768;else c[f>>2]=46214;c[f>>2]=c[f>>2]>>(c[g>>2]>>1);g=R(c[f>>2]>>16,(((c[h>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[f>>2]=(c[f>>2]|0)+(g+((R(c[f>>2]&65535,(((c[h>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[d>>2]=c[f>>2];i=c[d>>2]|0;l=b;return i|0}function hd(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=l;l=l+48|0;g=f+40|0;h=f+36|0;i=f+32|0;j=f+28|0;k=f+24|0;m=f+20|0;n=f+16|0;o=f+44|0;p=f+12|0;q=f+8|0;r=f+4|0;s=f;c[g>>2]=a;c[h>>2]=d;c[i>>2]=e;c[k>>2]=0;c[n>>2]=0;while(1){if((c[n>>2]|0)>=20)break;c[q>>2]=(b[c[g>>2]>>1]|0)-(b[c[h>>2]>>1]|0);c[k>>2]=0;c[j>>2]=1;while(1){t=c[g>>2]|0;if((c[j>>2]|0)>((c[i>>2]|0)-1|0))break;c[p>>2]=(b[t+(c[j>>2]<<1)>>1]|0)-((b[(c[g>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0));if((c[p>>2]|0)<(c[q>>2]|0)){c[q>>2]=c[p>>2];c[k>>2]=c[j>>2]}c[j>>2]=(c[j>>2]|0)+1}c[p>>2]=32768-((b[t+((c[i>>2]|0)-1<<1)>>1]|0)+(b[(c[h>>2]|0)+(c[i>>2]<<1)>>1]|0));if((c[p>>2]|0)<(c[q>>2]|0)){c[q>>2]=c[p>>2];c[k>>2]=c[i>>2]}if((c[q>>2]|0)>=0){u=42;break}if(!(c[k>>2]|0))b[c[g>>2]>>1]=b[c[h>>2]>>1]|0;else{if((c[k>>2]|0)==(c[i>>2]|0)){v=(c[g>>2]|0)+((c[i>>2]|0)-1<<1)|0;w=32768-(b[(c[h>>2]|0)+(c[i>>2]<<1)>>1]|0)&65535}else{c[r>>2]=0;c[m>>2]=0;while(1){x=c[h>>2]|0;if((c[m>>2]|0)>=(c[k>>2]|0))break;c[r>>2]=(c[r>>2]|0)+(b[x+(c[m>>2]<<1)>>1]|0);c[m>>2]=(c[m>>2]|0)+1}c[r>>2]=(c[r>>2]|0)+(b[x+(c[k>>2]<<1)>>1]>>1);c[s>>2]=32768;c[m>>2]=c[i>>2];while(1){y=c[h>>2]|0;if((c[m>>2]|0)<=(c[k>>2]|0))break;c[s>>2]=(c[s>>2]|0)-(b[y+(c[m>>2]<<1)>>1]|0);c[m>>2]=(c[m>>2]|0)+-1}c[s>>2]=(c[s>>2]|0)-(b[y+(c[k>>2]<<1)>>1]>>1);e=((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)>>1)+((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)&1)|0;do if((c[r>>2]|0)>(c[s>>2]|0)){if((e|0)>(c[r>>2]|0)){z=c[r>>2]|0;break}if((((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)>>1)+((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)&1)|0)<(c[s>>2]|0)){z=c[s>>2]|0;break}else{z=((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)>>1)+((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)&1)|0;break}}else{if((e|0)>(c[s>>2]|0)){z=c[s>>2]|0;break}if((((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)>>1)+((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)&1)|0)<(c[r>>2]|0)){z=c[r>>2]|0;break}else{z=((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)>>1)+((b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[k>>2]<<1)>>1]|0)&1)|0;break}}while(0);b[o>>1]=z;b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]=(b[o>>1]|0)-(b[(c[h>>2]|0)+(c[k>>2]<<1)>>1]>>1);v=(c[g>>2]|0)+(c[k>>2]<<1)|0;w=(b[(c[g>>2]|0)+((c[k>>2]|0)-1<<1)>>1]|0)+(b[(c[h>>2]|0)+(c[k>>2]<<1)>>1]|0)&65535}b[v>>1]=w}c[n>>2]=(c[n>>2]|0)+1}if((u|0)==42){l=f;return}if((c[n>>2]|0)!=20){l=f;return}id(c[g>>2]|0,c[i>>2]|0);n=(jd(b[c[g>>2]>>1]|0,b[c[h>>2]>>1]|0)|0)&65535;b[c[g>>2]>>1]=n;c[j>>2]=1;while(1){A=c[g>>2]|0;if((c[j>>2]|0)>=(c[i>>2]|0))break;n=(jd(b[A+(c[j>>2]<<1)>>1]|0,(b[(c[g>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0)|0)|0)&65535;b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]=n;c[j>>2]=(c[j>>2]|0)+1}n=(kd(b[A+((c[i>>2]|0)-1<<1)>>1]|0,32768-(b[(c[h>>2]|0)+(c[i>>2]<<1)>>1]|0)|0)|0)&65535;b[(c[g>>2]|0)+((c[i>>2]|0)-1<<1)>>1]=n;c[j>>2]=(c[i>>2]|0)-2;while(1){if((c[j>>2]|0)<0)break;i=(kd(b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]|0,(b[(c[g>>2]|0)+((c[j>>2]|0)+1<<1)>>1]|0)-(b[(c[h>>2]|0)+((c[j>>2]|0)+1<<1)>>1]|0)|0)|0)&65535;b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]=i;c[j>>2]=(c[j>>2]|0)+-1}l=f;return}function id(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[f>>2]=a;c[g>>2]=d;c[i>>2]=1;while(1){if((c[i>>2]|0)>=(c[g>>2]|0))break;c[h>>2]=b[(c[f>>2]|0)+(c[i>>2]<<1)>>1];c[j>>2]=(c[i>>2]|0)-1;while(1){if((c[j>>2]|0)<0)break;if((c[h>>2]|0)>=(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0))break;b[(c[f>>2]|0)+((c[j>>2]|0)+1<<1)>>1]=b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0;c[j>>2]=(c[j>>2]|0)+-1}b[(c[f>>2]|0)+((c[j>>2]|0)+1<<1)>>1]=c[h>>2];c[i>>2]=(c[i>>2]|0)+1}l=e;return}function jd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function kd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)<(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function ld(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[i>>2]=md(c[f>>2]|0)|0;c[c[g>>2]>>2]=c[i>>2];g=(nd(c[f>>2]|0,24-(c[i>>2]|0)|0)|0)&127;c[c[h>>2]>>2]=g;l=e;return}function md(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b;c[d>>2]=a;if(!(c[d>>2]|0)){e=32;l=b;return e|0}e=32-(32-(U(c[d>>2]|0)|0))|0;l=b;return e|0}function nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+32|0;e=d+20|0;f=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=c[f>>2];c[i>>2]=c[g>>2];c[j>>2]=0-(c[g>>2]|0);if(!(c[g>>2]|0)){c[e>>2]=c[f>>2];k=c[e>>2]|0;l=d;return k|0}f=c[h>>2]|0;if((c[g>>2]|0)<0){c[e>>2]=f<<c[j>>2]|(c[h>>2]|0)>>>(32-(c[j>>2]|0)|0);k=c[e>>2]|0;l=d;return k|0}else{c[e>>2]=f<<32-(c[i>>2]|0)|(c[h>>2]|0)>>>(c[i>>2]|0);k=c[e>>2]|0;l=d;return k|0}return 0}function od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function pd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)<(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function qd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)>(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function rd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;l=d;return ((c[e>>2]|0)<(c[f>>2]|0)?c[e>>2]|0:c[f>>2]|0)|0}function sd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=l;l=l+16|0;d=b+12|0;e=b+8|0;f=b+4|0;g=b;c[e>>2]=a;if((c[e>>2]|0)<0){c[d>>2]=0;h=c[d>>2]|0;l=b;return h|0}if((c[e>>2]|0)>=3967){c[d>>2]=2147483647;h=c[d>>2]|0;l=b;return h|0}c[f>>2]=1<<(c[e>>2]>>7);c[g>>2]=c[e>>2]&127;a=c[f>>2]|0;i=c[f>>2]|0;if((c[e>>2]|0)<2048){e=R((R((c[g>>2]&65535)<<16>>16,(128-(c[g>>2]|0)&65535)<<16>>16)|0)>>16,-174)|0;c[f>>2]=a+((R(i,(c[g>>2]|0)+(e+((R((R((c[g>>2]&65535)<<16>>16,(128-(c[g>>2]|0)&65535)<<16>>16)|0)&65535,-174)|0)>>16))|0)|0)>>7)}else{e=R((R((c[g>>2]&65535)<<16>>16,(128-(c[g>>2]|0)&65535)<<16>>16)|0)>>16,-174)|0;c[f>>2]=a+(R(i>>7,(c[g>>2]|0)+(e+((R((R((c[g>>2]&65535)<<16>>16,(128-(c[g>>2]|0)&65535)<<16>>16)|0)&65535,-174)|0)>>16))|0)|0)}c[d>>2]=c[f>>2];h=c[d>>2]|0;l=b;return h|0}function td(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;f=l;l=l+48|0;g=f+8|0;h=f+4|0;i=f;j=f+40|0;k=f+32|0;m=f+16|0;c[g>>2]=a;c[h>>2]=d;c[i>>2]=e;ud(j,j+2|0,c[h>>2]|0,c[i>>2]|0,23527);ud(k,k+2|0,c[h>>2]|0,b[j>>1]|0,23375);ud(m,m+2|0,c[h>>2]|0,b[k>>1]|0,23223);ud(c[g>>2]|0,(c[g>>2]|0)+2|0,c[h>>2]|0,b[m>>1]|0,23071);ud((c[g>>2]|0)+4|0,(c[g>>2]|0)+6|0,c[h>>2]|0,b[m+2>>1]|0,23071);ud(m+4|0,m+6|0,c[h>>2]|0,b[k+2>>1]|0,23223);ud((c[g>>2]|0)+8|0,(c[g>>2]|0)+10|0,c[h>>2]|0,b[m+4>>1]|0,23071);ud((c[g>>2]|0)+12|0,(c[g>>2]|0)+14|0,c[h>>2]|0,b[m+6>>1]|0,23071);ud(k+4|0,k+6|0,c[h>>2]|0,b[j+2>>1]|0,23375);ud(m+8|0,m+10|0,c[h>>2]|0,b[k+4>>1]|0,23223);ud((c[g>>2]|0)+16|0,(c[g>>2]|0)+18|0,c[h>>2]|0,b[m+8>>1]|0,23071);ud((c[g>>2]|0)+20|0,(c[g>>2]|0)+22|0,c[h>>2]|0,b[m+10>>1]|0,23071);ud(m+12|0,m+14|0,c[h>>2]|0,b[k+6>>1]|0,23223);ud((c[g>>2]|0)+24|0,(c[g>>2]|0)+26|0,c[h>>2]|0,b[m+12>>1]|0,23071);ud((c[g>>2]|0)+28|0,(c[g>>2]|0)+30|0,c[h>>2]|0,b[m+14>>1]|0,23071);l=f;return}function ud(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;i=l;l=l+32|0;j=i+16|0;k=i+12|0;m=i+8|0;n=i+4|0;o=i;c[j>>2]=a;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=h;if((c[n>>2]|0)>0){h=(bc(c[m>>2]|0,(c[o>>2]|0)+(d[23679+(c[n>>2]|0)>>0]|0)|0,8)|0)&65535;b[c[j>>2]>>1]=h;p=(c[n>>2]|0)-(b[c[j>>2]>>1]|0)&65535;q=c[k>>2]|0;b[q>>1]=p;l=i;return}else{b[c[j>>2]>>1]=0;p=0;q=c[k>>2]|0;b[q>>1]=p;l=i;return}}function vd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[g>>2]=b;c[h>>2]=d;c[i>>2]=e;c[k>>2]=0;c[(c[g>>2]|0)+2332>>2]=((c[h>>2]&65535)<<16>>16)*5;c[j>>2]=R((c[(c[g>>2]|0)+2324>>2]&65535)<<16>>16,(c[(c[g>>2]|0)+2332>>2]&65535)<<16>>16)|0;if(!((c[(c[g>>2]|0)+2316>>2]|0)==(c[h>>2]|0)?(c[(c[g>>2]|0)+2320>>2]|0)==(c[i>>2]|0):0)){e=wd((c[g>>2]|0)+2432|0,((c[h>>2]&65535)<<16>>16)*1e3|0,c[i>>2]|0,0)|0;c[k>>2]=(c[k>>2]|0)+e;c[(c[g>>2]|0)+2320>>2]=c[i>>2]}if((c[(c[g>>2]|0)+2316>>2]|0)==(c[h>>2]|0)?(c[j>>2]|0)==(c[(c[g>>2]|0)+2328>>2]|0):0){m=c[k>>2]|0;l=f;return m|0}i=(c[(c[g>>2]|0)+2324>>2]|0)==4;c[(c[g>>2]|0)+2384>>2]=(c[h>>2]|0)==8?(i?22847:22870):i?22813:22858;if((c[(c[g>>2]|0)+2316>>2]|0)!=(c[h>>2]|0)){c[(c[g>>2]|0)+2336>>2]=((c[h>>2]&65535)<<16>>16)*20;i=(c[g>>2]|0)+2340|0;if((c[h>>2]|0)==8|(c[h>>2]|0)==12){c[i>>2]=10;n=c[g>>2]|0;o=132}else{c[i>>2]=16;n=c[g>>2]|0;o=168}c[n+2732>>2]=o;do if((c[h>>2]|0)!=16){if((c[h>>2]|0)==12){p=22739;q=c[g>>2]|0;r=16;break}if((c[h>>2]|0)==8){p=22730;q=c[g>>2]|0;r=16}}else{p=22745;q=c[g>>2]|0;r=16}while(0);if((r|0)==16)c[q+2380>>2]=p;c[(c[g>>2]|0)+2376>>2]=1;c[(c[g>>2]|0)+2308>>2]=100;a[(c[g>>2]|0)+2312>>0]=10;c[(c[g>>2]|0)+4164>>2]=0;He((c[g>>2]|0)+1348|0,0,960)|0;p=(c[g>>2]|0)+1284|0;q=p+64|0;do{c[p>>2]=0;p=p+4|0}while((p|0)<(q|0))}c[(c[g>>2]|0)+2316>>2]=c[h>>2];c[(c[g>>2]|0)+2328>>2]=c[j>>2];m=c[k>>2]|0;l=f;return m|0}function wd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+32|0;h=g+20|0;i=g+16|0;j=g+12|0;k=g+8|0;m=g+4|0;n=g;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;He(c[i>>2]|0,0,300)|0;f=(c[j>>2]|0)!=8e3&(c[j>>2]|0)!=12e3&(c[j>>2]|0)!=16e3;do if(c[m>>2]|0){if(!(f&(c[j>>2]|0)!=24e3&(c[j>>2]|0)!=48e3)?!((c[k>>2]|0)!=8e3&(c[k>>2]|0)!=12e3&(c[k>>2]|0)!=16e3):0){o=c[i>>2]|0;p=a[25178+((((c[j>>2]>>12)-((c[j>>2]|0)>16e3&1)>>((c[j>>2]|0)>24e3&1))-1|0)*3|0)+(((c[k>>2]>>12)-((c[k>>2]|0)>16e3&1)>>((c[k>>2]|0)>24e3&1))-1)>>0]|0;break}c[h>>2]=-1;q=c[h>>2]|0;l=g;return q|0}else{if(!f?!((c[k>>2]|0)!=8e3&(c[k>>2]|0)!=12e3&(c[k>>2]|0)!=16e3&(c[k>>2]|0)!=24e3&(c[k>>2]|0)!=48e3):0){o=c[i>>2]|0;p=a[25193+((((c[j>>2]>>12)-((c[j>>2]|0)>16e3&1)>>((c[j>>2]|0)>24e3&1))-1|0)*5|0)+(((c[k>>2]>>12)-((c[k>>2]|0)>16e3&1)>>((c[k>>2]|0)>24e3&1))-1)>>0]|0;break}c[h>>2]=-1;q=c[h>>2]|0;l=g;return q|0}while(0);c[o+292>>2]=p;c[(c[i>>2]|0)+284>>2]=(c[j>>2]|0)/1e3|0;c[(c[i>>2]|0)+288>>2]=(c[k>>2]|0)/1e3|0;c[(c[i>>2]|0)+268>>2]=(c[(c[i>>2]|0)+284>>2]|0)*10;c[n>>2]=0;p=c[k>>2]|0;o=c[j>>2]|0;do if((c[k>>2]|0)>(c[j>>2]|0)){f=(c[i>>2]|0)+264|0;if((p|0)==(o<<1|0)){c[f>>2]=1;break}else{c[f>>2]=2;c[n>>2]=1;break}}else{f=(c[i>>2]|0)+264|0;if((p|0)>=(o|0)){c[f>>2]=0;break}c[f>>2]=3;if((c[k>>2]<<2|0)==((c[j>>2]|0)*3|0)){c[(c[i>>2]|0)+280>>2]=3;c[(c[i>>2]|0)+276>>2]=18;c[(c[i>>2]|0)+296>>2]=18048;break}if(((c[k>>2]|0)*3|0)==(c[j>>2]<<1|0)){c[(c[i>>2]|0)+280>>2]=2;c[(c[i>>2]|0)+276>>2]=18;c[(c[i>>2]|0)+296>>2]=18106;break}if((c[k>>2]<<1|0)==(c[j>>2]|0)){c[(c[i>>2]|0)+280>>2]=1;c[(c[i>>2]|0)+276>>2]=24;c[(c[i>>2]|0)+296>>2]=18146;break}if(((c[k>>2]|0)*3|0)==(c[j>>2]|0)){c[(c[i>>2]|0)+280>>2]=1;c[(c[i>>2]|0)+276>>2]=36;c[(c[i>>2]|0)+296>>2]=18174;break}if((c[k>>2]<<2|0)==(c[j>>2]|0)){c[(c[i>>2]|0)+280>>2]=1;c[(c[i>>2]|0)+276>>2]=36;c[(c[i>>2]|0)+296>>2]=18214;break}if(((c[k>>2]|0)*6|0)==(c[j>>2]|0)){c[(c[i>>2]|0)+280>>2]=1;c[(c[i>>2]|0)+276>>2]=36;c[(c[i>>2]|0)+296>>2]=18254;break}c[h>>2]=-1;q=c[h>>2]|0;l=g;return q|0}while(0);c[(c[i>>2]|0)+272>>2]=((c[j>>2]<<14+(c[n>>2]|0)|0)/(c[k>>2]|0)|0)<<2;while(1){o=R(c[(c[i>>2]|0)+272>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;p=o+((R(c[(c[i>>2]|0)+272>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16)|0;o=p+(R(c[(c[i>>2]|0)+272>>2]|0,(c[k>>2]>>15)+1>>1)|0)|0;if((o|0)>=(c[j>>2]<<c[n>>2]|0))break;o=(c[i>>2]|0)+272|0;c[o>>2]=(c[o>>2]|0)+1}c[h>>2]=0;q=c[h>>2]|0;l=g;return q|0}function xd(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=0;c[c[d>>2]>>2]=8544;l=b;return c[e>>2]|0}function yd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=l;l=l+16|0;d=b+12|0;e=b+8|0;f=b+4|0;g=b;c[d>>2]=a;c[f>>2]=0;c[g>>2]=c[d>>2];c[e>>2]=0;while(1){if((c[e>>2]|0)>=2)break;c[f>>2]=Ac((c[g>>2]|0)+((c[e>>2]|0)*4260|0)|0)|0;c[e>>2]=(c[e>>2]|0)+1}e=(c[d>>2]|0)+8520|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[(c[d>>2]|0)+8540>>2]=0;l=b;return c[f>>2]|0}function zd(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;k=l;l=l+768|0;m=k+124|0;n=k+120|0;o=k+116|0;p=k+112|0;q=k+108|0;r=k+104|0;s=k+100|0;t=k+96|0;u=k+92|0;v=k+88|0;w=k+84|0;x=k+80|0;y=k+76|0;z=k+72|0;A=k+64|0;B=k+56|0;C=k+52|0;D=k+48|0;E=k+44|0;F=k+40|0;G=k+36|0;H=k+32|0;I=k+28|0;J=k+128|0;K=k+24|0;L=k+20|0;M=k+16|0;N=k+12|0;O=k;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=g;c[r>>2]=h;c[s>>2]=i;c[t>>2]=j;c[w>>2]=0;c[x>>2]=0;c[B>>2]=0;c[B+4>>2]=0;c[D>>2]=c[n>>2];c[E>>2]=c[D>>2];a:do if(c[q>>2]|0){c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[(c[o>>2]|0)+4>>2]|0))break a;c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2388>>2]=0;c[v>>2]=(c[v>>2]|0)+1}}while(0);if((c[(c[o>>2]|0)+4>>2]|0)>(c[(c[D>>2]|0)+8536>>2]|0)){q=Ac((c[E>>2]|0)+4260|0)|0;c[x>>2]=(c[x>>2]|0)+q}if((c[(c[o>>2]|0)+4>>2]|0)==1?(c[(c[D>>2]|0)+8536>>2]|0)==2:0)P=(c[(c[o>>2]|0)+12>>2]|0)==((c[(c[E>>2]|0)+2316>>2]|0)*1e3|0);else P=0;c[G>>2]=P&1;b:do if(!(c[(c[E>>2]|0)+2388>>2]|0)){c[v>>2]=0;c:while(1){if((c[v>>2]|0)>=(c[(c[o>>2]|0)+4>>2]|0))break b;do if(!(c[(c[o>>2]|0)+16>>2]|0)){c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]=1;Q=2;S=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0}else{if((c[(c[o>>2]|0)+16>>2]|0)==10){c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]=1;Q=2;S=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0;break}if((c[(c[o>>2]|0)+16>>2]|0)==20){c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]=1;Q=4;S=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0;break}if((c[(c[o>>2]|0)+16>>2]|0)==40){c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]=2;Q=4;S=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0;break}if((c[(c[o>>2]|0)+16>>2]|0)!=60){T=23;break c}c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]=3;Q=4;S=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0}while(0);c[S+2324>>2]=Q;c[I>>2]=(c[(c[o>>2]|0)+12>>2]>>10)+1;if((c[I>>2]|0)!=8&(c[I>>2]|0)!=12&(c[I>>2]|0)!=16){T=25;break}P=vd((c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0,c[I>>2]|0,c[(c[o>>2]|0)+8>>2]|0)|0;c[x>>2]=(c[x>>2]|0)+P;c[v>>2]=(c[v>>2]|0)+1}if((T|0)==23){c[m>>2]=-203;U=c[m>>2]|0;l=k;return U|0}else if((T|0)==25){c[m>>2]=-200;U=c[m>>2]|0;l=k;return U|0}}while(0);do if((c[c[o>>2]>>2]|0)==2?(c[(c[o>>2]|0)+4>>2]|0)==2:0){if((c[(c[D>>2]|0)+8532>>2]|0)!=1?(c[(c[D>>2]|0)+8536>>2]|0)!=1:0)break;c[(c[D>>2]|0)+8520>>2]=0;c[(c[D>>2]|0)+8520+8>>2]=0;Ie((c[E>>2]|0)+4260+2432|0,(c[E>>2]|0)+2432|0,300)|0}while(0);c[(c[D>>2]|0)+8532>>2]=c[c[o>>2]>>2];c[(c[D>>2]|0)+8536>>2]=c[(c[o>>2]|0)+4>>2];if((c[(c[o>>2]|0)+8>>2]|0)<=48e3?(c[(c[o>>2]|0)+8>>2]|0)>=8e3:0){d:do if((c[p>>2]|0)!=1?(c[(c[E>>2]|0)+2388>>2]|0)==0:0){c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[(c[o>>2]|0)+4>>2]|0))break;c[u>>2]=0;while(1){I=(c[u>>2]|0)<(c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]|0);V=Va(c[r>>2]|0,1)|0;W=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0;if(!I)break;c[W+2404+(c[u>>2]<<2)>>2]=V;c[u>>2]=(c[u>>2]|0)+1}c[W+2416>>2]=V;c[v>>2]=(c[v>>2]|0)+1}c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[(c[o>>2]|0)+4>>2]|0))break;I=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2420|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;e:do if(c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2416>>2]|0){if((c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]|0)==1){c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2420>>2]=1;break}c[z>>2]=(bc(c[r>>2]|0,c[204+((c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]|0)-2<<2)>>2]|0,8)|0)+1;c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2392>>2]|0))break e;c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2420+(c[u>>2]<<2)>>2]=c[z>>2]>>c[u>>2]&1;c[u>>2]=(c[u>>2]|0)+1}}while(0);c[v>>2]=(c[v>>2]|0)+1}if(!(c[p>>2]|0)){c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[(c[E>>2]|0)+2392>>2]|0))break d;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[(c[o>>2]|0)+4>>2]|0))break;if(c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2420+(c[u>>2]<<2)>>2]|0){do if((c[v>>2]|0)==0?(c[(c[o>>2]|0)+4>>2]|0)==2:0){Ad(c[r>>2]|0,B);if(c[(c[E>>2]|0)+4260+2420+(c[u>>2]<<2)>>2]|0)break;Bd(c[r>>2]|0,w)}while(0);do if((c[u>>2]|0)>0){if(!(c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2420+((c[u>>2]|0)-1<<2)>>2]|0)){T=64;break}c[K>>2]=2}else T=64;while(0);if((T|0)==64){T=0;c[K>>2]=0}Ic((c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0,c[r>>2]|0,c[u>>2]|0,1,c[K>>2]|0);Jc(c[r>>2]|0,J,a[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2736+29>>0]|0,a[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2736+30>>0]|0,c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2328>>2]|0)}c[v>>2]=(c[v>>2]|0)+1}c[u>>2]=(c[u>>2]|0)+1}}}while(0);f:do if((c[(c[o>>2]|0)+4>>2]|0)==2){do if(c[p>>2]|0){if((c[p>>2]|0)==2?(c[(c[E>>2]|0)+2420+(c[(c[E>>2]|0)+2388>>2]<<2)>>2]|0)==1:0)break;c[v>>2]=0;while(1){if((c[v>>2]|0)>=2)break f;c[B+(c[v>>2]<<2)>>2]=b[(c[D>>2]|0)+8520+(c[v>>2]<<1)>>1];c[v>>2]=(c[v>>2]|0)+1}}while(0);Ad(c[r>>2]|0,B);if(!((c[p>>2]|0)==0?!(c[(c[E>>2]|0)+4260+2404+(c[(c[E>>2]|0)+2388>>2]<<2)>>2]|0):0))T=74;do if((T|0)==74){if((c[p>>2]|0)==2?(c[(c[E>>2]|0)+4260+2420+(c[(c[E>>2]|0)+2388>>2]<<2)>>2]|0)==0:0)break;c[w>>2]=0;break f}while(0);Bd(c[r>>2]|0,w)}while(0);if(((c[w>>2]|0)==0?(c[(c[o>>2]|0)+4>>2]|0)==2:0)?(c[(c[D>>2]|0)+8540>>2]|0)==1:0){He((c[D>>2]|0)+4260+1348|0,0,960)|0;T=(c[D>>2]|0)+4260+1284|0;J=T+64|0;do{c[T>>2]=0;T=T+4|0}while((T|0)<(J|0));c[(c[D>>2]|0)+4260+2308>>2]=100;a[(c[D>>2]|0)+4260+2312>>0]=10;c[(c[D>>2]|0)+4260+4164>>2]=0;c[(c[D>>2]|0)+4260+2376>>2]=1}T=R(c[(c[o>>2]|0)+12>>2]|0,c[(c[o>>2]|0)+4>>2]|0)|0;c[H>>2]=(T|0)<(R(c[(c[o>>2]|0)+8>>2]|0,c[c[o>>2]>>2]|0)|0)&1;if(c[H>>2]|0)X=1;else X=R(c[(c[o>>2]|0)+4>>2]|0,(c[(c[E>>2]|0)+2328>>2]|0)+2|0)|0;c[L>>2]=da()|0;T=l;l=l+((1*(X<<1)|0)+15&-16)|0;if(c[H>>2]|0){c[A>>2]=c[s>>2];Y=c[E>>2]|0;Z=c[s>>2]|0}else{c[A>>2]=T;Y=c[E>>2]|0;Z=T}c[A+4>>2]=Z+(c[Y+2328>>2]<<1)+4;if(!(c[p>>2]|0))c[F>>2]=((c[w>>2]|0)!=0^1)&1;else{if(c[(c[D>>2]|0)+8540>>2]|0)if((c[p>>2]|0)==2?(c[(c[o>>2]|0)+4>>2]|0)==2:0)_=(c[(c[E>>2]|0)+4260+2420+(c[(c[E>>2]|0)+4260+2388>>2]<<2)>>2]|0)==1;else _=0;else _=1;c[F>>2]=_&1}c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[(c[o>>2]|0)+4>>2]|0))break;if((c[v>>2]|0)==0|(c[F>>2]|0)!=0){c[M>>2]=(c[(c[E>>2]|0)+2388>>2]|0)-(c[v>>2]|0);g:do if((c[M>>2]|0)<=0)c[N>>2]=0;else{if((c[p>>2]|0)==2){c[N>>2]=c[(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2420+((c[M>>2]|0)-1<<2)>>2]|0?2:0;break}do if((c[v>>2]|0)>0){if(!(c[(c[D>>2]|0)+8540>>2]|0))break;c[N>>2]=1;break g}while(0);c[N>>2]=2}while(0);_=Hc((c[E>>2]|0)+((c[v>>2]|0)*4260|0)|0,c[r>>2]|0,(c[A+(c[v>>2]<<2)>>2]|0)+4|0,y,c[p>>2]|0,c[N>>2]|0)|0;c[x>>2]=(c[x>>2]|0)+_}else He((c[A+(c[v>>2]<<2)>>2]|0)+4|0,0,c[y>>2]<<1|0)|0;_=(c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2388|0;c[_>>2]=(c[_>>2]|0)+1;c[v>>2]=(c[v>>2]|0)+1}if((c[c[o>>2]>>2]|0)==2?(c[(c[o>>2]|0)+4>>2]|0)==2:0)Cd((c[D>>2]|0)+8520|0,c[A>>2]|0,c[A+4>>2]|0,B,c[(c[E>>2]|0)+2316>>2]|0,c[y>>2]|0);else{B=c[A>>2]|0;N=(c[D>>2]|0)+8520+4|0;b[B>>1]=b[N>>1]|0;b[B+2>>1]=b[N+2>>1]|0;N=(c[D>>2]|0)+8520+4|0;B=(c[A>>2]|0)+(c[y>>2]<<1)|0;b[N>>1]=b[B>>1]|0;b[N+2>>1]=b[B+2>>1]|0}B=R(c[y>>2]|0,c[(c[o>>2]|0)+8>>2]|0)|0;c[c[t>>2]>>2]=(B|0)/(((c[(c[E>>2]|0)+2316>>2]&65535)<<16>>16)*1e3|0)|0;if((c[c[o>>2]>>2]|0)==2)$=c[c[t>>2]>>2]|0;else $=1;B=l;l=l+((1*($<<1)|0)+15&-16)|0;if((c[c[o>>2]>>2]|0)==2)c[C>>2]=B;else c[C>>2]=c[s>>2];if(c[H>>2]|0)aa=R(c[(c[o>>2]|0)+4>>2]|0,(c[(c[E>>2]|0)+2328>>2]|0)+2|0)|0;else aa=1;B=l;l=l+((1*(aa<<1)|0)+15&-16)|0;if(c[H>>2]|0){H=(R(c[(c[o>>2]|0)+4>>2]|0,(c[(c[E>>2]|0)+2328>>2]|0)+2|0)|0)<<1;Ie(B|0,c[s>>2]|0,H+0|0)|0;c[A>>2]=B;c[A+4>>2]=B+(c[(c[E>>2]|0)+2328>>2]<<1)+4}c[v>>2]=0;while(1){B=c[o>>2]|0;if((c[v>>2]|0)>=(c[((c[c[o>>2]>>2]|0)<(c[(c[o>>2]|0)+4>>2]|0)?B:B+4|0)>>2]|0))break;B=Dd((c[E>>2]|0)+((c[v>>2]|0)*4260|0)+2432|0,c[C>>2]|0,(c[A+(c[v>>2]<<2)>>2]|0)+2|0,c[y>>2]|0)|0;c[x>>2]=(c[x>>2]|0)+B;h:do if((c[c[o>>2]>>2]|0)==2){c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[c[t>>2]>>2]|0))break h;b[(c[s>>2]|0)+((c[v>>2]|0)+(c[u>>2]<<1)<<1)>>1]=b[(c[C>>2]|0)+(c[u>>2]<<1)>>1]|0;c[u>>2]=(c[u>>2]|0)+1}}while(0);c[v>>2]=(c[v>>2]|0)+1}i:do if((c[c[o>>2]>>2]|0)==2){if((c[(c[o>>2]|0)+4>>2]|0)!=1)break;if(c[G>>2]|0){v=Dd((c[E>>2]|0)+4260+2432|0,c[C>>2]|0,(c[A>>2]|0)+2|0,c[y>>2]|0)|0;c[x>>2]=(c[x>>2]|0)+v;c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[c[t>>2]>>2]|0))break i;b[(c[s>>2]|0)+(1+(c[u>>2]<<1)<<1)>>1]=b[(c[C>>2]|0)+(c[u>>2]<<1)>>1]|0;c[u>>2]=(c[u>>2]|0)+1}}else{c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[c[t>>2]>>2]|0))break i;b[(c[s>>2]|0)+(1+(c[u>>2]<<1)<<1)>>1]=b[(c[s>>2]|0)+(0+(c[u>>2]<<1)<<1)>>1]|0;c[u>>2]=(c[u>>2]|0)+1}}}while(0);if((c[(c[E>>2]|0)+4164>>2]|0)==2){c[O>>2]=c[4358];c[O+4>>2]=c[4359];c[O+8>>2]=c[4360];s=R(c[(c[E>>2]|0)+2308>>2]|0,c[O+((c[(c[E>>2]|0)+2316>>2]|0)-8>>2<<2)>>2]|0)|0;ba=s;ca=c[o>>2]|0}else{ba=0;ca=c[o>>2]|0}c[ca+20>>2]=ba;j:do if((c[p>>2]|0)==1){c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[(c[D>>2]|0)+8536>>2]|0))break j;a[(c[D>>2]|0)+((c[u>>2]|0)*4260|0)+2312>>0]=10;c[u>>2]=(c[u>>2]|0)+1}}else c[(c[D>>2]|0)+8540>>2]=c[w>>2];while(0);c[m>>2]=c[x>>2];ga(c[L>>2]|0);U=c[m>>2]|0;l=k;return U|0}c[x>>2]=-200;c[m>>2]=c[x>>2];U=c[m>>2]|0;l=k;return U|0}function Ad(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+48|0;f=e+40|0;g=e+36|0;h=e+32|0;i=e+8|0;j=e+4|0;k=e;c[f>>2]=a;c[g>>2]=d;c[h>>2]=bc(c[f>>2]|0,22674,8)|0;c[i+8>>2]=(c[h>>2]|0)/5|0;c[i+12+8>>2]=(c[h>>2]|0)-((c[i+8>>2]|0)*5|0);c[h>>2]=0;while(1){if((c[h>>2]|0)>=2)break;d=bc(c[f>>2]|0,22727,8)|0;c[i+((c[h>>2]|0)*12|0)>>2]=d;d=bc(c[f>>2]|0,22734,8)|0;c[i+((c[h>>2]|0)*12|0)+4>>2]=d;c[h>>2]=(c[h>>2]|0)+1}c[h>>2]=0;while(1){if((c[h>>2]|0)>=2)break;f=i+((c[h>>2]|0)*12|0)|0;c[f>>2]=(c[f>>2]|0)+((c[i+((c[h>>2]|0)*12|0)+8>>2]|0)*3|0);c[j>>2]=b[17744+(c[i+((c[h>>2]|0)*12|0)>>2]<<1)>>1];c[k>>2]=(((b[17744+((c[i+((c[h>>2]|0)*12|0)>>2]|0)+1<<1)>>1]|0)-(c[j>>2]|0)>>16)*6554|0)+(((b[17744+((c[i+((c[h>>2]|0)*12|0)>>2]|0)+1<<1)>>1]|0)-(c[j>>2]|0)&65535)*6554>>16);f=(c[j>>2]|0)+(R((c[k>>2]&65535)<<16>>16,((c[i+((c[h>>2]|0)*12|0)+4>>2]<<1)+1&65535)<<16>>16)|0)|0;c[(c[g>>2]|0)+(c[h>>2]<<2)>>2]=f;c[h>>2]=(c[h>>2]|0)+1}h=c[g>>2]|0;c[h>>2]=(c[h>>2]|0)-(c[(c[g>>2]|0)+4>>2]|0);l=e;return}function Bd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;b=bc(c[e>>2]|0,22699,8)|0;c[c[f>>2]>>2]=b;l=d;return}function Cd(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;i=l;l=l+64|0;j=i+52|0;k=i+48|0;m=i+44|0;n=i+40|0;o=i+36|0;p=i+32|0;q=i+28|0;r=i+24|0;s=i+20|0;t=i+16|0;u=i+12|0;v=i+8|0;w=i+4|0;x=i;c[j>>2]=a;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[p>>2]=h;h=c[k>>2]|0;g=(c[j>>2]|0)+4|0;b[h>>1]=b[g>>1]|0;b[h+2>>1]=b[g+2>>1]|0;g=c[m>>2]|0;h=(c[j>>2]|0)+8|0;b[g>>1]=b[h>>1]|0;b[g+2>>1]=b[h+2>>1]|0;h=(c[j>>2]|0)+4|0;g=(c[k>>2]|0)+(c[p>>2]<<1)|0;b[h>>1]=b[g>>1]|0;b[h+2>>1]=b[g+2>>1]|0;g=(c[j>>2]|0)+8|0;h=(c[m>>2]|0)+(c[p>>2]<<1)|0;b[g>>1]=b[h>>1]|0;b[g+2>>1]=b[h+2>>1]|0;c[w>>2]=b[c[j>>2]>>1];c[x>>2]=b[(c[j>>2]|0)+2>>1];c[r>>2]=65536/(c[o>>2]<<3|0)|0;c[s>>2]=((R(((c[c[n>>2]>>2]|0)-(b[c[j>>2]>>1]|0)&65535)<<16>>16,(c[r>>2]&65535)<<16>>16)|0)>>15)+1>>1;c[t>>2]=((R(((c[(c[n>>2]|0)+4>>2]|0)-(b[(c[j>>2]|0)+2>>1]|0)&65535)<<16>>16,(c[r>>2]&65535)<<16>>16)|0)>>15)+1>>1;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]<<3|0))break;c[w>>2]=(c[w>>2]|0)+(c[s>>2]|0);c[x>>2]=(c[x>>2]|0)+(c[t>>2]|0);c[u>>2]=(b[(c[k>>2]|0)+(c[q>>2]<<1)>>1]|0)+(b[(c[k>>2]|0)+((c[q>>2]|0)+2<<1)>>1]|0)+(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<1)<<9;r=R(c[u>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;c[u>>2]=(b[(c[m>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<8)+(r+((R(c[u>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16));r=R(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<11>>16,(c[x>>2]&65535)<<16>>16)|0;c[u>>2]=(c[u>>2]|0)+(r+((R(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<11&65535,(c[x>>2]&65535)<<16>>16)|0)>>16));if(((c[u>>2]>>7)+1>>1|0)<=32767)if(((c[u>>2]>>7)+1>>1|0)<-32768)y=-32768;else y=(c[u>>2]>>7)+1>>1;else y=32767;b[(c[m>>2]|0)+((c[q>>2]|0)+1<<1)>>1]=y;c[q>>2]=(c[q>>2]|0)+1}c[w>>2]=c[c[n>>2]>>2];c[x>>2]=c[(c[n>>2]|0)+4>>2];c[q>>2]=c[o>>2]<<3;while(1){if((c[q>>2]|0)>=(c[p>>2]|0))break;c[u>>2]=(b[(c[k>>2]|0)+(c[q>>2]<<1)>>1]|0)+(b[(c[k>>2]|0)+((c[q>>2]|0)+2<<1)>>1]|0)+(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<1)<<9;o=R(c[u>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;c[u>>2]=(b[(c[m>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<8)+(o+((R(c[u>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16));o=R(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<11>>16,(c[x>>2]&65535)<<16>>16)|0;c[u>>2]=(c[u>>2]|0)+(o+((R(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<11&65535,(c[x>>2]&65535)<<16>>16)|0)>>16));if(((c[u>>2]>>7)+1>>1|0)<=32767)if(((c[u>>2]>>7)+1>>1|0)<-32768)z=-32768;else z=(c[u>>2]>>7)+1>>1;else z=32767;b[(c[m>>2]|0)+((c[q>>2]|0)+1<<1)>>1]=z;c[q>>2]=(c[q>>2]|0)+1}b[c[j>>2]>>1]=c[c[n>>2]>>2];b[(c[j>>2]|0)+2>>1]=c[(c[n>>2]|0)+4>>2];c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[p>>2]|0))break;c[u>>2]=(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]|0)+(b[(c[m>>2]|0)+((c[q>>2]|0)+1<<1)>>1]|0);c[v>>2]=(b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]|0)-(b[(c[m>>2]|0)+((c[q>>2]|0)+1<<1)>>1]|0);if((c[u>>2]|0)>32767)A=32767;else A=(c[u>>2]|0)<-32768?-32768:c[u>>2]|0;b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]=A;if((c[v>>2]|0)>32767)B=32767;else B=(c[v>>2]|0)<-32768?-32768:c[v>>2]|0;b[(c[m>>2]|0)+((c[q>>2]|0)+1<<1)>>1]=B;c[q>>2]=(c[q>>2]|0)+1}l=i;return}function Dd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=(c[(c[g>>2]|0)+284>>2]|0)-(c[(c[g>>2]|0)+292>>2]|0);Ie((c[g>>2]|0)+168+(c[(c[g>>2]|0)+292>>2]<<1)|0,c[i>>2]|0,c[k>>2]<<1|0)|0;switch(c[(c[g>>2]|0)+264>>2]|0){case 1:{Ed(c[g>>2]|0,c[h>>2]|0,(c[g>>2]|0)+168|0,c[(c[g>>2]|0)+284>>2]|0);Ed(c[g>>2]|0,(c[h>>2]|0)+(c[(c[g>>2]|0)+288>>2]<<1)|0,(c[i>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[g>>2]|0)+284>>2]|0)|0);break}case 2:{Fd(c[g>>2]|0,c[h>>2]|0,(c[g>>2]|0)+168|0,c[(c[g>>2]|0)+284>>2]|0);Fd(c[g>>2]|0,(c[h>>2]|0)+(c[(c[g>>2]|0)+288>>2]<<1)|0,(c[i>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[g>>2]|0)+284>>2]|0)|0);break}case 3:{Gd(c[g>>2]|0,c[h>>2]|0,(c[g>>2]|0)+168|0,c[(c[g>>2]|0)+284>>2]|0);Gd(c[g>>2]|0,(c[h>>2]|0)+(c[(c[g>>2]|0)+288>>2]<<1)|0,(c[i>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[g>>2]|0)+284>>2]|0)|0);break}default:{Ie(c[h>>2]|0,(c[g>>2]|0)+168|0,c[(c[g>>2]|0)+284>>2]<<1|0)|0;Ie((c[h>>2]|0)+(c[(c[g>>2]|0)+288>>2]<<1)|0,(c[i>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[g>>2]|0)+284>>2]|0)<<1|0)|0}}Ie((c[g>>2]|0)+168|0,(c[i>>2]|0)+((c[j>>2]|0)-(c[(c[g>>2]|0)+292>>2]|0)<<1)|0,c[(c[g>>2]|0)+292>>2]<<1|0)|0;l=f;return 0}function Ed(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=c[g>>2];Jd(c[k>>2]|0,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0);l=f;return}function Fd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;g=l;l=l+48|0;h=g+32|0;i=g+28|0;j=g+24|0;k=g+20|0;m=g+16|0;n=g+12|0;o=g+8|0;p=g+4|0;q=g;c[h>>2]=a;c[i>>2]=d;c[j>>2]=e;c[k>>2]=f;c[m>>2]=c[h>>2];h=(c[(c[m>>2]|0)+268>>2]<<1)+8|0;c[q>>2]=da()|0;f=l;l=l+((1*(h<<1)|0)+15&-16)|0;h=(c[m>>2]|0)+24|0;b[f>>1]=b[h>>1]|0;b[f+2>>1]=b[h+2>>1]|0;b[f+4>>1]=b[h+4>>1]|0;b[f+6>>1]=b[h+6>>1]|0;b[f+8>>1]=b[h+8>>1]|0;b[f+10>>1]=b[h+10>>1]|0;b[f+12>>1]=b[h+12>>1]|0;b[f+14>>1]=b[h+14>>1]|0;c[p>>2]=c[(c[m>>2]|0)+272>>2];while(1){if((c[k>>2]|0)<(c[(c[m>>2]|0)+268>>2]|0))r=c[k>>2]|0;else r=c[(c[m>>2]|0)+268>>2]|0;c[n>>2]=r;Jd(c[m>>2]|0,f+16|0,c[j>>2]|0,c[n>>2]|0);c[o>>2]=c[n>>2]<<17;c[i>>2]=Kd(c[i>>2]|0,f,c[o>>2]|0,c[p>>2]|0)|0;c[j>>2]=(c[j>>2]|0)+(c[n>>2]<<1);c[k>>2]=(c[k>>2]|0)-(c[n>>2]|0);if((c[k>>2]|0)<=0)break;h=f+(c[n>>2]<<1<<1)|0;b[f>>1]=b[h>>1]|0;b[f+2>>1]=b[h+2>>1]|0;b[f+4>>1]=b[h+4>>1]|0;b[f+6>>1]=b[h+6>>1]|0;b[f+8>>1]=b[h+8>>1]|0;b[f+10>>1]=b[h+10>>1]|0;b[f+12>>1]=b[h+12>>1]|0;b[f+14>>1]=b[h+14>>1]|0}k=(c[m>>2]|0)+24|0;m=f+(c[n>>2]<<1<<1)|0;b[k>>1]=b[m>>1]|0;b[k+2>>1]=b[m+2>>1]|0;b[k+4>>1]=b[m+4>>1]|0;b[k+6>>1]=b[m+6>>1]|0;b[k+8>>1]=b[m+8>>1]|0;b[k+10>>1]=b[m+10>>1]|0;b[k+12>>1]=b[m+12>>1]|0;b[k+14>>1]=b[m+14>>1]|0;ga(c[q>>2]|0);l=g;return}function Gd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;f=l;l=l+48|0;g=f+36|0;h=f+32|0;i=f+28|0;j=f+24|0;k=f+20|0;m=f+16|0;n=f+12|0;o=f+8|0;p=f+4|0;q=f;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=c[g>>2];g=(c[(c[k>>2]|0)+268>>2]|0)+(c[(c[k>>2]|0)+276>>2]|0)|0;c[q>>2]=da()|0;e=l;l=l+((1*(g<<2)|0)+15&-16)|0;Ie(e|0,(c[k>>2]|0)+24|0,c[(c[k>>2]|0)+276>>2]<<2|0)|0;c[p>>2]=(c[(c[k>>2]|0)+296>>2]|0)+4;c[o>>2]=c[(c[k>>2]|0)+272>>2];while(1){if((c[j>>2]|0)<(c[(c[k>>2]|0)+268>>2]|0))r=c[j>>2]|0;else r=c[(c[k>>2]|0)+268>>2]|0;c[m>>2]=r;Hd(c[k>>2]|0,e+(c[(c[k>>2]|0)+276>>2]<<2)|0,c[i>>2]|0,c[(c[k>>2]|0)+296>>2]|0,c[m>>2]|0);c[n>>2]=c[m>>2]<<16;c[h>>2]=Id(c[h>>2]|0,e,c[p>>2]|0,c[(c[k>>2]|0)+276>>2]|0,c[(c[k>>2]|0)+280>>2]|0,c[n>>2]|0,c[o>>2]|0)|0;c[i>>2]=(c[i>>2]|0)+(c[m>>2]<<1);c[j>>2]=(c[j>>2]|0)-(c[m>>2]|0);if((c[j>>2]|0)<=1)break;Ie(e|0,e+(c[m>>2]<<2)|0,c[(c[k>>2]|0)+276>>2]<<2|0)|0}Ie((c[k>>2]|0)+24|0,e+(c[m>>2]<<2)|0,c[(c[k>>2]|0)+276>>2]<<2|0)|0;ga(c[q>>2]|0);l=f;return}function Hd(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;h=l;l=l+32|0;i=h+24|0;j=h+20|0;k=h+16|0;m=h+12|0;n=h+8|0;o=h+4|0;p=h;c[i>>2]=a;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[n>>2]|0))break;c[p>>2]=(c[c[i>>2]>>2]|0)+(b[(c[k>>2]|0)+(c[o>>2]<<1)>>1]<<8);c[(c[j>>2]|0)+(c[o>>2]<<2)>>2]=c[p>>2];c[p>>2]=c[p>>2]<<2;g=R(c[p>>2]>>16,b[c[m>>2]>>1]|0)|0;f=(c[(c[i>>2]|0)+4>>2]|0)+(g+((R(c[p>>2]&65535,b[c[m>>2]>>1]|0)|0)>>16))|0;c[c[i>>2]>>2]=f;f=R(c[p>>2]>>16,b[(c[m>>2]|0)+2>>1]|0)|0;g=f+((R(c[p>>2]&65535,b[(c[m>>2]|0)+2>>1]|0)|0)>>16)|0;c[(c[i>>2]|0)+4>>2]=g;c[o>>2]=(c[o>>2]|0)+1}l=h;return}function Id(a,d,e,f,g,h,i){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=l;l=l+48|0;k=j+44|0;m=j+40|0;n=j+36|0;o=j+32|0;p=j+28|0;q=j+24|0;r=j+20|0;s=j+16|0;t=j+12|0;u=j+8|0;v=j+4|0;w=j;c[k>>2]=a;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=g;c[q>>2]=h;c[r>>2]=i;switch(c[o>>2]|0){case 18:{c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[q>>2]|0))break;c[u>>2]=(c[m>>2]|0)+(c[s>>2]>>16<<2);o=R((c[s>>2]&65535)>>16,(c[p>>2]&65535)<<16>>16)|0;c[v>>2]=o+((R(c[s>>2]&65535,(c[p>>2]&65535)<<16>>16)|0)>>16);c[w>>2]=(c[n>>2]|0)+((c[v>>2]|0)*9<<1);o=R(c[c[u>>2]>>2]>>16,b[c[w>>2]>>1]|0)|0;c[t>>2]=o+((R(c[c[u>>2]>>2]&65535,b[c[w>>2]>>1]|0)|0)>>16);o=R(c[(c[u>>2]|0)+4>>2]>>16,b[(c[w>>2]|0)+2>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+4>>2]&65535,b[(c[w>>2]|0)+2>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+8>>2]>>16,b[(c[w>>2]|0)+4>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+8>>2]&65535,b[(c[w>>2]|0)+4>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+12>>2]>>16,b[(c[w>>2]|0)+6>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+12>>2]&65535,b[(c[w>>2]|0)+6>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+16>>2]>>16,b[(c[w>>2]|0)+8>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+16>>2]&65535,b[(c[w>>2]|0)+8>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+20>>2]>>16,b[(c[w>>2]|0)+10>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+20>>2]&65535,b[(c[w>>2]|0)+10>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+24>>2]>>16,b[(c[w>>2]|0)+12>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+24>>2]&65535,b[(c[w>>2]|0)+12>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+28>>2]>>16,b[(c[w>>2]|0)+14>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+28>>2]&65535,b[(c[w>>2]|0)+14>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+32>>2]>>16,b[(c[w>>2]|0)+16>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+32>>2]&65535,b[(c[w>>2]|0)+16>>1]|0)|0)>>16));c[w>>2]=(c[n>>2]|0)+(((c[p>>2]|0)-1-(c[v>>2]|0)|0)*9<<1);o=R(c[(c[u>>2]|0)+68>>2]>>16,b[c[w>>2]>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+68>>2]&65535,b[c[w>>2]>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+64>>2]>>16,b[(c[w>>2]|0)+2>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+64>>2]&65535,b[(c[w>>2]|0)+2>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+60>>2]>>16,b[(c[w>>2]|0)+4>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+60>>2]&65535,b[(c[w>>2]|0)+4>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+56>>2]>>16,b[(c[w>>2]|0)+6>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+56>>2]&65535,b[(c[w>>2]|0)+6>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+52>>2]>>16,b[(c[w>>2]|0)+8>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+52>>2]&65535,b[(c[w>>2]|0)+8>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+48>>2]>>16,b[(c[w>>2]|0)+10>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+48>>2]&65535,b[(c[w>>2]|0)+10>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+44>>2]>>16,b[(c[w>>2]|0)+12>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+44>>2]&65535,b[(c[w>>2]|0)+12>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+40>>2]>>16,b[(c[w>>2]|0)+14>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+40>>2]&65535,b[(c[w>>2]|0)+14>>1]|0)|0)>>16));o=R(c[(c[u>>2]|0)+36>>2]>>16,b[(c[w>>2]|0)+16>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(o+((R(c[(c[u>>2]|0)+36>>2]&65535,b[(c[w>>2]|0)+16>>1]|0)|0)>>16));if(((c[t>>2]>>5)+1>>1|0)<=32767)if(((c[t>>2]>>5)+1>>1|0)<-32768)x=-32768;else x=(c[t>>2]>>5)+1>>1;else x=32767;o=c[k>>2]|0;c[k>>2]=o+2;b[o>>1]=x;c[s>>2]=(c[s>>2]|0)+(c[r>>2]|0)}y=c[k>>2]|0;l=j;return y|0}case 24:{c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[q>>2]|0))break;c[u>>2]=(c[m>>2]|0)+(c[s>>2]>>16<<2);x=R((c[c[u>>2]>>2]|0)+(c[(c[u>>2]|0)+92>>2]|0)>>16,b[c[n>>2]>>1]|0)|0;c[t>>2]=x+((R((c[c[u>>2]>>2]|0)+(c[(c[u>>2]|0)+92>>2]|0)&65535,b[c[n>>2]>>1]|0)|0)>>16);x=R((c[(c[u>>2]|0)+4>>2]|0)+(c[(c[u>>2]|0)+88>>2]|0)>>16,b[(c[n>>2]|0)+2>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+4>>2]|0)+(c[(c[u>>2]|0)+88>>2]|0)&65535,b[(c[n>>2]|0)+2>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+8>>2]|0)+(c[(c[u>>2]|0)+84>>2]|0)>>16,b[(c[n>>2]|0)+4>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+8>>2]|0)+(c[(c[u>>2]|0)+84>>2]|0)&65535,b[(c[n>>2]|0)+4>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+12>>2]|0)+(c[(c[u>>2]|0)+80>>2]|0)>>16,b[(c[n>>2]|0)+6>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+12>>2]|0)+(c[(c[u>>2]|0)+80>>2]|0)&65535,b[(c[n>>2]|0)+6>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+16>>2]|0)+(c[(c[u>>2]|0)+76>>2]|0)>>16,b[(c[n>>2]|0)+8>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+16>>2]|0)+(c[(c[u>>2]|0)+76>>2]|0)&65535,b[(c[n>>2]|0)+8>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+20>>2]|0)+(c[(c[u>>2]|0)+72>>2]|0)>>16,b[(c[n>>2]|0)+10>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+20>>2]|0)+(c[(c[u>>2]|0)+72>>2]|0)&65535,b[(c[n>>2]|0)+10>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+24>>2]|0)+(c[(c[u>>2]|0)+68>>2]|0)>>16,b[(c[n>>2]|0)+12>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+24>>2]|0)+(c[(c[u>>2]|0)+68>>2]|0)&65535,b[(c[n>>2]|0)+12>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+28>>2]|0)+(c[(c[u>>2]|0)+64>>2]|0)>>16,b[(c[n>>2]|0)+14>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+28>>2]|0)+(c[(c[u>>2]|0)+64>>2]|0)&65535,b[(c[n>>2]|0)+14>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+32>>2]|0)+(c[(c[u>>2]|0)+60>>2]|0)>>16,b[(c[n>>2]|0)+16>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+32>>2]|0)+(c[(c[u>>2]|0)+60>>2]|0)&65535,b[(c[n>>2]|0)+16>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+36>>2]|0)+(c[(c[u>>2]|0)+56>>2]|0)>>16,b[(c[n>>2]|0)+18>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+36>>2]|0)+(c[(c[u>>2]|0)+56>>2]|0)&65535,b[(c[n>>2]|0)+18>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+40>>2]|0)+(c[(c[u>>2]|0)+52>>2]|0)>>16,b[(c[n>>2]|0)+20>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+40>>2]|0)+(c[(c[u>>2]|0)+52>>2]|0)&65535,b[(c[n>>2]|0)+20>>1]|0)|0)>>16));x=R((c[(c[u>>2]|0)+44>>2]|0)+(c[(c[u>>2]|0)+48>>2]|0)>>16,b[(c[n>>2]|0)+22>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(x+((R((c[(c[u>>2]|0)+44>>2]|0)+(c[(c[u>>2]|0)+48>>2]|0)&65535,b[(c[n>>2]|0)+22>>1]|0)|0)>>16));if(((c[t>>2]>>5)+1>>1|0)<=32767)if(((c[t>>2]>>5)+1>>1|0)<-32768)z=-32768;else z=(c[t>>2]>>5)+1>>1;else z=32767;x=c[k>>2]|0;c[k>>2]=x+2;b[x>>1]=z;c[s>>2]=(c[s>>2]|0)+(c[r>>2]|0)}y=c[k>>2]|0;l=j;return y|0}case 36:{c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[q>>2]|0))break;c[u>>2]=(c[m>>2]|0)+(c[s>>2]>>16<<2);z=R((c[c[u>>2]>>2]|0)+(c[(c[u>>2]|0)+140>>2]|0)>>16,b[c[n>>2]>>1]|0)|0;c[t>>2]=z+((R((c[c[u>>2]>>2]|0)+(c[(c[u>>2]|0)+140>>2]|0)&65535,b[c[n>>2]>>1]|0)|0)>>16);z=R((c[(c[u>>2]|0)+4>>2]|0)+(c[(c[u>>2]|0)+136>>2]|0)>>16,b[(c[n>>2]|0)+2>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+4>>2]|0)+(c[(c[u>>2]|0)+136>>2]|0)&65535,b[(c[n>>2]|0)+2>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+8>>2]|0)+(c[(c[u>>2]|0)+132>>2]|0)>>16,b[(c[n>>2]|0)+4>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+8>>2]|0)+(c[(c[u>>2]|0)+132>>2]|0)&65535,b[(c[n>>2]|0)+4>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+12>>2]|0)+(c[(c[u>>2]|0)+128>>2]|0)>>16,b[(c[n>>2]|0)+6>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+12>>2]|0)+(c[(c[u>>2]|0)+128>>2]|0)&65535,b[(c[n>>2]|0)+6>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+16>>2]|0)+(c[(c[u>>2]|0)+124>>2]|0)>>16,b[(c[n>>2]|0)+8>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+16>>2]|0)+(c[(c[u>>2]|0)+124>>2]|0)&65535,b[(c[n>>2]|0)+8>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+20>>2]|0)+(c[(c[u>>2]|0)+120>>2]|0)>>16,b[(c[n>>2]|0)+10>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+20>>2]|0)+(c[(c[u>>2]|0)+120>>2]|0)&65535,b[(c[n>>2]|0)+10>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+24>>2]|0)+(c[(c[u>>2]|0)+116>>2]|0)>>16,b[(c[n>>2]|0)+12>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+24>>2]|0)+(c[(c[u>>2]|0)+116>>2]|0)&65535,b[(c[n>>2]|0)+12>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+28>>2]|0)+(c[(c[u>>2]|0)+112>>2]|0)>>16,b[(c[n>>2]|0)+14>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+28>>2]|0)+(c[(c[u>>2]|0)+112>>2]|0)&65535,b[(c[n>>2]|0)+14>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+32>>2]|0)+(c[(c[u>>2]|0)+108>>2]|0)>>16,b[(c[n>>2]|0)+16>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+32>>2]|0)+(c[(c[u>>2]|0)+108>>2]|0)&65535,b[(c[n>>2]|0)+16>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+36>>2]|0)+(c[(c[u>>2]|0)+104>>2]|0)>>16,b[(c[n>>2]|0)+18>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+36>>2]|0)+(c[(c[u>>2]|0)+104>>2]|0)&65535,b[(c[n>>2]|0)+18>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+40>>2]|0)+(c[(c[u>>2]|0)+100>>2]|0)>>16,b[(c[n>>2]|0)+20>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+40>>2]|0)+(c[(c[u>>2]|0)+100>>2]|0)&65535,b[(c[n>>2]|0)+20>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+44>>2]|0)+(c[(c[u>>2]|0)+96>>2]|0)>>16,b[(c[n>>2]|0)+22>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+44>>2]|0)+(c[(c[u>>2]|0)+96>>2]|0)&65535,b[(c[n>>2]|0)+22>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+48>>2]|0)+(c[(c[u>>2]|0)+92>>2]|0)>>16,b[(c[n>>2]|0)+24>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+48>>2]|0)+(c[(c[u>>2]|0)+92>>2]|0)&65535,b[(c[n>>2]|0)+24>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+52>>2]|0)+(c[(c[u>>2]|0)+88>>2]|0)>>16,b[(c[n>>2]|0)+26>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+52>>2]|0)+(c[(c[u>>2]|0)+88>>2]|0)&65535,b[(c[n>>2]|0)+26>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+56>>2]|0)+(c[(c[u>>2]|0)+84>>2]|0)>>16,b[(c[n>>2]|0)+28>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+56>>2]|0)+(c[(c[u>>2]|0)+84>>2]|0)&65535,b[(c[n>>2]|0)+28>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+60>>2]|0)+(c[(c[u>>2]|0)+80>>2]|0)>>16,b[(c[n>>2]|0)+30>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+60>>2]|0)+(c[(c[u>>2]|0)+80>>2]|0)&65535,b[(c[n>>2]|0)+30>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+64>>2]|0)+(c[(c[u>>2]|0)+76>>2]|0)>>16,b[(c[n>>2]|0)+32>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+64>>2]|0)+(c[(c[u>>2]|0)+76>>2]|0)&65535,b[(c[n>>2]|0)+32>>1]|0)|0)>>16));z=R((c[(c[u>>2]|0)+68>>2]|0)+(c[(c[u>>2]|0)+72>>2]|0)>>16,b[(c[n>>2]|0)+34>>1]|0)|0;c[t>>2]=(c[t>>2]|0)+(z+((R((c[(c[u>>2]|0)+68>>2]|0)+(c[(c[u>>2]|0)+72>>2]|0)&65535,b[(c[n>>2]|0)+34>>1]|0)|0)>>16));if(((c[t>>2]>>5)+1>>1|0)<=32767)if(((c[t>>2]>>5)+1>>1|0)<-32768)A=-32768;else A=(c[t>>2]>>5)+1>>1;else A=32767;z=c[k>>2]|0;c[k>>2]=z+2;b[z>>1]=A;c[s>>2]=(c[s>>2]|0)+(c[r>>2]|0)}y=c[k>>2]|0;l=j;return y|0}default:{y=c[k>>2]|0;l=j;return y|0}}return 0}function Jd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=l;l=l+48|0;h=g+36|0;i=g+32|0;j=g+28|0;k=g+24|0;m=g+20|0;n=g+16|0;o=g+12|0;p=g+8|0;q=g+4|0;r=g;c[h>>2]=a;c[i>>2]=d;c[j>>2]=e;c[k>>2]=f;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=b[(c[j>>2]|0)+(c[m>>2]<<1)>>1]<<10;c[q>>2]=(c[n>>2]|0)-(c[c[h>>2]>>2]|0);f=R(c[q>>2]>>16,b[10257]|0)|0;c[r>>2]=f+((R(c[q>>2]&65535,b[10257]|0)|0)>>16);c[o>>2]=(c[c[h>>2]>>2]|0)+(c[r>>2]|0);c[c[h>>2]>>2]=(c[n>>2]|0)+(c[r>>2]|0);c[q>>2]=(c[o>>2]|0)-(c[(c[h>>2]|0)+4>>2]|0);f=R(c[q>>2]>>16,b[10258]|0)|0;c[r>>2]=f+((R(c[q>>2]&65535,b[10258]|0)|0)>>16);c[p>>2]=(c[(c[h>>2]|0)+4>>2]|0)+(c[r>>2]|0);c[(c[h>>2]|0)+4>>2]=(c[o>>2]|0)+(c[r>>2]|0);c[q>>2]=(c[p>>2]|0)-(c[(c[h>>2]|0)+8>>2]|0);f=R(c[q>>2]>>16,b[10259]|0)|0;c[r>>2]=(c[q>>2]|0)+(f+((R(c[q>>2]&65535,b[10259]|0)|0)>>16));c[o>>2]=(c[(c[h>>2]|0)+8>>2]|0)+(c[r>>2]|0);c[(c[h>>2]|0)+8>>2]=(c[p>>2]|0)+(c[r>>2]|0);if(((c[o>>2]>>9)+1>>1|0)<=32767)if(((c[o>>2]>>9)+1>>1|0)<-32768)s=-32768;else s=(c[o>>2]>>9)+1>>1;else s=32767;b[(c[i>>2]|0)+(c[m>>2]<<1<<1)>>1]=s;c[q>>2]=(c[n>>2]|0)-(c[(c[h>>2]|0)+12>>2]|0);f=R(c[q>>2]>>16,b[10260]|0)|0;c[r>>2]=f+((R(c[q>>2]&65535,b[10260]|0)|0)>>16);c[o>>2]=(c[(c[h>>2]|0)+12>>2]|0)+(c[r>>2]|0);c[(c[h>>2]|0)+12>>2]=(c[n>>2]|0)+(c[r>>2]|0);c[q>>2]=(c[o>>2]|0)-(c[(c[h>>2]|0)+16>>2]|0);f=R(c[q>>2]>>16,b[10261]|0)|0;c[r>>2]=f+((R(c[q>>2]&65535,b[10261]|0)|0)>>16);c[p>>2]=(c[(c[h>>2]|0)+16>>2]|0)+(c[r>>2]|0);c[(c[h>>2]|0)+16>>2]=(c[o>>2]|0)+(c[r>>2]|0);c[q>>2]=(c[p>>2]|0)-(c[(c[h>>2]|0)+20>>2]|0);f=R(c[q>>2]>>16,b[10262]|0)|0;c[r>>2]=(c[q>>2]|0)+(f+((R(c[q>>2]&65535,b[10262]|0)|0)>>16));c[o>>2]=(c[(c[h>>2]|0)+20>>2]|0)+(c[r>>2]|0);c[(c[h>>2]|0)+20>>2]=(c[p>>2]|0)+(c[r>>2]|0);if(((c[o>>2]>>9)+1>>1|0)<=32767)if(((c[o>>2]>>9)+1>>1|0)<-32768)t=-32768;else t=(c[o>>2]>>9)+1>>1;else t=32767;b[(c[i>>2]|0)+((c[m>>2]<<1)+1<<1)>>1]=t;c[m>>2]=(c[m>>2]|0)+1}l=g;return}function Kd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+32|0;h=g+28|0;i=g+24|0;j=g+20|0;k=g+16|0;m=g+12|0;n=g+8|0;o=g+4|0;p=g;c[h>>2]=a;c[i>>2]=d;c[j>>2]=e;c[k>>2]=f;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[p>>2]=(((c[m>>2]&65535)>>16)*12|0)+((c[m>>2]&65535)*12>>16);c[o>>2]=(c[i>>2]|0)+(c[m>>2]>>16<<1);c[n>>2]=R(b[c[o>>2]>>1]|0,b[18294+(c[p>>2]<<3)>>1]|0)|0;c[n>>2]=(c[n>>2]|0)+(R(b[(c[o>>2]|0)+2>>1]|0,b[18294+(c[p>>2]<<3)+2>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(R(b[(c[o>>2]|0)+4>>1]|0,b[18294+(c[p>>2]<<3)+4>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(R(b[(c[o>>2]|0)+6>>1]|0,b[18294+(c[p>>2]<<3)+6>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(R(b[(c[o>>2]|0)+8>>1]|0,b[18294+(11-(c[p>>2]|0)<<3)+6>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(R(b[(c[o>>2]|0)+10>>1]|0,b[18294+(11-(c[p>>2]|0)<<3)+4>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(R(b[(c[o>>2]|0)+12>>1]|0,b[18294+(11-(c[p>>2]|0)<<3)+2>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(R(b[(c[o>>2]|0)+14>>1]|0,b[18294+(11-(c[p>>2]|0)<<3)>>1]|0)|0);if(((c[n>>2]>>14)+1>>1|0)<=32767)if(((c[n>>2]>>14)+1>>1|0)<-32768)q=-32768;else q=(c[n>>2]>>14)+1>>1;else q=32767;f=c[h>>2]|0;c[h>>2]=f+2;b[f>>1]=q;c[m>>2]=(c[m>>2]|0)+(c[k>>2]|0)}l=g;return c[h>>2]|0}function Ld(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0,D=0,F=0.0,G=0.0;f=l;l=l+80|0;h=f+64|0;i=f+60|0;j=f+56|0;k=f+52|0;m=f+48|0;n=f+44|0;o=f+40|0;p=f+36|0;q=f+32|0;r=f+28|0;s=f+24|0;t=f+20|0;u=f+16|0;v=f+12|0;w=f+8|0;x=f+4|0;y=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;if(!((((c[j>>2]|0)<1|(c[i>>2]|0)<1)^1)&(c[h>>2]|0)!=0&(c[k>>2]|0)!=0)){l=f;return}c[n>>2]=0;while(1){if((c[n>>2]|0)>=(R(c[i>>2]|0,c[j>>2]|0)|0))break;if(2.0<+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2])z=2.0;else z=+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2];if(!(-2.0>z))if(2.0<+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2])A=2.0;else A=+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2];else A=-2.0;g[(c[h>>2]|0)+(c[n>>2]<<2)>>2]=A;c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[o>>2]=(c[h>>2]|0)+(c[m>>2]<<2);g[p>>2]=+g[(c[k>>2]|0)+(c[m>>2]<<2)>>2];c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[i>>2]|0))break;A=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];if(A*+g[p>>2]>=0.0)break;A=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];z=+g[p>>2]*+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];B=A+z*+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2]=B;c[n>>2]=(c[n>>2]|0)+1}c[r>>2]=0;g[q>>2]=+g[c[o>>2]>>2];do{c[v>>2]=0;c[n>>2]=c[r>>2];while(1){if((c[n>>2]|0)>=(c[i>>2]|0))break;if(+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2]>1.0)break;if(+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2]<-1.0)break;c[n>>2]=(c[n>>2]|0)+1}if((c[n>>2]|0)==(c[i>>2]|0)){C=23;break}c[w>>2]=c[n>>2];e=c[n>>2]|0;c[t>>2]=e;c[s>>2]=e;g[u>>2]=+E(+(+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2]));while(1){if((c[s>>2]|0)<=0)break;B=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];if(!(B*+g[(c[o>>2]|0)+((R((c[s>>2]|0)-1|0,c[j>>2]|0)|0)<<2)>>2]>=0.0))break;c[s>>2]=(c[s>>2]|0)+-1}while(1){if((c[t>>2]|0)>=(c[i>>2]|0))break;B=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];if(!(B*+g[(c[o>>2]|0)+((R(c[t>>2]|0,c[j>>2]|0)|0)<<2)>>2]>=0.0))break;B=+E(+(+g[(c[o>>2]|0)+((R(c[t>>2]|0,c[j>>2]|0)|0)<<2)>>2]));if(B>+g[u>>2]){g[u>>2]=+E(+(+g[(c[o>>2]|0)+((R(c[t>>2]|0,c[j>>2]|0)|0)<<2)>>2]));c[w>>2]=c[t>>2]}c[t>>2]=(c[t>>2]|0)+1}if(!(c[s>>2]|0)){B=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];D=B*+g[c[o>>2]>>2]>=0.0}else D=0;c[v>>2]=D&1;g[p>>2]=(+g[u>>2]-1.0)/(+g[u>>2]*+g[u>>2]);if(+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2]>0.0)g[p>>2]=-+g[p>>2];c[n>>2]=c[s>>2];while(1){if((c[n>>2]|0)>=(c[t>>2]|0))break;B=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];z=+g[p>>2]*+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];A=B+z*+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2]=A;c[n>>2]=(c[n>>2]|0)+1}a:do if((c[v>>2]|0)!=0&(c[w>>2]|0)>=2){g[y>>2]=+g[q>>2]-+g[c[o>>2]>>2];g[x>>2]=+g[y>>2]/+(c[w>>2]|0);c[n>>2]=c[r>>2];while(1){if((c[n>>2]|0)>=(c[w>>2]|0))break a;g[y>>2]=+g[y>>2]-+g[x>>2];e=(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)|0;g[e>>2]=+g[e>>2]+ +g[y>>2];if(1.0<+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2])F=1.0;else F=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];if(!(-1.0>F))if(1.0<+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2])G=1.0;else G=+g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2];else G=-1.0;g[(c[o>>2]|0)+((R(c[n>>2]|0,c[j>>2]|0)|0)<<2)>>2]=G;c[n>>2]=(c[n>>2]|0)+1}}while(0);c[r>>2]=c[t>>2]}while((c[r>>2]|0)!=(c[i>>2]|0));if((C|0)==23){C=0;g[p>>2]=0.0}g[(c[k>>2]|0)+(c[m>>2]<<2)>>2]=+g[p>>2];c[m>>2]=(c[m>>2]|0)+1}l=f;return}function Md(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[f>>2]=a;c[g>>2]=b;b=d[c[f>>2]>>0]|0;if((d[c[f>>2]>>0]|0)&128|0){c[h>>2]=b>>3&3;c[h>>2]=(c[g>>2]<<c[h>>2]|0)/400|0;i=c[h>>2]|0;l=e;return i|0}a=d[c[f>>2]>>0]|0;if((b&96|0)==96){c[h>>2]=(c[g>>2]|0)/((a&8|0?50:100)|0)|0;i=c[h>>2]|0;l=e;return i|0}c[h>>2]=a>>3&3;a=c[g>>2]|0;if((c[h>>2]|0)==3){c[h>>2]=(a*60|0)/1e3|0;i=c[h>>2]|0;l=e;return i|0}else{c[h>>2]=(a<<c[h>>2]|0)/100|0;i=c[h>>2]|0;l=e;return i|0}return 0}function Nd(e,f,g,h,i,j,k,m){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;n=l;l=l+80|0;o=n+72|0;p=n+68|0;q=n+64|0;r=n+60|0;s=n+56|0;t=n+52|0;u=n+48|0;v=n+44|0;w=n+40|0;x=n+36|0;y=n+32|0;z=n+28|0;A=n+24|0;B=n+77|0;C=n+76|0;D=n+20|0;E=n+16|0;F=n+12|0;G=n+8|0;H=n+4|0;I=n;c[p>>2]=e;c[q>>2]=f;c[r>>2]=g;c[s>>2]=h;c[t>>2]=i;c[u>>2]=j;c[v>>2]=k;c[w>>2]=m;c[F>>2]=0;c[G>>2]=c[p>>2];if(!(c[u>>2]|0)){c[o>>2]=-1;J=c[o>>2]|0;l=n;return J|0}c[D>>2]=Md(c[p>>2]|0,48e3)|0;c[A>>2]=0;m=c[p>>2]|0;c[p>>2]=m+1;a[C>>0]=a[m>>0]|0;c[q>>2]=(c[q>>2]|0)+-1;c[E>>2]=c[q>>2];a:do switch(d[C>>0]&3|0){case 0:{c[z>>2]=1;break}case 1:{c[z>>2]=2;c[A>>2]=1;if(!(c[r>>2]|0)){if(!(c[q>>2]&1)){c[E>>2]=(c[q>>2]|0)/2|0;b[c[u>>2]>>1]=c[E>>2];break a}c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}break}case 2:{c[z>>2]=2;c[y>>2]=Od(c[p>>2]|0,c[q>>2]|0,c[u>>2]|0)|0;c[q>>2]=(c[q>>2]|0)-(c[y>>2]|0);if((b[c[u>>2]>>1]|0)>=0?(b[c[u>>2]>>1]|0)<=(c[q>>2]|0):0){c[p>>2]=(c[p>>2]|0)+(c[y>>2]|0);c[E>>2]=(c[q>>2]|0)-(b[c[u>>2]>>1]|0);break a}c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}default:{if((c[q>>2]|0)<1){c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}m=c[p>>2]|0;c[p>>2]=m+1;a[B>>0]=a[m>>0]|0;c[z>>2]=d[B>>0]&63;if((c[z>>2]|0)>0?(R(c[D>>2]|0,c[z>>2]|0)|0)<=5760:0){c[q>>2]=(c[q>>2]|0)+-1;b:do if(d[B>>0]&64|0){while(1){if((c[q>>2]|0)<=0)break;m=c[p>>2]|0;c[p>>2]=m+1;c[H>>2]=d[m>>0];c[q>>2]=(c[q>>2]|0)+-1;c[I>>2]=(c[H>>2]|0)==255?254:c[H>>2]|0;c[q>>2]=(c[q>>2]|0)-(c[I>>2]|0);c[F>>2]=(c[F>>2]|0)+(c[I>>2]|0);if((c[H>>2]|0)!=255)break b}c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}while(0);if((c[q>>2]|0)<0){c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}c[A>>2]=((d[B>>0]&128|0)!=0^1)&1;if(c[A>>2]|0){if(c[r>>2]|0)break a;c[E>>2]=(c[q>>2]|0)/(c[z>>2]|0)|0;m=R(c[E>>2]|0,c[z>>2]|0)|0;if((m|0)!=(c[q>>2]|0)){c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[z>>2]|0)-1|0))break a;b[(c[u>>2]|0)+(c[x>>2]<<1)>>1]=c[E>>2];c[x>>2]=(c[x>>2]|0)+1}}c[E>>2]=c[q>>2];c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[z>>2]|0)-1|0))break;c[y>>2]=Od(c[p>>2]|0,c[q>>2]|0,(c[u>>2]|0)+(c[x>>2]<<1)|0)|0;c[q>>2]=(c[q>>2]|0)-(c[y>>2]|0);if((b[(c[u>>2]|0)+(c[x>>2]<<1)>>1]|0)<0){K=29;break}if((b[(c[u>>2]|0)+(c[x>>2]<<1)>>1]|0)>(c[q>>2]|0)){K=29;break}c[p>>2]=(c[p>>2]|0)+(c[y>>2]|0);c[E>>2]=(c[E>>2]|0)-((c[y>>2]|0)+(b[(c[u>>2]|0)+(c[x>>2]<<1)>>1]|0));c[x>>2]=(c[x>>2]|0)+1}if((K|0)==29){c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}if((c[E>>2]|0)>=0)break a;c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}}while(0);c:do if(c[r>>2]|0){c[y>>2]=Od(c[p>>2]|0,c[q>>2]|0,(c[u>>2]|0)+(c[z>>2]<<1)+-2|0)|0;c[q>>2]=(c[q>>2]|0)-(c[y>>2]|0);if((b[(c[u>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0)>=0?(b[(c[u>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0)<=(c[q>>2]|0):0){c[p>>2]=(c[p>>2]|0)+(c[y>>2]|0);if(!(c[A>>2]|0)){if(((c[y>>2]|0)+(b[(c[u>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0)|0)<=(c[E>>2]|0))break;c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}K=R(b[(c[u>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0,c[z>>2]|0)|0;if((K|0)>(c[q>>2]|0)){c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[z>>2]|0)-1|0))break c;b[(c[u>>2]|0)+(c[x>>2]<<1)>>1]=b[(c[u>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0;c[x>>2]=(c[x>>2]|0)+1}}c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}else{if((c[E>>2]|0)<=1275){b[(c[u>>2]|0)+((c[z>>2]|0)-1<<1)>>1]=c[E>>2];break}c[o>>2]=-4;J=c[o>>2]|0;l=n;return J|0}while(0);if(c[v>>2]|0)c[c[v>>2]>>2]=(c[p>>2]|0)-(c[G>>2]|0);c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[z>>2]|0))break;if(c[t>>2]|0)c[(c[t>>2]|0)+(c[x>>2]<<2)>>2]=c[p>>2];c[p>>2]=(c[p>>2]|0)+(b[(c[u>>2]|0)+(c[x>>2]<<1)>>1]|0);c[x>>2]=(c[x>>2]|0)+1}if(c[w>>2]|0)c[c[w>>2]>>2]=(c[F>>2]|0)+((c[p>>2]|0)-(c[G>>2]|0));if(c[s>>2]|0)a[c[s>>2]>>0]=a[C>>0]|0;c[o>>2]=c[z>>2];J=c[o>>2]|0;l=n;return J|0}function Od(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;g=l;l=l+16|0;h=g+12|0;i=g+8|0;j=g+4|0;k=g;c[i>>2]=a;c[j>>2]=e;c[k>>2]=f;if((c[j>>2]|0)<1){b[c[k>>2]>>1]=-1;c[h>>2]=-1;m=c[h>>2]|0;l=g;return m|0}if((d[c[i>>2]>>0]|0|0)<252){b[c[k>>2]>>1]=d[c[i>>2]>>0]|0;c[h>>2]=1;m=c[h>>2]|0;l=g;return m|0}if((c[j>>2]|0)<2){b[c[k>>2]>>1]=-1;c[h>>2]=-1;m=c[h>>2]|0;l=g;return m|0}else{b[c[k>>2]>>1]=((d[(c[i>>2]|0)+1>>0]|0)<<2)+(d[c[i>>2]>>0]|0);c[h>>2]=2;m=c[h>>2]|0;l=g;return m|0}return 0}function Pd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=l;l=l+32|0;d=b+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;c[e>>2]=a;if((c[e>>2]|0)<1|(c[e>>2]|0)>2){c[d>>2]=0;i=c[d>>2]|0;l=b;return i|0}c[h>>2]=xd(f)|0;if(c[h>>2]|0){c[d>>2]=0;i=c[d>>2]|0;l=b;return i|0}else{c[f>>2]=Qd(c[f>>2]|0)|0;c[g>>2]=Sb(c[e>>2]|0)|0;e=Qd(84)|0;c[d>>2]=e+(c[f>>2]|0)+(c[g>>2]|0);i=c[d>>2]|0;l=b;return i|0}return 0}function Qd(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;l=b;return (c[d>>2]|0)+4-1&-4|0}function Rd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;e=l;l=l+48|0;f=e;g=e+32|0;h=e+28|0;i=e+24|0;j=e+20|0;k=e+16|0;m=e+12|0;n=e+8|0;o=e+4|0;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;if(!((c[i>>2]|0)!=48e3&(c[i>>2]|0)!=24e3&(c[i>>2]|0)!=16e3&(c[i>>2]|0)!=12e3&(c[i>>2]|0)!=8e3)?!((c[j>>2]|0)!=1&(c[j>>2]|0)!=2):0){d=c[h>>2]|0;He(d|0,0,Pd(c[j>>2]|0)|0)|0;c[n>>2]=xd(o)|0;if(c[n>>2]|0){c[g>>2]=-3;p=c[g>>2]|0;l=e;return p|0}c[o>>2]=Qd(c[o>>2]|0)|0;d=Qd(84)|0;c[(c[h>>2]|0)+4>>2]=d;c[c[h>>2]>>2]=(c[(c[h>>2]|0)+4>>2]|0)+(c[o>>2]|0);c[k>>2]=(c[h>>2]|0)+(c[(c[h>>2]|0)+4>>2]|0);c[m>>2]=(c[h>>2]|0)+(c[c[h>>2]>>2]|0);o=c[j>>2]|0;c[(c[h>>2]|0)+8>>2]=o;c[(c[h>>2]|0)+44>>2]=o;c[(c[h>>2]|0)+12>>2]=c[i>>2];c[(c[h>>2]|0)+16+8>>2]=c[(c[h>>2]|0)+12>>2];c[(c[h>>2]|0)+16>>2]=c[(c[h>>2]|0)+8>>2];c[n>>2]=yd(c[k>>2]|0)|0;if(c[n>>2]|0){c[g>>2]=-3;p=c[g>>2]|0;l=e;return p|0}c[n>>2]=Ub(c[m>>2]|0,c[i>>2]|0,c[j>>2]|0)|0;if(c[n>>2]|0){c[g>>2]=-3;p=c[g>>2]|0;l=e;return p|0}else{n=c[m>>2]|0;c[f>>2]=0;Xb(n,10016,f)|0;c[(c[h>>2]|0)+56>>2]=0;c[(c[h>>2]|0)+60>>2]=(c[i>>2]|0)/400|0;c[g>>2]=0;p=c[g>>2]|0;l=e;return p|0}}c[g>>2]=-1;p=c[g>>2]|0;l=e;return p|0}function Sd(a,d,e,f,h,i,j,k,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;n=l;l=l+208|0;o=n+88|0;p=n+84|0;q=n+80|0;r=n+76|0;s=n+72|0;t=n+68|0;u=n+64|0;v=n+60|0;w=n+56|0;x=n+52|0;y=n+48|0;z=n+44|0;A=n+40|0;B=n+36|0;C=n+192|0;D=n+32|0;E=n+28|0;F=n+24|0;G=n+20|0;H=n+96|0;I=n+16|0;J=n+12|0;K=n+8|0;L=n+4|0;M=n;c[p>>2]=a;c[q>>2]=d;c[r>>2]=e;c[s>>2]=f;c[t>>2]=h;c[u>>2]=i;c[v>>2]=j;c[w>>2]=k;c[x>>2]=m;if((c[u>>2]|0)<0|(c[u>>2]|0)>1){c[o>>2]=-1;N=c[o>>2]|0;l=n;return N|0}if((c[u>>2]|0)!=0|(c[r>>2]|0)==0|(c[q>>2]|0)==0?(c[t>>2]|0)%((c[(c[p>>2]|0)+12>>2]|0)/400|0|0)|0|0:0){c[o>>2]=-1;N=c[o>>2]|0;l=n;return N|0}if((c[r>>2]|0)==0|(c[q>>2]|0)==0){c[I>>2]=0;while(1){m=(c[s>>2]|0)+((R(c[I>>2]|0,c[(c[p>>2]|0)+8>>2]|0)|0)<<2)|0;c[J>>2]=Td(c[p>>2]|0,0,0,m,(c[t>>2]|0)-(c[I>>2]|0)|0,0)|0;O=c[J>>2]|0;if((c[J>>2]|0)<0){P=9;break}c[I>>2]=(c[I>>2]|0)+O;if((c[I>>2]|0)>=(c[t>>2]|0)){P=11;break}}if((P|0)==9){c[o>>2]=O;N=c[o>>2]|0;l=n;return N|0}else if((P|0)==11){Ud()|0;c[(c[p>>2]|0)+68>>2]=c[I>>2];c[o>>2]=c[I>>2];N=c[o>>2]|0;l=n;return N|0}}if((c[r>>2]|0)<0){c[o>>2]=-1;N=c[o>>2]|0;l=n;return N|0}c[F>>2]=Vd(c[q>>2]|0)|0;c[E>>2]=Wd(c[q>>2]|0)|0;c[D>>2]=Md(c[q>>2]|0,c[(c[p>>2]|0)+12>>2]|0)|0;c[G>>2]=Xd(c[q>>2]|0)|0;c[A>>2]=Nd(c[q>>2]|0,c[r>>2]|0,c[v>>2]|0,C,0,H,B,c[w>>2]|0)|0;if((c[A>>2]|0)<0){c[o>>2]=c[A>>2];N=c[o>>2]|0;l=n;return N|0}c[q>>2]=(c[q>>2]|0)+(c[B>>2]|0);if(c[u>>2]|0){if(!((c[F>>2]|0)==1002?1:(c[t>>2]|0)<(c[D>>2]|0))?(c[(c[p>>2]|0)+52>>2]|0)!=1002:0){c[K>>2]=c[(c[p>>2]|0)+68>>2];if((c[t>>2]|0)-(c[D>>2]|0)|0?(c[L>>2]=Sd(c[p>>2]|0,0,0,c[s>>2]|0,(c[t>>2]|0)-(c[D>>2]|0)|0,0,0,0,c[x>>2]|0)|0,(c[L>>2]|0)<0):0){c[(c[p>>2]|0)+68>>2]=c[K>>2];c[o>>2]=c[L>>2];N=c[o>>2]|0;l=n;return N|0}c[(c[p>>2]|0)+52>>2]=c[F>>2];c[(c[p>>2]|0)+48>>2]=c[E>>2];c[(c[p>>2]|0)+60>>2]=c[D>>2];c[(c[p>>2]|0)+44>>2]=c[G>>2];K=(c[s>>2]|0)+((R(c[(c[p>>2]|0)+8>>2]|0,(c[t>>2]|0)-(c[D>>2]|0)|0)|0)<<2)|0;c[L>>2]=Td(c[p>>2]|0,c[q>>2]|0,b[H>>1]|0,K,c[D>>2]|0,1)|0;if((c[L>>2]|0)<0){c[o>>2]=c[L>>2];N=c[o>>2]|0;l=n;return N|0}else{Ud()|0;c[(c[p>>2]|0)+68>>2]=c[t>>2];c[o>>2]=c[t>>2];N=c[o>>2]|0;l=n;return N|0}}c[o>>2]=Sd(c[p>>2]|0,0,0,c[s>>2]|0,c[t>>2]|0,0,0,0,c[x>>2]|0)|0;N=c[o>>2]|0;l=n;return N|0}L=R(c[A>>2]|0,c[D>>2]|0)|0;if((L|0)>(c[t>>2]|0)){c[o>>2]=-2;N=c[o>>2]|0;l=n;return N|0}c[(c[p>>2]|0)+52>>2]=c[F>>2];c[(c[p>>2]|0)+48>>2]=c[E>>2];c[(c[p>>2]|0)+60>>2]=c[D>>2];c[(c[p>>2]|0)+44>>2]=c[G>>2];c[z>>2]=0;c[y>>2]=0;while(1){if((c[y>>2]|0)>=(c[A>>2]|0))break;G=(c[s>>2]|0)+((R(c[z>>2]|0,c[(c[p>>2]|0)+8>>2]|0)|0)<<2)|0;c[M>>2]=Td(c[p>>2]|0,c[q>>2]|0,b[H+(c[y>>2]<<1)>>1]|0,G,(c[t>>2]|0)-(c[z>>2]|0)|0,0)|0;if((c[M>>2]|0)<0){P=31;break}c[q>>2]=(c[q>>2]|0)+(b[H+(c[y>>2]<<1)>>1]|0);c[z>>2]=(c[z>>2]|0)+(c[M>>2]|0);c[y>>2]=(c[y>>2]|0)+1}if((P|0)==31){c[o>>2]=c[M>>2];N=c[o>>2]|0;l=n;return N|0}c[(c[p>>2]|0)+68>>2]=c[z>>2];Ud()|0;if(c[x>>2]|0)Ld(c[s>>2]|0,c[z>>2]|0,c[(c[p>>2]|0)+8>>2]|0,(c[p>>2]|0)+72|0);else{g[(c[p>>2]|0)+72+4>>2]=0.0;g[(c[p>>2]|0)+72>>2]=0.0}c[o>>2]=c[z>>2];N=c[o>>2]|0;l=n;return N|0}function Td(d,e,f,h,i,j){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;k=l;l=l+320|0;m=k+80|0;n=k+72|0;o=k+64|0;p=k+56|0;q=k+48|0;r=k+40|0;s=k+32|0;t=k+24|0;u=k+16|0;v=k+8|0;w=k;x=k+308|0;y=k+304|0;z=k+300|0;A=k+296|0;B=k+292|0;C=k+288|0;D=k+284|0;E=k+280|0;F=k+276|0;G=k+272|0;H=k+268|0;I=k+264|0;J=k+216|0;K=k+212|0;L=k+208|0;M=k+204|0;N=k+200|0;P=k+196|0;Q=k+192|0;S=k+188|0;T=k+184|0;U=k+180|0;V=k+176|0;W=k+172|0;X=k+168|0;Y=k+164|0;Z=k+160|0;_=k+156|0;$=k+152|0;aa=k+148|0;ba=k+144|0;ca=k+140|0;ea=k+136|0;fa=k+132|0;ha=k+128|0;ia=k+124|0;ja=k+120|0;ka=k+116|0;la=k+112|0;ma=k+108|0;na=k+104|0;oa=k+100|0;pa=k+96|0;qa=k+312|0;ra=k+92|0;sa=k+88|0;ta=k+84|0;c[y>>2]=d;c[z>>2]=e;c[A>>2]=f;c[B>>2]=h;c[C>>2]=i;c[D>>2]=j;c[H>>2]=0;c[I>>2]=0;c[P>>2]=0;c[U>>2]=0;c[W>>2]=0;c[X>>2]=0;c[Y>>2]=0;c[ea>>2]=0;c[E>>2]=(c[y>>2]|0)+(c[(c[y>>2]|0)+4>>2]|0);c[F>>2]=(c[y>>2]|0)+(c[c[y>>2]>>2]|0);c[ba>>2]=(c[(c[y>>2]|0)+12>>2]|0)/50|0;c[aa>>2]=c[ba>>2]>>1;c[$>>2]=c[aa>>2]>>1;c[_>>2]=c[$>>2]>>1;if((c[C>>2]|0)<(c[_>>2]|0)){c[x>>2]=-2;ua=c[x>>2]|0;l=k;return ua|0}if((c[C>>2]|0)<(((c[(c[y>>2]|0)+12>>2]|0)/25|0)*3|0))va=c[C>>2]|0;else va=((c[(c[y>>2]|0)+12>>2]|0)/25|0)*3|0;c[C>>2]=va;if((c[A>>2]|0)<=1){c[z>>2]=0;if((c[C>>2]|0)<(c[(c[y>>2]|0)+60>>2]|0))wa=c[C>>2]|0;else wa=c[(c[y>>2]|0)+60>>2]|0;c[C>>2]=wa}do if(!(c[z>>2]|0)){c[S>>2]=c[C>>2];c[T>>2]=c[(c[y>>2]|0)+56>>2];if(!(c[T>>2]|0)){c[G>>2]=0;while(1){if((c[G>>2]|0)>=(R(c[S>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0))break;g[(c[B>>2]|0)+(c[G>>2]<<2)>>2]=0.0;c[G>>2]=(c[G>>2]|0)+1}c[x>>2]=c[S>>2];ua=c[x>>2]|0;l=k;return ua|0}if((c[S>>2]|0)>(c[ba>>2]|0)){while(1){c[ha>>2]=Td(c[y>>2]|0,0,0,c[B>>2]|0,(c[S>>2]|0)<(c[ba>>2]|0)?c[S>>2]|0:c[ba>>2]|0,0)|0;xa=c[ha>>2]|0;if((c[ha>>2]|0)<0){ya=20;break}wa=R(xa,c[(c[y>>2]|0)+8>>2]|0)|0;c[B>>2]=(c[B>>2]|0)+(wa<<2);c[S>>2]=(c[S>>2]|0)-(c[ha>>2]|0);if((c[S>>2]|0)<=0){ya=22;break}}if((ya|0)==20){c[x>>2]=xa;ua=c[x>>2]|0;l=k;return ua|0}else if((ya|0)==22){c[x>>2]=c[C>>2];ua=c[x>>2]|0;l=k;return ua|0}}if((c[S>>2]|0)<(c[ba>>2]|0)){if((c[S>>2]|0)>(c[aa>>2]|0)){c[S>>2]=c[aa>>2];break}if(((c[T>>2]|0)!=1e3?(c[S>>2]|0)>(c[$>>2]|0):0)?(c[S>>2]|0)<(c[aa>>2]|0):0)c[S>>2]=c[$>>2]}}else{c[S>>2]=c[(c[y>>2]|0)+60>>2];c[T>>2]=c[(c[y>>2]|0)+52>>2];$b(J,c[z>>2]|0,c[A>>2]|0)}while(0);c[fa>>2]=0;c[M>>2]=1;c[N>>2]=1;do if(c[z>>2]|0?(c[(c[y>>2]|0)+56>>2]|0)>0:0){if(!(((c[T>>2]|0)==1002?(c[(c[y>>2]|0)+56>>2]|0)!=1002:0)?!(c[(c[y>>2]|0)+64>>2]|0):0)){if((c[T>>2]|0)==1002)break;if((c[(c[y>>2]|0)+56>>2]|0)!=1002)break}c[U>>2]=1;ya=R(c[$>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0;if((c[T>>2]|0)==1002){c[N>>2]=ya;break}else{c[M>>2]=ya;break}}while(0);ya=c[N>>2]|0;c[ia>>2]=da()|0;N=l;l=l+((1*(ya<<2)|0)+15&-16)|0;if((c[U>>2]|0)!=0&(c[T>>2]|0)==1002){c[P>>2]=N;Td(c[y>>2]|0,0,0,c[P>>2]|0,(c[$>>2]|0)<(c[S>>2]|0)?c[$>>2]|0:c[S>>2]|0,0)|0}a:do if((c[S>>2]|0)>(c[C>>2]|0)){c[x>>2]=-1;c[ja>>2]=1}else{c[C>>2]=c[S>>2];if((c[T>>2]|0)==1002|(c[fa>>2]|0)!=0)za=1;else za=R((c[aa>>2]|0)>(c[C>>2]|0)?c[aa>>2]|0:c[C>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0;c[L>>2]=za;N=l;l=l+((1*(c[L>>2]<<1)|0)+15&-16)|0;b:do if((c[T>>2]|0)!=1002){c[ma>>2]=N;if((c[(c[y>>2]|0)+56>>2]|0)==1002)yd(c[E>>2]|0)|0;if(10>(((c[S>>2]|0)*1e3|0)/(c[(c[y>>2]|0)+12>>2]|0)|0|0))Aa=10;else Aa=((c[S>>2]|0)*1e3|0)/(c[(c[y>>2]|0)+12>>2]|0)|0;c[(c[y>>2]|0)+16+16>>2]=Aa;if(c[z>>2]|0){c[(c[y>>2]|0)+16+4>>2]=c[(c[y>>2]|0)+44>>2];ya=c[y>>2]|0;if((c[T>>2]|0)==1e3){xa=c[y>>2]|0;if((c[ya+48>>2]|0)==1101){Ba=8e3;Ca=xa}else{ha=(c[xa+48>>2]|0)==1102;Ba=ha?12e3:16e3;Ca=ha?c[y>>2]|0:c[y>>2]|0}}else{Ba=16e3;Ca=ya}c[Ca+16+12>>2]=Ba}c[ka>>2]=(c[z>>2]|0)==0?1:c[D>>2]<<1;c[la>>2]=0;c:while(1){c[na>>2]=(c[la>>2]|0)==0&1;c[H>>2]=zd(c[E>>2]|0,(c[y>>2]|0)+16|0,c[ka>>2]|0,c[na>>2]|0,J,c[ma>>2]|0,K)|0;d:do if(c[H>>2]|0){if(!(c[ka>>2]|0))break c;c[K>>2]=c[C>>2];c[G>>2]=0;while(1){if((c[G>>2]|0)>=(R(c[C>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0))break d;b[(c[ma>>2]|0)+(c[G>>2]<<1)>>1]=0;c[G>>2]=(c[G>>2]|0)+1}}while(0);ya=R(c[K>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0;c[ma>>2]=(c[ma>>2]|0)+(ya<<1);c[la>>2]=(c[la>>2]|0)+(c[K>>2]|0);if((c[la>>2]|0)>=(c[C>>2]|0))break b}c[x>>2]=-3;c[ja>>2]=1;break a}while(0);c[V>>2]=0;if((c[D>>2]|0)==0&(c[T>>2]|0)!=1002&(c[z>>2]|0)!=0?(ya=(Yd(J)|0)+17|0,(ya+(((c[(c[y>>2]|0)+52>>2]|0)==1001&1)*20|0)|0)<=(c[A>>2]<<3|0)):0){if((c[T>>2]|0)==1001)c[W>>2]=Va(J,12)|0;else c[W>>2]=1;if(c[W>>2]|0){c[Y>>2]=Va(J,1)|0;if((c[T>>2]|0)==1001)Da=(Qa(J,256)|0)+2|0;else{ya=c[A>>2]|0;Da=ya-((Yd(J)|0)+7>>3)|0}c[X>>2]=Da;c[A>>2]=(c[A>>2]|0)-(c[X>>2]|0);ya=c[A>>2]<<3;if((ya|0)<(Yd(J)|0)){c[A>>2]=0;c[X>>2]=0;c[W>>2]=0}ya=J+4|0;c[ya>>2]=(c[ya>>2]|0)-(c[X>>2]|0)}}if((c[T>>2]|0)!=1002)c[V>>2]=17;c[oa>>2]=21;switch(c[(c[y>>2]|0)+48>>2]|0){case 1101:{c[oa>>2]=13;break}case 1103:case 1102:{c[oa>>2]=17;break}case 1104:{c[oa>>2]=19;break}case 1105:{c[oa>>2]=21;break}default:{}}ya=c[F>>2]|0;c[w>>2]=c[oa>>2];Xb(ya,10012,w)|0;ya=c[F>>2]|0;c[v>>2]=c[(c[y>>2]|0)+44>>2];Xb(ya,10008,v)|0;if(c[W>>2]|0){c[U>>2]=0;c[M>>2]=1}ya=l;l=l+((1*(c[M>>2]<<2)|0)+15&-16)|0;if((c[U>>2]|0)!=0&(c[T>>2]|0)!=1002){c[P>>2]=ya;Td(c[y>>2]|0,0,0,c[P>>2]|0,(c[$>>2]|0)<(c[S>>2]|0)?c[$>>2]|0:c[S>>2]|0,0)|0}if(c[W>>2]|0)Ea=R(c[$>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0;else Ea=1;c[Q>>2]=Ea;ya=l;l=l+((1*(c[Q>>2]<<2)|0)+15&-16)|0;if((c[W>>2]|0)!=0&(c[Y>>2]|0)!=0){ha=c[F>>2]|0;c[u>>2]=0;Xb(ha,10010,u)|0;Yb(c[F>>2]|0,(c[z>>2]|0)+(c[A>>2]|0)|0,c[X>>2]|0,ya,c[$>>2]|0,0,0)|0;ha=c[F>>2]|0;c[t>>2]=ea+(((ea-ea|0)/4|0)<<2);Xb(ha,4031,t)|0}ha=c[F>>2]|0;c[s>>2]=c[V>>2];Xb(ha,10010,s)|0;do if((c[T>>2]|0)==1e3){a[qa>>0]=a[25208]|0;a[qa+1>>0]=a[25209]|0;e:do if(!(c[fa>>2]|0)){c[G>>2]=0;while(1){if((c[G>>2]|0)>=(R(c[C>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0))break e;g[(c[B>>2]|0)+(c[G>>2]<<2)>>2]=0.0;c[G>>2]=(c[G>>2]|0)+1}}while(0);if((c[(c[y>>2]|0)+56>>2]|0)==1001){if((c[W>>2]|0)!=0&(c[Y>>2]|0)!=0?c[(c[y>>2]|0)+64>>2]|0:0)break;ha=c[F>>2]|0;c[q>>2]=0;Xb(ha,10010,q)|0;Yb(c[F>>2]|0,qa,2,c[B>>2]|0,c[_>>2]|0,0,c[fa>>2]|0)|0}}else{c[pa>>2]=(c[ba>>2]|0)<(c[C>>2]|0)?c[ba>>2]|0:c[C>>2]|0;do if((c[T>>2]|0)!=(c[(c[y>>2]|0)+56>>2]|0)){if((c[(c[y>>2]|0)+56>>2]|0)<=0)break;if(c[(c[y>>2]|0)+64>>2]|0)break;Xb(c[F>>2]|0,4028,r)|0}while(0);c[I>>2]=Yb(c[F>>2]|0,c[D>>2]|0?0:c[z>>2]|0,c[A>>2]|0,c[B>>2]|0,c[pa>>2]|0,J,c[fa>>2]|0)|0}while(0);f:do if(!((c[T>>2]|0)==1002|(c[fa>>2]|0)!=0)){c[G>>2]=0;while(1){if((c[G>>2]|0)>=(R(c[C>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0))break f;g[(c[B>>2]|0)+(c[G>>2]<<2)>>2]=+g[(c[B>>2]|0)+(c[G>>2]<<2)>>2]+ +(b[N+(c[G>>2]<<1)>>1]|0)*.000030517578125;c[G>>2]=(c[G>>2]|0)+1}}while(0);N=c[F>>2]|0;c[p>>2]=ra+(((ra-ra|0)/4|0)<<2);Xb(N,10015,p)|0;c[ca>>2]=c[(c[ra>>2]|0)+60>>2];if(!((c[W>>2]|0)==0|(c[Y>>2]|0)!=0)){Xb(c[F>>2]|0,4028,o)|0;N=c[F>>2]|0;c[n>>2]=0;Xb(N,10010,n)|0;Yb(c[F>>2]|0,(c[z>>2]|0)+(c[A>>2]|0)|0,c[X>>2]|0,ya,c[$>>2]|0,0,0)|0;N=c[F>>2]|0;c[m>>2]=ea+(((ea-ea|0)/4|0)<<2);Xb(N,4031,m)|0;N=(c[B>>2]|0)+((R(c[(c[y>>2]|0)+8>>2]|0,(c[C>>2]|0)-(c[_>>2]|0)|0)|0)<<2)|0;ha=ya+((R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0)<<2)|0;xa=(c[B>>2]|0)+((R(c[(c[y>>2]|0)+8>>2]|0,(c[C>>2]|0)-(c[_>>2]|0)|0)|0)<<2)|0;Zd(N,ha,xa,c[_>>2]|0,c[(c[y>>2]|0)+8>>2]|0,c[ca>>2]|0,c[(c[y>>2]|0)+12>>2]|0)}if((c[W>>2]|0)!=0&(c[Y>>2]|0)!=0){c[Z>>2]=0;while(1){if((c[Z>>2]|0)>=(c[(c[y>>2]|0)+8>>2]|0))break;c[G>>2]=0;while(1){if((c[G>>2]|0)>=(c[_>>2]|0))break;xa=R(c[(c[y>>2]|0)+8>>2]|0,c[G>>2]|0)|0;ha=R(c[(c[y>>2]|0)+8>>2]|0,c[G>>2]|0)|0;g[(c[B>>2]|0)+(ha+(c[Z>>2]|0)<<2)>>2]=+g[ya+(xa+(c[Z>>2]|0)<<2)>>2];c[G>>2]=(c[G>>2]|0)+1}c[Z>>2]=(c[Z>>2]|0)+1}xa=ya+((R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0)<<2)|0;ha=(c[B>>2]|0)+((R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0)<<2)|0;N=(c[B>>2]|0)+((R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0)<<2)|0;Zd(xa,ha,N,c[_>>2]|0,c[(c[y>>2]|0)+8>>2]|0,c[ca>>2]|0,c[(c[y>>2]|0)+12>>2]|0)}do if(c[U>>2]|0){if((c[S>>2]|0)<(c[$>>2]|0)){Zd(c[P>>2]|0,c[B>>2]|0,c[B>>2]|0,c[_>>2]|0,c[(c[y>>2]|0)+8>>2]|0,c[ca>>2]|0,c[(c[y>>2]|0)+12>>2]|0);break}c[G>>2]=0;while(1){N=(c[G>>2]|0)<(R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0);Fa=c[P>>2]|0;if(!N)break;g[(c[B>>2]|0)+(c[G>>2]<<2)>>2]=+g[Fa+(c[G>>2]<<2)>>2];c[G>>2]=(c[G>>2]|0)+1}N=Fa+((R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0)<<2)|0;ha=(c[B>>2]|0)+((R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0)<<2)|0;xa=(c[B>>2]|0)+((R(c[(c[y>>2]|0)+8>>2]|0,c[_>>2]|0)|0)<<2)|0;Zd(N,ha,xa,c[_>>2]|0,c[(c[y>>2]|0)+8>>2]|0,c[ca>>2]|0,c[(c[y>>2]|0)+12>>2]|0)}while(0);g:do if(c[(c[y>>2]|0)+40>>2]|0){g[sa>>2]=+O(+(+(c[(c[y>>2]|0)+40>>2]|0)*6.488140788860619e-04*.6931471805599453));c[G>>2]=0;while(1){if((c[G>>2]|0)>=(R(c[C>>2]|0,c[(c[y>>2]|0)+8>>2]|0)|0))break g;g[ta>>2]=+g[(c[B>>2]|0)+(c[G>>2]<<2)>>2]*+g[sa>>2];g[(c[B>>2]|0)+(c[G>>2]<<2)>>2]=+g[ta>>2];c[G>>2]=(c[G>>2]|0)+1}}while(0);if((c[A>>2]|0)<=1){Ga=c[y>>2]|0;Ha=0}else{Ga=c[y>>2]|0;Ha=c[J+28>>2]^c[ea>>2]}c[Ga+80>>2]=Ha;c[(c[y>>2]|0)+56>>2]=c[T>>2];if(c[W>>2]|0)Ia=(c[Y>>2]|0)!=0^1;else Ia=0;c[(c[y>>2]|0)+64>>2]=Ia&1;if((c[I>>2]|0)>=0)Ud()|0;c[x>>2]=(c[I>>2]|0)<0?c[I>>2]|0:c[S>>2]|0;c[ja>>2]=1}while(0);ga(c[ia>>2]|0);ua=c[x>>2]|0;l=k;return ua|0}function Ud(){return 0}function Vd(a){a=a|0;var b=0,e=0,f=0;b=l;l=l+16|0;e=b+4|0;f=b;c[e>>2]=a;do if(!((d[c[e>>2]>>0]|0)&128|0))if(((d[c[e>>2]>>0]|0)&96|0)==96){c[f>>2]=1001;break}else{c[f>>2]=1e3;break}else c[f>>2]=1002;while(0);l=b;return c[f>>2]|0}function Wd(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=l;l=l+16|0;e=b+4|0;f=b;c[e>>2]=a;a=d[c[e>>2]>>0]|0;if((d[c[e>>2]>>0]|0)&128|0){g=1102+(a>>5&3)|0;c[f>>2]=g;c[f>>2]=(c[f>>2]|0)==1102?1101:g;h=c[f>>2]|0;l=b;return h|0}g=d[c[e>>2]>>0]|0;if((a&96|0)==96){c[f>>2]=g&16|0?1105:1104;h=c[f>>2]|0;l=b;return h|0}else{c[f>>2]=1101+(g>>5&3);h=c[f>>2]|0;l=b;return h|0}return 0}function Xd(a){a=a|0;var b=0,e=0;b=l;l=l+16|0;e=b;c[e>>2]=a;l=b;return ((d[c[e>>2]>>0]|0)&4|0?2:1)|0}function Yd(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(U(c[(c[d>>2]|0)+28>>2]|0)|0))|0;l=b;return a|0}function Zd(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;j=l;l=l+48|0;k=j+40|0;m=j+36|0;n=j+32|0;o=j+28|0;p=j+24|0;q=j+20|0;r=j+16|0;s=j+12|0;t=j+8|0;u=j+4|0;v=j;c[k>>2]=a;c[m>>2]=b;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=h;c[r>>2]=i;c[u>>2]=48e3/(c[r>>2]|0)|0;c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[p>>2]|0))break;c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[o>>2]|0))break;w=+g[(c[q>>2]|0)+((R(c[s>>2]|0,c[u>>2]|0)|0)<<2)>>2];g[v>>2]=w*+g[(c[q>>2]|0)+((R(c[s>>2]|0,c[u>>2]|0)|0)<<2)>>2];r=R(c[s>>2]|0,c[p>>2]|0)|0;i=R(c[s>>2]|0,c[p>>2]|0)|0;h=R(c[s>>2]|0,c[p>>2]|0)|0;g[(c[n>>2]|0)+(h+(c[t>>2]|0)<<2)>>2]=+g[v>>2]*+g[(c[m>>2]|0)+(r+(c[t>>2]|0)<<2)>>2]+(1.0-+g[v>>2])*+g[(c[k>>2]|0)+(i+(c[t>>2]|0)<<2)>>2];c[s>>2]=(c[s>>2]|0)+1}c[t>>2]=(c[t>>2]|0)+1}l=j;return}function _d(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[k>>2]=$d(c[g>>2]|0,c[h>>2]|0)|0;h=c[k>>2]|0;if((c[k>>2]|0)<0){c[f>>2]=h;m=c[f>>2]|0;l=e;return m|0}c[j>>2]=R(h,Md(c[g>>2]|0,c[i>>2]|0)|0)|0;if(((c[j>>2]|0)*25|0)>((c[i>>2]|0)*3|0)){c[f>>2]=-4;m=c[f>>2]|0;l=e;return m|0}else{c[f>>2]=c[j>>2];m=c[f>>2]|0;l=e;return m|0}return 0}function $d(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=a;c[h>>2]=b;do if((c[h>>2]|0)>=1){c[i>>2]=(d[c[g>>2]>>0]|0)&3;if(!(c[i>>2]|0)){c[f>>2]=1;break}if((c[i>>2]|0)!=3){c[f>>2]=2;break}if((c[h>>2]|0)<2){c[f>>2]=-4;break}else{c[f>>2]=(d[(c[g>>2]|0)+1>>0]|0)&63;break}}else c[f>>2]=-1;while(0);l=e;return c[f>>2]|0}function ae(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;e=l;l=l+112|0;f=e+8|0;g=e+108|0;h=e+104|0;i=e+100|0;j=e+96|0;k=e+80|0;m=e+72|0;n=e+68|0;o=e+64|0;p=e+60|0;q=e+56|0;r=e+52|0;s=e+48|0;t=e+44|0;u=e+40|0;v=e+36|0;w=e+32|0;x=e+28|0;y=e+24|0;z=e+20|0;A=e+16|0;B=e+12|0;c[h>>2]=a;c[i>>2]=b;c[j>>2]=0;c[m>>2]=(c[h>>2]|0)+(c[(c[h>>2]|0)+4>>2]|0);c[n>>2]=(c[h>>2]|0)+(c[c[h>>2]>>2]|0);c[k>>2]=d;a:do switch(c[i>>2]|0){case 4009:{d=(c[k>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[k>>2]=d+4;c[p>>2]=b;c[o>>2]=c[p>>2];if(c[o>>2]|0){c[c[o>>2]>>2]=c[(c[h>>2]|0)+48>>2];C=20}else C=21;break}case 4031:{b=(c[k>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[k>>2]=b+4;c[r>>2]=d;c[q>>2]=c[r>>2];if(c[q>>2]|0){c[c[q>>2]>>2]=c[(c[h>>2]|0)+80>>2];C=20}else C=21;break}case 4028:{He((c[h>>2]|0)+44|0,0,84-((c[h>>2]|0)+44-(c[h>>2]|0))|0)|0;Xb(c[n>>2]|0,4028,e)|0;yd(c[m>>2]|0)|0;c[(c[h>>2]|0)+44>>2]=c[(c[h>>2]|0)+8>>2];c[(c[h>>2]|0)+60>>2]=(c[(c[h>>2]|0)+12>>2]|0)/400|0;C=20;break}case 4029:{d=(c[k>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[k>>2]=d+4;c[t>>2]=b;c[s>>2]=c[t>>2];if(c[s>>2]|0){c[c[s>>2]>>2]=c[(c[h>>2]|0)+12>>2];C=20}else C=21;break}case 4033:{b=(c[k>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[k>>2]=b+4;c[v>>2]=d;c[u>>2]=c[v>>2];if(c[u>>2]|0)if((c[(c[h>>2]|0)+56>>2]|0)==1002){d=c[n>>2]|0;c[f>>2]=(c[u>>2]|0)+((((c[u>>2]|0)-(c[u>>2]|0)|0)/4|0)<<2);Xb(d,4033,f)|0;C=20;break a}else{c[c[u>>2]>>2]=c[(c[h>>2]|0)+16+20>>2];C=20;break a}else C=21;break}case 4045:{d=(c[k>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[k>>2]=d+4;c[x>>2]=b;c[w>>2]=c[x>>2];if(c[w>>2]|0){c[c[w>>2]>>2]=c[(c[h>>2]|0)+40>>2];C=20}else C=21;break}case 4034:{b=(c[k>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[k>>2]=b+4;c[z>>2]=d;c[y>>2]=c[z>>2];if((c[y>>2]|0)<-32768|(c[y>>2]|0)>32767)C=21;else{c[(c[h>>2]|0)+40>>2]=c[y>>2];C=20}break}case 4039:{d=(c[k>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[k>>2]=d+4;c[B>>2]=b;c[A>>2]=c[B>>2];if(c[A>>2]|0){c[c[A>>2]>>2]=c[(c[h>>2]|0)+68>>2];C=20}else C=21;break}default:{c[j>>2]=-5;C=20}}while(0);if((C|0)==20){c[g>>2]=c[j>>2];D=c[g>>2]|0;l=e;return D|0}else if((C|0)==21){c[g>>2]=-1;D=c[g>>2]|0;l=e;return D|0}return 0}function be(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;c[f>>2]=a;c[h>>2]=(c[(c[f>>2]|0)+4>>2]|0)+(c[(c[f>>2]|0)+8>>2]|0);if((c[h>>2]|0)>255){c[e>>2]=0;i=c[e>>2]|0;l=b;return i|0}c[g>>2]=0;while(1){if((c[g>>2]|0)>=(c[c[f>>2]>>2]|0)){j=9;break}if((d[(c[f>>2]|0)+12+(c[g>>2]|0)>>0]|0|0)>=(c[h>>2]|0)?(d[(c[f>>2]|0)+12+(c[g>>2]|0)>>0]|0|0)!=255:0){j=7;break}c[g>>2]=(c[g>>2]|0)+1}if((j|0)==7){c[e>>2]=0;i=c[e>>2]|0;l=b;return i|0}else if((j|0)==9){c[e>>2]=1;i=c[e>>2]|0;l=b;return i|0}return 0}function ce(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=e;c[k>>2]=(c[j>>2]|0)<0?0:(c[j>>2]|0)+1|0;while(1){if((c[k>>2]|0)>=(c[c[h>>2]>>2]|0)){m=6;break}n=c[k>>2]|0;if((d[(c[h>>2]|0)+12+(c[k>>2]|0)>>0]|0|0)==(c[i>>2]<<1|0)){m=4;break}c[k>>2]=n+1}if((m|0)==4){c[g>>2]=n;o=c[g>>2]|0;l=f;return o|0}else if((m|0)==6){c[g>>2]=-1;o=c[g>>2]|0;l=f;return o|0}return 0}function de(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=e;c[k>>2]=(c[j>>2]|0)<0?0:(c[j>>2]|0)+1|0;while(1){if((c[k>>2]|0)>=(c[c[h>>2]>>2]|0)){m=6;break}n=c[k>>2]|0;if((d[(c[h>>2]|0)+12+(c[k>>2]|0)>>0]|0|0)==((c[i>>2]<<1)+1|0)){m=4;break}c[k>>2]=n+1}if((m|0)==4){c[g>>2]=n;o=c[g>>2]|0;l=f;return o|0}else if((m|0)==6){c[g>>2]=-1;o=c[g>>2]|0;l=f;return o|0}return 0}function ee(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=e;c[k>>2]=(c[j>>2]|0)<0?0:(c[j>>2]|0)+1|0;while(1){if((c[k>>2]|0)>=(c[c[h>>2]>>2]|0)){m=6;break}n=c[k>>2]|0;if((d[(c[h>>2]|0)+12+(c[k>>2]|0)>>0]|0|0)==((c[i>>2]|0)+(c[(c[h>>2]|0)+8>>2]|0)|0)){m=4;break}c[k>>2]=n+1}if((m|0)==4){c[g>>2]=n;o=c[g>>2]|0;l=f;return o|0}else if((m|0)==6){c[g>>2]=-1;o=c[g>>2]|0;l=f;return o|0}return 0}function fe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;i=d;c[f>>2]=a;c[g>>2]=b;if((c[f>>2]|0)>=1?!((c[g>>2]|0)<0?1:(c[g>>2]|0)>(c[f>>2]|0)):0){c[h>>2]=Pd(2)|0;c[i>>2]=Pd(1)|0;b=ge(268)|0;a=c[g>>2]|0;j=b+(R(a,ge(c[h>>2]|0)|0)|0)|0;h=(c[f>>2]|0)-(c[g>>2]|0)|0;c[e>>2]=j+(R(h,ge(c[i>>2]|0)|0)|0);k=c[e>>2]|0;l=d;return k|0}c[e>>2]=0;k=c[e>>2]|0;l=d;return k|0}function ge(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;l=b;return (c[d>>2]|0)+4-1&-4|0}function he(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;i=l;l=l+48|0;j=i+44|0;k=i+40|0;m=i+36|0;n=i+32|0;o=i+28|0;p=i+24|0;q=i+20|0;r=i+16|0;s=i+12|0;t=i+8|0;u=i+4|0;v=i;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=g;c[q>>2]=h;if((!((c[n>>2]|0)>255|(c[n>>2]|0)<1)?(c[p>>2]|0)<=(c[o>>2]|0):0)?!(((c[o>>2]|0)<1?1:((c[p>>2]|0)+(c[o>>2]|0)|0)>255)|(c[p>>2]|0)<0):0){c[c[k>>2]>>2]=c[n>>2];c[(c[k>>2]|0)+4>>2]=c[o>>2];c[(c[k>>2]|0)+8>>2]=c[p>>2];c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[c[k>>2]>>2]|0))break;a[(c[k>>2]|0)+12+(c[t>>2]|0)>>0]=a[(c[q>>2]|0)+(c[t>>2]|0)>>0]|0;c[t>>2]=(c[t>>2]|0)+1}if(!(be(c[k>>2]|0)|0)){c[j>>2]=-1;w=c[j>>2]|0;l=i;return w|0}q=c[k>>2]|0;c[v>>2]=q+(ge(268)|0);c[r>>2]=Pd(2)|0;c[s>>2]=Pd(1)|0;c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[(c[k>>2]|0)+8>>2]|0))break;c[u>>2]=Rd(c[v>>2]|0,c[m>>2]|0,2)|0;if(c[u>>2]|0){x=13;break}q=ge(c[r>>2]|0)|0;c[v>>2]=(c[v>>2]|0)+q;c[t>>2]=(c[t>>2]|0)+1}if((x|0)==13){c[j>>2]=c[u>>2];w=c[j>>2]|0;l=i;return w|0}while(1){if((c[t>>2]|0)>=(c[(c[k>>2]|0)+4>>2]|0)){x=19;break}c[u>>2]=Rd(c[v>>2]|0,c[m>>2]|0,1)|0;if(c[u>>2]|0){x=17;break}r=ge(c[s>>2]|0)|0;c[v>>2]=(c[v>>2]|0)+r;c[t>>2]=(c[t>>2]|0)+1}if((x|0)==17){c[j>>2]=c[u>>2];w=c[j>>2]|0;l=i;return w|0}else if((x|0)==19){c[j>>2]=0;w=c[j>>2]|0;l=i;return w|0}}c[j>>2]=-1;w=c[j>>2]|0;l=i;return w|0}function ie(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=l;l=l+48|0;i=h+32|0;j=h+28|0;k=h+24|0;m=h+20|0;n=h+16|0;o=h+12|0;p=h+8|0;q=h+4|0;r=h;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=g;if((!((c[k>>2]|0)>255|(c[k>>2]|0)<1)?(c[n>>2]|0)<=(c[m>>2]|0):0)?!(((c[m>>2]|0)<1?1:((c[n>>2]|0)+(c[m>>2]|0)|0)>255)|(c[n>>2]|0)<0):0){c[r>>2]=je(fe(c[m>>2]|0,c[n>>2]|0)|0)|0;if(!(c[r>>2]|0)){if(c[p>>2]|0)c[c[p>>2]>>2]=-7;c[i>>2]=0;s=c[i>>2]|0;l=h;return s|0}c[q>>2]=he(c[r>>2]|0,c[j>>2]|0,c[k>>2]|0,c[m>>2]|0,c[n>>2]|0,c[o>>2]|0)|0;if(c[p>>2]|0)c[c[p>>2]>>2]=c[q>>2];if(c[q>>2]|0){ke(c[r>>2]|0);c[r>>2]=0}c[i>>2]=c[r>>2];s=c[i>>2]|0;l=h;return s|0}if(c[p>>2]|0)c[c[p>>2]>>2]=-1;c[i>>2]=0;s=c[i>>2]|0;l=h;return s|0}function je(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=Ce(c[d>>2]|0)|0;l=b;return a|0}function ke(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;De(c[d>>2]|0);l=b;return}function le(a,b,e,f,g,h,i,j){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;k=l;l=l+112|0;m=k;n=k+104|0;o=k+100|0;p=k+96|0;q=k+92|0;r=k+88|0;s=k+84|0;t=k+80|0;u=k+76|0;v=k+72|0;w=k+68|0;x=k+64|0;y=k+60|0;z=k+56|0;A=k+52|0;B=k+48|0;C=k+44|0;D=k+40|0;E=k+36|0;F=k+32|0;G=k+28|0;H=k+24|0;I=k+20|0;J=k+16|0;K=k+12|0;L=k+8|0;M=k+4|0;c[o>>2]=a;c[p>>2]=b;c[q>>2]=e;c[r>>2]=f;c[s>>2]=g;c[t>>2]=h;c[u>>2]=i;c[v>>2]=j;c[C>>2]=0;j=c[o>>2]|0;c[m>>2]=w+(((w-w|0)/4|0)<<2);me(j,4029,m)|0;if((c[t>>2]|0)<(((c[w>>2]|0)/25|0)*3|0))N=c[t>>2]|0;else N=((c[w>>2]|0)/25|0)*3|0;c[t>>2]=N;N=c[t>>2]<<1;c[D>>2]=da()|0;m=l;l=l+((1*(N<<2)|0)+15&-16)|0;N=c[o>>2]|0;c[B>>2]=N+(ge(268)|0);c[x>>2]=Pd(2)|0;c[y>>2]=Pd(1)|0;if(!(c[q>>2]|0))c[C>>2]=1;if((c[q>>2]|0)<0){c[n>>2]=-1;c[E>>2]=1;O=c[D>>2]|0;ga(O|0);P=c[n>>2]|0;l=k;return P|0}if((c[C>>2]|0)==0?(c[q>>2]|0)<((c[(c[o>>2]|0)+4>>2]<<1)-1|0):0){c[n>>2]=-4;c[E>>2]=1;O=c[D>>2]|0;ga(O|0);P=c[n>>2]|0;l=k;return P|0}if(!(c[C>>2]|0)){c[F>>2]=ne(c[p>>2]|0,c[q>>2]|0,c[(c[o>>2]|0)+4>>2]|0,c[w>>2]|0)|0;w=c[F>>2]|0;if((c[F>>2]|0)<0){c[n>>2]=w;c[E>>2]=1;O=c[D>>2]|0;ga(O|0);P=c[n>>2]|0;l=k;return P|0}if((w|0)>(c[t>>2]|0)){c[n>>2]=-2;c[E>>2]=1;O=c[D>>2]|0;ga(O|0);P=c[n>>2]|0;l=k;return P|0}}c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[(c[o>>2]|0)+4>>2]|0)){Q=33;break}c[G>>2]=c[B>>2];w=ge((c[z>>2]|0)<(c[(c[o>>2]|0)+8>>2]|0)?c[x>>2]|0:c[y>>2]|0)|0;c[B>>2]=(c[B>>2]|0)+w;if((c[C>>2]|0)==0&(c[q>>2]|0)<=0){Q=19;break}c[H>>2]=0;c[I>>2]=Sd(c[G>>2]|0,c[p>>2]|0,c[q>>2]|0,m,c[t>>2]|0,c[u>>2]|0,(c[z>>2]|0)!=((c[(c[o>>2]|0)+4>>2]|0)-1|0)&1,H,c[v>>2]|0)|0;c[p>>2]=(c[p>>2]|0)+(c[H>>2]|0);c[q>>2]=(c[q>>2]|0)-(c[H>>2]|0);R=c[I>>2]|0;if((c[I>>2]|0)<=0){Q=21;break}c[t>>2]=R;a:do if((c[z>>2]|0)<(c[(c[o>>2]|0)+8>>2]|0)){c[K>>2]=-1;while(1){w=ce(c[o>>2]|0,c[z>>2]|0,c[K>>2]|0)|0;c[J>>2]=w;if((w|0)==-1)break;ia[c[s>>2]&1](c[r>>2]|0,c[c[o>>2]>>2]|0,c[J>>2]|0,m,2,c[t>>2]|0);c[K>>2]=c[J>>2]}c[K>>2]=-1;while(1){w=de(c[o>>2]|0,c[z>>2]|0,c[K>>2]|0)|0;c[J>>2]=w;if((w|0)==-1)break a;ia[c[s>>2]&1](c[r>>2]|0,c[c[o>>2]>>2]|0,c[J>>2]|0,m+4|0,2,c[t>>2]|0);c[K>>2]=c[J>>2]}}else{c[M>>2]=-1;while(1){w=ee(c[o>>2]|0,c[z>>2]|0,c[M>>2]|0)|0;c[L>>2]=w;if((w|0)==-1)break a;ia[c[s>>2]&1](c[r>>2]|0,c[c[o>>2]>>2]|0,c[L>>2]|0,m,1,c[t>>2]|0);c[M>>2]=c[L>>2]}}while(0);c[z>>2]=(c[z>>2]|0)+1}if((Q|0)==19){c[n>>2]=-3;c[E>>2]=1;O=c[D>>2]|0;ga(O|0);P=c[n>>2]|0;l=k;return P|0}else if((Q|0)==21){c[n>>2]=R;c[E>>2]=1;O=c[D>>2]|0;ga(O|0);P=c[n>>2]|0;l=k;return P|0}else if((Q|0)==33){c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[c[o>>2]>>2]|0))break;if((d[(c[o>>2]|0)+12+(c[A>>2]|0)>>0]|0|0)==255)ia[c[s>>2]&1](c[r>>2]|0,c[c[o>>2]>>2]|0,c[A>>2]|0,0,0,c[t>>2]|0);c[A>>2]=(c[A>>2]|0)+1}c[n>>2]=c[t>>2];c[E>>2]=1;O=c[D>>2]|0;ga(O|0);P=c[n>>2]|0;l=k;return P|0}return 0}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;e=l;l=l+160|0;f=e+24|0;g=e+16|0;h=e+8|0;i=e;j=e+144|0;k=e+140|0;m=e+136|0;n=e+120|0;o=e+116|0;p=e+112|0;q=e+108|0;r=e+104|0;s=e+100|0;t=e+96|0;u=e+92|0;v=e+88|0;w=e+84|0;x=e+80|0;y=e+76|0;z=e+72|0;A=e+68|0;B=e+64|0;C=e+60|0;D=e+56|0;E=e+52|0;F=e+48|0;G=e+44|0;H=e+40|0;I=e+36|0;J=e+32|0;K=e+28|0;c[k>>2]=a;c[m>>2]=b;c[r>>2]=0;c[n>>2]=d;c[o>>2]=Pd(2)|0;c[p>>2]=Pd(1)|0;d=c[k>>2]|0;c[q>>2]=d+(ge(268)|0);a:do switch(c[m>>2]|0){case 4039:case 4045:case 4029:case 4009:{d=(c[n>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[n>>2]=d+4;c[u>>2]=b;c[t>>2]=c[u>>2];c[s>>2]=c[q>>2];b=c[s>>2]|0;d=c[m>>2]|0;c[i>>2]=c[t>>2];c[r>>2]=ae(b,d,i)|0;L=37;break}case 4031:{d=(c[n>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[n>>2]=d+4;c[x>>2]=b;c[w>>2]=c[x>>2];if(c[w>>2]|0){c[c[w>>2]>>2]=0;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[(c[k>>2]|0)+4>>2]|0)){L=37;break a}c[z>>2]=c[q>>2];if((c[v>>2]|0)<(c[(c[k>>2]|0)+8>>2]|0)){b=ge(c[o>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+b}else{b=ge(c[p>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+b}b=c[z>>2]|0;d=c[m>>2]|0;c[h>>2]=y;c[r>>2]=ae(b,d,h)|0;if(c[r>>2]|0){L=37;break a}d=c[w>>2]|0;c[d>>2]=c[d>>2]^c[y>>2];c[v>>2]=(c[v>>2]|0)+1}}else L=38;break}case 4028:{c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[(c[k>>2]|0)+4>>2]|0)){L=37;break a}c[B>>2]=c[q>>2];if((c[A>>2]|0)<(c[(c[k>>2]|0)+8>>2]|0)){d=ge(c[o>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+d}else{d=ge(c[p>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+d}c[r>>2]=ae(c[B>>2]|0,4028,g)|0;if(c[r>>2]|0){L=37;break a}c[A>>2]=(c[A>>2]|0)+1}break}case 5122:{d=(c[n>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[n>>2]=d+4;c[F>>2]=b;c[D>>2]=c[F>>2];if(!((c[D>>2]|0)>=0?(c[D>>2]|0)<(c[(c[k>>2]|0)+4>>2]|0):0))c[r>>2]=-1;b=(c[n>>2]|0)+(4-1)&~(4-1);d=c[b>>2]|0;c[n>>2]=b+4;c[G>>2]=d;c[E>>2]=c[G>>2];if(c[E>>2]|0){c[C>>2]=0;while(1){if((c[C>>2]|0)>=(c[D>>2]|0))break;if((c[C>>2]|0)<(c[(c[k>>2]|0)+8>>2]|0)){d=ge(c[o>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+d}else{d=ge(c[p>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+d}c[C>>2]=(c[C>>2]|0)+1}c[c[E>>2]>>2]=c[q>>2];L=37}else L=38;break}case 4034:{d=(c[n>>2]|0)+(4-1)&~(4-1);b=c[d>>2]|0;c[n>>2]=d+4;c[J>>2]=b;c[I>>2]=c[J>>2];c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[(c[k>>2]|0)+4>>2]|0)){L=37;break a}c[K>>2]=c[q>>2];if((c[H>>2]|0)<(c[(c[k>>2]|0)+8>>2]|0)){b=ge(c[o>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+b}else{b=ge(c[p>>2]|0)|0;c[q>>2]=(c[q>>2]|0)+b}b=c[K>>2]|0;d=c[m>>2]|0;c[f>>2]=c[I>>2];c[r>>2]=ae(b,d,f)|0;if(c[r>>2]|0){L=37;break a}c[H>>2]=(c[H>>2]|0)+1}break}default:{c[r>>2]=-5;L=37}}while(0);if((L|0)==37){c[j>>2]=c[r>>2];M=c[j>>2]|0;l=e;return M|0}else if((L|0)==38){c[j>>2]=-1;M=c[j>>2]|0;l=e;return M|0}return 0}function ne(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+144|0;g=f+36|0;h=f+32|0;i=f+28|0;j=f+24|0;k=f+20|0;m=f+16|0;n=f+12|0;o=f+136|0;p=f+40|0;q=f+8|0;r=f+4|0;s=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[q>>2]=0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0)){t=11;break}if((c[i>>2]|0)<=0){t=4;break}c[n>>2]=Nd(c[h>>2]|0,c[i>>2]|0,(c[m>>2]|0)!=((c[j>>2]|0)-1|0)&1,o,0,p,0,r)|0;if((c[n>>2]|0)<0){t=6;break}c[s>>2]=_d(c[h>>2]|0,c[r>>2]|0,c[k>>2]|0)|0;if(c[m>>2]|0?(c[q>>2]|0)!=(c[s>>2]|0):0){t=9;break}c[q>>2]=c[s>>2];c[h>>2]=(c[h>>2]|0)+(c[r>>2]|0);c[i>>2]=(c[i>>2]|0)-(c[r>>2]|0);c[m>>2]=(c[m>>2]|0)+1}if((t|0)==4){c[g>>2]=-4;u=c[g>>2]|0;l=f;return u|0}else if((t|0)==6){c[g>>2]=c[n>>2];u=c[g>>2]|0;l=f;return u|0}else if((t|0)==9){c[g>>2]=-4;u=c[g>>2]|0;l=f;return u|0}else if((t|0)==11){c[g>>2]=c[q>>2];u=c[g>>2]|0;l=f;return u|0}return 0}function oe(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;h=l;l=l+32|0;i=h+20|0;j=h+16|0;k=h+12|0;m=h+8|0;n=h+4|0;o=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;g=le(c[i>>2]|0,c[j>>2]|0,c[k>>2]|0,c[m>>2]|0,1,c[n>>2]|0,c[o>>2]|0,0)|0;l=h;return g|0}function pe(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;i=l;l=l+32|0;j=i+28|0;k=i+24|0;m=i+20|0;n=i+16|0;o=i+12|0;p=i+8|0;q=i+4|0;r=i;c[j>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[q>>2]=c[j>>2];j=(c[n>>2]|0)!=0;c[r>>2]=0;if(j){while(1){if((c[r>>2]|0)>=(c[p>>2]|0))break;s=+g[(c[n>>2]|0)+((R(c[r>>2]|0,c[o>>2]|0)|0)<<2)>>2];j=R(c[r>>2]|0,c[k>>2]|0)|0;g[(c[q>>2]|0)+(j+(c[m>>2]|0)<<2)>>2]=s;c[r>>2]=(c[r>>2]|0)+1}l=i;return}else{while(1){if((c[r>>2]|0)>=(c[p>>2]|0))break;o=R(c[r>>2]|0,c[k>>2]|0)|0;g[(c[q>>2]|0)+(o+(c[m>>2]|0)<<2)>>2]=0.0;c[r>>2]=(c[r>>2]|0)+1}l=i;return}}function qe(){return}function re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0.0;d=l;l=l+48|0;e=d+32|0;f=d;ue(f,a,b);switch(c[6305]|0){case 0:{b=we(f,25228,25232,25236,25240,25244)|0;c[6306]=b;if(!b){h=0;l=d;return h|0}c[6305]=1;i=+g[6310];if(i!=0.0){c[e>>2]=~~i;me(b,4034,e)|0}c[6305]=1;h=1;l=d;return h|0}case 1:{c[6305]=2;h=1;l=d;return h|0}default:{$(c[6308]|0,48e3);h=1;l=d;return h|0}}return 0}function se(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=Ce((c[6308]|0)*23040|0)|0;e=oe(c[6306]|0,a,b,d,5760,0)|0;if((e|0)<0){f=0;De(d);return f|0}b=c[6309]|0;if((e|0)>(b|0)){a=e-b|0;g=c[6308]|0;h=Ce(R(a<<2,g)|0)|0;i=Ce(g<<2)|0;if((g|0)>0){j=0;do{k=h+((R(j,a)|0)<<2)|0;c[i+(j<<2)>>2]=k;l=b;do{c[k+(l-b<<2)>>2]=c[d+((R(l,g)|0)+j<<2)>>2];l=l+1|0}while((l|0)!=(e|0));j=j+1|0}while((j|0)<(g|0))}ea(i|0,g|0,a|0);De(i);De(h);m=c[6309]|0;n=b}else{m=b;n=e}c[6309]=m-n;f=1;De(d);return f|0}function te(){return}function ue(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=d;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;return}function ve(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=l;l=l+16|0;h=g;a[h+8>>0]=0;if((e|0)<19){i=0;l=g;return i|0}j=b;k=j;m=j+4|0;j=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;m=h;c[m>>2]=d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24;c[m+4>>2]=j;if(Be(h,25210,8)|0){i=0;l=g;return i|0}h=e+-1|0;j=d[b+8>>0]|0;c[f>>2]=j;if(j&240|0){i=0;l=g;return i|0}m=a[b+9>>0]|0;k=f+4|0;c[k>>2]=m&255;if(!(m<<24>>24!=0&(e+-2|0)>9)){i=0;l=g;return i|0}c[f+8>>2]=(d[b+11>>0]|0)<<8|(d[b+10>>0]|0);n=f+12|0;if((e+-4|0)<12){i=0;l=g;return i|0}o=d[b+12>>0]|0;c[n>>2]=o;p=(d[b+13>>0]|0)<<8|o;c[n>>2]=p;o=(d[b+14>>0]|0)<<16|p;c[n>>2]=o;c[n>>2]=(d[b+15>>0]|0)<<24|o;c[f+16>>2]=((d[b+17>>0]|0)<<8|(d[b+16>>0]|0))<<16>>16;o=a[b+18>>0]|0;c[f+20>>2]=o&255;do if(!(o<<24>>24))if((m&255)>2){i=0;l=g;return i|0}else{c[f+24>>2]=1;c[f+28>>2]=m<<24>>24==2&1;a[f+32>>0]=0;a[f+33>>0]=1;q=j;r=19;break}else{if((h|0)<=18){i=0;l=g;return i|0}n=a[b+19>>0]|0;if(!(n<<24>>24)){i=0;l=g;return i|0}p=n&255;s=f+24|0;c[s>>2]=p;if((h|0)<=19){i=0;l=g;return i|0}t=a[b+20>>0]|0;u=t&255;if((t&255)>(n&255)|(u+p|0)>>>0>255){i=0;l=g;return i|0}p=f+28|0;c[p>>2]=u;u=0;n=21;while(1){if((n|0)>=(e|0)){i=0;v=19;break}t=a[b+n>>0]|0;a[f+32+u>>0]=t;n=n+1|0;u=u+1|0;if(!(t<<24>>24==-1?1:(t&255|0)<=((c[p>>2]|0)+(c[s>>2]|0)|0))){i=0;v=19;break}if((u|0)>=(c[k>>2]|0)){v=17;break}}if((v|0)==17){q=c[f>>2]|0;r=n;break}else if((v|0)==19){l=g;return i|0}}while(0);i=((r|0)==(e|0)|q>>>0>1)&1;l=g;return i|0}function we(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0;i=l;l=l+304|0;j=i;k=i+296|0;m=i+8|0;if(!(ve(c[a>>2]|0,c[a+4>>2]|0,m)|0)){n=0;l=i;return n|0}c[b>>2]=c[m+20>>2];b=c[m+4>>2]|0;c[d>>2]=b;c[e>>2]=c[m+8>>2];e=m+24|0;d=ie(48e3,b,c[e>>2]|0,c[m+28>>2]|0,m+32|0,k)|0;if((d|0)==0|(c[k>>2]|0)!=0){n=0;l=i;return n|0}c[h>>2]=c[e>>2];e=m+16|0;m=c[e>>2]|0;a:do if(m|0){c[j>>2]=m;h=me(d,4034,j)|0;c[k>>2]=h;switch(h|0){case 0:{break a;break}case -5:{g[f>>2]=+G(10.0,+(+(c[e>>2]|0)/5120.0));break a;break}default:{n=0;l=i;return n|0}}}while(0);n=d;l=i;return n|0}function xe(){return 25248}function ye(){return (ze()|0)+64|0}function ze(){return Ae()|0}function Ae(){return 17444}function Be(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=b;g=d;h=c;while(1){i=a[f>>0]|0;j=a[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}\nfunction Ce(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;b=l;l=l+16|0;d=b;do if(a>>>0<245){e=a>>>0<11?16:a+11&-8;f=e>>>3;g=c[6328]|0;h=g>>>f;if(h&3|0){i=(h&1^1)+f|0;j=25352+(i<<1<<2)|0;k=j+8|0;m=c[k>>2]|0;n=m+8|0;o=c[n>>2]|0;do if((j|0)!=(o|0)){if(o>>>0<(c[6332]|0)>>>0)ba();p=o+12|0;if((c[p>>2]|0)==(m|0)){c[p>>2]=j;c[k>>2]=o;break}else ba()}else c[6328]=g&~(1<<i);while(0);o=i<<3;c[m+4>>2]=o|3;k=m+o+4|0;c[k>>2]=c[k>>2]|1;q=n;l=b;return q|0}k=c[6330]|0;if(e>>>0>k>>>0){if(h|0){o=2<<f;j=h<<f&(o|0-o);o=(j&0-j)+-1|0;j=o>>>12&16;p=o>>>j;o=p>>>5&8;r=p>>>o;p=r>>>2&4;s=r>>>p;r=s>>>1&2;t=s>>>r;s=t>>>1&1;u=(o|j|p|r|s)+(t>>>s)|0;s=25352+(u<<1<<2)|0;t=s+8|0;r=c[t>>2]|0;p=r+8|0;j=c[p>>2]|0;do if((s|0)!=(j|0)){if(j>>>0<(c[6332]|0)>>>0)ba();o=j+12|0;if((c[o>>2]|0)==(r|0)){c[o>>2]=s;c[t>>2]=j;v=g;break}else ba()}else{o=g&~(1<<u);c[6328]=o;v=o}while(0);j=(u<<3)-e|0;c[r+4>>2]=e|3;t=r+e|0;c[t+4>>2]=j|1;c[t+j>>2]=j;if(k|0){s=c[6333]|0;f=k>>>3;h=25352+(f<<1<<2)|0;n=1<<f;if(v&n){f=h+8|0;m=c[f>>2]|0;if(m>>>0<(c[6332]|0)>>>0)ba();else{w=f;x=m}}else{c[6328]=v|n;w=h+8|0;x=h}c[w>>2]=s;c[x+12>>2]=s;c[s+8>>2]=x;c[s+12>>2]=h}c[6330]=j;c[6333]=t;q=p;l=b;return q|0}t=c[6329]|0;if(t){j=(t&0-t)+-1|0;h=j>>>12&16;s=j>>>h;j=s>>>5&8;n=s>>>j;s=n>>>2&4;m=n>>>s;n=m>>>1&2;f=m>>>n;m=f>>>1&1;i=c[25616+((j|h|s|n|m)+(f>>>m)<<2)>>2]|0;m=(c[i+4>>2]&-8)-e|0;f=c[i+16+(((c[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){y=m;z=i}else{n=f;f=m;m=i;while(1){i=(c[n+4>>2]&-8)-e|0;s=i>>>0<f>>>0;h=s?i:f;i=s?n:m;n=c[n+16+(((c[n+16>>2]|0)==0&1)<<2)>>2]|0;if(!n){y=h;z=i;break}else{f=h;m=i}}}m=c[6332]|0;if(z>>>0<m>>>0)ba();f=z+e|0;if(z>>>0>=f>>>0)ba();n=c[z+24>>2]|0;p=c[z+12>>2]|0;do if((p|0)==(z|0)){r=z+20|0;u=c[r>>2]|0;if(!u){i=z+16|0;h=c[i>>2]|0;if(!h){A=0;break}else{B=h;C=i}}else{B=u;C=r}while(1){r=B+20|0;u=c[r>>2]|0;if(u|0){B=u;C=r;continue}r=B+16|0;u=c[r>>2]|0;if(!u)break;else{B=u;C=r}}if(C>>>0<m>>>0)ba();else{c[C>>2]=0;A=B;break}}else{r=c[z+8>>2]|0;if(r>>>0<m>>>0)ba();u=r+12|0;if((c[u>>2]|0)!=(z|0))ba();i=p+8|0;if((c[i>>2]|0)==(z|0)){c[u>>2]=p;c[i>>2]=r;A=p;break}else ba()}while(0);a:do if(n|0){p=c[z+28>>2]|0;m=25616+(p<<2)|0;do if((z|0)==(c[m>>2]|0)){c[m>>2]=A;if(!A){c[6329]=t&~(1<<p);break a}}else if(n>>>0>=(c[6332]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(z|0)&1)<<2)>>2]=A;if(!A)break a;else break}else ba();while(0);p=c[6332]|0;if(A>>>0<p>>>0)ba();c[A+24>>2]=n;m=c[z+16>>2]|0;do if(m|0)if(m>>>0<p>>>0)ba();else{c[A+16>>2]=m;c[m+24>>2]=A;break}while(0);m=c[z+20>>2]|0;if(m|0)if(m>>>0<(c[6332]|0)>>>0)ba();else{c[A+20>>2]=m;c[m+24>>2]=A;break}}while(0);if(y>>>0<16){n=y+e|0;c[z+4>>2]=n|3;t=z+n+4|0;c[t>>2]=c[t>>2]|1}else{c[z+4>>2]=e|3;c[f+4>>2]=y|1;c[f+y>>2]=y;if(k|0){t=c[6333]|0;n=k>>>3;m=25352+(n<<1<<2)|0;p=1<<n;if(g&p){n=m+8|0;r=c[n>>2]|0;if(r>>>0<(c[6332]|0)>>>0)ba();else{D=n;E=r}}else{c[6328]=g|p;D=m+8|0;E=m}c[D>>2]=t;c[E+12>>2]=t;c[t+8>>2]=E;c[t+12>>2]=m}c[6330]=y;c[6333]=f}q=z+8|0;l=b;return q|0}else F=e}else F=e}else if(a>>>0<=4294967231){m=a+11|0;t=m&-8;p=c[6329]|0;if(p){r=0-t|0;n=m>>>8;if(n)if(t>>>0>16777215)G=31;else{m=(n+1048320|0)>>>16&8;i=n<<m;n=(i+520192|0)>>>16&4;u=i<<n;i=(u+245760|0)>>>16&2;h=14-(n|m|i)+(u<<i>>>15)|0;G=t>>>(h+7|0)&1|h<<1}else G=0;h=c[25616+(G<<2)>>2]|0;b:do if(!h){H=r;I=0;J=0;K=81}else{i=r;u=0;m=t<<((G|0)==31?0:25-(G>>>1)|0);n=h;s=0;while(1){j=(c[n+4>>2]&-8)-t|0;if(j>>>0<i>>>0)if(!j){L=0;M=n;N=n;K=85;break b}else{O=j;P=n}else{O=i;P=s}j=c[n+20>>2]|0;n=c[n+16+(m>>>31<<2)>>2]|0;o=(j|0)==0|(j|0)==(n|0)?u:j;j=(n|0)==0;if(j){H=O;I=o;J=P;K=81;break}else{i=O;u=o;m=m<<((j^1)&1);s=P}}}while(0);if((K|0)==81){if((I|0)==0&(J|0)==0){h=2<<G;r=p&(h|0-h);if(!r){F=t;break}h=(r&0-r)+-1|0;r=h>>>12&16;e=h>>>r;h=e>>>5&8;f=e>>>h;e=f>>>2&4;g=f>>>e;f=g>>>1&2;k=g>>>f;g=k>>>1&1;Q=c[25616+((h|r|e|f|g)+(k>>>g)<<2)>>2]|0;R=0}else{Q=I;R=J}if(!Q){S=H;T=R}else{L=H;M=Q;N=R;K=85}}if((K|0)==85)while(1){K=0;g=(c[M+4>>2]&-8)-t|0;k=g>>>0<L>>>0;f=k?g:L;g=k?M:N;M=c[M+16+(((c[M+16>>2]|0)==0&1)<<2)>>2]|0;if(!M){S=f;T=g;break}else{L=f;N=g;K=85}}if((T|0)!=0?S>>>0<((c[6330]|0)-t|0)>>>0:0){g=c[6332]|0;if(T>>>0<g>>>0)ba();f=T+t|0;if(T>>>0>=f>>>0)ba();k=c[T+24>>2]|0;e=c[T+12>>2]|0;do if((e|0)==(T|0)){r=T+20|0;h=c[r>>2]|0;if(!h){s=T+16|0;m=c[s>>2]|0;if(!m){U=0;break}else{V=m;W=s}}else{V=h;W=r}while(1){r=V+20|0;h=c[r>>2]|0;if(h|0){V=h;W=r;continue}r=V+16|0;h=c[r>>2]|0;if(!h)break;else{V=h;W=r}}if(W>>>0<g>>>0)ba();else{c[W>>2]=0;U=V;break}}else{r=c[T+8>>2]|0;if(r>>>0<g>>>0)ba();h=r+12|0;if((c[h>>2]|0)!=(T|0))ba();s=e+8|0;if((c[s>>2]|0)==(T|0)){c[h>>2]=e;c[s>>2]=r;U=e;break}else ba()}while(0);c:do if(k){e=c[T+28>>2]|0;g=25616+(e<<2)|0;do if((T|0)==(c[g>>2]|0)){c[g>>2]=U;if(!U){r=p&~(1<<e);c[6329]=r;X=r;break c}}else if(k>>>0>=(c[6332]|0)>>>0){c[k+16+(((c[k+16>>2]|0)!=(T|0)&1)<<2)>>2]=U;if(!U){X=p;break c}else break}else ba();while(0);e=c[6332]|0;if(U>>>0<e>>>0)ba();c[U+24>>2]=k;g=c[T+16>>2]|0;do if(g|0)if(g>>>0<e>>>0)ba();else{c[U+16>>2]=g;c[g+24>>2]=U;break}while(0);g=c[T+20>>2]|0;if(g)if(g>>>0<(c[6332]|0)>>>0)ba();else{c[U+20>>2]=g;c[g+24>>2]=U;X=p;break}else X=p}else X=p;while(0);do if(S>>>0>=16){c[T+4>>2]=t|3;c[f+4>>2]=S|1;c[f+S>>2]=S;p=S>>>3;if(S>>>0<256){k=25352+(p<<1<<2)|0;g=c[6328]|0;e=1<<p;if(g&e){p=k+8|0;r=c[p>>2]|0;if(r>>>0<(c[6332]|0)>>>0)ba();else{Y=p;Z=r}}else{c[6328]=g|e;Y=k+8|0;Z=k}c[Y>>2]=f;c[Z+12>>2]=f;c[f+8>>2]=Z;c[f+12>>2]=k;break}k=S>>>8;if(k)if(S>>>0>16777215)_=31;else{e=(k+1048320|0)>>>16&8;g=k<<e;k=(g+520192|0)>>>16&4;r=g<<k;g=(r+245760|0)>>>16&2;p=14-(k|e|g)+(r<<g>>>15)|0;_=S>>>(p+7|0)&1|p<<1}else _=0;p=25616+(_<<2)|0;c[f+28>>2]=_;g=f+16|0;c[g+4>>2]=0;c[g>>2]=0;g=1<<_;if(!(X&g)){c[6329]=X|g;c[p>>2]=f;c[f+24>>2]=p;c[f+12>>2]=f;c[f+8>>2]=f;break}g=S<<((_|0)==31?0:25-(_>>>1)|0);r=c[p>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(S|0)){K=139;break}$=r+16+(g>>>31<<2)|0;p=c[$>>2]|0;if(!p){K=136;break}else{g=g<<1;r=p}}if((K|0)==136)if($>>>0<(c[6332]|0)>>>0)ba();else{c[$>>2]=f;c[f+24>>2]=r;c[f+12>>2]=f;c[f+8>>2]=f;break}else if((K|0)==139){g=r+8|0;p=c[g>>2]|0;e=c[6332]|0;if(p>>>0>=e>>>0&r>>>0>=e>>>0){c[p+12>>2]=f;c[g>>2]=f;c[f+8>>2]=p;c[f+12>>2]=r;c[f+24>>2]=0;break}else ba()}}else{p=S+t|0;c[T+4>>2]=p|3;g=T+p+4|0;c[g>>2]=c[g>>2]|1}while(0);q=T+8|0;l=b;return q|0}else F=t}else F=t}else F=-1;while(0);T=c[6330]|0;if(T>>>0>=F>>>0){S=T-F|0;$=c[6333]|0;if(S>>>0>15){_=$+F|0;c[6333]=_;c[6330]=S;c[_+4>>2]=S|1;c[_+S>>2]=S;c[$+4>>2]=F|3}else{c[6330]=0;c[6333]=0;c[$+4>>2]=T|3;S=$+T+4|0;c[S>>2]=c[S>>2]|1}q=$+8|0;l=b;return q|0}$=c[6331]|0;if($>>>0>F>>>0){S=$-F|0;c[6331]=S;T=c[6334]|0;_=T+F|0;c[6334]=_;c[_+4>>2]=S|1;c[T+4>>2]=F|3;q=T+8|0;l=b;return q|0}if(!(c[6446]|0)){c[6448]=4096;c[6447]=4096;c[6449]=-1;c[6450]=-1;c[6451]=0;c[6439]=0;T=d&-16^1431655768;c[d>>2]=T;c[6446]=T;aa=4096}else aa=c[6448]|0;T=F+48|0;d=F+47|0;S=aa+d|0;_=0-aa|0;aa=S&_;if(aa>>>0<=F>>>0){q=0;l=b;return q|0}X=c[6438]|0;if(X|0?(Z=c[6436]|0,Y=Z+aa|0,Y>>>0<=Z>>>0|Y>>>0>X>>>0):0){q=0;l=b;return q|0}d:do if(!(c[6439]&4)){X=c[6334]|0;e:do if(X){Y=25760;while(1){Z=c[Y>>2]|0;if(Z>>>0<=X>>>0?(ca=Y+4|0,(Z+(c[ca>>2]|0)|0)>>>0>X>>>0):0)break;Z=c[Y+8>>2]|0;if(!Z){K=163;break e}else Y=Z}r=S-$&_;if(r>>>0<2147483647){Z=Me(r|0)|0;if((Z|0)==((c[Y>>2]|0)+(c[ca>>2]|0)|0))if((Z|0)==(-1|0))da=r;else{ea=Z;fa=r;K=180;break d}else{ga=Z;ha=r;K=171}}else da=0}else K=163;while(0);do if((K|0)==163){X=Me(0)|0;if((X|0)!=(-1|0)?(t=X,r=c[6447]|0,Z=r+-1|0,U=((Z&t|0)==0?0:(Z+t&0-r)-t|0)+aa|0,t=c[6436]|0,r=U+t|0,U>>>0>F>>>0&U>>>0<2147483647):0){Z=c[6438]|0;if(Z|0?r>>>0<=t>>>0|r>>>0>Z>>>0:0){da=0;break}Z=Me(U|0)|0;if((Z|0)==(X|0)){ea=X;fa=U;K=180;break d}else{ga=Z;ha=U;K=171}}else da=0}while(0);do if((K|0)==171){U=0-ha|0;if(!(T>>>0>ha>>>0&(ha>>>0<2147483647&(ga|0)!=(-1|0))))if((ga|0)==(-1|0)){da=0;break}else{ea=ga;fa=ha;K=180;break d}Z=c[6448]|0;X=d-ha+Z&0-Z;if(X>>>0>=2147483647){ea=ga;fa=ha;K=180;break d}if((Me(X|0)|0)==(-1|0)){Me(U|0)|0;da=0;break}else{ea=ga;fa=X+ha|0;K=180;break d}}while(0);c[6439]=c[6439]|4;ia=da;K=178}else{ia=0;K=178}while(0);if(((K|0)==178?aa>>>0<2147483647:0)?(da=Me(aa|0)|0,aa=Me(0)|0,ha=aa-da|0,ga=ha>>>0>(F+40|0)>>>0,!((da|0)==(-1|0)|ga^1|da>>>0<aa>>>0&((da|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){ea=da;fa=ga?ha:ia;K=180}if((K|0)==180){ia=(c[6436]|0)+fa|0;c[6436]=ia;if(ia>>>0>(c[6437]|0)>>>0)c[6437]=ia;ia=c[6334]|0;do if(ia){ha=25760;while(1){ja=c[ha>>2]|0;ka=ha+4|0;la=c[ka>>2]|0;if((ea|0)==(ja+la|0)){K=190;break}ga=c[ha+8>>2]|0;if(!ga)break;else ha=ga}if(((K|0)==190?(c[ha+12>>2]&8|0)==0:0)?ia>>>0<ea>>>0&ia>>>0>=ja>>>0:0){c[ka>>2]=la+fa;ga=ia+8|0;da=(ga&7|0)==0?0:0-ga&7;ga=ia+da|0;aa=(c[6331]|0)+(fa-da)|0;c[6334]=ga;c[6331]=aa;c[ga+4>>2]=aa|1;c[ga+aa+4>>2]=40;c[6335]=c[6450];break}aa=c[6332]|0;if(ea>>>0<aa>>>0){c[6332]=ea;ma=ea}else ma=aa;aa=ea+fa|0;ga=25760;while(1){if((c[ga>>2]|0)==(aa|0)){K=198;break}da=c[ga+8>>2]|0;if(!da)break;else ga=da}if((K|0)==198?(c[ga+12>>2]&8|0)==0:0){c[ga>>2]=ea;ha=ga+4|0;c[ha>>2]=(c[ha>>2]|0)+fa;ha=ea+8|0;da=ea+((ha&7|0)==0?0:0-ha&7)|0;ha=aa+8|0;d=aa+((ha&7|0)==0?0:0-ha&7)|0;ha=da+F|0;T=d-da-F|0;c[da+4>>2]=F|3;do if((d|0)!=(ia|0)){if((d|0)==(c[6333]|0)){ca=(c[6330]|0)+T|0;c[6330]=ca;c[6333]=ha;c[ha+4>>2]=ca|1;c[ha+ca>>2]=ca;break}ca=c[d+4>>2]|0;if((ca&3|0)==1){_=ca&-8;$=ca>>>3;f:do if(ca>>>0>=256){S=c[d+24>>2]|0;X=c[d+12>>2]|0;do if((X|0)==(d|0)){U=d+16|0;Z=U+4|0;r=c[Z>>2]|0;if(!r){t=c[U>>2]|0;if(!t){na=0;break}else{oa=t;pa=U}}else{oa=r;pa=Z}while(1){Z=oa+20|0;r=c[Z>>2]|0;if(r|0){oa=r;pa=Z;continue}Z=oa+16|0;r=c[Z>>2]|0;if(!r)break;else{oa=r;pa=Z}}if(pa>>>0<ma>>>0)ba();else{c[pa>>2]=0;na=oa;break}}else{Z=c[d+8>>2]|0;if(Z>>>0<ma>>>0)ba();r=Z+12|0;if((c[r>>2]|0)!=(d|0))ba();U=X+8|0;if((c[U>>2]|0)==(d|0)){c[r>>2]=X;c[U>>2]=Z;na=X;break}else ba()}while(0);if(!S)break;X=c[d+28>>2]|0;Z=25616+(X<<2)|0;do if((d|0)!=(c[Z>>2]|0))if(S>>>0>=(c[6332]|0)>>>0){c[S+16+(((c[S+16>>2]|0)!=(d|0)&1)<<2)>>2]=na;if(!na)break f;else break}else ba();else{c[Z>>2]=na;if(na|0)break;c[6329]=c[6329]&~(1<<X);break f}while(0);X=c[6332]|0;if(na>>>0<X>>>0)ba();c[na+24>>2]=S;Z=d+16|0;U=c[Z>>2]|0;do if(U|0)if(U>>>0<X>>>0)ba();else{c[na+16>>2]=U;c[U+24>>2]=na;break}while(0);U=c[Z+4>>2]|0;if(!U)break;if(U>>>0<(c[6332]|0)>>>0)ba();else{c[na+20>>2]=U;c[U+24>>2]=na;break}}else{U=c[d+8>>2]|0;X=c[d+12>>2]|0;S=25352+($<<1<<2)|0;do if((U|0)!=(S|0)){if(U>>>0<ma>>>0)ba();if((c[U+12>>2]|0)==(d|0))break;ba()}while(0);if((X|0)==(U|0)){c[6328]=c[6328]&~(1<<$);break}do if((X|0)==(S|0))qa=X+8|0;else{if(X>>>0<ma>>>0)ba();Z=X+8|0;if((c[Z>>2]|0)==(d|0)){qa=Z;break}ba()}while(0);c[U+12>>2]=X;c[qa>>2]=U}while(0);ra=d+_|0;sa=_+T|0}else{ra=d;sa=T}$=ra+4|0;c[$>>2]=c[$>>2]&-2;c[ha+4>>2]=sa|1;c[ha+sa>>2]=sa;$=sa>>>3;if(sa>>>0<256){ca=25352+($<<1<<2)|0;Y=c[6328]|0;S=1<<$;do if(!(Y&S)){c[6328]=Y|S;ta=ca+8|0;ua=ca}else{$=ca+8|0;Z=c[$>>2]|0;if(Z>>>0>=(c[6332]|0)>>>0){ta=$;ua=Z;break}ba()}while(0);c[ta>>2]=ha;c[ua+12>>2]=ha;c[ha+8>>2]=ua;c[ha+12>>2]=ca;break}S=sa>>>8;do if(!S)va=0;else{if(sa>>>0>16777215){va=31;break}Y=(S+1048320|0)>>>16&8;_=S<<Y;Z=(_+520192|0)>>>16&4;$=_<<Z;_=($+245760|0)>>>16&2;r=14-(Z|Y|_)+($<<_>>>15)|0;va=sa>>>(r+7|0)&1|r<<1}while(0);S=25616+(va<<2)|0;c[ha+28>>2]=va;ca=ha+16|0;c[ca+4>>2]=0;c[ca>>2]=0;ca=c[6329]|0;r=1<<va;if(!(ca&r)){c[6329]=ca|r;c[S>>2]=ha;c[ha+24>>2]=S;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}r=sa<<((va|0)==31?0:25-(va>>>1)|0);ca=c[S>>2]|0;while(1){if((c[ca+4>>2]&-8|0)==(sa|0)){K=265;break}wa=ca+16+(r>>>31<<2)|0;S=c[wa>>2]|0;if(!S){K=262;break}else{r=r<<1;ca=S}}if((K|0)==262)if(wa>>>0<(c[6332]|0)>>>0)ba();else{c[wa>>2]=ha;c[ha+24>>2]=ca;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}else if((K|0)==265){r=ca+8|0;S=c[r>>2]|0;_=c[6332]|0;if(S>>>0>=_>>>0&ca>>>0>=_>>>0){c[S+12>>2]=ha;c[r>>2]=ha;c[ha+8>>2]=S;c[ha+12>>2]=ca;c[ha+24>>2]=0;break}else ba()}}else{S=(c[6331]|0)+T|0;c[6331]=S;c[6334]=ha;c[ha+4>>2]=S|1}while(0);q=da+8|0;l=b;return q|0}ha=25760;while(1){T=c[ha>>2]|0;if(T>>>0<=ia>>>0?(xa=T+(c[ha+4>>2]|0)|0,xa>>>0>ia>>>0):0)break;ha=c[ha+8>>2]|0}ha=xa+-47|0;da=ha+8|0;T=ha+((da&7|0)==0?0:0-da&7)|0;da=ia+16|0;ha=T>>>0<da>>>0?ia:T;T=ha+8|0;d=ea+8|0;aa=(d&7|0)==0?0:0-d&7;d=ea+aa|0;ga=fa+-40-aa|0;c[6334]=d;c[6331]=ga;c[d+4>>2]=ga|1;c[d+ga+4>>2]=40;c[6335]=c[6450];ga=ha+4|0;c[ga>>2]=27;c[T>>2]=c[6440];c[T+4>>2]=c[6441];c[T+8>>2]=c[6442];c[T+12>>2]=c[6443];c[6440]=ea;c[6441]=fa;c[6443]=0;c[6442]=T;T=ha+24|0;do{d=T;T=T+4|0;c[T>>2]=7}while((d+8|0)>>>0<xa>>>0);if((ha|0)!=(ia|0)){T=ha-ia|0;c[ga>>2]=c[ga>>2]&-2;c[ia+4>>2]=T|1;c[ha>>2]=T;d=T>>>3;if(T>>>0<256){aa=25352+(d<<1<<2)|0;S=c[6328]|0;r=1<<d;if(S&r){d=aa+8|0;_=c[d>>2]|0;if(_>>>0<(c[6332]|0)>>>0)ba();else{ya=d;za=_}}else{c[6328]=S|r;ya=aa+8|0;za=aa}c[ya>>2]=ia;c[za+12>>2]=ia;c[ia+8>>2]=za;c[ia+12>>2]=aa;break}aa=T>>>8;if(aa)if(T>>>0>16777215)Aa=31;else{r=(aa+1048320|0)>>>16&8;S=aa<<r;aa=(S+520192|0)>>>16&4;_=S<<aa;S=(_+245760|0)>>>16&2;d=14-(aa|r|S)+(_<<S>>>15)|0;Aa=T>>>(d+7|0)&1|d<<1}else Aa=0;d=25616+(Aa<<2)|0;c[ia+28>>2]=Aa;c[ia+20>>2]=0;c[da>>2]=0;S=c[6329]|0;_=1<<Aa;if(!(S&_)){c[6329]=S|_;c[d>>2]=ia;c[ia+24>>2]=d;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break}_=T<<((Aa|0)==31?0:25-(Aa>>>1)|0);S=c[d>>2]|0;while(1){if((c[S+4>>2]&-8|0)==(T|0)){K=292;break}Ba=S+16+(_>>>31<<2)|0;d=c[Ba>>2]|0;if(!d){K=289;break}else{_=_<<1;S=d}}if((K|0)==289)if(Ba>>>0<(c[6332]|0)>>>0)ba();else{c[Ba>>2]=ia;c[ia+24>>2]=S;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break}else if((K|0)==292){_=S+8|0;T=c[_>>2]|0;da=c[6332]|0;if(T>>>0>=da>>>0&S>>>0>=da>>>0){c[T+12>>2]=ia;c[_>>2]=ia;c[ia+8>>2]=T;c[ia+12>>2]=S;c[ia+24>>2]=0;break}else ba()}}}else{T=c[6332]|0;if((T|0)==0|ea>>>0<T>>>0)c[6332]=ea;c[6440]=ea;c[6441]=fa;c[6443]=0;c[6337]=c[6446];c[6336]=-1;T=0;do{_=25352+(T<<1<<2)|0;c[_+12>>2]=_;c[_+8>>2]=_;T=T+1|0}while((T|0)!=32);T=ea+8|0;S=(T&7|0)==0?0:0-T&7;T=ea+S|0;_=fa+-40-S|0;c[6334]=T;c[6331]=_;c[T+4>>2]=_|1;c[T+_+4>>2]=40;c[6335]=c[6450]}while(0);fa=c[6331]|0;if(fa>>>0>F>>>0){ea=fa-F|0;c[6331]=ea;fa=c[6334]|0;ia=fa+F|0;c[6334]=ia;c[ia+4>>2]=ea|1;c[fa+4>>2]=F|3;q=fa+8|0;l=b;return q|0}}c[(ye()|0)>>2]=12;q=0;l=b;return q|0}function De(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;if(!a)return;b=a+-8|0;d=c[6332]|0;if(b>>>0<d>>>0)ba();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)ba();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(!a)return;i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)ba();if((i|0)==(c[6333]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;break}c[6330]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;return}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;p=25352+(l<<1<<2)|0;if((h|0)!=(p|0)){if(h>>>0<d>>>0)ba();if((c[h+12>>2]|0)!=(i|0))ba()}if((k|0)==(h|0)){c[6328]=c[6328]&~(1<<l);m=i;n=i;o=j;break}if((k|0)!=(p|0)){if(k>>>0<d>>>0)ba();p=k+8|0;if((c[p>>2]|0)==(i|0))q=p;else ba()}else q=k+8|0;c[h+12>>2]=k;c[q>>2]=h;m=i;n=i;o=j;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){p=i+16|0;l=p+4|0;r=c[l>>2]|0;if(!r){s=c[p>>2]|0;if(!s){t=0;break}else{u=s;v=p}}else{u=r;v=l}while(1){l=u+20|0;r=c[l>>2]|0;if(r|0){u=r;v=l;continue}l=u+16|0;r=c[l>>2]|0;if(!r)break;else{u=r;v=l}}if(v>>>0<d>>>0)ba();else{c[v>>2]=0;t=u;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)ba();r=l+12|0;if((c[r>>2]|0)!=(i|0))ba();p=k+8|0;if((c[p>>2]|0)==(i|0)){c[r>>2]=k;c[p>>2]=l;t=k;break}else ba()}while(0);if(h){k=c[i+28>>2]|0;l=25616+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=t;if(!t){c[6329]=c[6329]&~(1<<k);m=i;n=i;o=j;break a}}else if(h>>>0>=(c[6332]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=t;if(!t){m=i;n=i;o=j;break a}else break}else ba();while(0);k=c[6332]|0;if(t>>>0<k>>>0)ba();c[t+24>>2]=h;l=i+16|0;p=c[l>>2]|0;do if(p|0)if(p>>>0<k>>>0)ba();else{c[t+16>>2]=p;c[p+24>>2]=t;break}while(0);p=c[l+4>>2]|0;if(p)if(p>>>0<(c[6332]|0)>>>0)ba();else{c[t+20>>2]=p;c[p+24>>2]=t;m=i;n=i;o=j;break}else{m=i;n=i;o=j}}else{m=i;n=i;o=j}}else{m=b;n=b;o=f}while(0);if(m>>>0>=g>>>0)ba();f=g+4|0;b=c[f>>2]|0;if(!(b&1))ba();if(!(b&2)){t=c[6333]|0;if((g|0)==(c[6334]|0)){d=(c[6331]|0)+o|0;c[6331]=d;c[6334]=n;c[n+4>>2]=d|1;if((n|0)!=(t|0))return;c[6333]=0;c[6330]=0;return}if((g|0)==(t|0)){t=(c[6330]|0)+o|0;c[6330]=t;c[6333]=m;c[n+4>>2]=t|1;c[m+t>>2]=t;return}t=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){u=c[g+24>>2]|0;v=c[g+12>>2]|0;do if((v|0)==(g|0)){q=g+16|0;a=q+4|0;e=c[a>>2]|0;if(!e){p=c[q>>2]|0;if(!p){w=0;break}else{x=p;y=q}}else{x=e;y=a}while(1){a=x+20|0;e=c[a>>2]|0;if(e|0){x=e;y=a;continue}a=x+16|0;e=c[a>>2]|0;if(!e)break;else{x=e;y=a}}if(y>>>0<(c[6332]|0)>>>0)ba();else{c[y>>2]=0;w=x;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[6332]|0)>>>0)ba();e=a+12|0;if((c[e>>2]|0)!=(g|0))ba();q=v+8|0;if((c[q>>2]|0)==(g|0)){c[e>>2]=v;c[q>>2]=a;w=v;break}else ba()}while(0);if(u|0){v=c[g+28>>2]|0;j=25616+(v<<2)|0;do if((g|0)==(c[j>>2]|0)){c[j>>2]=w;if(!w){c[6329]=c[6329]&~(1<<v);break b}}else if(u>>>0>=(c[6332]|0)>>>0){c[u+16+(((c[u+16>>2]|0)!=(g|0)&1)<<2)>>2]=w;if(!w)break b;else break}else ba();while(0);v=c[6332]|0;if(w>>>0<v>>>0)ba();c[w+24>>2]=u;j=g+16|0;i=c[j>>2]|0;do if(i|0)if(i>>>0<v>>>0)ba();else{c[w+16>>2]=i;c[i+24>>2]=w;break}while(0);i=c[j+4>>2]|0;if(i|0)if(i>>>0<(c[6332]|0)>>>0)ba();else{c[w+20>>2]=i;c[i+24>>2]=w;break}}}else{i=c[g+8>>2]|0;v=c[g+12>>2]|0;u=25352+(d<<1<<2)|0;if((i|0)!=(u|0)){if(i>>>0<(c[6332]|0)>>>0)ba();if((c[i+12>>2]|0)!=(g|0))ba()}if((v|0)==(i|0)){c[6328]=c[6328]&~(1<<d);break}if((v|0)!=(u|0)){if(v>>>0<(c[6332]|0)>>>0)ba();u=v+8|0;if((c[u>>2]|0)==(g|0))z=u;else ba()}else z=v+8|0;c[i+12>>2]=v;c[z>>2]=i}while(0);c[n+4>>2]=t|1;c[m+t>>2]=t;if((n|0)==(c[6333]|0)){c[6330]=t;return}else A=t}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;A=o}o=A>>>3;if(A>>>0<256){m=25352+(o<<1<<2)|0;b=c[6328]|0;f=1<<o;if(b&f){o=m+8|0;t=c[o>>2]|0;if(t>>>0<(c[6332]|0)>>>0)ba();else{B=o;C=t}}else{c[6328]=b|f;B=m+8|0;C=m}c[B>>2]=n;c[C+12>>2]=n;c[n+8>>2]=C;c[n+12>>2]=m;return}m=A>>>8;if(m)if(A>>>0>16777215)D=31;else{C=(m+1048320|0)>>>16&8;B=m<<C;m=(B+520192|0)>>>16&4;f=B<<m;B=(f+245760|0)>>>16&2;b=14-(m|C|B)+(f<<B>>>15)|0;D=A>>>(b+7|0)&1|b<<1}else D=0;b=25616+(D<<2)|0;c[n+28>>2]=D;c[n+20>>2]=0;c[n+16>>2]=0;B=c[6329]|0;f=1<<D;do if(B&f){C=A<<((D|0)==31?0:25-(D>>>1)|0);m=c[b>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(A|0)){E=124;break}F=m+16+(C>>>31<<2)|0;t=c[F>>2]|0;if(!t){E=121;break}else{C=C<<1;m=t}}if((E|0)==121)if(F>>>0<(c[6332]|0)>>>0)ba();else{c[F>>2]=n;c[n+24>>2]=m;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((E|0)==124){C=m+8|0;j=c[C>>2]|0;t=c[6332]|0;if(j>>>0>=t>>>0&m>>>0>=t>>>0){c[j+12>>2]=n;c[C>>2]=n;c[n+8>>2]=j;c[n+12>>2]=m;c[n+24>>2]=0;break}else ba()}}else{c[6329]=B|f;c[b>>2]=n;c[n+24>>2]=b;c[n+12>>2]=n;c[n+8>>2]=n}while(0);n=(c[6336]|0)+-1|0;c[6336]=n;if(!n)G=25768;else return;while(1){n=c[G>>2]|0;if(!n)break;else G=n+8|0}c[6336]=-1;return}function Ee(){}function Fe(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}C=(b|0)<0?-1:0;return b>>c-32|0}function Ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (C=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function He(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return fa(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function Je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=R(d,c)|0;f=a>>>16;a=(e>>>16)+(R(d,f)|0)|0;d=b>>>16;b=R(d,c)|0;return (C=(a>>>16)+(R(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Ke(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=Je(e,a)|0;f=C;return (C=(R(b,a)|0)+(R(d,e)|0)+f|f&0,c|0|0)|0}function Le(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Ie(b,c,d)|0;return b|0}function Me(a){a=a|0;var b=0,d=0;a=a+15&-16|0;b=c[i>>2]|0;d=b+a|0;if((a|0)>0&(d|0)<(b|0)|(d|0)<0){Z()|0;ca(12);return -1}c[i>>2]=d;if((d|0)>(Y()|0)?(X()|0)==0:0){ca(12);c[i>>2]=b;return -1}return b|0}function Ne(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ia[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function Oe(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;V(0)}\n\n// EMSCRIPTEN_END_FUNCS\nvar ia=[Oe,pe];return{setThrew:na,_bitshift64Ashr:Fe,_memset:He,_ogv_audio_decoder_process_header:re,_sbrk:Me,_memcpy:Ie,stackAlloc:ja,___muldi3:Ke,getTempRet0:pa,setTempRet0:oa,_i64Add:Ge,_emscripten_get_global_libc:xe,stackSave:ka,___muldsi3:Je,_free:De,runPostSets:Ee,_ogv_audio_decoder_destroy:te,_ogv_audio_decoder_init:qe,establishStackSpace:ma,_memmove:Le,stackRestore:la,_malloc:Ce,_ogv_audio_decoder_process_audio:se,stackAlloc:ja,stackSave:ka,stackRestore:la,establishStackSpace:ma,setThrew:na,setTempRet0:oa,getTempRet0:pa,dynCall_viiiiii:Ne}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _bitshift64Ashr=Module[\"_bitshift64Ashr\"]=asm[\"_bitshift64Ashr\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _ogv_audio_decoder_process_header=Module[\"_ogv_audio_decoder_process_header\"]=asm[\"_ogv_audio_decoder_process_header\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var ___muldsi3=Module[\"___muldsi3\"]=asm[\"___muldsi3\"];var _free=Module[\"_free\"]=asm[\"_free\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var _ogv_audio_decoder_destroy=Module[\"_ogv_audio_decoder_destroy\"]=asm[\"_ogv_audio_decoder_destroy\"];var _ogv_audio_decoder_init=Module[\"_ogv_audio_decoder_init\"]=asm[\"_ogv_audio_decoder_init\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _ogv_audio_decoder_process_audio=Module[\"_ogv_audio_decoder_process_audio\"]=asm[\"_ogv_audio_decoder_process_audio\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}Module.loadedMetadata=!!options.audioFormat;Module.audioFormat=options.audioFormat||null;Module.audioBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_audio_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_header(buffer,len)}));callback(ret)});Module.processAudio=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_audio(buffer,len)}));callback(ret)});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDecoderAudioOpus;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-audio-vorbis-wasm.js",
    "content": "var OGVDecoderAudioVorbisW\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderAudioVorbisW = function(OGVDecoderAudioVorbisW) {\n  OGVDecoderAudioVorbisW = OGVDecoderAudioVorbisW || {};\n  if (!OGVDecoderAudioVorbisW.currentScriptUrl) OGVDecoderAudioVorbisW.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderAudioVorbisW;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderAudioVorbisW=Module;var Module;if(!Module)Module=(typeof OGVDecoderAudioVorbisW!==\"undefined\"?OGVDecoderAudioVorbisW:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Memory===\"function\"){Module[\"wasmMemory\"]=new WebAssembly.Memory({\"initial\":TOTAL_MEMORY/WASM_PAGE_SIZE,\"maximum\":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\"wasmMemory\"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"fround\"]){var froundBuffer=new Float32Array(1);Math[\"fround\"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math[\"fround\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module[\"wasmJSMethod\"]||\"native-wasm\";Module[\"wasmJSMethod\"]=method;var wasmTextFile=Module[\"wasmTextFile\"]||\"ogv-decoder-audio-vorbis-wasm.wast\";var wasmBinaryFile=Module[\"wasmBinaryFile\"]||\"ogv-decoder-audio-vorbis-wasm.wasm\";var asmjsCodeFile=Module[\"asmjsCodeFile\"]||\"ogv-decoder-audio-vorbis-wasm.temp.asm.js\";if(typeof Module[\"locateFile\"]===\"function\"){wasmTextFile=Module[\"locateFile\"](wasmTextFile);wasmBinaryFile=Module[\"locateFile\"](wasmBinaryFile);asmjsCodeFile=Module[\"locateFile\"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={\"f64-rem\":(function(x,y){return x%y}),\"f64-to-int\":(function(x){return x|0}),\"i32s-div\":(function(x,y){return(x|0)/(y|0)|0}),\"i32u-div\":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\"i32s-rem\":(function(x,y){return(x|0)%(y|0)|0}),\"i32u-rem\":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\"debugger\":(function(){debugger})};var info={\"global\":null,\"env\":null,\"asm2wasm\":asm2wasmImports,\"parent\":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(\".\")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(\".\");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\"bad lookupImport to (\"+mod+\").\"+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module[\"buffer\"];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\"printErr\"](\"the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here\")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\"STATIC_BASE\"],Module[\"STATIC_BASE\"]+Module[\"STATIC_BUMP\"]),Module[\"STATIC_BASE\"])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function fixImports(imports){if(!0)return imports;var ret={};for(var i in imports){var fixed=i;if(fixed[0]==\"_\")fixed=fixed.substr(1);ret[fixed]=imports[i]}return ret}function getBinary(){var binary;if(Module[\"wasmBinary\"]){binary=Module[\"wasmBinary\"];binary=new Uint8Array(binary)}else if(Module[\"readBinary\"]){binary=Module[\"readBinary\"](wasmBinaryFile)}else{throw\"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)\"}return binary}function getBinaryPromise(){if(!Module[\"wasmBinary\"]&&typeof fetch===\"function\"){return fetch(wasmBinaryFile).then((function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doJustAsm(global,env,providedBuffer){if(typeof Module[\"asm\"]!==\"function\"||Module[\"asm\"]===methodHandler){if(!Module[\"asmPreload\"]){eval(Module[\"read\"](asmjsCodeFile))}else{Module[\"asm\"]=Module[\"asmPreload\"]}}if(typeof Module[\"asm\"]!==\"function\"){Module[\"printErr\"](\"asm evalling did not set the module properly\");return false}return Module[\"asm\"](global,env,providedBuffer)}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!==\"object\"){Module[\"printErr\"](\"no native wasm support detected\");return false}if(!(Module[\"wasmMemory\"]instanceof WebAssembly.Memory)){Module[\"printErr\"](\"no native wasm Memory in use\");return false}env[\"memory\"]=Module[\"wasmMemory\"];info[\"global\"]={\"NaN\":NaN,\"Infinity\":Infinity};info[\"global.Math\"]=global.Math;info[\"env\"]=env;function receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\"asm\"]=exports;Module[\"usingWasm\"]=true;removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){Module[\"printErr\"](\"Module.instantiateWasm callback failed with error: \"+e);return false}}getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\"instance\"])})).catch((function(reason){Module[\"printErr\"](\"failed to asynchronously prepare wasm: \"+reason);Module[\"quit\"](1,reason)}));return{}}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!==\"function\"){Module[\"printErr\"](\"WasmJS not detected - polyfill not bundled?\");return false}var wasmJS=WasmJS({});wasmJS[\"outside\"]=Module;wasmJS[\"info\"]=info;wasmJS[\"lookupImport\"]=lookupImport;assert(providedBuffer===Module[\"buffer\"]);info.global=global;info.env=env;assert(providedBuffer===Module[\"buffer\"]);env[\"memory\"]=providedBuffer;assert(env[\"memory\"]instanceof ArrayBuffer);wasmJS[\"providedTotalMemory\"]=Module[\"buffer\"].byteLength;var code;if(method===\"interpret-binary\"){code=getBinary()}else{code=Module[\"read\"](method==\"interpret-asm2wasm\"?asmjsCodeFile:wasmTextFile)}var temp;if(method==\"interpret-asm2wasm\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_asm2wasm\"](temp)}else if(method===\"interpret-s-expr\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_s_expr2wasm\"](temp)}else if(method===\"interpret-binary\"){temp=wasmJS[\"_malloc\"](code.length);wasmJS[\"HEAPU8\"].set(code,temp);wasmJS[\"_load_binary2wasm\"](temp,code.length)}else{throw\"what? \"+method}wasmJS[\"_free\"](temp);wasmJS[\"_instantiate\"](temp);if(Module[\"newBuffer\"]){mergeMemory(Module[\"newBuffer\"]);Module[\"newBuffer\"]=null}exports=wasmJS[\"asmExports\"];return exports}Module[\"asmPreload\"]=Module[\"asm\"];Module[\"reallocBuffer\"]=(function(size){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module[\"buffer\"];var oldSize=old.byteLength;if(Module[\"usingWasm\"]){try{var result=Module[\"wasmMemory\"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module[\"buffer\"]=Module[\"wasmMemory\"].buffer}else{return null}}catch(e){return null}}else{exports[\"__growWasmMemory\"]((size-oldSize)/wasmPageSize);return Module[\"buffer\"]!==old?Module[\"buffer\"]:null}});Module[\"asm\"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\"table\"]){var TABLE_SIZE=Module[\"wasmTableSize\"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module[\"wasmMaxTableSize\"];if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Table===\"function\"){if(MAX_TABLE_SIZE!==undefined){env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,\"maximum\":MAX_TABLE_SIZE,\"element\":\"anyfunc\"})}else{env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,element:\"anyfunc\"})}}else{env[\"table\"]=new Array(TABLE_SIZE)}Module[\"wasmTable\"]=env[\"table\"]}if(!env[\"memoryBase\"]){env[\"memoryBase\"]=Module[\"STATIC_BASE\"]}if(!env[\"tableBase\"]){env[\"tableBase\"]=0}var exports;var methods=method.split(\",\");for(var i=0;i<methods.length;i++){var curr=methods[i];if(curr===\"native-wasm\"){if(exports=doNativeWasm(global,env,providedBuffer))break}else if(curr===\"asmjs\"){if(exports=doJustAsm(global,env,providedBuffer))break}else if(curr===\"interpret-asm2wasm\"||curr===\"interpret-s-expr\"||curr===\"interpret-binary\"){if(exports=doWasmPolyfill(global,env,providedBuffer,curr))break}else{throw\"bad method: \"+curr}}if(!exports)throw\"no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods\";return exports});var methodHandler=Module[\"asm\"]}integrateWasmJS(Module);var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+59936;__ATINIT__.push();memoryInitializer=Module[\"wasmJSMethod\"].indexOf(\"asmjs\")>=0||Module[\"wasmJSMethod\"].indexOf(\"interpret-asm2wasm\")>=0?\"ogv-decoder-audio-vorbis-wasm.js.mem\":null;var STATIC_BUMP=59936;Module[\"STATIC_BASE\"]=STATIC_BASE;Module[\"STATIC_BUMP\"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_memset\"]=_memset;function _abort(){Module[\"abort\"]()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var _llvm_pow_f64=Math_pow;function _ogvjs_callback_audio(buffers,channels,sampleCount){var HEAPU32=Module.HEAPU32;var HEAPF32=Module.HEAPF32;var outputBuffers=[];if(buffers!==0){var inPtr,inArray,inBuffer,outArray;for(var channel=0;channel<channels;channel++){inPtr=HEAPU32[buffers/4+channel];if(HEAPF32.buffer.slice){inBuffer=HEAPF32.buffer.slice(inPtr,inPtr+sampleCount*4);outArray=new Float32Array(inBuffer)}else{inArray=HEAPF32.subarray(inPtr/4,inPtr/4+sampleCount);outArray=new Float32Array(inArray)}outputBuffers.push(outArray)}}Module.audioBuffer=outputBuffers}function _ogvjs_callback_init_audio(channels,rate){Module.audioFormat={channels:channels,rate:rate};Module.loadedMetadata=true}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;var _llvm_sqrt_f64=Math_sqrt;function __exit(status){Module[\"exit\"](status)}function _exit(status){__exit(status)}DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\"wasmTableSize\"]=52;Module[\"wasmMaxTableSize\"]=52;function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module[\"dynCall_viii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){try{return Module[\"dynCall_iiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiiii\":invoke_iiiii,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_viii\":invoke_viii,\"invoke_iiiiiiiii\":invoke_iiiiiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_llvm_pow_f64\":_llvm_pow_f64,\"_llvm_sqrt_f64\":_llvm_sqrt_f64,\"_abort\":_abort,\"___setErrNo\":___setErrNo,\"_ogvjs_callback_audio\":_ogvjs_callback_audio,\"_ogvjs_callback_init_audio\":_ogvjs_callback_init_audio,\"_exit\":_exit,\"__exit\":__exit,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};var asm=Module[\"asm\"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\"asm\"]=asm;var _malloc=Module[\"_malloc\"]=(function(){return Module[\"asm\"][\"_malloc\"].apply(null,arguments)});var getTempRet0=Module[\"getTempRet0\"]=(function(){return Module[\"asm\"][\"getTempRet0\"].apply(null,arguments)});var _free=Module[\"_free\"]=(function(){return Module[\"asm\"][\"_free\"].apply(null,arguments)});var runPostSets=Module[\"runPostSets\"]=(function(){return Module[\"asm\"][\"runPostSets\"].apply(null,arguments)});var _ogv_audio_decoder_destroy=Module[\"_ogv_audio_decoder_destroy\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_destroy\"].apply(null,arguments)});var _ogv_audio_decoder_init=Module[\"_ogv_audio_decoder_init\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_init\"].apply(null,arguments)});var establishStackSpace=Module[\"establishStackSpace\"]=(function(){return Module[\"asm\"][\"establishStackSpace\"].apply(null,arguments)});var stackSave=Module[\"stackSave\"]=(function(){return Module[\"asm\"][\"stackSave\"].apply(null,arguments)});var _memset=Module[\"_memset\"]=(function(){return Module[\"asm\"][\"_memset\"].apply(null,arguments)});var _ogv_audio_decoder_process_header=Module[\"_ogv_audio_decoder_process_header\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_process_header\"].apply(null,arguments)});var _sbrk=Module[\"_sbrk\"]=(function(){return Module[\"asm\"][\"_sbrk\"].apply(null,arguments)});var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=(function(){return Module[\"asm\"][\"_emscripten_get_global_libc\"].apply(null,arguments)});var _memcpy=Module[\"_memcpy\"]=(function(){return Module[\"asm\"][\"_memcpy\"].apply(null,arguments)});var setTempRet0=Module[\"setTempRet0\"]=(function(){return Module[\"asm\"][\"setTempRet0\"].apply(null,arguments)});var stackAlloc=Module[\"stackAlloc\"]=(function(){return Module[\"asm\"][\"stackAlloc\"].apply(null,arguments)});var _ogv_audio_decoder_process_audio=Module[\"_ogv_audio_decoder_process_audio\"]=(function(){return Module[\"asm\"][\"_ogv_audio_decoder_process_audio\"].apply(null,arguments)});var setThrew=Module[\"setThrew\"]=(function(){return Module[\"asm\"][\"setThrew\"].apply(null,arguments)});var stackRestore=Module[\"stackRestore\"]=(function(){return Module[\"asm\"][\"stackRestore\"].apply(null,arguments)});var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=(function(){return Module[\"asm\"][\"_llvm_bswap_i32\"].apply(null,arguments)});var dynCall_iiiii=Module[\"dynCall_iiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiii\"].apply(null,arguments)});var dynCall_vi=Module[\"dynCall_vi\"]=(function(){return Module[\"asm\"][\"dynCall_vi\"].apply(null,arguments)});var dynCall_vii=Module[\"dynCall_vii\"]=(function(){return Module[\"asm\"][\"dynCall_vii\"].apply(null,arguments)});var dynCall_ii=Module[\"dynCall_ii\"]=(function(){return Module[\"asm\"][\"dynCall_ii\"].apply(null,arguments)});var dynCall_viii=Module[\"dynCall_viii\"]=(function(){return Module[\"asm\"][\"dynCall_viii\"].apply(null,arguments)});var dynCall_iiiiiiiii=Module[\"dynCall_iiiiiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiiiiiii\"].apply(null,arguments)});var dynCall_iii=Module[\"dynCall_iii\"]=(function(){return Module[\"asm\"][\"dynCall_iii\"].apply(null,arguments)});var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiiii\"].apply(null,arguments)});Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;if(memoryInitializer){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];if(request.status!==200&&request.status!==0){console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}Module.loadedMetadata=!!options.audioFormat;Module.audioFormat=options.audioFormat||null;Module.audioBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_audio_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_header(buffer,len)}));callback(ret)});Module.processAudio=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_audio(buffer,len)}));callback(ret)});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n  return OGVDecoderAudioVorbisW;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-audio-vorbis.js",
    "content": "var OGVDecoderAudioVorbis\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderAudioVorbis = function(OGVDecoderAudioVorbis) {\n  OGVDecoderAudioVorbis = OGVDecoderAudioVorbis || {};\n  if (!OGVDecoderAudioVorbis.currentScriptUrl) OGVDecoderAudioVorbis.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderAudioVorbis;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderAudioVorbis=Module;var Module;if(!Module)Module=(typeof OGVDecoderAudioVorbis!==\"undefined\"?OGVDecoderAudioVorbis:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+58496;__ATINIT__.push();allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,248,63,0,0,0,0,0,0,4,64,0,0,0,0,0,0,18,64,0,0,0,0,0,0,33,64,0,0,0,0,0,128,48,64,0,0,0,4,107,244,52,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,248,63,0,0,0,0,0,0,0,64,0,0,0,0,0,0,4,64,0,0,0,0,0,0,18,64,0,0,0,0,0,0,33,64,0,0,0,4,107,244,52,66,0,0,0,0,1,0,0,0,3,0,0,0,7,0,0,0,15,0,0,0,31,0,0,0,63,0,0,0,127,0,0,0,255,0,0,0,255,1,0,0,255,3,0,0,255,7,0,0,255,15,0,0,255,31,0,0,255,63,0,0,255,127,0,0,255,255,0,0,255,255,1,0,255,255,3,0,255,255,7,0,255,255,15,0,255,255,31,0,255,255,63,0,255,255,127,0,255,255,255,0,255,255,255,1,255,255,255,3,255,255,255,7,255,255,255,15,255,255,255,31,255,255,255,63,255,255,255,127,255,255,255,255,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,6,0,0,0,2,0,0,0,0,0,0,0,7,0,0,0,8,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,7,0,0,0,8,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,7,0,0,0,8,0,0,0,5,0,0,0,6,0,0,0,4,0,0,0,2,0,0,0,5,0,0,0,1,0,0,0,9,0,0,0,7,0,0,0,1,0,0,0,10,0,0,0,56,1,0,0,28,1,0,0,84,1,0,0,116,1,0,0,148,1,0,0,62,180,228,51,9,145,243,51,139,178,1,52,60,32,10,52,35,26,19,52,96,169,28,52,167,215,38,52,75,175,49,52,80,59,61,52,112,135,73,52,35,160,86,52,184,146,100,52,85,109,115,52,136,159,129,52,252,11,138,52,147,4,147,52,105,146,156,52,50,191,166,52,63,149,177,52,147,31,189,52,228,105,201,52,173,128,214,52,54,113,228,52,166,73,243,52,136,140,1,53,192,247,9,53,6,239,18,53,118,123,28,53,192,166,38,53,55,123,49,53,218,3,61,53,94,76,73,53,59,97,86,53,185,79,100,53,252,37,115,53,138,121,129,53,134,227,137,53,124,217,146,53,133,100,156,53,82,142,166,53,51,97,177,53,37,232,188,53,220,46,201,53,206,65,214,53,65,46,228,53,87,2,243,53,143,102,1,54,79,207,9,54,245,195,18,54,152,77,28,54,232,117,38,54,50,71,49,54,116,204,60,54,94,17,73,54,101,34,86,54,206,12,100,54,184,222,114,54,151,83,129,54,28,187,137,54,114,174,146,54,175,54,156,54,129,93,166,54,53,45,177,54,199,176,188,54,228,243,200,54,1,3,214,54,96,235,227,54,30,187,242,54,162,64,1,55,235,166,9,55,241,152,18,55,201,31,28,55,30,69,38,55,61,19,49,55,30,149,60,55,111,214,72,55,162,227,85,55,247,201,99,55,137,151,114,55,175,45,129,55,190,146,137,55,116,131,146,55,230,8,156,55,190,44,166,55,71,249,176,55,121,121,188,55,254,184,200,55,71,196,213,55,146,168,227,55,248,115,242,55,192,26,1,56,147,126,9,56,249,109,18,56,6,242,27,56,98,20,38,56,86,223,48,56,216,93,60,56,146,155,72,56,242,164,85,56,51,135,99,56,110,80,114,56,211,7,129,56,107,106,137,56,130,88,146,56,42,219,155,56,9,252,165,56,104,197,176,56,59,66,188,56,41,126,200,56,160,133,213,56,217,101,227,56,232,44,242,56,233,244,0,57,70,86,9,57,14,67,18,57,81,196,27,57,181,227,37,57,127,171,48,57,162,38,60,57,197,96,72,57,83,102,85,57,131,68,99,57,104,9,114,57,1,226,128,57,36,66,137,57,157,45,146,57,123,173,155,57,99,203,165,57,153,145,176,57,13,11,188,57,102,67,200,57,11,71,213,57,50,35,227,57,237,229,241,57,29,207,0,58,5,46,9,58,48,24,18,58,169,150,27,58,21,179,37,58,183,119,48,58,124,239,59,58,10,38,72,58,199,39,85,58,230,1,99,58,120,194,113,58,59,188,128,58,233,25,137,58,198,2,146,58,219,127,155,58,203,154,165,58,216,93,176,58,239,211,187,58,179,8,200,58,136,8,213,58,159,224,226,58,7,159,241,58,92,169,0,59,208,5,9,59,94,237,17,59,15,105,27,59,132,130,37,59,253,67,48,59,103,184,59,59,97,235,71,59,77,233,84,59,93,191,98,59,156,123,113,59,127,150,128,59,186,241,136,59,249,215,145,59,71,82,155,59,65,106,165,59,39,42,176,59,226,156,187,59,18,206,199,59,23,202,212,59,32,158,226,59,53,88,241,59,166,131,0,60,167,221,8,60,152,194,17,60,130,59,27,60,1,82,37,60,84,16,48,60,97,129,59,60,200,176,71,60,229,170,84,60,232,124,98,60,212,52,113,60,207,112,128,60,150,201,136,60,58,173,145,60,192,36,155,60,197,57,165,60,133,246,175,60,229,101,187,60,130,147,199,60,185,139,212,60,180,91,226,60,121,17,241,60,251,93,0,61,137,181,8,61,223,151,17,61,2,14,27,61,141,33,37,61,185,220,47,61,109,74,59,61,64,118,71,61,145,108,84,61,133,58,98,61,34,238,112,61,42,75,128,61,127,161,136,61,136,130,145,61,72,247,154,61,88,9,165,61,242,194,175,61,248,46,187,61,3,89,199,61,109,77,212,61,92,25,226,61,209,202,240,61,91,56,0,62,119,141,8,62,51,109,17,62,144,224,26,62,39,241,36,62,46,169,47,62,135,19,59,62,202,59,71,62,77,46,84,62,55,248,97,62,132,167,112,62,143,37,128,62,115,121,136,62,226,87,145,62,220,201,154,62,249,216,164,62,109,143,175,62,27,248,186,62,149,30,199,62,51,15,212,62,23,215,225,62,61,132,240,62,198,18,0,63,114,101,8,63,147,66,17,63,43,179,26,63,206,192,36,63,177,117,47,63,178,220,58,63,101,1,71,63,29,240,83,63,251,181,97,63,251,96,112,63,0,0,128,63,252,5,0,0,124,6,0,0,124,7,0,0,124,9,0,0,124,13,0,0,124,21,0,0,124,37,0,0,124,69,0,0,24,0,120,58,76,70,11,60,242,204,192,60,116,252,59,61,86,73,154,61,241,93,228,61,248,163,29,62,180,231,78,62,54,157,130,62,78,220,159,62,193,174,190,62,65,132,222,62,173,194,254,62,186,101,15,63,248,0,31,63,29,233,45,63,249,219,59,63,45,162,72,63,160,17,84,63,38,15,94,63,46,143,102,63,112,149,109,63,174,51,115,63,159,135,119,63,66,184,122,63,196,242,124,63,75,103,126,63,196,69,127,63,241,186,127,63,217,237,127,63,162,253,127,63,248,255,127,63,168,9,120,57,17,119,11,59,135,139,193,59,74,113,61,60,148,82,156,60,94,8,233,60,42,83,34,61,74,118,87,61,138,227,137,61,7,140,171,61,34,154,208,61,108,239,248,61,164,52,18,62,100,112,41,62,65,21,66,62,67,11,92,62,47,56,119,62,197,191,137,62,92,97,152,62,135,112,167,62,4,220,182,62,188,145,198,62,231,126,214,62,48,144,230,62,227,177,246,62,13,104,3,63,121,107,11,63,98,89,19,63,42,40,27,63,137,206,34,63,166,67,42,63,49,127,49,63,126,121,56,63,153,43,63,63,92,143,69,63,127,159,75,63,165,87,81,63,104,180,86,63,89,179,91,63,8,83,96,63,252,146,100,63,177,115,104,63,138,246,107,63,198,29,111,63,109,236,113,63,62,102,116,63,154,143,118,63,104,109,120,63,3,5,122,63,26,92,123,63,153,120,124,63,143,96,125,63,17,26,126,63,39,171,126,63,176,25,127,63,74,107,127,63,68,165,127,63,132,204,127,63,123,229,127,63,17,244,127,63,158,251,127,63,219,254,127,63,218,255,127,63,0,0,128,63,5,12,120,56,50,131,11,58,118,186,193,58,226,203,61,59,38,207,156,59,139,32,234,59,245,102,35,60,63,100,89,60,184,127,139,60,59,23,174,60,239,114,212,60,96,140,254,60,45,46,22,61,114,237,46,61,155,127,73,61,220,223,101,61,123,4,130,61,159,250,145,61,71,207,162,61,38,127,180,61,173,6,199,61,16,98,218,61,63,141,238,61,244,193,1,62,185,160,12,62,128,224,23,62,182,126,35,62,166,120,47,62,116,203,59,62,34,116,72,62,141,111,85,62,107,186,98,62,83,81,112,62,180,48,126,62,110,42,134,62,252,92,141,62,9,174,148,62,138,27,156,62,100,163,163,62,112,67,171,62,119,249,178,62,54,195,186,62,93,158,194,62,147,136,202,62,118,127,210,62,154,128,218,62,142,137,226,62,217,151,234,62,2,169,242,62,139,186,250,62,251,100,1,63,99,106,5,63,65,108,9,63,89,105,13,63,116,96,17,63,94,80,21,63,231,55,25,63,231,21,29,63,58,233,32,63,197,176,36,63,116,107,40,63,62,24,44,63,35,182,47,63,43,68,51,63,109,193,54,63,10,45,58,63,48,134,61,63,26,204,64,63,17,254,67,63,107,27,71,63,142,35,74,63,238,21,77,63,15,242,79,63,132,183,82,63,239,101,85,63,3,253,87,63,129,124,90,63,60,228,92,63,21,52,95,63,254,107,97,63,246,139,99,63,14,148,101,63,98,132,103,63,33,93,105,63,133,30,107,63,213,200,108,63,103,92,110,63,155,217,111,63,224,64,113,63,172,146,114,63,131,207,115,63,241,247,116,63,139,12,118,63,239,13,119,63,193,252,119,63,172,217,120,63,99,165,121,63,155,96,122,63,15,12,123,63,124,168,123,63,163,54,124,63,71,183,124,63,41,43,125,63,13,147,125,63,183,239,125,63,229,65,126,63,89,138,126,63,205,201,126,63,251,0,127,63,150,48,127,63,78,89,127,63,205,123,127,63,182,152,127,63,167,176,127,63,53,196,127,63,239,211,127,63,91,224,127,63,245,233,127,63,51,241,127,63,127,246,127,63,59,250,127,63,190,252,127,63,84,254,127,63,64,255,127,63,186,255,127,63,238,255,127,63,254,255,127,63,0,0,128,63,169,12,120,55,54,134,11,57,38,198,193,57,94,226,61,58,234,237,156,58,85,101,234,58,56,170,35,59,207,219,89,59,169,226,139,59,42,178,174,59,13,91,213,59,204,219,255,59,91,25,23,60,250,46,48,60,194,45,75,60,156,20,104,60,46,113,131,60,225,202,147,60,185,22,165,60,1,84,183,60,245,129,202,60,198,159,222,60,155,172,243,60,199,211,4,61,213,71,16,61,250,49,28,61,174,145,40,61,101,102,53,61,141,175,66,61,140,108,80,61,193,156,94,61,133,63,109,61,41,84,124,61,252,236,133,61,26,232,141,61,13,27,150,61,110,133,158,61,212,38,167,61,210,254,175,61,245,12,185,61,200,80,194,61,209,201,203,61,146,119,213,61,139,89,223,61,51,111,233,61,2,184,243,61,105,51,254,61,106,112,4,62,214,223,9,62,171,103,15,62,153,7,21,62,77,191,26,62,116,142,32,62,181,116,38,62,184,113,44,62,34,133,50,62,149,174,56,62,178,237,62,62,21,66,69,62,92,171,75,62,30,41,82,62,243,186,88,62,112,96,95,62,40,25,102,62,170,228,108,62,132,194,115,62,68,178,122,62,185,217,128,62,203,98,132,62,26,244,135,62,105,141,139,62,120,46,143,62,6,215,146,62,211,134,150,62,156,61,154,62,29,251,157,62,19,191,161,62,57,137,165,62,71,89,169,62,249,46,173,62,5,10,177,62,36,234,180,62,13,207,184,62,117,184,188,62,18,166,192,62,153,151,196,62,190,140,200,62,52,133,204,62,175,128,208,62,225,126,212,62,125,127,216,62,52,130,220,62,184,134,224,62,185,140,228,62,233,147,232,62,248,155,236,62,150,164,240,62,117,173,244,62,67,182,248,62,178,190,252,62,57,99,0,63,153,102,2,63,82,105,4,63,60,107,6,63,48,108,8,63,6,108,10,63,151,106,12,63,188,103,14,63,78,99,16,63,39,93,18,63,33,85,20,63,21,75,22,63,222,62,24,63,87,48,26,63,92,31,28,63,199,11,30,63,117,245,31,63,66,220,33,63,12,192,35,63,176,160,37,63,12,126,39,63,254,87,41,63,104,46,43,63,39,1,45,63,29,208,46,63,43,155,48,63,51,98,50,63,23,37,52,63,188,227,53,63,4,158,55,63,214,83,57,63,23,5,59,63,173,177,60,63,128,89,62,63,120,252,63,63,126,154,65,63,124,51,67,63,93,199,68,63,12,86,70,63,119,223,71,63,138,99,73,63,54,226,74,63,104,91,76,63,17,207,77,63,35,61,79,63,145,165,80,63,76,8,82,63,75,101,83,63,130,188,84,63,231,13,86,63,114,89,87,63,26,159,88,63,218,222,89,63,172,24,91,63,138,76,92,63,113,122,93,63,93,162,94,63,78,196,95,63,67,224,96,63,58,246,97,63,54,6,99,63,56,16,100,63,67,20,101,63,92,18,102,63,133,10,103,63,198,252,103,63,37,233,104,63,168,207,105,63,89,176,106,63,64,139,107,63,102,96,108,63,216,47,109,63,159,249,109,63,201,189,110,63,97,124,111,63,118,53,112,63,23,233,112,63,81,151,113,63,53,64,114,63,212,227,114,63,61,130,115,63,131,27,116,63,184,175,116,63,238,62,117,63,56,201,117,63,171,78,118,63,90,207,118,63,90,75,119,63,192,194,119,63,162,53,120,63,21,164,120,63,48,14,121,63,8,116,121,63,182,213,121,63,79,51,122,63,235,140,122,63,162,226,122,63,139,52,123,63,191,130,123,63,85,205,123,63,102,20,124,63,9,88,124,63,88,152,124,63,106,213,124,63,88,15,125,63,58,70,125,63,41,122,125,63,62,171,125,63,143,217,125,63,54,5,126,63,75,46,126,63,228,84,126,63,27,121,126,63,7,155,126,63,190,186,126,63,88,216,126,63,236,243,126,63,144,13,127,63,91,37,127,63,99,59,127,63,188,79,127,63,125,98,127,63,185,115,127,63,135,131,127,63,249,145,127,63,36,159,127,63,26,171,127,63,238,181,127,63,179,191,127,63,122,200,127,63,85,208,127,63,84,215,127,63,136,221,127,63,0,227,127,63,204,231,127,63,249,235,127,63,150,239,127,63,177,242,127,63,85,245,127,63,144,247,127,63,109,249,127,63,246,250,127,63,54,252,127,63,55,253,127,63,1,254,127,63,156,254,127,63,18,255,127,63,103,255,127,63,163,255,127,63,204,255,127,63,229,255,127,63,244,255,127,63,252,255,127,63,255,255,127,63,0,0,128,63,0,0,128,63,60,12,120,54,253,134,11,56,19,201,193,56,248,231,61,57,148,245,156,57,115,118,234,57,238,186,35,58,113,249,89,58,32,251,139,58,96,216,174,58,34,148,213,58,3,23,0,59,209,82,23,59,65,125,48,59,21,150,75,59,8,157,104,59,233,200,131,59,20,58,148,59,218,161,165,59,16,0,184,59,136,84,203,59,16,159,223,59,118,223,244,59,194,138,5,60,128,32,17,60,217,48,29,60,172,187,41,60,219,192,54,60,67,64,68,60,194,57,82,60,52,173,96,60,115,154,111,60,88,1,127,60,222,112,135,60,186,157,143,60,42,7,152,60,25,173,160,60,112,143,169,60,23,174,178,60,246,8,188,60,243,159,197,60,245,114,207,60,225,129,217,60,156,204,227,60,10,83,238,60,14,21,249,60,70,9,2,61,177,165,7,61,187,95,13,61,81,55,19,61,102,44,25,61,230,62,31,61,195,110,37,61,233,187,43,61,71,38,50,61,202,173,56,61,97,82,63,61,247,19,70,61,121,242,76,61,210,237,83,61,240,5,91,61,187,58,98,61,32,140,105,61,8,250,112,61,93,132,120,61,132,21,128,61,249,246,131,61,130,230,135,61,19,228,139,61,159,239,143,61,26,9,148,61,119,48,152,61,169,101,156,61,163,168,160,61,88,249,164,61,186,87,169,61,186,195,173,61,76,61,178,61,95,196,182,61,230,88,187,61,209,250,191,61,18,170,196,61,152,102,201,61,85,48,206,61,56,7,211,61,48,235,215,61,47,220,220,61,34,218,225,61,248,228,230,61,161,252,235,61,11,33,241,61,35,82,246,61,217,143,251,61,13,109,0,62,105,24,3,62,247,201,5,62,174,129,8,62,133,63,11,62,113,3,14,62,104,205,16,62,96,157,19,62,79,115,22,62,42,79,25,62,232,48,28,62,124,24,31,62,221,5,34,62,255,248,36,62,215,241,39,62,90,240,42,62,125,244,45,62,51,254,48,62,114,13,52,62,45,34,55,62,88,60,58,62,232,91,61,62,208,128,64,62,3,171,67,62,118,218,70,62,26,15,74,62,229,72,77,62,199,135,80,62,181,203,83,62,162,20,87,62,127,98,90,62,63,181,93,62,213,12,97,62,50,105,100,62,73,202,103,62,12,48,107,62,108,154,110,62,92,9,114,62,203,124,117,62,173,244,120,62,241,112,124,62,138,241,127,62,52,187,129,62,190,127,131,62,91,70,133,62,4,15,135,62,176,217,136,62,89,166,138,62,245,116,140,62,126,69,142,62,234,23,144,62,50,236,145,62,78,194,147,62,54,154,149,62,224,115,151,62,70,79,153,62,93,44,155,62,31,11,157,62,130,235,158,62,127,205,160,62,11,177,162,62,31,150,164,62,177,124,166,62,186,100,168,62,47,78,170,62,9,57,172,62,62,37,174,62,198,18,176,62,150,1,178,62,167,241,179,62,238,226,181,62,100,213,183,62,254,200,185,62,179,189,187,62,122,179,189,62,74,170,191,62,25,162,193,62,221,154,195,62,142,148,197,62,34,143,199,62,142,138,201,62,203,134,203,62,205,131,205,62,140,129,207,62,253,127,209,62,24,127,211,62,210,126,213,62,33,127,215,62,252,127,217,62,88,129,219,62,45,131,221,62,112,133,223,62,23,136,225,62,25,139,227,62,108,142,229,62,5,146,231,62,219,149,233,62,228,153,235,62,21,158,237,62,102,162,239,62,203,166,241,62,59,171,243,62,173,175,245,62,21,180,247,62,107,184,249,62,164,188,251,62,181,192,253,62,150,196,255,62,30,228,0,63,207,229,1,63,88,231,2,63,182,232,3,63,226,233,4,63,215,234,5,63,146,235,6,63,12,236,7,63,66,236,8,63,45,236,9,63,202,235,10,63,19,235,11,63,4,234,12,63,151,232,13,63,200,230,14,63,145,228,15,63,239,225,16,63,220,222,17,63,84,219,18,63,81,215,19,63,208,210,20,63,202,205,21,63,61,200,22,63,34,194,23,63,117,187,24,63,50,180,25,63,85,172,26,63,215,163,27,63,182,154,28,63,236,144,29,63,117,134,30,63,77,123,31,63,110,111,32,63,214,98,33,63,126,85,34,63,100,71,35,63,130,56,36,63,212,40,37,63,87,24,38,63,5,7,39,63,219,244,39,63,213,225,40,63,239,205,41,63,36,185,42,63,113,163,43,63,209,140,44,63,64,117,45,63,188,92,46,63,63,67,47,63,199,40,48,63,78,13,49,63,211,240,49,63,80,211,50,63,195,180,51,63,39,149,52,63,122,116,53,63,184,82,54,63,220,47,55,63,229,11,56,63,206,230,56,63,149,192,57,63,54,153,58,63,174,112,59,63,249,70,60,63,21,28,61,63,255,239,61,63,179,194,62,63,48,148,63,63,113,100,64,63,116,51,65,63,55,1,66,63,182,205,66,63,239,152,67,63,224,98,68,63,134,43,69,63,222,242,69,63,230,184,70,63,156,125,71,63,253,64,72,63,7,3,73,63,184,195,73,63,14,131,74,63,6,65,75,63,159,253,75,63,215,184,76,63,172,114,77,63,28,43,78,63,38,226,78,63,199,151,79,63,253,75,80,63,201,254,80,63,39,176,81,63,22,96,82,63,150,14,83,63,164,187,83,63,63,103,84,63,103,17,85,63,26,186,85,63,86,97,86,63,28,7,87,63,105,171,87,63,62,78,88,63,152,239,88,63,120,143,89,63,221,45,90,63,198,202,90,63,50,102,91,63,33,0,92,63,147,152,92,63,134,47,93,63,251,196,93,63,242,88,94,63,105,235,94,63,98,124,95,63,219,11,96,63,213,153,96,63,80,38,97,63,76,177,97,63,201,58,98,63,199,194,98,63,70,73,99,63,71,206,99,63,202,81,100,63,208,211,100,63,88,84,101,63,100,211,101,63,244,80,102,63,9,205,102,63,163,71,103,63,195,192,103,63,107,56,104,63,154,174,104,63,82,35,105,63,147,150,105,63,96,8,106,63,184,120,106,63,157,231,106,63,16,85,107,63,19,193,107,63,166,43,108,63,203,148,108,63,132,252,108,63,209,98,109,63,180,199,109,63,48,43,110,63,68,141,110,63,244,237,110,63,64,77,111,63,42,171,111,63,181,7,112,63,225,98,112,63,177,188,112,63,38,21,113,63,67,108,113,63,10,194,113,63,123,22,114,63,155,105,114,63,106,187,114,63,234,11,115,63,31,91,115,63,9,169,115,63,172,245,115,63,9,65,116,63,35,139,116,63,252,211,116,63,151,27,117,63,245,97,117,63,26,167,117,63,8,235,117,63,193,45,118,63,72,111,118,63,159,175,118,63,202,238,118,63,201,44,119,63,161,105,119,63,84,165,119,63,228,223,119,63,85,25,120,63,168,81,120,63,226,136,120,63,3,191,120,63,16,244,120,63,11,40,121,63,247,90,121,63,215,140,121,63,173,189,121,63,125,237,121,63,73,28,122,63,20,74,122,63,226,118,122,63,181,162,122,63,144,205,122,63,118,247,122,63,107,32,123,63,112,72,123,63,138,111,123,63,186,149,123,63,5,187,123,63,109,223,123,63,245,2,124,63,160,37,124,63,113,71,124,63,108,104,124,63,147,136,124,63,233,167,124,63,114,198,124,63,48,228,124,63,38,1,125,63,89,29,125,63,201,56,125,63,124,83,125,63,115,109,125,63,178,134,125,63,60,159,125,63,19,183,125,63,60,206,125,63,184,228,125,63,139,250,125,63,184,15,126,63,66,36,126,63,44,56,126,63,120,75,126,63,43,94,126,63,70,112,126,63,204,129,126,63,194,146,126,63,41,163,126,63,4,179,126,63,86,194,126,63,35,209,126,63,109,223,126,63,55,237,126,63,131,250,126,63,85,7,127,63,175,19,127,63,148,31,127,63,7,43,127,63,10,54,127,63,160,64,127,63,205,74,127,63,146,84,127,63,242,93,127,63,239,102,127,63,141,111,127,63,206,119,127,63,181,127,127,63,67,135,127,63,124,142,127,63,98,149,127,63,247,155,127,63,61,162,127,63,56,168,127,63,233,173,127,63,83,179,127,63,120,184,127,63,90,189,127,63,252,193,127,63,95,198,127,63,134,202,127,63,116,206,127,63,41,210,127,63,168,213,127,63,244,216,127,63,13,220,127,63,247,222,127,63,179,225,127,63,67,228,127,63,168,230,127,63,229,232,127,63,252,234,127,63,237,236,127,63,188,238,127,63,105,240,127,63,246,241,127,63,101,243,127,63,183,244,127,63,238,245,127,63,11,247,127,63,16,248,127,63,254,248,127,63,214,249,127,63,155,250,127,63,76,251,127,63,236,251,127,63,124,252,127,63,252,252,127,63,110,253,127,63,211,253,127,63,44,254,127,63,121,254,127,63,189,254,127,63,247,254,127,63,42,255,127,63,84,255,127,63,120,255,127,63,150,255,127,63,175,255,127,63,195,255,127,63,211,255,127,63,224,255,127,63,234,255,127,63,241,255,127,63,246,255,127,63,250,255,127,63,253,255,127,63,254,255,127,63,255,255,127,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,171,15,120,53,24,135,11,55,225,201,193,55,107,233,61,56,128,247,156,56,187,122,234,56,24,191,35,57,213,0,90,57,56,1,140,57,229,225,174,57,88,162,213,57,60,33,0,58,24,97,23,58,175,144,48,58,243,175,75,58,212,190,104,58,159,222,131,58,143,85,148,58,48,196,165,58,119,42,184,58,90,136,203,58,204,221,223,58,191,42,245,58,148,183,5,59,124,85,17,59,16,111,29,59,73,4,42,59,31,21,55,59,138,161,68,59,129,169,82,59,252,44,97,59,241,43,112,59,88,166,127,59,19,206,135,59,169,6,144,59,233,124,152,59,204,48,161,59,79,34,170,59,106,81,179,59,26,190,188,59,86,104,198,59,26,80,208,59,95,117,218,59,31,216,228,59,83,120,239,59,244,85,250,59,126,184,2,60,177,100,8,60,145,47,14,60,25,25,20,60,70,33,26,60,19,72,32,60,126,141,38,60,129,241,44,60,25,116,51,60,65,21,58,60,246,212,64,60,50,179,71,60,243,175,78,60,50,203,85,60,235,4,93,60,26,93,100,60,186,211,107,60,198,104,115,60,58,28,123,60,7,119,129,60,33,111,133,60,102,118,137,60,212,140,141,60,105,178,145,60,33,231,149,60,251,42,154,60,243,125,158,60,6,224,162,60,50,81,167,60,115,209,171,60,199,96,176,60,43,255,180,60,154,172,185,60,19,105,190,60,146,52,195,60,20,15,200,60,149,248,204,60,19,241,209,60,137,248,214,60,245,14,220,60,83,52,225,60,160,104,230,60,215,171,235,60,246,253,240,60,249,94,246,60,220,206,251,60,205,166,0,61,153,109,3,61,207,59,6,61,109,17,9,61,114,238,11,61,220,210,14,61,167,190,17,61,211,177,20,61,94,172,23,61,68,174,26,61,133,183,29,61,30,200,32,61,12,224,35,61,78,255,38,61,225,37,42,61,196,83,45,61,243,136,48,61,109,197,51,61,47,9,55,61,55,84,58,61,130,166,61,61,15,0,65,61,218,96,68,61,226,200,71,61,35,56,75,61,156,174,78,61,73,44,82,61,40,177,85,61,55,61,89,61,115,208,92,61,217,106,96,61,103,12,100,61,25,181,103,61,238,100,107,61,227,27,111,61,244,217,114,61,30,159,118,61,96,107,122,61,182,62,126,61,143,12,129,61,73,253,130,61,138,241,132,61,79,233,134,61,150,228,136,61,94,227,138,61,167,229,140,61,109,235,142,61,175,244,144,61,109,1,147,61,164,17,149,61,83,37,151,61,120,60,153,61,17,87,155,61,30,117,157,61,155,150,159,61,136,187,161,61,226,227,163,61,169,15,166,61,218,62,168,61,116,113,170,61,116,167,172,61,218,224,174,61,162,29,177,61,205,93,179,61,87,161,181,61,62,232,183,61,130,50,186,61,32,128,188,61,22,209,190,61,98,37,193,61,2,125,195,61,245,215,197,61,57,54,200,61,203,151,202,61,169,252,204,61,211,100,207,61,68,208,209,61,252,62,212,61,249,176,214,61,56,38,217,61,184,158,219,61,117,26,222,61,111,153,224,61,163,27,227,61,14,161,229,61,175,41,232,61,132,181,234,61,138,68,237,61,191,214,239,61,33,108,242,61,174,4,245,61,99,160,247,61,62,63,250,61,61,225,252,61,93,134,255,61,78,23,1,62,252,108,2,62,56,196,3,62,255,28,5,62,81,119,6,62,45,211,7,62,145,48,9,62,125,143,10,62,238,239,11,62,228,81,13,62,94,181,14,62,89,26,16,62,214,128,17,62,210,232,18,62,77,82,20,62,69,189,21,62,184,41,23,62,166,151,24,62,13,7,26,62,236,119,27,62,65,234,28,62,11,94,30,62,73,211,31,62,250,73,33,62,28,194,34,62,173,59,36,62,172,182,37,62,24,51,39,62,240,176,40,62,50,48,42,62,220,176,43,62,238,50,45,62,101,182,46,62,64,59,48,62,126,193,49,62,30,73,51,62,29,210,52,62,123,92,54,62,54,232,55,62,76,117,57,62,187,3,59,62,131,147,60,62,162,36,62,62,22,183,63,62,222,74,65,62,248,223,66,62,98,118,68,62,28,14,70,62,35,167,71,62,117,65,73,62,18,221,74,62,247,121,76,62,35,24,78,62,149,183,79,62,74,88,81,62,66,250,82,62,121,157,84,62,240,65,86,62,163,231,87,62,146,142,89,62,186,54,91,62,26,224,92,62,177,138,94,62,124,54,96,62,122,227,97,62,169,145,99,62,7,65,101,62,147,241,102,62,75,163,104,62,44,86,106,62,54,10,108,62,102,191,109,62,187,117,111,62,51,45,113,62,204,229,114,62,132,159,116,62,90,90,118,62,75,22,120,62,85,211,121,62,120,145,123,62,176,80,125,62,253,16,127,62,46,105,128,62,101,74,129,62,36,44,130,62,105,14,131,62,52,241,131,62,130,212,132,62,84,184,133,62,169,156,134,62,127,129,135,62,213,102,136,62,171,76,137,62,255,50,138,62,209,25,139,62,32,1,140,62,233,232,140,62,46,209,141,62,236,185,142,62,34,163,143,62,208,140,144,62,244,118,145,62,142,97,146,62,156,76,147,62,29,56,148,62,17,36,149,62,118,16,150,62,76,253,150,62,144,234,151,62,67,216,152,62,99,198,153,62,239,180,154,62,230,163,155,62,71,147,156,62,17,131,157,62,67,115,158,62,219,99,159,62,218,84,160,62,60,70,161,62,3,56,162,62,43,42,163,62,181,28,164,62,160,15,165,62,233,2,166,62,145,246,166,62,149,234,167,62,245,222,168,62,176,211,169,62,197,200,170,62,50,190,171,62,246,179,172,62,17,170,173,62,129,160,174,62,69,151,175,62,91,142,176,62,196,133,177,62,125,125,178,62,133,117,179,62,220,109,180,62,128,102,181,62,112,95,182,62,171,88,183,62,47,82,184,62,252,75,185,62,17,70,186,62,108,64,187,62,11,59,188,62,239,53,189,62,22,49,190,62,126,44,191,62,38,40,192,62,13,36,193,62,51,32,194,62,150,28,195,62,52,25,196,62,12,22,197,62,30,19,198,62,104,16,199,62,233,13,200,62,159,11,201,62,138,9,202,62,169,7,203,62,249,5,204,62,123,4,205,62,44,3,206,62,11,2,207,62,24,1,208,62,81,0,209,62,181,255,209,62,66,255,210,62,248,254,211,62,213,254,212,62,216,254,213,62,255,254,214,62,75,255,215,62,184,255,216,62,71,0,218,62,245,0,219,62,195,1,220,62,173,2,221,62,180,3,222,62,214,4,223,62,17,6,224,62,101,7,225,62,208,8,226,62,81,10,227,62,231,11,228,62,144,13,229,62,76,15,230,62,25,17,231,62,245,18,232,62,224,20,233,62,217,22,234,62,221,24,235,62,236,26,236,62,5,29,237,62,39,31,238,62,79,33,239,62,125,35,240,62,176,37,241,62,230,39,242,62,31,42,243,62,88,44,244,62,145,46,245,62,200,48,246,62,253,50,247,62,45,53,248,62,88,55,249,62,124,57,250,62,153,59,251,62,172,61,252,62,181,63,253,62,179,65,254,62,163,67,255,62,195,34,0,63,173,163,0,63,142,36,1,63,102,165,1,63,53,38,2,63,250,166,2,63,180,39,3,63,99,168,3,63,5,41,4,63,155,169,4,63,36,42,5,63,159,170,5,63,12,43,6,63,105,171,6,63,183,43,7,63,244,171,7,63,32,44,8,63,59,172,8,63,68,44,9,63,58,172,9,63,28,44,10,63,235,171,10,63,164,43,11,63,73,171,11,63,216,42,12,63,80,170,12,63,177,41,13,63,251,168,13,63,44,40,14,63,69,167,14,63,68,38,15,63,41,165,15,63,243,35,16,63,162,162,16,63,53,33,17,63,172,159,17,63,5,30,18,63,65,156,18,63,95,26,19,63,94,152,19,63,61,22,20,63,252,147,20,63,155,17,21,63,24,143,21,63,116,12,22,63,173,137,22,63,195,6,23,63,182,131,23,63,133,0,24,63,46,125,24,63,179,249,24,63,18,118,25,63,74,242,25,63,91,110,26,63,69,234,26,63,6,102,27,63,159,225,27,63,14,93,28,63,84,216,28,63,111,83,29,63,95,206,29,63,36,73,30,63,188,195,30,63,40,62,31,63,102,184,31,63,119,50,32,63,90,172,32,63,14,38,33,63,146,159,33,63,230,24,34,63,10,146,34,63,253,10,35,63,190,131,35,63,77,252,35,63,169,116,36,63,211,236,36,63,200,100,37,63,138,220,37,63,22,84,38,63,110,203,38,63,143,66,39,63,122,185,39,63,47,48,40,63,172,166,40,63,241,28,41,63,254,146,41,63,210,8,42,63,108,126,42,63,205,243,42,63,243,104,43,63,223,221,43,63,143,82,44,63,3,199,44,63,59,59,45,63,54,175,45,63,244,34,46,63,116,150,46,63,182,9,47,63,185,124,47,63,125,239,47,63,1,98,48,63,69,212,48,63,72,70,49,63,10,184,49,63,139,41,50,63,202,154,50,63,198,11,51,63,127,124,51,63,246,236,51,63,40,93,52,63,22,205,52,63,191,60,53,63,36,172,53,63,66,27,54,63,27,138,54,63,174,248,54,63,249,102,55,63,254,212,55,63,187,66,56,63,47,176,56,63,91,29,57,63,63,138,57,63,217,246,57,63,41,99,58,63,48,207,58,63,236,58,59,63,93,166,59,63,130,17,60,63,93,124,60,63,235,230,60,63,44,81,61,63,33,187,61,63,201,36,62,63,35,142,62,63,48,247,62,63,238,95,63,63,94,200,63,63,126,48,64,63,80,152,64,63,209,255,64,63,3,103,65,63,228,205,65,63,117,52,66,63,181,154,66,63,163,0,67,63,64,102,67,63,139,203,67,63,131,48,68,63,41,149,68,63,124,249,68,63,123,93,69,63,39,193,69,63,127,36,70,63,132,135,70,63,51,234,70,63,142,76,71,63,148,174,71,63,68,16,72,63,159,113,72,63,164,210,72,63,83,51,73,63,172,147,73,63,174,243,73,63,89,83,74,63,173,178,74,63,169,17,75,63,77,112,75,63,154,206,75,63,143,44,76,63,43,138,76,63,110,231,76,63,89,68,77,63,234,160,77,63,34,253,77,63,0,89,78,63,133,180,78,63,176,15,79,63,128,106,79,63,246,196,79,63,18,31,80,63,210,120,80,63,56,210,80,63,66,43,81,63,242,131,81,63,69,220,81,63,61,52,82,63,217,139,82,63,24,227,82,63,252,57,83,63,131,144,83,63,174,230,83,63,123,60,84,63,236,145,84,63,0,231,84,63,183,59,85,63,16,144,85,63,12,228,85,63,170,55,86,63,235,138,86,63,206,221,86,63,83,48,87,63,121,130,87,63,66,212,87,63,172,37,88,63,184,118,88,63,101,199,88,63,180,23,89,63,164,103,89,63,53,183,89,63,104,6,90,63,59,85,90,63,175,163,90,63,197,241,90,63,123,63,91,63,210,140,91,63,201,217,91,63,97,38,92,63,154,114,92,63,115,190,92,63,237,9,93,63,7,85,93,63,194,159,93,63,29,234,93,63,24,52,94,63,179,125,94,63,239,198,94,63,203,15,95,63,72,88,95,63,100,160,95,63,33,232,95,63,126,47,96,63,123,118,96,63,24,189,96,63,85,3,97,63,51,73,97,63,177,142,97,63,207,211,97,63,141,24,98,63,236,92,98,63,235,160,98,63,138,228,98,63,202,39,99,63,170,106,99,63,42,173,99,63,75,239,99,63,13,49,100,63,111,114,100,63,114,179,100,63,21,244,100,63,90,52,101,63,63,116,101,63,197,179,101,63,236,242,101,63,180,49,102,63,29,112,102,63,39,174,102,63,211,235,102,63,32,41,103,63,15,102,103,63,159,162,103,63,209,222,103,63,164,26,104,63,26,86,104,63,49,145,104,63,235,203,104,63,71,6,105,63,69,64,105,63,230,121,105,63,42,179,105,63,16,236,105,63,153,36,106,63,197,92,106,63,148,148,106,63,7,204,106,63,29,3,107,63,214,57,107,63,52,112,107,63,53,166,107,63,218,219,107,63,36,17,108,63,18,70,108,63,164,122,108,63,220,174,108,63,184,226,108,63,57,22,109,63,96,73,109,63,44,124,109,63,157,174,109,63,181,224,109,63,115,18,110,63,214,67,110,63,225,116,110,63,146,165,110,63,233,213,110,63,232,5,111,63,142,53,111,63,219,100,111,63,209,147,111,63,110,194,111,63,179,240,111,63,160,30,112,63,54,76,112,63,117,121,112,63,93,166,112,63,239,210,112,63,41,255,112,63,14,43,113,63,156,86,113,63,213,129,113,63,184,172,113,63,70,215,113,63,127,1,114,63,99,43,114,63,243,84,114,63,46,126,114,63,21,167,114,63,169,207,114,63,233,247,114,63,214,31,115,63,113,71,115,63,184,110,115,63,173,149,115,63,80,188,115,63,162,226,115,63,161,8,116,63,80,46,116,63,174,83,116,63,187,120,116,63,119,157,116,63,228,193,116,63,1,230,116,63,206,9,117,63,76,45,117,63,123,80,117,63,92,115,117,63,238,149,117,63,51,184,117,63,42,218,117,63,211,251,117,63,48,29,118,63,64,62,118,63,3,95,118,63,122,127,118,63,166,159,118,63,134,191,118,63,27,223,118,63,101,254,118,63,101,29,119,63,27,60,119,63,135,90,119,63,169,120,119,63,131,150,119,63,19,180,119,63,91,209,119,63,91,238,119,63,20,11,120,63,132,39,120,63,174,67,120,63,145,95,120,63,46,123,120,63,132,150,120,63,149,177,120,63,96,204,120,63,231,230,120,63,41,1,121,63,38,27,121,63,223,52,121,63,85,78,121,63,136,103,121,63,120,128,121,63,37,153,121,63,144,177,121,63,185,201,121,63,161,225,121,63,72,249,121,63,174,16,122,63,212,39,122,63,185,62,122,63,96,85,122,63,198,107,122,63,238,129,122,63,216,151,122,63,131,173,122,63,241,194,122,63,33,216,122,63,20,237,122,63,202,1,123,63,68,22,123,63,130,42,123,63,133,62,123,63,77,82,123,63,217,101,123,63,43,121,123,63,68,140,123,63,34,159,123,63,200,177,123,63,52,196,123,63,104,214,123,63,99,232,123,63,39,250,123,63,180,11,124,63,9,29,124,63,40,46,124,63,17,63,124,63,196,79,124,63,65,96,124,63,137,112,124,63,156,128,124,63,124,144,124,63,39,160,124,63,158,175,124,63,226,190,124,63,244,205,124,63,211,220,124,63,128,235,124,63,251,249,124,63,69,8,125,63,94,22,125,63,71,36,125,63,255,49,125,63,136,63,125,63,225,76,125,63,11,90,125,63,7,103,125,63,212,115,125,63,115,128,125,63,229,140,125,63,42,153,125,63,66,165,125,63,46,177,125,63,238,188,125,63,130,200,125,63,235,211,125,63,41,223,125,63,61,234,125,63,38,245,125,63,230,255,125,63,124,10,126,63,234,20,126,63,47,31,126,63,75,41,126,63,64,51,126,63,13,61,126,63,180,70,126,63,51,80,126,63,140,89,126,63,191,98,126,63,205,107,126,63,181,116,126,63,120,125,126,63,23,134,126,63,146,142,126,63,233,150,126,63,28,159,126,63,44,167,126,63,26,175,126,63,229,182,126,63,142,190,126,63,22,198,126,63,124,205,126,63,194,212,126,63,231,219,126,63,235,226,126,63,208,233,126,63,149,240,126,63,59,247,126,63,195,253,126,63,44,4,127,63,118,10,127,63,163,16,127,63,179,22,127,63,165,28,127,63,123,34,127,63,52,40,127,63,210,45,127,63,83,51,127,63,186,56,127,63,5,62,127,63,53,67,127,63,75,72,127,63,72,77,127,63,42,82,127,63,243,86,127,63,163,91,127,63,58,96,127,63,185,100,127,63,32,105,127,63,111,109,127,63,166,113,127,63,199,117,127,63,208,121,127,63,196,125,127,63,161,129,127,63,104,133,127,63,25,137,127,63,182,140,127,63,61,144,127,63,176,147,127,63,14,151,127,63,89,154,127,63,143,157,127,63,179,160,127,63,195,163,127,63,192,166,127,63,171,169,127,63,132,172,127,63,74,175,127,63,255,177,127,63,163,180,127,63,53,183,127,63,183,185,127,63,40,188,127,63,137,190,127,63,217,192,127,63,26,195,127,63,76,197,127,63,111,199,127,63,130,201,127,63,135,203,127,63,126,205,127,63,102,207,127,63,65,209,127,63,14,211,127,63,205,212,127,63,128,214,127,63,38,216,127,63,191,217,127,63,76,219,127,63,204,220,127,63,65,222,127,63,170,223,127,63,8,225,127,63,91,226,127,63,163,227,127,63,224,228,127,63,19,230,127,63,59,231,127,63,90,232,127,63,110,233,127,63,122,234,127,63,124,235,127,63,116,236,127,63,100,237,127,63,75,238,127,63,42,239,127,63,1,240,127,63,207,240,127,63,149,241,127,63,84,242,127,63,12,243,127,63,188,243,127,63,101,244,127,63,7,245,127,63,162,245,127,63,55,246,127,63,198,246,127,63,78,247,127,63,209,247,127,63,77,248,127,63,196,248,127,63,54,249,127,63,162,249,127,63,9,250,127,63,108,250,127,63,201,250,127,63,34,251,127,63,118,251,127,63,198,251,127,63,18,252,127,63,89,252,127,63,157,252,127,63,221,252,127,63,26,253,127,63,83,253,127,63,136,253,127,63,187,253,127,63,234,253,127,63,22,254,127,63,64,254,127,63,103,254,127,63,139,254,127,63,173,254,127,63,204,254,127,63,234,254,127,63,5,255,127,63,30,255,127,63,53,255,127,63,74,255,127,63,94,255,127,63,112,255,127,63,128,255,127,63,143,255,127,63,157,255,127,63,169,255,127,63,180,255,127,63,191,255,127,63,200,255,127,63,208,255,127,63,215,255,127,63,221,255,127,63,227,255,127,63,232,255,127,63,236,255,127,63,239,255,127,63,243,255,127,63,245,255,127,63,248,255,127,63,249,255,127,63,251,255,127,63,252,255,127,63,253,255,127,63,254,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,204,8,120,52,171,134,11,54,79,202,193,54,190,233,61,55,238,247,156,55,192,123,234,55,43,192,35,56,161,2,90,56,189,2,140,56,76,228,174,56,227,165,213,56,199,35,0,57,168,100,23,57,134,149,48,57,104,182,75,57,64,199,104,57,7,228,131,57,105,92,148,57,191,204,165,57,6,53,184,57,65,149,203,57,105,237,223,57,120,61,245,57,184,194,5,58,166,98,17,58,134,126,29,58,81,22,42,58,9,42,55,58,172,185,68,58,54,197,82,58,165,76,97,58,250,79,112,58,47,207,127,58,34,229,135,58,154,32,144,58,255,153,152,58,80,81,161,58,139,70,170,58,174,121,179,58,186,234,188,58,171,153,198,58,129,134,208,58,58,177,218,58,212,25,229,58,79,192,239,58,167,164,250,58,109,227,2,59,117,147,8,59,105,98,14,59,73,80,20,59,19,93,26,59,199,136,32,59,100,211,38,59,232,60,45,59,83,197,51,59,164,108,58,59,218,50,65,59,243,23,72,59,239,27,79,59,204,62,86,59,138,128,93,59,38,225,100,59,161,96,108,59,249,254,115,59,45,188,123,59,29,204,129,59,145,201,133,59,113,214,137,59,188,242,141,59,113,30,146,59,145,89,150,59,26,164,154,59,12,254,158,59,102,103,163,59,40,224,167,59,80,104,172,59,222,255,176,59,209,166,181,59,40,93,186,59,228,34,191,59,2,248,195,59,131,220,200,59,101,208,205,59,168,211,210,59,74,230,215,59,76,8,221,59,172,57,226,59,105,122,231,59,131,202,236,59,249,41,242,59,202,152,247,59,245,22,253,59,60,82,1,60,170,32,4,60,196,246,6,60,137,212,9,60,249,185,12,60,19,167,15,60,216,155,18,60,69,152,21,60,92,156,24,60,26,168,27,60,129,187,30,60,143,214,33,60,69,249,36,60,160,35,40,60,162,85,43,60,73,143,46,60,149,208,49,60,133,25,53,60,26,106,56,60,81,194,59,60,44,34,63,60,168,137,66,60,199,248,69,60,134,111,73,60,230,237,76,60,231,115,80,60,134,1,84,60,197,150,87,60,162,51,91,60,28,216,94,60,52,132,98,60,232,55,102,60,56,243,105,60,35,182,109,60,170,128,113,60,202,82,117,60,131,44,121,60,214,13,125,60,96,123,128,60,161,115,130,60,174,111,132,60,134,111,134,60,40,115,136,60,149,122,138,60,205,133,140,60,206,148,142,60,152,167,144,60,44,190,146,60,136,216,148,60,173,246,150,60,154,24,153,60,78,62,155,60,202,103,157,60,13,149,159,60,23,198,161,60,231,250,163,60,125,51,166,60,217,111,168,60,249,175,170,60,223,243,172,60,137,59,175,60,247,134,177,60,40,214,179,60,29,41,182,60,213,127,184,60,80,218,186,60,140,56,189,60,138,154,191,60,74,0,194,60,202,105,196,60,11,215,198,60],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([12,72,201,60,205,188,203,60,77,53,206,60,140,177,208,60,137,49,211,60,69,181,213,60,189,60,216,60,243,199,218,60,230,86,221,60,149,233,223,60,0,128,226,60,39,26,229,60,8,184,231,60,164,89,234,60,250,254,236,60,9,168,239,60,210,84,242,60,83,5,245,60,141,185,247,60,126,113,250,60,39,45,253,60,134,236,255,60,206,87,1,61,52,187,2,61,117,32,4,61,144,135,5,61,133,240,6,61,84,91,8,61,253,199,9,61,128,54,11,61,219,166,12,61,16,25,14,61,29,141,15,61,3,3,17,61,193,122,18,61,87,244,19,61,197,111,21,61,10,237,22,61,39,108,24,61,26,237,25,61,228,111,27,61,132,244,28,61,251,122,30,61,71,3,32,61,105,141,33,61,96,25,35,61,45,167,36,61,206,54,38,61,67,200,39,61,141,91,41,61,171,240,42,61,156,135,44,61,96,32,46,61,248,186,47,61,99,87,49,61,160,245,50,61,175,149,52,61,144,55,54,61,67,219,55,61,199,128,57,61,28,40,59,61,65,209,60,61,56,124,62,61,254,40,64,61,148,215,65,61,250,135,67,61,47,58,69,61,51,238,70,61,5,164,72,61,166,91,74,61,20,21,76,61,80,208,77,61,90,141,79,61,49,76,81,61,212,12,83,61,68,207,84,61,128,147,86,61,135,89,88,61,90,33,90,61,248,234,91,61,97,182,93,61,148,131,95,61,145,82,97,61,88,35,99,61,232,245,100,61,65,202,102,61,100,160,104,61,78,120,106,61,1,82,108,61,123,45,110,61,188,10,112,61,197,233,113,61,148,202,115,61,41,173,117,61,133,145,119,61,166,119,121,61,140,95,123,61,55,73,125,61,166,52,127,61,237,144,128,61,105,136,129,61,198,128,130,61,5,122,131,61,37,116,132,61,39,111,133,61,9,107,134,61,204,103,135,61,112,101,136,61,244,99,137,61,88,99,138,61,157,99,139,61,193,100,140,61,196,102,141,61,167,105,142,61,106,109,143,61,11,114,144,61,139,119,145,61,234,125,146,61,40,133,147,61,67,141,148,61,61,150,149,61,20,160,150,61,201,170,151,61,92,182,152,61,203,194,153,61,24,208,154,61,66,222,155,61,72,237,156,61,42,253,157,61,233,13,159,61,132,31,160,61,250,49,161,61,76,69,162,61,122,89,163,61,130,110,164,61,101,132,165,61,35,155,166,61,188,178,167,61,47,203,168,61,124,228,169,61,162,254,170,61,163,25,172,61,124,53,173,61,47,82,174,61,187,111,175,61,31,142,176,61,92,173,177,61,113,205,178,61,94,238,179,61,35,16,181,61,192,50,182,61,52,86,183,61,127,122,184,61,160,159,185,61,153,197,186,61,104,236,187,61,13,20,189,61,136,60,190,61,217,101,191,61,255,143,192,61,250,186,193,61,202,230,194,61,111,19,196,61,233,64,197,61,55,111,198,61,89,158,199,61,78,206,200,61,23,255,201,61,179,48,203,61,35,99,204,61,101,150,205,61,121,202,206,61,96,255,207,61,25,53,209,61,164,107,210,61,0,163,211,61,45,219,212,61,44,20,214,61,251,77,215,61,154,136,216,61,10,196,217,61,74,0,219,61,89,61,220,61,56,123,221,61,230,185,222,61,99,249,223,61,174,57,225,61,200,122,226,61,176,188,227,61,102,255,228,61,233,66,230,61,58,135,231,61,88,204,232,61,66,18,234,61,249,88,235,61,124,160,236,61,203,232,237,61,230,49,239,61,204,123,240,61,125,198,241,61,249,17,243,61,63,94,244,61,79,171,245,61,42,249,246,61,206,71,248,61,60,151,249,61,114,231,250,61,114,56,252,61,58,138,253,61,202,220,254,61,17,24,0,62,33,194,0,62,149,108,1,62,108,23,2,62,166,194,2,62,68,110,3,62,69,26,4,62,168,198,4,62,111,115,5,62,152,32,6,62,35,206,6,62,17,124,7,62,98,42,8,62,20,217,8,62,40,136,9,62,157,55,10,62,117,231,10,62,173,151,11,62,71,72,12,62,66,249,12,62,158,170,13,62,91,92,14,62,120,14,15,62,246,192,15,62,213,115,16,62,19,39,17,62,177,218,17,62,175,142,18,62,13,67,19,62,202,247,19,62,231,172,20,62,99,98,21,62,62,24,22,62,120,206,22,62,16,133,23,62,7,60,24,62,92,243,24,62,16,171,25,62,33,99,26,62,145,27,27,62,94,212,27,62,137,141,28,62,17,71,29,62,246,0,30,62,56,187,30,62,215,117,31,62,211,48,32,62,43,236,32,62,224,167,33,62,241,99,34,62,93,32,35,62,38,221,35,62,74,154,36,62,202,87,37,62,165,21,38,62,219,211,38,62,108,146,39,62,88,81,40,62,159,16,41,62,64,208,41,62,59,144,42,62,144,80,43,62,63,17,44,62,72,210,44,62,170,147,45,62,102,85,46,62,122,23,47,62,232,217,47,62,175,156,48,62,206,95,49,62,69,35,50,62,21,231,50,62,61,171,51,62,189,111,52,62,148,52,53,62,195,249,53,62,73,191,54,62,38,133,55,62,91,75,56,62,230,17,57,62,199,216,57,62,255,159,58,62,141,103,59,62,113,47,60,62,171,247,60,62,59,192,61,62,31,137,62,62,89,82,63,62,232,27,64,62,204,229,64,62,5,176,65,62,146,122,66,62,115,69,67,62,168,16,68,62,49,220,68,62,14,168,69,62,62,116,70,62,194,64,71,62,152,13,72,62,193,218,72,62,61,168,73,62,12,118,74,62,44,68,75,62,159,18,76,62,100,225,76,62,122,176,77,62,225,127,78,62,154,79,79,62,164,31,80,62,255,239,80,62,170,192,81,62,166,145,82,62,242,98,83,62,141,52,84,62,121,6,85,62,180,216,85,62,63,171,86,62,25,126,87,62,65,81,88,62,185,36,89,62,126,248,89,62,147,204,90,62,245,160,91,62,165,117,92,62,163,74,93,62,238,31,94,62,135,245,94,62,109,203,95,62,159,161,96,62,30,120,97,62,233,78,98,62,1,38,99,62,100,253,99,62,19,213,100,62,14,173,101,62,84,133,102,62,229,93,103,62,193,54,104,62,231,15,105,62,88,233,105,62,19,195,106,62,24,157,107,62,103,119,108,62,255,81,109,62,224,44,110,62,11,8,111,62,126,227,111,62,58,191,112,62,62,155,113,62,139,119,114,62,31,84,115,62,251,48,116,62,31,14,117,62,138,235,117,62,59,201,118,62,52,167,119,62,115,133,120,62,248,99,121,62,196,66,122,62,213,33,123,62,44,1,124,62,200,224,124,62,170,192,125,62,208,160,126,62,59,129,127,62,245,48,128,62,111,161,128,62,11,18,129,62,201,130,129,62,168,243,129,62,169,100,130,62,204,213,130,62,15,71,131,62,117,184,131,62,251,41,132,62,162,155,132,62,107,13,133,62,84,127,133,62,93,241,133,62,136,99,134,62,210,213,134,62,61,72,135,62,200,186,135,62,116,45,136,62,63,160,136,62,42,19,137,62,52,134,137,62,94,249,137,62,168,108,138,62,17,224,138,62,153,83,139,62,64,199,139,62,6,59,140,62,235,174,140,62,239,34,141,62,17,151,141,62,82,11,142,62,177,127,142,62,46,244,142,62,201,104,143,62,130,221,143,62,89,82,144,62,78,199,144,62,96,60,145,62,143,177,145,62,220,38,146,62,70,156,146,62,205,17,147,62,113,135,147,62,50,253,147,62,16,115,148,62,9,233,148,62,32,95,149,62,82,213,149,62,161,75,150,62,12,194,150,62,146,56,151,62,53,175,151,62,243,37,152,62,204,156,152,62,193,19,153,62,209,138,153,62,252,1,154,62,66,121,154,62,163,240,154,62,31,104,155,62,181,223,155,62,101,87,156,62,48,207,156,62,21,71,157,62,20,191,157,62,45,55,158,62,96,175,158,62,172,39,159,62,18,160,159,62,145,24,160,62,41,145,160,62,218,9,161,62,165,130,161,62,136,251,161,62,132,116,162,62,152,237,162,62,197,102,163,62,10,224,163,62,103,89,164,62,220,210,164,62,105,76,165,62,14,198,165,62,202,63,166,62,158,185,166,62,137,51,167,62,139,173,167,62,164,39,168,62,213,161,168,62,27,28,169,62,121,150,169,62,237,16,170,62,119,139,170,62,24,6,171,62,206,128,171,62,155,251,171,62,125,118,172,62,117,241,172,62,130,108,173,62,165,231,173,62,221,98,174,62,42,222,174,62,140,89,175,62,2,213,175,62,142,80,176,62,46,204,176,62,226,71,177,62,170,195,177,62,135,63,178,62,119,187,178,62,124,55,179,62,148,179,179,62,191,47,180,62,254,171,180,62,80,40,181,62,181,164,181,62,45,33,182,62,184,157,182,62,85,26,183,62,5,151,183,62,199,19,184,62,156,144,184,62,130,13,185,62,123,138,185,62,133,7,186,62,161,132,186,62,206,1,187,62,13,127,187,62,93,252,187,62,190,121,188,62,48,247,188,62,178,116,189,62,70,242,189,62,233,111,190,62,157,237,190,62,98,107,191,62,54,233,191,62,26,103,192,62,14,229,192,62,17,99,193,62,36,225,193,62,70,95,194,62,119,221,194,62,184,91,195,62,7,218,195,62,100,88,196,62,209,214,196,62,75,85,197,62,212,211,197,62,107,82,198,62,16,209,198,62,195,79,199,62,132,206,199,62,82,77,200,62,45,204,200,62,21,75,201,62,11,202,201,62,13,73,202,62,29,200,202,62,56,71,203,62,97,198,203,62,149,69,204,62,214,196,204,62,34,68,205,62,123,195,205,62,223,66,206,62,79,194,206,62,202,65,207,62,81,193,207,62,226,64,208,62,127,192,208,62,38,64,209,62,216,191,209,62,148,63,210,62,91,191,210,62,44,63,211,62,7,191,211,62,235,62,212,62,218,190,212,62,210,62,213,62,211,190,213,62,222,62,214,62,242,190,214,62,15,63,215,62,53,191,215,62,99,63,216,62,154,191,216,62,217,63,217,62,32,192,217,62,112,64,218,62,199,192,218,62,38,65,219,62,140,193,219,62,250,65,220,62,112,194,220,62,236,66,221,62,112,195,221,62,250,67,222,62,139,196,222,62,34,69,223,62,192,197,223,62,100,70,224,62,14,199,224,62,189,71,225,62,115,200,225,62,46,73,226,62,239,201,226,62,181,74,227,62,127,203,227,62,79,76,228,62,36,205,228,62,253,77,229,62,219,206,229,62,190,79,230,62,164,208,230,62,142,81,231,62,125,210,231,62,111,83,232,62,100,212,232,62,93,85,233,62,89,214,233,62,89,87,234,62,91,216,234,62,96,89,235,62,104,218,235,62,114,91,236,62,126,220,236,62,141,93,237,62,158,222,237,62,176,95,238,62,196,224,238,62,218,97,239,62,241,226,239,62,10,100,240,62,35,229,240,62,62,102,241,62,89,231,241,62,116,104,242,62,145,233,242,62,173,106,243,62,202,235,243,62,230,108,244,62,3,238,244,62,31,111,245,62,59,240,245,62,86,113,246,62,112,242,246,62,137,115,247,62,161,244,247,62,184,117,248,62,206,246,248,62,226,119,249,62,244,248,249,62,4,122,250,62,18,251,250,62,30,124,251,62,40,253,251,62,47,126,252,62,52,255,252,62,54,128,253,62,52,1,254,62,48,130,254,62,40,3,255,62,29,132,255,62,135,2,0,63,254,66,0,63,115,131,0,63,230,195,0,63,86,4,1,63,197,68,1,63,49,133,1,63,155,197,1,63,3,6,2,63,103,70,2,63,202,134,2,63,42,199,2,63,135,7,3,63,225,71,3,63,56,136,3,63,141,200,3,63,222,8,4,63,44,73,4,63,119,137,4,63,191,201,4,63,3,10,5,63,68,74,5,63,130,138,5,63,188,202,5,63,242,10,6,63,36,75,6,63,83,139,6,63,126,203,6,63,165,11,7,63,199,75,7,63,230,139,7,63,1,204,7,63,23,12,8,63,41,76,8,63,54,140,8,63,63,204,8,63,67,12,9,63,67,76,9,63,62,140,9,63,52,204,9,63,37,12,10,63,18,76,10,63,249,139,10,63,219,203,10,63,184,11,11,63,144,75,11,63,98,139,11,63,47,203,11,63,246,10,12,63,184,74,12,63,116,138,12,63,43,202,12,63,219,9,13,63,134,73,13,63,43,137,13,63,202,200,13,63,98,8,14,63,245,71,14,63,129,135,14,63,7,199,14,63,135,6,15,63,0,70,15,63,114,133,15,63,222,196,15,63,67,4,16,63,161,67,16,63,249,130,16,63,73,194,16,63,147,1,17,63,213,64,17,63,17,128,17,63,69,191,17,63,114,254,17,63,151,61,18,63,181,124,18,63,203,187,18,63,218,250,18,63,225,57,19,63,225,120,19,63,216,183,19,63,200,246,19,63,176,53,20,63,143,116,20,63,103,179,20,63,54,242,20,63,253,48,21,63,188,111,21,63,114,174,21,63,32,237,21,63,197,43,22,63,98,106,22,63,246,168,22,63,129,231,22,63,3,38,23,63,125,100,23,63,237,162,23,63,84,225,23,63,178,31,24,63,7,94,24,63,83,156,24,63,149,218,24,63,206,24,25,63,253,86,25,63,35,149,25,63,63,211,25,63,82,17,26,63,90,79,26,63,89,141,26,63,78,203,26,63,57,9,27,63,25,71,27,63,240,132,27,63,188,194,27,63,126,0,28,63,54,62,28,63,227,123,28,63,134,185,28,63,30,247,28,63,172,52,29,63,47,114,29,63,167,175,29,63,20,237,29,63,118,42,30,63,206,103,30,63,26,165,30,63,91,226,30,63,145,31,31,63,188,92,31,63,219,153,31,63,239,214,31,63,247,19,32,63,244,80,32,63,230,141,32,63,203,202,32,63,165,7,33,63,115,68,33,63,53,129,33,63,235,189,33,63,150,250,33,63,52,55,34,63,198,115,34,63,75,176,34,63,197,236,34,63,50,41,35,63,146,101,35,63,230,161,35,63,46,222,35,63,105,26,36,63,151,86,36,63,185,146,36,63,205,206,36,63,213,10,37,63,208,70,37,63,190,130,37,63,158,190,37,63,114,250,37,63,56,54,38,63,241,113,38,63,157,173,38,63,59,233,38,63,204,36,39,63,79,96,39,63,197,155,39,63,45,215,39,63,135,18,40,63,211,77,40,63,18,137,40,63,66,196,40,63,101,255,40,63,121,58,41,63,128,117,41,63,120,176,41,63,98,235,41,63,62,38,42,63,11,97,42,63,202,155,42,63,122,214,42,63,28,17,43,63,175,75,43,63,52,134,43,63,170,192,43,63,16,251,43,63,105,53,44,63,178,111,44,63,236,169,44,63,23,228,44,63,51,30,45,63,64,88,45,63,61,146,45,63,43,204,45,63,10,6,46,63,218,63,46,63,154,121,46,63,74,179,46,63,235,236,46,63,124,38,47,63,254,95,47,63,112,153,47,63,210,210,47,63,36,12,48,63,102,69,48,63,152,126,48,63,186,183,48,63,204,240,48,63,205,41,49,63,191,98,49,63,160,155,49,63,113,212,49,63,49,13,50,63,225,69,50,63,128,126,50,63,15,183,50,63,141,239,50,63,251,39,51,63,87,96,51,63,163,152,51,63,222,208,51,63,8,9,52,63,34,65,52,63,42,121,52,63,33,177,52,63,7,233,52,63,219,32,53,63,159,88,53,63,81,144,53,63,242,199,53,63,129,255,53,63,255,54,54,63,108,110,54,63,198,165,54,63,16,221,54,63,71,20,55,63,109,75,55,63,129,130,55,63,131,185,55,63,116,240,55,63,82,39,56,63,30,94,56,63,217,148,56,63,129,203,56,63,23,2,57,63,155,56,57,63,13,111,57,63,108,165,57,63,185,219,57,63,244,17,58,63,28,72,58,63,50,126,58,63,53,180,58,63,38,234,58,63,4,32,59,63,207,85,59,63,135,139,59,63,45,193,59,63,192,246,59,63,64,44,60,63,173,97,60,63,7,151,60,63,78,204,60,63,130,1,61,63,163,54,61,63,177,107,61,63,171,160,61,63,146,213,61,63,102,10,62,63,39,63,62,63,212,115,62,63,110,168,62,63,244,220,62,63,103,17,63,63,198,69,63,63,17,122,63,63,73,174,63,63,109,226,63,63,126,22,64,63,122,74,64,63,99,126,64,63,56,178,64,63,248,229,64,63,165,25,65,63,62,77,65,63,195,128,65,63,52,180,65,63,144,231,65,63,216,26,66,63,13,78,66,63,44,129,66,63,56,180,66,63,47,231,66,63,18,26,67,63,224,76,67,63,154,127,67,63,64,178,67,63,208,228,67,63,77,23,68,63,180,73,68,63,7,124,68,63,69,174,68,63,111,224,68,63,131,18,69,63,131,68,69,63,110,118,69,63,68,168,69,63,5,218,69,63,177,11,70,63,72,61,70,63,202,110,70,63,55,160,70,63,143,209,70,63,210,2,71,63,255,51,71,63,23,101,71,63,26,150,71,63,8,199,71,63,224,247,71,63,163,40,72,63,81,89,72,63,233,137,72,63,107,186,72,63,216,234,72,63,48,27,73,63,114,75,73,63,158,123,73,63,181,171,73,63,181,219,73,63,161,11,74,63,118,59,74,63,54,107,74,63,224,154,74,63,116,202,74,63,242,249,74,63,90,41,75,63,173,88,75,63,233,135,75,63,15,183,75,63,32,230,75,63,26,21,76,63,254,67,76,63,204,114,76,63,132,161,76,63,38,208,76,63,177,254,76,63,38,45,77,63,133,91,77,63,206,137,77,63,0,184,77,63,28,230,77,63,34,20,78,63,17,66,78,63,234,111,78,63,172,157,78,63,88,203,78,63,238,248,78,63,108,38,79,63,213,83,79,63,38,129,79,63,97,174,79,63,134,219,79,63,147,8,80,63,138,53,80,63,107,98,80,63,52,143,80,63,231,187,80,63,131,232,80,63,8,21,81,63,119,65,81,63,206,109,81,63,15,154,81,63,57,198,81,63,76,242,81,63,71,30,82,63,44,74,82,63,250,117,82,63,177,161,82,63,81,205,82,63,218,248,82,63,76,36,83,63,166,79,83,63,234,122,83,63,22,166,83,63,44,209,83,63,42,252,83,63,17,39,84,63,224,81,84,63,153,124,84,63,58,167,84,63,196,209,84,63,54,252,84,63,146,38,85,63,214,80,85,63,2,123,85,63,24,165,85,63,22,207,85,63,252,248,85,63,204,34,86,63,131,76,86,63,36,118,86,63,172,159,86,63,30,201,86,63,120,242,86,63,186,27,87,63,229,68,87,63,248,109,87,63,244,150,87,63,216,191,87,63,165,232,87,63,90,17,88,63,248,57,88,63,126,98,88,63,236,138,88,63,67,179,88,63,130,219,88,63,169,3,89,63,185,43,89,63,177,83,89,63,145,123,89,63,90,163,89,63,11,203,89,63,164,242,89,63,37,26,90,63,143,65,90,63,225,104,90,63,27,144,90,63,62,183,90,63,72,222,90,63,59,5,91,63,22,44,91,63,217,82,91,63,133,121,91,63,24,160,91,63,148,198,91,63,248,236,91,63,68,19,92,63,120,57,92,63,149,95,92,63,153,133,92,63,134,171,92,63,91,209,92,63,24,247,92,63,189,28,93,63,74,66,93,63,191,103,93,63,28,141,93,63,98,178,93,63,143,215,93,63,165,252,93,63,162,33,94,63,136,70,94,63,86,107,94,63,11,144,94,63,169,180,94,63,47,217,94,63,157,253,94,63,243,33,95,63,49,70,95,63,88,106,95,63,102,142,95,63,92,178,95,63,59,214,95,63,1,250,95,63,175,29,96,63,70,65,96,63,196,100,96,63,43,136,96,63,122,171,96,63,176,206,96,63,207,241,96,63,214,20,97,63,197,55,97,63,155,90,97,63,90,125,97,63,1,160,97,63,144,194,97,63,8,229,97,63,103,7,98,63,174,41,98,63,221,75,98,63,245,109,98,63,244,143,98,63,220,177,98,63,171,211,98,63,99,245,98,63,3,23,99,63,139,56,99,63,251,89,99,63,83,123,99,63,147,156,99,63,188,189,99,63,204,222,99,63,197,255,99,63,166,32,100,63,110,65,100,63,32,98,100,63,185,130,100,63,58,163,100,63,164,195,100,63,245,227,100,63,47,4,101,63,82,36,101,63,92,68,101,63,78,100,101,63,41,132,101,63,236,163,101,63,151,195,101,63,43,227,101,63,167,2,102,63,11,34,102,63,87,65,102,63,139,96,102,63,168,127,102,63,174,158,102,63,155,189,102,63,113,220,102,63,47,251,102,63,214,25,103,63,101,56,103,63,220,86,103,63,59,117,103,63,132,147,103,63,180,177,103,63,205,207,103,63,206,237,103,63,184,11,104,63,138,41,104,63,69,71,104,63,233,100,104,63,116,130,104,63,233,159,104,63,69,189,104,63,139,218,104,63,185,247,104,63,207,20,105,63,207,49,105,63,182,78,105,63,135,107,105,63,64,136,105,63,225,164,105,63,108,193,105,63,223,221,105,63,59,250,105,63,127,22,106,63,172,50,106,63,195,78,106,63,193,106,106,63,169,134,106,63,121,162,106,63,51,190,106,63,213,217,106,63,96,245,106,63,212,16,107,63,48,44,107,63,118,71,107,63,165,98,107,63,188,125,107,63,189,152,107,63,167,179,107,63,121,206,107,63,53,233,107,63,218,3,108,63,104,30,108,63,223,56,108,63,63,83,108,63,136,109,108,63,187,135,108,63,214,161,108,63,219,187,108,63,201,213,108,63,161,239,108,63,97,9,109,63,11,35,109,63,159,60,109,63,27,86,109,63,129,111,109,63,209,136,109,63,9,162,109,63,44,187,109,63,56,212,109,63,45,237,109,63,12,6,110,63,212,30,110,63,134,55,110,63,33,80,110,63,166,104,110,63,21,129,110,63,110,153,110,63,176,177,110,63,220,201,110,63,241,225,110,63,241,249,110,63,218,17,111,63,173,41,111,63,106,65,111,63,16,89,111,63,161,112,111,63,28,136,111,63,128,159,111,63,207,182,111,63,7,206,111,63,42,229,111,63,54,252,111,63,45,19,112,63,14,42,112,63,217,64,112,63,142,87,112,63,46,110,112,63,184,132,112,63,43,155,112,63,138,177,112,63,210,199,112,63,5,222,112,63,35,244,112,63,42,10,113,63,29,32,113,63,249,53,113,63,193,75,113,63,114,97,113,63,15,119,113,63,150,140,113,63,7,162,113,63,99,183,113,63,170,204,113,63,220,225,113,63,249,246,113,63,0,12,114,63,242,32,114,63,207,53,114,63,151,74,114,63,73,95,114,63,231,115,114,63,112,136,114,63,227,156,114,63,66,177,114,63,140,197,114,63,193,217,114,63,225,237,114,63,236,1,115,63,227,21,115,63,197,41,115,63,146,61,115,63,74,81,115,63,238,100,115,63,125,120,115,63,248,139,115,63,94,159,115,63,175,178,115,63,236,197,115,63,21,217,115,63,41,236,115,63,41,255,115,63,21,18,116,63,236,36,116,63,175,55,116,63,94,74,116,63,248,92,116,63,127,111,116,63,241,129,116,63,80,148,116,63,154,166,116,63,208,184,116,63,242,202,116,63,1,221,116,63,251,238,116,63,226,0,117,63,181,18,117,63,116,36,117,63,31,54,117,63,183,71,117,63,59,89,117,63,171,106,117,63,8,124,117,63,81,141,117,63,135,158,117,63,169,175,117,63,184,192,117,63,179,209,117,63,155,226,117,63,112,243,117,63,50,4,118,63,224,20,118,63,123,37,118,63,3,54,118,63,120,70,118,63,217,86,118,63,40,103,118,63,100,119,118,63,140,135,118,63,162,151,118,63,165,167,118,63,149,183,118,63,114,199,118,63,61,215,118,63,245,230,118,63,154,246,118,63,44,6,119,63,172,21,119,63,26,37,119,63,117,52,119,63,189,67,119,63,243,82,119,63,22,98,119,63,40,113,119,63,39,128,119,63,19,143,119,63,238,157,119,63,182,172,119,63,108,187,119,63,16,202,119,63,162,216,119,63,34,231,119,63,144,245,119,63,236,3,120,63,55,18,120,63,111,32,120,63,150,46,120,63,170,60,120,63,174,74,120,63,159,88,120,63,127,102,120,63,77,116,120,63,10,130,120,63,181,143,120,63,79,157,120,63,215,170,120,63,78,184,120,63,180,197,120,63,8,211,120,63,76,224,120,63,126,237,120,63,158,250,120,63,174,7,121,63,173,20,121,63,155,33,121,63,119,46,121,63,67,59,121,63,254,71,121,63,168,84,121,63,66,97,121,63,202,109,121,63,66,122,121,63,169,134,121,63,0,147,121,63,70,159,121,63,124,171,121,63,161,183,121,63,181,195,121,63,186,207,121,63,173,219,121,63,145,231,121,63,100,243,121,63,40,255,121,63,219,10,122,63,126,22,122,63,16,34,122,63,147,45,122,63,6,57,122,63,105,68,122,63,188,79,122,63,255,90,122,63,51,102,122,63,86,113,122,63,106,124,122,63,111,135,122,63,99,146,122,63,72,157,122,63,30,168,122,63,228,178,122,63,155,189,122,63,66,200,122,63,218,210,122,63,99,221,122,63,221,231,122,63,71,242,122,63,162,252,122,63,238,6,123,63,43,17,123,63,89,27,123,63,120,37,123,63,137,47,123,63,138,57,123,63,124,67,123,63,96,77,123,63,53,87,123,63,252,96,123,63,179,106,123,63,92,116,123,63,247,125,123,63,131,135,123,63,1,145,123,63,112,154,123,63,209,163,123,63,36,173,123,63,104,182,123,63,158,191,123,63,198,200,123,63,224,209,123,63,236,218,123,63,234,227,123,63,218,236,123,63,188,245,123,63,144,254,123,63,86,7,124,63,14,16,124,63,185,24,124,63,86,33,124,63,230,41,124,63,104,50,124,63,220,58,124,63,67,67,124,63,156,75,124,63,232,83,124,63,39,92,124,63,88,100,124,63,124,108,124,63,147,116,124,63,157,124,124,63,153,132,124,63,137,140,124,63,107,148,124,63,65,156,124,63,9,164,124,63,197,171,124,63,116,179,124,63,22,187,124,63,172,194,124,63,52,202,124,63,176,209,124,63,32,217,124,63,131,224,124,63,217,231,124,63,35,239,124,63,97,246,124,63,146,253,124,63,183,4,125,63,208,11,125,63,221,18,125,63,221,25,125,63,209,32,125,63,185,39,125,63,150,46,125,63,102,53,125,63,42,60,125,63,227,66,125,63,143,73,125,63,48,80,125,63,197,86,125,63,78,93,125,63,204,99,125,63,62,106,125,63,165,112,125,63,0,119,125,63,80,125,125,63,148,131,125,63,205,137,125,63,251,143,125,63,29,150,125,63,52,156,125,63,64,162,125,63,65,168,125,63,55,174,125,63,34,180,125,63,2,186,125,63,215,191,125,63,161,197,125,63,96,203,125,63,21,209,125,63,190,214,125,63,93,220,125,63,242,225,125,63,124,231,125,63,251,236,125,63,112,242,125,63,218,247,125,63,58,253,125,63,143,2,126,63,219,7,126,63,28,13,126,63,82,18,126,63,127,23,126,63,161,28,126,63,186,33,126,63,200,38,126,63,204,43,126,63,199,48,126,63,183,53,126,63,158,58,126,63,123,63,126,63,78,68,126,63,23,73,126,63,215,77,126,63,141,82,126,63,58,87,126,63,221,91,126,63,118,96,126,63,6,101,126,63,141,105,126,63,10,110,126,63,126,114,126,63,233,118,126,63,75,123,126,63,164,127,126,63,243,131,126,63,57,136,126,63,119,140,126,63,171,144,126,63,214,148,126,63,249,152,126,63,18,157,126,63,35,161,126,63,44,165,126,63,43,169,126,63,34,173,126,63,16,177,126,63,246,180,126,63,211,184,126,63,167,188,126,63,115,192,126,63,55,196,126,63,243,199,126,63,166,203,126,63,81,207,126,63,243,210,126,63,142,214,126,63,32,218,126,63,171,221,126,63,45,225,126,63,167,228,126,63,26,232,126,63,132,235,126,63,231,238,126,63,66,242,126,63,149,245,126,63,224,248,126,63,36,252,126,63,96,255,126,63,148,2,127,63,193,5,127,63,230,8,127,63,4,12,127,63,27,15,127,63,42,18,127,63,50,21,127,63,50,24,127,63,43,27,127,63,29,30,127,63,8,33,127,63,236,35,127,63,201,38,127,63,158,41,127,63,109,44,127,63,53,47,127,63,246,49,127,63,175,52,127,63,99,55,127,63,15,58,127,63,181,60,127,63,83,63,127,63,236,65,127,63,125,68,127,63,8,71,127,63,141,73,127,63,11,76,127,63,131,78,127,63,244,80,127,63,95,83,127,63,195,85,127,63,33,88,127,63,121,90,127,63,203,92,127,63,23,95,127,63,92,97,127,63,155,99,127,63,213,101,127,63,8,104,127,63,54,106,127,63,93,108,127,63,127,110,127,63,155,112,127,63,177,114,127,63,193,116,127,63,203,118,127,63,208,120,127,63,207,122,127,63,201,124,127,63,189,126,127,63,171,128,127,63,148,130,127,63,120,132,127,63,86,134,127,63,47,136,127,63,2,138,127,63,209,139,127,63,153,141,127,63,93,143,127,63,28,145,127,63,213,146,127,63,137,148,127,63,57,150,127,63,227,151,127,63,136,153,127,63,40,155,127,63,196,156,127,63,90,158,127,63,236,159,127,63,121,161,127,63,1,163,127,63,132,164,127,63,3,166,127,63,125,167,127,63,242,168,127,63,99,170,127,63,207,171,127,63,55,173,127,63,154,174,127,63,249,175,127,63,84,177,127,63,170,178,127,63,251,179,127,63,73,181,127,63,146,182,127,63,215,183,127,63,24,185,127,63,85,186,127,63,141,187,127,63,193,188,127,63,242,189,127,63,30,191,127,63,71,192,127,63,107,193,127,63,140,194,127,63,168,195,127,63,193,196,127,63,214,197,127,63,231,198,127,63,245,199,127,63,255,200,127,63,5,202,127,63,7,203,127,63,6,204,127,63,1,205,127,63,249,205,127,63,237,206,127,63,222,207,127,63,203,208,127,63,181,209,127,63,156,210,127,63,127,211,127,63,95,212,127,63,59,213,127,63,20,214,127,63,234,214,127,63,189,215,127,63,141,216,127,63,90,217,127,63,35,218,127,63,233,218,127,63,173,219,127,63,109,220,127,63,43,221,127,63,229,221,127,63,156,222,127,63,81,223,127,63,3,224,127,63,178,224,127,63,94,225,127,63,7,226,127,63,174,226,127,63,82,227,127,63,243,227,127,63,146,228,127,63,46,229,127,63,199,229,127,63,94,230,127,63,242,230,127,63,132,231,127,63,19,232,127,63,160,232,127,63,42,233,127,63,178,233,127,63,56,234,127,63,187,234,127,63,60,235,127,63,187,235,127,63,55,236,127,63,177,236,127,63,41,237,127,63,159,237,127,63,18,238,127,63,132,238,127,63,243,238,127,63,96,239,127,63,204,239,127,63,53,240,127,63,156,240,127,63,1,241,127,63,101,241,127,63,198,241,127,63,37,242,127,63,131,242,127,63,222,242,127,63,56,243,127,63,144,243,127,63,231,243,127,63,59,244,127,63,142,244,127,63,223,244,127,63,46,245,127,63,124,245,127,63,200,245,127,63,19,246,127,63,91,246,127,63,163,246,127,63,233,246,127,63,45,247,127,63,111,247,127,63,177,247,127,63,240,247,127,63,47,248,127,63,108,248,127,63,167,248,127,63,225,248,127,63,26,249,127,63,82,249,127,63,136,249,127,63,188,249,127,63,240,249,127,63,34,250,127,63,83,250,127,63,131,250,127,63,178,250,127,63,224,250,127,63,12,251,127,63,55,251,127,63,97,251,127,63,138,251,127,63,178,251,127,63,217,251,127,63,255,251,127,63,36,252,127,63,72,252,127,63,107,252,127,63,141,252,127,63,173,252,127,63,205,252,127,63,237,252,127,63,11,253,127,63,40,253,127,63,69,253,127,63,96,253,127,63,123,253,127,63,149,253,127,63,174,253,127,63,199,253,127,63,222,253,127,63,245,253,127,63,12,254,127,63,33,254,127,63,54,254,127,63,74,254,127,63,93,254,127,63,112,254,127,63,130,254,127,63,148,254,127,63,165,254,127,63,181,254,127,63,197,254,127,63,212,254,127,63,227,254,127,63,241,254,127,63,254,254,127,63,11,255,127,63,24,255,127,63,36,255,127,63,47,255,127,63,59,255,127,63,69,255,127,63,79,255,127,63,89,255,127,63,99,255,127,63,108,255,127,63,116,255,127,63,124,255,127,63,132,255,127,63,140,255,127,63,147,255,127,63,154,255,127,63,160,255,127,63,166,255,127,63,172,255,127,63,178,255,127,63,183,255,127,63,188,255,127,63,193,255,127,63,197,255,127,63,202,255,127,63,206,255,127,63,209,255,127,63,213,255,127,63,216,255,127,63,220,255,127,63,223,255,127,63,225,255,127,63,228,255,127,63,230,255,127,63,233,255,127,63,235,255,127,63,237,255,127,63,239,255,127,63,240,255,127,63,242,255,127,63,243,255,127,63,245,255,127,63,246,255,127,63,247,255,127,63,248,255,127,63,249,255,127,63,250,255,127,63,251,255,127,63,251,255,127,63,252,255,127,63,252,255,127,63,253,255,127,63,253,255,127,63,254,255,127,63,254,255,127,63,254,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,198,63,120,51,98,136,11,53,151,200,193,53,80,233,61,54,183,247,156,54,46,124,234,54,153,192,35,55,244,2,90,55,56,3,140,55,227,228,174,55,177,166,213,55,108,36,0,56,146,101,23,56,201,150,48,56,18,184,75,56,81,201,104,56,94,229,131,56,29,94,148,56,229,206,165,56,167,55,184,56,128,152,203,56,85,241,223,56,36,66,245,56,126,197,5,57,238,101,17,57,99,130,29,57,207,26,42,57,63,47,55,57,179,191,68,57,30,204,82,57,141,84,97,57,243,88,112,57,94,217,127,57,227,234,135,57,18,39,144,57,64,161,152,57,105,89,161,57,146,79,170,57,181,131,179,57,215,245,188,57,245,165,198,57,14,148,208,57,34,192,218,57,46,42,229,57,57,210,239,57,60,184,250,57,27,238,2,58,22,159,8,58,13,111,14,58,0,94,20,58,239,107,26,58,218,152,32,58,192,228,38,58,161,79,45,58,124,217,51,58,83,130,58,58,37,74,65,58,240,48,72,58,182,54,79,58,116,91,86,58,45,159,93,58,222,1,101,58,136,131,108,58,42,36,116,58,196,227,123,58,44,225,129,58,241,223,133,58,49,238,137,58,238,11,142,58,37,57,146,58,215,117,150,58,5,194,154,58,174,29,159,58,209,136,163,58,110,3,168,58,134,141,172,58,24,39,177,58,36,208,181,58,169,136,186,58,169,80,191,58,33,40,196,58,19,15,201,58,126,5,206,58,98,11,211,58,191,32,216,58,148,69,221,58,225,121,226,58,166,189,231,58,227,16,237,58,152,115,242,58,196,229,247,58,103,103,253,58,65,124,1,59,137,76,4,59,141,36,7,59,76,4,10,59,198,235,12,59,251,218,15,59,235,209,18,59,149,208,21,59,251,214,24,59,26,229,27,59,244,250,30,59,136,24,34,59,215,61,37,59,223,106,40,59,161,159,43,59,29,220,46,59,83,32,50,59,66,108,53,59,234,191,56,59,76,27,60,59,103,126,63,59,59,233,66,59,199,91,70,59,12,214,73,59,10,88,77,59,193,225,80,59,48,115,84,59,86,12,88,59,53,173,91,59,204,85,95,59,26,6,99,59,32,190,102,59,222,125,106,59,82,69,110,59,127,20,114,59,97,235,117,59,251,201,121,59,76,176,125,59,41,207,128,59,8,202,130,59,194,200,132,59,87,203,134,59,198,209,136,59,17,220,138,59,55,234,140,59,55,252,142,59,18,18,145,59,199,43,147,59,87,73,149,59,194,106,151,59,6,144,153,59,37,185,155,59,30,230,157,59,241,22,160,59,158,75,162,59,37,132,164,59,134,192,166,59,192,0,169,59,212,68,171,59,193,140,173,59,137,216,175,59,41,40,178,59,163,123,180,59,245,210,182,59,33,46,185,59,38,141,187,59,4,240,189,59,186,86,192,59,73,193,194,59,177,47,197,59,242,161,199,59,10,24,202,59,251,145,204,59,196,15,207,59,102,145,209,59,223,22,212,59,49,160,214,59,90,45,217,59,91,190,219,59,51,83,222,59,227,235,224,59,107,136,227,59,201,40,230,59,255,204,232,59,12,117,235,59,240,32,238,59,171,208,240,59,61,132,243,59,165,59,246,59,228,246,248,59,250,181,251,59,229,120,254,59,212,159,0,60,32,5,2,60,87,108,3,60,121,213,4,60,134,64,6,60,126,173,7,60,96,28,9,60,45,141,10,60,229,255,11,60,136,116,13,60,21,235,14,60,141,99,16,60,239,221,17,60,59,90,19,60,114,216,20,60,147,88,22,60,158,218,23,60,147,94,25,60,115,228,26,60,60,108,28,60,240,245,29,60,141,129,31,60,20,15,33,60,133,158,34,60,224,47,36,60,36,195,37,60,82,88,39,60,105,239,40,60,106,136,42,60,84,35,44,60,40,192,45,60,229,94,47,60,139,255,48,60,26,162,50,60,146,70,52,60,243,236,53,60,61,149,55,60,112,63,57,60,140,235,58,60,145,153,60,60,126,73,62,60,84,251,63,60,18,175,65,60,185,100,67,60,72,28,69,60,192,213,70,60,31,145,72,60,103,78,74,60,151,13,76,60,175,206,77,60,176,145,79,60,152,86,81,60,103,29,83,60,31,230,84,60,190,176,86,60,69,125,88,60,179,75,90,60,9,28,92,60,71,238,93,60,107,194,95,60,119,152,97,60,106,112,99,60,68,74,101,60,5,38,103,60,173,3,105,60,60,227,106,60,178,196,108,60,14,168,110,60,81,141,112,60,123,116,114,60,139,93,116,60,130,72,118,60,95,53,120,60,34,36,122,60,203,20,124,60,90,7,126,60,208,251,127,60,22,249,128,60,54,245,129,60,74,242,130,60,80,240,131,60,73,239,132,60,53,239,133,60,19,240,134,60,229,241,135,60,169,244,136,60,95,248,137,60,8,253,138,60,164,2,140,60,50,9,141,60,178,16,142,60,37,25,143,60,139,34,144,60,226,44,145,60,44,56,146,60,104,68,147,60,150,81,148,60,182,95,149,60,201,110,150,60,205,126,151,60,196,143,152,60,172,161,153,60,135,180,154,60,83,200,155,60,17,221,156,60,193,242,157,60,98,9,159,60,245,32,160,60,122,57,161,60,241,82,162,60,89,109,163,60,178,136,164,60,253,164,165,60,57,194,166,60,103,224,167,60,134,255,168,60,151,31,170,60,152,64,171,60,139,98,172,60,111,133,173,60,68,169,174,60,10,206,175,60,193,243,176,60,105,26,178,60,2,66,179,60,139,106,180,60,6,148,181,60,113,190,182,60,205,233,183,60,26,22,185,60,87,67,186,60,133,113,187,60,163,160,188,60,177,208,189,60,177,1,191,60,160,51,192,60,128,102,193,60,80,154,194,60,16,207,195,60,193,4,197,60,97,59,198,60,242,114,199,60,114,171,200,60,227,228,201,60,67,31,203,60,147,90,204,60,211,150,205,60,3,212,206,60,34,18,208,60,49,81,209,60,48,145,210,60,30,210,211,60,252,19,213,60,201,86,214,60,133,154,215,60,49,223,216,60,204,36,218,60,86,107,219,60,208,178,220,60,56,251,221,60,144,68,223,60,214,142,224,60,12,218,225,60,48,38,227,60,67,115,228,60,69,193,229,60,54,16,231,60,21,96,232,60,227,176,233,60,160,2,235,60,75,85,236,60,228,168,237,60,108,253,238,60,226,82,240,60,70,169,241,60,153,0,243,60,218,88,244,60,8,178,245,60,37,12,247,60,48,103,248,60,41,195,249,60,15,32,251,60,228,125,252,60,166,220,253,60,85,60,255,60,121,78,0,61,63,255,0,61,123,176,1,61,46,98,2,61,88,20,3,61,248,198,3,61,15,122,4,61,156,45,5,61,161,225,5,61,27,150,6,61,12,75,7,61,116,0,8,61,82,182,8,61,167,108,9,61,113,35,10,61,179,218,10,61,106,146,11,61,152,74,12,61,60,3,13,61,87,188,13,61,231,117,14,61,238,47,15,61,107,234,15,61,94,165,16,61,199,96,17,61,166,28,18,61,251,216,18,61,198,149,19,61,7,83,20,61,190,16,21,61,234,206,21,61,141,141,22,61,165,76,23,61,52,12,24,61,56,204,24,61,177,140,25,61,161,77,26,61,6,15,27,61,224,208,27,61,48,147,28,61,246,85,29,61,49,25,30,61,226,220,30,61,8,161,31,61,164,101,32,61,181,42,33,61,59,240,33,61,55,182,34,61,168,124,35,61,142,67,36,61,233,10,37,61,186,210,37,61,255,154,38,61,186,99,39,61,234,44,40,61,143,246,40,61,168,192,41,61,55,139,42,61,59,86,43,61,180,33,44,61,161,237,44,61,4,186,45,61,219,134,46,61,38,84,47,61,231,33,48,61,28,240,48,61,198,190,49,61,229,141,50,61,120,93,51,61,127,45,52,61,251,253,52,61,236,206,53,61,81,160,54,61,42,114,55,61,120,68,56,61,58,23,57,61,112,234,57,61,27,190,58,61,58,146,59,61,204,102,60,61,211,59,61,61,79,17,62,61,62,231,62,61,161,189,63,61,120,148,64,61,195,107,65,61,130,67,66,61,181,27,67,61,92,244,67,61,118,205,68,61,4,167,69,61,6,129,70,61,124,91,71,61,101,54,72,61,194,17,73,61,146,237,73,61,214,201,74,61,141,166,75,61,184,131,76,61,86,97,77,61,104,63,78,61,236,29,79,61,229,252,79,61,80,220,80,61,46,188,81,61,128,156,82,61,69,125,83,61,125,94,84,61,40,64,85,61,69,34,86,61,214,4,87,61,218,231,87,61,81,203,88,61,58,175,89,61,150,147,90,61,101,120,91,61,167,93,92,61,91,67,93,61,130,41,94,61,28,16,95,61,40,247,95,61,167,222,96,61,152,198,97,61,251,174,98,61,209,151,99,61,25,129,100,61,212,106,101,61,0,85,102,61,159,63,103,61,176,42,104,61,51,22,105,61,41,2,106,61,144,238,106,61,105,219,107,61,180,200,108,61,113,182,109,61,160,164,110,61,65,147,111,61,84,130,112,61,216,113,113,61,206,97,114,61,54,82,115,61,15,67,116,61,89,52,117,61,22,38,118,61,67,24,119,61,226,10,120,61,243,253,120,61,117,241,121,61,104,229,122,61,204,217,123,61,162,206,124,61,232,195,125,61,160,185,126,61,201,175,127,61,49,83,128,61,183,206,128,61,117,74,129,61,107,198,129,61,154,66,130,61,1,191,130,61,160,59,131,61,120,184,131,61,136,53,132,61,209,178,132,61,81,48,133,61,10,174,133,61,251,43,134,61,37,170,134,61,134,40,135,61,32,167,135,61,242,37,136,61,252,164,136,61,62,36,137,61,184,163,137,61,106,35,138,61,84,163,138,61,118,35,139,61,209,163,139,61,99,36,140,61,45,165,140,61,46,38,141,61,104,167,141,61,218,40,142,61,131,170,142,61,100,44,143,61,125,174,143,61,206,48,144,61,86,179,144,61,23,54,145,61,14,185,145,61,62,60,146,61,165,191,146,61,67,67,147,61,26,199,147,61,39,75,148,61,109,207,148,61,234,83,149,61,158,216,149,61,138,93,150,61,173,226,150,61,7,104,151,61,153,237,151,61,98,115,152,61,99,249,152,61,155,127,153,61,10,6,154,61,176,140,154,61,142,19,155,61,163,154,155,61,239,33,156,61,114,169,156,61,44,49,157,61,29,185,157,61,69,65,158,61,165,201,158,61,59,82,159,61,8,219,159,61,13,100,160,61,72,237,160,61,186,118,161,61,99,0,162,61,67,138,162,61,90,20,163,61,167,158,163,61,43,41,164,61,230,179,164,61,216,62,165,61,0,202,165,61,95,85,166,61,245,224,166,61,193,108,167,61,196,248,167,61,254,132,168,61,110,17,169,61,20,158,169,61,241,42,170,61,4,184,170,61,78,69,171,61,206,210,171,61,133,96,172,61,113,238,172,61,149,124,173,61,238,10,174,61,126,153,174,61,67,40,175,61,63,183,175,61,114,70,176,61,218,213,176,61,120,101,177,61,77,245,177,61,88,133,178,61,152,21,179,61,15,166,179,61,187,54,180,61,158,199,180,61,182,88,181,61,4,234,181,61,137,123,182,61,67,13,183,61,50,159,183,61,88,49,184,61,179,195,184,61,68,86,185,61,11,233,185,61,7,124,186,61,57,15,187,61,160,162,187,61,61,54,188,61,16,202,188,61,24,94,189,61,85,242,189,61,200,134,190,61,112,27,191,61,78,176,191,61,97,69,192,61,170,218,192,61,39,112,193,61,218,5,194,61,194,155,194,61,224,49,195,61,50,200,195,61,186,94,196,61,119,245,196,61,104,140,197,61,143,35,198,61,235,186,198,61,124,82,199,61,66,234,199,61,61,130,200,61,108,26,201,61,209,178,201,61,106,75,202,61,57,228,202,61,59,125,203,61,115,22,204,61,224,175,204,61,129,73,205,61,86,227,205,61,97,125,206,61,159,23,207,61,19,178,207,61,187,76,208,61,151,231,208,61,168,130,209,61,237,29,210,61],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([103,185,210,61,21,85,211,61,248,240,211,61,14,141,212,61,89,41,213,61,216,197,213,61,140,98,214,61,115,255,214,61,143,156,215,61,223,57,216,61,99,215,216,61,27,117,217,61,7,19,218,61,38,177,218,61,122,79,219,61,2,238,219,61,189,140,220,61,173,43,221,61,208,202,221,61,39,106,222,61,178,9,223,61,112,169,223,61,98,73,224,61,136,233,224,61,226,137,225,61,111,42,226,61,47,203,226,61,35,108,227,61,74,13,228,61,165,174,228,61,52,80,229,61,245,241,229,61,234,147,230,61,19,54,231,61,110,216,231,61,253,122,232,61,191,29,233,61,180,192,233,61,221,99,234,61,56,7,235,61,199,170,235,61,136,78,236,61,125,242,236,61,164,150,237,61,255,58,238,61,140,223,238,61,76,132,239,61,63,41,240,61,101,206,240,61,189,115,241,61,73,25,242,61,7,191,242,61,247,100,243,61,26,11,244,61,112,177,244,61,248,87,245,61,179,254,245,61,160,165,246,61,192,76,247,61,18,244,247,61,151,155,248,61,77,67,249,61,55,235,249,61,82,147,250,61,159,59,251,61,31,228,251,61,209,140,252,61,181,53,253,61,203,222,253,61,19,136,254,61,141,49,255,61,57,219,255,61,140,66,0,62,148,151,0,62,181,236,0,62,238,65,1,62,65,151,1,62,173,236,1,62,49,66,2,62,206,151,2,62,132,237,2,62,83,67,3,62,59,153,3,62,59,239,3,62,84,69,4,62,134,155,4,62,209,241,4,62,52,72,5,62,176,158,5,62,68,245,5,62,242,75,6,62,183,162,6,62,150,249,6,62,141,80,7,62,156,167,7,62,196,254,7,62,5,86,8,62,94,173,8,62,207,4,9,62,89,92,9,62,252,179,9,62,183,11,10,62,138,99,10,62,118,187,10,62,122,19,11,62,150,107,11,62,203,195,11,62,24,28,12,62,125,116,12,62,250,204,12,62,144,37,13,62,62,126,13,62,4,215,13,62,227,47,14,62,217,136,14,62,232,225,14,62,15,59,15,62,78,148,15,62,165,237,15,62,20,71,16,62,155,160,16,62,58,250,16,62,241,83,17,62,193,173,17,62,168,7,18,62,167,97,18,62,190,187,18,62,237,21,19,62,51,112,19,62,146,202,19,62,9,37,20,62,151,127,20,62,61,218,20,62,251,52,21,62,209,143,21,62,190,234,21,62,195,69,22,62,224,160,22,62,21,252,22,62,97,87,23,62,197,178,23,62,64,14,24,62,211,105,24,62,126,197,24,62,64,33,25,62,26,125,25,62,11,217,25,62,20,53,26,62,52,145,26,62,108,237,26,62,187,73,27,62,34,166,27,62,160,2,28,62,53,95,28,62,226,187,28,62,166,24,29,62,129,117,29,62,116,210,29,62,126,47,30,62,159,140,30,62,215,233,30,62,39,71,31,62,141,164,31,62,11,2,32,62,160,95,32,62,76,189,32,62,16,27,33,62,234,120,33,62,219,214,33,62,228,52,34,62,3,147,34,62,58,241,34,62,135,79,35,62,235,173,35,62,103,12,36,62,249,106,36,62,162,201,36,62,98,40,37,62,56,135,37,62,38,230,37,62,42,69,38,62,69,164,38,62,119,3,39,62,192,98,39,62,31,194,39,62,149,33,40,62,33,129,40,62,197,224,40,62,126,64,41,62,79,160,41,62,54,0,42,62,51,96,42,62,72,192,42,62,114,32,43,62,179,128,43,62,11,225,43,62,121,65,44,62,253,161,44,62,152,2,45,62,73,99,45,62,16,196,45,62,238,36,46,62,226,133,46,62,237,230,46,62,13,72,47,62,68,169,47,62,145,10,48,62,245,107,48,62,110,205,48,62,254,46,49,62,163,144,49,62,95,242,49,62,49,84,50,62,25,182,50,62,23,24,51,62,43,122,51,62,85,220,51,62,148,62,52,62,234,160,52,62,86,3,53,62,216,101,53,62,111,200,53,62,28,43,54,62,223,141,54,62,184,240,54,62,167,83,55,62,171,182,55,62,197,25,56,62,245,124,56,62,59,224,56,62,150,67,57,62,7,167,57,62,141,10,58,62,41,110,58,62,219,209,58,62,162,53,59,62,126,153,59,62,112,253,59,62,120,97,60,62,149,197,60,62,199,41,61,62,15,142,61,62,108,242,61,62,222,86,62,62,102,187,62,62,3,32,63,62,181,132,63,62,125,233,63,62,90,78,64,62,75,179,64,62,83,24,65,62,111,125,65,62,160,226,65,62,231,71,66,62,66,173,66,62,179,18,67,62,57,120,67,62,211,221,67,62,131,67,68,62,71,169,68,62,33,15,69,62,15,117,69,62,18,219,69,62,42,65,70,62,87,167,70,62,153,13,71,62,240,115,71,62,91,218,71,62,219,64,72,62,111,167,72,62,25,14,73,62,215,116,73,62,169,219,73,62,144,66,74,62,140,169,74,62,157,16,75,62,193,119,75,62,251,222,75,62,73,70,76,62,171,173,76,62,34,21,77,62,173,124,77,62,76,228,77,62,0,76,78,62,200,179,78,62,164,27,79,62,149,131,79,62,154,235,79,62,179,83,80,62,225,187,80,62,34,36,81,62,120,140,81,62,225,244,81,62,95,93,82,62,241,197,82,62,151,46,83,62,81,151,83,62,31,0,84,62,1,105,84,62,247,209,84,62,0,59,85,62,30,164,85,62,79,13,86,62,149,118,86,62,238,223,86,62,91,73,87,62,219,178,87,62,112,28,88,62,24,134,88,62,211,239,88,62,163,89,89,62,134,195,89,62,124,45,90,62,134,151,90,62,164,1,91,62,213,107,91,62,26,214,91,62,114,64,92,62,221,170,92,62,92,21,93,62,239,127,93,62,148,234,93,62,77,85,94,62,26,192,94,62,249,42,95,62,236,149,95,62,242,0,96,62,11,108,96,62,55,215,96,62,119,66,97,62,202,173,97,62,47,25,98,62,168,132,98,62,52,240,98,62,210,91,99,62,132,199,99,62,73,51,100,62,32,159,100,62,11,11,101,62,8,119,101,62,24,227,101,62,59,79,102,62,113,187,102,62,186,39,103,62,21,148,103,62,131,0,104,62,3,109,104,62,151,217,104,62,60,70,105,62,245,178,105,62,192,31,106,62,157,140,106,62,141,249,106,62,144,102,107,62,165,211,107,62,204,64,108,62,6,174,108,62,82,27,109,62,176,136,109,62,33,246,109,62,164,99,110,62,57,209,110,62,225,62,111,62,154,172,111,62,102,26,112,62,68,136,112,62,52,246,112,62,55,100,113,62,75,210,113,62,113,64,114,62,169,174,114,62,243,28,115,62,80,139,115,62,190,249,115,62,61,104,116,62,207,214,116,62,115,69,117,62,40,180,117,62,239,34,118,62,200,145,118,62,179,0,119,62,175,111,119,62,189,222,119,62,221,77,120,62,14,189,120,62,80,44,121,62,165,155,121,62,10,11,122,62,130,122,122,62,10,234,122,62,164,89,123,62,80,201,123,62,13,57,124,62,219,168,124,62,186,24,125,62,171,136,125,62,173,248,125,62,192,104,126,62,228,216,126,62,26,73,127,62,96,185,127,62,220,20,128,62,16,77,128,62,77,133,128,62,147,189,128,62,225,245,128,62,55,46,129,62,150,102,129,62,253,158,129,62,109,215,129,62,229,15,130,62,102,72,130,62,238,128,130,62,128,185,130,62,25,242,130,62,187,42,131,62,102,99,131,62,24,156,131,62,211,212,131,62,150,13,132,62,98,70,132,62,53,127,132,62,17,184,132,62,245,240,132,62,226,41,133,62,214,98,133,62,211,155,133,62,216,212,133,62,229,13,134,62,250,70,134,62,23,128,134,62,61,185,134,62,106,242,134,62,160,43,135,62,221,100,135,62,35,158,135,62,112,215,135,62,198,16,136,62,35,74,136,62,137,131,136,62,247,188,136,62,108,246,136,62,233,47,137,62,111,105,137,62,252,162,137,62,145,220,137,62,46,22,138,62,211,79,138,62,127,137,138,62,52,195,138,62,240,252,138,62,180,54,139,62,128,112,139,62,84,170,139,62,47,228,139,62,18,30,140,62,253,87,140,62,239,145,140,62,233,203,140,62,235,5,141,62,245,63,141,62,6,122,141,62,31,180,141,62,63,238,141,62,103,40,142,62,150,98,142,62,205,156,142,62,12,215,142,62,82,17,143,62,159,75,143,62,245,133,143,62,81,192,143,62,181,250,143,62,33,53,144,62,147,111,144,62,14,170,144,62,143,228,144,62,25,31,145,62,169,89,145,62,65,148,145,62,224,206,145,62,134,9,146,62,52,68,146,62,233,126,146,62,165,185,146,62,105,244,146,62,52,47,147,62,6,106,147,62,223,164,147,62,191,223,147,62,167,26,148,62,150,85,148,62,139,144,148,62,136,203,148,62,140,6,149,62,152,65,149,62,170,124,149,62,195,183,149,62,227,242,149,62,11,46,150,62,57,105,150,62,111,164,150,62,171,223,150,62,238,26,151,62,56,86,151,62,138,145,151,62,226,204,151,62,65,8,152,62,167,67,152,62,19,127,152,62,135,186,152,62,1,246,152,62,130,49,153,62,10,109,153,62,153,168,153,62,47,228,153,62,203,31,154,62,110,91,154,62,24,151,154,62,200,210,154,62,127,14,155,62,61,74,155,62,2,134,155,62,205,193,155,62,158,253,155,62,119,57,156,62,85,117,156,62,59,177,156,62,39,237,156,62,25,41,157,62,18,101,157,62,18,161,157,62,24,221,157,62,36,25,158,62,55,85,158,62,80,145,158,62,112,205,158,62,150,9,159,62,195,69,159,62,246,129,159,62,47,190,159,62,111,250,159,62,180,54,160,62,1,115,160,62,83,175,160,62,172,235,160,62,11,40,161,62,112,100,161,62,219,160,161,62,77,221,161,62,196,25,162,62,66,86,162,62,198,146,162,62,81,207,162,62,225,11,163,62,119,72,163,62,20,133,163,62,182,193,163,62,95,254,163,62,13,59,164,62,194,119,164,62,125,180,164,62,61,241,164,62,4,46,165,62,208,106,165,62,162,167,165,62,123,228,165,62,89,33,166,62,61,94,166,62,39,155,166,62,23,216,166,62,12,21,167,62,7,82,167,62,8,143,167,62,15,204,167,62,28,9,168,62,46,70,168,62,70,131,168,62,100,192,168,62,136,253,168,62,177,58,169,62,223,119,169,62,20,181,169,62,78,242,169,62,141,47,170,62,211,108,170,62,29,170,170,62,109,231,170,62,195,36,171,62,31,98,171,62,127,159,171,62,230,220,171,62,81,26,172,62,194,87,172,62,57,149,172,62,181,210,172,62,54,16,173,62,189,77,173,62,73,139,173,62,218,200,173,62,113,6,174,62,13,68,174,62,174,129,174,62,85,191,174,62,0,253,174,62,177,58,175,62,103,120,175,62,35,182,175,62,227,243,175,62,169,49,176,62,116,111,176,62,68,173,176,62,25,235,176,62,243,40,177,62,210,102,177,62,182,164,177,62,160,226,177,62,142,32,178,62,129,94,178,62,121,156,178,62,119,218,178,62,121,24,179,62,128,86,179,62,140,148,179,62,157,210,179,62,178,16,180,62,205,78,180,62,236,140,180,62,16,203,180,62,57,9,181,62,103,71,181,62,154,133,181,62,209,195,181,62,13,2,182,62,78,64,182,62,147,126,182,62,221,188,182,62,44,251,182,62,127,57,183,62,215,119,183,62,52,182,183,62,149,244,183,62,251,50,184,62,101,113,184,62,212,175,184,62,71,238,184,62,191,44,185,62,59,107,185,62,188,169,185,62,65,232,185,62,202,38,186,62,88,101,186,62,235,163,186,62,129,226,186,62,28,33,187,62,188,95,187,62,95,158,187,62,7,221,187,62,180,27,188,62,100,90,188,62,25,153,188,62,210,215,188,62,143,22,189,62,80,85,189,62,22,148,189,62,223,210,189,62,173,17,190,62,127,80,190,62,85,143,190,62,47,206,190,62,13,13,191,62,239,75,191,62,213,138,191,62,191,201,191,62,173,8,192,62,159,71,192,62,149,134,192,62,143,197,192,62,141,4,193,62,143,67,193,62,148,130,193,62,158,193,193,62,171,0,194,62,188,63,194,62,209,126,194,62,234,189,194,62,6,253,194,62,38,60,195,62,74,123,195,62,113,186,195,62,157,249,195,62,204,56,196,62,254,119,196,62,52,183,196,62,110,246,196,62,171,53,197,62,236,116,197,62,49,180,197,62,121,243,197,62,196,50,198,62,19,114,198,62,102,177,198,62,188,240,198,62,21,48,199,62,114,111,199,62,210,174,199,62,54,238,199,62,157,45,200,62,7,109,200,62,117,172,200,62,230,235,200,62,90,43,201,62,209,106,201,62,76,170,201,62,202,233,201,62,75,41,202,62,208,104,202,62,88,168,202,62,226,231,202,62,112,39,203,62,1,103,203,62,149,166,203,62,45,230,203,62,199,37,204,62,100,101,204,62,4,165,204,62,168,228,204,62,78,36,205,62,248,99,205,62,164,163,205,62,83,227,205,62,5,35,206,62,186,98,206,62,114,162,206,62,45,226,206,62,234,33,207,62,171,97,207,62,110,161,207,62,52,225,207,62,253,32,208,62,200,96,208,62,150,160,208,62,103,224,208,62,59,32,209,62,17,96,209,62,234,159,209,62,198,223,209,62,164,31,210,62,133,95,210,62,104,159,210,62,78,223,210,62,55,31,211,62,33,95,211,62,15,159,211,62,255,222,211,62,241,30,212,62,230,94,212,62,221,158,212,62,215,222,212,62,211,30,213,62,209,94,213,62,210,158,213,62,213,222,213,62,219,30,214,62,226,94,214,62,236,158,214,62,248,222,214,62,7,31,215,62,24,95,215,62,42,159,215,62,63,223,215,62,87,31,216,62,112,95,216,62,139,159,216,62,169,223,216,62,200,31,217,62,234,95,217,62,14,160,217,62,51,224,217,62,91,32,218,62,133,96,218,62,176,160,218,62,222,224,218,62,13,33,219,62,63,97,219,62,114,161,219,62,167,225,219,62,222,33,220,62,23,98,220,62,82,162,220,62,142,226,220,62,204,34,221,62,12,99,221,62,78,163,221,62,146,227,221,62,215,35,222,62,29,100,222,62,102,164,222,62,176,228,222,62,252,36,223,62,73,101,223,62,152,165,223,62,232,229,223,62,58,38,224,62,142,102,224,62,227,166,224,62,57,231,224,62,145,39,225,62,234,103,225,62,69,168,225,62,161,232,225,62,255,40,226,62,94,105,226,62,190,169,226,62,32,234,226,62,131,42,227,62,231,106,227,62,76,171,227,62,179,235,227,62,27,44,228,62,132,108,228,62,238,172,228,62,90,237,228,62,199,45,229,62,52,110,229,62,163,174,229,62,19,239,229,62,133,47,230,62,247,111,230,62,106,176,230,62,222,240,230,62,83,49,231,62,202,113,231,62,65,178,231,62,185,242,231,62,50,51,232,62,172,115,232,62,38,180,232,62,162,244,232,62,31,53,233,62,156,117,233,62,26,182,233,62,153,246,233,62,25,55,234,62,153,119,234,62,26,184,234,62,156,248,234,62,31,57,235,62,162,121,235,62,38,186,235,62,170,250,235,62,47,59,236,62,181,123,236,62,59,188,236,62,194,252,236,62,73,61,237,62,209,125,237,62,89,190,237,62,226,254,237,62,107,63,238,62,245,127,238,62,127,192,238,62,10,1,239,62,149,65,239,62,32,130,239,62,171,194,239,62,55,3,240,62,196,67,240,62,80,132,240,62,221,196,240,62,106,5,241,62,247,69,241,62,132,134,241,62,18,199,241,62,160,7,242,62,45,72,242,62,187,136,242,62,74,201,242,62,216,9,243,62,102,74,243,62,244,138,243,62,131,203,243,62,17,12,244,62,159,76,244,62,46,141,244,62,188,205,244,62,74,14,245,62,216,78,245,62,102,143,245,62,244,207,245,62,129,16,246,62,15,81,246,62,156,145,246,62,41,210,246,62,182,18,247,62,67,83,247,62,207,147,247,62,91,212,247,62,231,20,248,62,115,85,248,62,254,149,248,62,136,214,248,62,19,23,249,62,157,87,249,62,38,152,249,62,175,216,249,62,56,25,250,62,192,89,250,62,72,154,250,62,207,218,250,62,86,27,251,62,220,91,251,62,97,156,251,62,230,220,251,62,106,29,252,62,238,93,252,62,113,158,252,62,243,222,252,62,117,31,253,62,245,95,253,62,118,160,253,62,245,224,253,62,116,33,254,62,241,97,254,62,110,162,254,62,235,226,254,62,102,35,255,62,224,99,255,62,90,164,255,62,211,228,255,62,165,18,0,63,225,50,0,63,27,83,0,63,86,115,0,63,144,147,0,63,201,179,0,63,2,212,0,63,58,244,0,63,114,20,1,63,169,52,1,63,224,84,1,63,22,117,1,63,76,149,1,63,129,181,1,63,181,213,1,63,233,245,1,63,28,22,2,63,78,54,2,63,128,86,2,63,178,118,2,63,226,150,2,63,18,183,2,63,65,215,2,63,112,247,2,63,157,23,3,63,203,55,3,63,247,87,3,63,35,120,3,63,78,152,3,63,120,184,3,63,161,216,3,63,202,248,3,63,242,24,4,63,25,57,4,63,63,89,4,63,101,121,4,63,137,153,4,63,173,185,4,63,208,217,4,63,243,249,4,63,20,26,5,63,52,58,5,63,84,90,5,63,115,122,5,63,145,154,5,63,173,186,5,63,202,218,5,63,229,250,5,63,255,26,6,63,24,59,6,63,48,91,6,63,72,123,6,63,94,155,6,63,116,187,6,63,136,219,6,63,155,251,6,63,174,27,7,63,191,59,7,63,208,91,7,63,223,123,7,63,237,155,7,63,250,187,7,63,7,220,7,63,18,252,7,63,28,28,8,63,37,60,8,63,44,92,8,63,51,124,8,63,57,156,8,63,61,188,8,63,64,220,8,63,67,252,8,63,68,28,9,63,68,60,9,63,66,92,9,63,64,124,9,63,60,156,9,63,55,188,9,63,49,220,9,63,41,252,9,63,33,28,10,63,23,60,10,63,12,92,10,63,255,123,10,63,242,155,10,63,227,187,10,63,211,219,10,63,193,251,10,63,174,27,11,63,154,59,11,63,133,91,11,63,110,123,11,63,86,155,11,63,60,187,11,63,33,219,11,63,5,251,11,63,231,26,12,63,200,58,12,63,168,90,12,63,134,122,12,63,98,154,12,63,62,186,12,63,23,218,12,63,240,249,12,63,199,25,13,63,156,57,13,63,112,89,13,63,66,121,13,63,19,153,13,63,227,184,13,63,176,216,13,63,125,248,13,63,72,24,14,63,17,56,14,63,216,87,14,63,159,119,14,63,99,151,14,63,38,183,14,63,232,214,14,63,167,246,14,63,101,22,15,63,34,54,15,63,221,85,15,63,150,117,15,63,78,149,15,63,4,181,15,63,184,212,15,63,106,244,15,63,27,20,16,63,202,51,16,63,120,83,16,63,36,115,16,63,206,146,16,63,118,178,16,63,28,210,16,63,193,241,16,63,100,17,17,63,6,49,17,63,165,80,17,63,67,112,17,63,223,143,17,63,121,175,17,63,17,207,17,63,167,238,17,63,60,14,18,63,206,45,18,63,95,77,18,63,238,108,18,63,123,140,18,63,7,172,18,63,144,203,18,63,23,235,18,63,157,10,19,63,32,42,19,63,162,73,19,63,34,105,19,63,159,136,19,63,27,168,19,63,149,199,19,63,13,231,19,63,131,6,20,63,247,37,20,63,104,69,20,63,216,100,20,63,70,132,20,63,178,163,20,63,27,195,20,63,131,226,20,63,233,1,21,63,76,33,21,63,174,64,21,63,13,96,21,63,106,127,21,63,197,158,21,63,31,190,21,63,117,221,21,63,202,252,21,63,29,28,22,63,109,59,22,63,188,90,22,63,8,122,22,63,82,153,22,63,153,184,22,63,223,215,22,63,34,247,22,63,100,22,23,63,162,53,23,63,223,84,23,63,26,116,23,63,82,147,23,63,136,178,23,63,187,209,23,63,237,240,23,63,28,16,24,63,73,47,24,63,115,78,24,63,155,109,24,63,193,140,24,63,228,171,24,63,6,203,24,63,36,234,24,63,65,9,25,63,91,40,25,63,115,71,25,63,136,102,25,63,155,133,25,63,171,164,25,63,185,195,25,63,197,226,25,63,206,1,26,63,213,32,26,63,217,63,26,63,219,94,26,63,218,125,26,63,215,156,26,63,210,187,26,63,202,218,26,63,191,249,26,63,178,24,27,63,162,55,27,63,144,86,27,63,123,117,27,63,100,148,27,63,74,179,27,63,46,210,27,63,15,241,27,63,237,15,28,63,201,46,28,63,162,77,28,63,121,108,28,63,77,139,28,63,31,170,28,63,237,200,28,63,185,231,28,63,131,6,29,63,74,37,29,63,14,68,29,63,207,98,29,63,142,129,29,63,74,160,29,63,3,191,29,63,186,221,29,63,110,252,29,63,31,27,30,63,205,57,30,63,121,88,30,63,34,119,30,63,200,149,30,63,107,180,30,63,12,211,30,63,170,241,30,63,69,16,31,63,221,46,31,63,114,77,31,63,5,108,31,63,148,138,31,63,33,169,31,63,171,199,31,63,50,230,31,63,182,4,32,63,56,35,32,63,182,65,32,63,50,96,32,63,170,126,32,63,32,157,32,63,147,187,32,63,3,218,32,63,112,248,32,63,218,22,33,63,65,53,33,63,165,83,33,63,6,114,33,63,100,144,33,63,191,174,33,63,23,205,33,63,108,235,33,63,190,9,34,63,13,40,34,63,89,70,34,63,162,100,34,63,232,130,34,63,43,161,34,63,107,191,34,63,167,221,34,63,225,251,34,63,24,26,35,63,75,56,35,63,123,86,35,63,168,116,35,63,211,146,35,63,249,176,35,63,29,207,35,63,62,237,35,63,91,11,36,63,118,41,36,63,141,71,36,63,161,101,36,63,177,131,36,63,191,161,36,63,201,191,36,63,208,221,36,63,212,251,36,63,213,25,37,63,210,55,37,63,204,85,37,63,195,115,37,63,183,145,37,63,167,175,37,63,148,205,37,63,126,235,37,63,101,9,38,63,72,39,38,63,40,69,38,63,4,99,38,63,221,128,38,63,179,158,38,63,134,188,38,63,85,218,38,63,33,248,38,63,233,21,39,63,174,51,39,63,112,81,39,63,46,111,39,63,233,140,39,63,160,170,39,63,84,200,39,63,4,230,39,63,178,3,40,63,91,33,40,63,1,63,40,63,164,92,40,63,67,122,40,63,223,151,40,63,120,181,40,63,12,211,40,63,158,240,40,63,43,14,41,63,182,43,41,63,60,73,41,63,192,102,41,63,63,132,41,63,187,161,41,63,52,191,41,63,169,220,41,63,26,250,41,63,136,23,42,63,242,52,42,63,89,82,42,63,188,111,42,63,28,141,42,63,119,170,42,63,208,199,42,63,36,229,42,63,117,2,43,63,194,31,43,63,12,61,43,63,82,90,43,63,148,119,43,63,211,148,43,63,14,178,43,63,69,207,43,63,120,236,43,63,168,9,44,63,212,38,44,63,252,67,44,63,33,97,44,63,66,126,44,63,95,155,44,63,120,184,44,63,142,213,44,63,159,242,44,63,173,15,45,63,184,44,45,63,190,73,45,63,193,102,45,63,191,131,45,63,186,160,45,63,177,189,45,63,165,218,45,63,148,247,45,63,128,20,46,63,103,49,46,63,75,78,46,63,43,107,46,63,7,136,46,63,224,164,46,63,180,193,46,63,132,222,46,63,81,251,46,63,26,24,47,63,222,52,47,63,159,81,47,63,92,110,47,63,21,139,47,63,202,167,47,63,123,196,47,63,40,225,47,63,209,253,47,63,118,26,48,63,23,55,48,63,180,83,48,63,77,112,48,63,226,140,48,63,115,169,48,63,0,198,48,63,137,226,48,63,14,255,48,63,142,27,49,63,11,56,49,63,132,84,49,63,248,112,49,63,105,141,49,63,214,169,49,63,62,198,49,63,162,226,49,63,2,255,49,63,95,27,50,63,182,55,50,63,10,84,50,63,90,112,50,63,166,140,50,63,237,168,50,63,48,197,50,63,111,225,50,63,170,253,50,63,225,25,51,63,19,54,51,63,66,82,51,63,108,110,51,63,146,138,51,63,180,166,51,63,209,194,51,63,234,222,51,63,0,251,51,63,16,23,52,63,29,51,52,63,37,79,52,63,41,107,52,63,41,135,52,63,37,163,52,63,28,191,52,63,15,219,52,63,253,246,52,63,232,18,53,63,206,46,53,63,176,74,53,63,141,102,53,63,102,130,53,63,59,158,53,63,11,186,53,63,215,213,53,63,159,241,53,63,98,13,54,63,33,41,54,63,220,68,54,63,146,96,54,63,68,124,54,63,241,151,54,63,154,179,54,63,63,207,54,63,223,234,54,63,123,6,55,63,18,34,55,63,165,61,55,63,52,89,55,63,190,116,55,63,67,144,55,63,196,171,55,63,65,199,55,63,185,226,55,63,45,254,55,63,156,25,56,63,7,53,56,63,109,80,56,63,207,107,56,63,44,135,56,63,133,162,56,63,217,189,56,63,40,217,56,63,115,244,56,63,186,15,57,63,252,42,57,63,57,70,57,63,114,97,57,63,166,124,57,63,214,151,57,63,1,179,57,63,40,206,57,63,74,233,57,63,103,4,58,63,128,31,58,63,148,58,58,63,163,85,58,63,174,112,58,63,180,139,58,63,182,166,58,63,179,193,58,63,171,220,58,63,159,247,58,63,142,18,59,63,120,45,59,63,94,72,59,63,63,99,59,63,27,126,59,63,243,152,59,63,197,179,59,63,148,206,59,63,93,233,59,63,34,4,60,63,226,30,60,63,157,57,60,63,84,84,60,63,5,111,60,63,178,137,60,63,91,164,60,63,254,190,60,63,157,217,60,63,55,244,60,63,204,14,61,63,93,41,61,63,232,67,61,63,111,94,61,63,241,120,61,63,110,147,61,63,231,173,61,63,91,200,61,63,201,226,61,63,51,253,61,63,152,23,62,63,249,49,62,63,84,76,62,63,171,102,62,63,252,128,62,63,73,155,62,63,145,181,62,63,212,207,62,63,19,234,62,63,76,4,63,63,128,30,63,63,176,56,63,63,219,82,63,63,0,109,63,63,33,135,63,63,61,161,63,63,84,187,63,63,102,213,63,63,115,239,63,63,123,9,64,63,127,35,64,63,125,61,64,63,118,87,64,63,106,113,64,63,90,139,64,63,68,165,64,63,42,191,64,63,10,217,64,63,229,242,64,63,188,12,65,63,141,38,65,63,90,64,65,63,33,90,65,63,228,115,65,63,161,141,65,63,89,167,65,63,13,193,65,63,187,218,65,63,100,244,65,63,8,14,66,63,167,39,66,63,65,65,66,63,214,90,66,63,102,116,66,63,241,141,66,63,119,167,66,63,248,192,66,63,115,218,66,63,234,243,66,63,91,13,67,63,199,38,67,63,47,64,67,63,145,89,67,63,238,114,67,63,69,140,67,63,152,165,67,63,230,190,67,63,46,216,67,63,113,241,67,63,175,10,68,63,232,35,68,63,28,61,68,63,75,86,68,63,116,111,68,63,153,136,68,63,184,161,68,63,210,186,68,63,230,211,68,63,246,236,68,63,0,6,69,63,5,31,69,63,5,56,69,63,0,81,69,63,245,105,69,63,230,130,69,63,209,155,69,63,182,180,69,63,151,205,69,63,114,230,69,63,72,255,69,63,25,24,70,63,229,48,70,63,171,73,70,63,108,98,70,63,40,123,70,63,222,147,70,63,143,172,70,63,59,197,70,63,226,221,70,63,131,246,70,63,31,15,71,63,182,39,71,63,71,64,71,63,211,88,71,63,90,113,71,63,220,137,71,63,88,162,71,63,207,186,71,63,64,211,71,63,172,235,71,63,19,4,72,63,116,28,72,63,209,52,72,63,39,77,72,63,121,101,72,63,197,125,72,63,11,150,72,63,77,174,72,63,137,198,72,63,191,222,72,63,240,246,72,63,28,15,73,63,66,39,73,63,99,63,73,63,127,87,73,63,149,111,73,63,166,135,73,63,177,159,73,63,183,183,73,63,183,207,73,63,178,231,73,63,168,255,73,63,152,23,74,63,131,47,74,63,104,71,74,63,72,95,74,63,34,119,74,63,247,142,74,63,199,166,74,63,145,190,74,63,85,214,74,63,20,238,74,63,206,5,75,63,130,29,75,63,49,53,75,63,218,76,75,63,126,100,75,63,28,124,75,63,181,147,75,63,72,171,75,63,213,194,75,63,93,218,75,63,224,241,75,63,93,9,76,63,213,32,76,63,71,56,76,63,179,79,76,63,26,103,76,63,124,126,76,63,216,149,76,63,46,173,76,63,127,196,76,63,202,219,76,63,16,243,76,63,80,10,77,63,139,33,77,63,192,56,77,63,240,79,77,63,26,103,77,63,62,126,77,63,93,149,77,63,118,172,77,63,137,195,77,63,151,218,77,63,160,241,77,63,163,8,78,63,160,31,78,63,151,54,78,63,137,77,78,63,118,100,78,63,93,123,78,63,62,146,78,63,25,169,78,63,239,191,78,63,192,214,78,63,138,237,78,63,79,4,79,63,15,27,79,63,201,49,79,63,125,72,79,63,43,95,79,63,212,117,79,63,119,140,79,63,21,163,79,63,172,185,79,63,63,208,79,63,203,230,79,63,82,253,79,63,211,19,80,63,79,42,80,63,197,64,80,63,53,87,80,63,159,109,80,63,4,132,80,63,99,154,80,63,189,176,80,63,16,199,80,63,94,221,80,63,167,243,80,63,233,9,81,63,38,32,81,63,93,54,81,63,143,76,81,63,187,98,81,63,225,120,81,63,1,143,81,63,28,165,81,63,48,187,81,63,64,209,81,63,73,231,81,63,77,253,81,63,75,19,82,63,67,41,82,63,53,63,82,63,34,85,82,63,9,107,82,63,234,128,82,63,198,150,82,63,155,172,82,63,107,194,82,63,53,216,82,63,250,237,82,63,185,3,83,63,113,25,83,63,37,47,83,63,210,68,83,63,121,90,83,63,27,112,83,63,183,133,83,63,77,155,83,63,222,176,83,63,104,198,83,63,237,219,83,63,108,241,83,63,230,6,84,63,89,28,84,63,199,49,84,63,46,71,84,63,145,92,84,63,237,113,84,63,67,135,84,63,148,156,84,63,223,177,84,63,35,199,84,63,99,220,84,63,156,241,84,63,207,6,85,63,253,27,85,63,37,49,85,63,71,70,85,63,99,91,85,63,121,112,85,63,138,133,85,63,149,154,85,63,153,175,85,63,152,196,85,63,146,217,85,63,133,238,85,63,114,3,86,63,90,24,86,63,60,45,86,63,24,66,86,63,238,86,86,63,190,107,86,63,136,128,86,63,76,149,86,63,11,170,86,63,196,190,86,63,118,211,86,63,35,232,86,63,203,252,86,63,108,17,87,63,7,38,87,63,156,58,87,63,44,79,87,63,182,99,87,63,58,120,87,63,183,140,87,63,47,161,87,63,162,181,87,63,14,202,87,63,116,222,87,63,213,242,87,63,47,7,88,63,132,27,88,63,211,47,88,63,28,68,88,63,95,88,88,63,156,108,88,63,211,128,88,63,4,149,88,63,47,169,88,63,85,189,88,63,116,209,88,63,142,229,88,63,162,249,88,63,175,13,89,63,183,33,89,63,185,53,89,63,181,73,89,63,171,93,89,63,155,113,89,63,134,133,89,63,106,153,89,63,72,173,89,63,33,193,89,63,243,212,89,63,192,232,89,63,135,252,89,63,71,16,90,63,2,36,90,63,183,55,90,63,102,75,90,63,15,95,90,63,178,114,90,63,79,134,90,63,230,153,90,63,119,173,90,63,3,193,90,63,136,212,90,63,7,232,90,63,129,251,90,63,244,14,91,63,98,34,91,63,201,53,91,63,43,73,91,63,135,92,91,63,220,111,91,63,44,131,91,63,118,150,91,63,186,169,91,63,248,188,91,63,47,208,91,63,97,227,91,63,141,246,91,63,179,9,92,63,212,28,92,63,238,47,92,63,2,67,92,63,16,86,92,63,24,105,92,63,26,124,92,63,23,143,92,63,13,162,92,63,253,180,92,63,232,199,92,63,204,218,92,63,171,237,92,63,131,0,93,63,86,19,93,63,34,38,93,63,233,56,93,63,169,75,93,63,100,94,93,63,24,113,93,63,199,131,93,63,112,150,93,63,18,169,93,63,175,187,93,63,70,206,93,63,215,224,93,63,97,243,93,63,230,5,94,63,101,24,94,63,222,42,94,63,81,61,94,63,190,79,94,63,36,98,94,63,133,116,94,63,224,134,94,63,53,153,94,63,132,171,94,63,205,189,94,63,16,208,94,63,77,226,94,63,132,244,94,63,181,6,95,63,224,24,95,63,5,43,95,63,36,61,95,63,61,79,95,63,80,97,95,63,93,115,95,63,101,133,95,63,102,151,95,63,97,169,95,63,86,187,95,63,69,205,95,63,46,223,95,63,18,241,95,63,239,2,96,63,198,20,96,63,151,38,96,63,98,56,96,63,40,74,96,63,231,91,96,63,160,109,96,63,84,127,96,63,1,145,96,63,168,162,96,63,73,180,96,63,229,197,96,63,122,215,96,63,10,233,96,63,147,250,96,63,22,12,97,63,148,29,97,63,11,47,97,63,125,64,97,63,232,81,97,63,77,99,97,63,173,116,97,63,6,134,97,63,90,151,97,63,167,168,97,63,239,185,97,63,48,203,97,63,108,220,97,63,162,237,97,63,209,254,97,63,251,15,98,63,30,33,98,63,60,50,98,63,84,67,98,63,101,84,98,63,113,101,98,63,119,118,98,63,119,135,98,63,112,152,98,63,100,169,98,63,82,186,98,63,58,203,98,63,28,220,98,63,247,236,98,63,205,253,98,63,157,14,99,63,103,31,99,63,43,48,99,63,233,64,99,63,161,81,99,63,83,98,99,63,255,114,99,63,165,131,99,63,69,148,99,63,224,164,99,63,116,181,99,63,2,198,99,63,138,214,99,63,13,231,99,63,137,247,99,63,255,7,100,63,112,24,100,63,218,40,100,63,62,57,100,63,157,73,100,63,246,89,100,63,72,106,100,63,149,122,100,63,219,138,100,63,28,155,100,63,87,171,100,63,140,187,100,63,186,203,100,63,227,219,100,63,6,236,100,63,35,252,100,63,58,12,101,63,75,28,101,63,86,44,101,63,91,60,101,63,91,76,101,63,84,92,101,63,71,108,101,63,53,124,101,63,28,140,101,63,254,155,101,63,217,171,101,63,175,187,101,63,126,203,101,63,72,219,101,63,12,235,101,63,202,250,101,63,130,10,102,63,52,26,102,63,224,41,102,63,134,57,102,63,38,73,102,63,193,88,102,63,85,104,102,63,227,119,102,63,108,135,102,63,238,150,102,63,107,166,102,63,226,181,102,63,83,197,102,63,190,212,102,63,35,228,102,63,130,243,102,63,219,2,103,63,46,18,103,63,124,33,103,63,195,48,103,63,5,64,103,63,64,79,103,63,118,94,103,63,166,109,103,63,208,124,103,63,244,139,103,63,18,155,103,63,42,170,103,63,61,185,103,63,73,200,103,63,80,215,103,63,80,230,103,63,75,245,103,63,64,4,104,63,47,19,104,63,24,34,104,63,251,48,104,63,217,63,104,63,176,78,104,63,130,93,104,63,78,108,104,63,20,123,104,63,212,137,104,63,142,152,104,63,66,167,104,63,240,181,104,63,153,196,104,63,60,211,104,63,217,225,104,63,112,240,104,63,1,255,104,63,140,13,105,63,17,28,105,63,145,42,105,63,11,57,105,63,127,71,105,63,237,85,105,63,85,100,105,63,183,114,105,63,20,129,105,63,106,143,105,63,187,157,105,63,6,172,105,63,75,186,105,63,139,200,105,63,196,214,105,63,248,228,105,63,38,243,105,63,78,1,106,63,112,15,106,63,141,29,106,63,163,43,106,63,180,57,106,63,191,71,106,63,196,85,106,63,196,99,106,63,189,113,106,63,177,127,106,63,159,141,106,63,135,155,106,63,106,169,106,63,70,183,106,63,29,197,106,63,238,210,106,63,186,224,106,63,127,238,106,63,63,252,106,63,249,9,107,63,173,23,107,63,91,37,107,63,4,51,107,63,167,64,107,63,68,78,107,63,219,91,107,63,109,105,107,63,249,118,107,63,127,132,107,63,255,145,107,63,122,159,107,63,238,172,107,63,94,186,107,63,199,199,107,63,42,213,107,63,136,226,107,63,224,239,107,63,51,253,107,63,128,10,108,63,198,23,108,63,8,37,108,63,67,50,108,63,121,63,108,63,169,76,108,63,211,89,108,63,248,102,108,63,23,116,108,63,48,129,108,63,68,142,108,63,82,155,108,63,90,168,108,63,92,181,108,63,89,194,108,63,80,207,108,63,65,220,108,63,45,233,108,63,19,246,108,63,243,2,109,63,206,15,109,63,163,28,109,63,114,41,109,63,60,54,109,63,0,67,109,63,190,79,109,63,119,92,109,63,42,105,109,63,215,117,109,63,127,130,109,63,33,143,109,63,189,155,109,63,84,168,109,63,229,180,109,63,113,193,109,63,247,205,109,63,119,218,109,63,242,230,109,63,103,243,109,63,214,255,109,63,64,12,110,63,164,24,110,63,3,37,110,63,91,49,110,63,175,61,110,63,253,73,110,63,69,86,110,63,135,98,110,63,196,110,110,63,252,122,110,63,45,135,110,63,90,147,110,63,128,159,110,63,161,171,110,63,189,183,110,63,211,195,110,63,227,207,110,63,238,219,110,63,243,231,110,63,243,243,110,63,237,255,110,63,226,11,111,63,209,23,111,63,186,35,111,63,158,47,111,63,125,59,111,63,85,71,111,63,41,83,111,63,247,94,111,63,191,106,111,63,130,118,111,63,63,130,111,63,247,141,111,63,169,153,111,63,86,165,111,63,253,176,111,63,159,188,111,63,59,200,111,63,210,211,111,63,99,223,111,63,239,234,111,63,117,246,111,63,246,1,112,63,114,13,112,63,231,24,112,63,88,36,112,63,195,47,112,63,40,59,112,63,137,70,112,63,227,81,112,63,56,93,112,63,136,104,112,63,210,115,112,63,23,127,112,63,87,138,112,63,145,149,112,63,197,160,112,63,244,171,112,63,30,183,112,63,66,194,112,63,97,205,112,63,123,216,112,63,143,227,112,63,157,238,112,63,167,249,112,63,171,4,113,63,169,15,113,63,162,26,113,63,150,37,113,63,132,48,113,63,109,59,113,63,81,70,113,63,47,81,113,63,8,92,113,63,219,102,113,63,170,113,113,63,114,124,113,63,54,135,113,63,244,145,113,63,173,156,113,63,96,167,113,63,14,178,113,63,183,188,113,63,91,199,113,63,249,209,113,63,146,220,113,63,37,231,113,63,179,241,113,63,60,252,113,63,192,6,114,63,62,17,114,63,183,27,114,63,43,38,114,63,154,48,114,63,3,59,114,63,103,69,114,63,197,79,114,63,31,90,114,63,115,100,114,63,194,110,114,63,11,121,114,63,79,131,114,63,143,141,114,63,200,151,114,63,253,161,114,63,44,172,114,63,87,182,114,63,123,192,114,63,155,202,114,63,182,212,114,63,203,222,114,63,219,232,114,63,230,242,114,63,235,252,114,63,236,6,115,63,231,16,115,63,221,26,115,63,206,36,115,63,186,46,115,63,160,56,115,63,130,66,115,63,94,76,115,63,53,86,115,63,7,96,115,63,212,105,115,63,155,115,115,63,94,125,115,63,27,135,115,63,211,144,115,63,134,154,115,63,52,164,115,63,221,173,115,63,128,183,115,63,31,193,115,63,184,202,115,63,77,212,115,63,220,221,115,63,102,231,115,63,235,240,115,63,107,250,115,63,230,3,116,63,92,13,116,63,204,22,116,63,56,32,116,63,159,41,116,63,0,51,116,63,93,60,116,63,180,69,116,63,6,79,116,63,84,88,116,63,156,97,116,63,223,106,116,63,29,116,116,63,87,125,116,63,139,134,116,63,186,143,116,63,228,152,116,63,9,162,116,63,41,171,116,63,68,180,116,63,91,189,116,63,108,198,116,63,120,207,116,63,127,216,116,63,129,225,116,63,127,234,116,63,119,243,116,63,106,252,116,63,89,5,117,63,66,14,117,63,38,23,117,63,6,32,117,63,225,40,117,63,182,49,117,63,135,58,117,63,83,67,117,63,26,76,117,63,220,84,117,63,153,93,117,63,81,102,117,63,4,111,117,63,179,119,117,63,92,128,117,63,1,137,117,63,160,145,117,63,59,154,117,63,209,162,117,63,98,171,117,63,239,179,117,63,118,188,117,63,249,196,117,63,118,205,117,63,239,213,117,63,99,222,117,63,210,230,117,63,61,239,117,63,162,247,117,63,3,0,118,63,95,8,118,63,182,16,118,63,8,25,118,63,86,33,118,63,159,41,118,63,227,49,118,63,34,58,118,63,92,66,118,63,146,74,118,63,195,82,118,63,239,90,118,63,22,99,118,63,57,107,118,63,86,115,118,63,112,123,118,63,132,131,118,63,148,139,118,63,158,147,118,63,165,155,118,63,166,163,118,63,163,171,118,63,155,179,118,63,142,187,118,63,125,195,118,63,103,203,118,63,76,211,118,63,45,219,118,63,9,227,118,63,224,234,118,63,178,242,118,63,128,250,118,63,74,2,119,63,14,10,119,63,206,17,119,63,137,25,119,63,64,33,119,63,242,40,119,63,160,48,119,63,72,56,119,63,237,63,119,63,140,71,119,63,39,79,119,63,190,86,119,63,79,94,119,63,220,101,119,63,101,109,119,63,233,116,119,63,105,124,119,63,228,131,119,63,90,139,119,63,204,146,119,63,57,154,119,63,162,161,119,63,6,169,119,63,101,176,119,63,192,183,119,63,23,191,119,63,105,198,119,63,182,205,119,63,255,212,119,63,68,220,119,63,132,227,119,63,191,234,119,63,246,241,119,63,41,249,119,63,87,0,120,63,129,7,120,63,166,14,120,63,198,21,120,63,227,28,120,63,250,35,120,63,14,43,120,63,28,50,120,63,39,57,120,63,45,64,120,63,46,71,120,63,44,78,120,63,36,85,120,63,25,92,120,63,9,99,120,63,244,105,120,63,219,112,120,63,190,119,120,63,156,126,120,63,118,133,120,63,76,140,120,63,29,147,120,63,234,153,120,63,179,160,120,63,119,167,120,63,55,174,120,63,242,180,120,63,169,187,120,63,92,194,120,63,11,201,120,63,181,207,120,63,91,214,120,63,252,220,120,63,154,227,120,63,51,234,120,63,199,240,120,63,88,247,120,63,228,253,120,63,108,4,121,63,240,10,121,63,111,17,121,63,234,23,121,63,97,30,121,63,211,36,121,63,66,43,121,63,172,49,121,63,18,56,121,63,116,62,121,63,209,68,121,63,42,75,121,63,127,81,121,63,208,87,121,63,29,94,121,63,101,100,121,63,170,106,121,63,234,112,121,63,38,119,121,63,93,125,121,63,145,131,121,63,193,137,121,63,236,143,121,63,19,150,121,63,54,156,121,63,85,162,121,63,112,168,121,63,134,174,121,63,153,180,121,63,167,186,121,63,178,192,121,63,184,198,121,63,186,204,121,63,184,210,121,63,178,216,121,63,168,222,121,63,154,228,121,63,135,234,121,63,113,240,121,63,87,246,121,63,56,252,121,63,22,2,122,63,239,7,122,63,197,13,122,63,150,19,122,63,100,25,122,63,45,31,122,63,243,36,122,63,180,42,122,63,113,48,122,63,43,54,122,63,224,59,122,63,146,65,122,63,63,71,122,63,233,76,122,63,142,82,122,63,48,88,122,63,206,93,122,63,103,99,122,63,253,104,122,63,143,110,122,63,29,116,122,63,167,121,122,63,45,127,122,63,175,132,122,63,45,138,122,63,168,143,122,63,30,149,122,63,145,154,122,63,255,159,122,63,106,165,122,63,209,170,122,63,52,176,122,63,147,181,122,63,239,186,122,63,70,192,122,63,154,197,122,63,234,202,122,63,54,208,122,63,126,213,122,63,194,218,122,63,3,224,122,63,64,229,122,63,121,234,122,63,174,239,122,63,223,244,122,63,13,250,122,63,55,255,122,63,93,4,123,63,127,9,123,63,157,14,123,63,184,19,123,63,207,24,123,63,227,29,123,63,242,34,123,63,254,39,123,63,6,45,123,63,10,50,123,63,11,55,123,63,8,60,123,63,1,65,123,63,247,69,123,63,233,74,123,63,215,79,123,63,193,84,123,63,168,89,123,63,139,94,123,63,107,99,123,63,71,104,123,63,31,109,123,63,243,113,123,63,196,118,123,63,146,123,123,63,91,128,123,63,33,133,123,63,228,137,123,63,163,142,123,63,94,147,123,63,22,152,123,63,202,156,123,63,122,161,123,63,39,166,123,63,208,170,123,63,118,175,123,63,24,180,123,63,183,184,123,63,82,189,123,63,233,193,123,63,125,198,123,63,14,203,123,63,155,207,123,63,36,212,123,63,170,216,123,63,45,221,123,63,172,225,123,63,39,230,123,63,159,234,123,63,19,239,123,63,132,243,123,63,242,247,123,63,92,252,123,63,195,0,124,63,38,5,124,63,133,9,124,63,226,13,124,63,58,18,124,63,144,22,124,63,226,26,124,63,48,31,124,63,123,35,124,63,195,39,124,63,7,44,124,63,72,48,124,63,134,52,124,63,192,56,124,63,247,60,124,63,42,65,124,63,90,69,124,63,135,73,124,63,176,77,124,63,214,81,124,63,249,85,124,63,24,90,124,63,52,94,124,63,77,98,124,63,98,102,124,63,116,106,124,63,131,110,124,63,142,114,124,63,150,118,124,63,155,122,124,63,157,126,124,63,155,130,124,63],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);allocate([150,134,124,63,142,138,124,63,130,142,124,63,116,146,124,63,98,150,124,63,77,154,124,63,52,158,124,63,24,162,124,63,249,165,124,63,215,169,124,63,178,173,124,63,137,177,124,63,94,181,124,63,47,185,124,63,253,188,124,63,199,192,124,63,143,196,124,63,83,200,124,63,20,204,124,63,211,207,124,63,141,211,124,63,69,215,124,63,250,218,124,63,171,222,124,63,90,226,124,63,5,230,124,63,173,233,124,63,82,237,124,63,244,240,124,63,147,244,124,63,46,248,124,63,199,251,124,63,93,255,124,63,239,2,125,63,127,6,125,63,11,10,125,63,148,13,125,63,27,17,125,63,158,20,125,63,30,24,125,63,155,27,125,63,21,31,125,63,140,34,125,63,0,38,125,63,114,41,125,63,224,44,125,63,75,48,125,63,179,51,125,63,24,55,125,63,122,58,125,63,217,61,125,63,54,65,125,63,143,68,125,63,229,71,125,63,56,75,125,63,137,78,125,63,214,81,125,63,33,85,125,63,104,88,125,63,173,91,125,63,239,94,125,63,46,98,125,63,106,101,125,63,163,104,125,63,217,107,125,63,12,111,125,63,61,114,125,63,106,117,125,63,149,120,125,63,189,123,125,63,226,126,125,63,4,130,125,63,36,133,125,63,64,136,125,63,90,139,125,63,112,142,125,63,133,145,125,63,150,148,125,63,164,151,125,63,176,154,125,63,185,157,125,63,191,160,125,63,194,163,125,63,194,166,125,63,192,169,125,63,187,172,125,63,179,175,125,63,168,178,125,63,155,181,125,63,139,184,125,63,120,187,125,63,99,190,125,63,74,193,125,63,48,196,125,63,18,199,125,63,241,201,125,63,206,204,125,63,169,207,125,63,128,210,125,63,85,213,125,63,39,216,125,63,247,218,125,63,196,221,125,63,142,224,125,63,85,227,125,63,26,230,125,63,220,232,125,63,156,235,125,63,89,238,125,63,19,241,125,63,203,243,125,63,128,246,125,63,51,249,125,63,227,251,125,63,144,254,125,63,59,1,126,63,227,3,126,63,137,6,126,63,44,9,126,63,204,11,126,63,106,14,126,63,6,17,126,63,158,19,126,63,53,22,126,63,200,24,126,63,90,27,126,63,232,29,126,63,116,32,126,63,254,34,126,63,133,37,126,63,10,40,126,63,140,42,126,63,12,45,126,63,137,47,126,63,4,50,126,63,124,52,126,63,242,54,126,63,101,57,126,63,214,59,126,63,68,62,126,63,176,64,126,63,26,67,126,63,129,69,126,63,230,71,126,63,72,74,126,63,168,76,126,63,5,79,126,63,96,81,126,63,185,83,126,63,15,86,126,63,99,88,126,63,181,90,126,63,4,93,126,63,81,95,126,63,155,97,126,63,227,99,126,63,41,102,126,63,108,104,126,63,173,106,126,63,236,108,126,63,40,111,126,63,98,113,126,63,154,115,126,63,208,117,126,63,3,120,126,63,51,122,126,63,98,124,126,63,142,126,126,63,184,128,126,63,224,130,126,63,5,133,126,63,40,135,126,63,73,137,126,63,104,139,126,63,132,141,126,63,159,143,126,63,183,145,126,63,204,147,126,63,224,149,126,63,241,151,126,63,0,154,126,63,13,156,126,63,24,158,126,63,32,160,126,63,38,162,126,63,42,164,126,63,44,166,126,63,44,168,126,63,41,170,126,63,37,172,126,63,30,174,126,63,21,176,126,63,10,178,126,63,253,179,126,63,238,181,126,63,220,183,126,63,201,185,126,63,179,187,126,63,155,189,126,63,129,191,126,63,101,193,126,63,71,195,126,63,39,197,126,63,5,199,126,63,224,200,126,63,186,202,126,63,145,204,126,63,103,206,126,63,58,208,126,63,12,210,126,63,219,211,126,63,168,213,126,63,115,215,126,63,61,217,126,63,4,219,126,63,201,220,126,63,140,222,126,63,77,224,126,63,12,226,126,63,202,227,126,63,133,229,126,63,62,231,126,63,245,232,126,63,170,234,126,63,94,236,126,63,15,238,126,63,190,239,126,63,108,241,126,63,23,243,126,63,193,244,126,63,104,246,126,63,14,248,126,63,178,249,126,63,84,251,126,63,243,252,126,63,145,254,126,63,46,0,127,63,200,1,127,63,96,3,127,63,247,4,127,63,139,6,127,63,30,8,127,63,175,9,127,63,62,11,127,63,203,12,127,63,86,14,127,63,223,15,127,63,103,17,127,63,237,18,127,63,112,20,127,63,242,21,127,63,115,23,127,63,241,24,127,63,110,26,127,63,233,27,127,63,98,29,127,63,217,30,127,63,78,32,127,63,194,33,127,63,52,35,127,63,164,36,127,63,18,38,127,63,127,39,127,63,234,40,127,63,83,42,127,63,186,43,127,63,32,45,127,63,131,46,127,63,230,47,127,63,70,49,127,63,165,50,127,63,2,52,127,63,93,53,127,63,182,54,127,63,14,56,127,63,100,57,127,63,185,58,127,63,12,60,127,63,93,61,127,63,172,62,127,63,250,63,127,63,70,65,127,63,145,66,127,63,217,67,127,63,33,69,127,63,102,70,127,63,170,71,127,63,236,72,127,63,45,74,127,63,108,75,127,63,169,76,127,63,229,77,127,63,31,79,127,63,88,80,127,63,143,81,127,63,196,82,127,63,248,83,127,63,42,85,127,63,91,86,127,63,138,87,127,63,184,88,127,63,228,89,127,63,14,91,127,63,55,92,127,63,94,93,127,63,132,94,127,63,169,95,127,63,203,96,127,63,237,97,127,63,12,99,127,63,42,100,127,63,71,101,127,63,98,102,127,63,124,103,127,63,148,104,127,63,171,105,127,63,192,106,127,63,212,107,127,63,230,108,127,63,247,109,127,63,6,111,127,63,20,112,127,63,33,113,127,63,44,114,127,63,53,115,127,63,61,116,127,63,68,117,127,63,73,118,127,63,77,119,127,63,79,120,127,63,80,121,127,63,80,122,127,63,78,123,127,63,75,124,127,63,70,125,127,63,64,126,127,63,57,127,127,63,48,128,127,63,38,129,127,63,27,130,127,63,14,131,127,63,0,132,127,63,240,132,127,63,223,133,127,63,205,134,127,63,185,135,127,63,164,136,127,63,142,137,127,63,118,138,127,63,93,139,127,63,67,140,127,63,40,141,127,63,11,142,127,63,237,142,127,63,205,143,127,63,173,144,127,63,139,145,127,63,103,146,127,63,67,147,127,63,29,148,127,63,246,148,127,63,205,149,127,63,164,150,127,63,121,151,127,63,77,152,127,63,31,153,127,63,241,153,127,63,193,154,127,63,144,155,127,63,93,156,127,63,42,157,127,63,245,157,127,63,191,158,127,63,136,159,127,63,79,160,127,63,22,161,127,63,219,161,127,63,159,162,127,63,98,163,127,63,36,164,127,63,228,164,127,63,163,165,127,63,98,166,127,63,31,167,127,63,219,167,127,63,149,168,127,63,79,169,127,63,7,170,127,63,190,170,127,63,117,171,127,63,42,172,127,63,221,172,127,63,144,173,127,63,66,174,127,63,242,174,127,63,162,175,127,63,80,176,127,63,253,176,127,63,169,177,127,63,85,178,127,63,254,178,127,63,167,179,127,63,79,180,127,63,246,180,127,63,156,181,127,63,64,182,127,63,228,182,127,63,134,183,127,63,40,184,127,63,200,184,127,63,103,185,127,63,6,186,127,63,163,186,127,63,63,187,127,63,219,187,127,63,117,188,127,63,14,189,127,63,166,189,127,63,61,190,127,63,212,190,127,63,105,191,127,63,253,191,127,63,144,192,127,63,34,193,127,63,180,193,127,63,68,194,127,63,211,194,127,63,98,195,127,63,239,195,127,63,123,196,127,63,7,197,127,63,145,197,127,63,27,198,127,63,163,198,127,63,43,199,127,63,178,199,127,63,56,200,127,63,189,200,127,63,65,201,127,63,196,201,127,63,70,202,127,63,199,202,127,63,71,203,127,63,199,203,127,63,69,204,127,63,195,204,127,63,64,205,127,63,187,205,127,63,54,206,127,63,177,206,127,63,42,207,127,63,162,207,127,63,26,208,127,63,144,208,127,63,6,209,127,63,123,209,127,63,239,209,127,63,98,210,127,63,213,210,127,63,70,211,127,63,183,211,127,63,39,212,127,63,150,212,127,63,4,213,127,63,114,213,127,63,222,213,127,63,74,214,127,63,181,214,127,63,32,215,127,63,137,215,127,63,242,215,127,63,89,216,127,63,192,216,127,63,39,217,127,63,140,217,127,63,241,217,127,63,85,218,127,63,184,218,127,63,27,219,127,63,124,219,127,63,221,219,127,63,61,220,127,63,157,220,127,63,251,220,127,63,89,221,127,63,183,221,127,63,19,222,127,63,111,222,127,63,202,222,127,63,36,223,127,63,126,223,127,63,215,223,127,63,47,224,127,63,134,224,127,63,221,224,127,63,51,225,127,63,137,225,127,63,221,225,127,63,49,226,127,63,133,226,127,63,215,226,127,63,41,227,127,63,122,227,127,63,203,227,127,63,27,228,127,63,106,228,127,63,185,228,127,63,7,229,127,63,84,229,127,63,161,229,127,63,237,229,127,63,56,230,127,63,131,230,127,63,205,230,127,63,23,231,127,63,96,231,127,63,168,231,127,63,239,231,127,63,54,232,127,63,125,232,127,63,195,232,127,63,8,233,127,63,76,233,127,63,144,233,127,63,212,233,127,63,23,234,127,63,89,234,127,63,154,234,127,63,219,234,127,63,28,235,127,63,92,235,127,63,155,235,127,63,218,235,127,63,24,236,127,63,86,236,127,63,147,236,127,63,207,236,127,63,11,237,127,63,71,237,127,63,130,237,127,63,188,237,127,63,246,237,127,63,47,238,127,63,104,238,127,63,160,238,127,63,216,238,127,63,15,239,127,63,69,239,127,63,123,239,127,63,177,239,127,63,230,239,127,63,27,240,127,63,79,240,127,63,130,240,127,63,182,240,127,63,232,240,127,63,26,241,127,63,76,241,127,63,125,241,127,63,174,241,127,63,222,241,127,63,14,242,127,63,61,242,127,63,108,242,127,63,154,242,127,63,200,242,127,63,245,242,127,63,34,243,127,63,79,243,127,63,123,243,127,63,166,243,127,63,209,243,127,63,252,243,127,63,38,244,127,63,80,244,127,63,121,244,127,63,162,244,127,63,203,244,127,63,243,244,127,63,27,245,127,63,66,245,127,63,105,245,127,63,143,245,127,63,181,245,127,63,219,245,127,63,0,246,127,63,37,246,127,63,73,246,127,63,109,246,127,63,145,246,127,63,180,246,127,63,215,246,127,63,250,246,127,63,28,247,127,63,62,247,127,63,95,247,127,63,128,247,127,63,160,247,127,63,193,247,127,63,225,247,127,63,0,248,127,63,31,248,127,63,62,248,127,63,93,248,127,63,123,248,127,63,152,248,127,63,182,248,127,63,211,248,127,63,240,248,127,63,12,249,127,63,40,249,127,63,68,249,127,63,95,249,127,63,122,249,127,63,149,249,127,63,175,249,127,63,202,249,127,63,227,249,127,63,253,249,127,63,22,250,127,63,47,250,127,63,71,250,127,63,96,250,127,63,120,250,127,63,143,250,127,63,166,250,127,63,190,250,127,63,212,250,127,63,235,250,127,63,1,251,127,63,23,251,127,63,44,251,127,63,66,251,127,63,87,251,127,63,108,251,127,63,128,251,127,63,148,251,127,63,168,251,127,63,188,251,127,63,208,251,127,63,227,251,127,63,246,251,127,63,8,252,127,63,27,252,127,63,45,252,127,63,63,252,127,63,81,252,127,63,98,252,127,63,115,252,127,63,132,252,127,63,149,252,127,63,165,252,127,63,182,252,127,63,198,252,127,63,213,252,127,63,229,252,127,63,244,252,127,63,3,253,127,63,18,253,127,63,33,253,127,63,47,253,127,63,62,253,127,63,76,253,127,63,89,253,127,63,103,253,127,63,116,253,127,63,130,253,127,63,143,253,127,63,155,253,127,63,168,253,127,63,181,253,127,63,193,253,127,63,205,253,127,63,217,253,127,63,228,253,127,63,240,253,127,63,251,253,127,63,6,254,127,63,17,254,127,63,28,254,127,63,38,254,127,63,49,254,127,63,59,254,127,63,69,254,127,63,79,254,127,63,89,254,127,63,98,254,127,63,108,254,127,63,117,254,127,63,126,254,127,63,135,254,127,63,144,254,127,63,152,254,127,63,161,254,127,63,169,254,127,63,177,254,127,63,185,254,127,63,193,254,127,63,201,254,127,63,208,254,127,63,216,254,127,63,223,254,127,63,230,254,127,63,237,254,127,63,244,254,127,63,251,254,127,63,2,255,127,63,8,255,127,63,14,255,127,63,21,255,127,63,27,255,127,63,33,255,127,63,39,255,127,63,45,255,127,63,50,255,127,63,56,255,127,63,61,255,127,63,67,255,127,63,72,255,127,63,77,255,127,63,82,255,127,63,87,255,127,63,92,255,127,63,96,255,127,63,101,255,127,63,105,255,127,63,110,255,127,63,114,255,127,63,118,255,127,63,122,255,127,63,126,255,127,63,130,255,127,63,134,255,127,63,138,255,127,63,142,255,127,63,145,255,127,63,149,255,127,63,152,255,127,63,155,255,127,63,159,255,127,63,162,255,127,63,165,255,127,63,168,255,127,63,171,255,127,63,174,255,127,63,176,255,127,63,179,255,127,63,182,255,127,63,184,255,127,63,187,255,127,63,189,255,127,63,192,255,127,63,194,255,127,63,196,255,127,63,198,255,127,63,201,255,127,63,203,255,127,63,205,255,127,63,207,255,127,63,209,255,127,63,210,255,127,63,212,255,127,63,214,255,127,63,216,255,127,63,217,255,127,63,219,255,127,63,220,255,127,63,222,255,127,63,223,255,127,63,225,255,127,63,226,255,127,63,227,255,127,63,229,255,127,63,230,255,127,63,231,255,127,63,232,255,127,63,233,255,127,63,234,255,127,63,235,255,127,63,236,255,127,63,237,255,127,63,238,255,127,63,239,255,127,63,240,255,127,63,241,255,127,63,241,255,127,63,242,255,127,63,243,255,127,63,244,255,127,63,244,255,127,63,245,255,127,63,246,255,127,63,246,255,127,63,247,255,127,63,247,255,127,63,248,255,127,63,248,255,127,63,249,255,127,63,249,255,127,63,250,255,127,63,250,255,127,63,250,255,127,63,251,255,127,63,251,255,127,63,251,255,127,63,252,255,127,63,252,255,127,63,252,255,127,63,253,255,127,63,253,255,127,63,253,255,127,63,253,255,127,63,254,255,127,63,254,255,127,63,254,255,127,63,254,255,127,63,254,255,127,63,254,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,255,255,127,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,180,1,0,0,4,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,0,0,76,194,0,0,80,194,0,0,84,194,0,0,88,194,0,0,92,194,0,0,96,194,0,0,100,194,0,0,104,194,0,0,108,194,0,0,112,194,0,0,116,194,0,0,120,194,0,0,124,194,0,0,128,194,0,0,130,194,0,0,132,194,0,0,134,194,0,0,136,194,0,0,138,194,0,0,140,194,0,0,142,194,0,0,144,194,0,0,146,194,0,0,148,194,0,0,150,194,0,0,152,194,0,0,154,194,0,0,156,194,0,0,160,194,0,0,162,194,0,0,164,194,0,0,166,194,0,0,168,194,0,0,170,194,0,0,172,194,0,0,174,194,0,0,176,194,0,0,176,194,0,0,178,194,0,0,178,194,0,0,180,194,0,0,182,194,0,0,182,194,0,0,184,194,0,0,186,194,0,0,188,194,0,0,190,194,0,0,192,194,0,0,192,194,0,0,194,194,0,0,196,194,0,0,196,194,0,0,198,194,0,0,198,194,0,0,200,194,0,0,200,194,0,0,202,194,0,0,204,194,0,0,206,194,0,0,208,194,0,0,212,194,0,0,214,194,0,0,214,194,0,0,214,194,0,0,214,194,0,0,210,194,0,0,206,194,0,0,204,194,0,0,202,194,0,0,198,194,0,0,196,194,0,0,192,194,0,0,190,194,0,0,190,194,0,0,192,194,0,0,194,194,0,0,192,194,0,0,190,194,0,0,186,194,0,0,180,194,0,0,160,194,0,0,140,194,0,0,72,194,0,0,32,194,0,0,240,193,0,0,240,193,0,0,240,193,0,0,240,193,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,112,194,0,0,120,194,0,0,120,194,0,0,130,194,0,0,146,194,0,0,138,194,0,0,136,194,0,0,136,194,0,0,134,194,0,0,140,194,0,0,140,194,0,0,144,194,0,0,148,194,0,0,150,194,0,0,158,194,0,0,158,194,0,0,160,194,0,0,166,194,0,0,176,194,0,0,186,194,0,0,200,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,84,194,0,0,116,194,0,0,132,194,0,0,132,194,0,0,136,194,0,0,134,194,0,0,140,194,0,0,152,194,0,0,152,194,0,0,144,194,0,0,146,194,0,0,150,194,0,0,152,194,0,0,156,194,0,0,158,194,0,0,166,194,0,0,176,194,0,0,186,194,0,0,200,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,20,194,0,0,20,194,0,0,20,194,0,0,20,194,0,0,20,194,0,0,20,194,0,0,20,194,0,0,20,194,0,0,24,194,0,0,32,194,0,0,40,194,0,0,56,194,0,0,64,194,0,0,84,194,0,0,92,194,0,0,120,194,0,0,130,194,0,0,104,194,0,0,96,194,0,0,96,194,0,0,116,194,0,0,112,194,0,0,130,194,0,0,134,194,0,0,138,194,0,0,142,194,0,0,154,194,0,0,154,194,0,0,156,194,0,0,160,194,0,0,164,194,0,0,168,194,0,0,176,194,0,0,186,194,0,0,196,194,0,0,212,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,200,193,0,0,200,193,0,0,200,193,0,0,200,193,0,0,200,193,0,0,200,193,0,0,200,193,0,0,200,193,0,0,200,193,0,0,208,193,0,0,216,193,0,0,232,193,0,0,0,194,0,0,24,194,0,0,64,194,0,0,80,194,0,0,80,194,0,0,72,194,0,0,64,194,0,0,64,194,0,0,76,194,0,0,80,194,0,0,88,194,0,0,112,194,0,0,134,194,0,0,134,194,0,0,132,194,0,0,136,194,0,0,138,194,0,0,146,194,0,0,146,194,0,0,152,194,0,0,160,194,0,0,162,194,0,0,162,194,0,0,170,194,0,0,170,194,0,0,172,194,0,0,176,194,0,0,186,194,0,0,200,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,128,193,0,0,128,193,0,0,128,193,0,0,128,193,0,0,128,193,0,0,128,193,0,0,128,193,0,0,128,193,0,0,136,193,0,0,152,193,0,0,160,193,0,0,176,193,0,0,208,193,0,0,224,193,0,0,248,193,0,0,32,194,0,0,60,194,0,0,28,194,0,0,28,194,0,0,32,194,0,0,40,194,0,0,44,194,0,0,60,194,0,0,76,194,0,0,100,194,0,0,80,194,0,0,92,194,0,0,92,194,0,0,112,194,0,0,104,194,0,0,120,194,0,0,124,194,0,0,140,194,0,0,134,194,0,0,138,194,0,0,144,194,0,0,146,194,0,0,154,194,0,0,160,194,0,0,164,194,0,0,166,194,0,0,174,194,0,0,180,194,0,0,188,194,0,0,196,194,0,0,208,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,0,193,0,0,0,193,0,0,0,193,0,0,0,193,0,0,0,193,0,0,0,193,0,0,0,193,0,0,0,193,0,0,0,193,0,0,0,193,0,0,32,193,0,0,48,193,0,0,112,193,0,0,152,193,0,0,200,193,0,0,240,193,0,0,8,194,0,0,248,193,0,0,240,193,0,0,248,193,0,0,232,193,0,0,0,194,0,0,12,194,0,0,40,194,0,0,64,194,0,0,40,194,0,0,48,194,0,0,56,194,0,0,72,194,0,0,72,194,0,0,76,194,0,0,80,194,0,0,108,194,0,0,88,194,0,0,92,194,0,0,92,194,0,0,104,194,0,0,120,194,0,0,124,194,0,0,132,194,0,0,144,194,0,0,146,194,0,0,152,194,0,0,150,194,0,0,156,194,0,0,160,194,0,0,160,194,0,0,162,194,0,0,168,194,0,0,176,194,0,0,180,194,0,0,188,194,0,0,196,194,0,0,202,194,0,0,212,194,0,0,220,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,134,194,0,0,134,194,0,0,134,194,0,0,152,194,0,0,144,194,0,0,142,194,0,0,148,194,0,0,152,194,0,0,152,194,0,0,150,194,0,0,156,194,0,0,158,194,0,0,158,194,0,0,162,194,0,0,166,194,0,0,172,194,0,0,178,194,0,0,186,194,0,0,194,194,0,0,200,194,0,0,210,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,64,194,0,0,76,194,0,0,92,194,0,0,108,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,134,194,0,0,132,194,0,0,136,194,0,0,138,194,0,0,140,194,0,0,148,194,0,0,158,194,0,0,154,194,0,0,154,194,0,0,156,194,0,0,160,194,0,0,162,194,0,0,164,194,0,0,168,194,0,0,172,194,0,0,176,194,0,0,182,194,0,0,190,194,0,0,200,194,0,0,216,194,0,0,232,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,20,194,0,0,20,194,0,0,36,194,0,0,48,194,0,0,64,194,0,0,76,194,0,0,104,194,0,0,120,194,0,0,112,194,0,0,100,194,0,0,108,194,0,0,108,194,0,0,112,194,0,0,124,194,0,0,130,194,0,0,144,194,0,0,142,194,0,0,140,194,0,0,144,194,0,0,148,194,0,0,154,194,0,0,152,194,0,0,156,194,0,0,162,194,0,0,162,194,0,0,160,194,0,0,166,194,0,0,172,194,0,0,182,194,0,0,192,194,0,0,200,194,0,0,210,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,224,193,0,0,224,193,0,0,224,193,0,0,224,193,0,0,224,193,0,0,224,193,0,0,224,193,0,0,224,193,0,0,224,193,0,0,240,193,0,0,0,194,0,0,0,194,0,0,4,194,0,0,12,194,0,0,36,194,0,0,68,194,0,0,72,194,0,0,68,194,0,0,60,194,0,0,64,194,0,0,64,194,0,0,80,194,0,0,76,194,0,0,100,194,0,0,130,194,0,0,116,194,0,0,108,194,0,0,116,194,0,0,128,194,0,0,138,194,0,0,140,194,0,0,148,194,0,0,154,194,0,0,154,194,0,0,156,194,0,0,162,194,0,0,168,194,0,0,170,194,0,0,174,194,0,0,180,194,0,0,184,194,0,0,192,194,0,0,200,194,0,0,214,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,152,193,0,0,152,193,0,0,152,193,0,0,152,193,0,0,152,193,0,0,152,193,0,0,152,193,0,0,152,193,0,0,160,193,0,0,168,193,0,0,184,193,0,0,216,193,0,0,240,193,0,0,12,194,0,0,16,194,0,0,36,194,0,0,56,194,0,0,48,194,0,0,40,194,0,0,32,194,0,0,36,194,0,0,36,194,0,0,44,194,0,0,64,194,0,0,92,194,0,0,84,194,0,0,80,194,0,0,84,194,0,0,96,194,0,0,108,194,0,0,104,194,0,0,112,194,0,0,134,194,0,0,132,194,0,0,138,194,0,0,142,194,0,0,144,194,0,0,150,194,0,0,158,194,0,0,162,194,0,0,168,194,0,0,174,194,0,0,180,194,0,0,186,194,0,0,194,194,0,0,202,194,0,0,214,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,16,193,0,0,16,193,0,0,16,193,0,0,16,193,0,0,16,193,0,0,16,193,0,0,16,193,0,0,16,193,0,0,48,193,0,0,64,193,0,0,64,193,0,0,112,193,0,0,128,193,0,0,160,193,0,0,184,193,0,0,240,193,0,0,20,194,0,0,8,194,0,0,4,194,0,0,8,194,0,0,248,193,0,0,0,194,0,0,0,194,0,0,24,194,0,0,60,194,0,0,48,194,0,0,36,194,0,0,32,194,0,0,60,194,0,0,68,194,0,0,56,194,0,0,56,194,0,0,104,194,0,0,72,194,0,0,72,194,0,0,88,194,0,0,104,194,0,0,120,194,0,0,128,194,0,0,134,194,0,0,134,194,0,0,140,194,0,0,144,194,0,0,152,194,0,0,158,194,0,0,166,194,0,0,174,194,0,0,182,194,0,0,192,194,0,0,200,194,0,0,208,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,120,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,124,194,0,0,128,194,0,0,132,194,0,0,134,194,0,0,132,194,0,0,136,194,0,0,150,194,0,0,144,194,0,0,152,194,0,0,150,194,0,0,152,194,0,0,156,194,0,0,158,194,0,0,164,194,0,0,168,194,0,0,170,194,0,0,180,194,0,0,188,194,0,0,202,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,108,194,0,0,112,194,0,0,112,194,0,0,116,194,0,0,124,194,0,0,132,194,0,0,142,194,0,0,136,194,0,0,140,194,0,0,140,194,0,0,142,194,0,0,144,194,0,0,144,194,0,0,150,194,0,0,162,194,0,0,156,194,0,0,158,194,0,0,164,194,0,0,166,194,0,0,172,194,0,0,180,194,0,0,194,194,0,0,206,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,84,194,0,0,84,194,0,0,84,194,0,0,84,194,0,0,84,194,0,0,84,194,0,0,84,194,0,0,84,194,0,0,84,194,0,0,88,194,0,0,92,194,0,0,100,194,0,0,96,194,0,0,100,194,0,0,92,194,0,0,116,194,0,0,130,194,0,0,112,194,0,0,112,194,0,0,120,194,0,0,124,194,0,0,124,194,0,0,132,194,0,0,136,194,0,0,148,194,0,0,146,194,0,0,150,194,0,0,150,194,0,0,156,194,0,0,160,194,0,0,160,194,0,0,164,194,0,0,170,194,0,0,180,194,0,0,192,194,0,0,202,194,0,0,216,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,56,194,0,0,56,194,0,0,56,194,0,0,56,194,0,0,56,194,0,0,56,194,0,0,56,194,0,0,56,194,0,0,56,194,0,0,56,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,60,194,0,0,64,194,0,0,76,194,0,0,100,194,0,0,76,194,0,0,68,194,0,0,72,194,0,0,76,194,0,0,84,194,0,0,88,194,0,0,108,194,0,0,132,194,0,0,112,194,0,0,120,194,0,0,134,194,0,0,134,194,0,0,140,194,0,0,144,194,0,0,150,194,0,0,152,194,0,0,156,194,0,0,162,194,0,0,170,194,0,0,176,194,0,0,188,194,0,0,194,194,0,0,208,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,16,194,0,0,28,194,0,0,36,194,0,0,40,194,0,0,40,194,0,0,28,194,0,0,24,194,0,0,36,194,0,0,44,194,0,0,80,194,0,0,48,194,0,0,32,194,0,0,28,194,0,0,20,194,0,0,20,194,0,0,32,194,0,0,60,194,0,0,88,194,0,0,72,194,0,0,64,194,0,0,72,194,0,0,92,194,0,0,116,194,0,0,108,194,0,0,120,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,138,194,0,0,138,194,0,0,146,194,0,0,148,194,0,0,148,194,0,0,150,194,0,0,154,194,0,0,158,194,0,0,164,194,0,0,174,194,0,0,182,194,0,0,190,194,0,0,200,194,0,0,216,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,224,193,0,0,208,193,0,0,192,193,0,0,176,193,0,0,160,193,0,0,160,193,0,0,184,193,0,0,232,193,0,0,240,193,0,0,248,193,0,0,224,193,0,0,216,193,0,0,224,193,0,0,224,193,0,0,224,193,0,0,12,194,0,0,32,194,0,0,4,194,0,0,0,194,0,0,232,193,0,0,240,193,0,0,240,193,0,0,240,193,0,0,20,194,0,0,52,194,0,0,36,194,0,0,20,194,0,0,24,194,0,0,52,194,0,0,60,194,0,0,60,194,0,0,64,194,0,0,84,194,0,0,68,194,0,0,64,194,0,0,72,194,0,0,68,194,0,0,68,194,0,0,76,194,0,0,80,194,0,0,104,194,0,0,96,194,0,0,100,194,0,0,96,194,0,0,112,194,0,0,116,194,0,0,120,194,0,0,140,194,0,0,144,194,0,0,148,194,0,0,156,194,0,0,166,194,0,0,176,194,0,0,186,194,0,0,200,194,0,0,212,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,210,194,0,0,200,194,0,0,190,194,0,0,182,194,0,0,174,194,0,0,166,194,0,0,160,194,0,0,156,194,0,0,152,194,0,0,156,194,0,0,156,194,0,0,162,194,0,0,166,194,0,0,170,194,0,0,172,194,0,0,170,194,0,0,172,194,0,0,174,194,0,0,180,194,0,0,194,194,0,0,214,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,210,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,170,194,0,0,162,194,0,0,154,194,0,0,146,194,0,0,140,194,0,0,134,194,0,0,134,194,0,0,136,194,0,0,150,194,0,0,146,194,0,0,140,194,0,0,138,194,0,0,140,194,0,0,144,194,0,0,150,194,0,0,158,194,0,0,168,194,0,0,166,194,0,0,168,194,0,0,172,194,0,0,176,194,0,0,178,194,0,0,178,194,0,0,186,194,0,0,196,194,0,0,210,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,170,194,0,0,160,194,0,0,152,194,0,0,142,194,0,0,136,194,0,0,136,194,0,0,130,194,0,0,124,194,0,0,124,194,0,0,120,194,0,0,120,194,0,0,128,194,0,0,130,194,0,0,128,194,0,0,116,194,0,0,120,194,0,0,124,194,0,0,128,194,0,0,132,194,0,0,136,194,0,0,146,194,0,0,146,194,0,0,148,194,0,0,150,194,0,0,152,194,0,0,162,194,0,0,166,194,0,0,170,194,0,0,176,194,0,0,178,194,0,0,184,194,0,0,190,194,0,0,200,194,0,0,216,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,160,194,0,0,150,194,0,0,142,194,0,0,136,194,0,0,130,194,0,0,124,194,0,0,120,194,0,0,116,194,0,0,116,194,0,0,116,194,0,0,116,194,0,0,108,194,0,0,96,194,0,0,100,194,0,0,84,194,0,0,72,194,0,0,104,194,0,0,80,194,0,0,72,194,0,0,72,194,0,0,80,194,0,0,84,194,0,0,88,194,0,0,104,194,0,0,134,194,0,0,124,194,0,0,134,194,0,0,136,194,0,0,144,194,0,0,150,194,0,0,156,194,0,0,160,194,0,0,162,194,0,0,162,194,0,0,164,194,0,0,170,194,0,0,178,194,0,0,180,194,0,0,186,194,0,0,194,194,0,0,202,194,0,0,214,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,130,194,0,0,116,194,0,0,108,194,0,0,100,194,0,0,96,194,0,0,92,194,0,0,92,194,0,0,96,194,0,0,96,194,0,0,100,194,0,0,92,194,0,0,84,194,0,0,80,194,0,0,60,194,0,0,48,194,0,0,48,194,0,0,72,194,0,0,48,194,0,0,36,194,0,0,28,194,0,0,28,194,0,0,40,194,0,0,32,194,0,0,56,194,0,0,76,194,0,0,68,194,0,0,72,194,0,0,84,194,0,0,88,194,0,0,124,194,0,0,112,194,0,0,116,194,0,0,120,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,140,194,0,0,146,194,0,0,148,194,0,0,150,194,0,0,152,194,0,0,150,194,0,0,158,194,0,0,170,194,0,0,178,194,0,0,182,194,0,0,192,194,0,0,204,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,80,194,0,0,72,194,0,0,68,194,0,0,68,194,0,0,64,194,0,0,64,194,0,0,64,194,0,0,68,194,0,0,72,194,0,0,72,194,0,0,68,194,0,0,56,194,0,0,44,194,0,0,28,194,0,0,12,194,0,0,4,194,0,0,24,194,0,0,16,194,0,0,0,194,0,0,232,193,0,0,0,194,0,0,0,194,0,0,0,194,0,0,12,194,0,0,48,194,0,0,28,194,0,0,24,194,0,0,24,194,0,0,56,194,0,0,72,194,0,0,52,194,0,0,56,194,0,0,84,194,0,0,72,194,0,0,72,194,0,0,72,194,0,0,88,194,0,0,88,194,0,0,84,194,0,0,84,194,0,0,96,194,0,0,100,194,0,0,108,194,0,0,132,194,0,0,140,194,0,0,144,194,0,0,148,194,0,0,158,194,0,0,166,194,0,0,170,194,0,0,180,194,0,0,194,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,210,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,172,194,0,0,160,194,0,0,150,194,0,0,150,194,0,0,158,194,0,0,160,194,0,0,158,194,0,0,160,194,0,0,162,194,0,0,164,194,0,0,176,194,0,0,190,194,0,0,206,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,206,194,0,0,196,194,0,0,186,194,0,0,176,194,0,0,166,194,0,0,158,194,0,0,156,194,0,0,150,194,0,0,142,194,0,0,134,194,0,0,136,194,0,0,146,194,0,0,146,194,0,0,144,194,0,0,146,194,0,0,150,194,0,0,154,194,0,0,160,194,0,0,164,194,0,0,176,194,0,0,186,194,0,0,200,194,0,0,214,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,210,194,0,0,202,194,0,0,192,194,0,0,180,194,0,0,172,194,0,0,162,194,0,0,154,194,0,0,146,194,0,0,138,194,0,0,132,194,0,0,116,194,0,0,120,194,0,0,132,194,0,0,128,194,0,0,120,194,0,0,130,194,0,0,132,194,0,0,140,194,0,0,144,194,0,0,152,194,0,0,162,194,0,0,160,194,0,0,168,194,0,0,180,194,0,0,190,194,0,0,204,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,206,194,0,0,194,194,0,0,184,194,0,0,176,194,0,0,166,194,0,0,158,194,0,0,148,194,0,0,140,194,0,0,132,194,0,0,108,194,0,0,84,194,0,0,104,194,0,0,120,194,0,0,92,194,0,0,88,194,0,0,88,194,0,0,88,194,0,0,104,194,0,0,116,194,0,0,120,194,0,0,144,194,0,0,140,194,0,0,144,194,0,0,150,194,0,0,156,194,0,0,160,194,0,0,162,194,0,0,160,194,0,0,166,194,0,0,166,194,0,0,176,194,0,0,186,194,0,0,200,194,0,0,214,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,170,194,0,0,160,194,0,0,150,194,0,0,140,194,0,0,132,194,0,0,120,194,0,0,96,194,0,0,64,194,0,0,48,194,0,0,64,194,0,0,56,194,0,0,56,194,0,0,44,194,0,0,56,194,0,0,64,194,0,0,64,194,0,0,76,194,0,0,104,194,0,0,104,194,0,0,108,194,0,0,112,194,0,0,120,194,0,0,120,194,0,0,116,194,0,0,116,194,0,0,130,194,0,0,128,194,0,0,130,194,0,0,136,194,0,0,140,194,0,0,148,194],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+30720);allocate([0,0,150,194,0,0,156,194,0,0,162,194,0,0,172,194,0,0,190,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,170,194,0,0,160,194,0,0,150,194,0,0,140,194,0,0,130,194,0,0,116,194,0,0,92,194,0,0,68,194,0,0,28,194,0,0,4,194,0,0,32,194,0,0,12,194,0,0,0,194,0,0,24,194,0,0,32,194,0,0,4,194,0,0,12,194,0,0,20,194,0,0,56,194,0,0,36,194,0,0,52,194,0,0,48,194,0,0,56,194,0,0,40,194,0,0,52,194,0,0,56,194,0,0,80,194,0,0,72,194,0,0,72,194,0,0,72,194,0,0,88,194,0,0,88,194,0,0,92,194,0,0,100,194,0,0,120,194,0,0,128,194,0,0,132,194,0,0,136,194,0,0,140,194,0,0,152,194,0,0,162,194,0,0,180,194,0,0,200,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,196,194,0,0,180,194,0,0,170,194,0,0,164,194,0,0,166,194,0,0,160,194,0,0,156,194,0,0,168,194,0,0,158,194,0,0,160,194,0,0,166,194,0,0,174,194,0,0,178,194,0,0,182,194,0,0,186,194,0,0,198,194,0,0,212,194,0,0,234,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,196,194,0,0,180,194,0,0,170,194,0,0,160,194,0,0,150,194,0,0,140,194,0,0,136,194,0,0,148,194,0,0,144,194,0,0,148,194,0,0,154,194,0,0,160,194,0,0,164,194,0,0,170,194,0,0,174,194,0,0,184,194,0,0,178,194,0,0,182,194,0,0,190,194,0,0,200,194,0,0,212,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,196,194,0,0,180,194,0,0,166,194,0,0,150,194,0,0,142,194,0,0,124,194,0,0,128,194,0,0,134,194,0,0,120,194,0,0,128,194,0,0,134,194,0,0,140,194,0,0,146,194,0,0,154,194,0,0,162,194,0,0,168,194,0,0,166,194,0,0,170,194,0,0,178,194,0,0,180,194,0,0,186,194,0,0,196,194,0,0,208,194,0,0,218,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,206,194,0,0,192,194,0,0,176,194,0,0,162,194,0,0,150,194,0,0,136,194,0,0,104,194,0,0,88,194,0,0,96,194,0,0,88,194,0,0,96,194,0,0,96,194,0,0,104,194,0,0,112,194,0,0,124,194,0,0,132,194,0,0,148,194,0,0,138,194,0,0,144,194,0,0,144,194,0,0,150,194,0,0,148,194,0,0,154,194,0,0,162,194,0,0,162,194,0,0,164,194,0,0,168,194,0,0,174,194,0,0,186,194,0,0,192,194,0,0,198,194,0,0,208,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,204,194,0,0,192,194,0,0,182,194,0,0,170,194,0,0,160,194,0,0,148,194,0,0,136,194,0,0,112,194,0,0,76,194,0,0,56,194,0,0,64,194,0,0,56,194,0,0,44,194,0,0,52,194,0,0,60,194,0,0,60,194,0,0,68,194,0,0,64,194,0,0,96,194,0,0,84,194,0,0,92,194,0,0,104,194,0,0,100,194,0,0,124,194,0,0,104,194,0,0,112,194,0,0,132,194,0,0,128,194,0,0,134,194,0,0,140,194,0,0,140,194,0,0,148,194,0,0,154,194,0,0,168,194,0,0,172,194,0,0,178,194,0,0,182,194,0,0,186,194,0,0,188,194,0,0,202,194,0,0,218,194,0,0,236,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,206,194,0,0,196,194,0,0,186,194,0,0,176,194,0,0,166,194,0,0,156,194,0,0,146,194,0,0,136,194,0,0,112,194,0,0,84,194,0,0,48,194,0,0,12,194,0,0,24,194,0,0,24,194,0,0,8,194,0,0,8,194,0,0,16,194,0,0,32,194,0,0,36,194,0,0,48,194,0,0,76,194,0,0,52,194,0,0,56,194,0,0,60,194,0,0,56,194,0,0,88,194,0,0,72,194,0,0,68,194,0,0,72,194,0,0,72,194,0,0,72,194,0,0,76,194,0,0,88,194,0,0,100,194,0,0,104,194,0,0,112,194,0,0,132,194,0,0,132,194,0,0,132,194,0,0,128,194,0,0,130,194,0,0,136,194,0,0,154,194,0,0,164,194,0,0,174,194,0,0,190,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,204,194,0,0,194,194,0,0,184,194,0,0,174,194,0,0,166,194,0,0,156,194,0,0,150,194,0,0,164,194,0,0,158,194,0,0,166,194,0,0,170,194,0,0,178,194,0,0,184,194,0,0,190,194,0,0,196,194,0,0,202,194,0,0,210,194,0,0,218,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,212,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,172,194,0,0,162,194,0,0,156,194,0,0,148,194,0,0,138,194,0,0,148,194,0,0,148,194,0,0,152,194,0,0,158,194,0,0,166,194,0,0,168,194,0,0,172,194,0,0,178,194,0,0,184,194,0,0,194,194,0,0,186,194,0,0,200,194,0,0,206,194,0,0,214,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,212,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,174,194,0,0,166,194,0,0,160,194,0,0,150,194,0,0,138,194,0,0,112,194,0,0,132,194,0,0,132,194,0,0,136,194,0,0,140,194,0,0,148,194,0,0,156,194,0,0,158,194,0,0,162,194,0,0,162,194,0,0,166,194,0,0,168,194,0,0,174,194,0,0,186,194,0,0,192,194,0,0,198,194,0,0,206,194,0,0,214,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,206,194,0,0,196,194,0,0,186,194,0,0,178,194,0,0,170,194,0,0,164,194,0,0,156,194,0,0,142,194,0,0,120,194,0,0,92,194,0,0,104,194,0,0,104,194,0,0,88,194,0,0,88,194,0,0,92,194,0,0,108,194,0,0,116,194,0,0,120,194,0,0,140,194,0,0,132,194,0,0,132,194,0,0,134,194,0,0,140,194,0,0,144,194,0,0,150,194,0,0,156,194,0,0,168,194,0,0,168,194,0,0,168,194,0,0,176,194,0,0,182,194,0,0,180,194,0,0,190,194,0,0,196,194,0,0,204,194,0,0,206,194,0,0,212,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,206,194,0,0,196,194,0,0,188,194,0,0,180,194,0,0,174,194,0,0,164,194,0,0,158,194,0,0,146,194,0,0,134,194,0,0,104,194,0,0,60,194,0,0,72,194,0,0,52,194,0,0,36,194,0,0,52,194,0,0,64,194,0,0,48,194,0,0,48,194,0,0,68,194,0,0,88,194,0,0,76,194,0,0,64,194,0,0,60,194,0,0,68,194,0,0,72,194,0,0,76,194,0,0,100,194,0,0,104,194,0,0,112,194,0,0,124,194,0,0,138,194,0,0,140,194,0,0,138,194,0,0,142,194,0,0,148,194,0,0,156,194,0,0,164,194,0,0,180,194,0,0,190,194,0,0,202,194,0,0,210,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,202,194,0,0,194,194,0,0,186,194,0,0,180,194,0,0,170,194,0,0,160,194,0,0,154,194,0,0,144,194,0,0,130,194,0,0,96,194,0,0,64,194,0,0,20,194,0,0,32,194,0,0,16,194,0,0,8,194,0,0,32,194,0,0,72,194,0,0,60,194,0,0,24,194,0,0,36,194,0,0,60,194,0,0,24,194,0,0,12,194,0,0,28,194,0,0,24,194,0,0,44,194,0,0,32,194,0,0,52,194,0,0,72,194,0,0,52,194,0,0,48,194,0,0,60,194,0,0,72,194,0,0,92,194,0,0,64,194,0,0,64,194,0,0,80,194,0,0,132,194,0,0,140,194,0,0,152,194,0,0,164,194,0,0,180,194,0,0,194,194,0,0,210,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,206,194,0,0,196,194,0,0,186,194,0,0,172,194,0,0,158,194,0,0,152,194,0,0,166,194,0,0,162,194,0,0,170,194,0,0,174,194,0,0,178,194,0,0,186,194,0,0,196,194,0,0,204,194,0,0,214,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,206,194,0,0,196,194,0,0,186,194,0,0,172,194,0,0,158,194,0,0,142,194,0,0,154,194,0,0,148,194,0,0,154,194,0,0,158,194,0,0,162,194,0,0,168,194,0,0,170,194,0,0,180,194,0,0,184,194,0,0,186,194,0,0,184,194,0,0,196,194,0,0,202,194,0,0,216,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,206,194,0,0,196,194,0,0,186,194,0,0,174,194,0,0,156,194,0,0,136,194,0,0,130,194,0,0,132,194,0,0,120,194,0,0,130,194,0,0,134,194,0,0,140,194,0,0,146,194,0,0,150,194,0,0,156,194,0,0,164,194,0,0,164,194,0,0,166,194,0,0,168,194,0,0,182,194,0,0,186,194,0,0,196,194,0,0,204,194,0,0,212,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,164,194,0,0,148,194,0,0,120,194,0,0,100,194,0,0,104,194,0,0,96,194,0,0,76,194,0,0,80,194,0,0,80,194,0,0,88,194,0,0,88,194,0,0,104,194,0,0,132,194,0,0,108,194,0,0,112,194,0,0,124,194,0,0,132,194,0,0,138,194,0,0,146,194,0,0,158,194,0,0,166,194,0,0,168,194,0,0,160,194,0,0,162,194,0,0,162,194,0,0,164,194,0,0,176,194,0,0,184,194,0,0,196,194,0,0,210,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,204,194,0,0,194,194,0,0,184,194,0,0,168,194,0,0,158,194,0,0,138,194,0,0,100,194,0,0,60,194,0,0,80,194,0,0,60,194,0,0,48,194,0,0,52,194,0,0,72,194,0,0,80,194,0,0,40,194,0,0,40,194,0,0,84,194,0,0,44,194,0,0,44,194,0,0,64,194,0,0,76,194,0,0,96,194,0,0,92,194,0,0,80,194,0,0,100,194,0,0,108,194,0,0,116,194,0,0,120,194,0,0,134,194,0,0,142,194,0,0,156,194,0,0,166,194,0,0,172,194,0,0,188,194,0,0,196,194,0,0,206,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,200,194,0,0,190,194,0,0,180,194,0,0,168,194,0,0,156,194,0,0,140,194,0,0,116,194,0,0,76,194,0,0,36,194,0,0,32,194,0,0,24,194,0,0,32,194,0,0,56,194,0,0,80,194,0,0,76,194,0,0,36,194,0,0,32,194,0,0,56,194,0,0,32,194,0,0,24,194,0,0,24,194,0,0,36,194,0,0,56,194,0,0,36,194,0,0,56,194,0,0,60,194,0,0,44,194,0,0,44,194,0,0,52,194,0,0,36,194,0,0,52,194,0,0,96,194,0,0,134,194,0,0,136,194,0,0,166,194,0,0,174,194,0,0,180,194,0,0,190,194,0,0,204,194,0,0,214,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,218,194,0,0,210,194,0,0,202,194,0,0,192,194,0,0,182,194,0,0,168,194,0,0,154,194,0,0,164,194,0,0,164,194,0,0,170,194,0,0,178,194,0,0,188,194,0,0,200,194,0,0,212,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,212,194,0,0,206,194,0,0,196,194,0,0,184,194,0,0,170,194,0,0,160,194,0,0,142,194,0,0,150,194,0,0,144,194,0,0,152,194,0,0,160,194,0,0,168,194,0,0,172,194,0,0,178,194,0,0,186,194,0,0,200,194,0,0,214,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,208,194,0,0,202,194,0,0,194,194,0,0,184,194,0,0,176,194,0,0,168,194,0,0,160,194,0,0,128,194,0,0,132,194,0,0,124,194,0,0,128,194,0,0,132,194,0,0,138,194,0,0,146,194,0,0,154,194,0,0,166,194,0,0,166,194,0,0,172,194,0,0,182,194,0,0,196,194,0,0,208,194,0,0,222,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,208,194,0,0,202,194,0,0,194,194,0,0,184,194,0,0,180,194,0,0,168,194,0,0,148,194,0,0,100,194,0,0,104,194,0,0,80,194,0,0,92,194,0,0,88,194,0,0,72,194,0,0,80,194,0,0,72,194,0,0,80,194,0,0,124,194,0,0,120,194,0,0,138,194,0,0,152,194,0,0,154,194,0,0,156,194,0,0,156,194,0,0,158,194,0,0,164,194,0,0,176,194,0,0,188,194,0,0,200,194,0,0,212,194,0,0,222,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,212,194,0,0,204,194,0,0,196,194,0,0,190,194,0,0,180,194,0,0,170,194,0,0,166,194,0,0,156,194,0,0,140,194,0,0,72,194,0,0,72,194,0,0,36,194,0,0,48,194,0,0,68,194,0,0,60,194,0,0,72,194,0,0,72,194,0,0,48,194,0,0,92,194,0,0,56,194,0,0,60,194,0,0,64,194,0,0,64,194,0,0,88,194,0,0,68,194,0,0,68,194,0,0,104,194,0,0,120,194,0,0,142,194,0,0,162,194,0,0,174,194,0,0,184,194,0,0,194,194,0,0,204,194,0,0,216,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,212,194,0,0,204,194,0,0,196,194,0,0,190,194,0,0,180,194,0,0,170,194,0,0,166,194,0,0,156,194,0,0,140,194,0,0,52,194,0,0,44,194,0,0,36,194,0,0,60,194,0,0,72,194,0,0,76,194,0,0,72,194,0,0,68,194,0,0,52,194,0,0,60,194,0,0,36,194,0,0,48,194,0,0,36,194,0,0,28,194,0,0,44,194,0,0,24,194,0,0,20,194,0,0,32,194,0,0,36,194,0,0,48,194,0,0,72,194,0,0,104,194,0,0,130,194,0,0,146,194,0,0,158,194,0,0,170,194,0,0,184,194,0,0,194,194,0,0,202,194,0,0,210,194,0,0,218,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,200,194,0,0,190,194,0,0,174,194,0,0,162,194,0,0,170,194,0,0,166,194,0,0,176,194,0,0,186,194,0,0,200,194,0,0,214,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,202,194,0,0,190,194,0,0,176,194,0,0,166,194,0,0,152,194,0,0,146,194,0,0,144,194,0,0,158,194,0,0,168,194,0,0,180,194,0,0,190,194,0,0,200,194,0,0,210,194,0,0,220,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,208,194,0,0,196,194,0,0,184,194,0,0,174,194,0,0,162,194,0,0,140,194,0,0,130,194,0,0,120,194,0,0,134,194,0,0,142,194,0,0,148,194,0,0,160,194,0,0,170,194,0,0,182,194,0,0,190,194,0,0,198,194,0,0,206,194,0,0,216,194,0,0,222,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,206,194,0,0,194,194,0,0,180,194,0,0,170,194,0,0,152,194,0,0,112,194,0,0,96,194,0,0,88,194,0,0,112,194,0,0,120,194,0,0,116,194,0,0,96,194,0,0,124,194,0,0,130,194,0,0,146,194,0,0,148,194,0,0,154,194,0,0,150,194,0,0,156,194,0,0,162,194,0,0,172,194,0,0,174,194,0,0,176,194,0,0,182,194,0,0,188,194,0,0,196,194,0,0,206,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,200,194,0,0,194,194,0,0,184,194,0,0,172,194,0,0,162,194,0,0,158,194,0,0,140,194,0,0,100,194,0,0,76,194,0,0,60,194,0,0,76,194,0,0,104,194,0,0,112,194,0,0,96,194,0,0,84,194,0,0,72,194,0,0,104,194,0,0,80,194,0,0,72,194,0,0,72,194,0,0,84,194,0,0,92,194,0,0,128,194,0,0,138,194,0,0,142,194,0,0,170,194,0,0,164,194,0,0,156,194,0,0,162,194,0,0,170,194,0,0,190,194,0,0,204,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,200,194,0,0,194,194,0,0,184,194,0,0,170,194,0,0,166,194,0,0,158,194,0,0,144,194,0,0,68,194,0,0,32,194,0,0,44,194,0,0,44,194,0,0,88,194,0,0,96,194,0,0,76,194,0,0,72,194,0,0,32,194,0,0,44,194,0,0,24,194,0,0,16,194,0,0,12,194,0,0,20,194,0,0,24,194,0,0,20,194,0,0,48,194,0,0,88,194,0,0,112,194,0,0,100,194,0,0,112,194,0,0,140,194,0,0,150,194,0,0,168,194,0,0,184,194,0,0,206,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,204,194,0,0,190,194,0,0,178,194,0,0,164,194,0,0,166,194,0,0,168,194,0,0,180,194,0,0,184,194,0,0,198,194,0,0,214,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,202,194,0,0,190,194,0,0,178,194,0,0,166,194,0,0,144,194,0,0,148,194,0,0,156,194,0,0,170,194,0,0,176,194,0,0,176,194,0,0,180,194,0,0,184,194,0,0,196,194,0,0,210,194,0,0,222,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,218,194,0,0,206,194,0,0,194,194,0,0,186,194,0,0,174,194,0,0,162,194,0,0,140,194,0,0,140,194,0,0,134,194,0,0,150,194,0,0,146,194,0,0,152,194,0,0,158,194,0,0,162,194,0,0,166,194,0,0,176,194,0,0,178,194,0,0,194,194,0,0,206,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,214,194,0,0,200,194,0,0,188,194,0,0,176,194,0,0,166,194,0,0,150,194,0,0,124,194,0,0,108,194,0,0,108,194,0,0,124,194,0,0,132,194,0,0,112,194,0,0,120,194,0,0,134,194,0,0,134,194,0,0,154,194,0,0,152,194,0,0,162,194,0,0,176,194,0,0,172,194,0,0,184,194,0,0,192,194,0,0,204,194,0,0,218,194,0,0,232,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,196,194,0,0,184,194,0,0,172,194,0,0,162,194,0,0,146,194,0,0,96,194,0,0,80,194,0,0,60,194,0,0,92,194,0,0,112,194,0,0,104,194,0,0,80,194,0,0,76,194,0,0,52,194,0,0,68,194,0,0,72,194,0,0,84,194,0,0,88,194,0,0,116,194,0,0,142,194,0,0,140,194,0,0,138,194,0,0,156,194,0,0,158,194,0,0,174,194,0,0,180,194,0,0,192,194,0,0,208,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,206,194,0,0,192,194,0,0,180,194,0,0,172,194,0,0,156,194,0,0,140,194,0,0,76,194,0,0,40,194,0,0,60,194,0,0,64,194,0,0,92,194,0,0,88,194,0,0,88,194,0,0,84,194,0,0,40,194,0,0,12,194,0,0,224,193,0,0,4,194,0,0,24,194,0,0,20,194,0,0,48,194,0,0,60,194,0,0,68,194,0,0,88,194,0,0,124,194,0,0,136,194,0,0,156,194,0,0,164,194,0,0,178,194,0,0,188,194,0,0,198,194,0,0,208,194,0,0,218,194,0,0,228,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,200,194,0,0,180,194,0,0,158,194,0,0,170,194,0,0,162,194,0,0,164,194,0,0,164,194,0,0,178,194,0,0,188,194,0,0,198,194,0,0,206,194,0,0,218,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,194,194,0,0,170,194,0,0,144,194,0,0,148,194,0,0,140,194,0,0,140,194,0,0,140,194,0,0,152,194,0,0,170,194,0,0,182,194,0,0,186,194,0,0,194,194,0,0,206,194,0,0,218,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,224,194,0,0,186,194,0,0,162,194,0,0,136,194,0,0,120,194,0,0,112,194,0,0,112,194,0,0,100,194,0,0,124,194,0,0,140,194,0,0,154,194,0,0,164,194,0,0,180,194,0,0,186,194,0,0,196,194,0,0,208,194,0,0,218,194,0,0,226,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,226,194,0,0,200,194,0,0,186,194,0,0,168,194,0,0,124,194,0,0,104,194,0,0,64,194,0,0,84,194,0,0,88,194,0,0,80,194,0,0,80,194,0,0,100,194,0,0,128,194,0,0,132,194,0,0,152,194,0,0,166,194,0,0,162,194,0,0,170,194,0,0,170,194,0,0,180,194,0,0,190,194,0,0,196,194,0,0,202,194,0,0,206,194,0,0,212,194,0,0,216,194,0,0,222,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,210,194,0,0,190,194,0,0,172,194,0,0,148,194,0,0,84,194,0,0,72,194,0,0,24,194,0,0,44,194,0,0,68,194,0,0,44,194,0,0,40,194,0,0,28,194,0,0,28,194,0,0,56,194,0,0,80,194,0,0,100,194,0,0,96,194,0,0,144,194,0,0,138,194,0,0,148,194,0,0,162,194,0,0,174,194,0,0,184,194,0,0,188,194,0,0,194,194,0,0,198,194,0,0,204,194,0,0,210,194,0,0,216,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,216,194,0,0,198,194,0,0,180,194,0,0,152,194,0,0,132,194,0,0,52,194,0,0,44,194,0,0,36,194,0,0,48,194,0,0,60,194,0,0,44,194,0,0,60,194,0,0,32,194,0,0,240,193,0,0,248,193,0,0,248,193,0,0,28,194,0,0,4,194,0,0,32,194,0,0,36,194,0,0,44,194,0,0,84,194,0,0,108,194,0,0,140,194,0,0,146,194,0,0,154,194,0,0,158,194,0,0,164,194,0,0,168,194,0,0,174,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,182,194,0,0,152,194,0,0,150,194,0,0,170,194,0,0,186,194,0,0,196,194,0,0,208,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,182,194,0,0,140,194,0,0,140,194,0,0,150,194,0,0,172,194,0,0,178,194,0,0,188,194,0,0,196,194,0,0,202,194,0,0,212,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,190,194,0,0,160,194,0,0,112,194,0,0,130,194,0,0,128,194,0,0,148,194,0,0,166,194,0,0,176,194,0,0,182,194],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+40960);allocate([0,0,190,194,0,0,198,194,0,0,206,194,0,0,214,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,190,194,0,0,160,194,0,0,104,194,0,0,92,194,0,0,68,194,0,0,132,194,0,0,136,194,0,0,142,194,0,0,156,194,0,0,156,194,0,0,160,194,0,0,176,194,0,0,170,194,0,0,178,194,0,0,194,194,0,0,200,194,0,0,210,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,190,194,0,0,160,194,0,0,84,194,0,0,80,194,0,0,36,194,0,0,108,194,0,0,108,194,0,0,68,194,0,0,104,194,0,0,96,194,0,0,124,194,0,0,172,194,0,0,158,194,0,0,180,194,0,0,186,194,0,0,196,194,0,0,206,194,0,0,214,194,0,0,224,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,194,194,0,0,182,194,0,0,146,194,0,0,52,194,0,0,32,194,0,0,4,194,0,0,84,194,0,0,116,194,0,0,68,194,0,0,88,194,0,0,72,194,0,0,72,194,0,0,112,194,0,0,80,194,0,0,134,194,0,0,148,194,0,0,162,194,0,0,184,194,0,0,192,194,0,0,200,194,0,0,210,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,226,194,0,0,212,194,0,0,198,194,0,0,184,194,0,0,154,194,0,0,160,194,0,0,176,194,0,0,194,194,0,0,212,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,232,194,0,0,218,194,0,0,204,194,0,0,190,194,0,0,178,194,0,0,148,194,0,0,144,194,0,0,176,194,0,0,174,194,0,0,190,194,0,0,204,194,0,0,218,194,0,0,232,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,232,194,0,0,218,194,0,0,204,194,0,0,190,194,0,0,178,194,0,0,150,194,0,0,132,194,0,0,148,194,0,0,154,194,0,0,156,194,0,0,172,194,0,0,174,194,0,0,180,194,0,0,192,194,0,0,210,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,230,194,0,0,216,194,0,0,202,194,0,0,188,194,0,0,176,194,0,0,132,194,0,0,96,194,0,0,116,194,0,0,140,194,0,0,130,194,0,0,156,194,0,0,144,194,0,0,166,194,0,0,168,194,0,0,186,194,0,0,196,194,0,0,210,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,210,194,0,0,190,194,0,0,178,194,0,0,164,194,0,0,100,194,0,0,80,194,0,0,80,194,0,0,108,194,0,0,96,194,0,0,108,194,0,0,104,194,0,0,138,194,0,0,134,194,0,0,176,194,0,0,164,194,0,0,164,194,0,0,178,194,0,0,188,194,0,0,200,194,0,0,216,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,202,194,0,0,192,194,0,0,180,194,0,0,166,194,0,0,154,194,0,0,88,194,0,0,44,194,0,0,24,194,0,0,72,194,0,0,64,194,0,0,80,194,0,0,64,194,0,0,40,194,0,0,40,194,0,0,76,194,0,0,80,194,0,0,84,194,0,0,108,194,0,0,130,194,0,0,142,194,0,0,156,194,0,0,170,194,0,0,190,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,240,194,0,0,210,194,0,0,172,194,0,0,136,194,0,0,156,194,0,0,158,194,0,0,180,194,0,0,200,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,240,194,0,0,210,194,0,0,172,194,0,0,132,194,0,0,146,194,0,0,154,194,0,0,176,194,0,0,192,194,0,0,210,194,0,0,230,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,240,194,0,0,210,194,0,0,184,194,0,0,160,194,0,0,116,194,0,0,128,194,0,0,136,194,0,0,160,194,0,0,174,194,0,0,184,194,0,0,200,194,0,0,220,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,240,194,0,0,208,194,0,0,182,194,0,0,158,194,0,0,80,194,0,0,112,194,0,0,88,194,0,0,128,194,0,0,138,194,0,0,154,194,0,0,160,194,0,0,164,194,0,0,168,194,0,0,170,194,0,0,174,194,0,0,176,194,0,0,180,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,236,194,0,0,200,194,0,0,174,194,0,0,154,194,0,0,68,194,0,0,72,194,0,0,48,194,0,0,104,194,0,0,116,194,0,0,116,194,0,0,134,194,0,0,130,194,0,0,120,194,0,0,120,194,0,0,120,194,0,0,130,194,0,0,136,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,230,194,0,0,196,194,0,0,168,194,0,0,120,194,0,0,68,194,0,0,48,194,0,0,24,194,0,0,56,194,0,0,68,194,0,0,68,194,0,0,56,194,0,0,28,194,0,0,20,194,0,0,28,194,0,0,32,194,0,0,40,194,0,0,44,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,176,194,0,0,148,194,0,0,154,194,0,0,164,194,0,0,164,194,0,0,170,194,0,0,180,194,0,0,188,194,0,0,198,194,0,0,208,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,176,194,0,0,132,194,0,0,140,194,0,0,162,194,0,0,160,194,0,0,162,194,0,0,168,194,0,0,176,194,0,0,182,194,0,0,186,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,176,194,0,0,116,194,0,0,124,194,0,0,140,194,0,0,142,194,0,0,148,194,0,0,154,194,0,0,160,194,0,0,166,194,0,0,170,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,172,194,0,0,120,194,0,0,124,194,0,0,120,194,0,0,120,194,0,0,104,194,0,0,80,194,0,0,72,194,0,0,72,194,0,0,80,194,0,0,88,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,236,194,0,0,216,194,0,0,168,194,0,0,84,194,0,0,72,194,0,0,72,194,0,0,72,194,0,0,92,194,0,0,60,194,0,0,52,194,0,0,32,194,0,0,32,194,0,0,32,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,236,194,0,0,200,194,0,0,146,194,0,0,44,194,0,0,20,194,0,0,40,194,0,0,44,194,0,0,84,194,0,0,24,194,0,0,20,194,0,0,12,194,0,0,12,194,0,0,24,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,200,194,0,0,182,194,0,0,168,194,0,0,148,194,0,0,160,194,0,0,160,194,0,0,160,194,0,0,160,194,0,0,160,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,200,194,0,0,182,194,0,0,168,194,0,0,148,194,0,0,136,194,0,0,136,194,0,0,136,194,0,0,136,194,0,0,136,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,200,194,0,0,172,194,0,0,156,194,0,0,140,194,0,0,112,194,0,0,52,194,0,0,240,193,0,0,168,193,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,200,194,0,0,174,194,0,0,156,194,0,0,134,194,0,0,64,194,0,0,24,194,0,0,232,193,0,0,168,193,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,200,194,0,0,172,194,0,0,138,194,0,0,96,194,0,0,52,194,0,0,12,194,0,0,4,194,0,0,232,193,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,220,194,0,0,200,194,0,0,166,194,0,0,142,194,0,0,64,194,0,0,216,193,0,0,24,194,0,0,20,194,0,0,8,194,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,192,121,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,111,114,98,105,115,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+51200);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_i64Subtract\"]=_i64Subtract;var _llvm_pow_f64=Math_pow;Module[\"_i64Add\"]=_i64Add;Module[\"_memset\"]=_memset;function _ogvjs_callback_init_audio(channels,rate){Module.audioFormat={channels:channels,rate:rate};Module.loadedMetadata=true}Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _abort(){Module[\"abort\"]()}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;var _llvm_sqrt_f64=Math_sqrt;function __exit(status){Module[\"exit\"](status)}function _exit(status){__exit(status)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;function _ogvjs_callback_audio(buffers,channels,sampleCount){var HEAPU32=Module.HEAPU32;var HEAPF32=Module.HEAPF32;var outputBuffers=[];if(buffers!==0){var inPtr,inArray,inBuffer,outArray;for(var channel=0;channel<channels;channel++){inPtr=HEAPU32[buffers/4+channel];if(HEAPF32.buffer.slice){inBuffer=HEAPF32.buffer.slice(inPtr,inPtr+sampleCount*4);outArray=new Float32Array(inBuffer)}else{inArray=HEAPF32.subarray(inPtr/4,inPtr/4+sampleCount);outArray=new Float32Array(inArray)}outputBuffers.push(outArray)}}Module.audioBuffer=outputBuffers}DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module[\"dynCall_viii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){try{return Module[\"dynCall_iiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiiii\":invoke_iiiii,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_viii\":invoke_viii,\"invoke_iiiiiiiii\":invoke_iiiiiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"_ogvjs_callback_init_audio\":_ogvjs_callback_init_audio,\"_llvm_pow_f64\":_llvm_pow_f64,\"_llvm_sqrt_f64\":_llvm_sqrt_f64,\"_abort\":_abort,\"___setErrNo\":___setErrNo,\"_ogvjs_callback_audio\":_ogvjs_callback_audio,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_exit\":_exit,\"__exit\":__exit,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;var C=0;var D=global.Math.floor;var E=global.Math.abs;var F=global.Math.sqrt;var G=global.Math.pow;var H=global.Math.cos;var I=global.Math.sin;var J=global.Math.tan;var K=global.Math.acos;var L=global.Math.asin;var M=global.Math.atan;var N=global.Math.atan2;var O=global.Math.exp;var P=global.Math.log;var Q=global.Math.ceil;var R=global.Math.imul;var S=global.Math.min;var T=global.Math.max;var U=global.Math.clz32;var V=env.abort;var W=env.assert;var X=env.enlargeMemory;var Y=env.getTotalMemory;var Z=env.abortOnCannotGrowMemory;var _=env.invoke_iiiii;var $=env.invoke_vi;var aa=env.invoke_vii;var ba=env.invoke_ii;var ca=env.invoke_viii;var da=env.invoke_iiiiiiiii;var ea=env.invoke_iii;var fa=env.invoke_iiiiii;var ga=env._ogvjs_callback_init_audio;var ha=env._llvm_pow_f64;var ia=env._llvm_sqrt_f64;var ja=env._abort;var ka=env.___setErrNo;var la=env._ogvjs_callback_audio;var ma=env._emscripten_memcpy_big;var na=env._exit;var oa=env.__exit;var pa=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction ya(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function za(){return l|0}function Aa(a){a=a|0;l=a}function Ba(a,b){a=a|0;b=b|0;l=a;m=b}function Ca(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function Da(a){a=a|0;C=a}function Ea(){return C|0}function Fa(b){b=b|0;var d=0;d=b;c[d>>2]=0;c[d+4>>2]=0;d=$c(256)|0;c[b+8>>2]=d;c[b+12>>2]=d;a[d>>0]=0;c[b+16>>2]=256;return}function Ga(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;do if(f>>>0<=32){g=b+16|0;h=c[g>>2]|0;i=b+12|0;j=c[i>>2]|0;if((c[b>>2]|0)<(h+-4|0))k=j;else{if(!j)return;if((h|0)>2147483391)break;j=b+8|0;l=cd(c[j>>2]|0,h+256|0)|0;if(!l)break;c[j>>2]=l;c[g>>2]=(c[g>>2]|0)+256;g=l+(c[b>>2]|0)|0;c[i>>2]=g;k=g}g=c[152+(f<<2)>>2]&e;l=b+4|0;j=c[l>>2]|0;h=j+f|0;a[k>>0]=d[k>>0]|0|g<<j;if((((h|0)>7?(a[(c[i>>2]|0)+1>>0]=g>>>(8-(c[l>>2]|0)|0),(h|0)>15):0)?(a[(c[i>>2]|0)+2>>0]=g>>>(16-(c[l>>2]|0)|0),(h|0)>23):0)?(a[(c[i>>2]|0)+3>>0]=g>>>(24-(c[l>>2]|0)|0),(h|0)>31):0){j=c[l>>2]|0;a[(c[i>>2]|0)+4>>0]=(j|0)==0?0:g>>>(32-j|0)&255}j=(h|0)/8|0;c[b>>2]=(c[b>>2]|0)+j;c[i>>2]=(c[i>>2]|0)+j;c[l>>2]=h&7;return}while(0);k=c[b+8>>2]|0;if(k|0)ad(k);c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;return}function Ha(a){a=a|0;var b=0;b=c[a+8>>2]|0;if(b|0)ad(b);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;return}function Ia(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a;c[e>>2]=0;c[e+4>>2]=0;c[a+12>>2]=b;c[a+8>>2]=b;c[a+16>>2]=d;return}function Ja(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(b>>>0>32){e=-1;return e|0}f=c[152+(b<<2)>>2]|0;g=c[a+4>>2]|0;h=g+b|0;b=c[a>>2]|0;i=c[a+16>>2]|0;if((b|0)>=(i+-4|0)){if((b|0)>(i-(h+7>>3)|0)){e=-1;return e|0}if(!h){e=0;return e|0}}i=c[a+12>>2]|0;a=(d[i>>0]|0)>>>g;if((h|0)>8){b=(d[i+1>>0]|0)<<8-g|a;if((h|0)>16){j=(d[i+2>>0]|0)<<16-g|b;if((h|0)>24){k=(d[i+3>>0]|0)<<24-g|j;if((g|0)==0|(h|0)<33)l=k;else l=(d[i+4>>0]|0)<<32-g|k}else l=j}else l=b}else l=a;e=l&f;return e|0}function Ka(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+4|0;e=(c[d>>2]|0)+b|0;b=c[a>>2]|0;f=c[a+16>>2]|0;if((b|0)>(f-(e+7>>3)|0)){c[a+12>>2]=0;c[a>>2]=f;g=1;c[d>>2]=g;return}else{f=(e|0)/8|0;h=a+12|0;c[h>>2]=(c[h>>2]|0)+f;c[a>>2]=f+b;g=e&7;c[d>>2]=g;return}}function La(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=c[a+16>>2]|0;do if(b>>>0>32){f=a+4|0;g=a}else{h=c[152+(b<<2)>>2]|0;i=a+4|0;j=c[i>>2]|0;k=j+b|0;l=c[a>>2]|0;if((l|0)>=(e+-4|0)){if((l|0)>(e-(k+7>>3)|0)){f=i;g=a;break}if(!k){m=0;return m|0}}n=a+12|0;o=c[n>>2]|0;p=(d[o>>0]|0)>>>j;if((k|0)>8){q=(d[o+1>>0]|0)<<8-j|p;if((k|0)>16){r=(d[o+2>>0]|0)<<16-j|q;if((k|0)>24){s=(d[o+3>>0]|0)<<24-j|r;if((j|0)==0|(k|0)<33)t=s;else t=(d[o+4>>0]|0)<<32-j|s}else t=r}else t=q}else t=p;p=(k|0)/8|0;c[n>>2]=o+p;c[a>>2]=l+p;c[i>>2]=k&7;m=t&h;return m|0}while(0);c[a+12>>2]=0;c[g>>2]=e;c[f>>2]=1;m=-1;return m|0}function Ma(a){a=a|0;return (((c[a+4>>2]|0)+7|0)/8|0)+(c[a>>2]|0)|0}function Na(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+836|0;e=c[a+840>>2]|0;Ga(b,c[a>>2]|0,5);if((c[a>>2]|0)>0){f=a+4|0;g=0;h=-1;do{i=f+(g<<2)|0;Ga(b,c[i>>2]|0,4);j=c[i>>2]|0;h=(h|0)<(j|0)?j:h;g=g+1|0}while((g|0)<(c[a>>2]|0));if((h|0)>=0){g=a+128|0;f=a+192|0;j=a+256|0;i=a+320|0;k=0;while(1){Ga(b,(c[g+(k<<2)>>2]|0)+-1|0,3);l=f+(k<<2)|0;Ga(b,c[l>>2]|0,2);if(!((c[l>>2]|0)!=0?(Ga(b,c[j+(k<<2)>>2]|0,8),(c[l>>2]|0)==31):0)){m=0;n=8}if((n|0)==8)while(1){n=0;Ga(b,(c[i+(k<<5)+(m<<2)>>2]|0)+1|0,8);m=m+1|0;if((m|0)>=(1<<c[l>>2]|0))break;else n=8}if((k|0)==(h|0))break;else k=k+1|0}}}Ga(b,(c[a+832>>2]|0)+-1|0,2);k=e+-1|0;if((e|0)==0|(k|0)==0){Ga(b,0,4);o=0}else{e=0;h=k;do{e=e+1|0;h=h>>>1}while((h|0)!=0);Ga(b,e,4);e=0;h=k;while(1){k=e+1|0;h=h>>>1;if(!h){o=k;break}else e=k}}e=c[a>>2]|0;if((e|0)<=0)return;h=a+128|0;k=a+4|0;n=e;e=0;m=0;i=0;while(1){e=(c[h+(c[k+(m<<2)>>2]<<2)>>2]|0)+e|0;if((i|0)<(e|0)){j=i;do{Ga(b,c[d+(j+2<<2)>>2]|0,o);j=j+1|0}while((j|0)!=(e|0));p=c[a>>2]|0;q=e}else{p=n;q=i}m=m+1|0;if((m|0)>=(p|0))break;else{n=p;i=q}}return}function Oa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=l;l=l+272|0;e=d;f=c[a+28>>2]|0;a=bd(1,1120)|0;g=La(b,5)|0;c[a>>2]=g;a:do if((g|0)>0){h=a+4|0;i=0;j=-1;do{k=La(b,4)|0;c[h+(i<<2)>>2]=k;if((k|0)<0)break a;j=(j|0)<(k|0)?k:j;i=i+1|0}while((i|0)<(c[a>>2]|0));if((j|0)>=0){i=a+128|0;h=a+192|0;k=a+256|0;m=f+24|0;n=a+320|0;o=0;while(1){c[i+(o<<2)>>2]=(La(b,3)|0)+1;p=La(b,2)|0;q=h+(o<<2)|0;c[q>>2]=p;if((p|0)<0)break a;r=k+(o<<2)|0;if(!p)s=c[r>>2]|0;else{p=La(b,8)|0;c[r>>2]=p;s=p}if((s|0)<0)break a;if((s|0)>=(c[m>>2]|0))break a;if((c[q>>2]|0)!=31){p=0;do{r=La(b,8)|0;c[n+(o<<5)+(p<<2)>>2]=r+-1;if((r|0)<0)break a;p=p+1|0;if((r|0)>(c[m>>2]|0))break a}while((p|0)<(1<<c[q>>2]|0))}if((o|0)<(j|0))o=o+1|0;else{t=18;break}}}else t=18}else t=18;while(0);b:do if((t|0)==18?(c[a+832>>2]=(La(b,2)|0)+1,s=La(b,4)|0,(s|0)>=0):0){f=c[a>>2]|0;if((f|0)>0){g=a+128|0;o=a+4|0;j=a+836|0;m=1<<s;n=f;f=0;k=0;h=0;while(1){i=(c[g+(c[o+(k<<2)>>2]<<2)>>2]|0)+f|0;if((i|0)>63)break b;if((h|0)<(i|0)){q=h;do{p=La(b,s)|0;c[j+(q+2<<2)>>2]=p;if(!((p|0)>-1&(p|0)<(m|0)))break b;q=q+1|0}while((q|0)<(i|0));u=c[a>>2]|0;v=q}else{u=n;v=h}k=k+1|0;if((k|0)>=(u|0)){w=i;x=j;y=m;break}else{n=u;f=i;h=v}}}else{w=0;x=a+836|0;y=1<<s}c[x>>2]=0;c[a+840>>2]=y;h=w+2|0;if((w|0)>-2){f=0;do{c[e+(f<<2)>>2]=x+(f<<2);f=f+1|0}while((f|0)<(h|0))}Pc(e,h,4,11);c:do if((h|0)>1){f=c[c[e>>2]>>2]|0;s=1;while(1){n=f;f=c[c[e+(s<<2)>>2]>>2]|0;s=s+1|0;if((n|0)==(f|0))break;if((s|0)>=(h|0))break c}if(!a)z=0;else break b;l=d;return z|0}while(0);z=a;l=d;return z|0}while(0);ad(a);z=0;l=d;return z|0}function Pa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;a=l;l=l+272|0;d=a;e=bd(1,1312)|0;c[e+1296>>2]=b;f=b+836|0;g=e+1288|0;c[g>>2]=c[b+840>>2];h=c[b>>2]|0;if((h|0)>0){i=b+128|0;j=b+4|0;k=0;m=0;do{m=(c[i+(c[j+(k<<2)>>2]<<2)>>2]|0)+m|0;k=k+1|0}while((k|0)<(h|0));h=m+2|0;c[e+1284>>2]=h;if((m|0)>-2){n=h;o=m;p=7}else{Pc(d,h,4,11);q=m}}else{c[e+1284>>2]=2;n=2;o=0;p=7}if((p|0)==7){m=0;do{c[d+(m<<2)>>2]=f+(m<<2);m=m+1|0}while((m|0)<(n|0));Pc(d,n,4,11);m=f;h=e+260|0;k=0;do{c[h+(k<<2)>>2]=(c[d+(k<<2)>>2]|0)-m>>2;k=k+1|0}while((k|0)<(n|0));k=e+520|0;m=e+260|0;d=0;do{c[k+(c[m+(d<<2)>>2]<<2)>>2]=d;d=d+1|0}while((d|0)<(n|0));d=e+260|0;m=0;do{c[e+(m<<2)>>2]=c[f+(c[d+(m<<2)>>2]<<2)>>2];m=m+1|0}while((m|0)<(n|0));q=o}switch(c[b+832>>2]|0){case 1:{r=256;p=19;break}case 2:{r=128;p=19;break}case 3:{r=86;p=19;break}case 4:{r=64;p=19;break}default:{}}if((p|0)==19)c[e+1292>>2]=r;if((q|0)<=0){l=a;return e|0}r=e+1032|0;p=e+780|0;b=0;o=2;while(1){n=c[f+(b+2<<2)>>2]|0;m=1;d=c[g>>2]|0;k=0;h=0;j=0;while(1){i=c[f+(k<<2)>>2]|0;s=(i|0)>(j|0)&(i|0)<(n|0);h=s?k:h;t=(i|0)<(d|0)&(i|0)>(n|0);m=t?k:m;k=k+1|0;if((k|0)==(o|0))break;else{d=t?i:d;j=s?i:j}}c[r+(b<<2)>>2]=h;c[p+(b<<2)>>2]=m;b=b+1|0;if((b|0)==(q|0))break;else o=o+1|0}l=a;return e|0}function Qa(a){a=a|0;if(!a)return;ad(a);return}function Ra(a){a=a|0;if(!a)return;ad(a);return}function Sa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=c[b+1296>>2]|0;e=c[(c[(c[(c[a+64>>2]|0)+4>>2]|0)+28>>2]|0)+2848>>2]|0;f=a+4|0;if((La(f,1)|0)!=1){g=0;return g|0}h=b+1284|0;i=Ua(a,c[h>>2]<<2)|0;a=b+1292|0;j=(c[a>>2]|0)+-1|0;if(!j)k=0;else{l=0;m=j;while(1){j=l+1|0;m=m>>>1;if(!m){k=j;break}else l=j}}c[i>>2]=La(f,k)|0;k=(c[a>>2]|0)+-1|0;if(!k)n=0;else{l=0;m=k;while(1){k=l+1|0;m=m>>>1;if(!m){n=k;break}else l=k}}c[i+4>>2]=La(f,n)|0;a:do if((c[d>>2]|0)>0){n=0;l=2;b:while(1){m=c[d+4+(n<<2)>>2]|0;k=c[d+128+(m<<2)>>2]|0;j=c[d+192+(m<<2)>>2]|0;o=1<<j;if(j){p=Va(e+((c[d+256+(m<<2)>>2]|0)*56|0)|0,f)|0;if((p|0)==-1){g=0;q=29;break}else r=p}else r=0;if((k|0)>0){p=o+-1|0;o=r;s=0;do{t=c[d+320+(m<<5)+((o&p)<<2)>>2]|0;o=o>>j;if((t|0)>-1){u=Va(e+(t*56|0)|0,f)|0;c[i+(s+l<<2)>>2]=u;if((u|0)==-1){g=0;q=29;break b}}else c[i+(s+l<<2)>>2]=0;s=s+1|0}while((s|0)<(k|0))}n=n+1|0;if((n|0)>=(c[d>>2]|0))break a;else l=k+l|0}if((q|0)==29)return g|0}while(0);if((c[h>>2]|0)<=2){g=i;return g|0}q=b+1032|0;f=b+780|0;b=2;do{e=b+-2|0;r=q+(e<<2)|0;l=c[r>>2]|0;n=c[d+836+(l<<2)>>2]|0;s=f+(e<<2)|0;e=c[s>>2]|0;j=c[i+(l<<2)>>2]&32767;l=(c[i+(e<<2)>>2]&32767)-j|0;o=(R((l|0)>-1?l:0-l|0,(c[d+836+(b<<2)>>2]|0)-n|0)|0)/((c[d+836+(e<<2)>>2]|0)-n|0)|0;n=((l|0)<0?0-o|0:o)+j|0;j=(c[a>>2]|0)-n|0;o=i+(b<<2)|0;l=c[o>>2]|0;if(!l)c[o>>2]=n|32768;else{do if((l|0)<(((j|0)<(n|0)?j:n)<<1|0))if(!(l&1)){v=l>>1;break}else{v=0-(l+1>>1)|0;break}else if((j|0)>(n|0)){v=l-n|0;break}else{v=~(l-j);break}while(0);c[o>>2]=v+n&32767;j=i+(c[r>>2]<<2)|0;c[j>>2]=c[j>>2]&32767;j=i+(c[s>>2]<<2)|0;c[j>>2]=c[j>>2]&32767}b=b+1|0}while((b|0)<(c[h>>2]|0));g=i;return g|0}function Ta(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0;f=c[b+1296>>2]|0;h=(c[(c[(c[(c[a+64>>2]|0)+4>>2]|0)+28>>2]|0)+(c[a+28>>2]<<2)>>2]|0)/2|0;if(!d){id(e|0,0,h<<2|0)|0;i=0;return i|0}a=c[f+832>>2]|0;j=R(a,c[d>>2]|0)|0;k=(j|0)<0?0:(j|0)<255?j:255;j=c[b+1284>>2]|0;if((j|0)>1){l=b+260|0;b=0;m=1;n=0;o=k;while(1){p=c[l+(m<<2)>>2]|0;q=c[d+(p<<2)>>2]|0;a:do if((q&32767|0)==(q|0)){r=c[f+836+(p<<2)>>2]|0;s=R(a,q)|0;t=(s|0)<0?0:(s|0)<255?s:255;s=t-o|0;u=r-n|0;v=(s|0)/(u|0)|0;w=s>>31|1;x=R(v,u)|0;y=((s|0)>-1?s:0-s|0)-((x|0)>-1?x:0-x|0)|0;x=(h|0)>(r|0)?r:h;if((x|0)>(n|0)){z=0;A=n;B=o;C=8}else{D=0;E=n;F=o}while(1){if((C|0)==8){C=0;s=e+(A<<2)|0;g[s>>2]=+g[s>>2]*+g[476+(B<<2)>>2];D=z;E=A;F=B}s=E+1|0;if((s|0)>=(x|0)){G=r;H=r;I=t;break a}J=D+y|0;K=(J|0)<(u|0);z=J-(K?0:u)|0;A=s;B=F+v+(K?0:w)|0;C=8}}else{G=b;H=n;I=o}while(0);m=m+1|0;if((m|0)>=(j|0)){L=G;M=I;break}else{b=G;n=H;o=I}}}else{L=0;M=k}if((L|0)>=(h|0)){i=1;return i|0}N=+g[476+(M<<2)>>2];M=L;do{L=e+(M<<2)|0;g[L>>2]=+g[L>>2]*N;M=M+1|0}while((M|0)!=(h|0));i=1;return i|0}function Ua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=b+7&-8;b=a+72|0;e=c[b>>2]|0;f=a+76|0;g=a+68|0;h=c[g>>2]|0;if((e+d|0)<=(c[f>>2]|0)){i=h;j=e;k=i+j|0;l=j+d|0;c[b>>2]=l;return k|0}if(h|0){m=$c(8)|0;n=a+80|0;c[n>>2]=(c[n>>2]|0)+e;e=a+84|0;c[m+4>>2]=c[e>>2];c[m>>2]=h;c[e>>2]=m}c[f>>2]=d;f=$c(d)|0;c[g>>2]=f;c[b>>2]=0;i=f;j=0;k=i+j|0;l=j+d|0;c[b>>2]=l;return k|0}function Va(a,b){a=a|0;b=b|0;var d=0,e=0;if((c[a+8>>2]|0)<=0){d=-1;return d|0}e=Wa(a,b)|0;if((e|0)<=-1){d=-1;return d|0}d=c[(c[a+24>>2]|0)+(e<<2)>>2]|0;return d|0}function Wa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c[b+40>>2]|0;f=Ja(d,c[b+36>>2]|0)|0;do if((f|0)>-1){g=c[(c[b+32>>2]|0)+(f<<2)>>2]|0;if((g|0)<0){h=(c[b+8>>2]|0)-(g&32767)|0;i=g>>>15&32767;break}j=g+-1|0;Ka(d,a[(c[b+28>>2]|0)+j>>0]|0);k=j;return k|0}else{h=c[b+8>>2]|0;i=0}while(0);f=e;while(1){l=Ja(d,f)|0;m=(l|0)<0;if((f|0)>1&m)f=f+-1|0;else break}if(m){k=-1;return k|0}m=kd(l|0)|0;l=m>>>4&252645135|m<<4&-252645136;m=l>>>2&858993459|l<<2&-858993460;l=m>>>1&1431655765|m<<1&-1431655766;m=h-i|0;if((m|0)>1){e=c[b+20>>2]|0;j=h;h=i;g=m;while(1){m=g>>>1;n=(c[e+(m+h<<2)>>2]|0)>>>0>l>>>0;o=(n?0:m)+h|0;j=j-(n?m:0)|0;g=j-o|0;if((g|0)<=1){p=o;break}else h=o}}else p=i;i=a[(c[b+28>>2]|0)+p>>0]|0;if((i|0)>(f|0)){Ka(d,f);k=-1;return k|0}else{Ka(d,i);k=p;return k|0}return 0}function Xa(a,b){a=a|0;b=b|0;return (c[c[a>>2]>>2]|0)-(c[c[b>>2]>>2]|0)|0}function Ya(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=c[a+28>>2]|0;a=$c(96)|0;e=La(b,8)|0;c[a>>2]=e;f=La(b,16)|0;c[a+4>>2]=f;g=La(b,16)|0;c[a+8>>2]=g;c[a+12>>2]=La(b,6)|0;c[a+16>>2]=La(b,8)|0;h=La(b,4)|0;i=a+20|0;c[i>>2]=h+1;a:do if((e|0)<1){if(!a){j=0;return j|0}}else if((f|0)>=1?!((h|0)<0|(g|0)<1):0){if((h|0)<=-1){j=a;return j|0}k=a+24|0;l=d+24|0;m=0;while(1){n=La(b,8)|0;c[k+(m<<2)>>2]=n;if((n|0)<0)break a;if((n|0)>=(c[l>>2]|0))break a;o=c[d+1824+(n<<2)>>2]|0;if(!(c[o+12>>2]|0))break a;m=m+1|0;if((c[o>>2]|0)<1)break a;if((m|0)>=(c[i>>2]|0)){j=a;break}}return j|0}while(0);ad(a);j=0;return j|0}function Za(a,b){a=a|0;b=b|0;a=bd(1,32)|0;c[a+4>>2]=c[b>>2];c[a>>2]=c[b+8>>2];c[a+20>>2]=b;c[a+8>>2]=bd(2,4)|0;return a|0}function _a(a){a=a|0;if(!a)return;ad(a);return}function $a(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(!a)return;b=a+8|0;d=c[b>>2]|0;if(d|0){e=c[d>>2]|0;if(!e)f=d;else{ad(e);f=c[b>>2]|0}e=c[f+4>>2]|0;if(!e)g=f;else{ad(e);g=c[b>>2]|0}ad(g)}ad(a);return}function ab(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0;d=c[b+20>>2]|0;e=a+4|0;f=d+12|0;h=La(e,c[f>>2]|0)|0;if((h|0)<=0){i=0;return i|0}j=+(h|0)/+((1<<c[f>>2])+-1|0)*+(c[d+16>>2]|0);f=d+20|0;h=La(e,db(c[f>>2]|0)|0)|0;if((h|0)==-1){i=0;return i|0}if((h|0)>=(c[f>>2]|0)){i=0;return i|0}f=(c[(c[(c[(c[a+64>>2]|0)+4>>2]|0)+28>>2]|0)+2848>>2]|0)+((c[d+24+(h<<2)>>2]|0)*56|0)|0;h=b+4|0;b=Ua(a,((c[f>>2]|0)+(c[h>>2]|0)<<2)+4|0)|0;if((eb(f,b,e,c[h>>2]|0)|0)==-1){i=0;return i|0}e=c[h>>2]|0;if((e|0)>0){h=0;k=0.0;while(1){a:do if((h|0)<(e|0)){a=c[f>>2]|0;d=h;l=0;while(1){if((l|0)>=(a|0)){m=d;break a}n=b+(d<<2)|0;g[n>>2]=+g[n>>2]+k;n=d+1|0;if((n|0)<(e|0)){d=n;l=l+1|0}else{m=n;break}}}else m=h;while(0);if((m|0)<(e|0)){h=m;k=+g[b+(m+-1<<2)>>2]}else break}}g[b+(e<<2)>>2]=j;i=b;return i|0}function bb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0;f=c[b+20>>2]|0;h=b+8|0;i=c[a+28>>2]|0;j=(c[h>>2]|0)+(i<<2)|0;if(!(c[j>>2]|0)){k=c[(c[(c[(c[a+64>>2]|0)+4>>2]|0)+28>>2]|0)+(i<<2)>>2]|0;a=(k|0)/2|0;l=c[b>>2]|0;m=+(c[f+4>>2]|0);c[j>>2]=$c((a<<2)+4|0)|0;j=c[(c[h>>2]|0)+(i<<2)>>2]|0;a:do if((k|0)>1){n=m*.5/+(a|0);o=+(l|0)/(+M(+(m*m*4.624999938585006e-09))*2.240000009536743+m*4.999999873689376e-05+ +M(+(m*3.699999942909926e-04))*13.100000381469727);p=l;q=0;while(1){r=+(q|0)*n;s=~~+D(+((+M(+(r*r*1.8499999754340024e-08))*2.240000009536743+ +M(+(r*7.399999885819852e-04))*13.100000381469727+r*9.999999747378752e-05)*o));c[j+(q<<2)>>2]=(s|0)<(p|0)?s:p+-1|0;s=q+1|0;if((s|0)>=(a|0)){t=s;break a}p=c[b>>2]|0;q=s}}else t=0;while(0);c[j+(t<<2)>>2]=-1;c[b+12+(i<<2)>>2]=a;u=a}else u=c[b+12+(i<<2)>>2]|0;if(!d){id(e|0,0,u<<2|0)|0;v=0;return v|0}else{a=c[b+4>>2]|0;cb(e,c[(c[h>>2]|0)+(i<<2)>>2]|0,u,c[b>>2]|0,d,a,+g[d+(a<<2)>>2],+(c[f+16>>2]|0));v=1;return v|0}return 0}function cb(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;j=+j;var k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;k=3.141592653589793/+(e|0);if((h|0)>0){e=0;do{l=f+(e<<2)|0;g[l>>2]=+H(+(+g[l>>2]))*2.0;e=e+1|0}while((e|0)!=(h|0))}if((d|0)<=0)return;m=i;i=j;if((h|0)<=1){e=(h|0)==1;l=c[b>>2]|0;n=0;while(1){j=+H(+(+(l|0)*k))*2.0;if(e){o=(j-+g[f>>2])*.5;p=4.0-j*j;q=o*o}else{p=2.0-j;q=(j+2.0)*.25}j=+O(+((m/+F(+(q+p*.25))-i)*.1151292473077774));r=n;do{s=a+(r<<2)|0;g[s>>2]=+g[s>>2]*j;r=r+1|0;t=c[b+(r<<2)>>2]|0}while((t|0)==(l|0));if((r|0)<(d|0)){l=t;n=r}else break}return}n=h+-2|0;t=((n&-2)+3|0)==(h|0);l=f+((n|1)+1<<2)|0;n=c[b>>2]|0;e=0;while(1){p=+H(+(+(n|0)*k))*2.0;s=1;q=.5;j=.5;do{j=(p-+g[f+(s+-1<<2)>>2])*j;q=(p-+g[f+(s<<2)>>2])*q;s=s+2|0}while((s|0)<(h|0));if(t){o=(p-+g[l>>2])*j;u=q*q*(4.0-p*p);v=o*o}else{u=q*q*(2.0-p);v=j*j*(p+2.0)}o=+O(+((m/+F(+(v+u))-i)*.1151292473077774));s=e;do{r=a+(s<<2)|0;g[r>>2]=+g[r>>2]*o;s=s+1|0;w=c[b+(s<<2)>>2]|0}while((w|0)==(n|0));if((s|0)<(d|0)){n=w;e=s}else break}return}function db(a){a=a|0;var b=0,c=0,d=0;if(!a){b=0;return b|0}else{c=0;d=a}while(1){a=c+1|0;d=d>>>1;if(!d){b=a;break}else c=a}return b|0}function eb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;f=(e|0)>0;if((c[a+8>>2]|0)<=0){if(!f){g=0;return g|0}id(b|0,0,e<<2|0)|0;g=0;return g|0}if(!f){g=0;return g|0}f=a+16|0;h=0;while(1){i=Wa(a,d)|0;if((i|0)==-1){g=-1;j=10;break}k=c[a>>2]|0;l=(c[f>>2]|0)+((R(k,i)|0)<<2)|0;if((k|0)>0&(h|0)<(e|0)){i=h;m=0;while(1){n=i+1|0;c[b+(i<<2)>>2]=c[l+(m<<2)>>2];m=m+1|0;if(!((m|0)<(k|0)&(n|0)<(e|0))){o=n;break}else i=n}}else o=h;if((o|0)<(e|0))h=o;else{g=0;j=10;break}}if((j|0)==10)return g|0;return 0}function fb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=bd(1,2840)|0;e=c[a+28>>2]|0;c[d>>2]=La(b,24)|0;c[d+4>>2]=La(b,24)|0;c[d+8>>2]=(La(b,24)|0)+1;a=La(b,6)|0;f=d+12|0;c[f>>2]=a+1;g=La(b,8)|0;h=d+20|0;c[h>>2]=g;a:do if((g|0)>=0){if((a|0)>-1){i=d+24|0;j=0;k=0;do{l=La(b,3)|0;m=La(b,1)|0;if((m|0)<0){n=25;break a}if(m){m=La(b,5)|0;if(!(m>>31&2))o=((m|0)<0?0:m<<3)|l;else{n=25;break a}}else o=l;c[i+(k<<2)>>2]=o;if(!o)p=0;else{l=0;m=o;while(1){q=(m&1)+l|0;m=m>>>1;if(!m){p=q;break}else l=q}}j=p+j|0;k=k+1|0}while((k|0)<(c[f>>2]|0));k=(j|0)>0;if(k){i=d+280|0;l=0;while(1){m=La(b,8)|0;if((m|0)<0)break a;c[i+(l<<2)>>2]=m;l=l+1|0;if((l|0)>=(j|0)){r=j;s=k;break}}}else{r=j;s=0}}else{r=0;s=0}k=c[h>>2]|0;l=c[e+24>>2]|0;if((k|0)<(l|0)){if(s){i=d+280|0;m=0;do{q=c[i+(m<<2)>>2]|0;if((q|0)>=(l|0))break a;m=m+1|0;if(!(c[(c[e+1824+(q<<2)>>2]|0)+12>>2]|0))break a}while((m|0)<(r|0))}m=c[e+1824+(k<<2)>>2]|0;l=c[m+4>>2]|0;i=c[m>>2]|0;if((i|0)>=1){m=c[f>>2]|0;j=i;i=1;while(1){i=R(m,i)|0;if((i|0)>(l|0))break a;if((j|0)<=1)break;else j=j+-1|0}c[d+16>>2]=i;t=d;return t|0}}}else n=25;while(0);if((n|0)==25?(d|0)==0:0){t=0;return t|0}ad(d);t=0;return t|0}function gb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=bd(1,44)|0;e=c[(c[a+4>>2]|0)+28>>2]|0;c[d>>2]=b;a=c[b+12>>2]|0;c[d+4>>2]=a;f=e+2848|0;e=c[f>>2]|0;c[d+12>>2]=e;g=e+((c[b+20>>2]|0)*56|0)|0;c[d+16>>2]=g;e=c[g>>2]|0;g=bd(a,4)|0;c[d+20>>2]=g;if((a|0)>0){h=b+24|0;i=b+280|0;b=0;j=0;k=0;while(1){l=c[h+(j<<2)>>2]|0;if(l){m=0;n=l;while(1){o=m+1|0;n=n>>>1;if(!n)break;else m=o}n=(o|0)>(k|0)?o:k;c[g+(j<<2)>>2]=bd(o,4)|0;if((m|0)<0){p=b;q=n}else{r=g+(j<<2)|0;s=b;t=0;while(1){if(!(l&1<<t))u=s;else{c[(c[r>>2]|0)+(t<<2)>>2]=(c[f>>2]|0)+((c[i+(s<<2)>>2]|0)*56|0);u=s+1|0}t=t+1|0;if((t|0)==(o|0)){p=u;q=n;break}else s=u}}}else{p=b;q=k}j=j+1|0;if((j|0)>=(a|0)){v=q;break}else{b=p;k=q}}}else v=0;q=d+24|0;c[q>>2]=1;k=(e|0)>0;if(k){p=1;b=0;do{p=R(p,a)|0;b=b+1|0}while((b|0)!=(e|0));c[q>>2]=p;w=p<<2;x=p}else{w=4;x=1}c[d+8>>2]=v;v=$c(w)|0;c[d+28>>2]=v;if((x|0)<=0)return d|0;w=e<<2;if(k)y=0;else{k=0;do{c[v+(k<<2)>>2]=$c(w)|0;k=k+1|0}while((k|0)<(x|0));return d|0}do{k=$c(w)|0;c[v+(y<<2)>>2]=k;p=x;q=0;b=y;do{p=(p|0)/(a|0)|0;j=(b|0)/(p|0)|0;b=b-(R(j,p)|0)|0;c[k+(q<<2)>>2]=j;q=q+1|0}while((q|0)!=(e|0));y=y+1|0}while((y|0)<(x|0));return d|0}function hb(a){a=a|0;if(!a)return;ad(a);return}function ib(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(!a)return;b=a+4|0;d=c[b>>2]|0;e=a+20|0;f=c[e>>2]|0;if((d|0)>0){g=d;d=f;h=0;while(1){i=c[d+(h<<2)>>2]|0;if(!i){j=d;k=g}else{ad(i);j=c[e>>2]|0;k=c[b>>2]|0}h=h+1|0;if((h|0)>=(k|0)){l=j;break}else{g=k;d=j}}}else l=f;ad(l);l=a+24|0;f=a+28|0;j=c[f>>2]|0;if((c[l>>2]|0)>0){d=j;k=0;while(1){ad(c[d+(k<<2)>>2]|0);k=k+1|0;g=c[f>>2]|0;if((k|0)>=(c[l>>2]|0)){m=g;break}else d=g}}else m=j;ad(m);ad(a);return}function jb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;if((f|0)>0){g=0;h=0}else return 0;while(1){if(!(c[e+(g<<2)>>2]|0))i=h;else{c[d+(h<<2)>>2]=c[d+(g<<2)>>2];i=h+1|0}g=g+1|0;if((g|0)==(f|0))break;else h=i}if(!i)return 0;lb(a,b,d,i,3);return 0}function kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=l;if((c[a+8>>2]|0)<=0){h=0;l=f;return h|0}i=c[a>>2]|0;j=(e|0)/(i|0)|0;e=l;l=l+((1*(j<<2)|0)+15&-16)|0;k=(j|0)>0;a:do if(k){m=a+16|0;n=0;while(1){o=Wa(a,d)|0;if((o|0)==-1){h=-1;break}p=c[a>>2]|0;c[e+(n<<2)>>2]=(c[m>>2]|0)+((R(p,o)|0)<<2);n=n+1|0;if((n|0)>=(j|0)){q=p;break a}}l=f;return h|0}else q=i;while(0);if((q|0)<1|k^1){h=0;l=f;return h|0}else{r=0;s=0}while(1){k=0;do{i=b+(k+s<<2)|0;g[i>>2]=+g[i>>2]+ +g[(c[e+(k<<2)>>2]|0)+(r<<2)>>2];k=k+1|0}while((k|0)!=(j|0));r=r+1|0;if((r|0)>=(q|0)){h=0;break}else s=s+j|0}l=f;return h|0}function lb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;g=l;h=c[b>>2]|0;i=c[h+8>>2]|0;j=b+16|0;k=c[c[j>>2]>>2]|0;m=c[a+36>>2]>>1;n=c[h+4>>2]|0;o=((n|0)<(m|0)?n:m)-(c[h>>2]|0)|0;if((o|0)<=0){l=g;return}m=(o|0)/(i|0)|0;o=l;l=l+((1*(e<<2)|0)+15&-16)|0;n=(e|0)>0;if(n){p=((k+-1+m|0)/(k|0)|0)<<2;q=0;do{c[o+(q<<2)>>2]=Ua(a,p)|0;q=q+1|0}while((q|0)!=(e|0))}q=b+8|0;p=c[q>>2]|0;if((p|0)<=0){l=g;return}r=(m|0)>0;s=a+4|0;a=h+16|0;t=b+28|0;u=(k|0)>0;v=b+20|0;b=0-k|0;w=(e|0)<1;x=p;p=0;a:while(1){if(r){y=1<<p;z=(p|0)!=0|w;A=0;B=0;while(1){if(!z){C=0;do{D=Va(c[j>>2]|0,s)|0;if((D|0)==-1){E=26;break a}if((D|0)>=(c[a>>2]|0)){E=26;break a}F=c[(c[t>>2]|0)+(D<<2)>>2]|0;c[(c[o+(C<<2)>>2]|0)+(B<<2)>>2]=F;C=C+1|0;if(!F){E=26;break a}}while((C|0)<(e|0))}do if(u&(A|0)<(m|0)){if(n){G=A;H=0}else{C=A-m|0;I=A-(C>>>0<b>>>0?b:C)|0;break}while(1){C=R(G,i)|0;F=0;do{D=(c[h>>2]|0)+C|0;J=c[(c[(c[o+(F<<2)>>2]|0)+(B<<2)>>2]|0)+(H<<2)>>2]|0;if((c[h+24+(J<<2)>>2]&y|0?(K=c[(c[(c[v>>2]|0)+(J<<2)>>2]|0)+(p<<2)>>2]|0,K|0):0)?(qa[f&7](K,(c[d+(F<<2)>>2]|0)+(D<<2)|0,s,i)|0)==-1:0){E=26;break a}F=F+1|0}while((F|0)<(e|0));H=H+1|0;F=G+1|0;if(!((H|0)<(k|0)&(F|0)<(m|0))){I=F;break}else G=F}}else I=A;while(0);if((I|0)<(m|0)){A=I;B=B+1|0}else break}L=c[q>>2]|0}else L=x;p=p+1|0;if((p|0)>=(L|0)){E=26;break}else x=L}if((E|0)==26){l=g;return}}function mb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;Ga(b,c[a>>2]|0,24);Ga(b,c[a+4>>2]|0,24);Ga(b,(c[a+8>>2]|0)+-1|0,24);d=a+12|0;Ga(b,(c[d>>2]|0)+-1|0,6);Ga(b,c[a+20>>2]|0,8);if((c[d>>2]|0)<=0)return;e=a+24|0;f=0;g=0;do{h=e+(g<<2)|0;i=c[h>>2]|0;if(i){j=0;k=i;while(1){k=k>>>1;if(!k)break;else j=j+1|0}if((j|0)>2){Ga(b,i,3);Ga(b,1,1);Ga(b,c[h>>2]>>3,5)}else l=9}else l=9;if((l|0)==9){l=0;Ga(b,i,4)}k=c[h>>2]|0;if(!k)m=0;else{n=0;o=k;while(1){k=(o&1)+n|0;o=o>>>1;if(!o){m=k;break}else n=k}}f=m+f|0;g=g+1|0}while((g|0)<(c[d>>2]|0));if((f|0)<=0)return;d=a+280|0;a=0;do{Ga(b,c[d+(a<<2)>>2]|0,8);a=a+1|0}while((a|0)!=(f|0));return}function nb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if((f|0)>0){g=0;h=0}else{i=0;return i|0}while(1){if(!(c[e+(g<<2)>>2]|0))j=h;else{c[d+(h<<2)>>2]=c[d+(g<<2)>>2];j=h+1|0}g=g+1|0;if((g|0)==(f|0))break;else h=j}if(!j){i=0;return i|0}h=c[b>>2]|0;f=c[h+8>>2]|0;g=c[h+12>>2]|0;e=((c[h+4>>2]|0)-(c[h>>2]|0)|0)/(f|0)|0;k=Ua(a,j<<2)|0;l=100.0/+(f|0);m=(j|0)>0;if(m){n=e<<2;o=0;do{p=Ua(a,n)|0;c[k+(o<<2)>>2]=p;id(p|0,0,n|0)|0;o=o+1|0}while((o|0)!=(j|0))}if((e|0)>0){o=(f|0)>0;n=g+-1|0;a=(g|0)>1;g=0;do{p=R(g,f)|0;q=(c[h>>2]|0)+p|0;a:do if(m){if(!o){if(a)r=0;else{p=0;while(1){c[(c[k+(p<<2)>>2]|0)+(g<<2)>>2]=0;p=p+1|0;if((p|0)==(j|0))break a}}while(1){p=0;while(1){if((c[h+2328+(p<<2)>>2]|0)>=0?c[h+2584+(p<<2)>>2]|0:0){s=p;break}t=p+1|0;if((t|0)<(n|0))p=t;else{s=t;break}}c[(c[k+(r<<2)>>2]|0)+(g<<2)>>2]=s;r=r+1|0;if((r|0)==(j|0))break a}}if(a)u=0;else{p=0;while(1){c[(c[k+(p<<2)>>2]|0)+(g<<2)>>2]=0;p=p+1|0;if((p|0)==(j|0))break a}}do{p=c[d+(u<<2)>>2]|0;t=0;v=0;w=0;do{x=c[p+(q+v<<2)>>2]|0;y=(x|0)>-1?x:0-x|0;w=(y|0)>(w|0)?y:w;t=y+t|0;v=v+1|0}while((v|0)!=(f|0));v=~~(+(t|0)*l);p=0;while(1){if((w|0)<=(c[h+2328+(p<<2)>>2]|0)?(y=c[h+2584+(p<<2)>>2]|0,(y|0)<0|(v|0)<(y|0)):0){z=p;break}y=p+1|0;if((y|0)<(n|0))p=y;else{z=y;break}}c[(c[k+(u<<2)>>2]|0)+(g<<2)>>2]=z;u=u+1|0}while((u|0)!=(j|0))}while(0);g=g+1|0}while((g|0)!=(e|0))}e=b+40|0;c[e>>2]=(c[e>>2]|0)+1;i=k;return i|0}function ob(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0;if((g|0)>0){j=0;k=0}else return 0;while(1){if(!(c[f+(j<<2)>>2]|0))l=k;else{c[e+(k<<2)>>2]=c[e+(j<<2)>>2];l=k+1|0}j=j+1|0;if((j|0)==(g|0))break;else k=l}if(!l)return 0;rb(a,d,e,l,h);return 0}function pb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;if((f|0)>0){g=0;h=0}else return 0;while(1){if(!(c[e+(g<<2)>>2]|0))i=h;else{c[d+(h<<2)>>2]=c[d+(g<<2)>>2];i=h+1|0}g=g+1|0;if((g|0)==(f|0))break;else h=i}if(!i)return 0;lb(a,b,d,i,4);return 0}function qb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;if((c[a+8>>2]|0)<=0){f=0;return f|0}if((c[a>>2]|0)>8){if((e|0)<=0){f=0;return f|0}h=a+16|0;i=0;while(1){j=Wa(a,d)|0;if((j|0)==-1){f=-1;k=29;break}l=c[a>>2]|0;m=(c[h>>2]|0)+((R(l,j)|0)<<2)|0;if((l|0)>0){j=i;n=0;while(1){o=b+(j<<2)|0;g[o>>2]=+g[o>>2]+ +g[m+(n<<2)>>2];n=n+1|0;if((n|0)==(l|0))break;else j=j+1|0}p=i+l|0}else p=i;if((p|0)<(e|0))i=p;else{f=0;k=29;break}}if((k|0)==29)return f|0}p=a+16|0;if((e|0)>0)q=0;else{f=0;return f|0}a:while(1){b:while(1){r=Wa(a,d)|0;if((r|0)==-1){f=-1;k=29;break a}s=c[p>>2]|0;switch(c[a>>2]|0){case 8:{k=21;break b;break}case 7:{k=22;break b;break}case 6:{k=23;break b;break}case 5:{k=24;break b;break}case 4:{k=25;break b;break}case 3:{k=26;break b;break}case 2:{k=27;break b;break}case 1:{k=28;break b;break}default:{}}}if((k|0)==21){k=0;l=s+(r<<3<<2)|0;i=b+(q<<2)|0;g[i>>2]=+g[i>>2]+ +g[l>>2];t=l;u=q+1|0;v=1;k=11}else if((k|0)==22){k=0;t=s+(r*7<<2)|0;u=q;v=0;k=11}else if((k|0)==23){k=0;w=s+(r*6<<2)|0;x=q;y=0;k=12}else if((k|0)==24){k=0;z=s+(r*5<<2)|0;A=q;B=0;k=13}else if((k|0)==25){k=0;C=s+(r<<2<<2)|0;D=q;E=0;k=14}else if((k|0)==26){k=0;F=s+(r*3<<2)|0;G=q;H=0;k=15}else if((k|0)==27){k=0;I=s+(r<<1<<2)|0;J=q;K=0;k=16}else if((k|0)==28){k=0;L=s+(r<<2)|0;M=q;N=0}if((k|0)==11){k=0;l=b+(u<<2)|0;g[l>>2]=+g[l>>2]+ +g[t+(v<<2)>>2];w=t;x=u+1|0;y=v+1|0;k=12}if((k|0)==12){k=0;l=b+(x<<2)|0;g[l>>2]=+g[l>>2]+ +g[w+(y<<2)>>2];z=w;A=x+1|0;B=y+1|0;k=13}if((k|0)==13){k=0;l=b+(A<<2)|0;g[l>>2]=+g[l>>2]+ +g[z+(B<<2)>>2];C=z;D=A+1|0;E=B+1|0;k=14}if((k|0)==14){k=0;l=b+(D<<2)|0;g[l>>2]=+g[l>>2]+ +g[C+(E<<2)>>2];F=C;G=D+1|0;H=E+1|0;k=15}if((k|0)==15){k=0;l=b+(G<<2)|0;g[l>>2]=+g[l>>2]+ +g[F+(H<<2)>>2];I=F;J=G+1|0;K=H+1|0;k=16}if((k|0)==16){k=0;l=b+(J<<2)|0;g[l>>2]=+g[l>>2]+ +g[I+(K<<2)>>2];L=I;M=J+1|0;N=K+1|0}q=M+1|0;l=b+(M<<2)|0;g[l>>2]=+g[l>>2]+ +g[L+(N<<2)>>2];if((q|0)>=(e|0)){f=0;k=29;break}}if((k|0)==29)return f|0;return 0}function rb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;g=l;l=l+1088|0;h=g+1056|0;i=g+1024|0;j=g+512|0;k=g;m=c[b>>2]|0;n=c[m+8>>2]|0;o=c[m+12>>2]|0;p=b+16|0;q=c[c[p>>2]>>2]|0;r=((c[m+4>>2]|0)-(c[m>>2]|0)|0)/(n|0)|0;id(j|0,0,512)|0;id(k|0,0,512)|0;s=b+8|0;t=c[s>>2]|0;if((t|0)<=0){l=g;return}u=(r|0)>0;v=(q|0)>1;w=b+36|0;x=(q|0)>0;y=(e|0)>0;z=b+20|0;A=b+32|0;b=(e|0)<1;B=t;t=0;while(1){if(u){C=(t|0)==0;D=1<<t;E=b|C^1;F=0;while(1){a:do if(!E){if(v)G=0;else{H=0;while(1){I=c[(c[f+(H<<2)>>2]|0)+(F<<2)>>2]|0;J=c[p>>2]|0;if((I|0)<(c[J+4>>2]|0)){K=sb(J,I,a)|0;c[w>>2]=(c[w>>2]|0)+K}H=H+1|0;if((H|0)==(e|0))break a}}do{H=c[f+(G<<2)>>2]|0;K=1;I=c[H+(F<<2)>>2]|0;while(1){J=R(I,o)|0;L=K+F|0;if((L|0)<(r|0))M=(c[H+(L<<2)>>2]|0)+J|0;else M=J;K=K+1|0;if((K|0)==(q|0))break;else I=M}I=c[p>>2]|0;if((M|0)<(c[I+4>>2]|0)){K=sb(I,M,a)|0;c[w>>2]=(c[w>>2]|0)+K}G=G+1|0}while((G|0)!=(e|0))}while(0);if(x&(F|0)<(r|0)){K=F;I=0;while(1){H=R(K,n)|0;J=(c[m>>2]|0)+H|0;if(y){H=0;do{L=f+(H<<2)|0;N=c[L>>2]|0;O=c[N+(K<<2)>>2]|0;P=k+(O<<2)|0;if(C)c[P>>2]=(c[P>>2]|0)+n;if(c[m+24+(O<<2)>>2]&D|0?(P=c[(c[(c[z>>2]|0)+(O<<2)>>2]|0)+(t<<2)>>2]|0,P|0):0){O=(c[d+(H<<2)>>2]|0)+(J<<2)|0;Q=c[P>>2]|0;S=(n|0)/(Q|0)|0;if((S|0)>0){T=P+48|0;U=P+52|0;V=P+44|0;W=P+12|0;X=P+4|0;Y=Q;Z=0;_=0;while(1){$=O+((R(_,Q)|0)<<2)|0;aa=c[T>>2]|0;ba=c[U>>2]|0;ca=c[V>>2]|0;da=ca>>1;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;c[h+28>>2]=0;ea=(Y|0)>0;do if((ba|0)==1){if(!ea){fa=0;break}ga=ca+-1|0;md(h|0,$|0,Y<<2|0)|0;ha=0;ia=0;ja=Y;while(1){ja=ja+-1|0;ka=(c[$+(ja<<2)>>2]|0)-aa|0;if((ka|0)<(da|0))la=(da-ka<<1)+-1|0;else la=ka-da<<1;ka=R(ia,ca)|0;ma=((la|0)<0?0:(la|0)>=(ca|0)?ga:la)+ka|0;ha=ha+1|0;if((ha|0)==(Y|0)){fa=ma;break}else ia=ma}}else{if(!ea){fa=0;break}ia=(ba>>1)-aa|0;ha=ca+-1|0;ga=0;ja=0;ma=Y;while(1){ma=ma+-1|0;ka=(ia+(c[$+(ma<<2)>>2]|0)|0)/(ba|0)|0;if((ka|0)<(da|0))na=(da-ka<<1)+-1|0;else na=ka-da<<1;oa=R(ja,ca)|0;pa=((na|0)<0?0:(na|0)>=(ca|0)?ha:na)+oa|0;c[h+(ma<<2)>>2]=(R(ka,ba)|0)+aa;ga=ga+1|0;if((ga|0)==(Y|0)){fa=pa;break}else ja=pa}}while(0);da=c[(c[W>>2]|0)+8>>2]|0;if((c[da+(fa<<2)>>2]|0)<1){c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[i+16>>2]=0;c[i+20>>2]=0;c[i+24>>2]=0;c[i+28>>2]=0;ja=(R(ca+-1|0,ba)|0)+aa|0;ga=c[X>>2]|0;b:do if((ga|0)>0){if(ea){qa=-1;ra=0;sa=fa}else{ma=-1;ha=0;ia=fa;while(1){do if((c[da+(ha<<2)>>2]|0)>0){if(!((ma|0)==-1|(ma|0)>0)){ta=ma;ua=ia;break};c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[h+16>>2]=c[i+16>>2];c[h+20>>2]=c[i+20>>2];c[h+24>>2]=c[i+24>>2];c[h+28>>2]=c[i+28>>2];ta=0;ua=ha}else{ta=ma;ua=ia}while(0);pa=c[i>>2]|0;if((pa|0)<(ja|0)){va=pa;wa=i}else{pa=i;ka=0;while(1){ka=ka+1|0;c[pa>>2]=0;oa=i+(ka<<2)|0;xa=c[oa>>2]|0;if((xa|0)<(ja|0)){va=xa;wa=oa;break}else pa=oa}}pa=va+ba|0;if((va|0)>-1){c[wa>>2]=pa;ya=pa}else ya=va;c[wa>>2]=0-ya;ha=ha+1|0;if((ha|0)==(ga|0)){za=ua;break b}else{ma=ta;ia=ua}}}while(1){do if((c[da+(ra<<2)>>2]|0)>0){ia=0;ma=0;do{ha=(c[i+(ia<<2)>>2]|0)-(c[$+(ia<<2)>>2]|0)|0;ma=(R(ha,ha)|0)+ma|0;ia=ia+1|0}while((ia|0)!=(Y|0));if(!((qa|0)==-1|(ma|0)<(qa|0))){Aa=qa;Ba=sa;break};c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[h+16>>2]=c[i+16>>2];c[h+20>>2]=c[i+20>>2];c[h+24>>2]=c[i+24>>2];c[h+28>>2]=c[i+28>>2];Aa=ma;Ba=ra}else{Aa=qa;Ba=sa}while(0);ia=c[i>>2]|0;if((ia|0)<(ja|0)){Ca=ia;Da=i}else{ia=i;ha=0;while(1){ha=ha+1|0;c[ia>>2]=0;pa=i+(ha<<2)|0;ka=c[pa>>2]|0;if((ka|0)<(ja|0)){Ca=ka;Da=pa;break}else ia=pa}}ia=Ca+ba|0;if((Ca|0)>-1){c[Da>>2]=ia;Ea=ia}else Ea=Ca;c[Da>>2]=0-Ea;ra=ra+1|0;if((ra|0)==(ga|0)){za=Ba;break}else{qa=Aa;sa=Ba}}}else za=fa;while(0);Fa=za}else Fa=fa;if(ea&(Fa|0)>-1){ga=$;ba=0;while(1){c[ga>>2]=(c[ga>>2]|0)-(c[h+(ba<<2)>>2]|0);ba=ba+1|0;if((ba|0)==(Y|0))break;else ga=ga+4|0}}Ga=(sb(P,Fa,a)|0)+Z|0;ga=_+1|0;if((ga|0)==(S|0))break;Y=c[P>>2]|0;Z=Ga;_=ga}Ha=c[L>>2]|0;Ia=Ga}else{Ha=N;Ia=0}c[A>>2]=(c[A>>2]|0)+Ia;_=j+(c[Ha+(K<<2)>>2]<<2)|0;c[_>>2]=(c[_>>2]|0)+Ia}H=H+1|0}while((H|0)!=(e|0))}I=I+1|0;H=K+1|0;if(!((I|0)<(q|0)&(H|0)<(r|0))){Ja=H;break}else K=H}}else Ja=F;if((Ja|0)<(r|0))F=Ja;else break}Ka=c[s>>2]|0}else Ka=B;t=t+1|0;if((t|0)>=(Ka|0))break;else B=Ka}l=g;return}function sb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((b|0)<0){e=0;return e|0}f=a+12|0;g=c[f>>2]|0;if((c[g+4>>2]|0)<=(b|0)){e=0;return e|0}Ga(d,c[(c[a+20>>2]|0)+(b<<2)>>2]|0,c[(c[g+8>>2]|0)+(b<<2)>>2]|0);e=c[(c[(c[f>>2]|0)+8>>2]|0)+(b<<2)>>2]|0;return e|0}function tb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;if((f|0)>0){g=0;h=0}else{i=0;return i|0}do{h=((c[e+(g<<2)>>2]|0)!=0&1)+h|0;g=g+1|0}while((g|0)!=(f|0));if(!h){i=0;return i|0}h=c[b>>2]|0;g=c[h+8>>2]|0;e=c[h+12>>2]|0;j=((c[h+4>>2]|0)-(c[h>>2]|0)|0)/(g|0)|0;k=Ua(a,4)|0;l=j<<2;m=Ua(a,l)|0;c[k>>2]=m;id(m|0,0,l|0)|0;a:do if((j|0)>0){m=e+-1|0;a=(e|0)>1;n=c[k>>2]|0;if((g|0)<=0){if(a)o=0;else{id(n|0,0,l|0)|0;break}while(1){p=0;while(1){if((c[h+2328+(p<<2)>>2]|0)>=0?(c[h+2584+(p<<2)>>2]|0)>=0:0){q=p;break}r=p+1|0;if((r|0)<(m|0))p=r;else{q=r;break}}c[n+(o<<2)>>2]=q;o=o+1|0;if((o|0)==(j|0))break a}}p=(c[h>>2]|0)/(f|0)|0;r=c[d>>2]|0;if((f|0)>1){s=0;t=p}else{u=0;v=p;while(1){p=0;w=v;x=0;do{y=c[r+(w<<2)>>2]|0;z=(y|0)>-1?y:0-y|0;x=(z|0)>(x|0)?z:x;w=w+1|0;p=p+f|0}while((p|0)<(g|0));b:do if(a){p=0;while(1){if((x|0)<=(c[h+2328+(p<<2)>>2]|0)?(c[h+2584+(p<<2)>>2]|0)>=0:0){A=p;break b}z=p+1|0;if((z|0)<(m|0))p=z;else{A=z;break}}}else A=0;while(0);c[n+(u<<2)>>2]=A;u=u+1|0;if((u|0)==(j|0))break a;else v=w}}while(1){v=0;u=0;x=t;p=0;while(1){z=c[r+(x<<2)>>2]|0;y=(z|0)>-1?z:0-z|0;B=v;z=1;do{C=c[(c[d+(z<<2)>>2]|0)+(x<<2)>>2]|0;D=(C|0)>-1?C:0-C|0;B=(D|0)>(B|0)?D:B;z=z+1|0}while((z|0)!=(f|0));p=(y|0)>(p|0)?y:p;x=x+1|0;u=u+f|0;if((u|0)>=(g|0))break;else v=B}c:do if(a){v=0;while(1){if((p|0)<=(c[h+2328+(v<<2)>>2]|0)?(B|0)<=(c[h+2584+(v<<2)>>2]|0):0){E=v;break c}u=v+1|0;if((u|0)<(m|0))v=u;else{E=u;break}}}else E=0;while(0);c[n+(s<<2)>>2]=E;s=s+1|0;if((s|0)==(j|0))break;else t=x}}while(0);t=b+40|0;c[t>>2]=(c[t>>2]|0)+1;i=k;return i|0}function ub(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=l;l=l+16|0;j=i;k=c[b+36>>2]|0;m=(k|0)/2|0;n=Ua(b,R(g<<2,m)|0)|0;c[j>>2]=n;if((g|0)<=0){l=i;return 0}if((k|0)>1){k=0;b=0;while(1){o=c[e+(k<<2)>>2]|0;p=(c[f+(k<<2)>>2]|0)!=0&1;q=0;r=k;while(1){c[n+(r<<2)>>2]=c[o+(q<<2)>>2];q=q+1|0;if((q|0)>=(m|0))break;else r=r+g|0}r=p+b|0;k=k+1|0;if((k|0)==(g|0)){s=r;break}else b=r}}else{b=0;k=0;while(1){m=((c[f+(b<<2)>>2]|0)!=0&1)+k|0;b=b+1|0;if((b|0)==(g|0)){s=m;break}else k=m}}if(!s){l=i;return 0}rb(a,d,j,1,h);l=i;return 0}function vb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=c[b>>2]|0;h=c[g+8>>2]|0;i=b+16|0;j=c[c[i>>2]>>2]|0;k=(R(c[a+36>>2]|0,f)|0)>>1;l=c[g+4>>2]|0;m=((l|0)<(k|0)?l:k)-(c[g>>2]|0)|0;if((m|0)<=0)return 0;k=(m|0)/(h|0)|0;m=Ua(a,((j+-1+k|0)/(j|0)|0)<<2)|0;a:do if((f|0)>0){l=0;while(1){if(c[e+(l<<2)>>2]|0){n=l;break a}o=l+1|0;if((o|0)<(f|0))l=o;else{n=o;break}}}else n=0;while(0);if((n|0)==(f|0))return 0;n=b+8|0;if((c[n>>2]|0)<=0)return 0;e=(k|0)>0;l=a+4|0;a=g+16|0;o=b+28|0;p=(j|0)>0;q=b+20|0;b=0;b:while(1){c:do if(e){r=1<<b;if(!b){s=0;t=0}else{u=0;v=0;while(1){if(p&(u|0)<(k|0)){w=m+(v<<2)|0;x=u;y=0;while(1){z=c[(c[w>>2]|0)+(y<<2)>>2]|0;if((c[g+24+(z<<2)>>2]&r|0?(A=c[(c[(c[q>>2]|0)+(z<<2)>>2]|0)+(b<<2)>>2]|0,A|0):0)?(z=R(x,h)|0,(wb(A,d,(c[g>>2]|0)+z|0,f,l,h)|0)==-1):0){B=28;break b}y=y+1|0;z=x+1|0;if(!((y|0)<(j|0)&(z|0)<(k|0))){C=z;break}else x=z}}else C=u;if((C|0)<(k|0)){u=C;v=v+1|0}else break c}}while(1){v=Va(c[i>>2]|0,l)|0;if((v|0)==-1){B=28;break b}if((v|0)>=(c[a>>2]|0)){B=28;break b}u=c[(c[o>>2]|0)+(v<<2)>>2]|0;v=m+(t<<2)|0;c[v>>2]=u;if(!u){B=28;break b}d:do if(p&(s|0)<(k|0)){x=u;y=s;w=0;while(1){z=c[x+(w<<2)>>2]|0;if((c[g+24+(z<<2)>>2]&r|0?(A=c[c[(c[q>>2]|0)+(z<<2)>>2]>>2]|0,A|0):0)?(z=R(y,h)|0,(wb(A,d,(c[g>>2]|0)+z|0,f,l,h)|0)==-1):0){B=28;break b}z=w+1|0;A=y+1|0;if(!((z|0)<(j|0)&(A|0)<(k|0))){D=A;break d}x=c[v>>2]|0;y=A;w=z}}else D=s;while(0);if((D|0)<(k|0)){s=D;t=t+1|0}else break}}while(0);b=b+1|0;if((b|0)>=(c[n>>2]|0)){B=28;break}}if((B|0)==28)return 0;return 0}function wb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((c[a+8>>2]|0)<=0){i=0;return i|0}j=(d|0)/(e|0)|0;k=(h+d|0)/(e|0)|0;if((j|0)>=(k|0)){i=0;return i|0}d=a+16|0;h=0;l=j;while(1){j=Wa(a,f)|0;if((j|0)==-1){i=-1;m=8;break}n=c[a>>2]|0;o=(c[d>>2]|0)+((R(n,j)|0)<<2)|0;if((n|0)>0){j=h;p=l;q=0;while(1){r=j+1|0;s=(c[b+(j<<2)>>2]|0)+(p<<2)|0;g[s>>2]=+g[s>>2]+ +g[o+(q<<2)>>2];s=(r|0)==(e|0);t=(s&1)+p|0;u=s?0:r;q=q+1|0;if((q|0)==(n|0)){v=u;w=t;break}else{j=u;p=t}}}else{v=h;w=l}if((w|0)<(k|0)){h=v;l=w}else{i=0;m=8;break}}if((m|0)==8)return i|0;return 0}function xb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((c[b>>2]|0)>1){Ga(d,1,1);Ga(d,(c[b>>2]|0)+-1|0,4)}else Ga(d,0,1);e=b+1156|0;if((c[e>>2]|0)>0){Ga(d,1,1);Ga(d,(c[e>>2]|0)+-1|0,8);if((c[e>>2]|0)>0){f=b+1160|0;g=a+4|0;h=b+2184|0;i=0;do{j=c[f+(i<<2)>>2]|0;k=c[g>>2]|0;l=k+-1|0;if((k|0)==0|(l|0)==0)m=0;else{k=0;n=l;while(1){l=k+1|0;n=n>>>1;if(!n){m=l;break}else k=l}}Ga(d,j,m);k=c[h+(i<<2)>>2]|0;n=c[g>>2]|0;l=n+-1|0;if((n|0)==0|(l|0)==0)o=0;else{n=0;p=l;while(1){l=n+1|0;p=p>>>1;if(!p){o=l;break}else n=l}}Ga(d,k,o);i=i+1|0}while((i|0)<(c[e>>2]|0))}}else Ga(d,0,1);Ga(d,0,2);e=c[b>>2]|0;if((e|0)>1){i=a+4|0;if((c[i>>2]|0)>0){a=b+4|0;o=0;do{Ga(d,c[a+(o<<2)>>2]|0,4);o=o+1|0}while((o|0)<(c[i>>2]|0));q=c[b>>2]|0;r=17}}else{q=e;r=17}if((r|0)==17?(q|0)<=0:0)return;q=b+1028|0;r=b+1092|0;e=0;do{Ga(d,0,8);Ga(d,c[q+(e<<2)>>2]|0,8);Ga(d,c[r+(e<<2)>>2]|0,8);e=e+1|0}while((e|0)<(c[b>>2]|0));return}function yb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=bd(1,3208)|0;e=c[a+28>>2]|0;id(d|0,0,3208)|0;f=La(b,1)|0;a:do if((f|0)<0){if(!d){g=0;return g|0}}else{if(f){h=La(b,4)|0;c[d>>2]=h+1;if((h|0)<0)break}else c[d>>2]=1;h=La(b,1)|0;if((h|0)>=0){if(h|0){h=La(b,8)|0;i=d+1156|0;c[i>>2]=h+1;if((h|0)<0)break;h=a+4|0;j=d+1160|0;k=d+2184|0;l=c[h>>2]|0;m=0;do{n=l+-1|0;if((l|0)==0|(n|0)==0)o=0;else{p=0;q=n;while(1){n=p+1|0;q=q>>>1;if(!q){o=n;break}else p=n}}p=La(b,o)|0;c[j+(m<<2)>>2]=p;q=c[h>>2]|0;n=q+-1|0;if((q|0)==0|(n|0)==0)r=0;else{q=0;s=n;while(1){n=q+1|0;s=s>>>1;if(!s){r=n;break}else q=n}}q=La(b,r)|0;c[k+(m<<2)>>2]=q;if((p|0)==(q|0)|(q|p|0)<0)break a;l=c[h>>2]|0;m=m+1|0;if(!((p|0)<(l|0)&(q|0)<(l|0)))break a}while((m|0)<(c[i>>2]|0))}if(!(La(b,2)|0)){i=c[d>>2]|0;if((i|0)>1){m=a+4|0;if((c[m>>2]|0)>0){l=d+4|0;h=0;while(1){k=La(b,4)|0;c[l+(h<<2)>>2]=k;j=c[d>>2]|0;h=h+1|0;if((k|0)<0|(k|0)>=(j|0))break a;if((h|0)>=(c[m>>2]|0)){t=j;u=20;break}}}}else{t=i;u=20}if((u|0)==20?(t|0)<=0:0){g=d;return g|0}m=d+1028|0;h=e+16|0;l=d+1092|0;j=e+20|0;k=0;while(1){La(b,8)|0;q=La(b,8)|0;c[m+(k<<2)>>2]=q;if((q|0)<0?1:(q|0)>=(c[h>>2]|0))break a;q=La(b,8)|0;c[l+(k<<2)>>2]=q;k=k+1|0;if((q|0)<0?1:(q|0)>=(c[j>>2]|0))break a;if((k|0)>=(c[d>>2]|0)){g=d;break}}return g|0}}}while(0);ad(d);g=0;return g|0}function zb(a){a=a|0;if(!a)return;ad(a);return}function Ab(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0.0,F=0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0.0,Q=0,R=0,S=0.0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;b=l;d=c[a+64>>2]|0;e=c[d+4>>2]|0;f=c[e+28>>2]|0;h=c[d+104>>2]|0;d=c[a+104>>2]|0;i=c[a+36>>2]|0;k=e+4|0;e=c[k>>2]<<2;m=l;l=l+((1*e|0)+15&-16)|0;n=Ua(a,e)|0;e=Ua(a,c[k>>2]<<2)|0;o=Ua(a,c[k>>2]<<2)|0;p=d+4|0;q=+g[p>>2];r=c[k>>2]|0;s=l;l=l+((1*(r<<2)|0)+15&-16)|0;t=a+28|0;u=c[t>>2]|0;v=c[f+544+(u<<2)>>2]|0;w=(c[h+56>>2]|0)+((c[d+8>>2]|0)*52|0)+((u|0?2:0)*52|0)|0;x=a+40|0;c[x>>2]=u;a:do if((r|0)>0){y=(i|0)/2|0;z=y<<2;A=+(((g[j>>2]=4.0/+(i|0),c[j>>2]|0)&2147483647)>>>0)*7.177114298428933e-07+-764.6162109375+.345;B=h+4|0;C=a+24|0;D=a+32|0;E=A+-764.6162109375;F=i+-1|0;G=A+-382.30810546875;if((F|0)>1){H=q;I=0}else{A=q;J=0;while(1){K=c[(c[a>>2]|0)+(J<<2)>>2]|0;c[e+(J<<2)>>2]=Ua(a,z)|0;L=n+(J<<2)|0;c[L>>2]=Ua(a,z)|0;Eb(K,B,f,c[C>>2]|0,c[t>>2]|0,c[D>>2]|0);Fb(c[c[h+12+(c[t>>2]<<2)>>2]>>2]|0,K,c[L>>2]|0);Gb(h+20+((c[t>>2]|0)*12|0)|0,K);M=E+ +((c[K>>2]&2147483647)>>>0)*7.177114298428933e-07+.345;g[K>>2]=M;N=M>0.0?0.0:M;g[s+(J<<2)>>2]=N;M=N>A?N:A;J=J+1|0;if((J|0)>=(c[k>>2]|0)){O=y;P=M;Q=z;break a}else A=M}}while(1){J=c[(c[a>>2]|0)+(I<<2)>>2]|0;c[e+(I<<2)>>2]=Ua(a,z)|0;K=n+(I<<2)|0;c[K>>2]=Ua(a,z)|0;Eb(J,B,f,c[C>>2]|0,c[t>>2]|0,c[D>>2]|0);Fb(c[c[h+12+(c[t>>2]<<2)>>2]>>2]|0,J,c[K>>2]|0);Gb(h+20+((c[t>>2]|0)*12|0)|0,J);A=E+ +((c[J>>2]&2147483647)>>>0)*7.177114298428933e-07+.345;g[J>>2]=A;K=s+(I<<2)|0;g[K>>2]=A;M=A;L=1;do{A=+g[J+(L<<2)>>2];R=L+1|0;N=+g[J+(R<<2)>>2];S=G+ +(((g[j>>2]=N*N+A*A,c[j>>2]|0)&2147483647)>>>0)*3.5885571492144663e-07+.345;g[J+(R>>1<<2)>>2]=S;M=S>M?S:M;L=L+2|0}while((L|0)<(F|0));S=M>0.0?0.0:M;g[K>>2]=S;A=S>H?S:H;I=I+1|0;if((I|0)>=(c[k>>2]|0)){O=y;P=A;Q=z;break}else H=A}}else{z=(i|0)/2|0;O=z;P=q;Q=z<<2}while(0);I=Ua(a,Q)|0;r=Ua(a,Q)|0;Q=c[k>>2]|0;b:do if((Q|0)>0){z=(i|0)>1;y=h+48|0;F=0;while(1){D=c[v+4+(F<<2)>>2]|0;C=c[n+(F<<2)>>2]|0;B=c[(c[a>>2]|0)+(F<<2)>>2]|0;L=B+(O<<2)|0;c[x>>2]=u;J=Ua(a,60)|0;R=o+(F<<2)|0;c[R>>2]=J;T=J;J=T+60|0;do{c[T>>2]=0;T=T+4|0}while((T|0)<(J|0));if(z){T=0;do{g[L+(T<<2)>>2]=+((c[C+(T<<2)>>2]&2147483647)>>>0)*7.177114298428933e-07+-764.6162109375+.345;T=T+1|0}while((T|0)<(O|0))}Hb(w,L,I);Ib(w,B,r,P,+g[s+(F<<2)>>2]);Jb(w,I,r,1,B,C,L);T=v+1028+(D<<2)|0;J=c[T>>2]|0;if((c[f+800+(J<<2)>>2]|0)!=1){U=-1;break}K=Kb(a,c[(c[y>>2]|0)+(J<<2)>>2]|0,L,B)|0;c[(c[R>>2]|0)+28>>2]=K;if(Lb(a)|0?c[(c[R>>2]|0)+28>>2]|0:0){Jb(w,I,r,2,B,C,L);K=Kb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,L,B)|0;c[(c[R>>2]|0)+56>>2]=K;Jb(w,I,r,0,B,C,L);K=Kb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,L,B)|0;c[c[R>>2]>>2]=K;K=c[R>>2]|0;J=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[K>>2]|0,c[K+28>>2]|0,9362)|0;c[(c[R>>2]|0)+4>>2]=J;J=c[R>>2]|0;K=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[J>>2]|0,c[J+28>>2]|0,18724)|0;c[(c[R>>2]|0)+8>>2]=K;K=c[R>>2]|0;J=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[K>>2]|0,c[K+28>>2]|0,28086)|0;c[(c[R>>2]|0)+12>>2]=J;J=c[R>>2]|0;K=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[J>>2]|0,c[J+28>>2]|0,37449)|0;c[(c[R>>2]|0)+16>>2]=K;K=c[R>>2]|0;J=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[K>>2]|0,c[K+28>>2]|0,46811)|0;c[(c[R>>2]|0)+20>>2]=J;J=c[R>>2]|0;K=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[J>>2]|0,c[J+28>>2]|0,56173)|0;c[(c[R>>2]|0)+24>>2]=K;K=c[R>>2]|0;J=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[K+28>>2]|0,c[K+56>>2]|0,9362)|0;c[(c[R>>2]|0)+32>>2]=J;J=c[R>>2]|0;K=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[J+28>>2]|0,c[J+56>>2]|0,18724)|0;c[(c[R>>2]|0)+36>>2]=K;K=c[R>>2]|0;J=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[K+28>>2]|0,c[K+56>>2]|0,28086)|0;c[(c[R>>2]|0)+40>>2]=J;J=c[R>>2]|0;K=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[J+28>>2]|0,c[J+56>>2]|0,37449)|0;c[(c[R>>2]|0)+44>>2]=K;K=c[R>>2]|0;J=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[K+28>>2]|0,c[K+56>>2]|0,46811)|0;c[(c[R>>2]|0)+48>>2]=J;J=c[R>>2]|0;K=Mb(a,c[(c[y>>2]|0)+(c[T>>2]<<2)>>2]|0,c[J+28>>2]|0,c[J+56>>2]|0,56173)|0;c[(c[R>>2]|0)+52>>2]=K}F=F+1|0;K=c[k>>2]|0;if((F|0)>=(K|0)){V=K;W=y;break b}}l=b;return U|0}else{V=Q;W=h+48|0}while(0);g[p>>2]=P;p=V<<2;V=l;l=l+((1*p|0)+15&-16)|0;Q=l;l=l+((1*p|0)+15&-16)|0;p=(Lb(a)|0)!=0;r=h+44|0;I=a+24|0;s=a+32|0;O=f+2868|0;x=h+52|0;h=p?0:7;while(1){p=c[d+12+(h<<2)>>2]|0;Ga(p,0,1);Ga(p,u,c[r>>2]|0);if(c[t>>2]|0){Ga(p,c[I>>2]|0,1);Ga(p,c[s>>2]|0,1)}i=c[k>>2]|0;if((i|0)>0){y=0;do{c[m+(y<<2)>>2]=Nb(p,a,c[(c[W>>2]|0)+(c[v+1028+(c[v+4+(y<<2)>>2]<<2)>>2]<<2)>>2]|0,c[(c[o+(y<<2)>>2]|0)+(h<<2)>>2]|0,c[e+(y<<2)>>2]|0)|0;y=y+1|0;F=c[k>>2]|0}while((y|0)<(F|0));X=F}else X=i;Ob(h,O,w,v,n,e,m,c[f+3240+((c[t>>2]|0)*60|0)+(h<<2)>>2]|0,X);if((c[v>>2]|0)>0){y=0;do{F=c[v+1092+(y<<2)>>2]|0;z=c[k>>2]|0;if((z|0)>0){K=z;z=0;J=0;while(1){if((c[v+4+(J<<2)>>2]|0)==(y|0)){c[Q+(z<<2)>>2]=(c[m+(J<<2)>>2]|0)!=0&1;c[V+(z<<2)>>2]=c[e+(J<<2)>>2];Y=c[k>>2]|0;Z=z+1|0}else{Y=K;Z=z}J=J+1|0;if((J|0)>=(Y|0)){_=Z;break}else{K=Y;z=Z}}}else _=0;z=f+1312+(F<<2)|0;K=xa[c[(c[464+(c[z>>2]<<2)>>2]|0)+20>>2]&7](a,c[(c[x>>2]|0)+(F<<2)>>2]|0,V,Q,_)|0;J=c[k>>2]|0;if((J|0)>0){R=0;B=0;while(1){if((c[v+4+(B<<2)>>2]|0)==(y|0)){c[V+(R<<2)>>2]=c[e+(B<<2)>>2];$=R+1|0}else $=R;B=B+1|0;if((B|0)>=(J|0)){aa=$;break}else R=$}}else aa=0;va[c[(c[464+(c[z>>2]<<2)>>2]|0)+24>>2]&3](p,a,c[(c[x>>2]|0)+(F<<2)>>2]|0,V,Q,aa,K,y)|0;y=y+1|0}while((y|0)<(c[v>>2]|0))}y=(Lb(a)|0)!=0;if((h|0)<((y?14:7)|0))h=h+1|0;else{U=0;break}}l=b;return U|0}function Bb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0.0,J=0;d=l;e=c[a+64>>2]|0;f=c[e+4>>2]|0;h=c[f+28>>2]|0;i=c[e+104>>2]|0;e=a+28|0;j=c[h+(c[e>>2]<<2)>>2]|0;c[a+36>>2]=j;k=f+4|0;f=c[k>>2]|0;m=f<<2;n=l;l=l+((1*m|0)+15&-16)|0;o=l;l=l+((1*m|0)+15&-16)|0;p=l;l=l+((1*m|0)+15&-16)|0;q=l;l=l+((1*m|0)+15&-16)|0;if((f|0)>0){m=b+4|0;r=b+1028|0;s=i+48|0;t=j<<1&2147483646;u=0;do{v=c[r+(c[m+(u<<2)>>2]<<2)>>2]|0;w=wa[c[(c[456+(c[h+800+(v<<2)>>2]<<2)>>2]|0)+20>>2]&15](a,c[(c[s>>2]|0)+(v<<2)>>2]|0)|0;c[q+(u<<2)>>2]=w;c[p+(u<<2)>>2]=(w|0)!=0&1;id(c[(c[a>>2]|0)+(u<<2)>>2]|0,0,t|0)|0;u=u+1|0;w=c[k>>2]|0}while((u|0)<(w|0));x=w}else x=f;f=b+1156|0;u=c[f>>2]|0;if((u|0)>0){t=b+1160|0;s=b+2184|0;m=0;do{r=p+(c[t+(m<<2)>>2]<<2)|0;w=p+(c[s+(m<<2)>>2]<<2)|0;if(!((c[r>>2]|0)==0?!(c[w>>2]|0):0)){c[r>>2]=1;c[w>>2]=1}m=m+1|0}while((m|0)<(u|0))}if((c[b>>2]|0)>0){m=b+1092|0;s=i+52|0;t=b+4|0;w=x;x=0;while(1){if((w|0)>0){r=w;v=0;y=0;while(1){if((c[t+(y<<2)>>2]|0)==(x|0)){c[o+(v<<2)>>2]=(c[p+(y<<2)>>2]|0)!=0&1;c[n+(v<<2)>>2]=c[(c[a>>2]|0)+(y<<2)>>2];z=c[k>>2]|0;A=v+1|0}else{z=r;A=v}y=y+1|0;if((y|0)>=(z|0)){B=A;break}else{r=z;v=A}}}else B=0;v=c[m+(x<<2)>>2]|0;xa[c[(c[464+(c[h+1312+(v<<2)>>2]<<2)>>2]|0)+28>>2]&7](a,c[(c[s>>2]|0)+(v<<2)>>2]|0,n,o,B)|0;v=x+1|0;if((v|0)>=(c[b>>2]|0))break;w=c[k>>2]|0;x=v}C=c[f>>2]|0}else C=u;if((C|0)>0?(u=c[a>>2]|0,f=b+1160|0,x=b+2184|0,w=(j|0)/2|0,(j|0)>1):0){j=C;do{C=j;j=j+-1|0;B=c[u+(c[f+(j<<2)>>2]<<2)>>2]|0;o=c[u+(c[x+(j<<2)>>2]<<2)>>2]|0;n=0;do{s=B+(n<<2)|0;D=+g[s>>2];m=o+(n<<2)|0;E=+g[m>>2];A=E>0.0;if(D>0.0){if(A){F=D-E;G=m}else{g[m>>2]=D;F=E+D;G=s}g[G>>2]=F}else{if(A){H=m;I=E+D}else{g[m>>2]=D;H=s;I=D-E}g[H>>2]=I}n=n+1|0}while((n|0)<(w|0))}while((C|0)>1)}if((c[k>>2]|0)<=0){l=d;return 0}w=b+4|0;H=b+1028|0;b=i+48|0;G=0;do{j=c[H+(c[w+(G<<2)>>2]<<2)>>2]|0;qa[c[(c[456+(c[h+800+(j<<2)>>2]<<2)>>2]|0)+24>>2]&7](a,c[(c[b>>2]|0)+(j<<2)>>2]|0,c[q+(G<<2)>>2]|0,c[(c[a>>2]|0)+(G<<2)>>2]|0)|0;G=G+1|0;J=c[k>>2]|0}while((G|0)<(J|0));if((J|0)<=0){l=d;return 0}J=0;do{G=c[(c[a>>2]|0)+(J<<2)>>2]|0;Cb(c[c[i+12+(c[e>>2]<<2)>>2]>>2]|0,G,G);J=J+1|0}while((J|0)<(c[k>>2]|0));l=d;return 0}function Cb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0;e=c[a>>2]|0;f=e>>1;h=e>>2;e=b+(f<<2)|0;i=d+(f<<2)|0;j=i+(h<<2)|0;k=a+8|0;l=c[k>>2]|0;m=l+(h<<2)|0;n=m;o=e+-28|0;p=j;while(1){q=p;p=p+-16|0;r=o+8|0;s=n+12|0;t=n+8|0;g[p>>2]=-(+g[r>>2]*+g[s>>2])-+g[t>>2]*+g[o>>2];g[q+-12>>2]=+g[s>>2]*+g[o>>2]-+g[t>>2]*+g[r>>2];r=o+24|0;t=n+4|0;s=o+16|0;g[q+-8>>2]=-(+g[r>>2]*+g[t>>2])-+g[n>>2]*+g[s>>2];g[q+-4>>2]=+g[t>>2]*+g[s>>2]-+g[n>>2]*+g[r>>2];o=o+-32|0;if(o>>>0<b>>>0)break;else n=n+16|0}n=m;m=e+-32|0;e=j;while(1){o=m+16|0;p=n+-4|0;r=m+24|0;s=n+-8|0;g[e>>2]=+g[s>>2]*+g[r>>2]+ +g[p>>2]*+g[o>>2];g[e+4>>2]=+g[s>>2]*+g[o>>2]-+g[p>>2]*+g[r>>2];r=n+-12|0;n=n+-16|0;p=m+8|0;g[e+8>>2]=+g[n>>2]*+g[p>>2]+ +g[r>>2]*+g[m>>2];g[e+12>>2]=+g[n>>2]*+g[m>>2]-+g[r>>2]*+g[p>>2];m=m+-32|0;if(m>>>0<b>>>0)break;else e=e+16|0}Db(c[a+4>>2]|0,l,i,f);l=c[a>>2]|0;e=c[k>>2]|0;k=d+(l>>1<<2)|0;b=e+(l<<2)|0;l=c[a+12>>2]|0;a=d;m=k;while(1){n=k+(c[l>>2]<<2)|0;p=k+(c[l+4>>2]<<2)|0;u=+g[n+4>>2];v=+g[p+4>>2];w=u-v;x=+g[n>>2];y=+g[p>>2];z=y+x;A=+g[b>>2];B=+g[b+4>>2];C=B*w+z*A;D=B*z-A*w;p=m;m=m+-16|0;w=(v+u)*.5;u=(x-y)*.5;g[a>>2]=C+w;g[p+-8>>2]=w-C;g[a+4>>2]=D+u;g[p+-4>>2]=D-u;n=k+(c[l+8>>2]<<2)|0;r=k+(c[l+12>>2]<<2)|0;u=+g[n+4>>2];D=+g[r+4>>2];C=u-D;w=+g[n>>2];y=+g[r>>2];x=y+w;v=+g[b+8>>2];A=+g[b+12>>2];z=A*C+x*v;B=A*x-v*C;C=(D+u)*.5;u=(w-y)*.5;g[a+8>>2]=z+C;g[m>>2]=C-z;g[a+12>>2]=B+u;g[p+-12>>2]=B-u;a=a+16|0;if(a>>>0>=m>>>0)break;else{b=b+16|0;l=l+16|0}}l=e+(f<<2)|0;f=d;e=j;b=j;while(1){m=l+4|0;a=f+4|0;g[e+-4>>2]=+g[m>>2]*+g[f>>2]-+g[l>>2]*+g[a>>2];g[b>>2]=-(+g[l>>2]*+g[f>>2]+ +g[m>>2]*+g[a>>2]);a=f+8|0;m=l+12|0;k=f+12|0;p=l+8|0;g[e+-8>>2]=+g[m>>2]*+g[a>>2]-+g[p>>2]*+g[k>>2];g[b+4>>2]=-(+g[p>>2]*+g[a>>2]+ +g[m>>2]*+g[k>>2]);k=f+16|0;m=l+20|0;a=f+20|0;p=l+16|0;g[e+-12>>2]=+g[m>>2]*+g[k>>2]-+g[p>>2]*+g[a>>2];e=e+-16|0;g[b+8>>2]=-(+g[p>>2]*+g[k>>2]+ +g[m>>2]*+g[a>>2]);a=f+24|0;m=l+28|0;k=f+28|0;p=l+24|0;g[e>>2]=+g[m>>2]*+g[a>>2]-+g[p>>2]*+g[k>>2];g[b+12>>2]=-(+g[p>>2]*+g[a>>2]+ +g[m>>2]*+g[k>>2]);f=f+32|0;if(f>>>0>=e>>>0)break;else{l=l+32|0;b=b+16|0}}b=d+(h<<2)|0;h=j;d=b;l=b;do{b=d;d=d+-16|0;u=+g[h+-4>>2];g[b+-4>>2]=u;g[l>>2]=-u;u=+g[h+-8>>2];g[b+-8>>2]=u;g[l+4>>2]=-u;u=+g[h+-12>>2];h=h+-16|0;g[b+-12>>2]=u;g[l+8>>2]=-u;u=+g[h>>2];g[d>>2]=u;g[l+12>>2]=-u;l=l+16|0}while(l>>>0<h>>>0);E=j;F=j;while(1){j=F;F=F+-16|0;c[F>>2]=c[E+12>>2];c[j+-12>>2]=c[E+8>>2];c[j+-8>>2]=c[E+4>>2];c[j+-4>>2]=c[E>>2];if(F>>>0<=i>>>0)break;else E=E+16|0}return}function Db(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0,Q=0,S=0.0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0;e=a+-6|0;if((a|0)>6){a=b;f=c+(d<<2)|0;h=c+(d>>1<<2)+-32|0;while(1){i=f;f=f+-32|0;j=i+-8|0;k=+g[j>>2];l=h+24|0;m=+g[l>>2];n=k-m;o=i+-4|0;p=+g[o>>2];q=h+28|0;r=p-+g[q>>2];g[j>>2]=m+k;g[o>>2]=+g[q>>2]+p;o=a+4|0;g[l>>2]=+g[a>>2]*n+ +g[o>>2]*r;g[q>>2]=+g[a>>2]*r-+g[o>>2]*n;o=i+-16|0;n=+g[o>>2];q=h+16|0;r=+g[q>>2];p=n-r;l=i+-12|0;k=+g[l>>2];j=h+20|0;m=k-+g[j>>2];g[o>>2]=r+n;g[l>>2]=+g[j>>2]+k;l=a+20|0;o=a+16|0;g[q>>2]=+g[o>>2]*p+ +g[l>>2]*m;g[j>>2]=+g[o>>2]*m-+g[l>>2]*p;l=i+-24|0;p=+g[l>>2];o=h+8|0;m=+g[o>>2];k=p-m;j=i+-20|0;n=+g[j>>2];q=h+12|0;r=n-+g[q>>2];g[l>>2]=m+p;g[j>>2]=+g[q>>2]+n;j=a+36|0;l=a+32|0;g[o>>2]=+g[l>>2]*k+ +g[j>>2]*r;g[q>>2]=+g[l>>2]*r-+g[j>>2]*k;k=+g[f>>2];r=+g[h>>2];n=k-r;j=i+-28|0;p=+g[j>>2];i=h+4|0;m=p-+g[i>>2];g[f>>2]=r+k;g[j>>2]=+g[i>>2]+p;j=a+52|0;l=a+48|0;g[h>>2]=+g[l>>2]*n+ +g[j>>2]*m;g[i>>2]=+g[l>>2]*m-+g[j>>2]*n;h=h+-32|0;if(h>>>0<c>>>0)break;else a=a+64|0}}if((e|0)>1){a=1;do{h=1<<a;if((a|0)!=31){f=d>>a;j=4<<a;l=f>>1;i=0;do{q=c+((R(i,f)|0)<<2)|0;o=b;s=q+(f<<2)|0;t=q+(l<<2)+-32|0;while(1){u=s;s=s+-32|0;v=u+-8|0;n=+g[v>>2];w=t+24|0;m=+g[w>>2];p=n-m;x=u+-4|0;k=+g[x>>2];y=t+28|0;r=k-+g[y>>2];g[v>>2]=m+n;g[x>>2]=+g[y>>2]+k;x=o+4|0;g[w>>2]=+g[o>>2]*p+ +g[x>>2]*r;g[y>>2]=+g[o>>2]*r-+g[x>>2]*p;x=o+(j<<2)|0;y=u+-16|0;p=+g[y>>2];w=t+16|0;r=+g[w>>2];k=p-r;v=u+-12|0;n=+g[v>>2];z=t+20|0;m=n-+g[z>>2];g[y>>2]=r+p;g[v>>2]=+g[z>>2]+n;v=x+4|0;g[w>>2]=+g[x>>2]*k+ +g[v>>2]*m;g[z>>2]=+g[x>>2]*m-+g[v>>2]*k;v=x+(j<<2)|0;x=u+-24|0;k=+g[x>>2];z=t+8|0;m=+g[z>>2];n=k-m;w=u+-20|0;p=+g[w>>2];y=t+12|0;r=p-+g[y>>2];g[x>>2]=m+k;g[w>>2]=+g[y>>2]+p;w=v+4|0;g[z>>2]=+g[v>>2]*n+ +g[w>>2]*r;g[y>>2]=+g[v>>2]*r-+g[w>>2]*n;w=v+(j<<2)|0;n=+g[s>>2];r=+g[t>>2];p=n-r;v=u+-28|0;k=+g[v>>2];u=t+4|0;m=k-+g[u>>2];g[s>>2]=r+n;g[v>>2]=+g[u>>2]+k;v=w+4|0;g[t>>2]=+g[w>>2]*p+ +g[v>>2]*m;g[u>>2]=+g[w>>2]*m-+g[v>>2]*p;t=t+-32|0;if(t>>>0<q>>>0)break;else o=w+(j<<2)|0}i=i+1|0}while((i|0)<(h|0))}a=a+1|0}while((a|0)!=(e|0))}if((d|0)>0)A=0;else return;do{e=c+(A<<2)|0;a=e+120|0;p=+g[a>>2];b=e+56|0;m=+g[b>>2];h=e+124|0;k=+g[h>>2];i=e+60|0;n=+g[i>>2];g[a>>2]=m+p;g[h>>2]=n+k;g[b>>2]=p-m;g[i>>2]=k-n;j=e+112|0;n=+g[j>>2];l=e+48|0;k=+g[l>>2];m=n-k;f=e+116|0;p=+g[f>>2];o=e+52|0;r=+g[o>>2];B=p-r;g[j>>2]=k+n;g[f>>2]=r+p;g[l>>2]=m*.9238795042037964-B*.3826834261417389;g[o>>2]=B*.9238795042037964+m*.3826834261417389;q=e+104|0;m=+g[q>>2];t=e+40|0;B=+g[t>>2];p=m-B;s=e+108|0;r=+g[s>>2];w=e+44|0;n=+g[w>>2];k=r-n;g[q>>2]=B+m;g[s>>2]=n+r;g[t>>2]=(p-k)*.7071067690849304;g[w>>2]=(k+p)*.7071067690849304;v=e+96|0;p=+g[v>>2];u=e+32|0;k=+g[u>>2];r=p-k;y=e+100|0;n=+g[y>>2];z=e+36|0;m=+g[z>>2];B=n-m;g[v>>2]=k+p;g[y>>2]=m+n;n=r*.3826834261417389-B*.9238795042037964;g[u>>2]=n;m=B*.3826834261417389+r*.9238795042037964;g[z>>2]=m;x=e+88|0;r=+g[x>>2];C=e+24|0;B=+g[C>>2];p=r-B;D=e+28|0;k=+g[D>>2];E=e+92|0;F=+g[E>>2];G=k-F;g[x>>2]=B+r;g[E>>2]=F+k;g[D>>2]=p;H=e+16|0;k=+g[H>>2];I=e+80|0;F=+g[I>>2];r=k-F;J=e+20|0;B=+g[J>>2];K=e+84|0;L=+g[K>>2];M=B-L;g[I>>2]=F+k;g[K>>2]=L+B;B=M*.9238795042037964+r*.3826834261417389;L=M*.3826834261417389-r*.9238795042037964;N=e+8|0;r=+g[N>>2];O=e+72|0;M=+g[O>>2];k=r-M;P=e+12|0;F=+g[P>>2];Q=e+76|0;S=+g[Q>>2];T=F-S;g[O>>2]=M+r;g[Q>>2]=S+F;F=(T+k)*.7071067690849304;S=(T-k)*.7071067690849304;k=+g[e>>2];U=e+64|0;T=+g[U>>2];r=k-T;V=e+4|0;M=+g[V>>2];W=e+68|0;X=+g[W>>2];Y=M-X;Z=T+k;g[U>>2]=Z;k=X+M;g[W>>2]=k;M=Y*.3826834261417389+r*.9238795042037964;X=Y*.9238795042037964-r*.3826834261417389;r=X-m;Y=M-n;T=M+n;n=X+m;m=Y+r;X=r-Y;Y=+g[w>>2];r=S-Y;M=+g[t>>2];_=M-F;$=M+F;F=Y+S;S=+g[l>>2];Y=S-B;M=+g[o>>2];aa=M-L;ba=S+B;B=M+L;L=Y-aa;M=aa+Y;Y=+g[b>>2];aa=Y-G;S=+g[i>>2];ca=S-p;da=Y+G;G=S+p;p=aa+r;S=aa-r;r=(L+m)*.7071067690849304;aa=(L-m)*.7071067690849304;g[C>>2]=r+p;g[H>>2]=p-r;r=(M-X)*.7071067690849304;p=ca-_;g[e>>2]=r+S;g[N>>2]=S-r;r=(M+X)*.7071067690849304;X=ca+_;g[P>>2]=p+aa;g[V>>2]=p-aa;g[D>>2]=X+r;g[J>>2]=X-r;r=da+$;X=da-$;$=ba+T;da=ba-T;g[b>>2]=r+$;g[l>>2]=r-$;$=B-n;r=G-F;g[u>>2]=X+$;g[t>>2]=X-$;$=B+n;n=G+F;g[w>>2]=r+da;g[z>>2]=r-da;g[i>>2]=n+$;g[o>>2]=n-$;$=+g[y>>2];n=k-$;da=+g[v>>2];r=Z-da;F=da+Z;Z=$+k;k=r+n;$=n-r;r=+g[Q>>2];n=+g[s>>2];da=r-n;G=+g[q>>2];B=+g[O>>2];X=G-B;T=B+G;G=n+r;r=+g[j>>2];n=+g[I>>2];B=r-n;ba=+g[f>>2];aa=+g[K>>2];p=ba-aa;_=n+r;r=aa+ba;ba=B-p;aa=p+B;B=+g[a>>2];p=+g[x>>2];n=B-p;ca=+g[h>>2];M=+g[E>>2];S=ca-M;m=p+B;B=M+ca;ca=n+da;M=n-da;da=(ba+k)*.7071067690849304;n=(ba-k)*.7071067690849304;g[x>>2]=da+ca;g[I>>2]=ca-da;da=(aa-$)*.7071067690849304;ca=S-X;g[U>>2]=da+M;g[O>>2]=M-da;da=(aa+$)*.7071067690849304;$=S+X;g[Q>>2]=ca+n;g[W>>2]=ca-n;g[E>>2]=$+da;g[K>>2]=$-da;da=m+T;$=m-T;T=_+F;m=_-F;g[a>>2]=da+T;g[j>>2]=da-T;T=r-Z;da=B-G;g[v>>2]=$+T;g[q>>2]=$-T;T=r+Z;Z=B+G;g[s>>2]=da+m;g[y>>2]=da-m;g[h>>2]=Z+T;g[f>>2]=Z-T;A=A+32|0}while((A|0)<(d|0));return}function Eb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;i=(f|0)!=0;j=i?e:0;e=i?h:0;h=c[1500+(c[b+(j<<2)>>2]<<2)>>2]|0;i=c[1500+(c[b+(e<<2)>>2]<<2)>>2]|0;b=c[d+(f<<2)>>2]|0;f=c[d+(j<<2)>>2]|0;j=c[d+(e<<2)>>2]|0;e=(b|0)/4|0;d=(f|0)/4|0;k=e-d|0;l=(f|0)/2|0;f=((b|0)/2|0)+e+((j|0)/-4|0)|0;m=(j|0)/2|0;n=f+m|0;if((k|0)>0){id(a|0,0,e-d<<2|0)|0;o=k}else o=0;if((o|0)<(k+l|0)){k=l+e-o-d|0;d=o;o=0;while(1){e=a+(d<<2)|0;g[e>>2]=+g[e>>2]*+g[h+(o<<2)>>2];o=o+1|0;if((o|0)==(k|0))break;else d=d+1|0}}if((j|0)>1){j=f;d=m;while(1){d=d+-1|0;m=a+(j<<2)|0;g[m>>2]=+g[m>>2]*+g[i+(d<<2)>>2];m=j+1|0;if((m|0)>=(n|0)){p=m;break}else j=m}}else p=f;if((b|0)<=(p|0))return;id(a+(p<<2)|0,0,b-p<<2|0)|0;return}function Fb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;e=l;f=c[a>>2]|0;h=f>>1;i=f>>2;j=f>>3;k=l;l=l+((1*(f<<2)|0)+15&-16)|0;m=k+(h<<2)|0;n=b+(h<<2)+(i<<2)|0;o=a+8|0;p=c[o>>2]|0;q=p+(h<<2)|0;if((j|0)>0){r=(j+-1|0)>>>1;s=i+h+-4-(r<<2)|0;t=r<<1;r=p+(h+-2-t<<2)|0;u=q;v=0;w=n;x=n+4|0;while(1){y=w;w=w+-16|0;z=u;u=u+-8|0;A=+g[x>>2]+ +g[y+-8>>2];B=+g[x+8>>2]+ +g[w>>2];y=z+-4|0;g[m+(v<<2)>>2]=+g[u>>2]*A+B*+g[y>>2];g[m+((v|1)<<2)>>2]=+g[u>>2]*B-+g[y>>2]*A;v=v+2|0;if((v|0)>=(j|0))break;else x=x+16|0}C=r;D=t+2|0;E=b+(s<<2)|0}else{C=q;D=0;E=n}n=b+4|0;q=h-j|0;if((D|0)<(q|0)){s=(h+-1-D-j|0)>>>1;j=s<<1;t=-2-j|0;r=(s<<2)+5|0;s=D+j|0;j=C;x=D;v=E;E=n;while(1){u=j;j=j+-8|0;A=+g[v+-8>>2]-+g[E>>2];v=v+-16|0;B=+g[v>>2]-+g[E+8>>2];w=u+-4|0;g[m+(x<<2)>>2]=+g[j>>2]*A+B*+g[w>>2];g[m+((x|1)<<2)>>2]=+g[j>>2]*B-+g[w>>2]*A;x=x+2|0;if((x|0)>=(q|0))break;else E=E+16|0}F=C+(t<<2)|0;G=s+2|0;H=b+(r<<2)|0}else{F=C;G=D;H=n}if((G|0)<(h|0)){n=F;F=G;G=b+(f<<2)|0;f=H;while(1){H=n;n=n+-8|0;A=-+g[G+-8>>2]-+g[f>>2];G=G+-16|0;B=-+g[G>>2]-+g[f+8>>2];b=H+-4|0;g[m+(F<<2)>>2]=+g[n>>2]*A+B*+g[b>>2];g[m+((F|1)<<2)>>2]=+g[n>>2]*B-+g[b>>2]*A;F=F+2|0;if((F|0)>=(h|0))break;else f=f+16|0}}Db(c[a+4>>2]|0,p,m,h);m=c[a>>2]|0;p=c[o>>2]|0;o=k+(m>>1<<2)|0;f=p+(m<<2)|0;m=c[a+12>>2]|0;F=k;n=o;while(1){G=o+(c[m>>2]<<2)|0;b=o+(c[m+4>>2]<<2)|0;A=+g[G+4>>2];B=+g[b+4>>2];I=A-B;J=+g[G>>2];K=+g[b>>2];L=K+J;M=+g[f>>2];N=+g[f+4>>2];O=N*I+L*M;P=N*L-M*I;b=n;n=n+-16|0;I=(B+A)*.5;A=(J-K)*.5;g[F>>2]=O+I;g[b+-8>>2]=I-O;g[F+4>>2]=P+A;g[b+-4>>2]=P-A;G=o+(c[m+8>>2]<<2)|0;H=o+(c[m+12>>2]<<2)|0;A=+g[G+4>>2];P=+g[H+4>>2];O=A-P;I=+g[G>>2];K=+g[H>>2];J=K+I;B=+g[f+8>>2];M=+g[f+12>>2];L=M*O+J*B;N=M*J-B*O;O=(P+A)*.5;A=(I-K)*.5;g[F+8>>2]=L+O;g[n>>2]=O-L;g[F+12>>2]=N+A;g[b+-12>>2]=N-A;F=F+16|0;if(F>>>0>=n>>>0)break;else{f=f+16|0;m=m+16|0}}if((i|0)<=0){l=e;return}m=a+16|0;a=p+(h<<2)|0;p=0;f=k;k=d+(h<<2)|0;while(1){k=k+-4|0;h=f+4|0;n=a+4|0;g[d+(p<<2)>>2]=(+g[n>>2]*+g[h>>2]+ +g[a>>2]*+g[f>>2])*+g[m>>2];g[k>>2]=(+g[n>>2]*+g[f>>2]-+g[a>>2]*+g[h>>2])*+g[m>>2];p=p+1|0;if((p|0)==(i|0))break;else{a=a+8|0;f=f+8|0}}l=e;return}function Gb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=c[a>>2]|0;if((d|0)==1)return;e=c[a+4>>2]|0;f=e+(d<<2)|0;g=c[a+8>>2]|0;a=c[g+4>>2]|0;if((a|0)<=0)return;h=a+1|0;i=d;j=0;k=d;l=1;while(1){m=c[g+(h-j<<2)>>2]|0;n=(d|0)/(k|0)|0;k=(k|0)/(m|0)|0;o=R(n,k)|0;i=i-(R(n,m+-1|0)|0)|0;p=1-l|0;a:do switch(m|0){case 4:{q=i+n|0;r=f+(i<<2)+-4|0;s=f+(q<<2)+-4|0;t=f+(q+n<<2)+-4|0;if(!p){Ub(n,k,b,e,r,s,t);u=0;break a}else{Ub(n,k,e,b,r,s,t);u=p;break a}break}case 2:{t=f+(i<<2)+-4|0;if(!p){Vb(n,k,b,e,t);u=0;break a}else{Vb(n,k,e,b,t);u=p;break a}break}default:{t=f+(i<<2)+-4|0;if(!(((n|0)==1?l:p)|0)){Wb(n,m,k,o,b,b,b,e,e,t);u=1;break a}else{Wb(n,m,k,o,e,e,e,b,b,t);u=0;break a}}}while(0);j=j+1|0;if((j|0)==(a|0))break;else l=u}if((d|0)>0&(u|0)!=1)v=0;else return;do{c[b+(v<<2)>>2]=c[e+(v<<2)>>2];v=v+1|0}while((v|0)!=(d|0));return}function Hb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0;e=l;f=c[a>>2]|0;h=l;l=l+((1*(f<<2)|0)+15&-16)|0;i=a+24|0;Tb(f,c[i>>2]|0,b,d,140.0,-1);j=(f|0)>0;if(j){k=0;do{g[h+(k<<2)>>2]=+g[b+(k<<2)>>2]-+g[d+(k<<2)>>2];k=k+1|0}while((k|0)!=(f|0))}k=a+4|0;Tb(f,c[i>>2]|0,h,d,0.0,c[(c[k>>2]|0)+128>>2]|0);if(j)m=0;else{l=e;return}do{i=h+(m<<2)|0;g[i>>2]=+g[b+(m<<2)>>2]-+g[i>>2];m=m+1|0}while((m|0)!=(f|0));if(!j){l=e;return}j=c[k>>2]|0;k=0;do{m=d+(k<<2)|0;b=~~(+g[m>>2]+.5);g[m>>2]=+g[j+336+(((b|0)>0?((b|0)<39?b:39):0)<<2)>>2]+ +g[h+(k<<2)>>2];k=k+1|0}while((k|0)!=(f|0));l=e;return}function Ib(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=+f;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0,K=0.0,L=0,M=0,N=0,O=0;h=l;i=c[a>>2]|0;j=a+40|0;k=c[j>>2]|0;m=l;l=l+((1*(k<<2)|0)+15&-16)|0;n=a+4|0;o=c[n>>2]|0;p=+g[o+4>>2]+f;if((k|0)>0){q=0;do{g[m+(q<<2)>>2]=-9999.0;q=q+1|0}while((q|0)!=(k|0))}f=+g[o+8>>2];r=p<f?f:p;q=(i|0)>0;if(q){s=c[a+16>>2]|0;t=0;do{g[d+(t<<2)>>2]=+g[s+(t<<2)>>2]+r;t=t+1|0}while((t|0)!=(i|0));t=c[a+8>>2]|0;r=+g[o+496>>2]-e;if(q){q=c[a+20>>2]|0;o=a+32|0;s=a+36|0;u=a+28|0;v=0;while(1){w=c[q+(v<<2)>>2]|0;x=v;e=+g[b+(v<<2)>>2];a:while(1){y=x;while(1){z=y+1|0;if((z|0)>=(i|0)){A=0;break a}if((c[q+(z<<2)>>2]|0)!=(w|0)){A=1;break a}p=+g[b+(z<<2)>>2];if(p>e){x=z;e=p;continue a}else y=z}}if(e+6.0>+g[d+(y<<2)>>2]?(x=w>>c[o>>2],B=c[s>>2]|0,C=~~((r+e+-30.0)*.10000000149011612),D=(C|0)>0?C:0,C=c[(c[t+(((x|0)>0?((x|0)<16?x:16):0)<<2)>>2]|0)+(((D|0)<7?D:7)<<2)>>2]|0,D=C+8|0,x=~~+g[C+4>>2],p=+g[C>>2],C=~~p,(C|0)<(x|0)):0){E=C;C=~~((p+-16.0)*+(B|0)-+(B>>1|0)+ +((c[q+(y<<2)>>2]|0)-(c[u>>2]|0)|0));do{if((C|0)>0?(p=+g[D+(E<<2)>>2]+e,F=m+(C<<2)|0,+g[F>>2]<p):0)g[F>>2]=p;C=C+B|0;E=E+1|0}while((E|0)<(x|0)&(C|0)<(k|0))}if(A)v=z;else{G=s;break}}}else H=7}else H=7;if((H|0)==7)G=a+36|0;H=c[G>>2]|0;Sb(m,H,k);k=c[a>>2]|0;b:do if((k|0)>1){G=c[a+20>>2]|0;s=c[G>>2]|0;z=c[a+28>>2]|0;v=(c[n>>2]|0)+32|0;A=s;u=1;y=0;q=s-(H>>1)-z|0;while(1){r=+g[m+(q<<2)>>2];s=((c[G+(u<<2)>>2]|0)+A>>1)-z|0;e=+g[v>>2];p=r>e?e:r;c:do if((q|0)<(s|0)){t=q;r=p;while(1){o=t+1|0;d:do if(r==-9999.0){I=+g[m+(o<<2)>>2];J=o}else{b=o;while(1){e=+g[m+(b<<2)>>2];if(e>-9999.0&e<r){I=e;J=b;break d}if((b|0)<(s|0))b=b+1|0;else{K=r;L=b;break c}}}while(0);if((J|0)<(s|0)){t=J;r=I}else{K=I;L=J;break}}}else{K=p;L=q}while(0);s=L+z|0;e:do if((y|0)>=(k|0)|(A|0)>(s|0))M=y;else{t=y;while(1){o=d+(t<<2)|0;if(+g[o>>2]<K)g[o>>2]=K;o=t+1|0;if((o|0)>=(k|0)){M=o;break e}if((c[G+(o<<2)>>2]|0)>(s|0)){M=o;break}else t=o}}while(0);s=M+1|0;if((s|0)>=(k|0)){N=M;break b}A=c[G+(M<<2)>>2]|0;u=s;y=M;q=L}}else N=0;while(0);K=+g[m+((c[j>>2]|0)+-1<<2)>>2];if((N|0)<(k|0))O=N;else{l=h;return}do{N=d+(O<<2)|0;if(+g[N>>2]<K)g[N>>2]=K;O=O+1|0}while((O|0)!=(k|0));l=h;return}function Jb(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0;j=c[a>>2]|0;k=c[a+4>>2]|0;l=+g[k+12+(e<<2)>>2];if((j|0)<=0)return;m=c[(c[a+12>>2]|0)+(e<<2)>>2]|0;n=k+108|0;o=+g[a+48>>2];p=o*.005;q=o*.0003;if((e|0)==1)r=0;else{e=0;do{o=+g[m+(e<<2)>>2]+ +g[b+(e<<2)>>2];s=+g[n>>2];t=o>s?s:o;o=+g[d+(e<<2)>>2]+l;g[f+(e<<2)>>2]=t<o?o:t;e=e+1|0}while((e|0)!=(j|0));return}do{t=+g[m+(r<<2)>>2]+ +g[b+(r<<2)>>2];o=+g[n>>2];s=t>o?o:t;t=+g[d+(r<<2)>>2]+l;g[f+(r<<2)>>2]=s<t?t:s;t=s-+g[i+(r<<2)>>2];s=t+17.200000762939453;if(t>-17.200000762939453){t=1.0-p*s;if(t<0.0)u=9.999999747378752e-05;else u=t}else u=1.0-q*s;e=h+(r<<2)|0;g[e>>2]=+g[e>>2]*u;r=r+1|0}while((r|0)!=(j|0));return}function Kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0.0,db=0.0,eb=0,fb=0,gb=0.0,hb=0,ib=0,jb=0,kb=0;f=l;l=l+4912|0;h=f+1328|0;i=f+1064|0;j=f+804|0;k=f+544|0;m=f+284|0;n=f+24|0;o=f+20|0;p=f+16|0;q=f+12|0;r=f+8|0;s=f+4|0;t=f;u=c[b+1296>>2]|0;v=c[b+1288>>2]|0;w=c[b+1284>>2]|0;x=(w|0)>0;if(x){y=0;do{c[i+(y<<2)>>2]=-200;y=y+1|0}while((y|0)!=(w|0));if(x){y=0;do{c[j+(y<<2)>>2]=-200;y=y+1|0}while((y|0)!=(w|0));if(x){id(k|0,0,w<<2|0)|0;y=0;do{c[m+(y<<2)>>2]=1;y=y+1|0}while((y|0)!=(w|0));if(x){id(n|0,-1,w<<2|0)|0;x=w+-1|0;if((w|0)==1){z=0;l=f;return z|0}y=v+-1|0;A=u+1112|0;B=c[b>>2]|0;C=0;D=0;while(1){E=C;C=C+1|0;F=B;B=c[b+(C<<2)>>2]|0;G=h+(E*56|0)+8|0;H=G;I=H+48|0;do{c[H>>2]=0;H=H+4|0}while((H|0)<(I|0));c[h+(E*56|0)>>2]=F;c[h+(E*56|0)+4>>2]=B;J=(B|0)<(v|0)?B:y;if((J|0)<(F|0)){K=0;L=0;M=0;N=0;O=0;P=0;Q=0;S=0;T=0;U=0;V=0;W=0}else{X=F;Y=0;Z=0;_=0;$=0;aa=0;ba=0;ca=0;da=0;ea=0;fa=0;ga=0;ha=0;while(1){ia=+g[e+(X<<2)>>2];ja=~~(ia*7.314285755157471+1023.5);ka=(ja|0)>1023;la=(ja|0)>0;ma=ka?1023:la?ja:0;do if(ma){oa=R(X,X)|0;pa=R(ja,ja)|0;qa=ka?1046529:la?pa:0;pa=R(ma,X)|0;if(!(+g[A>>2]+ +g[d+(X<<2)>>2]>=ia)){ra=Y;sa=Z+1|0;ta=_;ua=oa+$|0;va=aa;wa=X+ba|0;xa=ca;ya=pa+da|0;za=ea;Aa=qa+fa|0;Ba=ga;Ca=ma+ha|0;break}else{ra=Y+1|0;sa=Z;ta=oa+_|0;ua=$;va=X+aa|0;wa=ba;xa=pa+ca|0;ya=da;za=qa+ea|0;Aa=fa;Ba=ma+ga|0;Ca=ha;break}}else{ra=Y;sa=Z;ta=_;ua=$;va=aa;wa=ba;xa=ca;ya=da;za=ea;Aa=fa;Ba=ga;Ca=ha}while(0);if((X|0)<(J|0)){X=X+1|0;Y=ra;Z=sa;_=ta;$=ua;aa=va;ba=wa;ca=xa;da=ya;ea=za;fa=Aa;ga=Ba;ha=Ca}else{K=ra;L=sa;M=ta;N=ua;O=va;P=wa;Q=xa;S=ya;T=za;U=Aa;V=Ba;W=Ca;break}}}c[G>>2]=O;c[h+(E*56|0)+12>>2]=V;c[h+(E*56|0)+16>>2]=M;c[h+(E*56|0)+20>>2]=T;c[h+(E*56|0)+24>>2]=Q;c[h+(E*56|0)+28>>2]=K;c[h+(E*56|0)+32>>2]=P;c[h+(E*56|0)+36>>2]=W;c[h+(E*56|0)+40>>2]=N;c[h+(E*56|0)+44>>2]=U;c[h+(E*56|0)+48>>2]=S;c[h+(E*56|0)+52>>2]=L;ha=K+D|0;if((C|0)==(x|0)){Da=ha;break}else D=ha}}else Ea=9}else Ea=9}else Ea=9}else Ea=9;if((Ea|0)==9){if(w|0){z=0;l=f;return z|0}D=h+8|0;H=D;I=H+48|0;do{c[H>>2]=0;H=H+4|0}while((H|0)<(I|0));c[h>>2]=0;c[h+4>>2]=v;if((v|0)<1){Fa=0;Ga=0;Ha=0;Ia=0;Ja=0;Ka=0;La=0;Ma=0;Na=0;Oa=0;Pa=0;Qa=0}else{H=u+1112|0;I=0;x=0;C=0;K=0;L=0;S=0;U=0;N=0;W=0;P=0;Q=0;T=0;M=0;while(1){ia=+g[e+(I<<2)>>2];V=~~(ia*7.314285755157471+1023.5);O=(V|0)>1023;Ca=(V|0)>0;Ba=O?1023:Ca?V:0;do if(Ba){Aa=R(I,I)|0;za=R(V,V)|0;ya=O?1046529:Ca?za:0;za=R(Ba,I)|0;if(!(+g[H>>2]+ +g[d+(I<<2)>>2]>=ia)){Ra=x;Sa=C+1|0;Ta=K;Va=Aa+L|0;Wa=S;Xa=I+U|0;Ya=N;Za=za+W|0;_a=P;$a=ya+Q|0;ab=T;bb=Ba+M|0;break}else{Ra=x+1|0;Sa=C;Ta=Aa+K|0;Va=L;Wa=I+S|0;Xa=U;Ya=za+N|0;Za=W;_a=ya+P|0;$a=Q;ab=Ba+T|0;bb=M;break}}else{Ra=x;Sa=C;Ta=K;Va=L;Wa=S;Xa=U;Ya=N;Za=W;_a=P;$a=Q;ab=T;bb=M}while(0);I=I+1|0;if((I|0)==(v|0)){Fa=Ra;Ga=Sa;Ha=Ta;Ia=Va;Ja=Wa;Ka=Xa;La=Ya;Ma=Za;Na=_a;Oa=$a;Pa=ab;Qa=bb;break}else{x=Ra;C=Sa;K=Ta;L=Va;S=Wa;U=Xa;N=Ya;W=Za;P=_a;Q=$a;T=ab;M=bb}}}c[D>>2]=Ja;c[h+12>>2]=Pa;c[h+16>>2]=Ha;c[h+20>>2]=Na;c[h+24>>2]=La;c[h+28>>2]=Fa;c[h+32>>2]=Ka;c[h+36>>2]=Qa;c[h+40>>2]=Ia;c[h+44>>2]=Oa;c[h+48>>2]=Ma;c[h+52>>2]=Ga;Da=Fa}if(!Da){z=0;l=f;return z|0}c[o>>2]=-200;c[p>>2]=-200;Rb(h,w+-1|0,o,p,u)|0;Da=c[o>>2]|0;c[i>>2]=Da;c[j>>2]=Da;o=c[p>>2]|0;p=j+4|0;c[p>>2]=o;Fa=i+4|0;c[Fa>>2]=o;Ga=(w|0)>2;do if(Ga){Ma=u+1112|0;Oa=u+1096|0;Ia=u+1100|0;Qa=u+1104|0;Ka=2;a:while(1){La=c[b+520+(Ka<<2)>>2]|0;Na=c[k+(La<<2)>>2]|0;Ha=c[m+(La<<2)>>2]|0;Pa=n+(Na<<2)|0;b:do if((c[Pa>>2]|0)!=(Ha|0)){Ja=c[b+520+(Na<<2)>>2]|0;D=c[b+520+(Ha<<2)>>2]|0;c[Pa>>2]=Ha;bb=c[u+836+(Na<<2)>>2]|0;M=c[u+836+(Ha<<2)>>2]|0;ab=c[i+(Na<<2)>>2]|0;T=j+(Na<<2)|0;$a=c[T>>2]|0;Q=(ab|0)<0?$a:($a|0)<0?ab:$a+ab>>1;ab=i+(Ha<<2)|0;$a=c[ab>>2]|0;_a=c[j+(Ha<<2)>>2]|0;P=($a|0)<0?_a:(_a|0)<0?$a:_a+$a>>1;if((Q|0)==-1|(P|0)==-1){Ea=32;break a}$a=P-Q|0;_a=M-bb|0;Za=($a|0)/(_a|0)|0;W=$a>>31|1;ia=+g[e+(bb<<2)>>2];Ya=~~(ia*7.314285755157471+1023.5);N=(Ya|0)>1023?1023:(Ya|0)>0?Ya:0;Ya=R(Za,_a)|0;Xa=(($a|0)>-1?$a:0-$a|0)-((Ya|0)>-1?Ya:0-Ya|0)|0;Ya=Q-N|0;$a=R(Ya,Ya)|0;cb=+g[Ma>>2];if(cb+ +g[d+(bb<<2)>>2]>=ia){ia=+(Q|0);db=+(N|0);if(!(+g[Oa>>2]+ia<db)?!(ia-+g[Ia>>2]>db):0)Ea=36}else Ea=36;c:do if((Ea|0)==36){Ea=0;N=bb+1|0;if((N|0)<(M|0)){Ya=0;U=N;N=$a;Wa=1;S=Q;while(1){Va=Ya+Xa|0;L=(Va|0)<(_a|0);Ya=Va-(L?0:_a)|0;S=S+Za+(L?0:W)|0;db=+g[e+(U<<2)>>2];L=~~(db*7.314285755157471+1023.5);Va=(L|0)>1023?1023:(L|0)>0?L:0;L=S-Va|0;Ta=(R(L,L)|0)+N|0;L=Wa+1|0;if(Va|0?+g[d+(U<<2)>>2]+cb>=db:0){db=+(S|0);ia=+(Va|0);if(+g[Oa>>2]+db<ia)break c;if(db-+g[Ia>>2]>ia)break c}U=U+1|0;if((U|0)>=(M|0)){eb=Ta;fb=L;break}else{N=Ta;Wa=L}}}else{eb=$a;fb=1}ia=+g[Oa>>2];db=+(fb|0);gb=+g[Qa>>2];if((!(ia*ia/db>gb)?(ia=+g[Ia>>2],!(ia*ia/db>gb)):0)?+((eb|0)/(fb|0)|0|0)>gb:0)break;c[i+(Ka<<2)>>2]=-200;c[j+(Ka<<2)>>2]=-200;break b}while(0);c[q>>2]=-200;c[r>>2]=-200;c[s>>2]=-200;c[t>>2]=-200;$a=Rb(h+(Ja*56|0)|0,La-Ja|0,q,r,u)|0;M=Rb(h+(La*56|0)|0,D-La|0,s,t,u)|0;W=($a|0)!=0;if(W){c[q>>2]=Q;c[r>>2]=c[s>>2]}if((M|0)!=0?(c[s>>2]=c[r>>2],c[t>>2]=P,W):0){c[i+(Ka<<2)>>2]=-200;c[j+(Ka<<2)>>2]=-200}else Ea=49;d:do if((Ea|0)==49){Ea=0;W=c[q>>2]|0;c[T>>2]=W;if(!Na)c[i>>2]=W;W=c[r>>2]|0;c[i+(Ka<<2)>>2]=W;M=c[s>>2]|0;c[j+(Ka<<2)>>2]=M;$a=c[t>>2]|0;c[ab>>2]=$a;if((Ha|0)==1)c[p>>2]=$a;if((M&W|0)>-1){e:do if((La|0)>0){W=La;do{M=W;W=W+-1|0;$a=m+(W<<2)|0;if((c[$a>>2]|0)!=(Ha|0))break e;c[$a>>2]=Ka}while((M|0)>1)}while(0);W=La+1|0;if((W|0)<(w|0)){M=W;do{W=k+(M<<2)|0;if((c[W>>2]|0)!=(Na|0))break d;c[W>>2]=Ka;M=M+1|0}while((M|0)<(w|0))}}}while(0)}while(0);Ka=Ka+1|0;if((Ka|0)>=(w|0)){Ea=63;break}}if((Ea|0)==32)na(1);else if((Ea|0)==63){hb=c[i>>2]|0;ib=c[j>>2]|0;jb=c[Fa>>2]|0;kb=c[p>>2]|0;break}}else{hb=Da;ib=Da;jb=o;kb=o}while(0);o=Ua(a,w<<2)|0;c[o>>2]=(hb|0)<0?ib:(ib|0)<0?hb:ib+hb>>1;c[o+4>>2]=(jb|0)<0?kb:(kb|0)<0?jb:kb+jb>>1;if(Ga){Ga=2;do{jb=Ga+-2|0;kb=c[b+1032+(jb<<2)>>2]|0;hb=c[b+780+(jb<<2)>>2]|0;jb=c[u+836+(kb<<2)>>2]|0;ib=c[o+(kb<<2)>>2]&32767;kb=(c[o+(hb<<2)>>2]&32767)-ib|0;a=(R((kb|0)>-1?kb:0-kb|0,(c[u+836+(Ga<<2)>>2]|0)-jb|0)|0)/((c[u+836+(hb<<2)>>2]|0)-jb|0)|0;jb=((kb|0)<0?0-a|0:a)+ib|0;ib=c[i+(Ga<<2)>>2]|0;a=c[j+(Ga<<2)>>2]|0;kb=(ib|0)<0?a:(a|0)<0?ib:a+ib>>1;c[o+(Ga<<2)>>2]=(kb|0)<0|(jb|0)==(kb|0)?jb|32768:kb;Ga=Ga+1|0}while((Ga|0)!=(w|0))}z=o;l=f;return z|0}function Lb(a){a=a|0;return (c[(c[(c[a+64>>2]|0)+104>>2]|0)+80>>2]|0)!=0|0}function Mb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=c[b+1284>>2]|0;if(!((d|0)!=0&(e|0)!=0)){h=0;return h|0}b=Ua(a,g<<2)|0;if((g|0)<=0){h=b;return h|0}a=65536-f|0;i=0;do{j=d+(i<<2)|0;k=R(c[j>>2]&32767,a)|0;l=e+(i<<2)|0;m=k+32768+(R(c[l>>2]&32767,f)|0)>>16;k=b+(i<<2)|0;c[k>>2]=m;if(c[j>>2]&32768|0?c[l>>2]&32768|0:0)c[k>>2]=m|32768;i=i+1|0}while((i|0)!=(g|0));h=b;return h|0}function Nb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;g=l;l=l+336|0;h=g+64|0;i=g+32|0;j=g;k=c[d+1296>>2]|0;m=d+1284|0;n=c[m>>2]|0;o=c[(c[(c[b+64>>2]|0)+4>>2]|0)+28>>2]|0;p=c[o+2848>>2]|0;if(!e){Ga(a,0,1);id(f|0,0,((c[b+36>>2]|0)/2|0)<<2|0)|0;q=0;l=g;return q|0}a:do if((n|0)>0){r=k+832|0;s=0;while(1){t=e+(s<<2)|0;u=c[t>>2]|0;v=u&32767;switch(c[r>>2]|0){case 1:{w=v>>>2;break}case 2:{w=v>>>3;break}case 3:{w=(v>>>0)/12|0;break}case 4:{w=v>>>4;break}default:w=v}c[t>>2]=u&32768|w;s=s+1|0;if((s|0)==(n|0))break a}}while(0);c[h>>2]=c[e>>2];w=h+4|0;c[w>>2]=c[e+4>>2];s=d+1292|0;if((n|0)>2){r=2;do{u=r+-2|0;t=c[d+1032+(u<<2)>>2]|0;v=c[d+780+(u<<2)>>2]|0;u=c[k+836+(t<<2)>>2]|0;x=e+(t<<2)|0;t=e+(v<<2)|0;y=c[x>>2]&32767;z=(c[t>>2]&32767)-y|0;A=(R((z|0)>-1?z:0-z|0,(c[k+836+(r<<2)>>2]|0)-u|0)|0)/((c[k+836+(v<<2)>>2]|0)-u|0)|0;u=((z|0)<0?0-A|0:A)+y|0;A=e+(r<<2)|0;z=c[A>>2]|0;if((z&32768|0)!=0|(z|0)==(u|0)){c[A>>2]=u|32768;c[h+(r<<2)>>2]=0}else{A=(c[s>>2]|0)-u|0;v=(A|0)<(u|0)?A:u;A=z-u|0;do if((A|0)<0)if((A|0)<(0-v|0)){B=v+~A|0;break}else{B=~(A<<1);break}else if((v|0)>(A|0)){B=A<<1;break}else{B=v+A|0;break}while(0);c[h+(r<<2)>>2]=B;c[x>>2]=y;c[t>>2]=c[t>>2]&32767}r=r+1|0}while((r|0)!=(n|0))}Ga(a,1,1);n=d+1308|0;c[n>>2]=(c[n>>2]|0)+1;n=(c[s>>2]|0)+-1|0;r=(n|0)==0;if(!r){B=0;A=n;do{B=B+1|0;A=A>>>1}while((A|0)!=0);A=d+1304|0;c[A>>2]=(c[A>>2]|0)+(B<<1);B=c[h>>2]|0;if(r){C=B;D=A;E=0}else{r=0;v=n;while(1){n=r+1|0;v=v>>>1;if(!v){C=B;D=A;E=n;break}else r=n}}}else{C=c[h>>2]|0;D=d+1304|0;E=0}Ga(a,C,E);E=c[w>>2]|0;w=(c[s>>2]|0)+-1|0;if(!w)F=0;else{s=0;C=w;while(1){w=s+1|0;C=C>>>1;if(!C){F=w;break}else s=w}}Ga(a,E,F);if((c[k>>2]|0)>0){F=d+1300|0;E=0;s=2;while(1){C=c[k+4+(E<<2)>>2]|0;w=c[k+128+(C<<2)>>2]|0;r=c[k+192+(C<<2)>>2]|0;A=1<<r;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[i+16>>2]=0;c[i+20>>2]=0;c[i+24>>2]=0;c[i+28>>2]=0;if(r|0){B=(r|0)==31;if(!B){v=0;do{n=c[k+320+(C<<5)+(v<<2)>>2]|0;if((n|0)<0)G=1;else G=c[(c[o+1824+(n<<2)>>2]|0)+4>>2]|0;c[j+(v<<2)>>2]=G;v=v+1|0}while((v|0)<(A|0))}b:do if((w|0)>0){if(B){v=0;t=0;y=0;while(1){x=c[i+(y<<2)>>2]<<v|t;y=y+1|0;if((y|0)==(w|0)){H=x;break b}else{v=v+31|0;t=x}}}else{I=0;J=0;K=0}while(1){t=c[h+(K+s<<2)>>2]|0;v=0;while(1){if((t|0)<(c[j+(v<<2)>>2]|0)){L=38;break}y=v+1|0;if((y|0)<(A|0))v=y;else{L=39;break}}if((L|0)==38){L=0;c[i+(K<<2)>>2]=v;M=v}else if((L|0)==39){L=0;M=c[i+(K<<2)>>2]|0}t=M<<I|J;K=K+1|0;if((K|0)==(w|0)){H=t;break}else{I=I+r|0;J=t}}}else H=0;while(0);r=sb(p+((c[k+256+(C<<2)>>2]|0)*56|0)|0,H,a)|0;c[F>>2]=(c[F>>2]|0)+r}if((w|0)>0){r=0;do{A=c[k+320+(C<<5)+(c[i+(r<<2)>>2]<<2)>>2]|0;if((A|0)>-1?(B=c[h+(r+s<<2)>>2]|0,(B|0)<(c[p+(A*56|0)+4>>2]|0)):0){t=sb(p+(A*56|0)|0,B,a)|0;c[D>>2]=(c[D>>2]|0)+t}r=r+1|0}while((r|0)!=(w|0))}E=E+1|0;if((E|0)>=(c[k>>2]|0))break;else s=w+s|0}}s=k+832|0;E=R(c[s>>2]|0,c[e>>2]|0)|0;D=(c[o+(c[b+28>>2]<<2)>>2]|0)/2|0;o=c[m>>2]|0;if((o|0)>1){a=o;o=0;p=1;h=0;i=E;while(1){F=c[d+260+(p<<2)>>2]|0;H=c[e+(F<<2)>>2]|0;if((H&32767|0)==(H|0)){J=R(c[s>>2]|0,H)|0;H=c[k+836+(F<<2)>>2]|0;F=J-i|0;I=H-h|0;K=(F|0)/(I|0)|0;M=F>>31|1;j=R(K,I)|0;G=((F|0)>-1?F:0-F|0)-((j|0)>-1?j:0-j|0)|0;j=(D|0)>(H|0)?H:D;if((j|0)>(h|0)){N=0;O=h;P=i;L=56}else{Q=0;S=h;T=i}while(1){if((L|0)==56){L=0;c[f+(O<<2)>>2]=P;Q=N;S=O;T=P}F=S+1|0;if((F|0)>=(j|0))break;r=Q+G|0;C=(r|0)<(I|0);N=r-(C?0:I)|0;O=F;P=T+K+(C?0:M)|0;L=56}U=c[m>>2]|0;V=H;W=H;X=J}else{U=a;V=o;W=h;X=i}p=p+1|0;if((p|0)>=(U|0)){Y=V;Z=X;break}else{a=U;o=V;h=W;i=X}}}else{Y=0;Z=E}E=b+36|0;if((Y|0)<((c[E>>2]|0)/2|0|0))_=Y;else{q=1;l=g;return q|0}do{c[f+(_<<2)>>2]=Z;_=_+1|0}while((_|0)<((c[E>>2]|0)/2|0|0));q=1;l=g;return q|0}function Ob(a,b,d,e,f,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0.0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0.0,ka=0.0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0;n=l;o=c[d>>2]|0;p=d+4|0;d=c[p>>2]|0;if(!(c[d+500>>2]|0))q=16;else q=c[d+508>>2]|0;r=c[b+132+((c[d>>2]|0)*60|0)+(a<<2)>>2]|0;s=+h[8+(c[b+252+(a<<2)>>2]<<3)>>3];d=m<<2;t=l;l=l+((1*d|0)+15&-16)|0;u=l;l=l+((1*d|0)+15&-16)|0;v=l;l=l+((1*d|0)+15&-16)|0;w=l;l=l+((1*d|0)+15&-16)|0;x=l;l=l+((1*d|0)+15&-16)|0;y=e+1156|0;z=+h[((o|0)>1e3?80:8)+(c[b+312+(a<<2)>>2]<<3)>>3];a=R(d,q)|0;b=l;l=l+((1*a|0)+15&-16)|0;c[t>>2]=b;A=l;l=l+((1*a|0)+15&-16)|0;c[u>>2]=A;B=l;l=l+((1*a|0)+15&-16)|0;c[v>>2]=B;C=l;l=l+((1*a|0)+15&-16)|0;c[w>>2]=C;if((m|0)>1?(c[t+4>>2]=b+(q<<2),c[u+4>>2]=A+(q<<2),c[v+4>>2]=B+(q<<2),c[w+4>>2]=C+(q<<2),(m|0)!=2):0){C=2;do{B=c[u>>2]|0;A=c[v>>2]|0;b=c[w>>2]|0;D=R(C,q)|0;c[t+(C<<2)>>2]=(c[t>>2]|0)+(D<<2);c[u+(C<<2)>>2]=B+(D<<2);c[v+(C<<2)>>2]=A+(D<<2);c[w+(C<<2)>>2]=b+(D<<2);C=C+1|0}while((C|0)!=(m|0))}C=c[y>>2]|0;if((o|0)>0){D=(m|0)>0;b=c[w>>2]|0;A=0;do{B=o-A|0;F=(q|0)>(B|0)?B:q;md(x|0,j|0,d|0)|0;id(b|0,0,a|0)|0;if(D){B=(F|0)>0;G=r-A|0;H=0;do{I=(c[i+(H<<2)>>2]|0)+(A<<2)|0;if(!(c[x+(H<<2)>>2]|0)){if(B){J=c[v+(H<<2)>>2]|0;K=c[t+(H<<2)>>2]|0;L=c[u+(H<<2)>>2]|0;M=c[w+(H<<2)>>2]|0;N=0;do{g[J+(N<<2)>>2]=1.000000013351432e-10;g[K+(N<<2)>>2]=0.0;g[L+(N<<2)>>2]=0.0;c[M+(N<<2)>>2]=0;c[I+(N<<2)>>2]=0;N=N+1|0}while((N|0)<(F|0))}}else{N=c[v+(H<<2)>>2]|0;if(B){M=0;do{c[N+(M<<2)>>2]=c[476+(c[I+(M<<2)>>2]<<2)>>2];M=M+1|0}while((M|0)<(F|0));M=c[f+(H<<2)>>2]|0;L=M+(A<<2)|0;K=c[w+(H<<2)>>2]|0;if(B){J=0;do{O=+E(+(+g[L+(J<<2)>>2]));c[K+(J<<2)>>2]=!(O/+g[N+(J<<2)>>2]<((J|0)>=(G|0)?z:s))&1;J=J+1|0}while((J|0)!=(F|0));J=c[t+(H<<2)>>2]|0;K=c[u+(H<<2)>>2]|0;if(B){L=0;do{P=M+(L+A<<2)|0;O=+g[P>>2];Q=O*O;S=J+(L<<2)|0;g[S>>2]=Q;g[K+(L<<2)>>2]=Q;if(+g[P>>2]<0.0)g[S>>2]=-+g[S>>2];S=N+(L<<2)|0;Q=+g[S>>2];g[S>>2]=Q*Q;L=L+1|0}while((L|0)<(F|0));T=J;U=K}else{T=J;U=K}}else V=20}else V=20;if((V|0)==20){V=0;T=c[t+(H<<2)>>2]|0;U=c[u+(H<<2)>>2]|0}+Pb(c[p>>2]|0,r,T,U,N,0,A,F,I)}H=H+1|0}while((H|0)!=(m|0))}H=c[y>>2]|0;if((H|0)>0){B=(F|0)>0;G=k-A|0;L=r-A|0;M=H;S=0;while(1){P=c[e+1160+(S<<2)>>2]|0;W=c[e+2184+(S<<2)>>2]|0;X=(c[i+(P<<2)>>2]|0)+(A<<2)|0;Y=(c[i+(W<<2)>>2]|0)+(A<<2)|0;Z=c[t+(P<<2)>>2]|0;_=c[t+(W<<2)>>2]|0;$=c[u+(P<<2)>>2]|0;aa=c[u+(W<<2)>>2]|0;ba=c[v+(P<<2)>>2]|0;ca=c[v+(W<<2)>>2]|0;da=c[w+(P<<2)>>2]|0;ea=c[w+(W<<2)>>2]|0;fa=x+(P<<2)|0;P=x+(W<<2)|0;if((c[fa>>2]|0)==0?(c[P>>2]|0)==0:0)ga=M;else{c[P>>2]=1;c[fa>>2]=1;if(B){fa=0;do{do if((fa|0)<(G|0)){P=da+(fa<<2)|0;W=_+(fa<<2)|0;Q=+g[W>>2];ha=Z+(fa<<2)|0;O=+g[ha>>2];ia=ea+(fa<<2)|0;if((c[P>>2]|0)==0?(c[ia>>2]|0)==0:0){ja=O+Q;if((fa|0)<(L|0)){g[ha>>2]=ja;g[$+(fa<<2)>>2]=+E(+ja)}else{ka=+E(+Q)+ +E(+O);g[$+(fa<<2)>>2]=ka;g[ha>>2]=ja<0.0?-ka:ka}g[aa+(fa<<2)>>2]=0.0;g[W>>2]=0.0;c[ia>>2]=1;c[Y+(fa<<2)>>2]=0;break}g[ha>>2]=+E(+Q)+ +E(+O);ha=$+(fa<<2)|0;g[ha>>2]=+g[aa+(fa<<2)>>2]+ +g[ha>>2];c[ia>>2]=1;c[P>>2]=1;P=X+(fa<<2)|0;ia=c[P>>2]|0;ha=Y+(fa<<2)|0;W=c[ha>>2]|0;if((((ia|0)>-1?ia:0-ia|0)|0)>(((W|0)>-1?W:0-W|0)|0)){la=(ia|0)>0?ia-W|0:W-ia|0;ma=ha}else{c[ha>>2]=(W|0)>0?ia-W|0:W-ia|0;la=W;ma=P}c[ma>>2]=la;W=c[ha>>2]|0;ia=c[P>>2]|0;if((W|0)>=(((ia|0)>-1?ia:0-ia|0)<<1|0)){c[ha>>2]=0-W;c[P>>2]=0-(c[P>>2]|0)}}while(0);P=ba+(fa<<2)|0;W=ca+(fa<<2)|0;O=+g[W>>2]+ +g[P>>2];g[W>>2]=O;g[P>>2]=O;fa=fa+1|0}while((fa|0)<(F|0))}+Pb(c[p>>2]|0,r,Z,$,ba,da,A,F,X);ga=c[y>>2]|0}S=S+1|0;if((S|0)>=(ga|0)){na=ga;break}else M=ga}}else na=H;A=A+q|0}while((o|0)>(A|0));oa=na}else oa=C;if((oa|0)>0){pa=oa;qa=0}else{l=n;return}while(1){oa=j+(c[e+1160+(qa<<2)>>2]<<2)|0;C=e+2184+(qa<<2)|0;if((c[oa>>2]|0)==0?(c[j+(c[C>>2]<<2)>>2]|0)==0:0)ra=pa;else{c[oa>>2]=1;c[j+(c[C>>2]<<2)>>2]=1;ra=c[y>>2]|0}qa=qa+1|0;if((qa|0)>=(ra|0))break;else pa=ra}l=n;return}function Pb(a,b,d,e,f,i,k,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0,E=0.0,G=0,H=0.0,I=0.0,J=0;o=l;p=l;l=l+((1*(m<<2)|0)+15&-16)|0;if(!(c[a+500>>2]|0))q=m;else q=(c[a+504>>2]|0)-k|0;r=(q|0)>(m|0)?m:q;a:do if((r|0)>0){if(!i){q=0;while(1){s=+g[d+(q<<2)>>2]<0.0;t=+Zc(+F(+(+g[e+(q<<2)>>2]/+g[f+(q<<2)>>2])));c[n+(q<<2)>>2]=~~(s?-t:t);q=q+1|0;if((q|0)>=(r|0)){u=r;break a}}}else v=0;do{if(!(c[i+(v<<2)>>2]|0)){q=+g[d+(v<<2)>>2]<0.0;t=+Zc(+F(+(+g[e+(v<<2)>>2]/+g[f+(v<<2)>>2])));c[n+(v<<2)>>2]=~~(q?-t:t)}v=v+1|0}while((v|0)<(r|0));u=r}else u=0;while(0);if((u|0)>=(m|0)){w=0.0;l=o;return +w}r=b-k|0;if(!i){t=0.0;k=0;b=u;while(1){v=e+(b<<2)|0;x=+g[f+(b<<2)>>2];y=+g[v>>2]/x;if(y<.25){c[p+(k<<2)>>2]=v;z=y+t;A=k+1|0}else{q=+g[d+(b<<2)>>2]<0.0;B=+Zc(+F(+y));s=~~(q?-B:B);c[n+(b<<2)>>2]=s;g[v>>2]=+(R(s,s)|0)*x;z=t;A=k}b=b+1|0;if((b|0)==(m|0)){C=z;D=A;break}else{t=z;k=A}}}else{z=0.0;A=0;k=u;while(1){do if(!(c[i+(k<<2)>>2]|0)){u=e+(k<<2)|0;t=+g[f+(k<<2)>>2];x=+g[u>>2]/t;if(!(x<.25)|(k|0)<(r|0)){b=+g[d+(k<<2)>>2]<0.0;B=+Zc(+F(+x));s=~~(b?-B:B);c[n+(k<<2)>>2]=s;g[u>>2]=+(R(s,s)|0)*t;E=z;G=A;break}else{c[p+(A<<2)>>2]=u;E=x+z;G=A+1|0;break}}else{E=z;G=A}while(0);k=k+1|0;if((k|0)==(m|0)){C=E;D=G;break}else{z=E;A=G}}}if(!D){w=C;l=o;return +w}Pc(p,D,4,12);if((D|0)<=0){w=C;l=o;return +w}G=e;E=+h[a+512>>3];z=C;a=0;while(1){e=c[p+(a<<2)>>2]|0;A=e-G>>2;if(!(z>=E)){H=0.0;I=z;J=0}else{H=+g[f+(A<<2)>>2];I=z+-1.0;J=~~(c[j>>2]=c[d+(A<<2)>>2]&-2147483648|1065353216,+g[j>>2])}c[n+(A<<2)>>2]=J;g[e>>2]=H;a=a+1|0;if((a|0)==(D|0)){w=I;break}else z=I}l=o;return +w}function Qb(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;d=+g[c[a>>2]>>2];e=+g[c[b>>2]>>2];return (d<e&1)-(d>e&1)|0}function Rb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0;h=c[a>>2]|0;i=c[a+((b+-1|0)*56|0)+4>>2]|0;if((b|0)>0){j=+g[f+1108>>2];k=0.0;f=0;l=0.0;m=0.0;n=0.0;o=0.0;while(1){p=c[a+(f*56|0)+52>>2]|0;q=c[a+(f*56|0)+28>>2]|0;r=+(q+p|0)*j/+(q+1|0)+1.0;s=+(c[a+(f*56|0)+32>>2]|0)+m+r*+(c[a+(f*56|0)+8>>2]|0);t=+(c[a+(f*56|0)+36>>2]|0)+o+ +(c[a+(f*56|0)+12>>2]|0)*r;u=+(c[a+(f*56|0)+40>>2]|0)+l+ +(c[a+(f*56|0)+16>>2]|0)*r;v=+(c[a+(f*56|0)+48>>2]|0)+n+ +(c[a+(f*56|0)+24>>2]|0)*r;w=+(p|0)+k+r*+(q|0);f=f+1|0;if((f|0)==(b|0)){x=w;y=u;z=s;A=v;B=t;break}else{k=w;l=u;m=s;n=v;o=t}}}else{x=0.0;y=0.0;z=0.0;A=0.0;B=0.0}b=c[d>>2]|0;if((b|0)>-1){C=x+1.0;D=y+ +(R(h,h)|0);E=z+ +(h|0);F=+(R(b,h)|0)+A;G=+(b|0)+B}else{C=x;D=y;E=z;F=A;G=B}b=c[e>>2]|0;if((b|0)>-1){H=C+1.0;I=D+ +(R(i,i)|0);J=E+ +(i|0);K=+(R(b,i)|0)+F;L=+(b|0)+G}else{H=C;I=D;J=E;K=F;L=G}G=I*H-J*J;if(G>0.0){F=(L*I-J*K)/G;I=(K*H-J*L)/G;c[d>>2]=~~+Zc(I*+(h|0)+F);h=~~+Zc(I*+(i|0)+F);c[e>>2]=h;i=c[d>>2]|0;if((i|0)>1023){c[d>>2]=1023;M=c[e>>2]|0;N=1023}else{M=h;N=i}if((M|0)>1023){c[e>>2]=1023;O=c[d>>2]|0;P=1023}else{O=N;P=M}if((O|0)<0){c[d>>2]=0;Q=c[e>>2]|0}else Q=P;if((Q|0)<0)S=0;else{T=0;return T|0}}else{c[d>>2]=0;S=1}c[e>>2]=0;T=S;return T|0}function Sb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0;e=l;f=d<<2;h=l;l=l+((1*f|0)+15&-16)|0;i=l;l=l+((1*f|0)+15&-16)|0;if((d|0)>0){j=0;k=0}else{l=e;return}do{if((k|0)<2){c[h+(k<<2)>>2]=j;c[i+(k<<2)>>2]=c[a+(j<<2)>>2];m=k}else{n=+g[a+(j<<2)>>2];f=k;while(1){o=f+-1|0;p=+g[i+(o<<2)>>2];if(n<p)break;if(!((f|0)>1?(j|0)<((c[h+(o<<2)>>2]|0)+b|0):0))break;q=f+-2|0;if(!(p<=+g[i+(q<<2)>>2]))break;if((j|0)<((c[h+(q<<2)>>2]|0)+b|0))f=o;else break}c[h+(f<<2)>>2]=j;g[i+(f<<2)>>2]=n;m=f}k=m+1|0;j=j+1|0}while((j|0)!=(d|0));if((m|0)<=-1){l=e;return}j=b+1|0;b=0;o=0;while(1){if((b|0)<(m|0)?(q=b+1|0,+g[i+(q<<2)>>2]>+g[i+(b<<2)>>2]):0)r=c[h+(q<<2)>>2]|0;else r=j+(c[h+(b<<2)>>2]|0)|0;q=(r|0)>(d|0)?d:r;if((o|0)<(q|0)){s=c[i+(b<<2)>>2]|0;t=o;do{c[a+(t<<2)>>2]=s;t=t+1|0}while((t|0)<(q|0));u=q}else u=o;b=b+1|0;if((b|0)==(k|0))break;else o=u}l=e;return}function Tb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0,E=0.0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0.0,X=0,Y=0.0;i=l;j=a<<2;k=l;l=l+((1*j|0)+15&-16)|0;m=l;l=l+((1*j|0)+15&-16)|0;n=l;l=l+((1*j|0)+15&-16)|0;o=l;l=l+((1*j|0)+15&-16)|0;p=l;l=l+((1*j|0)+15&-16)|0;q=+g[d>>2]+f;r=q<1.0?1.0:q;q=r*r*.5;s=q*r;g[k>>2]=q;g[m>>2]=q;g[n>>2]=0.0;g[o>>2]=s;g[p>>2]=0.0;if((a|0)>1){j=1;r=q;t=q;q=0.0;u=0.0;v=s;s=1.0;while(1){w=+g[d+(j<<2)>>2]+f;x=w<1.0?1.0:w;w=x*x;r=w+r;y=w*s;t=y+t;q=y*s+q;v=w*x+v;u=y*x+u;g[k+(j<<2)>>2]=r;g[m+(j<<2)>>2]=t;g[n+(j<<2)>>2]=q;g[o+(j<<2)>>2]=v;g[p+(j<<2)>>2]=u;j=j+1|0;if((j|0)==(a|0))break;else s=s+1.0}}j=c[b>>2]|0;d=j>>16;if((d|0)>-1){z=j;A=0.0;B=0.0;C=1.0;D=0;E=0.0}else{F=j;j=0;G=d;s=0.0;while(1){d=F&65535;H=0-G|0;u=+g[k+(H<<2)>>2]+ +g[k+(d<<2)>>2];v=+g[m+(d<<2)>>2]-+g[m+(H<<2)>>2];q=+g[n+(H<<2)>>2]+ +g[n+(d<<2)>>2];t=+g[o+(H<<2)>>2]+ +g[o+(d<<2)>>2];r=+g[p+(d<<2)>>2]-+g[p+(H<<2)>>2];x=t*q-r*v;y=r*u-t*v;t=q*u-v*v;v=(y*s+x)/t;g[e+(j<<2)>>2]=(v<0.0?0.0:v)-f;H=j+1|0;v=s+1.0;d=c[b+(H<<2)>>2]|0;G=d>>16;if((G|0)>-1){z=d;A=x;B=y;C=t;D=H;E=v;break}else{F=d;j=H;s=v}}}j=z&65535;if((j|0)<(a|0)){F=j;j=D;G=z;s=E;while(1){z=G>>16;v=+g[k+(F<<2)>>2]-+g[k+(z<<2)>>2];t=+g[m+(F<<2)>>2]-+g[m+(z<<2)>>2];y=+g[n+(F<<2)>>2]-+g[n+(z<<2)>>2];x=+g[o+(F<<2)>>2]-+g[o+(z<<2)>>2];u=+g[p+(F<<2)>>2]-+g[p+(z<<2)>>2];q=x*y-u*t;r=u*v-x*t;x=y*v-t*t;t=(r*s+q)/x;g[e+(j<<2)>>2]=(t<0.0?0.0:t)-f;z=j+1|0;t=s+1.0;G=c[b+(z<<2)>>2]|0;F=G&65535;if((F|0)>=(a|0)){I=q;J=r;K=x;L=z;M=t;break}else{j=z;s=t}}}else{I=A;J=B;K=C;L=D;M=E}if((L|0)<(a|0)){D=L;E=M;while(1){M=(E*J+I)/K;g[e+(D<<2)>>2]=(M<0.0?0.0:M)-f;D=D+1|0;if((D|0)==(a|0))break;else E=E+1.0}}if((h|0)<1){l=i;return}D=h>>>1;L=D-h|0;if((L|0)>-1){N=I;O=J;P=K;Q=0;R=0.0}else{j=h-D|0;F=D;G=0;b=L;K=0.0;while(1){L=0-b|0;J=+g[k+(L<<2)>>2]+ +g[k+(F<<2)>>2];I=+g[m+(F<<2)>>2]-+g[m+(L<<2)>>2];E=+g[n+(L<<2)>>2]+ +g[n+(F<<2)>>2];M=+g[o+(L<<2)>>2]+ +g[o+(F<<2)>>2];C=+g[p+(F<<2)>>2]-+g[p+(L<<2)>>2];B=M*E-C*I;A=C*J-M*I;M=E*J-I*I;I=(A*K+B)/M-f;L=e+(G<<2)|0;if(I<+g[L>>2])g[L>>2]=I;G=G+1|0;I=K+1.0;L=G+D|0;if((G|0)==(j|0)){N=B;O=A;P=M;Q=j;R=I;break}else{F=L;b=L-h|0;K=I}}}b=Q+D|0;if((b|0)<(a|0)){F=a-D|0;j=b;b=Q;K=R;while(1){G=j-h|0;I=+g[k+(j<<2)>>2]-+g[k+(G<<2)>>2];M=+g[m+(j<<2)>>2]-+g[m+(G<<2)>>2];A=+g[n+(j<<2)>>2]-+g[n+(G<<2)>>2];B=+g[o+(j<<2)>>2]-+g[o+(G<<2)>>2];J=+g[p+(j<<2)>>2]-+g[p+(G<<2)>>2];E=B*A-J*M;C=J*I-B*M;B=A*I-M*M;M=(C*K+E)/B-f;G=e+(b<<2)|0;if(M<+g[G>>2])g[G>>2]=M;G=b+1|0;M=K+1.0;if((G|0)==(F|0)){S=E;T=C;U=B;V=F;W=M;break}else{j=G+D|0;b=G;K=M}}}else{S=N;T=O;U=P;V=Q;W=R}if((V|0)<(a|0)){X=V;Y=W}else{l=i;return}while(1){W=(Y*T+S)/U-f;V=e+(X<<2)|0;if(W<+g[V>>2])g[V>>2]=W;X=X+1|0;if((X|0)==(a|0))break;else Y=Y+1.0}l=i;return}function Ub(a,b,c,d,e,f,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0.0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0;i=R(b,a)|0;j=i<<1;k=(b|0)>0;if(k){l=(a<<2)+-1|0;m=a<<1;n=0;o=i;p=i*3|0;q=0;r=j;while(1){s=c+(o<<2)|0;t=c+(p<<2)|0;u=+g[t>>2]+ +g[s>>2];v=c+(q<<2)|0;w=c+(r<<2)|0;x=+g[w>>2]+ +g[v>>2];y=q<<2;g[d+(y<<2)>>2]=x+u;g[d+(l+y<<2)>>2]=x-u;z=y+m|0;g[d+(z+-1<<2)>>2]=+g[v>>2]-+g[w>>2];g[d+(z<<2)>>2]=+g[t>>2]-+g[s>>2];n=n+1|0;if((n|0)==(b|0))break;else{o=o+a|0;p=p+a|0;q=q+a|0;r=r+a|0}}}if((a|0)<2)return;if((a|0)!=2){if(k){r=a<<1;q=0;p=0;while(1){o=p<<2;n=2;m=p;l=o;s=o+r|0;do{o=m;m=m+2|0;t=l;l=l+2|0;z=s;s=s+-2|0;w=m+i|0;v=n+-2|0;u=+g[e+(v<<2)>>2];x=+g[c+(w+-1<<2)>>2];y=n+-1|0;A=+g[e+(y<<2)>>2];B=+g[c+(w<<2)>>2];C=B*A+x*u;D=B*u-A*x;E=w+i|0;x=+g[f+(v<<2)>>2];A=+g[c+(E+-1<<2)>>2];u=+g[f+(y<<2)>>2];B=+g[c+(E<<2)>>2];F=B*u+A*x;G=B*x-u*A;w=E+i|0;A=+g[h+(v<<2)>>2];u=+g[c+(w+-1<<2)>>2];x=+g[h+(y<<2)>>2];B=+g[c+(w<<2)>>2];H=B*x+u*A;I=B*A-x*u;u=H+C;x=H-C;C=I+D;H=D-I;I=+g[c+(m<<2)>>2];D=I+G;A=I-G;G=+g[c+(o+1<<2)>>2];I=G+F;B=G-F;g[d+((t|1)<<2)>>2]=u+I;g[d+(l<<2)>>2]=C+D;g[d+(z+-3<<2)>>2]=B-H;g[d+(s<<2)>>2]=x-A;z=l+r|0;g[d+(z+-1<<2)>>2]=H+B;g[d+(z<<2)>>2]=x+A;z=s+r|0;g[d+(z+-1<<2)>>2]=I-u;g[d+(z<<2)>>2]=C-D;n=n+2|0}while((n|0)<(a|0));q=q+1|0;if((q|0)==(b|0))break;else p=p+a|0}}if(a&1|0)return}p=a+-1+i|0;q=a<<2;r=a<<1;if(!k)return;k=0;h=p;f=p+j|0;j=a;p=a;while(1){D=+g[c+(h<<2)>>2];C=+g[c+(f<<2)>>2];u=(C+D)*-.7071067690849304;I=(D-C)*.7071067690849304;e=c+(p+-1<<2)|0;g[d+(j+-1<<2)>>2]=I+ +g[e>>2];n=j+r|0;g[d+(n+-1<<2)>>2]=+g[e>>2]-I;e=c+(h+i<<2)|0;g[d+(j<<2)>>2]=u-+g[e>>2];g[d+(n<<2)>>2]=+g[e>>2]+u;k=k+1|0;if((k|0)==(b|0))break;else{h=h+a|0;f=f+a|0;j=j+q|0;p=p+a|0}}return}function Vb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;h=R(b,a)|0;i=a<<1;j=(b|0)>0;if(j){k=i+-1|0;l=0;m=0;n=h;while(1){o=d+(m<<2)|0;p=d+(n<<2)|0;q=m<<1;g[e+(q<<2)>>2]=+g[p>>2]+ +g[o>>2];g[e+(k+q<<2)>>2]=+g[o>>2]-+g[p>>2];l=l+1|0;if((l|0)==(b|0))break;else{m=m+a|0;n=n+a|0}}}if((a|0)<2)return;if((a|0)!=2){if(j){n=0;m=0;l=h;while(1){k=m<<1;p=2;o=l;q=k+i|0;r=m;s=k;do{k=o;o=o+2|0;t=q;q=q+-2|0;u=r;r=r+2|0;v=s;s=s+2|0;w=+g[f+(p+-2<<2)>>2];x=+g[d+(k+1<<2)>>2];y=+g[f+(p+-1<<2)>>2];z=+g[d+(o<<2)>>2];A=z*y+x*w;B=z*w-y*x;k=d+(r<<2)|0;g[e+(s<<2)>>2]=B+ +g[k>>2];g[e+(q<<2)>>2]=B-+g[k>>2];k=d+(u+1<<2)|0;g[e+((v|1)<<2)>>2]=+g[k>>2]+A;g[e+(t+-3<<2)>>2]=+g[k>>2]-A;p=p+2|0}while((p|0)<(a|0));n=n+1|0;if((n|0)==(b|0))break;else{m=m+a|0;l=l+a|0}}}if(((a|0)%2|0|0)==1)return}l=a+-1|0;if(!j)return;j=0;m=a;n=h+l|0;h=l;while(1){g[e+(m<<2)>>2]=-+g[d+(n<<2)>>2];c[e+(m+-1<<2)>>2]=c[d+(h<<2)>>2];j=j+1|0;if((j|0)==(b|0))break;else{m=m+i|0;n=n+a|0;h=h+a|0}}return}function Wb(a,b,d,e,f,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0,S=0.0;m=6.2831854820251465/+(b|0);n=+H(+m);o=+I(+m);p=b+1>>1;q=a+-1>>1;r=R(d,a)|0;s=R(b,a)|0;t=(a|0)==1;do if(!t){if((e|0)>0){u=0;do{c[k+(u<<2)>>2]=c[i+(u<<2)>>2];u=u+1|0}while((u|0)!=(e|0))}u=(b|0)>1;if(u&(d|0)>0){v=1;w=0;do{w=w+r|0;x=0;y=w;while(1){c[j+(y<<2)>>2]=c[h+(y<<2)>>2];x=x+1|0;if((x|0)==(d|0))break;else y=y+a|0}v=v+1|0}while((v|0)!=(b|0))}v=0-a|0;if((q|0)>(d|0)){if(u){w=(d|0)>0;y=(a|0)>2;x=v;z=1;A=0;do{A=A+r|0;x=x+a|0;if(w?(B=x+-1|0,y):0){C=0;D=A-a|0;do{D=D+a|0;E=2;F=B;G=D;do{J=F;F=F+2|0;K=l+(J+1<<2)|0;J=G+1|0;G=G+2|0;L=h+(J<<2)|0;M=l+(F<<2)|0;N=h+(G<<2)|0;g[j+(J<<2)>>2]=+g[N>>2]*+g[M>>2]+ +g[L>>2]*+g[K>>2];g[j+(G<<2)>>2]=+g[N>>2]*+g[K>>2]-+g[L>>2]*+g[M>>2];E=E+2|0}while((E|0)<(a|0));C=C+1|0}while((C|0)!=(d|0))}z=z+1|0}while((z|0)!=(b|0))}}else if(u){z=(a|0)<3|(d|0)<1;A=v;y=1;x=0;do{A=A+a|0;x=x+r|0;if(!z){w=2;C=A+-1|0;D=x;do{B=C;C=C+2|0;D=D+2|0;E=l+(B+1<<2)|0;B=l+(C<<2)|0;G=0;F=D;while(1){M=F+-1|0;L=h+(M<<2)|0;K=h+(F<<2)|0;g[j+(M<<2)>>2]=+g[K>>2]*+g[B>>2]+ +g[L>>2]*+g[E>>2];g[j+(F<<2)>>2]=+g[K>>2]*+g[E>>2]-+g[L>>2]*+g[B>>2];G=G+1|0;if((G|0)==(d|0))break;else F=F+a|0}w=w+2|0}while((w|0)<(a|0))}y=y+1|0}while((y|0)!=(b|0))}y=R(r,b)|0;x=(p|0)>1;if((q|0)<(d|0)){if(!x)break;A=(a|0)<3|(d|0)<1;z=1;v=0;u=y;do{v=v+r|0;u=u-r|0;if(!A){w=2;D=v;C=u;do{D=D+2|0;C=C+2|0;F=0;G=D-a|0;B=C-a|0;do{G=G+a|0;B=B+a|0;E=G+-1|0;L=j+(E<<2)|0;K=B+-1|0;M=j+(K<<2)|0;g[h+(E<<2)>>2]=+g[M>>2]+ +g[L>>2];E=j+(G<<2)|0;N=j+(B<<2)|0;g[h+(K<<2)>>2]=+g[E>>2]-+g[N>>2];g[h+(G<<2)>>2]=+g[N>>2]+ +g[E>>2];g[h+(B<<2)>>2]=+g[M>>2]-+g[L>>2];F=F+1|0}while((F|0)!=(d|0));w=w+2|0}while((w|0)<(a|0))}z=z+1|0}while((z|0)!=(p|0))}else{if(!x)break;z=(d|0)<1|(a|0)<3;u=1;v=0;A=y;do{v=v+r|0;A=A-r|0;if(!z){w=0;C=v;D=A;while(1){F=2;B=C;G=D;do{L=B;B=B+2|0;M=L+1|0;L=j+(M<<2)|0;E=G+1|0;G=G+2|0;N=j+(E<<2)|0;g[h+(M<<2)>>2]=+g[N>>2]+ +g[L>>2];M=j+(B<<2)|0;K=j+(G<<2)|0;g[h+(E<<2)>>2]=+g[M>>2]-+g[K>>2];g[h+(B<<2)>>2]=+g[K>>2]+ +g[M>>2];g[h+(G<<2)>>2]=+g[N>>2]-+g[L>>2];F=F+2|0}while((F|0)<(a|0));w=w+1|0;if((w|0)==(d|0))break;else{C=C+a|0;D=D+a|0}}}u=u+1|0}while((u|0)!=(p|0))}}while(0);l=(e|0)>0;if(l){u=0;do{c[i+(u<<2)>>2]=c[k+(u<<2)>>2];u=u+1|0}while((u|0)!=(e|0))}u=R(e,b)|0;A=(p|0)>1;do if(A){if((d|0)>0){v=1;z=0;y=u;do{z=z+r|0;y=y-r|0;x=0;D=z-a|0;C=y-a|0;do{D=D+a|0;C=C+a|0;w=j+(D<<2)|0;F=j+(C<<2)|0;g[h+(D<<2)>>2]=+g[F>>2]+ +g[w>>2];g[h+(C<<2)>>2]=+g[F>>2]-+g[w>>2];x=x+1|0}while((x|0)!=(d|0));v=v+1|0}while((v|0)!=(p|0));if(!A)break}v=R(b+-1|0,e)|0;y=(p|0)==2|l^1;m=0.0;O=1.0;z=1;x=0;C=u;do{x=x+e|0;C=C-e|0;P=O;O=O*n-m*o;m=P*o+m*n;if(l){D=0;w=x;F=C;G=v;B=e;while(1){g[k+(w<<2)>>2]=+g[i+(B<<2)>>2]*O+ +g[i+(D<<2)>>2];g[k+(F<<2)>>2]=+g[i+(G<<2)>>2]*m;D=D+1|0;if((D|0)==(e|0))break;else{w=w+1|0;F=F+1|0;G=G+1|0;B=B+1|0}}}if(!y){P=m;Q=O;B=2;G=e;F=v;do{G=G+e|0;F=F-e|0;S=Q;Q=Q*O-P*m;P=S*m+P*O;w=0;D=x;L=C;N=G;M=F;while(1){K=k+(D<<2)|0;g[K>>2]=+g[K>>2]+ +g[i+(N<<2)>>2]*Q;K=k+(L<<2)|0;g[K>>2]=+g[K>>2]+ +g[i+(M<<2)>>2]*P;w=w+1|0;if((w|0)==(e|0))break;else{D=D+1|0;L=L+1|0;N=N+1|0;M=M+1|0}}B=B+1|0}while((B|0)<(p|0))}z=z+1|0}while((z|0)!=(p|0));if(A&l){z=1;C=0;do{C=C+e|0;x=0;v=C;while(1){y=k+(x<<2)|0;g[y>>2]=+g[y>>2]+ +g[i+(v<<2)>>2];x=x+1|0;if((x|0)==(e|0))break;else v=v+1|0}z=z+1|0}while((z|0)!=(p|0))}}while(0);if((a|0)<(d|0)){if((a|0)>0&(d|0)>0){e=0;do{i=0;k=e;l=e;while(1){c[f+(l<<2)>>2]=c[j+(k<<2)>>2];i=i+1|0;if((i|0)==(d|0))break;else{k=k+a|0;l=l+s|0}}e=e+1|0}while((e|0)!=(a|0))}}else if((d|0)>0&(a|0)>0){e=0;l=0;k=0;while(1){i=0;u=l;h=k;while(1){c[f+(h<<2)>>2]=c[j+(u<<2)>>2];i=i+1|0;if((i|0)==(a|0))break;else{u=u+1|0;h=h+1|0}}e=e+1|0;if((e|0)==(d|0))break;else{l=l+a|0;k=k+s|0}}}k=a<<1;l=R(r,b)|0;if(A&(d|0)>0){b=1;e=0;h=0;u=l;do{e=e+k|0;h=h+r|0;u=u-r|0;i=0;z=e;C=h;v=u;while(1){c[f+(z+-1<<2)>>2]=c[j+(C<<2)>>2];c[f+(z<<2)>>2]=c[j+(v<<2)>>2];i=i+1|0;if((i|0)==(d|0))break;else{z=z+s|0;C=C+a|0;v=v+a|0}}b=b+1|0}while((b|0)!=(p|0))}if(t)return;t=0-a|0;if((q|0)>=(d|0)){if(!A)return;q=(d|0)<1|(a|0)<3;b=1;u=t;h=0;e=0;v=l;do{u=u+k|0;h=h+k|0;e=e+r|0;v=v-r|0;if(!q){C=0;z=u;i=h;x=e;y=v;while(1){B=2;do{F=B+x|0;G=j+(F+-1<<2)|0;M=B+y|0;N=j+(M+-1<<2)|0;L=B+i|0;g[f+(L+-1<<2)>>2]=+g[N>>2]+ +g[G>>2];D=a-B+z|0;g[f+(D+-1<<2)>>2]=+g[G>>2]-+g[N>>2];N=j+(F<<2)|0;F=j+(M<<2)|0;g[f+(L<<2)>>2]=+g[F>>2]+ +g[N>>2];g[f+(D<<2)>>2]=+g[F>>2]-+g[N>>2];B=B+2|0}while((B|0)<(a|0));C=C+1|0;if((C|0)==(d|0))break;else{z=z+s|0;i=i+s|0;x=x+a|0;y=y+a|0}}}b=b+1|0}while((b|0)!=(p|0));return}if(!A)return;A=(a|0)>2;b=(d|0)>0;v=1;e=t;t=0;h=0;u=l;do{e=e+k|0;t=t+k|0;h=h+r|0;u=u-r|0;if(A?(l=e+a|0,b):0){q=2;do{y=0;x=l-q|0;i=q+t|0;z=q+h|0;C=q+u|0;while(1){B=j+(z+-1<<2)|0;N=j+(C+-1<<2)|0;g[f+(i+-1<<2)>>2]=+g[N>>2]+ +g[B>>2];g[f+(x+-1<<2)>>2]=+g[B>>2]-+g[N>>2];N=j+(z<<2)|0;B=j+(C<<2)|0;g[f+(i<<2)>>2]=+g[B>>2]+ +g[N>>2];g[f+(x<<2)>>2]=+g[B>>2]-+g[N>>2];y=y+1|0;if((y|0)==(d|0))break;else{x=x+s|0;i=i+s|0;z=z+a|0;C=C+a|0}}q=q+2|0}while((q|0)<(a|0))}v=v+1|0}while((v|0)!=(p|0));return}function Xb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0.0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0;d=(b|0)/4|0;e=$c(d<<2)|0;f=$c(d+b<<2)|0;h=b>>1;i=+(b|0);j=~~+Zc(+P(+i)*1.4426950408889634);c[a+4>>2]=j;c[a>>2]=b;c[a+8>>2]=f;c[a+12>>2]=e;if((b|0)<=3){k=4.0/i;l=a+16|0;g[l>>2]=k;return}m=3.141592653589793/+(b|0);n=3.141592653589793/+(b<<1|0);o=0;do{p=+(o<<2|0)*m;q=o<<1;g[f+(q<<2)>>2]=+H(+p);r=q|1;g[f+(r<<2)>>2]=-+I(+p);p=+(r|0)*n;r=q+h|0;g[f+(r<<2)>>2]=+H(+p);g[f+(r+1<<2)>>2]=+I(+p);o=o+1|0}while((o|0)<(d|0));d=(b|0)/8|0;o=(b|0)>7;if(!o){k=4.0/i;l=a+16|0;g[l>>2]=k;return}n=3.141592653589793/+(b|0);h=0;do{m=+(h<<2|2|0)*n;r=(h<<1)+b|0;g[f+(r<<2)>>2]=+H(+m)*.5;g[f+(r+1<<2)>>2]=+I(+m)*-.5;h=h+1|0}while((h|0)<(d|0));h=(1<<j+-1)+-1|0;f=1<<j+-2;if(o)s=0;else{k=4.0/i;l=a+16|0;g[l>>2]=k;return}do{o=0;j=0;b=f;do{o=((b&s|0)==0?0:1<<j)|o;j=j+1|0;b=f>>j}while((b|0)!=0);b=s<<1;c[e+(b<<2)>>2]=(h&~o)+-1;c[e+((b|1)<<2)>>2]=o;s=s+1|0}while((s|0)<(d|0));k=4.0/i;l=a+16|0;g[l>>2]=k;return}function Yb(a){a=a|0;var b=0;if(!a)return;b=c[a+8>>2]|0;if(b|0)ad(b);b=c[a+12>>2]|0;if(b|0)ad(b);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;return}function Zb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,J=0.0,K=0.0,L=0.0;c[a>>2]=b;d=bd(b*3|0,4)|0;c[a+4>>2]=d;e=bd(32,4)|0;c[a+8>>2]=e;if((b|0)==1)return;a=d+(b<<2)|0;d=e+8|0;f=-1;h=0;i=b;j=0;a:while(1){k=f+1|0;if((k|0)<4)l=c[34176+(k<<2)>>2]|0;else l=j+2|0;if((l|0)==2){m=h;n=i}else{o=h;p=i;while(1){q=p;p=(p|0)/(l|0)|0;if((q|0)!=(R(p,l)|0)){f=k;h=o;i=q;j=l;continue a}r=o+1|0;c[e+(o+2<<2)>>2]=l;if((p|0)==1){s=9;break a}else o=r}}while(1){p=m+1|0;q=n;n=(n|0)/2|0;if((q|0)!=(n<<1|0)){f=k;h=m;i=q;j=l;continue a}c[e+(m+2<<2)>>2]=2;t=(m|0)==0;if(!t){if((m|0)>=1){u=1;do{v=p-u|0;c[e+(v+2<<2)>>2]=c[e+(v+1<<2)>>2];u=u+1|0}while((u|0)!=(p|0))}c[d>>2]=2}if((q&-2|0)==2){w=t;x=p;y=m;break a}else m=p}}if((s|0)==9){w=(o|0)==0;x=r;y=o}c[e>>2]=b;c[e+4>>2]=x;z=6.2831854820251465/+(b|0);if((y|0)>0&(w^1)){A=0;B=0;C=1}else return;while(1){w=c[e+(B+2<<2)>>2]|0;x=C;C=R(w,C)|0;o=(b|0)/(C|0)|0;r=w+-1|0;do if((w|0)>1){s=R(o,r)|0;if((o|0)>2){D=A;E=0;F=0}else{G=s+A|0;break}while(1){F=F+x|0;J=+(F|0)*z;K=0.0;m=D;d=2;while(1){K=K+1.0;L=J*K;g[a+(m<<2)>>2]=+H(+L);g[a+(m+1<<2)>>2]=+I(+L);d=d+2|0;if((d|0)>=(o|0))break;else m=m+2|0}E=E+1|0;if((E|0)==(r|0))break;else D=D+o|0}G=s+A|0}else G=A;while(0);B=B+1|0;if((B|0)==(y|0))break;else A=G}return}function _b(a){a=a|0;var b=0;if(!a)return;b=c[a+4>>2]|0;if(b|0)ad(b);b=c[a+8>>2]|0;if(b|0)ad(b);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function $b(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b;e=d+112|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));c[b+64>>2]=a;c[b+76>>2]=0;c[b+68>>2]=0;if(!(c[a>>2]|0))return 0;a=bd(1,72)|0;c[b+104>>2]=a;g[a+4>>2]=-9999.0;d=b+4|0;b=a+12|0;a=0;do{if((a|0)==7)f=d;else f=bd(1,20)|0;c[b+(a<<2)>>2]=f;Fa(f);a=a+1|0}while((a|0)!=15);return 0}function ac(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+84|0;d=c[b>>2]|0;if(d|0){e=d;do{d=e;e=c[e+4>>2]|0;ad(c[d>>2]|0);ad(d)}while((e|0)!=0)}e=a+80|0;d=c[e>>2]|0;if(!d){f=a+72|0;c[f>>2]=0;c[b>>2]=0;return}g=a+68|0;h=a+76|0;c[g>>2]=cd(c[g>>2]|0,(c[h>>2]|0)+d|0)|0;c[h>>2]=(c[h>>2]|0)+(c[e>>2]|0);c[e>>2]=0;f=a+72|0;c[f>>2]=0;c[b>>2]=0;return}function bc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=c[a+104>>2]|0;d=a+84|0;e=c[d>>2]|0;if(e|0){f=e;do{e=f;f=c[f+4>>2]|0;ad(c[e>>2]|0);ad(e)}while((f|0)!=0)}f=a+80|0;e=c[f>>2]|0;g=a+68|0;h=c[g>>2]|0;if(!e)i=h;else{j=a+76|0;k=cd(h,(c[j>>2]|0)+e|0)|0;c[g>>2]=k;c[j>>2]=(c[j>>2]|0)+(c[f>>2]|0);c[f>>2]=0;i=k}c[a+72>>2]=0;c[d>>2]=0;if(i|0)ad(i);if(!b){l=a;m=l+112|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));return 0}i=b+12|0;d=0;while(1){k=i+(d<<2)|0;Ha(c[k>>2]|0);if((d|0)==7){d=8;continue}ad(c[k>>2]|0);d=d+1|0;if((d|0)==15)break}ad(b);l=a;m=l+112|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));return 0}function cc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=c[b+28>>2]|0;if(!e){f=1;return f|0}g=c[e+3656>>2]|0;h=a;i=h+112|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0));h=bd(1,136)|0;c[a+104>>2]=h;c[a+4>>2]=b;i=c[e+8>>2]|0;j=i+-1|0;if((i|0)==0|(j|0)==0)k=0;else{i=0;l=j;while(1){j=i+1|0;l=l>>>1;if(!l){k=j;break}else i=j}}c[h+44>>2]=k;k=bd(1,4)|0;i=h+12|0;c[i>>2]=k;l=bd(1,4)|0;j=h+16|0;c[j>>2]=l;c[k>>2]=bd(1,20)|0;c[l>>2]=bd(1,20)|0;Xb(c[c[i>>2]>>2]|0,c[e>>2]>>g);i=e+4|0;Xb(c[c[j>>2]>>2]|0,c[i>>2]>>g);g=c[e>>2]|0;j=g+-1|0;if((g|0)==0|(j|0)==0)m=0;else{l=0;k=j;while(1){j=l+1|0;k=k>>>1;if(!k){m=j;break}else l=j}}c[h+4>>2]=m+-6;m=c[i>>2]|0;l=m+-1|0;if((m|0)==0|(l|0)==0)n=0;else{m=0;k=l;while(1){l=m+1|0;k=k>>>1;if(!k){n=l;break}else m=l}}c[h+8>>2]=n+-6;a:do if(!d){n=e+2848|0;if((c[n>>2]|0)==0?(m=e+24|0,c[n>>2]=bd(c[m>>2]|0,56)|0,k=c[m>>2]|0,(k|0)>0):0){l=k;k=0;while(1){j=e+1824+(k<<2)|0;o=c[j>>2]|0;if(!o){p=l;break}if(fc((c[n>>2]|0)+(k*56|0)|0,o)|0){q=23;break}gc(c[j>>2]|0);c[j>>2]=0;k=k+1|0;l=c[m>>2]|0;if((k|0)>=(l|0))break a}if((q|0)==23)p=c[m>>2]|0;if((p|0)>0){l=p;k=0;while(1){n=e+1824+(k<<2)|0;j=c[n>>2]|0;if(!j)r=l;else{gc(j);c[n>>2]=0;r=c[m>>2]|0}k=k+1|0;if((k|0)>=(r|0))break;else l=r}}hc(a);f=-1;return f|0}}else{Zb(h+20|0,g);Zb(h+32|0,c[i>>2]|0);l=e+2848|0;if(((c[l>>2]|0)==0?(k=e+24|0,m=bd(c[k>>2]|0,56)|0,c[l>>2]=m,(c[k>>2]|0)>0):0)?(dc(m,c[e+1824>>2]|0)|0,(c[k>>2]|0)>1):0){m=1;do{dc((c[l>>2]|0)+(m*56|0)|0,c[e+1824+(m<<2)>>2]|0)|0;m=m+1|0}while((m|0)<(c[k>>2]|0))}k=e+28|0;m=bd(c[k>>2]|0,52)|0;l=h+56|0;c[l>>2]=m;b:do if((c[k>>2]|0)>0){n=e+2868|0;j=b+8|0;o=m;s=0;while(1){t=c[e+2852+(s<<2)>>2]|0;ec(o+(s*52|0)|0,t,n,(c[e+(c[t>>2]<<2)>>2]|0)/2|0,c[j>>2]|0);t=s+1|0;if((t|0)>=(c[k>>2]|0))break b;o=c[l>>2]|0;s=t}}while(0);c[a>>2]=1}while(0);g=c[i>>2]|0;c[a+16>>2]=g;r=c[b+4>>2]|0;b=r<<2;p=$c(b)|0;q=a+8|0;c[q>>2]=p;c[a+12>>2]=$c(b)|0;if((r|0)>0?(c[p>>2]=bd(g,4)|0,(r|0)!=1):0){p=1;do{b=c[q>>2]|0;c[b+(p<<2)>>2]=bd(g,4)|0;p=p+1|0}while((p|0)<(r|0))}c[a+36>>2]=0;c[a+40>>2]=0;r=(c[i>>2]|0)/2|0;c[a+48>>2]=r;c[a+20>>2]=r;r=e+16|0;i=h+48|0;c[i>>2]=bd(c[r>>2]|0,4)|0;p=e+20|0;g=h+52|0;c[g>>2]=bd(c[p>>2]|0,4)|0;if((c[r>>2]|0)>0){h=0;do{q=wa[c[(c[456+(c[e+800+(h<<2)>>2]<<2)>>2]|0)+8>>2]&15](a,c[e+1056+(h<<2)>>2]|0)|0;c[(c[i>>2]|0)+(h<<2)>>2]=q;h=h+1|0}while((h|0)<(c[r>>2]|0))}if((c[p>>2]|0)>0)u=0;else{f=0;return f|0}do{r=wa[c[(c[464+(c[e+1312+(u<<2)>>2]<<2)>>2]|0)+8>>2]&15](a,c[e+1568+(u<<2)>>2]|0)|0;c[(c[g>>2]|0)+(u<<2)>>2]=r;u=u+1|0}while((u|0)<(c[p>>2]|0));f=0;return f|0}\nfunction dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0.0;d=a+16|0;e=d+40|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));c[a+12>>2]=b;d=b+4|0;e=c[d>>2]|0;c[a+4>>2]=e;c[a+8>>2]=e;c[a>>2]=c[b>>2];c[a+20>>2]=mc(c[b+8>>2]|0,e,0)|0;e=c[d>>2]|0;d=c[b>>2]|0;if((d|0)<=0)while(1){}f=~~+D(+(+G(+(+(e|0)),+(1.0/+(d|0)))));while(1){g=f+1|0;h=1;i=1;j=0;do{h=R(h,f)|0;i=R(i,g)|0;j=j+1|0}while((j|0)!=(d|0));if((i|0)>(e|0)&(h|0)<=(e|0))break;else f=((h|0)>(e|0)?-1:1)+f|0}c[a+44>>2]=f;f=c[b+16>>2]|0;k=+(f&2097151|0);c[a+48>>2]=~~+_c(+Yc((f|0)<0?-k:k,(f>>>21&1023)+-788|0));f=c[b+20>>2]|0;k=+(f&2097151|0);c[a+52>>2]=~~+_c(+Yc((f|0)<0?-k:k,(f>>>21&1023)+-788|0));return 0}function ec(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0.0;h=a+8|0;c[h>>2]=0;c[h+4>>2]=0;h=c[d>>2]|0;c[a+36>>2]=h;d=~~(+Zc(+P(+(+(h|0)*8.0))*1.4426950408889634)+-1.0);i=a+32|0;c[i>>2]=d;j=+(f|0);k=+(e|0);l=+(1<<d+1|0);d=~~(l*(+P(+(j*.25*.5/k))*1.4426950216293335+-5.965784072875977)-+(h|0));c[a+28>>2]=d;c[a+40>>2]=1-d+~~(l*(+P(+((+(e|0)+.25)*j*.5/k))*1.4426950216293335+-5.965784072875977)+.5);d=e<<2;h=$c(d)|0;c[a+16>>2]=h;m=$c(d)|0;c[a+20>>2]=m;n=$c(d)|0;c[a+24>>2]=n;o=a+4|0;c[o>>2]=b;c[a>>2]=e;c[a+44>>2]=f;p=a+48|0;g[p>>2]=1.0;if((f|0)>=26e3)if((f|0)>=38e3){if((f|0)>46e3){q=1.274999976158142;r=4}}else{q=.9399999976158142;r=4}else{q=0.0;r=4}if((r|0)==4)g[p>>2]=q;q=k*2.0;j=+(f|0);p=0;s=0;a:while(1){t=(s|0)<(e|0);u=p;while(1){v=u;while(1){if((v|0)>=87)break a;w=v+1|0;x=~~+Zc(q*+O(+(+(w|0)*.08664337545633316+2.7488713472395148))/j);if((x|0)>(s|0))break;else v=w}if(t)break;else u=w}l=+g[34192+(v<<2)>>2];y=(+g[34192+(w<<2)>>2]-l)/+(x-s|0);z=l;u=s;while(1){g[h+(u<<2)>>2]=z+100.0;t=u+1|0;if((t|0)<(x|0)&(t|0)<(e|0)){z=z+y;u=t}else{p=w;s=t;continue a}}}if((s|0)<(e|0)){w=c[h+((s<<2)+-4)>>2]|0;p=s;do{c[h+(p<<2)>>2]=w;p=p+1|0}while((p|0)!=(e|0))}p=(e|0)>0;if(p){w=(f|0)/(e<<1|0)|0;f=c[b+120>>2]|0;h=b+124|0;s=b+116|0;x=b+112|0;v=1;u=0;t=-99;while(1){A=R(w,u)|0;y=+(A|0);z=+M(+(+(R(A,A)|0)*1.8499999754340024e-08))*2.240000009536743+ +M(+(y*7.399999885819852e-04))*13.100000381469727+y*9.999999747378752e-05;b:do if((f+t|0)<(u|0)){y=z-+g[x>>2];A=t;while(1){B=R(A,w)|0;l=+(B|0);if(!(+M(+(l*7.399999885819852e-04))*13.100000381469727+l*9.999999747378752e-05+ +M(+(+(R(B,B)|0)*1.8499999754340024e-08))*2.240000009536743<y)){C=A;break b}B=A+1|0;if((f+B|0)<(u|0))A=B;else{C=B;break}}}else C=t;while(0);c:do if((v|0)>(e|0))D=v;else{A=(c[h>>2]|0)+u|0;B=v;while(1){if((B|0)>=(A|0)?(E=R(B,w)|0,y=+(E|0),l=+M(+(y*7.399999885819852e-04))*13.100000381469727+y*9.999999747378752e-05+ +M(+(+(R(E,E)|0)*1.8499999754340024e-08))*2.240000009536743,!(l<+g[s>>2]+z)):0){D=B;break c}E=B+1|0;if((B|0)<(e|0))B=E;else{D=E;break}}}while(0);c[n+(u<<2)>>2]=(C<<16)+-65537+D;u=u+1|0;if((u|0)==(e|0))break;else{v=D;t=C}}if(p){z=j*.5;l=+(1<<(c[i>>2]|0)+1|0);i=0;do{c[m+(i<<2)>>2]=~~(l*(+P(+(z*(+(i|0)+.25)/k))*1.4426950216293335+-5.965784072875977)+.5);i=i+1|0}while((i|0)!=(e|0));F=z}else r=19}else r=19;if((r|0)==19)F=j*.5;c[a+8>>2]=pc(b+36|0,F/k,e,+g[b+24>>2],+g[b+28>>2])|0;b=$c(12)|0;r=a+12|0;c[r>>2]=b;c[b>>2]=$c(d)|0;c[b+4>>2]=$c(d)|0;b=$c(d)|0;c[(c[r>>2]|0)+8>>2]=b;if(!p)return;p=c[o>>2]|0;o=c[r>>2]|0;r=c[o>>2]|0;b=c[o+4>>2]|0;d=c[o+8>>2]|0;o=0;do{k=+P(+((+(o|0)+.5)*j/q))*2.885390043258667+-11.931568145751953;F=k<0.0?0.0:k;k=F>=16.0?16.0:F;a=~~k;F=k-+(a|0);k=1.0-F;i=a+1|0;g[r+(o<<2)>>2]=+g[p+132+(i<<2)>>2]*F+ +g[p+132+(a<<2)>>2]*k;g[b+(o<<2)>>2]=+g[p+200+(i<<2)>>2]*F+ +g[p+200+(a<<2)>>2]*k;g[d+(o<<2)>>2]=+g[p+268+(i<<2)>>2]*F+ +g[p+268+(a<<2)>>2]*k;o=o+1|0}while((o|0)!=(e|0));return}function fc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;e=l;f=b;g=f+56|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));h=d+4|0;i=c[h>>2]|0;if((i|0)>0){j=c[d+8>>2]|0;k=0;m=0;while(1){n=((c[j+(k<<2)>>2]|0)>0&1)+m|0;k=k+1|0;if((k|0)>=(i|0)){o=n;break}else m=n}}else o=0;c[b+4>>2]=i;m=b+8|0;c[m>>2]=o;c[b>>2]=c[d>>2];if((o|0)<=0){p=0;l=e;return p|0}k=d+8|0;j=mc(c[k>>2]|0,i,o)|0;i=o<<2;n=l;l=l+((1*i|0)+15&-16)|0;if(!j){q=c[b+16>>2]|0;if(q|0)ad(q);q=c[b+20>>2]|0;if(q|0)ad(q);q=c[b+24>>2]|0;if(q|0)ad(q);q=c[b+28>>2]|0;if(q|0)ad(q);q=c[b+32>>2]|0;if(q|0)ad(q);f=b;g=f+56|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));p=-1;l=e;return p|0}else r=0;do{f=j+(r<<2)|0;g=kd(c[f>>2]|0)|0;q=g>>>4&252645135|g<<4&-252645136;g=q>>>2&858993459|q<<2&-858993460;c[f>>2]=g>>>1&1431655765|g<<1&-1431655766;c[n+(r<<2)>>2]=f;r=r+1|0}while((r|0)!=(o|0));Pc(n,o,4,13);r=l;l=l+((1*i|0)+15&-16)|0;f=$c(i)|0;g=b+20|0;c[g>>2]=f;q=j;s=0;do{c[r+((c[n+(s<<2)>>2]|0)-q>>2<<2)>>2]=s;s=s+1|0}while((s|0)!=(o|0));t=0;do{c[f+(c[r+(t<<2)>>2]<<2)>>2]=c[j+(t<<2)>>2];t=t+1|0}while((t|0)!=(o|0));ad(j);c[b+16>>2]=oc(d,o,r)|0;o=$c(i)|0;c[b+24>>2]=o;i=c[h>>2]|0;d=(i|0)>0;if(d){j=c[k>>2]|0;t=0;f=0;while(1){if((c[j+(t<<2)>>2]|0)>0){c[o+(c[r+(f<<2)>>2]<<2)>>2]=t;u=f+1|0}else u=f;t=t+1|0;if((t|0)>=(i|0))break;else f=u}f=b+28|0;c[f>>2]=$c(u)|0;if(d){d=i;i=0;u=0;while(1){t=c[(c[k>>2]|0)+(i<<2)>>2]|0;if((t|0)>0){a[(c[f>>2]|0)+(c[r+(u<<2)>>2]|0)>>0]=t;v=c[h>>2]|0;w=u+1|0}else{v=d;w=u}i=i+1|0;if((i|0)>=(v|0)){x=f;y=w;break}else{d=v;u=w}}}else{x=f;y=0}}else{f=b+28|0;c[f>>2]=$c(0)|0;x=f;y=0}f=c[m>>2]|0;if(!f)z=-4;else{m=0;w=f;while(1){w=w>>>1;if(!w)break;else m=m+1|0}z=m+-3|0}m=b+36|0;w=(z|0)>5?z:5;z=(w|0)<8?w:8;c[m>>2]=z;w=1<<z;f=bd(w,4)|0;c[b+32>>2]=f;u=b+40|0;c[u>>2]=0;a:do if((y|0)>0){b=c[x>>2]|0;v=0;d=z;i=0;while(1){h=b+i|0;r=a[h>>0]|0;k=r<<24>>24;if((v|0)<(k|0)){c[u>>2]=k;A=a[h>>0]|0}else A=r;r=A<<24>>24;if((d|0)>=(r|0)?(k=kd(c[(c[g>>2]|0)+(i<<2)>>2]|0)|0,t=k>>>4&252645135|k<<4&-252645136,k=t>>>2&858993459|t<<2&-858993460,t=k>>>1&1431655765|k<<1&-1431655766,(d-r|0)!=31):0){k=i+1|0;o=r;r=0;do{c[f+((t|r<<o)<<2)>>2]=k;r=r+1|0;j=c[m>>2]|0;o=a[h>>0]|0}while((r|0)<(1<<j-o|0));B=j}else B=d;o=i+1|0;if((o|0)==(y|0)){C=B;break a}v=c[u>>2]|0;d=B;i=o}}else C=z;while(0);z=-2<<31-C;B=C;C=0;u=0;A=0;while(1){x=u<<32-B;i=kd(x|0)|0;d=i>>>4&252645135|i<<4&-252645136;i=d>>>2&858993459|d<<2&-858993460;d=f+((i>>>1&1431655765|i<<1&-1431655766)<<2)|0;if(!(c[d>>2]|0)){i=A;while(1){v=i+1|0;if((v|0)>=(y|0))break;if((c[(c[g>>2]|0)+(v<<2)>>2]|0)>>>0>x>>>0)break;else i=v}b:do if((y|0)>(C|0)){v=c[g>>2]|0;b=C;while(1){if(x>>>0<(c[v+(b<<2)>>2]&z)>>>0){D=b;break b}o=b+1|0;if((y|0)>(o|0))b=o;else{D=o;break}}}else D=C;while(0);x=y-D|0;c[d>>2]=(i>>>0<32767?i:32767)<<15|(x>>>0<32767?x:32767)|-2147483648;E=D;F=i}else{E=C;F=A}x=u+1|0;if((x|0)>=(w|0)){p=0;break}B=c[m>>2]|0;C=E;u=x;A=F}l=e;return p|0}function gc(a){a=a|0;var b=0;if(!(c[a+36>>2]|0))return;b=c[a+32>>2]|0;if(b|0)ad(b);b=c[a+8>>2]|0;if(b|0)ad(b);ad(a);return}function hc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!a)return;b=c[a+4>>2]|0;d=(b|0)!=0;if(d)e=c[b+28>>2]|0;else e=0;f=c[a+104>>2]|0;g=(f|0)!=0;if(g){h=c[f>>2]|0;if(h|0){ic(h);ad(c[f>>2]|0)}h=f+12|0;i=c[h>>2]|0;if(i|0){Yb(c[i>>2]|0);ad(c[c[h>>2]>>2]|0);ad(c[h>>2]|0)}h=f+16|0;i=c[h>>2]|0;if(i|0){Yb(c[i>>2]|0);ad(c[c[h>>2]>>2]|0);ad(c[h>>2]|0)}h=f+48|0;i=c[h>>2]|0;if(i|0){if((e|0)!=0?(j=e+16|0,(c[j>>2]|0)>0):0){ra[c[(c[456+(c[e+800>>2]<<2)>>2]|0)+16>>2]&7](c[i>>2]|0);if((c[j>>2]|0)>1){k=1;do{ra[c[(c[456+(c[e+800+(k<<2)>>2]<<2)>>2]|0)+16>>2]&7](c[(c[h>>2]|0)+(k<<2)>>2]|0);k=k+1|0}while((k|0)<(c[j>>2]|0))}l=c[h>>2]|0}else l=i;ad(l)}l=f+52|0;i=c[l>>2]|0;if(i|0){if((e|0)!=0?(h=e+20|0,(c[h>>2]|0)>0):0){ra[c[(c[464+(c[e+1312>>2]<<2)>>2]|0)+16>>2]&7](c[i>>2]|0);if((c[h>>2]|0)>1){j=1;do{ra[c[(c[464+(c[e+1312+(j<<2)>>2]<<2)>>2]|0)+16>>2]&7](c[(c[l>>2]|0)+(j<<2)>>2]|0);j=j+1|0}while((j|0)<(c[h>>2]|0))}m=c[l>>2]|0}else m=i;ad(m)}m=f+56|0;i=c[m>>2]|0;if(i|0){if((e|0)!=0?(l=e+28|0,(c[l>>2]|0)>0):0){jc(i);if((c[l>>2]|0)>1){e=1;do{jc((c[m>>2]|0)+(e*52|0)|0);e=e+1|0}while((e|0)<(c[l>>2]|0))}n=c[m>>2]|0}else n=i;ad(n)}n=c[f+60>>2]|0;if(n|0)kc(n);lc(f+80|0);_b(f+20|0);_b(f+32|0)}n=a+8|0;i=c[n>>2]|0;if(i|0){if(d?(d=b+4|0,b=c[d>>2]|0,(b|0)>0):0){m=i;l=b;b=0;while(1){e=c[m+(b<<2)>>2]|0;if(!e)o=l;else{ad(e);o=c[d>>2]|0}e=b+1|0;if((e|0)>=(o|0))break;m=c[n>>2]|0;l=o;b=e}p=c[n>>2]|0}else p=i;ad(p);p=c[a+12>>2]|0;if(p|0)ad(p)}if(g){g=c[f+64>>2]|0;if(g|0)ad(g);g=c[f+68>>2]|0;if(g|0)ad(g);g=c[f+72>>2]|0;if(g|0)ad(g);ad(f)}f=a;a=f+112|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(a|0));return}function ic(a){a=a|0;Yb(a+16|0);ad(c[a+48>>2]|0);ad(c[a+64>>2]|0);ad(c[a+80>>2]|0);ad(c[a+96>>2]|0);ad(c[a+112>>2]|0);ad(c[a+128>>2]|0);ad(c[a+144>>2]|0);ad(c[a+36>>2]|0);ad(c[a+152>>2]|0);ad(c[a+160>>2]|0);id(a|0,0,180)|0;return}function jc(a){a=a|0;var b=0,d=0,e=0,f=0;if(!a)return;b=c[a+16>>2]|0;if(b|0)ad(b);b=c[a+20>>2]|0;if(b|0)ad(b);b=c[a+24>>2]|0;if(b|0)ad(b);b=a+8|0;d=c[b>>2]|0;if(d|0){e=d;d=0;while(1){ad(c[c[e+(d<<2)>>2]>>2]|0);ad(c[(c[(c[b>>2]|0)+(d<<2)>>2]|0)+4>>2]|0);ad(c[(c[(c[b>>2]|0)+(d<<2)>>2]|0)+8>>2]|0);ad(c[(c[(c[b>>2]|0)+(d<<2)>>2]|0)+12>>2]|0);ad(c[(c[(c[b>>2]|0)+(d<<2)>>2]|0)+16>>2]|0);ad(c[(c[(c[b>>2]|0)+(d<<2)>>2]|0)+20>>2]|0);ad(c[(c[(c[b>>2]|0)+(d<<2)>>2]|0)+24>>2]|0);ad(c[(c[(c[b>>2]|0)+(d<<2)>>2]|0)+28>>2]|0);ad(c[(c[b>>2]|0)+(d<<2)>>2]|0);f=d+1|0;if((f|0)==17)break;e=c[b>>2]|0;d=f}ad(c[b>>2]|0)}b=a+12|0;d=c[b>>2]|0;if(d|0){ad(c[d>>2]|0);ad(c[(c[b>>2]|0)+4>>2]|0);ad(c[(c[b>>2]|0)+8>>2]|0);ad(c[b>>2]|0)}b=a;a=b+52|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function kc(a){a=a|0;if(!a)return;ad(a);return}function lc(a){a=a|0;var b=0;b=a;a=b+48|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function mc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=l;l=l+144|0;f=e;g=(d|0)!=0;h=$c((g?d:b)<<2)|0;id(f|0,0,132)|0;i=(b|0)>0;a:do if(i){j=f+4|0;k=(d|0)==0&1;m=0;n=0;b:while(1){o=c[a+(n<<2)>>2]|0;c:do if((o|0)>0){p=c[f+(o<<2)>>2]|0;if(!((o|0)>31|(p>>>o|0)==0))break b;q=m+1|0;c[h+(m<<2)>>2]=p;r=f+(o<<2)|0;d:do if(!(p&1)){s=p;t=r;u=o;while(1){c[t>>2]=s+1;v=u+-1|0;if((u|0)<=1)break d;s=c[f+(v<<2)>>2]|0;w=f+(v<<2)|0;if(s&1|0){x=w;y=v;z=7;break}else{t=w;u=v}}}else{x=r;y=o;z=7}while(0);do if((z|0)==7){z=0;if((y|0)==1){c[j>>2]=(c[j>>2]|0)+1;break}else{c[x>>2]=c[f+(y+-1<<2)>>2]<<1;break}}while(0);r=o+1|0;if((r|0)<33){u=p;t=o;s=r;while(1){r=f+(s<<2)|0;v=u;u=c[r>>2]|0;if((u>>>1|0)!=(v|0)){A=q;break c}c[r>>2]=c[f+(t<<2)>>2]<<1;r=s+1|0;if((r|0)>=33){A=q;break}else{v=s;s=r;t=v}}}else A=q}else A=m+k|0;while(0);n=n+1|0;if((n|0)>=(b|0))break a;else m=A}ad(h);B=0;l=e;return B|0}while(0);e:do if((d|0)!=1){A=1;while(1){if(c[f+(A<<2)>>2]&-1>>>(32-A|0)|0)break;A=A+1|0;if((A|0)>=33)break e}ad(h);B=0;l=e;return B|0}while(0);if(!i){B=h;l=e;return B|0}if(g){C=0;D=0}else{g=0;do{i=c[a+(g<<2)>>2]|0;f=h+(g<<2)|0;if((i|0)>0){d=c[f>>2]|0;A=0;y=0;while(1){x=d>>>A&1|y<<1;A=A+1|0;if((A|0)>=(i|0)){E=x;break}else y=x}}else E=0;g=g+1|0;c[f>>2]=E}while((g|0)!=(b|0));B=h;l=e;return B|0}while(1){g=c[a+(D<<2)>>2]|0;if((g|0)>0){E=c[h+(C<<2)>>2]|0;y=0;i=0;while(1){A=E>>>y&1|i<<1;y=y+1|0;if((y|0)>=(g|0)){F=A;break}else i=A}}else F=0;if(!g)G=C;else{c[h+(C<<2)>>2]=F;G=C+1|0}D=D+1|0;if((D|0)==(b|0)){B=h;break}else C=G}l=e;return B|0}function nc(a,b){a=a|0;b=b|0;var d=0;d=c[c[a>>2]>>2]|0;a=c[c[b>>2]>>2]|0;return (d>>>0>a>>>0&1)-(d>>>0<a>>>0&1)|0}function oc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0;e=c[a+12>>2]|0;if((e+-1|0)>>>0>=2){f=0;return f|0}h=c[a+16>>2]|0;i=+(h&2097151|0);j=+Yc((h|0)<0?-i:i,(h>>>21&1023)+-788|0);h=c[a+20>>2]|0;i=+(h&2097151|0);k=+Yc((h|0)<0?-i:i,(h>>>21&1023)+-788|0);h=c[a>>2]|0;l=bd(R(h,b)|0,4)|0;switch(e|0){case 1:{e=c[a+4>>2]|0;if((h|0)<=0)while(1){}b=~~+D(+(+G(+(+(e|0)),+(1.0/+(h|0)))));while(1){m=b+1|0;n=1;o=1;p=0;do{n=R(n,b)|0;o=R(o,m)|0;p=p+1|0}while((p|0)!=(h|0));if((o|0)>(e|0)&(n|0)<=(e|0))break;else b=((n|0)>(e|0)?-1:1)+b|0}if((e|0)<=0){f=l;return f|0}p=(d|0)==0;m=a+8|0;q=a+32|0;i=k;r=j;s=a+28|0;t=0;u=0;while(1){if(p){v=c[q>>2]|0;w=R(t,h)|0;if(!(c[s>>2]|0)){x=1;y=0;do{g[l+(w+y<<2)>>2]=r+ +E(+(+(c[v+((((u|0)/(x|0)|0|0)%(b|0)|0)<<2)>>2]|0)))*i;x=R(x,b)|0;y=y+1|0}while((y|0)<(h|0));z=21}else{y=1;x=0;A=0.0;do{A=A+r+ +E(+(+(c[v+((((u|0)/(y|0)|0|0)%(b|0)|0)<<2)>>2]|0)))*i;g[l+(w+x<<2)>>2]=A;y=R(y,b)|0;x=x+1|0}while((x|0)<(h|0));z=21}}else if(c[(c[m>>2]|0)+(u<<2)>>2]|0){x=c[q>>2]|0;y=R(c[d+(t<<2)>>2]|0,h)|0;if(!(c[s>>2]|0)){w=1;v=0;do{g[l+(y+v<<2)>>2]=r+ +E(+(+(c[x+((((u|0)/(w|0)|0|0)%(b|0)|0)<<2)>>2]|0)))*i;w=R(w,b)|0;v=v+1|0}while((v|0)<(h|0));z=21}else{v=1;w=0;A=0.0;do{A=A+r+ +E(+(+(c[x+((((u|0)/(v|0)|0|0)%(b|0)|0)<<2)>>2]|0)))*i;g[l+(y+w<<2)>>2]=A;v=R(v,b)|0;w=w+1|0}while((w|0)<(h|0));z=21}}else B=t;if((z|0)==21){z=0;B=t+1|0}u=u+1|0;if((u|0)>=(e|0)){f=l;break}else t=B}return f|0}case 2:{B=c[a+4>>2]|0;if((B|0)<=0){f=l;return f|0}t=(d|0)!=0;e=a+8|0;u=a+32|0;i=k;k=j;z=a+28|0;a=(h|0)>0;b=0;s=0;while(1){if(t?(c[(c[e>>2]|0)+(s<<2)>>2]|0)==0:0)C=b;else{if(a){q=c[u>>2]|0;m=(c[z>>2]|0)==0;if(t){p=R(h,s)|0;w=R(c[d+(b<<2)>>2]|0,h)|0;if(m){v=0;do{g[l+(w+v<<2)>>2]=k+ +E(+(+(c[q+(p+v<<2)>>2]|0)))*i;v=v+1|0}while((v|0)<(h|0))}else{v=0;j=0.0;do{j=j+k+ +E(+(+(c[q+(p+v<<2)>>2]|0)))*i;g[l+(w+v<<2)>>2]=j;v=v+1|0}while((v|0)<(h|0))}}else{v=R(h,s)|0;w=R(b,h)|0;if(m){p=0;do{g[l+(w+p<<2)>>2]=k+ +E(+(+(c[q+(v+p<<2)>>2]|0)))*i;p=p+1|0}while((p|0)<(h|0))}else{p=0;j=0.0;do{j=j+k+ +E(+(+(c[q+(v+p<<2)>>2]|0)))*i;g[l+(w+p<<2)>>2]=j;p=p+1|0}while((p|0)<(h|0))}}}C=b+1|0}s=s+1|0;if((s|0)>=(B|0)){f=l;break}else b=C}return f|0}default:{f=l;return f|0}}return 0}function pc(a,b,d,e,f){a=a|0;b=+b;d=d|0;e=+e;f=+f;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0;h=l;l=l+32480|0;i=h+32256|0;j=h+1792|0;k=h;m=l;l=l+((1*(d<<2)|0)+15&-16)|0;n=$c(68)|0;id(j|0,0,30464)|0;o=e>0.0;p=e<0.0;q=0;do{r=q<<2;s=0;do{t=s+r|0;if((t|0)<88)u=+g[34192+(t<<2)>>2];else u=-30.0;v=t+1|0;if((v|0)<88){w=+g[34192+(v<<2)>>2];if(u>w)x=w;else x=u}else if(u>-30.0)x=-30.0;else x=u;v=t+2|0;if((v|0)<88){w=+g[34192+(v<<2)>>2];if(x>w)y=w;else y=x}else if(x>-30.0)y=-30.0;else y=x;v=t+3|0;if((v|0)<88){w=+g[34192+(v<<2)>>2];if(y>w)z=w;else z=y}else if(y>-30.0)z=-30.0;else z=y;g[i+(s<<2)>>2]=z;s=s+1|0}while((s|0)!=56);s=34544+(q*1344|0)|0;md(j+(q*1792|0)+448|0,s|0,224)|0;md(j+(q*1792|0)+672|0,34544+(q*1344|0)+224|0,224)|0;md(j+(q*1792|0)+896|0,34544+(q*1344|0)+448|0,224)|0;md(j+(q*1792|0)+1120|0,34544+(q*1344|0)+672|0,224)|0;md(j+(q*1792|0)+1344|0,34544+(q*1344|0)+896|0,224)|0;md(j+(q*1792|0)+1568|0,34544+(q*1344|0)+1120|0,224)|0;md(j+(q*1792|0)|0,s|0,224)|0;md(j+(q*1792|0)+224|0,s|0,224)|0;if(o){s=0;do{if(p){r=0;do{v=16-r|0;w=+(((v|0)>-1?v:0-v|0)|0)*f+e;A=w<0.0?0.0:w;v=j+(q*1792|0)+(s*224|0)+(r<<2)|0;g[v>>2]=+g[v>>2]+(A>0.0?0.0:A);r=r+1|0}while((r|0)!=56)}else{r=0;do{v=16-r|0;A=+(((v|0)>-1?v:0-v|0)|0)*f+e;v=j+(q*1792|0)+(s*224|0)+(r<<2)|0;g[v>>2]=+g[v>>2]+(A<0.0?0.0:A);r=r+1|0}while((r|0)!=56)}s=s+1|0}while((s|0)!=8)}else{s=0;do{if(p){r=0;do{v=16-r|0;A=+(((v|0)>-1?v:0-v|0)|0)*f+e;v=j+(q*1792|0)+(s*224|0)+(r<<2)|0;g[v>>2]=+g[v>>2]+(A>0.0?0.0:A);r=r+1|0}while((r|0)!=56)}else{r=0;do{v=16-r|0;t=j+(q*1792|0)+(s*224|0)+(r<<2)|0;g[t>>2]=+g[t>>2]+(+(((v|0)>-1?v:0-v|0)|0)*f+e);r=r+1|0}while((r|0)!=56)}s=s+1|0}while((s|0)!=8)}A=+g[a+(q<<2)>>2];s=0;do{w=+(((s|0)>2?s:2)|0)*-10.0+70.0+A;r=0;do{v=j+(q*1792|0)+(s*224|0)+(r<<2)|0;g[v>>2]=+g[v>>2]+w;r=r+1|0}while((r|0)!=56);md(k+(s*224|0)|0,i|0,224)|0;w=+(s|0)*-10.0+70.0;r=0;do{v=k+(s*224|0)+(r<<2)|0;g[v>>2]=w+ +g[v>>2];r=r+1|0}while((r|0)!=56);B=0;do{w=+g[j+(q*1792|0)+(s*224|0)+(B<<2)>>2];r=k+(s*224|0)+(B<<2)|0;if(w>+g[r>>2])g[r>>2]=w;B=B+1|0}while((B|0)!=56);s=s+1|0}while((s|0)!=8);C=1;do{s=C+-1|0;r=0;do{A=+g[k+(s*224|0)+(r<<2)>>2];v=k+(C*224|0)+(r<<2)|0;if(A<+g[v>>2])g[v>>2]=A;r=r+1|0}while((r|0)!=56);E=0;do{A=+g[k+(C*224|0)+(E<<2)>>2];r=j+(q*1792|0)+(C*224|0)+(E<<2)|0;if(A<+g[r>>2])g[r>>2]=A;E=E+1|0}while((E|0)!=56);C=C+1|0}while((C|0)!=8);q=q+1|0}while((q|0)!=17);e=b;q=(d|0)>0;C=0;do{E=$c(32)|0;k=n+(C<<2)|0;c[k>>2]=E;f=+(C|0);z=f*.5;B=~~+D(+(+O(+(f*.34657350182533264+4.135165354540845))/e));i=~~+Q(+(+P(+(+(B|0)*b+1.0))*2.885390043258667+-11.931568145751953));a=~~+D(+(+P(+(+(B+1|0)*b))*2.885390043258667+-11.931568145751953));B=(i|0)>(C|0)?C:i;i=(B|0)>0?B:0;B=(a|0)<16?a:16;a=(i|0)>(B|0);C=C+1|0;p=(C|0)<17;f=z+3.9657840728759766;o=E;E=0;do{c[o+(E<<2)>>2]=$c(232)|0;if(q){r=0;do{g[m+(r<<2)>>2]=999.0;r=r+1|0}while((r|0)!=(d|0))}if(!a){r=i;while(1){y=+(r|0)*.5;s=0;v=0;while(1){x=+(s|0)*.125+y;t=~~(+O(+((x+3.9032840728759766)*.6931470036506653))/e);F=~~(+O(+((x+4.028284072875977)*.6931470036506653))/e+1.0);G=(t|0)>0?t:0;t=(G|0)>(d|0)?d:G;G=(t|0)<(v|0)?t:v;t=(F|0)>0?F:0;F=(t|0)>(d|0)?d:t;if((G|0)<(F|0)&(G|0)<(d|0)){x=+g[j+(r*1792|0)+(E*224|0)+(s<<2)>>2];t=G;while(1){H=m+(t<<2)|0;if(+g[H>>2]>x)g[H>>2]=x;H=t+1|0;if((H|0)<(F|0)&(H|0)<(d|0))t=H;else{I=H;break}}}else I=G;s=s+1|0;if((s|0)==56)break;else v=I}if((I|0)<(d|0)){y=+g[j+(r*1792|0)+(E*224|0)+220>>2];v=I;do{s=m+(v<<2)|0;if(+g[s>>2]>y)g[s>>2]=y;v=v+1|0}while((v|0)!=(d|0))}if((r|0)<(B|0))r=r+1|0;else break}}if(p){r=0;v=0;while(1){y=+(r|0)*.125+z;s=~~(+O(+((y+3.9032840728759766)*.6931470036506653))/e);t=~~(+O(+((y+4.028284072875977)*.6931470036506653))/e+1.0);F=(s|0)>0?s:0;s=(F|0)>(d|0)?d:F;F=(s|0)<(v|0)?s:v;s=(t|0)>0?t:0;t=(s|0)>(d|0)?d:s;if((F|0)<(t|0)&(F|0)<(d|0)){y=+g[j+(C*1792|0)+(E*224|0)+(r<<2)>>2];s=F;while(1){H=m+(s<<2)|0;if(+g[H>>2]>y)g[H>>2]=y;H=s+1|0;if((H|0)<(t|0)&(H|0)<(d|0))s=H;else{J=H;break}}}else J=F;r=r+1|0;if((r|0)==56)break;else v=J}if((J|0)<(d|0)){y=+g[j+(C*1792|0)+(E*224|0)+220>>2];v=J;do{r=m+(v<<2)|0;if(+g[r>>2]>y)g[r>>2]=y;v=v+1|0}while((v|0)!=(d|0))}}o=c[k>>2]|0;v=c[o+(E<<2)>>2]|0;r=0;do{s=~~(+O(+((f+ +(r|0)*.125)*.6931470036506653))/e);if((s|0)>-1&(s|0)<(d|0))K=+g[m+(s<<2)>>2];else K=-999.0;g[v+(r+2<<2)>>2]=K;r=r+1|0}while((r|0)!=56);do if(!(+g[v+8>>2]>-200.0))if(!(+g[v+12>>2]>-200.0))if(!(+g[v+16>>2]>-200.0))if(!(+g[v+20>>2]>-200.0))if(!(+g[v+24>>2]>-200.0))if(!(+g[v+28>>2]>-200.0))if(!(+g[v+32>>2]>-200.0))if(!(+g[v+36>>2]>-200.0))if(!(+g[v+40>>2]>-200.0))if(!(+g[v+44>>2]>-200.0))if(!(+g[v+48>>2]>-200.0))if(!(+g[v+52>>2]>-200.0))if(!(+g[v+56>>2]>-200.0))if(+g[v+60>>2]>-200.0)L=13.0;else{if(+g[v+64>>2]>-200.0){L=14.0;break}if(+g[v+68>>2]>-200.0){L=15.0;break}L=16.0}else L=12.0;else L=11.0;else L=10.0;else L=9.0;else L=8.0;else L=7.0;else L=6.0;else L=5.0;else L=4.0;else L=3.0;else L=2.0;else L=1.0;else L=0.0;while(0);g[v>>2]=L;r=55;while(1){if(+g[v+(r+2<<2)>>2]>-200.0){M=r;break}s=r+-1|0;if((s|0)>17)r=s;else{M=s;break}}g[v+4>>2]=+(M|0);E=E+1|0}while((E|0)!=8)}while((C|0)!=17);l=h;return n|0}function qc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(cc(a,b,0)|0){hc(a);d=1;return d|0}b=c[a+4>>2]|0;e=c[a+104>>2]|0;if((b|0)==0|(e|0)==0){d=0;return d|0}f=c[b+28>>2]|0;if(!f){d=0;return d|0}b=c[f+3656>>2]|0;g=c[f+4>>2]>>b+1;c[a+48>>2]=g;c[a+20>>2]=g>>b;c[a+24>>2]=-1;b=a+56|0;c[b>>2]=-1;c[b+4>>2]=-1;c[b+8>>2]=-1;c[b+12>>2]=-1;c[a+32>>2]=0;a=e+128|0;c[a>>2]=-1;c[a+4>>2]=-1;d=0;return d|0}function rc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;d=c[a+4>>2]|0;e=c[d+28>>2]|0;f=c[a+104>>2]|0;h=c[e+3656>>2]|0;if(!b){i=-131;return i|0}j=a+20|0;k=c[j>>2]|0;l=a+24|0;m=c[l>>2]|0;if(!((k|0)<=(m|0)|(m|0)==-1)){i=-131;return i|0}n=a+40|0;o=c[n>>2]|0;p=a+36|0;c[p>>2]=o;q=c[b+28>>2]|0;c[n>>2]=q;c[a+44>>2]=-1;r=a+64|0;s=r;t=c[s>>2]|0;u=c[s+4>>2]|0;s=b+56|0;v=c[s>>2]|0;w=c[s+4>>2]|0;s=hd(t|0,u|0,1,0)|0;if(!(((t|0)!=-1|(u|0)!=-1)&((s|0)==(v|0)&(C|0)==(w|0)))){s=a+56|0;c[s>>2]=-1;c[s+4>>2]=-1;s=f+128|0;c[s>>2]=-1;c[s+4>>2]=-1}s=r;c[s>>2]=v;c[s+4>>2]=w;if(!(c[b>>2]|0)){x=k;y=m}else{k=h+1|0;w=c[e+(q<<2)>>2]>>k;s=c[e>>2]>>k;v=c[e+4>>2]>>k;k=c[b+88>>2]|0;r=a+72|0;u=r;t=hd(c[u>>2]|0,c[u+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;k=r;c[k>>2]=t;c[k+4>>2]=C;k=c[b+92>>2]|0;t=a+80|0;r=t;u=hd(c[r>>2]|0,c[r+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;k=t;c[k>>2]=u;c[k+4>>2]=C;k=c[b+96>>2]|0;u=a+88|0;t=u;r=hd(c[t>>2]|0,c[t+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;k=u;c[k>>2]=r;c[k+4>>2]=C;k=c[b+100>>2]|0;r=a+96|0;u=r;t=hd(c[u>>2]|0,c[u+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;k=r;c[k>>2]=t;c[k+4>>2]=C;k=a+48|0;t=c[k>>2]|0;r=(t|0)==0;u=r?v:0;z=r?0:v;r=d+4|0;if((c[r>>2]|0)>0){d=f+4|0;A=a+8|0;B=(v|0)/2|0;D=(s|0)/2|0;E=0-D|0;F=(s|0)>0;G=B+D|0;D=s+-1|0;H=(w|0)>0;I=f+8|0;J=(v|0)>0;K=v+-1|0;L=(s|0)/-2|0;M=o;o=q;q=0;while(1){N=(o|0)!=0;a:do if(!M){O=sc((c[d>>2]|0)-h|0)|0;P=c[(c[A>>2]|0)+(q<<2)>>2]|0;Q=P+(u<<2)|0;R=c[(c[b>>2]|0)+(q<<2)>>2]|0;if(!N){if(F)S=0;else{T=P;U=R;break}while(1){V=Q+(S<<2)|0;g[V>>2]=+g[O+(S<<2)>>2]*+g[R+(S<<2)>>2]+ +g[O+(D-S<<2)>>2]*+g[V>>2];S=S+1|0;if((S|0)==(s|0)){T=P;U=R;break a}}}V=R+(B<<2)+(E<<2)|0;if(F){W=0;do{X=Q+(W<<2)|0;g[X>>2]=+g[O+(W<<2)>>2]*+g[V+(W<<2)>>2]+ +g[O+(D-W<<2)>>2]*+g[X>>2];W=W+1|0}while((W|0)!=(s|0));Y=s}else Y=0;if((Y|0)<(G|0)){W=Y;do{c[Q+(W<<2)>>2]=c[V+(W<<2)>>2];W=W+1|0}while((W|0)<(G|0));T=P;U=R}else{T=P;U=R}}else if(N){W=sc((c[I>>2]|0)-h|0)|0;V=c[(c[A>>2]|0)+(q<<2)>>2]|0;Q=V+(u<<2)|0;O=c[(c[b>>2]|0)+(q<<2)>>2]|0;if(J)Z=0;else{T=V;U=O;break}do{X=Q+(Z<<2)|0;g[X>>2]=+g[W+(Z<<2)>>2]*+g[O+(Z<<2)>>2]+ +g[W+(K-Z<<2)>>2]*+g[X>>2];Z=Z+1|0}while((Z|0)!=(v|0));T=V;U=O}else{O=sc((c[d>>2]|0)-h|0)|0;V=c[(c[A>>2]|0)+(q<<2)>>2]|0;W=V+(u<<2)+(B<<2)+(L<<2)|0;Q=c[(c[b>>2]|0)+(q<<2)>>2]|0;if(F)_=0;else{T=V;U=Q;break}do{R=W+(_<<2)|0;g[R>>2]=+g[O+(_<<2)>>2]*+g[Q+(_<<2)>>2]+ +g[O+(D-_<<2)>>2]*+g[R>>2];_=_+1|0}while((_|0)!=(s|0));T=V;U=Q}while(0);N=T+(z<<2)|0;Q=U+(w<<2)|0;if(H){V=0;do{c[N+(V<<2)>>2]=c[Q+(V<<2)>>2];V=V+1|0}while((V|0)!=(w|0))}V=q+1|0;if((V|0)>=(c[r>>2]|0))break;M=c[p>>2]|0;o=c[n>>2]|0;q=V}$=c[k>>2]|0;aa=c[l>>2]|0}else{$=t;aa=m}c[k>>2]=$|0?0:v;if((aa|0)==-1){c[l>>2]=z;ba=z;ca=z}else{c[l>>2]=u;ba=u;ca=(((c[e+(c[n>>2]<<2)>>2]|0)/4|0)+((c[e+(c[p>>2]<<2)>>2]|0)/4|0)>>h)+u|0}c[j>>2]=ca;x=ca;y=ba}ba=f+128|0;f=ba;ca=c[f>>2]|0;u=c[f+4>>2]|0;if((ca|0)==-1&(u|0)==-1){da=0;ea=0}else{f=((c[e+(c[n>>2]<<2)>>2]|0)/4|0)+((c[e+(c[p>>2]<<2)>>2]|0)/4|0)|0;z=hd(f|0,((f|0)<0)<<31>>31|0,ca|0,u|0)|0;da=z;ea=C}z=ba;c[z>>2]=da;c[z+4>>2]=ea;z=a+56|0;ba=z;u=c[ba>>2]|0;ca=c[ba+4>>2]|0;ba=b+48|0;f=c[ba>>2]|0;aa=c[ba+4>>2]|0;ba=(f|0)!=-1|(aa|0)!=-1;do if((u|0)==-1&(ca|0)==-1){if(ba?(v=z,c[v>>2]=f,c[v+4>>2]=aa,(ea|0)>(aa|0)|(ea|0)==(aa|0)&da>>>0>f>>>0):0){v=gd(da|0,ea|0,f|0,aa|0)|0;$=(v|0)>0?v:0;if(!(c[b+44>>2]|0)){v=y+($>>>h)|0;c[l>>2]=(v|0)>(x|0)?x:v;break}else{v=x-y<<h;c[j>>2]=x-((($|0)>(v|0)?v:$)>>h);break}}}else{$=((c[e+(c[n>>2]<<2)>>2]|0)/4|0)+((c[e+(c[p>>2]<<2)>>2]|0)/4|0)|0;v=hd($|0,(($|0)<0)<<31>>31|0,u|0,ca|0)|0;$=C;k=z;c[k>>2]=v;c[k+4>>2]=$;if(!((v|0)==(f|0)&($|0)==(aa|0)|ba^1)){if((($|0)>(aa|0)|($|0)==(aa|0)&v>>>0>f>>>0?(k=gd(v|0,$|0,f|0,aa|0)|0,k|0):0)?c[b+44>>2]|0:0){$=x-y<<h;v=(k|0)>($|0)?$:k;c[j>>2]=x-(((v|0)>0?v:0)>>>h)}v=z;c[v>>2]=f;c[v+4>>2]=aa}}while(0);if(!(c[b+44>>2]|0)){i=0;return i|0}c[a+32>>2]=1;i=0;return i|0}function sc(a){a=a|0;return c[1500+(a<<2)>>2]|0}function tc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=c[a+24>>2]|0;if((d|0)<=-1){e=0;return e|0}f=c[a+20>>2]|0;if((f|0)<=(d|0)){e=0;return e|0}if(b|0){g=c[(c[a+4>>2]|0)+4>>2]|0;h=a+12|0;i=c[h>>2]|0;if((g|0)>0){j=a+8|0;a=i;k=0;while(1){c[a+(k<<2)>>2]=(c[(c[j>>2]|0)+(k<<2)>>2]|0)+(d<<2);k=k+1|0;l=c[h>>2]|0;if((k|0)>=(g|0)){m=l;break}else a=l}}else m=i;c[b>>2]=m}e=f-d|0;return e|0}function uc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a+24|0;e=(c[d>>2]|0)+b|0;if(b|0?(e|0)>(c[a+20>>2]|0):0){f=-131;return f|0}c[d>>2]=e;f=0;return f|0}function vc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(a|0)!=0;if(d?(e=c[a+64>>2]|0,(e|0)!=0):0){f=c[e+104>>2]|0;g=c[e+4>>2]|0;if(!g){h=f;i=0;j=0;k=0;l=1}else{h=f;i=c[g+28>>2]|0;j=g;k=1;l=1}}else{h=0;i=0;j=0;k=0;l=0}g=d?a+4|0:0;if(!(d&((i|0)!=0&(k&(l&(h|0)!=0))))){m=-136;return m|0}ac(a);Ia(g,c[b>>2]|0,c[b+4>>2]|0);if(La(g,1)|0){m=-135;return m|0}l=La(g,c[h+44>>2]|0)|0;if((l|0)==-1){m=-136;return m|0}c[a+40>>2]=l;h=i+32+(l<<2)|0;l=c[h>>2]|0;if(!l){m=-136;return m|0}k=c[l>>2]|0;l=a+28|0;c[l>>2]=k;do if(k){c[a+24>>2]=La(g,1)|0;d=La(g,1)|0;c[a+32>>2]=d;if((d|0)==-1){m=-136;return m|0}else{n=c[l>>2]|0;break}}else{c[a+24>>2]=0;c[a+32>>2]=0;n=0}while(0);l=b+16|0;g=c[l+4>>2]|0;k=a+48|0;c[k>>2]=c[l>>2];c[k+4>>2]=g;g=b+24|0;k=c[g+4>>2]|0;l=a+56|0;c[l>>2]=c[g>>2];c[l+4>>2]=k;c[a+44>>2]=c[b+12>>2];b=a+36|0;c[b>>2]=c[i+(n<<2)>>2];n=j+4|0;c[a>>2]=Ua(a,c[n>>2]<<2)|0;if((c[n>>2]|0)>0){j=0;do{k=Ua(a,c[b>>2]<<2)|0;c[(c[a>>2]|0)+(j<<2)>>2]=k;j=j+1|0}while((j|0)<(c[n>>2]|0))}n=c[(c[h>>2]|0)+12>>2]|0;m=wa[c[(c[34172+(c[i+288+(n<<2)>>2]<<2)>>2]|0)+16>>2]&15](a,c[i+544+(n<<2)>>2]|0)|0;return m|0}function wc(a){a=a|0;if(!a)return;ad(a);return}function xc(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function yc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(!a)return;b=c[a>>2]|0;if(b|0){d=a+8|0;e=c[d>>2]|0;if((e|0)>0){f=b;g=e;e=0;while(1){h=c[f+(e<<2)>>2]|0;if(!h){i=g;j=f}else{ad(h);i=c[d>>2]|0;j=c[a>>2]|0}e=e+1|0;if((e|0)>=(i|0)){k=j;break}else{f=j;g=i}}}else k=b;ad(k)}k=c[a+4>>2]|0;if(k|0)ad(k);k=c[a+12>>2]|0;if(k|0)ad(k);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function zc(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=bd(1,3664)|0;return}function Ac(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=c[a+28>>2]|0;if(!b){c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;return}d=b+8|0;e=c[d>>2]|0;if((e|0)>0){f=b+32|0;g=e;e=0;while(1){h=c[f+(e<<2)>>2]|0;if(!h)i=g;else{ad(h);i=c[d>>2]|0}e=e+1|0;if((e|0)>=(i|0))break;else g=i}}i=b+12|0;g=c[i>>2]|0;if((g|0)>0){e=b+544|0;d=b+288|0;f=g;g=0;while(1){h=c[e+(g<<2)>>2]|0;if(!h)j=f;else{ra[c[(c[34172+(c[d+(g<<2)>>2]<<2)>>2]|0)+8>>2]&7](h);j=c[i>>2]|0}g=g+1|0;if((g|0)>=(j|0))break;else f=j}}j=b+16|0;f=c[j>>2]|0;if((f|0)>0){g=b+1056|0;i=b+800|0;d=f;f=0;while(1){e=c[g+(f<<2)>>2]|0;if(!e)k=d;else{ra[c[(c[456+(c[i+(f<<2)>>2]<<2)>>2]|0)+12>>2]&7](e);k=c[j>>2]|0}f=f+1|0;if((f|0)>=(k|0))break;else d=k}}k=b+20|0;d=c[k>>2]|0;if((d|0)>0){f=b+1568|0;j=b+1312|0;i=d;d=0;while(1){g=c[f+(d<<2)>>2]|0;if(!g)l=i;else{ra[c[(c[464+(c[j+(d<<2)>>2]<<2)>>2]|0)+12>>2]&7](g);l=c[k>>2]|0}d=d+1|0;if((d|0)>=(l|0))break;else i=l}}l=b+24|0;if((c[l>>2]|0)>0){i=b+1824|0;d=b+2848|0;k=0;do{j=c[i+(k<<2)>>2]|0;if(j|0)gc(j);j=c[d>>2]|0;if(j|0)Bc(j+(k*56|0)|0);k=k+1|0}while((k|0)<(c[l>>2]|0));m=d}else m=b+2848|0;d=c[m>>2]|0;if(d|0)ad(d);d=b+28|0;if((c[d>>2]|0)>0){m=b+2852|0;l=0;do{wc(c[m+(l<<2)>>2]|0);l=l+1|0}while((l|0)<(c[d>>2]|0))}ad(b);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;return}function Bc(a){a=a|0;var b=0,d=0,e=0;b=c[a+16>>2]|0;if(b|0)ad(b);b=c[a+20>>2]|0;if(b|0)ad(b);b=c[a+24>>2]|0;if(b|0)ad(b);b=c[a+28>>2]|0;if(b|0)ad(b);b=c[a+32>>2]|0;if(!b){d=a;e=d+56|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));return}ad(b);d=a;e=d+56|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));return}function Cc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=l;l=l+32|0;g=f;h=f+20|0;if(!e){i=-133;l=f;return i|0}Ia(g,c[e>>2]|0,c[e+4>>2]|0);j=La(g,8)|0;a[h>>0]=La(g,8)|0;a[h+1>>0]=La(g,8)|0;a[h+2>>0]=La(g,8)|0;a[h+3>>0]=La(g,8)|0;a[h+4>>0]=La(g,8)|0;a[h+5>>0]=La(g,8)|0;a:do if(!(Oc(h,57636,6)|0))switch(j|0){case 1:{if(!(c[e+8>>2]|0)){k=-133;break a}m=b+8|0;if(c[m>>2]|0){k=-133;break a}n=c[b+28>>2]|0;if(!n){k=-129;break a}o=La(g,32)|0;c[b>>2]=o;if(o|0){k=-134;break a}o=b+4|0;c[o>>2]=La(g,8)|0;c[m>>2]=La(g,32)|0;c[b+12>>2]=La(g,32)|0;c[b+16>>2]=La(g,32)|0;c[b+20>>2]=La(g,32)|0;c[n>>2]=1<<(La(g,4)|0);p=1<<(La(g,4)|0);c[n+4>>2]=p;if((((c[m>>2]|0)>=1?(c[o>>2]|0)>=1:0)?(o=c[n>>2]|0,!((p|0)>8192|((o|0)<64|(p|0)<(o|0)))):0)?(La(g,1)|0)==1:0){k=0;break a}Ac(b);k=-133;break a;break}case 3:{if(!(c[b+8>>2]|0)){k=-133;break a}o=La(g,32)|0;b:do if((o|0)>=0?(p=g+16|0,(o|0)<=((c[p>>2]|0)+-8|0)):0){n=bd(o+1|0,1)|0;c[d+12>>2]=n;if(o|0){m=n;n=o;while(1){n=n+-1|0;a[m>>0]=La(g,8)|0;if(!n)break;else m=m+1|0}}m=La(g,32)|0;if((m|0)>=0?(n=c[p>>2]|0,(m|0)<=(n-(Ma(g)|0)>>2|0)):0){n=d+8|0;c[n>>2]=m;q=m+1|0;c[d>>2]=bd(q,4)|0;r=d+4|0;c[r>>2]=bd(q,4)|0;if((m|0)>0){m=0;do{q=La(g,32)|0;if((q|0)<0){s=d;break b}t=c[p>>2]|0;if((q|0)>(t-(Ma(g)|0)|0)){s=d;break b}c[(c[r>>2]|0)+(m<<2)>>2]=q;t=bd(q+1|0,1)|0;c[(c[d>>2]|0)+(m<<2)>>2]=t;if(q|0){t=c[(c[d>>2]|0)+(m<<2)>>2]|0;u=q;while(1){u=u+-1|0;a[t>>0]=La(g,8)|0;if(!u)break;else t=t+1|0}}m=m+1|0}while((m|0)<(c[n>>2]|0))}if((La(g,1)|0)==1){k=0;break a}else s=d}else v=28}else v=28;while(0);if((v|0)==28){if(!d){k=-133;break a}s=d}o=c[s>>2]|0;if(o|0){n=d+8|0;m=c[n>>2]|0;if((m|0)>0){r=o;p=m;m=0;while(1){t=c[r+(m<<2)>>2]|0;if(!t){w=p;x=r}else{ad(t);w=c[n>>2]|0;x=c[s>>2]|0}m=m+1|0;if((m|0)>=(w|0)){y=x;break}else{r=x;p=w}}}else y=o;ad(y)}p=c[d+4>>2]|0;if(p|0)ad(p);p=c[d+12>>2]|0;if(p|0)ad(p);c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;k=-133;break a;break}case 5:{if(!(c[b+8>>2]|0)){k=-133;break a}if(!(c[d+12>>2]|0)){k=-133;break a}p=c[b+28>>2]|0;if(!p){k=-129;break a}r=La(g,8)|0;m=p+24|0;c[m>>2]=r+1;c:do if((r|0)>=0){n=0;do{t=Dc(g)|0;c[p+1824+(n<<2)>>2]=t;n=n+1|0;if(!t)break c}while((n|0)<(c[m>>2]|0));n=La(g,6)|0;if((n|0)>=0){t=0;while(1){if(La(g,16)|0)break c;if((t|0)<(n|0))t=t+1|0;else break}t=La(g,6)|0;n=p+16|0;c[n>>2]=t+1;if((t|0)>=0){t=0;do{u=La(g,16)|0;c[p+800+(t<<2)>>2]=u;if(u>>>0>1)break c;q=wa[c[(c[456+(u<<2)>>2]|0)+4>>2]&15](b,g)|0;c[p+1056+(t<<2)>>2]=q;t=t+1|0;if(!q)break c}while((t|0)<(c[n>>2]|0));n=La(g,6)|0;t=p+20|0;c[t>>2]=n+1;if((n|0)>=0){n=0;do{q=La(g,16)|0;c[p+1312+(n<<2)>>2]=q;if(q>>>0>2)break c;u=wa[c[(c[464+(q<<2)>>2]|0)+4>>2]&15](b,g)|0;c[p+1568+(n<<2)>>2]=u;n=n+1|0;if(!u)break c}while((n|0)<(c[t>>2]|0));t=La(g,6)|0;n=p+12|0;c[n>>2]=t+1;if((t|0)>=0){t=0;do{u=La(g,16)|0;c[p+288+(t<<2)>>2]=u;if(u|0)break c;u=wa[c[(c[8543]|0)+4>>2]&15](b,g)|0;c[p+544+(t<<2)>>2]=u;t=t+1|0;if(!u)break c}while((t|0)<(c[n>>2]|0));t=La(g,6)|0;u=p+8|0;c[u>>2]=t+1;if((t|0)>=0){t=0;do{q=p+32+(t<<2)|0;c[q>>2]=bd(1,16)|0;z=La(g,1)|0;c[c[q>>2]>>2]=z;z=La(g,16)|0;c[(c[q>>2]|0)+4>>2]=z;z=La(g,16)|0;c[(c[q>>2]|0)+8>>2]=z;z=La(g,8)|0;A=c[q>>2]|0;c[A+12>>2]=z;if((c[A+4>>2]|0)>0)break c;if((c[A+8>>2]|0)>0)break c;t=t+1|0;if((z|0)<0?1:(z|0)>=(c[n>>2]|0))break c}while((t|0)<(c[u>>2]|0));if((La(g,1)|0)==1){k=0;break a}}}}}}}while(0);Ac(b);k=-133;break a;break}default:{k=-133;break a}}else k=-132;while(0);i=k;l=f;return i|0}function Dc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=bd(1,40)|0;c[b+36>>2]=1;a:do if(((La(a,24)|0)==5653314?(c[b>>2]=La(a,16)|0,d=La(a,24)|0,e=b+4|0,c[e>>2]=d,(d|0)!=-1):0)?(d=db(c[b>>2]|0)|0,((db(c[e>>2]|0)|0)+d|0)<=24):0){b:do switch(La(a,1)|0){case 0:{d=(La(a,1)|0)!=0;if(((R(d?1:5,c[e>>2]|0)|0)+7>>3|0)>((c[a+16>>2]|0)-(Ma(a)|0)|0))break a;f=c[e>>2]|0;g=b+8|0;c[g>>2]=$c(f<<2)|0;h=(f|0)>0;if(!d){if(h)i=0;else break b;while(1){d=La(a,5)|0;if((d|0)==-1)break a;c[(c[g>>2]|0)+(i<<2)>>2]=d+1;i=i+1|0;if((i|0)>=(c[e>>2]|0))break b}}if(h){d=0;do{if(La(a,1)|0){f=La(a,5)|0;if((f|0)==-1)break a;else j=f+1|0}else j=0;c[(c[g>>2]|0)+(d<<2)>>2]=j;d=d+1|0}while((d|0)<(c[e>>2]|0))}break}case 1:{d=(La(a,5)|0)+1|0;if(!d)break a;g=c[e>>2]|0;h=b+8|0;c[h>>2]=$c(g<<2)|0;if((g|0)>0){f=g;g=0;k=d;while(1){d=La(a,db(f-g|0)|0)|0;if((k|0)>32|(d|0)==-1)break a;l=c[e>>2]|0;if((d|0)>(l-g|0))break a;if((d|0)>0){if((d+-1>>k+-1|0)>1)break a;m=c[h>>2]|0;n=g;o=0;while(1){c[m+(n<<2)>>2]=k;o=o+1|0;if((o|0)==(d|0))break;else n=n+1|0}p=c[e>>2]|0;q=d+g|0}else{p=l;q=g}if((p|0)>(q|0)){f=p;g=q;k=k+1|0}else break}}break}default:break a}while(0);k=La(a,4)|0;g=b+12|0;c[g>>2]=k;switch(k|0){case 2:case 1:break;case 0:{r=b;return r|0}default:break a}c[b+16>>2]=La(a,32)|0;c[b+20>>2]=La(a,32)|0;k=b+24|0;c[k>>2]=(La(a,4)|0)+1;f=La(a,1)|0;c[b+28>>2]=f;if((f|0)!=-1){switch(c[g>>2]|0){case 1:{if(!(c[b>>2]|0))s=0;else s=Ec(b)|0;break}case 2:{s=R(c[b>>2]|0,c[e>>2]|0)|0;break}default:s=0}g=(R(c[k>>2]|0,s)|0)+7>>3;f=c[a+16>>2]|0;if((g|0)<=(f-(Ma(a)|0)|0)){f=$c(s<<2)|0;g=b+32|0;c[g>>2]=f;if((s|0)>0){h=0;do{n=La(a,c[k>>2]|0)|0;o=c[g>>2]|0;c[o+(h<<2)>>2]=n;h=h+1|0}while((h|0)!=(s|0));t=o}else t=f;if(!s){r=b;return r|0}if((c[t+(s+-1<<2)>>2]|0)!=-1){r=b;return r|0}}}}while(0);gc(b);r=0;return r|0}function Ec(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=c[a+4>>2]|0;d=c[a>>2]|0;if((d|0)<=0)while(1){}a=~~+D(+(+G(+(+(b|0)),+(1.0/+(d|0)))));while(1){e=a+1|0;f=1;g=1;h=0;do{f=R(f,a)|0;g=R(g,e)|0;h=h+1|0}while((h|0)<(d|0));if((f|0)<=(b|0)&(g|0)>(b|0))break;else a=((f|0)>(b|0)?-1:1)+a|0}return a|0}function Fc(){zc(57876);xc(57908);return}function Gc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+32|0;e=d;Jc(e,a,b);if(!(c[14468]|0))c[e+8>>2]=1;if(Cc(57876,57908,e)|0){f=0;l=d;return f|0}e=(c[14468]|0)+1|0;c[14468]=e;if((e|0)<3){f=1;l=d;return f|0}qc(57648,57876)|0;$b(57648,57760)|0;ga(c[14470]|0,c[14471]|0);f=1;l=d;return f|0}function Hc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+48|0;e=d;f=d+32|0;Jc(e,a,b);if(vc(57760,e)|0){g=0;l=d;return g|0}rc(57648,57760)|0;e=tc(57648,f)|0;la(c[f>>2]|0,c[14470]|0,e|0);uc(57648,e)|0;g=1;l=d;return g|0}function Ic(){if(!(c[14468]|0))return;Ac(57876);hc(57648);bc(57760)|0;yc(57908);return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=d;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;return}function Kc(){return 57924}function Lc(){return (Mc()|0)+64|0}function Mc(){return Nc()|0}function Nc(){return 57392}function Oc(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=b;g=d;h=c;while(1){i=a[f>>0]|0;j=a[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}function Pc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+208|0;g=f+8|0;h=f;i=R(d,b)|0;b=h;c[b>>2]=1;c[b+4>>2]=0;a:do if(i|0){b=0-d|0;c[g+4>>2]=d;c[g>>2]=d;j=d;k=d;m=2;while(1){n=j+d+k|0;c[g+(m<<2)>>2]=n;if(n>>>0<i>>>0){o=k;k=n;m=m+1|0;j=o}else break}j=a+i+b|0;if(j>>>0>a>>>0){m=j;k=1;o=a;n=1;while(1){do if((k&3|0)!=3){p=n+-1|0;if((c[g+(p<<2)>>2]|0)>>>0<(m-o|0)>>>0)Qc(o,d,e,n,g);else Sc(o,d,e,h,n,0,g);if((n|0)==1){Tc(h,1);q=0;break}else{Tc(h,p);q=1;break}}else{Qc(o,d,e,n,g);Rc(h,2);q=n+2|0}while(0);p=c[h>>2]|1;c[h>>2]=p;r=o+d|0;if(r>>>0<j>>>0){k=p;o=r;n=q}else{s=p;t=r;u=q;break}}}else{s=1;t=a;u=1}Sc(t,d,e,h,u,0,g);n=h+4|0;o=s;k=t;j=u;while(1){if((j|0)==1&(o|0)==1){if(!(c[n>>2]|0))break a}else if((j|0)>=2){Tc(h,2);m=j+-2|0;c[h>>2]=c[h>>2]^7;Rc(h,1);Sc(k+(0-(c[g+(m<<2)>>2]|0))+b|0,d,e,h,j+-1|0,1,g);Tc(h,1);r=c[h>>2]|1;c[h>>2]=r;p=k+b|0;Sc(p,d,e,h,m,1,g);o=r;k=p;j=m;continue}m=Uc(h)|0;Rc(h,m);o=c[h>>2]|0;k=k+b|0;j=m+j|0}}while(0);l=f;return}function Qc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=l;l=l+240|0;h=g;c[h>>2]=a;a:do if((e|0)>1){i=0-b|0;j=a;k=a;m=1;n=e;while(1){o=k+i|0;p=n+-2|0;q=o+(0-(c[f+(p<<2)>>2]|0))|0;if((wa[d&15](j,q)|0)>-1?(wa[d&15](j,o)|0)>-1:0){r=m;break a}s=m+1|0;t=h+(m<<2)|0;if((wa[d&15](q,o)|0)>-1){c[t>>2]=q;u=q;v=n+-1|0}else{c[t>>2]=o;u=o;v=p}if((v|0)<=1){r=s;break a}j=c[h>>2]|0;k=u;m=s;n=v}}else r=1;while(0);Wc(b,h,r);l=g;return}function Rc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+4|0;if(b>>>0>31){e=c[d>>2]|0;c[a>>2]=e;c[d>>2]=0;f=e;g=0;h=b+-32|0}else{f=c[a>>2]|0;g=c[d>>2]|0;h=b}c[a>>2]=g<<32-h|f>>>h;c[d>>2]=g>>>h;return}function Sc(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;i=l;l=l+240|0;j=i+232|0;k=i;m=c[e>>2]|0;c[j>>2]=m;n=c[e+4>>2]|0;e=j+4|0;c[e>>2]=n;c[k>>2]=a;a:do if((m|0)!=1|(n|0)!=0?(o=0-b|0,p=a+(0-(c[h+(f<<2)>>2]|0))|0,(wa[d&15](p,a)|0)>=1):0){q=p;p=a;r=1;s=f;t=(g|0)==0;while(1){if(t&(s|0)>1){u=p+o|0;v=c[h+(s+-2<<2)>>2]|0;if((wa[d&15](u,q)|0)>-1){w=p;x=r;y=s;z=10;break a}if((wa[d&15](u+(0-v)|0,q)|0)>-1){w=p;x=r;y=s;z=10;break a}}v=r+1|0;c[k+(r<<2)>>2]=q;u=Uc(j)|0;Rc(j,u);A=u+s|0;if(!((c[j>>2]|0)!=1|(c[e>>2]|0)!=0)){w=q;x=v;y=A;z=10;break a}u=q+(0-(c[h+(A<<2)>>2]|0))|0;if((wa[d&15](u,c[k>>2]|0)|0)<1){B=q;C=v;D=A;E=0;z=9;break}else{F=q;q=u;r=v;s=A;t=1;p=F}}}else{B=a;C=1;D=f;E=g;z=9}while(0);if((z|0)==9?(E|0)==0:0){w=B;x=C;y=D;z=10}if((z|0)==10){Wc(b,k,x);Qc(w,b,d,y,h)}l=i;return}function Tc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+4|0;if(b>>>0>31){e=c[a>>2]|0;c[d>>2]=e;c[a>>2]=0;f=e;g=0;h=b+-32|0}else{f=c[d>>2]|0;g=c[a>>2]|0;h=b}c[d>>2]=g>>>(32-h|0)|f<<h;c[a>>2]=g<<h;return}function Uc(a){a=a|0;var b=0,d=0;b=Vc((c[a>>2]|0)+-1|0)|0;if(!b){d=Vc(c[a+4>>2]|0)|0;return ((d|0)==0?0:d+32|0)|0}else return b|0;return 0}function Vc(a){a=a|0;var b=0,c=0,d=0;if(a)if(!(a&1)){b=0;c=a;while(1){a=b+1|0;c=c>>>1;if(c&1|0){d=a;break}else b=a}}else d=0;else d=32;return d|0}function Wc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+256|0;f=e;a:do if((d|0)>=2?(g=b+(d<<2)|0,c[g>>2]=f,a|0):0){h=f;i=a;while(1){j=i>>>0<256?i:256;md(h|0,c[b>>2]|0,j|0)|0;k=0;do{m=b+(k<<2)|0;k=k+1|0;md(c[m>>2]|0,c[b+(k<<2)>>2]|0,j|0)|0;c[m>>2]=(c[m>>2]|0)+j}while((k|0)!=(d|0));k=i-j|0;if(!k)break a;h=c[g>>2]|0;i=k}}while(0);l=e;return}function Xc(a,b){a=+a;b=b|0;var d=0.0,e=0,f=0,g=0,i=0,k=0.0;if((b|0)<=1023)if((b|0)<-1022){d=a*2.2250738585072014e-308;e=b+1022|0;f=(e|0)<-1022;g=b+2044|0;i=f?((g|0)>-1022?g:-1022):e;k=f?d*2.2250738585072014e-308:d}else{i=b;k=a}else{d=a*8988465674311579538646525.0e283;f=b+-1023|0;e=(f|0)>1023;g=b+-2046|0;i=e?((g|0)<1023?g:1023):f;k=e?d*8988465674311579538646525.0e283:d}e=jd(i+1023|0,0,52)|0;i=C;c[j>>2]=e;c[j+4>>2]=i;return +(k*+h[j>>3])}function Yc(a,b){a=+a;b=b|0;return +(+Xc(a,b))}function Zc(a){a=+a;var b=0,d=0,e=0.0,f=0.0;h[j>>3]=a;b=c[j+4>>2]|0;d=b&2146435072;if(!(d>>>0>1126170624|(d|0)==1126170624&0>0)){d=(b|0)<0;e=(d?4503599627370496.0:-4503599627370496.0)+((d?-4503599627370496.0:4503599627370496.0)+a);if(e==0.0)f=d?-0.0:0.0;else f=e}else f=a;return +f}function _c(a){a=+a;var b=0,d=0,e=0.0,f=0.0;b=(g[j>>2]=a,c[j>>2]|0);if((b&2130706432)>>>0<=1249902592){d=(b|0)<0;e=(d?8388608.0:-8388608.0)+((d?-8388608.0:8388608.0)+a);if(e==0.0)f=d?-0.0:0.0;else f=e}else f=a;return +f}function $c(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;b=l;l=l+16|0;d=b;do if(a>>>0<245){e=a>>>0<11?16:a+11&-8;f=e>>>3;g=c[14497]|0;h=g>>>f;if(h&3|0){i=(h&1^1)+f|0;j=58028+(i<<1<<2)|0;k=j+8|0;m=c[k>>2]|0;n=m+8|0;o=c[n>>2]|0;do if((j|0)!=(o|0)){if(o>>>0<(c[14501]|0)>>>0)ja();p=o+12|0;if((c[p>>2]|0)==(m|0)){c[p>>2]=j;c[k>>2]=o;break}else ja()}else c[14497]=g&~(1<<i);while(0);o=i<<3;c[m+4>>2]=o|3;k=m+o+4|0;c[k>>2]=c[k>>2]|1;q=n;l=b;return q|0}k=c[14499]|0;if(e>>>0>k>>>0){if(h|0){o=2<<f;j=h<<f&(o|0-o);o=(j&0-j)+-1|0;j=o>>>12&16;p=o>>>j;o=p>>>5&8;r=p>>>o;p=r>>>2&4;s=r>>>p;r=s>>>1&2;t=s>>>r;s=t>>>1&1;u=(o|j|p|r|s)+(t>>>s)|0;s=58028+(u<<1<<2)|0;t=s+8|0;r=c[t>>2]|0;p=r+8|0;j=c[p>>2]|0;do if((s|0)!=(j|0)){if(j>>>0<(c[14501]|0)>>>0)ja();o=j+12|0;if((c[o>>2]|0)==(r|0)){c[o>>2]=s;c[t>>2]=j;v=g;break}else ja()}else{o=g&~(1<<u);c[14497]=o;v=o}while(0);j=(u<<3)-e|0;c[r+4>>2]=e|3;t=r+e|0;c[t+4>>2]=j|1;c[t+j>>2]=j;if(k|0){s=c[14502]|0;f=k>>>3;h=58028+(f<<1<<2)|0;n=1<<f;if(v&n){f=h+8|0;m=c[f>>2]|0;if(m>>>0<(c[14501]|0)>>>0)ja();else{w=f;x=m}}else{c[14497]=v|n;w=h+8|0;x=h}c[w>>2]=s;c[x+12>>2]=s;c[s+8>>2]=x;c[s+12>>2]=h}c[14499]=j;c[14502]=t;q=p;l=b;return q|0}t=c[14498]|0;if(t){j=(t&0-t)+-1|0;h=j>>>12&16;s=j>>>h;j=s>>>5&8;n=s>>>j;s=n>>>2&4;m=n>>>s;n=m>>>1&2;f=m>>>n;m=f>>>1&1;i=c[58292+((j|h|s|n|m)+(f>>>m)<<2)>>2]|0;m=(c[i+4>>2]&-8)-e|0;f=c[i+16+(((c[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){y=m;z=i}else{n=f;f=m;m=i;while(1){i=(c[n+4>>2]&-8)-e|0;s=i>>>0<f>>>0;h=s?i:f;i=s?n:m;n=c[n+16+(((c[n+16>>2]|0)==0&1)<<2)>>2]|0;if(!n){y=h;z=i;break}else{f=h;m=i}}}m=c[14501]|0;if(z>>>0<m>>>0)ja();f=z+e|0;if(z>>>0>=f>>>0)ja();n=c[z+24>>2]|0;p=c[z+12>>2]|0;do if((p|0)==(z|0)){r=z+20|0;u=c[r>>2]|0;if(!u){i=z+16|0;h=c[i>>2]|0;if(!h){A=0;break}else{B=h;C=i}}else{B=u;C=r}while(1){r=B+20|0;u=c[r>>2]|0;if(u|0){B=u;C=r;continue}r=B+16|0;u=c[r>>2]|0;if(!u)break;else{B=u;C=r}}if(C>>>0<m>>>0)ja();else{c[C>>2]=0;A=B;break}}else{r=c[z+8>>2]|0;if(r>>>0<m>>>0)ja();u=r+12|0;if((c[u>>2]|0)!=(z|0))ja();i=p+8|0;if((c[i>>2]|0)==(z|0)){c[u>>2]=p;c[i>>2]=r;A=p;break}else ja()}while(0);a:do if(n|0){p=c[z+28>>2]|0;m=58292+(p<<2)|0;do if((z|0)==(c[m>>2]|0)){c[m>>2]=A;if(!A){c[14498]=t&~(1<<p);break a}}else if(n>>>0>=(c[14501]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(z|0)&1)<<2)>>2]=A;if(!A)break a;else break}else ja();while(0);p=c[14501]|0;if(A>>>0<p>>>0)ja();c[A+24>>2]=n;m=c[z+16>>2]|0;do if(m|0)if(m>>>0<p>>>0)ja();else{c[A+16>>2]=m;c[m+24>>2]=A;break}while(0);m=c[z+20>>2]|0;if(m|0)if(m>>>0<(c[14501]|0)>>>0)ja();else{c[A+20>>2]=m;c[m+24>>2]=A;break}}while(0);if(y>>>0<16){n=y+e|0;c[z+4>>2]=n|3;t=z+n+4|0;c[t>>2]=c[t>>2]|1}else{c[z+4>>2]=e|3;c[f+4>>2]=y|1;c[f+y>>2]=y;if(k|0){t=c[14502]|0;n=k>>>3;m=58028+(n<<1<<2)|0;p=1<<n;if(g&p){n=m+8|0;r=c[n>>2]|0;if(r>>>0<(c[14501]|0)>>>0)ja();else{D=n;E=r}}else{c[14497]=g|p;D=m+8|0;E=m}c[D>>2]=t;c[E+12>>2]=t;c[t+8>>2]=E;c[t+12>>2]=m}c[14499]=y;c[14502]=f}q=z+8|0;l=b;return q|0}else F=e}else F=e}else if(a>>>0<=4294967231){m=a+11|0;t=m&-8;p=c[14498]|0;if(p){r=0-t|0;n=m>>>8;if(n)if(t>>>0>16777215)G=31;else{m=(n+1048320|0)>>>16&8;i=n<<m;n=(i+520192|0)>>>16&4;u=i<<n;i=(u+245760|0)>>>16&2;h=14-(n|m|i)+(u<<i>>>15)|0;G=t>>>(h+7|0)&1|h<<1}else G=0;h=c[58292+(G<<2)>>2]|0;b:do if(!h){H=r;I=0;J=0;K=81}else{i=r;u=0;m=t<<((G|0)==31?0:25-(G>>>1)|0);n=h;s=0;while(1){j=(c[n+4>>2]&-8)-t|0;if(j>>>0<i>>>0)if(!j){L=0;M=n;N=n;K=85;break b}else{O=j;P=n}else{O=i;P=s}j=c[n+20>>2]|0;n=c[n+16+(m>>>31<<2)>>2]|0;o=(j|0)==0|(j|0)==(n|0)?u:j;j=(n|0)==0;if(j){H=O;I=o;J=P;K=81;break}else{i=O;u=o;m=m<<((j^1)&1);s=P}}}while(0);if((K|0)==81){if((I|0)==0&(J|0)==0){h=2<<G;r=p&(h|0-h);if(!r){F=t;break}h=(r&0-r)+-1|0;r=h>>>12&16;e=h>>>r;h=e>>>5&8;f=e>>>h;e=f>>>2&4;g=f>>>e;f=g>>>1&2;k=g>>>f;g=k>>>1&1;Q=c[58292+((h|r|e|f|g)+(k>>>g)<<2)>>2]|0;R=0}else{Q=I;R=J}if(!Q){S=H;T=R}else{L=H;M=Q;N=R;K=85}}if((K|0)==85)while(1){K=0;g=(c[M+4>>2]&-8)-t|0;k=g>>>0<L>>>0;f=k?g:L;g=k?M:N;M=c[M+16+(((c[M+16>>2]|0)==0&1)<<2)>>2]|0;if(!M){S=f;T=g;break}else{L=f;N=g;K=85}}if((T|0)!=0?S>>>0<((c[14499]|0)-t|0)>>>0:0){g=c[14501]|0;if(T>>>0<g>>>0)ja();f=T+t|0;if(T>>>0>=f>>>0)ja();k=c[T+24>>2]|0;e=c[T+12>>2]|0;do if((e|0)==(T|0)){r=T+20|0;h=c[r>>2]|0;if(!h){s=T+16|0;m=c[s>>2]|0;if(!m){U=0;break}else{V=m;W=s}}else{V=h;W=r}while(1){r=V+20|0;h=c[r>>2]|0;if(h|0){V=h;W=r;continue}r=V+16|0;h=c[r>>2]|0;if(!h)break;else{V=h;W=r}}if(W>>>0<g>>>0)ja();else{c[W>>2]=0;U=V;break}}else{r=c[T+8>>2]|0;if(r>>>0<g>>>0)ja();h=r+12|0;if((c[h>>2]|0)!=(T|0))ja();s=e+8|0;if((c[s>>2]|0)==(T|0)){c[h>>2]=e;c[s>>2]=r;U=e;break}else ja()}while(0);c:do if(k){e=c[T+28>>2]|0;g=58292+(e<<2)|0;do if((T|0)==(c[g>>2]|0)){c[g>>2]=U;if(!U){r=p&~(1<<e);c[14498]=r;X=r;break c}}else if(k>>>0>=(c[14501]|0)>>>0){c[k+16+(((c[k+16>>2]|0)!=(T|0)&1)<<2)>>2]=U;if(!U){X=p;break c}else break}else ja();while(0);e=c[14501]|0;if(U>>>0<e>>>0)ja();c[U+24>>2]=k;g=c[T+16>>2]|0;do if(g|0)if(g>>>0<e>>>0)ja();else{c[U+16>>2]=g;c[g+24>>2]=U;break}while(0);g=c[T+20>>2]|0;if(g)if(g>>>0<(c[14501]|0)>>>0)ja();else{c[U+20>>2]=g;c[g+24>>2]=U;X=p;break}else X=p}else X=p;while(0);do if(S>>>0>=16){c[T+4>>2]=t|3;c[f+4>>2]=S|1;c[f+S>>2]=S;p=S>>>3;if(S>>>0<256){k=58028+(p<<1<<2)|0;g=c[14497]|0;e=1<<p;if(g&e){p=k+8|0;r=c[p>>2]|0;if(r>>>0<(c[14501]|0)>>>0)ja();else{Y=p;Z=r}}else{c[14497]=g|e;Y=k+8|0;Z=k}c[Y>>2]=f;c[Z+12>>2]=f;c[f+8>>2]=Z;c[f+12>>2]=k;break}k=S>>>8;if(k)if(S>>>0>16777215)_=31;else{e=(k+1048320|0)>>>16&8;g=k<<e;k=(g+520192|0)>>>16&4;r=g<<k;g=(r+245760|0)>>>16&2;p=14-(k|e|g)+(r<<g>>>15)|0;_=S>>>(p+7|0)&1|p<<1}else _=0;p=58292+(_<<2)|0;c[f+28>>2]=_;g=f+16|0;c[g+4>>2]=0;c[g>>2]=0;g=1<<_;if(!(X&g)){c[14498]=X|g;c[p>>2]=f;c[f+24>>2]=p;c[f+12>>2]=f;c[f+8>>2]=f;break}g=S<<((_|0)==31?0:25-(_>>>1)|0);r=c[p>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(S|0)){K=139;break}$=r+16+(g>>>31<<2)|0;p=c[$>>2]|0;if(!p){K=136;break}else{g=g<<1;r=p}}if((K|0)==136)if($>>>0<(c[14501]|0)>>>0)ja();else{c[$>>2]=f;c[f+24>>2]=r;c[f+12>>2]=f;c[f+8>>2]=f;break}else if((K|0)==139){g=r+8|0;p=c[g>>2]|0;e=c[14501]|0;if(p>>>0>=e>>>0&r>>>0>=e>>>0){c[p+12>>2]=f;c[g>>2]=f;c[f+8>>2]=p;c[f+12>>2]=r;c[f+24>>2]=0;break}else ja()}}else{p=S+t|0;c[T+4>>2]=p|3;g=T+p+4|0;c[g>>2]=c[g>>2]|1}while(0);q=T+8|0;l=b;return q|0}else F=t}else F=t}else F=-1;while(0);T=c[14499]|0;if(T>>>0>=F>>>0){S=T-F|0;$=c[14502]|0;if(S>>>0>15){_=$+F|0;c[14502]=_;c[14499]=S;c[_+4>>2]=S|1;c[_+S>>2]=S;c[$+4>>2]=F|3}else{c[14499]=0;c[14502]=0;c[$+4>>2]=T|3;S=$+T+4|0;c[S>>2]=c[S>>2]|1}q=$+8|0;l=b;return q|0}$=c[14500]|0;if($>>>0>F>>>0){S=$-F|0;c[14500]=S;T=c[14503]|0;_=T+F|0;c[14503]=_;c[_+4>>2]=S|1;c[T+4>>2]=F|3;q=T+8|0;l=b;return q|0}if(!(c[14615]|0)){c[14617]=4096;c[14616]=4096;c[14618]=-1;c[14619]=-1;c[14620]=0;c[14608]=0;T=d&-16^1431655768;c[d>>2]=T;c[14615]=T;aa=4096}else aa=c[14617]|0;T=F+48|0;d=F+47|0;S=aa+d|0;_=0-aa|0;aa=S&_;if(aa>>>0<=F>>>0){q=0;l=b;return q|0}X=c[14607]|0;if(X|0?(Z=c[14605]|0,Y=Z+aa|0,Y>>>0<=Z>>>0|Y>>>0>X>>>0):0){q=0;l=b;return q|0}d:do if(!(c[14608]&4)){X=c[14503]|0;e:do if(X){Y=58436;while(1){Z=c[Y>>2]|0;if(Z>>>0<=X>>>0?(ba=Y+4|0,(Z+(c[ba>>2]|0)|0)>>>0>X>>>0):0)break;Z=c[Y+8>>2]|0;if(!Z){K=163;break e}else Y=Z}r=S-$&_;if(r>>>0<2147483647){Z=ld(r|0)|0;if((Z|0)==((c[Y>>2]|0)+(c[ba>>2]|0)|0))if((Z|0)==(-1|0))ca=r;else{da=Z;ea=r;K=180;break d}else{fa=Z;ga=r;K=171}}else ca=0}else K=163;while(0);do if((K|0)==163){X=ld(0)|0;if((X|0)!=(-1|0)?(t=X,r=c[14616]|0,Z=r+-1|0,U=((Z&t|0)==0?0:(Z+t&0-r)-t|0)+aa|0,t=c[14605]|0,r=U+t|0,U>>>0>F>>>0&U>>>0<2147483647):0){Z=c[14607]|0;if(Z|0?r>>>0<=t>>>0|r>>>0>Z>>>0:0){ca=0;break}Z=ld(U|0)|0;if((Z|0)==(X|0)){da=X;ea=U;K=180;break d}else{fa=Z;ga=U;K=171}}else ca=0}while(0);do if((K|0)==171){U=0-ga|0;if(!(T>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=fa;ea=ga;K=180;break d}Z=c[14617]|0;X=d-ga+Z&0-Z;if(X>>>0>=2147483647){da=fa;ea=ga;K=180;break d}if((ld(X|0)|0)==(-1|0)){ld(U|0)|0;ca=0;break}else{da=fa;ea=X+ga|0;K=180;break d}}while(0);c[14608]=c[14608]|4;ha=ca;K=178}else{ha=0;K=178}while(0);if(((K|0)==178?aa>>>0<2147483647:0)?(ca=ld(aa|0)|0,aa=ld(0)|0,ga=aa-ca|0,fa=ga>>>0>(F+40|0)>>>0,!((ca|0)==(-1|0)|fa^1|ca>>>0<aa>>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ca;ea=fa?ga:ha;K=180}if((K|0)==180){ha=(c[14605]|0)+ea|0;c[14605]=ha;if(ha>>>0>(c[14606]|0)>>>0)c[14606]=ha;ha=c[14503]|0;do if(ha){ga=58436;while(1){ia=c[ga>>2]|0;ka=ga+4|0;la=c[ka>>2]|0;if((da|0)==(ia+la|0)){K=190;break}fa=c[ga+8>>2]|0;if(!fa)break;else ga=fa}if(((K|0)==190?(c[ga+12>>2]&8|0)==0:0)?ha>>>0<da>>>0&ha>>>0>=ia>>>0:0){c[ka>>2]=la+ea;fa=ha+8|0;ca=(fa&7|0)==0?0:0-fa&7;fa=ha+ca|0;aa=(c[14500]|0)+(ea-ca)|0;c[14503]=fa;c[14500]=aa;c[fa+4>>2]=aa|1;c[fa+aa+4>>2]=40;c[14504]=c[14619];break}aa=c[14501]|0;if(da>>>0<aa>>>0){c[14501]=da;ma=da}else ma=aa;aa=da+ea|0;fa=58436;while(1){if((c[fa>>2]|0)==(aa|0)){K=198;break}ca=c[fa+8>>2]|0;if(!ca)break;else fa=ca}if((K|0)==198?(c[fa+12>>2]&8|0)==0:0){c[fa>>2]=da;ga=fa+4|0;c[ga>>2]=(c[ga>>2]|0)+ea;ga=da+8|0;ca=da+((ga&7|0)==0?0:0-ga&7)|0;ga=aa+8|0;d=aa+((ga&7|0)==0?0:0-ga&7)|0;ga=ca+F|0;T=d-ca-F|0;c[ca+4>>2]=F|3;do if((d|0)!=(ha|0)){if((d|0)==(c[14502]|0)){ba=(c[14499]|0)+T|0;c[14499]=ba;c[14502]=ga;c[ga+4>>2]=ba|1;c[ga+ba>>2]=ba;break}ba=c[d+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;f:do if(ba>>>0>=256){S=c[d+24>>2]|0;X=c[d+12>>2]|0;do if((X|0)==(d|0)){U=d+16|0;Z=U+4|0;r=c[Z>>2]|0;if(!r){t=c[U>>2]|0;if(!t){na=0;break}else{oa=t;pa=U}}else{oa=r;pa=Z}while(1){Z=oa+20|0;r=c[Z>>2]|0;if(r|0){oa=r;pa=Z;continue}Z=oa+16|0;r=c[Z>>2]|0;if(!r)break;else{oa=r;pa=Z}}if(pa>>>0<ma>>>0)ja();else{c[pa>>2]=0;na=oa;break}}else{Z=c[d+8>>2]|0;if(Z>>>0<ma>>>0)ja();r=Z+12|0;if((c[r>>2]|0)!=(d|0))ja();U=X+8|0;if((c[U>>2]|0)==(d|0)){c[r>>2]=X;c[U>>2]=Z;na=X;break}else ja()}while(0);if(!S)break;X=c[d+28>>2]|0;Z=58292+(X<<2)|0;do if((d|0)!=(c[Z>>2]|0))if(S>>>0>=(c[14501]|0)>>>0){c[S+16+(((c[S+16>>2]|0)!=(d|0)&1)<<2)>>2]=na;if(!na)break f;else break}else ja();else{c[Z>>2]=na;if(na|0)break;c[14498]=c[14498]&~(1<<X);break f}while(0);X=c[14501]|0;if(na>>>0<X>>>0)ja();c[na+24>>2]=S;Z=d+16|0;U=c[Z>>2]|0;do if(U|0)if(U>>>0<X>>>0)ja();else{c[na+16>>2]=U;c[U+24>>2]=na;break}while(0);U=c[Z+4>>2]|0;if(!U)break;if(U>>>0<(c[14501]|0)>>>0)ja();else{c[na+20>>2]=U;c[U+24>>2]=na;break}}else{U=c[d+8>>2]|0;X=c[d+12>>2]|0;S=58028+($<<1<<2)|0;do if((U|0)!=(S|0)){if(U>>>0<ma>>>0)ja();if((c[U+12>>2]|0)==(d|0))break;ja()}while(0);if((X|0)==(U|0)){c[14497]=c[14497]&~(1<<$);break}do if((X|0)==(S|0))qa=X+8|0;else{if(X>>>0<ma>>>0)ja();Z=X+8|0;if((c[Z>>2]|0)==(d|0)){qa=Z;break}ja()}while(0);c[U+12>>2]=X;c[qa>>2]=U}while(0);ra=d+_|0;sa=_+T|0}else{ra=d;sa=T}$=ra+4|0;c[$>>2]=c[$>>2]&-2;c[ga+4>>2]=sa|1;c[ga+sa>>2]=sa;$=sa>>>3;if(sa>>>0<256){ba=58028+($<<1<<2)|0;Y=c[14497]|0;S=1<<$;do if(!(Y&S)){c[14497]=Y|S;ta=ba+8|0;ua=ba}else{$=ba+8|0;Z=c[$>>2]|0;if(Z>>>0>=(c[14501]|0)>>>0){ta=$;ua=Z;break}ja()}while(0);c[ta>>2]=ga;c[ua+12>>2]=ga;c[ga+8>>2]=ua;c[ga+12>>2]=ba;break}S=sa>>>8;do if(!S)va=0;else{if(sa>>>0>16777215){va=31;break}Y=(S+1048320|0)>>>16&8;_=S<<Y;Z=(_+520192|0)>>>16&4;$=_<<Z;_=($+245760|0)>>>16&2;r=14-(Z|Y|_)+($<<_>>>15)|0;va=sa>>>(r+7|0)&1|r<<1}while(0);S=58292+(va<<2)|0;c[ga+28>>2]=va;ba=ga+16|0;c[ba+4>>2]=0;c[ba>>2]=0;ba=c[14498]|0;r=1<<va;if(!(ba&r)){c[14498]=ba|r;c[S>>2]=ga;c[ga+24>>2]=S;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}r=sa<<((va|0)==31?0:25-(va>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(sa|0)){K=265;break}wa=ba+16+(r>>>31<<2)|0;S=c[wa>>2]|0;if(!S){K=262;break}else{r=r<<1;ba=S}}if((K|0)==262)if(wa>>>0<(c[14501]|0)>>>0)ja();else{c[wa>>2]=ga;c[ga+24>>2]=ba;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}else if((K|0)==265){r=ba+8|0;S=c[r>>2]|0;_=c[14501]|0;if(S>>>0>=_>>>0&ba>>>0>=_>>>0){c[S+12>>2]=ga;c[r>>2]=ga;c[ga+8>>2]=S;c[ga+12>>2]=ba;c[ga+24>>2]=0;break}else ja()}}else{S=(c[14500]|0)+T|0;c[14500]=S;c[14503]=ga;c[ga+4>>2]=S|1}while(0);q=ca+8|0;l=b;return q|0}ga=58436;while(1){T=c[ga>>2]|0;if(T>>>0<=ha>>>0?(xa=T+(c[ga+4>>2]|0)|0,xa>>>0>ha>>>0):0)break;ga=c[ga+8>>2]|0}ga=xa+-47|0;ca=ga+8|0;T=ga+((ca&7|0)==0?0:0-ca&7)|0;ca=ha+16|0;ga=T>>>0<ca>>>0?ha:T;T=ga+8|0;d=da+8|0;aa=(d&7|0)==0?0:0-d&7;d=da+aa|0;fa=ea+-40-aa|0;c[14503]=d;c[14500]=fa;c[d+4>>2]=fa|1;c[d+fa+4>>2]=40;c[14504]=c[14619];fa=ga+4|0;c[fa>>2]=27;c[T>>2]=c[14609];c[T+4>>2]=c[14610];c[T+8>>2]=c[14611];c[T+12>>2]=c[14612];c[14609]=da;c[14610]=ea;c[14612]=0;c[14611]=T;T=ga+24|0;do{d=T;T=T+4|0;c[T>>2]=7}while((d+8|0)>>>0<xa>>>0);if((ga|0)!=(ha|0)){T=ga-ha|0;c[fa>>2]=c[fa>>2]&-2;c[ha+4>>2]=T|1;c[ga>>2]=T;d=T>>>3;if(T>>>0<256){aa=58028+(d<<1<<2)|0;S=c[14497]|0;r=1<<d;if(S&r){d=aa+8|0;_=c[d>>2]|0;if(_>>>0<(c[14501]|0)>>>0)ja();else{ya=d;za=_}}else{c[14497]=S|r;ya=aa+8|0;za=aa}c[ya>>2]=ha;c[za+12>>2]=ha;c[ha+8>>2]=za;c[ha+12>>2]=aa;break}aa=T>>>8;if(aa)if(T>>>0>16777215)Aa=31;else{r=(aa+1048320|0)>>>16&8;S=aa<<r;aa=(S+520192|0)>>>16&4;_=S<<aa;S=(_+245760|0)>>>16&2;d=14-(aa|r|S)+(_<<S>>>15)|0;Aa=T>>>(d+7|0)&1|d<<1}else Aa=0;d=58292+(Aa<<2)|0;c[ha+28>>2]=Aa;c[ha+20>>2]=0;c[ca>>2]=0;S=c[14498]|0;_=1<<Aa;if(!(S&_)){c[14498]=S|_;c[d>>2]=ha;c[ha+24>>2]=d;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}_=T<<((Aa|0)==31?0:25-(Aa>>>1)|0);S=c[d>>2]|0;while(1){if((c[S+4>>2]&-8|0)==(T|0)){K=292;break}Ba=S+16+(_>>>31<<2)|0;d=c[Ba>>2]|0;if(!d){K=289;break}else{_=_<<1;S=d}}if((K|0)==289)if(Ba>>>0<(c[14501]|0)>>>0)ja();else{c[Ba>>2]=ha;c[ha+24>>2]=S;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}else if((K|0)==292){_=S+8|0;T=c[_>>2]|0;ca=c[14501]|0;if(T>>>0>=ca>>>0&S>>>0>=ca>>>0){c[T+12>>2]=ha;c[_>>2]=ha;c[ha+8>>2]=T;c[ha+12>>2]=S;c[ha+24>>2]=0;break}else ja()}}}else{T=c[14501]|0;if((T|0)==0|da>>>0<T>>>0)c[14501]=da;c[14609]=da;c[14610]=ea;c[14612]=0;c[14506]=c[14615];c[14505]=-1;T=0;do{_=58028+(T<<1<<2)|0;c[_+12>>2]=_;c[_+8>>2]=_;T=T+1|0}while((T|0)!=32);T=da+8|0;S=(T&7|0)==0?0:0-T&7;T=da+S|0;_=ea+-40-S|0;c[14503]=T;c[14500]=_;c[T+4>>2]=_|1;c[T+_+4>>2]=40;c[14504]=c[14619]}while(0);ea=c[14500]|0;if(ea>>>0>F>>>0){da=ea-F|0;c[14500]=da;ea=c[14503]|0;ha=ea+F|0;c[14503]=ha;c[ha+4>>2]=da|1;c[ea+4>>2]=F|3;q=ea+8|0;l=b;return q|0}}c[(Lc()|0)>>2]=12;q=0;l=b;return q|0}function ad(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;if(!a)return;b=a+-8|0;d=c[14501]|0;if(b>>>0<d>>>0)ja();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)ja();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(!a)return;i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)ja();if((i|0)==(c[14502]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;break}c[14499]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;return}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;p=58028+(l<<1<<2)|0;if((h|0)!=(p|0)){if(h>>>0<d>>>0)ja();if((c[h+12>>2]|0)!=(i|0))ja()}if((k|0)==(h|0)){c[14497]=c[14497]&~(1<<l);m=i;n=i;o=j;break}if((k|0)!=(p|0)){if(k>>>0<d>>>0)ja();p=k+8|0;if((c[p>>2]|0)==(i|0))q=p;else ja()}else q=k+8|0;c[h+12>>2]=k;c[q>>2]=h;m=i;n=i;o=j;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){p=i+16|0;l=p+4|0;r=c[l>>2]|0;if(!r){s=c[p>>2]|0;if(!s){t=0;break}else{u=s;v=p}}else{u=r;v=l}while(1){l=u+20|0;r=c[l>>2]|0;if(r|0){u=r;v=l;continue}l=u+16|0;r=c[l>>2]|0;if(!r)break;else{u=r;v=l}}if(v>>>0<d>>>0)ja();else{c[v>>2]=0;t=u;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)ja();r=l+12|0;if((c[r>>2]|0)!=(i|0))ja();p=k+8|0;if((c[p>>2]|0)==(i|0)){c[r>>2]=k;c[p>>2]=l;t=k;break}else ja()}while(0);if(h){k=c[i+28>>2]|0;l=58292+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=t;if(!t){c[14498]=c[14498]&~(1<<k);m=i;n=i;o=j;break a}}else if(h>>>0>=(c[14501]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=t;if(!t){m=i;n=i;o=j;break a}else break}else ja();while(0);k=c[14501]|0;if(t>>>0<k>>>0)ja();c[t+24>>2]=h;l=i+16|0;p=c[l>>2]|0;do if(p|0)if(p>>>0<k>>>0)ja();else{c[t+16>>2]=p;c[p+24>>2]=t;break}while(0);p=c[l+4>>2]|0;if(p)if(p>>>0<(c[14501]|0)>>>0)ja();else{c[t+20>>2]=p;c[p+24>>2]=t;m=i;n=i;o=j;break}else{m=i;n=i;o=j}}else{m=i;n=i;o=j}}else{m=b;n=b;o=f}while(0);if(m>>>0>=g>>>0)ja();f=g+4|0;b=c[f>>2]|0;if(!(b&1))ja();if(!(b&2)){t=c[14502]|0;if((g|0)==(c[14503]|0)){d=(c[14500]|0)+o|0;c[14500]=d;c[14503]=n;c[n+4>>2]=d|1;if((n|0)!=(t|0))return;c[14502]=0;c[14499]=0;return}if((g|0)==(t|0)){t=(c[14499]|0)+o|0;c[14499]=t;c[14502]=m;c[n+4>>2]=t|1;c[m+t>>2]=t;return}t=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){u=c[g+24>>2]|0;v=c[g+12>>2]|0;do if((v|0)==(g|0)){q=g+16|0;a=q+4|0;e=c[a>>2]|0;if(!e){p=c[q>>2]|0;if(!p){w=0;break}else{x=p;y=q}}else{x=e;y=a}while(1){a=x+20|0;e=c[a>>2]|0;if(e|0){x=e;y=a;continue}a=x+16|0;e=c[a>>2]|0;if(!e)break;else{x=e;y=a}}if(y>>>0<(c[14501]|0)>>>0)ja();else{c[y>>2]=0;w=x;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[14501]|0)>>>0)ja();e=a+12|0;if((c[e>>2]|0)!=(g|0))ja();q=v+8|0;if((c[q>>2]|0)==(g|0)){c[e>>2]=v;c[q>>2]=a;w=v;break}else ja()}while(0);if(u|0){v=c[g+28>>2]|0;j=58292+(v<<2)|0;do if((g|0)==(c[j>>2]|0)){c[j>>2]=w;if(!w){c[14498]=c[14498]&~(1<<v);break b}}else if(u>>>0>=(c[14501]|0)>>>0){c[u+16+(((c[u+16>>2]|0)!=(g|0)&1)<<2)>>2]=w;if(!w)break b;else break}else ja();while(0);v=c[14501]|0;if(w>>>0<v>>>0)ja();c[w+24>>2]=u;j=g+16|0;i=c[j>>2]|0;do if(i|0)if(i>>>0<v>>>0)ja();else{c[w+16>>2]=i;c[i+24>>2]=w;break}while(0);i=c[j+4>>2]|0;if(i|0)if(i>>>0<(c[14501]|0)>>>0)ja();else{c[w+20>>2]=i;c[i+24>>2]=w;break}}}else{i=c[g+8>>2]|0;v=c[g+12>>2]|0;u=58028+(d<<1<<2)|0;if((i|0)!=(u|0)){if(i>>>0<(c[14501]|0)>>>0)ja();if((c[i+12>>2]|0)!=(g|0))ja()}if((v|0)==(i|0)){c[14497]=c[14497]&~(1<<d);break}if((v|0)!=(u|0)){if(v>>>0<(c[14501]|0)>>>0)ja();u=v+8|0;if((c[u>>2]|0)==(g|0))z=u;else ja()}else z=v+8|0;c[i+12>>2]=v;c[z>>2]=i}while(0);c[n+4>>2]=t|1;c[m+t>>2]=t;if((n|0)==(c[14502]|0)){c[14499]=t;return}else A=t}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;A=o}o=A>>>3;if(A>>>0<256){m=58028+(o<<1<<2)|0;b=c[14497]|0;f=1<<o;if(b&f){o=m+8|0;t=c[o>>2]|0;if(t>>>0<(c[14501]|0)>>>0)ja();else{B=o;C=t}}else{c[14497]=b|f;B=m+8|0;C=m}c[B>>2]=n;c[C+12>>2]=n;c[n+8>>2]=C;c[n+12>>2]=m;return}m=A>>>8;if(m)if(A>>>0>16777215)D=31;else{C=(m+1048320|0)>>>16&8;B=m<<C;m=(B+520192|0)>>>16&4;f=B<<m;B=(f+245760|0)>>>16&2;b=14-(m|C|B)+(f<<B>>>15)|0;D=A>>>(b+7|0)&1|b<<1}else D=0;b=58292+(D<<2)|0;c[n+28>>2]=D;c[n+20>>2]=0;c[n+16>>2]=0;B=c[14498]|0;f=1<<D;do if(B&f){C=A<<((D|0)==31?0:25-(D>>>1)|0);m=c[b>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(A|0)){E=124;break}F=m+16+(C>>>31<<2)|0;t=c[F>>2]|0;if(!t){E=121;break}else{C=C<<1;m=t}}if((E|0)==121)if(F>>>0<(c[14501]|0)>>>0)ja();else{c[F>>2]=n;c[n+24>>2]=m;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((E|0)==124){C=m+8|0;j=c[C>>2]|0;t=c[14501]|0;if(j>>>0>=t>>>0&m>>>0>=t>>>0){c[j+12>>2]=n;c[C>>2]=n;c[n+8>>2]=j;c[n+12>>2]=m;c[n+24>>2]=0;break}else ja()}}else{c[14498]=B|f;c[b>>2]=n;c[n+24>>2]=b;c[n+12>>2]=n;c[n+8>>2]=n}while(0);n=(c[14505]|0)+-1|0;c[14505]=n;if(!n)G=58444;else return;while(1){n=c[G>>2]|0;if(!n)break;else G=n+8|0}c[14505]=-1;return}function bd(a,b){a=a|0;b=b|0;var d=0,e=0;if(a){d=R(b,a)|0;if((b|a)>>>0>65535)e=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1;else e=d}else e=0;d=$c(e)|0;if(!d)return d|0;if(!(c[d+-4>>2]&3))return d|0;id(d|0,0,e|0)|0;return d|0}function cd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a){d=$c(b)|0;return d|0}if(b>>>0>4294967231){c[(Lc()|0)>>2]=12;d=0;return d|0}e=dd(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(e|0){d=e+8|0;return d|0}e=$c(b)|0;if(!e){d=0;return d|0}f=c[a+-4>>2]|0;g=(f&-8)-((f&3|0)==0?8:4)|0;md(e|0,a|0,(g>>>0<b>>>0?g:b)|0)|0;ad(a);d=e;return d|0}function dd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a+f|0;h=c[14501]|0;i=e&3;if(!((i|0)!=1&a>>>0>=h>>>0&a>>>0<g>>>0))ja();j=c[g+4>>2]|0;if(!(j&1))ja();if(!i){if(b>>>0<256){k=0;return k|0}if(f>>>0>=(b+4|0)>>>0?(f-b|0)>>>0<=c[14617]<<1>>>0:0){k=a;return k|0}k=0;return k|0}if(f>>>0>=b>>>0){i=f-b|0;if(i>>>0<=15){k=a;return k|0}l=a+b|0;c[d>>2]=e&1|b|2;c[l+4>>2]=i|3;m=l+i+4|0;c[m>>2]=c[m>>2]|1;ed(l,i);k=a;return k|0}if((g|0)==(c[14503]|0)){i=(c[14500]|0)+f|0;l=i-b|0;m=a+b|0;if(i>>>0<=b>>>0){k=0;return k|0}c[d>>2]=e&1|b|2;c[m+4>>2]=l|1;c[14503]=m;c[14500]=l;k=a;return k|0}if((g|0)==(c[14502]|0)){l=(c[14499]|0)+f|0;if(l>>>0<b>>>0){k=0;return k|0}m=l-b|0;i=e&1;if(m>>>0>15){n=a+b|0;o=n+m|0;c[d>>2]=i|b|2;c[n+4>>2]=m|1;c[o>>2]=m;p=o+4|0;c[p>>2]=c[p>>2]&-2;q=n;r=m}else{c[d>>2]=i|l|2;i=a+l+4|0;c[i>>2]=c[i>>2]|1;q=0;r=0}c[14499]=r;c[14502]=q;k=a;return k|0}if(j&2|0){k=0;return k|0}q=(j&-8)+f|0;if(q>>>0<b>>>0){k=0;return k|0}f=q-b|0;r=j>>>3;a:do if(j>>>0>=256){i=c[g+24>>2]|0;l=c[g+12>>2]|0;do if((l|0)==(g|0)){m=g+16|0;n=m+4|0;p=c[n>>2]|0;if(!p){o=c[m>>2]|0;if(!o){s=0;break}else{t=o;u=m}}else{t=p;u=n}while(1){n=t+20|0;p=c[n>>2]|0;if(p|0){t=p;u=n;continue}n=t+16|0;p=c[n>>2]|0;if(!p)break;else{t=p;u=n}}if(u>>>0<h>>>0)ja();else{c[u>>2]=0;s=t;break}}else{n=c[g+8>>2]|0;if(n>>>0<h>>>0)ja();p=n+12|0;if((c[p>>2]|0)!=(g|0))ja();m=l+8|0;if((c[m>>2]|0)==(g|0)){c[p>>2]=l;c[m>>2]=n;s=l;break}else ja()}while(0);if(i|0){l=c[g+28>>2]|0;n=58292+(l<<2)|0;do if((g|0)==(c[n>>2]|0)){c[n>>2]=s;if(!s){c[14498]=c[14498]&~(1<<l);break a}}else if(i>>>0>=(c[14501]|0)>>>0){c[i+16+(((c[i+16>>2]|0)!=(g|0)&1)<<2)>>2]=s;if(!s)break a;else break}else ja();while(0);l=c[14501]|0;if(s>>>0<l>>>0)ja();c[s+24>>2]=i;n=g+16|0;m=c[n>>2]|0;do if(m|0)if(m>>>0<l>>>0)ja();else{c[s+16>>2]=m;c[m+24>>2]=s;break}while(0);m=c[n+4>>2]|0;if(m|0)if(m>>>0<(c[14501]|0)>>>0)ja();else{c[s+20>>2]=m;c[m+24>>2]=s;break}}}else{m=c[g+8>>2]|0;l=c[g+12>>2]|0;i=58028+(r<<1<<2)|0;if((m|0)!=(i|0)){if(m>>>0<h>>>0)ja();if((c[m+12>>2]|0)!=(g|0))ja()}if((l|0)==(m|0)){c[14497]=c[14497]&~(1<<r);break}if((l|0)!=(i|0)){if(l>>>0<h>>>0)ja();i=l+8|0;if((c[i>>2]|0)==(g|0))v=i;else ja()}else v=l+8|0;c[m+12>>2]=l;c[v>>2]=m}while(0);v=e&1;if(f>>>0<16){c[d>>2]=q|v|2;e=a+q+4|0;c[e>>2]=c[e>>2]|1;k=a;return k|0}else{e=a+b|0;c[d>>2]=v|b|2;c[e+4>>2]=f|3;b=e+f+4|0;c[b>>2]=c[b>>2]|1;ed(e,f);k=a;return k|0}return 0}function ed(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=a+b|0;e=c[a+4>>2]|0;a:do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;i=c[14501]|0;if(g>>>0<i>>>0)ja();if((g|0)==(c[14502]|0)){j=d+4|0;k=c[j>>2]|0;if((k&3|0)!=3){l=g;m=h;break}c[14499]=h;c[j>>2]=k&-2;c[g+4>>2]=h|1;c[g+h>>2]=h;return}k=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;j=c[g+12>>2]|0;n=58028+(k<<1<<2)|0;if((f|0)!=(n|0)){if(f>>>0<i>>>0)ja();if((c[f+12>>2]|0)!=(g|0))ja()}if((j|0)==(f|0)){c[14497]=c[14497]&~(1<<k);l=g;m=h;break}if((j|0)!=(n|0)){if(j>>>0<i>>>0)ja();n=j+8|0;if((c[n>>2]|0)==(g|0))o=n;else ja()}else o=j+8|0;c[f+12>>2]=j;c[o>>2]=f;l=g;m=h;break}f=c[g+24>>2]|0;j=c[g+12>>2]|0;do if((j|0)==(g|0)){n=g+16|0;k=n+4|0;p=c[k>>2]|0;if(!p){q=c[n>>2]|0;if(!q){r=0;break}else{s=q;t=n}}else{s=p;t=k}while(1){k=s+20|0;p=c[k>>2]|0;if(p|0){s=p;t=k;continue}k=s+16|0;p=c[k>>2]|0;if(!p)break;else{s=p;t=k}}if(t>>>0<i>>>0)ja();else{c[t>>2]=0;r=s;break}}else{k=c[g+8>>2]|0;if(k>>>0<i>>>0)ja();p=k+12|0;if((c[p>>2]|0)!=(g|0))ja();n=j+8|0;if((c[n>>2]|0)==(g|0)){c[p>>2]=j;c[n>>2]=k;r=j;break}else ja()}while(0);if(f){j=c[g+28>>2]|0;i=58292+(j<<2)|0;do if((g|0)==(c[i>>2]|0)){c[i>>2]=r;if(!r){c[14498]=c[14498]&~(1<<j);l=g;m=h;break a}}else if(f>>>0>=(c[14501]|0)>>>0){c[f+16+(((c[f+16>>2]|0)!=(g|0)&1)<<2)>>2]=r;if(!r){l=g;m=h;break a}else break}else ja();while(0);j=c[14501]|0;if(r>>>0<j>>>0)ja();c[r+24>>2]=f;i=g+16|0;k=c[i>>2]|0;do if(k|0)if(k>>>0<j>>>0)ja();else{c[r+16>>2]=k;c[k+24>>2]=r;break}while(0);k=c[i+4>>2]|0;if(k)if(k>>>0<(c[14501]|0)>>>0)ja();else{c[r+20>>2]=k;c[k+24>>2]=r;l=g;m=h;break}else{l=g;m=h}}else{l=g;m=h}}else{l=a;m=b}while(0);b=c[14501]|0;if(d>>>0<b>>>0)ja();a=d+4|0;r=c[a>>2]|0;if(!(r&2)){s=c[14502]|0;if((d|0)==(c[14503]|0)){t=(c[14500]|0)+m|0;c[14500]=t;c[14503]=l;c[l+4>>2]=t|1;if((l|0)!=(s|0))return;c[14502]=0;c[14499]=0;return}if((d|0)==(s|0)){s=(c[14499]|0)+m|0;c[14499]=s;c[14502]=l;c[l+4>>2]=s|1;c[l+s>>2]=s;return}s=(r&-8)+m|0;t=r>>>3;b:do if(r>>>0>=256){o=c[d+24>>2]|0;e=c[d+12>>2]|0;do if((e|0)==(d|0)){k=d+16|0;j=k+4|0;f=c[j>>2]|0;if(!f){n=c[k>>2]|0;if(!n){u=0;break}else{v=n;w=k}}else{v=f;w=j}while(1){j=v+20|0;f=c[j>>2]|0;if(f|0){v=f;w=j;continue}j=v+16|0;f=c[j>>2]|0;if(!f)break;else{v=f;w=j}}if(w>>>0<b>>>0)ja();else{c[w>>2]=0;u=v;break}}else{j=c[d+8>>2]|0;if(j>>>0<b>>>0)ja();f=j+12|0;if((c[f>>2]|0)!=(d|0))ja();k=e+8|0;if((c[k>>2]|0)==(d|0)){c[f>>2]=e;c[k>>2]=j;u=e;break}else ja()}while(0);if(o|0){e=c[d+28>>2]|0;h=58292+(e<<2)|0;do if((d|0)==(c[h>>2]|0)){c[h>>2]=u;if(!u){c[14498]=c[14498]&~(1<<e);break b}}else if(o>>>0>=(c[14501]|0)>>>0){c[o+16+(((c[o+16>>2]|0)!=(d|0)&1)<<2)>>2]=u;if(!u)break b;else break}else ja();while(0);e=c[14501]|0;if(u>>>0<e>>>0)ja();c[u+24>>2]=o;h=d+16|0;g=c[h>>2]|0;do if(g|0)if(g>>>0<e>>>0)ja();else{c[u+16>>2]=g;c[g+24>>2]=u;break}while(0);g=c[h+4>>2]|0;if(g|0)if(g>>>0<(c[14501]|0)>>>0)ja();else{c[u+20>>2]=g;c[g+24>>2]=u;break}}}else{g=c[d+8>>2]|0;e=c[d+12>>2]|0;o=58028+(t<<1<<2)|0;if((g|0)!=(o|0)){if(g>>>0<b>>>0)ja();if((c[g+12>>2]|0)!=(d|0))ja()}if((e|0)==(g|0)){c[14497]=c[14497]&~(1<<t);break}if((e|0)!=(o|0)){if(e>>>0<b>>>0)ja();o=e+8|0;if((c[o>>2]|0)==(d|0))x=o;else ja()}else x=e+8|0;c[g+12>>2]=e;c[x>>2]=g}while(0);c[l+4>>2]=s|1;c[l+s>>2]=s;if((l|0)==(c[14502]|0)){c[14499]=s;return}else y=s}else{c[a>>2]=r&-2;c[l+4>>2]=m|1;c[l+m>>2]=m;y=m}m=y>>>3;if(y>>>0<256){r=58028+(m<<1<<2)|0;a=c[14497]|0;s=1<<m;if(a&s){m=r+8|0;x=c[m>>2]|0;if(x>>>0<(c[14501]|0)>>>0)ja();else{z=m;A=x}}else{c[14497]=a|s;z=r+8|0;A=r}c[z>>2]=l;c[A+12>>2]=l;c[l+8>>2]=A;c[l+12>>2]=r;return}r=y>>>8;if(r)if(y>>>0>16777215)B=31;else{A=(r+1048320|0)>>>16&8;z=r<<A;r=(z+520192|0)>>>16&4;s=z<<r;z=(s+245760|0)>>>16&2;a=14-(r|A|z)+(s<<z>>>15)|0;B=y>>>(a+7|0)&1|a<<1}else B=0;a=58292+(B<<2)|0;c[l+28>>2]=B;c[l+20>>2]=0;c[l+16>>2]=0;z=c[14498]|0;s=1<<B;if(!(z&s)){c[14498]=z|s;c[a>>2]=l;c[l+24>>2]=a;c[l+12>>2]=l;c[l+8>>2]=l;return}s=y<<((B|0)==31?0:25-(B>>>1)|0);B=c[a>>2]|0;while(1){if((c[B+4>>2]&-8|0)==(y|0)){C=121;break}D=B+16+(s>>>31<<2)|0;a=c[D>>2]|0;if(!a){C=118;break}else{s=s<<1;B=a}}if((C|0)==118){if(D>>>0<(c[14501]|0)>>>0)ja();c[D>>2]=l;c[l+24>>2]=B;c[l+12>>2]=l;c[l+8>>2]=l;return}else if((C|0)==121){C=B+8|0;D=c[C>>2]|0;s=c[14501]|0;if(!(D>>>0>=s>>>0&B>>>0>=s>>>0))ja();c[D+12>>2]=l;c[C>>2]=l;c[l+8>>2]=D;c[l+12>>2]=B;c[l+24>>2]=0;return}}function fd(){}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (C=e,a-c>>>0|0)|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (C=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function id(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function jd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}C=a<<c-32;return 0}function kd(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function ld(a){a=a|0;var b=0,d=0;a=a+15&-16|0;b=c[i>>2]|0;d=b+a|0;if((a|0)>0&(d|0)<(b|0)|(d|0)<0){Z()|0;ka(12);return -1}c[i>>2]=d;if((d|0)>(Y()|0)?(X()|0)==0:0){ka(12);c[i>>2]=b;return -1}return b|0}function md(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return ma(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function nd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return qa[a&7](b|0,c|0,d|0,e|0)|0}function od(a,b){a=a|0;b=b|0;ra[a&7](b|0)}function pd(a,b,c){a=a|0;b=b|0;c=c|0;sa[a&3](b|0,c|0)}function qd(a,b){a=a|0;b=b|0;return ta[a&1](b|0)|0}function rd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ua[a&1](b|0,c|0,d|0)}function sd(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return va[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function td(a,b,c){a=a|0;b=b|0;c=c|0;return wa[a&15](b|0,c|0)|0}function ud(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return xa[a&7](b|0,c|0,d|0,e|0,f|0)|0}function vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;V(0);return 0}function wd(a){a=a|0;V(1)}function xd(a,b){a=a|0;b=b|0;V(2)}function yd(a){a=a|0;V(3);return 0}function zd(a,b,c){a=a|0;b=b|0;c=c|0;V(4)}function Ad(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;V(5);return 0}function Bd(a,b){a=a|0;b=b|0;V(6);return 0}function Cd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;V(7);return 0}\n\n// EMSCRIPTEN_END_FUNCS\nvar qa=[vd,Ta,bb,kb,qb,vd,vd,vd];var ra=[wd,Qa,Ra,_a,$a,hb,ib,zb];var sa=[xd,Na,mb,xd];var ta=[yd,Ab];var ua=[zd,xb];var va=[Ad,ob,ub,Ad];var wa=[Bd,Oa,Pa,Sa,Ya,Za,ab,fb,gb,yb,Bb,Xa,Qb,nc,Bd,Bd];var xa=[Cd,jb,nb,pb,tb,vb,Cd,Cd];return{_llvm_bswap_i32:kd,getTempRet0:Ea,setThrew:Ca,_bitshift64Shl:jd,_memset:id,_ogv_audio_decoder_process_header:Gc,_sbrk:ld,_memcpy:md,stackAlloc:ya,_i64Subtract:gd,setTempRet0:Da,_i64Add:hd,_emscripten_get_global_libc:Kc,stackSave:za,_free:ad,runPostSets:fd,_ogv_audio_decoder_destroy:Ic,_ogv_audio_decoder_init:Fc,establishStackSpace:Ba,stackRestore:Aa,_malloc:$c,_ogv_audio_decoder_process_audio:Hc,stackAlloc:ya,stackSave:za,stackRestore:Aa,establishStackSpace:Ba,setThrew:Ca,setTempRet0:Da,getTempRet0:Ea,dynCall_iiiii:nd,dynCall_vi:od,dynCall_vii:pd,dynCall_ii:qd,dynCall_viii:rd,dynCall_iiiiiiiii:sd,dynCall_iii:td,dynCall_iiiiii:ud}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _ogv_audio_decoder_process_header=Module[\"_ogv_audio_decoder_process_header\"]=asm[\"_ogv_audio_decoder_process_header\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var _free=Module[\"_free\"]=asm[\"_free\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var _ogv_audio_decoder_destroy=Module[\"_ogv_audio_decoder_destroy\"]=asm[\"_ogv_audio_decoder_destroy\"];var _ogv_audio_decoder_init=Module[\"_ogv_audio_decoder_init\"]=asm[\"_ogv_audio_decoder_init\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _ogv_audio_decoder_process_audio=Module[\"_ogv_audio_decoder_process_audio\"]=asm[\"_ogv_audio_decoder_process_audio\"];var dynCall_iiiii=Module[\"dynCall_iiiii\"]=asm[\"dynCall_iiiii\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_viii=Module[\"dynCall_viii\"]=asm[\"dynCall_viii\"];var dynCall_iiiiiiiii=Module[\"dynCall_iiiiiiiii\"]=asm[\"dynCall_iiiiiiiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=asm[\"dynCall_iiiiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}Module.loadedMetadata=!!options.audioFormat;Module.audioFormat=options.audioFormat||null;Module.audioBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_audio_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_header(buffer,len)}));callback(ret)});Module.processAudio=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_audio_decoder_process_audio(buffer,len)}));callback(ret)});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDecoderAudioVorbis;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-theora-wasm.js",
    "content": "var OGVDecoderVideoTheoraW\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoTheoraW = function(OGVDecoderVideoTheoraW) {\n  OGVDecoderVideoTheoraW = OGVDecoderVideoTheoraW || {};\n  if (!OGVDecoderVideoTheoraW.currentScriptUrl) OGVDecoderVideoTheoraW.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoTheoraW;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoTheoraW=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoTheoraW!==\"undefined\"?OGVDecoderVideoTheoraW:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Memory===\"function\"){Module[\"wasmMemory\"]=new WebAssembly.Memory({\"initial\":TOTAL_MEMORY/WASM_PAGE_SIZE,\"maximum\":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\"wasmMemory\"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"fround\"]){var froundBuffer=new Float32Array(1);Math[\"fround\"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math[\"fround\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module[\"wasmJSMethod\"]||\"native-wasm\";Module[\"wasmJSMethod\"]=method;var wasmTextFile=Module[\"wasmTextFile\"]||\"ogv-decoder-video-theora-wasm.wast\";var wasmBinaryFile=Module[\"wasmBinaryFile\"]||\"ogv-decoder-video-theora-wasm.wasm\";var asmjsCodeFile=Module[\"asmjsCodeFile\"]||\"ogv-decoder-video-theora-wasm.temp.asm.js\";if(typeof Module[\"locateFile\"]===\"function\"){wasmTextFile=Module[\"locateFile\"](wasmTextFile);wasmBinaryFile=Module[\"locateFile\"](wasmBinaryFile);asmjsCodeFile=Module[\"locateFile\"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={\"f64-rem\":(function(x,y){return x%y}),\"f64-to-int\":(function(x){return x|0}),\"i32s-div\":(function(x,y){return(x|0)/(y|0)|0}),\"i32u-div\":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\"i32s-rem\":(function(x,y){return(x|0)%(y|0)|0}),\"i32u-rem\":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\"debugger\":(function(){debugger})};var info={\"global\":null,\"env\":null,\"asm2wasm\":asm2wasmImports,\"parent\":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(\".\")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(\".\");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\"bad lookupImport to (\"+mod+\").\"+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module[\"buffer\"];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\"printErr\"](\"the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here\")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\"STATIC_BASE\"],Module[\"STATIC_BASE\"]+Module[\"STATIC_BUMP\"]),Module[\"STATIC_BASE\"])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function fixImports(imports){if(!0)return imports;var ret={};for(var i in imports){var fixed=i;if(fixed[0]==\"_\")fixed=fixed.substr(1);ret[fixed]=imports[i]}return ret}function getBinary(){var binary;if(Module[\"wasmBinary\"]){binary=Module[\"wasmBinary\"];binary=new Uint8Array(binary)}else if(Module[\"readBinary\"]){binary=Module[\"readBinary\"](wasmBinaryFile)}else{throw\"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)\"}return binary}function getBinaryPromise(){if(!Module[\"wasmBinary\"]&&typeof fetch===\"function\"){return fetch(wasmBinaryFile).then((function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doJustAsm(global,env,providedBuffer){if(typeof Module[\"asm\"]!==\"function\"||Module[\"asm\"]===methodHandler){if(!Module[\"asmPreload\"]){eval(Module[\"read\"](asmjsCodeFile))}else{Module[\"asm\"]=Module[\"asmPreload\"]}}if(typeof Module[\"asm\"]!==\"function\"){Module[\"printErr\"](\"asm evalling did not set the module properly\");return false}return Module[\"asm\"](global,env,providedBuffer)}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!==\"object\"){Module[\"printErr\"](\"no native wasm support detected\");return false}if(!(Module[\"wasmMemory\"]instanceof WebAssembly.Memory)){Module[\"printErr\"](\"no native wasm Memory in use\");return false}env[\"memory\"]=Module[\"wasmMemory\"];info[\"global\"]={\"NaN\":NaN,\"Infinity\":Infinity};info[\"global.Math\"]=global.Math;info[\"env\"]=env;function receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\"asm\"]=exports;Module[\"usingWasm\"]=true;removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){Module[\"printErr\"](\"Module.instantiateWasm callback failed with error: \"+e);return false}}getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\"instance\"])})).catch((function(reason){Module[\"printErr\"](\"failed to asynchronously prepare wasm: \"+reason);Module[\"quit\"](1,reason)}));return{}}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!==\"function\"){Module[\"printErr\"](\"WasmJS not detected - polyfill not bundled?\");return false}var wasmJS=WasmJS({});wasmJS[\"outside\"]=Module;wasmJS[\"info\"]=info;wasmJS[\"lookupImport\"]=lookupImport;assert(providedBuffer===Module[\"buffer\"]);info.global=global;info.env=env;assert(providedBuffer===Module[\"buffer\"]);env[\"memory\"]=providedBuffer;assert(env[\"memory\"]instanceof ArrayBuffer);wasmJS[\"providedTotalMemory\"]=Module[\"buffer\"].byteLength;var code;if(method===\"interpret-binary\"){code=getBinary()}else{code=Module[\"read\"](method==\"interpret-asm2wasm\"?asmjsCodeFile:wasmTextFile)}var temp;if(method==\"interpret-asm2wasm\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_asm2wasm\"](temp)}else if(method===\"interpret-s-expr\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_s_expr2wasm\"](temp)}else if(method===\"interpret-binary\"){temp=wasmJS[\"_malloc\"](code.length);wasmJS[\"HEAPU8\"].set(code,temp);wasmJS[\"_load_binary2wasm\"](temp,code.length)}else{throw\"what? \"+method}wasmJS[\"_free\"](temp);wasmJS[\"_instantiate\"](temp);if(Module[\"newBuffer\"]){mergeMemory(Module[\"newBuffer\"]);Module[\"newBuffer\"]=null}exports=wasmJS[\"asmExports\"];return exports}Module[\"asmPreload\"]=Module[\"asm\"];Module[\"reallocBuffer\"]=(function(size){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module[\"buffer\"];var oldSize=old.byteLength;if(Module[\"usingWasm\"]){try{var result=Module[\"wasmMemory\"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module[\"buffer\"]=Module[\"wasmMemory\"].buffer}else{return null}}catch(e){return null}}else{exports[\"__growWasmMemory\"]((size-oldSize)/wasmPageSize);return Module[\"buffer\"]!==old?Module[\"buffer\"]:null}});Module[\"asm\"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\"table\"]){var TABLE_SIZE=Module[\"wasmTableSize\"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module[\"wasmMaxTableSize\"];if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Table===\"function\"){if(MAX_TABLE_SIZE!==undefined){env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,\"maximum\":MAX_TABLE_SIZE,\"element\":\"anyfunc\"})}else{env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,element:\"anyfunc\"})}}else{env[\"table\"]=new Array(TABLE_SIZE)}Module[\"wasmTable\"]=env[\"table\"]}if(!env[\"memoryBase\"]){env[\"memoryBase\"]=Module[\"STATIC_BASE\"]}if(!env[\"tableBase\"]){env[\"tableBase\"]=0}var exports;var methods=method.split(\",\");for(var i=0;i<methods.length;i++){var curr=methods[i];if(curr===\"native-wasm\"){if(exports=doNativeWasm(global,env,providedBuffer))break}else if(curr===\"asmjs\"){if(exports=doJustAsm(global,env,providedBuffer))break}else if(curr===\"interpret-asm2wasm\"||curr===\"interpret-s-expr\"||curr===\"interpret-binary\"){if(exports=doWasmPolyfill(global,env,providedBuffer,curr))break}else{throw\"bad method: \"+curr}}if(!exports)throw\"no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods\";return exports});var methodHandler=Module[\"asm\"]}integrateWasmJS(Module);var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+3632;__ATINIT__.push();memoryInitializer=Module[\"wasmJSMethod\"].indexOf(\"asmjs\")>=0||Module[\"wasmJSMethod\"].indexOf(\"interpret-asm2wasm\")>=0?\"ogv-decoder-video-theora-wasm.js.mem\":null;var STATIC_BUMP=3632;Module[\"STATIC_BASE\"]=STATIC_BASE;Module[\"STATIC_BUMP\"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;Module[\"_memset\"]=_memset;function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;function _abort(){Module[\"abort\"]()}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}function _ogvjs_callback_init_video(frameWidth,frameHeight,chromaWidth,chromaHeight,fps,picWidth,picHeight,picX,picY,displayWidth,displayHeight){Module.videoFormat={width:frameWidth,height:frameHeight,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:picX,cropTop:picY,cropWidth:picWidth,cropHeight:picHeight,displayWidth:displayWidth,displayHeight:displayHeight,fps:fps};Module.loadedMetadata=true}DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\"wasmTableSize\"]=16;Module[\"wasmMaxTableSize\"]=16;function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_vii\":invoke_vii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_ogvjs_callback_init_video\":_ogvjs_callback_init_video,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};var asm=Module[\"asm\"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\"asm\"]=asm;var _malloc=Module[\"_malloc\"]=(function(){return Module[\"asm\"][\"_malloc\"].apply(null,arguments)});var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_init\"].apply(null,arguments)});var getTempRet0=Module[\"getTempRet0\"]=(function(){return Module[\"asm\"][\"getTempRet0\"].apply(null,arguments)});var _free=Module[\"_free\"]=(function(){return Module[\"asm\"][\"_free\"].apply(null,arguments)});var runPostSets=Module[\"runPostSets\"]=(function(){return Module[\"asm\"][\"runPostSets\"].apply(null,arguments)});var setTempRet0=Module[\"setTempRet0\"]=(function(){return Module[\"asm\"][\"setTempRet0\"].apply(null,arguments)});var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_process_header\"].apply(null,arguments)});var establishStackSpace=Module[\"establishStackSpace\"]=(function(){return Module[\"asm\"][\"establishStackSpace\"].apply(null,arguments)});var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_destroy\"].apply(null,arguments)});var _memset=Module[\"_memset\"]=(function(){return Module[\"asm\"][\"_memset\"].apply(null,arguments)});var _sbrk=Module[\"_sbrk\"]=(function(){return Module[\"asm\"][\"_sbrk\"].apply(null,arguments)});var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_async\"].apply(null,arguments)});var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=(function(){return Module[\"asm\"][\"_emscripten_get_global_libc\"].apply(null,arguments)});var _memcpy=Module[\"_memcpy\"]=(function(){return Module[\"asm\"][\"_memcpy\"].apply(null,arguments)});var stackAlloc=Module[\"stackAlloc\"]=(function(){return Module[\"asm\"][\"stackAlloc\"].apply(null,arguments)});var setThrew=Module[\"setThrew\"]=(function(){return Module[\"asm\"][\"setThrew\"].apply(null,arguments)});var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_process_frame\"].apply(null,arguments)});var stackRestore=Module[\"stackRestore\"]=(function(){return Module[\"asm\"][\"stackRestore\"].apply(null,arguments)});var stackSave=Module[\"stackSave\"]=(function(){return Module[\"asm\"][\"stackSave\"].apply(null,arguments)});var dynCall_vii=Module[\"dynCall_vii\"]=(function(){return Module[\"asm\"][\"dynCall_vii\"].apply(null,arguments)});var dynCall_viiii=Module[\"dynCall_viiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiii\"].apply(null,arguments)});Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;if(memoryInitializer){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];if(request.status!==200&&request.status!==0){console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n  return OGVDecoderVideoTheoraW;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-theora.js",
    "content": "var OGVDecoderVideoTheora\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoTheora = function(OGVDecoderVideoTheora) {\n  OGVDecoderVideoTheora = OGVDecoderVideoTheora || {};\n  if (!OGVDecoderVideoTheora.currentScriptUrl) OGVDecoderVideoTheora.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoTheora;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoTheora=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoTheora!==\"undefined\"?OGVDecoderVideoTheora:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+2608;__ATINIT__.push();allocate([1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,16,0,0,0,32,0,0,0,8,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,16,0,0,0,0,160,1,0,0,144,1,0,0,160,2,0,0,144,2,0,0,160,4,0,0,144,4,0,0,160,8,0,0,160,40,0,0,144,8,0,0,144,40,10,0,32,0,10,0,224,255,0,0,240,255,0,1,0,0,0,2,0,0,0,3,0,0,1,0,32,0,1,0,224,255,2,0,32,0,2,0,224,255,3,0,32,0,3,0,224,255,4,0,32,0,4,0,224,255,5,0,32,0,5,0,224,255,1,0,64,0,1,0,96,0,1,0,192,255,1,0,160,255,6,0,32,0,7,0,32,0,8,0,32,0,9,0,32,0,6,0,224,255,7,0,224,255,8,0,224,255,9,0,224,255,2,0,64,0,3,0,64,0,2,0,96,0,3,0,96,0,2,0,192,255,3,0,192,255,2,0,160,255,3,0,160,255,0,0,240,255,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,0,0,32,0,0,0,224,255,0,0,64,0,0,0,192,255,0,0,96,0,0,0,160,255,0,0,128,0,0,0,128,255,0,0,160,0,0,0,96,255,0,0,192,0,0,0,64,255,0,0,224,0,0,0,0,1,0,0,32,255,0,0,0,255,0,0,32,1,0,0,64,1,0,0,96,1,0,0,128,1,0,0,224,254,0,0,192,254,0,0,160,254,0,0,128,254,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,255,254,255,254,255,254,255,254,255,254,255,254,255,254,255,254,254,252,254,252,253,252,253,252,252,251,251,251,224,251,17,0,2,0,220,253,216,253,180,253,36,253,5,0,255,253,255,253,255,253,255,253,255,253,255,253,255,253,255,253,254,253,254,253,254,253,254,253,254,253,254,253,254,253,254,253,253,252,253,252,253,252,253,252,252,252,252,252,252,252,252,252,251,251,251,251,250,251,250,251,33,0,36,0,39,0,44,0,1,0,249,254,248,254,1,0,247,254,246,254,2,0,245,253,244,253,243,253,242,253,4,0,241,251,240,251,239,251,238,251,237,251,236,251,235,251,234,251,233,251,232,251,231,251,230,251,229,251,228,251,227,251,226,251,3,0,0,253,255,252,254,252,253,252,252,252,251,252,250,252,249,252,4,0,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,255,253,255,253,255,253,255,253,254,252,254,252,253,251,17,0,3,0,252,254,252,254,252,254,252,254,251,253,251,253,250,252,249,252,6,0,224,249,224,249,223,249,225,249,222,249,226,249,221,249,227,249,220,249,228,249,219,249,229,249,218,249,230,249,217,249,231,249,216,249,232,249,215,249,233,249,214,249,234,249,213,249,235,249,212,249,236,249,211,249,237,249,210,249,238,249,209,249,239,249,208,249,240,249,207,249,241,249,206,249,242,249,205,249,243,249,204,249,244,249,203,249,245,249,202,249,246,249,201,249,247,249,200,249,248,249,199,249,249,249,198,249,250,249,197,249,251,249,196,249,252,249,195,249,253,249,194,249,254,249,193,249,255,249,5,0,224,252,224,252,224,252,224,252,223,252,223,252,223,252,223,252,225,252,225,252,225,252,225,252,222,251,222,251,226,251,226,251,221,251,221,251,227,251,227,251,33,0,36,0,39,0,42,0,45,0,50,0,55,0,60,0,65,0,74,0,83,0,92,0,1,0,220,254,228,254,1,0,219,254,229,254,1,0,218,254,230,254,1,0,217,254,231,254,2,0,216,253,232,253,215,253,233,253,2,0,214,253,234,253,213,253,235,253,2,0,212,253,236,253,211,253,237,253,2,0,210,253,238,253,209,253,239,253,3,0,208,252,240,252,207,252,241,252,206,252,242,252,205,252,243,252,3,0,204,252,244,252,203,252,245,252,202,252,246,252,201,252,247,252,3,0,200,252,248,252,199,252,249,252,198,252,250,252,197,252,251,252,3,0,196,252,252,252,195,252,253,252,194,252,254,252,193,252,255,252,0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,0,3,1,2,0,1,2,3,4,8,0,0,0,0,0,0,0,1,2,3,4,5,8,9,0,0,0,0,0,1,2,3,4,6,8,10,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,6,8,8,12,116,104,101,111,114,97,0,0,0,0,2,3,0,0,3,0,0,0,0,0,1,1,1,1,2,3,1,1,1,2,1,1,1,1,1,3,1,2,3,15,16,17,88,80,1,0,48,14,56,57,58,59,60,62,64,66,68,72,2,4,6,8,18,20,22,24,26,32,12,28,40,3,4,2,0,1,5,6,7,3,4,0,2,1,5,6,7,3,2,4,0,1,5,6,7,3,2,0,4,1,5,6,7,0,3,4,2,1,5,6,7,0,5,3,4,2,1,6,7,0,1,2,3,4,5,6,7,12,4,3,3,4,4,5,5,8,8,8,8,3,3,6,1,6,15,28,64,24,32,1,0,241,241,242,242,243,243,244,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,252,252,253,253,254,254,255,255,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,0,249,249,249,249,250,250,250,250,251,251,251,251,252,252,252,252,253,253,253,253,254,254,254,254,255,255,255,255,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_i64Subtract\"]=_i64Subtract;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;Module[\"_i64Add\"]=_i64Add;Module[\"_memset\"]=_memset;function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _abort(){Module[\"abort\"]()}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}function _ogvjs_callback_init_video(frameWidth,frameHeight,chromaWidth,chromaHeight,fps,picWidth,picHeight,picX,picY,displayWidth,displayHeight){Module.videoFormat={width:frameWidth,height:frameHeight,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:picX,cropTop:picY,cropWidth:picWidth,cropHeight:picHeight,displayWidth:displayWidth,displayHeight:displayHeight,fps:fps};Module.loadedMetadata=true}DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_vii\":invoke_vii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_ogvjs_callback_init_video\":_ogvjs_callback_init_video,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;var C=0;var D=global.Math.floor;var E=global.Math.abs;var F=global.Math.sqrt;var G=global.Math.pow;var H=global.Math.cos;var I=global.Math.sin;var J=global.Math.tan;var K=global.Math.acos;var L=global.Math.asin;var M=global.Math.atan;var N=global.Math.atan2;var O=global.Math.exp;var P=global.Math.log;var Q=global.Math.ceil;var R=global.Math.imul;var S=global.Math.min;var T=global.Math.max;var U=global.Math.clz32;var V=env.abort;var W=env.assert;var X=env.enlargeMemory;var Y=env.getTotalMemory;var Z=env.abortOnCannotGrowMemory;var _=env.invoke_vii;var $=env.invoke_viiii;var aa=env._ogvjs_callback_frame;var ba=env.___setErrNo;var ca=env._abort;var da=env._emscripten_memcpy_big;var ea=env._ogvjs_callback_init_video;var fa=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction ia(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function ja(){return l|0}function ka(a){a=a|0;l=a}function la(a,b){a=a|0;b=b|0;l=a;m=b}function ma(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function na(a){a=a|0;C=a}function oa(){return C|0}function pa(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=b[c>>1]|0;e=b[c+2>>1]|0;f=b[c+4>>1]|0;g=b[c+6>>1]|0;c=((e&65535)<<24>>24)+((d&65535)<<24>>24)+((f&65535)<<24>>24)+((g&65535)<<24>>24)|0;h=(e<<16>>16>>8)+(d<<16>>16>>8)+(f<<16>>16>>8)+(g<<16>>16>>8)|0;b[a>>1]=(c+2+(c>>31)|0)>>>2&255|(h+2+(h>>31)|0)>>>2<<8;return}function qa(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=b[c>>1]|0;e=b[c+4>>1]|0;f=((e&65535)<<24>>24)+((d&65535)<<24>>24)|0;g=(e<<16>>16>>8)+(d<<16>>16>>8)|0;b[a>>1]=(f+1+(f>>31)|0)>>>1&255|(g+1+(g>>31)|0)>>>1<<8;g=b[c+2>>1]|0;f=b[c+6>>1]|0;c=((f&65535)<<24>>24)+((g&65535)<<24>>24)|0;d=(f<<16>>16>>8)+(g<<16>>16>>8)|0;b[a+2>>1]=(c+1+(c>>31)|0)>>>1&255|(d+1+(d>>31)|0)>>>1<<8;return}function ra(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=b[c>>1]|0;e=b[c+2>>1]|0;f=((e&65535)<<24>>24)+((d&65535)<<24>>24)|0;g=(e<<16>>16>>8)+(d<<16>>16>>8)|0;b[a>>1]=(f+1+(f>>31)|0)>>>1&255|(g+1+(g>>31)|0)>>>1<<8;g=b[c+4>>1]|0;f=b[c+6>>1]|0;c=((f&65535)<<24>>24)+((g&65535)<<24>>24)|0;d=(f<<16>>16>>8)+(g<<16>>16>>8)|0;b[a+4>>1]=(c+1+(c>>31)|0)>>>1&255|(d+1+(d>>31)|0)>>>1<<8;return}function sa(a,c){a=a|0;c=c|0;b[a>>1]=b[c>>1]|0;b[a+2>>1]=b[c+2>>1]|0;b[a+4>>1]=b[c+4>>1]|0;b[a+6>>1]=b[c+6>>1]|0;return}function ta(a){a=a|0;var b=0,c=0,d=0;if(!a){b=0;return b|0}else{c=a;d=0}while(1){c=c>>>1;a=d+1|0;if(!c){b=a;break}else d=a}return b|0}function ua(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function va(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if(!a)return;b=a+8|0;d=c[a>>2]|0;if((c[b>>2]|0)>0){e=d;f=0;while(1){Ab(c[e+(f<<2)>>2]|0);f=f+1|0;g=c[a>>2]|0;if((f|0)>=(c[b>>2]|0)){h=g;break}else e=g}}else h=d;Ab(h);Ab(c[a+4>>2]|0);Ab(c[a+12>>2]|0);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function wa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+8|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[a+4>>2]=b;c[a>>2]=b+d;return}function xa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=a+8|0;f=a+12|0;g=c[f>>2]|0;if(!b){h=0;return h|0}i=c[e>>2]|0;if((g|0)<(b|0)){j=c[a>>2]|0;k=a+4|0;l=c[k>>2]|0;m=32-g|0;n=l>>>0<j>>>0;if(m>>>0>7&n){o=l;p=m;q=i;while(1){r=p+-8|0;s=o+1|0;t=(d[o>>0]|0)<<r|q;u=s>>>0<j>>>0;if(r>>>0>7&u){o=s;p=r;q=t}else{v=u;w=s;x=r;y=t;break}}}else{v=n;w=l;x=m;y=i}c[k>>2]=w;k=32-x|0;do if((k|0)<(b|0))if(v){z=k;A=(d[w>>0]|0)>>>(k&7)|y;break}else{c[a+16>>2]=1;z=1073741824;A=y;break}else{z=k;A=y}while(0);c[f>>2]=z;B=z;C=A}else{B=g;C=i}c[e>>2]=C<<1<<b+-1;c[f>>2]=B-b;h=C>>>(32-b|0);return h|0}function ya(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=a+8|0;e=c[b>>2]|0;f=a+12|0;g=c[f>>2]|0;if((g|0)>=1){h=g;i=e;j=i>>>31;k=h+-1|0;l=i<<1;c[b>>2]=l;c[f>>2]=k;return j|0}m=c[a>>2]|0;n=a+4|0;o=c[n>>2]|0;p=32-g|0;g=o>>>0<m>>>0;if(p>>>0>7&g){q=o;r=p;s=e;while(1){t=r+-8|0;u=q+1|0;v=(d[q>>0]|0)<<t|s;w=u>>>0<m>>>0;if(t>>>0>7&w){q=u;r=t;s=v}else{x=w;y=u;z=t;A=v;break}}}else{x=g;y=o;z=p;A=e}c[n>>2]=y;n=32-z|0;do if((n|0)<1)if(x){B=n;C=(d[y>>0]|0)>>>(n&7)|A;break}else{c[a+16>>2]=1;B=1073741824;C=A;break}else{B=n;C=A}while(0);c[f>>2]=B;h=B;i=C;j=i>>>31;k=h+-1|0;l=i<<1;c[b>>2]=l;c[f>>2]=k;return j|0}function za(a){a=a|0;var b=0;if(c[a+16>>2]|0){b=-1;return b|0}b=(c[a>>2]|0)-(c[a+4>>2]|0)+(c[a+12>>2]>>3)|0;return b|0}function Aa(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((a|0)==0|(b|0)==0){d=0;return d|0}f=Ga(57136,16)|0;do if(f|0?(Ha(f,a,3)|0)>=0:0){g=f+51656|0;if((Ia(g,b)|0)<0){Da(f);break}h=zb((c[f+180>>2]|0)*129|0)|0;c[f+53512>>2]=h;if(!h){Ca(g);Da(f);break}else i=0;do{c[f+880+(i*24|0)>>2]=f+2416+(i*768|0);c[f+880+(i*24|0)+4>>2]=f+2416+(i*768|0)+128;c[f+880+(i*24|0)+8>>2]=f+2416+(i*768|0)+256;c[f+880+(i*24|0)+12>>2]=f+2416+(i*768|0)+384;c[f+880+(i*24|0)+16>>2]=f+2416+(i*768|0)+512;c[f+880+(i*24|0)+20>>2]=f+2416+(i*768|0)+640;i=i+1|0}while((i|0)!=64);Ja(f+880|0,f+53528|0,b+320|0);g=0;do{h=c[f+880+(g*24|0)>>2]|0;j=c[f+880+(g*24|0)+8>>2]|0;k=c[f+880+(g*24|0)+16>>2]|0;l=c[f+880+(g*24|0)+4>>2]|0;m=c[f+880+(g*24|0)+12>>2]|0;n=c[f+880+(g*24|0)+20>>2]|0;c[f+53784+(g<<2)>>2]=0-((e[j+34>>1]|0)+(e[j+24>>1]|0)+(e[j+36>>1]|0)+(e[j+48>>1]|0)+(e[k+24>>1]|0)+(e[k+34>>1]|0)+(e[k+36>>1]|0)+(e[k+48>>1]|0)+(e[m+24>>1]|0)+(e[m+34>>1]|0)+((e[h+34>>1]|0)+(e[h+24>>1]|0)+(e[h+36>>1]|0)+(e[h+48>>1]|0)+(e[l+24>>1]|0)+(e[l+34>>1]|0)+(e[l+36>>1]|0)+(e[l+48>>1]|0)<<1)+(e[m+36>>1]|0)+(e[m+48>>1]|0)+(e[n+24>>1]|0)+(e[n+34>>1]|0)+(e[n+36>>1]|0)+(e[n+48>>1]|0)>>11);g=g+1|0}while((g|0)!=64);g=f+51568|0;n=b+576|0;m=g+64|0;do{c[g>>2]=c[n>>2];g=g+4|0;n=n+4|0}while((g|0)<(m|0));c[f+53524>>2]=0;c[f+54040>>2]=0;c[f+54044>>2]=0;c[f+54048>>2]=0;c[f+54104>>2]=0;c[f+54108>>2]=0;n=f+856|0;c[n>>2]=0;c[n+4>>2]=0;d=f;return d|0}while(0);Ea(f);d=0;return d|0}function Ba(a){a=a|0;if(!a)return;Ab(c[a+54048>>2]|0);Ab(c[a+54044>>2]|0);Ab(c[a+54040>>2]|0);Ab(c[a+53512>>2]|0);Ca(a+51656|0);Da(a);Ea(a);return}function Ca(a){a=a|0;var b=0;b=0;do{Ab(c[a+(b<<2)>>2]|0);b=b+1|0}while((b|0)!=80);return}function Da(a){a=a|0;Ab(c[a+172>>2]|0);Ea(c[a+572>>2]|0);Ab(c[a+216>>2]|0);Ab(c[a+200>>2]|0);Ab(c[a+196>>2]|0);Ab(c[a+188>>2]|0);Ab(c[a+184>>2]|0);Ab(c[a+176>>2]|0);Ab(c[a+168>>2]|0);return}function Ea(a){a=a|0;var b=0;if(!a)return;b=a+-1|0;Ab(b+(0-(d[b>>0]|0))|0);return}function Fa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=5;d=6;while(1){e=(b|0)/3|0;f=(b|0)%3|0;if((d|0)!=1){g=d+-2|0;h=(g|0)/3|0;i=(g|0)%3|0;g=a+320+(e*36|0)+(f*12|0)+4|0;if((c[g>>2]|0)==(c[a+320+(h*36|0)+(i*12|0)+4>>2]|0))c[g>>2]=0;g=a+320+(e*36|0)+(f*12|0)+8|0;if((c[g>>2]|0)==(c[a+320+(h*36|0)+(i*12|0)+8>>2]|0))c[g>>2]=0}if((b|0)>2){g=a+356+(f*12|0)+4|0;if((c[g>>2]|0)==(c[a+320+(f*12|0)+4>>2]|0))c[g>>2]=0;g=a+356+(f*12|0)+8|0;if((c[g>>2]|0)==(c[a+320+(f*12|0)+8>>2]|0))c[g>>2]=0}Ab(c[a+320+(e*36|0)+(f*12|0)+4>>2]|0);Ab(c[a+320+(e*36|0)+(f*12|0)+8>>2]|0);if((b|0)>0){f=b;b=b+-1|0;d=f}else break}return}function Ga(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=c+-1|0;if(b>>>0>~c>>>0|(d&(c|-256)|0)!=0){e=0;return e|0}f=zb(c+b|0)|0;b=f+-1&d;if(!f){e=0;return e|0}a[f+b>>0]=b;e=f+(b+1)|0;return e|0}function Ha(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Fa=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,Cb=0,Db=0,Eb=0,Fb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0;if(!e){g=-1;return g|0}h=c[e+4>>2]|0;if(h&15|0){g=-10;return g|0}i=e+8|0;j=c[i>>2]|0;if((j+-1|0)>>>0>1048574|((h+-1|0)>>>0>1048574|(j&15|0)!=0)){g=-10;return g|0}k=c[e+20>>2]|0;if(((c[e+12>>2]|0)+k|0)>>>0>h>>>0){g=-10;return g|0}h=e+24|0;l=c[h>>2]|0;m=e+16|0;n=c[m>>2]|0;if(k>>>0>255|(n+l|0)>>>0>j>>>0){g=-10;return g|0}if((j-l-n|0)>>>0>255){g=-10;return g|0}if((c[e+44>>2]|0)>>>0>2){g=-10;return g|0}if((c[e+48>>2]|0)>>>0>3){g=-10;return g|0}if(!(c[e+28>>2]|0)){g=-10;return g|0}if(!(c[e+32>>2]|0)){g=-10;return g|0}Gb(b+64|0,0,51568)|0;n=b;l=e;j=n+64|0;do{c[n>>2]=c[l>>2];n=n+4|0;l=l+4|0}while((n|0)<(j|0));k=b+24|0;c[k>>2]=(c[i>>2]|0)-(c[m>>2]|0)-(c[h>>2]|0);a[b+872>>0]=-1;c[b+68>>2]=0;c[b+64>>2]=1364;h=b+4|0;m=(c[h>>2]|0)>>>3;i=b+8|0;o=(c[i>>2]|0)>>>3;p=b+48|0;q=c[p>>2]|0;r=q&1^1;s=q>>>1&1^1;q=(r+m|0)>>>r;r=(s+o|0)>>>s;s=R(o,m)|0;t=R(r,q)|0;u=t<<1;v=u+s|0;w=(m+3|0)>>>2;x=(o+3|0)>>>2;y=(q+3|0)>>>2;z=(r+3|0)>>>2;A=R(x,w)|0;B=R(z,y)|0;C=B<<1;D=C+A|0;E=A<<2;do if((u|0)>=(t|0)?(A&1073741823|0)==(A|0)&((D>>>0<A>>>0|(C>>>0<B>>>0?1:((A>>>0)/(w>>>0)|0|0)!=(x|0)))^1):0){F=b+72|0;c[F>>2]=m;G=b+76|0;c[G>>2]=o;H=b+80|0;c[H>>2]=0;I=b+84|0;c[I>>2]=s;c[b+88>>2]=w;c[b+92>>2]=x;c[b+96>>2]=0;c[b+100>>2]=A;J=b+136|0;c[J>>2]=q;K=b+104|0;c[K>>2]=q;c[b+140>>2]=r;c[b+108>>2]=r;L=b+112|0;c[L>>2]=s;M=b+144|0;c[M>>2]=t+s;N=b+148|0;c[N>>2]=t;O=b+116|0;c[O>>2]=t;c[b+152>>2]=y;c[b+120>>2]=y;c[b+156>>2]=z;c[b+124>>2]=z;c[b+128>>2]=A;c[b+160>>2]=B+A;c[b+164>>2]=B;c[b+132>>2]=B;P=b+180|0;c[P>>2]=v;Q=Bb(v,4)|0;S=b+168|0;c[S>>2]=Q;T=zb(v<<1)|0;c[b+176>>2]=T;c[b+192>>2]=D;U=zb(D<<6)|0;V=b+184|0;c[V>>2]=U;W=Bb(D,1)|0;X=b+188|0;c[X>>2]=W;c[b+204>>2]=w<<1;c[b+208>>2]=x<<1;c[b+212>>2]=E;Y=Bb(E,48)|0;Z=b+196|0;c[Z>>2]=Y;_=Bb(E,1)|0;$=b+200|0;c[$>>2]=_;aa=zb(v<<2)|0;c[b+216>>2]=aa;if(!((Q|0)==0|(T|0)==0|(U|0)==0|(W|0)==0|(Y|0)==0)?!((_|0)==0|(aa|0)==0):0){aa=U;U=0;_=W;W=o;Y=0;T=0;while(1){Q=aa+(U<<6)|0;ba=_+U|0;ca=c[b+72+(T<<5)>>2]|0;da=ca<<2;ea=0;fa=0;ga=Y;while(1){ia=W-fa|0;if((ia|0)<=4)if((ia|0)<1)break;else ja=ia;else ja=4;ia=ea;ka=0;while(1){la=ca-ka|0;if((la|0)<=4)if((la|0)<1)break;else ma=la;else ma=4;n=Q+(ia<<6)|0;j=n+64|0;do{c[n>>2]=-1;n=n+4|0}while((n|0)<(j|0));la=0;na=ka+ga|0;while(1){oa=0;do{c[Q+(ia<<6)+(c[40+(la<<5)+(oa<<3)>>2]<<4)+(c[40+(la<<5)+(oa<<3)+4>>2]<<2)>>2]=oa+na;oa=oa+1|0}while((oa|0)<(ma|0));la=la+1|0;if((la|0)>=(ja|0))break;else na=na+ca|0}na=ba+ia|0;la=a[na>>0]|0;oa=la&-61;pa=(((la&255)>>>2&255|(c[Q+(ia<<6)>>2]|0)>>>31^1)&255)<<2&60|oa;a[na>>0]=pa;la=(((pa&255)>>>2&255|(c[Q+(ia<<6)+16>>2]|0)>>>31<<1^2)&255)<<2&60|oa;a[na>>0]=la;pa=(((la&255)>>>2&255|(c[Q+(ia<<6)+32>>2]|0)>>>31<<2^4)&255)<<2&60|oa;a[na>>0]=pa;a[na>>0]=(((pa&255)>>>2&255|(c[Q+(ia<<6)+56>>2]|0)>>>31<<3^8)&255)<<2&60|oa;ia=ia+1|0;ka=ka+4|0}ea=ia;fa=fa+4|0;ga=ga+da|0}da=T+1|0;if((da|0)==3)break;aa=c[V>>2]|0;U=c[b+72+(da<<5)+24>>2]|0;_=c[X>>2]|0;W=c[b+72+(da<<5)+4>>2]|0;Y=c[b+72+(da<<5)+8>>2]|0;T=da}T=c[Z>>2]|0;Y=c[$>>2]|0;W=c[168+(c[p>>2]<<2)>>2]|0;X=c[G>>2]|0;if((X|0)>0){_=X;X=c[F>>2]|0;U=0;V=0;while(1){if((X|0)>0){aa=U;da=0;do{ga=aa<<2;fa=da|1;ea=da|2;Q=da|3;ba=0;do{ca=ba<<1|V;ka=ca|1;oa=d[1492+(ba<<1)>>0]|ga;pa=T+(oa*48|0)|0;n=pa;j=n+48|0;do{c[n>>2]=-1;n=n+4|0}while((n|0)<(j|0));na=c[F>>2]|0;do if((da|0)<(na|0)){if((ca|0)>=(c[G>>2]|0)){qa=36;break}c[pa>>2]=(R(na,ca)|0)+da;c[T+(oa*48|0)+4>>2]=(R(c[F>>2]|0,ca)|0)+fa;c[T+(oa*48|0)+8>>2]=(R(c[F>>2]|0,ka)|0)+da;c[T+(oa*48|0)+12>>2]=(R(c[F>>2]|0,ka)|0)+fa;ha[W&7](pa,F,da,ca)}else qa=36;while(0);if((qa|0)==36){qa=0;a[Y+oa>>0]=-1}pa=d[1492+(ba<<1)+1>>0]|ga;na=T+(pa*48|0)|0;n=na;j=n+48|0;do{c[n>>2]=-1;n=n+4|0}while((n|0)<(j|0));oa=c[F>>2]|0;do if((ea|0)<(oa|0)){if((ca|0)>=(c[G>>2]|0)){qa=43;break}c[na>>2]=(R(oa,ca)|0)+ea;c[T+(pa*48|0)+4>>2]=(R(c[F>>2]|0,ca)|0)+Q;c[T+(pa*48|0)+8>>2]=(R(c[F>>2]|0,ka)|0)+ea;c[T+(pa*48|0)+12>>2]=(R(c[F>>2]|0,ka)|0)+Q;ha[W&7](na,F,ea,ca)}else qa=43;while(0);if((qa|0)==43){qa=0;a[Y+pa>>0]=-1}ba=ba+1|0}while((ba|0)!=2);da=da+4|0;aa=aa+1|0;ra=c[F>>2]|0}while((da|0)<(ra|0));sa=ra;ta=c[G>>2]|0;ua=aa}else{sa=X;ta=_;ua=U}V=V+4|0;if((V|0)>=(ta|0))break;else{_=ta;X=sa;U=ua}}}U=b+588|0;c[U>>2]=0;X=c[S>>2]|0;_=b+20|0;V=b+12|0;G=b+16|0;F=X;Y=0;W=X;while(1){X=c[_>>2]|0;T=(c[V>>2]|0)+X|0;$=c[k>>2]|0;Z=(c[G>>2]|0)+$|0;if((Y|0)>0){da=c[p>>2]|0;ba=da&1;ea=da&2;va=X>>(ba^1);wa=(ba|0)==0?T+1>>1:T;xa=$>>(ea>>>1^1);ya=(ea|0)==0?Z+1>>1:Z}else{va=X;wa=T;xa=$;ya=Z}W=W+(c[b+72+(Y<<5)+12>>2]<<2)|0;if(F>>>0<W>>>0){Z=b+72+(Y<<5)|0;$=(va|0)<(wa|0);T=(xa|0)<(ya|0);X=F;ea=0;while(1){ba=c[Z>>2]|0;da=X+(ba<<2)|0;Q=ea;ea=ea+8|0;do if((ba|0)>0){ga=(ea|0)>(xa|0);fa=(ya|0)>(Q|0);ia=(Q|0)<(xa|0)&ga;ca=fa&(ya|0)<(ea|0);na=X+4|0;ka=((da>>>0>na>>>0?da:na)+-1+(0-X)|0)>>>2;if(!(T&($&(fa&ga)))){ga=X;do{c[ga>>2]=c[ga>>2]|2;ga=ga+4|0}while(ga>>>0<da>>>0);za=na+(ka<<2)|0;break}ga=(Q|0)<(xa|0);pa=Q|1;fa=(pa|0)>=(xa|0)&(pa|0)<(ya|0);pa=Q|2;oa=(pa|0)>=(xa|0)&(pa|0)<(ya|0);pa=Q|3;la=(pa|0)>=(xa|0)&(pa|0)<(ya|0);pa=Q|4;Aa=(pa|0)>=(xa|0)&(pa|0)<(ya|0);pa=Q|5;Ba=(pa|0)>=(xa|0)&(pa|0)<(ya|0);pa=Q|6;Ca=(pa|0)>=(xa|0)&(pa|0)<(ya|0);pa=Q|7;Da=(pa|0)>=(xa|0)&(pa|0)<(ya|0);pa=(Q|0)<(xa|0);Fa=Q|1;Ha=(Fa|0)>=(xa|0)&(Fa|0)<(ya|0);Fa=Q|2;Ia=(Fa|0)>=(xa|0)&(Fa|0)<(ya|0);Fa=Q|3;Ja=(Fa|0)>=(xa|0)&(Fa|0)<(ya|0);Fa=Q|4;Ka=(Fa|0)>=(xa|0)&(Fa|0)<(ya|0);Fa=Q|5;Ma=(Fa|0)>=(xa|0)&(Fa|0)<(ya|0);Fa=Q|6;Na=(Fa|0)>=(xa|0)&(Fa|0)<(ya|0);Fa=Q|7;Oa=(Fa|0)>=(xa|0)&(Fa|0)<(ya|0);Fa=X;Pa=0;do{Qa=Pa;Pa=Pa+8|0;do if((wa|0)>(Qa|0)&(Pa|0)>(va|0)){Ra=(Qa|0)<(va|0);if(!(ca|(ia|(Ra|(wa|0)<(Pa|0))))){Sa=Fa;Ta=c[Fa>>2]|63488;break}Ua=Qa|1;Va=(Ua|0)>=(va|0)&(Ua|0)<(wa|0);Ua=Qa|2;Wa=(Ua|0)>=(va|0)&(Ua|0)<(wa|0);Ua=Qa|3;Xa=(Ua|0)>=(va|0)&(Ua|0)<(wa|0);Ua=Qa|4;Ya=(Ua|0)>=(va|0)&(Ua|0)<(wa|0);Ua=Qa|5;Za=(Ua|0)>=(va|0)&(Ua|0)<(wa|0);Ua=Qa|6;_a=(Ua|0)>=(va|0)&(Ua|0)<(wa|0);Ua=Qa|7;$a=(Ua|0)>=(va|0)&(Ua|0)<(wa|0);Ua=(Va&1)+((Ra^1)&1)+(Wa&1)+(Xa&1)+(Ya&1)+(Za&1)+(_a&1)+($a&1)|0;do if(Ra){if(ga){ab=0;bb=0;cb=0}else{db=Va?2:0;eb=Wa?4:0;fb=db|eb;eb=Xa?8:0;db=fb|eb;eb=Ya?16:0;fb=db|eb;eb=Za?32:0;db=fb|eb;eb=_a?64:0;ab=db|eb|($a?128:0);bb=$a?0:0;cb=Ua}if(fa){eb=Va?512:0;db=eb|ab;eb=Wa?1024:0;fb=db|eb;eb=Xa?2048:0;db=fb|eb;eb=Ya?4096:0;fb=db|eb;eb=Za?8192:0;db=fb|eb;eb=_a?16384:0;fb=db|eb;eb=$a?32768:0;gb=fb|eb;hb=bb;ib=Ua+cb|0}else{gb=ab;hb=bb;ib=cb}if(oa){eb=Va?131072:0;fb=eb|gb;eb=Wa?262144:0;db=fb|eb;eb=Xa?524288:0;fb=db|eb;eb=Ya?1048576:0;db=fb|eb;eb=Za?2097152:0;fb=db|eb;eb=_a?4194304:0;db=fb|eb;eb=$a?8388608:0;jb=db|eb;kb=hb;lb=Ua+ib|0}else{jb=gb;kb=hb;lb=ib}if(la){eb=Va?33554432:0;db=eb|jb;eb=Wa?67108864:0;fb=db|eb;eb=Xa?134217728:0;db=fb|eb;eb=Ya?268435456:0;fb=db|eb;eb=Za?536870912:0;db=fb|eb;eb=_a?1073741824:0;fb=db|eb;eb=$a?-2147483648:0;mb=kb;nb=fb|eb;ob=Ua+lb|0}else{mb=kb;nb=jb;ob=lb}if(Aa){eb=(Va?2:0)|mb;fb=eb|(Wa?4:0);eb=fb|(Xa?8:0);fb=eb|(Ya?16:0);eb=fb|(Za?32:0);fb=eb|(_a?64:0);pb=fb|($a?128:0);qb=nb;rb=Ua+ob|0}else{pb=mb;qb=nb;rb=ob}if(Ba){fb=(Va?512:0)|pb;eb=fb|(Wa?1024:0);fb=eb|(Xa?2048:0);eb=fb|(Ya?4096:0);fb=eb|(Za?8192:0);eb=fb|(_a?16384:0);sb=eb|($a?32768:0);tb=qb;ub=Ua+rb|0}else{sb=pb;tb=qb;ub=rb}if(Ca){eb=(Va?131072:0)|sb;fb=eb|(Wa?262144:0);eb=fb|(Xa?524288:0);fb=eb|(Ya?1048576:0);eb=fb|(Za?2097152:0);fb=eb|(_a?4194304:0);vb=fb|($a?8388608:0);wb=tb;xb=Ua+ub|0}else{vb=sb;wb=tb;xb=ub}if(!Da){yb=wb;Cb=vb;Db=xb;break}fb=(Va?33554432:0)|vb;eb=fb|(Wa?67108864:0);fb=eb|(Xa?134217728:0);eb=fb|(Ya?268435456:0);fb=eb|(Za?536870912:0);eb=fb|(_a?1073741824:0);yb=wb;Cb=eb|($a?-2147483648:0);Db=Ua+xb|0}else{if(pa){Eb=0;Fb=0;Hb=0}else{eb=Va?3:1;fb=Wa?4:0;db=eb|fb;fb=Xa?8:0;eb=db|fb;fb=Ya?16:0;db=eb|fb;fb=Za?32:0;eb=db|fb;fb=_a?64:0;Eb=eb|fb|($a?128:0);Fb=$a?0:0;Hb=Ua}if(Ha){fb=Va?512:0;eb=Eb|fb;fb=Wa?1024:0;db=eb|fb;fb=Xa?2048:0;eb=db|fb;fb=Ya?4096:0;db=eb|fb;fb=Za?8192:0;eb=db|fb;fb=_a?16384:0;db=eb|fb;fb=$a?32768:0;Ib=db|fb|256;Jb=Fb;Kb=Ua+Hb|0}else{Ib=Eb;Jb=Fb;Kb=Hb}if(Ia){fb=Va?131072:0;db=Ib|fb;fb=Wa?262144:0;eb=db|fb;fb=Xa?524288:0;db=eb|fb;fb=Ya?1048576:0;eb=db|fb;fb=Za?2097152:0;db=eb|fb;fb=_a?4194304:0;eb=db|fb;fb=$a?8388608:0;Lb=eb|fb|65536;Mb=Jb;Nb=Ua+Kb|0}else{Lb=Ib;Mb=Jb;Nb=Kb}if(Ja){fb=Va?33554432:0;eb=Lb|fb;fb=Wa?67108864:0;db=eb|fb;fb=Xa?134217728:0;eb=db|fb;fb=Ya?268435456:0;db=eb|fb;fb=Za?536870912:0;eb=db|fb;fb=_a?1073741824:0;db=eb|fb;fb=$a?-2147483648:0;Ob=Mb;Pb=db|fb|16777216;Qb=Ua+Nb|0}else{Ob=Mb;Pb=Lb;Qb=Nb}if(Ka){fb=Ob|(Va?2:0);db=fb|(Wa?4:0);fb=db|(Xa?8:0);db=fb|(Ya?16:0);fb=db|(Za?32:0);db=fb|(_a?64:0);Rb=db|($a?128:0)|1;Sb=Pb;Tb=Ua+Qb|0}else{Rb=Ob;Sb=Pb;Tb=Qb}if(Ma){db=Rb|(Va?512:0);fb=db|(Wa?1024:0);db=fb|(Xa?2048:0);fb=db|(Ya?4096:0);db=fb|(Za?8192:0);fb=db|(_a?16384:0);Ub=fb|($a?32768:0)|256;Vb=Sb;Wb=Ua+Tb|0}else{Ub=Rb;Vb=Sb;Wb=Tb}if(Na){fb=Ub|(Va?131072:0);db=fb|(Wa?262144:0);fb=db|(Xa?524288:0);db=fb|(Ya?1048576:0);fb=db|(Za?2097152:0);db=fb|(_a?4194304:0);Xb=db|($a?8388608:0)|65536;Yb=Vb;Zb=Ua+Wb|0}else{Xb=Ub;Yb=Vb;Zb=Wb}if(!Oa){yb=Yb;Cb=Xb;Db=Zb;break}db=Xb|(Va?33554432:0);fb=db|(Wa?67108864:0);db=fb|(Xa?134217728:0);fb=db|(Ya?268435456:0);db=fb|(Za?536870912:0);fb=db|(_a?1073741824:0);yb=Yb;Cb=fb|($a?-2147483648:0)|16777216;Db=Ua+Zb|0}while(0);Ua=c[U>>2]|0;a:do if((Ua|0)>0){$a=0;while(1){_a=b+592+($a<<4)|0;if((c[_a>>2]|0)==(yb|0)?(c[_a+4>>2]|0)==(Cb|0):0){_b=$a;break a}_a=$a+1|0;if((_a|0)<(Ua|0))$a=_a;else{$b=_a;qa=63;break}}}else{$b=0;qa=63}while(0);if((qa|0)==63){qa=0;c[U>>2]=Ua+1;$a=b+592+($b<<4)|0;c[$a>>2]=yb;c[$a+4>>2]=Cb;c[b+592+($b<<4)+8>>2]=Db;_b=$b}Sa=Fa;Ta=c[Fa>>2]&-63489|_b<<11&63488}else{Sa=Fa;Ta=c[Fa>>2]|2}while(0);c[Sa>>2]=Ta;Fa=Fa+4|0}while(Fa>>>0<da>>>0);za=na+(ka<<2)|0}else za=X;while(0);if(za>>>0>=W>>>0){ac=za;break}else X=za}}else ac=F;Y=Y+1|0;if((Y|0)==3)break;else F=ac}if((f+-3|0)>>>0<=3){F=c[p>>2]|0;Y=F&1^1;W=F>>>1&1^1;F=c[h>>2]|0;U=F+32|0;G=(c[i>>2]|0)+32|0;V=(U>>Y)+15&-16;_=R(G,U)|0;S=R(V,G>>W)|0;X=(U<<4)+16|0;$=16>>>Y;T=R(V,16>>>W)|0|$;ea=0-$&8;$=S<<1;Z=_+16+$|0;aa=R(Z,f)|0;if(!(Z>>>0<_>>>0|(($|16)>>>0<S>>>0?1:((_>>>0)/(U>>>0)|0|0)!=(G|0)))?((aa>>>0)/(f>>>0)|0|0)==(Z|0):0){Z=Ga(aa,16)|0;aa=zb(c[P>>2]<<2)|0;c[b+172>>2]=aa;if((Z|0)==0|(aa|0)==0){Ab(aa);Ea(Z);bc=-1;break}G=c[h>>2]|0;$=b+236|0;c[$>>2]=G;da=c[i>>2]|0;c[b+240>>2]=da;Q=b+244|0;c[Q>>2]=U;U=G>>>Y;c[b+268>>2]=U;c[b+252>>2]=U;U=da>>>W;c[b+272>>2]=U;c[b+256>>2]=U;U=b+276|0;c[U>>2]=V;W=b+260|0;c[W>>2]=V;da=1;do{n=b+236+(da*48|0)|0;l=$;j=n+48|0;do{c[n>>2]=c[l>>2];n=n+4|0;l=l+4|0}while((n|0)<(j|0));da=da+1|0}while((da|0)!=(f|0));c[b+572>>2]=Z;if((f|0)>0){da=_+ea|0;$=16-ea+S|0;P=Z;Y=0;while(1){G=b+236+(Y*48|0)|0;c[b+236+(Y*48|0)+12>>2]=P+X;ba=P+da|0;c[b+236+(Y*48|0)+28>>2]=ba+T;Fa=ba+S|0;c[b+236+(Y*48|0)+44>>2]=Fa+T;La(G,G);Y=Y+1|0;if((Y|0)==(f|0))break;else P=Fa+$|0}}c[b+576>>2]=-32-F;$=0-V|0;c[b+584>>2]=$;c[b+580>>2]=$;$=c[b+248>>2]|0;P=(c[I>>2]|0)+(c[H>>2]|0)|0;Y=c[b+72>>2]|0;if((P|0)>0){T=c[Q>>2]<<3;if((Y|0)<=0)while(1){}Q=0;H=$;while(1){I=Q+Y|0;V=Q;F=H;while(1){c[aa+(V<<2)>>2]=F-$;V=V+1|0;if((V|0)>=(I|0))break;else F=F+8|0}if((V|0)<(P|0)){Q=V;H=H+T|0}else{cc=V;break}}}else cc=0;T=(c[O>>2]|0)+(c[L>>2]|0)|0;H=c[K>>2]|0;if((cc|0)<(T|0)){Q=c[W>>2]<<3;if((H|0)<=0)while(1){}W=cc;K=c[b+264>>2]|0;while(1){L=W+H|0;O=W;P=K;while(1){c[aa+(O<<2)>>2]=P-$;O=O+1|0;if((O|0)>=(L|0))break;else P=P+8|0}if((O|0)<(T|0)){W=O;K=K+Q|0}else{dc=O;break}}}else dc=cc;Q=(c[N>>2]|0)+(c[M>>2]|0)|0;K=c[J>>2]|0;if((dc|0)<(Q|0)){W=c[U>>2]<<3;if((K|0)<=0)while(1){}U=dc;J=c[b+280>>2]|0;while(1){M=U+K|0;N=U;T=J;while(1){c[aa+(N<<2)>>2]=T-$;N=N+1|0;if((N|0)>=(M|0))break;else T=T+8|0}if((N|0)<(Q|0)){U=N;J=J+W|0}else break}}W=b+524|0;c[W>>2]=-1;c[W+4>>2]=-1;c[W+8>>2]=-1;c[W+12>>2]=-1;c[W+16>>2]=-1;c[W+20>>2]=-1;W=b+548|0;c[W>>2]=0;c[W+4>>2]=0;c[W+8>>2]=0;c[W+12>>2]=0;c[W+16>>2]=0;c[W+20>>2]=0;if((c[e+60>>2]|0)>>>0>31)c[b+60>>2]=31;W=b+848|0;c[W>>2]=0;c[W+4>>2]=0;W=b+856|0;c[W>>2]=-1;c[W+4>>2]=-1;W=a[e>>0]|0;do if((W&255)>3)ec=1;else{if(W<<24>>24!=3){ec=0;break}J=a[e+1>>0]|0;if((J&255)>2){ec=1;break}if(J<<24>>24!=2){ec=0;break}ec=(a[e+2>>0]|0)!=0&1}while(0);a[b+873>>0]=ec;g=0;return g|0}else bc=-23}else bc=-10}else bc=-1}else bc=-23;while(0);Ab(c[b+216>>2]|0);Ab(c[b+200>>2]|0);Ab(c[b+196>>2]|0);Ab(c[b+188>>2]|0);Ab(c[b+184>>2]|0);Ab(c[b+176>>2]|0);Ab(c[b+168>>2]|0);g=bc;return g|0}function Ia(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=0;while(1){e=b+(d<<2)|0;f=(Ka(c[e>>2]|0,0)|0)<<1;g=zb(f)|0;c[a+(d<<2)>>2]=g;if(!g)break;Hb(g|0,c[e>>2]|0,f|0)|0;f=d+1|0;if((f|0)<80)d=f;else{h=0;i=6;break}}if((i|0)==6)return h|0;if((d|0)>0)j=d;else{h=-1;return h|0}do{d=j;j=j+-1|0;Ab(c[a+(j<<2)>>2]|0)}while((d|0)>1);h=-1;return h|0}function Ja(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;i=l;l=l+64|0;j=i;k=(g|0)==0;m=0;while(1){n=24+(m<<2)|0;o=32+(m<<2)|0;p=0;while(1){q=h+320+(m*36|0)+(p*12|0)|0;r=c[q>>2]|0;if((r|0)>=0){s=h+320+(m*36|0)+(p*12|0)+8|0;t=h+320+(m*36|0)+(p*12|0)+4|0;u=c[n>>2]|0;v=c[o>>2]|0;w=r;r=0;x=0;while(1){y=j;z=(c[s>>2]|0)+(x<<6)|0;A=y+64|0;do{a[y>>0]=a[z>>0]|0;y=y+1|0;z=z+1|0}while((y|0)<(A|0));if((x|0)==(w|0))B=r+1|0;else B=(c[(c[t>>2]|0)+(x<<2)>>2]|0)+r|0;z=x+1|0;y=r;a:while(1){A=R(d[j>>0]|0,e[h+(y<<1)>>1]|0)|0;if(!k)c[g+(y<<2)>>2]=(A>>>0)/160|0;C=A>>>0>102499?4096:((A>>>0)/100|0)<<2;A=f+(y*24|0)+(p<<3)+(m<<2)|0;D=c[A>>2]|0;b[D>>1]=u-(u>>>0<C>>>0?u-C|0:0);C=h+128+(y<<1)|0;E=1;do{F=R(d[j+(d[1364+E>>0]|0)>>0]|0,e[C>>1]|0)|0;G=F>>>0>102499?4096:((F>>>0)/100|0)<<2;b[D+(E<<1)>>1]=v-(v>>>0<G>>>0?v-G|0:0);E=E+1|0}while((E|0)!=64);H=0;b:while(1){E=(H|0)<(m|0);C=E?3:p;if((C|0)>0){G=0;do{I=c[f+(y*24|0)+(G<<3)+(H<<2)>>2]|0;if(!(yb(D,I,128)|0)){J=17;break b}G=G+1|0}while((G|0)<(C|0))}if(E)H=H+1|0;else break}if((J|0)==17){J=0;c[A>>2]=I}K=y+1|0;if((B|0)<=(K|0))break;D=B-K|0;C=c[s>>2]|0;G=K-r|0;F=c[(c[t>>2]|0)+(x<<2)>>2]|0;L=F<<1;M=0;while(1){N=R(d[C+(x<<6)+M>>0]|0,D)|0;a[j+M>>0]=(((R(d[C+(z<<6)+M>>0]|0,G)|0)+N<<1)+F|0)/(L|0)|0;N=M+1|0;if((N|0)==64){y=K;continue a}else M=N}}y=c[q>>2]|0;if((x|0)<(y|0)){w=y;r=K;x=z}else break}}p=p+1|0;if((p|0)==3)break}m=m+1|0;if((m|0)==2)break}l=i;return}function Ka(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=b[a+(c<<1)>>1]|0;e=1<<d;f=c+1|0;c=0;g=e+1|0;while(1){h=b[a+(f+c<<1)>>1]|0;i=h<<16>>16;if(h<<16>>16<1){j=1<<d-(0-i>>8);k=g}else{j=1;k=(Ka(a,i)|0)+g|0}c=j+c|0;if((c|0)>=(e|0))break;else g=k}return k|0}function La(a,b){a=a|0;b=b|0;var d=0,e=0;c[a>>2]=c[b>>2];d=c[b+4>>2]|0;c[a+4>>2]=d;e=0-(c[b+8>>2]|0)|0;c[a+8>>2]=e;c[a+12>>2]=(c[b+12>>2]|0)+(R(1-d|0,e)|0);c[a+16>>2]=c[b+16>>2];e=c[b+20>>2]|0;c[a+20>>2]=e;d=0-(c[b+24>>2]|0)|0;c[a+24>>2]=d;c[a+28>>2]=(c[b+28>>2]|0)+(R(1-e|0,d)|0);c[a+32>>2]=c[b+32>>2];d=c[b+36>>2]|0;c[a+36>>2]=d;e=0-(c[b+40>>2]|0)|0;c[a+40>>2]=e;c[a+44>>2]=(c[b+44>>2]|0)+(R(1-d|0,e)|0);return}function Ma(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=(R(c[b+32>>2]|0,e>>1)|0)+(d>>1)|0;c[a+16>>2]=f+(c[b+40>>2]|0);c[a+32>>2]=(c[b+72>>2]|0)+f;return}function Na(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=(R(c[b+32>>2]|0,e>>1)|0)+d|0;d=b+40|0;e=b+72|0;c[a+16>>2]=(c[d>>2]|0)+f;c[a+32>>2]=(c[e>>2]|0)+f;b=f+1|0;c[a+20>>2]=(c[d>>2]|0)+b;c[a+36>>2]=(c[e>>2]|0)+b;return}function Oa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=b+32|0;g=(R(c[f>>2]|0,e)|0)+(d>>1)|0;d=b+40|0;e=b+72|0;c[a+16>>2]=(c[d>>2]|0)+g;c[a+32>>2]=(c[e>>2]|0)+g;b=(c[f>>2]|0)+g|0;c[a+24>>2]=(c[d>>2]|0)+b;c[a+40>>2]=(c[e>>2]|0)+b;return}function Pa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=b+40|0;d=b+72|0;b=c[a>>2]|0;c[a+16>>2]=(c[e>>2]|0)+b;c[a+32>>2]=(c[d>>2]|0)+b;b=c[a+4>>2]|0;c[a+20>>2]=(c[e>>2]|0)+b;c[a+36>>2]=(c[d>>2]|0)+b;b=c[a+8>>2]|0;c[a+24>>2]=(c[e>>2]|0)+b;c[a+40>>2]=(c[d>>2]|0)+b;b=c[a+12>>2]|0;c[a+28>>2]=(c[e>>2]|0)+b;c[a+44>>2]=(c[d>>2]|0)+b;return}function Qa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=l;l=l+32|0;i=h+20|0;j=h;if(!g){k=-20;l=h;return k|0}if(!b){k=-1;l=h;return k|0}wa(j,c[g>>2]|0,c[g+4>>2]|0);m=xa(j,8)|0;if((((m&128|0)==0?(c[b+4>>2]|0)!=0:0)?(c[e+12>>2]|0)!=0:0)?(c[f>>2]|0)!=0:0)n=0;else o=7;a:do if((o|0)==7){a[i>>0]=xa(j,8)|0;a[i+1>>0]=xa(j,8)|0;a[i+2>>0]=xa(j,8)|0;a[i+3>>0]=xa(j,8)|0;a[i+4>>0]=xa(j,8)|0;a[i+5>>0]=xa(j,8)|0;if(!(yb(i,1548,6)|0))switch(m|0){case 128:{if(!(c[g+8>>2]|0)){n=-20;break a}p=b+4|0;if(c[p>>2]|0){n=-20;break a}a[b>>0]=xa(j,8)|0;q=b+1|0;a[q>>0]=xa(j,8)|0;a[b+2>>0]=xa(j,8)|0;r=a[b>>0]|0;do if((r&255)<=3){if(r<<24>>24==3?(d[q>>0]|0)>2:0){s=-22;break}c[p>>2]=(xa(j,16)|0)<<4;t=b+8|0;c[t>>2]=(xa(j,16)|0)<<4;u=b+12|0;c[u>>2]=xa(j,24)|0;v=b+16|0;c[v>>2]=xa(j,24)|0;w=b+20|0;c[w>>2]=xa(j,8)|0;x=b+24|0;c[x>>2]=xa(j,8)|0;y=b+28|0;c[y>>2]=xa(j,32)|0;z=xa(j,32)|0;c[b+32>>2]=z;A=c[p>>2]|0;if(((((((A|0)!=0?(B=c[t>>2]|0,(B|0)!=0):0)?((c[w>>2]|0)+(c[u>>2]|0)|0)>>>0<=A>>>0:0)?(A=c[v>>2]|0,v=c[x>>2]|0,(v+A|0)>>>0<=B>>>0):0)?!((z|0)==0|(c[y>>2]|0)==0):0)?(c[x>>2]=B-A-v,c[b+36>>2]=xa(j,24)|0,c[b+40>>2]=xa(j,24)|0,c[b+44>>2]=xa(j,8)|0,c[b+52>>2]=xa(j,24)|0,c[b+56>>2]=xa(j,6)|0,c[b+60>>2]=xa(j,5)|0,v=xa(j,2)|0,c[b+48>>2]=v,(v|0)!=1):0)?(xa(j,3)|0)==0:0){v=(za(j)|0)>>31&-20;if((v|0)<0)s=v;else{n=3;break a}}else s=-20}else s=-22;while(0);Ra(b);n=s;break a;break}case 129:{if(!e){n=-1;break a}if(!(c[b+4>>2]|0)){n=-20;break a}p=e+12|0;if(c[p>>2]|0){n=-20;break a}q=xa(j,8)|0;r=xa(j,8)|0;v=r<<8|q|(xa(j,8)|0)<<16|(xa(j,8)|0)<<24;b:do if((v|0)>=0?(v|0)<=(za(j)|0):0){q=zb(v+1|0)|0;c[p>>2]=q;if(!q)C=-1;else{if(!v)D=q;else{r=q;q=v;while(1){q=q+-1|0;a[r>>0]=xa(j,8)|0;if(!q)break;else r=r+1|0}D=c[p>>2]|0}a[D+v>>0]=0;r=xa(j,8)|0;q=xa(j,8)|0;A=xa(j,8)|0;B=q<<8|r|A<<16|(xa(j,8)|0)<<24;A=e+8|0;c[A>>2]=B;if(B>>>0<=536870911?(B<<2|0)<=(za(j)|0):0){B=c[A>>2]|0;r=B<<2;q=zb(r)|0;x=e+4|0;c[x>>2]=q;y=zb(r)|0;c[e>>2]=y;if((q|0)==0|(y|0)==0){c[A>>2]=0;C=-1;break}c:do if((B|0)>0){y=0;while(1){q=xa(j,8)|0;r=xa(j,8)|0;z=xa(j,8)|0;u=r<<8|q|z<<16|(xa(j,8)|0)<<24;if((u|0)<0){o=40;break}if((u|0)>(za(j)|0)){o=40;break}c[(c[x>>2]|0)+(y<<2)>>2]=u;z=zb(u+1|0)|0;c[(c[e>>2]|0)+(y<<2)>>2]=z;z=c[(c[e>>2]|0)+(y<<2)>>2]|0;if(!z){o=42;break}if(!u)E=z;else{q=z;z=u;while(1){z=z+-1|0;a[q>>0]=xa(j,8)|0;if(!z)break;else q=q+1|0}E=c[(c[e>>2]|0)+(y<<2)>>2]|0}a[E+u>>0]=0;q=y+1|0;if((q|0)<(c[A>>2]|0))y=q;else break c}if((o|0)==40){c[A>>2]=y;C=-20;break b}else if((o|0)==42){c[A>>2]=y;C=-1;break b}}while(0);x=(za(j)|0)>>31&-20;if((x|0)<0){C=x;break}else{n=2;break a}}c[A>>2]=0;C=-20}}else C=-20;while(0);va(e);n=C;break a;break}case 130:{if((e|0)==0|(f|0)==0){n=-1;break a}if(!(c[b+4>>2]|0)){n=-20;break a}if(!(c[e+12>>2]|0)){n=-20;break a}if(c[f>>2]|0){n=-20;break a}v=Bb(1,712)|0;if(!v){n=-1;break a}p=v+320|0;x=Sa(j,p)|0;if((x|0)>=0){B=Ta(j,v)|0;if((B|0)<0)F=B;else{c[f>>2]=v;n=1;break a}}else F=x;Fa(p);Ca(v);Ab(v);n=F;break a;break}default:{n=-20;break a}}else n=-21}while(0);k=n;l=h;return k|0}function Ra(a){a=a|0;var b=0;b=a;a=b+64|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function Sa(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;f=l;l=l+512|0;g=f+256|0;h=f;i=xa(d,3)|0;j=0;do{a[e+256+j>>0]=xa(d,i)|0;j=j+1|0}while((j|0)!=64);j=(xa(d,4)|0)+1|0;i=0;do{b[e+128+(i<<1)>>1]=xa(d,j)|0;i=i+1|0}while((i|0)!=64);i=(xa(d,4)|0)+1|0;j=0;do{b[e+(j<<1)>>1]=xa(d,i)|0;j=j+1|0}while((j|0)!=64);j=xa(d,9)|0;i=zb((j<<6)+64|0)|0;if(!i){k=-1;l=f;return k|0}if((j|0)>=0){m=0;while(1){n=0;do{a[i+(m<<6)+n>>0]=xa(d,8)|0;n=n+1|0}while((n|0)!=64);if((m|0)==(j|0))break;else m=m+1|0}}m=ta(j)|0;n=0;a:while(1){o=(n|0)/3|0;p=(n|0)%3|0;q=e+320+(o*36|0)+(p*12|0)|0;if((n|0)>0?(ya(d)|0)==0:0){do if((n|0)>2)if(!(ya(d)|0)){r=n+-1|0;s=(r|0)%3|0;t=(r|0)/3|0;break}else{s=p;t=o+-1|0;break}else{r=n+-1|0;s=(r|0)%3|0;t=(r|0)/3|0}while(0);r=e+320+(t*36|0)+(s*12|0)|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2]}else u=21;b:do if((u|0)==21){u=0;c[h>>2]=xa(d,m)|0;r=0;v=0;do{w=(xa(d,ta(62-v|0)|0)|0)+1|0;c[g+(r<<2)>>2]=w;v=w+v|0;x=xa(d,m)|0;r=r+1|0;c[h+(r<<2)>>2]=x}while((v|0)<63);if((v|0)!=63){u=24;break a}c[q>>2]=r;w=r<<2;y=zb(w)|0;c[e+320+(o*36|0)+(p*12|0)+4>>2]=y;if(!y){u=26;break a}Hb(y|0,g|0,w|0)|0;w=zb((r<<6)+64|0)|0;if(!w){u=28;break a}c[e+320+(o*36|0)+(p*12|0)+8>>2]=w;if((x|0)>(j|0)){u=30;break a}else{z=x;A=r}while(1){y=w+(A<<6)|0;B=i+(z<<6)|0;C=y+64|0;do{a[y>>0]=a[B>>0]|0;y=y+1|0;B=B+1|0}while((y|0)<(C|0));if((A|0)<=0)break b;A=A+-1|0;z=c[h+(A<<2)>>2]|0;if((z|0)>(j|0)){u=30;break a}}}while(0);n=n+1|0;if((n|0)>=6){u=34;break}}if((u|0)==24){Ab(i);k=-20;l=f;return k|0}else if((u|0)==26){Ab(i);k=-1;l=f;return k|0}else if((u|0)==28){Ab(i);k=-1;l=f;return k|0}else if((u|0)==30){Ab(i);k=-20;l=f;return k|0}else if((u|0)==34){Ab(i);k=0;l=f;return k|0}return 0}function Ta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;d=l;l=l+512|0;e=d;f=0;while(1){g=Ua(a,e)|0;if((g|0)<0){h=g;break}i=Va(0,e,g)|0;if(i>>>0>32767){h=-23;break}j=zb(i<<1)|0;if(!j){h=-1;break}Va(j,e,g)|0;c[b+(f<<2)>>2]=j;f=f+1|0;if((f|0)>=80){k=0;m=7;break}}if((m|0)==7){l=d;return k|0}k=h;l=d;return k|0}function Ua(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=0;f=0;g=0;h=0;a:while(1){i=f;while(1){j=ya(b)|0;if((za(b)|0)<0){k=-20;l=12;break a}if(j|0)break;if((i|0)>31){k=-20;l=12;break a}else i=i+1|0}if((g|0)>31){k=-20;l=12;break}g=g+1|0;j=xa(b,5)|0;m=d[1555+j>>0]|0;n=m+i&255;o=1<<m;m=h;p=d[1587+j>>0]|0;while(1){a[c+(m<<1)>>0]=p;a[c+(m<<1)+1>>0]=n;m=m+1|0;if((o|0)<=1)break;else{o=o+-1|0;p=p+1|0}}p=-2147483648>>>(i+-1|0);if((i|0)<1|(p&e|0)==0){q=e;r=p;s=i}else{o=e;n=p;p=i;while(1){j=n^o;t=n<<1;u=p+-1|0;if((p|0)<2|(t&j|0)==0){q=j;r=t;s=u;break}else{o=j;n=t;p=u}}}if((s|0)<1){k=m;l=12;break}else{e=r|q;f=s;h=m}}if((l|0)==12)return k|0;return 0}function Va(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0;g=l;l=l+144|0;h=g;i=g+102|0;j=g+68|0;a[i>>0]=0;k=f+255&255;a[j>>0]=k;f=(c|0)!=0;m=k;k=0;n=0;o=0;p=0;while(1){q=e+(p<<1)|0;r=1-p+(m&255)|0;s=k&255;t=k<<24>>24?2:7;a:do if((r|0)>0){u=0;v=1;w=1;x=2;while(1){y=w;z=w+1|0;A=z+s|0;B=0;C=0;D=0;while(1){E=q+(D<<1)|0;F=d[q+(D<<1)+1>>0]|0;if((F|0)>=(A|0))if((F|0)==(A|0)){G=1;H=1}else{G=Wa(E,A)|0;H=B}else{G=1;H=B}D=G+D|0;I=C+1|0;if((D|0)>=(r|0))break;else{B=H;C=I}}B=(v|0)==0?u:y;if((C|0)<(x|0)){J=B;break a}if((R(I,t)|0)<(1<<z|0)){J=B;break}else{u=B;v=H;w=z;x=I}}}else J=1;while(0);t=o&65535;r=h+(n<<1)|0;b[r>>1]=t;K=o+1+(1<<J)|0;b:do if(f){b[r>>1]=t+1<<16>>16;b[c+(o<<16>>16<<1)>>1]=J;q=m;s=k;x=n;w=J;v=p;while(1){u=q&255;if((v|0)>(u|0))L=v;else{B=s&255;D=B+w|0;A=h+(x<<1)|0;E=v;while(1){F=d[e+(E<<1)+1>>0]|0;if((D|0)<(F|0)){M=D;N=x;O=E;P=26;break b}Q=D-F|0;S=0-(d[e+(E<<1)>>0]|0|F-B<<8)&65535;if((Q|0)!=31){F=b[A>>1]|0;T=1<<Q;while(1){Q=F;F=F+1<<16>>16;b[c+(Q<<16>>16<<1)>>1]=S;if((T|0)<=1)break;else T=T+-1|0}b[A>>1]=F}T=E+1|0;if((E|0)<(u|0))E=T;else{L=T;break}}}E=x+-1|0;if((x|0)<=0){U=E;V=L;break b}u=a[i+E>>0]|0;A=(s&255)-(u&255)|0;q=a[j+E>>0]|0;s=u;x=E;w=A;v=L}}else{v=m;w=k;x=n;s=J;q=p;while(1){A=v&255;if((q|0)>(A|0))W=q;else{E=(w&255)+s|0;u=q;while(1){if((E|0)<(d[e+(u<<1)+1>>0]|0|0)){M=E;N=x;O=u;P=26;break b}B=u+1|0;if((u|0)<(A|0))u=B;else{W=B;break}}}u=x+-1|0;if((x|0)<=0){U=u;V=W;break b}A=a[i+u>>0]|0;E=(w&255)-(A&255)|0;v=a[j+u>>0]|0;w=A;x=u;s=E;q=W}}while(0);if((P|0)==26){P=0;t=N+1|0;a[i+t>>0]=M;if(f){r=h+(N<<1)|0;q=b[r>>1]|0;b[r>>1]=q+1<<16>>16;b[c+(q<<16>>16<<1)>>1]=K}a[j+t>>0]=O+255+(Wa(e+(O<<1)|0,M&255)|0);U=t;V=O}if((U|0)<=-1)break;m=a[j+U>>0]|0;k=a[i+U>>0]|0;n=U;o=K;p=V}l=g;return K|0}function Wa(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0,h=0,i=0;c=b+31|0;e=0;f=0;while(1){g=(d[a+(f<<1)+1>>0]|0)-b|0;if((g|0)<32){h=-2147483648>>>g;i=f+1|0}else{h=1;i=(Wa(a+(f<<1)|0,c)|0)+f|0}e=h+e|0;if((e|0)<=-1)break;else f=i}return i|0}function Xa(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,Bb=0,Cb=0,Eb=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0;i=l;l=l+1088|0;j=i;k=i+312|0;m=i+304|0;n=i+256|0;if((f|0)==0|(g|0)==0){o=-1;l=i;return o|0}p=c[g+4>>2]|0;a:do if(!p){q=f+872|0;a[q>>0]=1;r=q;s=0}else{q=f+51636|0;wa(q,c[g>>2]|0,p);if(ya(q)|0){o=-24;l=i;return o|0}t=f+872|0;a[t>>0]=ya(q)|0;a[f+875>>0]=xa(q,6)|0;if(ya(q)|0){a[f+876>>0]=xa(q,6)|0;if(!(ya(q)|0))u=2;else{a[f+877>>0]=xa(q,6)|0;u=3}}else u=1;a[f+874>>0]=u;if(!(a[t>>0]|0)){if(xa(q,3)|0){o=-23;l=i;return o|0}if(!(a[t>>0]|0)){v=c[f+216>>2]|0;w=c[f+184>>2]|0;x=c[f+188>>2]|0;y=c[f+168>>2]|0;z=0;A=0;B=0;D=0;while(1){z=(c[f+72+(A<<5)+28>>2]|0)+z|0;if(D>>>0<z>>>0){E=B;F=D;while(1){G=x+F|0;H=E;I=0;while(1){if((d[G>>0]|0)>>>2&15&1<<I){J=c[w+(F<<6)+(I<<4)>>2]|0;if((J|0)>-1){K=y+(J<<2)|0;c[K>>2]=c[K>>2]&-1986|385;c[v+(H<<2)>>2]=J;L=H+1|0}else L=H;J=c[w+(F<<6)+(I<<4)+4>>2]|0;if((J|0)>-1){K=y+(J<<2)|0;c[K>>2]=c[K>>2]&-1986|385;c[v+(L<<2)>>2]=J;M=L+1|0}else M=L;J=c[w+(F<<6)+(I<<4)+8>>2]|0;if((J|0)>-1){K=y+(J<<2)|0;c[K>>2]=c[K>>2]&-1986|385;c[v+(M<<2)>>2]=J;N=M+1|0}else N=M;J=c[w+(F<<6)+(I<<4)+12>>2]|0;if((J|0)>-1){K=y+(J<<2)|0;c[K>>2]=c[K>>2]&-1986|385;c[v+(N<<2)>>2]=J;O=N+1|0}else O=N}else O=H;I=I+1|0;if((I|0)==4)break;else H=O}F=F+1|0;if((F|0)==(z|0)){P=O;Q=z;break}else E=O}}else{P=B;Q=D}c[f+220+(A<<2)>>2]=P-B;A=A+1|0;if((A|0)==3){r=t;s=P;break a}else{B=P;D=Q}}}}D=ya(q)|0;B=f+188|0;A=c[B>>2]|0;z=f+192|0;v=c[z>>2]|0;if(v){y=D;D=0;w=0;while(1){x=Ya(q,796)|0;E=x&31;if((x|0)>15)S=E+6+(xa(q,x-E>>4)|0)|0;else S=x;x=(y&255)<<1&2;T=D;E=S;F=w;do{H=A+F|0;a[H>>0]=a[H>>0]&-4|x;T=T+y|0;F=F+1|0;E=E+-1|0;U=F>>>0<v>>>0}while((E|0)!=0&U);if(S>>>0>4128&U)V=ya(q)|0;else V=(y|0)==0&1;if(U){y=V;D=T;w=F}else break}w=c[z>>2]|0;b:do if(T>>>0<w>>>0){D=c[B>>2]|0;y=0;while(1)if(!(a[D+y>>0]&2))break;else y=y+1|0;F=ya(q)|0;v=y;while(1){A=Ya(q,796)|0;E=A&31;if((A|0)>15)W=E+6+(xa(q,A-E>>4)|0)|0;else W=A;if(v>>>0>=w>>>0)break b;A=F&1;E=W;x=v;while(1){H=D+x|0;I=a[H>>0]|0;if(!(I&2)){if(!E)break;a[H>>0]=I&-2|A;X=E+-1|0}else X=E;I=x+1|0;if(I>>>0<w>>>0){E=X;x=I}else break b}if(W>>>0<4129){F=(F|0)==0&1;v=x;continue}else{F=ya(q)|0;v=x;continue}}}while(0);if(T)Y=(ya(q)|0)==0&1;else Y=0}else Y=0;w=c[f+184>>2]|0;z=c[B>>2]|0;v=c[f+200>>2]|0;F=c[f+168>>2]|0;D=c[f+216>>2]|0;y=D+(c[f+180>>2]<<2)|0;E=Y;A=0;I=0;H=0;G=0;J=0;K=0;while(1){I=(c[f+72+(G<<5)+28>>2]|0)+I|0;if(K>>>0<I>>>0){Z=(G|0)==0;_=E;$=A;aa=H;ba=J;ca=K;while(1){da=z+ca|0;ea=ca<<2;if(Z){fa=_;ia=$;ja=aa;ka=0;la=ba;while(1){if(!((d[da>>0]|0)>>>2&15&1<<ka)){ma=fa;na=ia;oa=ja;pa=la}else{qa=0;ra=fa;sa=ia;ta=ja;ua=0;va=la;while(1){za=c[w+(ca<<6)+(ka<<4)+(qa<<2)>>2]|0;if((za|0)>-1){Aa=a[da>>0]|0;do if(!(Aa&1)){if(Aa&2){if((va|0)<1){Ba=(ra|0)==0&1;Ca=Ya(q,840)|0}else{Ba=ra;Ca=va}Da=Ca+-1|0;if(!Ba){Ea=0;Fa=Da}else{Ga=Ba;Ha=Ba;Ia=Da;Ja=64;break}}else{Ea=ra;Fa=va}Ka=y+(~ta<<2)|0;Ma=0;Na=Ea;Oa=sa;Pa=ta+1|0;Qa=Fa}else{Ga=1;Ha=ra;Ia=va;Ja=64}while(0);if((Ja|0)==64){Ja=0;Ka=D+(sa<<2)|0;Ma=Ga;Na=Ha;Oa=sa+1|0;Pa=ta;Qa=Ia}c[Ka>>2]=za;Aa=F+(za<<2)|0;c[Aa>>2]=Ma&1|c[Aa>>2]&-194|192;Ra=Na;Sa=Oa;Ta=Pa;Ua=Ma|ua;Va=Qa}else{Ra=ra;Sa=sa;Ta=ta;Ua=ua;Va=va}qa=qa+1|0;if((qa|0)==4)break;else{ra=Ra;sa=Sa;ta=Ta;ua=Ua;va=Va}}a[v+(ka|ea)>>0]=Ua;ma=Ra;na=Sa;oa=Ta;pa=Va}ka=ka+1|0;if((ka|0)==4){Wa=ma;Xa=na;hb=oa;ib=pa;break}else{fa=ma;ia=na;ja=oa;la=pa}}}else{la=_;ja=$;ia=aa;fa=0;ka=ba;while(1){if(!((d[da>>0]|0)>>>2&15&1<<fa)){jb=la;kb=ja;lb=ia;mb=ka}else{ea=0;x=la;va=ja;ua=ia;ta=ka;while(1){sa=c[w+(ca<<6)+(fa<<4)+(ea<<2)>>2]|0;if((sa|0)>-1){ra=a[da>>0]|0;do if(!(ra&1)){if(ra&2){if((ta|0)<1){nb=(x|0)==0&1;ob=Ya(q,840)|0}else{nb=x;ob=ta}qa=ob+-1|0;if(!nb){pb=0;qb=qa}else{rb=nb;sb=nb;tb=qa;Ja=76;break}}else{pb=x;qb=ta}ub=y+(~ua<<2)|0;vb=0;wb=pb;xb=va;yb=ua+1|0;Bb=qb}else{rb=1;sb=x;tb=ta;Ja=76}while(0);if((Ja|0)==76){Ja=0;ub=D+(va<<2)|0;vb=rb;wb=sb;xb=va+1|0;yb=ua;Bb=tb}c[ub>>2]=sa;ra=F+(sa<<2)|0;c[ra>>2]=vb&1|c[ra>>2]&-194|192;Cb=wb;Eb=xb;Jb=yb;Kb=Bb}else{Cb=x;Eb=va;Jb=ua;Kb=ta}ea=ea+1|0;if((ea|0)==4){jb=Cb;kb=Eb;lb=Jb;mb=Kb;break}else{x=Cb;va=Eb;ua=Jb;ta=Kb}}}fa=fa+1|0;if((fa|0)==4){Wa=jb;Xa=kb;hb=lb;ib=mb;break}else{la=jb;ja=kb;ia=lb;ka=mb}}}ca=ca+1|0;if((ca|0)==(I|0)){Lb=Wa;Mb=Xa;Nb=hb;Ob=ib;Pb=I;break}else{_=Wa;$=Xa;aa=hb;ba=ib}}}else{Lb=E;Mb=A;Nb=H;Ob=J;Pb=K}c[f+220+(G<<2)>>2]=Mb-A;G=G+1|0;if((G|0)==3){r=t;s=Mb;break}else{E=Lb;A=Mb;H=Nb;J=Ob;K=Pb}}}while(0);Pb=f+232|0;c[Pb>>2]=s;do if(!(a[r>>0]|0))Qb=s;else{Ob=f+524|0;Nb=f+528|0;if((c[Ob>>2]|0)>=0?(c[Nb>>2]|0)>=0:0){Qb=s;break}c[Ob>>2]=0;c[Nb>>2]=0;c[f+532>>2]=0;Nb=c[f+248>>2]|0;c[f+556>>2]=Nb;c[f+552>>2]=Nb;c[f+548>>2]=Nb;Rb=f+54056|0;Sb=f+236|0;Tb=Rb+48|0;do{c[Rb>>2]=c[Sb>>2];Rb=Rb+4|0;Sb=Sb+4|0}while((Rb|0)<(Tb|0));Ob=c[f+576>>2]|0;Mb=(Ob|0)>-1?Ob:0-Ob|0;Ob=c[f+8>>2]|0;Lb=Ob+32|0;ib=c[f+580>>2]|0;Gb(Nb+(-16-(R(Mb,Ob+15|0)|0))|0,-128,(R(Mb,Lb)|0)+16+(R(((ib|0)>-1?ib:0-ib|0)<<1,Lb>>((c[f+48>>2]|0)>>>1&1^1))|0)|0)|0;Qb=c[Pb>>2]|0}while(0);if((Qb|0)<1){s=f+848|0;Lb=c[s>>2]|0;ib=c[s+4>>2]|0;s=Fb(d[f+873>>0]|0,0,Lb|0,ib|0)|0;Mb=Ib(s|0,C|0,c[f+60>>2]|0)|0;s=C;Ob=f+856|0;hb=Ob;Xa=c[hb>>2]|0;Wa=c[hb+4>>2]|0;hb=Db(Xa|0,Wa|0,Lb|0,ib|0)|0;ib=Fb(hb|0,C|0,Mb|0,s|0)|0;s=C;Mb=f+864|0;c[Mb>>2]=ib;c[Mb+4>>2]=s;Mb=Fb(Xa|0,Wa|0,1,0)|0;Wa=Ob;c[Wa>>2]=Mb;c[Wa+4>>2]=C;if(!h){o=1;l=i;return o|0}Wa=h;c[Wa>>2]=ib;c[Wa+4>>2]=s;o=1;l=i;return o|0}s=f+528|0;Wa=f+524|0;ib=c[Wa>>2]|0;Mb=c[s>>2]|0;Ob=0;while(1)if((Ob|0)==(ib|0)|(Ob|0)==(Mb|0))Ob=Ob+1|0;else break;Mb=f+532|0;c[Mb>>2]=Ob;ib=f+556|0;c[ib>>2]=c[f+236+(Ob*48|0)+12>>2];if(!(a[r>>0]|0)){Xa=f+856|0;hb=c[Xa+4>>2]|0;Lb=f+848|0;c[Lb>>2]=c[Xa>>2];c[Lb+4>>2]=hb;Ub=Qb}else{Qb=f+51636|0;hb=xa(Qb,3)|0;if(!hb){Lb=j;c[Lb>>2]=0;c[Lb+4>>2]=0;a[j+(xa(Qb,3)|0)>>0]=0;a[j+(xa(Qb,3)|0)>>0]=1;a[j+(xa(Qb,3)|0)>>0]=2;a[j+(xa(Qb,3)|0)>>0]=3;a[j+(xa(Qb,3)|0)>>0]=4;a[j+(xa(Qb,3)|0)>>0]=5;a[j+(xa(Qb,3)|0)>>0]=6;a[j+(xa(Qb,3)|0)>>0]=7;Vb=j}else Vb=1619+(hb+-1<<3)|0;Lb=(hb|0)==7?962:980;hb=f+200|0;Xa=c[hb>>2]|0;mb=f+212|0;lb=c[mb>>2]|0;if(lb|0){kb=0;do{jb=Xa+kb|0;if((a[jb>>0]|0)>0)a[jb>>0]=a[Vb+(Ya(Qb,Lb)|0)>>0]|0;kb=kb+1|0}while((kb|0)!=(lb|0))}lb=f+48|0;kb=c[8+(c[lb>>2]<<2)>>2]|0;Lb=(ya(Qb)|0)!=0;Vb=Lb?1032:1162;Lb=c[lb>>2]|0;lb=a[1544+Lb>>0]|0;Xa=lb&255;jb=c[f+168>>2]|0;Kb=c[f+176>>2]|0;Jb=c[f+196>>2]|0;Eb=c[hb>>2]|0;hb=c[mb>>2]|0;c:do if(hb|0){mb=(lb&255)>4;Cb=k+2|0;Bb=k+4|0;yb=k+6|0;xb=0;wb=0;vb=0;while(1){ub=a[Eb+wb>>0]|0;tb=ub<<24>>24;switch(ub<<24>>24){case -1:{Wb=xb;Xb=vb;break}case 7:{ub=c[Jb+(wb*48|0)>>2]|0;sb=jb+(ub<<2)|0;rb=c[sb>>2]|0;if(!(rb&1)){b[k>>1]=0;Yb=xb}else{c[sb>>2]=rb&-1985|1856;rb=(Ya(Qb,Vb)|0)+224|0;sb=(((Ya(Qb,Vb)|0)<<8)+57344|rb&255)&65535;b[k>>1]=sb;b[Kb+(ub<<1)>>1]=sb;Yb=sb}sb=c[Jb+(wb*48|0)+4>>2]|0;ub=jb+(sb<<2)|0;rb=c[ub>>2]|0;if(!(rb&1)){b[Cb>>1]=0;Zb=Yb}else{c[ub>>2]=rb&-1985|1856;rb=(Ya(Qb,Vb)|0)+224|0;ub=(((Ya(Qb,Vb)|0)<<8)+57344|rb&255)&65535;b[Cb>>1]=ub;b[Kb+(sb<<1)>>1]=ub;Zb=ub}ub=c[Jb+(wb*48|0)+8>>2]|0;sb=jb+(ub<<2)|0;rb=c[sb>>2]|0;if(!(rb&1)){b[Bb>>1]=0;_b=Zb}else{c[sb>>2]=rb&-1985|1856;rb=(Ya(Qb,Vb)|0)+224|0;sb=(((Ya(Qb,Vb)|0)<<8)+57344|rb&255)&65535;b[Bb>>1]=sb;b[Kb+(ub<<1)>>1]=sb;_b=sb}sb=c[Jb+(wb*48|0)+12>>2]|0;ub=jb+(sb<<2)|0;rb=c[ub>>2]|0;if(!(rb&1)){b[yb>>1]=0;$b=_b}else{c[ub>>2]=rb&-1985|1856;rb=(Ya(Qb,Vb)|0)+224|0;ub=(((Ya(Qb,Vb)|0)<<8)+57344|rb&255)&65535;b[yb>>1]=ub;b[Kb+(sb<<1)>>1]=ub;$b=ub}ga[kb&7](j,k);if(mb){ub=4;do{sb=d[1496+(Lb*12|0)+ub>>0]|0;rb=sb&3;qb=c[Jb+(wb*48|0)+(sb>>>2<<4)+(rb<<2)>>2]|0;sb=jb+(qb<<2)|0;pb=c[sb>>2]|0;if(pb&1|0){c[sb>>2]=pb&-1985|1856;b[Kb+(qb<<1)>>1]=b[j+(rb<<1)>>1]|0}ub=ub+1|0}while((ub|0)!=(Xa|0))}Wb=$b;Xb=xb;break}default:{switch(tb|0){case 2:{ub=(Ya(Qb,Vb)|0)+224|0;rb=(((Ya(Qb,Vb)|0)<<8)+57344|ub&255)&65535;ac=rb;bc=rb;cc=xb;break}case 3:{ac=xb;bc=xb;cc=vb;break}case 4:{ac=vb;bc=vb;cc=xb;break}case 6:{rb=(Ya(Qb,Vb)|0)+224|0;ac=xb;bc=(((Ya(Qb,Vb)|0)<<8)+57344|rb&255)&65535;cc=vb;break}default:{ac=xb;bc=0;cc=vb}}rb=268505377>>>(tb<<2)<<6&192|tb<<8&1792;ub=0;do{qb=d[1496+(Lb*12|0)+ub>>0]|0;pb=c[Jb+(wb*48|0)+(qb>>>2<<4)+((qb&3)<<2)>>2]|0;qb=jb+(pb<<2)|0;sb=c[qb>>2]|0;if(sb&1|0){c[qb>>2]=rb|sb&-1985;b[Kb+(pb<<1)>>1]=bc}ub=ub+1|0}while((ub|0)<(Xa|0));Wb=ac;Xb=cc}}wb=wb+1|0;if((wb|0)==(hb|0))break c;else{xb=Wb;vb=Xb}}}while(0);Ub=c[Pb>>2]|0}d:do if((Ub|0)>=1){Pb=c[f+168>>2]|0;Xb=c[f+216>>2]|0;Wb=f+874|0;if((a[Wb>>0]|0)==1){hb=0;while(1){cc=Pb+(c[Xb+(hb<<2)>>2]<<2)|0;c[cc>>2]=c[cc>>2]&-61;hb=hb+1|0;if((hb|0)==(Ub|0))break d}}hb=f+51636|0;cc=ya(hb)|0;ac=0;Xa=0;while(1){bc=Ya(hb,796)|0;Kb=bc&31;if((bc|0)>15)dc=Kb+6+(xa(hb,bc-Kb>>4)|0)|0;else dc=bc;bc=(dc|0)>4128;Kb=cc<<2&60;jb=ac;ec=Xa;Jb=dc;while(1){Lb=jb;jb=jb+1|0;Vb=Pb+(c[Xb+(Lb<<2)>>2]<<2)|0;c[Vb>>2]=c[Vb>>2]&-61|Kb;ec=ec+cc|0;if((Jb|0)<=1)break;if((jb|0)>=(Ub|0))break;else Jb=Jb+-1|0}Jb=(jb|0)<(Ub|0);if(bc&Jb)fc=ya(hb)|0;else fc=(cc|0)==0&1;if(Jb){cc=fc;ac=jb;Xa=ec}else break}if((ec|0)>0&(a[Wb>>0]|0)==3){Xa=0;while(1)if(!(c[Pb+(c[Xb+(Xa<<2)>>2]<<2)>>2]&60))Xa=Xa+1|0;else break;Wb=ya(hb)|0;ac=Xa;while(1){cc=Ya(hb,796)|0;Jb=cc&31;if((cc|0)>15)gc=Jb+6+(xa(hb,cc-Jb>>4)|0)|0;else gc=cc;if((ac|0)<(Ub|0)){hc=ac;ic=gc}else break d;while(1){cc=Pb+(c[Xb+(hc<<2)>>2]<<2)|0;Jb=c[cc>>2]|0;Kb=Jb>>>2;if(!(Kb&15))jc=ic;else{if((ic|0)<1)break;c[cc>>2]=Kb+Wb<<2&60|Jb&-61;jc=ic+-1|0}Jb=hc+1|0;if((Jb|0)<(Ub|0)){hc=Jb;ic=jc}else break d}if((gc|0)<4129){Wb=(Wb|0)==0&1;ac=hc;continue}else{Wb=ya(hb)|0;ac=hc;continue}}}}while(0);hc=f+220|0;gc=c[hc>>2]|0;jc=0;do{c[k+(jc<<2)>>2]=gc;jc=jc+1|0}while((jc|0)!=64);jc=f+224|0;gc=c[jc>>2]|0;ic=0;do{c[k+256+(ic<<2)>>2]=gc;ic=ic+1|0}while((ic|0)!=64);ic=f+228|0;gc=c[ic>>2]|0;Ub=0;do{c[k+512+(Ub<<2)>>2]=gc;Ub=Ub+1|0}while((Ub|0)!=64);Ub=f+51636|0;c[m>>2]=xa(Ub,4)|0;gc=m+4|0;c[gc>>2]=xa(Ub,4)|0;c[f+52744>>2]=0;ec=f+53512|0;fc=c[ec>>2]|0;dc=f+168|0;ac=c[dc>>2]|0;hb=f+216|0;Wb=c[hb>>2]|0;Xb=0;Pb=0;Xa=0;jb=0;bc=0;while(1){Xa=(c[f+220+(jb<<2)>>2]|0)+Xa|0;Gb(j|0,0,256)|0;c[f+52744+(jb<<8)>>2]=Xb;c[f+51976+(jb<<8)>>2]=bc;Jb=Xa-Pb|0;Kb=(Jb|0)<(Xb|0)?Jb:Xb;Jb=Xb-Kb|0;if((Kb|0)>0){cc=Kb;Vb=Pb;while(1){Lb=Vb+1|0;Qb=ac+(c[Wb+(Vb<<2)>>2]<<2)|0;c[Qb>>2]=c[Qb>>2]&65535;if((cc|0)>1){cc=cc+-1|0;Vb=Lb}else{kc=Lb;break}}}else kc=Pb;e:do if((Xa|0)>(kc|0)){Vb=f+51656+(c[m+(jb+1>>1<<2)>>2]<<2)|0;cc=Kb;Lb=kc;Qb=bc;while(1){$b=Lb;kb=Qb;while(1){_b=Ya(Ub,c[Vb>>2]|0)|0;Zb=kb+1|0;a[fc+kb>>0]=_b;if((_b|0)<15){Yb=xa(Ub,d[1675+_b>>0]|0)|0;Eb=kb+2|0;a[fc+Zb>>0]=Yb;if(!_b){a[fc+Eb>>0]=Yb>>>8;lc=kb+3|0}else lc=Eb;mc=Yb<<((_b|0)<2?-13:0)+((_b|0)<12?21:0);nc=lc}else{mc=0;nc=Zb}Zb=(c[184+(_b<<2)>>2]|0)+mc|0;oc=(Zb|0)==0?2147483647:Zb>>>8&4095;if(oc|0)break;_b=Zb&255;Yb=j+(_b<<2)|0;c[Yb>>2]=(c[Yb>>2]|0)+1;Yb=$b+1|0;Eb=ac+(c[Wb+($b<<2)>>2]<<2)|0;c[Eb>>2]=c[Eb>>2]&65535|(_b|0?0:(Zb^0-(Zb&1048576))>>21<<16);if((Xa|0)>(Yb|0)){$b=Yb;kb=nc}else{pc=cc;qc=0;rc=Yb;sc=nc;break e}}kb=Xa-$b|0;tc=(kb|0)<(oc|0)?kb-oc|0:0;kb=tc+oc|0;cc=kb+cc|0;if((kb|0)>0){Yb=kb;kb=$b;while(1){Zb=kb+1|0;_b=ac+(c[Wb+(kb<<2)>>2]<<2)|0;c[_b>>2]=c[_b>>2]&65535;if((Yb|0)>1){Yb=Yb+-1|0;kb=Zb}else{uc=Zb;break}}}else uc=$b;if((Xa|0)<=(uc|0))break;else{Lb=uc;Qb=nc}}pc=cc;qc=0-tc|0;rc=uc;sc=nc}else{pc=Kb;qc=Jb;rc=kc;sc=bc}while(0);Jb=pc;Kb=63;while(1){Qb=j+(Kb<<2)|0;Jb=(c[Qb>>2]|0)+Jb|0;c[Qb>>2]=Jb;if((Kb|0)<=0){vc=63;break}else Kb=Kb+-1|0}while(1){Kb=k+(jb<<8)+(vc<<2)|0;c[Kb>>2]=(c[Kb>>2]|0)-(c[j+(vc<<2)>>2]|0);if((vc|0)>0)vc=vc+-1|0;else break}jb=jb+1|0;if((jb|0)==3)break;else{Xb=qc;Pb=rc;bc=sc}}bc=f+53520|0;c[bc>>2]=sc;sc=xa(Ub,4)|0;c[m>>2]=sc;rc=xa(Ub,4)|0;c[gc>>2]=rc;Pb=j+252|0;Xb=sc;sc=rc;rc=qc;qc=1;jb=1;while(1){Xb=Xb+16|0;c[m>>2]=Xb;sc=sc+16|0;c[gc>>2]=sc;vc=d[1690+qc>>0]|0;if((jb|0)<(vc|0)){pc=c[bc>>2]|0;kc=rc;nc=jb;while(1){uc=c[ec>>2]|0;tc=64-nc|0;if((tc|0)>0){Xa=kc;Wb=0;ac=pc;while(1){c[f+52744+(Wb<<8)+(nc<<2)>>2]=Xa;c[f+51976+(Wb<<8)+(nc<<2)>>2]=ac;oc=c[k+(Wb<<8)+(nc<<2)>>2]|0;Gb(j|0,0,256)|0;if(Xa>>>0<oc>>>0){mc=f+51656+(c[m+(Wb+1>>1<<2)>>2]<<2)|0;lc=Xa;fc=Xa;Kb=0;Jb=ac;while(1){Kb=Kb+lc|0;Qb=Ya(Ub,c[mc>>2]|0)|0;Lb=Jb+1|0;a[uc+Jb>>0]=Qb;if((Qb|0)<15){Vb=xa(Ub,d[1675+Qb>>0]|0)|0;kb=Jb+2|0;a[uc+Lb>>0]=Vb;if(!Qb){a[uc+kb>>0]=Vb>>>8;wc=Jb+3|0}else wc=kb;xc=Vb<<((Qb|0)<2?-13:0)+((Qb|0)<12?21:0);yc=wc}else{xc=0;yc=Lb}Lb=(c[184+(Qb<<2)>>2]|0)+xc|0;Qb=(Lb|0)==0?2147483647:Lb>>>8&4095;Vb=j+((Lb&255)<<2)|0;if(!Qb){c[Vb>>2]=(c[Vb>>2]|0)+1;zc=0;Ac=fc+1|0}else{zc=Qb;Ac=fc}fc=zc+Ac|0;if(fc>>>0>=oc>>>0)break;else{lc=zc;Jb=yc}}Bc=c[Pb>>2]|0;Cc=zc;Dc=Kb;Ec=Ac;Fc=yc}else{Bc=0;Cc=Xa;Dc=0;Ec=0;Fc=ac}Jb=oc-Ec|0;lc=Dc+Bc+Jb|0;c[Pb>>2]=lc;fc=lc;lc=62;while(1){mc=j+(lc<<2)|0;fc=(c[mc>>2]|0)+fc|0;c[mc>>2]=fc;if((lc|0)<=0){Gc=tc;break}else lc=lc+-1|0}do{lc=Gc;Gc=Gc+-1|0;fc=k+(Wb<<8)+(Gc+nc<<2)|0;c[fc>>2]=(c[fc>>2]|0)-(c[j+(Gc<<2)>>2]|0)}while((lc|0)>1);lc=Cc-Jb|0;Wb=Wb+1|0;if((Wb|0)==3){Hc=lc;Ic=Fc;break}else{Xa=lc;ac=Fc}}}else{ac=kc;Xa=0;Wb=pc;while(1){c[f+52744+(Xa<<8)+(nc<<2)>>2]=ac;c[f+51976+(Xa<<8)+(nc<<2)>>2]=Wb;tc=c[k+(Xa<<8)+(nc<<2)>>2]|0;Gb(j|0,0,256)|0;if(ac>>>0<tc>>>0){cc=f+51656+(c[m+(Xa+1>>1<<2)>>2]<<2)|0;lc=ac;fc=ac;oc=0;Kb=Wb;while(1){oc=oc+lc|0;mc=Ya(Ub,c[cc>>2]|0)|0;$b=Kb+1|0;a[uc+Kb>>0]=mc;if((mc|0)<15){Qb=xa(Ub,d[1675+mc>>0]|0)|0;Vb=Kb+2|0;a[uc+$b>>0]=Qb;if(!mc){a[uc+Vb>>0]=Qb>>>8;Jc=Kb+3|0}else Jc=Vb;Kc=Qb<<((mc|0)<2?-13:0)+((mc|0)<12?21:0);Lc=Jc}else{Kc=0;Lc=$b}$b=(c[184+(mc<<2)>>2]|0)+Kc|0;mc=($b|0)==0?2147483647:$b>>>8&4095;Qb=j+(($b&255)<<2)|0;if(!mc){c[Qb>>2]=(c[Qb>>2]|0)+1;Mc=0;Nc=fc+1|0}else{Mc=mc;Nc=fc}fc=Mc+Nc|0;if(fc>>>0>=tc>>>0)break;else{lc=Mc;Kb=Lc}}Oc=c[Pb>>2]|0;Pc=Mc;Qc=oc;Rc=Nc;Sc=Lc}else{Oc=0;Pc=ac;Qc=0;Rc=0;Sc=Wb}Kb=tc-Rc|0;lc=Qc+Oc+Kb|0;c[Pb>>2]=lc;fc=lc;lc=62;while(1){cc=j+(lc<<2)|0;fc=(c[cc>>2]|0)+fc|0;c[cc>>2]=fc;if((lc|0)<=0)break;else lc=lc+-1|0}lc=Pc-Kb|0;Xa=Xa+1|0;if((Xa|0)==3){Hc=lc;Ic=Sc;break}else{ac=lc;Wb=Sc}}}c[bc>>2]=Ic;nc=nc+1|0;if((nc|0)==(vc|0)){Tc=Hc;Uc=vc;break}else{pc=Ic;kc=Hc}}}else{Tc=rc;Uc=jb}qc=qc+1|0;if((qc|0)==5)break;else{rc=Tc;jb=Uc}}Uc=f+848|0;jb=c[Uc>>2]|0;Tc=c[Uc+4>>2]|0;Uc=Fb(d[f+873>>0]|0,0,jb|0,Tc|0)|0;rc=Ib(Uc|0,C|0,c[f+60>>2]|0)|0;Uc=C;qc=f+856|0;Hc=qc;Ic=c[Hc>>2]|0;bc=c[Hc+4>>2]|0;Hc=Db(Ic|0,bc|0,jb|0,Tc|0)|0;Tc=Fb(Hc|0,C|0,rc|0,Uc|0)|0;Uc=C;rc=f+864|0;c[rc>>2]=Tc;c[rc+4>>2]=Uc;rc=Fb(Ic|0,bc|0,1,0)|0;bc=qc;c[bc>>2]=rc;c[bc+4>>2]=C;if(h|0){bc=h;c[bc>>2]=Tc;c[bc+4>>2]=Uc}Uc=f+54112|0;bc=f+48|0;Tc=f+57120|0;c[Tc>>2]=4<<((c[bc>>2]|0)>>>1&1^1);Hb(f+54624|0,f+51976|0,768)|0;Hb(f+56160|0,f+52744|0,768)|0;h=c[hb>>2]|0;rc=f+180|0;qc=h+(c[rc>>2]<<2)|0;c[f+56928>>2]=h;c[f+56940>>2]=qc;Ic=c[hc>>2]|0;Hc=h+(Ic<<2)|0;h=qc+(Ic-(c[f+84>>2]|0)<<2)|0;c[f+56932>>2]=Hc;c[f+56944>>2]=h;Ic=c[jc>>2]|0;qc=h+(Ic-(c[f+116>>2]|0)<<2)|0;c[f+56936>>2]=Hc+(Ic<<2);c[f+56948>>2]=qc;qc=a[f+874>>0]|0;if(qc<<24>>24){Ic=qc&255;qc=0;do{Hc=f+875+qc|0;c[f+56976+(qc<<3)>>2]=c[f+880+((d[Hc>>0]|0)*24|0)>>2];c[f+56976+(qc<<3)+4>>2]=c[f+880+((d[Hc>>0]|0)*24|0)+4>>2];qc=qc+1|0}while((qc|0)!=(Ic|0));Vc=0;do{qc=f+875+Vc|0;c[f+57e3+(Vc<<3)>>2]=c[f+880+((d[qc>>0]|0)*24|0)+8>>2];c[f+57e3+(Vc<<3)+4>>2]=c[f+880+((d[qc>>0]|0)*24|0)+12>>2];Vc=Vc+1|0}while((Vc|0)!=(Ic|0));Wc=0;do{Vc=f+875+Wc|0;c[f+57024+(Wc<<3)>>2]=c[f+880+((d[Vc>>0]|0)*24|0)+16>>2];c[f+57024+(Wc<<3)+4>>2]=c[f+880+((d[Vc>>0]|0)*24|0)+20>>2];Wc=Wc+1|0}while((Wc|0)!=(Ic|0))}Rb=f+57072|0;Tb=Rb+48|0;do{c[Rb>>2]=0;Rb=Rb+4|0}while((Rb|0)<(Tb|0));Ic=f+875|0;Wc=a[(d[Ic>>0]|0)+(f+51568)>>0]|0;Vc=Wc<<24>>24!=0;qc=f+57124|0;c[qc>>2]=Vc&1;if(Vc)Za(f+54368|0,Wc&255);Wc=f+53524|0;Vc=c[Wc>>2]|0;Hc=f+54040|0;h=c[Hc>>2]|0;jb=(h|0)==0;f:do if((Vc|0)<1)if(jb)Ja=249;else{Ab(h);c[Hc>>2]=0;Sc=f+54044|0;Ab(c[Sc>>2]|0);c[Sc>>2]=0;Sc=f+54048|0;Ab(c[Sc>>2]|0);c[Sc>>2]=0;Ja=249}else{if(!jb){Sc=c[hb>>2]|0;Pc=(c[jc>>2]|0)+(c[hc>>2]|0)+(c[ic>>2]|0)|0;Pb=a[Ic>>0]|0;if((Pc|0)>0){Oc=0;do{a[h+(c[Sc+(Oc<<2)>>2]|0)>>0]=Pb;Oc=Oc+1|0}while((Oc|0)!=(Pc|0));Xc=c[Wc>>2]|0}else Xc=Vc}else{if(a[r>>0]|0){Ja=249;break}Pc=c[rc>>2]|0;Oc=zb(Pc)|0;c[Hc>>2]=Oc;if(!Oc){Ja=249;break}Gb(Oc|0,a[Ic>>0]|0,Pc|0)|0;Xc=Vc}Pc=f+54044|0;Oc=c[Pc>>2]|0;Pb=(Oc|0)==0;if((Xc|0)<2){if(Pb){Ja=249;break}Ab(Oc);c[Pc>>2]=0;Oc=f+54048|0;Ab(c[Oc>>2]|0);c[Oc>>2]=0;Ja=249;break}do if(Pb){Oc=c[f+4>>2]|0;Sc=c[f+8>>2]|0;Qc=R(Sc,Oc)|0;Rc=c[bc>>2]|0;Lc=zb((R(Oc>>>(Rc&1^1)<<1,Sc>>>(Rc>>>1&1^1))|0)+Qc|0)|0;Qc=f+54048|0;c[Qc>>2]=Lc;Rc=zb(c[rc>>2]<<2)|0;c[Pc>>2]=Rc;if((Lc|0)==0|(Rc|0)==0){Ab(Lc);c[Qc>>2]=0;Ab(c[Pc>>2]|0);c[Pc>>2]=0;Ja=249;break f}else{Qc=f+54052|0;c[Qc>>2]=0;Yc=Oc;Zc=Sc;_c=Lc;$c=Qc;Ja=242;break}}else{Qc=f+54052|0;if((c[Qc>>2]|0)==(((Xc|0)>4?2:1)|0))ad=Xc;else{Yc=c[f+4>>2]|0;Zc=c[f+8>>2]|0;_c=c[f+54048>>2]|0;$c=Qc;Ja=242}}while(0);if((Ja|0)==242){c[f+54056>>2]=Yc;c[f+54060>>2]=Zc;if((Xc|0)<5){Pb=0-Yc|0;c[f+54064>>2]=Pb;c[f+54068>>2]=_c+(R(1-Zc|0,Pb)|0);bd=Xc}else{Pb=R(Yc,Zc)|0;Qc=c[bc>>2]|0;Lc=Yc>>>(Qc&1^1);Sc=Zc>>>(Qc>>>1&1^1);Qc=R(Sc,Lc)|0;Oc=f+54056|0;c[f+54064>>2]=Yc;c[f+54068>>2]=_c;c[f+54072>>2]=Lc;c[f+54076>>2]=Sc;c[f+54080>>2]=Lc;Rc=_c+Pb|0;c[f+54084>>2]=Rc;c[f+54088>>2]=Lc;c[f+54092>>2]=Sc;c[f+54096>>2]=Lc;c[f+54100>>2]=Rc+Qc;La(Oc,Oc);bd=c[Wc>>2]|0}c[$c>>2]=(bd|0)>4?2:1;ad=bd}if((ad|0)<5){Oc=f+54072|0;Qc=f+236+((c[Mb>>2]|0)*48|0)+16|0;c[Oc>>2]=c[Qc>>2];c[Oc+4>>2]=c[Qc+4>>2];c[Oc+8>>2]=c[Qc+8>>2];c[Oc+12>>2]=c[Qc+12>>2];c[Oc+16>>2]=c[Qc+16>>2];c[Oc+20>>2]=c[Qc+20>>2];c[Oc+24>>2]=c[Qc+24>>2];c[Oc+28>>2]=c[Qc+28>>2]}Qc=f+57128|0;c[Qc>>2]=c[Wc>>2];cd=f+54056|0;dd=Qc;ed=Pc}while(0);if((Ja|0)==249){ad=f+57128|0;c[ad>>2]=0;bd=f+54056|0;Rb=bd;Sb=f+236+((c[Mb>>2]|0)*48|0)|0;Tb=Rb+48|0;do{c[Rb>>2]=c[Sb>>2];Rb=Rb+4|0;Sb=Sb+4|0}while((Rb|0)<(Tb|0));cd=bd;dd=ad;ed=f+54044|0}Rb=Uc;Tb=Rb+128|0;do{b[Rb>>1]=0;Rb=Rb+2|0}while((Rb|0)<(Tb|0));La(n,cd);cd=f+76|0;Rb=f+64|0;Tb=j+2|0;ad=f+552|0;bd=f+172|0;Sb=f+54368|0;$c=f+54108|0;_c=f+54104|0;Yc=c[Tc>>2]|0;Zc=0;Xc=0;while(1){rc=c[cd>>2]|0;Vc=(Yc+Xc|0)<(rc|0);Ic=Vc&1;h=rc;ic=rc;rc=0;do{hc=(rc|0)!=0;if(hc)fd=(c[bc>>2]&2|0)==0;else fd=0;jc=fd&1;hb=Xc>>jc;jb=f+57048+(rc<<2)|0;c[jb>>2]=hb;Qc=f+72+(rc<<5)+4|0;Oc=c[Qc>>2]|0;Rc=(c[Tc>>2]>>jc)+hb|0;hb=f+57060+(rc<<2)|0;c[hb>>2]=(Rc|0)<(Oc|0)?Rc:Oc;_a(f,Uc,rc);Oc=c[ec>>2]|0;Rc=c[Rb>>2]|0;Lc=c[dc>>2]|0;Sc=f+56928+(rc<<2)|0;Pb=c[Sc>>2]|0;Nc=c[f+56952+(rc<<2)>>2]|0;b[j>>1]=b[c[f+56976+(rc*24|0)>>2]>>1]|0;b[Tb>>1]=b[c[f+56976+(rc*24|0)+4>>2]>>1]|0;if((Nc|0)>0){Mc=0;do{Kc=c[Pb+(Mc<<2)>>2]|0;Jc=Lc+(Kc<<2)|0;Ub=c[Jc>>2]|0;m=(Ub&1792|0)!=256&1;k=c[f+56976+(rc*24|0)+((Ub>>>2&15)<<3)+(m<<2)>>2]|0;Ub=0;while(1){gd=f+56160+(rc<<8)+(Ub<<2)|0;hd=c[gd>>2]|0;if(hd|0){Ja=260;break}Fc=f+54624+(rc<<8)+(Ub<<2)|0;Cc=c[Fc>>2]|0;Gc=Cc+1|0;Bc=a[Oc+Cc>>0]|0;Dc=c[184+((Bc&255)<<2)>>2]|0;Ec=Cc+2|0;do if((Bc&255)<15){yc=(d[Oc+Gc>>0]<<((Bc&255)<2?-13:0)+((Bc&255)<12?21:0))+Dc|0;Ac=yc>>>8&4095;if(Bc<<24>>24){id=yc;jd=Ac;kd=Ec;break}zc=(d[Oc+Ec>>0]<<8)+Ac|0;id=yc;jd=(zc|0)==0?2147483647:zc;kd=Cc+3|0}else{id=Dc;jd=Dc>>>8&4095;kd=Gc}while(0);c[gd>>2]=jd;c[Fc>>2]=kd;Gc=(id&255)+Ub|0;Dc=(R(e[k+(Gc<<1)>>1]|0,(id^0-(id&1048576))>>21)|0)&65535;b[f+54112+(d[Rc+Gc>>0]<<1)>>1]=Dc;Dc=((jd|0)==0&1)+Gc|0;if((Dc|0)<64)Ub=Dc;else break}if((Ja|0)==260){Ja=0;c[gd>>2]=hd+-1}b[Uc>>1]=(c[Jc>>2]|0)>>>16;$a(f,Kc,rc,Uc,Ub,b[j+(m<<1)>>1]|0);Mc=Mc+1|0}while((Mc|0)!=(Nc|0));ld=c[Sc>>2]|0}else ld=Pb;c[Sc>>2]=ld+(Nc<<2);Mc=c[f+56964+(rc<<2)>>2]|0;if((Mc|0)>0){Rc=f+56940+(rc<<2)|0;Oc=(c[Rc>>2]|0)+(0-Mc<<2)|0;c[Rc>>2]=Oc;ab(c[ib>>2]|0,c[ad>>2]|0,c[f+576+(rc<<2)>>2]|0,Oc,Mc,c[bd>>2]|0)}if(!(c[qc>>2]|0)){md=0;nd=0}else{bb(f,Sb,2,rc,(c[jb>>2]|0)-Zc|0,(c[hb>>2]|0)-Ic|0);md=Ic;nd=Zc}cb(f,Ob,rc,((c[jb>>2]|0)-nd<<3)-(nd<<1)|0,((c[hb>>2]|0)-md<<3)-(md<<1)|0);Mc=hc?3:0;do if((c[dd>>2]|0)<(Mc+2|0)){Oc=(c[qc>>2]|0)==0;od=(Vc&(Oc^1)&1)+md|0;pd=(Oc?0:Zc)+nd|0}else{Oc=nd+Zc|0;Rc=md+Ic|0;Lc=(c[jb>>2]|0)-Oc|0;k=(c[hb>>2]|0)-Rc|0;Kb=f+72+(rc<<5)|0;Dc=c[Kb>>2]|0;Gc=f+72+(rc<<5)+8|0;Cc=c[Gc>>2]|0;Ec=R(Dc,Lc)|0;Bc=Cc+Ec|0;zc=c[ed>>2]|0;yc=zc+(Bc<<2)|0;Ac=c[Hc>>2]|0;xc=Ac+Bc|0;Bc=(Lc|0)>0;wc=(c[Qc>>2]|0)>(k|0);Gb(yc+((Bc?Dc:0)<<2)|0,0,R(Dc<<2,k-Lc+(Bc<<31>>31)+(wc&1)|0)|0)|0;sc=(Bc&1)<<2|Lc<<3;Lc=f+54056+(rc<<4)+8|0;Bc=c[Lc>>2]|0;gc=c[f+236+(Ob*48|0)+(rc<<4)+8>>2]|0;Xb=f+54056+(rc<<4)+12|0;kc=c[Xb>>2]|0;pc=kc+(R(Bc,sc)|0)|0;vc=c[f+236+(Ob*48|0)+(rc<<4)+12>>2]|0;nc=vc+(R(gc,sc)|0)|0;Wb=f+54056+(rc<<4)|0;ac=c[Wb>>2]|0;if((sc|0)<4){Xa=Bc<<2;uc=pc;lc=nc;fc=sc;while(1){Hb(uc|0,lc|0,ac|0)|0;fc=fc+1|0;if((fc|0)==4)break;else{uc=uc+Bc|0;lc=lc+gc|0}}qd=kc+Xa|0;rd=vc+(gc<<2)|0;sd=4}else{qd=pc;rd=nc;sd=sc}lc=(wc^1)&1;uc=k-lc<<3;do if((sd|0)<(uc|0)){fc=0-gc|0;m=Bc<<3;Ub=gc<<3;Kc=0-(Bc<<2)|0;Jc=(k<<3)+-1-(lc<<3)-sd|0;if((ac|0)<=8){tc=Jc>>>3;oc=Cc+1+Ec+tc|0;cc=tc<<3;tc=cc+8|0;Jb=R(tc,Bc)|0;mc=xc;Qb=qd;$b=rd;Vb=yc;Lb=sd;while(1){kb=c[f+53528+(d[mc>>0]<<2)>>2]|0;db(Qb,Bc,$b+fc|0,gc,kb,kb*3>>2,Vb,Vb+(Dc<<2)|0);Lb=Lb+8|0;if((Lb|0)>=(uc|0))break;else{mc=mc+1|0;Qb=Qb+m|0;$b=$b+Ub|0;Vb=Vb+4|0}}td=Ac+oc|0;ud=qd+Jb|0;vd=rd+(R(tc,gc)|0)|0;wd=zc+(oc<<2)|0;xd=sd+8+cc|0;break}Vb=Jc&-8;$b=Vb+8|0;Qb=R($b,Bc)|0;mc=xc;Lb=qd;Fc=rd;kb=yc;Yb=sd;while(1){Zb=c[f+53528+(d[mc>>0]<<2)>>2]|0;db(Lb,Bc,Fc+fc|0,gc,Zb,Zb*3>>2,kb,kb+(Dc<<2)|0);yd=mc+1|0;Zb=kb;_b=kb+4|0;Eb=8;while(1){lb=c[f+53528+(d[yd>>0]<<2)>>2]|0;vb=lb*3>>2;xb=Lb+Eb|0;db(xb,Bc,Fc+Eb+fc|0,gc,lb,vb,_b,_b+(Dc<<2)|0);eb(xb+Kc+-4|0,Bc,lb,vb,Zb);Eb=Eb+8|0;zd=_b+4|0;yd=yd+1|0;if((Eb|0)>=(ac|0))break;else{vb=_b;_b=zd;Zb=vb}}Zb=Yb+8|0;if((Zb|0)<(uc|0)){mc=yd;Lb=Lb+m|0;Fc=Fc+Ub|0;kb=zd;Yb=Zb}else break}td=yd;ud=qd+Qb|0;vd=rd+(R($b,gc)|0)|0;wd=zd;xd=sd+8+Vb|0}else{td=xc;ud=qd;vd=rd;wd=yc;xd=sd}while(0);do if(!wc){yc=c[f+54056+(rc<<4)+4>>2]|0;if((yc|0)>(xd|0)){xc=yc-xd|0;uc=ud;Dc=vd;zc=xd;while(1){Hb(uc|0,Dc|0,ac|0)|0;zc=zc+1|0;if((zc|0)==(yc|0))break;else{uc=uc+Bc|0;Dc=Dc+gc|0}}Ad=ud+(R(xc,Bc)|0)|0}else Ad=ud;if((ac|0)<=8)break;Dc=0-(Bc<<3)|0;uc=td;yc=wd;zc=8;while(1){uc=uc+1|0;Vb=c[f+53528+(d[uc>>0]<<2)>>2]|0;eb(Ad+zc+Dc+-4|0,Bc,Vb,Vb*3>>2,yc);zc=zc+8|0;if((zc|0)>=(ac|0))break;else yc=yc+4|0}}while(0);if((c[dd>>2]|0)<(Mc+3|0)){od=Rc;pd=Oc;break}ac=Oc+Zc|0;Bc=Rc+Ic|0;gc=(c[jb>>2]|0)-ac|0;wc=c[Kb>>2]|0;yc=(c[Gc>>2]|0)+(R(wc,gc)|0)|0;zc=(c[Wc>>2]|0)<((hc?7:4)|0);Dc=hc?3840:1920;uc=gc<<3;gc=c[Lc>>2]|0;xc=(c[hb>>2]|0)-Bc<<3;Vb=c[Wb>>2]|0;$b=c[f+54056+(rc<<4)+4>>2]|0;if((uc|0)>=(xc|0)){od=Bc;pd=ac;break}Qb=(c[Xb>>2]|0)+(R(gc,uc)|0)|0;Ac=(Vb|0)>0;Ec=0-wc|0;Cc=gc<<3;lc=(c[dc>>2]|0)+(yc<<2)|0;k=Qb;Qb=(c[ed>>2]|0)+(yc<<2)|0;yc=uc;while(1){uc=yc;yc=yc+8|0;g:do if(Ac){sc=(uc|0)<1;nc=(yc|0)>=($b|0);pc=(nc&1)<<3|(sc&1)<<2;if(zc){vc=lc;Xa=Qb;kc=0;while(1){Yb=d[((c[vc>>2]|0)>>>2&15)+(f+875)>>0]|0;kb=c[Xa>>2]|0;Ub=kc;kc=kc+8|0;Fc=(Ub|0)<1|pc|((kc|0)>=(Vb|0)&1)<<1;do if((kb|0)>1536)fb(k+Ub|0,gc,Fc,c[f+53528+(Yb<<2)>>2]|0,c[f+53784+(Yb<<2)>>2]|0,1);else{if((kb|0)<=384)break;fb(k+Ub|0,gc,Fc,c[f+53528+(Yb<<2)>>2]|0,c[f+53784+(Yb<<2)>>2]|0,0)}while(0);Yb=vc+4|0;Fc=Xa+4|0;if((kc|0)>=(Vb|0)){Bd=Yb;Cd=Fc;break g}else{vc=Yb;Xa=Fc}}}if(hc){Xa=lc;vc=Qb;kc=0;while(1){Fc=d[((c[Xa>>2]|0)>>>2&15)+(f+875)>>0]|0;Yb=c[vc>>2]|0;Ub=kc;kc=kc+8|0;kb=(Ub|0)<1|pc|((kc|0)>=(Vb|0)&1)<<1;do if((Yb|0)>(Dc|0)){m=k+Ub|0;Lb=f+53528+(Fc<<2)|0;mc=f+53784+(Fc<<2)|0;fb(m,gc,kb,c[Lb>>2]|0,c[mc>>2]|0,1);fb(m,gc,kb,c[Lb>>2]|0,c[mc>>2]|0,1);fb(m,gc,kb,c[Lb>>2]|0,c[mc>>2]|0,1)}else{if((Yb|0)>1536){fb(k+Ub|0,gc,kb,c[f+53528+(Fc<<2)>>2]|0,c[f+53784+(Fc<<2)>>2]|0,1);break}if((Yb|0)<=384)break;fb(k+Ub|0,gc,kb,c[f+53528+(Fc<<2)>>2]|0,c[f+53784+(Fc<<2)>>2]|0,0)}while(0);Fc=Xa+4|0;kb=vc+4|0;if((kc|0)>=(Vb|0)){Bd=Fc;Cd=kb;break g}else{Xa=Fc;vc=kb}}}else{Dd=lc;Ed=Qb;Fd=0}while(1){vc=d[((c[Dd>>2]|0)>>>2&15)+(f+875)>>0]|0;Xa=c[Ed>>2]|0;kc=(Fd|0)<1;kb=Fd;Fd=Fd+8|0;Fc=(Fd|0)>=(Vb|0);Ub=kc&1|pc|(Fc&1)<<1;h:do if((Xa|0)>(Dc|0)){Yb=k+kb|0;mc=f+53528+(vc<<2)|0;Lb=f+53784+(vc<<2)|0;fb(Yb,gc,Ub,c[mc>>2]|0,c[Lb>>2]|0,1);if(!(!kc?(c[Ed+-4>>2]|0)>3840:0))Ja=315;do if((Ja|0)==315){Ja=0;if(!Fc?(c[Ed+4>>2]|0)>3840:0)break;if(!sc?(c[Ed+(Ec<<2)>>2]|0)>3840:0)break;if(nc)break h;if((c[Ed+(wc<<2)>>2]|0)<=3840)break h}while(0);fb(Yb,gc,Ub,c[mc>>2]|0,c[Lb>>2]|0,1);fb(Yb,gc,Ub,c[mc>>2]|0,c[Lb>>2]|0,1)}else{if((Xa|0)>1536){fb(k+kb|0,gc,Ub,c[f+53528+(vc<<2)>>2]|0,c[f+53784+(vc<<2)>>2]|0,1);break}if((Xa|0)<=384)break;fb(k+kb|0,gc,Ub,c[f+53528+(vc<<2)>>2]|0,c[f+53784+(vc<<2)>>2]|0,0)}while(0);vc=Dd+4|0;Ub=Ed+4|0;if((Fd|0)>=(Vb|0)){Bd=vc;Cd=Ub;break}else{Dd=vc;Ed=Ub}}}else{Bd=lc;Cd=Qb}while(0);if((yc|0)>=(xc|0)){od=Bc;pd=ac;break}else{lc=Bd;k=k+Cc|0;Qb=Cd}}}while(0);hc=(c[jb>>2]|0)-pd<<jc;h=(hc|0)<(h|0)?hc:h;hc=(c[hb>>2]|0)-od<<jc;ic=(hc|0)<(ic|0)?hc:ic;rc=rc+1|0}while((rc|0)!=3);rc=c[$c>>2]|0;if(rc|0){Ic=c[cd>>2]|0;ha[rc&7](c[_c>>2]|0,n,Ic-ic|0,Ic-h|0)}Ic=c[Tc>>2]|0;if(Vc){Yc=Ic;Zc=1;Xc=Ic+Xc|0}else break}gb(f,Ob,0);gb(f,Ob,1);gb(f,Ob,2);Ob=(a[r>>0]|0)==0;r=c[Mb>>2]|0;c[s>>2]=r;s=c[ib>>2]|0;if(Ob){c[Wa>>2]=r;c[ad>>2]=s;Gd=0}else Gd=1;c[f+548+(Gd<<2)>>2]=s;o=0;l=i;return o|0}function Ya(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;f=a+4|0;g=a+8|0;h=c[a>>2]|0;i=a+12|0;a=c[i>>2]|0;j=0;k=c[f>>2]|0;l=c[g>>2]|0;while(1){m=b[e+(j<<1)>>1]|0;if((m|0)>(a|0)){n=k;o=32-a|0;p=l;while(1){if(n>>>0>=h>>>0){q=n;r=-1073741824;s=p;break}t=o+-8|0;u=n+1|0;v=d[n>>0]<<t|p;if(t>>>0>7){n=u;o=t;p=v}else{q=u;r=t;s=v;break}}w=32-r|0;x=q;y=s}else{w=a;x=k;y=l}p=b[e+(j+1+(y>>>(32-m|0))<<1)>>1]|0;z=p<<16>>16;if(p<<16>>16<1)break;a=w-m|0;j=z;k=x;l=y<<m}l=0-z|0;z=l>>8;c[f>>2]=x;c[g>>2]=y<<z;c[i>>2]=w-z;return l&255|0}function Za(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;Gb(b|0,0,256)|0;if((c|0)>0)d=0;else return;do{e=127-d|0;f=e-c|0;if((f|0)>-1)a[b+f>>0]=d-c;a[b+e>>0]=0-d;e=d+127|0;a[b+e>>0]=d;f=e+c|0;if((f|0)<256)a[b+f>>0]=c-d;d=d+1|0}while((d|0)!=(c|0));return}function _a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;e=c[b+2936+(d<<2)>>2]|0;f=c[b+2948+(d<<2)>>2]|0;g=c[a+72+(d<<5)>>2]|0;h=c[a+168>>2]|0;if((f|0)<=(e|0)){i=0;j=b+2840+(d<<2)|0;c[j>>2]=i;k=f-e|0;l=R(k,g)|0;m=l-i|0;n=b+2852+(d<<2)|0;c[n>>2]=m;return}o=h+(0-g<<2)|0;p=(g|0)>0;q=(c[a+72+(d<<5)+8>>2]|0)+(R(g,e)|0)|0;a=e;r=0;while(1){if(!a)if(p){s=q;t=0;u=r;while(1){v=h+(s<<2)|0;w=c[v>>2]|0;if(!(w&1))x=u;else{y=b+2960+(d<<4)+((w>>>6&3)<<2)|0;z=(c[y>>2]<<16)+w|0;c[v>>2]=z;c[y>>2]=z>>16;x=u+1|0}t=t+1|0;if((t|0)==(g|0))break;else{s=s+1|0;u=x}}A=g+q|0;B=x}else{A=q;B=r}else if(p){u=q;s=0;t=-1;z=r;y=(c[o+(q<<2)>>2]|0)>>>6&3;v=-1;while(1){s=s+1|0;if((s|0)<(g|0))C=(c[o+(u+1<<2)>>2]|0)>>>6&3;else C=-1;w=h+(u<<2)|0;D=c[w>>2]|0;if(!(D&1)){E=-1;F=z}else{G=D>>>6&3;do switch((((v|0)==(G|0)&1)<<1|(t|0)==(G|0)|((y|0)==(G|0)&1)<<2|((C|0)==(G|0)&1)<<3)&15){case 3:case 1:{H=c[h+(u+-1<<2)>>2]>>16;break}case 2:{H=c[o+(u+-1<<2)>>2]>>16;break}case 12:case 6:case 4:{H=c[o+(u<<2)>>2]>>16;break}case 5:{H=((c[o+(u<<2)>>2]>>16)+(c[h+(u+-1<<2)>>2]>>16)|0)/2|0;break}case 8:{H=c[o+(u+1<<2)>>2]>>16;break}case 13:case 11:case 9:{H=(((c[o+(u+1<<2)>>2]>>16)*53|0)+((c[h+(u+-1<<2)>>2]>>16)*75|0)|0)/128|0;break}case 10:{H=((c[o+(u+1<<2)>>2]>>16)+(c[o+(u+-1<<2)>>2]>>16)|0)/2|0;break}case 14:{H=((((c[o+(u+1<<2)>>2]>>16)+(c[o+(u+-1<<2)>>2]>>16)|0)*3|0)+((c[o+(u<<2)>>2]>>16)*10|0)|0)/16|0;break}case 15:case 7:{I=u+-1|0;J=c[h+(I<<2)>>2]>>16;K=c[o+(I<<2)>>2]>>16;I=c[o+(u<<2)>>2]>>16;L=(((I+J|0)*29|0)+(R(K,-26)|0)|0)/32|0;M=L-I|0;if((((M|0)>-1?M:0-M|0)|0)>128)H=I;else{I=L-J|0;M=L-K|0;H=(((I|0)>-1?I:0-I|0)|0)>128?J:(((M|0)>-1?M:0-M|0)|0)>128?K:L}break}default:H=c[b+2960+(d<<4)+(G<<2)>>2]|0}while(0);L=D+(H<<16)|0;c[w>>2]=L;c[b+2960+(d<<4)+(G<<2)>>2]=L>>16;E=G;F=z+1|0}if((s|0)==(g|0))break;else{L=y;u=u+1|0;t=E;z=F;y=C;v=L}}A=g+q|0;B=F}else{A=q;B=r}a=a+1|0;if((a|0)==(f|0)){i=B;break}else{q=A;r=B}}j=b+2840+(d<<2)|0;c[j>>2]=i;k=f-e|0;l=R(k,g)|0;m=l-i|0;n=b+2852+(d<<2)|0;c[n>>2]=m;return}function $a(d,e,f,g,h,i){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0;j=R(b[g>>1]|0,i&65535)|0;if((h|0)<2){i=(j+15|0)>>>5&65535;k=0;do{b[g+(k+64<<1)>>1]=i;k=k+1|0}while((k|0)!=64)}else{b[g>>1]=j;hb(g+128|0,g,h)}h=c[(c[d+172>>2]|0)+(e<<2)>>2]|0;j=(c[(c[d+168>>2]|0)+(e<<2)>>2]|0)>>>6&3;k=c[d+576+(f<<2)>>2]|0;i=(c[d+556>>2]|0)+h|0;if((j|0)==2){ib(i,k,g+128|0);return}l=(c[d+548+(j<<2)>>2]|0)+h|0;h=b[(c[d+176>>2]|0)+(e<<1)>>1]|0;e=(f|0)!=0;if(e)m=(c[d+48>>2]&2|0)==0;else m=0;f=m&1;m=(h<<16>>16>>8)+31|0;j=a[1827+(f<<6)+m>>0]|0;if(e)n=(c[d+48>>2]&1|0)==0;else n=0;d=n&1;n=((h&65535)<<24>>24)+31|0;h=a[1827+(d<<6)+n>>0]|0;e=(a[1699+(d<<6)+n>>0]|0)+(R(a[1699+(f<<6)+m>>0]|0,k)|0)|0;m=l+e|0;if(!((h|j)<<24>>24)){kb(i,m,k,g+128|0);return}else{jb(i,m,l+(e+(R(j<<24>>24,k)|0)+(h<<24>>24))|0,k,g+128|0);return}}function ab(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((h|0)>0)j=0;else return;do{k=c[i+(c[g+(j<<2)>>2]<<2)>>2]|0;l=b+k|0;m=e+k|0;k=m;n=k;o=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=k+4|0;k=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=l;p=n;a[p>>0]=o;a[p+1>>0]=o>>8;a[p+2>>0]=o>>16;a[p+3>>0]=o>>24;o=n+4|0;a[o>>0]=k;a[o+1>>0]=k>>8;a[o+2>>0]=k>>16;a[o+3>>0]=k>>24;k=l+f|0;l=m+f|0;m=l;o=m;n=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;o=m+4|0;m=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;o=k;p=o;a[p>>0]=n;a[p+1>>0]=n>>8;a[p+2>>0]=n>>16;a[p+3>>0]=n>>24;n=o+4|0;a[n>>0]=m;a[n+1>>0]=m>>8;a[n+2>>0]=m>>16;a[n+3>>0]=m>>24;m=k+f|0;k=l+f|0;l=k;n=l;o=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=l+4|0;l=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=m;p=n;a[p>>0]=o;a[p+1>>0]=o>>8;a[p+2>>0]=o>>16;a[p+3>>0]=o>>24;o=n+4|0;a[o>>0]=l;a[o+1>>0]=l>>8;a[o+2>>0]=l>>16;a[o+3>>0]=l>>24;l=m+f|0;m=k+f|0;k=m;o=k;n=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;o=k+4|0;k=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;o=l;p=o;a[p>>0]=n;a[p+1>>0]=n>>8;a[p+2>>0]=n>>16;a[p+3>>0]=n>>24;n=o+4|0;a[n>>0]=k;a[n+1>>0]=k>>8;a[n+2>>0]=k>>16;a[n+3>>0]=k>>24;k=l+f|0;l=m+f|0;m=l;n=m;o=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=m+4|0;m=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=k;p=n;a[p>>0]=o;a[p+1>>0]=o>>8;a[p+2>>0]=o>>16;a[p+3>>0]=o>>24;o=n+4|0;a[o>>0]=m;a[o+1>>0]=m>>8;a[o+2>>0]=m>>16;a[o+3>>0]=m>>24;m=k+f|0;k=l+f|0;l=k;o=l;n=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;o=l+4|0;l=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;o=m;p=o;a[p>>0]=n;a[p+1>>0]=n>>8;a[p+2>>0]=n>>16;a[p+3>>0]=n>>24;n=o+4|0;a[n>>0]=l;a[n+1>>0]=l>>8;a[n+2>>0]=l>>16;a[n+3>>0]=l>>24;l=m+f|0;m=k+f|0;k=m;n=k;o=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=k+4|0;k=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=l;p=n;a[p>>0]=o;a[p+1>>0]=o>>8;a[p+2>>0]=o>>16;a[p+3>>0]=o>>24;o=n+4|0;a[o>>0]=k;a[o+1>>0]=k>>8;a[o+2>>0]=k>>16;a[o+3>>0]=k>>24;k=m+f|0;m=k;o=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;m=k+4|0;k=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;m=l+f|0;l=m;a[l>>0]=o;a[l+1>>0]=o>>8;a[l+2>>0]=o>>16;a[l+3>>0]=o>>24;o=m+4|0;a[o>>0]=k;a[o+1>>0]=k>>8;a[o+2>>0]=k>>16;a[o+3>>0]=k>>24;j=j+1|0}while((j|0)!=(h|0));return}function bb(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;j=e+127|0;e=c[b+72+(g<<5)>>2]|0;k=c[b+72+(g<<5)+8>>2]|0;l=(c[b+72+(g<<5)+12>>2]|0)+k|0;m=k+(R(e,h)|0)|0;h=k+(R(e,i)|0)|0;i=c[b+576+(g<<2)>>2]|0;g=c[b+168>>2]|0;n=c[b+172>>2]|0;o=c[b+548+(f<<2)>>2]|0;if((m|0)>=(h|0))return;f=i<<1;b=0-f|0;p=i*3|0;q=i<<3;r=(e|0)>0;s=m;do{m=s;s=s+e|0;if(r){t=(m|0)>(k|0);u=m;while(1){if(c[g+(u<<2)>>2]&1){v=o+(c[n+(u<<2)>>2]|0)|0;if((u|0)>(m|0)){w=v+-2|0;x=0;while(1){y=w+2|0;z=d[y>>0]|0;A=w+1|0;B=d[A>>0]|0;C=a[j+((d[w>>0]|0)+4-(d[w+3>>0]|0)+((z-B|0)*3|0)>>3)>>0]|0;D=C+B|0;a[A>>0]=(D>>>31)+255&((D|0)<255?D:255);D=z-C|0;a[y>>0]=(D>>>31)+255&((D|0)<255?D:255);x=x+1|0;if((x|0)==8)break;else w=w+i|0}}if(t){w=v+b|0;x=0;do{D=w+(x+f)|0;y=w+(x+i)|0;C=d[y>>0]|0;z=a[j+((d[w+x>>0]|0)+4-(d[w+(x+p)>>0]|0)+(((d[D>>0]|0)-C|0)*3|0)>>3)>>0]|0;A=z+C|0;a[y>>0]=(A>>>31)+255&((A|0)<255?A:255);A=(d[D>>0]|0)-z|0;a[D>>0]=(A>>>31)+255&((A|0)<255?A:255);x=x+1|0}while((x|0)!=8)}x=u+1|0;if((x|0)<(s|0)?(c[g+(x<<2)>>2]&1|0)==0:0){w=v+8+-2|0;A=0;while(1){D=w+2|0;z=d[D>>0]|0;y=w+1|0;C=d[y>>0]|0;B=a[j+((d[w>>0]|0)+4-(d[w+3>>0]|0)+((z-C|0)*3|0)>>3)>>0]|0;E=B+C|0;a[y>>0]=(E>>>31)+255&((E|0)<255?E:255);E=z-B|0;a[D>>0]=(E>>>31)+255&((E|0)<255?E:255);A=A+1|0;if((A|0)==8)break;else w=w+i|0}}w=u+e|0;if((w|0)<(l|0)?(c[g+(w<<2)>>2]&1|0)==0:0){w=v+q+b|0;A=0;do{E=w+(A+f)|0;D=w+(A+i)|0;B=d[D>>0]|0;z=a[j+((d[w+A>>0]|0)+4-(d[w+(A+p)>>0]|0)+(((d[E>>0]|0)-B|0)*3|0)>>3)>>0]|0;y=z+B|0;a[D>>0]=(y>>>31)+255&((y|0)<255?y:255);y=(d[E>>0]|0)-z|0;a[E>>0]=(y>>>31)+255&((y|0)<255?y:255);A=A+1|0}while((A|0)!=8);F=x}else F=x}else F=u+1|0;if((F|0)<(s|0))u=F;else break}}}while((s|0)<(h|0));return}function cb(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;if(!e)h=0;else h=(c[b+48>>2]&1|0)==0;i=16>>>(h&1);h=c[b+236+(d*48|0)+(e<<4)+8>>2]|0;j=c[b+236+(d*48|0)+(e<<4)+12>>2]|0;k=R(h,f)|0;f=j+k|0;l=R(h,g)|0;g=j+l|0;if((k|0)==(l|0))return;l=0-i|0;k=f;j=f+(c[b+236+(d*48|0)+(e<<4)>>2]|0)+-1|0;while(1){Gb(k+l|0,a[k>>0]|0,i|0)|0;Gb(j+1|0,a[j>>0]|0,i|0)|0;k=k+h|0;if((k|0)==(g|0))break;else j=j+h|0}return}function db(b,e,f,g,h,i,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;m=l;l=l+48|0;n=m;o=n+20|0;p=n+16|0;q=n+4|0;r=n+8|0;s=n+12|0;t=n+24|0;u=n+28|0;v=n+32|0;w=n+36|0;x=0;y=b+(e*6|0)|0;z=b;b=f;while(1){f=d[b>>0]|0;c[n>>2]=f;A=b+g|0;B=a[A>>0]|0;C=B&255;c[q>>2]=C;D=A+g|0;A=d[D>>0]|0;c[r>>2]=A;E=D+g|0;D=d[E>>0]|0;c[s>>2]=D;F=E+g|0;E=d[F>>0]|0;c[p>>2]=E;G=F+g|0;F=d[G>>0]|0;c[o>>2]=F;H=G+g|0;G=d[H>>0]|0;c[t>>2]=G;I=H+g|0;H=d[I>>0]|0;c[u>>2]=H;J=I+g|0;I=d[J>>0]|0;c[v>>2]=I;K=d[J+g>>0]|0;c[w>>2]=K;J=C-f|0;L=F-G|0;M=A-C|0;N=G-H|0;G=D-A|0;O=H-I|0;H=E-D|0;P=((H|0)>-1?H:0-H|0)+(((G|0)>-1?G:0-G|0)+(((M|0)>-1?M:0-M|0)+((J|0)>-1?J:0-J|0)))|0;J=I-K|0;K=((J|0)>-1?J:0-J|0)+(((O|0)>-1?O:0-O|0)+(((N|0)>-1?N:0-N|0)+((L|0)>-1?L:0-L|0)))|0;c[j>>2]=(c[j>>2]|0)+((P|0)<255?P:255);c[k>>2]=(c[k>>2]|0)+((K|0)<255?K:255);if((P|0)<(i|0)&(K|0)<(i|0)?(F-E|0)<(h|0)&(E-F|0)<(h|0):0){a[z>>0]=(E+4+(f*3|0)+(C<<1)+A+D|0)>>>3;D=z+e|0;a[D>>0]=((c[s>>2]|0)+(c[q>>2]|0)+(c[p>>2]|0)+((c[r>>2]|0)+(c[n>>2]|0)<<1)+4+(c[o>>2]|0)|0)>>>3;A=D+e|0;a[A>>0]=((c[q>>2]|0)+(c[n>>2]|0)+(c[r>>2]|0)+(c[s>>2]<<1)+(c[p>>2]|0)+(c[o>>2]|0)+4+(c[t>>2]|0)|0)>>>3;D=A+e|0;a[D>>0]=((c[r>>2]|0)+(c[q>>2]|0)+(c[s>>2]|0)+(c[p>>2]<<1)+(c[o>>2]|0)+(c[t>>2]|0)+4+(c[u>>2]|0)|0)>>>3;A=D+e|0;a[A>>0]=((c[s>>2]|0)+(c[r>>2]|0)+(c[p>>2]|0)+(c[o>>2]<<1)+(c[t>>2]|0)+(c[u>>2]|0)+4+(c[v>>2]|0)|0)>>>3;a[A+e>>0]=((c[p>>2]|0)+(c[s>>2]|0)+(c[o>>2]|0)+(c[t>>2]<<1)+(c[u>>2]|0)+(c[v>>2]|0)+4+(c[w>>2]|0)|0)>>>3;a[y>>0]=((c[p>>2]|0)+4+(c[o>>2]|0)+(c[t>>2]|0)+(c[v>>2]|0)+((c[w>>2]|0)+(c[u>>2]|0)<<1)|0)>>>3;Q=((c[o>>2]|0)+4+(c[t>>2]|0)+(c[u>>2]|0)+(c[v>>2]<<1)+((c[w>>2]|0)*3|0)|0)>>>3;R=y}else{a[z>>0]=B;B=z+e|0;a[B>>0]=c[r>>2];A=B+e|0;a[A>>0]=c[s>>2];B=A+e|0;a[B>>0]=c[p>>2];A=B+e|0;a[A>>0]=c[o>>2];B=A+e|0;a[B>>0]=c[t>>2];A=B+e|0;a[A>>0]=c[u>>2];Q=c[v>>2]|0;R=A}a[R+e>>0]=Q;x=x+1|0;if((x|0)==8)break;else{y=y+1|0;z=z+1|0;b=b+1|0}}l=m;return}function eb(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;i=l;l=l+48|0;j=i;k=h+4|0;m=j+20|0;n=j+16|0;o=j+4|0;p=j+8|0;q=j+12|0;r=j+24|0;s=j+28|0;t=j+32|0;u=j+36|0;v=0;w=b;x=b+5|0;y=b+6|0;while(1){b=d[w+-1>>0]|0;c[j>>2]=b;z=d[w>>0]|0;c[o>>2]=z;A=d[w+1>>0]|0;c[p>>2]=A;B=d[w+2>>0]|0;c[q>>2]=B;C=d[w+3>>0]|0;c[n>>2]=C;D=d[w+4>>0]|0;c[m>>2]=D;E=d[w+5>>0]|0;c[r>>2]=E;F=d[w+6>>0]|0;c[s>>2]=F;G=d[w+7>>0]|0;c[t>>2]=G;H=d[w+8>>0]|0;c[u>>2]=H;I=z-b|0;J=D-E|0;K=A-z|0;L=E-F|0;E=B-A|0;M=F-G|0;F=C-B|0;N=((F|0)>-1?F:0-F|0)+(((E|0)>-1?E:0-E|0)+(((K|0)>-1?K:0-K|0)+((I|0)>-1?I:0-I|0)))|0;I=G-H|0;H=((I|0)>-1?I:0-I|0)+(((M|0)>-1?M:0-M|0)+(((L|0)>-1?L:0-L|0)+((J|0)>-1?J:0-J|0)))|0;c[h>>2]=(c[h>>2]|0)+((N|0)<255?N:255);c[k>>2]=(c[k>>2]|0)+((H|0)<255?H:255);if((N|0)<(g|0)&(H|0)<(g|0)?(D-C|0)<(f|0)&(C-D|0)<(f|0):0){a[w>>0]=(C+4+(b*3|0)+(z<<1)+A+B|0)>>>3;a[w+1>>0]=((c[q>>2]|0)+(c[o>>2]|0)+(c[n>>2]|0)+((c[p>>2]|0)+(c[j>>2]|0)<<1)+(c[m>>2]|0)+4|0)>>>3;a[w+2>>0]=((c[o>>2]|0)+(c[j>>2]|0)+(c[p>>2]|0)+(c[q>>2]<<1)+(c[n>>2]|0)+(c[m>>2]|0)+(c[r>>2]|0)+4|0)>>>3;a[w+3>>0]=((c[p>>2]|0)+(c[o>>2]|0)+(c[q>>2]|0)+(c[n>>2]<<1)+(c[m>>2]|0)+(c[r>>2]|0)+(c[s>>2]|0)+4|0)>>>3;a[w+4>>0]=((c[q>>2]|0)+(c[p>>2]|0)+(c[n>>2]|0)+(c[m>>2]<<1)+(c[r>>2]|0)+(c[s>>2]|0)+(c[t>>2]|0)+4|0)>>>3;a[w+5>>0]=((c[n>>2]|0)+(c[q>>2]|0)+(c[m>>2]|0)+(c[r>>2]<<1)+(c[s>>2]|0)+(c[t>>2]|0)+(c[u>>2]|0)+4|0)>>>3;a[y>>0]=((c[n>>2]|0)+4+(c[m>>2]|0)+(c[r>>2]|0)+(c[t>>2]|0)+((c[u>>2]|0)+(c[s>>2]|0)<<1)|0)>>>3;a[x+2>>0]=((c[m>>2]|0)+4+(c[r>>2]|0)+(c[s>>2]|0)+(c[t>>2]<<1)+((c[u>>2]|0)*3|0)|0)>>>3}v=v+1|0;if((v|0)==8)break;else{w=w+e|0;x=x+e|0;y=y+e|0}}l=i;return}function fb(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=l;l=l+576|0;k=j+288|0;m=j;n=g*3|0;o=d[1695+i>>0]|0;p=(o|0)<(n|0)?o:n;n=b+(0-(0-(f>>>2&1^1)&e))|0;o=g+32|0;g=1697+i|0;i=d[g>>0]|0;q=f>>>3&1^1;r=0;s=n;t=b;while(1){u=r<<3;v=(d[t>>0]|0)-(d[s>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+(u<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=(d[t+1>>0]|0)-(d[s+1>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+((u|1)<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=(d[t+2>>0]|0)-(d[s+2>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+((u|2)<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=(d[t+3>>0]|0)-(d[s+3>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+((u|3)<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=(d[t+4>>0]|0)-(d[s+4>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+((u|4)<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=(d[t+5>>0]|0)-(d[s+5>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+((u|5)<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=(d[t+6>>0]|0)-(d[s+6>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+((u|6)<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=(d[t+7>>0]|0)-(d[s+7>>0]|0)|0;w=o-(((v|0)>-1?v:0-v|0)<<i)|0;v=(p|0)<(w|0)?p:w;c[k+((u|7)<<2)>>2]=(w|0)<-64?h:(v|0)>0?v:0;v=t+(0-((r|0)<7|q)&e)|0;r=r+1|0;if((r|0)==9)break;else{w=t;t=v;s=w}}s=0-(f&1^1)|0;t=d[g>>0]|0;g=f>>>1&1;f=g^1;r=0;i=b;w=b+s|0;while(1){v=r<<3;u=(d[i>>0]|0)-(d[w>>0]|0)|0;x=o-(((u|0)>-1?u:0-u|0)<<t)|0;u=(p|0)<(x|0)?p:x;c[m+(v<<2)>>2]=(x|0)<-64?h:(u|0)>0?u:0;u=w+e|0;x=i+e|0;y=(d[x>>0]|0)-(d[u>>0]|0)|0;z=o-(((y|0)>-1?y:0-y|0)<<t)|0;y=(p|0)<(z|0)?p:z;c[m+((v|1)<<2)>>2]=(z|0)<-64?h:(y|0)>0?y:0;y=u+e|0;u=x+e|0;x=(d[u>>0]|0)-(d[y>>0]|0)|0;z=o-(((x|0)>-1?x:0-x|0)<<t)|0;x=(p|0)<(z|0)?p:z;c[m+((v|2)<<2)>>2]=(z|0)<-64?h:(x|0)>0?x:0;x=y+e|0;y=u+e|0;u=(d[y>>0]|0)-(d[x>>0]|0)|0;z=o-(((u|0)>-1?u:0-u|0)<<t)|0;u=(p|0)<(z|0)?p:z;c[m+((v|3)<<2)>>2]=(z|0)<-64?h:(u|0)>0?u:0;u=x+e|0;x=y+e|0;y=(d[x>>0]|0)-(d[u>>0]|0)|0;z=o-(((y|0)>-1?y:0-y|0)<<t)|0;y=(p|0)<(z|0)?p:z;c[m+((v|4)<<2)>>2]=(z|0)<-64?h:(y|0)>0?y:0;y=u+e|0;u=x+e|0;x=(d[u>>0]|0)-(d[y>>0]|0)|0;z=o-(((x|0)>-1?x:0-x|0)<<t)|0;x=(p|0)<(z|0)?p:z;c[m+((v|5)<<2)>>2]=(z|0)<-64?h:(x|0)>0?x:0;x=y+e|0;y=u+e|0;u=(d[y>>0]|0)-(d[x>>0]|0)|0;z=o-(((u|0)>-1?u:0-u|0)<<t)|0;u=(p|0)<(z|0)?p:z;c[m+((v|6)<<2)>>2]=(z|0)<-64?h:(u|0)>0?u:0;u=(d[y+e>>0]|0)-(d[x+e>>0]|0)|0;x=o-(((u|0)>-1?u:0-u|0)<<t)|0;u=(p|0)<(x|0)?p:x;c[m+((v|7)<<2)>>2]=(x|0)<-64?h:(u|0)>0?u:0;u=i+((r|0)<7|f)|0;r=r+1|0;if((r|0)==9)break;else{x=i;i=u;w=x}}w=8-g|0;g=0;i=b;r=b+e|0;f=n;n=b;while(1){b=c[m+(g<<2)>>2]|0;h=(R(d[n+s>>0]|0,b)|0)+64|0;p=g<<3;t=c[k+(p<<2)>>2]|0;o=h+(R(d[f>>0]|0,t)|0)|0;h=g;g=g+1|0;x=g<<3;u=c[k+(x<<2)>>2]|0;v=o+(R(d[r>>0]|0,u)|0)|0;o=c[m+(h+8<<2)>>2]|0;y=v+(R(d[n+1>>0]|0,o)|0)|0;v=y+(R(d[n>>0]|0,128-b-t-u-o|0)|0)>>7;a[i>>0]=(v>>>31)+255&((v|0)<255?v:255);v=1;do{o=c[m+((v<<3)+h<<2)>>2]|0;u=(R(d[n+(v+-1)>>0]|0,o)|0)+64|0;t=c[k+(v+p<<2)>>2]|0;b=u+(R(d[f+v>>0]|0,t)|0)|0;u=c[k+(v+x<<2)>>2]|0;y=b+(R(d[r+v>>0]|0,u)|0)|0;b=v;v=v+1|0;z=c[m+((v<<3)+h<<2)>>2]|0;A=y+(R(d[n+v>>0]|0,z)|0)|0;y=A+(R(d[n+b>>0]|0,128-o-t-u-z|0)|0)>>7;a[i+b>>0]=(y>>>31)+255&((y|0)<255?y:255)}while((v|0)!=7);v=c[m+(h+56<<2)>>2]|0;y=(R(d[n+6>>0]|0,v)|0)+64|0;b=c[k+((p|7)<<2)>>2]|0;z=y+(R(d[f+7>>0]|0,b)|0)|0;y=c[k+((x|7)<<2)>>2]|0;u=z+(R(d[r+7>>0]|0,y)|0)|0;z=c[m+(h+64<<2)>>2]|0;t=u+(R(d[n+w>>0]|0,z)|0)|0;u=t+(R(d[n+7>>0]|0,128-v-b-y-z|0)|0)>>7;a[i+7>>0]=(u>>>31)+255&((u|0)<255?u:255);u=r+(0-((h|0)<6|q)&e)|0;if((g|0)==8)break;else{z=r;y=n;i=i+e|0;r=u;n=z;f=y}}l=j;return}function gb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!d){e=0;f=16}else{g=c[a+48>>2]|0;e=(g&2|0)==0;f=16>>>(g&1^1)}g=c[a+236+(b*48|0)+(d<<4)+8>>2]|0;h=(c[a+236+(b*48|0)+(d<<4)>>2]|0)+(f<<1)|0;i=c[a+236+(b*48|0)+(d<<4)+12>>2]|0;j=0-f|0;f=i+j|0;k=0-g|0;l=R(16>>>(e&1),k)|0;e=f+l|0;if(!l)return;l=f;f=i+(R((c[a+236+(b*48|0)+(d<<4)+4>>2]|0)+-1|0,g)|0)+j|0;do{j=l;l=l+k|0;Hb(l|0,j|0,h|0)|0;j=f;f=f+g|0;Hb(f|0,j|0,h|0)|0}while((l|0)!=(e|0));return}function hb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=l;l=l+128|0;f=e;if((d|0)<4){g=c+2|0;h=(b[c>>1]|0)*46341>>16;i=b[g>>1]|0;j=i*12785>>16;k=i*64277>>16;i=j*46341>>16;m=k*46341>>16;n=m+i|0;o=m-i|0;b[f>>1]=k+h;b[f+16>>1]=n+h;b[f+32>>1]=o+h;b[f+48>>1]=j+h;b[f+64>>1]=h-j;b[f+80>>1]=h-o;b[f+96>>1]=h-n;b[f+112>>1]=h-k;k=c+16|0;h=((b[k>>1]|0)*46341|0)>>>16&65535;b[f+114>>1]=h;b[f+98>>1]=h;b[f+82>>1]=h;b[f+66>>1]=h;b[f+50>>1]=h;b[f+34>>1]=h;b[f+18>>1]=h;b[f+2>>1]=h;h=0;do{n=a+(h<<1)|0;o=f+(h<<3<<1)|0;j=(b[o>>1]|0)*46341>>16;i=b[o+2>>1]|0;o=i*12785>>16;m=i*64277>>16;i=o*46341>>16;p=m*46341>>16;q=p+i|0;r=p-i|0;b[n>>1]=m+j;b[n+16>>1]=q+j;b[n+32>>1]=r+j;b[n+48>>1]=o+j;b[n+64>>1]=j-o;b[n+80>>1]=j-r;b[n+96>>1]=j-q;b[n+112>>1]=j-m;h=h+1|0}while((h|0)!=8);s=0;do{h=a+(s<<1)|0;b[h>>1]=((b[h>>1]|0)+8|0)>>>4;s=s+1|0}while((s|0)!=64);b[k>>1]=0;b[g>>1]=0;b[c>>1]=0;l=e;return}if((d|0)>=11){lb(f,c);lb(f+2|0,c+16|0);lb(f+4|0,c+32|0);lb(f+6|0,c+48|0);lb(f+8|0,c+64|0);lb(f+10|0,c+80|0);lb(f+12|0,c+96|0);lb(f+14|0,c+112|0);lb(a,f);lb(a+2|0,f+16|0);lb(a+4|0,f+32|0);lb(a+6|0,f+48|0);lb(a+8|0,f+64|0);lb(a+10|0,f+80|0);lb(a+12|0,f+96|0);lb(a+14|0,f+112|0);d=0;do{g=a+(d<<1)|0;b[g>>1]=((b[g>>1]|0)+8|0)>>>4;d=d+1|0}while((d|0)!=64);d=c;g=d+128|0;do{b[d>>1]=0;d=d+2|0}while((d|0)<(g|0));l=e;return}d=(b[c>>1]|0)*46341>>16;g=b[c+4>>1]|0;k=g*25080>>16;s=g*60547>>16;g=b[c+2>>1]|0;h=g*12785>>16;m=b[c+6>>1]|0;j=m*36410>>16;n=m*54491>>16;m=g*64277>>16;g=h-j|0;q=(j+h<<16>>16)*46341>>16;h=n+m|0;j=(m-n<<16>>16)*46341>>16;n=k+d|0;m=d-k|0;k=s+d|0;r=d-s|0;s=j+q|0;d=j-q|0;b[f>>1]=h+k;b[f+16>>1]=s+n;b[f+32>>1]=d+m;b[f+48>>1]=g+r;b[f+64>>1]=r-g;b[f+80>>1]=m-d;b[f+96>>1]=n-s;b[f+112>>1]=k-h;h=c+16|0;k=c+18|0;s=c+20|0;n=(b[h>>1]|0)*46341>>16;d=b[s>>1]|0;m=d*25080>>16;g=d*60547>>16;d=b[k>>1]|0;r=d*12785>>16;q=d*64277>>16;d=r*46341>>16;j=q*46341>>16;o=m+n|0;i=n-m|0;m=g+n|0;p=n-g|0;g=j+d|0;n=j-d|0;b[f+2>>1]=m+q;b[f+18>>1]=g+o;b[f+34>>1]=n+i;b[f+50>>1]=p+r;b[f+66>>1]=p-r;b[f+82>>1]=i-n;b[f+98>>1]=o-g;b[f+114>>1]=m-q;q=c+32|0;m=c+34|0;g=(b[q>>1]|0)*46341>>16;o=b[m>>1]|0;n=o*12785>>16;i=o*64277>>16;o=n*46341>>16;r=i*46341>>16;p=r+o|0;d=r-o|0;b[f+4>>1]=i+g;b[f+20>>1]=p+g;b[f+36>>1]=d+g;b[f+52>>1]=n+g;b[f+68>>1]=g-n;b[f+84>>1]=g-d;b[f+100>>1]=g-p;b[f+116>>1]=g-i;i=c+48|0;g=((b[i>>1]|0)*46341|0)>>>16&65535;b[f+118>>1]=g;b[f+102>>1]=g;b[f+86>>1]=g;b[f+70>>1]=g;b[f+54>>1]=g;b[f+38>>1]=g;b[f+22>>1]=g;b[f+6>>1]=g;g=0;do{p=a+(g<<1)|0;d=f+(g<<3<<1)|0;n=(b[d>>1]|0)*46341>>16;o=b[d+4>>1]|0;r=o*25080>>16;j=o*60547>>16;o=b[d+2>>1]|0;t=o*12785>>16;u=b[d+6>>1]|0;d=u*36410>>16;v=u*54491>>16;u=o*64277>>16;o=t-d|0;w=(d+t<<16>>16)*46341>>16;t=v+u|0;d=(u-v<<16>>16)*46341>>16;v=r+n|0;u=n-r|0;r=j+n|0;x=n-j|0;j=d+w|0;n=d-w|0;b[p>>1]=t+r;b[p+16>>1]=j+v;b[p+32>>1]=n+u;b[p+48>>1]=o+x;b[p+64>>1]=x-o;b[p+80>>1]=u-n;b[p+96>>1]=v-j;b[p+112>>1]=r-t;g=g+1|0}while((g|0)!=8);y=0;do{g=a+(y<<1)|0;b[g>>1]=((b[g>>1]|0)+8|0)>>>4;y=y+1|0}while((y|0)!=64);b[i>>1]=0;b[m>>1]=0;b[q>>1]=0;b[s>>1]=0;b[k>>1]=0;b[h>>1]=0;h=c;c=h;b[c>>1]=0;b[c+2>>1]=0>>>16;c=h+4|0;b[c>>1]=0;b[c+2>>1]=0>>>16;l=e;return}function ib(c,d,e){c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c;c=0;while(1){g=c<<3;h=b[e+(g<<1)>>1]|0;i=(h<<16>>16)+128|0;a[f>>0]=h<<16>>16>-129?((i|0)>255?-1:i&255):0;i=b[e+((g|1)<<1)>>1]|0;h=(i<<16>>16)+128|0;a[f+1>>0]=i<<16>>16>-129?((h|0)>255?-1:h&255):0;h=b[e+((g|2)<<1)>>1]|0;i=(h<<16>>16)+128|0;a[f+2>>0]=h<<16>>16>-129?((i|0)>255?-1:i&255):0;i=b[e+((g|3)<<1)>>1]|0;h=(i<<16>>16)+128|0;a[f+3>>0]=i<<16>>16>-129?((h|0)>255?-1:h&255):0;h=b[e+((g|4)<<1)>>1]|0;i=(h<<16>>16)+128|0;a[f+4>>0]=h<<16>>16>-129?((i|0)>255?-1:i&255):0;i=b[e+((g|5)<<1)>>1]|0;h=(i<<16>>16)+128|0;a[f+5>>0]=i<<16>>16>-129?((h|0)>255?-1:h&255):0;h=b[e+((g|6)<<1)>>1]|0;i=(h<<16>>16)+128|0;a[f+6>>0]=h<<16>>16>-129?((i|0)>255?-1:i&255):0;i=b[e+((g|7)<<1)>>1]|0;g=(i<<16>>16)+128|0;a[f+7>>0]=i<<16>>16>-129?((g|0)>255?-1:g&255):0;c=c+1|0;if((c|0)==8)break;else f=f+d|0}return}function jb(c,e,f,g,h){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0;i=c;c=e;e=f;f=0;while(1){j=f<<3;k=(((d[e>>0]|0)+(d[c>>0]|0)|0)>>>1)+(b[h+(j<<1)>>1]|0)|0;a[i>>0]=(k>>>31)+255&((k|0)<255?k:255);k=(((d[e+1>>0]|0)+(d[c+1>>0]|0)|0)>>>1)+(b[h+((j|1)<<1)>>1]|0)|0;a[i+1>>0]=(k>>>31)+255&((k|0)<255?k:255);k=(((d[e+2>>0]|0)+(d[c+2>>0]|0)|0)>>>1)+(b[h+((j|2)<<1)>>1]|0)|0;a[i+2>>0]=(k>>>31)+255&((k|0)<255?k:255);k=(((d[e+3>>0]|0)+(d[c+3>>0]|0)|0)>>>1)+(b[h+((j|3)<<1)>>1]|0)|0;a[i+3>>0]=(k>>>31)+255&((k|0)<255?k:255);k=(((d[e+4>>0]|0)+(d[c+4>>0]|0)|0)>>>1)+(b[h+((j|4)<<1)>>1]|0)|0;a[i+4>>0]=(k>>>31)+255&((k|0)<255?k:255);k=(((d[e+5>>0]|0)+(d[c+5>>0]|0)|0)>>>1)+(b[h+((j|5)<<1)>>1]|0)|0;a[i+5>>0]=(k>>>31)+255&((k|0)<255?k:255);k=(((d[e+6>>0]|0)+(d[c+6>>0]|0)|0)>>>1)+(b[h+((j|6)<<1)>>1]|0)|0;a[i+6>>0]=(k>>>31)+255&((k|0)<255?k:255);k=(((d[e+7>>0]|0)+(d[c+7>>0]|0)|0)>>>1)+(b[h+((j|7)<<1)>>1]|0)|0;a[i+7>>0]=(k>>>31)+255&((k|0)<255?k:255);f=f+1|0;if((f|0)==8)break;else{i=i+g|0;c=c+g|0;e=e+g|0}}return}function kb(c,e,f,g){c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=c;c=e;e=0;while(1){i=e<<3;j=(d[c>>0]|0)+(b[g+(i<<1)>>1]|0)|0;a[h>>0]=(j>>>31)+255&((j|0)<255?j:255);j=(d[c+1>>0]|0)+(b[g+((i|1)<<1)>>1]|0)|0;a[h+1>>0]=(j>>>31)+255&((j|0)<255?j:255);j=(d[c+2>>0]|0)+(b[g+((i|2)<<1)>>1]|0)|0;a[h+2>>0]=(j>>>31)+255&((j|0)<255?j:255);j=(d[c+3>>0]|0)+(b[g+((i|3)<<1)>>1]|0)|0;a[h+3>>0]=(j>>>31)+255&((j|0)<255?j:255);j=(d[c+4>>0]|0)+(b[g+((i|4)<<1)>>1]|0)|0;a[h+4>>0]=(j>>>31)+255&((j|0)<255?j:255);j=(d[c+5>>0]|0)+(b[g+((i|5)<<1)>>1]|0)|0;a[h+5>>0]=(j>>>31)+255&((j|0)<255?j:255);j=(d[c+6>>0]|0)+(b[g+((i|6)<<1)>>1]|0)|0;a[h+6>>0]=(j>>>31)+255&((j|0)<255?j:255);j=(d[c+7>>0]|0)+(b[g+((i|7)<<1)>>1]|0)|0;a[h+7>>0]=(j>>>31)+255&((j|0)<255?j:255);e=e+1|0;if((e|0)==8)break;else{h=h+f|0;c=c+f|0}}return}function lb(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=b[c>>1]|0;e=b[c+8>>1]|0;f=(e+d<<16>>16)*46341>>16;g=(d-e<<16>>16)*46341>>16;e=b[c+4>>1]|0;d=b[c+12>>1]|0;h=(e*25080>>16)-(d*60547>>16)|0;i=(d*25080>>16)+(e*60547>>16)|0;e=b[c+2>>1]|0;d=b[c+14>>1]|0;j=(e*12785>>16)-(d*64277>>16)|0;k=b[c+10>>1]|0;l=b[c+6>>1]|0;c=(k*54491>>16)-(l*36410>>16)|0;m=(l*54491>>16)+(k*36410>>16)|0;k=(d*12785>>16)+(e*64277>>16)|0;e=c+j|0;d=(j-c<<16>>16)*46341>>16;c=m+k|0;j=(k-m<<16>>16)*46341>>16;m=f+i|0;k=f-i|0;i=g+h|0;f=g-h|0;h=j+d|0;g=j-d|0;b[a>>1]=c+m;b[a+16>>1]=h+i;b[a+32>>1]=g+f;b[a+48>>1]=e+k;b[a+64>>1]=k-e;b[a+80>>1]=f-g;b[a+96>>1]=i-h;b[a+112>>1]=m-c;return}function mb(a,b){a=a|0;b=b|0;var c=0;if((a|0)==0|(b|0)==0){c=-1;return c|0}La(b,a+54056|0);c=0;return c|0}function nb(b){b=b|0;var d=0,e=0;d=b;e=d+60|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));a[b>>0]=3;a[b+1>>0]=2;a[b+2>>0]=1;c[b+60>>2]=6;return}function ob(){ua(1960);nb(1976);return}function pb(){return 0}function qb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+32|0;e=d;tb(e,a,b);f=c[489]|0;if(!f)c[e+8>>2]=256;c[489]=f+1;f=Qa(1976,1960,2040,e)|0;if(f|0){g=(f|0)>0&1;l=d;return g|0}c[511]=Aa(1976,c[510]|0)|0;f=c[506]|0;e=c[497]|0;h=c[498]|0;i=c[503]|0;j=c[504]|0;if((i|0)!=0&(j|0)!=0)k=((R(i,e)|0)>>>0)/(j>>>0)|0;else k=e;j=c[495]|0;i=c[496]|0;ea(j|0,i|0,j>>>(f&1^1)|0,i>>>(f>>>1&1^1)|0,0.0,e|0,h|0,c[499]|0,c[500]|0,k|0,h|0);g=rb(a,b)|0;l=d;return g|0}function rb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+80|0;e=d;f=d+32|0;tb(e,a,b);if((Xa(c[511]|0,e,0)|0|1|0)!=1){g=0;l=d;return g|0}mb(c[511]|0,f)|0;e=c[506]|0;b=c[495]|0;a=c[496]|0;aa(c[f+12>>2]|0,c[f+8>>2]|0,c[f+28>>2]|0,c[f+24>>2]|0,c[f+44>>2]|0,c[f+40>>2]|0,b|0,a|0,b>>>(e&1^1)|0,a>>>(e>>>1&1^1)|0);g=1;l=d;return g|0}function sb(){var a=0;a=c[511]|0;if(a|0){Ba(a);c[511]=0}va(1960);Ra(1976);return}function tb(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=d;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;return}function ub(){return 2048}function vb(){return (wb()|0)+64|0}function wb(){return xb()|0}function xb(){return 552}function yb(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=b;g=d;h=c;while(1){i=a[f>>0]|0;j=a[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}\nfunction zb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;b=l;l=l+16|0;d=b;do if(a>>>0<245){e=a>>>0<11?16:a+11&-8;f=e>>>3;g=c[528]|0;h=g>>>f;if(h&3|0){i=(h&1^1)+f|0;j=2152+(i<<1<<2)|0;k=j+8|0;m=c[k>>2]|0;n=m+8|0;o=c[n>>2]|0;do if((j|0)!=(o|0)){if(o>>>0<(c[532]|0)>>>0)ca();p=o+12|0;if((c[p>>2]|0)==(m|0)){c[p>>2]=j;c[k>>2]=o;break}else ca()}else c[528]=g&~(1<<i);while(0);o=i<<3;c[m+4>>2]=o|3;k=m+o+4|0;c[k>>2]=c[k>>2]|1;q=n;l=b;return q|0}k=c[530]|0;if(e>>>0>k>>>0){if(h|0){o=2<<f;j=h<<f&(o|0-o);o=(j&0-j)+-1|0;j=o>>>12&16;p=o>>>j;o=p>>>5&8;r=p>>>o;p=r>>>2&4;s=r>>>p;r=s>>>1&2;t=s>>>r;s=t>>>1&1;u=(o|j|p|r|s)+(t>>>s)|0;s=2152+(u<<1<<2)|0;t=s+8|0;r=c[t>>2]|0;p=r+8|0;j=c[p>>2]|0;do if((s|0)!=(j|0)){if(j>>>0<(c[532]|0)>>>0)ca();o=j+12|0;if((c[o>>2]|0)==(r|0)){c[o>>2]=s;c[t>>2]=j;v=g;break}else ca()}else{o=g&~(1<<u);c[528]=o;v=o}while(0);j=(u<<3)-e|0;c[r+4>>2]=e|3;t=r+e|0;c[t+4>>2]=j|1;c[t+j>>2]=j;if(k|0){s=c[533]|0;f=k>>>3;h=2152+(f<<1<<2)|0;n=1<<f;if(v&n){f=h+8|0;m=c[f>>2]|0;if(m>>>0<(c[532]|0)>>>0)ca();else{w=f;x=m}}else{c[528]=v|n;w=h+8|0;x=h}c[w>>2]=s;c[x+12>>2]=s;c[s+8>>2]=x;c[s+12>>2]=h}c[530]=j;c[533]=t;q=p;l=b;return q|0}t=c[529]|0;if(t){j=(t&0-t)+-1|0;h=j>>>12&16;s=j>>>h;j=s>>>5&8;n=s>>>j;s=n>>>2&4;m=n>>>s;n=m>>>1&2;f=m>>>n;m=f>>>1&1;i=c[2416+((j|h|s|n|m)+(f>>>m)<<2)>>2]|0;m=(c[i+4>>2]&-8)-e|0;f=c[i+16+(((c[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){y=m;z=i}else{n=f;f=m;m=i;while(1){i=(c[n+4>>2]&-8)-e|0;s=i>>>0<f>>>0;h=s?i:f;i=s?n:m;n=c[n+16+(((c[n+16>>2]|0)==0&1)<<2)>>2]|0;if(!n){y=h;z=i;break}else{f=h;m=i}}}m=c[532]|0;if(z>>>0<m>>>0)ca();f=z+e|0;if(z>>>0>=f>>>0)ca();n=c[z+24>>2]|0;p=c[z+12>>2]|0;do if((p|0)==(z|0)){r=z+20|0;u=c[r>>2]|0;if(!u){i=z+16|0;h=c[i>>2]|0;if(!h){A=0;break}else{B=h;C=i}}else{B=u;C=r}while(1){r=B+20|0;u=c[r>>2]|0;if(u|0){B=u;C=r;continue}r=B+16|0;u=c[r>>2]|0;if(!u)break;else{B=u;C=r}}if(C>>>0<m>>>0)ca();else{c[C>>2]=0;A=B;break}}else{r=c[z+8>>2]|0;if(r>>>0<m>>>0)ca();u=r+12|0;if((c[u>>2]|0)!=(z|0))ca();i=p+8|0;if((c[i>>2]|0)==(z|0)){c[u>>2]=p;c[i>>2]=r;A=p;break}else ca()}while(0);a:do if(n|0){p=c[z+28>>2]|0;m=2416+(p<<2)|0;do if((z|0)==(c[m>>2]|0)){c[m>>2]=A;if(!A){c[529]=t&~(1<<p);break a}}else if(n>>>0>=(c[532]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(z|0)&1)<<2)>>2]=A;if(!A)break a;else break}else ca();while(0);p=c[532]|0;if(A>>>0<p>>>0)ca();c[A+24>>2]=n;m=c[z+16>>2]|0;do if(m|0)if(m>>>0<p>>>0)ca();else{c[A+16>>2]=m;c[m+24>>2]=A;break}while(0);m=c[z+20>>2]|0;if(m|0)if(m>>>0<(c[532]|0)>>>0)ca();else{c[A+20>>2]=m;c[m+24>>2]=A;break}}while(0);if(y>>>0<16){n=y+e|0;c[z+4>>2]=n|3;t=z+n+4|0;c[t>>2]=c[t>>2]|1}else{c[z+4>>2]=e|3;c[f+4>>2]=y|1;c[f+y>>2]=y;if(k|0){t=c[533]|0;n=k>>>3;m=2152+(n<<1<<2)|0;p=1<<n;if(g&p){n=m+8|0;r=c[n>>2]|0;if(r>>>0<(c[532]|0)>>>0)ca();else{D=n;E=r}}else{c[528]=g|p;D=m+8|0;E=m}c[D>>2]=t;c[E+12>>2]=t;c[t+8>>2]=E;c[t+12>>2]=m}c[530]=y;c[533]=f}q=z+8|0;l=b;return q|0}else F=e}else F=e}else if(a>>>0<=4294967231){m=a+11|0;t=m&-8;p=c[529]|0;if(p){r=0-t|0;n=m>>>8;if(n)if(t>>>0>16777215)G=31;else{m=(n+1048320|0)>>>16&8;i=n<<m;n=(i+520192|0)>>>16&4;u=i<<n;i=(u+245760|0)>>>16&2;h=14-(n|m|i)+(u<<i>>>15)|0;G=t>>>(h+7|0)&1|h<<1}else G=0;h=c[2416+(G<<2)>>2]|0;b:do if(!h){H=r;I=0;J=0;K=81}else{i=r;u=0;m=t<<((G|0)==31?0:25-(G>>>1)|0);n=h;s=0;while(1){j=(c[n+4>>2]&-8)-t|0;if(j>>>0<i>>>0)if(!j){L=0;M=n;N=n;K=85;break b}else{O=j;P=n}else{O=i;P=s}j=c[n+20>>2]|0;n=c[n+16+(m>>>31<<2)>>2]|0;o=(j|0)==0|(j|0)==(n|0)?u:j;j=(n|0)==0;if(j){H=O;I=o;J=P;K=81;break}else{i=O;u=o;m=m<<((j^1)&1);s=P}}}while(0);if((K|0)==81){if((I|0)==0&(J|0)==0){h=2<<G;r=p&(h|0-h);if(!r){F=t;break}h=(r&0-r)+-1|0;r=h>>>12&16;e=h>>>r;h=e>>>5&8;f=e>>>h;e=f>>>2&4;g=f>>>e;f=g>>>1&2;k=g>>>f;g=k>>>1&1;Q=c[2416+((h|r|e|f|g)+(k>>>g)<<2)>>2]|0;R=0}else{Q=I;R=J}if(!Q){S=H;T=R}else{L=H;M=Q;N=R;K=85}}if((K|0)==85)while(1){K=0;g=(c[M+4>>2]&-8)-t|0;k=g>>>0<L>>>0;f=k?g:L;g=k?M:N;M=c[M+16+(((c[M+16>>2]|0)==0&1)<<2)>>2]|0;if(!M){S=f;T=g;break}else{L=f;N=g;K=85}}if((T|0)!=0?S>>>0<((c[530]|0)-t|0)>>>0:0){g=c[532]|0;if(T>>>0<g>>>0)ca();f=T+t|0;if(T>>>0>=f>>>0)ca();k=c[T+24>>2]|0;e=c[T+12>>2]|0;do if((e|0)==(T|0)){r=T+20|0;h=c[r>>2]|0;if(!h){s=T+16|0;m=c[s>>2]|0;if(!m){U=0;break}else{V=m;W=s}}else{V=h;W=r}while(1){r=V+20|0;h=c[r>>2]|0;if(h|0){V=h;W=r;continue}r=V+16|0;h=c[r>>2]|0;if(!h)break;else{V=h;W=r}}if(W>>>0<g>>>0)ca();else{c[W>>2]=0;U=V;break}}else{r=c[T+8>>2]|0;if(r>>>0<g>>>0)ca();h=r+12|0;if((c[h>>2]|0)!=(T|0))ca();s=e+8|0;if((c[s>>2]|0)==(T|0)){c[h>>2]=e;c[s>>2]=r;U=e;break}else ca()}while(0);c:do if(k){e=c[T+28>>2]|0;g=2416+(e<<2)|0;do if((T|0)==(c[g>>2]|0)){c[g>>2]=U;if(!U){r=p&~(1<<e);c[529]=r;X=r;break c}}else if(k>>>0>=(c[532]|0)>>>0){c[k+16+(((c[k+16>>2]|0)!=(T|0)&1)<<2)>>2]=U;if(!U){X=p;break c}else break}else ca();while(0);e=c[532]|0;if(U>>>0<e>>>0)ca();c[U+24>>2]=k;g=c[T+16>>2]|0;do if(g|0)if(g>>>0<e>>>0)ca();else{c[U+16>>2]=g;c[g+24>>2]=U;break}while(0);g=c[T+20>>2]|0;if(g)if(g>>>0<(c[532]|0)>>>0)ca();else{c[U+20>>2]=g;c[g+24>>2]=U;X=p;break}else X=p}else X=p;while(0);do if(S>>>0>=16){c[T+4>>2]=t|3;c[f+4>>2]=S|1;c[f+S>>2]=S;p=S>>>3;if(S>>>0<256){k=2152+(p<<1<<2)|0;g=c[528]|0;e=1<<p;if(g&e){p=k+8|0;r=c[p>>2]|0;if(r>>>0<(c[532]|0)>>>0)ca();else{Y=p;Z=r}}else{c[528]=g|e;Y=k+8|0;Z=k}c[Y>>2]=f;c[Z+12>>2]=f;c[f+8>>2]=Z;c[f+12>>2]=k;break}k=S>>>8;if(k)if(S>>>0>16777215)_=31;else{e=(k+1048320|0)>>>16&8;g=k<<e;k=(g+520192|0)>>>16&4;r=g<<k;g=(r+245760|0)>>>16&2;p=14-(k|e|g)+(r<<g>>>15)|0;_=S>>>(p+7|0)&1|p<<1}else _=0;p=2416+(_<<2)|0;c[f+28>>2]=_;g=f+16|0;c[g+4>>2]=0;c[g>>2]=0;g=1<<_;if(!(X&g)){c[529]=X|g;c[p>>2]=f;c[f+24>>2]=p;c[f+12>>2]=f;c[f+8>>2]=f;break}g=S<<((_|0)==31?0:25-(_>>>1)|0);r=c[p>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(S|0)){K=139;break}$=r+16+(g>>>31<<2)|0;p=c[$>>2]|0;if(!p){K=136;break}else{g=g<<1;r=p}}if((K|0)==136)if($>>>0<(c[532]|0)>>>0)ca();else{c[$>>2]=f;c[f+24>>2]=r;c[f+12>>2]=f;c[f+8>>2]=f;break}else if((K|0)==139){g=r+8|0;p=c[g>>2]|0;e=c[532]|0;if(p>>>0>=e>>>0&r>>>0>=e>>>0){c[p+12>>2]=f;c[g>>2]=f;c[f+8>>2]=p;c[f+12>>2]=r;c[f+24>>2]=0;break}else ca()}}else{p=S+t|0;c[T+4>>2]=p|3;g=T+p+4|0;c[g>>2]=c[g>>2]|1}while(0);q=T+8|0;l=b;return q|0}else F=t}else F=t}else F=-1;while(0);T=c[530]|0;if(T>>>0>=F>>>0){S=T-F|0;$=c[533]|0;if(S>>>0>15){_=$+F|0;c[533]=_;c[530]=S;c[_+4>>2]=S|1;c[_+S>>2]=S;c[$+4>>2]=F|3}else{c[530]=0;c[533]=0;c[$+4>>2]=T|3;S=$+T+4|0;c[S>>2]=c[S>>2]|1}q=$+8|0;l=b;return q|0}$=c[531]|0;if($>>>0>F>>>0){S=$-F|0;c[531]=S;T=c[534]|0;_=T+F|0;c[534]=_;c[_+4>>2]=S|1;c[T+4>>2]=F|3;q=T+8|0;l=b;return q|0}if(!(c[646]|0)){c[648]=4096;c[647]=4096;c[649]=-1;c[650]=-1;c[651]=0;c[639]=0;T=d&-16^1431655768;c[d>>2]=T;c[646]=T;aa=4096}else aa=c[648]|0;T=F+48|0;d=F+47|0;S=aa+d|0;_=0-aa|0;aa=S&_;if(aa>>>0<=F>>>0){q=0;l=b;return q|0}X=c[638]|0;if(X|0?(Z=c[636]|0,Y=Z+aa|0,Y>>>0<=Z>>>0|Y>>>0>X>>>0):0){q=0;l=b;return q|0}d:do if(!(c[639]&4)){X=c[534]|0;e:do if(X){Y=2560;while(1){Z=c[Y>>2]|0;if(Z>>>0<=X>>>0?(ba=Y+4|0,(Z+(c[ba>>2]|0)|0)>>>0>X>>>0):0)break;Z=c[Y+8>>2]|0;if(!Z){K=163;break e}else Y=Z}r=S-$&_;if(r>>>0<2147483647){Z=Eb(r|0)|0;if((Z|0)==((c[Y>>2]|0)+(c[ba>>2]|0)|0))if((Z|0)==(-1|0))da=r;else{ea=Z;fa=r;K=180;break d}else{ga=Z;ha=r;K=171}}else da=0}else K=163;while(0);do if((K|0)==163){X=Eb(0)|0;if((X|0)!=(-1|0)?(t=X,r=c[647]|0,Z=r+-1|0,U=((Z&t|0)==0?0:(Z+t&0-r)-t|0)+aa|0,t=c[636]|0,r=U+t|0,U>>>0>F>>>0&U>>>0<2147483647):0){Z=c[638]|0;if(Z|0?r>>>0<=t>>>0|r>>>0>Z>>>0:0){da=0;break}Z=Eb(U|0)|0;if((Z|0)==(X|0)){ea=X;fa=U;K=180;break d}else{ga=Z;ha=U;K=171}}else da=0}while(0);do if((K|0)==171){U=0-ha|0;if(!(T>>>0>ha>>>0&(ha>>>0<2147483647&(ga|0)!=(-1|0))))if((ga|0)==(-1|0)){da=0;break}else{ea=ga;fa=ha;K=180;break d}Z=c[648]|0;X=d-ha+Z&0-Z;if(X>>>0>=2147483647){ea=ga;fa=ha;K=180;break d}if((Eb(X|0)|0)==(-1|0)){Eb(U|0)|0;da=0;break}else{ea=ga;fa=X+ha|0;K=180;break d}}while(0);c[639]=c[639]|4;ia=da;K=178}else{ia=0;K=178}while(0);if(((K|0)==178?aa>>>0<2147483647:0)?(da=Eb(aa|0)|0,aa=Eb(0)|0,ha=aa-da|0,ga=ha>>>0>(F+40|0)>>>0,!((da|0)==(-1|0)|ga^1|da>>>0<aa>>>0&((da|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){ea=da;fa=ga?ha:ia;K=180}if((K|0)==180){ia=(c[636]|0)+fa|0;c[636]=ia;if(ia>>>0>(c[637]|0)>>>0)c[637]=ia;ia=c[534]|0;do if(ia){ha=2560;while(1){ja=c[ha>>2]|0;ka=ha+4|0;la=c[ka>>2]|0;if((ea|0)==(ja+la|0)){K=190;break}ga=c[ha+8>>2]|0;if(!ga)break;else ha=ga}if(((K|0)==190?(c[ha+12>>2]&8|0)==0:0)?ia>>>0<ea>>>0&ia>>>0>=ja>>>0:0){c[ka>>2]=la+fa;ga=ia+8|0;da=(ga&7|0)==0?0:0-ga&7;ga=ia+da|0;aa=(c[531]|0)+(fa-da)|0;c[534]=ga;c[531]=aa;c[ga+4>>2]=aa|1;c[ga+aa+4>>2]=40;c[535]=c[650];break}aa=c[532]|0;if(ea>>>0<aa>>>0){c[532]=ea;ma=ea}else ma=aa;aa=ea+fa|0;ga=2560;while(1){if((c[ga>>2]|0)==(aa|0)){K=198;break}da=c[ga+8>>2]|0;if(!da)break;else ga=da}if((K|0)==198?(c[ga+12>>2]&8|0)==0:0){c[ga>>2]=ea;ha=ga+4|0;c[ha>>2]=(c[ha>>2]|0)+fa;ha=ea+8|0;da=ea+((ha&7|0)==0?0:0-ha&7)|0;ha=aa+8|0;d=aa+((ha&7|0)==0?0:0-ha&7)|0;ha=da+F|0;T=d-da-F|0;c[da+4>>2]=F|3;do if((d|0)!=(ia|0)){if((d|0)==(c[533]|0)){ba=(c[530]|0)+T|0;c[530]=ba;c[533]=ha;c[ha+4>>2]=ba|1;c[ha+ba>>2]=ba;break}ba=c[d+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;f:do if(ba>>>0>=256){S=c[d+24>>2]|0;X=c[d+12>>2]|0;do if((X|0)==(d|0)){U=d+16|0;Z=U+4|0;r=c[Z>>2]|0;if(!r){t=c[U>>2]|0;if(!t){na=0;break}else{oa=t;pa=U}}else{oa=r;pa=Z}while(1){Z=oa+20|0;r=c[Z>>2]|0;if(r|0){oa=r;pa=Z;continue}Z=oa+16|0;r=c[Z>>2]|0;if(!r)break;else{oa=r;pa=Z}}if(pa>>>0<ma>>>0)ca();else{c[pa>>2]=0;na=oa;break}}else{Z=c[d+8>>2]|0;if(Z>>>0<ma>>>0)ca();r=Z+12|0;if((c[r>>2]|0)!=(d|0))ca();U=X+8|0;if((c[U>>2]|0)==(d|0)){c[r>>2]=X;c[U>>2]=Z;na=X;break}else ca()}while(0);if(!S)break;X=c[d+28>>2]|0;Z=2416+(X<<2)|0;do if((d|0)!=(c[Z>>2]|0))if(S>>>0>=(c[532]|0)>>>0){c[S+16+(((c[S+16>>2]|0)!=(d|0)&1)<<2)>>2]=na;if(!na)break f;else break}else ca();else{c[Z>>2]=na;if(na|0)break;c[529]=c[529]&~(1<<X);break f}while(0);X=c[532]|0;if(na>>>0<X>>>0)ca();c[na+24>>2]=S;Z=d+16|0;U=c[Z>>2]|0;do if(U|0)if(U>>>0<X>>>0)ca();else{c[na+16>>2]=U;c[U+24>>2]=na;break}while(0);U=c[Z+4>>2]|0;if(!U)break;if(U>>>0<(c[532]|0)>>>0)ca();else{c[na+20>>2]=U;c[U+24>>2]=na;break}}else{U=c[d+8>>2]|0;X=c[d+12>>2]|0;S=2152+($<<1<<2)|0;do if((U|0)!=(S|0)){if(U>>>0<ma>>>0)ca();if((c[U+12>>2]|0)==(d|0))break;ca()}while(0);if((X|0)==(U|0)){c[528]=c[528]&~(1<<$);break}do if((X|0)==(S|0))qa=X+8|0;else{if(X>>>0<ma>>>0)ca();Z=X+8|0;if((c[Z>>2]|0)==(d|0)){qa=Z;break}ca()}while(0);c[U+12>>2]=X;c[qa>>2]=U}while(0);ra=d+_|0;sa=_+T|0}else{ra=d;sa=T}$=ra+4|0;c[$>>2]=c[$>>2]&-2;c[ha+4>>2]=sa|1;c[ha+sa>>2]=sa;$=sa>>>3;if(sa>>>0<256){ba=2152+($<<1<<2)|0;Y=c[528]|0;S=1<<$;do if(!(Y&S)){c[528]=Y|S;ta=ba+8|0;ua=ba}else{$=ba+8|0;Z=c[$>>2]|0;if(Z>>>0>=(c[532]|0)>>>0){ta=$;ua=Z;break}ca()}while(0);c[ta>>2]=ha;c[ua+12>>2]=ha;c[ha+8>>2]=ua;c[ha+12>>2]=ba;break}S=sa>>>8;do if(!S)va=0;else{if(sa>>>0>16777215){va=31;break}Y=(S+1048320|0)>>>16&8;_=S<<Y;Z=(_+520192|0)>>>16&4;$=_<<Z;_=($+245760|0)>>>16&2;r=14-(Z|Y|_)+($<<_>>>15)|0;va=sa>>>(r+7|0)&1|r<<1}while(0);S=2416+(va<<2)|0;c[ha+28>>2]=va;ba=ha+16|0;c[ba+4>>2]=0;c[ba>>2]=0;ba=c[529]|0;r=1<<va;if(!(ba&r)){c[529]=ba|r;c[S>>2]=ha;c[ha+24>>2]=S;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}r=sa<<((va|0)==31?0:25-(va>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(sa|0)){K=265;break}wa=ba+16+(r>>>31<<2)|0;S=c[wa>>2]|0;if(!S){K=262;break}else{r=r<<1;ba=S}}if((K|0)==262)if(wa>>>0<(c[532]|0)>>>0)ca();else{c[wa>>2]=ha;c[ha+24>>2]=ba;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}else if((K|0)==265){r=ba+8|0;S=c[r>>2]|0;_=c[532]|0;if(S>>>0>=_>>>0&ba>>>0>=_>>>0){c[S+12>>2]=ha;c[r>>2]=ha;c[ha+8>>2]=S;c[ha+12>>2]=ba;c[ha+24>>2]=0;break}else ca()}}else{S=(c[531]|0)+T|0;c[531]=S;c[534]=ha;c[ha+4>>2]=S|1}while(0);q=da+8|0;l=b;return q|0}ha=2560;while(1){T=c[ha>>2]|0;if(T>>>0<=ia>>>0?(xa=T+(c[ha+4>>2]|0)|0,xa>>>0>ia>>>0):0)break;ha=c[ha+8>>2]|0}ha=xa+-47|0;da=ha+8|0;T=ha+((da&7|0)==0?0:0-da&7)|0;da=ia+16|0;ha=T>>>0<da>>>0?ia:T;T=ha+8|0;d=ea+8|0;aa=(d&7|0)==0?0:0-d&7;d=ea+aa|0;ga=fa+-40-aa|0;c[534]=d;c[531]=ga;c[d+4>>2]=ga|1;c[d+ga+4>>2]=40;c[535]=c[650];ga=ha+4|0;c[ga>>2]=27;c[T>>2]=c[640];c[T+4>>2]=c[641];c[T+8>>2]=c[642];c[T+12>>2]=c[643];c[640]=ea;c[641]=fa;c[643]=0;c[642]=T;T=ha+24|0;do{d=T;T=T+4|0;c[T>>2]=7}while((d+8|0)>>>0<xa>>>0);if((ha|0)!=(ia|0)){T=ha-ia|0;c[ga>>2]=c[ga>>2]&-2;c[ia+4>>2]=T|1;c[ha>>2]=T;d=T>>>3;if(T>>>0<256){aa=2152+(d<<1<<2)|0;S=c[528]|0;r=1<<d;if(S&r){d=aa+8|0;_=c[d>>2]|0;if(_>>>0<(c[532]|0)>>>0)ca();else{ya=d;za=_}}else{c[528]=S|r;ya=aa+8|0;za=aa}c[ya>>2]=ia;c[za+12>>2]=ia;c[ia+8>>2]=za;c[ia+12>>2]=aa;break}aa=T>>>8;if(aa)if(T>>>0>16777215)Aa=31;else{r=(aa+1048320|0)>>>16&8;S=aa<<r;aa=(S+520192|0)>>>16&4;_=S<<aa;S=(_+245760|0)>>>16&2;d=14-(aa|r|S)+(_<<S>>>15)|0;Aa=T>>>(d+7|0)&1|d<<1}else Aa=0;d=2416+(Aa<<2)|0;c[ia+28>>2]=Aa;c[ia+20>>2]=0;c[da>>2]=0;S=c[529]|0;_=1<<Aa;if(!(S&_)){c[529]=S|_;c[d>>2]=ia;c[ia+24>>2]=d;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break}_=T<<((Aa|0)==31?0:25-(Aa>>>1)|0);S=c[d>>2]|0;while(1){if((c[S+4>>2]&-8|0)==(T|0)){K=292;break}Ba=S+16+(_>>>31<<2)|0;d=c[Ba>>2]|0;if(!d){K=289;break}else{_=_<<1;S=d}}if((K|0)==289)if(Ba>>>0<(c[532]|0)>>>0)ca();else{c[Ba>>2]=ia;c[ia+24>>2]=S;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break}else if((K|0)==292){_=S+8|0;T=c[_>>2]|0;da=c[532]|0;if(T>>>0>=da>>>0&S>>>0>=da>>>0){c[T+12>>2]=ia;c[_>>2]=ia;c[ia+8>>2]=T;c[ia+12>>2]=S;c[ia+24>>2]=0;break}else ca()}}}else{T=c[532]|0;if((T|0)==0|ea>>>0<T>>>0)c[532]=ea;c[640]=ea;c[641]=fa;c[643]=0;c[537]=c[646];c[536]=-1;T=0;do{_=2152+(T<<1<<2)|0;c[_+12>>2]=_;c[_+8>>2]=_;T=T+1|0}while((T|0)!=32);T=ea+8|0;S=(T&7|0)==0?0:0-T&7;T=ea+S|0;_=fa+-40-S|0;c[534]=T;c[531]=_;c[T+4>>2]=_|1;c[T+_+4>>2]=40;c[535]=c[650]}while(0);fa=c[531]|0;if(fa>>>0>F>>>0){ea=fa-F|0;c[531]=ea;fa=c[534]|0;ia=fa+F|0;c[534]=ia;c[ia+4>>2]=ea|1;c[fa+4>>2]=F|3;q=fa+8|0;l=b;return q|0}}c[(vb()|0)>>2]=12;q=0;l=b;return q|0}function Ab(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;if(!a)return;b=a+-8|0;d=c[532]|0;if(b>>>0<d>>>0)ca();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)ca();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(!a)return;i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)ca();if((i|0)==(c[533]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;break}c[530]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;return}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;p=2152+(l<<1<<2)|0;if((h|0)!=(p|0)){if(h>>>0<d>>>0)ca();if((c[h+12>>2]|0)!=(i|0))ca()}if((k|0)==(h|0)){c[528]=c[528]&~(1<<l);m=i;n=i;o=j;break}if((k|0)!=(p|0)){if(k>>>0<d>>>0)ca();p=k+8|0;if((c[p>>2]|0)==(i|0))q=p;else ca()}else q=k+8|0;c[h+12>>2]=k;c[q>>2]=h;m=i;n=i;o=j;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){p=i+16|0;l=p+4|0;r=c[l>>2]|0;if(!r){s=c[p>>2]|0;if(!s){t=0;break}else{u=s;v=p}}else{u=r;v=l}while(1){l=u+20|0;r=c[l>>2]|0;if(r|0){u=r;v=l;continue}l=u+16|0;r=c[l>>2]|0;if(!r)break;else{u=r;v=l}}if(v>>>0<d>>>0)ca();else{c[v>>2]=0;t=u;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)ca();r=l+12|0;if((c[r>>2]|0)!=(i|0))ca();p=k+8|0;if((c[p>>2]|0)==(i|0)){c[r>>2]=k;c[p>>2]=l;t=k;break}else ca()}while(0);if(h){k=c[i+28>>2]|0;l=2416+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=t;if(!t){c[529]=c[529]&~(1<<k);m=i;n=i;o=j;break a}}else if(h>>>0>=(c[532]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=t;if(!t){m=i;n=i;o=j;break a}else break}else ca();while(0);k=c[532]|0;if(t>>>0<k>>>0)ca();c[t+24>>2]=h;l=i+16|0;p=c[l>>2]|0;do if(p|0)if(p>>>0<k>>>0)ca();else{c[t+16>>2]=p;c[p+24>>2]=t;break}while(0);p=c[l+4>>2]|0;if(p)if(p>>>0<(c[532]|0)>>>0)ca();else{c[t+20>>2]=p;c[p+24>>2]=t;m=i;n=i;o=j;break}else{m=i;n=i;o=j}}else{m=i;n=i;o=j}}else{m=b;n=b;o=f}while(0);if(m>>>0>=g>>>0)ca();f=g+4|0;b=c[f>>2]|0;if(!(b&1))ca();if(!(b&2)){t=c[533]|0;if((g|0)==(c[534]|0)){d=(c[531]|0)+o|0;c[531]=d;c[534]=n;c[n+4>>2]=d|1;if((n|0)!=(t|0))return;c[533]=0;c[530]=0;return}if((g|0)==(t|0)){t=(c[530]|0)+o|0;c[530]=t;c[533]=m;c[n+4>>2]=t|1;c[m+t>>2]=t;return}t=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){u=c[g+24>>2]|0;v=c[g+12>>2]|0;do if((v|0)==(g|0)){q=g+16|0;a=q+4|0;e=c[a>>2]|0;if(!e){p=c[q>>2]|0;if(!p){w=0;break}else{x=p;y=q}}else{x=e;y=a}while(1){a=x+20|0;e=c[a>>2]|0;if(e|0){x=e;y=a;continue}a=x+16|0;e=c[a>>2]|0;if(!e)break;else{x=e;y=a}}if(y>>>0<(c[532]|0)>>>0)ca();else{c[y>>2]=0;w=x;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[532]|0)>>>0)ca();e=a+12|0;if((c[e>>2]|0)!=(g|0))ca();q=v+8|0;if((c[q>>2]|0)==(g|0)){c[e>>2]=v;c[q>>2]=a;w=v;break}else ca()}while(0);if(u|0){v=c[g+28>>2]|0;j=2416+(v<<2)|0;do if((g|0)==(c[j>>2]|0)){c[j>>2]=w;if(!w){c[529]=c[529]&~(1<<v);break b}}else if(u>>>0>=(c[532]|0)>>>0){c[u+16+(((c[u+16>>2]|0)!=(g|0)&1)<<2)>>2]=w;if(!w)break b;else break}else ca();while(0);v=c[532]|0;if(w>>>0<v>>>0)ca();c[w+24>>2]=u;j=g+16|0;i=c[j>>2]|0;do if(i|0)if(i>>>0<v>>>0)ca();else{c[w+16>>2]=i;c[i+24>>2]=w;break}while(0);i=c[j+4>>2]|0;if(i|0)if(i>>>0<(c[532]|0)>>>0)ca();else{c[w+20>>2]=i;c[i+24>>2]=w;break}}}else{i=c[g+8>>2]|0;v=c[g+12>>2]|0;u=2152+(d<<1<<2)|0;if((i|0)!=(u|0)){if(i>>>0<(c[532]|0)>>>0)ca();if((c[i+12>>2]|0)!=(g|0))ca()}if((v|0)==(i|0)){c[528]=c[528]&~(1<<d);break}if((v|0)!=(u|0)){if(v>>>0<(c[532]|0)>>>0)ca();u=v+8|0;if((c[u>>2]|0)==(g|0))z=u;else ca()}else z=v+8|0;c[i+12>>2]=v;c[z>>2]=i}while(0);c[n+4>>2]=t|1;c[m+t>>2]=t;if((n|0)==(c[533]|0)){c[530]=t;return}else A=t}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;A=o}o=A>>>3;if(A>>>0<256){m=2152+(o<<1<<2)|0;b=c[528]|0;f=1<<o;if(b&f){o=m+8|0;t=c[o>>2]|0;if(t>>>0<(c[532]|0)>>>0)ca();else{B=o;C=t}}else{c[528]=b|f;B=m+8|0;C=m}c[B>>2]=n;c[C+12>>2]=n;c[n+8>>2]=C;c[n+12>>2]=m;return}m=A>>>8;if(m)if(A>>>0>16777215)D=31;else{C=(m+1048320|0)>>>16&8;B=m<<C;m=(B+520192|0)>>>16&4;f=B<<m;B=(f+245760|0)>>>16&2;b=14-(m|C|B)+(f<<B>>>15)|0;D=A>>>(b+7|0)&1|b<<1}else D=0;b=2416+(D<<2)|0;c[n+28>>2]=D;c[n+20>>2]=0;c[n+16>>2]=0;B=c[529]|0;f=1<<D;do if(B&f){C=A<<((D|0)==31?0:25-(D>>>1)|0);m=c[b>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(A|0)){E=124;break}F=m+16+(C>>>31<<2)|0;t=c[F>>2]|0;if(!t){E=121;break}else{C=C<<1;m=t}}if((E|0)==121)if(F>>>0<(c[532]|0)>>>0)ca();else{c[F>>2]=n;c[n+24>>2]=m;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((E|0)==124){C=m+8|0;j=c[C>>2]|0;t=c[532]|0;if(j>>>0>=t>>>0&m>>>0>=t>>>0){c[j+12>>2]=n;c[C>>2]=n;c[n+8>>2]=j;c[n+12>>2]=m;c[n+24>>2]=0;break}else ca()}}else{c[529]=B|f;c[b>>2]=n;c[n+24>>2]=b;c[n+12>>2]=n;c[n+8>>2]=n}while(0);n=(c[536]|0)+-1|0;c[536]=n;if(!n)G=2568;else return;while(1){n=c[G>>2]|0;if(!n)break;else G=n+8|0}c[536]=-1;return}function Bb(a,b){a=a|0;b=b|0;var d=0,e=0;if(a){d=R(b,a)|0;if((b|a)>>>0>65535)e=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1;else e=d}else e=0;d=zb(e)|0;if(!d)return d|0;if(!(c[d+-4>>2]&3))return d|0;Gb(d|0,0,e|0)|0;return d|0}function Cb(){}function Db(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (C=e,a-c>>>0|0)|0}function Eb(a){a=a|0;var b=0,d=0;a=a+15&-16|0;b=c[i>>2]|0;d=b+a|0;if((a|0)>0&(d|0)<(b|0)|(d|0)<0){Z()|0;ba(12);return -1}c[i>>2]=d;if((d|0)>(Y()|0)?(X()|0)==0:0){ba(12);c[i>>2]=b;return -1}return b|0}function Fb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (C=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function Gb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Hb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return da(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}C=a<<c-32;return 0}function Jb(a,b,c){a=a|0;b=b|0;c=c|0;ga[a&7](b|0,c|0)}function Kb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ha[a&7](b|0,c|0,d|0,e|0)}function Lb(a,b){a=a|0;b=b|0;V(0)}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;V(1)}\n\n// EMSCRIPTEN_END_FUNCS\nvar ga=[Lb,pa,qa,ra,sa,Lb,Lb,Lb];var ha=[Mb,Ma,Na,Oa,Pa,Mb,Mb,Mb];return{_ogv_video_decoder_destroy:sb,getTempRet0:oa,setThrew:ma,_ogv_video_decoder_process_frame:rb,_i64Subtract:Db,_bitshift64Shl:Ib,_ogv_video_decoder_process_header:qb,_memset:Gb,_sbrk:Eb,_memcpy:Hb,stackAlloc:ia,_ogv_video_decoder_init:ob,setTempRet0:na,_i64Add:Fb,_ogv_video_decoder_async:pb,_emscripten_get_global_libc:ub,stackSave:ja,_free:Ab,runPostSets:Cb,establishStackSpace:la,stackRestore:ka,_malloc:zb,stackAlloc:ia,stackSave:ja,stackRestore:ka,establishStackSpace:la,setThrew:ma,setTempRet0:na,getTempRet0:oa,dynCall_vii:Jb,dynCall_viiii:Kb}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=asm[\"_ogv_video_decoder_destroy\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=asm[\"_ogv_video_decoder_process_frame\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=asm[\"_ogv_video_decoder_process_header\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=asm[\"_ogv_video_decoder_init\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=asm[\"_ogv_video_decoder_async\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var _free=Module[\"_free\"]=asm[\"_free\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDecoderVideoTheora;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-vp8-mt.js",
    "content": "var OGVDecoderVideoVP8MT\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoVP8MT = function(OGVDecoderVideoVP8MT) {\n  OGVDecoderVideoVP8MT = OGVDecoderVideoVP8MT || {};\n  if (!OGVDecoderVideoVP8MT.currentScriptUrl) OGVDecoderVideoVP8MT.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoVP8MT;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoVP8MT=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoVP8MT!==\"undefined\"?OGVDecoderVideoVP8MT:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}var ENVIRONMENT_IS_PTHREAD;if(!ENVIRONMENT_IS_PTHREAD)ENVIRONMENT_IS_PTHREAD=false;var PthreadWorkerInit=Module[\"pthreadWorkerInit\"]||undefined;if(!ENVIRONMENT_IS_PTHREAD)PthreadWorkerInit={};var currentScriptUrl=Module[\"currentScriptUrl\"]||(ENVIRONMENT_IS_WORKER?undefined:document.currentScript.src);if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var PAGE_SIZE=16384;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;if(ENVIRONMENT_IS_PTHREAD){STATIC_BASE=Module[\"STATIC_BASE\"]||0;STATICTOP=Module[\"STATICTOP\"]||0;DYNAMIC_BASE=Module[\"DYNAMIC_BASE\"]||0;DYNAMICTOP_PTR=Module[\"DYNAMICTOP_PTR\"]||0}else{STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false}if(ENVIRONMENT_IS_PTHREAD){staticSealed=true}function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abort(\"Cannot enlarge memory arrays, since compiling with pthreads support enabled (-s USE_PTHREADS=1).\")}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(typeof SharedArrayBuffer!==\"undefined\"){if(ENVIRONMENT_IS_PTHREAD){buffer=Module.buffer}else{buffer=new SharedArrayBuffer(TOTAL_MEMORY)}((function(undefined){\"use strict\";function clamp(val,length){val=val|0||0;if(val<0)return Math.max(val+length,0);return Math.min(val,length)}if(typeof SharedArrayBuffer!==\"undefined\"&&!SharedArrayBuffer.prototype.slice){SharedArrayBuffer.prototype.slice=(function(from,to){var length=this.byteLength;var begin=clamp(from,length);var end=length;if(to!==undefined)end=clamp(to,length);if(begin>end)return new ArrayBuffer(0);var num=end-begin;var target=new ArrayBuffer(num);var targetArray=new Uint8Array(target);var sourceArray=new Uint8Array(this,begin,num);targetArray.set(sourceArray);return target})}}))()}else{if(!ENVIRONMENT_IS_PTHREAD)buffer=new ArrayBuffer(TOTAL_MEMORY)}updateGlobalBufferViews();if(typeof Atomics===\"undefined\"){Atomics={};Atomics[\"add\"]=(function(t,i,v){var w=t[i];t[i]+=v;return w});Atomics[\"and\"]=(function(t,i,v){var w=t[i];t[i]&=v;return w});Atomics[\"compareExchange\"]=(function(t,i,e,r){var w=t[i];if(w==e)t[i]=r;return w});Atomics[\"exchange\"]=(function(t,i,v){var w=t[i];t[i]=v;return w});Atomics[\"wait\"]=(function(t,i,v,o){if(t[i]!=v)return\"not-equal\";else return\"timed-out\"});Atomics[\"wake\"]=(function(t,i,c){return 0});Atomics[\"wakeOrRequeue\"]=(function(t,i1,c,i2,v){return 0});Atomics[\"isLockFree\"]=(function(s){return true});Atomics[\"load\"]=(function(t,i){return t[i]});Atomics[\"or\"]=(function(t,i,v){var w=t[i];t[i]|=v;return w});Atomics[\"store\"]=(function(t,i,v){t[i]=v;return v});Atomics[\"sub\"]=(function(t,i,v){var w=t[i];t[i]-=v;return w});Atomics[\"xor\"]=(function(t,i,v){var w=t[i];t[i]^=v;return w})}function getTotalMemory(){return TOTAL_MEMORY}if(!ENVIRONMENT_IS_PTHREAD){HEAP32[0]=1668509029}else{if(HEAP32[0]!==1668509029)throw\"Runtime error: The application has corrupted its heap memory area (address zero)!\"}HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;if(ENVIRONMENT_IS_PTHREAD)runtimeInitialized=true;function preRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(typeof Atomics!==\"undefined\"&&!Atomics[\"exchange\"]){Atomics[\"exchange\"]=(function(heap,index,val){var oldVal,oldVal2;do{oldVal=Atomics[\"load\"](heap,index);oldVal2=Atomics[\"compareExchange\"](heap,index,oldVal,val)}while(oldVal!=oldVal2);return oldVal})}if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){assert(!ENVIRONMENT_IS_PTHREAD);runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};if(!ENVIRONMENT_IS_PTHREAD)addOnPreRun((function(){if(typeof SharedArrayBuffer!==\"undefined\"){addRunDependency(\"pthreads\");PThread.allocateUnusedWorkers(1,(function(){removeRunDependency(\"pthreads\")}))}}));var ASM_CONSTS=[(function(){postMessage({cmd:\"processQueuedMainThreadWork\"})}),(function(){throw\"Canceled!\"})];function _emscripten_asm_const_v(code){return ASM_CONSTS[code]()}STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+13776;if(!ENVIRONMENT_IS_PTHREAD)__ATINIT__.push({func:(function(){___emscripten_pthread_data_constructor()})});if(!ENVIRONMENT_IS_PTHREAD){allocate([0,0,0,0,0,0,0,0,0,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,112,0,16,0,96,0,32,0,80,0,48,0,64,0,64,0,48,0,80,0,32,0,96,0,16,0,112,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,250,255,123,0,12,0,255,255,0,0,2,0,245,255,108,0,36,0,248,255,1,0,0,0,247,255,93,0,50,0,250,255,0,0,3,0,240,255,77,0,77,0,240,255,3,0,0,0,250,255,50,0,93,0,247,255,0,0,1,0,248,255,36,0,108,0,245,255,2,0,0,0,255,255,12,0,123,0,250,255,0,0,7,0,0,0,6,0,0,0,7,0,0,0,1,0,0,0,1,0,0,0,143,0,0,0,14,0,0,0,18,0,0,0,14,0,0,0,107,0,0,0,135,0,0,0,64,0,0,0,57,0,0,0,68,0,0,0,60,0,0,0,56,0,0,0,128,0,0,0,65,0,0,0,159,0,0,0,134,0,0,0,128,0,0,0,34,0,0,0,234,0,0,0,188,0,0,0,128,0,0,0,28,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,20,0,0,0,21,0,0,0,21,0,0,0,22,0,0,0,22,0,0,0,23,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,59,0,0,0,60,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,68,0,0,0,69,0,0,0,70,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,79,0,0,0,80,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,89,0,0,0,91,0,0,0,93,0,0,0,95,0,0,0,96,0,0,0,98,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,104,0,0,0,106,0,0,0,108,0,0,0,110,0,0,0,112,0,0,0,114,0,0,0,116,0,0,0,118,0,0,0,122,0,0,0,124,0,0,0,126,0,0,0,128,0,0,0,130,0,0,0,132,0,0,0,134,0,0,0,136,0,0,0,138,0,0,0,140,0,0,0,143,0,0,0,145,0,0,0,148,0,0,0,151,0,0,0,154,0,0,0,157,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,60,0,0,0,62,0,0,0,64,0,0,0,66,0,0,0,68,0,0,0,70,0,0,0,72,0,0,0,74,0,0,0,76,0,0,0,78,0,0,0,80,0,0,0,82,0,0,0,84,0,0,0,86,0,0,0,88,0,0,0,90,0,0,0,92,0,0,0,94,0,0,0,96,0,0,0,98,0,0,0,100,0,0,0,102,0,0,0,104,0,0,0,106,0,0,0,108,0,0,0,110,0,0,0,112,0,0,0,114,0,0,0,116,0,0,0,119,0,0,0,122,0,0,0,125,0,0,0,128,0,0,0,131,0,0,0,134,0,0,0,137,0,0,0,140,0,0,0,143,0,0,0,146,0,0,0,149,0,0,0,152,0,0,0,155,0,0,0,158,0,0,0,161,0,0,0,164,0,0,0,167,0,0,0,170,0,0,0,173,0,0,0,177,0,0,0,181,0,0,0,185,0,0,0,189,0,0,0,193,0,0,0,197,0,0,0,201,0,0,0,205,0,0,0,209,0,0,0,213,0,0,0,217,0,0,0,221,0,0,0,225,0,0,0,229,0,0,0,234,0,0,0,239,0,0,0,245,0,0,0,249,0,0,0,254,0,0,0,3,1,0,0,8,1,0,0,13,1,0,0,18,1,0,0,23,1,0,0,28,1,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,0,1,0,0,4,0,0,0,1,1,0,0,5,0,0,0,2,1,0,0,6,0,0,0,3,1,0,0,7,0,0,0,255,255,255,255,0,0,0,0,44,20,0,0,5,0,0,0,1,0,16,0,8,0,0,0,1,0,0,0,248,5,0,0,1,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,22,0,0,61,22,0,0,66,22,0,0,72,22,0,0,152,6,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,196,49,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,176,246,255,255,255,255,255,255,255,255,255,223,241,252,255,255,255,255,255,255,255,255,249,253,253,255,255,255,255,255,255,255,255,255,244,252,255,255,255,255,255,255,255,255,234,254,254,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,246,254,255,255,255,255,255,255,255,255,239,253,254,255,255,255,255,255,255,255,255,254,255,254,255,255,255,255,255,255,255,255,255,248,254,255,255,255,255,255,255,255,255,251,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,254,255,255,255,255,255,255,255,255,251,254,254,255,255,255,255,255,255,255,255,254,255,254,255,255,255,255,255,255,255,255,255,254,253,255,254,255,255,255,255,255,255,250,255,254,255,254,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,217,255,255,255,255,255,255,255,255,255,255,225,252,241,253,255,255,254,255,255,255,255,234,250,241,250,253,255,253,254,255,255,255,255,254,255,255,255,255,255,255,255,255,255,223,254,254,255,255,255,255,255,255,255,255,238,253,254,254,255,255,255,255,255,255,255,255,248,254,255,255,255,255,255,255,255,255,249,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,247,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,254,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,255,255,255,255,255,255,255,255,250,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,186,251,250,255,255,255,255,255,255,255,255,234,251,244,254,255,255,255,255,255,255,255,251,251,243,253,254,255,254,255,255,255,255,255,253,254,255,255,255,255,255,255,255,255,236,253,254,255,255,255,255,255,255,255,255,251,253,253,254,254,255,255,255,255,255,255,255,254,254,255,255,255,255,255,255,255,255,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,254,254,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,255,255,255,255,255,255,255,255,255,255,250,254,252,254,255,255,255,255,255,255,255,248,254,249,253,255,255,255,255,255,255,255,255,253,253,255,255,255,255,255,255,255,255,246,253,253,255,255,255,255,255,255,255,255,252,254,251,254,254,255,255,255,255,255,255,255,254,252,255,255,255,255,255,255,255,255,248,254,253,255,255,255,255,255,255,255,255,253,255,254,254,255,255,255,255,255,255,255,255,251,254,255,255,255,255,255,255,255,255,245,251,254,255,255,255,255,255,255,255,255,253,253,254,255,255,255,255,255,255,255,255,255,251,253,255,255,255,255,255,255,255,255,252,253,254,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,255,255,255,249,255,254,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,250,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,253,136,254,255,228,219,128,128,128,128,128,189,129,242,255,227,213,255,219,128,128,128,106,126,227,252,214,209,255,255,128,128,128,1,98,248,255,236,226,255,255,128,128,128,181,133,238,254,221,234,255,154,128,128,128,78,134,202,247,198,180,255,219,128,128,128,1,185,249,255,243,255,128,128,128,128,128,184,150,247,255,236,224,128,128,128,128,128,77,110,216,255,236,230,128,128,128,128,128,1,101,251,255,241,255,128,128,128,128,128,170,139,241,252,236,209,255,255,128,128,128,37,116,196,243,228,255,255,255,128,128,128,1,204,254,255,245,255,128,128,128,128,128,207,160,250,255,238,128,128,128,128,128,128,102,103,231,255,211,171,128,128,128,128,128,1,152,252,255,240,255,128,128,128,128,128,177,135,243,255,234,225,128,128,128,128,128,80,129,211,255,194,224,128,128,128,128,128,1,1,255,128,128,128,128,128,128,128,128,246,1,255,128,128,128,128,128,128,128,128,255,128,128,128,128,128,128,128,128,128,128,198,35,237,223,193,187,162,160,145,155,62,131,45,198,221,172,176,220,157,252,221,1,68,47,146,208,149,167,221,162,255,223,128,1,149,241,255,221,224,255,255,128,128,128,184,141,234,253,222,220,255,199,128,128,128,81,99,181,242,176,190,249,202,255,255,128,1,129,232,253,214,197,242,196,255,255,128,99,121,210,250,201,198,255,202,128,128,128,23,91,163,242,170,187,247,210,255,255,128,1,200,246,255,234,255,128,128,128,128,128,109,178,241,255,231,245,255,255,128,128,128,44,130,201,253,205,192,255,255,128,128,128,1,132,239,251,219,209,255,165,128,128,128,94,136,225,251,218,190,255,255,128,128,128,22,100,174,245,186,161,255,199,128,128,128,1,182,249,255,232,235,128,128,128,128,128,124,143,241,255,227,234,128,128,128,128,128,35,77,181,251,193,211,255,205,128,128,128,1,157,247,255,236,231,255,255,128,128,128,121,141,235,255,225,227,255,255,128,128,128,45,99,188,251,195,217,255,224,128,128,128,1,1,251,255,213,255,128,128,128,128,128,203,1,248,255,255,128,128,128,128,128,128,137,1,177,255,224,255,128,128,128,128,128,253,9,248,251,207,208,255,192,128,128,128,175,13,224,243,193,185,249,198,255,255,128,73,17,171,221,161,179,236,167,255,234,128,1,95,247,253,212,183,255,255,128,128,128,239,90,244,250,211,209,255,255,128,128,128,155,77,195,248,188,195,255,255,128,128,128,1,24,239,251,218,219,255,205,128,128,128,201,51,219,255,196,186,128,128,128,128,128,69,46,190,239,201,218,255,228,128,128,128,1,191,251,255,255,128,128,128,128,128,128,223,165,249,255,213,255,128,128,128,128,128,141,124,248,255,255,128,128,128,128,128,128,1,16,248,255,255,128,128,128,128,128,128,190,36,230,255,236,255,128,128,128,128,128,149,1,255,128,128,128,128,128,128,128,128,1,226,255,128,128,128,128,128,128,128,128,247,192,255,128,128,128,128,128,128,128,128,240,128,255,128,128,128,128,128,128,128,128,1,134,252,255,255,128,128,128,128,128,128,213,62,250,255,255,128,128,128,128,128,128,55,93,255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,202,24,213,235,186,191,220,160,240,175,255,126,38,182,232,169,184,228,174,255,187,128,61,46,138,219,151,178,240,170,255,216,128,1,112,230,250,199,191,247,159,255,255,128,166,109,228,252,211,215,255,174,128,128,128,39,77,162,232,172,180,245,178,255,255,128,1,52,220,246,198,199,249,220,255,255,128,124,74,191,243,183,193,250,221,255,255,128,24,71,130,219,154,170,243,182,255,255,128,1,182,225,249,219,240,255,224,128,128,128,149,150,226,252,216,205,255,171,128,128,128,28,108,170,242,183,194,254,223,255,255,128,1,81,230,252,204,203,255,192,128,128,128,123,102,209,247,188,196,255,233,128,128,128,20,95,153,243,164,173,255,203,128,128,128,1,222,248,255,216,213,128,128,128,128,128,168,175,246,252,235,205,255,255,128,128,128,47,116,215,255,211,212,255,255,128,128,128,1,121,236,253,212,214,255,255,128,128,128,141,84,213,252,201,202,255,219,128,128,128,42,80,160,240,162,185,255,205,128,128,128,1,1,255,128,128,128,128,128,128,128,128,244,1,255,128,128,128,128,128,128,128,128,238,1,255,128,128,128,128,128,128,128,128,145,156,163,128,162,101,204,142,114,183,120,90,79,133,87,85,80,111,151,231,120,48,89,115,113,120,152,112,152,179,64,126,170,118,46,70,95,175,69,143,80,85,82,72,155,103,56,58,10,171,218,189,17,13,152,144,71,10,38,171,213,144,34,26,114,26,17,163,44,195,21,10,173,121,24,80,195,26,62,44,64,85,170,46,55,19,136,160,33,206,71,63,20,8,114,114,208,12,9,226,81,40,11,96,182,84,29,16,36,134,183,89,137,98,101,106,165,148,72,187,100,130,157,111,32,75,80,66,102,167,99,74,62,40,234,128,41,53,9,178,241,141,26,8,107,104,79,12,27,217,255,87,17,7,74,43,26,146,73,166,49,23,157,65,38,105,160,51,52,31,115,128,87,68,71,44,114,51,15,186,23,47,41,14,110,182,183,21,17,194,66,45,25,102,197,189,23,18,22,88,88,147,150,42,46,45,196,205,43,97,183,117,85,38,35,179,61,39,53,200,87,26,21,43,232,171,56,34,51,104,114,102,29,93,77,107,54,32,26,51,1,81,43,31,39,28,85,171,58,165,90,98,64,34,22,116,206,23,34,43,166,73,68,25,106,22,64,171,36,225,114,34,19,21,102,132,188,16,76,124,62,18,78,95,85,57,50,48,51,193,101,35,159,215,111,89,46,111,60,148,31,172,219,228,21,18,111,112,113,77,85,179,255,38,120,114,40,42,1,196,245,209,10,25,109,100,80,8,43,154,1,51,26,71,88,43,29,140,166,213,37,43,154,61,63,30,155,67,45,68,1,209,142,78,78,16,255,128,34,197,171,41,40,5,102,211,183,4,1,221,51,50,17,168,209,192,23,25,82,125,98,42,88,104,85,117,175,82,95,84,53,89,128,100,113,101,45,75,79,123,47,51,128,81,171,1,57,17,5,71,102,57,53,41,49,115,21,2,10,102,255,166,23,6,38,33,13,121,57,73,26,1,85,41,10,67,138,77,110,90,47,114,101,29,16,10,85,128,101,196,26,57,18,10,102,102,213,34,20,43,117,20,15,36,163,128,68,1,26,138,31,36,171,27,166,38,44,229,67,87,58,169,82,115,26,59,179,63,59,90,180,59,166,93,73,154,40,40,21,116,143,209,34,39,175,57,46,22,24,128,1,54,17,37,47,15,16,183,34,223,49,45,183,46,17,33,183,6,98,15,32,183,65,32,73,115,28,128,23,128,205,40,3,9,115,51,192,18,6,223,87,37,9,115,59,77,64,21,47,104,55,44,218,9,54,53,130,226,64,90,70,205,40,41,23,26,57,54,57,112,184,5,41,38,166,213,30,34,26,133,152,116,10,32,134,75,32,12,51,192,255,160,43,51,39,19,53,221,26,114,32,73,255,31,9,65,234,2,15,1,118,73,88,31,35,67,102,85,55,186,85,56,21,23,111,59,205,45,37,192,55,38,70,124,73,102,1,34,98,102,61,71,37,34,53,31,243,192,69,60,71,38,73,119,28,222,37,68,45,128,34,1,47,11,245,171,62,17,19,70,146,85,55,62,70,75,15,9,9,64,255,184,119,16,37,43,37,154,100,163,85,160,1,63,9,92,136,28,64,32,201,85,86,6,28,5,64,255,25,248,1,56,8,17,132,137,255,55,116,128,58,15,20,82,135,57,26,121,40,164,50,31,137,154,133,25,35,218,51,103,44,131,131,123,31,6,158,86,40,64,135,148,224,45,183,128,22,26,17,131,240,154,14,1,209,83,12,13,54,192,255,68,47,28,45,16,21,91,64,222,7,1,197,56,21,39,155,60,138,23,102,213,85,26,85,85,128,128,32,146,171,18,11,7,63,144,171,4,4,246,35,27,10,146,174,171,12,26,128,190,80,35,99,180,80,126,54,45,85,126,47,87,176,51,41,20,32,101,75,128,139,118,146,116,128,85,56,41,15,176,236,85,37,9,62,146,36,19,30,171,255,97,27,20,71,30,17,119,118,255,17,18,138,101,38,60,138,55,70,43,26,142,138,45,61,62,219,1,81,188,64,32,41,20,117,151,142,20,21,163,112,19,12,61,195,128,48,4,24,0,2,255,4,254,6,8,12,253,10,251,250,252,14,249,16,248,247,0,2,4,6,255,254,253,252,252,2,4,6,0,255,254,253,0,2,255,4,254,253,2,8,4,6,0,255,254,253,10,12,252,251,250,249,180,162,25,237,246,253,253,254,254,254,254,254,254,254,254,254,254,250,250,252,254,254,231,243,245,253,254,254,254,254,254,254,254,254,254,254,251,251,254,254,254,162,128,225,146,172,147,214,39,156,128,129,132,75,145,178,206,239,254,254,164,128,204,170,119,235,140,230,228,128,130,130,74,148,180,203,236,254,254,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,8,10,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,87,101,98,77,32,80,114,111,106,101,99,116,32,86,80,56,32,68,101,99,111,100,101,114,32,118,49,46,54,46,49,45,49,45,103,51,48,49,99,48,54,101,57,101,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,119,105,100,116,104,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,104,101,105,103,104,116,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,32,98,117,102,102,101,114,115,0,147,136,18,223,1,34,106,145,1,208,1,1,179,121,1,223,1,34,179,121,1,208,1,1,8,8,4,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,4,5,8,9,12,13,2,3,6,7,10,11,14,15,0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,112,97,114,116,105,116,105,111,110,32,48,32,108,101,110,103,116,104,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,121,110,99,32,99,111,100,101,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,48,0,84,114,117,110,99,97,116,101,100,32,112,97,114,116,105,116,105,111,110,32,115,105,122,101,32,100,97,116,97,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,112,97,114,116,105,116,105,111,110,32,37,100,32,108,101,110,103,116,104,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,37,100,0,65,32,115,116,114,101,97,109,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,99,111,109,112,108,101,116,101,32,107,101,121,32,102,114,97,109,101,0,0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0,0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15,173,148,140,0,176,155,140,135,0,180,157,141,134,130,0,254,254,243,230,196,177,153,140,133,130,129,0,73,110,118,97,108,105,100,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,0,73,110,99,111,114,114,101,99,116,32,98,117,102,102,101,114,32,100,105,109,101,110,115,105,111,110,115,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,104,95,100,101,99,111,100,105,110,103,95,116,104,114,101,97,100,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,104,95,101,118,101,110,116,95,115,116,97,114,116,95,100,101,99,111,100,105,110,103,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,98,95,114,111,119,95,100,105,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,100,101,95,116,104,114,101,97,100,95,100,97,116,97,41,0,70,97,105,108,101,100,32,116,111,32,105,110,105,116,105,97,108,105,122,101,32,115,101,109,97,112,104,111,114,101,0,70,97,105,108,101,100,32,116,111,32,99,114,101,97,116,101,32,116,104,114,101,97,100,115,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,112,109,117,116,101,120,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,112,99,111,110,100,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,116,95,99,117,114,114,101,110,116,95,109,98,95,99,111,108,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,116,95,121,97,98,111,118,101,95,114,111,119,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,109,116,95,121,97,98,111,118,101,95,114,111,119,91,105,93,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,116,95,117,97,98,111,118,101,95,114,111,119,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,109,116,95,117,97,98,111,118,101,95,114,111,119,91,105,93,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,116,95,118,97,98,111,118,101,95,114,111,119,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,109,116,95,118,97,98,111,118,101,95,114,111,119,91,105,93,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,116,95,121,108,101,102,116,95,99,111,108,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,109,116,95,121,108,101,102,116,95,99,111,108,91,105,93,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,116,95,117,108,101,102,116,95,99,111,108,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,109,116,95,117,108,101,102,116,95,99,111,108,91,105,93,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,40,112,98,105,45,62,109,116,95,118,108,101,102,116,95,99,111,108,41,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,109,116,95,118,108,101,102,116,95,99,111,108,91,105,93,0,69,114,114,111,114,32,108,97,117,110,99,104,105,110,103,32,100,101,99,111,100,101,32,116,104,114,101,97,100,58,32,37,100,10,0,108,105,98,118,112,120,32,119,105,108,108,32,117,115,101,32,117,112,32,116,111,32,37,100,32,99,111,114,101,115,10,0,103,111,116,32,109,117,108,116,105,112,108,101,32,102,114,97,109,101,115,32,102,114,111,109,32,86,80,57,32,115,116,114,101,97,109,32,117,110,101,120,112,101,99,116,101,100,108,121,63,0,83,107,105,112,112,105,110,103,32,102,114,97,109,101,32,119,105,116,104,32,117,110,107,110,111,119,110,32,112,105,99,116,117,114,101,32,116,121,112,101,32,37,100,10,0,86,80,88,32,112,114,111,99,101,115,115,95,104,101,97,100,101,114,32,115,104,111,117,108,100,32,110,111,116,32,104,97,112,112,101,110,63,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,101,109,115,99,114,105,112,116,101,110,95,105,115,95,109,97,105,110,95,114,117,110,116,105,109,101,95,116,104,114,101,97,100,40,41,32,38,38,32,34,101,109,115,99,114,105,112,116,101,110,95,109,97,105,110,95,116,104,114,101,97,100,95,112,114,111,99,101,115,115,95,113,117,101,117,101,100,95,99,97,108,108,115,32,109,117,115,116,32,98,101,32,99,97,108,108,101,100,32,102,114,111,109,32,116,104,101,32,109,97,105,110,32,116,104,114,101,97,100,33,34,0,47,85,115,101,114,115,47,98,114,105,111,110,47,115,114,99,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,105,110,99,111,109,105,110,103,47,115,121,115,116,101,109,47,108,105,98,47,112,116,104,114,101,97,100,47,108,105,98,114,97,114,121,95,112,116,104,114,101,97,100,46,99,0,101,109,115,99,114,105,112,116,101,110,95,109,97,105,110,95,116,104,114,101,97,100,95,112,114,111,99,101,115,115,95,113,117,101,117,101,100,95,99,97,108,108,115,0,48,32,38,38,32,34,73,110,118,97,108,105,100,32,69,109,115,99,114,105,112,116,101,110,32,112,116,104,114,101,97,100,32,95,100,111,95,99,97,108,108,32,111,112,99,111,100,101,33,34,0,95,100,111,95,99,97,108,108,0,99,97,108,108,0,101,109,115,99,114,105,112,116,101,110,95,97,115,121,110,99,95,114,117,110,95,105,110,95,109,97,105,110,95,116,104,114,101,97,100,0,112,111,115,116,77,101,115,115,97,103,101,40,123,32,99,109,100,58,32,39,112,114,111,99,101,115,115,81,117,101,117,101,100,77,97,105,110,84,104,114,101,97,100,87,111,114,107,39,32,125,41,0,116,104,114,111,119,32,39,67,97,110,99,101,108,101,100,33,39,59,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE)}var tempDoublePtr;if(ENVIRONMENT_IS_PTHREAD){tempDoublePtr=Module[\"tempDoublePtr\"]}else{tempDoublePtr=Runtime.alignMemory(allocate(12,\"i8\",ALLOC_STATIC),8)}var PROCINFO={ppid:1,pid:42,sid:42,pgid:42};var __pthread_ptr=0;var __pthread_is_main_runtime_thread=0;var __pthread_is_main_browser_thread=0;function __register_pthread_ptr(pthreadPtr,isMainBrowserThread,isMainRuntimeThread){pthreadPtr=pthreadPtr|0;isMainBrowserThread=isMainBrowserThread|0;isMainRuntimeThread=isMainRuntimeThread|0;__pthread_ptr=pthreadPtr;__pthread_is_main_browser_thread=isMainBrowserThread;__pthread_is_main_runtime_thread=isMainRuntimeThread}var _emscripten_main_thread_process_queued_calls=undefined;var PThread={MAIN_THREAD_ID:1,mainThreadInfo:{schedPolicy:0,schedPrio:0},unusedWorkerPool:[],runningWorkers:[],initMainThreadBlock:(function(){if(ENVIRONMENT_IS_PTHREAD)return undefined;PThread.mainThreadBlock=allocate(244,\"i32*\",ALLOC_STATIC);__register_pthread_ptr(PThread.mainThreadBlock,!ENVIRONMENT_IS_WORKER,1);for(var i=0;i<244/4;++i)HEAPU32[PThread.mainThreadBlock/4+i]=0;HEAP32[PThread.mainThreadBlock+24>>2]=PThread.mainThreadBlock;var tlsMemory=allocate(128*4,\"i32*\",ALLOC_STATIC);for(var i=0;i<128;++i)HEAPU32[tlsMemory/4+i]=0;Atomics.store(HEAPU32,PThread.mainThreadBlock+116>>2,tlsMemory);Atomics.store(HEAPU32,PThread.mainThreadBlock+52>>2,PThread.mainThreadBlock);Atomics.store(HEAPU32,PThread.mainThreadBlock+56>>2,PROCINFO.pid)}),pthreads:{},pthreadIdCounter:2,exitHandlers:null,setThreadStatus:(function(){}),runExitHandlers:(function(){if(PThread.exitHandlers!==null){while(PThread.exitHandlers.length>0){PThread.exitHandlers.pop()()}PThread.exitHandlers=null}if(ENVIRONMENT_IS_PTHREAD&&threadInfoStruct)___pthread_tsd_run_dtors()}),threadExit:(function(exitCode){var tb=_pthread_self();if(tb){Atomics.store(HEAPU32,tb+4>>2,exitCode);Atomics.store(HEAPU32,tb+0>>2,1);Atomics.store(HEAPU32,tb+72>>2,1);Atomics.store(HEAPU32,tb+76>>2,0);PThread.runExitHandlers();_emscripten_futex_wake(tb+0,2147483647);__register_pthread_ptr(0,0,0);threadInfoStruct=0;if(ENVIRONMENT_IS_PTHREAD){var transferList=[];postMessage({cmd:\"exit\"})}}}),threadCancel:(function(){PThread.runExitHandlers();Atomics.store(HEAPU32,threadInfoStruct+4>>2,-1);Atomics.store(HEAPU32,threadInfoStruct+0>>2,1);_emscripten_futex_wake(threadInfoStruct+0,2147483647);threadInfoStruct=selfThreadId=0;__register_pthread_ptr(0,0,0);postMessage({cmd:\"cancelDone\"})}),terminateAllThreads:(function(){for(var t in PThread.pthreads){var pthread=PThread.pthreads[t];if(pthread){PThread.freeThreadData(pthread);if(pthread.worker)pthread.worker.terminate()}}PThread.pthreads={};for(var t in PThread.unusedWorkerPool){var pthread=PThread.unusedWorkerPool[t];if(pthread){PThread.freeThreadData(pthread);if(pthread.worker)pthread.worker.terminate()}}PThread.unusedWorkerPool=[];for(var t in PThread.runningWorkers){var pthread=PThread.runningWorkers[t];if(pthread){PThread.freeThreadData(pthread);if(pthread.worker)pthread.worker.terminate()}}PThread.runningWorkers=[]}),freeThreadData:(function(pthread){if(!pthread)return;if(pthread.threadInfoStruct){var tlsMemory=HEAP32[pthread.threadInfoStruct+116>>2];HEAP32[pthread.threadInfoStruct+116>>2]=0;_free(pthread.tlsMemory);_free(pthread.threadInfoStruct)}pthread.threadInfoStruct=0;if(pthread.allocatedOwnStack&&pthread.stackBase)_free(pthread.stackBase);pthread.stackBase=0;if(pthread.worker)pthread.worker.pthread=null}),receiveObjectTransfer:(function(data){}),allocateUnusedWorkers:(function(numWorkers,onFinishedLoading){if(typeof SharedArrayBuffer===\"undefined\")return;Module[\"print\"](\"Preallocating \"+numWorkers+\" workers for a pthread spawn pool.\");var numWorkersLoaded=0;for(var i=0;i<numWorkers;++i){var pthreadMainJs=\"pthread-main.js\";if(typeof Module[\"locateFile\"]===\"function\")pthreadMainJs=Module[\"locateFile\"](pthreadMainJs);else if(Module[\"pthreadMainPrefixURL\"])pthreadMainJs=Module[\"pthreadMainPrefixURL\"]+pthreadMainJs;var worker=new Worker(pthreadMainJs);worker.onmessage=(function(e){if(e.data.targetThread&&e.data.targetThread!=_pthread_self()){var thread=PThread.pthreads[e.data.targetThread];if(thread){thread.worker.postMessage(e.data,e.data.transferList)}else{console.error('Internal error! Worker sent a message \"'+e.data.cmd+'\" to target pthread '+e.data.targetThread+\", but that thread no longer exists!\")}return}if(e.data.cmd===\"processQueuedMainThreadWork\"){_emscripten_main_thread_process_queued_calls()}else if(e.data.cmd===\"spawnThread\"){__spawn_thread(e.data)}else if(e.data.cmd===\"cleanupThread\"){__cleanup_thread(e.data.thread)}else if(e.data.cmd===\"killThread\"){__kill_thread(e.data.thread)}else if(e.data.cmd===\"cancelThread\"){__cancel_thread(e.data.thread)}else if(e.data.cmd===\"loaded\"){++numWorkersLoaded;if(numWorkersLoaded===numWorkers&&onFinishedLoading){onFinishedLoading()}}else if(e.data.cmd===\"print\"){Module[\"print\"](\"Thread \"+e.data.threadId+\": \"+e.data.text)}else if(e.data.cmd===\"printErr\"){Module[\"printErr\"](\"Thread \"+e.data.threadId+\": \"+e.data.text)}else if(e.data.cmd===\"alert\"){alert(\"Thread \"+e.data.threadId+\": \"+e.data.text)}else if(e.data.cmd===\"exit\"){}else if(e.data.cmd===\"cancelDone\"){PThread.freeThreadData(worker.pthread);worker.pthread=undefined;PThread.unusedWorkerPool.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker.pthread),1)}else if(e.data.cmd===\"objectTransfer\"){PThread.receiveObjectTransfer(e.data)}else{Module[\"printErr\"](\"worker sent an unknown command \"+e.data.cmd)}});worker.onerror=(function(e){Module[\"printErr\"](\"pthread sent an error! \"+e.filename+\":\"+e.lineno+\": \"+e.message)});var tempDoublePtr=getMemory(8);worker.postMessage({cmd:\"load\",url:currentScriptUrl,buffer:HEAPU8.buffer,tempDoublePtr:tempDoublePtr,TOTAL_MEMORY:TOTAL_MEMORY,STATICTOP:STATICTOP,DYNAMIC_BASE:DYNAMIC_BASE,DYNAMICTOP_PTR:DYNAMICTOP_PTR,PthreadWorkerInit:PthreadWorkerInit,modularize:1,moduleExportName:\"OGVDecoderVideoVP8MT\"});PThread.unusedWorkerPool.push(worker)}}),getNewWorker:(function(){if(PThread.unusedWorkerPool.length==0)PThread.allocateUnusedWorkers(1);if(PThread.unusedWorkerPool.length>0)return PThread.unusedWorkerPool.pop();else return null}),busySpinWait:(function(msecs){var t=performance.now()+msecs;while(performance.now()<t){}}),setStackSpace:(function(stackBase,stackMax){STACK_BASE=STACKTOP=stackBase;STACK_MAX=stackMax;assert(STACK_BASE!=0);assert(STACK_MAX>STACK_BASE);Module.Runtime.establishStackSpace(stackBase,stackMax)}),registerPthreadPtr:(function(pthreadPtr,isMainBrowserThread,isMainRuntimeThread){__register_pthread_ptr(pthreadPtr,isMainBrowserThread,isMainRuntimeThread)}),wakeAllThreads:(function(){var tb=_pthread_self();_emscripten_futex_wake(tb+0,2147483647)}),runThreadFunc:(function(funcPtr,arg){if(typeof asm[\"dynCall_ii\"]!==\"undefined\"){result=asm.dynCall_ii(funcPtr,arg)}else{result=asm.dynCall_i(funcPtr)}})};function _emscripten_set_current_thread_status_js(newStatus){}Module[\"_emscripten_set_current_thread_status\"]=_emscripten_set_current_thread_status;function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module.cpuTime+=cpuTime;callback(ret);return}Module[\"_i64Subtract\"]=_i64Subtract;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(72,name);switch(name){case 30:return PAGE_SIZE;case 85:var maxHeapSize=2*1024*1024*1024-16777216;maxHeapSize=HEAPU8.length;return maxHeapSize/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator===\"object\")return navigator[\"hardwareConcurrency\"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}Module[\"_memset\"]=_memset;function ___pthread_setcancelstate(){return 0}function _atexit(func,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(110,func,arg);__ATEXIT__.unshift({func:func,arg:arg})}var _tzname;if(ENVIRONMENT_IS_PTHREAD)_tzname=PthreadWorkerInit._tzname;else PthreadWorkerInit._tzname=_tzname=allocate(8,\"i32*\",ALLOC_STATIC);var _daylight;if(ENVIRONMENT_IS_PTHREAD)_daylight=PthreadWorkerInit._daylight;else PthreadWorkerInit._daylight=_daylight=allocate(1,\"i32*\",ALLOC_STATIC);var _timezone;if(ENVIRONMENT_IS_PTHREAD)_timezone=PthreadWorkerInit._timezone;else PthreadWorkerInit._timezone=_timezone=allocate(1,\"i32*\",ALLOC_STATIC);function _tzset(){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_0(119);if(_tzset.called)return;_tzset.called=true;HEAP32[_timezone>>2]=-(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[_daylight>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\\(([A-Za-z ]+)\\)$/);return match?match[1]:\"GMT\"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),\"i8\",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),\"i8\",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[_tzname>>2]=winterNamePtr;HEAP32[_tzname+4>>2]=summerNamePtr}else{HEAP32[_tzname>>2]=summerNamePtr;HEAP32[_tzname+4>>2]=winterNamePtr}}var __main_thread_futex_wait_address;if(ENVIRONMENT_IS_PTHREAD)__main_thread_futex_wait_address=PthreadWorkerInit.__main_thread_futex_wait_address;else PthreadWorkerInit.__main_thread_futex_wait_address=__main_thread_futex_wait_address=allocate(1,\"i32*\",ALLOC_STATIC);function _emscripten_futex_wait(addr,val,timeout){if(addr<=0||addr>HEAP8.length||addr&3!=0)return-22;if(ENVIRONMENT_IS_WORKER){var ret=Atomics.wait(HEAP32,addr>>2,val,timeout);if(ret===\"timed-out\")return-110;if(ret===\"not-equal\")return-11;if(ret===\"ok\")return 0;throw\"Atomics.wait returned an unexpected value \"+ret}else{var loadedVal=Atomics.load(HEAP32,addr>>2);if(val!=loadedVal)return-11;var tNow=performance.now();var tEnd=tNow+timeout;Atomics.store(HEAP32,__main_thread_futex_wait_address>>2,addr);var ourWaitAddress=addr;while(addr==ourWaitAddress){tNow=performance.now();if(tNow>tEnd){return-110}_emscripten_main_thread_process_queued_calls();addr=Atomics.load(HEAP32,__main_thread_futex_wait_address>>2)}return 0}}function ___assert_fail(condition,filename,line,func){ABORT=true;throw\"Assertion failed: \"+Pointer_stringify(condition)+\", at: \"+[filename?Pointer_stringify(filename):\"unknown filename\",line,func?Pointer_stringify(func):\"unknown function\"]+\" at \"+stackTrace()}function __spawn_thread(threadParams){if(ENVIRONMENT_IS_PTHREAD)throw\"Internal Error! _spawn_thread() can only ever be called from main application thread!\";var worker=PThread.getNewWorker();if(worker.pthread!==undefined)throw\"Internal error!\";if(!threadParams.pthread_ptr)throw\"Internal error, no pthread ptr!\";PThread.runningWorkers.push(worker);var tlsMemory=_malloc(128*4);for(var i=0;i<128;++i){HEAP32[tlsMemory+i*4>>2]=0}var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,stackBase:threadParams.stackBase,stackSize:threadParams.stackSize,allocatedOwnStack:threadParams.allocatedOwnStack,thread:threadParams.pthread_ptr,threadInfoStruct:threadParams.pthread_ptr};Atomics.store(HEAPU32,pthread.threadInfoStruct+0>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+4>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+20>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+80>>2,threadParams.detached);Atomics.store(HEAPU32,pthread.threadInfoStruct+116>>2,tlsMemory);Atomics.store(HEAPU32,pthread.threadInfoStruct+60>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+52>>2,pthread.threadInfoStruct);Atomics.store(HEAPU32,pthread.threadInfoStruct+56>>2,PROCINFO.pid);Atomics.store(HEAPU32,pthread.threadInfoStruct+120>>2,threadParams.stackSize);Atomics.store(HEAPU32,pthread.threadInfoStruct+96>>2,threadParams.stackSize);Atomics.store(HEAPU32,pthread.threadInfoStruct+92>>2,threadParams.stackBase);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+8>>2,threadParams.stackBase);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+12>>2,threadParams.detached);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+20>>2,threadParams.schedPolicy);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+24>>2,threadParams.schedPrio);var global_libc=_emscripten_get_global_libc();var global_locale=global_libc+40;Atomics.store(HEAPU32,pthread.threadInfoStruct+188>>2,global_locale);worker.pthread=pthread;worker.postMessage({cmd:\"run\",start_routine:threadParams.startRoutine,arg:threadParams.arg,threadInfoStruct:threadParams.pthread_ptr,selfThreadId:threadParams.pthread_ptr,parentThreadId:threadParams.parent_pthread_ptr,stackBase:threadParams.stackBase,stackSize:threadParams.stackSize},threadParams.transferList)}function _pthread_getschedparam(thread,policy,schedparam){if(!policy&&!schedparam)return ERRNO_CODES.EINVAL;if(!thread){Module[\"printErr\"](\"pthread_getschedparam called with a null thread pointer!\");return ERRNO_CODES.ESRCH}var self=HEAP32[thread+24>>2];if(self!=thread){Module[\"printErr\"](\"pthread_getschedparam attempted on thread \"+thread+\", which does not point to a valid thread, or does not exist anymore!\");return ERRNO_CODES.ESRCH}var schedPolicy=Atomics.load(HEAPU32,thread+120+20>>2);var schedPrio=Atomics.load(HEAPU32,thread+120+24>>2);if(policy)HEAP32[policy>>2]=schedPolicy;if(schedparam)HEAP32[schedparam>>2]=schedPrio;return 0}function _pthread_self(){return __pthread_ptr|0}function _pthread_create(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer===\"undefined\"){Module[\"printErr\"](\"Current environment does not support SharedArrayBuffer, pthreads are not available!\");return 11}if(!pthread_ptr){Module[\"printErr\"](\"pthread_create called with a null thread pointer!\");return 22}var transferList=[];if(ENVIRONMENT_IS_PTHREAD&&transferList.length==0){return _emscripten_sync_run_in_main_thread_4(137,pthread_ptr,attr,start_routine,arg)}var stackSize=0;var stackBase=0;var detached=0;var schedPolicy=0;var schedPrio=0;if(attr){stackSize=HEAP32[attr>>2];stackBase=HEAP32[attr+8>>2];detached=HEAP32[attr+12>>2]!=0;var inheritSched=HEAP32[attr+16>>2]==0;if(inheritSched){var prevSchedPolicy=HEAP32[attr+20>>2];var prevSchedPrio=HEAP32[attr+24>>2];_pthread_getschedparam(_pthread_self(),attr+20,attr+24);schedPolicy=HEAP32[attr+20>>2];schedPrio=HEAP32[attr+24>>2];HEAP32[attr+20>>2]=prevSchedPolicy;HEAP32[attr+24>>2]=prevSchedPrio}else{schedPolicy=HEAP32[attr+20>>2];schedPrio=HEAP32[attr+24>>2]}}stackSize+=81920;var allocatedOwnStack=stackBase==0;if(allocatedOwnStack){stackBase=_malloc(stackSize)}else{stackBase-=stackSize;assert(stackBase>0)}var threadInfoStruct=_malloc(244);for(var i=0;i<244>>2;++i)HEAPU32[(threadInfoStruct>>2)+i]=0;HEAP32[pthread_ptr>>2]=threadInfoStruct;HEAP32[threadInfoStruct+24>>2]=threadInfoStruct;var headPtr=threadInfoStruct+168;HEAP32[headPtr>>2]=headPtr;var threadParams={stackBase:stackBase,stackSize:stackSize,allocatedOwnStack:allocatedOwnStack,schedPolicy:schedPolicy,schedPrio:schedPrio,detached:detached,startRoutine:start_routine,pthread_ptr:threadInfoStruct,parent_pthread_ptr:_pthread_self(),arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd=\"spawnThread\";postMessage(threadParams,transferList)}else{__spawn_thread(threadParams)}return 0}function _chroot(path){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(37,path);___setErrNo(ERRNO_CODES.EACCES);return-1}Module[\"_i64Add\"]=_i64Add;var _environ;if(ENVIRONMENT_IS_PTHREAD)_environ=PthreadWorkerInit._environ;else PthreadWorkerInit._environ=_environ=allocate(1,\"i32*\",ALLOC_STATIC);function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV[\"USER\"]=ENV[\"LOGNAME\"]=\"web_user\";ENV[\"PATH\"]=\"/\";ENV[\"PWD\"]=\"/\";ENV[\"HOME\"]=\"/home/web_user\";ENV[\"LANG\"]=\"C\";ENV[\"_\"]=Module[\"thisProgram\"];poolPtr=allocate(TOTAL_ENV_SIZE,\"i8\",ALLOC_STATIC);envPtr=allocate(MAX_ENV_VALUES*4,\"i8*\",ALLOC_STATIC);HEAP32[envPtr>>2]=poolPtr;HEAP32[_environ>>2]=envPtr}else{envPtr=HEAP32[_environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]===\"string\"){var line=key+\"=\"+env[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error(\"Environment size exceeded TOTAL_ENV_SIZE!\")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var ENV={};function _putenv(string){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(115,string);if(string===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}string=Pointer_stringify(string);var splitPoint=string.indexOf(\"=\");if(string===\"\"||string.indexOf(\"=\")===-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}var name=string.slice(0,splitPoint);var value=string.slice(splitPoint+1);if(!(name in ENV)||ENV[name]!==value){ENV[name]=value;___buildEnvironment(ENV)}return 0}function _emscripten_force_num_logical_cores(cores){HEAP32[__num_logical_cores>>2]=cores}var __num_logical_cores;if(ENVIRONMENT_IS_PTHREAD)__num_logical_cores=PthreadWorkerInit.__num_logical_cores;else{PthreadWorkerInit.__num_logical_cores=__num_logical_cores=allocate(1,\"i32*\",ALLOC_STATIC);HEAPU32[__num_logical_cores>>2]=navigator[\"hardwareConcurrency\"]||4}function _emscripten_num_logical_cores(){return HEAP32[__num_logical_cores>>2]}function _realloc(){throw\"bad\"}Module[\"_realloc\"]=_realloc;Module[\"_saveSetjmp\"]=_saveSetjmp;function _setenv(envname,envval,overwrite){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_3(113,envname,envval,overwrite);if(envname===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}var name=Pointer_stringify(envname);var val=Pointer_stringify(envval);if(name===\"\"||name.indexOf(\"=\")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)&&!overwrite)return 0;ENV[name]=val;___buildEnvironment(ENV);return 0}function _emscripten_get_now(){abort()}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last===\".\"){parts.splice(i,1)}else if(last===\"..\"){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift(\"..\")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)===\"/\",trailingSlash=path.substr(-1)===\"/\";path=PATH.normalizeArray(path.split(\"/\").filter((function(p){return!!p})),!isAbsolute).join(\"/\");if(!path&&!isAbsolute){path=\".\"}if(path&&trailingSlash){path+=\"/\"}return(isAbsolute?\"/\":\"\")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return\".\"}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path===\"/\")return\"/\";var lastSlash=path.lastIndexOf(\"/\");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join(\"/\"))}),join2:(function(l,r){return PATH.normalize(l+\"/\"+r)}),resolve:(function(){var resolvedPath=\"\",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!==\"string\"){throw new TypeError(\"Arguments to path.resolve must be strings\")}else if(!path){return\"\"}resolvedPath=path+\"/\"+resolvedPath;resolvedAbsolute=path.charAt(0)===\"/\"}resolvedPath=PATH.normalizeArray(resolvedPath.split(\"/\").filter((function(p){return!!p})),!resolvedAbsolute).join(\"/\");return(resolvedAbsolute?\"/\":\"\")+resolvedPath||\".\"}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!==\"\")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!==\"\")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split(\"/\"));var toParts=trim(to.split(\"/\"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push(\"..\")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join(\"/\")})};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=new Buffer(BUFSIZE);var bytesRead=0;var isPosixPlatform=process.platform!=\"win32\";var fd=process.stdin.fd;if(isPosixPlatform){var usingDevice=false;try{fd=fs.openSync(\"/dev/stdin\",\"r\");usingDevice=true}catch(e){}}try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null)}catch(e){if(e.toString().indexOf(\"EOF\")!=-1)bytesRead=0;else throw e}if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString(\"utf-8\")}else{result=null}}else if(typeof window!=\"undefined\"&&typeof window.prompt==\"function\"){result=window.prompt(\"Input: \");if(result!==null){result+=\"\\n\"}}else if(typeof readline==\"function\"){result=readline();if(result!==null){result+=\"\\n\"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module[\"print\"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module[\"print\"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module[\"printErr\"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module[\"printErr\"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,\"/\",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents}),getFileDataAsTypedArray:(function(node){if(!node.contents)return new Uint8Array;if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete parent.contents[name]}),rmdir:(function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]}),readdir:(function(node){var entries=[\".\",\"..\"];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size}),write:(function(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0})}};var IDBFS={dbs:{},indexedDB:(function(){if(typeof indexedDB!==\"undefined\")return indexedDB;var ret=null;if(typeof window===\"object\")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,\"IDBFS used, but indexedDB not supported\");return ret}),DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:(function(mount){return MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback(\"Unable to connect to IndexedDB\")}req.onupgradeneeded=(function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains(\"timestamp\")){fileStore.createIndex(\"timestamp\",\"timestamp\",{unique:false})}});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),getLocalSet:(function(mount,callback){var entries={};function isRealDir(p){return p!==\".\"&&p!==\"..\"}function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:\"local\",entries:entries})}),getRemoteSet:(function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return callback(err);var transaction=db.transaction([IDBFS.DB_STORE_NAME],\"readonly\");transaction.onerror=(function(e){callback(this.error);e.preventDefault()});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index(\"timestamp\");index.openKeyCursor().onsuccess=(function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:\"remote\",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}))}),loadLocalEntry:(function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error(\"node type not supported\"))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{encoding:\"binary\",canOwn:true})}else{return callback(new Error(\"node type not supported\"))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),storeRemoteEntry:(function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),removeRemoteEntry:(function(store,path,callback){var req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),reconcile:(function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach((function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type===\"remote\"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],\"readwrite\");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type===\"local\"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type===\"local\"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,\"/\",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,\"\",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i<res;i++){buffer[offset+i]=nbuffer[i]}}return res}),write:(function(stream,buffer,offset,length,position){var nbuffer=new Buffer(buffer.subarray(offset,offset+length));var res;try{res=fs.writeSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}return res}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,\"/\",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split(\"/\");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join(\"/\");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split(\"/\");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts[\"files\"]||[],(function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)}));(mount.opts[\"blobs\"]||[]).forEach((function(obj){WORKERFS.createNode(ensureParent(obj[\"name\"]),base(obj[\"name\"]),WORKERFS.FILE_MODE,0,obj[\"data\"])}));(mount.opts[\"packages\"]||[]).forEach((function(pack){pack[\"metadata\"].files.forEach((function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack[\"blob\"].slice(file.start,file.end))}))}));return root}),createNode:(function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node}),node_ops:{getattr:(function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}}),lookup:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}),mknod:(function(parent,name,mode,dev){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rename:(function(oldNode,newDir,newName){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),unlink:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rmdir:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readdir:(function(node){var entries=[\".\",\"..\"];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newName,oldPath){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readlink:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)})},stream_ops:{read:(function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var _stdin;if(ENVIRONMENT_IS_PTHREAD)_stdin=PthreadWorkerInit._stdin;else PthreadWorkerInit._stdin=_stdin=allocate(1,\"i32*\",ALLOC_STATIC);var _stdout;if(ENVIRONMENT_IS_PTHREAD)_stdout=PthreadWorkerInit._stdout;else PthreadWorkerInit._stdout=_stdout=allocate(1,\"i32*\",ALLOC_STATIC);var _stderr;if(ENVIRONMENT_IS_PTHREAD)_stderr=PthreadWorkerInit._stderr;else PthreadWorkerInit._stderr=_stderr=allocate(1,\"i32*\",ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+\" : \"+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:\"\",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split(\"/\").filter((function(p){return!!p})),false);var current=FS.root;var current_path=\"/\";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!==\"/\"?mount+\"/\"+path:mount+path}path=path?node.name+\"/\"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags===\"undefined\"){throw new Error(\"Unknown file open mode: \"+str)}return flags}),flagsToPermissionString:(function(flag){var perms=[\"r\",\"w\",\"rw\"][flag&3];if(flag&512){perms+=\"w\"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf(\"r\")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf(\"w\")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf(\"x\")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,\"x\");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,\"wx\")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,\"wx\");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!==\"r\"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate===\"function\"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log(\"warning: \"+FS.syncFSRequests+\" FS.syncfs operations in flight at once, probably just doing extra work\")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint===\"/\";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name===\".\"||name===\"..\"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split(\"/\");var d=\"\";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+=\"/\"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=ERRNO_CODES.EEXIST)throw e}}}),mkdev:(function(path,mode,dev){if(typeof dev===\"undefined\"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,\"w\");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate[\"willMovePath\"]){FS.trackingDelegate[\"willMovePath\"](old_path,new_path)}}catch(e){console.log(\"FS.trackingDelegate['willMovePath']('\"+old_path+\"', '\"+new_path+\"') threw an exception: \"+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate[\"onMovePath\"])FS.trackingDelegate[\"onMovePath\"](old_path,new_path)}catch(e){console.log(\"FS.trackingDelegate['onMovePath']('\"+old_path+\"', '\"+new_path+\"') threw an exception: \"+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\"willDeletePath\"]){FS.trackingDelegate[\"willDeletePath\"](path)}}catch(e){console.log(\"FS.trackingDelegate['willDeletePath']('\"+path+\"') threw an exception: \"+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\"onDeletePath\"])FS.trackingDelegate[\"onDeletePath\"](path)}catch(e){console.log(\"FS.trackingDelegate['onDeletePath']('\"+path+\"') threw an exception: \"+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\"willDeletePath\"]){FS.trackingDelegate[\"willDeletePath\"](path)}}catch(e){console.log(\"FS.trackingDelegate['willDeletePath']('\"+path+\"') threw an exception: \"+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\"onDeletePath\"])FS.trackingDelegate[\"onDeletePath\"](path)}catch(e){console.log(\"FS.trackingDelegate['onDeletePath']('\"+path+\"') threw an exception: \"+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,\"w\");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===\"\"){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags===\"string\"?FS.modeStringToFlags(flags):flags;mode=typeof mode===\"undefined\"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path===\"object\"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module[\"logReadFiles\"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module[\"printErr\"](\"read file: \"+path)}}try{if(FS.trackingDelegate[\"onOpenFile\"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate[\"onOpenFile\"](path,trackingFlags)}}catch(e){console.log(\"FS.trackingDelegate['onOpenFile']('\"+path+\"', flags) threw an exception: \"+e.message)}return stream}),close:(function(stream){if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position===\"undefined\"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position===\"undefined\"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate[\"onWriteToFile\"])FS.trackingDelegate[\"onWriteToFile\"](stream.path)}catch(e){console.log(\"FS.trackingDelegate['onWriteToFile']('\"+path+\"') threw an exception: \"+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||\"r\";opts.encoding=opts.encoding||\"binary\";if(opts.encoding!==\"utf8\"&&opts.encoding!==\"binary\"){throw new Error('Invalid encoding type \"'+opts.encoding+'\"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding===\"utf8\"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding===\"binary\"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||\"w\";opts.encoding=opts.encoding||\"utf8\";if(opts.encoding!==\"utf8\"&&opts.encoding!==\"binary\"){throw new Error('Invalid encoding type \"'+opts.encoding+'\"')}var stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding===\"utf8\"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else if(opts.encoding===\"binary\"){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,\"x\");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir(\"/tmp\");FS.mkdir(\"/home\");FS.mkdir(\"/home/web_user\")}),createDefaultDevices:(function(){FS.mkdir(\"/dev\");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev(\"/dev/null\",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev(\"/dev/tty\",FS.makedev(5,0));FS.mkdev(\"/dev/tty1\",FS.makedev(6,0));var random_device;if(typeof crypto!==\"undefined\"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require(\"crypto\").randomBytes(1)[0]})}else{random_device=(function(){return Math.random()*256|0})}FS.createDevice(\"/dev\",\"random\",random_device);FS.createDevice(\"/dev\",\"urandom\",random_device);FS.mkdir(\"/dev/shm\");FS.mkdir(\"/dev/shm/tmp\")}),createSpecialDirectories:(function(){FS.mkdir(\"/proc\");FS.mkdir(\"/proc/self\");FS.mkdir(\"/proc/self/fd\");FS.mount({mount:(function(){var node=FS.createNode(\"/proc/self\",\"fd\",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:\"fake\"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},\"/proc/self/fd\")}),createStandardStreams:(function(){if(Module[\"stdin\"]){FS.createDevice(\"/dev\",\"stdin\",Module[\"stdin\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdin\")}if(Module[\"stdout\"]){FS.createDevice(\"/dev\",\"stdout\",null,Module[\"stdout\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdout\")}if(Module[\"stderr\"]){FS.createDevice(\"/dev\",\"stderr\",null,Module[\"stderr\"])}else{FS.symlink(\"/dev/tty1\",\"/dev/stderr\")}var stdin=FS.open(\"/dev/stdin\",\"r\");assert(stdin.fd===0,\"invalid handle for stdin (\"+stdin.fd+\")\");var stdout=FS.open(\"/dev/stdout\",\"w\");assert(stdout.fd===1,\"invalid handle for stdout (\"+stdout.fd+\")\");var stderr=FS.open(\"/dev/stderr\",\"w\");assert(stderr.fd===2,\"invalid handle for stderr (\"+stderr.fd+\")\")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=\"<generic error, no stack>\"}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},\"/\");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={\"MEMFS\":MEMFS,\"IDBFS\":IDBFS,\"NODEFS\":NODEFS,\"WORKERFS\":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,\"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)\");FS.init.initialized=true;FS.ensureErrnoError();Module[\"stdin\"]=input||Module[\"stdin\"];Module[\"stdout\"]=output||Module[\"stdout\"];Module[\"stderr\"]=error||Module[\"stderr\"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module[\"_fflush\"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}),joinPath:(function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]==\"/\")path=path.substr(1);return path}),absolutePath:(function(relative,base){return PATH.resolve(base,relative)}),standardizePath:(function(path){return PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}}),analyzePath:(function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path===\"/\"}catch(e){ret.error=e.errno}return ret}),createFolder:(function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof parent===\"string\"?parent:FS.getPath(parent);var parts=path.split(\"/\").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current}),createFile:(function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data===\"string\"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,\"w\");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node}),createDevice:(function(parent,name,input,output){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})});return FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);return FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!==\"undefined\"){throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\")}else if(Module[\"read\"]){try{obj.contents=intArrayFromString(Module[\"read\"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error(\"Cannot load without read() or XMLHttpRequest.\")}if(!success)___setErrNo(ERRNO_CODES.EIO);return success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open(\"HEAD\",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);var datalength=Number(xhr.getResponseHeader(\"Content-length\"));var header;var hasByteServing=(header=xhr.getResponseHeader(\"Accept-Ranges\"))&&header===\"bytes\";var usesGzip=(header=xhr.getResponseHeader(\"Content-Encoding\"))&&header===\"gzip\";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error(\"invalid range (\"+from+\", \"+to+\") or no bytes requested!\");if(to>datalength-1)throw new Error(\"only \"+datalength+\" bytes available! programmer error!\");var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);if(datalength!==chunkSize)xhr.setRequestHeader(\"Range\",\"bytes=\"+from+\"-\"+to);if(typeof Uint8Array!=\"undefined\")xhr.responseType=\"arraybuffer\";if(xhr.overrideMimeType){xhr.overrideMimeType(\"text/plain; charset=x-user-defined\")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||\"\",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]===\"undefined\"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]===\"undefined\")throw new Error(\"doXHR failed!\");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log(\"LazyFiles on gzip forces download of the whole file when length is accessed\")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!==\"undefined\"){if(!ENVIRONMENT_IS_WORKER)throw\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(\"cp \"+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module[\"preloadPlugins\"].forEach((function(plugin){if(handled)return;if(plugin[\"canHandle\"](fullname)){plugin[\"handle\"](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(dep)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url==\"string\"){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return\"EM_FS_\"+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log(\"creating db\");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],\"readwrite\");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],\"readonly\")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:(function(dirfd,path){if(path[0]!==\"/\"){var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return path}),doStat:(function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]===\"/\")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms=\"\";if(amode&4)perms+=\"r\";if(amode&2)perms+=\"w\";if(amode&1)perms+=\"x\";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}),doWritev:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,6,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,54,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort(\"bad ioctl syscall \"+op)}}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;function __exit(status){Module[\"exit\"](status)}function _exit(status){__exit(status)}function _pthread_exit(status){if(!ENVIRONMENT_IS_PTHREAD)_exit(status);else PThread.threadExit(status)}Module[\"_testSetjmp\"]=_testSetjmp;function _longjmp(env,value){Module[\"setThrew\"](env,value||1);throw\"longjmp\"}function _emscripten_futex_wake_or_requeue(addr,count,addr2,cmpValue){if(addr<=0||addr2<=0||addr>=HEAP8.length||addr2>=HEAP8.length||count<0||addr&3!=0||addr2&3!=0){return-22}var mainThreadWaitAddress=Atomics.load(HEAP32,__main_thread_futex_wait_address>>2);var mainThreadWoken=0;if(mainThreadWaitAddress==addr){var val1=Atomics.load(HEAP32,addr>>2);if(val1!=cmpValue)return-11;var newMainThreadWaitAddress=count>0?0:addr2;var loadedAddr=Atomics.compareExchange(HEAP32,__main_thread_futex_wait_address>>2,mainThreadWaitAddress,newMainThreadWaitAddress);if(loadedAddr==mainThreadWaitAddress&&count>0){--count;mainThreadWoken=1}}var ret=Atomics.wakeOrRequeue(HEAP32,addr>>2,count,addr2>>2,cmpValue);if(ret==Atomics.NOTEQUAL)return-11;if(ret>=0)return ret+mainThreadWoken;throw\"Atomics.wakeOrRequeue returned an unexpected value \"+ret}function _unsetenv(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(114,name);if(name===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}name=Pointer_stringify(name);if(name===\"\"||name.indexOf(\"=\")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)){delete ENV[name];___buildEnvironment(ENV)}return 0}function _pthread_cleanup_push(routine,arg){if(PThread.exitHandlers===null){PThread.exitHandlers=[];if(!ENVIRONMENT_IS_PTHREAD){__ATEXIT__.push((function(){PThread.runExitHandlers()}))}}PThread.exitHandlers.push((function(){Module[\"dynCall_vi\"](routine,arg)}))}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!==\"undefined\"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self[\"performance\"]&&self[\"performance\"][\"now\"]}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(){return _clock_gettime.apply(null,arguments)}function _getenv(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(111,name);if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocate(intArrayFromString(ENV[name]),\"i8\",ALLOC_NORMAL);return _getenv.ret}function _emscripten_conditional_set_current_thread_status_js(expectedStatus,newStatus){}Module[\"_emscripten_conditional_set_current_thread_status\"]=_emscripten_conditional_set_current_thread_status;function _pthread_cleanup_pop(execute){var routine=PThread.exitHandlers.pop();if(execute)routine()}function __cleanup_thread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw\"Internal Error! _cleanup_thread() can only ever be called from main application thread!\";if(!pthread_ptr)throw\"Internal Error! Null pthread_ptr in _cleanup_thread!\";HEAP32[pthread_ptr+24>>2]=0;var pthread=PThread.pthreads[pthread_ptr];var worker=pthread.worker;PThread.freeThreadData(pthread);worker.pthread=undefined;PThread.unusedWorkerPool.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker.pthread),1)}function __pthread_testcancel_js(){if(!ENVIRONMENT_IS_PTHREAD)return;if(!threadInfoStruct)return;var cancelDisabled=Atomics.load(HEAPU32,threadInfoStruct+72>>2);if(cancelDisabled)return;var canceled=Atomics.load(HEAPU32,threadInfoStruct+0>>2);if(canceled==2)throw\"Canceled!\"}function _pthread_join(thread,status){if(!thread){Module[\"printErr\"](\"pthread_join attempted on a null thread pointer!\");return ERRNO_CODES.ESRCH}if(ENVIRONMENT_IS_PTHREAD&&selfThreadId==thread){Module[\"printErr\"](\"PThread \"+thread+\" is attempting to join to itself!\");return ERRNO_CODES.EDEADLK}else if(!ENVIRONMENT_IS_PTHREAD&&PThread.mainThreadBlock==thread){Module[\"printErr\"](\"Main thread \"+thread+\" is attempting to join to itself!\");return ERRNO_CODES.EDEADLK}var self=HEAP32[thread+24>>2];if(self!=thread){Module[\"printErr\"](\"pthread_join attempted on thread \"+thread+\", which does not point to a valid thread, or does not exist anymore!\");return ERRNO_CODES.ESRCH}var detached=Atomics.load(HEAPU32,thread+80>>2);if(detached){Module[\"printErr\"](\"Attempted to join thread \"+thread+\", which was already detached!\");return ERRNO_CODES.EINVAL}for(;;){var threadStatus=Atomics.load(HEAPU32,thread+0>>2);if(threadStatus==1){var threadExitCode=Atomics.load(HEAPU32,thread+4>>2);if(status)HEAP32[status>>2]=threadExitCode;Atomics.store(HEAPU32,thread+80>>2,1);if(!ENVIRONMENT_IS_PTHREAD)__cleanup_thread(thread);else postMessage({cmd:\"cleanupThread\",thread:thread});return 0}__pthread_testcancel_js();if(!ENVIRONMENT_IS_PTHREAD)_emscripten_main_thread_process_queued_calls();_emscripten_futex_wait(thread+0,threadStatus,ENVIRONMENT_IS_PTHREAD?100:1)}}function _confstr(name,buf,len){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_3(68,name,buf,len);var value;switch(name){case 0:value=ENV[\"PATH\"]||\"/\";break;case 1:value=\"POSIX_V6_ILP32_OFF32\\nPOSIX_V6_ILP32_OFFBIG\";break;case 2:value=\"glibc 2.14\";break;case 3:value=\"\";break;case 1118:case 1122:case 1124:case 1125:case 1126:case 1128:case 1129:case 1130:value=\"\";break;case 1116:case 1117:case 1121:value=\"-m32\";break;case 1120:value=\"-m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64\";break;default:___setErrNo(ERRNO_CODES.EINVAL);return 0}if(len==0||buf==0){return value.length+1}else{var length=Math.min(len,value.length);for(var i=0;i<length;i++){HEAP8[buf+i>>0]=value.charCodeAt(i)}if(len>length)HEAP8[buf+i++>>0]=0;return i}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;function _utime(path,times){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(12,path,times);var time;if(times){var offset=4;time=HEAP32[times+offset>>2];time*=1e3}else{time=Date.now()}path=Pointer_stringify(path);try{FS.utime(path,time,time);return 0}catch(e){FS.handleFSError(e);return-1}}var cttz_i8;if(ENVIRONMENT_IS_PTHREAD)cttz_i8=PthreadWorkerInit.cttz_i8;else PthreadWorkerInit.cttz_i8=cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);Module[\"_llvm_cttz_i32\"]=_llvm_cttz_i32;Module[\"___udivmoddi4\"]=___udivmoddi4;Module[\"___udivdi3\"]=___udivdi3;function _emscripten_futex_wake(addr,count){if(addr<=0||addr>HEAP8.length||addr&3!=0||count<0)return-22;if(count==0)return 0;var mainThreadWaitAddress=Atomics.load(HEAP32,__main_thread_futex_wait_address>>2);var mainThreadWoken=0;if(mainThreadWaitAddress==addr){var loadedAddr=Atomics.compareExchange(HEAP32,__main_thread_futex_wait_address>>2,mainThreadWaitAddress,0);if(loadedAddr==mainThreadWaitAddress){--count;mainThreadWoken=1;if(count<=0)return 1}}var ret=Atomics.wake(HEAP32,addr>>2,count);if(ret>=0)return ret+mainThreadWoken;throw\"Atomics.wake returned an unexpected value \"+ret}function _emscripten_syscall(which,varargs){switch(which){case 6:return ___syscall6(which,varargs);case 54:return ___syscall54(which,varargs);case 146:return ___syscall146(which,varargs);case 140:return ___syscall140(which,varargs);default:throw\"surprising proxied syscall: \"+which}}Module[\"_bitshift64Shl\"]=_bitshift64Shl;function ___syscall146(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,146,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_is_main_runtime_thread(){return __pthread_is_main_runtime_thread|0}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}Module[\"___uremdi3\"]=___uremdi3;function _fpathconf(fildes,name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(46,fildes,name);switch(name){case 0:return 32e3;case 1:case 2:case 3:return 255;case 4:case 5:case 16:case 17:case 18:return 4096;case 6:case 7:case 20:return 1;case 8:return 0;case 9:case 10:case 11:case 12:case 14:case 15:case 19:return-1;case 13:return 64}___setErrNo(ERRNO_CODES.EINVAL);return-1}function _abort(){Module[\"abort\"]()}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;Module[\"_sbrk\"]=_sbrk;function ___syscall140(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,140,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _utimes(path,times){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(13,path,times);var time;if(times){var offset=8+0;time=HEAP32[times+offset>>2]*1e3;offset=8+4;time+=HEAP32[times+offset>>2]/1e3}else{time=Date.now()}path=Pointer_stringify(path);try{FS.utime(path,time,time);return 0}catch(e){FS.handleFSError(e);return-1}}function _clearenv(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(112,name);ENV={};___buildEnvironment(ENV);return 0}if(!ENVIRONMENT_IS_PTHREAD){PThread.initMainThreadBlock()}else{Module.PThread=PThread}if(!ENVIRONMENT_IS_PTHREAD)___buildEnvironment(ENV);if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process[\"hrtime\"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!==\"undefined\"){_emscripten_get_now=dateNow}else if(typeof self===\"object\"&&self[\"performance\"]&&typeof self[\"performance\"][\"now\"]===\"function\"){_emscripten_get_now=(function(){return self[\"performance\"][\"now\"]()})}else if(typeof performance===\"object\"&&typeof performance[\"now\"]===\"function\"){_emscripten_get_now=(function(){return performance[\"now\"]()})}else{_emscripten_get_now=Date.now}FS.staticInit();__ATINIT__.unshift((function(){if(!Module[\"noFSInit\"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module[\"FS_createFolder\"]=FS.createFolder;Module[\"FS_createPath\"]=FS.createPath;Module[\"FS_createDataFile\"]=FS.createDataFile;Module[\"FS_createPreloadedFile\"]=FS.createPreloadedFile;Module[\"FS_createLazyFile\"]=FS.createLazyFile;Module[\"FS_createLink\"]=FS.createLink;Module[\"FS_createDevice\"]=FS.createDevice;Module[\"FS_unlink\"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require(\"fs\");var NODEJS_PATH=require(\"path\");NODEFS.staticInit()}if(!ENVIRONMENT_IS_PTHREAD){DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true}function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_i(index){try{return Module[\"dynCall_i\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module[\"dynCall_viii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmGlobalArg[\"Atomics\"]=Atomics;Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_i\":invoke_i,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_viii\":invoke_viii,\"invoke_v\":invoke_v,\"invoke_viiiiii\":invoke_viiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"invoke_viiii\":invoke_viiii,\"__spawn_thread\":__spawn_thread,\"_pthread_cleanup_pop\":_pthread_cleanup_pop,\"_putenv\":_putenv,\"_emscripten_get_now_is_monotonic\":_emscripten_get_now_is_monotonic,\"_emscripten_is_main_runtime_thread\":_emscripten_is_main_runtime_thread,\"_tzset\":_tzset,\"_unsetenv\":_unsetenv,\"_emscripten_futex_wake_or_requeue\":_emscripten_futex_wake_or_requeue,\"_emscripten_syscall\":_emscripten_syscall,\"___assert_fail\":___assert_fail,\"_utimes\":_utimes,\"___buildEnvironment\":___buildEnvironment,\"_longjmp\":_longjmp,\"_sysconf\":_sysconf,\"_clock_gettime\":_clock_gettime,\"_emscripten_futex_wait\":_emscripten_futex_wait,\"_ogvjs_callback_async_complete\":_ogvjs_callback_async_complete,\"___setErrNo\":___setErrNo,\"_emscripten_set_current_thread_status_js\":_emscripten_set_current_thread_status_js,\"_pthread_getschedparam\":_pthread_getschedparam,\"_clearenv\":_clearenv,\"_emscripten_asm_const_v\":_emscripten_asm_const_v,\"_emscripten_futex_wake\":_emscripten_futex_wake,\"__exit\":__exit,\"_utime\":_utime,\"___pthread_setcancelstate\":___pthread_setcancelstate,\"___syscall6\":___syscall6,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"_exit\":_exit,\"_confstr\":_confstr,\"_pthread_self\":_pthread_self,\"_pthread_join\":_pthread_join,\"_getenv\":_getenv,\"_pthread_exit\":_pthread_exit,\"___syscall54\":___syscall54,\"_emscripten_num_logical_cores\":_emscripten_num_logical_cores,\"_pthread_create\":_pthread_create,\"__register_pthread_ptr\":__register_pthread_ptr,\"_emscripten_get_now\":_emscripten_get_now,\"_chroot\":_chroot,\"_emscripten_force_num_logical_cores\":_emscripten_force_num_logical_cores,\"__pthread_testcancel_js\":__pthread_testcancel_js,\"_abort\":_abort,\"_pthread_cleanup_push\":_pthread_cleanup_push,\"___clock_gettime\":___clock_gettime,\"__cleanup_thread\":__cleanup_thread,\"_gettimeofday\":_gettimeofday,\"_atexit\":_atexit,\"___syscall140\":___syscall140,\"_fpathconf\":_fpathconf,\"_setenv\":_setenv,\"___syscall146\":___syscall146,\"_emscripten_conditional_set_current_thread_status_js\":_emscripten_conditional_set_current_thread_status_js,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_iiii;var aa=env.invoke_i;var ba=env.invoke_vi;var ca=env.invoke_vii;var da=env.invoke_ii;var ea=env.invoke_viii;var fa=env.invoke_v;var ga=env.invoke_viiiiii;var ha=env.invoke_iii;var ia=env.invoke_iiiiii;var ja=env.invoke_viiii;var ka=env.__spawn_thread;var la=env._pthread_cleanup_pop;var ma=env._putenv;var na=env._emscripten_get_now_is_monotonic;var oa=env._emscripten_is_main_runtime_thread;var pa=env._tzset;var qa=env._unsetenv;var ra=env._emscripten_futex_wake_or_requeue;var sa=env._emscripten_syscall;var ta=env.___assert_fail;var ua=env._utimes;var va=env.___buildEnvironment;var wa=env._longjmp;var xa=env._sysconf;var ya=env._clock_gettime;var za=env._emscripten_futex_wait;var Aa=env._ogvjs_callback_async_complete;var Ba=env.___setErrNo;var Ca=env._emscripten_set_current_thread_status_js;var Da=env._pthread_getschedparam;var Ea=env._clearenv;var Fa=env._emscripten_asm_const_v;var Ga=env._emscripten_futex_wake;var Ha=env.__exit;var Ia=env._utime;var Ja=env.___pthread_setcancelstate;var Ka=env.___syscall6;var La=env._emscripten_memcpy_big;var Ma=env._ogvjs_callback_frame;var Na=env._exit;var Oa=env._confstr;var Pa=env._pthread_self;var Qa=env._pthread_join;var Ra=env._getenv;var Sa=env._pthread_exit;var Ta=env.___syscall54;var Ua=env._emscripten_num_logical_cores;var Va=env._pthread_create;var Wa=env.__register_pthread_ptr;var Xa=env._emscripten_get_now;var Ya=env._chroot;var Za=env._emscripten_force_num_logical_cores;var _a=env.__pthread_testcancel_js;var $a=env._abort;var ab=env._pthread_cleanup_push;var bb=env.___clock_gettime;var cb=env.__cleanup_thread;var db=env._gettimeofday;var eb=env._atexit;var fb=env.___syscall140;var gb=env._fpathconf;var hb=env._setenv;var ib=env.___syscall146;var jb=env._emscripten_conditional_set_current_thread_status_js;var kb=global.Atomics.load;var lb=global.Atomics.store;var mb=global.Atomics.exchange;var nb=global.Atomics.compareExchange;var ob=global.Atomics.add;var pb=global.Atomics.sub;var qb=global.Atomics.and;var rb=global.Atomics.or;var sb=global.Atomics.xor;var tb=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction qe(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0;h=l;l=l+96|0;i=h+80|0;j=h+32|0;k=h+16|0;m=h;n=c[e+11848>>2]|0;o=e+5720|0;c[i>>2]=(c[o>>2]|0)+n;p=c[e+11436>>2]|0;q=c[e+3232>>2]|0;r=c[e+3236>>2]|0;s=c[q+16>>2]|0;t=c[q+36>>2]|0;c[k>>2]=0;c[j+12>>2]=c[r+52>>2];c[j+16>>2]=c[r+56>>2];c[j+20>>2]=c[r+60>>2];c[k+4>>2]=c[r+112>>2];u=c[e+3240>>2]|0;c[j+24>>2]=c[u+52>>2];c[j+28>>2]=c[u+56>>2];c[j+32>>2]=c[u+60>>2];c[k+8>>2]=c[u+112>>2];u=c[e+3244>>2]|0;c[j+36>>2]=c[u+52>>2];c[j+40>>2]=c[u+56>>2];c[j+44>>2]=c[u+60>>2];c[k+12>>2]=c[u+112>>2];u=1<<p;p=c[q+52>>2]|0;v=c[q+56>>2]|0;w=c[q+60>>2]|0;x=f+3100|0;c[x>>2]=(g|0)!=0&1;y=c[e+5724>>2]|0;z=f+3088|0;c[z>>2]=(c[e+5772>>2]|0)+((S(y,g)|0)*76|0);A=f+3092|0;c[A>>2]=y;y=e+5716|0;B=c[y>>2]|0;if((B|0)>(g|0)){C=f+3216|0;D=e+11852|0;E=s<<4;F=t<<3;G=e+9188|0;H=f+3140|0;I=f+3144|0;J=f+3104|0;K=f+3192|0;L=f+3196|0;M=e+9136|0;N=f+3108|0;O=f+3112|0;P=f+3116|0;Q=f+3120|0;R=f+3124|0;T=f+3128|0;U=f+2984|0;V=f+3004|0;W=f+3132|0;X=f+3136|0;Y=e+11892|0;Z=e+11896|0;_=e+11900|0;$=e+11904|0;aa=f+3120|0;ba=e+11908|0;ca=e+11912|0;da=f+3020|0;ea=f+3024|0;fa=f+3028|0;ga=e+11856|0;ha=e+11888|0;ia=e+11824|0;ja=f+3184|0;ka=f+3188|0;la=f+2900|0;ma=f+2904|0;na=f+2908|0;oa=f+3220|0;pa=f+3148|0;qa=f+2016|0;ra=f+1984|0;sa=f+896|0;ta=f+2112|0;ua=f+2e3|0;va=f+384|0;wa=f+2816|0;xa=f+2008|0;ya=f+2080|0;za=f+2820|0;Aa=f+2048|0;Ba=e+5780|0;Ca=e+5700|0;Da=m+4|0;Ea=m+8|0;Fa=m+12|0;Ga=s*15|0;Ha=t*7|0;Ia=n+-1|0;Ja=s+15|0;Ka=(s<<1)+15|0;La=(s*3|0)+15|0;Ma=(s<<2)+15|0;Na=(s*5|0)+15|0;Oa=(s*6|0)+15|0;Pa=(s*7|0)+15|0;Qa=(s<<3)+15|0;Ra=(s*9|0)+15|0;Sa=(s*10|0)+15|0;Ta=(s*11|0)+15|0;Ua=(s*12|0)+15|0;Va=(s*13|0)+15|0;Wa=(s*14|0)+15|0;Xa=Ga+15|0;Ya=t+7|0;Za=(t<<1)+7|0;_a=(t*3|0)+7|0;$a=(t<<2)+7|0;ab=(t*5|0)+7|0;bb=(t*6|0)+7|0;cb=Ha+7|0;db=g;while(1){c[C>>2]=e+11456+(((db|0)%(u|0)|0)*28|0);eb=(db|0)>0;fb=c[D>>2]|0;gb=db+-1|0;hb=eb?fb+(gb<<2)|0:i;ib=fb+(db<<2)|0;fb=S(E,db)|0;jb=S(F,db)|0;c[H>>2]=c[G>>2];kb=c[I>>2]|0;lb=kb+9|0;do{a[kb>>0]=0;kb=kb+1|0}while((kb|0)<(lb|0));c[J>>2]=0;c[K>>2]=0-(db<<7);c[L>>2]=33554431-db+(c[y>>2]|0)<<7;if(!(c[M>>2]|0)){mb=p+fb|0;nb=v+jb|0;ob=w+jb|0;pb=mb+-1|0;c[Q>>2]=pb;qb=nb+-1|0;c[R>>2]=qb;rb=ob+-1|0;c[T>>2]=rb;sb=c[U>>2]|0;c[N>>2]=mb+(0-sb);mb=c[V>>2]|0;tb=0-mb|0;c[O>>2]=nb+tb;c[P>>2]=ob+tb;c[W>>2]=sb;c[X>>2]=mb;a[pb>>0]=-127;a[pb+sb>>0]=-127;a[pb+(sb<<1)>>0]=-127;a[pb+(sb*3|0)>>0]=-127;a[pb+(sb<<2)>>0]=-127;a[pb+(sb*5|0)>>0]=-127;a[pb+(sb*6|0)>>0]=-127;a[pb+(sb*7|0)>>0]=-127;a[pb+(sb<<3)>>0]=-127;a[pb+(sb*9|0)>>0]=-127;a[pb+(sb*10|0)>>0]=-127;a[pb+(sb*11|0)>>0]=-127;a[pb+(sb*12|0)>>0]=-127;a[pb+(sb*13|0)>>0]=-127;a[pb+(sb*14|0)>>0]=-127;a[pb+(sb*15|0)>>0]=-127;a[qb>>0]=-127;a[qb+mb>>0]=-127;sb=mb<<1;a[qb+sb>>0]=-127;pb=mb*3|0;a[qb+pb>>0]=-127;tb=mb<<2;a[qb+tb>>0]=-127;ob=mb*5|0;a[qb+ob>>0]=-127;nb=mb*6|0;a[qb+nb>>0]=-127;ub=mb*7|0;a[qb+ub>>0]=-127;a[rb>>0]=-127;a[rb+mb>>0]=-127;a[rb+sb>>0]=-127;a[rb+pb>>0]=-127;a[rb+tb>>0]=-127;a[rb+ob>>0]=-127;a[rb+nb>>0]=-127;a[rb+ub>>0]=-127}else{c[N>>2]=(c[(c[Y>>2]|0)+(db<<2)>>2]|0)+32;c[O>>2]=(c[(c[Z>>2]|0)+(db<<2)>>2]|0)+16;c[P>>2]=(c[(c[_>>2]|0)+(db<<2)>>2]|0)+16;c[aa>>2]=c[(c[$>>2]|0)+(db<<2)>>2];c[R>>2]=c[(c[ba>>2]|0)+(db<<2)>>2];c[T>>2]=c[(c[ca>>2]|0)+(db<<2)>>2];c[W>>2]=1;c[X>>2]=1}if((c[o>>2]|0)>0){ub=(db|0)!=0;rb=db+1|0;nb=0;ob=jb;tb=fb;while(1){pb=nb+-1|0;if(!((pb|0)%(n|0)|0)){sb=(c[ga>>2]|0)+(db*28|0)|0;mb=(c[ha>>2]|0)+(db*48|0)|0;fg(sb)|0;c[ib>>2]=pb;if(mb|0)tg(mb)|0;cg(sb)|0}if(ub&(nb&Ia|0)==0){sb=(c[ga>>2]|0)+(gb*28|0)|0;mb=(c[ha>>2]|0)+(gb*48|0)|0;fg(sb)|0;if(((c[hb>>2]|0)-n|0)<(nb|0))do zg(mb,sb)|0;while(((c[hb>>2]|0)-n|0)<(nb|0));cg(sb)|0}mb=nb<<4;c[ja>>2]=0-(nb<<7);c[ka>>2]=33554431-nb+(c[o>>2]|0)<<7;c[da>>2]=p+tb;c[ea>>2]=v+ob;c[fa>>2]=w+ob;pb=c[z>>2]|0;qb=d[pb+2>>0]|0;c[la>>2]=(c[j+(qb*12|0)>>2]|0)+tb;c[ma>>2]=(c[j+(qb*12|0)+4>>2]|0)+ob;c[na>>2]=(c[j+(qb*12|0)+8>>2]|0)+ob;c[oa>>2]=c[oa>>2]|c[k+(qb<<2)>>2];if(!(a[pb+9>>0]|0))if(((c[(c[C>>2]|0)+12>>2]|0)+-33|0)>>>0<1073741791)vb=pb;else{pb=(de(e,f)|0)==0&1;qb=c[z>>2]|0;a[qb+9>>0]=pb;vb=qb}else{ce(f);vb=c[z>>2]|0}qb=a[vb>>0]|0;if(!(a[pa>>0]|0))wb=vb;else{$d(e,f);wb=c[z>>2]|0}a:do if(!(a[wb+2>>0]|0)){Cd(f,c[O>>2]|0,c[P>>2]|0,c[R>>2]|0,c[T>>2]|0,c[X>>2]|0,c[ea>>2]|0,c[fa>>2]|0,c[V>>2]|0);pb=c[N>>2]|0;if(qb<<24>>24!=4){Bd(f,pb,c[aa>>2]|0,c[W>>2]|0,c[da>>2]|0,c[U>>2]|0);break}xb=c[U>>2]|0;yb=c[z>>2]|0;if(a[yb+9>>0]|0){c[ra>>2]=0;c[ra+4>>2]=0;c[ra+8>>2]=0;c[ra+12>>2]=0;c[ra+16>>2]=0;c[ra+20>>2]=0;a[ra+24>>0]=0}zb=pb+16|0;pb=c[da>>2]|0;Ab=0-xb|0;Bb=pb+Ab+16|0;c[Bb+(xb<<2)>>2]=c[zb>>2];c[Bb+(xb<<3)>>2]=c[zb>>2];c[Bb+(xb*12|0)>>2]=c[zb>>2];zb=pb;pb=yb;yb=0;while(1){Bb=c[f+2144+(yb*28|0)+16>>2]|0;Cb=zb+Bb|0;Db=c[pb+12+(yb<<2)>>2]|0;if((yb|0)<4?(c[M>>2]|0)!=0:0)Eb=(c[N>>2]|0)+Bb|0;else Eb=Cb+Ab|0;if((yb&3|0)==0?(c[M>>2]|0)!=0:0){Fb=1;Gb=(c[aa>>2]|0)+yb|0}else{Fb=xb;Gb=Cb+-1|0}switch(yb|0){case 4:case 8:case 12:{if(!(c[M>>2]|0))Hb=Eb;else Hb=(c[aa>>2]|0)+yb|0;break}default:Hb=Eb}Gd(Eb,Gb,Fb,Db,Cb,xb,a[Hb+-1>>0]|0);Db=a[f+1984+yb>>0]|0;do if(Db<<24>>24){Bb=f+2144+(yb*28|0)|0;Ib=c[Bb>>2]|0;if(Db<<24>>24>1){Fc(Ib,qa,Cb,xb);break}else{Wc((S(b[qa>>1]|0,b[Ib>>1]|0)|0)&65535,Cb,xb,Cb,xb);Ib=c[Bb>>2]|0;b[Ib>>1]=0;b[Ib+2>>1]=0>>>16;break}}while(0);Cb=yb+1|0;if((Cb|0)==16)break a;zb=c[da>>2]|0;pb=c[z>>2]|0;yb=Cb}}else zd(f);while(0);if(!(a[(c[z>>2]|0)+9>>0]|0)){b:do switch(qb<<24>>24){case 4:break;case 9:{Jb=qa;Kb=51;break}default:if((a[xa>>0]|0)>1){Ec(wa,ya);Xc(c[za>>2]|0,va);kb=c[wa>>2]|0;lb=kb+32|0;do{b[kb>>1]=0;kb=kb+2|0}while((kb|0)<(lb|0));Jb=Aa;Kb=51;break b}else{sb=(S(b[ya>>1]|0,b[c[wa>>2]>>1]|0)|0)&65535;yb=c[za>>2]|0;b[yb>>1]=sb;Yc(yb,va);yb=c[wa>>2]|0;b[yb>>1]=0;b[yb+2>>1]=0>>>16;Jb=Aa;Kb=51;break b}}while(0);if((Kb|0)==51){Kb=0;Tc(va,Jb,c[da>>2]|0,c[U>>2]|0,ra)}Uc(sa,ta,c[ea>>2]|0,c[fa>>2]|0,c[V>>2]|0,ua)}c[J>>2]=1;c[oa>>2]=((c[(c[C>>2]|0)+12>>2]|0)+-33|0)>>>0<1073741791|c[oa>>2];c[N>>2]=(c[N>>2]|0)+16;c[O>>2]=(c[O>>2]|0)+8;c[P>>2]=(c[P>>2]|0)+8;do if(c[M>>2]|0){qb=c[z>>2]|0;yb=a[qb>>0]|0;sb=yb&255;switch(yb<<24>>24){case 9:case 4:{Lb=0;break}default:Lb=(a[qb+9>>0]|0)!=0}yb=a[(d[e+9120+sb>>0]|0)+(e+8928+(d[qb+11>>0]<<4)+(d[qb+2>>0]<<2))>>0]|0;qb=yb&255;if((db|0)!=((c[y>>2]|0)+-1|0)){kb=(c[(c[Y>>2]|0)+(rb<<2)>>2]|0)+32+mb|0;sb=(c[da>>2]|0)+Ga|0;lb=kb+16|0;do{a[kb>>0]=a[sb>>0]|0;kb=kb+1|0;sb=sb+1|0}while((kb|0)<(lb|0));sb=nb<<3;pb=(c[ea>>2]|0)+Ha|0;zb=pb;xb=d[zb>>0]|d[zb+1>>0]<<8|d[zb+2>>0]<<16|d[zb+3>>0]<<24;zb=pb+4|0;pb=d[zb>>0]|d[zb+1>>0]<<8|d[zb+2>>0]<<16|d[zb+3>>0]<<24;zb=(c[(c[Z>>2]|0)+(rb<<2)>>2]|0)+16+sb|0;Ab=zb;a[Ab>>0]=xb;a[Ab+1>>0]=xb>>8;a[Ab+2>>0]=xb>>16;a[Ab+3>>0]=xb>>24;xb=zb+4|0;a[xb>>0]=pb;a[xb+1>>0]=pb>>8;a[xb+2>>0]=pb>>16;a[xb+3>>0]=pb>>24;pb=(c[fa>>2]|0)+Ha|0;xb=pb;zb=d[xb>>0]|d[xb+1>>0]<<8|d[xb+2>>0]<<16|d[xb+3>>0]<<24;xb=pb+4|0;pb=d[xb>>0]|d[xb+1>>0]<<8|d[xb+2>>0]<<16|d[xb+3>>0]<<24;xb=(c[(c[_>>2]|0)+(rb<<2)>>2]|0)+16+sb|0;sb=xb;a[sb>>0]=zb;a[sb+1>>0]=zb>>8;a[sb+2>>0]=zb>>16;a[sb+3>>0]=zb>>24;zb=xb+4|0;a[zb>>0]=pb;a[zb+1>>0]=pb>>8;a[zb+2>>0]=pb>>16;a[zb+3>>0]=pb>>24}if((nb|0)!=((c[o>>2]|0)+-1|0)?(a[(c[z>>2]|0)+78>>0]|0)==0:0){a[c[(c[$>>2]|0)+(db<<2)>>2]>>0]=a[(c[da>>2]|0)+15>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+1>>0]=a[(c[da>>2]|0)+Ja>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+2>>0]=a[(c[da>>2]|0)+Ka>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+3>>0]=a[(c[da>>2]|0)+La>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+4>>0]=a[(c[da>>2]|0)+Ma>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+5>>0]=a[(c[da>>2]|0)+Na>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+6>>0]=a[(c[da>>2]|0)+Oa>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+7>>0]=a[(c[da>>2]|0)+Pa>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+8>>0]=a[(c[da>>2]|0)+Qa>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+9>>0]=a[(c[da>>2]|0)+Ra>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+10>>0]=a[(c[da>>2]|0)+Sa>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+11>>0]=a[(c[da>>2]|0)+Ta>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+12>>0]=a[(c[da>>2]|0)+Ua>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+13>>0]=a[(c[da>>2]|0)+Va>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+14>>0]=a[(c[da>>2]|0)+Wa>>0]|0;a[(c[(c[$>>2]|0)+(db<<2)>>2]|0)+15>>0]=a[(c[da>>2]|0)+Xa>>0]|0;a[c[(c[ba>>2]|0)+(db<<2)>>2]>>0]=a[(c[ea>>2]|0)+7>>0]|0;a[c[(c[ca>>2]|0)+(db<<2)>>2]>>0]=a[(c[fa>>2]|0)+7>>0]|0;a[(c[(c[ba>>2]|0)+(db<<2)>>2]|0)+1>>0]=a[(c[ea>>2]|0)+Ya>>0]|0;a[(c[(c[ca>>2]|0)+(db<<2)>>2]|0)+1>>0]=a[(c[fa>>2]|0)+Ya>>0]|0;a[(c[(c[ba>>2]|0)+(db<<2)>>2]|0)+2>>0]=a[(c[ea>>2]|0)+Za>>0]|0;a[(c[(c[ca>>2]|0)+(db<<2)>>2]|0)+2>>0]=a[(c[fa>>2]|0)+Za>>0]|0;a[(c[(c[ba>>2]|0)+(db<<2)>>2]|0)+3>>0]=a[(c[ea>>2]|0)+_a>>0]|0;a[(c[(c[ca>>2]|0)+(db<<2)>>2]|0)+3>>0]=a[(c[fa>>2]|0)+_a>>0]|0;a[(c[(c[ba>>2]|0)+(db<<2)>>2]|0)+4>>0]=a[(c[ea>>2]|0)+$a>>0]|0;a[(c[(c[ca>>2]|0)+(db<<2)>>2]|0)+4>>0]=a[(c[fa>>2]|0)+$a>>0]|0;a[(c[(c[ba>>2]|0)+(db<<2)>>2]|0)+5>>0]=a[(c[ea>>2]|0)+ab>>0]|0;a[(c[(c[ca>>2]|0)+(db<<2)>>2]|0)+5>>0]=a[(c[fa>>2]|0)+ab>>0]|0;a[(c[(c[ba>>2]|0)+(db<<2)>>2]|0)+6>>0]=a[(c[ea>>2]|0)+bb>>0]|0;a[(c[(c[ca>>2]|0)+(db<<2)>>2]|0)+6>>0]=a[(c[fa>>2]|0)+bb>>0]|0;a[(c[(c[ba>>2]|0)+(db<<2)>>2]|0)+7>>0]=a[(c[ea>>2]|0)+cb>>0]|0;a[(c[(c[ca>>2]|0)+(db<<2)>>2]|0)+7>>0]=a[(c[fa>>2]|0)+cb>>0]|0}if(yb<<24>>24){if(c[Ba>>2]|0){if((nb|0)>0)jd(c[da>>2]|0,s,e+5792+(qb<<4)|0);if(!Lb)pd(c[da>>2]|0,s,e+6816+(qb<<4)|0);if(eb)id(c[da>>2]|0,s,e+5792+(qb<<4)|0);if(Lb)break;nd(c[da>>2]|0,s,e+6816+(qb<<4)|0);break}pb=d[e+8992+(c[Ca>>2]<<6)+qb>>0]|0;c[m>>2]=e+5792+(qb<<4);c[Da>>2]=e+6816+(qb<<4);c[Ea>>2]=e+7840+(qb<<4);c[Fa>>2]=e+8864+(pb<<4);if((nb|0)>0)ld(c[da>>2]|0,c[ea>>2]|0,c[fa>>2]|0,s,t,m);if(!Lb)od(c[da>>2]|0,c[ea>>2]|0,c[fa>>2]|0,s,t,m);if(eb)kd(c[da>>2]|0,c[ea>>2]|0,c[fa>>2]|0,s,t,m);if(!Lb)md(c[da>>2]|0,c[ea>>2]|0,c[fa>>2]|0,s,t,m)}}else{c[Q>>2]=(c[Q>>2]|0)+16;c[R>>2]=(c[R>>2]|0)+8;c[T>>2]=(c[T>>2]|0)+8}while(0);c[z>>2]=(c[z>>2]|0)+76;c[H>>2]=(c[H>>2]|0)+9;mb=nb+1|0;if((mb|0)<(c[o>>2]|0)){nb=mb;ob=ob+8|0;tb=tb+16|0}else{Mb=mb;break}}}else Mb=0;if(c[M>>2]|0){if((db|0)!=((c[y>>2]|0)+-1|0)){tb=c[r>>2]|0;ob=tb>>1;nb=ob+16|0;eb=db+1|0;rb=tb+31|0;kb=ob+15|0;lb=c[(c[Y>>2]|0)+(eb<<2)>>2]|0;a[lb+(tb+32)>>0]=a[lb+rb>>0]|0;lb=c[(c[Z>>2]|0)+(eb<<2)>>2]|0;a[lb+nb>>0]=a[lb+kb>>0]|0;lb=c[(c[_>>2]|0)+(eb<<2)>>2]|0;a[lb+nb>>0]=a[lb+kb>>0]|0;lb=c[(c[Y>>2]|0)+(eb<<2)>>2]|0;a[lb+(tb+33)>>0]=a[lb+rb>>0]|0;lb=c[(c[Z>>2]|0)+(eb<<2)>>2]|0;nb=ob+17|0;a[lb+nb>>0]=a[lb+kb>>0]|0;lb=c[(c[_>>2]|0)+(eb<<2)>>2]|0;a[lb+nb>>0]=a[lb+kb>>0]|0;lb=c[(c[Y>>2]|0)+(eb<<2)>>2]|0;a[lb+(tb+34)>>0]=a[lb+rb>>0]|0;lb=c[(c[Z>>2]|0)+(eb<<2)>>2]|0;nb=ob+18|0;a[lb+nb>>0]=a[lb+kb>>0]|0;lb=c[(c[_>>2]|0)+(eb<<2)>>2]|0;a[lb+nb>>0]=a[lb+kb>>0]|0;lb=c[(c[Y>>2]|0)+(eb<<2)>>2]|0;a[lb+(tb+35)>>0]=a[lb+rb>>0]|0;rb=c[(c[Z>>2]|0)+(eb<<2)>>2]|0;lb=ob+19|0;a[rb+lb>>0]=a[rb+kb>>0]|0;rb=c[(c[_>>2]|0)+(eb<<2)>>2]|0;a[rb+lb>>0]=a[rb+kb>>0]|0}}else Jc(q,(c[da>>2]|0)+16|0,(c[ea>>2]|0)+8|0,(c[fa>>2]|0)+8|0);kb=(c[ga>>2]|0)+(db*28|0)|0;rb=(c[ha>>2]|0)+(db*48|0)|0;fg(kb)|0;c[ib>>2]=Mb+n;if(rb|0)tg(rb)|0;cg(kb)|0;kb=(c[z>>2]|0)+76|0;c[x>>2]=1;rb=c[ia>>2]|0;c[z>>2]=kb+((S(rb,c[A>>2]|0)|0)*76|0);kb=db+1+rb|0;rb=c[y>>2]|0;if((kb|0)<(rb|0))db=kb;else{Nb=rb;Ob=db;break}}}else{Nb=B;Ob=g}if((Ob|0)!=(Nb+-1|0)){l=h;return}Bg(e+11932|0)|0;l=h;return}function re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+11856|0;e=c[d>>2]|0;if(e|0){if((b|0)>0){f=0;do f=f+1|0;while((f|0)!=(b|0));g=c[d>>2]|0}else g=e;Ub(g);c[d>>2]=0}d=a+11888|0;g=c[d>>2]|0;if(g|0){if((b|0)>0){e=g;f=0;while(1){rg(e+(f*48|0)|0)|0;f=f+1|0;h=c[d>>2]|0;if((f|0)==(b|0)){i=h;break}else e=h}}else i=g;Ub(i);c[d>>2]=0}d=a+11852|0;Ub(c[d>>2]|0);c[d>>2]=0;d=a+11892|0;i=c[d>>2]|0;if(i|0){if((b|0)>0){g=i;e=0;while(1){Ub(c[g+(e<<2)>>2]|0);c[(c[d>>2]|0)+(e<<2)>>2]=0;e=e+1|0;f=c[d>>2]|0;if((e|0)==(b|0)){j=f;break}else g=f}}else j=i;Ub(j);c[d>>2]=0}d=a+11896|0;j=c[d>>2]|0;if(j|0){if((b|0)>0){i=j;g=0;while(1){Ub(c[i+(g<<2)>>2]|0);c[(c[d>>2]|0)+(g<<2)>>2]=0;g=g+1|0;e=c[d>>2]|0;if((g|0)==(b|0)){k=e;break}else i=e}}else k=j;Ub(k);c[d>>2]=0}d=a+11900|0;k=c[d>>2]|0;if(k|0){if((b|0)>0){j=k;i=0;while(1){Ub(c[j+(i<<2)>>2]|0);c[(c[d>>2]|0)+(i<<2)>>2]=0;i=i+1|0;g=c[d>>2]|0;if((i|0)==(b|0)){l=g;break}else j=g}}else l=k;Ub(l);c[d>>2]=0}d=a+11904|0;l=c[d>>2]|0;if(l|0){if((b|0)>0){k=l;j=0;while(1){Ub(c[k+(j<<2)>>2]|0);c[(c[d>>2]|0)+(j<<2)>>2]=0;j=j+1|0;i=c[d>>2]|0;if((j|0)==(b|0)){m=i;break}else k=i}}else m=l;Ub(m);c[d>>2]=0}d=a+11908|0;m=c[d>>2]|0;if(m|0){if((b|0)>0){l=m;k=0;while(1){Ub(c[l+(k<<2)>>2]|0);c[(c[d>>2]|0)+(k<<2)>>2]=0;k=k+1|0;j=c[d>>2]|0;if((k|0)==(b|0)){n=j;break}else l=j}}else n=m;Ub(n);c[d>>2]=0}d=a+11912|0;a=c[d>>2]|0;if(!a)return;if((b|0)>0){n=a;m=0;while(1){Ub(c[n+(m<<2)>>2]|0);c[(c[d>>2]|0)+(m<<2)>>2]=0;m=m+1|0;l=c[d>>2]|0;if((m|0)==(b|0)){o=l;break}else n=l}}else o=a;Ub(o);c[d>>2]=0;return}function se(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;e=l;l=l+128|0;f=e+112|0;g=e+104|0;h=e+96|0;i=e+88|0;j=e+80|0;k=e+72|0;m=e+64|0;n=e+56|0;o=e+48|0;p=e+40|0;q=e+32|0;r=e+24|0;s=e+16|0;t=e+8|0;u=e;v=a+3248|0;w=a+11860|0;fg(w)|0;x=c[a+11812>>2]|0;cg(w)|0;if(!x){l=e;return}re(a,d);d=b&15;x=((d|0)==0?0:16-d|0)+b|0;do if((x|0)>=640)if((x|0)<1281){c[a+11848>>2]=8;break}else{c[a+11848>>2]=(x|0)<2561?16:32;break}else c[a+11848>>2]=1;while(0);b=x>>1;d=a+5716|0;w=Sb((c[d>>2]|0)*28|0)|0;y=a+11856|0;c[y>>2]=w;if(!w){Qb(v,2,5994,u);u=c[y>>2]|0;z=u;A=u}else{z=w;A=w}w=c[d>>2]|0;if((z|0)!=0&(w|0)>0){Jg(A,0)|0;A=c[d>>2]|0;if((A|0)>1){z=1;do{Jg((c[y>>2]|0)+(z*28|0)|0,0)|0;z=z+1|0;u=c[d>>2]|0}while((z|0)<(u|0));B=u}else B=A}else B=w;w=Sb(B*48|0)|0;B=a+11888|0;c[B>>2]=w;if(!w){Qb(v,2,6025,t);t=c[B>>2]|0;C=t;D=t}else{C=w;D=w}w=c[d>>2]|0;if((C|0)!=0&(w|0)>0){sg(D,0)|0;D=c[d>>2]|0;if((D|0)>1){C=1;do{sg((c[B>>2]|0)+(C*48|0)|0,0)|0;C=C+1|0;t=c[d>>2]|0}while((C|0)<(t|0));E=t}else E=D}else E=w;w=Tb(4,E)|0;c[a+11852>>2]=w;if(!w)Qb(v,2,6055,s);s=Tb(4,c[d>>2]|0)|0;w=a+11892|0;c[w>>2]=s;if(!s)Qb(v,2,6099,r);r=c[d>>2]|0;if((r|0)>0){s=x+64|0;x=0;do{E=Rb(16,s)|0;c[(c[w>>2]|0)+(x<<2)>>2]=E;if(!(c[(c[w>>2]|0)+(x<<2)>>2]|0))Qb(v,2,6139,q);x=x+1|0;E=c[d>>2]|0}while((x|0)<(E|0));F=E}else F=r;r=Tb(4,F)|0;F=a+11896|0;c[F>>2]=r;if(!r)Qb(v,2,6180,p);p=c[d>>2]|0;if((p|0)>0){r=b+32|0;x=0;do{q=Rb(16,r)|0;c[(c[F>>2]|0)+(x<<2)>>2]=q;if(!(c[(c[F>>2]|0)+(x<<2)>>2]|0))Qb(v,2,6220,o);x=x+1|0;q=c[d>>2]|0}while((x|0)<(q|0));G=q}else G=p;p=Tb(4,G)|0;G=a+11900|0;c[G>>2]=p;if(!p)Qb(v,2,6261,n);n=c[d>>2]|0;if((n|0)>0){p=b+32|0;b=0;do{x=Rb(16,p)|0;c[(c[G>>2]|0)+(b<<2)>>2]=x;if(!(c[(c[G>>2]|0)+(b<<2)>>2]|0))Qb(v,2,6301,m);b=b+1|0;x=c[d>>2]|0}while((b|0)<(x|0));H=x}else H=n;n=Tb(4,H)|0;H=a+11904|0;c[H>>2]=n;if(!n)Qb(v,2,6342,k);k=c[d>>2]|0;if((k|0)>0){n=0;do{b=Tb(16,1)|0;c[(c[H>>2]|0)+(n<<2)>>2]=b;if(!(c[(c[H>>2]|0)+(n<<2)>>2]|0))Qb(v,2,6381,j);n=n+1|0;b=c[d>>2]|0}while((n|0)<(b|0));I=b}else I=k;k=Tb(4,I)|0;I=a+11908|0;c[I>>2]=k;if(!k)Qb(v,2,6421,i);i=c[d>>2]|0;if((i|0)>0){k=0;do{n=Tb(8,1)|0;c[(c[I>>2]|0)+(k<<2)>>2]=n;if(!(c[(c[I>>2]|0)+(k<<2)>>2]|0))Qb(v,2,6460,h);k=k+1|0;n=c[d>>2]|0}while((k|0)<(n|0));J=n}else J=i;i=Tb(4,J)|0;J=a+11912|0;c[J>>2]=i;if(!i)Qb(v,2,6500,g);if((c[d>>2]|0)<=0){l=e;return}g=0;do{i=Tb(8,1)|0;c[(c[J>>2]|0)+(g<<2)>>2]=i;if(!(c[(c[J>>2]|0)+(g<<2)>>2]|0))Qb(v,2,6539,f);g=g+1|0}while((g|0)<(c[d>>2]|0));l=e;return}function te(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a+11860|0;d=a+11812|0;fg(b)|0;e=c[d>>2]|0;cg(b)|0;if(!e)return;fg(b)|0;c[d>>2]=0;cg(b)|0;b=a+11828|0;d=c[b>>2]|0;if((d|0)>0){e=a+11928|0;f=a+11924|0;g=0;do{Bg((c[e>>2]|0)+(g<<4)|0)|0;Qa(c[(c[f>>2]|0)+(g<<2)>>2]|0,0)|0;g=g+1|0;h=c[b>>2]|0}while((g|0)<(h|0));if((h|0)>0){g=0;do{g=g+1|0;f=c[b>>2]|0}while((g|0)<(f|0));i=f}else i=h}else i=d;d=a+11924|0;Ub(c[d>>2]|0);c[d>>2]=0;d=a+11928|0;Ub(c[d>>2]|0);c[d>>2]=0;d=a+11916|0;Ub(c[d>>2]|0);c[d>>2]=0;d=a+11920|0;Ub(c[d>>2]|0);c[d>>2]=0;re(a,c[a+5716>>2]|0);return}function ue(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;f=b+3248|0;g=c[b+9136>>2]|0;h=c[b+3232>>2]|0;if(!g)Hd(h);else{i=b+11892|0;Sg((c[c[i>>2]>>2]|0)+31|0,127,(c[h>>2]|0)+5|0)|0;j=b+11896|0;Sg((c[c[j>>2]>>2]|0)+15|0,127,(c[h>>2]>>1)+5|0)|0;k=b+11900|0;Sg((c[c[k>>2]>>2]|0)+15|0,127,(c[h>>2]>>1)+5|0)|0;h=b+5716|0;l=c[h>>2]|0;if((l|0)>1){m=1;do{a[(c[(c[i>>2]|0)+(m<<2)>>2]|0)+31>>0]=-127;a[(c[(c[j>>2]|0)+(m<<2)>>2]|0)+15>>0]=-127;a[(c[(c[k>>2]|0)+(m<<2)>>2]|0)+15>>0]=-127;m=m+1|0;n=c[h>>2]|0}while((m|0)<(n|0));o=n}else o=l;if((o|0)>0){o=b+11904|0;l=b+11908|0;m=b+11912|0;k=0;do{p=c[(c[o>>2]|0)+(k<<2)>>2]|0;q=p+16|0;do{a[p>>0]=129;p=p+1|0}while((p|0)<(q|0));j=c[(c[l>>2]|0)+(k<<2)>>2]|0;i=j;a[i>>0]=-2122219135;a[i+1>>0]=-2122219135>>8;a[i+2>>0]=-2122219135>>16;a[i+3>>0]=-2122219135>>24;i=j+4|0;a[i>>0]=-2122219135;a[i+1>>0]=-2122219135>>8;a[i+2>>0]=-2122219135>>16;a[i+3>>0]=-2122219135>>24;i=c[(c[m>>2]|0)+(k<<2)>>2]|0;j=i;a[j>>0]=-2122219135;a[j+1>>0]=-2122219135>>8;a[j+2>>0]=-2122219135>>16;a[j+3>>0]=-2122219135>>24;j=i+4|0;a[j>>0]=-2122219135;a[j+1>>0]=-2122219135>>8;a[j+2>>0]=-2122219135>>16;a[j+3>>0]=-2122219135>>24;k=k+1|0}while((k|0)<(c[h>>2]|0))}ad(f,b,g)}g=c[b+11916>>2]|0;f=b+11824|0;h=c[f>>2]|0;if((h|0)>0){k=e+3200|0;m=e+3204|0;l=e+3208|0;o=e+3212|0;j=b+5700|0;i=e+2848|0;n=e+2968|0;r=e+3148|0;s=e+3151|0;t=e+3155|0;u=e+3169|0;v=e+3177|0;w=e+3163|0;x=e+3164|0;y=b+11456|0;z=e+2048|0;A=e+2016|0;B=e+2080|0;C=e+2112|0;D=b+5740|0;E=0;do{c[g+(E*3232|0)+3200>>2]=c[k>>2];c[g+(E*3232|0)+3204>>2]=c[m>>2];c[g+(E*3232|0)+3208>>2]=c[l>>2];c[g+(E*3232|0)+3212>>2]=c[o>>2];c[g+(E*3232|0)+3096>>2]=c[j>>2];p=g+(E*3232|0)+2848|0;F=i;q=p+120|0;do{c[p>>2]=c[F>>2];p=p+4|0;F=F+4|0}while((p|0)<(q|0));p=g+(E*3232|0)+2968|0;F=n;q=p+120|0;do{c[p>>2]=c[F>>2];p=p+4|0;F=F+4|0}while((p|0)<(q|0));a[g+(E*3232|0)+3148>>0]=a[r>>0]|0;a[g+(E*3232|0)+3151>>0]=a[s>>0]|0;F=t;G=F;H=d[G>>0]|d[G+1>>0]<<8|d[G+2>>0]<<16|d[G+3>>0]<<24;G=F+4|0;F=d[G>>0]|d[G+1>>0]<<8|d[G+2>>0]<<16|d[G+3>>0]<<24;G=g+(E*3232|0)+3155|0;I=G;a[I>>0]=H;a[I+1>>0]=H>>8;a[I+2>>0]=H>>16;a[I+3>>0]=H>>24;H=G+4|0;a[H>>0]=F;a[H+1>>0]=F>>8;a[H+2>>0]=F>>16;a[H+3>>0]=F>>24;F=g+(E*3232|0)+3169|0;H=d[u>>0]|d[u+1>>0]<<8|d[u+2>>0]<<16|d[u+3>>0]<<24;a[F>>0]=H;a[F+1>>0]=H>>8;a[F+2>>0]=H>>16;a[F+3>>0]=H>>24;H=g+(E*3232|0)+3177|0;F=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;a[H>>0]=F;a[H+1>>0]=F>>8;a[H+2>>0]=F>>16;a[H+3>>0]=F>>24;a[g+(E*3232|0)+3163>>0]=a[w>>0]|0;a[g+(E*3232|0)+3164>>0]=a[x>>0]|0;c[g+(E*3232|0)+3216>>2]=y;F=g+(E*3232|0)+2048|0;c[F>>2]=c[z>>2];c[F+4>>2]=c[z+4>>2];c[F+8>>2]=c[z+8>>2];c[F+12>>2]=c[z+12>>2];c[F+16>>2]=c[z+16>>2];c[F+20>>2]=c[z+20>>2];c[F+24>>2]=c[z+24>>2];c[F+28>>2]=c[z+28>>2];F=g+(E*3232|0)+2016|0;c[F>>2]=c[A>>2];c[F+4>>2]=c[A+4>>2];c[F+8>>2]=c[A+8>>2];c[F+12>>2]=c[A+12>>2];c[F+16>>2]=c[A+16>>2];c[F+20>>2]=c[A+20>>2];c[F+24>>2]=c[A+24>>2];c[F+28>>2]=c[A+28>>2];F=g+(E*3232|0)+2080|0;c[F>>2]=c[B>>2];c[F+4>>2]=c[B+4>>2];c[F+8>>2]=c[B+8>>2];c[F+12>>2]=c[B+12>>2];c[F+16>>2]=c[B+16>>2];c[F+20>>2]=c[B+20>>2];c[F+24>>2]=c[B+24>>2];c[F+28>>2]=c[B+28>>2];F=g+(E*3232|0)+2112|0;c[F>>2]=c[C>>2];c[F+4>>2]=c[C+4>>2];c[F+8>>2]=c[C+8>>2];c[F+12>>2]=c[C+12>>2];c[F+16>>2]=c[C+16>>2];c[F+20>>2]=c[C+20>>2];c[F+24>>2]=c[C+24>>2];c[F+28>>2]=c[C+28>>2];F=g+(E*3232|0)+2844|0;c[F>>2]=-1;c[F>>2]=(c[D>>2]|0)==0?-1:-8;E=E+1|0}while((E|0)!=(h|0))}h=b+5716|0;if((c[h>>2]|0)>0){E=c[b+11852>>2]|0;D=0;do{c[E+(D<<2)>>2]=-1;D=D+1|0}while((D|0)<(c[h>>2]|0))}if(!(c[f>>2]|0)){qe(b,e,0);J=b+11932|0;Hg(J)|0;return}h=b+11928|0;D=0;do{Bg((c[h>>2]|0)+(D<<4)|0)|0;D=D+1|0}while(D>>>0<(c[f>>2]|0)>>>0);qe(b,e,0);J=b+11932|0;Hg(J)|0;return}function ve(){var a=0,b=0,d=0;a=l;l=l+16|0;b=a;d=Va(9768,0,5,0)|0;if(d|0){c[b>>2]=d;uf(6579,b)|0}Jg(9772,0)|0;sg(9800,0)|0;l=a;return}function we(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0.0,j=0.0;a=l;l=l+32|0;b=a+8|0;d=a;e=a+12|0;c[2462]=Vd()|0;a=Ua()|0;f=(a|0)<4?a:4;c[d>>2]=f;uf(6614,d)|0;c[e>>2]=f;c[e+4>>2]=0;c[e+8>>2]=0;Mb(9852,c[2462]|0,e,0,10)|0;while(1){fg(9772)|0;while(1){if((c[2470]|0)==0?(g=c[2472]|0,(c[2471]|0)!=(g|0)):0)break;zg(9800,9772)|0}c[2470]=1;e=c[9892+(g<<3)>>2]|0;f=c[9892+(g<<3)+4>>2]|0;c[2472]=(g+1|0)%16|0;cg(9772)|0;i=+Xa();Nb(9852,e,f,0,1)|0;Nb(9852,0,0,0,1)|0;j=+Xa()-i;fg(9772)|0;h[1204]=j+ +h[1204];cg(9772)|0;og(1024,6,b)}return 0}function xe(){var a=0,b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;a=l;l=l+16|0;b=a;d=a+4|0;c[d>>2]=0;e=Ob(9852,d)|0;a:do if(e){f=e;g=0;b:while(1){if(g|0){i=3;break}j=c[f>>2]|0;switch(j|0){case 258:{k=c[f+12>>2]|0;m=c[f+16>>2]|0;n=k;o=m;p=m>>>1;q=k>>>1;break}case 261:{k=c[f+12>>2]|0;m=c[f+16>>2]|0;n=k;o=m;p=m;q=k>>>1;break}case 262:{k=c[f+12>>2]|0;m=c[f+16>>2]|0;n=k;o=m;p=m;q=k;break}default:{i=8;break b}}Ma(c[f+48>>2]|0,c[f+64>>2]|0,c[f+52>>2]|0,c[f+68>>2]|0,c[f+56>>2]|0,c[f+72>>2]|0,n|0,o|0,q|0,p|0);f=Ob(9852,d)|0;if(!f){r=1;break a}else g=1}if((i|0)==3)while(1){i=0;vf(6646)|0;if(!(Ob(9852,d)|0)){r=g;break}else i=3}else if((i|0)==8){c[b>>2]=j;uf(6696,b)|0;r=0;break}}else r=0;while(0);fg(9772)|0;s=+h[1204];h[1204]=0.0;c[2470]=0;tg(9800)|0;cg(9772)|0;Aa(r|0,+s);l=a;return}function ye(){return 1}function ze(){Sa(0)}function Ae(a,b){a=a|0;b=b|0;vf(6741)|0;return 0}function Be(a,b){a=a|0;b=b|0;var d=0;fg(9772)|0;d=c[2471]|0;c[9892+(d<<3)>>2]=a;c[9892+(d<<3)+4>>2]=b;c[2471]=(d+1|0)%16|0;tg(9800)|0;cg(9772)|0;return 1}function Ce(){return 10020}function De(){c[(Pa()|0)+188>>2]=10060;return}function Ee(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Ke(c[a+60>>2]|0)|0;a=He(Ka(6,d|0)|0)|0;l=b;return a|0}function Fe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=l;l=l+48|0;f=e+16|0;g=e;h=e+32|0;i=a+28|0;j=c[i>>2]|0;c[h>>2]=j;k=a+20|0;m=(c[k>>2]|0)-j|0;c[h+4>>2]=m;c[h+8>>2]=b;c[h+12>>2]=d;b=m+d|0;m=a+60|0;c[g>>2]=c[m>>2];c[g+4>>2]=h;c[g+8>>2]=2;j=He(ib(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=j;n=h;o=2;p=b;while(1){if((g|0)<0)break;p=p-g|0;q=c[n+4>>2]|0;r=g>>>0>q>>>0;s=r?n+8|0:n;t=(r<<31>>31)+o|0;u=g-(r?q:0)|0;c[s>>2]=(c[s>>2]|0)+u;q=s+4|0;c[q>>2]=(c[q>>2]|0)-u;c[f>>2]=c[m>>2];c[f+4>>2]=s;c[f+8>>2]=t;g=He(ib(146,f|0)|0)|0;if((p|0)==(g|0)){v=3;break a}else{n=s;o=t}}c[a+16>>2]=0;c[i>>2]=0;c[k>>2]=0;c[a>>2]=c[a>>2]|32;if((o|0)==2)w=0;else w=d-(c[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=c[a+44>>2]|0;c[a+16>>2]=v+(c[a+48>>2]|0);c[i>>2]=v;c[k>>2]=v;w=d}l=e;return w|0}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+32|0;f=e;g=e+20|0;c[f>>2]=c[a+60>>2];c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=g;c[f+16>>2]=d;if((He(fb(140,f|0)|0)|0)<0){c[g>>2]=-1;h=-1}else h=c[g>>2]|0;l=e;return h|0}function He(a){a=a|0;var b=0;if(a>>>0>4294963200){c[(Ie()|0)>>2]=0-a;b=-1}else b=a;return b|0}function Ie(){return (Je()|0)+64|0}function Je(){return Pa()|0}function Ke(a){a=a|0;return a|0}function Le(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[b+36>>2]=6;if((c[b>>2]&64|0)==0?(c[g>>2]=c[b+60>>2],c[g+4>>2]=21523,c[g+8>>2]=f+16,Ta(54,g|0)|0):0)a[b+75>>0]=-1;g=Fe(b,d,e)|0;l=f;return g|0}function Me(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=b;b=c;do{d=d+1|0;b=b+1|0;c=a[d>>0]|0;e=a[b>>0]|0}while(!(c<<24>>24==0?1:c<<24>>24!=e<<24>>24));f=e;g=c}return (g&255)-(f&255)|0}function Ne(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+128|0;h=g+124|0;i=g;j=i;k=1812;m=j+124|0;do{c[j>>2]=c[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(m|0));if((d+-1|0)>>>0>2147483646)if(!d){n=1;o=h;p=4}else{c[(Ie()|0)>>2]=75;q=-1}else{n=d;o=b;p=4}if((p|0)==4){p=-2-o|0;b=n>>>0>p>>>0?p:n;c[i+48>>2]=b;n=i+20|0;c[n>>2]=o;c[i+44>>2]=o;p=o+b|0;o=i+16|0;c[o>>2]=p;c[i+28>>2]=p;p=Oe(i,e,f)|0;if(!b)q=p;else{b=c[n>>2]|0;a[b+(((b|0)==(c[o>>2]|0))<<31>>31)>>0]=0;q=p}}l=g;return q|0}function Oe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+224|0;g=f+120|0;h=f+80|0;i=f;j=f+136|0;k=h;m=k+40|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[g>>2]=c[e>>2];if((Pe(0,d,g,i,h)|0)<0)n=-1;else{if((kb(c,b+76>>2)|0)>-1)o=Qe(b)|0;else o=0;e=c[b>>2]|0;k=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){m=b+44|0;p=c[m>>2]|0;c[m>>2]=j;q=b+28|0;c[q>>2]=j;r=b+20|0;c[r>>2]=j;c[e>>2]=80;s=b+16|0;c[s>>2]=j+80;j=Pe(b,d,g,i,h)|0;if(!p)t=j;else{ub[c[b+36>>2]&7](b,0,0)|0;u=(c[r>>2]|0)==0?-1:j;c[m>>2]=p;c[e>>2]=0;c[s>>2]=0;c[q>>2]=0;c[r>>2]=0;t=u}}else t=Pe(b,d,g,i,h)|0;h=c[b>>2]|0;c[b>>2]=h|k;if(o|0)Re(b);n=(h&32|0)==0?t:-1}l=f;return n|0}function Pe(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;j=l;l=l+64|0;k=j+16|0;m=j;n=j+24|0;o=j+8|0;p=j+20|0;c[k>>2]=e;q=(d|0)!=0;r=n+40|0;s=r;t=n+39|0;n=o+4|0;u=e;e=0;v=0;w=0;a:while(1){do if((e|0)>-1)if((v|0)>(2147483647-e|0)){c[(Ie()|0)>>2]=75;x=-1;break}else{x=v+e|0;break}else x=e;while(0);y=a[u>>0]|0;if(!(y<<24>>24)){z=87;break}else{A=y;B=u}b:while(1){switch(A<<24>>24){case 37:{C=B;E=B;z=9;break b;break}case 0:{F=B;G=B;break b;break}default:{}}y=B+1|0;c[k>>2]=y;A=a[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((a[C+1>>0]|0)!=37){F=C;G=E;break c}y=E+1|0;H=C+2|0;c[k>>2]=H;if((a[H>>0]|0)==37){C=H;E=y;z=9}else{F=H;G=y;break}}while(0);y=G-u|0;if(q)Se(d,u,y);if(y|0){u=F;e=x;v=y;continue}y=F+1|0;H=(a[y>>0]|0)+-48|0;if(H>>>0<10){I=(a[F+2>>0]|0)==36;J=I?H:-1;K=I?1:w;L=I?F+3|0:y}else{J=-1;K=w;L=y}c[k>>2]=L;y=a[L>>0]|0;I=(y<<24>>24)+-32|0;d:do if(I>>>0<32){H=y;M=0;N=L;O=I;while(1){P=1<<O;if(!(P&75913)){Q=H;R=N;S=M;break d}T=P|M;P=N+1|0;c[k>>2]=P;U=a[P>>0]|0;O=(U<<24>>24)+-32|0;if(O>>>0>=32){Q=U;R=P;S=T;break}else{H=U;M=T;N=P}}}else{Q=y;R=L;S=0}while(0);if(Q<<24>>24==42){y=R+1|0;I=(a[y>>0]|0)+-48|0;if(I>>>0<10?(a[R+2>>0]|0)==36:0){c[i+(I<<2)>>2]=10;V=1;W=R+3|0;X=c[g+((a[y>>0]|0)+-48<<3)>>2]|0}else{if(K|0){Y=-1;break}if(q){I=(c[f>>2]|0)+(4-1)&~(4-1);N=c[I>>2]|0;c[f>>2]=I+4;V=0;W=y;X=N}else{V=0;W=y;X=0}}c[k>>2]=W;y=(X|0)<0;Z=W;_=y?S|8192:S;$=V;aa=y?0-X|0:X}else{y=Te(k)|0;if((y|0)<0){Y=-1;break}Z=c[k>>2]|0;_=S;$=K;aa=y}do if((a[Z>>0]|0)==46){if((a[Z+1>>0]|0)!=42){c[k>>2]=Z+1;y=Te(k)|0;ba=c[k>>2]|0;ca=y;break}y=Z+2|0;N=(a[y>>0]|0)+-48|0;if(N>>>0<10?(a[Z+3>>0]|0)==36:0){c[i+(N<<2)>>2]=10;N=c[g+((a[y>>0]|0)+-48<<3)>>2]|0;I=Z+4|0;c[k>>2]=I;ba=I;ca=N;break}if($|0){Y=-1;break a}if(q){N=(c[f>>2]|0)+(4-1)&~(4-1);I=c[N>>2]|0;c[f>>2]=N+4;da=I}else da=0;c[k>>2]=y;ba=y;ca=da}else{ba=Z;ca=-1}while(0);y=ba;I=0;while(1){if(((a[y>>0]|0)+-65|0)>>>0>57){Y=-1;break a}ea=y+1|0;c[k>>2]=ea;fa=a[(a[y>>0]|0)+-65+(6779+(I*58|0))>>0]|0;ga=fa&255;if((ga+-1|0)>>>0<8){y=ea;I=ga}else break}if(!(fa<<24>>24)){Y=-1;break}N=(J|0)>-1;do if(fa<<24>>24==19)if(N){Y=-1;break a}else z=49;else{if(N){c[i+(J<<2)>>2]=ga;M=g+(J<<3)|0;H=c[M+4>>2]|0;O=m;c[O>>2]=c[M>>2];c[O+4>>2]=H;z=49;break}if(!q){Y=0;break a}Ue(m,ga,f)}while(0);if((z|0)==49?(z=0,!q):0){u=ea;e=x;v=0;w=$;continue}N=a[y>>0]|0;H=(I|0)!=0&(N&15|0)==3?N&-33:N;N=_&-65537;O=(_&8192|0)==0?_:N;e:do switch(H|0){case 110:{switch((I&255)<<24>>24){case 0:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 1:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 2:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}case 3:{b[c[m>>2]>>1]=x;u=ea;e=x;v=0;w=$;continue a;break}case 4:{a[c[m>>2]>>0]=x;u=ea;e=x;v=0;w=$;continue a;break}case 6:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 7:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}default:{u=ea;e=x;v=0;w=$;continue a}}break}case 112:{ha=O|8;ia=ca>>>0>8?ca:8;ja=120;z=61;break}case 88:case 120:{ha=O;ia=ca;ja=H;z=61;break}case 111:{M=m;P=c[M>>2]|0;T=c[M+4>>2]|0;M=We(P,T,r)|0;U=s-M|0;ka=P;la=T;ma=M;na=O;oa=(O&8|0)==0|(ca|0)>(U|0)?ca:U+1|0;pa=0;qa=7243;z=67;break}case 105:case 100:{U=m;M=c[U>>2]|0;T=c[U+4>>2]|0;if((T|0)<0){U=Rg(0,0,M|0,T|0)|0;P=D;ra=m;c[ra>>2]=U;c[ra+4>>2]=P;sa=U;ta=P;ua=1;va=7243;z=66;break e}else{sa=M;ta=T;ua=(O&2049|0)!=0&1;va=(O&2048|0)==0?((O&1|0)==0?7243:7245):7244;z=66;break e}break}case 117:{T=m;sa=c[T>>2]|0;ta=c[T+4>>2]|0;ua=0;va=7243;z=66;break}case 99:{a[t>>0]=c[m>>2];wa=t;xa=N;ya=1;za=0;Aa=7243;Ba=r;break}case 109:{Ca=Ye(c[(Ie()|0)>>2]|0)|0;z=71;break}case 115:{T=c[m>>2]|0;Ca=T|0?T:7253;z=71;break}case 67:{c[o>>2]=c[m>>2];c[n>>2]=0;c[m>>2]=o;Da=o;Ea=-1;z=75;break}case 83:{T=c[m>>2]|0;if(!ca){_e(d,32,aa,0,O);Fa=0;z=84}else{Da=T;Ea=ca;z=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{u=ea;e=x;v=af(d,+h[m>>3],aa,ca,O,H)|0;w=$;continue a;break}default:{wa=u;xa=O;ya=ca;za=0;Aa=7243;Ba=r}}while(0);f:do if((z|0)==61){z=0;H=m;I=c[H>>2]|0;y=c[H+4>>2]|0;H=Ve(I,y,r,ja&32)|0;T=(ha&8|0)==0|(I|0)==0&(y|0)==0;ka=I;la=y;ma=H;na=ha;oa=ia;pa=T?0:2;qa=T?7243:7243+(ja>>4)|0;z=67}else if((z|0)==66){z=0;ka=sa;la=ta;ma=Xe(sa,ta,r)|0;na=O;oa=ca;pa=ua;qa=va;z=67}else if((z|0)==71){z=0;T=Ze(Ca,0,ca)|0;H=(T|0)==0;wa=Ca;xa=N;ya=H?ca:T-Ca|0;za=0;Aa=7243;Ba=H?Ca+ca|0:T}else if((z|0)==75){z=0;T=0;H=0;y=Da;while(1){I=c[y>>2]|0;if(!I){Ga=T;Ha=H;break}M=$e(p,I)|0;if((M|0)<0|M>>>0>(Ea-T|0)>>>0){Ga=T;Ha=M;break}I=M+T|0;if(Ea>>>0>I>>>0){T=I;H=M;y=y+4|0}else{Ga=I;Ha=M;break}}if((Ha|0)<0){Y=-1;break a}_e(d,32,aa,Ga,O);if(!Ga){Fa=0;z=84}else{y=0;H=Da;while(1){T=c[H>>2]|0;if(!T){Fa=Ga;z=84;break f}M=$e(p,T)|0;y=M+y|0;if((y|0)>(Ga|0)){Fa=Ga;z=84;break f}Se(d,p,M);if(y>>>0>=Ga>>>0){Fa=Ga;z=84;break}else H=H+4|0}}}while(0);if((z|0)==67){z=0;N=(ka|0)!=0|(la|0)!=0;H=(oa|0)!=0|N;y=((N^1)&1)+(s-ma)|0;wa=H?ma:r;xa=(oa|0)>-1?na&-65537:na;ya=H?((oa|0)>(y|0)?oa:y):oa;za=pa;Aa=qa;Ba=r}else if((z|0)==84){z=0;_e(d,32,aa,Fa,O^8192);u=ea;e=x;v=(aa|0)>(Fa|0)?aa:Fa;w=$;continue}y=Ba-wa|0;H=(ya|0)<(y|0)?y:ya;N=H+za|0;M=(aa|0)<(N|0)?N:aa;_e(d,32,M,N,xa);Se(d,Aa,za);_e(d,48,M,N,xa^65536);_e(d,48,H,y,0);Se(d,wa,y);_e(d,32,M,N,xa^8192);u=ea;e=x;v=M;w=$}g:do if((z|0)==87)if(!d)if(!w)Y=0;else{$=1;while(1){v=c[i+($<<2)>>2]|0;if(!v){Ia=$;break}Ue(g+($<<3)|0,v,f);$=$+1|0;if(($|0)>=10){Y=1;break g}}while(1){if(c[i+(Ia<<2)>>2]|0){Y=-1;break g}Ia=Ia+1|0;if((Ia|0)>=10){Y=1;break}}}else Y=x;while(0);l=j;return Y|0}function Qe(a){a=a|0;return 0}function Re(a){a=a|0;return}function Se(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))nf(b,d,a)|0;return}function Te(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;e=(a[d>>0]|0)+-48|0;if(e>>>0<10){f=d;d=0;g=e;while(1){e=g+(d*10|0)|0;f=f+1|0;c[b>>2]=f;g=(a[f>>0]|0)+-48|0;if(g>>>0>=10){h=e;break}else d=e}}else h=0;return h|0}function Ue(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f;break a;break}case 10:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a;break}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=f;c[e+4>>2]=0;break a;break}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);f=e;g=c[f>>2]|0;i=c[f+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=g;c[e+4>>2]=i;break a;break}case 13:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&65535)<<16>>16;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 14:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&65535;c[i+4>>2]=0;break a;break}case 15:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&255)<<24>>24;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 16:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&255;c[i+4>>2]=0;break a;break}case 17:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}case 18:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}default:break a}while(0);while(0);return}function Ve(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==0&(c|0)==0)g=e;else{h=b;b=c;c=e;while(1){e=c+-1|0;a[e>>0]=d[7295+(h&15)>>0]|0|f;h=Vg(h|0,b|0,4)|0;b=D;if((h|0)==0&(b|0)==0){g=e;break}else c=e}}return g|0}function We(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((b|0)==0&(c|0)==0)e=d;else{f=b;b=c;c=d;while(1){d=c+-1|0;a[d>>0]=f&7|48;f=Vg(f|0,b|0,3)|0;b=D;if((f|0)==0&(b|0)==0){e=d;break}else c=d}}return e|0}function Xe(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){e=b;f=c;c=d;while(1){g=bh(e|0,f|0,10,0)|0;c=c+-1|0;a[c>>0]=g&255|48;g=e;e=$g(e|0,f|0,10,0)|0;if(!(f>>>0>9|(f|0)==9&g>>>0>4294967295))break;else f=D}h=c;i=e}else{h=d;i=b}if(!i)j=h;else{b=h;h=i;while(1){i=b+-1|0;a[i>>0]=(h>>>0)%10|0|48;if(h>>>0<10){j=i;break}else{b=i;h=(h>>>0)/10|0}}}return j|0}function Ye(a){a=a|0;return hf(a,c[(gf()|0)+188>>2]|0)|0}function Ze(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=d&255;g=(e|0)!=0;a:do if(g&(b&3|0)!=0){h=d&255;i=e;j=b;while(1){if((a[j>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=j+1|0;o=i+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=o;j=n}else{q=o;r=n;s=p;m=5;break}}}else{q=e;r=b;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=0;u=r}b:do if((m|0)==6){r=d&255;if((a[l>>0]|0)==r<<24>>24){t=k;u=l}else{q=S(f,16843009)|0;c:do if(k>>>0>3){s=k;g=l;while(1){b=c[g>>2]^q;if((b&-2139062144^-2139062144)&b+-16843009|0)break;b=g+4|0;e=s+-4|0;if(e>>>0>3){s=e;g=b}else{v=e;w=b;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!v){t=0;u=w;break}else{x=v;y=w}while(1){if((a[y>>0]|0)==r<<24>>24){t=x;u=y;break b}q=y+1|0;x=x+-1|0;if(!x){t=0;u=q;break}else y=q}}}while(0);return (t|0?u:0)|0}function _e(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Sg(g|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{Se(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;Se(a,g,h)}l=f;return}function $e(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=ef(a,b,0)|0;return c|0}function af(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;j=l;l=l+560|0;k=j+8|0;m=j;n=j+524|0;o=n;p=j+512|0;c[m>>2]=0;q=p+12|0;bf(e)|0;if((D|0)<0){r=1;s=7260;t=-e}else{r=(h&2049|0)!=0&1;s=(h&2048|0)==0?((h&1|0)==0?7261:7266):7263;t=e}bf(t)|0;u=D&2146435072;do if(u>>>0<2146435072|(u|0)==2146435072&0<0){e=+cf(t,m)*2.0;v=e!=0.0;if(v)c[m>>2]=(c[m>>2]|0)+-1;w=i|32;if((w|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-g|0;do if(!(g>>>0>11|(A|0)==0)){B=A;C=8.0;do{B=B+-1|0;C=C*16.0}while((B|0)!=0);if((a[y>>0]|0)==45){E=-(C+(-e-C));break}else{E=e+C-C;break}}else E=e;while(0);A=c[m>>2]|0;B=(A|0)<0?0-A|0:A;F=Xe(B,((B|0)<0)<<31>>31,q)|0;if((F|0)==(q|0)){B=p+11|0;a[B>>0]=48;G=B}else G=F;a[G+-1>>0]=(A>>31&2)+43;A=G+-2|0;a[A>>0]=i+15;F=(g|0)<1;B=(h&8|0)==0;H=n;I=E;while(1){J=~~I;K=H+1|0;a[H>>0]=d[7295+J>>0]|x;I=(I-+(J|0))*16.0;if((K-o|0)==1?!(B&(F&I==0.0)):0){a[K>>0]=46;L=H+2|0}else L=K;if(!(I!=0.0))break;else H=L}H=L-o|0;F=q-A|0;B=(g|0)!=0&(H+-2|0)<(g|0)?g+2|0:H;x=F+z+B|0;_e(b,32,f,x,h);Se(b,y,z);_e(b,48,f,x,h^65536);Se(b,n,H);_e(b,48,B-H|0,0,0);Se(b,A,F);_e(b,32,f,x,h^8192);M=x;break}x=(g|0)<0?6:g;if(v){F=(c[m>>2]|0)+-28|0;c[m>>2]=F;N=F;O=e*268435456.0}else{N=c[m>>2]|0;O=e}F=(N|0)<0?k:k+288|0;I=O;H=F;do{B=~~I>>>0;c[H>>2]=B;H=H+4|0;I=(I-+(B>>>0))*1.0e9}while(I!=0.0);if((N|0)>0){v=N;A=F;z=H;while(1){y=(v|0)<29?v:29;B=z+-4|0;if(B>>>0>=A>>>0){K=0;J=B;do{B=ah(c[J>>2]|0,0,y|0)|0;P=Tg(B|0,D|0,K|0,0)|0;B=D;Q=bh(P|0,B|0,1e9,0)|0;c[J>>2]=Q;K=$g(P|0,B|0,1e9,0)|0;J=J+-4|0}while(J>>>0>=A>>>0);if(K){J=A+-4|0;c[J>>2]=K;R=J}else R=A}else R=A;J=z;while(1){if(J>>>0<=R>>>0)break;B=J+-4|0;if(!(c[B>>2]|0))J=B;else break}K=(c[m>>2]|0)-y|0;c[m>>2]=K;if((K|0)>0){v=K;A=R;z=J}else{T=K;U=R;V=J;break}}}else{T=N;U=F;V=H}if((T|0)<0){z=((x+25|0)/9|0)+1|0;A=(w|0)==102;v=T;K=U;B=V;while(1){P=0-v|0;Q=(P|0)<9?P:9;if(K>>>0<B>>>0){P=(1<<Q)+-1|0;W=1e9>>>Q;X=0;Y=K;do{Z=c[Y>>2]|0;c[Y>>2]=(Z>>>Q)+X;X=S(Z&P,W)|0;Y=Y+4|0}while(Y>>>0<B>>>0);Y=(c[K>>2]|0)==0?K+4|0:K;if(!X){_=Y;$=B}else{c[B>>2]=X;_=Y;$=B+4|0}}else{_=(c[K>>2]|0)==0?K+4|0:K;$=B}Y=A?F:_;W=($-Y>>2|0)>(z|0)?Y+(z<<2)|0:$;v=(c[m>>2]|0)+Q|0;c[m>>2]=v;if((v|0)>=0){aa=_;ba=W;break}else{K=_;B=W}}}else{aa=U;ba=V}B=F;if(aa>>>0<ba>>>0){K=(B-aa>>2)*9|0;v=c[aa>>2]|0;if(v>>>0<10)ca=K;else{z=K;K=10;while(1){K=K*10|0;A=z+1|0;if(v>>>0<K>>>0){ca=A;break}else z=A}}}else ca=0;z=(w|0)==103;K=(x|0)!=0;v=x-((w|0)!=102?ca:0)+((K&z)<<31>>31)|0;if((v|0)<(((ba-B>>2)*9|0)+-9|0)){A=v+9216|0;v=F+4+(((A|0)/9|0)+-1024<<2)|0;H=((A|0)%9|0)+1|0;if((H|0)<9){A=10;W=H;while(1){H=A*10|0;W=W+1|0;if((W|0)==9){da=H;break}else A=H}}else da=10;A=c[v>>2]|0;W=(A>>>0)%(da>>>0)|0;w=(v+4|0)==(ba|0);if(!(w&(W|0)==0)){C=(((A>>>0)/(da>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;H=(da|0)/2|0;I=W>>>0<H>>>0?.5:w&(W|0)==(H|0)?1.0:1.5;if(!r){ea=C;fa=I}else{H=(a[s>>0]|0)==45;ea=H?-C:C;fa=H?-I:I}H=A-W|0;c[v>>2]=H;if(ea+fa!=ea){W=H+da|0;c[v>>2]=W;if(W>>>0>999999999){W=aa;H=v;while(1){A=H+-4|0;c[H>>2]=0;if(A>>>0<W>>>0){w=W+-4|0;c[w>>2]=0;ga=w}else ga=W;w=(c[A>>2]|0)+1|0;c[A>>2]=w;if(w>>>0>999999999){W=ga;H=A}else{ha=ga;ia=A;break}}}else{ha=aa;ia=v}H=(B-ha>>2)*9|0;W=c[ha>>2]|0;if(W>>>0<10){ja=ha;ka=ia;la=H}else{A=H;H=10;while(1){H=H*10|0;w=A+1|0;if(W>>>0<H>>>0){ja=ha;ka=ia;la=w;break}else A=w}}}else{ja=aa;ka=v;la=ca}}else{ja=aa;ka=v;la=ca}A=ka+4|0;ma=ja;na=la;oa=ba>>>0>A>>>0?A:ba}else{ma=aa;na=ca;oa=ba}A=oa;while(1){if(A>>>0<=ma>>>0){pa=0;break}H=A+-4|0;if(!(c[H>>2]|0))A=H;else{pa=1;break}}v=0-na|0;do if(z){H=((K^1)&1)+x|0;if((H|0)>(na|0)&(na|0)>-5){qa=H+-1-na|0;ra=i+-1|0}else{qa=H+-1|0;ra=i+-2|0}H=h&8;if(!H){if(pa?(W=c[A+-4>>2]|0,(W|0)!=0):0)if(!((W>>>0)%10|0)){w=10;Y=0;while(1){w=w*10|0;P=Y+1|0;if((W>>>0)%(w>>>0)|0|0){sa=P;break}else Y=P}}else sa=0;else sa=9;Y=((A-B>>2)*9|0)+-9|0;if((ra|32|0)==102){w=Y-sa|0;W=(w|0)>0?w:0;ta=0;ua=(qa|0)<(W|0)?qa:W;va=ra;break}else{W=Y+na-sa|0;Y=(W|0)>0?W:0;ta=0;ua=(qa|0)<(Y|0)?qa:Y;va=ra;break}}else{ta=H;ua=qa;va=ra}}else{ta=h&8;ua=x;va=i}while(0);x=ua|ta;B=(x|0)!=0&1;K=(va|32|0)==102;if(K){wa=0;xa=(na|0)>0?na:0}else{z=(na|0)<0?v:na;Y=Xe(z,((z|0)<0)<<31>>31,q)|0;z=q;if((z-Y|0)<2){W=Y;while(1){w=W+-1|0;a[w>>0]=48;if((z-w|0)<2)W=w;else{ya=w;break}}}else ya=Y;a[ya+-1>>0]=(na>>31&2)+43;W=ya+-2|0;a[W>>0]=va;wa=W;xa=z-W|0}W=r+1+ua+B+xa|0;_e(b,32,f,W,h);Se(b,s,r);_e(b,48,f,W,h^65536);if(K){v=ma>>>0>F>>>0?F:ma;w=n+9|0;Q=w;X=n+8|0;P=v;do{J=Xe(c[P>>2]|0,0,w)|0;if((P|0)==(v|0))if((J|0)==(w|0)){a[X>>0]=48;za=X}else za=J;else if(J>>>0>n>>>0){Sg(n|0,48,J-o|0)|0;y=J;while(1){Z=y+-1|0;if(Z>>>0>n>>>0)y=Z;else{za=Z;break}}}else za=J;Se(b,za,Q-za|0);P=P+4|0}while(P>>>0<=F>>>0);if(x|0)Se(b,7311,1);if(P>>>0<A>>>0&(ua|0)>0){F=P;Q=ua;while(1){X=Xe(c[F>>2]|0,0,w)|0;if(X>>>0>n>>>0){Sg(n|0,48,X-o|0)|0;v=X;while(1){K=v+-1|0;if(K>>>0>n>>>0)v=K;else{Aa=K;break}}}else Aa=X;Se(b,Aa,(Q|0)<9?Q:9);F=F+4|0;v=Q+-9|0;if(!(F>>>0<A>>>0&(Q|0)>9)){Ba=v;break}else Q=v}}else Ba=ua;_e(b,48,Ba+9|0,9,0)}else{Q=pa?A:ma+4|0;if((ua|0)>-1){F=n+9|0;w=(ta|0)==0;P=F;x=0-o|0;v=n+8|0;J=ma;K=ua;while(1){B=Xe(c[J>>2]|0,0,F)|0;if((B|0)==(F|0)){a[v>>0]=48;Ca=v}else Ca=B;do if((J|0)==(ma|0)){B=Ca+1|0;Se(b,Ca,1);if(w&(K|0)<1){Da=B;break}Se(b,7311,1);Da=B}else{if(Ca>>>0<=n>>>0){Da=Ca;break}Sg(n|0,48,Ca+x|0)|0;B=Ca;while(1){z=B+-1|0;if(z>>>0>n>>>0)B=z;else{Da=z;break}}}while(0);X=P-Da|0;Se(b,Da,(K|0)>(X|0)?X:K);B=K-X|0;J=J+4|0;if(!(J>>>0<Q>>>0&(B|0)>-1)){Ea=B;break}else K=B}}else Ea=ua;_e(b,48,Ea+18|0,18,0);Se(b,wa,q-wa|0)}_e(b,32,f,W,h^8192);M=W}else{K=(i&32|0)!=0;Q=r+3|0;_e(b,32,f,Q,h&-65537);Se(b,s,r);Se(b,t!=t|0.0!=0.0?(K?7287:7291):K?7279:7283,3);_e(b,32,f,Q,h^8192);M=Q}while(0);l=j;return ((M|0)<(f|0)?f:M)|0}function bf(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function cf(a,b){a=+a;b=b|0;return +(+df(a,b))}function df(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,k=0.0,l=0.0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Vg(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){g=+df(a*18446744073709551616.0,b);i=(c[b>>2]|0)+-64|0;k=g}else{i=0;k=a}c[b>>2]=i;l=k;break}case 2047:{l=a;break}default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;l=+h[j>>3]}}return +l}function ef(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;do if(b){if(d>>>0<128){a[b>>0]=d;f=1;break}if(!(kb(c,c[(ff()|0)+188>>2]>>2)|0))if((d&-128|0)==57216){a[b>>0]=d;f=1;break}else{c[(Ie()|0)>>2]=84;f=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;f=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;f=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;f=4;break}else{c[(Ie()|0)>>2]=84;f=-1;break}}else f=1;while(0);return f|0}function ff(){return Pa()|0}function gf(){return Pa()|0}function hf(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=0;while(1){if((d[7313+f>>0]|0)==(b|0)){g=2;break}h=f+1|0;if((h|0)==87){i=87;j=7401;g=5;break}else f=h}if((g|0)==2)if(!f)k=7401;else{i=f;j=7401;g=5}if((g|0)==5)while(1){g=0;f=j;do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);i=i+-1|0;if(!i){k=f;break}else{j=f;g=5}}return jf(k,kb(c,e+20>>2)|0)|0}function jf(a,b){a=a|0;b=b|0;return kf(a,b)|0}function kf(a,b){a=a|0;b=b|0;var d=0;if(!b)d=0;else d=lf(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (d|0?d:a)|0}function lf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=(c[b>>2]|0)+1794895138|0;g=mf(c[b+8>>2]|0,f)|0;h=mf(c[b+12>>2]|0,f)|0;i=mf(c[b+16>>2]|0,f)|0;a:do if((g>>>0<d>>>2>>>0?(j=d-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=mf(c[b+(q<<2)>>2]|0,f)|0;s=mf(c[b+(q+1<<2)>>2]|0,f)|0;if(!(s>>>0<d>>>0&r>>>0<(d-s|0)>>>0)){t=0;break a}if(a[b+(s+r)>>0]|0){t=0;break a}r=Me(e,b+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=mf(c[b+(m<<2)>>2]|0,f)|0;j=mf(c[b+(m+1<<2)>>2]|0,f)|0;if(j>>>0<d>>>0&l>>>0<(d-j|0)>>>0)t=(a[b+(j+l)>>0]|0)==0?b+j|0:0;else t=0}else t=0;while(0);return t|0}function mf(a,b){a=a|0;b=b|0;var c=0;c=ch(a|0)|0;return ((b|0)==0?a:c)|0}function nf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(of(e)|0)){h=c[f>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=e+20|0;f=c[g>>2]|0;k=f;if((h-f|0)>>>0<d>>>0){j=ub[c[e+36>>2]&7](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){l=k;m=0;n=d;o=b;break b}p=f+-1|0;if((a[b+p>>0]|0)==10)break;else f=p}p=ub[c[e+36>>2]&7](e,b,f)|0;if(p>>>0<f>>>0){j=p;break a}l=c[g>>2]|0;m=f;n=d-f|0;o=b+f|0}else{l=k;m=0;n=d;o=b}while(0);Yg(l|0,o|0,n|0)|0;c[g>>2]=(c[g>>2]|0)+n;j=m+n|0}while(0);return j|0}function of(b){b=b|0;var d=0,e=0,f=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;e=c[b>>2]|0;if(!(e&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);f=0}else{c[b>>2]=e|32;f=-1}return f|0}function pf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=a+20|0;f=c[e>>2]|0;g=(c[a+16>>2]|0)-f|0;a=g>>>0>d>>>0?d:g;Yg(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function qf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b;a:do if(!(d&3)){e=b;f=4}else{g=d;h=b;while(1){if(!(a[h>>0]|0)){i=g;break a}j=h+1|0;g=j;if(!(g&3)){e=j;f=4;break}else h=j}}while(0);if((f|0)==4){f=e;while(1){k=c[f>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))f=f+4|0;else break}if(!((k&255)<<24>>24))l=f;else{k=f;while(1){f=k+1|0;if(!(a[f>>0]|0)){l=f;break}else k=f}}i=l}return i-d|0}function rf(a,b){a=a|0;b=b|0;var c=0;c=qf(a)|0;return ((sf(a,1,c,b)|0)!=(c|0))<<31>>31|0}function sf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=S(d,b)|0;g=(b|0)==0?0:d;if((kb(c,e+76>>2)|0)>-1){d=(Qe(e)|0)==0;h=nf(a,f,e)|0;if(d)i=h;else{Re(e);i=h}}else i=nf(a,f,e)|0;if((i|0)==(f|0))j=g;else j=(i>>>0)/(b>>>0)|0;return j|0}function tf(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+16|0;g=f;h=e&255;a[g>>0]=h;i=b+16|0;j=c[i>>2]|0;if(!j)if(!(of(b)|0)){k=c[i>>2]|0;m=4}else n=-1;else{k=j;m=4}do if((m|0)==4){j=b+20|0;i=c[j>>2]|0;if(i>>>0<k>>>0?(o=e&255,(o|0)!=(a[b+75>>0]|0)):0){c[j>>2]=i+1;a[i>>0]=h;n=o;break}if((ub[c[b+36>>2]&7](b,g,1)|0)==1)n=d[g>>0]|0;else n=-1}while(0);l=f;return n|0}function uf(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=Oe(c[421]|0,a,e)|0;l=d;return b|0}function vf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[421]|0;if((kb(c,d+76>>2)|0)>-1)e=Qe(d)|0;else e=0;do if((rf(b,d)|0)<0)f=1;else{if((a[d+75>>0]|0)!=10?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=10;f=0;break}f=(tf(d,10)|0)<0}while(0);if(e|0)Re(d);return f<<31>>31|0}function wf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=Tg(g|0,h|0,b|0,d|0)|0;d=a;c[d>>2]=f;c[d+4>>2]=D;lb(c,e>>2,0)|0;D=h;return g|0}function xf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=g&b;c[f+4>>2]=h&d;lb(c,e>>2,0)|0;D=h;return g|0}function yf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=g|b;c[f+4>>2]=h|d;lb(c,e>>2,0)|0;D=h;return g|0}function zf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=Rg(g|0,h|0,b|0,d|0)|0;d=a;c[d>>2]=f;c[d+4>>2]=D;lb(c,e>>2,0)|0;D=h;return g|0}function Af(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=g^b;c[f+4>>2]=h^d;lb(c,e>>2,0)|0;D=h;return g|0}function Bf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(!b)ta(9520,9327,260,9525);if(oa()|0){bg(b);return}fg(10600)|0;if(!(a[13764]&1))a[13764]=1;d=kb(c,2657)|0;e=kb(c,2658)|0;f=(e+1|0)%128|0;if((f|0)==(d|0)){g=d;while(1){cg(10600)|0;za(10628,g|0,t)|0;fg(10600)|0;h=kb(c,2657)|0;i=kb(c,2658)|0;j=(i+1|0)%128|0;if((j|0)==(h|0))g=h;else{k=h;l=i;m=j;break}}}else{k=d;l=e;m=f}c[10636+(l<<2)>>2]=b;if((k|0)==(l|0))Fa(0);lb(c,2658,m)|0;cg(10600)|0;return}function Cf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=Tg(c[f>>2]|0,c[f+4>>2]|0,b|0,d|0)|0;d=D;b=a;c[b>>2]=g;c[b+4>>2]=d;lb(c,e>>2,0)|0;D=d;return g|0}function Df(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]&b;b=c[f+4>>2]&d;d=a;c[d>>2]=g;c[d+4>>2]=b;lb(c,e>>2,0)|0;D=b;return g|0}function Ef(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=11156+((a>>>3&255)<<2)|0;do do h=kb(c,g>>2)|0;while((h|0)!=(nb(c,g>>2,h,1)|0));while((h|0)!=0);h=a;i=c[h>>2]|0;j=c[h+4>>2]|0;if(!((i|0)==(b|0)&(j|0)==(d|0))){k=lb(c,g>>2,0)|0;D=j;return i|0}d=a;c[d>>2]=e;c[d+4>>2]=f;k=lb(c,g>>2,0)|0;D=j;return i|0}function Ff(a,b){a=a|0;b=b|0;var d=0;do d=kb(c,a>>2)|0;while((d|0)!=(nb(c,a>>2,d,b)|0));return d|0}function Gf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=b;c[f+4>>2]=d;lb(c,e>>2,0)|0;D=h;return g|0}function Hf(a){a=a|0;var b=0;b=kb(c,a>>2)|0;return +(c[j>>2]=b,+g[j>>2])}function If(a){a=a|0;var b=0,d=0,e=0.0;b=11156+((a>>>3&255)<<2)|0;do do d=kb(c,b>>2)|0;while((d|0)!=(nb(c,b>>2,d,1)|0));while((d|0)!=0);e=+h[a>>3];lb(c,b>>2,0)|0;return +e}function Jf(a){a=a|0;var b=0,d=0,e=0;b=11156+((a>>>3&255)<<2)|0;do do d=kb(c,b>>2)|0;while((d|0)!=(nb(c,b>>2,d,1)|0));while((d|0)!=0);d=a;a=c[d>>2]|0;e=c[d+4>>2]|0;lb(c,b>>2,0)|0;D=e;return a|0}function Kf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|b;b=c[f+4>>2]|d;d=a;c[d>>2]=g;c[d+4>>2]=b;lb(c,e>>2,0)|0;D=b;return g|0}function Lf(a,b){a=a|0;b=+b;return +(+((lb(c,a>>2,(g[j>>2]=b,c[j>>2]|0))|0)>>>0))}function Mf(a,b){a=a|0;b=+b;var d=0,e=0;d=11156+((a>>>3&255)<<2)|0;do do e=kb(c,d>>2)|0;while((e|0)!=(nb(c,d>>2,e,1)|0));while((e|0)!=0);h[a>>3]=b;lb(c,d>>2,0)|0;return +b}function Nf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;c[f>>2]=b;c[f+4>>2]=d;lb(c,e>>2,0)|0;D=d;return b|0}function Of(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=Rg(c[f>>2]|0,c[f+4>>2]|0,b|0,d|0)|0;d=D;b=a;c[b>>2]=g;c[b+4>>2]=d;lb(c,e>>2,0)|0;D=d;return g|0}function Pf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=11156+((a>>>3&255)<<2)|0;do do f=kb(c,e>>2)|0;while((f|0)!=(nb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]^b;b=c[f+4>>2]^d;d=a;c[d>>2]=g;c[d+4>>2]=b;lb(c,e>>2,0)|0;D=b;return g|0}function Qf(){var a=0,b=0;if(!(oa()|0))ta(9205,9327,424,9416);a=(oa()|0)==0;if(a|(c[2649]|0)!=0)return;c[2649]=1;fg(10600)|0;a=kb(c,2657)|0;b=(a|0)==(kb(c,2658)|0);cg(10600)|0;if(!b){b=a;do{bg(c[10636+(b<<2)>>2]|0);fg(10600)|0;b=(b+1|0)%128|0;lb(c,2657,b)|0;a=(b|0)==(kb(c,2658)|0);cg(10600)|0}while(!a)}Ga(10628,2147483647)|0;c[2649]=0;return}function Rf(a){a=a|0;Bf(a);ag(a,t)|0;return}function Sf(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+96|0;d=b;e=d;f=e+96|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[d>>2]=a;a=d+80|0;c[a>>2]=0;Bf(d);ag(d,t)|0;l=b;return c[a>>2]|0}function Tf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+96|0;e=d;f=e;g=f+96|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[e>>2]=a;c[e+16>>2]=b;b=e+80|0;c[b>>2]=0;Bf(e);ag(e,t)|0;l=d;return c[b>>2]|0}function Uf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+96|0;f=e;g=f;h=g+96|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[f>>2]=a;c[f+16>>2]=b;c[f+24>>2]=d;d=f+80|0;c[d>>2]=0;Bf(f);ag(f,t)|0;l=e;return c[d>>2]|0}function Vf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=l;l=l+96|0;g=f;h=g;i=h+96|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0));c[g>>2]=a;c[g+16>>2]=b;c[g+24>>2]=d;c[g+32>>2]=e;e=g+80|0;c[e>>2]=0;Bf(g);ag(g,t)|0;l=f;return c[e>>2]|0}function Wf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=l;l=l+96|0;h=g;i=h;j=i+96|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[h>>2]=a;c[h+16>>2]=b;c[h+24>>2]=d;c[h+32>>2]=e;c[h+40>>2]=f;f=h+80|0;c[f>>2]=0;Bf(h);ag(h,t)|0;l=g;return c[f>>2]|0}function Xf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=l;l=l+96|0;i=h;j=i;k=j+96|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[i>>2]=a;c[i+16>>2]=b;c[i+24>>2]=d;c[i+32>>2]=e;c[i+40>>2]=f;c[i+48>>2]=g;g=i+80|0;c[g>>2]=0;Bf(i);ag(i,t)|0;l=h;return c[g>>2]|0}function Yf(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0;i=l;l=l+96|0;j=i;k=j;m=k+96|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[j>>2]=a;c[j+16>>2]=b;c[j+24>>2]=d;c[j+32>>2]=e;c[j+40>>2]=f;c[j+48>>2]=g;c[j+56>>2]=h;h=j+80|0;c[h>>2]=0;Bf(j);ag(j,t)|0;l=i;return c[h>>2]|0}function Zf(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0;j=l;l=l+96|0;k=j;m=k;n=m+96|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[k>>2]=a;c[k+16>>2]=b;c[k+24>>2]=d;c[k+32>>2]=e;c[k+40>>2]=f;c[k+48>>2]=g;c[k+56>>2]=h;c[k+64>>2]=i;i=k+80|0;c[i>>2]=0;Bf(k);ag(k,t)|0;l=j;return c[i>>2]|0}function _f(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+240|0;g=f+96|0;h=f+112|0;i=f;c[g>>2]=e;j=Ne(h,128,d,g)|0;k=j+1|0;if((j|0)>127){j=Kg(k)|0;c[g>>2]=e;Ne(j,k,d,g)|0;m=j}else m=h;j=i;g=j+96|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(g|0));c[i>>2]=a;c[i+16>>2]=b;c[i+24>>2]=m;b=i+80|0;c[b>>2]=0;Bf(i);ag(i,t)|0;if((m|0)==(h|0)){n=c[b>>2]|0;l=f;return n|0}Lg(m);n=c[b>>2]|0;l=f;return n|0}function $f(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;a=Pa()|0;if(!(c[a+60>>2]|0))return;b=a+116|0;a=0;do{d=0;e=0;while(1){f=(c[b>>2]|0)+(d<<2)|0;g=c[f>>2]|0;if((g|0)!=0?(h=10084+(d<<2)|0,(kb(c,h>>2)|0)!=0):0){c[f>>2]=0;wb[(kb(c,h>>2)|0)&15](g);i=1}else i=e;d=d+1|0;if((d|0)==128)break;else e=i}a=a+1|0}while((a|0)<4&(i|0)!=0);return}function ag(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,h=0.0,i=0.0,j=0;d=a+8|0;a=kb(c,d>>2)|0;if(a|0){e=a;f=(e|0)==0;g=f?-8:0;return g|0}h=+Xa();i=h+b;Qg(5);if(h<i){b=h;do{za(d|0,0,+(i-b))|0;a=kb(c,d>>2)|0;b=+Xa()}while((a|0)==0&b<i);j=a}else j=0;Qg(1);e=j;f=(e|0)==0;g=f?-8:0;return g|0}function bg(a){a=a|0;var b=0;do switch(c[a>>2]|0){case 12:{c[a+80>>2]=Ia(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 13:{c[a+80>>2]=ua(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 37:{c[a+80>>2]=Ya(c[a+16>>2]|0)|0;break}case 46:{c[a+80>>2]=gb(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 68:{c[a+80>>2]=Oa(c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0)|0;break}case 72:{c[a+80>>2]=xa(c[a+16>>2]|0)|0;break}case 110:{c[a+80>>2]=eb(c[a+16>>2]|0)|0;break}case 111:{c[a+80>>2]=Ra(c[a+16>>2]|0)|0;break}case 112:{c[a+80>>2]=Ea()|0;break}case 113:{c[a+80>>2]=hb(c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0)|0;break}case 114:{c[a+80>>2]=qa(c[a+16>>2]|0)|0;break}case 115:{c[a+80>>2]=ma(c[a+16>>2]|0)|0;break}case 119:{pa();break}case 137:{c[a+80>>2]=Va(c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0,c[a+40>>2]|0)|0;break}case 138:{c[a+80>>2]=sa(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 1024:{Ab[c[a+4>>2]&7]();break}case 1025:{wb[c[a+4>>2]&15](c[a+16>>2]|0);break}case 1026:{xb[c[a+4>>2]&1](c[a+16>>2]|0,c[a+24>>2]|0);break}case 1027:{zb[c[a+4>>2]&1](c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0);break}case 2048:{c[a+80>>2]=vb[c[a+4>>2]&1]()|0;break}case 2049:{c[a+80>>2]=yb[c[a+4>>2]&7](c[a+16>>2]|0)|0;break}case 2050:{c[a+80>>2]=Cb[c[a+4>>2]&15](c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 2051:{c[a+80>>2]=ub[c[a+4>>2]&7](c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0)|0;break}default:ta(9460,9327,211,9511)}while(0);if(!(c[a+88>>2]|0)){b=a+8|0;c[b>>2]=1;Ga(b|0,2147483647)|0;return}else{Lg(a);return}}function cg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=kb(c,a+8>>2)|0;d=c[a>>2]|0;e=d&128^128;f=(d&15|0)==0;if(!f){g=Pa()|0;h=a+4|0;i=(kb(c,h>>2)|0)&2147483647;if((i|0)!=(c[g+52>>2]|0)){j=1;return j|0}if((d&3|0)==1?(i=a+20|0,k=c[i>>2]|0,k|0):0){c[i>>2]=k+-1;j=0;return j|0}k=a+16|0;if(!e){lb(c,g+176>>2,k)|0;dg()}i=c[a+12>>2]|0;l=c[k>>2]|0;lb(c,i>>2,l)|0;if((l|0)==(g+168|0)){m=h;n=g}else{lb(c,l+-4>>2,i)|0;m=h;n=g}}else{m=a+4|0;n=0}a=d&8|0?2147483647:0;do o=kb(c,m>>2)|0;while((nb(c,m>>2,o,a)|0)!=(o|0));if(!(f|(e|0)!=0)){lb(c,n+176>>2,0)|0;eg()}if(!((b|0)!=0|(o|0)<0)){j=0;return j|0}Ga(m|0,1)|0;j=0;return j|0}function dg(){ob(c,2787,1)|0;return}function eg(){if((ob(c,2787,-1)|0)!=1)return;if(!(kb(c,2788)|0))return;Ga(11148,2147483647)|0;return}function fg(a){a=a|0;var b=0;if((c[a>>2]&15|0)==0?(nb(c,a+4>>2,0,16)|0)==0:0){b=0;return b|0}b=gg(a,0)|0;return b|0}function gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[a>>2]|0;do if(!(d&15))if(!(nb(c,a+4>>2,0,16)|0)){e=0;return e|0}else{f=c[a>>2]|0;break}else f=d;while(0);d=f&128^128;f=lg(a)|0;if((f|0)!=16){e=f;return e|0}f=a+4|0;g=a+8|0;h=100;while(1){if(!h)break;if(!(kb(c,f>>2)|0))break;if(!(kb(c,g>>2)|0))h=h+-1|0;else break}h=lg(a)|0;if((h|0)!=16){e=h;return e|0}a:while(1){h=kb(c,f>>2)|0;if(h|0?(i=c[a>>2]|0,(h&1073741824|0)==0|(i&4|0)==0):0){if((i&3|0)==2?(h&2147483647|0)==(c[(Pa()|0)+52>>2]|0):0){e=35;j=17;break}ob(c,g>>2,1)|0;i=h|-2147483648;nb(c,f>>2,h,i)|0;h=hg(f,i,0,b,d)|0;pb(c,g>>2,1)|0;switch(h|0){case 0:case 4:break;default:{e=h;j=17;break a}}}h=lg(a)|0;if((h|0)!=16){e=h;j=17;break}}if((j|0)==17)return e|0;return 0}function hg(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+16|0;h=g;Ja(1,h|0)|0;Xg(1,4);i=ig(a,b,d,e,f)|0;Xg(4,1);Ja(c[h>>2]|0,0)|0;l=g;return i|0}function ig(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0;f=l;l=l+16|0;g=f;h=(e|0)!=0;if(h){i=e+4|0;if((c[i>>2]|0)>>>0>999999999){j=22;l=f;return j|0}if(bb(d|0,g|0)|0){j=22;l=f;return j|0}d=(c[e>>2]|0)-(c[g>>2]|0)|0;c[g>>2]=d;k=g+4|0;m=(c[i>>2]|0)-(c[k>>2]|0)|0;c[k>>2]=m;if((m|0)<0){i=d+-1|0;c[g>>2]=i;c[k>>2]=m+1e9;n=i}else n=d;if((n|0)<0){j=110;l=f;return j|0}}n=(oa()|0)!=0;o=n?1.0:100.0;if(n){a:while(1){if(jg(Pa()|0)|0){p=125;break}Qf();if(h){q=+kg(e);r=q>100.0?100.0:q;if(!(q<=0.0))s=r>1.0?1.0:r;else{p=110;break}}else s=o;n=0-(za(a|0,b|0,+s)|0)|0;switch(n|0){case 110:break;case 4:case 125:{p=n;break a;break}default:{j=0;t=21;break a}}}if((t|0)==21){l=f;return j|0}j=p;l=f;return j|0}if(!h){b:while(1){if(jg(Pa()|0)|0){u=125;break}h=0-(za(a|0,b|0,+o)|0)|0;switch(h|0){case 110:break;case 4:case 125:{u=h;break b;break}default:{j=0;t=21;break b}}}if((t|0)==21){l=f;return j|0}j=u;l=f;return j|0}c:while(1){if(jg(Pa()|0)|0){v=125;break}o=+kg(e);if(o<=0.0){v=110;break}u=0-(za(a|0,b|0,+(o>100.0?100.0:o))|0)|0;switch(u|0){case 110:break;case 4:case 125:{v=u;break c;break}default:{j=0;t=21;break c}}}if((t|0)==21){l=f;return j|0}j=v;l=f;return j|0}function jg(a){a=a|0;return (c[a>>2]|0)==2|0}function kg(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;db(d|0,0)|0;l=b;return +(+(c[a>>2]|0)*1.0e3+ +(c[a+4>>2]|0)*1.0e-06-(+(c[d>>2]|0)*1.0e3+ +(c[d+4>>2]|0)*.001))}function lg(a){a=a|0;var b=0;if(!(c[a>>2]&15)){b=(nb(c,a+4>>2,0,16)|0)&16;return b|0}else{b=mg(a)|0;return b|0}return 0}function mg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=c[a>>2]|0;d=Pa()|0;e=c[d+52>>2]|0;f=a+4|0;g=kb(c,f>>2)|0;h=g&2147483647;if((b&3|0)==1&(h|0)==(e|0)){i=a+20|0;j=c[i>>2]|0;if(j>>>0>2147483646){k=11;return k|0}c[i>>2]=j+1;k=0;return k|0}if((h|0)==2147483647){k=131;return k|0}if(!(c[a>>2]&128))l=e;else{j=d+172|0;if(!(c[j>>2]|0))c[j>>2]=-12;j=(kb(c,a+8>>2)|0)==0;lb(c,d+176>>2,a+16|0)|0;l=j?e:e|-2147483648}e=(h|0)!=0;if(!(e?(b&4|0)==0|(g&1073741824|0)==0:0))m=11;if((m|0)==11?(nb(c,f>>2,g,l)|0)==(g|0):0){g=d+168|0;l=kb(c,g>>2)|0;f=a+16|0;c[f>>2]=l;c[a+12>>2]=g;if((l|0)!=(g|0))lb(c,l+-4>>2,f)|0;lb(c,g>>2,f)|0;lb(c,d+176>>2,0)|0;if(!e){k=0;return k|0}c[a+20>>2]=0;c[a>>2]=c[a>>2]|8;k=130;return k|0}lb(c,d+176>>2,0)|0;k=16;return k|0}function ng(){var a=0;a=Pa()|0;if(kb(c,a+72>>2)|0)return;if((c[a>>2]|0)!=2)return;Fa(1);return}function og(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=a&1023;g=Kg(96)|0;c[g+8>>2]=0;c[g>>2]=a;c[g+4>>2]=b;if(!d){h=g+88|0;c[h>>2]=1;Bf(g);l=e;return}else i=0;do{b=(c[f>>2]|0)+(4-1)&~(4-1);a=c[b>>2]|0;c[f>>2]=b+4;c[g+16+(i<<3)>>2]=a;i=i+1|0}while((i|0)!=(d|0));h=g+88|0;c[h>>2]=1;Bf(g);l=e;return}function pg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=l;l=l+16|0;e=d;lb(c,e>>2,0)|0;f=a+32|0;if(nb(c,f>>2,0,1)|0){nb(c,f>>2,1,2)|0;do qg(f,0,2,1);while((nb(c,f>>2,0,2)|0)!=0)}g=a+20|0;h=c[g>>2]|0;i=(h|0)!=0;if((b|0)!=0&i){j=0;k=b;b=h;while(1){if(!(nb(c,b+8>>2,0,1)|0)){m=(j|0)==0?b:j;n=k+-1|0}else{lb(c,e>>2,(kb(c,e>>2)|0)+1|0)|0;c[b+16>>2]=e;m=j;n=k}o=c[b>>2]|0;p=(o|0)!=0;if((n|0)!=0&p){j=m;k=n;b=o}else{q=m;r=o;s=p;break}}}else{q=0;r=h;s=i}if(s){s=r+4|0;i=c[s>>2]|0;if(i|0)c[i>>2]=0;c[s>>2]=0}else c[a+4>>2]=0;c[g>>2]=r;do t=kb(c,f>>2)|0;while((nb(c,f>>2,t,0)|0)!=(t|0));if((t|0)==2)Ga(f|0,1)|0;f=kb(c,e>>2)|0;if(f|0){t=f;do{qg(e,0,t,1);t=kb(c,e>>2)|0}while((t|0)!=0)}if(!q){l=d;return 0}t=q+12|0;do u=kb(c,t>>2)|0;while((nb(c,t>>2,u,0)|0)!=(u|0));if((u|0)!=2){l=d;return 0}Ga(t|0,1)|0;l=d;return 0}function qg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0;e=(b|0)!=0;a:do if(e){f=100;while(1){if(!f){g=7;break a}if(kb(c,b>>2)|0){g=8;break a}if((kb(c,a>>2)|0)==(d|0))f=f+-1|0;else break}return}else{f=100;while(1){if(!f){g=7;break a}if((kb(c,a>>2)|0)==(d|0))f=f+-1|0;else break}return}while(0);if((g|0)==7?e:0)g=8;if((g|0)==8)ob(c,b>>2,1)|0;g=oa()|0;b:do if((kb(c,a>>2)|0)==(d|0)){f=(g|0)!=0;h=f?1.0:100.0;c:do if(f)while(1){if((kb(c,(Pa()|0)+76>>2)|0)==1)do{if(jg(Pa()|0)|0)break c;Qf()}while((za(a|0,d|0,+h)|0)==-110);else za(a|0,d|0,t)|0;if((kb(c,a>>2)|0)!=(d|0))break b}else while(1){if((kb(c,(Pa()|0)+76>>2)|0)==1)do if(jg(Pa()|0)|0)break c;while((za(a|0,d|0,+h)|0)==-110);else za(a|0,d|0,t)|0;if((kb(c,a>>2)|0)!=(d|0))break b}while(0);if(!e)return;pb(c,b>>2,1)|0;return}while(0);if(!e)return;pb(c,b>>2,1)|0;return}function rg(a){a=a|0;var b=0,d=0,e=0;if(!(c[a>>2]|0))return 0;b=a+12|0;if(!(kb(c,b>>2)|0))return 0;rb(c,b>>2,-2147483648)|0;d=a+8|0;ob(c,d>>2,1)|0;Ga(d|0,2147483647)|0;d=kb(c,b>>2)|0;if(!(d&2147483647))return 0;else e=d;do{qg(b,0,e,0);e=kb(c,b>>2)|0}while((e&2147483647|0)!=0);return 0}function sg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+48|0;e=d;f=e;g=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));f=a;h=e;g=f+48|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(g|0));if(!b){l=d;return 0}h=c[b>>2]|0;c[a+16>>2]=h&2147483647;if((h|0)>=0){l=d;return 0}c[a>>2]=-1;l=d;return 0}function tg(a){a=a|0;var b=0,d=0;if(!(c[a>>2]|0)){b=pg(a,1)|0;return b|0}if(!(kb(c,a+12>>2)|0)){b=0;return b|0}d=a+8|0;ob(c,d>>2,1)|0;Ga(d|0,1)|0;b=0;return b|0}function ug(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=l;l=l+32|0;f=e+4|0;g=e;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;h=c[a+16>>2]|0;if(c[b>>2]&15|0?(i=(kb(c,b+4>>2)|0)&2147483647,(i|0)!=(c[(Pa()|0)+52>>2]|0)):0){j=1;l=e;return j|0}if(d|0?(c[d+4>>2]|0)>>>0>999999999:0){j=22;l=e;return j|0}ng();if(!(c[a>>2]|0)){i=a+32|0;if(nb(c,i>>2,0,1)|0){nb(c,i>>2,1,2)|0;do qg(i,0,2,1);while((nb(c,i>>2,0,2)|0)!=0)}k=f+12|0;lb(c,k>>2,2)|0;lb(c,f+8>>2,0)|0;m=a+4|0;n=c[m>>2]|0;c[f+4>>2]=n;c[m>>2]=f;m=a+20|0;c[((c[m>>2]|0)==0?m:n)>>2]=f;do o=kb(c,i>>2)|0;while((nb(c,i>>2,o,0)|0)!=(o|0));if((o|0)==2){Ga(i|0,1)|0;p=k;q=2;r=0}else{p=k;q=2;r=0}}else{k=a+8|0;i=kb(c,k>>2)|0;ob(c,a+12>>2,1)|0;p=k;q=i;r=1}cg(b)|0;Ja(2,g|0)|0;if((c[g>>2]|0)==1)Ja(1,0)|0;i=(r|0)!=0;r=(i^1)&1;do s=ig(p,q,h,d,r)|0;while((kb(c,p>>2)|0)==(q|0)&(s|4|0)==4);p=(s|0)==4?0:s;a:do if(i){if((p|0)==125){s=(kb(c,a+8>>2)|0)==(q|0);t=s?125:0}else t=p;s=a+12|0;if((ob(c,s>>2,-1)|0)==-2147483647){Ga(s|0,1)|0;u=t;v=0}else{u=t;v=0}}else{s=nb(c,f+8>>2,0,2)|0;if(s|0){r=f+12|0;if(!(nb(c,r>>2,0,1)|0)){u=p;v=s;break}nb(c,r>>2,1,2)|0;while(1){qg(r,0,2,1);if(!(nb(c,r>>2,0,2)|0)){u=p;v=s;break a}}}s=a+32|0;if(nb(c,s>>2,0,1)|0){nb(c,s>>2,1,2)|0;do qg(s,0,2,1);while((nb(c,s>>2,0,2)|0)!=0)}r=a+4|0;if((c[r>>2]|0)!=(f|0)){d=c[f>>2]|0;if(d|0)c[d+4>>2]=c[f+4>>2]}else c[r>>2]=c[f+4>>2];r=a+20|0;if((c[r>>2]|0)!=(f|0)){d=c[f+4>>2]|0;if(d|0)c[d>>2]=c[f>>2]}else c[r>>2]=c[f>>2];do w=kb(c,s>>2)|0;while((nb(c,s>>2,w,0)|0)!=(w|0));if((w|0)==2)Ga(s|0,1)|0;r=f+16|0;d=c[r>>2]|0;if((d|0)!=0?(ob(c,d>>2,-1)|0)==1:0){Ga(c[r>>2]|0,1)|0;u=p;v=0}else{u=p;v=0}}while(0);p=fg(b)|0;w=(p|0)==0?u:p;if(!v){Ja(c[g>>2]|0,0)|0;if((w|0)==125){ng();Ja(1,0)|0;x=125}else x=w}else{if(!(c[f+4>>2]|0))ob(c,b+8>>2,1)|0;v=c[f>>2]|0;if(!v)pb(c,b+8>>2,1)|0;else{f=v+12|0;v=b+4|0;lb(c,f>>2,0)|0;do{}while((ra(f|0,0,v|0,kb(c,f>>2)|0)|0)==-11)}Ja(c[g>>2]|0,0)|0;x=(w|0)==125?0:w}ng();j=x;l=e;return j|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0;a:while(1){switch(nb(c,a>>2,0,1)|0){case 0:{break a;break}case 2:{d=9;break a;break}case 1:{nb(c,a>>2,1,3)|0;break}case 3:break;default:continue a}qg(a,0,3,1)}if((d|0)==9)return 0;ab(10,a|0);Ab[b&7]();la(0);do e=kb(c,a>>2)|0;while((nb(c,a>>2,e,2)|0)!=(e|0));if((e|0)!=3)return 0;Ga(a|0,2147483647)|0;return 0}function wg(a){a=a|0;var b=0;do b=kb(c,a>>2)|0;while((nb(c,a>>2,b,0)|0)!=(b|0));if((b|0)!=3)return;Ga(a|0,2147483647)|0;return}function xg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;if((kb(c,a>>2)|0)==2){lb(c,e>>2,0)|0;nb(c,e>>2,0,0)|0;l=d;return 0}else{vg(a,b)|0;l=d;return 0}return 0}function yg(a){a=a|0;return 0}function zg(a,b){a=a|0;b=b|0;return ug(a,b,0)|0}function Ag(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((d|0)<0){c[(Ie()|0)>>2]=22;e=-1;return e|0}else{lb(c,a>>2,d)|0;lb(c,a+4>>2,0)|0;lb(c,a+8>>2,b|0?0:128)|0;e=0;return e|0}return 0}function Bg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;kb(c,a+8>>2)|0;b=a+4|0;do{d=kb(c,a>>2)|0;e=kb(c,b>>2)|0;if((d|0)==2147483647){f=3;break}}while((nb(c,a>>2,d,d+1+(d>>>31)|0)|0)!=(d|0));if((f|0)==3){c[(Ie()|0)>>2]=75;g=-1;return g|0}if(!((d|0)<0|(e|0)!=0)){g=0;return g|0}Ga(a|0,1)|0;g=0;return g|0}function Cg(a){a=a|0;return 0}function Dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;ng();if(!(Eg(a)|0)){d=0;return d|0}e=a+4|0;f=100;while(1){if(!f)break;if((kb(c,a>>2)|0)>=1)break;if(!(kb(c,e>>2)|0))f=f+-1|0;else break}if(!(Eg(a)|0)){d=0;return d|0}f=a+8|0;a:while(1){ob(c,e>>2,1)|0;nb(c,a>>2,0,-1)|0;ab(11,e|0);g=ig(a,-1,0,b,kb(c,f>>2)|0)|0;la(1);switch(g|0){case 125:{h=4;break a;break}case 0:case 4:break;default:{i=10;break a}}if(!(Eg(a)|0)){d=0;i=12;break}}if((i|0)==10)h=g;else if((i|0)==12)return d|0;c[(Ie()|0)>>2]=h;d=-1;return d|0}function Eg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+4|0;while(1){d=kb(c,a>>2)|0;if((d|0)<=0)break;if((d|0)==1)e=(kb(c,b>>2)|0)!=0;else e=0;if((nb(c,a>>2,d,d+-1+(e<<31>>31)|0)|0)==(d|0)){f=0;g=7;break}}if((g|0)==7)return f|0;c[(Ie()|0)>>2]=11;f=-1;return f|0}function Fg(a){a=a|0;pb(c,a>>2,1)|0;return}function Gg(a){a=a|0;c[a>>2]=0;return 0}function Hg(a){a=a|0;return Dg(a,0)|0}function Ig(a){a=a|0;return 0}function Jg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];c[a+24>>2]=c[e+24>>2];if(!b){l=d;return 0}c[a>>2]=c[b>>2];l=d;return 0}function Kg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;b=l;l=l+16|0;d=b+4|0;e=b;if(!(c[3045]|0)){fg(12204)|0;if(!(c[3045]|0)){c[3047]=4096;c[3046]=4096;c[3048]=-1;c[3049]=-1;c[3050]=2;c[3169]=2;(Gg(d)|0)==0?(Jg(12680,d)|0)==0:0;f=e&-16^1431655768;c[e>>2]=f;lb(c,3045,f)|0}cg(12204)|0}if(c[3169]&2|0?fg(12680)|0:0){g=0;l=b;return g|0}do if(a>>>0<245){f=a>>>0<11?16:a+11&-8;h=f>>>3;i=c[3058]|0;j=i>>>h;if(j&3|0){k=(j&1^1)+h|0;m=12272+(k<<1<<2)|0;n=m+8|0;o=c[n>>2]|0;p=o+8|0;q=c[p>>2]|0;do if((m|0)!=(q|0)){if(q>>>0<(c[3062]|0)>>>0)$a();r=q+12|0;if((c[r>>2]|0)==(o|0)){c[r>>2]=m;c[n>>2]=q;break}else $a()}else c[3058]=i&~(1<<k);while(0);q=k<<3;c[o+4>>2]=q|3;n=o+q+4|0;c[n>>2]=c[n>>2]|1;s=p;break}n=c[3060]|0;if(f>>>0>n>>>0){if(j|0){q=2<<h;m=j<<h&(q|0-q);q=(m&0-m)+-1|0;m=q>>>12&16;r=q>>>m;q=r>>>5&8;t=r>>>q;r=t>>>2&4;u=t>>>r;t=u>>>1&2;v=u>>>t;u=v>>>1&1;w=(q|m|r|t|u)+(v>>>u)|0;u=12272+(w<<1<<2)|0;v=u+8|0;t=c[v>>2]|0;r=t+8|0;m=c[r>>2]|0;do if((u|0)!=(m|0)){if(m>>>0<(c[3062]|0)>>>0)$a();q=m+12|0;if((c[q>>2]|0)==(t|0)){c[q>>2]=u;c[v>>2]=m;x=i;break}else $a()}else{q=i&~(1<<w);c[3058]=q;x=q}while(0);m=(w<<3)-f|0;c[t+4>>2]=f|3;v=t+f|0;c[v+4>>2]=m|1;c[v+m>>2]=m;if(n|0){u=c[3063]|0;h=n>>>3;j=12272+(h<<1<<2)|0;p=1<<h;if(x&p){h=j+8|0;o=c[h>>2]|0;if(o>>>0<(c[3062]|0)>>>0)$a();else{y=h;z=o}}else{c[3058]=x|p;y=j+8|0;z=j}c[y>>2]=u;c[z+12>>2]=u;c[u+8>>2]=z;c[u+12>>2]=j}c[3060]=m;c[3063]=v;s=r;break}v=c[3059]|0;if(v){m=(v&0-v)+-1|0;j=m>>>12&16;u=m>>>j;m=u>>>5&8;p=u>>>m;u=p>>>2&4;o=p>>>u;p=o>>>1&2;h=o>>>p;o=h>>>1&1;k=c[12536+((m|j|u|p|o)+(h>>>o)<<2)>>2]|0;o=(c[k+4>>2]&-8)-f|0;h=c[k+16+(((c[k+16>>2]|0)==0&1)<<2)>>2]|0;if(!h){A=o;B=k}else{p=h;h=o;o=k;while(1){k=(c[p+4>>2]&-8)-f|0;u=k>>>0<h>>>0;j=u?k:h;k=u?p:o;p=c[p+16+(((c[p+16>>2]|0)==0&1)<<2)>>2]|0;if(!p){A=j;B=k;break}else{h=j;o=k}}}o=c[3062]|0;if(B>>>0<o>>>0)$a();h=B+f|0;if(B>>>0>=h>>>0)$a();p=c[B+24>>2]|0;r=c[B+12>>2]|0;do if((r|0)==(B|0)){t=B+20|0;w=c[t>>2]|0;if(!w){k=B+16|0;j=c[k>>2]|0;if(!j){C=0;break}else{D=j;E=k}}else{D=w;E=t}while(1){t=D+20|0;w=c[t>>2]|0;if(w|0){D=w;E=t;continue}t=D+16|0;w=c[t>>2]|0;if(!w)break;else{D=w;E=t}}if(E>>>0<o>>>0)$a();else{c[E>>2]=0;C=D;break}}else{t=c[B+8>>2]|0;if(t>>>0<o>>>0)$a();w=t+12|0;if((c[w>>2]|0)!=(B|0))$a();k=r+8|0;if((c[k>>2]|0)==(B|0)){c[w>>2]=r;c[k>>2]=t;C=r;break}else $a()}while(0);a:do if(p|0){r=c[B+28>>2]|0;o=12536+(r<<2)|0;do if((B|0)==(c[o>>2]|0)){c[o>>2]=C;if(!C){c[3059]=v&~(1<<r);break a}}else if(p>>>0>=(c[3062]|0)>>>0){c[p+16+(((c[p+16>>2]|0)!=(B|0)&1)<<2)>>2]=C;if(!C)break a;else break}else $a();while(0);r=c[3062]|0;if(C>>>0<r>>>0)$a();c[C+24>>2]=p;o=c[B+16>>2]|0;do if(o|0)if(o>>>0<r>>>0)$a();else{c[C+16>>2]=o;c[o+24>>2]=C;break}while(0);o=c[B+20>>2]|0;if(o|0)if(o>>>0<(c[3062]|0)>>>0)$a();else{c[C+20>>2]=o;c[o+24>>2]=C;break}}while(0);if(A>>>0<16){p=A+f|0;c[B+4>>2]=p|3;v=B+p+4|0;c[v>>2]=c[v>>2]|1}else{c[B+4>>2]=f|3;c[h+4>>2]=A|1;c[h+A>>2]=A;if(n|0){v=c[3063]|0;p=n>>>3;o=12272+(p<<1<<2)|0;r=1<<p;if(i&r){p=o+8|0;t=c[p>>2]|0;if(t>>>0<(c[3062]|0)>>>0)$a();else{F=p;G=t}}else{c[3058]=i|r;F=o+8|0;G=o}c[F>>2]=v;c[G+12>>2]=v;c[v+8>>2]=G;c[v+12>>2]=o}c[3060]=A;c[3063]=h}s=B+8|0}else{H=f;I=153}}else{H=f;I=153}}else if(a>>>0<=4294967231){o=a+11|0;v=o&-8;r=c[3059]|0;if(r){t=0-v|0;p=o>>>8;if(p)if(v>>>0>16777215)J=31;else{o=(p+1048320|0)>>>16&8;k=p<<o;p=(k+520192|0)>>>16&4;w=k<<p;k=(w+245760|0)>>>16&2;j=14-(p|o|k)+(w<<k>>>15)|0;J=v>>>(j+7|0)&1|j<<1}else J=0;j=c[12536+(J<<2)>>2]|0;b:do if(!j){K=t;L=0;M=0;I=90}else{k=t;w=0;o=v<<((J|0)==31?0:25-(J>>>1)|0);p=j;u=0;while(1){m=(c[p+4>>2]&-8)-v|0;if(m>>>0<k>>>0)if(!m){N=0;O=p;P=p;I=94;break b}else{Q=m;R=p}else{Q=k;R=u}m=c[p+20>>2]|0;p=c[p+16+(o>>>31<<2)>>2]|0;q=(m|0)==0|(m|0)==(p|0)?w:m;m=(p|0)==0;if(m){K=Q;L=q;M=R;I=90;break}else{k=Q;w=q;o=o<<((m^1)&1);u=R}}}while(0);if((I|0)==90){if((L|0)==0&(M|0)==0){j=2<<J;t=r&(j|0-j);if(!t){H=v;I=153;break}j=(t&0-t)+-1|0;t=j>>>12&16;f=j>>>t;j=f>>>5&8;h=f>>>j;f=h>>>2&4;i=h>>>f;h=i>>>1&2;n=i>>>h;i=n>>>1&1;S=c[12536+((j|t|f|h|i)+(n>>>i)<<2)>>2]|0;T=0}else{S=L;T=M}if(!S){U=K;V=T}else{N=K;O=S;P=T;I=94}}if((I|0)==94)while(1){I=0;i=(c[O+4>>2]&-8)-v|0;n=i>>>0<N>>>0;h=n?i:N;i=n?O:P;O=c[O+16+(((c[O+16>>2]|0)==0&1)<<2)>>2]|0;if(!O){U=h;V=i;break}else{N=h;P=i;I=94}}if((V|0)!=0?U>>>0<((c[3060]|0)-v|0)>>>0:0){i=c[3062]|0;if(V>>>0<i>>>0)$a();h=V+v|0;if(V>>>0>=h>>>0)$a();n=c[V+24>>2]|0;f=c[V+12>>2]|0;do if((f|0)==(V|0)){t=V+20|0;j=c[t>>2]|0;if(!j){u=V+16|0;o=c[u>>2]|0;if(!o){W=0;break}else{X=o;Y=u}}else{X=j;Y=t}while(1){t=X+20|0;j=c[t>>2]|0;if(j|0){X=j;Y=t;continue}t=X+16|0;j=c[t>>2]|0;if(!j)break;else{X=j;Y=t}}if(Y>>>0<i>>>0)$a();else{c[Y>>2]=0;W=X;break}}else{t=c[V+8>>2]|0;if(t>>>0<i>>>0)$a();j=t+12|0;if((c[j>>2]|0)!=(V|0))$a();u=f+8|0;if((c[u>>2]|0)==(V|0)){c[j>>2]=f;c[u>>2]=t;W=f;break}else $a()}while(0);c:do if(n){f=c[V+28>>2]|0;i=12536+(f<<2)|0;do if((V|0)==(c[i>>2]|0)){c[i>>2]=W;if(!W){t=r&~(1<<f);c[3059]=t;Z=t;break c}}else if(n>>>0>=(c[3062]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(V|0)&1)<<2)>>2]=W;if(!W){Z=r;break c}else break}else $a();while(0);f=c[3062]|0;if(W>>>0<f>>>0)$a();c[W+24>>2]=n;i=c[V+16>>2]|0;do if(i|0)if(i>>>0<f>>>0)$a();else{c[W+16>>2]=i;c[i+24>>2]=W;break}while(0);i=c[V+20>>2]|0;if(i)if(i>>>0<(c[3062]|0)>>>0)$a();else{c[W+20>>2]=i;c[i+24>>2]=W;Z=r;break}else Z=r}else Z=r;while(0);do if(U>>>0>=16){c[V+4>>2]=v|3;c[h+4>>2]=U|1;c[h+U>>2]=U;r=U>>>3;if(U>>>0<256){n=12272+(r<<1<<2)|0;i=c[3058]|0;f=1<<r;do if(!(i&f)){c[3058]=i|f;_=n+8|0;$=n}else{r=n+8|0;t=c[r>>2]|0;if(t>>>0>=(c[3062]|0)>>>0){_=r;$=t;break}$a()}while(0);c[_>>2]=h;c[$+12>>2]=h;c[h+8>>2]=$;c[h+12>>2]=n;break}f=U>>>8;if(f)if(U>>>0>16777215)aa=31;else{i=(f+1048320|0)>>>16&8;t=f<<i;f=(t+520192|0)>>>16&4;r=t<<f;t=(r+245760|0)>>>16&2;u=14-(f|i|t)+(r<<t>>>15)|0;aa=U>>>(u+7|0)&1|u<<1}else aa=0;u=12536+(aa<<2)|0;c[h+28>>2]=aa;t=h+16|0;c[t+4>>2]=0;c[t>>2]=0;t=1<<aa;if(!(Z&t)){c[3059]=Z|t;c[u>>2]=h;c[h+24>>2]=u;c[h+12>>2]=h;c[h+8>>2]=h;break}t=U<<((aa|0)==31?0:25-(aa>>>1)|0);r=c[u>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(U|0)){I=148;break}ba=r+16+(t>>>31<<2)|0;u=c[ba>>2]|0;if(!u){I=145;break}else{t=t<<1;r=u}}if((I|0)==145)if(ba>>>0<(c[3062]|0)>>>0)$a();else{c[ba>>2]=h;c[h+24>>2]=r;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((I|0)==148){t=r+8|0;n=c[t>>2]|0;u=c[3062]|0;if(n>>>0>=u>>>0&r>>>0>=u>>>0){c[n+12>>2]=h;c[t>>2]=h;c[h+8>>2]=n;c[h+12>>2]=r;c[h+24>>2]=0;break}else $a()}}else{n=U+v|0;c[V+4>>2]=n|3;t=V+n+4|0;c[t>>2]=c[t>>2]|1}while(0);s=V+8|0}else{H=v;I=153}}else{H=v;I=153}}else{H=-1;I=153}while(0);d:do if((I|0)==153){V=c[3060]|0;if(V>>>0>=H>>>0){U=V-H|0;ba=c[3063]|0;if(U>>>0>15){aa=ba+H|0;c[3063]=aa;c[3060]=U;c[aa+4>>2]=U|1;c[aa+U>>2]=U;c[ba+4>>2]=H|3}else{c[3060]=0;c[3063]=0;c[ba+4>>2]=V|3;U=ba+V+4|0;c[U>>2]=c[U>>2]|1}s=ba+8|0;break}ba=c[3061]|0;if(ba>>>0>H>>>0){U=ba-H|0;c[3061]=U;ba=c[3064]|0;V=ba+H|0;c[3064]=V;c[V+4>>2]=U|1;c[ba+4>>2]=H|3;s=ba+8|0;break}if(!(c[3045]|0)){fg(12204)|0;if(!(c[3045]|0)){c[3047]=4096;c[3046]=4096;c[3048]=-1;c[3049]=-1;c[3050]=2;c[3169]=2;(Gg(d)|0)==0?(Jg(12680,d)|0)==0:0;ba=e&-16^1431655768;c[e>>2]=ba;lb(c,3045,ba)|0}cg(12204)|0}ba=H+48|0;U=c[3047]|0;V=H+47|0;aa=U+V&0-U;if(aa>>>0>H>>>0){U=c[3168]|0;if(U|0?(Z=c[3166]|0,$=Z+aa|0,$>>>0<=Z>>>0|$>>>0>U>>>0):0){s=0;break}if(!(c[3169]&4)){U=c[3064]|0;e:do if(U){$=12708;while(1){Z=c[$>>2]|0;if(Z>>>0<=U>>>0?(ca=$+4|0,(Z+(c[ca>>2]|0)|0)>>>0>U>>>0):0)break;Z=c[$+8>>2]|0;if(!Z){I=176;break e}else $=Z}fg(12204)|0;r=c[3047]|0;Z=V-(c[3061]|0)+r&0-r;if(Z>>>0<2147483647){r=dh(Z|0)|0;if((r|0)==((c[$>>2]|0)+(c[ca>>2]|0)|0))if((r|0)==(-1|0)){da=Z;I=190}else{ea=r;fa=Z}else{ga=r;ha=Z;I=184}}else{da=0;I=190}}else I=176;while(0);do if((I|0)==176){fg(12204)|0;U=dh(0)|0;if((U|0)!=(-1|0)?(v=U,Z=c[3046]|0,r=Z+-1|0,_=((r&v|0)==0?0:(r+v&0-Z)-v|0)+aa|0,v=c[3166]|0,Z=_+v|0,_>>>0>H>>>0&_>>>0<2147483647):0){r=c[3168]|0;if(r|0?Z>>>0<=v>>>0|Z>>>0>r>>>0:0){da=0;I=190;break}r=dh(_|0)|0;if((r|0)==(U|0)){ea=U;fa=_}else{ga=r;ha=_;I=184}}else{da=0;I=190}}while(0);do if((I|0)==184){_=0-ha|0;if(!(ba>>>0>ha>>>0&(ha>>>0<2147483647&(ga|0)!=(-1|0))))if((ga|0)==(-1|0)){da=0;I=190;break}else{ea=ga;fa=ha;break}r=c[3047]|0;U=V-ha+r&0-r;if(U>>>0<2147483647)if((dh(U|0)|0)==(-1|0)){dh(_|0)|0;da=0;I=190;break}else{ea=ga;fa=U+ha|0;break}else{ea=ga;fa=ha}}while(0);if((I|0)==190){c[3169]=c[3169]|4;ea=-1;fa=da}cg(12204)|0;ia=ea;ja=fa}else{ia=-1;ja=0}if(aa>>>0<2147483647&(ia|0)==(-1|0)){fg(12204)|0;V=dh(aa|0)|0;ba=dh(0)|0;cg(12204)|0;U=ba-V|0;_=U>>>0>(H+40|0)>>>0;if(V>>>0<ba>>>0&((V|0)!=(-1|0)&(ba|0)!=(-1|0))){ka=_?V:-1;la=_?U:ja;I=194}}else{ka=ia;la=ja;I=194}if((I|0)==194?(ka|0)!=(-1|0):0){U=(c[3166]|0)+la|0;c[3166]=U;if(U>>>0>(c[3167]|0)>>>0)c[3167]=U;U=c[3064]|0;do if(U){_=12708;while(1){ma=c[_>>2]|0;na=_+4|0;oa=c[na>>2]|0;if((ka|0)==(ma+oa|0)){I=205;break}V=c[_+8>>2]|0;if(!V)break;else _=V}if(((I|0)==205?(c[_+12>>2]&8|0)==0:0)?U>>>0<ka>>>0&U>>>0>=ma>>>0:0){c[na>>2]=oa+la;$=U+8|0;V=($&7|0)==0?0:0-$&7;$=U+V|0;ba=(c[3061]|0)+(la-V)|0;c[3064]=$;c[3061]=ba;c[$+4>>2]=ba|1;c[$+ba+4>>2]=40;c[3065]=c[3049];break}ba=c[3062]|0;if(ka>>>0<ba>>>0){c[3062]=ka;pa=ka}else pa=ba;ba=ka+la|0;$=12708;while(1){if((c[$>>2]|0)==(ba|0)){I=213;break}V=c[$+8>>2]|0;if(!V)break;else $=V}if((I|0)==213?(c[$+12>>2]&8|0)==0:0){c[$>>2]=ka;_=$+4|0;c[_>>2]=(c[_>>2]|0)+la;_=ka+8|0;V=ka+((_&7|0)==0?0:0-_&7)|0;_=ba+8|0;r=ba+((_&7|0)==0?0:0-_&7)|0;_=V+H|0;Z=r-V-H|0;c[V+4>>2]=H|3;do if((r|0)!=(U|0)){if((r|0)==(c[3063]|0)){v=(c[3060]|0)+Z|0;c[3060]=v;c[3063]=_;c[_+4>>2]=v|1;c[_+v>>2]=v;break}v=c[r+4>>2]|0;if((v&3|0)==1){W=v&-8;X=v>>>3;f:do if(v>>>0>=256){Y=c[r+24>>2]|0;P=c[r+12>>2]|0;do if((P|0)==(r|0)){N=r+16|0;O=N+4|0;T=c[O>>2]|0;if(!T){S=c[N>>2]|0;if(!S){qa=0;break}else{ra=S;sa=N}}else{ra=T;sa=O}while(1){O=ra+20|0;T=c[O>>2]|0;if(T|0){ra=T;sa=O;continue}O=ra+16|0;T=c[O>>2]|0;if(!T)break;else{ra=T;sa=O}}if(sa>>>0<pa>>>0)$a();else{c[sa>>2]=0;qa=ra;break}}else{O=c[r+8>>2]|0;if(O>>>0<pa>>>0)$a();T=O+12|0;if((c[T>>2]|0)!=(r|0))$a();N=P+8|0;if((c[N>>2]|0)==(r|0)){c[T>>2]=P;c[N>>2]=O;qa=P;break}else $a()}while(0);if(!Y)break;P=c[r+28>>2]|0;O=12536+(P<<2)|0;do if((r|0)!=(c[O>>2]|0))if(Y>>>0>=(c[3062]|0)>>>0){c[Y+16+(((c[Y+16>>2]|0)!=(r|0)&1)<<2)>>2]=qa;if(!qa)break f;else break}else $a();else{c[O>>2]=qa;if(qa|0)break;c[3059]=c[3059]&~(1<<P);break f}while(0);P=c[3062]|0;if(qa>>>0<P>>>0)$a();c[qa+24>>2]=Y;O=r+16|0;N=c[O>>2]|0;do if(N|0)if(N>>>0<P>>>0)$a();else{c[qa+16>>2]=N;c[N+24>>2]=qa;break}while(0);N=c[O+4>>2]|0;if(!N)break;if(N>>>0<(c[3062]|0)>>>0)$a();else{c[qa+20>>2]=N;c[N+24>>2]=qa;break}}else{N=c[r+8>>2]|0;P=c[r+12>>2]|0;Y=12272+(X<<1<<2)|0;do if((N|0)!=(Y|0)){if(N>>>0<pa>>>0)$a();if((c[N+12>>2]|0)==(r|0))break;$a()}while(0);if((P|0)==(N|0)){c[3058]=c[3058]&~(1<<X);break}do if((P|0)==(Y|0))ta=P+8|0;else{if(P>>>0<pa>>>0)$a();O=P+8|0;if((c[O>>2]|0)==(r|0)){ta=O;break}$a()}while(0);c[N+12>>2]=P;c[ta>>2]=N}while(0);ua=r+W|0;va=W+Z|0}else{ua=r;va=Z}X=ua+4|0;c[X>>2]=c[X>>2]&-2;c[_+4>>2]=va|1;c[_+va>>2]=va;X=va>>>3;if(va>>>0<256){v=12272+(X<<1<<2)|0;Y=c[3058]|0;O=1<<X;do if(!(Y&O)){c[3058]=Y|O;wa=v+8|0;xa=v}else{X=v+8|0;T=c[X>>2]|0;if(T>>>0>=(c[3062]|0)>>>0){wa=X;xa=T;break}$a()}while(0);c[wa>>2]=_;c[xa+12>>2]=_;c[_+8>>2]=xa;c[_+12>>2]=v;break}O=va>>>8;do if(!O)ya=0;else{if(va>>>0>16777215){ya=31;break}Y=(O+1048320|0)>>>16&8;W=O<<Y;T=(W+520192|0)>>>16&4;X=W<<T;W=(X+245760|0)>>>16&2;S=14-(T|Y|W)+(X<<W>>>15)|0;ya=va>>>(S+7|0)&1|S<<1}while(0);O=12536+(ya<<2)|0;c[_+28>>2]=ya;v=_+16|0;c[v+4>>2]=0;c[v>>2]=0;v=c[3059]|0;S=1<<ya;if(!(v&S)){c[3059]=v|S;c[O>>2]=_;c[_+24>>2]=O;c[_+12>>2]=_;c[_+8>>2]=_;break}S=va<<((ya|0)==31?0:25-(ya>>>1)|0);v=c[O>>2]|0;while(1){if((c[v+4>>2]&-8|0)==(va|0)){I=280;break}za=v+16+(S>>>31<<2)|0;O=c[za>>2]|0;if(!O){I=277;break}else{S=S<<1;v=O}}if((I|0)==277)if(za>>>0<(c[3062]|0)>>>0)$a();else{c[za>>2]=_;c[_+24>>2]=v;c[_+12>>2]=_;c[_+8>>2]=_;break}else if((I|0)==280){S=v+8|0;O=c[S>>2]|0;W=c[3062]|0;if(O>>>0>=W>>>0&v>>>0>=W>>>0){c[O+12>>2]=_;c[S>>2]=_;c[_+8>>2]=O;c[_+12>>2]=v;c[_+24>>2]=0;break}else $a()}}else{O=(c[3061]|0)+Z|0;c[3061]=O;c[3064]=_;c[_+4>>2]=O|1}while(0);s=V+8|0;break d}_=12708;while(1){Z=c[_>>2]|0;if(Z>>>0<=U>>>0?(Aa=Z+(c[_+4>>2]|0)|0,Aa>>>0>U>>>0):0)break;_=c[_+8>>2]|0}_=Aa+-47|0;V=_+8|0;Z=_+((V&7|0)==0?0:0-V&7)|0;V=U+16|0;_=Z>>>0<V>>>0?U:Z;Z=_+8|0;r=ka+8|0;ba=(r&7|0)==0?0:0-r&7;r=ka+ba|0;$=la+-40-ba|0;c[3064]=r;c[3061]=$;c[r+4>>2]=$|1;c[r+$+4>>2]=40;c[3065]=c[3049];$=_+4|0;c[$>>2]=27;c[Z>>2]=c[3177];c[Z+4>>2]=c[3178];c[Z+8>>2]=c[3179];c[Z+12>>2]=c[3180];c[3177]=ka;c[3178]=la;c[3180]=0;c[3179]=Z;Z=_+24|0;do{r=Z;Z=Z+4|0;c[Z>>2]=7}while((r+8|0)>>>0<Aa>>>0);if((_|0)!=(U|0)){Z=_-U|0;c[$>>2]=c[$>>2]&-2;c[U+4>>2]=Z|1;c[_>>2]=Z;r=Z>>>3;if(Z>>>0<256){ba=12272+(r<<1<<2)|0;O=c[3058]|0;S=1<<r;do if(!(O&S)){c[3058]=O|S;Ba=ba+8|0;Ca=ba}else{r=ba+8|0;W=c[r>>2]|0;if(W>>>0>=(c[3062]|0)>>>0){Ba=r;Ca=W;break}$a()}while(0);c[Ba>>2]=U;c[Ca+12>>2]=U;c[U+8>>2]=Ca;c[U+12>>2]=ba;break}S=Z>>>8;do if(!S)Da=0;else{if(Z>>>0>16777215){Da=31;break}O=(S+1048320|0)>>>16&8;_=S<<O;$=(_+520192|0)>>>16&4;W=_<<$;_=(W+245760|0)>>>16&2;r=14-($|O|_)+(W<<_>>>15)|0;Da=Z>>>(r+7|0)&1|r<<1}while(0);S=12536+(Da<<2)|0;c[U+28>>2]=Da;c[U+20>>2]=0;c[V>>2]=0;ba=c[3059]|0;r=1<<Da;if(!(ba&r)){c[3059]=ba|r;c[S>>2]=U;c[U+24>>2]=S;c[U+12>>2]=U;c[U+8>>2]=U;break}r=Z<<((Da|0)==31?0:25-(Da>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(Z|0)){I=307;break}Ea=ba+16+(r>>>31<<2)|0;S=c[Ea>>2]|0;if(!S){I=304;break}else{r=r<<1;ba=S}}if((I|0)==304)if(Ea>>>0<(c[3062]|0)>>>0)$a();else{c[Ea>>2]=U;c[U+24>>2]=ba;c[U+12>>2]=U;c[U+8>>2]=U;break}else if((I|0)==307){r=ba+8|0;Z=c[r>>2]|0;V=c[3062]|0;if(Z>>>0>=V>>>0&ba>>>0>=V>>>0){c[Z+12>>2]=U;c[r>>2]=U;c[U+8>>2]=Z;c[U+12>>2]=ba;c[U+24>>2]=0;break}else $a()}}}else{Z=c[3062]|0;if((Z|0)==0|ka>>>0<Z>>>0)c[3062]=ka;c[3177]=ka;c[3178]=la;c[3180]=0;c[3067]=c[3045];c[3066]=-1;Z=0;do{r=12272+(Z<<1<<2)|0;c[r+12>>2]=r;c[r+8>>2]=r;Z=Z+1|0}while((Z|0)!=32);Z=ka+8|0;ba=(Z&7|0)==0?0:0-Z&7;Z=ka+ba|0;r=la+-40-ba|0;c[3064]=Z;c[3061]=r;c[Z+4>>2]=r|1;c[Z+r+4>>2]=40;c[3065]=c[3049]}while(0);U=c[3061]|0;if(U>>>0>H>>>0){aa=U-H|0;c[3061]=aa;U=c[3064]|0;r=U+H|0;c[3064]=r;c[r+4>>2]=aa|1;c[U+4>>2]=H|3;s=U+8|0;break}}c[(Ie()|0)>>2]=12;s=0}else s=0}while(0);if(!(c[3169]&2)){g=s;l=b;return g|0}cg(12680)|0;g=s;l=b;return g|0}function Lg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;if(!a)return;b=a+-8|0;if(c[3169]&2|0?fg(12680)|0:0)return;d=c[3062]|0;if(b>>>0<d>>>0)$a();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)$a();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(a|0){i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)$a();if((i|0)==(c[3063]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;p=55;break}c[3060]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;break}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;q=12272+(l<<1<<2)|0;if((h|0)!=(q|0)){if(h>>>0<d>>>0)$a();if((c[h+12>>2]|0)!=(i|0))$a()}if((k|0)==(h|0)){c[3058]=c[3058]&~(1<<l);m=i;n=i;o=j;p=55;break}if((k|0)!=(q|0)){if(k>>>0<d>>>0)$a();q=k+8|0;if((c[q>>2]|0)==(i|0))r=q;else $a()}else r=k+8|0;c[h+12>>2]=k;c[r>>2]=h;m=i;n=i;o=j;p=55;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){q=i+16|0;l=q+4|0;s=c[l>>2]|0;if(!s){t=c[q>>2]|0;if(!t){u=0;break}else{v=t;w=q}}else{v=s;w=l}while(1){l=v+20|0;s=c[l>>2]|0;if(s|0){v=s;w=l;continue}l=v+16|0;s=c[l>>2]|0;if(!s)break;else{v=s;w=l}}if(w>>>0<d>>>0)$a();else{c[w>>2]=0;u=v;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)$a();s=l+12|0;if((c[s>>2]|0)!=(i|0))$a();q=k+8|0;if((c[q>>2]|0)==(i|0)){c[s>>2]=k;c[q>>2]=l;u=k;break}else $a()}while(0);if(h){k=c[i+28>>2]|0;l=12536+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=u;if(!u){c[3059]=c[3059]&~(1<<k);m=i;n=i;o=j;p=55;break a}}else if(h>>>0>=(c[3062]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=u;if(!u){m=i;n=i;o=j;p=55;break a}else break}else $a();while(0);k=c[3062]|0;if(u>>>0<k>>>0)$a();c[u+24>>2]=h;l=i+16|0;q=c[l>>2]|0;do if(q|0)if(q>>>0<k>>>0)$a();else{c[u+16>>2]=q;c[q+24>>2]=u;break}while(0);q=c[l+4>>2]|0;if(q)if(q>>>0<(c[3062]|0)>>>0)$a();else{c[u+20>>2]=q;c[q+24>>2]=u;m=i;n=i;o=j;p=55;break}else{m=i;n=i;o=j;p=55}}else{m=i;n=i;o=j;p=55}}}else{m=b;n=b;o=f;p=55}while(0);do if((p|0)==55){if(m>>>0>=g>>>0)$a();f=g+4|0;b=c[f>>2]|0;if(!(b&1))$a();if(!(b&2)){u=c[3063]|0;if((g|0)==(c[3064]|0)){d=(c[3061]|0)+o|0;c[3061]=d;c[3064]=n;c[n+4>>2]=d|1;if((n|0)!=(u|0))break;c[3063]=0;c[3060]=0;break}if((g|0)==(u|0)){u=(c[3060]|0)+o|0;c[3060]=u;c[3063]=m;c[n+4>>2]=u|1;c[m+u>>2]=u;break}u=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){v=c[g+24>>2]|0;w=c[g+12>>2]|0;do if((w|0)==(g|0)){r=g+16|0;a=r+4|0;e=c[a>>2]|0;if(!e){q=c[r>>2]|0;if(!q){x=0;break}else{y=q;z=r}}else{y=e;z=a}while(1){a=y+20|0;e=c[a>>2]|0;if(e|0){y=e;z=a;continue}a=y+16|0;e=c[a>>2]|0;if(!e)break;else{y=e;z=a}}if(z>>>0<(c[3062]|0)>>>0)$a();else{c[z>>2]=0;x=y;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[3062]|0)>>>0)$a();e=a+12|0;if((c[e>>2]|0)!=(g|0))$a();r=w+8|0;if((c[r>>2]|0)==(g|0)){c[e>>2]=w;c[r>>2]=a;x=w;break}else $a()}while(0);if(v|0){w=c[g+28>>2]|0;a=12536+(w<<2)|0;do if((g|0)==(c[a>>2]|0)){c[a>>2]=x;if(!x){c[3059]=c[3059]&~(1<<w);break b}}else if(v>>>0>=(c[3062]|0)>>>0){c[v+16+(((c[v+16>>2]|0)!=(g|0)&1)<<2)>>2]=x;if(!x)break b;else break}else $a();while(0);w=c[3062]|0;if(x>>>0<w>>>0)$a();c[x+24>>2]=v;a=g+16|0;r=c[a>>2]|0;do if(r|0)if(r>>>0<w>>>0)$a();else{c[x+16>>2]=r;c[r+24>>2]=x;break}while(0);r=c[a+4>>2]|0;if(r|0)if(r>>>0<(c[3062]|0)>>>0)$a();else{c[x+20>>2]=r;c[r+24>>2]=x;break}}}else{r=c[g+8>>2]|0;w=c[g+12>>2]|0;v=12272+(d<<1<<2)|0;if((r|0)!=(v|0)){if(r>>>0<(c[3062]|0)>>>0)$a();if((c[r+12>>2]|0)!=(g|0))$a()}if((w|0)==(r|0)){c[3058]=c[3058]&~(1<<d);break}if((w|0)!=(v|0)){if(w>>>0<(c[3062]|0)>>>0)$a();v=w+8|0;if((c[v>>2]|0)==(g|0))A=v;else $a()}else A=w+8|0;c[r+12>>2]=w;c[A>>2]=r}while(0);c[n+4>>2]=u|1;c[m+u>>2]=u;if((n|0)==(c[3063]|0)){c[3060]=u;break}else B=u}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;B=o}d=B>>>3;if(B>>>0<256){j=12272+(d<<1<<2)|0;i=c[3058]|0;l=1<<d;if(i&l){d=j+8|0;r=c[d>>2]|0;if(r>>>0<(c[3062]|0)>>>0)$a();else{C=d;D=r}}else{c[3058]=i|l;C=j+8|0;D=j}c[C>>2]=n;c[D+12>>2]=n;c[n+8>>2]=D;c[n+12>>2]=j;break}j=B>>>8;if(j)if(B>>>0>16777215)E=31;else{l=(j+1048320|0)>>>16&8;i=j<<l;j=(i+520192|0)>>>16&4;r=i<<j;i=(r+245760|0)>>>16&2;d=14-(j|l|i)+(r<<i>>>15)|0;E=B>>>(d+7|0)&1|d<<1}else E=0;d=12536+(E<<2)|0;c[n+28>>2]=E;c[n+20>>2]=0;c[n+16>>2]=0;i=c[3059]|0;r=1<<E;do if(i&r){l=B<<((E|0)==31?0:25-(E>>>1)|0);j=c[d>>2]|0;while(1){if((c[j+4>>2]&-8|0)==(B|0)){p=126;break}F=j+16+(l>>>31<<2)|0;w=c[F>>2]|0;if(!w){p=123;break}else{l=l<<1;j=w}}if((p|0)==123)if(F>>>0<(c[3062]|0)>>>0)$a();else{c[F>>2]=n;c[n+24>>2]=j;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((p|0)==126){l=j+8|0;a=c[l>>2]|0;w=c[3062]|0;if(a>>>0>=w>>>0&j>>>0>=w>>>0){c[a+12>>2]=n;c[l>>2]=n;c[n+8>>2]=a;c[n+12>>2]=j;c[n+24>>2]=0;break}else $a()}}else{c[3059]=i|r;c[d>>2]=n;c[n+24>>2]=d;c[n+12>>2]=n;c[n+8>>2]=n}while(0);d=(c[3066]|0)+-1|0;c[3066]=d;if(!d){d=12716;while(1){r=c[d>>2]|0;if(!r)break;else d=r+8|0}c[3066]=-1}}while(0);if(!(c[3169]&2))return;cg(12680)|0;return}function Mg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a){d=Kg(b)|0;return d|0}if(b>>>0>4294967231){c[(Ie()|0)>>2]=12;d=0;return d|0}e=b>>>0<11?16:b+11&-8;f=a+-8|0;if(c[3169]&2|0?fg(12680)|0:0){d=0;return d|0}g=Ng(f,e)|0;if(c[3169]&2|0)cg(12680)|0;if(g|0){d=g+8|0;return d|0}g=Kg(b)|0;if(!g){d=0;return d|0}e=c[a+-4>>2]|0;f=(e&-8)-((e&3|0)==0?8:4)|0;Yg(g|0,a|0,(f>>>0<b>>>0?f:b)|0)|0;Lg(a);d=g;return d|0}function Ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a+f|0;h=c[3062]|0;i=e&3;if(!((i|0)!=1&a>>>0>=h>>>0&a>>>0<g>>>0))$a();j=c[g+4>>2]|0;if(!(j&1))$a();if(!i){if(b>>>0<256){k=0;return k|0}if(f>>>0>=(b+4|0)>>>0?(f-b|0)>>>0<=c[3047]<<1>>>0:0){k=a;return k|0}k=0;return k|0}if(f>>>0>=b>>>0){i=f-b|0;if(i>>>0<=15){k=a;return k|0}l=a+b|0;c[d>>2]=e&1|b|2;c[l+4>>2]=i|3;m=l+i+4|0;c[m>>2]=c[m>>2]|1;Og(l,i);k=a;return k|0}if((g|0)==(c[3064]|0)){i=(c[3061]|0)+f|0;l=i-b|0;m=a+b|0;if(i>>>0<=b>>>0){k=0;return k|0}c[d>>2]=e&1|b|2;c[m+4>>2]=l|1;c[3064]=m;c[3061]=l;k=a;return k|0}if((g|0)==(c[3063]|0)){l=(c[3060]|0)+f|0;if(l>>>0<b>>>0){k=0;return k|0}m=l-b|0;i=e&1;if(m>>>0>15){n=a+b|0;o=n+m|0;c[d>>2]=i|b|2;c[n+4>>2]=m|1;c[o>>2]=m;p=o+4|0;c[p>>2]=c[p>>2]&-2;q=n;r=m}else{c[d>>2]=i|l|2;i=a+l+4|0;c[i>>2]=c[i>>2]|1;q=0;r=0}c[3060]=r;c[3063]=q;k=a;return k|0}if(j&2|0){k=0;return k|0}q=(j&-8)+f|0;if(q>>>0<b>>>0){k=0;return k|0}f=q-b|0;r=j>>>3;a:do if(j>>>0>=256){i=c[g+24>>2]|0;l=c[g+12>>2]|0;do if((l|0)==(g|0)){m=g+16|0;n=m+4|0;p=c[n>>2]|0;if(!p){o=c[m>>2]|0;if(!o){s=0;break}else{t=o;u=m}}else{t=p;u=n}while(1){n=t+20|0;p=c[n>>2]|0;if(p|0){t=p;u=n;continue}n=t+16|0;p=c[n>>2]|0;if(!p)break;else{t=p;u=n}}if(u>>>0<h>>>0)$a();else{c[u>>2]=0;s=t;break}}else{n=c[g+8>>2]|0;if(n>>>0<h>>>0)$a();p=n+12|0;if((c[p>>2]|0)!=(g|0))$a();m=l+8|0;if((c[m>>2]|0)==(g|0)){c[p>>2]=l;c[m>>2]=n;s=l;break}else $a()}while(0);if(i|0){l=c[g+28>>2]|0;n=12536+(l<<2)|0;do if((g|0)==(c[n>>2]|0)){c[n>>2]=s;if(!s){c[3059]=c[3059]&~(1<<l);break a}}else if(i>>>0>=(c[3062]|0)>>>0){c[i+16+(((c[i+16>>2]|0)!=(g|0)&1)<<2)>>2]=s;if(!s)break a;else break}else $a();while(0);l=c[3062]|0;if(s>>>0<l>>>0)$a();c[s+24>>2]=i;n=g+16|0;m=c[n>>2]|0;do if(m|0)if(m>>>0<l>>>0)$a();else{c[s+16>>2]=m;c[m+24>>2]=s;break}while(0);m=c[n+4>>2]|0;if(m|0)if(m>>>0<(c[3062]|0)>>>0)$a();else{c[s+20>>2]=m;c[m+24>>2]=s;break}}}else{m=c[g+8>>2]|0;l=c[g+12>>2]|0;i=12272+(r<<1<<2)|0;if((m|0)!=(i|0)){if(m>>>0<h>>>0)$a();if((c[m+12>>2]|0)!=(g|0))$a()}if((l|0)==(m|0)){c[3058]=c[3058]&~(1<<r);break}if((l|0)!=(i|0)){if(l>>>0<h>>>0)$a();i=l+8|0;if((c[i>>2]|0)==(g|0))v=i;else $a()}else v=l+8|0;c[m+12>>2]=l;c[v>>2]=m}while(0);v=e&1;if(f>>>0<16){c[d>>2]=q|v|2;e=a+q+4|0;c[e>>2]=c[e>>2]|1;k=a;return k|0}else{e=a+b|0;c[d>>2]=v|b|2;c[e+4>>2]=f|3;b=e+f+4|0;c[b>>2]=c[b>>2]|1;Og(e,f);k=a;return k|0}return 0}function Og(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=a+b|0;e=c[a+4>>2]|0;a:do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;i=c[3062]|0;if(g>>>0<i>>>0)$a();if((g|0)==(c[3063]|0)){j=d+4|0;k=c[j>>2]|0;if((k&3|0)!=3){l=g;m=h;break}c[3060]=h;c[j>>2]=k&-2;c[g+4>>2]=h|1;c[g+h>>2]=h;return}k=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;j=c[g+12>>2]|0;n=12272+(k<<1<<2)|0;if((f|0)!=(n|0)){if(f>>>0<i>>>0)$a();if((c[f+12>>2]|0)!=(g|0))$a()}if((j|0)==(f|0)){c[3058]=c[3058]&~(1<<k);l=g;m=h;break}if((j|0)!=(n|0)){if(j>>>0<i>>>0)$a();n=j+8|0;if((c[n>>2]|0)==(g|0))o=n;else $a()}else o=j+8|0;c[f+12>>2]=j;c[o>>2]=f;l=g;m=h;break}f=c[g+24>>2]|0;j=c[g+12>>2]|0;do if((j|0)==(g|0)){n=g+16|0;k=n+4|0;p=c[k>>2]|0;if(!p){q=c[n>>2]|0;if(!q){r=0;break}else{s=q;t=n}}else{s=p;t=k}while(1){k=s+20|0;p=c[k>>2]|0;if(p|0){s=p;t=k;continue}k=s+16|0;p=c[k>>2]|0;if(!p)break;else{s=p;t=k}}if(t>>>0<i>>>0)$a();else{c[t>>2]=0;r=s;break}}else{k=c[g+8>>2]|0;if(k>>>0<i>>>0)$a();p=k+12|0;if((c[p>>2]|0)!=(g|0))$a();n=j+8|0;if((c[n>>2]|0)==(g|0)){c[p>>2]=j;c[n>>2]=k;r=j;break}else $a()}while(0);if(f){j=c[g+28>>2]|0;i=12536+(j<<2)|0;do if((g|0)==(c[i>>2]|0)){c[i>>2]=r;if(!r){c[3059]=c[3059]&~(1<<j);l=g;m=h;break a}}else if(f>>>0>=(c[3062]|0)>>>0){c[f+16+(((c[f+16>>2]|0)!=(g|0)&1)<<2)>>2]=r;if(!r){l=g;m=h;break a}else break}else $a();while(0);j=c[3062]|0;if(r>>>0<j>>>0)$a();c[r+24>>2]=f;i=g+16|0;k=c[i>>2]|0;do if(k|0)if(k>>>0<j>>>0)$a();else{c[r+16>>2]=k;c[k+24>>2]=r;break}while(0);k=c[i+4>>2]|0;if(k)if(k>>>0<(c[3062]|0)>>>0)$a();else{c[r+20>>2]=k;c[k+24>>2]=r;l=g;m=h;break}else{l=g;m=h}}else{l=g;m=h}}else{l=a;m=b}while(0);b=c[3062]|0;if(d>>>0<b>>>0)$a();a=d+4|0;r=c[a>>2]|0;if(!(r&2)){s=c[3063]|0;if((d|0)==(c[3064]|0)){t=(c[3061]|0)+m|0;c[3061]=t;c[3064]=l;c[l+4>>2]=t|1;if((l|0)!=(s|0))return;c[3063]=0;c[3060]=0;return}if((d|0)==(s|0)){s=(c[3060]|0)+m|0;c[3060]=s;c[3063]=l;c[l+4>>2]=s|1;c[l+s>>2]=s;return}s=(r&-8)+m|0;t=r>>>3;b:do if(r>>>0>=256){o=c[d+24>>2]|0;e=c[d+12>>2]|0;do if((e|0)==(d|0)){k=d+16|0;j=k+4|0;f=c[j>>2]|0;if(!f){n=c[k>>2]|0;if(!n){u=0;break}else{v=n;w=k}}else{v=f;w=j}while(1){j=v+20|0;f=c[j>>2]|0;if(f|0){v=f;w=j;continue}j=v+16|0;f=c[j>>2]|0;if(!f)break;else{v=f;w=j}}if(w>>>0<b>>>0)$a();else{c[w>>2]=0;u=v;break}}else{j=c[d+8>>2]|0;if(j>>>0<b>>>0)$a();f=j+12|0;if((c[f>>2]|0)!=(d|0))$a();k=e+8|0;if((c[k>>2]|0)==(d|0)){c[f>>2]=e;c[k>>2]=j;u=e;break}else $a()}while(0);if(o|0){e=c[d+28>>2]|0;h=12536+(e<<2)|0;do if((d|0)==(c[h>>2]|0)){c[h>>2]=u;if(!u){c[3059]=c[3059]&~(1<<e);break b}}else if(o>>>0>=(c[3062]|0)>>>0){c[o+16+(((c[o+16>>2]|0)!=(d|0)&1)<<2)>>2]=u;if(!u)break b;else break}else $a();while(0);e=c[3062]|0;if(u>>>0<e>>>0)$a();c[u+24>>2]=o;h=d+16|0;g=c[h>>2]|0;do if(g|0)if(g>>>0<e>>>0)$a();else{c[u+16>>2]=g;c[g+24>>2]=u;break}while(0);g=c[h+4>>2]|0;if(g|0)if(g>>>0<(c[3062]|0)>>>0)$a();else{c[u+20>>2]=g;c[g+24>>2]=u;break}}}else{g=c[d+8>>2]|0;e=c[d+12>>2]|0;o=12272+(t<<1<<2)|0;if((g|0)!=(o|0)){if(g>>>0<b>>>0)$a();if((c[g+12>>2]|0)!=(d|0))$a()}if((e|0)==(g|0)){c[3058]=c[3058]&~(1<<t);break}if((e|0)!=(o|0)){if(e>>>0<b>>>0)$a();o=e+8|0;if((c[o>>2]|0)==(d|0))x=o;else $a()}else x=e+8|0;c[g+12>>2]=e;c[x>>2]=g}while(0);c[l+4>>2]=s|1;c[l+s>>2]=s;if((l|0)==(c[3063]|0)){c[3060]=s;return}else y=s}else{c[a>>2]=r&-2;c[l+4>>2]=m|1;c[l+m>>2]=m;y=m}m=y>>>3;if(y>>>0<256){r=12272+(m<<1<<2)|0;a=c[3058]|0;s=1<<m;if(a&s){m=r+8|0;x=c[m>>2]|0;if(x>>>0<(c[3062]|0)>>>0)$a();else{z=m;A=x}}else{c[3058]=a|s;z=r+8|0;A=r}c[z>>2]=l;c[A+12>>2]=l;c[l+8>>2]=A;c[l+12>>2]=r;return}r=y>>>8;if(r)if(y>>>0>16777215)B=31;else{A=(r+1048320|0)>>>16&8;z=r<<A;r=(z+520192|0)>>>16&4;s=z<<r;z=(s+245760|0)>>>16&2;a=14-(r|A|z)+(s<<z>>>15)|0;B=y>>>(a+7|0)&1|a<<1}else B=0;a=12536+(B<<2)|0;c[l+28>>2]=B;c[l+20>>2]=0;c[l+16>>2]=0;z=c[3059]|0;s=1<<B;if(!(z&s)){c[3059]=z|s;c[a>>2]=l;c[l+24>>2]=a;c[l+12>>2]=l;c[l+8>>2]=l;return}s=y<<((B|0)==31?0:25-(B>>>1)|0);B=c[a>>2]|0;while(1){if((c[B+4>>2]&-8|0)==(y|0)){C=121;break}D=B+16+(s>>>31<<2)|0;a=c[D>>2]|0;if(!a){C=118;break}else{s=s<<1;B=a}}if((C|0)==118){if(D>>>0<(c[3062]|0)>>>0)$a();c[D>>2]=l;c[l+24>>2]=B;c[l+12>>2]=l;c[l+8>>2]=l;return}else if((C|0)==121){C=B+8|0;D=c[C>>2]|0;s=c[3062]|0;if(!(D>>>0>=s>>>0&B>>>0>=s>>>0))$a();c[D+12>>2]=l;c[C>>2]=l;c[l+8>>2]=D;c[l+12>>2]=B;c[l+24>>2]=0;return}}function Pg(){}function Qg(a){a=a|0}function Rg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (D=e,a-c>>>0|0)|0}function Sg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Tg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (D=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function Ug(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;q=q+1|0;c[a>>2]=q;while((f|0)<(e|0)){if(!(c[d+(f<<3)>>2]|0)){c[d+(f<<3)>>2]=q;c[d+((f<<3)+4)>>2]=b;c[d+((f<<3)+8)>>2]=0;D=e;return d|0}f=f+1|0}e=e*2|0;d=Mg(d|0,8*(e+1|0)|0)|0;d=Ug(a|0,b|0,d|0,e|0)|0;D=e;return d|0}function Vg(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function Wg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){f=c[b+(e<<3)>>2]|0;if(!f)break;if((f|0)==(a|0))return c[b+((e<<3)+4)>>2]|0;e=e+1|0}return 0}function Xg(a,b){a=a|0;b=b|0}function Yg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return La(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function Zg(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function _g(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;g=a;h=b;i=h;j=d;k=e;l=k;if(!i){m=(f|0)!=0;if(!l){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (D=n,o)|0}else{if(!m){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return (D=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(V(l|0)|0)-(V(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}r=j-1|0;if(r&j|0){s=(V(j|0)|0)+33-(V(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(f|0){c[f>>2]=r&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (D=n,o)|0}else{r=Zg(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (D=n,o)|0}}else{if(m){if(f|0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (D=n,o)|0}if(!g){if(f|0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (D=n,o)|0}r=l-1|0;if(!(r&l)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=r&i|b&0}n=0;o=i>>>((Zg(l|0)|0)>>>0);return (D=n,o)|0}r=(V(l|0)|0)-(V(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}while(0);if(!t){B=x;C=w;E=v;F=u;G=0;H=0}else{b=d|0|0;d=k|e&0;e=Tg(b|0,d|0,-1,-1)|0;k=D;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Rg(e|0,k|0,g|0,a|0)|0;i=D;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Rg(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&d|0)|0;w=D;u=u-1|0}while((u|0)!=0);B=h;C=x;E=w;F=v;G=0;H=t}t=C;C=0;if(f|0){c[f>>2]=F;c[f+4>>2]=E}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|G;o=(t<<1|0>>>31)&-2|H;return (D=n,o)|0}function $g(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return _g(a,b,c,d,0)|0}function ah(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function bh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f|0;_g(a,b,d,e,g)|0;l=f;return (D=c[g+4>>2]|0,c[g>>2]|0)|0}function ch(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function dh(a){a=a|0;var b=0,d=0,e=0,f=0;a=a+15&-16|0;b=Z()|0;do{e=kb(c,i>>2)|0;f=e+a|0;if((a|0)>0&(f|0)<(e|0)|(f|0)<0|(f|0)>(b|0))_()|0;d=nb(c,i>>2,e|0,f|0)|0}while((d|0)!=(e|0));return e|0}function eh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ub[a&7](b|0,c|0,d|0)|0}function fh(a){a=a|0;return vb[a&1]()|0}function gh(a,b){a=a|0;b=b|0;wb[a&15](b|0)}function hh(a,b,c){a=a|0;b=b|0;c=c|0;xb[a&1](b|0,c|0)}function ih(a,b){a=a|0;b=b|0;return yb[a&7](b|0)|0}function jh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;zb[a&1](b|0,c|0,d|0)}function kh(a){a=a|0;Ab[a&7]()}function lh(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Bb[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function mh(a,b,c){a=a|0;b=b|0;c=c|0;return Cb[a&15](b|0,c|0)|0}function nh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Db[a&3](b|0,c|0,d|0,e|0,f|0)|0}function oh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Eb[a&31](b|0,c|0,d|0,e|0)}function ph(a,b,c){a=a|0;b=b|0;c=c|0;W(0);return 0}function qh(){W(1);return 0}function rh(a){a=a|0;W(2)}function sh(a,b){a=a|0;b=b|0;W(3)}function th(a){a=a|0;W(4);return 0}function uh(a,b,c){a=a|0;b=b|0;c=c|0;W(5)}function vh(){W(6)}function wh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(7)}function xh(a,b){a=a|0;b=b|0;W(8);return 0}function yh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(9);return 0}function zh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(10)}\nfunction Fb(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function Gb(){return l|0}function Hb(a){a=a|0;l=a}function Ib(a,b){a=a|0;b=b|0;l=a;m=b}function Jb(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Kb(a){a=a|0;D=a}function Lb(){return D|0}function Mb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;if((f|0)==10)if((a|0)!=0&(b|0)!=0)if((c[b+4>>2]|0)==5){f=c[b+8>>2]|0;if((!((e&65536|0)!=0&(f&262144|0)==0)?!((e&131072|0)!=0&(f&524288|0)==0):0)?!((f&1|0)==0|(e&262144|0)!=0&(f&1048576|0)==0):0){f=a+8|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a+4>>2]=b;c[a>>2]=c[b>>2];f=a+24|0;c[f>>2]=0;c[a+16>>2]=e;c[a+20>>2]=d;d=Cb[c[b+12>>2]&15](a,0)|0;if(!d)g=0;else{b=c[f>>2]|0;if(!b)h=0;else h=c[b>>2]|0;c[a+12>>2]=h;Pb(a)|0;g=d}}else g=4}else g=3;else{i=8;j=11}else{i=3;j=11}if((j|0)==11)if(!a){k=i;return k|0}else g=i;c[a+8>>2]=g;k=g;return k|0}function Nb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;if(!a){g=8;return g|0}if((b|0)==0^(d|0)!=0){h=c[a+4>>2]|0;if((h|0)!=0?(i=c[a+24>>2]|0,(i|0)!=0):0)j=Db[c[h+32>>2]&3](i,b,d,e,f)|0;else j=1}else j=8;c[a+8>>2]=j;g=j;return g|0}function Ob(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if(!((a|0)!=0&(b|0)!=0)){d=0;return d|0}e=c[a+4>>2]|0;if(!e){d=0;return d|0}f=c[a+24>>2]|0;if(!f){d=0;return d|0}d=Cb[c[e+36>>2]&15](f,b)|0;return d|0}function Pb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if(!a){b=8;return b|0}d=a+4|0;e=c[d>>2]|0;if((e|0)!=0?(f=a+24|0,g=c[f>>2]|0,(g|0)!=0):0){yb[c[e+16>>2]&7](g)|0;c[d>>2]=0;c[a>>2]=0;c[f>>2]=0;h=0}else h=1;c[a+8>>2]=h;b=h;return b|0}function Qb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+16|0;h=g;c[b>>2]=d;d=b+4|0;c[d>>2]=0;if(e|0){c[d>>2]=1;c[h>>2]=f;Ne(b+8|0,79,e,h)|0;a[b+87>>0]=0}if(!(c[b+88>>2]|0)){l=g;return}else wa(b+92|0,c[b>>2]|0)}function Rb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=Tg(a|0,0,3,0)|0;e=Tg(d|0,D|0,b|0,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&e>>>0<2147418113)&((e|0)==(e|0)&(b|0)==0))){f=0;return f|0}b=Kg(e)|0;e=a+-1+(b+4)&0-a;if(!b){f=0;return f|0}c[e+-4>>2]=b;f=e;return f|0}function Sb(a){a=a|0;var b=0,d=0;b=Tg(a|0,0,11,0)|0;a=D;if(!((a>>>0<0|(a|0)==0&b>>>0<2147418113)&((b|0)==(b|0)&(a|0)==0))){d=0;return d|0}a=Kg(b)|0;b=a+4+7&-8;if(!a){d=0;return d|0}c[b+-4>>2]=a;d=b;return d|0}function Tb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if(a|0?(d=S(b,a)|0,e=(a|0)==0,f=$g(2147418112,0,a|0,0)|0,g=D,(e?0:((d>>>0)/((e?1:a)>>>0)|0|0)!=(b|0))|(g>>>0<0|(g|0)==0&f>>>0<b>>>0)):0){h=0;return h|0}f=S(b,a)|0;a=Tg(f|0,0,11,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&a>>>0<2147418113)&((a|0)==(a|0)&(b|0)==0))){h=0;return h|0}b=Kg(a)|0;a=b+4+7&-8;g=a;if(!b){h=0;return h|0}c[g+-4>>2]=b;if(!a){h=0;return h|0}Sg(g|0,0,f|0)|0;h=g;return h|0}function Ub(a){a=a|0;if(!a)return;Lg(c[a+-4>>2]|0);return}function Vb(a){a=a|0;var b=0,d=0;if(!a){b=-1;return b|0}if((c[a+72>>2]|0)>0)Ub(c[a+68>>2]|0);d=a;a=d+120|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(a|0));b=0;return b|0}function Wb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(!a){f=-2;return f|0}g=b+15&-16;h=d+15&-16;i=e<<1;j=g+31+i&-32;k=S(j,h+i|0)|0;i=g>>1;l=h>>1;m=j>>1;n=S(m,l+e|0)|0;o=(n<<1)+k|0;p=a+68|0;q=c[p>>2]|0;if(!q){r=Rb(32,o)|0;c[p>>2]=r;c[a+72>>2]=o;if(!r){f=-1;return f|0}else s=r}else if((c[a+72>>2]|0)<(o|0)){f=-1;return f|0}else s=q;if(e&31|0){f=-3;return f|0}c[a+8>>2]=b;c[a+12>>2]=d;c[a>>2]=g;c[a+4>>2]=h;c[a+16>>2]=j;c[a+28>>2]=(b+1|0)/2|0;c[a+32>>2]=(d+1|0)/2|0;c[a+20>>2]=i;c[a+24>>2]=l;c[a+36>>2]=m;c[a+40>>2]=0;c[a+44>>2]=0;c[a+48>>2]=0;c[a+76>>2]=e;c[a+80>>2]=o;c[a+52>>2]=s+(S(j,e)|0)+e;j=s+k|0;k=(e|0)/2|0;e=S(m,k)|0;c[a+56>>2]=j+e+k;c[a+60>>2]=j+n+e+k;c[a+64>>2]=0;c[a+112>>2]=0;f=0;return f|0}function Xb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!a){f=-2;return f|0}if((c[a+72>>2]|0)>0)Ub(c[a+68>>2]|0);g=a;h=g+120|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));f=Wb(a,b,d,e)|0;return f|0}function Yb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=c[b+76>>2]|0;e=(d|0)/2|0;f=c[b+52>>2]|0;g=c[b+16>>2]|0;h=c[b+8>>2]|0;i=c[b+12>>2]|0;j=d-i+(c[b+4>>2]|0)|0;k=(c[b>>2]|0)+d|0;l=k-h|0;m=k+d|0;k=f+h|0;h=0-d|0;n=f+h|0;if((i|0)>0){o=n;p=k;q=0;r=f;s=k+-1|0;while(1){Sg(o|0,a[r>>0]|0,d|0)|0;Sg(p|0,a[s>>0]|0,l|0)|0;q=q+1|0;if((q|0)==(i|0))break;else{o=o+g|0;p=p+g|0;r=r+g|0;s=s+g|0}}}s=f+(S(i+-1|0,g)|0)+h|0;r=f+(S(i,g)|0)+h|0;if((d|0)>0){i=f+(S(g,h)|0)+h|0;h=0;while(1){Yg(i|0,n|0,m|0)|0;h=h+1|0;if((h|0)==(d|0))break;else i=i+g|0}}if((j|0)>0){i=r;r=0;while(1){Yg(i|0,s|0,m|0)|0;r=r+1|0;if((r|0)==(j|0))break;else i=i+g|0}}g=c[b+56>>2]|0;i=b+36|0;j=c[i>>2]|0;r=b+28|0;m=c[r>>2]|0;s=b+32|0;h=c[s>>2]|0;n=b+24|0;f=e-h+(c[n>>2]|0)|0;p=b+20|0;o=(c[p>>2]|0)+e|0;q=o-m|0;l=o+e|0;o=g+m|0;m=0-e|0;k=g+m|0;if((h|0)>0){t=k;u=o;v=0;w=g;x=o+-1|0;while(1){Sg(t|0,a[w>>0]|0,e|0)|0;Sg(u|0,a[x>>0]|0,q|0)|0;v=v+1|0;if((v|0)==(h|0))break;else{t=t+j|0;u=u+j|0;w=w+j|0;x=x+j|0}}}x=g+(S(h+-1|0,j)|0)+m|0;w=g+(S(h,j)|0)+m|0;h=(d|0)>1;if(h){d=g+(S(j,m)|0)+m|0;g=0;while(1){Yg(d|0,k|0,l|0)|0;g=g+1|0;if((g|0)==(e|0))break;else d=d+j|0}}if((f|0)>0){d=w;w=0;while(1){Yg(d|0,x|0,l|0)|0;w=w+1|0;if((w|0)==(f|0))break;else d=d+j|0}}j=c[b+60>>2]|0;b=c[i>>2]|0;i=c[r>>2]|0;r=c[s>>2]|0;s=e-r+(c[n>>2]|0)|0;n=(c[p>>2]|0)+e|0;p=n-i|0;d=n+e|0;n=j+i|0;i=j+m|0;if((r|0)>0){f=i;w=n;l=0;x=j;g=n+-1|0;while(1){Sg(f|0,a[x>>0]|0,e|0)|0;Sg(w|0,a[g>>0]|0,p|0)|0;l=l+1|0;if((l|0)==(r|0))break;else{f=f+b|0;w=w+b|0;x=x+b|0;g=g+b|0}}}g=j+(S(r+-1|0,b)|0)+m|0;x=j+(S(r,b)|0)+m|0;if(h){h=j+(S(b,m)|0)+m|0;m=0;while(1){Yg(h|0,i|0,d|0)|0;m=m+1|0;if((m|0)==(e|0))break;else h=h+b|0}}if((s|0)>0){y=x;z=0}else return;while(1){Yg(y|0,g|0,d|0)|0;z=z+1|0;if((z|0)==(s|0))break;else y=y+b|0}return}function Zb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+4|0;if((c[d>>2]|0)>0){e=a+16|0;f=b+16|0;g=c[b+52>>2]|0;h=0;i=c[a+52>>2]|0;while(1){Yg(g|0,i|0,c[a>>2]|0)|0;h=h+1|0;if((h|0)>=(c[d>>2]|0))break;else{g=g+(c[f>>2]|0)|0;i=i+(c[e>>2]|0)|0}}}e=a+24|0;if((c[e>>2]|0)<=0){Yb(b);return}i=a+20|0;f=a+36|0;g=b+36|0;d=c[b+56>>2]|0;h=0;j=c[a+56>>2]|0;while(1){Yg(d|0,j|0,c[i>>2]|0)|0;h=h+1|0;k=c[e>>2]|0;if((h|0)>=(k|0))break;else{d=d+(c[g>>2]|0)|0;j=j+(c[f>>2]|0)|0}}if((k|0)<=0){Yb(b);return}k=a+20|0;f=a+36|0;j=b+36|0;g=c[b+60>>2]|0;d=0;h=c[a+60>>2]|0;while(1){Yg(g|0,h|0,c[k>>2]|0)|0;d=d+1|0;if((d|0)>=(c[e>>2]|0))break;else{g=g+(c[j>>2]|0)|0;h=h+(c[f>>2]|0)|0}}Yb(b);return}function _b(){xg(9640,1)|0;return}function $b(){return}function ac(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;Sg(a|0,((d[c+-1>>0]|0)+2+(f<<1)+g|0)>>>2&255|0,4)|0;Sg(a+b|0,(f+2+(g<<1)+h|0)>>>2&255|0,4)|0;Sg(a+(b<<1)|0,(g+2+(h<<1)+i|0)>>>2&255|0,4)|0;Sg(a+(b*3|0)|0,(h+2+i+(i<<1)|0)>>>2&255|0,4)|0;return}function bc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;j=d[e+4>>0]|0;a[b>>0]=((d[e+-1>>0]|0)+2+(f<<1)+g|0)>>>2;a[b+1>>0]=(f+2+(g<<1)+h|0)>>>2;a[b+2>>0]=(g+2+(h<<1)+i|0)>>>2;a[b+3>>0]=(h+2+(i<<1)+j|0)>>>2;j=b+c|0;i=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;a[j>>0]=i;a[j+1>>0]=i>>8;a[j+2>>0]=i>>16;a[j+3>>0]=i>>24;i=b+(c<<1)|0;j=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;a[i>>0]=j;a[i+1>>0]=j>>8;a[i+2>>0]=j>>16;a[i+3>>0]=j>>24;j=b+(c*3|0)|0;c=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;a[j>>0]=c;a[j+1>>0]=c>>8;a[j+2>>0]=c>>16;a[j+3>>0]=c>>24;return}function cc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;e=d[f>>0]|0;g=d[f+1>>0]|0;h=d[f+2>>0]|0;i=a[f+3>>0]|0;f=i&255;a[b>>0]=(e+1+g|0)>>>1;j=(g+1+h|0)>>>1&255;a[b+c>>0]=j;a[b+2>>0]=j;j=(h+1+f|0)>>>1&255;k=c<<1;a[b+k>>0]=j;a[b+(c+2)>>0]=j;a[b+1>>0]=(e+2+(g<<1)+h|0)>>>2;e=(g+2+(h<<1)+f|0)>>>2&255;a[b+(c+1)>>0]=e;a[b+3>>0]=e;e=(h+2+f+(f<<1)|0)>>>2&255;a[b+(k|1)>>0]=e;a[b+(c+3)>>0]=e;e=c*3|0;a[b+(e+3)>>0]=i;a[b+(e+2)>>0]=i;a[b+(e+1)>>0]=i;a[b+e>>0]=i;a[b+(k+2)>>0]=i;a[b+(k+3)>>0]=i;return}function dc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;j=d[e+4>>0]|0;k=d[e+5>>0]|0;l=d[e+6>>0]|0;m=d[e+7>>0]|0;a[b>>0]=(f+1+g|0)>>>1;e=(g+1+h|0)>>>1&255;n=c<<1;a[b+n>>0]=e;a[b+1>>0]=e;e=(h+1+i|0)>>>1&255;a[b+(n|1)>>0]=e;a[b+2>>0]=e;e=(i+1+j|0)>>>1&255;a[b+(n+2)>>0]=e;a[b+3>>0]=e;a[b+(n+3)>>0]=(j+2+(k<<1)+l|0)>>>2;a[b+c>>0]=(f+2+(g<<1)+h|0)>>>2;f=(g+2+(h<<1)+i|0)>>>2&255;g=c*3|0;a[b+g>>0]=f;a[b+(c+1)>>0]=f;f=(h+2+(i<<1)+j|0)>>>2&255;a[b+(g+1)>>0]=f;a[b+(c+2)>>0]=f;f=(i+2+(j<<1)+k|0)>>>2&255;a[b+(g+2)>>0]=f;a[b+(c+3)>>0]=f;a[b+(g+3)>>0]=(k+2+(l<<1)+m|0)>>>2;return}function ec(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;f=d[e+1>>0]|0;g=d[e+2>>0]|0;h=d[e+3>>0]|0;i=d[e+4>>0]|0;j=d[e+5>>0]|0;k=d[e+6>>0]|0;l=d[e+7>>0]|0;a[b>>0]=((d[e>>0]|0)+2+(f<<1)+g|0)>>>2;e=(f+2+(g<<1)+h|0)>>>2&255;a[b+c>>0]=e;a[b+1>>0]=e;e=(g+2+(h<<1)+i|0)>>>2&255;g=c<<1;a[b+g>>0]=e;a[b+(c+1)>>0]=e;a[b+2>>0]=e;e=(h+2+(i<<1)+j|0)>>>2&255;h=c*3|0;a[b+h>>0]=e;a[b+(g|1)>>0]=e;a[b+(c+2)>>0]=e;a[b+3>>0]=e;e=(i+2+(j<<1)+k|0)>>>2&255;a[b+(h+1)>>0]=e;a[b+(g+2)>>0]=e;a[b+(c+3)>>0]=e;e=(j+2+(k<<1)+l|0)>>>2&255;a[b+(h+2)>>0]=e;a[b+(g+3)>>0]=e;a[b+(h+3)>>0]=(k+2+l+(l<<1)|0)>>>2;return}function fc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;f=d[e+-1>>0]|0;j=d[e>>0]|0;k=d[e+1>>0]|0;l=d[e+2>>0]|0;m=d[e+3>>0]|0;e=(f+1+j|0)>>>1&255;n=c<<1;a[b+(n|1)>>0]=e;a[b>>0]=e;e=(j+1+k|0)>>>1&255;a[b+(n+2)>>0]=e;a[b+1>>0]=e;e=(k+1+l|0)>>>1&255;a[b+(n+3)>>0]=e;a[b+2>>0]=e;a[b+3>>0]=(l+1+m|0)>>>1;e=g+2|0;o=c*3|0;a[b+o>>0]=(e+(h<<1)+i|0)>>>2;a[b+n>>0]=((g<<1)+2+h+f|0)>>>2;h=(e+(f<<1)+j|0)>>>2&255;a[b+(o+1)>>0]=h;a[b+c>>0]=h;h=(f+2+(j<<1)+k|0)>>>2&255;a[b+(o+2)>>0]=h;a[b+(c+1)>>0]=h;h=(j+2+(k<<1)+l|0)>>>2&255;a[b+(o+3)>>0]=h;a[b+(c+2)>>0]=h;a[b+(c+3)>>0]=(k+2+(l<<1)+m|0)>>>2;return}function gc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;n=d[e+3>>0]|0;e=c*3|0;a[b+e>>0]=(h+2+(i<<1)+(d[f+3>>0]|0)|0)>>>2;f=g+2|0;o=(f+(h<<1)+i|0)>>>2&255;i=c<<1;a[b+i>>0]=o;a[b+(e+1)>>0]=o;o=((g<<1)+2+h+j|0)>>>2&255;a[b+c>>0]=o;a[b+(i|1)>>0]=o;a[b+(e+2)>>0]=o;o=(f+(j<<1)+k|0)>>>2&255;a[b>>0]=o;a[b+(c+1)>>0]=o;a[b+(i+2)>>0]=o;a[b+(e+3)>>0]=o;o=(j+2+(k<<1)+l|0)>>>2&255;a[b+1>>0]=o;a[b+(c+2)>>0]=o;a[b+(i+3)>>0]=o;o=(k+2+(l<<1)+m|0)>>>2&255;a[b+2>>0]=o;a[b+(c+3)>>0]=o;a[b+3>>0]=(l+2+(m<<1)+n|0)>>>2;return}function hc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[f+3>>0]|0;f=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;e=g+1|0;n=(e+f|0)>>>1&255;a[b+(c+2)>>0]=n;a[b>>0]=n;n=(e+h|0)>>>1&255;e=c<<1;a[b+(e+2)>>0]=n;a[b+c>>0]=n;n=(h+1+i|0)>>>1&255;o=c*3|0;a[b+(o+2)>>0]=n;a[b+e>>0]=n;a[b+o>>0]=(i+1+j|0)>>>1;a[b+3>>0]=(k+2+(l<<1)+m|0)>>>2;a[b+2>>0]=(f+2+(k<<1)+l|0)>>>2;l=g+2|0;m=(l+(f<<1)+k|0)>>>2&255;a[b+(c+3)>>0]=m;a[b+1>>0]=m;m=((g<<1)+2+h+f|0)>>>2&255;a[b+(e+3)>>0]=m;a[b+(c+1)>>0]=m;m=(l+(h<<1)+i|0)>>>2&255;a[b+(o+3)>>0]=m;a[b+(e|1)>>0]=m;a[b+(o+1)>>0]=(h+2+(i<<1)+j|0)>>>2;return}function ic(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=e;e=f;h=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=f+4|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=b+c|0;c=e;a[c>>0]=h;a[c+1>>0]=h>>8;a[c+2>>0]=h>>16;a[c+3>>0]=h>>24;h=e+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;return}function jc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));e=b+c|0;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));return}function kc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;Sg(b|0,a[e>>0]|0,8)|0;d=b+c|0;Sg(d|0,a[e+1>>0]|0,8)|0;b=d+c|0;Sg(b|0,a[e+2>>0]|0,8)|0;d=b+c|0;Sg(d|0,a[e+3>>0]|0,8)|0;b=d+c|0;Sg(b|0,a[e+4>>0]|0,8)|0;d=b+c|0;Sg(d|0,a[e+5>>0]|0,8)|0;b=d+c|0;Sg(b|0,a[e+6>>0]|0,8)|0;Sg(b+c|0,a[e+7>>0]|0,8)|0;return}function lc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;Sg(b|0,a[e>>0]|0,16)|0;d=b+c|0;Sg(d|0,a[e+1>>0]|0,16)|0;b=d+c|0;Sg(b|0,a[e+2>>0]|0,16)|0;d=b+c|0;Sg(d|0,a[e+3>>0]|0,16)|0;b=d+c|0;Sg(b|0,a[e+4>>0]|0,16)|0;d=b+c|0;Sg(d|0,a[e+5>>0]|0,16)|0;b=d+c|0;Sg(b|0,a[e+6>>0]|0,16)|0;d=b+c|0;Sg(d|0,a[e+7>>0]|0,16)|0;b=d+c|0;Sg(b|0,a[e+8>>0]|0,16)|0;d=b+c|0;Sg(d|0,a[e+9>>0]|0,16)|0;b=d+c|0;Sg(b|0,a[e+10>>0]|0,16)|0;d=b+c|0;Sg(d|0,a[e+11>>0]|0,16)|0;b=d+c|0;Sg(b|0,a[e+12>>0]|0,16)|0;d=b+c|0;Sg(d|0,a[e+13>>0]|0,16)|0;b=d+c|0;Sg(b|0,a[e+14>>0]|0,16)|0;Sg(b+c|0,a[e+15>>0]|0,16)|0;return}function mc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=b;b=0;while(1){l=f+b|0;m=(d[l>>0]|0)-g+(d[e>>0]|0)|0;a[k>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[h>>0]|0)|0;a[k+1>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[i>>0]|0)|0;a[k+2>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[j>>0]|0)|0;a[k+3>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;b=b+1|0;if((b|0)==4)break;else k=k+c|0}return}function nc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=e+4|0;l=e+5|0;m=e+6|0;n=e+7|0;o=b;b=0;while(1){p=f+b|0;q=(d[p>>0]|0)-g+(d[e>>0]|0)|0;a[o>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[h>>0]|0)|0;a[o+1>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[i>>0]|0)|0;a[o+2>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[j>>0]|0)|0;a[o+3>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[k>>0]|0)|0;a[o+4>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[l>>0]|0)|0;a[o+5>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[m>>0]|0)|0;a[o+6>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[n>>0]|0)|0;a[o+7>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;b=b+1|0;if((b|0)==8)break;else o=o+c|0}return}function oc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=d[e+-1>>0]|0;h=b;b=0;while(1){i=f+b|0;j=0;do{k=(d[i>>0]|0)-g+(d[e+j>>0]|0)|0;a[h+j>>0]=(k|0)>255?-1:((k|0)>0?k:0)&255;j=j+1|0}while((j|0)!=16);b=b+1|0;if((b|0)==16)break;else h=h+c|0}return}function pc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;c=d;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;c=d+4|0;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;return}function qc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));e=b+c|0;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));return}function rc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))+4|0)/8|0)&255;Sg(a|0,c|0,8)|0;e=a+b|0;Sg(e|0,c|0,8)|0;a=e+b|0;Sg(a|0,c|0,8)|0;e=a+b|0;Sg(e|0,c|0,8)|0;a=e+b|0;Sg(a|0,c|0,8)|0;e=a+b|0;Sg(e|0,c|0,8)|0;a=e+b|0;Sg(a|0,c|0,8)|0;Sg(a+b|0,c|0,8)|0;return}function sc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+15>>0]|0)+((d[e+14>>0]|0)+((d[e+13>>0]|0)+((d[e+12>>0]|0)+((d[e+11>>0]|0)+((d[e+10>>0]|0)+((d[e+9>>0]|0)+((d[e+8>>0]|0)+((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))))))))))+8|0)/16|0)&255;Sg(a|0,c|0,16)|0;e=a+b|0;Sg(e|0,c|0,16)|0;a=e+b|0;Sg(a|0,c|0,16)|0;e=a+b|0;Sg(e|0,c|0,16)|0;a=e+b|0;Sg(a|0,c|0,16)|0;e=a+b|0;Sg(e|0,c|0,16)|0;a=e+b|0;Sg(a|0,c|0,16)|0;e=a+b|0;Sg(e|0,c|0,16)|0;a=e+b|0;Sg(a|0,c|0,16)|0;e=a+b|0;Sg(e|0,c|0,16)|0;a=e+b|0;Sg(a|0,c|0,16)|0;e=a+b|0;Sg(e|0,c|0,16)|0;a=e+b|0;Sg(a|0,c|0,16)|0;e=a+b|0;Sg(e|0,c|0,16)|0;a=e+b|0;Sg(a|0,c|0,16)|0;Sg(a+b|0,c|0,16)|0;return}function tc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))+4|0)/8|0)&255;Sg(a|0,e|0,8)|0;c=a+b|0;Sg(c|0,e|0,8)|0;a=c+b|0;Sg(a|0,e|0,8)|0;c=a+b|0;Sg(c|0,e|0,8)|0;a=c+b|0;Sg(a|0,e|0,8)|0;c=a+b|0;Sg(c|0,e|0,8)|0;a=c+b|0;Sg(a|0,e|0,8)|0;Sg(a+b|0,e|0,8)|0;return}function uc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))))))))))+8|0)/16|0)&255;Sg(a|0,e|0,16)|0;c=a+b|0;Sg(c|0,e|0,16)|0;a=c+b|0;Sg(a|0,e|0,16)|0;c=a+b|0;Sg(c|0,e|0,16)|0;a=c+b|0;Sg(a|0,e|0,16)|0;c=a+b|0;Sg(c|0,e|0,16)|0;a=c+b|0;Sg(a|0,e|0,16)|0;c=a+b|0;Sg(c|0,e|0,16)|0;a=c+b|0;Sg(a|0,e|0,16)|0;c=a+b|0;Sg(c|0,e|0,16)|0;a=c+b|0;Sg(a|0,e|0,16)|0;c=a+b|0;Sg(c|0,e|0,16)|0;a=c+b|0;Sg(a|0,e|0,16)|0;c=a+b|0;Sg(c|0,e|0,16)|0;a=c+b|0;Sg(a|0,e|0,16)|0;Sg(a+b|0,e|0,16)|0;return}function vc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0)+4|0)/8|0)&255;Sg(a|0,f|0,4)|0;e=a+b|0;Sg(e|0,f|0,4)|0;a=e+b|0;Sg(a|0,f|0,4)|0;Sg(a+b|0,f|0,4)|0;return}function wc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0)+8|0)/16|0)&255;Sg(a|0,f|0,8)|0;e=a+b|0;Sg(e|0,f|0,8)|0;a=e+b|0;Sg(a|0,f|0,8)|0;e=a+b|0;Sg(e|0,f|0,8)|0;a=e+b|0;Sg(a|0,f|0,8)|0;e=a+b|0;Sg(e|0,f|0,8)|0;a=e+b|0;Sg(a|0,f|0,8)|0;Sg(a+b|0,f|0,8)|0;return}function xc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0))+(d[e+8>>0]|0))+(d[e+9>>0]|0))+(d[e+10>>0]|0))+(d[e+11>>0]|0))+(d[e+12>>0]|0))+(d[e+13>>0]|0))+(d[e+14>>0]|0))+(d[e+15>>0]|0)+16|0)/32|0)&255;Sg(a|0,f|0,16)|0;e=a+b|0;Sg(e|0,f|0,16)|0;a=e+b|0;Sg(a|0,f|0,16)|0;e=a+b|0;Sg(e|0,f|0,16)|0;a=e+b|0;Sg(a|0,f|0,16)|0;e=a+b|0;Sg(e|0,f|0,16)|0;a=e+b|0;Sg(a|0,f|0,16)|0;e=a+b|0;Sg(e|0,f|0,16)|0;a=e+b|0;Sg(a|0,f|0,16)|0;e=a+b|0;Sg(e|0,f|0,16)|0;a=e+b|0;Sg(a|0,f|0,16)|0;e=a+b|0;Sg(e|0,f|0,16)|0;a=e+b|0;Sg(a|0,f|0,16)|0;e=a+b|0;Sg(e|0,f|0,16)|0;a=e+b|0;Sg(a|0,f|0,16)|0;Sg(a+b|0,f|0,16)|0;return}function yc(){xg(9644,2)|0;return}function zc(){return}function Ac(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=a+1816|0;Vb(e)|0;f=a+1936|0;Vb(f)|0;g=a+2056|0;Vb(g)|0;h=a+2176|0;Vb(h)|0;i=a+2328|0;Vb(i)|0;j=a+5940|0;Ub(c[j>>2]|0);k=a+2520|0;Ub(c[k>>2]|0);c[j>>2]=0;c[k>>2]=0;l=b&15;m=((l|0)==0?0:16-l|0)+b|0;b=d&15;l=((b|0)==0?0:16-b|0)+d|0;d=a+2296|0;c[d>>2]=0;c[a+1932>>2]=0;if(((((((Xb(e,m,l,32)|0)>=0?(b=a+2300|0,c[b>>2]=0,c[a+2052>>2]=0,(Xb(f,m,l,32)|0)>=0):0)?(n=a+2304|0,c[n>>2]=0,c[a+2172>>2]=0,(Xb(g,m,l,32)|0)>=0):0)?(o=a+2308|0,c[o>>2]=0,c[a+2292>>2]=0,(Xb(h,m,l,32)|0)>=0):0)?(c[a+2312>>2]=0,c[a+2316>>2]=1,c[a+2320>>2]=2,c[a+2324>>2]=3,c[d>>2]=1,c[b>>2]=1,c[n>>2]=1,c[o>>2]=1,(Xb(i,m,16,32)|0)>=0):0)?(o=l>>4,c[a+2468>>2]=o,l=m>>4,m=a+2472|0,c[m>>2]=l,c[a+2464>>2]=S(o,l)|0,n=l+1|0,l=a+2476|0,c[l>>2]=n,b=Tb(S(o+1|0,n)|0,76)|0,c[k>>2]=b,b|0):0)?(c[a+2524>>2]=b+((c[l>>2]|0)*76|0)+76,l=Tb((c[m>>2]|0)*9|0,1)|0,c[j>>2]=l,l|0):0){p=0;return p|0}Vb(e)|0;Vb(f)|0;Vb(g)|0;Vb(h)|0;Vb(i)|0;Ub(c[j>>2]|0);Ub(c[k>>2]|0);c[j>>2]=0;c[k>>2]=0;p=1;return p|0}function Bc(a){a=a|0;var b=0,d=0,e=0,f=0;switch(c[a+8184>>2]|0){case 0:{b=0;d=0;e=0;f=0;break}case 1:{b=0;d=1;e=1;f=0;break}case 2:{b=0;d=1;e=0;f=1;break}case 3:{b=1;d=1;e=1;f=1;break}default:{b=0;d=0;e=0;f=0}}c[a+2484>>2]=f;c[a+2532>>2]=e;c[a+2488>>2]=d;c[a+2492>>2]=b;return}function Cc(a){a=a|0;var b=0;Sc(a);Hc(a);Ic(a+7066|0);c[a+2480>>2]=1;c[a+2484>>2]=0;c[a+2532>>2]=0;c[a+2488>>2]=0;c[a+2492>>2]=0;c[a+8188>>2]=0;c[a+1808>>2]=0;b=a+5924|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[a+5912>>2]=0;c[a+5916>>2]=0;return}function Dc(a){a=a|0;var b=0,d=0;Vb(a+1816|0)|0;Vb(a+1936|0)|0;Vb(a+2056|0)|0;Vb(a+2176|0)|0;Vb(a+2328|0)|0;b=a+5940|0;Ub(c[b>>2]|0);d=a+2520|0;Ub(c[d>>2]|0);c[b>>2]=0;c[d>>2]=0;return}function Ec(a,d){a=a|0;d=d|0;var e=0,f=0;e=c[a+4>>2]|0;f=c[a>>2]|0;a=0;do{b[e+(a<<1)>>1]=S(b[d+(a<<1)>>1]|0,b[f+(a<<1)>>1]|0)|0;a=a+1|0}while((a|0)!=16);return}function Fc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=0;do{g=a+(f<<1)|0;b[g>>1]=S(b[g>>1]|0,b[c+(f<<1)>>1]|0)|0;f=f+1|0}while((f|0)!=16);Vc(a,d,e,d,e);e=a;a=e+32|0;do{b[e>>1]=0;e=e+2|0}while((e|0)<(a|0));return}function Gc(a){a=a|0;Yg(a+7085|0,2992,1056)|0;return}function Hc(b){b=b|0;var c=0;c=b+7075|0;a[c>>0]=112;a[c+1>>0]=86;a[c+2>>0]=140;a[c+3>>0]=37;c=b+7079|0;a[c>>0]=a[4052]|0;a[c+1>>0]=a[4053]|0;a[c+2>>0]=a[4054]|0;c=b+7082|0;a[c>>0]=a[5021]|0;a[c+1>>0]=a[5022]|0;a[c+2>>0]=a[5023]|0;return}function Ic(b){b=b|0;var c=0,d=0;c=b;b=4058;d=c+9|0;do{a[c>>0]=a[b>>0]|0;c=c+1|0;b=b+1|0}while((c|0)<(d|0));return}function Jc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=b+16|0;h=d+((c[g>>2]|0)*14|0)|0;d=b+36|0;b=(c[d>>2]|0)*6|0;i=e+b|0;e=f+b|0;b=h+-1|0;f=i+-1|0;j=e+-1|0;a[h>>0]=a[b>>0]|0;a[i>>0]=a[f>>0]|0;a[e>>0]=a[j>>0]|0;a[h+1>>0]=a[b>>0]|0;a[i+1>>0]=a[f>>0]|0;a[e+1>>0]=a[j>>0]|0;a[h+2>>0]=a[b>>0]|0;a[i+2>>0]=a[f>>0]|0;a[e+2>>0]=a[j>>0]|0;a[h+3>>0]=a[b>>0]|0;a[i+3>>0]=a[f>>0]|0;a[e+3>>0]=a[j>>0]|0;j=h+(c[g>>2]|0)|0;g=c[d>>2]|0;d=i+g|0;i=e+g|0;g=j+-1|0;e=d+-1|0;h=i+-1|0;a[j>>0]=a[g>>0]|0;a[d>>0]=a[e>>0]|0;a[i>>0]=a[h>>0]|0;a[j+1>>0]=a[g>>0]|0;a[d+1>>0]=a[e>>0]|0;a[i+1>>0]=a[h>>0]|0;a[j+2>>0]=a[g>>0]|0;a[d+2>>0]=a[e>>0]|0;a[i+2>>0]=a[h>>0]|0;a[j+3>>0]=a[g>>0]|0;a[d+3>>0]=a[e>>0]|0;a[i+3>>0]=a[h>>0]|0;return}function Kc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;k=l;l=l+144|0;m=k;n=f+-4|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=S(d[v+-2>>0]|0,o)|0;e=d[v+-1>>0]|0;w=S(e,p)|0;x=d[v>>0]|0;y=S(x,q)|0;z=d[v+1>>0]|0;A=S(z,r)|0;B=d[v+2>>0]|0;C=S(B,s)|0;D=d[v+3>>0]|0;E=f+64+w+y+A+C+(S(D,t)|0)>>7;c[u>>2]=(E|0)<0?0:(E|0)<255?E:255;E=S(e,o)|0;e=S(x,p)|0;C=S(z,q)|0;A=S(B,r)|0;y=S(D,s)|0;w=v+4|0;f=d[w>>0]|0;F=E+64+e+C+A+y+(S(f,t)|0)>>7;c[u+4>>2]=(F|0)<0?0:(F|0)<255?F:255;F=S(x,o)|0;x=S(z,p)|0;y=S(B,q)|0;A=S(D,r)|0;C=S(f,s)|0;e=d[v+5>>0]|0;E=F+64+x+y+A+C+(S(e,t)|0)>>7;c[u+8>>2]=(E|0)<0?0:(E|0)<255?E:255;E=S(z,o)|0;z=S(B,p)|0;B=S(D,q)|0;D=S(f,r)|0;f=S(e,s)|0;e=E+64+z+B+D+f+(S(d[v+6>>0]|0,t)|0)>>7;c[u+12>>2]=(e|0)<0?0:(e|0)<255?e:255;g=g+1|0;if((g|0)==9)break;else{u=u+16|0;v=w+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=i;i=m+32|0;while(1){m=S(n,c[i+-32>>2]|0)|0;q=S(v,c[i+-16>>2]|0)|0;p=S(u,c[i>>2]|0)|0;o=i;i=i+16|0;w=S(g,c[i>>2]|0)|0;e=S(t,c[o+32>>2]|0)|0;f=m+64+q+p+w+e+(S(s,c[o+48>>2]|0)|0)>>7;a[r>>0]=(f|0)<0?0:((f|0)<255?f:255)&255;f=S(n,c[o+-28>>2]|0)|0;e=S(v,c[o+-12>>2]|0)|0;w=S(u,c[o+4>>2]|0)|0;p=S(g,c[o+20>>2]|0)|0;q=S(t,c[o+36>>2]|0)|0;m=f+64+e+w+p+q+(S(s,c[o+52>>2]|0)|0)>>7;a[r+1>>0]=(m|0)<0?0:((m|0)<255?m:255)&255;m=S(n,c[o+-24>>2]|0)|0;q=S(v,c[o+-8>>2]|0)|0;p=S(u,c[o+8>>2]|0)|0;w=S(g,c[o+24>>2]|0)|0;e=S(t,c[o+40>>2]|0)|0;f=m+64+q+p+w+e+(S(s,c[o+56>>2]|0)|0)>>7;a[r+2>>0]=(f|0)<0?0:((f|0)<255?f:255)&255;f=S(n,c[o+-20>>2]|0)|0;e=S(v,c[o+-4>>2]|0)|0;w=S(u,c[o+12>>2]|0)|0;p=S(g,c[o+28>>2]|0)|0;q=S(t,c[o+44>>2]|0)|0;m=f+64+e+w+p+q+(S(s,c[o+60>>2]|0)|0)>>7;a[r+3>>0]=(m|0)<0?0:((m|0)<255?m:255)&255;h=h+1|0;if((h|0)==4)break;else r=r+j|0}l=k;return}function Lc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;k=l;l=l+832|0;m=k;n=f+-8|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=0;e=v;do{w=S(d[e+-2>>0]|0,o)|0;x=S(d[e+-1>>0]|0,p)|0;y=S(d[e>>0]|0,q)|0;z=e;e=e+1|0;A=S(d[e>>0]|0,r)|0;B=S(d[z+2>>0]|0,s)|0;C=w+64+x+y+A+B+(S(d[z+3>>0]|0,t)|0)>>7;c[u+(f<<2)>>2]=(C|0)<0?0:(C|0)<255?C:255;f=f+1|0}while((f|0)!=8);g=g+1|0;if((g|0)==13)break;else{u=u+32|0;v=v+8+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=i;i=m+64|0;while(1){m=0;q=i;while(1){p=S(n,c[q+-64>>2]|0)|0;o=S(v,c[q+-32>>2]|0)|0;f=S(u,c[q>>2]|0)|0;e=S(g,c[q+32>>2]|0)|0;C=S(t,c[q+64>>2]|0)|0;z=p+64+o+f+e+C+(S(s,c[q+96>>2]|0)|0)>>7;a[r+m>>0]=(z|0)<0?0:((z|0)<255?z:255)&255;m=m+1|0;if((m|0)==8)break;else q=q+4|0}h=h+1|0;if((h|0)==8)break;else{r=r+j|0;i=i+32|0}}l=k;return}function Mc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;k=l;l=l+832|0;m=k;n=f+-8|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=0;e=v;do{w=S(d[e+-2>>0]|0,o)|0;x=S(d[e+-1>>0]|0,p)|0;y=S(d[e>>0]|0,q)|0;z=e;e=e+1|0;A=S(d[e>>0]|0,r)|0;B=S(d[z+2>>0]|0,s)|0;C=w+64+x+y+A+B+(S(d[z+3>>0]|0,t)|0)>>7;c[u+(f<<2)>>2]=(C|0)<0?0:(C|0)<255?C:255;f=f+1|0}while((f|0)!=8);g=g+1|0;if((g|0)==9)break;else{u=u+32|0;v=v+8+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=m+64|0;while(1){q=S(n,c[r+-64>>2]|0)|0;p=S(v,c[r+-32>>2]|0)|0;o=S(u,c[r>>2]|0)|0;f=S(g,c[r+32>>2]|0)|0;e=S(t,c[r+64>>2]|0)|0;C=q+64+p+o+f+e+(S(s,c[r+96>>2]|0)|0)>>7;a[i+h>>0]=(C|0)<0?0:((C|0)<255?C:255)&255;h=h+1|0;if((h|0)==8)break;else r=r+4|0}r=i+j|0;i=0;h=m+96|0;while(1){C=S(n,c[h+-64>>2]|0)|0;e=S(v,c[h+-32>>2]|0)|0;f=S(u,c[h>>2]|0)|0;o=S(g,c[h+32>>2]|0)|0;p=S(t,c[h+64>>2]|0)|0;q=C+64+e+f+o+p+(S(s,c[h+96>>2]|0)|0)>>7;a[r+i>>0]=(q|0)<0?0:((q|0)<255?q:255)&255;i=i+1|0;if((i|0)==8)break;else h=h+4|0}h=r+j|0;r=0;i=m+128|0;while(1){q=S(n,c[i+-64>>2]|0)|0;p=S(v,c[i+-32>>2]|0)|0;o=S(u,c[i>>2]|0)|0;f=S(g,c[i+32>>2]|0)|0;e=S(t,c[i+64>>2]|0)|0;C=q+64+p+o+f+e+(S(s,c[i+96>>2]|0)|0)>>7;a[h+r>>0]=(C|0)<0?0:((C|0)<255?C:255)&255;r=r+1|0;if((r|0)==8)break;else i=i+4|0}i=h+j|0;j=0;h=m+160|0;while(1){m=S(n,c[h+-64>>2]|0)|0;r=S(v,c[h+-32>>2]|0)|0;C=S(u,c[h>>2]|0)|0;e=S(g,c[h+32>>2]|0)|0;f=S(t,c[h+64>>2]|0)|0;o=m+64+r+C+e+f+(S(s,c[h+96>>2]|0)|0)>>7;a[i+j>>0]=(o|0)<0?0:((o|0)<255?o:255)&255;j=j+1|0;if((j|0)==8)break;else h=h+4|0}l=k;return}function Nc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;k=l;l=l+2016|0;m=k;n=f+-16|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=0;e=v;do{w=S(d[e+-2>>0]|0,o)|0;x=S(d[e+-1>>0]|0,p)|0;y=S(d[e>>0]|0,q)|0;z=e;e=e+1|0;A=S(d[e>>0]|0,r)|0;B=S(d[z+2>>0]|0,s)|0;C=w+64+x+y+A+B+(S(d[z+3>>0]|0,t)|0)>>7;c[u+(f<<2)>>2]=(C|0)<0?0:(C|0)<255?C:255;f=f+1|0}while((f|0)!=16);g=g+1|0;if((g|0)==21)break;else{u=u+64|0;v=v+16+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=i;i=m+128|0;while(1){m=0;q=i;while(1){p=S(n,c[q+-128>>2]|0)|0;o=S(v,c[q+-64>>2]|0)|0;f=S(u,c[q>>2]|0)|0;e=S(g,c[q+64>>2]|0)|0;C=S(t,c[q+128>>2]|0)|0;z=p+64+o+f+e+C+(S(s,c[q+192>>2]|0)|0)>>7;a[r+m>>0]=(z|0)<0?0:((z|0)<255?z:255)&255;m=m+1|0;if((m|0)==16)break;else q=q+4|0}h=h+1|0;if((h|0)==16)break;else{r=r+j|0;i=i+64|0}}l=k;return}function Oc(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0;k=l;l=l+544|0;m=k;n=f+-4|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=S(f,d[q>>0]|0)|0;r=d[q+1>>0]|0;b[g>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+2>>0]|0;b[g+2>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+3>>0]|0;b[g+4>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;b[g+6>>1]=(c+64+(S(o,d[q+4>>0]|0)|0)|0)>>>7;p=p+1|0;if((p|0)==5)break;else{g=g+8|0;q=q+4+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=b[m>>1]|0;g=i;i=0;p=m;while(1){m=S(n,h&65535)|0;o=p;p=p+8|0;h=b[p>>1]|0;a[g>>0]=(m+64+(S(q,h&65535)|0)|0)>>>7;m=S(n,e[o+2>>1]|0)|0;a[g+1>>0]=(m+64+(S(q,e[o+10>>1]|0)|0)|0)>>>7;m=S(n,e[o+4>>1]|0)|0;a[g+2>>0]=(m+64+(S(q,e[o+12>>1]|0)|0)|0)>>>7;m=S(n,e[o+6>>1]|0)|0;a[g+3>>0]=(m+64+(S(q,e[o+14>>1]|0)|0)|0)>>>7;i=i+1|0;if((i|0)==4)break;else g=g+j|0}l=k;return}function Pc(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0;k=l;l=l+544|0;m=k;n=f+-8|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=S(f,d[q>>0]|0)|0;r=d[q+1>>0]|0;b[g>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+2>>0]|0;b[g+2>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+3>>0]|0;b[g+4>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+4>>0]|0;b[g+6>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+5>>0]|0;b[g+8>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+6>>0]|0;b[g+10>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=q+7|0;b[g+12>>1]=(c+64+(S(o,d[r>>0]|0)|0)|0)>>>7;c=S(f,d[r>>0]|0)|0;b[g+14>>1]=(c+64+(S(o,d[q+8>>0]|0)|0)|0)>>>7;p=p+1|0;if((p|0)==9)break;else{g=g+16|0;q=q+8+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=i;i=0;g=m;while(1){m=S(n,e[g>>1]|0)|0;p=g;g=g+16|0;a[h>>0]=(m+64+(S(q,e[g>>1]|0)|0)|0)>>>7;m=S(n,e[p+2>>1]|0)|0;a[h+1>>0]=(m+64+(S(q,e[p+18>>1]|0)|0)|0)>>>7;m=S(n,e[p+4>>1]|0)|0;a[h+2>>0]=(m+64+(S(q,e[p+20>>1]|0)|0)|0)>>>7;m=S(n,e[p+6>>1]|0)|0;a[h+3>>0]=(m+64+(S(q,e[p+22>>1]|0)|0)|0)>>>7;m=S(n,e[p+8>>1]|0)|0;a[h+4>>0]=(m+64+(S(q,e[p+24>>1]|0)|0)|0)>>>7;m=S(n,e[p+10>>1]|0)|0;a[h+5>>0]=(m+64+(S(q,e[p+26>>1]|0)|0)|0)>>>7;m=S(n,e[p+12>>1]|0)|0;a[h+6>>0]=(m+64+(S(q,e[p+28>>1]|0)|0)|0)>>>7;m=S(n,e[p+14>>1]|0)|0;a[h+7>>0]=(m+64+(S(q,e[p+30>>1]|0)|0)|0)>>>7;i=i+1|0;if((i|0)==8)break;else h=h+j|0}l=k;return}function Qc(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0;k=l;l=l+544|0;m=k;n=f+-8|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=S(f,d[q>>0]|0)|0;r=d[q+1>>0]|0;b[g>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+2>>0]|0;b[g+2>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+3>>0]|0;b[g+4>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+4>>0]|0;b[g+6>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+5>>0]|0;b[g+8>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+6>>0]|0;b[g+10>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=q+7|0;b[g+12>>1]=(c+64+(S(o,d[r>>0]|0)|0)|0)>>>7;c=S(f,d[r>>0]|0)|0;b[g+14>>1]=(c+64+(S(o,d[q+8>>0]|0)|0)|0)>>>7;p=p+1|0;if((p|0)==5)break;else{g=g+16|0;q=q+8+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=i;i=0;g=m;while(1){m=S(n,e[g>>1]|0)|0;p=g;g=g+16|0;a[h>>0]=(m+64+(S(q,e[g>>1]|0)|0)|0)>>>7;m=S(n,e[p+2>>1]|0)|0;a[h+1>>0]=(m+64+(S(q,e[p+18>>1]|0)|0)|0)>>>7;m=S(n,e[p+4>>1]|0)|0;a[h+2>>0]=(m+64+(S(q,e[p+20>>1]|0)|0)|0)>>>7;m=S(n,e[p+6>>1]|0)|0;a[h+3>>0]=(m+64+(S(q,e[p+22>>1]|0)|0)|0)>>>7;m=S(n,e[p+8>>1]|0)|0;a[h+4>>0]=(m+64+(S(q,e[p+24>>1]|0)|0)|0)>>>7;m=S(n,e[p+10>>1]|0)|0;a[h+5>>0]=(m+64+(S(q,e[p+26>>1]|0)|0)|0)>>>7;m=S(n,e[p+12>>1]|0)|0;a[h+6>>0]=(m+64+(S(q,e[p+28>>1]|0)|0)|0)>>>7;m=S(n,e[p+14>>1]|0)|0;a[h+7>>0]=(m+64+(S(q,e[p+30>>1]|0)|0)|0)>>>7;i=i+1|0;if((i|0)==4)break;else h=h+j|0}l=k;return}function Rc(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=l;l=l+544|0;m=k;n=f+-16|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=0;r=q;do{s=S(f,d[r>>0]|0)|0;r=r+1|0;b[g+(c<<1)>>1]=(s+64+(S(o,d[r>>0]|0)|0)|0)>>>7;c=c+1|0}while((c|0)!=16);p=p+1|0;if((p|0)==17)break;else{g=g+32|0;q=q+16+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=i;i=0;g=m;while(1){m=0;p=g;while(1){o=S(n,e[p>>1]|0)|0;a[h+m>>0]=(o+64+(S(q,e[p+32>>1]|0)|0)|0)>>>7;m=m+1|0;if((m|0)==16)break;else p=p+2|0}i=i+1|0;if((i|0)==16)break;else{h=h+j|0;g=g+32|0}}l=k;return}function Sc(a){a=a|0;var b=0;b=xa(84)|0;c[a+8192>>2]=(b|0)>1?b:1;return}function Tc(c,d,e,f,g){c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=(f<<2)+-16|0;i=e;e=g;g=0;j=c;while(1){if((a[e>>0]|0)>1)Fc(j,d,i,f);else{Wc((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,i,f,i,f);b[j>>1]=0;b[j+2>>1]=0>>>16}c=j+32|0;k=i+4|0;if((a[e+1>>0]|0)>1)Fc(c,d,k,f);else{Wc((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,k,f,k,f);b[c>>1]=0;b[c+2>>1]=0>>>16}c=j+64|0;k=i+8|0;if((a[e+2>>0]|0)>1)Fc(c,d,k,f);else{Wc((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,k,f,k,f);b[c>>1]=0;b[c+2>>1]=0>>>16}c=j+96|0;k=i+12|0;if((a[e+3>>0]|0)>1)Fc(c,d,k,f);else{Wc((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,k,f,k,f);b[c>>1]=0;b[c+2>>1]=0>>>16}g=g+1|0;if((g|0)==4)break;else{i=i+16+h|0;e=e+4|0;j=j+128|0}}return}function Uc(c,d,e,f,g,h){c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=(g<<2)+-8|0;j=c+64|0;if((a[h>>0]|0)>1)Fc(c,d,e,g);else{Wc((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,e,g,e,g);b[c>>1]=0;b[c+2>>1]=0>>>16}k=c+32|0;l=e+4|0;if((a[h+1>>0]|0)>1)Fc(k,d,l,g);else{Wc((S(b[d>>1]|0,b[k>>1]|0)|0)&65535,l,g,l,g);b[k>>1]=0;b[k+2>>1]=0>>>16}k=e+8+i|0;if((a[h+2>>0]|0)>1)Fc(j,d,k,g);else{Wc((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,k,g,k,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=c+96|0;e=k+4|0;if((a[h+3>>0]|0)>1)Fc(j,d,e,g);else{Wc((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,e,g,e,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=c+128|0;e=c+192|0;if((a[h+4>>0]|0)>1)Fc(j,d,f,g);else{Wc((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,f,g,f,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=c+160|0;k=f+4|0;if((a[h+5>>0]|0)>1)Fc(j,d,k,g);else{Wc((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,k,g,k,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=f+8+i|0;if((a[h+6>>0]|0)>1)Fc(e,d,j,g);else{Wc((S(b[d>>1]|0,b[e>>1]|0)|0)&65535,j,g,j,g);b[e>>1]=0;b[e+2>>1]=0>>>16}e=c+224|0;c=j+4|0;if((a[h+7>>0]|0)>1){Fc(e,d,c,g);return}else{Wc((S(b[d>>1]|0,b[e>>1]|0)|0)&65535,c,g,c,g);b[e>>1]=0;b[e+2>>1]=0>>>16;return}}function Vc(c,e,f,g,h){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;i=l;l=l+32|0;j=i;k=b[c>>1]|0;m=b[c+16>>1]|0;n=m+k|0;o=k-m|0;m=b[c+8>>1]|0;k=b[c+24>>1]|0;p=(m*35468>>16)-k-(k*20091>>16)|0;q=(m*20091>>16)+m+(k*35468>>16)|0;b[j>>1]=q+n;b[j+24>>1]=n-q;b[j+8>>1]=p+o;b[j+16>>1]=o-p;p=b[c+2>>1]|0;o=b[c+18>>1]|0;q=o+p|0;n=p-o|0;o=b[c+10>>1]|0;p=b[c+26>>1]|0;k=(o*35468>>16)-p-(p*20091>>16)|0;m=(o*20091>>16)+o+(p*35468>>16)|0;p=m+q&65535;b[j+2>>1]=p;b[j+26>>1]=q-m;b[j+10>>1]=k+n;b[j+18>>1]=n-k;k=b[c+4>>1]|0;n=b[c+20>>1]|0;m=n+k|0;q=k-n|0;n=b[c+12>>1]|0;k=b[c+28>>1]|0;o=(n*35468>>16)-k-(k*20091>>16)|0;r=(n*20091>>16)+n+(k*35468>>16)|0;b[j+4>>1]=r+m;b[j+28>>1]=m-r;b[j+12>>1]=o+q;b[j+20>>1]=q-o;o=b[c+6>>1]|0;q=b[c+22>>1]|0;r=q+o|0;m=o-q|0;q=b[c+14>>1]|0;o=b[c+30>>1]|0;c=(q*35468>>16)-o-(o*20091>>16)|0;k=(q*20091>>16)+q+(o*35468>>16)|0;b[j+6>>1]=k+r;b[j+30>>1]=r-k;b[j+14>>1]=c+m;b[j+22>>1]=m-c;c=p;p=0;m=j;while(1){k=b[m>>1]|0;r=m+4|0;o=b[r>>1]|0;q=c<<16>>16;n=m+6|0;s=b[n>>1]|0;t=(q*35468>>16)-s-(s*20091>>16)|0;u=(q*20091>>16)+q+(s*35468>>16)|0;s=o+k+4|0;b[m>>1]=(s+u|0)>>>3;b[n>>1]=(s-u|0)>>>3;u=k-o+4|0;b[m+2>>1]=(u+t|0)>>>3;b[r>>1]=(u-t|0)>>>3;t=p+1|0;if((t|0)==4){v=g;w=j;x=e;y=0;break}c=b[m+10>>1]|0;p=t;m=m+8|0}while(1){m=(d[x>>0]|0)+(b[w>>1]|0)|0;p=(m|0)>0?m:0;a[v>>0]=(p|0)<255?p:255;p=(d[x+1>>0]|0)+(b[w+2>>1]|0)|0;m=(p|0)>0?p:0;a[v+1>>0]=(m|0)<255?m:255;m=(d[x+2>>0]|0)+(b[w+4>>1]|0)|0;p=(m|0)>0?m:0;a[v+2>>0]=(p|0)<255?p:255;p=(d[x+3>>0]|0)+(b[w+6>>1]|0)|0;m=(p|0)>0?p:0;a[v+3>>0]=(m|0)<255?m:255;y=y+1|0;if((y|0)==4)break;else{v=v+h|0;w=w+8|0;x=x+f|0}}l=i;return}function Wc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=(b<<16>>16)+4>>3;b=(d[c>>0]|0)+h|0;i=(b|0)>0?b:0;a[f>>0]=(i|0)<255?i:255;i=(d[c+1>>0]|0)+h|0;b=(i|0)>0?i:0;a[f+1>>0]=(b|0)<255?b:255;b=(d[c+2>>0]|0)+h|0;i=(b|0)>0?b:0;a[f+2>>0]=(i|0)<255?i:255;i=(d[c+3>>0]|0)+h|0;b=(i|0)>0?i:0;a[f+3>>0]=(b|0)<255?b:255;b=f+g|0;f=c+e|0;c=(d[f>>0]|0)+h|0;i=(c|0)>0?c:0;a[b>>0]=(i|0)<255?i:255;i=(d[f+1>>0]|0)+h|0;c=(i|0)>0?i:0;a[b+1>>0]=(c|0)<255?c:255;c=(d[f+2>>0]|0)+h|0;i=(c|0)>0?c:0;a[b+2>>0]=(i|0)<255?i:255;i=(d[f+3>>0]|0)+h|0;c=(i|0)>0?i:0;a[b+3>>0]=(c|0)<255?c:255;c=b+g|0;b=f+e|0;f=(d[b>>0]|0)+h|0;i=(f|0)>0?f:0;a[c>>0]=(i|0)<255?i:255;i=(d[b+1>>0]|0)+h|0;f=(i|0)>0?i:0;a[c+1>>0]=(f|0)<255?f:255;f=(d[b+2>>0]|0)+h|0;i=(f|0)>0?f:0;a[c+2>>0]=(i|0)<255?i:255;i=(d[b+3>>0]|0)+h|0;f=(i|0)>0?i:0;a[c+3>>0]=(f|0)<255?f:255;f=c+g|0;g=b+e|0;e=(d[g>>0]|0)+h|0;b=(e|0)>0?e:0;a[f>>0]=(b|0)<255?b:255;b=(d[g+1>>0]|0)+h|0;e=(b|0)>0?b:0;a[f+1>>0]=(e|0)<255?e:255;e=(d[g+2>>0]|0)+h|0;b=(e|0)>0?e:0;a[f+2>>0]=(b|0)<255?b:255;b=(d[g+3>>0]|0)+h|0;h=(b|0)>0?b:0;a[f+3>>0]=(h|0)<255?h:255;return}function Xc(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=l;l=l+32|0;e=d;f=b[a>>1]|0;g=b[a+24>>1]|0;h=g+f|0;i=b[a+8>>1]|0;j=b[a+16>>1]|0;k=j+i|0;m=i-j|0;j=f-g|0;b[e>>1]=k+h;g=e+8|0;b[g>>1]=m+j;b[e+16>>1]=h-k;b[e+24>>1]=j-m;m=e+2|0;j=b[a+2>>1]|0;k=b[a+26>>1]|0;h=k+j|0;f=b[a+10>>1]|0;i=b[a+18>>1]|0;n=i+f|0;o=f-i|0;i=j-k|0;k=n+h|0;b[m>>1]=k;b[e+10>>1]=o+i;b[e+18>>1]=h-n;b[e+26>>1]=i-o;o=b[a+4>>1]|0;i=b[a+28>>1]|0;n=i+o|0;h=b[a+12>>1]|0;j=b[a+20>>1]|0;f=j+h|0;p=h-j|0;j=o-i|0;b[e+20>>1]=n-f;b[e+28>>1]=j-p;i=b[a+6>>1]|0;o=b[a+30>>1]|0;h=o+i|0;q=b[a+14>>1]|0;r=b[a+22>>1]|0;a=r+q|0;s=q-r|0;r=i-o|0;o=h-a|0;b[e+22>>1]=o;i=r-s|0;b[e+30>>1]=i;q=b[e>>1]|0;t=a+h<<16>>16;h=k<<16>>16;k=f+n<<16>>16;n=k+h|0;f=h-k|0;k=t+q+3|0;b[e>>1]=(k+n|0)>>>3;h=q-t+3|0;b[m>>1]=(h+f|0)>>>3;b[e+4>>1]=(k-n|0)>>>3;b[e+6>>1]=(h-f|0)>>>3;f=b[g>>1]|0;h=s+r<<16>>16;r=e+10|0;s=b[r>>1]|0;n=p+j<<16>>16;j=n+s|0;p=s-n|0;n=h+f+3|0;s=(n+j|0)>>>3&65535;b[g>>1]=s;g=f-h+3|0;h=(g+p|0)>>>3&65535;b[r>>1]=h;r=(n-j|0)>>>3&65535;b[e+12>>1]=r;j=(g-p|0)>>>3&65535;b[e+14>>1]=j;p=e+16|0;g=b[p>>1]|0;n=o<<16>>16;o=e+18|0;f=b[o>>1]|0;k=e+20|0;m=b[k>>1]|0;t=m+f|0;q=f-m|0;m=n+g+3|0;f=(m+t|0)>>>3&65535;b[p>>1]=f;p=g-n+3|0;n=(p+q|0)>>>3&65535;b[o>>1]=n;o=(m-t|0)>>>3&65535;b[k>>1]=o;k=(p-q|0)>>>3&65535;b[e+22>>1]=k;q=e+24|0;p=b[q>>1]|0;t=i<<16>>16;i=e+26|0;m=b[i>>1]|0;g=e+28|0;a=b[g>>1]|0;u=a+m|0;v=m-a|0;a=t+p+3|0;m=(a+u|0)>>>3&65535;b[q>>1]=m;q=p-t+3|0;t=(q+v|0)>>>3&65535;b[i>>1]=t;i=(a-u|0)>>>3&65535;b[g>>1]=i;g=(q-v|0)>>>3&65535;b[e+30>>1]=g;b[c>>1]=b[e>>1]|0;b[c+32>>1]=b[e+2>>1]|0;b[c+64>>1]=b[e+4>>1]|0;b[c+96>>1]=b[e+6>>1]|0;b[c+128>>1]=s;b[c+160>>1]=h;b[c+192>>1]=r;b[c+224>>1]=j;b[c+256>>1]=f;b[c+288>>1]=n;b[c+320>>1]=o;b[c+352>>1]=k;b[c+384>>1]=m;b[c+416>>1]=t;b[c+448>>1]=i;b[c+480>>1]=g;l=d;return}function Yc(a,c){a=a|0;c=c|0;var d=0;d=((b[a>>1]|0)+3|0)>>>3&65535;b[c>>1]=d;b[c+32>>1]=d;b[c+64>>1]=d;b[c+96>>1]=d;b[c+128>>1]=d;b[c+160>>1]=d;b[c+192>>1]=d;b[c+224>>1]=d;b[c+256>>1]=d;b[c+288>>1]=d;b[c+320>>1]=d;b[c+352>>1]=d;b[c+384>>1]=d;b[c+416>>1]=d;b[c+448>>1]=d;b[c+480>>1]=d;return}function Zc(){xg(9648,3)|0;return}function _c(){return}function $c(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=b+5896|0;e=c[d>>2]|0;f=(e|0)>0;g=f&1;h=(e|0)>4&1;i=9-e|0;if(f){f=0;do{e=f>>g>>h;j=(e|0)>(i|0)?i:e;e=(j|0)>1?j:1;Sg(b+4592+(f<<4)|0,e&255|0,16)|0;j=f<<1;Sg(b+3568+(f<<4)|0,e+j&255|0,16)|0;Sg(b+2544+(f<<4)|0,j+4+e&255|0,16)|0;f=f+1|0}while((f|0)!=64)}else{f=0;do{i=f>>g>>h;e=(i|0)>1?i:1;Sg(b+4592+(f<<4)|0,e&255|0,16)|0;i=f<<1;Sg(b+3568+(f<<4)|0,e+i&255|0,16)|0;Sg(b+2544+(f<<4)|0,i+4+e&255|0,16)|0;f=f+1|0}while((f|0)!=64)}c[b+5892>>2]=c[d>>2];d=0;do{do if((d|0)<=39)if((d|0)>19){a[b+5744+d>>0]=1;k=2;break}else{f=(d|0)>14&1;a[b+5744+d>>0]=f;k=f;break}else{a[b+5744+d>>0]=2;k=3}while(0);a[b+5808+d>>0]=k;d=d+1|0}while((d|0)!=64);c[b+5872>>2]=16843009;a[b+5876>>0]=0;a[b+5879>>0]=1;a[b+5877>>0]=2;a[b+5878>>0]=2;a[b+5880>>0]=2;a[b+5881>>0]=3;d=b+5616|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;d=b+5632|0;c[d>>2]=16843009;c[d+4>>2]=16843009;c[d+8>>2]=16843009;c[d+12>>2]=16843009;d=b+5648|0;c[d>>2]=33686018;c[d+4>>2]=33686018;c[d+8>>2]=33686018;c[d+12>>2]=33686018;d=b+5664|0;c[d>>2]=50529027;c[d+4>>2]=50529027;c[d+8>>2]=50529027;c[d+12>>2]=50529027;return}function ad(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=b+5892|0;g=b+5896|0;h=c[g>>2]|0;if((c[f>>2]|0)!=(h|0)){i=(h|0)>0;j=i&1;k=(h|0)>4&1;l=9-h|0;if(i){i=0;do{h=i>>j>>k;m=(h|0)>(l|0)?l:h;h=(m|0)>1?m:1;Sg(b+4592+(i<<4)|0,h&255|0,16)|0;m=i<<1;Sg(b+3568+(i<<4)|0,h+m&255|0,16)|0;Sg(b+2544+(i<<4)|0,m+4+h&255|0,16)|0;i=i+1|0}while((i|0)!=64)}else{i=0;do{l=i>>j>>k;h=(l|0)>1?l:1;Sg(b+4592+(i<<4)|0,h&255|0,16)|0;l=i<<1;Sg(b+3568+(i<<4)|0,h+l&255|0,16)|0;Sg(b+2544+(i<<4)|0,l+4+h&255|0,16)|0;i=i+1|0}while((i|0)!=64)}c[f>>2]=c[g>>2]}g=d+3148|0;f=d+3163|0;i=d+3169|0;k=d+3177|0;j=d+3151|0;h=d+3178|0;l=d+3170|0;m=d+3179|0;n=d+3180|0;o=d+3171|0;p=d+3172|0;q=0;do{if(!(a[g>>0]|0))r=e;else{s=(a[d+3159+q>>0]|0)+((a[j>>0]|0)==1?0:e)|0;r=(s|0)>0?((s|0)<63?s:63):0}if(!(a[f>>0]|0))Sg(b+5680+(q<<4)|0,r&255|0,16)|0;else{s=(a[i>>0]|0)+r|0;t=s+(a[k>>0]|0)|0;a[b+5680+(q<<4)>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;a[b+5680+(q<<4)+1>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=(a[l>>0]|0)+r|0;t=s+(a[h>>0]|0)|0;a[b+5680+(q<<4)+5>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[m>>0]|0)|0;a[b+5680+(q<<4)+6>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[n>>0]|0)|0;a[b+5680+(q<<4)+7>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=(a[o>>0]|0)+r|0;s=t+(a[h>>0]|0)|0;a[b+5680+(q<<4)+9>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=t+(a[m>>0]|0)|0;a[b+5680+(q<<4)+10>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=t+(a[n>>0]|0)|0;a[b+5680+(q<<4)+11>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=(a[p>>0]|0)+r|0;t=s+(a[h>>0]|0)|0;a[b+5680+(q<<4)+13>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[m>>0]|0)|0;a[b+5680+(q<<4)+14>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[n>>0]|0)|0;a[b+5680+(q<<4)+15>>0]=(t|0)>0?((t|0)<63?t:63)&255:0}q=q+1|0}while((q|0)!=4);return}function bd(b,e,f,g,h,i,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;m=l;l=l+16|0;n=m;o=c[b+2452>>2]|0;p=b+2472|0;if((c[p>>2]|0)<=0){l=m;return}q=n+4|0;r=n+8|0;s=n+12|0;if((f|0)>0){t=0;u=e;v=j;w=k;x=i}else{f=0;y=e;e=j;j=k;k=i;while(1){i=a[y>>0]|0;z=i&255;switch(i<<24>>24){case 9:case 4:{A=0;break}default:A=(a[y+9>>0]|0)!=0}i=a[(d[b+5872+z>>0]|0)+(b+5680+(d[y+11>>0]<<4)+(d[y+2>>0]<<2))>>0]|0;z=i&255;if(i<<24>>24){i=d[b+5744+(o<<6)+z>>0]|0;c[n>>2]=b+2544+(z<<4);c[q>>2]=b+3568+(z<<4);c[r>>2]=b+4592+(z<<4);c[s>>2]=b+5616+(i<<4);if((f|0)>0)ld(k,e,j,g,h,n);if(!A){od(k,e,j,g,h,n);md(k,e,j,g,h,n)}}f=f+1|0;if((f|0)>=(c[p>>2]|0))break;else{y=y+76|0;e=e+8|0;j=j+8|0;k=k+16|0}}l=m;return}while(1){k=a[u>>0]|0;j=k&255;switch(k<<24>>24){case 9:case 4:{B=0;break}default:B=(a[u+9>>0]|0)!=0}k=a[(d[b+5872+j>>0]|0)+(b+5680+(d[u+11>>0]<<4)+(d[u+2>>0]<<2))>>0]|0;j=k&255;do if(k<<24>>24){e=d[b+5744+(o<<6)+j>>0]|0;c[n>>2]=b+2544+(j<<4);c[q>>2]=b+3568+(j<<4);c[r>>2]=b+4592+(j<<4);c[s>>2]=b+5616+(e<<4);if((t|0)>0)ld(x,v,w,g,h,n);if(B){kd(x,v,w,g,h,n);break}else{od(x,v,w,g,h,n);kd(x,v,w,g,h,n);md(x,v,w,g,h,n);break}}while(0);t=t+1|0;if((t|0)>=(c[p>>2]|0))break;else{u=u+76|0;v=v+8|0;w=w+8|0;x=x+16|0}}l=m;return}function cd(b,e,f,g,h,i,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;k=b+2472|0;if((c[k>>2]|0)<=0)return;if((f|0)>0){l=0;m=e;n=i}else{f=0;j=e;e=i;while(1){i=a[j>>0]|0;h=i&255;switch(i<<24>>24){case 9:case 4:{o=0;break}default:o=(a[j+9>>0]|0)!=0}i=a[(d[b+5872+h>>0]|0)+(b+5680+(d[j+11>>0]<<4)+(d[j+2>>0]<<2))>>0]|0;h=i&255;if(i<<24>>24){if((f|0)>0)jd(e,g,b+2544+(h<<4)|0);if(!o){i=b+3568+(h<<4)|0;pd(e,g,i);nd(e,g,i)}}f=f+1|0;if((f|0)>=(c[k>>2]|0))break;else{j=j+76|0;e=e+16|0}}return}while(1){e=a[m>>0]|0;j=e&255;switch(e<<24>>24){case 9:case 4:{p=0;break}default:p=(a[m+9>>0]|0)!=0}e=a[(d[b+5872+j>>0]|0)+(b+5680+(d[m+11>>0]<<4)+(d[m+2>>0]<<2))>>0]|0;j=e&255;do if(e<<24>>24){if((l|0)>0)jd(n,g,b+2544+(j<<4)|0);if(p){id(n,g,b+2544+(j<<4)|0);break}else{f=b+3568+(j<<4)|0;pd(n,g,f);id(n,g,b+2544+(j<<4)|0);nd(n,g,f);break}}while(0);l=l+1|0;if((l|0)>=(c[k>>2]|0))break;else{m=m+76|0;n=n+16|0}}return}function dd(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;i=S(c,-4)|0;j=S(c,-3)|0;k=S(c,-2)|0;l=0-c|0;m=c<<1;n=c*3|0;o=0-m|0;p=h<<3;h=0;q=b;while(1){b=q+l|0;r=a[b>>0]|0;s=a[q>>0]|0;t=q+c|0;u=a[t>>0]|0;v=d[q+j>>0]|0;w=(d[q+i>>0]|0)-v|0;x=d[f>>0]|0;y=d[q+k>>0]|0;z=v-y|0;v=r&255;A=y-v|0;B=(A|0)>-1?A:0-A|0;A=u&255;C=s&255;D=A-C|0;E=(D|0)>-1?D:0-D|0;D=d[q+m>>0]|0;F=D-A|0;G=(d[q+n>>0]|0)-D|0;D=v-C|0;C=y-A|0;A=d[g>>0]|0;y=(B|0)>(A|0)|(E|0)>(A|0);A=q+o|0;v=(a[A>>0]^-128)<<24>>24;H=(u^-128)<<24>>24;u=v-H|0;I=(u|0)>-128?u:-128;u=(s^-128)<<24>>24;s=(r^-128)<<24>>24;r=(y?((I|0)<127?I:127)<<24>>24:0)+((u-s|0)*3|0)|0;I=(r|0)>-128?r:-128;r=(((((C|0)>-1?C:0-C|0)|0)/2|0)+(((D|0)>-1?D:0-D|0)<<1)|0)>(d[e>>0]|0|0)|(((((w|0)>-1?w:0-w|0)|0)>(x|0)?1:(((z|0)>-1?z:0-z|0)|0)>(x|0))|(B|0)>(x|0)|(E|0)>(x|0)|(((F|0)>-1?F:0-F|0)|0)>(x|0)|(((G|0)>-1?G:0-G|0)|0)>(x|0))?0:((I|0)<127?I:127)<<24>>24;I=r+4|0;x=(I|0)>-128?I:-128;I=r+3|0;r=(I|0)>-128?I:-128;I=((x|0)<127?x:127)<<24>>27;x=u-I|0;u=(x|0)>-128?x:-128;a[q>>0]=((u|0)<127?u:127)&255^-128;u=(((r|0)<127?r:127)<<24>>27)+s|0;s=(u|0)>-128?u:-128;a[b>>0]=((s|0)<127?s:127)&255^-128;s=((I+1|0)>>>1&(y?0:255))<<24>>24;y=H-s|0;H=(y|0)>-128?y:-128;a[t>>0]=((H|0)<127?H:127)&255^-128;H=s+v|0;v=(H|0)>-128?H:-128;a[A>>0]=((v|0)<127?v:127)&255^-128;h=h+1|0;if((h|0)>=(p|0))break;else q=q+1|0}return}function ed(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;i=h<<3;if((c|0)!=1){h=0;j=b;while(1){k=j+-2|0;l=a[k>>0]|0;m=j+-1|0;n=a[m>>0]|0;o=a[j>>0]|0;p=j+1|0;q=a[p>>0]|0;r=d[j+-3>>0]|0;s=(d[j+-4>>0]|0)-r|0;t=d[f>>0]|0;u=l&255;v=r-u|0;r=n&255;w=u-r|0;x=(w|0)>-1?w:0-w|0;w=q&255;y=o&255;z=w-y|0;A=(z|0)>-1?z:0-z|0;z=d[j+2>>0]|0;B=z-w|0;C=(d[j+3>>0]|0)-z|0;z=r-y|0;y=u-w|0;w=d[g>>0]|0;u=(x|0)>(w|0)|(A|0)>(w|0);w=(l^-128)<<24>>24;l=(q^-128)<<24>>24;q=w-l|0;r=(q|0)>-128?q:-128;q=(o^-128)<<24>>24;o=(n^-128)<<24>>24;n=(u?((r|0)<127?r:127)<<24>>24:0)+((q-o|0)*3|0)|0;r=(n|0)>-128?n:-128;n=(((((y|0)>-1?y:0-y|0)|0)/2|0)+(((z|0)>-1?z:0-z|0)<<1)|0)>(d[e>>0]|0|0)|(((((s|0)>-1?s:0-s|0)|0)>(t|0)?1:(((v|0)>-1?v:0-v|0)|0)>(t|0))|(x|0)>(t|0)|(A|0)>(t|0)|(((B|0)>-1?B:0-B|0)|0)>(t|0)|(((C|0)>-1?C:0-C|0)|0)>(t|0))?0:((r|0)<127?r:127)<<24>>24;r=n+4|0;t=(r|0)>-128?r:-128;r=n+3|0;n=(r|0)>-128?r:-128;r=((t|0)<127?t:127)<<24>>27;t=q-r|0;q=(t|0)>-128?t:-128;a[j>>0]=((q|0)<127?q:127)&255^-128;q=(((n|0)<127?n:127)<<24>>27)+o|0;o=(q|0)>-128?q:-128;a[m>>0]=((o|0)<127?o:127)&255^-128;o=((r+1|0)>>>1&(u?0:255))<<24>>24;u=l-o|0;l=(u|0)>-128?u:-128;a[p>>0]=((l|0)<127?l:127)&255^-128;l=o+w|0;w=(l|0)>-128?l:-128;a[k>>0]=((w|0)<127?w:127)&255^-128;h=h+1|0;if((h|0)>=(i|0))break;else j=j+c|0}return}j=0;h=b;w=a[b>>0]|0;while(1){b=h+-2|0;k=a[b>>0]|0;l=h+-1|0;o=a[l>>0]|0;p=h+1|0;u=a[p>>0]|0;r=d[h+-3>>0]|0;m=(d[h+-4>>0]|0)-r|0;q=d[f>>0]|0;n=k&255;t=r-n|0;r=o&255;C=n-r|0;B=(C|0)>-1?C:0-C|0;C=u&255;A=w&255;x=C-A|0;v=(x|0)>-1?x:0-x|0;x=d[h+2>>0]|0;s=x-C|0;z=(d[h+3>>0]|0)-x|0;x=r-A|0;A=n-C|0;C=d[g>>0]|0;n=(B|0)>(C|0)|(v|0)>(C|0);C=(k^-128)<<24>>24;k=(u^-128)<<24>>24;u=C-k|0;r=(u|0)>-128?u:-128;u=(w^-128)<<24>>24;y=(o^-128)<<24>>24;o=(n?((r|0)<127?r:127)<<24>>24:0)+((u-y|0)*3|0)|0;r=(o|0)>-128?o:-128;o=(((((A|0)>-1?A:0-A|0)|0)/2|0)+(((x|0)>-1?x:0-x|0)<<1)|0)>(d[e>>0]|0|0)|(((((m|0)>-1?m:0-m|0)|0)>(q|0)?1:(((t|0)>-1?t:0-t|0)|0)>(q|0))|(B|0)>(q|0)|(v|0)>(q|0)|(((s|0)>-1?s:0-s|0)|0)>(q|0)|(((z|0)>-1?z:0-z|0)|0)>(q|0))?0:((r|0)<127?r:127)<<24>>24;r=o+4|0;q=(r|0)>-128?r:-128;r=o+3|0;o=(r|0)>-128?r:-128;r=((q|0)<127?q:127)<<24>>27;q=u-r|0;u=(q|0)>-128?q:-128;a[h>>0]=((u|0)<127?u:127)&255^-128;u=(((o|0)<127?o:127)<<24>>27)+y|0;y=(u|0)>-128?u:-128;a[l>>0]=((y|0)<127?y:127)&255^-128;y=((r+1|0)>>>1&(n?0:255))<<24>>24;n=k-y|0;k=(n|0)>-128?n:-128;w=((k|0)<127?k:127)&255^-128;a[p>>0]=w;p=y+C|0;C=(p|0)>-128?p:-128;a[b>>0]=((C|0)<127?C:127)&255^-128;j=j+1|0;if((j|0)>=(i|0))break;else h=h+c|0}return}function fd(a,b,c,e,f,g){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;h=S(b,-4)|0;i=S(b,-3)|0;j=S(b,-2)|0;k=0-b|0;l=b<<1;m=b*3|0;n=0-m|0;o=0-l|0;p=g<<3;g=0;q=a;while(1){a=q+k|0;r=q+b|0;s=q+l|0;t=d[q+i>>0]|0;u=(d[q+h>>0]|0)-t|0;v=d[e>>0]|0;w=d[q+j>>0]|0;x=t-w|0;t=d[a>>0]|0;y=w-t|0;z=(y|0)>-1?y:0-y|0;y=d[r>>0]|0;A=d[q>>0]|0;B=y-A|0;C=(B|0)>-1?B:0-B|0;B=d[s>>0]|0;D=B-y|0;E=(d[q+m>>0]|0)-B|0;B=t-A|0;A=w-y|0;y=d[f>>0]|0;gd((((((((A|0)>-1?A:0-A|0)|0)/2|0)+(((B|0)>-1?B:0-B|0)<<1)|0)>(d[c>>0]|0|0)|(((((u|0)>-1?u:0-u|0)|0)>(v|0)?1:(((x|0)>-1?x:0-x|0)|0)>(v|0))|(z|0)>(v|0)|(C|0)>(v|0)|(((D|0)>-1?D:0-D|0)|0)>(v|0)|(((E|0)>-1?E:0-E|0)|0)>(v|0)))^1)<<31>>31,((z|0)>(y|0)|(C|0)>(y|0))<<31>>31,q+n|0,q+o|0,a,q,r,s);g=g+1|0;if((g|0)>=(p|0))break;else q=q+1|0}return}function gd(b,c,d,e,f,g,h,i){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=a[d>>0]^-128;k=a[i>>0]^-128;l=(a[e>>0]^-128)<<24>>24;m=(a[h>>0]^-128)<<24>>24;n=l-m|0;o=(n|0)>-128?n:-128;n=(a[g>>0]^-128)<<24>>24;p=(a[f>>0]^-128)<<24>>24;q=(((o|0)<127?o:127)<<24>>24)+((n-p|0)*3|0)|0;o=(q|0)>-128?q:-128;q=c&255;c=(((o|0)<127?o:127)&255&b)<<24>>24;b=(c&q)<<24>>24;o=b+4|0;r=(o|0)>-128?o:-128;o=b+3|0;b=(o|0)>-128?o:-128;o=n-(((r|0)<127?r:127)<<24>>27)|0;r=(o|0)>-128?o:-128;o=(((b|0)<127?b:127)<<24>>27)+p|0;p=(o|0)>-128?o:-128;o=(c&(q^255))<<24>>24;q=(o*27|0)+63>>7;c=(q|0)>-128?q:-128;q=((c|0)<127?c:127)<<24>>24;c=(((r|0)<127?r:127)<<24>>24)-q|0;r=(c|0)>-128?c:-128;a[g>>0]=((r|0)<127?r:127)&255^-128;r=(((p|0)<127?p:127)<<24>>24)+q|0;q=(r|0)>-128?r:-128;a[f>>0]=((q|0)<127?q:127)&255^-128;q=(o*18|0)+63>>7;f=(q|0)>-128?q:-128;q=((f|0)<127?f:127)<<24>>24;f=m-q|0;m=(f|0)>-128?f:-128;a[h>>0]=((m|0)<127?m:127)&255^-128;m=q+l|0;l=(m|0)>-128?m:-128;a[e>>0]=((l|0)<127?l:127)&255^-128;l=(o*9|0)+63>>7;o=(l|0)>-128?l:-128;l=((o|0)<127?o:127)<<24>>24;o=(k<<24>>24)-l|0;k=(o|0)>-128?o:-128;a[i>>0]=((k|0)<127?k:127)&255^-128;k=l+(j<<24>>24)|0;j=(k|0)>-128?k:-128;a[d>>0]=((j|0)<127?j:127)&255^-128;return}function hd(a,b,c,e,f,g){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;h=g<<3;g=0;i=a;while(1){a=i+-3|0;j=i+-2|0;k=i+-1|0;l=i+1|0;m=i+2|0;n=d[a>>0]|0;o=(d[i+-4>>0]|0)-n|0;p=d[e>>0]|0;q=d[j>>0]|0;r=n-q|0;n=d[k>>0]|0;s=q-n|0;t=(s|0)>-1?s:0-s|0;s=d[l>>0]|0;u=d[i>>0]|0;v=s-u|0;w=(v|0)>-1?v:0-v|0;v=d[m>>0]|0;x=v-s|0;y=(d[i+3>>0]|0)-v|0;v=n-u|0;u=q-s|0;s=d[f>>0]|0;gd((((((((u|0)>-1?u:0-u|0)|0)/2|0)+(((v|0)>-1?v:0-v|0)<<1)|0)>(d[c>>0]|0|0)|(((((o|0)>-1?o:0-o|0)|0)>(p|0)?1:(((r|0)>-1?r:0-r|0)|0)>(p|0))|(t|0)>(p|0)|(w|0)>(p|0)|(((x|0)>-1?x:0-x|0)|0)>(p|0)|(((y|0)>-1?y:0-y|0)|0)>(p|0)))^1)<<31>>31,((t|0)>(s|0)|(w|0)>(s|0))<<31>>31,a,j,k,i,l,m);g=g+1|0;if((g|0)>=(h|0))break;else i=i+b|0}return}function id(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=S(c,-2)|0;g=0-c|0;h=0-(c<<1)|0;i=0;j=b;while(1){b=j+g|0;k=a[b>>0]|0;l=a[j>>0]|0;m=a[j+c>>0]|0;n=(k&255)-(l&255)|0;o=(d[j+f>>0]|0)-(m&255)|0;p=((a[j+h>>0]^-128)<<24>>24)-((m^-128)<<24>>24)|0;m=(p|0)>-128?p:-128;p=(l^-128)<<24>>24;l=(k^-128)<<24>>24;k=(((m|0)<127?m:127)<<24>>24)+((p-l|0)*3|0)|0;m=(k|0)>-128?k:-128;k=(((((o|0)>-1?o:0-o|0)|0)/2|0)+(((n|0)>-1?n:0-n|0)<<1)|0)<=(d[e>>0]|0|0)?((m|0)<127?m:127)<<24>>24:0;m=k+4|0;n=(m|0)>-128?m:-128;m=p-(((n|0)<127?n:127)<<24>>27)|0;n=(m|0)>-128?m:-128;a[j>>0]=((n|0)<127?n:127)&255^-128;n=k+3|0;k=(n|0)>-128?n:-128;n=(((k|0)<127?k:127)<<24>>27)+l|0;l=(n|0)>-128?n:-128;a[b>>0]=((l|0)<127?l:127)&255^-128;i=i+1|0;if((i|0)==16)break;else j=j+1|0}return}function jd(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((c|0)!=1){f=0;g=b;while(1){h=a[g+-2>>0]|0;i=g+-1|0;j=a[i>>0]|0;k=a[g>>0]|0;l=a[g+1>>0]|0;m=(j&255)-(k&255)|0;n=(h&255)-(l&255)|0;o=((h^-128)<<24>>24)-((l^-128)<<24>>24)|0;l=(o|0)>-128?o:-128;o=(k^-128)<<24>>24;k=(j^-128)<<24>>24;j=(((l|0)<127?l:127)<<24>>24)+((o-k|0)*3|0)|0;l=(j|0)>-128?j:-128;j=(((((n|0)>-1?n:0-n|0)|0)/2|0)+(((m|0)>-1?m:0-m|0)<<1)|0)<=(d[e>>0]|0|0)?((l|0)<127?l:127)<<24>>24:0;l=j+4|0;m=(l|0)>-128?l:-128;l=o-(((m|0)<127?m:127)<<24>>27)|0;m=(l|0)>-128?l:-128;a[g>>0]=((m|0)<127?m:127)&255^-128;m=j+3|0;j=(m|0)>-128?m:-128;m=(((j|0)<127?j:127)<<24>>27)+k|0;k=(m|0)>-128?m:-128;a[i>>0]=((k|0)<127?k:127)&255^-128;f=f+1|0;if((f|0)==16)break;else g=g+c|0}return}g=0;f=b;k=a[b+-1>>0]|0;while(1){b=a[f+-2>>0]|0;i=a[f>>0]|0;m=a[f+1>>0]|0;j=(k&255)-(i&255)|0;l=(b&255)-(m&255)|0;o=((b^-128)<<24>>24)-((m^-128)<<24>>24)|0;m=(o|0)>-128?o:-128;o=(i^-128)<<24>>24;i=(k^-128)<<24>>24;b=(((m|0)<127?m:127)<<24>>24)+((o-i|0)*3|0)|0;m=(b|0)>-128?b:-128;b=(((((l|0)>-1?l:0-l|0)|0)/2|0)+(((j|0)>-1?j:0-j|0)<<1)|0)<=(d[e>>0]|0|0)?((m|0)<127?m:127)<<24>>24:0;m=b+4|0;j=(m|0)>-128?m:-128;m=o-(((j|0)<127?j:127)<<24>>27)|0;j=(m|0)>-128?m:-128;k=((j|0)<127?j:127)&255^-128;a[f>>0]=k;j=b+3|0;b=(j|0)>-128?j:-128;j=(((b|0)<127?b:127)<<24>>27)+i|0;i=(j|0)>-128?j:-128;a[f+-1>>0]=((i|0)<127?i:127)&255^-128;g=g+1|0;if((g|0)==16)break;else f=f+c|0}return}function kd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=g+8|0;i=g+12|0;fd(a,e,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,2);if(b|0)fd(b,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);if(!d)return;fd(d,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);return}function ld(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=g+8|0;i=g+12|0;hd(a,e,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,2);if(b|0)hd(b,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);if(!d)return;hd(d,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);return}function md(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=g+4|0;i=g+8|0;j=g+12|0;dd(a+(e<<2)|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);dd(a+(e<<3)|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);dd(a+(e*12|0)|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);if(b|0)dd(b+(f<<2)|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);if(!d)return;dd(d+(f<<2)|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);return}function nd(a,b,c){a=a|0;b=b|0;c=c|0;id(a+(b<<2)|0,b,c);id(a+(b<<3)|0,b,c);id(a+(b*12|0)|0,b,c);return}function od(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=g+4|0;i=g+8|0;j=g+12|0;ed(a+4|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);ed(a+8|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);ed(a+12|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);if(b|0)ed(b+4|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);if(!d)return;ed(d+4|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);return}function pd(a,b,c){a=a|0;b=b|0;c=c|0;jd(a+4|0,b,c);jd(a+8|0,b,c);jd(a+12|0,b,c);return}function qd(a){a=a|0;var b=0,d=0;c[a+2152>>2]=a;c[a+2180>>2]=a+4;c[a+2208>>2]=a+8;c[a+2236>>2]=a+12;c[a+2264>>2]=a+64;c[a+2292>>2]=a+68;c[a+2320>>2]=a+72;c[a+2348>>2]=a+76;c[a+2376>>2]=a+128;c[a+2404>>2]=a+132;c[a+2432>>2]=a+136;c[a+2460>>2]=a+140;c[a+2488>>2]=a+192;c[a+2516>>2]=a+196;c[a+2544>>2]=a+200;c[a+2572>>2]=a+204;c[a+2600>>2]=a+256;c[a+2628>>2]=a+260;c[a+2656>>2]=a+288;c[a+2684>>2]=a+292;c[a+2712>>2]=a+320;c[a+2740>>2]=a+324;c[a+2768>>2]=a+352;c[a+2796>>2]=a+356;b=0;do{d=b<<4;c[a+2144+(b*28|0)>>2]=a+384+(d<<1);c[a+2144+(b*28|0)+4>>2]=a+1184+(d<<1);c[a+2144+(b*28|0)+20>>2]=a+1984+b;b=b+1|0}while((b|0)!=25);return}function rd(a){a=a|0;var b=0,d=0;c[a+2160>>2]=0;c[a+2188>>2]=4;c[a+2216>>2]=8;c[a+2244>>2]=12;b=c[a+2984>>2]|0;d=b<<2;c[a+2272>>2]=d;c[a+2300>>2]=d+4;c[a+2328>>2]=d+8;c[a+2356>>2]=d+12;d=b<<3;c[a+2384>>2]=d;c[a+2412>>2]=d|4;c[a+2440>>2]=d+8;c[a+2468>>2]=d+12;d=b*12|0;c[a+2496>>2]=d;c[a+2524>>2]=d+4;c[a+2552>>2]=d+8;c[a+2580>>2]=d+12;c[a+2608>>2]=0;c[a+2720>>2]=0;c[a+2636>>2]=4;c[a+2748>>2]=4;d=c[a+3004>>2]<<2;c[a+2664>>2]=d;c[a+2776>>2]=d;b=d+4|0;c[a+2692>>2]=b;c[a+2804>>2]=b;return}function sd(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;return c[504+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0}function td(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;return c[504+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]<<1|0}function ud(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;a=c[504+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0;return ((a|0)<132?a:132)|0}function vd(a){a=a|0;return c[1016+(((a|0)>127?127:(a|0)>0?a:0)<<2)>>2]|0}function wd(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;a=(c[1016+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0)*101581>>16;return ((a|0)>8?a:8)|0}function xd(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;return c[1016+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0}function yd(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=c[b+2900>>2]|0;k=c[b+2864>>2]|0;l=c[b+3088>>2]|0;m=c[l+4>>2]|0;n=m&65535;o=m>>>16&65535;do if(!(a[l+10>>0]|0)){p=n;q=o}else{r=m>>16;s=c[b+3184>>2]|0;if((r|0)>=(s+-152|0)){t=c[b+3188>>2]|0;if((r|0)>(t+144|0)){u=t+128|0;v=6}else w=o}else{u=s+-128|0;v=6}if((v|0)==6)w=u&65535;s=m<<16>>16;t=c[b+3192>>2]|0;if((s|0)<(t+-152|0))x=t+-128|0;else{t=c[b+3196>>2]|0;if((s|0)<=(t+144|0)){p=n;q=w;break}x=t+128|0}p=x&65535;q=w}while(0);w=p<<16>>16;x=q<<16>>16;n=j+(S(w>>3,k)|0)+(x>>3)|0;if(!(((q&65535)<<16|p&65535)&458759)){p=e;q=n;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=n+k|0;u=e+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));p=m+h|0;q=v+k|0;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0))}else Bb[c[b+3212>>2]&15](n,k,x&7,w&7,e,h);h=c[b+2844>>2]|0;e=h&(((((w>>31|1)+w&65535)<<16>>16)/2|0)&65535);w=(((x>>31|1)+x<<16>>16|0)/2|0)&65535&h;h=k>>1;k=w<<16;x=(S(e<<16>>19,h)|0)+(k>>19)|0;n=(c[b+2904>>2]|0)+x|0;q=(c[b+2908>>2]|0)+x|0;if(!((k|e)&458759)){k=n;x=k;p=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=k+4|0;k=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=f;j=x;a[j>>0]=p;a[j+1>>0]=p>>8;a[j+2>>0]=p>>16;a[j+3>>0]=p>>24;p=x+4|0;a[p>>0]=k;a[p+1>>0]=k>>8;a[p+2>>0]=k>>16;a[p+3>>0]=k>>24;k=n+h|0;p=f+i|0;x=k;j=x;v=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=x+4|0;x=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=p;m=j;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=j+4|0;a[v>>0]=x;a[v+1>>0]=x>>8;a[v+2>>0]=x>>16;a[v+3>>0]=x>>24;x=k+h|0;k=p+i|0;p=x;v=p;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p+4|0;p=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k;m=v;a[m>>0]=j;a[m+1>>0]=j>>8;a[m+2>>0]=j>>16;a[m+3>>0]=j>>24;j=v+4|0;a[j>>0]=p;a[j+1>>0]=p>>8;a[j+2>>0]=p>>16;a[j+3>>0]=p>>24;p=x+h|0;x=k+i|0;k=p;j=k;v=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=k+4|0;k=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=x;m=j;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=j+4|0;a[v>>0]=k;a[v+1>>0]=k>>8;a[v+2>>0]=k>>16;a[v+3>>0]=k>>24;k=p+h|0;p=x+i|0;x=k;v=x;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x+4|0;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p;m=v;a[m>>0]=j;a[m+1>>0]=j>>8;a[m+2>>0]=j>>16;a[m+3>>0]=j>>24;j=v+4|0;a[j>>0]=x;a[j+1>>0]=x>>8;a[j+2>>0]=x>>16;a[j+3>>0]=x>>24;x=k+h|0;k=p+i|0;p=x;j=p;v=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=p+4|0;p=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=k;m=j;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=j+4|0;a[v>>0]=p;a[v+1>>0]=p>>8;a[v+2>>0]=p>>16;a[v+3>>0]=p>>24;p=x+h|0;x=k+i|0;k=p;v=k;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k+4|0;k=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x;m=v;a[m>>0]=j;a[m+1>>0]=j>>8;a[m+2>>0]=j>>16;a[m+3>>0]=j>>24;j=v+4|0;a[j>>0]=k;a[j+1>>0]=k>>8;a[j+2>>0]=k>>16;a[j+3>>0]=k>>24;k=p+h|0;p=k;j=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=k+4|0;k=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=x+i|0;x=p;a[x>>0]=j;a[x+1>>0]=j>>8;a[x+2>>0]=j>>16;a[x+3>>0]=j>>24;j=p+4|0;a[j>>0]=k;a[j+1>>0]=k>>8;a[j+2>>0]=k>>16;a[j+3>>0]=k>>24;k=q;j=k;p=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=k+4|0;k=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=g;x=j;a[x>>0]=p;a[x+1>>0]=p>>8;a[x+2>>0]=p>>16;a[x+3>>0]=p>>24;p=j+4|0;a[p>>0]=k;a[p+1>>0]=k>>8;a[p+2>>0]=k>>16;a[p+3>>0]=k>>24;k=q+h|0;p=g+i|0;j=k;x=j;v=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=j+4|0;j=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=p;m=x;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=x+4|0;a[v>>0]=j;a[v+1>>0]=j>>8;a[v+2>>0]=j>>16;a[v+3>>0]=j>>24;j=k+h|0;k=p+i|0;p=j;v=p;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p+4|0;p=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k;m=v;a[m>>0]=x;a[m+1>>0]=x>>8;a[m+2>>0]=x>>16;a[m+3>>0]=x>>24;x=v+4|0;a[x>>0]=p;a[x+1>>0]=p>>8;a[x+2>>0]=p>>16;a[x+3>>0]=p>>24;p=j+h|0;j=k+i|0;k=p;x=k;v=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=k+4|0;k=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=j;m=x;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=x+4|0;a[v>>0]=k;a[v+1>>0]=k>>8;a[v+2>>0]=k>>16;a[v+3>>0]=k>>24;k=p+h|0;p=j+i|0;j=k;v=j;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=j+4|0;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p;m=v;a[m>>0]=x;a[m+1>>0]=x>>8;a[m+2>>0]=x>>16;a[m+3>>0]=x>>24;x=v+4|0;a[x>>0]=j;a[x+1>>0]=j>>8;a[x+2>>0]=j>>16;a[x+3>>0]=j>>24;j=k+h|0;k=p+i|0;p=j;x=p;v=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=p+4|0;p=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=k;m=x;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=x+4|0;a[v>>0]=p;a[v+1>>0]=p>>8;a[v+2>>0]=p>>16;a[v+3>>0]=p>>24;p=j+h|0;j=k+i|0;k=p;v=k;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k+4|0;k=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=j;m=v;a[m>>0]=x;a[m+1>>0]=x>>8;a[m+2>>0]=x>>16;a[m+3>>0]=x>>24;x=v+4|0;a[x>>0]=k;a[x+1>>0]=k>>8;a[x+2>>0]=k>>16;a[x+3>>0]=k>>24;k=p+h|0;p=k;x=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=k+4|0;k=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=j+i|0;j=p;a[j>>0]=x;a[j+1>>0]=x>>8;a[j+2>>0]=x>>16;a[j+3>>0]=x>>24;x=p+4|0;a[x>>0]=k;a[x+1>>0]=k>>8;a[x+2>>0]=k>>16;a[x+3>>0]=k>>24;return}else{k=b+3208|0;b=w&7;w=e&7;Bb[c[k>>2]&15](n,h,b,w,f,i);Bb[c[k>>2]&15](q,h,b,w,g,i);return}}function zd(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;f=e+3088|0;if((a[c[f>>2]>>0]|0)!=9){yd(e,c[e+3020>>2]|0,c[e+3024>>2]|0,c[e+3028>>2]|0,c[e+2984>>2]|0,c[e+3004>>2]|0);return}g=e+2844|0;h=e+3184|0;i=e+3188|0;j=e+3192|0;k=e+3196|0;l=0;do{m=l<<3;n=l<<1;o=n+16|0;p=n+20|0;n=0;do{q=(n<<1)+m|0;r=c[f>>2]|0;s=q|1;t=q+4|0;u=q+5|0;v=(b[r+12+(s<<2)>>1]|0)+(b[r+12+(q<<2)>>1]|0)+(b[r+12+(t<<2)>>1]|0)+(b[r+12+(u<<2)>>1]|0)|0;r=(((v>>31<<3|4)+v|0)/8|0)&c[g>>2];v=e+2144+((o+n|0)*28|0)+24|0;b[v>>1]=r;w=c[f>>2]|0;x=(b[w+12+(s<<2)+2>>1]|0)+(b[w+12+(q<<2)+2>>1]|0)+(b[w+12+(t<<2)+2>>1]|0)+(b[w+12+(u<<2)+2>>1]|0)|0;u=(((x>>31<<3|4)+x|0)/8|0)&c[g>>2];x=v+2|0;b[x>>1]=u;if(a[w+10>>0]|0){w=u<<16;u=c[h>>2]|0;t=(w>>15|0)<(u+-152|0)?u+-128>>1:w>>16;w=c[i>>2]|0;b[x>>1]=(t<<16>>15|0)>(w+144|0)?(w+128|0)>>>1:t;t=r<<16;r=c[j>>2]|0;w=(t>>15|0)<(r+-152|0)?r+-128>>1:t>>16;t=c[k>>2]|0;b[v>>1]=(w<<16>>15|0)>(t+144|0)?(t+128|0)>>>1:w}c[e+2144+((p+n|0)*28|0)+24>>2]=c[v>>2];n=n+1|0}while((n|0)!=2);l=l+1|0}while((l|0)!=2);l=c[e+3020>>2]|0;g=c[e+2900>>2]|0;n=c[f>>2]|0;p=e+2984|0;a:do if((d[n+8>>0]|0)<3){o=c[p>>2]|0;m=e+2168|0;v=c[n+12>>2]|0;c[m>>2]=v;w=e+2224|0;t=c[n+20>>2]|0;c[w>>2]=t;r=e+2392|0;x=c[n+44>>2]|0;c[r>>2]=x;u=e+2448|0;q=c[n+52>>2]|0;c[u>>2]=q;s=v>>>16&65535;y=v&65535;do if(!(a[n+10>>0]|0)){z=y;A=s}else{B=m+2|0;C=v>>16;D=c[h>>2]|0;E=D+-152|0;if((C|0)>=(E|0)){F=c[i>>2]|0;if((C|0)>(F+144|0)){G=F+128|0;H=16}else I=s}else{G=D+-128|0;H=16}if((H|0)==16){F=G&65535;b[B>>1]=F;I=F}F=v<<16>>16;B=c[j>>2]|0;C=B+-152|0;if((F|0)>=(C|0)){J=c[k>>2]|0;if((F|0)>(J+144|0)){K=J+128|0;H=21}else L=y}else{K=B+-128|0;H=21}if((H|0)==21){J=K&65535;b[m>>1]=J;L=J}J=w+2|0;F=t>>16;if((F|0)>=(E|0)){M=c[i>>2]|0;if((F|0)>(M+144|0)){N=M+128|0;H=26}}else{N=D+-128|0;H=26}if((H|0)==26)b[J>>1]=N;J=t<<16>>16;if((J|0)>=(C|0)){M=c[k>>2]|0;if((J|0)>(M+144|0)){O=M+128|0;H=31}}else{O=B+-128|0;H=31}if((H|0)==31)b[w>>1]=O;M=r+2|0;J=x>>16;if((J|0)>=(E|0)){F=c[i>>2]|0;if((J|0)>(F+144|0)){P=F+128|0;H=36}}else{P=D+-128|0;H=36}if((H|0)==36)b[M>>1]=P;M=x<<16>>16;if((M|0)>=(C|0)){F=c[k>>2]|0;if((M|0)>(F+144|0)){Q=F+128|0;H=41}}else{Q=B+-128|0;H=41}if((H|0)==41)b[r>>1]=Q;F=u+2|0;M=q>>16;if((M|0)>=(E|0)){E=c[i>>2]|0;if((M|0)>(E+144|0)){R=E+128|0;H=46}}else{R=D+-128|0;H=46}if((H|0)==46)b[F>>1]=R;F=q<<16>>16;if((F|0)<(C|0))T=B+-128|0;else{B=c[k>>2]|0;if((F|0)<=(B+144|0)){z=L;A=I;break}T=B+128|0}b[u>>1]=T;z=L;A=I}while(0);q=c[e+2160>>2]|0;x=l+q|0;t=z<<16>>16;m=A<<16>>16;y=g+q+(S(t>>3,o)|0)+(m>>3)|0;if(!((z|A)&7)){q=y;v=q;s=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=q+4|0;q=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x;B=v;a[B>>0]=s;a[B+1>>0]=s>>8;a[B+2>>0]=s>>16;a[B+3>>0]=s>>24;s=v+4|0;a[s>>0]=q;a[s+1>>0]=q>>8;a[s+2>>0]=q>>16;a[s+3>>0]=q>>24;q=y+o|0;s=x+o|0;v=q;B=v;F=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=v+4|0;v=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=s;C=B;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=B+4|0;a[F>>0]=v;a[F+1>>0]=v>>8;a[F+2>>0]=v>>16;a[F+3>>0]=v>>24;v=q+o|0;q=s+o|0;s=v;F=s;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=s+4|0;s=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q;C=F;a[C>>0]=B;a[C+1>>0]=B>>8;a[C+2>>0]=B>>16;a[C+3>>0]=B>>24;B=F+4|0;a[B>>0]=s;a[B+1>>0]=s>>8;a[B+2>>0]=s>>16;a[B+3>>0]=s>>24;s=v+o|0;v=q+o|0;q=s;B=q;F=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=q+4|0;q=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=v;C=B;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=B+4|0;a[F>>0]=q;a[F+1>>0]=q>>8;a[F+2>>0]=q>>16;a[F+3>>0]=q>>24;q=s+o|0;s=v+o|0;v=q;F=v;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v+4|0;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=s;C=F;a[C>>0]=B;a[C+1>>0]=B>>8;a[C+2>>0]=B>>16;a[C+3>>0]=B>>24;B=F+4|0;a[B>>0]=v;a[B+1>>0]=v>>8;a[B+2>>0]=v>>16;a[B+3>>0]=v>>24;v=q+o|0;q=s+o|0;s=v;B=s;F=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=s+4|0;s=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=q;C=B;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=B+4|0;a[F>>0]=s;a[F+1>>0]=s>>8;a[F+2>>0]=s>>16;a[F+3>>0]=s>>24;s=v+o|0;v=q+o|0;q=s;F=q;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q+4|0;q=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v;C=F;a[C>>0]=B;a[C+1>>0]=B>>8;a[C+2>>0]=B>>16;a[C+3>>0]=B>>24;B=F+4|0;a[B>>0]=q;a[B+1>>0]=q>>8;a[B+2>>0]=q>>16;a[B+3>>0]=q>>24;q=s+o|0;s=q;B=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;s=q+4|0;q=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;s=v+o|0;v=s;a[v>>0]=B;a[v+1>>0]=B>>8;a[v+2>>0]=B>>16;a[v+3>>0]=B>>24;B=s+4|0;a[B>>0]=q;a[B+1>>0]=q>>8;a[B+2>>0]=q>>16;a[B+3>>0]=q>>24}else Bb[c[e+3208>>2]&15](y,o,m&7,t&7,x,o);x=c[e+2216>>2]|0;t=l+x|0;m=b[w>>1]|0;y=m<<16>>16;q=g+x+(S(y>>3,o)|0)|0;x=b[w+2>>1]|0;B=x<<16>>16;s=q+(B>>3)|0;if(!((x|m)&7)){m=s;x=m;q=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=m+4|0;m=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=t;v=x;a[v>>0]=q;a[v+1>>0]=q>>8;a[v+2>>0]=q>>16;a[v+3>>0]=q>>24;q=x+4|0;a[q>>0]=m;a[q+1>>0]=m>>8;a[q+2>>0]=m>>16;a[q+3>>0]=m>>24;m=s+o|0;q=t+o|0;x=m;v=x;F=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x+4|0;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=q;C=v;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=v+4|0;a[F>>0]=x;a[F+1>>0]=x>>8;a[F+2>>0]=x>>16;a[F+3>>0]=x>>24;x=m+o|0;m=q+o|0;q=x;F=q;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q+4|0;q=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m;C=F;a[C>>0]=v;a[C+1>>0]=v>>8;a[C+2>>0]=v>>16;a[C+3>>0]=v>>24;v=F+4|0;a[v>>0]=q;a[v+1>>0]=q>>8;a[v+2>>0]=q>>16;a[v+3>>0]=q>>24;q=x+o|0;x=m+o|0;m=q;v=m;F=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=m+4|0;m=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x;C=v;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=v+4|0;a[F>>0]=m;a[F+1>>0]=m>>8;a[F+2>>0]=m>>16;a[F+3>>0]=m>>24;m=q+o|0;q=x+o|0;x=m;F=x;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=x+4|0;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q;C=F;a[C>>0]=v;a[C+1>>0]=v>>8;a[C+2>>0]=v>>16;a[C+3>>0]=v>>24;v=F+4|0;a[v>>0]=x;a[v+1>>0]=x>>8;a[v+2>>0]=x>>16;a[v+3>>0]=x>>24;x=m+o|0;m=q+o|0;q=x;v=q;F=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=q+4|0;q=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=m;C=v;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=v+4|0;a[F>>0]=q;a[F+1>>0]=q>>8;a[F+2>>0]=q>>16;a[F+3>>0]=q>>24;q=x+o|0;x=m+o|0;m=q;F=m;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m+4|0;m=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=x;C=F;a[C>>0]=v;a[C+1>>0]=v>>8;a[C+2>>0]=v>>16;a[C+3>>0]=v>>24;v=F+4|0;a[v>>0]=m;a[v+1>>0]=m>>8;a[v+2>>0]=m>>16;a[v+3>>0]=m>>24;m=q+o|0;q=m;v=d[q>>0]|d[q+1>>0]<<8|d[q+2>>0]<<16|d[q+3>>0]<<24;q=m+4|0;m=d[q>>0]|d[q+1>>0]<<8|d[q+2>>0]<<16|d[q+3>>0]<<24;q=x+o|0;x=q;a[x>>0]=v;a[x+1>>0]=v>>8;a[x+2>>0]=v>>16;a[x+3>>0]=v>>24;v=q+4|0;a[v>>0]=m;a[v+1>>0]=m>>8;a[v+2>>0]=m>>16;a[v+3>>0]=m>>24}else Bb[c[e+3208>>2]&15](s,o,B&7,y&7,t,o);t=c[e+2384>>2]|0;y=l+t|0;B=b[r>>1]|0;s=B<<16>>16;m=g+t+(S(s>>3,o)|0)|0;t=b[r+2>>1]|0;v=t<<16>>16;q=m+(v>>3)|0;if(!((t|B)&7)){B=q;t=B;m=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=B+4|0;B=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=y;x=t;a[x>>0]=m;a[x+1>>0]=m>>8;a[x+2>>0]=m>>16;a[x+3>>0]=m>>24;m=t+4|0;a[m>>0]=B;a[m+1>>0]=B>>8;a[m+2>>0]=B>>16;a[m+3>>0]=B>>24;B=q+o|0;m=y+o|0;t=B;x=t;F=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=t+4|0;t=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=m;C=x;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=x+4|0;a[F>>0]=t;a[F+1>>0]=t>>8;a[F+2>>0]=t>>16;a[F+3>>0]=t>>24;t=B+o|0;B=m+o|0;m=t;F=m;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m+4|0;m=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B;C=F;a[C>>0]=x;a[C+1>>0]=x>>8;a[C+2>>0]=x>>16;a[C+3>>0]=x>>24;x=F+4|0;a[x>>0]=m;a[x+1>>0]=m>>8;a[x+2>>0]=m>>16;a[x+3>>0]=m>>24;m=t+o|0;t=B+o|0;B=m;x=B;F=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=B+4|0;B=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=t;C=x;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=x+4|0;a[F>>0]=B;a[F+1>>0]=B>>8;a[F+2>>0]=B>>16;a[F+3>>0]=B>>24;B=m+o|0;m=t+o|0;t=B;F=t;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=t+4|0;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m;C=F;a[C>>0]=x;a[C+1>>0]=x>>8;a[C+2>>0]=x>>16;a[C+3>>0]=x>>24;x=F+4|0;a[x>>0]=t;a[x+1>>0]=t>>8;a[x+2>>0]=t>>16;a[x+3>>0]=t>>24;t=B+o|0;B=m+o|0;m=t;x=m;F=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=m+4|0;m=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=B;C=x;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=x+4|0;a[F>>0]=m;a[F+1>>0]=m>>8;a[F+2>>0]=m>>16;a[F+3>>0]=m>>24;m=t+o|0;t=B+o|0;B=m;F=B;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B+4|0;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=t;C=F;a[C>>0]=x;a[C+1>>0]=x>>8;a[C+2>>0]=x>>16;a[C+3>>0]=x>>24;x=F+4|0;a[x>>0]=B;a[x+1>>0]=B>>8;a[x+2>>0]=B>>16;a[x+3>>0]=B>>24;B=m+o|0;m=B;x=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;m=B+4|0;B=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;m=t+o|0;t=m;a[t>>0]=x;a[t+1>>0]=x>>8;a[t+2>>0]=x>>16;a[t+3>>0]=x>>24;x=m+4|0;a[x>>0]=B;a[x+1>>0]=B>>8;a[x+2>>0]=B>>16;a[x+3>>0]=B>>24}else Bb[c[e+3208>>2]&15](q,o,v&7,s&7,y,o);y=c[e+2440>>2]|0;s=l+y|0;v=b[u>>1]|0;q=v<<16>>16;B=g+y+(S(q>>3,o)|0)|0;y=b[u+2>>1]|0;x=y<<16>>16;m=B+(x>>3)|0;if(!((y|v)&7)){v=m;y=v;B=d[y>>0]|d[y+1>>0]<<8|d[y+2>>0]<<16|d[y+3>>0]<<24;y=v+4|0;v=d[y>>0]|d[y+1>>0]<<8|d[y+2>>0]<<16|d[y+3>>0]<<24;y=s;t=y;a[t>>0]=B;a[t+1>>0]=B>>8;a[t+2>>0]=B>>16;a[t+3>>0]=B>>24;B=y+4|0;a[B>>0]=v;a[B+1>>0]=v>>8;a[B+2>>0]=v>>16;a[B+3>>0]=v>>24;v=m+o|0;B=s+o|0;y=v;t=y;F=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=y+4|0;y=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=B;C=t;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=t+4|0;a[F>>0]=y;a[F+1>>0]=y>>8;a[F+2>>0]=y>>16;a[F+3>>0]=y>>24;y=v+o|0;v=B+o|0;B=y;F=B;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B+4|0;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v;C=F;a[C>>0]=t;a[C+1>>0]=t>>8;a[C+2>>0]=t>>16;a[C+3>>0]=t>>24;t=F+4|0;a[t>>0]=B;a[t+1>>0]=B>>8;a[t+2>>0]=B>>16;a[t+3>>0]=B>>24;B=y+o|0;y=v+o|0;v=B;t=v;F=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=v+4|0;v=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=y;C=t;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=t+4|0;a[F>>0]=v;a[F+1>>0]=v>>8;a[F+2>>0]=v>>16;a[F+3>>0]=v>>24;v=B+o|0;B=y+o|0;y=v;F=y;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=y+4|0;y=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B;C=F;a[C>>0]=t;a[C+1>>0]=t>>8;a[C+2>>0]=t>>16;a[C+3>>0]=t>>24;t=F+4|0;a[t>>0]=y;a[t+1>>0]=y>>8;a[t+2>>0]=y>>16;a[t+3>>0]=y>>24;y=v+o|0;v=B+o|0;B=y;t=B;F=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=B+4|0;B=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=v;C=t;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=t+4|0;a[F>>0]=B;a[F+1>>0]=B>>8;a[F+2>>0]=B>>16;a[F+3>>0]=B>>24;B=y+o|0;y=v+o|0;v=B;F=v;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v+4|0;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=y;C=F;a[C>>0]=t;a[C+1>>0]=t>>8;a[C+2>>0]=t>>16;a[C+3>>0]=t>>24;t=F+4|0;a[t>>0]=v;a[t+1>>0]=v>>8;a[t+2>>0]=v>>16;a[t+3>>0]=v>>24;v=B+o|0;B=v;t=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=v+4|0;v=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=y+o|0;y=B;a[y>>0]=t;a[y+1>>0]=t>>8;a[y+2>>0]=t>>16;a[y+3>>0]=t>>24;t=B+4|0;a[t>>0]=v;a[t+1>>0]=v>>8;a[t+2>>0]=v>>16;a[t+3>>0]=v>>24;break}else{Bb[c[e+3208>>2]&15](m,o,x&7,q&7,s,o);break}}else{s=e+3204|0;q=e+3200|0;x=n;m=0;while(1){v=e+2144+(m*28|0)|0;t=m|1;B=e+2144+(t*28|0)|0;y=c[p>>2]|0;F=e+2144+(m*28|0)+24|0;C=c[x+12+(m<<2)>>2]|0;c[F>>2]=C;D=e+2144+(t*28|0)+24|0;E=c[(c[f>>2]|0)+12+(t<<2)>>2]|0;c[D>>2]=E;M=C>>>16&65535;do if(!(a[(c[f>>2]|0)+10>>0]|0))U=M;else{J=F+2|0;V=C>>16;W=c[h>>2]|0;if((V|0)>=(W+-152|0)){X=c[i>>2]|0;if((V|0)>(X+144|0)){Y=X+128|0;H=69}else Z=M}else{Y=W+-128|0;H=69}if((H|0)==69){H=0;W=Y&65535;b[J>>1]=W;Z=W}W=C<<16>>16;J=c[j>>2]|0;if((W|0)>=(J+-152|0)){X=c[k>>2]|0;if((W|0)>(X+144|0)){_=X+128|0;H=74}}else{_=J+-128|0;H=74}if((H|0)==74){H=0;b[F>>1]=_}J=D+2|0;X=E>>16;W=c[h>>2]|0;if((X|0)>=(W+-152|0)){V=c[i>>2]|0;if((X|0)>(V+144|0)){$=V+128|0;H=79}}else{$=W+-128|0;H=79}if((H|0)==79){H=0;b[J>>1]=$}J=E<<16>>16;W=c[j>>2]|0;if((J|0)<(W+-152|0))aa=W+-128|0;else{W=c[k>>2]|0;if((J|0)<=(W+144|0)){U=Z;break}aa=W+128|0}b[D>>1]=aa;U=Z}while(0);E=c[F>>2]|0;C=c[e+2144+(m*28|0)+16>>2]|0;M=l+C|0;do if((E|0)==(c[D>>2]|0)){W=U<<16>>16;J=g+C+(S(E<<16>>19,y)|0)+(W>>3)|0;if(!((E&65535|U)&7)){V=J;X=V;ba=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=V+4|0;V=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=M;ca=X;a[ca>>0]=ba;a[ca+1>>0]=ba>>8;a[ca+2>>0]=ba>>16;a[ca+3>>0]=ba>>24;ba=X+4|0;a[ba>>0]=V;a[ba+1>>0]=V>>8;a[ba+2>>0]=V>>16;a[ba+3>>0]=V>>24;V=J+y|0;ba=M+y|0;X=V;ca=X;da=d[ca>>0]|d[ca+1>>0]<<8|d[ca+2>>0]<<16|d[ca+3>>0]<<24;ca=X+4|0;X=d[ca>>0]|d[ca+1>>0]<<8|d[ca+2>>0]<<16|d[ca+3>>0]<<24;ca=ba;ea=ca;a[ea>>0]=da;a[ea+1>>0]=da>>8;a[ea+2>>0]=da>>16;a[ea+3>>0]=da>>24;da=ca+4|0;a[da>>0]=X;a[da+1>>0]=X>>8;a[da+2>>0]=X>>16;a[da+3>>0]=X>>24;X=V+y|0;V=ba+y|0;ba=X;da=ba;ca=d[da>>0]|d[da+1>>0]<<8|d[da+2>>0]<<16|d[da+3>>0]<<24;da=ba+4|0;ba=d[da>>0]|d[da+1>>0]<<8|d[da+2>>0]<<16|d[da+3>>0]<<24;da=V;ea=da;a[ea>>0]=ca;a[ea+1>>0]=ca>>8;a[ea+2>>0]=ca>>16;a[ea+3>>0]=ca>>24;ca=da+4|0;a[ca>>0]=ba;a[ca+1>>0]=ba>>8;a[ca+2>>0]=ba>>16;a[ca+3>>0]=ba>>24;ba=X+y|0;X=ba;ca=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=ba+4|0;ba=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=V+y|0;V=X;a[V>>0]=ca;a[V+1>>0]=ca>>8;a[V+2>>0]=ca>>16;a[V+3>>0]=ca>>24;ca=X+4|0;a[ca>>0]=ba;a[ca+1>>0]=ba>>8;a[ca+2>>0]=ba>>16;a[ca+3>>0]=ba>>24;break}else{Bb[c[s>>2]&15](J,y,W&7,E&7,M,y);break}}else{Ad(v,M,y,g,y,c[q>>2]|0);Ad(B,l+(c[e+2144+(t*28|0)+16>>2]|0)|0,y,g,y,c[q>>2]|0)}while(0);y=m+2|0;if((y|0)>=16)break a;x=c[f>>2]|0;m=y}}while(0);f=c[e+3024>>2]|0;g=c[e+2904>>2]|0;l=e+3004|0;U=e+3204|0;Z=e+3200|0;aa=c[l>>2]|0;k=c[e+2616>>2]|0;j=c[e+2608>>2]|0;do if((k|0)==(c[e+2644>>2]|0)){$=f+j|0;H=g+j+(S(k<<16>>19,aa)|0)|0;i=b[e+2616+2>>1]|0;h=i<<16>>16;_=H+(h>>3)|0;if(!((i|k&65535)&7)){i=_;H=i;Y=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=i+4|0;i=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=$;p=H;a[p>>0]=Y;a[p+1>>0]=Y>>8;a[p+2>>0]=Y>>16;a[p+3>>0]=Y>>24;Y=H+4|0;a[Y>>0]=i;a[Y+1>>0]=i>>8;a[Y+2>>0]=i>>16;a[Y+3>>0]=i>>24;i=_+aa|0;Y=$+aa|0;H=i;p=H;n=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=H+4|0;H=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=Y;A=p;a[A>>0]=n;a[A+1>>0]=n>>8;a[A+2>>0]=n>>16;a[A+3>>0]=n>>24;n=p+4|0;a[n>>0]=H;a[n+1>>0]=H>>8;a[n+2>>0]=H>>16;a[n+3>>0]=H>>24;H=i+aa|0;i=Y+aa|0;Y=H;n=Y;p=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=Y+4|0;Y=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=i;A=n;a[A>>0]=p;a[A+1>>0]=p>>8;a[A+2>>0]=p>>16;a[A+3>>0]=p>>24;p=n+4|0;a[p>>0]=Y;a[p+1>>0]=Y>>8;a[p+2>>0]=Y>>16;a[p+3>>0]=Y>>24;Y=H+aa|0;H=Y;p=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=Y+4|0;Y=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=i+aa|0;i=H;a[i>>0]=p;a[i+1>>0]=p>>8;a[i+2>>0]=p>>16;a[i+3>>0]=p>>24;p=H+4|0;a[p>>0]=Y;a[p+1>>0]=Y>>8;a[p+2>>0]=Y>>16;a[p+3>>0]=Y>>24;break}else{Bb[c[U>>2]&15](_,aa,h&7,k&7,$,aa);break}}else{Ad(e+2592|0,f+j|0,aa,g,aa,c[Z>>2]|0);Ad(e+2620|0,f+(c[e+2636>>2]|0)|0,aa,g,aa,c[Z>>2]|0)}while(0);aa=c[l>>2]|0;j=c[e+2672>>2]|0;k=c[e+2664>>2]|0;do if((j|0)==(c[e+2700>>2]|0)){$=f+k|0;h=g+k+(S(j<<16>>19,aa)|0)|0;_=b[e+2672+2>>1]|0;Y=_<<16>>16;p=h+(Y>>3)|0;if(!((_|j&65535)&7)){_=p;h=_;H=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=_+4|0;_=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=$;i=h;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;H=h+4|0;a[H>>0]=_;a[H+1>>0]=_>>8;a[H+2>>0]=_>>16;a[H+3>>0]=_>>24;_=p+aa|0;H=$+aa|0;h=_;i=h;n=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=h+4|0;h=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=H;A=i;a[A>>0]=n;a[A+1>>0]=n>>8;a[A+2>>0]=n>>16;a[A+3>>0]=n>>24;n=i+4|0;a[n>>0]=h;a[n+1>>0]=h>>8;a[n+2>>0]=h>>16;a[n+3>>0]=h>>24;h=_+aa|0;_=H+aa|0;H=h;n=H;i=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=H+4|0;H=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=_;A=n;a[A>>0]=i;a[A+1>>0]=i>>8;a[A+2>>0]=i>>16;a[A+3>>0]=i>>24;i=n+4|0;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;H=h+aa|0;h=H;i=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=H+4|0;H=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=_+aa|0;_=h;a[_>>0]=i;a[_+1>>0]=i>>8;a[_+2>>0]=i>>16;a[_+3>>0]=i>>24;i=h+4|0;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;break}else{Bb[c[U>>2]&15](p,aa,Y&7,j&7,$,aa);break}}else{Ad(e+2648|0,f+k|0,aa,g,aa,c[Z>>2]|0);Ad(e+2676|0,f+(c[e+2692>>2]|0)|0,aa,g,aa,c[Z>>2]|0)}while(0);aa=c[e+3028>>2]|0;g=c[e+2908>>2]|0;f=c[l>>2]|0;k=c[e+2728>>2]|0;j=c[e+2720>>2]|0;do if((k|0)==(c[e+2756>>2]|0)){$=aa+j|0;Y=g+j+(S(k<<16>>19,f)|0)|0;p=b[e+2728+2>>1]|0;H=p<<16>>16;i=Y+(H>>3)|0;if(!((p|k&65535)&7)){p=i;Y=p;h=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=p+4|0;p=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=$;_=Y;a[_>>0]=h;a[_+1>>0]=h>>8;a[_+2>>0]=h>>16;a[_+3>>0]=h>>24;h=Y+4|0;a[h>>0]=p;a[h+1>>0]=p>>8;a[h+2>>0]=p>>16;a[h+3>>0]=p>>24;p=i+f|0;h=$+f|0;Y=p;_=Y;n=d[_>>0]|d[_+1>>0]<<8|d[_+2>>0]<<16|d[_+3>>0]<<24;_=Y+4|0;Y=d[_>>0]|d[_+1>>0]<<8|d[_+2>>0]<<16|d[_+3>>0]<<24;_=h;A=_;a[A>>0]=n;a[A+1>>0]=n>>8;a[A+2>>0]=n>>16;a[A+3>>0]=n>>24;n=_+4|0;a[n>>0]=Y;a[n+1>>0]=Y>>8;a[n+2>>0]=Y>>16;a[n+3>>0]=Y>>24;Y=p+f|0;p=h+f|0;h=Y;n=h;_=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=h+4|0;h=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=p;A=n;a[A>>0]=_;a[A+1>>0]=_>>8;a[A+2>>0]=_>>16;a[A+3>>0]=_>>24;_=n+4|0;a[_>>0]=h;a[_+1>>0]=h>>8;a[_+2>>0]=h>>16;a[_+3>>0]=h>>24;h=Y+f|0;Y=h;_=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=h+4|0;h=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=p+f|0;p=Y;a[p>>0]=_;a[p+1>>0]=_>>8;a[p+2>>0]=_>>16;a[p+3>>0]=_>>24;_=Y+4|0;a[_>>0]=h;a[_+1>>0]=h>>8;a[_+2>>0]=h>>16;a[_+3>>0]=h>>24;break}else{Bb[c[U>>2]&15](i,f,H&7,k&7,$,f);break}}else{Ad(e+2704|0,aa+j|0,f,g,f,c[Z>>2]|0);Ad(e+2732|0,aa+(c[e+2748>>2]|0)|0,f,g,f,c[Z>>2]|0)}while(0);f=c[l>>2]|0;l=c[e+2784>>2]|0;j=c[e+2776>>2]|0;if((l|0)!=(c[e+2812>>2]|0)){Ad(e+2760|0,aa+j|0,f,g,f,c[Z>>2]|0);Ad(e+2788|0,aa+(c[e+2804>>2]|0)|0,f,g,f,c[Z>>2]|0);return}Z=aa+j|0;aa=g+j+(S(l<<16>>19,f)|0)|0;j=b[e+2784+2>>1]|0;e=j<<16>>16;g=aa+(e>>3)|0;if(!((j|l&65535)&7)){j=g;aa=j;k=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=j+4|0;j=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=Z;$=aa;a[$>>0]=k;a[$+1>>0]=k>>8;a[$+2>>0]=k>>16;a[$+3>>0]=k>>24;k=aa+4|0;a[k>>0]=j;a[k+1>>0]=j>>8;a[k+2>>0]=j>>16;a[k+3>>0]=j>>24;j=g+f|0;k=Z+f|0;aa=j;$=aa;H=d[$>>0]|d[$+1>>0]<<8|d[$+2>>0]<<16|d[$+3>>0]<<24;$=aa+4|0;aa=d[$>>0]|d[$+1>>0]<<8|d[$+2>>0]<<16|d[$+3>>0]<<24;$=k;i=$;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;H=$+4|0;a[H>>0]=aa;a[H+1>>0]=aa>>8;a[H+2>>0]=aa>>16;a[H+3>>0]=aa>>24;aa=j+f|0;j=k+f|0;k=aa;H=k;$=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=k+4|0;k=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=j;i=H;a[i>>0]=$;a[i+1>>0]=$>>8;a[i+2>>0]=$>>16;a[i+3>>0]=$>>24;$=H+4|0;a[$>>0]=k;a[$+1>>0]=k>>8;a[$+2>>0]=k>>16;a[$+3>>0]=k>>24;k=aa+f|0;aa=k;$=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=k+4|0;k=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=j+f|0;j=aa;a[j>>0]=$;a[j+1>>0]=$>>8;a[j+2>>0]=$>>16;a[j+3>>0]=$>>24;$=aa+4|0;a[$>>0]=k;a[$+1>>0]=k>>8;a[$+2>>0]=k>>16;a[$+3>>0]=k>>24;return}else{Bb[c[U>>2]&15](g,f,e&7,l&7,Z,f);return}}function Ad(d,e,f,g,h,i){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0;j=d+24|0;k=b[j>>1]|0;l=k<<16>>16;m=g+(c[d+16>>2]|0)+(S(l>>3,h)|0)|0;d=b[j+2>>1]|0;j=d<<16>>16;g=m+(j>>3)|0;if(!((d|k)&7)){a[e>>0]=a[g>>0]|0;a[e+1>>0]=a[g+1>>0]|0;a[e+2>>0]=a[g+2>>0]|0;a[e+3>>0]=a[g+3>>0]|0;k=e+f|0;d=g+h|0;a[k>>0]=a[d>>0]|0;a[k+1>>0]=a[d+1>>0]|0;a[k+2>>0]=a[d+2>>0]|0;a[k+3>>0]=a[d+3>>0]|0;m=k+f|0;k=d+h|0;a[m>>0]=a[k>>0]|0;a[m+1>>0]=a[k+1>>0]|0;a[m+2>>0]=a[k+2>>0]|0;a[m+3>>0]=a[k+3>>0]|0;d=m+f|0;m=k+h|0;a[d>>0]=a[m>>0]|0;a[d+1>>0]=a[m+1>>0]|0;a[d+2>>0]=a[m+2>>0]|0;a[d+3>>0]=a[m+3>>0]|0;return}else{Bb[i&15](g,h,j&7,l&7,e,f);return}}function Bd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0;i=l;l=l+16|0;j=i;k=a[c[b+3088>>2]>>0]|0;a[j>>0]=a[e>>0]|0;a[j+1>>0]=a[e+f>>0]|0;a[j+2>>0]=a[e+(f<<1)>>0]|0;a[j+3>>0]=a[e+(f*3|0)>>0]|0;a[j+4>>0]=a[e+(f<<2)>>0]|0;a[j+5>>0]=a[e+(f*5|0)>>0]|0;a[j+6>>0]=a[e+(f*6|0)>>0]|0;a[j+7>>0]=a[e+(f*7|0)>>0]|0;a[j+8>>0]=a[e+(f<<3)>>0]|0;a[j+9>>0]=a[e+(f*9|0)>>0]|0;a[j+10>>0]=a[e+(f*10|0)>>0]|0;a[j+11>>0]=a[e+(f*11|0)>>0]|0;a[j+12>>0]=a[e+(f*12|0)>>0]|0;a[j+13>>0]=a[e+(f*13|0)>>0]|0;a[j+14>>0]=a[e+(f*14|0)>>0]|0;a[j+15>>0]=a[e+(f*15|0)>>0]|0;if(!(k<<24>>24)){m=9652+(c[b+3104>>2]<<4)+(c[b+3100>>2]<<3)|0;n=c[m>>2]|0;Eb[n&31](g,h,d,j);l=i;return}else{m=9684+((k&255)<<3)|0;n=c[m>>2]|0;Eb[n&31](g,h,d,j);l=i;return}}function Cd(b,d,e,f,g,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0;m=l;l=l+16|0;n=m+8|0;o=m;p=a[(c[b+3088>>2]|0)+1>>0]|0;a[n>>0]=a[f>>0]|0;a[o>>0]=a[g>>0]|0;a[n+1>>0]=a[f+h>>0]|0;a[o+1>>0]=a[g+h>>0]|0;q=h<<1;a[n+2>>0]=a[f+q>>0]|0;a[o+2>>0]=a[g+q>>0]|0;q=h*3|0;a[n+3>>0]=a[f+q>>0]|0;a[o+3>>0]=a[g+q>>0]|0;q=h<<2;a[n+4>>0]=a[f+q>>0]|0;a[o+4>>0]=a[g+q>>0]|0;q=h*5|0;a[n+5>>0]=a[f+q>>0]|0;a[o+5>>0]=a[g+q>>0]|0;q=h*6|0;a[n+6>>0]=a[f+q>>0]|0;a[o+6>>0]=a[g+q>>0]|0;q=h*7|0;a[n+7>>0]=a[f+q>>0]|0;a[o+7>>0]=a[g+q>>0]|0;if(!(p<<24>>24)){r=9652+(c[b+3104>>2]<<4)+(c[b+3100>>2]<<3)+4|0;s=c[r>>2]|0;Eb[s&31](i,k,d,n);Eb[s&31](j,k,e,o);l=m;return}else{r=9684+((p&255)<<3)+4|0;s=c[r>>2]|0;Eb[s&31](i,k,d,n);Eb[s&31](j,k,e,o);l=m;return}}function Dd(){xg(9716,4)|0;return}function Ed(){c[2423]=1;c[2425]=2;c[2427]=3;c[2413]=4;c[2415]=5;c[2417]=6;c[2419]=7;c[2424]=8;c[2426]=9;c[2428]=10;c[2414]=11;c[2416]=12;c[2418]=13;c[2420]=14;Fd();return}function Fd(){c[2430]=15;c[2431]=16;c[2432]=17;c[2433]=18;c[2434]=19;c[2435]=20;c[2436]=21;c[2437]=22;c[2438]=23;c[2439]=24;return}function Gd(b,e,f,g,h,i,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0;k=l;l=l+16|0;m=k+4|0;n=k;o=m+4|0;a[n>>0]=a[e>>0]|0;a[n+1>>0]=a[e+f>>0]|0;a[n+2>>0]=a[e+(f<<1)>>0]|0;a[n+3>>0]=a[e+(f*3|0)>>0]|0;f=b;b=f;e=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;b=f+4|0;f=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;b=o;p=b;a[p>>0]=e;a[p+1>>0]=e>>8;a[p+2>>0]=e>>16;a[p+3>>0]=e>>24;e=b+4|0;a[e>>0]=f;a[e+1>>0]=f>>8;a[e+2>>0]=f>>16;a[e+3>>0]=f>>24;a[m+3>>0]=j;Eb[c[9720+(g<<2)>>2]&31](h,i,o,n);l=k;return}\nfunction Hd(a){a=a|0;var b=0,d=0;Sg((c[a+52>>2]|0)+-1+(0-(c[a+16>>2]|0))|0,127,(c[a>>2]|0)+5|0)|0;b=a+36|0;d=a+20|0;Sg((c[a+56>>2]|0)+-1+(0-(c[b>>2]|0))|0,127,(c[d>>2]|0)+5|0)|0;Sg((c[a+60>>2]|0)+-1+(0-(c[b>>2]|0))|0,127,(c[d>>2]|0)+5|0)|0;return}function Id(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(!g){h=8;l=d;return h|0}f=c[g+28>>2]|0;b=c[g+32>>2]|0;i=(f+1|0)>>>1;j=(b+1|0)>>>1;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];c[e+8>>2]=f;c[e+12>>2]=b;c[e>>2]=f;c[e+4>>2]=b;c[e+28>>2]=i;c[e+32>>2]=j;c[e+20>>2]=i;c[e+24>>2]=j;j=c[g+68>>2]|0;c[e+16>>2]=j;c[e+36>>2]=c[g+72>>2];c[e+76>>2]=(j-f|0)>>>1;h=ge(c[a+348>>2]|0,c[g>>2]|0,e)|0;l=d;return h|0}function Jd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(!g){h=8;l=d;return h|0}f=c[g+28>>2]|0;b=c[g+32>>2]|0;i=(f+1|0)>>>1;j=(b+1|0)>>>1;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];c[e+8>>2]=f;c[e+12>>2]=b;c[e>>2]=f;c[e+4>>2]=b;c[e+28>>2]=i;c[e+32>>2]=j;c[e+20>>2]=i;c[e+24>>2]=j;j=c[g+68>>2]|0;c[e+16>>2]=j;c[e+36>>2]=c[g+72>>2];c[e+76>>2]=(j-f|0)>>>1;h=fe(c[a+348>>2]|0,c[g>>2]|0,e)|0;l=d;return h|0}function Kd(a,b){a=a|0;b=b|0;return 4}function Ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){f=8;return f|0}d=c[a+348>>2]|0;c[e>>2]=(c[d+9152>>2]<<1)+(c[d+9156>>2]<<2)+(c[d+9148>>2]|0);f=0;return f|0}function Md(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;d=c[a+348>>2]|0;if(!((e|0)!=0&(d|0)!=0)){f=8;return f|0}a=c[d+5060>>2]|0;if(!a){f=1;return f|0}c[e>>2]=c[a+112>>2];f=0;return f|0}function Nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){f=8;return f|0}d=(c[a+348>>2]|0)+3248|0;a=(je(d,3)|0)!=0;b=(je(d,2)|0)!=0;c[e>>2]=(b?2:0)|(a?4:0)|(je(d,1)|0)!=0;f=0;return f|0}function Od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){c[a+232>>2]=0;f=0;g=a+236|0;c[g>>2]=f;return 0}else{c[a+232>>2]=c[e>>2];f=c[e+4>>2]|0;g=a+236|0;c[g>>2]=f;return 0}return 0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;Zc();yc();_b();b=a+24|0;if(c[b>>2]|0){d=0;return d|0}e=Tb(1,560)|0;if(!e){d=2;return d|0}c[b>>2]=e;c[e+4>>2]=c[a+16>>2];c[e+196>>2]=16;c[e+232>>2]=0;c[e+236>>2]=0;f=a+20|0;a=c[f>>2]|0;if(!a)g=e;else{h=e+184|0;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[f>>2]=h;g=c[b>>2]|0}c[g+484>>2]=0;c[g+480>>2]=c[g+4>>2]&262144;d=0;return d|0}function Qd(a){a=a|0;ne(a+348|0)|0;Ub(a);return 0}function Rd(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;if((e|0)<1){g=8;return g|0}h=f+12|0;c[h>>2]=0;if(e>>>0<=9){g=5;return g|0}if(a[b>>0]&1){g=5;return g|0}c[h>>2]=1;if((a[b+3>>0]|0)!=-99){g=5;return g|0}if((a[b+4>>0]|0)!=1){g=5;return g|0}if((a[b+5>>0]|0)!=42){g=5;return g|0}h=d[b+7>>0]<<8&16128|d[b+6>>0];c[f+4>>2]=h;e=d[b+9>>0]<<8&16128|d[b+8>>0];c[f+8>>2]=e;g=(h|0)==0|(e|0)==0?7:0;return g|0}function Sd(a,b){a=a|0;b=b|0;var d=0;d=a+196|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b>>2]=16;return 0}function Td(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ca=0,da=0,fa=0,ga=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0;i=l;l=l+64|0;j=i+16|0;k=i+8|0;m=i;n=4;q=Kg(40)|0;c[q>>2]=0;r=i+48|0;s=i+24|0;t=b+480|0;u=c[t>>2]|0;v=(e|0)==0;if(v&(u|f|0)==0){w=0;Lg(q|0);l=i;return w|0}x=b+484|0;y=c[x>>2]|0;if(!y){z=b+488|0;A=z+72|0;do{c[z>>2]=0;z=z+4|0}while((z|0)<(A|0))}B=(u|0)!=0;if(!(v&(f|0)==0|B^1)){c[b+488+(y<<2)>>2]=e;c[b+524+(c[x>>2]<<2)>>2]=f;y=(c[x>>2]|0)+1|0;v=y>>>0>9;c[x>>2]=v?0:y;Lg(q|0);l=i;return (v?8:0)|0}v=b+488|0;if(B){C=c[v>>2]|0;E=c[b+524>>2]|0}else{c[v>>2]=e;c[b+524>>2]=f;c[x>>2]=1;C=e;E=f}v=b+200|0;B=c[v>>2]|0;y=b+204|0;u=c[y>>2]|0;F=b+232|0;G=c[F>>2]|0;H=b+236|0;I=c[H>>2]|0;do if((E|0)<1){J=8;K=21}else{if(!G)L=C;else{o=0;ja(G|0,I|0,C|0,r|0,(E>>>0<10?E:10)|0);M=o;o=0;if((M|0)!=0&(p|0)!=0){N=Wg(c[M>>2]|0,q|0,n|0)|0;if(!N)wa(M|0,p|0);D=p}else N=-1;if((N|0)==1){O=D;P=0;Q=0;R=0;S=0;T=0;U=0;V=0;break}L=r}M=b+208|0;c[M>>2]=0;if(E>>>0>9?(a[L>>0]&1)==0:0){c[M>>2]=1;if(((a[L+3>>0]|0)==-99?(a[L+4>>0]|0)==1:0)?(a[L+5>>0]|0)==42:0){M=d[L+7>>0]<<8&16128|d[L+6>>0];c[v>>2]=M;W=d[L+9>>0]<<8&16128|d[L+8>>0];c[y>>2]=W;J=(M|0)==0|(W|0)==0?7:0;K=21;break}J=5;K=21;break}J=0;K=21}while(0);do if((K|0)==21){L=b+212|0;E=c[L>>2]|0;r=(E|0)==0;if(r)X=(c[b+208>>2]|0)==0?5:J;else X=J;N=c[y>>2]|0;if((N|0)==(u|0)?(c[v>>2]|0)==(B|0):0)Y=0;else Y=1;if(!X)if(r){c[s>>2]=c[v>>2];c[s+4>>2]=N;c[s+8>>2]=9;c[s+12>>2]=0;c[s+16>>2]=c[b+184>>2];N=c[b+4>>2]|0;c[s+20>>2]=N&131072;if(!((c[b+216>>2]|0)!=0|(N&65536|0)==0)){c[b+220>>2]=1027;c[b+224>>2]=4;c[b+228>>2]=0}o=0;N=ha(11,b+348|0,s|0)|0;r=o;o=0;if((r|0)!=0&(p|0)!=0){Z=Wg(c[r>>2]|0,q|0,n|0)|0;if(!Z)wa(r|0,p|0);D=p}else Z=-1;if((Z|0)==1){O=D;P=0;Q=0;R=0;S=0;T=0;U=0;V=0;break}if(!N){c[L>>2]=1;_=1}else _=c[L>>2]|0;aa=_;ca=N;K=35}else{da=0;K=36}else{aa=E;ca=X;K=35}if((K|0)==35)if(!aa)fa=ca;else{da=ca;K=36}if((K|0)==36){E=b+348|0;c[(c[E>>2]|0)+11988>>2]=c[F>>2];c[(c[E>>2]|0)+11992>>2]=c[H>>2];fa=da}if(fa|0){w=fa;Lg(q|0);l=i;return w|0}E=c[b+348>>2]|0;if(Y){N=E+3248|0;L=E+5040|0;c[L>>2]=c[v>>2];r=E+5044|0;c[r>>2]=c[y>>2];C=c[E+5716>>2]|0;q=Ug(E+3340|0,1,q|0,n|0)|0;n=D;o=0;I=o;o=0;if((I|0)!=0&(p|0)!=0){ga=Wg(c[I>>2]|0,q|0,n|0)|0;if(!ga)wa(I|0,p|0);D=p}else ga=-1;if((ga|0)==1){O=D;P=C;Q=E;R=r;S=L;T=N;U=N;V=E}else{O=0;P=C;Q=E;R=r;S=L;T=N;U=N;V=E}}else{ka=0;la=E;ma=0;na=0;oa=0;pa=0;qa=0;K=62}}while(0);a:while(1){if((K|0)==62){K=0;z=la+11732|0;ra=t;A=z+80|0;do{c[z>>2]=c[ra>>2];z=z+4|0;ra=ra+4|0}while((z|0)<(A|0));c[b+476>>2]=g;o=0;sa=ia(2,la|0,f|0,e|0,h|0,((h|0)<0)<<31>>31|0)|0;ga=o;o=0;if((ga|0)!=0&(p|0)!=0){ta=Wg(c[ga>>2]|0,q|0,n|0)|0;if(!ta)wa(ga|0,p|0);D=p}else ta=-1;if((ta|0)==1){O=D;P=ka;Q=la;R=ma;S=na;T=oa;U=pa;V=qa}else break}ua=Q+3336|0;if(O|0){K=67;break}c[ua>>2]=1;if((c[S>>2]|0)<1){c[S>>2]=B;o=0;ja(25,U|0,7,5209,m|0);ga=o;o=0;if((ga|0)!=0&(p|0)!=0){va=Wg(c[ga>>2]|0,q|0,n|0)|0;if(!va)wa(ga|0,p|0);D=p}else va=-1;if((va|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue}}ga=c[R>>2]|0;if((ga|0)<1){c[R>>2]=u;o=0;ja(25,U|0,7,5229,k|0);Y=o;o=0;if((Y|0)!=0&(p|0)!=0){Ea=Wg(c[Y>>2]|0,q|0,n|0)|0;if(!Ea)wa(Y|0,p|0);D=p}else Ea=-1;if((Ea|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue}Fa=c[R>>2]|0}else Fa=ga;o=0;ga=$(5,T|0,c[S>>2]|0,Fa|0)|0;Y=o;o=0;if((Y|0)!=0&(p|0)!=0){Ga=Wg(c[Y>>2]|0,q|0,n|0)|0;if(!Ga)wa(Y|0,p|0);D=p}else Ga=-1;if((Ga|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue}if(ga|0){o=0;ja(25,U|0,2,5250,j|0);ga=o;o=0;if((ga|0)!=0&(p|0)!=0){Ha=Wg(c[ga>>2]|0,q|0,n|0)|0;if(!Ha)wa(ga|0,p|0);D=p}else Ha=-1;if((Ha|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue}}z=Q+2848|0;ra=Q+5064+((c[Q+5564>>2]|0)*120|0)|0;A=z+120|0;do{c[z>>2]=c[ra>>2];z=z+4|0;ra=ra+4|0}while((z|0)<(A|0));ga=Q+5560|0;Y=c[ga>>2]|0;z=Q+2968|0;ra=Q+5064+(Y*120|0)|0;A=z+120|0;do{c[z>>2]=c[ra>>2];z=z+4|0;ra=ra+4|0}while((z|0)<(A|0));fa=Q+11828|0;if((c[fa>>2]|0)>0){da=Q+11916|0;z=(c[da>>2]|0)+2968|0;ra=Q+5064+(Y*120|0)|0;A=z+120|0;do{c[z>>2]=c[ra>>2];z=z+4|0;ra=ra+4|0}while((z|0)<(A|0));o=0;ba(1,c[da>>2]|0);Y=o;o=0;if((Y|0)!=0&(p|0)!=0){Ia=Wg(c[Y>>2]|0,q|0,n|0)|0;if(!Ia)wa(Y|0,p|0);D=p}else Ia=-1;if((Ia|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue}if((c[fa>>2]|0)>1){Y=1;while(1){z=(c[da>>2]|0)+(Y*3232|0)+2968|0;ra=Q+5064+((c[ga>>2]|0)*120|0)|0;A=z+120|0;do{c[z>>2]=c[ra>>2];z=z+4|0;ra=ra+4|0}while((z|0)<(A|0));o=0;ba(1,(c[da>>2]|0)+(Y*3232|0)|0);H=o;o=0;if((H|0)!=0&(p|0)!=0){Ja=Wg(c[H>>2]|0,q|0,n|0)|0;if(!Ja)wa(H|0,p|0);D=p}else Ja=-1;if((Ja|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue a}Y=Y+1|0;if((Y|0)>=(c[fa>>2]|0))break}}}o=0;ba(1,V|0);fa=o;o=0;if((fa|0)!=0&(p|0)!=0){Ka=Wg(c[fa>>2]|0,q|0,n|0)|0;if(!Ka)wa(fa|0,p|0);D=p}else Ka=-1;if((Ka|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue}if(c[Q+11812>>2]|0){o=0;ea(1,Q|0,c[S>>2]|0,P|0);fa=o;o=0;if((fa|0)!=0&(p|0)!=0){La=Wg(c[fa>>2]|0,q|0,n|0)|0;if(!La)wa(fa|0,p|0);D=p}else La=-1;if((La|0)==1){xa=V;ya=U;za=T;Aa=S;Ba=R;Ca=Q;Da=P;O=D;V=xa;U=ya;T=za;S=Aa;R=Ba;Q=Ca;P=Da;continue}}c[ua>>2]=0;c[Q+5544>>2]=0;ka=P;la=Q;ma=R;na=S;oa=T;pa=U;qa=V;K=62}if((K|0)==67){c[ua>>2]=0;c[v>>2]=0;c[y>>2]=0;w=-1;Lg(q|0);l=i;return w|0}if((sa|0)!=0?(sa=c[la+3248>>2]|0,(sa|0)!=0):0){c[b>>2]=c[la+3252>>2]|0?la+3256|0:0;Ma=sa}else Ma=0;c[x>>2]=0;w=Ma;Lg(q|0);l=i;return w|0}function Ud(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;d=l;l=l+176|0;e=d+48|0;f=d+8|0;g=d;h=d+16|0;if(c[b>>2]|0){i=0;l=d;return i|0}j=c[a+348>>2]|0;if(!j){i=0;l=d;return i|0}k=f;c[k>>2]=0;c[k+4>>2]=0;k=g;c[k>>2]=0;c[k+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;if(c[a+4>>2]&65536|0){c[h>>2]=c[a+220>>2];c[h+4>>2]=c[a+224>>2];c[h+8>>2]=c[a+228>>2]}if(!(ie(j,e,f,g,h)|0)){h=a+240|0;g=c[a+476>>2]|0;c[h>>2]=258;f=c[e+16>>2]|0;c[a+252>>2]=f;j=c[e+4>>2]|0;c[a+256>>2]=j+79&-16;k=c[e>>2]|0;c[a+272>>2]=k;c[a+264>>2]=k;c[a+276>>2]=j;c[a+268>>2]=j;c[a+280>>2]=1;c[a+284>>2]=1;c[a+288>>2]=c[e+52>>2];c[a+292>>2]=c[e+56>>2];c[a+296>>2]=c[e+60>>2];c[a+300>>2]=0;c[a+304>>2]=f;j=c[e+36>>2]|0;c[a+308>>2]=j;c[a+312>>2]=j;c[a+316>>2]=f;c[a+260>>2]=8;c[a+320>>2]=12;c[a+324>>2]=g;c[a+328>>2]=c[e+68>>2];c[a+332>>2]=0;c[a+336>>2]=0;c[b>>2]=h;m=h}else m=0;i=m;l=d;return i|0}function Vd(){return 1592}function Wd(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;h=l;l=l+16|0;i=h;c[a>>2]=b+e;j=a+4|0;c[j>>2]=b;k=a+8|0;c[k>>2]=0;m=a+12|0;c[m>>2]=-8;c[a+16>>2]=255;c[a+20>>2]=f;c[a+24>>2]=g;if(!((b|0)!=0|(e|0)==0)){n=1;l=h;return n|0}a=e<<3;o=32-a|0;if(!f)p=b;else{Eb[f&31](g,b,i,e>>>0<5?e:5);p=i}i=(o|0)>-1;e=o>>31&-1073741824|1073741816;b=i?o:0;if((a|0)==0&i|(b|0)>24){q=e;r=0}else{i=c[j>>2]|0;a=p;p=e;e=24;o=0;while(1){g=p+8|0;f=(d[a>>0]|0)<<e|o;i=i+1|0;c[j>>2]=i;e=e+-8|0;if((e|0)<(b|0)){q=g;r=f;break}else{a=a+1|0;p=g;o=f}}}c[k>>2]=r;c[m>>2]=q;n=0;l=h;return n|0}function Xd(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=l;l=l+16|0;e=b;f=a+4|0;g=c[f>>2]|0;h=a+8|0;i=c[h>>2]|0;j=a+12|0;k=c[j>>2]|0;m=16-k|0;n=(c[a>>2]|0)-g|0;o=n<<3;p=m+8-o|0;q=c[a+20>>2]|0;if(!q)r=g;else{Eb[q&31](c[a+24>>2]|0,g,e,n>>>0<5?n:5);r=e}e=(p|0)>-1;n=e?k+1073741824|0:k;k=e?p:0;if(e&(o|0)==0|(m|0)<(k|0)){s=n;t=i;c[h>>2]=t;c[j>>2]=s;l=b;return}o=c[f>>2]|0;e=r;r=n;n=m;m=i;while(1){i=r+8|0;p=(d[e>>0]|0)<<n|m;o=o+1|0;c[f>>2]=o;n=n+-8|0;if((n|0)<(k|0)){s=i;t=p;break}else{e=e+1|0;r=i;m=p}}c[h>>2]=t;c[j>>2]=s;l=b;return}function Yd(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0;g=l;l=l+32|0;h=g+16|0;i=g;j=c[f+5772>>2]|0;k=f+11680|0;m=f+11696|0;n=(((c[m>>2]<<7)+-128|0)>>>8)+1|0;o=f+11692|0;p=c[o>>2]|0;if((p|0)<0){Xd(k);q=c[o>>2]|0}else q=p;p=f+11688|0;r=c[p>>2]|0;s=n<<24;if(r>>>0<s>>>0){t=0;u=n;v=r}else{t=1;u=(c[m>>2]|0)-n|0;v=r-s|0}s=d[16+u>>0]|0;r=u<<s;u=v<<s;v=q-s|0;c[p>>2]=u;c[o>>2]=v;c[m>>2]=r;s=f+5728|0;c[s>>2]=t;q=f+11967|0;a[q>>0]=0;if(!t){w=r;x=v;y=u}else{t=u;u=r;r=v;v=8;n=0;do{z=v;v=v+-1|0;A=(((u<<7)+-128|0)>>>8)+1|0;if((r|0)<0){Xd(k);B=c[o>>2]|0;C=c[p>>2]|0}else{B=r;C=t}D=A<<24;if(C>>>0<D>>>0){E=0;F=A;G=C}else{E=1;F=(c[m>>2]|0)-A|0;G=C-D|0}D=d[16+F>>0]|0;u=F<<D;t=G<<D;r=B-D|0;c[p>>2]=t;c[o>>2]=r;c[m>>2]=u;n=E<<v|n}while((z|0)>1);a[q>>0]=n;w=u;x=r;y=t}t=f+5700|0;if(c[t>>2]|0){r=w;w=x;x=y;y=8;u=0;do{n=y;y=y+-1|0;v=(((r<<7)+-128|0)>>>8)+1|0;if((w|0)<0){Xd(k);H=c[p>>2]|0;I=c[o>>2]|0}else{H=x;I=w}E=v<<24;if(H>>>0<E>>>0){J=0;K=v;L=H}else{J=1;K=(c[m>>2]|0)-v|0;L=H-E|0}E=d[16+K>>0]|0;r=K<<E;x=L<<E;w=I-E|0;c[p>>2]=x;c[o>>2]=w;c[m>>2]=r;u=J<<y|u}while((n|0)>1);a[f+11964>>0]=u;u=r;r=w;w=x;x=8;y=0;do{J=x;x=x+-1|0;I=(((u<<7)+-128|0)>>>8)+1|0;if((r|0)<0){Xd(k);M=c[p>>2]|0;N=c[o>>2]|0}else{M=w;N=r}L=I<<24;if(M>>>0<L>>>0){O=0;P=I;Q=M}else{O=1;P=(c[m>>2]|0)-I|0;Q=M-L|0}L=d[16+P>>0]|0;u=P<<L;w=Q<<L;r=N-L|0;c[p>>2]=w;c[o>>2]=r;c[m>>2]=u;y=O<<x|y}while((J|0)>1);a[f+11965>>0]=y;y=u;u=r;r=w;w=8;x=0;do{O=w;w=w+-1|0;N=(((y<<7)+-128|0)>>>8)+1|0;if((u|0)<0){Xd(k);R=c[p>>2]|0;T=c[o>>2]|0}else{R=r;T=u}Q=N<<24;if(R>>>0<Q>>>0){U=0;V=N;W=R}else{U=1;V=(c[m>>2]|0)-N|0;W=R-Q|0}Q=d[16+V>>0]|0;y=V<<Q;r=W<<Q;u=T-Q|0;c[p>>2]=r;c[o>>2]=u;c[m>>2]=y;x=U<<w|x}while((O|0)>1);a[f+11966>>0]=x;x=(((y<<7)+-128|0)>>>8)+1|0;if((u|0)<0){Xd(k);X=c[p>>2]|0;Y=c[o>>2]|0}else{X=r;Y=u}u=x<<24;if(X>>>0<u>>>0){Z=1;_=x;$=X}else{Z=0;_=(c[m>>2]|0)-x|0;$=X-u|0}u=d[16+_>>0]|0;X=_<<u;_=Y-u|0;c[p>>2]=$<<u;c[o>>2]=_;c[m>>2]=X;if(Z){aa=X;ba=_}else{Z=X;X=_;_=0;while(1){u=Z;$=X;Y=8;x=0;do{r=Y;Y=Y+-1|0;y=(((u<<7)+-128|0)>>>8)+1|0;if(($|0)<0){Xd(k);ca=c[o>>2]|0}else ca=$;w=c[p>>2]|0;U=y<<24;if(w>>>0<U>>>0){da=0;ea=y;fa=w}else{da=1;ea=(c[m>>2]|0)-y|0;fa=w-U|0}U=d[16+ea>>0]|0;u=ea<<U;$=ca-U|0;c[p>>2]=fa<<U;c[o>>2]=$;c[m>>2]=u;x=da<<Y|x}while((r|0)>1);a[f+10323+_>>0]=x;_=_+1|0;Y=c[m>>2]|0;u=c[o>>2]|0;if((_|0)==4){aa=Y;ba=u;break}else{Z=Y;X=u}}}X=(((aa<<7)+-128|0)>>>8)+1|0;if((ba|0)<0){Xd(k);ga=c[o>>2]|0}else ga=ba;ba=c[p>>2]|0;aa=X<<24;if(ba>>>0<aa>>>0){ha=1;ia=X;ja=ba}else{ha=0;ia=(c[m>>2]|0)-X|0;ja=ba-aa|0}aa=d[16+ia>>0]|0;ba=ia<<aa;ia=ja<<aa;ja=ga-aa|0;c[p>>2]=ia;c[o>>2]=ja;c[m>>2]=ba;if(ha)ka=0;else{ha=ia;ia=ba;ba=ja;ja=8;aa=0;do{ga=ja;ja=ja+-1|0;X=(((ia<<7)+-128|0)>>>8)+1|0;if((ba|0)<0){Xd(k);la=c[p>>2]|0;ma=c[o>>2]|0}else{la=ha;ma=ba}Z=X<<24;if(la>>>0<Z>>>0){na=0;oa=X;pa=la}else{na=1;oa=(c[m>>2]|0)-X|0;pa=la-Z|0}Z=d[16+oa>>0]|0;ia=oa<<Z;ha=pa<<Z;ba=ma-Z|0;c[p>>2]=ha;c[o>>2]=ba;c[m>>2]=ia;aa=na<<ja|aa}while((ga|0)>1);a[f+10327>>0]=aa;aa=ha;ha=ia;ia=ba;ba=8;ja=0;do{na=ba;ba=ba+-1|0;ma=(((ha<<7)+-128|0)>>>8)+1|0;if((ia|0)<0){Xd(k);qa=c[p>>2]|0;ra=c[o>>2]|0}else{qa=aa;ra=ia}pa=ma<<24;if(qa>>>0<pa>>>0){sa=0;ta=ma;ua=qa}else{sa=1;ta=(c[m>>2]|0)-ma|0;ua=qa-pa|0}pa=d[16+ta>>0]|0;ha=ta<<pa;aa=ua<<pa;ia=ra-pa|0;c[p>>2]=aa;c[o>>2]=ia;c[m>>2]=ha;ja=sa<<ba|ja}while((na|0)>1);a[f+10328>>0]=ja;ja=aa;aa=ha;ha=ia;ia=8;ba=0;do{sa=ia;ia=ia+-1|0;ra=(((aa<<7)+-128|0)>>>8)+1|0;if((ha|0)<0){Xd(k);va=c[p>>2]|0;wa=c[o>>2]|0}else{va=ja;wa=ha}ua=ra<<24;if(va>>>0<ua>>>0){xa=0;ya=ra;za=va}else{xa=1;ya=(c[m>>2]|0)-ra|0;za=va-ua|0}ua=d[16+ya>>0]|0;aa=ya<<ua;ja=za<<ua;ha=wa-ua|0;c[p>>2]=ja;c[o>>2]=ha;c[m>>2]=aa;ba=xa<<ia|ba}while((sa|0)>1);a[f+10329>>0]=ba;ka=0}do{ba=f+11389+(ka*19|0)+19|0;ia=f+11389+(ka*19|0)|0;xa=5024+(ka*19|0)|0;do{aa=((S((c[m>>2]|0)+-1|0,d[xa>>0]|0)|0)>>>8)+1|0;xa=xa+1|0;ha=c[o>>2]|0;if((ha|0)<0){Xd(k);Aa=c[o>>2]|0}else Aa=ha;ha=c[p>>2]|0;ja=aa<<24;if(ha>>>0<ja>>>0){Ba=1;Ca=aa;Da=ha}else{Ba=0;Ca=(c[m>>2]|0)-aa|0;Da=ha-ja|0}ja=d[16+Ca>>0]|0;ha=Ca<<ja;aa=Da<<ja;wa=Aa-ja|0;c[p>>2]=aa;c[o>>2]=wa;c[m>>2]=ha;if(!Ba){ja=aa;aa=ha;ha=wa;wa=7;za=0;do{ya=wa;wa=wa+-1|0;va=(((aa<<7)+-128|0)>>>8)+1|0;if((ha|0)<0){Xd(k);Ea=c[p>>2]|0;Fa=c[o>>2]|0}else{Ea=ja;Fa=ha}sa=va<<24;if(Ea>>>0<sa>>>0){Ga=0;Ha=va;Ia=Ea}else{Ga=1;Ha=(c[m>>2]|0)-va|0;Ia=Ea-sa|0}sa=d[16+Ha>>0]|0;aa=Ha<<sa;ja=Ia<<sa;ha=Fa-sa|0;c[p>>2]=ja;c[o>>2]=ha;c[m>>2]=aa;za=Ga<<wa|za}while((ya|0)>1);wa=za&255;a[ia>>0]=(wa|0)==0?1:wa<<1&255}ia=ia+1|0}while(ia>>>0<ba>>>0);ka=ka+1|0}while((ka|0)!=2)}ka=f+3192|0;c[ka>>2]=0;Ga=f+5716|0;Fa=c[Ga>>2]|0;Ia=(Fa<<7)+-128|0;Ha=f+3196|0;c[Ha>>2]=Ia;Ea=f+5720|0;Ba=c[Ea>>2]|0;Aa=(Ba<<7)+-128|0;if((Fa|0)<=0){l=g;return}Da=f+3184|0;Ca=f+3188|0;ba=f+3149|0;ia=f+5724|0;xa=f+11964|0;x=f+3092|0;wa=f+11965|0;aa=i+8|0;ha=i+4|0;ja=h+12|0;ya=h+8|0;sa=h+4|0;va=i+4|0;ua=f+11389|0;ra=f+11408|0;ta=ha+2|0;qa=f+11966|0;na=f+3148|0;pa=f+3152|0;ma=f+3153|0;oa=f+3154|0;la=Fa;Fa=Ia;Ia=0;ga=Ba;Ba=0;Z=j;while(1){c[Da>>2]=0;c[Ca>>2]=Aa;if((ga|0)>0){j=0;X=Z;do{if(!(a[ba>>0]|0)){if(!(c[t>>2]|0))a[X+11>>0]=0}else if(a[na>>0]|0){_=((S((c[m>>2]|0)+-1|0,d[pa>>0]|0)|0)>>>8)+1|0;da=c[o>>2]|0;if((da|0)<0){Xd(k);Ja=c[o>>2]|0}else Ja=da;da=c[p>>2]|0;fa=_<<24;if(da>>>0<fa>>>0){Ka=1;La=_;Ma=da}else{Ka=0;La=(c[m>>2]|0)-_|0;Ma=da-fa|0}fa=d[16+La>>0]|0;da=La<<fa;_=Ma<<fa;ca=Ja-fa|0;c[p>>2]=_;c[o>>2]=ca;c[m>>2]=da;if(Ka){fa=((S(d[ma>>0]|0,da+-1|0)|0)>>>8)+1|0;if((ca|0)<0){Xd(k);Na=c[o>>2]|0;Oa=c[p>>2]|0}else{Na=ca;Oa=_}ea=fa<<24;if(Oa>>>0<ea>>>0){Pa=0;Qa=fa;Ra=Oa}else{Pa=1;Qa=(c[m>>2]|0)-fa|0;Ra=Oa-ea|0}ea=d[16+Qa>>0]|0;Sa=Pa;Ta=Qa<<ea;Ua=Na-ea|0;Va=Ra<<ea}else{ea=((S(d[oa>>0]|0,da+-1|0)|0)>>>8)+1|0;if((ca|0)<0){Xd(k);Wa=c[p>>2]|0;Xa=c[o>>2]|0}else{Wa=_;Xa=ca}ca=ea<<24;if(Wa>>>0<ca>>>0){Ya=2;Za=ea;_a=Wa}else{Ya=3;Za=(c[m>>2]|0)-ea|0;_a=Wa-ca|0}ca=d[16+Za>>0]|0;Sa=Ya;Ta=Za<<ca;Ua=Xa-ca|0;Va=_a<<ca}c[p>>2]=Va;c[o>>2]=Ua;c[m>>2]=Ta;a[X+11>>0]=Sa}if(!(c[s>>2]|0))$a=0;else{ca=((S((c[m>>2]|0)+-1|0,d[q>>0]|0)|0)>>>8)+1|0;ea=c[o>>2]|0;if((ea|0)<0){Xd(k);ab=c[o>>2]|0}else ab=ea;ea=c[p>>2]|0;_=ca<<24;if(ea>>>0<_>>>0){bb=0;cb=ca;db=ea}else{bb=1;cb=(c[m>>2]|0)-ca|0;db=ea-_|0}_=d[16+cb>>0]|0;c[p>>2]=db<<_;c[o>>2]=ab-_;c[m>>2]=cb<<_;$a=bb}a[X+9>>0]=$a;_=X+3|0;a[_>>0]=0;do if(!(c[t>>2]|0)){ea=c[ia>>2]|0;a[X+2>>0]=0;ca=c[m>>2]|0;da=c[o>>2]|0;fa=0;do{u=fa<<24>>24;Y=((S(d[4048+(u>>1)>>0]|0,ca+-1|0)|0)>>>8)+1|0;if((da|0)<0){Xd(k);eb=c[o>>2]|0}else eb=da;$=c[p>>2]|0;r=Y<<24;if($>>>0<r>>>0){fb=0;gb=Y;hb=$}else{fb=1;gb=(c[m>>2]|0)-Y|0;hb=$-r|0}r=d[16+gb>>0]|0;ca=gb<<r;da=eb-r|0;c[p>>2]=hb<<r;c[o>>2]=da;c[m>>2]=ca;fa=a[4993+(fb+u)>>0]|0}while(fa<<24>>24>0);u=0-(fa<<24>>24)|0;a[X>>0]=u;if((u&255|0)==4){a[_>>0]=1;u=X+-76|0;r=0-ea|0;$=X+(r*76|0)|0;Y=0;do{a:do if(Y>>>0>3)ib=c[X+12+(Y<<2)+-16>>2]|0;else switch(a[$>>0]|0){case 4:{ib=c[X+(r*76|0)+12+(Y<<2)+48>>2]|0;break a;break}case 3:{ib=1;break a;break}case 1:{ib=2;break a;break}case 2:{ib=3;break a;break}default:{ib=0;break a}}while(0);b:do if(!(Y&3))switch(a[u>>0]|0){case 4:{jb=c[X+-64+(Y<<2)+12>>2]|0;break b;break}case 3:{jb=1;break b;break}case 1:{jb=2;break b;break}case 2:{jb=3;break b;break}default:{jb=0;break b}}else jb=c[X+12+(Y<<2)+-4>>2]|0;while(0);U=c[m>>2]|0;w=c[o>>2]|0;y=0;do{T=y<<24>>24;W=((S(d[(T>>1)+(4067+(ib*90|0)+(jb*9|0))>>0]|0,U+-1|0)|0)>>>8)+1|0;if((w|0)<0){Xd(k);kb=c[o>>2]|0}else kb=w;V=c[p>>2]|0;R=W<<24;if(V>>>0<R>>>0){lb=0;mb=W;nb=V}else{lb=1;mb=(c[m>>2]|0)-W|0;nb=V-R|0}R=d[16+mb>>0]|0;U=mb<<R;w=kb-R|0;c[p>>2]=nb<<R;c[o>>2]=w;c[m>>2]=U;y=a[4967+(lb+T)>>0]|0}while(y<<24>>24>0);c[X+12+(Y<<2)>>2]=0-(y<<24>>24);Y=Y+1|0}while((Y|0)!=16);ob=c[m>>2]|0;pb=c[o>>2]|0;qb=0}else{ob=ca;pb=da;qb=0}do{Y=qb<<24>>24;u=((S(d[4055+(Y>>1)>>0]|0,ob+-1|0)|0)>>>8)+1|0;if((pb|0)<0){Xd(k);rb=c[o>>2]|0}else rb=pb;r=c[p>>2]|0;$=u<<24;if(r>>>0<$>>>0){sb=0;tb=u;ub=r}else{sb=1;tb=(c[m>>2]|0)-u|0;ub=r-$|0}$=d[16+tb>>0]|0;ob=tb<<$;pb=rb-$|0;c[p>>2]=ub<<$;c[o>>2]=pb;c[m>>2]=ob;qb=a[5001+(sb+Y)>>0]|0}while(qb<<24>>24>0);a[X+1>>0]=0-(qb&255)}else{da=((S((c[m>>2]|0)+-1|0,d[xa>>0]|0)|0)>>>8)+1|0;ca=c[o>>2]|0;if((ca|0)<0){Xd(k);vb=c[o>>2]|0}else vb=ca;ca=c[p>>2]|0;Y=da<<24;if(ca>>>0<Y>>>0){wb=0;xb=da;yb=ca}else{wb=1;xb=(c[m>>2]|0)-da|0;yb=ca-Y|0}Y=d[16+xb>>0]|0;ca=xb<<Y;da=yb<<Y;$=vb-Y|0;c[p>>2]=da;c[o>>2]=$;c[m>>2]=ca;Y=X+2|0;a[Y>>0]=wb;if(!(wb<<24>>24)){c[X+4>>2]=0;r=c[m>>2]|0;u=c[o>>2]|0;ea=0;do{fa=ea<<24>>24;U=((S(d[(fa>>1)+(f+10323)>>0]|0,r+-1|0)|0)>>>8)+1|0;if((u|0)<0){Xd(k);zb=c[o>>2]|0}else zb=u;w=c[p>>2]|0;T=U<<24;if(w>>>0<T>>>0){Ab=0;Bb=U;Cb=w}else{Ab=1;Bb=(c[m>>2]|0)-U|0;Cb=w-T|0}T=d[16+Bb>>0]|0;r=Bb<<T;u=zb-T|0;c[p>>2]=Cb<<T;c[o>>2]=u;c[m>>2]=r;ea=a[4985+(Ab+fa)>>0]|0}while(ea<<24>>24>0);fa=0-(ea<<24>>24)|0;a[X>>0]=fa;if((fa&255|0)==4){a[_>>0]=1;fa=r;T=u;w=0;while(1){U=fa;R=T;V=0;do{W=V<<24>>24;O=((S(d[(W>>1)+(f+10314)>>0]|0,U+-1|0)|0)>>>8)+1|0;if((R|0)<0){Xd(k);Db=c[o>>2]|0}else Db=R;Q=c[p>>2]|0;N=O<<24;if(Q>>>0<N>>>0){Eb=0;Fb=O;Gb=Q}else{Eb=1;Fb=(c[m>>2]|0)-O|0;Gb=Q-N|0}N=d[16+Fb>>0]|0;U=Fb<<N;R=Db-N|0;c[p>>2]=Gb<<N;c[o>>2]=R;c[m>>2]=U;V=a[4967+(Eb+W)>>0]|0}while(V<<24>>24>0);c[X+12+(w<<2)>>2]=0-(V<<24>>24);w=w+1|0;U=c[m>>2]|0;R=c[o>>2]|0;if((w|0)==16){Hb=U;Ib=R;Jb=0;break}else{fa=U;T=R}}}else{Hb=r;Ib=u;Jb=0}do{T=Jb<<24>>24;fa=((S(d[(T>>1)+(f+10327)>>0]|0,Hb+-1|0)|0)>>>8)+1|0;if((Ib|0)<0){Xd(k);Kb=c[o>>2]|0}else Kb=Ib;w=c[p>>2]|0;ea=fa<<24;if(w>>>0<ea>>>0){Lb=0;Mb=fa;Nb=w}else{Lb=1;Mb=(c[m>>2]|0)-fa|0;Nb=w-ea|0}ea=d[16+Mb>>0]|0;Hb=Mb<<ea;Ib=Kb-ea|0;c[p>>2]=Nb<<ea;c[o>>2]=Ib;c[m>>2]=Hb;Jb=a[5001+(Lb+T)>>0]|0}while(Jb<<24>>24>0);a[X+1>>0]=0-(Jb&255);break}u=0-(c[x>>2]|0)|0;r=X+(u*76|0)|0;T=r+-76|0;ea=X+10|0;a[ea>>0]=0;w=((S(d[wa>>0]|0,ca+-1|0)|0)>>>8)+1|0;if(($|0)<0){Xd(k);Ob=c[p>>2]|0;Pb=c[o>>2]|0}else{Ob=da;Pb=$}fa=w<<24;if(Ob>>>0<fa>>>0){Qb=1;Rb=w;Sb=Ob}else{Qb=0;Rb=(c[m>>2]|0)-w|0;Sb=Ob-fa|0}fa=d[16+Rb>>0]|0;w=Rb<<fa;R=Sb<<fa;U=Pb-fa|0;c[p>>2]=R;c[o>>2]=U;c[m>>2]=w;if(!Qb){fa=((S(d[qa>>0]|0,w+-1|0)|0)>>>8)+1|0;if((U|0)<0){Xd(k);Tb=c[p>>2]|0;Ub=c[o>>2]|0}else{Tb=R;Ub=U}U=fa<<24;if(Tb>>>0<U>>>0){Vb=2;Wb=fa;Xb=Tb}else{Vb=3;Wb=(c[m>>2]|0)-fa|0;Xb=Tb-U|0}U=d[16+Wb>>0]|0;c[p>>2]=Xb<<U;c[o>>2]=Ub-U;c[m>>2]=Wb<<U;a[Y>>0]=Vb}c[aa>>2]=0;c[ha>>2]=0;c[i>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;U=a[X+(u*76|0)+2>>0]|0;fa=U&255;if(!(U<<24>>24)){Yb=h;Zb=i}else{U=c[X+(u*76|0)+4>>2]|0;do if(!U){_b=h;$b=i}else{c[ha>>2]=U;if((c[f+9172+(d[Y>>0]<<2)>>2]|0)==(c[f+9172+(fa<<2)>>2]|0)){_b=sa;$b=ha;break}b[ha>>1]=0-U;b[ta>>1]=0-(U>>>16);_b=sa;$b=ha}while(0);c[_b>>2]=(c[_b>>2]|0)+2;Yb=_b;Zb=$b}U=a[X+-74>>0]|0;if(!(U<<24>>24)){ac=Yb;bc=Zb}else{fa=c[X+-72>>2]|0;do if(!fa){cc=h;dc=Yb;ec=Zb}else{$=fa>>>16;da=(c[f+9172+(d[Y>>0]<<2)>>2]|0)==(c[f+9172+((U&255)<<2)>>2]|0);ca=(da?$:0-$|0)<<16|(da?fa:0-fa|0)&65535;if((ca|0)==(c[Zb>>2]|0)){cc=Yb;dc=Yb;ec=Zb;break}da=Zb+4|0;c[da>>2]=ca;ca=Yb+4|0;cc=ca;dc=ca;ec=da}while(0);c[cc>>2]=(c[cc>>2]|0)+2;ac=dc;bc=ec}fa=a[T+2>>0]|0;if(!(fa<<24>>24))fc=bc;else{U=c[T+4>>2]|0;do if(!U){gc=h;hc=bc}else{da=U>>>16;ca=(c[f+9172+(d[Y>>0]<<2)>>2]|0)==(c[f+9172+((fa&255)<<2)>>2]|0);$=(ca?da:0-da|0)<<16|(ca?U:0-U|0)&65535;if(($|0)==(c[bc>>2]|0)){gc=ac;hc=bc;break}ca=bc+4|0;c[ca>>2]=$;gc=ac+4|0;hc=ca}while(0);c[gc>>2]=(c[gc>>2]|0)+1;fc=hc}U=c[h>>2]|0;fa=((S((c[m>>2]|0)+-1|0,c[408+(U<<4)>>2]|0)|0)>>>8)+1|0;Y=c[o>>2]|0;if((Y|0)<0){Xd(k);ic=c[o>>2]|0}else ic=Y;Y=c[p>>2]|0;ca=fa<<24;if(Y>>>0<ca>>>0){jc=1;kc=fa;lc=Y}else{jc=0;kc=(c[m>>2]|0)-fa|0;lc=Y-ca|0}ca=d[16+kc>>0]|0;Y=kc<<ca;fa=lc<<ca;$=ic-ca|0;c[p>>2]=fa;c[o>>2]=$;c[m>>2]=Y;do if(jc){a[X>>0]=7;c[X+4>>2]=0}else{ca=c[va>>2]|0;da=(((c[ja>>2]|0)>0?(c[fc>>2]|0)==(ca|0):0)&1)+(c[sa>>2]|0)|0;c[sa>>2]=da;R=c[ya>>2]|0;if((R|0)>(da|0)){c[sa>>2]=R;c[ya>>2]=da;w=c[aa>>2]|0;c[va>>2]=w;c[aa>>2]=ca;mc=R;nc=da;oc=w}else{mc=da;nc=R;oc=ca}ca=((S(c[408+(mc<<4)+4>>2]|0,Y+-1|0)|0)>>>8)+1|0;if(($|0)<0){Xd(k);pc=c[p>>2]|0;qc=c[o>>2]|0}else{pc=fa;qc=$}R=ca<<24;if(pc>>>0<R>>>0){rc=1;sc=ca;tc=pc}else{rc=0;sc=(c[m>>2]|0)-ca|0;tc=pc-R|0}R=d[16+sc>>0]|0;ca=sc<<R;da=tc<<R;w=qc-R|0;c[p>>2]=da;c[o>>2]=w;c[m>>2]=ca;if(rc){a[X>>0]=5;R=X+4|0;c[R>>2]=oc;y=R+2|0;W=oc>>16;N=(c[Da>>2]|0)+-128|0;if((W|0)>=(N|0)){Q=(c[Ca>>2]|0)+128|0;if((W|0)>(Q|0)){uc=Q;vc=256}}else{uc=N;vc=256}if((vc|0)==256){vc=0;b[y>>1]=uc}y=oc<<16>>16;N=(c[ka>>2]|0)+-128|0;if((y|0)>=(N|0)){Q=(c[Ha>>2]|0)+128|0;if((y|0)>(Q|0))wc=Q;else break}else wc=N;b[R>>1]=wc;break}R=((S(c[408+(nc<<4)+8>>2]|0,ca+-1|0)|0)>>>8)+1|0;if((w|0)<0){Xd(k);xc=c[p>>2]|0;yc=c[o>>2]|0}else{xc=da;yc=w}w=R<<24;if(xc>>>0<w>>>0){zc=1;Ac=R;Bc=xc}else{zc=0;Ac=(c[m>>2]|0)-R|0;Bc=xc-w|0}w=d[16+Ac>>0]|0;R=Ac<<w;da=Bc<<w;ca=yc-w|0;c[p>>2]=da;c[o>>2]=ca;c[m>>2]=R;if(zc){a[X>>0]=6;w=c[aa>>2]|0;N=X+4|0;c[N>>2]=w;Q=N+2|0;y=w>>16;W=(c[Da>>2]|0)+-128|0;if((y|0)>=(W|0)){O=(c[Ca>>2]|0)+128|0;if((y|0)>(O|0)){Cc=O;vc=250}}else{Cc=W;vc=250}if((vc|0)==250){vc=0;b[Q>>1]=Cc}Q=w<<16>>16;w=(c[ka>>2]|0)+-128|0;if((Q|0)>=(w|0)){W=(c[Ha>>2]|0)+128|0;if((Q|0)>(W|0))Dc=W;else break}else Dc=w;b[N>>1]=Dc;break}N=(c[ka>>2]|0)+-128|0;w=(c[Ha>>2]|0)+128|0;W=(c[Ca>>2]|0)+128|0;Q=(c[Da>>2]|0)+-128|0;O=i+(((mc|0)>=(U|0)&1)<<2)|0;y=O+2|0;P=b[y>>1]|0;M=P<<16>>16;if((M|0)>=(Q|0))if((M|0)>(W|0)){Ec=W;vc=194}else Fc=P;else{Ec=Q;vc=194}if((vc|0)==194){vc=0;P=Ec&65535;b[y>>1]=P;Fc=P}P=b[O>>1]|0;y=P<<16>>16;if((y|0)>=(N|0))if((y|0)>(w|0)){Gc=w;vc=197}else Hc=P;else{Gc=N;vc=197}if((vc|0)==197){vc=0;P=Gc&65535;b[O>>1]=P;Hc=P}P=X+-76|0;y=((a[P>>0]|0)==9&1)+((a[r>>0]|0)==9&1)<<1|(a[T>>0]|0)==9;c[ja>>2]=y;M=((S(c[408+(y<<4)+12>>2]|0,R+-1|0)|0)>>>8)+1|0;if((ca|0)<0){Xd(k);Ic=c[p>>2]|0;Jc=c[o>>2]|0}else{Ic=da;Jc=ca}ca=M<<24;if(Ic>>>0<ca>>>0){Kc=1;Lc=M;Mc=Ic}else{Kc=0;Lc=(c[m>>2]|0)-M|0;Mc=Ic-ca|0}ca=d[16+Lc>>0]|0;M=Lc<<ca;da=Mc<<ca;R=Jc-ca|0;c[p>>2]=da;c[o>>2]=R;c[m>>2]=M;if(Kc){ca=X+4|0;b[ca>>1]=(Zd(k,ua)|0)<<1;y=(Zd(k,ra)|0)<<1;J=(e[ca>>1]|0)+(Hc&65535)|0;b[ca>>1]=J;L=(y&65534)+(Fc&65535)|0;b[ca+2>>1]=L;ca=L<<16>>16;L=J<<16>>16;a[ea>>0]=((L|0)>(w|0)|((L|0)<(N|0)|((ca|0)<(Q|0)|(ca|0)>(W|0))))&1;a[X>>0]=8;break}ca=c[O>>2]|0;O=ca>>>16;L=(((M*110|0)+-110|0)>>>8)+1|0;if((R|0)<0){Xd(k);Nc=c[p>>2]|0;Oc=c[o>>2]|0}else{Nc=da;Oc=R}R=L<<24;if(Nc>>>0<R>>>0){Pc=1;Qc=L;Rc=Nc}else{Pc=0;Qc=(c[m>>2]|0)-L|0;Rc=Nc-R|0}R=d[16+Qc>>0]|0;L=Qc<<R;da=Rc<<R;M=Oc-R|0;c[p>>2]=da;c[o>>2]=M;c[m>>2]=L;do if(Pc){Sc=16;Tc=3}else{R=(((L*111|0)+-111|0)>>>8)+1|0;if((M|0)<0){Xd(k);Uc=c[p>>2]|0;Vc=c[o>>2]|0}else{Uc=da;Vc=M}J=R<<24;if(Uc>>>0<J>>>0){Wc=1;Xc=R;Yc=Uc}else{Wc=0;Xc=(c[m>>2]|0)-R|0;Yc=Uc-J|0}J=d[16+Xc>>0]|0;R=Xc<<J;y=Yc<<J;I=Vc-J|0;c[p>>2]=y;c[o>>2]=I;c[m>>2]=R;if(Wc){Sc=4;Tc=2;break}J=(((R*150|0)+-150|0)>>>8)+1|0;if((I|0)<0){Xd(k);Zc=c[p>>2]|0;_c=c[o>>2]|0}else{Zc=y;_c=I}I=J<<24;if(Zc>>>0<I>>>0){$c=0;ad=J;bd=Zc}else{$c=1;ad=(c[m>>2]|0)-J|0;bd=Zc-I|0}I=d[16+ad>>0]|0;c[p>>2]=bd<<I;c[o>>2]=_c-I;c[m>>2]=ad<<I;Sc=2;Tc=$c}while(0);M=X+-72|0;da=X+(u*76|0)+4|0;L=5307+Tc|0;V=0;do{I=d[5100+(Tc<<4)+V>>0]|0;if(!(I&3))cd=(a[P>>0]|0)!=9?M:X+-64+(I<<2)+12|0;else cd=X+12+(I<<2)+-4|0;J=c[cd>>2]|0;if(!(I&252))dd=(a[r>>0]|0)!=9?da:X+(u*76|0)+12+(I<<2)+48|0;else dd=X+12+(I<<2)+-16|0;I=c[dd>>2]|0;y=(J|0)==(I|0)|((J|0)==0&1)<<1|((I|0)==0&1)<<2;R=((S((c[m>>2]|0)+-1|0,d[5283+(y*3|0)>>0]|0)|0)>>>8)+1|0;K=c[o>>2]|0;if((K|0)<0){Xd(k);ed=c[o>>2]|0}else ed=K;K=c[p>>2]|0;H=R<<24;if(K>>>0<H>>>0){fd=1;gd=R;hd=K}else{fd=0;gd=(c[m>>2]|0)-R|0;hd=K-H|0}H=d[16+gd>>0]|0;K=gd<<H;R=hd<<H;n=ed-H|0;c[p>>2]=R;c[o>>2]=n;c[m>>2]=K;do if(fd){id=J&65535;jd=J>>>16&65535}else{H=((S(d[5283+(y*3|0)+1>>0]|0,K+-1|0)|0)>>>8)+1|0;if((n|0)<0){Xd(k);kd=c[p>>2]|0;ld=c[o>>2]|0}else{kd=R;ld=n}E=H<<24;if(kd>>>0<E>>>0){md=1;nd=H;od=kd}else{md=0;nd=(c[m>>2]|0)-H|0;od=kd-E|0}E=d[16+nd>>0]|0;H=nd<<E;v=od<<E;B=ld-E|0;c[p>>2]=v;c[o>>2]=B;c[m>>2]=H;if(md){id=I&65535;jd=I>>>16&65535;break}E=((S(d[5283+(y*3|0)+2>>0]|0,H+-1|0)|0)>>>8)+1|0;if((B|0)<0){Xd(k);pd=c[p>>2]|0;qd=c[o>>2]|0}else{pd=v;qd=B}B=E<<24;if(pd>>>0<B>>>0){rd=1;sd=E;td=pd}else{rd=0;sd=(c[m>>2]|0)-E|0;td=pd-B|0}B=d[16+sd>>0]|0;c[p>>2]=td<<B;c[o>>2]=qd-B;c[m>>2]=sd<<B;if(rd){id=0;jd=0;break}B=((Zd(k,ua)|0)<<1)+ca&65535;id=B;jd=((Zd(k,ra)|0)<<1)+O&65535}while(0);y=jd<<16>>16;I=id<<16>>16;a[ea>>0]=((I|0)>(w|0)|((y|0)<(Q|0)|(y|0)>(W|0)|(I|0)<(N|0)))&1|d[ea>>0];I=d[L>>0]|0;y=(jd&65535)<<16|id&65535;n=I;R=(S(I,V)|0)+(5311+(Tc<<4))|0;while(1){c[X+12+(d[R>>0]<<2)>>2]=y;n=n+-1|0;if(!n)break;else R=R+1|0}V=V+1|0}while((V|0)<(Sc|0));a[X+8>>0]=Tc;c[X+4>>2]=c[X+72>>2];a[X>>0]=9;a[_>>0]=1}while(0)}while(0);c[Da>>2]=(c[Da>>2]|0)+-128;c[Ca>>2]=(c[Ca>>2]|0)+-128;X=X+76|0;j=j+1|0;ud=c[Ea>>2]|0}while((j|0)<(ud|0));vd=c[ka>>2]|0;wd=c[Ha>>2]|0;xd=c[Ga>>2]|0;yd=ud;zd=X}else{vd=Ia;wd=Fa;xd=la;yd=ga;zd=Z}Ia=vd+-128|0;c[ka>>2]=Ia;Fa=wd+-128|0;c[Ha>>2]=Fa;Ba=Ba+1|0;if((Ba|0)>=(xd|0))break;else{la=xd;ga=yd;Z=zd+76|0}}l=g;return}function Zd(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;f=b+16|0;g=((S((c[f>>2]|0)+-1|0,d[e>>0]|0)|0)>>>8)+1|0;h=b+12|0;i=c[h>>2]|0;if((i|0)<0){Xd(b);j=c[h>>2]|0}else j=i;i=b+8|0;k=c[i>>2]|0;l=g<<24;if(k>>>0<l>>>0){m=1;n=g;o=k}else{m=0;n=(c[f>>2]|0)-g|0;o=k-l|0}l=d[16+n>>0]|0;k=n<<l;n=o<<l;o=j-l|0;c[i>>2]=n;c[h>>2]=o;c[f>>2]=k;do if(m){l=e+2|0;j=k;g=o;p=n;q=0;do{r=q<<24>>24;s=((S(d[l+(r>>1)>>0]|0,j+-1|0)|0)>>>8)+1|0;if((g|0)<0){Xd(b);t=c[i>>2]|0;u=c[h>>2]|0}else{t=p;u=g}v=s<<24;if(t>>>0<v>>>0){w=0;x=s;y=t}else{w=1;x=(c[f>>2]|0)-s|0;y=t-v|0}v=d[16+x>>0]|0;j=x<<v;p=y<<v;g=u-v|0;c[i>>2]=p;c[h>>2]=g;c[f>>2]=j;q=a[5007+(w+r)>>0]|0}while(q<<24>>24>0);z=j;A=g;B=p;C=0-(q<<24>>24)|0}else{l=((S(k+-1|0,d[e+9>>0]|0)|0)>>>8)+1|0;if((o|0)<0){Xd(b);D=c[h>>2]|0;E=c[i>>2]|0}else{D=o;E=n}r=l<<24;if(E>>>0<r>>>0){F=0;G=l;H=E}else{F=1;G=(c[f>>2]|0)-l|0;H=E-r|0}r=d[16+G>>0]|0;l=G<<r;v=H<<r;s=D-r|0;c[i>>2]=v;c[h>>2]=s;c[f>>2]=l;r=((S(l+-1|0,d[e+10>>0]|0)|0)>>>8)+1|0;if((s|0)<0){Xd(b);I=c[i>>2]|0;J=c[h>>2]|0}else{I=v;J=s}s=r<<24;if(I>>>0<s>>>0){K=0;L=r;M=I}else{K=2;L=(c[f>>2]|0)-r|0;M=I-s|0}s=d[16+L>>0]|0;r=L<<s;v=M<<s;l=J-s|0;c[i>>2]=v;c[h>>2]=l;c[f>>2]=r;s=((S(r+-1|0,d[e+11>>0]|0)|0)>>>8)+1|0;if((l|0)<0){Xd(b);N=c[i>>2]|0;O=c[h>>2]|0}else{N=v;O=l}l=s<<24;if(N>>>0<l>>>0){P=0;Q=s;R=N}else{P=4;Q=(c[f>>2]|0)-s|0;R=N-l|0}l=d[16+Q>>0]|0;s=Q<<l;v=R<<l;r=O-l|0;c[i>>2]=v;c[h>>2]=r;c[f>>2]=s;l=s;s=r;r=v;v=9;T=P|(K|F);do{U=((S(l+-1|0,d[e+(v+9)>>0]|0)|0)>>>8)+1|0;if((s|0)<0){Xd(b);V=c[i>>2]|0;W=c[h>>2]|0}else{V=r;W=s}X=U<<24;if(V>>>0<X>>>0){Y=0;Z=U;_=V}else{Y=1;Z=(c[f>>2]|0)-U|0;_=V-X|0}X=d[16+Z>>0]|0;l=Z<<X;r=_<<X;s=W-X|0;c[i>>2]=r;c[h>>2]=s;c[f>>2]=l;T=(Y<<v)+T|0;v=v+-1|0}while((v|0)>3);if(T&65520){v=((S(d[e+12>>0]|0,l+-1|0)|0)>>>8)+1|0;if((s|0)<0){Xd(b);$=c[i>>2]|0;aa=c[h>>2]|0}else{$=r;aa=s}q=v<<24;if($>>>0<q>>>0){ba=1;ca=v;da=$}else{ba=0;ca=(c[f>>2]|0)-v|0;da=$-q|0}q=d[16+ca>>0]|0;v=ca<<q;p=da<<q;g=aa-q|0;c[i>>2]=p;c[h>>2]=g;c[f>>2]=v;if(ba){z=v;A=g;B=p;C=T;break}else{ea=p;fa=g;ga=v}}else{ea=r;fa=s;ga=l}z=ga;A=fa;B=ea;C=T+8|0}while(0);if(!C)return 0;ea=((S(z+-1|0,d[e+1>>0]|0)|0)>>>8)+1|0;if((A|0)<0){Xd(b);ha=c[i>>2]|0;ia=c[h>>2]|0}else{ha=B;ia=A}A=ea<<24;if(ha>>>0<A>>>0){ja=1;ka=ea;la=ha;ma=16+ka|0;na=a[ma>>0]|0;oa=na&255;pa=ka<<oa;qa=la<<oa;ra=ia-oa|0;c[i>>2]=qa;c[h>>2]=ra;c[f>>2]=pa;sa=0-C|0;ta=ja?C:sa;return ta|0}ja=0;ka=(c[f>>2]|0)-ea|0;la=ha-A|0;ma=16+ka|0;na=a[ma>>0]|0;oa=na&255;pa=ka<<oa;qa=la<<oa;ra=ia-oa|0;c[i>>2]=qa;c[h>>2]=ra;c[f>>2]=pa;sa=0-C|0;ta=ja?C:sa;return ta|0}function _d(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+5748|0;e=a+5752|0;f=a+5760|0;g=a+5756|0;h=a+5764|0;i=0;do{b[a+3504+(i<<2)>>1]=sd(i,c[d>>2]|0)|0;b[a+4016+(i<<2)>>1]=td(i,c[e>>2]|0)|0;b[a+4528+(i<<2)>>1]=ud(i,c[f>>2]|0)|0;b[a+3504+(i<<2)+2>>1]=vd(i)|0;b[a+4016+(i<<2)+2>>1]=wd(i,c[g>>2]|0)|0;b[a+4528+(i<<2)+2>>1]=xd(i,c[h>>2]|0)|0;i=i+1|0}while((i|0)!=128);return}function $d(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0;if(!(a[f+3148>>0]|0))g=c[e+5744>>2]|0;else{h=a[(d[(c[f+3088>>2]|0)+11>>0]|0)+(f+3155)>>0]|0;if((a[f+3151>>0]|0)==1)i=h;else i=(c[e+5744>>2]|0)+h|0;g=(i|0)>-1?((i|0)<127?i:127):0}b[f+2048>>1]=1;b[f+2016>>1]=b[e+3504+(g<<2)>>1]|0;b[f+2080>>1]=b[e+4016+(g<<2)>>1]|0;b[f+2112>>1]=b[e+4528+(g<<2)>>1]|0;i=e+3504+(g<<2)+2|0;h=e+4016+(g<<2)+2|0;j=e+4528+(g<<2)+2|0;g=1;do{e=b[i>>1]|0;b[f+2016+(g<<1)>>1]=e;b[f+2048+(g<<1)>>1]=e;b[f+2080+(g<<1)>>1]=b[h>>1]|0;b[f+2112+(g<<1)>>1]=b[j>>1]|0;g=g+1|0}while((g|0)!=16);return}function ae(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Cc=0,Dc=0,Ic=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Vc=0,Zc=0,_c=0,$c=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,Ad=0,Dd=0,Ed=0,Fd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Zd=0,$d=0,ae=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0,oe=0,pe=0,qe=0,re=0,se=0,te=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0,Ee=0,Fe=0,Ge=0,He=0,Ie=0,Je=0,Ke=0,Le=0,Me=0,Ne=0,Oe=0,Pe=0,Qe=0,Re=0,Se=0,Te=0,Ue=0,Ve=0,We=0,Xe=0,Ye=0,Ze=0,_e=0,$e=0,af=0,bf=0,cf=0,df=0,ef=0,ff=0,gf=0,hf=0,jf=0,kf=0,lf=0,mf=0,nf=0,of=0,pf=0,qf=0,rf=0,sf=0,tf=0,uf=0,vf=0,wf=0,xf=0,yf=0,zf=0,Af=0,Bf=0,Cf=0,Df=0,Ef=0,Ff=0,Gf=0,Hf=0,If=0,Jf=0,Kf=0,Lf=0,Mf=0,Nf=0,Of=0,Pf=0,Qf=0,Rf=0,Sf=0,Tf=0,Uf=0,Vf=0,Wf=0,Xf=0,Yf=0,Zf=0,_f=0,$f=0,ag=0,bg=0,cg=0,dg=0,eg=0,fg=0,gg=0,hg=0,ig=0,jg=0,kg=0,lg=0,mg=0,ng=0,og=0,pg=0,qg=0,rg=0,sg=0,tg=0,ug=0,vg=0,wg=0,xg=0,yg=0,zg=0,Ag=0,Bg=0,Cg=0,Dg=0,Eg=0,Fg=0,Gg=0,Hg=0,Ig=0,Jg=0,Kg=0,Lg=0,Mg=0,Ng=0,Og=0,Pg=0,Qg=0,Rg=0,Tg=0,Ug=0,Vg=0,Wg=0,Xg=0,Zg=0,_g=0,$g=0,ah=0,bh=0,ch=0,dh=0,eh=0,fh=0,gh=0,hh=0,ih=0,jh=0,kh=0,lh=0,mh=0,nh=0,oh=0,ph=0,qh=0,rh=0,sh=0,th=0,uh=0,vh=0,wh=0,xh=0,yh=0,zh=0,Ah=0,Bh=0,Ch=0,Dh=0,Eh=0,Fh=0,Gh=0,Hh=0,Ih=0,Jh=0,Kh=0,Lh=0,Mh=0,Nh=0,Oh=0,Ph=0,Qh=0,Rh=0,Sh=0,Th=0,Uh=0,Vh=0,Wh=0,Xh=0,Yh=0,Zh=0,_h=0,$h=0,ai=0,bi=0,ci=0,di=0,ei=0,fi=0,gi=0,hi=0,ii=0,ji=0,ki=0,li=0,mi=0,ni=0;f=l;l=l+144|0;g=f+72|0;h=f+64|0;i=f+56|0;j=f+48|0;k=f+40|0;m=f+32|0;n=f+24|0;o=f+16|0;p=f+8|0;q=f;r=f+96|0;s=f+80|0;t=e+11680|0;u=e+3248|0;v=e+11740|0;w=c[v>>2]|0;x=e+11776|0;y=c[x>>2]|0;z=e+11980|0;A=c[z>>2]|0;B=e+3232|0;C=c[B>>2]|0;D=e+3220|0;c[D>>2]=0;E=C+112|0;c[E>>2]=0;F=w+y|0;if((y|0)<3){if(!(c[e+11972>>2]|0))Qb(u,7,5375,q);c[e+5700>>2]=1;c[e+11432>>2]=0;c[e+5704>>2]=1;G=w;H=0}else{q=c[e+11988>>2]|0;if(!q)I=w;else{Eb[q&31](c[e+11992>>2]|0,w,r,y>>>0<10?y:10);I=r}q=e+5700|0;c[q>>2]=a[I>>0]&1;c[e+11432>>2]=(d[I>>0]|0)>>>1&7;c[e+5704>>2]=(d[I>>0]|0)>>>4&1;J=(d[I+1>>0]<<8|d[I>>0]|d[I+2>>0]<<16)>>>5;K=e+11972|0;if((c[K>>2]|0)==0&(J|0)>(y|0))Qb(u,7,5392,p);p=I+3|0;Bc(u);if(!(c[q>>2]|0)){q=c[K>>2]|0;do if((y|0)>6|(q|0)==0){if(((a[p>>0]|0)==-99?(a[I+4>>0]|0)==1:0)?(a[I+5>>0]|0)==42:0){L=q;break}Qb(u,5,5439,o);L=c[K>>2]|0}else L=q;while(0);if((y|0)>9|(L|0)==0){L=I+7|0;c[e+5040>>2]=d[L>>0]<<8&16128|d[I+6>>0];c[e+5048>>2]=(d[L>>0]|0)>>>6;L=I+9|0;c[e+5044>>2]=d[L>>0]<<8&16128|d[I+8>>0];c[e+5052>>2]=(d[L>>0]|0)>>>6}M=w+10|0}else{L=w+3|0;N=e+2848|0;O=C;P=N+120|0;do{c[N>>2]=c[O>>2];N=N+4|0;O=O+4|0}while((N|0)<(P|0));N=e+2968|0;O=C;P=N+120|0;do{c[N>>2]=c[O>>2];N=N+4|0;O=O+4|0}while((N|0)<(P|0));M=L}G=M;H=J}J=e+11976|0;M=e+5700|0;L=c[M>>2]|0;w=(L|0)==0;if(!(c[J>>2]|0))if(w)Q=23;else{R=-1;l=f;return R|0}else if(!w){w=(c[e+5736>>2]|0)==0;c[e+3200>>2]=w?1:2;c[e+3204>>2]=w?3:4;c[e+3208>>2]=w?5:6;c[e+3212>>2]=w?7:8;if((c[e+11968>>2]|0)!=0?(w=e+11972|0,(c[w>>2]|0)==0):0){c[w>>2]=1;T=L}else T=L}else Q=23;if((Q|0)==23){N=e+11389|0;O=5062;P=N+38|0;do{a[N>>0]=a[O>>0]|0;N=N+1|0;O=O+1|0}while((N|0)<(P|0));Hc(u);Gc(u);O=e+3155|0;L=O;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;L=O+4|0;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;a[e+3151>>0]=0;L=e+3169|0;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;L=e+3177|0;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;c[e+9152>>2]=1;c[e+9156>>2]=1;c[e+9160>>2]=0;c[e+9164>>2]=0;c[e+9180>>2]=0;c[e+9184>>2]=0;T=c[M>>2]|0}L=e+3144|0;c[L>>2]=e+9192;O=c[e+5772>>2]|0;w=e+3088|0;c[w>>2]=O;c[e+3096>>2]=T;a[O>>0]=0;c[e+3092>>2]=c[e+5724>>2];c[D>>2]=0;c[e+2844>>2]=(c[e+5740>>2]|0)==0?-1:-8;O=e+11988|0;T=e+11992|0;if(Wd(t,G,F-G|0,c[O>>2]|0,c[T>>2]|0)|0)Qb(u,2,5463,n);n=e+11696|0;F=c[n>>2]|0;if(!(c[M>>2]|0)){I=(((F<<7)+-128|0)>>>8)+1|0;y=e+11692|0;q=c[y>>2]|0;if((q|0)<0){Xd(t);U=c[y>>2]|0}else U=q;q=e+11688|0;K=c[q>>2]|0;o=I<<24;if(K>>>0<o>>>0){V=I;W=K}else{V=(c[n>>2]|0)-I|0;W=K-o|0}o=d[16+V>>0]|0;K=V<<o;V=W<<o;W=U-o|0;c[q>>2]=V;c[y>>2]=W;c[n>>2]=K;o=(((K<<7)+-128|0)>>>8)+1|0;if((W|0)<0){Xd(t);X=c[q>>2]|0;Y=c[y>>2]|0}else{X=V;Y=W}W=o<<24;if(X>>>0<W>>>0){Z=0;_=o;$=X}else{Z=1;_=(c[n>>2]|0)-o|0;$=X-W|0}W=d[16+_>>0]|0;X=_<<W;_=Y-W|0;c[q>>2]=$<<W;c[y>>2]=_;c[n>>2]=X;c[e+5056>>2]=Z;aa=X;ba=_;ca=y}else{y=e+11692|0;aa=F;ba=c[y>>2]|0;ca=y}y=(((aa<<7)+-128|0)>>>8)+1|0;if((ba|0)<0){Xd(t);da=c[ca>>2]|0}else da=ba;ba=e+11688|0;aa=c[ba>>2]|0;F=y<<24;if(aa>>>0<F>>>0){ea=0;fa=y;ga=aa}else{ea=1;fa=(c[n>>2]|0)-y|0;ga=aa-F|0}F=d[16+fa>>0]|0;aa=fa<<F;fa=ga<<F;ga=da-F|0;c[ba>>2]=fa;c[ca>>2]=ga;c[n>>2]=aa;F=e+3148|0;a[F>>0]=ea;if(ea<<24>>24){ea=(((aa<<7)+-128|0)>>>8)+1|0;if((ga|0)<0){Xd(t);ha=c[ba>>2]|0;ia=c[ca>>2]|0}else{ha=fa;ia=ga}ga=ea<<24;if(ha>>>0<ga>>>0){ja=0;ka=ea;la=ha}else{ja=1;ka=(c[n>>2]|0)-ea|0;la=ha-ga|0}ga=d[16+ka>>0]|0;ha=ka<<ga;ka=la<<ga;la=ia-ga|0;c[ba>>2]=ka;c[ca>>2]=la;c[n>>2]=ha;ga=e+3149|0;a[ga>>0]=ja;ja=(((ha<<7)+-128|0)>>>8)+1|0;if((la|0)<0){Xd(t);ma=c[ba>>2]|0;na=c[ca>>2]|0}else{ma=ka;na=la}la=ja<<24;if(ma>>>0<la>>>0){oa=0;pa=ja;qa=ma}else{oa=1;pa=(c[n>>2]|0)-ja|0;qa=ma-la|0}la=d[16+pa>>0]|0;ma=pa<<la;pa=qa<<la;qa=na-la|0;c[ba>>2]=pa;c[ca>>2]=qa;c[n>>2]=ma;a[e+3150>>0]=oa;if(oa<<24>>24){oa=(((ma<<7)+-128|0)>>>8)+1|0;if((qa|0)<0){Xd(t);ra=c[ba>>2]|0;sa=c[ca>>2]|0}else{ra=pa;sa=qa}qa=oa<<24;if(ra>>>0<qa>>>0){ta=0;ua=oa;va=ra}else{ta=1;ua=(c[n>>2]|0)-oa|0;va=ra-qa|0}qa=d[16+ua>>0]|0;c[ba>>2]=va<<qa;c[ca>>2]=sa-qa;c[n>>2]=ua<<qa;a[e+3151>>0]=ta;ta=e+3155|0;qa=ta;a[qa>>0]=0;a[qa+1>>0]=0;a[qa+2>>0]=0;a[qa+3>>0]=0;qa=ta+4|0;a[qa>>0]=0;a[qa+1>>0]=0;a[qa+2>>0]=0;a[qa+3>>0]=0;qa=0;do{ta=400+(qa<<2)|0;ua=0;do{sa=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;va=c[ca>>2]|0;if((va|0)<0){Xd(t);wa=c[ca>>2]|0}else wa=va;va=c[ba>>2]|0;ra=sa<<24;if(va>>>0<ra>>>0){xa=1;ya=sa;za=va}else{xa=0;ya=(c[n>>2]|0)-sa|0;za=va-ra|0}ra=d[16+ya>>0]|0;va=ya<<ra;sa=za<<ra;oa=wa-ra|0;c[ba>>2]=sa;c[ca>>2]=oa;c[n>>2]=va;do if(xa){Aa=e+3155+(qa<<2)+ua|0;Ba=0;Q=78}else{ra=c[ta>>2]|0;if((ra|0)>0){pa=sa;ma=va;la=oa;na=ra;ra=0;while(1){ja=na;na=na+-1|0;ka=(((ma<<7)+-128|0)>>>8)+1|0;if((la|0)<0){Xd(t);Ca=c[ba>>2]|0;Da=c[ca>>2]|0}else{Ca=pa;Da=la}ha=ka<<24;if(Ca>>>0<ha>>>0){Ea=0;Fa=ka;Ga=Ca}else{Ea=1;Fa=(c[n>>2]|0)-ka|0;Ga=Ca-ha|0}ha=d[16+Fa>>0]|0;ma=Fa<<ha;pa=Ga<<ha;la=Da-ha|0;c[ba>>2]=pa;c[ca>>2]=la;c[n>>2]=ma;ha=Ea<<na|ra;if((ja|0)<=1){Ha=ha;break}else ra=ha}}else Ha=0;ra=e+3155+(qa<<2)+ua|0;a[ra>>0]=Ha;na=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;ma=c[ca>>2]|0;if((ma|0)<0){Xd(t);Ia=c[ca>>2]|0}else Ia=ma;ma=c[ba>>2]|0;la=na<<24;if(ma>>>0<la>>>0){Ja=1;Ka=na;La=ma}else{Ja=0;Ka=(c[n>>2]|0)-na|0;La=ma-la|0}la=d[16+Ka>>0]|0;c[ba>>2]=La<<la;c[ca>>2]=Ia-la;c[n>>2]=Ka<<la;if(Ja)break;Aa=ra;Ba=0-(d[ra>>0]|0)&255;Q=78}while(0);if((Q|0)==78){Q=0;a[Aa>>0]=Ba}ua=ua+1|0}while((ua|0)!=4);qa=qa+1|0}while((qa|0)!=2)}if(a[ga>>0]|0){ga=e+3152|0;b[ga>>1]=65535;a[ga+2>>0]=255;ga=0;do{qa=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;Ba=c[ca>>2]|0;if((Ba|0)<0){Xd(t);Ma=c[ca>>2]|0}else Ma=Ba;Ba=c[ba>>2]|0;Aa=qa<<24;if(Ba>>>0<Aa>>>0){Na=1;Oa=qa;Pa=Ba}else{Na=0;Oa=(c[n>>2]|0)-qa|0;Pa=Ba-Aa|0}Aa=d[16+Oa>>0]|0;Ba=Oa<<Aa;qa=Pa<<Aa;Ja=Ma-Aa|0;c[ba>>2]=qa;c[ca>>2]=Ja;c[n>>2]=Ba;if(!Na){Aa=Ba;Ba=Ja;Ja=qa;qa=8;Ka=0;do{Ia=qa;qa=qa+-1|0;La=(((Aa<<7)+-128|0)>>>8)+1|0;if((Ba|0)<0){Xd(t);Qa=c[ba>>2]|0;Ra=c[ca>>2]|0}else{Qa=Ja;Ra=Ba}Ha=La<<24;if(Qa>>>0<Ha>>>0){Sa=0;Ta=La;Ua=Qa}else{Sa=1;Ta=(c[n>>2]|0)-La|0;Ua=Qa-Ha|0}Ha=d[16+Ta>>0]|0;Aa=Ta<<Ha;Ja=Ua<<Ha;Ba=Ra-Ha|0;c[ba>>2]=Ja;c[ca>>2]=Ba;c[n>>2]=Aa;Ka=Sa<<qa|Ka}while((Ia|0)>1);a[e+3152+ga>>0]=Ka}ga=ga+1|0}while((ga|0)!=3)}}else{a[e+3149>>0]=0;a[e+3150>>0]=0}ga=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;Sa=c[ca>>2]|0;if((Sa|0)<0){Xd(t);Va=c[ca>>2]|0}else Va=Sa;Sa=c[ba>>2]|0;Ra=ga<<24;if(Sa>>>0<Ra>>>0){Wa=0;Xa=ga;Ya=Sa}else{Wa=1;Xa=(c[n>>2]|0)-ga|0;Ya=Sa-Ra|0}Ra=d[16+Xa>>0]|0;Sa=Xa<<Ra;Xa=Ya<<Ra;Ya=Va-Ra|0;c[ba>>2]=Xa;c[ca>>2]=Ya;c[n>>2]=Sa;Ra=e+5780|0;c[Ra>>2]=Wa;Wa=Sa;Sa=Ya;Ya=Xa;Xa=6;Va=0;do{ga=Xa;Xa=Xa+-1|0;Ua=(((Wa<<7)+-128|0)>>>8)+1|0;if((Sa|0)<0){Xd(t);Za=c[ba>>2]|0;_a=c[ca>>2]|0}else{Za=Ya;_a=Sa}Ta=Ua<<24;if(Za>>>0<Ta>>>0){$a=0;ab=Ua;bb=Za}else{$a=1;ab=(c[n>>2]|0)-Ua|0;bb=Za-Ta|0}Ta=d[16+ab>>0]|0;Wa=ab<<Ta;Ya=bb<<Ta;Sa=_a-Ta|0;c[ba>>2]=Ya;c[ca>>2]=Sa;c[n>>2]=Wa;Va=$a<<Xa|Va}while((ga|0)>1);Xa=e+9136|0;c[Xa>>2]=Va;Va=(((Wa<<7)+-128|0)>>>8)+1|0;if((Sa|0)<0){Xd(t);cb=c[ba>>2]|0;db=c[ca>>2]|0}else{cb=Ya;db=Sa}Sa=Va<<24;if(cb>>>0<Sa>>>0){eb=0;fb=Va;gb=cb}else{eb=4;fb=(c[n>>2]|0)-Va|0;gb=cb-Sa|0}Sa=d[16+fb>>0]|0;cb=fb<<Sa;fb=gb<<Sa;gb=db-Sa|0;c[ba>>2]=fb;c[ca>>2]=gb;c[n>>2]=cb;Sa=(((cb<<7)+-128|0)>>>8)+1|0;if((gb|0)<0){Xd(t);hb=c[ba>>2]|0;ib=c[ca>>2]|0}else{hb=fb;ib=gb}gb=Sa<<24;if(hb>>>0<gb>>>0){jb=0;kb=Sa;lb=hb}else{jb=2;kb=(c[n>>2]|0)-Sa|0;lb=hb-gb|0}gb=d[16+kb>>0]|0;hb=kb<<gb;kb=lb<<gb;lb=ib-gb|0;c[ba>>2]=kb;c[ca>>2]=lb;c[n>>2]=hb;gb=(((hb<<7)+-128|0)>>>8)+1|0;if((lb|0)<0){Xd(t);mb=c[ba>>2]|0;nb=c[ca>>2]|0}else{mb=kb;nb=lb}lb=gb<<24;if(mb>>>0<lb>>>0){ob=0;pb=gb;qb=mb}else{ob=1;pb=(c[n>>2]|0)-gb|0;qb=mb-lb|0}lb=d[16+pb>>0]|0;mb=pb<<lb;pb=qb<<lb;qb=nb-lb|0;c[ba>>2]=pb;c[ca>>2]=qb;c[n>>2]=mb;c[e+9144>>2]=ob|(jb|eb);eb=e+3164|0;a[eb>>0]=0;jb=(((mb<<7)+-128|0)>>>8)+1|0;if((qb|0)<0){Xd(t);rb=c[ba>>2]|0;sb=c[ca>>2]|0}else{rb=pb;sb=qb}qb=jb<<24;if(rb>>>0<qb>>>0){tb=0;ub=jb;vb=rb}else{tb=1;ub=(c[n>>2]|0)-jb|0;vb=rb-qb|0}qb=d[16+ub>>0]|0;rb=ub<<qb;ub=vb<<qb;vb=sb-qb|0;c[ba>>2]=ub;c[ca>>2]=vb;c[n>>2]=rb;a[e+3163>>0]=tb;do if(!(tb<<24>>24)){wb=rb;xb=vb}else{qb=(((rb<<7)+-128|0)>>>8)+1|0;if((vb|0)<0){Xd(t);yb=c[ba>>2]|0;zb=c[ca>>2]|0}else{yb=ub;zb=vb}sb=qb<<24;if(yb>>>0<sb>>>0){Ab=0;Bb=qb;Cb=yb}else{Ab=1;Bb=(c[n>>2]|0)-qb|0;Cb=yb-sb|0}sb=d[16+Bb>>0]|0;qb=Bb<<sb;jb=zb-sb|0;c[ba>>2]=Cb<<sb;c[ca>>2]=jb;c[n>>2]=qb;a[eb>>0]=Ab;if(!(Ab<<24>>24)){wb=qb;xb=jb;break}else{Db=qb;Fb=jb;Gb=0}while(1){jb=(((Db<<7)+-128|0)>>>8)+1|0;if((Fb|0)<0){Xd(t);Hb=c[ca>>2]|0}else Hb=Fb;qb=c[ba>>2]|0;sb=jb<<24;if(qb>>>0<sb>>>0){Ib=1;Jb=jb;Kb=qb}else{Ib=0;Jb=(c[n>>2]|0)-jb|0;Kb=qb-sb|0}sb=d[16+Jb>>0]|0;qb=Jb<<sb;jb=Kb<<sb;pb=Hb-sb|0;c[ba>>2]=jb;c[ca>>2]=pb;c[n>>2]=qb;do if(!Ib){sb=qb;mb=pb;ob=jb;lb=6;nb=0;do{gb=lb;lb=lb+-1|0;kb=(((sb<<7)+-128|0)>>>8)+1|0;if((mb|0)<0){Xd(t);Lb=c[ba>>2]|0;Mb=c[ca>>2]|0}else{Lb=ob;Mb=mb}hb=kb<<24;if(Lb>>>0<hb>>>0){Nb=0;Ob=kb;Pb=Lb}else{Nb=1;Ob=(c[n>>2]|0)-kb|0;Pb=Lb-hb|0}hb=d[16+Ob>>0]|0;sb=Ob<<hb;ob=Pb<<hb;mb=Mb-hb|0;c[ba>>2]=ob;c[ca>>2]=mb;c[n>>2]=sb;nb=Nb<<lb|nb}while((gb|0)>1);lb=e+3169+Gb|0;a[lb>>0]=nb;sb=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;mb=c[ca>>2]|0;if((mb|0)<0){Xd(t);Rb=c[ca>>2]|0}else Rb=mb;mb=c[ba>>2]|0;ob=sb<<24;if(mb>>>0<ob>>>0){Sb=1;Tb=sb;Ub=mb}else{Sb=0;Tb=(c[n>>2]|0)-sb|0;Ub=mb-ob|0}ob=d[16+Tb>>0]|0;c[ba>>2]=Ub<<ob;c[ca>>2]=Rb-ob;c[n>>2]=Tb<<ob;if(Sb)break;a[lb>>0]=0-(d[lb>>0]|0)}while(0);jb=Gb+1|0;if((jb|0)==4){Vb=0;break}Db=c[n>>2]|0;Fb=c[ca>>2]|0;Gb=jb}do{Ka=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;jb=c[ca>>2]|0;if((jb|0)<0){Xd(t);Wb=c[ca>>2]|0}else Wb=jb;jb=c[ba>>2]|0;pb=Ka<<24;if(jb>>>0<pb>>>0){Xb=1;Zb=Ka;_b=jb}else{Xb=0;Zb=(c[n>>2]|0)-Ka|0;_b=jb-pb|0}pb=d[16+Zb>>0]|0;jb=Zb<<pb;Ka=_b<<pb;qb=Wb-pb|0;c[ba>>2]=Ka;c[ca>>2]=qb;c[n>>2]=jb;do if(!Xb){pb=jb;lb=qb;ob=Ka;mb=6;sb=0;do{gb=mb;mb=mb+-1|0;hb=(((pb<<7)+-128|0)>>>8)+1|0;if((lb|0)<0){Xd(t);$b=c[ba>>2]|0;ac=c[ca>>2]|0}else{$b=ob;ac=lb}kb=hb<<24;if($b>>>0<kb>>>0){bc=0;cc=hb;dc=$b}else{bc=1;cc=(c[n>>2]|0)-hb|0;dc=$b-kb|0}kb=d[16+cc>>0]|0;pb=cc<<kb;ob=dc<<kb;lb=ac-kb|0;c[ba>>2]=ob;c[ca>>2]=lb;c[n>>2]=pb;sb=bc<<mb|sb}while((gb|0)>1);mb=e+3177+Vb|0;a[mb>>0]=sb;pb=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;lb=c[ca>>2]|0;if((lb|0)<0){Xd(t);ec=c[ca>>2]|0}else ec=lb;lb=c[ba>>2]|0;ob=pb<<24;if(lb>>>0<ob>>>0){fc=1;gc=pb;hc=lb}else{fc=0;gc=(c[n>>2]|0)-pb|0;hc=lb-ob|0}ob=d[16+gc>>0]|0;c[ba>>2]=hc<<ob;c[ca>>2]=ec-ob;c[n>>2]=gc<<ob;if(fc)break;a[mb>>0]=0-(d[mb>>0]|0)}while(0);Vb=Vb+1|0}while((Vb|0)!=4);wb=c[n>>2]|0;xb=c[ca>>2]|0}while(0);Vb=G+H|0;H=c[v>>2]|0;G=c[x>>2]|0;fc=(((wb<<7)+-128|0)>>>8)+1|0;if((xb|0)<0){Xd(t);ic=c[ca>>2]|0}else ic=xb;xb=c[ba>>2]|0;wb=fc<<24;if(xb>>>0<wb>>>0){jc=0;kc=fc;lc=xb}else{jc=2;kc=(c[n>>2]|0)-fc|0;lc=xb-wb|0}wb=d[16+kc>>0]|0;xb=kc<<wb;kc=lc<<wb;lc=ic-wb|0;c[ba>>2]=kc;c[ca>>2]=lc;c[n>>2]=xb;wb=(((xb<<7)+-128|0)>>>8)+1|0;if((lc|0)<0){Xd(t);mc=c[ba>>2]|0;nc=c[ca>>2]|0}else{mc=kc;nc=lc}lc=wb<<24;if(mc>>>0<lc>>>0){oc=0;pc=wb;qc=mc}else{oc=1;pc=(c[n>>2]|0)-wb|0;qc=mc-lc|0}lc=d[16+pc>>0]|0;mc=nc-lc|0;c[ba>>2]=qc<<lc;c[ca>>2]=mc;c[n>>2]=pc<<lc;lc=oc|jc;jc=e+11456|0;oc=H+G|0;G=e+11436|0;if((mc+-33|0)>>>0<1073741791)rc=c[G>>2]|0;else{c[G>>2]=lc;rc=lc}lc=1<<rc;mc=e+11736|0;if(c[mc>>2]|0){H=Vb;pc=(3<<rc)+-3|0;rc=lc+-1|0;qc=e+11972|0;nc=e+3248|0;wb=e+11744|0;kc=0;do{xb=c[e+11776+(kc<<2)>>2]|0;ic=(c[e+11740+(kc<<2)>>2]|0)+xb|0;do if(!kc){fc=c[v>>2]|0;gc=pc+(H-fc)|0;ec=xb-gc|0;if(!ec){sc=0;tc=0;break}c[x>>2]=gc;c[wb>>2]=fc+gc;sc=1;tc=ec}else{sc=kc;tc=xb}while(0);xb=ic;ec=sc;gc=tc;a:while(1){fc=e+11740+(ec<<2)|0;hc=ec+-1|0;bc=Vb+(hc*3|0)|0;ac=e+11776+(ec<<2)|0;b:do if((rc|0)>(hc|0)){if((bc+3|0)>>>0>oc>>>0){dc=gc;while(1){if(!dc)break a;cc=xb-(c[fc>>2]|0)|0;do if(!(c[qc>>2]|0)){Qb(nc,7,5497,m);if(c[qc>>2]|0){uc=cc;break}c[k>>2]=ec;Qb(nc,7,5527,k);uc=0}else uc=cc;while(0);c[ac>>2]=uc;cc=dc-uc|0;if(!cc)dc=0;else{vc=uc;wc=cc;break b}}}else xc=gc;while(1){if(!xc)break a;dc=c[fc>>2]|0;sb=xb-dc|0;cc=c[O>>2]|0;if(!cc)yc=bc;else{Eb[cc&31](c[T>>2]|0,bc,r,3);yc=r}cc=d[yc+1>>0]<<8|d[yc>>0]|d[yc+2>>0]<<16;do if((cc|0)!=0&(dc+cc|0)>>>0<=ic>>>0)zc=cc;else{if(c[qc>>2]|0){zc=sb;break}c[j>>2]=ec;Qb(nc,7,5527,j);zc=cc}while(0);c[ac>>2]=zc;cc=xc-zc|0;if(!cc)xc=0;else{vc=zc;wc=cc;break}}}else{cc=gc;while(1){if(!cc)break a;sb=xb-(c[fc>>2]|0)|0;do if((sb|0)<=0){if(c[qc>>2]|0)break;c[i>>2]=ec;Qb(nc,7,5527,i)}while(0);c[ac>>2]=sb;dc=cc-sb|0;if(!dc)cc=0;else{vc=sb;wc=dc;break}}}while(0);ac=ec+1|0;c[e+11740+(ac<<2)>>2]=(c[fc>>2]|0)+vc;ec=ac;gc=wc}kc=ec+1|0}while(kc>>>0<(c[mc>>2]|0)>>>0)}kc=lc+1|0;c[mc>>2]=kc;if(kc>>>0>1){kc=e+3248|0;wc=jc;vc=1;while(1){if(Wd(wc,c[e+11740+(vc<<2)>>2]|0,c[e+11776+(vc<<2)>>2]|0,c[O>>2]|0,c[T>>2]|0)|0){c[h>>2]=vc;Qb(kc,2,5575,h)}vc=vc+1|0;if(vc>>>0>=(c[mc>>2]|0)>>>0)break;else wc=wc+28|0}}wc=e+11824|0;mc=c[wc>>2]|0;vc=lc+-1|0;if(mc>>>0>vc>>>0){c[wc>>2]=vc;Ac=vc}else Ac=mc;mc=e+5716|0;vc=c[mc>>2]|0;if((Ac|0)>=(vc|0))c[wc>>2]=vc+-1;vc=e+3216|0;c[vc>>2]=jc;jc=c[n>>2]|0;Ac=c[ca>>2]|0;lc=7;h=0;do{kc=lc;lc=lc+-1|0;T=(((jc<<7)+-128|0)>>>8)+1|0;if((Ac|0)<0){Xd(t);Cc=c[ca>>2]|0}else Cc=Ac;O=c[ba>>2]|0;i=T<<24;if(O>>>0<i>>>0){Dc=0;Ic=T;Kc=O}else{Dc=1;Ic=(c[n>>2]|0)-T|0;Kc=O-i|0}i=d[16+Ic>>0]|0;jc=Ic<<i;Lc=Kc<<i;Ac=Cc-i|0;c[ba>>2]=Lc;c[ca>>2]=Ac;c[n>>2]=jc;h=Dc<<lc|h}while((kc|0)>1);lc=e+5744|0;c[lc>>2]=h;h=e+5748|0;Dc=c[h>>2]|0;Cc=(((jc<<7)+-128|0)>>>8)+1|0;if((Ac|0)<0){Xd(t);Mc=c[ba>>2]|0;Nc=c[ca>>2]|0}else{Mc=Lc;Nc=Ac}Ac=Cc<<24;if(Mc>>>0<Ac>>>0){Oc=1;Pc=Cc;Qc=Mc}else{Oc=0;Pc=(c[n>>2]|0)-Cc|0;Qc=Mc-Ac|0}Ac=d[16+Pc>>0]|0;Mc=Pc<<Ac;Pc=Qc<<Ac;Qc=Nc-Ac|0;c[ba>>2]=Pc;c[ca>>2]=Qc;c[n>>2]=Mc;if(Oc){Rc=Mc;Sc=Qc;Vc=Pc;Zc=0}else{Oc=(((Mc<<7)+-128|0)>>>8)+1|0;if((Qc|0)<0){Xd(t);_c=c[ba>>2]|0;$c=c[ca>>2]|0}else{_c=Pc;$c=Qc}Qc=Oc<<24;if(_c>>>0<Qc>>>0){dd=0;ed=Oc;fd=_c}else{dd=8;ed=(c[n>>2]|0)-Oc|0;fd=_c-Qc|0}Qc=d[16+ed>>0]|0;_c=ed<<Qc;ed=fd<<Qc;fd=$c-Qc|0;c[ba>>2]=ed;c[ca>>2]=fd;c[n>>2]=_c;Qc=(((_c<<7)+-128|0)>>>8)+1|0;if((fd|0)<0){Xd(t);gd=c[ba>>2]|0;hd=c[ca>>2]|0}else{gd=ed;hd=fd}fd=Qc<<24;if(gd>>>0<fd>>>0){id=0;jd=Qc;kd=gd}else{id=4;jd=(c[n>>2]|0)-Qc|0;kd=gd-fd|0}fd=d[16+jd>>0]|0;gd=jd<<fd;jd=kd<<fd;kd=hd-fd|0;c[ba>>2]=jd;c[ca>>2]=kd;c[n>>2]=gd;fd=(((gd<<7)+-128|0)>>>8)+1|0;if((kd|0)<0){Xd(t);ld=c[ba>>2]|0;md=c[ca>>2]|0}else{ld=jd;md=kd}kd=fd<<24;if(ld>>>0<kd>>>0){nd=0;od=fd;pd=ld}else{nd=2;od=(c[n>>2]|0)-fd|0;pd=ld-kd|0}kd=d[16+od>>0]|0;ld=od<<kd;od=pd<<kd;pd=md-kd|0;c[ba>>2]=od;c[ca>>2]=pd;c[n>>2]=ld;kd=(((ld<<7)+-128|0)>>>8)+1|0;if((pd|0)<0){Xd(t);qd=c[ba>>2]|0;rd=c[ca>>2]|0}else{qd=od;rd=pd}pd=kd<<24;if(qd>>>0<pd>>>0){sd=0;td=kd;ud=qd}else{sd=1;td=(c[n>>2]|0)-kd|0;ud=qd-pd|0}pd=d[16+td>>0]|0;qd=td<<pd;td=ud<<pd;ud=rd-pd|0;c[ba>>2]=td;c[ca>>2]=ud;c[n>>2]=qd;pd=sd|(nd|(id|dd));dd=(((qd<<7)+-128|0)>>>8)+1|0;if((ud|0)<0){Xd(t);vd=c[ba>>2]|0;wd=c[ca>>2]|0}else{vd=td;wd=ud}ud=dd<<24;if(vd>>>0<ud>>>0){xd=1;yd=dd;Ad=vd}else{xd=0;yd=(c[n>>2]|0)-dd|0;Ad=vd-ud|0}ud=d[16+yd>>0]|0;vd=yd<<ud;yd=Ad<<ud;Ad=wd-ud|0;c[ba>>2]=yd;c[ca>>2]=Ad;c[n>>2]=vd;Rc=vd;Sc=Ad;Vc=yd;Zc=xd?pd:0-pd|0}pd=(Zc|0)!=(Dc|0);c[h>>2]=Zc;Zc=e+5752|0;h=c[Zc>>2]|0;Dc=(((Rc<<7)+-128|0)>>>8)+1|0;if((Sc|0)<0){Xd(t);Dd=c[ba>>2]|0;Ed=c[ca>>2]|0}else{Dd=Vc;Ed=Sc}Sc=Dc<<24;if(Dd>>>0<Sc>>>0){Fd=1;Id=Dc;Jd=Dd}else{Fd=0;Id=(c[n>>2]|0)-Dc|0;Jd=Dd-Sc|0}Sc=d[16+Id>>0]|0;Dd=Id<<Sc;Id=Jd<<Sc;Jd=Ed-Sc|0;c[ba>>2]=Id;c[ca>>2]=Jd;c[n>>2]=Dd;if(Fd){Kd=Dd;Ld=Jd;Md=Id;Nd=0}else{Fd=(((Dd<<7)+-128|0)>>>8)+1|0;if((Jd|0)<0){Xd(t);Od=c[ba>>2]|0;Pd=c[ca>>2]|0}else{Od=Id;Pd=Jd}Jd=Fd<<24;if(Od>>>0<Jd>>>0){Qd=0;Rd=Fd;Sd=Od}else{Qd=8;Rd=(c[n>>2]|0)-Fd|0;Sd=Od-Jd|0}Jd=d[16+Rd>>0]|0;Od=Rd<<Jd;Rd=Sd<<Jd;Sd=Pd-Jd|0;c[ba>>2]=Rd;c[ca>>2]=Sd;c[n>>2]=Od;Jd=(((Od<<7)+-128|0)>>>8)+1|0;if((Sd|0)<0){Xd(t);Td=c[ba>>2]|0;Ud=c[ca>>2]|0}else{Td=Rd;Ud=Sd}Sd=Jd<<24;if(Td>>>0<Sd>>>0){Vd=0;Zd=Jd;$d=Td}else{Vd=4;Zd=(c[n>>2]|0)-Jd|0;$d=Td-Sd|0}Sd=d[16+Zd>>0]|0;Td=Zd<<Sd;Zd=$d<<Sd;$d=Ud-Sd|0;c[ba>>2]=Zd;c[ca>>2]=$d;c[n>>2]=Td;Sd=(((Td<<7)+-128|0)>>>8)+1|0;if(($d|0)<0){Xd(t);ae=c[ba>>2]|0;ee=c[ca>>2]|0}else{ae=Zd;ee=$d}$d=Sd<<24;if(ae>>>0<$d>>>0){fe=0;ge=Sd;he=ae}else{fe=2;ge=(c[n>>2]|0)-Sd|0;he=ae-$d|0}$d=d[16+ge>>0]|0;ae=ge<<$d;ge=he<<$d;he=ee-$d|0;c[ba>>2]=ge;c[ca>>2]=he;c[n>>2]=ae;$d=(((ae<<7)+-128|0)>>>8)+1|0;if((he|0)<0){Xd(t);ie=c[ba>>2]|0;je=c[ca>>2]|0}else{ie=ge;je=he}he=$d<<24;if(ie>>>0<he>>>0){ke=0;le=$d;me=ie}else{ke=1;le=(c[n>>2]|0)-$d|0;me=ie-he|0}he=d[16+le>>0]|0;ie=le<<he;le=me<<he;me=je-he|0;c[ba>>2]=le;c[ca>>2]=me;c[n>>2]=ie;he=ke|(fe|(Vd|Qd));Qd=(((ie<<7)+-128|0)>>>8)+1|0;if((me|0)<0){Xd(t);ne=c[ba>>2]|0;oe=c[ca>>2]|0}else{ne=le;oe=me}me=Qd<<24;if(ne>>>0<me>>>0){pe=1;qe=Qd;re=ne}else{pe=0;qe=(c[n>>2]|0)-Qd|0;re=ne-me|0}me=d[16+qe>>0]|0;ne=qe<<me;qe=re<<me;re=oe-me|0;c[ba>>2]=qe;c[ca>>2]=re;c[n>>2]=ne;Kd=ne;Ld=re;Md=qe;Nd=pe?he:0-he|0}he=pd|(Nd|0)!=(h|0);c[Zc>>2]=Nd;Nd=e+5756|0;Zc=c[Nd>>2]|0;h=(((Kd<<7)+-128|0)>>>8)+1|0;if((Ld|0)<0){Xd(t);se=c[ba>>2]|0;te=c[ca>>2]|0}else{se=Md;te=Ld}Ld=h<<24;if(se>>>0<Ld>>>0){ve=1;we=h;xe=se}else{ve=0;we=(c[n>>2]|0)-h|0;xe=se-Ld|0}Ld=d[16+we>>0]|0;se=we<<Ld;we=xe<<Ld;xe=te-Ld|0;c[ba>>2]=we;c[ca>>2]=xe;c[n>>2]=se;if(ve){ye=se;ze=xe;Ae=we;Be=0}else{ve=(((se<<7)+-128|0)>>>8)+1|0;if((xe|0)<0){Xd(t);Ce=c[ba>>2]|0;De=c[ca>>2]|0}else{Ce=we;De=xe}xe=ve<<24;if(Ce>>>0<xe>>>0){Ee=0;Fe=ve;Ge=Ce}else{Ee=8;Fe=(c[n>>2]|0)-ve|0;Ge=Ce-xe|0}xe=d[16+Fe>>0]|0;Ce=Fe<<xe;Fe=Ge<<xe;Ge=De-xe|0;c[ba>>2]=Fe;c[ca>>2]=Ge;c[n>>2]=Ce;xe=(((Ce<<7)+-128|0)>>>8)+1|0;if((Ge|0)<0){Xd(t);He=c[ba>>2]|0;Ie=c[ca>>2]|0}else{He=Fe;Ie=Ge}Ge=xe<<24;if(He>>>0<Ge>>>0){Je=0;Ke=xe;Le=He}else{Je=4;Ke=(c[n>>2]|0)-xe|0;Le=He-Ge|0}Ge=d[16+Ke>>0]|0;He=Ke<<Ge;Ke=Le<<Ge;Le=Ie-Ge|0;c[ba>>2]=Ke;c[ca>>2]=Le;c[n>>2]=He;Ge=(((He<<7)+-128|0)>>>8)+1|0;if((Le|0)<0){Xd(t);Me=c[ba>>2]|0;Ne=c[ca>>2]|0}else{Me=Ke;Ne=Le}Le=Ge<<24;if(Me>>>0<Le>>>0){Oe=0;Pe=Ge;Qe=Me}else{Oe=2;Pe=(c[n>>2]|0)-Ge|0;Qe=Me-Le|0}Le=d[16+Pe>>0]|0;Me=Pe<<Le;Pe=Qe<<Le;Qe=Ne-Le|0;c[ba>>2]=Pe;c[ca>>2]=Qe;c[n>>2]=Me;Le=(((Me<<7)+-128|0)>>>8)+1|0;if((Qe|0)<0){Xd(t);Re=c[ba>>2]|0;Se=c[ca>>2]|0}else{Re=Pe;Se=Qe}Qe=Le<<24;if(Re>>>0<Qe>>>0){Te=0;Ue=Le;Ve=Re}else{Te=1;Ue=(c[n>>2]|0)-Le|0;Ve=Re-Qe|0}Qe=d[16+Ue>>0]|0;Re=Ue<<Qe;Ue=Ve<<Qe;Ve=Se-Qe|0;c[ba>>2]=Ue;c[ca>>2]=Ve;c[n>>2]=Re;Qe=Te|(Oe|(Je|Ee));Ee=(((Re<<7)+-128|0)>>>8)+1|0;if((Ve|0)<0){Xd(t);We=c[ba>>2]|0;Xe=c[ca>>2]|0}else{We=Ue;Xe=Ve}Ve=Ee<<24;if(We>>>0<Ve>>>0){Ye=1;Ze=Ee;_e=We}else{Ye=0;Ze=(c[n>>2]|0)-Ee|0;_e=We-Ve|0}Ve=d[16+Ze>>0]|0;We=Ze<<Ve;Ze=_e<<Ve;_e=Xe-Ve|0;c[ba>>2]=Ze;c[ca>>2]=_e;c[n>>2]=We;ye=We;ze=_e;Ae=Ze;Be=Ye?Qe:0-Qe|0}Qe=he|(Be|0)!=(Zc|0);c[Nd>>2]=Be;Be=e+5760|0;Nd=c[Be>>2]|0;Zc=(((ye<<7)+-128|0)>>>8)+1|0;if((ze|0)<0){Xd(t);$e=c[ba>>2]|0;af=c[ca>>2]|0}else{$e=Ae;af=ze}ze=Zc<<24;if($e>>>0<ze>>>0){bf=1;cf=Zc;df=$e}else{bf=0;cf=(c[n>>2]|0)-Zc|0;df=$e-ze|0}ze=d[16+cf>>0]|0;$e=cf<<ze;cf=df<<ze;df=af-ze|0;c[ba>>2]=cf;c[ca>>2]=df;c[n>>2]=$e;if(bf){ef=$e;ff=df;gf=cf;hf=0}else{bf=((($e<<7)+-128|0)>>>8)+1|0;if((df|0)<0){Xd(t);jf=c[ba>>2]|0;kf=c[ca>>2]|0}else{jf=cf;kf=df}df=bf<<24;if(jf>>>0<df>>>0){lf=0;mf=bf;nf=jf}else{lf=8;mf=(c[n>>2]|0)-bf|0;nf=jf-df|0}df=d[16+mf>>0]|0;jf=mf<<df;mf=nf<<df;nf=kf-df|0;c[ba>>2]=mf;c[ca>>2]=nf;c[n>>2]=jf;df=(((jf<<7)+-128|0)>>>8)+1|0;if((nf|0)<0){Xd(t);of=c[ba>>2]|0;pf=c[ca>>2]|0}else{of=mf;pf=nf}nf=df<<24;if(of>>>0<nf>>>0){qf=0;rf=df;sf=of}else{qf=4;rf=(c[n>>2]|0)-df|0;sf=of-nf|0}nf=d[16+rf>>0]|0;of=rf<<nf;rf=sf<<nf;sf=pf-nf|0;c[ba>>2]=rf;c[ca>>2]=sf;c[n>>2]=of;nf=(((of<<7)+-128|0)>>>8)+1|0;if((sf|0)<0){Xd(t);tf=c[ba>>2]|0;uf=c[ca>>2]|0}else{tf=rf;uf=sf}sf=nf<<24;if(tf>>>0<sf>>>0){vf=0;wf=nf;xf=tf}else{vf=2;wf=(c[n>>2]|0)-nf|0;xf=tf-sf|0}sf=d[16+wf>>0]|0;tf=wf<<sf;wf=xf<<sf;xf=uf-sf|0;c[ba>>2]=wf;c[ca>>2]=xf;c[n>>2]=tf;sf=(((tf<<7)+-128|0)>>>8)+1|0;if((xf|0)<0){Xd(t);yf=c[ba>>2]|0;zf=c[ca>>2]|0}else{yf=wf;zf=xf}xf=sf<<24;if(yf>>>0<xf>>>0){Af=0;Bf=sf;Cf=yf}else{Af=1;Bf=(c[n>>2]|0)-sf|0;Cf=yf-xf|0}xf=d[16+Bf>>0]|0;yf=Bf<<xf;Bf=Cf<<xf;Cf=zf-xf|0;c[ba>>2]=Bf;c[ca>>2]=Cf;c[n>>2]=yf;xf=Af|(vf|(qf|lf));lf=(((yf<<7)+-128|0)>>>8)+1|0;if((Cf|0)<0){Xd(t);Df=c[ba>>2]|0;Ef=c[ca>>2]|0}else{Df=Bf;Ef=Cf}Cf=lf<<24;if(Df>>>0<Cf>>>0){Ff=1;Gf=lf;Hf=Df}else{Ff=0;Gf=(c[n>>2]|0)-lf|0;Hf=Df-Cf|0}Cf=d[16+Gf>>0]|0;Df=Gf<<Cf;Gf=Hf<<Cf;Hf=Ef-Cf|0;c[ba>>2]=Gf;c[ca>>2]=Hf;c[n>>2]=Df;ef=Df;ff=Hf;gf=Gf;hf=Ff?xf:0-xf|0}xf=Qe|(hf|0)!=(Nd|0);c[Be>>2]=hf;hf=e+5764|0;Be=c[hf>>2]|0;Nd=(((ef<<7)+-128|0)>>>8)+1|0;if((ff|0)<0){Xd(t);If=c[ba>>2]|0;Jf=c[ca>>2]|0}else{If=gf;Jf=ff}ff=Nd<<24;if(If>>>0<ff>>>0){Kf=1;Lf=Nd;Mf=If}else{Kf=0;Lf=(c[n>>2]|0)-Nd|0;Mf=If-ff|0}ff=d[16+Lf>>0]|0;If=Lf<<ff;Lf=Mf<<ff;Mf=Jf-ff|0;c[ba>>2]=Lf;c[ca>>2]=Mf;c[n>>2]=If;if(Kf)Nf=0;else{Kf=(((If<<7)+-128|0)>>>8)+1|0;if((Mf|0)<0){Xd(t);Of=c[ba>>2]|0;Pf=c[ca>>2]|0}else{Of=Lf;Pf=Mf}Mf=Kf<<24;if(Of>>>0<Mf>>>0){Qf=0;Rf=Kf;Sf=Of}else{Qf=8;Rf=(c[n>>2]|0)-Kf|0;Sf=Of-Mf|0}Mf=d[16+Rf>>0]|0;Of=Rf<<Mf;Rf=Sf<<Mf;Sf=Pf-Mf|0;c[ba>>2]=Rf;c[ca>>2]=Sf;c[n>>2]=Of;Mf=(((Of<<7)+-128|0)>>>8)+1|0;if((Sf|0)<0){Xd(t);Tf=c[ba>>2]|0;Uf=c[ca>>2]|0}else{Tf=Rf;Uf=Sf}Sf=Mf<<24;if(Tf>>>0<Sf>>>0){Vf=0;Wf=Mf;Xf=Tf}else{Vf=4;Wf=(c[n>>2]|0)-Mf|0;Xf=Tf-Sf|0}Sf=d[16+Wf>>0]|0;Tf=Wf<<Sf;Wf=Xf<<Sf;Xf=Uf-Sf|0;c[ba>>2]=Wf;c[ca>>2]=Xf;c[n>>2]=Tf;Sf=(((Tf<<7)+-128|0)>>>8)+1|0;if((Xf|0)<0){Xd(t);Yf=c[ba>>2]|0;Zf=c[ca>>2]|0}else{Yf=Wf;Zf=Xf}Xf=Sf<<24;if(Yf>>>0<Xf>>>0){_f=0;$f=Sf;ag=Yf}else{_f=2;$f=(c[n>>2]|0)-Sf|0;ag=Yf-Xf|0}Xf=d[16+$f>>0]|0;Yf=$f<<Xf;$f=ag<<Xf;ag=Zf-Xf|0;c[ba>>2]=$f;c[ca>>2]=ag;c[n>>2]=Yf;Xf=(((Yf<<7)+-128|0)>>>8)+1|0;if((ag|0)<0){Xd(t);bg=c[ba>>2]|0;cg=c[ca>>2]|0}else{bg=$f;cg=ag}ag=Xf<<24;if(bg>>>0<ag>>>0){dg=0;eg=Xf;fg=bg}else{dg=1;eg=(c[n>>2]|0)-Xf|0;fg=bg-ag|0}ag=d[16+eg>>0]|0;bg=eg<<ag;eg=fg<<ag;fg=cg-ag|0;c[ba>>2]=eg;c[ca>>2]=fg;c[n>>2]=bg;ag=dg|(_f|(Vf|Qf));Qf=(((bg<<7)+-128|0)>>>8)+1|0;if((fg|0)<0){Xd(t);gg=c[ba>>2]|0;hg=c[ca>>2]|0}else{gg=eg;hg=fg}fg=Qf<<24;if(gg>>>0<fg>>>0){ig=1;jg=Qf;kg=gg}else{ig=0;jg=(c[n>>2]|0)-Qf|0;kg=gg-fg|0}fg=d[16+jg>>0]|0;c[ba>>2]=kg<<fg;c[ca>>2]=hg-fg;c[n>>2]=jg<<fg;Nf=ig?ag:0-ag|0}c[hf>>2]=Nf;if(!((Nf|0)==(Be|0)&(xf^1)))_d(e);if(!(a[F>>0]|0))lg=c[lc>>2]|0;else{xf=a[(d[(c[w>>2]|0)+11>>0]|0)+(e+3155)>>0]|0;if((a[e+3151>>0]|0)==1)mg=xf;else mg=(c[lc>>2]|0)+xf|0;lg=(mg|0)>-1?((mg|0)<127?mg:127):0}mg=e+2048|0;b[mg>>1]=1;xf=e+2016|0;b[xf>>1]=b[e+3504+(lg<<2)>>1]|0;Be=e+2080|0;b[Be>>1]=b[e+4016+(lg<<2)>>1]|0;Nf=e+2112|0;b[Nf>>1]=b[e+4528+(lg<<2)>>1]|0;hf=e+3504+(lg<<2)+2|0;ag=e+4016+(lg<<2)+2|0;ig=e+4528+(lg<<2)+2|0;lg=1;do{fg=b[hf>>1]|0;b[e+2016+(lg<<1)>>1]=fg;b[e+2048+(lg<<1)>>1]=fg;b[e+2080+(lg<<1)>>1]=b[ag>>1]|0;b[e+2112+(lg<<1)>>1]=b[ig>>1]|0;lg=lg+1|0}while((lg|0)!=16);lg=c[n>>2]|0;if(!(c[M>>2]|0)){ng=lg;og=c[ca>>2]|0}else{ig=(((lg<<7)+-128|0)>>>8)+1|0;lg=c[ca>>2]|0;if((lg|0)<0){Xd(t);pg=c[ca>>2]|0}else pg=lg;lg=c[ba>>2]|0;ag=ig<<24;if(lg>>>0<ag>>>0){qg=0;rg=ig;sg=lg}else{qg=1;rg=(c[n>>2]|0)-ig|0;sg=lg-ag|0}ag=d[16+rg>>0]|0;lg=rg<<ag;rg=sg<<ag;sg=pg-ag|0;c[ba>>2]=rg;c[ca>>2]=sg;c[n>>2]=lg;ag=e+9152|0;c[ag>>2]=qg;qg=(((lg<<7)+-128|0)>>>8)+1|0;if((sg|0)<0){Xd(t);tg=c[ba>>2]|0;ug=c[ca>>2]|0}else{tg=rg;ug=sg}sg=qg<<24;if(tg>>>0<sg>>>0){vg=0;wg=qg;xg=tg}else{vg=1;wg=(c[n>>2]|0)-qg|0;xg=tg-sg|0}sg=d[16+wg>>0]|0;tg=wg<<sg;wg=xg<<sg;xg=ug-sg|0;c[ba>>2]=wg;c[ca>>2]=xg;c[n>>2]=tg;sg=e+9156|0;c[sg>>2]=vg;ug=e+9160|0;c[ug>>2]=0;if(!(c[ag>>2]|0)){ag=(((tg<<7)+-128|0)>>>8)+1|0;if((xg|0)<0){Xd(t);yg=c[ba>>2]|0;zg=c[ca>>2]|0}else{yg=wg;zg=xg}qg=ag<<24;if(yg>>>0<qg>>>0){Ag=0;Bg=ag;Cg=yg}else{Ag=2;Bg=(c[n>>2]|0)-ag|0;Cg=yg-qg|0}qg=d[16+Bg>>0]|0;yg=Bg<<qg;Bg=Cg<<qg;Cg=zg-qg|0;c[ba>>2]=Bg;c[ca>>2]=Cg;c[n>>2]=yg;qg=(((yg<<7)+-128|0)>>>8)+1|0;if((Cg|0)<0){Xd(t);Dg=c[ba>>2]|0;Eg=c[ca>>2]|0}else{Dg=Bg;Eg=Cg}Cg=qg<<24;if(Dg>>>0<Cg>>>0){Fg=0;Gg=qg;Hg=Dg}else{Fg=1;Gg=(c[n>>2]|0)-qg|0;Hg=Dg-Cg|0}Cg=d[16+Gg>>0]|0;Dg=Gg<<Cg;Gg=Hg<<Cg;Hg=Eg-Cg|0;c[ba>>2]=Gg;c[ca>>2]=Hg;c[n>>2]=Dg;c[ug>>2]=Fg|Ag;Ig=Dg;Jg=Hg;Kg=c[sg>>2]|0;Lg=Gg}else{Ig=tg;Jg=xg;Kg=vg;Lg=wg}wg=e+9164|0;c[wg>>2]=0;if(!Kg){Kg=(((Ig<<7)+-128|0)>>>8)+1|0;if((Jg|0)<0){Xd(t);Mg=c[ba>>2]|0;Ng=c[ca>>2]|0}else{Mg=Lg;Ng=Jg}vg=Kg<<24;if(Mg>>>0<vg>>>0){Og=0;Pg=Kg;Qg=Mg}else{Og=2;Pg=(c[n>>2]|0)-Kg|0;Qg=Mg-vg|0}vg=d[16+Pg>>0]|0;Mg=Pg<<vg;Pg=Qg<<vg;Qg=Ng-vg|0;c[ba>>2]=Pg;c[ca>>2]=Qg;c[n>>2]=Mg;vg=(((Mg<<7)+-128|0)>>>8)+1|0;if((Qg|0)<0){Xd(t);Rg=c[ba>>2]|0;Tg=c[ca>>2]|0}else{Rg=Pg;Tg=Qg}Qg=vg<<24;if(Rg>>>0<Qg>>>0){Ug=0;Vg=vg;Wg=Rg}else{Ug=1;Vg=(c[n>>2]|0)-vg|0;Wg=Rg-Qg|0}Qg=d[16+Vg>>0]|0;Rg=Vg<<Qg;Vg=Wg<<Qg;Wg=Tg-Qg|0;c[ba>>2]=Vg;c[ca>>2]=Wg;c[n>>2]=Rg;c[wg>>2]=Ug|Og;Xg=Rg;Zg=Wg;_g=Vg}else{Xg=Ig;Zg=Jg;_g=Lg}Lg=(((Xg<<7)+-128|0)>>>8)+1|0;if((Zg|0)<0){Xd(t);$g=c[ba>>2]|0;ah=c[ca>>2]|0}else{$g=_g;ah=Zg}Zg=Lg<<24;if($g>>>0<Zg>>>0){bh=0;ch=Lg;dh=$g}else{bh=1;ch=(c[n>>2]|0)-Lg|0;dh=$g-Zg|0}Zg=d[16+ch>>0]|0;$g=ch<<Zg;ch=dh<<Zg;dh=ah-Zg|0;c[ba>>2]=ch;c[ca>>2]=dh;c[n>>2]=$g;c[e+9180>>2]=bh;bh=((($g<<7)+-128|0)>>>8)+1|0;if((dh|0)<0){Xd(t);eh=c[ba>>2]|0;fh=c[ca>>2]|0}else{eh=ch;fh=dh}dh=bh<<24;if(eh>>>0<dh>>>0){gh=0;hh=bh;ih=eh}else{gh=1;hh=(c[n>>2]|0)-bh|0;ih=eh-dh|0}dh=d[16+hh>>0]|0;eh=hh<<dh;hh=fh-dh|0;c[ba>>2]=ih<<dh;c[ca>>2]=hh;c[n>>2]=eh;c[e+9184>>2]=gh;ng=eh;og=hh}hh=(((ng<<7)+-128|0)>>>8)+1|0;if((og|0)<0){Xd(t);jh=c[ca>>2]|0}else jh=og;og=c[ba>>2]|0;ng=hh<<24;if(og>>>0<ng>>>0){kh=0;lh=hh;mh=og}else{kh=1;lh=(c[n>>2]|0)-hh|0;mh=og-ng|0}ng=d[16+lh>>0]|0;og=lh<<ng;lh=mh<<ng;mh=jh-ng|0;c[ba>>2]=lh;c[ca>>2]=mh;c[n>>2]=og;ng=e+9168|0;c[ng>>2]=kh;if(!kh)Yg(e+9201|0,e+10314|0,1113)|0;if(!(c[M>>2]|0))nh=1;else{kh=(((og<<7)+-128|0)>>>8)+1|0;if((mh|0)<0){Xd(t);oh=c[ba>>2]|0;ph=c[ca>>2]|0}else{oh=lh;ph=mh}mh=kh<<24;if(oh>>>0<mh>>>0){qh=0;rh=kh;sh=oh}else{qh=1;rh=(c[n>>2]|0)-kh|0;sh=oh-mh|0}mh=d[16+rh>>0]|0;c[ba>>2]=sh<<mh;c[ca>>2]=ph-mh;c[n>>2]=rh<<mh;nh=qh}c[e+9148>>2]=nh&1;c[z>>2]=1;nh=0;do{qh=0;do{mh=0;do{rh=mh+-1|0;if((mh|0)>0){ph=0;do{sh=e+10333+(nh*264|0)+(qh*33|0)+(mh*11|0)+ph|0;oh=((S((c[n>>2]|0)+-1|0,d[1936+(nh*264|0)+(qh*33|0)+(mh*11|0)+ph>>0]|0)|0)>>>8)+1|0;kh=c[ca>>2]|0;if((kh|0)<0){Xd(t);th=c[ca>>2]|0}else th=kh;kh=c[ba>>2]|0;lh=oh<<24;if(kh>>>0<lh>>>0){uh=1;vh=oh;wh=kh}else{uh=0;vh=(c[n>>2]|0)-oh|0;wh=kh-lh|0}lh=d[16+vh>>0]|0;kh=vh<<lh;oh=wh<<lh;og=th-lh|0;c[ba>>2]=oh;c[ca>>2]=og;c[n>>2]=kh;if(uh)xh=a[sh>>0]|0;else{lh=kh;kh=og;og=oh;oh=8;jh=0;do{hh=oh;oh=oh+-1|0;eh=(((lh<<7)+-128|0)>>>8)+1|0;if((kh|0)<0){Xd(t);yh=c[ba>>2]|0;zh=c[ca>>2]|0}else{yh=og;zh=kh}gh=eh<<24;if(yh>>>0<gh>>>0){Ah=0;Bh=eh;Ch=yh}else{Ah=1;Bh=(c[n>>2]|0)-eh|0;Ch=yh-gh|0}gh=d[16+Bh>>0]|0;lh=Bh<<gh;og=Ch<<gh;kh=zh-gh|0;c[ba>>2]=og;c[ca>>2]=kh;c[n>>2]=lh;jh=Ah<<oh|jh}while((hh|0)>1);oh=jh&255;a[sh>>0]=oh;xh=oh}if(xh<<24>>24!=(a[e+10333+(nh*264|0)+(qh*33|0)+(rh*11|0)+ph>>0]|0))c[z>>2]=0;ph=ph+1|0}while((ph|0)!=11)}else{ph=0;do{rh=e+10333+(nh*264|0)+(qh*33|0)+(mh*11|0)+ph|0;oh=((S((c[n>>2]|0)+-1|0,d[1936+(nh*264|0)+(qh*33|0)+(mh*11|0)+ph>>0]|0)|0)>>>8)+1|0;lh=c[ca>>2]|0;if((lh|0)<0){Xd(t);Dh=c[ca>>2]|0}else Dh=lh;lh=c[ba>>2]|0;kh=oh<<24;if(lh>>>0<kh>>>0){Eh=1;Fh=oh;Gh=lh}else{Eh=0;Fh=(c[n>>2]|0)-oh|0;Gh=lh-kh|0}kh=d[16+Fh>>0]|0;lh=Fh<<kh;oh=Gh<<kh;og=Dh-kh|0;c[ba>>2]=oh;c[ca>>2]=og;c[n>>2]=lh;if(!Eh){kh=lh;lh=og;og=oh;oh=8;sb=0;do{hh=oh;oh=oh+-1|0;gh=(((kh<<7)+-128|0)>>>8)+1|0;if((lh|0)<0){Xd(t);Hh=c[ba>>2]|0;Ih=c[ca>>2]|0}else{Hh=og;Ih=lh}eh=gh<<24;if(Hh>>>0<eh>>>0){Jh=0;Kh=gh;Lh=Hh}else{Jh=1;Kh=(c[n>>2]|0)-gh|0;Lh=Hh-eh|0}eh=d[16+Kh>>0]|0;kh=Kh<<eh;og=Lh<<eh;lh=Ih-eh|0;c[ba>>2]=og;c[ca>>2]=lh;c[n>>2]=kh;sb=Jh<<oh|sb}while((hh|0)>1);a[rh>>0]=sb}ph=ph+1|0}while((ph|0)!=11)}mh=mh+1|0}while((mh|0)!=3);qh=qh+1|0}while((qh|0)!=8);nh=nh+1|0}while((nh|0)!=4);nh=e+384|0;Sg(nh|0,0,800)|0;Yd(e);Jh=e+9188|0;n=e+5720|0;Sg(c[Jh>>2]|0,0,(c[n>>2]|0)*9|0)|0;c[e+11984>>2]=0;ba=c[G>>2]|0;do if(!(c[e+11812>>2]|0)){Mh=ba;Q=372}else{if(!ba){Mh=0;Q=372;break}ue(e,e);Yb(C);G=c[wc>>2]|0;if(!G){Nh=0;break}Ih=c[e+11916>>2]|0;Lh=0;Kh=0;while(1){Hh=c[Ih+(Kh*3232|0)+3220>>2]|Lh;Kh=Kh+1|0;if(Kh>>>0>=G>>>0){Nh=Hh;break}else Lh=Hh}}while(0);if((Q|0)==372){wc=c[w>>2]|0;C=c[B>>2]|0;B=C+16|0;ba=c[B>>2]|0;Lh=C+36|0;G=c[Lh>>2]|0;c[s>>2]=0;Kh=c[e+3236>>2]|0;c[r+12>>2]=c[Kh+52>>2];c[r+16>>2]=c[Kh+56>>2];c[r+20>>2]=c[Kh+60>>2];c[s+4>>2]=c[Kh+112>>2];Kh=c[e+3240>>2]|0;c[r+24>>2]=c[Kh+52>>2];c[r+28>>2]=c[Kh+56>>2];c[r+32>>2]=c[Kh+60>>2];c[s+8>>2]=c[Kh+112>>2];Kh=c[e+3244>>2]|0;c[r+36>>2]=c[Kh+52>>2];c[r+40>>2]=c[Kh+56>>2];c[r+44>>2]=c[Kh+60>>2];c[s+12>>2]=c[Kh+112>>2];Kh=1<<Mh;Mh=C+52|0;Ih=c[Mh>>2]|0;Hh=C+56|0;t=c[Hh>>2]|0;Eh=C+60|0;Dh=c[Eh>>2]|0;Gh=e+3100|0;c[Gh>>2]=0;Fh=c[Xa>>2]|0;if(Fh|0)ad(u,e,Fh);Hd(C);if((c[mc>>2]|0)>0){Fh=(Kh|0)>1;xh=ba<<4;Ah=G<<3;zh=e+3140|0;Ch=e+3104|0;Bh=e+3192|0;yh=e+3196|0;uh=e+3108|0;th=e+3112|0;wh=e+3116|0;vh=e+3120|0;qh=e+3124|0;ec=e+3128|0;mh=e+2984|0;fc=e+3004|0;ph=e+3132|0;oh=e+3136|0;kh=e+3020|0;lh=e+3024|0;og=e+3028|0;sh=e+3184|0;jh=e+3188|0;hh=e+2900|0;eh=e+2904|0;gh=e+2908|0;dh=e+1984|0;ih=e+896|0;fh=e+2e3|0;bh=e+2816|0;ch=e+2008|0;$g=e+2820|0;Zg=e+3151|0;ah=Ih;Lg=t;_g=Dh;Xg=0;Jg=Ih;Ig=Dh;Vg=t;Wg=wc;Rg=0;while(1){Og=Xg+1|0;if(Fh){c[vc>>2]=e+11456+(Xg*28|0);Oh=(Og|0)==(Kh|0)?0:Og}else Oh=Xg;Og=S(Rg,xh)|0;Ug=S(Rg,Ah)|0;c[zh>>2]=c[Jh>>2];N=c[L>>2]|0;P=N+9|0;do{a[N>>0]=0;N=N+1|0}while((N|0)<(P|0));c[Ch>>2]=0;c[Bh>>2]=0-(Rg<<7);c[yh>>2]=33554431-Rg+(c[mc>>2]|0)<<7;wg=Ih+Og|0;Qg=t+Ug|0;Tg=Dh+Ug|0;vg=wg+-1|0;c[vh>>2]=vg;Pg=Qg+-1|0;c[qh>>2]=Pg;Mg=Tg+-1|0;c[ec>>2]=Mg;Ng=c[mh>>2]|0;c[uh>>2]=wg+(0-Ng);wg=c[fc>>2]|0;Kg=0-wg|0;c[th>>2]=Qg+Kg;c[wh>>2]=Tg+Kg;c[ph>>2]=Ng;c[oh>>2]=wg;a[vg>>0]=-127;a[vg+Ng>>0]=-127;a[vg+(Ng<<1)>>0]=-127;a[vg+(Ng*3|0)>>0]=-127;a[vg+(Ng<<2)>>0]=-127;a[vg+(Ng*5|0)>>0]=-127;a[vg+(Ng*6|0)>>0]=-127;a[vg+(Ng*7|0)>>0]=-127;a[vg+(Ng<<3)>>0]=-127;a[vg+(Ng*9|0)>>0]=-127;a[vg+(Ng*10|0)>>0]=-127;a[vg+(Ng*11|0)>>0]=-127;a[vg+(Ng*12|0)>>0]=-127;a[vg+(Ng*13|0)>>0]=-127;a[vg+(Ng*14|0)>>0]=-127;a[vg+(Ng*15|0)>>0]=-127;a[Pg>>0]=-127;a[Pg+wg>>0]=-127;Ng=wg<<1;a[Pg+Ng>>0]=-127;vg=wg*3|0;a[Pg+vg>>0]=-127;Kg=wg<<2;a[Pg+Kg>>0]=-127;Tg=wg*5|0;a[Pg+Tg>>0]=-127;Qg=wg*6|0;a[Pg+Qg>>0]=-127;xg=wg*7|0;a[Pg+xg>>0]=-127;a[Mg>>0]=-127;a[Mg+wg>>0]=-127;a[Mg+Ng>>0]=-127;a[Mg+vg>>0]=-127;a[Mg+Kg>>0]=-127;a[Mg+Tg>>0]=-127;a[Mg+Qg>>0]=-127;a[Mg+xg>>0]=-127;xg=c[n>>2]|0;if((xg|0)>0){Mg=xg;xg=c[w>>2]|0;Qg=0;Tg=Ug;Kg=Og;while(1){c[sh>>2]=0-(Qg<<7);c[jh>>2]=Mg+33554431-Qg<<7;c[kh>>2]=Ih+Kg;c[lh>>2]=t+Tg;c[og>>2]=Dh+Tg;vg=a[xg+2>>0]|0;Ng=vg&255;if(!(vg<<24>>24)){c[hh>>2]=0;c[eh>>2]=0;Ph=0}else{c[hh>>2]=(c[r+(Ng*12|0)>>2]|0)+Kg;c[eh>>2]=(c[r+(Ng*12|0)+4>>2]|0)+Tg;Ph=(c[r+(Ng*12|0)+8>>2]|0)+Tg|0}c[gh>>2]=Ph;c[D>>2]=c[D>>2]|c[s+(Ng<<2)>>2];do if(!(a[xg+9>>0]|0)){if(((c[(c[vc>>2]|0)+12>>2]|0)+-33|0)>>>0<1073741791){Qh=xg;break}Ng=(de(e,e)|0)==0&1;vg=c[w>>2]|0;a[vg+9>>0]=Ng;Qh=vg}else{ce(e);Qh=c[w>>2]|0}while(0);vg=a[Qh>>0]|0;if(!(a[F>>0]|0))Rh=Qh;else{Ng=a[(d[Qh+11>>0]|0)+(e+3155)>>0]|0;if((a[Zg>>0]|0)==1)Sh=Ng;else Sh=(c[lc>>2]|0)+Ng|0;Ng=(Sh|0)>-1?((Sh|0)<127?Sh:127):0;b[mg>>1]=1;b[xf>>1]=b[e+3504+(Ng<<2)>>1]|0;b[Be>>1]=b[e+4016+(Ng<<2)>>1]|0;b[Nf>>1]=b[e+4528+(Ng<<2)>>1]|0;wg=e+3504+(Ng<<2)+2|0;Pg=e+4016+(Ng<<2)+2|0;tg=e+4528+(Ng<<2)+2|0;Ng=1;do{Gg=b[wg>>1]|0;b[e+2016+(Ng<<1)>>1]=Gg;b[e+2048+(Ng<<1)>>1]=Gg;b[e+2080+(Ng<<1)>>1]=b[Pg>>1]|0;b[e+2112+(Ng<<1)>>1]=b[tg>>1]|0;Ng=Ng+1|0}while((Ng|0)!=16);Rh=c[w>>2]|0}c:do if(!(a[Rh+2>>0]|0)){Cd(e,c[th>>2]|0,c[wh>>2]|0,c[qh>>2]|0,c[ec>>2]|0,c[oh>>2]|0,c[lh>>2]|0,c[og>>2]|0,c[fc>>2]|0);Ng=c[uh>>2]|0;if(vg<<24>>24!=4){Bd(e,Ng,c[vh>>2]|0,c[ph>>2]|0,c[kh>>2]|0,c[mh>>2]|0);break}tg=c[mh>>2]|0;Pg=c[w>>2]|0;if(a[Pg+9>>0]|0){c[dh>>2]=0;c[dh+4>>2]=0;c[dh+8>>2]=0;c[dh+12>>2]=0;c[dh+16>>2]=0;c[dh+20>>2]=0;a[dh+24>>0]=0}wg=Ng+16|0;Ng=c[kh>>2]|0;Gg=0-tg|0;sg=Ng+Gg+16|0;c[sg+(tg<<2)>>2]=c[wg>>2];c[sg+(tg<<3)>>2]=c[wg>>2];c[sg+(tg*12|0)>>2]=c[wg>>2];wg=Ng;Ng=Pg;Pg=0;while(1){sg=wg+(c[e+2144+(Pg*28|0)+16>>2]|0)|0;Hg=sg+Gg|0;Gd(Hg,sg+-1|0,tg,c[Ng+12+(Pg<<2)>>2]|0,sg,tg,a[Hg+-1>>0]|0);Hg=a[e+1984+Pg>>0]|0;do if(Hg<<24>>24){Dg=e+2144+(Pg*28|0)|0;Ag=c[Dg>>2]|0;if(Hg<<24>>24>1){Fc(Ag,xf,sg,tg);break}else{Wc((S(b[xf>>1]|0,b[Ag>>1]|0)|0)&65535,sg,tg,sg,tg);Ag=c[Dg>>2]|0;b[Ag>>1]=0;b[Ag+2>>1]=0>>>16;break}}while(0);sg=Pg+1|0;if((sg|0)==16)break c;wg=c[kh>>2]|0;Ng=c[w>>2]|0;Pg=sg}}else zd(e);while(0);Pg=c[w>>2]|0;if(!(a[Pg+9>>0]|0)){d:do switch(vg<<24>>24){case 4:break;case 9:{Th=xf;Q=411;break}default:if((a[ch>>0]|0)>1){Ec(bh,Be);Xc(c[$g>>2]|0,nh);N=c[bh>>2]|0;P=N+32|0;do{b[N>>1]=0;N=N+2|0}while((N|0)<(P|0));Th=mg;Q=411;break d}else{Ng=(S(b[Be>>1]|0,b[c[bh>>2]>>1]|0)|0)&65535;wg=c[$g>>2]|0;b[wg>>1]=Ng;Yc(wg,nh);wg=c[bh>>2]|0;b[wg>>1]=0;b[wg+2>>1]=0>>>16;Th=mg;Q=411;break d}}while(0);if((Q|0)==411){Q=0;Tc(nh,Th,c[kh>>2]|0,c[mh>>2]|0,dh)}Uc(ih,Nf,c[lh>>2]|0,c[og>>2]|0,c[fc>>2]|0,fh);Uh=c[w>>2]|0}else Uh=Pg;c[Ch>>2]=1;c[D>>2]=((c[(c[vc>>2]|0)+12>>2]|0)+-33|0)>>>0<1073741791|c[D>>2];c[uh>>2]=(c[uh>>2]|0)+16;c[th>>2]=(c[th>>2]|0)+8;c[wh>>2]=(c[wh>>2]|0)+8;c[vh>>2]=(c[vh>>2]|0)+16;c[qh>>2]=(c[qh>>2]|0)+8;c[ec>>2]=(c[ec>>2]|0)+8;xg=Uh+76|0;c[w>>2]=xg;c[zh>>2]=(c[zh>>2]|0)+9;Qg=Qg+1|0;Mg=c[n>>2]|0;if((Qg|0)>=(Mg|0))break;else{Tg=Tg+8|0;Kg=Kg+16|0}}}Jc(C,(c[kh>>2]|0)+16|0,(c[lh>>2]|0)+8|0,(c[og>>2]|0)+8|0);c[w>>2]=(c[w>>2]|0)+76;c[Gh>>2]=1;Kg=(Rg|0)>0;do if(!(c[Xa>>2]|0)){if(!Kg){Vh=ah;Wh=Lg;Xh=_g;Yh=Jg;Zh=Ig;_h=Vg;$h=Wg;break}be(C,ah,Lg,_g);Vh=ah+xh|0;Wh=Lg+Ah|0;Xh=_g+Ah|0;Yh=Jg;Zh=Ig;_h=Vg;$h=Wg}else{if(!Kg){Vh=ah;Wh=Lg;Xh=_g;Yh=Jg;Zh=Ig;_h=Vg;$h=Wg;break}Tg=Rg+-1|0;if(!(c[Ra>>2]|0))bd(u,Wg,Tg,ba,G,Jg,Vg,Ig);else cd(u,Wg,Tg,ba,G,Jg,Vg,Ig);if((Rg|0)>1){be(C,ah,Lg,_g);ai=ah+xh|0;bi=Lg+Ah|0;ci=_g+Ah|0}else{ai=ah;bi=Lg;ci=_g}Vh=ai;Wh=bi;Xh=ci;Yh=Jg+xh|0;Zh=Ig+Ah|0;_h=Vg+Ah|0;$h=Wg+((c[n>>2]|0)*76|0)+76|0}while(0);Kg=Rg+1|0;if((Kg|0)<(c[mc>>2]|0)){ah=Vh;Lg=Wh;_g=Xh;Xg=Oh;Jg=Yh;Ig=Zh;Vg=_h;Wg=$h;Rg=Kg}else{di=Vh;ei=Wh;fi=Xh;gi=Yh;hi=Zh;ii=_h;ji=$h;ki=Rg;break}}}else{di=Ih;ei=t;fi=Dh;gi=Ih;hi=Dh;ii=t;ji=wc;ki=-1}if(!(c[Xa>>2]|0)){li=di;mi=ei;ni=fi}else{if(!(c[Ra>>2]|0))bd(u,ji,ki,ba,G,gi,ii,hi);else cd(u,ji,ki,ba,G,gi,ii,hi);be(C,di,ei,fi);hi=G<<3;li=di+(ba<<4)|0;mi=ei+hi|0;ni=fi+hi|0}be(C,li,mi,ni);ni=C+76|0;mi=c[ni>>2]|0;li=c[B>>2]|0;hi=0-mi|0;fi=(c[Mh>>2]|0)+hi|0;if((mi|0)>0){ei=fi+(S(li,hi)|0)|0;hi=0;while(1){Yg(ei|0,fi|0,li|0)|0;hi=hi+1|0;if((hi|0)==(mi|0))break;else ei=ei+li|0}}li=c[Lh>>2]|0;ei=mi>>>1;mi=0-ei|0;hi=(c[Hh>>2]|0)+mi|0;fi=S(li,mi)|0;if(ei|0){ba=hi+fi|0;di=0;while(1){Yg(ba|0,hi|0,li|0)|0;di=di+1|0;if((di|0)==(ei|0))break;else ba=ba+li|0}ba=(c[Eh>>2]|0)+mi|0;mi=ba+fi|0;fi=0;while(1){Yg(mi|0,ba|0,li|0)|0;fi=fi+1|0;if((fi|0)==(ei|0))break;else mi=mi+li|0}}li=c[ni>>2]|0;ni=c[B>>2]|0;B=(c[Mh>>2]|0)+(0-li)+(S(c[C+4>>2]|0,ni)|0)+(0-ni)|0;if((li|0)>0){Mh=B;mi=0;do{Mh=Mh+ni|0;Yg(Mh|0,B|0,ni|0)|0;mi=mi+1|0}while((mi|0)!=(li|0))}mi=c[Lh>>2]|0;Lh=li>>>1;li=0-Lh|0;ni=S(c[C+24>>2]|0,mi)|0;C=0-mi|0;B=(c[Hh>>2]|0)+li+ni+C|0;if(Lh|0){Hh=B;Mh=0;do{Hh=Hh+mi|0;Yg(Hh|0,B|0,mi|0)|0;Mh=Mh+1|0}while((Mh|0)!=(Lh|0));Mh=(c[Eh>>2]|0)+li+ni+C|0;C=Mh;ni=0;do{C=C+mi|0;Yg(C|0,Mh|0,mi|0)|0;ni=ni+1|0}while((ni|0)!=(Lh|0))}Nh=c[D>>2]|0}D=((c[ca>>2]|0)+-33|0)>>>0<1073741791|Nh;c[E>>2]=D;do if(!(c[J>>2]|0))if(!(c[M>>2]|D)){c[J>>2]=1;break}else{Qb(u,7,5610,g);break}while(0);if(c[ng>>2]|0){R=0;l=f;return R|0}Yg(e+10314|0,e+9201|0,1113)|0;c[z>>2]=A;R=0;l=f;return R|0}function be(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;g=c[b+76>>2]|0;h=c[b+16>>2]|0;i=d+(c[b>>2]|0)+-1|0;j=d+(0-g)|0;k=i+1|0;Sg(j|0,a[d>>0]|0,g|0)|0;Sg(k|0,a[i>>0]|0,g|0)|0;l=d+h|0;d=i+h|0;i=j+h|0;j=k+h|0;Sg(i|0,a[l>>0]|0,g|0)|0;Sg(j|0,a[d>>0]|0,g|0)|0;k=l+h|0;l=d+h|0;d=i+h|0;i=j+h|0;Sg(d|0,a[k>>0]|0,g|0)|0;Sg(i|0,a[l>>0]|0,g|0)|0;j=k+h|0;k=l+h|0;l=d+h|0;d=i+h|0;Sg(l|0,a[j>>0]|0,g|0)|0;Sg(d|0,a[k>>0]|0,g|0)|0;i=j+h|0;j=k+h|0;k=l+h|0;l=d+h|0;Sg(k|0,a[i>>0]|0,g|0)|0;Sg(l|0,a[j>>0]|0,g|0)|0;d=i+h|0;i=j+h|0;j=k+h|0;k=l+h|0;Sg(j|0,a[d>>0]|0,g|0)|0;Sg(k|0,a[i>>0]|0,g|0)|0;l=d+h|0;d=i+h|0;i=j+h|0;j=k+h|0;Sg(i|0,a[l>>0]|0,g|0)|0;Sg(j|0,a[d>>0]|0,g|0)|0;k=l+h|0;l=d+h|0;d=i+h|0;i=j+h|0;Sg(d|0,a[k>>0]|0,g|0)|0;Sg(i|0,a[l>>0]|0,g|0)|0;j=k+h|0;k=l+h|0;l=d+h|0;d=i+h|0;Sg(l|0,a[j>>0]|0,g|0)|0;Sg(d|0,a[k>>0]|0,g|0)|0;i=j+h|0;j=k+h|0;k=l+h|0;l=d+h|0;Sg(k|0,a[i>>0]|0,g|0)|0;Sg(l|0,a[j>>0]|0,g|0)|0;d=i+h|0;i=j+h|0;j=k+h|0;k=l+h|0;Sg(j|0,a[d>>0]|0,g|0)|0;Sg(k|0,a[i>>0]|0,g|0)|0;l=d+h|0;d=i+h|0;i=j+h|0;j=k+h|0;Sg(i|0,a[l>>0]|0,g|0)|0;Sg(j|0,a[d>>0]|0,g|0)|0;k=l+h|0;l=d+h|0;d=i+h|0;i=j+h|0;Sg(d|0,a[k>>0]|0,g|0)|0;Sg(i|0,a[l>>0]|0,g|0)|0;j=k+h|0;k=l+h|0;l=d+h|0;d=i+h|0;Sg(l|0,a[j>>0]|0,g|0)|0;Sg(d|0,a[k>>0]|0,g|0)|0;i=j+h|0;j=k+h|0;k=l+h|0;l=d+h|0;Sg(k|0,a[i>>0]|0,g|0)|0;Sg(l|0,a[j>>0]|0,g|0)|0;Sg(k+h|0,a[i+h>>0]|0,g|0)|0;Sg(l+h|0,a[j+h>>0]|0,g|0)|0;h=c[b+36>>2]|0;j=c[b+20>>2]|0;b=g>>>1;g=e+j+-1|0;l=0-b|0;i=e+l|0;k=g+1|0;Sg(i|0,a[e>>0]|0,b|0)|0;Sg(k|0,a[g>>0]|0,b|0)|0;d=e+h|0;e=g+h|0;g=i+h|0;i=k+h|0;Sg(g|0,a[d>>0]|0,b|0)|0;Sg(i|0,a[e>>0]|0,b|0)|0;k=d+h|0;d=e+h|0;e=g+h|0;g=i+h|0;Sg(e|0,a[k>>0]|0,b|0)|0;Sg(g|0,a[d>>0]|0,b|0)|0;i=k+h|0;k=d+h|0;d=e+h|0;e=g+h|0;Sg(d|0,a[i>>0]|0,b|0)|0;Sg(e|0,a[k>>0]|0,b|0)|0;g=i+h|0;i=k+h|0;k=d+h|0;d=e+h|0;Sg(k|0,a[g>>0]|0,b|0)|0;Sg(d|0,a[i>>0]|0,b|0)|0;e=g+h|0;g=i+h|0;i=k+h|0;k=d+h|0;Sg(i|0,a[e>>0]|0,b|0)|0;Sg(k|0,a[g>>0]|0,b|0)|0;d=e+h|0;e=g+h|0;g=i+h|0;i=k+h|0;Sg(g|0,a[d>>0]|0,b|0)|0;Sg(i|0,a[e>>0]|0,b|0)|0;Sg(g+h|0,a[d+h>>0]|0,b|0)|0;Sg(i+h|0,a[e+h>>0]|0,b|0)|0;e=f+j+-1|0;j=f+l|0;l=e+1|0;Sg(j|0,a[f>>0]|0,b|0)|0;Sg(l|0,a[e>>0]|0,b|0)|0;i=f+h|0;f=e+h|0;e=j+h|0;j=l+h|0;Sg(e|0,a[i>>0]|0,b|0)|0;Sg(j|0,a[f>>0]|0,b|0)|0;l=i+h|0;i=f+h|0;f=e+h|0;e=j+h|0;Sg(f|0,a[l>>0]|0,b|0)|0;Sg(e|0,a[i>>0]|0,b|0)|0;j=l+h|0;l=i+h|0;i=f+h|0;f=e+h|0;Sg(i|0,a[j>>0]|0,b|0)|0;Sg(f|0,a[l>>0]|0,b|0)|0;e=j+h|0;j=l+h|0;l=i+h|0;i=f+h|0;Sg(l|0,a[e>>0]|0,b|0)|0;Sg(i|0,a[j>>0]|0,b|0)|0;f=e+h|0;e=j+h|0;j=l+h|0;l=i+h|0;Sg(j|0,a[f>>0]|0,b|0)|0;Sg(l|0,a[e>>0]|0,b|0)|0;i=f+h|0;f=e+h|0;e=j+h|0;j=l+h|0;Sg(e|0,a[i>>0]|0,b|0)|0;Sg(j|0,a[f>>0]|0,b|0)|0;Sg(e+h|0,a[i+h>>0]|0,b|0)|0;Sg(j+h|0,a[f+h>>0]|0,b|0)|0;return}function ce(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+3140>>2]|0;e=c[b+3144>>2]|0;f=d;g=f;a[g>>0]=0;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;g=f+4|0;a[g>>0]=0;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;g=e;f=g;a[f>>0]=0;a[f+1>>0]=0;a[f+2>>0]=0;a[f+3>>0]=0;f=g+4|0;a[f>>0]=0;a[f+1>>0]=0;a[f+2>>0]=0;a[f+3>>0]=0;if(a[(c[b+3088>>2]|0)+3>>0]|0)return;a[e+8>>0]=0;a[d+8>>0]=0;return}function de(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c[d+3216>>2]|0;f=c[d+3140>>2]|0;g=c[d+3144>>2]|0;if(!(a[(c[d+3088>>2]|0)+3>>0]|0)){h=f+8|0;i=g+8|0;j=ee(e,b+10597|0,(a[i>>0]|0)+(a[h>>0]|0)|0,0,d+1152|0)|0;k=(j|0)>0&1;a[i>>0]=k;a[h>>0]=k;a[d+2008>>0]=j;l=0;m=j+-16|0;n=1}else{l=3;m=0;n=0}j=b+10333+(l*264|0)|0;l=m;m=0;k=d+384|0;while(1){h=f+(m&3)|0;i=g+(m>>>2&3)|0;o=ee(e,j,(a[i>>0]|0)+(a[h>>0]|0)|0,n,k)|0;p=(o|0)>0&1;a[i>>0]=p;a[h>>0]=p;p=o+n|0;a[d+1984+m>>0]=p;l=p+l|0;m=m+1|0;if((m|0)==16)break;else k=k+32|0}k=b+10861|0;b=f+4|0;f=g+4|0;g=l;l=16;m=d+896|0;while(1){n=((l|0)>19&1)<<1;j=b+n+(l&1)|0;p=f+n+((l&2)>>>0>1&1)|0;n=ee(e,k,(a[p>>0]|0)+(a[j>>0]|0)|0,0,m)|0;o=(n|0)>0&1;a[p>>0]=o;a[j>>0]=o;a[d+1984+l>>0]=n;g=n+g|0;l=l+1|0;if((l|0)==24)break;else m=m+32|0}return g|0}function ee(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0;j=f+(h*33|0)+(g*11|0)|0;g=e+16|0;k=((S((c[g>>2]|0)+-1|0,d[j>>0]|0)|0)>>>8)+1|0;l=e+12|0;m=c[l>>2]|0;if((m|0)<0){Xd(e);n=c[l>>2]|0}else n=m;m=e+8|0;o=c[m>>2]|0;p=k<<24;if(o>>>0<p>>>0){q=1;r=k;s=o}else{q=0;r=(c[g>>2]|0)-k|0;s=o-p|0}p=d[16+r>>0]|0;o=r<<p;r=s<<p;s=n-p|0;c[m>>2]=r;c[l>>2]=s;c[g>>2]=o;if(q){t=0;return t|0}else{u=o;v=s;w=r;x=h;y=j}while(1){j=x+1|0;h=((S(u+-1|0,d[y+1>>0]|0)|0)>>>8)+1|0;if((v|0)<0){Xd(e);z=c[m>>2]|0;A=c[l>>2]|0}else{z=w;A=v}r=h<<24;if(z>>>0<r>>>0){B=1;C=h;D=z}else{B=0;C=(c[g>>2]|0)-h|0;D=z-r|0}r=d[16+C>>0]|0;h=C<<r;s=D<<r;o=A-r|0;c[m>>2]=s;c[l>>2]=o;c[g>>2]=h;if(B)if((j|0)==16){t=16;E=82;break}else{u=h;v=o;w=s;x=j;y=f+((d[5656+j>>0]|0)*33|0)|0;continue}r=((S(d[y+2>>0]|0,h+-1|0)|0)>>>8)+1|0;if((o|0)<0){Xd(e);F=c[m>>2]|0;G=c[l>>2]|0}else{F=s;G=o}o=r<<24;if(F>>>0<o>>>0){H=1;I=r;J=F}else{H=0;I=(c[g>>2]|0)-r|0;J=F-o|0}o=d[16+I>>0]|0;r=I<<o;s=J<<o;h=G-o|0;c[m>>2]=s;c[l>>2]=h;c[g>>2]=r;do if(H){K=1;L=r;M=h;N=s;O=1}else{o=((S(d[y+3>>0]|0,r+-1|0)|0)>>>8)+1|0;if((h|0)<0){Xd(e);P=c[m>>2]|0;Q=c[l>>2]|0}else{P=s;Q=h}q=o<<24;if(P>>>0<q>>>0){R=1;T=o;U=P}else{R=0;T=(c[g>>2]|0)-o|0;U=P-q|0}q=d[16+T>>0]|0;o=T<<q;p=U<<q;n=Q-q|0;c[m>>2]=p;c[l>>2]=n;c[g>>2]=o;if(R){q=((S(d[y+4>>0]|0,o+-1|0)|0)>>>8)+1|0;if((n|0)<0){Xd(e);V=c[m>>2]|0;W=c[l>>2]|0}else{V=p;W=n}k=q<<24;if(V>>>0<k>>>0){X=1;Y=q;Z=V}else{X=0;Y=(c[g>>2]|0)-q|0;Z=V-k|0}k=d[16+Y>>0]|0;q=Y<<k;_=Z<<k;$=W-k|0;c[m>>2]=_;c[l>>2]=$;c[g>>2]=q;if(X){K=2;L=q;M=$;N=_;O=2;break}k=((S(d[y+5>>0]|0,q+-1|0)|0)>>>8)+1|0;if(($|0)<0){Xd(e);aa=c[m>>2]|0;ba=c[l>>2]|0}else{aa=_;ba=$}$=k<<24;if(aa>>>0<$>>>0){ca=3;da=k;ea=aa}else{ca=4;da=(c[g>>2]|0)-k|0;ea=aa-$|0}$=d[16+da>>0]|0;k=da<<$;_=ea<<$;q=ba-$|0;c[m>>2]=_;c[l>>2]=q;c[g>>2]=k;K=2;L=k;M=q;N=_;O=ca;break}_=((S(d[y+6>>0]|0,o+-1|0)|0)>>>8)+1|0;if((n|0)<0){Xd(e);fa=c[m>>2]|0;ga=c[l>>2]|0}else{fa=p;ga=n}n=_<<24;if(fa>>>0<n>>>0){ha=1;ia=_;ja=fa}else{ha=0;ia=(c[g>>2]|0)-_|0;ja=fa-n|0}n=d[16+ia>>0]|0;_=ia<<n;p=ja<<n;o=ga-n|0;c[m>>2]=p;c[l>>2]=o;c[g>>2]=_;if(!ha){n=((S(d[y+8>>0]|0,_+-1|0)|0)>>>8)+1|0;if((o|0)<0){Xd(e);ka=c[m>>2]|0;la=c[l>>2]|0}else{ka=p;la=o}q=n<<24;if(ka>>>0<q>>>0){ma=0;na=n;oa=ka}else{ma=1;na=(c[g>>2]|0)-n|0;oa=ka-q|0}q=d[16+na>>0]|0;n=na<<q;k=oa<<q;$=la-q|0;c[m>>2]=k;c[l>>2]=$;c[g>>2]=n;q=((S(d[y+(ma+9)>>0]|0,n+-1|0)|0)>>>8)+1|0;if(($|0)<0){Xd(e);pa=c[m>>2]|0;qa=c[l>>2]|0}else{pa=k;qa=$}$=q<<24;if(pa>>>0<$>>>0){ra=0;sa=q;ta=pa}else{ra=1;sa=(c[g>>2]|0)-q|0;ta=pa-$|0}$=d[16+sa>>0]|0;q=sa<<$;k=ta<<$;n=qa-$|0;c[m>>2]=k;c[l>>2]=n;c[g>>2]=q;$=ra|ma<<1;ua=c[1668+($<<2)>>2]|0;va=a[ua>>0]|0;if(!(va<<24>>24)){wa=k;xa=n;ya=q;za=0}else{Aa=va;va=q;q=n;n=k;k=ua;ua=0;while(1){Ba=((S(va+-1|0,Aa&255)|0)>>>8)+1|0;if((q|0)<0){Xd(e);Ca=c[m>>2]|0;Da=c[l>>2]|0}else{Ca=n;Da=q}Ea=Ba<<24;if(Ca>>>0<Ea>>>0){Fa=0;Ga=Ba;Ha=Ca}else{Fa=1;Ga=(c[g>>2]|0)-Ba|0;Ha=Ca-Ea|0}Ea=d[16+Ga>>0]|0;Ba=Ga<<Ea;Ia=Ha<<Ea;Ja=Da-Ea|0;c[m>>2]=Ia;c[l>>2]=Ja;c[g>>2]=Ba;Ea=Fa|ua<<1;k=k+1|0;Aa=a[k>>0]|0;if(!(Aa<<24>>24)){wa=Ia;xa=Ja;ya=Ba;za=Ea;break}else{va=Ba;q=Ja;n=Ia;ua=Ea}}}K=2;L=ya;M=xa;N=wa;O=za+(8<<$|3)|0;break}ua=((S(d[y+7>>0]|0,_+-1|0)|0)>>>8)+1|0;if((o|0)<0){Xd(e);Ka=c[m>>2]|0;La=c[l>>2]|0}else{Ka=p;La=o}n=ua<<24;if(Ka>>>0<n>>>0){Ma=1;Na=ua;Oa=Ka}else{Ma=0;Na=(c[g>>2]|0)-ua|0;Oa=Ka-n|0}n=d[16+Na>>0]|0;ua=Na<<n;q=Oa<<n;va=La-n|0;c[m>>2]=q;c[l>>2]=va;c[g>>2]=ua;n=ua+-1|0;if(Ma){ua=((n*159|0)>>>8)+1|0;if((va|0)<0){Xd(e);Pa=c[m>>2]|0;Qa=c[l>>2]|0}else{Pa=q;Qa=va}Aa=ua<<24;if(Pa>>>0<Aa>>>0){Ra=5;Sa=ua;Ta=Pa}else{Ra=6;Sa=(c[g>>2]|0)-ua|0;Ta=Pa-Aa|0}Aa=d[16+Sa>>0]|0;ua=Sa<<Aa;k=Ta<<Aa;Ea=Qa-Aa|0;c[m>>2]=k;c[l>>2]=Ea;c[g>>2]=ua;K=2;L=ua;M=Ea;N=k;O=Ra;break}k=((n*165|0)>>>8)+1|0;if((va|0)<0){Xd(e);Ua=c[m>>2]|0;Va=c[l>>2]|0}else{Ua=q;Va=va}va=k<<24;if(Ua>>>0<va>>>0){Wa=7;Xa=k;Ya=Ua}else{Wa=9;Xa=(c[g>>2]|0)-k|0;Ya=Ua-va|0}va=d[16+Xa>>0]|0;k=Xa<<va;q=Ya<<va;n=Va-va|0;c[m>>2]=q;c[l>>2]=n;c[g>>2]=k;va=(((k*145|0)+-145|0)>>>8)+1|0;if((n|0)<0){Xd(e);Za=c[m>>2]|0;_a=c[l>>2]|0}else{Za=q;_a=n}n=va<<24;if(Za>>>0<n>>>0){$a=0;ab=va;bb=Za}else{$a=1;ab=(c[g>>2]|0)-va|0;bb=Za-n|0}n=d[16+ab>>0]|0;va=ab<<n;q=bb<<n;k=_a-n|0;c[m>>2]=q;c[l>>2]=k;c[g>>2]=va;K=2;L=va;M=k;N=q;O=$a+Wa|0}while(0);y=f+((d[5656+j>>0]|0)*33|0)+(K*11|0)|0;h=d[5673+x>>0]|0;s=(L+1|0)>>>1;r=s<<24;if((M|0)<0){Xd(e);cb=c[m>>2]|0}else cb=N;if(cb>>>0<r>>>0){c[g>>2]=s;db=s;eb=cb;fb=O}else{q=(c[g>>2]|0)-s|0;c[g>>2]=q;s=cb-r|0;c[m>>2]=s;db=q;eb=s;fb=0-O|0}s=db<<1;c[g>>2]=s;q=eb<<1;c[m>>2]=q;r=c[l>>2]|0;k=r+-1|0;c[l>>2]=k;b[i+(h<<1)>>1]=fb;if((j|0)==16){t=16;E=82;break}h=((S(s+-1|0,d[y>>0]|0)|0)>>>8)+1|0;if((r|0)<1){Xd(e);gb=c[m>>2]|0;hb=c[l>>2]|0}else{gb=q;hb=k}k=h<<24;if(gb>>>0<k>>>0){ib=1;jb=h;kb=gb}else{ib=0;jb=(c[g>>2]|0)-h|0;kb=gb-k|0}k=d[16+jb>>0]|0;u=jb<<k;w=kb<<k;v=hb-k|0;c[m>>2]=w;c[l>>2]=v;c[g>>2]=u;if(ib){t=j;E=82;break}else x=j}if((E|0)==82)return t|0;return 0}function fe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=a+3248|0;switch(b|0){case 1:{h=a+5564|0;break}case 2:{h=a+5568|0;break}case 4:{h=a+5572|0;break}default:{Qb(g,1,5716,e);i=c[g>>2]|0;l=e;return i|0}}b=c[h>>2]|0;h=a+5064+(b*120|0)|0;if((((c[a+5064+(b*120|0)+4>>2]|0)==(c[d+4>>2]|0)?(c[h>>2]|0)==(c[d>>2]|0):0)?(c[a+5064+(b*120|0)+24>>2]|0)==(c[d+24>>2]|0):0)?(c[a+5064+(b*120|0)+20>>2]|0)==(c[d+20>>2]|0):0){Zb(h,d);i=c[g>>2]|0;l=e;return i|0}Qb(g,1,5740,f);i=c[g>>2]|0;l=e;return i|0}function ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+16|0;f=e+8|0;g=a+3248|0;switch(b|0){case 1:{h=a+5564|0;break}case 2:{h=a+5568|0;break}case 4:{h=a+5572|0;break}default:{Qb(g,1,5716,e);i=c[g>>2]|0;l=e;return i|0}}b=c[h>>2]|0;if((((c[a+5064+(b*120|0)+4>>2]|0)==(c[d+4>>2]|0)?(c[a+5064+(b*120|0)>>2]|0)==(c[d>>2]|0):0)?(c[a+5064+(b*120|0)+24>>2]|0)==(c[d+24>>2]|0):0)?(c[a+5064+(b*120|0)+20>>2]|0)==(c[d+20>>2]|0):0){if(c[a+5544>>2]|0)if(c[a+5548>>2]|0)if(!(c[a+5552>>2]|0))j=2;else j=(c[a+5556>>2]|0)==0?3:4;else j=1;else j=0;b=a+5544+(j<<2)|0;c[b>>2]=0;k=a+5544+(c[h>>2]<<2)|0;m=c[k>>2]|0;if((m|0)>0)c[k>>2]=m+-1;c[h>>2]=j;c[b>>2]=(c[b>>2]|0)+1;Zb(d,a+5064+((c[h>>2]|0)*120|0)|0);i=c[g>>2]|0;l=e;return i|0}Qb(g,1,5740,f);i=c[g>>2]|0;l=e;return i|0}function he(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;d=4;b=Kg(40)|0;c[b>>2]=0;g=a+3248|0;c[g>>2]=0;do if(((c[a+11972>>2]|0)==0?(c[a+11736>>2]|0)>>>0<2:0)?(c[a+11776>>2]|0)==0:0){h=a+5564|0;i=c[h>>2]|0;j=a+5544+(i<<2)|0;k=c[j>>2]|0;if((k|0)>1){c[j>>2]=k+-1;if(c[a+5544>>2]|0)if(c[a+5548>>2]|0)if(!(c[a+5552>>2]|0))l=2;else l=(c[a+5556>>2]|0)==0?3:4;else l=1;else l=0;c[a+5544+(l<<2)>>2]=1;c[h>>2]=l;o=0;ca(1,a+5064+(i*120|0)|0,a+5064+(l*120|0)|0);k=o;o=0;if((k|0)!=0&(p|0)!=0){m=Wg(c[k>>2]|0,b|0,d|0)|0;if(!m)wa(k|0,p|0);D=p}else m=-1;if((m|0)==1){n=D;q=0;r=0;s=0;t=0;break}u=c[h>>2]|0}else u=i;c[a+5064+(u*120|0)+112>>2]=1;v=0;w=a+5704|0;c[w>>2]=0;Lg(b|0);return v|0}else x=12;while(0);if((x|0)==12){if(c[a+5544>>2]|0)if(c[a+5548>>2]|0)if(!(c[a+5552>>2]|0))y=2;else y=(c[a+5556>>2]|0)==0?3:4;else y=1;else y=0;c[a+5544+(y<<2)>>2]=1;u=a+5560|0;c[u>>2]=y;c[a+3232>>2]=a+5064+(y*120|0);y=a+5564|0;c[a+3236>>2]=a+5064+((c[y>>2]|0)*120|0);m=a+5568|0;c[a+3240>>2]=a+5064+((c[m>>2]|0)*120|0);l=a+5572|0;c[a+3244>>2]=a+5064+((c[l>>2]|0)*120|0);b=Ug(a+3340|0,1,b|0,d|0)|0;d=D;o=0;i=o;o=0;if((i|0)!=0&(p|0)!=0){z=Wg(c[i>>2]|0,b|0,d|0)|0;if(!z)wa(i|0,p|0);D=p}else z=-1;if((z|0)==1){n=D;q=l;r=m;s=y;t=u}else{n=0;q=l;r=m;s=y;t=u}}while(1){if(n|0){x=19;break}c[a+3336>>2]=1;o=0;A=da(3,a|0)|0;u=o;o=0;if((u|0)!=0&(p|0)!=0){B=Wg(c[u>>2]|0,b|0,d|0)|0;if(!B)wa(u|0,p|0);D=p}else B=-1;if((B|0)==1)n=D;else{x=22;break}}do if((x|0)==19){c[a+5064+((c[s>>2]|0)*120|0)+112>>2]=1;n=a+5544+(c[t>>2]<<2)|0;B=c[n>>2]|0;if((B|0)>0){c[n>>2]=B+-1;C=1}else C=1}else if((x|0)==22){if((A|0)<0){B=a+5544+(c[t>>2]<<2)|0;n=c[B>>2]|0;if((n|0)>0)c[B>>2]=n+-1;c[g>>2]=1;C=A;break}switch(c[a+9164>>2]|0){case 0:{E=0;break}case 1:{F=0;G=c[s>>2]|0;x=29;break}case 2:{F=0;G=c[r>>2]|0;x=29;break}default:{F=-1;G=0;x=29}}if((x|0)==29){n=a+5544+(c[q>>2]<<2)|0;B=c[n>>2]|0;if((B|0)>0)c[n>>2]=B+-1;c[q>>2]=G;B=a+5544+(G<<2)|0;c[B>>2]=(c[B>>2]|0)+1;E=F}switch(c[a+9160>>2]|0){case 0:{H=E;break}case 1:{I=s;x=34;break}case 2:{I=q;x=34;break}default:{J=-1;K=0;x=35}}if((x|0)==34){J=E;K=c[I>>2]|0;x=35}if((x|0)==35){B=a+5544+(c[r>>2]<<2)|0;n=c[B>>2]|0;if((n|0)>0)c[B>>2]=n+-1;c[r>>2]=K;n=a+5544+(K<<2)|0;c[n>>2]=(c[n>>2]|0)+1;H=J}if(c[a+9152>>2]|0){n=c[t>>2]|0;B=a+5544+(c[r>>2]<<2)|0;d=c[B>>2]|0;if((d|0)>0)c[B>>2]=d+-1;c[r>>2]=n;d=a+5544+(n<<2)|0;c[d>>2]=(c[d>>2]|0)+1}if(c[a+9156>>2]|0){d=c[t>>2]|0;n=a+5544+(c[q>>2]<<2)|0;B=c[n>>2]|0;if((B|0)>0)c[n>>2]=B+-1;c[q>>2]=d;B=a+5544+(d<<2)|0;c[B>>2]=(c[B>>2]|0)+1}if(!(c[a+9148>>2]|0))L=t;else{B=c[t>>2]|0;d=a+5544+(c[s>>2]<<2)|0;n=c[d>>2]|0;if((n|0)>0)c[d>>2]=n+-1;c[s>>2]=B;n=a+5544+(B<<2)|0;c[n>>2]=(c[n>>2]|0)+1;L=s}c[a+5060>>2]=a+5064+((c[L>>2]|0)*120|0);n=a+5544+(c[t>>2]<<2)|0;c[n>>2]=(c[n>>2]|0)+-1;if(H|0){c[g>>2]=1;C=A;break}if(c[a+5704>>2]|0){n=a+11428|0;c[n>>2]=(c[n>>2]|0)+1;c[a+5776>>2]=c[a+5772>>2]}c[a+11960>>2]=0;n=a+11952|0;c[n>>2]=e;c[n+4>>2]=f;C=A}while(0);v=C;w=a+3336|0;c[w>>2]=0;Lg(b|0);return v|0}function ie(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=a+11960|0;if((c[f>>2]|0)==1){g=-1;return g|0}if(!(c[a+5704>>2]|0)){g=-1;return g|0}c[f>>2]=1;f=a+11952|0;h=c[f+4>>2]|0;i=d;c[i>>2]=c[f>>2];c[i+4>>2]=h;h=e;c[h>>2]=0;c[h+4>>2]=0;h=c[a+5060>>2]|0;if(!h){g=-1;return g|0}e=b;i=h;h=e+120|0;do{c[e>>2]=c[i>>2];e=e+4|0;i=i+4|0}while((e|0)<(h|0));c[b>>2]=c[a+5040>>2];i=c[a+5044>>2]|0;c[b+4>>2]=i;c[b+24>>2]=(i|0)/2|0;g=0;return g|0}function je(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[a+2468>>2]|0;if((e|0)<=0){f=0;return f|0}g=c[a+2472>>2]|0;if((g|0)<=0){h=0;do h=h+1|0;while((h|0)<(e|0));f=0;return f|0}h=0;i=c[a+2524>>2]|0;a:while(1){a=0;j=i;while(1){if((d[j+2>>0]|0|0)==(b|0)){f=1;k=9;break a}a=a+1|0;if((a|0)>=(g|0))break;else j=j+76|0}h=h+1|0;if((h|0)>=(e|0)){f=0;k=9;break}else i=j+152|0}if((k|0)==9)return f|0;return 0}function ke(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0;d=4;e=Kg(40)|0;c[e>>2]=0;o=0;f=aa(1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=Wg(c[g>>2]|0,e|0,d|0)|0;if(!h)wa(g|0,p|0);D=p}else h=-1;if((h|0)!=1){c[a>>2]=f;if(!f){i=1;Lg(e|0);return i|0}e=Ug(f+3340|0,1,e|0,d|0)|0;d=D;o=0;f=o;o=0;if((f|0)!=0&(p|0)!=0){j=Wg(c[f>>2]|0,e|0,d|0)|0;if(!j)wa(f|0,p|0);D=p}else j=-1;if((j|0)==1){k=D;l=a}else{k=0;l=a}}else{k=D;l=0}while(1){j=c[l>>2]|0;if(!k){c[j+3336>>2]=1;c[j+11816>>2]=c[b+16>>2];o=0;ba(5,j|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){m=Wg(c[f>>2]|0,e|0,d|0)|0;if(!m)wa(f|0,p|0);D=p}else m=-1;if((m|0)==1){n=l;k=D;l=n;continue}else{q=13;break}}if(!j)break;o=0;ba(2,j|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){r=Wg(c[f>>2]|0,e|0,d|0)|0;if(!r)wa(f|0,p|0);D=p}else r=-1;if((r|0)==1){n=l;k=D;l=n;continue}o=0;ba(3,j+3248|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){s=Wg(c[f>>2]|0,e|0,d|0)|0;if(!s)wa(f|0,p|0);D=p}else s=-1;if((s|0)==1){n=l;k=D;l=n;continue}o=0;ba(4,j|0);j=o;o=0;if((j|0)!=0&(p|0)!=0){t=Wg(c[j>>2]|0,e|0,d|0)|0;if(!t)wa(j|0,p|0);D=p}else t=-1;if((t|0)==1){n=l;k=D;l=n}else{q=10;break}}if((q|0)!=10)if((q|0)==13){c[(c[l>>2]|0)+3336>>2]=0;i=0;Lg(e|0);return i|0};c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;i=1;Lg(e|0);return i|0}function le(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;a=4;b=Kg(40)|0;c[b>>2]=0;o=0;d=ha(12,32,12e3)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=Wg(c[e>>2]|0,b|0,a|0)|0;if(!f)wa(e|0,p|0);D=p}else f=-1;if((f|0)!=1){if(!d){g=0;Lg(b|0);return g|0}Sg(d|0,0,12e3)|0;f=d+3248|0;b=Ug(d+3340|0,1,b|0,a|0)|0;a=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){h=Wg(c[e>>2]|0,b|0,a|0)|0;if(!h)wa(e|0,p|0);D=p}else h=-1;if((h|0)==1){i=f;j=d;k=D}else{i=f;j=d;k=0}}else{i=0;j=0;k=D}while(1){f=d+3336|0;if(k|0){c[f>>2]=0;o=0;ba(3,i|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){l=Wg(c[h>>2]|0,b|0,a|0)|0;if(!l)wa(h|0,p|0);D=p}else l=-1;if((l|0)==1){m=j;n=i;k=D;j=m;i=n;continue}o=0;ba(4,d|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){q=Wg(c[h>>2]|0,b|0,a|0)|0;if(!q)wa(h|0,p|0);D=p}else q=-1;if((q|0)==1){m=j;n=i;k=D;j=m;i=n;continue}else{r=8;break}}c[f>>2]=1;o=0;ba(6,i|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){s=Wg(c[h>>2]|0,b|0,a|0)|0;if(!s)wa(h|0,p|0);D=p}else s=-1;if((s|0)==1){m=j;n=i;k=D;j=m;i=n;continue}c[d+11428>>2]=0;c[d+11960>>2]=1;o=0;ba(7,j|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){t=Wg(c[h>>2]|0,b|0,a|0)|0;if(!t)wa(h|0,p|0);D=p}else t=-1;if((t|0)==1){m=j;n=i;k=D;j=m;i=n;continue}o=0;ba(8,i|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){u=Wg(c[h>>2]|0,b|0,a|0)|0;if(!u)wa(h|0,p|0);D=p}else u=-1;if((u|0)==1){m=j;n=i;k=D;j=m;i=n;continue}c[f>>2]=0;f=d+11968|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;o=0;ba(9,d|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){v=Wg(c[f>>2]|0,b|0,a|0)|0;if(!v)wa(f|0,p|0);D=p}else v=-1;if((v|0)==1){m=j;n=i;k=D;j=m;i=n;continue}o=0;ha(13,9760,5)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){w=Wg(c[f>>2]|0,b|0,a|0)|0;if(!w)wa(f|0,p|0);D=p}else w=-1;if((w|0)==1){m=j;n=i;k=D;j=m;i=n}else{r=14;break}}if((r|0)==8){g=0;Lg(b|0);return g|0}else if((r|0)==14){g=j;Lg(b|0);return g|0}return 0}function me(){if(kb(c,2441)|0)return;yc();Dd();lb(c,2441,1)|0;return}function ne(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if(!b){d=1;return d|0}te(b);Dc(b+3248|0);Ub(b);d=0;return d|0}function oe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;b=l;l=l+48|0;d=b+40|0;e=a+11812|0;c[e>>2]=0;f=a+11828|0;c[f>>2]=0;Jg(a+11860|0,0)|0;g=c[a+11816>>2]|0;h=(g|0)<8?g:8;g=a+3248|0;i=c[a+11440>>2]|0;j=(h|0)>(i|0)?i:h;if((j|0)<=1){l=b;return}c[e>>2]=1;e=j+-1|0;j=a+11824|0;c[j>>2]=e;h=Tb(4,e)|0;e=a+11924|0;c[e>>2]=h;if(!h)Qb(g,2,5768,b);h=Tb(16,c[j>>2]|0)|0;i=a+11928|0;c[i>>2]=h;if(!h)Qb(g,2,5812,b+8|0);h=Rb(32,(c[j>>2]|0)*3232|0)|0;k=a+11916|0;c[k>>2]=h;if(!h){Qb(g,2,5861,b+16|0);m=c[k>>2]|0}else m=h;Sg(m|0,0,(c[j>>2]|0)*3232|0)|0;m=Tb(12,c[j>>2]|0)|0;h=a+11920|0;c[h>>2]=m;if(!m)Qb(g,2,5897,b+24|0);if(Ag(a+11932|0,0,0)|0)Qb(g,2,5938,b+32|0);a:do if(!(c[j>>2]|0))n=0;else{m=0;while(1){if(Ag((c[i>>2]|0)+(m<<4)|0,0,0)|0){n=m;break a}qd((c[k>>2]|0)+(m*3232|0)|0);o=c[h>>2]|0;c[o+(m*12|0)>>2]=m;c[o+(m*12|0)+4>>2]=a;c[o+(m*12|0)+8>>2]=(c[k>>2]|0)+(m*3232|0);if(Va((c[e>>2]|0)+(m<<2)|0,0,4,o+(m*12|0)|0)|0)break;o=m+1|0;if(o>>>0<(c[j>>2]|0)>>>0)m=o;else{n=o;break a}}n=m}while(0);c[f>>2]=n;if((n|0)==(c[j>>2]|0)){l=b;return}Qb(g,2,5969,d);l=b;return}function pe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;b=l;l=l+16|0;d=b;e=c[a>>2]|0;f=c[a+4>>2]|0;g=c[a+8>>2]|0;a=f+11860|0;h=f+11812|0;fg(a)|0;i=c[h>>2]|0;cg(a)|0;if(!i){l=b;return 0}i=f+11928|0;j=g+3144|0;k=e+1|0;while(1){if(!(Hg((c[i>>2]|0)+(e<<4)|0)|0)){fg(a)|0;m=c[h>>2]|0;cg(a)|0;if(!m){n=7;break}c[j>>2]=d;qe(f,g,k)}fg(a)|0;m=c[h>>2]|0;cg(a)|0;if(!m){n=7;break}}if((n|0)==7){l=b;return 0}return 0}\n\n// EMSCRIPTEN_END_FUNCS\nvar ub=[ph,Rd,Le,Ge,pf,Ac,Fe,ph];var vb=[qh,le];var wb=[rh,rd,te,Dc,Ub,oe,Cc,_d,$c,qd,wg,Fg,rh,rh,rh,rh];var xb=[sh,Zb];var yb=[th,Qd,Ee,ae,pe,we,th,th];var zb=[uh,se];var Ab=[vh,$b,zc,_c,Ed,me,xe,vh];var Bb=[wh,Kc,Oc,Mc,Qc,Lc,Pc,Nc,Rc,wh,wh,wh,wh,wh,wh,wh];var Cb=[xh,Id,Jd,Kd,Ld,Md,Nd,Od,Pd,Sd,Ud,ke,Rb,xg,xh,xh];var Db=[yh,Td,he,yh];var Eb=[zh,jc,lc,oc,qc,uc,sc,xc,ic,kc,nc,pc,tc,rc,wc,vc,mc,bc,ac,ec,gc,fc,dc,hc,cc,Qb,zh,zh,zh,zh,zh,zh];return{__emscripten_atomic_fetch_and_xor_u64:Af,_bitshift64Shl:ah,_emscripten_atomic_load_f32:Hf,_bitshift64Lshr:Vg,_ogv_video_decoder_destroy:ze,___emscripten_pthread_data_constructor:De,stackSave:Gb,_emscripten_atomic_xor_u64:Pf,_emscripten_atomic_load_u64:Jf,___udivdi3:$g,_ogv_video_decoder_process_frame:Be,getTempRet0:Lb,_emscripten_atomic_and_u64:Df,_emscripten_sync_run_in_main_thread:Rf,_emscripten_sync_run_in_main_thread_4:Wf,_emscripten_sync_run_in_main_thread_5:Xf,_emscripten_sync_run_in_main_thread_6:Yf,_emscripten_sync_run_in_main_thread_7:Zf,_emscripten_sync_run_in_main_thread_0:Sf,_emscripten_sync_run_in_main_thread_1:Tf,_emscripten_sync_run_in_main_thread_2:Uf,__emscripten_atomic_fetch_and_sub_u64:zf,_emscripten_atomic_exchange_u32:Ff,_ogv_video_decoder_process_header:Ae,_emscripten_atomic_cas_u64:Ef,_llvm_cttz_i32:Zg,_emscripten_atomic_sub_u64:Of,_emscripten_sync_run_in_main_thread_xprintf_varargs:_f,_memcpy:Yg,___errno_location:Ie,__emscripten_atomic_fetch_and_and_u64:xf,_emscripten_sync_run_in_main_thread_3:Vf,_emscripten_atomic_store_f64:Mf,stackAlloc:Fb,_i64Subtract:Rg,_ogv_video_decoder_init:ve,_memset:Sg,setTempRet0:Kb,_realloc:Mg,_i64Add:Tg,_emscripten_atomic_store_u64:Nf,_emscripten_atomic_load_f64:If,_emscripten_main_thread_process_queued_calls:Qf,_ogv_video_decoder_async:ye,_emscripten_get_global_libc:Ce,__emscripten_atomic_fetch_and_add_u64:wf,__emscripten_atomic_fetch_and_or_u64:yf,_emscripten_async_run_in_main_thread:Bf,_llvm_bswap_i32:ch,runPostSets:Pg,_testSetjmp:Wg,_saveSetjmp:Ug,_emscripten_atomic_add_u64:Cf,_free:Lg,_emscripten_atomic_store_f32:Lf,setThrew:Jb,_emscripten_atomic_exchange_u64:Gf,___uremdi3:bh,___pthread_tsd_run_dtors:$f,_emscripten_set_current_thread_status:Qg,stackRestore:Hb,___udivmoddi4:_g,_malloc:Kg,establishStackSpace:Ib,_emscripten_conditional_set_current_thread_status:Xg,_sbrk:dh,_emscripten_atomic_or_u64:Kf,stackAlloc:Fb,stackSave:Gb,stackRestore:Hb,establishStackSpace:Ib,setThrew:Jb,setTempRet0:Kb,getTempRet0:Lb,dynCall_iiii:eh,dynCall_i:fh,dynCall_vi:gh,dynCall_vii:hh,dynCall_ii:ih,dynCall_viii:jh,dynCall_v:kh,dynCall_viiiiii:lh,dynCall_iii:mh,dynCall_iiiiii:nh,dynCall_viiii:oh}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var __emscripten_atomic_fetch_and_xor_u64=Module[\"__emscripten_atomic_fetch_and_xor_u64\"]=asm[\"__emscripten_atomic_fetch_and_xor_u64\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _emscripten_atomic_load_f32=Module[\"_emscripten_atomic_load_f32\"]=asm[\"_emscripten_atomic_load_f32\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=asm[\"_ogv_video_decoder_destroy\"];var ___emscripten_pthread_data_constructor=Module[\"___emscripten_pthread_data_constructor\"]=asm[\"___emscripten_pthread_data_constructor\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var _emscripten_atomic_xor_u64=Module[\"_emscripten_atomic_xor_u64\"]=asm[\"_emscripten_atomic_xor_u64\"];var _emscripten_atomic_load_u64=Module[\"_emscripten_atomic_load_u64\"]=asm[\"_emscripten_atomic_load_u64\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=asm[\"_ogv_video_decoder_process_frame\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var _emscripten_atomic_and_u64=Module[\"_emscripten_atomic_and_u64\"]=asm[\"_emscripten_atomic_and_u64\"];var _emscripten_sync_run_in_main_thread=Module[\"_emscripten_sync_run_in_main_thread\"]=asm[\"_emscripten_sync_run_in_main_thread\"];var _emscripten_sync_run_in_main_thread_4=Module[\"_emscripten_sync_run_in_main_thread_4\"]=asm[\"_emscripten_sync_run_in_main_thread_4\"];var _emscripten_sync_run_in_main_thread_5=Module[\"_emscripten_sync_run_in_main_thread_5\"]=asm[\"_emscripten_sync_run_in_main_thread_5\"];var _emscripten_sync_run_in_main_thread_6=Module[\"_emscripten_sync_run_in_main_thread_6\"]=asm[\"_emscripten_sync_run_in_main_thread_6\"];var _emscripten_sync_run_in_main_thread_7=Module[\"_emscripten_sync_run_in_main_thread_7\"]=asm[\"_emscripten_sync_run_in_main_thread_7\"];var _emscripten_sync_run_in_main_thread_0=Module[\"_emscripten_sync_run_in_main_thread_0\"]=asm[\"_emscripten_sync_run_in_main_thread_0\"];var _emscripten_sync_run_in_main_thread_1=Module[\"_emscripten_sync_run_in_main_thread_1\"]=asm[\"_emscripten_sync_run_in_main_thread_1\"];var _emscripten_sync_run_in_main_thread_2=Module[\"_emscripten_sync_run_in_main_thread_2\"]=asm[\"_emscripten_sync_run_in_main_thread_2\"];var __emscripten_atomic_fetch_and_sub_u64=Module[\"__emscripten_atomic_fetch_and_sub_u64\"]=asm[\"__emscripten_atomic_fetch_and_sub_u64\"];var _emscripten_atomic_exchange_u32=Module[\"_emscripten_atomic_exchange_u32\"]=asm[\"_emscripten_atomic_exchange_u32\"];var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=asm[\"_ogv_video_decoder_process_header\"];var _emscripten_atomic_cas_u64=Module[\"_emscripten_atomic_cas_u64\"]=asm[\"_emscripten_atomic_cas_u64\"];var _llvm_cttz_i32=Module[\"_llvm_cttz_i32\"]=asm[\"_llvm_cttz_i32\"];var _emscripten_atomic_sub_u64=Module[\"_emscripten_atomic_sub_u64\"]=asm[\"_emscripten_atomic_sub_u64\"];var _emscripten_sync_run_in_main_thread_xprintf_varargs=Module[\"_emscripten_sync_run_in_main_thread_xprintf_varargs\"]=asm[\"_emscripten_sync_run_in_main_thread_xprintf_varargs\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var ___errno_location=Module[\"___errno_location\"]=asm[\"___errno_location\"];var __emscripten_atomic_fetch_and_and_u64=Module[\"__emscripten_atomic_fetch_and_and_u64\"]=asm[\"__emscripten_atomic_fetch_and_and_u64\"];var _emscripten_sync_run_in_main_thread_3=Module[\"_emscripten_sync_run_in_main_thread_3\"]=asm[\"_emscripten_sync_run_in_main_thread_3\"];var _emscripten_atomic_store_f64=Module[\"_emscripten_atomic_store_f64\"]=asm[\"_emscripten_atomic_store_f64\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=asm[\"_ogv_video_decoder_init\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _realloc=Module[\"_realloc\"]=asm[\"_realloc\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _emscripten_atomic_store_u64=Module[\"_emscripten_atomic_store_u64\"]=asm[\"_emscripten_atomic_store_u64\"];var _emscripten_atomic_load_f64=Module[\"_emscripten_atomic_load_f64\"]=asm[\"_emscripten_atomic_load_f64\"];var _emscripten_main_thread_process_queued_calls=Module[\"_emscripten_main_thread_process_queued_calls\"]=asm[\"_emscripten_main_thread_process_queued_calls\"];var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=asm[\"_ogv_video_decoder_async\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var __emscripten_atomic_fetch_and_add_u64=Module[\"__emscripten_atomic_fetch_and_add_u64\"]=asm[\"__emscripten_atomic_fetch_and_add_u64\"];var __emscripten_atomic_fetch_and_or_u64=Module[\"__emscripten_atomic_fetch_and_or_u64\"]=asm[\"__emscripten_atomic_fetch_and_or_u64\"];var _emscripten_async_run_in_main_thread=Module[\"_emscripten_async_run_in_main_thread\"]=asm[\"_emscripten_async_run_in_main_thread\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var _testSetjmp=Module[\"_testSetjmp\"]=asm[\"_testSetjmp\"];var _saveSetjmp=Module[\"_saveSetjmp\"]=asm[\"_saveSetjmp\"];var _emscripten_atomic_add_u64=Module[\"_emscripten_atomic_add_u64\"]=asm[\"_emscripten_atomic_add_u64\"];var _free=Module[\"_free\"]=asm[\"_free\"];var _emscripten_atomic_store_f32=Module[\"_emscripten_atomic_store_f32\"]=asm[\"_emscripten_atomic_store_f32\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _emscripten_atomic_exchange_u64=Module[\"_emscripten_atomic_exchange_u64\"]=asm[\"_emscripten_atomic_exchange_u64\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var ___pthread_tsd_run_dtors=Module[\"___pthread_tsd_run_dtors\"]=asm[\"___pthread_tsd_run_dtors\"];var _emscripten_set_current_thread_status=Module[\"_emscripten_set_current_thread_status\"]=asm[\"_emscripten_set_current_thread_status\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var ___udivmoddi4=Module[\"___udivmoddi4\"]=asm[\"___udivmoddi4\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var _emscripten_conditional_set_current_thread_status=Module[\"_emscripten_conditional_set_current_thread_status\"]=asm[\"_emscripten_conditional_set_current_thread_status\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _emscripten_atomic_or_u64=Module[\"_emscripten_atomic_or_u64\"]=asm[\"_emscripten_atomic_or_u64\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_i=Module[\"dynCall_i\"]=asm[\"dynCall_i\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_viii=Module[\"dynCall_viii\"]=asm[\"dynCall_viii\"];var dynCall_v=Module[\"dynCall_v\"]=asm[\"dynCall_v\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=asm[\"dynCall_iiiiii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{PThread.terminateAllThreads();ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(ENVIRONMENT_IS_PTHREAD)console.error(\"Pthread aborting at \"+(new Error).stack);if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=true;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;if(!ENVIRONMENT_IS_PTHREAD)run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDecoderVideoVP8MT;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-vp8-wasm.js",
    "content": "var OGVDecoderVideoVP8W\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoVP8W = function(OGVDecoderVideoVP8W) {\n  OGVDecoderVideoVP8W = OGVDecoderVideoVP8W || {};\n  if (!OGVDecoderVideoVP8W.currentScriptUrl) OGVDecoderVideoVP8W.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoVP8W;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoVP8W=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoVP8W!==\"undefined\"?OGVDecoderVideoVP8W:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Memory===\"function\"){Module[\"wasmMemory\"]=new WebAssembly.Memory({\"initial\":TOTAL_MEMORY/WASM_PAGE_SIZE,\"maximum\":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\"wasmMemory\"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"fround\"]){var froundBuffer=new Float32Array(1);Math[\"fround\"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math[\"fround\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module[\"wasmJSMethod\"]||\"native-wasm\";Module[\"wasmJSMethod\"]=method;var wasmTextFile=Module[\"wasmTextFile\"]||\"ogv-decoder-video-vp8-wasm.wast\";var wasmBinaryFile=Module[\"wasmBinaryFile\"]||\"ogv-decoder-video-vp8-wasm.wasm\";var asmjsCodeFile=Module[\"asmjsCodeFile\"]||\"ogv-decoder-video-vp8-wasm.temp.asm.js\";if(typeof Module[\"locateFile\"]===\"function\"){wasmTextFile=Module[\"locateFile\"](wasmTextFile);wasmBinaryFile=Module[\"locateFile\"](wasmBinaryFile);asmjsCodeFile=Module[\"locateFile\"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={\"f64-rem\":(function(x,y){return x%y}),\"f64-to-int\":(function(x){return x|0}),\"i32s-div\":(function(x,y){return(x|0)/(y|0)|0}),\"i32u-div\":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\"i32s-rem\":(function(x,y){return(x|0)%(y|0)|0}),\"i32u-rem\":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\"debugger\":(function(){debugger})};var info={\"global\":null,\"env\":null,\"asm2wasm\":asm2wasmImports,\"parent\":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(\".\")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(\".\");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\"bad lookupImport to (\"+mod+\").\"+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module[\"buffer\"];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\"printErr\"](\"the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here\")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\"STATIC_BASE\"],Module[\"STATIC_BASE\"]+Module[\"STATIC_BUMP\"]),Module[\"STATIC_BASE\"])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function fixImports(imports){if(!0)return imports;var ret={};for(var i in imports){var fixed=i;if(fixed[0]==\"_\")fixed=fixed.substr(1);ret[fixed]=imports[i]}return ret}function getBinary(){var binary;if(Module[\"wasmBinary\"]){binary=Module[\"wasmBinary\"];binary=new Uint8Array(binary)}else if(Module[\"readBinary\"]){binary=Module[\"readBinary\"](wasmBinaryFile)}else{throw\"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)\"}return binary}function getBinaryPromise(){if(!Module[\"wasmBinary\"]&&typeof fetch===\"function\"){return fetch(wasmBinaryFile).then((function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doJustAsm(global,env,providedBuffer){if(typeof Module[\"asm\"]!==\"function\"||Module[\"asm\"]===methodHandler){if(!Module[\"asmPreload\"]){eval(Module[\"read\"](asmjsCodeFile))}else{Module[\"asm\"]=Module[\"asmPreload\"]}}if(typeof Module[\"asm\"]!==\"function\"){Module[\"printErr\"](\"asm evalling did not set the module properly\");return false}return Module[\"asm\"](global,env,providedBuffer)}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!==\"object\"){Module[\"printErr\"](\"no native wasm support detected\");return false}if(!(Module[\"wasmMemory\"]instanceof WebAssembly.Memory)){Module[\"printErr\"](\"no native wasm Memory in use\");return false}env[\"memory\"]=Module[\"wasmMemory\"];info[\"global\"]={\"NaN\":NaN,\"Infinity\":Infinity};info[\"global.Math\"]=global.Math;info[\"env\"]=env;function receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\"asm\"]=exports;Module[\"usingWasm\"]=true;removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){Module[\"printErr\"](\"Module.instantiateWasm callback failed with error: \"+e);return false}}getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\"instance\"])})).catch((function(reason){Module[\"printErr\"](\"failed to asynchronously prepare wasm: \"+reason);Module[\"quit\"](1,reason)}));return{}}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!==\"function\"){Module[\"printErr\"](\"WasmJS not detected - polyfill not bundled?\");return false}var wasmJS=WasmJS({});wasmJS[\"outside\"]=Module;wasmJS[\"info\"]=info;wasmJS[\"lookupImport\"]=lookupImport;assert(providedBuffer===Module[\"buffer\"]);info.global=global;info.env=env;assert(providedBuffer===Module[\"buffer\"]);env[\"memory\"]=providedBuffer;assert(env[\"memory\"]instanceof ArrayBuffer);wasmJS[\"providedTotalMemory\"]=Module[\"buffer\"].byteLength;var code;if(method===\"interpret-binary\"){code=getBinary()}else{code=Module[\"read\"](method==\"interpret-asm2wasm\"?asmjsCodeFile:wasmTextFile)}var temp;if(method==\"interpret-asm2wasm\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_asm2wasm\"](temp)}else if(method===\"interpret-s-expr\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_s_expr2wasm\"](temp)}else if(method===\"interpret-binary\"){temp=wasmJS[\"_malloc\"](code.length);wasmJS[\"HEAPU8\"].set(code,temp);wasmJS[\"_load_binary2wasm\"](temp,code.length)}else{throw\"what? \"+method}wasmJS[\"_free\"](temp);wasmJS[\"_instantiate\"](temp);if(Module[\"newBuffer\"]){mergeMemory(Module[\"newBuffer\"]);Module[\"newBuffer\"]=null}exports=wasmJS[\"asmExports\"];return exports}Module[\"asmPreload\"]=Module[\"asm\"];Module[\"reallocBuffer\"]=(function(size){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module[\"buffer\"];var oldSize=old.byteLength;if(Module[\"usingWasm\"]){try{var result=Module[\"wasmMemory\"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module[\"buffer\"]=Module[\"wasmMemory\"].buffer}else{return null}}catch(e){return null}}else{exports[\"__growWasmMemory\"]((size-oldSize)/wasmPageSize);return Module[\"buffer\"]!==old?Module[\"buffer\"]:null}});Module[\"asm\"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\"table\"]){var TABLE_SIZE=Module[\"wasmTableSize\"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module[\"wasmMaxTableSize\"];if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Table===\"function\"){if(MAX_TABLE_SIZE!==undefined){env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,\"maximum\":MAX_TABLE_SIZE,\"element\":\"anyfunc\"})}else{env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,element:\"anyfunc\"})}}else{env[\"table\"]=new Array(TABLE_SIZE)}Module[\"wasmTable\"]=env[\"table\"]}if(!env[\"memoryBase\"]){env[\"memoryBase\"]=Module[\"STATIC_BASE\"]}if(!env[\"tableBase\"]){env[\"tableBase\"]=0}var exports;var methods=method.split(\",\");for(var i=0;i<methods.length;i++){var curr=methods[i];if(curr===\"native-wasm\"){if(exports=doNativeWasm(global,env,providedBuffer))break}else if(curr===\"asmjs\"){if(exports=doJustAsm(global,env,providedBuffer))break}else if(curr===\"interpret-asm2wasm\"||curr===\"interpret-s-expr\"||curr===\"interpret-binary\"){if(exports=doWasmPolyfill(global,env,providedBuffer,curr))break}else{throw\"bad method: \"+curr}}if(!exports)throw\"no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods\";return exports});var methodHandler=Module[\"asm\"]}integrateWasmJS(Module);var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+11344;__ATINIT__.push();memoryInitializer=Module[\"wasmJSMethod\"].indexOf(\"asmjs\")>=0||Module[\"wasmJSMethod\"].indexOf(\"interpret-asm2wasm\")>=0?\"ogv-decoder-video-vp8-wasm.js.mem\":null;var STATIC_BUMP=11344;Module[\"STATIC_BASE\"]=STATIC_BASE;Module[\"STATIC_BUMP\"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;function _realloc(){throw\"bad\"}Module[\"_realloc\"]=_realloc;Module[\"_saveSetjmp\"]=_saveSetjmp;Module[\"_testSetjmp\"]=_testSetjmp;function _longjmp(env,value){Module[\"setThrew\"](env,value||1);throw\"longjmp\"}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;Module[\"_memset\"]=_memset;function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;function _abort(){Module[\"abort\"]()}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\"wasmTableSize\"]=94;Module[\"wasmMaxTableSize\"]=94;function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiij(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiij\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_iiiij\":invoke_iiiij,\"invoke_v\":invoke_v,\"invoke_viiiiii\":invoke_viiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"_longjmp\":_longjmp,\"___syscall6\":___syscall6,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};var asm=Module[\"asm\"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\"asm\"]=asm;var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=(function(){return Module[\"asm\"][\"_llvm_bswap_i32\"].apply(null,arguments)});var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_destroy\"].apply(null,arguments)});var getTempRet0=Module[\"getTempRet0\"]=(function(){return Module[\"asm\"][\"getTempRet0\"].apply(null,arguments)});var setThrew=Module[\"setThrew\"]=(function(){return Module[\"asm\"][\"setThrew\"].apply(null,arguments)});var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_process_frame\"].apply(null,arguments)});var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_process_header\"].apply(null,arguments)});var _memset=Module[\"_memset\"]=(function(){return Module[\"asm\"][\"_memset\"].apply(null,arguments)});var _sbrk=Module[\"_sbrk\"]=(function(){return Module[\"asm\"][\"_sbrk\"].apply(null,arguments)});var _memcpy=Module[\"_memcpy\"]=(function(){return Module[\"asm\"][\"_memcpy\"].apply(null,arguments)});var stackAlloc=Module[\"stackAlloc\"]=(function(){return Module[\"asm\"][\"stackAlloc\"].apply(null,arguments)});var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_init\"].apply(null,arguments)});var setTempRet0=Module[\"setTempRet0\"]=(function(){return Module[\"asm\"][\"setTempRet0\"].apply(null,arguments)});var _realloc=Module[\"_realloc\"]=(function(){return Module[\"asm\"][\"_realloc\"].apply(null,arguments)});var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_async\"].apply(null,arguments)});var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=(function(){return Module[\"asm\"][\"_emscripten_get_global_libc\"].apply(null,arguments)});var stackSave=Module[\"stackSave\"]=(function(){return Module[\"asm\"][\"stackSave\"].apply(null,arguments)});var _testSetjmp=Module[\"_testSetjmp\"]=(function(){return Module[\"asm\"][\"_testSetjmp\"].apply(null,arguments)});var _saveSetjmp=Module[\"_saveSetjmp\"]=(function(){return Module[\"asm\"][\"_saveSetjmp\"].apply(null,arguments)});var _free=Module[\"_free\"]=(function(){return Module[\"asm\"][\"_free\"].apply(null,arguments)});var runPostSets=Module[\"runPostSets\"]=(function(){return Module[\"asm\"][\"runPostSets\"].apply(null,arguments)});var establishStackSpace=Module[\"establishStackSpace\"]=(function(){return Module[\"asm\"][\"establishStackSpace\"].apply(null,arguments)});var stackRestore=Module[\"stackRestore\"]=(function(){return Module[\"asm\"][\"stackRestore\"].apply(null,arguments)});var _malloc=Module[\"_malloc\"]=(function(){return Module[\"asm\"][\"_malloc\"].apply(null,arguments)});var dynCall_iiii=Module[\"dynCall_iiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiii\"].apply(null,arguments)});var dynCall_vi=Module[\"dynCall_vi\"]=(function(){return Module[\"asm\"][\"dynCall_vi\"].apply(null,arguments)});var dynCall_vii=Module[\"dynCall_vii\"]=(function(){return Module[\"asm\"][\"dynCall_vii\"].apply(null,arguments)});var dynCall_ii=Module[\"dynCall_ii\"]=(function(){return Module[\"asm\"][\"dynCall_ii\"].apply(null,arguments)});var dynCall_iiiij=Module[\"dynCall_iiiij\"]=(function(){return Module[\"asm\"][\"dynCall_iiiij\"].apply(null,arguments)});var dynCall_v=Module[\"dynCall_v\"]=(function(){return Module[\"asm\"][\"dynCall_v\"].apply(null,arguments)});var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiiiii\"].apply(null,arguments)});var dynCall_iii=Module[\"dynCall_iii\"]=(function(){return Module[\"asm\"][\"dynCall_iii\"].apply(null,arguments)});var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiiii\"].apply(null,arguments)});var dynCall_viiii=Module[\"dynCall_viiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiii\"].apply(null,arguments)});Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;if(memoryInitializer){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];if(request.status!==200&&request.status!==0){console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n  return OGVDecoderVideoVP8W;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-vp8.js",
    "content": "var OGVDecoderVideoVP8\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoVP8 = function(OGVDecoderVideoVP8) {\n  OGVDecoderVideoVP8 = OGVDecoderVideoVP8 || {};\n  if (!OGVDecoderVideoVP8.currentScriptUrl) OGVDecoderVideoVP8.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoVP8;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoVP8=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoVP8!==\"undefined\"?OGVDecoderVideoVP8:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+10336;__ATINIT__.push();allocate([0,0,0,0,0,0,0,0,0,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,112,0,16,0,96,0,32,0,80,0,48,0,64,0,64,0,48,0,80,0,32,0,96,0,16,0,112,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,250,255,123,0,12,0,255,255,0,0,2,0,245,255,108,0,36,0,248,255,1,0,0,0,247,255,93,0,50,0,250,255,0,0,3,0,240,255,77,0,77,0,240,255,3,0,0,0,250,255,50,0,93,0,247,255,0,0,1,0,248,255,36,0,108,0,245,255,2,0,0,0,255,255,12,0,123,0,250,255,0,0,7,0,0,0,6,0,0,0,7,0,0,0,1,0,0,0,1,0,0,0,143,0,0,0,14,0,0,0,18,0,0,0,14,0,0,0,107,0,0,0,135,0,0,0,64,0,0,0,57,0,0,0,68,0,0,0,60,0,0,0,56,0,0,0,128,0,0,0,65,0,0,0,159,0,0,0,134,0,0,0,128,0,0,0,34,0,0,0,234,0,0,0,188,0,0,0,128,0,0,0,28,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,20,0,0,0,21,0,0,0,21,0,0,0,22,0,0,0,22,0,0,0,23,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,59,0,0,0,60,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,68,0,0,0,69,0,0,0,70,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,79,0,0,0,80,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,89,0,0,0,91,0,0,0,93,0,0,0,95,0,0,0,96,0,0,0,98,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,104,0,0,0,106,0,0,0,108,0,0,0,110,0,0,0,112,0,0,0,114,0,0,0,116,0,0,0,118,0,0,0,122,0,0,0,124,0,0,0,126,0,0,0,128,0,0,0,130,0,0,0,132,0,0,0,134,0,0,0,136,0,0,0,138,0,0,0,140,0,0,0,143,0,0,0,145,0,0,0,148,0,0,0,151,0,0,0,154,0,0,0,157,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,60,0,0,0,62,0,0,0,64,0,0,0,66,0,0,0,68,0,0,0,70,0,0,0,72,0,0,0,74,0,0,0,76,0,0,0,78,0,0,0,80,0,0,0,82,0,0,0,84,0,0,0,86,0,0,0,88,0,0,0,90,0,0,0,92,0,0,0,94,0,0,0,96,0,0,0,98,0,0,0,100,0,0,0,102,0,0,0,104,0,0,0,106,0,0,0,108,0,0,0,110,0,0,0,112,0,0,0,114,0,0,0,116,0,0,0,119,0,0,0,122,0,0,0,125,0,0,0,128,0,0,0,131,0,0,0,134,0,0,0,137,0,0,0,140,0,0,0,143,0,0,0,146,0,0,0,149,0,0,0,152,0,0,0,155,0,0,0,158,0,0,0,161,0,0,0,164,0,0,0,167,0,0,0,170,0,0,0,173,0,0,0,177,0,0,0,181,0,0,0,185,0,0,0,189,0,0,0,193,0,0,0,197,0,0,0,201,0,0,0,205,0,0,0,209,0,0,0,213,0,0,0,217,0,0,0,221,0,0,0,225,0,0,0,229,0,0,0,234,0,0,0,239,0,0,0,245,0,0,0,249,0,0,0,254,0,0,0,3,1,0,0,8,1,0,0,13,1,0,0,18,1,0,0,23,1,0,0,28,1,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,0,1,0,0,4,0,0,0,1,1,0,0,5,0,0,0,2,1,0,0,6,0,0,0,3,1,0,0,7,0,0,0,255,255,255,255,0,0,0,0,32,21,0,0,5,0,0,0,1,0,16,0,8,0,0,0,1,0,0,0,248,5,0,0,1,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,23,0,0,49,23,0,0,54,23,0,0,60,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,88,36,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,176,246,255,255,255,255,255,255,255,255,255,223,241,252,255,255,255,255,255,255,255,255,249,253,253,255,255,255,255,255,255,255,255,255,244,252,255,255,255,255,255,255,255,255,234,254,254,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,246,254,255,255,255,255,255,255,255,255,239,253,254,255,255,255,255,255,255,255,255,254,255,254,255,255,255,255,255,255,255,255,255,248,254,255,255,255,255,255,255,255,255,251,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,254,255,255,255,255,255,255,255,255,251,254,254,255,255,255,255,255,255,255,255,254,255,254,255,255,255,255,255,255,255,255,255,254,253,255,254,255,255,255,255,255,255,250,255,254,255,254,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,217,255,255,255,255,255,255,255,255,255,255,225,252,241,253,255,255,254,255,255,255,255,234,250,241,250,253,255,253,254,255,255,255,255,254,255,255,255,255,255,255,255,255,255,223,254,254,255,255,255,255,255,255,255,255,238,253,254,254,255,255,255,255,255,255,255,255,248,254,255,255,255,255,255,255,255,255,249,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,247,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,254,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,255,255,255,255,255,255,255,255,250,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,186,251,250,255,255,255,255,255,255,255,255,234,251,244,254,255,255,255,255,255,255,255,251,251,243,253,254,255,254,255,255,255,255,255,253,254,255,255,255,255,255,255,255,255,236,253,254,255,255,255,255,255,255,255,255,251,253,253,254,254,255,255,255,255,255,255,255,254,254,255,255,255,255,255,255,255,255,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,254,254,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,255,255,255,255,255,255,255,255,255,255,250,254,252,254,255,255,255,255,255,255,255,248,254,249,253,255,255,255,255,255,255,255,255,253,253,255,255,255,255,255,255,255,255,246,253,253,255,255,255,255,255,255,255,255,252,254,251,254,254,255,255,255,255,255,255,255,254,252,255,255,255,255,255,255,255,255,248,254,253,255,255,255,255,255,255,255,255,253,255,254,254,255,255,255,255,255,255,255,255,251,254,255,255,255,255,255,255,255,255,245,251,254,255,255,255,255,255,255,255,255,253,253,254,255,255,255,255,255,255,255,255,255,251,253,255,255,255,255,255,255,255,255,252,253,254,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,255,255,255,249,255,254,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,250,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,253,136,254,255,228,219,128,128,128,128,128,189,129,242,255,227,213,255,219,128,128,128,106,126,227,252,214,209,255,255,128,128,128,1,98,248,255,236,226,255,255,128,128,128,181,133,238,254,221,234,255,154,128,128,128,78,134,202,247,198,180,255,219,128,128,128,1,185,249,255,243,255,128,128,128,128,128,184,150,247,255,236,224,128,128,128,128,128,77,110,216,255,236,230,128,128,128,128,128,1,101,251,255,241,255,128,128,128,128,128,170,139,241,252,236,209,255,255,128,128,128,37,116,196,243,228,255,255,255,128,128,128,1,204,254,255,245,255,128,128,128,128,128,207,160,250,255,238,128,128,128,128,128,128,102,103,231,255,211,171,128,128,128,128,128,1,152,252,255,240,255,128,128,128,128,128,177,135,243,255,234,225,128,128,128,128,128,80,129,211,255,194,224,128,128,128,128,128,1,1,255,128,128,128,128,128,128,128,128,246,1,255,128,128,128,128,128,128,128,128,255,128,128,128,128,128,128,128,128,128,128,198,35,237,223,193,187,162,160,145,155,62,131,45,198,221,172,176,220,157,252,221,1,68,47,146,208,149,167,221,162,255,223,128,1,149,241,255,221,224,255,255,128,128,128,184,141,234,253,222,220,255,199,128,128,128,81,99,181,242,176,190,249,202,255,255,128,1,129,232,253,214,197,242,196,255,255,128,99,121,210,250,201,198,255,202,128,128,128,23,91,163,242,170,187,247,210,255,255,128,1,200,246,255,234,255,128,128,128,128,128,109,178,241,255,231,245,255,255,128,128,128,44,130,201,253,205,192,255,255,128,128,128,1,132,239,251,219,209,255,165,128,128,128,94,136,225,251,218,190,255,255,128,128,128,22,100,174,245,186,161,255,199,128,128,128,1,182,249,255,232,235,128,128,128,128,128,124,143,241,255,227,234,128,128,128,128,128,35,77,181,251,193,211,255,205,128,128,128,1,157,247,255,236,231,255,255,128,128,128,121,141,235,255,225,227,255,255,128,128,128,45,99,188,251,195,217,255,224,128,128,128,1,1,251,255,213,255,128,128,128,128,128,203,1,248,255,255,128,128,128,128,128,128,137,1,177,255,224,255,128,128,128,128,128,253,9,248,251,207,208,255,192,128,128,128,175,13,224,243,193,185,249,198,255,255,128,73,17,171,221,161,179,236,167,255,234,128,1,95,247,253,212,183,255,255,128,128,128,239,90,244,250,211,209,255,255,128,128,128,155,77,195,248,188,195,255,255,128,128,128,1,24,239,251,218,219,255,205,128,128,128,201,51,219,255,196,186,128,128,128,128,128,69,46,190,239,201,218,255,228,128,128,128,1,191,251,255,255,128,128,128,128,128,128,223,165,249,255,213,255,128,128,128,128,128,141,124,248,255,255,128,128,128,128,128,128,1,16,248,255,255,128,128,128,128,128,128,190,36,230,255,236,255,128,128,128,128,128,149,1,255,128,128,128,128,128,128,128,128,1,226,255,128,128,128,128,128,128,128,128,247,192,255,128,128,128,128,128,128,128,128,240,128,255,128,128,128,128,128,128,128,128,1,134,252,255,255,128,128,128,128,128,128,213,62,250,255,255,128,128,128,128,128,128,55,93,255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,202,24,213,235,186,191,220,160,240,175,255,126,38,182,232,169,184,228,174,255,187,128,61,46,138,219,151,178,240,170,255,216,128,1,112,230,250,199,191,247,159,255,255,128,166,109,228,252,211,215,255,174,128,128,128,39,77,162,232,172,180,245,178,255,255,128,1,52,220,246,198,199,249,220,255,255,128,124,74,191,243,183,193,250,221,255,255,128,24,71,130,219,154,170,243,182,255,255,128,1,182,225,249,219,240,255,224,128,128,128,149,150,226,252,216,205,255,171,128,128,128,28,108,170,242,183,194,254,223,255,255,128,1,81,230,252,204,203,255,192,128,128,128,123,102,209,247,188,196,255,233,128,128,128,20,95,153,243,164,173,255,203,128,128,128,1,222,248,255,216,213,128,128,128,128,128,168,175,246,252,235,205,255,255,128,128,128,47,116,215,255,211,212,255,255,128,128,128,1,121,236,253,212,214,255,255,128,128,128,141,84,213,252,201,202,255,219,128,128,128,42,80,160,240,162,185,255,205,128,128,128,1,1,255,128,128,128,128,128,128,128,128,244,1,255,128,128,128,128,128,128,128,128,238,1,255,128,128,128,128,128,128,128,128,145,156,163,128,162,101,204,142,114,183,120,90,79,133,87,85,80,111,151,231,120,48,89,115,113,120,152,112,152,179,64,126,170,118,46,70,95,175,69,143,80,85,82,72,155,103,56,58,10,171,218,189,17,13,152,144,71,10,38,171,213,144,34,26,114,26,17,163,44,195,21,10,173,121,24,80,195,26,62,44,64,85,170,46,55,19,136,160,33,206,71,63,20,8,114,114,208,12,9,226,81,40,11,96,182,84,29,16,36,134,183,89,137,98,101,106,165,148,72,187,100,130,157,111,32,75,80,66,102,167,99,74,62,40,234,128,41,53,9,178,241,141,26,8,107,104,79,12,27,217,255,87,17,7,74,43,26,146,73,166,49,23,157,65,38,105,160,51,52,31,115,128,87,68,71,44,114,51,15,186,23,47,41,14,110,182,183,21,17,194,66,45,25,102,197,189,23,18,22,88,88,147,150,42,46,45,196,205,43,97,183,117,85,38,35,179,61,39,53,200,87,26,21,43,232,171,56,34,51,104,114,102,29,93,77,107,54,32,26,51,1,81,43,31,39,28,85,171,58,165,90,98,64,34,22,116,206,23,34,43,166,73,68,25,106,22,64,171,36,225,114,34,19,21,102,132,188,16,76,124,62,18,78,95,85,57,50,48,51,193,101,35,159,215,111,89,46,111,60,148,31,172,219,228,21,18,111,112,113,77,85,179,255,38,120,114,40,42,1,196,245,209,10,25,109,100,80,8,43,154,1,51,26,71,88,43,29,140,166,213,37,43,154,61,63,30,155,67,45,68,1,209,142,78,78,16,255,128,34,197,171,41,40,5,102,211,183,4,1,221,51,50,17,168,209,192,23,25,82,125,98,42,88,104,85,117,175,82,95,84,53,89,128,100,113,101,45,75,79,123,47,51,128,81,171,1,57,17,5,71,102,57,53,41,49,115,21,2,10,102,255,166,23,6,38,33,13,121,57,73,26,1,85,41,10,67,138,77,110,90,47,114,101,29,16,10,85,128,101,196,26,57,18,10,102,102,213,34,20,43,117,20,15,36,163,128,68,1,26,138,31,36,171,27,166,38,44,229,67,87,58,169,82,115,26,59,179,63,59,90,180,59,166,93,73,154,40,40,21,116,143,209,34,39,175,57,46,22,24,128,1,54,17,37,47,15,16,183,34,223,49,45,183,46,17,33,183,6,98,15,32,183,65,32,73,115,28,128,23,128,205,40,3,9,115,51,192,18,6,223,87,37,9,115,59,77,64,21,47,104,55,44,218,9,54,53,130,226,64,90,70,205,40,41,23,26,57,54,57,112,184,5,41,38,166,213,30,34,26,133,152,116,10,32,134,75,32,12,51,192,255,160,43,51,39,19,53,221,26,114,32,73,255,31,9,65,234,2,15,1,118,73,88,31,35,67,102,85,55,186,85,56,21,23,111,59,205,45,37,192,55,38,70,124,73,102,1,34,98,102,61,71,37,34,53,31,243,192,69,60,71,38,73,119,28,222,37,68,45,128,34,1,47,11,245,171,62,17,19,70,146,85,55,62,70,75,15,9,9,64,255,184,119,16,37,43,37,154,100,163,85,160,1,63,9,92,136,28,64,32,201,85,86,6,28,5,64,255,25,248,1,56,8,17,132,137,255,55,116,128,58,15,20,82,135,57,26,121,40,164,50,31,137,154,133,25,35,218,51,103,44,131,131,123,31,6,158,86,40,64,135,148,224,45,183,128,22,26,17,131,240,154,14,1,209,83,12,13,54,192,255,68,47,28,45,16,21,91,64,222,7,1,197,56,21,39,155,60,138,23,102,213,85,26,85,85,128,128,32,146,171,18,11,7,63,144,171,4,4,246,35,27,10,146,174,171,12,26,128,190,80,35,99,180,80,126,54,45,85,126,47,87,176,51,41,20,32,101,75,128,139,118,146,116,128,85,56,41,15,176,236,85,37,9,62,146,36,19,30,171,255,97,27,20,71,30,17,119,118,255,17,18,138,101,38,60,138,55,70,43,26,142,138,45,61,62,219,1,81,188,64,32,41,20,117,151,142,20,21,163,112,19,12,61,195,128,48,4,24,0,2,255,4,254,6,8,12,253,10,251,250,252,14,249,16,248,247,0,2,4,6,255,254,253,252,252,2,4,6,0,255,254,253,0,2,255,4,254,253,2,8,4,6,0,255,254,253,10,12,252,251,250,249,180,162,25,237,246,253,253,254,254,254,254,254,254,254,254,254,254,250,250,252,254,254,231,243,245,253,254,254,254,254,254,254,254,254,254,254,251,251,254,254,254,162,128,225,146,172,147,214,39,156,128,129,132,75,145,178,206,239,254,254,164,128,204,170,119,235,140,230,228,128,130,130,74,148,180,203,236,254,254,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,8,10,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,87,101,98,77,32,80,114,111,106,101,99,116,32,86,80,56,32,68,101,99,111,100,101,114,32,118,49,46,54,46,49,45,49,45,103,51,48,49,99,48,54,101,57,101,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,119,105,100,116,104,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,104,101,105,103,104,116,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,32,98,117,102,102,101,114,115,0,147,136,18,223,1,34,106,145,1,208,1,1,179,121,1,223,1,34,179,121,1,208,1,1,8,8,4,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,4,5,8,9,12,13,2,3,6,7,10,11,14,15,0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,112,97,114,116,105,116,105,111,110,32,48,32,108,101,110,103,116,104,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,121,110,99,32,99,111,100,101,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,48,0,84,114,117,110,99,97,116,101,100,32,112,97,114,116,105,116,105,111,110,32,115,105,122,101,32,100,97,116,97,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,112,97,114,116,105,116,105,111,110,32,37,100,32,108,101,110,103,116,104,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,37,100,0,65,32,115,116,114,101,97,109,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,99,111,109,112,108,101,116,101,32,107,101,121,32,102,114,97,109,101,0,0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0,0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15,173,148,140,0,176,155,140,135,0,180,157,141,134,130,0,254,254,243,230,196,177,153,140,133,130,129,0,73,110,118,97,108,105,100,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,0,73,110,99,111,114,114,101,99,116,32,98,117,102,102,101,114,32,100,105,109,101,110,115,105,111,110,115,0,86,80,88,32,112,114,111,99,101,115,115,95,104,101,97,100,101,114,32,115,104,111,117,108,100,32,110,111,116,32,104,97,112,112,101,110,63,0,103,111,116,32,109,117,108,116,105,112,108,101,32,102,114,97,109,101,115,32,102,114,111,109,32,86,80,57,32,115,116,114,101,97,109,32,117,110,101,120,112,101,99,116,101,100,108,121,63,0,83,107,105,112,112,105,110,103,32,102,114,97,109,101,32,119,105,116,104,32,117,110,107,110,111,119,110,32,112,105,99,116,117,114,101,32,116,121,112,101,32,37,100,10,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_i64Subtract\"]=_i64Subtract;Module[\"_i64Add\"]=_i64Add;Module[\"_memset\"]=_memset;Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _abort(){Module[\"abort\"]()}function _realloc(){throw\"bad\"}Module[\"_realloc\"]=_realloc;Module[\"_saveSetjmp\"]=_saveSetjmp;Module[\"_testSetjmp\"]=_testSetjmp;function _longjmp(env,value){Module[\"setThrew\"](env,value||1);throw\"longjmp\"}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);Module[\"_llvm_cttz_i32\"]=_llvm_cttz_i32;Module[\"___udivmoddi4\"]=___udivmoddi4;Module[\"___udivdi3\"]=___udivdi3;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;Module[\"___uremdi3\"]=___uremdi3;Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_v\":invoke_v,\"invoke_viiiiii\":invoke_viiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"_longjmp\":_longjmp,\"___syscall6\":___syscall6,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_iiii;var aa=env.invoke_vi;var ba=env.invoke_vii;var ca=env.invoke_ii;var da=env.invoke_v;var ea=env.invoke_viiiiii;var fa=env.invoke_iii;var ga=env.invoke_iiiiii;var ha=env.invoke_viiii;var ia=env._ogvjs_callback_frame;var ja=env._longjmp;var ka=env.___syscall6;var la=env.___setErrNo;var ma=env._abort;var na=env._emscripten_memcpy_big;var oa=env.___syscall54;var pa=env.___syscall140;var qa=env.___syscall146;var ra=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction Ba(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function Ca(){return l|0}function Da(a){a=a|0;l=a}function Ea(a,b){a=a|0;b=b|0;l=a;m=b}function Fa(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Ga(a){a=a|0;D=a}function Ha(){return D|0}function Ia(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;if((f|0)==10)if((a|0)!=0&(b|0)!=0)if((c[b+4>>2]|0)==5){f=c[b+8>>2]|0;if((!((e&65536|0)!=0&(f&262144|0)==0)?!((e&131072|0)!=0&(f&524288|0)==0):0)?!((f&1|0)==0|(e&262144|0)!=0&(f&1048576|0)==0):0){f=a+8|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a+4>>2]=b;c[a>>2]=c[b>>2];f=a+24|0;c[f>>2]=0;c[a+16>>2]=e;c[a+20>>2]=d;d=ya[c[b+12>>2]&15](a,0)|0;if(!d)g=0;else{b=c[f>>2]|0;if(!b)h=0;else h=c[b>>2]|0;c[a+12>>2]=h;La(a)|0;g=d}}else g=4}else g=3;else{i=8;j=11}else{i=3;j=11}if((j|0)==11)if(!a){k=i;return k|0}else g=i;c[a+8>>2]=g;k=g;return k|0}function Ja(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;if(!a){g=8;return g|0}if((b|0)==0^(d|0)!=0){h=c[a+4>>2]|0;if((h|0)!=0?(i=c[a+24>>2]|0,(i|0)!=0):0)j=za[c[h+32>>2]&3](i,b,d,e,f)|0;else j=1}else j=8;c[a+8>>2]=j;g=j;return g|0}function Ka(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if(!((a|0)!=0&(b|0)!=0)){d=0;return d|0}e=c[a+4>>2]|0;if(!e){d=0;return d|0}f=c[a+24>>2]|0;if(!f){d=0;return d|0}d=ya[c[e+36>>2]&15](f,b)|0;return d|0}function La(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if(!a){b=8;return b|0}d=a+4|0;e=c[d>>2]|0;if((e|0)!=0?(f=a+24|0,g=c[f>>2]|0,(g|0)!=0):0){va[c[e+16>>2]&3](g)|0;c[d>>2]=0;c[a>>2]=0;c[f>>2]=0;h=0}else h=1;c[a+8>>2]=h;b=h;return b|0}function Ma(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+16|0;h=g;c[b>>2]=d;d=b+4|0;c[d>>2]=0;if(e|0){c[d>>2]=1;c[h>>2]=f;td(b+8|0,79,e,h)|0;a[b+87>>0]=0}if(!(c[b+88>>2]|0)){l=g;return}else ja(b+92|0,c[b>>2]|0)}function Na(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=ie(a|0,0,3,0)|0;e=ie(d|0,D|0,b|0,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&e>>>0<2147418113)&((e|0)==(e|0)&(b|0)==0))){f=0;return f|0}b=be(e)|0;e=a+-1+(b+4)&0-a;if(!b){f=0;return f|0}c[e+-4>>2]=b;f=e;return f|0}function Oa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if(a|0?(d=S(b,a)|0,e=(a|0)==0,f=re(2147418112,0,a|0,0)|0,g=D,(e?0:((d>>>0)/((e?1:a)>>>0)|0|0)!=(b|0))|(g>>>0<0|(g|0)==0&f>>>0<b>>>0)):0){h=0;return h|0}f=S(b,a)|0;a=ie(f|0,0,11,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&a>>>0<2147418113)&((a|0)==(a|0)&(b|0)==0))){h=0;return h|0}b=be(a)|0;a=b+4+7&-8;g=a;if(!b){h=0;return h|0}c[g+-4>>2]=b;if(!a){h=0;return h|0}je(g|0,0,f|0)|0;h=g;return h|0}function Pa(a){a=a|0;if(!a)return;ce(c[a+-4>>2]|0);return}function Qa(a){a=a|0;var b=0,d=0;if(!a){b=-1;return b|0}if((c[a+72>>2]|0)>0)Pa(c[a+68>>2]|0);d=a;a=d+120|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(a|0));b=0;return b|0}function Ra(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(!a){f=-2;return f|0}g=b+15&-16;h=d+15&-16;i=e<<1;j=g+31+i&-32;k=S(j,h+i|0)|0;i=g>>1;l=h>>1;m=j>>1;n=S(m,l+e|0)|0;o=(n<<1)+k|0;p=a+68|0;q=c[p>>2]|0;if(!q){r=Na(32,o)|0;c[p>>2]=r;c[a+72>>2]=o;if(!r){f=-1;return f|0}else s=r}else if((c[a+72>>2]|0)<(o|0)){f=-1;return f|0}else s=q;if(e&31|0){f=-3;return f|0}c[a+8>>2]=b;c[a+12>>2]=d;c[a>>2]=g;c[a+4>>2]=h;c[a+16>>2]=j;c[a+28>>2]=(b+1|0)/2|0;c[a+32>>2]=(d+1|0)/2|0;c[a+20>>2]=i;c[a+24>>2]=l;c[a+36>>2]=m;c[a+40>>2]=0;c[a+44>>2]=0;c[a+48>>2]=0;c[a+76>>2]=e;c[a+80>>2]=o;c[a+52>>2]=s+(S(j,e)|0)+e;j=s+k|0;k=(e|0)/2|0;e=S(m,k)|0;c[a+56>>2]=j+e+k;c[a+60>>2]=j+n+e+k;c[a+64>>2]=0;c[a+112>>2]=0;f=0;return f|0}function Sa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!a){f=-2;return f|0}if((c[a+72>>2]|0)>0)Pa(c[a+68>>2]|0);g=a;h=g+120|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));f=Ra(a,b,d,e)|0;return f|0}function Ta(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=c[b+76>>2]|0;e=(d|0)/2|0;f=c[b+52>>2]|0;g=c[b+16>>2]|0;h=c[b+8>>2]|0;i=c[b+12>>2]|0;j=d-i+(c[b+4>>2]|0)|0;k=(c[b>>2]|0)+d|0;l=k-h|0;m=k+d|0;k=f+h|0;h=0-d|0;n=f+h|0;if((i|0)>0){o=n;p=k;q=0;r=f;s=k+-1|0;while(1){je(o|0,a[r>>0]|0,d|0)|0;je(p|0,a[s>>0]|0,l|0)|0;q=q+1|0;if((q|0)==(i|0))break;else{o=o+g|0;p=p+g|0;r=r+g|0;s=s+g|0}}}s=f+(S(i+-1|0,g)|0)+h|0;r=f+(S(i,g)|0)+h|0;if((d|0)>0){i=f+(S(g,h)|0)+h|0;h=0;while(1){oe(i|0,n|0,m|0)|0;h=h+1|0;if((h|0)==(d|0))break;else i=i+g|0}}if((j|0)>0){i=r;r=0;while(1){oe(i|0,s|0,m|0)|0;r=r+1|0;if((r|0)==(j|0))break;else i=i+g|0}}g=c[b+56>>2]|0;i=b+36|0;j=c[i>>2]|0;r=b+28|0;m=c[r>>2]|0;s=b+32|0;h=c[s>>2]|0;n=b+24|0;f=e-h+(c[n>>2]|0)|0;p=b+20|0;o=(c[p>>2]|0)+e|0;q=o-m|0;l=o+e|0;o=g+m|0;m=0-e|0;k=g+m|0;if((h|0)>0){t=k;u=o;v=0;w=g;x=o+-1|0;while(1){je(t|0,a[w>>0]|0,e|0)|0;je(u|0,a[x>>0]|0,q|0)|0;v=v+1|0;if((v|0)==(h|0))break;else{t=t+j|0;u=u+j|0;w=w+j|0;x=x+j|0}}}x=g+(S(h+-1|0,j)|0)+m|0;w=g+(S(h,j)|0)+m|0;h=(d|0)>1;if(h){d=g+(S(j,m)|0)+m|0;g=0;while(1){oe(d|0,k|0,l|0)|0;g=g+1|0;if((g|0)==(e|0))break;else d=d+j|0}}if((f|0)>0){d=w;w=0;while(1){oe(d|0,x|0,l|0)|0;w=w+1|0;if((w|0)==(f|0))break;else d=d+j|0}}j=c[b+60>>2]|0;b=c[i>>2]|0;i=c[r>>2]|0;r=c[s>>2]|0;s=e-r+(c[n>>2]|0)|0;n=(c[p>>2]|0)+e|0;p=n-i|0;d=n+e|0;n=j+i|0;i=j+m|0;if((r|0)>0){f=i;w=n;l=0;x=j;g=n+-1|0;while(1){je(f|0,a[x>>0]|0,e|0)|0;je(w|0,a[g>>0]|0,p|0)|0;l=l+1|0;if((l|0)==(r|0))break;else{f=f+b|0;w=w+b|0;x=x+b|0;g=g+b|0}}}g=j+(S(r+-1|0,b)|0)+m|0;x=j+(S(r,b)|0)+m|0;if(h){h=j+(S(b,m)|0)+m|0;m=0;while(1){oe(h|0,i|0,d|0)|0;m=m+1|0;if((m|0)==(e|0))break;else h=h+b|0}}if((s|0)>0){y=x;z=0}else return;while(1){oe(y|0,g|0,d|0)|0;z=z+1|0;if((z|0)==(s|0))break;else y=y+b|0}return}function Ua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+4|0;if((c[d>>2]|0)>0){e=a+16|0;f=b+16|0;g=c[b+52>>2]|0;h=0;i=c[a+52>>2]|0;while(1){oe(g|0,i|0,c[a>>2]|0)|0;h=h+1|0;if((h|0)>=(c[d>>2]|0))break;else{g=g+(c[f>>2]|0)|0;i=i+(c[e>>2]|0)|0}}}e=a+24|0;if((c[e>>2]|0)<=0){Ta(b);return}i=a+20|0;f=a+36|0;g=b+36|0;d=c[b+56>>2]|0;h=0;j=c[a+56>>2]|0;while(1){oe(d|0,j|0,c[i>>2]|0)|0;h=h+1|0;k=c[e>>2]|0;if((h|0)>=(k|0))break;else{d=d+(c[g>>2]|0)|0;j=j+(c[f>>2]|0)|0}}if((k|0)<=0){Ta(b);return}k=a+20|0;f=a+36|0;j=b+36|0;g=c[b+60>>2]|0;d=0;h=c[a+60>>2]|0;while(1){oe(g|0,h|0,c[k>>2]|0)|0;d=d+1|0;if((d|0)>=(c[e>>2]|0))break;else{g=g+(c[j>>2]|0)|0;h=h+(c[f>>2]|0)|0}}Ta(b);return}function Va(){if(c[2144]|0)return;c[2144]=1;return}function Wa(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;je(a|0,((d[c+-1>>0]|0)+2+(f<<1)+g|0)>>>2&255|0,4)|0;je(a+b|0,(f+2+(g<<1)+h|0)>>>2&255|0,4)|0;je(a+(b<<1)|0,(g+2+(h<<1)+i|0)>>>2&255|0,4)|0;je(a+(b*3|0)|0,(h+2+i+(i<<1)|0)>>>2&255|0,4)|0;return}function Xa(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;j=d[e+4>>0]|0;a[b>>0]=((d[e+-1>>0]|0)+2+(f<<1)+g|0)>>>2;a[b+1>>0]=(f+2+(g<<1)+h|0)>>>2;a[b+2>>0]=(g+2+(h<<1)+i|0)>>>2;a[b+3>>0]=(h+2+(i<<1)+j|0)>>>2;j=b+c|0;i=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;a[j>>0]=i;a[j+1>>0]=i>>8;a[j+2>>0]=i>>16;a[j+3>>0]=i>>24;i=b+(c<<1)|0;j=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;a[i>>0]=j;a[i+1>>0]=j>>8;a[i+2>>0]=j>>16;a[i+3>>0]=j>>24;j=b+(c*3|0)|0;c=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;a[j>>0]=c;a[j+1>>0]=c>>8;a[j+2>>0]=c>>16;a[j+3>>0]=c>>24;return}function Ya(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;e=d[f>>0]|0;g=d[f+1>>0]|0;h=d[f+2>>0]|0;i=a[f+3>>0]|0;f=i&255;a[b>>0]=(e+1+g|0)>>>1;j=(g+1+h|0)>>>1&255;a[b+c>>0]=j;a[b+2>>0]=j;j=(h+1+f|0)>>>1&255;k=c<<1;a[b+k>>0]=j;a[b+(c+2)>>0]=j;a[b+1>>0]=(e+2+(g<<1)+h|0)>>>2;e=(g+2+(h<<1)+f|0)>>>2&255;a[b+(c+1)>>0]=e;a[b+3>>0]=e;e=(h+2+f+(f<<1)|0)>>>2&255;a[b+(k|1)>>0]=e;a[b+(c+3)>>0]=e;e=c*3|0;a[b+(e+3)>>0]=i;a[b+(e+2)>>0]=i;a[b+(e+1)>>0]=i;a[b+e>>0]=i;a[b+(k+2)>>0]=i;a[b+(k+3)>>0]=i;return}function Za(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;j=d[e+4>>0]|0;k=d[e+5>>0]|0;l=d[e+6>>0]|0;m=d[e+7>>0]|0;a[b>>0]=(f+1+g|0)>>>1;e=(g+1+h|0)>>>1&255;n=c<<1;a[b+n>>0]=e;a[b+1>>0]=e;e=(h+1+i|0)>>>1&255;a[b+(n|1)>>0]=e;a[b+2>>0]=e;e=(i+1+j|0)>>>1&255;a[b+(n+2)>>0]=e;a[b+3>>0]=e;a[b+(n+3)>>0]=(j+2+(k<<1)+l|0)>>>2;a[b+c>>0]=(f+2+(g<<1)+h|0)>>>2;f=(g+2+(h<<1)+i|0)>>>2&255;g=c*3|0;a[b+g>>0]=f;a[b+(c+1)>>0]=f;f=(h+2+(i<<1)+j|0)>>>2&255;a[b+(g+1)>>0]=f;a[b+(c+2)>>0]=f;f=(i+2+(j<<1)+k|0)>>>2&255;a[b+(g+2)>>0]=f;a[b+(c+3)>>0]=f;a[b+(g+3)>>0]=(k+2+(l<<1)+m|0)>>>2;return}function _a(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;f=d[e+1>>0]|0;g=d[e+2>>0]|0;h=d[e+3>>0]|0;i=d[e+4>>0]|0;j=d[e+5>>0]|0;k=d[e+6>>0]|0;l=d[e+7>>0]|0;a[b>>0]=((d[e>>0]|0)+2+(f<<1)+g|0)>>>2;e=(f+2+(g<<1)+h|0)>>>2&255;a[b+c>>0]=e;a[b+1>>0]=e;e=(g+2+(h<<1)+i|0)>>>2&255;g=c<<1;a[b+g>>0]=e;a[b+(c+1)>>0]=e;a[b+2>>0]=e;e=(h+2+(i<<1)+j|0)>>>2&255;h=c*3|0;a[b+h>>0]=e;a[b+(g|1)>>0]=e;a[b+(c+2)>>0]=e;a[b+3>>0]=e;e=(i+2+(j<<1)+k|0)>>>2&255;a[b+(h+1)>>0]=e;a[b+(g+2)>>0]=e;a[b+(c+3)>>0]=e;e=(j+2+(k<<1)+l|0)>>>2&255;a[b+(h+2)>>0]=e;a[b+(g+3)>>0]=e;a[b+(h+3)>>0]=(k+2+l+(l<<1)|0)>>>2;return}function $a(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;f=d[e+-1>>0]|0;j=d[e>>0]|0;k=d[e+1>>0]|0;l=d[e+2>>0]|0;m=d[e+3>>0]|0;e=(f+1+j|0)>>>1&255;n=c<<1;a[b+(n|1)>>0]=e;a[b>>0]=e;e=(j+1+k|0)>>>1&255;a[b+(n+2)>>0]=e;a[b+1>>0]=e;e=(k+1+l|0)>>>1&255;a[b+(n+3)>>0]=e;a[b+2>>0]=e;a[b+3>>0]=(l+1+m|0)>>>1;e=g+2|0;o=c*3|0;a[b+o>>0]=(e+(h<<1)+i|0)>>>2;a[b+n>>0]=((g<<1)+2+h+f|0)>>>2;h=(e+(f<<1)+j|0)>>>2&255;a[b+(o+1)>>0]=h;a[b+c>>0]=h;h=(f+2+(j<<1)+k|0)>>>2&255;a[b+(o+2)>>0]=h;a[b+(c+1)>>0]=h;h=(j+2+(k<<1)+l|0)>>>2&255;a[b+(o+3)>>0]=h;a[b+(c+2)>>0]=h;a[b+(c+3)>>0]=(k+2+(l<<1)+m|0)>>>2;return}function ab(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;n=d[e+3>>0]|0;e=c*3|0;a[b+e>>0]=(h+2+(i<<1)+(d[f+3>>0]|0)|0)>>>2;f=g+2|0;o=(f+(h<<1)+i|0)>>>2&255;i=c<<1;a[b+i>>0]=o;a[b+(e+1)>>0]=o;o=((g<<1)+2+h+j|0)>>>2&255;a[b+c>>0]=o;a[b+(i|1)>>0]=o;a[b+(e+2)>>0]=o;o=(f+(j<<1)+k|0)>>>2&255;a[b>>0]=o;a[b+(c+1)>>0]=o;a[b+(i+2)>>0]=o;a[b+(e+3)>>0]=o;o=(j+2+(k<<1)+l|0)>>>2&255;a[b+1>>0]=o;a[b+(c+2)>>0]=o;a[b+(i+3)>>0]=o;o=(k+2+(l<<1)+m|0)>>>2&255;a[b+2>>0]=o;a[b+(c+3)>>0]=o;a[b+3>>0]=(l+2+(m<<1)+n|0)>>>2;return}function bb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[f+3>>0]|0;f=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;e=g+1|0;n=(e+f|0)>>>1&255;a[b+(c+2)>>0]=n;a[b>>0]=n;n=(e+h|0)>>>1&255;e=c<<1;a[b+(e+2)>>0]=n;a[b+c>>0]=n;n=(h+1+i|0)>>>1&255;o=c*3|0;a[b+(o+2)>>0]=n;a[b+e>>0]=n;a[b+o>>0]=(i+1+j|0)>>>1;a[b+3>>0]=(k+2+(l<<1)+m|0)>>>2;a[b+2>>0]=(f+2+(k<<1)+l|0)>>>2;l=g+2|0;m=(l+(f<<1)+k|0)>>>2&255;a[b+(c+3)>>0]=m;a[b+1>>0]=m;m=((g<<1)+2+h+f|0)>>>2&255;a[b+(e+3)>>0]=m;a[b+(c+1)>>0]=m;m=(l+(h<<1)+i|0)>>>2&255;a[b+(o+3)>>0]=m;a[b+(e|1)>>0]=m;a[b+(o+1)>>0]=(h+2+(i<<1)+j|0)>>>2;return}function cb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=e;e=f;h=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=f+4|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=b+c|0;c=e;a[c>>0]=h;a[c+1>>0]=h>>8;a[c+2>>0]=h>>16;a[c+3>>0]=h>>24;h=e+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;return}function db(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));e=b+c|0;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));return}function eb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;je(b|0,a[e>>0]|0,8)|0;d=b+c|0;je(d|0,a[e+1>>0]|0,8)|0;b=d+c|0;je(b|0,a[e+2>>0]|0,8)|0;d=b+c|0;je(d|0,a[e+3>>0]|0,8)|0;b=d+c|0;je(b|0,a[e+4>>0]|0,8)|0;d=b+c|0;je(d|0,a[e+5>>0]|0,8)|0;b=d+c|0;je(b|0,a[e+6>>0]|0,8)|0;je(b+c|0,a[e+7>>0]|0,8)|0;return}function fb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;je(b|0,a[e>>0]|0,16)|0;d=b+c|0;je(d|0,a[e+1>>0]|0,16)|0;b=d+c|0;je(b|0,a[e+2>>0]|0,16)|0;d=b+c|0;je(d|0,a[e+3>>0]|0,16)|0;b=d+c|0;je(b|0,a[e+4>>0]|0,16)|0;d=b+c|0;je(d|0,a[e+5>>0]|0,16)|0;b=d+c|0;je(b|0,a[e+6>>0]|0,16)|0;d=b+c|0;je(d|0,a[e+7>>0]|0,16)|0;b=d+c|0;je(b|0,a[e+8>>0]|0,16)|0;d=b+c|0;je(d|0,a[e+9>>0]|0,16)|0;b=d+c|0;je(b|0,a[e+10>>0]|0,16)|0;d=b+c|0;je(d|0,a[e+11>>0]|0,16)|0;b=d+c|0;je(b|0,a[e+12>>0]|0,16)|0;d=b+c|0;je(d|0,a[e+13>>0]|0,16)|0;b=d+c|0;je(b|0,a[e+14>>0]|0,16)|0;je(b+c|0,a[e+15>>0]|0,16)|0;return}function gb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=b;b=0;while(1){l=f+b|0;m=(d[l>>0]|0)-g+(d[e>>0]|0)|0;a[k>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[h>>0]|0)|0;a[k+1>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[i>>0]|0)|0;a[k+2>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[j>>0]|0)|0;a[k+3>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;b=b+1|0;if((b|0)==4)break;else k=k+c|0}return}function hb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=e+4|0;l=e+5|0;m=e+6|0;n=e+7|0;o=b;b=0;while(1){p=f+b|0;q=(d[p>>0]|0)-g+(d[e>>0]|0)|0;a[o>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[h>>0]|0)|0;a[o+1>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[i>>0]|0)|0;a[o+2>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[j>>0]|0)|0;a[o+3>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[k>>0]|0)|0;a[o+4>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[l>>0]|0)|0;a[o+5>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[m>>0]|0)|0;a[o+6>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[n>>0]|0)|0;a[o+7>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;b=b+1|0;if((b|0)==8)break;else o=o+c|0}return}function ib(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=d[e+-1>>0]|0;h=b;b=0;while(1){i=f+b|0;j=0;do{k=(d[i>>0]|0)-g+(d[e+j>>0]|0)|0;a[h+j>>0]=(k|0)>255?-1:((k|0)>0?k:0)&255;j=j+1|0}while((j|0)!=16);b=b+1|0;if((b|0)==16)break;else h=h+c|0}return}function jb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;c=d;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;c=d+4|0;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;return}function kb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));e=b+c|0;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));return}function lb(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))+4|0)/8|0)&255;je(a|0,c|0,8)|0;e=a+b|0;je(e|0,c|0,8)|0;a=e+b|0;je(a|0,c|0,8)|0;e=a+b|0;je(e|0,c|0,8)|0;a=e+b|0;je(a|0,c|0,8)|0;e=a+b|0;je(e|0,c|0,8)|0;a=e+b|0;je(a|0,c|0,8)|0;je(a+b|0,c|0,8)|0;return}function mb(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+15>>0]|0)+((d[e+14>>0]|0)+((d[e+13>>0]|0)+((d[e+12>>0]|0)+((d[e+11>>0]|0)+((d[e+10>>0]|0)+((d[e+9>>0]|0)+((d[e+8>>0]|0)+((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))))))))))+8|0)/16|0)&255;je(a|0,c|0,16)|0;e=a+b|0;je(e|0,c|0,16)|0;a=e+b|0;je(a|0,c|0,16)|0;e=a+b|0;je(e|0,c|0,16)|0;a=e+b|0;je(a|0,c|0,16)|0;e=a+b|0;je(e|0,c|0,16)|0;a=e+b|0;je(a|0,c|0,16)|0;e=a+b|0;je(e|0,c|0,16)|0;a=e+b|0;je(a|0,c|0,16)|0;e=a+b|0;je(e|0,c|0,16)|0;a=e+b|0;je(a|0,c|0,16)|0;e=a+b|0;je(e|0,c|0,16)|0;a=e+b|0;je(a|0,c|0,16)|0;e=a+b|0;je(e|0,c|0,16)|0;a=e+b|0;je(a|0,c|0,16)|0;je(a+b|0,c|0,16)|0;return}function nb(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))+4|0)/8|0)&255;je(a|0,e|0,8)|0;c=a+b|0;je(c|0,e|0,8)|0;a=c+b|0;je(a|0,e|0,8)|0;c=a+b|0;je(c|0,e|0,8)|0;a=c+b|0;je(a|0,e|0,8)|0;c=a+b|0;je(c|0,e|0,8)|0;a=c+b|0;je(a|0,e|0,8)|0;je(a+b|0,e|0,8)|0;return}function ob(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))))))))))+8|0)/16|0)&255;je(a|0,e|0,16)|0;c=a+b|0;je(c|0,e|0,16)|0;a=c+b|0;je(a|0,e|0,16)|0;c=a+b|0;je(c|0,e|0,16)|0;a=c+b|0;je(a|0,e|0,16)|0;c=a+b|0;je(c|0,e|0,16)|0;a=c+b|0;je(a|0,e|0,16)|0;c=a+b|0;je(c|0,e|0,16)|0;a=c+b|0;je(a|0,e|0,16)|0;c=a+b|0;je(c|0,e|0,16)|0;a=c+b|0;je(a|0,e|0,16)|0;c=a+b|0;je(c|0,e|0,16)|0;a=c+b|0;je(a|0,e|0,16)|0;c=a+b|0;je(c|0,e|0,16)|0;a=c+b|0;je(a|0,e|0,16)|0;je(a+b|0,e|0,16)|0;return}function pb(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0)+4|0)/8|0)&255;je(a|0,f|0,4)|0;e=a+b|0;je(e|0,f|0,4)|0;a=e+b|0;je(a|0,f|0,4)|0;je(a+b|0,f|0,4)|0;return}function qb(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0)+8|0)/16|0)&255;je(a|0,f|0,8)|0;e=a+b|0;je(e|0,f|0,8)|0;a=e+b|0;je(a|0,f|0,8)|0;e=a+b|0;je(e|0,f|0,8)|0;a=e+b|0;je(a|0,f|0,8)|0;e=a+b|0;je(e|0,f|0,8)|0;a=e+b|0;je(a|0,f|0,8)|0;je(a+b|0,f|0,8)|0;return}function rb(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0))+(d[e+8>>0]|0))+(d[e+9>>0]|0))+(d[e+10>>0]|0))+(d[e+11>>0]|0))+(d[e+12>>0]|0))+(d[e+13>>0]|0))+(d[e+14>>0]|0))+(d[e+15>>0]|0)+16|0)/32|0)&255;je(a|0,f|0,16)|0;e=a+b|0;je(e|0,f|0,16)|0;a=e+b|0;je(a|0,f|0,16)|0;e=a+b|0;je(e|0,f|0,16)|0;a=e+b|0;je(a|0,f|0,16)|0;e=a+b|0;je(e|0,f|0,16)|0;a=e+b|0;je(a|0,f|0,16)|0;e=a+b|0;je(e|0,f|0,16)|0;a=e+b|0;je(a|0,f|0,16)|0;e=a+b|0;je(e|0,f|0,16)|0;a=e+b|0;je(a|0,f|0,16)|0;e=a+b|0;je(e|0,f|0,16)|0;a=e+b|0;je(a|0,f|0,16)|0;e=a+b|0;je(e|0,f|0,16)|0;a=e+b|0;je(a|0,f|0,16)|0;je(a+b|0,f|0,16)|0;return}function sb(){if(c[2145]|0)return;c[2145]=1;return}function tb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=a+1816|0;Qa(e)|0;f=a+1936|0;Qa(f)|0;g=a+2056|0;Qa(g)|0;h=a+2176|0;Qa(h)|0;i=a+2328|0;Qa(i)|0;j=a+5940|0;Pa(c[j>>2]|0);k=a+2520|0;Pa(c[k>>2]|0);c[j>>2]=0;c[k>>2]=0;l=b&15;m=((l|0)==0?0:16-l|0)+b|0;b=d&15;l=((b|0)==0?0:16-b|0)+d|0;d=a+2296|0;c[d>>2]=0;c[a+1932>>2]=0;if(((((((Sa(e,m,l,32)|0)>=0?(b=a+2300|0,c[b>>2]=0,c[a+2052>>2]=0,(Sa(f,m,l,32)|0)>=0):0)?(n=a+2304|0,c[n>>2]=0,c[a+2172>>2]=0,(Sa(g,m,l,32)|0)>=0):0)?(o=a+2308|0,c[o>>2]=0,c[a+2292>>2]=0,(Sa(h,m,l,32)|0)>=0):0)?(c[a+2312>>2]=0,c[a+2316>>2]=1,c[a+2320>>2]=2,c[a+2324>>2]=3,c[d>>2]=1,c[b>>2]=1,c[n>>2]=1,c[o>>2]=1,(Sa(i,m,16,32)|0)>=0):0)?(o=l>>4,c[a+2468>>2]=o,l=m>>4,m=a+2472|0,c[m>>2]=l,c[a+2464>>2]=S(o,l)|0,n=l+1|0,l=a+2476|0,c[l>>2]=n,b=Oa(S(o+1|0,n)|0,76)|0,c[k>>2]=b,b|0):0)?(c[a+2524>>2]=b+((c[l>>2]|0)*76|0)+76,l=Oa((c[m>>2]|0)*9|0,1)|0,c[j>>2]=l,l|0):0){p=0;return p|0}Qa(e)|0;Qa(f)|0;Qa(g)|0;Qa(h)|0;Qa(i)|0;Pa(c[j>>2]|0);Pa(c[k>>2]|0);c[j>>2]=0;c[k>>2]=0;p=1;return p|0}function ub(a){a=a|0;var b=0,d=0,e=0,f=0;switch(c[a+8184>>2]|0){case 0:{b=0;d=0;e=0;f=0;break}case 1:{b=0;d=1;e=1;f=0;break}case 2:{b=0;d=1;e=0;f=1;break}case 3:{b=1;d=1;e=1;f=1;break}default:{b=0;d=0;e=0;f=0}}c[a+2484>>2]=f;c[a+2532>>2]=e;c[a+2488>>2]=d;c[a+2492>>2]=b;return}function vb(a){a=a|0;var b=0;Ab(a);Bb(a+7066|0);c[a+2480>>2]=1;c[a+2484>>2]=0;c[a+2532>>2]=0;c[a+2488>>2]=0;c[a+2492>>2]=0;c[a+8188>>2]=0;c[a+1808>>2]=0;b=a+5924|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[a+5912>>2]=0;c[a+5916>>2]=0;return}function wb(a){a=a|0;var b=0,d=0;Qa(a+1816|0)|0;Qa(a+1936|0)|0;Qa(a+2056|0)|0;Qa(a+2176|0)|0;Qa(a+2328|0)|0;b=a+5940|0;Pa(c[b>>2]|0);d=a+2520|0;Pa(c[d>>2]|0);c[b>>2]=0;c[d>>2]=0;return}function xb(a,d){a=a|0;d=d|0;var e=0,f=0;e=c[a+4>>2]|0;f=c[a>>2]|0;a=0;do{b[e+(a<<1)>>1]=S(b[d+(a<<1)>>1]|0,b[f+(a<<1)>>1]|0)|0;a=a+1|0}while((a|0)!=16);return}function yb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=0;do{g=a+(f<<1)|0;b[g>>1]=S(b[g>>1]|0,b[c+(f<<1)>>1]|0)|0;f=f+1|0}while((f|0)!=16);Ob(a,d,e,d,e);e=a;a=e+32|0;do{b[e>>1]=0;e=e+2|0}while((e|0)<(a|0));return}function zb(a){a=a|0;oe(a+7085|0,3236,1056)|0;return}function Ab(b){b=b|0;var c=0;c=b+7075|0;a[c>>0]=112;a[c+1>>0]=86;a[c+2>>0]=140;a[c+3>>0]=37;c=b+7079|0;a[c>>0]=a[4296]|0;a[c+1>>0]=a[4297]|0;a[c+2>>0]=a[4298]|0;c=b+7082|0;a[c>>0]=a[5265]|0;a[c+1>>0]=a[5266]|0;a[c+2>>0]=a[5267]|0;return}function Bb(b){b=b|0;var c=0,d=0;c=b;b=4302;d=c+9|0;do{a[c>>0]=a[b>>0]|0;c=c+1|0;b=b+1|0}while((c|0)<(d|0));return}function Cb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=b+16|0;h=d+((c[g>>2]|0)*14|0)|0;d=b+36|0;b=(c[d>>2]|0)*6|0;i=e+b|0;e=f+b|0;b=h+-1|0;f=i+-1|0;j=e+-1|0;a[h>>0]=a[b>>0]|0;a[i>>0]=a[f>>0]|0;a[e>>0]=a[j>>0]|0;a[h+1>>0]=a[b>>0]|0;a[i+1>>0]=a[f>>0]|0;a[e+1>>0]=a[j>>0]|0;a[h+2>>0]=a[b>>0]|0;a[i+2>>0]=a[f>>0]|0;a[e+2>>0]=a[j>>0]|0;a[h+3>>0]=a[b>>0]|0;a[i+3>>0]=a[f>>0]|0;a[e+3>>0]=a[j>>0]|0;j=h+(c[g>>2]|0)|0;g=c[d>>2]|0;d=i+g|0;i=e+g|0;g=j+-1|0;e=d+-1|0;h=i+-1|0;a[j>>0]=a[g>>0]|0;a[d>>0]=a[e>>0]|0;a[i>>0]=a[h>>0]|0;a[j+1>>0]=a[g>>0]|0;a[d+1>>0]=a[e>>0]|0;a[i+1>>0]=a[h>>0]|0;a[j+2>>0]=a[g>>0]|0;a[d+2>>0]=a[e>>0]|0;a[i+2>>0]=a[h>>0]|0;a[j+3>>0]=a[g>>0]|0;a[d+3>>0]=a[e>>0]|0;a[i+3>>0]=a[h>>0]|0;return}function Db(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;k=l;l=l+144|0;m=k;n=f+-4|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=S(d[v+-2>>0]|0,o)|0;e=d[v+-1>>0]|0;w=S(e,p)|0;x=d[v>>0]|0;y=S(x,q)|0;z=d[v+1>>0]|0;A=S(z,r)|0;B=d[v+2>>0]|0;C=S(B,s)|0;D=d[v+3>>0]|0;E=f+64+w+y+A+C+(S(D,t)|0)>>7;c[u>>2]=(E|0)<0?0:(E|0)<255?E:255;E=S(e,o)|0;e=S(x,p)|0;C=S(z,q)|0;A=S(B,r)|0;y=S(D,s)|0;w=v+4|0;f=d[w>>0]|0;F=E+64+e+C+A+y+(S(f,t)|0)>>7;c[u+4>>2]=(F|0)<0?0:(F|0)<255?F:255;F=S(x,o)|0;x=S(z,p)|0;y=S(B,q)|0;A=S(D,r)|0;C=S(f,s)|0;e=d[v+5>>0]|0;E=F+64+x+y+A+C+(S(e,t)|0)>>7;c[u+8>>2]=(E|0)<0?0:(E|0)<255?E:255;E=S(z,o)|0;z=S(B,p)|0;B=S(D,q)|0;D=S(f,r)|0;f=S(e,s)|0;e=E+64+z+B+D+f+(S(d[v+6>>0]|0,t)|0)>>7;c[u+12>>2]=(e|0)<0?0:(e|0)<255?e:255;g=g+1|0;if((g|0)==9)break;else{u=u+16|0;v=w+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=i;i=m+32|0;while(1){m=S(n,c[i+-32>>2]|0)|0;q=S(v,c[i+-16>>2]|0)|0;p=S(u,c[i>>2]|0)|0;o=i;i=i+16|0;w=S(g,c[i>>2]|0)|0;e=S(t,c[o+32>>2]|0)|0;f=m+64+q+p+w+e+(S(s,c[o+48>>2]|0)|0)>>7;a[r>>0]=(f|0)<0?0:((f|0)<255?f:255)&255;f=S(n,c[o+-28>>2]|0)|0;e=S(v,c[o+-12>>2]|0)|0;w=S(u,c[o+4>>2]|0)|0;p=S(g,c[o+20>>2]|0)|0;q=S(t,c[o+36>>2]|0)|0;m=f+64+e+w+p+q+(S(s,c[o+52>>2]|0)|0)>>7;a[r+1>>0]=(m|0)<0?0:((m|0)<255?m:255)&255;m=S(n,c[o+-24>>2]|0)|0;q=S(v,c[o+-8>>2]|0)|0;p=S(u,c[o+8>>2]|0)|0;w=S(g,c[o+24>>2]|0)|0;e=S(t,c[o+40>>2]|0)|0;f=m+64+q+p+w+e+(S(s,c[o+56>>2]|0)|0)>>7;a[r+2>>0]=(f|0)<0?0:((f|0)<255?f:255)&255;f=S(n,c[o+-20>>2]|0)|0;e=S(v,c[o+-4>>2]|0)|0;w=S(u,c[o+12>>2]|0)|0;p=S(g,c[o+28>>2]|0)|0;q=S(t,c[o+44>>2]|0)|0;m=f+64+e+w+p+q+(S(s,c[o+60>>2]|0)|0)>>7;a[r+3>>0]=(m|0)<0?0:((m|0)<255?m:255)&255;h=h+1|0;if((h|0)==4)break;else r=r+j|0}l=k;return}function Eb(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;k=l;l=l+832|0;m=k;n=f+-8|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=0;e=v;do{w=S(d[e+-2>>0]|0,o)|0;x=S(d[e+-1>>0]|0,p)|0;y=S(d[e>>0]|0,q)|0;z=e;e=e+1|0;A=S(d[e>>0]|0,r)|0;B=S(d[z+2>>0]|0,s)|0;C=w+64+x+y+A+B+(S(d[z+3>>0]|0,t)|0)>>7;c[u+(f<<2)>>2]=(C|0)<0?0:(C|0)<255?C:255;f=f+1|0}while((f|0)!=8);g=g+1|0;if((g|0)==13)break;else{u=u+32|0;v=v+8+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=i;i=m+64|0;while(1){m=0;q=i;while(1){p=S(n,c[q+-64>>2]|0)|0;o=S(v,c[q+-32>>2]|0)|0;f=S(u,c[q>>2]|0)|0;e=S(g,c[q+32>>2]|0)|0;C=S(t,c[q+64>>2]|0)|0;z=p+64+o+f+e+C+(S(s,c[q+96>>2]|0)|0)>>7;a[r+m>>0]=(z|0)<0?0:((z|0)<255?z:255)&255;m=m+1|0;if((m|0)==8)break;else q=q+4|0}h=h+1|0;if((h|0)==8)break;else{r=r+j|0;i=i+32|0}}l=k;return}function Fb(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;k=l;l=l+832|0;m=k;n=f+-8|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=0;e=v;do{w=S(d[e+-2>>0]|0,o)|0;x=S(d[e+-1>>0]|0,p)|0;y=S(d[e>>0]|0,q)|0;z=e;e=e+1|0;A=S(d[e>>0]|0,r)|0;B=S(d[z+2>>0]|0,s)|0;C=w+64+x+y+A+B+(S(d[z+3>>0]|0,t)|0)>>7;c[u+(f<<2)>>2]=(C|0)<0?0:(C|0)<255?C:255;f=f+1|0}while((f|0)!=8);g=g+1|0;if((g|0)==9)break;else{u=u+32|0;v=v+8+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=m+64|0;while(1){q=S(n,c[r+-64>>2]|0)|0;p=S(v,c[r+-32>>2]|0)|0;o=S(u,c[r>>2]|0)|0;f=S(g,c[r+32>>2]|0)|0;e=S(t,c[r+64>>2]|0)|0;C=q+64+p+o+f+e+(S(s,c[r+96>>2]|0)|0)>>7;a[i+h>>0]=(C|0)<0?0:((C|0)<255?C:255)&255;h=h+1|0;if((h|0)==8)break;else r=r+4|0}r=i+j|0;i=0;h=m+96|0;while(1){C=S(n,c[h+-64>>2]|0)|0;e=S(v,c[h+-32>>2]|0)|0;f=S(u,c[h>>2]|0)|0;o=S(g,c[h+32>>2]|0)|0;p=S(t,c[h+64>>2]|0)|0;q=C+64+e+f+o+p+(S(s,c[h+96>>2]|0)|0)>>7;a[r+i>>0]=(q|0)<0?0:((q|0)<255?q:255)&255;i=i+1|0;if((i|0)==8)break;else h=h+4|0}h=r+j|0;r=0;i=m+128|0;while(1){q=S(n,c[i+-64>>2]|0)|0;p=S(v,c[i+-32>>2]|0)|0;o=S(u,c[i>>2]|0)|0;f=S(g,c[i+32>>2]|0)|0;e=S(t,c[i+64>>2]|0)|0;C=q+64+p+o+f+e+(S(s,c[i+96>>2]|0)|0)>>7;a[h+r>>0]=(C|0)<0?0:((C|0)<255?C:255)&255;r=r+1|0;if((r|0)==8)break;else i=i+4|0}i=h+j|0;j=0;h=m+160|0;while(1){m=S(n,c[h+-64>>2]|0)|0;r=S(v,c[h+-32>>2]|0)|0;C=S(u,c[h>>2]|0)|0;e=S(g,c[h+32>>2]|0)|0;f=S(t,c[h+64>>2]|0)|0;o=m+64+r+C+e+f+(S(s,c[h+96>>2]|0)|0)>>7;a[i+j>>0]=(o|0)<0?0:((o|0)<255?o:255)&255;j=j+1|0;if((j|0)==8)break;else h=h+4|0}l=k;return}function Gb(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;k=l;l=l+2016|0;m=k;n=f+-16|0;o=b[304+(g*12|0)>>1]|0;p=b[304+(g*12|0)+2>>1]|0;q=b[304+(g*12|0)+4>>1]|0;r=b[304+(g*12|0)+6>>1]|0;s=b[304+(g*12|0)+8>>1]|0;t=b[304+(g*12|0)+10>>1]|0;g=0;u=m;v=e+(0-(f<<1))|0;while(1){f=0;e=v;do{w=S(d[e+-2>>0]|0,o)|0;x=S(d[e+-1>>0]|0,p)|0;y=S(d[e>>0]|0,q)|0;z=e;e=e+1|0;A=S(d[e>>0]|0,r)|0;B=S(d[z+2>>0]|0,s)|0;C=w+64+x+y+A+B+(S(d[z+3>>0]|0,t)|0)>>7;c[u+(f<<2)>>2]=(C|0)<0?0:(C|0)<255?C:255;f=f+1|0}while((f|0)!=16);g=g+1|0;if((g|0)==21)break;else{u=u+64|0;v=v+16+n|0}}n=b[304+(h*12|0)>>1]|0;v=b[304+(h*12|0)+2>>1]|0;u=b[304+(h*12|0)+4>>1]|0;g=b[304+(h*12|0)+6>>1]|0;t=b[304+(h*12|0)+8>>1]|0;s=b[304+(h*12|0)+10>>1]|0;h=0;r=i;i=m+128|0;while(1){m=0;q=i;while(1){p=S(n,c[q+-128>>2]|0)|0;o=S(v,c[q+-64>>2]|0)|0;f=S(u,c[q>>2]|0)|0;e=S(g,c[q+64>>2]|0)|0;C=S(t,c[q+128>>2]|0)|0;z=p+64+o+f+e+C+(S(s,c[q+192>>2]|0)|0)>>7;a[r+m>>0]=(z|0)<0?0:((z|0)<255?z:255)&255;m=m+1|0;if((m|0)==16)break;else q=q+4|0}h=h+1|0;if((h|0)==16)break;else{r=r+j|0;i=i+64|0}}l=k;return}function Hb(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0;k=l;l=l+544|0;m=k;n=f+-4|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=S(f,d[q>>0]|0)|0;r=d[q+1>>0]|0;b[g>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+2>>0]|0;b[g+2>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+3>>0]|0;b[g+4>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;b[g+6>>1]=(c+64+(S(o,d[q+4>>0]|0)|0)|0)>>>7;p=p+1|0;if((p|0)==5)break;else{g=g+8|0;q=q+4+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=b[m>>1]|0;g=i;i=0;p=m;while(1){m=S(n,h&65535)|0;o=p;p=p+8|0;h=b[p>>1]|0;a[g>>0]=(m+64+(S(q,h&65535)|0)|0)>>>7;m=S(n,e[o+2>>1]|0)|0;a[g+1>>0]=(m+64+(S(q,e[o+10>>1]|0)|0)|0)>>>7;m=S(n,e[o+4>>1]|0)|0;a[g+2>>0]=(m+64+(S(q,e[o+12>>1]|0)|0)|0)>>>7;m=S(n,e[o+6>>1]|0)|0;a[g+3>>0]=(m+64+(S(q,e[o+14>>1]|0)|0)|0)>>>7;i=i+1|0;if((i|0)==4)break;else g=g+j|0}l=k;return}function Ib(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0;k=l;l=l+544|0;m=k;n=f+-8|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=S(f,d[q>>0]|0)|0;r=d[q+1>>0]|0;b[g>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+2>>0]|0;b[g+2>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+3>>0]|0;b[g+4>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+4>>0]|0;b[g+6>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+5>>0]|0;b[g+8>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+6>>0]|0;b[g+10>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=q+7|0;b[g+12>>1]=(c+64+(S(o,d[r>>0]|0)|0)|0)>>>7;c=S(f,d[r>>0]|0)|0;b[g+14>>1]=(c+64+(S(o,d[q+8>>0]|0)|0)|0)>>>7;p=p+1|0;if((p|0)==9)break;else{g=g+16|0;q=q+8+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=i;i=0;g=m;while(1){m=S(n,e[g>>1]|0)|0;p=g;g=g+16|0;a[h>>0]=(m+64+(S(q,e[g>>1]|0)|0)|0)>>>7;m=S(n,e[p+2>>1]|0)|0;a[h+1>>0]=(m+64+(S(q,e[p+18>>1]|0)|0)|0)>>>7;m=S(n,e[p+4>>1]|0)|0;a[h+2>>0]=(m+64+(S(q,e[p+20>>1]|0)|0)|0)>>>7;m=S(n,e[p+6>>1]|0)|0;a[h+3>>0]=(m+64+(S(q,e[p+22>>1]|0)|0)|0)>>>7;m=S(n,e[p+8>>1]|0)|0;a[h+4>>0]=(m+64+(S(q,e[p+24>>1]|0)|0)|0)>>>7;m=S(n,e[p+10>>1]|0)|0;a[h+5>>0]=(m+64+(S(q,e[p+26>>1]|0)|0)|0)>>>7;m=S(n,e[p+12>>1]|0)|0;a[h+6>>0]=(m+64+(S(q,e[p+28>>1]|0)|0)|0)>>>7;m=S(n,e[p+14>>1]|0)|0;a[h+7>>0]=(m+64+(S(q,e[p+30>>1]|0)|0)|0)>>>7;i=i+1|0;if((i|0)==8)break;else h=h+j|0}l=k;return}function Jb(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0;k=l;l=l+544|0;m=k;n=f+-8|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=S(f,d[q>>0]|0)|0;r=d[q+1>>0]|0;b[g>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+2>>0]|0;b[g+2>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+3>>0]|0;b[g+4>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+4>>0]|0;b[g+6>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+5>>0]|0;b[g+8>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=d[q+6>>0]|0;b[g+10>>1]=(c+64+(S(o,r)|0)|0)>>>7;c=S(f,r)|0;r=q+7|0;b[g+12>>1]=(c+64+(S(o,d[r>>0]|0)|0)|0)>>>7;c=S(f,d[r>>0]|0)|0;b[g+14>>1]=(c+64+(S(o,d[q+8>>0]|0)|0)|0)>>>7;p=p+1|0;if((p|0)==5)break;else{g=g+16|0;q=q+8+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=i;i=0;g=m;while(1){m=S(n,e[g>>1]|0)|0;p=g;g=g+16|0;a[h>>0]=(m+64+(S(q,e[g>>1]|0)|0)|0)>>>7;m=S(n,e[p+2>>1]|0)|0;a[h+1>>0]=(m+64+(S(q,e[p+18>>1]|0)|0)|0)>>>7;m=S(n,e[p+4>>1]|0)|0;a[h+2>>0]=(m+64+(S(q,e[p+20>>1]|0)|0)|0)>>>7;m=S(n,e[p+6>>1]|0)|0;a[h+3>>0]=(m+64+(S(q,e[p+22>>1]|0)|0)|0)>>>7;m=S(n,e[p+8>>1]|0)|0;a[h+4>>0]=(m+64+(S(q,e[p+24>>1]|0)|0)|0)>>>7;m=S(n,e[p+10>>1]|0)|0;a[h+5>>0]=(m+64+(S(q,e[p+26>>1]|0)|0)|0)>>>7;m=S(n,e[p+12>>1]|0)|0;a[h+6>>0]=(m+64+(S(q,e[p+28>>1]|0)|0)|0)>>>7;m=S(n,e[p+14>>1]|0)|0;a[h+7>>0]=(m+64+(S(q,e[p+30>>1]|0)|0)|0)>>>7;i=i+1|0;if((i|0)==4)break;else h=h+j|0}l=k;return}function Kb(c,f,g,h,i,j){c=c|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=l;l=l+544|0;m=k;n=f+-16|0;f=b[272+(g<<2)>>1]|0;o=b[272+(g<<2)+2>>1]|0;g=m;p=0;q=c;while(1){c=0;r=q;do{s=S(f,d[r>>0]|0)|0;r=r+1|0;b[g+(c<<1)>>1]=(s+64+(S(o,d[r>>0]|0)|0)|0)>>>7;c=c+1|0}while((c|0)!=16);p=p+1|0;if((p|0)==17)break;else{g=g+32|0;q=q+16+n|0}}n=b[272+(h<<2)>>1]|0;q=b[272+(h<<2)+2>>1]|0;h=i;i=0;g=m;while(1){m=0;p=g;while(1){o=S(n,e[p>>1]|0)|0;a[h+m>>0]=(o+64+(S(q,e[p+32>>1]|0)|0)|0)>>>7;m=m+1|0;if((m|0)==16)break;else p=p+2|0}i=i+1|0;if((i|0)==16)break;else{h=h+j|0;g=g+32|0}}l=k;return}function Lb(a){a=a|0;return}function Mb(c,d,e,f,g){c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=(f<<2)+-16|0;i=e;e=g;g=0;j=c;while(1){if((a[e>>0]|0)>1)yb(j,d,i,f);else{Pb((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,i,f,i,f);b[j>>1]=0;b[j+2>>1]=0>>>16}c=j+32|0;k=i+4|0;if((a[e+1>>0]|0)>1)yb(c,d,k,f);else{Pb((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,k,f,k,f);b[c>>1]=0;b[c+2>>1]=0>>>16}c=j+64|0;k=i+8|0;if((a[e+2>>0]|0)>1)yb(c,d,k,f);else{Pb((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,k,f,k,f);b[c>>1]=0;b[c+2>>1]=0>>>16}c=j+96|0;k=i+12|0;if((a[e+3>>0]|0)>1)yb(c,d,k,f);else{Pb((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,k,f,k,f);b[c>>1]=0;b[c+2>>1]=0>>>16}g=g+1|0;if((g|0)==4)break;else{i=i+16+h|0;e=e+4|0;j=j+128|0}}return}function Nb(c,d,e,f,g,h){c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=(g<<2)+-8|0;j=c+64|0;if((a[h>>0]|0)>1)yb(c,d,e,g);else{Pb((S(b[d>>1]|0,b[c>>1]|0)|0)&65535,e,g,e,g);b[c>>1]=0;b[c+2>>1]=0>>>16}k=c+32|0;l=e+4|0;if((a[h+1>>0]|0)>1)yb(k,d,l,g);else{Pb((S(b[d>>1]|0,b[k>>1]|0)|0)&65535,l,g,l,g);b[k>>1]=0;b[k+2>>1]=0>>>16}k=e+8+i|0;if((a[h+2>>0]|0)>1)yb(j,d,k,g);else{Pb((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,k,g,k,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=c+96|0;e=k+4|0;if((a[h+3>>0]|0)>1)yb(j,d,e,g);else{Pb((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,e,g,e,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=c+128|0;e=c+192|0;if((a[h+4>>0]|0)>1)yb(j,d,f,g);else{Pb((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,f,g,f,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=c+160|0;k=f+4|0;if((a[h+5>>0]|0)>1)yb(j,d,k,g);else{Pb((S(b[d>>1]|0,b[j>>1]|0)|0)&65535,k,g,k,g);b[j>>1]=0;b[j+2>>1]=0>>>16}j=f+8+i|0;if((a[h+6>>0]|0)>1)yb(e,d,j,g);else{Pb((S(b[d>>1]|0,b[e>>1]|0)|0)&65535,j,g,j,g);b[e>>1]=0;b[e+2>>1]=0>>>16}e=c+224|0;c=j+4|0;if((a[h+7>>0]|0)>1){yb(e,d,c,g);return}else{Pb((S(b[d>>1]|0,b[e>>1]|0)|0)&65535,c,g,c,g);b[e>>1]=0;b[e+2>>1]=0>>>16;return}}function Ob(c,e,f,g,h){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;i=l;l=l+32|0;j=i;k=b[c>>1]|0;m=b[c+16>>1]|0;n=m+k|0;o=k-m|0;m=b[c+8>>1]|0;k=b[c+24>>1]|0;p=(m*35468>>16)-k-(k*20091>>16)|0;q=(m*20091>>16)+m+(k*35468>>16)|0;b[j>>1]=q+n;b[j+24>>1]=n-q;b[j+8>>1]=p+o;b[j+16>>1]=o-p;p=b[c+2>>1]|0;o=b[c+18>>1]|0;q=o+p|0;n=p-o|0;o=b[c+10>>1]|0;p=b[c+26>>1]|0;k=(o*35468>>16)-p-(p*20091>>16)|0;m=(o*20091>>16)+o+(p*35468>>16)|0;p=m+q&65535;b[j+2>>1]=p;b[j+26>>1]=q-m;b[j+10>>1]=k+n;b[j+18>>1]=n-k;k=b[c+4>>1]|0;n=b[c+20>>1]|0;m=n+k|0;q=k-n|0;n=b[c+12>>1]|0;k=b[c+28>>1]|0;o=(n*35468>>16)-k-(k*20091>>16)|0;r=(n*20091>>16)+n+(k*35468>>16)|0;b[j+4>>1]=r+m;b[j+28>>1]=m-r;b[j+12>>1]=o+q;b[j+20>>1]=q-o;o=b[c+6>>1]|0;q=b[c+22>>1]|0;r=q+o|0;m=o-q|0;q=b[c+14>>1]|0;o=b[c+30>>1]|0;c=(q*35468>>16)-o-(o*20091>>16)|0;k=(q*20091>>16)+q+(o*35468>>16)|0;b[j+6>>1]=k+r;b[j+30>>1]=r-k;b[j+14>>1]=c+m;b[j+22>>1]=m-c;c=p;p=0;m=j;while(1){k=b[m>>1]|0;r=m+4|0;o=b[r>>1]|0;q=c<<16>>16;n=m+6|0;s=b[n>>1]|0;t=(q*35468>>16)-s-(s*20091>>16)|0;u=(q*20091>>16)+q+(s*35468>>16)|0;s=o+k+4|0;b[m>>1]=(s+u|0)>>>3;b[n>>1]=(s-u|0)>>>3;u=k-o+4|0;b[m+2>>1]=(u+t|0)>>>3;b[r>>1]=(u-t|0)>>>3;t=p+1|0;if((t|0)==4){v=g;w=j;x=e;y=0;break}c=b[m+10>>1]|0;p=t;m=m+8|0}while(1){m=(d[x>>0]|0)+(b[w>>1]|0)|0;p=(m|0)>0?m:0;a[v>>0]=(p|0)<255?p:255;p=(d[x+1>>0]|0)+(b[w+2>>1]|0)|0;m=(p|0)>0?p:0;a[v+1>>0]=(m|0)<255?m:255;m=(d[x+2>>0]|0)+(b[w+4>>1]|0)|0;p=(m|0)>0?m:0;a[v+2>>0]=(p|0)<255?p:255;p=(d[x+3>>0]|0)+(b[w+6>>1]|0)|0;m=(p|0)>0?p:0;a[v+3>>0]=(m|0)<255?m:255;y=y+1|0;if((y|0)==4)break;else{v=v+h|0;w=w+8|0;x=x+f|0}}l=i;return}function Pb(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=(b<<16>>16)+4>>3;b=(d[c>>0]|0)+h|0;i=(b|0)>0?b:0;a[f>>0]=(i|0)<255?i:255;i=(d[c+1>>0]|0)+h|0;b=(i|0)>0?i:0;a[f+1>>0]=(b|0)<255?b:255;b=(d[c+2>>0]|0)+h|0;i=(b|0)>0?b:0;a[f+2>>0]=(i|0)<255?i:255;i=(d[c+3>>0]|0)+h|0;b=(i|0)>0?i:0;a[f+3>>0]=(b|0)<255?b:255;b=f+g|0;f=c+e|0;c=(d[f>>0]|0)+h|0;i=(c|0)>0?c:0;a[b>>0]=(i|0)<255?i:255;i=(d[f+1>>0]|0)+h|0;c=(i|0)>0?i:0;a[b+1>>0]=(c|0)<255?c:255;c=(d[f+2>>0]|0)+h|0;i=(c|0)>0?c:0;a[b+2>>0]=(i|0)<255?i:255;i=(d[f+3>>0]|0)+h|0;c=(i|0)>0?i:0;a[b+3>>0]=(c|0)<255?c:255;c=b+g|0;b=f+e|0;f=(d[b>>0]|0)+h|0;i=(f|0)>0?f:0;a[c>>0]=(i|0)<255?i:255;i=(d[b+1>>0]|0)+h|0;f=(i|0)>0?i:0;a[c+1>>0]=(f|0)<255?f:255;f=(d[b+2>>0]|0)+h|0;i=(f|0)>0?f:0;a[c+2>>0]=(i|0)<255?i:255;i=(d[b+3>>0]|0)+h|0;f=(i|0)>0?i:0;a[c+3>>0]=(f|0)<255?f:255;f=c+g|0;g=b+e|0;e=(d[g>>0]|0)+h|0;b=(e|0)>0?e:0;a[f>>0]=(b|0)<255?b:255;b=(d[g+1>>0]|0)+h|0;e=(b|0)>0?b:0;a[f+1>>0]=(e|0)<255?e:255;e=(d[g+2>>0]|0)+h|0;b=(e|0)>0?e:0;a[f+2>>0]=(b|0)<255?b:255;b=(d[g+3>>0]|0)+h|0;h=(b|0)>0?b:0;a[f+3>>0]=(h|0)<255?h:255;return}function Qb(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=l;l=l+32|0;e=d;f=b[a>>1]|0;g=b[a+24>>1]|0;h=g+f|0;i=b[a+8>>1]|0;j=b[a+16>>1]|0;k=j+i|0;m=i-j|0;j=f-g|0;b[e>>1]=k+h;g=e+8|0;b[g>>1]=m+j;b[e+16>>1]=h-k;b[e+24>>1]=j-m;m=e+2|0;j=b[a+2>>1]|0;k=b[a+26>>1]|0;h=k+j|0;f=b[a+10>>1]|0;i=b[a+18>>1]|0;n=i+f|0;o=f-i|0;i=j-k|0;k=n+h|0;b[m>>1]=k;b[e+10>>1]=o+i;b[e+18>>1]=h-n;b[e+26>>1]=i-o;o=b[a+4>>1]|0;i=b[a+28>>1]|0;n=i+o|0;h=b[a+12>>1]|0;j=b[a+20>>1]|0;f=j+h|0;p=h-j|0;j=o-i|0;b[e+20>>1]=n-f;b[e+28>>1]=j-p;i=b[a+6>>1]|0;o=b[a+30>>1]|0;h=o+i|0;q=b[a+14>>1]|0;r=b[a+22>>1]|0;a=r+q|0;s=q-r|0;r=i-o|0;o=h-a|0;b[e+22>>1]=o;i=r-s|0;b[e+30>>1]=i;q=b[e>>1]|0;t=a+h<<16>>16;h=k<<16>>16;k=f+n<<16>>16;n=k+h|0;f=h-k|0;k=t+q+3|0;b[e>>1]=(k+n|0)>>>3;h=q-t+3|0;b[m>>1]=(h+f|0)>>>3;b[e+4>>1]=(k-n|0)>>>3;b[e+6>>1]=(h-f|0)>>>3;f=b[g>>1]|0;h=s+r<<16>>16;r=e+10|0;s=b[r>>1]|0;n=p+j<<16>>16;j=n+s|0;p=s-n|0;n=h+f+3|0;s=(n+j|0)>>>3&65535;b[g>>1]=s;g=f-h+3|0;h=(g+p|0)>>>3&65535;b[r>>1]=h;r=(n-j|0)>>>3&65535;b[e+12>>1]=r;j=(g-p|0)>>>3&65535;b[e+14>>1]=j;p=e+16|0;g=b[p>>1]|0;n=o<<16>>16;o=e+18|0;f=b[o>>1]|0;k=e+20|0;m=b[k>>1]|0;t=m+f|0;q=f-m|0;m=n+g+3|0;f=(m+t|0)>>>3&65535;b[p>>1]=f;p=g-n+3|0;n=(p+q|0)>>>3&65535;b[o>>1]=n;o=(m-t|0)>>>3&65535;b[k>>1]=o;k=(p-q|0)>>>3&65535;b[e+22>>1]=k;q=e+24|0;p=b[q>>1]|0;t=i<<16>>16;i=e+26|0;m=b[i>>1]|0;g=e+28|0;a=b[g>>1]|0;u=a+m|0;v=m-a|0;a=t+p+3|0;m=(a+u|0)>>>3&65535;b[q>>1]=m;q=p-t+3|0;t=(q+v|0)>>>3&65535;b[i>>1]=t;i=(a-u|0)>>>3&65535;b[g>>1]=i;g=(q-v|0)>>>3&65535;b[e+30>>1]=g;b[c>>1]=b[e>>1]|0;b[c+32>>1]=b[e+2>>1]|0;b[c+64>>1]=b[e+4>>1]|0;b[c+96>>1]=b[e+6>>1]|0;b[c+128>>1]=s;b[c+160>>1]=h;b[c+192>>1]=r;b[c+224>>1]=j;b[c+256>>1]=f;b[c+288>>1]=n;b[c+320>>1]=o;b[c+352>>1]=k;b[c+384>>1]=m;b[c+416>>1]=t;b[c+448>>1]=i;b[c+480>>1]=g;l=d;return}function Rb(a,c){a=a|0;c=c|0;var d=0;d=((b[a>>1]|0)+3|0)>>>3&65535;b[c>>1]=d;b[c+32>>1]=d;b[c+64>>1]=d;b[c+96>>1]=d;b[c+128>>1]=d;b[c+160>>1]=d;b[c+192>>1]=d;b[c+224>>1]=d;b[c+256>>1]=d;b[c+288>>1]=d;b[c+320>>1]=d;b[c+352>>1]=d;b[c+384>>1]=d;b[c+416>>1]=d;b[c+448>>1]=d;b[c+480>>1]=d;return}function Sb(){if(c[2146]|0)return;c[2146]=1;return}function Tb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=b+5896|0;e=c[d>>2]|0;f=(e|0)>0;g=f&1;h=(e|0)>4&1;i=9-e|0;if(f){f=0;do{e=f>>g>>h;j=(e|0)>(i|0)?i:e;e=(j|0)>1?j:1;je(b+4592+(f<<4)|0,e&255|0,16)|0;j=f<<1;je(b+3568+(f<<4)|0,e+j&255|0,16)|0;je(b+2544+(f<<4)|0,j+4+e&255|0,16)|0;f=f+1|0}while((f|0)!=64)}else{f=0;do{i=f>>g>>h;e=(i|0)>1?i:1;je(b+4592+(f<<4)|0,e&255|0,16)|0;i=f<<1;je(b+3568+(f<<4)|0,e+i&255|0,16)|0;je(b+2544+(f<<4)|0,i+4+e&255|0,16)|0;f=f+1|0}while((f|0)!=64)}c[b+5892>>2]=c[d>>2];d=0;do{do if((d|0)<=39)if((d|0)>19){a[b+5744+d>>0]=1;k=2;break}else{f=(d|0)>14&1;a[b+5744+d>>0]=f;k=f;break}else{a[b+5744+d>>0]=2;k=3}while(0);a[b+5808+d>>0]=k;d=d+1|0}while((d|0)!=64);c[b+5872>>2]=16843009;a[b+5876>>0]=0;a[b+5879>>0]=1;a[b+5877>>0]=2;a[b+5878>>0]=2;a[b+5880>>0]=2;a[b+5881>>0]=3;d=b+5616|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;d=b+5632|0;c[d>>2]=16843009;c[d+4>>2]=16843009;c[d+8>>2]=16843009;c[d+12>>2]=16843009;d=b+5648|0;c[d>>2]=33686018;c[d+4>>2]=33686018;c[d+8>>2]=33686018;c[d+12>>2]=33686018;d=b+5664|0;c[d>>2]=50529027;c[d+4>>2]=50529027;c[d+8>>2]=50529027;c[d+12>>2]=50529027;return}function Ub(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=b+5892|0;g=b+5896|0;h=c[g>>2]|0;if((c[f>>2]|0)!=(h|0)){i=(h|0)>0;j=i&1;k=(h|0)>4&1;l=9-h|0;if(i){i=0;do{h=i>>j>>k;m=(h|0)>(l|0)?l:h;h=(m|0)>1?m:1;je(b+4592+(i<<4)|0,h&255|0,16)|0;m=i<<1;je(b+3568+(i<<4)|0,h+m&255|0,16)|0;je(b+2544+(i<<4)|0,m+4+h&255|0,16)|0;i=i+1|0}while((i|0)!=64)}else{i=0;do{l=i>>j>>k;h=(l|0)>1?l:1;je(b+4592+(i<<4)|0,h&255|0,16)|0;l=i<<1;je(b+3568+(i<<4)|0,h+l&255|0,16)|0;je(b+2544+(i<<4)|0,l+4+h&255|0,16)|0;i=i+1|0}while((i|0)!=64)}c[f>>2]=c[g>>2]}g=d+3148|0;f=d+3163|0;i=d+3169|0;k=d+3177|0;j=d+3151|0;h=d+3178|0;l=d+3170|0;m=d+3179|0;n=d+3180|0;o=d+3171|0;p=d+3172|0;q=0;do{if(!(a[g>>0]|0))r=e;else{s=(a[d+3159+q>>0]|0)+((a[j>>0]|0)==1?0:e)|0;r=(s|0)>0?((s|0)<63?s:63):0}if(!(a[f>>0]|0))je(b+5680+(q<<4)|0,r&255|0,16)|0;else{s=(a[i>>0]|0)+r|0;t=s+(a[k>>0]|0)|0;a[b+5680+(q<<4)>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;a[b+5680+(q<<4)+1>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=(a[l>>0]|0)+r|0;t=s+(a[h>>0]|0)|0;a[b+5680+(q<<4)+5>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[m>>0]|0)|0;a[b+5680+(q<<4)+6>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[n>>0]|0)|0;a[b+5680+(q<<4)+7>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=(a[o>>0]|0)+r|0;s=t+(a[h>>0]|0)|0;a[b+5680+(q<<4)+9>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=t+(a[m>>0]|0)|0;a[b+5680+(q<<4)+10>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=t+(a[n>>0]|0)|0;a[b+5680+(q<<4)+11>>0]=(s|0)>0?((s|0)<63?s:63)&255:0;s=(a[p>>0]|0)+r|0;t=s+(a[h>>0]|0)|0;a[b+5680+(q<<4)+13>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[m>>0]|0)|0;a[b+5680+(q<<4)+14>>0]=(t|0)>0?((t|0)<63?t:63)&255:0;t=s+(a[n>>0]|0)|0;a[b+5680+(q<<4)+15>>0]=(t|0)>0?((t|0)<63?t:63)&255:0}q=q+1|0}while((q|0)!=4);return}function Vb(b,e,f,g,h,i,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;m=l;l=l+16|0;n=m;o=c[b+2452>>2]|0;p=b+2472|0;if((c[p>>2]|0)<=0){l=m;return}q=n+4|0;r=n+8|0;s=n+12|0;if((f|0)>0){t=0;u=e;v=j;w=k;x=i}else{f=0;y=e;e=j;j=k;k=i;while(1){i=a[y>>0]|0;z=i&255;switch(i<<24>>24){case 9:case 4:{A=0;break}default:A=(a[y+9>>0]|0)!=0}i=a[(d[b+5872+z>>0]|0)+(b+5680+(d[y+11>>0]<<4)+(d[y+2>>0]<<2))>>0]|0;z=i&255;if(i<<24>>24){i=d[b+5744+(o<<6)+z>>0]|0;c[n>>2]=b+2544+(z<<4);c[q>>2]=b+3568+(z<<4);c[r>>2]=b+4592+(z<<4);c[s>>2]=b+5616+(i<<4);if((f|0)>0)dc(k,e,j,g,h,n);if(!A){gc(k,e,j,g,h,n);ec(k,e,j,g,h,n)}}f=f+1|0;if((f|0)>=(c[p>>2]|0))break;else{y=y+76|0;e=e+8|0;j=j+8|0;k=k+16|0}}l=m;return}while(1){k=a[u>>0]|0;j=k&255;switch(k<<24>>24){case 9:case 4:{B=0;break}default:B=(a[u+9>>0]|0)!=0}k=a[(d[b+5872+j>>0]|0)+(b+5680+(d[u+11>>0]<<4)+(d[u+2>>0]<<2))>>0]|0;j=k&255;do if(k<<24>>24){e=d[b+5744+(o<<6)+j>>0]|0;c[n>>2]=b+2544+(j<<4);c[q>>2]=b+3568+(j<<4);c[r>>2]=b+4592+(j<<4);c[s>>2]=b+5616+(e<<4);if((t|0)>0)dc(x,v,w,g,h,n);if(B){cc(x,v,w,g,h,n);break}else{gc(x,v,w,g,h,n);cc(x,v,w,g,h,n);ec(x,v,w,g,h,n);break}}while(0);t=t+1|0;if((t|0)>=(c[p>>2]|0))break;else{u=u+76|0;v=v+8|0;w=w+8|0;x=x+16|0}}l=m;return}function Wb(b,e,f,g,h,i,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;k=b+2472|0;if((c[k>>2]|0)<=0)return;if((f|0)>0){l=0;m=e;n=i}else{f=0;j=e;e=i;while(1){i=a[j>>0]|0;h=i&255;switch(i<<24>>24){case 9:case 4:{o=0;break}default:o=(a[j+9>>0]|0)!=0}i=a[(d[b+5872+h>>0]|0)+(b+5680+(d[j+11>>0]<<4)+(d[j+2>>0]<<2))>>0]|0;h=i&255;if(i<<24>>24){if((f|0)>0)bc(e,g,b+2544+(h<<4)|0);if(!o){i=b+3568+(h<<4)|0;hc(e,g,i);fc(e,g,i)}}f=f+1|0;if((f|0)>=(c[k>>2]|0))break;else{j=j+76|0;e=e+16|0}}return}while(1){e=a[m>>0]|0;j=e&255;switch(e<<24>>24){case 9:case 4:{p=0;break}default:p=(a[m+9>>0]|0)!=0}e=a[(d[b+5872+j>>0]|0)+(b+5680+(d[m+11>>0]<<4)+(d[m+2>>0]<<2))>>0]|0;j=e&255;do if(e<<24>>24){if((l|0)>0)bc(n,g,b+2544+(j<<4)|0);if(p){ac(n,g,b+2544+(j<<4)|0);break}else{f=b+3568+(j<<4)|0;hc(n,g,f);ac(n,g,b+2544+(j<<4)|0);fc(n,g,f);break}}while(0);l=l+1|0;if((l|0)>=(c[k>>2]|0))break;else{m=m+76|0;n=n+16|0}}return}function Xb(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;i=S(c,-4)|0;j=S(c,-3)|0;k=S(c,-2)|0;l=0-c|0;m=c<<1;n=c*3|0;o=0-m|0;p=h<<3;h=0;q=b;while(1){b=q+l|0;r=a[b>>0]|0;s=a[q>>0]|0;t=q+c|0;u=a[t>>0]|0;v=d[q+j>>0]|0;w=(d[q+i>>0]|0)-v|0;x=d[f>>0]|0;y=d[q+k>>0]|0;z=v-y|0;v=r&255;A=y-v|0;B=(A|0)>-1?A:0-A|0;A=u&255;C=s&255;D=A-C|0;E=(D|0)>-1?D:0-D|0;D=d[q+m>>0]|0;F=D-A|0;G=(d[q+n>>0]|0)-D|0;D=v-C|0;C=y-A|0;A=d[g>>0]|0;y=(B|0)>(A|0)|(E|0)>(A|0);A=q+o|0;v=(a[A>>0]^-128)<<24>>24;H=(u^-128)<<24>>24;u=v-H|0;I=(u|0)>-128?u:-128;u=(s^-128)<<24>>24;s=(r^-128)<<24>>24;r=(y?((I|0)<127?I:127)<<24>>24:0)+((u-s|0)*3|0)|0;I=(r|0)>-128?r:-128;r=(((((C|0)>-1?C:0-C|0)|0)/2|0)+(((D|0)>-1?D:0-D|0)<<1)|0)>(d[e>>0]|0|0)|(((((w|0)>-1?w:0-w|0)|0)>(x|0)?1:(((z|0)>-1?z:0-z|0)|0)>(x|0))|(B|0)>(x|0)|(E|0)>(x|0)|(((F|0)>-1?F:0-F|0)|0)>(x|0)|(((G|0)>-1?G:0-G|0)|0)>(x|0))?0:((I|0)<127?I:127)<<24>>24;I=r+4|0;x=(I|0)>-128?I:-128;I=r+3|0;r=(I|0)>-128?I:-128;I=((x|0)<127?x:127)<<24>>27;x=u-I|0;u=(x|0)>-128?x:-128;a[q>>0]=((u|0)<127?u:127)&255^-128;u=(((r|0)<127?r:127)<<24>>27)+s|0;s=(u|0)>-128?u:-128;a[b>>0]=((s|0)<127?s:127)&255^-128;s=((I+1|0)>>>1&(y?0:255))<<24>>24;y=H-s|0;H=(y|0)>-128?y:-128;a[t>>0]=((H|0)<127?H:127)&255^-128;H=s+v|0;v=(H|0)>-128?H:-128;a[A>>0]=((v|0)<127?v:127)&255^-128;h=h+1|0;if((h|0)>=(p|0))break;else q=q+1|0}return}function Yb(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;i=h<<3;if((c|0)!=1){h=0;j=b;while(1){k=j+-2|0;l=a[k>>0]|0;m=j+-1|0;n=a[m>>0]|0;o=a[j>>0]|0;p=j+1|0;q=a[p>>0]|0;r=d[j+-3>>0]|0;s=(d[j+-4>>0]|0)-r|0;t=d[f>>0]|0;u=l&255;v=r-u|0;r=n&255;w=u-r|0;x=(w|0)>-1?w:0-w|0;w=q&255;y=o&255;z=w-y|0;A=(z|0)>-1?z:0-z|0;z=d[j+2>>0]|0;B=z-w|0;C=(d[j+3>>0]|0)-z|0;z=r-y|0;y=u-w|0;w=d[g>>0]|0;u=(x|0)>(w|0)|(A|0)>(w|0);w=(l^-128)<<24>>24;l=(q^-128)<<24>>24;q=w-l|0;r=(q|0)>-128?q:-128;q=(o^-128)<<24>>24;o=(n^-128)<<24>>24;n=(u?((r|0)<127?r:127)<<24>>24:0)+((q-o|0)*3|0)|0;r=(n|0)>-128?n:-128;n=(((((y|0)>-1?y:0-y|0)|0)/2|0)+(((z|0)>-1?z:0-z|0)<<1)|0)>(d[e>>0]|0|0)|(((((s|0)>-1?s:0-s|0)|0)>(t|0)?1:(((v|0)>-1?v:0-v|0)|0)>(t|0))|(x|0)>(t|0)|(A|0)>(t|0)|(((B|0)>-1?B:0-B|0)|0)>(t|0)|(((C|0)>-1?C:0-C|0)|0)>(t|0))?0:((r|0)<127?r:127)<<24>>24;r=n+4|0;t=(r|0)>-128?r:-128;r=n+3|0;n=(r|0)>-128?r:-128;r=((t|0)<127?t:127)<<24>>27;t=q-r|0;q=(t|0)>-128?t:-128;a[j>>0]=((q|0)<127?q:127)&255^-128;q=(((n|0)<127?n:127)<<24>>27)+o|0;o=(q|0)>-128?q:-128;a[m>>0]=((o|0)<127?o:127)&255^-128;o=((r+1|0)>>>1&(u?0:255))<<24>>24;u=l-o|0;l=(u|0)>-128?u:-128;a[p>>0]=((l|0)<127?l:127)&255^-128;l=o+w|0;w=(l|0)>-128?l:-128;a[k>>0]=((w|0)<127?w:127)&255^-128;h=h+1|0;if((h|0)>=(i|0))break;else j=j+c|0}return}j=0;h=b;w=a[b>>0]|0;while(1){b=h+-2|0;k=a[b>>0]|0;l=h+-1|0;o=a[l>>0]|0;p=h+1|0;u=a[p>>0]|0;r=d[h+-3>>0]|0;m=(d[h+-4>>0]|0)-r|0;q=d[f>>0]|0;n=k&255;t=r-n|0;r=o&255;C=n-r|0;B=(C|0)>-1?C:0-C|0;C=u&255;A=w&255;x=C-A|0;v=(x|0)>-1?x:0-x|0;x=d[h+2>>0]|0;s=x-C|0;z=(d[h+3>>0]|0)-x|0;x=r-A|0;A=n-C|0;C=d[g>>0]|0;n=(B|0)>(C|0)|(v|0)>(C|0);C=(k^-128)<<24>>24;k=(u^-128)<<24>>24;u=C-k|0;r=(u|0)>-128?u:-128;u=(w^-128)<<24>>24;y=(o^-128)<<24>>24;o=(n?((r|0)<127?r:127)<<24>>24:0)+((u-y|0)*3|0)|0;r=(o|0)>-128?o:-128;o=(((((A|0)>-1?A:0-A|0)|0)/2|0)+(((x|0)>-1?x:0-x|0)<<1)|0)>(d[e>>0]|0|0)|(((((m|0)>-1?m:0-m|0)|0)>(q|0)?1:(((t|0)>-1?t:0-t|0)|0)>(q|0))|(B|0)>(q|0)|(v|0)>(q|0)|(((s|0)>-1?s:0-s|0)|0)>(q|0)|(((z|0)>-1?z:0-z|0)|0)>(q|0))?0:((r|0)<127?r:127)<<24>>24;r=o+4|0;q=(r|0)>-128?r:-128;r=o+3|0;o=(r|0)>-128?r:-128;r=((q|0)<127?q:127)<<24>>27;q=u-r|0;u=(q|0)>-128?q:-128;a[h>>0]=((u|0)<127?u:127)&255^-128;u=(((o|0)<127?o:127)<<24>>27)+y|0;y=(u|0)>-128?u:-128;a[l>>0]=((y|0)<127?y:127)&255^-128;y=((r+1|0)>>>1&(n?0:255))<<24>>24;n=k-y|0;k=(n|0)>-128?n:-128;w=((k|0)<127?k:127)&255^-128;a[p>>0]=w;p=y+C|0;C=(p|0)>-128?p:-128;a[b>>0]=((C|0)<127?C:127)&255^-128;j=j+1|0;if((j|0)>=(i|0))break;else h=h+c|0}return}function Zb(a,b,c,e,f,g){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;h=S(b,-4)|0;i=S(b,-3)|0;j=S(b,-2)|0;k=0-b|0;l=b<<1;m=b*3|0;n=0-m|0;o=0-l|0;p=g<<3;g=0;q=a;while(1){a=q+k|0;r=q+b|0;s=q+l|0;t=d[q+i>>0]|0;u=(d[q+h>>0]|0)-t|0;v=d[e>>0]|0;w=d[q+j>>0]|0;x=t-w|0;t=d[a>>0]|0;y=w-t|0;z=(y|0)>-1?y:0-y|0;y=d[r>>0]|0;A=d[q>>0]|0;B=y-A|0;C=(B|0)>-1?B:0-B|0;B=d[s>>0]|0;D=B-y|0;E=(d[q+m>>0]|0)-B|0;B=t-A|0;A=w-y|0;y=d[f>>0]|0;_b((((((((A|0)>-1?A:0-A|0)|0)/2|0)+(((B|0)>-1?B:0-B|0)<<1)|0)>(d[c>>0]|0|0)|(((((u|0)>-1?u:0-u|0)|0)>(v|0)?1:(((x|0)>-1?x:0-x|0)|0)>(v|0))|(z|0)>(v|0)|(C|0)>(v|0)|(((D|0)>-1?D:0-D|0)|0)>(v|0)|(((E|0)>-1?E:0-E|0)|0)>(v|0)))^1)<<31>>31,((z|0)>(y|0)|(C|0)>(y|0))<<31>>31,q+n|0,q+o|0,a,q,r,s);g=g+1|0;if((g|0)>=(p|0))break;else q=q+1|0}return}function _b(b,c,d,e,f,g,h,i){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=a[d>>0]^-128;k=a[i>>0]^-128;l=(a[e>>0]^-128)<<24>>24;m=(a[h>>0]^-128)<<24>>24;n=l-m|0;o=(n|0)>-128?n:-128;n=(a[g>>0]^-128)<<24>>24;p=(a[f>>0]^-128)<<24>>24;q=(((o|0)<127?o:127)<<24>>24)+((n-p|0)*3|0)|0;o=(q|0)>-128?q:-128;q=c&255;c=(((o|0)<127?o:127)&255&b)<<24>>24;b=(c&q)<<24>>24;o=b+4|0;r=(o|0)>-128?o:-128;o=b+3|0;b=(o|0)>-128?o:-128;o=n-(((r|0)<127?r:127)<<24>>27)|0;r=(o|0)>-128?o:-128;o=(((b|0)<127?b:127)<<24>>27)+p|0;p=(o|0)>-128?o:-128;o=(c&(q^255))<<24>>24;q=(o*27|0)+63>>7;c=(q|0)>-128?q:-128;q=((c|0)<127?c:127)<<24>>24;c=(((r|0)<127?r:127)<<24>>24)-q|0;r=(c|0)>-128?c:-128;a[g>>0]=((r|0)<127?r:127)&255^-128;r=(((p|0)<127?p:127)<<24>>24)+q|0;q=(r|0)>-128?r:-128;a[f>>0]=((q|0)<127?q:127)&255^-128;q=(o*18|0)+63>>7;f=(q|0)>-128?q:-128;q=((f|0)<127?f:127)<<24>>24;f=m-q|0;m=(f|0)>-128?f:-128;a[h>>0]=((m|0)<127?m:127)&255^-128;m=q+l|0;l=(m|0)>-128?m:-128;a[e>>0]=((l|0)<127?l:127)&255^-128;l=(o*9|0)+63>>7;o=(l|0)>-128?l:-128;l=((o|0)<127?o:127)<<24>>24;o=(k<<24>>24)-l|0;k=(o|0)>-128?o:-128;a[i>>0]=((k|0)<127?k:127)&255^-128;k=l+(j<<24>>24)|0;j=(k|0)>-128?k:-128;a[d>>0]=((j|0)<127?j:127)&255^-128;return}function $b(a,b,c,e,f,g){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;h=g<<3;g=0;i=a;while(1){a=i+-3|0;j=i+-2|0;k=i+-1|0;l=i+1|0;m=i+2|0;n=d[a>>0]|0;o=(d[i+-4>>0]|0)-n|0;p=d[e>>0]|0;q=d[j>>0]|0;r=n-q|0;n=d[k>>0]|0;s=q-n|0;t=(s|0)>-1?s:0-s|0;s=d[l>>0]|0;u=d[i>>0]|0;v=s-u|0;w=(v|0)>-1?v:0-v|0;v=d[m>>0]|0;x=v-s|0;y=(d[i+3>>0]|0)-v|0;v=n-u|0;u=q-s|0;s=d[f>>0]|0;_b((((((((u|0)>-1?u:0-u|0)|0)/2|0)+(((v|0)>-1?v:0-v|0)<<1)|0)>(d[c>>0]|0|0)|(((((o|0)>-1?o:0-o|0)|0)>(p|0)?1:(((r|0)>-1?r:0-r|0)|0)>(p|0))|(t|0)>(p|0)|(w|0)>(p|0)|(((x|0)>-1?x:0-x|0)|0)>(p|0)|(((y|0)>-1?y:0-y|0)|0)>(p|0)))^1)<<31>>31,((t|0)>(s|0)|(w|0)>(s|0))<<31>>31,a,j,k,i,l,m);g=g+1|0;if((g|0)>=(h|0))break;else i=i+b|0}return}function ac(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=S(c,-2)|0;g=0-c|0;h=0-(c<<1)|0;i=0;j=b;while(1){b=j+g|0;k=a[b>>0]|0;l=a[j>>0]|0;m=a[j+c>>0]|0;n=(k&255)-(l&255)|0;o=(d[j+f>>0]|0)-(m&255)|0;p=((a[j+h>>0]^-128)<<24>>24)-((m^-128)<<24>>24)|0;m=(p|0)>-128?p:-128;p=(l^-128)<<24>>24;l=(k^-128)<<24>>24;k=(((m|0)<127?m:127)<<24>>24)+((p-l|0)*3|0)|0;m=(k|0)>-128?k:-128;k=(((((o|0)>-1?o:0-o|0)|0)/2|0)+(((n|0)>-1?n:0-n|0)<<1)|0)<=(d[e>>0]|0|0)?((m|0)<127?m:127)<<24>>24:0;m=k+4|0;n=(m|0)>-128?m:-128;m=p-(((n|0)<127?n:127)<<24>>27)|0;n=(m|0)>-128?m:-128;a[j>>0]=((n|0)<127?n:127)&255^-128;n=k+3|0;k=(n|0)>-128?n:-128;n=(((k|0)<127?k:127)<<24>>27)+l|0;l=(n|0)>-128?n:-128;a[b>>0]=((l|0)<127?l:127)&255^-128;i=i+1|0;if((i|0)==16)break;else j=j+1|0}return}function bc(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((c|0)!=1){f=0;g=b;while(1){h=a[g+-2>>0]|0;i=g+-1|0;j=a[i>>0]|0;k=a[g>>0]|0;l=a[g+1>>0]|0;m=(j&255)-(k&255)|0;n=(h&255)-(l&255)|0;o=((h^-128)<<24>>24)-((l^-128)<<24>>24)|0;l=(o|0)>-128?o:-128;o=(k^-128)<<24>>24;k=(j^-128)<<24>>24;j=(((l|0)<127?l:127)<<24>>24)+((o-k|0)*3|0)|0;l=(j|0)>-128?j:-128;j=(((((n|0)>-1?n:0-n|0)|0)/2|0)+(((m|0)>-1?m:0-m|0)<<1)|0)<=(d[e>>0]|0|0)?((l|0)<127?l:127)<<24>>24:0;l=j+4|0;m=(l|0)>-128?l:-128;l=o-(((m|0)<127?m:127)<<24>>27)|0;m=(l|0)>-128?l:-128;a[g>>0]=((m|0)<127?m:127)&255^-128;m=j+3|0;j=(m|0)>-128?m:-128;m=(((j|0)<127?j:127)<<24>>27)+k|0;k=(m|0)>-128?m:-128;a[i>>0]=((k|0)<127?k:127)&255^-128;f=f+1|0;if((f|0)==16)break;else g=g+c|0}return}g=0;f=b;k=a[b+-1>>0]|0;while(1){b=a[f+-2>>0]|0;i=a[f>>0]|0;m=a[f+1>>0]|0;j=(k&255)-(i&255)|0;l=(b&255)-(m&255)|0;o=((b^-128)<<24>>24)-((m^-128)<<24>>24)|0;m=(o|0)>-128?o:-128;o=(i^-128)<<24>>24;i=(k^-128)<<24>>24;b=(((m|0)<127?m:127)<<24>>24)+((o-i|0)*3|0)|0;m=(b|0)>-128?b:-128;b=(((((l|0)>-1?l:0-l|0)|0)/2|0)+(((j|0)>-1?j:0-j|0)<<1)|0)<=(d[e>>0]|0|0)?((m|0)<127?m:127)<<24>>24:0;m=b+4|0;j=(m|0)>-128?m:-128;m=o-(((j|0)<127?j:127)<<24>>27)|0;j=(m|0)>-128?m:-128;k=((j|0)<127?j:127)&255^-128;a[f>>0]=k;j=b+3|0;b=(j|0)>-128?j:-128;j=(((b|0)<127?b:127)<<24>>27)+i|0;i=(j|0)>-128?j:-128;a[f+-1>>0]=((i|0)<127?i:127)&255^-128;g=g+1|0;if((g|0)==16)break;else f=f+c|0}return}function cc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=g+8|0;i=g+12|0;Zb(a,e,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,2);if(b|0)Zb(b,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);if(!d)return;Zb(d,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);return}function dc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=g+8|0;i=g+12|0;$b(a,e,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,2);if(b|0)$b(b,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);if(!d)return;$b(d,f,c[g>>2]|0,c[h>>2]|0,c[i>>2]|0,1);return}function ec(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=g+4|0;i=g+8|0;j=g+12|0;Xb(a+(e<<2)|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);Xb(a+(e<<3)|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);Xb(a+(e*12|0)|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);if(b|0)Xb(b+(f<<2)|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);if(!d)return;Xb(d+(f<<2)|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);return}function fc(a,b,c){a=a|0;b=b|0;c=c|0;ac(a+(b<<2)|0,b,c);ac(a+(b<<3)|0,b,c);ac(a+(b*12|0)|0,b,c);return}function gc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=g+4|0;i=g+8|0;j=g+12|0;Yb(a+4|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);Yb(a+8|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);Yb(a+12|0,e,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,2);if(b|0)Yb(b+4|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);if(!d)return;Yb(d+4|0,f,c[h>>2]|0,c[i>>2]|0,c[j>>2]|0,1);return}function hc(a,b,c){a=a|0;b=b|0;c=c|0;bc(a+4|0,b,c);bc(a+8|0,b,c);bc(a+12|0,b,c);return}function ic(a){a=a|0;var b=0,d=0;c[a+2152>>2]=a;c[a+2180>>2]=a+4;c[a+2208>>2]=a+8;c[a+2236>>2]=a+12;c[a+2264>>2]=a+64;c[a+2292>>2]=a+68;c[a+2320>>2]=a+72;c[a+2348>>2]=a+76;c[a+2376>>2]=a+128;c[a+2404>>2]=a+132;c[a+2432>>2]=a+136;c[a+2460>>2]=a+140;c[a+2488>>2]=a+192;c[a+2516>>2]=a+196;c[a+2544>>2]=a+200;c[a+2572>>2]=a+204;c[a+2600>>2]=a+256;c[a+2628>>2]=a+260;c[a+2656>>2]=a+288;c[a+2684>>2]=a+292;c[a+2712>>2]=a+320;c[a+2740>>2]=a+324;c[a+2768>>2]=a+352;c[a+2796>>2]=a+356;b=0;do{d=b<<4;c[a+2144+(b*28|0)>>2]=a+384+(d<<1);c[a+2144+(b*28|0)+4>>2]=a+1184+(d<<1);c[a+2144+(b*28|0)+20>>2]=a+1984+b;b=b+1|0}while((b|0)!=25);return}function jc(a){a=a|0;var b=0,d=0;c[a+2160>>2]=0;c[a+2188>>2]=4;c[a+2216>>2]=8;c[a+2244>>2]=12;b=c[a+2984>>2]|0;d=b<<2;c[a+2272>>2]=d;c[a+2300>>2]=d+4;c[a+2328>>2]=d+8;c[a+2356>>2]=d+12;d=b<<3;c[a+2384>>2]=d;c[a+2412>>2]=d|4;c[a+2440>>2]=d+8;c[a+2468>>2]=d+12;d=b*12|0;c[a+2496>>2]=d;c[a+2524>>2]=d+4;c[a+2552>>2]=d+8;c[a+2580>>2]=d+12;c[a+2608>>2]=0;c[a+2720>>2]=0;c[a+2636>>2]=4;c[a+2748>>2]=4;d=c[a+3004>>2]<<2;c[a+2664>>2]=d;c[a+2776>>2]=d;b=d+4|0;c[a+2692>>2]=b;c[a+2804>>2]=b;return}function kc(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;return c[504+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0}function lc(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;return c[504+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]<<1|0}function mc(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;a=c[504+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0;return ((a|0)<132?a:132)|0}function nc(a){a=a|0;return c[1016+(((a|0)>127?127:(a|0)>0?a:0)<<2)>>2]|0}function oc(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;a=(c[1016+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0)*101581>>16;return ((a|0)>8?a:8)|0}function pc(a,b){a=a|0;b=b|0;var d=0;d=b+a|0;return c[1016+(((d|0)>127?127:(d|0)>0?d:0)<<2)>>2]|0}function qc(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=c[b+2900>>2]|0;k=c[b+2864>>2]|0;l=c[b+3088>>2]|0;m=c[l+4>>2]|0;n=m&65535;o=m>>>16&65535;do if(!(a[l+10>>0]|0)){p=n;q=o}else{r=m>>16;s=c[b+3184>>2]|0;if((r|0)>=(s+-152|0)){t=c[b+3188>>2]|0;if((r|0)>(t+144|0)){u=t+128|0;v=6}else w=o}else{u=s+-128|0;v=6}if((v|0)==6)w=u&65535;s=m<<16>>16;t=c[b+3192>>2]|0;if((s|0)<(t+-152|0))x=t+-128|0;else{t=c[b+3196>>2]|0;if((s|0)<=(t+144|0)){p=n;q=w;break}x=t+128|0}p=x&65535;q=w}while(0);w=p<<16>>16;x=q<<16>>16;n=j+(S(w>>3,k)|0)+(x>>3)|0;if(!(((q&65535)<<16|p&65535)&458759)){p=e;q=n;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=n+k|0;u=e+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));u=v+k|0;v=m+h|0;p=v;q=u;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));m=u+k|0;u=v+h|0;p=u;q=m;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));v=m+k|0;m=u+h|0;p=m;q=v;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0));p=m+h|0;q=v+k|0;j=p+16|0;do{a[p>>0]=a[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(j|0))}else xa[c[b+3212>>2]&15](n,k,x&7,w&7,e,h);h=c[b+2844>>2]|0;e=h&(((((w>>31|1)+w&65535)<<16>>16)/2|0)&65535);w=(((x>>31|1)+x<<16>>16|0)/2|0)&65535&h;h=k>>1;k=w<<16;x=(S(e<<16>>19,h)|0)+(k>>19)|0;n=(c[b+2904>>2]|0)+x|0;q=(c[b+2908>>2]|0)+x|0;if(!((k|e)&458759)){k=n;x=k;p=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=k+4|0;k=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=f;j=x;a[j>>0]=p;a[j+1>>0]=p>>8;a[j+2>>0]=p>>16;a[j+3>>0]=p>>24;p=x+4|0;a[p>>0]=k;a[p+1>>0]=k>>8;a[p+2>>0]=k>>16;a[p+3>>0]=k>>24;k=n+h|0;p=f+i|0;x=k;j=x;v=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=x+4|0;x=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=p;m=j;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=j+4|0;a[v>>0]=x;a[v+1>>0]=x>>8;a[v+2>>0]=x>>16;a[v+3>>0]=x>>24;x=k+h|0;k=p+i|0;p=x;v=p;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p+4|0;p=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k;m=v;a[m>>0]=j;a[m+1>>0]=j>>8;a[m+2>>0]=j>>16;a[m+3>>0]=j>>24;j=v+4|0;a[j>>0]=p;a[j+1>>0]=p>>8;a[j+2>>0]=p>>16;a[j+3>>0]=p>>24;p=x+h|0;x=k+i|0;k=p;j=k;v=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=k+4|0;k=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=x;m=j;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=j+4|0;a[v>>0]=k;a[v+1>>0]=k>>8;a[v+2>>0]=k>>16;a[v+3>>0]=k>>24;k=p+h|0;p=x+i|0;x=k;v=x;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x+4|0;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p;m=v;a[m>>0]=j;a[m+1>>0]=j>>8;a[m+2>>0]=j>>16;a[m+3>>0]=j>>24;j=v+4|0;a[j>>0]=x;a[j+1>>0]=x>>8;a[j+2>>0]=x>>16;a[j+3>>0]=x>>24;x=k+h|0;k=p+i|0;p=x;j=p;v=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=p+4|0;p=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=k;m=j;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=j+4|0;a[v>>0]=p;a[v+1>>0]=p>>8;a[v+2>>0]=p>>16;a[v+3>>0]=p>>24;p=x+h|0;x=k+i|0;k=p;v=k;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k+4|0;k=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x;m=v;a[m>>0]=j;a[m+1>>0]=j>>8;a[m+2>>0]=j>>16;a[m+3>>0]=j>>24;j=v+4|0;a[j>>0]=k;a[j+1>>0]=k>>8;a[j+2>>0]=k>>16;a[j+3>>0]=k>>24;k=p+h|0;p=k;j=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=k+4|0;k=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=x+i|0;x=p;a[x>>0]=j;a[x+1>>0]=j>>8;a[x+2>>0]=j>>16;a[x+3>>0]=j>>24;j=p+4|0;a[j>>0]=k;a[j+1>>0]=k>>8;a[j+2>>0]=k>>16;a[j+3>>0]=k>>24;k=q;j=k;p=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=k+4|0;k=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;j=g;x=j;a[x>>0]=p;a[x+1>>0]=p>>8;a[x+2>>0]=p>>16;a[x+3>>0]=p>>24;p=j+4|0;a[p>>0]=k;a[p+1>>0]=k>>8;a[p+2>>0]=k>>16;a[p+3>>0]=k>>24;k=q+h|0;p=g+i|0;j=k;x=j;v=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=j+4|0;j=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=p;m=x;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=x+4|0;a[v>>0]=j;a[v+1>>0]=j>>8;a[v+2>>0]=j>>16;a[v+3>>0]=j>>24;j=k+h|0;k=p+i|0;p=j;v=p;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p+4|0;p=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k;m=v;a[m>>0]=x;a[m+1>>0]=x>>8;a[m+2>>0]=x>>16;a[m+3>>0]=x>>24;x=v+4|0;a[x>>0]=p;a[x+1>>0]=p>>8;a[x+2>>0]=p>>16;a[x+3>>0]=p>>24;p=j+h|0;j=k+i|0;k=p;x=k;v=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=k+4|0;k=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=j;m=x;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=x+4|0;a[v>>0]=k;a[v+1>>0]=k>>8;a[v+2>>0]=k>>16;a[v+3>>0]=k>>24;k=p+h|0;p=j+i|0;j=k;v=j;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=j+4|0;j=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=p;m=v;a[m>>0]=x;a[m+1>>0]=x>>8;a[m+2>>0]=x>>16;a[m+3>>0]=x>>24;x=v+4|0;a[x>>0]=j;a[x+1>>0]=j>>8;a[x+2>>0]=j>>16;a[x+3>>0]=j>>24;j=k+h|0;k=p+i|0;p=j;x=p;v=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=p+4|0;p=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=k;m=x;a[m>>0]=v;a[m+1>>0]=v>>8;a[m+2>>0]=v>>16;a[m+3>>0]=v>>24;v=x+4|0;a[v>>0]=p;a[v+1>>0]=p>>8;a[v+2>>0]=p>>16;a[v+3>>0]=p>>24;p=j+h|0;j=k+i|0;k=p;v=k;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=k+4|0;k=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=j;m=v;a[m>>0]=x;a[m+1>>0]=x>>8;a[m+2>>0]=x>>16;a[m+3>>0]=x>>24;x=v+4|0;a[x>>0]=k;a[x+1>>0]=k>>8;a[x+2>>0]=k>>16;a[x+3>>0]=k>>24;k=p+h|0;p=k;x=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=k+4|0;k=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=j+i|0;j=p;a[j>>0]=x;a[j+1>>0]=x>>8;a[j+2>>0]=x>>16;a[j+3>>0]=x>>24;x=p+4|0;a[x>>0]=k;a[x+1>>0]=k>>8;a[x+2>>0]=k>>16;a[x+3>>0]=k>>24;return}else{k=b+3208|0;b=w&7;w=e&7;xa[c[k>>2]&15](n,h,b,w,f,i);xa[c[k>>2]&15](q,h,b,w,g,i);return}}function rc(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;f=e+3088|0;if((a[c[f>>2]>>0]|0)!=9){qc(e,c[e+3020>>2]|0,c[e+3024>>2]|0,c[e+3028>>2]|0,c[e+2984>>2]|0,c[e+3004>>2]|0);return}g=e+2844|0;h=e+3184|0;i=e+3188|0;j=e+3192|0;k=e+3196|0;l=0;do{m=l<<3;n=l<<1;o=n+16|0;p=n+20|0;n=0;do{q=(n<<1)+m|0;r=c[f>>2]|0;s=q|1;t=q+4|0;u=q+5|0;v=(b[r+12+(s<<2)>>1]|0)+(b[r+12+(q<<2)>>1]|0)+(b[r+12+(t<<2)>>1]|0)+(b[r+12+(u<<2)>>1]|0)|0;r=(((v>>31<<3|4)+v|0)/8|0)&c[g>>2];v=e+2144+((o+n|0)*28|0)+24|0;b[v>>1]=r;w=c[f>>2]|0;x=(b[w+12+(s<<2)+2>>1]|0)+(b[w+12+(q<<2)+2>>1]|0)+(b[w+12+(t<<2)+2>>1]|0)+(b[w+12+(u<<2)+2>>1]|0)|0;u=(((x>>31<<3|4)+x|0)/8|0)&c[g>>2];x=v+2|0;b[x>>1]=u;if(a[w+10>>0]|0){w=u<<16;u=c[h>>2]|0;t=(w>>15|0)<(u+-152|0)?u+-128>>1:w>>16;w=c[i>>2]|0;b[x>>1]=(t<<16>>15|0)>(w+144|0)?(w+128|0)>>>1:t;t=r<<16;r=c[j>>2]|0;w=(t>>15|0)<(r+-152|0)?r+-128>>1:t>>16;t=c[k>>2]|0;b[v>>1]=(w<<16>>15|0)>(t+144|0)?(t+128|0)>>>1:w}c[e+2144+((p+n|0)*28|0)+24>>2]=c[v>>2];n=n+1|0}while((n|0)!=2);l=l+1|0}while((l|0)!=2);l=c[e+3020>>2]|0;g=c[e+2900>>2]|0;n=c[f>>2]|0;p=e+2984|0;a:do if((d[n+8>>0]|0)<3){o=c[p>>2]|0;m=e+2168|0;v=c[n+12>>2]|0;c[m>>2]=v;w=e+2224|0;t=c[n+20>>2]|0;c[w>>2]=t;r=e+2392|0;x=c[n+44>>2]|0;c[r>>2]=x;u=e+2448|0;q=c[n+52>>2]|0;c[u>>2]=q;s=v>>>16&65535;y=v&65535;do if(!(a[n+10>>0]|0)){z=y;A=s}else{B=m+2|0;C=v>>16;D=c[h>>2]|0;E=D+-152|0;if((C|0)>=(E|0)){F=c[i>>2]|0;if((C|0)>(F+144|0)){G=F+128|0;H=16}else I=s}else{G=D+-128|0;H=16}if((H|0)==16){F=G&65535;b[B>>1]=F;I=F}F=v<<16>>16;B=c[j>>2]|0;C=B+-152|0;if((F|0)>=(C|0)){J=c[k>>2]|0;if((F|0)>(J+144|0)){K=J+128|0;H=21}else L=y}else{K=B+-128|0;H=21}if((H|0)==21){J=K&65535;b[m>>1]=J;L=J}J=w+2|0;F=t>>16;if((F|0)>=(E|0)){M=c[i>>2]|0;if((F|0)>(M+144|0)){N=M+128|0;H=26}}else{N=D+-128|0;H=26}if((H|0)==26)b[J>>1]=N;J=t<<16>>16;if((J|0)>=(C|0)){M=c[k>>2]|0;if((J|0)>(M+144|0)){O=M+128|0;H=31}}else{O=B+-128|0;H=31}if((H|0)==31)b[w>>1]=O;M=r+2|0;J=x>>16;if((J|0)>=(E|0)){F=c[i>>2]|0;if((J|0)>(F+144|0)){P=F+128|0;H=36}}else{P=D+-128|0;H=36}if((H|0)==36)b[M>>1]=P;M=x<<16>>16;if((M|0)>=(C|0)){F=c[k>>2]|0;if((M|0)>(F+144|0)){Q=F+128|0;H=41}}else{Q=B+-128|0;H=41}if((H|0)==41)b[r>>1]=Q;F=u+2|0;M=q>>16;if((M|0)>=(E|0)){E=c[i>>2]|0;if((M|0)>(E+144|0)){R=E+128|0;H=46}}else{R=D+-128|0;H=46}if((H|0)==46)b[F>>1]=R;F=q<<16>>16;if((F|0)<(C|0))T=B+-128|0;else{B=c[k>>2]|0;if((F|0)<=(B+144|0)){z=L;A=I;break}T=B+128|0}b[u>>1]=T;z=L;A=I}while(0);q=c[e+2160>>2]|0;x=l+q|0;t=z<<16>>16;m=A<<16>>16;y=g+q+(S(t>>3,o)|0)+(m>>3)|0;if(!((z|A)&7)){q=y;v=q;s=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=q+4|0;q=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x;B=v;a[B>>0]=s;a[B+1>>0]=s>>8;a[B+2>>0]=s>>16;a[B+3>>0]=s>>24;s=v+4|0;a[s>>0]=q;a[s+1>>0]=q>>8;a[s+2>>0]=q>>16;a[s+3>>0]=q>>24;q=y+o|0;s=x+o|0;v=q;B=v;F=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=v+4|0;v=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=s;C=B;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=B+4|0;a[F>>0]=v;a[F+1>>0]=v>>8;a[F+2>>0]=v>>16;a[F+3>>0]=v>>24;v=q+o|0;q=s+o|0;s=v;F=s;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=s+4|0;s=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q;C=F;a[C>>0]=B;a[C+1>>0]=B>>8;a[C+2>>0]=B>>16;a[C+3>>0]=B>>24;B=F+4|0;a[B>>0]=s;a[B+1>>0]=s>>8;a[B+2>>0]=s>>16;a[B+3>>0]=s>>24;s=v+o|0;v=q+o|0;q=s;B=q;F=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=q+4|0;q=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=v;C=B;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=B+4|0;a[F>>0]=q;a[F+1>>0]=q>>8;a[F+2>>0]=q>>16;a[F+3>>0]=q>>24;q=s+o|0;s=v+o|0;v=q;F=v;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v+4|0;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=s;C=F;a[C>>0]=B;a[C+1>>0]=B>>8;a[C+2>>0]=B>>16;a[C+3>>0]=B>>24;B=F+4|0;a[B>>0]=v;a[B+1>>0]=v>>8;a[B+2>>0]=v>>16;a[B+3>>0]=v>>24;v=q+o|0;q=s+o|0;s=v;B=s;F=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=s+4|0;s=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=q;C=B;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=B+4|0;a[F>>0]=s;a[F+1>>0]=s>>8;a[F+2>>0]=s>>16;a[F+3>>0]=s>>24;s=v+o|0;v=q+o|0;q=s;F=q;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q+4|0;q=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v;C=F;a[C>>0]=B;a[C+1>>0]=B>>8;a[C+2>>0]=B>>16;a[C+3>>0]=B>>24;B=F+4|0;a[B>>0]=q;a[B+1>>0]=q>>8;a[B+2>>0]=q>>16;a[B+3>>0]=q>>24;q=s+o|0;s=q;B=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;s=q+4|0;q=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;s=v+o|0;v=s;a[v>>0]=B;a[v+1>>0]=B>>8;a[v+2>>0]=B>>16;a[v+3>>0]=B>>24;B=s+4|0;a[B>>0]=q;a[B+1>>0]=q>>8;a[B+2>>0]=q>>16;a[B+3>>0]=q>>24}else xa[c[e+3208>>2]&15](y,o,m&7,t&7,x,o);x=c[e+2216>>2]|0;t=l+x|0;m=b[w>>1]|0;y=m<<16>>16;q=g+x+(S(y>>3,o)|0)|0;x=b[w+2>>1]|0;B=x<<16>>16;s=q+(B>>3)|0;if(!((x|m)&7)){m=s;x=m;q=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=m+4|0;m=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=t;v=x;a[v>>0]=q;a[v+1>>0]=q>>8;a[v+2>>0]=q>>16;a[v+3>>0]=q>>24;q=x+4|0;a[q>>0]=m;a[q+1>>0]=m>>8;a[q+2>>0]=m>>16;a[q+3>>0]=m>>24;m=s+o|0;q=t+o|0;x=m;v=x;F=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x+4|0;x=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=q;C=v;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=v+4|0;a[F>>0]=x;a[F+1>>0]=x>>8;a[F+2>>0]=x>>16;a[F+3>>0]=x>>24;x=m+o|0;m=q+o|0;q=x;F=q;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q+4|0;q=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m;C=F;a[C>>0]=v;a[C+1>>0]=v>>8;a[C+2>>0]=v>>16;a[C+3>>0]=v>>24;v=F+4|0;a[v>>0]=q;a[v+1>>0]=q>>8;a[v+2>>0]=q>>16;a[v+3>>0]=q>>24;q=x+o|0;x=m+o|0;m=q;v=m;F=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=m+4|0;m=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=x;C=v;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=v+4|0;a[F>>0]=m;a[F+1>>0]=m>>8;a[F+2>>0]=m>>16;a[F+3>>0]=m>>24;m=q+o|0;q=x+o|0;x=m;F=x;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=x+4|0;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=q;C=F;a[C>>0]=v;a[C+1>>0]=v>>8;a[C+2>>0]=v>>16;a[C+3>>0]=v>>24;v=F+4|0;a[v>>0]=x;a[v+1>>0]=x>>8;a[v+2>>0]=x>>16;a[v+3>>0]=x>>24;x=m+o|0;m=q+o|0;q=x;v=q;F=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=q+4|0;q=d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24;v=m;C=v;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=v+4|0;a[F>>0]=q;a[F+1>>0]=q>>8;a[F+2>>0]=q>>16;a[F+3>>0]=q>>24;q=x+o|0;x=m+o|0;m=q;F=m;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m+4|0;m=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=x;C=F;a[C>>0]=v;a[C+1>>0]=v>>8;a[C+2>>0]=v>>16;a[C+3>>0]=v>>24;v=F+4|0;a[v>>0]=m;a[v+1>>0]=m>>8;a[v+2>>0]=m>>16;a[v+3>>0]=m>>24;m=q+o|0;q=m;v=d[q>>0]|d[q+1>>0]<<8|d[q+2>>0]<<16|d[q+3>>0]<<24;q=m+4|0;m=d[q>>0]|d[q+1>>0]<<8|d[q+2>>0]<<16|d[q+3>>0]<<24;q=x+o|0;x=q;a[x>>0]=v;a[x+1>>0]=v>>8;a[x+2>>0]=v>>16;a[x+3>>0]=v>>24;v=q+4|0;a[v>>0]=m;a[v+1>>0]=m>>8;a[v+2>>0]=m>>16;a[v+3>>0]=m>>24}else xa[c[e+3208>>2]&15](s,o,B&7,y&7,t,o);t=c[e+2384>>2]|0;y=l+t|0;B=b[r>>1]|0;s=B<<16>>16;m=g+t+(S(s>>3,o)|0)|0;t=b[r+2>>1]|0;v=t<<16>>16;q=m+(v>>3)|0;if(!((t|B)&7)){B=q;t=B;m=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=B+4|0;B=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=y;x=t;a[x>>0]=m;a[x+1>>0]=m>>8;a[x+2>>0]=m>>16;a[x+3>>0]=m>>24;m=t+4|0;a[m>>0]=B;a[m+1>>0]=B>>8;a[m+2>>0]=B>>16;a[m+3>>0]=B>>24;B=q+o|0;m=y+o|0;t=B;x=t;F=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=t+4|0;t=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=m;C=x;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=x+4|0;a[F>>0]=t;a[F+1>>0]=t>>8;a[F+2>>0]=t>>16;a[F+3>>0]=t>>24;t=B+o|0;B=m+o|0;m=t;F=m;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m+4|0;m=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B;C=F;a[C>>0]=x;a[C+1>>0]=x>>8;a[C+2>>0]=x>>16;a[C+3>>0]=x>>24;x=F+4|0;a[x>>0]=m;a[x+1>>0]=m>>8;a[x+2>>0]=m>>16;a[x+3>>0]=m>>24;m=t+o|0;t=B+o|0;B=m;x=B;F=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=B+4|0;B=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=t;C=x;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=x+4|0;a[F>>0]=B;a[F+1>>0]=B>>8;a[F+2>>0]=B>>16;a[F+3>>0]=B>>24;B=m+o|0;m=t+o|0;t=B;F=t;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=t+4|0;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=m;C=F;a[C>>0]=x;a[C+1>>0]=x>>8;a[C+2>>0]=x>>16;a[C+3>>0]=x>>24;x=F+4|0;a[x>>0]=t;a[x+1>>0]=t>>8;a[x+2>>0]=t>>16;a[x+3>>0]=t>>24;t=B+o|0;B=m+o|0;m=t;x=m;F=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=m+4|0;m=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;x=B;C=x;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=x+4|0;a[F>>0]=m;a[F+1>>0]=m>>8;a[F+2>>0]=m>>16;a[F+3>>0]=m>>24;m=t+o|0;t=B+o|0;B=m;F=B;x=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B+4|0;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=t;C=F;a[C>>0]=x;a[C+1>>0]=x>>8;a[C+2>>0]=x>>16;a[C+3>>0]=x>>24;x=F+4|0;a[x>>0]=B;a[x+1>>0]=B>>8;a[x+2>>0]=B>>16;a[x+3>>0]=B>>24;B=m+o|0;m=B;x=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;m=B+4|0;B=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;m=t+o|0;t=m;a[t>>0]=x;a[t+1>>0]=x>>8;a[t+2>>0]=x>>16;a[t+3>>0]=x>>24;x=m+4|0;a[x>>0]=B;a[x+1>>0]=B>>8;a[x+2>>0]=B>>16;a[x+3>>0]=B>>24}else xa[c[e+3208>>2]&15](q,o,v&7,s&7,y,o);y=c[e+2440>>2]|0;s=l+y|0;v=b[u>>1]|0;q=v<<16>>16;B=g+y+(S(q>>3,o)|0)|0;y=b[u+2>>1]|0;x=y<<16>>16;m=B+(x>>3)|0;if(!((y|v)&7)){v=m;y=v;B=d[y>>0]|d[y+1>>0]<<8|d[y+2>>0]<<16|d[y+3>>0]<<24;y=v+4|0;v=d[y>>0]|d[y+1>>0]<<8|d[y+2>>0]<<16|d[y+3>>0]<<24;y=s;t=y;a[t>>0]=B;a[t+1>>0]=B>>8;a[t+2>>0]=B>>16;a[t+3>>0]=B>>24;B=y+4|0;a[B>>0]=v;a[B+1>>0]=v>>8;a[B+2>>0]=v>>16;a[B+3>>0]=v>>24;v=m+o|0;B=s+o|0;y=v;t=y;F=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=y+4|0;y=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=B;C=t;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=t+4|0;a[F>>0]=y;a[F+1>>0]=y>>8;a[F+2>>0]=y>>16;a[F+3>>0]=y>>24;y=v+o|0;v=B+o|0;B=y;F=B;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B+4|0;B=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v;C=F;a[C>>0]=t;a[C+1>>0]=t>>8;a[C+2>>0]=t>>16;a[C+3>>0]=t>>24;t=F+4|0;a[t>>0]=B;a[t+1>>0]=B>>8;a[t+2>>0]=B>>16;a[t+3>>0]=B>>24;B=y+o|0;y=v+o|0;v=B;t=v;F=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=v+4|0;v=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=y;C=t;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=t+4|0;a[F>>0]=v;a[F+1>>0]=v>>8;a[F+2>>0]=v>>16;a[F+3>>0]=v>>24;v=B+o|0;B=y+o|0;y=v;F=y;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=y+4|0;y=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=B;C=F;a[C>>0]=t;a[C+1>>0]=t>>8;a[C+2>>0]=t>>16;a[C+3>>0]=t>>24;t=F+4|0;a[t>>0]=y;a[t+1>>0]=y>>8;a[t+2>>0]=y>>16;a[t+3>>0]=y>>24;y=v+o|0;v=B+o|0;B=y;t=B;F=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=B+4|0;B=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;t=v;C=t;a[C>>0]=F;a[C+1>>0]=F>>8;a[C+2>>0]=F>>16;a[C+3>>0]=F>>24;F=t+4|0;a[F>>0]=B;a[F+1>>0]=B>>8;a[F+2>>0]=B>>16;a[F+3>>0]=B>>24;B=y+o|0;y=v+o|0;v=B;F=v;t=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=v+4|0;v=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;F=y;C=F;a[C>>0]=t;a[C+1>>0]=t>>8;a[C+2>>0]=t>>16;a[C+3>>0]=t>>24;t=F+4|0;a[t>>0]=v;a[t+1>>0]=v>>8;a[t+2>>0]=v>>16;a[t+3>>0]=v>>24;v=B+o|0;B=v;t=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=v+4|0;v=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;B=y+o|0;y=B;a[y>>0]=t;a[y+1>>0]=t>>8;a[y+2>>0]=t>>16;a[y+3>>0]=t>>24;t=B+4|0;a[t>>0]=v;a[t+1>>0]=v>>8;a[t+2>>0]=v>>16;a[t+3>>0]=v>>24;break}else{xa[c[e+3208>>2]&15](m,o,x&7,q&7,s,o);break}}else{s=e+3204|0;q=e+3200|0;x=n;m=0;while(1){v=e+2144+(m*28|0)|0;t=m|1;B=e+2144+(t*28|0)|0;y=c[p>>2]|0;F=e+2144+(m*28|0)+24|0;C=c[x+12+(m<<2)>>2]|0;c[F>>2]=C;D=e+2144+(t*28|0)+24|0;E=c[(c[f>>2]|0)+12+(t<<2)>>2]|0;c[D>>2]=E;M=C>>>16&65535;do if(!(a[(c[f>>2]|0)+10>>0]|0))U=M;else{J=F+2|0;V=C>>16;W=c[h>>2]|0;if((V|0)>=(W+-152|0)){X=c[i>>2]|0;if((V|0)>(X+144|0)){Y=X+128|0;H=69}else Z=M}else{Y=W+-128|0;H=69}if((H|0)==69){H=0;W=Y&65535;b[J>>1]=W;Z=W}W=C<<16>>16;J=c[j>>2]|0;if((W|0)>=(J+-152|0)){X=c[k>>2]|0;if((W|0)>(X+144|0)){_=X+128|0;H=74}}else{_=J+-128|0;H=74}if((H|0)==74){H=0;b[F>>1]=_}J=D+2|0;X=E>>16;W=c[h>>2]|0;if((X|0)>=(W+-152|0)){V=c[i>>2]|0;if((X|0)>(V+144|0)){$=V+128|0;H=79}}else{$=W+-128|0;H=79}if((H|0)==79){H=0;b[J>>1]=$}J=E<<16>>16;W=c[j>>2]|0;if((J|0)<(W+-152|0))aa=W+-128|0;else{W=c[k>>2]|0;if((J|0)<=(W+144|0)){U=Z;break}aa=W+128|0}b[D>>1]=aa;U=Z}while(0);E=c[F>>2]|0;C=c[e+2144+(m*28|0)+16>>2]|0;M=l+C|0;do if((E|0)==(c[D>>2]|0)){W=U<<16>>16;J=g+C+(S(E<<16>>19,y)|0)+(W>>3)|0;if(!((E&65535|U)&7)){V=J;X=V;ba=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=V+4|0;V=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=M;ca=X;a[ca>>0]=ba;a[ca+1>>0]=ba>>8;a[ca+2>>0]=ba>>16;a[ca+3>>0]=ba>>24;ba=X+4|0;a[ba>>0]=V;a[ba+1>>0]=V>>8;a[ba+2>>0]=V>>16;a[ba+3>>0]=V>>24;V=J+y|0;ba=M+y|0;X=V;ca=X;da=d[ca>>0]|d[ca+1>>0]<<8|d[ca+2>>0]<<16|d[ca+3>>0]<<24;ca=X+4|0;X=d[ca>>0]|d[ca+1>>0]<<8|d[ca+2>>0]<<16|d[ca+3>>0]<<24;ca=ba;ea=ca;a[ea>>0]=da;a[ea+1>>0]=da>>8;a[ea+2>>0]=da>>16;a[ea+3>>0]=da>>24;da=ca+4|0;a[da>>0]=X;a[da+1>>0]=X>>8;a[da+2>>0]=X>>16;a[da+3>>0]=X>>24;X=V+y|0;V=ba+y|0;ba=X;da=ba;ca=d[da>>0]|d[da+1>>0]<<8|d[da+2>>0]<<16|d[da+3>>0]<<24;da=ba+4|0;ba=d[da>>0]|d[da+1>>0]<<8|d[da+2>>0]<<16|d[da+3>>0]<<24;da=V;ea=da;a[ea>>0]=ca;a[ea+1>>0]=ca>>8;a[ea+2>>0]=ca>>16;a[ea+3>>0]=ca>>24;ca=da+4|0;a[ca>>0]=ba;a[ca+1>>0]=ba>>8;a[ca+2>>0]=ba>>16;a[ca+3>>0]=ba>>24;ba=X+y|0;X=ba;ca=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=ba+4|0;ba=d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24;X=V+y|0;V=X;a[V>>0]=ca;a[V+1>>0]=ca>>8;a[V+2>>0]=ca>>16;a[V+3>>0]=ca>>24;ca=X+4|0;a[ca>>0]=ba;a[ca+1>>0]=ba>>8;a[ca+2>>0]=ba>>16;a[ca+3>>0]=ba>>24;break}else{xa[c[s>>2]&15](J,y,W&7,E&7,M,y);break}}else{sc(v,M,y,g,y,c[q>>2]|0);sc(B,l+(c[e+2144+(t*28|0)+16>>2]|0)|0,y,g,y,c[q>>2]|0)}while(0);y=m+2|0;if((y|0)>=16)break a;x=c[f>>2]|0;m=y}}while(0);f=c[e+3024>>2]|0;g=c[e+2904>>2]|0;l=e+3004|0;U=e+3204|0;Z=e+3200|0;aa=c[l>>2]|0;k=c[e+2616>>2]|0;j=c[e+2608>>2]|0;do if((k|0)==(c[e+2644>>2]|0)){$=f+j|0;H=g+j+(S(k<<16>>19,aa)|0)|0;i=b[e+2616+2>>1]|0;h=i<<16>>16;_=H+(h>>3)|0;if(!((i|k&65535)&7)){i=_;H=i;Y=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=i+4|0;i=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=$;p=H;a[p>>0]=Y;a[p+1>>0]=Y>>8;a[p+2>>0]=Y>>16;a[p+3>>0]=Y>>24;Y=H+4|0;a[Y>>0]=i;a[Y+1>>0]=i>>8;a[Y+2>>0]=i>>16;a[Y+3>>0]=i>>24;i=_+aa|0;Y=$+aa|0;H=i;p=H;n=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=H+4|0;H=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;p=Y;A=p;a[A>>0]=n;a[A+1>>0]=n>>8;a[A+2>>0]=n>>16;a[A+3>>0]=n>>24;n=p+4|0;a[n>>0]=H;a[n+1>>0]=H>>8;a[n+2>>0]=H>>16;a[n+3>>0]=H>>24;H=i+aa|0;i=Y+aa|0;Y=H;n=Y;p=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=Y+4|0;Y=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=i;A=n;a[A>>0]=p;a[A+1>>0]=p>>8;a[A+2>>0]=p>>16;a[A+3>>0]=p>>24;p=n+4|0;a[p>>0]=Y;a[p+1>>0]=Y>>8;a[p+2>>0]=Y>>16;a[p+3>>0]=Y>>24;Y=H+aa|0;H=Y;p=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=Y+4|0;Y=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=i+aa|0;i=H;a[i>>0]=p;a[i+1>>0]=p>>8;a[i+2>>0]=p>>16;a[i+3>>0]=p>>24;p=H+4|0;a[p>>0]=Y;a[p+1>>0]=Y>>8;a[p+2>>0]=Y>>16;a[p+3>>0]=Y>>24;break}else{xa[c[U>>2]&15](_,aa,h&7,k&7,$,aa);break}}else{sc(e+2592|0,f+j|0,aa,g,aa,c[Z>>2]|0);sc(e+2620|0,f+(c[e+2636>>2]|0)|0,aa,g,aa,c[Z>>2]|0)}while(0);aa=c[l>>2]|0;j=c[e+2672>>2]|0;k=c[e+2664>>2]|0;do if((j|0)==(c[e+2700>>2]|0)){$=f+k|0;h=g+k+(S(j<<16>>19,aa)|0)|0;_=b[e+2672+2>>1]|0;Y=_<<16>>16;p=h+(Y>>3)|0;if(!((_|j&65535)&7)){_=p;h=_;H=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=_+4|0;_=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=$;i=h;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;H=h+4|0;a[H>>0]=_;a[H+1>>0]=_>>8;a[H+2>>0]=_>>16;a[H+3>>0]=_>>24;_=p+aa|0;H=$+aa|0;h=_;i=h;n=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=h+4|0;h=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=H;A=i;a[A>>0]=n;a[A+1>>0]=n>>8;a[A+2>>0]=n>>16;a[A+3>>0]=n>>24;n=i+4|0;a[n>>0]=h;a[n+1>>0]=h>>8;a[n+2>>0]=h>>16;a[n+3>>0]=h>>24;h=_+aa|0;_=H+aa|0;H=h;n=H;i=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=H+4|0;H=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=_;A=n;a[A>>0]=i;a[A+1>>0]=i>>8;a[A+2>>0]=i>>16;a[A+3>>0]=i>>24;i=n+4|0;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;H=h+aa|0;h=H;i=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=H+4|0;H=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=_+aa|0;_=h;a[_>>0]=i;a[_+1>>0]=i>>8;a[_+2>>0]=i>>16;a[_+3>>0]=i>>24;i=h+4|0;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;break}else{xa[c[U>>2]&15](p,aa,Y&7,j&7,$,aa);break}}else{sc(e+2648|0,f+k|0,aa,g,aa,c[Z>>2]|0);sc(e+2676|0,f+(c[e+2692>>2]|0)|0,aa,g,aa,c[Z>>2]|0)}while(0);aa=c[e+3028>>2]|0;g=c[e+2908>>2]|0;f=c[l>>2]|0;k=c[e+2728>>2]|0;j=c[e+2720>>2]|0;do if((k|0)==(c[e+2756>>2]|0)){$=aa+j|0;Y=g+j+(S(k<<16>>19,f)|0)|0;p=b[e+2728+2>>1]|0;H=p<<16>>16;i=Y+(H>>3)|0;if(!((p|k&65535)&7)){p=i;Y=p;h=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=p+4|0;p=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=$;_=Y;a[_>>0]=h;a[_+1>>0]=h>>8;a[_+2>>0]=h>>16;a[_+3>>0]=h>>24;h=Y+4|0;a[h>>0]=p;a[h+1>>0]=p>>8;a[h+2>>0]=p>>16;a[h+3>>0]=p>>24;p=i+f|0;h=$+f|0;Y=p;_=Y;n=d[_>>0]|d[_+1>>0]<<8|d[_+2>>0]<<16|d[_+3>>0]<<24;_=Y+4|0;Y=d[_>>0]|d[_+1>>0]<<8|d[_+2>>0]<<16|d[_+3>>0]<<24;_=h;A=_;a[A>>0]=n;a[A+1>>0]=n>>8;a[A+2>>0]=n>>16;a[A+3>>0]=n>>24;n=_+4|0;a[n>>0]=Y;a[n+1>>0]=Y>>8;a[n+2>>0]=Y>>16;a[n+3>>0]=Y>>24;Y=p+f|0;p=h+f|0;h=Y;n=h;_=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=h+4|0;h=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;n=p;A=n;a[A>>0]=_;a[A+1>>0]=_>>8;a[A+2>>0]=_>>16;a[A+3>>0]=_>>24;_=n+4|0;a[_>>0]=h;a[_+1>>0]=h>>8;a[_+2>>0]=h>>16;a[_+3>>0]=h>>24;h=Y+f|0;Y=h;_=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=h+4|0;h=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;Y=p+f|0;p=Y;a[p>>0]=_;a[p+1>>0]=_>>8;a[p+2>>0]=_>>16;a[p+3>>0]=_>>24;_=Y+4|0;a[_>>0]=h;a[_+1>>0]=h>>8;a[_+2>>0]=h>>16;a[_+3>>0]=h>>24;break}else{xa[c[U>>2]&15](i,f,H&7,k&7,$,f);break}}else{sc(e+2704|0,aa+j|0,f,g,f,c[Z>>2]|0);sc(e+2732|0,aa+(c[e+2748>>2]|0)|0,f,g,f,c[Z>>2]|0)}while(0);f=c[l>>2]|0;l=c[e+2784>>2]|0;j=c[e+2776>>2]|0;if((l|0)!=(c[e+2812>>2]|0)){sc(e+2760|0,aa+j|0,f,g,f,c[Z>>2]|0);sc(e+2788|0,aa+(c[e+2804>>2]|0)|0,f,g,f,c[Z>>2]|0);return}Z=aa+j|0;aa=g+j+(S(l<<16>>19,f)|0)|0;j=b[e+2784+2>>1]|0;e=j<<16>>16;g=aa+(e>>3)|0;if(!((j|l&65535)&7)){j=g;aa=j;k=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=j+4|0;j=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=Z;$=aa;a[$>>0]=k;a[$+1>>0]=k>>8;a[$+2>>0]=k>>16;a[$+3>>0]=k>>24;k=aa+4|0;a[k>>0]=j;a[k+1>>0]=j>>8;a[k+2>>0]=j>>16;a[k+3>>0]=j>>24;j=g+f|0;k=Z+f|0;aa=j;$=aa;H=d[$>>0]|d[$+1>>0]<<8|d[$+2>>0]<<16|d[$+3>>0]<<24;$=aa+4|0;aa=d[$>>0]|d[$+1>>0]<<8|d[$+2>>0]<<16|d[$+3>>0]<<24;$=k;i=$;a[i>>0]=H;a[i+1>>0]=H>>8;a[i+2>>0]=H>>16;a[i+3>>0]=H>>24;H=$+4|0;a[H>>0]=aa;a[H+1>>0]=aa>>8;a[H+2>>0]=aa>>16;a[H+3>>0]=aa>>24;aa=j+f|0;j=k+f|0;k=aa;H=k;$=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=k+4|0;k=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;H=j;i=H;a[i>>0]=$;a[i+1>>0]=$>>8;a[i+2>>0]=$>>16;a[i+3>>0]=$>>24;$=H+4|0;a[$>>0]=k;a[$+1>>0]=k>>8;a[$+2>>0]=k>>16;a[$+3>>0]=k>>24;k=aa+f|0;aa=k;$=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=k+4|0;k=d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24;aa=j+f|0;j=aa;a[j>>0]=$;a[j+1>>0]=$>>8;a[j+2>>0]=$>>16;a[j+3>>0]=$>>24;$=aa+4|0;a[$>>0]=k;a[$+1>>0]=k>>8;a[$+2>>0]=k>>16;a[$+3>>0]=k>>24;return}else{xa[c[U>>2]&15](g,f,e&7,l&7,Z,f);return}}function sc(d,e,f,g,h,i){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0;j=d+24|0;k=b[j>>1]|0;l=k<<16>>16;m=g+(c[d+16>>2]|0)+(S(l>>3,h)|0)|0;d=b[j+2>>1]|0;j=d<<16>>16;g=m+(j>>3)|0;if(!((d|k)&7)){a[e>>0]=a[g>>0]|0;a[e+1>>0]=a[g+1>>0]|0;a[e+2>>0]=a[g+2>>0]|0;a[e+3>>0]=a[g+3>>0]|0;k=e+f|0;d=g+h|0;a[k>>0]=a[d>>0]|0;a[k+1>>0]=a[d+1>>0]|0;a[k+2>>0]=a[d+2>>0]|0;a[k+3>>0]=a[d+3>>0]|0;m=k+f|0;k=d+h|0;a[m>>0]=a[k>>0]|0;a[m+1>>0]=a[k+1>>0]|0;a[m+2>>0]=a[k+2>>0]|0;a[m+3>>0]=a[k+3>>0]|0;d=m+f|0;m=k+h|0;a[d>>0]=a[m>>0]|0;a[d+1>>0]=a[m+1>>0]|0;a[d+2>>0]=a[m+2>>0]|0;a[d+3>>0]=a[m+3>>0]|0;return}else{xa[i&15](g,h,j&7,l&7,e,f);return}}function tc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0;i=l;l=l+16|0;j=i;k=a[c[b+3088>>2]>>0]|0;a[j>>0]=a[e>>0]|0;a[j+1>>0]=a[e+f>>0]|0;a[j+2>>0]=a[e+(f<<1)>>0]|0;a[j+3>>0]=a[e+(f*3|0)>>0]|0;a[j+4>>0]=a[e+(f<<2)>>0]|0;a[j+5>>0]=a[e+(f*5|0)>>0]|0;a[j+6>>0]=a[e+(f*6|0)>>0]|0;a[j+7>>0]=a[e+(f*7|0)>>0]|0;a[j+8>>0]=a[e+(f<<3)>>0]|0;a[j+9>>0]=a[e+(f*9|0)>>0]|0;a[j+10>>0]=a[e+(f*10|0)>>0]|0;a[j+11>>0]=a[e+(f*11|0)>>0]|0;a[j+12>>0]=a[e+(f*12|0)>>0]|0;a[j+13>>0]=a[e+(f*13|0)>>0]|0;a[j+14>>0]=a[e+(f*14|0)>>0]|0;a[j+15>>0]=a[e+(f*15|0)>>0]|0;if(!(k<<24>>24)){m=8588+(c[b+3104>>2]<<4)+(c[b+3100>>2]<<3)|0;n=c[m>>2]|0;Aa[n&31](g,h,d,j);l=i;return}else{m=8620+((k&255)<<3)|0;n=c[m>>2]|0;Aa[n&31](g,h,d,j);l=i;return}}function uc(b,d,e,f,g,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0;m=l;l=l+16|0;n=m+8|0;o=m;p=a[(c[b+3088>>2]|0)+1>>0]|0;a[n>>0]=a[f>>0]|0;a[o>>0]=a[g>>0]|0;a[n+1>>0]=a[f+h>>0]|0;a[o+1>>0]=a[g+h>>0]|0;q=h<<1;a[n+2>>0]=a[f+q>>0]|0;a[o+2>>0]=a[g+q>>0]|0;q=h*3|0;a[n+3>>0]=a[f+q>>0]|0;a[o+3>>0]=a[g+q>>0]|0;q=h<<2;a[n+4>>0]=a[f+q>>0]|0;a[o+4>>0]=a[g+q>>0]|0;q=h*5|0;a[n+5>>0]=a[f+q>>0]|0;a[o+5>>0]=a[g+q>>0]|0;q=h*6|0;a[n+6>>0]=a[f+q>>0]|0;a[o+6>>0]=a[g+q>>0]|0;q=h*7|0;a[n+7>>0]=a[f+q>>0]|0;a[o+7>>0]=a[g+q>>0]|0;if(!(p<<24>>24)){r=8588+(c[b+3104>>2]<<4)+(c[b+3100>>2]<<3)+4|0;s=c[r>>2]|0;Aa[s&31](i,k,d,n);Aa[s&31](j,k,e,o);l=m;return}else{r=8620+((p&255)<<3)+4|0;s=c[r>>2]|0;Aa[s&31](i,k,d,n);Aa[s&31](j,k,e,o);l=m;return}}function vc(){if(c[2163]|0)return;c[2157]=1;c[2159]=2;c[2161]=3;c[2147]=4;c[2149]=5;c[2151]=6;c[2153]=7;c[2158]=8;c[2160]=9;c[2162]=10;c[2148]=11;c[2150]=12;c[2152]=13;c[2154]=14;wc();c[2163]=1;return}function wc(){c[2164]=15;c[2165]=16;c[2166]=17;c[2167]=18;c[2168]=19;c[2169]=20;c[2170]=21;c[2171]=22;c[2172]=23;c[2173]=24;return}function xc(b,e,f,g,h,i,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0;k=l;l=l+16|0;m=k+4|0;n=k;o=m+4|0;a[n>>0]=a[e>>0]|0;a[n+1>>0]=a[e+f>>0]|0;a[n+2>>0]=a[e+(f<<1)>>0]|0;a[n+3>>0]=a[e+(f*3|0)>>0]|0;f=b;b=f;e=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;b=f+4|0;f=d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;b=o;p=b;a[p>>0]=e;a[p+1>>0]=e>>8;a[p+2>>0]=e>>16;a[p+3>>0]=e>>24;e=b+4|0;a[e>>0]=f;a[e+1>>0]=f>>8;a[e+2>>0]=f>>16;a[e+3>>0]=f>>24;a[m+3>>0]=j;Aa[c[8656+(g<<2)>>2]&31](h,i,o,n);l=k;return}function yc(a){a=a|0;var b=0,d=0;je((c[a+52>>2]|0)+-1+(0-(c[a+16>>2]|0))|0,127,(c[a>>2]|0)+5|0)|0;b=a+36|0;d=a+20|0;je((c[a+56>>2]|0)+-1+(0-(c[b>>2]|0))|0,127,(c[d>>2]|0)+5|0)|0;je((c[a+60>>2]|0)+-1+(0-(c[b>>2]|0))|0,127,(c[d>>2]|0)+5|0)|0;return}\nfunction zc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(!g){h=8;l=d;return h|0}f=c[g+28>>2]|0;b=c[g+32>>2]|0;i=(f+1|0)>>>1;j=(b+1|0)>>>1;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];c[e+8>>2]=f;c[e+12>>2]=b;c[e>>2]=f;c[e+4>>2]=b;c[e+28>>2]=i;c[e+32>>2]=j;c[e+20>>2]=i;c[e+24>>2]=j;j=c[g+68>>2]|0;c[e+16>>2]=j;c[e+36>>2]=c[g+72>>2];c[e+76>>2]=(j-f|0)>>>1;h=Yc(c[a+348>>2]|0,c[g>>2]|0,e)|0;l=d;return h|0}function Ac(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(!g){h=8;l=d;return h|0}f=c[g+28>>2]|0;b=c[g+32>>2]|0;i=(f+1|0)>>>1;j=(b+1|0)>>>1;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];c[e+8>>2]=f;c[e+12>>2]=b;c[e>>2]=f;c[e+4>>2]=b;c[e+28>>2]=i;c[e+32>>2]=j;c[e+20>>2]=i;c[e+24>>2]=j;j=c[g+68>>2]|0;c[e+16>>2]=j;c[e+36>>2]=c[g+72>>2];c[e+76>>2]=(j-f|0)>>>1;h=Xc(c[a+348>>2]|0,c[g>>2]|0,e)|0;l=d;return h|0}function Bc(a,b){a=a|0;b=b|0;return 4}function Cc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){f=8;return f|0}d=c[a+348>>2]|0;c[e>>2]=(c[d+9152>>2]<<1)+(c[d+9156>>2]<<2)+(c[d+9148>>2]|0);f=0;return f|0}function Dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;d=c[a+348>>2]|0;if(!((e|0)!=0&(d|0)!=0)){f=8;return f|0}a=c[d+5060>>2]|0;if(!a){f=1;return f|0}c[e>>2]=c[a+112>>2];f=0;return f|0}function Ec(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){f=8;return f|0}d=(c[a+348>>2]|0)+3248|0;a=($c(d,3)|0)!=0;b=($c(d,2)|0)!=0;c[e>>2]=(b?2:0)|(a?4:0)|($c(d,1)|0)!=0;f=0;return f|0}function Fc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){c[a+232>>2]=0;f=0;g=a+236|0;c[g>>2]=f;return 0}else{c[a+232>>2]=c[e>>2];f=c[e+4>>2]|0;g=a+236|0;c[g>>2]=f;return 0}return 0}function Gc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;Sb();sb();Va();b=a+24|0;if(c[b>>2]|0){d=0;return d|0}e=Oa(1,560)|0;if(!e){d=2;return d|0}c[b>>2]=e;c[e+4>>2]=c[a+16>>2];c[e+196>>2]=16;c[e+232>>2]=0;c[e+236>>2]=0;f=a+20|0;a=c[f>>2]|0;if(!a)g=e;else{h=e+184|0;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[f>>2]=h;g=c[b>>2]|0}c[g+484>>2]=0;c[g+480>>2]=c[g+4>>2]&262144;d=0;return d|0}function Hc(a){a=a|0;cd(a+348|0)|0;Pa(a);return 0}function Ic(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;if((e|0)<1){g=8;return g|0}h=f+12|0;c[h>>2]=0;if(e>>>0<=9){g=5;return g|0}if(a[b>>0]&1){g=5;return g|0}c[h>>2]=1;if((a[b+3>>0]|0)!=-99){g=5;return g|0}if((a[b+4>>0]|0)!=1){g=5;return g|0}if((a[b+5>>0]|0)!=42){g=5;return g|0}h=d[b+7>>0]<<8&16128|d[b+6>>0];c[f+4>>2]=h;e=d[b+9>>0]<<8&16128|d[b+8>>0];c[f+8>>2]=e;g=(h|0)==0|(e|0)==0?7:0;return g|0}function Jc(a,b){a=a|0;b=b|0;var d=0;d=a+196|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b>>2]=16;return 0}function Kc(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,ba=0,ca=0,da=0,ea=0,ia=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;i=l;l=l+64|0;j=i+16|0;k=i+8|0;m=i;n=4;q=be(40)|0;c[q>>2]=0;r=i+48|0;s=i+24|0;t=b+480|0;u=c[t>>2]|0;v=(e|0)==0;if(v&(u|f|0)==0){w=0;ce(q|0);l=i;return w|0}x=b+484|0;y=c[x>>2]|0;if(!y){z=b+488|0;A=z+72|0;do{c[z>>2]=0;z=z+4|0}while((z|0)<(A|0))}B=(u|0)!=0;if(!(v&(f|0)==0|B^1)){c[b+488+(y<<2)>>2]=e;c[b+524+(c[x>>2]<<2)>>2]=f;y=(c[x>>2]|0)+1|0;v=y>>>0>9;c[x>>2]=v?0:y;ce(q|0);l=i;return (v?8:0)|0}v=b+488|0;if(B){C=c[v>>2]|0;E=c[b+524>>2]|0}else{c[v>>2]=e;c[b+524>>2]=f;c[x>>2]=1;C=e;E=f}v=b+200|0;B=c[v>>2]|0;y=b+204|0;u=c[y>>2]|0;F=b+232|0;G=c[F>>2]|0;H=b+236|0;I=c[H>>2]|0;do if((E|0)<1){J=8;K=21}else{if(!G)L=C;else{o=0;ha(G|0,I|0,C|0,r|0,(E>>>0<10?E:10)|0);M=o;o=0;if((M|0)!=0&(p|0)!=0){N=ne(c[M>>2]|0,q|0,n|0)|0;if(!N)ja(M|0,p|0);D=p}else N=-1;if((N|0)==1){O=D;P=0;Q=0;R=0;S=0;T=0;U=0;break}L=r}M=b+208|0;c[M>>2]=0;if(E>>>0>9?(a[L>>0]&1)==0:0){c[M>>2]=1;if(((a[L+3>>0]|0)==-99?(a[L+4>>0]|0)==1:0)?(a[L+5>>0]|0)==42:0){M=d[L+7>>0]<<8&16128|d[L+6>>0];c[v>>2]=M;V=d[L+9>>0]<<8&16128|d[L+8>>0];c[y>>2]=V;J=(M|0)==0|(V|0)==0?7:0;K=21;break}J=5;K=21;break}J=0;K=21}while(0);do if((K|0)==21){L=b+212|0;E=c[L>>2]|0;r=(E|0)==0;if(r)W=(c[b+208>>2]|0)==0?5:J;else W=J;N=c[y>>2]|0;if((N|0)==(u|0)?(c[v>>2]|0)==(B|0):0)X=0;else X=1;if(!W)if(r){c[s>>2]=c[v>>2];c[s+4>>2]=N;c[s+8>>2]=9;c[s+12>>2]=0;c[s+16>>2]=c[b+184>>2];N=c[b+4>>2]|0;c[s+20>>2]=N&131072;if(!((c[b+216>>2]|0)!=0|(N&65536|0)==0)){c[b+220>>2]=1027;c[b+224>>2]=4;c[b+228>>2]=0}o=0;N=fa(11,b+348|0,s|0)|0;r=o;o=0;if((r|0)!=0&(p|0)!=0){Y=ne(c[r>>2]|0,q|0,n|0)|0;if(!Y)ja(r|0,p|0);D=p}else Y=-1;if((Y|0)==1){O=D;P=0;Q=0;R=0;S=0;T=0;U=0;break}if(!N){c[L>>2]=1;Z=1}else Z=c[L>>2]|0;_=Z;ba=N;K=35}else{ca=0;K=36}else{_=E;ba=W;K=35}if((K|0)==35)if(!_)da=ba;else{ca=ba;K=36}if((K|0)==36){E=b+348|0;c[(c[E>>2]|0)+11852>>2]=c[F>>2];c[(c[E>>2]|0)+11856>>2]=c[H>>2];da=ca}if(da|0){w=da;ce(q|0);l=i;return w|0}E=c[b+348>>2]|0;if(X){N=E+3248|0;L=E+5040|0;c[L>>2]=c[v>>2];r=E+5044|0;c[r>>2]=c[y>>2];q=me(E+3340|0,1,q|0,n|0)|0;n=D;o=0;C=o;o=0;if((C|0)!=0&(p|0)!=0){ea=ne(c[C>>2]|0,q|0,n|0)|0;if(!ea)ja(C|0,p|0);D=p}else ea=-1;if((ea|0)==1){O=D;P=E;Q=r;R=L;S=N;T=N;U=E}else{O=0;P=E;Q=r;R=L;S=N;T=N;U=E}}else{ia=E;ka=0;la=0;ma=0;na=0;oa=0;K=54}}while(0);while(1){if((K|0)==54){K=0;z=ia+11732|0;pa=t;A=z+80|0;do{c[z>>2]=c[pa>>2];z=z+4|0;pa=pa+4|0}while((z|0)<(A|0));c[b+476>>2]=g;o=0;qa=ga(2,ia|0,f|0,e|0,h|0,((h|0)<0)<<31>>31|0)|0;ea=o;o=0;if((ea|0)!=0&(p|0)!=0){ra=ne(c[ea>>2]|0,q|0,n|0)|0;if(!ra)ja(ea|0,p|0);D=p}else ra=-1;if((ra|0)==1){O=D;P=ia;Q=ka;R=la;S=ma;T=na;U=oa}else break}sa=P+3336|0;if(O|0){K=59;break}c[sa>>2]=1;if((c[R>>2]|0)<1){c[R>>2]=B;o=0;ha(25,T|0,7,5453,m|0);ea=o;o=0;if((ea|0)!=0&(p|0)!=0){ta=ne(c[ea>>2]|0,q|0,n|0)|0;if(!ta)ja(ea|0,p|0);D=p}else ta=-1;if((ta|0)==1){ua=U;va=T;wa=S;xa=R;ya=Q;za=P;O=D;U=ua;T=va;S=wa;R=xa;Q=ya;P=za;continue}}ea=c[Q>>2]|0;if((ea|0)<1){c[Q>>2]=u;o=0;ha(25,T|0,7,5473,k|0);X=o;o=0;if((X|0)!=0&(p|0)!=0){Aa=ne(c[X>>2]|0,q|0,n|0)|0;if(!Aa)ja(X|0,p|0);D=p}else Aa=-1;if((Aa|0)==1){ua=U;va=T;wa=S;xa=R;ya=Q;za=P;O=D;U=ua;T=va;S=wa;R=xa;Q=ya;P=za;continue}Ba=c[Q>>2]|0}else Ba=ea;o=0;ea=$(5,S|0,c[R>>2]|0,Ba|0)|0;X=o;o=0;if((X|0)!=0&(p|0)!=0){Ca=ne(c[X>>2]|0,q|0,n|0)|0;if(!Ca)ja(X|0,p|0);D=p}else Ca=-1;if((Ca|0)==1){ua=U;va=T;wa=S;xa=R;ya=Q;za=P;O=D;U=ua;T=va;S=wa;R=xa;Q=ya;P=za;continue}if(ea|0){o=0;ha(25,T|0,2,5494,j|0);ea=o;o=0;if((ea|0)!=0&(p|0)!=0){Da=ne(c[ea>>2]|0,q|0,n|0)|0;if(!Da)ja(ea|0,p|0);D=p}else Da=-1;if((Da|0)==1){ua=U;va=T;wa=S;xa=R;ya=Q;za=P;O=D;U=ua;T=va;S=wa;R=xa;Q=ya;P=za;continue}}z=P+2848|0;pa=P+5064+((c[P+5564>>2]|0)*120|0)|0;A=z+120|0;do{c[z>>2]=c[pa>>2];z=z+4|0;pa=pa+4|0}while((z|0)<(A|0));z=P+2968|0;pa=P+5064+((c[P+5560>>2]|0)*120|0)|0;A=z+120|0;do{c[z>>2]=c[pa>>2];z=z+4|0;pa=pa+4|0}while((z|0)<(A|0));o=0;aa(1,U|0);ea=o;o=0;if((ea|0)!=0&(p|0)!=0){Ea=ne(c[ea>>2]|0,q|0,n|0)|0;if(!Ea)ja(ea|0,p|0);D=p}else Ea=-1;if((Ea|0)==1){ua=U;va=T;wa=S;xa=R;ya=Q;za=P;O=D;U=ua;T=va;S=wa;R=xa;Q=ya;P=za;continue}c[sa>>2]=0;c[P+5544>>2]=0;ia=P;ka=Q;la=R;ma=S;na=T;oa=U;K=54}if((K|0)==59){c[sa>>2]=0;c[v>>2]=0;c[y>>2]=0;w=-1;ce(q|0);l=i;return w|0}if((qa|0)!=0?(qa=c[ia+3248>>2]|0,(qa|0)!=0):0){c[b>>2]=c[ia+3252>>2]|0?ia+3256|0:0;Fa=qa}else Fa=0;c[x>>2]=0;w=Fa;ce(q|0);l=i;return w|0}function Lc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;d=l;l=l+176|0;e=d+48|0;f=d+8|0;g=d;h=d+16|0;if(c[b>>2]|0){i=0;l=d;return i|0}j=c[a+348>>2]|0;if(!j){i=0;l=d;return i|0}k=f;c[k>>2]=0;c[k+4>>2]=0;k=g;c[k>>2]=0;c[k+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;if(c[a+4>>2]&65536|0){c[h>>2]=c[a+220>>2];c[h+4>>2]=c[a+224>>2];c[h+8>>2]=c[a+228>>2]}if(!(_c(j,e,f,g,h)|0)){h=a+240|0;g=c[a+476>>2]|0;c[h>>2]=258;f=c[e+16>>2]|0;c[a+252>>2]=f;j=c[e+4>>2]|0;c[a+256>>2]=j+79&-16;k=c[e>>2]|0;c[a+272>>2]=k;c[a+264>>2]=k;c[a+276>>2]=j;c[a+268>>2]=j;c[a+280>>2]=1;c[a+284>>2]=1;c[a+288>>2]=c[e+52>>2];c[a+292>>2]=c[e+56>>2];c[a+296>>2]=c[e+60>>2];c[a+300>>2]=0;c[a+304>>2]=f;j=c[e+36>>2]|0;c[a+308>>2]=j;c[a+312>>2]=j;c[a+316>>2]=f;c[a+260>>2]=8;c[a+320>>2]=12;c[a+324>>2]=g;c[a+328>>2]=c[e+68>>2];c[a+332>>2]=0;c[a+336>>2]=0;c[b>>2]=h;m=h}else m=0;i=m;l=d;return i|0}function Mc(){return 1592}function Nc(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;h=l;l=l+16|0;i=h;c[a>>2]=b+e;j=a+4|0;c[j>>2]=b;k=a+8|0;c[k>>2]=0;m=a+12|0;c[m>>2]=-8;c[a+16>>2]=255;c[a+20>>2]=f;c[a+24>>2]=g;if(!((b|0)!=0|(e|0)==0)){n=1;l=h;return n|0}a=e<<3;o=32-a|0;if(!f)p=b;else{Aa[f&31](g,b,i,e>>>0<5?e:5);p=i}i=(o|0)>-1;e=o>>31&-1073741824|1073741816;b=i?o:0;if((a|0)==0&i|(b|0)>24){q=e;r=0}else{i=c[j>>2]|0;a=p;p=e;e=24;o=0;while(1){g=p+8|0;f=(d[a>>0]|0)<<e|o;i=i+1|0;c[j>>2]=i;e=e+-8|0;if((e|0)<(b|0)){q=g;r=f;break}else{a=a+1|0;p=g;o=f}}}c[k>>2]=r;c[m>>2]=q;n=0;l=h;return n|0}function Oc(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=l;l=l+16|0;e=b;f=a+4|0;g=c[f>>2]|0;h=a+8|0;i=c[h>>2]|0;j=a+12|0;k=c[j>>2]|0;m=16-k|0;n=(c[a>>2]|0)-g|0;o=n<<3;p=m+8-o|0;q=c[a+20>>2]|0;if(!q)r=g;else{Aa[q&31](c[a+24>>2]|0,g,e,n>>>0<5?n:5);r=e}e=(p|0)>-1;n=e?k+1073741824|0:k;k=e?p:0;if(e&(o|0)==0|(m|0)<(k|0)){s=n;t=i;c[h>>2]=t;c[j>>2]=s;l=b;return}o=c[f>>2]|0;e=r;r=n;n=m;m=i;while(1){i=r+8|0;p=(d[e>>0]|0)<<n|m;o=o+1|0;c[f>>2]=o;n=n+-8|0;if((n|0)<(k|0)){s=i;t=p;break}else{e=e+1|0;r=i;m=p}}c[h>>2]=t;c[j>>2]=s;l=b;return}function Pc(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Pc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0;g=l;l=l+32|0;h=g+16|0;i=g;j=c[f+5772>>2]|0;k=f+11680|0;m=f+11696|0;n=(((c[m>>2]<<7)+-128|0)>>>8)+1|0;o=f+11692|0;p=c[o>>2]|0;if((p|0)<0){Oc(k);q=c[o>>2]|0}else q=p;p=f+11688|0;r=c[p>>2]|0;s=n<<24;if(r>>>0<s>>>0){t=0;u=n;v=r}else{t=1;u=(c[m>>2]|0)-n|0;v=r-s|0}s=d[16+u>>0]|0;r=u<<s;u=v<<s;v=q-s|0;c[p>>2]=u;c[o>>2]=v;c[m>>2]=r;s=f+5728|0;c[s>>2]=t;q=f+11831|0;a[q>>0]=0;if(!t){w=r;x=v;y=u}else{t=u;u=r;r=v;v=8;n=0;do{z=v;v=v+-1|0;A=(((u<<7)+-128|0)>>>8)+1|0;if((r|0)<0){Oc(k);B=c[o>>2]|0;C=c[p>>2]|0}else{B=r;C=t}D=A<<24;if(C>>>0<D>>>0){E=0;F=A;G=C}else{E=1;F=(c[m>>2]|0)-A|0;G=C-D|0}D=d[16+F>>0]|0;u=F<<D;t=G<<D;r=B-D|0;c[p>>2]=t;c[o>>2]=r;c[m>>2]=u;n=E<<v|n}while((z|0)>1);a[q>>0]=n;w=u;x=r;y=t}t=f+5700|0;if(c[t>>2]|0){r=w;w=x;x=y;y=8;u=0;do{n=y;y=y+-1|0;v=(((r<<7)+-128|0)>>>8)+1|0;if((w|0)<0){Oc(k);H=c[p>>2]|0;I=c[o>>2]|0}else{H=x;I=w}E=v<<24;if(H>>>0<E>>>0){J=0;K=v;L=H}else{J=1;K=(c[m>>2]|0)-v|0;L=H-E|0}E=d[16+K>>0]|0;r=K<<E;x=L<<E;w=I-E|0;c[p>>2]=x;c[o>>2]=w;c[m>>2]=r;u=J<<y|u}while((n|0)>1);a[f+11828>>0]=u;u=r;r=w;w=x;x=8;y=0;do{J=x;x=x+-1|0;I=(((u<<7)+-128|0)>>>8)+1|0;if((r|0)<0){Oc(k);M=c[p>>2]|0;N=c[o>>2]|0}else{M=w;N=r}L=I<<24;if(M>>>0<L>>>0){O=0;P=I;Q=M}else{O=1;P=(c[m>>2]|0)-I|0;Q=M-L|0}L=d[16+P>>0]|0;u=P<<L;w=Q<<L;r=N-L|0;c[p>>2]=w;c[o>>2]=r;c[m>>2]=u;y=O<<x|y}while((J|0)>1);a[f+11829>>0]=y;y=u;u=r;r=w;w=8;x=0;do{O=w;w=w+-1|0;N=(((y<<7)+-128|0)>>>8)+1|0;if((u|0)<0){Oc(k);R=c[p>>2]|0;T=c[o>>2]|0}else{R=r;T=u}Q=N<<24;if(R>>>0<Q>>>0){U=0;V=N;W=R}else{U=1;V=(c[m>>2]|0)-N|0;W=R-Q|0}Q=d[16+V>>0]|0;y=V<<Q;r=W<<Q;u=T-Q|0;c[p>>2]=r;c[o>>2]=u;c[m>>2]=y;x=U<<w|x}while((O|0)>1);a[f+11830>>0]=x;x=(((y<<7)+-128|0)>>>8)+1|0;if((u|0)<0){Oc(k);X=c[p>>2]|0;Y=c[o>>2]|0}else{X=r;Y=u}u=x<<24;if(X>>>0<u>>>0){Z=1;_=x;$=X}else{Z=0;_=(c[m>>2]|0)-x|0;$=X-u|0}u=d[16+_>>0]|0;X=_<<u;_=Y-u|0;c[p>>2]=$<<u;c[o>>2]=_;c[m>>2]=X;if(Z){aa=X;ba=_}else{Z=X;X=_;_=0;while(1){u=Z;$=X;Y=8;x=0;do{r=Y;Y=Y+-1|0;y=(((u<<7)+-128|0)>>>8)+1|0;if(($|0)<0){Oc(k);ca=c[o>>2]|0}else ca=$;w=c[p>>2]|0;U=y<<24;if(w>>>0<U>>>0){da=0;ea=y;fa=w}else{da=1;ea=(c[m>>2]|0)-y|0;fa=w-U|0}U=d[16+ea>>0]|0;u=ea<<U;$=ca-U|0;c[p>>2]=fa<<U;c[o>>2]=$;c[m>>2]=u;x=da<<Y|x}while((r|0)>1);a[f+10323+_>>0]=x;_=_+1|0;Y=c[m>>2]|0;u=c[o>>2]|0;if((_|0)==4){aa=Y;ba=u;break}else{Z=Y;X=u}}}X=(((aa<<7)+-128|0)>>>8)+1|0;if((ba|0)<0){Oc(k);ga=c[o>>2]|0}else ga=ba;ba=c[p>>2]|0;aa=X<<24;if(ba>>>0<aa>>>0){ha=1;ia=X;ja=ba}else{ha=0;ia=(c[m>>2]|0)-X|0;ja=ba-aa|0}aa=d[16+ia>>0]|0;ba=ia<<aa;ia=ja<<aa;ja=ga-aa|0;c[p>>2]=ia;c[o>>2]=ja;c[m>>2]=ba;if(ha)ka=0;else{ha=ia;ia=ba;ba=ja;ja=8;aa=0;do{ga=ja;ja=ja+-1|0;X=(((ia<<7)+-128|0)>>>8)+1|0;if((ba|0)<0){Oc(k);la=c[p>>2]|0;ma=c[o>>2]|0}else{la=ha;ma=ba}Z=X<<24;if(la>>>0<Z>>>0){na=0;oa=X;pa=la}else{na=1;oa=(c[m>>2]|0)-X|0;pa=la-Z|0}Z=d[16+oa>>0]|0;ia=oa<<Z;ha=pa<<Z;ba=ma-Z|0;c[p>>2]=ha;c[o>>2]=ba;c[m>>2]=ia;aa=na<<ja|aa}while((ga|0)>1);a[f+10327>>0]=aa;aa=ha;ha=ia;ia=ba;ba=8;ja=0;do{na=ba;ba=ba+-1|0;ma=(((ha<<7)+-128|0)>>>8)+1|0;if((ia|0)<0){Oc(k);qa=c[p>>2]|0;ra=c[o>>2]|0}else{qa=aa;ra=ia}pa=ma<<24;if(qa>>>0<pa>>>0){sa=0;ta=ma;ua=qa}else{sa=1;ta=(c[m>>2]|0)-ma|0;ua=qa-pa|0}pa=d[16+ta>>0]|0;ha=ta<<pa;aa=ua<<pa;ia=ra-pa|0;c[p>>2]=aa;c[o>>2]=ia;c[m>>2]=ha;ja=sa<<ba|ja}while((na|0)>1);a[f+10328>>0]=ja;ja=aa;aa=ha;ha=ia;ia=8;ba=0;do{sa=ia;ia=ia+-1|0;ra=(((aa<<7)+-128|0)>>>8)+1|0;if((ha|0)<0){Oc(k);va=c[p>>2]|0;wa=c[o>>2]|0}else{va=ja;wa=ha}ua=ra<<24;if(va>>>0<ua>>>0){xa=0;ya=ra;za=va}else{xa=1;ya=(c[m>>2]|0)-ra|0;za=va-ua|0}ua=d[16+ya>>0]|0;aa=ya<<ua;ja=za<<ua;ha=wa-ua|0;c[p>>2]=ja;c[o>>2]=ha;c[m>>2]=aa;ba=xa<<ia|ba}while((sa|0)>1);a[f+10329>>0]=ba;ka=0}do{ba=f+11389+(ka*19|0)+19|0;ia=f+11389+(ka*19|0)|0;xa=5268+(ka*19|0)|0;do{aa=((S((c[m>>2]|0)+-1|0,d[xa>>0]|0)|0)>>>8)+1|0;xa=xa+1|0;ha=c[o>>2]|0;if((ha|0)<0){Oc(k);Aa=c[o>>2]|0}else Aa=ha;ha=c[p>>2]|0;ja=aa<<24;if(ha>>>0<ja>>>0){Ba=1;Ca=aa;Da=ha}else{Ba=0;Ca=(c[m>>2]|0)-aa|0;Da=ha-ja|0}ja=d[16+Ca>>0]|0;ha=Ca<<ja;aa=Da<<ja;wa=Aa-ja|0;c[p>>2]=aa;c[o>>2]=wa;c[m>>2]=ha;if(!Ba){ja=aa;aa=ha;ha=wa;wa=7;za=0;do{ya=wa;wa=wa+-1|0;va=(((aa<<7)+-128|0)>>>8)+1|0;if((ha|0)<0){Oc(k);Ea=c[p>>2]|0;Fa=c[o>>2]|0}else{Ea=ja;Fa=ha}sa=va<<24;if(Ea>>>0<sa>>>0){Ga=0;Ha=va;Ia=Ea}else{Ga=1;Ha=(c[m>>2]|0)-va|0;Ia=Ea-sa|0}sa=d[16+Ha>>0]|0;aa=Ha<<sa;ja=Ia<<sa;ha=Fa-sa|0;c[p>>2]=ja;c[o>>2]=ha;c[m>>2]=aa;za=Ga<<wa|za}while((ya|0)>1);wa=za&255;a[ia>>0]=(wa|0)==0?1:wa<<1&255}ia=ia+1|0}while(ia>>>0<ba>>>0);ka=ka+1|0}while((ka|0)!=2)}ka=f+3192|0;c[ka>>2]=0;Ga=f+5716|0;Fa=c[Ga>>2]|0;Ia=(Fa<<7)+-128|0;Ha=f+3196|0;c[Ha>>2]=Ia;Ea=f+5720|0;Ba=c[Ea>>2]|0;Aa=(Ba<<7)+-128|0;if((Fa|0)<=0){l=g;return}Da=f+3184|0;Ca=f+3188|0;ba=f+3149|0;ia=f+5724|0;xa=f+11828|0;x=f+3092|0;wa=f+11829|0;aa=i+8|0;ha=i+4|0;ja=h+12|0;ya=h+8|0;sa=h+4|0;va=i+4|0;ua=f+11389|0;ra=f+11408|0;ta=ha+2|0;qa=f+11830|0;na=f+3148|0;pa=f+3152|0;ma=f+3153|0;oa=f+3154|0;la=Fa;Fa=Ia;Ia=0;ga=Ba;Ba=0;Z=j;while(1){c[Da>>2]=0;c[Ca>>2]=Aa;if((ga|0)>0){j=0;X=Z;do{if(!(a[ba>>0]|0)){if(!(c[t>>2]|0))a[X+11>>0]=0}else if(a[na>>0]|0){_=((S((c[m>>2]|0)+-1|0,d[pa>>0]|0)|0)>>>8)+1|0;da=c[o>>2]|0;if((da|0)<0){Oc(k);Ja=c[o>>2]|0}else Ja=da;da=c[p>>2]|0;fa=_<<24;if(da>>>0<fa>>>0){Ka=1;La=_;Ma=da}else{Ka=0;La=(c[m>>2]|0)-_|0;Ma=da-fa|0}fa=d[16+La>>0]|0;da=La<<fa;_=Ma<<fa;ca=Ja-fa|0;c[p>>2]=_;c[o>>2]=ca;c[m>>2]=da;if(Ka){fa=((S(d[ma>>0]|0,da+-1|0)|0)>>>8)+1|0;if((ca|0)<0){Oc(k);Na=c[o>>2]|0;Oa=c[p>>2]|0}else{Na=ca;Oa=_}ea=fa<<24;if(Oa>>>0<ea>>>0){Pa=0;Qa=fa;Ra=Oa}else{Pa=1;Qa=(c[m>>2]|0)-fa|0;Ra=Oa-ea|0}ea=d[16+Qa>>0]|0;Sa=Pa;Ta=Qa<<ea;Ua=Na-ea|0;Va=Ra<<ea}else{ea=((S(d[oa>>0]|0,da+-1|0)|0)>>>8)+1|0;if((ca|0)<0){Oc(k);Wa=c[p>>2]|0;Xa=c[o>>2]|0}else{Wa=_;Xa=ca}ca=ea<<24;if(Wa>>>0<ca>>>0){Ya=2;Za=ea;_a=Wa}else{Ya=3;Za=(c[m>>2]|0)-ea|0;_a=Wa-ca|0}ca=d[16+Za>>0]|0;Sa=Ya;Ta=Za<<ca;Ua=Xa-ca|0;Va=_a<<ca}c[p>>2]=Va;c[o>>2]=Ua;c[m>>2]=Ta;a[X+11>>0]=Sa}if(!(c[s>>2]|0))$a=0;else{ca=((S((c[m>>2]|0)+-1|0,d[q>>0]|0)|0)>>>8)+1|0;ea=c[o>>2]|0;if((ea|0)<0){Oc(k);ab=c[o>>2]|0}else ab=ea;ea=c[p>>2]|0;_=ca<<24;if(ea>>>0<_>>>0){bb=0;cb=ca;db=ea}else{bb=1;cb=(c[m>>2]|0)-ca|0;db=ea-_|0}_=d[16+cb>>0]|0;c[p>>2]=db<<_;c[o>>2]=ab-_;c[m>>2]=cb<<_;$a=bb}a[X+9>>0]=$a;_=X+3|0;a[_>>0]=0;do if(!(c[t>>2]|0)){ea=c[ia>>2]|0;a[X+2>>0]=0;ca=c[m>>2]|0;da=c[o>>2]|0;fa=0;do{u=fa<<24>>24;Y=((S(d[4292+(u>>1)>>0]|0,ca+-1|0)|0)>>>8)+1|0;if((da|0)<0){Oc(k);eb=c[o>>2]|0}else eb=da;$=c[p>>2]|0;r=Y<<24;if($>>>0<r>>>0){fb=0;gb=Y;hb=$}else{fb=1;gb=(c[m>>2]|0)-Y|0;hb=$-r|0}r=d[16+gb>>0]|0;ca=gb<<r;da=eb-r|0;c[p>>2]=hb<<r;c[o>>2]=da;c[m>>2]=ca;fa=a[5237+(fb+u)>>0]|0}while(fa<<24>>24>0);u=0-(fa<<24>>24)|0;a[X>>0]=u;if((u&255|0)==4){a[_>>0]=1;u=X+-76|0;r=0-ea|0;$=X+(r*76|0)|0;Y=0;do{a:do if(Y>>>0>3)ib=c[X+12+(Y<<2)+-16>>2]|0;else switch(a[$>>0]|0){case 4:{ib=c[X+(r*76|0)+12+(Y<<2)+48>>2]|0;break a;break}case 3:{ib=1;break a;break}case 1:{ib=2;break a;break}case 2:{ib=3;break a;break}default:{ib=0;break a}}while(0);b:do if(!(Y&3))switch(a[u>>0]|0){case 4:{jb=c[X+-64+(Y<<2)+12>>2]|0;break b;break}case 3:{jb=1;break b;break}case 1:{jb=2;break b;break}case 2:{jb=3;break b;break}default:{jb=0;break b}}else jb=c[X+12+(Y<<2)+-4>>2]|0;while(0);U=c[m>>2]|0;w=c[o>>2]|0;y=0;do{T=y<<24>>24;W=((S(d[(T>>1)+(4311+(ib*90|0)+(jb*9|0))>>0]|0,U+-1|0)|0)>>>8)+1|0;if((w|0)<0){Oc(k);kb=c[o>>2]|0}else kb=w;V=c[p>>2]|0;R=W<<24;if(V>>>0<R>>>0){lb=0;mb=W;nb=V}else{lb=1;mb=(c[m>>2]|0)-W|0;nb=V-R|0}R=d[16+mb>>0]|0;U=mb<<R;w=kb-R|0;c[p>>2]=nb<<R;c[o>>2]=w;c[m>>2]=U;y=a[5211+(lb+T)>>0]|0}while(y<<24>>24>0);c[X+12+(Y<<2)>>2]=0-(y<<24>>24);Y=Y+1|0}while((Y|0)!=16);ob=c[m>>2]|0;pb=c[o>>2]|0;qb=0}else{ob=ca;pb=da;qb=0}do{Y=qb<<24>>24;u=((S(d[4299+(Y>>1)>>0]|0,ob+-1|0)|0)>>>8)+1|0;if((pb|0)<0){Oc(k);rb=c[o>>2]|0}else rb=pb;r=c[p>>2]|0;$=u<<24;if(r>>>0<$>>>0){sb=0;tb=u;ub=r}else{sb=1;tb=(c[m>>2]|0)-u|0;ub=r-$|0}$=d[16+tb>>0]|0;ob=tb<<$;pb=rb-$|0;c[p>>2]=ub<<$;c[o>>2]=pb;c[m>>2]=ob;qb=a[5245+(sb+Y)>>0]|0}while(qb<<24>>24>0);a[X+1>>0]=0-(qb&255)}else{da=((S((c[m>>2]|0)+-1|0,d[xa>>0]|0)|0)>>>8)+1|0;ca=c[o>>2]|0;if((ca|0)<0){Oc(k);vb=c[o>>2]|0}else vb=ca;ca=c[p>>2]|0;Y=da<<24;if(ca>>>0<Y>>>0){wb=0;xb=da;yb=ca}else{wb=1;xb=(c[m>>2]|0)-da|0;yb=ca-Y|0}Y=d[16+xb>>0]|0;ca=xb<<Y;da=yb<<Y;$=vb-Y|0;c[p>>2]=da;c[o>>2]=$;c[m>>2]=ca;Y=X+2|0;a[Y>>0]=wb;if(!(wb<<24>>24)){c[X+4>>2]=0;r=c[m>>2]|0;u=c[o>>2]|0;ea=0;do{fa=ea<<24>>24;U=((S(d[(fa>>1)+(f+10323)>>0]|0,r+-1|0)|0)>>>8)+1|0;if((u|0)<0){Oc(k);zb=c[o>>2]|0}else zb=u;w=c[p>>2]|0;T=U<<24;if(w>>>0<T>>>0){Ab=0;Bb=U;Cb=w}else{Ab=1;Bb=(c[m>>2]|0)-U|0;Cb=w-T|0}T=d[16+Bb>>0]|0;r=Bb<<T;u=zb-T|0;c[p>>2]=Cb<<T;c[o>>2]=u;c[m>>2]=r;ea=a[5229+(Ab+fa)>>0]|0}while(ea<<24>>24>0);fa=0-(ea<<24>>24)|0;a[X>>0]=fa;if((fa&255|0)==4){a[_>>0]=1;fa=r;T=u;w=0;while(1){U=fa;R=T;V=0;do{W=V<<24>>24;O=((S(d[(W>>1)+(f+10314)>>0]|0,U+-1|0)|0)>>>8)+1|0;if((R|0)<0){Oc(k);Db=c[o>>2]|0}else Db=R;Q=c[p>>2]|0;N=O<<24;if(Q>>>0<N>>>0){Eb=0;Fb=O;Gb=Q}else{Eb=1;Fb=(c[m>>2]|0)-O|0;Gb=Q-N|0}N=d[16+Fb>>0]|0;U=Fb<<N;R=Db-N|0;c[p>>2]=Gb<<N;c[o>>2]=R;c[m>>2]=U;V=a[5211+(Eb+W)>>0]|0}while(V<<24>>24>0);c[X+12+(w<<2)>>2]=0-(V<<24>>24);w=w+1|0;U=c[m>>2]|0;R=c[o>>2]|0;if((w|0)==16){Hb=U;Ib=R;Jb=0;break}else{fa=U;T=R}}}else{Hb=r;Ib=u;Jb=0}do{T=Jb<<24>>24;fa=((S(d[(T>>1)+(f+10327)>>0]|0,Hb+-1|0)|0)>>>8)+1|0;if((Ib|0)<0){Oc(k);Kb=c[o>>2]|0}else Kb=Ib;w=c[p>>2]|0;ea=fa<<24;if(w>>>0<ea>>>0){Lb=0;Mb=fa;Nb=w}else{Lb=1;Mb=(c[m>>2]|0)-fa|0;Nb=w-ea|0}ea=d[16+Mb>>0]|0;Hb=Mb<<ea;Ib=Kb-ea|0;c[p>>2]=Nb<<ea;c[o>>2]=Ib;c[m>>2]=Hb;Jb=a[5245+(Lb+T)>>0]|0}while(Jb<<24>>24>0);a[X+1>>0]=0-(Jb&255);break}u=0-(c[x>>2]|0)|0;r=X+(u*76|0)|0;T=r+-76|0;ea=X+10|0;a[ea>>0]=0;w=((S(d[wa>>0]|0,ca+-1|0)|0)>>>8)+1|0;if(($|0)<0){Oc(k);Ob=c[p>>2]|0;Pb=c[o>>2]|0}else{Ob=da;Pb=$}fa=w<<24;if(Ob>>>0<fa>>>0){Qb=1;Rb=w;Sb=Ob}else{Qb=0;Rb=(c[m>>2]|0)-w|0;Sb=Ob-fa|0}fa=d[16+Rb>>0]|0;w=Rb<<fa;R=Sb<<fa;U=Pb-fa|0;c[p>>2]=R;c[o>>2]=U;c[m>>2]=w;if(!Qb){fa=((S(d[qa>>0]|0,w+-1|0)|0)>>>8)+1|0;if((U|0)<0){Oc(k);Tb=c[p>>2]|0;Ub=c[o>>2]|0}else{Tb=R;Ub=U}U=fa<<24;if(Tb>>>0<U>>>0){Vb=2;Wb=fa;Xb=Tb}else{Vb=3;Wb=(c[m>>2]|0)-fa|0;Xb=Tb-U|0}U=d[16+Wb>>0]|0;c[p>>2]=Xb<<U;c[o>>2]=Ub-U;c[m>>2]=Wb<<U;a[Y>>0]=Vb}c[aa>>2]=0;c[ha>>2]=0;c[i>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;U=a[X+(u*76|0)+2>>0]|0;fa=U&255;if(!(U<<24>>24)){Yb=h;Zb=i}else{U=c[X+(u*76|0)+4>>2]|0;do if(!U){_b=h;$b=i}else{c[ha>>2]=U;if((c[f+9172+(d[Y>>0]<<2)>>2]|0)==(c[f+9172+(fa<<2)>>2]|0)){_b=sa;$b=ha;break}b[ha>>1]=0-U;b[ta>>1]=0-(U>>>16);_b=sa;$b=ha}while(0);c[_b>>2]=(c[_b>>2]|0)+2;Yb=_b;Zb=$b}U=a[X+-74>>0]|0;if(!(U<<24>>24)){ac=Yb;bc=Zb}else{fa=c[X+-72>>2]|0;do if(!fa){cc=h;dc=Yb;ec=Zb}else{$=fa>>>16;da=(c[f+9172+(d[Y>>0]<<2)>>2]|0)==(c[f+9172+((U&255)<<2)>>2]|0);ca=(da?$:0-$|0)<<16|(da?fa:0-fa|0)&65535;if((ca|0)==(c[Zb>>2]|0)){cc=Yb;dc=Yb;ec=Zb;break}da=Zb+4|0;c[da>>2]=ca;ca=Yb+4|0;cc=ca;dc=ca;ec=da}while(0);c[cc>>2]=(c[cc>>2]|0)+2;ac=dc;bc=ec}fa=a[T+2>>0]|0;if(!(fa<<24>>24))fc=bc;else{U=c[T+4>>2]|0;do if(!U){gc=h;hc=bc}else{da=U>>>16;ca=(c[f+9172+(d[Y>>0]<<2)>>2]|0)==(c[f+9172+((fa&255)<<2)>>2]|0);$=(ca?da:0-da|0)<<16|(ca?U:0-U|0)&65535;if(($|0)==(c[bc>>2]|0)){gc=ac;hc=bc;break}ca=bc+4|0;c[ca>>2]=$;gc=ac+4|0;hc=ca}while(0);c[gc>>2]=(c[gc>>2]|0)+1;fc=hc}U=c[h>>2]|0;fa=((S((c[m>>2]|0)+-1|0,c[408+(U<<4)>>2]|0)|0)>>>8)+1|0;Y=c[o>>2]|0;if((Y|0)<0){Oc(k);ic=c[o>>2]|0}else ic=Y;Y=c[p>>2]|0;ca=fa<<24;if(Y>>>0<ca>>>0){jc=1;kc=fa;lc=Y}else{jc=0;kc=(c[m>>2]|0)-fa|0;lc=Y-ca|0}ca=d[16+kc>>0]|0;Y=kc<<ca;fa=lc<<ca;$=ic-ca|0;c[p>>2]=fa;c[o>>2]=$;c[m>>2]=Y;do if(jc){a[X>>0]=7;c[X+4>>2]=0}else{ca=c[va>>2]|0;da=(((c[ja>>2]|0)>0?(c[fc>>2]|0)==(ca|0):0)&1)+(c[sa>>2]|0)|0;c[sa>>2]=da;R=c[ya>>2]|0;if((R|0)>(da|0)){c[sa>>2]=R;c[ya>>2]=da;w=c[aa>>2]|0;c[va>>2]=w;c[aa>>2]=ca;mc=R;nc=da;oc=w}else{mc=da;nc=R;oc=ca}ca=((S(c[408+(mc<<4)+4>>2]|0,Y+-1|0)|0)>>>8)+1|0;if(($|0)<0){Oc(k);pc=c[p>>2]|0;qc=c[o>>2]|0}else{pc=fa;qc=$}R=ca<<24;if(pc>>>0<R>>>0){rc=1;sc=ca;tc=pc}else{rc=0;sc=(c[m>>2]|0)-ca|0;tc=pc-R|0}R=d[16+sc>>0]|0;ca=sc<<R;da=tc<<R;w=qc-R|0;c[p>>2]=da;c[o>>2]=w;c[m>>2]=ca;if(rc){a[X>>0]=5;R=X+4|0;c[R>>2]=oc;y=R+2|0;W=oc>>16;N=(c[Da>>2]|0)+-128|0;if((W|0)>=(N|0)){Q=(c[Ca>>2]|0)+128|0;if((W|0)>(Q|0)){uc=Q;vc=256}}else{uc=N;vc=256}if((vc|0)==256){vc=0;b[y>>1]=uc}y=oc<<16>>16;N=(c[ka>>2]|0)+-128|0;if((y|0)>=(N|0)){Q=(c[Ha>>2]|0)+128|0;if((y|0)>(Q|0))wc=Q;else break}else wc=N;b[R>>1]=wc;break}R=((S(c[408+(nc<<4)+8>>2]|0,ca+-1|0)|0)>>>8)+1|0;if((w|0)<0){Oc(k);xc=c[p>>2]|0;yc=c[o>>2]|0}else{xc=da;yc=w}w=R<<24;if(xc>>>0<w>>>0){zc=1;Ac=R;Bc=xc}else{zc=0;Ac=(c[m>>2]|0)-R|0;Bc=xc-w|0}w=d[16+Ac>>0]|0;R=Ac<<w;da=Bc<<w;ca=yc-w|0;c[p>>2]=da;c[o>>2]=ca;c[m>>2]=R;if(zc){a[X>>0]=6;w=c[aa>>2]|0;N=X+4|0;c[N>>2]=w;Q=N+2|0;y=w>>16;W=(c[Da>>2]|0)+-128|0;if((y|0)>=(W|0)){O=(c[Ca>>2]|0)+128|0;if((y|0)>(O|0)){Cc=O;vc=250}}else{Cc=W;vc=250}if((vc|0)==250){vc=0;b[Q>>1]=Cc}Q=w<<16>>16;w=(c[ka>>2]|0)+-128|0;if((Q|0)>=(w|0)){W=(c[Ha>>2]|0)+128|0;if((Q|0)>(W|0))Dc=W;else break}else Dc=w;b[N>>1]=Dc;break}N=(c[ka>>2]|0)+-128|0;w=(c[Ha>>2]|0)+128|0;W=(c[Ca>>2]|0)+128|0;Q=(c[Da>>2]|0)+-128|0;O=i+(((mc|0)>=(U|0)&1)<<2)|0;y=O+2|0;P=b[y>>1]|0;M=P<<16>>16;if((M|0)>=(Q|0))if((M|0)>(W|0)){Ec=W;vc=194}else Fc=P;else{Ec=Q;vc=194}if((vc|0)==194){vc=0;P=Ec&65535;b[y>>1]=P;Fc=P}P=b[O>>1]|0;y=P<<16>>16;if((y|0)>=(N|0))if((y|0)>(w|0)){Gc=w;vc=197}else Hc=P;else{Gc=N;vc=197}if((vc|0)==197){vc=0;P=Gc&65535;b[O>>1]=P;Hc=P}P=X+-76|0;y=((a[P>>0]|0)==9&1)+((a[r>>0]|0)==9&1)<<1|(a[T>>0]|0)==9;c[ja>>2]=y;M=((S(c[408+(y<<4)+12>>2]|0,R+-1|0)|0)>>>8)+1|0;if((ca|0)<0){Oc(k);Ic=c[p>>2]|0;Jc=c[o>>2]|0}else{Ic=da;Jc=ca}ca=M<<24;if(Ic>>>0<ca>>>0){Kc=1;Lc=M;Mc=Ic}else{Kc=0;Lc=(c[m>>2]|0)-M|0;Mc=Ic-ca|0}ca=d[16+Lc>>0]|0;M=Lc<<ca;da=Mc<<ca;R=Jc-ca|0;c[p>>2]=da;c[o>>2]=R;c[m>>2]=M;if(Kc){ca=X+4|0;b[ca>>1]=(Qc(k,ua)|0)<<1;y=(Qc(k,ra)|0)<<1;J=(e[ca>>1]|0)+(Hc&65535)|0;b[ca>>1]=J;L=(y&65534)+(Fc&65535)|0;b[ca+2>>1]=L;ca=L<<16>>16;L=J<<16>>16;a[ea>>0]=((L|0)>(w|0)|((L|0)<(N|0)|((ca|0)<(Q|0)|(ca|0)>(W|0))))&1;a[X>>0]=8;break}ca=c[O>>2]|0;O=ca>>>16;L=(((M*110|0)+-110|0)>>>8)+1|0;if((R|0)<0){Oc(k);Nc=c[p>>2]|0;Pc=c[o>>2]|0}else{Nc=da;Pc=R}R=L<<24;if(Nc>>>0<R>>>0){Rc=1;Sc=L;Tc=Nc}else{Rc=0;Sc=(c[m>>2]|0)-L|0;Tc=Nc-R|0}R=d[16+Sc>>0]|0;L=Sc<<R;da=Tc<<R;M=Pc-R|0;c[p>>2]=da;c[o>>2]=M;c[m>>2]=L;do if(Rc){Uc=16;Vc=3}else{R=(((L*111|0)+-111|0)>>>8)+1|0;if((M|0)<0){Oc(k);Wc=c[p>>2]|0;Xc=c[o>>2]|0}else{Wc=da;Xc=M}J=R<<24;if(Wc>>>0<J>>>0){Yc=1;Zc=R;_c=Wc}else{Yc=0;Zc=(c[m>>2]|0)-R|0;_c=Wc-J|0}J=d[16+Zc>>0]|0;R=Zc<<J;y=_c<<J;I=Xc-J|0;c[p>>2]=y;c[o>>2]=I;c[m>>2]=R;if(Yc){Uc=4;Vc=2;break}J=(((R*150|0)+-150|0)>>>8)+1|0;if((I|0)<0){Oc(k);$c=c[p>>2]|0;ad=c[o>>2]|0}else{$c=y;ad=I}I=J<<24;if($c>>>0<I>>>0){bd=0;cd=J;dd=$c}else{bd=1;cd=(c[m>>2]|0)-J|0;dd=$c-I|0}I=d[16+cd>>0]|0;c[p>>2]=dd<<I;c[o>>2]=ad-I;c[m>>2]=cd<<I;Uc=2;Vc=bd}while(0);M=X+-72|0;da=X+(u*76|0)+4|0;L=5551+Vc|0;V=0;do{I=d[5344+(Vc<<4)+V>>0]|0;if(!(I&3))ed=(a[P>>0]|0)!=9?M:X+-64+(I<<2)+12|0;else ed=X+12+(I<<2)+-4|0;J=c[ed>>2]|0;if(!(I&252))fd=(a[r>>0]|0)!=9?da:X+(u*76|0)+12+(I<<2)+48|0;else fd=X+12+(I<<2)+-16|0;I=c[fd>>2]|0;y=(J|0)==(I|0)|((J|0)==0&1)<<1|((I|0)==0&1)<<2;R=((S((c[m>>2]|0)+-1|0,d[5527+(y*3|0)>>0]|0)|0)>>>8)+1|0;K=c[o>>2]|0;if((K|0)<0){Oc(k);gd=c[o>>2]|0}else gd=K;K=c[p>>2]|0;H=R<<24;if(K>>>0<H>>>0){hd=1;id=R;jd=K}else{hd=0;id=(c[m>>2]|0)-R|0;jd=K-H|0}H=d[16+id>>0]|0;K=id<<H;R=jd<<H;n=gd-H|0;c[p>>2]=R;c[o>>2]=n;c[m>>2]=K;do if(hd){kd=J&65535;ld=J>>>16&65535}else{H=((S(d[5527+(y*3|0)+1>>0]|0,K+-1|0)|0)>>>8)+1|0;if((n|0)<0){Oc(k);md=c[p>>2]|0;nd=c[o>>2]|0}else{md=R;nd=n}E=H<<24;if(md>>>0<E>>>0){od=1;pd=H;qd=md}else{od=0;pd=(c[m>>2]|0)-H|0;qd=md-E|0}E=d[16+pd>>0]|0;H=pd<<E;v=qd<<E;B=nd-E|0;c[p>>2]=v;c[o>>2]=B;c[m>>2]=H;if(od){kd=I&65535;ld=I>>>16&65535;break}E=((S(d[5527+(y*3|0)+2>>0]|0,H+-1|0)|0)>>>8)+1|0;if((B|0)<0){Oc(k);rd=c[p>>2]|0;sd=c[o>>2]|0}else{rd=v;sd=B}B=E<<24;if(rd>>>0<B>>>0){td=1;ud=E;vd=rd}else{td=0;ud=(c[m>>2]|0)-E|0;vd=rd-B|0}B=d[16+ud>>0]|0;c[p>>2]=vd<<B;c[o>>2]=sd-B;c[m>>2]=ud<<B;if(td){kd=0;ld=0;break}B=((Qc(k,ua)|0)<<1)+ca&65535;kd=B;ld=((Qc(k,ra)|0)<<1)+O&65535}while(0);y=ld<<16>>16;I=kd<<16>>16;a[ea>>0]=((I|0)>(w|0)|((y|0)<(Q|0)|(y|0)>(W|0)|(I|0)<(N|0)))&1|d[ea>>0];I=d[L>>0]|0;y=(ld&65535)<<16|kd&65535;n=I;R=(S(I,V)|0)+(5555+(Vc<<4))|0;while(1){c[X+12+(d[R>>0]<<2)>>2]=y;n=n+-1|0;if(!n)break;else R=R+1|0}V=V+1|0}while((V|0)<(Uc|0));a[X+8>>0]=Vc;c[X+4>>2]=c[X+72>>2];a[X>>0]=9;a[_>>0]=1}while(0)}while(0);c[Da>>2]=(c[Da>>2]|0)+-128;c[Ca>>2]=(c[Ca>>2]|0)+-128;X=X+76|0;j=j+1|0;wd=c[Ea>>2]|0}while((j|0)<(wd|0));xd=c[ka>>2]|0;yd=c[Ha>>2]|0;zd=c[Ga>>2]|0;Ad=wd;Bd=X}else{xd=Ia;yd=Fa;zd=la;Ad=ga;Bd=Z}Ia=xd+-128|0;c[ka>>2]=Ia;Fa=yd+-128|0;c[Ha>>2]=Fa;Ba=Ba+1|0;if((Ba|0)>=(zd|0))break;else{la=zd;ga=Ad;Z=Bd+76|0}}l=g;return}function Qc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;f=b+16|0;g=((S((c[f>>2]|0)+-1|0,d[e>>0]|0)|0)>>>8)+1|0;h=b+12|0;i=c[h>>2]|0;if((i|0)<0){Oc(b);j=c[h>>2]|0}else j=i;i=b+8|0;k=c[i>>2]|0;l=g<<24;if(k>>>0<l>>>0){m=1;n=g;o=k}else{m=0;n=(c[f>>2]|0)-g|0;o=k-l|0}l=d[16+n>>0]|0;k=n<<l;n=o<<l;o=j-l|0;c[i>>2]=n;c[h>>2]=o;c[f>>2]=k;do if(m){l=e+2|0;j=k;g=o;p=n;q=0;do{r=q<<24>>24;s=((S(d[l+(r>>1)>>0]|0,j+-1|0)|0)>>>8)+1|0;if((g|0)<0){Oc(b);t=c[i>>2]|0;u=c[h>>2]|0}else{t=p;u=g}v=s<<24;if(t>>>0<v>>>0){w=0;x=s;y=t}else{w=1;x=(c[f>>2]|0)-s|0;y=t-v|0}v=d[16+x>>0]|0;j=x<<v;p=y<<v;g=u-v|0;c[i>>2]=p;c[h>>2]=g;c[f>>2]=j;q=a[5251+(w+r)>>0]|0}while(q<<24>>24>0);z=j;A=g;B=p;C=0-(q<<24>>24)|0}else{l=((S(k+-1|0,d[e+9>>0]|0)|0)>>>8)+1|0;if((o|0)<0){Oc(b);D=c[h>>2]|0;E=c[i>>2]|0}else{D=o;E=n}r=l<<24;if(E>>>0<r>>>0){F=0;G=l;H=E}else{F=1;G=(c[f>>2]|0)-l|0;H=E-r|0}r=d[16+G>>0]|0;l=G<<r;v=H<<r;s=D-r|0;c[i>>2]=v;c[h>>2]=s;c[f>>2]=l;r=((S(l+-1|0,d[e+10>>0]|0)|0)>>>8)+1|0;if((s|0)<0){Oc(b);I=c[i>>2]|0;J=c[h>>2]|0}else{I=v;J=s}s=r<<24;if(I>>>0<s>>>0){K=0;L=r;M=I}else{K=2;L=(c[f>>2]|0)-r|0;M=I-s|0}s=d[16+L>>0]|0;r=L<<s;v=M<<s;l=J-s|0;c[i>>2]=v;c[h>>2]=l;c[f>>2]=r;s=((S(r+-1|0,d[e+11>>0]|0)|0)>>>8)+1|0;if((l|0)<0){Oc(b);N=c[i>>2]|0;O=c[h>>2]|0}else{N=v;O=l}l=s<<24;if(N>>>0<l>>>0){P=0;Q=s;R=N}else{P=4;Q=(c[f>>2]|0)-s|0;R=N-l|0}l=d[16+Q>>0]|0;s=Q<<l;v=R<<l;r=O-l|0;c[i>>2]=v;c[h>>2]=r;c[f>>2]=s;l=s;s=r;r=v;v=9;T=P|(K|F);do{U=((S(l+-1|0,d[e+(v+9)>>0]|0)|0)>>>8)+1|0;if((s|0)<0){Oc(b);V=c[i>>2]|0;W=c[h>>2]|0}else{V=r;W=s}X=U<<24;if(V>>>0<X>>>0){Y=0;Z=U;_=V}else{Y=1;Z=(c[f>>2]|0)-U|0;_=V-X|0}X=d[16+Z>>0]|0;l=Z<<X;r=_<<X;s=W-X|0;c[i>>2]=r;c[h>>2]=s;c[f>>2]=l;T=(Y<<v)+T|0;v=v+-1|0}while((v|0)>3);if(T&65520){v=((S(d[e+12>>0]|0,l+-1|0)|0)>>>8)+1|0;if((s|0)<0){Oc(b);$=c[i>>2]|0;aa=c[h>>2]|0}else{$=r;aa=s}q=v<<24;if($>>>0<q>>>0){ba=1;ca=v;da=$}else{ba=0;ca=(c[f>>2]|0)-v|0;da=$-q|0}q=d[16+ca>>0]|0;v=ca<<q;p=da<<q;g=aa-q|0;c[i>>2]=p;c[h>>2]=g;c[f>>2]=v;if(ba){z=v;A=g;B=p;C=T;break}else{ea=p;fa=g;ga=v}}else{ea=r;fa=s;ga=l}z=ga;A=fa;B=ea;C=T+8|0}while(0);if(!C)return 0;ea=((S(z+-1|0,d[e+1>>0]|0)|0)>>>8)+1|0;if((A|0)<0){Oc(b);ha=c[i>>2]|0;ia=c[h>>2]|0}else{ha=B;ia=A}A=ea<<24;if(ha>>>0<A>>>0){ja=1;ka=ea;la=ha;ma=16+ka|0;na=a[ma>>0]|0;oa=na&255;pa=ka<<oa;qa=la<<oa;ra=ia-oa|0;c[i>>2]=qa;c[h>>2]=ra;c[f>>2]=pa;sa=0-C|0;ta=ja?C:sa;return ta|0}ja=0;ka=(c[f>>2]|0)-ea|0;la=ha-A|0;ma=16+ka|0;na=a[ma>>0]|0;oa=na&255;pa=ka<<oa;qa=la<<oa;ra=ia-oa|0;c[i>>2]=qa;c[h>>2]=ra;c[f>>2]=pa;sa=0-C|0;ta=ja?C:sa;return ta|0}function Rc(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+5748|0;e=a+5752|0;f=a+5760|0;g=a+5756|0;h=a+5764|0;i=0;do{b[a+3504+(i<<2)>>1]=kc(i,c[d>>2]|0)|0;b[a+4016+(i<<2)>>1]=lc(i,c[e>>2]|0)|0;b[a+4528+(i<<2)>>1]=mc(i,c[f>>2]|0)|0;b[a+3504+(i<<2)+2>>1]=nc(i)|0;b[a+4016+(i<<2)+2>>1]=oc(i,c[g>>2]|0)|0;b[a+4528+(i<<2)+2>>1]=pc(i,c[h>>2]|0)|0;i=i+1|0}while((i|0)!=128);return}function Sc(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,vb=0,wb=0,Bb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Ob=0,Sb=0,Tb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,sc=0,vc=0,wc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Qc=0,Sc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,ke=0,le=0,me=0,ne=0,pe=0,qe=0,re=0,se=0,te=0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0,Ee=0,Fe=0,Ge=0,He=0,Ie=0,Je=0,Ke=0,Le=0,Me=0,Ne=0,Oe=0,Pe=0,Qe=0,Re=0,Se=0,Te=0,Ue=0,Ve=0,We=0,Xe=0,Ye=0,Ze=0,_e=0,$e=0,af=0,bf=0,cf=0,df=0,ef=0,ff=0,gf=0,hf=0,jf=0,kf=0,lf=0,mf=0,nf=0,of=0,pf=0,qf=0,rf=0,sf=0,tf=0,uf=0,vf=0,wf=0,xf=0,yf=0,zf=0,Af=0,Bf=0,Cf=0,Df=0,Ef=0,Ff=0,Gf=0,Hf=0,If=0,Jf=0,Kf=0,Lf=0,Mf=0,Nf=0,Of=0,Pf=0,Qf=0,Rf=0,Sf=0,Tf=0,Uf=0,Vf=0,Wf=0,Xf=0,Yf=0,Zf=0,_f=0,$f=0,ag=0,bg=0,cg=0,dg=0,eg=0,fg=0,gg=0,hg=0,ig=0,jg=0,kg=0,lg=0,mg=0,ng=0,og=0,pg=0,qg=0,rg=0,sg=0,tg=0,ug=0,vg=0,wg=0,xg=0,yg=0,zg=0,Ag=0,Bg=0,Cg=0,Dg=0,Eg=0,Fg=0,Gg=0,Hg=0,Ig=0,Jg=0,Kg=0,Lg=0,Mg=0,Ng=0,Og=0,Pg=0,Qg=0,Rg=0,Sg=0,Tg=0,Ug=0,Vg=0,Wg=0,Xg=0,Yg=0,Zg=0,_g=0,$g=0,ah=0,bh=0,ch=0,dh=0,eh=0,fh=0,gh=0,hh=0,ih=0,jh=0,kh=0,lh=0,mh=0,nh=0,oh=0,ph=0,qh=0,rh=0,sh=0,th=0,uh=0,vh=0,wh=0,xh=0,yh=0,zh=0,Ah=0,Bh=0,Ch=0,Dh=0,Eh=0,Fh=0,Gh=0,Hh=0,Ih=0,Jh=0,Kh=0,Lh=0,Mh=0,Nh=0,Oh=0,Ph=0,Qh=0,Rh=0,Sh=0,Th=0,Uh=0,Vh=0,Wh=0,Xh=0,Yh=0,Zh=0,_h=0,$h=0,ai=0,bi=0,ci=0,di=0,ei=0,fi=0,gi=0,hi=0,ii=0;f=l;l=l+144|0;g=f+72|0;h=f+64|0;i=f+56|0;j=f+48|0;k=f+40|0;m=f+32|0;n=f+24|0;o=f+16|0;p=f+8|0;q=f;r=f+96|0;s=f+80|0;t=e+11680|0;u=e+3248|0;v=e+11740|0;w=c[v>>2]|0;x=e+11776|0;y=c[x>>2]|0;z=e+11844|0;A=c[z>>2]|0;B=e+3232|0;C=c[B>>2]|0;D=e+3220|0;c[D>>2]=0;E=C+112|0;c[E>>2]=0;F=w+y|0;if((y|0)<3){if(!(c[e+11836>>2]|0))Ma(u,7,5619,q);c[e+5700>>2]=1;c[e+11432>>2]=0;c[e+5704>>2]=1;G=w;H=0}else{q=c[e+11852>>2]|0;if(!q)I=w;else{Aa[q&31](c[e+11856>>2]|0,w,r,y>>>0<10?y:10);I=r}q=e+5700|0;c[q>>2]=a[I>>0]&1;c[e+11432>>2]=(d[I>>0]|0)>>>1&7;c[e+5704>>2]=(d[I>>0]|0)>>>4&1;J=(d[I+1>>0]<<8|d[I>>0]|d[I+2>>0]<<16)>>>5;K=e+11836|0;if((c[K>>2]|0)==0&(J|0)>(y|0))Ma(u,7,5636,p);p=I+3|0;ub(u);if(!(c[q>>2]|0)){q=c[K>>2]|0;do if((y|0)>6|(q|0)==0){if(((a[p>>0]|0)==-99?(a[I+4>>0]|0)==1:0)?(a[I+5>>0]|0)==42:0){L=q;break}Ma(u,5,5683,o);L=c[K>>2]|0}else L=q;while(0);if((y|0)>9|(L|0)==0){L=I+7|0;c[e+5040>>2]=d[L>>0]<<8&16128|d[I+6>>0];c[e+5048>>2]=(d[L>>0]|0)>>>6;L=I+9|0;c[e+5044>>2]=d[L>>0]<<8&16128|d[I+8>>0];c[e+5052>>2]=(d[L>>0]|0)>>>6}M=w+10|0}else{L=w+3|0;N=e+2848|0;O=C;P=N+120|0;do{c[N>>2]=c[O>>2];N=N+4|0;O=O+4|0}while((N|0)<(P|0));N=e+2968|0;O=C;P=N+120|0;do{c[N>>2]=c[O>>2];N=N+4|0;O=O+4|0}while((N|0)<(P|0));M=L}G=M;H=J}J=e+11840|0;M=e+5700|0;L=c[M>>2]|0;C=(L|0)==0;if(!(c[J>>2]|0))if(C)Q=23;else{R=-1;l=f;return R|0}else if(!C){C=(c[e+5736>>2]|0)==0;c[e+3200>>2]=C?1:2;c[e+3204>>2]=C?3:4;c[e+3208>>2]=C?5:6;c[e+3212>>2]=C?7:8;if((c[e+11832>>2]|0)!=0?(C=e+11836|0,(c[C>>2]|0)==0):0){c[C>>2]=1;T=L}else T=L}else Q=23;if((Q|0)==23){N=e+11389|0;O=5306;P=N+38|0;do{a[N>>0]=a[O>>0]|0;N=N+1|0;O=O+1|0}while((N|0)<(P|0));Ab(u);zb(u);O=e+3155|0;L=O;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;L=O+4|0;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;a[e+3151>>0]=0;L=e+3169|0;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;L=e+3177|0;a[L>>0]=0;a[L+1>>0]=0;a[L+2>>0]=0;a[L+3>>0]=0;c[e+9152>>2]=1;c[e+9156>>2]=1;c[e+9160>>2]=0;c[e+9164>>2]=0;c[e+9180>>2]=0;c[e+9184>>2]=0;T=c[M>>2]|0}L=e+3144|0;c[L>>2]=e+9192;O=c[e+5772>>2]|0;C=e+3088|0;c[C>>2]=O;c[e+3096>>2]=T;a[O>>0]=0;c[e+3092>>2]=c[e+5724>>2];c[D>>2]=0;c[e+2844>>2]=(c[e+5740>>2]|0)==0?-1:-8;O=e+11852|0;T=e+11856|0;if(Nc(t,G,F-G|0,c[O>>2]|0,c[T>>2]|0)|0)Ma(u,2,5707,n);n=e+11696|0;F=c[n>>2]|0;if(!(c[M>>2]|0)){w=(((F<<7)+-128|0)>>>8)+1|0;I=e+11692|0;y=c[I>>2]|0;if((y|0)<0){Oc(t);U=c[I>>2]|0}else U=y;y=e+11688|0;q=c[y>>2]|0;K=w<<24;if(q>>>0<K>>>0){V=w;W=q}else{V=(c[n>>2]|0)-w|0;W=q-K|0}K=d[16+V>>0]|0;q=V<<K;V=W<<K;W=U-K|0;c[y>>2]=V;c[I>>2]=W;c[n>>2]=q;K=(((q<<7)+-128|0)>>>8)+1|0;if((W|0)<0){Oc(t);X=c[y>>2]|0;Y=c[I>>2]|0}else{X=V;Y=W}W=K<<24;if(X>>>0<W>>>0){Z=0;_=K;$=X}else{Z=1;_=(c[n>>2]|0)-K|0;$=X-W|0}W=d[16+_>>0]|0;X=_<<W;_=Y-W|0;c[y>>2]=$<<W;c[I>>2]=_;c[n>>2]=X;c[e+5056>>2]=Z;aa=X;ba=_;ca=I}else{I=e+11692|0;aa=F;ba=c[I>>2]|0;ca=I}I=(((aa<<7)+-128|0)>>>8)+1|0;if((ba|0)<0){Oc(t);da=c[ca>>2]|0}else da=ba;ba=e+11688|0;aa=c[ba>>2]|0;F=I<<24;if(aa>>>0<F>>>0){ea=0;fa=I;ga=aa}else{ea=1;fa=(c[n>>2]|0)-I|0;ga=aa-F|0}F=d[16+fa>>0]|0;aa=fa<<F;fa=ga<<F;ga=da-F|0;c[ba>>2]=fa;c[ca>>2]=ga;c[n>>2]=aa;F=e+3148|0;a[F>>0]=ea;if(ea<<24>>24){ea=(((aa<<7)+-128|0)>>>8)+1|0;if((ga|0)<0){Oc(t);ha=c[ba>>2]|0;ia=c[ca>>2]|0}else{ha=fa;ia=ga}ga=ea<<24;if(ha>>>0<ga>>>0){ja=0;ka=ea;la=ha}else{ja=1;ka=(c[n>>2]|0)-ea|0;la=ha-ga|0}ga=d[16+ka>>0]|0;ha=ka<<ga;ka=la<<ga;la=ia-ga|0;c[ba>>2]=ka;c[ca>>2]=la;c[n>>2]=ha;ga=e+3149|0;a[ga>>0]=ja;ja=(((ha<<7)+-128|0)>>>8)+1|0;if((la|0)<0){Oc(t);ma=c[ba>>2]|0;na=c[ca>>2]|0}else{ma=ka;na=la}la=ja<<24;if(ma>>>0<la>>>0){oa=0;pa=ja;qa=ma}else{oa=1;pa=(c[n>>2]|0)-ja|0;qa=ma-la|0}la=d[16+pa>>0]|0;ma=pa<<la;pa=qa<<la;qa=na-la|0;c[ba>>2]=pa;c[ca>>2]=qa;c[n>>2]=ma;a[e+3150>>0]=oa;if(oa<<24>>24){oa=(((ma<<7)+-128|0)>>>8)+1|0;if((qa|0)<0){Oc(t);ra=c[ba>>2]|0;sa=c[ca>>2]|0}else{ra=pa;sa=qa}qa=oa<<24;if(ra>>>0<qa>>>0){ta=0;ua=oa;va=ra}else{ta=1;ua=(c[n>>2]|0)-oa|0;va=ra-qa|0}qa=d[16+ua>>0]|0;c[ba>>2]=va<<qa;c[ca>>2]=sa-qa;c[n>>2]=ua<<qa;a[e+3151>>0]=ta;ta=e+3155|0;qa=ta;a[qa>>0]=0;a[qa+1>>0]=0;a[qa+2>>0]=0;a[qa+3>>0]=0;qa=ta+4|0;a[qa>>0]=0;a[qa+1>>0]=0;a[qa+2>>0]=0;a[qa+3>>0]=0;qa=0;do{ta=400+(qa<<2)|0;ua=0;do{sa=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;va=c[ca>>2]|0;if((va|0)<0){Oc(t);wa=c[ca>>2]|0}else wa=va;va=c[ba>>2]|0;ra=sa<<24;if(va>>>0<ra>>>0){xa=1;ya=sa;za=va}else{xa=0;ya=(c[n>>2]|0)-sa|0;za=va-ra|0}ra=d[16+ya>>0]|0;va=ya<<ra;sa=za<<ra;oa=wa-ra|0;c[ba>>2]=sa;c[ca>>2]=oa;c[n>>2]=va;do if(xa){Ba=e+3155+(qa<<2)+ua|0;Ca=0;Q=78}else{ra=c[ta>>2]|0;if((ra|0)>0){pa=sa;ma=va;la=oa;na=ra;ra=0;while(1){ja=na;na=na+-1|0;ka=(((ma<<7)+-128|0)>>>8)+1|0;if((la|0)<0){Oc(t);Da=c[ba>>2]|0;Ea=c[ca>>2]|0}else{Da=pa;Ea=la}ha=ka<<24;if(Da>>>0<ha>>>0){Fa=0;Ga=ka;Ha=Da}else{Fa=1;Ga=(c[n>>2]|0)-ka|0;Ha=Da-ha|0}ha=d[16+Ga>>0]|0;ma=Ga<<ha;pa=Ha<<ha;la=Ea-ha|0;c[ba>>2]=pa;c[ca>>2]=la;c[n>>2]=ma;ha=Fa<<na|ra;if((ja|0)<=1){Ia=ha;break}else ra=ha}}else Ia=0;ra=e+3155+(qa<<2)+ua|0;a[ra>>0]=Ia;na=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;ma=c[ca>>2]|0;if((ma|0)<0){Oc(t);Ja=c[ca>>2]|0}else Ja=ma;ma=c[ba>>2]|0;la=na<<24;if(ma>>>0<la>>>0){Ka=1;La=na;Na=ma}else{Ka=0;La=(c[n>>2]|0)-na|0;Na=ma-la|0}la=d[16+La>>0]|0;c[ba>>2]=Na<<la;c[ca>>2]=Ja-la;c[n>>2]=La<<la;if(Ka)break;Ba=ra;Ca=0-(d[ra>>0]|0)&255;Q=78}while(0);if((Q|0)==78){Q=0;a[Ba>>0]=Ca}ua=ua+1|0}while((ua|0)!=4);qa=qa+1|0}while((qa|0)!=2)}if(a[ga>>0]|0){ga=e+3152|0;b[ga>>1]=65535;a[ga+2>>0]=255;ga=0;do{qa=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;Ca=c[ca>>2]|0;if((Ca|0)<0){Oc(t);Oa=c[ca>>2]|0}else Oa=Ca;Ca=c[ba>>2]|0;Ba=qa<<24;if(Ca>>>0<Ba>>>0){Pa=1;Qa=qa;Ra=Ca}else{Pa=0;Qa=(c[n>>2]|0)-qa|0;Ra=Ca-Ba|0}Ba=d[16+Qa>>0]|0;Ca=Qa<<Ba;qa=Ra<<Ba;Ka=Oa-Ba|0;c[ba>>2]=qa;c[ca>>2]=Ka;c[n>>2]=Ca;if(!Pa){Ba=Ca;Ca=Ka;Ka=qa;qa=8;La=0;do{Ja=qa;qa=qa+-1|0;Na=(((Ba<<7)+-128|0)>>>8)+1|0;if((Ca|0)<0){Oc(t);Sa=c[ba>>2]|0;Ta=c[ca>>2]|0}else{Sa=Ka;Ta=Ca}Ia=Na<<24;if(Sa>>>0<Ia>>>0){Ua=0;Va=Na;Wa=Sa}else{Ua=1;Va=(c[n>>2]|0)-Na|0;Wa=Sa-Ia|0}Ia=d[16+Va>>0]|0;Ba=Va<<Ia;Ka=Wa<<Ia;Ca=Ta-Ia|0;c[ba>>2]=Ka;c[ca>>2]=Ca;c[n>>2]=Ba;La=Ua<<qa|La}while((Ja|0)>1);a[e+3152+ga>>0]=La}ga=ga+1|0}while((ga|0)!=3)}}else{a[e+3149>>0]=0;a[e+3150>>0]=0}ga=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;Ua=c[ca>>2]|0;if((Ua|0)<0){Oc(t);Xa=c[ca>>2]|0}else Xa=Ua;Ua=c[ba>>2]|0;Ta=ga<<24;if(Ua>>>0<Ta>>>0){Ya=0;Za=ga;_a=Ua}else{Ya=1;Za=(c[n>>2]|0)-ga|0;_a=Ua-Ta|0}Ta=d[16+Za>>0]|0;Ua=Za<<Ta;Za=_a<<Ta;_a=Xa-Ta|0;c[ba>>2]=Za;c[ca>>2]=_a;c[n>>2]=Ua;Ta=e+5780|0;c[Ta>>2]=Ya;Ya=Ua;Ua=_a;_a=Za;Za=6;Xa=0;do{ga=Za;Za=Za+-1|0;Wa=(((Ya<<7)+-128|0)>>>8)+1|0;if((Ua|0)<0){Oc(t);$a=c[ba>>2]|0;ab=c[ca>>2]|0}else{$a=_a;ab=Ua}Va=Wa<<24;if($a>>>0<Va>>>0){bb=0;cb=Wa;db=$a}else{bb=1;cb=(c[n>>2]|0)-Wa|0;db=$a-Va|0}Va=d[16+cb>>0]|0;Ya=cb<<Va;_a=db<<Va;Ua=ab-Va|0;c[ba>>2]=_a;c[ca>>2]=Ua;c[n>>2]=Ya;Xa=bb<<Za|Xa}while((ga|0)>1);Za=e+9136|0;c[Za>>2]=Xa;Xa=(((Ya<<7)+-128|0)>>>8)+1|0;if((Ua|0)<0){Oc(t);eb=c[ba>>2]|0;fb=c[ca>>2]|0}else{eb=_a;fb=Ua}Ua=Xa<<24;if(eb>>>0<Ua>>>0){gb=0;hb=Xa;ib=eb}else{gb=4;hb=(c[n>>2]|0)-Xa|0;ib=eb-Ua|0}Ua=d[16+hb>>0]|0;eb=hb<<Ua;hb=ib<<Ua;ib=fb-Ua|0;c[ba>>2]=hb;c[ca>>2]=ib;c[n>>2]=eb;Ua=(((eb<<7)+-128|0)>>>8)+1|0;if((ib|0)<0){Oc(t);jb=c[ba>>2]|0;kb=c[ca>>2]|0}else{jb=hb;kb=ib}ib=Ua<<24;if(jb>>>0<ib>>>0){lb=0;mb=Ua;nb=jb}else{lb=2;mb=(c[n>>2]|0)-Ua|0;nb=jb-ib|0}ib=d[16+mb>>0]|0;jb=mb<<ib;mb=nb<<ib;nb=kb-ib|0;c[ba>>2]=mb;c[ca>>2]=nb;c[n>>2]=jb;ib=(((jb<<7)+-128|0)>>>8)+1|0;if((nb|0)<0){Oc(t);ob=c[ba>>2]|0;pb=c[ca>>2]|0}else{ob=mb;pb=nb}nb=ib<<24;if(ob>>>0<nb>>>0){qb=0;rb=ib;sb=ob}else{qb=1;rb=(c[n>>2]|0)-ib|0;sb=ob-nb|0}nb=d[16+rb>>0]|0;ob=rb<<nb;rb=sb<<nb;sb=pb-nb|0;c[ba>>2]=rb;c[ca>>2]=sb;c[n>>2]=ob;c[e+9144>>2]=qb|(lb|gb);gb=e+3164|0;a[gb>>0]=0;lb=(((ob<<7)+-128|0)>>>8)+1|0;if((sb|0)<0){Oc(t);tb=c[ba>>2]|0;vb=c[ca>>2]|0}else{tb=rb;vb=sb}sb=lb<<24;if(tb>>>0<sb>>>0){wb=0;Bb=lb;Db=tb}else{wb=1;Bb=(c[n>>2]|0)-lb|0;Db=tb-sb|0}sb=d[16+Bb>>0]|0;tb=Bb<<sb;Bb=Db<<sb;Db=vb-sb|0;c[ba>>2]=Bb;c[ca>>2]=Db;c[n>>2]=tb;a[e+3163>>0]=wb;do if(!(wb<<24>>24)){Eb=tb;Fb=Db}else{sb=(((tb<<7)+-128|0)>>>8)+1|0;if((Db|0)<0){Oc(t);Gb=c[ba>>2]|0;Hb=c[ca>>2]|0}else{Gb=Bb;Hb=Db}vb=sb<<24;if(Gb>>>0<vb>>>0){Ib=0;Jb=sb;Kb=Gb}else{Ib=1;Jb=(c[n>>2]|0)-sb|0;Kb=Gb-vb|0}vb=d[16+Jb>>0]|0;sb=Jb<<vb;lb=Hb-vb|0;c[ba>>2]=Kb<<vb;c[ca>>2]=lb;c[n>>2]=sb;a[gb>>0]=Ib;if(!(Ib<<24>>24)){Eb=sb;Fb=lb;break}else{Lb=sb;Ob=lb;Sb=0}while(1){lb=(((Lb<<7)+-128|0)>>>8)+1|0;if((Ob|0)<0){Oc(t);Tb=c[ca>>2]|0}else Tb=Ob;sb=c[ba>>2]|0;vb=lb<<24;if(sb>>>0<vb>>>0){Xb=1;Yb=lb;Zb=sb}else{Xb=0;Yb=(c[n>>2]|0)-lb|0;Zb=sb-vb|0}vb=d[16+Yb>>0]|0;sb=Yb<<vb;lb=Zb<<vb;rb=Tb-vb|0;c[ba>>2]=lb;c[ca>>2]=rb;c[n>>2]=sb;do if(!Xb){vb=sb;ob=rb;qb=lb;nb=6;pb=0;do{ib=nb;nb=nb+-1|0;mb=(((vb<<7)+-128|0)>>>8)+1|0;if((ob|0)<0){Oc(t);_b=c[ba>>2]|0;$b=c[ca>>2]|0}else{_b=qb;$b=ob}jb=mb<<24;if(_b>>>0<jb>>>0){ac=0;bc=mb;cc=_b}else{ac=1;bc=(c[n>>2]|0)-mb|0;cc=_b-jb|0}jb=d[16+bc>>0]|0;vb=bc<<jb;qb=cc<<jb;ob=$b-jb|0;c[ba>>2]=qb;c[ca>>2]=ob;c[n>>2]=vb;pb=ac<<nb|pb}while((ib|0)>1);nb=e+3169+Sb|0;a[nb>>0]=pb;vb=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;ob=c[ca>>2]|0;if((ob|0)<0){Oc(t);dc=c[ca>>2]|0}else dc=ob;ob=c[ba>>2]|0;qb=vb<<24;if(ob>>>0<qb>>>0){ec=1;fc=vb;gc=ob}else{ec=0;fc=(c[n>>2]|0)-vb|0;gc=ob-qb|0}qb=d[16+fc>>0]|0;c[ba>>2]=gc<<qb;c[ca>>2]=dc-qb;c[n>>2]=fc<<qb;if(ec)break;a[nb>>0]=0-(d[nb>>0]|0)}while(0);lb=Sb+1|0;if((lb|0)==4){hc=0;break}Lb=c[n>>2]|0;Ob=c[ca>>2]|0;Sb=lb}do{La=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;lb=c[ca>>2]|0;if((lb|0)<0){Oc(t);ic=c[ca>>2]|0}else ic=lb;lb=c[ba>>2]|0;rb=La<<24;if(lb>>>0<rb>>>0){jc=1;kc=La;lc=lb}else{jc=0;kc=(c[n>>2]|0)-La|0;lc=lb-rb|0}rb=d[16+kc>>0]|0;lb=kc<<rb;La=lc<<rb;sb=ic-rb|0;c[ba>>2]=La;c[ca>>2]=sb;c[n>>2]=lb;do if(!jc){rb=lb;nb=sb;qb=La;ob=6;vb=0;do{ib=ob;ob=ob+-1|0;jb=(((rb<<7)+-128|0)>>>8)+1|0;if((nb|0)<0){Oc(t);mc=c[ba>>2]|0;nc=c[ca>>2]|0}else{mc=qb;nc=nb}mb=jb<<24;if(mc>>>0<mb>>>0){oc=0;pc=jb;qc=mc}else{oc=1;pc=(c[n>>2]|0)-jb|0;qc=mc-mb|0}mb=d[16+pc>>0]|0;rb=pc<<mb;qb=qc<<mb;nb=nc-mb|0;c[ba>>2]=qb;c[ca>>2]=nb;c[n>>2]=rb;vb=oc<<ob|vb}while((ib|0)>1);ob=e+3177+hc|0;a[ob>>0]=vb;rb=(((c[n>>2]<<7)+-128|0)>>>8)+1|0;nb=c[ca>>2]|0;if((nb|0)<0){Oc(t);sc=c[ca>>2]|0}else sc=nb;nb=c[ba>>2]|0;qb=rb<<24;if(nb>>>0<qb>>>0){vc=1;wc=rb;zc=nb}else{vc=0;wc=(c[n>>2]|0)-rb|0;zc=nb-qb|0}qb=d[16+wc>>0]|0;c[ba>>2]=zc<<qb;c[ca>>2]=sc-qb;c[n>>2]=wc<<qb;if(vc)break;a[ob>>0]=0-(d[ob>>0]|0)}while(0);hc=hc+1|0}while((hc|0)!=4);Eb=c[n>>2]|0;Fb=c[ca>>2]|0}while(0);hc=G+H|0;H=c[v>>2]|0;G=c[x>>2]|0;vc=(((Eb<<7)+-128|0)>>>8)+1|0;if((Fb|0)<0){Oc(t);Ac=c[ca>>2]|0}else Ac=Fb;Fb=c[ba>>2]|0;Eb=vc<<24;if(Fb>>>0<Eb>>>0){Bc=0;Cc=vc;Dc=Fb}else{Bc=2;Cc=(c[n>>2]|0)-vc|0;Dc=Fb-Eb|0}Eb=d[16+Cc>>0]|0;Fb=Cc<<Eb;Cc=Dc<<Eb;Dc=Ac-Eb|0;c[ba>>2]=Cc;c[ca>>2]=Dc;c[n>>2]=Fb;Eb=(((Fb<<7)+-128|0)>>>8)+1|0;if((Dc|0)<0){Oc(t);Ec=c[ba>>2]|0;Fc=c[ca>>2]|0}else{Ec=Cc;Fc=Dc}Dc=Eb<<24;if(Ec>>>0<Dc>>>0){Gc=0;Hc=Eb;Ic=Ec}else{Gc=1;Hc=(c[n>>2]|0)-Eb|0;Ic=Ec-Dc|0}Dc=d[16+Hc>>0]|0;Ec=Fc-Dc|0;c[ba>>2]=Ic<<Dc;c[ca>>2]=Ec;c[n>>2]=Hc<<Dc;Dc=Gc|Bc;Bc=e+11456|0;Gc=H+G|0;G=e+11436|0;if((Ec+-33|0)>>>0<1073741791)Jc=c[G>>2]|0;else{c[G>>2]=Dc;Jc=Dc}Dc=1<<Jc;Ec=e+11736|0;if(c[Ec>>2]|0){H=hc;Hc=(3<<Jc)+-3|0;Jc=Dc+-1|0;Ic=e+11836|0;Fc=e+3248|0;Eb=e+11744|0;Cc=0;do{Fb=c[e+11776+(Cc<<2)>>2]|0;Ac=(c[e+11740+(Cc<<2)>>2]|0)+Fb|0;do if(!Cc){vc=c[v>>2]|0;wc=Hc+(H-vc)|0;sc=Fb-wc|0;if(!sc){Kc=0;Lc=0;break}c[x>>2]=wc;c[Eb>>2]=vc+wc;Kc=1;Lc=sc}else{Kc=Cc;Lc=Fb}while(0);Fb=Ac;sc=Kc;wc=Lc;a:while(1){vc=e+11740+(sc<<2)|0;zc=sc+-1|0;oc=hc+(zc*3|0)|0;nc=e+11776+(sc<<2)|0;b:do if((Jc|0)>(zc|0)){if((oc+3|0)>>>0>Gc>>>0){qc=wc;while(1){if(!qc)break a;pc=Fb-(c[vc>>2]|0)|0;do if(!(c[Ic>>2]|0)){Ma(Fc,7,5741,m);if(c[Ic>>2]|0){Mc=pc;break}c[k>>2]=sc;Ma(Fc,7,5771,k);Mc=0}else Mc=pc;while(0);c[nc>>2]=Mc;pc=qc-Mc|0;if(!pc)qc=0;else{Qc=Mc;Sc=pc;break b}}}else Wc=wc;while(1){if(!Wc)break a;qc=c[vc>>2]|0;vb=Fb-qc|0;pc=c[O>>2]|0;if(!pc)Xc=oc;else{Aa[pc&31](c[T>>2]|0,oc,r,3);Xc=r}pc=d[Xc+1>>0]<<8|d[Xc>>0]|d[Xc+2>>0]<<16;do if((pc|0)!=0&(qc+pc|0)>>>0<=Ac>>>0)Yc=pc;else{if(c[Ic>>2]|0){Yc=vb;break}c[j>>2]=sc;Ma(Fc,7,5771,j);Yc=pc}while(0);c[nc>>2]=Yc;pc=Wc-Yc|0;if(!pc)Wc=0;else{Qc=Yc;Sc=pc;break}}}else{pc=wc;while(1){if(!pc)break a;vb=Fb-(c[vc>>2]|0)|0;do if((vb|0)<=0){if(c[Ic>>2]|0)break;c[i>>2]=sc;Ma(Fc,7,5771,i)}while(0);c[nc>>2]=vb;qc=pc-vb|0;if(!qc)pc=0;else{Qc=vb;Sc=qc;break}}}while(0);nc=sc+1|0;c[e+11740+(nc<<2)>>2]=(c[vc>>2]|0)+Qc;sc=nc;wc=Sc}Cc=sc+1|0}while(Cc>>>0<(c[Ec>>2]|0)>>>0)}Cc=Dc+1|0;c[Ec>>2]=Cc;if(Cc>>>0>1){Cc=e+3248|0;Dc=Bc;Sc=1;while(1){if(Nc(Dc,c[e+11740+(Sc<<2)>>2]|0,c[e+11776+(Sc<<2)>>2]|0,c[O>>2]|0,c[T>>2]|0)|0){c[h>>2]=Sc;Ma(Cc,2,5819,h)}Sc=Sc+1|0;if(Sc>>>0>=(c[Ec>>2]|0)>>>0)break;else Dc=Dc+28|0}}Dc=e+3216|0;c[Dc>>2]=Bc;Bc=c[n>>2]|0;Ec=c[ca>>2]|0;Sc=7;h=0;do{Cc=Sc;Sc=Sc+-1|0;T=(((Bc<<7)+-128|0)>>>8)+1|0;if((Ec|0)<0){Oc(t);Zc=c[ca>>2]|0}else Zc=Ec;O=c[ba>>2]|0;Qc=T<<24;if(O>>>0<Qc>>>0){_c=0;$c=T;ad=O}else{_c=1;$c=(c[n>>2]|0)-T|0;ad=O-Qc|0}Qc=d[16+$c>>0]|0;Bc=$c<<Qc;bd=ad<<Qc;Ec=Zc-Qc|0;c[ba>>2]=bd;c[ca>>2]=Ec;c[n>>2]=Bc;h=_c<<Sc|h}while((Cc|0)>1);Sc=e+5744|0;c[Sc>>2]=h;h=e+5748|0;_c=c[h>>2]|0;Zc=(((Bc<<7)+-128|0)>>>8)+1|0;if((Ec|0)<0){Oc(t);cd=c[ba>>2]|0;dd=c[ca>>2]|0}else{cd=bd;dd=Ec}Ec=Zc<<24;if(cd>>>0<Ec>>>0){ed=1;fd=Zc;gd=cd}else{ed=0;fd=(c[n>>2]|0)-Zc|0;gd=cd-Ec|0}Ec=d[16+fd>>0]|0;cd=fd<<Ec;fd=gd<<Ec;gd=dd-Ec|0;c[ba>>2]=fd;c[ca>>2]=gd;c[n>>2]=cd;if(ed){hd=cd;id=gd;jd=fd;kd=0}else{ed=(((cd<<7)+-128|0)>>>8)+1|0;if((gd|0)<0){Oc(t);ld=c[ba>>2]|0;md=c[ca>>2]|0}else{ld=fd;md=gd}gd=ed<<24;if(ld>>>0<gd>>>0){nd=0;od=ed;pd=ld}else{nd=8;od=(c[n>>2]|0)-ed|0;pd=ld-gd|0}gd=d[16+od>>0]|0;ld=od<<gd;od=pd<<gd;pd=md-gd|0;c[ba>>2]=od;c[ca>>2]=pd;c[n>>2]=ld;gd=(((ld<<7)+-128|0)>>>8)+1|0;if((pd|0)<0){Oc(t);qd=c[ba>>2]|0;rd=c[ca>>2]|0}else{qd=od;rd=pd}pd=gd<<24;if(qd>>>0<pd>>>0){sd=0;td=gd;ud=qd}else{sd=4;td=(c[n>>2]|0)-gd|0;ud=qd-pd|0}pd=d[16+td>>0]|0;qd=td<<pd;td=ud<<pd;ud=rd-pd|0;c[ba>>2]=td;c[ca>>2]=ud;c[n>>2]=qd;pd=(((qd<<7)+-128|0)>>>8)+1|0;if((ud|0)<0){Oc(t);vd=c[ba>>2]|0;wd=c[ca>>2]|0}else{vd=td;wd=ud}ud=pd<<24;if(vd>>>0<ud>>>0){xd=0;yd=pd;zd=vd}else{xd=2;yd=(c[n>>2]|0)-pd|0;zd=vd-ud|0}ud=d[16+yd>>0]|0;vd=yd<<ud;yd=zd<<ud;zd=wd-ud|0;c[ba>>2]=yd;c[ca>>2]=zd;c[n>>2]=vd;ud=(((vd<<7)+-128|0)>>>8)+1|0;if((zd|0)<0){Oc(t);Ad=c[ba>>2]|0;Bd=c[ca>>2]|0}else{Ad=yd;Bd=zd}zd=ud<<24;if(Ad>>>0<zd>>>0){Cd=0;Dd=ud;Ed=Ad}else{Cd=1;Dd=(c[n>>2]|0)-ud|0;Ed=Ad-zd|0}zd=d[16+Dd>>0]|0;Ad=Dd<<zd;Dd=Ed<<zd;Ed=Bd-zd|0;c[ba>>2]=Dd;c[ca>>2]=Ed;c[n>>2]=Ad;zd=Cd|(xd|(sd|nd));nd=(((Ad<<7)+-128|0)>>>8)+1|0;if((Ed|0)<0){Oc(t);Fd=c[ba>>2]|0;Gd=c[ca>>2]|0}else{Fd=Dd;Gd=Ed}Ed=nd<<24;if(Fd>>>0<Ed>>>0){Hd=1;Id=nd;Jd=Fd}else{Hd=0;Id=(c[n>>2]|0)-nd|0;Jd=Fd-Ed|0}Ed=d[16+Id>>0]|0;Fd=Id<<Ed;Id=Jd<<Ed;Jd=Gd-Ed|0;c[ba>>2]=Id;c[ca>>2]=Jd;c[n>>2]=Fd;hd=Fd;id=Jd;jd=Id;kd=Hd?zd:0-zd|0}zd=(kd|0)!=(_c|0);c[h>>2]=kd;kd=e+5752|0;h=c[kd>>2]|0;_c=(((hd<<7)+-128|0)>>>8)+1|0;if((id|0)<0){Oc(t);Kd=c[ba>>2]|0;Ld=c[ca>>2]|0}else{Kd=jd;Ld=id}id=_c<<24;if(Kd>>>0<id>>>0){Md=1;Nd=_c;Od=Kd}else{Md=0;Nd=(c[n>>2]|0)-_c|0;Od=Kd-id|0}id=d[16+Nd>>0]|0;Kd=Nd<<id;Nd=Od<<id;Od=Ld-id|0;c[ba>>2]=Nd;c[ca>>2]=Od;c[n>>2]=Kd;if(Md){Pd=Kd;Qd=Od;Rd=Nd;Sd=0}else{Md=(((Kd<<7)+-128|0)>>>8)+1|0;if((Od|0)<0){Oc(t);Td=c[ba>>2]|0;Ud=c[ca>>2]|0}else{Td=Nd;Ud=Od}Od=Md<<24;if(Td>>>0<Od>>>0){Vd=0;Wd=Md;Xd=Td}else{Vd=8;Wd=(c[n>>2]|0)-Md|0;Xd=Td-Od|0}Od=d[16+Wd>>0]|0;Td=Wd<<Od;Wd=Xd<<Od;Xd=Ud-Od|0;c[ba>>2]=Wd;c[ca>>2]=Xd;c[n>>2]=Td;Od=(((Td<<7)+-128|0)>>>8)+1|0;if((Xd|0)<0){Oc(t);Yd=c[ba>>2]|0;Zd=c[ca>>2]|0}else{Yd=Wd;Zd=Xd}Xd=Od<<24;if(Yd>>>0<Xd>>>0){_d=0;$d=Od;ae=Yd}else{_d=4;$d=(c[n>>2]|0)-Od|0;ae=Yd-Xd|0}Xd=d[16+$d>>0]|0;Yd=$d<<Xd;$d=ae<<Xd;ae=Zd-Xd|0;c[ba>>2]=$d;c[ca>>2]=ae;c[n>>2]=Yd;Xd=(((Yd<<7)+-128|0)>>>8)+1|0;if((ae|0)<0){Oc(t);be=c[ba>>2]|0;ce=c[ca>>2]|0}else{be=$d;ce=ae}ae=Xd<<24;if(be>>>0<ae>>>0){de=0;ee=Xd;fe=be}else{de=2;ee=(c[n>>2]|0)-Xd|0;fe=be-ae|0}ae=d[16+ee>>0]|0;be=ee<<ae;ee=fe<<ae;fe=ce-ae|0;c[ba>>2]=ee;c[ca>>2]=fe;c[n>>2]=be;ae=(((be<<7)+-128|0)>>>8)+1|0;if((fe|0)<0){Oc(t);ge=c[ba>>2]|0;he=c[ca>>2]|0}else{ge=ee;he=fe}fe=ae<<24;if(ge>>>0<fe>>>0){ie=0;ke=ae;le=ge}else{ie=1;ke=(c[n>>2]|0)-ae|0;le=ge-fe|0}fe=d[16+ke>>0]|0;ge=ke<<fe;ke=le<<fe;le=he-fe|0;c[ba>>2]=ke;c[ca>>2]=le;c[n>>2]=ge;fe=ie|(de|(_d|Vd));Vd=(((ge<<7)+-128|0)>>>8)+1|0;if((le|0)<0){Oc(t);me=c[ba>>2]|0;ne=c[ca>>2]|0}else{me=ke;ne=le}le=Vd<<24;if(me>>>0<le>>>0){pe=1;qe=Vd;re=me}else{pe=0;qe=(c[n>>2]|0)-Vd|0;re=me-le|0}le=d[16+qe>>0]|0;me=qe<<le;qe=re<<le;re=ne-le|0;c[ba>>2]=qe;c[ca>>2]=re;c[n>>2]=me;Pd=me;Qd=re;Rd=qe;Sd=pe?fe:0-fe|0}fe=zd|(Sd|0)!=(h|0);c[kd>>2]=Sd;Sd=e+5756|0;kd=c[Sd>>2]|0;h=(((Pd<<7)+-128|0)>>>8)+1|0;if((Qd|0)<0){Oc(t);se=c[ba>>2]|0;te=c[ca>>2]|0}else{se=Rd;te=Qd}Qd=h<<24;if(se>>>0<Qd>>>0){ue=1;ve=h;we=se}else{ue=0;ve=(c[n>>2]|0)-h|0;we=se-Qd|0}Qd=d[16+ve>>0]|0;se=ve<<Qd;ve=we<<Qd;we=te-Qd|0;c[ba>>2]=ve;c[ca>>2]=we;c[n>>2]=se;if(ue){xe=se;ye=we;ze=ve;Ae=0}else{ue=(((se<<7)+-128|0)>>>8)+1|0;if((we|0)<0){Oc(t);Be=c[ba>>2]|0;Ce=c[ca>>2]|0}else{Be=ve;Ce=we}we=ue<<24;if(Be>>>0<we>>>0){De=0;Ee=ue;Fe=Be}else{De=8;Ee=(c[n>>2]|0)-ue|0;Fe=Be-we|0}we=d[16+Ee>>0]|0;Be=Ee<<we;Ee=Fe<<we;Fe=Ce-we|0;c[ba>>2]=Ee;c[ca>>2]=Fe;c[n>>2]=Be;we=(((Be<<7)+-128|0)>>>8)+1|0;if((Fe|0)<0){Oc(t);Ge=c[ba>>2]|0;He=c[ca>>2]|0}else{Ge=Ee;He=Fe}Fe=we<<24;if(Ge>>>0<Fe>>>0){Ie=0;Je=we;Ke=Ge}else{Ie=4;Je=(c[n>>2]|0)-we|0;Ke=Ge-Fe|0}Fe=d[16+Je>>0]|0;Ge=Je<<Fe;Je=Ke<<Fe;Ke=He-Fe|0;c[ba>>2]=Je;c[ca>>2]=Ke;c[n>>2]=Ge;Fe=(((Ge<<7)+-128|0)>>>8)+1|0;if((Ke|0)<0){Oc(t);Le=c[ba>>2]|0;Me=c[ca>>2]|0}else{Le=Je;Me=Ke}Ke=Fe<<24;if(Le>>>0<Ke>>>0){Ne=0;Oe=Fe;Pe=Le}else{Ne=2;Oe=(c[n>>2]|0)-Fe|0;Pe=Le-Ke|0}Ke=d[16+Oe>>0]|0;Le=Oe<<Ke;Oe=Pe<<Ke;Pe=Me-Ke|0;c[ba>>2]=Oe;c[ca>>2]=Pe;c[n>>2]=Le;Ke=(((Le<<7)+-128|0)>>>8)+1|0;if((Pe|0)<0){Oc(t);Qe=c[ba>>2]|0;Re=c[ca>>2]|0}else{Qe=Oe;Re=Pe}Pe=Ke<<24;if(Qe>>>0<Pe>>>0){Se=0;Te=Ke;Ue=Qe}else{Se=1;Te=(c[n>>2]|0)-Ke|0;Ue=Qe-Pe|0}Pe=d[16+Te>>0]|0;Qe=Te<<Pe;Te=Ue<<Pe;Ue=Re-Pe|0;c[ba>>2]=Te;c[ca>>2]=Ue;c[n>>2]=Qe;Pe=Se|(Ne|(Ie|De));De=(((Qe<<7)+-128|0)>>>8)+1|0;if((Ue|0)<0){Oc(t);Ve=c[ba>>2]|0;We=c[ca>>2]|0}else{Ve=Te;We=Ue}Ue=De<<24;if(Ve>>>0<Ue>>>0){Xe=1;Ye=De;Ze=Ve}else{Xe=0;Ye=(c[n>>2]|0)-De|0;Ze=Ve-Ue|0}Ue=d[16+Ye>>0]|0;Ve=Ye<<Ue;Ye=Ze<<Ue;Ze=We-Ue|0;c[ba>>2]=Ye;c[ca>>2]=Ze;c[n>>2]=Ve;xe=Ve;ye=Ze;ze=Ye;Ae=Xe?Pe:0-Pe|0}Pe=fe|(Ae|0)!=(kd|0);c[Sd>>2]=Ae;Ae=e+5760|0;Sd=c[Ae>>2]|0;kd=(((xe<<7)+-128|0)>>>8)+1|0;if((ye|0)<0){Oc(t);_e=c[ba>>2]|0;$e=c[ca>>2]|0}else{_e=ze;$e=ye}ye=kd<<24;if(_e>>>0<ye>>>0){af=1;bf=kd;cf=_e}else{af=0;bf=(c[n>>2]|0)-kd|0;cf=_e-ye|0}ye=d[16+bf>>0]|0;_e=bf<<ye;bf=cf<<ye;cf=$e-ye|0;c[ba>>2]=bf;c[ca>>2]=cf;c[n>>2]=_e;if(af){df=_e;ef=cf;ff=bf;gf=0}else{af=(((_e<<7)+-128|0)>>>8)+1|0;if((cf|0)<0){Oc(t);hf=c[ba>>2]|0;jf=c[ca>>2]|0}else{hf=bf;jf=cf}cf=af<<24;if(hf>>>0<cf>>>0){kf=0;lf=af;mf=hf}else{kf=8;lf=(c[n>>2]|0)-af|0;mf=hf-cf|0}cf=d[16+lf>>0]|0;hf=lf<<cf;lf=mf<<cf;mf=jf-cf|0;c[ba>>2]=lf;c[ca>>2]=mf;c[n>>2]=hf;cf=(((hf<<7)+-128|0)>>>8)+1|0;if((mf|0)<0){Oc(t);nf=c[ba>>2]|0;of=c[ca>>2]|0}else{nf=lf;of=mf}mf=cf<<24;if(nf>>>0<mf>>>0){pf=0;qf=cf;rf=nf}else{pf=4;qf=(c[n>>2]|0)-cf|0;rf=nf-mf|0}mf=d[16+qf>>0]|0;nf=qf<<mf;qf=rf<<mf;rf=of-mf|0;c[ba>>2]=qf;c[ca>>2]=rf;c[n>>2]=nf;mf=(((nf<<7)+-128|0)>>>8)+1|0;if((rf|0)<0){Oc(t);sf=c[ba>>2]|0;tf=c[ca>>2]|0}else{sf=qf;tf=rf}rf=mf<<24;if(sf>>>0<rf>>>0){uf=0;vf=mf;wf=sf}else{uf=2;vf=(c[n>>2]|0)-mf|0;wf=sf-rf|0}rf=d[16+vf>>0]|0;sf=vf<<rf;vf=wf<<rf;wf=tf-rf|0;c[ba>>2]=vf;c[ca>>2]=wf;c[n>>2]=sf;rf=(((sf<<7)+-128|0)>>>8)+1|0;if((wf|0)<0){Oc(t);xf=c[ba>>2]|0;yf=c[ca>>2]|0}else{xf=vf;yf=wf}wf=rf<<24;if(xf>>>0<wf>>>0){zf=0;Af=rf;Bf=xf}else{zf=1;Af=(c[n>>2]|0)-rf|0;Bf=xf-wf|0}wf=d[16+Af>>0]|0;xf=Af<<wf;Af=Bf<<wf;Bf=yf-wf|0;c[ba>>2]=Af;c[ca>>2]=Bf;c[n>>2]=xf;wf=zf|(uf|(pf|kf));kf=(((xf<<7)+-128|0)>>>8)+1|0;if((Bf|0)<0){Oc(t);Cf=c[ba>>2]|0;Df=c[ca>>2]|0}else{Cf=Af;Df=Bf}Bf=kf<<24;if(Cf>>>0<Bf>>>0){Ef=1;Ff=kf;Gf=Cf}else{Ef=0;Ff=(c[n>>2]|0)-kf|0;Gf=Cf-Bf|0}Bf=d[16+Ff>>0]|0;Cf=Ff<<Bf;Ff=Gf<<Bf;Gf=Df-Bf|0;c[ba>>2]=Ff;c[ca>>2]=Gf;c[n>>2]=Cf;df=Cf;ef=Gf;ff=Ff;gf=Ef?wf:0-wf|0}wf=Pe|(gf|0)!=(Sd|0);c[Ae>>2]=gf;gf=e+5764|0;Ae=c[gf>>2]|0;Sd=(((df<<7)+-128|0)>>>8)+1|0;if((ef|0)<0){Oc(t);Hf=c[ba>>2]|0;If=c[ca>>2]|0}else{Hf=ff;If=ef}ef=Sd<<24;if(Hf>>>0<ef>>>0){Jf=1;Kf=Sd;Lf=Hf}else{Jf=0;Kf=(c[n>>2]|0)-Sd|0;Lf=Hf-ef|0}ef=d[16+Kf>>0]|0;Hf=Kf<<ef;Kf=Lf<<ef;Lf=If-ef|0;c[ba>>2]=Kf;c[ca>>2]=Lf;c[n>>2]=Hf;if(Jf)Mf=0;else{Jf=(((Hf<<7)+-128|0)>>>8)+1|0;if((Lf|0)<0){Oc(t);Nf=c[ba>>2]|0;Of=c[ca>>2]|0}else{Nf=Kf;Of=Lf}Lf=Jf<<24;if(Nf>>>0<Lf>>>0){Pf=0;Qf=Jf;Rf=Nf}else{Pf=8;Qf=(c[n>>2]|0)-Jf|0;Rf=Nf-Lf|0}Lf=d[16+Qf>>0]|0;Nf=Qf<<Lf;Qf=Rf<<Lf;Rf=Of-Lf|0;c[ba>>2]=Qf;c[ca>>2]=Rf;c[n>>2]=Nf;Lf=(((Nf<<7)+-128|0)>>>8)+1|0;if((Rf|0)<0){Oc(t);Sf=c[ba>>2]|0;Tf=c[ca>>2]|0}else{Sf=Qf;Tf=Rf}Rf=Lf<<24;if(Sf>>>0<Rf>>>0){Uf=0;Vf=Lf;Wf=Sf}else{Uf=4;Vf=(c[n>>2]|0)-Lf|0;Wf=Sf-Rf|0}Rf=d[16+Vf>>0]|0;Sf=Vf<<Rf;Vf=Wf<<Rf;Wf=Tf-Rf|0;c[ba>>2]=Vf;c[ca>>2]=Wf;c[n>>2]=Sf;Rf=(((Sf<<7)+-128|0)>>>8)+1|0;if((Wf|0)<0){Oc(t);Xf=c[ba>>2]|0;Yf=c[ca>>2]|0}else{Xf=Vf;Yf=Wf}Wf=Rf<<24;if(Xf>>>0<Wf>>>0){Zf=0;_f=Rf;$f=Xf}else{Zf=2;_f=(c[n>>2]|0)-Rf|0;$f=Xf-Wf|0}Wf=d[16+_f>>0]|0;Xf=_f<<Wf;_f=$f<<Wf;$f=Yf-Wf|0;c[ba>>2]=_f;c[ca>>2]=$f;c[n>>2]=Xf;Wf=(((Xf<<7)+-128|0)>>>8)+1|0;if(($f|0)<0){Oc(t);ag=c[ba>>2]|0;bg=c[ca>>2]|0}else{ag=_f;bg=$f}$f=Wf<<24;if(ag>>>0<$f>>>0){cg=0;dg=Wf;eg=ag}else{cg=1;dg=(c[n>>2]|0)-Wf|0;eg=ag-$f|0}$f=d[16+dg>>0]|0;ag=dg<<$f;dg=eg<<$f;eg=bg-$f|0;c[ba>>2]=dg;c[ca>>2]=eg;c[n>>2]=ag;$f=cg|(Zf|(Uf|Pf));Pf=(((ag<<7)+-128|0)>>>8)+1|0;if((eg|0)<0){Oc(t);fg=c[ba>>2]|0;gg=c[ca>>2]|0}else{fg=dg;gg=eg}eg=Pf<<24;if(fg>>>0<eg>>>0){hg=1;ig=Pf;jg=fg}else{hg=0;ig=(c[n>>2]|0)-Pf|0;jg=fg-eg|0}eg=d[16+ig>>0]|0;c[ba>>2]=jg<<eg;c[ca>>2]=gg-eg;c[n>>2]=ig<<eg;Mf=hg?$f:0-$f|0}c[gf>>2]=Mf;if(!((Mf|0)==(Ae|0)&(wf^1)))Rc(e);if(!(a[F>>0]|0))kg=c[Sc>>2]|0;else{wf=a[(d[(c[C>>2]|0)+11>>0]|0)+(e+3155)>>0]|0;if((a[e+3151>>0]|0)==1)lg=wf;else lg=(c[Sc>>2]|0)+wf|0;kg=(lg|0)>-1?((lg|0)<127?lg:127):0}lg=e+2048|0;b[lg>>1]=1;wf=e+2016|0;b[wf>>1]=b[e+3504+(kg<<2)>>1]|0;Ae=e+2080|0;b[Ae>>1]=b[e+4016+(kg<<2)>>1]|0;Mf=e+2112|0;b[Mf>>1]=b[e+4528+(kg<<2)>>1]|0;gf=e+3504+(kg<<2)+2|0;$f=e+4016+(kg<<2)+2|0;hg=e+4528+(kg<<2)+2|0;kg=1;do{eg=b[gf>>1]|0;b[e+2016+(kg<<1)>>1]=eg;b[e+2048+(kg<<1)>>1]=eg;b[e+2080+(kg<<1)>>1]=b[$f>>1]|0;b[e+2112+(kg<<1)>>1]=b[hg>>1]|0;kg=kg+1|0}while((kg|0)!=16);kg=c[n>>2]|0;if(!(c[M>>2]|0)){mg=kg;ng=c[ca>>2]|0}else{hg=(((kg<<7)+-128|0)>>>8)+1|0;kg=c[ca>>2]|0;if((kg|0)<0){Oc(t);og=c[ca>>2]|0}else og=kg;kg=c[ba>>2]|0;$f=hg<<24;if(kg>>>0<$f>>>0){pg=0;qg=hg;rg=kg}else{pg=1;qg=(c[n>>2]|0)-hg|0;rg=kg-$f|0}$f=d[16+qg>>0]|0;kg=qg<<$f;qg=rg<<$f;rg=og-$f|0;c[ba>>2]=qg;c[ca>>2]=rg;c[n>>2]=kg;$f=e+9152|0;c[$f>>2]=pg;pg=(((kg<<7)+-128|0)>>>8)+1|0;if((rg|0)<0){Oc(t);sg=c[ba>>2]|0;tg=c[ca>>2]|0}else{sg=qg;tg=rg}rg=pg<<24;if(sg>>>0<rg>>>0){ug=0;vg=pg;wg=sg}else{ug=1;vg=(c[n>>2]|0)-pg|0;wg=sg-rg|0}rg=d[16+vg>>0]|0;sg=vg<<rg;vg=wg<<rg;wg=tg-rg|0;c[ba>>2]=vg;c[ca>>2]=wg;c[n>>2]=sg;rg=e+9156|0;c[rg>>2]=ug;tg=e+9160|0;c[tg>>2]=0;if(!(c[$f>>2]|0)){$f=(((sg<<7)+-128|0)>>>8)+1|0;if((wg|0)<0){Oc(t);xg=c[ba>>2]|0;yg=c[ca>>2]|0}else{xg=vg;yg=wg}pg=$f<<24;if(xg>>>0<pg>>>0){zg=0;Ag=$f;Bg=xg}else{zg=2;Ag=(c[n>>2]|0)-$f|0;Bg=xg-pg|0}pg=d[16+Ag>>0]|0;xg=Ag<<pg;Ag=Bg<<pg;Bg=yg-pg|0;c[ba>>2]=Ag;c[ca>>2]=Bg;c[n>>2]=xg;pg=(((xg<<7)+-128|0)>>>8)+1|0;if((Bg|0)<0){Oc(t);Cg=c[ba>>2]|0;Dg=c[ca>>2]|0}else{Cg=Ag;Dg=Bg}Bg=pg<<24;if(Cg>>>0<Bg>>>0){Eg=0;Fg=pg;Gg=Cg}else{Eg=1;Fg=(c[n>>2]|0)-pg|0;Gg=Cg-Bg|0}Bg=d[16+Fg>>0]|0;Cg=Fg<<Bg;Fg=Gg<<Bg;Gg=Dg-Bg|0;c[ba>>2]=Fg;c[ca>>2]=Gg;c[n>>2]=Cg;c[tg>>2]=Eg|zg;Hg=Cg;Ig=Gg;Jg=c[rg>>2]|0;Kg=Fg}else{Hg=sg;Ig=wg;Jg=ug;Kg=vg}vg=e+9164|0;c[vg>>2]=0;if(!Jg){Jg=(((Hg<<7)+-128|0)>>>8)+1|0;if((Ig|0)<0){Oc(t);Lg=c[ba>>2]|0;Mg=c[ca>>2]|0}else{Lg=Kg;Mg=Ig}ug=Jg<<24;if(Lg>>>0<ug>>>0){Ng=0;Og=Jg;Pg=Lg}else{Ng=2;Og=(c[n>>2]|0)-Jg|0;Pg=Lg-ug|0}ug=d[16+Og>>0]|0;Lg=Og<<ug;Og=Pg<<ug;Pg=Mg-ug|0;c[ba>>2]=Og;c[ca>>2]=Pg;c[n>>2]=Lg;ug=(((Lg<<7)+-128|0)>>>8)+1|0;if((Pg|0)<0){Oc(t);Qg=c[ba>>2]|0;Rg=c[ca>>2]|0}else{Qg=Og;Rg=Pg}Pg=ug<<24;if(Qg>>>0<Pg>>>0){Sg=0;Tg=ug;Ug=Qg}else{Sg=1;Tg=(c[n>>2]|0)-ug|0;Ug=Qg-Pg|0}Pg=d[16+Tg>>0]|0;Qg=Tg<<Pg;Tg=Ug<<Pg;Ug=Rg-Pg|0;c[ba>>2]=Tg;c[ca>>2]=Ug;c[n>>2]=Qg;c[vg>>2]=Sg|Ng;Vg=Qg;Wg=Ug;Xg=Tg}else{Vg=Hg;Wg=Ig;Xg=Kg}Kg=(((Vg<<7)+-128|0)>>>8)+1|0;if((Wg|0)<0){Oc(t);Yg=c[ba>>2]|0;Zg=c[ca>>2]|0}else{Yg=Xg;Zg=Wg}Wg=Kg<<24;if(Yg>>>0<Wg>>>0){_g=0;$g=Kg;ah=Yg}else{_g=1;$g=(c[n>>2]|0)-Kg|0;ah=Yg-Wg|0}Wg=d[16+$g>>0]|0;Yg=$g<<Wg;$g=ah<<Wg;ah=Zg-Wg|0;c[ba>>2]=$g;c[ca>>2]=ah;c[n>>2]=Yg;c[e+9180>>2]=_g;_g=(((Yg<<7)+-128|0)>>>8)+1|0;if((ah|0)<0){Oc(t);bh=c[ba>>2]|0;ch=c[ca>>2]|0}else{bh=$g;ch=ah}ah=_g<<24;if(bh>>>0<ah>>>0){dh=0;eh=_g;fh=bh}else{dh=1;eh=(c[n>>2]|0)-_g|0;fh=bh-ah|0}ah=d[16+eh>>0]|0;bh=eh<<ah;eh=ch-ah|0;c[ba>>2]=fh<<ah;c[ca>>2]=eh;c[n>>2]=bh;c[e+9184>>2]=dh;mg=bh;ng=eh}eh=(((mg<<7)+-128|0)>>>8)+1|0;if((ng|0)<0){Oc(t);gh=c[ca>>2]|0}else gh=ng;ng=c[ba>>2]|0;mg=eh<<24;if(ng>>>0<mg>>>0){hh=0;ih=eh;jh=ng}else{hh=1;ih=(c[n>>2]|0)-eh|0;jh=ng-mg|0}mg=d[16+ih>>0]|0;ng=ih<<mg;ih=jh<<mg;jh=gh-mg|0;c[ba>>2]=ih;c[ca>>2]=jh;c[n>>2]=ng;mg=e+9168|0;c[mg>>2]=hh;if(!hh)oe(e+9201|0,e+10314|0,1113)|0;if(!(c[M>>2]|0))kh=1;else{hh=(((ng<<7)+-128|0)>>>8)+1|0;if((jh|0)<0){Oc(t);lh=c[ba>>2]|0;mh=c[ca>>2]|0}else{lh=ih;mh=jh}jh=hh<<24;if(lh>>>0<jh>>>0){nh=0;oh=hh;ph=lh}else{nh=1;oh=(c[n>>2]|0)-hh|0;ph=lh-jh|0}jh=d[16+oh>>0]|0;c[ba>>2]=ph<<jh;c[ca>>2]=mh-jh;c[n>>2]=oh<<jh;kh=nh}c[e+9148>>2]=kh&1;c[z>>2]=1;kh=0;do{nh=0;do{jh=0;do{oh=jh+-1|0;if((jh|0)>0){mh=0;do{ph=e+10333+(kh*264|0)+(nh*33|0)+(jh*11|0)+mh|0;lh=((S((c[n>>2]|0)+-1|0,d[2180+(kh*264|0)+(nh*33|0)+(jh*11|0)+mh>>0]|0)|0)>>>8)+1|0;hh=c[ca>>2]|0;if((hh|0)<0){Oc(t);qh=c[ca>>2]|0}else qh=hh;hh=c[ba>>2]|0;ih=lh<<24;if(hh>>>0<ih>>>0){rh=1;sh=lh;th=hh}else{rh=0;sh=(c[n>>2]|0)-lh|0;th=hh-ih|0}ih=d[16+sh>>0]|0;hh=sh<<ih;lh=th<<ih;ng=qh-ih|0;c[ba>>2]=lh;c[ca>>2]=ng;c[n>>2]=hh;if(rh)uh=a[ph>>0]|0;else{ih=hh;hh=ng;ng=lh;lh=8;gh=0;do{eh=lh;lh=lh+-1|0;bh=(((ih<<7)+-128|0)>>>8)+1|0;if((hh|0)<0){Oc(t);vh=c[ba>>2]|0;wh=c[ca>>2]|0}else{vh=ng;wh=hh}dh=bh<<24;if(vh>>>0<dh>>>0){xh=0;yh=bh;zh=vh}else{xh=1;yh=(c[n>>2]|0)-bh|0;zh=vh-dh|0}dh=d[16+yh>>0]|0;ih=yh<<dh;ng=zh<<dh;hh=wh-dh|0;c[ba>>2]=ng;c[ca>>2]=hh;c[n>>2]=ih;gh=xh<<lh|gh}while((eh|0)>1);lh=gh&255;a[ph>>0]=lh;uh=lh}if(uh<<24>>24!=(a[e+10333+(kh*264|0)+(nh*33|0)+(oh*11|0)+mh>>0]|0))c[z>>2]=0;mh=mh+1|0}while((mh|0)!=11)}else{mh=0;do{oh=e+10333+(kh*264|0)+(nh*33|0)+(jh*11|0)+mh|0;lh=((S((c[n>>2]|0)+-1|0,d[2180+(kh*264|0)+(nh*33|0)+(jh*11|0)+mh>>0]|0)|0)>>>8)+1|0;ih=c[ca>>2]|0;if((ih|0)<0){Oc(t);Ah=c[ca>>2]|0}else Ah=ih;ih=c[ba>>2]|0;hh=lh<<24;if(ih>>>0<hh>>>0){Bh=1;Ch=lh;Dh=ih}else{Bh=0;Ch=(c[n>>2]|0)-lh|0;Dh=ih-hh|0}hh=d[16+Ch>>0]|0;ih=Ch<<hh;lh=Dh<<hh;ng=Ah-hh|0;c[ba>>2]=lh;c[ca>>2]=ng;c[n>>2]=ih;if(!Bh){hh=ih;ih=ng;ng=lh;lh=8;vb=0;do{eh=lh;lh=lh+-1|0;dh=(((hh<<7)+-128|0)>>>8)+1|0;if((ih|0)<0){Oc(t);Eh=c[ba>>2]|0;Fh=c[ca>>2]|0}else{Eh=ng;Fh=ih}bh=dh<<24;if(Eh>>>0<bh>>>0){Gh=0;Hh=dh;Ih=Eh}else{Gh=1;Hh=(c[n>>2]|0)-dh|0;Ih=Eh-bh|0}bh=d[16+Hh>>0]|0;hh=Hh<<bh;ng=Ih<<bh;ih=Fh-bh|0;c[ba>>2]=ng;c[ca>>2]=ih;c[n>>2]=hh;vb=Gh<<lh|vb}while((eh|0)>1);a[oh>>0]=vb}mh=mh+1|0}while((mh|0)!=11)}jh=jh+1|0}while((jh|0)!=3);nh=nh+1|0}while((nh|0)!=8);kh=kh+1|0}while((kh|0)!=4);kh=e+384|0;je(kh|0,0,800)|0;Pc(e);Gh=e+9188|0;n=e+5720|0;je(c[Gh>>2]|0,0,(c[n>>2]|0)*9|0)|0;c[e+11848>>2]=0;ba=c[C>>2]|0;Fh=c[G>>2]|0;G=c[B>>2]|0;B=G+16|0;Ih=c[B>>2]|0;Hh=G+36|0;Eh=c[Hh>>2]|0;c[s>>2]=0;t=c[e+3236>>2]|0;c[r+12>>2]=c[t+52>>2];c[r+16>>2]=c[t+56>>2];c[r+20>>2]=c[t+60>>2];c[s+4>>2]=c[t+112>>2];t=c[e+3240>>2]|0;c[r+24>>2]=c[t+52>>2];c[r+28>>2]=c[t+56>>2];c[r+32>>2]=c[t+60>>2];c[s+8>>2]=c[t+112>>2];t=c[e+3244>>2]|0;c[r+36>>2]=c[t+52>>2];c[r+40>>2]=c[t+56>>2];c[r+44>>2]=c[t+60>>2];c[s+12>>2]=c[t+112>>2];t=1<<Fh;Fh=G+52|0;Bh=c[Fh>>2]|0;Ah=G+56|0;Dh=c[Ah>>2]|0;Ch=G+60|0;uh=c[Ch>>2]|0;xh=e+3100|0;c[xh>>2]=0;wh=c[Za>>2]|0;if(wh|0)Ub(u,e,wh);yc(G);wh=e+5716|0;if((c[wh>>2]|0)>0){zh=(t|0)>1;yh=Ih<<4;vh=Eh<<3;rh=e+3140|0;qh=e+3104|0;th=e+3192|0;sh=e+3196|0;nh=e+3108|0;sc=e+3112|0;jh=e+3116|0;vc=e+3120|0;mh=e+3124|0;lh=e+3128|0;hh=e+2984|0;ih=e+3004|0;ng=e+3132|0;ph=e+3136|0;gh=e+3020|0;eh=e+3024|0;bh=e+3028|0;dh=e+3184|0;ah=e+3188|0;fh=e+2900|0;ch=e+2904|0;_g=e+2908|0;$g=e+1984|0;Yg=e+896|0;Wg=e+2e3|0;Zg=e+2816|0;Kg=e+2008|0;Xg=e+2820|0;Vg=e+3151|0;Ig=Bh;Hg=Dh;Tg=uh;Ug=0;Qg=Bh;Ng=uh;Sg=Dh;vg=ba;Pg=0;while(1){Rg=Ug+1|0;if(zh){c[Dc>>2]=e+11456+(Ug*28|0);Jh=(Rg|0)==(t|0)?0:Rg}else Jh=Ug;Rg=S(Pg,yh)|0;ug=S(Pg,vh)|0;c[rh>>2]=c[Gh>>2];N=c[L>>2]|0;P=N+9|0;do{a[N>>0]=0;N=N+1|0}while((N|0)<(P|0));c[qh>>2]=0;c[th>>2]=0-(Pg<<7);c[sh>>2]=33554431-Pg+(c[wh>>2]|0)<<7;Og=Bh+Rg|0;Lg=Dh+ug|0;Mg=uh+ug|0;Jg=Og+-1|0;c[vc>>2]=Jg;wg=Lg+-1|0;c[mh>>2]=wg;sg=Mg+-1|0;c[lh>>2]=sg;Fg=c[hh>>2]|0;c[nh>>2]=Og+(0-Fg);Og=c[ih>>2]|0;rg=0-Og|0;c[sc>>2]=Lg+rg;c[jh>>2]=Mg+rg;c[ng>>2]=Fg;c[ph>>2]=Og;a[Jg>>0]=-127;a[Jg+Fg>>0]=-127;a[Jg+(Fg<<1)>>0]=-127;a[Jg+(Fg*3|0)>>0]=-127;a[Jg+(Fg<<2)>>0]=-127;a[Jg+(Fg*5|0)>>0]=-127;a[Jg+(Fg*6|0)>>0]=-127;a[Jg+(Fg*7|0)>>0]=-127;a[Jg+(Fg<<3)>>0]=-127;a[Jg+(Fg*9|0)>>0]=-127;a[Jg+(Fg*10|0)>>0]=-127;a[Jg+(Fg*11|0)>>0]=-127;a[Jg+(Fg*12|0)>>0]=-127;a[Jg+(Fg*13|0)>>0]=-127;a[Jg+(Fg*14|0)>>0]=-127;a[Jg+(Fg*15|0)>>0]=-127;a[wg>>0]=-127;a[wg+Og>>0]=-127;Fg=Og<<1;a[wg+Fg>>0]=-127;Jg=Og*3|0;a[wg+Jg>>0]=-127;rg=Og<<2;a[wg+rg>>0]=-127;Mg=Og*5|0;a[wg+Mg>>0]=-127;Lg=Og*6|0;a[wg+Lg>>0]=-127;Gg=Og*7|0;a[wg+Gg>>0]=-127;a[sg>>0]=-127;a[sg+Og>>0]=-127;a[sg+Fg>>0]=-127;a[sg+Jg>>0]=-127;a[sg+rg>>0]=-127;a[sg+Mg>>0]=-127;a[sg+Lg>>0]=-127;a[sg+Gg>>0]=-127;Gg=c[n>>2]|0;if((Gg|0)>0){sg=Gg;Gg=c[C>>2]|0;Lg=0;Mg=ug;rg=Rg;while(1){c[dh>>2]=0-(Lg<<7);c[ah>>2]=sg+33554431-Lg<<7;c[gh>>2]=Bh+rg;c[eh>>2]=Dh+Mg;c[bh>>2]=uh+Mg;Jg=a[Gg+2>>0]|0;Fg=Jg&255;if(!(Jg<<24>>24)){c[fh>>2]=0;c[ch>>2]=0;Kh=0}else{c[fh>>2]=(c[r+(Fg*12|0)>>2]|0)+rg;c[ch>>2]=(c[r+(Fg*12|0)+4>>2]|0)+Mg;Kh=(c[r+(Fg*12|0)+8>>2]|0)+Mg|0}c[_g>>2]=Kh;c[D>>2]=c[D>>2]|c[s+(Fg<<2)>>2];do if(!(a[Gg+9>>0]|0)){if(((c[(c[Dc>>2]|0)+12>>2]|0)+-33|0)>>>0<1073741791){Lh=Gg;break}Fg=(Vc(e,e)|0)==0&1;Jg=c[C>>2]|0;a[Jg+9>>0]=Fg;Lh=Jg}else{Uc(e);Lh=c[C>>2]|0}while(0);Jg=a[Lh>>0]|0;if(!(a[F>>0]|0))Mh=Lh;else{Fg=a[(d[Lh+11>>0]|0)+(e+3155)>>0]|0;if((a[Vg>>0]|0)==1)Nh=Fg;else Nh=(c[Sc>>2]|0)+Fg|0;Fg=(Nh|0)>-1?((Nh|0)<127?Nh:127):0;b[lg>>1]=1;b[wf>>1]=b[e+3504+(Fg<<2)>>1]|0;b[Ae>>1]=b[e+4016+(Fg<<2)>>1]|0;b[Mf>>1]=b[e+4528+(Fg<<2)>>1]|0;Og=e+3504+(Fg<<2)+2|0;wg=e+4016+(Fg<<2)+2|0;Cg=e+4528+(Fg<<2)+2|0;Fg=1;do{zg=b[Og>>1]|0;b[e+2016+(Fg<<1)>>1]=zg;b[e+2048+(Fg<<1)>>1]=zg;b[e+2080+(Fg<<1)>>1]=b[wg>>1]|0;b[e+2112+(Fg<<1)>>1]=b[Cg>>1]|0;Fg=Fg+1|0}while((Fg|0)!=16);Mh=c[C>>2]|0}c:do if(!(a[Mh+2>>0]|0)){uc(e,c[sc>>2]|0,c[jh>>2]|0,c[mh>>2]|0,c[lh>>2]|0,c[ph>>2]|0,c[eh>>2]|0,c[bh>>2]|0,c[ih>>2]|0);Fg=c[nh>>2]|0;if(Jg<<24>>24!=4){tc(e,Fg,c[vc>>2]|0,c[ng>>2]|0,c[gh>>2]|0,c[hh>>2]|0);break}Cg=c[hh>>2]|0;wg=c[C>>2]|0;if(a[wg+9>>0]|0){c[$g>>2]=0;c[$g+4>>2]=0;c[$g+8>>2]=0;c[$g+12>>2]=0;c[$g+16>>2]=0;c[$g+20>>2]=0;a[$g+24>>0]=0}Og=Fg+16|0;Fg=c[gh>>2]|0;zg=0-Cg|0;Eg=Fg+zg+16|0;c[Eg+(Cg<<2)>>2]=c[Og>>2];c[Eg+(Cg<<3)>>2]=c[Og>>2];c[Eg+(Cg*12|0)>>2]=c[Og>>2];Og=Fg;Fg=wg;wg=0;while(1){Eg=Og+(c[e+2144+(wg*28|0)+16>>2]|0)|0;tg=Eg+zg|0;xc(tg,Eg+-1|0,Cg,c[Fg+12+(wg<<2)>>2]|0,Eg,Cg,a[tg+-1>>0]|0);tg=a[e+1984+wg>>0]|0;do if(tg<<24>>24){Bg=e+2144+(wg*28|0)|0;Dg=c[Bg>>2]|0;if(tg<<24>>24>1){yb(Dg,wf,Eg,Cg);break}else{Pb((S(b[wf>>1]|0,b[Dg>>1]|0)|0)&65535,Eg,Cg,Eg,Cg);Dg=c[Bg>>2]|0;b[Dg>>1]=0;b[Dg+2>>1]=0>>>16;break}}while(0);Eg=wg+1|0;if((Eg|0)==16)break c;Og=c[gh>>2]|0;Fg=c[C>>2]|0;wg=Eg}}else rc(e);while(0);wg=c[C>>2]|0;if(!(a[wg+9>>0]|0)){d:do switch(Jg<<24>>24){case 4:break;case 9:{Oh=wf;Q=402;break}default:if((a[Kg>>0]|0)>1){xb(Zg,Ae);Qb(c[Xg>>2]|0,kh);N=c[Zg>>2]|0;P=N+32|0;do{b[N>>1]=0;N=N+2|0}while((N|0)<(P|0));Oh=lg;Q=402;break d}else{Fg=(S(b[Ae>>1]|0,b[c[Zg>>2]>>1]|0)|0)&65535;Og=c[Xg>>2]|0;b[Og>>1]=Fg;Rb(Og,kh);Og=c[Zg>>2]|0;b[Og>>1]=0;b[Og+2>>1]=0>>>16;Oh=lg;Q=402;break d}}while(0);if((Q|0)==402){Q=0;Mb(kh,Oh,c[gh>>2]|0,c[hh>>2]|0,$g)}Nb(Yg,Mf,c[eh>>2]|0,c[bh>>2]|0,c[ih>>2]|0,Wg);Ph=c[C>>2]|0}else Ph=wg;c[qh>>2]=1;c[D>>2]=((c[(c[Dc>>2]|0)+12>>2]|0)+-33|0)>>>0<1073741791|c[D>>2];c[nh>>2]=(c[nh>>2]|0)+16;c[sc>>2]=(c[sc>>2]|0)+8;c[jh>>2]=(c[jh>>2]|0)+8;c[vc>>2]=(c[vc>>2]|0)+16;c[mh>>2]=(c[mh>>2]|0)+8;c[lh>>2]=(c[lh>>2]|0)+8;Gg=Ph+76|0;c[C>>2]=Gg;c[rh>>2]=(c[rh>>2]|0)+9;Lg=Lg+1|0;sg=c[n>>2]|0;if((Lg|0)>=(sg|0))break;else{Mg=Mg+8|0;rg=rg+16|0}}}Cb(G,(c[gh>>2]|0)+16|0,(c[eh>>2]|0)+8|0,(c[bh>>2]|0)+8|0);c[C>>2]=(c[C>>2]|0)+76;c[xh>>2]=1;rg=(Pg|0)>0;do if(!(c[Za>>2]|0)){if(!rg){Qh=Ig;Rh=Hg;Sh=Tg;Th=Qg;Uh=Ng;Vh=Sg;Wh=vg;break}Tc(G,Ig,Hg,Tg);Qh=Ig+yh|0;Rh=Hg+vh|0;Sh=Tg+vh|0;Th=Qg;Uh=Ng;Vh=Sg;Wh=vg}else{if(!rg){Qh=Ig;Rh=Hg;Sh=Tg;Th=Qg;Uh=Ng;Vh=Sg;Wh=vg;break}Mg=Pg+-1|0;if(!(c[Ta>>2]|0))Vb(u,vg,Mg,Ih,Eh,Qg,Sg,Ng);else Wb(u,vg,Mg,Ih,Eh,Qg,Sg,Ng);if((Pg|0)>1){Tc(G,Ig,Hg,Tg);Xh=Ig+yh|0;Yh=Hg+vh|0;Zh=Tg+vh|0}else{Xh=Ig;Yh=Hg;Zh=Tg}Qh=Xh;Rh=Yh;Sh=Zh;Th=Qg+yh|0;Uh=Ng+vh|0;Vh=Sg+vh|0;Wh=vg+((c[n>>2]|0)*76|0)+76|0}while(0);rg=Pg+1|0;if((rg|0)<(c[wh>>2]|0)){Ig=Qh;Hg=Rh;Tg=Sh;Ug=Jh;Qg=Th;Ng=Uh;Sg=Vh;vg=Wh;Pg=rg}else{_h=Qh;$h=Rh;ai=Sh;bi=Th;ci=Uh;di=Vh;ei=Wh;fi=Pg;break}}}else{_h=Bh;$h=Dh;ai=uh;bi=Bh;ci=uh;di=Dh;ei=ba;fi=-1}if(!(c[Za>>2]|0)){gi=_h;hi=$h;ii=ai}else{if(!(c[Ta>>2]|0))Vb(u,ei,fi,Ih,Eh,bi,di,ci);else Wb(u,ei,fi,Ih,Eh,bi,di,ci);Tc(G,_h,$h,ai);ci=Eh<<3;gi=_h+(Ih<<4)|0;hi=$h+ci|0;ii=ai+ci|0}Tc(G,gi,hi,ii);ii=G+76|0;hi=c[ii>>2]|0;gi=c[B>>2]|0;ci=0-hi|0;ai=(c[Fh>>2]|0)+ci|0;if((hi|0)>0){$h=ai+(S(gi,ci)|0)|0;ci=0;while(1){oe($h|0,ai|0,gi|0)|0;ci=ci+1|0;if((ci|0)==(hi|0))break;else $h=$h+gi|0}}gi=c[Hh>>2]|0;$h=hi>>>1;hi=0-$h|0;ci=(c[Ah>>2]|0)+hi|0;ai=S(gi,hi)|0;if($h|0){Ih=ci+ai|0;_h=0;while(1){oe(Ih|0,ci|0,gi|0)|0;_h=_h+1|0;if((_h|0)==($h|0))break;else Ih=Ih+gi|0}Ih=(c[Ch>>2]|0)+hi|0;hi=Ih+ai|0;ai=0;while(1){oe(hi|0,Ih|0,gi|0)|0;ai=ai+1|0;if((ai|0)==($h|0))break;else hi=hi+gi|0}}gi=c[ii>>2]|0;ii=c[B>>2]|0;B=(c[Fh>>2]|0)+(0-gi)+(S(c[G+4>>2]|0,ii)|0)+(0-ii)|0;if((gi|0)>0){Fh=B;hi=0;do{Fh=Fh+ii|0;oe(Fh|0,B|0,ii|0)|0;hi=hi+1|0}while((hi|0)!=(gi|0))}hi=c[Hh>>2]|0;Hh=gi>>>1;gi=0-Hh|0;ii=S(c[G+24>>2]|0,hi)|0;G=0-hi|0;B=(c[Ah>>2]|0)+gi+ii+G|0;if(Hh|0){Ah=B;Fh=0;do{Ah=Ah+hi|0;oe(Ah|0,B|0,hi|0)|0;Fh=Fh+1|0}while((Fh|0)!=(Hh|0));Fh=(c[Ch>>2]|0)+gi+ii+G|0;G=Fh;ii=0;do{G=G+hi|0;oe(G|0,Fh|0,hi|0)|0;ii=ii+1|0}while((ii|0)!=(Hh|0))}Hh=((c[ca>>2]|0)+-33|0)>>>0<1073741791|c[D>>2];c[E>>2]=Hh;do if(!(c[J>>2]|0))if(!(c[M>>2]|Hh)){c[J>>2]=1;break}else{Ma(u,7,5854,g);break}while(0);if(c[mg>>2]|0){R=0;l=f;return R|0}oe(e+10314|0,e+9201|0,1113)|0;c[z>>2]=A;R=0;l=f;return R|0}function Tc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;g=c[b+76>>2]|0;h=c[b+16>>2]|0;i=d+(c[b>>2]|0)+-1|0;j=d+(0-g)|0;k=i+1|0;je(j|0,a[d>>0]|0,g|0)|0;je(k|0,a[i>>0]|0,g|0)|0;l=d+h|0;d=i+h|0;i=j+h|0;j=k+h|0;je(i|0,a[l>>0]|0,g|0)|0;je(j|0,a[d>>0]|0,g|0)|0;k=l+h|0;l=d+h|0;d=i+h|0;i=j+h|0;je(d|0,a[k>>0]|0,g|0)|0;je(i|0,a[l>>0]|0,g|0)|0;j=k+h|0;k=l+h|0;l=d+h|0;d=i+h|0;je(l|0,a[j>>0]|0,g|0)|0;je(d|0,a[k>>0]|0,g|0)|0;i=j+h|0;j=k+h|0;k=l+h|0;l=d+h|0;je(k|0,a[i>>0]|0,g|0)|0;je(l|0,a[j>>0]|0,g|0)|0;d=i+h|0;i=j+h|0;j=k+h|0;k=l+h|0;je(j|0,a[d>>0]|0,g|0)|0;je(k|0,a[i>>0]|0,g|0)|0;l=d+h|0;d=i+h|0;i=j+h|0;j=k+h|0;je(i|0,a[l>>0]|0,g|0)|0;je(j|0,a[d>>0]|0,g|0)|0;k=l+h|0;l=d+h|0;d=i+h|0;i=j+h|0;je(d|0,a[k>>0]|0,g|0)|0;je(i|0,a[l>>0]|0,g|0)|0;j=k+h|0;k=l+h|0;l=d+h|0;d=i+h|0;je(l|0,a[j>>0]|0,g|0)|0;je(d|0,a[k>>0]|0,g|0)|0;i=j+h|0;j=k+h|0;k=l+h|0;l=d+h|0;je(k|0,a[i>>0]|0,g|0)|0;je(l|0,a[j>>0]|0,g|0)|0;d=i+h|0;i=j+h|0;j=k+h|0;k=l+h|0;je(j|0,a[d>>0]|0,g|0)|0;je(k|0,a[i>>0]|0,g|0)|0;l=d+h|0;d=i+h|0;i=j+h|0;j=k+h|0;je(i|0,a[l>>0]|0,g|0)|0;je(j|0,a[d>>0]|0,g|0)|0;k=l+h|0;l=d+h|0;d=i+h|0;i=j+h|0;je(d|0,a[k>>0]|0,g|0)|0;je(i|0,a[l>>0]|0,g|0)|0;j=k+h|0;k=l+h|0;l=d+h|0;d=i+h|0;je(l|0,a[j>>0]|0,g|0)|0;je(d|0,a[k>>0]|0,g|0)|0;i=j+h|0;j=k+h|0;k=l+h|0;l=d+h|0;je(k|0,a[i>>0]|0,g|0)|0;je(l|0,a[j>>0]|0,g|0)|0;je(k+h|0,a[i+h>>0]|0,g|0)|0;je(l+h|0,a[j+h>>0]|0,g|0)|0;h=c[b+36>>2]|0;j=c[b+20>>2]|0;b=g>>>1;g=e+j+-1|0;l=0-b|0;i=e+l|0;k=g+1|0;je(i|0,a[e>>0]|0,b|0)|0;je(k|0,a[g>>0]|0,b|0)|0;d=e+h|0;e=g+h|0;g=i+h|0;i=k+h|0;je(g|0,a[d>>0]|0,b|0)|0;je(i|0,a[e>>0]|0,b|0)|0;k=d+h|0;d=e+h|0;e=g+h|0;g=i+h|0;je(e|0,a[k>>0]|0,b|0)|0;je(g|0,a[d>>0]|0,b|0)|0;i=k+h|0;k=d+h|0;d=e+h|0;e=g+h|0;je(d|0,a[i>>0]|0,b|0)|0;je(e|0,a[k>>0]|0,b|0)|0;g=i+h|0;i=k+h|0;k=d+h|0;d=e+h|0;je(k|0,a[g>>0]|0,b|0)|0;je(d|0,a[i>>0]|0,b|0)|0;e=g+h|0;g=i+h|0;i=k+h|0;k=d+h|0;je(i|0,a[e>>0]|0,b|0)|0;je(k|0,a[g>>0]|0,b|0)|0;d=e+h|0;e=g+h|0;g=i+h|0;i=k+h|0;je(g|0,a[d>>0]|0,b|0)|0;je(i|0,a[e>>0]|0,b|0)|0;je(g+h|0,a[d+h>>0]|0,b|0)|0;je(i+h|0,a[e+h>>0]|0,b|0)|0;e=f+j+-1|0;j=f+l|0;l=e+1|0;je(j|0,a[f>>0]|0,b|0)|0;je(l|0,a[e>>0]|0,b|0)|0;i=f+h|0;f=e+h|0;e=j+h|0;j=l+h|0;je(e|0,a[i>>0]|0,b|0)|0;je(j|0,a[f>>0]|0,b|0)|0;l=i+h|0;i=f+h|0;f=e+h|0;e=j+h|0;je(f|0,a[l>>0]|0,b|0)|0;je(e|0,a[i>>0]|0,b|0)|0;j=l+h|0;l=i+h|0;i=f+h|0;f=e+h|0;je(i|0,a[j>>0]|0,b|0)|0;je(f|0,a[l>>0]|0,b|0)|0;e=j+h|0;j=l+h|0;l=i+h|0;i=f+h|0;je(l|0,a[e>>0]|0,b|0)|0;je(i|0,a[j>>0]|0,b|0)|0;f=e+h|0;e=j+h|0;j=l+h|0;l=i+h|0;je(j|0,a[f>>0]|0,b|0)|0;je(l|0,a[e>>0]|0,b|0)|0;i=f+h|0;f=e+h|0;e=j+h|0;j=l+h|0;je(e|0,a[i>>0]|0,b|0)|0;je(j|0,a[f>>0]|0,b|0)|0;je(e+h|0,a[i+h>>0]|0,b|0)|0;je(j+h|0,a[f+h>>0]|0,b|0)|0;return}function Uc(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+3140>>2]|0;e=c[b+3144>>2]|0;f=d;g=f;a[g>>0]=0;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;g=f+4|0;a[g>>0]=0;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;g=e;f=g;a[f>>0]=0;a[f+1>>0]=0;a[f+2>>0]=0;a[f+3>>0]=0;f=g+4|0;a[f>>0]=0;a[f+1>>0]=0;a[f+2>>0]=0;a[f+3>>0]=0;if(a[(c[b+3088>>2]|0)+3>>0]|0)return;a[e+8>>0]=0;a[d+8>>0]=0;return}function Vc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c[d+3216>>2]|0;f=c[d+3140>>2]|0;g=c[d+3144>>2]|0;if(!(a[(c[d+3088>>2]|0)+3>>0]|0)){h=f+8|0;i=g+8|0;j=Wc(e,b+10597|0,(a[i>>0]|0)+(a[h>>0]|0)|0,0,d+1152|0)|0;k=(j|0)>0&1;a[i>>0]=k;a[h>>0]=k;a[d+2008>>0]=j;l=0;m=j+-16|0;n=1}else{l=3;m=0;n=0}j=b+10333+(l*264|0)|0;l=m;m=0;k=d+384|0;while(1){h=f+(m&3)|0;i=g+(m>>>2&3)|0;o=Wc(e,j,(a[i>>0]|0)+(a[h>>0]|0)|0,n,k)|0;p=(o|0)>0&1;a[i>>0]=p;a[h>>0]=p;p=o+n|0;a[d+1984+m>>0]=p;l=p+l|0;m=m+1|0;if((m|0)==16)break;else k=k+32|0}k=b+10861|0;b=f+4|0;f=g+4|0;g=l;l=16;m=d+896|0;while(1){n=((l|0)>19&1)<<1;j=b+n+(l&1)|0;p=f+n+((l&2)>>>0>1&1)|0;n=Wc(e,k,(a[p>>0]|0)+(a[j>>0]|0)|0,0,m)|0;o=(n|0)>0&1;a[p>>0]=o;a[j>>0]=o;a[d+1984+l>>0]=n;g=n+g|0;l=l+1|0;if((l|0)==24)break;else m=m+32|0}return g|0}function Wc(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0;j=f+(h*33|0)+(g*11|0)|0;g=e+16|0;k=((S((c[g>>2]|0)+-1|0,d[j>>0]|0)|0)>>>8)+1|0;l=e+12|0;m=c[l>>2]|0;if((m|0)<0){Oc(e);n=c[l>>2]|0}else n=m;m=e+8|0;o=c[m>>2]|0;p=k<<24;if(o>>>0<p>>>0){q=1;r=k;s=o}else{q=0;r=(c[g>>2]|0)-k|0;s=o-p|0}p=d[16+r>>0]|0;o=r<<p;r=s<<p;s=n-p|0;c[m>>2]=r;c[l>>2]=s;c[g>>2]=o;if(q){t=0;return t|0}else{u=o;v=s;w=r;x=h;y=j}while(1){j=x+1|0;h=((S(u+-1|0,d[y+1>>0]|0)|0)>>>8)+1|0;if((v|0)<0){Oc(e);z=c[m>>2]|0;A=c[l>>2]|0}else{z=w;A=v}r=h<<24;if(z>>>0<r>>>0){B=1;C=h;D=z}else{B=0;C=(c[g>>2]|0)-h|0;D=z-r|0}r=d[16+C>>0]|0;h=C<<r;s=D<<r;o=A-r|0;c[m>>2]=s;c[l>>2]=o;c[g>>2]=h;if(B)if((j|0)==16){t=16;E=82;break}else{u=h;v=o;w=s;x=j;y=f+((d[5900+j>>0]|0)*33|0)|0;continue}r=((S(d[y+2>>0]|0,h+-1|0)|0)>>>8)+1|0;if((o|0)<0){Oc(e);F=c[m>>2]|0;G=c[l>>2]|0}else{F=s;G=o}o=r<<24;if(F>>>0<o>>>0){H=1;I=r;J=F}else{H=0;I=(c[g>>2]|0)-r|0;J=F-o|0}o=d[16+I>>0]|0;r=I<<o;s=J<<o;h=G-o|0;c[m>>2]=s;c[l>>2]=h;c[g>>2]=r;do if(H){K=1;L=r;M=h;N=s;O=1}else{o=((S(d[y+3>>0]|0,r+-1|0)|0)>>>8)+1|0;if((h|0)<0){Oc(e);P=c[m>>2]|0;Q=c[l>>2]|0}else{P=s;Q=h}q=o<<24;if(P>>>0<q>>>0){R=1;T=o;U=P}else{R=0;T=(c[g>>2]|0)-o|0;U=P-q|0}q=d[16+T>>0]|0;o=T<<q;p=U<<q;n=Q-q|0;c[m>>2]=p;c[l>>2]=n;c[g>>2]=o;if(R){q=((S(d[y+4>>0]|0,o+-1|0)|0)>>>8)+1|0;if((n|0)<0){Oc(e);V=c[m>>2]|0;W=c[l>>2]|0}else{V=p;W=n}k=q<<24;if(V>>>0<k>>>0){X=1;Y=q;Z=V}else{X=0;Y=(c[g>>2]|0)-q|0;Z=V-k|0}k=d[16+Y>>0]|0;q=Y<<k;_=Z<<k;$=W-k|0;c[m>>2]=_;c[l>>2]=$;c[g>>2]=q;if(X){K=2;L=q;M=$;N=_;O=2;break}k=((S(d[y+5>>0]|0,q+-1|0)|0)>>>8)+1|0;if(($|0)<0){Oc(e);aa=c[m>>2]|0;ba=c[l>>2]|0}else{aa=_;ba=$}$=k<<24;if(aa>>>0<$>>>0){ca=3;da=k;ea=aa}else{ca=4;da=(c[g>>2]|0)-k|0;ea=aa-$|0}$=d[16+da>>0]|0;k=da<<$;_=ea<<$;q=ba-$|0;c[m>>2]=_;c[l>>2]=q;c[g>>2]=k;K=2;L=k;M=q;N=_;O=ca;break}_=((S(d[y+6>>0]|0,o+-1|0)|0)>>>8)+1|0;if((n|0)<0){Oc(e);fa=c[m>>2]|0;ga=c[l>>2]|0}else{fa=p;ga=n}n=_<<24;if(fa>>>0<n>>>0){ha=1;ia=_;ja=fa}else{ha=0;ia=(c[g>>2]|0)-_|0;ja=fa-n|0}n=d[16+ia>>0]|0;_=ia<<n;p=ja<<n;o=ga-n|0;c[m>>2]=p;c[l>>2]=o;c[g>>2]=_;if(!ha){n=((S(d[y+8>>0]|0,_+-1|0)|0)>>>8)+1|0;if((o|0)<0){Oc(e);ka=c[m>>2]|0;la=c[l>>2]|0}else{ka=p;la=o}q=n<<24;if(ka>>>0<q>>>0){ma=0;na=n;oa=ka}else{ma=1;na=(c[g>>2]|0)-n|0;oa=ka-q|0}q=d[16+na>>0]|0;n=na<<q;k=oa<<q;$=la-q|0;c[m>>2]=k;c[l>>2]=$;c[g>>2]=n;q=((S(d[y+(ma+9)>>0]|0,n+-1|0)|0)>>>8)+1|0;if(($|0)<0){Oc(e);pa=c[m>>2]|0;qa=c[l>>2]|0}else{pa=k;qa=$}$=q<<24;if(pa>>>0<$>>>0){ra=0;sa=q;ta=pa}else{ra=1;sa=(c[g>>2]|0)-q|0;ta=pa-$|0}$=d[16+sa>>0]|0;q=sa<<$;k=ta<<$;n=qa-$|0;c[m>>2]=k;c[l>>2]=n;c[g>>2]=q;$=ra|ma<<1;ua=c[1668+($<<2)>>2]|0;va=a[ua>>0]|0;if(!(va<<24>>24)){wa=k;xa=n;ya=q;za=0}else{Aa=va;va=q;q=n;n=k;k=ua;ua=0;while(1){Ba=((S(va+-1|0,Aa&255)|0)>>>8)+1|0;if((q|0)<0){Oc(e);Ca=c[m>>2]|0;Da=c[l>>2]|0}else{Ca=n;Da=q}Ea=Ba<<24;if(Ca>>>0<Ea>>>0){Fa=0;Ga=Ba;Ha=Ca}else{Fa=1;Ga=(c[g>>2]|0)-Ba|0;Ha=Ca-Ea|0}Ea=d[16+Ga>>0]|0;Ba=Ga<<Ea;Ia=Ha<<Ea;Ja=Da-Ea|0;c[m>>2]=Ia;c[l>>2]=Ja;c[g>>2]=Ba;Ea=Fa|ua<<1;k=k+1|0;Aa=a[k>>0]|0;if(!(Aa<<24>>24)){wa=Ia;xa=Ja;ya=Ba;za=Ea;break}else{va=Ba;q=Ja;n=Ia;ua=Ea}}}K=2;L=ya;M=xa;N=wa;O=za+(8<<$|3)|0;break}ua=((S(d[y+7>>0]|0,_+-1|0)|0)>>>8)+1|0;if((o|0)<0){Oc(e);Ka=c[m>>2]|0;La=c[l>>2]|0}else{Ka=p;La=o}n=ua<<24;if(Ka>>>0<n>>>0){Ma=1;Na=ua;Oa=Ka}else{Ma=0;Na=(c[g>>2]|0)-ua|0;Oa=Ka-n|0}n=d[16+Na>>0]|0;ua=Na<<n;q=Oa<<n;va=La-n|0;c[m>>2]=q;c[l>>2]=va;c[g>>2]=ua;n=ua+-1|0;if(Ma){ua=((n*159|0)>>>8)+1|0;if((va|0)<0){Oc(e);Pa=c[m>>2]|0;Qa=c[l>>2]|0}else{Pa=q;Qa=va}Aa=ua<<24;if(Pa>>>0<Aa>>>0){Ra=5;Sa=ua;Ta=Pa}else{Ra=6;Sa=(c[g>>2]|0)-ua|0;Ta=Pa-Aa|0}Aa=d[16+Sa>>0]|0;ua=Sa<<Aa;k=Ta<<Aa;Ea=Qa-Aa|0;c[m>>2]=k;c[l>>2]=Ea;c[g>>2]=ua;K=2;L=ua;M=Ea;N=k;O=Ra;break}k=((n*165|0)>>>8)+1|0;if((va|0)<0){Oc(e);Ua=c[m>>2]|0;Va=c[l>>2]|0}else{Ua=q;Va=va}va=k<<24;if(Ua>>>0<va>>>0){Wa=7;Xa=k;Ya=Ua}else{Wa=9;Xa=(c[g>>2]|0)-k|0;Ya=Ua-va|0}va=d[16+Xa>>0]|0;k=Xa<<va;q=Ya<<va;n=Va-va|0;c[m>>2]=q;c[l>>2]=n;c[g>>2]=k;va=(((k*145|0)+-145|0)>>>8)+1|0;if((n|0)<0){Oc(e);Za=c[m>>2]|0;_a=c[l>>2]|0}else{Za=q;_a=n}n=va<<24;if(Za>>>0<n>>>0){$a=0;ab=va;bb=Za}else{$a=1;ab=(c[g>>2]|0)-va|0;bb=Za-n|0}n=d[16+ab>>0]|0;va=ab<<n;q=bb<<n;k=_a-n|0;c[m>>2]=q;c[l>>2]=k;c[g>>2]=va;K=2;L=va;M=k;N=q;O=$a+Wa|0}while(0);y=f+((d[5900+j>>0]|0)*33|0)+(K*11|0)|0;h=d[5917+x>>0]|0;s=(L+1|0)>>>1;r=s<<24;if((M|0)<0){Oc(e);cb=c[m>>2]|0}else cb=N;if(cb>>>0<r>>>0){c[g>>2]=s;db=s;eb=cb;fb=O}else{q=(c[g>>2]|0)-s|0;c[g>>2]=q;s=cb-r|0;c[m>>2]=s;db=q;eb=s;fb=0-O|0}s=db<<1;c[g>>2]=s;q=eb<<1;c[m>>2]=q;r=c[l>>2]|0;k=r+-1|0;c[l>>2]=k;b[i+(h<<1)>>1]=fb;if((j|0)==16){t=16;E=82;break}h=((S(s+-1|0,d[y>>0]|0)|0)>>>8)+1|0;if((r|0)<1){Oc(e);gb=c[m>>2]|0;hb=c[l>>2]|0}else{gb=q;hb=k}k=h<<24;if(gb>>>0<k>>>0){ib=1;jb=h;kb=gb}else{ib=0;jb=(c[g>>2]|0)-h|0;kb=gb-k|0}k=d[16+jb>>0]|0;u=jb<<k;w=kb<<k;v=hb-k|0;c[m>>2]=w;c[l>>2]=v;c[g>>2]=u;if(ib){t=j;E=82;break}else x=j}if((E|0)==82)return t|0;return 0}function Xc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=a+3248|0;switch(b|0){case 1:{h=a+5564|0;break}case 2:{h=a+5568|0;break}case 4:{h=a+5572|0;break}default:{Ma(g,1,5960,e);i=c[g>>2]|0;l=e;return i|0}}b=c[h>>2]|0;h=a+5064+(b*120|0)|0;if((((c[a+5064+(b*120|0)+4>>2]|0)==(c[d+4>>2]|0)?(c[h>>2]|0)==(c[d>>2]|0):0)?(c[a+5064+(b*120|0)+24>>2]|0)==(c[d+24>>2]|0):0)?(c[a+5064+(b*120|0)+20>>2]|0)==(c[d+20>>2]|0):0){Ua(h,d);i=c[g>>2]|0;l=e;return i|0}Ma(g,1,5984,f);i=c[g>>2]|0;l=e;return i|0}function Yc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+16|0;f=e+8|0;g=a+3248|0;switch(b|0){case 1:{h=a+5564|0;break}case 2:{h=a+5568|0;break}case 4:{h=a+5572|0;break}default:{Ma(g,1,5960,e);i=c[g>>2]|0;l=e;return i|0}}b=c[h>>2]|0;if((((c[a+5064+(b*120|0)+4>>2]|0)==(c[d+4>>2]|0)?(c[a+5064+(b*120|0)>>2]|0)==(c[d>>2]|0):0)?(c[a+5064+(b*120|0)+24>>2]|0)==(c[d+24>>2]|0):0)?(c[a+5064+(b*120|0)+20>>2]|0)==(c[d+20>>2]|0):0){if(c[a+5544>>2]|0)if(c[a+5548>>2]|0)if(!(c[a+5552>>2]|0))j=2;else j=(c[a+5556>>2]|0)==0?3:4;else j=1;else j=0;b=a+5544+(j<<2)|0;c[b>>2]=0;k=a+5544+(c[h>>2]<<2)|0;m=c[k>>2]|0;if((m|0)>0)c[k>>2]=m+-1;c[h>>2]=j;c[b>>2]=(c[b>>2]|0)+1;Ua(d,a+5064+((c[h>>2]|0)*120|0)|0);i=c[g>>2]|0;l=e;return i|0}Ma(g,1,5984,f);i=c[g>>2]|0;l=e;return i|0}function Zc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;d=4;b=be(40)|0;c[b>>2]=0;g=a+3248|0;c[g>>2]=0;do if(((c[a+11836>>2]|0)==0?(c[a+11736>>2]|0)>>>0<2:0)?(c[a+11776>>2]|0)==0:0){h=a+5564|0;i=c[h>>2]|0;j=a+5544+(i<<2)|0;k=c[j>>2]|0;if((k|0)>1){c[j>>2]=k+-1;if(c[a+5544>>2]|0)if(c[a+5548>>2]|0)if(!(c[a+5552>>2]|0))l=2;else l=(c[a+5556>>2]|0)==0?3:4;else l=1;else l=0;c[a+5544+(l<<2)>>2]=1;c[h>>2]=l;o=0;ba(1,a+5064+(i*120|0)|0,a+5064+(l*120|0)|0);k=o;o=0;if((k|0)!=0&(p|0)!=0){m=ne(c[k>>2]|0,b|0,d|0)|0;if(!m)ja(k|0,p|0);D=p}else m=-1;if((m|0)==1){n=D;q=0;r=0;s=0;t=0;break}u=c[h>>2]|0}else u=i;c[a+5064+(u*120|0)+112>>2]=1;v=0;w=a+5704|0;c[w>>2]=0;ce(b|0);return v|0}else x=12;while(0);if((x|0)==12){if(c[a+5544>>2]|0)if(c[a+5548>>2]|0)if(!(c[a+5552>>2]|0))y=2;else y=(c[a+5556>>2]|0)==0?3:4;else y=1;else y=0;c[a+5544+(y<<2)>>2]=1;u=a+5560|0;c[u>>2]=y;c[a+3232>>2]=a+5064+(y*120|0);y=a+5564|0;c[a+3236>>2]=a+5064+((c[y>>2]|0)*120|0);m=a+5568|0;c[a+3240>>2]=a+5064+((c[m>>2]|0)*120|0);l=a+5572|0;c[a+3244>>2]=a+5064+((c[l>>2]|0)*120|0);b=me(a+3340|0,1,b|0,d|0)|0;d=D;o=0;i=o;o=0;if((i|0)!=0&(p|0)!=0){z=ne(c[i>>2]|0,b|0,d|0)|0;if(!z)ja(i|0,p|0);D=p}else z=-1;if((z|0)==1){n=D;q=l;r=m;s=y;t=u}else{n=0;q=l;r=m;s=y;t=u}}while(1){if(n|0){x=19;break}c[a+3336>>2]=1;o=0;A=ca(3,a|0)|0;u=o;o=0;if((u|0)!=0&(p|0)!=0){B=ne(c[u>>2]|0,b|0,d|0)|0;if(!B)ja(u|0,p|0);D=p}else B=-1;if((B|0)==1)n=D;else{x=22;break}}do if((x|0)==19){c[a+5064+((c[s>>2]|0)*120|0)+112>>2]=1;n=a+5544+(c[t>>2]<<2)|0;B=c[n>>2]|0;if((B|0)>0){c[n>>2]=B+-1;C=1}else C=1}else if((x|0)==22){if((A|0)<0){B=a+5544+(c[t>>2]<<2)|0;n=c[B>>2]|0;if((n|0)>0)c[B>>2]=n+-1;c[g>>2]=1;C=A;break}switch(c[a+9164>>2]|0){case 0:{E=0;break}case 1:{F=0;G=c[s>>2]|0;x=29;break}case 2:{F=0;G=c[r>>2]|0;x=29;break}default:{F=-1;G=0;x=29}}if((x|0)==29){n=a+5544+(c[q>>2]<<2)|0;B=c[n>>2]|0;if((B|0)>0)c[n>>2]=B+-1;c[q>>2]=G;B=a+5544+(G<<2)|0;c[B>>2]=(c[B>>2]|0)+1;E=F}switch(c[a+9160>>2]|0){case 0:{H=E;break}case 1:{I=s;x=34;break}case 2:{I=q;x=34;break}default:{J=-1;K=0;x=35}}if((x|0)==34){J=E;K=c[I>>2]|0;x=35}if((x|0)==35){B=a+5544+(c[r>>2]<<2)|0;n=c[B>>2]|0;if((n|0)>0)c[B>>2]=n+-1;c[r>>2]=K;n=a+5544+(K<<2)|0;c[n>>2]=(c[n>>2]|0)+1;H=J}if(c[a+9152>>2]|0){n=c[t>>2]|0;B=a+5544+(c[r>>2]<<2)|0;d=c[B>>2]|0;if((d|0)>0)c[B>>2]=d+-1;c[r>>2]=n;d=a+5544+(n<<2)|0;c[d>>2]=(c[d>>2]|0)+1}if(c[a+9156>>2]|0){d=c[t>>2]|0;n=a+5544+(c[q>>2]<<2)|0;B=c[n>>2]|0;if((B|0)>0)c[n>>2]=B+-1;c[q>>2]=d;B=a+5544+(d<<2)|0;c[B>>2]=(c[B>>2]|0)+1}if(!(c[a+9148>>2]|0))L=t;else{B=c[t>>2]|0;d=a+5544+(c[s>>2]<<2)|0;n=c[d>>2]|0;if((n|0)>0)c[d>>2]=n+-1;c[s>>2]=B;n=a+5544+(B<<2)|0;c[n>>2]=(c[n>>2]|0)+1;L=s}c[a+5060>>2]=a+5064+((c[L>>2]|0)*120|0);n=a+5544+(c[t>>2]<<2)|0;c[n>>2]=(c[n>>2]|0)+-1;if(H|0){c[g>>2]=1;C=A;break}if(c[a+5704>>2]|0){n=a+11428|0;c[n>>2]=(c[n>>2]|0)+1;c[a+5776>>2]=c[a+5772>>2]}c[a+11824>>2]=0;n=a+11816|0;c[n>>2]=e;c[n+4>>2]=f;C=A}while(0);v=C;w=a+3336|0;c[w>>2]=0;ce(b|0);return v|0}function _c(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=a+11824|0;if((c[f>>2]|0)==1){g=-1;return g|0}if(!(c[a+5704>>2]|0)){g=-1;return g|0}c[f>>2]=1;f=a+11816|0;h=c[f+4>>2]|0;i=d;c[i>>2]=c[f>>2];c[i+4>>2]=h;h=e;c[h>>2]=0;c[h+4>>2]=0;h=c[a+5060>>2]|0;if(!h){g=-1;return g|0}e=b;i=h;h=e+120|0;do{c[e>>2]=c[i>>2];e=e+4|0;i=i+4|0}while((e|0)<(h|0));c[b>>2]=c[a+5040>>2];i=c[a+5044>>2]|0;c[b+4>>2]=i;c[b+24>>2]=(i|0)/2|0;g=0;return g|0}function $c(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[a+2468>>2]|0;if((e|0)<=0){f=0;return f|0}g=c[a+2472>>2]|0;if((g|0)<=0){h=0;do h=h+1|0;while((h|0)<(e|0));f=0;return f|0}h=0;i=c[a+2524>>2]|0;a:while(1){a=0;j=i;while(1){if((d[j+2>>0]|0|0)==(b|0)){f=1;k=9;break a}a=a+1|0;if((a|0)>=(g|0))break;else j=j+76|0}h=h+1|0;if((h|0)>=(e|0)){f=0;k=9;break}else i=j+152|0}if((k|0)==9)return f|0;return 0}function ad(a,b){a=a|0;b=b|0;b=bd()|0;c[a>>2]=b;return (b|0)==0|0}function bd(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;a=4;b=be(40)|0;c[b>>2]=0;o=0;d=fa(12,32,11872)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=ne(c[e>>2]|0,b|0,a|0)|0;if(!f)ja(e|0,p|0);D=p}else f=-1;if((f|0)!=1){if(!d){g=0;ce(b|0);return g|0}je(d|0,0,11872)|0;f=d+3248|0;b=me(d+3340|0,1,b|0,a|0)|0;a=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){h=ne(c[e>>2]|0,b|0,a|0)|0;if(!h)ja(e|0,p|0);D=p}else h=-1;if((h|0)==1){i=f;j=d;k=D}else{i=f;j=d;k=0}}else{i=0;j=0;k=D}while(1){f=d+3336|0;if(k|0){c[f>>2]=0;o=0;aa(2,i|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){l=ne(c[h>>2]|0,b|0,a|0)|0;if(!l)ja(h|0,p|0);D=p}else l=-1;if((l|0)==1){m=j;n=i;k=D;j=m;i=n;continue}o=0;aa(3,d|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){q=ne(c[h>>2]|0,b|0,a|0)|0;if(!q)ja(h|0,p|0);D=p}else q=-1;if((q|0)==1){m=j;n=i;k=D;j=m;i=n;continue}else{r=8;break}}c[f>>2]=1;o=0;aa(4,i|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){s=ne(c[h>>2]|0,b|0,a|0)|0;if(!s)ja(h|0,p|0);D=p}else s=-1;if((s|0)==1){m=j;n=i;k=D;j=m;i=n;continue}c[d+11428>>2]=0;c[d+11824>>2]=1;o=0;aa(5,j|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){t=ne(c[h>>2]|0,b|0,a|0)|0;if(!t)ja(h|0,p|0);D=p}else t=-1;if((t|0)==1){m=j;n=i;k=D;j=m;i=n;continue}o=0;aa(6,i|0);h=o;o=0;if((h|0)!=0&(p|0)!=0){u=ne(c[h>>2]|0,b|0,a|0)|0;if(!u)ja(h|0,p|0);D=p}else u=-1;if((u|0)==1){m=j;n=i;k=D;j=m;i=n;continue}c[f>>2]=0;f=d+11832|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;o=0;aa(7,d|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){v=ne(c[f>>2]|0,b|0,a|0)|0;if(!v)ja(f|0,p|0);D=p}else v=-1;if((v|0)==1){m=j;n=i;k=D;j=m;i=n;continue}if(c[2174]|0){g=j;r=19;break}if(c[2175]|0)break;o=0;da(1);f=o;o=0;if((f|0)!=0&(p|0)!=0){w=ne(c[f>>2]|0,b|0,a|0)|0;if(!w)ja(f|0,p|0);D=p}else w=-1;if((w|0)==1){m=j;n=i;k=D;j=m;i=n;continue}o=0;da(2);f=o;o=0;if((f|0)!=0&(p|0)!=0){x=ne(c[f>>2]|0,b|0,a|0)|0;if(!x)ja(f|0,p|0);D=p}else x=-1;if((x|0)==1){m=j;n=i;k=D;j=m;i=n}else{r=17;break}}if((r|0)==8){g=0;ce(b|0);return g|0}else if((r|0)==17)c[2175]=1;else if((r|0)==19){ce(b|0);return g|0}c[2174]=1;g=j;ce(b|0);return g|0}function cd(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if(!b){d=1;return d|0}wb(b+3248|0);Pa(b);d=0;return d|0}function dd(){var a=0,b=0,d=0;a=l;l=l+16|0;b=a;d=Mc()|0;c[2176]=d;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;Ia(8708,d,b,0,10)|0;l=a;return}function ed(){return 0}function fd(){return}function gd(a,b){a=a|0;b=b|0;ae(6012)|0;return 0}function hd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+16|0;e=d;f=d+4|0;Ja(8708,a,b,0,1)|0;Ja(8708,0,0,0,1)|0;c[f>>2]=0;b=Ka(8708,f)|0;if(!b){g=0;l=d;return g|0}else{h=b;i=0}a:while(1){if(i|0){j=3;break}k=c[h>>2]|0;switch(k|0){case 258:{b=c[h+12>>2]|0;a=c[h+16>>2]|0;m=b;n=a;o=a>>>1;p=b>>>1;break}case 261:{b=c[h+12>>2]|0;a=c[h+16>>2]|0;m=b;n=a;o=a;p=b>>>1;break}case 262:{b=c[h+12>>2]|0;a=c[h+16>>2]|0;m=b;n=a;o=a;p=b;break}default:{j=8;break a}}ia(c[h+48>>2]|0,c[h+64>>2]|0,c[h+52>>2]|0,c[h+68>>2]|0,c[h+56>>2]|0,c[h+72>>2]|0,m|0,n|0,p|0,o|0);h=Ka(8708,f)|0;if(!h){g=1;j=10;break}else i=1}if((j|0)==3){while(1){j=0;ae(6050)|0;if(!(Ka(8708,f)|0)){g=i;break}else j=3}l=d;return g|0}else if((j|0)==8){c[e>>2]=k;$d(6100,e)|0;g=0;l=d;return g|0}else if((j|0)==10){l=d;return g|0}return 0}function id(){return 8736}function jd(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=qd(c[a+60>>2]|0)|0;a=md(ka(6,d|0)|0)|0;l=b;return a|0}function kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=l;l=l+48|0;f=e+16|0;g=e;h=e+32|0;i=a+28|0;j=c[i>>2]|0;c[h>>2]=j;k=a+20|0;m=(c[k>>2]|0)-j|0;c[h+4>>2]=m;c[h+8>>2]=b;c[h+12>>2]=d;b=m+d|0;m=a+60|0;c[g>>2]=c[m>>2];c[g+4>>2]=h;c[g+8>>2]=2;j=md(qa(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=j;n=h;o=2;p=b;while(1){if((g|0)<0)break;p=p-g|0;q=c[n+4>>2]|0;r=g>>>0>q>>>0;s=r?n+8|0:n;t=(r<<31>>31)+o|0;u=g-(r?q:0)|0;c[s>>2]=(c[s>>2]|0)+u;q=s+4|0;c[q>>2]=(c[q>>2]|0)-u;c[f>>2]=c[m>>2];c[f+4>>2]=s;c[f+8>>2]=t;g=md(qa(146,f|0)|0)|0;if((p|0)==(g|0)){v=3;break a}else{n=s;o=t}}c[a+16>>2]=0;c[i>>2]=0;c[k>>2]=0;c[a>>2]=c[a>>2]|32;if((o|0)==2)w=0;else w=d-(c[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=c[a+44>>2]|0;c[a+16>>2]=v+(c[a+48>>2]|0);c[i>>2]=v;c[k>>2]=v;w=d}l=e;return w|0}function ld(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+32|0;f=e;g=e+20|0;c[f>>2]=c[a+60>>2];c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=g;c[f+16>>2]=d;if((md(pa(140,f|0)|0)|0)<0){c[g>>2]=-1;h=-1}else h=c[g>>2]|0;l=e;return h|0}function md(a){a=a|0;var b=0;if(a>>>0>4294963200){c[(nd()|0)>>2]=0-a;b=-1}else b=a;return b|0}function nd(){return (od()|0)+64|0}function od(){return pd()|0}function pd(){return 1684}function qd(a){a=a|0;return a|0}function rd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[b+36>>2]=6;if((c[b>>2]&64|0)==0?(c[g>>2]=c[b+60>>2],c[g+4>>2]=21523,c[g+8>>2]=f+16,oa(54,g|0)|0):0)a[b+75>>0]=-1;g=kd(b,d,e)|0;l=f;return g|0}function sd(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=b;b=c;do{d=d+1|0;b=b+1|0;c=a[d>>0]|0;e=a[b>>0]|0}while(!(c<<24>>24==0?1:c<<24>>24!=e<<24>>24));f=e;g=c}return (g&255)-(f&255)|0}function td(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+128|0;h=g+124|0;i=g;j=i;k=2056;m=j+124|0;do{c[j>>2]=c[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(m|0));if((d+-1|0)>>>0>2147483646)if(!d){n=1;o=h;p=4}else{c[(nd()|0)>>2]=75;q=-1}else{n=d;o=b;p=4}if((p|0)==4){p=-2-o|0;b=n>>>0>p>>>0?p:n;c[i+48>>2]=b;n=i+20|0;c[n>>2]=o;c[i+44>>2]=o;p=o+b|0;o=i+16|0;c[o>>2]=p;c[i+28>>2]=p;p=ud(i,e,f)|0;if(!b)q=p;else{b=c[n>>2]|0;a[b+(((b|0)==(c[o>>2]|0))<<31>>31)>>0]=0;q=p}}l=g;return q|0}function ud(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+224|0;g=f+120|0;h=f+80|0;i=f;j=f+136|0;k=h;m=k+40|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[g>>2]=c[e>>2];if((vd(0,d,g,i,h)|0)<0)n=-1;else{if((c[b+76>>2]|0)>-1)o=wd(b)|0;else o=0;e=c[b>>2]|0;k=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){m=b+44|0;p=c[m>>2]|0;c[m>>2]=j;q=b+28|0;c[q>>2]=j;r=b+20|0;c[r>>2]=j;c[e>>2]=80;s=b+16|0;c[s>>2]=j+80;j=vd(b,d,g,i,h)|0;if(!p)t=j;else{sa[c[b+36>>2]&7](b,0,0)|0;u=(c[r>>2]|0)==0?-1:j;c[m>>2]=p;c[e>>2]=0;c[s>>2]=0;c[q>>2]=0;c[r>>2]=0;t=u}}else t=vd(b,d,g,i,h)|0;h=c[b>>2]|0;c[b>>2]=h|k;if(o|0)xd(b);n=(h&32|0)==0?t:-1}l=f;return n|0}\nfunction vd(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;j=l;l=l+64|0;k=j+16|0;m=j;n=j+24|0;o=j+8|0;p=j+20|0;c[k>>2]=e;q=(d|0)!=0;r=n+40|0;s=r;t=n+39|0;n=o+4|0;u=e;e=0;v=0;w=0;a:while(1){do if((e|0)>-1)if((v|0)>(2147483647-e|0)){c[(nd()|0)>>2]=75;x=-1;break}else{x=v+e|0;break}else x=e;while(0);y=a[u>>0]|0;if(!(y<<24>>24)){z=87;break}else{A=y;B=u}b:while(1){switch(A<<24>>24){case 37:{C=B;E=B;z=9;break b;break}case 0:{F=B;G=B;break b;break}default:{}}y=B+1|0;c[k>>2]=y;A=a[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((a[C+1>>0]|0)!=37){F=C;G=E;break c}y=E+1|0;H=C+2|0;c[k>>2]=H;if((a[H>>0]|0)==37){C=H;E=y;z=9}else{F=H;G=y;break}}while(0);y=G-u|0;if(q)yd(d,u,y);if(y|0){u=F;e=x;v=y;continue}y=F+1|0;H=(a[y>>0]|0)+-48|0;if(H>>>0<10){I=(a[F+2>>0]|0)==36;J=I?H:-1;K=I?1:w;L=I?F+3|0:y}else{J=-1;K=w;L=y}c[k>>2]=L;y=a[L>>0]|0;I=(y<<24>>24)+-32|0;d:do if(I>>>0<32){H=y;M=0;N=L;O=I;while(1){P=1<<O;if(!(P&75913)){Q=H;R=N;S=M;break d}T=P|M;P=N+1|0;c[k>>2]=P;U=a[P>>0]|0;O=(U<<24>>24)+-32|0;if(O>>>0>=32){Q=U;R=P;S=T;break}else{H=U;M=T;N=P}}}else{Q=y;R=L;S=0}while(0);if(Q<<24>>24==42){y=R+1|0;I=(a[y>>0]|0)+-48|0;if(I>>>0<10?(a[R+2>>0]|0)==36:0){c[i+(I<<2)>>2]=10;V=1;W=R+3|0;X=c[g+((a[y>>0]|0)+-48<<3)>>2]|0}else{if(K|0){Y=-1;break}if(q){I=(c[f>>2]|0)+(4-1)&~(4-1);N=c[I>>2]|0;c[f>>2]=I+4;V=0;W=y;X=N}else{V=0;W=y;X=0}}c[k>>2]=W;y=(X|0)<0;Z=W;_=y?S|8192:S;$=V;aa=y?0-X|0:X}else{y=zd(k)|0;if((y|0)<0){Y=-1;break}Z=c[k>>2]|0;_=S;$=K;aa=y}do if((a[Z>>0]|0)==46){if((a[Z+1>>0]|0)!=42){c[k>>2]=Z+1;y=zd(k)|0;ba=c[k>>2]|0;ca=y;break}y=Z+2|0;N=(a[y>>0]|0)+-48|0;if(N>>>0<10?(a[Z+3>>0]|0)==36:0){c[i+(N<<2)>>2]=10;N=c[g+((a[y>>0]|0)+-48<<3)>>2]|0;I=Z+4|0;c[k>>2]=I;ba=I;ca=N;break}if($|0){Y=-1;break a}if(q){N=(c[f>>2]|0)+(4-1)&~(4-1);I=c[N>>2]|0;c[f>>2]=N+4;da=I}else da=0;c[k>>2]=y;ba=y;ca=da}else{ba=Z;ca=-1}while(0);y=ba;I=0;while(1){if(((a[y>>0]|0)+-65|0)>>>0>57){Y=-1;break a}ea=y+1|0;c[k>>2]=ea;fa=a[(a[y>>0]|0)+-65+(6145+(I*58|0))>>0]|0;ga=fa&255;if((ga+-1|0)>>>0<8){y=ea;I=ga}else break}if(!(fa<<24>>24)){Y=-1;break}N=(J|0)>-1;do if(fa<<24>>24==19)if(N){Y=-1;break a}else z=49;else{if(N){c[i+(J<<2)>>2]=ga;M=g+(J<<3)|0;H=c[M+4>>2]|0;O=m;c[O>>2]=c[M>>2];c[O+4>>2]=H;z=49;break}if(!q){Y=0;break a}Ad(m,ga,f)}while(0);if((z|0)==49?(z=0,!q):0){u=ea;e=x;v=0;w=$;continue}N=a[y>>0]|0;H=(I|0)!=0&(N&15|0)==3?N&-33:N;N=_&-65537;O=(_&8192|0)==0?_:N;e:do switch(H|0){case 110:{switch((I&255)<<24>>24){case 0:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 1:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 2:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}case 3:{b[c[m>>2]>>1]=x;u=ea;e=x;v=0;w=$;continue a;break}case 4:{a[c[m>>2]>>0]=x;u=ea;e=x;v=0;w=$;continue a;break}case 6:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 7:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}default:{u=ea;e=x;v=0;w=$;continue a}}break}case 112:{ha=O|8;ia=ca>>>0>8?ca:8;ja=120;z=61;break}case 88:case 120:{ha=O;ia=ca;ja=H;z=61;break}case 111:{M=m;P=c[M>>2]|0;T=c[M+4>>2]|0;M=Cd(P,T,r)|0;U=s-M|0;ka=P;la=T;ma=M;na=O;oa=(O&8|0)==0|(ca|0)>(U|0)?ca:U+1|0;pa=0;qa=6609;z=67;break}case 105:case 100:{U=m;M=c[U>>2]|0;T=c[U+4>>2]|0;if((T|0)<0){U=he(0,0,M|0,T|0)|0;P=D;ra=m;c[ra>>2]=U;c[ra+4>>2]=P;sa=U;ta=P;ua=1;va=6609;z=66;break e}else{sa=M;ta=T;ua=(O&2049|0)!=0&1;va=(O&2048|0)==0?((O&1|0)==0?6609:6611):6610;z=66;break e}break}case 117:{T=m;sa=c[T>>2]|0;ta=c[T+4>>2]|0;ua=0;va=6609;z=66;break}case 99:{a[t>>0]=c[m>>2];wa=t;xa=N;ya=1;za=0;Aa=6609;Ba=r;break}case 109:{Ca=Ed(c[(nd()|0)>>2]|0)|0;z=71;break}case 115:{T=c[m>>2]|0;Ca=T|0?T:6619;z=71;break}case 67:{c[o>>2]=c[m>>2];c[n>>2]=0;c[m>>2]=o;Da=o;Ea=-1;z=75;break}case 83:{T=c[m>>2]|0;if(!ca){Gd(d,32,aa,0,O);Fa=0;z=84}else{Da=T;Ea=ca;z=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{u=ea;e=x;v=Id(d,+h[m>>3],aa,ca,O,H)|0;w=$;continue a;break}default:{wa=u;xa=O;ya=ca;za=0;Aa=6609;Ba=r}}while(0);f:do if((z|0)==61){z=0;H=m;I=c[H>>2]|0;y=c[H+4>>2]|0;H=Bd(I,y,r,ja&32)|0;T=(ha&8|0)==0|(I|0)==0&(y|0)==0;ka=I;la=y;ma=H;na=ha;oa=ia;pa=T?0:2;qa=T?6609:6609+(ja>>4)|0;z=67}else if((z|0)==66){z=0;ka=sa;la=ta;ma=Dd(sa,ta,r)|0;na=O;oa=ca;pa=ua;qa=va;z=67}else if((z|0)==71){z=0;T=Fd(Ca,0,ca)|0;H=(T|0)==0;wa=Ca;xa=N;ya=H?ca:T-Ca|0;za=0;Aa=6609;Ba=H?Ca+ca|0:T}else if((z|0)==75){z=0;T=0;H=0;y=Da;while(1){I=c[y>>2]|0;if(!I){Ga=T;Ha=H;break}M=Hd(p,I)|0;if((M|0)<0|M>>>0>(Ea-T|0)>>>0){Ga=T;Ha=M;break}I=M+T|0;if(Ea>>>0>I>>>0){T=I;H=M;y=y+4|0}else{Ga=I;Ha=M;break}}if((Ha|0)<0){Y=-1;break a}Gd(d,32,aa,Ga,O);if(!Ga){Fa=0;z=84}else{y=0;H=Da;while(1){T=c[H>>2]|0;if(!T){Fa=Ga;z=84;break f}M=Hd(p,T)|0;y=M+y|0;if((y|0)>(Ga|0)){Fa=Ga;z=84;break f}yd(d,p,M);if(y>>>0>=Ga>>>0){Fa=Ga;z=84;break}else H=H+4|0}}}while(0);if((z|0)==67){z=0;N=(ka|0)!=0|(la|0)!=0;H=(oa|0)!=0|N;y=((N^1)&1)+(s-ma)|0;wa=H?ma:r;xa=(oa|0)>-1?na&-65537:na;ya=H?((oa|0)>(y|0)?oa:y):oa;za=pa;Aa=qa;Ba=r}else if((z|0)==84){z=0;Gd(d,32,aa,Fa,O^8192);u=ea;e=x;v=(aa|0)>(Fa|0)?aa:Fa;w=$;continue}y=Ba-wa|0;H=(ya|0)<(y|0)?y:ya;N=H+za|0;M=(aa|0)<(N|0)?N:aa;Gd(d,32,M,N,xa);yd(d,Aa,za);Gd(d,48,M,N,xa^65536);Gd(d,48,H,y,0);yd(d,wa,y);Gd(d,32,M,N,xa^8192);u=ea;e=x;v=M;w=$}g:do if((z|0)==87)if(!d)if(!w)Y=0;else{$=1;while(1){v=c[i+($<<2)>>2]|0;if(!v){Ia=$;break}Ad(g+($<<3)|0,v,f);$=$+1|0;if(($|0)>=10){Y=1;break g}}while(1){if(c[i+(Ia<<2)>>2]|0){Y=-1;break g}Ia=Ia+1|0;if((Ia|0)>=10){Y=1;break}}}else Y=x;while(0);l=j;return Y|0}function wd(a){a=a|0;return 0}function xd(a){a=a|0;return}function yd(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))Ud(b,d,a)|0;return}function zd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;e=(a[d>>0]|0)+-48|0;if(e>>>0<10){f=d;d=0;g=e;while(1){e=g+(d*10|0)|0;f=f+1|0;c[b>>2]=f;g=(a[f>>0]|0)+-48|0;if(g>>>0>=10){h=e;break}else d=e}}else h=0;return h|0}function Ad(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f;break a;break}case 10:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a;break}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=f;c[e+4>>2]=0;break a;break}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);f=e;g=c[f>>2]|0;i=c[f+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=g;c[e+4>>2]=i;break a;break}case 13:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&65535)<<16>>16;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 14:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&65535;c[i+4>>2]=0;break a;break}case 15:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&255)<<24>>24;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 16:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&255;c[i+4>>2]=0;break a;break}case 17:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}case 18:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}default:break a}while(0);while(0);return}function Bd(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==0&(c|0)==0)g=e;else{h=b;b=c;c=e;while(1){e=c+-1|0;a[e>>0]=d[6661+(h&15)>>0]|0|f;h=ke(h|0,b|0,4)|0;b=D;if((h|0)==0&(b|0)==0){g=e;break}else c=e}}return g|0}function Cd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((b|0)==0&(c|0)==0)e=d;else{f=b;b=c;c=d;while(1){d=c+-1|0;a[d>>0]=f&7|48;f=ke(f|0,b|0,3)|0;b=D;if((f|0)==0&(b|0)==0){e=d;break}else c=d}}return e|0}function Dd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){e=b;f=c;c=d;while(1){g=te(e|0,f|0,10,0)|0;c=c+-1|0;a[c>>0]=g&255|48;g=e;e=re(e|0,f|0,10,0)|0;if(!(f>>>0>9|(f|0)==9&g>>>0>4294967295))break;else f=D}h=c;i=e}else{h=d;i=b}if(!i)j=h;else{b=h;h=i;while(1){i=b+-1|0;a[i>>0]=(h>>>0)%10|0|48;if(h>>>0<10){j=i;break}else{b=i;h=(h>>>0)/10|0}}}return j|0}function Ed(a){a=a|0;return Pd(a,c[(Od()|0)+188>>2]|0)|0}function Fd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=d&255;g=(e|0)!=0;a:do if(g&(b&3|0)!=0){h=d&255;i=e;j=b;while(1){if((a[j>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=j+1|0;o=i+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=o;j=n}else{q=o;r=n;s=p;m=5;break}}}else{q=e;r=b;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=0;u=r}b:do if((m|0)==6){r=d&255;if((a[l>>0]|0)==r<<24>>24){t=k;u=l}else{q=S(f,16843009)|0;c:do if(k>>>0>3){s=k;g=l;while(1){b=c[g>>2]^q;if((b&-2139062144^-2139062144)&b+-16843009|0)break;b=g+4|0;e=s+-4|0;if(e>>>0>3){s=e;g=b}else{v=e;w=b;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!v){t=0;u=w;break}else{x=v;y=w}while(1){if((a[y>>0]|0)==r<<24>>24){t=x;u=y;break b}q=y+1|0;x=x+-1|0;if(!x){t=0;u=q;break}else y=q}}}while(0);return (t|0?u:0)|0}function Gd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;je(g|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{yd(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;yd(a,g,h)}l=f;return}function Hd(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Md(a,b,0)|0;return c|0}function Id(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;j=l;l=l+560|0;k=j+8|0;m=j;n=j+524|0;o=n;p=j+512|0;c[m>>2]=0;q=p+12|0;Jd(e)|0;if((D|0)<0){r=1;s=6626;t=-e}else{r=(h&2049|0)!=0&1;s=(h&2048|0)==0?((h&1|0)==0?6627:6632):6629;t=e}Jd(t)|0;u=D&2146435072;do if(u>>>0<2146435072|(u|0)==2146435072&0<0){e=+Kd(t,m)*2.0;v=e!=0.0;if(v)c[m>>2]=(c[m>>2]|0)+-1;w=i|32;if((w|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-g|0;do if(!(g>>>0>11|(A|0)==0)){B=A;C=8.0;do{B=B+-1|0;C=C*16.0}while((B|0)!=0);if((a[y>>0]|0)==45){E=-(C+(-e-C));break}else{E=e+C-C;break}}else E=e;while(0);A=c[m>>2]|0;B=(A|0)<0?0-A|0:A;F=Dd(B,((B|0)<0)<<31>>31,q)|0;if((F|0)==(q|0)){B=p+11|0;a[B>>0]=48;G=B}else G=F;a[G+-1>>0]=(A>>31&2)+43;A=G+-2|0;a[A>>0]=i+15;F=(g|0)<1;B=(h&8|0)==0;H=n;I=E;while(1){J=~~I;K=H+1|0;a[H>>0]=d[6661+J>>0]|x;I=(I-+(J|0))*16.0;if((K-o|0)==1?!(B&(F&I==0.0)):0){a[K>>0]=46;L=H+2|0}else L=K;if(!(I!=0.0))break;else H=L}H=L-o|0;F=q-A|0;B=(g|0)!=0&(H+-2|0)<(g|0)?g+2|0:H;x=F+z+B|0;Gd(b,32,f,x,h);yd(b,y,z);Gd(b,48,f,x,h^65536);yd(b,n,H);Gd(b,48,B-H|0,0,0);yd(b,A,F);Gd(b,32,f,x,h^8192);M=x;break}x=(g|0)<0?6:g;if(v){F=(c[m>>2]|0)+-28|0;c[m>>2]=F;N=F;O=e*268435456.0}else{N=c[m>>2]|0;O=e}F=(N|0)<0?k:k+288|0;I=O;H=F;do{B=~~I>>>0;c[H>>2]=B;H=H+4|0;I=(I-+(B>>>0))*1.0e9}while(I!=0.0);if((N|0)>0){v=N;A=F;z=H;while(1){y=(v|0)<29?v:29;B=z+-4|0;if(B>>>0>=A>>>0){K=0;J=B;do{B=le(c[J>>2]|0,0,y|0)|0;P=ie(B|0,D|0,K|0,0)|0;B=D;Q=te(P|0,B|0,1e9,0)|0;c[J>>2]=Q;K=re(P|0,B|0,1e9,0)|0;J=J+-4|0}while(J>>>0>=A>>>0);if(K){J=A+-4|0;c[J>>2]=K;R=J}else R=A}else R=A;J=z;while(1){if(J>>>0<=R>>>0)break;B=J+-4|0;if(!(c[B>>2]|0))J=B;else break}K=(c[m>>2]|0)-y|0;c[m>>2]=K;if((K|0)>0){v=K;A=R;z=J}else{T=K;U=R;V=J;break}}}else{T=N;U=F;V=H}if((T|0)<0){z=((x+25|0)/9|0)+1|0;A=(w|0)==102;v=T;K=U;B=V;while(1){P=0-v|0;Q=(P|0)<9?P:9;if(K>>>0<B>>>0){P=(1<<Q)+-1|0;W=1e9>>>Q;X=0;Y=K;do{Z=c[Y>>2]|0;c[Y>>2]=(Z>>>Q)+X;X=S(Z&P,W)|0;Y=Y+4|0}while(Y>>>0<B>>>0);Y=(c[K>>2]|0)==0?K+4|0:K;if(!X){_=Y;$=B}else{c[B>>2]=X;_=Y;$=B+4|0}}else{_=(c[K>>2]|0)==0?K+4|0:K;$=B}Y=A?F:_;W=($-Y>>2|0)>(z|0)?Y+(z<<2)|0:$;v=(c[m>>2]|0)+Q|0;c[m>>2]=v;if((v|0)>=0){aa=_;ba=W;break}else{K=_;B=W}}}else{aa=U;ba=V}B=F;if(aa>>>0<ba>>>0){K=(B-aa>>2)*9|0;v=c[aa>>2]|0;if(v>>>0<10)ca=K;else{z=K;K=10;while(1){K=K*10|0;A=z+1|0;if(v>>>0<K>>>0){ca=A;break}else z=A}}}else ca=0;z=(w|0)==103;K=(x|0)!=0;v=x-((w|0)!=102?ca:0)+((K&z)<<31>>31)|0;if((v|0)<(((ba-B>>2)*9|0)+-9|0)){A=v+9216|0;v=F+4+(((A|0)/9|0)+-1024<<2)|0;H=((A|0)%9|0)+1|0;if((H|0)<9){A=10;W=H;while(1){H=A*10|0;W=W+1|0;if((W|0)==9){da=H;break}else A=H}}else da=10;A=c[v>>2]|0;W=(A>>>0)%(da>>>0)|0;w=(v+4|0)==(ba|0);if(!(w&(W|0)==0)){C=(((A>>>0)/(da>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;H=(da|0)/2|0;I=W>>>0<H>>>0?.5:w&(W|0)==(H|0)?1.0:1.5;if(!r){ea=C;fa=I}else{H=(a[s>>0]|0)==45;ea=H?-C:C;fa=H?-I:I}H=A-W|0;c[v>>2]=H;if(ea+fa!=ea){W=H+da|0;c[v>>2]=W;if(W>>>0>999999999){W=aa;H=v;while(1){A=H+-4|0;c[H>>2]=0;if(A>>>0<W>>>0){w=W+-4|0;c[w>>2]=0;ga=w}else ga=W;w=(c[A>>2]|0)+1|0;c[A>>2]=w;if(w>>>0>999999999){W=ga;H=A}else{ha=ga;ia=A;break}}}else{ha=aa;ia=v}H=(B-ha>>2)*9|0;W=c[ha>>2]|0;if(W>>>0<10){ja=ha;ka=ia;la=H}else{A=H;H=10;while(1){H=H*10|0;w=A+1|0;if(W>>>0<H>>>0){ja=ha;ka=ia;la=w;break}else A=w}}}else{ja=aa;ka=v;la=ca}}else{ja=aa;ka=v;la=ca}A=ka+4|0;ma=ja;na=la;oa=ba>>>0>A>>>0?A:ba}else{ma=aa;na=ca;oa=ba}A=oa;while(1){if(A>>>0<=ma>>>0){pa=0;break}H=A+-4|0;if(!(c[H>>2]|0))A=H;else{pa=1;break}}v=0-na|0;do if(z){H=((K^1)&1)+x|0;if((H|0)>(na|0)&(na|0)>-5){qa=H+-1-na|0;ra=i+-1|0}else{qa=H+-1|0;ra=i+-2|0}H=h&8;if(!H){if(pa?(W=c[A+-4>>2]|0,(W|0)!=0):0)if(!((W>>>0)%10|0)){w=10;Y=0;while(1){w=w*10|0;P=Y+1|0;if((W>>>0)%(w>>>0)|0|0){sa=P;break}else Y=P}}else sa=0;else sa=9;Y=((A-B>>2)*9|0)+-9|0;if((ra|32|0)==102){w=Y-sa|0;W=(w|0)>0?w:0;ta=0;ua=(qa|0)<(W|0)?qa:W;va=ra;break}else{W=Y+na-sa|0;Y=(W|0)>0?W:0;ta=0;ua=(qa|0)<(Y|0)?qa:Y;va=ra;break}}else{ta=H;ua=qa;va=ra}}else{ta=h&8;ua=x;va=i}while(0);x=ua|ta;B=(x|0)!=0&1;K=(va|32|0)==102;if(K){wa=0;xa=(na|0)>0?na:0}else{z=(na|0)<0?v:na;Y=Dd(z,((z|0)<0)<<31>>31,q)|0;z=q;if((z-Y|0)<2){W=Y;while(1){w=W+-1|0;a[w>>0]=48;if((z-w|0)<2)W=w;else{ya=w;break}}}else ya=Y;a[ya+-1>>0]=(na>>31&2)+43;W=ya+-2|0;a[W>>0]=va;wa=W;xa=z-W|0}W=r+1+ua+B+xa|0;Gd(b,32,f,W,h);yd(b,s,r);Gd(b,48,f,W,h^65536);if(K){v=ma>>>0>F>>>0?F:ma;w=n+9|0;Q=w;X=n+8|0;P=v;do{J=Dd(c[P>>2]|0,0,w)|0;if((P|0)==(v|0))if((J|0)==(w|0)){a[X>>0]=48;za=X}else za=J;else if(J>>>0>n>>>0){je(n|0,48,J-o|0)|0;y=J;while(1){Z=y+-1|0;if(Z>>>0>n>>>0)y=Z;else{za=Z;break}}}else za=J;yd(b,za,Q-za|0);P=P+4|0}while(P>>>0<=F>>>0);if(x|0)yd(b,6677,1);if(P>>>0<A>>>0&(ua|0)>0){F=P;Q=ua;while(1){X=Dd(c[F>>2]|0,0,w)|0;if(X>>>0>n>>>0){je(n|0,48,X-o|0)|0;v=X;while(1){K=v+-1|0;if(K>>>0>n>>>0)v=K;else{Aa=K;break}}}else Aa=X;yd(b,Aa,(Q|0)<9?Q:9);F=F+4|0;v=Q+-9|0;if(!(F>>>0<A>>>0&(Q|0)>9)){Ba=v;break}else Q=v}}else Ba=ua;Gd(b,48,Ba+9|0,9,0)}else{Q=pa?A:ma+4|0;if((ua|0)>-1){F=n+9|0;w=(ta|0)==0;P=F;x=0-o|0;v=n+8|0;J=ma;K=ua;while(1){B=Dd(c[J>>2]|0,0,F)|0;if((B|0)==(F|0)){a[v>>0]=48;Ca=v}else Ca=B;do if((J|0)==(ma|0)){B=Ca+1|0;yd(b,Ca,1);if(w&(K|0)<1){Da=B;break}yd(b,6677,1);Da=B}else{if(Ca>>>0<=n>>>0){Da=Ca;break}je(n|0,48,Ca+x|0)|0;B=Ca;while(1){z=B+-1|0;if(z>>>0>n>>>0)B=z;else{Da=z;break}}}while(0);X=P-Da|0;yd(b,Da,(K|0)>(X|0)?X:K);B=K-X|0;J=J+4|0;if(!(J>>>0<Q>>>0&(B|0)>-1)){Ea=B;break}else K=B}}else Ea=ua;Gd(b,48,Ea+18|0,18,0);yd(b,wa,q-wa|0)}Gd(b,32,f,W,h^8192);M=W}else{K=(i&32|0)!=0;Q=r+3|0;Gd(b,32,f,Q,h&-65537);yd(b,s,r);yd(b,t!=t|0.0!=0.0?(K?6653:6657):K?6645:6649,3);Gd(b,32,f,Q,h^8192);M=Q}while(0);l=j;return ((M|0)<(f|0)?f:M)|0}function Jd(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function Kd(a,b){a=+a;b=b|0;return +(+Ld(a,b))}function Ld(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,k=0.0,l=0.0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=ke(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){g=+Ld(a*18446744073709551616.0,b);i=(c[b>>2]|0)+-64|0;k=g}else{i=0;k=a}c[b>>2]=i;l=k;break}case 2047:{l=a;break}default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;l=+h[j>>3]}}return +l}function Md(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;do if(b){if(d>>>0<128){a[b>>0]=d;f=1;break}if(!(c[c[(Nd()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;f=1;break}else{c[(nd()|0)>>2]=84;f=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;f=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;f=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;f=4;break}else{c[(nd()|0)>>2]=84;f=-1;break}}else f=1;while(0);return f|0}function Nd(){return pd()|0}function Od(){return pd()|0}function Pd(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=0;while(1){if((d[6679+f>>0]|0)==(b|0)){g=2;break}h=f+1|0;if((h|0)==87){i=87;j=6767;g=5;break}else f=h}if((g|0)==2)if(!f)k=6767;else{i=f;j=6767;g=5}if((g|0)==5)while(1){g=0;f=j;do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);i=i+-1|0;if(!i){k=f;break}else{j=f;g=5}}return Qd(k,c[e+20>>2]|0)|0}function Qd(a,b){a=a|0;b=b|0;return Rd(a,b)|0}function Rd(a,b){a=a|0;b=b|0;var d=0;if(!b)d=0;else d=Sd(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (d|0?d:a)|0}function Sd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=(c[b>>2]|0)+1794895138|0;g=Td(c[b+8>>2]|0,f)|0;h=Td(c[b+12>>2]|0,f)|0;i=Td(c[b+16>>2]|0,f)|0;a:do if((g>>>0<d>>>2>>>0?(j=d-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=Td(c[b+(q<<2)>>2]|0,f)|0;s=Td(c[b+(q+1<<2)>>2]|0,f)|0;if(!(s>>>0<d>>>0&r>>>0<(d-s|0)>>>0)){t=0;break a}if(a[b+(s+r)>>0]|0){t=0;break a}r=sd(e,b+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=Td(c[b+(m<<2)>>2]|0,f)|0;j=Td(c[b+(m+1<<2)>>2]|0,f)|0;if(j>>>0<d>>>0&l>>>0<(d-j|0)>>>0)t=(a[b+(j+l)>>0]|0)==0?b+j|0:0;else t=0}else t=0;while(0);return t|0}function Td(a,b){a=a|0;b=b|0;var c=0;c=ue(a|0)|0;return ((b|0)==0?a:c)|0}function Ud(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Vd(e)|0)){h=c[f>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=e+20|0;f=c[g>>2]|0;k=f;if((h-f|0)>>>0<d>>>0){j=sa[c[e+36>>2]&7](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){l=k;m=0;n=d;o=b;break b}p=f+-1|0;if((a[b+p>>0]|0)==10)break;else f=p}p=sa[c[e+36>>2]&7](e,b,f)|0;if(p>>>0<f>>>0){j=p;break a}l=c[g>>2]|0;m=f;n=d-f|0;o=b+f|0}else{l=k;m=0;n=d;o=b}while(0);oe(l|0,o|0,n|0)|0;c[g>>2]=(c[g>>2]|0)+n;j=m+n|0}while(0);return j|0}function Vd(b){b=b|0;var d=0,e=0,f=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;e=c[b>>2]|0;if(!(e&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);f=0}else{c[b>>2]=e|32;f=-1}return f|0}function Wd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=a+20|0;f=c[e>>2]|0;g=(c[a+16>>2]|0)-f|0;a=g>>>0>d>>>0?d:g;oe(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Xd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b;a:do if(!(d&3)){e=b;f=4}else{g=d;h=b;while(1){if(!(a[h>>0]|0)){i=g;break a}j=h+1|0;g=j;if(!(g&3)){e=j;f=4;break}else h=j}}while(0);if((f|0)==4){f=e;while(1){k=c[f>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))f=f+4|0;else break}if(!((k&255)<<24>>24))l=f;else{k=f;while(1){f=k+1|0;if(!(a[f>>0]|0)){l=f;break}else k=f}}i=l}return i-d|0}function Yd(a,b){a=a|0;b=b|0;var c=0;c=Xd(a)|0;return ((Zd(a,1,c,b)|0)!=(c|0))<<31>>31|0}function Zd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=S(d,b)|0;g=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){d=(wd(e)|0)==0;h=Ud(a,f,e)|0;if(d)i=h;else{xd(e);i=h}}else i=Ud(a,f,e)|0;if((i|0)==(f|0))j=g;else j=(i>>>0)/(b>>>0)|0;return j|0}function _d(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+16|0;g=f;h=e&255;a[g>>0]=h;i=b+16|0;j=c[i>>2]|0;if(!j)if(!(Vd(b)|0)){k=c[i>>2]|0;m=4}else n=-1;else{k=j;m=4}do if((m|0)==4){j=b+20|0;i=c[j>>2]|0;if(i>>>0<k>>>0?(o=e&255,(o|0)!=(a[b+75>>0]|0)):0){c[j>>2]=i+1;a[i>>0]=h;n=o;break}if((sa[c[b+36>>2]&7](b,g,1)|0)==1)n=d[g>>0]|0;else n=-1}while(0);l=f;return n|0}function $d(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=ud(c[482]|0,a,e)|0;l=d;return b|0}function ae(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[482]|0;if((c[d+76>>2]|0)>-1)e=wd(d)|0;else e=0;do if((Yd(b,d)|0)<0)f=1;else{if((a[d+75>>0]|0)!=10?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=10;f=0;break}f=(_d(d,10)|0)<0}while(0);if(e|0)xd(d);return f<<31>>31|0}function be(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;b=l;l=l+16|0;d=b;do if(a>>>0<245){e=a>>>0<11?16:a+11&-8;f=e>>>3;g=c[2200]|0;h=g>>>f;if(h&3|0){i=(h&1^1)+f|0;j=8840+(i<<1<<2)|0;k=j+8|0;m=c[k>>2]|0;n=m+8|0;o=c[n>>2]|0;do if((j|0)!=(o|0)){if(o>>>0<(c[2204]|0)>>>0)ma();p=o+12|0;if((c[p>>2]|0)==(m|0)){c[p>>2]=j;c[k>>2]=o;break}else ma()}else c[2200]=g&~(1<<i);while(0);o=i<<3;c[m+4>>2]=o|3;k=m+o+4|0;c[k>>2]=c[k>>2]|1;q=n;l=b;return q|0}k=c[2202]|0;if(e>>>0>k>>>0){if(h|0){o=2<<f;j=h<<f&(o|0-o);o=(j&0-j)+-1|0;j=o>>>12&16;p=o>>>j;o=p>>>5&8;r=p>>>o;p=r>>>2&4;s=r>>>p;r=s>>>1&2;t=s>>>r;s=t>>>1&1;u=(o|j|p|r|s)+(t>>>s)|0;s=8840+(u<<1<<2)|0;t=s+8|0;r=c[t>>2]|0;p=r+8|0;j=c[p>>2]|0;do if((s|0)!=(j|0)){if(j>>>0<(c[2204]|0)>>>0)ma();o=j+12|0;if((c[o>>2]|0)==(r|0)){c[o>>2]=s;c[t>>2]=j;v=g;break}else ma()}else{o=g&~(1<<u);c[2200]=o;v=o}while(0);j=(u<<3)-e|0;c[r+4>>2]=e|3;t=r+e|0;c[t+4>>2]=j|1;c[t+j>>2]=j;if(k|0){s=c[2205]|0;f=k>>>3;h=8840+(f<<1<<2)|0;n=1<<f;if(v&n){f=h+8|0;m=c[f>>2]|0;if(m>>>0<(c[2204]|0)>>>0)ma();else{w=f;x=m}}else{c[2200]=v|n;w=h+8|0;x=h}c[w>>2]=s;c[x+12>>2]=s;c[s+8>>2]=x;c[s+12>>2]=h}c[2202]=j;c[2205]=t;q=p;l=b;return q|0}t=c[2201]|0;if(t){j=(t&0-t)+-1|0;h=j>>>12&16;s=j>>>h;j=s>>>5&8;n=s>>>j;s=n>>>2&4;m=n>>>s;n=m>>>1&2;f=m>>>n;m=f>>>1&1;i=c[9104+((j|h|s|n|m)+(f>>>m)<<2)>>2]|0;m=(c[i+4>>2]&-8)-e|0;f=c[i+16+(((c[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){y=m;z=i}else{n=f;f=m;m=i;while(1){i=(c[n+4>>2]&-8)-e|0;s=i>>>0<f>>>0;h=s?i:f;i=s?n:m;n=c[n+16+(((c[n+16>>2]|0)==0&1)<<2)>>2]|0;if(!n){y=h;z=i;break}else{f=h;m=i}}}m=c[2204]|0;if(z>>>0<m>>>0)ma();f=z+e|0;if(z>>>0>=f>>>0)ma();n=c[z+24>>2]|0;p=c[z+12>>2]|0;do if((p|0)==(z|0)){r=z+20|0;u=c[r>>2]|0;if(!u){i=z+16|0;h=c[i>>2]|0;if(!h){A=0;break}else{B=h;C=i}}else{B=u;C=r}while(1){r=B+20|0;u=c[r>>2]|0;if(u|0){B=u;C=r;continue}r=B+16|0;u=c[r>>2]|0;if(!u)break;else{B=u;C=r}}if(C>>>0<m>>>0)ma();else{c[C>>2]=0;A=B;break}}else{r=c[z+8>>2]|0;if(r>>>0<m>>>0)ma();u=r+12|0;if((c[u>>2]|0)!=(z|0))ma();i=p+8|0;if((c[i>>2]|0)==(z|0)){c[u>>2]=p;c[i>>2]=r;A=p;break}else ma()}while(0);a:do if(n|0){p=c[z+28>>2]|0;m=9104+(p<<2)|0;do if((z|0)==(c[m>>2]|0)){c[m>>2]=A;if(!A){c[2201]=t&~(1<<p);break a}}else if(n>>>0>=(c[2204]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(z|0)&1)<<2)>>2]=A;if(!A)break a;else break}else ma();while(0);p=c[2204]|0;if(A>>>0<p>>>0)ma();c[A+24>>2]=n;m=c[z+16>>2]|0;do if(m|0)if(m>>>0<p>>>0)ma();else{c[A+16>>2]=m;c[m+24>>2]=A;break}while(0);m=c[z+20>>2]|0;if(m|0)if(m>>>0<(c[2204]|0)>>>0)ma();else{c[A+20>>2]=m;c[m+24>>2]=A;break}}while(0);if(y>>>0<16){n=y+e|0;c[z+4>>2]=n|3;t=z+n+4|0;c[t>>2]=c[t>>2]|1}else{c[z+4>>2]=e|3;c[f+4>>2]=y|1;c[f+y>>2]=y;if(k|0){t=c[2205]|0;n=k>>>3;m=8840+(n<<1<<2)|0;p=1<<n;if(g&p){n=m+8|0;r=c[n>>2]|0;if(r>>>0<(c[2204]|0)>>>0)ma();else{D=n;E=r}}else{c[2200]=g|p;D=m+8|0;E=m}c[D>>2]=t;c[E+12>>2]=t;c[t+8>>2]=E;c[t+12>>2]=m}c[2202]=y;c[2205]=f}q=z+8|0;l=b;return q|0}else F=e}else F=e}else if(a>>>0<=4294967231){m=a+11|0;t=m&-8;p=c[2201]|0;if(p){r=0-t|0;n=m>>>8;if(n)if(t>>>0>16777215)G=31;else{m=(n+1048320|0)>>>16&8;i=n<<m;n=(i+520192|0)>>>16&4;u=i<<n;i=(u+245760|0)>>>16&2;h=14-(n|m|i)+(u<<i>>>15)|0;G=t>>>(h+7|0)&1|h<<1}else G=0;h=c[9104+(G<<2)>>2]|0;b:do if(!h){H=r;I=0;J=0;K=81}else{i=r;u=0;m=t<<((G|0)==31?0:25-(G>>>1)|0);n=h;s=0;while(1){j=(c[n+4>>2]&-8)-t|0;if(j>>>0<i>>>0)if(!j){L=0;M=n;N=n;K=85;break b}else{O=j;P=n}else{O=i;P=s}j=c[n+20>>2]|0;n=c[n+16+(m>>>31<<2)>>2]|0;o=(j|0)==0|(j|0)==(n|0)?u:j;j=(n|0)==0;if(j){H=O;I=o;J=P;K=81;break}else{i=O;u=o;m=m<<((j^1)&1);s=P}}}while(0);if((K|0)==81){if((I|0)==0&(J|0)==0){h=2<<G;r=p&(h|0-h);if(!r){F=t;break}h=(r&0-r)+-1|0;r=h>>>12&16;e=h>>>r;h=e>>>5&8;f=e>>>h;e=f>>>2&4;g=f>>>e;f=g>>>1&2;k=g>>>f;g=k>>>1&1;Q=c[9104+((h|r|e|f|g)+(k>>>g)<<2)>>2]|0;R=0}else{Q=I;R=J}if(!Q){S=H;T=R}else{L=H;M=Q;N=R;K=85}}if((K|0)==85)while(1){K=0;g=(c[M+4>>2]&-8)-t|0;k=g>>>0<L>>>0;f=k?g:L;g=k?M:N;M=c[M+16+(((c[M+16>>2]|0)==0&1)<<2)>>2]|0;if(!M){S=f;T=g;break}else{L=f;N=g;K=85}}if((T|0)!=0?S>>>0<((c[2202]|0)-t|0)>>>0:0){g=c[2204]|0;if(T>>>0<g>>>0)ma();f=T+t|0;if(T>>>0>=f>>>0)ma();k=c[T+24>>2]|0;e=c[T+12>>2]|0;do if((e|0)==(T|0)){r=T+20|0;h=c[r>>2]|0;if(!h){s=T+16|0;m=c[s>>2]|0;if(!m){U=0;break}else{V=m;W=s}}else{V=h;W=r}while(1){r=V+20|0;h=c[r>>2]|0;if(h|0){V=h;W=r;continue}r=V+16|0;h=c[r>>2]|0;if(!h)break;else{V=h;W=r}}if(W>>>0<g>>>0)ma();else{c[W>>2]=0;U=V;break}}else{r=c[T+8>>2]|0;if(r>>>0<g>>>0)ma();h=r+12|0;if((c[h>>2]|0)!=(T|0))ma();s=e+8|0;if((c[s>>2]|0)==(T|0)){c[h>>2]=e;c[s>>2]=r;U=e;break}else ma()}while(0);c:do if(k){e=c[T+28>>2]|0;g=9104+(e<<2)|0;do if((T|0)==(c[g>>2]|0)){c[g>>2]=U;if(!U){r=p&~(1<<e);c[2201]=r;X=r;break c}}else if(k>>>0>=(c[2204]|0)>>>0){c[k+16+(((c[k+16>>2]|0)!=(T|0)&1)<<2)>>2]=U;if(!U){X=p;break c}else break}else ma();while(0);e=c[2204]|0;if(U>>>0<e>>>0)ma();c[U+24>>2]=k;g=c[T+16>>2]|0;do if(g|0)if(g>>>0<e>>>0)ma();else{c[U+16>>2]=g;c[g+24>>2]=U;break}while(0);g=c[T+20>>2]|0;if(g)if(g>>>0<(c[2204]|0)>>>0)ma();else{c[U+20>>2]=g;c[g+24>>2]=U;X=p;break}else X=p}else X=p;while(0);do if(S>>>0>=16){c[T+4>>2]=t|3;c[f+4>>2]=S|1;c[f+S>>2]=S;p=S>>>3;if(S>>>0<256){k=8840+(p<<1<<2)|0;g=c[2200]|0;e=1<<p;if(g&e){p=k+8|0;r=c[p>>2]|0;if(r>>>0<(c[2204]|0)>>>0)ma();else{Y=p;Z=r}}else{c[2200]=g|e;Y=k+8|0;Z=k}c[Y>>2]=f;c[Z+12>>2]=f;c[f+8>>2]=Z;c[f+12>>2]=k;break}k=S>>>8;if(k)if(S>>>0>16777215)_=31;else{e=(k+1048320|0)>>>16&8;g=k<<e;k=(g+520192|0)>>>16&4;r=g<<k;g=(r+245760|0)>>>16&2;p=14-(k|e|g)+(r<<g>>>15)|0;_=S>>>(p+7|0)&1|p<<1}else _=0;p=9104+(_<<2)|0;c[f+28>>2]=_;g=f+16|0;c[g+4>>2]=0;c[g>>2]=0;g=1<<_;if(!(X&g)){c[2201]=X|g;c[p>>2]=f;c[f+24>>2]=p;c[f+12>>2]=f;c[f+8>>2]=f;break}g=S<<((_|0)==31?0:25-(_>>>1)|0);r=c[p>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(S|0)){K=139;break}$=r+16+(g>>>31<<2)|0;p=c[$>>2]|0;if(!p){K=136;break}else{g=g<<1;r=p}}if((K|0)==136)if($>>>0<(c[2204]|0)>>>0)ma();else{c[$>>2]=f;c[f+24>>2]=r;c[f+12>>2]=f;c[f+8>>2]=f;break}else if((K|0)==139){g=r+8|0;p=c[g>>2]|0;e=c[2204]|0;if(p>>>0>=e>>>0&r>>>0>=e>>>0){c[p+12>>2]=f;c[g>>2]=f;c[f+8>>2]=p;c[f+12>>2]=r;c[f+24>>2]=0;break}else ma()}}else{p=S+t|0;c[T+4>>2]=p|3;g=T+p+4|0;c[g>>2]=c[g>>2]|1}while(0);q=T+8|0;l=b;return q|0}else F=t}else F=t}else F=-1;while(0);T=c[2202]|0;if(T>>>0>=F>>>0){S=T-F|0;$=c[2205]|0;if(S>>>0>15){_=$+F|0;c[2205]=_;c[2202]=S;c[_+4>>2]=S|1;c[_+S>>2]=S;c[$+4>>2]=F|3}else{c[2202]=0;c[2205]=0;c[$+4>>2]=T|3;S=$+T+4|0;c[S>>2]=c[S>>2]|1}q=$+8|0;l=b;return q|0}$=c[2203]|0;if($>>>0>F>>>0){S=$-F|0;c[2203]=S;T=c[2206]|0;_=T+F|0;c[2206]=_;c[_+4>>2]=S|1;c[T+4>>2]=F|3;q=T+8|0;l=b;return q|0}if(!(c[2318]|0)){c[2320]=4096;c[2319]=4096;c[2321]=-1;c[2322]=-1;c[2323]=0;c[2311]=0;T=d&-16^1431655768;c[d>>2]=T;c[2318]=T;aa=4096}else aa=c[2320]|0;T=F+48|0;d=F+47|0;S=aa+d|0;_=0-aa|0;aa=S&_;if(aa>>>0<=F>>>0){q=0;l=b;return q|0}X=c[2310]|0;if(X|0?(Z=c[2308]|0,Y=Z+aa|0,Y>>>0<=Z>>>0|Y>>>0>X>>>0):0){q=0;l=b;return q|0}d:do if(!(c[2311]&4)){X=c[2206]|0;e:do if(X){Y=9248;while(1){Z=c[Y>>2]|0;if(Z>>>0<=X>>>0?(ba=Y+4|0,(Z+(c[ba>>2]|0)|0)>>>0>X>>>0):0)break;Z=c[Y+8>>2]|0;if(!Z){K=163;break e}else Y=Z}r=S-$&_;if(r>>>0<2147483647){Z=se(r|0)|0;if((Z|0)==((c[Y>>2]|0)+(c[ba>>2]|0)|0))if((Z|0)==(-1|0))ca=r;else{da=Z;ea=r;K=180;break d}else{fa=Z;ga=r;K=171}}else ca=0}else K=163;while(0);do if((K|0)==163){X=se(0)|0;if((X|0)!=(-1|0)?(t=X,r=c[2319]|0,Z=r+-1|0,U=((Z&t|0)==0?0:(Z+t&0-r)-t|0)+aa|0,t=c[2308]|0,r=U+t|0,U>>>0>F>>>0&U>>>0<2147483647):0){Z=c[2310]|0;if(Z|0?r>>>0<=t>>>0|r>>>0>Z>>>0:0){ca=0;break}Z=se(U|0)|0;if((Z|0)==(X|0)){da=X;ea=U;K=180;break d}else{fa=Z;ga=U;K=171}}else ca=0}while(0);do if((K|0)==171){U=0-ga|0;if(!(T>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=fa;ea=ga;K=180;break d}Z=c[2320]|0;X=d-ga+Z&0-Z;if(X>>>0>=2147483647){da=fa;ea=ga;K=180;break d}if((se(X|0)|0)==(-1|0)){se(U|0)|0;ca=0;break}else{da=fa;ea=X+ga|0;K=180;break d}}while(0);c[2311]=c[2311]|4;ha=ca;K=178}else{ha=0;K=178}while(0);if(((K|0)==178?aa>>>0<2147483647:0)?(ca=se(aa|0)|0,aa=se(0)|0,ga=aa-ca|0,fa=ga>>>0>(F+40|0)>>>0,!((ca|0)==(-1|0)|fa^1|ca>>>0<aa>>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ca;ea=fa?ga:ha;K=180}if((K|0)==180){ha=(c[2308]|0)+ea|0;c[2308]=ha;if(ha>>>0>(c[2309]|0)>>>0)c[2309]=ha;ha=c[2206]|0;do if(ha){ga=9248;while(1){ia=c[ga>>2]|0;ja=ga+4|0;ka=c[ja>>2]|0;if((da|0)==(ia+ka|0)){K=190;break}fa=c[ga+8>>2]|0;if(!fa)break;else ga=fa}if(((K|0)==190?(c[ga+12>>2]&8|0)==0:0)?ha>>>0<da>>>0&ha>>>0>=ia>>>0:0){c[ja>>2]=ka+ea;fa=ha+8|0;ca=(fa&7|0)==0?0:0-fa&7;fa=ha+ca|0;aa=(c[2203]|0)+(ea-ca)|0;c[2206]=fa;c[2203]=aa;c[fa+4>>2]=aa|1;c[fa+aa+4>>2]=40;c[2207]=c[2322];break}aa=c[2204]|0;if(da>>>0<aa>>>0){c[2204]=da;la=da}else la=aa;aa=da+ea|0;fa=9248;while(1){if((c[fa>>2]|0)==(aa|0)){K=198;break}ca=c[fa+8>>2]|0;if(!ca)break;else fa=ca}if((K|0)==198?(c[fa+12>>2]&8|0)==0:0){c[fa>>2]=da;ga=fa+4|0;c[ga>>2]=(c[ga>>2]|0)+ea;ga=da+8|0;ca=da+((ga&7|0)==0?0:0-ga&7)|0;ga=aa+8|0;d=aa+((ga&7|0)==0?0:0-ga&7)|0;ga=ca+F|0;T=d-ca-F|0;c[ca+4>>2]=F|3;do if((d|0)!=(ha|0)){if((d|0)==(c[2205]|0)){ba=(c[2202]|0)+T|0;c[2202]=ba;c[2205]=ga;c[ga+4>>2]=ba|1;c[ga+ba>>2]=ba;break}ba=c[d+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;f:do if(ba>>>0>=256){S=c[d+24>>2]|0;X=c[d+12>>2]|0;do if((X|0)==(d|0)){U=d+16|0;Z=U+4|0;r=c[Z>>2]|0;if(!r){t=c[U>>2]|0;if(!t){na=0;break}else{oa=t;pa=U}}else{oa=r;pa=Z}while(1){Z=oa+20|0;r=c[Z>>2]|0;if(r|0){oa=r;pa=Z;continue}Z=oa+16|0;r=c[Z>>2]|0;if(!r)break;else{oa=r;pa=Z}}if(pa>>>0<la>>>0)ma();else{c[pa>>2]=0;na=oa;break}}else{Z=c[d+8>>2]|0;if(Z>>>0<la>>>0)ma();r=Z+12|0;if((c[r>>2]|0)!=(d|0))ma();U=X+8|0;if((c[U>>2]|0)==(d|0)){c[r>>2]=X;c[U>>2]=Z;na=X;break}else ma()}while(0);if(!S)break;X=c[d+28>>2]|0;Z=9104+(X<<2)|0;do if((d|0)!=(c[Z>>2]|0))if(S>>>0>=(c[2204]|0)>>>0){c[S+16+(((c[S+16>>2]|0)!=(d|0)&1)<<2)>>2]=na;if(!na)break f;else break}else ma();else{c[Z>>2]=na;if(na|0)break;c[2201]=c[2201]&~(1<<X);break f}while(0);X=c[2204]|0;if(na>>>0<X>>>0)ma();c[na+24>>2]=S;Z=d+16|0;U=c[Z>>2]|0;do if(U|0)if(U>>>0<X>>>0)ma();else{c[na+16>>2]=U;c[U+24>>2]=na;break}while(0);U=c[Z+4>>2]|0;if(!U)break;if(U>>>0<(c[2204]|0)>>>0)ma();else{c[na+20>>2]=U;c[U+24>>2]=na;break}}else{U=c[d+8>>2]|0;X=c[d+12>>2]|0;S=8840+($<<1<<2)|0;do if((U|0)!=(S|0)){if(U>>>0<la>>>0)ma();if((c[U+12>>2]|0)==(d|0))break;ma()}while(0);if((X|0)==(U|0)){c[2200]=c[2200]&~(1<<$);break}do if((X|0)==(S|0))qa=X+8|0;else{if(X>>>0<la>>>0)ma();Z=X+8|0;if((c[Z>>2]|0)==(d|0)){qa=Z;break}ma()}while(0);c[U+12>>2]=X;c[qa>>2]=U}while(0);ra=d+_|0;sa=_+T|0}else{ra=d;sa=T}$=ra+4|0;c[$>>2]=c[$>>2]&-2;c[ga+4>>2]=sa|1;c[ga+sa>>2]=sa;$=sa>>>3;if(sa>>>0<256){ba=8840+($<<1<<2)|0;Y=c[2200]|0;S=1<<$;do if(!(Y&S)){c[2200]=Y|S;ta=ba+8|0;ua=ba}else{$=ba+8|0;Z=c[$>>2]|0;if(Z>>>0>=(c[2204]|0)>>>0){ta=$;ua=Z;break}ma()}while(0);c[ta>>2]=ga;c[ua+12>>2]=ga;c[ga+8>>2]=ua;c[ga+12>>2]=ba;break}S=sa>>>8;do if(!S)va=0;else{if(sa>>>0>16777215){va=31;break}Y=(S+1048320|0)>>>16&8;_=S<<Y;Z=(_+520192|0)>>>16&4;$=_<<Z;_=($+245760|0)>>>16&2;r=14-(Z|Y|_)+($<<_>>>15)|0;va=sa>>>(r+7|0)&1|r<<1}while(0);S=9104+(va<<2)|0;c[ga+28>>2]=va;ba=ga+16|0;c[ba+4>>2]=0;c[ba>>2]=0;ba=c[2201]|0;r=1<<va;if(!(ba&r)){c[2201]=ba|r;c[S>>2]=ga;c[ga+24>>2]=S;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}r=sa<<((va|0)==31?0:25-(va>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(sa|0)){K=265;break}wa=ba+16+(r>>>31<<2)|0;S=c[wa>>2]|0;if(!S){K=262;break}else{r=r<<1;ba=S}}if((K|0)==262)if(wa>>>0<(c[2204]|0)>>>0)ma();else{c[wa>>2]=ga;c[ga+24>>2]=ba;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}else if((K|0)==265){r=ba+8|0;S=c[r>>2]|0;_=c[2204]|0;if(S>>>0>=_>>>0&ba>>>0>=_>>>0){c[S+12>>2]=ga;c[r>>2]=ga;c[ga+8>>2]=S;c[ga+12>>2]=ba;c[ga+24>>2]=0;break}else ma()}}else{S=(c[2203]|0)+T|0;c[2203]=S;c[2206]=ga;c[ga+4>>2]=S|1}while(0);q=ca+8|0;l=b;return q|0}ga=9248;while(1){T=c[ga>>2]|0;if(T>>>0<=ha>>>0?(xa=T+(c[ga+4>>2]|0)|0,xa>>>0>ha>>>0):0)break;ga=c[ga+8>>2]|0}ga=xa+-47|0;ca=ga+8|0;T=ga+((ca&7|0)==0?0:0-ca&7)|0;ca=ha+16|0;ga=T>>>0<ca>>>0?ha:T;T=ga+8|0;d=da+8|0;aa=(d&7|0)==0?0:0-d&7;d=da+aa|0;fa=ea+-40-aa|0;c[2206]=d;c[2203]=fa;c[d+4>>2]=fa|1;c[d+fa+4>>2]=40;c[2207]=c[2322];fa=ga+4|0;c[fa>>2]=27;c[T>>2]=c[2312];c[T+4>>2]=c[2313];c[T+8>>2]=c[2314];c[T+12>>2]=c[2315];c[2312]=da;c[2313]=ea;c[2315]=0;c[2314]=T;T=ga+24|0;do{d=T;T=T+4|0;c[T>>2]=7}while((d+8|0)>>>0<xa>>>0);if((ga|0)!=(ha|0)){T=ga-ha|0;c[fa>>2]=c[fa>>2]&-2;c[ha+4>>2]=T|1;c[ga>>2]=T;d=T>>>3;if(T>>>0<256){aa=8840+(d<<1<<2)|0;S=c[2200]|0;r=1<<d;if(S&r){d=aa+8|0;_=c[d>>2]|0;if(_>>>0<(c[2204]|0)>>>0)ma();else{ya=d;za=_}}else{c[2200]=S|r;ya=aa+8|0;za=aa}c[ya>>2]=ha;c[za+12>>2]=ha;c[ha+8>>2]=za;c[ha+12>>2]=aa;break}aa=T>>>8;if(aa)if(T>>>0>16777215)Aa=31;else{r=(aa+1048320|0)>>>16&8;S=aa<<r;aa=(S+520192|0)>>>16&4;_=S<<aa;S=(_+245760|0)>>>16&2;d=14-(aa|r|S)+(_<<S>>>15)|0;Aa=T>>>(d+7|0)&1|d<<1}else Aa=0;d=9104+(Aa<<2)|0;c[ha+28>>2]=Aa;c[ha+20>>2]=0;c[ca>>2]=0;S=c[2201]|0;_=1<<Aa;if(!(S&_)){c[2201]=S|_;c[d>>2]=ha;c[ha+24>>2]=d;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}_=T<<((Aa|0)==31?0:25-(Aa>>>1)|0);S=c[d>>2]|0;while(1){if((c[S+4>>2]&-8|0)==(T|0)){K=292;break}Ba=S+16+(_>>>31<<2)|0;d=c[Ba>>2]|0;if(!d){K=289;break}else{_=_<<1;S=d}}if((K|0)==289)if(Ba>>>0<(c[2204]|0)>>>0)ma();else{c[Ba>>2]=ha;c[ha+24>>2]=S;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}else if((K|0)==292){_=S+8|0;T=c[_>>2]|0;ca=c[2204]|0;if(T>>>0>=ca>>>0&S>>>0>=ca>>>0){c[T+12>>2]=ha;c[_>>2]=ha;c[ha+8>>2]=T;c[ha+12>>2]=S;c[ha+24>>2]=0;break}else ma()}}}else{T=c[2204]|0;if((T|0)==0|da>>>0<T>>>0)c[2204]=da;c[2312]=da;c[2313]=ea;c[2315]=0;c[2209]=c[2318];c[2208]=-1;T=0;do{_=8840+(T<<1<<2)|0;c[_+12>>2]=_;c[_+8>>2]=_;T=T+1|0}while((T|0)!=32);T=da+8|0;S=(T&7|0)==0?0:0-T&7;T=da+S|0;_=ea+-40-S|0;c[2206]=T;c[2203]=_;c[T+4>>2]=_|1;c[T+_+4>>2]=40;c[2207]=c[2322]}while(0);ea=c[2203]|0;if(ea>>>0>F>>>0){da=ea-F|0;c[2203]=da;ea=c[2206]|0;ha=ea+F|0;c[2206]=ha;c[ha+4>>2]=da|1;c[ea+4>>2]=F|3;q=ea+8|0;l=b;return q|0}}c[(nd()|0)>>2]=12;q=0;l=b;return q|0}function ce(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;if(!a)return;b=a+-8|0;d=c[2204]|0;if(b>>>0<d>>>0)ma();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)ma();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(!a)return;i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)ma();if((i|0)==(c[2205]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;break}c[2202]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;return}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;p=8840+(l<<1<<2)|0;if((h|0)!=(p|0)){if(h>>>0<d>>>0)ma();if((c[h+12>>2]|0)!=(i|0))ma()}if((k|0)==(h|0)){c[2200]=c[2200]&~(1<<l);m=i;n=i;o=j;break}if((k|0)!=(p|0)){if(k>>>0<d>>>0)ma();p=k+8|0;if((c[p>>2]|0)==(i|0))q=p;else ma()}else q=k+8|0;c[h+12>>2]=k;c[q>>2]=h;m=i;n=i;o=j;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){p=i+16|0;l=p+4|0;r=c[l>>2]|0;if(!r){s=c[p>>2]|0;if(!s){t=0;break}else{u=s;v=p}}else{u=r;v=l}while(1){l=u+20|0;r=c[l>>2]|0;if(r|0){u=r;v=l;continue}l=u+16|0;r=c[l>>2]|0;if(!r)break;else{u=r;v=l}}if(v>>>0<d>>>0)ma();else{c[v>>2]=0;t=u;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)ma();r=l+12|0;if((c[r>>2]|0)!=(i|0))ma();p=k+8|0;if((c[p>>2]|0)==(i|0)){c[r>>2]=k;c[p>>2]=l;t=k;break}else ma()}while(0);if(h){k=c[i+28>>2]|0;l=9104+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=t;if(!t){c[2201]=c[2201]&~(1<<k);m=i;n=i;o=j;break a}}else if(h>>>0>=(c[2204]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=t;if(!t){m=i;n=i;o=j;break a}else break}else ma();while(0);k=c[2204]|0;if(t>>>0<k>>>0)ma();c[t+24>>2]=h;l=i+16|0;p=c[l>>2]|0;do if(p|0)if(p>>>0<k>>>0)ma();else{c[t+16>>2]=p;c[p+24>>2]=t;break}while(0);p=c[l+4>>2]|0;if(p)if(p>>>0<(c[2204]|0)>>>0)ma();else{c[t+20>>2]=p;c[p+24>>2]=t;m=i;n=i;o=j;break}else{m=i;n=i;o=j}}else{m=i;n=i;o=j}}else{m=b;n=b;o=f}while(0);if(m>>>0>=g>>>0)ma();f=g+4|0;b=c[f>>2]|0;if(!(b&1))ma();if(!(b&2)){t=c[2205]|0;if((g|0)==(c[2206]|0)){d=(c[2203]|0)+o|0;c[2203]=d;c[2206]=n;c[n+4>>2]=d|1;if((n|0)!=(t|0))return;c[2205]=0;c[2202]=0;return}if((g|0)==(t|0)){t=(c[2202]|0)+o|0;c[2202]=t;c[2205]=m;c[n+4>>2]=t|1;c[m+t>>2]=t;return}t=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){u=c[g+24>>2]|0;v=c[g+12>>2]|0;do if((v|0)==(g|0)){q=g+16|0;a=q+4|0;e=c[a>>2]|0;if(!e){p=c[q>>2]|0;if(!p){w=0;break}else{x=p;y=q}}else{x=e;y=a}while(1){a=x+20|0;e=c[a>>2]|0;if(e|0){x=e;y=a;continue}a=x+16|0;e=c[a>>2]|0;if(!e)break;else{x=e;y=a}}if(y>>>0<(c[2204]|0)>>>0)ma();else{c[y>>2]=0;w=x;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[2204]|0)>>>0)ma();e=a+12|0;if((c[e>>2]|0)!=(g|0))ma();q=v+8|0;if((c[q>>2]|0)==(g|0)){c[e>>2]=v;c[q>>2]=a;w=v;break}else ma()}while(0);if(u|0){v=c[g+28>>2]|0;j=9104+(v<<2)|0;do if((g|0)==(c[j>>2]|0)){c[j>>2]=w;if(!w){c[2201]=c[2201]&~(1<<v);break b}}else if(u>>>0>=(c[2204]|0)>>>0){c[u+16+(((c[u+16>>2]|0)!=(g|0)&1)<<2)>>2]=w;if(!w)break b;else break}else ma();while(0);v=c[2204]|0;if(w>>>0<v>>>0)ma();c[w+24>>2]=u;j=g+16|0;i=c[j>>2]|0;do if(i|0)if(i>>>0<v>>>0)ma();else{c[w+16>>2]=i;c[i+24>>2]=w;break}while(0);i=c[j+4>>2]|0;if(i|0)if(i>>>0<(c[2204]|0)>>>0)ma();else{c[w+20>>2]=i;c[i+24>>2]=w;break}}}else{i=c[g+8>>2]|0;v=c[g+12>>2]|0;u=8840+(d<<1<<2)|0;if((i|0)!=(u|0)){if(i>>>0<(c[2204]|0)>>>0)ma();if((c[i+12>>2]|0)!=(g|0))ma()}if((v|0)==(i|0)){c[2200]=c[2200]&~(1<<d);break}if((v|0)!=(u|0)){if(v>>>0<(c[2204]|0)>>>0)ma();u=v+8|0;if((c[u>>2]|0)==(g|0))z=u;else ma()}else z=v+8|0;c[i+12>>2]=v;c[z>>2]=i}while(0);c[n+4>>2]=t|1;c[m+t>>2]=t;if((n|0)==(c[2205]|0)){c[2202]=t;return}else A=t}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;A=o}o=A>>>3;if(A>>>0<256){m=8840+(o<<1<<2)|0;b=c[2200]|0;f=1<<o;if(b&f){o=m+8|0;t=c[o>>2]|0;if(t>>>0<(c[2204]|0)>>>0)ma();else{B=o;C=t}}else{c[2200]=b|f;B=m+8|0;C=m}c[B>>2]=n;c[C+12>>2]=n;c[n+8>>2]=C;c[n+12>>2]=m;return}m=A>>>8;if(m)if(A>>>0>16777215)D=31;else{C=(m+1048320|0)>>>16&8;B=m<<C;m=(B+520192|0)>>>16&4;f=B<<m;B=(f+245760|0)>>>16&2;b=14-(m|C|B)+(f<<B>>>15)|0;D=A>>>(b+7|0)&1|b<<1}else D=0;b=9104+(D<<2)|0;c[n+28>>2]=D;c[n+20>>2]=0;c[n+16>>2]=0;B=c[2201]|0;f=1<<D;do if(B&f){C=A<<((D|0)==31?0:25-(D>>>1)|0);m=c[b>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(A|0)){E=124;break}F=m+16+(C>>>31<<2)|0;t=c[F>>2]|0;if(!t){E=121;break}else{C=C<<1;m=t}}if((E|0)==121)if(F>>>0<(c[2204]|0)>>>0)ma();else{c[F>>2]=n;c[n+24>>2]=m;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((E|0)==124){C=m+8|0;j=c[C>>2]|0;t=c[2204]|0;if(j>>>0>=t>>>0&m>>>0>=t>>>0){c[j+12>>2]=n;c[C>>2]=n;c[n+8>>2]=j;c[n+12>>2]=m;c[n+24>>2]=0;break}else ma()}}else{c[2201]=B|f;c[b>>2]=n;c[n+24>>2]=b;c[n+12>>2]=n;c[n+8>>2]=n}while(0);n=(c[2208]|0)+-1|0;c[2208]=n;if(!n)G=9256;else return;while(1){n=c[G>>2]|0;if(!n)break;else G=n+8|0}c[2208]=-1;return}function de(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a){d=be(b)|0;return d|0}if(b>>>0>4294967231){c[(nd()|0)>>2]=12;d=0;return d|0}e=ee(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(e|0){d=e+8|0;return d|0}e=be(b)|0;if(!e){d=0;return d|0}f=c[a+-4>>2]|0;g=(f&-8)-((f&3|0)==0?8:4)|0;oe(e|0,a|0,(g>>>0<b>>>0?g:b)|0)|0;ce(a);d=e;return d|0}function ee(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a+f|0;h=c[2204]|0;i=e&3;if(!((i|0)!=1&a>>>0>=h>>>0&a>>>0<g>>>0))ma();j=c[g+4>>2]|0;if(!(j&1))ma();if(!i){if(b>>>0<256){k=0;return k|0}if(f>>>0>=(b+4|0)>>>0?(f-b|0)>>>0<=c[2320]<<1>>>0:0){k=a;return k|0}k=0;return k|0}if(f>>>0>=b>>>0){i=f-b|0;if(i>>>0<=15){k=a;return k|0}l=a+b|0;c[d>>2]=e&1|b|2;c[l+4>>2]=i|3;m=l+i+4|0;c[m>>2]=c[m>>2]|1;fe(l,i);k=a;return k|0}if((g|0)==(c[2206]|0)){i=(c[2203]|0)+f|0;l=i-b|0;m=a+b|0;if(i>>>0<=b>>>0){k=0;return k|0}c[d>>2]=e&1|b|2;c[m+4>>2]=l|1;c[2206]=m;c[2203]=l;k=a;return k|0}if((g|0)==(c[2205]|0)){l=(c[2202]|0)+f|0;if(l>>>0<b>>>0){k=0;return k|0}m=l-b|0;i=e&1;if(m>>>0>15){n=a+b|0;o=n+m|0;c[d>>2]=i|b|2;c[n+4>>2]=m|1;c[o>>2]=m;p=o+4|0;c[p>>2]=c[p>>2]&-2;q=n;r=m}else{c[d>>2]=i|l|2;i=a+l+4|0;c[i>>2]=c[i>>2]|1;q=0;r=0}c[2202]=r;c[2205]=q;k=a;return k|0}if(j&2|0){k=0;return k|0}q=(j&-8)+f|0;if(q>>>0<b>>>0){k=0;return k|0}f=q-b|0;r=j>>>3;a:do if(j>>>0>=256){i=c[g+24>>2]|0;l=c[g+12>>2]|0;do if((l|0)==(g|0)){m=g+16|0;n=m+4|0;p=c[n>>2]|0;if(!p){o=c[m>>2]|0;if(!o){s=0;break}else{t=o;u=m}}else{t=p;u=n}while(1){n=t+20|0;p=c[n>>2]|0;if(p|0){t=p;u=n;continue}n=t+16|0;p=c[n>>2]|0;if(!p)break;else{t=p;u=n}}if(u>>>0<h>>>0)ma();else{c[u>>2]=0;s=t;break}}else{n=c[g+8>>2]|0;if(n>>>0<h>>>0)ma();p=n+12|0;if((c[p>>2]|0)!=(g|0))ma();m=l+8|0;if((c[m>>2]|0)==(g|0)){c[p>>2]=l;c[m>>2]=n;s=l;break}else ma()}while(0);if(i|0){l=c[g+28>>2]|0;n=9104+(l<<2)|0;do if((g|0)==(c[n>>2]|0)){c[n>>2]=s;if(!s){c[2201]=c[2201]&~(1<<l);break a}}else if(i>>>0>=(c[2204]|0)>>>0){c[i+16+(((c[i+16>>2]|0)!=(g|0)&1)<<2)>>2]=s;if(!s)break a;else break}else ma();while(0);l=c[2204]|0;if(s>>>0<l>>>0)ma();c[s+24>>2]=i;n=g+16|0;m=c[n>>2]|0;do if(m|0)if(m>>>0<l>>>0)ma();else{c[s+16>>2]=m;c[m+24>>2]=s;break}while(0);m=c[n+4>>2]|0;if(m|0)if(m>>>0<(c[2204]|0)>>>0)ma();else{c[s+20>>2]=m;c[m+24>>2]=s;break}}}else{m=c[g+8>>2]|0;l=c[g+12>>2]|0;i=8840+(r<<1<<2)|0;if((m|0)!=(i|0)){if(m>>>0<h>>>0)ma();if((c[m+12>>2]|0)!=(g|0))ma()}if((l|0)==(m|0)){c[2200]=c[2200]&~(1<<r);break}if((l|0)!=(i|0)){if(l>>>0<h>>>0)ma();i=l+8|0;if((c[i>>2]|0)==(g|0))v=i;else ma()}else v=l+8|0;c[m+12>>2]=l;c[v>>2]=m}while(0);v=e&1;if(f>>>0<16){c[d>>2]=q|v|2;e=a+q+4|0;c[e>>2]=c[e>>2]|1;k=a;return k|0}else{e=a+b|0;c[d>>2]=v|b|2;c[e+4>>2]=f|3;b=e+f+4|0;c[b>>2]=c[b>>2]|1;fe(e,f);k=a;return k|0}return 0}function fe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=a+b|0;e=c[a+4>>2]|0;a:do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;i=c[2204]|0;if(g>>>0<i>>>0)ma();if((g|0)==(c[2205]|0)){j=d+4|0;k=c[j>>2]|0;if((k&3|0)!=3){l=g;m=h;break}c[2202]=h;c[j>>2]=k&-2;c[g+4>>2]=h|1;c[g+h>>2]=h;return}k=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;j=c[g+12>>2]|0;n=8840+(k<<1<<2)|0;if((f|0)!=(n|0)){if(f>>>0<i>>>0)ma();if((c[f+12>>2]|0)!=(g|0))ma()}if((j|0)==(f|0)){c[2200]=c[2200]&~(1<<k);l=g;m=h;break}if((j|0)!=(n|0)){if(j>>>0<i>>>0)ma();n=j+8|0;if((c[n>>2]|0)==(g|0))o=n;else ma()}else o=j+8|0;c[f+12>>2]=j;c[o>>2]=f;l=g;m=h;break}f=c[g+24>>2]|0;j=c[g+12>>2]|0;do if((j|0)==(g|0)){n=g+16|0;k=n+4|0;p=c[k>>2]|0;if(!p){q=c[n>>2]|0;if(!q){r=0;break}else{s=q;t=n}}else{s=p;t=k}while(1){k=s+20|0;p=c[k>>2]|0;if(p|0){s=p;t=k;continue}k=s+16|0;p=c[k>>2]|0;if(!p)break;else{s=p;t=k}}if(t>>>0<i>>>0)ma();else{c[t>>2]=0;r=s;break}}else{k=c[g+8>>2]|0;if(k>>>0<i>>>0)ma();p=k+12|0;if((c[p>>2]|0)!=(g|0))ma();n=j+8|0;if((c[n>>2]|0)==(g|0)){c[p>>2]=j;c[n>>2]=k;r=j;break}else ma()}while(0);if(f){j=c[g+28>>2]|0;i=9104+(j<<2)|0;do if((g|0)==(c[i>>2]|0)){c[i>>2]=r;if(!r){c[2201]=c[2201]&~(1<<j);l=g;m=h;break a}}else if(f>>>0>=(c[2204]|0)>>>0){c[f+16+(((c[f+16>>2]|0)!=(g|0)&1)<<2)>>2]=r;if(!r){l=g;m=h;break a}else break}else ma();while(0);j=c[2204]|0;if(r>>>0<j>>>0)ma();c[r+24>>2]=f;i=g+16|0;k=c[i>>2]|0;do if(k|0)if(k>>>0<j>>>0)ma();else{c[r+16>>2]=k;c[k+24>>2]=r;break}while(0);k=c[i+4>>2]|0;if(k)if(k>>>0<(c[2204]|0)>>>0)ma();else{c[r+20>>2]=k;c[k+24>>2]=r;l=g;m=h;break}else{l=g;m=h}}else{l=g;m=h}}else{l=a;m=b}while(0);b=c[2204]|0;if(d>>>0<b>>>0)ma();a=d+4|0;r=c[a>>2]|0;if(!(r&2)){s=c[2205]|0;if((d|0)==(c[2206]|0)){t=(c[2203]|0)+m|0;c[2203]=t;c[2206]=l;c[l+4>>2]=t|1;if((l|0)!=(s|0))return;c[2205]=0;c[2202]=0;return}if((d|0)==(s|0)){s=(c[2202]|0)+m|0;c[2202]=s;c[2205]=l;c[l+4>>2]=s|1;c[l+s>>2]=s;return}s=(r&-8)+m|0;t=r>>>3;b:do if(r>>>0>=256){o=c[d+24>>2]|0;e=c[d+12>>2]|0;do if((e|0)==(d|0)){k=d+16|0;j=k+4|0;f=c[j>>2]|0;if(!f){n=c[k>>2]|0;if(!n){u=0;break}else{v=n;w=k}}else{v=f;w=j}while(1){j=v+20|0;f=c[j>>2]|0;if(f|0){v=f;w=j;continue}j=v+16|0;f=c[j>>2]|0;if(!f)break;else{v=f;w=j}}if(w>>>0<b>>>0)ma();else{c[w>>2]=0;u=v;break}}else{j=c[d+8>>2]|0;if(j>>>0<b>>>0)ma();f=j+12|0;if((c[f>>2]|0)!=(d|0))ma();k=e+8|0;if((c[k>>2]|0)==(d|0)){c[f>>2]=e;c[k>>2]=j;u=e;break}else ma()}while(0);if(o|0){e=c[d+28>>2]|0;h=9104+(e<<2)|0;do if((d|0)==(c[h>>2]|0)){c[h>>2]=u;if(!u){c[2201]=c[2201]&~(1<<e);break b}}else if(o>>>0>=(c[2204]|0)>>>0){c[o+16+(((c[o+16>>2]|0)!=(d|0)&1)<<2)>>2]=u;if(!u)break b;else break}else ma();while(0);e=c[2204]|0;if(u>>>0<e>>>0)ma();c[u+24>>2]=o;h=d+16|0;g=c[h>>2]|0;do if(g|0)if(g>>>0<e>>>0)ma();else{c[u+16>>2]=g;c[g+24>>2]=u;break}while(0);g=c[h+4>>2]|0;if(g|0)if(g>>>0<(c[2204]|0)>>>0)ma();else{c[u+20>>2]=g;c[g+24>>2]=u;break}}}else{g=c[d+8>>2]|0;e=c[d+12>>2]|0;o=8840+(t<<1<<2)|0;if((g|0)!=(o|0)){if(g>>>0<b>>>0)ma();if((c[g+12>>2]|0)!=(d|0))ma()}if((e|0)==(g|0)){c[2200]=c[2200]&~(1<<t);break}if((e|0)!=(o|0)){if(e>>>0<b>>>0)ma();o=e+8|0;if((c[o>>2]|0)==(d|0))x=o;else ma()}else x=e+8|0;c[g+12>>2]=e;c[x>>2]=g}while(0);c[l+4>>2]=s|1;c[l+s>>2]=s;if((l|0)==(c[2205]|0)){c[2202]=s;return}else y=s}else{c[a>>2]=r&-2;c[l+4>>2]=m|1;c[l+m>>2]=m;y=m}m=y>>>3;if(y>>>0<256){r=8840+(m<<1<<2)|0;a=c[2200]|0;s=1<<m;if(a&s){m=r+8|0;x=c[m>>2]|0;if(x>>>0<(c[2204]|0)>>>0)ma();else{z=m;A=x}}else{c[2200]=a|s;z=r+8|0;A=r}c[z>>2]=l;c[A+12>>2]=l;c[l+8>>2]=A;c[l+12>>2]=r;return}r=y>>>8;if(r)if(y>>>0>16777215)B=31;else{A=(r+1048320|0)>>>16&8;z=r<<A;r=(z+520192|0)>>>16&4;s=z<<r;z=(s+245760|0)>>>16&2;a=14-(r|A|z)+(s<<z>>>15)|0;B=y>>>(a+7|0)&1|a<<1}else B=0;a=9104+(B<<2)|0;c[l+28>>2]=B;c[l+20>>2]=0;c[l+16>>2]=0;z=c[2201]|0;s=1<<B;if(!(z&s)){c[2201]=z|s;c[a>>2]=l;c[l+24>>2]=a;c[l+12>>2]=l;c[l+8>>2]=l;return}s=y<<((B|0)==31?0:25-(B>>>1)|0);B=c[a>>2]|0;while(1){if((c[B+4>>2]&-8|0)==(y|0)){C=121;break}D=B+16+(s>>>31<<2)|0;a=c[D>>2]|0;if(!a){C=118;break}else{s=s<<1;B=a}}if((C|0)==118){if(D>>>0<(c[2204]|0)>>>0)ma();c[D>>2]=l;c[l+24>>2]=B;c[l+12>>2]=l;c[l+8>>2]=l;return}else if((C|0)==121){C=B+8|0;D=c[C>>2]|0;s=c[2204]|0;if(!(D>>>0>=s>>>0&B>>>0>=s>>>0))ma();c[D+12>>2]=l;c[C>>2]=l;c[l+8>>2]=D;c[l+12>>2]=B;c[l+24>>2]=0;return}}function ge(){}function he(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (D=e,a-c>>>0|0)|0}function ie(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (D=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function je(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function ke(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function le(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function me(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;q=q+1|0;c[a>>2]=q;while((f|0)<(e|0)){if(!(c[d+(f<<3)>>2]|0)){c[d+(f<<3)>>2]=q;c[d+((f<<3)+4)>>2]=b;c[d+((f<<3)+8)>>2]=0;D=e;return d|0}f=f+1|0}e=e*2|0;d=de(d|0,8*(e+1|0)|0)|0;d=me(a|0,b|0,d|0,e|0)|0;D=e;return d|0}function ne(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){f=c[b+(e<<3)>>2]|0;if(!f)break;if((f|0)==(a|0))return c[b+((e<<3)+4)>>2]|0;e=e+1|0}return 0}function oe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return na(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function pe(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function qe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;g=a;h=b;i=h;j=d;k=e;l=k;if(!i){m=(f|0)!=0;if(!l){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (D=n,o)|0}else{if(!m){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return (D=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(V(l|0)|0)-(V(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}r=j-1|0;if(r&j|0){s=(V(j|0)|0)+33-(V(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(f|0){c[f>>2]=r&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (D=n,o)|0}else{r=pe(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (D=n,o)|0}}else{if(m){if(f|0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (D=n,o)|0}if(!g){if(f|0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (D=n,o)|0}r=l-1|0;if(!(r&l)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=r&i|b&0}n=0;o=i>>>((pe(l|0)|0)>>>0);return (D=n,o)|0}r=(V(l|0)|0)-(V(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}while(0);if(!t){B=x;C=w;E=v;F=u;G=0;H=0}else{b=d|0|0;d=k|e&0;e=ie(b|0,d|0,-1,-1)|0;k=D;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;he(e|0,k|0,g|0,a|0)|0;i=D;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=he(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&d|0)|0;w=D;u=u-1|0}while((u|0)!=0);B=h;C=x;E=w;F=v;G=0;H=t}t=C;C=0;if(f|0){c[f>>2]=F;c[f+4>>2]=E}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|G;o=(t<<1|0>>>31)&-2|H;return (D=n,o)|0}function re(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return qe(a,b,c,d,0)|0}function se(a){a=a|0;var b=0,d=0;a=a+15&-16|0;b=c[i>>2]|0;d=b+a|0;if((a|0)>0&(d|0)<(b|0)|(d|0)<0){_()|0;la(12);return -1}c[i>>2]=d;if((d|0)>(Z()|0)?(Y()|0)==0:0){la(12);c[i>>2]=b;return -1}return b|0}function te(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f|0;qe(a,b,d,e,g)|0;l=f;return (D=c[g+4>>2]|0,c[g>>2]|0)|0}function ue(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function ve(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return sa[a&7](b|0,c|0,d|0)|0}function we(a,b){a=a|0;b=b|0;ta[a&7](b|0)}function xe(a,b,c){a=a|0;b=b|0;c=c|0;ua[a&1](b|0,c|0)}function ye(a,b){a=a|0;b=b|0;return va[a&3](b|0)|0}function ze(a){a=a|0;wa[a&3]()}function Ae(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;xa[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function Be(a,b,c){a=a|0;b=b|0;c=c|0;return ya[a&15](b|0,c|0)|0}function Ce(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return za[a&3](b|0,c|0,d|0,e|0,f|0)|0}function De(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Aa[a&31](b|0,c|0,d|0,e|0)}function Ee(a,b,c){a=a|0;b=b|0;c=c|0;W(0);return 0}function Fe(a){a=a|0;W(1)}function Ge(a,b){a=a|0;b=b|0;W(2)}function He(a){a=a|0;W(3);return 0}function Ie(){W(4)}function Je(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(5)}function Ke(a,b){a=a|0;b=b|0;W(6);return 0}function Le(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(7);return 0}function Me(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(8)}\n\n// EMSCRIPTEN_END_FUNCS\nvar sa=[Ee,Ic,rd,ld,Wd,tb,kd,Ee];var ta=[Fe,jc,wb,Pa,vb,Rc,Tb,ic];var ua=[Ge,Ua];var va=[He,Hc,jd,Sc];var wa=[Ie,sb,vc,Ie];var xa=[Je,Db,Hb,Fb,Jb,Eb,Ib,Gb,Kb,Je,Je,Je,Je,Je,Je,Je];var ya=[Ke,zc,Ac,Bc,Cc,Dc,Ec,Fc,Gc,Jc,Lc,ad,Na,Ke,Ke,Ke];var za=[Le,Kc,Zc,Le];var Aa=[Me,db,fb,ib,kb,ob,mb,rb,cb,eb,hb,jb,nb,lb,qb,pb,gb,Xa,Wa,_a,ab,$a,Za,bb,Ya,Ma,Me,Me,Me,Me,Me,Me];return{_ogv_video_decoder_destroy:fd,stackSave:Ca,_ogv_video_decoder_init:dd,_memset:je,_ogv_video_decoder_process_frame:hd,getTempRet0:Ha,_bitshift64Lshr:ke,_bitshift64Shl:le,_ogv_video_decoder_process_header:gd,_llvm_cttz_i32:pe,_sbrk:se,_memcpy:oe,stackAlloc:Ba,___uremdi3:te,_i64Subtract:he,___udivmoddi4:qe,setTempRet0:Ga,_realloc:de,_i64Add:ie,_ogv_video_decoder_async:ed,_emscripten_get_global_libc:id,___udivdi3:re,_llvm_bswap_i32:ue,_testSetjmp:ne,_saveSetjmp:me,_free:ce,runPostSets:ge,setThrew:Fa,establishStackSpace:Ea,stackRestore:Da,_malloc:be,stackAlloc:Ba,stackSave:Ca,stackRestore:Da,establishStackSpace:Ea,setThrew:Fa,setTempRet0:Ga,getTempRet0:Ha,dynCall_iiii:ve,dynCall_vi:we,dynCall_vii:xe,dynCall_ii:ye,dynCall_v:ze,dynCall_viiiiii:Ae,dynCall_iii:Be,dynCall_iiiiii:Ce,dynCall_viiii:De}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=asm[\"_ogv_video_decoder_destroy\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=asm[\"_ogv_video_decoder_init\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=asm[\"_ogv_video_decoder_process_frame\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=asm[\"_ogv_video_decoder_process_header\"];var _llvm_cttz_i32=Module[\"_llvm_cttz_i32\"]=asm[\"_llvm_cttz_i32\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var ___udivmoddi4=Module[\"___udivmoddi4\"]=asm[\"___udivmoddi4\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _realloc=Module[\"_realloc\"]=asm[\"_realloc\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=asm[\"_ogv_video_decoder_async\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var _testSetjmp=Module[\"_testSetjmp\"]=asm[\"_testSetjmp\"];var _saveSetjmp=Module[\"_saveSetjmp\"]=asm[\"_saveSetjmp\"];var _free=Module[\"_free\"]=asm[\"_free\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_v=Module[\"dynCall_v\"]=asm[\"dynCall_v\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=asm[\"dynCall_iiiiii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDecoderVideoVP8;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-vp9-mt.js",
    "content": "var OGVDecoderVideoVP9MT\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoVP9MT = function(OGVDecoderVideoVP9MT) {\n  OGVDecoderVideoVP9MT = OGVDecoderVideoVP9MT || {};\n  if (!OGVDecoderVideoVP9MT.currentScriptUrl) OGVDecoderVideoVP9MT.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoVP9MT;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoVP9MT=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoVP9MT!==\"undefined\"?OGVDecoderVideoVP9MT:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}var ENVIRONMENT_IS_PTHREAD;if(!ENVIRONMENT_IS_PTHREAD)ENVIRONMENT_IS_PTHREAD=false;var PthreadWorkerInit=Module[\"pthreadWorkerInit\"]||undefined;if(!ENVIRONMENT_IS_PTHREAD)PthreadWorkerInit={};var currentScriptUrl=Module[\"currentScriptUrl\"]||(ENVIRONMENT_IS_WORKER?undefined:document.currentScript.src);if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var PAGE_SIZE=16384;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;if(ENVIRONMENT_IS_PTHREAD){STATIC_BASE=Module[\"STATIC_BASE\"]||0;STATICTOP=Module[\"STATICTOP\"]||0;DYNAMIC_BASE=Module[\"DYNAMIC_BASE\"]||0;DYNAMICTOP_PTR=Module[\"DYNAMICTOP_PTR\"]||0}else{STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false}if(ENVIRONMENT_IS_PTHREAD){staticSealed=true}function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abort(\"Cannot enlarge memory arrays, since compiling with pthreads support enabled (-s USE_PTHREADS=1).\")}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(typeof SharedArrayBuffer!==\"undefined\"){if(ENVIRONMENT_IS_PTHREAD){buffer=Module.buffer}else{buffer=new SharedArrayBuffer(TOTAL_MEMORY)}((function(undefined){\"use strict\";function clamp(val,length){val=val|0||0;if(val<0)return Math.max(val+length,0);return Math.min(val,length)}if(typeof SharedArrayBuffer!==\"undefined\"&&!SharedArrayBuffer.prototype.slice){SharedArrayBuffer.prototype.slice=(function(from,to){var length=this.byteLength;var begin=clamp(from,length);var end=length;if(to!==undefined)end=clamp(to,length);if(begin>end)return new ArrayBuffer(0);var num=end-begin;var target=new ArrayBuffer(num);var targetArray=new Uint8Array(target);var sourceArray=new Uint8Array(this,begin,num);targetArray.set(sourceArray);return target})}}))()}else{if(!ENVIRONMENT_IS_PTHREAD)buffer=new ArrayBuffer(TOTAL_MEMORY)}updateGlobalBufferViews();if(typeof Atomics===\"undefined\"){Atomics={};Atomics[\"add\"]=(function(t,i,v){var w=t[i];t[i]+=v;return w});Atomics[\"and\"]=(function(t,i,v){var w=t[i];t[i]&=v;return w});Atomics[\"compareExchange\"]=(function(t,i,e,r){var w=t[i];if(w==e)t[i]=r;return w});Atomics[\"exchange\"]=(function(t,i,v){var w=t[i];t[i]=v;return w});Atomics[\"wait\"]=(function(t,i,v,o){if(t[i]!=v)return\"not-equal\";else return\"timed-out\"});Atomics[\"wake\"]=(function(t,i,c){return 0});Atomics[\"wakeOrRequeue\"]=(function(t,i1,c,i2,v){return 0});Atomics[\"isLockFree\"]=(function(s){return true});Atomics[\"load\"]=(function(t,i){return t[i]});Atomics[\"or\"]=(function(t,i,v){var w=t[i];t[i]|=v;return w});Atomics[\"store\"]=(function(t,i,v){t[i]=v;return v});Atomics[\"sub\"]=(function(t,i,v){var w=t[i];t[i]-=v;return w});Atomics[\"xor\"]=(function(t,i,v){var w=t[i];t[i]^=v;return w})}function getTotalMemory(){return TOTAL_MEMORY}if(!ENVIRONMENT_IS_PTHREAD){HEAP32[0]=1668509029}else{if(HEAP32[0]!==1668509029)throw\"Runtime error: The application has corrupted its heap memory area (address zero)!\"}HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;if(ENVIRONMENT_IS_PTHREAD)runtimeInitialized=true;function preRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(typeof Atomics!==\"undefined\"&&!Atomics[\"exchange\"]){Atomics[\"exchange\"]=(function(heap,index,val){var oldVal,oldVal2;do{oldVal=Atomics[\"load\"](heap,index);oldVal2=Atomics[\"compareExchange\"](heap,index,oldVal,val)}while(oldVal!=oldVal2);return oldVal})}if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){assert(!ENVIRONMENT_IS_PTHREAD);runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};if(!ENVIRONMENT_IS_PTHREAD)addOnPreRun((function(){if(typeof SharedArrayBuffer!==\"undefined\"){addRunDependency(\"pthreads\");PThread.allocateUnusedWorkers(1,(function(){removeRunDependency(\"pthreads\")}))}}));var ASM_CONSTS=[(function(){postMessage({cmd:\"processQueuedMainThreadWork\"})}),(function(){throw\"Canceled!\"})];function _emscripten_asm_const_v(code){return ASM_CONSTS[code]()}STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+39072;if(!ENVIRONMENT_IS_PTHREAD)__ATINIT__.push({func:(function(){___emscripten_pthread_data_constructor()})});if(!ENVIRONMENT_IS_PTHREAD){allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,1,0,251,255,126,0,8,0,253,255,1,0,0,0,255,255,3,0,246,255,122,0,18,0,250,255,2,0,0,0,255,255,4,0,243,255,118,0,27,0,247,255,3,0,255,255,255,255,4,0,240,255,112,0,37,0,245,255,4,0,255,255,255,255,5,0,238,255,105,0,48,0,242,255,4,0,255,255,255,255,5,0,237,255,97,0,58,0,240,255,5,0,255,255,255,255,6,0,237,255,88,0,68,0,238,255,5,0,255,255,255,255,6,0,237,255,78,0,78,0,237,255,6,0,255,255,255,255,5,0,238,255,68,0,88,0,237,255,6,0,255,255,255,255,5,0,240,255,58,0,97,0,237,255,5,0,255,255,255,255,4,0,242,255,48,0,105,0,238,255,5,0,255,255,255,255,4,0,245,255,37,0,112,0,240,255,4,0,255,255,255,255,3,0,247,255,27,0,118,0,243,255,4,0,255,255,0,0,2,0,250,255,18,0,122,0,246,255,3,0,255,255,0,0,1,0,253,255,8,0,126,0,251,255,1,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,253,255,255,255,32,0,64,0,38,0,1,0,253,255,0,0,254,255,254,255,29,0,63,0,41,0,2,0,253,255,0,0,254,255,254,255,26,0,63,0,43,0,4,0,252,255,0,0,254,255,253,255,24,0,62,0,46,0,5,0,252,255,0,0,254,255,253,255,21,0,60,0,49,0,7,0,252,255,0,0,255,255,252,255,18,0,59,0,51,0,9,0,252,255,0,0,255,255,252,255,16,0,57,0,53,0,12,0,252,255,255,255,255,255,252,255,14,0,55,0,55,0,14,0,252,255,255,255,255,255,252,255,12,0,53,0,57,0,16,0,252,255,255,255,0,0,252,255,9,0,51,0,59,0,18,0,252,255,255,255,0,0,252,255,7,0,49,0,60,0,21,0,253,255,254,255,0,0,252,255,5,0,46,0,62,0,24,0,253,255,254,255,0,0,252,255,4,0,43,0,63,0,26,0,254,255,254,255,0,0,253,255,2,0,41,0,63,0,29,0,254,255,254,255,0,0,253,255,1,0,38,0,64,0,32,0,255,255,253,255,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,255,255,3,0,249,255,127,0,8,0,253,255,1,0,0,0,254,255,5,0,243,255,125,0,17,0,250,255,3,0,255,255,253,255,7,0,239,255,121,0,27,0,246,255,5,0,254,255,252,255,9,0,236,255,115,0,37,0,243,255,6,0,254,255,252,255,10,0,233,255,108,0,48,0,240,255,8,0,253,255,252,255,10,0,232,255,100,0,59,0,237,255,9,0,253,255,252,255,11,0,232,255,90,0,70,0,235,255,10,0,252,255,252,255,11,0,233,255,80,0,80,0,233,255,11,0,252,255,252,255,10,0,235,255,70,0,90,0,232,255,11,0,252,255,253,255,9,0,237,255,59,0,100,0,232,255,10,0,252,255,253,255,8,0,240,255,48,0,108,0,233,255,10,0,252,255,254,255,6,0,243,255,37,0,115,0,236,255,9,0,252,255,254,255,5,0,246,255,27,0,121,0,239,255,7,0,253,255,255,255,3,0,250,255,17,0,125,0,243,255,5,0,254,255,0,0,1,0,253,255,8,0,127,0,249,255,3,0,255,255,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,104,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,88,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,104,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,120,0,0,0,0,0,0,0,0,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,148,140,0,0,0,0,0,0,0,0,0,0,0,0,0,176,155,140,135,0,0,0,0,0,0,0,0,0,0,0,0,180,157,141,134,130,0,0,0,0,0,0,0,0,0,0,0,254,254,254,252,249,243,230,196,177,153,140,133,130,129,0,0,0,1,1,2,2,2,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,1,1,2,2,2,3,3,3,3,4,4,4,5,5,5,0,0,4,0,1,0,5,0,8,0,2,0,12,0,9,0,3,0,6,0,13,0,10,0,7,0,14,0,11,0,15,0,0,0,2,0,5,0,8,0,1,0,3,0,9,0,12,0,4,0,7,0,11,0,14,0,6,0,10,0,13,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,4,0,4,0,4,0,1,0,1,0,8,0,8,0,5,0,8,0,2,0,2,0,2,0,5,0,9,0,12,0,6,0,9,0,3,0,6,0,10,0,13,0,7,0,10,0,11,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,1,0,16,0,9,0,2,0,17,0,24,0,10,0,3,0,18,0,25,0,32,0,11,0,4,0,26,0,33,0,19,0,40,0,12,0,34,0,27,0,5,0,41,0,20,0,48,0,13,0,35,0,42,0,28,0,21,0,6,0,49,0,56,0,36,0,43,0,29,0,7,0,14,0,50,0,57,0,44,0,22,0,37,0,15,0,51,0,58,0,30,0,45,0,23,0,52,0,59,0,38,0,31,0,60,0,53,0,46,0,39,0,61,0,54,0,47,0,62,0,55,0,63,0,0,0,2,0,5,0,9,0,14,0,22,0,31,0,37,0,1,0,4,0,8,0,13,0,19,0,26,0,38,0,44,0,3,0,6,0,10,0,17,0,24,0,30,0,42,0,49,0,7,0,11,0,15,0,21,0,29,0,36,0,47,0,53,0,12,0,16,0,20,0,27,0,34,0,43,0,52,0,57,0,18,0,23,0,28,0,35,0,41,0,48,0,56,0,60,0,25,0,32,0,39,0,45,0,50,0,55,0,59,0,62,0,33,0,40,0,46,0,51,0,54,0,58,0,61,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,1,0,8,0,1,0,1,0,9,0,16,0,16,0,16,0,2,0,9,0,2,0,2,0,10,0,17,0,17,0,24,0,24,0,24,0,3,0,10,0,3,0,3,0,18,0,25,0,25,0,32,0,11,0,18,0,32,0,32,0,4,0,11,0,26,0,33,0,19,0,26,0,4,0,4,0,33,0,40,0,12,0,19,0,40,0,40,0,5,0,12,0,27,0,34,0,34,0,41,0,20,0,27,0,13,0,20,0,5,0,5,0,41,0,48,0,48,0,48,0,28,0,35,0,35,0,42,0,21,0,28,0,6,0,6,0,6,0,13,0,42,0,49,0,49,0,56,0,36,0,43,0,14,0,21,0,29,0,36,0,7,0,14,0,43,0,50,0,50,0,57,0,22,0,29,0,37,0,44,0,15,0,22,0,44,0,51,0,51,0,58,0,30,0,37,0,23,0,30,0,52,0,59,0,45,0,52,0,38,0,45,0,31,0,38,0,53,0,60,0,46,0,53,0,39,0,46,0,54,0,61,0,47,0,54,0,55,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,1,0,32,0,17,0,2,0,48,0,33,0,18,0,3,0,64,0,34,0,49,0,19,0,65,0,80,0,50,0,4,0,35,0,66,0,20,0,81,0,96,0,51,0,5,0,36,0,82,0,97,0,67,0,112,0,21,0,52,0,98,0,37,0,83,0,113,0,6,0,68,0,128,0,53,0,22,0,99,0,114,0,84,0,7,0,129,0,38,0,69,0,100,0,115,0,144,0,130,0,85,0,54,0,23,0,8,0,145,0,39,0,70,0,116,0,101,0,131,0,160,0,146,0,55,0,86,0,24,0,71,0,132,0,117,0,161,0,40,0,9,0,102,0,147,0,176,0,162,0,87,0,56,0,25,0,133,0,118,0,177,0,148,0,72,0,103,0,41,0,163,0,10,0,192,0,178,0,88,0,57,0,134,0,149,0,119,0,26,0,164,0,73,0,104,0,193,0,42,0,179,0,208,0,11,0,135,0,89,0,165,0,120,0,150,0,58,0,194,0,180,0,27,0,74,0,209,0,105,0,151,0,136,0,43,0,90,0,224,0,166,0,195,0,181,0,121,0,210,0,59,0,12,0,152,0,106,0,167,0,196,0,75,0,137,0,225,0,211,0,240,0,182,0,122,0,91,0,28,0,197,0,13,0,226,0,168,0,183,0,153,0,44,0,212,0,138,0,107,0,241,0,60,0,29,0,123,0,198,0,184,0,227,0,169,0,242,0,76,0,213,0,154,0,45,0,92,0,14,0,199,0,139,0,61,0,228,0,214,0,170,0,185,0,243,0,108,0,77,0,155,0,30,0,15,0,200,0,229,0,124,0,215,0,244,0,93,0,46,0,186,0,171,0,201,0,109,0,140,0,230,0,62,0,216,0,245,0,31,0,125,0,78,0,156,0,231,0,47,0,187,0,202,0,217,0,94,0,246,0,141,0,63,0,232,0,172,0,110,0,247,0,157,0,79,0,218,0,203,0,126,0,233,0,188,0,248,0,95,0,173,0,142,0,219,0,111,0,249,0,234,0,158,0,127,0,189,0,204,0,250,0,235,0,143,0,174,0,220,0,205,0,159,0,251,0,190,0,221,0,175,0,236,0,237,0,191,0,206,0,252,0,222,0,253,0,207,0,238,0,223,0,254,0,239,0,255,0,0,0,2,0,5,0,9,0,17,0,24,0,36,0,44,0,55,0,72,0,88,0,104,0,128,0,143,0,166,0,179,0,1,0,4,0,8,0,13,0,20,0,30,0,40,0,54,0,66,0,79,0,96,0,113,0,141,0,154,0,178,0,196,0,3,0,7,0,11,0,18,0,25,0,33,0,46,0,57,0,71,0,86,0,101,0,119,0,148,0,164,0,186,0,201,0,6,0,12,0,16,0,23,0,31,0,39,0,53,0,64,0,78,0,92,0,110,0,127,0,153,0,169,0,193,0,208,0,10,0,14,0,19,0,28,0,37,0,47,0,58,0,67,0,84,0,98,0,114,0,133,0,161,0,176,0,198,0,214,0,15,0,21,0,26,0,34,0,43,0,52,0,65,0,77,0,91,0,106,0,120,0,140,0,165,0,185,0,205,0,221,0,22,0,27,0,32,0,41,0,48,0,60,0,73,0,85,0,99,0,116,0,130,0,151,0,175,0,190,0,211,0,225,0,29,0,35,0,42,0,49,0,59,0,69,0,81,0,95,0,108,0,125,0,139,0,155,0,182,0,197,0,217,0,229,0,38,0,45,0,51,0,61,0,68,0,80,0,93,0,105,0,118,0,134,0,150,0,168,0,191,0,207,0,223,0,234,0,50,0,56,0,63,0,74,0,83,0,94,0,109,0,117,0,129,0,147,0,163,0,177,0,199,0,213,0,228,0,238,0,62,0,70,0,76,0,87,0,97,0,107,0,122,0,131,0,145,0,159,0,172,0,188,0,210,0,222,0,235,0,242,0,75,0,82,0,90,0,102,0,112,0,124,0,138,0,146,0,157,0,173,0,187,0,202,0,219,0,230,0,240,0,245,0,89,0,100,0,111,0,123,0,132,0,142,0,156,0,167,0,180,0,189,0,203,0,216,0,231,0,237,0,246,0,250,0,103,0,115,0,126,0,136,0,149,0,162,0,171,0,183,0,194,0,204,0,215,0,224,0,236,0,241,0,248,0,252,0,121,0,135,0,144,0,158,0,170,0,181,0,192,0,200,0,209,0,218,0,227,0,233,0,243,0,244,0,251,0,254,0,137,0,152,0,160,0,174,0,184,0,195,0,206,0,212,0,220,0,226,0,232,0,239,0,247,0,249,0,253,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,1,0,16,0,1,0,1,0,32,0,32,0,17,0,32,0,2,0,17,0,2,0,2,0,48,0,48,0,18,0,33,0,33,0,48,0,3,0,18,0,49,0,64,0,64,0,64,0,34,0,49,0,3,0,3,0,19,0,34,0,50,0,65,0,4,0,19,0,65,0,80,0,80,0,80,0,35,0,50,0,4,0,4,0,20,0,35,0,66,0,81,0,81,0,96,0,51,0,66,0,96,0,96,0,5,0,20,0,36,0,51,0,82,0,97,0,21,0,36,0,67,0,82,0,97,0,112,0,5,0,5,0,52,0,67,0,112,0,112,0,37,0,52,0,6,0,21,0,83,0,98,0,98,0,113,0,68,0,83,0,6,0,6,0,113,0,128,0,22,0,37,0,53,0,68,0,84,0,99,0,99,0,114,0,128,0,128,0,114,0,129,0,69,0,84,0,38,0,53,0,7,0,22,0,7,0,7,0,129,0,144,0,23,0,38,0,54,0,69,0,100,0,115,0,85,0,100,0,115,0,130,0,144,0,144,0,130,0,145,0,39,0,54,0,70,0,85,0,8,0,23,0,55,0,70,0,116,0,131,0,101,0,116,0,145,0,160,0,24,0,39,0,8,0,8,0,86,0,101,0,131,0,146,0,160,0,160,0,146,0,161,0,71,0,86,0,40,0,55,0,9,0,24,0,117,0,132,0,102,0,117,0,161,0,176,0,132,0,147,0,56,0,71,0,87,0,102,0,25,0,40,0,147,0,162,0,9,0,9,0,176,0,176,0,162,0,177,0,72,0,87,0,41,0,56,0,118,0,133,0,133,0,148,0,103,0,118,0,10,0,25,0,148,0,163,0,57,0,72,0,88,0,103,0,177,0,192,0,26,0,41,0,163,0,178,0,192,0,192,0,10,0,10,0,119,0,134,0,73,0,88,0,149,0,164,0,104,0,119,0,134,0,149,0,42,0,57,0,178,0,193,0,164,0,179,0,11,0,26,0,58,0,73,0,193,0,208,0,89,0,104,0,135,0,150,0,120,0,135,0,27,0,42,0,74,0,89,0,208,0,208,0,150,0,165,0,179,0,194,0,165,0,180,0,105,0,120,0,194,0,209,0,43,0,58,0,11,0,11,0,136,0,151,0,90,0,105,0,151,0,166,0,180,0,195,0,59,0,74,0,121,0,136,0,209,0,224,0,195,0,210,0,224,0,224,0,166,0,181,0,106,0,121,0,75,0,90,0,12,0,27,0,181,0,196,0,12,0,12,0,210,0,225,0,152,0,167,0,167,0,182,0,137,0,152,0,28,0,43,0,196,0,211,0,122,0,137,0,91,0,106,0,225,0,240,0,44,0,59,0,13,0,28,0,107,0,122,0,182,0,197,0,168,0,183,0,211,0,226,0,153,0,168,0,226,0,241,0,60,0,75,0,197,0,212,0,138,0,153,0,29,0,44,0,76,0,91,0,13,0,13,0,183,0,198,0,123,0,138,0,45,0,60,0,212,0,227,0,198,0,213,0,154,0,169,0,169,0,184,0,227,0,242,0,92,0,107,0,61,0,76,0,139,0,154,0,14,0,29,0,14,0,14,0,184,0,199,0,213,0,228,0,108,0,123,0,199,0,214,0,228,0,243,0,77,0,92,0,30,0,45,0,170,0,185,0,155,0,170,0,185,0,200,0,93,0,108,0,124,0,139,0,214,0,229,0,46,0,61,0,200,0,215,0,229,0,244,0,15,0,30,0,109,0,124,0,62,0,77,0,140,0,155,0,215,0,230,0,31,0,46,0,171,0,186,0,186,0,201,0,201,0,216,0,78,0,93,0,230,0,245,0,125,0,140,0,47,0,62,0,216,0,231,0,156,0,171,0,94,0,109,0,231,0,246,0,141,0,156,0,63,0,78,0,202,0,217,0,187,0,202,0,110,0,125,0,217,0,232,0,172,0,187,0,232,0,247,0,79,0,94,0,157,0,172,0,126,0,141,0,203,0,218,0,95,0,110,0,233,0,248,0,218,0,233,0,142,0,157,0,111,0,126,0,173,0,188,0,188,0,203,0,234,0,249,0,219,0,234,0,127,0,142,0,158,0,173,0,204,0,219,0,189,0,204,0,143,0,158,0,235,0,250,0,174,0,189,0,205,0,220,0,159,0,174,0,220,0,235,0,221,0,236,0,175,0,190,0,190,0,205,0,236,0,251,0,206,0,221,0,237,0,252,0,191,0,206,0,222,0,237,0,207,0,222,0,238,0,253,0,223,0,238,0,239,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,1,0,64,0,33,0,2,0,96,0,65,0,34,0,128,0,3,0,97,0,66,0,160,0,129,0,35,0,98,0,4,0,67,0,130,0,161,0,192,0,36,0,99,0,224,0,5,0,162,0,193,0,68,0,131,0,37,0,100,0,225,0,194,0,0,1,163,0,69,0,132,0,6,0,226,0,1,1,32,1,195,0,101,0,164,0,38,0,2,1,7,0,227,0,33,1,133,0,64,1,70,0,196,0,165,0,34,1,3,1,228,0,39,0,65,1,102,0,96,1,8,0,197,0,71,0,134,0,66,1,35,1,4,1,97,1,128,1,229,0,166,0,103,0,40,0,98,1,67,1,36,1,135,0,129,1,198,0,5,1,72,0,9,0,160,1,167,0,130,1,99,1,230,0,68,1,104,0,37,1,41,0,161,1,199,0,136,0,6,1,131,1,192,1,69,1,100,1,10,0,73,0,162,1,231,0,168,0,193,1,38,1,132,1,105,0,163,1,7,1,42,0,200,0,101,1,194,1,137,0,224,1,74,0,70,1,232,0,11,0,133,1,169,0,39,1,164,1,106,0,195,1,225,1,102,1,8,1,71,1,201,0,43,0,138,0,0,2,226,1,134,1,40,1,233,0,170,0,165,1,75,0,196,1,103,1,12,0,1,2,9,1,227,1,72,1,107,0,202,0,2,2,32,2,166,1,135,1,197,1,139,0,44,0,234,0,228,1,41,1,104,1,171,0,76,0,3,2,33,2,10,1,73,1,198,1,13,0,167,1,203,0,108,0,34,2,229,1,64,2,42,1,235,0,140,0,105,1,74,1,172,0,35,2,45,0,199,1,11,1,65,2,230,1,77,0,204,0,106,1,96,2,14,0,43,1,66,2,109,0,236,0,231,1,97,2,75,1,141,0,67,2,46,0,15,0,173,0,98,2,107,1,78,0,205,0,16,0,110,0,237,0,99,2,142,0,47,0,174,0,79,0,206,0,17,0,111,0,238,0,48,0,143,0,80,0,175,0,112,0,207,0,49,0,18,0,239,0,81,0,113,0,19,0,50,0,82,0,114,0,51,0,83,0,115,0,128,2,4,2,136,1,12,1,144,0,20,0,160,2,129,2,36,2,5,2,168,1,137,1,44,1,13,1,176,0,145,0,52,0,21,0,192,2,161,2,130,2,68,2,37,2,6,2,200,1,169,1,138,1,76,1,45,1,14,1,208,0,177,0,146,0,84,0,53,0,22,0,224,2,193,2,162,2,131,2,100,2,69,2,38,2,7,2,232,1,201,1,170,1,139,1,108,1,77,1,46,1,15,1,240,0,209,0,178,0,147,0,116,0,85,0,54,0,23,0,225,2,194,2,163,2,101,2,70,2,39,2,233,1,202,1,171,1,109,1,78,1,47,1,241,0,210,0,179,0,117,0,86,0,55,0,226,2,195,2,102,2,71,2,234,1,203,1,110,1,79,1,242,0,211,0,118,0,87,0,227,2,103,2,235,1,111,1,243,0,119,0,0,3,132,2,8,2,140,1,16,1,148,0,24,0,32,3,1,3,164,2,133,2,40,2,9,2,172,1,141,1,48,1,17,1,180,0,149,0,56,0,25,0,64,3,33,3,2,3,196,2,165,2,134,2,72,2,41,2,10,2,204,1,173,1,142,1,80,1,49,1,18,1,212,0,181,0,150,0,88,0,57,0,26,0,96,3,65,3,34,3,3,3,228,2,197,2,166,2,135,2,104,2,73,2,42,2,11,2,236,1,205,1,174,1,143,1,112,1,81,1,50,1,19,1,244,0,213,0,182,0,151,0,120,0,89,0,58,0,27,0,97,3,66,3,35,3,229,2,198,2,167,2,105,2,74,2,43,2,237,1,206,1,175,1,113,1,82,1,51,1,245,0,214,0,183,0,121,0,90,0,59,0,98,3,67,3,230,2,199,2,106,2,75,2,238,1,207,1,114,1,83,1,246,0,215,0,122,0,91,0,99,3,231,2,107,2,239,1,115,1,247,0,123,0,128,3,4,3,136,2,12,2,144,1,20,1,152,0,28,0,160,3,129,3,36,3,5,3,168,2,137,2,44,2,13,2,176,1,145,1,52,1,21,1,184,0,153,0,60,0,29,0,192,3,161,3,130,3,68,3,37,3,6,3,200,2,169,2,138,2,76,2,45,2,14,2,208,1,177,1,146,1,84,1,53,1,22,1,216,0,185,0,154,0,92,0,61,0,30,0,224,3,193,3,162,3,131,3,100,3,69,3,38,3,7,3,232,2,201,2,170,2,139,2,108,2,77,2,46,2,15,2,240,1,209,1,178,1,147,1,116,1,85,1,54,1,23,1,248,0,217,0,186,0,155,0,124,0,93,0,62,0,31,0,225,3,194,3,163,3,101,3,70,3,39,3,233,2,202,2,171,2,109,2,78,2,47,2,241,1,210,1,179,1,117,1,86,1,55,1,249,0,218,0,187,0,125,0,94,0,63,0,226,3,195,3,102,3,71,3,234,2,203,2,110,2,79,2,242,1,211,1,118,1,87,1,250,0,219,0,126,0,95,0,227,3,103,3,235,2,111,2,243,1,119,1,251,0,127,0,132,3,8,3,140,2,16,2,148,1,24,1,156,0,164,3,133,3,40,3,9,3,172,2,141,2,48,2,17,2,180,1,149,1,56,1,25,1,188,0,157,0,196,3,165,3,134,3,72,3,41,3,10,3,204,2,173,2,142,2,80,2,49,2,18,2,212,1,181,1,150,1,88,1,57,1,26,1,220,0,189,0,158,0,228,3,197,3,166,3,135,3,104,3,73,3,42,3,11,3,236,2,205,2,174,2,143,2,112,2,81,2,50,2,19,2,244,1,213,1,182,1,151,1,120,1,89,1,58,1,27,1,252,0,221,0,190,0,159,0,229,3,198,3,167,3,105,3,74,3,43,3,237,2,206,2,175,2,113,2,82,2,51,2,245,1,214,1,183,1,121,1,90,1,59,1,253,0,222,0,191,0,230,3,199,3,106,3,75,3,238,2,207,2,114,2,83,2,246,1,215,1,122,1,91,1,254,0,223,0,231,3,107,3,239,2,115,2,247,1,123,1,255,0,136,3,12,3,144,2,20,2,152,1,28,1,168,3,137,3,44,3,13,3,176,2,145,2,52,2,21,2,184,1,153,1,60,1,29,1,200,3,169,3,138,3,76,3,45,3,14,3,208,2,177,2,146,2,84,2,53,2,22,2,216,1,185,1,154,1,92,1,61,1,30,1,232,3,201,3,170,3,139,3,108,3,77,3,46,3,15,3,240,2,209,2,178,2,147,2,116,2,85,2,54,2,23,2,248,1,217,1,186,1,155,1,124,1,93,1,62,1,31,1,233,3,202,3,171,3,109,3,78,3,47,3,241,2,210,2,179,2,117,2,86,2,55,2,249,1,218,1,187,1,125,1,94,1,63,1,234,3,203,3,110,3,79,3,242,2,211,2,118,2,87,2,250,1,219,1,126,1,95,1,235,3,111,3,243,2,119,2,251,1,127,1,140,3,16,3,148,2,24,2,156,1,172,3,141,3,48,3,17,3,180,2,149,2,56,2,25,2,188,1,157,1,204,3,173,3,142,3,80,3,49,3,18,3,212,2,181,2,150,2,88,2,57,2,26,2,220,1,189,1,158,1,236,3,205,3,174,3,143,3,112,3,81,3,50,3,19,3,244,2,213,2,182,2,151,2,120,2,89,2,58,2,27,2,252,1,221,1,190,1,159,1,237,3,206,3,175,3,113,3,82,3,51,3,245,2,214,2,183,2,121,2,90,2,59,2,253,1,222,1,191,1,238,3,207,3,114,3,83,3,246,2,215,2,122,2,91,2,254,1,223,1,239,3,115,3,247,2,123,2,255,1,144,3,20,3,152,2,28,2,176,3,145,3,52,3,21,3,184,2,153,2,60,2,29,2,208,3,177,3,146,3,84,3,53,3,22,3,216,2,185,2,154,2,92,2,61,2,30,2,240,3,209,3,178,3,147,3,116,3,85,3,54,3,23,3,248,2,217,2,186,2,155,2,124,2,93,2,62,2,31,2,241,3,210,3,179,3,117,3,86,3,55,3,249,2,218,2,187,2,125,2,94,2,63,2,242,3,211,3,118,3,87,3,250,2,219,2,126,2,95,2,243,3,119,3,251,2,127,2,148,3,24,3,156,2,180,3,149,3,56,3,25,3,188,2,157,2,212,3,181,3,150,3,88,3,57,3,26,3,220,2,189,2,158,2,244,3,213,3,182,3,151,3,120,3,89,3,58,3,27,3,252,2,221,2,190,2,159,2,245,3,214,3,183,3,121,3,90,3,59,3,253,2,222,2,191,2,246,3,215,3,122,3,91,3,254,2,223,2,247,3,123,3,255,2,152,3,28,3,184,3,153,3,60,3,29,3,216,3,185,3,154,3,92,3,61,3,30,3,248,3,217,3,186,3,155,3,124,3,93,3,62,3,31,3,249,3,218,3,187,3,125,3,94,3,63,3,250,3,219,3,126,3,95,3,251,3,127,3,156,3,188,3,157,3,220,3,189,3,158,3,252,3,221,3,190,3,159,3,253,3,222,3,191,3,254,3,223,3,255,3,0,0,2,0,5,0,10,0,17,0,25,0,38,0,47,0,62,0,83,0,101,0,121,0,145,0,170,0,193,0,204,0,210,0,219,0,229,0,233,0,245,0,1,1,19,1,43,1,86,1,100,1,121,1,149,1,199,1,215,1,239,1,15,2,1,0,4,0,8,0,15,0,22,0,30,0,45,0,58,0,74,0,92,0,112,0,133,0,158,0,184,0,203,0,215,0,222,0,228,0,234,0,237,0,0,1,18,1,42,1,61,1,99,1,120,1,148,1,170,1,214,1,238,1,14,2,39,2,3,0,7,0,12,0,18,0,28,0,36,0,52,0,64,0,82,0,102,0,118,0,142,0,164,0,189,0,208,0,217,0,224,0,231,0,235,0,238,0,17,1,41,1,60,1,73,1,119,1,147,1,169,1,184,1,237,1,13,2,38,2,55,2,6,0,11,0,16,0,23,0,31,0,43,0,60,0,73,0,90,0,109,0,126,0,150,0,173,0,196,0,211,0,220,0,226,0,232,0,236,0,239,0,40,1,59,1,72,1,79,1,146,1,168,1,183,1,191,1,12,2,37,2,54,2,63,2,9,0,14,0,19,0,29,0,37,0,50,0,65,0,78,0,95,0,116,0,134,0,157,0,179,0,201,0,214,0,223,0,244,0,255,0,16,1,39,1,85,1,98,1,118,1,145,1,198,1,213,1,236,1,11,2,70,2,84,2,105,2,133,2,13,0,20,0,26,0,35,0,44,0,54,0,72,0,85,0,105,0,123,0,140,0,163,0,182,0,205,0,216,0,225,0,254,0,15,1,38,1,58,1,97,1,117,1,144,1,167,1,212,1,235,1,10,2,36,2,83,2,104,2,132,2,154,2,21,0,27,0,33,0,42,0,53,0,63,0,80,0,94,0,113,0,132,0,151,0,172,0,190,0,209,0,218,0,227,0,14,1,37,1,57,1,71,1,116,1,143,1,166,1,182,1,234,1,9,2,35,2,53,2,103,2,131,2,153,2,168,2,24,0,32,0,39,0,48,0,57,0,71,0,88,0,104,0,120,0,139,0,159,0,178,0,197,0,212,0,221,0,230,0,36,1,56,1,70,1,78,1,142,1,165,1,181,1,190,1,8,2,34,2,52,2,62,2,130,2,152,2,167,2,175,2,34,0,40,0,46,0,56,0,68,0,81,0,96,0,111,0,130,0,147,0,167,0,186,0,243,0,253,0,13,1,35,1,84,1,96,1,115,1,141,1,197,1,211,1,233,1,7,2,69,2,82,2,102,2,129,2,181,2,193,2,211,2,235,2,41,0,49,0,55,0,67,0,77,0,91,0,107,0,124,0,138,0,161,0,177,0,194,0,252,0,12,1,34,1,55,1,95,1,114,1,140,1,164,1,210,1,232,1,6,2,33,2,81,2,101,2,128,2,151,2,192,2,210,2,234,2,253,2,51,0,59,0,66,0,76,0,89,0,99,0,119,0,131,0,149,0,168,0,181,0,200,0,11,1,33,1,54,1,69,1,113,1,139,1,163,1,180,1,231,1,5,2,32,2,51,2,100,2,127,2,150,2,166,2,209,2,233,2,252,2,9,3,61,0,69,0,75,0,87,0,100,0,114,0,129,0,144,0,162,0,180,0,191,0,207,0,32,1,53,1,68,1,77,1,138,1,162,1,179,1,189,1,4,2,31,2,50,2,61,2,126,2,149,2,165,2,174,2,232,2,251,2,8,3,15,3,70,0,79,0,86,0,97,0,108,0,122,0,137,0,155,0,242,0,251,0,10,1,31,1,83,1,94,1,112,1,137,1,196,1,209,1,230,1,3,2,68,2,80,2,99,2,125,2,180,2,191,2,208,2,231,2,20,3,30,3,45,3,65,3,84,0,93,0,103,0,110,0,125,0,141,0,154,0,171,0,250,0,9,1,30,1,52,1,93,1,111,1,136,1,161,1,208,1,229,1,2,2,30,2,79,2,98,2,124,2,148,2,190,2,207,2,230,2,250,2,29,3,44,3,64,3,80,3,98,0,106,0,115,0,127,0,143,0,156,0,169,0,185,0,8,1,29,1,51,1,67,1,110,1,135,1,160,1,178,1,228,1,1,2,29,2,49,2,97,2,123,2,147,2,164,2,206,2,229,2,249,2,7,3,43,3,63,3,79,3,90,3,117,0,128,0,136,0,148,0,160,0,175,0,188,0,198,0,28,1,50,1,66,1,76,1,134,1,159,1,177,1,188,1,0,2,28,2,48,2,60,2,122,2,146,2,163,2,173,2,228,2,248,2,6,3,14,3,62,3,78,3,89,3,95,3,135,0,146,0,152,0,165,0,241,0,249,0,7,1,27,1,82,1,92,1,109,1,133,1,195,1,207,1,227,1,255,1,67,2,78,2,96,2,121,2,179,2,189,2,205,2,227,2,19,3,28,3,42,3,61,3,99,3,107,3,119,3,135,3,153,0,166,0,174,0,183,0,248,0,6,1,26,1,49,1,91,1,108,1,132,1,158,1,206,1,226,1,254,1,27,2,77,2,95,2,120,2,145,2,188,2,204,2,226,2,247,2,27,3,41,3,60,3,77,3,106,3,118,3,134,3,147,3,176,0,187,0,195,0,202,0,5,1,25,1,48,1,65,1,107,1,131,1,157,1,176,1,225,1,253,1,26,2,47,2,94,2,119,2,144,2,162,2,203,2,225,2,246,2,5,3,40,3,59,3,76,3,88,3,117,3,133,3,146,3,155,3,192,0,199,0,206,0,213,0,24,1,47,1,64,1,75,1,130,1,156,1,175,1,187,1,252,1,25,2,46,2,59,2,118,2,143,2,161,2,172,2,224,2,245,2,4,3,13,3,58,3,75,3,87,3,94,3,132,3,145,3,154,3,159,3,240,0,247,0,4,1,23,1,81,1,90,1,106,1,129,1,194,1,205,1,224,1,251,1,66,2,76,2,93,2,117,2,178,2,187,2,202,2,223,2,18,3,26,3,39,3,57,3,98,3,105,3,116,3,131,3,162,3,168,3,177,3,189,3,246,0,3,1,22,1,46,1,89,1,105,1,128,1,155,1,204,1,223,1,250,1,24,2,75,2,92,2,116,2,142,2,186,2,201,2,222,2,244,2,25,3,38,3,56,3,74,3,104,3,115,3,130,3,144,3,167,3,176,3,188,3,198,3,2,1,21,1,45,1,63,1,104,1,127,1,154,1,174,1,222,1,249,1,23,2,45,2,91,2,115,2,141,2,160,2,200,2,221,2,243,2,3,3,37,3,55,3,73,3,86,3,114,3,129,3,143,3,153,3,175,3,187,3,197,3,204,3,20,1,44,1,62,1,74,1,126,1,153,1,173,1,186,1,248,1,22,2,44,2,58,2,114,2,140,2,159,2,171,2,220,2,242,2,2,3,12,3,54,3,72,3,85,3,93,3,128,3,142,3,152,3,158,3,186,3,196,3,203,3,207,3,80,1,88,1,103,1,125,1,193,1,203,1,221,1,247,1,65,2,74,2,90,2,113,2,177,2,185,2,199,2,219,2,17,3,24,3,36,3,53,3,97,3,103,3,113,3,127,3,161,3,166,3,174,3,185,3,209,3,213,3,219,3,227,3,87,1,102,1,124,1,152,1,202,1,220,1,246,1,21,2,73,2,89,2,112,2,139,2,184,2,198,2,218,2,241,2,23,3,35,3,52,3,71,3,102,3,112,3,126,3,141,3,165,3,173,3,184,3,195,3,212,3,218,3,226,3,233,3,101,1,123,1,151,1,172,1,219,1,245,1,20,2,43,2,88,2,111,2,138,2,158,2,197,2,217,2,240,2,1,3,34,3,51,3,70,3,84,3,111,3,125,3,140,3,151,3,172,3,183,3,194,3,202,3,217,3,225,3,232,3,237,3,122,1,150,1,171,1,185,1,244,1,19,2,42,2,57,2,110,2,137,2,157,2,170,2,216,2,239,2,0,3,11,3,50,3,69,3,83,3,92,3,124,3,139,3,150,3,157,3,182,3,193,3,201,3,206,3,224,3,231,3,236,3,239,3,192,1,201,1,218,1,243,1,64,2,72,2,87,2,109,2,176,2,183,2,196,2,215,2,16,3,22,3,33,3,49,3,96,3,101,3,110,3,123,3,160,3,164,3,171,3,181,3,208,3,211,3,216,3,223,3,240,3,242,3,245,3,249,3,200,1,217,1,242,1,18,2,71,2,86,2,108,2,136,2,182,2,195,2,214,2,238,2,21,3,32,3,48,3,68,3,100,3,109,3,122,3,138,3,163,3,170,3,180,3,192,3,210,3,215,3,222,3,230,3,241,3,244,3,248,3,252,3,216,1,241,1,17,2,41,2,85,2,107,2,135,2,156,2,194,2,213,2,237,2,255,2,31,3,47,3,67,3,82,3,108,3,121,3,137,3,149,3,169,3,179,3,191,3,200,3,214,3,221,3,229,3,235,3,243,3,247,3,251,3,254,3,240,1,16,2,40,2,56,2,106,2,134,2,155,2,169,2,212,2,236,2,254,2,10,3,46,3,66,3,81,3,91,3,120,3,136,3,148,3,156,3,178,3,190,3,199,3,205,3,220,3,228,3,234,3,238,3,246,3,250,3,253,3,255,3,0,0,0,0,0,0,0,0,0,0,0,0,32,0,32,0,1,0,32,0,1,0,1,0,64,0,64,0,33,0,64,0,2,0,33,0,96,0,96,0,2,0,2,0,65,0,96,0,34,0,65,0,128,0,128,0,97,0,128,0,3,0,34,0,66,0,97,0,3,0,3,0,35,0,66,0,98,0,129,0,129,0,160,0,160,0,160,0,4,0,35,0,67,0,98,0,192,0,192,0,4,0,4,0,130,0,161,0,161,0,192,0,36,0,67,0,99,0,130,0,5,0,36,0,68,0,99,0,193,0,224,0,162,0,193,0,224,0,224,0,131,0,162,0,37,0,68,0,100,0,131,0,5,0,5,0,194,0,225,0,225,0,0,1,0,1,0,1,163,0,194,0,69,0,100,0,132,0,163,0,6,0,37,0,226,0,1,1,6,0,6,0,195,0,226,0,1,1,32,1,101,0,132,0,32,1,32,1,38,0,69,0,164,0,195,0,133,0,164,0,2,1,33,1,227,0,2,1,196,0,227,0,7,0,38,0,33,1,64,1,70,0,101,0,64,1,64,1,7,0,7,0,165,0,196,0,39,0,70,0,102,0,133,0,34,1,65,1,3,1,34,1,228,0,3,1,65,1,96,1,96,1,96,1,197,0,228,0,134,0,165,0,71,0,102,0,8,0,39,0,66,1,97,1,35,1,66,1,4,1,35,1,103,0,134,0,97,1,128,1,166,0,197,0,229,0,4,1,40,0,71,0,8,0,8,0,128,1,128,1,135,0,166,0,98,1,129,1,67,1,98,1,198,0,229,0,36,1,67,1,72,0,103,0,5,1,36,1,9,0,40,0,129,1,160,1,167,0,198,0,104,0,135,0,230,0,5,1,99,1,130,1,160,1,160,1,37,1,68,1,68,1,99,1,9,0,9,0,41,0,72,0,130,1,161,1,199,0,230,0,136,0,167,0,161,1,192,1,6,1,37,1,100,1,131,1,73,0,104,0,131,1,162,1,231,0,6,1,10,0,41,0,168,0,199,0,69,1,100,1,162,1,193,1,105,0,136,0,192,1,192,1,42,0,73,0,38,1,69,1,200,0,231,0,10,0,10,0,101,1,132,1,137,0,168,0,7,1,38,1,132,1,163,1,74,0,105,0,163,1,194,1,193,1,224,1,70,1,101,1,232,0,7,1,39,1,70,1,169,0,200,0,11,0,42,0,106,0,137,0,224,1,224,1,194,1,225,1,102,1,133,1,8,1,39,1,201,0,232,0,138,0,169,0,133,1,164,1,43,0,74,0,164,1,195,1,71,1,102,1,11,0,11,0,225,1,0,2,233,0,8,1,195,1,226,1,40,1,71,1,75,0,106,0,170,0,201,0,226,1,1,2,0,2,0,2,134,1,165,1,103,1,134,1,165,1,196,1,107,0,138,0,12,0,43,0,202,0,233,0,196,1,227,1,9,1,40,1,72,1,103,1,139,0,170,0,44,0,75,0,227,1,2,2,1,2,32,2,234,0,9,1,41,1,72,1,166,1,197,1,12,0,12,0,135,1,166,1,171,0,202,0,76,0,107,0,2,2,33,2,197,1,228,1,32,2,32,2,10,1,41,1,203,0,234,0,108,0,139,0,73,1,104,1,42,1,73,1,140,0,171,0,3,2,34,2,13,0,44,0,167,1,198,1],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([235,0,10,1,33,2,64,2,198,1,229,1,45,0,76,0,172,0,203,0,74,1,105,1,64,2,64,2,13,0,13,0,11,1,42,1,34,2,65,2,77,0,108,0,204,0,235,0,199,1,230,1,65,2,96,2,43,1,74,1,109,0,140,0,35,2,66,2,14,0,45,0,14,0,14,0,141,0,172,0,66,2,97,2,75,1,106,1,46,0,77,0,173,0,204,0,15,0,15,0,78,0,109,0,205,0,236,0,67,2,98,2,110,0,141,0,15,0,46,0,142,0,173,0,47,0,78,0,174,0,205,0,16,0,16,0,79,0,110,0,206,0,237,0,16,0,47,0,111,0,142,0,48,0,79,0,143,0,174,0,80,0,111,0,175,0,206,0,17,0,48,0,17,0,17,0,207,0,238,0,49,0,80,0,81,0,112,0,18,0,18,0,18,0,49,0,50,0,81,0,82,0,113,0,19,0,50,0,51,0,82,0,83,0,114,0,96,2,96,2,228,1,3,2,104,1,135,1,236,0,11,1,112,0,143,0,19,0,19,0,128,2,128,2,97,2,128,2,4,2,35,2,229,1,4,2,136,1,167,1,105,1,136,1,12,1,43,1,237,0,12,1,144,0,175,0,113,0,144,0,20,0,51,0,20,0,20,0,160,2,160,2,129,2,160,2,98,2,129,2,36,2,67,2,5,2,36,2,230,1,5,2,168,1,199,1,137,1,168,1,106,1,137,1,44,1,75,1,13,1,44,1,238,0,13,1,176,0,207,0,145,0,176,0,114,0,145,0,52,0,83,0,21,0,52,0,21,0,21,0,192,2,192,2,161,2,192,2,130,2,161,2,99,2,130,2,68,2,99,2,37,2,68,2,6,2,37,2,231,1,6,2,200,1,231,1,169,1,200,1,138,1,169,1,107,1,138,1,76,1,107,1,45,1,76,1,14,1,45,1,239,0,14,1,208,0,239,0,177,0,208,0,146,0,177,0,115,0,146,0,84,0,115,0,53,0,84,0,22,0,53,0,22,0,22,0,193,2,224,2,162,2,193,2,131,2,162,2,69,2,100,2,38,2,69,2,7,2,38,2,201,1,232,1,170,1,201,1,139,1,170,1,77,1,108,1,46,1,77,1,15,1,46,1,209,0,240,0,178,0,209,0,147,0,178,0,85,0,116,0,54,0,85,0,23,0,54,0,194,2,225,2,163,2,194,2,70,2,101,2,39,2,70,2,202,1,233,1,171,1,202,1,78,1,109,1,47,1,78,1,210,0,241,0,179,0,210,0,86,0,117,0,55,0,86,0,195,2,226,2,71,2,102,2,203,1,234,1,79,1,110,1,211,0,242,0,87,0,118,0,224,2,224,2,100,2,131,2,232,1,7,2,108,1,139,1,240,0,15,1,116,0,147,0,23,0,23,0,0,3,0,3,225,2,0,3,132,2,163,2,101,2,132,2,8,2,39,2,233,1,8,2,140,1,171,1,109,1,140,1,16,1,47,1,241,0,16,1,148,0,179,0,117,0,148,0,24,0,55,0,24,0,24,0,32,3,32,3,1,3,32,3,226,2,1,3,164,2,195,2,133,2,164,2,102,2,133,2,40,2,71,2,9,2,40,2,234,1,9,2,172,1,203,1,141,1,172,1,110,1,141,1,48,1,79,1,17,1,48,1,242,0,17,1,180,0,211,0,149,0,180,0,118,0,149,0,56,0,87,0,25,0,56,0,25,0,25,0,64,3,64,3,33,3,64,3,2,3,33,3,227,2,2,3,196,2,227,2,165,2,196,2,134,2,165,2,103,2,134,2,72,2,103,2,41,2,72,2,10,2,41,2,235,1,10,2,204,1,235,1,173,1,204,1,142,1,173,1,111,1,142,1,80,1,111,1,49,1,80,1,18,1,49,1,243,0,18,1,212,0,243,0,181,0,212,0,150,0,181,0,119,0,150,0,88,0,119,0,57,0,88,0,26,0,57,0,26,0,26,0,65,3,96,3,34,3,65,3,3,3,34,3,197,2,228,2,166,2,197,2,135,2,166,2,73,2,104,2,42,2,73,2,11,2,42,2,205,1,236,1,174,1,205,1,143,1,174,1,81,1,112,1,50,1,81,1,19,1,50,1,213,0,244,0,182,0,213,0,151,0,182,0,89,0,120,0,58,0,89,0,27,0,58,0,66,3,97,3,35,3,66,3,198,2,229,2,167,2,198,2,74,2,105,2,43,2,74,2,206,1,237,1,175,1,206,1,82,1,113,1,51,1,82,1,214,0,245,0,183,0,214,0,90,0,121,0,59,0,90,0,67,3,98,3,199,2,230,2,75,2,106,2,207,1,238,1,83,1,114,1,215,0,246,0,91,0,122,0,96,3,96,3,228,2,3,3,104,2,135,2,236,1,11,2,112,1,143,1,244,0,19,1,120,0,151,0,27,0,27,0,128,3,128,3,97,3,128,3,4,3,35,3,229,2,4,3,136,2,167,2,105,2,136,2,12,2,43,2,237,1,12,2,144,1,175,1,113,1,144,1,20,1,51,1,245,0,20,1,152,0,183,0,121,0,152,0,28,0,59,0,28,0,28,0,160,3,160,3,129,3,160,3,98,3,129,3,36,3,67,3,5,3,36,3,230,2,5,3,168,2,199,2,137,2,168,2,106,2,137,2,44,2,75,2,13,2,44,2,238,1,13,2,176,1,207,1,145,1,176,1,114,1,145,1,52,1,83,1,21,1,52,1,246,0,21,1,184,0,215,0,153,0,184,0,122,0,153,0,60,0,91,0,29,0,60,0,29,0,29,0,192,3,192,3,161,3,192,3,130,3,161,3,99,3,130,3,68,3,99,3,37,3,68,3,6,3,37,3,231,2,6,3,200,2,231,2,169,2,200,2,138,2,169,2,107,2,138,2,76,2,107,2,45,2,76,2,14,2,45,2,239,1,14,2,208,1,239,1,177,1,208,1,146,1,177,1,115,1,146,1,84,1,115,1,53,1,84,1,22,1,53,1,247,0,22,1,216,0,247,0,185,0,216,0,154,0,185,0,123,0,154,0,92,0,123,0,61,0,92,0,30,0,61,0,30,0,30,0,193,3,224,3,162,3,193,3,131,3,162,3,69,3,100,3,38,3,69,3,7,3,38,3,201,2,232,2,170,2,201,2,139,2,170,2,77,2,108,2,46,2,77,2,15,2,46,2,209,1,240,1,178,1,209,1,147,1,178,1,85,1,116,1,54,1,85,1,23,1,54,1,217,0,248,0,186,0,217,0,155,0,186,0,93,0,124,0,62,0,93,0,31,0,62,0,194,3,225,3,163,3,194,3,70,3,101,3,39,3,70,3,202,2,233,2,171,2,202,2,78,2,109,2,47,2,78,2,210,1,241,1,179,1,210,1,86,1,117,1,55,1,86,1,218,0,249,0,187,0,218,0,94,0,125,0,63,0,94,0,195,3,226,3,71,3,102,3,203,2,234,2,79,2,110,2,211,1,242,1,87,1,118,1,219,0,250,0,95,0,126,0,100,3,131,3,232,2,7,3,108,2,139,2,240,1,15,2,116,1,147,1,248,0,23,1,124,0,155,0,132,3,163,3,101,3,132,3,8,3,39,3,233,2,8,3,140,2,171,2,109,2,140,2,16,2,47,2,241,1,16,2,148,1,179,1,117,1,148,1,24,1,55,1,249,0,24,1,156,0,187,0,125,0,156,0,164,3,195,3,133,3,164,3,102,3,133,3,40,3,71,3,9,3,40,3,234,2,9,3,172,2,203,2,141,2,172,2,110,2,141,2,48,2,79,2,17,2,48,2,242,1,17,2,180,1,211,1,149,1,180,1,118,1,149,1,56,1,87,1,25,1,56,1,250,0,25,1,188,0,219,0,157,0,188,0,126,0,157,0,196,3,227,3,165,3,196,3,134,3,165,3,103,3,134,3,72,3,103,3,41,3,72,3,10,3,41,3,235,2,10,3,204,2,235,2,173,2,204,2,142,2,173,2,111,2,142,2,80,2,111,2,49,2,80,2,18,2,49,2,243,1,18,2,212,1,243,1,181,1,212,1,150,1,181,1,119,1,150,1,88,1,119,1,57,1,88,1,26,1,57,1,251,0,26,1,220,0,251,0,189,0,220,0,158,0,189,0,127,0,158,0,197,3,228,3,166,3,197,3,135,3,166,3,73,3,104,3,42,3,73,3,11,3,42,3,205,2,236,2,174,2,205,2,143,2,174,2,81,2,112,2,50,2,81,2,19,2,50,2,213,1,244,1,182,1,213,1,151,1,182,1,89,1,120,1,58,1,89,1,27,1,58,1,221,0,252,0,190,0,221,0,159,0,190,0,198,3,229,3,167,3,198,3,74,3,105,3,43,3,74,3,206,2,237,2,175,2,206,2,82,2,113,2,51,2,82,2,214,1,245,1,183,1,214,1,90,1,121,1,59,1,90,1,222,0,253,0,191,0,222,0,199,3,230,3,75,3,106,3,207,2,238,2,83,2,114,2,215,1,246,1,91,1,122,1,223,0,254,0,104,3,135,3,236,2,11,3,112,2,143,2,244,1,19,2,120,1,151,1,252,0,27,1,136,3,167,3,105,3,136,3,12,3,43,3,237,2,12,3,144,2,175,2,113,2,144,2,20,2,51,2,245,1,20,2,152,1,183,1,121,1,152,1,28,1,59,1,253,0,28,1,168,3,199,3,137,3,168,3,106,3,137,3,44,3,75,3,13,3,44,3,238,2,13,3,176,2,207,2,145,2,176,2,114,2,145,2,52,2,83,2,21,2,52,2,246,1,21,2,184,1,215,1,153,1,184,1,122,1,153,1,60,1,91,1,29,1,60,1,254,0,29,1,200,3,231,3,169,3,200,3,138,3,169,3,107,3,138,3,76,3,107,3,45,3,76,3,14,3,45,3,239,2,14,3,208,2,239,2,177,2,208,2,146,2,177,2,115,2,146,2,84,2,115,2,53,2,84,2,22,2,53,2,247,1,22,2,216,1,247,1,185,1,216,1,154,1,185,1,123,1,154,1,92,1,123,1,61,1,92,1,30,1,61,1,255,0,30,1,201,3,232,3,170,3,201,3,139,3,170,3,77,3,108,3,46,3,77,3,15,3,46,3,209,2,240,2,178,2,209,2,147,2,178,2,85,2,116,2,54,2,85,2,23,2,54,2,217,1,248,1,186,1,217,1,155,1,186,1,93,1,124,1,62,1,93,1,31,1,62,1,202,3,233,3,171,3,202,3,78,3,109,3,47,3,78,3,210,2,241,2,179,2,210,2,86,2,117,2,55,2,86,2,218,1,249,1,187,1,218,1,94,1,125,1,63,1,94,1,203,3,234,3,79,3,110,3,211,2,242,2,87,2,118,2,219,1,250,1,95,1,126,1,108,3,139,3,240,2,15,3,116,2,147,2,248,1,23,2,124,1,155,1,140,3,171,3,109,3,140,3,16,3,47,3,241,2,16,3,148,2,179,2,117,2,148,2,24,2,55,2,249,1,24,2,156,1,187,1,125,1,156,1,172,3,203,3,141,3,172,3,110,3,141,3,48,3,79,3,17,3,48,3,242,2,17,3,180,2,211,2,149,2,180,2,118,2,149,2,56,2,87,2,25,2,56,2,250,1,25,2,188,1,219,1,157,1,188,1,126,1,157,1,204,3,235,3,173,3,204,3,142,3,173,3,111,3,142,3,80,3,111,3,49,3,80,3,18,3,49,3,243,2,18,3,212,2,243,2,181,2,212,2,150,2,181,2,119,2,150,2,88,2,119,2,57,2,88,2,26,2,57,2,251,1,26,2,220,1,251,1,189,1,220,1,158,1,189,1,127,1,158,1,205,3,236,3,174,3,205,3,143,3,174,3,81,3,112,3,50,3,81,3,19,3,50,3,213,2,244,2,182,2,213,2,151,2,182,2,89,2,120,2,58,2,89,2,27,2,58,2,221,1,252,1,190,1,221,1,159,1,190,1,206,3,237,3,175,3,206,3,82,3,113,3,51,3,82,3,214,2,245,2,183,2,214,2,90,2,121,2,59,2,90,2,222,1,253,1,191,1,222,1,207,3,238,3,83,3,114,3,215,2,246,2,91,2,122,2,223,1,254,1,112,3,143,3,244,2,19,3,120,2,151,2,252,1,27,2,144,3,175,3,113,3,144,3,20,3,51,3,245,2,20,3,152,2,183,2,121,2,152,2,28,2,59,2,253,1,28,2,176,3,207,3,145,3,176,3,114,3,145,3,52,3,83,3,21,3,52,3,246,2,21,3,184,2,215,2,153,2,184,2,122,2,153,2,60,2,91,2,29,2,60,2,254,1,29,2,208,3,239,3,177,3,208,3,146,3,177,3,115,3,146,3,84,3,115,3,53,3,84,3,22,3,53,3,247,2,22,3,216,2,247,2,185,2,216,2,154,2,185,2,123,2,154,2,92,2,123,2,61,2,92,2,30,2,61,2,255,1,30,2,209,3,240,3,178,3,209,3,147,3,178,3,85,3,116,3,54,3,85,3,23,3,54,3,217,2,248,2,186,2,217,2,155,2,186,2,93,2,124,2,62,2,93,2,31,2,62,2,210,3,241,3,179,3,210,3,86,3,117,3,55,3,86,3,218,2,249,2,187,2,218,2,94,2,125,2,63,2,94,2,211,3,242,3,87,3,118,3,219,2,250,2,95,2,126,2,116,3,147,3,248,2,23,3,124,2,155,2,148,3,179,3,117,3,148,3,24,3,55,3,249,2,24,3,156,2,187,2,125,2,156,2,180,3,211,3,149,3,180,3,118,3,149,3,56,3,87,3,25,3,56,3,250,2,25,3,188,2,219,2,157,2,188,2,126,2,157,2,212,3,243,3,181,3,212,3,150,3,181,3,119,3,150,3,88,3,119,3,57,3,88,3,26,3,57,3,251,2,26,3,220,2,251,2,189,2,220,2,158,2,189,2,127,2,158,2,213,3,244,3,182,3,213,3,151,3,182,3,89,3,120,3,58,3,89,3,27,3,58,3,221,2,252,2,190,2,221,2,159,2,190,2,214,3,245,3,183,3,214,3,90,3,121,3,59,3,90,3,222,2,253,2,191,2,222,2,215,3,246,3,91,3,122,3,223,2,254,2,120,3,151,3,252,2,27,3,152,3,183,3,121,3,152,3,28,3,59,3,253,2,28,3,184,3,215,3,153,3,184,3,122,3,153,3,60,3,91,3,29,3,60,3,254,2,29,3,216,3,247,3,185,3,216,3,154,3,185,3,123,3,154,3,92,3,123,3,61,3,92,3,30,3,61,3,255,2,30,3,217,3,248,3,186,3,217,3,155,3,186,3,93,3,124,3,62,3,93,3,31,3,62,3,218,3,249,3,187,3,218,3,94,3,125,3,63,3,94,3,219,3,250,3,95,3,126,3,124,3,155,3,156,3,187,3,125,3,156,3,188,3,219,3,157,3,188,3,126,3,157,3,220,3,251,3,189,3,220,3,158,3,189,3,127,3,158,3,221,3,252,3,190,3,221,3,159,3,190,3,222,3,253,3,191,3,222,3,223,3,254,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,4,0,2,0,5,0,3,0,6,0,8,0,9,0,7,0,12,0,10,0,13,0,11,0,14,0,15,0,0,0,1,0,3,0,5,0,2,0,4,0,6,0,9,0,7,0,8,0,11,0,13,0,10,0,12,0,14,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,4,0,4,0,2,0,2,0,5,0,5,0,4,0,4,0,8,0,8,0,6,0,6,0,8,0,8,0,9,0,9,0,12,0,12,0,10,0,10,0,13,0,13,0,14,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,8,0,1,0,12,0,5,0,9,0,2,0,13,0,6,0,10,0,3,0,7,0,14,0,11,0,15,0,0,0,3,0,7,0,11,0,1,0,5,0,9,0,12,0,2,0,6,0,10,0,14,0,4,0,8,0,13,0,15,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,8,0,8,0,1,0,1,0,5,0,5,0,1,0,1,0,9,0,9,0,2,0,2,0,6,0,6,0,2,0,2,0,3,0,3,0,10,0,10,0,7,0,7,0,11,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,8,0,9,0,3,0,16,0,10,0,4,0,17,0,11,0,24,0,5,0,18,0,25,0,12,0,19,0,26,0,32,0,6,0,13,0,20,0,33,0,27,0,7,0,34,0,40,0,21,0,28,0,41,0,14,0,35,0,48,0,42,0,29,0,36,0,49,0,22,0,43,0,15,0,56,0,37,0,50,0,44,0,30,0,57,0,23,0,51,0,58,0,45,0,38,0,52,0,31,0,59,0,53,0,46,0,60,0,39,0,61,0,47,0,54,0,55,0,62,0,63,0,0,0,1,0,2,0,5,0,8,0,12,0,19,0,24,0,3,0,4,0,7,0,10,0,15,0,20,0,30,0,39,0,6,0,9,0,13,0,16,0,21,0,27,0,37,0,46,0,11,0,14,0,17,0,23,0,28,0,34,0,44,0,52,0,18,0,22,0,25,0,31,0,35,0,41,0,50,0,57,0,26,0,29,0,33,0,38,0,43,0,49,0,55,0,59,0,32,0,36,0,42,0,47,0,51,0,54,0,60,0,61,0,40,0,45,0,48,0,53,0,56,0,58,0,62,0,63,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,8,0,8,0,2,0,2,0,8,0,8,0,9,0,9,0,3,0,3,0,16,0,16,0,10,0,10,0,16,0,16,0,4,0,4,0,17,0,17,0,24,0,24,0,11,0,11,0,18,0,18,0,25,0,25,0,24,0,24,0,5,0,5,0,12,0,12,0,19,0,19,0,32,0,32,0,26,0,26,0,6,0,6,0,33,0,33,0,32,0,32,0,20,0,20,0,27,0,27,0,40,0,40,0,13,0,13,0,34,0,34,0,40,0,40,0,41,0,41,0,28,0,28,0,35,0,35,0,48,0,48,0,21,0,21,0,42,0,42,0,14,0,14,0,48,0,48,0,36,0,36,0,49,0,49,0,43,0,43,0,29,0,29,0,56,0,56,0,22,0,22,0,50,0,50,0,57,0,57,0,44,0,44,0,37,0,37,0,51,0,51,0,30,0,30,0,58,0,58,0,52,0,52,0,45,0,45,0,59,0,59,0,38,0,38,0,60,0,60,0,46,0,46,0,53,0,53,0,54,0,54,0,61,0,61,0,62,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,16,0,1,0,24,0,9,0,32,0,17,0,2,0,40,0,25,0,10,0,33,0,18,0,48,0,3,0,26,0,41,0,11,0,56,0,19,0,34,0,4,0,49,0,27,0,42,0,12,0,35,0,20,0,57,0,50,0,28,0,5,0,43,0,13,0,36,0,58,0,51,0,21,0,44,0,6,0,29,0,59,0,37,0,14,0,52,0,22,0,7,0,45,0,60,0,30,0,15,0,38,0,53,0,23,0,46,0,31,0,61,0,39,0,54,0,47,0,62,0,55,0,63,0,0,0,3,0,8,0,15,0,22,0,32,0,40,0,47,0,1,0,5,0,11,0,18,0,26,0,34,0,44,0,51,0,2,0,7,0,13,0,20,0,28,0,38,0,46,0,54,0,4,0,10,0,16,0,24,0,31,0,41,0,50,0,56,0,6,0,12,0,21,0,27,0,35,0,43,0,52,0,58,0,9,0,17,0,25,0,33,0,39,0,48,0,55,0,60,0,14,0,23,0,30,0,37,0,45,0,53,0,59,0,62,0,19,0,29,0,36,0,42,0,49,0,57,0,61,0,63,0,0,0,0,0,0,0,0,0,8,0,8,0,0,0,0,0,16,0,16,0,1,0,1,0,24,0,24,0,9,0,9,0,1,0,1,0,32,0,32,0,17,0,17,0,2,0,2,0,25,0,25,0,10,0,10,0,40,0,40,0,2,0,2,0,18,0,18,0,33,0,33,0,3,0,3,0,48,0,48,0,11,0,11,0,26,0,26,0,3,0,3,0,41,0,41,0,19,0,19,0,34,0,34,0,4,0,4,0,27,0,27,0,12,0,12,0,49,0,49,0,42,0,42,0,20,0,20,0,4,0,4,0,35,0,35,0,5,0,5,0,28,0,28,0,50,0,50,0,43,0,43,0,13,0,13,0,36,0,36,0,5,0,5,0,21,0,21,0,51,0,51,0,29,0,29,0,6,0,6,0,44,0,44,0,14,0,14,0,6,0,6,0,37,0,37,0,52,0,52,0,22,0,22,0,7,0,7,0,30,0,30,0,45,0,45,0,15,0,15,0,38,0,38,0,23,0,23,0,53,0,53,0,31,0,31,0,46,0,46,0,39,0,39,0,54,0,54,0,47,0,47,0,55,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,16,0,3,0,17,0,4,0,18,0,32,0,5,0,33,0,19,0,6,0,34,0,48,0,20,0,49,0,7,0,35,0,21,0,50,0,64,0,8,0,36,0,65,0,22,0,51,0,37,0,80,0,9,0,66,0,52,0,23,0,38,0,81,0,67,0,10,0,53,0,24,0,82,0,68,0,96,0,39,0,11,0,54,0,83,0,97,0,69,0,25,0,98,0,84,0,40,0,112,0,55,0,12,0,70,0,99,0,113,0,85,0,26,0,41,0,56,0,114,0,100,0,13,0,71,0,128,0,86,0,27,0,115,0,101,0,129,0,42,0,57,0,72,0,116,0,14,0,87,0,130,0,102,0,144,0,73,0,131,0,117,0,28,0,58,0,15,0,88,0,43,0,145,0,103,0,132,0,146,0,118,0,74,0,160,0,89,0,133,0,104,0,29,0,59,0,147,0,119,0,44,0,161,0,148,0,90,0,105,0,134,0,162,0,120,0,176,0,75,0,135,0,149,0,30,0,60,0,163,0,177,0,45,0,121,0,91,0,106,0,164,0,178,0,150,0,192,0,136,0,165,0,179,0,31,0,151,0,193,0,76,0,122,0,61,0,137,0,194,0,107,0,152,0,180,0,208,0,46,0,166,0,167,0,195,0,92,0,181,0,138,0,209,0,123,0,153,0,224,0,196,0,77,0,168,0,210,0,182,0,240,0,108,0,197,0,62,0,154,0,225,0,183,0,169,0,211,0,47,0,139,0,93,0,184,0,226,0,212,0,241,0,198,0,170,0,124,0,155,0,199,0,78,0,213,0,185,0,109,0,227,0,200,0,63,0,228,0,242,0,140,0,214,0,171,0,186,0,156,0,229,0,243,0,125,0,94,0,201,0,244,0,215,0,216,0,230,0,141,0,187,0,202,0,79,0,172,0,110,0,157,0,245,0,217,0,231,0,95,0,246,0,232,0,126,0,203,0,247,0,233,0,173,0,218,0,142,0,111,0,158,0,188,0,248,0,127,0,234,0,219,0,249,0,189,0,204,0,143,0,174,0,159,0,250,0,235,0,205,0,220,0,175,0,190,0,251,0,221,0,191,0,206,0,236,0,207,0,237,0,252,0,222,0,253,0,223,0,238,0,239,0,254,0,255,0,0,0,1,0,2,0,4,0,6,0,9,0,12,0,17,0,22,0,29,0,36,0,43,0,54,0,64,0,76,0,86,0,3,0,5,0,7,0,11,0,15,0,19,0,25,0,32,0,38,0,48,0,59,0,68,0,84,0,99,0,115,0,130,0,8,0,10,0,13,0,18,0,23,0,27,0,33,0,42,0,51,0,60,0,72,0,88,0,103,0,119,0,142,0,167,0,14,0,16,0,20,0,26,0,31,0,37,0,44,0,53,0,61,0,73,0,85,0,100,0,116,0,135,0,161,0,185,0,21,0,24,0,30,0,35,0,40,0,47,0,55,0,65,0,74,0,81,0,94,0,112,0,133,0,154,0,179,0,205,0,28,0,34,0,39,0,45,0,50,0,58,0,67,0,77,0,87,0,96,0,106,0,121,0,146,0,169,0,196,0,212,0,41,0,46,0,49,0,56,0,63,0,70,0,79,0,90,0,98,0,107,0,122,0,138,0,159,0,182,0,207,0,222,0,52,0,57,0,62,0,69,0,75,0,83,0,93,0,102,0,110,0,120,0,134,0,150,0,176,0,195,0,215,0,226,0,66,0,71,0,78,0,82,0,91,0,97,0,108,0,113,0,127,0,136,0,148,0,168,0,188,0,202,0,221,0,232,0,80,0,89,0,92,0,101,0,105,0,114,0,125,0,131,0,139,0,151,0,162,0,177,0,192,0,208,0,223,0,234,0,95,0,104,0,109,0,117,0,123,0,128,0,143,0,144,0,155,0,165,0,175,0,190,0,206,0,219,0,233,0,239,0,111,0,118,0,124,0,129,0,140,0,147,0,157,0,164,0,170,0,181,0,191,0,203,0,224,0,230,0,240,0,243,0,126,0,132,0,137,0,145,0,153,0,160,0,174,0,178,0,184,0,197,0,204,0,216,0,231,0,237,0,244,0,246,0,141,0,149,0,156,0,166,0,172,0,180,0,189,0,199,0,200,0,210,0,220,0,228,0,238,0,242,0,249,0,251,0,152,0,163,0,171,0,183,0,186,0,193,0,201,0,211,0,214,0,218,0,227,0,236,0,245,0,247,0,252,0,253,0,158,0,173,0,187,0,194,0,198,0,209,0,213,0,217,0,225,0,229,0,235,0,241,0,248,0,250,0,254,0,255,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,2,0,2,0,16,0,16,0,3,0,3,0,17,0,17,0,16,0,16,0,4,0,4,0,32,0,32,0,18,0,18,0,5,0,5,0,33,0,33,0,32,0,32,0,19,0,19,0,48,0,48,0,6,0,6,0,34,0,34,0,20,0,20,0,49,0,49,0,48,0,48,0,7,0,7,0,35,0,35,0,64,0,64,0,21,0,21,0,50,0,50,0,36,0,36,0,64,0,64,0,8,0,8,0,65,0,65,0,51,0,51,0,22,0,22,0,37,0,37,0,80,0,80,0,66,0,66,0,9,0,9,0,52,0,52,0,23,0,23,0,81,0,81,0,67,0,67,0,80,0,80,0,38,0,38,0,10,0,10,0,53,0,53,0,82,0,82,0,96,0,96,0,68,0,68,0,24,0,24,0,97,0,97,0,83,0,83,0,39,0,39,0,96,0,96,0,54,0,54,0,11,0,11,0,69,0,69,0,98,0,98,0,112,0,112,0,84,0,84,0,25,0,25,0,40,0,40,0,55,0,55,0,113,0,113,0,99,0,99,0,12,0,12,0,70,0,70,0,112,0,112,0,85,0,85,0,26,0,26,0,114,0,114,0,100,0,100,0,128,0,128,0,41,0,41,0,56,0,56,0,71,0,71,0,115,0,115,0,13,0,13,0,86,0,86,0,129,0,129,0,101,0,101,0,128,0,128,0,72,0,72,0,130,0,130,0,116,0,116,0,27,0,27,0,57,0,57,0,14,0,14,0,87,0,87,0,42,0,42,0,144,0,144,0,102,0,102,0,131,0,131,0,145,0,145,0,117,0,117,0,73,0,73,0,144,0,144,0,88,0,88,0,132,0,132,0,103,0,103,0,28,0,28,0,58,0,58,0,146,0,146,0,118,0,118,0,43,0,43,0,160,0,160,0,147,0,147,0,89,0,89,0,104,0,104,0,133,0,133,0,161,0,161,0,119,0,119,0,160,0,160,0,74,0,74,0,134,0,134,0,148,0,148,0,29,0,29,0,59,0,59,0,162,0,162,0,176,0,176,0,44,0,44,0,120,0,120,0,90,0,90,0,105,0,105,0,163,0,163,0,177,0,177,0,149,0,149,0,176,0,176,0,135,0,135,0,164,0,164,0,178,0,178,0,30,0,30,0,150,0,150,0,192,0,192,0,75,0,75,0,121,0,121,0,60,0,60,0,136,0,136,0,193,0,193,0,106,0,106,0,151,0,151,0,179,0,179,0,192,0,192,0,45,0,45,0,165,0,165,0,166,0,166,0,194,0,194,0,91,0,91,0,180,0,180,0,137,0,137,0,208,0,208,0,122,0,122,0,152,0,152,0,208,0,208,0,195,0,195,0,76,0,76,0,167,0,167,0,209,0,209,0,181,0,181,0,224,0,224,0,107,0,107,0,196,0,196,0,61,0,61,0,153,0,153,0,224,0,224,0,182,0,182,0,168,0,168,0,210,0,210,0,46,0,46,0,138,0,138,0,92,0,92,0,183,0,183,0,225,0,225,0,211,0,211,0,240,0,240,0,197,0,197,0,169,0,169,0,123,0,123,0,154,0,154,0,198,0,198,0,77,0,77,0,212,0,212,0,184,0,184,0,108,0,108,0,226,0,226,0,199,0,199,0,62,0,62,0,227,0,227,0,241,0,241,0,139,0,139,0,213,0,213,0,170,0,170,0,185,0,185,0,155,0,155,0,228,0,228,0,242,0,242,0,124,0,124,0,93,0,93,0,200,0,200,0,243,0,243,0,214,0,214,0,215,0,215,0,229,0,229,0,140,0,140,0,186,0,186,0,201,0,201,0,78,0,78,0,171,0,171,0,109,0,109,0,156,0,156,0,244,0,244,0,216,0,216,0,230,0,230,0,94,0,94,0,245,0,245,0,231,0,231,0,125,0,125,0,202,0,202,0,246,0,246,0,232,0,232,0,172,0,172,0,217,0,217,0,141,0,141,0,110,0,110,0,157,0,157,0,187,0,187,0,247,0,247,0,126,0,126,0,233,0,233,0,218,0,218,0,248,0,248,0,188,0,188,0,203,0,203,0,142,0,142,0,173,0,173,0,158,0,158,0,249,0,249,0,234,0,234,0,204,0,204,0,219,0,219,0,174,0,174,0,189,0,189,0,250,0,250,0,220,0,220,0,190,0,190,0,205,0,205,0,235,0,235,0,206,0,206,0,236,0,236,0,251,0,251,0,221,0,221,0,252,0,252,0,222,0,222,0,237,0,237,0,238,0,238,0,253,0,253,0,254,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,32,0,48,0,1,0,64,0,17,0,80,0,33,0,96,0,49,0,2,0,65,0,112,0,18,0,81,0,34,0,128,0,50,0,97,0,3,0,66,0,144,0,19,0,113,0,35,0,82,0,160,0,98,0,51,0,129,0,4,0,67,0,176,0,20,0,114,0,145,0,83,0,36,0,99,0,130,0,52,0,192,0,5,0,161,0,68,0,115,0,21,0,146,0,84,0,208,0,177,0,37,0,131,0,100,0,53,0,162,0,224,0,69,0,6,0,116,0,193,0,147,0,85,0,22,0,240,0,132,0,38,0,178,0,101,0,163,0,54,0,209,0,117,0,70,0,7,0,148,0,194,0,86,0,179,0,225,0,23,0,133,0,39,0,164,0,8,0,102,0,210,0,241,0,55,0,195,0,118,0,149,0,71,0,180,0,24,0,87,0,226,0,134,0,165,0,211,0,40,0,103,0,56,0,72,0,150,0,196,0,242,0,119,0,9,0,181,0,227,0,88,0,166,0,25,0,135,0,41,0,104,0,212,0,57,0,151,0,197,0,120,0,73,0,243,0,182,0,136,0,167,0,213,0,89,0,10,0,228,0,105,0,152,0,198,0,26,0,42,0,121,0,183,0,244,0,168,0,58,0,137,0,229,0,74,0,214,0,90,0,153,0,199,0,184,0,11,0,106,0,245,0,27,0,122,0,230,0,169,0,43,0,215,0,59,0,200,0,138,0,185,0,246,0,75,0,12,0,91,0,154,0,216,0,231,0,107,0,28,0,44,0,201,0,123,0,170,0,60,0,247,0,232,0,76,0,139,0,13,0,92,0,217,0,186,0,248,0,155,0,108,0,29,0,124,0,45,0,202,0,233,0,171,0,61,0,14,0,77,0,140,0,15,0,249,0,93,0,30,0,187,0,156,0,218,0,46,0,109,0,125,0,62,0,172,0,78,0,203,0,31,0,141,0,234,0,94,0,47,0,188,0,63,0,157,0,110,0,250,0,219,0,79,0,126,0,204,0,173,0,142,0,95,0,189,0,111,0,235,0,158,0,220,0,251,0,127,0,174,0,143,0,205,0,236,0,159,0,190,0,221,0,252,0,175,0,206,0,237,0,191,0,253,0,222,0,238,0,207,0,254,0,223,0,239,0,255,0,0,0,4,0,11,0,20,0,31,0,43,0,59,0,75,0,85,0,109,0,130,0,150,0,165,0,181,0,195,0,198,0,1,0,6,0,14,0,23,0,34,0,47,0,64,0,81,0,95,0,114,0,135,0,153,0,171,0,188,0,201,0,212,0,2,0,8,0,16,0,25,0,38,0,52,0,67,0,83,0,101,0,116,0,136,0,157,0,172,0,190,0,205,0,216,0,3,0,10,0,18,0,29,0,41,0,55,0,71,0,89,0,103,0,119,0,141,0,159,0,176,0,194,0,208,0,218,0,5,0,12,0,21,0,32,0,45,0,58,0,74,0,93,0,104,0,123,0,144,0,164,0,179,0,196,0,210,0,223,0,7,0,15,0,26,0,37,0,49,0,63,0,78,0,96,0,112,0,129,0,146,0,166,0,182,0,200,0,215,0,228,0,9,0,19,0,28,0,39,0,54,0,69,0,86,0,102,0,117,0,132,0,151,0,170,0,187,0,206,0,220,0,230,0,13,0,24,0,35,0,46,0,60,0,73,0,91,0,108,0,122,0,137,0,154,0,174,0,189,0,207,0,224,0,235,0,17,0,30,0,40,0,53,0,66,0,82,0,98,0,115,0,126,0,142,0,161,0,180,0,197,0,213,0,227,0,237,0,22,0,36,0,48,0,62,0,76,0,92,0,105,0,120,0,133,0,147,0,167,0,186,0,203,0,219,0,232,0,240,0,27,0,44,0,56,0,70,0,84,0,99,0,113,0,127,0,140,0,156,0,175,0,193,0,209,0,226,0,236,0,244,0,33,0,51,0,68,0,79,0,94,0,110,0,125,0,138,0,149,0,162,0,184,0,202,0,217,0,229,0,241,0,247,0,42,0,61,0,77,0,90,0,106,0,121,0,134,0,148,0,160,0,173,0,191,0,211,0,225,0,238,0,245,0,251,0,50,0,72,0,87,0,100,0,118,0,128,0,145,0,158,0,168,0,183,0,204,0,222,0,233,0,242,0,249,0,253,0,57,0,80,0,97,0,111,0,131,0,143,0,155,0,169,0,178,0,192,0,214,0,231,0,239,0,246,0,250,0,254,0,65,0,88,0,107,0,124,0,139,0,152,0,163,0,177,0,185,0,199,0,221,0,234,0,243,0,248,0,252,0,255,0,0,0,0,0,0,0,0,0,16,0,16,0,32,0,32,0,0,0,0,0,48,0,48,0,1,0,1,0,64,0,64,0,17,0,17,0,80,0,80,0,33,0,33,0,1,0,1,0,49,0,49,0,96,0,96,0,2,0,2,0,65,0,65,0,18,0,18,0,112,0,112,0,34,0,34,0,81,0,81,0,2,0,2,0,50,0,50,0,128,0,128,0,3,0,3,0,97,0,97,0,19,0,19,0,66,0,66,0,144,0,144,0,82,0,82,0,35,0,35,0,113,0,113,0,3,0,3,0,51,0,51,0,160,0,160,0,4,0,4,0,98,0,98,0,129,0,129,0,67,0,67,0,20,0,20,0,83,0,83,0,114,0,114,0,36,0,36,0,176,0,176,0,4,0,4,0,145,0,145,0,52,0,52,0,99,0,99,0,5,0,5,0,130,0,130,0,68,0,68,0,192,0,192,0,161,0,161,0,21,0,21,0,115,0,115,0,84,0,84,0,37,0,37,0,146,0,146,0,208,0,208,0,53,0,53,0,5,0,5,0,100,0,100,0,177,0,177,0,131,0,131,0,69,0,69,0,6,0,6,0,224,0,224,0,116,0,116,0,22,0,22,0,162,0,162,0,85,0,85,0,147,0,147,0,38,0,38,0,193,0,193,0,101,0,101,0,54,0,54,0,6,0,6,0,132,0,132,0,178,0,178,0,70,0,70,0,163,0,163,0,209,0,209,0,7,0,7,0,117,0,117,0,23,0,23,0,148,0,148,0,7,0,7,0,86,0,86,0,194,0,194,0,225,0,225,0,39,0,39,0,179,0,179,0,102,0,102,0,133,0,133,0,55,0,55,0,164,0,164,0,8,0,8,0,71,0,71,0,210,0,210,0,118,0,118,0,149,0,149,0,195,0,195,0,24,0,24,0,87,0,87,0,40,0,40,0,56,0,56,0,134,0,134,0,180,0,180,0,226,0,226,0,103,0,103,0,8,0,8,0,165,0,165,0,211,0,211,0,72,0,72,0,150,0,150,0,9,0,9,0,119,0,119,0,25,0,25,0,88,0,88,0,196,0,196,0,41,0,41,0,135,0,135,0,181,0,181,0,104,0,104,0,57,0,57,0,227,0,227,0,166,0,166,0,120,0,120,0,151,0,151,0,197,0,197,0,73,0,73,0,9,0,9,0,212,0,212,0,89,0,89,0,136,0,136,0,182,0,182,0,10,0,10,0,26,0,26,0,105,0,105,0,167,0,167,0,228,0,228,0,152,0,152,0,42,0,42,0,121,0,121,0,213,0,213,0,58,0,58,0,198,0,198,0,74,0,74,0,137,0,137,0,183,0,183,0,168,0,168,0,10,0,10,0,90,0,90,0,229,0,229,0,11,0,11,0,106,0,106,0,214,0,214,0,153,0,153,0,27,0,27,0,199,0,199,0,43,0,43,0,184,0,184,0,122,0,122,0,169,0,169,0,230,0,230,0,59,0,59,0,11,0,11,0,75,0,75,0,138,0,138,0,200,0,200,0,215,0,215,0,91,0,91,0,12,0,12,0,28,0,28,0,185,0,185,0,107,0,107,0,154,0,154,0,44,0,44,0,231,0,231,0,216,0,216,0,60,0,60,0,123,0,123,0,12,0,12,0,76,0,76,0,201,0,201,0,170,0,170,0,232,0,232,0,139,0,139,0,92,0,92,0,13,0,13,0,108,0,108,0,29,0,29,0,186,0,186,0,217,0,217,0,155,0,155,0,45,0,45,0,13,0,13,0,61,0,61,0,124,0,124,0,14,0,14,0,233,0,233,0,77,0,77,0,14,0,14,0,171,0,171,0,140,0,140,0,202,0,202,0,30,0,30,0,93,0,93,0,109,0,109,0,46,0,46,0,156,0,156,0,62,0,62,0,187,0,187,0,15,0,15,0,125,0,125,0,218,0,218,0,78,0,78,0,31,0,31,0,172,0,172,0,47,0,47,0,141,0,141,0,94,0,94,0,234,0,234,0,203,0,203,0,63,0,63,0,110,0,110,0,188,0,188,0,157,0,157,0,126,0,126,0,79,0,79,0,173,0,173,0,95,0,95,0,219,0,219,0,142,0,142,0,204,0,204,0,235,0,235,0,111,0,111,0,158,0,158,0,127,0,127,0,189,0,189,0,220,0,220,0,143,0,143,0,174,0,174,0,205,0,205,0,236,0,236,0,159,0,159,0,190,0,190,0,221,0,221,0,175,0,175,0,237,0,237,0,206,0,206,0,222,0,222,0,191,0,191,0,238,0,238,0,207,0,207,0,223,0,223,0,239,0,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,3,3,3,3,0,0,0,0,15,15,0,0,0,0,0,0,15,15,15,15,0,0,0,0,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,0,255,0,255,0,255,0,0,0,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,85,85,85,85,85,85,85,85,17,17,17,17,17,17,17,17,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,12,0,0,0,19,0,0,0,25,0,0,0,32,0,0,0,38,0,0,0,44,0,0,0,51,0,0,0,57,0,0,0,64,0,0,0,70,0,0,0,76,0,0,0,83,0,0,0,89,0,0,0,96,0,0,0,102,0,0,0,108,0,0,0,115,0,0,0,121,0,0,0,128,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,255,0,0,0,63,0,0,0,3,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,112,10,0,0,144,10,0,0,176,10,0,0,0,11,0,0,128,11,0,0,0,12,0,0,16,13,0,0,16,15,0,0,16,17,0,0,32,21,0,0,32,29,0,0,32,37,0,0,112,10,0,0,144,10,0,0,176,10,0,0,48,53,0,0,80,53,0,0,112,53,0,0,192,53,0,0,224,53,0,0,0,54,0,0,112,10,0,0,144,10,0,0,176,10,0,0,0,11,0,0,128,11,0,0,0,12,0,0,80,54,0,0,208,54,0,0,80,55,0,0,96,56,0,0,224,56,0,0,96,57,0,0,0,11,0,0,128,11,0,0,0,12,0,0,16,13,0,0,16,15,0,0,16,17,0,0,112,58,0,0,112,60,0,0,112,62,0,0,128,66,0,0,128,68,0,0,128,70,0,0,16,13,0,0,16,15,0,0,16,17,0,0,32,21,0,0,32,29,0,0,32,37,0,0,32,21,0,0,32,29,0,0,32,37,0,0,32,21,0,0,32,29,0,0,32,37,0,0,32,21,0,0,32,29,0,0,32,37,0,0,1,115,0,0,5,0,0,0,1,0,64,0,1,0,0,0,3,0,0,0,160,78,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,6,0,0,0,8,1,0,0,7,0,0,0,3,1,0,0,8,0,0,0,7,1,0,0,9,0,0,0,9,1,0,0,10,0,0,0,10,1,0,0,11,0,0,0,0,1,0,0,12,0,0,0,1,1,0,0,13,0,0,0,128,0,0,0,14,0,0,0,5,1,0,0,15,0,0,0,6,1,0,0,16,0,0,0,4,1,0,0,17,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,254,255,255,255,254,255,255,255,0,0,0,0,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,1,0,0,0,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,1,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,253,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,0,0,0,0,253,255,255,255,253,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,2,0,0,0,255,255,255,255,255,255,255,255,1,0,0,0,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,253,255,255,255,255,255,255,255,1,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,2,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,253,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,4,0,0,0,255,255,255,255,255,255,255,255,2,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,253,255,255,255,253,255,255,255,0,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,4,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,255,255,255,255,2,0,0,0,255,255,255,255,3,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,4,0,0,0,4,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,6,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,9,0,0,0,0,0,0,0,9,0,0,0,9,0,0,0,5,0,0,0,5,0,0,0,9,0,0,0,5,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,6,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,0,83,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,156,148,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,3,0,3,0,15,0,15,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,17,0,1,0,17,0,17,17,17,0,17,17,1,0,1,0,1,0,1,0,1,0,1,0,1,0,17,0,3,0,51,0,51,51,255,0,255,255,255,255,255,255,15,15,15,0,255,255,255,255,85,85,17,17,4,0,8,0,8,0,9,0,10,0,11,0,12,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,38,0,39,0,40,0,41,0,42,0,43,0,43,0,44,0,45,0,46,0,47,0,48,0,48,0,49,0,50,0,51,0,52,0,53,0,53,0,54,0,55,0,56,0,57,0,57,0,58,0,59,0,60,0,61,0,62,0,62,0,63,0,64,0,65,0,66,0,66,0,67,0,68,0,69,0,70,0,70,0,71,0,72,0,73,0,74,0,74,0,75,0,76,0,77,0,78,0,78,0,79,0,80,0,81,0,81,0,82,0,83,0,84,0,85,0,85,0,87,0,88,0,90,0,92,0,93,0,95,0,96,0,98,0,99,0,101,0,102,0,104,0,105,0,107,0,108,0,110,0,111,0,113,0,114,0,116,0,117,0,118,0,120,0,121,0,123,0,125,0,127,0,129,0,131,0,134,0,136,0,138,0,140,0,142,0,144,0,146,0,148,0,150,0,152,0,154,0,156,0,158,0,161,0,164,0,166,0,169,0,172,0,174,0,177,0,180,0,182,0,185,0,187,0,190,0,192,0,195,0,199,0,202,0,205,0,208,0,211,0,214,0,217,0,220,0,223,0,226,0,230,0,233,0,237,0,240,0,243,0,247,0,250,0,253,0,1,1,5,1,9,1,13,1,16,1,20,1,24,1,28,1,32,1,36,1,40,1,44,1,48,1,53,1,57,1,61,1,66,1,70,1,74,1,79,1,84,1,88,1,93,1,98,1,103,1,108,1,113,1,118,1,123,1,128,1,133,1,139,1,144,1,150,1,155,1,161,1,167,1,173,1,179,1,185,1,191,1,198,1,205,1,211,1,219,1,226,1,233,1,241,1,249,1,1,2,10,2,18,2,27,2,37,2,47,2,57,2,67,2,78,2,90,2,102,2,114,2,128,2,142,2,156,2,172,2,188,2,205,2,224,2,243,2,7,3,28,3,51,3,75,3,101,3,128,3,157,3,187,3,220,3,254,3,34,4,74,4,115,4,160,4,208,4,2,5,56,5,4,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,104,0,106,0,108,0,110,0,112,0,114,0,116,0,118,0,120,0,122,0,124,0,126,0,128,0,130,0,132,0,134,0,136,0,138,0,140,0,142,0,144,0,146,0,148,0,150,0,152,0,155,0,158,0,161,0,164,0,167,0,170,0,173,0,176,0,179,0,182,0,185,0,188,0,191,0,194,0,197,0,200,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235,0,239,0,243,0,247,0,251,0,255,0,4,1,9,1,14,1,19,1,24,1,29,1,34,1,39,1,44,1,49,1,55,1,61,1,67,1,73,1,79,1,85,1,91,1,97,1,103,1,110,1,117,1,124,1,131,1,138,1,145,1,152,1,160,1,168,1,176,1,184,1,192,1,200,1,209,1,218,1,227,1,236,1,245,1,254,1,8,2,18,2,28,2,38,2,48,2,59,2,70,2,81,2,92,2,103,2,115,2,127,2,139,2,151,2,164,2,177,2,190,2,203,2,217,2,231,2,245,2,3,3,18,3,33,3,48,3,64,3,80,3,96,3,113,3,130,3,147,3,165,3,183,3,201,3,220,3,239,3,2,4,22,4,42,4,63,4,84,4,105,4,127,4,149,4,172,4,195,4,219,4,243,4,12,5,37,5,63,5,89,5,116,5,143,5,171,5,199,5,228,5,1,6,31,6,61,6,92,6,124,6,156,6,189,6,223,6,1,7,36,7,3,86,128,6,86,23,88,29,6,86,128,11,87,42,91,52,9,86,129,17,88,61,94,76,12,86,129,22,88,77,97,93,15,87,129,28,89,93,100,110,17,87,129,33,90,105,103,123,20,88,130,38,91,118,106,136,23,88,130,43,91,128,108,146,26,89,131,48,92,139,111,156,28,89,131,53,93,147,114,163,31,90,131,58,94,156,117,171,34,90,131,62,94,163,119,177,37,90,132,66,95,171,122,184,39,90,132,70,96,177,124,189,42,91,132,75,97,183,127,194,44,91,132,79,97,188,129,198,47,92,133,83,98,193,132,202,49,92,133,86,99,197,134,205,52,93,133,90,100,201,137,208,54,93,133,94,100,204,139,211,57,94,134,98,101,208,142,214,59,94,134,101,102,211,144,216,62,94,135,105,103,214,146,218,64,94,135,108,103,216,148,220,66,95,135,111,104,219,151,222,68,95,135,114,105,221,153,223,71,96,136,117,106,224,155,225,73,96,136,120,106,225,157,226,76,97,136,123,107,227,159,228,78,97,136,126,108,229,160,229,80,98,137,129,109,231,162,231,82,98,137,131,109,232,164,232,84,98,138,134,110,234,166,233,86,98,138,137,111,235,168,234,89,99,138,140,112,236,170,235,91,99,138,142,112,237,171,235,93,100,139,145,113,238,173,236,95,100,139,147,114,239,174,237,97,101,140,149,115,240,176,238,99,101,140,151,115,241,177,238,101,102,140,154,116,242,179,239,103,102,140,156,117,242,180,239,105,103,141,158,118,243,182,240,107,103,141,160,118,243,183,240,109,104,141,162,119,244,185,241,111,104,141,164,119,244,186,241,113,104,142,166,120,245,187,242,114,104,142,168,121,245,188,242,116,105,143,170,122,246,190,243,118,105,143,171,122,246,191,243,120,106,143,173,123,247,192,244,121,106,143,175,124,247,193,244,123,107,144,177,125,248,195,244,125,107,144,178,125,248,196,244,127,108,145,180,126,249,197,245,128,108,145,181,127,249,198,245,130,109,145,183,128,249,199,245,132,109,145,184,128,249,200,245,134,110,146,186,129,250,201,246,135,110,146,187,130,250,202,246,137,111,147,189,131,251,203,246,138,111,147,190,131,251,204,246,140,112,147,192,132,251,205,247,141,112,147,193,132,251,206,247,143,113,148,194,133,251,207,247,144,113,148,195,134,251,207,247,146,114,149,197,135,252,208,248,147,114,149,198,135,252,209,248,149,115,149,199,136,252,210,248,150,115,149,200,137,252,210,248,152,115,150,201,138,252,211,248,153,115,150,202,138,252,212,248,155,116,151,204,139,253,213,249,156,116,151,205,139,253,213,249,158,117,151,206,140,253,214,249,159,117,151,207,141,253,215,249,161,118,152,208,142,253,216,249,162,118,152,209,142,253,216,249,163,119,153,210,143,253,217,249,164,119,153,211,143,253,217,249,166,120,153,212,144,254,218,250,167,120,153,212,145,254,219,250,168,121,154,213,146,254,220,250,169,121,154,214,146,254,220,250,171,122,155,215,147,254,221,250,172,122,155,216,147,254,221,250,173,123,155,217,148,254,222,250,174,123,155,217,149,254,222,250,176,124,156,218,150,254,223,250,177,124,156,219,150,254,223,250,178,125,157,220,151,254,224,251,179,125,157,220,151,254,224,251,180,126,157,221,152,254,225,251,181,126,157,221,152,254,225,251,183,127,158,222,153,254,226,251,184,127,158,223,154,254,226,251,185,128,159,224,155,255,227,251,186,128,159,224,155,255,227,251,187,129,160,225,156,255,228,251,188,130,160,225,156,255,228,251,189,131,160,226,157,255,228,251,190,131,160,226,158,255,228,251,191,132,161,227,159,255,229,251,192,132,161,227,159,255,229,251,193,133,162,228,160,255,230,252,194,133,162,229,160,255,230,252,195,134,163,230,161,255,231,252,196,134,163,230,161,255,231,252,197,135,163,231,162,255,231,252,198,135,163,231,162,255,231,252,199,136,164,232,163,255,232,252,200,136,164,232,164,255,232,252,201,137,165,233,165,255,233,252,201,137,165,233,165,255,233,252,202,138,166,233,166,255,233,252,203,138,166,233,166,255,233,252,204,139,166,234,167,255,234,252,205,139,166,234,167,255,234,252,206,140,167,235,168,255,235,252,206,140,167,235,168,255,235,252,207,141,168,236,169,255,235,252,208,141,168,236,170,255,235,252,209,142,169,237,171,255,236,252,209,143,169,237,171,255,236,252,210,144,169,237,172,255,236,252,211,144,169,237,172,255,236,252,212,145,170,238,173,255,237,252,213,145,170,238,173,255,237,252,214,146,171,239,174,255,237,253,214,146,171,239,174,255,237,253,215,147,172,240,175,255,238,253,215,147,172,240,175,255,238,253,216,148,173,240,176,255,238,253,217,148,173,240,176,255,238,253,218,149,173,241,177,255,239,253,218,149,173,241,178,255,239,253,219,150,174,241,179,255,239,253,219,151,174,241,179,255,239,253,220,152,175,242,180,255,240,253,221,152,175,242,180,255,240,253,222,153,176,242,181,255,240,253,222,153,176,242,181,255,240,253,223,154,177,243,182,255,240,253,223,154,177,243,182,255,240,253,224,155,178,244,183,255,241,253,224,155,178,244,183,255,241,253,225,156,178,244,184,255,241,253,225,157,178,244,184,255,241,253,226,158,179,244,185,255,242,253,227,158,179,244,185,255,242,253,228,159,180,245,186,255,242,253,228,159,180,245,186,255,242,253,229,160,181,245,187,255,242,253,229,160,181,245,187,255,242,253,230,161,182,246,188,255,243,253,230,162,182,246,188,255,243,253,231,163,183,246,189,255,243,253,231,163,183,246,189,255,243,253,232,164,184,247,190,255,243,253,232,164,184,247,190,255,243,253,233,165,185,247,191,255,244,253,233,165,185,247,191,255,244,253,234,166,185,247,192,255,244,253,234,167,185,247,192,255,244,253,235,168,186,248,193,255,244,253,235,168,186,248,193,255,244,253,236,169,187,248,194,255,244,253,236,169,187,248,194,255,244,253,236,170,188,248,195,255,245,253,236,170,188,248,195,255,245,253,237,171,189,249,196,255,245,254,237,172,189,249,196,255,245,254,238,173,190,249,197,255,245,254,238,173,190,249,197,255,245,254,239,174,191,249,198,255,245,254,239,174,191,249,198,255,245,254,240,175,192,249,199,255,246,254,240,176,192,249,199,255,246,254,240,177,193,250,200,255,246,254,240,177,193,250,200,255,246,254,241,178,194,250,201,255,246,254,241,178,194,250,201,255,246,254,242,179,195,250,202,255,246,254,242,180,195,250,202,255,246,254,242,181,196,250,203,255,247,254,242,181,196,250,203,255,247,254,243,182,197,251,204,255,247,254,243,183,197,251,204,255,247,254,244,184,198,251,205,255,247,254,244,184,198,251,205,255,247,254,244,185,199,251,206,255,247,254,244,185,199,251,206,255,247,254,245,186,200,251,207,255,247,254,245,187,200,251,207,255,247,254,246,188,201,252,207,255,248,254,246,188,201,252,207,255,248,254,246,189,202,252,208,255,248,254,246,190,202,252,208,255,248,254,247,191,203,252,209,255,248,254,247,191,203,252,209,255,248,254,247,192,204,252,210,255,248,254,247,193,204,252,210,255,248,254,248,194,205,252,211,255,248,254,248,194,205,252,211,255,248,254,248,195,206,252,212,255,249,254,248,196,206,252,212,255,249,254,249,197,207,253,213,255,249,254,249,197,207,253,213,255,249,254,249,198,208,253,214,255,249,254,249,199,209,253,214,255,249,254,250,200,210,253,215,255,249,254,250,200,210,253,215,255,249,254,250,201,211,253,215,255,249,254,250,202,211,253,215,255,249,254,250,203,212,253,216,255,249,254,250,203,212,253,216,255,249,254,251,204,213,253,217,255,250,254,251,205,213,253,217,255,250,254,251,206,214,254,218,255,250,254,251,206,215,254,218,255,250,254,252,207,216,254,219,255,250,254,252,208,216,254,219,255,250,254,252,209,217,254,220,255,250,254,252,210,217,254,220,255,250,254,252,211,218,254,221,255,250,254,252,212,218,254,221,255,250,254,253,213,219,254,222,255,250,254,253,213,220,254,222,255,250,254,253,214,221,254,223,255,250,254,253,215,221,254,223,255,250,254,253,216,222,254,224,255,251,254,253,217,223,254,224,255,251,254,253,218,224,254,225,255,251,254,253,219,224,254,225,255,251,254,254,220,225,254,225,255,251,254,254,221,226,254,225,255,251,254,254,222,227,255,226,255,251,254,254,223,227,255,226,255,251,254,254,224,228,255,227,255,251,254,254,225,229,255,227,255,251,254,254,226,230,255,228,255,251,254,254,227,230,255,229,255,251,254,255,228,231,255,230,255,251,254,255,229,232,255,230,255,251,254,255,230,233,255,231,255,252,254,255,231,234,255,231,255,252,254,255,232,235,255,232,255,252,254,255,233,236,255,232,255,252,254,255,235,237,255,233,255,252,254,255,236,238,255,234,255,252,254,255,238,240,255,235,255,252,255,255,239,241,255,235,255,252,254,255,241,243,255,236,255,252,254,255,243,245,255,237,255,252,254,255,246,247,255,239,255,253,255,195,29,183,84,49,136,8,42,71,0,0,0,0,0,0,0,0,0,31,107,169,35,99,159,17,82,140,8,66,114,2,44,76,1,19,32,40,132,201,29,114,187,13,91,157,7,75,127,3,58,95,1,28,47,69,142,221,42,122,201,15,91,159,6,67,121,1,42,77,1,17,31,102,148,228,67,117,204,17,82,154,6,59,114,2,39,75,1,15,29,156,57,233,119,57,212,58,48,163,29,40,124,12,30,81,3,12,31,191,107,226,124,117,204,25,99,155,0,0,0,0,0,0,0,0,0,29,148,210,37,126,194,8,93,157,2,68,118,1,39,69,1,17,33,41,151,213,27,123,193,3,82,144,1,58,105,1,32,60,1,13,26,59,159,220,23,126,198,4,88,151,1,66,114,1,38,71,1,18,34,114,136,232,51,114,207,11,83,155,3,56,105,1,33,65,1,17,34,149,65,234,121,57,215,61,49,166,28,36,114,12,25,76,3,16,42,214,49,220,132,63,188,42,65,137,0,0,0,0,0,0,0,0,0,85,137,221,104,131,216,49,111,192,21,87,155,2,49,87,1,16,28,89,163,230,90,137,220,29,100,183,10,70,135,2,42,81,1,17,33,108,167,237,55,133,222,15,97,179,4,72,135,1,45,85,1,19,38,124,146,240,66,124,224,17,88,175,4,58,122,1,36,75,1,18,37,141,79,241,126,70,227,66,58,182,30,44,136,12,34,96,2,20,47,229,99,249,143,111,235,46,109,192,0,0,0,0,0,0,0,0,0,82,158,236,94,146,224,25,117,191,9,87,149,3,56,99,1,33,57,83,167,237,68,145,222,10,103,177,2,72,131,1,41,79,1,20,39,99,167,239,47,141,224,10,104,178,2,73,133,1,44,85,1,22,47,127,145,243,71,129,228,17,93,177,3,61,124,1,41,84,1,21,52,157,78,244,140,72,231,69,58,184,31,44,137,14,38,105,8,23,61,125,34,187,52,41,133,6,31,56,0,0,0,0,0,0,0,0,0,37,109,153,51,102,147,23,87,128,8,67,101,1,41,63,1,19,29,31,154,185,17,127,175,6,96,145,2,73,114,1,51,82,1,28,45,23,163,200,10,131,185,2,93,148,1,67,111,1,41,69,1,14,24,29,176,217,12,145,201,3,101,156,1,69,111,1,39,63,1,14,23,57,192,233,25,154,215,6,109,167,3,78,118,1,48,69,1,21,29,202,105,245,108,106,216,18,90,144,0,0,0,0,0,0,0,0,0,33,172,219,64,149,206,14,117,177,5,90,141,2,61,95,1,37,57,33,179,220,11,140,198,1,89,148,1,60,104,1,33,57,1,12,21,30,181,221,8,141,198,1,87,145,1,58,100,1,31,55,1,12,20,32,186,224,7,142,198,1,86,143,1,58,100,1,31,55,1,12,22,57,192,227,20,143,204,3,96,154,1,68,112,1,42,69,1,19,32,212,35,215,113,47,169,29,48,105,0,0,0,0,0,0,0,0,0,74,129,203,106,120,203,49,107,178,19,84,144,4,50,84,1,15,25,71,172,217,44,141,209,15,102,173,6,76,133,2,51,89,1,24,42,64,185,231,31,148,216,8,103,175,3,74,131,1,46,81,1,18,30,65,196,235,25,157,221,5,105,174,1,67,120,1,38,69,1,15,30,65,204,238,30,156,224,7,107,177,2,70,124,1,42,73,1,18,34,225,86,251,144,104,235,42,99,181,0,0,0,0,0,0,0,0,0,85,175,239,112,165,229,29,136,200,12,103,162,6,77,123,2,53,84,75,183,239,30,155,221,3,106,171,1,74,128,1,44,76,1,17,28,73,185,240,27,159,222,2,107,172,1,75,127,1,42,73,1,17,29,62,190,238,21,159,222,2,107,172,1,72,122,1,40,71,1,18,32,61,199,240,27,161,226,4,113,180,1,76,129,1,46,80,1,23,41,7,27,153,5,30,95,1,16,30,0,0,0,0,0,0,0,0,0,50,75,127,57,75,124,27,67,108,10,54,86,1,33,52,1,12,18,43,125,151,26,108,148,7,83,122,2,59,89,1,38,60,1,17,27,23,144,163,13,112,154,2,75,117,1,50,81,1,31,51,1,14,23,18,162,185,6,123,171,1,78,125,1,51,86,1,31,54,1,14,23,15,199,227,3,150,204,1,91,146,1,55,95,1,30,53,1,11,20,19,55,240,19,59,196,3,52,105,0,0,0,0,0,0,0,0,0,41,166,207,104,153,199,31,123,181,14,101,152,5,72,106,1,36,52,35,176,211,12,131,190,2,88,144,1,60,101,1,36,60,1,16,28,28,183,213,8,134,191,1,86,142,1,56,96,1,30,53,1,12,20,20,190,215,4,135,192,1,84,139,1,53,91,1,28,49,1,11,20,13,196,216,2,137,192,1,86,143,1,57,99,1,32,56,1,13,24,211,29,217,96,47,156,22,43,87,0,0,0,0,0,0,0,0,0,78,120,193,111,116,186,46,102,164,15,80,128,2,49,76,1,18,28,71,161,203,42,132,192,10,98,150,3,69,109,1,44,70,1,18,29,57,186,211,30,140,196,4,93,146,1,62,102,1,38,65,1,16,27,47,199,217,14,145,196,1,88,142,1,57,98,1,36,62,1,15,26,26,219,229,5,155,207,1,94,151,1,60,104,1,36,62,1,16,28,233,29,248,146,47,220,43,52,140,0,0,0,0,0,0,0,0,0,100,163,232,179,161,222,63,142,204,37,113,174,26,89,137,18,68,97,85,181,230,32,146,209,7,100,164,3,71,121,1,45,77,1,18,30,65,187,230,20,148,207,2,97,159,1,68,116,1,40,70,1,14,29,40,194,227,8,147,204,1,94,155,1,65,112,1,39,66,1,14,26,16,208,228,3,151,207,1,98,160,1,67,117,1,41,74,1,17,31,17,38,140,7,34,80,1,17,29,0,0,0,0,0,0,0,0,0,37,75,128,41,76,128,26,66,116,12,52,94,2,32,55,1,10,16,50,127,154,37,109,152,16,82,121,5,59,85,1,35,54,1,13,20,40,142,167,17,110,157,2,71,112,1,44,72,1,27,45,1,11,17,30,175,188,9,124,169,1,74,116,1,48,78,1,30,49,1,11,18,10,222,223,2,150,194,1,83,128,1,48,79,1,27,45,1,11,17,36,41,235,29,36,193,10,27,111,0,0,0,0,0,0,0,0,0,85,165,222,177,162,215,110,135,195,57,113,168,23,83,120,10,49,61,85,190,223,36,139,200,5,90,146,1,60,103,1,38,65,1,18,30,72,202,223,23,141,199,2,86,140,1,56,97,1,36,61,1,16,27,55,218,225,13,145,200,1,86,141,1,57,99,1,35,61,1,13,22,15,235,212,1,132,184,1,84,139,1,57,97,1,34,56,1,14,23,181,21,201,61,37,123,10,38,71,0,0,0,0,0,0,0,0,0,47,106,172,95,104,173,42,93,159,18,77,131,4,50,81,1,17,23,62,147,199,44,130,189,28,102,154,18,75,115,2,44,65,1,12,19,55,153,210,24,130,194,3,93,146,1,61,97,1,31,50,1,10,16,49,186,223,17,148,204,1,96,142,1,53,83,1,26,44,1,11,17,13,217,212,2,136,180,1,78,124,1,50,83,1,29,49,1,14,23,197,13,247,82,17,222,25,17,162,0,0,0,0,0,0,0,0,0,126,186,247,234,191,243,176,177,234,104,158,220,66,128,186,55,90,137,111,197,242,46,158,219,9,104,171,2,65,125,1,44,80,1,17,91,104,208,245,39,168,224,3,109,162,1,79,124,1,50,102,1,43,102,84,220,246,31,177,231,2,115,180,1,79,134,1,55,77,1,60,79,43,243,240,8,180,217,1,115,166,1,84,121,1,51,67,1,16,6,137,30,42,148,151,207,70,52,91,92,45,102,136,116,180,74,90,100,73,32,19,187,222,215,46,34,100,91,30,32,116,121,186,93,86,94,72,35,36,149,68,206,68,63,105,73,31,28,138,57,124,55,122,151,67,23,21,140,126,197,40,37,171,86,27,28,128,154,212,45,43,53,74,32,27,107,86,160,63,134,102,59,67,44,140,161,202,78,67,119,63,36,126,146,123,158,60,90,96,43,46,168,134,107,128,69,142,92,44,29,68,159,201,177,50,57,77,58,38,76,114,97,172,78,133,92,46,41,76,140,63,184,69,112,57,38,32,85,140,46,112,54,151,133,39,27,61,131,110,175,44,75,136,52,30,74,113,130,175,51,64,58,47,35,80,100,74,143,64,163,74,36,61,116,114,128,162,80,125,82,82,26,26,171,208,204,44,32,105,55,44,68,166,179,192,57,57,108,42,26,11,199,241,228,23,15,85,68,42,19,131,160,199,55,52,83,58,50,25,139,115,232,39,52,118,50,35,33,153,104,162,64,59,131,44,24,16,150,177,202,33,19,156,55,27,12,153,203,218,26,27,49,53,49,21,110,116,168,59,80,76,38,72,19,168,203,212,50,50,107,103,26,36,129,132,201,83,80,93,59,38,83,112,103,162,98,136,90,62,30,23,158,200,207,59,57,50,67,30,29,84,86,191,102,91,59,60,32,33,112,71,220,64,89,104,53,26,34,130,56,149,84,120,103,53,21,23,133,109,210,56,77,172,77,19,29,112,142,228,55,66,36,61,29,29,93,97,165,83,175,162,47,47,43,114,137,181,100,99,95,69,23,29,128,83,199,46,44,101,53,40,55,139,69,183,61,80,110,40,29,19,161,180,207,43,24,91,60,34,19,105,61,198,53,64,89,52,31,22,158,40,209,58,62,89,44,31,29,147,46,158,56,102,198,35,19,12,135,87,209,41,45,167,55,25,21,118,95,215,38,39,66,51,38,25,113,58,164,70,93,97,47,54,34,146,108,203,72,103,151,64,19,37,156,66,138,49,95,133,46,27,80,150,55,124,55,121,135,36,23,27,165,149,166,54,64,118,53,21,36,131,63,163,60,109,81,40,26,35,154,40,185,51,97,123,35,19,34,179,19,97,48,129,124,36,20,26,136,62,164,33,77,154,45,18,32,130,90,157,40,79,91,45,26,28,129,45,129,49,147,123,38,44,51,136,74,162,57,97,121,75,17,22,136,138,185,32,34,166,56,39,58,133,117,173,48,53,187,35,21,12,161,212,207,20,23,145,56,29,19,117,109,181,55,68,112,47,29,17,153,64,220,59,51,114,46,16,24,136,76,147,41,64,172,34,17,11,108,152,187,13,15,209,51,24,14,115,133,209,32,26,104,55,30,18,122,79,179,44,88,116,37,49,25,129,168,164,41,54,148,82,22,32,127,143,213,39,41,70,62,44,61,123,105,189,48,57,64,47,25,17,175,222,220,24,30,86,68,36,17,106,102,206,59,74,74,57,39,23,151,68,216,55,63,58,49,30,35,141,70,168,82,40,115,51,25,15,136,129,202,38,35,139,68,26,16,111,141,215,29,28,28,59,39,19,114,75,180,77,104,42,40,61,26,126,152,206,61,59,93,78,23,39,111,117,170,74,124,94,48,34,86,101,92,146,78,179,134,47,22,24,138,187,178,68,69,59,56,25,33,105,112,187,95,177,129,48,31,27,114,63,183,82,116,56,43,28,37,121,63,123,61,192,169,42,17,24,109,97,177,56,76,122,58,18,28,105,139,182,70,92,63,46,23,32,74,86,150,67,183,88,36,38,48,92,122,165,88,137,91,65,70,60,155,159,199,61,60,81,44,78,115,132,119,173,71,112,93,39,38,21,184,227,206,42,32,64,58,47,36,124,137,193,80,82,78,49,50,35,144,95,205,63,78,59,41,53,52,148,71,142,65,128,51,40,36,28,143,143,202,40,55,137,52,34,29,129,183,227,42,35,43,42,44,44,104,105,164,64,130,80,43,81,53,140,169,204,68,84,72,144,11,54,157,195,130,46,58,108,118,15,123,148,131,101,44,93,131,113,12,23,188,226,142,26,32,125,120,11,50,123,163,135,64,77,103,113,9,36,155,111,157,32,44,161,116,9,55,176,76,96,37,61,149,115,9,28,141,161,167,21,25,193,120,12,32,145,195,142,32,38,86,116,12,64,120,140,125,49,115,121,102,19,66,162,182,122,35,59,128,158,97,94,93,24,99,85,119,44,62,59,67,149,53,53,94,20,48,83,53,24,52,18,18,150,40,39,78,12,26,67,33,11,24,7,5,174,35,49,68,11,27,57,15,9,12,3,3,0,2,247,4,255,6,8,12,254,10,252,251,253,14,248,16,250,249,254,2,0,4,255,253,0,2,255,4,254,253,0,2,255,254,120,7,76,176,208,126,28,54,103,48,12,154,155,139,90,34,117,119,67,6,25,204,243,158,13,21,96,97,5,44,131,176,139,48,68,97,83,5,42,156,111,152,26,49,152,80,5,58,178,74,83,33,62,145,86,5,32,154,192,168,14,22,163,85,5,32,156,216,148,19,29,73,77,7,64,116,132,122,37,126,120,101,21,107,181,192,103,19,67,125,65,32,18,144,162,194,41,51,98,132,68,18,165,217,196,45,40,78,173,80,19,176,240,193,64,35,46,221,135,38,194,248,121,96,85,29,199,122,141,147,63,159,148,133,118,121,104,114,174,73,87,92,41,83,82,99,50,53,39,39,177,58,59,68,26,63,52,79,25,17,14,12,222,34,30,72,16,44,58,32,12,10,7,6,239,183,119,96,41,50,126,123,221,226,33,16,77,74,142,142,172,170,238,247,3,136,37,5,52,13,20,152,15,101,100,66,192,128,64,2,173,34,7,145,85,7,166,63,7,94,66,8,64,46,17,81,31,25,29,30,0,2,255,4,254,253,0,2,255,4,6,8,254,253,10,12,252,251,250,14,16,18,249,248,247,246,0,255,0,2,255,4,254,253,0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,32,64,96,128,224,144,192,168,192,176,192,198,198,245,216,136,140,148,160,176,192,224,234,234,240,128,128,64,96,112,64,64,96,64,160,128,128,216,128,176,160,176,176,192,198,198,208,208,136,140,148,160,176,192,224,234,234,240,128,128,64,96,112,64,64,96,64,160,128,2,4,6,8,10,12,0,255,254,253,252,251,250,249,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,108,102,95,115,121,110,99,45,62,109,117,116,101,120,95,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,108,102,95,115,121,110,99,45,62,99,111,110,100,95,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,108,102,95,115,121,110,99,45,62,108,102,100,97,116,97,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,108,102,95,115,121,110,99,45,62,99,117,114,95,115,98,95,99,111,108,0,1,1,2,2,2,4,4,4,8,8,8,16,16,1,2,1,2,4,2,4,8,4,8,16,8,16,1,1,1,1,1,2,2,2,4,4,4,8,8,1,1,1,1,2,1,2,4,2,4,8,4,8,0,1,2,3,4,5,6,7,8,9,10,11,12,13,13,13,2,13,13,5,13,13,8,13,13,11,13,13,13,1,13,13,4,13,13,7,13,13,10,13,13,13,0,13,13,3,13,13,6,13,13,9,0,0,0,1,1,1,2,2,2,3,3,3,3,0,1,2,3,3,0,13,13,13,1,0,13,13,2,13,0,13,3,2,1,0,4,3,13,1,5,13,3,2,6,5,4,3,7,6,13,4,8,13,6,5,9,8,7,6,10,9,13,7,11,13,9,8,12,11,10,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,2,1,1,1,2,1,1,1,0,0,0,0,1,1,1,1,2,2,1,1,2,2,1,1,0,0,0,0,1,1,1,1,2,1,2,1,2,1,2,1,0,0,0,0,1,1,1,1,2,2,2,2,3,2,2,2,0,0,0,0,1,1,1,1,2,2,2,2,3,3,2,2,0,0,0,0,1,1,1,1,2,2,2,2,3,2,3,2,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,15,15,15,14,14,15,14,14,14,12,12,14,12,12,12,8,8,12,8,8,8,0,0,8,0,0,87,101,98,77,32,80,114,111,106,101,99,116,32,86,80,57,32,68,101,99,111,100,101,114,32,118,49,46,54,46,49,45,49,45,103,51,48,49,99,48,54,101,57,101,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,117,102,102,101,114,32,112,111,111,108,32,109,117,116,101,120,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,95,119,111,114,107,101,114,115,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,95,119,111,114,107,101,114,95,100,97,116,97,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,95,119,111,114,107,101,114,95,100,97,116,97,32,109,117,116,101,120,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,95,119,111,114,107,101,114,95,100,97,116,97,32,99,111,110,100,0,70,114,97,109,101,32,87,111,114,107,101,114,32,116,104,114,101,97,100,32,99,114,101,97,116,105,111,110,32,102,97,105,108,101,100,0,70,97,105,108,101,100,32,116,111,32,105,110,105,116,105,97,108,105,122,101,32,105,110,116,101,114,110,97,108,32,102,114,97,109,101,32,98,117,102,102,101,114,115,0,70,114,97,109,101,32,111,117,116,112,117,116,32,99,97,99,104,101,32,105,115,32,102,117,108,108,46,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,105,122,101,32,105,110,32,105,110,100,101,120,0,70,97,105,108,101,100,32,116,111,32,114,101,97,108,108,111,99,97,116,101,32,115,99,114,97,116,99,104,32,98,117,102,102,101,114,0,78,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,102,114,97,109,101,32,112,97,114,97,108,108,101,108,32,100,101,99,111,100,101,0,73,110,118,97,108,105,100,32,117,115,97,103,101,32,111,102,32,115,101,103,101,109,101,110,116,32,102,101,97,116,117,114,101,32,111,110,32,115,109,97,108,108,32,98,108,111,99,107,115,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,109,97,114,107,101,114,0,85,110,115,117,112,112,111,114,116,101,100,32,98,105,116,115,116,114,101,97,109,32,112,114,111,102,105,108,101,0,66,117,102,102,101,114,32,37,100,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,97,32,100,101,99,111,100,101,100,32,102,114,97,109,101,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,121,110,99,32,99,111,100,101,0,70,97,105,108,101,100,32,116,111,32,100,101,99,111,100,101,32,102,114,97,109,101,32,115,105,122,101,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,105,122,101,0,82,101,102,101,114,101,110,99,101,100,32,102,114,97,109,101,32,104,97,115,32,105,110,118,97,108,105,100,32,115,105,122,101,0,82,101,102,101,114,101,110,99,101,100,32,102,114,97,109,101,32,104,97,115,32,105,110,99,111,109,112,97,116,105,98,108,101,32,99,111,108,111,114,32,102,111,114,109,97,116,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,32,98,117,102,102,101,114,0,1,0,2,3,75,101,121,102,114,97,109,101,32,47,32,105,110,116,114,97,45,111,110,108,121,32,102,114,97,109,101,32,114,101,113,117,105,114,101,100,32,116,111,32,114,101,115,101,116,32,100,101,99,111,100,101,114,32,115,116,97,116,101,0,73,110,118,97,108,105,100,32,110,117,109,98,101,114,32,111,102,32,116,105,108,101,32,99,111,108,117,109,110,115,0,73,110,118,97,108,105,100,32,104,101,97,100,101,114,32,115,105,122,101,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,104,101,97,100,101,114,32,108,101,110,103,116,104,0,85,110,105,110,105,116,105,97,108,105,122,101,100,32,101,110,116,114,111,112,121,32,99,111,110,116,101,120,116,46,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,48,0,68,101,99,111,100,101,32,102,97,105,108,101,100,46,32,70,114,97,109,101,32,100,97,116,97,32,104,101,97,100,101,114,32,105,115,32,99,111,114,114,117,112,116,101,100,46,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,116,105,108,101,95,119,111,114,107,101,114,95,100,97,116,97,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,116,105,108,101,95,119,111,114,107,101,114,115,0,84,105,108,101,32,100,101,99,111,100,101,114,32,116,104,114,101,97,100,32,99,114,101,97,116,105,111,110,32,102,97,105,108,101,100,0,68,101,99,111,100,101,32,102,97,105,108,101,100,46,32,70,114,97,109,101,32,100,97,116,97,32,105,115,32,99,111,114,114,117,112,116,101,100,46,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,108,102,95,119,111,114,107,101,114,46,100,97,116,97,49,0,76,111,111,112,32,102,105,108,116,101,114,32,116,104,114,101,97,100,32,99,114,101,97,116,105,111,110,32,102,97,105,108,101,100,0,84,114,117,110,99,97,116,101,100,32,112,97,99],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);allocate([107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,116,105,108,101,32,108,101,110,103,116,104,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,37,100,0,70,97,105,108,101,100,32,116,111,32,100,101,99,111,100,101,32,116,105,108,101,32,100,97,116,97,0,73,110,118,97,108,105,100,32,98,108,111,99,107,32,115,105,122,101,46,0,82,101,102,101,114,101,110,99,101,32,102,114,97,109,101,32,104,97,115,32,105,110,118,97,108,105,100,32,100,105,109,101,110,115,105,111,110,115,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,116,105,108,101,32,115,105,122,101,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,111,110,116,101,120,116,32,98,117,102,102,101,114,115,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,109,45,62,99,117,114,95,102,114,97,109,101,45,62,109,118,115,0,52,58,50,58,48,32,99,111,108,111,114,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,112,114,111,102,105,108,101,32,49,32,111,114,32,51,0,82,101,115,101,114,118,101,100,32,98,105,116,32,115,101,116,0,52,58,52,58,52,32,99,111,108,111,114,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,112,114,111,102,105,108,101,32,48,32,111,114,32,50,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,0,87,111,114,107,101,114,32,37,112,32,102,97,105,108,101,100,32,116,111,32,100,101,99,111,100,101,32,102,114,97,109,101,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,109,45,62,102,99,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,109,45,62,102,114,97,109,101,95,99,111,110,116,101,120,116,115,0,78,111,32,39,108,97,115,116,39,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,0,73,110,99,111,114,114,101,99,116,32,98,117,102,102,101,114,32,100,105,109,101,110,115,105,111,110,115,0,73,110,118,97,108,105,100,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,0,73,110,118,97,108,105,100,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,32,109,97,112,0,85,110,97,98,108,101,32,116,111,32,102,105,110,100,32,102,114,101,101,32,102,114,97,109,101,32,98,117,102,102,101,114,0,7,20,33,46,59,72,85,98,111,124,137,150,163,176,189,202,215,228,241,254,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,73,74,75,76,77,78,79,80,81,82,83,84,86,87,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,132,133,134,135,136,138,139,140,141,142,143,144,145,146,147,148,149,151,152,153,154,155,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,172,173,174,175,177,178,179,180,181,182,183,184,185,186,187,188,190,191,192,193,194,195,196,197,198,199,200,201,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,229,230,231,232,233,234,235,236,237,238,239,240,242,243,244,245,246,247,248,249,250,251,252,253,253,69,114,114,111,114,32,108,97,117,110,99,104,105,110,103,32,100,101,99,111,100,101,32,116,104,114,101,97,100,58,32,37,100,10,0,108,105,98,118,112,120,32,119,105,108,108,32,117,115,101,32,117,112,32,116,111,32,37,100,32,99,111,114,101,115,10,0,103,111,116,32,109,117,108,116,105,112,108,101,32,102,114,97,109,101,115,32,102,114,111,109,32,86,80,57,32,115,116,114,101,97,109,32,117,110,101,120,112,101,99,116,101,100,108,121,63,0,83,107,105,112,112,105,110,103,32,102,114,97,109,101,32,119,105,116,104,32,117,110,107,110,111,119,110,32,112,105,99,116,117,114,101,32,116,121,112,101,32,37,100,10,0,86,80,88,32,112,114,111,99,101,115,115,95,104,101,97,100,101,114,32,115,104,111,117,108,100,32,110,111,116,32,104,97,112,112,101,110,63,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,101,109,115,99,114,105,112,116,101,110,95,105,115,95,109,97,105,110,95,114,117,110,116,105,109,101,95,116,104,114,101,97,100,40,41,32,38,38,32,34,101,109,115,99,114,105,112,116,101,110,95,109,97,105,110,95,116,104,114,101,97,100,95,112,114,111,99,101,115,115,95,113,117,101,117,101,100,95,99,97,108,108,115,32,109,117,115,116,32,98,101,32,99,97,108,108,101,100,32,102,114,111,109,32,116,104,101,32,109,97,105,110,32,116,104,114,101,97,100,33,34,0,47,85,115,101,114,115,47,98,114,105,111,110,47,115,114,99,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,105,110,99,111,109,105,110,103,47,115,121,115,116,101,109,47,108,105,98,47,112,116,104,114,101,97,100,47,108,105,98,114,97,114,121,95,112,116,104,114,101,97,100,46,99,0,101,109,115,99,114,105,112,116,101,110,95,109,97,105,110,95,116,104,114,101,97,100,95,112,114,111,99,101,115,115,95,113,117,101,117,101,100,95,99,97,108,108,115,0,48,32,38,38,32,34,73,110,118,97,108,105,100,32,69,109,115,99,114,105,112,116,101,110,32,112,116,104,114,101,97,100,32,95,100,111,95,99,97,108,108,32,111,112,99,111,100,101,33,34,0,95,100,111,95,99,97,108,108,0,99,97,108,108,0,101,109,115,99,114,105,112,116,101,110,95,97,115,121,110,99,95,114,117,110,95,105,110,95,109,97,105,110,95,116,104,114,101,97,100,0,112,111,115,116,77,101,115,115,97,103,101,40,123,32,99,109,100,58,32,39,112,114,111,99,101,115,115,81,117,101,117,101,100,77,97,105,110,84,104,114,101,97,100,87,111,114,107,39,32,125,41,0,116,104,114,111,119,32,39,67,97,110,99,101,108,101,100,33,39,59,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+30720)}var tempDoublePtr;if(ENVIRONMENT_IS_PTHREAD){tempDoublePtr=Module[\"tempDoublePtr\"]}else{tempDoublePtr=Runtime.alignMemory(allocate(12,\"i8\",ALLOC_STATIC),8)}var PROCINFO={ppid:1,pid:42,sid:42,pgid:42};var __pthread_ptr=0;var __pthread_is_main_runtime_thread=0;var __pthread_is_main_browser_thread=0;function __register_pthread_ptr(pthreadPtr,isMainBrowserThread,isMainRuntimeThread){pthreadPtr=pthreadPtr|0;isMainBrowserThread=isMainBrowserThread|0;isMainRuntimeThread=isMainRuntimeThread|0;__pthread_ptr=pthreadPtr;__pthread_is_main_browser_thread=isMainBrowserThread;__pthread_is_main_runtime_thread=isMainRuntimeThread}var _emscripten_main_thread_process_queued_calls=undefined;var PThread={MAIN_THREAD_ID:1,mainThreadInfo:{schedPolicy:0,schedPrio:0},unusedWorkerPool:[],runningWorkers:[],initMainThreadBlock:(function(){if(ENVIRONMENT_IS_PTHREAD)return undefined;PThread.mainThreadBlock=allocate(244,\"i32*\",ALLOC_STATIC);__register_pthread_ptr(PThread.mainThreadBlock,!ENVIRONMENT_IS_WORKER,1);for(var i=0;i<244/4;++i)HEAPU32[PThread.mainThreadBlock/4+i]=0;HEAP32[PThread.mainThreadBlock+24>>2]=PThread.mainThreadBlock;var tlsMemory=allocate(128*4,\"i32*\",ALLOC_STATIC);for(var i=0;i<128;++i)HEAPU32[tlsMemory/4+i]=0;Atomics.store(HEAPU32,PThread.mainThreadBlock+116>>2,tlsMemory);Atomics.store(HEAPU32,PThread.mainThreadBlock+52>>2,PThread.mainThreadBlock);Atomics.store(HEAPU32,PThread.mainThreadBlock+56>>2,PROCINFO.pid)}),pthreads:{},pthreadIdCounter:2,exitHandlers:null,setThreadStatus:(function(){}),runExitHandlers:(function(){if(PThread.exitHandlers!==null){while(PThread.exitHandlers.length>0){PThread.exitHandlers.pop()()}PThread.exitHandlers=null}if(ENVIRONMENT_IS_PTHREAD&&threadInfoStruct)___pthread_tsd_run_dtors()}),threadExit:(function(exitCode){var tb=_pthread_self();if(tb){Atomics.store(HEAPU32,tb+4>>2,exitCode);Atomics.store(HEAPU32,tb+0>>2,1);Atomics.store(HEAPU32,tb+72>>2,1);Atomics.store(HEAPU32,tb+76>>2,0);PThread.runExitHandlers();_emscripten_futex_wake(tb+0,2147483647);__register_pthread_ptr(0,0,0);threadInfoStruct=0;if(ENVIRONMENT_IS_PTHREAD){var transferList=[];postMessage({cmd:\"exit\"})}}}),threadCancel:(function(){PThread.runExitHandlers();Atomics.store(HEAPU32,threadInfoStruct+4>>2,-1);Atomics.store(HEAPU32,threadInfoStruct+0>>2,1);_emscripten_futex_wake(threadInfoStruct+0,2147483647);threadInfoStruct=selfThreadId=0;__register_pthread_ptr(0,0,0);postMessage({cmd:\"cancelDone\"})}),terminateAllThreads:(function(){for(var t in PThread.pthreads){var pthread=PThread.pthreads[t];if(pthread){PThread.freeThreadData(pthread);if(pthread.worker)pthread.worker.terminate()}}PThread.pthreads={};for(var t in PThread.unusedWorkerPool){var pthread=PThread.unusedWorkerPool[t];if(pthread){PThread.freeThreadData(pthread);if(pthread.worker)pthread.worker.terminate()}}PThread.unusedWorkerPool=[];for(var t in PThread.runningWorkers){var pthread=PThread.runningWorkers[t];if(pthread){PThread.freeThreadData(pthread);if(pthread.worker)pthread.worker.terminate()}}PThread.runningWorkers=[]}),freeThreadData:(function(pthread){if(!pthread)return;if(pthread.threadInfoStruct){var tlsMemory=HEAP32[pthread.threadInfoStruct+116>>2];HEAP32[pthread.threadInfoStruct+116>>2]=0;_free(pthread.tlsMemory);_free(pthread.threadInfoStruct)}pthread.threadInfoStruct=0;if(pthread.allocatedOwnStack&&pthread.stackBase)_free(pthread.stackBase);pthread.stackBase=0;if(pthread.worker)pthread.worker.pthread=null}),receiveObjectTransfer:(function(data){}),allocateUnusedWorkers:(function(numWorkers,onFinishedLoading){if(typeof SharedArrayBuffer===\"undefined\")return;Module[\"print\"](\"Preallocating \"+numWorkers+\" workers for a pthread spawn pool.\");var numWorkersLoaded=0;for(var i=0;i<numWorkers;++i){var pthreadMainJs=\"pthread-main.js\";if(typeof Module[\"locateFile\"]===\"function\")pthreadMainJs=Module[\"locateFile\"](pthreadMainJs);else if(Module[\"pthreadMainPrefixURL\"])pthreadMainJs=Module[\"pthreadMainPrefixURL\"]+pthreadMainJs;var worker=new Worker(pthreadMainJs);worker.onmessage=(function(e){if(e.data.targetThread&&e.data.targetThread!=_pthread_self()){var thread=PThread.pthreads[e.data.targetThread];if(thread){thread.worker.postMessage(e.data,e.data.transferList)}else{console.error('Internal error! Worker sent a message \"'+e.data.cmd+'\" to target pthread '+e.data.targetThread+\", but that thread no longer exists!\")}return}if(e.data.cmd===\"processQueuedMainThreadWork\"){_emscripten_main_thread_process_queued_calls()}else if(e.data.cmd===\"spawnThread\"){__spawn_thread(e.data)}else if(e.data.cmd===\"cleanupThread\"){__cleanup_thread(e.data.thread)}else if(e.data.cmd===\"killThread\"){__kill_thread(e.data.thread)}else if(e.data.cmd===\"cancelThread\"){__cancel_thread(e.data.thread)}else if(e.data.cmd===\"loaded\"){++numWorkersLoaded;if(numWorkersLoaded===numWorkers&&onFinishedLoading){onFinishedLoading()}}else if(e.data.cmd===\"print\"){Module[\"print\"](\"Thread \"+e.data.threadId+\": \"+e.data.text)}else if(e.data.cmd===\"printErr\"){Module[\"printErr\"](\"Thread \"+e.data.threadId+\": \"+e.data.text)}else if(e.data.cmd===\"alert\"){alert(\"Thread \"+e.data.threadId+\": \"+e.data.text)}else if(e.data.cmd===\"exit\"){}else if(e.data.cmd===\"cancelDone\"){PThread.freeThreadData(worker.pthread);worker.pthread=undefined;PThread.unusedWorkerPool.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker.pthread),1)}else if(e.data.cmd===\"objectTransfer\"){PThread.receiveObjectTransfer(e.data)}else{Module[\"printErr\"](\"worker sent an unknown command \"+e.data.cmd)}});worker.onerror=(function(e){Module[\"printErr\"](\"pthread sent an error! \"+e.filename+\":\"+e.lineno+\": \"+e.message)});var tempDoublePtr=getMemory(8);worker.postMessage({cmd:\"load\",url:currentScriptUrl,buffer:HEAPU8.buffer,tempDoublePtr:tempDoublePtr,TOTAL_MEMORY:TOTAL_MEMORY,STATICTOP:STATICTOP,DYNAMIC_BASE:DYNAMIC_BASE,DYNAMICTOP_PTR:DYNAMICTOP_PTR,PthreadWorkerInit:PthreadWorkerInit,modularize:1,moduleExportName:\"OGVDecoderVideoVP9MT\"});PThread.unusedWorkerPool.push(worker)}}),getNewWorker:(function(){if(PThread.unusedWorkerPool.length==0)PThread.allocateUnusedWorkers(1);if(PThread.unusedWorkerPool.length>0)return PThread.unusedWorkerPool.pop();else return null}),busySpinWait:(function(msecs){var t=performance.now()+msecs;while(performance.now()<t){}}),setStackSpace:(function(stackBase,stackMax){STACK_BASE=STACKTOP=stackBase;STACK_MAX=stackMax;assert(STACK_BASE!=0);assert(STACK_MAX>STACK_BASE);Module.Runtime.establishStackSpace(stackBase,stackMax)}),registerPthreadPtr:(function(pthreadPtr,isMainBrowserThread,isMainRuntimeThread){__register_pthread_ptr(pthreadPtr,isMainBrowserThread,isMainRuntimeThread)}),wakeAllThreads:(function(){var tb=_pthread_self();_emscripten_futex_wake(tb+0,2147483647)}),runThreadFunc:(function(funcPtr,arg){if(typeof asm[\"dynCall_ii\"]!==\"undefined\"){result=asm.dynCall_ii(funcPtr,arg)}else{result=asm.dynCall_i(funcPtr)}})};function _emscripten_set_current_thread_status_js(newStatus){}Module[\"_emscripten_set_current_thread_status\"]=_emscripten_set_current_thread_status;function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module.cpuTime+=cpuTime;callback(ret);return}Module[\"_i64Subtract\"]=_i64Subtract;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(72,name);switch(name){case 30:return PAGE_SIZE;case 85:var maxHeapSize=2*1024*1024*1024-16777216;maxHeapSize=HEAPU8.length;return maxHeapSize/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator===\"object\")return navigator[\"hardwareConcurrency\"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}Module[\"_memset\"]=_memset;var __main_thread_futex_wait_address;if(ENVIRONMENT_IS_PTHREAD)__main_thread_futex_wait_address=PthreadWorkerInit.__main_thread_futex_wait_address;else PthreadWorkerInit.__main_thread_futex_wait_address=__main_thread_futex_wait_address=allocate(1,\"i32*\",ALLOC_STATIC);function _emscripten_futex_wake_or_requeue(addr,count,addr2,cmpValue){if(addr<=0||addr2<=0||addr>=HEAP8.length||addr2>=HEAP8.length||count<0||addr&3!=0||addr2&3!=0){return-22}var mainThreadWaitAddress=Atomics.load(HEAP32,__main_thread_futex_wait_address>>2);var mainThreadWoken=0;if(mainThreadWaitAddress==addr){var val1=Atomics.load(HEAP32,addr>>2);if(val1!=cmpValue)return-11;var newMainThreadWaitAddress=count>0?0:addr2;var loadedAddr=Atomics.compareExchange(HEAP32,__main_thread_futex_wait_address>>2,mainThreadWaitAddress,newMainThreadWaitAddress);if(loadedAddr==mainThreadWaitAddress&&count>0){--count;mainThreadWoken=1}}var ret=Atomics.wakeOrRequeue(HEAP32,addr>>2,count,addr2>>2,cmpValue);if(ret==Atomics.NOTEQUAL)return-11;if(ret>=0)return ret+mainThreadWoken;throw\"Atomics.wakeOrRequeue returned an unexpected value \"+ret}function ___pthread_setcancelstate(){return 0}function _atexit(func,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(110,func,arg);__ATEXIT__.unshift({func:func,arg:arg})}var _tzname;if(ENVIRONMENT_IS_PTHREAD)_tzname=PthreadWorkerInit._tzname;else PthreadWorkerInit._tzname=_tzname=allocate(8,\"i32*\",ALLOC_STATIC);var _daylight;if(ENVIRONMENT_IS_PTHREAD)_daylight=PthreadWorkerInit._daylight;else PthreadWorkerInit._daylight=_daylight=allocate(1,\"i32*\",ALLOC_STATIC);var _timezone;if(ENVIRONMENT_IS_PTHREAD)_timezone=PthreadWorkerInit._timezone;else PthreadWorkerInit._timezone=_timezone=allocate(1,\"i32*\",ALLOC_STATIC);function _tzset(){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_0(119);if(_tzset.called)return;_tzset.called=true;HEAP32[_timezone>>2]=-(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[_daylight>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\\(([A-Za-z ]+)\\)$/);return match?match[1]:\"GMT\"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),\"i8\",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),\"i8\",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[_tzname>>2]=winterNamePtr;HEAP32[_tzname+4>>2]=summerNamePtr}else{HEAP32[_tzname>>2]=summerNamePtr;HEAP32[_tzname+4>>2]=winterNamePtr}}function _emscripten_futex_wait(addr,val,timeout){if(addr<=0||addr>HEAP8.length||addr&3!=0)return-22;if(ENVIRONMENT_IS_WORKER){var ret=Atomics.wait(HEAP32,addr>>2,val,timeout);if(ret===\"timed-out\")return-110;if(ret===\"not-equal\")return-11;if(ret===\"ok\")return 0;throw\"Atomics.wait returned an unexpected value \"+ret}else{var loadedVal=Atomics.load(HEAP32,addr>>2);if(val!=loadedVal)return-11;var tNow=performance.now();var tEnd=tNow+timeout;Atomics.store(HEAP32,__main_thread_futex_wait_address>>2,addr);var ourWaitAddress=addr;while(addr==ourWaitAddress){tNow=performance.now();if(tNow>tEnd){return-110}_emscripten_main_thread_process_queued_calls();addr=Atomics.load(HEAP32,__main_thread_futex_wait_address>>2)}return 0}}function ___assert_fail(condition,filename,line,func){ABORT=true;throw\"Assertion failed: \"+Pointer_stringify(condition)+\", at: \"+[filename?Pointer_stringify(filename):\"unknown filename\",line,func?Pointer_stringify(func):\"unknown function\"]+\" at \"+stackTrace()}function __spawn_thread(threadParams){if(ENVIRONMENT_IS_PTHREAD)throw\"Internal Error! _spawn_thread() can only ever be called from main application thread!\";var worker=PThread.getNewWorker();if(worker.pthread!==undefined)throw\"Internal error!\";if(!threadParams.pthread_ptr)throw\"Internal error, no pthread ptr!\";PThread.runningWorkers.push(worker);var tlsMemory=_malloc(128*4);for(var i=0;i<128;++i){HEAP32[tlsMemory+i*4>>2]=0}var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,stackBase:threadParams.stackBase,stackSize:threadParams.stackSize,allocatedOwnStack:threadParams.allocatedOwnStack,thread:threadParams.pthread_ptr,threadInfoStruct:threadParams.pthread_ptr};Atomics.store(HEAPU32,pthread.threadInfoStruct+0>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+4>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+20>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+80>>2,threadParams.detached);Atomics.store(HEAPU32,pthread.threadInfoStruct+116>>2,tlsMemory);Atomics.store(HEAPU32,pthread.threadInfoStruct+60>>2,0);Atomics.store(HEAPU32,pthread.threadInfoStruct+52>>2,pthread.threadInfoStruct);Atomics.store(HEAPU32,pthread.threadInfoStruct+56>>2,PROCINFO.pid);Atomics.store(HEAPU32,pthread.threadInfoStruct+120>>2,threadParams.stackSize);Atomics.store(HEAPU32,pthread.threadInfoStruct+96>>2,threadParams.stackSize);Atomics.store(HEAPU32,pthread.threadInfoStruct+92>>2,threadParams.stackBase);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+8>>2,threadParams.stackBase);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+12>>2,threadParams.detached);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+20>>2,threadParams.schedPolicy);Atomics.store(HEAPU32,pthread.threadInfoStruct+120+24>>2,threadParams.schedPrio);var global_libc=_emscripten_get_global_libc();var global_locale=global_libc+40;Atomics.store(HEAPU32,pthread.threadInfoStruct+188>>2,global_locale);worker.pthread=pthread;worker.postMessage({cmd:\"run\",start_routine:threadParams.startRoutine,arg:threadParams.arg,threadInfoStruct:threadParams.pthread_ptr,selfThreadId:threadParams.pthread_ptr,parentThreadId:threadParams.parent_pthread_ptr,stackBase:threadParams.stackBase,stackSize:threadParams.stackSize},threadParams.transferList)}function _pthread_getschedparam(thread,policy,schedparam){if(!policy&&!schedparam)return ERRNO_CODES.EINVAL;if(!thread){Module[\"printErr\"](\"pthread_getschedparam called with a null thread pointer!\");return ERRNO_CODES.ESRCH}var self=HEAP32[thread+24>>2];if(self!=thread){Module[\"printErr\"](\"pthread_getschedparam attempted on thread \"+thread+\", which does not point to a valid thread, or does not exist anymore!\");return ERRNO_CODES.ESRCH}var schedPolicy=Atomics.load(HEAPU32,thread+120+20>>2);var schedPrio=Atomics.load(HEAPU32,thread+120+24>>2);if(policy)HEAP32[policy>>2]=schedPolicy;if(schedparam)HEAP32[schedparam>>2]=schedPrio;return 0}function _pthread_self(){return __pthread_ptr|0}function _pthread_create(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer===\"undefined\"){Module[\"printErr\"](\"Current environment does not support SharedArrayBuffer, pthreads are not available!\");return 11}if(!pthread_ptr){Module[\"printErr\"](\"pthread_create called with a null thread pointer!\");return 22}var transferList=[];if(ENVIRONMENT_IS_PTHREAD&&transferList.length==0){return _emscripten_sync_run_in_main_thread_4(137,pthread_ptr,attr,start_routine,arg)}var stackSize=0;var stackBase=0;var detached=0;var schedPolicy=0;var schedPrio=0;if(attr){stackSize=HEAP32[attr>>2];stackBase=HEAP32[attr+8>>2];detached=HEAP32[attr+12>>2]!=0;var inheritSched=HEAP32[attr+16>>2]==0;if(inheritSched){var prevSchedPolicy=HEAP32[attr+20>>2];var prevSchedPrio=HEAP32[attr+24>>2];_pthread_getschedparam(_pthread_self(),attr+20,attr+24);schedPolicy=HEAP32[attr+20>>2];schedPrio=HEAP32[attr+24>>2];HEAP32[attr+20>>2]=prevSchedPolicy;HEAP32[attr+24>>2]=prevSchedPrio}else{schedPolicy=HEAP32[attr+20>>2];schedPrio=HEAP32[attr+24>>2]}}stackSize+=81920;var allocatedOwnStack=stackBase==0;if(allocatedOwnStack){stackBase=_malloc(stackSize)}else{stackBase-=stackSize;assert(stackBase>0)}var threadInfoStruct=_malloc(244);for(var i=0;i<244>>2;++i)HEAPU32[(threadInfoStruct>>2)+i]=0;HEAP32[pthread_ptr>>2]=threadInfoStruct;HEAP32[threadInfoStruct+24>>2]=threadInfoStruct;var headPtr=threadInfoStruct+168;HEAP32[headPtr>>2]=headPtr;var threadParams={stackBase:stackBase,stackSize:stackSize,allocatedOwnStack:allocatedOwnStack,schedPolicy:schedPolicy,schedPrio:schedPrio,detached:detached,startRoutine:start_routine,pthread_ptr:threadInfoStruct,parent_pthread_ptr:_pthread_self(),arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd=\"spawnThread\";postMessage(threadParams,transferList)}else{__spawn_thread(threadParams)}return 0}function _chroot(path){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(37,path);___setErrNo(ERRNO_CODES.EACCES);return-1}Module[\"_i64Add\"]=_i64Add;var _environ;if(ENVIRONMENT_IS_PTHREAD)_environ=PthreadWorkerInit._environ;else PthreadWorkerInit._environ=_environ=allocate(1,\"i32*\",ALLOC_STATIC);function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV[\"USER\"]=ENV[\"LOGNAME\"]=\"web_user\";ENV[\"PATH\"]=\"/\";ENV[\"PWD\"]=\"/\";ENV[\"HOME\"]=\"/home/web_user\";ENV[\"LANG\"]=\"C\";ENV[\"_\"]=Module[\"thisProgram\"];poolPtr=allocate(TOTAL_ENV_SIZE,\"i8\",ALLOC_STATIC);envPtr=allocate(MAX_ENV_VALUES*4,\"i8*\",ALLOC_STATIC);HEAP32[envPtr>>2]=poolPtr;HEAP32[_environ>>2]=envPtr}else{envPtr=HEAP32[_environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]===\"string\"){var line=key+\"=\"+env[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error(\"Environment size exceeded TOTAL_ENV_SIZE!\")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var ENV={};function _putenv(string){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(115,string);if(string===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}string=Pointer_stringify(string);var splitPoint=string.indexOf(\"=\");if(string===\"\"||string.indexOf(\"=\")===-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}var name=string.slice(0,splitPoint);var value=string.slice(splitPoint+1);if(!(name in ENV)||ENV[name]!==value){ENV[name]=value;___buildEnvironment(ENV)}return 0}function _emscripten_force_num_logical_cores(cores){HEAP32[__num_logical_cores>>2]=cores}var __num_logical_cores;if(ENVIRONMENT_IS_PTHREAD)__num_logical_cores=PthreadWorkerInit.__num_logical_cores;else{PthreadWorkerInit.__num_logical_cores=__num_logical_cores=allocate(1,\"i32*\",ALLOC_STATIC);HEAPU32[__num_logical_cores>>2]=navigator[\"hardwareConcurrency\"]||4}function _emscripten_num_logical_cores(){return HEAP32[__num_logical_cores>>2]}function _realloc(){throw\"bad\"}Module[\"_realloc\"]=_realloc;Module[\"_saveSetjmp\"]=_saveSetjmp;Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _setenv(envname,envval,overwrite){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_3(113,envname,envval,overwrite);if(envname===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}var name=Pointer_stringify(envname);var val=Pointer_stringify(envval);if(name===\"\"||name.indexOf(\"=\")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)&&!overwrite)return 0;ENV[name]=val;___buildEnvironment(ENV);return 0}function _emscripten_get_now(){abort()}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last===\".\"){parts.splice(i,1)}else if(last===\"..\"){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift(\"..\")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)===\"/\",trailingSlash=path.substr(-1)===\"/\";path=PATH.normalizeArray(path.split(\"/\").filter((function(p){return!!p})),!isAbsolute).join(\"/\");if(!path&&!isAbsolute){path=\".\"}if(path&&trailingSlash){path+=\"/\"}return(isAbsolute?\"/\":\"\")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return\".\"}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path===\"/\")return\"/\";var lastSlash=path.lastIndexOf(\"/\");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join(\"/\"))}),join2:(function(l,r){return PATH.normalize(l+\"/\"+r)}),resolve:(function(){var resolvedPath=\"\",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!==\"string\"){throw new TypeError(\"Arguments to path.resolve must be strings\")}else if(!path){return\"\"}resolvedPath=path+\"/\"+resolvedPath;resolvedAbsolute=path.charAt(0)===\"/\"}resolvedPath=PATH.normalizeArray(resolvedPath.split(\"/\").filter((function(p){return!!p})),!resolvedAbsolute).join(\"/\");return(resolvedAbsolute?\"/\":\"\")+resolvedPath||\".\"}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!==\"\")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!==\"\")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split(\"/\"));var toParts=trim(to.split(\"/\"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push(\"..\")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join(\"/\")})};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=new Buffer(BUFSIZE);var bytesRead=0;var isPosixPlatform=process.platform!=\"win32\";var fd=process.stdin.fd;if(isPosixPlatform){var usingDevice=false;try{fd=fs.openSync(\"/dev/stdin\",\"r\");usingDevice=true}catch(e){}}try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null)}catch(e){if(e.toString().indexOf(\"EOF\")!=-1)bytesRead=0;else throw e}if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString(\"utf-8\")}else{result=null}}else if(typeof window!=\"undefined\"&&typeof window.prompt==\"function\"){result=window.prompt(\"Input: \");if(result!==null){result+=\"\\n\"}}else if(typeof readline==\"function\"){result=readline();if(result!==null){result+=\"\\n\"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module[\"print\"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module[\"print\"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module[\"printErr\"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module[\"printErr\"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,\"/\",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents}),getFileDataAsTypedArray:(function(node){if(!node.contents)return new Uint8Array;if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete parent.contents[name]}),rmdir:(function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]}),readdir:(function(node){var entries=[\".\",\"..\"];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size}),write:(function(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0})}};var IDBFS={dbs:{},indexedDB:(function(){if(typeof indexedDB!==\"undefined\")return indexedDB;var ret=null;if(typeof window===\"object\")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,\"IDBFS used, but indexedDB not supported\");return ret}),DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:(function(mount){return MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback(\"Unable to connect to IndexedDB\")}req.onupgradeneeded=(function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains(\"timestamp\")){fileStore.createIndex(\"timestamp\",\"timestamp\",{unique:false})}});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),getLocalSet:(function(mount,callback){var entries={};function isRealDir(p){return p!==\".\"&&p!==\"..\"}function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:\"local\",entries:entries})}),getRemoteSet:(function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return callback(err);var transaction=db.transaction([IDBFS.DB_STORE_NAME],\"readonly\");transaction.onerror=(function(e){callback(this.error);e.preventDefault()});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index(\"timestamp\");index.openKeyCursor().onsuccess=(function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:\"remote\",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}))}),loadLocalEntry:(function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error(\"node type not supported\"))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{encoding:\"binary\",canOwn:true})}else{return callback(new Error(\"node type not supported\"))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),storeRemoteEntry:(function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),removeRemoteEntry:(function(store,path,callback){var req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),reconcile:(function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach((function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type===\"remote\"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],\"readwrite\");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type===\"local\"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type===\"local\"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,\"/\",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,\"\",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i<res;i++){buffer[offset+i]=nbuffer[i]}}return res}),write:(function(stream,buffer,offset,length,position){var nbuffer=new Buffer(buffer.subarray(offset,offset+length));var res;try{res=fs.writeSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}return res}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,\"/\",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split(\"/\");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join(\"/\");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split(\"/\");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts[\"files\"]||[],(function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)}));(mount.opts[\"blobs\"]||[]).forEach((function(obj){WORKERFS.createNode(ensureParent(obj[\"name\"]),base(obj[\"name\"]),WORKERFS.FILE_MODE,0,obj[\"data\"])}));(mount.opts[\"packages\"]||[]).forEach((function(pack){pack[\"metadata\"].files.forEach((function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack[\"blob\"].slice(file.start,file.end))}))}));return root}),createNode:(function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node}),node_ops:{getattr:(function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}}),lookup:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}),mknod:(function(parent,name,mode,dev){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rename:(function(oldNode,newDir,newName){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),unlink:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rmdir:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readdir:(function(node){var entries=[\".\",\"..\"];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newName,oldPath){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readlink:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)})},stream_ops:{read:(function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var _stdin;if(ENVIRONMENT_IS_PTHREAD)_stdin=PthreadWorkerInit._stdin;else PthreadWorkerInit._stdin=_stdin=allocate(1,\"i32*\",ALLOC_STATIC);var _stdout;if(ENVIRONMENT_IS_PTHREAD)_stdout=PthreadWorkerInit._stdout;else PthreadWorkerInit._stdout=_stdout=allocate(1,\"i32*\",ALLOC_STATIC);var _stderr;if(ENVIRONMENT_IS_PTHREAD)_stderr=PthreadWorkerInit._stderr;else PthreadWorkerInit._stderr=_stderr=allocate(1,\"i32*\",ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+\" : \"+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:\"\",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split(\"/\").filter((function(p){return!!p})),false);var current=FS.root;var current_path=\"/\";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!==\"/\"?mount+\"/\"+path:mount+path}path=path?node.name+\"/\"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags===\"undefined\"){throw new Error(\"Unknown file open mode: \"+str)}return flags}),flagsToPermissionString:(function(flag){var perms=[\"r\",\"w\",\"rw\"][flag&3];if(flag&512){perms+=\"w\"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf(\"r\")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf(\"w\")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf(\"x\")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,\"x\");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,\"wx\")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,\"wx\");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!==\"r\"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate===\"function\"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log(\"warning: \"+FS.syncFSRequests+\" FS.syncfs operations in flight at once, probably just doing extra work\")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint===\"/\";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name===\".\"||name===\"..\"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split(\"/\");var d=\"\";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+=\"/\"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=ERRNO_CODES.EEXIST)throw e}}}),mkdev:(function(path,mode,dev){if(typeof dev===\"undefined\"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,\"w\");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate[\"willMovePath\"]){FS.trackingDelegate[\"willMovePath\"](old_path,new_path)}}catch(e){console.log(\"FS.trackingDelegate['willMovePath']('\"+old_path+\"', '\"+new_path+\"') threw an exception: \"+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate[\"onMovePath\"])FS.trackingDelegate[\"onMovePath\"](old_path,new_path)}catch(e){console.log(\"FS.trackingDelegate['onMovePath']('\"+old_path+\"', '\"+new_path+\"') threw an exception: \"+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\"willDeletePath\"]){FS.trackingDelegate[\"willDeletePath\"](path)}}catch(e){console.log(\"FS.trackingDelegate['willDeletePath']('\"+path+\"') threw an exception: \"+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\"onDeletePath\"])FS.trackingDelegate[\"onDeletePath\"](path)}catch(e){console.log(\"FS.trackingDelegate['onDeletePath']('\"+path+\"') threw an exception: \"+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\"willDeletePath\"]){FS.trackingDelegate[\"willDeletePath\"](path)}}catch(e){console.log(\"FS.trackingDelegate['willDeletePath']('\"+path+\"') threw an exception: \"+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\"onDeletePath\"])FS.trackingDelegate[\"onDeletePath\"](path)}catch(e){console.log(\"FS.trackingDelegate['onDeletePath']('\"+path+\"') threw an exception: \"+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,\"w\");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===\"\"){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags===\"string\"?FS.modeStringToFlags(flags):flags;mode=typeof mode===\"undefined\"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path===\"object\"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module[\"logReadFiles\"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module[\"printErr\"](\"read file: \"+path)}}try{if(FS.trackingDelegate[\"onOpenFile\"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate[\"onOpenFile\"](path,trackingFlags)}}catch(e){console.log(\"FS.trackingDelegate['onOpenFile']('\"+path+\"', flags) threw an exception: \"+e.message)}return stream}),close:(function(stream){if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position===\"undefined\"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position===\"undefined\"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate[\"onWriteToFile\"])FS.trackingDelegate[\"onWriteToFile\"](stream.path)}catch(e){console.log(\"FS.trackingDelegate['onWriteToFile']('\"+path+\"') threw an exception: \"+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||\"r\";opts.encoding=opts.encoding||\"binary\";if(opts.encoding!==\"utf8\"&&opts.encoding!==\"binary\"){throw new Error('Invalid encoding type \"'+opts.encoding+'\"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding===\"utf8\"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding===\"binary\"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||\"w\";opts.encoding=opts.encoding||\"utf8\";if(opts.encoding!==\"utf8\"&&opts.encoding!==\"binary\"){throw new Error('Invalid encoding type \"'+opts.encoding+'\"')}var stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding===\"utf8\"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else if(opts.encoding===\"binary\"){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,\"x\");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir(\"/tmp\");FS.mkdir(\"/home\");FS.mkdir(\"/home/web_user\")}),createDefaultDevices:(function(){FS.mkdir(\"/dev\");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev(\"/dev/null\",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev(\"/dev/tty\",FS.makedev(5,0));FS.mkdev(\"/dev/tty1\",FS.makedev(6,0));var random_device;if(typeof crypto!==\"undefined\"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require(\"crypto\").randomBytes(1)[0]})}else{random_device=(function(){return Math.random()*256|0})}FS.createDevice(\"/dev\",\"random\",random_device);FS.createDevice(\"/dev\",\"urandom\",random_device);FS.mkdir(\"/dev/shm\");FS.mkdir(\"/dev/shm/tmp\")}),createSpecialDirectories:(function(){FS.mkdir(\"/proc\");FS.mkdir(\"/proc/self\");FS.mkdir(\"/proc/self/fd\");FS.mount({mount:(function(){var node=FS.createNode(\"/proc/self\",\"fd\",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:\"fake\"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},\"/proc/self/fd\")}),createStandardStreams:(function(){if(Module[\"stdin\"]){FS.createDevice(\"/dev\",\"stdin\",Module[\"stdin\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdin\")}if(Module[\"stdout\"]){FS.createDevice(\"/dev\",\"stdout\",null,Module[\"stdout\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdout\")}if(Module[\"stderr\"]){FS.createDevice(\"/dev\",\"stderr\",null,Module[\"stderr\"])}else{FS.symlink(\"/dev/tty1\",\"/dev/stderr\")}var stdin=FS.open(\"/dev/stdin\",\"r\");assert(stdin.fd===0,\"invalid handle for stdin (\"+stdin.fd+\")\");var stdout=FS.open(\"/dev/stdout\",\"w\");assert(stdout.fd===1,\"invalid handle for stdout (\"+stdout.fd+\")\");var stderr=FS.open(\"/dev/stderr\",\"w\");assert(stderr.fd===2,\"invalid handle for stderr (\"+stderr.fd+\")\")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=\"<generic error, no stack>\"}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},\"/\");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={\"MEMFS\":MEMFS,\"IDBFS\":IDBFS,\"NODEFS\":NODEFS,\"WORKERFS\":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,\"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)\");FS.init.initialized=true;FS.ensureErrnoError();Module[\"stdin\"]=input||Module[\"stdin\"];Module[\"stdout\"]=output||Module[\"stdout\"];Module[\"stderr\"]=error||Module[\"stderr\"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module[\"_fflush\"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}),joinPath:(function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]==\"/\")path=path.substr(1);return path}),absolutePath:(function(relative,base){return PATH.resolve(base,relative)}),standardizePath:(function(path){return PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}}),analyzePath:(function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path===\"/\"}catch(e){ret.error=e.errno}return ret}),createFolder:(function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof parent===\"string\"?parent:FS.getPath(parent);var parts=path.split(\"/\").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current}),createFile:(function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data===\"string\"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,\"w\");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node}),createDevice:(function(parent,name,input,output){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})});return FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);return FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!==\"undefined\"){throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\")}else if(Module[\"read\"]){try{obj.contents=intArrayFromString(Module[\"read\"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error(\"Cannot load without read() or XMLHttpRequest.\")}if(!success)___setErrNo(ERRNO_CODES.EIO);return success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open(\"HEAD\",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);var datalength=Number(xhr.getResponseHeader(\"Content-length\"));var header;var hasByteServing=(header=xhr.getResponseHeader(\"Accept-Ranges\"))&&header===\"bytes\";var usesGzip=(header=xhr.getResponseHeader(\"Content-Encoding\"))&&header===\"gzip\";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error(\"invalid range (\"+from+\", \"+to+\") or no bytes requested!\");if(to>datalength-1)throw new Error(\"only \"+datalength+\" bytes available! programmer error!\");var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);if(datalength!==chunkSize)xhr.setRequestHeader(\"Range\",\"bytes=\"+from+\"-\"+to);if(typeof Uint8Array!=\"undefined\")xhr.responseType=\"arraybuffer\";if(xhr.overrideMimeType){xhr.overrideMimeType(\"text/plain; charset=x-user-defined\")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||\"\",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]===\"undefined\"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]===\"undefined\")throw new Error(\"doXHR failed!\");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log(\"LazyFiles on gzip forces download of the whole file when length is accessed\")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!==\"undefined\"){if(!ENVIRONMENT_IS_WORKER)throw\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(\"cp \"+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module[\"preloadPlugins\"].forEach((function(plugin){if(handled)return;if(plugin[\"canHandle\"](fullname)){plugin[\"handle\"](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(dep)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url==\"string\"){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return\"EM_FS_\"+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log(\"creating db\");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],\"readwrite\");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],\"readonly\")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:(function(dirfd,path){if(path[0]!==\"/\"){var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return path}),doStat:(function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]===\"/\")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms=\"\";if(amode&4)perms+=\"r\";if(amode&2)perms+=\"w\";if(amode&1)perms+=\"x\";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}),doWritev:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,6,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,54,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort(\"bad ioctl syscall \"+op)}}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;function __exit(status){Module[\"exit\"](status)}function _exit(status){__exit(status)}function _pthread_exit(status){if(!ENVIRONMENT_IS_PTHREAD)_exit(status);else PThread.threadExit(status)}Module[\"_testSetjmp\"]=_testSetjmp;function _longjmp(env,value){Module[\"setThrew\"](env,value||1);throw\"longjmp\"}function _unsetenv(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(114,name);if(name===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}name=Pointer_stringify(name);if(name===\"\"||name.indexOf(\"=\")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)){delete ENV[name];___buildEnvironment(ENV)}return 0}function _pthread_cleanup_push(routine,arg){if(PThread.exitHandlers===null){PThread.exitHandlers=[];if(!ENVIRONMENT_IS_PTHREAD){__ATEXIT__.push((function(){PThread.runExitHandlers()}))}}PThread.exitHandlers.push((function(){Module[\"dynCall_vi\"](routine,arg)}))}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!==\"undefined\"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self[\"performance\"]&&self[\"performance\"][\"now\"]}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(){return _clock_gettime.apply(null,arguments)}function _getenv(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(111,name);if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocate(intArrayFromString(ENV[name]),\"i8\",ALLOC_NORMAL);return _getenv.ret}function _emscripten_conditional_set_current_thread_status_js(expectedStatus,newStatus){}Module[\"_emscripten_conditional_set_current_thread_status\"]=_emscripten_conditional_set_current_thread_status;function _pthread_cleanup_pop(execute){var routine=PThread.exitHandlers.pop();if(execute)routine()}function __cleanup_thread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw\"Internal Error! _cleanup_thread() can only ever be called from main application thread!\";if(!pthread_ptr)throw\"Internal Error! Null pthread_ptr in _cleanup_thread!\";HEAP32[pthread_ptr+24>>2]=0;var pthread=PThread.pthreads[pthread_ptr];var worker=pthread.worker;PThread.freeThreadData(pthread);worker.pthread=undefined;PThread.unusedWorkerPool.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker.pthread),1)}function __pthread_testcancel_js(){if(!ENVIRONMENT_IS_PTHREAD)return;if(!threadInfoStruct)return;var cancelDisabled=Atomics.load(HEAPU32,threadInfoStruct+72>>2);if(cancelDisabled)return;var canceled=Atomics.load(HEAPU32,threadInfoStruct+0>>2);if(canceled==2)throw\"Canceled!\"}function _pthread_join(thread,status){if(!thread){Module[\"printErr\"](\"pthread_join attempted on a null thread pointer!\");return ERRNO_CODES.ESRCH}if(ENVIRONMENT_IS_PTHREAD&&selfThreadId==thread){Module[\"printErr\"](\"PThread \"+thread+\" is attempting to join to itself!\");return ERRNO_CODES.EDEADLK}else if(!ENVIRONMENT_IS_PTHREAD&&PThread.mainThreadBlock==thread){Module[\"printErr\"](\"Main thread \"+thread+\" is attempting to join to itself!\");return ERRNO_CODES.EDEADLK}var self=HEAP32[thread+24>>2];if(self!=thread){Module[\"printErr\"](\"pthread_join attempted on thread \"+thread+\", which does not point to a valid thread, or does not exist anymore!\");return ERRNO_CODES.ESRCH}var detached=Atomics.load(HEAPU32,thread+80>>2);if(detached){Module[\"printErr\"](\"Attempted to join thread \"+thread+\", which was already detached!\");return ERRNO_CODES.EINVAL}for(;;){var threadStatus=Atomics.load(HEAPU32,thread+0>>2);if(threadStatus==1){var threadExitCode=Atomics.load(HEAPU32,thread+4>>2);if(status)HEAP32[status>>2]=threadExitCode;Atomics.store(HEAPU32,thread+80>>2,1);if(!ENVIRONMENT_IS_PTHREAD)__cleanup_thread(thread);else postMessage({cmd:\"cleanupThread\",thread:thread});return 0}__pthread_testcancel_js();if(!ENVIRONMENT_IS_PTHREAD)_emscripten_main_thread_process_queued_calls();_emscripten_futex_wait(thread+0,threadStatus,ENVIRONMENT_IS_PTHREAD?100:1)}}function _confstr(name,buf,len){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_3(68,name,buf,len);var value;switch(name){case 0:value=ENV[\"PATH\"]||\"/\";break;case 1:value=\"POSIX_V6_ILP32_OFF32\\nPOSIX_V6_ILP32_OFFBIG\";break;case 2:value=\"glibc 2.14\";break;case 3:value=\"\";break;case 1118:case 1122:case 1124:case 1125:case 1126:case 1128:case 1129:case 1130:value=\"\";break;case 1116:case 1117:case 1121:value=\"-m32\";break;case 1120:value=\"-m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64\";break;default:___setErrNo(ERRNO_CODES.EINVAL);return 0}if(len==0||buf==0){return value.length+1}else{var length=Math.min(len,value.length);for(var i=0;i<length;i++){HEAP8[buf+i>>0]=value.charCodeAt(i)}if(len>length)HEAP8[buf+i++>>0]=0;return i}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;function _utime(path,times){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(12,path,times);var time;if(times){var offset=4;time=HEAP32[times+offset>>2];time*=1e3}else{time=Date.now()}path=Pointer_stringify(path);try{FS.utime(path,time,time);return 0}catch(e){FS.handleFSError(e);return-1}}var cttz_i8;if(ENVIRONMENT_IS_PTHREAD)cttz_i8=PthreadWorkerInit.cttz_i8;else PthreadWorkerInit.cttz_i8=cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);Module[\"_llvm_cttz_i32\"]=_llvm_cttz_i32;Module[\"___udivmoddi4\"]=___udivmoddi4;Module[\"___udivdi3\"]=___udivdi3;Module[\"___muldsi3\"]=___muldsi3;Module[\"___muldi3\"]=___muldi3;function _emscripten_futex_wake(addr,count){if(addr<=0||addr>HEAP8.length||addr&3!=0||count<0)return-22;if(count==0)return 0;var mainThreadWaitAddress=Atomics.load(HEAP32,__main_thread_futex_wait_address>>2);var mainThreadWoken=0;if(mainThreadWaitAddress==addr){var loadedAddr=Atomics.compareExchange(HEAP32,__main_thread_futex_wait_address>>2,mainThreadWaitAddress,0);if(loadedAddr==mainThreadWaitAddress){--count;mainThreadWoken=1;if(count<=0)return 1}}var ret=Atomics.wake(HEAP32,addr>>2,count);if(ret>=0)return ret+mainThreadWoken;throw\"Atomics.wake returned an unexpected value \"+ret}function _emscripten_syscall(which,varargs){switch(which){case 6:return ___syscall6(which,varargs);case 54:return ___syscall54(which,varargs);case 146:return ___syscall146(which,varargs);case 140:return ___syscall140(which,varargs);default:throw\"surprising proxied syscall: \"+which}}function ___syscall146(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,146,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module[\"_memmove\"]=_memmove;function _emscripten_is_main_runtime_thread(){return __pthread_is_main_runtime_thread|0}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}Module[\"___uremdi3\"]=___uremdi3;function _fpathconf(fildes,name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(46,fildes,name);switch(name){case 0:return 32e3;case 1:case 2:case 3:return 255;case 4:case 5:case 16:case 17:case 18:return 4096;case 6:case 7:case 20:return 1;case 8:return 0;case 9:case 10:case 11:case 12:case 14:case 15:case 19:return-1;case 13:return 64}___setErrNo(ERRNO_CODES.EINVAL);return-1}function _abort(){Module[\"abort\"]()}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;Module[\"_sbrk\"]=_sbrk;function ___syscall140(which,varargs){if(ENVIRONMENT_IS_PTHREAD){return _emscripten_sync_run_in_main_thread_2(138,140,varargs)}SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _utimes(path,times){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_2(13,path,times);var time;if(times){var offset=8+0;time=HEAP32[times+offset>>2]*1e3;offset=8+4;time+=HEAP32[times+offset>>2]/1e3}else{time=Date.now()}path=Pointer_stringify(path);try{FS.utime(path,time,time);return 0}catch(e){FS.handleFSError(e);return-1}}function _clearenv(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_sync_run_in_main_thread_1(112,name);ENV={};___buildEnvironment(ENV);return 0}if(!ENVIRONMENT_IS_PTHREAD){PThread.initMainThreadBlock()}else{Module.PThread=PThread}if(!ENVIRONMENT_IS_PTHREAD)___buildEnvironment(ENV);if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process[\"hrtime\"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!==\"undefined\"){_emscripten_get_now=dateNow}else if(typeof self===\"object\"&&self[\"performance\"]&&typeof self[\"performance\"][\"now\"]===\"function\"){_emscripten_get_now=(function(){return self[\"performance\"][\"now\"]()})}else if(typeof performance===\"object\"&&typeof performance[\"now\"]===\"function\"){_emscripten_get_now=(function(){return performance[\"now\"]()})}else{_emscripten_get_now=Date.now}FS.staticInit();__ATINIT__.unshift((function(){if(!Module[\"noFSInit\"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module[\"FS_createFolder\"]=FS.createFolder;Module[\"FS_createPath\"]=FS.createPath;Module[\"FS_createDataFile\"]=FS.createDataFile;Module[\"FS_createPreloadedFile\"]=FS.createPreloadedFile;Module[\"FS_createLazyFile\"]=FS.createLazyFile;Module[\"FS_createLink\"]=FS.createLink;Module[\"FS_createDevice\"]=FS.createDevice;Module[\"FS_unlink\"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require(\"fs\");var NODEJS_PATH=require(\"path\");NODEFS.staticInit()}if(!ENVIRONMENT_IS_PTHREAD){DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true}function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{Module[\"dynCall_viiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_i(index){try{return Module[\"dynCall_i\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module[\"dynCall_viii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmGlobalArg[\"Atomics\"]=Atomics;Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_viiiiiiiiii\":invoke_viiiiiiiiii,\"invoke_i\":invoke_i,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_viii\":invoke_viii,\"invoke_v\":invoke_v,\"invoke_iiiii\":invoke_iiiii,\"invoke_viiiiii\":invoke_viiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"invoke_viiii\":invoke_viiii,\"__spawn_thread\":__spawn_thread,\"_pthread_cleanup_pop\":_pthread_cleanup_pop,\"_putenv\":_putenv,\"_emscripten_get_now_is_monotonic\":_emscripten_get_now_is_monotonic,\"_emscripten_is_main_runtime_thread\":_emscripten_is_main_runtime_thread,\"_ogvjs_callback_async_complete\":_ogvjs_callback_async_complete,\"_unsetenv\":_unsetenv,\"_emscripten_futex_wake_or_requeue\":_emscripten_futex_wake_or_requeue,\"_emscripten_syscall\":_emscripten_syscall,\"___assert_fail\":___assert_fail,\"_utimes\":_utimes,\"___buildEnvironment\":___buildEnvironment,\"_longjmp\":_longjmp,\"_sysconf\":_sysconf,\"_clock_gettime\":_clock_gettime,\"_emscripten_futex_wait\":_emscripten_futex_wait,\"_tzset\":_tzset,\"___setErrNo\":___setErrNo,\"_emscripten_set_current_thread_status_js\":_emscripten_set_current_thread_status_js,\"_pthread_getschedparam\":_pthread_getschedparam,\"_clearenv\":_clearenv,\"_emscripten_asm_const_v\":_emscripten_asm_const_v,\"_emscripten_futex_wake\":_emscripten_futex_wake,\"__exit\":__exit,\"_utime\":_utime,\"___pthread_setcancelstate\":___pthread_setcancelstate,\"___syscall6\":___syscall6,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"_exit\":_exit,\"_confstr\":_confstr,\"_pthread_self\":_pthread_self,\"_pthread_join\":_pthread_join,\"_getenv\":_getenv,\"_pthread_exit\":_pthread_exit,\"___syscall54\":___syscall54,\"_emscripten_num_logical_cores\":_emscripten_num_logical_cores,\"_pthread_create\":_pthread_create,\"__register_pthread_ptr\":__register_pthread_ptr,\"_emscripten_get_now\":_emscripten_get_now,\"_chroot\":_chroot,\"_emscripten_force_num_logical_cores\":_emscripten_force_num_logical_cores,\"__pthread_testcancel_js\":__pthread_testcancel_js,\"_abort\":_abort,\"_pthread_cleanup_push\":_pthread_cleanup_push,\"___clock_gettime\":___clock_gettime,\"__cleanup_thread\":__cleanup_thread,\"_gettimeofday\":_gettimeofday,\"_atexit\":_atexit,\"___syscall140\":___syscall140,\"_fpathconf\":_fpathconf,\"_setenv\":_setenv,\"___syscall146\":___syscall146,\"_emscripten_conditional_set_current_thread_status_js\":_emscripten_conditional_set_current_thread_status_js,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_iiii;var aa=env.invoke_viiiiiiiiii;var ba=env.invoke_i;var ca=env.invoke_vi;var da=env.invoke_vii;var ea=env.invoke_ii;var fa=env.invoke_viii;var ga=env.invoke_v;var ha=env.invoke_iiiii;var ia=env.invoke_viiiiii;var ja=env.invoke_iii;var ka=env.invoke_iiiiii;var la=env.invoke_viiii;var ma=env.__spawn_thread;var na=env._pthread_cleanup_pop;var oa=env._putenv;var pa=env._emscripten_get_now_is_monotonic;var qa=env._emscripten_is_main_runtime_thread;var ra=env._ogvjs_callback_async_complete;var sa=env._unsetenv;var ta=env._emscripten_futex_wake_or_requeue;var ua=env._emscripten_syscall;var va=env.___assert_fail;var wa=env._utimes;var xa=env.___buildEnvironment;var ya=env._longjmp;var za=env._sysconf;var Aa=env._clock_gettime;var Ba=env._emscripten_futex_wait;var Ca=env._tzset;var Da=env.___setErrNo;var Ea=env._emscripten_set_current_thread_status_js;var Fa=env._pthread_getschedparam;var Ga=env._clearenv;var Ha=env._emscripten_asm_const_v;var Ia=env._emscripten_futex_wake;var Ja=env.__exit;var Ka=env._utime;var La=env.___pthread_setcancelstate;var Ma=env.___syscall6;var Na=env._emscripten_memcpy_big;var Oa=env._ogvjs_callback_frame;var Pa=env._exit;var Qa=env._confstr;var Ra=env._pthread_self;var Sa=env._pthread_join;var Ta=env._getenv;var Ua=env._pthread_exit;var Va=env.___syscall54;var Wa=env._emscripten_num_logical_cores;var Xa=env._pthread_create;var Ya=env.__register_pthread_ptr;var Za=env._emscripten_get_now;var _a=env._chroot;var $a=env._emscripten_force_num_logical_cores;var ab=env.__pthread_testcancel_js;var bb=env._abort;var cb=env._pthread_cleanup_push;var db=env.___clock_gettime;var eb=env.__cleanup_thread;var fb=env._gettimeofday;var gb=env._atexit;var hb=env.___syscall140;var ib=env._fpathconf;var jb=env._setenv;var kb=env.___syscall146;var lb=env._emscripten_conditional_set_current_thread_status_js;var mb=global.Atomics.load;var nb=global.Atomics.store;var ob=global.Atomics.exchange;var pb=global.Atomics.compareExchange;var qb=global.Atomics.add;var rb=global.Atomics.sub;var sb=global.Atomics.and;var tb=global.Atomics.or;var ub=global.Atomics.xor;var vb=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction Jb(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function Kb(){return l|0}function Lb(a){a=a|0;l=a}function Mb(a,b){a=a|0;b=b|0;l=a;m=b}function Nb(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Ob(a){a=a|0;D=a}function Pb(){return D|0}function Qb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;if((f|0)==10)if((a|0)!=0&(b|0)!=0)if((c[b+4>>2]|0)==5){f=c[b+8>>2]|0;if((!((e&65536|0)!=0&(f&262144|0)==0)?!((e&131072|0)!=0&(f&524288|0)==0):0)?!((f&1|0)==0|(e&262144|0)!=0&(f&1048576|0)==0):0){f=a+8|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a+4>>2]=b;c[a>>2]=c[b>>2];f=a+24|0;c[f>>2]=0;c[a+16>>2]=e;c[a+20>>2]=d;d=Gb[c[b+12>>2]&31](a,0)|0;if(!d)g=0;else{b=c[f>>2]|0;if(!b)h=0;else h=c[b>>2]|0;c[a+12>>2]=h;Tb(a)|0;g=d}}else g=4}else g=3;else{i=8;j=11}else{i=3;j=11}if((j|0)==11)if(!a){k=i;return k|0}else g=i;c[a+8>>2]=g;k=g;return k|0}function Rb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;if(!a){g=8;return g|0}if((b|0)==0^(d|0)!=0){h=c[a+4>>2]|0;if((h|0)!=0?(i=c[a+24>>2]|0,(i|0)!=0):0)j=Hb[c[h+32>>2]&3](i,b,d,e,f)|0;else j=1}else j=8;c[a+8>>2]=j;g=j;return g|0}function Sb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if(!((a|0)!=0&(b|0)!=0)){d=0;return d|0}e=c[a+4>>2]|0;if(!e){d=0;return d|0}f=c[a+24>>2]|0;if(!f){d=0;return d|0}d=Gb[c[e+36>>2]&31](f,b)|0;return d|0}function Tb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if(!a){b=8;return b|0}d=a+4|0;e=c[d>>2]|0;if((e|0)!=0?(f=a+24|0,g=c[f>>2]|0,(g|0)!=0):0){Bb[c[e+16>>2]&7](g)|0;c[d>>2]=0;c[a>>2]=0;c[f>>2]=0;h=0}else h=1;c[a+8>>2]=h;b=h;return b|0}function Ub(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+16|0;h=g;c[b>>2]=d;d=b+4|0;c[d>>2]=0;if(e|0){c[d>>2]=1;c[h>>2]=f;Dh(b+8|0,79,e,h)|0;a[b+87>>0]=0}if(!(c[b+88>>2]|0)){l=g;return}else ya(b+92|0,c[b>>2]|0)}function Vb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=Kj(a|0,0,3,0)|0;e=Kj(d|0,D|0,b|0,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&e>>>0<2147418113)&((e|0)==(e|0)&(b|0)==0))){f=0;return f|0}b=Bj(e)|0;e=a+-1+(b+4)&0-a;if(!b){f=0;return f|0}c[e+-4>>2]=b;f=e;return f|0}function Wb(a){a=a|0;var b=0,d=0;b=Kj(a|0,0,11,0)|0;a=D;if(!((a>>>0<0|(a|0)==0&b>>>0<2147418113)&((b|0)==(b|0)&(a|0)==0))){d=0;return d|0}a=Bj(b)|0;b=a+4+7&-8;if(!a){d=0;return d|0}c[b+-4>>2]=a;d=b;return d|0}function Xb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if(a|0?(d=S(b,a)|0,e=(a|0)==0,f=Tj(2147418112,0,a|0,0)|0,g=D,(e?0:((d>>>0)/((e?1:a)>>>0)|0|0)!=(b|0))|(g>>>0<0|(g|0)==0&f>>>0<b>>>0)):0){h=0;return h|0}f=S(b,a)|0;a=Kj(f|0,0,11,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&a>>>0<2147418113)&((a|0)==(a|0)&(b|0)==0))){h=0;return h|0}b=Bj(a)|0;a=b+4+7&-8;g=a;if(!b){h=0;return h|0}c[g+-4>>2]=b;if(!a){h=0;return h|0}Jj(g|0,0,f|0)|0;h=g;return h|0}function Yb(a){a=a|0;if(!a)return;Cj(c[a+-4>>2]|0);return}function Zb(a){a=a|0;var b=0,d=0;if(!a){b=-1;return b|0}if((c[a+72>>2]|0)>0)Yb(c[a+68>>2]|0);d=a;a=d+120|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(a|0));b=0;return b|0}function _b(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;if(!a){l=-2;return l|0}m=(h|0)==0?1:h;n=b+7&-8;o=d+7&-8;p=g<<1;q=n+31+p&-32;r=p+o|0;p=Vj(q|0,((q|0)<0)<<31>>31|0,r|0,((r|0)<0)<<31>>31|0)|0;r=((h|0)<0)<<31>>31;s=Kj(p|0,D|0,h|0,r|0)|0;p=D;t=n>>e;u=o>>f;v=q>>e;w=g>>e;x=g>>f;y=(x<<1)+u|0;z=Vj(v|0,((v|0)<0)<<31>>31|0,y|0,((y|0)<0)<<31>>31|0)|0;y=Kj(z|0,D|0,h|0,r|0)|0;r=Mj(y|0,D|0,1)|0;h=Kj(r|0,D|0,s|0,p|0)|0;p=D;do if(!j){r=a+72|0;if(p>>>0>0|((p|0)==0?h>>>0>(c[r>>2]|0)>>>0:0)){z=a+68|0;Yb(c[z>>2]|0);c[z>>2]=0;if(!((h|0)==(h|0)&(p|0)==0)){l=-1;return l|0}A=Vb(32,h)|0;c[z>>2]=A;if(!A){l=-1;return l|0}else{c[r>>2]=h;Jj(A|0,0,h|0)|0;break}}}else{A=Kj(h|0,p|0,31,0)|0;r=D;if(!((A|0)==(A|0)&(r|0)==0)){l=-1;return l|0}if((wb[j&7](k,A,i)|0)<0){l=-1;return l|0}z=c[i>>2]|0;if(!z){l=-1;return l|0}if(0<r>>>0|(0==(r|0)?(c[i+4>>2]|0)>>>0<A>>>0:0)){l=-1;return l|0}else{c[a+68>>2]=z+31&-32;break}}while(0);if(g&31|0){l=-3;return l|0}c[a+8>>2]=b;c[a+12>>2]=d;c[a>>2]=n;c[a+4>>2]=o;c[a+16>>2]=q;c[a+28>>2]=e+b>>e;c[a+32>>2]=f+d>>f;c[a+20>>2]=t;c[a+24>>2]=u;c[a+36>>2]=v;c[a+76>>2]=g;c[a+80>>2]=h;c[a+84>>2]=e;c[a+88>>2]=f;f=c[a+68>>2]|0;e=m+-1|0;h=0-m|0;c[a+52>>2]=f+(S(q,g)|0)+g+e&h;g=f+s|0;s=S(v,x)|0;c[a+56>>2]=g+s+w+e&h;c[a+60>>2]=g+y+s+w+e&h;c[a+112>>2]=0;l=0;return l|0}function $b(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=c[b+76>>2]|0;e=(d|0)/2|0;f=c[b+52>>2]|0;g=c[b+16>>2]|0;h=c[b+8>>2]|0;i=c[b+12>>2]|0;j=d-i+(c[b+4>>2]|0)|0;k=(c[b>>2]|0)+d|0;l=k-h|0;m=k+d|0;k=f+h|0;h=0-d|0;n=f+h|0;if((i|0)>0){o=n;p=k;q=0;r=f;s=k+-1|0;while(1){Jj(o|0,a[r>>0]|0,d|0)|0;Jj(p|0,a[s>>0]|0,l|0)|0;q=q+1|0;if((q|0)==(i|0))break;else{o=o+g|0;p=p+g|0;r=r+g|0;s=s+g|0}}}s=f+(S(i+-1|0,g)|0)+h|0;r=f+(S(i,g)|0)+h|0;if((d|0)>0){i=f+(S(g,h)|0)+h|0;h=0;while(1){Qj(i|0,n|0,m|0)|0;h=h+1|0;if((h|0)==(d|0))break;else i=i+g|0}}if((j|0)>0){i=r;r=0;while(1){Qj(i|0,s|0,m|0)|0;r=r+1|0;if((r|0)==(j|0))break;else i=i+g|0}}g=c[b+56>>2]|0;i=b+36|0;j=c[i>>2]|0;r=b+28|0;m=c[r>>2]|0;s=b+32|0;h=c[s>>2]|0;n=b+24|0;f=e-h+(c[n>>2]|0)|0;p=b+20|0;o=(c[p>>2]|0)+e|0;q=o-m|0;l=o+e|0;o=g+m|0;m=0-e|0;k=g+m|0;if((h|0)>0){t=k;u=o;v=0;w=g;x=o+-1|0;while(1){Jj(t|0,a[w>>0]|0,e|0)|0;Jj(u|0,a[x>>0]|0,q|0)|0;v=v+1|0;if((v|0)==(h|0))break;else{t=t+j|0;u=u+j|0;w=w+j|0;x=x+j|0}}}x=g+(S(h+-1|0,j)|0)+m|0;w=g+(S(h,j)|0)+m|0;h=(d|0)>1;if(h){d=g+(S(j,m)|0)+m|0;g=0;while(1){Qj(d|0,k|0,l|0)|0;g=g+1|0;if((g|0)==(e|0))break;else d=d+j|0}}if((f|0)>0){d=w;w=0;while(1){Qj(d|0,x|0,l|0)|0;w=w+1|0;if((w|0)==(f|0))break;else d=d+j|0}}j=c[b+60>>2]|0;b=c[i>>2]|0;i=c[r>>2]|0;r=c[s>>2]|0;s=e-r+(c[n>>2]|0)|0;n=(c[p>>2]|0)+e|0;p=n-i|0;d=n+e|0;n=j+i|0;i=j+m|0;if((r|0)>0){f=i;w=n;l=0;x=j;g=n+-1|0;while(1){Jj(f|0,a[x>>0]|0,e|0)|0;Jj(w|0,a[g>>0]|0,p|0)|0;l=l+1|0;if((l|0)==(r|0))break;else{f=f+b|0;w=w+b|0;x=x+b|0;g=g+b|0}}}g=j+(S(r+-1|0,b)|0)+m|0;x=j+(S(r,b)|0)+m|0;if(h){h=j+(S(b,m)|0)+m|0;m=0;while(1){Qj(h|0,i|0,d|0)|0;m=m+1|0;if((m|0)==(e|0))break;else h=h+b|0}}if((s|0)>0){y=x;z=0}else return;while(1){Qj(y|0,g|0,d|0)|0;z=z+1|0;if((z|0)==(s|0))break;else y=y+b|0}return}function ac(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+4|0;if((c[d>>2]|0)>0){e=a+16|0;f=b+16|0;g=c[b+52>>2]|0;h=0;i=c[a+52>>2]|0;while(1){Qj(g|0,i|0,c[a>>2]|0)|0;h=h+1|0;if((h|0)>=(c[d>>2]|0))break;else{g=g+(c[f>>2]|0)|0;i=i+(c[e>>2]|0)|0}}}e=a+24|0;if((c[e>>2]|0)<=0){$b(b);return}i=a+20|0;f=a+36|0;g=b+36|0;d=c[b+56>>2]|0;h=0;j=c[a+56>>2]|0;while(1){Qj(d|0,j|0,c[i>>2]|0)|0;h=h+1|0;k=c[e>>2]|0;if((h|0)>=(k|0))break;else{d=d+(c[g>>2]|0)|0;j=j+(c[f>>2]|0)|0}}if((k|0)<=0){$b(b);return}k=a+20|0;f=a+36|0;j=b+36|0;g=c[b+60>>2]|0;d=0;h=c[a+60>>2]|0;while(1){Qj(g|0,h|0,c[k>>2]|0)|0;d=d+1|0;if((d|0)>=(c[e>>2]|0))break;else{g=g+(c[j>>2]|0)|0;h=h+(c[f>>2]|0)|0}}$b(b);return}function bc(){vj(34824,1)|0;return}function cc(){return}function dc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ec(0,a,b,c,d)|0;return}function ec(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;h=a[d+b>>0]|0;i=h<<24>>24;if(h<<24>>24<1)j=c[f+(0-i<<2)>>2]|0;else j=ec(i,d,e,f,g)|0;i=a[d+(b+1)>>0]|0;h=i<<24>>24;if(i<<24>>24<1)k=c[f+(0-h<<2)>>2]|0;else k=ec(h,d,e,f,g)|0;f=b>>>1;b=a[e+f>>0]|0;e=k+j|0;if(!e){l=b;m=g+f|0;a[m>>0]=l;return e|0}k=c[19488+((e>>>0<20?e:20)<<2)>>2]|0;d=Mj(j|0,0,8)|0;j=Kj(e>>>1|0,0,d|0,D|0)|0;d=Tj(j|0,D|0,e|0,0)|0;l=((S(256-k|0,b&255)|0)+128+(S(((255-d|0)>>>23|d)&255|(d|0)==0,k)|0)|0)>>>8&255;m=g+f|0;a[m>>0]=l;return e|0}function fc(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;if(!((b|0)!=0|(e|0)==0)){h=1;return h|0}c[a+12>>2]=b+e;c[a+16>>2]=b;c[a>>2]=0;b=a+8|0;c[b>>2]=-8;e=a+4|0;c[e>>2]=255;c[a+20>>2]=f;c[a+24>>2]=g;gc(a);g=((c[e>>2]<<7)+128|0)>>>8;f=c[b>>2]|0;if((f|0)<0){gc(a);i=c[b>>2]|0}else i=f;f=c[a>>2]|0;j=g<<24;if(f>>>0<j>>>0){k=0;l=g;m=f}else{k=1;l=(c[e>>2]|0)-g|0;m=f-j|0}j=d[1280+l>>0]|0;c[a>>2]=m<<j;c[b>>2]=i-j;c[e>>2]=l<<j;h=k;return h|0}function gc(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=a+16|0;e=c[b>>2]|0;f=c[a>>2]|0;g=a+8|0;h=c[g>>2]|0;i=(c[a+12>>2]|0)-e|0;j=i<<3;k=16-h|0;l=c[a+20>>2]|0;m=a+28|0;if(!l)n=e;else{Ib[l&63](c[a+24>>2]|0,e,m,i>>>0<5?i:5);n=m}m=k+8|0;if(j>>>0<=32){i=m-j|0;e=(i|0)>-1;l=e?h+1073741824|0:h;o=e?i:0;if(e&(j|0)==0|(k|0)<(o|0)){p=n;q=l;r=f}else{j=n;e=l;l=k;i=f;while(1){f=e+8|0;s=j+1|0;t=(d[j>>0]|0)<<l|i;l=l+-8|0;if((l|0)<(o|0)){p=s;q=f;r=t;break}else{j=s;e=f;i=t}}}}else{i=m&-8;e=(Yj(d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24|0)|0)>>>(32-i|0);p=n+(m>>3)|0;q=i+h|0;r=e<<(k&7)|c[a>>2]}c[b>>2]=(c[b>>2]|0)+(p-n);c[a>>2]=r;c[g>>2]=q;return}function hc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+8|0;d=c[b>>2]|0;e=a+16|0;a=c[e>>2]|0;if((d+-9|0)>>>0<23){f=d;g=a}else{h=a;return h|0}do{a=f;f=f+-8|0;g=g+-1|0}while((a+-17|0)>>>0<23);c[b>>2]=f;c[e>>2]=g;h=g;return h|0}function ic(a){a=a|0;return ((c[a+8>>2]|0)+7|0)>>>3|0}function jc(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=a+8|0;e=c[b>>2]|0;f=(c[a>>2]|0)+(e>>>3)|0;if(f>>>0<(c[a+4>>2]|0)>>>0){g=(d[f>>0]|0)>>>(e&7^7)&1;c[b>>2]=e+1;h=g;return h|0}else{zb[c[a+16>>2]&31](c[a+12>>2]|0);h=0;return h|0}return 0}function kc(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((b|0)<=0){e=0;return e|0}f=a+8|0;g=a+4|0;h=a+16|0;i=a+12|0;j=b;b=0;while(1){k=j;j=j+-1|0;l=c[f>>2]|0;m=(c[a>>2]|0)+(l>>>3)|0;if(m>>>0<(c[g>>2]|0)>>>0){n=(d[m>>0]|0)>>>(l&7^7)&1;c[f>>2]=l+1;o=n}else{zb[c[h>>2]&31](c[i>>2]|0);o=0}n=o<<j|b;if((k|0)<=1){e=n;break}else b=n}return e|0}function lc(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=a+8|0;f=a+4|0;if((b|0)>0){g=a+16|0;h=a+12|0;i=b;b=0;while(1){j=i;i=i+-1|0;k=c[e>>2]|0;l=(c[a>>2]|0)+(k>>>3)|0;if(l>>>0<(c[f>>2]|0)>>>0){m=(d[l>>0]|0)>>>(k&7^7)&1;c[e>>2]=k+1;n=m}else{zb[c[g>>2]&31](c[h>>2]|0);n=0}m=n<<i|b;if((j|0)<=1){o=m;break}else b=m}}else o=0;b=c[e>>2]|0;i=(c[a>>2]|0)+(b>>>3)|0;if(i>>>0<(c[f>>2]|0)>>>0){f=d[i>>0]|0;c[e>>2]=b+1;return (f&1<<(b&7^7)|0?0-o|0:o)|0}else{zb[c[a+16>>2]&31](c[a+12>>2]|0);return o|0}return 0}function mc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;e=d[f>>0]|0;g=d[f+1>>0]|0;h=d[f+2>>0]|0;i=a[f+3>>0]|0;f=i&255;a[b>>0]=(e+1+g|0)>>>1;j=(g+1+h|0)>>>1&255;a[b+c>>0]=j;a[b+2>>0]=j;j=(h+1+f|0)>>>1&255;k=c<<1;a[b+k>>0]=j;a[b+(c+2)>>0]=j;a[b+1>>0]=(e+2+(g<<1)+h|0)>>>2;e=(g+2+(h<<1)+f|0)>>>2&255;a[b+(c+1)>>0]=e;a[b+3>>0]=e;e=(h+2+f+(f<<1)|0)>>>2&255;a[b+(k|1)>>0]=e;a[b+(c+3)>>0]=e;e=c*3|0;a[b+(e+3)>>0]=i;a[b+(e+2)>>0]=i;a[b+(e+1)>>0]=i;a[b+e>>0]=i;a[b+(k+2)>>0]=i;a[b+(k+3)>>0]=i;return}function nc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;j=d[e+4>>0]|0;k=d[e+5>>0]|0;l=d[e+6>>0]|0;a[b>>0]=(f+1+g|0)>>>1;e=(g+1+h|0)>>>1&255;m=c<<1;a[b+m>>0]=e;a[b+1>>0]=e;e=(h+1+i|0)>>>1&255;a[b+(m|1)>>0]=e;a[b+2>>0]=e;e=(i+1+j|0)>>>1&255;a[b+(m+2)>>0]=e;a[b+3>>0]=e;a[b+(m+3)>>0]=(j+1+k|0)>>>1;a[b+c>>0]=(f+2+(g<<1)+h|0)>>>2;f=(g+2+(h<<1)+i|0)>>>2&255;g=c*3|0;a[b+g>>0]=f;a[b+(c+1)>>0]=f;f=(h+2+(i<<1)+j|0)>>>2&255;a[b+(g+1)>>0]=f;a[b+(c+2)>>0]=f;f=(i+2+(j<<1)+k|0)>>>2&255;a[b+(g+2)>>0]=f;a[b+(c+3)>>0]=f;a[b+(g+3)>>0]=(j+2+(k<<1)+l|0)>>>2;return}function oc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;f=d[e+1>>0]|0;g=d[e+2>>0]|0;h=d[e+3>>0]|0;i=d[e+4>>0]|0;j=d[e+5>>0]|0;k=d[e+6>>0]|0;l=a[e+7>>0]|0;a[b>>0]=((d[e>>0]|0)+2+(f<<1)+g|0)>>>2;e=(f+2+(g<<1)+h|0)>>>2&255;a[b+c>>0]=e;a[b+1>>0]=e;e=(g+2+(h<<1)+i|0)>>>2&255;g=c<<1;a[b+g>>0]=e;a[b+(c+1)>>0]=e;a[b+2>>0]=e;e=(h+2+(i<<1)+j|0)>>>2&255;h=c*3|0;a[b+h>>0]=e;a[b+(g|1)>>0]=e;a[b+(c+2)>>0]=e;a[b+3>>0]=e;e=(i+2+(j<<1)+k|0)>>>2&255;a[b+(h+1)>>0]=e;a[b+(g+2)>>0]=e;a[b+(c+3)>>0]=e;e=(j+2+(k<<1)+(l&255)|0)>>>2&255;a[b+(h+2)>>0]=e;a[b+(g+3)>>0]=e;a[b+(h+3)>>0]=l;return}function pc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;f=d[e+-1>>0]|0;j=d[e>>0]|0;k=d[e+1>>0]|0;l=d[e+2>>0]|0;m=d[e+3>>0]|0;e=(f+1+j|0)>>>1&255;n=c<<1;a[b+(n|1)>>0]=e;a[b>>0]=e;e=(j+1+k|0)>>>1&255;a[b+(n+2)>>0]=e;a[b+1>>0]=e;e=(k+1+l|0)>>>1&255;a[b+(n+3)>>0]=e;a[b+2>>0]=e;a[b+3>>0]=(l+1+m|0)>>>1;e=g+2|0;o=c*3|0;a[b+o>>0]=(e+(h<<1)+i|0)>>>2;a[b+n>>0]=((g<<1)+2+h+f|0)>>>2;h=(e+(f<<1)+j|0)>>>2&255;a[b+(o+1)>>0]=h;a[b+c>>0]=h;h=(f+2+(j<<1)+k|0)>>>2&255;a[b+(o+2)>>0]=h;a[b+(c+1)>>0]=h;h=(j+2+(k<<1)+l|0)>>>2&255;a[b+(o+3)>>0]=h;a[b+(c+2)>>0]=h;a[b+(c+3)>>0]=(k+2+(l<<1)+m|0)>>>2;return}function qc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;n=d[e+3>>0]|0;e=c*3|0;a[b+e>>0]=(h+2+(i<<1)+(d[f+3>>0]|0)|0)>>>2;f=g+2|0;o=(f+(h<<1)+i|0)>>>2&255;i=c<<1;a[b+i>>0]=o;a[b+(e+1)>>0]=o;o=((g<<1)+2+h+j|0)>>>2&255;a[b+c>>0]=o;a[b+(i|1)>>0]=o;a[b+(e+2)>>0]=o;o=(f+(j<<1)+k|0)>>>2&255;a[b>>0]=o;a[b+(c+1)>>0]=o;a[b+(i+2)>>0]=o;a[b+(e+3)>>0]=o;o=(j+2+(k<<1)+l|0)>>>2&255;a[b+1>>0]=o;a[b+(c+2)>>0]=o;a[b+(i+3)>>0]=o;o=(k+2+(l<<1)+m|0)>>>2&255;a[b+2>>0]=o;a[b+(c+3)>>0]=o;a[b+3>>0]=(l+2+(m<<1)+n|0)>>>2;return}function rc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[f+3>>0]|0;f=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;e=g+1|0;n=(e+f|0)>>>1&255;a[b+(c+2)>>0]=n;a[b>>0]=n;n=(e+h|0)>>>1&255;e=c<<1;a[b+(e+2)>>0]=n;a[b+c>>0]=n;n=(h+1+i|0)>>>1&255;o=c*3|0;a[b+(o+2)>>0]=n;a[b+e>>0]=n;a[b+o>>0]=(i+1+j|0)>>>1;a[b+3>>0]=(k+2+(l<<1)+m|0)>>>2;a[b+2>>0]=(f+2+(k<<1)+l|0)>>>2;l=g+2|0;m=(l+(f<<1)+k|0)>>>2&255;a[b+(c+3)>>0]=m;a[b+1>>0]=m;m=((g<<1)+2+h+f|0)>>>2&255;a[b+(e+3)>>0]=m;a[b+(c+1)>>0]=m;m=(l+(h<<1)+i|0)>>>2&255;a[b+(o+3)>>0]=m;a[b+(e|1)>>0]=m;a[b+(o+1)>>0]=(h+2+(i<<1)+j|0)>>>2;return}function sc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;tc(a,b,8,d);return}function tc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=e+-1|0;if((e|0)>1){h=0;do{i=h;h=h+1|0;a[b+(S(i,c)|0)>>0]=((d[f+i>>0]|0)+1+(d[f+h>>0]|0)|0)>>>1}while((h|0)!=(g|0))}h=f+g|0;i=S(g,c)|0;a[b+i>>0]=a[h>>0]|0;g=b+1|0;j=e+-2|0;k=(e|0)>2;if(k){l=0;do{m=l;l=l+1|0;a[g+(S(m,c)|0)>>0]=((d[f+m>>0]|0)+2+((d[f+l>>0]|0)<<1)+(d[f+(m+2)>>0]|0)|0)>>>2}while((l|0)!=(j|0))}l=d[h>>0]|0;a[g+(S(j,c)|0)>>0]=((d[f+j>>0]|0)+2+l+(l<<1)|0)>>>2;a[g+i>>0]=a[h>>0]|0;g=b+2|0;if(k){k=0;do{a[g+(k+i)>>0]=a[h>>0]|0;k=k+1|0}while((k|0)!=(j|0))}if((e|0)<2|(j|0)==0)return;else n=j;while(1){e=(S(n+1|0,c)|0)+-2|0;k=S(n,c)|0;h=0;do{a[g+(h+k)>>0]=a[g+(e+h)>>0]|0;h=h+1|0}while((h|0)<(j|0));if((n|0)>0)n=n+-1|0;else break}return}function uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;tc(a,b,16,d);return}function vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;tc(a,b,32,d);return}function wc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=0;do{g=e+f|0;h=f;f=f+1|0;i=e+f|0;a[b+h>>0]=((d[g>>0]|0)+1+(d[i>>0]|0)|0)>>>1;a[b+(h+c)>>0]=((d[g>>0]|0)+2+((d[i>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((f|0)!=8);f=e+7|0;e=b+c|0;h=b+(c<<1)|0;i=b+1|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;a[h+5>>0]=a[i+5>>0]|0;Jj(h+6|0,a[f>>0]|0,2)|0;h=b+(c*3|0)|0;i=e+1|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;a[h+5>>0]=a[i+5>>0]|0;Jj(h+6|0,a[f>>0]|0,2)|0;h=b+(c<<2)|0;i=b+2|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;Jj(h+5|0,a[f>>0]|0,3)|0;h=b+(c*5|0)|0;i=e+2|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;Jj(h+5|0,a[f>>0]|0,3)|0;h=b+(c*6|0)|0;i=b+3|0;g=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;a[h>>0]=g;a[h+1>>0]=g>>8;a[h+2>>0]=g>>16;a[h+3>>0]=g>>24;Jj(h+4|0,a[f>>0]|0,4)|0;h=b+(c*7|0)|0;c=e+3|0;e=d[c>>0]|d[c+1>>0]<<8|d[c+2>>0]<<16|d[c+3>>0]<<24;a[h>>0]=e;a[h+1>>0]=e>>8;a[h+2>>0]=e>>16;a[h+3>>0]=e>>24;Jj(h+4|0,a[f>>0]|0,4)|0;return}function xc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;f=0;do{g=e+f|0;h=f;f=f+1|0;i=e+f|0;a[b+h>>0]=((d[g>>0]|0)+1+(d[i>>0]|0)|0)>>>1;a[b+(h+c)>>0]=((d[g>>0]|0)+2+((d[i>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((f|0)!=16);f=e+15|0;e=b+c|0;h=b+(c<<1)|0;i=h;g=b+1|0;j=i+14|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+14|0,a[f>>0]|0,2)|0;h=b+(c*3|0)|0;i=h;g=e+1|0;j=i+14|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+14|0,a[f>>0]|0,2)|0;h=b+(c<<2)|0;i=h;g=b+2|0;j=i+13|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+13|0,a[f>>0]|0,3)|0;h=b+(c*5|0)|0;i=h;g=e+2|0;j=i+13|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+13|0,a[f>>0]|0,3)|0;h=b+(c*6|0)|0;i=h;g=b+3|0;j=i+12|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+12|0,a[f>>0]|0,4)|0;h=b+(c*7|0)|0;i=h;g=e+3|0;j=i+12|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+12|0,a[f>>0]|0,4)|0;h=b+(c<<3)|0;i=h;g=b+4|0;j=i+11|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+11|0,a[f>>0]|0,5)|0;h=b+(c*9|0)|0;i=h;g=e+4|0;j=i+11|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+11|0,a[f>>0]|0,5)|0;h=b+(c*10|0)|0;i=h;g=b+5|0;j=i+10|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+10|0,a[f>>0]|0,6)|0;h=b+(c*11|0)|0;i=h;g=e+5|0;j=i+10|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+10|0,a[f>>0]|0,6)|0;h=b+(c*12|0)|0;i=h;g=b+6|0;j=i+9|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+9|0,a[f>>0]|0,7)|0;h=b+(c*13|0)|0;i=h;g=e+6|0;j=i+9|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));Jj(h+9|0,a[f>>0]|0,7)|0;h=b+(c*14|0)|0;g=b+7|0;i=g;j=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=g+4|0;g=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=h;k=i;a[k>>0]=j;a[k+1>>0]=j>>8;a[k+2>>0]=j>>16;a[k+3>>0]=j>>24;j=i+4|0;a[j>>0]=g;a[j+1>>0]=g>>8;a[j+2>>0]=g>>16;a[j+3>>0]=g>>24;Jj(h+8|0,a[f>>0]|0,8)|0;h=b+(c*15|0)|0;c=e+7|0;e=c;b=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=c+4|0;c=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=h;g=e;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=e+4|0;a[b>>0]=c;a[b+1>>0]=c>>8;a[b+2>>0]=c>>16;a[b+3>>0]=c>>24;Jj(h+8|0,a[f>>0]|0,8)|0;return}function yc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;f=0;do{g=e+f|0;h=f;f=f+1|0;i=e+f|0;a[b+h>>0]=((d[g>>0]|0)+1+(d[i>>0]|0)|0)>>>1;a[b+(h+c)>>0]=((d[g>>0]|0)+2+((d[i>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((f|0)!=32);f=e+31|0;e=b+c|0;h=2;i=30;while(1){g=b+(S(h,c)|0)|0;j=h>>1;Qj(g|0,b+j|0,i|0)|0;k=32-i|0;Jj(g+i|0,a[f>>0]|0,k|0)|0;g=b+(S(h|1,c)|0)|0;Qj(g|0,e+j|0,i|0)|0;Jj(g+i|0,a[f>>0]|0,k|0)|0;h=h+2|0;if((h|0)>=32)break;else i=i+-1|0}return}function zc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=e+7|0;g=a[f>>0]|0;h=e+1|0;i=e+2|0;a[b>>0]=((d[e>>0]|0)+2+((d[h>>0]|0)<<1)+(d[i>>0]|0)|0)>>>2;j=e+3|0;k=b+1|0;a[k>>0]=((d[h>>0]|0)+2+((d[i>>0]|0)<<1)+(d[j>>0]|0)|0)>>>2;h=e+4|0;l=b+2|0;a[l>>0]=((d[i>>0]|0)+2+((d[j>>0]|0)<<1)+(d[h>>0]|0)|0)>>>2;i=e+5|0;m=b+3|0;a[m>>0]=((d[j>>0]|0)+2+((d[h>>0]|0)<<1)+(d[i>>0]|0)|0)>>>2;j=e+6|0;n=b+4|0;a[n>>0]=((d[h>>0]|0)+2+((d[i>>0]|0)<<1)+(d[j>>0]|0)|0)>>>2;h=b+5|0;a[h>>0]=((d[i>>0]|0)+2+((d[j>>0]|0)<<1)+(d[f>>0]|0)|0)>>>2;i=b+6|0;a[i>>0]=((d[j>>0]|0)+2+((d[f>>0]|0)<<1)+(d[e+8>>0]|0)|0)>>>2;a[b+7>>0]=g;e=b+c|0;a[e>>0]=a[k>>0]|0;a[e+1>>0]=a[k+1>>0]|0;a[e+2>>0]=a[k+2>>0]|0;a[e+3>>0]=a[k+3>>0]|0;a[e+4>>0]=a[k+4>>0]|0;a[e+5>>0]=a[k+5>>0]|0;Jj(e+6|0,g|0,2)|0;k=e+c|0;a[k>>0]=a[l>>0]|0;a[k+1>>0]=a[l+1>>0]|0;a[k+2>>0]=a[l+2>>0]|0;a[k+3>>0]=a[l+3>>0]|0;a[k+4>>0]=a[l+4>>0]|0;Jj(k+5|0,g|0,3)|0;l=k+c|0;k=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;a[l>>0]=k;a[l+1>>0]=k>>8;a[l+2>>0]=k>>16;a[l+3>>0]=k>>24;Jj(l+4|0,g|0,4)|0;k=l+c|0;a[k>>0]=a[n>>0]|0;a[k+1>>0]=a[n+1>>0]|0;a[k+2>>0]=a[n+2>>0]|0;Jj(k+3|0,g|0,5)|0;n=k+c|0;k=d[h>>0]|d[h+1>>0]<<8;a[n>>0]=k;a[n+1>>0]=k>>8;Jj(n+2|0,g|0,6)|0;k=n+c|0;a[k>>0]=a[i>>0]|0;Jj(k+1|0,g|0,7)|0;Jj(k+c|0,g|0,8)|0;return}function Ac(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;f=a[e+15>>0]|0;g=0;do{h=g;g=g+1|0;a[b+h>>0]=((d[e+h>>0]|0)+2+((d[e+g>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((g|0)!=15);a[b+15>>0]=f;g=b+c|0;e=g;h=b+1|0;i=e+14|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+14|0,f|0,2)|0;j=g+c|0;e=j;h=b+2|0;i=e+13|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+13|0,f|0,3)|0;g=j+c|0;e=g;h=b+3|0;i=e+12|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+12|0,f|0,4)|0;j=g+c|0;e=j;h=b+4|0;i=e+11|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+11|0,f|0,5)|0;g=j+c|0;e=g;h=b+5|0;i=e+10|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+10|0,f|0,6)|0;j=g+c|0;e=j;h=b+6|0;i=e+9|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+9|0,f|0,7)|0;h=j+c|0;j=b+7|0;e=j;i=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=j+4|0;j=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=h;g=e;a[g>>0]=i;a[g+1>>0]=i>>8;a[g+2>>0]=i>>16;a[g+3>>0]=i>>24;i=e+4|0;a[i>>0]=j;a[i+1>>0]=j>>8;a[i+2>>0]=j>>16;a[i+3>>0]=j>>24;Jj(h+8|0,f|0,8)|0;j=h+c|0;h=b+8|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;a[j+5>>0]=a[h+5>>0]|0;a[j+6>>0]=a[h+6>>0]|0;Jj(j+7|0,f|0,9)|0;h=j+c|0;j=b+9|0;a[h>>0]=a[j>>0]|0;a[h+1>>0]=a[j+1>>0]|0;a[h+2>>0]=a[j+2>>0]|0;a[h+3>>0]=a[j+3>>0]|0;a[h+4>>0]=a[j+4>>0]|0;a[h+5>>0]=a[j+5>>0]|0;Jj(h+6|0,f|0,10)|0;j=h+c|0;h=b+10|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;Jj(j+5|0,f|0,11)|0;h=j+c|0;j=b+11|0;i=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;a[h>>0]=i;a[h+1>>0]=i>>8;a[h+2>>0]=i>>16;a[h+3>>0]=i>>24;Jj(h+4|0,f|0,12)|0;i=h+c|0;h=b+12|0;a[i>>0]=a[h>>0]|0;a[i+1>>0]=a[h+1>>0]|0;a[i+2>>0]=a[h+2>>0]|0;Jj(i+3|0,f|0,13)|0;h=i+c|0;i=b+13|0;j=d[i>>0]|d[i+1>>0]<<8;a[h>>0]=j;a[h+1>>0]=j>>8;Jj(h+2|0,f|0,14)|0;j=h+c|0;a[j>>0]=a[b+14>>0]|0;Jj(j+1|0,f|0,15)|0;Jj(j+c|0,f|0,16)|0;return}function Bc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;f=a[e+31>>0]|0;g=0;do{h=g;g=g+1|0;a[b+h>>0]=((d[e+h>>0]|0)+2+((d[e+g>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((g|0)!=31);a[b+31>>0]=f;g=b+c|0;e=g;h=b+1|0;i=e+30|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+30|0,f|0,2)|0;j=g+c|0;e=j;h=b+2|0;i=e+29|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+29|0,f|0,3)|0;g=j+c|0;e=g;h=b+3|0;i=e+28|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+28|0,f|0,4)|0;j=g+c|0;e=j;h=b+4|0;i=e+27|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+27|0,f|0,5)|0;g=j+c|0;e=g;h=b+5|0;i=e+26|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+26|0,f|0,6)|0;j=g+c|0;e=j;h=b+6|0;i=e+25|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+25|0,f|0,7)|0;g=j+c|0;e=g;h=b+7|0;i=e+24|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+24|0,f|0,8)|0;j=g+c|0;e=j;h=b+8|0;i=e+23|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+23|0,f|0,9)|0;g=j+c|0;e=g;h=b+9|0;i=e+22|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+22|0,f|0,10)|0;j=g+c|0;e=j;h=b+10|0;i=e+21|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+21|0,f|0,11)|0;g=j+c|0;e=g;h=b+11|0;i=e+20|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+20|0,f|0,12)|0;j=g+c|0;e=j;h=b+12|0;i=e+19|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+19|0,f|0,13)|0;g=j+c|0;e=g;h=b+13|0;i=e+18|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+18|0,f|0,14)|0;j=g+c|0;e=j;h=b+14|0;i=e+17|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+17|0,f|0,15)|0;g=j+c|0;e=g;h=b+15|0;i=e+16|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+16|0,f|0,16)|0;j=g+c|0;e=j;h=b+16|0;i=e+15|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+15|0,f|0,17)|0;g=j+c|0;e=g;h=b+17|0;i=e+14|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+14|0,f|0,18)|0;j=g+c|0;e=j;h=b+18|0;i=e+13|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+13|0,f|0,19)|0;g=j+c|0;e=g;h=b+19|0;i=e+12|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+12|0,f|0,20)|0;j=g+c|0;e=j;h=b+20|0;i=e+11|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+11|0,f|0,21)|0;g=j+c|0;e=g;h=b+21|0;i=e+10|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(g+10|0,f|0,22)|0;j=g+c|0;e=j;h=b+22|0;i=e+9|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));Jj(j+9|0,f|0,23)|0;h=j+c|0;j=b+23|0;e=j;i=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=j+4|0;j=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=h;g=e;a[g>>0]=i;a[g+1>>0]=i>>8;a[g+2>>0]=i>>16;a[g+3>>0]=i>>24;i=e+4|0;a[i>>0]=j;a[i+1>>0]=j>>8;a[i+2>>0]=j>>16;a[i+3>>0]=j>>24;Jj(h+8|0,f|0,24)|0;j=h+c|0;h=b+24|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;a[j+5>>0]=a[h+5>>0]|0;a[j+6>>0]=a[h+6>>0]|0;Jj(j+7|0,f|0,25)|0;h=j+c|0;j=b+25|0;a[h>>0]=a[j>>0]|0;a[h+1>>0]=a[j+1>>0]|0;a[h+2>>0]=a[j+2>>0]|0;a[h+3>>0]=a[j+3>>0]|0;a[h+4>>0]=a[j+4>>0]|0;a[h+5>>0]=a[j+5>>0]|0;Jj(h+6|0,f|0,26)|0;j=h+c|0;h=b+26|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;Jj(j+5|0,f|0,27)|0;h=j+c|0;j=b+27|0;i=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;a[h>>0]=i;a[h+1>>0]=i>>8;a[h+2>>0]=i>>16;a[h+3>>0]=i>>24;Jj(h+4|0,f|0,28)|0;i=h+c|0;h=b+28|0;a[i>>0]=a[h>>0]|0;a[i+1>>0]=a[h+1>>0]|0;a[i+2>>0]=a[h+2>>0]|0;Jj(i+3|0,f|0,29)|0;h=i+c|0;i=b+29|0;j=d[i>>0]|d[i+1>>0]<<8;a[h>>0]=j;a[h+1>>0]=j>>8;Jj(h+2|0,f|0,30)|0;j=h+c|0;a[j>>0]=a[b+30>>0]|0;Jj(j+1|0,f|0,31)|0;Jj(j+c|0,f|0,32)|0;return}function Cc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Dc(a,b,8,c,d);return}function Dc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((e|0)>0){h=0;do{a[b+h>>0]=((d[f+(h+-1)>>0]|0)+1+(d[f+h>>0]|0)|0)>>>1;h=h+1|0}while((h|0)!=(e|0))}h=b+c|0;b=f+-1|0;a[h>>0]=((d[g>>0]|0)+2+((d[b>>0]|0)<<1)+(d[f>>0]|0)|0)>>>2;if((e|0)>1){i=1;do{a[h+i>>0]=((d[f+(i+-2)>>0]|0)+2+((d[f+(i+-1)>>0]|0)<<1)+(d[f+i>>0]|0)|0)>>>2;i=i+1|0}while((i|0)!=(e|0))}i=h+c|0;a[i>>0]=((d[b>>0]|0)+2+((d[g>>0]|0)<<1)+(d[g+1>>0]|0)|0)>>>2;if((e|0)>3){b=3;do{h=b+-2|0;a[i+(S(h,c)|0)>>0]=((d[g+(b+-3)>>0]|0)+2+((d[g+h>>0]|0)<<1)+(d[g+(b+-1)>>0]|0)|0)>>>2;b=b+1|0}while((b|0)!=(e|0))}if((e|0)<=2)return;b=(S(c,-2)|0)+-1|0;g=i;i=2;while(1){h=1;do{a[g+h>>0]=a[g+(b+h)>>0]|0;h=h+1|0}while((h|0)!=(e|0));i=i+1|0;if((i|0)==(e|0))break;else g=g+c|0}return}function Ec(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Dc(a,b,16,c,d);return}function Fc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Dc(a,b,32,c,d);return}function Gc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Hc(a,b,8,c,d);return}function Hc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;h=l;l=l+64|0;i=h;j=e+-2|0;k=(e|0)>2;m=e+-1|0;if(k){n=e+-3|0;o=0;do{a[i+o>>0]=((d[g+(n-o)>>0]|0)+2+((d[g+(j-o)>>0]|0)<<1)+(d[g+(m-o)>>0]|0)|0)>>>2;o=o+1|0}while((o|0)!=(j|0))}o=d[f+-1>>0]|0;n=d[g>>0]|0;a[i+j>>0]=(o+2+(n<<1)+(d[g+1>>0]|0)|0)>>>2;g=a[f>>0]|0;p=g&255;a[i+m>>0]=((o<<1)+2+n+p|0)>>>2;n=a[f+1>>0]|0;m=i+e|0;a[m>>0]=((p<<1)+o+(n&255)+2|0)>>>2;if(k){k=e+1|0;o=g;g=n;n=0;while(1){p=a[f+(n+2)>>0]|0;a[i+(k+n)>>0]=(((g&255)<<1)+(o&255)+(p&255)+2|0)>>>2;n=n+1|0;if((n|0)==(j|0))break;else{q=g;g=p;o=q}}}if((e|0)<=0){l=h;return}o=m+-1|0;m=0;do{Qj(b+(S(m,c)|0)|0,o+(0-m)|0,e|0)|0;m=m+1|0}while((m|0)!=(e|0));l=h;return}function Ic(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Hc(a,b,16,c,d);return}function Jc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Hc(a,b,32,c,d);return}function Kc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Lc(a,b,8,c,d);return}function Lc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=f+-1|0;a[b>>0]=((d[h>>0]|0)+1+(d[g>>0]|0)|0)>>>1;i=(e|0)>1;if(i){j=1;do{a[b+(S(j,c)|0)>>0]=((d[g+(j+-1)>>0]|0)+1+(d[g+j>>0]|0)|0)>>>1;j=j+1|0}while((j|0)!=(e|0))}j=b+1|0;a[j>>0]=((d[g>>0]|0)+2+((d[h>>0]|0)<<1)+(d[f>>0]|0)|0)>>>2;a[j+c>>0]=((d[h>>0]|0)+2+((d[g>>0]|0)<<1)+(d[g+1>>0]|0)|0)>>>2;h=(e|0)>2;if(h){k=2;do{a[j+(S(k,c)|0)>>0]=((d[g+(k+-2)>>0]|0)+2+((d[g+(k+-1)>>0]|0)<<1)+(d[g+k>>0]|0)|0)>>>2;k=k+1|0}while((k|0)!=(e|0));k=b+2|0;g=e+-2|0;if(h){h=0;do{j=h;h=h+1|0;a[k+j>>0]=((d[f+(j+-1)>>0]|0)+2+((d[f+j>>0]|0)<<1)+(d[f+h>>0]|0)|0)>>>2}while((h|0)!=(g|0));l=k;m=g}else{l=k;m=g}}else{l=b+2|0;m=e+-2|0}if(!i)return;i=-2-c|0;if((e|0)==2)return;else{n=l;o=1}do{n=n+c|0;l=0;do{a[n+l>>0]=a[n+(i+l)>>0]|0;l=l+1|0}while((l|0)<(m|0));o=o+1|0}while((o|0)!=(e|0));return}function Mc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Lc(a,b,16,c,d);return}function Nc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Lc(a,b,32,c,d);return}function Oc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[b>>0]=f;a[b+1>>0]=f>>8;a[b+2>>0]=f>>16;a[b+3>>0]=f>>24;f=b+c|0;b=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[f>>0]=b;a[f+1>>0]=b>>8;a[f+2>>0]=b>>16;a[f+3>>0]=b>>24;b=f+c|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[b>>0]=f;a[b+1>>0]=f>>8;a[b+2>>0]=f>>16;a[b+3>>0]=f>>24;f=b+c|0;c=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[f>>0]=c;a[f+1>>0]=c>>8;a[f+2>>0]=c>>16;a[f+3>>0]=c>>24;return}function Pc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=e;e=f;h=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=f+4|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=b+c|0;c=e;a[c>>0]=h;a[c+1>>0]=h>>8;a[c+2>>0]=h>>16;a[c+3>>0]=h>>24;h=e+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;return}function Qc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));e=b+c|0;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));return}function Rc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));e=b+c|0;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));return}function Sc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;Jj(b|0,a[e>>0]|0,4)|0;d=b+c|0;Jj(d|0,a[e+1>>0]|0,4)|0;b=d+c|0;Jj(b|0,a[e+2>>0]|0,4)|0;Jj(b+c|0,a[e+3>>0]|0,4)|0;return}function Tc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;Jj(b|0,a[e>>0]|0,8)|0;d=b+c|0;Jj(d|0,a[e+1>>0]|0,8)|0;b=d+c|0;Jj(b|0,a[e+2>>0]|0,8)|0;d=b+c|0;Jj(d|0,a[e+3>>0]|0,8)|0;b=d+c|0;Jj(b|0,a[e+4>>0]|0,8)|0;d=b+c|0;Jj(d|0,a[e+5>>0]|0,8)|0;b=d+c|0;Jj(b|0,a[e+6>>0]|0,8)|0;Jj(b+c|0,a[e+7>>0]|0,8)|0;return}function Uc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;Jj(b|0,a[e>>0]|0,16)|0;d=b+c|0;Jj(d|0,a[e+1>>0]|0,16)|0;b=d+c|0;Jj(b|0,a[e+2>>0]|0,16)|0;d=b+c|0;Jj(d|0,a[e+3>>0]|0,16)|0;b=d+c|0;Jj(b|0,a[e+4>>0]|0,16)|0;d=b+c|0;Jj(d|0,a[e+5>>0]|0,16)|0;b=d+c|0;Jj(b|0,a[e+6>>0]|0,16)|0;d=b+c|0;Jj(d|0,a[e+7>>0]|0,16)|0;b=d+c|0;Jj(b|0,a[e+8>>0]|0,16)|0;d=b+c|0;Jj(d|0,a[e+9>>0]|0,16)|0;b=d+c|0;Jj(b|0,a[e+10>>0]|0,16)|0;d=b+c|0;Jj(d|0,a[e+11>>0]|0,16)|0;b=d+c|0;Jj(b|0,a[e+12>>0]|0,16)|0;d=b+c|0;Jj(d|0,a[e+13>>0]|0,16)|0;b=d+c|0;Jj(b|0,a[e+14>>0]|0,16)|0;Jj(b+c|0,a[e+15>>0]|0,16)|0;return}function Vc(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;Jj(b|0,a[e>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+1>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+2>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+3>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+4>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+5>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+6>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+7>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+8>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+9>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+10>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+11>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+12>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+13>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+14>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+15>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+16>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+17>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+18>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+19>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+20>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+21>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+22>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+23>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+24>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+25>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+26>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+27>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+28>>0]|0,32)|0;d=b+c|0;Jj(d|0,a[e+29>>0]|0,32)|0;b=d+c|0;Jj(b|0,a[e+30>>0]|0,32)|0;Jj(b+c|0,a[e+31>>0]|0,32)|0;return}function Wc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=b;b=0;while(1){l=f+b|0;m=(d[l>>0]|0)-g+(d[e>>0]|0)|0;a[k>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[h>>0]|0)|0;a[k+1>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[i>>0]|0)|0;a[k+2>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[j>>0]|0)|0;a[k+3>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;b=b+1|0;if((b|0)==4)break;else k=k+c|0}return}function Xc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=e+4|0;l=e+5|0;m=e+6|0;n=e+7|0;o=b;b=0;while(1){p=f+b|0;q=(d[p>>0]|0)-g+(d[e>>0]|0)|0;a[o>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[h>>0]|0)|0;a[o+1>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[i>>0]|0)|0;a[o+2>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[j>>0]|0)|0;a[o+3>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[k>>0]|0)|0;a[o+4>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[l>>0]|0)|0;a[o+5>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[m>>0]|0)|0;a[o+6>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[n>>0]|0)|0;a[o+7>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;b=b+1|0;if((b|0)==8)break;else o=o+c|0}return}function Yc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=d[e+-1>>0]|0;h=b;b=0;while(1){i=f+b|0;j=0;do{k=(d[i>>0]|0)-g+(d[e+j>>0]|0)|0;a[h+j>>0]=(k|0)>255?-1:((k|0)>0?k:0)&255;j=j+1|0}while((j|0)!=16);b=b+1|0;if((b|0)==16)break;else h=h+c|0}return}function Zc(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=d[e+-1>>0]|0;h=b;b=0;while(1){i=f+b|0;j=0;do{k=(d[i>>0]|0)-g+(d[e+j>>0]|0)|0;a[h+j>>0]=(k|0)>255?-1:((k|0)>0?k:0)&255;j=j+1|0}while((j|0)!=32);b=b+1|0;if((b|0)==32)break;else h=h+c|0}return}function _c(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;e=b+c|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;b=e+c|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;e=b+c|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;return}function $c(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;c=d;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;c=d+4|0;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;return}function ad(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));e=b+c|0;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));return}function bd(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));e=b+c|0;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));return}function cd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))+2|0)>>>2&255;Jj(a|0,c|0,4)|0;e=a+b|0;Jj(e|0,c|0,4)|0;a=e+b|0;Jj(a|0,c|0,4)|0;Jj(a+b|0,c|0,4)|0;return}function dd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))+4|0)/8|0)&255;Jj(a|0,c|0,8)|0;e=a+b|0;Jj(e|0,c|0,8)|0;a=e+b|0;Jj(a|0,c|0,8)|0;e=a+b|0;Jj(e|0,c|0,8)|0;a=e+b|0;Jj(a|0,c|0,8)|0;e=a+b|0;Jj(e|0,c|0,8)|0;a=e+b|0;Jj(a|0,c|0,8)|0;Jj(a+b|0,c|0,8)|0;return}function ed(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+15>>0]|0)+((d[e+14>>0]|0)+((d[e+13>>0]|0)+((d[e+12>>0]|0)+((d[e+11>>0]|0)+((d[e+10>>0]|0)+((d[e+9>>0]|0)+((d[e+8>>0]|0)+((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))))))))))+8|0)/16|0)&255;Jj(a|0,c|0,16)|0;e=a+b|0;Jj(e|0,c|0,16)|0;a=e+b|0;Jj(a|0,c|0,16)|0;e=a+b|0;Jj(e|0,c|0,16)|0;a=e+b|0;Jj(a|0,c|0,16)|0;e=a+b|0;Jj(e|0,c|0,16)|0;a=e+b|0;Jj(a|0,c|0,16)|0;e=a+b|0;Jj(e|0,c|0,16)|0;a=e+b|0;Jj(a|0,c|0,16)|0;e=a+b|0;Jj(e|0,c|0,16)|0;a=e+b|0;Jj(a|0,c|0,16)|0;e=a+b|0;Jj(e|0,c|0,16)|0;a=e+b|0;Jj(a|0,c|0,16)|0;e=a+b|0;Jj(e|0,c|0,16)|0;a=e+b|0;Jj(a|0,c|0,16)|0;Jj(a+b|0,c|0,16)|0;return}function fd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+31>>0]|0)+((d[e+30>>0]|0)+((d[e+29>>0]|0)+((d[e+28>>0]|0)+((d[e+27>>0]|0)+((d[e+26>>0]|0)+((d[e+25>>0]|0)+((d[e+24>>0]|0)+((d[e+23>>0]|0)+((d[e+22>>0]|0)+((d[e+21>>0]|0)+((d[e+20>>0]|0)+((d[e+19>>0]|0)+((d[e+18>>0]|0)+((d[e+17>>0]|0)+((d[e+16>>0]|0)+((d[e+15>>0]|0)+((d[e+14>>0]|0)+((d[e+13>>0]|0)+((d[e+12>>0]|0)+((d[e+11>>0]|0)+((d[e+10>>0]|0)+((d[e+9>>0]|0)+((d[e+8>>0]|0)+((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))))))))))))))))))))))))))+16|0)/32|0)&255;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;e=a+b|0;Jj(e|0,c|0,32)|0;a=e+b|0;Jj(a|0,c|0,32)|0;Jj(a+b|0,c|0,32)|0;return}function gd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))+2|0)>>>2&255;Jj(a|0,e|0,4)|0;c=a+b|0;Jj(c|0,e|0,4)|0;a=c+b|0;Jj(a|0,e|0,4)|0;Jj(a+b|0,e|0,4)|0;return}function hd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))+4|0)/8|0)&255;Jj(a|0,e|0,8)|0;c=a+b|0;Jj(c|0,e|0,8)|0;a=c+b|0;Jj(a|0,e|0,8)|0;c=a+b|0;Jj(c|0,e|0,8)|0;a=c+b|0;Jj(a|0,e|0,8)|0;c=a+b|0;Jj(c|0,e|0,8)|0;a=c+b|0;Jj(a|0,e|0,8)|0;Jj(a+b|0,e|0,8)|0;return}function id(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))))))))))+8|0)/16|0)&255;Jj(a|0,e|0,16)|0;c=a+b|0;Jj(c|0,e|0,16)|0;a=c+b|0;Jj(a|0,e|0,16)|0;c=a+b|0;Jj(c|0,e|0,16)|0;a=c+b|0;Jj(a|0,e|0,16)|0;c=a+b|0;Jj(c|0,e|0,16)|0;a=c+b|0;Jj(a|0,e|0,16)|0;c=a+b|0;Jj(c|0,e|0,16)|0;a=c+b|0;Jj(a|0,e|0,16)|0;c=a+b|0;Jj(c|0,e|0,16)|0;a=c+b|0;Jj(a|0,e|0,16)|0;c=a+b|0;Jj(c|0,e|0,16)|0;a=c+b|0;Jj(a|0,e|0,16)|0;c=a+b|0;Jj(c|0,e|0,16)|0;a=c+b|0;Jj(a|0,e|0,16)|0;Jj(a+b|0,e|0,16)|0;return}function jd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+31>>0]|0)+((d[c+30>>0]|0)+((d[c+29>>0]|0)+((d[c+28>>0]|0)+((d[c+27>>0]|0)+((d[c+26>>0]|0)+((d[c+25>>0]|0)+((d[c+24>>0]|0)+((d[c+23>>0]|0)+((d[c+22>>0]|0)+((d[c+21>>0]|0)+((d[c+20>>0]|0)+((d[c+19>>0]|0)+((d[c+18>>0]|0)+((d[c+17>>0]|0)+((d[c+16>>0]|0)+((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))))))))))))))))))))))))))+16|0)/32|0)&255;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;c=a+b|0;Jj(c|0,e|0,32)|0;a=c+b|0;Jj(a|0,e|0,32)|0;Jj(a+b|0,e|0,32)|0;return}function kd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0)+4|0)/8|0)&255;Jj(a|0,f|0,4)|0;e=a+b|0;Jj(e|0,f|0,4)|0;a=e+b|0;Jj(a|0,f|0,4)|0;Jj(a+b|0,f|0,4)|0;return}function ld(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0)+8|0)/16|0)&255;Jj(a|0,f|0,8)|0;e=a+b|0;Jj(e|0,f|0,8)|0;a=e+b|0;Jj(a|0,f|0,8)|0;e=a+b|0;Jj(e|0,f|0,8)|0;a=e+b|0;Jj(a|0,f|0,8)|0;e=a+b|0;Jj(e|0,f|0,8)|0;a=e+b|0;Jj(a|0,f|0,8)|0;Jj(a+b|0,f|0,8)|0;return}function md(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0))+(d[e+8>>0]|0))+(d[e+9>>0]|0))+(d[e+10>>0]|0))+(d[e+11>>0]|0))+(d[e+12>>0]|0))+(d[e+13>>0]|0))+(d[e+14>>0]|0))+(d[e+15>>0]|0)+16|0)/32|0)&255;Jj(a|0,f|0,16)|0;e=a+b|0;Jj(e|0,f|0,16)|0;a=e+b|0;Jj(a|0,f|0,16)|0;e=a+b|0;Jj(e|0,f|0,16)|0;a=e+b|0;Jj(a|0,f|0,16)|0;e=a+b|0;Jj(e|0,f|0,16)|0;a=e+b|0;Jj(a|0,f|0,16)|0;e=a+b|0;Jj(e|0,f|0,16)|0;a=e+b|0;Jj(a|0,f|0,16)|0;e=a+b|0;Jj(e|0,f|0,16)|0;a=e+b|0;Jj(a|0,f|0,16)|0;e=a+b|0;Jj(e|0,f|0,16)|0;a=e+b|0;Jj(a|0,f|0,16)|0;e=a+b|0;Jj(e|0,f|0,16)|0;a=e+b|0;Jj(a|0,f|0,16)|0;Jj(a+b|0,f|0,16)|0;return}function nd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0,g=0;f=0;g=0;do{g=(d[c+f>>0]|0)+g+(d[e+f>>0]|0)|0;f=f+1|0}while((f|0)!=32);f=((g+32|0)/64|0)&255;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;g=a+b|0;Jj(g|0,f|0,32)|0;a=g+b|0;Jj(a|0,f|0,32)|0;Jj(a+b|0,f|0,32)|0;return}function od(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;h=e;e=h&-256;pd(a,b,c,d,e,h-e>>4,f,i,j);return}function pd(c,e,f,g,h,i,j,k,l){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(!((l|0)>0&(k|0)>0))return;m=f;f=c+-3|0;c=0;while(1){n=0;o=i;while(1){p=f+(o>>4)|0;q=o&15;r=S(b[h+(q<<4)>>1]|0,d[p>>0]|0)|0;s=(S(b[h+(q<<4)+2>>1]|0,d[p+1>>0]|0)|0)+r|0;r=(S(b[h+(q<<4)+4>>1]|0,d[p+2>>0]|0)|0)+s|0;s=(S(b[h+(q<<4)+6>>1]|0,d[p+3>>0]|0)|0)+r|0;r=(S(b[h+(q<<4)+8>>1]|0,d[p+4>>0]|0)|0)+s|0;s=(S(b[h+(q<<4)+10>>1]|0,d[p+5>>0]|0)|0)+r|0;r=(S(b[h+(q<<4)+12>>1]|0,d[p+6>>0]|0)|0)+s|0;s=(S(b[h+(q<<4)+14>>1]|0,d[p+7>>0]|0)|0)+r+64>>7;a[m+n>>0]=(s|0)>255?-1:((s|0)>0?s:0)&255;n=n+1|0;if((n|0)==(k|0))break;else o=o+j|0}c=c+1|0;if((c|0)==(l|0))break;else{m=m+g|0;f=f+e|0}}return}function qd(c,e,f,g,h,i,j,k,l,m){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;k=h;h=k&-256;j=h;n=k-h>>4;if(!((l|0)>0&(m|0)>0))return;h=f;f=c+-3|0;c=0;while(1){k=0;o=n;while(1){p=f+(o>>4)|0;q=o&15;r=S(b[j+(q<<4)>>1]|0,d[p>>0]|0)|0;s=S(b[j+(q<<4)+2>>1]|0,d[p+1>>0]|0)|0;t=S(b[j+(q<<4)+4>>1]|0,d[p+2>>0]|0)|0;u=S(b[j+(q<<4)+6>>1]|0,d[p+3>>0]|0)|0;v=S(b[j+(q<<4)+8>>1]|0,d[p+4>>0]|0)|0;w=S(b[j+(q<<4)+10>>1]|0,d[p+5>>0]|0)|0;x=S(b[j+(q<<4)+12>>1]|0,d[p+6>>0]|0)|0;y=S(b[j+(q<<4)+14>>1]|0,d[p+7>>0]|0)|0;p=h+k|0;q=r+64+s+t+u+v+w+x+y>>7;a[p>>0]=(((q|0)>255?256:(((q|0)>0?q:0)&255)+1|0)+(d[p>>0]|0)|0)>>>1;k=k+1|0;if((k|0)==(l|0))break;else o=o+i|0}c=c+1|0;if((c|0)==(m|0))break;else{h=h+g|0;f=f+e|0}}return}function rd(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;f=g;g=f&-256;sd(a,b,c,d,g,f-g>>4,h,i,j);return}function sd(c,e,f,g,h,i,j,k,l){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if(!((k|0)>0&(l|0)>0))return;m=e<<1;n=e*3|0;o=e<<2;p=e*5|0;q=e*6|0;r=e*7|0;s=f;f=c+(S(e,-3)|0)|0;c=0;while(1){t=0;u=i;while(1){v=f+(S(u>>4,e)|0)|0;w=u&15;x=S(b[h+(w<<4)>>1]|0,d[v>>0]|0)|0;y=(S(b[h+(w<<4)+2>>1]|0,d[v+e>>0]|0)|0)+x|0;x=(S(b[h+(w<<4)+4>>1]|0,d[v+m>>0]|0)|0)+y|0;y=(S(b[h+(w<<4)+6>>1]|0,d[v+n>>0]|0)|0)+x|0;x=(S(b[h+(w<<4)+8>>1]|0,d[v+o>>0]|0)|0)+y|0;y=(S(b[h+(w<<4)+10>>1]|0,d[v+p>>0]|0)|0)+x|0;x=(S(b[h+(w<<4)+12>>1]|0,d[v+q>>0]|0)|0)+y|0;y=(S(b[h+(w<<4)+14>>1]|0,d[v+r>>0]|0)|0)+x+64>>7;a[s+(S(t,g)|0)>>0]=(y|0)>255?-1:((y|0)>0?y:0)&255;t=t+1|0;if((t|0)==(l|0))break;else u=u+j|0}c=c+1|0;if((c|0)==(k|0))break;else{s=s+1|0;f=f+1|0}}return}function td(c,e,f,g,h,i,j,k,l,m){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;i=j;j=i&-256;h=j;n=i-j>>4;if(!((l|0)>0&(m|0)>0))return;j=e<<1;i=e*3|0;o=e<<2;p=e*5|0;q=e*6|0;r=e*7|0;s=f;f=c+(S(e,-3)|0)|0;c=0;while(1){t=0;u=n;while(1){v=f+(S(u>>4,e)|0)|0;w=u&15;x=S(b[h+(w<<4)>>1]|0,d[v>>0]|0)|0;y=S(b[h+(w<<4)+2>>1]|0,d[v+e>>0]|0)|0;z=S(b[h+(w<<4)+4>>1]|0,d[v+j>>0]|0)|0;A=S(b[h+(w<<4)+6>>1]|0,d[v+i>>0]|0)|0;B=S(b[h+(w<<4)+8>>1]|0,d[v+o>>0]|0)|0;C=S(b[h+(w<<4)+10>>1]|0,d[v+p>>0]|0)|0;D=S(b[h+(w<<4)+12>>1]|0,d[v+q>>0]|0)|0;E=S(b[h+(w<<4)+14>>1]|0,d[v+r>>0]|0)|0;v=s+(S(t,g)|0)|0;w=x+64+y+z+A+B+C+D+E>>7;a[v>>0]=(((w|0)>255?256:(((w|0)>0?w:0)&255)+1|0)+(d[v>>0]|0)|0)>>>1;t=t+1|0;if((t|0)==(m|0))break;else u=u+k|0}c=c+1|0;if((c|0)==(l|0))break;else{s=s+1|0;f=f+1|0}}return}function ud(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0;k=l;l=l+8640|0;m=k;n=e;e=n&-256;o=g;g=o&-256;p=o-g>>4;pd(a+(S(b,-3)|0)|0,b,m,64,e,n-e>>4,f,i,((S(j+-1|0,h)|0)+p>>4)+8|0);sd(m+192|0,64,c,d,g,p,h,i,j);l=k;return}function vd(b,c,e,f,g,h,i,j,k,m){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+12736|0;o=n+4096|0;p=n;q=g;g=q&-256;r=i;i=r&-256;s=r-i>>4;pd(b+(S(c,-3)|0)|0,c,o,64,g,q-g>>4,h,k,((S(m+-1|0,j)|0)+s>>4)+8|0);sd(o+192|0,64,p,64,i,s,j,k,m);if((k|0)>0&(m|0)>0){t=e;u=p;v=0}else{l=n;return}while(1){p=0;do{e=t+p|0;a[e>>0]=((d[e>>0]|0)+1+(d[u+p>>0]|0)|0)>>>1;p=p+1|0}while((p|0)!=(k|0));v=v+1|0;if((v|0)==(m|0))break;else{t=t+f|0;u=u+64|0}}l=n;return}function wd(b,c,e,f,g,h,i,j,k,l){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;if((l|0)>0&(k|0)>0){m=e;n=b;o=0}else return;while(1){b=0;do{e=m+b|0;a[e>>0]=((d[e>>0]|0)+1+(d[n+b>>0]|0)|0)>>>1;b=b+1|0}while((b|0)!=(k|0));o=o+1|0;if((o|0)==(l|0))break;else{m=m+f|0;n=n+c|0}}return}function xd(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;if((j|0)>0){k=c;l=j;m=a}else return;while(1){Qj(k|0,m|0,i|0)|0;if((l|0)>1){k=k+d|0;l=l+-1|0;m=m+b|0}else break}return}function yd(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;h=e;e=h&-256;pd(a,b,c,d,e,h-e>>4,f,i,j);return}function zd(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;f=g;g=f&-256;sd(a,b,c,d,g,f-g>>4,h,i,j);return}function Ad(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0;k=l;l=l+8640|0;m=k;n=e;e=n&-256;o=g;g=o&-256;p=o-g>>4;pd(a+(S(b,-3)|0)|0,b,m,64,e,n-e>>4,f,i,((S(j+-1|0,h)|0)+p>>4)+8|0);sd(m+192|0,64,c,d,g,p,h,i,j);l=k;return}function Bd(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;qd(a,b,c,d,e,f,0,0,i,j);return}function Cd(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;td(a,b,c,d,0,0,g,h,i,j);return}function Dd(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;vd(a,b,c,d,e,f,g,h,i,j);return}function Ed(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=S(c,-4)|0;i=S(c,-3)|0;j=S(c,-2)|0;k=0-c|0;l=c<<1;m=c*3|0;n=0-l|0;o=0;p=b;while(1){b=p+k|0;q=a[b>>0]|0;r=a[p>>0]|0;s=p+c|0;t=a[s>>0]|0;u=d[p+i>>0]|0;v=(d[p+h>>0]|0)-u|0;w=d[f>>0]|0;x=d[p+j>>0]|0;y=u-x|0;u=q&255;z=x-u|0;A=t&255;B=r&255;C=A-B|0;D=(C|0)>-1?C:0-C|0;C=d[p+l>>0]|0;E=C-A|0;F=(d[p+m>>0]|0)-C|0;C=u-B|0;B=x-A|0;A=p+n|0;x=a[A>>0]|0;G=(x&255)-u|0;u=d[g>>0]|0;H=(D|0)>(u|0)?1:(((G|0)>-1?G:0-G|0)|0)>(u|0);u=(x^-128)<<24>>24;x=(t^-128)<<24>>24;t=u-x|0;G=(r^-128)<<24>>24;r=(q^-128)<<24>>24;q=(H?((t|0)<-128?-128:((t|0)<127?t:127)<<24>>24):0)+((G-r|0)*3|0)|0;t=(((q|0)<-128?128:(q|0)<127?q:127)&(((((((B|0)>-1?B:0-B|0)|0)/2|0)+(((C|0)>-1?C:0-C|0)<<1)|0)>(d[e>>0]|0|0)|((((F|0)>-1?F:0-F|0)|0)>(w|0)|((((E|0)>-1?E:0-E|0)|0)>(w|0)|((D|0)>(w|0)|((((z|0)>-1?z:0-z|0)|0)>(w|0)|((((v|0)>-1?v:0-v|0)|0)>(w|0)?1:(((y|0)>-1?y:0-y|0)|0)>(w|0)))))))<<31>>31^255))<<24>>24;w=t+4|0;y=t+3|0;t=(w|0)<-128?-16:((w|0)<127?w:127)<<24>>27;w=G-t|0;a[p>>0]=(w|0)<-128?0:((w|0)<127?w:127)&255^-128;w=((y|0)<-128?-16:((y|0)<127?y:127)<<24>>27)+r|0;a[b>>0]=(w|0)<-128?0:((w|0)<127?w:127)&255^-128;w=((t+1|0)>>>1&(H?0:255))<<24>>24;H=x-w|0;a[s>>0]=(H|0)<-128?0:((H|0)<127?H:127)&255^-128;H=w+u|0;a[A>>0]=(H|0)<-128?0:((H|0)<127?H:127)&255^-128;o=o+1|0;if((o|0)==8)break;else p=p+1|0}return}function Fd(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Ed(a,b,c,d,e);Ed(a+8|0,b,f,g,h);return}function Gd(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if((c|0)!=1){h=0;i=b;while(1){j=i+-2|0;k=a[j>>0]|0;l=i+-1|0;m=a[l>>0]|0;n=a[i>>0]|0;o=i+1|0;p=a[o>>0]|0;q=d[i+-3>>0]|0;r=(d[i+-4>>0]|0)-q|0;s=d[f>>0]|0;t=k&255;u=q-t|0;q=m&255;v=t-q|0;w=(v|0)>-1?v:0-v|0;v=p&255;x=n&255;y=v-x|0;z=(y|0)>-1?y:0-y|0;y=d[i+2>>0]|0;A=y-v|0;B=(d[i+3>>0]|0)-y|0;y=q-x|0;x=t-v|0;v=d[g>>0]|0;t=(w|0)>(v|0)|(z|0)>(v|0);v=(k^-128)<<24>>24;k=(p^-128)<<24>>24;p=v-k|0;q=(n^-128)<<24>>24;n=(m^-128)<<24>>24;m=(t?((p|0)<-128?-128:((p|0)<127?p:127)<<24>>24):0)+((q-n|0)*3|0)|0;p=(((m|0)<-128?128:(m|0)<127?m:127)&(((((((x|0)>-1?x:0-x|0)|0)/2|0)+(((y|0)>-1?y:0-y|0)<<1)|0)>(d[e>>0]|0|0)|((((B|0)>-1?B:0-B|0)|0)>(s|0)|((((A|0)>-1?A:0-A|0)|0)>(s|0)|((z|0)>(s|0)|((w|0)>(s|0)|((((r|0)>-1?r:0-r|0)|0)>(s|0)?1:(((u|0)>-1?u:0-u|0)|0)>(s|0)))))))<<31>>31^255))<<24>>24;s=p+4|0;u=p+3|0;p=(s|0)<-128?-16:((s|0)<127?s:127)<<24>>27;s=q-p|0;a[i>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;s=((u|0)<-128?-16:((u|0)<127?u:127)<<24>>27)+n|0;a[l>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;s=((p+1|0)>>>1&(t?0:255))<<24>>24;t=k-s|0;a[o>>0]=(t|0)<-128?0:((t|0)<127?t:127)&255^-128;t=s+v|0;a[j>>0]=(t|0)<-128?0:((t|0)<127?t:127)&255^-128;h=h+1|0;if((h|0)==8)break;else i=i+c|0}return}i=0;h=b;t=a[b>>0]|0;while(1){b=h+-2|0;j=a[b>>0]|0;v=h+-1|0;s=a[v>>0]|0;o=h+1|0;k=a[o>>0]|0;p=d[h+-3>>0]|0;l=(d[h+-4>>0]|0)-p|0;n=d[f>>0]|0;u=j&255;q=p-u|0;p=s&255;r=u-p|0;w=(r|0)>-1?r:0-r|0;r=k&255;z=t&255;A=r-z|0;B=(A|0)>-1?A:0-A|0;A=d[h+2>>0]|0;y=A-r|0;x=(d[h+3>>0]|0)-A|0;A=p-z|0;z=u-r|0;r=d[g>>0]|0;u=(w|0)>(r|0)|(B|0)>(r|0);r=(j^-128)<<24>>24;j=(k^-128)<<24>>24;k=r-j|0;p=(t^-128)<<24>>24;m=(s^-128)<<24>>24;s=(u?((k|0)<-128?-128:((k|0)<127?k:127)<<24>>24):0)+((p-m|0)*3|0)|0;k=(((s|0)<-128?128:(s|0)<127?s:127)&(((((((z|0)>-1?z:0-z|0)|0)/2|0)+(((A|0)>-1?A:0-A|0)<<1)|0)>(d[e>>0]|0|0)|((((x|0)>-1?x:0-x|0)|0)>(n|0)|((((y|0)>-1?y:0-y|0)|0)>(n|0)|((B|0)>(n|0)|((w|0)>(n|0)|((((l|0)>-1?l:0-l|0)|0)>(n|0)?1:(((q|0)>-1?q:0-q|0)|0)>(n|0)))))))<<31>>31^255))<<24>>24;n=k+4|0;q=k+3|0;k=(n|0)<-128?-16:((n|0)<127?n:127)<<24>>27;n=p-k|0;a[h>>0]=(n|0)<-128?0:((n|0)<127?n:127)&255^-128;n=((q|0)<-128?-16:((q|0)<127?q:127)<<24>>27)+m|0;a[v>>0]=(n|0)<-128?0:((n|0)<127?n:127)&255^-128;n=((k+1|0)>>>1&(u?0:255))<<24>>24;u=j-n|0;t=(u|0)<-128?0:((u|0)<127?u:127)&255^-128;a[o>>0]=t;o=n+r|0;a[b>>0]=(o|0)<-128?0:((o|0)<127?o:127)&255^-128;i=i+1|0;if((i|0)==8)break;else h=h+c|0}return}function Hd(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Gd(a,b,c,d,e);Gd(a+(b<<3)|0,b,f,g,h);return}function Id(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;h=S(c,-4)|0;i=S(c,-3)|0;j=S(c,-2)|0;k=0-c|0;l=c<<1;m=c*3|0;n=0-(c<<2)|0;o=0-m|0;p=0-l|0;q=0;r=b;while(1){b=r+k|0;s=r+c|0;t=r+l|0;u=r+m|0;v=d[r+h>>0]|0;w=d[r+i>>0]|0;x=v-w|0;y=d[f>>0]|0;z=d[r+j>>0]|0;A=w-z|0;B=d[b>>0]|0;C=z-B|0;D=(C|0)>-1?C:0-C|0;C=d[s>>0]|0;E=d[r>>0]|0;F=C-E|0;G=(F|0)>-1?F:0-F|0;F=d[t>>0]|0;H=F-C|0;I=d[u>>0]|0;J=I-F|0;K=B-E|0;L=z-C|0;C=w-B|0;w=F-E|0;F=v-B|0;B=I-E|0;Jd((((((((L|0)>-1?L:0-L|0)|0)/2|0)+(((K|0)>-1?K:0-K|0)<<1)|0)>(d[e>>0]|0|0)|((((J|0)>-1?J:0-J|0)|0)>(y|0)|((((H|0)>-1?H:0-H|0)|0)>(y|0)|((G|0)>(y|0)|((D|0)>(y|0)|((((x|0)>-1?x:0-x|0)|0)>(y|0)?1:(((A|0)>-1?A:0-A|0)|0)>(y|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((B|0)>-1?B:0-B|0)|0)>1|((((F|0)>-1?F:0-F|0)|0)>1|((((w|0)>-1?w:0-w|0)|0)>1|((((C|0)>-1?C:0-C|0)|0)>1|((D|0)>1|(G|0)>1)))))<<31>>31^255)&255,r+n|0,r+o|0,r+p|0,b,r,s,t,u);q=q+1|0;if((q|0)==8)break;else r=r+1|0}return}function Jd(b,c,e,f,g,h,i,j,k,l,m){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0;if(b<<24>>24==0|e<<24>>24==0){e=a[h>>0]|0;n=a[i>>0]|0;o=a[j>>0]|0;p=a[k>>0]|0;q=(e&255)-(n&255)|0;r=c&255;c=(p&255)-(o&255)|0;s=(((q|0)>-1?q:0-q|0)|0)>(r|0)?1:(((c|0)>-1?c:0-c|0)|0)>(r|0);r=(e^-128)<<24>>24;e=(p^-128)<<24>>24;p=r-e|0;c=(o^-128)<<24>>24;o=(n^-128)<<24>>24;n=(s?((p|0)<-128?-128:((p|0)<127?p:127)<<24>>24):0)+((c-o|0)*3|0)|0;p=(((n|0)<-128?-128:((n|0)<127?n:127)&255)&b)<<24>>24;b=p+4|0;n=p+3|0;p=(b|0)<-128?-16:((b|0)<127?b:127)<<24>>27;b=c-p|0;a[j>>0]=(b|0)<-128?0:((b|0)<127?b:127)&255^-128;b=((n|0)<-128?-16:((n|0)<127?n:127)<<24>>27)+o|0;a[i>>0]=(b|0)<-128?0:((b|0)<127?b:127)&255^-128;b=((p+1|0)>>>1&(s?0:255))<<24>>24;s=e-b|0;a[k>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;s=b+r|0;a[h>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;return}else{s=a[k>>0]|0;r=a[l>>0]|0;b=a[m>>0]|0;m=d[f>>0]|0;f=d[g>>0]|0;e=d[h>>0]|0;p=d[i>>0]|0;o=d[j>>0]|0;a[g>>0]=((m*3|0)+4+(f<<1)+e+p+o|0)>>>3;g=s&255;s=f+4|0;a[h>>0]=(s+p+o+(e+m<<1)+g|0)>>>3;h=r&255;a[i>>0]=(m+4+f+e+(p<<1)+o+g+h|0)>>>3;f=b&255;a[j>>0]=(s+e+p+(o<<1)+g+h+f|0)>>>3;a[k>>0]=(e+4+p+o+h+(f+g<<1)|0)>>>3;a[l>>0]=(p+4+o+g+(h<<1)+(f*3|0)|0)>>>3;return}}function Kd(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Id(a,b,c,d,e);Id(a+8|0,b,f,g,h);return}function Ld(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=0;i=b;while(1){b=i+-4|0;j=i+-3|0;k=i+-2|0;l=i+-1|0;m=i+1|0;n=i+2|0;o=i+3|0;p=d[b>>0]|0;q=d[j>>0]|0;r=p-q|0;s=d[f>>0]|0;t=d[k>>0]|0;u=q-t|0;v=d[l>>0]|0;w=t-v|0;x=(w|0)>-1?w:0-w|0;w=d[m>>0]|0;y=d[i>>0]|0;z=w-y|0;A=(z|0)>-1?z:0-z|0;z=d[n>>0]|0;B=z-w|0;C=d[o>>0]|0;D=C-z|0;E=v-y|0;F=t-w|0;w=q-v|0;q=z-y|0;z=p-v|0;v=C-y|0;Jd((((((((F|0)>-1?F:0-F|0)|0)/2|0)+(((E|0)>-1?E:0-E|0)<<1)|0)>(d[e>>0]|0|0)|((((D|0)>-1?D:0-D|0)|0)>(s|0)|((((B|0)>-1?B:0-B|0)|0)>(s|0)|((A|0)>(s|0)|((x|0)>(s|0)|((((r|0)>-1?r:0-r|0)|0)>(s|0)?1:(((u|0)>-1?u:0-u|0)|0)>(s|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((v|0)>-1?v:0-v|0)|0)>1|((((z|0)>-1?z:0-z|0)|0)>1|((((q|0)>-1?q:0-q|0)|0)>1|((((w|0)>-1?w:0-w|0)|0)>1|((x|0)>1|(A|0)>1)))))<<31>>31^255)&255,b,j,k,l,i,m,n,o);h=h+1|0;if((h|0)==8)break;else i=i+c|0}return}function Md(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Ld(a,b,c,d,e);Ld(a+(b<<3)|0,b,f,g,h);return}function Nd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Od(a,b,c,d,e,1);return}function Od(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;i=h<<3;if((h|0)<=0)return;h=S(c,-4)|0;j=S(c,-3)|0;k=S(c,-2)|0;l=0-c|0;m=c<<1;n=c*3|0;o=S(c,-8)|0;p=S(c,-7)|0;q=S(c,-6)|0;r=S(c,-5)|0;s=c<<2;t=c*5|0;u=c*6|0;v=c*7|0;w=0-(c<<3)|0;x=0-v|0;y=0-u|0;z=0-t|0;A=0-s|0;B=0-n|0;C=0-m|0;D=0;E=b;while(1){b=E+l|0;F=E+c|0;G=E+m|0;H=E+n|0;I=d[E+h>>0]|0;J=d[E+j>>0]|0;K=I-J|0;L=d[f>>0]|0;M=d[E+k>>0]|0;N=J-M|0;O=d[b>>0]|0;P=M-O|0;Q=(P|0)>-1?P:0-P|0;P=d[F>>0]|0;R=d[E>>0]|0;T=P-R|0;U=(T|0)>-1?T:0-T|0;T=d[G>>0]|0;V=T-P|0;W=d[H>>0]|0;X=W-T|0;Y=O-R|0;Z=M-P|0;P=J-O|0;J=T-R|0;T=I-O|0;I=W-R|0;W=E+s|0;M=E+t|0;_=E+u|0;$=E+v|0;aa=(d[E+r>>0]|0)-O|0;ba=(d[W>>0]|0)-R|0;ca=(d[E+q>>0]|0)-O|0;da=(d[M>>0]|0)-R|0;ea=(d[E+p>>0]|0)-O|0;fa=(d[_>>0]|0)-R|0;ga=(d[E+o>>0]|0)-O|0;O=(d[$>>0]|0)-R|0;Pd((((((((Z|0)>-1?Z:0-Z|0)|0)/2|0)+(((Y|0)>-1?Y:0-Y|0)<<1)|0)>(d[e>>0]|0|0)|((((X|0)>-1?X:0-X|0)|0)>(L|0)|((((V|0)>-1?V:0-V|0)|0)>(L|0)|((U|0)>(L|0)|((Q|0)>(L|0)|((((K|0)>-1?K:0-K|0)|0)>(L|0)?1:(((N|0)>-1?N:0-N|0)|0)>(L|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((I|0)>-1?I:0-I|0)|0)>1|((((T|0)>-1?T:0-T|0)|0)>1|((((J|0)>-1?J:0-J|0)|0)>1|((((P|0)>-1?P:0-P|0)|0)>1|((Q|0)>1|(U|0)>1)))))<<31>>31^255)&255,((((ga|0)>-1?ga:0-ga|0)|0)>1?1:(((O|0)>-1?O:0-O|0)|0)>1)?0:(((((fa|0)>-1?fa:0-fa|0)|0)>1|((((ea|0)>-1?ea:0-ea|0)|0)>1|((((da|0)>-1?da:0-da|0)|0)>1|((((ca|0)>-1?ca:0-ca|0)|0)>1|((((aa|0)>-1?aa:0-aa|0)|0)>1?1:(((ba|0)>-1?ba:0-ba|0)|0)>1)))))<<31>>31^255)&255,E+w|0,E+x|0,E+y|0,E+z|0,E+A|0,E+B|0,E+C|0,b,E,F,G,H,W,M,_,$);D=D+1|0;if((D|0)>=(i|0))break;else E=E+1|0}return}function Pd(b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;var w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;if(b<<24>>24==0|(e<<24>>24==0|f<<24>>24==0)){Jd(b,c,e,k,l,m,n,o,p,q,r);return}else{e=a[p>>0]|0;c=a[q>>0]|0;b=a[r>>0]|0;f=a[s>>0]|0;w=a[t>>0]|0;x=a[u>>0]|0;y=a[v>>0]|0;v=d[g>>0]|0;g=d[h>>0]|0;z=d[i>>0]|0;A=d[j>>0]|0;B=d[k>>0]|0;C=d[l>>0]|0;D=d[m>>0]|0;E=d[n>>0]|0;F=d[o>>0]|0;a[h>>0]=((v*7|0)+8+(g<<1)+z+A+B+C+D+E+F|0)>>>4;h=e&255;e=g+8|0;a[i>>0]=(e+(v*6|0)+(z<<1)+A+B+C+D+E+F+h|0)>>>4;i=c&255;a[j>>0]=(e+(v*5|0)+z+(A<<1)+B+C+D+E+F+h+i|0)>>>4;j=b&255;a[k>>0]=(e+(v<<2)+z+A+(B<<1)+C+D+E+F+h+i+j|0)>>>4;k=f&255;a[l>>0]=(e+(v*3|0)+z+A+B+(C<<1)+D+E+F+h+i+j+k|0)>>>4;l=w&255;w=e+z+A+B+C|0;a[m>>0]=(w+E+F+(D+v<<1)+h+i+j+k+l|0)>>>4;m=x&255;a[n>>0]=(v+8+g+z+A+B+C+D+(E<<1)+F+h+i+j+k+l+m|0)>>>4;g=y&255;a[o>>0]=(w+D+E+(F<<1)+h+i+j+k+l+m+g|0)>>>4;a[p>>0]=(z+8+A+B+C+D+E+F+i+j+k+l+m+(g+h<<1)|0)>>>4;a[q>>0]=(A+8+B+C+D+E+F+h+(i<<1)+j+k+l+m+(g*3|0)|0)>>>4;a[r>>0]=(B+8+C+D+E+F+h+i+(j<<1)+k+l+m+(g<<2)|0)>>>4;a[s>>0]=(C+8+D+E+F+h+i+j+(k<<1)+l+m+(g*5|0)|0)>>>4;a[t>>0]=(D+8+E+F+h+i+j+k+(l<<1)+m+(g*6|0)|0)>>>4;a[u>>0]=(E+8+F+h+i+j+k+l+(m<<1)+(g*7|0)|0)>>>4;return}}function Qd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Od(a,b,c,d,e,2);return}function Rd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Sd(a,b,c,d,e,8);return}function Sd(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;if((h|0)>0){i=0;j=b}else return;while(1){b=j+-4|0;k=j+-3|0;l=j+-2|0;m=j+-1|0;n=j+1|0;o=j+2|0;p=j+3|0;q=d[b>>0]|0;r=d[k>>0]|0;s=q-r|0;t=d[f>>0]|0;u=d[l>>0]|0;v=r-u|0;w=d[m>>0]|0;x=u-w|0;y=(x|0)>-1?x:0-x|0;x=d[n>>0]|0;z=d[j>>0]|0;A=x-z|0;B=(A|0)>-1?A:0-A|0;A=d[o>>0]|0;C=A-x|0;D=d[p>>0]|0;E=D-A|0;F=w-z|0;G=u-x|0;x=r-w|0;r=A-z|0;A=q-w|0;q=D-z|0;D=j+-8|0;u=j+-7|0;H=j+-6|0;I=j+-5|0;J=j+4|0;K=j+5|0;L=j+6|0;M=j+7|0;N=(d[I>>0]|0)-w|0;O=(d[J>>0]|0)-z|0;P=(d[H>>0]|0)-w|0;Q=(d[K>>0]|0)-z|0;R=(d[u>>0]|0)-w|0;S=(d[L>>0]|0)-z|0;T=(d[D>>0]|0)-w|0;w=(d[M>>0]|0)-z|0;Pd((((((((G|0)>-1?G:0-G|0)|0)/2|0)+(((F|0)>-1?F:0-F|0)<<1)|0)>(d[e>>0]|0|0)|((((E|0)>-1?E:0-E|0)|0)>(t|0)|((((C|0)>-1?C:0-C|0)|0)>(t|0)|((B|0)>(t|0)|((y|0)>(t|0)|((((s|0)>-1?s:0-s|0)|0)>(t|0)?1:(((v|0)>-1?v:0-v|0)|0)>(t|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((q|0)>-1?q:0-q|0)|0)>1|((((A|0)>-1?A:0-A|0)|0)>1|((((r|0)>-1?r:0-r|0)|0)>1|((((x|0)>-1?x:0-x|0)|0)>1|((y|0)>1|(B|0)>1)))))<<31>>31^255)&255,((((T|0)>-1?T:0-T|0)|0)>1?1:(((w|0)>-1?w:0-w|0)|0)>1)?0:(((((S|0)>-1?S:0-S|0)|0)>1|((((R|0)>-1?R:0-R|0)|0)>1|((((Q|0)>-1?Q:0-Q|0)|0)>1|((((P|0)>-1?P:0-P|0)|0)>1|((((N|0)>-1?N:0-N|0)|0)>1?1:(((O|0)>-1?O:0-O|0)|0)>1)))))<<31>>31^255)&255,D,u,H,I,b,k,l,m,j,n,o,p,J,K,L,M);i=i+1|0;if((i|0)==(h|0))break;else j=j+c|0}return}function Td(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Sd(a,b,c,d,e,16);return}function Ud(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;g=l;l=l+32|0;h=g;i=b[c+2>>1]>>2;j=b[c+6>>1]>>2;k=i+(b[c>>1]>>2)|0;m=(b[c+4>>1]>>2)-j|0;n=k-m>>1;o=n-j|0;j=n-i|0;b[h>>1]=k-o;b[h+2>>1]=o;b[h+4>>1]=j;b[h+6>>1]=j+m;m=b[c+10>>1]>>2;j=b[c+14>>1]>>2;o=m+(b[c+8>>1]>>2)|0;k=(b[c+12>>1]>>2)-j|0;i=o-k>>1;n=i-j|0;j=i-m|0;m=o-n&65535;b[h+8>>1]=m;b[h+10>>1]=n;b[h+12>>1]=j;b[h+14>>1]=j+k;k=b[c+18>>1]>>2;j=b[c+22>>1]>>2;n=k+(b[c+16>>1]>>2)|0;o=(b[c+20>>1]>>2)-j|0;i=n-o>>1;p=i-j|0;j=i-k|0;b[h+16>>1]=n-p;b[h+18>>1]=p;b[h+20>>1]=j;b[h+22>>1]=j+o;o=b[c+26>>1]>>2;j=b[c+30>>1]>>2;p=o+(b[c+24>>1]>>2)|0;n=(b[c+28>>1]>>2)-j|0;c=p-n>>1;k=c-j|0;j=c-o|0;b[h+24>>1]=p-k;b[h+26>>1]=k;b[h+28>>1]=j;b[h+30>>1]=j+n;n=f<<1;j=f*3|0;k=m;m=e;e=0;p=h;while(1){h=k<<16>>16;o=b[p+24>>1]|0;c=h+(b[p>>1]|0)|0;i=(b[p+16>>1]|0)-o|0;q=c-i>>1;r=q-o|0;o=q-h|0;h=c-r+(d[m>>0]|0)|0;a[m>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=m+f|0;c=r+(d[h>>0]|0)|0;a[h>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=m+n|0;h=(d[c>>0]|0)+o|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=m+j|0;c=o+i+(d[h>>0]|0)|0;a[h>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+1|0;if((c|0)==4)break;k=b[p+10>>1]|0;m=m+1|0;e=c;p=p+2|0}l=g;return}function Vd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;g=l;l=l+16|0;h=g;i=b[c>>1]|0;c=i>>3;j=(i>>>2)-c&65535;b[h>>1]=j;i=c&65535;b[h+6>>1]=i;b[h+4>>1]=i;b[h+2>>1]=i;i=f<<1;c=f*3|0;k=j;j=e;e=0;m=h;while(1){h=k<<16>>16;n=h>>1;o=h-n+(d[j>>0]|0)|0;a[j>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;o=j+f|0;h=(d[o>>0]|0)+n|0;a[o>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=j+i|0;o=(d[h>>0]|0)+n|0;a[h>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;o=j+c|0;h=(d[o>>0]|0)+n|0;a[o>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=m+2|0;o=e+1|0;if((o|0)==4)break;k=b[h>>1]|0;j=j+1|0;e=o;m=h}l=g;return}function Wd(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=b[a>>1]|0;e=b[a+4>>1]|0;f=b[a+2>>1]|0;g=b[a+6>>1]|0;a=((f*6270|0)+8192+(S(g,-15137)|0)|0)>>>14;h=(((e+d|0)*11585|0)+8192|0)>>>14<<16>>16;i=((f*15137|0)+8192+(g*6270|0)|0)>>>14<<16>>16;b[c>>1]=i+h;g=(((d-e|0)*11585|0)+8192|0)>>>14<<16>>16;e=a<<16>>16;b[c+2>>1]=e+g;b[c+4>>1]=g-e;b[c+6>>1]=h-i;return}function Xd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;g=l;l=l+32|0;h=g;i=0;j=c;c=h;while(1){k=b[j>>1]|0;m=b[j+4>>1]|0;n=b[j+2>>1]|0;o=b[j+6>>1]|0;p=((n*6270|0)+8192+(S(o,-15137)|0)|0)>>>14;q=(((m+k|0)*11585|0)+8192|0)>>>14<<16>>16;r=((n*15137|0)+8192+(o*6270|0)|0)>>>14<<16>>16;b[c>>1]=r+q;o=(((k-m|0)*11585|0)+8192|0)>>>14<<16>>16;m=p<<16>>16;b[c+2>>1]=m+o;b[c+4>>1]=o-m;b[c+6>>1]=q-r;i=i+1|0;if((i|0)==4)break;else{j=j+8|0;c=c+8|0}}c=f<<1;j=f*3|0;i=0;do{r=b[h+(i<<1)>>1]|0;q=b[h+(i+8<<1)>>1]|0;m=b[h+(i+4<<1)>>1]|0;o=b[h+(i+12<<1)>>1]|0;p=(((q+r|0)*11585|0)+8192|0)>>>14<<16>>16;k=((m*15137|0)+8192+(o*6270|0)|0)>>>14<<16>>16;n=(((r-q|0)*11585|0)+8192|0)>>>14<<16>>16;q=((m*6270|0)+8192+(S(o,-15137)|0)|0)>>>14<<16>>16;o=e+i|0;m=((k+p<<16>>16)+8>>4)+(d[o>>0]|0)|0;a[o>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=e+(i+f)|0;o=((q+n<<16>>16)+8>>4)+(d[m>>0]|0)|0;a[m>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;o=e+(c+i)|0;m=((n-q<<16>>16)+8>>4)+(d[o>>0]|0)|0;a[o>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=e+(j+i)|0;o=((p-k<<16>>16)+8>>4)+(d[m>>0]|0)|0;a[m>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;i=i+1|0}while((i|0)!=4);l=g;return}function Yd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+8>>4;c=(d[e>>0]|0)+g|0;a[e>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+1|0;h=(d[c>>0]|0)+g|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=e+2|0;c=(d[h>>0]|0)+g|0;a[h>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+3|0;h=(d[c>>0]|0)+g|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=e+f|0;e=(d[h>>0]|0)+g|0;a[h>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=h+1|0;c=(d[e>>0]|0)+g|0;a[e>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=h+2|0;e=(d[c>>0]|0)+g|0;a[c>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=h+3|0;c=(d[e>>0]|0)+g|0;a[e>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=h+f|0;h=(d[c>>0]|0)+g|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=c+1|0;e=(d[h>>0]|0)+g|0;a[h>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+2|0;h=(d[e>>0]|0)+g|0;a[e>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=c+3|0;e=(d[h>>0]|0)+g|0;a[h>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+f|0;f=(d[e>>0]|0)+g|0;a[e>>0]=(f|0)>255?-1:((f|0)>0?f:0)&255;f=e+1|0;c=(d[f>>0]|0)+g|0;a[f>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+2|0;f=(d[c>>0]|0)+g|0;a[c>>0]=(f|0)>255?-1:((f|0)>0?f:0)&255;f=e+3|0;e=(d[f>>0]|0)+g|0;a[f>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;return}function Zd(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=b[a+2>>1]|0;e=b[a+14>>1]|0;f=((d*3196|0)+8192+(S(e,-16069)|0)|0)>>>14;g=b[a+10>>1]|0;h=b[a+6>>1]|0;i=b[a>>1]|0;j=b[a+8>>1]|0;k=b[a+4>>1]|0;l=b[a+12>>1]|0;a=f<<16>>16;f=((g*13623|0)+8192+(S(h,-9102)|0)|0)>>>14<<16>>16;m=((g*9102|0)+8192+(h*13623|0)|0)>>>14<<16>>16;h=((d*16069|0)+8192+(e*3196|0)|0)>>>14<<16>>16;e=(((j+i|0)*11585|0)+8192|0)>>>14<<16>>16;d=((k*15137|0)+8192+(l*6270|0)|0)>>>14<<16>>16;g=(((i-j|0)*11585|0)+8192|0)>>>14<<16>>16;j=((k*6270|0)+8192+(S(l,-15137)|0)|0)>>>14<<16>>16;l=h-m<<16>>16;k=a-f<<16>>16;i=d+e<<16>>16;n=m+h<<16>>16;b[c>>1]=n+i;h=j+g<<16>>16;m=(((k+l|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+2>>1]=m+h;o=g-j<<16>>16;j=(((l-k|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+4>>1]=j+o;k=e-d<<16>>16;d=f+a<<16>>16;b[c+6>>1]=d+k;b[c+8>>1]=k-d;b[c+10>>1]=o-j;b[c+12>>1]=h-m;b[c+14>>1]=i-n;return}function _d(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=l;l=l+160|0;h=g+32|0;i=g+16|0;j=g;Zd(c,h);Zd(c+16|0,h+16|0);Zd(c+32|0,h+32|0);Zd(c+48|0,h+48|0);Zd(c+64|0,h+64|0);Zd(c+80|0,h+80|0);Zd(c+96|0,h+96|0);Zd(c+112|0,h+112|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=j+2|0;s=f<<1;t=j+4|0;u=f*3|0;v=j+6|0;w=f<<2;x=j+8|0;y=f*5|0;z=j+10|0;A=f*6|0;B=j+12|0;C=f*7|0;D=j+14|0;E=0;do{b[i>>1]=b[h+(E<<1)>>1]|0;b[c>>1]=b[h+(E+8<<1)>>1]|0;b[k>>1]=b[h+(E+16<<1)>>1]|0;b[m>>1]=b[h+(E+24<<1)>>1]|0;b[n>>1]=b[h+(E+32<<1)>>1]|0;b[o>>1]=b[h+(E+40<<1)>>1]|0;b[p>>1]=b[h+(E+48<<1)>>1]|0;b[q>>1]=b[h+(E+56<<1)>>1]|0;Zd(i,j);F=e+E|0;G=((b[j>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(E+f)|0;F=((b[r>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(s+E)|0;G=((b[t>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(u+E)|0;F=((b[v>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(w+E)|0;G=((b[x>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(y+E)|0;F=((b[z>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(A+E)|0;G=((b[B>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(C+E)|0;F=((b[D>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;E=E+1|0}while((E|0)!=8);l=g;return}function $d(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+16>>5;if((f|0)!=1){c=e;h=0;while(1){i=(d[c>>0]|0)+g|0;a[c>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+1|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;j=c+2|0;i=(d[j>>0]|0)+g|0;a[j>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+3|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;j=c+4|0;i=(d[j>>0]|0)+g|0;a[j>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+5|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;j=c+6|0;i=(d[j>>0]|0)+g|0;a[j>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+7|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;h=h+1|0;if((h|0)==8)break;else c=c+f|0}return}c=e;h=0;j=a[e+6>>0]|0;while(1){e=(d[c>>0]|0)+g|0;a[c>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+1|0;i=(d[e>>0]|0)+g|0;a[e>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+2|0;e=(d[i>>0]|0)+g|0;a[i>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+3|0;i=(d[e>>0]|0)+g|0;a[e>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+4|0;e=(d[i>>0]|0)+g|0;a[i>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+5|0;i=(d[e>>0]|0)+g|0;a[e>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=(j&255)+g|0;a[c+6>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+7|0;e=(d[i>>0]|0)+g|0;j=(e|0)>255?-1:((e|0)>0?e:0)&255;a[i>>0]=j;h=h+1|0;if((h|0)==8)break;else c=c+f|0}return}function ae(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=b[a>>1]|0;e=b[a+2>>1]|0;f=b[a+4>>1]|0;g=b[a+6>>1]|0;a=d<<16>>16;h=f<<16>>16;i=g<<16>>16;if(!((e|d|f|g)<<16>>16)){g=c;f=g;b[f>>1]=0;b[f+2>>1]=0>>>16;f=g+4|0;b[f>>1]=0;b[f+2>>1]=0>>>16;return}else{f=(e<<16>>16)*13377|0;e=(h*15212|0)+(a*5283|0)+(i*9929|0)|0;g=(S(h,-5283)|0)+(a*9929|0)+(S(i,-15212)|0)|0;d=f+8192|0;b[c>>1]=(d+e|0)>>>14;b[c+2>>1]=(d+g|0)>>>14;b[c+4>>1]=(((a-h+i|0)*13377|0)+8192|0)>>>14;b[c+6>>1]=(8192-f+g+e|0)>>>14;return}}function be(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b[a+14>>1]|0;e=d<<16>>16;f=b[a>>1]|0;g=f<<16>>16;h=b[a+10>>1]|0;i=h<<16>>16;j=b[a+4>>1]|0;k=j<<16>>16;l=b[a+6>>1]|0;m=l<<16>>16;n=b[a+8>>1]|0;o=n<<16>>16;p=b[a+2>>1]|0;q=p<<16>>16;r=b[a+12>>1]|0;a=r<<16>>16;if(!((f|d|h|j|l|n|p|r)<<16>>16)){b[c>>1]=0;b[c+2>>1]=0;b[c+4>>1]=0;b[c+6>>1]=0;b[c+8>>1]=0;b[c+10>>1]=0;b[c+12>>1]=0;b[c+14>>1]=0;return}else{r=(o*12665|0)+(m*10394|0)|0;p=(S(o,-10394)|0)+(m*12665|0)|0;m=(a*15679|0)+(q*4756|0)|0;o=(S(a,-4756)|0)+(q*15679|0)|0;q=(g*1606|0)+(e*16305|0)+8192|0;a=q+r>>14;n=(S(g,-16305)|0)+(e*1606|0)+8192|0;e=n+p>>14;g=(k*7723|0)+(i*14449|0)+8192|0;l=g+m>>14;j=(S(k,-14449)|0)+(i*7723|0)+8192|0;i=j+o>>14;k=q-r>>14;r=n-p>>14;p=g-m>>14;m=j-o>>14;o=(S(p,-6270)|0)+(m*15137|0)|0;j=(p*15137|0)+(m*6270|0)|0;m=a-l|0;p=e-i|0;g=(k*15137|0)+(r*6270|0)+8192|0;n=(k*6270|0)+(S(r,-15137)|0)+8192|0;r=g-o>>14;k=n-j>>14;b[c>>1]=l+a;b[c+2>>1]=0-((g+o|0)>>>14);b[c+4>>1]=(((r+k|0)*11585|0)+8192|0)>>>14;b[c+6>>1]=0-((((m+p|0)*11585|0)+8192|0)>>>14);b[c+8>>1]=(((m-p|0)*11585|0)+8192|0)>>>14;b[c+10>>1]=0-((((r-k|0)*11585|0)+8192|0)>>>14);b[c+12>>1]=(n+j|0)>>>14;b[c+14>>1]=0-(e+i);return}}function ce(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=l;l=l+160|0;h=g+32|0;i=g+16|0;j=g;k=h;m=k+128|0;do{b[k>>1]=0;k=k+2|0}while((k|0)<(m|0));Zd(c,h);Zd(c+16|0,h+16|0);Zd(c+32|0,h+32|0);Zd(c+48|0,h+48|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=j+2|0;s=f<<1;t=j+4|0;u=f*3|0;v=j+6|0;w=f<<2;x=j+8|0;y=f*5|0;z=j+10|0;A=f*6|0;B=j+12|0;C=f*7|0;D=j+14|0;E=0;do{b[i>>1]=b[h+(E<<1)>>1]|0;b[c>>1]=b[h+(E+8<<1)>>1]|0;b[k>>1]=b[h+(E+16<<1)>>1]|0;b[m>>1]=b[h+(E+24<<1)>>1]|0;b[n>>1]=b[h+(E+32<<1)>>1]|0;b[o>>1]=b[h+(E+40<<1)>>1]|0;b[p>>1]=b[h+(E+48<<1)>>1]|0;b[q>>1]=b[h+(E+56<<1)>>1]|0;Zd(i,j);F=e+E|0;G=((b[j>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(E+f)|0;F=((b[r>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(s+E)|0;G=((b[t>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(u+E)|0;F=((b[v>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(w+E)|0;G=((b[x>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(y+E)|0;F=((b[z>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(A+E)|0;G=((b[B>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(C+E)|0;F=((b[D>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;E=E+1|0}while((E|0)!=8);l=g;return}function de(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=b[a+2>>1]|0;e=b[a+30>>1]|0;f=b[a+18>>1]|0;g=b[a+14>>1]|0;h=b[a+10>>1]|0;i=b[a+22>>1]|0;j=b[a+26>>1]|0;k=b[a+6>>1]|0;l=b[a+4>>1]|0;m=b[a+28>>1]|0;n=b[a+20>>1]|0;o=b[a+12>>1]|0;p=((d*1606|0)+8192+(S(e,-16305)|0)|0)>>>14<<16>>16;q=((f*12665|0)+8192+(S(g,-10394)|0)|0)>>>14<<16>>16;r=((h*7723|0)+8192+(S(i,-14449)|0)|0)>>>14<<16>>16;s=((j*15679|0)+8192+(S(k,-4756)|0)|0)>>>14<<16>>16;t=((j*4756|0)+8192+(k*15679|0)|0)>>>14<<16>>16;k=((h*14449|0)+8192+(i*7723|0)|0)>>>14<<16>>16;i=((f*10394|0)+8192+(g*12665|0)|0)>>>14<<16>>16;g=((d*16305|0)+8192+(e*1606|0)|0)>>>14<<16>>16;e=b[a>>1]|0;d=b[a+16>>1]|0;f=b[a+8>>1]|0;h=b[a+24>>1]|0;a=((l*3196|0)+8192+(S(m,-16069)|0)|0)>>>14<<16>>16;j=((n*13623|0)+8192+(S(o,-9102)|0)|0)>>>14<<16>>16;u=((n*9102|0)+8192+(o*13623|0)|0)>>>14<<16>>16;o=((l*16069|0)+8192+(m*3196|0)|0)>>>14<<16>>16;m=p-q<<16>>16;l=g-i<<16>>16;n=s-r<<16>>16;v=t-k<<16>>16;w=(((d+e|0)*11585|0)+8192|0)>>>14<<16>>16;x=((f*15137|0)+8192+(h*6270|0)|0)>>>14<<16>>16;y=(((e-d|0)*11585|0)+8192|0)>>>14<<16>>16;d=((f*6270|0)+8192+(S(h,-15137)|0)|0)>>>14<<16>>16;h=o-u<<16>>16;f=a-j<<16>>16;e=p+q<<16>>16;q=r+s<<16>>16;s=((l*6270|0)+8192+(S(m,-15137)|0)|0)>>>14<<16>>16;r=((S(v,-15137)|0)+8192+(S(n,-6270)|0)|0)>>>14<<16>>16;p=k+t<<16>>16;t=g+i<<16>>16;i=((v*6270|0)+8192+(S(n,-15137)|0)|0)>>>14<<16>>16;n=((l*15137|0)+8192+(m*6270|0)|0)>>>14<<16>>16;m=x+w<<16>>16;l=o+u<<16>>16;u=d+y<<16>>16;o=(((f+h|0)*11585|0)+8192|0)>>>14<<16>>16;v=y-d<<16>>16;d=(((h-f|0)*11585|0)+8192|0)>>>14<<16>>16;f=w-x<<16>>16;x=a+j<<16>>16;j=s-r<<16>>16;a=n-i<<16>>16;w=e-q<<16>>16;h=t-p<<16>>16;y=l+m<<16>>16;g=t+p<<16>>16;b[c>>1]=g+y;p=o+u<<16>>16;t=n+i<<16>>16;b[c+2>>1]=t+p;i=d+v<<16>>16;n=(((j+a|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+4>>1]=n+i;k=x+f<<16>>16;z=(((w+h|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+6>>1]=z+k;A=f-x<<16>>16;x=(((h-w|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+8>>1]=x+A;w=v-d<<16>>16;d=(((a-j|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+10>>1]=d+w;j=u-o<<16>>16;o=s+r<<16>>16;b[c+12>>1]=o+j;r=m-l<<16>>16;l=e+q<<16>>16;b[c+14>>1]=l+r;b[c+16>>1]=r-l;b[c+18>>1]=j-o;b[c+20>>1]=w-d;b[c+22>>1]=A-x;b[c+24>>1]=k-z;b[c+26>>1]=i-n;b[c+28>>1]=p-t;b[c+30>>1]=y-g;return}function ee(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=l;l=l+576|0;h=g+64|0;i=g+32|0;j=g;de(c,h);de(c+32|0,h+32|0);de(c+64|0,h+64|0);de(c+96|0,h+96|0);de(c+128|0,h+128|0);de(c+160|0,h+160|0);de(c+192|0,h+192|0);de(c+224|0,h+224|0);de(c+256|0,h+256|0);de(c+288|0,h+288|0);de(c+320|0,h+320|0);de(c+352|0,h+352|0);de(c+384|0,h+384|0);de(c+416|0,h+416|0);de(c+448|0,h+448|0);de(c+480|0,h+480|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=i+16|0;s=i+18|0;t=i+20|0;u=i+22|0;v=i+24|0;w=i+26|0;x=i+28|0;y=i+30|0;z=0;do{b[i>>1]=b[h+(z<<1)>>1]|0;b[c>>1]=b[h+(z+16<<1)>>1]|0;b[k>>1]=b[h+(z+32<<1)>>1]|0;b[m>>1]=b[h+(z+48<<1)>>1]|0;b[n>>1]=b[h+(z+64<<1)>>1]|0;b[o>>1]=b[h+(z+80<<1)>>1]|0;b[p>>1]=b[h+(z+96<<1)>>1]|0;b[q>>1]=b[h+(z+112<<1)>>1]|0;b[r>>1]=b[h+(z+128<<1)>>1]|0;b[s>>1]=b[h+(z+144<<1)>>1]|0;b[t>>1]=b[h+(z+160<<1)>>1]|0;b[u>>1]=b[h+(z+176<<1)>>1]|0;b[v>>1]=b[h+(z+192<<1)>>1]|0;b[w>>1]=b[h+(z+208<<1)>>1]|0;b[x>>1]=b[h+(z+224<<1)>>1]|0;b[y>>1]=b[h+(z+240<<1)>>1]|0;de(i,j);A=0;do{B=e+((S(A,f)|0)+z)|0;C=((b[j+(A<<1)>>1]|0)+32>>6)+(d[B>>0]|0)|0;a[B>>0]=(C|0)>255?-1:((C|0)>0?C:0)&255;A=A+1|0}while((A|0)!=16);z=z+1|0}while((z|0)!=16);l=g;return}function fe(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=b[a+30>>1]|0;e=d<<16>>16;f=b[a>>1]|0;g=f<<16>>16;h=b[a+26>>1]|0;i=h<<16>>16;j=b[a+4>>1]|0;k=j<<16>>16;l=b[a+22>>1]|0;m=l<<16>>16;n=b[a+8>>1]|0;o=n<<16>>16;p=b[a+18>>1]|0;q=p<<16>>16;r=b[a+12>>1]|0;s=r<<16>>16;t=b[a+14>>1]|0;u=t<<16>>16;v=b[a+16>>1]|0;w=v<<16>>16;x=b[a+10>>1]|0;y=x<<16>>16;z=b[a+20>>1]|0;A=z<<16>>16;B=b[a+6>>1]|0;C=B<<16>>16;D=b[a+24>>1]|0;E=D<<16>>16;F=b[a+2>>1]|0;G=F<<16>>16;H=b[a+28>>1]|0;a=H<<16>>16;if(!((f|d|h|j|l|n|p|r|t|v|x|z|B|D|F|H)<<16>>16)){H=c;F=H+32|0;do{b[H>>1]=0;H=H+2|0}while((H|0)<(F|0));return}else{H=(w*12140|0)+(u*11003|0)|0;F=(S(w,-11003)|0)+(u*12140|0)|0;u=(A*14053|0)+(y*8423|0)|0;w=(S(A,-8423)|0)+(y*14053|0)|0;y=(E*15426|0)+(C*5520|0)|0;A=(S(E,-5520)|0)+(C*15426|0)|0;C=(a*16207|0)+(G*2404|0)|0;E=(S(a,-2404)|0)+(G*16207|0)|0;G=(g*804|0)+(e*16364|0)+8192|0;a=G+H>>14;D=(S(g,-16364)|0)+(e*804|0)+8192|0;e=D+F>>14;g=(k*3981|0)+(i*15893|0)+8192|0;B=g+u>>14;z=(S(k,-15893)|0)+(i*3981|0)+8192|0;i=z+w>>14;k=(o*7005|0)+(m*14811|0)+8192|0;x=k+y>>14;v=(S(o,-14811)|0)+(m*7005|0)+8192|0;m=v+A>>14;o=(s*9760|0)+(q*13160|0)+8192|0;t=o+C>>14;r=(S(s,-13160)|0)+(q*9760|0)+8192|0;q=r+E>>14;s=G-H>>14;H=D-F>>14;F=g-u>>14;u=z-w>>14;w=k-y>>14;y=v-A>>14;A=o-C>>14;C=r-E>>14;E=(S(w,-3196)|0)+(y*16069|0)|0;r=(w*16069|0)+(y*3196|0)|0;y=(S(A,-13623)|0)+(C*9102|0)|0;w=(A*9102|0)+(C*13623|0)|0;C=x+a|0;A=m+e|0;o=t+B|0;v=q+i|0;k=a-x|0;x=e-m|0;m=B-t|0;t=i-q|0;q=(s*16069|0)+(H*3196|0)+8192|0;i=q+E>>14;B=(s*3196|0)+(S(H,-16069)|0)+8192|0;H=B+r>>14;s=(F*9102|0)+(u*13623|0)+8192|0;e=s+y>>14;a=(F*13623|0)+(S(u,-9102)|0)+8192|0;u=a+w>>14;F=q-E>>14;E=B-r>>14;r=s-y>>14;y=a-w>>14;w=(S(m,-6270)|0)+(t*15137|0)|0;a=(m*15137|0)+(t*6270|0)|0;t=(S(r,-6270)|0)+(y*15137|0)|0;m=(r*15137|0)+(y*6270|0)|0;y=C-o|0;r=A-v|0;s=(k*15137|0)+(x*6270|0)+8192|0;B=(k*6270|0)+(S(x,-15137)|0)+8192|0;x=s-w>>14;k=B-a>>14;q=i-e|0;z=H-u|0;g=(F*15137|0)+(E*6270|0)+8192|0;D=(F*6270|0)+(S(E,-15137)|0)+8192|0;E=g-t>>14;F=D-m>>14;G=((S(y+r|0,-11585)|0)+8192|0)>>>14;p=((S(E+F|0,-11585)|0)+8192|0)>>>14;b[c>>1]=o+C;b[c+2>>1]=0-(i+e);b[c+4>>1]=(g+t|0)>>>14;b[c+6>>1]=0-((s+w|0)>>>14);b[c+8>>1]=(((x+k|0)*11585|0)+8192|0)>>>14;b[c+10>>1]=p;b[c+12>>1]=(((q+z|0)*11585|0)+8192|0)>>>14;b[c+14>>1]=G;b[c+16>>1]=(((y-r|0)*11585|0)+8192|0)>>>14;b[c+18>>1]=(((z-q|0)*11585|0)+8192|0)>>>14;b[c+20>>1]=(((E-F|0)*11585|0)+8192|0)>>>14;b[c+22>>1]=(((k-x|0)*11585|0)+8192|0)>>>14;b[c+24>>1]=(B+a|0)>>>14;b[c+26>>1]=0-((D+m|0)>>>14);b[c+28>>1]=u+H;b[c+30>>1]=0-(A+v);return}}function ge(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=l;l=l+576|0;h=g+64|0;i=g+32|0;j=g;Jj(h|0,0,512)|0;de(c,h);de(c+32|0,h+32|0);de(c+64|0,h+64|0);de(c+96|0,h+96|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=i+16|0;s=i+18|0;t=i+20|0;u=i+22|0;v=i+24|0;w=i+26|0;x=i+28|0;y=i+30|0;z=0;do{b[i>>1]=b[h+(z<<1)>>1]|0;b[c>>1]=b[h+(z+16<<1)>>1]|0;b[k>>1]=b[h+(z+32<<1)>>1]|0;b[m>>1]=b[h+(z+48<<1)>>1]|0;b[n>>1]=b[h+(z+64<<1)>>1]|0;b[o>>1]=b[h+(z+80<<1)>>1]|0;b[p>>1]=b[h+(z+96<<1)>>1]|0;b[q>>1]=b[h+(z+112<<1)>>1]|0;b[r>>1]=b[h+(z+128<<1)>>1]|0;b[s>>1]=b[h+(z+144<<1)>>1]|0;b[t>>1]=b[h+(z+160<<1)>>1]|0;b[u>>1]=b[h+(z+176<<1)>>1]|0;b[v>>1]=b[h+(z+192<<1)>>1]|0;b[w>>1]=b[h+(z+208<<1)>>1]|0;b[x>>1]=b[h+(z+224<<1)>>1]|0;b[y>>1]=b[h+(z+240<<1)>>1]|0;de(i,j);A=0;do{B=e+((S(A,f)|0)+z)|0;C=((b[j+(A<<1)>>1]|0)+32>>6)+(d[B>>0]|0)|0;a[B>>0]=(C|0)>255?-1:((C|0)>0?C:0)&255;A=A+1|0}while((A|0)!=16);z=z+1|0}while((z|0)!=16);l=g;return}function he(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+32>>6;c=e;e=0;while(1){h=0;do{i=c+h|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;h=h+1|0}while((h|0)!=16);e=e+1|0;if((e|0)==16)break;else c=c+f|0}return}\nfunction Hg(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,Ab=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0;i=l;l=l+3440|0;j=i+240|0;k=i+232|0;m=i+224|0;n=i+216|0;o=i+208|0;p=i+200|0;q=i+192|0;r=i+184|0;s=i+176|0;t=i+168|0;u=i+160|0;v=i+152|0;w=i+144|0;x=i+136|0;y=i+128|0;z=i+120|0;A=i+112|0;B=i+104|0;C=i+96|0;D=i+88|0;E=i+80|0;F=i+72|0;G=i+64|0;H=i+56|0;I=i+48|0;J=i+40|0;K=i+32|0;L=i+24|0;M=i+16|0;N=i+280|0;O=i+264|0;P=i+244|0;Q=i+3352|0;R=e+432|0;c[P+8>>2]=0;c[P+16>>2]=5;c[P+12>>2]=R;S=e+18712|0;T=c[S>>2]|0;U=g;W=U-f|0;X=(W|0)<80?W:80;if(!T){Y=f;Z=g}else{Ib[T&63](c[e+18716>>2]|0,f,Q,X);Y=Q;Z=Q+X|0}c[P>>2]=Y;c[P+4>>2]=Z;Z=e+17836|0;Y=c[Z>>2]|0;X=e+996|0;Q=e+992|0;c[Q>>2]=c[X>>2];T=e+1012|0;W=e+1013|0;a[W>>0]=a[T>>0]|0;if((kc(P,2)|0)!=2)Ub(R,5,29939,i);_=jc(P)|0;$=(jc(P)|0)<<1|_;if(($|0)>2)aa=(jc(P)|0)+$|0;else aa=$;$=e+17780|0;c[$>>2]=aa;if(aa>>>0>1)Ub(R,5,29960,i+8|0);aa=jc(P)|0;c[e+1008>>2]=aa;do if(aa){_=c[e+732+((kc(P,3)|0)<<2)>>2]|0;xe(Y);if(!((_|0)>=0?(c[Y+40+(_*160|0)>>2]|0)>=1:0)){ye(Y);c[M>>2]=_;Ub(R,5,29990,M)}ba=e+988|0;ca=c[ba>>2]|0;if((ca|0)>-1?(da=Y+40+(ca*160|0)|0,ca=c[da>>2]|0,(ca|0)>0):0)c[da>>2]=ca+-1;c[ba>>2]=_;ca=Y+40+(_*160|0)|0;c[ca>>2]=(c[ca>>2]|0)+1;ye(Y);c[e+17860>>2]=0;c[e+4372>>2]=0;c[e+1e3>>2]=1;if(!(c[e+17864>>2]|0)){ea=ba;fa=0}else{c[e+764>>2]=c[e+732>>2];c[e+768>>2]=c[e+736>>2];c[e+772>>2]=c[e+740>>2];c[e+776>>2]=c[e+744>>2];c[e+780>>2]=c[e+748>>2];c[e+784>>2]=c[e+752>>2];c[e+788>>2]=c[e+756>>2];c[e+792>>2]=c[e+760>>2];ea=ba;fa=0}}else{c[X>>2]=jc(P)|0;ba=e+1e3|0;c[ba>>2]=jc(P)|0;ca=jc(P)|0;_=e+17792|0;c[_>>2]=ca;do if(!(c[X>>2]|0)){if(!(((kc(P,8)|0)==73?(kc(P,8)|0)==131:0)?(kc(P,8)|0)==66:0))Ub(R,5,30033,L);Jg(R,P);c[e+17860>>2]=255;c[e+796>>2]=-1;c[e+800>>2]=0;c[e+860>>2]=-1;c[e+864>>2]=0;c[e+924>>2]=-1;c[e+928>>2]=0;Kg(R,P);da=e+18728|0;if(!(c[da>>2]|0))ga=0;else{ha=e+732|0;c[ha>>2]=-1;c[ha+4>>2]=-1;c[ha+8>>2]=-1;c[ha+12>>2]=-1;c[ha+16>>2]=-1;c[ha+20>>2]=-1;c[ha+24>>2]=-1;c[ha+28>>2]=-1;c[da>>2]=0;ga=0}}else{if(!(c[ba>>2]|0)){da=jc(P)|0;ia=c[_>>2]|0;ja=da}else{ia=ca;ja=0}da=ja&255;a[T>>0]=da;if(!ia){ha=kc(P,2)|0;ka=a[T>>0]|0;la=ha}else{ka=da;la=0}c[e+1020>>2]=la;if(ka<<24>>24){if(!(((kc(P,8)|0)==73?(kc(P,8)|0)==131:0)?(kc(P,8)|0)==66:0))Ub(R,5,30033,K);if(!(c[$>>2]|0)){c[e+680>>2]=1;c[e+684>>2]=0;c[e+712>>2]=1;c[e+716>>2]=1;c[e+17784>>2]=8}else Jg(R,P);c[e+17860>>2]=kc(P,8)|0;Kg(R,P);da=e+18728|0;if(!(c[da>>2]|0)){ga=0;break}ha=e+732|0;c[ha>>2]=-1;c[ha+4>>2]=-1;c[ha+8>>2]=-1;c[ha+12>>2]=-1;c[ha+16>>2]=-1;c[ha+20>>2]=-1;c[ha+24>>2]=-1;c[ha+28>>2]=-1;c[da>>2]=0;ga=0;break}da=e+18728|0;if((c[da>>2]|0)==1)ga=1;else{c[e+17860>>2]=kc(P,8)|0;ha=c[e+732+((kc(P,3)|0)<<2)>>2]|0;ma=e+796|0;c[ma>>2]=ha;na=e+800|0;c[na>>2]=Y+40+(ha*160|0)+28;c[e+4360>>2]=jc(P)|0;ha=c[e+732+((kc(P,3)|0)<<2)>>2]|0;oa=e+860|0;c[oa>>2]=ha;pa=e+864|0;c[pa>>2]=Y+40+(ha*160|0)+28;c[e+4364>>2]=jc(P)|0;ha=c[e+732+((kc(P,3)|0)<<2)>>2]|0;qa=e+924|0;c[qa>>2]=ha;ra=e+928|0;c[ra>>2]=Y+40+(ha*160|0)+28;c[e+4368>>2]=jc(P)|0;ha=c[Z>>2]|0;if(jc(P)|0)if((c[ma>>2]|0)==-1){Ub(R,7,30057,J);sa=44}else{ta=0;sa=42}else sa=44;do if((sa|0)==44){if(jc(P)|0){if((c[oa>>2]|0)!=-1){ta=1;sa=42;break}Ub(R,7,30057,C)}if(jc(P)|0){if((c[qa>>2]|0)!=-1){ta=2;sa=42;break}Ub(R,7,30057,B)}ua=(kc(P,16)|0)+1|0;va=(kc(P,16)|0)+1|0;wa=ua}while(0);if((sa|0)==42){ua=c[e+796+(ta<<6)+4>>2]|0;va=c[ua+12>>2]|0;wa=c[ua+8>>2]|0}if((wa|0)<1|(va|0)<1)Ub(R,7,30085,I);ua=wa<<1;xa=va<<1;ya=c[ma>>2]|0;if((ya|0)==-1)za=0;else{Aa=c[na>>2]|0;Ba=c[Aa+8>>2]|0;Ca=c[Aa+12>>2]|0;za=(Ca<<4|0)>=(va|0)&(((Ba<<4|0)<(wa|0)|((ua|0)<(Ba|0)|(xa|0)<(Ca|0)))^1)}if((c[oa>>2]|0)==-1)Da=0;else{Ca=c[pa>>2]|0;Ba=c[Ca+8>>2]|0;Aa=c[Ca+12>>2]|0;Da=(Aa<<4|0)>=(va|0)&(((Ba<<4|0)<(wa|0)|((ua|0)<(Ba|0)|(xa|0)<(Aa|0)))^1)}if((c[qa>>2]|0)==-1)Ea=0;else{Aa=c[ra>>2]|0;Ba=c[Aa+8>>2]|0;Ca=c[Aa+12>>2]|0;Ea=(Ca<<4|0)>=(va|0)&(((Ba<<4|0)<(wa|0)|((ua|0)<(Ba|0)|(xa|0)<(Ca|0)))^1)}if(za|Da|Ea)Fa=ya;else{Ub(R,7,30104,H);Fa=c[ma>>2]|0}ya=e+17784|0;Ca=e+712|0;xa=e+716|0;if(!((Fa|0)!=-1?(Ba=c[na>>2]|0,((c[Ba+92>>2]|0)==(c[ya>>2]|0)?(c[Ba+84>>2]|0)==(c[Ca>>2]|0):0)&(c[Ba+88>>2]|0)==(c[xa>>2]|0)):0))Ub(R,7,30138,G);if(!((c[oa>>2]|0)!=-1?(Ba=c[pa>>2]|0,((c[Ba+92>>2]|0)==(c[ya>>2]|0)?(c[Ba+84>>2]|0)==(c[Ca>>2]|0):0)&(c[Ba+88>>2]|0)==(c[xa>>2]|0)):0))Ub(R,7,30138,E);if(!((c[qa>>2]|0)!=-1?(Ba=c[ra>>2]|0,((c[Ba+92>>2]|0)==(c[ya>>2]|0)?(c[Ba+84>>2]|0)==(c[Ca>>2]|0):0)&(c[Ba+88>>2]|0)==(c[xa>>2]|0)):0))Ub(R,7,30138,D);Lg(R,wa,va);Ba=e+688|0;ua=e+696|0;c[ua>>2]=c[Ba>>2];Aa=e+692|0;Ga=e+700|0;c[Ga>>2]=c[Aa>>2];if(jc(P)|0){c[ua>>2]=(kc(P,16)|0)+1;c[Ga>>2]=(kc(P,16)|0)+1}xe(ha);Ha=e+988|0;Ia=c[Ha>>2]|0;if(_b((c[Z>>2]|0)+40+(Ia*160|0)+28|0,c[Ba>>2]|0,c[Aa>>2]|0,c[Ca>>2]|0,c[xa>>2]|0,32,c[e+17808>>2]|0,ha+40+(Ia*160|0)+16|0,c[ha+32>>2]|0,c[ha+28>>2]|0)|0){ye(ha);Ub(R,2,30185,F)}ye(ha);Ia=c[Ha>>2]|0;c[ha+40+(Ia*160|0)+112>>2]=c[Ca>>2];c[ha+40+(Ia*160|0)+116>>2]=c[xa>>2];c[ha+40+(Ia*160|0)+120>>2]=c[ya>>2];c[ha+40+(Ia*160|0)+124>>2]=c[e+680>>2];c[ha+40+(Ia*160|0)+128>>2]=c[e+684>>2];c[ha+40+(Ia*160|0)+132>>2]=c[ua>>2];c[ha+40+(Ia*160|0)+136>>2]=c[Ga>>2];c[e+1016>>2]=jc(P)|0;if(!(jc(P)|0))Ja=a[30217+(kc(P,2)|0)>>0]|0;else Ja=4;a[e+1212>>0]=Ja;Ga=c[na>>2]|0;kf(e+804|0,c[Ga+8>>2]|0,c[Ga+12>>2]|0,c[Ba>>2]|0,c[Aa>>2]|0);Ga=c[pa>>2]|0;kf(e+868|0,c[Ga+8>>2]|0,c[Ga+12>>2]|0,c[Ba>>2]|0,c[Aa>>2]|0);Ga=c[ra>>2]|0;kf(e+932|0,c[Ga+8>>2]|0,c[Ga+12>>2]|0,c[Ba>>2]|0,c[Aa>>2]|0);ga=c[da>>2]|0}}while(0);ca=e+988|0;ba=c[ca>>2]|0;Aa=c[Z>>2]|0;c[Aa+40+(ba*160|0)+124>>2]=c[e+680>>2];c[Aa+40+(ba*160|0)+128>>2]=c[e+684>>2];c[Aa+40+(ba*160|0)+132>>2]=c[e+696>>2];c[Aa+40+(ba*160|0)+136>>2]=c[e+700>>2];if(ga|0)Ub(R,7,30221,A);if(!(c[_>>2]|0)){c[e+4352>>2]=jc(P)|0;ba=jc(P)|0;c[e+17796>>2]=ba;if(!ba)Jj(e+4552|0,0,13224)|0}else{c[e+4352>>2]=0;c[e+17796>>2]=1}c[e+4548>>2]=kc(P,2)|0;xe(Y);ba=c[e+17860>>2]|0;if(ba){Aa=ba;ba=0;do{if(!(Aa&1)){Ba=c[e+732+(ba<<2)>>2]|0;c[e+764+(ba<<2)>>2]=Ba;Ka=Ba}else{c[e+764+(ba<<2)>>2]=c[ca>>2];Ba=Y+40+((c[ca>>2]|0)*160|0)|0;c[Ba>>2]=(c[Ba>>2]|0)+1;Ka=c[e+732+(ba<<2)>>2]|0}Ba=Y+40+(Ka*160|0)|0;if((Ka|0)>-1)c[Ba>>2]=(c[Ba>>2]|0)+1;ba=ba+1|0;Aa=Aa>>1}while((Aa|0)!=0);if((ba|0)<8){La=ba;sa=91}}else{La=0;sa=91}if((sa|0)==91)while(1){sa=0;Aa=c[e+732+(La<<2)>>2]|0;c[e+764+(La<<2)>>2]=Aa;Ba=Y+40+(Aa*160|0)|0;if((Aa|0)>-1)c[Ba>>2]=(c[Ba>>2]|0)+1;La=La+1|0;if((La|0)==8)break;else sa=91}ye(Y);c[e+18732>>2]=1;if(!(((c[X>>2]|0)!=0?(a[T>>0]|0)==0:0)?!(c[_>>2]|0):0))Le(R);c[e+4372>>2]=kc(P,6)|0;c[e+4380>>2]=kc(P,3)|0;ba=e+4389|0;a[ba>>0]=0;Ba=(jc(P)|0)&255;a[e+4388>>0]=Ba;if(Ba<<24>>24?(Ba=(jc(P)|0)&255,a[ba>>0]=Ba,Ba<<24>>24):0){if(jc(P)|0)a[e+4390>>0]=lc(P,6)|0;if(jc(P)|0)a[e+4391>>0]=lc(P,6)|0;if(jc(P)|0)a[e+4392>>0]=lc(P,6)|0;if(jc(P)|0)a[e+4393>>0]=lc(P,6)|0;if(jc(P)|0)a[e+4398>>0]=lc(P,6)|0;if(jc(P)|0)a[e+4399>>0]=lc(P,6)|0}Ba=e+1052|0;c[Ba>>2]=kc(P,8)|0;if(!(jc(P)|0))Ma=0;else Ma=lc(P,4)|0;ba=e+1056|0;c[ba>>2]=Ma;if(!(jc(P)|0))Na=0;else Na=lc(P,4)|0;Aa=e+1060|0;c[Aa>>2]=Na;if(!(jc(P)|0))Oa=0;else Oa=lc(P,4)|0;Ga=e+1064|0;c[Ga>>2]=Oa;Ia=e+17784|0;c[e+17788>>2]=c[Ia>>2];if((c[Ba>>2]|0)==0?(c[ba>>2]|0)==0:0)Pa=(c[Aa>>2]|Oa|0)==0;else Pa=0;c[e+420>>2]=Pa&1;ua=e+4412|0;ya=e+4413|0;a[ya>>0]=0;xa=e+4414|0;a[xa>>0]=0;Ca=(jc(P)|0)&255;a[ua>>0]=Ca;do if(!(Ca<<24>>24))sa=156;else{Ha=(jc(P)|0)&255;a[ya>>0]=Ha;do if(Ha<<24>>24){if(!(jc(P)|0))Qa=-1;else Qa=(kc(P,8)|0)&255;a[e+4417>>0]=Qa;if(!(jc(P)|0))Ra=-1;else Ra=(kc(P,8)|0)&255;a[e+4418>>0]=Ra;if(!(jc(P)|0))Sa=-1;else Sa=(kc(P,8)|0)&255;a[e+4419>>0]=Sa;if(!(jc(P)|0))Ta=-1;else Ta=(kc(P,8)|0)&255;a[e+4420>>0]=Ta;if(!(jc(P)|0))Ua=-1;else Ua=(kc(P,8)|0)&255;a[e+4421>>0]=Ua;if(!(jc(P)|0))Va=-1;else Va=(kc(P,8)|0)&255;a[e+4422>>0]=Va;if(!(jc(P)|0))Wa=-1;else Wa=(kc(P,8)|0)&255;a[e+4423>>0]=Wa;Xa=(jc(P)|0)&255;a[e+4416>>0]=Xa;if(!(Xa<<24>>24)){Xa=e+4424|0;a[Xa>>0]=255;a[Xa+1>>0]=255;a[Xa+2>>0]=255;break}if(!(jc(P)|0))Ya=-1;else Ya=(kc(P,8)|0)&255;a[e+4424>>0]=Ya;if(!(jc(P)|0))Za=-1;else Za=(kc(P,8)|0)&255;a[e+4425>>0]=Za;if(!(jc(P)|0))_a=-1;else _a=(kc(P,8)|0)&255;a[e+4426>>0]=_a}while(0);Ha=(jc(P)|0)&255;a[xa>>0]=Ha;if(Ha<<24>>24){a[e+4415>>0]=jc(P)|0;of(ua);Ha=0;do{da=0;do{do if(!(jc(P)|0))$a=0;else{pf(ua,Ha,da);ra=qf(da)|0;pa=((V(ra|0)|0)^31)+1|0;na=kc(P,(ra|0)==0?0:pa)|0;pa=(na|0)>(ra|0)?ra:na;if(!(rf(da)|0)){$a=pa;break}na=(jc(P)|0)!=0;$a=na?0-pa|0:pa}while(0);sf(ua,Ha,da,$a);da=da+1|0}while((da|0)!=4);Ha=Ha+1|0}while((Ha|0)!=8)}if(!(a[ua>>0]|0)){sa=156;break}else ab=0;do{Ha=Rf(ua,ab,c[Ba>>2]|0)|0;b[e+1068+(ab<<2)>>1]=Pf(Ha,c[ba>>2]|0,c[Ia>>2]|0)|0;b[e+1068+(ab<<2)+2>>1]=Qf(Ha,0,c[Ia>>2]|0)|0;b[e+1100+(ab<<2)>>1]=Pf(Ha,c[Aa>>2]|0,c[Ia>>2]|0)|0;b[e+1100+(ab<<2)+2>>1]=Qf(Ha,c[Ga>>2]|0,c[Ia>>2]|0)|0;ab=ab+1|0}while((ab|0)!=8)}while(0);if((sa|0)==156){ua=c[Ba>>2]|0;b[e+1068>>1]=Pf(ua,c[ba>>2]|0,c[Ia>>2]|0)|0;b[e+1070>>1]=Qf(ua,0,c[Ia>>2]|0)|0;b[e+1100>>1]=Pf(ua,c[Aa>>2]|0,c[Ia>>2]|0)|0;b[e+1102>>1]=Qf(ua,c[Ga>>2]|0,c[Ia>>2]|0)|0}wf(c[e+1040>>2]|0,N,O);ua=c[N>>2]|0;xa=(c[O>>2]|0)-ua|0;ya=e+17800|0;c[ya>>2]=ua;a:do if(!xa)bb=ua;else{Ca=xa;while(1){Ca=Ca+-1|0;_=(jc(P)|0)==0;Ha=c[ya>>2]|0;if(_){bb=Ha;break a}_=Ha+1|0;c[ya>>2]=_;if(!Ca){bb=_;break}}}while(0);if((bb|0)>6)Ub(R,7,30281,z);ya=jc(P)|0;xa=e+17804|0;c[xa>>2]=ya;if(ya|0){ya=jc(P)|0;c[xa>>2]=(c[xa>>2]|0)+ya}ya=kc(P,16)|0;if(ya|0){ea=ca;fa=ya;break}Ub(R,7,30312,y);ea=ca;fa=0}while(0);y=e+17804|0;z=c[y>>2]|0;bb=1<<z;ab=e+17800|0;$a=c[ab>>2]|0;_a=1<<$a;Za=c[ea>>2]|0;Ya=c[Z>>2]|0;Wa=Ya+40+(Za*160|0)+28|0;c[e+344>>2]=Wa;if(!fa){c[h>>2]=f+((c[$>>2]|0)>>>0<3?1:2);l=i;return}$=f+(ic(P)|0)|0;if((U-$|0)>>>0<fa>>>0)Ub(R,7,30332,x);x=e+17792|0;if(((((c[x>>2]|0)==0?(c[e+688>>2]|0)==(c[e+704>>2]|0):0)?(c[e+692>>2]|0)==(c[e+708>>2]|0):0)?(a[W>>0]|0)==0:0)?(c[e+1004>>2]|0)!=0:0)cb=(c[Q>>2]|0)!=0;else cb=0;c[e+1180>>2]=cb&1;He(e,c[e+712>>2]|0,c[e+716>>2]|0);cb=e+4540|0;Q=e+4544|0;W=e+4548|0;Qj(c[cb>>2]|0,(c[Q>>2]|0)+((c[W>>2]|0)*2044|0)|0,2044)|0;P=c[cb>>2]|0;if(!(c[P+2040>>2]|0)){Ub(R,7,30374,w);db=c[cb>>2]|0}else db=P;P=e+424|0;c[P>>2]=0;w=e+18716|0;if(fc(N,$,fa,c[S>>2]|0,c[w>>2]|0)|0)Ub(e+432|0,2,30405,v);v=N+4|0;f=N+8|0;if(!(c[e+420>>2]|0)){Va=c[v>>2]|0;Ua=c[f>>2]|0;Ta=((Va<<7)+128|0)>>>8;if((Ua|0)<0){gc(N);eb=c[v>>2]|0;fb=c[f>>2]|0}else{eb=Va;fb=Ua}Ua=c[N>>2]|0;Va=Ta<<24;Sa=Ua>>>0<Va>>>0;Ra=Sa?Ta:eb-Ta|0;Ta=d[1280+Ra>>0]|0;eb=Ra<<Ta;Ra=Ua-(Sa?0:Va)<<Ta;Va=fb-Ta|0;c[N>>2]=Ra;c[f>>2]=Va;c[v>>2]=eb;Ta=((eb<<7)+128|0)>>>8;if((Va|0)<0){gc(N);gb=c[N>>2]|0;hb=c[v>>2]|0;ib=c[f>>2]|0}else{gb=Ra;hb=eb;ib=Va}Va=Ta<<24;eb=gb>>>0<Va>>>0;Ra=eb?Ta:hb-Ta|0;Ta=d[1280+Ra>>0]|0;hb=Ra<<Ta;Ra=gb-(eb?0:Va)<<Ta;Va=ib-Ta|0;c[N>>2]=Ra;c[f>>2]=Va;c[v>>2]=hb;Ta=(eb^1)&1|(Sa?0:2);if((Ta|0)==3){Sa=((hb<<7)+128|0)>>>8;if((Va|0)<0){gc(N);jb=c[N>>2]|0;kb=c[v>>2]|0;lb=c[f>>2]|0}else{jb=Ra;kb=hb;lb=Va}Va=Sa<<24;hb=jb>>>0<Va>>>0;Ra=hb?Sa:kb-Sa|0;Sa=d[1280+Ra>>0]|0;c[N>>2]=jb-(hb?0:Va)<<Sa;c[f>>2]=lb-Sa;c[v>>2]=Ra<<Sa;Sa=e+1048|0;c[Sa>>2]=hb?3:4;if(hb)mb=3;else{kh(N,db+1965|0);kh(N,db+1966|0);kh(N,db+1961|0);kh(N,db+1962|0);kh(N,db+1963|0);kh(N,db+1964|0);kh(N,db+1955|0);kh(N,db+1956|0);kh(N,db+1957|0);kh(N,db+1958|0);kh(N,db+1959|0);kh(N,db+1960|0);mb=c[Sa>>2]|0}}else{nb=Ta;sa=189}}else{nb=0;sa=189}if((sa|0)==189){c[e+1048>>2]=nb;mb=nb}nb=a[29150+mb>>0]|0;mb=0;do{Ta=mb&255;Sa=c[v>>2]|0;hb=((Sa<<7)+128|0)>>>8;Ra=c[f>>2]|0;if((Ra|0)<0){gc(N);ob=c[v>>2]|0;pb=c[f>>2]|0}else{ob=Sa;pb=Ra}Ra=c[N>>2]|0;Sa=hb<<24;lb=Ra>>>0<Sa>>>0;Va=lb?hb:ob-hb|0;hb=d[1280+Va>>0]|0;c[N>>2]=Ra-(lb?0:Sa)<<hb;c[f>>2]=pb-hb;c[v>>2]=Va<<hb;if(!lb){lb=0;do{hb=0;do{kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+1|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+2|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+3|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+4|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+5|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+6|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+7|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+8|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+18|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+19|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+20|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+21|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+22|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+23|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+24|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+25|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+26|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+27|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+28|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+29|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+30|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+31|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+32|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+33|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+34|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+35|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+36|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+37|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+38|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+39|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+40|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+41|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+42|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+43|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+44|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+45|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+46|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+47|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+48|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+49|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+50|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+51|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+52|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+53|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+54|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+55|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+56|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+57|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+58|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+59|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+60|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+61|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+62|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+63|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+64|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+65|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+66|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+67|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+68|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+69|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+70|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+71|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+72|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+73|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+74|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+75|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+76|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+77|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+78|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+79|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+80|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+81|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+82|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+83|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+84|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+85|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+86|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+87|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+88|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+89|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+90|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+91|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+92|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+93|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+94|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+95|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+96|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+97|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+98|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+99|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+100|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+101|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+102|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+103|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+104|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+105|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+106|0);kh(N,db+174+(Ta*432|0)+(lb*216|0)+(hb*108|0)+107|0);hb=hb+1|0}while((hb|0)!=2);lb=lb+1|0}while((lb|0)!=2)}mb=mb+1<<24>>24}while((mb&255)<=(nb&255));kh(N,db+1967|0);kh(N,db+1968|0);kh(N,db+1969|0);if(c[X>>2]|0?(a[T>>0]|0)==0:0){kh(N,db+1910|0);kh(N,db+1911|0);kh(N,db+1912|0);kh(N,db+1913|0);kh(N,db+1914|0);kh(N,db+1915|0);kh(N,db+1916|0);kh(N,db+1917|0);kh(N,db+1918|0);kh(N,db+1919|0);kh(N,db+1920|0);kh(N,db+1921|0);kh(N,db+1922|0);kh(N,db+1923|0);kh(N,db+1924|0);kh(N,db+1925|0);kh(N,db+1926|0);kh(N,db+1927|0);kh(N,db+1928|0);kh(N,db+1929|0);kh(N,db+1930|0);if((a[e+1212>>0]|0)==4){kh(N,db+1902|0);kh(N,db+1903|0);kh(N,db+1904|0);kh(N,db+1905|0);kh(N,db+1906|0);kh(N,db+1907|0);kh(N,db+1908|0);kh(N,db+1909|0)}kh(N,db+1931|0);kh(N,db+1932|0);kh(N,db+1933|0);kh(N,db+1934|0);nb=e+4360|0;mb=1;while(1){if((mb|0)>=3){sa=212;break}mb=mb+1|0;if((c[e+4356+(mb<<2)>>2]|0)!=(c[nb>>2]|0)){sa=206;break}}do if((sa|0)==206){mb=c[v>>2]|0;pb=((mb<<7)+128|0)>>>8;ob=c[f>>2]|0;if((ob|0)<0){gc(N);qb=c[v>>2]|0;rb=c[f>>2]|0}else{qb=mb;rb=ob}ob=c[N>>2]|0;mb=pb<<24;lb=ob>>>0<mb>>>0;Ta=lb?pb:qb-pb|0;pb=d[1280+Ta>>0]|0;ca=Ta<<pb;Ta=ob-(lb?0:mb)<<pb;mb=rb-pb|0;c[N>>2]=Ta;c[f>>2]=mb;c[v>>2]=ca;if(!lb){lb=((ca<<7)+128|0)>>>8;if((mb|0)<0){gc(N);sb=c[N>>2]|0;tb=c[v>>2]|0;ub=c[f>>2]|0}else{sb=Ta;tb=ca;ub=mb}mb=lb<<24;ca=sb>>>0<mb>>>0;Ta=ca?lb:tb-lb|0;lb=d[1280+Ta>>0]|0;c[N>>2]=sb-(ca?0:mb)<<lb;c[f>>2]=ub-lb;c[v>>2]=Ta<<lb;lb=e+4536|0;c[lb>>2]=ca?1:2;Ta=c[nb>>2]|0;do if((Ta|0)!=(c[e+4364>>2]|0)){mb=e+4532|0;if((Ta|0)==(c[e+4368>>2]|0)){a[mb>>0]=2;vb=1;wb=3;break}else{a[mb>>0]=1;vb=2;wb=3;break}}else{a[e+4532>>0]=3;vb=1;wb=2}while(0);a[e+4533>>0]=vb;a[e+4534>>0]=wb;Ta=c[cb>>2]|0;if(ca){xb=Ta;sa=220;break}kh(N,Ta+1935|0);kh(N,Ta+1936|0);kh(N,Ta+1937|0);kh(N,Ta+1938|0);kh(N,Ta+1939|0);if((c[lb>>2]|0)==1){xb=Ta;sa=220}else{yb=Ta;Ab=lb;sa=219}}else sa=212}while(0);if((sa|0)==212){wb=e+4536|0;c[wb>>2]=0;yb=c[cb>>2]|0;Ab=wb;sa=219}if((sa|0)==219){kh(N,yb+1940|0);kh(N,yb+1941|0);kh(N,yb+1942|0);kh(N,yb+1943|0);kh(N,yb+1944|0);kh(N,yb+1945|0);kh(N,yb+1946|0);kh(N,yb+1947|0);kh(N,yb+1948|0);kh(N,yb+1949|0);if(!(c[Ab>>2]|0))Cb=0;else{xb=yb;sa=220}}if((sa|0)==220){kh(N,xb+1950|0);kh(N,xb+1951|0);kh(N,xb+1952|0);kh(N,xb+1953|0);kh(N,xb+1954|0);Cb=0}do{kh(N,db+(Cb*9|0)|0);kh(N,db+(Cb*9|0)+1|0);kh(N,db+(Cb*9|0)+2|0);kh(N,db+(Cb*9|0)+3|0);kh(N,db+(Cb*9|0)+4|0);kh(N,db+(Cb*9|0)+5|0);kh(N,db+(Cb*9|0)+6|0);kh(N,db+(Cb*9|0)+7|0);kh(N,db+(Cb*9|0)+8|0);Cb=Cb+1|0}while((Cb|0)!=4);Db=0;do{kh(N,db+126+(Db*3|0)|0);kh(N,db+126+(Db*3|0)+1|0);kh(N,db+126+(Db*3|0)+2|0);Db=Db+1|0}while((Db|0)!=16);Db=c[e+1016>>2]|0;Mg(db+1970|0,3,N);Mg(db+1973|0,1,N);Mg(db+1974|0,10,N);Mg(db+1984|0,1,N);Mg(db+1985|0,10,N);Mg(db+2006|0,1,N);Mg(db+2007|0,10,N);Mg(db+2017|0,1,N);Mg(db+2018|0,10,N);Mg(db+1995|0,3,N);Mg(db+1998|0,3,N);Mg(db+2001|0,3,N);Mg(db+2028|0,3,N);Mg(db+2031|0,3,N);Mg(db+2034|0,3,N);if(Db|0){Mg(db+2004|0,1,N);Mg(db+2005|0,1,N);Mg(db+2037|0,1,N);Mg(db+2038|0,1,N)}}db=((c[f>>2]|0)+-33|0)>>>0<1073741791;c[Ya+40+(Za*160|0)+140>>2]=db&1;if(db)Ub(R,7,30439,u);u=e+4372|0;db=c[u>>2]|0;if(db|0?(c[e+17812>>2]|0)==0:0)yf(R,db);db=e+17864|0;if((c[db>>2]|0)!=0?(c[e+17796>>2]|0)!=0:0){Za=c[e+17872>>2]|0;Ya=c[Za+12>>2]|0;if(!(c[e+4352>>2]|0))Eb=0;else{Qj((c[Q>>2]|0)+((c[W>>2]|0)*2044|0)|0,c[cb>>2]|0,2044)|0;Eb=1}Vg(Za);f=c[e+17868>>2]|0;c[f+152>>2]=-1;c[f+156>>2]=-1;c[Ya+116>>2]=1;Xg(Za);Wg(Za);Fb=Eb}else Fb=0;Eb=e+17904|0;Za=c[Eb>>2]|0;Ya=bb<<$a;if((Za|0)!=0?(Ya|0)==(c[e+18680>>2]|0):0)Gb=e+18720|0;else{$a=e+18720|0;bb=c[$a>>2]|0;Yb(Za);Za=Vb(32,(((bb|0)>1?bb:0)+Ya|0)*16016|0)|0;c[Eb>>2]=Za;if(!Za)Ub(R,2,30486,t);c[e+18680>>2]=Ya;Gb=$a}$a=(_a|0)>1&((z|0)==0&(c[Gb>>2]|0)>1);z=$+fa|0;fa=we()|0;$=e+1040|0;_a=(c[$>>2]|0)+7&-8;Ya=c[ab>>2]|0;ab=1<<Ya;t=c[y>>2]|0;y=1<<t;do if($a){Za=c[Gb>>2]|0;bb=(Za|0)<(ab|0);f=bb?Za:ab;Db=e+18676|0;do if(!(c[Db>>2]|0)){Cb=Wb(Za*24|0)|0;xb=e+17900|0;c[xb>>2]=Cb;if(!Cb)Ub(R,2,30527,s);if((Za|0)<=0)break;Cb=Za+-1|0;yb=fa+4|0;Ab=0;do{wb=(c[xb>>2]|0)+(Ab*24|0)|0;c[Db>>2]=(c[Db>>2]|0)+1;zb[c[fa>>2]&31](wb);do if((Ab|0)<(Cb|0)){if(Bb[c[yb>>2]&7](wb)|0)break;Ub(R,1,30564,r)}while(0);Ab=Ab+1|0}while((Ab|0)!=(Za|0))}while(0);Za=(f|0)>0;if(Za){lb=e+17900|0;ca=e+18680|0;Ab=fa+8|0;yb=e+17796|0;Cb=0;do{xb=c[lb>>2]|0;wb=c[Eb>>2]|0;vb=(c[ca>>2]|0)+Cb|0;Bb[c[Ab>>2]&7](xb+(Cb*24|0)|0)|0;Qj(wb+(vb*16016|0)+13280|0,e|0,432)|0;c[wb+(vb*16016|0)+13548>>2]=c[yb>>2]|0?0:wb+(vb*16016|0)+48|0;c[xb+(Cb*24|0)+8>>2]=24;c[xb+(Cb*24|0)+12>>2]=wb+(vb*16016|0);c[xb+(Cb*24|0)+16>>2]=e;Cb=Cb+1|0}while((Cb|0)<(f|0))}Jj(c[e+17844>>2]|0,0,_a*6|0)|0;Jj(c[e+17840>>2]|0,0,_a|0)|0;If(R);Cb=e+17908|0;Og(e,z,g,ab,y,Cb);fi(Cb,ab,12,25);if(bb){if((ab|0)>2){yb=ab+-2|0;Ab=0;do{ca=e+17908+(Ab*12|0)|0;c[N>>2]=c[ca>>2];c[N+4>>2]=c[ca+4>>2];c[N+8>>2]=c[ca+8>>2];lb=e+17908+(yb*12|0)|0;c[ca>>2]=c[lb>>2];c[ca+4>>2]=c[lb+4>>2];c[ca+8>>2]=c[lb+8>>2];c[lb>>2]=c[N>>2];c[lb+4>>2]=c[N+4>>2];c[lb+8>>2]=c[N+8>>2];Ab=Ab+2|0;yb=yb+-2|0}while((Ab|0)<(yb|0))}}else{c[N>>2]=c[Cb>>2];c[N+4>>2]=c[Cb+4>>2];c[N+8>>2]=c[Cb+8>>2];yb=ab+-1|0;Wj(Cb|0,e+17920|0,yb*12|0)|0;Ab=e+17908+(yb*12|0)|0;c[Ab>>2]=c[N>>2];c[Ab+4>>2]=c[N+4>>2];c[Ab+8>>2]=c[N+8>>2]}Ab=e+17796|0;yb=e+17900|0;if(Za&(c[Ab>>2]|0)==0){bb=0;do{Jj((c[(c[yb>>2]|0)+(bb*24|0)+12>>2]|0)+48|0,0,13224)|0;bb=bb+1|0}while((bb|0)<(f|0))}bb=(ab|0)/(f|0)|0;Cb=(ab|0)%(f|0)|0;if(Za){lb=f+-1|0;ca=fa+16|0;xb=fa+12|0;vb=0;wb=0;do{nb=c[yb>>2]|0;v=nb+(wb*24|0)|0;ub=c[nb+(wb*24|0)+12>>2]|0;c[ub+4>>2]=vb;vb=vb+bb+((wb+Cb|0)/(f|0)|0)|0;c[ub+8>>2]=vb+-1;c[ub>>2]=g;c[nb+(wb*24|0)+20>>2]=0;if((wb|0)==(lb|0))zb[c[ca>>2]&31](v);else zb[c[xb>>2]&31](v);wb=wb+1|0}while((wb|0)<(f|0));Hb=f}else Hb=0;wb=fa+8|0;xb=Hb;while(1){if((xb|0)<=0){Jb=0;break}ca=c[yb>>2]|0;Kb=xb+-1|0;lb=c[ca+(Kb*24|0)+12>>2]|0;vb=(Bb[c[wb>>2]&7](ca+(Kb*24|0)|0)|0)==0&1;c[P>>2]=vb|c[P>>2];Lb=c[lb>>2]|0;if(!Lb)xb=Kb;else{sa=270;break}}do if((sa|0)==270){if((xb|0)>1)Mb=Kb;else{Jb=Lb;break}do{lb=Mb;Mb=Mb+-1|0;vb=(Bb[c[wb>>2]&7]((c[yb>>2]|0)+(Mb*24|0)|0)|0)==0&1;c[P>>2]=vb|c[P>>2]}while((lb|0)>1);Jb=Lb}while(0);if(Za&(c[Ab>>2]|0)==0){wb=e+4552|0;xb=0;do{Of(wb,(c[(c[yb>>2]|0)+(xb*24|0)+12>>2]|0)+48|0,1);xb=xb+1|0}while((xb|0)<(f|0))}c[h>>2]=Jb;if(c[P>>2]|0){Ub(R,7,30600,q);break}if(c[e+17812>>2]|0)break;Kf(Wa,R,e,c[u>>2]|0,0,0,c[yb>>2]|0,c[Db>>2]|0,e+18684|0)}else{do if(c[u>>2]|0){f=e+17812|0;do if(!(c[f>>2]|0)){xb=e+17888|0;if(c[xb>>2]|0)break;wb=Vb(32,284)|0;c[xb>>2]=wb;if(!wb)Ub(R,2,30640,p);c[e+17884>>2]=26;if((c[Gb>>2]|0)<=1)break;if(Bb[c[fa+4>>2]&7](e+17876|0)|0)break;Ub(R,1,30680,o)}while(0);if(!(c[u>>2]|0))break;if(c[f>>2]|0)break;wb=c[e+17888>>2]|0;Bb[c[fa+8>>2]&7](e+17876|0)|0;Hf(wb,(c[Z>>2]|0)+40+((c[ea>>2]|0)*160|0)+28|0,R,e)}while(0);Db=e+17844|0;Jj(c[Db>>2]|0,0,_a*6|0)|0;yb=e+17840|0;Jj(c[yb>>2]|0,0,_a|0)|0;If(R);Og(e,z,g,ab,y,N);if((t|0)!=31){wb=(Ya|0)==31;xb=e+17796|0;Ab=e+4552|0;Za=e+1100|0;lb=e+1068|0;vb=e+1044|0;if(!wb){ca=0;do{Cb=ca<<Ya;bb=0;do{v=(c[Eb>>2]|0)+(Cb*16016|0)+(bb*16016|0)|0;nb=v+13280|0;Qj(nb|0,e|0,432)|0;c[nb+424>>2]=0;c[nb+268>>2]=c[xb>>2]|0?0:Ab;ub=v+13712|0;Jj(ub|0,0,2048)|0;vf(nb+272|0,R,ca,bb);sb=c[N+(ca*768|0)+(bb*12|0)>>2]|0;tb=c[N+(ca*768|0)+(bb*12|0)+4>>2]|0;rb=c[S>>2]|0;qb=c[w>>2]|0;if(!((tb|0)!=0&(U-sb|0)>>>0>=tb>>>0))Ub(R,7,30715,n);if(fc(v+12|0,sb,tb,rb,qb)|0){c[m>>2]=1;Ub(R,2,30755,m)}qb=nb+332|0;c[nb>>2]=ub;c[nb+348>>2]=c[Db>>2];rb=nb+44|0;c[rb>>2]=c[lb>>2];c[rb+4>>2]=c[lb+4>>2];c[rb+8>>2]=c[lb+8>>2];c[rb+12>>2]=c[lb+12>>2];c[rb+16>>2]=c[lb+16>>2];c[rb+20>>2]=c[lb+20>>2];c[rb+24>>2]=c[lb+24>>2];c[rb+28>>2]=c[lb+28>>2];rb=c[Db>>2]|0;tb=(c[$>>2]<<1)+14&-16;c[qb>>2]=c[cb>>2];c[nb+88>>2]=ub;c[nb+352>>2]=rb+tb;tb=nb+132|0;c[tb>>2]=c[Za>>2];c[tb+4>>2]=c[Za+4>>2];c[tb+8>>2]=c[Za+8>>2];c[tb+12>>2]=c[Za+12>>2];c[tb+16>>2]=c[Za+16>>2];c[tb+20>>2]=c[Za+20>>2];c[tb+24>>2]=c[Za+24>>2];c[tb+28>>2]=c[Za+28>>2];tb=c[Db>>2]|0;rb=(c[$>>2]<<2)+28&-32;c[qb>>2]=c[cb>>2];c[nb+176>>2]=ub;c[nb+356>>2]=tb+rb;rb=nb+220|0;c[rb>>2]=c[Za>>2];c[rb+4>>2]=c[Za+4>>2];c[rb+8>>2]=c[Za+8>>2];c[rb+12>>2]=c[Za+12>>2];c[rb+16>>2]=c[Za+16>>2];c[rb+20>>2]=c[Za+20>>2];c[rb+24>>2]=c[Za+24>>2];c[rb+28>>2]=c[Za+28>>2];rb=c[cb>>2]|0;tb=c[yb>>2]|0;ub=c[vb>>2]|0;sb=rb;v=(c[X>>2]|0)==0;c[qb>>2]=rb;c[nb+408>>2]=tb;c[nb+288>>2]=ub;c[nb+428>>2]=R;do if(v)Nb=27372;else{if(a[T>>0]|0){Nb=27372;break}Nb=sb+126|0}while(0);c[nb+312>>2]=Nb;bb=bb+1|0}while((bb|0)<(ab|0));ca=ca+1|0}while((ca|0)<(y|0))}ca=O+4|0;vb=e+17868|0;yb=e+17812|0;Za=e+17876|0;Db=e+17888|0;lb=e+1032|0;Ab=fa+8|0;xb=fa+12|0;bb=fa+16|0;Cb=e+18724|0;f=ab+-1|0;sb=O+8|0;v=O+12|0;ub=0;do{tf(O,R,ub);tb=c[O>>2]|0;b:do if((tb|0)<(c[ca>>2]|0)){rb=ub<<Ya;if(wb){qb=tb;while(1){do if(c[u>>2]|0){if(c[yb>>2]|0){sa=329;break}Ta=c[Db>>2]|0;if((qb|0)<8)break;if((qb+8|0)>=(c[lb>>2]|0))break;Bb[c[Ab>>2]&7](Za)|0;c[Ta+272>>2]=qb+-8;c[Ta+276>>2]=qb;if((c[Gb>>2]|0)>1){zb[c[xb>>2]&31](Za);sa=329;break}else{zb[c[bb>>2]&31](Za);sa=329;break}}else sa=329;while(0);do if((sa|0)==329){sa=0;if(!(c[db>>2]|0))break;Zg(c[vb>>2]|0,qb<<3)}while(0);qb=qb+8|0;if((qb|0)>=(c[ca>>2]|0))break b}}else Ob=tb;do{qb=0;do{nb=(c[Cb>>2]|0)==0?qb:f-qb|0;Ta=(c[Eb>>2]|0)+(rb*16016|0)+(nb*16016|0)|0;uf(O,R,nb);nb=Ta+13280|0;mb=nb+360|0;pb=mb+48|0;do{c[mb>>2]=0;mb=mb+4|0}while((mb|0)<(pb|0));mb=nb+412|0;c[mb>>2]=0;c[mb+4>>2]=0;mb=c[sb>>2]|0;if((mb|0)<(c[v>>2]|0)){pb=mb;do{Qg(Ta,e,Ob,pb,12,4);pb=pb+8|0}while((pb|0)<(c[v>>2]|0))}pb=c[P>>2]|c[nb+424>>2];c[P>>2]=pb;if(pb|0)Ub(R,7,30790,k);qb=qb+1|0}while((ab|0)>(qb|0));do if(c[u>>2]|0){if(c[yb>>2]|0){sa=313;break}qb=c[Db>>2]|0;if((Ob|0)<8)break;if((Ob+8|0)>=(c[lb>>2]|0))break;Bb[c[Ab>>2]&7](Za)|0;c[qb+272>>2]=Ob+-8;c[qb+276>>2]=Ob;if((c[Gb>>2]|0)>1){zb[c[xb>>2]&31](Za);sa=313;break}else{zb[c[bb>>2]&31](Za);sa=313;break}}else sa=313;while(0);do if((sa|0)==313){sa=0;if(!(c[db>>2]|0))break;Zg(c[vb>>2]|0,Ob<<3)}while(0);Ob=Ob+8|0}while((Ob|0)<(c[ca>>2]|0))}while(0);ub=ub+1|0}while((ub|0)<(y|0))}do if(c[u>>2]|0){if(c[e+17812>>2]|0)break;ub=e+17876|0;ca=c[e+17888>>2]|0;Bb[c[fa+8>>2]&7](ub)|0;vb=ca+276|0;c[ca+272>>2]=c[vb>>2];c[vb>>2]=c[e+1032>>2];zb[c[fa+16>>2]&31](ub)}while(0);ub=(c[Eb>>2]|0)+((y<<Ya)*16016|0)+-16016|0;if(c[db>>2]|0)Zg(c[e+17868>>2]|0,2147483647);c[h>>2]=hc(ub+12|0)|0}while(0);do if(!(c[P>>2]|0)){if(!(c[x>>2]|0)){if(c[e+17796>>2]|0)break;Je(R);if(!(c[X>>2]|0))break;if(a[T>>0]|0)break;Ke(R);Ne(R,c[e+1016>>2]|0)}}else Ub(R,7,30600,j);while(0);if((Fb|0)!=0|(c[e+4352>>2]|0)==0){l=i;return}Qj((c[Q>>2]|0)+((c[W>>2]|0)*2044|0)|0,c[cb>>2]|0,2044)|0;l=i;return}function Ig(a){a=a|0;var b=0;b=l;l=l+16|0;Ub(a,7,31092,b);l=b;return}function Jg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+32|0;e=d+16|0;f=d+8|0;g=d;h=a+17348|0;if((c[h>>2]|0)>>>0>1){i=(jc(b)|0)!=0;j=i?12:10}else j=8;c[a+17352>>2]=j;j=kc(b,3)|0;c[a+248>>2]=j;if((j|0)==7){c[a+252>>2]=1;switch(c[h>>2]|0){case 3:case 1:break;default:{Ub(a,5,31048,d+24|0);l=d;return}}c[a+280>>2]=0;c[a+284>>2]=0;if(!(jc(b)|0)){l=d;return}Ub(a,5,31031,e);l=d;return}c[a+252>>2]=jc(b)|0;switch(c[h>>2]|0){case 3:case 1:break;default:{c[a+280>>2]=1;c[a+284>>2]=1;l=d;return}}h=a+280|0;c[h>>2]=jc(b)|0;e=jc(b)|0;c[a+284>>2]=e;if((e|0)==1&(c[h>>2]|0)==1)Ub(a,5,30987,g);if(!(jc(b)|0)){l=d;return}Ub(a,5,31031,f);l=d;return}function Kg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;d=l;l=l+16|0;e=a+17404|0;f=c[e>>2]|0;g=(kc(b,16)|0)+1|0;Lg(a,g,(kc(b,16)|0)+1|0);g=a+256|0;h=a+264|0;c[h>>2]=c[g>>2];i=a+260|0;j=a+268|0;c[j>>2]=c[i>>2];if(jc(b)|0){c[h>>2]=(kc(b,16)|0)+1;c[j>>2]=(kc(b,16)|0)+1}xe(f);b=a+556|0;k=c[b>>2]|0;m=a+280|0;n=a+284|0;if(_b((c[e>>2]|0)+40+(k*160|0)+28|0,c[g>>2]|0,c[i>>2]|0,c[m>>2]|0,c[n>>2]|0,32,c[a+17376>>2]|0,f+40+(k*160|0)+16|0,c[f+32>>2]|0,c[f+28>>2]|0)|0){ye(f);Ub(a,2,30185,d)}ye(f);k=c[b>>2]|0;c[f+40+(k*160|0)+112>>2]=c[m>>2];c[f+40+(k*160|0)+116>>2]=c[n>>2];c[f+40+(k*160|0)+120>>2]=c[a+17352>>2];c[f+40+(k*160|0)+124>>2]=c[a+248>>2];c[f+40+(k*160|0)+128>>2]=c[a+252>>2];c[f+40+(k*160|0)+132>>2]=c[h>>2];c[f+40+(k*160|0)+136>>2]=c[j>>2];l=d;return}function Lg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=e;h=a+256|0;if(!((c[h>>2]|0)==(b|0)?(c[a+260>>2]|0)==(d|0):0)){if((b+7>>3|0)<=(c[a+608>>2]|0)?(d+7>>3|0)<=(c[a+600>>2]|0):0)ze(a,b,d);else i=5;if((i|0)==5?Be(a,b,d)|0:0)Ub(a,2,30914,g);De(a);c[h>>2]=b;c[a+260>>2]=d}d=a+296|0;b=c[d>>2]|0;h=c[b+4>>2]|0;g=a+600|0;if((h|0?(c[g>>2]|0)<=(c[b+8>>2]|0):0)?(c[a+608>>2]|0)<=(c[b+12>>2]|0):0){l=e;return}Yb(h);h=c[g>>2]|0;g=c[d>>2]|0;c[g+8>>2]=h;b=c[a+608>>2]|0;c[g+12>>2]=b;g=Xb(S(b,h)|0,12)|0;c[(c[d>>2]|0)+4>>2]=g;if(g|0){l=e;return}Ub(a,2,30949,f);l=e;return}function Mg(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if((e|0)<=0)return;g=f+4|0;h=f+8|0;i=0;do{j=(((c[g>>2]|0)*252|0)+4|0)>>>8;k=c[h>>2]|0;if((k|0)<0){gc(f);l=c[h>>2]|0}else l=k;k=c[f>>2]|0;m=j<<24;if(k>>>0<m>>>0){n=1;o=j;p=k}else{n=0;o=(c[g>>2]|0)-j|0;p=k-m|0}m=d[1280+o>>0]|0;k=o<<m;j=p<<m;q=l-m|0;c[f>>2]=j;c[h>>2]=q;c[g>>2]=k;if(!n){m=j;j=k;k=q;q=7;r=0;do{s=q;q=q+-1|0;t=((j<<7)+128|0)>>>8;if((k|0)<0){gc(f);u=c[h>>2]|0;v=c[f>>2]|0}else{u=k;v=m}w=t<<24;if(v>>>0<w>>>0){x=0;y=t;z=v}else{x=1;y=(c[g>>2]|0)-t|0;z=v-w|0}w=d[1280+y>>0]|0;j=y<<w;m=z<<w;k=u-w|0;c[f>>2]=m;c[h>>2]=k;c[g>>2]=j;r=x<<q|r}while((s|0)>1);a[b+i>>0]=r<<1|1}i=i+1|0}while((i|0)!=(e|0));return}function Ng(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,fa=0,ga=0,ha=0,ja=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0;e=l;l=l+32|0;f=e+8|0;g=e;h=4;i=Bj(40)|0;c[i>>2]=0;j=e+20|0;k=e+16|0;m=e+12|0;nb(c,j>>2,b+13552|0)|0;n=d+432|0;q=(1<<c[d+17800>>2])+-1|0;nb(c,k>>2,0)|0;nb(c,m>>2,c[b+4>>2]|0)|0;r=b+15760|0;s=b+15848|0;c[s>>2]=1;i=Lj(b+15852|0,1,i|0,h|0)|0;h=D;o=0;t=o;o=0;if((t|0)!=0&(p|0)!=0){u=Oj(c[t>>2]|0,i|0,h|0)|0;if(!u)ya(t|0,p|0);D=p}else u=-1;if((u|0)==1)v=D;else v=0;a:while(1){if(v|0){w=4;break}u=b+13704|0;c[u>>2]=0;t=b+13712|0;x=b+12|0;y=d+18712|0;z=d+18716|0;A=d+17844|0;B=d+1040|0;C=d+1100|0;E=d+4540|0;F=b+13612|0;G=b+13280|0;H=b+13628|0;I=b+13324|0;J=d+1068|0;K=b+13368|0;L=b+13632|0;M=b+13412|0;N=b+13456|0;O=b+13636|0;P=b+13500|0;Q=d+17840|0;R=d+1044|0;S=d+996|0;T=b+13688|0;U=b+13568|0;V=b+13708|0;W=b+13592|0;X=b+8|0;Y=b+13640|0;Z=b+13692|0;_=d+1012|0;while(1){$=mb(c,m>>2)|0;Jj(t|0,0,2048)|0;aa=mb(c,j>>2)|0;ba=d+17908+($*12|0)+8|0;o=0;la(53,aa|0,n|0,0,c[ba>>2]|0);aa=o;o=0;if((aa|0)!=0&(p|0)!=0){ca=Oj(c[aa>>2]|0,i|0,h|0)|0;if(!ca)ya(aa|0,p|0);D=p}else ca=-1;if((ca|0)==1){v=D;continue a}aa=c[d+17908+($*12|0)>>2]|0;da=c[d+17908+($*12|0)+4>>2]|0;$=c[y>>2]|0;fa=c[z>>2]|0;if(!(da|0?((c[b>>2]|0)-aa|0)>>>0>=da>>>0:0)){o=0;la(54,r|0,7,30715,g|0);ga=o;o=0;if((ga|0)!=0&(p|0)!=0){ha=Oj(c[ga>>2]|0,i|0,h|0)|0;if(!ha)ya(ga|0,p|0);D=p}else ha=-1;if((ha|0)==1){v=D;continue a}}o=0;ga=ka(2,x|0,aa|0,da|0,$|0,fa|0)|0;fa=o;o=0;if((fa|0)!=0&(p|0)!=0){ja=Oj(c[fa>>2]|0,i|0,h|0)|0;if(!ja)ya(fa|0,p|0);D=p}else ja=-1;if((ja|0)==1){v=D;continue a}if(ga|0){o=0;c[f>>2]=1;la(54,r|0,2,30755,f|0);ga=o;o=0;if((ga|0)!=0&(p|0)!=0){ma=Oj(c[ga>>2]|0,i|0,h|0)|0;if(!ma)ya(ga|0,p|0);D=p}else ma=-1;if((ma|0)==1){v=D;continue a}}c[G>>2]=t;c[H>>2]=c[A>>2];c[I>>2]=c[J>>2];c[I+4>>2]=c[J+4>>2];c[I+8>>2]=c[J+8>>2];c[I+12>>2]=c[J+12>>2];c[I+16>>2]=c[J+16>>2];c[I+20>>2]=c[J+20>>2];c[I+24>>2]=c[J+24>>2];c[I+28>>2]=c[J+28>>2];ga=c[A>>2]|0;fa=(c[B>>2]<<1)+14&-16;c[F>>2]=c[E>>2];c[K>>2]=t;c[L>>2]=ga+fa;c[M>>2]=c[C>>2];c[M+4>>2]=c[C+4>>2];c[M+8>>2]=c[C+8>>2];c[M+12>>2]=c[C+12>>2];c[M+16>>2]=c[C+16>>2];c[M+20>>2]=c[C+20>>2];c[M+24>>2]=c[C+24>>2];c[M+28>>2]=c[C+28>>2];fa=c[A>>2]|0;ga=(c[B>>2]<<2)+28&-32;c[F>>2]=c[E>>2];c[N>>2]=t;c[O>>2]=fa+ga;c[P>>2]=c[C>>2];c[P+4>>2]=c[C+4>>2];c[P+8>>2]=c[C+8>>2];c[P+12>>2]=c[C+12>>2];c[P+16>>2]=c[C+16>>2];c[P+20>>2]=c[C+20>>2];c[P+24>>2]=c[C+24>>2];c[P+28>>2]=c[C+28>>2];ga=c[E>>2]|0;fa=c[Q>>2]|0;$=c[R>>2]|0;da=ga;aa=(c[S>>2]|0)==0;c[F>>2]=ga;c[T>>2]=fa;c[U>>2]=$;c[V>>2]=n;if(!aa?(a[_>>0]|0)==0:0)na=da+126|0;else na=27372;c[W>>2]=na;c[V>>2]=r;da=c[(mb(c,j>>2)|0)>>2]|0;if((da|0)<(c[(mb(c,j>>2)|0)+4>>2]|0)){aa=da;while(1){da=Y;$=da+48|0;do{c[da>>2]=0;da=da+4|0}while((da|0)<($|0));da=Z;c[da>>2]=0;c[da+4>>2]=0;da=c[(mb(c,j>>2)|0)+8>>2]|0;if((da|0)<(c[(mb(c,j>>2)|0)+12>>2]|0)){$=da;while(1){o=0;ia(1,b|0,d|0,aa|0,$|0,12,4);da=o;o=0;if((da|0)!=0&(p|0)!=0){oa=Oj(c[da>>2]|0,i|0,h|0)|0;if(!oa)ya(da|0,p|0);D=p}else oa=-1;if((oa|0)==1){v=D;continue a}$=$+8|0;if(($|0)>=(c[(mb(c,j>>2)|0)+12>>2]|0))break}}aa=aa+8|0;if((aa|0)>=(c[(mb(c,j>>2)|0)+4>>2]|0))break}}if((c[ba>>2]|0)==(q|0)){o=0;aa=ea(6,x|0)|0;$=o;o=0;if(($|0)!=0&(p|0)!=0){pa=Oj(c[$>>2]|0,i|0,h|0)|0;if(!pa)ya($|0,p|0);D=p}else pa=-1;if((pa|0)==1){v=D;continue a}nb(c,k>>2,aa)|0}qa=(c[u>>2]|0)==0;if(!qa){w=27;break a}aa=mb(c,m>>2)|0;nb(c,m>>2,aa+1|0)|0;if((aa|0)>=(c[X>>2]|0)){w=27;break a}}}if((w|0)==4){c[s>>2]=0;c[b+13704>>2]=1;c[b>>2]=0;ra=0;Cj(i|0);l=e;return ra|0}else if((w|0)==27){c[b>>2]=mb(c,k>>2)|0;ra=qa&1;Cj(i|0);l=e;return ra|0}return 0}function Og(a,b,e,f,g,h){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;i=l;l=l+32|0;j=i+24|0;k=i+16|0;m=i+8|0;n=i;o=i+28|0;if((g|0)<=0){l=i;return}p=(f|0)>0;q=g+-1|0;r=f+-1|0;s=a+432|0;t=a+18712|0;u=a+18716|0;a=e;e=o+1|0;v=o+2|0;w=o+3|0;x=b;b=0;while(1){a:do if(p){if((b|0)==(q|0)){y=0;z=x}else{A=0;B=x;while(1){c[h+(b*768|0)+(A*12|0)+8>>2]=A;C=c[t>>2]|0;D=c[u>>2]|0;if((a-B|0)>>>0<=3)Ub(s,7,30715,k);if(!C){E=B;F=E;G=(d[E+1>>0]|0)<<16|(d[E>>0]|0)<<24|(d[E+2>>0]|0)<<8|(d[E+3>>0]|0)}else{E=B;Ib[C&63](D,E,o,4);F=E;G=(d[e>>0]|0)<<16|(d[o>>0]|0)<<24|(d[v>>0]|0)<<8|(d[w>>0]|0)}E=F+4|0;D=E;if(G>>>0>(a-D|0)>>>0)Ub(s,7,30876,j);c[h+(b*768|0)+(A*12|0)>>2]=D;c[h+(b*768|0)+(A*12|0)+4>>2]=G;D=E+G|0;A=A+1|0;if((A|0)==(f|0)){H=D;break a}else B=D}}while(1){B=h+(q*768|0)+(y*12|0)|0;c[h+(q*768|0)+(y*12|0)+8>>2]=y;A=c[t>>2]|0;D=c[u>>2]|0;E=a-z|0;if((y|0)!=(r|0)){if(E>>>0<=3)Ub(s,7,30715,n);if(!A){C=z;I=C;J=(d[C+1>>0]|0)<<16|(d[C>>0]|0)<<24|(d[C+2>>0]|0)<<8|(d[C+3>>0]|0)}else{C=z;Ib[A&63](D,C,o,4);I=C;J=(d[e>>0]|0)<<16|(d[o>>0]|0)<<24|(d[v>>0]|0)<<8|(d[w>>0]|0)}C=I+4|0;if(J>>>0>(a-C|0)>>>0){Ub(s,7,30876,m);K=C;L=J}else{K=C;L=J}}else{K=z;L=E}c[B>>2]=K;c[h+(q*768|0)+(y*12|0)+4>>2]=L;B=K+L|0;y=y+1|0;if((y|0)==(f|0)){H=B;break}else z=B}}else H=x;while(0);b=b+1|0;if((b|0)==(g|0))break;else x=H}l=i;return}function Pg(a,b){a=a|0;b=b|0;return (c[b+4>>2]|0)-(c[a+4>>2]|0)|0}function Qg(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;j=i+-1|0;k=1<<j;l=k>>1;m=l+f|0;n=c[e+1032>>2]|0;o=(m|0)<(n|0);p=l+g|0;q=c[e+1040>>2]|0;r=(p|0)<(q|0);if(!((n|0)>(f|0)&(q|0)>(g|0)))return;q=b+13688|0;n=(f&7)+(b+13692)|0;s=(a[(c[q>>2]|0)+g>>0]|0)>>>j&1|j<<2|(a[n>>0]|0)>>>j<<1&2;t=c[b+13592>>2]|0;u=c[b+13548>>2]|0;v=b+12|0;do if(!(o&r)){w=o^1;if(r&w){x=d[t+(s*3|0)+1>>0]|0;y=b+16|0;z=(256-x+(S(c[y>>2]|0,x)|0)|0)>>>8;x=b+20|0;A=c[x>>2]|0;if((A|0)<0){gc(v);B=c[x>>2]|0}else B=A;A=c[v>>2]|0;C=z<<24;if(A>>>0<C>>>0){D=1;E=z;F=A}else{D=3;E=(c[y>>2]|0)-z|0;F=A-C|0}C=d[1280+E>>0]|0;c[v>>2]=F<<C;c[x>>2]=B-C;c[y>>2]=E<<C;G=D;break}if(r|w)G=3;else{w=d[t+(s*3|0)+2>>0]|0;C=b+16|0;y=(256-w+(S(c[C>>2]|0,w)|0)|0)>>>8;w=b+20|0;x=c[w>>2]|0;if((x|0)<0){gc(v);H=c[w>>2]|0}else H=x;x=c[v>>2]|0;A=y<<24;if(x>>>0<A>>>0){I=2;J=y;K=x}else{I=3;J=(c[C>>2]|0)-y|0;K=x-A|0}A=d[1280+J>>0]|0;c[v>>2]=K<<A;c[w>>2]=H-A;c[C>>2]=J<<A;G=I}}else{A=b+16|0;C=b+20|0;w=c[A>>2]|0;x=c[C>>2]|0;y=0;do{z=y<<24>>24;L=d[(z>>1)+(t+(s*3|0))>>0]|0;M=(256-L+(S(L,w)|0)|0)>>>8;if((x|0)<0){gc(v);N=c[C>>2]|0}else N=x;L=c[v>>2]|0;O=M<<24;if(L>>>0<O>>>0){P=0;Q=M;R=L}else{P=1;Q=(c[A>>2]|0)-M|0;R=L-O|0}O=d[1280+Q>>0]|0;w=Q<<O;x=N-O|0;c[v>>2]=R<<O;c[C>>2]=x;c[A>>2]=w;y=a[27444+(P+z)>>0]|0}while(y<<24>>24>0);G=0-(y<<24>>24)|0}while(0);P=u+560+(s<<4)+(G<<2)|0;if(u|0)c[P>>2]=(c[P>>2]|0)+1;P=a[(h&255)+(29085+(G*13|0))>>0]|0;a:do if(!l){a[b+13544>>0]=1>>>(G>>>1&1);a[b+13545>>0]=1>>>(G&1);Rg(b,e,f,g,P,1,1)}else switch(G|0){case 0:{Rg(b,e,f,g,P,i,i);break a;break}case 1:{Rg(b,e,f,g,P,i,j);if(!o)break a;Rg(b,e,m,g,P,i,j);break a;break}case 2:{Rg(b,e,f,g,P,j,i);if(!r)break a;Rg(b,e,f,p,P,j,i);break a;break}case 3:{Qg(b,e,f,g,P,j);Qg(b,e,f,p,P,j);Qg(b,e,m,g,P,j);Qg(b,e,m,p,P,j);break a;break}default:break a}while(0);if((h&255)<=2)return;if(!(h<<24>>24==3|(G|0)!=3))return;G=P&255;Jj((c[q>>2]|0)+g|0,a[29415+(G<<1)>>0]|0,k|0)|0;Jj(n|0,a[29415+(G<<1)+1>>0]|0,k|0)|0;return}function Rg(f,g,h,i,j,k,m){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0;n=l;l=l+16|0;o=n+8|0;p=n;q=n+12|0;r=g+432|0;s=j&255;t=1<<k+-1;u=1<<m+-1;v=c[g+1040>>2]|0;w=v-i|0;x=(t|0)<(w|0)?t:w;w=c[g+1032>>2]|0;y=w-h|0;z=(u|0)<(y|0)?u:y;y=f+13280|0;A=c[g+1044>>2]|0;B=(S(A,h)|0)+i|0;C=(c[g+1168>>2]|0)+(B<<2)|0;D=f+13572|0;c[D>>2]=C;c[C>>2]=(c[g+1140>>2]|0)+(B*68|0);a[c[c[D>>2]>>2]>>0]=j;if((z|0)>0){B=0;do{C=(B|0)==0&1;if((C|0)<(x|0)){E=S(B,A)|0;F=C;do{C=c[D>>2]|0;c[C+(F+E<<2)>>2]=c[C>>2];F=F+1|0}while((F|0)!=(x|0))}B=B+1|0}while((B|0)!=(z|0))}B=t<<1;A=u<<1;F=c[f+13284>>2]|0;E=f+13356|0;b[E>>1]=B>>F;C=c[f+13288>>2]|0;G=f+13358|0;b[G>>1]=A>>C;a[f+13360>>0]=k-F;a[f+13361>>0]=m-C;H=c[f+13372>>2]|0;I=f+13444|0;b[I>>1]=B>>H;J=c[f+13376>>2]|0;K=f+13446|0;b[K>>1]=A>>J;a[f+13448>>0]=k-H;a[f+13449>>0]=m-J;L=c[f+13460>>2]|0;M=f+13532|0;b[M>>1]=B>>L;B=c[f+13464>>2]|0;N=f+13534|0;b[N>>1]=A>>B;a[f+13536>>0]=k-L;a[f+13537>>0]=m-B;m=i<<1;k=h<<1&14;A=f+13316|0;c[A>>2]=(c[f+13628>>2]|0)+(m>>F);F=f+13320|0;c[F>>2]=(k>>>C)+(f+13640);C=f+13404|0;c[C>>2]=(c[f+13632>>2]|0)+(m>>H);H=f+13408|0;c[H>>2]=(k>>>J)+(f+13656);J=f+13492|0;c[J>>2]=(c[f+13636>>2]|0)+(m>>L);L=f+13496|0;c[L>>2]=(k>>>B)+(f+13672);c[f+13604>>2]=0-(h<<6);B=f+13608|0;c[B>>2]=w-(u+h)<<6;c[f+13596>>2]=0-(i<<6);w=f+13600|0;c[w>>2]=v-(t+i)<<6;if(!h)O=0;else O=c[(c[D>>2]|0)+(0-(c[f+13568>>2]|0)<<2)>>2]|0;c[f+13580>>2]=O;if((c[f+13560>>2]|0)<(i|0))P=c[(c[D>>2]|0)+-4>>2]|0;else P=0;c[f+13576>>2]=P;P=g+17836|0;Uf(y,(c[P>>2]|0)+40+((c[g+988>>2]|0)*160|0)+28|0,h,i);O=c[c[D>>2]>>2]|0;v=(j&255)>2;if((v?(j=c[g+712>>2]|0,k=c[g+716>>2]|0,k|j|0):0)?(a[29155+(s<<2)+(j<<1)+k>>0]|0)==13:0)Ub(c[f+13708>>2]|0,7,30817,p);xg(f,g,h,i,x,z);z=O+3|0;if(a[z>>0]|0){Jj(c[A>>2]|0,0,e[E>>1]|0)|0;Jj(c[F>>2]|0,0,e[G>>1]|0)|0;Jj(c[C>>2]|0,0,e[I>>1]|0)|0;Jj(c[H>>2]|0,0,e[K>>1]|0)|0;Jj(c[J>>2]|0,0,e[M>>1]|0)|0;Jj(c[L>>2]|0,0,e[N>>1]|0)|0}if((a[O+8>>0]|0)>0){L=i<<3;J=h<<3;H=c[c[D>>2]>>2]|0;C=c[19668+(d[H+7>>0]<<2)>>2]|0;if(!(c[g+17864>>2]|0))Q=0;else Q=c[g+17872>>2]|0;F=f+13708|0;A=(d[H>>0]|0)<3;x=(a[H+9>>0]|0)>0?2:1;p=f+13292|0;k=f+13380|0;j=f+13468|0;s=0;do{m=(a[H+8+s>>0]|0)+-1|0;R=g+796+(m<<6)|0;T=g+796+(m<<6)+8|0;U=(c[P>>2]|0)+40+((c[R>>2]|0)*160|0)|0;V=c[T>>2]|0;if((V|0)!=-1?(W=c[g+796+(m<<6)+12>>2]|0,(W|0)!=-1):0){X=W;Y=V;Z=59}else{Ub(c[F>>2]|0,5,30837,o);V=c[T>>2]|0;if((V|0)==-1)_=0;else{X=c[g+796+(m<<6)+12>>2]|0;Y=V;Z=59}}if((Z|0)==59){Z=0;_=(X|0)!=-1&((Y|0)!=16384|(X|0)!=16384)}V=_&1;Vf(y,s,c[g+796+(m<<6)+4>>2]|0,h,i,_?T:0);c[f+13616+(s<<2)>>2]=R;if(A){R=0;do{m=f+13280+(R*88|0)|0;W=f+13280+(R*88|0)+12|0;$=b[f+13280+(R*88|0)+76>>1]|0;aa=$&65535;ba=b[f+13280+(R*88|0)+78>>1]|0;ca=ba&65535;da=aa<<2;ea=ca<<2;fa=f+13280+(R*88|0)+20+(s<<3)|0;if(!($<<16>>16==0|ba<<16>>16==0)){ba=0;$=0;while(1){ga=$<<2;ha=ba;ia=0;while(1){Tf(q,m,H,s,ha);Sg(Q,y,R,da,ea,ia<<2,ga,4,4,L,J,C,T,fa,W,q,U,V,s);ia=ia+1|0;if((ia|0)==(aa|0))break;else ha=ha+1|0}$=$+1|0;if(($|0)==(ca|0))break;else ba=ba+aa|0}}R=R+1|0}while((R|0)!=3)}else{R=H+12+(s<<2)|0;c[q>>2]=e[R>>1]|e[R+2>>1]<<16;R=e[E>>1]<<2;aa=e[G>>1]<<2;Sg(Q,y,0,R,aa,0,0,R,aa,L,J,C,T,f+13300+(s<<3)|0,p,q,U,V,s);aa=e[I>>1]<<2;R=e[K>>1]<<2;Sg(Q,y,1,aa,R,0,0,aa,R,L,J,C,T,f+13388+(s<<3)|0,k,q,U,V,s);R=e[M>>1]<<2;aa=e[N>>1]<<2;Sg(Q,y,2,R,aa,0,0,R,aa,L,J,C,T,f+13476+(s<<3)|0,j,q,U,V,s)}s=s+1|0}while((s|0)!=(x|0));if(!(a[z>>0]|0)){x=O+2|0;s=f+13584|0;q=f+13588|0;j=O+4|0;C=f+13700|0;J=0;L=0;while(1){if(!L)ja=x;else ja=(c[f+13280+(L*88|0)+8>>2]|0)+(29207+(d[O>>0]<<4)+(d[x>>0]<<2)+(c[f+13280+(L*88|0)+4>>2]<<1))|0;Q=a[ja>>0]|0;N=Q&255;M=1<<N;k=c[w>>2]|0;K=(k|0)>-1;if(K)ka=0;else ka=k>>(c[f+13280+(L*88|0)+4>>2]|0)+5;k=ka+(e[f+13280+(L*88|0)+76>>1]|0)|0;I=c[B>>2]|0;p=(I|0)>-1;if(p)la=0;else la=I>>(c[f+13280+(L*88|0)+8>>2]|0)+5;I=la+(e[f+13280+(L*88|0)+78>>1]|0)|0;c[s>>2]=K?0:k;c[q>>2]=p?0:I;if((I|0)>0){p=(k|0)>0;K=19812+(N*12|0)|0;G=f+13280+(L*88|0)+12|0;E=f+13280+(L*88|0)+16|0;H=f+13280+(L*88|0)|0;A=(Q&255)<3;_=32<<N;X=Q<<24>>24==3;Y=32<<(N<<1);N=Q<<24>>24==0;Z=J;o=0;while(1){a:do if(p){if(N){F=0;P=Z;while(1){aa=Tg(f,L,K,F,o,0,a[j>>0]|0)|0;do if((aa|0)>0){R=c[E>>2]|0;ba=(c[G>>2]|0)+((S(R,o)|0)+F<<2)|0;ca=c[H>>2]|0;if(!(c[C>>2]|0))We(ca,ba,R,aa);else Xe(ca,ba,R,aa);if((aa|0)==1){b[ca>>1]=0;break}if(A&(aa|0)<11){Jj(ca|0,0,_|0)|0;break}if(X&(aa|0)<35){Jj(ca|0,0,512)|0;break}else{Jj(ca|0,0,Y|0)|0;break}}while(0);ca=aa+P|0;F=F+M|0;if((F|0)>=(k|0)){ma=ca;break a}else P=ca}}else{na=0;oa=Z}while(1){P=Tg(f,L,K,na,o,Q,a[j>>0]|0)|0;b:do if((P|0)>0){F=c[E>>2]|0;ca=(c[G>>2]|0)+((S(F,o)|0)+na<<2)|0;R=c[H>>2]|0;c:do if(!(c[C>>2]|0))switch(Q<<24>>24){case 3:{_e(R,ca,F,P);break c;break}case 1:{Ye(R,ca,F,P);break c;break}case 2:{Ze(R,ca,F,P);break c;break}default:break b}else Xe(R,ca,F,P);while(0);if((P|0)==1){b[R>>1]=0;break}if(A&(P|0)<11){Jj(R|0,0,_|0)|0;break}if(X&(P|0)<35){Jj(R|0,0,512)|0;break}else{Jj(R|0,0,Y|0)|0;break}}while(0);aa=P+oa|0;na=na+M|0;if((na|0)>=(k|0)){ma=aa;break}else oa=aa}}else ma=Z;while(0);o=o+M|0;if((o|0)>=(I|0)){pa=ma;break}else Z=ma}}else pa=J;L=L+1|0;if((L|0)==3)break;else J=pa}if(v&(pa|0)==0)a[z>>0]=1}}else{pa=O+2|0;v=f+13584|0;J=f+13588|0;L=O+6|0;ma=O+1|0;oa=f+13700|0;na=O+4|0;C=0;do{j=(C|0)==0;if(j)qa=pa;else qa=(c[f+13280+(C*88|0)+8>>2]|0)+(29207+(d[O>>0]<<4)+(d[pa>>0]<<2)+(c[f+13280+(C*88|0)+4>>2]<<1))|0;q=a[qa>>0]|0;s=q&255;la=1<<s;ka=c[w>>2]|0;ja=(ka|0)>-1;if(ja)ra=0;else ra=ka>>(c[f+13280+(C*88|0)+4>>2]|0)+5;ka=ra+(e[f+13280+(C*88|0)+76>>1]|0)|0;x=c[B>>2]|0;Z=(x|0)>-1;if(Z)sa=0;else sa=x>>(c[f+13280+(C*88|0)+8>>2]|0)+5;x=sa+(e[f+13280+(C*88|0)+78>>1]|0)|0;c[v>>2]=ja?0:ka;c[J>>2]=Z?0:x;if((x|0)>0){Z=(ka|0)>0;ja=j?ma:L;I=f+13280+(C*88|0)+12|0;o=f+13280+(C*88|0)+16|0;M=f+13280+(C*88|0)+80|0;k=f+13280+(C*88|0)|0;Y=(q&255)<3;X=32<<s;_=q<<24>>24==3;A=32<<(s<<1);Q=19812+(s*12|0)|0;H=0;do{if(Z){G=H<<1;E=0;do{K=c[o>>2]|0;N=(c[I>>2]|0)+((S(K,H)|0)+E<<2)|0;if(j&(d[O>>0]|0)<3)ta=(c[c[D>>2]>>2]|0)+20+((E+G|0)*12|0)|0;else ta=ja;p=a[ta>>0]|0;Wf(y,d[M>>0]|0,q,p,N,K,N,K,E,H,C);d:do if(!(a[z>>0]|0)){do if(j){if(c[oa>>2]|0){ua=0;va=Q;break}K=c[19772+((p&255)<<2)>>2]|0;ua=K;va=19860+(s*48|0)+(K*12|0)|0}else{ua=0;va=Q}while(0);P=Tg(f,C,va,E,H,q,a[na>>0]|0)|0;if((P|0)<=0)break;K=c[o>>2]|0;V=c[k>>2]|0;e:do if(!(c[oa>>2]|0))switch(q<<24>>24){case 0:{$e(ua,V,N,K,P);break e;break}case 1:{af(ua,V,N,K,P);break e;break}case 2:{bf(ua,V,N,K,P);break e;break}case 3:{_e(V,N,K,P);break e;break}default:break d}else Xe(V,N,K,P);while(0);if((P|0)==1){b[V>>1]=0;break}if((ua|0)==0&(Y&(P|0)<11)){Jj(V|0,0,X|0)|0;break}if(_&(P|0)<35){Jj(V|0,0,512)|0;break}else{Jj(V|0,0,A|0)|0;break}}while(0);E=E+la|0}while((E|0)<(ka|0))}H=H+la|0}while((H|0)<(x|0))}C=C+1|0}while((C|0)!=3)}C=f+13704|0;c[C>>2]=((c[f+20>>2]|0)+-33|0)>>>0<1073741791|c[C>>2];if(!(c[g+4372>>2]|0)){l=n;return}Gf(r,O,h,i,t,u);l=n;return}function Sg(d,e,f,g,h,i,j,k,m,n,o,p,q,r,s,t,u,v,w){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;x=l;l=l+25616|0;y=x;z=x+25600|0;A=s+4|0;B=(c[s>>2]|0)+(S(c[A>>2]|0,j)|0)+i|0;s=(f|0)==0;C=c[(s?u+80|0:(f|0)==1?u+84|0:u+88|0)>>2]|0;D=c[(s?u+36|0:u+56|0)>>2]|0;E=c[(s?u+40|0:u+60|0)>>2]|0;F=(v|0)!=0;if(F){v=e+(f*88|0)+4|0;G=e+(f*88|0)+8|0;Sf(y,e,t,g,h,c[v>>2]|0,c[G>>2]|0);h=(0-(c[e+316>>2]|0)>>(c[v>>2]|0)+3)+i|0;v=(0-(c[e+324>>2]|0)>>(c[G>>2]|0)+3)+j|0;G=q+16|0;g=Gb[c[G>>2]&31](h<<4,q)|0;H=q+20|0;I=Gb[c[H>>2]&31](v<<4,q)|0;J=Gb[c[G>>2]&31](h,q)|0;h=Gb[c[H>>2]&31](v,q)|0;jf(z,y,n+i|0,o+j|0,q);K=c[z>>2]|0;L=c[z+4>>2]|0;M=J;N=g;O=c[q+8>>2]|0;P=h;Q=I;R=c[q+12>>2]|0}else{I=c[e+(f*88|0)+4>>2]|0;h=(0-(c[e+316>>2]|0)>>I+3)+i|0;i=c[e+(f*88|0)+8>>2]|0;f=(0-(c[e+324>>2]|0)>>i+3)+j|0;K=b[t>>1]<<1-i;L=b[t+2>>1]<<1-I;M=h;N=h<<4;O=16;P=f;Q=f<<4;R=16}f=L&15;h=K&15;I=(L>>4)+M|0;M=(K>>4)+P|0;P=K+Q|0;Q=c[r+4>>2]|0;r=C+(S(M,Q)|0)+I|0;do if(((E|D)&7|K|L|0)==0&(F^1)){if(d|0){t=(P+(S(R,m+-1|0)|0)>>4)+7|0;Yg(d,u,((t|0)>0?t:0)<<((s^1)&1))}}else{t=P+(S(R,m+-1|0)|0)>>4;i=t+1|0;j=(S(O,k+-1|0)|0)+N+L>>4;if((f|0)==0?(c[q+8>>2]|0)==16:0){T=I;U=j+1|0;V=0}else{T=I+-3|0;U=j+5|0;V=3}if((h|0)==0?(c[q+12>>2]|0)==16:0){W=M;X=i;Y=0}else{W=M+-3|0;X=t+5|0;Y=3}t=X+7|0;if(d|0)Yg(d,u,((t|0)>0?t:0)<<((s^1)&1));t=(T|0)<0;if(((!t?!((U|0)<0|(T|0)>=(D|0)):0)?!((U|0)>=(D|0)|(W|0)<0):0)?(X|0)<(E|0)&((W|0)<(E|0)&(X|0)>-1):0)break;i=S(W,Q)|0;j=U-T+1|0;e=X-W+1|0;g=(S(Y,j)|0)+V|0;J=c[A>>2]|0;z=0-T|0;o=C+i+T+z+(0-i)|0;n=o+(S(Q,E+-1|0)|0)|0;v=(W|0)<(E|0)?((W|0)>0?o+i|0:o):n;n=t?z:0;z=(n|0)>(j|0)?j:n;n=(U|0)>=(D|0)?1-D+U|0:0;t=(n|0)>(j|0)?j:n;n=j-z-t|0;o=(n|0)==0;i=(t|0)==0;H=D+-1|0;a:do if(!z){if(o){if(i)break;else{Z=e;_=y;$=v;aa=W}while(1){Jj(_|0,a[$+H>>0]|0,t|0)|0;G=aa+1|0;Z=Z+-1|0;if(!Z)break a;else{_=_+j|0;$=(aa|0)>-1&(G|0)<(E|0)?$+Q|0:$;aa=G}}}if(i){G=e;ba=y;ca=v;da=W;while(1){Qj(ba|0,ca+T|0,n|0)|0;ea=da+1|0;G=G+-1|0;if(!G)break;else{ba=ba+j|0;ca=(da|0)>-1&(ea|0)<(E|0)?ca+Q|0:ca;da=ea}}}else{da=e;ca=y;ba=v;G=W;while(1){Qj(ca|0,ba+T|0,n|0)|0;Jj(ca+n|0,a[ba+H>>0]|0,t|0)|0;ea=G+1|0;da=da+-1|0;if(!da)break;else{ca=ca+j|0;ba=(G|0)>-1&(ea|0)<(E|0)?ba+Q|0:ba;G=ea}}}}else if(o)if(i){G=e;ba=y;ca=v;da=W;while(1){Jj(ba|0,a[ca>>0]|0,z|0)|0;ea=da+1|0;G=G+-1|0;if(!G)break;else{ba=ba+j|0;ca=(da|0)>-1&(ea|0)<(E|0)?ca+Q|0:ca;da=ea}}}else{da=e;ca=y;ba=v;G=W;while(1){Jj(ca|0,a[ba>>0]|0,z|0)|0;Jj(ca+z|0,a[ba+H>>0]|0,t|0)|0;ea=G+1|0;da=da+-1|0;if(!da)break;else{ca=ca+j|0;ba=(G|0)>-1&(ea|0)<(E|0)?ba+Q|0:ba;G=ea}}}else if(i){G=e;ba=y;ca=v;da=W;while(1){Jj(ba|0,a[ca>>0]|0,z|0)|0;Qj(ba+z|0,ca+T+z|0,n|0)|0;ea=da+1|0;G=G+-1|0;if(!G)break;else{ba=ba+j|0;ca=(da|0)>-1&(ea|0)<(E|0)?ca+Q|0:ca;da=ea}}}else{da=e;ca=y;ba=v;G=W;while(1){Jj(ca|0,a[ba>>0]|0,z|0)|0;ea=ca+z|0;Qj(ea|0,ba+T+z|0,n|0)|0;Jj(ea+n|0,a[ba+H>>0]|0,t|0)|0;ea=G+1|0;da=da+-1|0;if(!da)break;else{ca=ca+j|0;ba=(G|0)>-1&(ea|0)<(E|0)?ba+Q|0:ba;G=ea}}}while(0);xb[c[q+24+(((f|0)!=0&1)<<4)+(((h|0)!=0&1)<<3)+(w<<2)>>2]&15](y+g|0,j,B,J,p+(f<<4)|0,O,p+(h<<4)|0,R,k,m);l=x;return}while(0);xb[c[q+24+(((f|0)!=0&1)<<4)+(((h|0)!=0&1)<<3)+(w<<2)>>2]&15](r,Q,B,c[A>>2]|0,p+(f<<4)|0,O,p+(h<<4)|0,R,k,m);l=x;return}function Tg(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=d+12|0;l=d+13280+(e*88|0)|0;m=d+13280+(e*88|0)+44+(j<<2)|0;j=(c[d+13280+(e*88|0)+36>>2]|0)+g|0;n=(c[d+13280+(e*88|0)+40>>2]|0)+h|0;switch(i<<24>>24){case 0:{i=Ug(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,0,m,((a[n>>0]|0)!=0&1)+((a[j>>0]|0)!=0&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;o=(i|0)>0&1;a[n>>0]=o;a[j>>0]=o;p=i;return p|0}case 1:{i=c[d+13584>>2]|0;o=g+2|0;q=c[d+13588>>2]|0;r=h+2|0;s=Ug(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,1,m,((b[n>>1]|0)!=0&1)+((b[j>>1]|0)!=0&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;t=(s|0)>0?257:0;b[j>>1]=t>>>((i|0)!=0&o>>>0>i>>>0?o-i<<3:0);b[n>>1]=t>>>((q|0)!=0&r>>>0>q>>>0?r-q<<3:0);p=s;return p|0}case 2:{s=c[d+13584>>2]|0;q=g+4|0;r=c[d+13588>>2]|0;t=h+4|0;i=Ug(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,2,m,((c[n>>2]|0)!=0&1)+((c[j>>2]|0)!=0&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;o=(i|0)>0?16843009:0;c[j>>2]=o>>>((s|0)!=0&q>>>0>s>>>0?q-s<<3:0);c[n>>2]=o>>>((r|0)!=0&t>>>0>r>>>0?t-r<<3:0);p=i;return p|0}case 3:{i=c[d+13584>>2]|0;r=g+8|0;g=c[d+13588>>2]|0;t=h+8|0;h=j;o=n;s=Ug(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,3,m,(((c[o>>2]|0)!=0|(c[o+4>>2]|0)!=0)&1)+(((c[h>>2]|0)!=0|(c[h+4>>2]|0)!=0)&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;k=(s|0)>0;f=k?16843009:0;h=k?16843009:0;k=j;c[k>>2]=Nj(f|0,h|0,((i|0)!=0&r>>>0>i>>>0?r-i<<3:0)|0)|0;c[k+4>>2]=D;k=n;c[k>>2]=Nj(f|0,h|0,((g|0)!=0&t>>>0>g>>>0?t-g<<3:0)|0)|0;c[k+4>>2]=D;p=s;return p|0}default:{p=0;return p|0}}return 0}function Ug(e,f,g,h,i,j,k,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0;q=l;l=l+1024|0;r=q;s=j&255;t=16<<(s<<1);u=f<<24>>24>0&1;f=j<<24>>24==3&1;v=c[p>>2]|0;w=p+4|0;x=c[w>>2]|0;y=p+8|0;z=c[y>>2]|0;A=(e|0)!=0;if((t|0)<=0){B=0;C=x;D=v;E=z;c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}F=k+2|0;G=d[1536]|0;H=256-G|0;I=d[1552]|0;J=256-I|0;K=d[1553]|0;L=256-K|0;M=d[1568]|0;N=256-M|0;O=d[1569]|0;P=256-O|0;Q=d[1570]|0;R=256-Q|0;T=d[1584]|0;U=256-T|0;V=d[1585]|0;W=256-V|0;X=d[1586]|0;Y=256-X|0;Z=d[1587]|0;_=256-Z|0;$=j<<24>>24==0?2656:1632;j=0;aa=z;z=m;m=k;k=x;x=v;a:while(1){v=b[m>>1]|0;ba=d[$>>0]|0;ca=g+174+(s*432|0)+(h*216|0)+(u*108|0)+(ba*18|0)+(z*3|0)|0;da=e+10032+(s*576|0)+(h*288|0)+(u*144|0)+(ba*24|0)+(z<<2)|0;if(A)c[da>>2]=(c[da>>2]|0)+1;da=d[ca>>0]|0;ea=(256-da+(S(da,k)|0)|0)>>>8;da=ea<<24;if((aa|0)<0){c[p>>2]=x;c[y>>2]=aa;gc(p);fa=c[y>>2]|0;ga=c[p>>2]|0}else{fa=aa;ga=x}if(ga>>>0<da>>>0){ha=14;break}ia=k-ea|0;ja=d[1280+ia>>0]|0;ka=ia<<ja;ia=ga-da<<ja;da=fa-ja|0;b:do if(A){ja=ba;la=$;ma=j;na=da;oa=z;pa=v;qa=ca;ra=ka;sa=ia;while(1){ta=la+1|0;ua=d[qa+1>>0]|0;va=(256-ua+(S(ua,ra)|0)|0)>>>8;ua=va<<24;if((na|0)<0){c[p>>2]=sa;c[y>>2]=na;gc(p);wa=c[y>>2]|0;xa=c[p>>2]|0}else{wa=na;xa=sa}if(xa>>>0>=ua>>>0){ya=ja;za=ta;Aa=ma;Ba=wa;Ca=oa;Da=pa;Ea=qa;Fa=ra;Ga=ua;Ha=va;Ia=xa;break b}ua=d[1280+va>>0]|0;Ja=va<<ua;va=xa<<ua;Ka=wa-ua|0;ua=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ja*96|0)+(oa<<4)|0;c[ua>>2]=(c[ua>>2]|0)+1;ua=b[F>>1]|0;a[r+(b[n+(ma<<1)>>1]|0)>>0]=0;La=ma+1|0;if((La|0)>=(t|0)){B=La;C=Ja;D=va;E=Ka;ha=102;break a}Ma=La<<1;Na=((d[r+(b[o+(Ma<<1)>>1]|0)>>0]|0)+1+(d[r+(b[o+((Ma|1)<<1)>>1]|0)>>0]|0)|0)>>>1;Ma=d[ta>>0]|0;ja=Ma;la=ta;ma=La;na=Ka;oa=Na;pa=ua;qa=g+174+(s*432|0)+(h*216|0)+(u*108|0)+(Ma*18|0)+(Na*3|0)|0;ra=Ja;sa=va}}else{sa=ba;ra=$;qa=j;pa=da;oa=z;na=v;ma=ca;la=ka;ja=ia;while(1){va=ra+1|0;Ja=d[ma+1>>0]|0;Na=(256-Ja+(S(Ja,la)|0)|0)>>>8;Ja=Na<<24;if((pa|0)<0){c[p>>2]=ja;c[y>>2]=pa;gc(p);Oa=c[y>>2]|0;Pa=c[p>>2]|0}else{Oa=pa;Pa=ja}if(Pa>>>0>=Ja>>>0){ya=sa;za=va;Aa=qa;Ba=Oa;Ca=oa;Da=na;Ea=ma;Fa=la;Ga=Ja;Ha=Na;Ia=Pa;break b}Ja=d[1280+Na>>0]|0;Ma=Na<<Ja;Na=Pa<<Ja;ua=Oa-Ja|0;Ja=b[F>>1]|0;a[r+(b[n+(qa<<1)>>1]|0)>>0]=0;Ka=qa+1|0;if((Ka|0)>=(t|0)){B=Ka;C=Ma;D=Na;E=ua;ha=102;break a}La=Ka<<1;ta=((d[r+(b[o+(La<<1)>>1]|0)>>0]|0)+1+(d[r+(b[o+((La|1)<<1)>>1]|0)>>0]|0)|0)>>>1;La=d[va>>0]|0;sa=La;ra=va;qa=Ka;pa=ua;oa=ta;na=Ja;ma=g+174+(s*432|0)+(h*216|0)+(u*108|0)+(La*18|0)+(ta*3|0)|0;la=Ma;ja=Na}}while(0);ia=Fa-Ha|0;ka=d[1280+ia>>0]|0;ca=ia<<ka;ia=Ia-Ga<<ka;v=Ba-ka|0;ka=Ea+2|0;da=d[ka>>0]|0;ja=(256-da+(S(ca,da)|0)|0)>>>8;da=ja<<24;if((v|0)<0){c[p>>2]=ia;c[y>>2]=v;gc(p);Qa=c[y>>2]|0;Ra=c[p>>2]|0}else{Qa=v;Ra=ia}do if(Ra>>>0<da>>>0){ia=d[1280+ja>>0]|0;v=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ya*96|0)+(Ca<<4)+4|0;if(A)c[v>>2]=(c[v>>2]|0)+1;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=1;Sa=Qa-ia|0;Ta=Da<<16>>16;Ua=ja<<ia;Va=Ra<<ia}else{ia=ca-ja|0;v=d[1280+ia>>0]|0;la=ia<<v;ia=Ra-da<<v;ma=Qa-v|0;v=(d[ka>>0]|0)+-1|0;na=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ya*96|0)+(Ca<<4)+8|0;if(A)c[na>>2]=(c[na>>2]|0)+1;na=d[22614+(v<<3)>>0]|0;oa=(256-na+(S(na,la)|0)|0)>>>8;na=oa<<24;if((ma|0)<0){c[p>>2]=ia;c[y>>2]=ma;gc(p);Wa=c[y>>2]|0;Xa=c[p>>2]|0}else{Wa=ma;Xa=ia}if(Xa>>>0<na>>>0){ia=d[1280+oa>>0]|0;ma=oa<<ia;pa=Xa<<ia;qa=Wa-ia|0;ia=d[22614+(v<<3)+1>>0]|0;ra=(256-ia+(S(ma,ia)|0)|0)>>>8;ia=ra<<24;if((qa|0)<0){c[p>>2]=pa;c[y>>2]=qa;gc(p);Ya=c[y>>2]|0;Za=c[p>>2]|0}else{Ya=qa;Za=pa}if(Za>>>0<ia>>>0){pa=d[1280+ra>>0]|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=2;Sa=Ya-pa|0;Ta=Da<<16>>16<<1;Ua=ra<<pa;Va=Za<<pa;break}pa=ma-ra|0;ra=d[1280+pa>>0]|0;ma=pa<<ra;pa=Za-ia<<ra;ia=Ya-ra|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=3;ra=d[22614+(v<<3)+2>>0]|0;qa=(256-ra+(S(ra,ma)|0)|0)>>>8;ra=qa<<24;if((ia|0)<0){c[p>>2]=pa;c[y>>2]=ia;gc(p);_a=c[y>>2]|0;$a=c[p>>2]|0}else{_a=ia;$a=pa}if($a>>>0<ra>>>0){pa=d[1280+qa>>0]|0;ab=pa;bb=3;cb=qa<<pa;db=$a}else{pa=ma-qa|0;qa=d[1280+pa>>0]|0;ab=qa;bb=4;cb=pa<<qa;db=$a-ra|0}Sa=_a-ab|0;Ta=S(bb,Da<<16>>16)|0;Ua=cb;Va=db<<ab;break}ra=la-oa|0;oa=d[1280+ra>>0]|0;la=ra<<oa;ra=Xa-na<<oa;na=Wa-oa|0;oa=d[22614+(v<<3)+3>>0]|0;qa=(256-oa+(S(la,oa)|0)|0)>>>8;oa=qa<<24;if((na|0)<0){c[p>>2]=ra;c[y>>2]=na;gc(p);eb=c[y>>2]|0;fb=c[p>>2]|0}else{eb=na;fb=ra}c:do if(fb>>>0<oa>>>0){ra=d[1280+qa>>0]|0;na=qa<<ra;pa=fb<<ra;ma=eb-ra|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=4;ra=d[22614+(v<<3)+4>>0]|0;ia=(256-ra+(S(ra,na)|0)|0)>>>8;ra=ia<<24;if((ma|0)<0){c[p>>2]=pa;c[y>>2]=ma;gc(p);gb=c[y>>2]|0;hb=c[p>>2]|0}else{gb=ma;hb=pa}if(hb>>>0<ra>>>0){pa=d[1280+ia>>0]|0;ma=ia<<pa;sa=hb<<pa;Na=gb-pa|0;pa=(H+(S(G,ma)|0)|0)>>>8;Ma=pa<<24;if((Na|0)<0){c[p>>2]=sa;c[y>>2]=Na;gc(p);ib=c[y>>2]|0;jb=c[p>>2]|0}else{ib=Na;jb=sa}if(jb>>>0<Ma>>>0){sa=d[1280+pa>>0]|0;kb=sa;lb=0;mb=pa<<sa;nb=jb}else{sa=ma-pa|0;pa=d[1280+sa>>0]|0;kb=pa;lb=1;mb=sa<<pa;nb=jb-Ma|0}ob=5;pb=lb;qb=ib-kb|0;rb=mb;sb=nb<<kb;break}Ma=na-ia|0;ia=d[1280+Ma>>0]|0;na=Ma<<ia;Ma=hb-ra<<ia;ra=gb-ia|0;ia=(J+(S(I,na)|0)|0)>>>8;pa=ia<<24;if((ra|0)<0){c[p>>2]=Ma;c[y>>2]=ra;gc(p);tb=c[y>>2]|0;ub=c[p>>2]|0}else{tb=ra;ub=Ma}if(ub>>>0<pa>>>0){Ma=d[1280+ia>>0]|0;vb=Ma;wb=0;xb=ia<<Ma;yb=ub}else{Ma=na-ia|0;ia=d[1280+Ma>>0]|0;vb=ia;wb=2;xb=Ma<<ia;yb=ub-pa|0}pa=yb<<vb;ia=tb-vb|0;Ma=(L+(S(K,xb)|0)|0)>>>8;na=Ma<<24;if((ia|0)<0){c[p>>2]=pa;c[y>>2]=ia;gc(p);zb=c[y>>2]|0;Ab=c[p>>2]|0}else{zb=ia;Ab=pa}if(Ab>>>0<na>>>0){pa=d[1280+Ma>>0]|0;Bb=pa;Cb=0;Db=Ma<<pa;Eb=Ab}else{pa=xb-Ma|0;Ma=d[1280+pa>>0]|0;Bb=Ma;Cb=1;Db=pa<<Ma;Eb=Ab-na|0}ob=7;pb=Cb|wb;qb=zb-Bb|0;rb=Db;sb=Eb<<Bb}else{na=la-qa|0;Ma=d[1280+na>>0]|0;pa=na<<Ma;na=fb-oa<<Ma;ia=eb-Ma|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=5;Ma=d[22614+(v<<3)+5>>0]|0;ra=(256-Ma+(S(Ma,pa)|0)|0)>>>8;Ma=ra<<24;if((ia|0)<0){c[p>>2]=na;c[y>>2]=ia;gc(p);Fb=c[y>>2]|0;Gb=c[p>>2]|0}else{Fb=ia;Gb=na}if(Gb>>>0>=Ma>>>0){na=pa-ra|0;pa=d[1280+na>>0]|0;ia=na<<pa;na=Gb-Ma<<pa;Ma=Fb-pa|0;pa=d[22614+(v<<3)+7>>0]|0;sa=(256-pa+(S(ia,pa)|0)|0)>>>8;pa=sa<<24;if((Ma|0)<0){c[p>>2]=na;c[y>>2]=Ma;gc(p);Hb=c[y>>2]|0;Ib=c[p>>2]|0}else{Hb=Ma;Ib=na}if(Ib>>>0<pa>>>0){na=d[1280+sa>>0]|0;Ma=Hb-na|0;ma=0;Na=sa<<na;ta=0;La=Ib<<na;while(1){na=d[1600+ma>>0]|0;Ja=(256-na+(S(na,Na)|0)|0)>>>8;na=Ja<<24;if((Ma|0)<0){c[p>>2]=La;c[y>>2]=Ma;gc(p);Jb=c[y>>2]|0;Kb=c[p>>2]|0}else{Jb=Ma;Kb=La}if(Kb>>>0<na>>>0){ua=d[1280+Ja>>0]|0;Lb=ua;Mb=0;Nb=Ja<<ua;Ob=Kb}else{ua=Na-Ja|0;Ja=d[1280+ua>>0]|0;Lb=Ja;Mb=1;Nb=ua<<Ja;Ob=Kb-na|0}na=Ob<<Lb;Ja=Jb-Lb|0;ua=Mb|ta<<1;ma=ma+1|0;if((ma|0)==5){ob=35;pb=ua;qb=Ja;rb=Nb;sb=na;break c}else{Ma=Ja;Na=Nb;ta=ua;La=na}}}else{La=ia-sa|0;ta=d[1280+La>>0]|0;Na=Hb-ta|0;Ma=0;ma=La<<ta;La=0;na=Ib-pa<<ta;while(1){ta=d[1616+Ma>>0]|0;ua=(256-ta+(S(ta,ma)|0)|0)>>>8;ta=ua<<24;if((Na|0)<0){c[p>>2]=na;c[y>>2]=Na;gc(p);Pb=c[y>>2]|0;Qb=c[p>>2]|0}else{Pb=Na;Qb=na}if(Qb>>>0<ta>>>0){Ja=d[1280+ua>>0]|0;Rb=Ja;Sb=0;Tb=ua<<Ja;Ub=Qb}else{Ja=ma-ua|0;ua=d[1280+Ja>>0]|0;Rb=ua;Sb=1;Tb=Ja<<ua;Ub=Qb-ta|0}ta=Ub<<Rb;ua=Pb-Rb|0;Ja=Sb|La<<1;Ma=Ma+1|0;if((Ma|0)==14){ob=67;pb=Ja;qb=ua;rb=Tb;sb=ta;break c}else{Na=ua;ma=Tb;La=Ja;na=ta}}}}na=d[1280+ra>>0]|0;La=ra<<na;ma=Gb<<na;Na=Fb-na|0;na=d[22614+(v<<3)+6>>0]|0;Ma=(256-na+(S(La,na)|0)|0)>>>8;na=Ma<<24;if((Na|0)<0){c[p>>2]=ma;c[y>>2]=Na;gc(p);Vb=c[y>>2]|0;Wb=c[p>>2]|0}else{Vb=Na;Wb=ma}if(Wb>>>0<na>>>0){ma=d[1280+Ma>>0]|0;Na=Ma<<ma;pa=Wb<<ma;sa=Vb-ma|0;ma=(N+(S(M,Na)|0)|0)>>>8;ia=ma<<24;if((sa|0)<0){c[p>>2]=pa;c[y>>2]=sa;gc(p);Xb=c[y>>2]|0;Yb=c[p>>2]|0}else{Xb=sa;Yb=pa}if(Yb>>>0<ia>>>0){pa=d[1280+ma>>0]|0;Zb=pa;_b=0;$b=ma<<pa;ac=Yb}else{pa=Na-ma|0;ma=d[1280+pa>>0]|0;Zb=ma;_b=4;$b=pa<<ma;ac=Yb-ia|0}ia=ac<<Zb;ma=Xb-Zb|0;pa=(P+(S(O,$b)|0)|0)>>>8;Na=pa<<24;if((ma|0)<0){c[p>>2]=ia;c[y>>2]=ma;gc(p);bc=c[y>>2]|0;cc=c[p>>2]|0}else{bc=ma;cc=ia}if(cc>>>0<Na>>>0){ia=d[1280+pa>>0]|0;dc=ia;ec=0;fc=pa<<ia;hc=cc}else{ia=$b-pa|0;pa=d[1280+ia>>0]|0;dc=pa;ec=2;fc=ia<<pa;hc=cc-Na|0}Na=hc<<dc;pa=bc-dc|0;ia=(R+(S(Q,fc)|0)|0)>>>8;ma=ia<<24;if((pa|0)<0){c[p>>2]=Na;c[y>>2]=pa;gc(p);ic=c[y>>2]|0;jc=c[p>>2]|0}else{ic=pa;jc=Na}if(jc>>>0<ma>>>0){Na=d[1280+ia>>0]|0;kc=Na;lc=0;mc=ia<<Na;nc=jc}else{Na=fc-ia|0;ia=d[1280+Na>>0]|0;kc=ia;lc=1;mc=Na<<ia;nc=jc-ma|0}ob=11;pb=lc|(ec|_b);qb=ic-kc|0;rb=mc;sb=nc<<kc;break}ma=La-Ma|0;Ma=d[1280+ma>>0]|0;La=ma<<Ma;ma=Wb-na<<Ma;na=Vb-Ma|0;Ma=(U+(S(T,La)|0)|0)>>>8;ia=Ma<<24;if((na|0)<0){c[p>>2]=ma;c[y>>2]=na;gc(p);oc=c[y>>2]|0;pc=c[p>>2]|0}else{oc=na;pc=ma}if(pc>>>0<ia>>>0){ma=d[1280+Ma>>0]|0;qc=ma;rc=0;sc=Ma<<ma;tc=pc}else{ma=La-Ma|0;Ma=d[1280+ma>>0]|0;qc=Ma;rc=8;sc=ma<<Ma;tc=pc-ia|0}ia=tc<<qc;Ma=oc-qc|0;ma=(W+(S(V,sc)|0)|0)>>>8;La=ma<<24;if((Ma|0)<0){c[p>>2]=ia;c[y>>2]=Ma;gc(p);uc=c[y>>2]|0;vc=c[p>>2]|0}else{uc=Ma;vc=ia}if(vc>>>0<La>>>0){ia=d[1280+ma>>0]|0;wc=ia;xc=0;yc=ma<<ia;zc=vc}else{ia=sc-ma|0;ma=d[1280+ia>>0]|0;wc=ma;xc=4;yc=ia<<ma;zc=vc-La|0}La=zc<<wc;ma=uc-wc|0;ia=(Y+(S(X,yc)|0)|0)>>>8;Ma=ia<<24;if((ma|0)<0){c[p>>2]=La;c[y>>2]=ma;gc(p);Ac=c[y>>2]|0;Bc=c[p>>2]|0}else{Ac=ma;Bc=La}if(Bc>>>0<Ma>>>0){La=d[1280+ia>>0]|0;Cc=La;Dc=0;Ec=ia<<La;Fc=Bc}else{La=yc-ia|0;ia=d[1280+La>>0]|0;Cc=ia;Dc=2;Ec=La<<ia;Fc=Bc-Ma|0}Ma=Fc<<Cc;ia=Ac-Cc|0;La=(_+(S(Z,Ec)|0)|0)>>>8;ma=La<<24;if((ia|0)<0){c[p>>2]=Ma;c[y>>2]=ia;gc(p);Gc=c[y>>2]|0;Hc=c[p>>2]|0}else{Gc=ia;Hc=Ma}if(Hc>>>0<ma>>>0){Ma=d[1280+La>>0]|0;Ic=Ma;Jc=0;Kc=La<<Ma;Lc=Hc}else{Ma=Ec-La|0;La=d[1280+Ma>>0]|0;Ic=La;Jc=1;Kc=Ma<<La;Lc=Hc-ma|0}ob=19;pb=Jc|(Dc|(xc|rc));qb=Gc-Ic|0;rb=Kc;sb=Lc<<Ic}while(0);Sa=qb;Ta=S(pb+ob|0,Da<<16>>16)|0;Ua=rb;Va=sb}while(0);ka=Ta>>f;da=((Ua<<7)+128|0)>>>8;ja=da<<24;if((Sa|0)<0){c[p>>2]=Va;c[y>>2]=Sa;gc(p);Mc=c[y>>2]|0;Nc=c[p>>2]|0}else{Mc=Sa;Nc=Va}if(Nc>>>0<ja>>>0){ca=d[1280+da>>0]|0;Oc=ka;Pc=ca;Qc=da<<ca;Rc=Nc<<ca}else{ca=Ua-da|0;da=d[1280+ca>>0]|0;Oc=0-ka|0;Pc=da;Qc=ca<<da;Rc=Nc-ja<<da}da=Mc-Pc|0;b[i+(b[n+(Aa<<1)>>1]<<1)>>1]=Oc;ja=Aa+1|0;ca=ja<<1;if((ja|0)<(t|0)){$=za;j=ja;aa=da;z=((d[r+(b[o+(ca<<1)>>1]|0)>>0]|0)+1+(d[r+(b[o+((ca|1)<<1)>>1]|0)>>0]|0)|0)>>>1;m=F;k=Qc;x=Rc}else{B=ja;C=Qc;D=Rc;E=da;ha=102;break}}if((ha|0)==14){Rc=d[1280+ea>>0]|0;Qc=ea<<Rc;ea=ga<<Rc;ga=fa-Rc|0;Rc=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ba*96|0)+(z<<4)+12|0;if(!A){B=j;C=Qc;D=ea;E=ga;c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}c[Rc>>2]=(c[Rc>>2]|0)+1;B=j;C=Qc;D=ea;E=ga;c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}else if((ha|0)==102){c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}return 0}function Vg(a){a=a|0;cj((c[a+12>>2]|0)+40|0)|0;return}function Wg(a){a=a|0;$i((c[a+12>>2]|0)+40|0)|0;return}function Xg(a){a=a|0;mj((c[a+12>>2]|0)+68|0)|0;return}function Yg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;e=l;l=l+16|0;f=e;if(!b){l=e;return}g=b+152|0;h=b+140|0;if((c[g>>2]|0)>=(d|0)?(c[h>>2]|0)!=1:0){l=e;return}i=(c[b+148>>2]|0)+12|0;j=c[i>>2]|0;k=c[j>>2]|0;m=j+40|0;cj(m)|0;n=k+17868|0;a:do if((c[g>>2]|0)<(d|0)){k=j+68|0;while(1){if((c[n>>2]|0)!=(b|0)){o=9;break a}if((c[h>>2]|0)==1){o=10;break a}wj(k,m)|0;if((c[g>>2]|0)>=(d|0)){o=9;break}}}else o=9;while(0);if((o|0)==9?(c[h>>2]|0)==1:0)o=10;if((o|0)==10){o=c[a+12>>2]|0;$i((c[i>>2]|0)+40|0)|0;h=(c[o>>2]|0)+432|0;c[f>>2]=a;Ub(h,7,31109,f)}$i((c[i>>2]|0)+40|0)|0;l=e;return}function Zg(a,b){a=a|0;b=b|0;var d=0;d=(c[a+148>>2]|0)+12|0;cj((c[d>>2]|0)+40|0)|0;c[a+152>>2]=b;mj((c[d>>2]|0)+68|0)|0;$i((c[d>>2]|0)+40|0)|0;return}function _g(d,f){d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;g=f+12|0;f=c[g>>2]|0;h=c[d+12>>2]|0;d=c[f>>2]|0;i=c[h>>2]|0;j=f+40|0;cj(j)|0;k=f+116|0;if(!(c[k>>2]|0)){l=f+68|0;do wj(l,j)|0;while(!(c[k>>2]|0))}k=d+4412|0;c[i+1200>>2]=c[((a[k>>0]|0)==0?d+1200|0:d+1204|0)>>2];c[(c[h>>2]|0)+18728>>2]=c[(c[f>>2]|0)+18728>>2];$i((c[g>>2]|0)+40|0)|0;c[i+17784>>2]=c[d+17784>>2];g=c[d+1008>>2]|0;c[i+724>>2]=c[((g|0)==0?d+728|0:d+724|0)>>2];f=(g|0)!=0;c[i+704>>2]=c[(f?d+704|0:d+688|0)>>2];c[i+708>>2]=c[(f?d+708|0:d+692|0)>>2];c[i+712>>2]=c[d+712>>2];c[i+716>>2]=c[d+716>>2];c[i+996>>2]=c[d+996>>2];c[i+1004>>2]=c[(f?d+1004|0:d+1e3|0)>>2];c[i+732>>2]=c[d+764>>2];c[i+736>>2]=c[d+768>>2];c[i+740>>2]=c[d+772>>2];c[i+744>>2]=c[d+776>>2];c[i+748>>2]=c[d+780>>2];c[i+752>>2]=c[d+784>>2];c[i+756>>2]=c[d+788>>2];c[i+760>>2]=c[d+792>>2];Qj(i+1216|0,d+1216|0,3072)|0;c[i+4384>>2]=c[d+4380>>2];c[i+4372>>2]=c[d+4372>>2];f=i+4390|0;g=d+4390|0;h=e[g>>1]|e[g+2>>1]<<16;b[f>>1]=h;b[f+2>>1]=h>>>16;b[i+4398>>1]=b[d+4398>>1]|0;h=i+4412|0;f=k;k=h+116|0;do{c[h>>2]=c[f>>2];h=h+4|0;f=f+4|0}while((h|0)<(k|0));Qj(c[i+4544>>2]|0,c[d+4544>>2]|0,8176)|0;return}function $g(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0;b=l;l=l+32|0;d=b+8|0;e=b;f=4;g=Bj(40)|0;c[g>>2]=0;h=b+16|0;i=b+12|0;o=0;j=ja(27,32,18736)|0;k=o;o=0;if((k|0)!=0&(p|0)!=0){m=Oj(c[k>>2]|0,g|0,f|0)|0;if(!m)ya(k|0,p|0);D=p}else m=-1;if((m|0)!=1){nb(c,h>>2,j)|0;if(!(mb(c,h>>2)|0))n=0;else n=(mb(c,h>>2)|0)+432|0;nb(c,i>>2,n)|0;if(!(mb(c,i>>2)|0)){q=i;r=0;Cj(g|0);l=b;return r|0}Jj(mb(c,h>>2)|0,0,18736)|0;g=Lj((mb(c,i>>2)|0)+92|0,1,g|0,f|0)|0;f=D;o=0;n=o;o=0;if((n|0)!=0&(p|0)!=0){s=Oj(c[n>>2]|0,g|0,f|0)|0;if(!s)ya(n|0,p|0);D=p}else s=-1;if((s|0)==1){t=D;u=i}else{t=0;u=i}}else{t=D;u=0}while(1){s=(mb(c,i>>2)|0)+88|0;if(t|0){c[s>>2]=0;n=mb(c,h>>2)|0;o=0;ca(6,n|0);n=o;o=0;if((n|0)!=0&(p|0)!=0){v=Oj(c[n>>2]|0,g|0,f|0)|0;if(!v)ya(n|0,p|0);D=p}else v=-1;if((v|0)==1){w=u;t=D;u=w;continue}else{x=9;break}}c[s>>2]=1;o=0;s=ja(28,1,2044)|0;n=o;o=0;if((n|0)!=0&(p|0)!=0){y=Oj(c[n>>2]|0,g|0,f|0)|0;if(!y)ya(n|0,p|0);D=p}else y=-1;if((y|0)==1){w=u;t=D;u=w;continue}c[(mb(c,i>>2)|0)+4108>>2]=s;if(!(c[(mb(c,i>>2)|0)+4108>>2]|0)){s=mb(c,i>>2)|0;o=0;la(54,s|0,2,31142,e|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){z=Oj(c[s>>2]|0,g|0,f|0)|0;if(!z)ya(s|0,p|0);D=p}else z=-1;if((z|0)==1){w=u;t=D;u=w;continue}}o=0;s=ja(28,4,2044)|0;n=o;o=0;if((n|0)!=0&(p|0)!=0){A=Oj(c[n>>2]|0,g|0,f|0)|0;if(!A)ya(n|0,p|0);D=p}else A=-1;if((A|0)==1){w=u;t=D;u=w;continue}c[(mb(c,i>>2)|0)+4112>>2]=s;if(!(c[(mb(c,i>>2)|0)+4112>>2]|0)){s=mb(c,i>>2)|0;o=0;la(54,s|0,2,31168,d|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){B=Oj(c[s>>2]|0,g|0,f|0)|0;if(!B)ya(s|0,p|0);D=p}else B=-1;if((B|0)==1){w=u;t=D;u=w;continue}}c[(mb(c,h>>2)|0)+18728>>2]=1;o=0;ja(29,35064,5)|0;s=o;o=0;if((s|0)!=0&(p|0)!=0){C=Oj(c[s>>2]|0,g|0,f|0)|0;if(!C)ya(s|0,p|0);D=p}else C=-1;if((C|0)==1){w=u;t=D;u=w;continue}s=(mb(c,i>>2)|0)+300|0;c[s>>2]=-1;c[s+4>>2]=-1;c[s+8>>2]=-1;c[s+12>>2]=-1;c[s+16>>2]=-1;c[s+20>>2]=-1;c[s+24>>2]=-1;c[s+28>>2]=-1;s=(mb(c,i>>2)|0)+332|0;c[s>>2]=-1;c[s+4>>2]=-1;c[s+8>>2]=-1;c[s+12>>2]=-1;c[s+16>>2]=-1;c[s+20>>2]=-1;c[s+24>>2]=-1;c[s+28>>2]=-1;c[(mb(c,i>>2)|0)+17344>>2]=0;c[(mb(c,h>>2)|0)+17856>>2]=1;c[(mb(c,h>>2)|0)+17836>>2]=a;c[(mb(c,i>>2)|0)+17352>>2]=8;c[(mb(c,i>>2)|0)+17356>>2]=8;c[(mb(c,i>>2)|0)+720>>2]=30;c[(mb(c,i>>2)|0)+724>>2]=7;c[(mb(c,i>>2)|0)+728>>2]=8;s=mb(c,i>>2)|0;o=0;ca(9,s|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){E=Oj(c[s>>2]|0,g|0,f|0)|0;if(!E)ya(s|0,p|0);D=p}else E=-1;if((E|0)==1){w=u;t=D;u=w;continue}c[(mb(c,i>>2)|0)+88>>2]=0;o=0;s=ba(1)|0;n=o;o=0;if((n|0)!=0&(p|0)!=0){F=Oj(c[n>>2]|0,g|0,f|0)|0;if(!F)ya(n|0,p|0);D=p}else F=-1;if((F|0)==1){w=u;t=D;u=w;continue}n=c[s>>2]|0;s=(mb(c,h>>2)|0)+17876|0;o=0;ca(n|0,s|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){G=Oj(c[s>>2]|0,g|0,f|0)|0;if(!G)ya(s|0,p|0);D=p}else G=-1;if((G|0)==1){w=u;t=D;u=w}else{x=22;break}}if((x|0)==9){q=u;r=0;Cj(g|0);l=b;return r|0}else if((x|0)==22){q=u;r=mb(c,h>>2)|0;Cj(g|0);l=b;return r|0}return 0}function ah(a){a=a|0;var b=0,d=0,e=0,f=0;if(!a)return;zb[c[(we()|0)+20>>2]&31](a+17876|0);Yb(c[a+17888>>2]|0);b=a+18676|0;d=a+17900|0;if((c[b>>2]|0)>0){e=0;do{f=(c[d>>2]|0)+(e*24|0)|0;zb[c[(we()|0)+20>>2]&31](f);e=e+1|0}while((e|0)<(c[b>>2]|0))}Yb(c[a+17904>>2]|0);Yb(c[d>>2]|0);if((c[b>>2]|0)>0)Lf(a+18684|0);Yb(a);return}function bh(){if(mb(c,8767)|0)return;gf();ne();bc();Xf();nb(c,8767,1)|0;return}function ch(a,b){a=a|0;b=b|0;var d=0,e=0;d=Xb(b,68)|0;c[a+704>>2]=d;if(!d){e=1;return e|0}c[a+700>>2]=b;d=Xb(b,4)|0;c[a+732>>2]=d;e=(d|0)==0&1;return e|0}function dh(a){a=a|0;var b=0;b=a+704|0;Yb(c[b>>2]|0);c[b>>2]=0;b=a+732|0;Yb(c[b>>2]|0);c[b>>2]=0;return}function eh(a){a=a|0;var b=0,d=0;b=c[a+612>>2]|0;c[a+708>>2]=(c[a+704>>2]|0)+(b*68|0)+68;d=c[a+732>>2]|0;c[a+736>>2]=d+(b<<2)+4;Jj(d|0,0,S(b<<2,(c[a+600>>2]|0)+1|0)|0)|0;return}function fh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+32|0;f=e+16|0;g=e+8|0;h=e;i=a+432|0;do if((b|0)==1){j=c[a+732>>2]|0;if((j|0)<0){Ub(i,1,31206,h);k=1;l=e;return k|0}m=c[a+17836>>2]|0;n=m+40+(j*160|0)+28|0;if((((c[m+40+(j*160|0)+32>>2]|0)==(c[d+4>>2]|0)?(c[n>>2]|0)==(c[d>>2]|0):0)?(c[m+40+(j*160|0)+52>>2]|0)==(c[d+24>>2]|0):0)?(c[m+40+(j*160|0)+48>>2]|0)==(c[d+20>>2]|0):0){ac(n,d);break}Ub(i,1,31232,g)}else Ub(i,1,31260,f);while(0);k=c[i>>2]|0;l=e;return k|0}function gh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+32|0;f=e+16|0;g=e+8|0;switch(b|0){case 1:{h=0;break}case 2:{h=1;break}case 4:{h=2;break}default:{Ub(a,1,31260,e);i=c[a>>2]|0;l=e;return i|0}}b=c[a+300+(h<<2)>>2]|0;if(b>>>0>14){Ub(a,1,31284,g);i=c[a>>2]|0;l=e;return i|0}g=c[a+17404>>2]|0;h=g+40+(b*160|0)+28|0;if((((c[g+40+(b*160|0)+32>>2]|0)==(c[d+4>>2]|0)?(c[h>>2]|0)==(c[d>>2]|0):0)?(c[g+40+(b*160|0)+52>>2]|0)==(c[d+24>>2]|0):0)?(c[g+40+(b*160|0)+48>>2]|0)==(c[d+20>>2]|0):0){ac(d,h);i=c[a>>2]|0;l=e;return i|0}Ub(a,1,31232,f);i=c[a>>2]|0;l=e;return i|0}function hh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,da=0,fa=0,ga=0,ha=0,ia=0;f=l;l=l+16|0;g=f;h=4;i=Bj(40)|0;c[i>>2]=0;j=f+12|0;k=f+8|0;m=f+4|0;nb(c,j>>2,b+432|0)|0;nb(c,k>>2,c[(mb(c,j>>2)|0)+17404>>2]|0)|0;nb(c,m>>2,(c[(mb(c,j>>2)|0)+17404>>2]|0)+40|0)|0;n=c[e>>2]|0;c[(mb(c,j>>2)|0)>>2]=0;if((d|0)==0?(c[(mb(c,j>>2)|0)+364>>2]|0)>0:0)c[(c[(mb(c,j>>2)|0)+368>>2]|0)+112>>2]=1;q=b+17856|0;c[q>>2]=0;r=b+17864|0;if(((c[r>>2]|0)==0?(c[(mb(c,j>>2)|0)+556>>2]|0)>-1:0)?(s=mb(c,m>>2)|0,(c[s+((c[(mb(c,j>>2)|0)+556>>2]|0)*160|0)>>2]|0)==0):0){s=c[(mb(c,k>>2)|0)+36>>2]|0;t=c[(mb(c,k>>2)|0)+28>>2]|0;u=mb(c,m>>2)|0;v=u+((c[(mb(c,j>>2)|0)+556>>2]|0)*160|0)+16|0;o=0;ja(s|0,t|0,v|0)|0;v=o;o=0;if((v|0)!=0&(p|0)!=0){w=Oj(c[v>>2]|0,i|0,h|0)|0;if(!w)ya(v|0,p|0);D=p}else w=-1;if((w|0)==1){x=D;y=0}else z=9}else z=9;do if((z|0)==9){w=(mb(c,j>>2)|0)+17404|0;v=c[w>>2]|0;o=0;ca(10,v|0);t=o;o=0;if((t|0)!=0&(p|0)!=0){A=Oj(c[t>>2]|0,i|0,h|0)|0;if(!A)ya(t|0,p|0);D=p}else A=-1;if((A|0)!=1){if(c[v+40>>2]|0)if(c[v+200>>2]|0)if(c[v+360>>2]|0)if(c[v+520>>2]|0)if(c[v+680>>2]|0)if(c[v+840>>2]|0)if(c[v+1e3>>2]|0)if(c[v+1160>>2]|0)if(c[v+1320>>2]|0)if(c[v+1480>>2]|0)if(c[v+1640>>2]|0)if(c[v+1800>>2]|0)if(c[v+1960>>2]|0)if(c[v+2120>>2]|0)if(!(c[v+2280>>2]|0)){B=14;z=12}else C=-1;else{B=13;z=12}else{B=12;z=12}else{B=11;z=12}else{B=10;z=12}else{B=9;z=12}else{B=8;z=12}else{B=7;z=12}else{B=6;z=12}else{B=5;z=12}else{B=4;z=12}else{B=3;z=12}else{B=2;z=12}else{B=1;z=12}else{B=0;z=12}if((z|0)==12){c[v+40+(B*160|0)>>2]=1;C=B}o=0;ca(11,c[w>>2]|0);w=o;o=0;if((w|0)!=0&(p|0)!=0){E=Oj(c[w>>2]|0,i|0,h|0)|0;if(!E)ya(w|0,p|0);D=p}else E=-1;if((E|0)!=1){c[(mb(c,j>>2)|0)+556>>2]=C;if((c[(mb(c,j>>2)|0)+556>>2]|0)==-1){w=mb(c,j>>2)|0;o=0;la(54,w|0,2,31312,g|0);w=o;o=0;if((w|0)!=0&(p|0)!=0){F=Oj(c[w>>2]|0,i|0,h|0)|0;if(!F)ya(w|0,p|0);D=p}else F=-1;if((F|0)==1){x=D;y=0;break}G=c[(mb(c,j>>2)|0)>>2]|0;Cj(i|0);l=f;return G|0}w=mb(c,k>>2)|0;v=w+40+((c[(mb(c,j>>2)|0)+556>>2]|0)*160|0)|0;c[(mb(c,j>>2)|0)+296>>2]=v;v=b+18732|0;c[v>>2]=0;if(c[r>>2]|0){w=c[b+17872>>2]|0;o=0;ca(12,w|0);t=o;o=0;if((t|0)!=0&(p|0)!=0){H=Oj(c[t>>2]|0,i|0,h|0)|0;if(!H)ya(t|0,p|0);D=p}else H=-1;if((H|0)==1){x=D;y=v;break}t=mb(c,m>>2)|0;c[t+((c[(mb(c,j>>2)|0)+556>>2]|0)*160|0)+148>>2]=w;t=mb(c,m>>2)|0;s=c[(mb(c,j>>2)|0)+556>>2]|0;c[b+17868>>2]=t+(s*160|0);c[t+(s*160|0)+152>>2]=-1;c[t+(s*160|0)+156>>2]=-1;o=0;ca(13,w|0);w=o;o=0;if((w|0)!=0&(p|0)!=0){I=Oj(c[w>>2]|0,i|0,h|0)|0;if(!I)ya(w|0,p|0);D=p}else I=-1;if((I|0)==1){x=D;y=v;break}}else{w=mb(c,m>>2)|0;c[b+17868>>2]=w+((c[(mb(c,j>>2)|0)+556>>2]|0)*160|0)}i=Lj((mb(c,j>>2)|0)+92|0,1,i|0,h|0)|0;h=D;o=0;w=o;o=0;if((w|0)!=0&(p|0)!=0){J=Oj(c[w>>2]|0,i|0,h|0)|0;if(!J)ya(w|0,p|0);D=p}else J=-1;if((J|0)==1){x=D;y=v}else{x=0;y=v}}else{x=D;y=0}}else{x=D;y=0}}while(0);a:while(1){if(x|0){o=0;J=ba(1)|0;I=o;o=0;if((I|0)!=0&(p|0)!=0){K=Oj(c[I>>2]|0,i|0,h|0)|0;if(!K)ya(I|0,p|0);D=p}else K=-1;if((K|0)==1){L=y;x=D;y=L;continue}c[(mb(c,j>>2)|0)+88>>2]=0;c[q>>2]=1;I=J+8|0;o=0;ea(c[I>>2]|0,b+17876|0)|0;J=o;o=0;if((J|0)!=0&(p|0)!=0){M=Oj(c[J>>2]|0,i|0,h|0)|0;if(!M)ya(J|0,p|0);D=p}else M=-1;if((M|0)==1){L=y;x=D;y=L;continue}J=b+18676|0;if((c[J>>2]|0)>0){H=b+17900|0;F=0;while(1){o=0;ea(c[I>>2]|0,(c[H>>2]|0)+(F*24|0)|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){N=Oj(c[g>>2]|0,i|0,h|0)|0;if(!N)ya(g|0,p|0);D=p}else N=-1;if((N|0)==1){L=y;x=D;y=L;continue a}F=F+1|0;if((F|0)>=(c[J>>2]|0))break}}J=mb(c,k>>2)|0;o=0;ca(10,J|0);J=o;o=0;if((J|0)!=0&(p|0)!=0){O=Oj(c[J>>2]|0,i|0,h|0)|0;if(!O)ya(J|0,p|0);D=p}else O=-1;if((O|0)==1){L=y;x=D;y=L;continue}if((c[y>>2]|0)==1){J=c[b+17860>>2]|0;if(J){F=J;J=0;while(1){H=c[(mb(c,j>>2)|0)+300+(J<<2)>>2]|0;I=mb(c,m>>2)|0;g=mb(c,k>>2)|0;C=(H|0)>-1;if(((C?(E=I+(H*160|0)|0,B=c[E>>2]|0,(B|0)>0):0)?(A=B+-1|0,c[E>>2]=A,(A|0)==0):0)?c[I+(H*160|0)+24>>2]|0:0){o=0;ja(c[g+36>>2]|0,c[g+28>>2]|0,I+(H*160|0)+16|0)|0;I=o;o=0;if((I|0)!=0&(p|0)!=0){P=Oj(c[I>>2]|0,i|0,h|0)|0;if(!P)ya(I|0,p|0);D=p}else P=-1;if((P|0)==1){L=y;x=D;y=L;continue a}}do if(((F&1|0?(I=mb(c,m>>2)|0,g=mb(c,k>>2)|0,C):0)?(A=I+(H*160|0)|0,E=c[A>>2]|0,(E|0)>0):0)?(B=E+-1|0,c[A>>2]=B,(B|0)==0):0){if(!(c[I+(H*160|0)+24>>2]|0))break;o=0;ja(c[g+36>>2]|0,c[g+28>>2]|0,I+(H*160|0)+16|0)|0;I=o;o=0;if((I|0)!=0&(p|0)!=0){Q=Oj(c[I>>2]|0,i|0,h|0)|0;if(!Q)ya(I|0,p|0);D=p}else Q=-1;if((Q|0)==1){L=y;x=D;y=L;continue a}}while(0);J=J+1|0;F=F>>1;if(!F)break}if((J|0)<8){R=J;z=62}}else{R=0;z=62}b:do if((z|0)==62)while(1){z=0;if(c[(mb(c,j>>2)|0)+576>>2]|0)break b;F=c[(mb(c,j>>2)|0)+300+(R<<2)>>2]|0;H=mb(c,m>>2)|0;C=mb(c,k>>2)|0;if((((F|0)>-1?(I=H+(F*160|0)|0,g=c[I>>2]|0,(g|0)>0):0)?(B=g+-1|0,c[I>>2]=B,(B|0)==0):0)?c[H+(F*160|0)+24>>2]|0:0){o=0;ja(c[C+36>>2]|0,c[C+28>>2]|0,H+(F*160|0)+16|0)|0;F=o;o=0;if((F|0)!=0&(p|0)!=0){S=Oj(c[F>>2]|0,i|0,h|0)|0;if(!S)ya(F|0,p|0);D=p}else S=-1;if((S|0)==1){L=y;x=D;y=L;continue a}}R=R+1|0;if((R|0)>=8)break;else z=62}while(0);c[y>>2]=0}J=c[(mb(c,j>>2)|0)+556>>2]|0;F=mb(c,m>>2)|0;H=mb(c,k>>2)|0;if((((J|0)>-1?(C=F+(J*160|0)|0,B=c[C>>2]|0,(B|0)>0):0)?(I=B+-1|0,c[C>>2]=I,(I|0)==0):0)?c[F+(J*160|0)+24>>2]|0:0){o=0;ja(c[H+36>>2]|0,c[H+28>>2]|0,F+(J*160|0)+16|0)|0;J=o;o=0;if((J|0)!=0&(p|0)!=0){T=Oj(c[J>>2]|0,i|0,h|0)|0;if(!T)ya(J|0,p|0);D=p}else T=-1;if((T|0)==1){L=y;x=D;y=L;continue}}J=mb(c,k>>2)|0;o=0;ca(11,J|0);J=o;o=0;if((J|0)!=0&(p|0)!=0){U=Oj(c[J>>2]|0,i|0,h|0)|0;if(!U)ya(J|0,p|0);D=p}else U=-1;if((U|0)==1){L=y;x=D;y=L;continue}else{z=78;break}}c[(mb(c,j>>2)|0)+88>>2]=1;o=0;la(55,b|0,n|0,n+d|0,e|0);J=o;o=0;if((J|0)!=0&(p|0)!=0){V=Oj(c[J>>2]|0,i|0,h|0)|0;if(!V)ya(J|0,p|0);D=p}else V=-1;if((V|0)==1){L=y;x=D;y=L;continue}J=b+17836|0;F=c[J>>2]|0;o=0;ca(10,F|0);H=o;o=0;if((H|0)!=0&(p|0)!=0){W=Oj(c[H>>2]|0,i|0,h|0)|0;if(!W)ya(H|0,p|0);D=p}else W=-1;if((W|0)==1){L=y;x=D;y=L;continue}H=c[b+17860>>2]|0;I=F+36|0;C=F+28|0;if(H){B=H;H=0;while(1){g=b+732+(H<<2)|0;A=c[g>>2]|0;if((A|0)>-1){E=F+40+(A*160|0)|0;v=c[E>>2]|0;if(((v|0)>0?(w=v+-1|0,c[E>>2]=w,(w|0)==0):0)?c[F+40+(A*160|0)+24>>2]|0:0){o=0;ja(c[I>>2]|0,c[C>>2]|0,F+40+(A*160|0)+16|0)|0;w=o;o=0;if((w|0)!=0&(p|0)!=0){X=Oj(c[w>>2]|0,i|0,h|0)|0;if(!X)ya(w|0,p|0);D=p}else X=-1;if((X|0)==1){L=y;x=D;y=L;continue a}}if(((B&1|0?(w=c[E>>2]|0,(w|0)>0):0)?(v=w+-1|0,c[E>>2]=v,(v|0)==0):0)?c[F+40+(A*160|0)+24>>2]|0:0){o=0;ja(c[I>>2]|0,c[C>>2]|0,F+40+(A*160|0)+16|0)|0;A=o;o=0;if((A|0)!=0&(p|0)!=0){Y=Oj(c[A>>2]|0,i|0,h|0)|0;if(!Y)ya(A|0,p|0);D=p}else Y=-1;if((Y|0)==1){L=y;x=D;y=L;continue a}}}c[g>>2]=c[b+764+(H<<2)>>2];H=H+1|0;B=B>>1;if(!B)break}if((H|0)<8){Z=H;z=83}}else{Z=0;z=83}c:do if((z|0)==83){z=0;B=b+1008|0;g=Z;while(1){if(c[B>>2]|0)break c;A=b+732+(g<<2)|0;v=c[A>>2]|0;if((((v|0)>-1?(E=F+40+(v*160|0)|0,w=c[E>>2]|0,(w|0)>0):0)?(s=w+-1|0,c[E>>2]=s,(s|0)==0):0)?c[F+40+(v*160|0)+24>>2]|0:0){o=0;ja(c[I>>2]|0,c[C>>2]|0,F+40+(v*160|0)+16|0)|0;v=o;o=0;if((v|0)!=0&(p|0)!=0){_=Oj(c[v>>2]|0,i|0,h|0)|0;if(!_)ya(v|0,p|0);D=p}else _=-1;if((_|0)==1){L=y;x=D;y=L;continue a}}c[A>>2]=c[b+764+(g<<2)>>2];g=g+1|0;if((g|0)>=8)break}}while(0);o=0;ca(11,F|0);C=o;o=0;if((C|0)!=0&(p|0)!=0){$=Oj(c[C>>2]|0,i|0,h|0)|0;if(!$)ya(C|0,p|0);D=p}else $=-1;if(($|0)==1){L=y;x=D;y=L;continue}c[y>>2]=0;C=b+988|0;c[b+720>>2]=(c[J>>2]|0)+40+((c[C>>2]|0)*160|0)+28;if(!((c[r>>2]|0)!=0?(c[b+1e3>>2]|0)!=0:0)){o=0;ca(10,F|0);I=o;o=0;if((I|0)!=0&(p|0)!=0){aa=Oj(c[I>>2]|0,i|0,h|0)|0;if(!aa)ya(I|0,p|0);D=p}else aa=-1;if((aa|0)==1){L=y;x=D;y=L;continue}I=F+40+((c[C>>2]|0)*160|0)|0;c[I>>2]=(c[I>>2]|0)+-1;o=0;ca(11,F|0);I=o;o=0;if((I|0)!=0&(p|0)!=0){da=Oj(c[I>>2]|0,i|0,h|0)|0;if(!da)ya(I|0,p|0);D=p}else da=-1;if((da|0)==1){L=y;x=D;y=L;continue}}c[b+796>>2]=-1;c[b+860>>2]=-1;c[b+924>>2]=-1;if((c[(mb(c,j>>2)|0)+576>>2]|0)==0?(I=c[(mb(c,j>>2)|0)+568>>2]|0,c[(mb(c,j>>2)|0)+572>>2]=I,I=c[(mb(c,j>>2)|0)+296>>2]|0,c[(mb(c,j>>2)|0)+292>>2]=I,(a[(mb(c,j>>2)|0)+3980>>0]|0)!=0):0){if(!(c[r>>2]|0)){I=mb(c,j>>2)|0;o=0;ca(14,I|0);I=o;o=0;if((I|0)!=0&(p|0)!=0){fa=Oj(c[I>>2]|0,i|0,h|0)|0;if(!fa)ya(I|0,p|0);D=p}else fa=-1;if((fa|0)==1){L=y;x=D;y=L;continue}z=116}}else z=116;if((z|0)==116?(z=0,(c[r>>2]|0)==0):0){z=123;break}I=c[b+17872>>2]|0;C=c[I+12>>2]|0;o=0;ca(12,I|0);H=o;o=0;if((H|0)!=0&(p|0)!=0){ga=Oj(c[H>>2]|0,i|0,h|0)|0;if(!ga)ya(H|0,p|0);D=p}else ga=-1;if((ga|0)==1){L=y;x=D;y=L;continue}if(c[(mb(c,j>>2)|0)+568>>2]|0){H=(mb(c,j>>2)|0)+17344|0;c[H>>2]=(c[H>>2]|0)+1}c[C+120>>2]=1;c[C+116>>2]=1;o=0;ca(15,I|0);C=o;o=0;if((C|0)!=0&(p|0)!=0){ha=Oj(c[C>>2]|0,i|0,h|0)|0;if(!ha)ya(C|0,p|0);D=p}else ha=-1;if((ha|0)==1){L=y;x=D;y=L;continue}o=0;ca(13,I|0);I=o;o=0;if((I|0)!=0&(p|0)!=0){ia=Oj(c[I>>2]|0,i|0,h|0)|0;if(!ia)ya(I|0,p|0);D=p}else ia=-1;if((ia|0)==1){L=y;x=D;y=L}else{z=122;break}}if((z|0)==78){G=-1;Cj(i|0);l=f;return G|0}else if((z|0)!=122)if((z|0)==123?(z=c[(mb(c,j>>2)|0)+256>>2]|0,c[(mb(c,j>>2)|0)+272>>2]=z,z=c[(mb(c,j>>2)|0)+260>>2]|0,c[(mb(c,j>>2)|0)+276>>2]=z,c[(mb(c,j>>2)|0)+568>>2]|0):0){z=(mb(c,j>>2)|0)+17344|0;c[z>>2]=(c[z>>2]|0)+1}c[(mb(c,j>>2)|0)+88>>2]=0;G=0;Cj(i|0);l=f;return G|0}function ih(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=a+17856|0;if((c[d>>2]|0)==1){e=-1;return e|0}c[d>>2]=1;if(!(c[a+1e3>>2]|0)){e=-1;return e|0}d=b;b=c[a+720>>2]|0;a=d+120|0;do{c[d>>2]=c[b>>2];d=d+4|0;b=b+4|0}while((d|0)<(a|0));e=0;return e|0}function jh(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=l;l=l+32|0;k=j;m=b+e|0;n=m+-1|0;o=(h|0)==0;if(o)p=a[n>>0]|0;else{Ib[h&63](i,n,k,1);p=a[k>>0]|0}c[g>>2]=0;n=p&255;if((n&224|0)!=192){q=0;l=j;return q|0}r=(n&7)+1|0;s=(n>>>3&3)+1|0;n=S(s,r)|0;if((n+2|0)>>>0>e>>>0){q=7;l=j;return q|0}t=-2-n|0;u=m+t|0;if(o)v=a[u>>0]|0;else{Ib[h&63](i,u,k,1);v=a[k>>0]|0}if(p<<24>>24!=v<<24>>24){q=7;l=j;return q|0}v=b+(e+1+t)|0;if(o){w=0;x=v}else{Ib[h&63](i,v,k,n);w=0;x=k}while(1){k=0;n=0;v=x;while(1){n=(d[v>>0]|0)<<(k<<3)|n;k=k+1|0;if((k|0)==(s|0))break;else v=v+1|0}c[f+(w<<2)>>2]=n;w=w+1|0;if((w|0)==(r|0))break;else x=x+s|0}c[g>>2]=r;q=0;l=j;return q|0}function kh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0;f=b+4|0;g=(((c[f>>2]|0)*252|0)+4|0)>>>8;h=b+8|0;i=c[h>>2]|0;if((i|0)<0){gc(b);j=c[h>>2]|0}else j=i;i=c[b>>2]|0;k=g<<24;if(i>>>0<k>>>0){l=1;m=g;n=i}else{l=0;m=(c[f>>2]|0)-g|0;n=i-k|0}k=d[1280+m>>0]|0;i=m<<k;m=n<<k;n=j-k|0;c[b>>2]=m;c[h>>2]=n;c[f>>2]=i;if(l)return;l=((i<<7)+128|0)>>>8;if((n|0)<0){gc(b);o=c[b>>2]|0;p=c[h>>2]|0}else{o=m;p=n}n=l<<24;if(o>>>0<n>>>0){q=1;r=l;s=o}else{q=0;r=(c[f>>2]|0)-l|0;s=o-n|0}n=d[1280+r>>0]|0;o=r<<n;r=s<<n;s=p-n|0;c[b>>2]=r;c[h>>2]=s;c[f>>2]=o;n=((o<<7)+128|0)>>>8;o=(s|0)<0;do if(q){if(o){gc(b);t=c[b>>2]|0;u=c[h>>2]|0}else{t=r;u=s}p=n<<24;if(t>>>0<p>>>0){v=0;w=n;x=t}else{v=8;w=(c[f>>2]|0)-n|0;x=t-p|0}p=d[1280+w>>0]|0;l=w<<p;m=x<<p;i=u-p|0;c[b>>2]=m;c[h>>2]=i;c[f>>2]=l;p=((l<<7)+128|0)>>>8;if((i|0)<0){gc(b);y=c[b>>2]|0;z=c[h>>2]|0}else{y=m;z=i}i=p<<24;if(y>>>0<i>>>0){A=0;B=p;C=y}else{A=4;B=(c[f>>2]|0)-p|0;C=y-i|0}i=d[1280+B>>0]|0;p=B<<i;m=C<<i;l=z-i|0;c[b>>2]=m;c[h>>2]=l;c[f>>2]=p;i=((p<<7)+128|0)>>>8;if((l|0)<0){gc(b);D=c[b>>2]|0;E=c[h>>2]|0}else{D=m;E=l}l=i<<24;if(D>>>0<l>>>0){F=0;G=i;H=D}else{F=2;G=(c[f>>2]|0)-i|0;H=D-l|0}l=d[1280+G>>0]|0;i=G<<l;m=H<<l;p=E-l|0;c[b>>2]=m;c[h>>2]=p;c[f>>2]=i;l=((i<<7)+128|0)>>>8;if((p|0)<0){gc(b);I=c[b>>2]|0;J=c[h>>2]|0}else{I=m;J=p}p=l<<24;if(I>>>0<p>>>0){K=0;L=l;M=I}else{K=1;L=(c[f>>2]|0)-l|0;M=I-p|0}p=d[1280+L>>0]|0;c[b>>2]=M<<p;c[h>>2]=J-p;c[f>>2]=L<<p;N=A|v|F|K}else{if(o){gc(b);O=c[b>>2]|0;P=c[h>>2]|0}else{O=r;P=s}p=n<<24;if(O>>>0<p>>>0){Q=1;R=n;S=O}else{Q=0;R=(c[f>>2]|0)-n|0;S=O-p|0}p=d[1280+R>>0]|0;l=R<<p;m=S<<p;i=P-p|0;c[b>>2]=m;c[h>>2]=i;c[f>>2]=l;p=((l<<7)+128|0)>>>8;l=(i|0)<0;if(Q){if(l){gc(b);T=c[b>>2]|0;U=c[h>>2]|0}else{T=m;U=i}k=p<<24;if(T>>>0<k>>>0){V=16;W=p;X=T}else{V=24;W=(c[f>>2]|0)-p|0;X=T-k|0}k=d[1280+W>>0]|0;j=W<<k;g=X<<k;Y=U-k|0;c[b>>2]=g;c[h>>2]=Y;c[f>>2]=j;k=((j<<7)+128|0)>>>8;if((Y|0)<0){gc(b);Z=c[b>>2]|0;_=c[h>>2]|0}else{Z=g;_=Y}Y=k<<24;if(Z>>>0<Y>>>0){$=0;aa=k;ba=Z}else{$=4;aa=(c[f>>2]|0)-k|0;ba=Z-Y|0}Y=d[1280+aa>>0]|0;k=aa<<Y;g=ba<<Y;j=_-Y|0;c[b>>2]=g;c[h>>2]=j;c[f>>2]=k;Y=((k<<7)+128|0)>>>8;if((j|0)<0){gc(b);ca=c[b>>2]|0;da=c[h>>2]|0}else{ca=g;da=j}j=Y<<24;if(ca>>>0<j>>>0){ea=0;fa=Y;ga=ca}else{ea=2;fa=(c[f>>2]|0)-Y|0;ga=ca-j|0}j=d[1280+fa>>0]|0;Y=fa<<j;g=ga<<j;k=da-j|0;c[b>>2]=g;c[h>>2]=k;c[f>>2]=Y;j=((Y<<7)+128|0)>>>8;if((k|0)<0){gc(b);ha=c[b>>2]|0;ia=c[h>>2]|0}else{ha=g;ia=k}k=j<<24;if(ha>>>0<k>>>0){ja=0;ka=j;la=ha}else{ja=1;ka=(c[f>>2]|0)-j|0;la=ha-k|0}k=d[1280+ka>>0]|0;c[b>>2]=la<<k;c[h>>2]=ia-k;c[f>>2]=ka<<k;N=V|$|ea|ja;break}if(l){gc(b);ma=c[b>>2]|0;na=c[h>>2]|0}else{ma=m;na=i}i=p<<24;if(ma>>>0<i>>>0){oa=1;pa=p;qa=ma}else{oa=0;pa=(c[f>>2]|0)-p|0;qa=ma-i|0}i=d[1280+pa>>0]|0;p=pa<<i;m=qa<<i;l=na-i|0;c[b>>2]=m;c[h>>2]=l;c[f>>2]=p;if(!oa){i=p;k=l;j=m;g=7;Y=0;do{ra=g;g=g+-1|0;sa=((i<<7)+128|0)>>>8;if((k|0)<0){gc(b);ta=c[b>>2]|0;ua=c[h>>2]|0}else{ta=j;ua=k}va=sa<<24;if(ta>>>0<va>>>0){wa=0;xa=sa;ya=ta}else{wa=1;xa=(c[f>>2]|0)-sa|0;ya=ta-va|0}va=d[1280+xa>>0]|0;i=xa<<va;j=ya<<va;k=ua-va|0;c[b>>2]=j;c[h>>2]=k;c[f>>2]=i;Y=wa<<g|Y}while((ra|0)>1);if((Y|0)<65)za=Y;else{g=((i<<7)+128|0)>>>8;if((k|0)<0){gc(b);Aa=c[b>>2]|0;Ba=c[h>>2]|0}else{Aa=j;Ba=k}ra=g<<24;if(Aa>>>0<ra>>>0){Ca=0;Da=g;Ea=Aa}else{Ca=1;Da=(c[f>>2]|0)-g|0;Ea=Aa-ra|0}ra=d[1280+Da>>0]|0;c[b>>2]=Ea<<ra;c[h>>2]=Ba-ra;c[f>>2]=Da<<ra;za=(Y<<1)+-65+Ca|0}N=za+64|0;break}ra=((p<<7)+128|0)>>>8;if((l|0)<0){gc(b);Fa=c[b>>2]|0;Ga=c[h>>2]|0}else{Fa=m;Ga=l}g=ra<<24;if(Fa>>>0<g>>>0){Ha=32;Ia=ra;Ja=Fa}else{Ha=48;Ia=(c[f>>2]|0)-ra|0;Ja=Fa-g|0}g=d[1280+Ia>>0]|0;ra=Ia<<g;va=Ja<<g;sa=Ga-g|0;c[b>>2]=va;c[h>>2]=sa;c[f>>2]=ra;g=((ra<<7)+128|0)>>>8;if((sa|0)<0){gc(b);Ka=c[b>>2]|0;La=c[h>>2]|0}else{Ka=va;La=sa}sa=g<<24;if(Ka>>>0<sa>>>0){Ma=0;Na=g;Oa=Ka}else{Ma=8;Na=(c[f>>2]|0)-g|0;Oa=Ka-sa|0}sa=d[1280+Na>>0]|0;g=Na<<sa;va=Oa<<sa;ra=La-sa|0;c[b>>2]=va;c[h>>2]=ra;c[f>>2]=g;sa=((g<<7)+128|0)>>>8;if((ra|0)<0){gc(b);Pa=c[b>>2]|0;Qa=c[h>>2]|0}else{Pa=va;Qa=ra}ra=sa<<24;if(Pa>>>0<ra>>>0){Ra=0;Sa=sa;Ta=Pa}else{Ra=4;Sa=(c[f>>2]|0)-sa|0;Ta=Pa-ra|0}ra=d[1280+Sa>>0]|0;sa=Sa<<ra;va=Ta<<ra;g=Qa-ra|0;c[b>>2]=va;c[h>>2]=g;c[f>>2]=sa;ra=((sa<<7)+128|0)>>>8;if((g|0)<0){gc(b);Ua=c[b>>2]|0;Va=c[h>>2]|0}else{Ua=va;Va=g}g=ra<<24;if(Ua>>>0<g>>>0){Wa=0;Xa=ra;Ya=Ua}else{Wa=2;Xa=(c[f>>2]|0)-ra|0;Ya=Ua-g|0}g=d[1280+Xa>>0]|0;ra=Xa<<g;va=Ya<<g;sa=Va-g|0;c[b>>2]=va;c[h>>2]=sa;c[f>>2]=ra;g=((ra<<7)+128|0)>>>8;if((sa|0)<0){gc(b);Za=c[b>>2]|0;_a=c[h>>2]|0}else{Za=va;_a=sa}sa=g<<24;if(Za>>>0<sa>>>0){$a=0;ab=g;bb=Za}else{$a=1;ab=(c[f>>2]|0)-g|0;bb=Za-sa|0}sa=d[1280+ab>>0]|0;c[b>>2]=bb<<sa;c[h>>2]=_a-sa;c[f>>2]=ab<<sa;N=Ha|Ma|Ra|Wa|$a}while(0);$a=d[e>>0]|0;Wa=d[31345+N>>0]|0;N=$a+-1|0;Ra=N<<1;if((Ra|0)<256){do if((Ra|0)>=(Wa|0))if(!(Wa&1)){cb=(Wa>>>1)+N|0;break}else{cb=N-((Wa+1|0)>>>1)|0;break}else cb=Wa;while(0);db=cb+1|0}else{cb=$a^255;do if(cb<<1>>>0>=Wa>>>0)if(!(Wa&1)){eb=(Wa>>>1)+cb|0;break}else{eb=cb-((Wa+1|0)>>>1)|0;break}else eb=Wa;while(0);db=255-eb|0}a[e>>0]=db;return}function lh(){var a=0,b=0,d=0;a=l;l=l+16|0;b=a;d=Xa(35072,0,7,0)|0;if(d|0){c[b>>2]=d;ri(31600,b)|0}Aj(35076,0)|0;qj(35104,0)|0;l=a;return}function mh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0.0,j=0.0;a=l;l=l+32|0;b=a+8|0;d=a;e=a+12|0;c[8788]=wg()|0;a=Wa()|0;f=(a|0)<4?a:4;c[d>>2]=f;ri(31635,d)|0;c[e>>2]=f;c[e+4>>2]=0;c[e+8>>2]=0;Qb(35156,c[8788]|0,e,0,10)|0;while(1){cj(35076)|0;while(1){if((c[8796]|0)==0?(g=c[8798]|0,(c[8797]|0)!=(g|0)):0)break;wj(35104,35076)|0}c[8796]=1;e=c[35196+(g<<3)>>2]|0;f=c[35196+(g<<3)+4>>2]|0;c[8798]=(g+1|0)%16|0;$i(35076)|0;i=+Za();Rb(35156,e,f,0,1)|0;Rb(35156,0,0,0,1)|0;j=+Za()-i;cj(35076)|0;h[4352]=j+ +h[4352];$i(35076)|0;lj(1024,6,b)}return 0}function nh(){var a=0,b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;a=l;l=l+16|0;b=a;d=a+4|0;c[d>>2]=0;e=Sb(35156,d)|0;a:do if(e){f=e;g=0;b:while(1){if(g|0){i=3;break}j=c[f>>2]|0;switch(j|0){case 258:{k=c[f+12>>2]|0;m=c[f+16>>2]|0;n=k;o=m;p=m>>>1;q=k>>>1;break}case 261:{k=c[f+12>>2]|0;m=c[f+16>>2]|0;n=k;o=m;p=m;q=k>>>1;break}case 262:{k=c[f+12>>2]|0;m=c[f+16>>2]|0;n=k;o=m;p=m;q=k;break}default:{i=8;break b}}Oa(c[f+48>>2]|0,c[f+64>>2]|0,c[f+52>>2]|0,c[f+68>>2]|0,c[f+56>>2]|0,c[f+72>>2]|0,n|0,o|0,q|0,p|0);f=Sb(35156,d)|0;if(!f){r=1;break a}else g=1}if((i|0)==3)while(1){i=0;si(31667)|0;if(!(Sb(35156,d)|0)){r=g;break}else i=3}else if((i|0)==8){c[b>>2]=j;ri(31717,b)|0;r=0;break}}else r=0;while(0);cj(35076)|0;s=+h[4352];h[4352]=0.0;c[8796]=0;rj(35104)|0;$i(35076)|0;ra(r|0,+s);l=a;return}function oh(){return 1}function ph(){Ua(0)}function qh(a,b){a=a|0;b=b|0;si(31762)|0;return 0}function rh(a,b){a=a|0;b=b|0;var d=0;cj(35076)|0;d=c[8797]|0;c[35196+(d<<3)>>2]=a;c[35196+(d<<3)+4>>2]=b;c[8797]=(d+1|0)%16|0;rj(35104)|0;$i(35076)|0;return 1}function sh(){return 35324}function th(){c[(Ra()|0)+188>>2]=35364;return}function uh(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Ah(c[a+60>>2]|0)|0;a=xh(Ma(6,d|0)|0)|0;l=b;return a|0}function vh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=l;l=l+48|0;f=e+16|0;g=e;h=e+32|0;i=a+28|0;j=c[i>>2]|0;c[h>>2]=j;k=a+20|0;m=(c[k>>2]|0)-j|0;c[h+4>>2]=m;c[h+8>>2]=b;c[h+12>>2]=d;b=m+d|0;m=a+60|0;c[g>>2]=c[m>>2];c[g+4>>2]=h;c[g+8>>2]=2;j=xh(kb(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=j;n=h;o=2;p=b;while(1){if((g|0)<0)break;p=p-g|0;q=c[n+4>>2]|0;r=g>>>0>q>>>0;s=r?n+8|0:n;t=(r<<31>>31)+o|0;u=g-(r?q:0)|0;c[s>>2]=(c[s>>2]|0)+u;q=s+4|0;c[q>>2]=(c[q>>2]|0)-u;c[f>>2]=c[m>>2];c[f+4>>2]=s;c[f+8>>2]=t;g=xh(kb(146,f|0)|0)|0;if((p|0)==(g|0)){v=3;break a}else{n=s;o=t}}c[a+16>>2]=0;c[i>>2]=0;c[k>>2]=0;c[a>>2]=c[a>>2]|32;if((o|0)==2)w=0;else w=d-(c[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=c[a+44>>2]|0;c[a+16>>2]=v+(c[a+48>>2]|0);c[i>>2]=v;c[k>>2]=v;w=d}l=e;return w|0}function wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+32|0;f=e;g=e+20|0;c[f>>2]=c[a+60>>2];c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=g;c[f+16>>2]=d;if((xh(hb(140,f|0)|0)|0)<0){c[g>>2]=-1;h=-1}else h=c[g>>2]|0;l=e;return h|0}function xh(a){a=a|0;var b=0;if(a>>>0>4294963200){c[(yh()|0)>>2]=0-a;b=-1}else b=a;return b|0}function yh(){return (zh()|0)+64|0}function zh(){return Ra()|0}function Ah(a){a=a|0;return a|0}function Bh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[b+36>>2]=6;if((c[b>>2]&64|0)==0?(c[g>>2]=c[b+60>>2],c[g+4>>2]=21523,c[g+8>>2]=f+16,Va(54,g|0)|0):0)a[b+75>>0]=-1;g=vh(b,d,e)|0;l=f;return g|0}function Ch(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=b;b=c;do{d=d+1|0;b=b+1|0;c=a[d>>0]|0;e=a[b>>0]|0}while(!(c<<24>>24==0?1:c<<24>>24!=e<<24>>24));f=e;g=c}return (g&255)-(f&255)|0}function Dh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+128|0;h=g+124|0;i=g;j=i;k=21372;m=j+124|0;do{c[j>>2]=c[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(m|0));if((d+-1|0)>>>0>2147483646)if(!d){n=1;o=h;p=4}else{c[(yh()|0)>>2]=75;q=-1}else{n=d;o=b;p=4}if((p|0)==4){p=-2-o|0;b=n>>>0>p>>>0?p:n;c[i+48>>2]=b;n=i+20|0;c[n>>2]=o;c[i+44>>2]=o;p=o+b|0;o=i+16|0;c[o>>2]=p;c[i+28>>2]=p;p=Eh(i,e,f)|0;if(!b)q=p;else{b=c[n>>2]|0;a[b+(((b|0)==(c[o>>2]|0))<<31>>31)>>0]=0;q=p}}l=g;return q|0}function Eh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+224|0;g=f+120|0;h=f+80|0;i=f;j=f+136|0;k=h;m=k+40|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[g>>2]=c[e>>2];if((Fh(0,d,g,i,h)|0)<0)n=-1;else{if((mb(c,b+76>>2)|0)>-1)o=Gh(b)|0;else o=0;e=c[b>>2]|0;k=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){m=b+44|0;p=c[m>>2]|0;c[m>>2]=j;q=b+28|0;c[q>>2]=j;r=b+20|0;c[r>>2]=j;c[e>>2]=80;s=b+16|0;c[s>>2]=j+80;j=Fh(b,d,g,i,h)|0;if(!p)t=j;else{wb[c[b+36>>2]&7](b,0,0)|0;u=(c[r>>2]|0)==0?-1:j;c[m>>2]=p;c[e>>2]=0;c[s>>2]=0;c[q>>2]=0;c[r>>2]=0;t=u}}else t=Fh(b,d,g,i,h)|0;h=c[b>>2]|0;c[b>>2]=h|k;if(o|0)Hh(b);n=(h&32|0)==0?t:-1}l=f;return n|0}\nfunction ie(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;d=b[a+2>>1]|0;e=b[a+62>>1]|0;f=((d*804|0)+8192+(S(e,-16364)|0)|0)>>>14;g=b[a+34>>1]|0;h=b[a+30>>1]|0;i=((g*12140|0)+8192+(S(h,-11003)|0)|0)>>>14;j=b[a+18>>1]|0;k=b[a+46>>1]|0;l=((j*7005|0)+8192+(S(k,-14811)|0)|0)>>>14;m=b[a+50>>1]|0;n=b[a+14>>1]|0;o=((m*15426|0)+8192+(S(n,-5520)|0)|0)>>>14;p=b[a+10>>1]|0;q=b[a+54>>1]|0;r=((p*3981|0)+8192+(S(q,-15893)|0)|0)>>>14;s=b[a+42>>1]|0;t=b[a+22>>1]|0;u=((s*14053|0)+8192+(S(t,-8423)|0)|0)>>>14;v=b[a+26>>1]|0;w=b[a+38>>1]|0;x=((v*9760|0)+8192+(S(w,-13160)|0)|0)>>>14;y=b[a+58>>1]|0;z=b[a+6>>1]|0;A=b[a+4>>1]|0;B=b[a+60>>1]|0;C=b[a+36>>1]|0;D=b[a+28>>1]|0;E=b[a+20>>1]|0;F=b[a+44>>1]|0;G=b[a+52>>1]|0;H=b[a+12>>1]|0;I=f<<16>>16;f=i<<16>>16;i=l<<16>>16;l=o<<16>>16;o=r<<16>>16;r=u<<16>>16;u=x<<16>>16;x=((y*16207|0)+8192+(S(z,-2404)|0)|0)>>>14<<16>>16;J=((y*2404|0)+8192+(z*16207|0)|0)>>>14<<16>>16;z=((v*13160|0)+8192+(w*9760|0)|0)>>>14<<16>>16;w=((s*8423|0)+8192+(t*14053|0)|0)>>>14<<16>>16;t=((p*15893|0)+8192+(q*3981|0)|0)>>>14<<16>>16;q=((m*5520|0)+8192+(n*15426|0)|0)>>>14<<16>>16;n=((j*14811|0)+8192+(k*7005|0)|0)>>>14<<16>>16;k=((g*11003|0)+8192+(h*12140|0)|0)>>>14<<16>>16;h=((d*16364|0)+8192+(e*804|0)|0)>>>14<<16>>16;e=b[a+8>>1]|0;d=b[a+56>>1]|0;g=b[a+40>>1]|0;j=b[a+24>>1]|0;m=((A*1606|0)+8192+(S(B,-16305)|0)|0)>>>14<<16>>16;p=((C*12665|0)+8192+(S(D,-10394)|0)|0)>>>14<<16>>16;s=((E*7723|0)+8192+(S(F,-14449)|0)|0)>>>14<<16>>16;v=((G*15679|0)+8192+(S(H,-4756)|0)|0)>>>14<<16>>16;y=((G*4756|0)+8192+(H*15679|0)|0)>>>14<<16>>16;H=((E*14449|0)+8192+(F*7723|0)|0)>>>14<<16>>16;F=((C*10394|0)+8192+(D*12665|0)|0)>>>14<<16>>16;D=((A*16305|0)+8192+(B*1606|0)|0)>>>14<<16>>16;B=I-f<<16>>16;A=h-k<<16>>16;C=l-i<<16>>16;E=q-n<<16>>16;G=o-r<<16>>16;K=t-w<<16>>16;L=x-u<<16>>16;M=J-z<<16>>16;N=b[a>>1]|0;O=b[a+32>>1]|0;P=b[a+16>>1]|0;Q=b[a+48>>1]|0;a=((e*3196|0)+8192+(S(d,-16069)|0)|0)>>>14<<16>>16;R=((g*13623|0)+8192+(S(j,-9102)|0)|0)>>>14<<16>>16;T=((g*9102|0)+8192+(j*13623|0)|0)>>>14<<16>>16;j=((e*16069|0)+8192+(d*3196|0)|0)>>>14<<16>>16;d=m-p<<16>>16;e=D-F<<16>>16;g=v-s<<16>>16;U=y-H<<16>>16;V=f+I<<16>>16;I=l+i<<16>>16;i=((A*3196|0)+8192+(S(B,-16069)|0)|0)>>>14<<16>>16;l=((S(E,-16069)|0)+8192+(S(C,-3196)|0)|0)>>>14<<16>>16;f=r+o<<16>>16;o=x+u<<16>>16;u=((K*13623|0)+8192+(S(G,-9102)|0)|0)>>>14<<16>>16;x=((S(M,-9102)|0)+8192+(S(L,-13623)|0)|0)>>>14<<16>>16;r=J+z<<16>>16;z=w+t<<16>>16;t=((M*13623|0)+8192+(S(L,-9102)|0)|0)>>>14<<16>>16;L=((K*9102|0)+8192+(G*13623|0)|0)>>>14<<16>>16;G=q+n<<16>>16;n=k+h<<16>>16;h=((E*3196|0)+8192+(S(C,-16069)|0)|0)>>>14<<16>>16;C=((A*16069|0)+8192+(B*3196|0)|0)>>>14<<16>>16;B=(((O+N|0)*11585|0)+8192|0)>>>14<<16>>16;A=((P*15137|0)+8192+(Q*6270|0)|0)>>>14<<16>>16;E=(((N-O|0)*11585|0)+8192|0)>>>14<<16>>16;O=((P*6270|0)+8192+(S(Q,-15137)|0)|0)>>>14<<16>>16;Q=j-T<<16>>16;P=a-R<<16>>16;N=m+p<<16>>16;p=s+v<<16>>16;v=((e*6270|0)+8192+(S(d,-15137)|0)|0)>>>14<<16>>16;s=((S(U,-15137)|0)+8192+(S(g,-6270)|0)|0)>>>14<<16>>16;m=H+y<<16>>16;y=D+F<<16>>16;F=((U*6270|0)+8192+(S(g,-15137)|0)|0)>>>14<<16>>16;g=((e*15137|0)+8192+(d*6270|0)|0)>>>14<<16>>16;d=i-l<<16>>16;e=C-h<<16>>16;U=V-I<<16>>16;D=n-G<<16>>16;H=o-f<<16>>16;k=r-z<<16>>16;q=x-u<<16>>16;K=t-L<<16>>16;M=A+B<<16>>16;w=j+T<<16>>16;T=O+E<<16>>16;j=(((P+Q|0)*11585|0)+8192|0)>>>14<<16>>16;J=E-O<<16>>16;O=(((Q-P|0)*11585|0)+8192|0)>>>14<<16>>16;P=B-A<<16>>16;A=a+R<<16>>16;R=v-s<<16>>16;a=g-F<<16>>16;B=N-p<<16>>16;Q=y-m<<16>>16;E=I+V<<16>>16;V=o+f<<16>>16;f=l+i<<16>>16;i=x+u<<16>>16;u=((e*6270|0)+8192+(S(d,-15137)|0)|0)>>>14<<16>>16;x=((S(K,-15137)|0)+8192+(S(q,-6270)|0)|0)>>>14<<16>>16;l=((D*6270|0)+8192+(S(U,-15137)|0)|0)>>>14<<16>>16;o=((S(k,-15137)|0)+8192+(S(H,-6270)|0)|0)>>>14<<16>>16;I=r+z<<16>>16;z=G+n<<16>>16;n=t+L<<16>>16;L=h+C<<16>>16;C=((K*6270|0)+8192+(S(q,-15137)|0)|0)>>>14<<16>>16;q=((e*15137|0)+8192+(d*6270|0)|0)>>>14<<16>>16;d=((k*6270|0)+8192+(S(H,-15137)|0)|0)>>>14<<16>>16;H=((D*15137|0)+8192+(U*6270|0)|0)>>>14<<16>>16;U=w+M<<16>>16;D=y+m<<16>>16;m=j+T<<16>>16;y=g+F<<16>>16;F=O+J<<16>>16;g=(((R+a|0)*11585|0)+8192|0)>>>14<<16>>16;k=A+P<<16>>16;e=(((B+Q|0)*11585|0)+8192|0)>>>14<<16>>16;K=P-A<<16>>16;A=(((Q-B|0)*11585|0)+8192|0)>>>14<<16>>16;B=J-O<<16>>16;O=(((a-R|0)*11585|0)+8192|0)>>>14<<16>>16;R=T-j<<16>>16;j=v+s<<16>>16;s=M-w<<16>>16;w=N+p<<16>>16;p=l-o<<16>>16;N=H-d<<16>>16;M=u-x<<16>>16;v=q-C<<16>>16;T=f-i<<16>>16;a=L-n<<16>>16;J=E-V<<16>>16;Q=z-I<<16>>16;P=D+U<<16>>16;h=I+z<<16>>16;b[c>>1]=h+P;z=y+m<<16>>16;I=n+L<<16>>16;b[c+2>>1]=I+z;L=g+F<<16>>16;n=C+q<<16>>16;b[c+4>>1]=n+L;q=e+k<<16>>16;C=d+H<<16>>16;b[c+6>>1]=C+q;H=A+K<<16>>16;d=(((p+N|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+8>>1]=d+H;t=O+B<<16>>16;G=(((M+v|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+10>>1]=G+t;r=j+R<<16>>16;W=(((T+a|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+12>>1]=W+r;X=w+s<<16>>16;Y=(((J+Q|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+14>>1]=Y+X;Z=s-w<<16>>16;w=(((Q-J|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+16>>1]=w+Z;J=R-j<<16>>16;j=(((a-T|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+18>>1]=j+J;T=B-O<<16>>16;O=(((v-M|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+20>>1]=O+T;M=K-A<<16>>16;A=(((N-p|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+22>>1]=A+M;p=k-e<<16>>16;e=o+l<<16>>16;b[c+24>>1]=e+p;l=F-g<<16>>16;g=x+u<<16>>16;b[c+26>>1]=g+l;u=m-y<<16>>16;y=i+f<<16>>16;b[c+28>>1]=y+u;f=U-D<<16>>16;D=V+E<<16>>16;b[c+30>>1]=D+f;b[c+32>>1]=f-D;b[c+34>>1]=u-y;b[c+36>>1]=l-g;b[c+38>>1]=p-e;b[c+40>>1]=M-A;b[c+42>>1]=T-O;b[c+44>>1]=J-j;b[c+46>>1]=Z-w;b[c+48>>1]=X-Y;b[c+50>>1]=r-W;b[c+52>>1]=t-G;b[c+54>>1]=H-d;b[c+56>>1]=q-C;b[c+58>>1]=L-n;b[c+60>>1]=z-I;b[c+62>>1]=P-h;return}function je(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;g=l;l=l+2208|0;h=g+160|0;i=g+96|0;j=g+32|0;k=g;m=k+2|0;n=k+4|0;o=k+6|0;p=k+8|0;q=k+10|0;r=k+12|0;s=k+14|0;t=k+16|0;u=k+18|0;v=k+20|0;w=k+22|0;x=k+24|0;y=k+26|0;z=k+28|0;A=k+30|0;B=0;C=c;c=h;while(1){D=0;do{E=D<<1;b[k+(D<<1)>>1]=b[C+((E|1)<<1)>>1]|b[C+(E<<1)>>1];D=D+1|0}while((D|0)!=16);D=b[m>>1]|b[k>>1];E=b[o>>1]|b[n>>1];F=b[q>>1]|b[p>>1];G=b[s>>1]|b[r>>1];H=b[u>>1]|b[t>>1];b[p>>1]=H;I=b[w>>1]|b[v>>1];b[q>>1]=I;J=b[y>>1]|b[x>>1];b[r>>1]=J;K=b[A>>1]|b[z>>1];b[s>>1]=K;L=I|H;b[n>>1]=L;H=K|J;b[o>>1]=H;J=G|F|(E|D);b[k>>1]=J;D=H|L;b[m>>1]=D;if(!((D|J)<<16>>16)){J=c;D=J+64|0;do{b[J>>1]=0;J=J+2|0}while((J|0)<(D|0))}else ie(C,c);B=B+1|0;if((B|0)==32)break;else{C=C+64|0;c=c+64|0}}c=0;do{C=0;do{b[i+(C<<1)>>1]=b[h+((C<<5)+c<<1)>>1]|0;C=C+1|0}while((C|0)!=32);ie(i,j);C=0;do{B=e+((S(C,f)|0)+c)|0;m=((b[j+(C<<1)>>1]|0)+32>>6)+(d[B>>0]|0)|0;a[B>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;C=C+1|0}while((C|0)!=32);c=c+1|0}while((c|0)!=32);l=g;return}function ke(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;g=l;l=l+2176|0;h=g+128|0;i=g+64|0;j=g;Jj(h|0,0,2048)|0;ie(c,h);ie(c+64|0,h+64|0);ie(c+128|0,h+128|0);ie(c+192|0,h+192|0);ie(c+256|0,h+256|0);ie(c+320|0,h+320|0);ie(c+384|0,h+384|0);ie(c+448|0,h+448|0);ie(c+512|0,h+512|0);ie(c+576|0,h+576|0);ie(c+640|0,h+640|0);ie(c+704|0,h+704|0);ie(c+768|0,h+768|0);ie(c+832|0,h+832|0);ie(c+896|0,h+896|0);ie(c+960|0,h+960|0);c=0;do{k=0;do{b[i+(k<<1)>>1]=b[h+((k<<5)+c<<1)>>1]|0;k=k+1|0}while((k|0)!=32);ie(i,j);k=0;do{m=e+((S(k,f)|0)+c)|0;n=((b[j+(k<<1)>>1]|0)+32>>6)+(d[m>>0]|0)|0;a[m>>0]=(n|0)>255?-1:((n|0)>0?n:0)&255;k=k+1|0}while((k|0)!=32);c=c+1|0}while((c|0)!=32);l=g;return}function le(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;g=l;l=l+2176|0;h=g+128|0;i=g+64|0;j=g;Jj(h|0,0,2048)|0;ie(c,h);ie(c+64|0,h+64|0);ie(c+128|0,h+128|0);ie(c+192|0,h+192|0);ie(c+256|0,h+256|0);ie(c+320|0,h+320|0);ie(c+384|0,h+384|0);ie(c+448|0,h+448|0);c=0;do{k=0;do{b[i+(k<<1)>>1]=b[h+((k<<5)+c<<1)>>1]|0;k=k+1|0}while((k|0)!=32);ie(i,j);k=0;do{m=e+((S(k,f)|0)+c)|0;n=((b[j+(k<<1)>>1]|0)+32>>6)+(d[m>>0]|0)|0;a[m>>0]=(n|0)>255?-1:((n|0)>0?n:0)&255;k=k+1|0}while((k|0)!=32);c=c+1|0}while((c|0)!=32);l=g;return}function me(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+32>>6;c=e;e=0;while(1){h=0;do{i=c+h|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;h=h+1|0}while((h|0)!=32);e=e+1|0;if((e|0)==32)break;else c=c+f|0}return}function ne(){vj(34828,2)|0;return}function oe(){return}function pe(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;return}function qe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;c[b>>2]=0;d=a+4|0;switch(c[d>>2]|0){case 0:{e=Xb(1,80)|0;c[a>>2]=e;if(!e){f=0;g=f&1;return g|0}do if(!(Aj(e,0)|0)){h=(qj((c[a>>2]|0)+28|0,0)|0)==0;if(!h)break;cj(c[a>>2]|0)|0;if(Xa((c[a>>2]|0)+76|0,0,5,a|0)|0){$i(c[a>>2]|0)|0;pj((c[a>>2]|0)+28|0)|0;break}c[d>>2]=1;$i(c[a>>2]|0)|0;f=1;g=f&1;return g|0}while(0);Yb(c[a>>2]|0);c[a>>2]=0;f=0;g=f&1;return g|0}case 1:{f=1;g=f&1;return g|0}default:{e=c[a>>2]|0;if(!e){f=1;g=f&1;return g|0}cj(e)|0;if((c[d>>2]|0)>>>0>=2)do{e=c[a>>2]|0;wj(e+28|0,e)|0}while((c[d>>2]|0)!=1);$i(c[a>>2]|0)|0;f=(c[b>>2]|0)==0;g=f&1;return g|0}}return 0}function re(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if(b|0){cj(b)|0;b=a+4|0;if((c[b>>2]|0)>>>0>=2)do{d=c[a>>2]|0;wj(d+28|0,d)|0}while((c[b>>2]|0)!=1);$i(c[a>>2]|0)|0}return (c[a+20>>2]|0)==0|0}function se(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if(!b)return;cj(b)|0;b=a+4|0;switch(c[b>>2]|0){case 0:break;case 1:{d=4;break}default:{do{e=c[a>>2]|0;wj(e+28|0,e)|0}while((c[b>>2]|0)!=1);d=4}}if((d|0)==4){c[b>>2]=2;rj((c[a>>2]|0)+28|0)|0}$i(c[a>>2]|0)|0;return}function te(a){a=a|0;var b=0,d=0;b=c[a+8>>2]|0;if(!b)return;d=(Gb[b&31](c[a+12>>2]|0,c[a+16>>2]|0)|0)==0&1;b=a+20|0;c[b>>2]=d|c[b>>2];return}function ue(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if(!b)return;cj(b)|0;b=a+4|0;switch(c[b>>2]|0){case 0:break;case 1:{d=4;break}default:{do{e=c[a>>2]|0;wj(e+28|0,e)|0}while((c[b>>2]|0)!=1);d=4}}if((d|0)==4){c[b>>2]=0;rj((c[a>>2]|0)+28|0)|0}$i(c[a>>2]|0)|0;Sa(c[(c[a>>2]|0)+76>>2]|0,0)|0;pj((c[a>>2]|0)+28|0)|0;Yb(c[a>>2]|0);c[a>>2]=0;return}function ve(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a+4|0;d=a+8|0;e=a+12|0;f=a+16|0;g=a+20|0;a:while(1){cj(c[a>>2]|0)|0;b:while(1){switch(c[b>>2]|0){case 0:{break a;break}case 2:{break b;break}case 1:break;default:{h=8;break b}}i=c[a>>2]|0;wj(i+28|0,i)|0}if((h|0)==8){h=0;rj((c[a>>2]|0)+28|0)|0;$i(c[a>>2]|0)|0;continue}i=c[d>>2]|0;if(i|0){j=(Gb[i&31](c[e>>2]|0,c[f>>2]|0)|0)==0&1;c[g>>2]=j|c[g>>2]}c[b>>2]=1;rj((c[a>>2]|0)+28|0)|0;$i(c[a>>2]|0)|0}rj((c[a>>2]|0)+28|0)|0;$i(c[a>>2]|0)|0;return 0}function we(){return 19464}function xe(a){a=a|0;cj(a)|0;return}function ye(a){a=a|0;$i(a)|0;return}function ze(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+7>>3;c[a+608>>2]=e;b=d+7>>3;c[a+600>>2]=b;c[a+612>>2]=e+8;d=e+1>>1;c[a+604>>2]=d;e=b+1>>1;c[a+596>>2]=e;c[a+592>>2]=S(e,d)|0;return}function Ae(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+36|0;d=a+28|0;e=0;do{f=a+40+(e*160|0)|0;if((c[f>>2]|0)>0?(g=a+40+(e*160|0)+16|0,c[g>>2]|0):0){Gb[c[b>>2]&31](c[d>>2]|0,g)|0;c[f>>2]=0}f=a+40+(e*160|0)+4|0;Yb(c[f>>2]|0);c[f>>2]=0;Zb(a+40+(e*160|0)+28|0)|0;e=e+1|0}while((e|0)!=15);return}function Be(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=b+7>>3;b=a+608|0;c[b>>2]=e;f=d+7>>3;d=a+600|0;c[d>>2]=f;g=e+8|0;h=a+612|0;c[h>>2]=g;i=e+1>>1;j=a+604|0;c[j>>2]=i;k=f+1>>1;l=a+596|0;c[l>>2]=k;m=a+592|0;c[m>>2]=S(k,i)|0;i=S(f+8|0,g)|0;if((c[a+700>>2]|0)<(i|0)){zb[c[a+724>>2]&31](a);if(!(Gb[c[a+720>>2]&31](a,i)|0)){n=c[b>>2]|0;o=c[d>>2]|0;p=4}}else{n=e;o=f;p=4}do if((p|0)==4){f=a+776|0;if((c[f>>2]|0)<(S(n,o)|0)){e=a+760|0;Yb(c[e>>2]|0);c[e>>2]=0;i=a+764|0;Yb(c[i>>2]|0);c[i>>2]=0;g=a+772|0;c[g>>2]=0;k=a+4096|0;if(!(c[k>>2]|0))c[a+768>>2]=0;q=S(c[b>>2]|0,c[d>>2]|0)|0;r=Xb(q,1)|0;c[e>>2]=r;if(!r)break;r=Xb(q,1)|0;c[i>>2]=r;if(!r)break;c[f>>2]=q;c[a+752>>2]=0;c[a+756>>2]=1;c[g>>2]=c[a+760>>2];if(!(c[k>>2]|0))c[a+768>>2]=r}r=a+17416|0;if((c[r>>2]|0)<(c[b>>2]|0)){k=a+17412|0;Yb(c[k>>2]|0);g=Xb(((c[b>>2]|0)+7&-8)*6|0,1)|0;c[k>>2]=g;if(!g)break;g=a+17408|0;Yb(c[g>>2]|0);k=Xb((c[b>>2]|0)+7&-8,1)|0;c[g>>2]=k;if(!k)break;c[r>>2]=c[b>>2]}r=a+3972|0;Yb(c[r>>2]|0);k=(c[b>>2]|0)+7>>3;c[a+3976>>2]=k;g=Xb(S((c[d>>2]|0)+7>>3,k)|0,160)|0;c[r>>2]=g;if(g|0){s=0;return s|0}}while(0);c[b>>2]=0;c[d>>2]=0;c[h>>2]=8;c[j>>2]=0;c[l>>2]=0;c[m>>2]=0;zb[c[a+724>>2]&31](a);m=a+760|0;Yb(c[m>>2]|0);c[m>>2]=0;m=a+764|0;Yb(c[m>>2]|0);c[m>>2]=0;c[a+772>>2]=0;if(!(c[a+4096>>2]|0))c[a+768>>2]=0;m=a+17412|0;Yb(c[m>>2]|0);c[m>>2]=0;m=a+17408|0;Yb(c[m>>2]|0);c[m>>2]=0;m=a+3972|0;Yb(c[m>>2]|0);c[m>>2]=0;s=1;return s|0}function Ce(a){a=a|0;var b=0;zb[c[a+724>>2]&31](a);b=a+760|0;Yb(c[b>>2]|0);c[b>>2]=0;b=a+764|0;Yb(c[b>>2]|0);c[b>>2]=0;c[a+772>>2]=0;if(!(c[a+4096>>2]|0))c[a+768>>2]=0;b=a+17412|0;Yb(c[b>>2]|0);c[b>>2]=0;b=a+17408|0;Yb(c[b>>2]|0);c[b>>2]=0;b=a+3972|0;Yb(c[b>>2]|0);c[b>>2]=0;b=a+4108|0;Yb(c[b>>2]|0);c[b>>2]=0;b=a+4112|0;Yb(c[b>>2]|0);c[b>>2]=0;return}function De(a){a=a|0;var b=0;zb[c[a+728>>2]&31](a);b=c[a+768>>2]|0;if(!b)return;if(c[a+4096>>2]|0)return;Jj(b|0,0,S(c[a+608>>2]|0,c[a+600>>2]|0)|0)|0;return}function Ee(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+752|0;d=c[b>>2]|0;e=a+756|0;f=c[e>>2]|0;c[b>>2]=f;c[e>>2]=d;c[a+772>>2]=c[a+760+(f<<2)>>2];c[a+768>>2]=c[a+760+(d<<2)>>2];return}function Fe(b,c,e){b=b|0;c=c|0;e=e|0;var f=0;if((e|2|0)!=2){f=a[b+20+((e+-1|0)*12|0)>>0]|0;return f|0}if(!c){f=0;return f|0}if((a[c+8>>0]|0)>0){f=0;return f|0}f=a[((d[c>>0]|0)<3?c+20+((e+1|0)*12|0)|0:c+1|0)>>0]|0;return f|0}function Ge(b,c,e){b=b|0;c=c|0;e=e|0;var f=0;if((e|1|0)!=1){f=a[b+20+((e+-2|0)*12|0)>>0]|0;return f|0}if(!c){f=0;return f|0}if((a[c+8>>0]|0)>0){f=0;return f|0}f=a[((d[c>>0]|0)<3?c+20+((e+2|0)*12|0)|0:c+1|0)>>0]|0;return f|0}function He(a,b,d){a=a|0;b=b|0;d=d|0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+92>>2]=b;c[a+96>>2]=d;c[a+180>>2]=b;c[a+184>>2]=d;return}function Ie(a){a=a|0;var b=0;b=a+4108|0;Qj((c[b>>2]|0)+174|0,24654,432)|0;Qj((c[b>>2]|0)+606|0,25086,432)|0;Qj((c[b>>2]|0)+1038|0,25518,432)|0;Qj((c[b>>2]|0)+1470|0,25950,432)|0;return}function Je(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if((c[b+564>>2]|0)!=0?(a[b+580>>0]|0)==0:0)d=(c[b+560>>2]|0)==0?128:112;else d=112;e=b+4112|0;f=b+4116|0;g=b+4108|0;h=0;do{i=c[e>>2]|0;j=c[f>>2]|0;k=c[g>>2]|0;l=0;do{m=0;do{n=0;do{o=(n|0)==0?3:6;p=0;do{q=c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)>>2]|0;r=c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)+4>>2]|0;s=c[b+14152+(h*576|0)+(l*288|0)+(m*144|0)+(n*24|0)+(p<<2)>>2]|0;t=(c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)+8>>2]|0)+r|0;u=a[i+(j*2044|0)+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)>>0]|0;if(!s)v=128;else{w=Mj(c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)+12>>2]|0,0,8)|0;x=Kj(w|0,D|0,s>>>1|0,0)|0;w=Tj(x|0,D|0,s|0,0)|0;v=((255-w|0)>>>23|w)&255|(w|0)==0}w=((S(s>>>0<24?s:24,d)|0)>>>0)/24|0;a[k+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)>>0]=((S(256-w|0,u&255)|0)+128+(S(v,w)|0)|0)>>>8;w=a[i+(j*2044|0)+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+1>>0]|0;u=t+q|0;if(!u)y=128;else{s=Mj(q|0,0,8)|0;q=Kj(u>>>1|0,0,s|0,D|0)|0;s=Tj(q|0,D|0,u|0,0)|0;y=((255-s|0)>>>23|s)&255|(s|0)==0}s=((S(u>>>0<24?u:24,d)|0)>>>0)/24|0;a[k+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+1>>0]=((S(w&255,256-s|0)|0)+128+(S(y,s)|0)|0)>>>8;s=a[i+(j*2044|0)+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+2>>0]|0;if(!t)z=128;else{w=Mj(r|0,0,8)|0;r=Kj(t>>>1|0,0,w|0,D|0)|0;w=Tj(r|0,D|0,t|0,0)|0;z=((255-w|0)>>>23|w)&255|(w|0)==0}w=((S(t>>>0<24?t:24,d)|0)>>>0)/24|0;a[k+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+2>>0]=((S(s&255,256-w|0)|0)+128+(S(z,w)|0)|0)>>>8;p=p+1|0}while((p|0)<(o|0));n=n+1|0}while((n|0)!=6);m=m+1|0}while((m|0)!=2);l=l+1|0}while((l|0)!=2);h=h+1|0}while((h|0)!=4);return}function Ke(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;d=c[b+4108>>2]|0;e=c[b+4112>>2]|0;f=c[b+4116>>2]|0;g=a[e+(f*2044|0)+1931>>0]|0;h=c[b+16616>>2]|0;i=(c[b+16620>>2]|0)+h|0;if(!i)j=g;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(h|0,0,8)|0;h=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(h|0,D|0,i|0,0)|0;j=((S(256-k|0,g&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,k)|0)|0)>>>8&255}a[d+1931>>0]=j;j=a[e+(f*2044|0)+1932>>0]|0;k=c[b+16624>>2]|0;l=(c[b+16628>>2]|0)+k|0;if(!l)m=j;else{g=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(k|0,0,8)|0;k=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(k|0,D|0,l|0,0)|0;m=((S(256-g|0,j&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,g)|0)|0)>>>8&255}a[d+1932>>0]=m;m=a[e+(f*2044|0)+1933>>0]|0;g=c[b+16632>>2]|0;i=(c[b+16636>>2]|0)+g|0;if(!i)n=m;else{j=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(g|0,0,8)|0;g=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(g|0,D|0,i|0,0)|0;n=((S(256-j|0,m&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,j)|0)|0)>>>8&255}a[d+1933>>0]=n;n=a[e+(f*2044|0)+1934>>0]|0;j=c[b+16640>>2]|0;l=(c[b+16644>>2]|0)+j|0;if(!l)o=n;else{m=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(j|0,0,8)|0;j=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(j|0,D|0,l|0,0)|0;o=((S(256-m|0,n&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,m)|0)|0)>>>8&255}a[d+1934>>0]=o;o=a[e+(f*2044|0)+1935>>0]|0;m=c[b+16648>>2]|0;i=(c[b+16652>>2]|0)+m|0;if(!i)p=o;else{n=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(m|0,0,8)|0;m=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(m|0,D|0,i|0,0)|0;p=((S(256-n|0,o&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,n)|0)|0)>>>8&255}a[d+1935>>0]=p;p=a[e+(f*2044|0)+1936>>0]|0;n=c[b+16656>>2]|0;l=(c[b+16660>>2]|0)+n|0;if(!l)q=p;else{o=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(n|0,0,8)|0;n=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(n|0,D|0,l|0,0)|0;q=((S(256-o|0,p&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,o)|0)|0)>>>8&255}a[d+1936>>0]=q;q=a[e+(f*2044|0)+1937>>0]|0;o=c[b+16664>>2]|0;i=(c[b+16668>>2]|0)+o|0;if(!i)r=q;else{p=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(o|0,0,8)|0;o=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(o|0,D|0,i|0,0)|0;r=((S(256-p|0,q&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,p)|0)|0)>>>8&255}a[d+1937>>0]=r;r=a[e+(f*2044|0)+1938>>0]|0;p=c[b+16672>>2]|0;l=(c[b+16676>>2]|0)+p|0;if(!l)s=r;else{q=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(p|0,0,8)|0;p=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(p|0,D|0,l|0,0)|0;s=((S(256-q|0,r&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,q)|0)|0)>>>8&255}a[d+1938>>0]=s;s=a[e+(f*2044|0)+1939>>0]|0;q=c[b+16680>>2]|0;i=(c[b+16684>>2]|0)+q|0;if(!i)t=s;else{r=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(q|0,0,8)|0;q=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(q|0,D|0,i|0,0)|0;t=((S(256-r|0,s&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,r)|0)|0)>>>8&255}a[d+1939>>0]=t;t=a[e+(f*2044|0)+1950>>0]|0;r=c[b+16768>>2]|0;l=(c[b+16772>>2]|0)+r|0;if(!l)u=t;else{s=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(r|0,0,8)|0;r=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(r|0,D|0,l|0,0)|0;u=((S(256-s|0,t&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,s)|0)|0)>>>8&255}a[d+1950>>0]=u;u=a[e+(f*2044|0)+1951>>0]|0;s=c[b+16776>>2]|0;i=(c[b+16780>>2]|0)+s|0;if(!i)v=u;else{t=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(s|0,0,8)|0;s=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(s|0,D|0,i|0,0)|0;v=((S(256-t|0,u&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,t)|0)|0)>>>8&255}a[d+1951>>0]=v;v=a[e+(f*2044|0)+1952>>0]|0;t=c[b+16784>>2]|0;l=(c[b+16788>>2]|0)+t|0;if(!l)w=v;else{u=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(t|0,0,8)|0;t=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(t|0,D|0,l|0,0)|0;w=((S(256-u|0,v&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,u)|0)|0)>>>8&255}a[d+1952>>0]=w;w=a[e+(f*2044|0)+1953>>0]|0;u=c[b+16792>>2]|0;i=(c[b+16796>>2]|0)+u|0;if(!i)x=w;else{v=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(u|0,0,8)|0;u=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(u|0,D|0,i|0,0)|0;x=((S(256-v|0,w&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,v)|0)|0)>>>8&255}a[d+1953>>0]=x;x=a[e+(f*2044|0)+1954>>0]|0;v=c[b+16800>>2]|0;l=(c[b+16804>>2]|0)+v|0;if(!l)y=x;else{w=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(v|0,0,8)|0;v=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(v|0,D|0,l|0,0)|0;y=((S(256-w|0,x&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,w)|0)|0)>>>8&255}a[d+1954>>0]=y;y=a[e+(f*2044|0)+1940>>0]|0;w=c[b+16688>>2]|0;i=(c[b+16692>>2]|0)+w|0;if(!i)z=y;else{x=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(w|0,0,8)|0;w=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(w|0,D|0,i|0,0)|0;z=((S(256-x|0,y&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,x)|0)|0)>>>8&255}a[d+1940>>0]=z;z=a[e+(f*2044|0)+1941>>0]|0;x=c[b+16696>>2]|0;l=(c[b+16700>>2]|0)+x|0;if(!l)A=z;else{y=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(x|0,0,8)|0;x=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(x|0,D|0,l|0,0)|0;A=((S(256-y|0,z&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,y)|0)|0)>>>8&255}a[d+1941>>0]=A;A=a[e+(f*2044|0)+1942>>0]|0;y=c[b+16704>>2]|0;i=(c[b+16708>>2]|0)+y|0;if(!i)B=A;else{z=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(y|0,0,8)|0;y=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(y|0,D|0,i|0,0)|0;B=((S(256-z|0,A&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,z)|0)|0)>>>8&255}a[d+1942>>0]=B;B=a[e+(f*2044|0)+1943>>0]|0;z=c[b+16712>>2]|0;l=(c[b+16716>>2]|0)+z|0;if(!l)C=B;else{A=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(z|0,0,8)|0;z=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(z|0,D|0,l|0,0)|0;C=((S(256-A|0,B&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,A)|0)|0)>>>8&255}a[d+1943>>0]=C;C=a[e+(f*2044|0)+1944>>0]|0;A=c[b+16720>>2]|0;i=(c[b+16724>>2]|0)+A|0;if(!i)E=C;else{B=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(A|0,0,8)|0;A=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(A|0,D|0,i|0,0)|0;E=((S(256-B|0,C&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,B)|0)|0)>>>8&255}a[d+1944>>0]=E;E=a[e+(f*2044|0)+1945>>0]|0;B=c[b+16728>>2]|0;l=(c[b+16732>>2]|0)+B|0;if(!l)F=E;else{C=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(B|0,0,8)|0;B=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(B|0,D|0,l|0,0)|0;F=((S(256-C|0,E&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,C)|0)|0)>>>8&255}a[d+1945>>0]=F;F=a[e+(f*2044|0)+1946>>0]|0;C=c[b+16736>>2]|0;i=(c[b+16740>>2]|0)+C|0;if(!i)G=F;else{E=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(C|0,0,8)|0;C=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(C|0,D|0,i|0,0)|0;G=((S(256-E|0,F&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,E)|0)|0)>>>8&255}a[d+1946>>0]=G;G=a[e+(f*2044|0)+1947>>0]|0;E=c[b+16744>>2]|0;l=(c[b+16748>>2]|0)+E|0;if(!l)H=G;else{F=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(E|0,0,8)|0;E=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(E|0,D|0,l|0,0)|0;H=((S(256-F|0,G&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,F)|0)|0)>>>8&255}a[d+1947>>0]=H;H=a[e+(f*2044|0)+1948>>0]|0;F=c[b+16752>>2]|0;i=(c[b+16756>>2]|0)+F|0;if(!i)I=H;else{G=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Mj(F|0,0,8)|0;F=Kj(i>>>1|0,0,l|0,D|0)|0;l=Tj(F|0,D|0,i|0,0)|0;I=((S(256-G|0,H&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,G)|0)|0)>>>8&255}a[d+1948>>0]=I;I=a[e+(f*2044|0)+1949>>0]|0;G=c[b+16760>>2]|0;l=(c[b+16764>>2]|0)+G|0;if(!l)J=I;else{H=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=Mj(G|0,0,8)|0;G=Kj(l>>>1|0,0,i|0,D|0)|0;i=Tj(G|0,D|0,l|0,0)|0;J=((S(256-H|0,I&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,H)|0)|0)>>>8&255}a[d+1949>>0]=J;dc(27438,e+(f*2044|0)+1910|0,b+16504|0,d+1910|0);dc(27438,e+(f*2044|0)+1913|0,b+16520|0,d+1913|0);dc(27438,e+(f*2044|0)+1916|0,b+16536|0,d+1916|0);dc(27438,e+(f*2044|0)+1919|0,b+16552|0,d+1919|0);dc(27438,e+(f*2044|0)+1922|0,b+16568|0,d+1922|0);dc(27438,e+(f*2044|0)+1925|0,b+16584|0,d+1925|0);dc(27438,e+(f*2044|0)+1928|0,b+16600|0,d+1928|0);dc(27420,e+(f*2044|0)|0,b+4120|0,d);dc(27420,e+(f*2044|0)+9|0,b+4160|0,d+9|0);dc(27420,e+(f*2044|0)+18|0,b+4200|0,d+18|0);dc(27420,e+(f*2044|0)+27|0,b+4240|0,d+27|0);dc(27420,e+(f*2044|0)+36|0,b+4280|0,d+36|0);dc(27420,e+(f*2044|0)+45|0,b+4320|0,d+45|0);dc(27420,e+(f*2044|0)+54|0,b+4360|0,d+54|0);dc(27420,e+(f*2044|0)+63|0,b+4400|0,d+63|0);dc(27420,e+(f*2044|0)+72|0,b+4440|0,d+72|0);dc(27420,e+(f*2044|0)+81|0,b+4480|0,d+81|0);dc(27420,e+(f*2044|0)+90|0,b+4520|0,d+90|0);dc(27420,e+(f*2044|0)+99|0,b+4560|0,d+99|0);dc(27420,e+(f*2044|0)+108|0,b+4600|0,d+108|0);dc(27420,e+(f*2044|0)+117|0,b+4640|0,d+117|0);dc(27444,e+(f*2044|0)+126|0,b+4680|0,d+126|0);dc(27444,e+(f*2044|0)+129|0,b+4696|0,d+129|0);dc(27444,e+(f*2044|0)+132|0,b+4712|0,d+132|0);dc(27444,e+(f*2044|0)+135|0,b+4728|0,d+135|0);dc(27444,e+(f*2044|0)+138|0,b+4744|0,d+138|0);dc(27444,e+(f*2044|0)+141|0,b+4760|0,d+141|0);dc(27444,e+(f*2044|0)+144|0,b+4776|0,d+144|0);dc(27444,e+(f*2044|0)+147|0,b+4792|0,d+147|0);dc(27444,e+(f*2044|0)+150|0,b+4808|0,d+150|0);dc(27444,e+(f*2044|0)+153|0,b+4824|0,d+153|0);dc(27444,e+(f*2044|0)+156|0,b+4840|0,d+156|0);dc(27444,e+(f*2044|0)+159|0,b+4856|0,d+159|0);dc(27444,e+(f*2044|0)+162|0,b+4872|0,d+162|0);dc(27444,e+(f*2044|0)+165|0,b+4888|0,d+165|0);dc(27444,e+(f*2044|0)+168|0,b+4904|0,d+168|0);dc(27444,e+(f*2044|0)+171|0,b+4920|0,d+171|0);if((a[b+780>>0]|0)==4){dc(27450,e+(f*2044|0)+1902|0,b+16456|0,d+1902|0);dc(27450,e+(f*2044|0)+1904|0,b+16468|0,d+1904|0);dc(27450,e+(f*2044|0)+1906|0,b+16480|0,d+1906|0);dc(27450,e+(f*2044|0)+1908|0,b+16492|0,d+1908|0)}if((c[b+616>>2]|0)==4){J=c[b+16864>>2]|0;H=a[e+(f*2044|0)+1965>>0]|0;i=(c[b+16868>>2]|0)+J|0;if(!i)K=H;else{I=Mj(J|0,0,8)|0;J=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=Kj(i>>>1|0,0,I|0,D|0)|0;I=Tj(l|0,D|0,i|0,0)|0;K=((S(256-J|0,H&255)|0)+128+(S(((255-I|0)>>>23|I)&255|(I|0)==0,J)|0)|0)>>>8&255}a[d+1965>>0]=K;K=c[b+16840>>2]|0;J=c[b+16844>>2]|0;I=(c[b+16848>>2]|0)+J|0;H=a[e+(f*2044|0)+1961>>0]|0;i=I+K|0;if(!i)L=H;else{l=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;G=Mj(K|0,0,8)|0;K=Kj(i>>>1|0,0,G|0,D|0)|0;G=Tj(K|0,D|0,i|0,0)|0;L=((S(256-l|0,H&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,l)|0)|0)>>>8&255}a[d+1961>>0]=L;L=a[e+(f*2044|0)+1962>>0]|0;if(!I)M=L;else{l=c[19488+((I>>>0<20?I:20)<<2)>>2]|0;G=Mj(J|0,0,8)|0;J=Kj(I>>>1|0,0,G|0,D|0)|0;G=Tj(J|0,D|0,I|0,0)|0;M=((S(256-l|0,L&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,l)|0)|0)>>>8&255}a[d+1962>>0]=M;M=c[b+16808>>2]|0;l=c[b+16812>>2]|0;G=c[b+16816>>2]|0;L=c[b+16820>>2]|0;I=L+G|0;J=a[e+(f*2044|0)+1955>>0]|0;H=G+l+L+M|0;if(!H)N=J;else{L=c[19488+((H>>>0<20?H:20)<<2)>>2]|0;i=Mj(M|0,0,8)|0;M=Kj(H>>>1|0,0,i|0,D|0)|0;i=Tj(M|0,D|0,H|0,0)|0;N=((S(256-L|0,J&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,L)|0)|0)>>>8&255}a[d+1955>>0]=N;N=a[e+(f*2044|0)+1956>>0]|0;L=I+l|0;if(!L)O=N;else{i=c[19488+((L>>>0<20?L:20)<<2)>>2]|0;J=Mj(l|0,0,8)|0;l=Kj(L>>>1|0,0,J|0,D|0)|0;J=Tj(l|0,D|0,L|0,0)|0;O=((S(256-i|0,N&255)|0)+128+(S(((255-J|0)>>>23|J)&255|(J|0)==0,i)|0)|0)>>>8&255}a[d+1956>>0]=O;O=a[e+(f*2044|0)+1957>>0]|0;if(!I)P=O;else{i=c[19488+((I>>>0<20?I:20)<<2)>>2]|0;J=Mj(G|0,0,8)|0;G=Kj(I>>>1|0,0,J|0,D|0)|0;J=Tj(G|0,D|0,I|0,0)|0;P=((S(256-i|0,O&255)|0)+128+(S(((255-J|0)>>>23|J)&255|(J|0)==0,i)|0)|0)>>>8&255}a[d+1957>>0]=P;P=c[b+16872>>2]|0;i=a[e+(f*2044|0)+1966>>0]|0;J=(c[b+16876>>2]|0)+P|0;if(!J)Q=i;else{O=Mj(P|0,0,8)|0;P=c[19488+((J>>>0<20?J:20)<<2)>>2]|0;I=Kj(J>>>1|0,0,O|0,D|0)|0;O=Tj(I|0,D|0,J|0,0)|0;Q=((S(256-P|0,i&255)|0)+128+(S(((255-O|0)>>>23|O)&255|(O|0)==0,P)|0)|0)>>>8&255}a[d+1966>>0]=Q;Q=c[b+16852>>2]|0;P=c[b+16856>>2]|0;O=(c[b+16860>>2]|0)+P|0;i=a[e+(f*2044|0)+1963>>0]|0;J=O+Q|0;if(!J)R=i;else{I=c[19488+((J>>>0<20?J:20)<<2)>>2]|0;G=Mj(Q|0,0,8)|0;Q=Kj(J>>>1|0,0,G|0,D|0)|0;G=Tj(Q|0,D|0,J|0,0)|0;R=((S(256-I|0,i&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,I)|0)|0)>>>8&255}a[d+1963>>0]=R;R=a[e+(f*2044|0)+1964>>0]|0;if(!O)T=R;else{I=c[19488+((O>>>0<20?O:20)<<2)>>2]|0;G=Mj(P|0,0,8)|0;P=Kj(O>>>1|0,0,G|0,D|0)|0;G=Tj(P|0,D|0,O|0,0)|0;T=((S(256-I|0,R&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,I)|0)|0)>>>8&255}a[d+1964>>0]=T;T=c[b+16824>>2]|0;I=c[b+16828>>2]|0;G=c[b+16832>>2]|0;R=c[b+16836>>2]|0;O=R+G|0;P=a[e+(f*2044|0)+1958>>0]|0;i=G+I+R+T|0;if(!i)U=P;else{R=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;J=Mj(T|0,0,8)|0;T=Kj(i>>>1|0,0,J|0,D|0)|0;J=Tj(T|0,D|0,i|0,0)|0;U=((S(256-R|0,P&255)|0)+128+(S(((255-J|0)>>>23|J)&255|(J|0)==0,R)|0)|0)>>>8&255}a[d+1958>>0]=U;U=a[e+(f*2044|0)+1959>>0]|0;R=O+I|0;if(!R)V=U;else{J=c[19488+((R>>>0<20?R:20)<<2)>>2]|0;P=Mj(I|0,0,8)|0;I=Kj(R>>>1|0,0,P|0,D|0)|0;P=Tj(I|0,D|0,R|0,0)|0;V=((S(256-J|0,U&255)|0)+128+(S(((255-P|0)>>>23|P)&255|(P|0)==0,J)|0)|0)>>>8&255}a[d+1959>>0]=V;V=a[e+(f*2044|0)+1960>>0]|0;if(!O)W=V;else{J=c[19488+((O>>>0<20?O:20)<<2)>>2]|0;P=Mj(G|0,0,8)|0;G=Kj(O>>>1|0,0,P|0,D|0)|0;P=Tj(G|0,D|0,O|0,0)|0;W=((S(256-J|0,V&255)|0)+128+(S(((255-P|0)>>>23|P)&255|(P|0)==0,J)|0)|0)>>>8&255}a[d+1960>>0]=W}W=a[e+(f*2044|0)+1967>>0]|0;J=c[b+16896>>2]|0;P=(c[b+16900>>2]|0)+J|0;if(!P)X=W;else{V=c[19488+((P>>>0<20?P:20)<<2)>>2]|0;O=Mj(J|0,0,8)|0;J=Kj(P>>>1|0,0,O|0,D|0)|0;O=Tj(J|0,D|0,P|0,0)|0;X=((S(256-V|0,W&255)|0)+128+(S(((255-O|0)>>>23|O)&255|(O|0)==0,V)|0)|0)>>>8&255}a[d+1967>>0]=X;X=a[e+(f*2044|0)+1968>>0]|0;V=c[b+16904>>2]|0;O=(c[b+16908>>2]|0)+V|0;if(!O)Y=X;else{W=c[19488+((O>>>0<20?O:20)<<2)>>2]|0;P=Mj(V|0,0,8)|0;V=Kj(O>>>1|0,0,P|0,D|0)|0;P=Tj(V|0,D|0,O|0,0)|0;Y=((S(256-W|0,X&255)|0)+128+(S(((255-P|0)>>>23|P)&255|(P|0)==0,W)|0)|0)>>>8&255}a[d+1968>>0]=Y;Y=a[e+(f*2044|0)+1969>>0]|0;f=c[b+16912>>2]|0;e=(c[b+16916>>2]|0)+f|0;if(!e){Z=Y;_=d+1969|0;a[_>>0]=Z;return}b=c[19488+((e>>>0<20?e:20)<<2)>>2]|0;W=Mj(f|0,0,8)|0;f=Kj(e>>>1|0,0,W|0,D|0)|0;W=Tj(f|0,D|0,e|0,0)|0;Z=((S(256-b|0,Y&255)|0)+128+(S(((255-W|0)>>>23|W)&255|(W|0)==0,b)|0)|0)>>>8&255;_=d+1969|0;a[_>>0]=Z;return}function Le(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;of(d+3980|0);a[d+3983>>0]=0;e=c[d+768>>2]|0;if(e|0?(c[d+4096>>2]|0)==0:0)Jj(e|0,0,S(c[d+608>>2]|0,c[d+600>>2]|0)|0)|0;e=c[d+772>>2]|0;if(e|0)Jj(e|0,0,S(c[d+608>>2]|0,c[d+600>>2]|0)|0)|0;e=d+3962|0;b[e>>1]=0;b[e+2>>1]=0>>>16;b[d+3968>>1]=0;a[d+3956>>0]=1;a[d+3957>>0]=1;a[d+3958>>0]=1;a[d+3959>>0]=0;a[d+3960>>0]=-1;a[d+3961>>0]=-1;a[d+3966>>0]=0;a[d+3967>>0]=0;c[d+3952>>2]=-1;Ie(d);e=d+4108|0;f=c[e>>2]|0;g=f+36|0;h=27454;i=g+90|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));g=f;h=27544;i=g+36|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));j=f+1902|0;k=j;a[k>>0]=-14376213;a[k+1>>0]=-14376213>>8;a[k+2>>0]=-14376213>>16;a[k+3>>0]=-14376213>>24;k=j+4|0;a[k>>0]=-1869282526;a[k+1>>0]=-1869282526>>8;a[k+2>>0]=-1869282526>>16;a[k+3>>0]=-1869282526>>24;g=f+126|0;h=27580;i=g+48|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));k=f+1931|0;a[k>>0]=-507812343;a[k+1>>0]=-507812343>>8;a[k+2>>0]=-507812343>>16;a[k+3>>0]=-507812343>>24;k=f+1935|0;a[k>>0]=a[27628]|0;a[k+1>>0]=a[27629]|0;a[k+2>>0]=a[27630]|0;a[k+3>>0]=a[27631]|0;a[k+4>>0]=a[27632]|0;k=f+1950|0;a[k>>0]=a[27633]|0;a[k+1>>0]=a[27634]|0;a[k+2>>0]=a[27635]|0;a[k+3>>0]=a[27636]|0;a[k+4>>0]=a[27637]|0;g=f+1940|0;h=27638;i=g+10|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));g=f+1955|0;h=27648;i=g+12|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));k=f+1967|0;a[k>>0]=a[27660]|0;a[k+1>>0]=a[27661]|0;a[k+2>>0]=a[27662]|0;g=f+1910|0;h=27663;i=g+21|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));Oe(d);h=c[e>>2]|0;c[h+2040>>2]=1;g=d+564|0;a:do if((c[g>>2]|0)!=0?(c[d+17360>>2]|0)==0:0){switch(c[d+588>>2]|0){case 3:{l=9;break a;break}case 2:break;default:break a}Qj((c[d+4112>>2]|0)+((c[d+4116>>2]|0)*2044|0)|0,h|0,2044)|0}else l=9;while(0);if((l|0)==9){l=d+4112|0;Qj(c[l>>2]|0,h|0,2044)|0;Qj((c[l>>2]|0)+2044|0,c[e>>2]|0,2044)|0;Qj((c[l>>2]|0)+4088|0,c[e>>2]|0,2044)|0;Qj((c[l>>2]|0)+6132|0,c[e>>2]|0,2044)|0}if(c[g>>2]|0?(a[d+580>>0]|0)==0:0){m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}g=c[d+712>>2]|0;if(!g){m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}if(c[d+4096>>2]|0){m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}Jj(g|0,0,S((c[d+612>>2]|0)*68|0,(c[d+600>>2]|0)+1|0)|0)|0;m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}function Me(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!e)return;f=b[a>>1]|0;g=b[a+2>>1]|0;a=g<<16>>16==0;h=f<<16>>16==0?(a^1)&1:a?2:3;a=e+(h<<2)|0;c[a>>2]=(c[a>>2]|0)+1;if((h|1|0)==3){a=f<<16>>16;i=e+16+(a>>>31<<2)|0;c[i>>2]=(c[i>>2]|0)+1;i=(f<<16>>16<0?0-a|0:a)+-1|0;if((i|0)>8191)j=10;else j=d[27718+(i>>3)>>0]|0;a=(j|0)==0;f=i-(a?0:8<<j)|0;i=e+24+(j<<2)|0;c[i>>2]=(c[i>>2]|0)+1;i=f>>3;k=f>>>1&3;l=f&1;if(a){a=e+68+(i<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=e+156+(i<<4)+(k<<2)|0;c[a>>2]=(c[a>>2]|0)+1;m=e+204+(l<<2)|0}else{a=0;do{f=e+76+(a<<3)+((i>>>a&1)<<2)|0;c[f>>2]=(c[f>>2]|0)+1;a=a+1|0}while((a|0)<(j|0));j=e+188+(k<<2)|0;c[j>>2]=(c[j>>2]|0)+1;m=e+212+(l<<2)|0}c[m>>2]=(c[m>>2]|0)+1}if((h|2|0)!=3)return;h=g<<16>>16;m=e+220+(h>>>31<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=(g<<16>>16<0?0-h|0:h)+-1|0;if((m|0)>8191)n=10;else n=d[27718+(m>>3)>>0]|0;h=(n|0)==0;g=m-(h?0:8<<n)|0;m=e+228+(n<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=g>>3;l=g>>>1&3;j=g&1;if(h){h=e+272+(m<<2)|0;c[h>>2]=(c[h>>2]|0)+1;h=e+360+(m<<4)+(l<<2)|0;c[h>>2]=(c[h>>2]|0)+1;o=e+408+(j<<2)|0}else{h=0;do{g=e+280+(h<<3)+((m>>>h&1)<<2)|0;c[g>>2]=(c[g>>2]|0)+1;h=h+1|0}while((h|0)<(n|0));n=e+392+(l<<2)|0;c[n>>2]=(c[n>>2]|0)+1;o=e+416+(j<<2)|0}c[o>>2]=(c[o>>2]|0)+1;return}function Ne(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=c[b+4108>>2]|0;f=c[b+4112>>2]|0;g=c[b+4116>>2]|0;dc(27684,f+(g*2044|0)+1970|0,b+16920|0,e+1970|0);h=(d|0)==0;d=0;do{i=a[f+(g*2044|0)+1973+(d*33|0)>>0]|0;j=c[b+16936+(d*204|0)>>2]|0;k=(c[b+16936+(d*204|0)+4>>2]|0)+j|0;if(!k)l=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;n=Mj(j|0,0,8)|0;j=Kj(k>>>1|0,0,n|0,D|0)|0;n=Tj(j|0,D|0,k|0,0)|0;l=((S(256-m|0,i&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)>>0]=l;dc(27690,f+(g*2044|0)+1973+(d*33|0)+1|0,b+16936+(d*204|0)+8|0,e+1973+(d*33|0)+1|0);dc(27710,f+(g*2044|0)+1973+(d*33|0)+11|0,b+16936+(d*204|0)+52|0,e+1973+(d*33|0)+11|0);m=a[f+(g*2044|0)+1973+(d*33|0)+12>>0]|0;n=c[b+16936+(d*204|0)+60>>2]|0;i=(c[b+16936+(d*204|0)+64>>2]|0)+n|0;if(!i)o=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;j=Mj(n|0,0,8)|0;n=Kj(i>>>1|0,0,j|0,D|0)|0;j=Tj(n|0,D|0,i|0,0)|0;o=((S(256-k|0,m&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+12>>0]=o;k=a[f+(g*2044|0)+1973+(d*33|0)+13>>0]|0;j=c[b+16936+(d*204|0)+68>>2]|0;m=(c[b+16936+(d*204|0)+72>>2]|0)+j|0;if(!m)p=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;n=Mj(j|0,0,8)|0;j=Kj(m>>>1|0,0,n|0,D|0)|0;n=Tj(j|0,D|0,m|0,0)|0;p=((S(256-i|0,k&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+13>>0]=p;i=a[f+(g*2044|0)+1973+(d*33|0)+14>>0]|0;n=c[b+16936+(d*204|0)+76>>2]|0;k=(c[b+16936+(d*204|0)+80>>2]|0)+n|0;if(!k)q=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;j=Mj(n|0,0,8)|0;n=Kj(k>>>1|0,0,j|0,D|0)|0;j=Tj(n|0,D|0,k|0,0)|0;q=((S(256-m|0,i&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+14>>0]=q;m=a[f+(g*2044|0)+1973+(d*33|0)+15>>0]|0;j=c[b+16936+(d*204|0)+84>>2]|0;i=(c[b+16936+(d*204|0)+88>>2]|0)+j|0;if(!i)r=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;n=Mj(j|0,0,8)|0;j=Kj(i>>>1|0,0,n|0,D|0)|0;n=Tj(j|0,D|0,i|0,0)|0;r=((S(256-k|0,m&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+15>>0]=r;k=a[f+(g*2044|0)+1973+(d*33|0)+16>>0]|0;n=c[b+16936+(d*204|0)+92>>2]|0;m=(c[b+16936+(d*204|0)+96>>2]|0)+n|0;if(!m)s=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;j=Mj(n|0,0,8)|0;n=Kj(m>>>1|0,0,j|0,D|0)|0;j=Tj(n|0,D|0,m|0,0)|0;s=((S(256-i|0,k&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+16>>0]=s;i=a[f+(g*2044|0)+1973+(d*33|0)+17>>0]|0;j=c[b+16936+(d*204|0)+100>>2]|0;k=(c[b+16936+(d*204|0)+104>>2]|0)+j|0;if(!k)t=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;n=Mj(j|0,0,8)|0;j=Kj(k>>>1|0,0,n|0,D|0)|0;n=Tj(j|0,D|0,k|0,0)|0;t=((S(256-m|0,i&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+17>>0]=t;m=a[f+(g*2044|0)+1973+(d*33|0)+18>>0]|0;n=c[b+16936+(d*204|0)+108>>2]|0;i=(c[b+16936+(d*204|0)+112>>2]|0)+n|0;if(!i)u=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;j=Mj(n|0,0,8)|0;n=Kj(i>>>1|0,0,j|0,D|0)|0;j=Tj(n|0,D|0,i|0,0)|0;u=((S(256-k|0,m&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+18>>0]=u;k=a[f+(g*2044|0)+1973+(d*33|0)+19>>0]|0;j=c[b+16936+(d*204|0)+116>>2]|0;m=(c[b+16936+(d*204|0)+120>>2]|0)+j|0;if(!m)v=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;n=Mj(j|0,0,8)|0;j=Kj(m>>>1|0,0,n|0,D|0)|0;n=Tj(j|0,D|0,m|0,0)|0;v=((S(256-i|0,k&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+19>>0]=v;i=a[f+(g*2044|0)+1973+(d*33|0)+20>>0]|0;n=c[b+16936+(d*204|0)+124>>2]|0;k=(c[b+16936+(d*204|0)+128>>2]|0)+n|0;if(!k)w=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;j=Mj(n|0,0,8)|0;n=Kj(k>>>1|0,0,j|0,D|0)|0;j=Tj(n|0,D|0,k|0,0)|0;w=((S(256-m|0,i&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+20>>0]=w;m=a[f+(g*2044|0)+1973+(d*33|0)+21>>0]|0;j=c[b+16936+(d*204|0)+132>>2]|0;i=(c[b+16936+(d*204|0)+136>>2]|0)+j|0;if(!i)x=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;n=Mj(j|0,0,8)|0;j=Kj(i>>>1|0,0,n|0,D|0)|0;n=Tj(j|0,D|0,i|0,0)|0;x=((S(256-k|0,m&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+21>>0]=x;dc(27712,f+(g*2044|0)+1973+(d*33|0)+22|0,b+16936+(d*204|0)+140|0,e+1973+(d*33|0)+22|0);dc(27712,f+(g*2044|0)+1973+(d*33|0)+25|0,b+16936+(d*204|0)+156|0,e+1973+(d*33|0)+25|0);dc(27712,f+(g*2044|0)+1973+(d*33|0)+28|0,b+16936+(d*204|0)+172|0,e+1973+(d*33|0)+28|0);if(!h){k=a[f+(g*2044|0)+1973+(d*33|0)+31>>0]|0;n=c[b+16936+(d*204|0)+188>>2]|0;m=(c[b+16936+(d*204|0)+192>>2]|0)+n|0;if(!m)y=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;j=Mj(n|0,0,8)|0;n=Kj(m>>>1|0,0,j|0,D|0)|0;j=Tj(n|0,D|0,m|0,0)|0;y=((S(256-i|0,k&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+31>>0]=y;i=a[f+(g*2044|0)+1973+(d*33|0)+32>>0]|0;j=c[b+16936+(d*204|0)+196>>2]|0;k=(c[b+16936+(d*204|0)+200>>2]|0)+j|0;if(!k)z=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;n=Mj(j|0,0,8)|0;j=Kj(k>>>1|0,0,n|0,D|0)|0;n=Tj(j|0,D|0,k|0,0)|0;z=((S(256-m|0,i&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+32>>0]=z}d=d+1|0}while((d|0)!=2);return}function Oe(b){b=b|0;var d=0,e=0;d=(c[b+4108>>2]|0)+1970|0;b=28743;e=d+69|0;do{a[d>>0]=a[b>>0]|0;d=d+1|0;b=b+1|0}while((d|0)<(e|0));return}function Pe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+4|0;d=c[b>>2]|0;if((c[a>>2]|0)>0){e=d;f=0;while(1){Yb(c[e+(f*12|0)>>2]|0);g=c[b>>2]|0;c[g+(f*12|0)>>2]=0;f=f+1|0;if((f|0)>=(c[a>>2]|0)){h=g;break}else e=g}}else h=d;Yb(h);c[b>>2]=0;c[a>>2]=16;a=Xb(16,12)|0;c[b>>2]=a;return (a|0)==0|0}function Qe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+4|0;d=c[b>>2]|0;if((c[a>>2]|0)>0){e=d;f=0}else{g=d;Yb(g);c[b>>2]=0;return}while(1){Yb(c[e+(f*12|0)>>2]|0);d=c[b>>2]|0;c[d+(f*12|0)>>2]=0;f=f+1|0;if((f|0)>=(c[a>>2]|0)){g=d;break}else e=d}Yb(g);c[b>>2]=0;return}function Re(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!a){e=-1;return e|0}f=c[a>>2]|0;a:do if((f|0)>0){g=c[a+4>>2]|0;h=0;while(1){if(!(c[g+(h*12|0)+8>>2]|0)){i=h;break a}j=h+1|0;if((j|0)<(f|0))h=j;else{i=j;break}}}else i=0;while(0);if((i|0)==(f|0)){e=-1;return e|0}f=a+4|0;a=c[f>>2]|0;h=c[a+(i*12|0)+4>>2]|0;do if(h>>>0<b>>>0){Yb(c[a+(i*12|0)>>2]|0);g=Xb(1,b)|0;j=c[f>>2]|0;c[j+(i*12|0)>>2]=g;if(!g){e=-1;return e|0}else{c[j+(i*12|0)+4>>2]=b;k=j;l=b;break}}else{k=a;l=h}while(0);c[d>>2]=c[k+(i*12|0)>>2];c[d+4>>2]=l;c[k+(i*12|0)+8>>2]=1;c[d+8>>2]=k+(i*12|0);e=0;return e|0}function Se(a,b){a=a|0;b=b|0;a=c[b+8>>2]|0;if(!a)return 0;c[a+8>>2]=0;return 0}function Te(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+48|0;j=i+16|0;k=i+8|0;m=i;n=c[19572+(h<<3)+4>>2]|0;Ab[n&7](e,j);Ab[n&7](e+8|0,j+8|0);Ab[n&7](e+16|0,j+16|0);Ab[n&7](e+24|0,j+24|0);e=c[19572+(h<<3)>>2]|0;h=k+2|0;n=k+4|0;o=k+6|0;p=m+2|0;q=g<<1;r=m+4|0;s=g*3|0;t=m+6|0;u=0;do{b[k>>1]=b[j+(u<<1)>>1]|0;b[h>>1]=b[j+(u+4<<1)>>1]|0;b[n>>1]=b[j+(u+8<<1)>>1]|0;b[o>>1]=b[j+(u+12<<1)>>1]|0;Ab[e&7](k,m);v=f+u|0;w=((b[m>>1]|0)+8>>4)+(d[v>>0]|0)|0;a[v>>0]=(w|0)>255?-1:((w|0)>0?w:0)&255;w=f+(u+g)|0;v=((b[p>>1]|0)+8>>4)+(d[w>>0]|0)|0;a[w>>0]=(v|0)>255?-1:((v|0)>0?v:0)&255;v=f+(q+u)|0;w=((b[r>>1]|0)+8>>4)+(d[v>>0]|0)|0;a[v>>0]=(w|0)>255?-1:((w|0)>0?w:0)&255;w=f+(s+u)|0;v=((b[t>>1]|0)+8>>4)+(d[w>>0]|0)|0;a[w>>0]=(v|0)>255?-1:((v|0)>0?v:0)&255;u=u+1|0}while((u|0)!=4);l=i;return}function Ue(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;i=l;l=l+160|0;j=i+32|0;k=i+16|0;m=i;n=c[19604+(h<<3)>>2]|0;o=c[19604+(h<<3)+4>>2]|0;Ab[o&7](e,j);Ab[o&7](e+16|0,j+16|0);Ab[o&7](e+32|0,j+32|0);Ab[o&7](e+48|0,j+48|0);Ab[o&7](e+64|0,j+64|0);Ab[o&7](e+80|0,j+80|0);Ab[o&7](e+96|0,j+96|0);Ab[o&7](e+112|0,j+112|0);e=k+2|0;o=k+4|0;h=k+6|0;p=k+8|0;q=k+10|0;r=k+12|0;s=k+14|0;t=m+2|0;u=g<<1;v=m+4|0;w=g*3|0;x=m+6|0;y=g<<2;z=m+8|0;A=g*5|0;B=m+10|0;C=g*6|0;D=m+12|0;E=g*7|0;F=m+14|0;G=0;do{b[k>>1]=b[j+(G<<1)>>1]|0;b[e>>1]=b[j+(G+8<<1)>>1]|0;b[o>>1]=b[j+(G+16<<1)>>1]|0;b[h>>1]=b[j+(G+24<<1)>>1]|0;b[p>>1]=b[j+(G+32<<1)>>1]|0;b[q>>1]=b[j+(G+40<<1)>>1]|0;b[r>>1]=b[j+(G+48<<1)>>1]|0;b[s>>1]=b[j+(G+56<<1)>>1]|0;Ab[n&7](k,m);H=f+G|0;I=((b[m>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(G+g)|0;H=((b[t>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;H=f+(u+G)|0;I=((b[v>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(w+G)|0;H=((b[x>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;H=f+(y+G)|0;I=((b[z>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(A+G)|0;H=((b[B>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;H=f+(C+G)|0;I=((b[D>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(E+G)|0;H=((b[F>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;G=G+1|0}while((G|0)!=8);l=i;return}function Ve(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;i=l;l=l+576|0;j=i+64|0;k=i+32|0;m=i;n=c[19636+(h<<3)>>2]|0;o=c[19636+(h<<3)+4>>2]|0;Ab[o&7](e,j);Ab[o&7](e+32|0,j+32|0);Ab[o&7](e+64|0,j+64|0);Ab[o&7](e+96|0,j+96|0);Ab[o&7](e+128|0,j+128|0);Ab[o&7](e+160|0,j+160|0);Ab[o&7](e+192|0,j+192|0);Ab[o&7](e+224|0,j+224|0);Ab[o&7](e+256|0,j+256|0);Ab[o&7](e+288|0,j+288|0);Ab[o&7](e+320|0,j+320|0);Ab[o&7](e+352|0,j+352|0);Ab[o&7](e+384|0,j+384|0);Ab[o&7](e+416|0,j+416|0);Ab[o&7](e+448|0,j+448|0);Ab[o&7](e+480|0,j+480|0);e=k+2|0;o=k+4|0;h=k+6|0;p=k+8|0;q=k+10|0;r=k+12|0;s=k+14|0;t=k+16|0;u=k+18|0;v=k+20|0;w=k+22|0;x=k+24|0;y=k+26|0;z=k+28|0;A=k+30|0;B=0;do{b[k>>1]=b[j+(B<<1)>>1]|0;b[e>>1]=b[j+(B+16<<1)>>1]|0;b[o>>1]=b[j+(B+32<<1)>>1]|0;b[h>>1]=b[j+(B+48<<1)>>1]|0;b[p>>1]=b[j+(B+64<<1)>>1]|0;b[q>>1]=b[j+(B+80<<1)>>1]|0;b[r>>1]=b[j+(B+96<<1)>>1]|0;b[s>>1]=b[j+(B+112<<1)>>1]|0;b[t>>1]=b[j+(B+128<<1)>>1]|0;b[u>>1]=b[j+(B+144<<1)>>1]|0;b[v>>1]=b[j+(B+160<<1)>>1]|0;b[w>>1]=b[j+(B+176<<1)>>1]|0;b[x>>1]=b[j+(B+192<<1)>>1]|0;b[y>>1]=b[j+(B+208<<1)>>1]|0;b[z>>1]=b[j+(B+224<<1)>>1]|0;b[A>>1]=b[j+(B+240<<1)>>1]|0;Ab[n&7](k,m);C=0;do{D=f+((S(C,g)|0)+B)|0;E=((b[m+(C<<1)>>1]|0)+32>>6)+(d[D>>0]|0)|0;a[D>>0]=(E|0)>255?-1:((E|0)>0?E:0)&255;C=C+1|0}while((C|0)!=16);B=B+1|0}while((B|0)!=16);l=i;return}function We(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)>1){Xd(a,b,c);return}else{Yd(a,b,c);return}}function Xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)>1){Ud(a,b,c);return}else{Vd(a,b,c);return}}function Ye(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)==1){$d(a,b,c);return}if((d|0)<13){ce(a,b,c);return}else{_d(a,b,c);return}}function Ze(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)==1){he(a,b,c);return}if((d|0)<11){ge(a,b,c);return}else{ee(a,b,c);return}}function _e(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)==1){me(a,b,c);return}if((d|0)<35){le(a,b,c);return}if((d|0)<136){ke(a,b,c);return}else{je(a,b,c);return}}function $e(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(a|0){Te(b,c,d,a);return}if((e|0)>1){Xd(b,c,d);return}else{Yd(b,c,d);return}}function af(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(a|0){Ue(b,c,d,a);return}if((e|0)==1){$d(b,c,d);return}if((e|0)<13){ce(b,c,d);return}else{_d(b,c,d);return}}function bf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(a|0){Ve(b,c,d,a);return}if((e|0)==1){he(b,c,d);return}if((e|0)<11){ge(b,c,d);return}else{ee(b,c,d);return}}function cf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[d+300>>2]|0;f=c[d+296>>2]|0;d=(e|0)!=0;g=(f|0)!=0;if(!(d&g)){if(!(d|g)){h=1;return h|0}g=d?e:f;if((a[g+9>>0]|0)>0){h=3;return h|0}h=(a[g+8>>0]|0)==(a[b+4100>>0]|0)&1;return h|0}g=(a[f+9>>0]|0)>0;if((a[e+9>>0]|0)>0){if(g){h=4;return h|0}d=a[f+8>>0]|0;if(d<<24>>24==(a[b+4100>>0]|0)){h=3;return h|0}h=d<<24>>24>0?2:3;return h|0}d=a[e+8>>0]|0;e=a[b+4100>>0]|0;b=d<<24>>24==e<<24>>24;if(!g){h=(b^(a[f+8>>0]|0)==e<<24>>24)&1;return h|0}if(b){h=3;return h|0}h=d<<24>>24>0?2:3;return h|0}function df(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=c[d+300>>2]|0;f=c[d+296>>2]|0;d=(e|0)!=0;g=(f|0)!=0;h=a[b+4100>>0]|0;i=(c[b+3924+(h<<24>>24<<2)>>2]|0)==0;j=i&1;if(!(d&g)){if(!(d|g)){k=2;return k|0}g=d?e:f;d=a[g+8>>0]|0;if(d<<24>>24<=0){k=2;return k|0}l=a[b+4102>>0]|0;if((a[g+9>>0]|0)>0){k=((a[g+8+j>>0]|0)!=l<<24>>24&1)<<2;return k|0}else{k=d<<24>>24!=l<<24>>24?3:0;return k|0}}l=(a[e+8>>0]|0)>0;d=(a[f+8>>0]|0)>0;if(!(l|d)){k=2;return k|0}if(!(l&d)){d=l?e:f;k=((a[((a[d+9>>0]|0)>0&i&1)+(d+8)>>0]|0)!=(a[b+4102>>0]|0)&1)<<1|1;return k|0}d=(a[f+9>>0]|0)>0;l=(a[e+9>>0]|0)>0;j=a[(i&l&1)+(e+8)>>0]|0;e=a[(i&d&1)+(f+8)>>0]|0;f=j<<24>>24==e<<24>>24;if(f?(a[b+4102>>0]|0)==j<<24>>24:0){k=0;return k|0}if(d|l){if(d&l){k=f?4:2;return k|0}i=d?e:j;d=l?e:j;l=a[b+4102>>0]|0;if(i<<24>>24!=l<<24>>24?1:d<<24>>24==l<<24>>24)return ((d<<24>>24!=l<<24>>24?1:i<<24>>24==l<<24>>24)?4:2)|0;else{k=1;return k|0}}if(j<<24>>24==h<<24>>24?e<<24>>24==(a[b+4101>>0]|0):0){k=4;return k|0}if(e<<24>>24==h<<24>>24?j<<24>>24==(a[b+4101>>0]|0):0){k=4;return k|0}k=f?3:1;return k|0}function ef(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[b+300>>2]|0;e=c[b+296>>2]|0;b=(d|0)!=0;f=(e|0)!=0;if(!(b&f)){if(!(b|f)){g=2;return g|0}f=b?d:e;b=a[f+8>>0]|0;if(b<<24>>24<=0){g=2;return g|0}h=a[f+9>>0]|0;f=b<<24>>24==1;if(h<<24>>24<=0){g=(f&1)<<2;return g|0}if(f){g=2;return g|0}g=h<<24>>24==1?2:1;return g|0}h=a[d+8>>0]|0;f=h<<24>>24>0;b=a[e+8>>0]|0;i=b<<24>>24>0;if(!(f|i)){g=2;return g|0}if(!(f&i)){i=f?d:e;f=a[i+9>>0]|0;j=(a[i+8>>0]|0)==1;if(f<<24>>24<=0){g=(j&1)<<2;return g|0}if(j){g=2;return g|0}g=f<<24>>24==1?2:1;return g|0}f=a[d+9>>0]|0;d=f<<24>>24>0;j=a[e+9>>0]|0;e=j<<24>>24>0;if(d&e){g=h<<24>>24==1|f<<24>>24==1|b<<24>>24==1|j<<24>>24==1?2:1;return g|0}if(!(d|e)){g=(b<<24>>24==1&1)+(h<<24>>24==1&1)<<1;return g|0}e=(d?h:b)<<24>>24==1?1:(d?f:j)<<24>>24==1;if((d?b:h)<<24>>24==1){g=e?4:3;return g|0}else{g=e&1;return g|0}return 0}function ff(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[b+300>>2]|0;e=c[b+296>>2]|0;b=(d|0)!=0;f=(e|0)!=0;if(!(b&f)){if(!(b|f)){g=2;return g|0}f=b?d:e;b=a[f+8>>0]|0;if(b<<24>>24<=0){g=2;return g|0}h=a[f+9>>0]|0;f=h<<24>>24>0;do if(b<<24>>24==1){if(!f){g=2;return g|0}}else{i=b<<24>>24==2;if(f){if(i)g=3;else break;return g|0}else{g=(i&1)<<2;return g|0}}while(0);g=h<<24>>24==2?3:0;return g|0}h=a[d+8>>0]|0;f=h<<24>>24>0;b=a[e+8>>0]|0;i=b<<24>>24>0;if(!(f|i)){g=2;return g|0}if(!(f&i)){i=f?d:e;f=a[i+9>>0]|0;j=a[i+8>>0]|0;if(f<<24>>24<=0)return (j<<24>>24==1?3:(j<<24>>24==2&1)<<2)|0;g=((j<<24>>24==2|f<<24>>24==2)&1)<<1|1;return g|0}f=a[d+9>>0]|0;d=f<<24>>24>0;j=a[e+9>>0]|0;e=j<<24>>24>0;if(d&e){if(!(h<<24>>24==b<<24>>24?f<<24>>24==j<<24>>24:0)){g=2;return g|0}g=h<<24>>24==2|f<<24>>24==2?3:0;return g|0}if(!(d|e)){e=h<<24>>24==1;i=b<<24>>24==1;if(e&i){g=3;return g|0}if(e|i){g=((e?b:h)<<24>>24==2&1)<<2;return g|0}else{g=(b<<24>>24==2&1)+(h<<24>>24==2&1)<<1;return g|0}}else{e=d?f:j;j=(d?h:b)<<24>>24==2;switch((d?b:h)<<24>>24){case 2:{g=j|e<<24>>24==2?4:3;return g|0}case 3:{g=(j|e<<24>>24==2)&1;return g|0}default:{g=((j|e<<24>>24==2)&1)<<1|1;return g|0}}}return 0}function gf(){vj(34832,3)|0;return}function hf(){return}function jf(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;h=e<<4;e=c[g>>2]|0;i=((e|0)<0)<<31>>31;j=Vj(e|0,i|0,h|0,((h|0)<0)<<31>>31|0)|0;h=Nj(j|0,D|0,14)|0;j=f<<4;f=c[g+4>>2]|0;g=((f|0)<0)<<31>>31;k=Vj(f|0,g|0,j|0,((j|0)<0)<<31>>31|0)|0;j=Nj(k|0,D|0,14)|0;k=b[d>>1]|0;l=Vj(k|0,((k|0)<0)<<31>>31|0,f|0,g|0)|0;g=Nj(l|0,D|0,14)|0;l=b[d+2>>1]|0;d=Vj(l|0,((l|0)<0)<<31>>31|0,e|0,i|0)|0;i=Nj(d|0,D|0,14)|0;c[a>>2]=g+(j&15);c[a+4>>2]=i+(h&15);return}function kf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((d<<4|0)<(f|0)|((b<<4|0)<(e|0)|((e<<1|0)<(b|0)|(f<<1|0)<(d|0)))){c[a>>2]=-1;c[a+4>>2]=-1;return}g=(b<<14|0)/(e|0)|0;c[a>>2]=g;e=(d<<14|0)/(f|0)|0;c[a+4>>2]=e;f=g>>10;c[a+8>>2]=f;d=e>>10;c[a+12>>2]=d;if((g|0)==-1)h=0;else h=(e|0)!=-1&((g|0)!=16384|(e|0)!=16384);c[a+16>>2]=h?18:19;c[a+20>>2]=h?20:19;h=(f|0)==16;f=(d|0)==16;if(h){i=f?5:2;j=f?6:4;k=f?9:10;l=f?3:4;m=f?7:8;n=f?1:2}else{d=f?11:8;e=f?12:10;i=8;j=10;k=e;l=e;m=d;n=d}c[a+24>>2]=n;c[a+28>>2]=l;c[a+32>>2]=i;c[a+36>>2]=j;c[a+40>>2]=m;c[a+44>>2]=k;k=a+48|0;if(h&f){c[k>>2]=13;c[a+52>>2]=14;return}else{c[k>>2]=8;c[a+52>>2]=10;return}}function lf(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;b=Vj(d|0,((d|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=Nj(b|0,D|0,14)|0;return a|0}function mf(a,b){a=a|0;b=b|0;return a|0}function nf(a,b){a=a|0;b=b|0;var d=0;d=c[b+4>>2]|0;b=Vj(d|0,((d|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=Nj(b|0,D|0,14)|0;return a|0}function of(a){a=a|0;var b=0;b=a+16|0;a=b+100|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function pf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+80+(b<<2)|0;c[e>>2]=c[e>>2]|1<<d;return}function qf(a){a=a|0;return c[19684+(a<<2)>>2]|0}function rf(a){a=a|0;return c[19700+(a<<2)>>2]|0}function sf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[a+16+(c<<3)+(d<<1)>>1]=e;return}function tf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+600>>2]|0;f=c[b+17372>>2]|0;b=e+7>>3;g=(S(b,d)|0)>>f<<3;c[a>>2]=(g|0)<(e|0)?g:e;g=(S(b,d+1|0)|0)>>f<<3;c[a+4>>2]=(g|0)<(e|0)?g:e;return}function uf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+608>>2]|0;f=c[b+17368>>2]|0;b=e+7>>3;g=(S(b,d)|0)>>f<<3;c[a+8>>2]=(g|0)<(e|0)?g:e;g=(S(b,d+1|0)|0)>>f<<3;c[a+12>>2]=(g|0)<(e|0)?g:e;return}function vf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c[b+600>>2]|0;g=c[b+17372>>2]|0;h=f+7>>3;i=(S(h,d)|0)>>g<<3;c[a>>2]=(i|0)<(f|0)?i:f;i=(S(h,d+1|0)|0)>>g<<3;c[a+4>>2]=(i|0)<(f|0)?i:f;f=c[b+608>>2]|0;i=c[b+17368>>2]|0;b=f+7>>3;g=(S(b,e)|0)>>i<<3;c[a+8>>2]=(g|0)<(f|0)?g:f;g=(S(b,e+1|0)|0)>>i<<3;c[a+12>>2]=(g|0)<(f|0)?g:f;return}function wf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+7>>3;a=0;while(1)if((64<<a|0)<(e|0))a=a+1|0;else break;c[b>>2]=a;a=1;while(1)if((e>>a|0)>3)a=a+1|0;else break;c[d>>2]=a+-1;return}function xf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+3948|0;d=c[b>>2]|0;e=(d|0)>0;f=(e&1)+((d|0)>4&1)|0;g=9-d|0;if(e){e=0;do{d=e>>f;h=(d|0)>(g|0)?g:d;d=(h|0)>1?h:1;Jj(a+784+(e*48|0)+16|0,d&255|0,16)|0;Jj(a+784+(e*48|0)|0,(e<<1)+4+d&255|0,16)|0;e=e+1|0}while((e|0)!=64)}else{e=0;do{g=e>>f;d=(g|0)>1?g:1;Jj(a+784+(e*48|0)+16|0,d&255|0,16)|0;Jj(a+784+(e*48|0)|0,(e<<1)+4+d&255|0,16)|0;e=e+1|0}while((e|0)!=64)}c[a+3952>>2]=c[b>>2];b=0;do{Jj(a+784+(b*48|0)+32|0,b>>>4&255|0,16)|0;b=b+1|0}while((b|0)!=64);return}function yf(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=e>>5;g=d+3952|0;h=d+3948|0;i=c[h>>2]|0;if((c[g>>2]|0)!=(i|0)){j=(i|0)>0;k=(j&1)+((i|0)>4&1)|0;l=9-i|0;if(j){j=0;do{i=j>>k;m=(i|0)>(l|0)?l:i;i=(m|0)>1?m:1;Jj(d+784+(j*48|0)+16|0,i&255|0,16)|0;Jj(d+784+(j*48|0)|0,(j<<1)+4+i&255|0,16)|0;j=j+1|0}while((j|0)!=64)}else{j=0;do{l=j>>k;i=(l|0)>1?l:1;Jj(d+784+(j*48|0)+16|0,i&255|0,16)|0;Jj(d+784+(j*48|0)|0,(j<<1)+4+i&255|0,16)|0;j=j+1|0}while((j|0)!=64)}c[g>>2]=c[h>>2]}h=d+3980|0;g=d+3956|0;j=d+3958|0;k=d+3983|0;i=d+3959|0;l=d+3966|0;m=d+3967|0;n=d+3960|0;o=d+3961|0;p=0;do{if((a[h>>0]|0)!=0?(c[d+4060+(p<<2)>>2]&2|0)!=0:0){q=((a[k>>0]|0)==1?0:e)+(b[d+3996+(p<<3)+2>>1]|0)|0;r=(q|0)<0?0:(q|0)<63?q:63}else r=e;if(!(a[g>>0]|0))Jj(d+3856+(p<<3)|0,r&255|0,8)|0;else{q=(a[j>>0]<<f)+r|0;a[d+3856+(p<<3)>>0]=(q|0)<0?0:((q|0)<63?q:63)&255;q=(a[i>>0]<<f)+r|0;s=a[l>>0]<<f;t=q+s|0;a[d+3856+(p<<3)+2>>0]=(t|0)<0?0:((t|0)<63?t:63)&255;t=a[m>>0]<<f;u=q+t|0;a[d+3856+(p<<3)+3>>0]=(u|0)<0?0:((u|0)<63?u:63)&255;u=(a[n>>0]<<f)+r|0;q=u+s|0;a[d+3856+(p<<3)+4>>0]=(q|0)<0?0:((q|0)<63?q:63)&255;q=u+t|0;a[d+3856+(p<<3)+5>>0]=(q|0)<0?0:((q|0)<63?q:63)&255;q=(a[o>>0]<<f)+r|0;u=q+s|0;a[d+3856+(p<<3)+6>>0]=(u|0)<0?0:((u|0)<63?u:63)&255;u=q+t|0;a[d+3856+(p<<3)+7>>0]=(u|0)<0?0:((u|0)<63?u:63)&255}p=p+1|0}while((p|0)!=8);return}function zf(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0;h=g+24|0;i=g+16|0;j=i;k=c[j>>2]|c[h>>2];l=c[j+4>>2]|c[h+4>>2];h=i;c[h>>2]=k;c[h+4>>2]=l;h=g+56|0;j=g+48|0;m=j;n=c[m>>2]|c[h>>2];o=c[m+4>>2]|c[h+4>>2];h=j;c[h>>2]=n;c[h+4>>2]=o;h=g+76|0;m=b[h>>1]|b[g+78>>1];b[h>>1]=m;p=g+84|0;q=b[p>>1]|b[g+86>>1];b[p>>1]=q;r=g;s=c[r>>2]|0;t=c[r+4>>2]|0;r=g+8|0;u=r;v=c[u>>2]|s&286331153;w=c[u+4>>2]|t&286331153;u=r;c[u>>2]=v;c[u+4>>2]=w;u=s&-286331154;s=t&-286331154;t=g;c[t>>2]=u;c[t+4>>2]=s;t=g+32|0;x=t;y=c[x>>2]|0;z=c[x+4>>2]|0;x=g+40|0;A=x;B=c[A>>2]|y&255;C=c[A+4>>2]|z&255;A=x;c[A>>2]=B;c[A+4>>2]=C;A=y&-256;y=z&-256;z=t;c[z>>2]=A;c[z+4>>2]=y;z=g+72|0;E=e[z>>1]|0;F=g+74|0;G=e[F>>1]|0|E&4369;H=G&65535;b[F>>1]=H;I=E&61166;E=I&65535;b[z>>1]=E;J=g+80|0;K=e[J>>1]|0;L=g+82|0;M=e[L>>1]|0|K&15;b[L>>1]=M;N=K&65520;b[J>>1]=N;K=c[a+600>>2]|0;a:do if((d+8|0)>(K|0)){O=K-d|0;P=((O|0)<0)<<31>>31;Q=Mj(O|0,P|0,3)|0;R=Mj(1,0,Q|0)|0;Q=Kj(R|0,D|0,-1,-1)|0;R=D;S=Kj(O|0,P|0,1,0)|0;P=Nj(S|0,D|0,1)|0;S=Mj(P|0,D|0,2)|0;P=(1<<S)+65535|0;S=u&Q;T=s&R;U=g;c[U>>2]=S;c[U+4>>2]=T;U=A&Q;V=y&R;W=t;c[W>>2]=U;c[W+4>>2]=V;W=I&P&65535;b[z>>1]=W;X=N&P;b[J>>1]=X;Y=v&Q;Z=w&R;_=r;c[_>>2]=Y;c[_+4>>2]=Z;_=B&Q;$=C&R;aa=x;c[aa>>2]=_;c[aa+4>>2]=$;aa=G&P&65535;b[F>>1]=aa;ba=M&P;b[L>>1]=ba;ca=k&Q;da=l&R;ea=i;c[ea>>2]=ca;c[ea+4>>2]=da;ea=n&Q;fa=o&R;ga=j;c[ga>>2]=ea;c[ga+4>>2]=fa;ga=m&65535&P&65535;b[h>>1]=ga;ha=q&65535&P;ia=ha&65535;b[p>>1]=ia;ja=g+64|0;ka=ja;la=c[ka+4>>2]&R;R=ja;c[R>>2]=c[ka>>2]&Q;c[R+4>>2]=la;la=g+88|0;b[la>>1]=(e[la>>1]|0)&P;switch(O|0){case 1:{O=ba|ha;b[L>>1]=O;b[p>>1]=0;ma=S;na=T;oa=U;pa=V;qa=W;ra=X;sa=Y;ta=Z;ua=_;va=$;wa=aa;xa=O;ya=ca;za=da;Aa=ea;Ba=fa;Ca=ga;Da=0;break a;break}case 5:{O=ba|ha&65280;b[L>>1]=O;P=((ha|255)^65280)&ha&65535;b[p>>1]=P;ma=S;na=T;oa=U;pa=V;qa=W;ra=X;sa=Y;ta=Z;ua=_;va=$;wa=aa;xa=O;ya=ca;za=da;Aa=ea;Ba=fa;Ca=ga;Da=P;break a;break}default:{ma=S;na=T;oa=U;pa=V;qa=W;ra=X;sa=Y;ta=Z;ua=_;va=$;wa=aa;xa=ba;ya=ca;za=da;Aa=ea;Ba=fa;Ca=ga;Da=ia;break a}}}else{ma=u;na=s;oa=A;pa=y;qa=E;ra=N;sa=v;ta=w;ua=B;va=C;wa=H;xa=M;ya=k;za=l;Aa=n;Ba=o;Ca=m;Da=q}while(0);q=c[a+608>>2]|0;b:do if((f+8|0)>(q|0)){a=q-f|0;m=((a|0)<0)<<31>>31;o=(1<<a)+-1|0;n=Vj(o|0,((o|0)<0)<<31>>31|0,16843009,16843009)|0;o=D;l=Kj(a|0,m|0,1,0)|0;k=Nj(l|0,D|0,1)|0;l=(4369<<k)+61167|0;k=Nj(a|0,m|0,1)|0;m=ma&n;M=na&o;H=g;c[H>>2]=m;c[H+4>>2]=M;H=t;c[H>>2]=oa&n;c[H+4>>2]=pa&o;H=qa&65535&l&65535;b[z>>1]=H;b[J>>1]=ra&l;C=sa&n;B=ta&o;w=r;c[w>>2]=C;c[w+4>>2]=B;w=x;c[w>>2]=ua&n;c[w+4>>2]=va&o;w=wa&65535&l;v=w&65535;b[F>>1]=v;b[L>>1]=xa&l;N=ya&n;E=za&o;y=i;c[y>>2]=N;c[y+4>>2]=E;y=j;c[y>>2]=Aa&n;c[y+4>>2]=Ba&o;y=Ca&65535&l;A=y&65535;b[h>>1]=A;b[p>>1]=Da&65535&l;l=g+64|0;s=l;u=c[s+4>>2]&o;o=l;c[o>>2]=c[s>>2]&n;c[o+4>>2]=u;u=g+88|0;b[u>>1]=(e[u>>1]|0)&(4369<<k)+61167;switch(a|0){case 1:{a=(w|y)&65535;b[F>>1]=a;b[h>>1]=0;Ea=m;Fa=M;Ga=H;Ha=C;Ia=B;Ja=a;Ka=N;La=E;Ma=0;break b;break}case 5:{a=(w|y&52428)&65535;b[F>>1]=a;w=((y|13107)^52428)&y&65535;b[h>>1]=w;Ea=m;Fa=M;Ga=H;Ha=C;Ia=B;Ja=a;Ka=N;La=E;Ma=w;break b;break}default:{Ea=m;Fa=M;Ga=H;Ha=C;Ia=B;Ja=v;Ka=N;La=E;Ma=A;break b}}}else{Ea=ma;Fa=na;Ga=qa;Ha=sa;Ia=ta;Ja=wa;Ka=ya;La=za;Ma=Ca}while(0);if(f|0)return;f=g;c[f>>2]=Ea&-16843010;c[f+4>>2]=Fa&-16843010;b[z>>1]=Ga&-4370;Ga=r;c[Ga>>2]=Ha&-16843010;c[Ga+4>>2]=Ia&-16843010;b[F>>1]=Ja&-4370;Ja=i;c[Ja>>2]=Ka&-16843010;c[Ja+4>>2]=La&-16843010;b[h>>1]=Ma&-4370;return}function Af(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0;i=l;l=l+192|0;j=i+96|0;k=i+64|0;m=i+32|0;n=i;o=i+128|0;p=e+4|0;q=c[p>>2]|0;r=e+8|0;s=c[r>>2]|0;t=1<<s;u=1<<q;v=c[b+612>>2]<<s;w=e+12|0;x=c[w>>2]|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;c[k+28>>2]=0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;c[m+28>>2]=0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;c[n+28>>2]=0;y=b+600|0;z=b+608|0;A=(s|0)==0;B=~((h|0)==0);C=e+16|0;e=x;D=(q|0)!=0;E=A^1;F=e;G=f;f=0;while(1){H=f+g|0;I=c[y>>2]|0;if((H|0)>=(I|0))break;J=f<<3;K=n+(f<<2)|0;L=(f>>s&3|0)==0;M=k+(f<<2)|0;N=j+(f<<2)|0;O=(f&t|0)==0;P=c[z>>2]|0;Q=P+-1|0;R=(H|0)==(I+-1|0)&E;I=R?M:N;H=R?M:N;N=0;M=0;R=0;S=0;while(1){T=N+h|0;if((T|0)>=(P|0)){U=M;V=R;W=S;break}X=c[G+(N<<2)>>2]|0;if(!(a[X+3>>0]|0))Y=0;else Y=(a[X+8>>0]|0)>0;Z=d[X>>0]|0;if((d[29033+Z>>0]|0)>1)_=((d[29059+Z>>0]|0)+-1&N|0)==0&1;else _=1;$=Y&(_|0)==0;if((d[29046+Z>>0]|0)>1)aa=((d[29072+Z>>0]|0)+-1&f|0)==0&1;else aa=1;ba=Y&(aa|0)==0;ca=a[(c[r>>2]|0)+(29207+(Z<<4)+(d[X+2>>0]<<2)+(c[p>>2]<<1))>>0]|0;Z=(T|0)==(Q|0)&D;T=a[(c[19716+(d[X+1>>0]<<2)>>2]|0)+(b+3856+(a[X+4>>0]<<3)+(a[X+8>>0]<<1))>>0]|0;X=N>>q;a[o+(X+J)>>0]=T;a:do if(!(T<<24>>24)){da=M;ea=R;fa=S}else switch(ca<<24>>24){case 3:{do if((X&3|0)==0&($^1)){ga=1<<X;if(Z){ha=M;ia=ga|S;break}else{ha=ga|M;ia=S;break}}else{ha=M;ia=S}while(0);if(ba|L^1){da=ha;ea=R;fa=ia;break a}c[I>>2]=c[I>>2]|1<<X;da=ha;ea=R;fa=ia;break a;break}case 2:{do if((X&1|0)==0&($^1)){ga=1<<X;if(Z){ja=M;ka=ga|S;break}else{ja=ga|M;ka=S;break}}else{ja=M;ka=S}while(0);if(ba|O^1){da=ja;ea=R;fa=ka;break a}c[H>>2]=c[H>>2]|1<<X;da=ja;ea=R;fa=ka;break a;break}default:{do if(!$){ga=1<<X;if((X&3|0)==0|ca<<24>>24==1){la=R;ma=ga|S;break}else{la=ga|R;ma=S;break}}else{la=R;ma=S}while(0);if(!ba){ga=(L|ca<<24>>24==1?k:m)+(f<<2)|0;c[ga>>2]=c[ga>>2]|1<<X}if(Y|(ca<<24>>24!=0|Z)){da=M;ea=la;fa=ma;break a}c[K>>2]=c[K>>2]|1<<X;da=M;ea=la;fa=ma;break a}}while(0);N=N+u|0;if((N|0)>=8){U=da;V=ea;W=fa;break}else{M=da;R=ea;S=fa}}S=c[C>>2]|0;R=U&B;M=W&B;N=V&B;L=c[K>>2]|0;H=M|N|R|L;if(!H){na=S;oa=F}else{O=o+J|0;I=H;H=R;R=N;N=L;L=M;M=F;while(1){Q=d[O>>0]|0;P=b+784+(Q*48|0)|0;do if(I&1|0){if(H&1|0){Rd(M,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0);break}if(L&1|0){Ld(M,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0);break}if(R&1|0)Gd(M,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0)}while(0);if(N&1|0)Gd(M+4|0,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0);I=I>>>1;if(!I)break;else{O=O+1|0;H=H>>>1;R=R>>>1;N=N>>>1;L=L>>>1;M=M+8|0}}na=c[C>>2]|0;oa=c[w>>2]|0}F=oa+(na<<3)|0;c[w>>2]=F;f=f+t|0;if((f|0)>=8)break;else G=G+(v<<2)|0}c[w>>2]=x;x=b+784|0;if(A){A=e;b=0;while(1){v=b+g|0;if((v|0)>=(c[y>>2]|0)){pa=59;break}if(!v){qa=0;ra=0;sa=0}else{qa=c[j+(b<<2)>>2]|0;ra=c[m+(b<<2)>>2]|0;sa=c[k+(b<<2)>>2]|0}Bf(A,c[C>>2]|0,qa,sa,ra,c[n+(b<<2)>>2]|0,x,o+(b<<3)|0);A=(c[w>>2]|0)+(c[C>>2]<<3)|0;c[w>>2]=A;b=b+t|0;if((b|0)>=8){pa=59;break}}if((pa|0)==59){l=i;return}}else{ta=e;ua=0}while(1){e=ua+g|0;b=c[y>>2]|0;if((e|0)>=(b|0)){pa=59;break}if((e|0)==(b+-1|0))va=0;else va=c[n+(ua<<2)>>2]|0;if(!e){wa=0;xa=0;ya=0}else{wa=c[j+(ua<<2)>>2]|0;xa=c[m+(ua<<2)>>2]|0;ya=c[k+(ua<<2)>>2]|0}Bf(ta,c[C>>2]|0,wa,ya,xa,va,x,o+(ua<<3)|0);ta=(c[w>>2]|0)+(c[C>>2]<<3)|0;c[w>>2]=ta;ua=ua+t|0;if((ua|0)>=8){pa=59;break}}if((pa|0)==59){l=i;return}}function Bf(a,b,c,e,f,g,h,i){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=e|c|f|g;if(!j)return;k=b<<2;l=i;i=j;j=c;c=f;f=g;g=e;e=a;while(1){do if(i&1){a=d[l>>0]|0;m=h+(a*48|0)|0;if(j&1|0){n=h+(a*48|0)+16|0;o=h+(a*48|0)+32|0;if((j&3|0)==3){Qd(e,b,m,n,o);p=2;break}else{Nd(e,b,m,n,o);p=1;break}}if(g&1|0){if((g&3|0)!=3){o=h+(a*48|0)+16|0;n=h+(a*48|0)+32|0;Id(e,b,m,o,n);if(!(f&1)){p=1;break}Ed(e+k|0,b,m,o,n);p=1;break}n=d[l+1>>0]|0;o=h+(a*48|0)+16|0;q=h+(a*48|0)+32|0;r=h+(n*48|0)|0;s=h+(n*48|0)+16|0;t=h+(n*48|0)+32|0;Kd(e,b,m,o,q,r,s,t);if((f&3|0)==3){Fd(e+k|0,b,m,o,q,r,s,t);p=2;break}if(f&1|0){Ed(e+k|0,b,m,o,q);p=2;break}if(!(f&2)){p=2;break}Ed(e+8+k|0,b,r,s,t);p=2;break}if(!(c&1)){Ed(e+k|0,b,m,h+(a*48|0)+16|0,h+(a*48|0)+32|0);p=1;break}if((c&3|0)!=3){t=h+(a*48|0)+16|0;s=h+(a*48|0)+32|0;Ed(e,b,m,t,s);if(!(f&1)){p=1;break}Ed(e+k|0,b,m,t,s);p=1;break}s=d[l+1>>0]|0;t=h+(a*48|0)+16|0;r=h+(a*48|0)+32|0;a=h+(s*48|0)|0;q=h+(s*48|0)+16|0;o=h+(s*48|0)+32|0;Fd(e,b,m,t,r,a,q,o);if((f&3|0)==3){Fd(e+k|0,b,m,t,r,a,q,o);p=2;break}if(f&1|0){Ed(e+k|0,b,m,t,r);p=2;break}if(!(f&2))p=2;else{Ed(e+8+k|0,b,a,q,o);p=2}}else p=1;while(0);i=i>>>p;if(!i)break;else{l=l+p|0;j=j>>>p;c=c>>>p;f=f>>>p;g=g>>>p;e=e+(p<<3)|0}}return}function Cf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;f=b+12|0;g=c[f>>2]|0;h=e+16|0;i=c[h>>2]|0;j=c[h+4>>2]|0;h=e+8|0;k=c[h>>2]|0;l=c[h+4>>2]|0;h=e;m=c[h>>2]|0;n=c[h+4>>2]|0;h=e+64|0;o=h;p=c[o>>2]|0;q=c[o+4>>2]|0;o=a+600|0;r=b+4|0;s=b+16|0;b=a+784|0;a=g;if((((c[o>>2]|0)>(d|0)?(Df(c[r>>2]|0,a,c[s>>2]|0,i,k,m,p,b,e+90|0),t=c[s>>2]|0,u=(c[f>>2]|0)+(t<<4)|0,c[f>>2]=u,(d+2|0)<(c[o>>2]|0)):0)?(v=Nj(p|0,q|0,16)|0,w=Nj(m|0,n|0,16)|0,x=Nj(k|0,l|0,16)|0,y=Nj(i|0,j|0,16)|0,Df(c[r>>2]|0,u,t,y,x,w,v,b,e+106|0),v=c[s>>2]|0,w=(c[f>>2]|0)+(v<<4)|0,c[f>>2]=w,(d+4|0)<(c[o>>2]|0)):0)?(Df(c[r>>2]|0,w,v,j,l,n,q,b,e+122|0),v=c[s>>2]|0,w=(c[f>>2]|0)+(v<<4)|0,c[f>>2]=w,(d+6|0)<(c[o>>2]|0)):0){x=Nj(p|0,q|0,48)|0;q=Nj(m|0,n|0,48)|0;n=Nj(k|0,l|0,48)|0;l=Nj(i|0,j|0,48)|0;Df(c[r>>2]|0,w,v,l,n,q,x,b,e+138|0);c[f>>2]=(c[f>>2]|0)+(c[s>>2]<<4)}c[f>>2]=g;g=e+48|0;x=e+40|0;q=e+32|0;n=h;h=c[g>>2]|0;l=c[x>>2]|0;v=c[q>>2]|0;w=c[n>>2]|0;r=a;a=c[g+4>>2]|0;g=c[x+4>>2]|0;x=c[q+4>>2]|0;q=c[n+4>>2]|0;n=0;while(1){j=n+d|0;if((j|0)>=(c[o>>2]|0)){z=8;break}if(!j){A=0;B=0;C=0}else{A=h&255;B=v&255;C=l&255}Bf(r,c[s>>2]|0,A,C,B,w&255,b,(n<<3)+(e+90)|0);r=(c[f>>2]|0)+(c[s>>2]<<3)|0;c[f>>2]=r;h=Nj(h|0,a|0,8)|0;a=D;l=Nj(l|0,g|0,8)|0;g=D;v=Nj(v|0,x|0,8)|0;x=D;w=Nj(w|0,q|0,8)|0;n=n+1|0;if((n|0)>=8){z=8;break}else q=D}if((z|0)==8)return}function Df(a,b,e,f,g,h,i,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;m=l;l=l+16|0;n=m+8|0;o=m;p=(a|0)!=0;a=p?4:8;q=1<<a;r=q|1;c[n>>2]=b;s=(g|f|h|i)&(p?255:65535);if(!s){l=m;return}p=q^-2;q=o+4|0;t=e<<3;u=n+4|0;v=b;b=k;k=s;s=f;f=h;h=i;i=g;while(1){if(k&r|0){g=d[b>>0]|0;w=j+(g*48|0)|0;c[o>>2]=w;x=d[b+a>>0]|0;y=j+(x*48|0)|0;c[q>>2]=y;c[u>>2]=v+t;z=s&r;do if(z|0)if((z|0)==(r|0)){Td(v,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0);break}else{A=s&1^1;B=c[o+(A<<2)>>2]|0;Rd(c[n+(A<<2)>>2]|0,e,B,B+16|0,B+32|0);break}while(0);z=i&r;do if(z|0)if((z|0)==(r|0)){Md(v,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0,y,j+(x*48|0)+16|0,j+(x*48|0)+32|0);break}else{B=i&1^1;A=c[o+(B<<2)>>2]|0;Ld(c[n+(B<<2)>>2]|0,e,A,A+16|0,A+32|0);break}while(0);z=f&r;do if(z|0)if((z|0)==(r|0)){Hd(v,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0,y,j+(x*48|0)+16|0,j+(x*48|0)+32|0);break}else{A=f&1^1;B=c[o+(A<<2)>>2]|0;Gd(c[n+(A<<2)>>2]|0,e,B,B+16|0,B+32|0);break}while(0);z=h&r;do if(z|0)if((z|0)==(r|0)){Hd(v+4|0,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0,y,j+(x*48|0)+16|0,j+(x*48|0)+32|0);break}else{B=h&1^1;A=c[o+(B<<2)>>2]|0;Gd((c[n+(B<<2)>>2]|0)+4|0,e,A,A+16|0,A+32|0);break}while(0)}v=v+8|0;c[n>>2]=v;k=(k&p)>>>1;if(!k)break;else{b=b+1|0;s=s>>>1;f=f>>>1;h=h>>>1;i=i>>>1}}l=m;return}function Ef(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=l;l=l+16|0;i=h;j=e+12|0;k=c[j>>2]|0;m=b[g+76>>1]|0;n=b[g+74>>1]|0;o=b[g+72>>1]|0;p=g+88|0;q=b[p>>1]|0;r=d+600|0;s=e+4|0;t=e+16|0;e=d+784|0;d=k;if((c[r>>2]|0)>(f|0)?(a[i>>0]=a[g+90>>0]|0,a[i+4>>0]=a[g+106>>0]|0,a[i+1>>0]=a[g+92>>0]|0,a[i+5>>0]=a[g+108>>0]|0,a[i+2>>0]=a[g+94>>0]|0,a[i+6>>0]=a[g+110>>0]|0,a[i+3>>0]=a[g+96>>0]|0,a[i+7>>0]=a[g+112>>0]|0,Df(c[s>>2]|0,d,c[t>>2]|0,m&65535,n&65535,o&65535,q&65535,e,i),u=c[t>>2]|0,v=(c[j>>2]|0)+(u<<4)|0,c[j>>2]=v,(f+4|0)<(c[r>>2]|0)):0){w=i+8|0;a[w>>0]=a[g+122>>0]|0;a[i+12>>0]=a[g+138>>0]|0;a[i+9>>0]=a[g+124>>0]|0;a[i+13>>0]=a[g+140>>0]|0;a[i+10>>0]=a[g+126>>0]|0;a[i+14>>0]=a[g+142>>0]|0;a[i+11>>0]=a[g+128>>0]|0;a[i+15>>0]=a[g+144>>0]|0;Df(c[s>>2]|0,v,u,(m&65535)>>>8&65535,(n&65535)>>>8&65535,(o&65535)>>>8&65535,(q&65535)>>>8&65535,e,w);c[j>>2]=(c[j>>2]|0)+(c[t>>2]<<4)}c[j>>2]=k;k=d;d=b[g+84>>1]|0;w=b[g+80>>1]|0;q=b[p>>1]|0;p=b[g+82>>1]|0;g=0;while(1){o=g+f|0;n=c[r>>2]|0;if((o|0)>=(n|0)){x=6;break}m=(o|0)==0;Bf(k,c[t>>2]|0,m?0:d&15,m?0:p&15,m?0:w&15,(o|0)==(n+-1|0)?0:q&15,e,i+(g<<1)|0);k=(c[j>>2]|0)+(c[t>>2]<<3)|0;c[j>>2]=k;g=g+2|0;if((g|0)>=8){x=6;break}else{d=(d&65535)>>>4;w=(w&65535)>>>4;q=(q&65535)>>>4;p=(p&65535)>>>4}}if((x|0)==6){l=h;return}}function Ff(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=(g|0)!=0;g=h?1:3;a:do if(h)i=1;else{switch(c[d+96>>2]|0){case 1:{if((c[d+92>>2]|0)==1){i=0;break a}break}case 0:{if(!(c[d+92>>2]|0)){i=1;break a}break}default:{}}i=2}while(0);if((e|0)>=(f|0))return;j=b+736|0;k=b+612|0;l=b+3972|0;m=b+3976|0;n=b+608|0;o=(i&3)==2;p=c[n>>2]|0;q=e;while(1){e=(c[j>>2]|0)+((S(c[k>>2]|0,q)|0)<<2)|0;if((p|0)>0){r=(c[l>>2]|0)+((S(c[m>>2]|0,q>>3)|0)*160|0)|0;s=0;while(1){Uf(d,a,q,s);zf(b,q,s,r);Cf(b,d,q,r);if(!h){t=e+(s<<2)|0;switch(i&3){case 0:{u=1;do{Ef(b,d+(u*88|0)|0,q,r);u=u+1|0}while((u|0)<(g|0));break}case 1:{u=1;do{Cf(b,d+(u*88|0)|0,q,r);u=u+1|0}while((u|0)<(g|0));break}default:{u=1;do{if(o)Af(b,d+(u*88|0)|0,t,q,s);u=u+1|0}while((u|0)<(g|0))}}}s=s+8|0;u=c[n>>2]|0;if((s|0)>=(u|0)){v=u;break}else r=r+160|0}}else v=p;q=q+8|0;if((q|0)>=(f|0))break;else p=v}return}function Gf(f,g,h,i,j,k){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;l=a[g+2>>0]|0;m=g+8|0;n=a[(c[19716+(d[g+1>>0]<<2)>>2]|0)+(f+3856+(a[g+4>>0]<<3)+(a[m>>0]<<1))>>0]|0;o=d[g>>0]|0;p=l&255;q=a[29207+(o<<4)+(p<<2)+3>>0]|0;r=c[f+3972>>2]|0;s=(S(c[f+3976>>2]|0,h>>3)|0)+(i>>3)|0;f=r+(s*160|0)+(p<<3)|0;t=r+(s*160|0)+32+(p<<3)|0;u=r+(s*160|0)+64|0;v=q&255;w=r+(s*160|0)+72+(v<<1)|0;x=r+(s*160|0)+80+(v<<1)|0;y=r+(s*160|0)+88|0;z=h&7;h=i&7;i=h|z<<3;A=h>>>1|z>>>1<<2;B=a[28826+(z<<3)+h>>0]|0;if(!(n<<24>>24))return;if((k|0)>0){h=0;z=i;while(1){Jj(r+(s*160|0)+90+z|0,n|0,j|0)|0;h=h+1|0;if((h|0)==(k|0))break;else z=z+8|0}}z=19088+(o<<3)|0;k=Mj(c[z>>2]|0,c[z+4>>2]|0,i|0)|0;z=t;h=c[z+4>>2]|D;j=t;c[j>>2]=c[z>>2]|k;c[j+4>>2]=h;h=19192+(o<<3)|0;j=Mj(c[h>>2]|0,c[h+4>>2]|0,i|0)|0;h=f;k=c[h+4>>2]|D;z=f;c[z>>2]=c[h>>2]|j;c[z+4>>2]=k;k=B<<24>>24!=0;if(k){b[x>>1]=e[x>>1]|e[21496+(o<<1)>>1]<<A;b[w>>1]=e[w>>1]|e[21522+(o<<1)>>1]<<A}if(a[g+3>>0]|0?(a[m>>0]|0)>0:0)return;m=19296+(o<<3)|0;g=c[m>>2]|0;B=c[m+4>>2]|0;m=19400+(p<<3)|0;z=Mj(c[m>>2]&g|0,c[m+4>>2]&B|0,i|0)|0;m=t;j=D|c[m+4>>2];h=t;c[h>>2]=z|c[m>>2];c[h+4>>2]=j;j=19432+(p<<3)|0;p=Mj(c[j>>2]&g|0,c[j+4>>2]&B|0,i|0)|0;j=f;h=D|c[j+4>>2];m=f;c[m>>2]=p|c[j>>2];c[m+4>>2]=h;if(k){h=b[21548+(o<<1)>>1]|0;b[x>>1]=(b[21574+(v<<1)>>1]&h&65535)<<A|e[x>>1];b[w>>1]=(b[21582+(v<<1)>>1]&h&65535)<<A|e[w>>1]}if(!(l<<24>>24)){l=Mj(g|0,B|0,i|0)|0;i=u;B=c[i+4>>2]|D;g=u;c[g>>2]=c[i>>2]|l;c[g+4>>2]=B}if(!(q<<24>>24==0&k))return;b[y>>1]=e[y>>1]|e[21548+(o<<1)>>1]<<A;return}function Hf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+272>>2]=0;c[a+276>>2]=0;c[a+280>>2]=0;Qj(a+8|0,e|0,264)|0;return}function If(a){a=a|0;if(!(c[a+3940>>2]|0))return;Jj(c[a+3972>>2]|0,0,S((c[a+3976>>2]|0)*160|0,(c[a+600>>2]|0)+7>>3)|0)|0;return}function Jf(a,b){a=a|0;b=b|0;Ff(c[a>>2]|0,c[a+4>>2]|0,a+8|0,c[a+272>>2]|0,c[a+276>>2]|0,c[a+280>>2]|0);return 1}function Kf(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(!e)return;k=b+600|0;l=c[k>>2]|0;if((g|0)!=0&(l|0)>8){m=(l|0)>71?l>>>3:8;n=l>>>1&2147483640}else{m=l;n=0}l=m+n|0;yf(b,e);e=we()|0;m=(c[k>>2]|0)+7>>3;k=1<<c[b+17368>>2];g=(k|0)>(i|0)?i:k;if(!(((c[j+12>>2]|0)!=0?(m|0)==(c[j+16>>2]|0):0)?(g|0)<=(c[j+24>>2]|0):0)){Lf(j);Mf(j,b,m,c[b+256>>2]|0,g)}Jj(c[j+8>>2]|0,-1,m<<2|0)|0;if((g|0)<=0)return;m=j+20|0;k=g+-1|0;i=e+16|0;o=e+12|0;p=0;do{q=h+(p*24|0)|0;r=c[m>>2]|0;s=r+(p*284|0)|0;c[h+(p*24|0)+8>>2]=21;c[h+(p*24|0)+12>>2]=j;c[h+(p*24|0)+16>>2]=s;Hf(s,a,b,d);c[r+(p*284|0)+272>>2]=(p<<3)+n;c[r+(p*284|0)+276>>2]=l;c[r+(p*284|0)+280>>2]=f;if((p|0)==(k|0))zb[c[i>>2]&31](q);else zb[c[o>>2]&31](q);p=p+1|0}while((p|0)<(g|0));p=e+8|0;e=0;do{Bb[c[p>>2]&7](h+(e*24|0)|0)|0;e=e+1|0}while((e|0)<(g|0));return}function Lf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;if(!a)return;b=c[a>>2]|0;if(b|0){d=a+16|0;if((c[d>>2]|0)>0){e=0;do e=e+1|0;while((e|0)<(c[d>>2]|0));f=c[a>>2]|0}else f=b;Yb(f)}f=a+4|0;b=c[f>>2]|0;if(b|0){d=a+16|0;if((c[d>>2]|0)>0){e=b;g=0;while(1){pj(e+(g*48|0)|0)|0;g=g+1|0;h=c[f>>2]|0;if((g|0)>=(c[d>>2]|0)){i=h;break}else e=h}}else i=b;Yb(i)}Yb(c[a+20>>2]|0);Yb(c[a+8>>2]|0);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;return}function Mf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=l;l=l+32|0;h=g+24|0;i=g+16|0;j=g+8|0;c[a+16>>2]=d;k=Wb(d*28|0)|0;c[a>>2]=k;if(!k){Ub(b,2,28890,g);m=c[a>>2]|0;n=m;o=m}else{n=k;o=k}k=(d|0)>0;if((n|0)!=0&k?(Aj(o,0)|0,(d|0)!=1):0){o=1;do{Aj((c[a>>2]|0)+(o*28|0)|0,0)|0;o=o+1|0}while((o|0)!=(d|0))}o=Wb(d*48|0)|0;n=a+4|0;c[n>>2]=o;if(!o){Ub(b,2,28925,j);j=c[n>>2]|0;p=j;q=j}else{p=o;q=o}if((p|0)!=0&k?(qj(q,0)|0,(d|0)!=1):0){q=1;do{qj((c[n>>2]|0)+(q*48|0)|0,0)|0;q=q+1|0}while((q|0)!=(d|0))}q=Wb(f*284|0)|0;c[a+20>>2]=q;if(!q)Ub(b,2,28959,i);c[a+24>>2]=f;f=Wb(d<<2)|0;c[a+8>>2]=f;if(f|0){r=(e|0)<640;s=(e|0)<1281;t=(e|0)<4097;u=t?4:8;v=s?2:u;w=r?1:v;x=a+12|0;c[x>>2]=w;l=g;return}Ub(b,2,28994,h);r=(e|0)<640;s=(e|0)<1281;t=(e|0)<4097;u=t?4:8;v=s?2:u;w=r?1:v;x=a+12|0;c[x>>2]=w;l=g;return}function Nf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;d=c[b>>2]|0;e=c[b+4>>2]|0;f=b+8|0;g=c[b+272>>2]|0;h=c[b+276>>2]|0;i=(c[b+280>>2]|0)!=0;j=i?1:3;k=e+608|0;l=c[k>>2]|0;m=l+7>>3;a:do if(i)n=1;else{switch(c[b+104>>2]|0){case 1:{if((c[b+100>>2]|0)==1){n=0;break a}break}case 0:{if(!(c[b+100>>2]|0)){n=1;break a}break}default:{}}n=2}while(0);if((g|0)>=(h|0))return 1;o=e+736|0;p=e+612|0;q=e+3972|0;r=e+3976|0;s=a+24|0;t=a+12|0;u=m+-1|0;v=a+8|0;w=a+4|0;x=l;l=g;while(1){g=(c[o>>2]|0)+((S(c[p>>2]|0,l)|0)<<2)|0;y=l>>3;if((x|0)>0){z=(y|0)==0;A=y+-1|0;B=(c[q>>2]|0)+((S(c[r>>2]|0,y)|0)*160|0)|0;C=0;while(1){D=C>>3;E=c[t>>2]|0;if(!z?(E+-1&D|0)==0:0){F=(c[a>>2]|0)+(A*28|0)|0;G=0;while(1){G=G+1|0;if(!(ij(F)|0))break;if((G|0)>=4e3){H=15;break}}if((H|0)==15){H=0;cj(F)|0}if(((c[(c[v>>2]|0)+(A<<2)>>2]|0)-E|0)<(D|0))do wj((c[w>>2]|0)+(A*48|0)|0,F)|0;while(((c[(c[v>>2]|0)+(A<<2)>>2]|0)-E|0)<(D|0));$i(F)|0}Uf(f,d,l,C);zf(e,l,C,B);Cf(e,f,l,B);b:do if(!i){E=g+(C<<2)|0;switch(n&3){case 0:{G=1;do{Ef(e,b+8+(G*88|0)|0,l,B);G=G+1|0}while((G|0)<(j|0));break}case 1:{G=1;do{Cf(e,b+8+(G*88|0)|0,l,B);G=G+1|0}while((G|0)<(j|0));break}case 2:{G=1;do{Af(e,b+8+(G*88|0)|0,E,l,C);G=G+1|0}while((G|0)<(j|0));break}default:break b}}while(0);F=c[t>>2]|0;if((u|0)>(D|0)){if(!((D|0)%(F|0)|0)){I=D;H=27}}else{I=F+m|0;H=27}if((H|0)==27){H=0;F=(c[a>>2]|0)+(y*28|0)|0;G=0;while(1){G=G+1|0;if(!(ij(F)|0))break;if((G|0)>=4e3){H=30;break}}if((H|0)==30){H=0;cj(F)|0}c[(c[v>>2]|0)+(y<<2)>>2]=I;rj((c[w>>2]|0)+(y*48|0)|0)|0;$i((c[a>>2]|0)+(y*28|0)|0)|0}C=C+8|0;G=c[k>>2]|0;if((C|0)>=(G|0)){J=G;break}else B=B+160|0}}else J=x;l=(c[s>>2]<<3)+l|0;if((l|0)>=(h|0))break;else x=J}return 1}function Of(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=0;do{f=a+(e*40|0)|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)>>2]|0);f=a+(e*40|0)+4|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+4>>2]|0);f=a+(e*40|0)+8|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+8>>2]|0);f=a+(e*40|0)+12|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+12>>2]|0);f=a+(e*40|0)+16|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+16>>2]|0);f=a+(e*40|0)+20|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+20>>2]|0);f=a+(e*40|0)+24|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+24>>2]|0);f=a+(e*40|0)+28|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+28>>2]|0);f=a+(e*40|0)+32|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+32>>2]|0);f=a+(e*40|0)+36|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+36>>2]|0);e=e+1|0}while((e|0)!=4);g=0;do{e=a+160+(g*40|0)|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)>>2]|0);e=a+160+(g*40|0)+4|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+4>>2]|0);e=a+160+(g*40|0)+8|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+8>>2]|0);e=a+160+(g*40|0)+12|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+12>>2]|0);e=a+160+(g*40|0)+16|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+16>>2]|0);e=a+160+(g*40|0)+20|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+20>>2]|0);e=a+160+(g*40|0)+24|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+24>>2]|0);e=a+160+(g*40|0)+28|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+28>>2]|0);e=a+160+(g*40|0)+32|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+32>>2]|0);e=a+160+(g*40|0)+36|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+36>>2]|0);g=g+1|0}while((g|0)!=10);h=0;do{g=a+560+(h<<4)|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)>>2]|0);g=a+560+(h<<4)+4|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)+4>>2]|0);g=a+560+(h<<4)+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)+8>>2]|0);g=a+560+(h<<4)+12|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)+12>>2]|0);h=h+1|0}while((h|0)!=16);if(!d){d=0;do{h=0;do{g=0;do{e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+4|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+4>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+8|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+8>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+12|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+12>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+16|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+16>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+20|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+20>>2]|0);g=g+1|0}while((g|0)!=6);i=0;do{g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+4|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+4>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+8>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+12|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+12>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+16|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+16>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+20|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+20>>2]|0);i=i+1|0}while((i|0)!=6);h=h+1|0}while((h|0)!=2);d=d+1|0}while((d|0)!=4)}else{d=0;do{i=0;do{h=0;do{g=0;do{e=a+10032+(d*576|0)+(i*288|0)+(h*24|0)+(g<<2)|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(i*288|0)+(h*24|0)+(g<<2)>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+4|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+4>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+8|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+8>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+12|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+12>>2]|0);g=g+1|0}while((g|0)!=6);h=h+1|0}while((h|0)!=6);j=0;do{h=0;do{g=a+10032+(d*576|0)+(i*288|0)+144+(j*24|0)+(h<<2)|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(i*288|0)+144+(j*24|0)+(h<<2)>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+4|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+4>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+8>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+12|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+12>>2]|0);h=h+1|0}while((h|0)!=6);j=j+1|0}while((j|0)!=6);i=i+1|0}while((i|0)!=2);d=d+1|0}while((d|0)!=4)}d=a+12336|0;c[d>>2]=(c[d>>2]|0)+(c[b+12336>>2]|0);d=a+12340|0;c[d>>2]=(c[d>>2]|0)+(c[b+12340>>2]|0);d=a+12344|0;c[d>>2]=(c[d>>2]|0)+(c[b+12344>>2]|0);d=a+12348|0;c[d>>2]=(c[d>>2]|0)+(c[b+12348>>2]|0);d=a+12352|0;c[d>>2]=(c[d>>2]|0)+(c[b+12352>>2]|0);d=a+12356|0;c[d>>2]=(c[d>>2]|0)+(c[b+12356>>2]|0);d=a+12360|0;c[d>>2]=(c[d>>2]|0)+(c[b+12360>>2]|0);d=a+12364|0;c[d>>2]=(c[d>>2]|0)+(c[b+12364>>2]|0);d=a+12368|0;c[d>>2]=(c[d>>2]|0)+(c[b+12368>>2]|0);d=a+12372|0;c[d>>2]=(c[d>>2]|0)+(c[b+12372>>2]|0);d=a+12376|0;c[d>>2]=(c[d>>2]|0)+(c[b+12376>>2]|0);d=a+12380|0;c[d>>2]=(c[d>>2]|0)+(c[b+12380>>2]|0);d=0;do{j=a+12384+(d<<4)|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)>>2]|0);j=a+12384+(d<<4)+4|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)+4>>2]|0);j=a+12384+(d<<4)+8|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)+8>>2]|0);j=a+12384+(d<<4)+12|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)+12>>2]|0);d=d+1|0}while((d|0)!=7);d=a+12496|0;c[d>>2]=(c[d>>2]|0)+(c[b+12496>>2]|0);d=a+12500|0;c[d>>2]=(c[d>>2]|0)+(c[b+12500>>2]|0);d=a+12504|0;c[d>>2]=(c[d>>2]|0)+(c[b+12504>>2]|0);d=a+12508|0;c[d>>2]=(c[d>>2]|0)+(c[b+12508>>2]|0);d=a+12512|0;c[d>>2]=(c[d>>2]|0)+(c[b+12512>>2]|0);d=a+12516|0;c[d>>2]=(c[d>>2]|0)+(c[b+12516>>2]|0);d=a+12520|0;c[d>>2]=(c[d>>2]|0)+(c[b+12520>>2]|0);d=a+12524|0;c[d>>2]=(c[d>>2]|0)+(c[b+12524>>2]|0);d=a+12528|0;c[d>>2]=(c[d>>2]|0)+(c[b+12528>>2]|0);d=a+12532|0;c[d>>2]=(c[d>>2]|0)+(c[b+12532>>2]|0);d=a+12536|0;c[d>>2]=(c[d>>2]|0)+(c[b+12536>>2]|0);d=a+12540|0;c[d>>2]=(c[d>>2]|0)+(c[b+12540>>2]|0);d=a+12544|0;c[d>>2]=(c[d>>2]|0)+(c[b+12544>>2]|0);d=a+12548|0;c[d>>2]=(c[d>>2]|0)+(c[b+12548>>2]|0);d=a+12552|0;c[d>>2]=(c[d>>2]|0)+(c[b+12552>>2]|0);d=a+12556|0;c[d>>2]=(c[d>>2]|0)+(c[b+12556>>2]|0);d=a+12560|0;c[d>>2]=(c[d>>2]|0)+(c[b+12560>>2]|0);d=a+12564|0;c[d>>2]=(c[d>>2]|0)+(c[b+12564>>2]|0);d=a+12568|0;c[d>>2]=(c[d>>2]|0)+(c[b+12568>>2]|0);d=a+12572|0;c[d>>2]=(c[d>>2]|0)+(c[b+12572>>2]|0);d=a+12576|0;c[d>>2]=(c[d>>2]|0)+(c[b+12576>>2]|0);d=a+12580|0;c[d>>2]=(c[d>>2]|0)+(c[b+12580>>2]|0);d=a+12584|0;c[d>>2]=(c[d>>2]|0)+(c[b+12584>>2]|0);d=a+12588|0;c[d>>2]=(c[d>>2]|0)+(c[b+12588>>2]|0);d=a+12592|0;c[d>>2]=(c[d>>2]|0)+(c[b+12592>>2]|0);d=a+12596|0;c[d>>2]=(c[d>>2]|0)+(c[b+12596>>2]|0);d=a+12600|0;c[d>>2]=(c[d>>2]|0)+(c[b+12600>>2]|0);d=a+12604|0;c[d>>2]=(c[d>>2]|0)+(c[b+12604>>2]|0);d=a+12608|0;c[d>>2]=(c[d>>2]|0)+(c[b+12608>>2]|0);d=a+12612|0;c[d>>2]=(c[d>>2]|0)+(c[b+12612>>2]|0);d=a+12616|0;c[d>>2]=(c[d>>2]|0)+(c[b+12616>>2]|0);d=a+12620|0;c[d>>2]=(c[d>>2]|0)+(c[b+12620>>2]|0);d=a+12624|0;c[d>>2]=(c[d>>2]|0)+(c[b+12624>>2]|0);d=a+12628|0;c[d>>2]=(c[d>>2]|0)+(c[b+12628>>2]|0);d=a+12632|0;c[d>>2]=(c[d>>2]|0)+(c[b+12632>>2]|0);d=a+12636|0;c[d>>2]=(c[d>>2]|0)+(c[b+12636>>2]|0);d=a+12640|0;c[d>>2]=(c[d>>2]|0)+(c[b+12640>>2]|0);d=a+12644|0;c[d>>2]=(c[d>>2]|0)+(c[b+12644>>2]|0);d=a+12648|0;c[d>>2]=(c[d>>2]|0)+(c[b+12648>>2]|0);d=a+12652|0;c[d>>2]=(c[d>>2]|0)+(c[b+12652>>2]|0);d=a+12656|0;c[d>>2]=(c[d>>2]|0)+(c[b+12656>>2]|0);d=a+12660|0;c[d>>2]=(c[d>>2]|0)+(c[b+12660>>2]|0);d=a+12664|0;c[d>>2]=(c[d>>2]|0)+(c[b+12664>>2]|0);d=a+12668|0;c[d>>2]=(c[d>>2]|0)+(c[b+12668>>2]|0);d=a+12672|0;c[d>>2]=(c[d>>2]|0)+(c[b+12672>>2]|0);d=a+12676|0;c[d>>2]=(c[d>>2]|0)+(c[b+12676>>2]|0);d=a+12680|0;c[d>>2]=(c[d>>2]|0)+(c[b+12680>>2]|0);d=a+12684|0;c[d>>2]=(c[d>>2]|0)+(c[b+12684>>2]|0);d=a+12688|0;c[d>>2]=(c[d>>2]|0)+(c[b+12688>>2]|0);d=a+12692|0;c[d>>2]=(c[d>>2]|0)+(c[b+12692>>2]|0);d=a+12696|0;c[d>>2]=(c[d>>2]|0)+(c[b+12696>>2]|0);d=a+12700|0;c[d>>2]=(c[d>>2]|0)+(c[b+12700>>2]|0);d=a+12720|0;c[d>>2]=(c[d>>2]|0)+(c[b+12720>>2]|0);d=a+12724|0;c[d>>2]=(c[d>>2]|0)+(c[b+12724>>2]|0);d=a+12728|0;c[d>>2]=(c[d>>2]|0)+(c[b+12728>>2]|0);d=a+12744|0;c[d>>2]=(c[d>>2]|0)+(c[b+12744>>2]|0);d=a+12748|0;c[d>>2]=(c[d>>2]|0)+(c[b+12748>>2]|0);d=a+12704|0;c[d>>2]=(c[d>>2]|0)+(c[b+12704>>2]|0);d=a+12708|0;c[d>>2]=(c[d>>2]|0)+(c[b+12708>>2]|0);d=a+12712|0;c[d>>2]=(c[d>>2]|0)+(c[b+12712>>2]|0);d=a+12716|0;c[d>>2]=(c[d>>2]|0)+(c[b+12716>>2]|0);d=a+12732|0;c[d>>2]=(c[d>>2]|0)+(c[b+12732>>2]|0);d=a+12736|0;c[d>>2]=(c[d>>2]|0)+(c[b+12736>>2]|0);d=a+12740|0;c[d>>2]=(c[d>>2]|0)+(c[b+12740>>2]|0);d=a+12752|0;c[d>>2]=(c[d>>2]|0)+(c[b+12752>>2]|0);d=a+12756|0;c[d>>2]=(c[d>>2]|0)+(c[b+12756>>2]|0);d=a+12760|0;c[d>>2]=(c[d>>2]|0)+(c[b+12760>>2]|0);d=a+12764|0;c[d>>2]=(c[d>>2]|0)+(c[b+12764>>2]|0);d=a+12768|0;c[d>>2]=(c[d>>2]|0)+(c[b+12768>>2]|0);d=a+12772|0;c[d>>2]=(c[d>>2]|0)+(c[b+12772>>2]|0);d=a+12776|0;c[d>>2]=(c[d>>2]|0)+(c[b+12776>>2]|0);d=a+12780|0;c[d>>2]=(c[d>>2]|0)+(c[b+12780>>2]|0);d=a+12784|0;c[d>>2]=(c[d>>2]|0)+(c[b+12784>>2]|0);d=a+12788|0;c[d>>2]=(c[d>>2]|0)+(c[b+12788>>2]|0);d=a+12792|0;c[d>>2]=(c[d>>2]|0)+(c[b+12792>>2]|0);d=a+12796|0;c[d>>2]=(c[d>>2]|0)+(c[b+12796>>2]|0);d=a+12800|0;c[d>>2]=(c[d>>2]|0)+(c[b+12800>>2]|0);d=a+12804|0;c[d>>2]=(c[d>>2]|0)+(c[b+12804>>2]|0);d=a+12808|0;c[d>>2]=(c[d>>2]|0)+(c[b+12808>>2]|0);d=a+12812|0;c[d>>2]=(c[d>>2]|0)+(c[b+12812>>2]|0);d=0;do{j=a+12816+(d*204|0)|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)>>2]|0);j=a+12816+(d*204|0)+188|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+188>>2]|0);j=a+12816+(d*204|0)+196|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+196>>2]|0);j=a+12816+(d*204|0)+4|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+4>>2]|0);j=a+12816+(d*204|0)+192|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+192>>2]|0);j=a+12816+(d*204|0)+200|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+200>>2]|0);j=a+12816+(d*204|0)+8|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+8>>2]|0);j=a+12816+(d*204|0)+12|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+12>>2]|0);j=a+12816+(d*204|0)+16|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+16>>2]|0);j=a+12816+(d*204|0)+20|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+20>>2]|0);j=a+12816+(d*204|0)+24|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+24>>2]|0);j=a+12816+(d*204|0)+28|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+28>>2]|0);j=a+12816+(d*204|0)+32|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+32>>2]|0);j=a+12816+(d*204|0)+36|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+36>>2]|0);j=a+12816+(d*204|0)+40|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+40>>2]|0);j=a+12816+(d*204|0)+44|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+44>>2]|0);j=a+12816+(d*204|0)+48|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+48>>2]|0);j=a+12816+(d*204|0)+52|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+52>>2]|0);j=a+12816+(d*204|0)+140|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+140>>2]|0);j=a+12816+(d*204|0)+144|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+144>>2]|0);j=a+12816+(d*204|0)+148|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+148>>2]|0);j=a+12816+(d*204|0)+152|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+152>>2]|0);j=a+12816+(d*204|0)+56|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+56>>2]|0);j=a+12816+(d*204|0)+156|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+156>>2]|0);j=a+12816+(d*204|0)+160|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+160>>2]|0);j=a+12816+(d*204|0)+164|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+164>>2]|0);j=a+12816+(d*204|0)+168|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+168>>2]|0);j=a+12816+(d*204|0)+60|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+60>>2]|0);j=a+12816+(d*204|0)+64|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+64>>2]|0);j=a+12816+(d*204|0)+68|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+68>>2]|0);j=a+12816+(d*204|0)+72|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+72>>2]|0);j=a+12816+(d*204|0)+76|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+76>>2]|0);j=a+12816+(d*204|0)+80|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+80>>2]|0);j=a+12816+(d*204|0)+84|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+84>>2]|0);j=a+12816+(d*204|0)+88|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+88>>2]|0);j=a+12816+(d*204|0)+92|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+92>>2]|0);j=a+12816+(d*204|0)+96|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+96>>2]|0);j=a+12816+(d*204|0)+100|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+100>>2]|0);j=a+12816+(d*204|0)+104|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+104>>2]|0);j=a+12816+(d*204|0)+108|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+108>>2]|0);j=a+12816+(d*204|0)+112|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+112>>2]|0);j=a+12816+(d*204|0)+116|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+116>>2]|0);j=a+12816+(d*204|0)+120|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+120>>2]|0);j=a+12816+(d*204|0)+124|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+124>>2]|0);j=a+12816+(d*204|0)+128|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+128>>2]|0);j=a+12816+(d*204|0)+132|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+132>>2]|0);j=a+12816+(d*204|0)+136|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+136>>2]|0);j=a+12816+(d*204|0)+172|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+172>>2]|0);j=a+12816+(d*204|0)+176|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+176>>2]|0);j=a+12816+(d*204|0)+180|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+180>>2]|0);j=a+12816+(d*204|0)+184|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+184>>2]|0);d=d+1|0}while((d|0)!=2);return}function Pf(a,c,d){a=a|0;c=c|0;d=d|0;d=c+a|0;return b[21590+(((d|0)<0?0:(d|0)<255?d:255)<<1)>>1]|0}function Qf(a,c,d){a=a|0;c=c|0;d=d|0;d=c+a|0;return b[22102+(((d|0)<0?0:(d|0)<255?d:255)<<1)>>1]|0}function Rf(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0;if(!(a[d>>0]|0)){g=f;return g|0}if(!(c[d+80+(e<<2)>>2]&1)){g=f;return g|0}h=((a[d+3>>0]|0)==1?0:f)+(b[d+16+(e<<3)>>1]|0)|0;g=(h|0)<0?0:(h|0)<255?h:255;return g|0}function Sf(a,d,e,f,g,h,i){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0;j=f<<4;f=g<<4;g=1-i|0;i=1-h|0;h=-64-j+(c[d+316>>2]<<i)|0;k=j+48+(c[d+320>>2]<<i)|0;j=-64-f+(c[d+324>>2]<<g)|0;l=f+48+(c[d+328>>2]<<g)|0;d=b[e+2>>1]<<i<<16>>16;i=b[e>>1]<<g<<16>>16;g=((i|0)<(j|0)?j:(i|0)>(l|0)?l:i)&65535|((d|0)<(h|0)?h:(d|0)>(k|0)?k:d)<<16;b[a>>1]=g;b[a+2>>1]=g>>>16;return}function Tf(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;switch((((c[d+4>>2]|0)>0&1)<<1|(c[d+8>>2]|0)>0)&3){case 0:{d=f+20+(h*12|0)+4+(g<<2)|0;i=e[d>>1]|e[d+2>>1]<<16;b[a>>1]=i;b[a+2>>1]=i>>>16;return}case 1:{d=f+20+(h*12|0)+4+(g<<2)|0;j=f+20+((h+2|0)*12|0)+4+(g<<2)|0;k=(b[j>>1]|0)+(b[d>>1]|0)|0;l=(b[j+2>>1]|0)+(b[d+2>>1]|0)|0;i=(((l>>31|1)+l|0)/2|0)<<16|(((k>>31|1)+k|0)/2|0)&65535;b[a>>1]=i;b[a+2>>1]=i>>>16;return}case 2:{k=f+20+(h*12|0)+4+(g<<2)|0;l=f+20+((h+1|0)*12|0)+4+(g<<2)|0;h=(b[l>>1]|0)+(b[k>>1]|0)|0;d=(b[l+2>>1]|0)+(b[k+2>>1]|0)|0;i=(((d>>31|1)+d|0)/2|0)<<16|(((h>>31|1)+h|0)/2|0)&65535;b[a>>1]=i;b[a+2>>1]=i>>>16;return}case 3:{h=f+24+(g<<2)|0;d=f+36+(g<<2)|0;k=f+48+(g<<2)|0;l=f+60+(g<<2)|0;g=(b[d>>1]|0)+(b[h>>1]|0)+(b[k>>1]|0)+(b[l>>1]|0)|0;f=(b[d+2>>1]|0)+(b[h+2>>1]|0)+(b[k+2>>1]|0)+(b[l+2>>1]|0)|0;i=(((f>>31&-4|2)+f|0)/4|0)<<16|(((g>>31&-4|2)+g|0)/4|0)&65535;b[a>>1]=i;b[a+2>>1]=i>>>16;return}default:{}}}function Uf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=c[b+56>>2]|0;g=c[b+60>>2]|0;h=c[b+16>>2]|0;i=c[b+36>>2]|0;j=e<<3;e=d<<3;c[a+12>>2]=(c[b+52>>2]|0)+((S(e>>c[a+8>>2],h)|0)+(j>>c[a+4>>2]));c[a+16>>2]=h;c[a+100>>2]=f+((S(e>>c[a+96>>2],i)|0)+(j>>c[a+92>>2]));c[a+104>>2]=i;c[a+188>>2]=g+((S(e>>c[a+184>>2],i)|0)+(j>>c[a+180>>2]));c[a+192>>2]=i;return}\nfunction Fh(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;j=l;l=l+64|0;k=j+16|0;m=j;n=j+24|0;o=j+8|0;p=j+20|0;c[k>>2]=e;q=(d|0)!=0;r=n+40|0;s=r;t=n+39|0;n=o+4|0;u=e;e=0;v=0;w=0;a:while(1){do if((e|0)>-1)if((v|0)>(2147483647-e|0)){c[(yh()|0)>>2]=75;x=-1;break}else{x=v+e|0;break}else x=e;while(0);y=a[u>>0]|0;if(!(y<<24>>24)){z=87;break}else{A=y;B=u}b:while(1){switch(A<<24>>24){case 37:{C=B;E=B;z=9;break b;break}case 0:{F=B;G=B;break b;break}default:{}}y=B+1|0;c[k>>2]=y;A=a[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((a[C+1>>0]|0)!=37){F=C;G=E;break c}y=E+1|0;H=C+2|0;c[k>>2]=H;if((a[H>>0]|0)==37){C=H;E=y;z=9}else{F=H;G=y;break}}while(0);y=G-u|0;if(q)Ih(d,u,y);if(y|0){u=F;e=x;v=y;continue}y=F+1|0;H=(a[y>>0]|0)+-48|0;if(H>>>0<10){I=(a[F+2>>0]|0)==36;J=I?H:-1;K=I?1:w;L=I?F+3|0:y}else{J=-1;K=w;L=y}c[k>>2]=L;y=a[L>>0]|0;I=(y<<24>>24)+-32|0;d:do if(I>>>0<32){H=y;M=0;N=L;O=I;while(1){P=1<<O;if(!(P&75913)){Q=H;R=N;S=M;break d}T=P|M;P=N+1|0;c[k>>2]=P;U=a[P>>0]|0;O=(U<<24>>24)+-32|0;if(O>>>0>=32){Q=U;R=P;S=T;break}else{H=U;M=T;N=P}}}else{Q=y;R=L;S=0}while(0);if(Q<<24>>24==42){y=R+1|0;I=(a[y>>0]|0)+-48|0;if(I>>>0<10?(a[R+2>>0]|0)==36:0){c[i+(I<<2)>>2]=10;V=1;W=R+3|0;X=c[g+((a[y>>0]|0)+-48<<3)>>2]|0}else{if(K|0){Y=-1;break}if(q){I=(c[f>>2]|0)+(4-1)&~(4-1);N=c[I>>2]|0;c[f>>2]=I+4;V=0;W=y;X=N}else{V=0;W=y;X=0}}c[k>>2]=W;y=(X|0)<0;Z=W;_=y?S|8192:S;$=V;aa=y?0-X|0:X}else{y=Jh(k)|0;if((y|0)<0){Y=-1;break}Z=c[k>>2]|0;_=S;$=K;aa=y}do if((a[Z>>0]|0)==46){if((a[Z+1>>0]|0)!=42){c[k>>2]=Z+1;y=Jh(k)|0;ba=c[k>>2]|0;ca=y;break}y=Z+2|0;N=(a[y>>0]|0)+-48|0;if(N>>>0<10?(a[Z+3>>0]|0)==36:0){c[i+(N<<2)>>2]=10;N=c[g+((a[y>>0]|0)+-48<<3)>>2]|0;I=Z+4|0;c[k>>2]=I;ba=I;ca=N;break}if($|0){Y=-1;break a}if(q){N=(c[f>>2]|0)+(4-1)&~(4-1);I=c[N>>2]|0;c[f>>2]=N+4;da=I}else da=0;c[k>>2]=y;ba=y;ca=da}else{ba=Z;ca=-1}while(0);y=ba;I=0;while(1){if(((a[y>>0]|0)+-65|0)>>>0>57){Y=-1;break a}ea=y+1|0;c[k>>2]=ea;fa=a[(a[y>>0]|0)+-65+(31800+(I*58|0))>>0]|0;ga=fa&255;if((ga+-1|0)>>>0<8){y=ea;I=ga}else break}if(!(fa<<24>>24)){Y=-1;break}N=(J|0)>-1;do if(fa<<24>>24==19)if(N){Y=-1;break a}else z=49;else{if(N){c[i+(J<<2)>>2]=ga;M=g+(J<<3)|0;H=c[M+4>>2]|0;O=m;c[O>>2]=c[M>>2];c[O+4>>2]=H;z=49;break}if(!q){Y=0;break a}Kh(m,ga,f)}while(0);if((z|0)==49?(z=0,!q):0){u=ea;e=x;v=0;w=$;continue}N=a[y>>0]|0;H=(I|0)!=0&(N&15|0)==3?N&-33:N;N=_&-65537;O=(_&8192|0)==0?_:N;e:do switch(H|0){case 110:{switch((I&255)<<24>>24){case 0:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 1:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 2:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}case 3:{b[c[m>>2]>>1]=x;u=ea;e=x;v=0;w=$;continue a;break}case 4:{a[c[m>>2]>>0]=x;u=ea;e=x;v=0;w=$;continue a;break}case 6:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 7:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}default:{u=ea;e=x;v=0;w=$;continue a}}break}case 112:{ha=O|8;ia=ca>>>0>8?ca:8;ja=120;z=61;break}case 88:case 120:{ha=O;ia=ca;ja=H;z=61;break}case 111:{M=m;P=c[M>>2]|0;T=c[M+4>>2]|0;M=Mh(P,T,r)|0;U=s-M|0;ka=P;la=T;ma=M;na=O;oa=(O&8|0)==0|(ca|0)>(U|0)?ca:U+1|0;pa=0;qa=32264;z=67;break}case 105:case 100:{U=m;M=c[U>>2]|0;T=c[U+4>>2]|0;if((T|0)<0){U=Ij(0,0,M|0,T|0)|0;P=D;ra=m;c[ra>>2]=U;c[ra+4>>2]=P;sa=U;ta=P;ua=1;va=32264;z=66;break e}else{sa=M;ta=T;ua=(O&2049|0)!=0&1;va=(O&2048|0)==0?((O&1|0)==0?32264:32266):32265;z=66;break e}break}case 117:{T=m;sa=c[T>>2]|0;ta=c[T+4>>2]|0;ua=0;va=32264;z=66;break}case 99:{a[t>>0]=c[m>>2];wa=t;xa=N;ya=1;za=0;Aa=32264;Ba=r;break}case 109:{Ca=Oh(c[(yh()|0)>>2]|0)|0;z=71;break}case 115:{T=c[m>>2]|0;Ca=T|0?T:32274;z=71;break}case 67:{c[o>>2]=c[m>>2];c[n>>2]=0;c[m>>2]=o;Da=o;Ea=-1;z=75;break}case 83:{T=c[m>>2]|0;if(!ca){Qh(d,32,aa,0,O);Fa=0;z=84}else{Da=T;Ea=ca;z=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{u=ea;e=x;v=Sh(d,+h[m>>3],aa,ca,O,H)|0;w=$;continue a;break}default:{wa=u;xa=O;ya=ca;za=0;Aa=32264;Ba=r}}while(0);f:do if((z|0)==61){z=0;H=m;I=c[H>>2]|0;y=c[H+4>>2]|0;H=Lh(I,y,r,ja&32)|0;T=(ha&8|0)==0|(I|0)==0&(y|0)==0;ka=I;la=y;ma=H;na=ha;oa=ia;pa=T?0:2;qa=T?32264:32264+(ja>>4)|0;z=67}else if((z|0)==66){z=0;ka=sa;la=ta;ma=Nh(sa,ta,r)|0;na=O;oa=ca;pa=ua;qa=va;z=67}else if((z|0)==71){z=0;T=Ph(Ca,0,ca)|0;H=(T|0)==0;wa=Ca;xa=N;ya=H?ca:T-Ca|0;za=0;Aa=32264;Ba=H?Ca+ca|0:T}else if((z|0)==75){z=0;T=0;H=0;y=Da;while(1){I=c[y>>2]|0;if(!I){Ga=T;Ha=H;break}M=Rh(p,I)|0;if((M|0)<0|M>>>0>(Ea-T|0)>>>0){Ga=T;Ha=M;break}I=M+T|0;if(Ea>>>0>I>>>0){T=I;H=M;y=y+4|0}else{Ga=I;Ha=M;break}}if((Ha|0)<0){Y=-1;break a}Qh(d,32,aa,Ga,O);if(!Ga){Fa=0;z=84}else{y=0;H=Da;while(1){T=c[H>>2]|0;if(!T){Fa=Ga;z=84;break f}M=Rh(p,T)|0;y=M+y|0;if((y|0)>(Ga|0)){Fa=Ga;z=84;break f}Ih(d,p,M);if(y>>>0>=Ga>>>0){Fa=Ga;z=84;break}else H=H+4|0}}}while(0);if((z|0)==67){z=0;N=(ka|0)!=0|(la|0)!=0;H=(oa|0)!=0|N;y=((N^1)&1)+(s-ma)|0;wa=H?ma:r;xa=(oa|0)>-1?na&-65537:na;ya=H?((oa|0)>(y|0)?oa:y):oa;za=pa;Aa=qa;Ba=r}else if((z|0)==84){z=0;Qh(d,32,aa,Fa,O^8192);u=ea;e=x;v=(aa|0)>(Fa|0)?aa:Fa;w=$;continue}y=Ba-wa|0;H=(ya|0)<(y|0)?y:ya;N=H+za|0;M=(aa|0)<(N|0)?N:aa;Qh(d,32,M,N,xa);Ih(d,Aa,za);Qh(d,48,M,N,xa^65536);Qh(d,48,H,y,0);Ih(d,wa,y);Qh(d,32,M,N,xa^8192);u=ea;e=x;v=M;w=$}g:do if((z|0)==87)if(!d)if(!w)Y=0;else{$=1;while(1){v=c[i+($<<2)>>2]|0;if(!v){Ia=$;break}Kh(g+($<<3)|0,v,f);$=$+1|0;if(($|0)>=10){Y=1;break g}}while(1){if(c[i+(Ia<<2)>>2]|0){Y=-1;break g}Ia=Ia+1|0;if((Ia|0)>=10){Y=1;break}}}else Y=x;while(0);l=j;return Y|0}function Gh(a){a=a|0;return 0}function Hh(a){a=a|0;return}function Ih(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))ci(b,d,a)|0;return}function Jh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;e=(a[d>>0]|0)+-48|0;if(e>>>0<10){f=d;d=0;g=e;while(1){e=g+(d*10|0)|0;f=f+1|0;c[b>>2]=f;g=(a[f>>0]|0)+-48|0;if(g>>>0>=10){h=e;break}else d=e}}else h=0;return h|0}function Kh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f;break a;break}case 10:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a;break}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=f;c[e+4>>2]=0;break a;break}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);f=e;g=c[f>>2]|0;i=c[f+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=g;c[e+4>>2]=i;break a;break}case 13:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&65535)<<16>>16;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 14:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&65535;c[i+4>>2]=0;break a;break}case 15:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&255)<<24>>24;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 16:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&255;c[i+4>>2]=0;break a;break}case 17:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}case 18:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}default:break a}while(0);while(0);return}function Lh(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==0&(c|0)==0)g=e;else{h=b;b=c;c=e;while(1){e=c+-1|0;a[e>>0]=d[32316+(h&15)>>0]|0|f;h=Nj(h|0,b|0,4)|0;b=D;if((h|0)==0&(b|0)==0){g=e;break}else c=e}}return g|0}function Mh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((b|0)==0&(c|0)==0)e=d;else{f=b;b=c;c=d;while(1){d=c+-1|0;a[d>>0]=f&7|48;f=Nj(f|0,b|0,3)|0;b=D;if((f|0)==0&(b|0)==0){e=d;break}else c=d}}return e|0}function Nh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){e=b;f=c;c=d;while(1){g=Xj(e|0,f|0,10,0)|0;c=c+-1|0;a[c>>0]=g&255|48;g=e;e=Tj(e|0,f|0,10,0)|0;if(!(f>>>0>9|(f|0)==9&g>>>0>4294967295))break;else f=D}h=c;i=e}else{h=d;i=b}if(!i)j=h;else{b=h;h=i;while(1){i=b+-1|0;a[i>>0]=(h>>>0)%10|0|48;if(h>>>0<10){j=i;break}else{b=i;h=(h>>>0)/10|0}}}return j|0}function Oh(a){a=a|0;return Zh(a,c[(Yh()|0)+188>>2]|0)|0}function Ph(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=d&255;g=(e|0)!=0;a:do if(g&(b&3|0)!=0){h=d&255;i=e;j=b;while(1){if((a[j>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=j+1|0;o=i+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=o;j=n}else{q=o;r=n;s=p;m=5;break}}}else{q=e;r=b;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=0;u=r}b:do if((m|0)==6){r=d&255;if((a[l>>0]|0)==r<<24>>24){t=k;u=l}else{q=S(f,16843009)|0;c:do if(k>>>0>3){s=k;g=l;while(1){b=c[g>>2]^q;if((b&-2139062144^-2139062144)&b+-16843009|0)break;b=g+4|0;e=s+-4|0;if(e>>>0>3){s=e;g=b}else{v=e;w=b;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!v){t=0;u=w;break}else{x=v;y=w}while(1){if((a[y>>0]|0)==r<<24>>24){t=x;u=y;break b}q=y+1|0;x=x+-1|0;if(!x){t=0;u=q;break}else y=q}}}while(0);return (t|0?u:0)|0}function Qh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Jj(g|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{Ih(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;Ih(a,g,h)}l=f;return}function Rh(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Wh(a,b,0)|0;return c|0}function Sh(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;j=l;l=l+560|0;k=j+8|0;m=j;n=j+524|0;o=n;p=j+512|0;c[m>>2]=0;q=p+12|0;Th(e)|0;if((D|0)<0){r=1;s=32281;t=-e}else{r=(h&2049|0)!=0&1;s=(h&2048|0)==0?((h&1|0)==0?32282:32287):32284;t=e}Th(t)|0;u=D&2146435072;do if(u>>>0<2146435072|(u|0)==2146435072&0<0){e=+Uh(t,m)*2.0;v=e!=0.0;if(v)c[m>>2]=(c[m>>2]|0)+-1;w=i|32;if((w|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-g|0;do if(!(g>>>0>11|(A|0)==0)){B=A;C=8.0;do{B=B+-1|0;C=C*16.0}while((B|0)!=0);if((a[y>>0]|0)==45){E=-(C+(-e-C));break}else{E=e+C-C;break}}else E=e;while(0);A=c[m>>2]|0;B=(A|0)<0?0-A|0:A;F=Nh(B,((B|0)<0)<<31>>31,q)|0;if((F|0)==(q|0)){B=p+11|0;a[B>>0]=48;G=B}else G=F;a[G+-1>>0]=(A>>31&2)+43;A=G+-2|0;a[A>>0]=i+15;F=(g|0)<1;B=(h&8|0)==0;H=n;I=E;while(1){J=~~I;K=H+1|0;a[H>>0]=d[32316+J>>0]|x;I=(I-+(J|0))*16.0;if((K-o|0)==1?!(B&(F&I==0.0)):0){a[K>>0]=46;L=H+2|0}else L=K;if(!(I!=0.0))break;else H=L}H=L-o|0;F=q-A|0;B=(g|0)!=0&(H+-2|0)<(g|0)?g+2|0:H;x=F+z+B|0;Qh(b,32,f,x,h);Ih(b,y,z);Qh(b,48,f,x,h^65536);Ih(b,n,H);Qh(b,48,B-H|0,0,0);Ih(b,A,F);Qh(b,32,f,x,h^8192);M=x;break}x=(g|0)<0?6:g;if(v){F=(c[m>>2]|0)+-28|0;c[m>>2]=F;N=F;O=e*268435456.0}else{N=c[m>>2]|0;O=e}F=(N|0)<0?k:k+288|0;I=O;H=F;do{B=~~I>>>0;c[H>>2]=B;H=H+4|0;I=(I-+(B>>>0))*1.0e9}while(I!=0.0);if((N|0)>0){v=N;A=F;z=H;while(1){y=(v|0)<29?v:29;B=z+-4|0;if(B>>>0>=A>>>0){K=0;J=B;do{B=Mj(c[J>>2]|0,0,y|0)|0;P=Kj(B|0,D|0,K|0,0)|0;B=D;Q=Xj(P|0,B|0,1e9,0)|0;c[J>>2]=Q;K=Tj(P|0,B|0,1e9,0)|0;J=J+-4|0}while(J>>>0>=A>>>0);if(K){J=A+-4|0;c[J>>2]=K;R=J}else R=A}else R=A;J=z;while(1){if(J>>>0<=R>>>0)break;B=J+-4|0;if(!(c[B>>2]|0))J=B;else break}K=(c[m>>2]|0)-y|0;c[m>>2]=K;if((K|0)>0){v=K;A=R;z=J}else{T=K;U=R;V=J;break}}}else{T=N;U=F;V=H}if((T|0)<0){z=((x+25|0)/9|0)+1|0;A=(w|0)==102;v=T;K=U;B=V;while(1){P=0-v|0;Q=(P|0)<9?P:9;if(K>>>0<B>>>0){P=(1<<Q)+-1|0;W=1e9>>>Q;X=0;Y=K;do{Z=c[Y>>2]|0;c[Y>>2]=(Z>>>Q)+X;X=S(Z&P,W)|0;Y=Y+4|0}while(Y>>>0<B>>>0);Y=(c[K>>2]|0)==0?K+4|0:K;if(!X){_=Y;$=B}else{c[B>>2]=X;_=Y;$=B+4|0}}else{_=(c[K>>2]|0)==0?K+4|0:K;$=B}Y=A?F:_;W=($-Y>>2|0)>(z|0)?Y+(z<<2)|0:$;v=(c[m>>2]|0)+Q|0;c[m>>2]=v;if((v|0)>=0){aa=_;ba=W;break}else{K=_;B=W}}}else{aa=U;ba=V}B=F;if(aa>>>0<ba>>>0){K=(B-aa>>2)*9|0;v=c[aa>>2]|0;if(v>>>0<10)ca=K;else{z=K;K=10;while(1){K=K*10|0;A=z+1|0;if(v>>>0<K>>>0){ca=A;break}else z=A}}}else ca=0;z=(w|0)==103;K=(x|0)!=0;v=x-((w|0)!=102?ca:0)+((K&z)<<31>>31)|0;if((v|0)<(((ba-B>>2)*9|0)+-9|0)){A=v+9216|0;v=F+4+(((A|0)/9|0)+-1024<<2)|0;H=((A|0)%9|0)+1|0;if((H|0)<9){A=10;W=H;while(1){H=A*10|0;W=W+1|0;if((W|0)==9){da=H;break}else A=H}}else da=10;A=c[v>>2]|0;W=(A>>>0)%(da>>>0)|0;w=(v+4|0)==(ba|0);if(!(w&(W|0)==0)){C=(((A>>>0)/(da>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;H=(da|0)/2|0;I=W>>>0<H>>>0?.5:w&(W|0)==(H|0)?1.0:1.5;if(!r){ea=C;fa=I}else{H=(a[s>>0]|0)==45;ea=H?-C:C;fa=H?-I:I}H=A-W|0;c[v>>2]=H;if(ea+fa!=ea){W=H+da|0;c[v>>2]=W;if(W>>>0>999999999){W=aa;H=v;while(1){A=H+-4|0;c[H>>2]=0;if(A>>>0<W>>>0){w=W+-4|0;c[w>>2]=0;ga=w}else ga=W;w=(c[A>>2]|0)+1|0;c[A>>2]=w;if(w>>>0>999999999){W=ga;H=A}else{ha=ga;ia=A;break}}}else{ha=aa;ia=v}H=(B-ha>>2)*9|0;W=c[ha>>2]|0;if(W>>>0<10){ja=ha;ka=ia;la=H}else{A=H;H=10;while(1){H=H*10|0;w=A+1|0;if(W>>>0<H>>>0){ja=ha;ka=ia;la=w;break}else A=w}}}else{ja=aa;ka=v;la=ca}}else{ja=aa;ka=v;la=ca}A=ka+4|0;ma=ja;na=la;oa=ba>>>0>A>>>0?A:ba}else{ma=aa;na=ca;oa=ba}A=oa;while(1){if(A>>>0<=ma>>>0){pa=0;break}H=A+-4|0;if(!(c[H>>2]|0))A=H;else{pa=1;break}}v=0-na|0;do if(z){H=((K^1)&1)+x|0;if((H|0)>(na|0)&(na|0)>-5){qa=H+-1-na|0;ra=i+-1|0}else{qa=H+-1|0;ra=i+-2|0}H=h&8;if(!H){if(pa?(W=c[A+-4>>2]|0,(W|0)!=0):0)if(!((W>>>0)%10|0)){w=10;Y=0;while(1){w=w*10|0;P=Y+1|0;if((W>>>0)%(w>>>0)|0|0){sa=P;break}else Y=P}}else sa=0;else sa=9;Y=((A-B>>2)*9|0)+-9|0;if((ra|32|0)==102){w=Y-sa|0;W=(w|0)>0?w:0;ta=0;ua=(qa|0)<(W|0)?qa:W;va=ra;break}else{W=Y+na-sa|0;Y=(W|0)>0?W:0;ta=0;ua=(qa|0)<(Y|0)?qa:Y;va=ra;break}}else{ta=H;ua=qa;va=ra}}else{ta=h&8;ua=x;va=i}while(0);x=ua|ta;B=(x|0)!=0&1;K=(va|32|0)==102;if(K){wa=0;xa=(na|0)>0?na:0}else{z=(na|0)<0?v:na;Y=Nh(z,((z|0)<0)<<31>>31,q)|0;z=q;if((z-Y|0)<2){W=Y;while(1){w=W+-1|0;a[w>>0]=48;if((z-w|0)<2)W=w;else{ya=w;break}}}else ya=Y;a[ya+-1>>0]=(na>>31&2)+43;W=ya+-2|0;a[W>>0]=va;wa=W;xa=z-W|0}W=r+1+ua+B+xa|0;Qh(b,32,f,W,h);Ih(b,s,r);Qh(b,48,f,W,h^65536);if(K){v=ma>>>0>F>>>0?F:ma;w=n+9|0;Q=w;X=n+8|0;P=v;do{J=Nh(c[P>>2]|0,0,w)|0;if((P|0)==(v|0))if((J|0)==(w|0)){a[X>>0]=48;za=X}else za=J;else if(J>>>0>n>>>0){Jj(n|0,48,J-o|0)|0;y=J;while(1){Z=y+-1|0;if(Z>>>0>n>>>0)y=Z;else{za=Z;break}}}else za=J;Ih(b,za,Q-za|0);P=P+4|0}while(P>>>0<=F>>>0);if(x|0)Ih(b,32332,1);if(P>>>0<A>>>0&(ua|0)>0){F=P;Q=ua;while(1){X=Nh(c[F>>2]|0,0,w)|0;if(X>>>0>n>>>0){Jj(n|0,48,X-o|0)|0;v=X;while(1){K=v+-1|0;if(K>>>0>n>>>0)v=K;else{Aa=K;break}}}else Aa=X;Ih(b,Aa,(Q|0)<9?Q:9);F=F+4|0;v=Q+-9|0;if(!(F>>>0<A>>>0&(Q|0)>9)){Ba=v;break}else Q=v}}else Ba=ua;Qh(b,48,Ba+9|0,9,0)}else{Q=pa?A:ma+4|0;if((ua|0)>-1){F=n+9|0;w=(ta|0)==0;P=F;x=0-o|0;v=n+8|0;J=ma;K=ua;while(1){B=Nh(c[J>>2]|0,0,F)|0;if((B|0)==(F|0)){a[v>>0]=48;Ca=v}else Ca=B;do if((J|0)==(ma|0)){B=Ca+1|0;Ih(b,Ca,1);if(w&(K|0)<1){Da=B;break}Ih(b,32332,1);Da=B}else{if(Ca>>>0<=n>>>0){Da=Ca;break}Jj(n|0,48,Ca+x|0)|0;B=Ca;while(1){z=B+-1|0;if(z>>>0>n>>>0)B=z;else{Da=z;break}}}while(0);X=P-Da|0;Ih(b,Da,(K|0)>(X|0)?X:K);B=K-X|0;J=J+4|0;if(!(J>>>0<Q>>>0&(B|0)>-1)){Ea=B;break}else K=B}}else Ea=ua;Qh(b,48,Ea+18|0,18,0);Ih(b,wa,q-wa|0)}Qh(b,32,f,W,h^8192);M=W}else{K=(i&32|0)!=0;Q=r+3|0;Qh(b,32,f,Q,h&-65537);Ih(b,s,r);Ih(b,t!=t|0.0!=0.0?(K?32308:32312):K?32300:32304,3);Qh(b,32,f,Q,h^8192);M=Q}while(0);l=j;return ((M|0)<(f|0)?f:M)|0}function Th(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function Uh(a,b){a=+a;b=b|0;return +(+Vh(a,b))}function Vh(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,k=0.0,l=0.0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Nj(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){g=+Vh(a*18446744073709551616.0,b);i=(c[b>>2]|0)+-64|0;k=g}else{i=0;k=a}c[b>>2]=i;l=k;break}case 2047:{l=a;break}default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;l=+h[j>>3]}}return +l}function Wh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;do if(b){if(d>>>0<128){a[b>>0]=d;f=1;break}if(!(mb(c,c[(Xh()|0)+188>>2]>>2)|0))if((d&-128|0)==57216){a[b>>0]=d;f=1;break}else{c[(yh()|0)>>2]=84;f=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;f=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;f=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;f=4;break}else{c[(yh()|0)>>2]=84;f=-1;break}}else f=1;while(0);return f|0}function Xh(){return Ra()|0}function Yh(){return Ra()|0}function Zh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=0;while(1){if((d[32334+f>>0]|0)==(b|0)){g=2;break}h=f+1|0;if((h|0)==87){i=87;j=32422;g=5;break}else f=h}if((g|0)==2)if(!f)k=32422;else{i=f;j=32422;g=5}if((g|0)==5)while(1){g=0;f=j;do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);i=i+-1|0;if(!i){k=f;break}else{j=f;g=5}}return _h(k,mb(c,e+20>>2)|0)|0}function _h(a,b){a=a|0;b=b|0;return $h(a,b)|0}function $h(a,b){a=a|0;b=b|0;var d=0;if(!b)d=0;else d=ai(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (d|0?d:a)|0}function ai(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=(c[b>>2]|0)+1794895138|0;g=bi(c[b+8>>2]|0,f)|0;h=bi(c[b+12>>2]|0,f)|0;i=bi(c[b+16>>2]|0,f)|0;a:do if((g>>>0<d>>>2>>>0?(j=d-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=bi(c[b+(q<<2)>>2]|0,f)|0;s=bi(c[b+(q+1<<2)>>2]|0,f)|0;if(!(s>>>0<d>>>0&r>>>0<(d-s|0)>>>0)){t=0;break a}if(a[b+(s+r)>>0]|0){t=0;break a}r=Ch(e,b+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=bi(c[b+(m<<2)>>2]|0,f)|0;j=bi(c[b+(m+1<<2)>>2]|0,f)|0;if(j>>>0<d>>>0&l>>>0<(d-j|0)>>>0)t=(a[b+(j+l)>>0]|0)==0?b+j|0:0;else t=0}else t=0;while(0);return t|0}function bi(a,b){a=a|0;b=b|0;var c=0;c=Yj(a|0)|0;return ((b|0)==0?a:c)|0}function ci(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(di(e)|0)){h=c[f>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=e+20|0;f=c[g>>2]|0;k=f;if((h-f|0)>>>0<d>>>0){j=wb[c[e+36>>2]&7](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){l=k;m=0;n=d;o=b;break b}p=f+-1|0;if((a[b+p>>0]|0)==10)break;else f=p}p=wb[c[e+36>>2]&7](e,b,f)|0;if(p>>>0<f>>>0){j=p;break a}l=c[g>>2]|0;m=f;n=d-f|0;o=b+f|0}else{l=k;m=0;n=d;o=b}while(0);Qj(l|0,o|0,n|0)|0;c[g>>2]=(c[g>>2]|0)+n;j=m+n|0}while(0);return j|0}function di(b){b=b|0;var d=0,e=0,f=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;e=c[b>>2]|0;if(!(e&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);f=0}else{c[b>>2]=e|32;f=-1}return f|0}function ei(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=a+20|0;f=c[e>>2]|0;g=(c[a+16>>2]|0)-f|0;a=g>>>0>d>>>0?d:g;Qj(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function fi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+208|0;g=f+8|0;h=f;i=S(d,b)|0;b=h;c[b>>2]=1;c[b+4>>2]=0;a:do if(i|0){b=0-d|0;c[g+4>>2]=d;c[g>>2]=d;j=d;k=d;m=2;while(1){n=j+d+k|0;c[g+(m<<2)>>2]=n;if(n>>>0<i>>>0){o=k;k=n;m=m+1|0;j=o}else break}j=a+i+b|0;if(j>>>0>a>>>0){m=j;k=1;o=a;n=1;while(1){do if((k&3|0)!=3){p=n+-1|0;if((c[g+(p<<2)>>2]|0)>>>0<(m-o|0)>>>0)gi(o,d,e,n,g);else ii(o,d,e,h,n,0,g);if((n|0)==1){ji(h,1);q=0;break}else{ji(h,p);q=1;break}}else{gi(o,d,e,n,g);hi(h,2);q=n+2|0}while(0);p=c[h>>2]|1;c[h>>2]=p;r=o+d|0;if(r>>>0<j>>>0){k=p;o=r;n=q}else{s=p;t=r;u=q;break}}}else{s=1;t=a;u=1}ii(t,d,e,h,u,0,g);n=h+4|0;o=s;k=t;j=u;while(1){if((j|0)==1&(o|0)==1){if(!(c[n>>2]|0))break a}else if((j|0)>=2){ji(h,2);m=j+-2|0;c[h>>2]=c[h>>2]^7;hi(h,1);ii(k+(0-(c[g+(m<<2)>>2]|0))+b|0,d,e,h,j+-1|0,1,g);ji(h,1);r=c[h>>2]|1;c[h>>2]=r;p=k+b|0;ii(p,d,e,h,m,1,g);o=r;k=p;j=m;continue}m=ki(h)|0;hi(h,m);o=c[h>>2]|0;k=k+b|0;j=m+j|0}}while(0);l=f;return}function gi(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=l;l=l+240|0;h=g;c[h>>2]=a;a:do if((e|0)>1){i=0-b|0;j=a;k=a;m=1;n=e;while(1){o=k+i|0;p=n+-2|0;q=o+(0-(c[f+(p<<2)>>2]|0))|0;if((Gb[d&31](j,q)|0)>-1?(Gb[d&31](j,o)|0)>-1:0){r=m;break a}s=m+1|0;t=h+(m<<2)|0;if((Gb[d&31](q,o)|0)>-1){c[t>>2]=q;u=q;v=n+-1|0}else{c[t>>2]=o;u=o;v=p}if((v|0)<=1){r=s;break a}j=c[h>>2]|0;k=u;m=s;n=v}}else r=1;while(0);mi(b,h,r);l=g;return}function hi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+4|0;if(b>>>0>31){e=c[d>>2]|0;c[a>>2]=e;c[d>>2]=0;f=e;g=0;h=b+-32|0}else{f=c[a>>2]|0;g=c[d>>2]|0;h=b}c[a>>2]=g<<32-h|f>>>h;c[d>>2]=g>>>h;return}function ii(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;i=l;l=l+240|0;j=i+232|0;k=i;m=c[e>>2]|0;c[j>>2]=m;n=c[e+4>>2]|0;e=j+4|0;c[e>>2]=n;c[k>>2]=a;a:do if((m|0)!=1|(n|0)!=0?(o=0-b|0,p=a+(0-(c[h+(f<<2)>>2]|0))|0,(Gb[d&31](p,a)|0)>=1):0){q=p;p=a;r=1;s=f;t=(g|0)==0;while(1){if(t&(s|0)>1){u=p+o|0;v=c[h+(s+-2<<2)>>2]|0;if((Gb[d&31](u,q)|0)>-1){w=p;x=r;y=s;z=10;break a}if((Gb[d&31](u+(0-v)|0,q)|0)>-1){w=p;x=r;y=s;z=10;break a}}v=r+1|0;c[k+(r<<2)>>2]=q;u=ki(j)|0;hi(j,u);A=u+s|0;if(!((c[j>>2]|0)!=1|(c[e>>2]|0)!=0)){w=q;x=v;y=A;z=10;break a}u=q+(0-(c[h+(A<<2)>>2]|0))|0;if((Gb[d&31](u,c[k>>2]|0)|0)<1){B=q;C=v;D=A;E=0;z=9;break}else{F=q;q=u;r=v;s=A;t=1;p=F}}}else{B=a;C=1;D=f;E=g;z=9}while(0);if((z|0)==9?(E|0)==0:0){w=B;x=C;y=D;z=10}if((z|0)==10){mi(b,k,x);gi(w,b,d,y,h)}l=i;return}function ji(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+4|0;if(b>>>0>31){e=c[a>>2]|0;c[d>>2]=e;c[a>>2]=0;f=e;g=0;h=b+-32|0}else{f=c[d>>2]|0;g=c[a>>2]|0;h=b}c[d>>2]=g>>>(32-h|0)|f<<h;c[a>>2]=g<<h;return}function ki(a){a=a|0;var b=0,d=0;b=li((c[a>>2]|0)+-1|0)|0;if(!b){d=li(c[a+4>>2]|0)|0;return ((d|0)==0?0:d+32|0)|0}else return b|0;return 0}function li(a){a=a|0;var b=0,c=0,d=0;if(a)if(!(a&1)){b=0;c=a;while(1){a=b+1|0;c=c>>>1;if(c&1|0){d=a;break}else b=a}}else d=0;else d=32;return d|0}function mi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+256|0;f=e;a:do if((d|0)>=2?(g=b+(d<<2)|0,c[g>>2]=f,a|0):0){h=f;i=a;while(1){j=i>>>0<256?i:256;Qj(h|0,c[b>>2]|0,j|0)|0;k=0;do{m=b+(k<<2)|0;k=k+1|0;Qj(c[m>>2]|0,c[b+(k<<2)>>2]|0,j|0)|0;c[m>>2]=(c[m>>2]|0)+j}while((k|0)!=(d|0));k=i-j|0;if(!k)break a;h=c[g>>2]|0;i=k}}while(0);l=e;return}function ni(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b;a:do if(!(d&3)){e=b;f=4}else{g=d;h=b;while(1){if(!(a[h>>0]|0)){i=g;break a}j=h+1|0;g=j;if(!(g&3)){e=j;f=4;break}else h=j}}while(0);if((f|0)==4){f=e;while(1){k=c[f>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))f=f+4|0;else break}if(!((k&255)<<24>>24))l=f;else{k=f;while(1){f=k+1|0;if(!(a[f>>0]|0)){l=f;break}else k=f}}i=l}return i-d|0}function oi(a,b){a=a|0;b=b|0;var c=0;c=ni(a)|0;return ((pi(a,1,c,b)|0)!=(c|0))<<31>>31|0}function pi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=S(d,b)|0;g=(b|0)==0?0:d;if((mb(c,e+76>>2)|0)>-1){d=(Gh(e)|0)==0;h=ci(a,f,e)|0;if(d)i=h;else{Hh(e);i=h}}else i=ci(a,f,e)|0;if((i|0)==(f|0))j=g;else j=(i>>>0)/(b>>>0)|0;return j|0}function qi(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+16|0;g=f;h=e&255;a[g>>0]=h;i=b+16|0;j=c[i>>2]|0;if(!j)if(!(di(b)|0)){k=c[i>>2]|0;m=4}else n=-1;else{k=j;m=4}do if((m|0)==4){j=b+20|0;i=c[j>>2]|0;if(i>>>0<k>>>0?(o=e&255,(o|0)!=(a[b+75>>0]|0)):0){c[j>>2]=i+1;a[i>>0]=h;n=o;break}if((wb[c[b+36>>2]&7](b,g,1)|0)==1)n=d[g>>0]|0;else n=-1}while(0);l=f;return n|0}function ri(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=Eh(c[5311]|0,a,e)|0;l=d;return b|0}function si(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[5311]|0;if((mb(c,d+76>>2)|0)>-1)e=Gh(d)|0;else e=0;do if((oi(b,d)|0)<0)f=1;else{if((a[d+75>>0]|0)!=10?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=10;f=0;break}f=(qi(d,10)|0)<0}while(0);if(e|0)Hh(d);return f<<31>>31|0}function ti(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=Kj(g|0,h|0,b|0,d|0)|0;d=a;c[d>>2]=f;c[d+4>>2]=D;nb(c,e>>2,0)|0;D=h;return g|0}function ui(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=g&b;c[f+4>>2]=h&d;nb(c,e>>2,0)|0;D=h;return g|0}function vi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=g|b;c[f+4>>2]=h|d;nb(c,e>>2,0)|0;D=h;return g|0}function wi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=Ij(g|0,h|0,b|0,d|0)|0;d=a;c[d>>2]=f;c[d+4>>2]=D;nb(c,e>>2,0)|0;D=h;return g|0}function xi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=g^b;c[f+4>>2]=h^d;nb(c,e>>2,0)|0;D=h;return g|0}function yi(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(!b)va(34541,34348,260,34546);if(qa()|0){_i(b);return}cj(35904)|0;if(!(a[39068]&1))a[39068]=1;d=mb(c,8983)|0;e=mb(c,8984)|0;f=(e+1|0)%128|0;if((f|0)==(d|0)){g=d;while(1){$i(35904)|0;Ba(35932,g|0,t)|0;cj(35904)|0;h=mb(c,8983)|0;i=mb(c,8984)|0;j=(i+1|0)%128|0;if((j|0)==(h|0))g=h;else{k=h;l=i;m=j;break}}}else{k=d;l=e;m=f}c[35940+(l<<2)>>2]=b;if((k|0)==(l|0))Ha(0);nb(c,8984,m)|0;$i(35904)|0;return}function zi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=Kj(c[f>>2]|0,c[f+4>>2]|0,b|0,d|0)|0;d=D;b=a;c[b>>2]=g;c[b+4>>2]=d;nb(c,e>>2,0)|0;D=d;return g|0}function Ai(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]&b;b=c[f+4>>2]&d;d=a;c[d>>2]=g;c[d+4>>2]=b;nb(c,e>>2,0)|0;D=b;return g|0}function Bi(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=36460+((a>>>3&255)<<2)|0;do do h=mb(c,g>>2)|0;while((h|0)!=(pb(c,g>>2,h,1)|0));while((h|0)!=0);h=a;i=c[h>>2]|0;j=c[h+4>>2]|0;if(!((i|0)==(b|0)&(j|0)==(d|0))){k=nb(c,g>>2,0)|0;D=j;return i|0}d=a;c[d>>2]=e;c[d+4>>2]=f;k=nb(c,g>>2,0)|0;D=j;return i|0}function Ci(a,b){a=a|0;b=b|0;var d=0;do d=mb(c,a>>2)|0;while((d|0)!=(pb(c,a>>2,d,b)|0));return d|0}function Di(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|0;h=c[f+4>>2]|0;f=a;c[f>>2]=b;c[f+4>>2]=d;nb(c,e>>2,0)|0;D=h;return g|0}function Ei(a){a=a|0;var b=0;b=mb(c,a>>2)|0;return +(c[j>>2]=b,+g[j>>2])}function Fi(a){a=a|0;var b=0,d=0,e=0.0;b=36460+((a>>>3&255)<<2)|0;do do d=mb(c,b>>2)|0;while((d|0)!=(pb(c,b>>2,d,1)|0));while((d|0)!=0);e=+h[a>>3];nb(c,b>>2,0)|0;return +e}function Gi(a){a=a|0;var b=0,d=0,e=0;b=36460+((a>>>3&255)<<2)|0;do do d=mb(c,b>>2)|0;while((d|0)!=(pb(c,b>>2,d,1)|0));while((d|0)!=0);d=a;a=c[d>>2]|0;e=c[d+4>>2]|0;nb(c,b>>2,0)|0;D=e;return a|0}function Hi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]|b;b=c[f+4>>2]|d;d=a;c[d>>2]=g;c[d+4>>2]=b;nb(c,e>>2,0)|0;D=b;return g|0}function Ii(a,b){a=a|0;b=+b;return +(+((nb(c,a>>2,(g[j>>2]=b,c[j>>2]|0))|0)>>>0))}function Ji(a,b){a=a|0;b=+b;var d=0,e=0;d=36460+((a>>>3&255)<<2)|0;do do e=mb(c,d>>2)|0;while((e|0)!=(pb(c,d>>2,e,1)|0));while((e|0)!=0);h[a>>3]=b;nb(c,d>>2,0)|0;return +b}function Ki(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;c[f>>2]=b;c[f+4>>2]=d;nb(c,e>>2,0)|0;D=d;return b|0}function Li(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=Ij(c[f>>2]|0,c[f+4>>2]|0,b|0,d|0)|0;d=D;b=a;c[b>>2]=g;c[b+4>>2]=d;nb(c,e>>2,0)|0;D=d;return g|0}function Mi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=36460+((a>>>3&255)<<2)|0;do do f=mb(c,e>>2)|0;while((f|0)!=(pb(c,e>>2,f,1)|0));while((f|0)!=0);f=a;g=c[f>>2]^b;b=c[f+4>>2]^d;d=a;c[d>>2]=g;c[d+4>>2]=b;nb(c,e>>2,0)|0;D=b;return g|0}function Ni(){var a=0,b=0;if(!(qa()|0))va(34226,34348,424,34437);a=(qa()|0)==0;if(a|(c[8975]|0)!=0)return;c[8975]=1;cj(35904)|0;a=mb(c,8983)|0;b=(a|0)==(mb(c,8984)|0);$i(35904)|0;if(!b){b=a;do{_i(c[35940+(b<<2)>>2]|0);cj(35904)|0;b=(b+1|0)%128|0;nb(c,8983,b)|0;a=(b|0)==(mb(c,8984)|0);$i(35904)|0}while(!a)}Ia(35932,2147483647)|0;c[8975]=0;return}function Oi(a){a=a|0;yi(a);Zi(a,t)|0;return}function Pi(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+96|0;d=b;e=d;f=e+96|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[d>>2]=a;a=d+80|0;c[a>>2]=0;yi(d);Zi(d,t)|0;l=b;return c[a>>2]|0}function Qi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+96|0;e=d;f=e;g=f+96|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[e>>2]=a;c[e+16>>2]=b;b=e+80|0;c[b>>2]=0;yi(e);Zi(e,t)|0;l=d;return c[b>>2]|0}function Ri(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+96|0;f=e;g=f;h=g+96|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[f>>2]=a;c[f+16>>2]=b;c[f+24>>2]=d;d=f+80|0;c[d>>2]=0;yi(f);Zi(f,t)|0;l=e;return c[d>>2]|0}function Si(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=l;l=l+96|0;g=f;h=g;i=h+96|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0));c[g>>2]=a;c[g+16>>2]=b;c[g+24>>2]=d;c[g+32>>2]=e;e=g+80|0;c[e>>2]=0;yi(g);Zi(g,t)|0;l=f;return c[e>>2]|0}function Ti(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=l;l=l+96|0;h=g;i=h;j=i+96|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[h>>2]=a;c[h+16>>2]=b;c[h+24>>2]=d;c[h+32>>2]=e;c[h+40>>2]=f;f=h+80|0;c[f>>2]=0;yi(h);Zi(h,t)|0;l=g;return c[f>>2]|0}function Ui(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=l;l=l+96|0;i=h;j=i;k=j+96|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[i>>2]=a;c[i+16>>2]=b;c[i+24>>2]=d;c[i+32>>2]=e;c[i+40>>2]=f;c[i+48>>2]=g;g=i+80|0;c[g>>2]=0;yi(i);Zi(i,t)|0;l=h;return c[g>>2]|0}function Vi(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0;i=l;l=l+96|0;j=i;k=j;m=k+96|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[j>>2]=a;c[j+16>>2]=b;c[j+24>>2]=d;c[j+32>>2]=e;c[j+40>>2]=f;c[j+48>>2]=g;c[j+56>>2]=h;h=j+80|0;c[h>>2]=0;yi(j);Zi(j,t)|0;l=i;return c[h>>2]|0}function Wi(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0;j=l;l=l+96|0;k=j;m=k;n=m+96|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[k>>2]=a;c[k+16>>2]=b;c[k+24>>2]=d;c[k+32>>2]=e;c[k+40>>2]=f;c[k+48>>2]=g;c[k+56>>2]=h;c[k+64>>2]=i;i=k+80|0;c[i>>2]=0;yi(k);Zi(k,t)|0;l=j;return c[i>>2]|0}function Xi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+240|0;g=f+96|0;h=f+112|0;i=f;c[g>>2]=e;j=Dh(h,128,d,g)|0;k=j+1|0;if((j|0)>127){j=Bj(k)|0;c[g>>2]=e;Dh(j,k,d,g)|0;m=j}else m=h;j=i;g=j+96|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(g|0));c[i>>2]=a;c[i+16>>2]=b;c[i+24>>2]=m;b=i+80|0;c[b>>2]=0;yi(i);Zi(i,t)|0;if((m|0)==(h|0)){n=c[b>>2]|0;l=f;return n|0}Cj(m);n=c[b>>2]|0;l=f;return n|0}function Yi(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;a=Ra()|0;if(!(c[a+60>>2]|0))return;b=a+116|0;a=0;do{d=0;e=0;while(1){f=(c[b>>2]|0)+(d<<2)|0;g=c[f>>2]|0;if((g|0)!=0?(h=35388+(d<<2)|0,(mb(c,h>>2)|0)!=0):0){c[f>>2]=0;zb[(mb(c,h>>2)|0)&31](g);i=1}else i=e;d=d+1|0;if((d|0)==128)break;else e=i}a=a+1|0}while((a|0)<4&(i|0)!=0);return}function Zi(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,h=0.0,i=0.0,j=0;d=a+8|0;a=mb(c,d>>2)|0;if(a|0){e=a;f=(e|0)==0;g=f?-8:0;return g|0}h=+Za();i=h+b;Hj(5);if(h<i){b=h;do{Ba(d|0,0,+(i-b))|0;a=mb(c,d>>2)|0;b=+Za()}while((a|0)==0&b<i);j=a}else j=0;Hj(1);e=j;f=(e|0)==0;g=f?-8:0;return g|0}function _i(a){a=a|0;var b=0;do switch(c[a>>2]|0){case 12:{c[a+80>>2]=Ka(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 13:{c[a+80>>2]=wa(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 37:{c[a+80>>2]=_a(c[a+16>>2]|0)|0;break}case 46:{c[a+80>>2]=ib(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 68:{c[a+80>>2]=Qa(c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0)|0;break}case 72:{c[a+80>>2]=za(c[a+16>>2]|0)|0;break}case 110:{c[a+80>>2]=gb(c[a+16>>2]|0)|0;break}case 111:{c[a+80>>2]=Ta(c[a+16>>2]|0)|0;break}case 112:{c[a+80>>2]=Ga()|0;break}case 113:{c[a+80>>2]=jb(c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0)|0;break}case 114:{c[a+80>>2]=sa(c[a+16>>2]|0)|0;break}case 115:{c[a+80>>2]=oa(c[a+16>>2]|0)|0;break}case 119:{Ca();break}case 137:{c[a+80>>2]=Xa(c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0,c[a+40>>2]|0)|0;break}case 138:{c[a+80>>2]=ua(c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 1024:{Db[c[a+4>>2]&7]();break}case 1025:{zb[c[a+4>>2]&31](c[a+16>>2]|0);break}case 1026:{Ab[c[a+4>>2]&7](c[a+16>>2]|0,c[a+24>>2]|0);break}case 1027:{Cb[c[a+4>>2]&0](c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0);break}case 2048:{c[a+80>>2]=yb[c[a+4>>2]&1]()|0;break}case 2049:{c[a+80>>2]=Bb[c[a+4>>2]&7](c[a+16>>2]|0)|0;break}case 2050:{c[a+80>>2]=Gb[c[a+4>>2]&31](c[a+16>>2]|0,c[a+24>>2]|0)|0;break}case 2051:{c[a+80>>2]=wb[c[a+4>>2]&7](c[a+16>>2]|0,c[a+24>>2]|0,c[a+32>>2]|0)|0;break}default:va(34481,34348,211,34532)}while(0);if(!(c[a+88>>2]|0)){b=a+8|0;c[b>>2]=1;Ia(b|0,2147483647)|0;return}else{Cj(a);return}}function $i(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=mb(c,a+8>>2)|0;d=c[a>>2]|0;e=d&128^128;f=(d&15|0)==0;if(!f){g=Ra()|0;h=a+4|0;i=(mb(c,h>>2)|0)&2147483647;if((i|0)!=(c[g+52>>2]|0)){j=1;return j|0}if((d&3|0)==1?(i=a+20|0,k=c[i>>2]|0,k|0):0){c[i>>2]=k+-1;j=0;return j|0}k=a+16|0;if(!e){nb(c,g+176>>2,k)|0;aj()}i=c[a+12>>2]|0;l=c[k>>2]|0;nb(c,i>>2,l)|0;if((l|0)==(g+168|0)){m=h;n=g}else{nb(c,l+-4>>2,i)|0;m=h;n=g}}else{m=a+4|0;n=0}a=d&8|0?2147483647:0;do o=mb(c,m>>2)|0;while((pb(c,m>>2,o,a)|0)!=(o|0));if(!(f|(e|0)!=0)){nb(c,n+176>>2,0)|0;bj()}if(!((b|0)!=0|(o|0)<0)){j=0;return j|0}Ia(m|0,1)|0;j=0;return j|0}function aj(){qb(c,9113,1)|0;return}function bj(){if((qb(c,9113,-1)|0)!=1)return;if(!(mb(c,9114)|0))return;Ia(36452,2147483647)|0;return}function cj(a){a=a|0;var b=0;if((c[a>>2]&15|0)==0?(pb(c,a+4>>2,0,16)|0)==0:0){b=0;return b|0}b=dj(a,0)|0;return b|0}function dj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[a>>2]|0;do if(!(d&15))if(!(pb(c,a+4>>2,0,16)|0)){e=0;return e|0}else{f=c[a>>2]|0;break}else f=d;while(0);d=f&128^128;f=ij(a)|0;if((f|0)!=16){e=f;return e|0}f=a+4|0;g=a+8|0;h=100;while(1){if(!h)break;if(!(mb(c,f>>2)|0))break;if(!(mb(c,g>>2)|0))h=h+-1|0;else break}h=ij(a)|0;if((h|0)!=16){e=h;return e|0}a:while(1){h=mb(c,f>>2)|0;if(h|0?(i=c[a>>2]|0,(h&1073741824|0)==0|(i&4|0)==0):0){if((i&3|0)==2?(h&2147483647|0)==(c[(Ra()|0)+52>>2]|0):0){e=35;j=17;break}qb(c,g>>2,1)|0;i=h|-2147483648;pb(c,f>>2,h,i)|0;h=ej(f,i,0,b,d)|0;rb(c,g>>2,1)|0;switch(h|0){case 0:case 4:break;default:{e=h;j=17;break a}}}h=ij(a)|0;if((h|0)!=16){e=h;j=17;break}}if((j|0)==17)return e|0;return 0}function ej(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+16|0;h=g;La(1,h|0)|0;Pj(1,4);i=fj(a,b,d,e,f)|0;Pj(4,1);La(c[h>>2]|0,0)|0;l=g;return i|0}function fj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0;f=l;l=l+16|0;g=f;h=(e|0)!=0;if(h){i=e+4|0;if((c[i>>2]|0)>>>0>999999999){j=22;l=f;return j|0}if(db(d|0,g|0)|0){j=22;l=f;return j|0}d=(c[e>>2]|0)-(c[g>>2]|0)|0;c[g>>2]=d;k=g+4|0;m=(c[i>>2]|0)-(c[k>>2]|0)|0;c[k>>2]=m;if((m|0)<0){i=d+-1|0;c[g>>2]=i;c[k>>2]=m+1e9;n=i}else n=d;if((n|0)<0){j=110;l=f;return j|0}}n=(qa()|0)!=0;o=n?1.0:100.0;if(n){a:while(1){if(gj(Ra()|0)|0){p=125;break}Ni();if(h){q=+hj(e);r=q>100.0?100.0:q;if(!(q<=0.0))s=r>1.0?1.0:r;else{p=110;break}}else s=o;n=0-(Ba(a|0,b|0,+s)|0)|0;switch(n|0){case 110:break;case 4:case 125:{p=n;break a;break}default:{j=0;t=21;break a}}}if((t|0)==21){l=f;return j|0}j=p;l=f;return j|0}if(!h){b:while(1){if(gj(Ra()|0)|0){u=125;break}h=0-(Ba(a|0,b|0,+o)|0)|0;switch(h|0){case 110:break;case 4:case 125:{u=h;break b;break}default:{j=0;t=21;break b}}}if((t|0)==21){l=f;return j|0}j=u;l=f;return j|0}c:while(1){if(gj(Ra()|0)|0){v=125;break}o=+hj(e);if(o<=0.0){v=110;break}u=0-(Ba(a|0,b|0,+(o>100.0?100.0:o))|0)|0;switch(u|0){case 110:break;case 4:case 125:{v=u;break c;break}default:{j=0;t=21;break c}}}if((t|0)==21){l=f;return j|0}j=v;l=f;return j|0}function gj(a){a=a|0;return (c[a>>2]|0)==2|0}function hj(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;fb(d|0,0)|0;l=b;return +(+(c[a>>2]|0)*1.0e3+ +(c[a+4>>2]|0)*1.0e-06-(+(c[d>>2]|0)*1.0e3+ +(c[d+4>>2]|0)*.001))}function ij(a){a=a|0;var b=0;if(!(c[a>>2]&15)){b=(pb(c,a+4>>2,0,16)|0)&16;return b|0}else{b=jj(a)|0;return b|0}return 0}function jj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=c[a>>2]|0;d=Ra()|0;e=c[d+52>>2]|0;f=a+4|0;g=mb(c,f>>2)|0;h=g&2147483647;if((b&3|0)==1&(h|0)==(e|0)){i=a+20|0;j=c[i>>2]|0;if(j>>>0>2147483646){k=11;return k|0}c[i>>2]=j+1;k=0;return k|0}if((h|0)==2147483647){k=131;return k|0}if(!(c[a>>2]&128))l=e;else{j=d+172|0;if(!(c[j>>2]|0))c[j>>2]=-12;j=(mb(c,a+8>>2)|0)==0;nb(c,d+176>>2,a+16|0)|0;l=j?e:e|-2147483648}e=(h|0)!=0;if(!(e?(b&4|0)==0|(g&1073741824|0)==0:0))m=11;if((m|0)==11?(pb(c,f>>2,g,l)|0)==(g|0):0){g=d+168|0;l=mb(c,g>>2)|0;f=a+16|0;c[f>>2]=l;c[a+12>>2]=g;if((l|0)!=(g|0))nb(c,l+-4>>2,f)|0;nb(c,g>>2,f)|0;nb(c,d+176>>2,0)|0;if(!e){k=0;return k|0}c[a+20>>2]=0;c[a>>2]=c[a>>2]|8;k=130;return k|0}nb(c,d+176>>2,0)|0;k=16;return k|0}function kj(){var a=0;a=Ra()|0;if(mb(c,a+72>>2)|0)return;if((c[a>>2]|0)!=2)return;Ha(1);return}function lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=a&1023;g=Bj(96)|0;c[g+8>>2]=0;c[g>>2]=a;c[g+4>>2]=b;if(!d){h=g+88|0;c[h>>2]=1;yi(g);l=e;return}else i=0;do{b=(c[f>>2]|0)+(4-1)&~(4-1);a=c[b>>2]|0;c[f>>2]=b+4;c[g+16+(i<<3)>>2]=a;i=i+1|0}while((i|0)!=(d|0));h=g+88|0;c[h>>2]=1;yi(g);l=e;return}function mj(a){a=a|0;var b=0,d=0;if(!(c[a>>2]|0)){b=nj(a,-1)|0;return b|0}if(!(mb(c,a+12>>2)|0)){b=0;return b|0}d=a+8|0;qb(c,d>>2,1)|0;Ia(d|0,2147483647)|0;b=0;return b|0}function nj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=l;l=l+16|0;e=d;nb(c,e>>2,0)|0;f=a+32|0;if(pb(c,f>>2,0,1)|0){pb(c,f>>2,1,2)|0;do oj(f,0,2,1);while((pb(c,f>>2,0,2)|0)!=0)}g=a+20|0;h=c[g>>2]|0;i=(h|0)!=0;if((b|0)!=0&i){j=0;k=b;b=h;while(1){if(!(pb(c,b+8>>2,0,1)|0)){m=(j|0)==0?b:j;n=k+-1|0}else{nb(c,e>>2,(mb(c,e>>2)|0)+1|0)|0;c[b+16>>2]=e;m=j;n=k}o=c[b>>2]|0;p=(o|0)!=0;if((n|0)!=0&p){j=m;k=n;b=o}else{q=m;r=o;s=p;break}}}else{q=0;r=h;s=i}if(s){s=r+4|0;i=c[s>>2]|0;if(i|0)c[i>>2]=0;c[s>>2]=0}else c[a+4>>2]=0;c[g>>2]=r;do t=mb(c,f>>2)|0;while((pb(c,f>>2,t,0)|0)!=(t|0));if((t|0)==2)Ia(f|0,1)|0;f=mb(c,e>>2)|0;if(f|0){t=f;do{oj(e,0,t,1);t=mb(c,e>>2)|0}while((t|0)!=0)}if(!q){l=d;return 0}t=q+12|0;do u=mb(c,t>>2)|0;while((pb(c,t>>2,u,0)|0)!=(u|0));if((u|0)!=2){l=d;return 0}Ia(t|0,1)|0;l=d;return 0}function oj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0;e=(b|0)!=0;a:do if(e){f=100;while(1){if(!f){g=7;break a}if(mb(c,b>>2)|0){g=8;break a}if((mb(c,a>>2)|0)==(d|0))f=f+-1|0;else break}return}else{f=100;while(1){if(!f){g=7;break a}if((mb(c,a>>2)|0)==(d|0))f=f+-1|0;else break}return}while(0);if((g|0)==7?e:0)g=8;if((g|0)==8)qb(c,b>>2,1)|0;g=qa()|0;b:do if((mb(c,a>>2)|0)==(d|0)){f=(g|0)!=0;h=f?1.0:100.0;c:do if(f)while(1){if((mb(c,(Ra()|0)+76>>2)|0)==1)do{if(gj(Ra()|0)|0)break c;Ni()}while((Ba(a|0,d|0,+h)|0)==-110);else Ba(a|0,d|0,t)|0;if((mb(c,a>>2)|0)!=(d|0))break b}else while(1){if((mb(c,(Ra()|0)+76>>2)|0)==1)do if(gj(Ra()|0)|0)break c;while((Ba(a|0,d|0,+h)|0)==-110);else Ba(a|0,d|0,t)|0;if((mb(c,a>>2)|0)!=(d|0))break b}while(0);if(!e)return;rb(c,b>>2,1)|0;return}while(0);if(!e)return;rb(c,b>>2,1)|0;return}function pj(a){a=a|0;var b=0,d=0,e=0;if(!(c[a>>2]|0))return 0;b=a+12|0;if(!(mb(c,b>>2)|0))return 0;tb(c,b>>2,-2147483648)|0;d=a+8|0;qb(c,d>>2,1)|0;Ia(d|0,2147483647)|0;d=mb(c,b>>2)|0;if(!(d&2147483647))return 0;else e=d;do{oj(b,0,e,0);e=mb(c,b>>2)|0}while((e&2147483647|0)!=0);return 0}function qj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+48|0;e=d;f=e;g=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));f=a;h=e;g=f+48|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(g|0));if(!b){l=d;return 0}h=c[b>>2]|0;c[a+16>>2]=h&2147483647;if((h|0)>=0){l=d;return 0}c[a>>2]=-1;l=d;return 0}function rj(a){a=a|0;var b=0,d=0;if(!(c[a>>2]|0)){b=nj(a,1)|0;return b|0}if(!(mb(c,a+12>>2)|0)){b=0;return b|0}d=a+8|0;qb(c,d>>2,1)|0;Ia(d|0,1)|0;b=0;return b|0}function sj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=l;l=l+32|0;f=e+4|0;g=e;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;h=c[a+16>>2]|0;if(c[b>>2]&15|0?(i=(mb(c,b+4>>2)|0)&2147483647,(i|0)!=(c[(Ra()|0)+52>>2]|0)):0){j=1;l=e;return j|0}if(d|0?(c[d+4>>2]|0)>>>0>999999999:0){j=22;l=e;return j|0}kj();if(!(c[a>>2]|0)){i=a+32|0;if(pb(c,i>>2,0,1)|0){pb(c,i>>2,1,2)|0;do oj(i,0,2,1);while((pb(c,i>>2,0,2)|0)!=0)}k=f+12|0;nb(c,k>>2,2)|0;nb(c,f+8>>2,0)|0;m=a+4|0;n=c[m>>2]|0;c[f+4>>2]=n;c[m>>2]=f;m=a+20|0;c[((c[m>>2]|0)==0?m:n)>>2]=f;do o=mb(c,i>>2)|0;while((pb(c,i>>2,o,0)|0)!=(o|0));if((o|0)==2){Ia(i|0,1)|0;p=k;q=2;r=0}else{p=k;q=2;r=0}}else{k=a+8|0;i=mb(c,k>>2)|0;qb(c,a+12>>2,1)|0;p=k;q=i;r=1}$i(b)|0;La(2,g|0)|0;if((c[g>>2]|0)==1)La(1,0)|0;i=(r|0)!=0;r=(i^1)&1;do s=fj(p,q,h,d,r)|0;while((mb(c,p>>2)|0)==(q|0)&(s|4|0)==4);p=(s|0)==4?0:s;a:do if(i){if((p|0)==125){s=(mb(c,a+8>>2)|0)==(q|0);t=s?125:0}else t=p;s=a+12|0;if((qb(c,s>>2,-1)|0)==-2147483647){Ia(s|0,1)|0;u=t;v=0}else{u=t;v=0}}else{s=pb(c,f+8>>2,0,2)|0;if(s|0){r=f+12|0;if(!(pb(c,r>>2,0,1)|0)){u=p;v=s;break}pb(c,r>>2,1,2)|0;while(1){oj(r,0,2,1);if(!(pb(c,r>>2,0,2)|0)){u=p;v=s;break a}}}s=a+32|0;if(pb(c,s>>2,0,1)|0){pb(c,s>>2,1,2)|0;do oj(s,0,2,1);while((pb(c,s>>2,0,2)|0)!=0)}r=a+4|0;if((c[r>>2]|0)!=(f|0)){d=c[f>>2]|0;if(d|0)c[d+4>>2]=c[f+4>>2]}else c[r>>2]=c[f+4>>2];r=a+20|0;if((c[r>>2]|0)!=(f|0)){d=c[f+4>>2]|0;if(d|0)c[d>>2]=c[f>>2]}else c[r>>2]=c[f>>2];do w=mb(c,s>>2)|0;while((pb(c,s>>2,w,0)|0)!=(w|0));if((w|0)==2)Ia(s|0,1)|0;r=f+16|0;d=c[r>>2]|0;if((d|0)!=0?(qb(c,d>>2,-1)|0)==1:0){Ia(c[r>>2]|0,1)|0;u=p;v=0}else{u=p;v=0}}while(0);p=cj(b)|0;w=(p|0)==0?u:p;if(!v){La(c[g>>2]|0,0)|0;if((w|0)==125){kj();La(1,0)|0;x=125}else x=w}else{if(!(c[f+4>>2]|0))qb(c,b+8>>2,1)|0;v=c[f>>2]|0;if(!v)rb(c,b+8>>2,1)|0;else{f=v+12|0;v=b+4|0;nb(c,f>>2,0)|0;do{}while((ta(f|0,0,v|0,mb(c,f>>2)|0)|0)==-11)}La(c[g>>2]|0,0)|0;x=(w|0)==125?0:w}kj();j=x;l=e;return j|0}function tj(a,b){a=a|0;b=b|0;var d=0,e=0;a:while(1){switch(pb(c,a>>2,0,1)|0){case 0:{break a;break}case 2:{d=9;break a;break}case 1:{pb(c,a>>2,1,3)|0;break}case 3:break;default:continue a}oj(a,0,3,1)}if((d|0)==9)return 0;cb(16,a|0);Db[b&7]();na(0);do e=mb(c,a>>2)|0;while((pb(c,a>>2,e,2)|0)!=(e|0));if((e|0)!=3)return 0;Ia(a|0,2147483647)|0;return 0}function uj(a){a=a|0;var b=0;do b=mb(c,a>>2)|0;while((pb(c,a>>2,b,0)|0)!=(b|0));if((b|0)!=3)return;Ia(a|0,2147483647)|0;return}function vj(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;if((mb(c,a>>2)|0)==2){nb(c,e>>2,0)|0;pb(c,e>>2,0,0)|0;l=d;return 0}else{tj(a,b)|0;l=d;return 0}return 0}function wj(a,b){a=a|0;b=b|0;return sj(a,b,0)|0}function xj(a){a=a|0;return 0}function yj(a){a=a|0;c[a>>2]=0;return 0}function zj(a){a=a|0;return 0}function Aj(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];c[a+24>>2]=c[e+24>>2];if(!b){l=d;return 0}c[a>>2]=c[b>>2];l=d;return 0}function Bj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;b=l;l=l+16|0;d=b+4|0;e=b;if(!(c[9371]|0)){cj(37508)|0;if(!(c[9371]|0)){c[9373]=4096;c[9372]=4096;c[9374]=-1;c[9375]=-1;c[9376]=2;c[9495]=2;(yj(d)|0)==0?(Aj(37984,d)|0)==0:0;f=e&-16^1431655768;c[e>>2]=f;nb(c,9371,f)|0}$i(37508)|0}if(c[9495]&2|0?cj(37984)|0:0){g=0;l=b;return g|0}do if(a>>>0<245){f=a>>>0<11?16:a+11&-8;h=f>>>3;i=c[9384]|0;j=i>>>h;if(j&3|0){k=(j&1^1)+h|0;m=37576+(k<<1<<2)|0;n=m+8|0;o=c[n>>2]|0;p=o+8|0;q=c[p>>2]|0;do if((m|0)!=(q|0)){if(q>>>0<(c[9388]|0)>>>0)bb();r=q+12|0;if((c[r>>2]|0)==(o|0)){c[r>>2]=m;c[n>>2]=q;break}else bb()}else c[9384]=i&~(1<<k);while(0);q=k<<3;c[o+4>>2]=q|3;n=o+q+4|0;c[n>>2]=c[n>>2]|1;s=p;break}n=c[9386]|0;if(f>>>0>n>>>0){if(j|0){q=2<<h;m=j<<h&(q|0-q);q=(m&0-m)+-1|0;m=q>>>12&16;r=q>>>m;q=r>>>5&8;t=r>>>q;r=t>>>2&4;u=t>>>r;t=u>>>1&2;v=u>>>t;u=v>>>1&1;w=(q|m|r|t|u)+(v>>>u)|0;u=37576+(w<<1<<2)|0;v=u+8|0;t=c[v>>2]|0;r=t+8|0;m=c[r>>2]|0;do if((u|0)!=(m|0)){if(m>>>0<(c[9388]|0)>>>0)bb();q=m+12|0;if((c[q>>2]|0)==(t|0)){c[q>>2]=u;c[v>>2]=m;x=i;break}else bb()}else{q=i&~(1<<w);c[9384]=q;x=q}while(0);m=(w<<3)-f|0;c[t+4>>2]=f|3;v=t+f|0;c[v+4>>2]=m|1;c[v+m>>2]=m;if(n|0){u=c[9389]|0;h=n>>>3;j=37576+(h<<1<<2)|0;p=1<<h;if(x&p){h=j+8|0;o=c[h>>2]|0;if(o>>>0<(c[9388]|0)>>>0)bb();else{y=h;z=o}}else{c[9384]=x|p;y=j+8|0;z=j}c[y>>2]=u;c[z+12>>2]=u;c[u+8>>2]=z;c[u+12>>2]=j}c[9386]=m;c[9389]=v;s=r;break}v=c[9385]|0;if(v){m=(v&0-v)+-1|0;j=m>>>12&16;u=m>>>j;m=u>>>5&8;p=u>>>m;u=p>>>2&4;o=p>>>u;p=o>>>1&2;h=o>>>p;o=h>>>1&1;k=c[37840+((m|j|u|p|o)+(h>>>o)<<2)>>2]|0;o=(c[k+4>>2]&-8)-f|0;h=c[k+16+(((c[k+16>>2]|0)==0&1)<<2)>>2]|0;if(!h){A=o;B=k}else{p=h;h=o;o=k;while(1){k=(c[p+4>>2]&-8)-f|0;u=k>>>0<h>>>0;j=u?k:h;k=u?p:o;p=c[p+16+(((c[p+16>>2]|0)==0&1)<<2)>>2]|0;if(!p){A=j;B=k;break}else{h=j;o=k}}}o=c[9388]|0;if(B>>>0<o>>>0)bb();h=B+f|0;if(B>>>0>=h>>>0)bb();p=c[B+24>>2]|0;r=c[B+12>>2]|0;do if((r|0)==(B|0)){t=B+20|0;w=c[t>>2]|0;if(!w){k=B+16|0;j=c[k>>2]|0;if(!j){C=0;break}else{D=j;E=k}}else{D=w;E=t}while(1){t=D+20|0;w=c[t>>2]|0;if(w|0){D=w;E=t;continue}t=D+16|0;w=c[t>>2]|0;if(!w)break;else{D=w;E=t}}if(E>>>0<o>>>0)bb();else{c[E>>2]=0;C=D;break}}else{t=c[B+8>>2]|0;if(t>>>0<o>>>0)bb();w=t+12|0;if((c[w>>2]|0)!=(B|0))bb();k=r+8|0;if((c[k>>2]|0)==(B|0)){c[w>>2]=r;c[k>>2]=t;C=r;break}else bb()}while(0);a:do if(p|0){r=c[B+28>>2]|0;o=37840+(r<<2)|0;do if((B|0)==(c[o>>2]|0)){c[o>>2]=C;if(!C){c[9385]=v&~(1<<r);break a}}else if(p>>>0>=(c[9388]|0)>>>0){c[p+16+(((c[p+16>>2]|0)!=(B|0)&1)<<2)>>2]=C;if(!C)break a;else break}else bb();while(0);r=c[9388]|0;if(C>>>0<r>>>0)bb();c[C+24>>2]=p;o=c[B+16>>2]|0;do if(o|0)if(o>>>0<r>>>0)bb();else{c[C+16>>2]=o;c[o+24>>2]=C;break}while(0);o=c[B+20>>2]|0;if(o|0)if(o>>>0<(c[9388]|0)>>>0)bb();else{c[C+20>>2]=o;c[o+24>>2]=C;break}}while(0);if(A>>>0<16){p=A+f|0;c[B+4>>2]=p|3;v=B+p+4|0;c[v>>2]=c[v>>2]|1}else{c[B+4>>2]=f|3;c[h+4>>2]=A|1;c[h+A>>2]=A;if(n|0){v=c[9389]|0;p=n>>>3;o=37576+(p<<1<<2)|0;r=1<<p;if(i&r){p=o+8|0;t=c[p>>2]|0;if(t>>>0<(c[9388]|0)>>>0)bb();else{F=p;G=t}}else{c[9384]=i|r;F=o+8|0;G=o}c[F>>2]=v;c[G+12>>2]=v;c[v+8>>2]=G;c[v+12>>2]=o}c[9386]=A;c[9389]=h}s=B+8|0}else{H=f;I=153}}else{H=f;I=153}}else if(a>>>0<=4294967231){o=a+11|0;v=o&-8;r=c[9385]|0;if(r){t=0-v|0;p=o>>>8;if(p)if(v>>>0>16777215)J=31;else{o=(p+1048320|0)>>>16&8;k=p<<o;p=(k+520192|0)>>>16&4;w=k<<p;k=(w+245760|0)>>>16&2;j=14-(p|o|k)+(w<<k>>>15)|0;J=v>>>(j+7|0)&1|j<<1}else J=0;j=c[37840+(J<<2)>>2]|0;b:do if(!j){K=t;L=0;M=0;I=90}else{k=t;w=0;o=v<<((J|0)==31?0:25-(J>>>1)|0);p=j;u=0;while(1){m=(c[p+4>>2]&-8)-v|0;if(m>>>0<k>>>0)if(!m){N=0;O=p;P=p;I=94;break b}else{Q=m;R=p}else{Q=k;R=u}m=c[p+20>>2]|0;p=c[p+16+(o>>>31<<2)>>2]|0;q=(m|0)==0|(m|0)==(p|0)?w:m;m=(p|0)==0;if(m){K=Q;L=q;M=R;I=90;break}else{k=Q;w=q;o=o<<((m^1)&1);u=R}}}while(0);if((I|0)==90){if((L|0)==0&(M|0)==0){j=2<<J;t=r&(j|0-j);if(!t){H=v;I=153;break}j=(t&0-t)+-1|0;t=j>>>12&16;f=j>>>t;j=f>>>5&8;h=f>>>j;f=h>>>2&4;i=h>>>f;h=i>>>1&2;n=i>>>h;i=n>>>1&1;S=c[37840+((j|t|f|h|i)+(n>>>i)<<2)>>2]|0;T=0}else{S=L;T=M}if(!S){U=K;V=T}else{N=K;O=S;P=T;I=94}}if((I|0)==94)while(1){I=0;i=(c[O+4>>2]&-8)-v|0;n=i>>>0<N>>>0;h=n?i:N;i=n?O:P;O=c[O+16+(((c[O+16>>2]|0)==0&1)<<2)>>2]|0;if(!O){U=h;V=i;break}else{N=h;P=i;I=94}}if((V|0)!=0?U>>>0<((c[9386]|0)-v|0)>>>0:0){i=c[9388]|0;if(V>>>0<i>>>0)bb();h=V+v|0;if(V>>>0>=h>>>0)bb();n=c[V+24>>2]|0;f=c[V+12>>2]|0;do if((f|0)==(V|0)){t=V+20|0;j=c[t>>2]|0;if(!j){u=V+16|0;o=c[u>>2]|0;if(!o){W=0;break}else{X=o;Y=u}}else{X=j;Y=t}while(1){t=X+20|0;j=c[t>>2]|0;if(j|0){X=j;Y=t;continue}t=X+16|0;j=c[t>>2]|0;if(!j)break;else{X=j;Y=t}}if(Y>>>0<i>>>0)bb();else{c[Y>>2]=0;W=X;break}}else{t=c[V+8>>2]|0;if(t>>>0<i>>>0)bb();j=t+12|0;if((c[j>>2]|0)!=(V|0))bb();u=f+8|0;if((c[u>>2]|0)==(V|0)){c[j>>2]=f;c[u>>2]=t;W=f;break}else bb()}while(0);c:do if(n){f=c[V+28>>2]|0;i=37840+(f<<2)|0;do if((V|0)==(c[i>>2]|0)){c[i>>2]=W;if(!W){t=r&~(1<<f);c[9385]=t;Z=t;break c}}else if(n>>>0>=(c[9388]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(V|0)&1)<<2)>>2]=W;if(!W){Z=r;break c}else break}else bb();while(0);f=c[9388]|0;if(W>>>0<f>>>0)bb();c[W+24>>2]=n;i=c[V+16>>2]|0;do if(i|0)if(i>>>0<f>>>0)bb();else{c[W+16>>2]=i;c[i+24>>2]=W;break}while(0);i=c[V+20>>2]|0;if(i)if(i>>>0<(c[9388]|0)>>>0)bb();else{c[W+20>>2]=i;c[i+24>>2]=W;Z=r;break}else Z=r}else Z=r;while(0);do if(U>>>0>=16){c[V+4>>2]=v|3;c[h+4>>2]=U|1;c[h+U>>2]=U;r=U>>>3;if(U>>>0<256){n=37576+(r<<1<<2)|0;i=c[9384]|0;f=1<<r;do if(!(i&f)){c[9384]=i|f;_=n+8|0;$=n}else{r=n+8|0;t=c[r>>2]|0;if(t>>>0>=(c[9388]|0)>>>0){_=r;$=t;break}bb()}while(0);c[_>>2]=h;c[$+12>>2]=h;c[h+8>>2]=$;c[h+12>>2]=n;break}f=U>>>8;if(f)if(U>>>0>16777215)aa=31;else{i=(f+1048320|0)>>>16&8;t=f<<i;f=(t+520192|0)>>>16&4;r=t<<f;t=(r+245760|0)>>>16&2;u=14-(f|i|t)+(r<<t>>>15)|0;aa=U>>>(u+7|0)&1|u<<1}else aa=0;u=37840+(aa<<2)|0;c[h+28>>2]=aa;t=h+16|0;c[t+4>>2]=0;c[t>>2]=0;t=1<<aa;if(!(Z&t)){c[9385]=Z|t;c[u>>2]=h;c[h+24>>2]=u;c[h+12>>2]=h;c[h+8>>2]=h;break}t=U<<((aa|0)==31?0:25-(aa>>>1)|0);r=c[u>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(U|0)){I=148;break}ba=r+16+(t>>>31<<2)|0;u=c[ba>>2]|0;if(!u){I=145;break}else{t=t<<1;r=u}}if((I|0)==145)if(ba>>>0<(c[9388]|0)>>>0)bb();else{c[ba>>2]=h;c[h+24>>2]=r;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((I|0)==148){t=r+8|0;n=c[t>>2]|0;u=c[9388]|0;if(n>>>0>=u>>>0&r>>>0>=u>>>0){c[n+12>>2]=h;c[t>>2]=h;c[h+8>>2]=n;c[h+12>>2]=r;c[h+24>>2]=0;break}else bb()}}else{n=U+v|0;c[V+4>>2]=n|3;t=V+n+4|0;c[t>>2]=c[t>>2]|1}while(0);s=V+8|0}else{H=v;I=153}}else{H=v;I=153}}else{H=-1;I=153}while(0);d:do if((I|0)==153){V=c[9386]|0;if(V>>>0>=H>>>0){U=V-H|0;ba=c[9389]|0;if(U>>>0>15){aa=ba+H|0;c[9389]=aa;c[9386]=U;c[aa+4>>2]=U|1;c[aa+U>>2]=U;c[ba+4>>2]=H|3}else{c[9386]=0;c[9389]=0;c[ba+4>>2]=V|3;U=ba+V+4|0;c[U>>2]=c[U>>2]|1}s=ba+8|0;break}ba=c[9387]|0;if(ba>>>0>H>>>0){U=ba-H|0;c[9387]=U;ba=c[9390]|0;V=ba+H|0;c[9390]=V;c[V+4>>2]=U|1;c[ba+4>>2]=H|3;s=ba+8|0;break}if(!(c[9371]|0)){cj(37508)|0;if(!(c[9371]|0)){c[9373]=4096;c[9372]=4096;c[9374]=-1;c[9375]=-1;c[9376]=2;c[9495]=2;(yj(d)|0)==0?(Aj(37984,d)|0)==0:0;ba=e&-16^1431655768;c[e>>2]=ba;nb(c,9371,ba)|0}$i(37508)|0}ba=H+48|0;U=c[9373]|0;V=H+47|0;aa=U+V&0-U;if(aa>>>0>H>>>0){U=c[9494]|0;if(U|0?(Z=c[9492]|0,$=Z+aa|0,$>>>0<=Z>>>0|$>>>0>U>>>0):0){s=0;break}if(!(c[9495]&4)){U=c[9390]|0;e:do if(U){$=38012;while(1){Z=c[$>>2]|0;if(Z>>>0<=U>>>0?(ca=$+4|0,(Z+(c[ca>>2]|0)|0)>>>0>U>>>0):0)break;Z=c[$+8>>2]|0;if(!Z){I=176;break e}else $=Z}cj(37508)|0;r=c[9373]|0;Z=V-(c[9387]|0)+r&0-r;if(Z>>>0<2147483647){r=Zj(Z|0)|0;if((r|0)==((c[$>>2]|0)+(c[ca>>2]|0)|0))if((r|0)==(-1|0)){da=Z;I=190}else{ea=r;fa=Z}else{ga=r;ha=Z;I=184}}else{da=0;I=190}}else I=176;while(0);do if((I|0)==176){cj(37508)|0;U=Zj(0)|0;if((U|0)!=(-1|0)?(v=U,Z=c[9372]|0,r=Z+-1|0,_=((r&v|0)==0?0:(r+v&0-Z)-v|0)+aa|0,v=c[9492]|0,Z=_+v|0,_>>>0>H>>>0&_>>>0<2147483647):0){r=c[9494]|0;if(r|0?Z>>>0<=v>>>0|Z>>>0>r>>>0:0){da=0;I=190;break}r=Zj(_|0)|0;if((r|0)==(U|0)){ea=U;fa=_}else{ga=r;ha=_;I=184}}else{da=0;I=190}}while(0);do if((I|0)==184){_=0-ha|0;if(!(ba>>>0>ha>>>0&(ha>>>0<2147483647&(ga|0)!=(-1|0))))if((ga|0)==(-1|0)){da=0;I=190;break}else{ea=ga;fa=ha;break}r=c[9373]|0;U=V-ha+r&0-r;if(U>>>0<2147483647)if((Zj(U|0)|0)==(-1|0)){Zj(_|0)|0;da=0;I=190;break}else{ea=ga;fa=U+ha|0;break}else{ea=ga;fa=ha}}while(0);if((I|0)==190){c[9495]=c[9495]|4;ea=-1;fa=da}$i(37508)|0;ia=ea;ja=fa}else{ia=-1;ja=0}if(aa>>>0<2147483647&(ia|0)==(-1|0)){cj(37508)|0;V=Zj(aa|0)|0;ba=Zj(0)|0;$i(37508)|0;U=ba-V|0;_=U>>>0>(H+40|0)>>>0;if(V>>>0<ba>>>0&((V|0)!=(-1|0)&(ba|0)!=(-1|0))){ka=_?V:-1;la=_?U:ja;I=194}}else{ka=ia;la=ja;I=194}if((I|0)==194?(ka|0)!=(-1|0):0){U=(c[9492]|0)+la|0;c[9492]=U;if(U>>>0>(c[9493]|0)>>>0)c[9493]=U;U=c[9390]|0;do if(U){_=38012;while(1){ma=c[_>>2]|0;na=_+4|0;oa=c[na>>2]|0;if((ka|0)==(ma+oa|0)){I=205;break}V=c[_+8>>2]|0;if(!V)break;else _=V}if(((I|0)==205?(c[_+12>>2]&8|0)==0:0)?U>>>0<ka>>>0&U>>>0>=ma>>>0:0){c[na>>2]=oa+la;$=U+8|0;V=($&7|0)==0?0:0-$&7;$=U+V|0;ba=(c[9387]|0)+(la-V)|0;c[9390]=$;c[9387]=ba;c[$+4>>2]=ba|1;c[$+ba+4>>2]=40;c[9391]=c[9375];break}ba=c[9388]|0;if(ka>>>0<ba>>>0){c[9388]=ka;pa=ka}else pa=ba;ba=ka+la|0;$=38012;while(1){if((c[$>>2]|0)==(ba|0)){I=213;break}V=c[$+8>>2]|0;if(!V)break;else $=V}if((I|0)==213?(c[$+12>>2]&8|0)==0:0){c[$>>2]=ka;_=$+4|0;c[_>>2]=(c[_>>2]|0)+la;_=ka+8|0;V=ka+((_&7|0)==0?0:0-_&7)|0;_=ba+8|0;r=ba+((_&7|0)==0?0:0-_&7)|0;_=V+H|0;Z=r-V-H|0;c[V+4>>2]=H|3;do if((r|0)!=(U|0)){if((r|0)==(c[9389]|0)){v=(c[9386]|0)+Z|0;c[9386]=v;c[9389]=_;c[_+4>>2]=v|1;c[_+v>>2]=v;break}v=c[r+4>>2]|0;if((v&3|0)==1){W=v&-8;X=v>>>3;f:do if(v>>>0>=256){Y=c[r+24>>2]|0;P=c[r+12>>2]|0;do if((P|0)==(r|0)){N=r+16|0;O=N+4|0;T=c[O>>2]|0;if(!T){S=c[N>>2]|0;if(!S){qa=0;break}else{ra=S;sa=N}}else{ra=T;sa=O}while(1){O=ra+20|0;T=c[O>>2]|0;if(T|0){ra=T;sa=O;continue}O=ra+16|0;T=c[O>>2]|0;if(!T)break;else{ra=T;sa=O}}if(sa>>>0<pa>>>0)bb();else{c[sa>>2]=0;qa=ra;break}}else{O=c[r+8>>2]|0;if(O>>>0<pa>>>0)bb();T=O+12|0;if((c[T>>2]|0)!=(r|0))bb();N=P+8|0;if((c[N>>2]|0)==(r|0)){c[T>>2]=P;c[N>>2]=O;qa=P;break}else bb()}while(0);if(!Y)break;P=c[r+28>>2]|0;O=37840+(P<<2)|0;do if((r|0)!=(c[O>>2]|0))if(Y>>>0>=(c[9388]|0)>>>0){c[Y+16+(((c[Y+16>>2]|0)!=(r|0)&1)<<2)>>2]=qa;if(!qa)break f;else break}else bb();else{c[O>>2]=qa;if(qa|0)break;c[9385]=c[9385]&~(1<<P);break f}while(0);P=c[9388]|0;if(qa>>>0<P>>>0)bb();c[qa+24>>2]=Y;O=r+16|0;N=c[O>>2]|0;do if(N|0)if(N>>>0<P>>>0)bb();else{c[qa+16>>2]=N;c[N+24>>2]=qa;break}while(0);N=c[O+4>>2]|0;if(!N)break;if(N>>>0<(c[9388]|0)>>>0)bb();else{c[qa+20>>2]=N;c[N+24>>2]=qa;break}}else{N=c[r+8>>2]|0;P=c[r+12>>2]|0;Y=37576+(X<<1<<2)|0;do if((N|0)!=(Y|0)){if(N>>>0<pa>>>0)bb();if((c[N+12>>2]|0)==(r|0))break;bb()}while(0);if((P|0)==(N|0)){c[9384]=c[9384]&~(1<<X);break}do if((P|0)==(Y|0))ta=P+8|0;else{if(P>>>0<pa>>>0)bb();O=P+8|0;if((c[O>>2]|0)==(r|0)){ta=O;break}bb()}while(0);c[N+12>>2]=P;c[ta>>2]=N}while(0);ua=r+W|0;va=W+Z|0}else{ua=r;va=Z}X=ua+4|0;c[X>>2]=c[X>>2]&-2;c[_+4>>2]=va|1;c[_+va>>2]=va;X=va>>>3;if(va>>>0<256){v=37576+(X<<1<<2)|0;Y=c[9384]|0;O=1<<X;do if(!(Y&O)){c[9384]=Y|O;wa=v+8|0;xa=v}else{X=v+8|0;T=c[X>>2]|0;if(T>>>0>=(c[9388]|0)>>>0){wa=X;xa=T;break}bb()}while(0);c[wa>>2]=_;c[xa+12>>2]=_;c[_+8>>2]=xa;c[_+12>>2]=v;break}O=va>>>8;do if(!O)ya=0;else{if(va>>>0>16777215){ya=31;break}Y=(O+1048320|0)>>>16&8;W=O<<Y;T=(W+520192|0)>>>16&4;X=W<<T;W=(X+245760|0)>>>16&2;S=14-(T|Y|W)+(X<<W>>>15)|0;ya=va>>>(S+7|0)&1|S<<1}while(0);O=37840+(ya<<2)|0;c[_+28>>2]=ya;v=_+16|0;c[v+4>>2]=0;c[v>>2]=0;v=c[9385]|0;S=1<<ya;if(!(v&S)){c[9385]=v|S;c[O>>2]=_;c[_+24>>2]=O;c[_+12>>2]=_;c[_+8>>2]=_;break}S=va<<((ya|0)==31?0:25-(ya>>>1)|0);v=c[O>>2]|0;while(1){if((c[v+4>>2]&-8|0)==(va|0)){I=280;break}za=v+16+(S>>>31<<2)|0;O=c[za>>2]|0;if(!O){I=277;break}else{S=S<<1;v=O}}if((I|0)==277)if(za>>>0<(c[9388]|0)>>>0)bb();else{c[za>>2]=_;c[_+24>>2]=v;c[_+12>>2]=_;c[_+8>>2]=_;break}else if((I|0)==280){S=v+8|0;O=c[S>>2]|0;W=c[9388]|0;if(O>>>0>=W>>>0&v>>>0>=W>>>0){c[O+12>>2]=_;c[S>>2]=_;c[_+8>>2]=O;c[_+12>>2]=v;c[_+24>>2]=0;break}else bb()}}else{O=(c[9387]|0)+Z|0;c[9387]=O;c[9390]=_;c[_+4>>2]=O|1}while(0);s=V+8|0;break d}_=38012;while(1){Z=c[_>>2]|0;if(Z>>>0<=U>>>0?(Aa=Z+(c[_+4>>2]|0)|0,Aa>>>0>U>>>0):0)break;_=c[_+8>>2]|0}_=Aa+-47|0;V=_+8|0;Z=_+((V&7|0)==0?0:0-V&7)|0;V=U+16|0;_=Z>>>0<V>>>0?U:Z;Z=_+8|0;r=ka+8|0;ba=(r&7|0)==0?0:0-r&7;r=ka+ba|0;$=la+-40-ba|0;c[9390]=r;c[9387]=$;c[r+4>>2]=$|1;c[r+$+4>>2]=40;c[9391]=c[9375];$=_+4|0;c[$>>2]=27;c[Z>>2]=c[9503];c[Z+4>>2]=c[9504];c[Z+8>>2]=c[9505];c[Z+12>>2]=c[9506];c[9503]=ka;c[9504]=la;c[9506]=0;c[9505]=Z;Z=_+24|0;do{r=Z;Z=Z+4|0;c[Z>>2]=7}while((r+8|0)>>>0<Aa>>>0);if((_|0)!=(U|0)){Z=_-U|0;c[$>>2]=c[$>>2]&-2;c[U+4>>2]=Z|1;c[_>>2]=Z;r=Z>>>3;if(Z>>>0<256){ba=37576+(r<<1<<2)|0;O=c[9384]|0;S=1<<r;do if(!(O&S)){c[9384]=O|S;Ba=ba+8|0;Ca=ba}else{r=ba+8|0;W=c[r>>2]|0;if(W>>>0>=(c[9388]|0)>>>0){Ba=r;Ca=W;break}bb()}while(0);c[Ba>>2]=U;c[Ca+12>>2]=U;c[U+8>>2]=Ca;c[U+12>>2]=ba;break}S=Z>>>8;do if(!S)Da=0;else{if(Z>>>0>16777215){Da=31;break}O=(S+1048320|0)>>>16&8;_=S<<O;$=(_+520192|0)>>>16&4;W=_<<$;_=(W+245760|0)>>>16&2;r=14-($|O|_)+(W<<_>>>15)|0;Da=Z>>>(r+7|0)&1|r<<1}while(0);S=37840+(Da<<2)|0;c[U+28>>2]=Da;c[U+20>>2]=0;c[V>>2]=0;ba=c[9385]|0;r=1<<Da;if(!(ba&r)){c[9385]=ba|r;c[S>>2]=U;c[U+24>>2]=S;c[U+12>>2]=U;c[U+8>>2]=U;break}r=Z<<((Da|0)==31?0:25-(Da>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(Z|0)){I=307;break}Ea=ba+16+(r>>>31<<2)|0;S=c[Ea>>2]|0;if(!S){I=304;break}else{r=r<<1;ba=S}}if((I|0)==304)if(Ea>>>0<(c[9388]|0)>>>0)bb();else{c[Ea>>2]=U;c[U+24>>2]=ba;c[U+12>>2]=U;c[U+8>>2]=U;break}else if((I|0)==307){r=ba+8|0;Z=c[r>>2]|0;V=c[9388]|0;if(Z>>>0>=V>>>0&ba>>>0>=V>>>0){c[Z+12>>2]=U;c[r>>2]=U;c[U+8>>2]=Z;c[U+12>>2]=ba;c[U+24>>2]=0;break}else bb()}}}else{Z=c[9388]|0;if((Z|0)==0|ka>>>0<Z>>>0)c[9388]=ka;c[9503]=ka;c[9504]=la;c[9506]=0;c[9393]=c[9371];c[9392]=-1;Z=0;do{r=37576+(Z<<1<<2)|0;c[r+12>>2]=r;c[r+8>>2]=r;Z=Z+1|0}while((Z|0)!=32);Z=ka+8|0;ba=(Z&7|0)==0?0:0-Z&7;Z=ka+ba|0;r=la+-40-ba|0;c[9390]=Z;c[9387]=r;c[Z+4>>2]=r|1;c[Z+r+4>>2]=40;c[9391]=c[9375]}while(0);U=c[9387]|0;if(U>>>0>H>>>0){aa=U-H|0;c[9387]=aa;U=c[9390]|0;r=U+H|0;c[9390]=r;c[r+4>>2]=aa|1;c[U+4>>2]=H|3;s=U+8|0;break}}c[(yh()|0)>>2]=12;s=0}else s=0}while(0);if(!(c[9495]&2)){g=s;l=b;return g|0}$i(37984)|0;g=s;l=b;return g|0}function Cj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;if(!a)return;b=a+-8|0;if(c[9495]&2|0?cj(37984)|0:0)return;d=c[9388]|0;if(b>>>0<d>>>0)bb();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)bb();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(a|0){i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)bb();if((i|0)==(c[9389]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;p=55;break}c[9386]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;break}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;q=37576+(l<<1<<2)|0;if((h|0)!=(q|0)){if(h>>>0<d>>>0)bb();if((c[h+12>>2]|0)!=(i|0))bb()}if((k|0)==(h|0)){c[9384]=c[9384]&~(1<<l);m=i;n=i;o=j;p=55;break}if((k|0)!=(q|0)){if(k>>>0<d>>>0)bb();q=k+8|0;if((c[q>>2]|0)==(i|0))r=q;else bb()}else r=k+8|0;c[h+12>>2]=k;c[r>>2]=h;m=i;n=i;o=j;p=55;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){q=i+16|0;l=q+4|0;s=c[l>>2]|0;if(!s){t=c[q>>2]|0;if(!t){u=0;break}else{v=t;w=q}}else{v=s;w=l}while(1){l=v+20|0;s=c[l>>2]|0;if(s|0){v=s;w=l;continue}l=v+16|0;s=c[l>>2]|0;if(!s)break;else{v=s;w=l}}if(w>>>0<d>>>0)bb();else{c[w>>2]=0;u=v;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)bb();s=l+12|0;if((c[s>>2]|0)!=(i|0))bb();q=k+8|0;if((c[q>>2]|0)==(i|0)){c[s>>2]=k;c[q>>2]=l;u=k;break}else bb()}while(0);if(h){k=c[i+28>>2]|0;l=37840+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=u;if(!u){c[9385]=c[9385]&~(1<<k);m=i;n=i;o=j;p=55;break a}}else if(h>>>0>=(c[9388]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=u;if(!u){m=i;n=i;o=j;p=55;break a}else break}else bb();while(0);k=c[9388]|0;if(u>>>0<k>>>0)bb();c[u+24>>2]=h;l=i+16|0;q=c[l>>2]|0;do if(q|0)if(q>>>0<k>>>0)bb();else{c[u+16>>2]=q;c[q+24>>2]=u;break}while(0);q=c[l+4>>2]|0;if(q)if(q>>>0<(c[9388]|0)>>>0)bb();else{c[u+20>>2]=q;c[q+24>>2]=u;m=i;n=i;o=j;p=55;break}else{m=i;n=i;o=j;p=55}}else{m=i;n=i;o=j;p=55}}}else{m=b;n=b;o=f;p=55}while(0);do if((p|0)==55){if(m>>>0>=g>>>0)bb();f=g+4|0;b=c[f>>2]|0;if(!(b&1))bb();if(!(b&2)){u=c[9389]|0;if((g|0)==(c[9390]|0)){d=(c[9387]|0)+o|0;c[9387]=d;c[9390]=n;c[n+4>>2]=d|1;if((n|0)!=(u|0))break;c[9389]=0;c[9386]=0;break}if((g|0)==(u|0)){u=(c[9386]|0)+o|0;c[9386]=u;c[9389]=m;c[n+4>>2]=u|1;c[m+u>>2]=u;break}u=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){v=c[g+24>>2]|0;w=c[g+12>>2]|0;do if((w|0)==(g|0)){r=g+16|0;a=r+4|0;e=c[a>>2]|0;if(!e){q=c[r>>2]|0;if(!q){x=0;break}else{y=q;z=r}}else{y=e;z=a}while(1){a=y+20|0;e=c[a>>2]|0;if(e|0){y=e;z=a;continue}a=y+16|0;e=c[a>>2]|0;if(!e)break;else{y=e;z=a}}if(z>>>0<(c[9388]|0)>>>0)bb();else{c[z>>2]=0;x=y;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[9388]|0)>>>0)bb();e=a+12|0;if((c[e>>2]|0)!=(g|0))bb();r=w+8|0;if((c[r>>2]|0)==(g|0)){c[e>>2]=w;c[r>>2]=a;x=w;break}else bb()}while(0);if(v|0){w=c[g+28>>2]|0;a=37840+(w<<2)|0;do if((g|0)==(c[a>>2]|0)){c[a>>2]=x;if(!x){c[9385]=c[9385]&~(1<<w);break b}}else if(v>>>0>=(c[9388]|0)>>>0){c[v+16+(((c[v+16>>2]|0)!=(g|0)&1)<<2)>>2]=x;if(!x)break b;else break}else bb();while(0);w=c[9388]|0;if(x>>>0<w>>>0)bb();c[x+24>>2]=v;a=g+16|0;r=c[a>>2]|0;do if(r|0)if(r>>>0<w>>>0)bb();else{c[x+16>>2]=r;c[r+24>>2]=x;break}while(0);r=c[a+4>>2]|0;if(r|0)if(r>>>0<(c[9388]|0)>>>0)bb();else{c[x+20>>2]=r;c[r+24>>2]=x;break}}}else{r=c[g+8>>2]|0;w=c[g+12>>2]|0;v=37576+(d<<1<<2)|0;if((r|0)!=(v|0)){if(r>>>0<(c[9388]|0)>>>0)bb();if((c[r+12>>2]|0)!=(g|0))bb()}if((w|0)==(r|0)){c[9384]=c[9384]&~(1<<d);break}if((w|0)!=(v|0)){if(w>>>0<(c[9388]|0)>>>0)bb();v=w+8|0;if((c[v>>2]|0)==(g|0))A=v;else bb()}else A=w+8|0;c[r+12>>2]=w;c[A>>2]=r}while(0);c[n+4>>2]=u|1;c[m+u>>2]=u;if((n|0)==(c[9389]|0)){c[9386]=u;break}else B=u}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;B=o}d=B>>>3;if(B>>>0<256){j=37576+(d<<1<<2)|0;i=c[9384]|0;l=1<<d;if(i&l){d=j+8|0;r=c[d>>2]|0;if(r>>>0<(c[9388]|0)>>>0)bb();else{C=d;D=r}}else{c[9384]=i|l;C=j+8|0;D=j}c[C>>2]=n;c[D+12>>2]=n;c[n+8>>2]=D;c[n+12>>2]=j;break}j=B>>>8;if(j)if(B>>>0>16777215)E=31;else{l=(j+1048320|0)>>>16&8;i=j<<l;j=(i+520192|0)>>>16&4;r=i<<j;i=(r+245760|0)>>>16&2;d=14-(j|l|i)+(r<<i>>>15)|0;E=B>>>(d+7|0)&1|d<<1}else E=0;d=37840+(E<<2)|0;c[n+28>>2]=E;c[n+20>>2]=0;c[n+16>>2]=0;i=c[9385]|0;r=1<<E;do if(i&r){l=B<<((E|0)==31?0:25-(E>>>1)|0);j=c[d>>2]|0;while(1){if((c[j+4>>2]&-8|0)==(B|0)){p=126;break}F=j+16+(l>>>31<<2)|0;w=c[F>>2]|0;if(!w){p=123;break}else{l=l<<1;j=w}}if((p|0)==123)if(F>>>0<(c[9388]|0)>>>0)bb();else{c[F>>2]=n;c[n+24>>2]=j;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((p|0)==126){l=j+8|0;a=c[l>>2]|0;w=c[9388]|0;if(a>>>0>=w>>>0&j>>>0>=w>>>0){c[a+12>>2]=n;c[l>>2]=n;c[n+8>>2]=a;c[n+12>>2]=j;c[n+24>>2]=0;break}else bb()}}else{c[9385]=i|r;c[d>>2]=n;c[n+24>>2]=d;c[n+12>>2]=n;c[n+8>>2]=n}while(0);d=(c[9392]|0)+-1|0;c[9392]=d;if(!d){d=38020;while(1){r=c[d>>2]|0;if(!r)break;else d=r+8|0}c[9392]=-1}}while(0);if(!(c[9495]&2))return;$i(37984)|0;return}function Dj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a){d=Bj(b)|0;return d|0}if(b>>>0>4294967231){c[(yh()|0)>>2]=12;d=0;return d|0}e=b>>>0<11?16:b+11&-8;f=a+-8|0;if(c[9495]&2|0?cj(37984)|0:0){d=0;return d|0}g=Ej(f,e)|0;if(c[9495]&2|0)$i(37984)|0;if(g|0){d=g+8|0;return d|0}g=Bj(b)|0;if(!g){d=0;return d|0}e=c[a+-4>>2]|0;f=(e&-8)-((e&3|0)==0?8:4)|0;Qj(g|0,a|0,(f>>>0<b>>>0?f:b)|0)|0;Cj(a);d=g;return d|0}function Ej(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a+f|0;h=c[9388]|0;i=e&3;if(!((i|0)!=1&a>>>0>=h>>>0&a>>>0<g>>>0))bb();j=c[g+4>>2]|0;if(!(j&1))bb();if(!i){if(b>>>0<256){k=0;return k|0}if(f>>>0>=(b+4|0)>>>0?(f-b|0)>>>0<=c[9373]<<1>>>0:0){k=a;return k|0}k=0;return k|0}if(f>>>0>=b>>>0){i=f-b|0;if(i>>>0<=15){k=a;return k|0}l=a+b|0;c[d>>2]=e&1|b|2;c[l+4>>2]=i|3;m=l+i+4|0;c[m>>2]=c[m>>2]|1;Fj(l,i);k=a;return k|0}if((g|0)==(c[9390]|0)){i=(c[9387]|0)+f|0;l=i-b|0;m=a+b|0;if(i>>>0<=b>>>0){k=0;return k|0}c[d>>2]=e&1|b|2;c[m+4>>2]=l|1;c[9390]=m;c[9387]=l;k=a;return k|0}if((g|0)==(c[9389]|0)){l=(c[9386]|0)+f|0;if(l>>>0<b>>>0){k=0;return k|0}m=l-b|0;i=e&1;if(m>>>0>15){n=a+b|0;o=n+m|0;c[d>>2]=i|b|2;c[n+4>>2]=m|1;c[o>>2]=m;p=o+4|0;c[p>>2]=c[p>>2]&-2;q=n;r=m}else{c[d>>2]=i|l|2;i=a+l+4|0;c[i>>2]=c[i>>2]|1;q=0;r=0}c[9386]=r;c[9389]=q;k=a;return k|0}if(j&2|0){k=0;return k|0}q=(j&-8)+f|0;if(q>>>0<b>>>0){k=0;return k|0}f=q-b|0;r=j>>>3;a:do if(j>>>0>=256){i=c[g+24>>2]|0;l=c[g+12>>2]|0;do if((l|0)==(g|0)){m=g+16|0;n=m+4|0;p=c[n>>2]|0;if(!p){o=c[m>>2]|0;if(!o){s=0;break}else{t=o;u=m}}else{t=p;u=n}while(1){n=t+20|0;p=c[n>>2]|0;if(p|0){t=p;u=n;continue}n=t+16|0;p=c[n>>2]|0;if(!p)break;else{t=p;u=n}}if(u>>>0<h>>>0)bb();else{c[u>>2]=0;s=t;break}}else{n=c[g+8>>2]|0;if(n>>>0<h>>>0)bb();p=n+12|0;if((c[p>>2]|0)!=(g|0))bb();m=l+8|0;if((c[m>>2]|0)==(g|0)){c[p>>2]=l;c[m>>2]=n;s=l;break}else bb()}while(0);if(i|0){l=c[g+28>>2]|0;n=37840+(l<<2)|0;do if((g|0)==(c[n>>2]|0)){c[n>>2]=s;if(!s){c[9385]=c[9385]&~(1<<l);break a}}else if(i>>>0>=(c[9388]|0)>>>0){c[i+16+(((c[i+16>>2]|0)!=(g|0)&1)<<2)>>2]=s;if(!s)break a;else break}else bb();while(0);l=c[9388]|0;if(s>>>0<l>>>0)bb();c[s+24>>2]=i;n=g+16|0;m=c[n>>2]|0;do if(m|0)if(m>>>0<l>>>0)bb();else{c[s+16>>2]=m;c[m+24>>2]=s;break}while(0);m=c[n+4>>2]|0;if(m|0)if(m>>>0<(c[9388]|0)>>>0)bb();else{c[s+20>>2]=m;c[m+24>>2]=s;break}}}else{m=c[g+8>>2]|0;l=c[g+12>>2]|0;i=37576+(r<<1<<2)|0;if((m|0)!=(i|0)){if(m>>>0<h>>>0)bb();if((c[m+12>>2]|0)!=(g|0))bb()}if((l|0)==(m|0)){c[9384]=c[9384]&~(1<<r);break}if((l|0)!=(i|0)){if(l>>>0<h>>>0)bb();i=l+8|0;if((c[i>>2]|0)==(g|0))v=i;else bb()}else v=l+8|0;c[m+12>>2]=l;c[v>>2]=m}while(0);v=e&1;if(f>>>0<16){c[d>>2]=q|v|2;e=a+q+4|0;c[e>>2]=c[e>>2]|1;k=a;return k|0}else{e=a+b|0;c[d>>2]=v|b|2;c[e+4>>2]=f|3;b=e+f+4|0;c[b>>2]=c[b>>2]|1;Fj(e,f);k=a;return k|0}return 0}function Fj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=a+b|0;e=c[a+4>>2]|0;a:do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;i=c[9388]|0;if(g>>>0<i>>>0)bb();if((g|0)==(c[9389]|0)){j=d+4|0;k=c[j>>2]|0;if((k&3|0)!=3){l=g;m=h;break}c[9386]=h;c[j>>2]=k&-2;c[g+4>>2]=h|1;c[g+h>>2]=h;return}k=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;j=c[g+12>>2]|0;n=37576+(k<<1<<2)|0;if((f|0)!=(n|0)){if(f>>>0<i>>>0)bb();if((c[f+12>>2]|0)!=(g|0))bb()}if((j|0)==(f|0)){c[9384]=c[9384]&~(1<<k);l=g;m=h;break}if((j|0)!=(n|0)){if(j>>>0<i>>>0)bb();n=j+8|0;if((c[n>>2]|0)==(g|0))o=n;else bb()}else o=j+8|0;c[f+12>>2]=j;c[o>>2]=f;l=g;m=h;break}f=c[g+24>>2]|0;j=c[g+12>>2]|0;do if((j|0)==(g|0)){n=g+16|0;k=n+4|0;p=c[k>>2]|0;if(!p){q=c[n>>2]|0;if(!q){r=0;break}else{s=q;t=n}}else{s=p;t=k}while(1){k=s+20|0;p=c[k>>2]|0;if(p|0){s=p;t=k;continue}k=s+16|0;p=c[k>>2]|0;if(!p)break;else{s=p;t=k}}if(t>>>0<i>>>0)bb();else{c[t>>2]=0;r=s;break}}else{k=c[g+8>>2]|0;if(k>>>0<i>>>0)bb();p=k+12|0;if((c[p>>2]|0)!=(g|0))bb();n=j+8|0;if((c[n>>2]|0)==(g|0)){c[p>>2]=j;c[n>>2]=k;r=j;break}else bb()}while(0);if(f){j=c[g+28>>2]|0;i=37840+(j<<2)|0;do if((g|0)==(c[i>>2]|0)){c[i>>2]=r;if(!r){c[9385]=c[9385]&~(1<<j);l=g;m=h;break a}}else if(f>>>0>=(c[9388]|0)>>>0){c[f+16+(((c[f+16>>2]|0)!=(g|0)&1)<<2)>>2]=r;if(!r){l=g;m=h;break a}else break}else bb();while(0);j=c[9388]|0;if(r>>>0<j>>>0)bb();c[r+24>>2]=f;i=g+16|0;k=c[i>>2]|0;do if(k|0)if(k>>>0<j>>>0)bb();else{c[r+16>>2]=k;c[k+24>>2]=r;break}while(0);k=c[i+4>>2]|0;if(k)if(k>>>0<(c[9388]|0)>>>0)bb();else{c[r+20>>2]=k;c[k+24>>2]=r;l=g;m=h;break}else{l=g;m=h}}else{l=g;m=h}}else{l=a;m=b}while(0);b=c[9388]|0;if(d>>>0<b>>>0)bb();a=d+4|0;r=c[a>>2]|0;if(!(r&2)){s=c[9389]|0;if((d|0)==(c[9390]|0)){t=(c[9387]|0)+m|0;c[9387]=t;c[9390]=l;c[l+4>>2]=t|1;if((l|0)!=(s|0))return;c[9389]=0;c[9386]=0;return}if((d|0)==(s|0)){s=(c[9386]|0)+m|0;c[9386]=s;c[9389]=l;c[l+4>>2]=s|1;c[l+s>>2]=s;return}s=(r&-8)+m|0;t=r>>>3;b:do if(r>>>0>=256){o=c[d+24>>2]|0;e=c[d+12>>2]|0;do if((e|0)==(d|0)){k=d+16|0;j=k+4|0;f=c[j>>2]|0;if(!f){n=c[k>>2]|0;if(!n){u=0;break}else{v=n;w=k}}else{v=f;w=j}while(1){j=v+20|0;f=c[j>>2]|0;if(f|0){v=f;w=j;continue}j=v+16|0;f=c[j>>2]|0;if(!f)break;else{v=f;w=j}}if(w>>>0<b>>>0)bb();else{c[w>>2]=0;u=v;break}}else{j=c[d+8>>2]|0;if(j>>>0<b>>>0)bb();f=j+12|0;if((c[f>>2]|0)!=(d|0))bb();k=e+8|0;if((c[k>>2]|0)==(d|0)){c[f>>2]=e;c[k>>2]=j;u=e;break}else bb()}while(0);if(o|0){e=c[d+28>>2]|0;h=37840+(e<<2)|0;do if((d|0)==(c[h>>2]|0)){c[h>>2]=u;if(!u){c[9385]=c[9385]&~(1<<e);break b}}else if(o>>>0>=(c[9388]|0)>>>0){c[o+16+(((c[o+16>>2]|0)!=(d|0)&1)<<2)>>2]=u;if(!u)break b;else break}else bb();while(0);e=c[9388]|0;if(u>>>0<e>>>0)bb();c[u+24>>2]=o;h=d+16|0;g=c[h>>2]|0;do if(g|0)if(g>>>0<e>>>0)bb();else{c[u+16>>2]=g;c[g+24>>2]=u;break}while(0);g=c[h+4>>2]|0;if(g|0)if(g>>>0<(c[9388]|0)>>>0)bb();else{c[u+20>>2]=g;c[g+24>>2]=u;break}}}else{g=c[d+8>>2]|0;e=c[d+12>>2]|0;o=37576+(t<<1<<2)|0;if((g|0)!=(o|0)){if(g>>>0<b>>>0)bb();if((c[g+12>>2]|0)!=(d|0))bb()}if((e|0)==(g|0)){c[9384]=c[9384]&~(1<<t);break}if((e|0)!=(o|0)){if(e>>>0<b>>>0)bb();o=e+8|0;if((c[o>>2]|0)==(d|0))x=o;else bb()}else x=e+8|0;c[g+12>>2]=e;c[x>>2]=g}while(0);c[l+4>>2]=s|1;c[l+s>>2]=s;if((l|0)==(c[9389]|0)){c[9386]=s;return}else y=s}else{c[a>>2]=r&-2;c[l+4>>2]=m|1;c[l+m>>2]=m;y=m}m=y>>>3;if(y>>>0<256){r=37576+(m<<1<<2)|0;a=c[9384]|0;s=1<<m;if(a&s){m=r+8|0;x=c[m>>2]|0;if(x>>>0<(c[9388]|0)>>>0)bb();else{z=m;A=x}}else{c[9384]=a|s;z=r+8|0;A=r}c[z>>2]=l;c[A+12>>2]=l;c[l+8>>2]=A;c[l+12>>2]=r;return}r=y>>>8;if(r)if(y>>>0>16777215)B=31;else{A=(r+1048320|0)>>>16&8;z=r<<A;r=(z+520192|0)>>>16&4;s=z<<r;z=(s+245760|0)>>>16&2;a=14-(r|A|z)+(s<<z>>>15)|0;B=y>>>(a+7|0)&1|a<<1}else B=0;a=37840+(B<<2)|0;c[l+28>>2]=B;c[l+20>>2]=0;c[l+16>>2]=0;z=c[9385]|0;s=1<<B;if(!(z&s)){c[9385]=z|s;c[a>>2]=l;c[l+24>>2]=a;c[l+12>>2]=l;c[l+8>>2]=l;return}s=y<<((B|0)==31?0:25-(B>>>1)|0);B=c[a>>2]|0;while(1){if((c[B+4>>2]&-8|0)==(y|0)){C=121;break}D=B+16+(s>>>31<<2)|0;a=c[D>>2]|0;if(!a){C=118;break}else{s=s<<1;B=a}}if((C|0)==118){if(D>>>0<(c[9388]|0)>>>0)bb();c[D>>2]=l;c[l+24>>2]=B;c[l+12>>2]=l;c[l+8>>2]=l;return}else if((C|0)==121){C=B+8|0;D=c[C>>2]|0;s=c[9388]|0;if(!(D>>>0>=s>>>0&B>>>0>=s>>>0))bb();c[D+12>>2]=l;c[C>>2]=l;c[l+8>>2]=D;c[l+12>>2]=B;c[l+24>>2]=0;return}}function Gj(){}function Hj(a){a=a|0}function Ij(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (D=e,a-c>>>0|0)|0}function Jj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Kj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (D=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function Lj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;q=q+1|0;c[a>>2]=q;while((f|0)<(e|0)){if(!(c[d+(f<<3)>>2]|0)){c[d+(f<<3)>>2]=q;c[d+((f<<3)+4)>>2]=b;c[d+((f<<3)+8)>>2]=0;D=e;return d|0}f=f+1|0}e=e*2|0;d=Dj(d|0,8*(e+1|0)|0)|0;d=Lj(a|0,b|0,d|0,e|0)|0;D=e;return d|0}function Mj(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function Nj(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function Oj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){f=c[b+(e<<3)>>2]|0;if(!f)break;if((f|0)==(a|0))return c[b+((e<<3)+4)>>2]|0;e=e+1|0}return 0}function Pj(a,b){a=a|0;b=b|0}function Qj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return Na(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function Rj(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function Sj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;g=a;h=b;i=h;j=d;k=e;l=k;if(!i){m=(f|0)!=0;if(!l){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (D=n,o)|0}else{if(!m){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return (D=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(V(l|0)|0)-(V(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}r=j-1|0;if(r&j|0){s=(V(j|0)|0)+33-(V(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(f|0){c[f>>2]=r&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (D=n,o)|0}else{r=Rj(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (D=n,o)|0}}else{if(m){if(f|0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (D=n,o)|0}if(!g){if(f|0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (D=n,o)|0}r=l-1|0;if(!(r&l)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=r&i|b&0}n=0;o=i>>>((Rj(l|0)|0)>>>0);return (D=n,o)|0}r=(V(l|0)|0)-(V(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}while(0);if(!t){B=x;C=w;E=v;F=u;G=0;H=0}else{b=d|0|0;d=k|e&0;e=Kj(b|0,d|0,-1,-1)|0;k=D;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Ij(e|0,k|0,g|0,a|0)|0;i=D;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Ij(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&d|0)|0;w=D;u=u-1|0}while((u|0)!=0);B=h;C=x;E=w;F=v;G=0;H=t}t=C;C=0;if(f|0){c[f>>2]=F;c[f+4>>2]=E}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|G;o=(t<<1|0>>>31)&-2|H;return (D=n,o)|0}function Tj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Sj(a,b,c,d,0)|0}function Uj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=S(d,c)|0;f=a>>>16;a=(e>>>16)+(S(d,f)|0)|0;d=b>>>16;b=S(d,c)|0;return (D=(a>>>16)+(S(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Vj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=Uj(e,a)|0;f=D;return (D=(S(b,a)|0)+(S(d,e)|0)+f|f&0,c|0|0)|0}function Wj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Qj(b,c,d)|0;return b|0}function Xj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f|0;Sj(a,b,d,e,g)|0;l=f;return (D=c[g+4>>2]|0,c[g>>2]|0)|0}function Yj(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Zj(a){a=a|0;var b=0,d=0,e=0,f=0;a=a+15&-16|0;b=Z()|0;do{e=mb(c,i>>2)|0;f=e+a|0;if((a|0)>0&(f|0)<(e|0)|(f|0)<0|(f|0)>(b|0))_()|0;d=pb(c,i>>2,e|0,f|0)|0}while((d|0)!=(e|0));return e|0}function _j(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return wb[a&7](b|0,c|0,d|0)|0}function $j(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;xb[a&15](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function ak(a){a=a|0;return yb[a&1]()|0}function bk(a,b){a=a|0;b=b|0;zb[a&31](b|0)}function ck(a,b,c){a=a|0;b=b|0;c=c|0;Ab[a&7](b|0,c|0)}function dk(a,b){a=a|0;b=b|0;return Bb[a&7](b|0)|0}function ek(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Cb[a&0](b|0,c|0,d|0)}function fk(a){a=a|0;Db[a&7]()}function gk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Eb[a&1](b|0,c|0,d|0,e|0)|0}function hk(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Fb[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function ik(a,b,c){a=a|0;b=b|0;c=c|0;return Gb[a&31](b|0,c|0)|0}function jk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Hb[a&3](b|0,c|0,d|0,e|0,f|0)|0}function kk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ib[a&63](b|0,c|0,d|0,e|0)}function lk(a,b,c){a=a|0;b=b|0;c=c|0;W(0);return 0}function mk(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;W(1)}function nk(){W(2);return 0}function ok(a){a=a|0;W(3)}function pk(a,b){a=a|0;b=b|0;W(4)}function qk(a){a=a|0;W(5);return 0}function rk(a,b,c){a=a|0;b=b|0;c=c|0;W(6)}function sk(){W(7)}function tk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(8);return 0}function uk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(9)}function vk(a,b){a=a|0;b=b|0;W(10);return 0}function wk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(11);return 0}function xk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(12)}\nfunction Vf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!d)return;h=c[d+52>>2]|0;i=c[d+56>>2]|0;j=c[d+60>>2]|0;k=c[d+16>>2]|0;l=c[d+36>>2]|0;d=f<<3;f=e<<3;e=g+16|0;m=g+20|0;n=d>>c[a+4>>2];o=f>>c[a+8>>2];if(!g){c[a+20+(b<<3)>>2]=h+((S(o,k)|0)+n);c[a+20+(b<<3)+4>>2]=k;c[a+108+(b<<3)>>2]=i+((S(f>>c[a+96>>2],l)|0)+(d>>c[a+92>>2]));c[a+108+(b<<3)+4>>2]=l;p=d>>c[a+180>>2];q=f>>c[a+184>>2]}else{r=Gb[c[e>>2]&31](n,g)|0;c[a+20+(b<<3)>>2]=h+((S(Gb[c[m>>2]&31](o,g)|0,k)|0)+r);c[a+20+(b<<3)+4>>2]=k;k=f>>c[a+96>>2];r=Gb[c[e>>2]&31](d>>c[a+92>>2],g)|0;c[a+108+(b<<3)>>2]=i+((S(Gb[c[m>>2]&31](k,g)|0,l)|0)+r);c[a+108+(b<<3)+4>>2]=l;r=f>>c[a+184>>2];f=Gb[c[e>>2]&31](d>>c[a+180>>2],g)|0;p=f;q=Gb[c[m>>2]&31](r,g)|0}c[a+196+(b<<3)>>2]=j+((S(q,l)|0)+p);c[a+196+(b<<3)+4>>2]=l;return}function Wf(b,d,e,f,g,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;o=l;l=l+112|0;p=o+80|0;q=o;r=e&255;if(!m)s=(c[b+300>>2]|0)!=0;else s=1;t=s&1;if(!k)u=(c[b+296>>2]|0)!=0;else u=1;v=u&1;w=((1<<r)+k|0)<(1<<d|0);d=q+16|0;x=4<<r;y=(n|0)==0;z=c[b+344>>2]|0;A=c[(y?z:z+20|0)>>2]|0;B=c[(y?z+4|0:z+24|0)>>2]|0;z=(0-(c[b+316>>2]|0)>>(c[b+(n*88|0)+4>>2]|0)+3)+(k<<2)|0;k=(0-(c[b+324>>2]|0)>>(c[b+(n*88|0)+8>>2]|0)+3)+(m<<2)|0;m=f&255;a:do if(757>>>m&1|0){if(!u){Jj(p|0,-127,x|0)|0;break}if((c[b+328>>2]|0)>=0){if((x|0)>0)C=0;else break;while(1){a[p+C>>0]=a[g+((S(C,h)|0)+-1)>>0]|0;C=C+1|0;if((C|0)==(x|0))break a}}if((k+x|0)<=(B|0)){if((x|0)>0)D=0;else break;while(1){a[p+D>>0]=a[g+((S(D,h)|0)+-1)>>0]|0;D=D+1|0;if((D|0)==(x|0))break a}}n=B-k|0;if((n|0)>0){y=0;do{a[p+y>>0]=a[g+((S(y,h)|0)+-1)>>0]|0;y=y+1|0}while((y|0)!=(n|0));E=n}else E=0;if((x|0)>(E|0))Jj(p+E|0,a[g+((S(n+-1|0,h)|0)+-1)>>0]|0,x-E|0)|0}while(0);if(!(627>>>m&1))F=d;else{do if(s){E=g+(0-h)|0;do if((c[b+320>>2]|0)<0){k=z+x|0;if((k|0)<=(A|0)){Qj(d|0,E|0,x|0)|0;G=27;break}B=A-z|0;if((A|0)<(z|0))G=27;else{Qj(d|0,E|0,B|0)|0;Jj(d+B|0,a[d+(B+-1)>>0]|0,k-A|0)|0;G=27}}else if(e<<24>>24==0&w&u)H=E;else{Qj(d|0,E|0,x|0)|0;G=27}while(0);if((G|0)==27)if(u)H=d;else{I=-127;J=d;break}I=a[E+-1>>0]|0;J=H}else{Jj(d|0,127,x|0)|0;I=127;J=d}while(0);a[q+15>>0]=I;F=J}switch(f<<24>>24){case 3:case 8:{G=32;break}case 0:{Ib[c[34836+(v<<5)+(t<<4)+(r<<2)>>2]&63](i,j,F,p);l=o;return}default:K=F}if((G|0)==32){do if(s){t=g+(0-h)|0;do if((c[b+320>>2]|0)<0){v=x<<1;f=z+v|0;if((f|0)<=(A|0))if(e<<24>>24==0&w){Qj(d|0,t|0,v|0)|0;G=48;break}else{Qj(d|0,t|0,x|0)|0;Jj(d+x|0,a[d+(x+-1)>>0]|0,x|0)|0;G=48;break}if((z+x|0)>(A|0)){v=A-z|0;if((A|0)<(z|0)){G=48;break}Qj(d|0,t|0,v|0)|0;Jj(d+v|0,a[d+(v+-1)>>0]|0,f-A|0)|0;G=48;break}v=A-z|0;if(e<<24>>24==0&w){Qj(d|0,t|0,v|0)|0;Jj(d+v|0,a[d+(v+-1)>>0]|0,f-A|0)|0;G=48;break}else{Qj(d|0,t|0,x|0)|0;Jj(d+x|0,a[d+(x+-1)>>0]|0,x|0)|0;G=48;break}}else{f=e<<24>>24==0&w;if(!(f&u)){Qj(d|0,t|0,x|0)|0;v=d+x|0;if(f){Qj(v|0,t+x|0,x|0)|0;G=48;break}else{Jj(v|0,a[d+(x+-1)>>0]|0,x|0)|0;G=48;break}}else L=t}while(0);if((G|0)==48)if(u)L=F;else{M=-127;N=F;break}M=a[t+-1>>0]|0;N=L}else{Jj(d|0,127,x<<1|0)|0;M=127;N=F}while(0);a[q+15>>0]=M;K=N}Ib[c[34900+(m<<4)+(r<<2)>>2]&63](i,j,K,p);l=o;return}function Xf(){vj(35060,4)|0;return}function Yf(){c[8729]=1;c[8730]=2;c[8731]=3;c[8732]=4;c[8733]=5;c[8734]=6;c[8735]=7;c[8736]=8;c[8753]=9;c[8754]=10;c[8755]=11;c[8756]=12;c[8737]=13;c[8738]=14;c[8739]=15;c[8740]=16;c[8757]=17;c[8758]=18;c[8759]=19;c[8760]=20;c[8745]=21;c[8746]=22;c[8747]=23;c[8748]=24;c[8741]=25;c[8742]=26;c[8743]=27;c[8744]=28;c[8749]=29;c[8750]=30;c[8751]=31;c[8752]=32;c[8761]=33;c[8762]=34;c[8763]=35;c[8764]=36;c[8709]=37;c[8710]=38;c[8711]=39;c[8712]=40;c[8713]=41;c[8714]=42;c[8715]=43;c[8716]=44;c[8717]=45;c[8718]=46;c[8719]=47;c[8720]=48;c[8721]=49;c[8722]=50;c[8723]=51;c[8724]=52;return}function Zf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;b=a+24|0;if(c[b>>2]|0){d=0;return d|0}e=Xb(1,1080)|0;if(!e){d=2;return d|0}c[b>>2]=e;b=c[a+16>>2]|0;c[e+4>>2]=b;c[e+196>>2]=16;c[e+344>>2]=0;f=a+20|0;a=c[f>>2]|0;if(!a){c[e+364>>2]=0;d=0;return d|0}else{c[e+364>>2]=(b&524288|0)!=0&(c[a>>2]|0)>>>0>1&1;b=e+184|0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[f>>2]=b;d=0;return d|0}return 0}function _f(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+368|0;d=c[b>>2]|0;if(!d)e=a+1056|0;else{f=a+372|0;if((c[f>>2]|0)>0){zb[c[(we()|0)+20>>2]&31](d);d=c[f>>2]|0;if((d|0)>1){g=1;do{h=(c[b>>2]|0)+(g*24|0)|0;zb[c[(we()|0)+20>>2]&31](h);g=g+1|0;h=c[f>>2]|0}while((g|0)<(h|0));i=h}else i=d;if((i|0)>0){i=0;do{d=c[(c[b>>2]|0)+(i*24|0)+12>>2]|0;Ce((c[d>>2]|0)+432|0);ah(c[d>>2]|0);Yb(c[d+32>>2]|0);pj(d+68|0)|0;Yb(d);i=i+1|0}while((i|0)<(c[f>>2]|0))}}e=a+1056|0}f=c[e>>2]|0;if(!f){j=c[b>>2]|0;Yb(j);k=c[e>>2]|0;Yb(k);Yb(a);return 0}Ae(f);Qe((c[e>>2]|0)+2440|0);j=c[b>>2]|0;Yb(j);k=c[e>>2]|0;Yb(k);Yb(a);return 0}function $f(a,b,c){a=a|0;b=b|0;c=c|0;return hg(a,b,c,0,0,0)|0}function ag(a,b){a=a|0;b=b|0;var d=0;d=a+196|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b>>2]=16;return 0}function bg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;g=l;l=l+64|0;h=g;i=g+48|0;j=g+40|0;k=g+44|0;m=g+8|0;n=g+4|0;c[j>>2]=d;o=d;c[k>>2]=o;p=d+e|0;q=b+344|0;if((e|0)==0&(d|0)==0){c[q>>2]=1;r=0;l=g;return r|0}c[q>>2]=0;s=b+368|0;if(!(c[s>>2]|0)){t=we()|0;c[b+352>>2]=-1;c[b+376>>2]=0;c[b+380>>2]=0;c[b+384>>2]=0;c[b+1044>>2]=0;c[b+1040>>2]=0;c[b+1048>>2]=0;c[b+1052>>2]=1;u=b+364|0;if((c[u>>2]|0)==1)v=c[b+184>>2]|0;else v=1;w=b+372|0;x=(v|0)<8?v:8;c[w>>2]=x;c[b+388>>2]=x;c[q>>2]=0;q=Xb(1,2448)|0;x=b+1056|0;c[x>>2]=q;if(!q){r=2;l=g;return r|0}if(Aj(q,0)|0){c[b>>2]=29486;r=2;l=g;return r|0}q=Wb((c[w>>2]|0)*24|0)|0;c[s>>2]=q;if(!q){c[b>>2]=29523;r=2;l=g;return r|0}v=c[w>>2]|0;a:do if((v|0)>0){y=b+184|0;z=b+348|0;A=t+4|0;zb[c[t>>2]&31](q);B=Vb(32,124)|0;c[q+12>>2]=B;b:do if(B|0){C=q;D=q;E=B;F=0;while(1){G=$g(c[x>>2]|0)|0;c[E>>2]=G;if(!G){H=17;break}c[G+17872>>2]=D;c[E+24>>2]=F;c[E+32>>2]=0;c[E+36>>2]=0;c[E+116>>2]=0;c[E+28>>2]=0;if(Aj(E+40|0,0)|0){H=19;break}if(qj(E+68|0,0)|0){H=21;break}G=c[u>>2]|0;if(!G)I=c[y>>2]|0;else I=0;J=c[E>>2]|0;c[J+18720>>2]=I;c[J+18724>>2]=c[z>>2];c[J+17864>>2]=G;c[J+4528>>2]=G;c[C+(F*24|0)+8>>2]=22;F=F+1|0;if(!(Bb[c[A>>2]&7](D)|0)){H=25;break}G=c[w>>2]|0;if((F|0)>=(G|0)){K=G;break a}C=c[s>>2]|0;D=C+(F*24|0)|0;zb[c[t>>2]&31](D);E=Vb(32,124)|0;c[C+(F*24|0)+12>>2]=E;if(!E)break b}if((H|0)==17){c[b>>2]=29556;r=2;l=g;return r|0}else if((H|0)==19){c[b>>2]=29593;r=2;l=g;return r|0}else if((H|0)==21){c[b>>2]=29636;r=2;l=g;return r|0}else if((H|0)==25){c[b>>2]=29678;r=2;l=g;return r|0}}while(0);c[b>>2]=29556;r=2;l=g;return r|0}else K=v;while(0);if((c[b+212>>2]|0)==0?c[b+4>>2]&65536|0:0){c[b+216>>2]=3;c[b+220>>2]=4;c[b+224>>2]=0}if((K|0)>0){v=b+356|0;t=b+360|0;I=b+1064|0;u=b+1068|0;x=b+1060|0;q=K;K=0;while(1){A=c[c[(c[s>>2]|0)+(K*24|0)+12>>2]>>2]|0;z=c[A+17836>>2]|0;c[A+988>>2]=-1;c[A+17808>>2]=c[v>>2];c[A+17812>>2]=c[t>>2];y=c[I>>2]|0;if((y|0)!=0?(B=c[u>>2]|0,(B|0)!=0):0){c[z+32>>2]=y;c[z+36>>2]=B;L=c[x>>2]|0;M=q}else{c[z+32>>2]=5;c[z+36>>2]=23;B=z+2440|0;if(Pe(B)|0)Ub(A+432|0,2,29714,h);L=B;M=c[w>>2]|0}c[z+28>>2]=L;K=K+1|0;if((K|0)>=(M|0))break;else q=M}}}M=b+228|0;q=b+232|0;K=jh(d,e,m,n,c[M>>2]|0,c[q>>2]|0)|0;if(K|0){r=K;l=g;return r|0}if(c[b+1072>>2]|0){K=c[b+1076>>2]|0;L=c[n>>2]|0;w=K+1|0;if((K|0)<(L+-1|0)){c[n>>2]=w;N=w}else N=L}else N=c[n>>2]|0;L=(N|0)>0;if(c[b+364>>2]|0){if(!L){do if(!(c[b+388>>2]|0)){if((c[b+1048>>2]|0)<6){fg(b);break}c[b>>2]=29758;r=1;l=g;return r|0}while(0);r=gg(b,j,e,f)|0;l=g;return r|0}j=p;N=b+388|0;w=b+1048|0;K=o;h=d;x=c[k>>2]|0;u=0;while(1){c[i>>2]=K;I=c[m+(u<<2)>>2]|0;if(K>>>0<d>>>0|I>>>0>(j-K|0)>>>0){O=29786;P=7;H=52;break}if(!(c[N>>2]|0)){if((c[w>>2]|0)>=6){O=29758;P=1;H=52;break}fg(b)}Q=gg(b,i,I,f)|0;if(Q|0){H=53;break}h=h+I|0;u=u+1|0;if((u|0)>=(c[n>>2]|0)){H=80;break}else{K=h;x=h}}if((H|0)==52){c[k>>2]=x;c[b>>2]=O;R=P}else if((H|0)==53){c[k>>2]=x;R=Q}else if((H|0)==80){c[k>>2]=h;r=0;l=g;return r|0}r=R;l=g;return r|0}if(L){L=p;R=o;o=d;h=c[k>>2]|0;Q=0;while(1){c[i>>2]=R;x=c[m+(Q<<2)>>2]|0;if(R>>>0<d>>>0|x>>>0>(L-R|0)>>>0){H=64;break}S=gg(b,i,x,f)|0;if(S|0){H=67;break}o=o+x|0;Q=Q+1|0;if((Q|0)>=(c[n>>2]|0)){H=79;break}else{R=o;h=o}}if((H|0)==64){c[k>>2]=h;c[b>>2]=29786;T=7}else if((H|0)==67){c[k>>2]=h;T=S}else if((H|0)==79){c[k>>2]=o;r=0;l=g;return r|0}r=T;l=g;return r|0}T=p;if((e|0)>0)U=d;else{r=0;l=g;return r|0}while(1){d=gg(b,k,T-U|0,f)|0;if(d|0){r=d;H=81;break}d=c[k>>2]|0;do if(d>>>0<p>>>0){e=d;while(1){o=c[M>>2]|0;if(!o)V=a[e>>0]|0;else{Ib[o&63](c[q>>2]|0,e,i,1);V=a[i>>0]|0}if(V<<24>>24){H=69;break}W=e+1|0;if(W>>>0<p>>>0)e=W;else{H=70;break}}if((H|0)==69){H=0;c[k>>2]=e;X=e;break}else if((H|0)==70){H=0;c[k>>2]=W;X=W;break}}else X=d;while(0);if(X>>>0<p>>>0)U=X;else{r=0;H=81;break}}if((H|0)==81){l=g;return r|0}return 0}function cg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=l;l=l+144|0;f=e+16|0;g=e;h=b+364|0;i=(c[h>>2]|0)==0;if((!i?(c[b+388>>2]|0)>0:0)?(c[b+344>>2]|0)==0:0){j=0;l=e;return j|0}k=b+1048|0;if((c[k>>2]|0)>0){m=c[b+1056>>2]|0;n=b+352|0;if(!i?(c[n>>2]|0)>-1:0){xe(m);i=c[n>>2]|0;if((((i|0)>-1?(o=m+40+(i*160|0)|0,p=c[o>>2]|0,(p|0)>0):0)?(q=p+-1|0,c[o>>2]=q,(q|0)==0):0)?c[m+40+(i*160|0)+24>>2]|0:0)Gb[c[m+36>>2]&31](c[m+28>>2]|0,m+40+(i*160|0)+16|0)|0;ye(m)}m=b+1044|0;i=c[m>>2]|0;c[n>>2]=c[b+392+(i*108|0)>>2];if(c[b+1052>>2]|0){j=0;l=e;return j|0}c[m>>2]=(i+1|0)%6|0;c[k>>2]=(c[k>>2]|0)+-1;j=b+392+(i*108|0)+4|0;l=e;return j|0}if(c[d>>2]|0){j=0;l=e;return j|0}d=b+368|0;if(!(c[d>>2]|0)){j=0;l=e;return j|0}i=b+384|0;k=b+372|0;m=b+4|0;n=b+388|0;q=b+1052|0;o=b+344|0;p=b+376|0;r=b+216|0;s=b+220|0;t=b+224|0;u=g+4|0;v=g+8|0;while(1){c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;w=we()|0;x=c[d>>2]|0;y=c[i>>2]|0;z=c[x+(y*24|0)+12>>2]|0;c[i>>2]=(y+1|0)%(c[k>>2]|0)|0;if(c[m>>2]&65536|0){A=c[s>>2]|0;B=c[t>>2]|0;c[g>>2]=c[r>>2];c[u>>2]=A;c[v>>2]=B}B=z+28|0;if(!(Bb[c[w+8>>2]&7](x+(y*24|0)|0)|0)){c[B>>2]=0;c[n>>2]=(c[n>>2]|0)+1;c[q>>2]=1;if((c[o>>2]|0)!=1){C=0;break}}else{do if((c[B>>2]|0)==1){c[n>>2]=(c[n>>2]|0)+1;c[B>>2]=0;y=c[z>>2]|0;if((c[q>>2]|0)==1?(c[y+18728>>2]|0)==0:0){if((a[y+1012>>0]|0)==0?c[y+996>>2]|0:0){D=y;E=z;break}c[q>>2]=0;D=y;E=z}else{D=y;E=z}}else{D=c[z>>2]|0;E=z}while(0);if(!(ih(D,f,g)|0)){F=29;break}}if((c[i>>2]|0)==(c[p>>2]|0)){j=0;F=42;break}}if((F|0)==42){l=e;return j|0}if((F|0)==29){F=c[E>>2]|0;p=c[F+17836>>2]|0;i=c[b+1056>>2]|0;g=b+352|0;if((c[h>>2]|0)!=0?(c[g>>2]|0)>-1:0){xe(i);h=c[g>>2]|0;if((((h|0)>-1?(D=i+40+(h*160|0)|0,n=c[D>>2]|0,(n|0)>0):0)?(o=n+-1|0,c[D>>2]=o,(o|0)==0):0)?c[i+40+(h*160|0)+24>>2]|0:0)Gb[c[i+36>>2]&31](c[i+28>>2]|0,i+40+(h*160|0)+16|0)|0;ye(i);G=c[E>>2]|0}else G=F;c[g>>2]=c[G+988>>2];if(!(c[q>>2]|0)){q=b+236|0;G=c[z+16>>2]|0;z=c[f+88>>2]|0;g=(z|0)==0;E=c[f+84>>2]|0;i=(E|0)!=0;c[q>>2]=g?(i?261:262):i?258:263;c[b+240>>2]=c[f+96>>2];c[b+244>>2]=c[f+100>>2];c[b+256>>2]=8;h=c[f+16>>2]|0;c[b+248>>2]=h;c[b+252>>2]=(c[f+4>>2]|0)+327&-8;c[b+260>>2]=c[f+8>>2];c[b+264>>2]=c[f+12>>2];c[b+268>>2]=c[f+104>>2];c[b+272>>2]=c[f+108>>2];c[b+276>>2]=E;c[b+280>>2]=z;c[b+284>>2]=c[f+52>>2];c[b+288>>2]=c[f+56>>2];c[b+292>>2]=c[f+60>>2];c[b+296>>2]=0;c[b+300>>2]=h;z=c[f+36>>2]|0;c[b+304>>2]=z;c[b+308>>2]=z;c[b+312>>2]=h;c[b+316>>2]=g?(i?16:24):i?12:16;c[b+320>>2]=G;c[b+324>>2]=c[f+68>>2];c[b+328>>2]=0;c[b+332>>2]=0;c[b+336>>2]=c[p+40+((c[F+988>>2]|0)*160|0)+24>>2];C=q}else C=0}j=C;l=e;return j|0}function dg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;if((b|0)==0|(d|0)==0){f=8;return f|0}if(c[a+368>>2]|0){f=1;return f|0}c[a+1064>>2]=b;c[a+1068>>2]=d;c[a+1060>>2]=e;f=0;return f|0}function eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;b=l;l=l+16|0;d=b;e=a+4|0;c[d>>2]=c[e>>2];f=a+12|0;g=hh(c[a>>2]|0,c[f>>2]|0,d)|0;c[a+20>>2]=g;h=c[d>>2]|0;c[a+8>>2]=h;d=c[a>>2]|0;i=(g|0)!=0;j=h;do if(!(c[d+17864>>2]|0)){if(i){c[(c[d+17868>>2]|0)+140>>2]=1;c[d+18728>>2]=1}}else{if(!i?((c[e>>2]|0)+(c[f>>2]|0)+-1|0)>>>0<=j>>>0:0)break;h=c[d+17872>>2]|0;k=c[d+17836>>2]|0;Vg(h);c[a+116>>2]=1;xe(k);c[(c[(c[a>>2]|0)+17868>>2]|0)+140>>2]=1;ye(k);c[(c[a>>2]|0)+18728>>2]=1;Xg(h);Wg(h);m=0;l=b;return m|0}while(0);m=(g|0)==0&1;l=b;return m|0}function fg(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+144|0;e=d+16|0;f=d;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;g=we()|0;h=c[b+368>>2]|0;i=b+384|0;j=c[i>>2]|0;k=c[h+(j*24|0)+12>>2]|0;c[i>>2]=(j+1|0)%(c[b+372>>2]|0)|0;Bb[c[g+8>>2]&7](h+(j*24|0)|0)|0;c[k+28>>2]=0;j=b+388|0;c[j>>2]=(c[j>>2]|0)+1;j=c[k>>2]|0;h=b+1052|0;do if((c[h>>2]|0)==1?(c[j+18728>>2]|0)==0:0){if((a[j+1012>>0]|0)==0?c[j+996>>2]|0:0)break;c[h>>2]=0}while(0);if(ih(j,e,f)|0){l=d;return}f=c[k>>2]|0;j=c[f+17836>>2]|0;h=f+988|0;f=b+1040|0;c[b+392+((c[f>>2]|0)*108|0)>>2]=c[h>>2];g=c[f>>2]|0;i=c[k+16>>2]|0;k=c[e+88>>2]|0;m=(k|0)==0;n=c[e+84>>2]|0;o=(n|0)!=0;c[b+392+(g*108|0)+4>>2]=m?(o?261:262):o?258:263;c[b+392+(g*108|0)+8>>2]=c[e+96>>2];c[b+392+(g*108|0)+12>>2]=c[e+100>>2];c[b+392+(g*108|0)+24>>2]=8;p=c[e+16>>2]|0;c[b+392+(g*108|0)+16>>2]=p;c[b+392+(g*108|0)+20>>2]=(c[e+4>>2]|0)+327&-8;c[b+392+(g*108|0)+28>>2]=c[e+8>>2];c[b+392+(g*108|0)+32>>2]=c[e+12>>2];c[b+392+(g*108|0)+36>>2]=c[e+104>>2];c[b+392+(g*108|0)+40>>2]=c[e+108>>2];c[b+392+(g*108|0)+44>>2]=n;c[b+392+(g*108|0)+48>>2]=k;c[b+392+(g*108|0)+52>>2]=c[e+52>>2];c[b+392+(g*108|0)+56>>2]=c[e+56>>2];c[b+392+(g*108|0)+60>>2]=c[e+60>>2];c[b+392+(g*108|0)+64>>2]=0;c[b+392+(g*108|0)+68>>2]=p;k=c[e+36>>2]|0;c[b+392+(g*108|0)+72>>2]=k;c[b+392+(g*108|0)+76>>2]=k;c[b+392+(g*108|0)+80>>2]=p;c[b+392+(g*108|0)+84>>2]=m?(o?16:24):o?12:16;c[b+392+(g*108|0)+88>>2]=i;c[b+392+(g*108|0)+92>>2]=c[e+68>>2];c[b+392+(g*108|0)+96>>2]=0;c[b+392+(g*108|0)+100>>2]=0;c[b+392+((c[f>>2]|0)*108|0)+104>>2]=c[j+40+((c[h>>2]|0)*160|0)+24>>2];c[f>>2]=((c[f>>2]|0)+1|0)%6|0;f=b+1048|0;c[f>>2]=(c[f>>2]|0)+1;l=d;return}function gg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=l;l=l+16|0;h=g;i=we()|0;do if(!(c[b+204>>2]|0)){c[h>>2]=0;j=hg(c[d>>2]|0,e,b+196|0,h,c[b+228>>2]|0,c[b+232>>2]|0)|0;if(!j){if(!(c[h>>2]|c[b+208>>2]))k=1;else break;l=g;return k|0}else{k=j;l=g;return k|0}}while(0);h=c[b+368>>2]|0;if(c[b+364>>2]|0){j=b+376|0;m=c[j>>2]|0;n=h+(m*24|0)|0;o=c[h+(m*24|0)+12>>2]|0;p=b+380|0;q=c[p>>2]|0;if((m|0)!=(q|0))_g(n,h+(q*24|0)|0);c[(c[o>>2]|0)+17856>>2]=0;q=o+36|0;r=o+32|0;s=c[r>>2]|0;do if((c[q>>2]|0)>>>0<e>>>0){Yb(s);t=Wb(e)|0;c[r>>2]=t;if(t|0){c[q>>2]=e;u=t;break}c[b>>2]=29814;k=2;l=g;return k|0}else u=s;while(0);c[o+12>>2]=e;Qj(u|0,c[d>>2]|0,e|0)|0;c[o+120>>2]=0;c[o+116>>2]=0;c[o+28>>2]=1;c[o+4>>2]=c[r>>2];c[o+16>>2]=f;o=c[j>>2]|0;r=c[p>>2]|0;u=c[b+372>>2]|0;if((o|0)!=(r|0))c[p>>2]=(r+1|0)%(u|0)|0;c[j>>2]=(o+1|0)%(u|0)|0;u=b+388|0;c[u>>2]=(c[u>>2]|0)+-1;c[h+(m*24|0)+20>>2]=0;zb[c[i+12>>2]&31](n);k=0;l=g;return k|0}n=c[h+12>>2]|0;c[n+4>>2]=c[d>>2];c[n+12>>2]=e;c[n+16>>2]=f;c[n+28>>2]=1;f=c[n>>2]|0;c[f+18712>>2]=c[b+228>>2];c[f+18716>>2]=c[b+232>>2];f=h+20|0;c[f>>2]=0;zb[c[i+16>>2]&31](h);c[d>>2]=c[n+8>>2];d=c[n>>2]|0;if(c[f>>2]|0){f=c[d+432>>2]|0;if(!f){k=0;l=g;return k|0}c[b>>2]=c[d+436>>2]|0?d+440|0:0;k=f;l=g;return k|0}f=b+1052|0;if((c[f>>2]|0)!=1){k=0;l=g;return k|0}if(c[d+18728>>2]|0){k=0;l=g;return k|0}if((a[d+1012>>0]|0)==0?c[d+996>>2]|0:0){k=0;l=g;return k|0}c[f>>2]=0;k=0;l=g;return k|0}function hg(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;h=l;l=l+32|0;i=h+20|0;j=h;if((b|0)<1){k=8;l=h;return k|0}m=d+12|0;c[m>>2]=0;n=d+8|0;c[n>>2]=0;o=d+4|0;c[o>>2]=0;d=b>>>0<10?b:10;if(!f){p=a;q=b}else{Ib[f&63](g,a,i,d);p=i;q=d}c[j>>2]=p;c[j+4>>2]=p+q;p=j+8|0;c[p>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;d=kc(j,2)|0;i=Gg(j)|0;a:do if(!((d|0)!=2|i>>>0>3)){if(jc(j)|0){if(q>>>0<2&i>>>0>2){r=5;break}kc(j,3)|0;r=0;break}if(q>>>0>=10){c[m>>2]=(jc(j)|0)==0&1;a=jc(j)|0;g=jc(j)|0;do if(!(c[m>>2]|0)){if(a|0){c[p>>2]=(c[p>>2]|0)+(g|0?0:2);s=0;break}f=jc(j)|0;c[p>>2]=(c[p>>2]|0)+(g|0?0:2);if(!f)s=0;else{if(!(Eg(j)|0)){r=5;break a}switch(i|0){case 0:{t=c[p>>2]|0;break}case 1:{u=27;break}default:{c[p>>2]=(c[p>>2]|0)+1;u=27}}do if((u|0)==27){b=(i|2|0)==3;if((kc(j,3)|0)==7){if(!b){r=5;break a}v=c[p>>2]|0}else{w=c[p>>2]|0;x=w+1|0;c[p>>2]=x;if(!b){t=x;break}x=w+3|0;c[p>>2]=x;v=x}x=v+1|0;c[p>>2]=x;t=x}while(0);c[p>>2]=t+8;Fg(j,o,n);s=f}}else{if(!(Eg(j)|0)){r=5;break a}if(i>>>0>1)c[p>>2]=(c[p>>2]|0)+1;x=(i|2|0)==3;if((kc(j,3)|0)!=7){w=c[p>>2]|0;c[p>>2]=w+1;if(x){b=w+3|0;c[p>>2]=b;y=b;u=18}}else{if(!x){r=5;break a}y=c[p>>2]|0;u=18}if((u|0)==18)c[p>>2]=y+1;Fg(j,o,n);s=0}while(0);if(!e){k=0;l=h;return k|0}c[e>>2]=s;k=0;l=h;return k|0}else r=5}else r=5;while(0);k=r;l=h;return k|0}function ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(c[a+364>>2]|0){c[a>>2]=29850;h=4;l=d;return h|0}if(!g){h=8;l=d;return h|0}f=c[(c[a+368>>2]|0)+12>>2]|0;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];a=c[g+28>>2]|0;c[e+8>>2]=a;b=c[g+32>>2]|0;c[e+12>>2]=b;c[e+104>>2]=c[g+36>>2];c[e+108>>2]=c[g+40>>2];c[e>>2]=a;c[e+4>>2]=b;i=c[g+44>>2]|0;j=(i|0)==1?(a+1|0)/2|0:a;c[e+20>>2]=j;a=c[g+48>>2]|0;k=(a|0)==1?(b+1|0)/2|0:b;c[e+24>>2]=k;c[e+28>>2]=j;c[e+32>>2]=k;k=c[g+68>>2]|0;c[e+16>>2]=k;c[e+36>>2]=c[g+72>>2];c[e+96>>2]=c[g+8>>2];c[e+100>>2]=c[g+12>>2];c[e+76>>2]=(k-(c[g+16>>2]|0)|0)>>>1;c[e+84>>2]=i;c[e+88>>2]=a;h=fh(c[f>>2]|0,c[g>>2]|0,e)|0;l=d;return h|0}function jg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(c[a+364>>2]|0){c[a>>2]=29850;h=4;l=d;return h|0}if(!g){h=8;l=d;return h|0}f=c[(c[a+368>>2]|0)+12>>2]|0;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];a=c[g+28>>2]|0;c[e+8>>2]=a;b=c[g+32>>2]|0;c[e+12>>2]=b;c[e+104>>2]=c[g+36>>2];c[e+108>>2]=c[g+40>>2];c[e>>2]=a;c[e+4>>2]=b;i=c[g+44>>2]|0;j=(i|0)==1?(a+1|0)/2|0:a;c[e+20>>2]=j;a=c[g+48>>2]|0;k=(a|0)==1?(b+1|0)/2|0:b;c[e+24>>2]=k;c[e+28>>2]=j;c[e+32>>2]=k;k=c[g+68>>2]|0;c[e+16>>2]=k;c[e+36>>2]=c[g+72>>2];c[e+96>>2]=c[g+8>>2];c[e+100>>2]=c[g+12>>2];c[e+76>>2]=(k-(c[g+16>>2]|0)|0)>>>1;c[e+84>>2]=i;c[e+88>>2]=a;a=(c[f>>2]|0)+432|0;f=c[g>>2]|0;switch(f|0){case 4:case 2:case 1:{m=f;break}default:m=1}h=gh(a,m,e)|0;l=d;return h|0}function kg(a,b){a=a|0;b=b|0;return 4}function lg(a,b){a=a|0;b=b|0;var d=0,e=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;c[a+348>>2]=e;return 0}function mg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){c[a+228>>2]=0;f=0;g=a+232|0;c[g>>2]=f;return 0}else{c[a+228>>2]=c[e>>2];f=c[e+4>>2]|0;g=a+232|0;c[g>>2]=f;return 0}return 0}function ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(e|0){if((e+-32|0)>>>0>992){f=8;return f|0}if(e+-1&e|0){f=8;return f|0}}c[a+356>>2]=e;d=c[a+368>>2]|0;if(!d){f=0;return f|0}c[(c[c[d+12>>2]>>2]|0)+17808>>2]=e;f=0;return f|0}function og(a,b){a=a|0;b=b|0;var d=0,e=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;c[a+360>>2]=e;d=c[a+368>>2]|0;if(!d)return 0;c[(c[c[d+12>>2]>>2]|0)+17812>>2]=e;return 0}function pg(a,b){a=a|0;b=b|0;var d=0,e=0;c[a+1072>>2]=1;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;c[a+1076>>2]=e;return e>>31&8|0}function qg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29850;f=4;return f|0}if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}c[e>>2]=c[(c[c[d+12>>2]>>2]|0)+17860>>2];f=0;return f|0}function rg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}b=c[c[d+12>>2]>>2]|0;if(!(c[b+720>>2]|0)){f=1;return f|0}d=c[a+352>>2]|0;if((d|0)<=-1){f=0;return f|0}c[e>>2]=c[(c[b+17836>>2]|0)+40+(d*160|0)+140>>2];f=0;return f|0}function sg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29850;f=4;return f|0}if(!e){f=8;return f|0}d=c[c[(c[a+368>>2]|0)+12>>2]>>2]|0;a=c[e>>2]|0;if(a>>>0>7){f=1;return f|0}b=c[d+732+(a<<2)>>2]|0;if((b|0)<0){f=1;return f|0}a=c[d+17836>>2]|0;d=c[a+40+(b*160|0)+116>>2]|0;g=(d|0)==0;h=c[a+40+(b*160|0)+112>>2]|0;i=(h|0)!=0;c[e+4>>2]=g?(i?261:262):i?258:263;c[e+8>>2]=c[a+40+(b*160|0)+124>>2];c[e+12>>2]=c[a+40+(b*160|0)+128>>2];c[e+24>>2]=8;j=a+40+(b*160|0)+44|0;k=c[j>>2]|0;c[e+16>>2]=k;c[e+20>>2]=(c[a+40+(b*160|0)+32>>2]|0)+327&-8;c[e+28>>2]=c[a+40+(b*160|0)+36>>2];c[e+32>>2]=c[a+40+(b*160|0)+40>>2];c[e+36>>2]=c[a+40+(b*160|0)+132>>2];c[e+40>>2]=c[a+40+(b*160|0)+136>>2];c[e+44>>2]=h;c[e+48>>2]=d;c[e+52>>2]=c[a+40+(b*160|0)+80>>2];c[e+56>>2]=c[a+40+(b*160|0)+84>>2];c[e+60>>2]=c[a+40+(b*160|0)+88>>2];c[e+64>>2]=0;c[e+68>>2]=k;k=a+40+(b*160|0)+64|0;c[e+72>>2]=c[k>>2];c[e+76>>2]=c[k>>2];c[e+80>>2]=c[j>>2];c[e+84>>2]=g?(i?16:24):i?12:16;c[e+88>>2]=0;c[e+92>>2]=c[a+40+(b*160|0)+96>>2];c[e+96>>2]=0;c[e+100>>2]=0;f=0;return f|0}function tg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29850;f=4;return f|0}if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}a=c[c[d+12>>2]>>2]|0;c[e>>2]=c[a+696>>2];c[e+4>>2]=c[a+700>>2];f=0;return f|0}function ug(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;d=c[a+368>>2]|0;b=c[a+384>>2]|0;if(!e){f=8;return f|0}if(!(d+(b*24|0)|0)){f=1;return f|0}c[e>>2]=c[(c[c[d+(b*24|0)+12>>2]>>2]|0)+17784>>2];f=0;return f|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29850;f=4;return f|0}if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}a=c[c[d+12>>2]>>2]|0;c[e>>2]=c[a+688>>2];c[e+4>>2]=c[a+692>>2];f=0;return f|0}function wg(){return 20052}function xg(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0;k=l;l=l+32|0;m=k;n=k+24|0;o=k+16|0;p=k+8|0;q=e+12|0;r=e+13280|0;s=f+432|0;t=e+13572|0;u=c[c[t>>2]>>2]|0;v=c[(c[f+728>>2]|0)+4>>2]|0;w=f+1040|0;x=c[w>>2]|0;if(c[f+996>>2]|0?(a[f+1012>>0]|0)==0:0){y=S(x,g)|0;z=v+(y*12|0)+(h*12|0)|0;v=y+h|0;y=f+4412|0;a:do if(a[y>>0]|0){A=c[f+1200>>2]|0;B=(A|0)==0;if(!B)if((i|0)>0&(j|0)>0){C=2147483647;D=0;while(1){E=(S(D,x)|0)+v|0;F=C;G=0;do{H=d[A+(E+G)>>0]|0;F=(F|0)<(H|0)?F:H;G=G+1|0}while((G|0)!=(i|0));D=D+1|0;if((D|0)==(j|0)){I=F;break}else C=F}}else I=2147483647;else I=0;if(!(a[f+4413>>0]|0)){C=c[f+1204>>2]|0;if(!((i|0)>0&(j|0)>0)){J=I;break}if(B){D=0;while(1){G=0;do{a[C+(G+v+(S(c[w>>2]|0,D)|0))>>0]=0;G=G+1|0}while((G|0)!=(i|0));D=D+1|0;if((D|0)==(j|0)){J=I;break a}}}else{D=0;while(1){B=0;do{G=B+v+(S(c[w>>2]|0,D)|0)|0;a[C+G>>0]=a[A+G>>0]|0;B=B+1|0}while((B|0)!=(i|0));D=D+1|0;if((D|0)==(j|0)){J=I;break a}}}}if(a[f+4416>>0]|0){D=c[e+13576>>2]|0;A=c[e+13580>>2]|0;if(!A)K=0;else K=a[A+5>>0]|0;if(!D)L=0;else L=a[D+5>>0]|0;D=d[L+K+(f+4424)>>0]|0;A=e+16|0;C=(256-D+(S(c[A>>2]|0,D)|0)|0)>>>8;D=e+20|0;B=c[D>>2]|0;if((B|0)<0){gc(q);M=c[D>>2]|0}else M=B;B=c[q>>2]|0;G=C<<24;if(B>>>0<G>>>0){N=0;O=C;P=B}else{N=1;O=(c[A>>2]|0)-C|0;P=B-G|0}G=d[1280+O>>0]|0;B=O<<G;C=M-G|0;c[q>>2]=P<<G;c[D>>2]=C;c[A>>2]=B;a[u+5>>0]=N;if(!N){Q=B;R=C;T=D;U=A;V=q;W=100}else X=I}else{A=e+16|0;D=e+20|0;Q=c[A>>2]|0;R=c[D>>2]|0;T=D;U=A;V=q;W=100}if((W|0)==100){A=Q;D=R;C=0;do{B=C<<24>>24;G=d[(B>>1)+(f+4417)>>0]|0;F=(256-G+(S(G,A)|0)|0)>>>8;if((D|0)<0){gc(q);Y=c[T>>2]|0}else Y=D;G=c[V>>2]|0;E=F<<24;if(G>>>0<E>>>0){Z=0;_=F;$=G}else{Z=1;_=(c[U>>2]|0)-F|0;$=G-E|0}E=d[1280+_>>0]|0;A=_<<E;D=Y-E|0;c[V>>2]=$<<E;c[T>>2]=D;c[U>>2]=A;C=a[28812+(Z+B)>>0]|0}while(C<<24>>24>0);X=0-(C<<24>>24)|0}if((j|0)>0?(A=X&255,D=f+1204|0,(i|0)>0):0){B=0;do{E=0;do{a[(c[D>>2]|0)+(E+v+(S(c[w>>2]|0,B)|0))>>0]=A;E=E+1|0}while((E|0)!=(i|0));B=B+1|0}while((B|0)!=(j|0));J=X}else J=X}else J=0;while(0);X=u+4|0;a[X>>0]=J;v=u+3|0;a[v>>0]=yg(s,r,J<<24>>24,q)|0;J=a[X>>0]|0;if((a[y>>0]|0)!=0?(c[f+4492+(J<<2)>>2]&4|0)!=0:0)aa=(b[f+4428+(J<<3)+4>>1]|0)!=0&1;else{J=c[e+13576>>2]|0;Z=c[e+13580>>2]|0;U=(Z|0)!=0;T=(J|0)!=0;if(!(T&U))if(T|U)ba=((a[(U?Z:J)+8>>0]|0)<1&1)<<1;else ba=0;else{U=(a[Z+8>>0]|0)>0;Z=(a[J+8>>0]|0)>0;ba=U|Z?(U&Z^1)&1:3}Z=d[(c[f+4540>>2]|0)+1931+ba>>0]|0;U=e+16|0;J=(256-Z+(S(c[U>>2]|0,Z)|0)|0)>>>8;Z=e+20|0;T=c[Z>>2]|0;if((T|0)<0){gc(q);ca=c[Z>>2]|0}else ca=T;T=c[q>>2]|0;$=J<<24;if(T>>>0<$>>>0){da=0;ea=J;fa=T}else{da=1;ea=(c[U>>2]|0)-J|0;fa=T-$|0}$=d[1280+ea>>0]|0;c[q>>2]=fa<<$;c[Z>>2]=ca-$;c[U>>2]=ea<<$;$=c[e+13548>>2]|0;ea=$+12496+(ba<<3)+(da<<2)|0;if(!$)aa=da;else{c[ea>>2]=(c[ea>>2]|0)+1;aa=da}}da=(aa|0)==0;a[u+2>>0]=zg(s,r,(da|(a[v>>0]|0)==0)&1,q)|0;v=a[u>>0]|0;if(da){switch(v<<24>>24){case 0:{da=f+4540|0;aa=e+16|0;ea=e+20|0;$=e+13548|0;ba=0;do{U=c[da>>2]|0;ca=c[aa>>2]|0;Z=c[ea>>2]|0;fa=0;do{T=fa<<24>>24;J=d[U+(T>>1)>>0]|0;V=(256-J+(S(J,ca)|0)|0)>>>8;if((Z|0)<0){gc(q);ga=c[ea>>2]|0}else ga=Z;J=c[q>>2]|0;Y=V<<24;if(J>>>0<Y>>>0){ha=0;ia=V;ja=J}else{ha=1;ia=(c[aa>>2]|0)-V|0;ja=J-Y|0}Y=d[1280+ia>>0]|0;ca=ia<<Y;Z=ga-Y|0;c[q>>2]=ja<<Y;c[ea>>2]=Z;c[aa>>2]=ca;fa=a[27420+(ha+T)>>0]|0}while(fa<<24>>24>0);ca=0-(fa&255)|0;Z=c[$>>2]|0;U=Z+((ca&255)<<2)|0;if(Z|0)c[U>>2]=(c[U>>2]|0)+1;a[u+20+(ba*12|0)>>0]=ca;ba=ba+1|0}while((ba|0)!=4);ba=a[u+56>>0]|0;a[u+1>>0]=ba;ka=ba;la=da;ma=ea;na=aa;oa=q;break}case 1:{aa=f+4540|0;ea=c[aa>>2]|0;da=e+16|0;ba=e+20|0;$=c[da>>2]|0;ha=c[ba>>2]|0;ja=0;do{ga=ja<<24>>24;ia=d[ea+(ga>>1)>>0]|0;ca=(256-ia+(S(ia,$)|0)|0)>>>8;if((ha|0)<0){gc(q);pa=c[ba>>2]|0}else pa=ha;ia=c[q>>2]|0;U=ca<<24;if(ia>>>0<U>>>0){qa=0;ra=ca;sa=ia}else{qa=1;ra=(c[da>>2]|0)-ca|0;sa=ia-U|0}U=d[1280+ra>>0]|0;$=ra<<U;ha=pa-U|0;c[q>>2]=sa<<U;c[ba>>2]=ha;c[da>>2]=$;ja=a[27420+(qa+ga)>>0]|0}while(ja<<24>>24>0);qa=0-(ja&255)|0;ja=qa&255;sa=e+13548|0;pa=c[sa>>2]|0;ra=pa+((qa&255)<<2)|0;if(!pa){ta=$;ua=ha}else{c[ra>>2]=(c[ra>>2]|0)+1;ta=c[da>>2]|0;ua=c[ba>>2]|0}a[u+44>>0]=ja;a[u+20>>0]=ja;ja=c[aa>>2]|0;ra=ta;ta=ua;ua=0;do{ha=ua<<24>>24;$=d[ja+(ha>>1)>>0]|0;pa=(256-$+(S($,ra)|0)|0)>>>8;if((ta|0)<0){gc(q);va=c[ba>>2]|0}else va=ta;$=c[q>>2]|0;qa=pa<<24;if($>>>0<qa>>>0){wa=0;xa=pa;ya=$}else{wa=1;xa=(c[da>>2]|0)-pa|0;ya=$-qa|0}qa=d[1280+xa>>0]|0;ra=xa<<qa;ta=va-qa|0;c[q>>2]=ya<<qa;c[ba>>2]=ta;c[da>>2]=ra;ua=a[27420+(wa+ha)>>0]|0}while(ua<<24>>24>0);wa=0-(ua&255)|0;ua=wa&255;ra=c[sa>>2]|0;sa=ra+((wa&255)<<2)|0;if(ra|0)c[sa>>2]=(c[sa>>2]|0)+1;a[u+1>>0]=ua;a[u+56>>0]=ua;a[u+32>>0]=ua;ka=ua;la=aa;ma=ba;na=da;oa=q;break}case 2:{da=f+4540|0;ba=c[da>>2]|0;aa=e+16|0;ua=e+20|0;sa=c[aa>>2]|0;ra=c[ua>>2]|0;wa=0;do{ta=wa<<24>>24;ya=d[ba+(ta>>1)>>0]|0;va=(256-ya+(S(ya,sa)|0)|0)>>>8;if((ra|0)<0){gc(q);za=c[ua>>2]|0}else za=ra;ya=c[q>>2]|0;xa=va<<24;if(ya>>>0<xa>>>0){Aa=0;Ba=va;Ca=ya}else{Aa=1;Ba=(c[aa>>2]|0)-va|0;Ca=ya-xa|0}xa=d[1280+Ba>>0]|0;sa=Ba<<xa;ra=za-xa|0;c[q>>2]=Ca<<xa;c[ua>>2]=ra;c[aa>>2]=sa;wa=a[27420+(Aa+ta)>>0]|0}while(wa<<24>>24>0);Aa=0-(wa&255)|0;wa=Aa&255;Ca=e+13548|0;za=c[Ca>>2]|0;Ba=za+((Aa&255)<<2)|0;if(!za){Da=sa;Ea=ra}else{c[Ba>>2]=(c[Ba>>2]|0)+1;Da=c[aa>>2]|0;Ea=c[ua>>2]|0}a[u+32>>0]=wa;a[u+20>>0]=wa;wa=c[da>>2]|0;Ba=Da;Da=Ea;Ea=0;do{ra=Ea<<24>>24;sa=d[wa+(ra>>1)>>0]|0;za=(256-sa+(S(sa,Ba)|0)|0)>>>8;if((Da|0)<0){gc(q);Fa=c[ua>>2]|0}else Fa=Da;sa=c[q>>2]|0;Aa=za<<24;if(sa>>>0<Aa>>>0){Ga=0;Ha=za;Ia=sa}else{Ga=1;Ha=(c[aa>>2]|0)-za|0;Ia=sa-Aa|0}Aa=d[1280+Ha>>0]|0;Ba=Ha<<Aa;Da=Fa-Aa|0;c[q>>2]=Ia<<Aa;c[ua>>2]=Da;c[aa>>2]=Ba;Ea=a[27420+(Ga+ra)>>0]|0}while(Ea<<24>>24>0);Ga=0-(Ea&255)|0;Ea=Ga&255;Ba=c[Ca>>2]|0;Ca=Ba+((Ga&255)<<2)|0;if(Ba|0)c[Ca>>2]=(c[Ca>>2]|0)+1;a[u+1>>0]=Ea;a[u+56>>0]=Ea;a[u+44>>0]=Ea;ka=Ea;la=da;ma=ua;na=aa;oa=q;break}default:{aa=d[29137+(v&255)>>0]|0;ua=f+4540|0;da=c[ua>>2]|0;Ea=e+16|0;Ca=e+20|0;Ba=c[Ea>>2]|0;Ga=c[Ca>>2]|0;Da=0;do{Ia=Da<<24>>24;Fa=d[(Ia>>1)+(da+(aa*9|0))>>0]|0;Ha=(256-Fa+(S(Fa,Ba)|0)|0)>>>8;if((Ga|0)<0){gc(q);Ja=c[Ca>>2]|0}else Ja=Ga;Fa=c[q>>2]|0;wa=Ha<<24;if(Fa>>>0<wa>>>0){Ka=0;La=Ha;Ma=Fa}else{Ka=1;La=(c[Ea>>2]|0)-Ha|0;Ma=Fa-wa|0}wa=d[1280+La>>0]|0;Ba=La<<wa;Ga=Ja-wa|0;c[q>>2]=Ma<<wa;c[Ca>>2]=Ga;c[Ea>>2]=Ba;Da=a[27420+(Ka+Ia)>>0]|0}while(Da<<24>>24>0);Ka=0-(Da&255)|0;Da=Ka&255;Ba=c[e+13548>>2]|0;Ga=Ba+(aa*40|0)+((Ka&255)<<2)|0;if(Ba|0)c[Ga>>2]=(c[Ga>>2]|0)+1;a[u+1>>0]=Da;ka=Da;la=ua;ma=Ca;na=Ea;oa=q}}Ea=c[la>>2]|0;la=ka&255;ka=c[na>>2]|0;Ca=c[ma>>2]|0;ua=0;do{Da=ua<<24>>24;Ga=d[(Da>>1)+(Ea+36+(la*9|0))>>0]|0;Ba=(256-Ga+(S(Ga,ka)|0)|0)>>>8;if((Ca|0)<0){gc(q);Na=c[ma>>2]|0}else Na=Ca;Ga=c[oa>>2]|0;Ka=Ba<<24;if(Ga>>>0<Ka>>>0){Oa=0;Pa=Ba;Qa=Ga}else{Oa=1;Pa=(c[na>>2]|0)-Ba|0;Qa=Ga-Ka|0}Ka=d[1280+Pa>>0]|0;ka=Pa<<Ka;Ca=Na-Ka|0;c[oa>>2]=Qa<<Ka;c[ma>>2]=Ca;c[na>>2]=ka;ua=a[27420+(Oa+Da)>>0]|0}while(ua<<24>>24>0);Oa=0-(ua&255)|0;ua=c[e+13548>>2]|0;ka=ua+160+(la*40|0)+((Oa&255)<<2)|0;if(ua|0)c[ka>>2]=(c[ka>>2]|0)+1;a[u+6>>0]=Oa;a[u+7>>0]=3;a[u+8>>0]=0;a[u+9>>0]=-1}else{Oa=c[f+1016>>2]|0;ka=v&255;ua=20248+(ka<<6)|0;la=a[X>>0]|0;na=u+8|0;Ca=f+4540|0;ma=c[Ca>>2]|0;Qa=e+13548|0;oa=c[Qa>>2]|0;if((a[y>>0]|0)!=0?(c[f+4492+(la<<2)>>2]&4|0)!=0:0){a[na>>0]=b[f+4428+(la<<3)+4>>1];Ra=-1;Sa=1;W=159}else W=129;b:do if((W|0)==129){la=c[f+4536>>2]|0;if((la|0)==2){Na=cf(s,r)|0;Pa=d[(c[Ca>>2]|0)+1935+Na>>0]|0;Ea=e+16|0;Da=(256-Pa+(S(c[Ea>>2]|0,Pa)|0)|0)>>>8;Pa=e+20|0;Ka=c[Pa>>2]|0;if((Ka|0)<0){gc(q);Ta=c[Pa>>2]|0}else Ta=Ka;Ka=c[q>>2]|0;Ga=Da<<24;if(Ka>>>0<Ga>>>0){Ua=0;Va=Da;Wa=Ka}else{Ua=1;Va=(c[Ea>>2]|0)-Da|0;Wa=Ka-Ga|0}Ga=d[1280+Va>>0]|0;c[q>>2]=Wa<<Ga;c[Pa>>2]=Ta-Ga;c[Ea>>2]=Va<<Ga;Ga=c[Qa>>2]|0;Ea=Ga+12528+(Na<<3)+(Ua<<2)|0;if(!Ga)Xa=Ua;else{c[Ea>>2]=(c[Ea>>2]|0)+1;Xa=Ua}}else Xa=la;switch(Xa|0){case 1:{la=f+4532|0;Ea=c[f+4356+(a[la>>0]<<2)>>2]|0;Ga=df(s,r)|0;Na=d[ma+1950+Ga>>0]|0;Pa=e+16|0;Ka=(256-Na+(S(c[Pa>>2]|0,Na)|0)|0)>>>8;Na=e+20|0;Da=c[Na>>2]|0;if((Da|0)<0){gc(q);Ya=c[Na>>2]|0}else Ya=Da;Da=c[q>>2]|0;Ba=Ka<<24;if(Da>>>0<Ba>>>0){Za=0;_a=Ka;$a=Da}else{Za=1;_a=(c[Pa>>2]|0)-Ka|0;$a=Da-Ba|0}Ba=d[1280+_a>>0]|0;c[q>>2]=$a<<Ba;c[Na>>2]=Ya-Ba;c[Pa>>2]=_a<<Ba;Ba=oa+12648+(Ga<<3)+(Za<<2)|0;if(oa|0)c[Ba>>2]=(c[Ba>>2]|0)+1;a[u+8+Ea>>0]=a[la>>0]|0;Ra=a[f+4533+Za>>0]|0;Sa=(Ea|0)==0&1;W=159;break b;break}case 0:break;default:break b}Ea=ef(r)|0;la=d[ma+1940+(Ea<<1)>>0]|0;Ba=e+16|0;Ga=(256-la+(S(c[Ba>>2]|0,la)|0)|0)>>>8;la=e+20|0;Pa=c[la>>2]|0;if((Pa|0)<0){gc(q);ab=c[la>>2]|0}else ab=Pa;Pa=c[q>>2]|0;Na=Ga<<24;if(Pa>>>0<Na>>>0){bb=0;cb=Ga;db=Pa}else{bb=1;cb=(c[Ba>>2]|0)-Ga|0;db=Pa-Na|0}Na=d[1280+cb>>0]|0;c[q>>2]=db<<Na;c[la>>2]=ab-Na;c[Ba>>2]=cb<<Na;Na=(oa|0)!=0;Pa=oa+12568+(Ea<<4)+(bb<<2)|0;if(Na)c[Pa>>2]=(c[Pa>>2]|0)+1;if(!bb)eb=1;else{Pa=ff(r)|0;Ea=d[ma+1940+(Pa<<1)+1>>0]|0;Ga=(256-Ea+(S(c[Ba>>2]|0,Ea)|0)|0)>>>8;Ea=c[la>>2]|0;if((Ea|0)<0){gc(q);fb=c[la>>2]|0}else fb=Ea;Ea=c[q>>2]|0;Da=Ga<<24;if(Ea>>>0<Da>>>0){gb=0;hb=Ga;ib=Ea}else{gb=1;hb=(c[Ba>>2]|0)-Ga|0;ib=Ea-Da|0}Da=d[1280+hb>>0]|0;c[q>>2]=ib<<Da;c[la>>2]=fb-Da;c[Ba>>2]=hb<<Da;Da=oa+12568+(Pa<<4)+8+(gb<<2)|0;if(Na)c[Da>>2]=(c[Da>>2]|0)+1;eb=gb|0?3:2}a[na>>0]=eb;Ra=-1;Sa=1;W=159}while(0);if((W|0)==159)a[u+8+Sa>>0]=Ra;Ra=(a[u+9>>0]|0)>0;Sa=Ra&1;eb=f+1032|0;na=e+13560|0;gb=e+13564|0;oa=e+13568|0;hb=c[ua>>2]|0;fb=hb+g|0;if(((fb|0)>=0?(ib=c[20248+(ka<<6)+4>>2]|0,ma=ib+h|0,(fb|0)<(c[eb>>2]|0)?(ma|0)>=(c[na>>2]|0):0):0)?(ma|0)<(c[gb>>2]|0):0)jb=c[21080+(d[(c[(c[t>>2]|0)+((S(c[oa>>2]|0,hb)|0)+ib<<2)>>2]|0)+1>>0]<<2)>>2]|0;else jb=0;ib=c[20248+(ka<<6)+8>>2]|0;hb=ib+g|0;if(((hb|0)>=0?(ma=c[20248+(ka<<6)+12>>2]|0,ka=ma+h|0,(hb|0)<(c[eb>>2]|0)?(ka|0)>=(c[na>>2]|0):0):0)?(ka|0)<(c[gb>>2]|0):0)kb=(c[21080+(d[(c[(c[t>>2]|0)+((S(c[oa>>2]|0,ib)|0)+ma<<2)>>2]|0)+1>>0]<<2)>>2]|0)+jb|0;else kb=jb;jb=c[21136+(kb<<2)>>2]|0;if((a[y>>0]|0)!=0?(c[f+4492+(a[X>>0]<<2)>>2]&8|0)!=0:0){a[u+1>>0]=12;if((v&255)<3)Ub(c[e+13708>>2]|0,5,29889,m);else W=204}else W=172;c:do if((W|0)==172){if((v&255)>2){m=jb&255;X=c[Ca>>2]|0;y=e+16|0;kb=e+20|0;ma=c[y>>2]|0;ib=c[kb>>2]|0;oa=0;do{gb=oa<<24>>24;ka=d[(gb>>1)+(X+1910+(m*3|0))>>0]|0;na=(256-ka+(S(ka,ma)|0)|0)>>>8;if((ib|0)<0){gc(q);lb=c[kb>>2]|0}else lb=ib;ka=c[q>>2]|0;eb=na<<24;if(ka>>>0<eb>>>0){mb=0;nb=na;ob=ka}else{mb=1;nb=(c[y>>2]|0)-na|0;ob=ka-eb|0}eb=d[1280+nb>>0]|0;ma=nb<<eb;ib=lb-eb|0;c[q>>2]=ob<<eb;c[kb>>2]=ib;c[y>>2]=ma;oa=a[27438+(mb+gb)>>0]|0}while(oa<<24>>24>0);ma=oa<<24>>24;y=c[Qa>>2]|0;ib=y+12384+(m<<4)+(0-ma<<2)|0;if(y|0)c[ib>>2]=(c[ib>>2]|0)+1;ib=10-ma&255;ma=u+1|0;a[ma>>0]=ib;if(ib<<24>>24==12){W=204;break}else{pb=ib;qb=ma}}else{ma=u+1|0;a[ma>>0]=10;pb=10;qb=ma}ma=n+-4|0;ib=Ra?2:1;if(!Oa){y=pb;kb=0;while(1){X=Bg(s,r,y,a[u+8+kb>>0]|0,ua,n,g,h,-1,0,7,f)|0;if((X|0)>0){fa=0;do{gb=n+(fa<<2)|0;eb=b[gb>>1]|0;ka=eb<<16>>16;if(ka&1|0)b[gb>>1]=(eb<<16>>16>0?65535:1)+ka;ka=gb+2|0;gb=b[ka>>1]|0;eb=gb<<16>>16;if(eb&1|0)b[ka>>1]=(gb<<16>>16>0?65535:1)+eb;fa=fa+1|0}while((fa|0)!=(X|0));c[o+(kb<<2)>>2]=c[ma+(X<<2)>>2]}fa=kb+1|0;if((fa|0)==(ib|0)){W=204;break c}y=a[qb>>0]|0;kb=fa}}else{rb=pb;sb=0}while(1){kb=Bg(s,r,rb,a[u+8+sb>>0]|0,ua,n,g,h,-1,0,7,f)|0;if((kb|0)>0){y=0;do{m=n+(y<<2)|0;oa=b[m>>1]|0;fa=oa<<16>>16;if(!(((oa<<16>>16>-1?fa:0-fa|0)|0)<64?(eb=b[m+2>>1]|0,gb=eb<<16>>16,((eb<<16>>16>-1?gb:0-gb|0)|0)<64):0))W=196;do if((W|0)==196){W=0;if(fa&1|0)b[m>>1]=(oa<<16>>16>0?65535:1)+fa;gb=m+2|0;eb=b[gb>>1]|0;ka=eb<<16>>16;if(!(ka&1))break;b[gb>>1]=(eb<<16>>16>0?65535:1)+ka}while(0);y=y+1|0}while((y|0)!=(kb|0));c[o+(sb<<2)>>2]=c[ma+(kb<<2)>>2]}y=sb+1|0;if((y|0)==(ib|0)){W=204;break c}rb=a[qb>>0]|0;sb=y}}while(0);do if((W|0)==204){sb=a[f+1212>>0]|0;if(sb<<24>>24==4){qb=c[e+13576>>2]|0;if(!qb)tb=3;else tb=d[qb+7>>0]|0;qb=c[e+13580>>2]|0;if(!qb)ub=3;else ub=d[qb+7>>0]|0;qb=(tb|0)==(ub|0)?tb:(tb|0)==3?ub:(ub|0)==3?tb:3;rb=c[Ca>>2]|0;pb=e+16|0;mb=e+20|0;ob=c[pb>>2]|0;lb=c[mb>>2]|0;nb=0;do{ib=nb<<24>>24;ma=d[(ib>>1)+(rb+1902+(qb<<1))>>0]|0;y=(256-ma+(S(ma,ob)|0)|0)>>>8;if((lb|0)<0){gc(q);vb=c[mb>>2]|0}else vb=lb;ma=c[q>>2]|0;X=y<<24;if(ma>>>0<X>>>0){wb=0;xb=y;yb=ma}else{wb=1;xb=(c[pb>>2]|0)-y|0;yb=ma-X|0}X=d[1280+xb>>0]|0;ob=xb<<X;lb=vb-X|0;c[q>>2]=yb<<X;c[mb>>2]=lb;c[pb>>2]=ob;nb=a[27450+(wb+ib)>>0]|0}while(nb<<24>>24>0);ob=0-(nb<<24>>24)|0;pb=ob&255;lb=c[Qa>>2]|0;mb=lb+12336+(qb*12|0)+((ob&255)<<2)|0;if(!lb)zb=pb;else{c[mb>>2]=(c[mb>>2]|0)+1;zb=pb}}else zb=sb;a[u+7>>0]=zb;if((v&255)>=3){pb=(Cg(s,r,a[u+1>>0]|0,u+12|0,o,o,Sa,Oa,q)|0)==0&1;mb=e+13704|0;c[mb>>2]=pb|c[mb>>2];break}mb=a[e+13544>>0]|0;pb=1<<(mb&255);lb=a[e+13545>>0]|0;ob=1<<(lb&255);c[p+4>>2]=-2147450880;rb=jb&255;ib=e+16|0;X=e+20|0;ma=n+4|0;y=lb<<24>>24==1;lb=mb<<24>>24==1;mb=e+13704|0;m=Ra?2:1;fa=0;do{oa=fa<<1;ka=0;do{eb=c[Ca>>2]|0;gb=c[ib>>2]|0;na=c[X>>2]|0;hb=0;do{fb=hb<<24>>24;bb=d[(fb>>1)+(eb+1910+(rb*3|0))>>0]|0;cb=(256-bb+(S(bb,gb)|0)|0)>>>8;if((na|0)<0){gc(q);Ab=c[X>>2]|0}else Ab=na;bb=c[q>>2]|0;ab=cb<<24;if(bb>>>0<ab>>>0){Bb=0;Cb=cb;Db=bb}else{Bb=1;Cb=(c[ib>>2]|0)-cb|0;Db=bb-ab|0}ab=d[1280+Cb>>0]|0;gb=Cb<<ab;na=Ab-ab|0;c[q>>2]=Db<<ab;c[X>>2]=na;c[ib>>2]=gb;hb=a[27438+(Bb+fb)>>0]|0}while(hb<<24>>24>0);gb=ka+oa|0;na=hb<<24>>24;eb=c[Qa>>2]|0;fb=eb+12384+(rb<<4)+(0-na<<2)|0;if(eb|0)c[fb>>2]=(c[fb>>2]|0)+1;Eb=10-na&255;d:do if((Eb&-2)<<24>>24==10){na=Eb<<24>>24==10;switch(gb|0){case 0:{fb=0;do{c[p+(fb<<2)>>2]=c[n+((Bg(s,r,Eb,a[(c[c[t>>2]>>2]|0)+8+fb>>0]|0,ua,n,g,h,0,1,0,0)|0)+-1<<2)>>2];fb=fb+1|0}while((fb|0)!=(m|0));break}case 3:{if(na){fb=0;while(1){eb=c[c[t>>2]>>2]|0;Bg(s,r,10,a[eb+8+fb>>0]|0,ua,n,g,h,3,1,0,0)|0;c[p+(fb<<2)>>2]=c[eb+48+(fb<<2)>>2];fb=fb+1|0;if((fb|0)==(m|0))break d}}else Fb=0;do{fb=c[c[t>>2]>>2]|0;Bg(s,r,Eb,a[fb+8+Fb>>0]|0,ua,n,g,h,3,1,0,0)|0;eb=c[fb+36+(Fb<<2)>>2]|0;ab=c[fb+24+(Fb<<2)>>2]|0;bb=c[n>>2]|0;cb=c[ma>>2]|0;db=p+(Fb<<2)|0;c[db>>2]=0;do if((c[fb+48+(Fb<<2)>>2]|0)==(eb|0)){if((eb|0)!=(ab|0)){Gb=ab;W=245;break}if((eb|0)!=(bb|0)){Gb=bb;W=245;break}if((eb|0)!=(cb|0)){Gb=cb;W=245}}else{Gb=eb;W=245}while(0);if((W|0)==245){W=0;c[db>>2]=Gb}Fb=Fb+1|0}while((Fb|0)!=(m|0));break}default:{if((gb+-1|0)>>>0<2)Hb=0;else{eb=0;while(1){Bg(s,r,Eb,a[(c[c[t>>2]>>2]|0)+8+eb>>0]|0,ua,n,g,h,gb,1,0,0)|0;eb=eb+1|0;if((eb|0)==(m|0))break d}}do{eb=c[c[t>>2]>>2]|0;cb=Bg(s,r,Eb,a[eb+8+Hb>>0]|0,ua,n,g,h,gb,1,0,0)|0;bb=p+(Hb<<2)|0;e:do if(na)c[bb>>2]=c[eb+24+(Hb<<2)>>2];else{c[bb>>2]=0;if((cb|0)<=0)break;ab=c[eb+24+(Hb<<2)>>2]|0;fb=0;while(1){Ib=c[n+(fb<<2)>>2]|0;fb=fb+1|0;if((ab|0)!=(Ib|0))break;if((fb|0)>=(cb|0))break e}c[bb>>2]=Ib}while(0);Hb=Hb+1|0}while((Hb|0)!=(m|0))}}}while(0);hb=u+20+(gb*12|0)|0;if(!(Cg(s,r,Eb,u+20+(gb*12|0)+4|0,o,p,Sa,Oa,q)|0)){W=250;break}if(y){na=u+20+((gb+2|0)*12|0)|0;c[na>>2]=c[hb>>2];c[na+4>>2]=c[hb+4>>2];c[na+8>>2]=c[hb+8>>2]}if(lb){na=u+20+((gb+1|0)*12|0)|0;c[na>>2]=c[hb>>2];c[na+4>>2]=c[hb+4>>2];c[na+8>>2]=c[hb+8>>2]}ka=ka+pb|0}while((ka|0)<2);if((W|0)==250){W=0;c[mb>>2]=c[mb>>2]|1}fa=fa+ob|0}while((fa|0)<2);a[u+1>>0]=Eb;fa=u+60|0;ob=c[fa+4>>2]|0;mb=u+12|0;c[mb>>2]=c[fa>>2];c[mb+4>>2]=ob}while(0)}if((j|0)<=0){l=k;return}Eb=u+8|0;W=u+12|0;if((i|0)>0){Jb=z;Kb=0}else{l=k;return}while(1){z=0;do{Oa=Jb+(z*12|0)+8|0;Sa=d[Eb>>0]|d[Eb+1>>0]<<8;a[Oa>>0]=Sa;a[Oa+1>>0]=Sa>>8;Sa=W;Oa=c[Sa+4>>2]|0;p=Jb+(z*12|0)|0;c[p>>2]=c[Sa>>2];c[p+4>>2]=Oa;z=z+1|0}while((z|0)!=(i|0));Kb=Kb+1|0;if((Kb|0)==(j|0))break;else Jb=Jb+((c[w>>2]|0)*12|0)|0}l=k;return}Jb=c[e+13580>>2]|0;Kb=c[e+13576>>2]|0;W=a[u>>0]|0;Eb=(S(x,g)|0)+h|0;f:do if(a[f+4412>>0]|0){if(!(a[f+4413>>0]|0)){h=c[f+1200>>2]|0;g=c[f+1204>>2]|0;if(!((i|0)>0&(j|0)>0)){Lb=0;break}if(!h){x=0;while(1){z=0;do{a[g+(z+Eb+(S(c[w>>2]|0,x)|0))>>0]=0;z=z+1|0}while((z|0)!=(i|0));x=x+1|0;if((x|0)==(j|0)){Lb=0;break f}}}else{x=0;while(1){z=0;do{Oa=z+Eb+(S(c[w>>2]|0,x)|0)|0;a[g+Oa>>0]=a[h+Oa>>0]|0;z=z+1|0}while((z|0)!=(i|0));x=x+1|0;if((x|0)==(j|0)){Lb=0;break f}}}}x=e+16|0;h=e+20|0;g=c[x>>2]|0;z=c[h>>2]|0;Oa=0;do{p=Oa<<24>>24;Sa=d[(p>>1)+(f+4417)>>0]|0;o=(256-Sa+(S(Sa,g)|0)|0)>>>8;if((z|0)<0){gc(q);Mb=c[h>>2]|0}else Mb=z;Sa=c[q>>2]|0;Hb=o<<24;if(Sa>>>0<Hb>>>0){Nb=0;Ob=o;Pb=Sa}else{Nb=1;Ob=(c[x>>2]|0)-o|0;Pb=Sa-Hb|0}Hb=d[1280+Ob>>0]|0;g=Ob<<Hb;z=Mb-Hb|0;c[q>>2]=Pb<<Hb;c[h>>2]=z;c[x>>2]=g;Oa=a[28812+(Nb+p)>>0]|0}while(Oa<<24>>24>0);g=0-(Oa<<24>>24)|0;if((j|0)>0?(x=g&255,z=f+1204|0,(i|0)>0):0){h=0;do{p=0;do{a[(c[z>>2]|0)+(p+Eb+(S(c[w>>2]|0,h)|0))>>0]=x;p=p+1|0}while((p|0)!=(i|0));h=h+1|0}while((h|0)!=(j|0));Lb=g}else Lb=g}else Lb=0;while(0);a[u+4>>0]=Lb;a[u+3>>0]=yg(s,r,Lb<<24>>24,q)|0;a[u+2>>0]=zg(s,r,1,q)|0;a[u+8>>0]=0;a[u+9>>0]=-1;switch(W<<24>>24){case 0:{W=e+16|0;r=e+20|0;s=0;do{Lb=Ge(u,Jb,s)|0;j=Lb&255;Lb=(Fe(u,Kb,s)|0)&255;Qb=c[W>>2]|0;Rb=c[r>>2]|0;i=0;do{w=i<<24>>24;Eb=d[(w>>1)+(26382+(j*90|0)+(Lb*9|0))>>0]|0;f=(256-Eb+(S(Eb,Qb)|0)|0)>>>8;if((Rb|0)<0){gc(q);Sb=c[r>>2]|0}else Sb=Rb;Eb=c[q>>2]|0;Nb=f<<24;if(Eb>>>0<Nb>>>0){Tb=0;Vb=f;Wb=Eb}else{Tb=1;Vb=(c[W>>2]|0)-f|0;Wb=Eb-Nb|0}Nb=d[1280+Vb>>0]|0;Qb=Vb<<Nb;Xb=Wb<<Nb;Rb=Sb-Nb|0;c[q>>2]=Xb;c[r>>2]=Rb;c[W>>2]=Qb;i=a[27420+(Tb+w)>>0]|0}while(i<<24>>24>0);a[u+20+(s*12|0)>>0]=0-(i&255);s=s+1|0}while((s|0)!=4);s=a[u+56>>0]|0;a[u+1>>0]=s;Yb=Qb;Zb=Rb;_b=Xb;$b=s;ac=r;bc=W;cc=q;break}case 1:{W=Ge(u,Jb,0)|0;r=W&255;W=(Fe(u,Kb,0)|0)&255;s=e+16|0;Xb=e+20|0;Rb=c[s>>2]|0;Qb=c[Xb>>2]|0;Tb=0;do{Sb=Tb<<24>>24;Wb=d[(Sb>>1)+(26382+(r*90|0)+(W*9|0))>>0]|0;Vb=(256-Wb+(S(Wb,Rb)|0)|0)>>>8;if((Qb|0)<0){gc(q);dc=c[Xb>>2]|0}else dc=Qb;Wb=c[q>>2]|0;Lb=Vb<<24;if(Wb>>>0<Lb>>>0){ec=0;fc=Vb;hc=Wb}else{ec=1;fc=(c[s>>2]|0)-Vb|0;hc=Wb-Lb|0}Lb=d[1280+fc>>0]|0;Rb=fc<<Lb;Qb=dc-Lb|0;c[q>>2]=hc<<Lb;c[Xb>>2]=Qb;c[s>>2]=Rb;Tb=a[27420+(ec+Sb)>>0]|0}while(Tb<<24>>24>0);ec=0-(Tb&255)&255;a[u+44>>0]=ec;a[u+20>>0]=ec;ec=Ge(u,Jb,1)|0;Tb=ec&255;ec=(Fe(u,Kb,1)|0)&255;Rb=c[s>>2]|0;Qb=c[Xb>>2]|0;hc=0;do{dc=hc<<24>>24;fc=d[(dc>>1)+(26382+(Tb*90|0)+(ec*9|0))>>0]|0;W=(256-fc+(S(fc,Rb)|0)|0)>>>8;if((Qb|0)<0){gc(q);ic=c[Xb>>2]|0}else ic=Qb;fc=c[q>>2]|0;r=W<<24;if(fc>>>0<r>>>0){jc=0;kc=W;lc=fc}else{jc=1;kc=(c[s>>2]|0)-W|0;lc=fc-r|0}r=d[1280+kc>>0]|0;Rb=kc<<r;mc=lc<<r;Qb=ic-r|0;c[q>>2]=mc;c[Xb>>2]=Qb;c[s>>2]=Rb;hc=a[27420+(jc+dc)>>0]|0}while(hc<<24>>24>0);jc=0-(hc&255)&255;a[u+1>>0]=jc;a[u+56>>0]=jc;a[u+32>>0]=jc;Yb=Rb;Zb=Qb;_b=mc;$b=jc;ac=Xb;bc=s;cc=q;break}case 2:{s=Ge(u,Jb,0)|0;Xb=s&255;s=(Fe(u,Kb,0)|0)&255;jc=e+16|0;mc=e+20|0;Qb=c[jc>>2]|0;Rb=c[mc>>2]|0;hc=0;do{ic=hc<<24>>24;lc=d[(ic>>1)+(26382+(Xb*90|0)+(s*9|0))>>0]|0;kc=(256-lc+(S(lc,Qb)|0)|0)>>>8;if((Rb|0)<0){gc(q);nc=c[mc>>2]|0}else nc=Rb;lc=c[q>>2]|0;ec=kc<<24;if(lc>>>0<ec>>>0){oc=0;pc=kc;qc=lc}else{oc=1;pc=(c[jc>>2]|0)-kc|0;qc=lc-ec|0}ec=d[1280+pc>>0]|0;Qb=pc<<ec;Rb=nc-ec|0;c[q>>2]=qc<<ec;c[mc>>2]=Rb;c[jc>>2]=Qb;hc=a[27420+(oc+ic)>>0]|0}while(hc<<24>>24>0);oc=0-(hc&255)&255;a[u+32>>0]=oc;a[u+20>>0]=oc;oc=Ge(u,Jb,2)|0;hc=oc&255;oc=(Fe(u,Kb,2)|0)&255;Qb=c[jc>>2]|0;Rb=c[mc>>2]|0;qc=0;do{nc=qc<<24>>24;pc=d[(nc>>1)+(26382+(hc*90|0)+(oc*9|0))>>0]|0;s=(256-pc+(S(pc,Qb)|0)|0)>>>8;if((Rb|0)<0){gc(q);rc=c[mc>>2]|0}else rc=Rb;pc=c[q>>2]|0;Xb=s<<24;if(pc>>>0<Xb>>>0){sc=0;tc=s;uc=pc}else{sc=1;tc=(c[jc>>2]|0)-s|0;uc=pc-Xb|0}Xb=d[1280+tc>>0]|0;Qb=tc<<Xb;vc=uc<<Xb;Rb=rc-Xb|0;c[q>>2]=vc;c[mc>>2]=Rb;c[jc>>2]=Qb;qc=a[27420+(sc+nc)>>0]|0}while(qc<<24>>24>0);sc=0-(qc&255)&255;a[u+1>>0]=sc;a[u+56>>0]=sc;a[u+44>>0]=sc;Yb=Qb;Zb=Rb;_b=vc;$b=sc;ac=mc;bc=jc;cc=q;break}default:{jc=Ge(u,Jb,0)|0;Jb=jc&255;jc=(Fe(u,Kb,0)|0)&255;Kb=e+16|0;mc=e+20|0;e=c[Kb>>2]|0;sc=c[mc>>2]|0;vc=0;do{Rb=vc<<24>>24;Qb=d[(Rb>>1)+(26382+(Jb*90|0)+(jc*9|0))>>0]|0;qc=(256-Qb+(S(Qb,e)|0)|0)>>>8;if((sc|0)<0){gc(q);wc=c[mc>>2]|0}else wc=sc;Qb=c[q>>2]|0;rc=qc<<24;if(Qb>>>0<rc>>>0){xc=0;yc=qc;zc=Qb}else{xc=1;yc=(c[Kb>>2]|0)-qc|0;zc=Qb-rc|0}rc=d[1280+yc>>0]|0;e=yc<<rc;Ac=zc<<rc;sc=wc-rc|0;c[q>>2]=Ac;c[mc>>2]=sc;c[Kb>>2]=e;vc=a[27420+(xc+Rb)>>0]|0}while(vc<<24>>24>0);xc=0-(vc&255)&255;a[u+1>>0]=xc;Yb=e;Zb=sc;_b=Ac;$b=xc;ac=mc;bc=Kb;cc=q}}Kb=$b&255;$b=_b;_b=Yb;Yb=Zb;Zb=0;do{mc=Zb<<24>>24;xc=d[(mc>>1)+(27282+(Kb*9|0))>>0]|0;Ac=(256-xc+(S(xc,_b)|0)|0)>>>8;if((Yb|0)<0){gc(q);Bc=c[cc>>2]|0;Cc=c[ac>>2]|0}else{Bc=$b;Cc=Yb}xc=Ac<<24;if(Bc>>>0<xc>>>0){Dc=0;Ec=Ac;Fc=Bc}else{Dc=1;Ec=(c[bc>>2]|0)-Ac|0;Fc=Bc-xc|0}xc=d[1280+Ec>>0]|0;_b=Ec<<xc;$b=Fc<<xc;Yb=Cc-xc|0;c[cc>>2]=$b;c[ac>>2]=Yb;c[bc>>2]=_b;Zb=a[27420+(Dc+mc)>>0]|0}while(Zb<<24>>24>0);a[u+6>>0]=0-(Zb&255);l=k;return}function yg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(a[b+3980>>0]|0?c[b+4060+(f<<2)>>2]&8|0:0){h=1;return h|0}f=c[e+296>>2]|0;i=c[e+300>>2]|0;if(!i)j=0;else j=a[i+3>>0]|0;if(!f)k=0;else k=a[f+3>>0]|0;f=k+j|0;j=d[(c[b+4108>>2]|0)+1967+f>>0]|0;b=g+4|0;k=(256-j+(S(c[b>>2]|0,j)|0)|0)>>>8;j=g+8|0;i=c[j>>2]|0;if((i|0)<0){gc(g);l=c[j>>2]|0}else l=i;i=c[g>>2]|0;m=k<<24;if(i>>>0<m>>>0){n=0;o=k;p=i}else{n=1;o=(c[b>>2]|0)-k|0;p=i-m|0}m=d[1280+o>>0]|0;c[g>>2]=p<<m;c[j>>2]=l-m;c[b>>2]=o<<m;m=c[e+268>>2]|0;e=m+12776+(f<<3)+(n<<2)|0;if(!m){h=n;return h|0}c[e>>2]=(c[e>>2]|0)+1;h=n;return h|0}function zg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=c[b+616>>2]|0;i=a[c[c[e+292>>2]>>2]>>0]|0;j=a[29137+(i&255)>>0]|0;if(!((f|0)!=0&(h|0)==4&(i&255)>2)){i=a[29150+h>>0]|0;k=(j&255)<(i&255)?j:i;return k|0}i=c[e+268>>2]|0;h=c[e+296>>2]|0;f=c[e+300>>2]|0;e=j&255;l=(f|0)!=0;m=(h|0)!=0;if(l?(a[f+3>>0]|0)==0:0)n=d[f+2>>0]|0;else n=e;if(m?(a[h+3>>0]|0)==0:0)o=d[h+2>>0]|0;else o=e;h=m?o:n;o=((l?n:h)+h|0)>>>0>e>>>0&1;e=c[b+4108>>2]|0;switch(j<<24>>24){case 1:{p=e+1965+o|0;break}case 2:{p=e+1961+(o<<1)|0;break}case 3:{p=e+1955+(o*3|0)|0;break}default:p=0}e=d[p>>0]|0;b=g+4|0;h=(256-e+(S(c[b>>2]|0,e)|0)|0)>>>8;e=g+8|0;n=c[e>>2]|0;if((n|0)<0){gc(g);q=c[e>>2]|0}else q=n;n=c[g>>2]|0;l=h<<24;if(n>>>0<l>>>0){r=0;s=h;t=n}else{r=1;s=(c[b>>2]|0)-h|0;t=n-l|0}l=d[1280+s>>0]|0;n=s<<l;s=t<<l;t=q-l|0;c[g>>2]=s;c[e>>2]=t;c[b>>2]=n;if((j&255)>1&(r|0)!=0){l=d[p+1>>0]|0;q=(256-l+(S(l,n)|0)|0)>>>8;if((t|0)<0){gc(g);u=c[g>>2]|0;v=c[e>>2]|0}else{u=s;v=t}t=q<<24;if(u>>>0<t>>>0){w=0;x=q;y=u}else{w=1;x=(c[b>>2]|0)-q|0;y=u-t|0}t=d[1280+x>>0]|0;u=x<<t;x=y<<t;y=v-t|0;c[g>>2]=x;c[e>>2]=y;c[b>>2]=u;t=w+r|0;if((j&255)>2&(t|0)!=1){w=d[p+2>>0]|0;p=(256-w+(S(w,u)|0)|0)>>>8;if((y|0)<0){gc(g);z=c[g>>2]|0;A=c[e>>2]|0}else{z=x;A=y}y=p<<24;if(z>>>0<y>>>0){B=0;C=p;D=z}else{B=1;C=(c[b>>2]|0)-p|0;D=z-y|0}y=d[1280+C>>0]|0;c[g>>2]=D<<y;c[e>>2]=A-y;c[b>>2]=C<<y;E=B+t|0}else E=t}else E=r;if(i|0){switch(j<<24>>24){case 1:{F=i+12744+(o<<3)|0;break}case 2:{F=i+12720+(o*12|0)|0;break}case 3:{F=i+12688+(o<<4)|0;break}default:F=0}o=F+(E<<2)|0;c[o>>2]=(c[o>>2]|0)+1}k=E&255;return k|0}function Ag(a,b){a=a|0;b=b|0;Yg(c[a+17872>>2]|0,c[a+724>>2]|0,b<<3);return}function Bg(e,f,g,h,i,j,k,l,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;if(!(c[e+748>>2]|0))q=0;else q=(c[(c[e+292>>2]|0)+4>>2]|0)+((S(c[e+608>>2]|0,k)|0)*12|0)+(l*12|0)|0;r=g<<24>>24!=11;s=j;c[s>>2]=0;c[s+4>>2]=0;a:do if(n){s=e+600|0;t=f+280|0;u=f+284|0;v=f+292|0;w=f+288|0;x=(m|0)>-1;y=c[i>>2]|0;z=y+k|0;A=(z|0)<0;do if(x){do if((!A?(B=c[i+4>>2]|0,C=B+l|0,(z|0)<(c[s>>2]|0)?(C|0)>=(c[t>>2]|0):0):0)?(C|0)<(c[u>>2]|0):0){C=c[(c[v>>2]|0)+((S(c[w>>2]|0,y)|0)+B<<2)>>2]|0;if((a[C+8>>0]|0)==h<<24>>24){if((d[C>>0]|0)<3)D=C+20+((c[21212+(m<<3)+(((B|0)==0&1)<<2)>>2]|0)*12|0)+4|0;else D=C+12|0;E=c[D>>2]|0;c[j>>2]=E;if(r){F=1;break a}else{G=E;H=1;I=1;break}}if((a[C+9>>0]|0)==h<<24>>24){if((d[C>>0]|0)<3)J=C+20+((c[21212+(m<<3)+(((B|0)==0&1)<<2)>>2]|0)*12|0)+8|0;else J=C+16|0;C=c[J>>2]|0;c[j>>2]=C;if(r){F=1;break a}else{G=C;H=1;I=1}}else{G=0;H=1;I=0}}else{G=0;H=0;I=0}while(0);C=c[i+8>>2]|0;B=C+k|0;if((B|0)<0){K=G;L=H;M=2;N=I;O=22;break a}E=i+12|0;P=c[E>>2]|0;Q=P+l|0;if(!((B|0)<(c[s>>2]|0)?(Q|0)>=(c[t>>2]|0):0)){K=G;L=H;M=2;N=I;O=22;break a}if((Q|0)>=(c[u>>2]|0)){K=G;L=H;M=2;N=I;O=22;break a}Q=c[(c[v>>2]|0)+((S(c[w>>2]|0,C)|0)+P<<2)>>2]|0;if((a[Q+8>>0]|0)==h<<24>>24){C=(d[Q>>0]|0)<3;if(!I){if(C)R=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+4|0;else R=Q+12|0;B=c[R>>2]|0;c[j>>2]=B;if(r){F=1;break a}else{T=B;O=20;break}}else{if(C)U=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+4|0;else U=Q+12|0;if((c[U>>2]|0)==(G|0)){K=G;L=1;M=2;N=1;O=22;break a}else{V=E;W=Q;O=39;break}}}if((a[Q+9>>0]|0)!=h<<24>>24){K=G;L=1;M=2;N=I;O=22;break a}C=(d[Q>>0]|0)<3;if(!I){if(C)X=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+8|0;else X=Q+16|0;B=c[X>>2]|0;c[j>>2]=B;if(r){F=1;break a}else{T=B;O=20;break}}else{if(C)Y=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+8|0;else Y=Q+16|0;if((c[Y>>2]|0)==(G|0)){K=G;L=1;M=2;N=1;O=22;break a}else{Z=E;_=Q;O=46;break}}}else{do if((!A?(Q=c[i+4>>2]|0,E=Q+l|0,(z|0)<(c[s>>2]|0)?(E|0)>=(c[t>>2]|0):0):0)?(E|0)<(c[u>>2]|0):0){E=c[(c[v>>2]|0)+((S(c[w>>2]|0,y)|0)+Q<<2)>>2]|0;if((a[E+8>>0]|0)==h<<24>>24){Q=c[E+12>>2]|0;c[j>>2]=Q;if(r){F=1;break a}else{$=Q;aa=1;ba=1;break}}if((a[E+9>>0]|0)==h<<24>>24){Q=c[E+16>>2]|0;c[j>>2]=Q;if(r){F=1;break a}else{$=Q;aa=1;ba=1}}else{$=0;aa=1;ba=0}}else{$=0;aa=0;ba=0}while(0);Q=c[i+8>>2]|0;E=Q+k|0;if((E|0)<0){K=$;L=aa;M=2;N=ba;O=22;break a}P=i+12|0;C=c[P>>2]|0;B=C+l|0;if(!((E|0)<(c[s>>2]|0)?(B|0)>=(c[t>>2]|0):0)){K=$;L=aa;M=2;N=ba;O=22;break a}if((B|0)>=(c[u>>2]|0)){K=$;L=aa;M=2;N=ba;O=22;break a}B=c[(c[v>>2]|0)+((S(c[w>>2]|0,Q)|0)+C<<2)>>2]|0;if((a[B+8>>0]|0)==h<<24>>24){C=c[B+12>>2]|0;if(!ba){c[j>>2]=C;if(r){F=1;break a}else{T=C;O=20;break}}if((C|0)==($|0)){K=$;L=1;M=2;N=1;O=22;break a}if(x){V=P;W=B;O=39;break}else{ca=B;O=41;break}}if((a[B+9>>0]|0)!=h<<24>>24){K=$;L=1;M=2;N=ba;O=22;break a}C=c[B+16>>2]|0;if(!ba){c[j>>2]=C;if(r){F=1;break a}else{T=C;O=20;break}}if((C|0)==($|0)){K=$;L=1;M=2;N=1;O=22;break a}if(x){Z=P;_=B;O=46}else{da=B;O=48}}while(0);if((O|0)==20){ea=T;fa=1;ga=2;ha=f+292|0;ia=f+284|0;ja=f+280|0;ka=e+600|0;la=f+288|0;ma=1;O=21;break}else if((O|0)==39)if((d[W>>0]|0)<3){na=W+20+((c[21212+(m<<3)+(((c[V>>2]|0)==0&1)<<2)>>2]|0)*12|0)+4|0;O=42}else{ca=W;O=41}else if((O|0)==46)if((d[_>>0]|0)<3){oa=_+20+((c[21212+(m<<3)+(((c[Z>>2]|0)==0&1)<<2)>>2]|0)*12|0)+8|0;O=49}else{da=_;O=48}if((O|0)==41){na=ca+12|0;O=42}else if((O|0)==48){oa=da+16|0;O=49}if((O|0)==42){c[j+4>>2]=c[na>>2];F=2;break}else if((O|0)==49){c[j+4>>2]=c[oa>>2];F=2;break}}else{K=0;L=0;M=0;N=0;O=22}while(0);b:do if((O|0)==22){oa=e+600|0;na=f+280|0;da=f+284|0;ca=f+292|0;_=f+288|0;if(r){Z=(N|0)==0;m=(N|0)==0;W=K;V=L;T=M;c:while(1){$=c[i+(T<<3)>>2]|0;ba=$+k|0;do if(((ba|0)>=0?(aa=c[i+(T<<3)+4>>2]|0,G=aa+l|0,(ba|0)<(c[oa>>2]|0)?(G|0)>=(c[na>>2]|0):0):0)?(G|0)<(c[da>>2]|0):0){G=c[(c[ca>>2]|0)+((S(c[_>>2]|0,$)|0)+aa<<2)>>2]|0;if((a[G+8>>0]|0)==h<<24>>24){aa=G+12|0;if(Z){pa=aa;break c}Y=c[aa>>2]|0;if((Y|0)==(K|0)){qa=K;ra=1;break}else{sa=Y;ta=N;O=58;break b}}if((a[G+9>>0]|0)==h<<24>>24){Y=G+16|0;if(m){pa=Y;break c}G=c[Y>>2]|0;if((G|0)!=(W|0)){ua=G;va=N;O=63;break b}else{qa=W;ra=1}}else{qa=W;ra=1}}else{qa=W;ra=V}while(0);T=T+1|0;if((T|0)>=8){wa=ra;xa=N;O=66;break b}else{W=qa;V=ra}}c[j+(N<<2)>>2]=c[pa>>2];F=1}else{ea=K;fa=L;ga=M;ha=ca;ia=da;ja=na;ka=oa;la=_;ma=N;O=21}}while(0);d:do if((O|0)==21){N=ea;M=ea;L=fa;K=ga;pa=ma;while(1){ra=c[i+(K<<3)>>2]|0;qa=ra+k|0;do if(((qa|0)>=0?(V=c[i+(K<<3)+4>>2]|0,W=V+l|0,(qa|0)<(c[ka>>2]|0)?(W|0)>=(c[ja>>2]|0):0):0)?(W|0)<(c[ia>>2]|0):0){W=c[(c[ha>>2]|0)+((S(c[la>>2]|0,ra)|0)+V<<2)>>2]|0;if((a[W+8>>0]|0)==h<<24>>24){V=c[W+12>>2]|0;if(pa)if((V|0)==(N|0)){ya=M;za=N;Aa=1;Ba=pa;break}else{sa=V;ta=pa;O=58;break d}else{c[j>>2]=V;ya=V;za=V;Aa=1;Ba=1;break}}if((a[W+9>>0]|0)==h<<24>>24){V=c[W+16>>2]|0;if(pa)if((V|0)==(M|0)){ya=M;za=M;Aa=1;Ba=pa;break}else{ua=V;va=pa;O=63;break d}else{c[j>>2]=V;ya=V;za=V;Aa=1;Ba=1;break}}else{ya=M;za=N;Aa=1;Ba=pa}}else{ya=M;za=N;Aa=L;Ba=pa}while(0);K=K+1|0;if((K|0)>=8){wa=Aa;xa=Ba;O=66;break}else{N=za;M=ya;L=Aa;pa=Ba}}}while(0);e:do if((O|0)==58){c[j+(ta<<2)>>2]=sa;Ca=ta;O=110}else if((O|0)==63){c[j+(va<<2)>>2]=ua;Ca=va;O=110}else if((O|0)==66){Ba=(q|0)!=0;do if(Ba){if((o|0)!=0&(c[e+4096>>2]|0)!=0)Ab[o&7](p,k);if((a[q+8>>0]|0)==h<<24>>24){if(!xa){c[j>>2]=c[q>>2];if(r){F=1;break e}else{Da=1;break}}Aa=c[q>>2]|0;if((Aa|0)==(c[j>>2]|0)){Da=xa;break}c[j+(xa<<2)>>2]=Aa;Ca=xa;O=110;break e}if((a[q+9>>0]|0)==h<<24>>24){Aa=q+4|0;if(!xa){c[j>>2]=c[Aa>>2];if(r){F=1;break e}else{Da=1;break}}ya=c[Aa>>2]|0;if((ya|0)!=(c[j>>2]|0)){c[j+(xa<<2)>>2]=ya;Ca=xa;O=110;break e}else Da=xa}else Da=xa}else Da=xa;while(0);f:do if(wa){ya=e+600|0;Aa=f+280|0;za=f+284|0;la=f+292|0;ha=f+288|0;ia=e+3924+(h<<24>>24<<2)|0;ja=0;ka=Da;g:while(1){ma=c[i+(ja<<3)>>2]|0;ga=ma+k|0;do if((((ga|0)>=0?(fa=c[i+(ja<<3)+4>>2]|0,ea=fa+l|0,(ga|0)<(c[ya>>2]|0)?(ea|0)>=(c[Aa>>2]|0):0):0)?(ea|0)<(c[za>>2]|0):0)?(ea=c[(c[la>>2]|0)+((S(c[ha>>2]|0,ma)|0)+fa<<2)>>2]|0,fa=a[ea+8>>0]|0,fa<<24>>24>0):0){do if(fa<<24>>24!=h<<24>>24){pa=ea+12|0;L=b[pa>>1]|0;M=b[pa+2>>1]|0;pa=(c[e+3924+(fa<<24>>24<<2)>>2]|0)==(c[ia>>2]|0);Ea=((pa?M:0-(M&65535)&65535)&65535)<<16|(pa?L:0-(L&65535)&65535)&65535;if(!ka){c[j>>2]=Ea;if(r){F=1;break e}else{Fa=1;break}}else if((Ea|0)==(c[j>>2]|0)){Fa=ka;break}else{O=88;break g}}else Fa=ka;while(0);fa=a[ea+9>>0]|0;if(!(fa<<24>>24<1?1:fa<<24>>24==h<<24>>24)?(L=c[ea+16>>2]|0,(L|0)!=(c[ea+12>>2]|0)):0){pa=b[ea+16+2>>1]|0;M=(c[e+3924+(fa<<24>>24<<2)>>2]|0)==(c[ia>>2]|0);Ga=((M?pa:0-(pa&65535)&65535)&65535)<<16|(M?L:0-L|0)&65535;if(!Fa){c[j>>2]=Ga;if(r){F=1;break e}else{Ha=1;break}}else if((Ga|0)==(c[j>>2]|0)){Ha=Fa;break}else{O=94;break g}}else Ha=Fa}else Ha=ka;while(0);ja=ja+1|0;if((ja|0)>=8){Ia=Ha;break f}else ka=Ha}if((O|0)==88){c[j+(ka<<2)>>2]=Ea;Ca=ka;O=110;break e}else if((O|0)==94){c[j+(Fa<<2)>>2]=Ga;Ca=Fa;O=110;break e}}else Ia=Da;while(0);do if(Ba){ja=a[q+8>>0]|0;ia=h<<24>>24;do if(ja<<24>>24>0?ja<<24>>24!=h<<24>>24:0){ha=b[q>>1]|0;la=b[q+2>>1]|0;za=(c[e+3924+(ja<<24>>24<<2)>>2]|0)==(c[e+3924+(ia<<2)>>2]|0);Aa=za?la:0-(la&65535)&65535;la=za?ha:0-(ha&65535)&65535;if(!Ia){b[j>>1]=la;b[j+2>>1]=Aa;if(r){F=1;break e}else{Ja=1;break}}if(((Aa&65535)<<16|la&65535|0)!=(c[j>>2]|0)){ha=j+(Ia<<2)|0;b[ha>>1]=la;b[ha+2>>1]=Aa;Ca=Ia;O=110;break e}else Ja=Ia}else Ja=Ia;while(0);ja=a[q+9>>0]|0;ka=ja<<24>>24;if(!(ja<<24>>24<1?1:ja<<24>>24==h<<24>>24)?(ja=q+4|0,Aa=c[ja>>2]|0,(Aa|0)!=(c[q>>2]|0)):0){ha=b[ja+2>>1]|0;ja=(c[e+3924+(ka<<2)>>2]|0)==(c[e+3924+(ia<<2)>>2]|0);ka=ja?ha:0-(ha&65535)&65535;ha=ja?Aa:0-Aa|0;Aa=ha&65535;if(!Ja){b[j>>1]=Aa;b[j+2>>1]=ka;if(r){F=1;break e}else break}if(((ka&65535)<<16|ha&65535|0)!=(c[j>>2]|0)){ha=j+(Ja<<2)|0;b[ha>>1]=Aa;b[ha+2>>1]=ka;Ca=Ja;O=110;break e}}}while(0);F=g<<24>>24==11?2:1}while(0);if((O|0)==110){O=Ca+1|0;if((Ca|0)>-1)F=O;else{Ka=O;return Ka|0}}O=(c[f+316>>2]|0)+-128|0;Ca=(c[f+320>>2]|0)+128|0;g=(c[f+324>>2]|0)+-128|0;Ja=(c[f+328>>2]|0)+128|0;f=0;do{r=j+(f<<2)|0;e=r+2|0;q=b[e>>1]|0;b[e>>1]=(q|0)<(O|0)?O:(q|0)>(Ca|0)?Ca:q;q=b[r>>1]|0;b[r>>1]=(q|0)<(g|0)?g:(q|0)>(Ja|0)?Ja:q;f=f+1|0}while((f|0)!=(F|0));Ka=F;return Ka|0}function Cg(f,g,h,i,j,k,m,n,o){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;p=l;l=l+16|0;q=p;switch(h<<24>>24){case 13:{h=c[g+268>>2]|0;g=h|0?h+12800|0:0;if((m|0)<0){r=1;l=p;return r|0}h=f+4108|0;f=o+4|0;s=o+8|0;t=(n|0)==0;n=q+2|0;u=0;v=1;while(1){w=i+(u<<2)|0;x=j+(u<<2)|0;y=c[h>>2]|0;z=c[f>>2]|0;A=c[s>>2]|0;B=0;do{C=B<<24>>24;D=d[(C>>1)+(y+1970)>>0]|0;E=(256-D+(S(D,z)|0)|0)>>>8;if((A|0)<0){gc(o);F=c[s>>2]|0}else F=A;D=c[o>>2]|0;G=E<<24;if(D>>>0<G>>>0){H=0;I=E;J=D}else{H=1;I=(c[f>>2]|0)-E|0;J=D-G|0}G=d[1280+I>>0]|0;z=I<<G;A=F-G|0;c[o>>2]=J<<G;c[s>>2]=A;c[f>>2]=z;B=a[27684+(H+C)>>0]|0}while(B<<24>>24>0);z=0-(B<<24>>24)|0;if(!t?(A=b[x>>1]|0,C=A<<16>>16,((A<<16>>16>-1?C:0-C|0)|0)<64):0){C=b[x+2>>1]|0;A=C<<16>>16;K=((C<<16>>16>-1?A:0-A|0)|0)<64}else K=0;A=K&1;c[q>>2]=0;if((z|1|0)==3)b[q>>1]=Dg(o,y+1973|0,A)|0;if((z|2|0)==3)b[n>>1]=Dg(o,y+2006|0,A)|0;Me(q,g);A=(e[q>>1]|0)+(e[x>>1]|0)&65535;b[w>>1]=A;z=(e[n>>1]|0)+(e[x+2>>1]|0)&65535;b[w+2>>1]=z;if((v|0)!=0&(A+16383&65535)<32766)L=(z+16383&65535)<32766;else L=0;z=L&1;if((u|0)==(m|0)){r=z;break}else{u=u+1|0;v=z}}l=p;return r|0}case 10:case 11:{v=k;k=c[v+4>>2]|0;u=i;c[u>>2]=c[v>>2];c[u+4>>2]=k;r=1;l=p;return r|0}case 12:{k=i;c[k>>2]=0;c[k+4>>2]=0;r=1;l=p;return r|0}default:{r=0;l=p;return r|0}}return 0}function Dg(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=d[e>>0]|0;h=b+4|0;i=(256-g+(S(c[h>>2]|0,g)|0)|0)>>>8;g=b+8|0;j=c[g>>2]|0;if((j|0)<0){gc(b);k=c[g>>2]|0}else k=j;j=c[b>>2]|0;l=i<<24;if(j>>>0<l>>>0){m=0;n=i;o=j}else{m=1;n=(c[h>>2]|0)-i|0;o=j-l|0}l=d[1280+n>>0]|0;j=n<<l;n=o<<l;o=k-l|0;c[b>>2]=n;c[g>>2]=o;c[h>>2]=j;l=n;n=j;j=o;o=0;do{k=o<<24>>24;i=d[(k>>1)+(e+1)>>0]|0;p=(256-i+(S(i,n)|0)|0)>>>8;if((j|0)<0){gc(b);q=c[b>>2]|0;r=c[g>>2]|0}else{q=l;r=j}i=p<<24;if(q>>>0<i>>>0){s=0;t=p;u=q}else{s=1;t=(c[h>>2]|0)-p|0;u=q-i|0}i=d[1280+t>>0]|0;n=t<<i;l=u<<i;j=r-i|0;c[b>>2]=l;c[g>>2]=j;c[h>>2]=n;o=a[27690+(s+k)>>0]|0}while(o<<24>>24>0);s=o<<24>>24;r=0-s|0;u=o<<24>>24==0;if(u){o=d[e+11>>0]|0;t=(256-o+(S(o,n)|0)|0)>>>8;if((j|0)<0){gc(b);v=c[b>>2]|0;w=c[g>>2]|0}else{v=l;w=j}o=t<<24;if(v>>>0<o>>>0){x=0;y=t;z=v}else{x=1;y=(c[h>>2]|0)-t|0;z=v-o|0}o=d[1280+y>>0]|0;v=y<<o;y=z<<o;z=w-o|0;c[b>>2]=y;c[g>>2]=z;c[h>>2]=v;A=v;B=z;C=y;D=x;E=1}else{x=n;n=j;j=l;l=0;y=0;do{z=d[e+12+y>>0]|0;v=(256-z+(S(x,z)|0)|0)>>>8;if((n|0)<0){gc(b);F=c[b>>2]|0;G=c[g>>2]|0}else{F=j;G=n}z=v<<24;if(F>>>0<z>>>0){H=0;I=v;J=F}else{H=1;I=(c[h>>2]|0)-v|0;J=F-z|0}z=d[1280+I>>0]|0;x=I<<z;j=J<<z;n=G-z|0;c[b>>2]=j;c[g>>2]=n;c[h>>2]=x;l=H<<y|l;y=y+1|0}while((y|0)<(r|0));A=x;B=n;C=j;D=l;E=(2<<2-s)+1|0}s=u?e+22+(D*3|0)|0:e+28|0;l=A;A=B;B=C;C=0;do{j=C<<24>>24;n=d[s+(j>>1)>>0]|0;x=(256-n+(S(n,l)|0)|0)>>>8;if((A|0)<0){gc(b);K=c[b>>2]|0;L=c[g>>2]|0}else{K=B;L=A}n=x<<24;if(K>>>0<n>>>0){M=0;N=x;O=K}else{M=1;N=(c[h>>2]|0)-x|0;O=K-n|0}n=d[1280+N>>0]|0;l=N<<n;B=O<<n;A=L-n|0;c[b>>2]=B;c[g>>2]=A;c[h>>2]=l;C=a[27712+(M+j)>>0]|0}while(C<<24>>24>0);M=0-(C<<24>>24)|0;if(!f){P=1;Q=D<<3;R=M<<1;T=R|Q;U=T|P;V=E+U|0;W=(m|0)!=0;X=0-V|0;Y=W?X:V;return Y|0}f=d[(u?e+31|0:e+32|0)>>0]|0;e=(256-f+(S(f,l)|0)|0)>>>8;if((A|0)<0){gc(b);Z=c[b>>2]|0;_=c[g>>2]|0}else{Z=B;_=A}A=e<<24;if(Z>>>0<A>>>0){$=0;aa=e;ba=Z}else{$=1;aa=(c[h>>2]|0)-e|0;ba=Z-A|0}A=d[1280+aa>>0]|0;c[b>>2]=ba<<A;c[g>>2]=_-A;c[h>>2]=aa<<A;P=$;Q=D<<3;R=M<<1;T=R|Q;U=T|P;V=E+U|0;W=(m|0)!=0;X=0-V|0;Y=W?X:V;return Y|0}function Eg(a){a=a|0;var b=0;if((kc(a,8)|0)==73?(kc(a,8)|0)==131:0)b=(kc(a,8)|0)==66;else b=0;return b&1|0}function Fg(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=(kc(a,16)|0)+1;c[d>>2]=(kc(a,16)|0)+1;return}function Gg(a){a=a|0;var b=0,c=0,d=0;b=jc(a)|0;c=(jc(a)|0)<<1|b;if((c|0)<=2){d=c;return d|0}d=(jc(a)|0)+c|0;return d|0}\n\n// EMSCRIPTEN_END_FUNCS\nvar wb=[lk,$f,Bh,wh,ei,Re,vh,lk];var xb=[mk,xd,zd,wd,Cd,rd,td,od,Ad,qd,Dd,yd,Bd,ud,vd,mk];var yb=[nk,we];var zb=[ok,pe,se,te,ue,Ig,ah,dh,eh,xf,xe,ye,Vg,Wg,Ee,Xg,uj,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok];var Ab=[pk,Wd,ae,Zd,be,de,fe,Ag];var Bb=[qk,qe,re,_f,uh,ve,hc,mh];var Cb=[rk];var Db=[sk,cc,oe,hf,Yf,bh,nh,sk];var Eb=[tk,dg];var Fb=[uk,Qg];var Gb=[vk,Zf,ag,cg,ig,jg,kg,lg,mg,ng,og,pg,qg,rg,sg,tg,ug,vg,lf,mf,nf,Nf,eg,Se,Ng,Pg,Jf,Vb,Xb,vj,ch,vk];var Hb=[wk,bg,fc,wk];var Ib=[xk,Oc,Pc,Qc,Rc,Sc,Tc,Uc,Vc,mc,sc,uc,vc,oc,zc,Ac,Bc,nc,wc,xc,yc,pc,Cc,Ec,Fc,qc,Gc,Ic,Jc,rc,Kc,Mc,Nc,Wc,Xc,Yc,Zc,_c,$c,ad,bd,gd,hd,id,jd,cd,dd,ed,fd,kd,ld,md,nd,vf,Ub,Hg,xk,xk,xk,xk,xk,xk,xk,xk];return{__emscripten_atomic_fetch_and_xor_u64:xi,_bitshift64Shl:Mj,_emscripten_atomic_load_f32:Ei,_bitshift64Lshr:Nj,_ogv_video_decoder_destroy:ph,___emscripten_pthread_data_constructor:th,stackSave:Kb,_emscripten_atomic_xor_u64:Mi,_emscripten_atomic_load_u64:Gi,___udivdi3:Tj,_ogv_video_decoder_process_frame:rh,getTempRet0:Pb,_emscripten_atomic_and_u64:Ai,_emscripten_sync_run_in_main_thread:Oi,_emscripten_sync_run_in_main_thread_4:Ti,_emscripten_sync_run_in_main_thread_5:Ui,_emscripten_sync_run_in_main_thread_6:Vi,_emscripten_sync_run_in_main_thread_7:Wi,_emscripten_sync_run_in_main_thread_0:Pi,_emscripten_sync_run_in_main_thread_1:Qi,_emscripten_sync_run_in_main_thread_2:Ri,__emscripten_atomic_fetch_and_sub_u64:wi,_emscripten_atomic_exchange_u32:Ci,_ogv_video_decoder_process_header:qh,_emscripten_atomic_cas_u64:Bi,_llvm_cttz_i32:Rj,_emscripten_atomic_sub_u64:Li,_emscripten_sync_run_in_main_thread_xprintf_varargs:Xi,_memcpy:Qj,___errno_location:yh,___muldi3:Vj,__emscripten_atomic_fetch_and_and_u64:ui,_emscripten_sync_run_in_main_thread_3:Si,___uremdi3:Xj,stackAlloc:Jb,_i64Subtract:Ij,_ogv_video_decoder_init:lh,_memset:Jj,setTempRet0:Ob,_realloc:Dj,_i64Add:Kj,_emscripten_atomic_store_u64:Ki,_emscripten_atomic_load_f64:Fi,_emscripten_main_thread_process_queued_calls:Ni,_ogv_video_decoder_async:oh,_emscripten_get_global_libc:sh,__emscripten_atomic_fetch_and_add_u64:ti,__emscripten_atomic_fetch_and_or_u64:vi,_emscripten_async_run_in_main_thread:yi,_llvm_bswap_i32:Yj,runPostSets:Gj,___muldsi3:Uj,_testSetjmp:Oj,_saveSetjmp:Lj,_emscripten_atomic_add_u64:zi,_free:Cj,_emscripten_atomic_store_f32:Ii,setThrew:Nb,_emscripten_atomic_exchange_u64:Di,_emscripten_atomic_store_f64:Ji,___pthread_tsd_run_dtors:Yi,_emscripten_set_current_thread_status:Hj,stackRestore:Lb,___udivmoddi4:Sj,_malloc:Bj,establishStackSpace:Mb,_emscripten_conditional_set_current_thread_status:Pj,_sbrk:Zj,_memmove:Wj,_emscripten_atomic_or_u64:Hi,stackAlloc:Jb,stackSave:Kb,stackRestore:Lb,establishStackSpace:Mb,setThrew:Nb,setTempRet0:Ob,getTempRet0:Pb,dynCall_iiii:_j,dynCall_viiiiiiiiii:$j,dynCall_i:ak,dynCall_vi:bk,dynCall_vii:ck,dynCall_ii:dk,dynCall_viii:ek,dynCall_v:fk,dynCall_iiiii:gk,dynCall_viiiiii:hk,dynCall_iii:ik,dynCall_iiiiii:jk,dynCall_viiii:kk}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var __emscripten_atomic_fetch_and_xor_u64=Module[\"__emscripten_atomic_fetch_and_xor_u64\"]=asm[\"__emscripten_atomic_fetch_and_xor_u64\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _emscripten_atomic_load_f32=Module[\"_emscripten_atomic_load_f32\"]=asm[\"_emscripten_atomic_load_f32\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=asm[\"_ogv_video_decoder_destroy\"];var ___emscripten_pthread_data_constructor=Module[\"___emscripten_pthread_data_constructor\"]=asm[\"___emscripten_pthread_data_constructor\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var _emscripten_atomic_xor_u64=Module[\"_emscripten_atomic_xor_u64\"]=asm[\"_emscripten_atomic_xor_u64\"];var _emscripten_atomic_load_u64=Module[\"_emscripten_atomic_load_u64\"]=asm[\"_emscripten_atomic_load_u64\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=asm[\"_ogv_video_decoder_process_frame\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var _emscripten_atomic_and_u64=Module[\"_emscripten_atomic_and_u64\"]=asm[\"_emscripten_atomic_and_u64\"];var _emscripten_sync_run_in_main_thread=Module[\"_emscripten_sync_run_in_main_thread\"]=asm[\"_emscripten_sync_run_in_main_thread\"];var _emscripten_sync_run_in_main_thread_4=Module[\"_emscripten_sync_run_in_main_thread_4\"]=asm[\"_emscripten_sync_run_in_main_thread_4\"];var _emscripten_sync_run_in_main_thread_5=Module[\"_emscripten_sync_run_in_main_thread_5\"]=asm[\"_emscripten_sync_run_in_main_thread_5\"];var _emscripten_sync_run_in_main_thread_6=Module[\"_emscripten_sync_run_in_main_thread_6\"]=asm[\"_emscripten_sync_run_in_main_thread_6\"];var _emscripten_sync_run_in_main_thread_7=Module[\"_emscripten_sync_run_in_main_thread_7\"]=asm[\"_emscripten_sync_run_in_main_thread_7\"];var _emscripten_sync_run_in_main_thread_0=Module[\"_emscripten_sync_run_in_main_thread_0\"]=asm[\"_emscripten_sync_run_in_main_thread_0\"];var _emscripten_sync_run_in_main_thread_1=Module[\"_emscripten_sync_run_in_main_thread_1\"]=asm[\"_emscripten_sync_run_in_main_thread_1\"];var _emscripten_sync_run_in_main_thread_2=Module[\"_emscripten_sync_run_in_main_thread_2\"]=asm[\"_emscripten_sync_run_in_main_thread_2\"];var __emscripten_atomic_fetch_and_sub_u64=Module[\"__emscripten_atomic_fetch_and_sub_u64\"]=asm[\"__emscripten_atomic_fetch_and_sub_u64\"];var _emscripten_atomic_exchange_u32=Module[\"_emscripten_atomic_exchange_u32\"]=asm[\"_emscripten_atomic_exchange_u32\"];var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=asm[\"_ogv_video_decoder_process_header\"];var _emscripten_atomic_cas_u64=Module[\"_emscripten_atomic_cas_u64\"]=asm[\"_emscripten_atomic_cas_u64\"];var _llvm_cttz_i32=Module[\"_llvm_cttz_i32\"]=asm[\"_llvm_cttz_i32\"];var _emscripten_atomic_sub_u64=Module[\"_emscripten_atomic_sub_u64\"]=asm[\"_emscripten_atomic_sub_u64\"];var _emscripten_sync_run_in_main_thread_xprintf_varargs=Module[\"_emscripten_sync_run_in_main_thread_xprintf_varargs\"]=asm[\"_emscripten_sync_run_in_main_thread_xprintf_varargs\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var ___errno_location=Module[\"___errno_location\"]=asm[\"___errno_location\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var __emscripten_atomic_fetch_and_and_u64=Module[\"__emscripten_atomic_fetch_and_and_u64\"]=asm[\"__emscripten_atomic_fetch_and_and_u64\"];var _emscripten_sync_run_in_main_thread_3=Module[\"_emscripten_sync_run_in_main_thread_3\"]=asm[\"_emscripten_sync_run_in_main_thread_3\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=asm[\"_ogv_video_decoder_init\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _realloc=Module[\"_realloc\"]=asm[\"_realloc\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _emscripten_atomic_store_u64=Module[\"_emscripten_atomic_store_u64\"]=asm[\"_emscripten_atomic_store_u64\"];var _emscripten_atomic_load_f64=Module[\"_emscripten_atomic_load_f64\"]=asm[\"_emscripten_atomic_load_f64\"];var _emscripten_main_thread_process_queued_calls=Module[\"_emscripten_main_thread_process_queued_calls\"]=asm[\"_emscripten_main_thread_process_queued_calls\"];var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=asm[\"_ogv_video_decoder_async\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var __emscripten_atomic_fetch_and_add_u64=Module[\"__emscripten_atomic_fetch_and_add_u64\"]=asm[\"__emscripten_atomic_fetch_and_add_u64\"];var __emscripten_atomic_fetch_and_or_u64=Module[\"__emscripten_atomic_fetch_and_or_u64\"]=asm[\"__emscripten_atomic_fetch_and_or_u64\"];var _emscripten_async_run_in_main_thread=Module[\"_emscripten_async_run_in_main_thread\"]=asm[\"_emscripten_async_run_in_main_thread\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var ___muldsi3=Module[\"___muldsi3\"]=asm[\"___muldsi3\"];var _testSetjmp=Module[\"_testSetjmp\"]=asm[\"_testSetjmp\"];var _saveSetjmp=Module[\"_saveSetjmp\"]=asm[\"_saveSetjmp\"];var _emscripten_atomic_add_u64=Module[\"_emscripten_atomic_add_u64\"]=asm[\"_emscripten_atomic_add_u64\"];var _free=Module[\"_free\"]=asm[\"_free\"];var _emscripten_atomic_store_f32=Module[\"_emscripten_atomic_store_f32\"]=asm[\"_emscripten_atomic_store_f32\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _emscripten_atomic_exchange_u64=Module[\"_emscripten_atomic_exchange_u64\"]=asm[\"_emscripten_atomic_exchange_u64\"];var _emscripten_atomic_store_f64=Module[\"_emscripten_atomic_store_f64\"]=asm[\"_emscripten_atomic_store_f64\"];var ___pthread_tsd_run_dtors=Module[\"___pthread_tsd_run_dtors\"]=asm[\"___pthread_tsd_run_dtors\"];var _emscripten_set_current_thread_status=Module[\"_emscripten_set_current_thread_status\"]=asm[\"_emscripten_set_current_thread_status\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var ___udivmoddi4=Module[\"___udivmoddi4\"]=asm[\"___udivmoddi4\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var _emscripten_conditional_set_current_thread_status=Module[\"_emscripten_conditional_set_current_thread_status\"]=asm[\"_emscripten_conditional_set_current_thread_status\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var _emscripten_atomic_or_u64=Module[\"_emscripten_atomic_or_u64\"]=asm[\"_emscripten_atomic_or_u64\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_viiiiiiiiii=Module[\"dynCall_viiiiiiiiii\"]=asm[\"dynCall_viiiiiiiiii\"];var dynCall_i=Module[\"dynCall_i\"]=asm[\"dynCall_i\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_viii=Module[\"dynCall_viii\"]=asm[\"dynCall_viii\"];var dynCall_v=Module[\"dynCall_v\"]=asm[\"dynCall_v\"];var dynCall_iiiii=Module[\"dynCall_iiiii\"]=asm[\"dynCall_iiiii\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=asm[\"dynCall_iiiiii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{PThread.terminateAllThreads();ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(ENVIRONMENT_IS_PTHREAD)console.error(\"Pthread aborting at \"+(new Error).stack);if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=true;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;if(!ENVIRONMENT_IS_PTHREAD)run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDecoderVideoVP9MT;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-vp9-wasm.js",
    "content": "var OGVDecoderVideoVP9W\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoVP9W = function(OGVDecoderVideoVP9W) {\n  OGVDecoderVideoVP9W = OGVDecoderVideoVP9W || {};\n  if (!OGVDecoderVideoVP9W.currentScriptUrl) OGVDecoderVideoVP9W.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoVP9W;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoVP9W=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoVP9W!==\"undefined\"?OGVDecoderVideoVP9W:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Memory===\"function\"){Module[\"wasmMemory\"]=new WebAssembly.Memory({\"initial\":TOTAL_MEMORY/WASM_PAGE_SIZE,\"maximum\":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\"wasmMemory\"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"fround\"]){var froundBuffer=new Float32Array(1);Math[\"fround\"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math[\"fround\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module[\"wasmJSMethod\"]||\"native-wasm\";Module[\"wasmJSMethod\"]=method;var wasmTextFile=Module[\"wasmTextFile\"]||\"ogv-decoder-video-vp9-wasm.wast\";var wasmBinaryFile=Module[\"wasmBinaryFile\"]||\"ogv-decoder-video-vp9-wasm.wasm\";var asmjsCodeFile=Module[\"asmjsCodeFile\"]||\"ogv-decoder-video-vp9-wasm.temp.asm.js\";if(typeof Module[\"locateFile\"]===\"function\"){wasmTextFile=Module[\"locateFile\"](wasmTextFile);wasmBinaryFile=Module[\"locateFile\"](wasmBinaryFile);asmjsCodeFile=Module[\"locateFile\"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={\"f64-rem\":(function(x,y){return x%y}),\"f64-to-int\":(function(x){return x|0}),\"i32s-div\":(function(x,y){return(x|0)/(y|0)|0}),\"i32u-div\":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\"i32s-rem\":(function(x,y){return(x|0)%(y|0)|0}),\"i32u-rem\":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\"debugger\":(function(){debugger})};var info={\"global\":null,\"env\":null,\"asm2wasm\":asm2wasmImports,\"parent\":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(\".\")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(\".\");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\"bad lookupImport to (\"+mod+\").\"+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module[\"buffer\"];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\"printErr\"](\"the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here\")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\"STATIC_BASE\"],Module[\"STATIC_BASE\"]+Module[\"STATIC_BUMP\"]),Module[\"STATIC_BASE\"])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function fixImports(imports){if(!0)return imports;var ret={};for(var i in imports){var fixed=i;if(fixed[0]==\"_\")fixed=fixed.substr(1);ret[fixed]=imports[i]}return ret}function getBinary(){var binary;if(Module[\"wasmBinary\"]){binary=Module[\"wasmBinary\"];binary=new Uint8Array(binary)}else if(Module[\"readBinary\"]){binary=Module[\"readBinary\"](wasmBinaryFile)}else{throw\"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)\"}return binary}function getBinaryPromise(){if(!Module[\"wasmBinary\"]&&typeof fetch===\"function\"){return fetch(wasmBinaryFile).then((function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doJustAsm(global,env,providedBuffer){if(typeof Module[\"asm\"]!==\"function\"||Module[\"asm\"]===methodHandler){if(!Module[\"asmPreload\"]){eval(Module[\"read\"](asmjsCodeFile))}else{Module[\"asm\"]=Module[\"asmPreload\"]}}if(typeof Module[\"asm\"]!==\"function\"){Module[\"printErr\"](\"asm evalling did not set the module properly\");return false}return Module[\"asm\"](global,env,providedBuffer)}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!==\"object\"){Module[\"printErr\"](\"no native wasm support detected\");return false}if(!(Module[\"wasmMemory\"]instanceof WebAssembly.Memory)){Module[\"printErr\"](\"no native wasm Memory in use\");return false}env[\"memory\"]=Module[\"wasmMemory\"];info[\"global\"]={\"NaN\":NaN,\"Infinity\":Infinity};info[\"global.Math\"]=global.Math;info[\"env\"]=env;function receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\"asm\"]=exports;Module[\"usingWasm\"]=true;removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){Module[\"printErr\"](\"Module.instantiateWasm callback failed with error: \"+e);return false}}getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\"instance\"])})).catch((function(reason){Module[\"printErr\"](\"failed to asynchronously prepare wasm: \"+reason);Module[\"quit\"](1,reason)}));return{}}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!==\"function\"){Module[\"printErr\"](\"WasmJS not detected - polyfill not bundled?\");return false}var wasmJS=WasmJS({});wasmJS[\"outside\"]=Module;wasmJS[\"info\"]=info;wasmJS[\"lookupImport\"]=lookupImport;assert(providedBuffer===Module[\"buffer\"]);info.global=global;info.env=env;assert(providedBuffer===Module[\"buffer\"]);env[\"memory\"]=providedBuffer;assert(env[\"memory\"]instanceof ArrayBuffer);wasmJS[\"providedTotalMemory\"]=Module[\"buffer\"].byteLength;var code;if(method===\"interpret-binary\"){code=getBinary()}else{code=Module[\"read\"](method==\"interpret-asm2wasm\"?asmjsCodeFile:wasmTextFile)}var temp;if(method==\"interpret-asm2wasm\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_asm2wasm\"](temp)}else if(method===\"interpret-s-expr\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_s_expr2wasm\"](temp)}else if(method===\"interpret-binary\"){temp=wasmJS[\"_malloc\"](code.length);wasmJS[\"HEAPU8\"].set(code,temp);wasmJS[\"_load_binary2wasm\"](temp,code.length)}else{throw\"what? \"+method}wasmJS[\"_free\"](temp);wasmJS[\"_instantiate\"](temp);if(Module[\"newBuffer\"]){mergeMemory(Module[\"newBuffer\"]);Module[\"newBuffer\"]=null}exports=wasmJS[\"asmExports\"];return exports}Module[\"asmPreload\"]=Module[\"asm\"];Module[\"reallocBuffer\"]=(function(size){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module[\"buffer\"];var oldSize=old.byteLength;if(Module[\"usingWasm\"]){try{var result=Module[\"wasmMemory\"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module[\"buffer\"]=Module[\"wasmMemory\"].buffer}else{return null}}catch(e){return null}}else{exports[\"__growWasmMemory\"]((size-oldSize)/wasmPageSize);return Module[\"buffer\"]!==old?Module[\"buffer\"]:null}});Module[\"asm\"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\"table\"]){var TABLE_SIZE=Module[\"wasmTableSize\"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module[\"wasmMaxTableSize\"];if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Table===\"function\"){if(MAX_TABLE_SIZE!==undefined){env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,\"maximum\":MAX_TABLE_SIZE,\"element\":\"anyfunc\"})}else{env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,element:\"anyfunc\"})}}else{env[\"table\"]=new Array(TABLE_SIZE)}Module[\"wasmTable\"]=env[\"table\"]}if(!env[\"memoryBase\"]){env[\"memoryBase\"]=Module[\"STATIC_BASE\"]}if(!env[\"tableBase\"]){env[\"tableBase\"]=0}var exports;var methods=method.split(\",\");for(var i=0;i<methods.length;i++){var curr=methods[i];if(curr===\"native-wasm\"){if(exports=doNativeWasm(global,env,providedBuffer))break}else if(curr===\"asmjs\"){if(exports=doJustAsm(global,env,providedBuffer))break}else if(curr===\"interpret-asm2wasm\"||curr===\"interpret-s-expr\"||curr===\"interpret-binary\"){if(exports=doWasmPolyfill(global,env,providedBuffer,curr))break}else{throw\"bad method: \"+curr}}if(!exports)throw\"no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods\";return exports});var methodHandler=Module[\"asm\"]}integrateWasmJS(Module);var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+36944;__ATINIT__.push();memoryInitializer=Module[\"wasmJSMethod\"].indexOf(\"asmjs\")>=0||Module[\"wasmJSMethod\"].indexOf(\"interpret-asm2wasm\")>=0?\"ogv-decoder-video-vp9-wasm.js.mem\":null;var STATIC_BUMP=36944;Module[\"STATIC_BASE\"]=STATIC_BASE;Module[\"STATIC_BUMP\"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;function _realloc(){throw\"bad\"}Module[\"_realloc\"]=_realloc;Module[\"_saveSetjmp\"]=_saveSetjmp;Module[\"_testSetjmp\"]=_testSetjmp;function _longjmp(env,value){Module[\"setThrew\"](env,value||1);throw\"longjmp\"}Module[\"_memset\"]=_memset;function _abort(){Module[\"abort\"]()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;Module[\"_memmove\"]=_memmove;Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\"wasmTableSize\"]=170;Module[\"wasmMaxTableSize\"]=170;function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{Module[\"dynCall_viiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_i(index){try{return Module[\"dynCall_i\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_viiiiiiiiii\":invoke_viiiiiiiiii,\"invoke_i\":invoke_i,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_v\":invoke_v,\"invoke_iiiii\":invoke_iiiii,\"invoke_viiiiii\":invoke_viiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"_longjmp\":_longjmp,\"___syscall6\":___syscall6,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};var asm=Module[\"asm\"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\"asm\"]=asm;var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=(function(){return Module[\"asm\"][\"_llvm_bswap_i32\"].apply(null,arguments)});var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_destroy\"].apply(null,arguments)});var getTempRet0=Module[\"getTempRet0\"]=(function(){return Module[\"asm\"][\"getTempRet0\"].apply(null,arguments)});var setThrew=Module[\"setThrew\"]=(function(){return Module[\"asm\"][\"setThrew\"].apply(null,arguments)});var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_process_frame\"].apply(null,arguments)});var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_process_header\"].apply(null,arguments)});var _memset=Module[\"_memset\"]=(function(){return Module[\"asm\"][\"_memset\"].apply(null,arguments)});var _sbrk=Module[\"_sbrk\"]=(function(){return Module[\"asm\"][\"_sbrk\"].apply(null,arguments)});var _memcpy=Module[\"_memcpy\"]=(function(){return Module[\"asm\"][\"_memcpy\"].apply(null,arguments)});var stackAlloc=Module[\"stackAlloc\"]=(function(){return Module[\"asm\"][\"stackAlloc\"].apply(null,arguments)});var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_init\"].apply(null,arguments)});var setTempRet0=Module[\"setTempRet0\"]=(function(){return Module[\"asm\"][\"setTempRet0\"].apply(null,arguments)});var _realloc=Module[\"_realloc\"]=(function(){return Module[\"asm\"][\"_realloc\"].apply(null,arguments)});var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=(function(){return Module[\"asm\"][\"_ogv_video_decoder_async\"].apply(null,arguments)});var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=(function(){return Module[\"asm\"][\"_emscripten_get_global_libc\"].apply(null,arguments)});var stackSave=Module[\"stackSave\"]=(function(){return Module[\"asm\"][\"stackSave\"].apply(null,arguments)});var _testSetjmp=Module[\"_testSetjmp\"]=(function(){return Module[\"asm\"][\"_testSetjmp\"].apply(null,arguments)});var _saveSetjmp=Module[\"_saveSetjmp\"]=(function(){return Module[\"asm\"][\"_saveSetjmp\"].apply(null,arguments)});var _free=Module[\"_free\"]=(function(){return Module[\"asm\"][\"_free\"].apply(null,arguments)});var runPostSets=Module[\"runPostSets\"]=(function(){return Module[\"asm\"][\"runPostSets\"].apply(null,arguments)});var establishStackSpace=Module[\"establishStackSpace\"]=(function(){return Module[\"asm\"][\"establishStackSpace\"].apply(null,arguments)});var _memmove=Module[\"_memmove\"]=(function(){return Module[\"asm\"][\"_memmove\"].apply(null,arguments)});var stackRestore=Module[\"stackRestore\"]=(function(){return Module[\"asm\"][\"stackRestore\"].apply(null,arguments)});var _malloc=Module[\"_malloc\"]=(function(){return Module[\"asm\"][\"_malloc\"].apply(null,arguments)});var dynCall_iiii=Module[\"dynCall_iiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiii\"].apply(null,arguments)});var dynCall_viiiiiiiiii=Module[\"dynCall_viiiiiiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiiiiiiiii\"].apply(null,arguments)});var dynCall_i=Module[\"dynCall_i\"]=(function(){return Module[\"asm\"][\"dynCall_i\"].apply(null,arguments)});var dynCall_vi=Module[\"dynCall_vi\"]=(function(){return Module[\"asm\"][\"dynCall_vi\"].apply(null,arguments)});var dynCall_vii=Module[\"dynCall_vii\"]=(function(){return Module[\"asm\"][\"dynCall_vii\"].apply(null,arguments)});var dynCall_ii=Module[\"dynCall_ii\"]=(function(){return Module[\"asm\"][\"dynCall_ii\"].apply(null,arguments)});var dynCall_v=Module[\"dynCall_v\"]=(function(){return Module[\"asm\"][\"dynCall_v\"].apply(null,arguments)});var dynCall_iiiii=Module[\"dynCall_iiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiii\"].apply(null,arguments)});var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiiiii\"].apply(null,arguments)});var dynCall_iii=Module[\"dynCall_iii\"]=(function(){return Module[\"asm\"][\"dynCall_iii\"].apply(null,arguments)});var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiiii\"].apply(null,arguments)});var dynCall_viiii=Module[\"dynCall_viiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiii\"].apply(null,arguments)});Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;if(memoryInitializer){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];if(request.status!==200&&request.status!==0){console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n  return OGVDecoderVideoVP9W;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-decoder-video-vp9.js",
    "content": "var OGVDecoderVideoVP9\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDecoderVideoVP9 = function(OGVDecoderVideoVP9) {\n  OGVDecoderVideoVP9 = OGVDecoderVideoVP9 || {};\n  if (!OGVDecoderVideoVP9.currentScriptUrl) OGVDecoderVideoVP9.currentScriptUrl = scriptSrc;\n  var Module = OGVDecoderVideoVP9;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDecoderVideoVP9=Module;var Module;if(!Module)Module=(typeof OGVDecoderVideoVP9!==\"undefined\"?OGVDecoderVideoVP9:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+36176;__ATINIT__.push();allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,1,0,251,255,126,0,8,0,253,255,1,0,0,0,255,255,3,0,246,255,122,0,18,0,250,255,2,0,0,0,255,255,4,0,243,255,118,0,27,0,247,255,3,0,255,255,255,255,4,0,240,255,112,0,37,0,245,255,4,0,255,255,255,255,5,0,238,255,105,0,48,0,242,255,4,0,255,255,255,255,5,0,237,255,97,0,58,0,240,255,5,0,255,255,255,255,6,0,237,255,88,0,68,0,238,255,5,0,255,255,255,255,6,0,237,255,78,0,78,0,237,255,6,0,255,255,255,255,5,0,238,255,68,0,88,0,237,255,6,0,255,255,255,255,5,0,240,255,58,0,97,0,237,255,5,0,255,255,255,255,4,0,242,255,48,0,105,0,238,255,5,0,255,255,255,255,4,0,245,255,37,0,112,0,240,255,4,0,255,255,255,255,3,0,247,255,27,0,118,0,243,255,4,0,255,255,0,0,2,0,250,255,18,0,122,0,246,255,3,0,255,255,0,0,1,0,253,255,8,0,126,0,251,255,1,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,253,255,255,255,32,0,64,0,38,0,1,0,253,255,0,0,254,255,254,255,29,0,63,0,41,0,2,0,253,255,0,0,254,255,254,255,26,0,63,0,43,0,4,0,252,255,0,0,254,255,253,255,24,0,62,0,46,0,5,0,252,255,0,0,254,255,253,255,21,0,60,0,49,0,7,0,252,255,0,0,255,255,252,255,18,0,59,0,51,0,9,0,252,255,0,0,255,255,252,255,16,0,57,0,53,0,12,0,252,255,255,255,255,255,252,255,14,0,55,0,55,0,14,0,252,255,255,255,255,255,252,255,12,0,53,0,57,0,16,0,252,255,255,255,0,0,252,255,9,0,51,0,59,0,18,0,252,255,255,255,0,0,252,255,7,0,49,0,60,0,21,0,253,255,254,255,0,0,252,255,5,0,46,0,62,0,24,0,253,255,254,255,0,0,252,255,4,0,43,0,63,0,26,0,254,255,254,255,0,0,253,255,2,0,41,0,63,0,29,0,254,255,254,255,0,0,253,255,1,0,38,0,64,0,32,0,255,255,253,255,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,255,255,3,0,249,255,127,0,8,0,253,255,1,0,0,0,254,255,5,0,243,255,125,0,17,0,250,255,3,0,255,255,253,255,7,0,239,255,121,0,27,0,246,255,5,0,254,255,252,255,9,0,236,255,115,0,37,0,243,255,6,0,254,255,252,255,10,0,233,255,108,0,48,0,240,255,8,0,253,255,252,255,10,0,232,255,100,0,59,0,237,255,9,0,253,255,252,255,11,0,232,255,90,0,70,0,235,255,10,0,252,255,252,255,11,0,233,255,80,0,80,0,233,255,11,0,252,255,252,255,10,0,235,255,70,0,90,0,232,255,11,0,252,255,253,255,9,0,237,255,59,0,100,0,232,255,10,0,252,255,253,255,8,0,240,255,48,0,108,0,233,255,10,0,252,255,254,255,6,0,243,255,37,0,115,0,236,255,9,0,252,255,254,255,5,0,246,255,27,0,121,0,239,255,7,0,253,255,255,255,3,0,250,255,17,0,125,0,243,255,5,0,254,255,0,0,1,0,253,255,8,0,127,0,249,255,3,0,255,255,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,104,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,88,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,104,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,120,0,0,0,0,0,0,0,0,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,148,140,0,0,0,0,0,0,0,0,0,0,0,0,0,176,155,140,135,0,0,0,0,0,0,0,0,0,0,0,0,180,157,141,134,130,0,0,0,0,0,0,0,0,0,0,0,254,254,254,252,249,243,230,196,177,153,140,133,130,129,0,0,0,1,1,2,2,2,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,1,1,2,2,2,3,3,3,3,4,4,4,5,5,5,0,0,4,0,1,0,5,0,8,0,2,0,12,0,9,0,3,0,6,0,13,0,10,0,7,0,14,0,11,0,15,0,0,0,2,0,5,0,8,0,1,0,3,0,9,0,12,0,4,0,7,0,11,0,14,0,6,0,10,0,13,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,4,0,4,0,4,0,1,0,1,0,8,0,8,0,5,0,8,0,2,0,2,0,2,0,5,0,9,0,12,0,6,0,9,0,3,0,6,0,10,0,13,0,7,0,10,0,11,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,1,0,16,0,9,0,2,0,17,0,24,0,10,0,3,0,18,0,25,0,32,0,11,0,4,0,26,0,33,0,19,0,40,0,12,0,34,0,27,0,5,0,41,0,20,0,48,0,13,0,35,0,42,0,28,0,21,0,6,0,49,0,56,0,36,0,43,0,29,0,7,0,14,0,50,0,57,0,44,0,22,0,37,0,15,0,51,0,58,0,30,0,45,0,23,0,52,0,59,0,38,0,31,0,60,0,53,0,46,0,39,0,61,0,54,0,47,0,62,0,55,0,63,0,0,0,2,0,5,0,9,0,14,0,22,0,31,0,37,0,1,0,4,0,8,0,13,0,19,0,26,0,38,0,44,0,3,0,6,0,10,0,17,0,24,0,30,0,42,0,49,0,7,0,11,0,15,0,21,0,29,0,36,0,47,0,53,0,12,0,16,0,20,0,27,0,34,0,43,0,52,0,57,0,18,0,23,0,28,0,35,0,41,0,48,0,56,0,60,0,25,0,32,0,39,0,45,0,50,0,55,0,59,0,62,0,33,0,40,0,46,0,51,0,54,0,58,0,61,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,1,0,8,0,1,0,1,0,9,0,16,0,16,0,16,0,2,0,9,0,2,0,2,0,10,0,17,0,17,0,24,0,24,0,24,0,3,0,10,0,3,0,3,0,18,0,25,0,25,0,32,0,11,0,18,0,32,0,32,0,4,0,11,0,26,0,33,0,19,0,26,0,4,0,4,0,33,0,40,0,12,0,19,0,40,0,40,0,5,0,12,0,27,0,34,0,34,0,41,0,20,0,27,0,13,0,20,0,5,0,5,0,41,0,48,0,48,0,48,0,28,0,35,0,35,0,42,0,21,0,28,0,6,0,6,0,6,0,13,0,42,0,49,0,49,0,56,0,36,0,43,0,14,0,21,0,29,0,36,0,7,0,14,0,43,0,50,0,50,0,57,0,22,0,29,0,37,0,44,0,15,0,22,0,44,0,51,0,51,0,58,0,30,0,37,0,23,0,30,0,52,0,59,0,45,0,52,0,38,0,45,0,31,0,38,0,53,0,60,0,46,0,53,0,39,0,46,0,54,0,61,0,47,0,54,0,55,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,1,0,32,0,17,0,2,0,48,0,33,0,18,0,3,0,64,0,34,0,49,0,19,0,65,0,80,0,50,0,4,0,35,0,66,0,20,0,81,0,96,0,51,0,5,0,36,0,82,0,97,0,67,0,112,0,21,0,52,0,98,0,37,0,83,0,113,0,6,0,68,0,128,0,53,0,22,0,99,0,114,0,84,0,7,0,129,0,38,0,69,0,100,0,115,0,144,0,130,0,85,0,54,0,23,0,8,0,145,0,39,0,70,0,116,0,101,0,131,0,160,0,146,0,55,0,86,0,24,0,71,0,132,0,117,0,161,0,40,0,9,0,102,0,147,0,176,0,162,0,87,0,56,0,25,0,133,0,118,0,177,0,148,0,72,0,103,0,41,0,163,0,10,0,192,0,178,0,88,0,57,0,134,0,149,0,119,0,26,0,164,0,73,0,104,0,193,0,42,0,179,0,208,0,11,0,135,0,89,0,165,0,120,0,150,0,58,0,194,0,180,0,27,0,74,0,209,0,105,0,151,0,136,0,43,0,90,0,224,0,166,0,195,0,181,0,121,0,210,0,59,0,12,0,152,0,106,0,167,0,196,0,75,0,137,0,225,0,211,0,240,0,182,0,122,0,91,0,28,0,197,0,13,0,226,0,168,0,183,0,153,0,44,0,212,0,138,0,107,0,241,0,60,0,29,0,123,0,198,0,184,0,227,0,169,0,242,0,76,0,213,0,154,0,45,0,92,0,14,0,199,0,139,0,61,0,228,0,214,0,170,0,185,0,243,0,108,0,77,0,155,0,30,0,15,0,200,0,229,0,124,0,215,0,244,0,93,0,46,0,186,0,171,0,201,0,109,0,140,0,230,0,62,0,216,0,245,0,31,0,125,0,78,0,156,0,231,0,47,0,187,0,202,0,217,0,94,0,246,0,141,0,63,0,232,0,172,0,110,0,247,0,157,0,79,0,218,0,203,0,126,0,233,0,188,0,248,0,95,0,173,0,142,0,219,0,111,0,249,0,234,0,158,0,127,0,189,0,204,0,250,0,235,0,143,0,174,0,220,0,205,0,159,0,251,0,190,0,221,0,175,0,236,0,237,0,191,0,206,0,252,0,222,0,253,0,207,0,238,0,223,0,254,0,239,0,255,0,0,0,2,0,5,0,9,0,17,0,24,0,36,0,44,0,55,0,72,0,88,0,104,0,128,0,143,0,166,0,179,0,1,0,4,0,8,0,13,0,20,0,30,0,40,0,54,0,66,0,79,0,96,0,113,0,141,0,154,0,178,0,196,0,3,0,7,0,11,0,18,0,25,0,33,0,46,0,57,0,71,0,86,0,101,0,119,0,148,0,164,0,186,0,201,0,6,0,12,0,16,0,23,0,31,0,39,0,53,0,64,0,78,0,92,0,110,0,127,0,153,0,169,0,193,0,208,0,10,0,14,0,19,0,28,0,37,0,47,0,58,0,67,0,84,0,98,0,114,0,133,0,161,0,176,0,198,0,214,0,15,0,21,0,26,0,34,0,43,0,52,0,65,0,77,0,91,0,106,0,120,0,140,0,165,0,185,0,205,0,221,0,22,0,27,0,32,0,41,0,48,0,60,0,73,0,85,0,99,0,116,0,130,0,151,0,175,0,190,0,211,0,225,0,29,0,35,0,42,0,49,0,59,0,69,0,81,0,95,0,108,0,125,0,139,0,155,0,182,0,197,0,217,0,229,0,38,0,45,0,51,0,61,0,68,0,80,0,93,0,105,0,118,0,134,0,150,0,168,0,191,0,207,0,223,0,234,0,50,0,56,0,63,0,74,0,83,0,94,0,109,0,117,0,129,0,147,0,163,0,177,0,199,0,213,0,228,0,238,0,62,0,70,0,76,0,87,0,97,0,107,0,122,0,131,0,145,0,159,0,172,0,188,0,210,0,222,0,235,0,242,0,75,0,82,0,90,0,102,0,112,0,124,0,138,0,146,0,157,0,173,0,187,0,202,0,219,0,230,0,240,0,245,0,89,0,100,0,111,0,123,0,132,0,142,0,156,0,167,0,180,0,189,0,203,0,216,0,231,0,237,0,246,0,250,0,103,0,115,0,126,0,136,0,149,0,162,0,171,0,183,0,194,0,204,0,215,0,224,0,236,0,241,0,248,0,252,0,121,0,135,0,144,0,158,0,170,0,181,0,192,0,200,0,209,0,218,0,227,0,233,0,243,0,244,0,251,0,254,0,137,0,152,0,160,0,174,0,184,0,195,0,206,0,212,0,220,0,226,0,232,0,239,0,247,0,249,0,253,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,1,0,16,0,1,0,1,0,32,0,32,0,17,0,32,0,2,0,17,0,2,0,2,0,48,0,48,0,18,0,33,0,33,0,48,0,3,0,18,0,49,0,64,0,64,0,64,0,34,0,49,0,3,0,3,0,19,0,34,0,50,0,65,0,4,0,19,0,65,0,80,0,80,0,80,0,35,0,50,0,4,0,4,0,20,0,35,0,66,0,81,0,81,0,96,0,51,0,66,0,96,0,96,0,5,0,20,0,36,0,51,0,82,0,97,0,21,0,36,0,67,0,82,0,97,0,112,0,5,0,5,0,52,0,67,0,112,0,112,0,37,0,52,0,6,0,21,0,83,0,98,0,98,0,113,0,68,0,83,0,6,0,6,0,113,0,128,0,22,0,37,0,53,0,68,0,84,0,99,0,99,0,114,0,128,0,128,0,114,0,129,0,69,0,84,0,38,0,53,0,7,0,22,0,7,0,7,0,129,0,144,0,23,0,38,0,54,0,69,0,100,0,115,0,85,0,100,0,115,0,130,0,144,0,144,0,130,0,145,0,39,0,54,0,70,0,85,0,8,0,23,0,55,0,70,0,116,0,131,0,101,0,116,0,145,0,160,0,24,0,39,0,8,0,8,0,86,0,101,0,131,0,146,0,160,0,160,0,146,0,161,0,71,0,86,0,40,0,55,0,9,0,24,0,117,0,132,0,102,0,117,0,161,0,176,0,132,0,147,0,56,0,71,0,87,0,102,0,25,0,40,0,147,0,162,0,9,0,9,0,176,0,176,0,162,0,177,0,72,0,87,0,41,0,56,0,118,0,133,0,133,0,148,0,103,0,118,0,10,0,25,0,148,0,163,0,57,0,72,0,88,0,103,0,177,0,192,0,26,0,41,0,163,0,178,0,192,0,192,0,10,0,10,0,119,0,134,0,73,0,88,0,149,0,164,0,104,0,119,0,134,0,149,0,42,0,57,0,178,0,193,0,164,0,179,0,11,0,26,0,58,0,73,0,193,0,208,0,89,0,104,0,135,0,150,0,120,0,135,0,27,0,42,0,74,0,89,0,208,0,208,0,150,0,165,0,179,0,194,0,165,0,180,0,105,0,120,0,194,0,209,0,43,0,58,0,11,0,11,0,136,0,151,0,90,0,105,0,151,0,166,0,180,0,195,0,59,0,74,0,121,0,136,0,209,0,224,0,195,0,210,0,224,0,224,0,166,0,181,0,106,0,121,0,75,0,90,0,12,0,27,0,181,0,196,0,12,0,12,0,210,0,225,0,152,0,167,0,167,0,182,0,137,0,152,0,28,0,43,0,196,0,211,0,122,0,137,0,91,0,106,0,225,0,240,0,44,0,59,0,13,0,28,0,107,0,122,0,182,0,197,0,168,0,183,0,211,0,226,0,153,0,168,0,226,0,241,0,60,0,75,0,197,0,212,0,138,0,153,0,29,0,44,0,76,0,91,0,13,0,13,0,183,0,198,0,123,0,138,0,45,0,60,0,212,0,227,0,198,0,213,0,154,0,169,0,169,0,184,0,227,0,242,0,92,0,107,0,61,0,76,0,139,0,154,0,14,0,29,0,14,0,14,0,184,0,199,0,213,0,228,0,108,0,123,0,199,0,214,0,228,0,243,0,77,0,92,0,30,0,45,0,170,0,185,0,155,0,170,0,185,0,200,0,93,0,108,0,124,0,139,0,214,0,229,0,46,0,61,0,200,0,215,0,229,0,244,0,15,0,30,0,109,0,124,0,62,0,77,0,140,0,155,0,215,0,230,0,31,0,46,0,171,0,186,0,186,0,201,0,201,0,216,0,78,0,93,0,230,0,245,0,125,0,140,0,47,0,62,0,216,0,231,0,156,0,171,0,94,0,109,0,231,0,246,0,141,0,156,0,63,0,78,0,202,0,217,0,187,0,202,0,110,0,125,0,217,0,232,0,172,0,187,0,232,0,247,0,79,0,94,0,157,0,172,0,126,0,141,0,203,0,218,0,95,0,110,0,233,0,248,0,218,0,233,0,142,0,157,0,111,0,126,0,173,0,188,0,188,0,203,0,234,0,249,0,219,0,234,0,127,0,142,0,158,0,173,0,204,0,219,0,189,0,204,0,143,0,158,0,235,0,250,0,174,0,189,0,205,0,220,0,159,0,174,0,220,0,235,0,221,0,236,0,175,0,190,0,190,0,205,0,236,0,251,0,206,0,221,0,237,0,252,0,191,0,206,0,222,0,237,0,207,0,222,0,238,0,253,0,223,0,238,0,239,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,1,0,64,0,33,0,2,0,96,0,65,0,34,0,128,0,3,0,97,0,66,0,160,0,129,0,35,0,98,0,4,0,67,0,130,0,161,0,192,0,36,0,99,0,224,0,5,0,162,0,193,0,68,0,131,0,37,0,100,0,225,0,194,0,0,1,163,0,69,0,132,0,6,0,226,0,1,1,32,1,195,0,101,0,164,0,38,0,2,1,7,0,227,0,33,1,133,0,64,1,70,0,196,0,165,0,34,1,3,1,228,0,39,0,65,1,102,0,96,1,8,0,197,0,71,0,134,0,66,1,35,1,4,1,97,1,128,1,229,0,166,0,103,0,40,0,98,1,67,1,36,1,135,0,129,1,198,0,5,1,72,0,9,0,160,1,167,0,130,1,99,1,230,0,68,1,104,0,37,1,41,0,161,1,199,0,136,0,6,1,131,1,192,1,69,1,100,1,10,0,73,0,162,1,231,0,168,0,193,1,38,1,132,1,105,0,163,1,7,1,42,0,200,0,101,1,194,1,137,0,224,1,74,0,70,1,232,0,11,0,133,1,169,0,39,1,164,1,106,0,195,1,225,1,102,1,8,1,71,1,201,0,43,0,138,0,0,2,226,1,134,1,40,1,233,0,170,0,165,1,75,0,196,1,103,1,12,0,1,2,9,1,227,1,72,1,107,0,202,0,2,2,32,2,166,1,135,1,197,1,139,0,44,0,234,0,228,1,41,1,104,1,171,0,76,0,3,2,33,2,10,1,73,1,198,1,13,0,167,1,203,0,108,0,34,2,229,1,64,2,42,1,235,0,140,0,105,1,74,1,172,0,35,2,45,0,199,1,11,1,65,2,230,1,77,0,204,0,106,1,96,2,14,0,43,1,66,2,109,0,236,0,231,1,97,2,75,1,141,0,67,2,46,0,15,0,173,0,98,2,107,1,78,0,205,0,16,0,110,0,237,0,99,2,142,0,47,0,174,0,79,0,206,0,17,0,111,0,238,0,48,0,143,0,80,0,175,0,112,0,207,0,49,0,18,0,239,0,81,0,113,0,19,0,50,0,82,0,114,0,51,0,83,0,115,0,128,2,4,2,136,1,12,1,144,0,20,0,160,2,129,2,36,2,5,2,168,1,137,1,44,1,13,1,176,0,145,0,52,0,21,0,192,2,161,2,130,2,68,2,37,2,6,2,200,1,169,1,138,1,76,1,45,1,14,1,208,0,177,0,146,0,84,0,53,0,22,0,224,2,193,2,162,2,131,2,100,2,69,2,38,2,7,2,232,1,201,1,170,1,139,1,108,1,77,1,46,1,15,1,240,0,209,0,178,0,147,0,116,0,85,0,54,0,23,0,225,2,194,2,163,2,101,2,70,2,39,2,233,1,202,1,171,1,109,1,78,1,47,1,241,0,210,0,179,0,117,0,86,0,55,0,226,2,195,2,102,2,71,2,234,1,203,1,110,1,79,1,242,0,211,0,118,0,87,0,227,2,103,2,235,1,111,1,243,0,119,0,0,3,132,2,8,2,140,1,16,1,148,0,24,0,32,3,1,3,164,2,133,2,40,2,9,2,172,1,141,1,48,1,17,1,180,0,149,0,56,0,25,0,64,3,33,3,2,3,196,2,165,2,134,2,72,2,41,2,10,2,204,1,173,1,142,1,80,1,49,1,18,1,212,0,181,0,150,0,88,0,57,0,26,0,96,3,65,3,34,3,3,3,228,2,197,2,166,2,135,2,104,2,73,2,42,2,11,2,236,1,205,1,174,1,143,1,112,1,81,1,50,1,19,1,244,0,213,0,182,0,151,0,120,0,89,0,58,0,27,0,97,3,66,3,35,3,229,2,198,2,167,2,105,2,74,2,43,2,237,1,206,1,175,1,113,1,82,1,51,1,245,0,214,0,183,0,121,0,90,0,59,0,98,3,67,3,230,2,199,2,106,2,75,2,238,1,207,1,114,1,83,1,246,0,215,0,122,0,91,0,99,3,231,2,107,2,239,1,115,1,247,0,123,0,128,3,4,3,136,2,12,2,144,1,20,1,152,0,28,0,160,3,129,3,36,3,5,3,168,2,137,2,44,2,13,2,176,1,145,1,52,1,21,1,184,0,153,0,60,0,29,0,192,3,161,3,130,3,68,3,37,3,6,3,200,2,169,2,138,2,76,2,45,2,14,2,208,1,177,1,146,1,84,1,53,1,22,1,216,0,185,0,154,0,92,0,61,0,30,0,224,3,193,3,162,3,131,3,100,3,69,3,38,3,7,3,232,2,201,2,170,2,139,2,108,2,77,2,46,2,15,2,240,1,209,1,178,1,147,1,116,1,85,1,54,1,23,1,248,0,217,0,186,0,155,0,124,0,93,0,62,0,31,0,225,3,194,3,163,3,101,3,70,3,39,3,233,2,202,2,171,2,109,2,78,2,47,2,241,1,210,1,179,1,117,1,86,1,55,1,249,0,218,0,187,0,125,0,94,0,63,0,226,3,195,3,102,3,71,3,234,2,203,2,110,2,79,2,242,1,211,1,118,1,87,1,250,0,219,0,126,0,95,0,227,3,103,3,235,2,111,2,243,1,119,1,251,0,127,0,132,3,8,3,140,2,16,2,148,1,24,1,156,0,164,3,133,3,40,3,9,3,172,2,141,2,48,2,17,2,180,1,149,1,56,1,25,1,188,0,157,0,196,3,165,3,134,3,72,3,41,3,10,3,204,2,173,2,142,2,80,2,49,2,18,2,212,1,181,1,150,1,88,1,57,1,26,1,220,0,189,0,158,0,228,3,197,3,166,3,135,3,104,3,73,3,42,3,11,3,236,2,205,2,174,2,143,2,112,2,81,2,50,2,19,2,244,1,213,1,182,1,151,1,120,1,89,1,58,1,27,1,252,0,221,0,190,0,159,0,229,3,198,3,167,3,105,3,74,3,43,3,237,2,206,2,175,2,113,2,82,2,51,2,245,1,214,1,183,1,121,1,90,1,59,1,253,0,222,0,191,0,230,3,199,3,106,3,75,3,238,2,207,2,114,2,83,2,246,1,215,1,122,1,91,1,254,0,223,0,231,3,107,3,239,2,115,2,247,1,123,1,255,0,136,3,12,3,144,2,20,2,152,1,28,1,168,3,137,3,44,3,13,3,176,2,145,2,52,2,21,2,184,1,153,1,60,1,29,1,200,3,169,3,138,3,76,3,45,3,14,3,208,2,177,2,146,2,84,2,53,2,22,2,216,1,185,1,154,1,92,1,61,1,30,1,232,3,201,3,170,3,139,3,108,3,77,3,46,3,15,3,240,2,209,2,178,2,147,2,116,2,85,2,54,2,23,2,248,1,217,1,186,1,155,1,124,1,93,1,62,1,31,1,233,3,202,3,171,3,109,3,78,3,47,3,241,2,210,2,179,2,117,2,86,2,55,2,249,1,218,1,187,1,125,1,94,1,63,1,234,3,203,3,110,3,79,3,242,2,211,2,118,2,87,2,250,1,219,1,126,1,95,1,235,3,111,3,243,2,119,2,251,1,127,1,140,3,16,3,148,2,24,2,156,1,172,3,141,3,48,3,17,3,180,2,149,2,56,2,25,2,188,1,157,1,204,3,173,3,142,3,80,3,49,3,18,3,212,2,181,2,150,2,88,2,57,2,26,2,220,1,189,1,158,1,236,3,205,3,174,3,143,3,112,3,81,3,50,3,19,3,244,2,213,2,182,2,151,2,120,2,89,2,58,2,27,2,252,1,221,1,190,1,159,1,237,3,206,3,175,3,113,3,82,3,51,3,245,2,214,2,183,2,121,2,90,2,59,2,253,1,222,1,191,1,238,3,207,3,114,3,83,3,246,2,215,2,122,2,91,2,254,1,223,1,239,3,115,3,247,2,123,2,255,1,144,3,20,3,152,2,28,2,176,3,145,3,52,3,21,3,184,2,153,2,60,2,29,2,208,3,177,3,146,3,84,3,53,3,22,3,216,2,185,2,154,2,92,2,61,2,30,2,240,3,209,3,178,3,147,3,116,3,85,3,54,3,23,3,248,2,217,2,186,2,155,2,124,2,93,2,62,2,31,2,241,3,210,3,179,3,117,3,86,3,55,3,249,2,218,2,187,2,125,2,94,2,63,2,242,3,211,3,118,3,87,3,250,2,219,2,126,2,95,2,243,3,119,3,251,2,127,2,148,3,24,3,156,2,180,3,149,3,56,3,25,3,188,2,157,2,212,3,181,3,150,3,88,3,57,3,26,3,220,2,189,2,158,2,244,3,213,3,182,3,151,3,120,3,89,3,58,3,27,3,252,2,221,2,190,2,159,2,245,3,214,3,183,3,121,3,90,3,59,3,253,2,222,2,191,2,246,3,215,3,122,3,91,3,254,2,223,2,247,3,123,3,255,2,152,3,28,3,184,3,153,3,60,3,29,3,216,3,185,3,154,3,92,3,61,3,30,3,248,3,217,3,186,3,155,3,124,3,93,3,62,3,31,3,249,3,218,3,187,3,125,3,94,3,63,3,250,3,219,3,126,3,95,3,251,3,127,3,156,3,188,3,157,3,220,3,189,3,158,3,252,3,221,3,190,3,159,3,253,3,222,3,191,3,254,3,223,3,255,3,0,0,2,0,5,0,10,0,17,0,25,0,38,0,47,0,62,0,83,0,101,0,121,0,145,0,170,0,193,0,204,0,210,0,219,0,229,0,233,0,245,0,1,1,19,1,43,1,86,1,100,1,121,1,149,1,199,1,215,1,239,1,15,2,1,0,4,0,8,0,15,0,22,0,30,0,45,0,58,0,74,0,92,0,112,0,133,0,158,0,184,0,203,0,215,0,222,0,228,0,234,0,237,0,0,1,18,1,42,1,61,1,99,1,120,1,148,1,170,1,214,1,238,1,14,2,39,2,3,0,7,0,12,0,18,0,28,0,36,0,52,0,64,0,82,0,102,0,118,0,142,0,164,0,189,0,208,0,217,0,224,0,231,0,235,0,238,0,17,1,41,1,60,1,73,1,119,1,147,1,169,1,184,1,237,1,13,2,38,2,55,2,6,0,11,0,16,0,23,0,31,0,43,0,60,0,73,0,90,0,109,0,126,0,150,0,173,0,196,0,211,0,220,0,226,0,232,0,236,0,239,0,40,1,59,1,72,1,79,1,146,1,168,1,183,1,191,1,12,2,37,2,54,2,63,2,9,0,14,0,19,0,29,0,37,0,50,0,65,0,78,0,95,0,116,0,134,0,157,0,179,0,201,0,214,0,223,0,244,0,255,0,16,1,39,1,85,1,98,1,118,1,145,1,198,1,213,1,236,1,11,2,70,2,84,2,105,2,133,2,13,0,20,0,26,0,35,0,44,0,54,0,72,0,85,0,105,0,123,0,140,0,163,0,182,0,205,0,216,0,225,0,254,0,15,1,38,1,58,1,97,1,117,1,144,1,167,1,212,1,235,1,10,2,36,2,83,2,104,2,132,2,154,2,21,0,27,0,33,0,42,0,53,0,63,0,80,0,94,0,113,0,132,0,151,0,172,0,190,0,209,0,218,0,227,0,14,1,37,1,57,1,71,1,116,1,143,1,166,1,182,1,234,1,9,2,35,2,53,2,103,2,131,2,153,2,168,2,24,0,32,0,39,0,48,0,57,0,71,0,88,0,104,0,120,0,139,0,159,0,178,0,197,0,212,0,221,0,230,0,36,1,56,1,70,1,78,1,142,1,165,1,181,1,190,1,8,2,34,2,52,2,62,2,130,2,152,2,167,2,175,2,34,0,40,0,46,0,56,0,68,0,81,0,96,0,111,0,130,0,147,0,167,0,186,0,243,0,253,0,13,1,35,1,84,1,96,1,115,1,141,1,197,1,211,1,233,1,7,2,69,2,82,2,102,2,129,2,181,2,193,2,211,2,235,2,41,0,49,0,55,0,67,0,77,0,91,0,107,0,124,0,138,0,161,0,177,0,194,0,252,0,12,1,34,1,55,1,95,1,114,1,140,1,164,1,210,1,232,1,6,2,33,2,81,2,101,2,128,2,151,2,192,2,210,2,234,2,253,2,51,0,59,0,66,0,76,0,89,0,99,0,119,0,131,0,149,0,168,0,181,0,200,0,11,1,33,1,54,1,69,1,113,1,139,1,163,1,180,1,231,1,5,2,32,2,51,2,100,2,127,2,150,2,166,2,209,2,233,2,252,2,9,3,61,0,69,0,75,0,87,0,100,0,114,0,129,0,144,0,162,0,180,0,191,0,207,0,32,1,53,1,68,1,77,1,138,1,162,1,179,1,189,1,4,2,31,2,50,2,61,2,126,2,149,2,165,2,174,2,232,2,251,2,8,3,15,3,70,0,79,0,86,0,97,0,108,0,122,0,137,0,155,0,242,0,251,0,10,1,31,1,83,1,94,1,112,1,137,1,196,1,209,1,230,1,3,2,68,2,80,2,99,2,125,2,180,2,191,2,208,2,231,2,20,3,30,3,45,3,65,3,84,0,93,0,103,0,110,0,125,0,141,0,154,0,171,0,250,0,9,1,30,1,52,1,93,1,111,1,136,1,161,1,208,1,229,1,2,2,30,2,79,2,98,2,124,2,148,2,190,2,207,2,230,2,250,2,29,3,44,3,64,3,80,3,98,0,106,0,115,0,127,0,143,0,156,0,169,0,185,0,8,1,29,1,51,1,67,1,110,1,135,1,160,1,178,1,228,1,1,2,29,2,49,2,97,2,123,2,147,2,164,2,206,2,229,2,249,2,7,3,43,3,63,3,79,3,90,3,117,0,128,0,136,0,148,0,160,0,175,0,188,0,198,0,28,1,50,1,66,1,76,1,134,1,159,1,177,1,188,1,0,2,28,2,48,2,60,2,122,2,146,2,163,2,173,2,228,2,248,2,6,3,14,3,62,3,78,3,89,3,95,3,135,0,146,0,152,0,165,0,241,0,249,0,7,1,27,1,82,1,92,1,109,1,133,1,195,1,207,1,227,1,255,1,67,2,78,2,96,2,121,2,179,2,189,2,205,2,227,2,19,3,28,3,42,3,61,3,99,3,107,3,119,3,135,3,153,0,166,0,174,0,183,0,248,0,6,1,26,1,49,1,91,1,108,1,132,1,158,1,206,1,226,1,254,1,27,2,77,2,95,2,120,2,145,2,188,2,204,2,226,2,247,2,27,3,41,3,60,3,77,3,106,3,118,3,134,3,147,3,176,0,187,0,195,0,202,0,5,1,25,1,48,1,65,1,107,1,131,1,157,1,176,1,225,1,253,1,26,2,47,2,94,2,119,2,144,2,162,2,203,2,225,2,246,2,5,3,40,3,59,3,76,3,88,3,117,3,133,3,146,3,155,3,192,0,199,0,206,0,213,0,24,1,47,1,64,1,75,1,130,1,156,1,175,1,187,1,252,1,25,2,46,2,59,2,118,2,143,2,161,2,172,2,224,2,245,2,4,3,13,3,58,3,75,3,87,3,94,3,132,3,145,3,154,3,159,3,240,0,247,0,4,1,23,1,81,1,90,1,106,1,129,1,194,1,205,1,224,1,251,1,66,2,76,2,93,2,117,2,178,2,187,2,202,2,223,2,18,3,26,3,39,3,57,3,98,3,105,3,116,3,131,3,162,3,168,3,177,3,189,3,246,0,3,1,22,1,46,1,89,1,105,1,128,1,155,1,204,1,223,1,250,1,24,2,75,2,92,2,116,2,142,2,186,2,201,2,222,2,244,2,25,3,38,3,56,3,74,3,104,3,115,3,130,3,144,3,167,3,176,3,188,3,198,3,2,1,21,1,45,1,63,1,104,1,127,1,154,1,174,1,222,1,249,1,23,2,45,2,91,2,115,2,141,2,160,2,200,2,221,2,243,2,3,3,37,3,55,3,73,3,86,3,114,3,129,3,143,3,153,3,175,3,187,3,197,3,204,3,20,1,44,1,62,1,74,1,126,1,153,1,173,1,186,1,248,1,22,2,44,2,58,2,114,2,140,2,159,2,171,2,220,2,242,2,2,3,12,3,54,3,72,3,85,3,93,3,128,3,142,3,152,3,158,3,186,3,196,3,203,3,207,3,80,1,88,1,103,1,125,1,193,1,203,1,221,1,247,1,65,2,74,2,90,2,113,2,177,2,185,2,199,2,219,2,17,3,24,3,36,3,53,3,97,3,103,3,113,3,127,3,161,3,166,3,174,3,185,3,209,3,213,3,219,3,227,3,87,1,102,1,124,1,152,1,202,1,220,1,246,1,21,2,73,2,89,2,112,2,139,2,184,2,198,2,218,2,241,2,23,3,35,3,52,3,71,3,102,3,112,3,126,3,141,3,165,3,173,3,184,3,195,3,212,3,218,3,226,3,233,3,101,1,123,1,151,1,172,1,219,1,245,1,20,2,43,2,88,2,111,2,138,2,158,2,197,2,217,2,240,2,1,3,34,3,51,3,70,3,84,3,111,3,125,3,140,3,151,3,172,3,183,3,194,3,202,3,217,3,225,3,232,3,237,3,122,1,150,1,171,1,185,1,244,1,19,2,42,2,57,2,110,2,137,2,157,2,170,2,216,2,239,2,0,3,11,3,50,3,69,3,83,3,92,3,124,3,139,3,150,3,157,3,182,3,193,3,201,3,206,3,224,3,231,3,236,3,239,3,192,1,201,1,218,1,243,1,64,2,72,2,87,2,109,2,176,2,183,2,196,2,215,2,16,3,22,3,33,3,49,3,96,3,101,3,110,3,123,3,160,3,164,3,171,3,181,3,208,3,211,3,216,3,223,3,240,3,242,3,245,3,249,3,200,1,217,1,242,1,18,2,71,2,86,2,108,2,136,2,182,2,195,2,214,2,238,2,21,3,32,3,48,3,68,3,100,3,109,3,122,3,138,3,163,3,170,3,180,3,192,3,210,3,215,3,222,3,230,3,241,3,244,3,248,3,252,3,216,1,241,1,17,2,41,2,85,2,107,2,135,2,156,2,194,2,213,2,237,2,255,2,31,3,47,3,67,3,82,3,108,3,121,3,137,3,149,3,169,3,179,3,191,3,200,3,214,3,221,3,229,3,235,3,243,3,247,3,251,3,254,3,240,1,16,2,40,2,56,2,106,2,134,2,155,2,169,2,212,2,236,2,254,2,10,3,46,3,66,3,81,3,91,3,120,3,136,3,148,3,156,3,178,3,190,3,199,3,205,3,220,3,228,3,234,3,238,3,246,3,250,3,253,3,255,3,0,0,0,0,0,0,0,0,0,0,0,0,32,0,32,0,1,0,32,0,1,0,1,0,64,0,64,0,33,0,64,0,2,0,33,0,96,0,96,0,2,0,2,0,65,0,96,0,34,0,65,0,128,0,128,0,97,0,128,0,3,0,34,0,66,0,97,0,3,0,3,0,35,0,66,0,98,0,129,0,129,0,160,0,160,0,160,0,4,0,35,0,67,0,98,0,192,0,192,0,4,0,4,0,130,0,161,0,161,0,192,0,36,0,67,0,99,0,130,0,5,0,36,0,68,0,99,0,193,0,224,0,162,0,193,0,224,0,224,0,131,0,162,0,37,0,68,0,100,0,131,0,5,0,5,0,194,0,225,0,225,0,0,1,0,1,0,1,163,0,194,0,69,0,100,0,132,0,163,0,6,0,37,0,226,0,1,1,6,0,6,0,195,0,226,0,1,1,32,1,101,0,132,0,32,1,32,1,38,0,69,0,164,0,195,0,133,0,164,0,2,1,33,1,227,0,2,1,196,0,227,0,7,0,38,0,33,1,64,1,70,0,101,0,64,1,64,1,7,0,7,0,165,0,196,0,39,0,70,0,102,0,133,0,34,1,65,1,3,1,34,1,228,0,3,1,65,1,96,1,96,1,96,1,197,0,228,0,134,0,165,0,71,0,102,0,8,0,39,0,66,1,97,1,35,1,66,1,4,1,35,1,103,0,134,0,97,1,128,1,166,0,197,0,229,0,4,1,40,0,71,0,8,0,8,0,128,1,128,1,135,0,166,0,98,1,129,1,67,1,98,1,198,0,229,0,36,1,67,1,72,0,103,0,5,1,36,1,9,0,40,0,129,1,160,1,167,0,198,0,104,0,135,0,230,0,5,1,99,1,130,1,160,1,160,1,37,1,68,1,68,1,99,1,9,0,9,0,41,0,72,0,130,1,161,1,199,0,230,0,136,0,167,0,161,1,192,1,6,1,37,1,100,1,131,1,73,0,104,0,131,1,162,1,231,0,6,1,10,0,41,0,168,0,199,0,69,1,100,1,162,1,193,1,105,0,136,0,192,1,192,1,42,0,73,0,38,1,69,1,200,0,231,0,10,0,10,0,101,1,132,1,137,0,168,0,7,1,38,1,132,1,163,1,74,0,105,0,163,1,194,1,193,1,224,1,70,1,101,1,232,0,7,1,39,1,70,1,169,0,200,0,11,0,42,0,106,0,137,0,224,1,224,1,194,1,225,1,102,1,133,1,8,1,39,1,201,0,232,0,138,0,169,0,133,1,164,1,43,0,74,0,164,1,195,1,71,1,102,1,11,0,11,0,225,1,0,2,233,0,8,1,195,1,226,1,40,1,71,1,75,0,106,0,170,0,201,0,226,1,1,2,0,2,0,2,134,1,165,1,103,1,134,1,165,1,196,1,107,0,138,0,12,0,43,0,202,0,233,0,196,1,227,1,9,1,40,1,72,1,103,1,139,0,170,0,44,0,75,0,227,1,2,2,1,2,32,2,234,0,9,1,41,1,72,1,166,1,197,1,12,0,12,0,135,1,166,1,171,0,202,0,76,0,107,0,2,2,33,2,197,1,228,1,32,2,32,2,10,1,41,1,203,0,234,0,108,0,139,0,73,1,104,1,42,1,73,1,140,0,171,0,3,2,34,2,13,0,44,0,167,1,198,1],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([235,0,10,1,33,2,64,2,198,1,229,1,45,0,76,0,172,0,203,0,74,1,105,1,64,2,64,2,13,0,13,0,11,1,42,1,34,2,65,2,77,0,108,0,204,0,235,0,199,1,230,1,65,2,96,2,43,1,74,1,109,0,140,0,35,2,66,2,14,0,45,0,14,0,14,0,141,0,172,0,66,2,97,2,75,1,106,1,46,0,77,0,173,0,204,0,15,0,15,0,78,0,109,0,205,0,236,0,67,2,98,2,110,0,141,0,15,0,46,0,142,0,173,0,47,0,78,0,174,0,205,0,16,0,16,0,79,0,110,0,206,0,237,0,16,0,47,0,111,0,142,0,48,0,79,0,143,0,174,0,80,0,111,0,175,0,206,0,17,0,48,0,17,0,17,0,207,0,238,0,49,0,80,0,81,0,112,0,18,0,18,0,18,0,49,0,50,0,81,0,82,0,113,0,19,0,50,0,51,0,82,0,83,0,114,0,96,2,96,2,228,1,3,2,104,1,135,1,236,0,11,1,112,0,143,0,19,0,19,0,128,2,128,2,97,2,128,2,4,2,35,2,229,1,4,2,136,1,167,1,105,1,136,1,12,1,43,1,237,0,12,1,144,0,175,0,113,0,144,0,20,0,51,0,20,0,20,0,160,2,160,2,129,2,160,2,98,2,129,2,36,2,67,2,5,2,36,2,230,1,5,2,168,1,199,1,137,1,168,1,106,1,137,1,44,1,75,1,13,1,44,1,238,0,13,1,176,0,207,0,145,0,176,0,114,0,145,0,52,0,83,0,21,0,52,0,21,0,21,0,192,2,192,2,161,2,192,2,130,2,161,2,99,2,130,2,68,2,99,2,37,2,68,2,6,2,37,2,231,1,6,2,200,1,231,1,169,1,200,1,138,1,169,1,107,1,138,1,76,1,107,1,45,1,76,1,14,1,45,1,239,0,14,1,208,0,239,0,177,0,208,0,146,0,177,0,115,0,146,0,84,0,115,0,53,0,84,0,22,0,53,0,22,0,22,0,193,2,224,2,162,2,193,2,131,2,162,2,69,2,100,2,38,2,69,2,7,2,38,2,201,1,232,1,170,1,201,1,139,1,170,1,77,1,108,1,46,1,77,1,15,1,46,1,209,0,240,0,178,0,209,0,147,0,178,0,85,0,116,0,54,0,85,0,23,0,54,0,194,2,225,2,163,2,194,2,70,2,101,2,39,2,70,2,202,1,233,1,171,1,202,1,78,1,109,1,47,1,78,1,210,0,241,0,179,0,210,0,86,0,117,0,55,0,86,0,195,2,226,2,71,2,102,2,203,1,234,1,79,1,110,1,211,0,242,0,87,0,118,0,224,2,224,2,100,2,131,2,232,1,7,2,108,1,139,1,240,0,15,1,116,0,147,0,23,0,23,0,0,3,0,3,225,2,0,3,132,2,163,2,101,2,132,2,8,2,39,2,233,1,8,2,140,1,171,1,109,1,140,1,16,1,47,1,241,0,16,1,148,0,179,0,117,0,148,0,24,0,55,0,24,0,24,0,32,3,32,3,1,3,32,3,226,2,1,3,164,2,195,2,133,2,164,2,102,2,133,2,40,2,71,2,9,2,40,2,234,1,9,2,172,1,203,1,141,1,172,1,110,1,141,1,48,1,79,1,17,1,48,1,242,0,17,1,180,0,211,0,149,0,180,0,118,0,149,0,56,0,87,0,25,0,56,0,25,0,25,0,64,3,64,3,33,3,64,3,2,3,33,3,227,2,2,3,196,2,227,2,165,2,196,2,134,2,165,2,103,2,134,2,72,2,103,2,41,2,72,2,10,2,41,2,235,1,10,2,204,1,235,1,173,1,204,1,142,1,173,1,111,1,142,1,80,1,111,1,49,1,80,1,18,1,49,1,243,0,18,1,212,0,243,0,181,0,212,0,150,0,181,0,119,0,150,0,88,0,119,0,57,0,88,0,26,0,57,0,26,0,26,0,65,3,96,3,34,3,65,3,3,3,34,3,197,2,228,2,166,2,197,2,135,2,166,2,73,2,104,2,42,2,73,2,11,2,42,2,205,1,236,1,174,1,205,1,143,1,174,1,81,1,112,1,50,1,81,1,19,1,50,1,213,0,244,0,182,0,213,0,151,0,182,0,89,0,120,0,58,0,89,0,27,0,58,0,66,3,97,3,35,3,66,3,198,2,229,2,167,2,198,2,74,2,105,2,43,2,74,2,206,1,237,1,175,1,206,1,82,1,113,1,51,1,82,1,214,0,245,0,183,0,214,0,90,0,121,0,59,0,90,0,67,3,98,3,199,2,230,2,75,2,106,2,207,1,238,1,83,1,114,1,215,0,246,0,91,0,122,0,96,3,96,3,228,2,3,3,104,2,135,2,236,1,11,2,112,1,143,1,244,0,19,1,120,0,151,0,27,0,27,0,128,3,128,3,97,3,128,3,4,3,35,3,229,2,4,3,136,2,167,2,105,2,136,2,12,2,43,2,237,1,12,2,144,1,175,1,113,1,144,1,20,1,51,1,245,0,20,1,152,0,183,0,121,0,152,0,28,0,59,0,28,0,28,0,160,3,160,3,129,3,160,3,98,3,129,3,36,3,67,3,5,3,36,3,230,2,5,3,168,2,199,2,137,2,168,2,106,2,137,2,44,2,75,2,13,2,44,2,238,1,13,2,176,1,207,1,145,1,176,1,114,1,145,1,52,1,83,1,21,1,52,1,246,0,21,1,184,0,215,0,153,0,184,0,122,0,153,0,60,0,91,0,29,0,60,0,29,0,29,0,192,3,192,3,161,3,192,3,130,3,161,3,99,3,130,3,68,3,99,3,37,3,68,3,6,3,37,3,231,2,6,3,200,2,231,2,169,2,200,2,138,2,169,2,107,2,138,2,76,2,107,2,45,2,76,2,14,2,45,2,239,1,14,2,208,1,239,1,177,1,208,1,146,1,177,1,115,1,146,1,84,1,115,1,53,1,84,1,22,1,53,1,247,0,22,1,216,0,247,0,185,0,216,0,154,0,185,0,123,0,154,0,92,0,123,0,61,0,92,0,30,0,61,0,30,0,30,0,193,3,224,3,162,3,193,3,131,3,162,3,69,3,100,3,38,3,69,3,7,3,38,3,201,2,232,2,170,2,201,2,139,2,170,2,77,2,108,2,46,2,77,2,15,2,46,2,209,1,240,1,178,1,209,1,147,1,178,1,85,1,116,1,54,1,85,1,23,1,54,1,217,0,248,0,186,0,217,0,155,0,186,0,93,0,124,0,62,0,93,0,31,0,62,0,194,3,225,3,163,3,194,3,70,3,101,3,39,3,70,3,202,2,233,2,171,2,202,2,78,2,109,2,47,2,78,2,210,1,241,1,179,1,210,1,86,1,117,1,55,1,86,1,218,0,249,0,187,0,218,0,94,0,125,0,63,0,94,0,195,3,226,3,71,3,102,3,203,2,234,2,79,2,110,2,211,1,242,1,87,1,118,1,219,0,250,0,95,0,126,0,100,3,131,3,232,2,7,3,108,2,139,2,240,1,15,2,116,1,147,1,248,0,23,1,124,0,155,0,132,3,163,3,101,3,132,3,8,3,39,3,233,2,8,3,140,2,171,2,109,2,140,2,16,2,47,2,241,1,16,2,148,1,179,1,117,1,148,1,24,1,55,1,249,0,24,1,156,0,187,0,125,0,156,0,164,3,195,3,133,3,164,3,102,3,133,3,40,3,71,3,9,3,40,3,234,2,9,3,172,2,203,2,141,2,172,2,110,2,141,2,48,2,79,2,17,2,48,2,242,1,17,2,180,1,211,1,149,1,180,1,118,1,149,1,56,1,87,1,25,1,56,1,250,0,25,1,188,0,219,0,157,0,188,0,126,0,157,0,196,3,227,3,165,3,196,3,134,3,165,3,103,3,134,3,72,3,103,3,41,3,72,3,10,3,41,3,235,2,10,3,204,2,235,2,173,2,204,2,142,2,173,2,111,2,142,2,80,2,111,2,49,2,80,2,18,2,49,2,243,1,18,2,212,1,243,1,181,1,212,1,150,1,181,1,119,1,150,1,88,1,119,1,57,1,88,1,26,1,57,1,251,0,26,1,220,0,251,0,189,0,220,0,158,0,189,0,127,0,158,0,197,3,228,3,166,3,197,3,135,3,166,3,73,3,104,3,42,3,73,3,11,3,42,3,205,2,236,2,174,2,205,2,143,2,174,2,81,2,112,2,50,2,81,2,19,2,50,2,213,1,244,1,182,1,213,1,151,1,182,1,89,1,120,1,58,1,89,1,27,1,58,1,221,0,252,0,190,0,221,0,159,0,190,0,198,3,229,3,167,3,198,3,74,3,105,3,43,3,74,3,206,2,237,2,175,2,206,2,82,2,113,2,51,2,82,2,214,1,245,1,183,1,214,1,90,1,121,1,59,1,90,1,222,0,253,0,191,0,222,0,199,3,230,3,75,3,106,3,207,2,238,2,83,2,114,2,215,1,246,1,91,1,122,1,223,0,254,0,104,3,135,3,236,2,11,3,112,2,143,2,244,1,19,2,120,1,151,1,252,0,27,1,136,3,167,3,105,3,136,3,12,3,43,3,237,2,12,3,144,2,175,2,113,2,144,2,20,2,51,2,245,1,20,2,152,1,183,1,121,1,152,1,28,1,59,1,253,0,28,1,168,3,199,3,137,3,168,3,106,3,137,3,44,3,75,3,13,3,44,3,238,2,13,3,176,2,207,2,145,2,176,2,114,2,145,2,52,2,83,2,21,2,52,2,246,1,21,2,184,1,215,1,153,1,184,1,122,1,153,1,60,1,91,1,29,1,60,1,254,0,29,1,200,3,231,3,169,3,200,3,138,3,169,3,107,3,138,3,76,3,107,3,45,3,76,3,14,3,45,3,239,2,14,3,208,2,239,2,177,2,208,2,146,2,177,2,115,2,146,2,84,2,115,2,53,2,84,2,22,2,53,2,247,1,22,2,216,1,247,1,185,1,216,1,154,1,185,1,123,1,154,1,92,1,123,1,61,1,92,1,30,1,61,1,255,0,30,1,201,3,232,3,170,3,201,3,139,3,170,3,77,3,108,3,46,3,77,3,15,3,46,3,209,2,240,2,178,2,209,2,147,2,178,2,85,2,116,2,54,2,85,2,23,2,54,2,217,1,248,1,186,1,217,1,155,1,186,1,93,1,124,1,62,1,93,1,31,1,62,1,202,3,233,3,171,3,202,3,78,3,109,3,47,3,78,3,210,2,241,2,179,2,210,2,86,2,117,2,55,2,86,2,218,1,249,1,187,1,218,1,94,1,125,1,63,1,94,1,203,3,234,3,79,3,110,3,211,2,242,2,87,2,118,2,219,1,250,1,95,1,126,1,108,3,139,3,240,2,15,3,116,2,147,2,248,1,23,2,124,1,155,1,140,3,171,3,109,3,140,3,16,3,47,3,241,2,16,3,148,2,179,2,117,2,148,2,24,2,55,2,249,1,24,2,156,1,187,1,125,1,156,1,172,3,203,3,141,3,172,3,110,3,141,3,48,3,79,3,17,3,48,3,242,2,17,3,180,2,211,2,149,2,180,2,118,2,149,2,56,2,87,2,25,2,56,2,250,1,25,2,188,1,219,1,157,1,188,1,126,1,157,1,204,3,235,3,173,3,204,3,142,3,173,3,111,3,142,3,80,3,111,3,49,3,80,3,18,3,49,3,243,2,18,3,212,2,243,2,181,2,212,2,150,2,181,2,119,2,150,2,88,2,119,2,57,2,88,2,26,2,57,2,251,1,26,2,220,1,251,1,189,1,220,1,158,1,189,1,127,1,158,1,205,3,236,3,174,3,205,3,143,3,174,3,81,3,112,3,50,3,81,3,19,3,50,3,213,2,244,2,182,2,213,2,151,2,182,2,89,2,120,2,58,2,89,2,27,2,58,2,221,1,252,1,190,1,221,1,159,1,190,1,206,3,237,3,175,3,206,3,82,3,113,3,51,3,82,3,214,2,245,2,183,2,214,2,90,2,121,2,59,2,90,2,222,1,253,1,191,1,222,1,207,3,238,3,83,3,114,3,215,2,246,2,91,2,122,2,223,1,254,1,112,3,143,3,244,2,19,3,120,2,151,2,252,1,27,2,144,3,175,3,113,3,144,3,20,3,51,3,245,2,20,3,152,2,183,2,121,2,152,2,28,2,59,2,253,1,28,2,176,3,207,3,145,3,176,3,114,3,145,3,52,3,83,3,21,3,52,3,246,2,21,3,184,2,215,2,153,2,184,2,122,2,153,2,60,2,91,2,29,2,60,2,254,1,29,2,208,3,239,3,177,3,208,3,146,3,177,3,115,3,146,3,84,3,115,3,53,3,84,3,22,3,53,3,247,2,22,3,216,2,247,2,185,2,216,2,154,2,185,2,123,2,154,2,92,2,123,2,61,2,92,2,30,2,61,2,255,1,30,2,209,3,240,3,178,3,209,3,147,3,178,3,85,3,116,3,54,3,85,3,23,3,54,3,217,2,248,2,186,2,217,2,155,2,186,2,93,2,124,2,62,2,93,2,31,2,62,2,210,3,241,3,179,3,210,3,86,3,117,3,55,3,86,3,218,2,249,2,187,2,218,2,94,2,125,2,63,2,94,2,211,3,242,3,87,3,118,3,219,2,250,2,95,2,126,2,116,3,147,3,248,2,23,3,124,2,155,2,148,3,179,3,117,3,148,3,24,3,55,3,249,2,24,3,156,2,187,2,125,2,156,2,180,3,211,3,149,3,180,3,118,3,149,3,56,3,87,3,25,3,56,3,250,2,25,3,188,2,219,2,157,2,188,2,126,2,157,2,212,3,243,3,181,3,212,3,150,3,181,3,119,3,150,3,88,3,119,3,57,3,88,3,26,3,57,3,251,2,26,3,220,2,251,2,189,2,220,2,158,2,189,2,127,2,158,2,213,3,244,3,182,3,213,3,151,3,182,3,89,3,120,3,58,3,89,3,27,3,58,3,221,2,252,2,190,2,221,2,159,2,190,2,214,3,245,3,183,3,214,3,90,3,121,3,59,3,90,3,222,2,253,2,191,2,222,2,215,3,246,3,91,3,122,3,223,2,254,2,120,3,151,3,252,2,27,3,152,3,183,3,121,3,152,3,28,3,59,3,253,2,28,3,184,3,215,3,153,3,184,3,122,3,153,3,60,3,91,3,29,3,60,3,254,2,29,3,216,3,247,3,185,3,216,3,154,3,185,3,123,3,154,3,92,3,123,3,61,3,92,3,30,3,61,3,255,2,30,3,217,3,248,3,186,3,217,3,155,3,186,3,93,3,124,3,62,3,93,3,31,3,62,3,218,3,249,3,187,3,218,3,94,3,125,3,63,3,94,3,219,3,250,3,95,3,126,3,124,3,155,3,156,3,187,3,125,3,156,3,188,3,219,3,157,3,188,3,126,3,157,3,220,3,251,3,189,3,220,3,158,3,189,3,127,3,158,3,221,3,252,3,190,3,221,3,159,3,190,3,222,3,253,3,191,3,222,3,223,3,254,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,4,0,2,0,5,0,3,0,6,0,8,0,9,0,7,0,12,0,10,0,13,0,11,0,14,0,15,0,0,0,1,0,3,0,5,0,2,0,4,0,6,0,9,0,7,0,8,0,11,0,13,0,10,0,12,0,14,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,4,0,4,0,2,0,2,0,5,0,5,0,4,0,4,0,8,0,8,0,6,0,6,0,8,0,8,0,9,0,9,0,12,0,12,0,10,0,10,0,13,0,13,0,14,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,8,0,1,0,12,0,5,0,9,0,2,0,13,0,6,0,10,0,3,0,7,0,14,0,11,0,15,0,0,0,3,0,7,0,11,0,1,0,5,0,9,0,12,0,2,0,6,0,10,0,14,0,4,0,8,0,13,0,15,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,8,0,8,0,1,0,1,0,5,0,5,0,1,0,1,0,9,0,9,0,2,0,2,0,6,0,6,0,2,0,2,0,3,0,3,0,10,0,10,0,7,0,7,0,11,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,8,0,9,0,3,0,16,0,10,0,4,0,17,0,11,0,24,0,5,0,18,0,25,0,12,0,19,0,26,0,32,0,6,0,13,0,20,0,33,0,27,0,7,0,34,0,40,0,21,0,28,0,41,0,14,0,35,0,48,0,42,0,29,0,36,0,49,0,22,0,43,0,15,0,56,0,37,0,50,0,44,0,30,0,57,0,23,0,51,0,58,0,45,0,38,0,52,0,31,0,59,0,53,0,46,0,60,0,39,0,61,0,47,0,54,0,55,0,62,0,63,0,0,0,1,0,2,0,5,0,8,0,12,0,19,0,24,0,3,0,4,0,7,0,10,0,15,0,20,0,30,0,39,0,6,0,9,0,13,0,16,0,21,0,27,0,37,0,46,0,11,0,14,0,17,0,23,0,28,0,34,0,44,0,52,0,18,0,22,0,25,0,31,0,35,0,41,0,50,0,57,0,26,0,29,0,33,0,38,0,43,0,49,0,55,0,59,0,32,0,36,0,42,0,47,0,51,0,54,0,60,0,61,0,40,0,45,0,48,0,53,0,56,0,58,0,62,0,63,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,8,0,8,0,2,0,2,0,8,0,8,0,9,0,9,0,3,0,3,0,16,0,16,0,10,0,10,0,16,0,16,0,4,0,4,0,17,0,17,0,24,0,24,0,11,0,11,0,18,0,18,0,25,0,25,0,24,0,24,0,5,0,5,0,12,0,12,0,19,0,19,0,32,0,32,0,26,0,26,0,6,0,6,0,33,0,33,0,32,0,32,0,20,0,20,0,27,0,27,0,40,0,40,0,13,0,13,0,34,0,34,0,40,0,40,0,41,0,41,0,28,0,28,0,35,0,35,0,48,0,48,0,21,0,21,0,42,0,42,0,14,0,14,0,48,0,48,0,36,0,36,0,49,0,49,0,43,0,43,0,29,0,29,0,56,0,56,0,22,0,22,0,50,0,50,0,57,0,57,0,44,0,44,0,37,0,37,0,51,0,51,0,30,0,30,0,58,0,58,0,52,0,52,0,45,0,45,0,59,0,59,0,38,0,38,0,60,0,60,0,46,0,46,0,53,0,53,0,54,0,54,0,61,0,61,0,62,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,16,0,1,0,24,0,9,0,32,0,17,0,2,0,40,0,25,0,10,0,33,0,18,0,48,0,3,0,26,0,41,0,11,0,56,0,19,0,34,0,4,0,49,0,27,0,42,0,12,0,35,0,20,0,57,0,50,0,28,0,5,0,43,0,13,0,36,0,58,0,51,0,21,0,44,0,6,0,29,0,59,0,37,0,14,0,52,0,22,0,7,0,45,0,60,0,30,0,15,0,38,0,53,0,23,0,46,0,31,0,61,0,39,0,54,0,47,0,62,0,55,0,63,0,0,0,3,0,8,0,15,0,22,0,32,0,40,0,47,0,1,0,5,0,11,0,18,0,26,0,34,0,44,0,51,0,2,0,7,0,13,0,20,0,28,0,38,0,46,0,54,0,4,0,10,0,16,0,24,0,31,0,41,0,50,0,56,0,6,0,12,0,21,0,27,0,35,0,43,0,52,0,58,0,9,0,17,0,25,0,33,0,39,0,48,0,55,0,60,0,14,0,23,0,30,0,37,0,45,0,53,0,59,0,62,0,19,0,29,0,36,0,42,0,49,0,57,0,61,0,63,0,0,0,0,0,0,0,0,0,8,0,8,0,0,0,0,0,16,0,16,0,1,0,1,0,24,0,24,0,9,0,9,0,1,0,1,0,32,0,32,0,17,0,17,0,2,0,2,0,25,0,25,0,10,0,10,0,40,0,40,0,2,0,2,0,18,0,18,0,33,0,33,0,3,0,3,0,48,0,48,0,11,0,11,0,26,0,26,0,3,0,3,0,41,0,41,0,19,0,19,0,34,0,34,0,4,0,4,0,27,0,27,0,12,0,12,0,49,0,49,0,42,0,42,0,20,0,20,0,4,0,4,0,35,0,35,0,5,0,5,0,28,0,28,0,50,0,50,0,43,0,43,0,13,0,13,0,36,0,36,0,5,0,5,0,21,0,21,0,51,0,51,0,29,0,29,0,6,0,6,0,44,0,44,0,14,0,14,0,6,0,6,0,37,0,37,0,52,0,52,0,22,0,22,0,7,0,7,0,30,0,30,0,45,0,45,0,15,0,15,0,38,0,38,0,23,0,23,0,53,0,53,0,31,0,31,0,46,0,46,0,39,0,39,0,54,0,54,0,47,0,47,0,55,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,16,0,3,0,17,0,4,0,18,0,32,0,5,0,33,0,19,0,6,0,34,0,48,0,20,0,49,0,7,0,35,0,21,0,50,0,64,0,8,0,36,0,65,0,22,0,51,0,37,0,80,0,9,0,66,0,52,0,23,0,38,0,81,0,67,0,10,0,53,0,24,0,82,0,68,0,96,0,39,0,11,0,54,0,83,0,97,0,69,0,25,0,98,0,84,0,40,0,112,0,55,0,12,0,70,0,99,0,113,0,85,0,26,0,41,0,56,0,114,0,100,0,13,0,71,0,128,0,86,0,27,0,115,0,101,0,129,0,42,0,57,0,72,0,116,0,14,0,87,0,130,0,102,0,144,0,73,0,131,0,117,0,28,0,58,0,15,0,88,0,43,0,145,0,103,0,132,0,146,0,118,0,74,0,160,0,89,0,133,0,104,0,29,0,59,0,147,0,119,0,44,0,161,0,148,0,90,0,105,0,134,0,162,0,120,0,176,0,75,0,135,0,149,0,30,0,60,0,163,0,177,0,45,0,121,0,91,0,106,0,164,0,178,0,150,0,192,0,136,0,165,0,179,0,31,0,151,0,193,0,76,0,122,0,61,0,137,0,194,0,107,0,152,0,180,0,208,0,46,0,166,0,167,0,195,0,92,0,181,0,138,0,209,0,123,0,153,0,224,0,196,0,77,0,168,0,210,0,182,0,240,0,108,0,197,0,62,0,154,0,225,0,183,0,169,0,211,0,47,0,139,0,93,0,184,0,226,0,212,0,241,0,198,0,170,0,124,0,155,0,199,0,78,0,213,0,185,0,109,0,227,0,200,0,63,0,228,0,242,0,140,0,214,0,171,0,186,0,156,0,229,0,243,0,125,0,94,0,201,0,244,0,215,0,216,0,230,0,141,0,187,0,202,0,79,0,172,0,110,0,157,0,245,0,217,0,231,0,95,0,246,0,232,0,126,0,203,0,247,0,233,0,173,0,218,0,142,0,111,0,158,0,188,0,248,0,127,0,234,0,219,0,249,0,189,0,204,0,143,0,174,0,159,0,250,0,235,0,205,0,220,0,175,0,190,0,251,0,221,0,191,0,206,0,236,0,207,0,237,0,252,0,222,0,253,0,223,0,238,0,239,0,254,0,255,0,0,0,1,0,2,0,4,0,6,0,9,0,12,0,17,0,22,0,29,0,36,0,43,0,54,0,64,0,76,0,86,0,3,0,5,0,7,0,11,0,15,0,19,0,25,0,32,0,38,0,48,0,59,0,68,0,84,0,99,0,115,0,130,0,8,0,10,0,13,0,18,0,23,0,27,0,33,0,42,0,51,0,60,0,72,0,88,0,103,0,119,0,142,0,167,0,14,0,16,0,20,0,26,0,31,0,37,0,44,0,53,0,61,0,73,0,85,0,100,0,116,0,135,0,161,0,185,0,21,0,24,0,30,0,35,0,40,0,47,0,55,0,65,0,74,0,81,0,94,0,112,0,133,0,154,0,179,0,205,0,28,0,34,0,39,0,45,0,50,0,58,0,67,0,77,0,87,0,96,0,106,0,121,0,146,0,169,0,196,0,212,0,41,0,46,0,49,0,56,0,63,0,70,0,79,0,90,0,98,0,107,0,122,0,138,0,159,0,182,0,207,0,222,0,52,0,57,0,62,0,69,0,75,0,83,0,93,0,102,0,110,0,120,0,134,0,150,0,176,0,195,0,215,0,226,0,66,0,71,0,78,0,82,0,91,0,97,0,108,0,113,0,127,0,136,0,148,0,168,0,188,0,202,0,221,0,232,0,80,0,89,0,92,0,101,0,105,0,114,0,125,0,131,0,139,0,151,0,162,0,177,0,192,0,208,0,223,0,234,0,95,0,104,0,109,0,117,0,123,0,128,0,143,0,144,0,155,0,165,0,175,0,190,0,206,0,219,0,233,0,239,0,111,0,118,0,124,0,129,0,140,0,147,0,157,0,164,0,170,0,181,0,191,0,203,0,224,0,230,0,240,0,243,0,126,0,132,0,137,0,145,0,153,0,160,0,174,0,178,0,184,0,197,0,204,0,216,0,231,0,237,0,244,0,246,0,141,0,149,0,156,0,166,0,172,0,180,0,189,0,199,0,200,0,210,0,220,0,228,0,238,0,242,0,249,0,251,0,152,0,163,0,171,0,183,0,186,0,193,0,201,0,211,0,214,0,218,0,227,0,236,0,245,0,247,0,252,0,253,0,158,0,173,0,187,0,194,0,198,0,209,0,213,0,217,0,225,0,229,0,235,0,241,0,248,0,250,0,254,0,255,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,2,0,2,0,16,0,16,0,3,0,3,0,17,0,17,0,16,0,16,0,4,0,4,0,32,0,32,0,18,0,18,0,5,0,5,0,33,0,33,0,32,0,32,0,19,0,19,0,48,0,48,0,6,0,6,0,34,0,34,0,20,0,20,0,49,0,49,0,48,0,48,0,7,0,7,0,35,0,35,0,64,0,64,0,21,0,21,0,50,0,50,0,36,0,36,0,64,0,64,0,8,0,8,0,65,0,65,0,51,0,51,0,22,0,22,0,37,0,37,0,80,0,80,0,66,0,66,0,9,0,9,0,52,0,52,0,23,0,23,0,81,0,81,0,67,0,67,0,80,0,80,0,38,0,38,0,10,0,10,0,53,0,53,0,82,0,82,0,96,0,96,0,68,0,68,0,24,0,24,0,97,0,97,0,83,0,83,0,39,0,39,0,96,0,96,0,54,0,54,0,11,0,11,0,69,0,69,0,98,0,98,0,112,0,112,0,84,0,84,0,25,0,25,0,40,0,40,0,55,0,55,0,113,0,113,0,99,0,99,0,12,0,12,0,70,0,70,0,112,0,112,0,85,0,85,0,26,0,26,0,114,0,114,0,100,0,100,0,128,0,128,0,41,0,41,0,56,0,56,0,71,0,71,0,115,0,115,0,13,0,13,0,86,0,86,0,129,0,129,0,101,0,101,0,128,0,128,0,72,0,72,0,130,0,130,0,116,0,116,0,27,0,27,0,57,0,57,0,14,0,14,0,87,0,87,0,42,0,42,0,144,0,144,0,102,0,102,0,131,0,131,0,145,0,145,0,117,0,117,0,73,0,73,0,144,0,144,0,88,0,88,0,132,0,132,0,103,0,103,0,28,0,28,0,58,0,58,0,146,0,146,0,118,0,118,0,43,0,43,0,160,0,160,0,147,0,147,0,89,0,89,0,104,0,104,0,133,0,133,0,161,0,161,0,119,0,119,0,160,0,160,0,74,0,74,0,134,0,134,0,148,0,148,0,29,0,29,0,59,0,59,0,162,0,162,0,176,0,176,0,44,0,44,0,120,0,120,0,90,0,90,0,105,0,105,0,163,0,163,0,177,0,177,0,149,0,149,0,176,0,176,0,135,0,135,0,164,0,164,0,178,0,178,0,30,0,30,0,150,0,150,0,192,0,192,0,75,0,75,0,121,0,121,0,60,0,60,0,136,0,136,0,193,0,193,0,106,0,106,0,151,0,151,0,179,0,179,0,192,0,192,0,45,0,45,0,165,0,165,0,166,0,166,0,194,0,194,0,91,0,91,0,180,0,180,0,137,0,137,0,208,0,208,0,122,0,122,0,152,0,152,0,208,0,208,0,195,0,195,0,76,0,76,0,167,0,167,0,209,0,209,0,181,0,181,0,224,0,224,0,107,0,107,0,196,0,196,0,61,0,61,0,153,0,153,0,224,0,224,0,182,0,182,0,168,0,168,0,210,0,210,0,46,0,46,0,138,0,138,0,92,0,92,0,183,0,183,0,225,0,225,0,211,0,211,0,240,0,240,0,197,0,197,0,169,0,169,0,123,0,123,0,154,0,154,0,198,0,198,0,77,0,77,0,212,0,212,0,184,0,184,0,108,0,108,0,226,0,226,0,199,0,199,0,62,0,62,0,227,0,227,0,241,0,241,0,139,0,139,0,213,0,213,0,170,0,170,0,185,0,185,0,155,0,155,0,228,0,228,0,242,0,242,0,124,0,124,0,93,0,93,0,200,0,200,0,243,0,243,0,214,0,214,0,215,0,215,0,229,0,229,0,140,0,140,0,186,0,186,0,201,0,201,0,78,0,78,0,171,0,171,0,109,0,109,0,156,0,156,0,244,0,244,0,216,0,216,0,230,0,230,0,94,0,94,0,245,0,245,0,231,0,231,0,125,0,125,0,202,0,202,0,246,0,246,0,232,0,232,0,172,0,172,0,217,0,217,0,141,0,141,0,110,0,110,0,157,0,157,0,187,0,187,0,247,0,247,0,126,0,126,0,233,0,233,0,218,0,218,0,248,0,248,0,188,0,188,0,203,0,203,0,142,0,142,0,173,0,173,0,158,0,158,0,249,0,249,0,234,0,234,0,204,0,204,0,219,0,219,0,174,0,174,0,189,0,189,0,250,0,250,0,220,0,220,0,190,0,190,0,205,0,205,0,235,0,235,0,206,0,206,0,236,0,236,0,251,0,251,0,221,0,221,0,252,0,252,0,222,0,222,0,237,0,237,0,238,0,238,0,253,0,253,0,254,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,32,0,48,0,1,0,64,0,17,0,80,0,33,0,96,0,49,0,2,0,65,0,112,0,18,0,81,0,34,0,128,0,50,0,97,0,3,0,66,0,144,0,19,0,113,0,35,0,82,0,160,0,98,0,51,0,129,0,4,0,67,0,176,0,20,0,114,0,145,0,83,0,36,0,99,0,130,0,52,0,192,0,5,0,161,0,68,0,115,0,21,0,146,0,84,0,208,0,177,0,37,0,131,0,100,0,53,0,162,0,224,0,69,0,6,0,116,0,193,0,147,0,85,0,22,0,240,0,132,0,38,0,178,0,101,0,163,0,54,0,209,0,117,0,70,0,7,0,148,0,194,0,86,0,179,0,225,0,23,0,133,0,39,0,164,0,8,0,102,0,210,0,241,0,55,0,195,0,118,0,149,0,71,0,180,0,24,0,87,0,226,0,134,0,165,0,211,0,40,0,103,0,56,0,72,0,150,0,196,0,242,0,119,0,9,0,181,0,227,0,88,0,166,0,25,0,135,0,41,0,104,0,212,0,57,0,151,0,197,0,120,0,73,0,243,0,182,0,136,0,167,0,213,0,89,0,10,0,228,0,105,0,152,0,198,0,26,0,42,0,121,0,183,0,244,0,168,0,58,0,137,0,229,0,74,0,214,0,90,0,153,0,199,0,184,0,11,0,106,0,245,0,27,0,122,0,230,0,169,0,43,0,215,0,59,0,200,0,138,0,185,0,246,0,75,0,12,0,91,0,154,0,216,0,231,0,107,0,28,0,44,0,201,0,123,0,170,0,60,0,247,0,232,0,76,0,139,0,13,0,92,0,217,0,186,0,248,0,155,0,108,0,29,0,124,0,45,0,202,0,233,0,171,0,61,0,14,0,77,0,140,0,15,0,249,0,93,0,30,0,187,0,156,0,218,0,46,0,109,0,125,0,62,0,172,0,78,0,203,0,31,0,141,0,234,0,94,0,47,0,188,0,63,0,157,0,110,0,250,0,219,0,79,0,126,0,204,0,173,0,142,0,95,0,189,0,111,0,235,0,158,0,220,0,251,0,127,0,174,0,143,0,205,0,236,0,159,0,190,0,221,0,252,0,175,0,206,0,237,0,191,0,253,0,222,0,238,0,207,0,254,0,223,0,239,0,255,0,0,0,4,0,11,0,20,0,31,0,43,0,59,0,75,0,85,0,109,0,130,0,150,0,165,0,181,0,195,0,198,0,1,0,6,0,14,0,23,0,34,0,47,0,64,0,81,0,95,0,114,0,135,0,153,0,171,0,188,0,201,0,212,0,2,0,8,0,16,0,25,0,38,0,52,0,67,0,83,0,101,0,116,0,136,0,157,0,172,0,190,0,205,0,216,0,3,0,10,0,18,0,29,0,41,0,55,0,71,0,89,0,103,0,119,0,141,0,159,0,176,0,194,0,208,0,218,0,5,0,12,0,21,0,32,0,45,0,58,0,74,0,93,0,104,0,123,0,144,0,164,0,179,0,196,0,210,0,223,0,7,0,15,0,26,0,37,0,49,0,63,0,78,0,96,0,112,0,129,0,146,0,166,0,182,0,200,0,215,0,228,0,9,0,19,0,28,0,39,0,54,0,69,0,86,0,102,0,117,0,132,0,151,0,170,0,187,0,206,0,220,0,230,0,13,0,24,0,35,0,46,0,60,0,73,0,91,0,108,0,122,0,137,0,154,0,174,0,189,0,207,0,224,0,235,0,17,0,30,0,40,0,53,0,66,0,82,0,98,0,115,0,126,0,142,0,161,0,180,0,197,0,213,0,227,0,237,0,22,0,36,0,48,0,62,0,76,0,92,0,105,0,120,0,133,0,147,0,167,0,186,0,203,0,219,0,232,0,240,0,27,0,44,0,56,0,70,0,84,0,99,0,113,0,127,0,140,0,156,0,175,0,193,0,209,0,226,0,236,0,244,0,33,0,51,0,68,0,79,0,94,0,110,0,125,0,138,0,149,0,162,0,184,0,202,0,217,0,229,0,241,0,247,0,42,0,61,0,77,0,90,0,106,0,121,0,134,0,148,0,160,0,173,0,191,0,211,0,225,0,238,0,245,0,251,0,50,0,72,0,87,0,100,0,118,0,128,0,145,0,158,0,168,0,183,0,204,0,222,0,233,0,242,0,249,0,253,0,57,0,80,0,97,0,111,0,131,0,143,0,155,0,169,0,178,0,192,0,214,0,231,0,239,0,246,0,250,0,254,0,65,0,88,0,107,0,124,0,139,0,152,0,163,0,177,0,185,0,199,0,221,0,234,0,243,0,248,0,252,0,255,0,0,0,0,0,0,0,0,0,16,0,16,0,32,0,32,0,0,0,0,0,48,0,48,0,1,0,1,0,64,0,64,0,17,0,17,0,80,0,80,0,33,0,33,0,1,0,1,0,49,0,49,0,96,0,96,0,2,0,2,0,65,0,65,0,18,0,18,0,112,0,112,0,34,0,34,0,81,0,81,0,2,0,2,0,50,0,50,0,128,0,128,0,3,0,3,0,97,0,97,0,19,0,19,0,66,0,66,0,144,0,144,0,82,0,82,0,35,0,35,0,113,0,113,0,3,0,3,0,51,0,51,0,160,0,160,0,4,0,4,0,98,0,98,0,129,0,129,0,67,0,67,0,20,0,20,0,83,0,83,0,114,0,114,0,36,0,36,0,176,0,176,0,4,0,4,0,145,0,145,0,52,0,52,0,99,0,99,0,5,0,5,0,130,0,130,0,68,0,68,0,192,0,192,0,161,0,161,0,21,0,21,0,115,0,115,0,84,0,84,0,37,0,37,0,146,0,146,0,208,0,208,0,53,0,53,0,5,0,5,0,100,0,100,0,177,0,177,0,131,0,131,0,69,0,69,0,6,0,6,0,224,0,224,0,116,0,116,0,22,0,22,0,162,0,162,0,85,0,85,0,147,0,147,0,38,0,38,0,193,0,193,0,101,0,101,0,54,0,54,0,6,0,6,0,132,0,132,0,178,0,178,0,70,0,70,0,163,0,163,0,209,0,209,0,7,0,7,0,117,0,117,0,23,0,23,0,148,0,148,0,7,0,7,0,86,0,86,0,194,0,194,0,225,0,225,0,39,0,39,0,179,0,179,0,102,0,102,0,133,0,133,0,55,0,55,0,164,0,164,0,8,0,8,0,71,0,71,0,210,0,210,0,118,0,118,0,149,0,149,0,195,0,195,0,24,0,24,0,87,0,87,0,40,0,40,0,56,0,56,0,134,0,134,0,180,0,180,0,226,0,226,0,103,0,103,0,8,0,8,0,165,0,165,0,211,0,211,0,72,0,72,0,150,0,150,0,9,0,9,0,119,0,119,0,25,0,25,0,88,0,88,0,196,0,196,0,41,0,41,0,135,0,135,0,181,0,181,0,104,0,104,0,57,0,57,0,227,0,227,0,166,0,166,0,120,0,120,0,151,0,151,0,197,0,197,0,73,0,73,0,9,0,9,0,212,0,212,0,89,0,89,0,136,0,136,0,182,0,182,0,10,0,10,0,26,0,26,0,105,0,105,0,167,0,167,0,228,0,228,0,152,0,152,0,42,0,42,0,121,0,121,0,213,0,213,0,58,0,58,0,198,0,198,0,74,0,74,0,137,0,137,0,183,0,183,0,168,0,168,0,10,0,10,0,90,0,90,0,229,0,229,0,11,0,11,0,106,0,106,0,214,0,214,0,153,0,153,0,27,0,27,0,199,0,199,0,43,0,43,0,184,0,184,0,122,0,122,0,169,0,169,0,230,0,230,0,59,0,59,0,11,0,11,0,75,0,75,0,138,0,138,0,200,0,200,0,215,0,215,0,91,0,91,0,12,0,12,0,28,0,28,0,185,0,185,0,107,0,107,0,154,0,154,0,44,0,44,0,231,0,231,0,216,0,216,0,60,0,60,0,123,0,123,0,12,0,12,0,76,0,76,0,201,0,201,0,170,0,170,0,232,0,232,0,139,0,139,0,92,0,92,0,13,0,13,0,108,0,108,0,29,0,29,0,186,0,186,0,217,0,217,0,155,0,155,0,45,0,45,0,13,0,13,0,61,0,61,0,124,0,124,0,14,0,14,0,233,0,233,0,77,0,77,0,14,0,14,0,171,0,171,0,140,0,140,0,202,0,202,0,30,0,30,0,93,0,93,0,109,0,109,0,46,0,46,0,156,0,156,0,62,0,62,0,187,0,187,0,15,0,15,0,125,0,125,0,218,0,218,0,78,0,78,0,31,0,31,0,172,0,172,0,47,0,47,0,141,0,141,0,94,0,94,0,234,0,234,0,203,0,203,0,63,0,63,0,110,0,110,0,188,0,188,0,157,0,157,0,126,0,126,0,79,0,79,0,173,0,173,0,95,0,95,0,219,0,219,0,142,0,142,0,204,0,204,0,235,0,235,0,111,0,111,0,158,0,158,0,127,0,127,0,189,0,189,0,220,0,220,0,143,0,143,0,174,0,174,0,205,0,205,0,236,0,236,0,159,0,159,0,190,0,190,0,221,0,221,0,175,0,175,0,237,0,237,0,206,0,206,0,222,0,222,0,191,0,191,0,238,0,238,0,207,0,207,0,223,0,223,0,239,0,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,3,3,3,3,0,0,0,0,15,15,0,0,0,0,0,0,15,15,15,15,0,0,0,0,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,0,255,0,255,0,255,0,0,0,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,85,85,85,85,85,85,85,85,17,17,17,17,17,17,17,17,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,12,0,0,0,19,0,0,0,25,0,0,0,32,0,0,0,38,0,0,0,44,0,0,0,51,0,0,0,57,0,0,0,64,0,0,0,70,0,0,0,76,0,0,0,83,0,0,0,89,0,0,0,96,0,0,0,102,0,0,0,108,0,0,0,115,0,0,0,121,0,0,0,128,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,255,0,0,0,63,0,0,0,3,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,112,10,0,0,144,10,0,0,176,10,0,0,0,11,0,0,128,11,0,0,0,12,0,0,16,13,0,0,16,15,0,0,16,17,0,0,32,21,0,0,32,29,0,0,32,37,0,0,112,10,0,0,144,10,0,0,176,10,0,0,48,53,0,0,80,53,0,0,112,53,0,0,192,53,0,0,224,53,0,0,0,54,0,0,112,10,0,0,144,10,0,0,176,10,0,0,0,11,0,0,128,11,0,0,0,12,0,0,80,54,0,0,208,54,0,0,80,55,0,0,96,56,0,0,224,56,0,0,96,57,0,0,0,11,0,0,128,11,0,0,0,12,0,0,16,13,0,0,16,15,0,0,16,17,0,0,112,58,0,0,112,60,0,0,112,62,0,0,128,66,0,0,128,68,0,0,128,70,0,0,16,13,0,0,16,15,0,0,16,17,0,0,32,21,0,0,32,29,0,0,32,37,0,0,32,21,0,0,32,29,0,0,32,37,0,0,32,21,0,0,32,29,0,0,32,37,0,0,32,21,0,0,32,29,0,0,32,37,0,0,176,115,0,0,5,0,0,0,1,0,64,0,1,0,0,0,3,0,0,0,160,78,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,6,0,0,0,8,1,0,0,7,0,0,0,3,1,0,0,8,0,0,0,7,1,0,0,9,0,0,0,9,1,0,0,10,0,0,0,10,1,0,0,11,0,0,0,0,1,0,0,12,0,0,0,1,1,0,0,13,0,0,0,128,0,0,0,14,0,0,0,5,1,0,0,15,0,0,0,6,1,0,0,16,0,0,0,4,1,0,0,17,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,255,255,255,255],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([255,255,255,255,254,255,255,255,254,255,255,255,254,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,254,255,255,255,254,255,255,255,0,0,0,0,254,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,1,0,0,0,255,255,255,255,255,255,255,255,254,255,255,255,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,1,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,253,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,0,0,0,0,253,255,255,255,253,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,2,0,0,0,255,255,255,255,255,255,255,255,1,0,0,0,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,253,255,255,255,255,255,255,255,1,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,2,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,253,255,255,255,253,255,255,255,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,4,0,0,0,255,255,255,255,255,255,255,255,2,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,253,255,255,255,253,255,255,255,0,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,4,0,0,0,2,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,0,0,0,0,0,0,0,0,253,255,255,255,255,255,255,255,2,0,0,0,255,255,255,255,3,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,4,0,0,0,4,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,6,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,9,0,0,0,0,0,0,0,9,0,0,0,9,0,0,0,5,0,0,0,5,0,0,0,9,0,0,0,5,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,6,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,83,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,80,137,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,3,0,3,0,15,0,15,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,17,0,1,0,17,0,17,17,17,0,17,17,1,0,1,0,1,0,1,0,1,0,1,0,1,0,17,0,3,0,51,0,51,51,255,0,255,255,255,255,255,255,15,15,15,0,255,255,255,255,85,85,17,17,4,0,8,0,8,0,9,0,10,0,11,0,12,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,38,0,39,0,40,0,41,0,42,0,43,0,43,0,44,0,45,0,46,0,47,0,48,0,48,0,49,0,50,0,51,0,52,0,53,0,53,0,54,0,55,0,56,0,57,0,57,0,58,0,59,0,60,0,61,0,62,0,62,0,63,0,64,0,65,0,66,0,66,0,67,0,68,0,69,0,70,0,70,0,71,0,72,0,73,0,74,0,74,0,75,0,76,0,77,0,78,0,78,0,79,0,80,0,81,0,81,0,82,0,83,0,84,0,85,0,85,0,87,0,88,0,90,0,92,0,93,0,95,0,96,0,98,0,99,0,101,0,102,0,104,0,105,0,107,0,108,0,110,0,111,0,113,0,114,0,116,0,117,0,118,0,120,0,121,0,123,0,125,0,127,0,129,0,131,0,134,0,136,0,138,0,140,0,142,0,144,0,146,0,148,0,150,0,152,0,154,0,156,0,158,0,161,0,164,0,166,0,169,0,172,0,174,0,177,0,180,0,182,0,185,0,187,0,190,0,192,0,195,0,199,0,202,0,205,0,208,0,211,0,214,0,217,0,220,0,223,0,226,0,230,0,233,0,237,0,240,0,243,0,247,0,250,0,253,0,1,1,5,1,9,1,13,1,16,1,20,1,24,1,28,1,32,1,36,1,40,1,44,1,48,1,53,1,57,1,61,1,66,1,70,1,74,1,79,1,84,1,88,1,93,1,98,1,103,1,108,1,113,1,118,1,123,1,128,1,133,1,139,1,144,1,150,1,155,1,161,1,167,1,173,1,179,1,185,1,191,1,198,1,205,1,211,1,219,1,226,1,233,1,241,1,249,1,1,2,10,2,18,2,27,2,37,2,47,2,57,2,67,2,78,2,90,2,102,2,114,2,128,2,142,2,156,2,172,2,188,2,205,2,224,2,243,2,7,3,28,3,51,3,75,3,101,3,128,3,157,3,187,3,220,3,254,3,34,4,74,4,115,4,160,4,208,4,2,5,56,5,4,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,104,0,106,0,108,0,110,0,112,0,114,0,116,0,118,0,120,0,122,0,124,0,126,0,128,0,130,0,132,0,134,0,136,0,138,0,140,0,142,0,144,0,146,0,148,0,150,0,152,0,155,0,158,0,161,0,164,0,167,0,170,0,173,0,176,0,179,0,182,0,185,0,188,0,191,0,194,0,197,0,200,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235,0,239,0,243,0,247,0,251,0,255,0,4,1,9,1,14,1,19,1,24,1,29,1,34,1,39,1,44,1,49,1,55,1,61,1,67,1,73,1,79,1,85,1,91,1,97,1,103,1,110,1,117,1,124,1,131,1,138,1,145,1,152,1,160,1,168,1,176,1,184,1,192,1,200,1,209,1,218,1,227,1,236,1,245,1,254,1,8,2,18,2,28,2,38,2,48,2,59,2,70,2,81,2,92,2,103,2,115,2,127,2,139,2,151,2,164,2,177,2,190,2,203,2,217,2,231,2,245,2,3,3,18,3,33,3,48,3,64,3,80,3,96,3,113,3,130,3,147,3,165,3,183,3,201,3,220,3,239,3,2,4,22,4,42,4,63,4,84,4,105,4,127,4,149,4,172,4,195,4,219,4,243,4,12,5,37,5,63,5,89,5,116,5,143,5,171,5,199,5,228,5,1,6,31,6,61,6,92,6,124,6,156,6,189,6,223,6,1,7,36,7,3,86,128,6,86,23,88,29,6,86,128,11,87,42,91,52,9,86,129,17,88,61,94,76,12,86,129,22,88,77,97,93,15,87,129,28,89,93,100,110,17,87,129,33,90,105,103,123,20,88,130,38,91,118,106,136,23,88,130,43,91,128,108,146,26,89,131,48,92,139,111,156,28,89,131,53,93,147,114,163,31,90,131,58,94,156,117,171,34,90,131,62,94,163,119,177,37,90,132,66,95,171,122,184,39,90,132,70,96,177,124,189,42,91,132,75,97,183,127,194,44,91,132,79,97,188,129,198,47,92,133,83,98,193,132,202,49,92,133,86,99,197,134,205,52,93,133,90,100,201,137,208,54,93,133,94,100,204,139,211,57,94,134,98,101,208,142,214,59,94,134,101,102,211,144,216,62,94,135,105,103,214,146,218,64,94,135,108,103,216,148,220,66,95,135,111,104,219,151,222,68,95,135,114,105,221,153,223,71,96,136,117,106,224,155,225,73,96,136,120,106,225,157,226,76,97,136,123,107,227,159,228,78,97,136,126,108,229,160,229,80,98,137,129,109,231,162,231,82,98,137,131,109,232,164,232,84,98,138,134,110,234,166,233,86,98,138,137,111,235,168,234,89,99,138,140,112,236,170,235,91,99,138,142,112,237,171,235,93,100,139,145,113,238,173,236,95,100,139,147,114,239,174,237,97,101,140,149,115,240,176,238,99,101,140,151,115,241,177,238,101,102,140,154,116,242,179,239,103,102,140,156,117,242,180,239,105,103,141,158,118,243,182,240,107,103,141,160,118,243,183,240,109,104,141,162,119,244,185,241,111,104,141,164,119,244,186,241,113,104,142,166,120,245,187,242,114,104,142,168,121,245,188,242,116,105,143,170,122,246,190,243,118,105,143,171,122,246,191,243,120,106,143,173,123,247,192,244,121,106,143,175,124,247,193,244,123,107,144,177,125,248,195,244,125,107,144,178,125,248,196,244,127,108,145,180,126,249,197,245,128,108,145,181,127,249,198,245,130,109,145,183,128,249,199,245,132,109,145,184,128,249,200,245,134,110,146,186,129,250,201,246,135,110,146,187,130,250,202,246,137,111,147,189,131,251,203,246,138,111,147,190,131,251,204,246,140,112,147,192,132,251,205,247,141,112,147,193,132,251,206,247,143,113,148,194,133,251,207,247,144,113,148,195,134,251,207,247,146,114,149,197,135,252,208,248,147,114,149,198,135,252,209,248,149,115,149,199,136,252,210,248,150,115,149,200,137,252,210,248,152,115,150,201,138,252,211,248,153,115,150,202,138,252,212,248,155,116,151,204,139,253,213,249,156,116,151,205,139,253,213,249,158,117,151,206,140,253,214,249,159,117,151,207,141,253,215,249,161,118,152,208,142,253,216,249,162,118,152,209,142,253,216,249,163,119,153,210,143,253,217,249,164,119,153,211,143,253,217,249,166,120,153,212,144,254,218,250,167,120,153,212,145,254,219,250,168,121,154,213,146,254,220,250,169,121,154,214,146,254,220,250,171,122,155,215,147,254,221,250,172,122,155,216,147,254,221,250,173,123,155,217,148,254,222,250,174,123,155,217,149,254,222,250,176,124,156,218,150,254,223,250,177,124,156,219,150,254,223,250,178,125,157,220,151,254,224,251,179,125,157,220,151,254,224,251,180,126,157,221,152,254,225,251,181,126,157,221,152,254,225,251,183,127,158,222,153,254,226,251,184,127,158,223,154,254,226,251,185,128,159,224,155,255,227,251,186,128,159,224,155,255,227,251,187,129,160,225,156,255,228,251,188,130,160,225,156,255,228,251,189,131,160,226,157,255,228,251,190,131,160,226,158,255,228,251,191,132,161,227,159,255,229,251,192,132,161,227,159,255,229,251,193,133,162,228,160,255,230,252,194,133,162,229,160,255,230,252,195,134,163,230,161,255,231,252,196,134,163,230,161,255,231,252,197,135,163,231,162,255,231,252,198,135,163,231,162,255,231,252,199,136,164,232,163,255,232,252,200,136,164,232,164,255,232,252,201,137,165,233,165,255,233,252,201,137,165,233,165,255,233,252,202,138,166,233,166,255,233,252,203,138,166,233,166,255,233,252,204,139,166,234,167,255,234,252,205,139,166,234,167,255,234,252,206,140,167,235,168,255,235,252,206,140,167,235,168,255,235,252,207,141,168,236,169,255,235,252,208,141,168,236,170,255,235,252,209,142,169,237,171,255,236,252,209,143,169,237,171,255,236,252,210,144,169,237,172,255,236,252,211,144,169,237,172,255,236,252,212,145,170,238,173,255,237,252,213,145,170,238,173,255,237,252,214,146,171,239,174,255,237,253,214,146,171,239,174,255,237,253,215,147,172,240,175,255,238,253,215,147,172,240,175,255,238,253,216,148,173,240,176,255,238,253,217,148,173,240,176,255,238,253,218,149,173,241,177,255,239,253,218,149,173,241,178,255,239,253,219,150,174,241,179,255,239,253,219,151,174,241,179,255,239,253,220,152,175,242,180,255,240,253,221,152,175,242,180,255,240,253,222,153,176,242,181,255,240,253,222,153,176,242,181,255,240,253,223,154,177,243,182,255,240,253,223,154,177,243,182,255,240,253,224,155,178,244,183,255,241,253,224,155,178,244,183,255,241,253,225,156,178,244,184,255,241,253,225,157,178,244,184,255,241,253,226,158,179,244,185,255,242,253,227,158,179,244,185,255,242,253,228,159,180,245,186,255,242,253,228,159,180,245,186,255,242,253,229,160,181,245,187,255,242,253,229,160,181,245,187,255,242,253,230,161,182,246,188,255,243,253,230,162,182,246,188,255,243,253,231,163,183,246,189,255,243,253,231,163,183,246,189,255,243,253,232,164,184,247,190,255,243,253,232,164,184,247,190,255,243,253,233,165,185,247,191,255,244,253,233,165,185,247,191,255,244,253,234,166,185,247,192,255,244,253,234,167,185,247,192,255,244,253,235,168,186,248,193,255,244,253,235,168,186,248,193,255,244,253,236,169,187,248,194,255,244,253,236,169,187,248,194,255,244,253,236,170,188,248,195,255,245,253,236,170,188,248,195,255,245,253,237,171,189,249,196,255,245,254,237,172,189,249,196,255,245,254,238,173,190,249,197,255,245,254,238,173,190,249,197,255,245,254,239,174,191,249,198,255,245,254,239,174,191,249,198,255,245,254,240,175,192,249,199,255,246,254,240,176,192,249,199,255,246,254,240,177,193,250,200,255,246,254,240,177,193,250,200,255,246,254,241,178,194,250,201,255,246,254,241,178,194,250,201,255,246,254,242,179,195,250,202,255,246,254,242,180,195,250,202,255,246,254,242,181,196,250,203,255,247,254,242,181,196,250,203,255,247,254,243,182,197,251,204,255,247,254,243,183,197,251,204,255,247,254,244,184,198,251,205,255,247,254,244,184,198,251,205,255,247,254,244,185,199,251,206,255,247,254,244,185,199,251,206,255,247,254,245,186,200,251,207,255,247,254,245,187,200,251,207,255,247,254,246,188,201,252,207,255,248,254,246,188,201,252,207,255,248,254,246,189,202,252,208,255,248,254,246,190,202,252,208,255,248,254,247,191,203,252,209,255,248,254,247,191,203,252,209,255,248,254,247,192,204,252,210,255,248,254,247,193,204,252,210,255,248,254,248,194,205,252,211,255,248,254,248,194,205,252,211,255,248,254,248,195,206,252,212,255,249,254,248,196,206,252,212,255,249,254,249,197,207,253,213,255,249,254,249,197,207,253,213,255,249,254,249,198,208,253,214,255,249,254,249,199,209,253,214,255,249,254,250,200,210,253,215,255,249,254,250,200,210,253,215,255,249,254,250,201,211,253,215,255,249,254,250,202,211,253,215,255,249,254,250,203,212,253,216,255,249,254,250,203,212,253,216,255,249,254,251,204,213,253,217,255,250,254,251,205,213,253,217,255,250,254,251,206,214,254,218,255,250,254,251,206,215,254,218,255,250,254,252,207,216,254,219,255,250,254,252,208,216,254,219,255,250,254,252,209,217,254,220,255,250,254,252,210,217,254,220,255,250,254,252,211,218,254,221,255,250,254,252,212,218,254,221,255,250,254,253,213,219,254,222,255,250,254,253,213,220,254,222,255,250,254,253,214,221,254,223,255,250,254,253,215,221,254,223,255,250,254,253,216,222,254,224,255,251,254,253,217,223,254,224,255,251,254,253,218,224,254,225,255,251,254,253,219,224,254,225,255,251,254,254,220,225,254,225,255,251,254,254,221,226,254,225,255,251,254,254,222,227,255,226,255,251,254,254,223,227,255,226,255,251,254,254,224,228,255,227,255,251,254,254,225,229,255,227,255,251,254,254,226,230,255,228,255,251,254,254,227,230,255,229,255,251,254,255,228,231,255,230,255,251,254,255,229,232,255,230,255,251,254,255,230,233,255,231,255,252,254,255,231,234,255,231,255,252,254,255,232,235,255,232,255,252,254,255,233,236,255,232,255,252,254,255,235,237,255,233,255,252,254,255,236,238,255,234,255,252,254,255,238,240,255,235,255,252,255,255,239,241,255,235,255,252,254,255,241,243,255,236,255,252,254,255,243,245,255,237,255,252,254,255,246,247,255,239,255,253,255,195,29,183,84,49,136,8,42,71,0,0,0,0,0,0,0,0,0,31,107,169,35,99,159,17,82,140,8,66,114,2,44,76,1,19,32,40,132,201,29,114,187,13,91,157,7,75,127,3,58,95,1,28,47,69,142,221,42,122,201,15,91,159,6,67,121,1,42,77,1,17,31,102,148,228,67,117,204,17,82,154,6,59,114,2,39,75,1,15,29,156,57,233,119,57,212,58,48,163,29,40,124,12,30,81,3,12,31,191,107,226,124,117,204,25,99,155,0,0,0,0,0,0,0,0,0,29,148,210,37,126,194,8,93,157,2,68,118,1,39,69,1,17,33,41,151,213,27,123,193,3,82,144,1,58,105,1,32,60,1,13,26,59,159,220,23,126,198,4,88,151,1,66,114,1,38,71,1,18,34,114,136,232,51,114,207,11,83,155,3,56,105,1,33,65,1,17,34,149,65,234,121,57,215,61,49,166,28,36,114,12,25,76,3,16,42,214,49,220,132,63,188,42,65,137,0,0,0,0,0,0,0,0,0,85,137,221,104,131,216,49,111,192,21,87,155,2,49,87,1,16,28,89,163,230,90,137,220,29,100,183,10,70,135,2,42,81,1,17,33,108,167,237,55,133,222,15,97,179,4,72,135,1,45,85,1,19,38,124,146,240,66,124,224,17,88,175,4,58,122,1,36,75,1,18,37,141,79,241,126,70,227,66,58,182,30,44,136,12,34,96,2,20,47,229,99,249,143,111,235,46,109,192,0,0,0,0,0,0,0,0,0,82,158,236,94,146,224,25,117,191,9,87,149,3,56,99,1,33,57,83,167,237,68,145,222,10,103,177,2,72,131,1,41,79,1,20,39,99,167,239,47,141,224,10,104,178,2,73,133,1,44,85,1,22,47,127,145,243,71,129,228,17,93,177,3,61,124,1,41,84,1,21,52,157,78,244,140,72,231,69,58,184,31,44,137,14,38,105,8,23,61,125,34,187,52,41,133,6,31,56,0,0,0,0,0,0,0,0,0,37,109,153,51,102,147,23,87,128,8,67,101,1,41,63,1,19,29,31,154,185,17,127,175,6,96,145,2,73,114,1,51,82,1,28,45,23,163,200,10,131,185,2,93,148,1,67,111,1,41,69,1,14,24,29,176,217,12,145,201,3,101,156,1,69,111,1,39,63,1,14,23,57,192,233,25,154,215,6,109,167,3,78,118,1,48,69,1,21,29,202,105,245,108,106,216,18,90,144,0,0,0,0,0,0,0,0,0,33,172,219,64,149,206,14,117,177,5,90,141,2,61,95,1,37,57,33,179,220,11,140,198,1,89,148,1,60,104,1,33,57,1,12,21,30,181,221,8,141,198,1,87,145,1,58,100,1,31,55,1,12,20,32,186,224,7,142,198,1,86,143,1,58,100,1,31,55,1,12,22,57,192,227,20,143,204,3,96,154,1,68,112,1,42,69,1,19,32,212,35,215,113,47,169,29,48,105,0,0,0,0,0,0,0,0,0,74,129,203,106,120,203,49,107,178,19,84,144,4,50,84,1,15,25,71,172,217,44,141,209,15,102,173,6,76,133,2,51,89,1,24,42,64,185,231,31,148,216,8,103,175,3,74,131,1,46,81,1,18,30,65,196,235,25,157,221,5,105,174,1,67,120,1,38,69,1,15,30,65,204,238,30,156,224,7,107,177,2,70,124,1,42,73,1,18,34,225,86,251,144,104,235,42,99,181,0,0,0,0,0,0,0,0,0,85,175,239,112,165,229,29,136,200,12,103,162,6,77,123,2,53,84,75,183,239,30,155,221,3,106,171,1,74,128,1,44,76,1,17,28,73,185,240,27,159,222,2,107,172,1,75,127,1,42,73,1,17,29,62,190,238,21,159,222,2,107,172,1,72,122,1,40,71,1,18,32,61,199,240,27,161,226,4,113,180,1,76,129,1,46,80,1,23,41,7,27,153,5,30,95,1,16,30,0,0,0,0,0,0,0,0,0,50,75,127,57,75,124,27,67,108,10,54,86,1,33,52,1,12,18,43,125,151,26,108,148,7,83,122,2,59,89,1,38,60,1,17,27,23,144,163,13,112,154,2,75,117,1,50,81,1,31,51,1,14,23,18,162,185,6,123,171,1,78,125,1,51,86,1,31,54,1,14,23,15,199,227,3,150,204,1,91,146,1,55,95,1,30,53,1,11,20,19,55,240,19,59,196,3,52,105,0,0,0,0,0,0,0,0,0,41,166,207,104,153,199,31,123,181,14,101,152,5,72,106,1,36,52,35,176,211,12,131,190,2,88,144,1,60,101,1,36,60,1,16,28,28,183,213,8,134,191,1,86,142,1,56,96,1,30,53,1,12,20,20,190,215,4,135,192,1,84,139,1,53,91,1,28,49,1,11,20,13,196,216,2,137,192,1,86,143,1,57,99,1,32,56,1,13,24,211,29,217,96,47,156,22,43,87,0,0,0,0,0,0,0,0,0,78,120,193,111,116,186,46,102,164,15,80,128,2,49,76,1,18,28,71,161,203,42,132,192,10,98,150,3,69,109,1,44,70,1,18,29,57,186,211,30,140,196,4,93,146,1,62,102,1,38,65,1,16,27,47,199,217,14,145,196,1,88,142,1,57,98,1,36,62,1,15,26,26,219,229,5,155,207,1,94,151,1,60,104,1,36,62,1,16,28,233,29,248,146,47,220,43,52,140,0,0,0,0,0,0,0,0,0,100,163,232,179,161,222,63,142,204,37,113,174,26,89,137,18,68,97,85,181,230,32,146,209,7,100,164,3,71,121,1,45,77,1,18,30,65,187,230,20,148,207,2,97,159,1,68,116,1,40,70,1,14,29,40,194,227,8,147,204,1,94,155,1,65,112,1,39,66,1,14,26,16,208,228,3,151,207,1,98,160,1,67,117,1,41,74,1,17,31,17,38,140,7,34,80,1,17,29,0,0,0,0,0,0,0,0,0,37,75,128,41,76,128,26,66,116,12,52,94,2,32,55,1,10,16,50,127,154,37,109,152,16,82,121,5,59,85,1,35,54,1,13,20,40,142,167,17,110,157,2,71,112,1,44,72,1,27,45,1,11,17,30,175,188,9,124,169,1,74,116,1,48,78,1,30,49,1,11,18,10,222,223,2,150,194,1,83,128,1,48,79,1,27,45,1,11,17,36,41,235,29,36,193,10,27,111,0,0,0,0,0,0,0,0,0,85,165,222,177,162,215,110,135,195,57,113,168,23,83,120,10,49,61,85,190,223,36,139,200,5,90,146,1,60,103,1,38,65,1,18,30,72,202,223,23,141,199,2,86,140,1,56,97,1,36,61,1,16,27,55,218,225,13,145,200,1,86,141,1,57,99,1,35,61,1,13,22,15,235,212,1,132,184,1,84,139,1,57,97,1,34,56,1,14,23,181,21,201,61,37,123,10,38,71,0,0,0,0,0,0,0,0,0,47,106,172,95,104,173,42,93,159,18,77,131,4,50,81,1,17,23,62,147,199,44,130,189,28,102,154,18,75,115,2,44,65,1,12,19,55,153,210,24,130,194,3,93,146,1,61,97,1,31,50,1,10,16,49,186,223,17,148,204,1,96,142,1,53,83,1,26,44,1,11,17,13,217,212,2,136,180,1,78,124,1,50,83,1,29,49,1,14,23,197,13,247,82,17,222,25,17,162,0,0,0,0,0,0,0,0,0,126,186,247,234,191,243,176,177,234,104,158,220,66,128,186,55,90,137,111,197,242,46,158,219,9,104,171,2,65,125,1,44,80,1,17,91,104,208,245,39,168,224,3,109,162,1,79,124,1,50,102,1,43,102,84,220,246,31,177,231,2,115,180,1,79,134,1,55,77,1,60,79,43,243,240,8,180,217,1,115,166,1,84,121,1,51,67,1,16,6,137,30,42,148,151,207,70,52,91,92,45,102,136,116,180,74,90,100,73,32,19,187,222,215,46,34,100,91,30,32,116,121,186,93,86,94,72,35,36,149,68,206,68,63,105,73,31,28,138,57,124,55,122,151,67,23,21,140,126,197,40,37,171,86,27,28,128,154,212,45,43,53,74,32,27,107,86,160,63,134,102,59,67,44,140,161,202,78,67,119,63,36,126,146,123,158,60,90,96,43,46,168,134,107,128,69,142,92,44,29,68,159,201,177,50,57,77,58,38,76,114,97,172,78,133,92,46,41,76,140,63,184,69,112,57,38,32,85,140,46,112,54,151,133,39,27,61,131,110,175,44,75,136,52,30,74,113,130,175,51,64,58,47,35,80,100,74,143,64,163,74,36,61,116,114,128,162,80,125,82,82,26,26,171,208,204,44,32,105,55,44,68,166,179,192,57,57,108,42,26,11,199,241,228,23,15,85,68,42,19,131,160,199,55,52,83,58,50,25,139,115,232,39,52,118,50,35,33,153,104,162,64,59,131,44,24,16,150,177,202,33,19,156,55,27,12,153,203,218,26,27,49,53,49,21,110,116,168,59,80,76,38,72,19,168,203,212,50,50,107,103,26,36,129,132,201,83,80,93,59,38,83,112,103,162,98,136,90,62,30,23,158,200,207,59,57,50,67,30,29,84,86,191,102,91,59,60,32,33,112,71,220,64,89,104,53,26,34,130,56,149,84,120,103,53,21,23,133,109,210,56,77,172,77,19,29,112,142,228,55,66,36,61,29,29,93,97,165,83,175,162,47,47,43,114,137,181,100,99,95,69,23,29,128,83,199,46,44,101,53,40,55,139,69,183,61,80,110,40,29,19,161,180,207,43,24,91,60,34,19,105,61,198,53,64,89,52,31,22,158,40,209,58,62,89,44,31,29,147,46,158,56,102,198,35,19,12,135,87,209,41,45,167,55,25,21,118,95,215,38,39,66,51,38,25,113,58,164,70,93,97,47,54,34,146,108,203,72,103,151,64,19,37,156,66,138,49,95,133,46,27,80,150,55,124,55,121,135,36,23,27,165,149,166,54,64,118,53,21,36,131,63,163,60,109,81,40,26,35,154,40,185,51,97,123,35,19,34,179,19,97,48,129,124,36,20,26,136,62,164,33,77,154,45,18,32,130,90,157,40,79,91,45,26,28,129,45,129,49,147,123,38,44,51,136,74,162,57,97,121,75,17,22,136,138,185,32,34,166,56,39,58,133,117,173,48,53,187,35,21,12,161,212,207,20,23,145,56,29,19,117,109,181,55,68,112,47,29,17,153,64,220,59,51,114,46,16,24,136,76,147,41,64,172,34,17,11,108,152,187,13,15,209,51,24,14,115,133,209,32,26,104,55,30,18,122,79,179,44,88,116,37,49,25,129,168,164,41,54,148,82,22,32,127,143,213,39,41,70,62,44,61,123,105,189,48,57,64,47,25,17,175,222,220,24,30,86,68,36,17,106,102,206,59,74,74,57,39,23,151,68,216,55,63,58,49,30,35,141,70,168,82,40,115,51,25,15,136,129,202,38,35,139,68,26,16,111,141,215,29,28,28,59,39,19,114,75,180,77,104,42,40,61,26,126,152,206,61,59,93,78,23,39,111,117,170,74,124,94,48,34,86,101,92,146,78,179,134,47,22,24,138,187,178,68,69,59,56,25,33,105,112,187,95,177,129,48,31,27,114,63,183,82,116,56,43,28,37,121,63,123,61,192,169,42,17,24,109,97,177,56,76,122,58,18,28,105,139,182,70,92,63,46,23,32,74,86,150,67,183,88,36,38,48,92,122,165,88,137,91,65,70,60,155,159,199,61,60,81,44,78,115,132,119,173,71,112,93,39,38,21,184,227,206,42,32,64,58,47,36,124,137,193,80,82,78,49,50,35,144,95,205,63,78,59,41,53,52,148,71,142,65,128,51,40,36,28,143,143,202,40,55,137,52,34,29,129,183,227,42,35,43,42,44,44,104,105,164,64,130,80,43,81,53,140,169,204,68,84,72,144,11,54,157,195,130,46,58,108,118,15,123,148,131,101,44,93,131,113,12,23,188,226,142,26,32,125,120,11,50,123,163,135,64,77,103,113,9,36,155,111,157,32,44,161,116,9,55,176,76,96,37,61,149,115,9,28,141,161,167,21,25,193,120,12,32,145,195,142,32,38,86,116,12,64,120,140,125,49,115,121,102,19,66,162,182,122,35,59,128,158,97,94,93,24,99,85,119,44,62,59,67,149,53,53,94,20,48,83,53,24,52,18,18,150,40,39,78,12,26,67,33,11,24,7,5,174,35,49,68,11,27,57,15,9,12,3,3,0,2,247,4,255,6,8,12,254,10,252,251,253,14,248,16,250,249,254,2,0,4,255,253,0,2,255,4,254,253,0,2,255,254,120,7,76,176,208,126,28,54,103,48,12,154,155,139,90,34,117,119,67,6,25,204,243,158,13,21,96,97,5,44,131,176,139,48,68,97,83,5,42,156,111,152,26,49,152,80,5,58,178,74,83,33,62,145,86,5,32,154,192,168,14,22,163,85,5,32,156,216,148,19,29,73,77,7,64,116,132,122,37,126,120,101,21,107,181,192,103,19,67,125,65,32,18,144,162,194,41,51,98,132,68,18,165,217,196,45,40,78,173,80,19,176,240,193,64,35,46,221,135,38,194,248,121,96,85,29,199,122,141,147,63,159,148,133,118,121,104,114,174,73,87,92,41,83,82,99,50,53,39,39,177,58,59,68,26,63,52,79,25,17,14,12,222,34,30,72,16,44,58,32,12,10,7,6,239,183,119,96,41,50,126,123,221,226,33,16,77,74,142,142,172,170,238,247,3,136,37,5,52,13,20,152,15,101,100,66,192,128,64,2,173,34,7,145,85,7,166,63,7,94,66,8,64,46,17,81,31,25,29,30,0,2,255,4,254,253,0,2,255,4,6,8,254,253,10,12,252,251,250,14,16,18,249,248,247,246,0,255,0,2,255,4,254,253,0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,32,64,96,128,224,144,192,168,192,176,192,198,198,245,216,136,140,148,160,176,192,224,234,234,240,128,128,64,96,112,64,64,96,64,160,128,128,216,128,176,160,176,176,192,198,198,208,208,136,140,148,160,176,192,224,234,234,240,128,128,64,96,112,64,64,96,64,160,128,2,4,6,8,10,12,0,255,254,253,252,251,250,249,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,108,102,95,115,121,110,99,45,62,108,102,100,97,116,97,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,108,102,95,115,121,110,99,45,62,99,117,114,95,115,98,95,99,111,108,0,1,1,2,2,2,4,4,4,8,8,8,16,16,1,2,1,2,4,2,4,8,4,8,16,8,16,1,1,1,1,1,2,2,2,4,4,4,8,8,1,1,1,1,2,1,2,4,2,4,8,4,8,0,1,2,3,4,5,6,7,8,9,10,11,12,13,13,13,2,13,13,5,13,13,8,13,13,11,13,13,13,1,13,13,4,13,13,7,13,13,10,13,13,13,0,13,13,3,13,13,6,13,13,9,0,0,0,1,1,1,2,2,2,3,3,3,3,0,1,2,3,3,0,13,13,13,1,0,13,13,2,13,0,13,3,2,1,0,4,3,13,1,5,13,3,2,6,5,4,3,7,6,13,4,8,13,6,5,9,8,7,6,10,9,13,7,11,13,9,8,12,11,10,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,2,1,1,1,2,1,1,1,0,0,0,0,1,1,1,1,2,2,1,1,2,2,1,1,0,0,0,0,1,1,1,1,2,1,2,1,2,1,2,1,0,0,0,0,1,1,1,1,2,2,2,2,3,2,2,2,0,0,0,0,1,1,1,1,2,2,2,2,3,3,2,2,0,0,0,0,1,1,1,1,2,2,2,2,3,2,3,2,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,15,15,15,14,14,15,14,14,14,12,12,14,12,12,12,8,8,12,8,8,8,0,0,8,0,0,87,101,98,77,32,80,114,111,106,101,99,116,32,86,80,57,32,68,101,99,111,100,101,114,32,118,49,46,54,46,49,45,49,45,103,51,48,49,99,48,54,101,57,101,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,95,119,111,114,107,101,114,115,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,95,119,111,114,107,101,114,95,100,97,116,97,0,70,114,97,109,101,32,87,111,114,107,101,114,32,116,104,114,101,97,100,32,99,114,101,97,116,105,111,110,32,102,97,105,108,101,100,0,70,97,105,108,101,100,32,116,111,32,105,110,105,116,105,97,108,105,122,101,32,105,110,116,101,114,110,97,108,32,102,114,97,109,101,32,98,117,102,102,101,114,115,0,70,114,97,109,101,32,111,117,116,112,117,116,32,99,97,99,104,101,32,105,115,32,102,117,108,108,46,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,105,122,101,32,105,110,32,105,110,100,101,120,0,70,97,105,108,101,100,32,116,111,32,114,101,97,108,108,111,99,97,116,101,32,115,99,114,97,116,99,104,32,98,117,102,102,101,114,0,78,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,102,114,97,109,101,32,112,97,114,97,108,108,101,108,32,100,101,99,111,100,101,0,73,110,118,97,108,105,100,32,117,115,97,103,101,32,111,102,32,115,101,103,101,109,101,110,116,32,102,101,97,116,117,114,101,32,111,110,32,115,109,97,108,108,32,98,108,111,99,107,115,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,109,97,114,107,101,114,0,85,110,115,117,112,112,111,114,116,101,100,32,98,105,116,115,116,114,101,97,109,32,112,114,111,102,105,108,101,0,66,117,102,102,101,114,32,37,100,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,97,32,100,101,99,111,100,101,100,32,102,114,97,109,101,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,121,110,99,32,99,111,100,101,0,70,97,105,108,101,100,32,116,111,32,100,101,99,111,100,101,32,102,114,97,109,101,32,115,105,122,101,0,73,110,118,97,108,105,100,32,102,114,97,109,101,32,115,105,122,101,0,82,101,102,101,114,101,110,99,101,100,32,102,114,97,109,101,32,104,97,115,32,105,110,118,97,108,105,100,32,115,105,122,101,0,82,101,102,101,114,101,110,99,101,100,32,102,114,97,109,101,32,104,97,115,32,105,110,99,111,109,112,97,116,105,98,108,101,32,99,111,108,111,114,32,102,111,114,109,97,116,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,102,114,97,109,101,32,98,117,102,102,101,114,0,1,0,2,3,75,101,121,102,114,97,109,101,32,47,32,105,110,116,114,97,45,111,110,108,121,32,102,114,97,109,101,32,114,101,113,117,105,114,101,100,32,116,111,32,114,101,115,101,116,32,100,101,99,111,100,101,114,32,115,116,97,116,101,0,73,110,118,97,108,105,100,32,110,117,109,98,101,114,32,111,102,32,116,105,108,101,32,99,111,108,117,109,110,115,0,73,110,118,97,108,105,100,32,104,101,97,100,101,114,32,115,105,122,101,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,104,101,97,100,101,114,32,108,101,110,103,116,104,0,85,110,105,110,105,116,105,97,108,105,122,101,100,32,101,110,116,114,111,112,121,32,99,111,110,116,101,120,116,46,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,48,0,68,101,99,111,100,101,32,102,97,105,108,101,100,46,32,70,114,97,109,101,32,100,97,116,97,32,104,101,97,100,101,114,32,105,115,32,99,111,114,114,117,112,116,101,100,46,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,116,105,108,101,95,119,111,114,107,101,114,95,100,97,116,97,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,116,105,108,101,95,119,111,114,107,101,114,115,0,84,105,108,101,32,100,101,99,111,100,101,114,32,116,104,114,101,97,100,32,99,114,101,97,116,105,111,110,32,102,97,105,108,101,100,0,68,101,99,111,100,101,32,102,97,105,108,101,100,46,32,70,114,97,109,101,32,100,97,116,97,32,105,115,32,99,111,114,114,117,112,116,101,100,46,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,112,98,105,45,62,108,102,95,119,111,114,107,101,114,46,100],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);allocate([97,116,97,49,0,76,111,111,112,32,102,105,108,116,101,114,32,116,104,114,101,97,100,32,99,114,101,97,116,105,111,110,32,102,97,105,108,101,100,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,116,105,108,101,32,108,101,110,103,116,104,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,98,111,111,108,32,100,101,99,111,100,101,114,32,37,100,0,70,97,105,108,101,100,32,116,111,32,100,101,99,111,100,101,32,116,105,108,101,32,100,97,116,97,0,73,110,118,97,108,105,100,32,98,108,111,99,107,32,115,105,122,101,46,0,82,101,102,101,114,101,110,99,101,32,102,114,97,109,101,32,104,97,115,32,105,110,118,97,108,105,100,32,100,105,109,101,110,115,105,111,110,115,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,32,111,114,32,99,111,114,114,117,112,116,32,116,105,108,101,32,115,105,122,101,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,111,110,116,101,120,116,32,98,117,102,102,101,114,115,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,109,45,62,99,117,114,95,102,114,97,109,101,45,62,109,118,115,0,52,58,50,58,48,32,99,111,108,111,114,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,112,114,111,102,105,108,101,32,49,32,111,114,32,51,0,82,101,115,101,114,118,101,100,32,98,105,116,32,115,101,116,0,52,58,52,58,52,32,99,111,108,111,114,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,112,114,111,102,105,108,101,32,48,32,111,114,32,50,0,84,114,117,110,99,97,116,101,100,32,112,97,99,107,101,116,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,109,45,62,102,99,0,70,97,105,108,101,100,32,116,111,32,97,108,108,111,99,97,116,101,32,99,109,45,62,102,114,97,109,101,95,99,111,110,116,101,120,116,115,0,78,111,32,39,108,97,115,116,39,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,0,73,110,99,111,114,114,101,99,116,32,98,117,102,102,101,114,32,100,105,109,101,110,115,105,111,110,115,0,73,110,118,97,108,105,100,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,0,73,110,118,97,108,105,100,32,114,101,102,101,114,101,110,99,101,32,102,114,97,109,101,32,109,97,112,0,85,110,97,98,108,101,32,116,111,32,102,105,110,100,32,102,114,101,101,32,102,114,97,109,101,32,98,117,102,102,101,114,0,7,20,33,46,59,72,85,98,111,124,137,150,163,176,189,202,215,228,241,254,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,73,74,75,76,77,78,79,80,81,82,83,84,86,87,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,132,133,134,135,136,138,139,140,141,142,143,144,145,146,147,148,149,151,152,153,154,155,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,172,173,174,175,177,178,179,180,181,182,183,184,185,186,187,188,190,191,192,193,194,195,196,197,198,199,200,201,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,229,230,231,232,233,234,235,236,237,238,239,240,242,243,244,245,246,247,248,249,250,251,252,253,253,86,80,88,32,112,114,111,99,101,115,115,95,104,101,97,100,101,114,32,115,104,111,117,108,100,32,110,111,116,32,104,97,112,112,101,110,63,0,103,111,116,32,109,117,108,116,105,112,108,101,32,102,114,97,109,101,115,32,102,114,111,109,32,86,80,57,32,115,116,114,101,97,109,32,117,110,101,120,112,101,99,116,101,100,108,121,63,0,83,107,105,112,112,105,110,103,32,102,114,97,109,101,32,119,105,116,104,32,117,110,107,110,111,119,110,32,112,105,99,116,117,114,101,32,116,121,112,101,32,37,100,10,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+30720);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_i64Subtract\"]=_i64Subtract;Module[\"_i64Add\"]=_i64Add;Module[\"_memset\"]=_memset;Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _abort(){Module[\"abort\"]()}function _realloc(){throw\"bad\"}Module[\"_realloc\"]=_realloc;Module[\"_saveSetjmp\"]=_saveSetjmp;Module[\"_testSetjmp\"]=_testSetjmp;function _longjmp(env,value){Module[\"setThrew\"](env,value||1);throw\"longjmp\"}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);Module[\"_llvm_cttz_i32\"]=_llvm_cttz_i32;Module[\"___udivmoddi4\"]=___udivmoddi4;Module[\"___udivdi3\"]=___udivdi3;Module[\"___muldsi3\"]=___muldsi3;Module[\"___muldi3\"]=___muldi3;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;Module[\"_memmove\"]=_memmove;Module[\"___uremdi3\"]=___uremdi3;Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight){var HEAPU8=Module.HEAPU8,format=Module.videoFormat,countBytesY=strideY*height,countBytesCb=strideCb*chromaHeight,countBytesCr=strideCr*chromaHeight;Module.frameBuffer={format:{width:width,height:height,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:format.cropLeft,cropTop:format.cropTop,cropWidth:format.cropWidth,cropHeight:format.cropHeight,displayWidth:format.displayWidth,displayHeight:format.displayHeight},y:{bytes:copyByteArray(HEAPU8.subarray(bufferY,bufferY+countBytesY)),stride:strideY},u:{bytes:copyByteArray(HEAPU8.subarray(bufferCb,bufferCb+countBytesCb)),stride:strideCb},v:{bytes:copyByteArray(HEAPU8.subarray(bufferCr,bufferCr+countBytesCr)),stride:strideCr}}}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{Module[\"dynCall_viiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_i(index){try{return Module[\"dynCall_i\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_viiiiiiiiii\":invoke_viiiiiiiiii,\"invoke_i\":invoke_i,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_ii\":invoke_ii,\"invoke_v\":invoke_v,\"invoke_iiiii\":invoke_iiiii,\"invoke_viiiiii\":invoke_viiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_frame\":_ogvjs_callback_frame,\"_longjmp\":_longjmp,\"___syscall6\":___syscall6,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_iiii;var aa=env.invoke_viiiiiiiiii;var ba=env.invoke_i;var ca=env.invoke_vi;var da=env.invoke_vii;var ea=env.invoke_ii;var fa=env.invoke_v;var ga=env.invoke_iiiii;var ha=env.invoke_viiiiii;var ia=env.invoke_iii;var ja=env.invoke_iiiiii;var ka=env.invoke_viiii;var la=env._ogvjs_callback_frame;var ma=env._longjmp;var na=env.___syscall6;var oa=env.___setErrNo;var pa=env._abort;var qa=env._emscripten_memcpy_big;var ra=env.___syscall54;var sa=env.___syscall140;var ta=env.___syscall146;var ua=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction Ha(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function Ia(){return l|0}function Ja(a){a=a|0;l=a}function Ka(a,b){a=a|0;b=b|0;l=a;m=b}function La(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Ma(a){a=a|0;D=a}function Na(){return D|0}function Oa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;if((f|0)==10)if((a|0)!=0&(b|0)!=0)if((c[b+4>>2]|0)==5){f=c[b+8>>2]|0;if((!((e&65536|0)!=0&(f&262144|0)==0)?!((e&131072|0)!=0&(f&524288|0)==0):0)?!((f&1|0)==0|(e&262144|0)!=0&(f&1048576|0)==0):0){f=a+8|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a+4>>2]=b;c[a>>2]=c[b>>2];f=a+24|0;c[f>>2]=0;c[a+16>>2]=e;c[a+20>>2]=d;d=Ea[c[b+12>>2]&31](a,0)|0;if(!d)g=0;else{b=c[f>>2]|0;if(!b)h=0;else h=c[b>>2]|0;c[a+12>>2]=h;Ra(a)|0;g=d}}else g=4}else g=3;else{i=8;j=11}else{i=3;j=11}if((j|0)==11)if(!a){k=i;return k|0}else g=i;c[a+8>>2]=g;k=g;return k|0}function Pa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;if(!a){g=8;return g|0}if((b|0)==0^(d|0)!=0){h=c[a+4>>2]|0;if((h|0)!=0?(i=c[a+24>>2]|0,(i|0)!=0):0)j=Fa[c[h+32>>2]&3](i,b,d,e,f)|0;else j=1}else j=8;c[a+8>>2]=j;g=j;return g|0}function Qa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if(!((a|0)!=0&(b|0)!=0)){d=0;return d|0}e=c[a+4>>2]|0;if(!e){d=0;return d|0}f=c[a+24>>2]|0;if(!f){d=0;return d|0}d=Ea[c[e+36>>2]&31](f,b)|0;return d|0}function Ra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if(!a){b=8;return b|0}d=a+4|0;e=c[d>>2]|0;if((e|0)!=0?(f=a+24|0,g=c[f>>2]|0,(g|0)!=0):0){Aa[c[e+16>>2]&7](g)|0;c[d>>2]=0;c[a>>2]=0;c[f>>2]=0;h=0}else h=1;c[a+8>>2]=h;b=h;return b|0}function Sa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+16|0;h=g;c[b>>2]=d;d=b+4|0;c[d>>2]=0;if(e|0){c[d>>2]=1;c[h>>2]=f;sg(b+8|0,79,e,h)|0;a[b+87>>0]=0}if(!(c[b+88>>2]|0)){l=g;return}else ma(b+92|0,c[b>>2]|0)}function Ta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=ph(a|0,0,3,0)|0;e=ph(d|0,D|0,b|0,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&e>>>0<2147418113)&((e|0)==(e|0)&(b|0)==0))){f=0;return f|0}b=ih(e)|0;e=a+-1+(b+4)&0-a;if(!b){f=0;return f|0}c[e+-4>>2]=b;f=e;return f|0}function Ua(a){a=a|0;var b=0,d=0;b=ph(a|0,0,11,0)|0;a=D;if(!((a>>>0<0|(a|0)==0&b>>>0<2147418113)&((b|0)==(b|0)&(a|0)==0))){d=0;return d|0}a=ih(b)|0;b=a+4+7&-8;if(!a){d=0;return d|0}c[b+-4>>2]=a;d=b;return d|0}function Va(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if(a|0?(d=S(b,a)|0,e=(a|0)==0,f=yh(2147418112,0,a|0,0)|0,g=D,(e?0:((d>>>0)/((e?1:a)>>>0)|0|0)!=(b|0))|(g>>>0<0|(g|0)==0&f>>>0<b>>>0)):0){h=0;return h|0}f=S(b,a)|0;a=ph(f|0,0,11,0)|0;b=D;if(!((b>>>0<0|(b|0)==0&a>>>0<2147418113)&((a|0)==(a|0)&(b|0)==0))){h=0;return h|0}b=ih(a)|0;a=b+4+7&-8;g=a;if(!b){h=0;return h|0}c[g+-4>>2]=b;if(!a){h=0;return h|0}qh(g|0,0,f|0)|0;h=g;return h|0}function Wa(a){a=a|0;if(!a)return;jh(c[a+-4>>2]|0);return}function Xa(a){a=a|0;var b=0,d=0;if(!a){b=-1;return b|0}if((c[a+72>>2]|0)>0)Wa(c[a+68>>2]|0);d=a;a=d+120|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(a|0));b=0;return b|0}function Ya(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;if(!a){l=-2;return l|0}m=(h|0)==0?1:h;n=b+7&-8;o=d+7&-8;p=g<<1;q=n+31+p&-32;r=p+o|0;p=Ah(q|0,((q|0)<0)<<31>>31|0,r|0,((r|0)<0)<<31>>31|0)|0;r=((h|0)<0)<<31>>31;s=ph(p|0,D|0,h|0,r|0)|0;p=D;t=n>>e;u=o>>f;v=q>>e;w=g>>e;x=g>>f;y=(x<<1)+u|0;z=Ah(v|0,((v|0)<0)<<31>>31|0,y|0,((y|0)<0)<<31>>31|0)|0;y=ph(z|0,D|0,h|0,r|0)|0;r=sh(y|0,D|0,1)|0;h=ph(r|0,D|0,s|0,p|0)|0;p=D;do if(!j){r=a+72|0;if(p>>>0>0|((p|0)==0?h>>>0>(c[r>>2]|0)>>>0:0)){z=a+68|0;Wa(c[z>>2]|0);c[z>>2]=0;if(!((h|0)==(h|0)&(p|0)==0)){l=-1;return l|0}A=Ta(32,h)|0;c[z>>2]=A;if(!A){l=-1;return l|0}else{c[r>>2]=h;qh(A|0,0,h|0)|0;break}}}else{A=ph(h|0,p|0,31,0)|0;r=D;if(!((A|0)==(A|0)&(r|0)==0)){l=-1;return l|0}if((va[j&7](k,A,i)|0)<0){l=-1;return l|0}z=c[i>>2]|0;if(!z){l=-1;return l|0}if(0<r>>>0|(0==(r|0)?(c[i+4>>2]|0)>>>0<A>>>0:0)){l=-1;return l|0}else{c[a+68>>2]=z+31&-32;break}}while(0);if(g&31|0){l=-3;return l|0}c[a+8>>2]=b;c[a+12>>2]=d;c[a>>2]=n;c[a+4>>2]=o;c[a+16>>2]=q;c[a+28>>2]=e+b>>e;c[a+32>>2]=f+d>>f;c[a+20>>2]=t;c[a+24>>2]=u;c[a+36>>2]=v;c[a+76>>2]=g;c[a+80>>2]=h;c[a+84>>2]=e;c[a+88>>2]=f;f=c[a+68>>2]|0;e=m+-1|0;h=0-m|0;c[a+52>>2]=f+(S(q,g)|0)+g+e&h;g=f+s|0;s=S(v,x)|0;c[a+56>>2]=g+s+w+e&h;c[a+60>>2]=g+y+s+w+e&h;c[a+112>>2]=0;l=0;return l|0}function Za(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=c[b+76>>2]|0;e=(d|0)/2|0;f=c[b+52>>2]|0;g=c[b+16>>2]|0;h=c[b+8>>2]|0;i=c[b+12>>2]|0;j=d-i+(c[b+4>>2]|0)|0;k=(c[b>>2]|0)+d|0;l=k-h|0;m=k+d|0;k=f+h|0;h=0-d|0;n=f+h|0;if((i|0)>0){o=n;p=k;q=0;r=f;s=k+-1|0;while(1){qh(o|0,a[r>>0]|0,d|0)|0;qh(p|0,a[s>>0]|0,l|0)|0;q=q+1|0;if((q|0)==(i|0))break;else{o=o+g|0;p=p+g|0;r=r+g|0;s=s+g|0}}}s=f+(S(i+-1|0,g)|0)+h|0;r=f+(S(i,g)|0)+h|0;if((d|0)>0){i=f+(S(g,h)|0)+h|0;h=0;while(1){vh(i|0,n|0,m|0)|0;h=h+1|0;if((h|0)==(d|0))break;else i=i+g|0}}if((j|0)>0){i=r;r=0;while(1){vh(i|0,s|0,m|0)|0;r=r+1|0;if((r|0)==(j|0))break;else i=i+g|0}}g=c[b+56>>2]|0;i=b+36|0;j=c[i>>2]|0;r=b+28|0;m=c[r>>2]|0;s=b+32|0;h=c[s>>2]|0;n=b+24|0;f=e-h+(c[n>>2]|0)|0;p=b+20|0;o=(c[p>>2]|0)+e|0;q=o-m|0;l=o+e|0;o=g+m|0;m=0-e|0;k=g+m|0;if((h|0)>0){t=k;u=o;v=0;w=g;x=o+-1|0;while(1){qh(t|0,a[w>>0]|0,e|0)|0;qh(u|0,a[x>>0]|0,q|0)|0;v=v+1|0;if((v|0)==(h|0))break;else{t=t+j|0;u=u+j|0;w=w+j|0;x=x+j|0}}}x=g+(S(h+-1|0,j)|0)+m|0;w=g+(S(h,j)|0)+m|0;h=(d|0)>1;if(h){d=g+(S(j,m)|0)+m|0;g=0;while(1){vh(d|0,k|0,l|0)|0;g=g+1|0;if((g|0)==(e|0))break;else d=d+j|0}}if((f|0)>0){d=w;w=0;while(1){vh(d|0,x|0,l|0)|0;w=w+1|0;if((w|0)==(f|0))break;else d=d+j|0}}j=c[b+60>>2]|0;b=c[i>>2]|0;i=c[r>>2]|0;r=c[s>>2]|0;s=e-r+(c[n>>2]|0)|0;n=(c[p>>2]|0)+e|0;p=n-i|0;d=n+e|0;n=j+i|0;i=j+m|0;if((r|0)>0){f=i;w=n;l=0;x=j;g=n+-1|0;while(1){qh(f|0,a[x>>0]|0,e|0)|0;qh(w|0,a[g>>0]|0,p|0)|0;l=l+1|0;if((l|0)==(r|0))break;else{f=f+b|0;w=w+b|0;x=x+b|0;g=g+b|0}}}g=j+(S(r+-1|0,b)|0)+m|0;x=j+(S(r,b)|0)+m|0;if(h){h=j+(S(b,m)|0)+m|0;m=0;while(1){vh(h|0,i|0,d|0)|0;m=m+1|0;if((m|0)==(e|0))break;else h=h+b|0}}if((s|0)>0){y=x;z=0}else return;while(1){vh(y|0,g|0,d|0)|0;z=z+1|0;if((z|0)==(s|0))break;else y=y+b|0}return}function _a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+4|0;if((c[d>>2]|0)>0){e=a+16|0;f=b+16|0;g=c[b+52>>2]|0;h=0;i=c[a+52>>2]|0;while(1){vh(g|0,i|0,c[a>>2]|0)|0;h=h+1|0;if((h|0)>=(c[d>>2]|0))break;else{g=g+(c[f>>2]|0)|0;i=i+(c[e>>2]|0)|0}}}e=a+24|0;if((c[e>>2]|0)<=0){Za(b);return}i=a+20|0;f=a+36|0;g=b+36|0;d=c[b+56>>2]|0;h=0;j=c[a+56>>2]|0;while(1){vh(d|0,j|0,c[i>>2]|0)|0;h=h+1|0;k=c[e>>2]|0;if((h|0)>=(k|0))break;else{d=d+(c[g>>2]|0)|0;j=j+(c[f>>2]|0)|0}}if((k|0)<=0){Za(b);return}k=a+20|0;f=a+36|0;j=b+36|0;g=c[b+60>>2]|0;d=0;h=c[a+60>>2]|0;while(1){vh(g|0,h|0,c[k>>2]|0)|0;d=d+1|0;if((d|0)>=(c[e>>2]|0))break;else{g=g+(c[j>>2]|0)|0;h=h+(c[f>>2]|0)|0}}Za(b);return}function $a(){if(c[8576]|0)return;c[8576]=1;return}function ab(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;bb(0,a,b,c,d)|0;return}function bb(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;h=a[d+b>>0]|0;i=h<<24>>24;if(h<<24>>24<1)j=c[f+(0-i<<2)>>2]|0;else j=bb(i,d,e,f,g)|0;i=a[d+(b+1)>>0]|0;h=i<<24>>24;if(i<<24>>24<1)k=c[f+(0-h<<2)>>2]|0;else k=bb(h,d,e,f,g)|0;f=b>>>1;b=a[e+f>>0]|0;e=k+j|0;if(!e){l=b;m=g+f|0;a[m>>0]=l;return e|0}k=c[19488+((e>>>0<20?e:20)<<2)>>2]|0;d=sh(j|0,0,8)|0;j=ph(e>>>1|0,0,d|0,D|0)|0;d=yh(j|0,D|0,e|0,0)|0;l=((S(256-k|0,b&255)|0)+128+(S(((255-d|0)>>>23|d)&255|(d|0)==0,k)|0)|0)>>>8&255;m=g+f|0;a[m>>0]=l;return e|0}function cb(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;if(!((b|0)!=0|(e|0)==0)){h=1;return h|0}c[a+12>>2]=b+e;c[a+16>>2]=b;c[a>>2]=0;b=a+8|0;c[b>>2]=-8;e=a+4|0;c[e>>2]=255;c[a+20>>2]=f;c[a+24>>2]=g;db(a);g=((c[e>>2]<<7)+128|0)>>>8;f=c[b>>2]|0;if((f|0)<0){db(a);i=c[b>>2]|0}else i=f;f=c[a>>2]|0;j=g<<24;if(f>>>0<j>>>0){k=0;l=g;m=f}else{k=1;l=(c[e>>2]|0)-g|0;m=f-j|0}j=d[1280+l>>0]|0;c[a>>2]=m<<j;c[b>>2]=i-j;c[e>>2]=l<<j;h=k;return h|0}function db(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=a+16|0;e=c[b>>2]|0;f=c[a>>2]|0;g=a+8|0;h=c[g>>2]|0;i=(c[a+12>>2]|0)-e|0;j=i<<3;k=16-h|0;l=c[a+20>>2]|0;m=a+28|0;if(!l)n=e;else{Ga[l&63](c[a+24>>2]|0,e,m,i>>>0<5?i:5);n=m}m=k+8|0;if(j>>>0<=32){i=m-j|0;e=(i|0)>-1;l=e?h+1073741824|0:h;o=e?i:0;if(e&(j|0)==0|(k|0)<(o|0)){p=n;q=l;r=f}else{j=n;e=l;l=k;i=f;while(1){f=e+8|0;s=j+1|0;t=(d[j>>0]|0)<<l|i;l=l+-8|0;if((l|0)<(o|0)){p=s;q=f;r=t;break}else{j=s;e=f;i=t}}}}else{i=m&-8;e=(Eh(d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24|0)|0)>>>(32-i|0);p=n+(m>>3)|0;q=i+h|0;r=e<<(k&7)|c[a>>2]}c[b>>2]=(c[b>>2]|0)+(p-n);c[a>>2]=r;c[g>>2]=q;return}function eb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+8|0;d=c[b>>2]|0;e=a+16|0;a=c[e>>2]|0;if((d+-9|0)>>>0<23){f=d;g=a}else{h=a;return h|0}do{a=f;f=f+-8|0;g=g+-1|0}while((a+-17|0)>>>0<23);c[b>>2]=f;c[e>>2]=g;h=g;return h|0}function fb(a){a=a|0;return ((c[a+8>>2]|0)+7|0)>>>3|0}function gb(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=a+8|0;e=c[b>>2]|0;f=(c[a>>2]|0)+(e>>>3)|0;if(f>>>0<(c[a+4>>2]|0)>>>0){g=(d[f>>0]|0)>>>(e&7^7)&1;c[b>>2]=e+1;h=g;return h|0}else{ya[c[a+16>>2]&15](c[a+12>>2]|0);h=0;return h|0}return 0}function hb(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((b|0)<=0){e=0;return e|0}f=a+8|0;g=a+4|0;h=a+16|0;i=a+12|0;j=b;b=0;while(1){k=j;j=j+-1|0;l=c[f>>2]|0;m=(c[a>>2]|0)+(l>>>3)|0;if(m>>>0<(c[g>>2]|0)>>>0){n=(d[m>>0]|0)>>>(l&7^7)&1;c[f>>2]=l+1;o=n}else{ya[c[h>>2]&15](c[i>>2]|0);o=0}n=o<<j|b;if((k|0)<=1){e=n;break}else b=n}return e|0}function ib(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=a+8|0;f=a+4|0;if((b|0)>0){g=a+16|0;h=a+12|0;i=b;b=0;while(1){j=i;i=i+-1|0;k=c[e>>2]|0;l=(c[a>>2]|0)+(k>>>3)|0;if(l>>>0<(c[f>>2]|0)>>>0){m=(d[l>>0]|0)>>>(k&7^7)&1;c[e>>2]=k+1;n=m}else{ya[c[g>>2]&15](c[h>>2]|0);n=0}m=n<<i|b;if((j|0)<=1){o=m;break}else b=m}}else o=0;b=c[e>>2]|0;i=(c[a>>2]|0)+(b>>>3)|0;if(i>>>0<(c[f>>2]|0)>>>0){f=d[i>>0]|0;c[e>>2]=b+1;return (f&1<<(b&7^7)|0?0-o|0:o)|0}else{ya[c[a+16>>2]&15](c[a+12>>2]|0);return o|0}return 0}function jb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;e=d[f>>0]|0;g=d[f+1>>0]|0;h=d[f+2>>0]|0;i=a[f+3>>0]|0;f=i&255;a[b>>0]=(e+1+g|0)>>>1;j=(g+1+h|0)>>>1&255;a[b+c>>0]=j;a[b+2>>0]=j;j=(h+1+f|0)>>>1&255;k=c<<1;a[b+k>>0]=j;a[b+(c+2)>>0]=j;a[b+1>>0]=(e+2+(g<<1)+h|0)>>>2;e=(g+2+(h<<1)+f|0)>>>2&255;a[b+(c+1)>>0]=e;a[b+3>>0]=e;e=(h+2+f+(f<<1)|0)>>>2&255;a[b+(k|1)>>0]=e;a[b+(c+3)>>0]=e;e=c*3|0;a[b+(e+3)>>0]=i;a[b+(e+2)>>0]=i;a[b+(e+1)>>0]=i;a[b+e>>0]=i;a[b+(k+2)>>0]=i;a[b+(k+3)>>0]=i;return}function kb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=d[e>>0]|0;g=d[e+1>>0]|0;h=d[e+2>>0]|0;i=d[e+3>>0]|0;j=d[e+4>>0]|0;k=d[e+5>>0]|0;l=d[e+6>>0]|0;a[b>>0]=(f+1+g|0)>>>1;e=(g+1+h|0)>>>1&255;m=c<<1;a[b+m>>0]=e;a[b+1>>0]=e;e=(h+1+i|0)>>>1&255;a[b+(m|1)>>0]=e;a[b+2>>0]=e;e=(i+1+j|0)>>>1&255;a[b+(m+2)>>0]=e;a[b+3>>0]=e;a[b+(m+3)>>0]=(j+1+k|0)>>>1;a[b+c>>0]=(f+2+(g<<1)+h|0)>>>2;f=(g+2+(h<<1)+i|0)>>>2&255;g=c*3|0;a[b+g>>0]=f;a[b+(c+1)>>0]=f;f=(h+2+(i<<1)+j|0)>>>2&255;a[b+(g+1)>>0]=f;a[b+(c+2)>>0]=f;f=(i+2+(j<<1)+k|0)>>>2&255;a[b+(g+2)>>0]=f;a[b+(c+3)>>0]=f;a[b+(g+3)>>0]=(j+2+(k<<1)+l|0)>>>2;return}function lb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;f=d[e+1>>0]|0;g=d[e+2>>0]|0;h=d[e+3>>0]|0;i=d[e+4>>0]|0;j=d[e+5>>0]|0;k=d[e+6>>0]|0;l=a[e+7>>0]|0;a[b>>0]=((d[e>>0]|0)+2+(f<<1)+g|0)>>>2;e=(f+2+(g<<1)+h|0)>>>2&255;a[b+c>>0]=e;a[b+1>>0]=e;e=(g+2+(h<<1)+i|0)>>>2&255;g=c<<1;a[b+g>>0]=e;a[b+(c+1)>>0]=e;a[b+2>>0]=e;e=(h+2+(i<<1)+j|0)>>>2&255;h=c*3|0;a[b+h>>0]=e;a[b+(g|1)>>0]=e;a[b+(c+2)>>0]=e;a[b+3>>0]=e;e=(i+2+(j<<1)+k|0)>>>2&255;a[b+(h+1)>>0]=e;a[b+(g+2)>>0]=e;a[b+(c+3)>>0]=e;e=(j+2+(k<<1)+(l&255)|0)>>>2&255;a[b+(h+2)>>0]=e;a[b+(g+3)>>0]=e;a[b+(h+3)>>0]=l;return}function mb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;f=d[e+-1>>0]|0;j=d[e>>0]|0;k=d[e+1>>0]|0;l=d[e+2>>0]|0;m=d[e+3>>0]|0;e=(f+1+j|0)>>>1&255;n=c<<1;a[b+(n|1)>>0]=e;a[b>>0]=e;e=(j+1+k|0)>>>1&255;a[b+(n+2)>>0]=e;a[b+1>>0]=e;e=(k+1+l|0)>>>1&255;a[b+(n+3)>>0]=e;a[b+2>>0]=e;a[b+3>>0]=(l+1+m|0)>>>1;e=g+2|0;o=c*3|0;a[b+o>>0]=(e+(h<<1)+i|0)>>>2;a[b+n>>0]=((g<<1)+2+h+f|0)>>>2;h=(e+(f<<1)+j|0)>>>2&255;a[b+(o+1)>>0]=h;a[b+c>>0]=h;h=(f+2+(j<<1)+k|0)>>>2&255;a[b+(o+2)>>0]=h;a[b+(c+1)>>0]=h;h=(j+2+(k<<1)+l|0)>>>2&255;a[b+(o+3)>>0]=h;a[b+(c+2)>>0]=h;a[b+(c+3)>>0]=(k+2+(l<<1)+m|0)>>>2;return}function nb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;n=d[e+3>>0]|0;e=c*3|0;a[b+e>>0]=(h+2+(i<<1)+(d[f+3>>0]|0)|0)>>>2;f=g+2|0;o=(f+(h<<1)+i|0)>>>2&255;i=c<<1;a[b+i>>0]=o;a[b+(e+1)>>0]=o;o=((g<<1)+2+h+j|0)>>>2&255;a[b+c>>0]=o;a[b+(i|1)>>0]=o;a[b+(e+2)>>0]=o;o=(f+(j<<1)+k|0)>>>2&255;a[b>>0]=o;a[b+(c+1)>>0]=o;a[b+(i+2)>>0]=o;a[b+(e+3)>>0]=o;o=(j+2+(k<<1)+l|0)>>>2&255;a[b+1>>0]=o;a[b+(c+2)>>0]=o;a[b+(i+3)>>0]=o;o=(k+2+(l<<1)+m|0)>>>2&255;a[b+2>>0]=o;a[b+(c+3)>>0]=o;a[b+3>>0]=(l+2+(m<<1)+n|0)>>>2;return}function ob(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=d[f>>0]|0;h=d[f+1>>0]|0;i=d[f+2>>0]|0;j=d[f+3>>0]|0;f=d[e+-1>>0]|0;k=d[e>>0]|0;l=d[e+1>>0]|0;m=d[e+2>>0]|0;e=g+1|0;n=(e+f|0)>>>1&255;a[b+(c+2)>>0]=n;a[b>>0]=n;n=(e+h|0)>>>1&255;e=c<<1;a[b+(e+2)>>0]=n;a[b+c>>0]=n;n=(h+1+i|0)>>>1&255;o=c*3|0;a[b+(o+2)>>0]=n;a[b+e>>0]=n;a[b+o>>0]=(i+1+j|0)>>>1;a[b+3>>0]=(k+2+(l<<1)+m|0)>>>2;a[b+2>>0]=(f+2+(k<<1)+l|0)>>>2;l=g+2|0;m=(l+(f<<1)+k|0)>>>2&255;a[b+(c+3)>>0]=m;a[b+1>>0]=m;m=((g<<1)+2+h+f|0)>>>2&255;a[b+(e+3)>>0]=m;a[b+(c+1)>>0]=m;m=(l+(h<<1)+i|0)>>>2&255;a[b+(o+3)>>0]=m;a[b+(e|1)>>0]=m;a[b+(o+1)>>0]=(h+2+(i<<1)+j|0)>>>2;return}function pb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qb(a,b,8,d);return}function qb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=e+-1|0;if((e|0)>1){h=0;do{i=h;h=h+1|0;a[b+(S(i,c)|0)>>0]=((d[f+i>>0]|0)+1+(d[f+h>>0]|0)|0)>>>1}while((h|0)!=(g|0))}h=f+g|0;i=S(g,c)|0;a[b+i>>0]=a[h>>0]|0;g=b+1|0;j=e+-2|0;k=(e|0)>2;if(k){l=0;do{m=l;l=l+1|0;a[g+(S(m,c)|0)>>0]=((d[f+m>>0]|0)+2+((d[f+l>>0]|0)<<1)+(d[f+(m+2)>>0]|0)|0)>>>2}while((l|0)!=(j|0))}l=d[h>>0]|0;a[g+(S(j,c)|0)>>0]=((d[f+j>>0]|0)+2+l+(l<<1)|0)>>>2;a[g+i>>0]=a[h>>0]|0;g=b+2|0;if(k){k=0;do{a[g+(k+i)>>0]=a[h>>0]|0;k=k+1|0}while((k|0)!=(j|0))}if((e|0)<2|(j|0)==0)return;else n=j;while(1){e=(S(n+1|0,c)|0)+-2|0;k=S(n,c)|0;h=0;do{a[g+(h+k)>>0]=a[g+(e+h)>>0]|0;h=h+1|0}while((h|0)<(j|0));if((n|0)>0)n=n+-1|0;else break}return}function rb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qb(a,b,16,d);return}function sb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qb(a,b,32,d);return}function tb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=0;do{g=e+f|0;h=f;f=f+1|0;i=e+f|0;a[b+h>>0]=((d[g>>0]|0)+1+(d[i>>0]|0)|0)>>>1;a[b+(h+c)>>0]=((d[g>>0]|0)+2+((d[i>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((f|0)!=8);f=e+7|0;e=b+c|0;h=b+(c<<1)|0;i=b+1|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;a[h+5>>0]=a[i+5>>0]|0;qh(h+6|0,a[f>>0]|0,2)|0;h=b+(c*3|0)|0;i=e+1|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;a[h+5>>0]=a[i+5>>0]|0;qh(h+6|0,a[f>>0]|0,2)|0;h=b+(c<<2)|0;i=b+2|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;qh(h+5|0,a[f>>0]|0,3)|0;h=b+(c*5|0)|0;i=e+2|0;a[h>>0]=a[i>>0]|0;a[h+1>>0]=a[i+1>>0]|0;a[h+2>>0]=a[i+2>>0]|0;a[h+3>>0]=a[i+3>>0]|0;a[h+4>>0]=a[i+4>>0]|0;qh(h+5|0,a[f>>0]|0,3)|0;h=b+(c*6|0)|0;i=b+3|0;g=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;a[h>>0]=g;a[h+1>>0]=g>>8;a[h+2>>0]=g>>16;a[h+3>>0]=g>>24;qh(h+4|0,a[f>>0]|0,4)|0;h=b+(c*7|0)|0;c=e+3|0;e=d[c>>0]|d[c+1>>0]<<8|d[c+2>>0]<<16|d[c+3>>0]<<24;a[h>>0]=e;a[h+1>>0]=e>>8;a[h+2>>0]=e>>16;a[h+3>>0]=e>>24;qh(h+4|0,a[f>>0]|0,4)|0;return}function ub(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;f=0;do{g=e+f|0;h=f;f=f+1|0;i=e+f|0;a[b+h>>0]=((d[g>>0]|0)+1+(d[i>>0]|0)|0)>>>1;a[b+(h+c)>>0]=((d[g>>0]|0)+2+((d[i>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((f|0)!=16);f=e+15|0;e=b+c|0;h=b+(c<<1)|0;i=h;g=b+1|0;j=i+14|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+14|0,a[f>>0]|0,2)|0;h=b+(c*3|0)|0;i=h;g=e+1|0;j=i+14|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+14|0,a[f>>0]|0,2)|0;h=b+(c<<2)|0;i=h;g=b+2|0;j=i+13|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+13|0,a[f>>0]|0,3)|0;h=b+(c*5|0)|0;i=h;g=e+2|0;j=i+13|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+13|0,a[f>>0]|0,3)|0;h=b+(c*6|0)|0;i=h;g=b+3|0;j=i+12|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+12|0,a[f>>0]|0,4)|0;h=b+(c*7|0)|0;i=h;g=e+3|0;j=i+12|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+12|0,a[f>>0]|0,4)|0;h=b+(c<<3)|0;i=h;g=b+4|0;j=i+11|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+11|0,a[f>>0]|0,5)|0;h=b+(c*9|0)|0;i=h;g=e+4|0;j=i+11|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+11|0,a[f>>0]|0,5)|0;h=b+(c*10|0)|0;i=h;g=b+5|0;j=i+10|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+10|0,a[f>>0]|0,6)|0;h=b+(c*11|0)|0;i=h;g=e+5|0;j=i+10|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+10|0,a[f>>0]|0,6)|0;h=b+(c*12|0)|0;i=h;g=b+6|0;j=i+9|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+9|0,a[f>>0]|0,7)|0;h=b+(c*13|0)|0;i=h;g=e+6|0;j=i+9|0;do{a[i>>0]=a[g>>0]|0;i=i+1|0;g=g+1|0}while((i|0)<(j|0));qh(h+9|0,a[f>>0]|0,7)|0;h=b+(c*14|0)|0;g=b+7|0;i=g;j=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=g+4|0;g=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;i=h;k=i;a[k>>0]=j;a[k+1>>0]=j>>8;a[k+2>>0]=j>>16;a[k+3>>0]=j>>24;j=i+4|0;a[j>>0]=g;a[j+1>>0]=g>>8;a[j+2>>0]=g>>16;a[j+3>>0]=g>>24;qh(h+8|0,a[f>>0]|0,8)|0;h=b+(c*15|0)|0;c=e+7|0;e=c;b=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=c+4|0;c=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=h;g=e;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=e+4|0;a[b>>0]=c;a[b+1>>0]=c>>8;a[b+2>>0]=c>>16;a[b+3>>0]=c>>24;qh(h+8|0,a[f>>0]|0,8)|0;return}function vb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;f=0;do{g=e+f|0;h=f;f=f+1|0;i=e+f|0;a[b+h>>0]=((d[g>>0]|0)+1+(d[i>>0]|0)|0)>>>1;a[b+(h+c)>>0]=((d[g>>0]|0)+2+((d[i>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((f|0)!=32);f=e+31|0;e=b+c|0;h=2;i=30;while(1){g=b+(S(h,c)|0)|0;j=h>>1;vh(g|0,b+j|0,i|0)|0;k=32-i|0;qh(g+i|0,a[f>>0]|0,k|0)|0;g=b+(S(h|1,c)|0)|0;vh(g|0,e+j|0,i|0)|0;qh(g+i|0,a[f>>0]|0,k|0)|0;h=h+2|0;if((h|0)>=32)break;else i=i+-1|0}return}function wb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=e+7|0;g=a[f>>0]|0;h=e+1|0;i=e+2|0;a[b>>0]=((d[e>>0]|0)+2+((d[h>>0]|0)<<1)+(d[i>>0]|0)|0)>>>2;j=e+3|0;k=b+1|0;a[k>>0]=((d[h>>0]|0)+2+((d[i>>0]|0)<<1)+(d[j>>0]|0)|0)>>>2;h=e+4|0;l=b+2|0;a[l>>0]=((d[i>>0]|0)+2+((d[j>>0]|0)<<1)+(d[h>>0]|0)|0)>>>2;i=e+5|0;m=b+3|0;a[m>>0]=((d[j>>0]|0)+2+((d[h>>0]|0)<<1)+(d[i>>0]|0)|0)>>>2;j=e+6|0;n=b+4|0;a[n>>0]=((d[h>>0]|0)+2+((d[i>>0]|0)<<1)+(d[j>>0]|0)|0)>>>2;h=b+5|0;a[h>>0]=((d[i>>0]|0)+2+((d[j>>0]|0)<<1)+(d[f>>0]|0)|0)>>>2;i=b+6|0;a[i>>0]=((d[j>>0]|0)+2+((d[f>>0]|0)<<1)+(d[e+8>>0]|0)|0)>>>2;a[b+7>>0]=g;e=b+c|0;a[e>>0]=a[k>>0]|0;a[e+1>>0]=a[k+1>>0]|0;a[e+2>>0]=a[k+2>>0]|0;a[e+3>>0]=a[k+3>>0]|0;a[e+4>>0]=a[k+4>>0]|0;a[e+5>>0]=a[k+5>>0]|0;qh(e+6|0,g|0,2)|0;k=e+c|0;a[k>>0]=a[l>>0]|0;a[k+1>>0]=a[l+1>>0]|0;a[k+2>>0]=a[l+2>>0]|0;a[k+3>>0]=a[l+3>>0]|0;a[k+4>>0]=a[l+4>>0]|0;qh(k+5|0,g|0,3)|0;l=k+c|0;k=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;a[l>>0]=k;a[l+1>>0]=k>>8;a[l+2>>0]=k>>16;a[l+3>>0]=k>>24;qh(l+4|0,g|0,4)|0;k=l+c|0;a[k>>0]=a[n>>0]|0;a[k+1>>0]=a[n+1>>0]|0;a[k+2>>0]=a[n+2>>0]|0;qh(k+3|0,g|0,5)|0;n=k+c|0;k=d[h>>0]|d[h+1>>0]<<8;a[n>>0]=k;a[n+1>>0]=k>>8;qh(n+2|0,g|0,6)|0;k=n+c|0;a[k>>0]=a[i>>0]|0;qh(k+1|0,g|0,7)|0;qh(k+c|0,g|0,8)|0;return}function xb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;f=a[e+15>>0]|0;g=0;do{h=g;g=g+1|0;a[b+h>>0]=((d[e+h>>0]|0)+2+((d[e+g>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((g|0)!=15);a[b+15>>0]=f;g=b+c|0;e=g;h=b+1|0;i=e+14|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+14|0,f|0,2)|0;j=g+c|0;e=j;h=b+2|0;i=e+13|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+13|0,f|0,3)|0;g=j+c|0;e=g;h=b+3|0;i=e+12|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+12|0,f|0,4)|0;j=g+c|0;e=j;h=b+4|0;i=e+11|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+11|0,f|0,5)|0;g=j+c|0;e=g;h=b+5|0;i=e+10|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+10|0,f|0,6)|0;j=g+c|0;e=j;h=b+6|0;i=e+9|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+9|0,f|0,7)|0;h=j+c|0;j=b+7|0;e=j;i=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=j+4|0;j=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=h;g=e;a[g>>0]=i;a[g+1>>0]=i>>8;a[g+2>>0]=i>>16;a[g+3>>0]=i>>24;i=e+4|0;a[i>>0]=j;a[i+1>>0]=j>>8;a[i+2>>0]=j>>16;a[i+3>>0]=j>>24;qh(h+8|0,f|0,8)|0;j=h+c|0;h=b+8|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;a[j+5>>0]=a[h+5>>0]|0;a[j+6>>0]=a[h+6>>0]|0;qh(j+7|0,f|0,9)|0;h=j+c|0;j=b+9|0;a[h>>0]=a[j>>0]|0;a[h+1>>0]=a[j+1>>0]|0;a[h+2>>0]=a[j+2>>0]|0;a[h+3>>0]=a[j+3>>0]|0;a[h+4>>0]=a[j+4>>0]|0;a[h+5>>0]=a[j+5>>0]|0;qh(h+6|0,f|0,10)|0;j=h+c|0;h=b+10|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;qh(j+5|0,f|0,11)|0;h=j+c|0;j=b+11|0;i=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;a[h>>0]=i;a[h+1>>0]=i>>8;a[h+2>>0]=i>>16;a[h+3>>0]=i>>24;qh(h+4|0,f|0,12)|0;i=h+c|0;h=b+12|0;a[i>>0]=a[h>>0]|0;a[i+1>>0]=a[h+1>>0]|0;a[i+2>>0]=a[h+2>>0]|0;qh(i+3|0,f|0,13)|0;h=i+c|0;i=b+13|0;j=d[i>>0]|d[i+1>>0]<<8;a[h>>0]=j;a[h+1>>0]=j>>8;qh(h+2|0,f|0,14)|0;j=h+c|0;a[j>>0]=a[b+14>>0]|0;qh(j+1|0,f|0,15)|0;qh(j+c|0,f|0,16)|0;return}function yb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;f=a[e+31>>0]|0;g=0;do{h=g;g=g+1|0;a[b+h>>0]=((d[e+h>>0]|0)+2+((d[e+g>>0]|0)<<1)+(d[e+(h+2)>>0]|0)|0)>>>2}while((g|0)!=31);a[b+31>>0]=f;g=b+c|0;e=g;h=b+1|0;i=e+30|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+30|0,f|0,2)|0;j=g+c|0;e=j;h=b+2|0;i=e+29|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+29|0,f|0,3)|0;g=j+c|0;e=g;h=b+3|0;i=e+28|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+28|0,f|0,4)|0;j=g+c|0;e=j;h=b+4|0;i=e+27|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+27|0,f|0,5)|0;g=j+c|0;e=g;h=b+5|0;i=e+26|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+26|0,f|0,6)|0;j=g+c|0;e=j;h=b+6|0;i=e+25|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+25|0,f|0,7)|0;g=j+c|0;e=g;h=b+7|0;i=e+24|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+24|0,f|0,8)|0;j=g+c|0;e=j;h=b+8|0;i=e+23|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+23|0,f|0,9)|0;g=j+c|0;e=g;h=b+9|0;i=e+22|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+22|0,f|0,10)|0;j=g+c|0;e=j;h=b+10|0;i=e+21|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+21|0,f|0,11)|0;g=j+c|0;e=g;h=b+11|0;i=e+20|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+20|0,f|0,12)|0;j=g+c|0;e=j;h=b+12|0;i=e+19|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+19|0,f|0,13)|0;g=j+c|0;e=g;h=b+13|0;i=e+18|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+18|0,f|0,14)|0;j=g+c|0;e=j;h=b+14|0;i=e+17|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+17|0,f|0,15)|0;g=j+c|0;e=g;h=b+15|0;i=e+16|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+16|0,f|0,16)|0;j=g+c|0;e=j;h=b+16|0;i=e+15|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+15|0,f|0,17)|0;g=j+c|0;e=g;h=b+17|0;i=e+14|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+14|0,f|0,18)|0;j=g+c|0;e=j;h=b+18|0;i=e+13|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+13|0,f|0,19)|0;g=j+c|0;e=g;h=b+19|0;i=e+12|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+12|0,f|0,20)|0;j=g+c|0;e=j;h=b+20|0;i=e+11|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+11|0,f|0,21)|0;g=j+c|0;e=g;h=b+21|0;i=e+10|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(g+10|0,f|0,22)|0;j=g+c|0;e=j;h=b+22|0;i=e+9|0;do{a[e>>0]=a[h>>0]|0;e=e+1|0;h=h+1|0}while((e|0)<(i|0));qh(j+9|0,f|0,23)|0;h=j+c|0;j=b+23|0;e=j;i=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=j+4|0;j=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=h;g=e;a[g>>0]=i;a[g+1>>0]=i>>8;a[g+2>>0]=i>>16;a[g+3>>0]=i>>24;i=e+4|0;a[i>>0]=j;a[i+1>>0]=j>>8;a[i+2>>0]=j>>16;a[i+3>>0]=j>>24;qh(h+8|0,f|0,24)|0;j=h+c|0;h=b+24|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;a[j+5>>0]=a[h+5>>0]|0;a[j+6>>0]=a[h+6>>0]|0;qh(j+7|0,f|0,25)|0;h=j+c|0;j=b+25|0;a[h>>0]=a[j>>0]|0;a[h+1>>0]=a[j+1>>0]|0;a[h+2>>0]=a[j+2>>0]|0;a[h+3>>0]=a[j+3>>0]|0;a[h+4>>0]=a[j+4>>0]|0;a[h+5>>0]=a[j+5>>0]|0;qh(h+6|0,f|0,26)|0;j=h+c|0;h=b+26|0;a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;a[j+3>>0]=a[h+3>>0]|0;a[j+4>>0]=a[h+4>>0]|0;qh(j+5|0,f|0,27)|0;h=j+c|0;j=b+27|0;i=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;a[h>>0]=i;a[h+1>>0]=i>>8;a[h+2>>0]=i>>16;a[h+3>>0]=i>>24;qh(h+4|0,f|0,28)|0;i=h+c|0;h=b+28|0;a[i>>0]=a[h>>0]|0;a[i+1>>0]=a[h+1>>0]|0;a[i+2>>0]=a[h+2>>0]|0;qh(i+3|0,f|0,29)|0;h=i+c|0;i=b+29|0;j=d[i>>0]|d[i+1>>0]<<8;a[h>>0]=j;a[h+1>>0]=j>>8;qh(h+2|0,f|0,30)|0;j=h+c|0;a[j>>0]=a[b+30>>0]|0;qh(j+1|0,f|0,31)|0;qh(j+c|0,f|0,32)|0;return}function zb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ab(a,b,8,c,d);return}function Ab(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((e|0)>0){h=0;do{a[b+h>>0]=((d[f+(h+-1)>>0]|0)+1+(d[f+h>>0]|0)|0)>>>1;h=h+1|0}while((h|0)!=(e|0))}h=b+c|0;b=f+-1|0;a[h>>0]=((d[g>>0]|0)+2+((d[b>>0]|0)<<1)+(d[f>>0]|0)|0)>>>2;if((e|0)>1){i=1;do{a[h+i>>0]=((d[f+(i+-2)>>0]|0)+2+((d[f+(i+-1)>>0]|0)<<1)+(d[f+i>>0]|0)|0)>>>2;i=i+1|0}while((i|0)!=(e|0))}i=h+c|0;a[i>>0]=((d[b>>0]|0)+2+((d[g>>0]|0)<<1)+(d[g+1>>0]|0)|0)>>>2;if((e|0)>3){b=3;do{h=b+-2|0;a[i+(S(h,c)|0)>>0]=((d[g+(b+-3)>>0]|0)+2+((d[g+h>>0]|0)<<1)+(d[g+(b+-1)>>0]|0)|0)>>>2;b=b+1|0}while((b|0)!=(e|0))}if((e|0)<=2)return;b=(S(c,-2)|0)+-1|0;g=i;i=2;while(1){h=1;do{a[g+h>>0]=a[g+(b+h)>>0]|0;h=h+1|0}while((h|0)!=(e|0));i=i+1|0;if((i|0)==(e|0))break;else g=g+c|0}return}function Bb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ab(a,b,16,c,d);return}function Cb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ab(a,b,32,c,d);return}function Db(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Eb(a,b,8,c,d);return}function Eb(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;h=l;l=l+64|0;i=h;j=e+-2|0;k=(e|0)>2;m=e+-1|0;if(k){n=e+-3|0;o=0;do{a[i+o>>0]=((d[g+(n-o)>>0]|0)+2+((d[g+(j-o)>>0]|0)<<1)+(d[g+(m-o)>>0]|0)|0)>>>2;o=o+1|0}while((o|0)!=(j|0))}o=d[f+-1>>0]|0;n=d[g>>0]|0;a[i+j>>0]=(o+2+(n<<1)+(d[g+1>>0]|0)|0)>>>2;g=a[f>>0]|0;p=g&255;a[i+m>>0]=((o<<1)+2+n+p|0)>>>2;n=a[f+1>>0]|0;m=i+e|0;a[m>>0]=((p<<1)+o+(n&255)+2|0)>>>2;if(k){k=e+1|0;o=g;g=n;n=0;while(1){p=a[f+(n+2)>>0]|0;a[i+(k+n)>>0]=(((g&255)<<1)+(o&255)+(p&255)+2|0)>>>2;n=n+1|0;if((n|0)==(j|0))break;else{q=g;g=p;o=q}}}if((e|0)<=0){l=h;return}o=m+-1|0;m=0;do{vh(b+(S(m,c)|0)|0,o+(0-m)|0,e|0)|0;m=m+1|0}while((m|0)!=(e|0));l=h;return}function Fb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Eb(a,b,16,c,d);return}function Gb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Eb(a,b,32,c,d);return}function Hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ib(a,b,8,c,d);return}function Ib(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=f+-1|0;a[b>>0]=((d[h>>0]|0)+1+(d[g>>0]|0)|0)>>>1;i=(e|0)>1;if(i){j=1;do{a[b+(S(j,c)|0)>>0]=((d[g+(j+-1)>>0]|0)+1+(d[g+j>>0]|0)|0)>>>1;j=j+1|0}while((j|0)!=(e|0))}j=b+1|0;a[j>>0]=((d[g>>0]|0)+2+((d[h>>0]|0)<<1)+(d[f>>0]|0)|0)>>>2;a[j+c>>0]=((d[h>>0]|0)+2+((d[g>>0]|0)<<1)+(d[g+1>>0]|0)|0)>>>2;h=(e|0)>2;if(h){k=2;do{a[j+(S(k,c)|0)>>0]=((d[g+(k+-2)>>0]|0)+2+((d[g+(k+-1)>>0]|0)<<1)+(d[g+k>>0]|0)|0)>>>2;k=k+1|0}while((k|0)!=(e|0));k=b+2|0;g=e+-2|0;if(h){h=0;do{j=h;h=h+1|0;a[k+j>>0]=((d[f+(j+-1)>>0]|0)+2+((d[f+j>>0]|0)<<1)+(d[f+h>>0]|0)|0)>>>2}while((h|0)!=(g|0));l=k;m=g}else{l=k;m=g}}else{l=b+2|0;m=e+-2|0}if(!i)return;i=-2-c|0;if((e|0)==2)return;else{n=l;o=1}do{n=n+c|0;l=0;do{a[n+l>>0]=a[n+(i+l)>>0]|0;l=l+1|0}while((l|0)<(m|0));o=o+1|0}while((o|0)!=(e|0));return}function Jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ib(a,b,16,c,d);return}function Kb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ib(a,b,32,c,d);return}function Lb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[b>>0]=f;a[b+1>>0]=f>>8;a[b+2>>0]=f>>16;a[b+3>>0]=f>>24;f=b+c|0;b=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[f>>0]=b;a[f+1>>0]=b>>8;a[f+2>>0]=b>>16;a[f+3>>0]=b>>24;b=f+c|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[b>>0]=f;a[b+1>>0]=f>>8;a[b+2>>0]=f>>16;a[b+3>>0]=f>>24;f=b+c|0;c=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;a[f>>0]=c;a[f+1>>0]=c>>8;a[f+2>>0]=c>>16;a[f+3>>0]=c>>24;return}function Mb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=b+c|0;b=e;h=b;g=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=b+4|0;b=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;h=f;i=h;a[i>>0]=g;a[i+1>>0]=g>>8;a[i+2>>0]=g>>16;a[i+3>>0]=g>>24;g=h+4|0;a[g>>0]=b;a[g+1>>0]=b>>8;a[g+2>>0]=b>>16;a[g+3>>0]=b>>24;b=f+c|0;f=e;g=f;h=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=f+4|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=b;i=g;a[i>>0]=h;a[i+1>>0]=h>>8;a[i+2>>0]=h>>16;a[i+3>>0]=h>>24;h=g+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;f=e;e=f;h=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=f+4|0;f=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;e=b+c|0;c=e;a[c>>0]=h;a[c+1>>0]=h>>8;a[c+2>>0]=h>>16;a[c+3>>0]=h>>24;h=e+4|0;a[h>>0]=f;a[h+1>>0]=f>>8;a[h+2>>0]=f>>16;a[h+3>>0]=f>>24;return}function Nb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));e=b+c|0;f=d;g=e+16|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));return}function Ob(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));h=b+c|0;e=h;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));b=h+c|0;e=b;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));e=b+c|0;f=d;g=e+32|0;do{a[e>>0]=a[f>>0]|0;e=e+1|0;f=f+1|0}while((e|0)<(g|0));return}function Pb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;qh(b|0,a[e>>0]|0,4)|0;d=b+c|0;qh(d|0,a[e+1>>0]|0,4)|0;b=d+c|0;qh(b|0,a[e+2>>0]|0,4)|0;qh(b+c|0,a[e+3>>0]|0,4)|0;return}function Qb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;qh(b|0,a[e>>0]|0,8)|0;d=b+c|0;qh(d|0,a[e+1>>0]|0,8)|0;b=d+c|0;qh(b|0,a[e+2>>0]|0,8)|0;d=b+c|0;qh(d|0,a[e+3>>0]|0,8)|0;b=d+c|0;qh(b|0,a[e+4>>0]|0,8)|0;d=b+c|0;qh(d|0,a[e+5>>0]|0,8)|0;b=d+c|0;qh(b|0,a[e+6>>0]|0,8)|0;qh(b+c|0,a[e+7>>0]|0,8)|0;return}function Rb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;qh(b|0,a[e>>0]|0,16)|0;d=b+c|0;qh(d|0,a[e+1>>0]|0,16)|0;b=d+c|0;qh(b|0,a[e+2>>0]|0,16)|0;d=b+c|0;qh(d|0,a[e+3>>0]|0,16)|0;b=d+c|0;qh(b|0,a[e+4>>0]|0,16)|0;d=b+c|0;qh(d|0,a[e+5>>0]|0,16)|0;b=d+c|0;qh(b|0,a[e+6>>0]|0,16)|0;d=b+c|0;qh(d|0,a[e+7>>0]|0,16)|0;b=d+c|0;qh(b|0,a[e+8>>0]|0,16)|0;d=b+c|0;qh(d|0,a[e+9>>0]|0,16)|0;b=d+c|0;qh(b|0,a[e+10>>0]|0,16)|0;d=b+c|0;qh(d|0,a[e+11>>0]|0,16)|0;b=d+c|0;qh(b|0,a[e+12>>0]|0,16)|0;d=b+c|0;qh(d|0,a[e+13>>0]|0,16)|0;b=d+c|0;qh(b|0,a[e+14>>0]|0,16)|0;qh(b+c|0,a[e+15>>0]|0,16)|0;return}function Sb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;qh(b|0,a[e>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+1>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+2>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+3>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+4>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+5>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+6>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+7>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+8>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+9>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+10>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+11>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+12>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+13>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+14>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+15>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+16>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+17>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+18>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+19>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+20>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+21>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+22>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+23>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+24>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+25>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+26>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+27>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+28>>0]|0,32)|0;d=b+c|0;qh(d|0,a[e+29>>0]|0,32)|0;b=d+c|0;qh(b|0,a[e+30>>0]|0,32)|0;qh(b+c|0,a[e+31>>0]|0,32)|0;return}function Tb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=b;b=0;while(1){l=f+b|0;m=(d[l>>0]|0)-g+(d[e>>0]|0)|0;a[k>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[h>>0]|0)|0;a[k+1>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[i>>0]|0)|0;a[k+2>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=(d[l>>0]|0)-g+(d[j>>0]|0)|0;a[k+3>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;b=b+1|0;if((b|0)==4)break;else k=k+c|0}return}function Ub(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=d[e+-1>>0]|0;h=e+1|0;i=e+2|0;j=e+3|0;k=e+4|0;l=e+5|0;m=e+6|0;n=e+7|0;o=b;b=0;while(1){p=f+b|0;q=(d[p>>0]|0)-g+(d[e>>0]|0)|0;a[o>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[h>>0]|0)|0;a[o+1>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[i>>0]|0)|0;a[o+2>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[j>>0]|0)|0;a[o+3>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[k>>0]|0)|0;a[o+4>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[l>>0]|0)|0;a[o+5>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[m>>0]|0)|0;a[o+6>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;q=(d[p>>0]|0)-g+(d[n>>0]|0)|0;a[o+7>>0]=(q|0)>255?-1:((q|0)>0?q:0)&255;b=b+1|0;if((b|0)==8)break;else o=o+c|0}return}function Vb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=d[e+-1>>0]|0;h=b;b=0;while(1){i=f+b|0;j=0;do{k=(d[i>>0]|0)-g+(d[e+j>>0]|0)|0;a[h+j>>0]=(k|0)>255?-1:((k|0)>0?k:0)&255;j=j+1|0}while((j|0)!=16);b=b+1|0;if((b|0)==16)break;else h=h+c|0}return}function Wb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=d[e+-1>>0]|0;h=b;b=0;while(1){i=f+b|0;j=0;do{k=(d[i>>0]|0)-g+(d[e+j>>0]|0)|0;a[h+j>>0]=(k|0)>255?-1:((k|0)>0?k:0)&255;j=j+1|0}while((j|0)!=32);b=b+1|0;if((b|0)==32)break;else h=h+c|0}return}function Xb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;e=b+c|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;b=e+c|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;e=b+c|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;return}function Yb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;b=d;e=b;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=b+4|0;a[e>>0]=-2139062144;a[e+1>>0]=-2139062144>>8;a[e+2>>0]=-2139062144>>16;a[e+3>>0]=-2139062144>>24;e=d+c|0;d=e;b=d;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=d+4|0;a[b>>0]=-2139062144;a[b+1>>0]=-2139062144>>8;a[b+2>>0]=-2139062144>>16;a[b+3>>0]=-2139062144>>24;b=e+c|0;e=b;d=e;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=e+4|0;a[d>>0]=-2139062144;a[d+1>>0]=-2139062144>>8;a[d+2>>0]=-2139062144>>16;a[d+3>>0]=-2139062144>>24;d=b+c|0;c=d;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;c=d+4|0;a[c>>0]=-2139062144;a[c+1>>0]=-2139062144>>8;a[c+2>>0]=-2139062144>>16;a[c+3>>0]=-2139062144>>24;return}function Zb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));e=b+c|0;d=e+16|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));return}function _b(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));f=b+c|0;e=f;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));b=f+c|0;e=b;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));e=b+c|0;d=e+32|0;do{a[e>>0]=128;e=e+1|0}while((e|0)<(d|0));return}function $b(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))+2|0)>>>2&255;qh(a|0,c|0,4)|0;e=a+b|0;qh(e|0,c|0,4)|0;a=e+b|0;qh(a|0,c|0,4)|0;qh(a+b|0,c|0,4)|0;return}function ac(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))+4|0)/8|0)&255;qh(a|0,c|0,8)|0;e=a+b|0;qh(e|0,c|0,8)|0;a=e+b|0;qh(a|0,c|0,8)|0;e=a+b|0;qh(e|0,c|0,8)|0;a=e+b|0;qh(a|0,c|0,8)|0;e=a+b|0;qh(e|0,c|0,8)|0;a=e+b|0;qh(a|0,c|0,8)|0;qh(a+b|0,c|0,8)|0;return}function bc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+15>>0]|0)+((d[e+14>>0]|0)+((d[e+13>>0]|0)+((d[e+12>>0]|0)+((d[e+11>>0]|0)+((d[e+10>>0]|0)+((d[e+9>>0]|0)+((d[e+8>>0]|0)+((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))))))))))+8|0)/16|0)&255;qh(a|0,c|0,16)|0;e=a+b|0;qh(e|0,c|0,16)|0;a=e+b|0;qh(a|0,c|0,16)|0;e=a+b|0;qh(e|0,c|0,16)|0;a=e+b|0;qh(a|0,c|0,16)|0;e=a+b|0;qh(e|0,c|0,16)|0;a=e+b|0;qh(a|0,c|0,16)|0;e=a+b|0;qh(e|0,c|0,16)|0;a=e+b|0;qh(a|0,c|0,16)|0;e=a+b|0;qh(e|0,c|0,16)|0;a=e+b|0;qh(a|0,c|0,16)|0;e=a+b|0;qh(e|0,c|0,16)|0;a=e+b|0;qh(a|0,c|0,16)|0;e=a+b|0;qh(e|0,c|0,16)|0;a=e+b|0;qh(a|0,c|0,16)|0;qh(a+b|0,c|0,16)|0;return}function cc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;c=(((d[e+31>>0]|0)+((d[e+30>>0]|0)+((d[e+29>>0]|0)+((d[e+28>>0]|0)+((d[e+27>>0]|0)+((d[e+26>>0]|0)+((d[e+25>>0]|0)+((d[e+24>>0]|0)+((d[e+23>>0]|0)+((d[e+22>>0]|0)+((d[e+21>>0]|0)+((d[e+20>>0]|0)+((d[e+19>>0]|0)+((d[e+18>>0]|0)+((d[e+17>>0]|0)+((d[e+16>>0]|0)+((d[e+15>>0]|0)+((d[e+14>>0]|0)+((d[e+13>>0]|0)+((d[e+12>>0]|0)+((d[e+11>>0]|0)+((d[e+10>>0]|0)+((d[e+9>>0]|0)+((d[e+8>>0]|0)+((d[e+7>>0]|0)+((d[e+6>>0]|0)+((d[e+5>>0]|0)+((d[e+4>>0]|0)+((d[e+3>>0]|0)+((d[e+2>>0]|0)+((d[e+1>>0]|0)+(d[e>>0]|0)))))))))))))))))))))))))))))))+16|0)/32|0)&255;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;e=a+b|0;qh(e|0,c|0,32)|0;a=e+b|0;qh(a|0,c|0,32)|0;qh(a+b|0,c|0,32)|0;return}function dc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))+2|0)>>>2&255;qh(a|0,e|0,4)|0;c=a+b|0;qh(c|0,e|0,4)|0;a=c+b|0;qh(a|0,e|0,4)|0;qh(a+b|0,e|0,4)|0;return}function ec(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))+4|0)/8|0)&255;qh(a|0,e|0,8)|0;c=a+b|0;qh(c|0,e|0,8)|0;a=c+b|0;qh(a|0,e|0,8)|0;c=a+b|0;qh(c|0,e|0,8)|0;a=c+b|0;qh(a|0,e|0,8)|0;c=a+b|0;qh(c|0,e|0,8)|0;a=c+b|0;qh(a|0,e|0,8)|0;qh(a+b|0,e|0,8)|0;return}function fc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))))))))))+8|0)/16|0)&255;qh(a|0,e|0,16)|0;c=a+b|0;qh(c|0,e|0,16)|0;a=c+b|0;qh(a|0,e|0,16)|0;c=a+b|0;qh(c|0,e|0,16)|0;a=c+b|0;qh(a|0,e|0,16)|0;c=a+b|0;qh(c|0,e|0,16)|0;a=c+b|0;qh(a|0,e|0,16)|0;c=a+b|0;qh(c|0,e|0,16)|0;a=c+b|0;qh(a|0,e|0,16)|0;c=a+b|0;qh(c|0,e|0,16)|0;a=c+b|0;qh(a|0,e|0,16)|0;c=a+b|0;qh(c|0,e|0,16)|0;a=c+b|0;qh(a|0,e|0,16)|0;c=a+b|0;qh(c|0,e|0,16)|0;a=c+b|0;qh(a|0,e|0,16)|0;qh(a+b|0,e|0,16)|0;return}function gc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;e=(((d[c+31>>0]|0)+((d[c+30>>0]|0)+((d[c+29>>0]|0)+((d[c+28>>0]|0)+((d[c+27>>0]|0)+((d[c+26>>0]|0)+((d[c+25>>0]|0)+((d[c+24>>0]|0)+((d[c+23>>0]|0)+((d[c+22>>0]|0)+((d[c+21>>0]|0)+((d[c+20>>0]|0)+((d[c+19>>0]|0)+((d[c+18>>0]|0)+((d[c+17>>0]|0)+((d[c+16>>0]|0)+((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+(d[c>>0]|0)))))))))))))))))))))))))))))))+16|0)/32|0)&255;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;c=a+b|0;qh(c|0,e|0,32)|0;a=c+b|0;qh(a|0,e|0,32)|0;qh(a+b|0,e|0,32)|0;return}function hc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0)+4|0)/8|0)&255;qh(a|0,f|0,4)|0;e=a+b|0;qh(e|0,f|0,4)|0;a=e+b|0;qh(a|0,f|0,4)|0;qh(a+b|0,f|0,4)|0;return}function ic(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0)+8|0)/16|0)&255;qh(a|0,f|0,8)|0;e=a+b|0;qh(e|0,f|0,8)|0;a=e+b|0;qh(a|0,f|0,8)|0;e=a+b|0;qh(e|0,f|0,8)|0;a=e+b|0;qh(a|0,f|0,8)|0;e=a+b|0;qh(e|0,f|0,8)|0;a=e+b|0;qh(a|0,f|0,8)|0;qh(a+b|0,f|0,8)|0;return}function jc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0;f=(((d[c+15>>0]|0)+((d[c+14>>0]|0)+((d[c+13>>0]|0)+((d[c+12>>0]|0)+((d[c+11>>0]|0)+((d[c+10>>0]|0)+((d[c+9>>0]|0)+((d[c+8>>0]|0)+((d[c+7>>0]|0)+((d[c+6>>0]|0)+((d[c+5>>0]|0)+((d[c+4>>0]|0)+((d[c+3>>0]|0)+((d[c+2>>0]|0)+((d[c+1>>0]|0)+((d[c>>0]|0)+(d[e>>0]|0))+(d[e+1>>0]|0))+(d[e+2>>0]|0))+(d[e+3>>0]|0))+(d[e+4>>0]|0))+(d[e+5>>0]|0))+(d[e+6>>0]|0))+(d[e+7>>0]|0))+(d[e+8>>0]|0))+(d[e+9>>0]|0))+(d[e+10>>0]|0))+(d[e+11>>0]|0))+(d[e+12>>0]|0))+(d[e+13>>0]|0))+(d[e+14>>0]|0))+(d[e+15>>0]|0)+16|0)/32|0)&255;qh(a|0,f|0,16)|0;e=a+b|0;qh(e|0,f|0,16)|0;a=e+b|0;qh(a|0,f|0,16)|0;e=a+b|0;qh(e|0,f|0,16)|0;a=e+b|0;qh(a|0,f|0,16)|0;e=a+b|0;qh(e|0,f|0,16)|0;a=e+b|0;qh(a|0,f|0,16)|0;e=a+b|0;qh(e|0,f|0,16)|0;a=e+b|0;qh(a|0,f|0,16)|0;e=a+b|0;qh(e|0,f|0,16)|0;a=e+b|0;qh(a|0,f|0,16)|0;e=a+b|0;qh(e|0,f|0,16)|0;a=e+b|0;qh(a|0,f|0,16)|0;e=a+b|0;qh(e|0,f|0,16)|0;a=e+b|0;qh(a|0,f|0,16)|0;qh(a+b|0,f|0,16)|0;return}function kc(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0,g=0;f=0;g=0;do{g=(d[c+f>>0]|0)+g+(d[e+f>>0]|0)|0;f=f+1|0}while((f|0)!=32);f=((g+32|0)/64|0)&255;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;g=a+b|0;qh(g|0,f|0,32)|0;a=g+b|0;qh(a|0,f|0,32)|0;qh(a+b|0,f|0,32)|0;return}function lc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;h=e;e=h&-256;mc(a,b,c,d,e,h-e>>4,f,i,j);return}function mc(c,e,f,g,h,i,j,k,l){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(!((l|0)>0&(k|0)>0))return;m=f;f=c+-3|0;c=0;while(1){n=0;o=i;while(1){p=f+(o>>4)|0;q=o&15;r=S(b[h+(q<<4)>>1]|0,d[p>>0]|0)|0;s=(S(b[h+(q<<4)+2>>1]|0,d[p+1>>0]|0)|0)+r|0;r=(S(b[h+(q<<4)+4>>1]|0,d[p+2>>0]|0)|0)+s|0;s=(S(b[h+(q<<4)+6>>1]|0,d[p+3>>0]|0)|0)+r|0;r=(S(b[h+(q<<4)+8>>1]|0,d[p+4>>0]|0)|0)+s|0;s=(S(b[h+(q<<4)+10>>1]|0,d[p+5>>0]|0)|0)+r|0;r=(S(b[h+(q<<4)+12>>1]|0,d[p+6>>0]|0)|0)+s|0;s=(S(b[h+(q<<4)+14>>1]|0,d[p+7>>0]|0)|0)+r+64>>7;a[m+n>>0]=(s|0)>255?-1:((s|0)>0?s:0)&255;n=n+1|0;if((n|0)==(k|0))break;else o=o+j|0}c=c+1|0;if((c|0)==(l|0))break;else{m=m+g|0;f=f+e|0}}return}function nc(c,e,f,g,h,i,j,k,l,m){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;k=h;h=k&-256;j=h;n=k-h>>4;if(!((l|0)>0&(m|0)>0))return;h=f;f=c+-3|0;c=0;while(1){k=0;o=n;while(1){p=f+(o>>4)|0;q=o&15;r=S(b[j+(q<<4)>>1]|0,d[p>>0]|0)|0;s=S(b[j+(q<<4)+2>>1]|0,d[p+1>>0]|0)|0;t=S(b[j+(q<<4)+4>>1]|0,d[p+2>>0]|0)|0;u=S(b[j+(q<<4)+6>>1]|0,d[p+3>>0]|0)|0;v=S(b[j+(q<<4)+8>>1]|0,d[p+4>>0]|0)|0;w=S(b[j+(q<<4)+10>>1]|0,d[p+5>>0]|0)|0;x=S(b[j+(q<<4)+12>>1]|0,d[p+6>>0]|0)|0;y=S(b[j+(q<<4)+14>>1]|0,d[p+7>>0]|0)|0;p=h+k|0;q=r+64+s+t+u+v+w+x+y>>7;a[p>>0]=(((q|0)>255?256:(((q|0)>0?q:0)&255)+1|0)+(d[p>>0]|0)|0)>>>1;k=k+1|0;if((k|0)==(l|0))break;else o=o+i|0}c=c+1|0;if((c|0)==(m|0))break;else{h=h+g|0;f=f+e|0}}return}function oc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;f=g;g=f&-256;pc(a,b,c,d,g,f-g>>4,h,i,j);return}function pc(c,e,f,g,h,i,j,k,l){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if(!((k|0)>0&(l|0)>0))return;m=e<<1;n=e*3|0;o=e<<2;p=e*5|0;q=e*6|0;r=e*7|0;s=f;f=c+(S(e,-3)|0)|0;c=0;while(1){t=0;u=i;while(1){v=f+(S(u>>4,e)|0)|0;w=u&15;x=S(b[h+(w<<4)>>1]|0,d[v>>0]|0)|0;y=(S(b[h+(w<<4)+2>>1]|0,d[v+e>>0]|0)|0)+x|0;x=(S(b[h+(w<<4)+4>>1]|0,d[v+m>>0]|0)|0)+y|0;y=(S(b[h+(w<<4)+6>>1]|0,d[v+n>>0]|0)|0)+x|0;x=(S(b[h+(w<<4)+8>>1]|0,d[v+o>>0]|0)|0)+y|0;y=(S(b[h+(w<<4)+10>>1]|0,d[v+p>>0]|0)|0)+x|0;x=(S(b[h+(w<<4)+12>>1]|0,d[v+q>>0]|0)|0)+y|0;y=(S(b[h+(w<<4)+14>>1]|0,d[v+r>>0]|0)|0)+x+64>>7;a[s+(S(t,g)|0)>>0]=(y|0)>255?-1:((y|0)>0?y:0)&255;t=t+1|0;if((t|0)==(l|0))break;else u=u+j|0}c=c+1|0;if((c|0)==(k|0))break;else{s=s+1|0;f=f+1|0}}return}function qc(c,e,f,g,h,i,j,k,l,m){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;i=j;j=i&-256;h=j;n=i-j>>4;if(!((l|0)>0&(m|0)>0))return;j=e<<1;i=e*3|0;o=e<<2;p=e*5|0;q=e*6|0;r=e*7|0;s=f;f=c+(S(e,-3)|0)|0;c=0;while(1){t=0;u=n;while(1){v=f+(S(u>>4,e)|0)|0;w=u&15;x=S(b[h+(w<<4)>>1]|0,d[v>>0]|0)|0;y=S(b[h+(w<<4)+2>>1]|0,d[v+e>>0]|0)|0;z=S(b[h+(w<<4)+4>>1]|0,d[v+j>>0]|0)|0;A=S(b[h+(w<<4)+6>>1]|0,d[v+i>>0]|0)|0;B=S(b[h+(w<<4)+8>>1]|0,d[v+o>>0]|0)|0;C=S(b[h+(w<<4)+10>>1]|0,d[v+p>>0]|0)|0;D=S(b[h+(w<<4)+12>>1]|0,d[v+q>>0]|0)|0;E=S(b[h+(w<<4)+14>>1]|0,d[v+r>>0]|0)|0;v=s+(S(t,g)|0)|0;w=x+64+y+z+A+B+C+D+E>>7;a[v>>0]=(((w|0)>255?256:(((w|0)>0?w:0)&255)+1|0)+(d[v>>0]|0)|0)>>>1;t=t+1|0;if((t|0)==(m|0))break;else u=u+k|0}c=c+1|0;if((c|0)==(l|0))break;else{s=s+1|0;f=f+1|0}}return}function rc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0;k=l;l=l+8640|0;m=k;n=e;e=n&-256;o=g;g=o&-256;p=o-g>>4;mc(a+(S(b,-3)|0)|0,b,m,64,e,n-e>>4,f,i,((S(j+-1|0,h)|0)+p>>4)+8|0);pc(m+192|0,64,c,d,g,p,h,i,j);l=k;return}function sc(b,c,e,f,g,h,i,j,k,m){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+12736|0;o=n+4096|0;p=n;q=g;g=q&-256;r=i;i=r&-256;s=r-i>>4;mc(b+(S(c,-3)|0)|0,c,o,64,g,q-g>>4,h,k,((S(m+-1|0,j)|0)+s>>4)+8|0);pc(o+192|0,64,p,64,i,s,j,k,m);if((k|0)>0&(m|0)>0){t=e;u=p;v=0}else{l=n;return}while(1){p=0;do{e=t+p|0;a[e>>0]=((d[e>>0]|0)+1+(d[u+p>>0]|0)|0)>>>1;p=p+1|0}while((p|0)!=(k|0));v=v+1|0;if((v|0)==(m|0))break;else{t=t+f|0;u=u+64|0}}l=n;return}function tc(b,c,e,f,g,h,i,j,k,l){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;if((l|0)>0&(k|0)>0){m=e;n=b;o=0}else return;while(1){b=0;do{e=m+b|0;a[e>>0]=((d[e>>0]|0)+1+(d[n+b>>0]|0)|0)>>>1;b=b+1|0}while((b|0)!=(k|0));o=o+1|0;if((o|0)==(l|0))break;else{m=m+f|0;n=n+c|0}}return}function uc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;if((j|0)>0){k=c;l=j;m=a}else return;while(1){vh(k|0,m|0,i|0)|0;if((l|0)>1){k=k+d|0;l=l+-1|0;m=m+b|0}else break}return}function vc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;h=e;e=h&-256;mc(a,b,c,d,e,h-e>>4,f,i,j);return}function wc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;f=g;g=f&-256;pc(a,b,c,d,g,f-g>>4,h,i,j);return}function xc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0;k=l;l=l+8640|0;m=k;n=e;e=n&-256;o=g;g=o&-256;p=o-g>>4;mc(a+(S(b,-3)|0)|0,b,m,64,e,n-e>>4,f,i,((S(j+-1|0,h)|0)+p>>4)+8|0);pc(m+192|0,64,c,d,g,p,h,i,j);l=k;return}function yc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;nc(a,b,c,d,e,f,0,0,i,j);return}function zc(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;qc(a,b,c,d,0,0,g,h,i,j);return}function Ac(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;sc(a,b,c,d,e,f,g,h,i,j);return}function Bc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=S(c,-4)|0;i=S(c,-3)|0;j=S(c,-2)|0;k=0-c|0;l=c<<1;m=c*3|0;n=0-l|0;o=0;p=b;while(1){b=p+k|0;q=a[b>>0]|0;r=a[p>>0]|0;s=p+c|0;t=a[s>>0]|0;u=d[p+i>>0]|0;v=(d[p+h>>0]|0)-u|0;w=d[f>>0]|0;x=d[p+j>>0]|0;y=u-x|0;u=q&255;z=x-u|0;A=t&255;B=r&255;C=A-B|0;D=(C|0)>-1?C:0-C|0;C=d[p+l>>0]|0;E=C-A|0;F=(d[p+m>>0]|0)-C|0;C=u-B|0;B=x-A|0;A=p+n|0;x=a[A>>0]|0;G=(x&255)-u|0;u=d[g>>0]|0;H=(D|0)>(u|0)?1:(((G|0)>-1?G:0-G|0)|0)>(u|0);u=(x^-128)<<24>>24;x=(t^-128)<<24>>24;t=u-x|0;G=(r^-128)<<24>>24;r=(q^-128)<<24>>24;q=(H?((t|0)<-128?-128:((t|0)<127?t:127)<<24>>24):0)+((G-r|0)*3|0)|0;t=(((q|0)<-128?128:(q|0)<127?q:127)&(((((((B|0)>-1?B:0-B|0)|0)/2|0)+(((C|0)>-1?C:0-C|0)<<1)|0)>(d[e>>0]|0|0)|((((F|0)>-1?F:0-F|0)|0)>(w|0)|((((E|0)>-1?E:0-E|0)|0)>(w|0)|((D|0)>(w|0)|((((z|0)>-1?z:0-z|0)|0)>(w|0)|((((v|0)>-1?v:0-v|0)|0)>(w|0)?1:(((y|0)>-1?y:0-y|0)|0)>(w|0)))))))<<31>>31^255))<<24>>24;w=t+4|0;y=t+3|0;t=(w|0)<-128?-16:((w|0)<127?w:127)<<24>>27;w=G-t|0;a[p>>0]=(w|0)<-128?0:((w|0)<127?w:127)&255^-128;w=((y|0)<-128?-16:((y|0)<127?y:127)<<24>>27)+r|0;a[b>>0]=(w|0)<-128?0:((w|0)<127?w:127)&255^-128;w=((t+1|0)>>>1&(H?0:255))<<24>>24;H=x-w|0;a[s>>0]=(H|0)<-128?0:((H|0)<127?H:127)&255^-128;H=w+u|0;a[A>>0]=(H|0)<-128?0:((H|0)<127?H:127)&255^-128;o=o+1|0;if((o|0)==8)break;else p=p+1|0}return}function Cc(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Bc(a,b,c,d,e);Bc(a+8|0,b,f,g,h);return}function Dc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if((c|0)!=1){h=0;i=b;while(1){j=i+-2|0;k=a[j>>0]|0;l=i+-1|0;m=a[l>>0]|0;n=a[i>>0]|0;o=i+1|0;p=a[o>>0]|0;q=d[i+-3>>0]|0;r=(d[i+-4>>0]|0)-q|0;s=d[f>>0]|0;t=k&255;u=q-t|0;q=m&255;v=t-q|0;w=(v|0)>-1?v:0-v|0;v=p&255;x=n&255;y=v-x|0;z=(y|0)>-1?y:0-y|0;y=d[i+2>>0]|0;A=y-v|0;B=(d[i+3>>0]|0)-y|0;y=q-x|0;x=t-v|0;v=d[g>>0]|0;t=(w|0)>(v|0)|(z|0)>(v|0);v=(k^-128)<<24>>24;k=(p^-128)<<24>>24;p=v-k|0;q=(n^-128)<<24>>24;n=(m^-128)<<24>>24;m=(t?((p|0)<-128?-128:((p|0)<127?p:127)<<24>>24):0)+((q-n|0)*3|0)|0;p=(((m|0)<-128?128:(m|0)<127?m:127)&(((((((x|0)>-1?x:0-x|0)|0)/2|0)+(((y|0)>-1?y:0-y|0)<<1)|0)>(d[e>>0]|0|0)|((((B|0)>-1?B:0-B|0)|0)>(s|0)|((((A|0)>-1?A:0-A|0)|0)>(s|0)|((z|0)>(s|0)|((w|0)>(s|0)|((((r|0)>-1?r:0-r|0)|0)>(s|0)?1:(((u|0)>-1?u:0-u|0)|0)>(s|0)))))))<<31>>31^255))<<24>>24;s=p+4|0;u=p+3|0;p=(s|0)<-128?-16:((s|0)<127?s:127)<<24>>27;s=q-p|0;a[i>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;s=((u|0)<-128?-16:((u|0)<127?u:127)<<24>>27)+n|0;a[l>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;s=((p+1|0)>>>1&(t?0:255))<<24>>24;t=k-s|0;a[o>>0]=(t|0)<-128?0:((t|0)<127?t:127)&255^-128;t=s+v|0;a[j>>0]=(t|0)<-128?0:((t|0)<127?t:127)&255^-128;h=h+1|0;if((h|0)==8)break;else i=i+c|0}return}i=0;h=b;t=a[b>>0]|0;while(1){b=h+-2|0;j=a[b>>0]|0;v=h+-1|0;s=a[v>>0]|0;o=h+1|0;k=a[o>>0]|0;p=d[h+-3>>0]|0;l=(d[h+-4>>0]|0)-p|0;n=d[f>>0]|0;u=j&255;q=p-u|0;p=s&255;r=u-p|0;w=(r|0)>-1?r:0-r|0;r=k&255;z=t&255;A=r-z|0;B=(A|0)>-1?A:0-A|0;A=d[h+2>>0]|0;y=A-r|0;x=(d[h+3>>0]|0)-A|0;A=p-z|0;z=u-r|0;r=d[g>>0]|0;u=(w|0)>(r|0)|(B|0)>(r|0);r=(j^-128)<<24>>24;j=(k^-128)<<24>>24;k=r-j|0;p=(t^-128)<<24>>24;m=(s^-128)<<24>>24;s=(u?((k|0)<-128?-128:((k|0)<127?k:127)<<24>>24):0)+((p-m|0)*3|0)|0;k=(((s|0)<-128?128:(s|0)<127?s:127)&(((((((z|0)>-1?z:0-z|0)|0)/2|0)+(((A|0)>-1?A:0-A|0)<<1)|0)>(d[e>>0]|0|0)|((((x|0)>-1?x:0-x|0)|0)>(n|0)|((((y|0)>-1?y:0-y|0)|0)>(n|0)|((B|0)>(n|0)|((w|0)>(n|0)|((((l|0)>-1?l:0-l|0)|0)>(n|0)?1:(((q|0)>-1?q:0-q|0)|0)>(n|0)))))))<<31>>31^255))<<24>>24;n=k+4|0;q=k+3|0;k=(n|0)<-128?-16:((n|0)<127?n:127)<<24>>27;n=p-k|0;a[h>>0]=(n|0)<-128?0:((n|0)<127?n:127)&255^-128;n=((q|0)<-128?-16:((q|0)<127?q:127)<<24>>27)+m|0;a[v>>0]=(n|0)<-128?0:((n|0)<127?n:127)&255^-128;n=((k+1|0)>>>1&(u?0:255))<<24>>24;u=j-n|0;t=(u|0)<-128?0:((u|0)<127?u:127)&255^-128;a[o>>0]=t;o=n+r|0;a[b>>0]=(o|0)<-128?0:((o|0)<127?o:127)&255^-128;i=i+1|0;if((i|0)==8)break;else h=h+c|0}return}function Ec(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Dc(a,b,c,d,e);Dc(a+(b<<3)|0,b,f,g,h);return}function Fc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;h=S(c,-4)|0;i=S(c,-3)|0;j=S(c,-2)|0;k=0-c|0;l=c<<1;m=c*3|0;n=0-(c<<2)|0;o=0-m|0;p=0-l|0;q=0;r=b;while(1){b=r+k|0;s=r+c|0;t=r+l|0;u=r+m|0;v=d[r+h>>0]|0;w=d[r+i>>0]|0;x=v-w|0;y=d[f>>0]|0;z=d[r+j>>0]|0;A=w-z|0;B=d[b>>0]|0;C=z-B|0;D=(C|0)>-1?C:0-C|0;C=d[s>>0]|0;E=d[r>>0]|0;F=C-E|0;G=(F|0)>-1?F:0-F|0;F=d[t>>0]|0;H=F-C|0;I=d[u>>0]|0;J=I-F|0;K=B-E|0;L=z-C|0;C=w-B|0;w=F-E|0;F=v-B|0;B=I-E|0;Gc((((((((L|0)>-1?L:0-L|0)|0)/2|0)+(((K|0)>-1?K:0-K|0)<<1)|0)>(d[e>>0]|0|0)|((((J|0)>-1?J:0-J|0)|0)>(y|0)|((((H|0)>-1?H:0-H|0)|0)>(y|0)|((G|0)>(y|0)|((D|0)>(y|0)|((((x|0)>-1?x:0-x|0)|0)>(y|0)?1:(((A|0)>-1?A:0-A|0)|0)>(y|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((B|0)>-1?B:0-B|0)|0)>1|((((F|0)>-1?F:0-F|0)|0)>1|((((w|0)>-1?w:0-w|0)|0)>1|((((C|0)>-1?C:0-C|0)|0)>1|((D|0)>1|(G|0)>1)))))<<31>>31^255)&255,r+n|0,r+o|0,r+p|0,b,r,s,t,u);q=q+1|0;if((q|0)==8)break;else r=r+1|0}return}function Gc(b,c,e,f,g,h,i,j,k,l,m){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0;if(b<<24>>24==0|e<<24>>24==0){e=a[h>>0]|0;n=a[i>>0]|0;o=a[j>>0]|0;p=a[k>>0]|0;q=(e&255)-(n&255)|0;r=c&255;c=(p&255)-(o&255)|0;s=(((q|0)>-1?q:0-q|0)|0)>(r|0)?1:(((c|0)>-1?c:0-c|0)|0)>(r|0);r=(e^-128)<<24>>24;e=(p^-128)<<24>>24;p=r-e|0;c=(o^-128)<<24>>24;o=(n^-128)<<24>>24;n=(s?((p|0)<-128?-128:((p|0)<127?p:127)<<24>>24):0)+((c-o|0)*3|0)|0;p=(((n|0)<-128?-128:((n|0)<127?n:127)&255)&b)<<24>>24;b=p+4|0;n=p+3|0;p=(b|0)<-128?-16:((b|0)<127?b:127)<<24>>27;b=c-p|0;a[j>>0]=(b|0)<-128?0:((b|0)<127?b:127)&255^-128;b=((n|0)<-128?-16:((n|0)<127?n:127)<<24>>27)+o|0;a[i>>0]=(b|0)<-128?0:((b|0)<127?b:127)&255^-128;b=((p+1|0)>>>1&(s?0:255))<<24>>24;s=e-b|0;a[k>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;s=b+r|0;a[h>>0]=(s|0)<-128?0:((s|0)<127?s:127)&255^-128;return}else{s=a[k>>0]|0;r=a[l>>0]|0;b=a[m>>0]|0;m=d[f>>0]|0;f=d[g>>0]|0;e=d[h>>0]|0;p=d[i>>0]|0;o=d[j>>0]|0;a[g>>0]=((m*3|0)+4+(f<<1)+e+p+o|0)>>>3;g=s&255;s=f+4|0;a[h>>0]=(s+p+o+(e+m<<1)+g|0)>>>3;h=r&255;a[i>>0]=(m+4+f+e+(p<<1)+o+g+h|0)>>>3;f=b&255;a[j>>0]=(s+e+p+(o<<1)+g+h+f|0)>>>3;a[k>>0]=(e+4+p+o+h+(f+g<<1)|0)>>>3;a[l>>0]=(p+4+o+g+(h<<1)+(f*3|0)|0)>>>3;return}}function Hc(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Fc(a,b,c,d,e);Fc(a+8|0,b,f,g,h);return}function Ic(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=0;i=b;while(1){b=i+-4|0;j=i+-3|0;k=i+-2|0;l=i+-1|0;m=i+1|0;n=i+2|0;o=i+3|0;p=d[b>>0]|0;q=d[j>>0]|0;r=p-q|0;s=d[f>>0]|0;t=d[k>>0]|0;u=q-t|0;v=d[l>>0]|0;w=t-v|0;x=(w|0)>-1?w:0-w|0;w=d[m>>0]|0;y=d[i>>0]|0;z=w-y|0;A=(z|0)>-1?z:0-z|0;z=d[n>>0]|0;B=z-w|0;C=d[o>>0]|0;D=C-z|0;E=v-y|0;F=t-w|0;w=q-v|0;q=z-y|0;z=p-v|0;v=C-y|0;Gc((((((((F|0)>-1?F:0-F|0)|0)/2|0)+(((E|0)>-1?E:0-E|0)<<1)|0)>(d[e>>0]|0|0)|((((D|0)>-1?D:0-D|0)|0)>(s|0)|((((B|0)>-1?B:0-B|0)|0)>(s|0)|((A|0)>(s|0)|((x|0)>(s|0)|((((r|0)>-1?r:0-r|0)|0)>(s|0)?1:(((u|0)>-1?u:0-u|0)|0)>(s|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((v|0)>-1?v:0-v|0)|0)>1|((((z|0)>-1?z:0-z|0)|0)>1|((((q|0)>-1?q:0-q|0)|0)>1|((((w|0)>-1?w:0-w|0)|0)>1|((x|0)>1|(A|0)>1)))))<<31>>31^255)&255,b,j,k,l,i,m,n,o);h=h+1|0;if((h|0)==8)break;else i=i+c|0}return}function Jc(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;Ic(a,b,c,d,e);Ic(a+(b<<3)|0,b,f,g,h);return}function Kc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Lc(a,b,c,d,e,1);return}function Lc(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;i=h<<3;if((h|0)<=0)return;h=S(c,-4)|0;j=S(c,-3)|0;k=S(c,-2)|0;l=0-c|0;m=c<<1;n=c*3|0;o=S(c,-8)|0;p=S(c,-7)|0;q=S(c,-6)|0;r=S(c,-5)|0;s=c<<2;t=c*5|0;u=c*6|0;v=c*7|0;w=0-(c<<3)|0;x=0-v|0;y=0-u|0;z=0-t|0;A=0-s|0;B=0-n|0;C=0-m|0;D=0;E=b;while(1){b=E+l|0;F=E+c|0;G=E+m|0;H=E+n|0;I=d[E+h>>0]|0;J=d[E+j>>0]|0;K=I-J|0;L=d[f>>0]|0;M=d[E+k>>0]|0;N=J-M|0;O=d[b>>0]|0;P=M-O|0;Q=(P|0)>-1?P:0-P|0;P=d[F>>0]|0;R=d[E>>0]|0;T=P-R|0;U=(T|0)>-1?T:0-T|0;T=d[G>>0]|0;V=T-P|0;W=d[H>>0]|0;X=W-T|0;Y=O-R|0;Z=M-P|0;P=J-O|0;J=T-R|0;T=I-O|0;I=W-R|0;W=E+s|0;M=E+t|0;_=E+u|0;$=E+v|0;aa=(d[E+r>>0]|0)-O|0;ba=(d[W>>0]|0)-R|0;ca=(d[E+q>>0]|0)-O|0;da=(d[M>>0]|0)-R|0;ea=(d[E+p>>0]|0)-O|0;fa=(d[_>>0]|0)-R|0;ga=(d[E+o>>0]|0)-O|0;O=(d[$>>0]|0)-R|0;Mc((((((((Z|0)>-1?Z:0-Z|0)|0)/2|0)+(((Y|0)>-1?Y:0-Y|0)<<1)|0)>(d[e>>0]|0|0)|((((X|0)>-1?X:0-X|0)|0)>(L|0)|((((V|0)>-1?V:0-V|0)|0)>(L|0)|((U|0)>(L|0)|((Q|0)>(L|0)|((((K|0)>-1?K:0-K|0)|0)>(L|0)?1:(((N|0)>-1?N:0-N|0)|0)>(L|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((I|0)>-1?I:0-I|0)|0)>1|((((T|0)>-1?T:0-T|0)|0)>1|((((J|0)>-1?J:0-J|0)|0)>1|((((P|0)>-1?P:0-P|0)|0)>1|((Q|0)>1|(U|0)>1)))))<<31>>31^255)&255,((((ga|0)>-1?ga:0-ga|0)|0)>1?1:(((O|0)>-1?O:0-O|0)|0)>1)?0:(((((fa|0)>-1?fa:0-fa|0)|0)>1|((((ea|0)>-1?ea:0-ea|0)|0)>1|((((da|0)>-1?da:0-da|0)|0)>1|((((ca|0)>-1?ca:0-ca|0)|0)>1|((((aa|0)>-1?aa:0-aa|0)|0)>1?1:(((ba|0)>-1?ba:0-ba|0)|0)>1)))))<<31>>31^255)&255,E+w|0,E+x|0,E+y|0,E+z|0,E+A|0,E+B|0,E+C|0,b,E,F,G,H,W,M,_,$);D=D+1|0;if((D|0)>=(i|0))break;else E=E+1|0}return}function Mc(b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;var w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;if(b<<24>>24==0|(e<<24>>24==0|f<<24>>24==0)){Gc(b,c,e,k,l,m,n,o,p,q,r);return}else{e=a[p>>0]|0;c=a[q>>0]|0;b=a[r>>0]|0;f=a[s>>0]|0;w=a[t>>0]|0;x=a[u>>0]|0;y=a[v>>0]|0;v=d[g>>0]|0;g=d[h>>0]|0;z=d[i>>0]|0;A=d[j>>0]|0;B=d[k>>0]|0;C=d[l>>0]|0;D=d[m>>0]|0;E=d[n>>0]|0;F=d[o>>0]|0;a[h>>0]=((v*7|0)+8+(g<<1)+z+A+B+C+D+E+F|0)>>>4;h=e&255;e=g+8|0;a[i>>0]=(e+(v*6|0)+(z<<1)+A+B+C+D+E+F+h|0)>>>4;i=c&255;a[j>>0]=(e+(v*5|0)+z+(A<<1)+B+C+D+E+F+h+i|0)>>>4;j=b&255;a[k>>0]=(e+(v<<2)+z+A+(B<<1)+C+D+E+F+h+i+j|0)>>>4;k=f&255;a[l>>0]=(e+(v*3|0)+z+A+B+(C<<1)+D+E+F+h+i+j+k|0)>>>4;l=w&255;w=e+z+A+B+C|0;a[m>>0]=(w+E+F+(D+v<<1)+h+i+j+k+l|0)>>>4;m=x&255;a[n>>0]=(v+8+g+z+A+B+C+D+(E<<1)+F+h+i+j+k+l+m|0)>>>4;g=y&255;a[o>>0]=(w+D+E+(F<<1)+h+i+j+k+l+m+g|0)>>>4;a[p>>0]=(z+8+A+B+C+D+E+F+i+j+k+l+m+(g+h<<1)|0)>>>4;a[q>>0]=(A+8+B+C+D+E+F+h+(i<<1)+j+k+l+m+(g*3|0)|0)>>>4;a[r>>0]=(B+8+C+D+E+F+h+i+(j<<1)+k+l+m+(g<<2)|0)>>>4;a[s>>0]=(C+8+D+E+F+h+i+j+(k<<1)+l+m+(g*5|0)|0)>>>4;a[t>>0]=(D+8+E+F+h+i+j+k+(l<<1)+m+(g*6|0)|0)>>>4;a[u>>0]=(E+8+F+h+i+j+k+l+(m<<1)+(g*7|0)|0)>>>4;return}}function Nc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Lc(a,b,c,d,e,2);return}function Oc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Pc(a,b,c,d,e,8);return}function Pc(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;if((h|0)>0){i=0;j=b}else return;while(1){b=j+-4|0;k=j+-3|0;l=j+-2|0;m=j+-1|0;n=j+1|0;o=j+2|0;p=j+3|0;q=d[b>>0]|0;r=d[k>>0]|0;s=q-r|0;t=d[f>>0]|0;u=d[l>>0]|0;v=r-u|0;w=d[m>>0]|0;x=u-w|0;y=(x|0)>-1?x:0-x|0;x=d[n>>0]|0;z=d[j>>0]|0;A=x-z|0;B=(A|0)>-1?A:0-A|0;A=d[o>>0]|0;C=A-x|0;D=d[p>>0]|0;E=D-A|0;F=w-z|0;G=u-x|0;x=r-w|0;r=A-z|0;A=q-w|0;q=D-z|0;D=j+-8|0;u=j+-7|0;H=j+-6|0;I=j+-5|0;J=j+4|0;K=j+5|0;L=j+6|0;M=j+7|0;N=(d[I>>0]|0)-w|0;O=(d[J>>0]|0)-z|0;P=(d[H>>0]|0)-w|0;Q=(d[K>>0]|0)-z|0;R=(d[u>>0]|0)-w|0;S=(d[L>>0]|0)-z|0;T=(d[D>>0]|0)-w|0;w=(d[M>>0]|0)-z|0;Mc((((((((G|0)>-1?G:0-G|0)|0)/2|0)+(((F|0)>-1?F:0-F|0)<<1)|0)>(d[e>>0]|0|0)|((((E|0)>-1?E:0-E|0)|0)>(t|0)|((((C|0)>-1?C:0-C|0)|0)>(t|0)|((B|0)>(t|0)|((y|0)>(t|0)|((((s|0)>-1?s:0-s|0)|0)>(t|0)?1:(((v|0)>-1?v:0-v|0)|0)>(t|0)))))))<<31>>31^255)&255,a[g>>0]|0,(((((q|0)>-1?q:0-q|0)|0)>1|((((A|0)>-1?A:0-A|0)|0)>1|((((r|0)>-1?r:0-r|0)|0)>1|((((x|0)>-1?x:0-x|0)|0)>1|((y|0)>1|(B|0)>1)))))<<31>>31^255)&255,((((T|0)>-1?T:0-T|0)|0)>1?1:(((w|0)>-1?w:0-w|0)|0)>1)?0:(((((S|0)>-1?S:0-S|0)|0)>1|((((R|0)>-1?R:0-R|0)|0)>1|((((Q|0)>-1?Q:0-Q|0)|0)>1|((((P|0)>-1?P:0-P|0)|0)>1|((((N|0)>-1?N:0-N|0)|0)>1?1:(((O|0)>-1?O:0-O|0)|0)>1)))))<<31>>31^255)&255,D,u,H,I,b,k,l,m,j,n,o,p,J,K,L,M);i=i+1|0;if((i|0)==(h|0))break;else j=j+c|0}return}function Qc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Pc(a,b,c,d,e,16);return}function Rc(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;g=l;l=l+32|0;h=g;i=b[c+2>>1]>>2;j=b[c+6>>1]>>2;k=i+(b[c>>1]>>2)|0;m=(b[c+4>>1]>>2)-j|0;n=k-m>>1;o=n-j|0;j=n-i|0;b[h>>1]=k-o;b[h+2>>1]=o;b[h+4>>1]=j;b[h+6>>1]=j+m;m=b[c+10>>1]>>2;j=b[c+14>>1]>>2;o=m+(b[c+8>>1]>>2)|0;k=(b[c+12>>1]>>2)-j|0;i=o-k>>1;n=i-j|0;j=i-m|0;m=o-n&65535;b[h+8>>1]=m;b[h+10>>1]=n;b[h+12>>1]=j;b[h+14>>1]=j+k;k=b[c+18>>1]>>2;j=b[c+22>>1]>>2;n=k+(b[c+16>>1]>>2)|0;o=(b[c+20>>1]>>2)-j|0;i=n-o>>1;p=i-j|0;j=i-k|0;b[h+16>>1]=n-p;b[h+18>>1]=p;b[h+20>>1]=j;b[h+22>>1]=j+o;o=b[c+26>>1]>>2;j=b[c+30>>1]>>2;p=o+(b[c+24>>1]>>2)|0;n=(b[c+28>>1]>>2)-j|0;c=p-n>>1;k=c-j|0;j=c-o|0;b[h+24>>1]=p-k;b[h+26>>1]=k;b[h+28>>1]=j;b[h+30>>1]=j+n;n=f<<1;j=f*3|0;k=m;m=e;e=0;p=h;while(1){h=k<<16>>16;o=b[p+24>>1]|0;c=h+(b[p>>1]|0)|0;i=(b[p+16>>1]|0)-o|0;q=c-i>>1;r=q-o|0;o=q-h|0;h=c-r+(d[m>>0]|0)|0;a[m>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=m+f|0;c=r+(d[h>>0]|0)|0;a[h>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=m+n|0;h=(d[c>>0]|0)+o|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=m+j|0;c=o+i+(d[h>>0]|0)|0;a[h>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+1|0;if((c|0)==4)break;k=b[p+10>>1]|0;m=m+1|0;e=c;p=p+2|0}l=g;return}function Sc(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;g=l;l=l+16|0;h=g;i=b[c>>1]|0;c=i>>3;j=(i>>>2)-c&65535;b[h>>1]=j;i=c&65535;b[h+6>>1]=i;b[h+4>>1]=i;b[h+2>>1]=i;i=f<<1;c=f*3|0;k=j;j=e;e=0;m=h;while(1){h=k<<16>>16;n=h>>1;o=h-n+(d[j>>0]|0)|0;a[j>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;o=j+f|0;h=(d[o>>0]|0)+n|0;a[o>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=j+i|0;o=(d[h>>0]|0)+n|0;a[h>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;o=j+c|0;h=(d[o>>0]|0)+n|0;a[o>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=m+2|0;o=e+1|0;if((o|0)==4)break;k=b[h>>1]|0;j=j+1|0;e=o;m=h}l=g;return}function Tc(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=b[a>>1]|0;e=b[a+4>>1]|0;f=b[a+2>>1]|0;g=b[a+6>>1]|0;a=((f*6270|0)+8192+(S(g,-15137)|0)|0)>>>14;h=(((e+d|0)*11585|0)+8192|0)>>>14<<16>>16;i=((f*15137|0)+8192+(g*6270|0)|0)>>>14<<16>>16;b[c>>1]=i+h;g=(((d-e|0)*11585|0)+8192|0)>>>14<<16>>16;e=a<<16>>16;b[c+2>>1]=e+g;b[c+4>>1]=g-e;b[c+6>>1]=h-i;return}function Uc(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;g=l;l=l+32|0;h=g;i=0;j=c;c=h;while(1){k=b[j>>1]|0;m=b[j+4>>1]|0;n=b[j+2>>1]|0;o=b[j+6>>1]|0;p=((n*6270|0)+8192+(S(o,-15137)|0)|0)>>>14;q=(((m+k|0)*11585|0)+8192|0)>>>14<<16>>16;r=((n*15137|0)+8192+(o*6270|0)|0)>>>14<<16>>16;b[c>>1]=r+q;o=(((k-m|0)*11585|0)+8192|0)>>>14<<16>>16;m=p<<16>>16;b[c+2>>1]=m+o;b[c+4>>1]=o-m;b[c+6>>1]=q-r;i=i+1|0;if((i|0)==4)break;else{j=j+8|0;c=c+8|0}}c=f<<1;j=f*3|0;i=0;do{r=b[h+(i<<1)>>1]|0;q=b[h+(i+8<<1)>>1]|0;m=b[h+(i+4<<1)>>1]|0;o=b[h+(i+12<<1)>>1]|0;p=(((q+r|0)*11585|0)+8192|0)>>>14<<16>>16;k=((m*15137|0)+8192+(o*6270|0)|0)>>>14<<16>>16;n=(((r-q|0)*11585|0)+8192|0)>>>14<<16>>16;q=((m*6270|0)+8192+(S(o,-15137)|0)|0)>>>14<<16>>16;o=e+i|0;m=((k+p<<16>>16)+8>>4)+(d[o>>0]|0)|0;a[o>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=e+(i+f)|0;o=((q+n<<16>>16)+8>>4)+(d[m>>0]|0)|0;a[m>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;o=e+(c+i)|0;m=((n-q<<16>>16)+8>>4)+(d[o>>0]|0)|0;a[o>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;m=e+(j+i)|0;o=((p-k<<16>>16)+8>>4)+(d[m>>0]|0)|0;a[m>>0]=(o|0)>255?-1:((o|0)>0?o:0)&255;i=i+1|0}while((i|0)!=4);l=g;return}function Vc(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+8>>4;c=(d[e>>0]|0)+g|0;a[e>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+1|0;h=(d[c>>0]|0)+g|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=e+2|0;c=(d[h>>0]|0)+g|0;a[h>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+3|0;h=(d[c>>0]|0)+g|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=e+f|0;e=(d[h>>0]|0)+g|0;a[h>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=h+1|0;c=(d[e>>0]|0)+g|0;a[e>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=h+2|0;e=(d[c>>0]|0)+g|0;a[c>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=h+3|0;c=(d[e>>0]|0)+g|0;a[e>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=h+f|0;h=(d[c>>0]|0)+g|0;a[c>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=c+1|0;e=(d[h>>0]|0)+g|0;a[h>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+2|0;h=(d[e>>0]|0)+g|0;a[e>>0]=(h|0)>255?-1:((h|0)>0?h:0)&255;h=c+3|0;e=(d[h>>0]|0)+g|0;a[h>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+f|0;f=(d[e>>0]|0)+g|0;a[e>>0]=(f|0)>255?-1:((f|0)>0?f:0)&255;f=e+1|0;c=(d[f>>0]|0)+g|0;a[f>>0]=(c|0)>255?-1:((c|0)>0?c:0)&255;c=e+2|0;f=(d[c>>0]|0)+g|0;a[c>>0]=(f|0)>255?-1:((f|0)>0?f:0)&255;f=e+3|0;e=(d[f>>0]|0)+g|0;a[f>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;return}function Wc(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=b[a+2>>1]|0;e=b[a+14>>1]|0;f=((d*3196|0)+8192+(S(e,-16069)|0)|0)>>>14;g=b[a+10>>1]|0;h=b[a+6>>1]|0;i=b[a>>1]|0;j=b[a+8>>1]|0;k=b[a+4>>1]|0;l=b[a+12>>1]|0;a=f<<16>>16;f=((g*13623|0)+8192+(S(h,-9102)|0)|0)>>>14<<16>>16;m=((g*9102|0)+8192+(h*13623|0)|0)>>>14<<16>>16;h=((d*16069|0)+8192+(e*3196|0)|0)>>>14<<16>>16;e=(((j+i|0)*11585|0)+8192|0)>>>14<<16>>16;d=((k*15137|0)+8192+(l*6270|0)|0)>>>14<<16>>16;g=(((i-j|0)*11585|0)+8192|0)>>>14<<16>>16;j=((k*6270|0)+8192+(S(l,-15137)|0)|0)>>>14<<16>>16;l=h-m<<16>>16;k=a-f<<16>>16;i=d+e<<16>>16;n=m+h<<16>>16;b[c>>1]=n+i;h=j+g<<16>>16;m=(((k+l|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+2>>1]=m+h;o=g-j<<16>>16;j=(((l-k|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+4>>1]=j+o;k=e-d<<16>>16;d=f+a<<16>>16;b[c+6>>1]=d+k;b[c+8>>1]=k-d;b[c+10>>1]=o-j;b[c+12>>1]=h-m;b[c+14>>1]=i-n;return}function Xc(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=l;l=l+160|0;h=g+32|0;i=g+16|0;j=g;Wc(c,h);Wc(c+16|0,h+16|0);Wc(c+32|0,h+32|0);Wc(c+48|0,h+48|0);Wc(c+64|0,h+64|0);Wc(c+80|0,h+80|0);Wc(c+96|0,h+96|0);Wc(c+112|0,h+112|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=j+2|0;s=f<<1;t=j+4|0;u=f*3|0;v=j+6|0;w=f<<2;x=j+8|0;y=f*5|0;z=j+10|0;A=f*6|0;B=j+12|0;C=f*7|0;D=j+14|0;E=0;do{b[i>>1]=b[h+(E<<1)>>1]|0;b[c>>1]=b[h+(E+8<<1)>>1]|0;b[k>>1]=b[h+(E+16<<1)>>1]|0;b[m>>1]=b[h+(E+24<<1)>>1]|0;b[n>>1]=b[h+(E+32<<1)>>1]|0;b[o>>1]=b[h+(E+40<<1)>>1]|0;b[p>>1]=b[h+(E+48<<1)>>1]|0;b[q>>1]=b[h+(E+56<<1)>>1]|0;Wc(i,j);F=e+E|0;G=((b[j>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(E+f)|0;F=((b[r>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(s+E)|0;G=((b[t>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(u+E)|0;F=((b[v>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(w+E)|0;G=((b[x>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(y+E)|0;F=((b[z>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(A+E)|0;G=((b[B>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(C+E)|0;F=((b[D>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;E=E+1|0}while((E|0)!=8);l=g;return}function Yc(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+16>>5;if((f|0)!=1){c=e;h=0;while(1){i=(d[c>>0]|0)+g|0;a[c>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+1|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;j=c+2|0;i=(d[j>>0]|0)+g|0;a[j>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+3|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;j=c+4|0;i=(d[j>>0]|0)+g|0;a[j>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+5|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;j=c+6|0;i=(d[j>>0]|0)+g|0;a[j>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+7|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;h=h+1|0;if((h|0)==8)break;else c=c+f|0}return}c=e;h=0;j=a[e+6>>0]|0;while(1){e=(d[c>>0]|0)+g|0;a[c>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+1|0;i=(d[e>>0]|0)+g|0;a[e>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+2|0;e=(d[i>>0]|0)+g|0;a[i>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+3|0;i=(d[e>>0]|0)+g|0;a[e>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+4|0;e=(d[i>>0]|0)+g|0;a[i>>0]=(e|0)>255?-1:((e|0)>0?e:0)&255;e=c+5|0;i=(d[e>>0]|0)+g|0;a[e>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=(j&255)+g|0;a[c+6>>0]=(i|0)>255?-1:((i|0)>0?i:0)&255;i=c+7|0;e=(d[i>>0]|0)+g|0;j=(e|0)>255?-1:((e|0)>0?e:0)&255;a[i>>0]=j;h=h+1|0;if((h|0)==8)break;else c=c+f|0}return}function Zc(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=b[a>>1]|0;e=b[a+2>>1]|0;f=b[a+4>>1]|0;g=b[a+6>>1]|0;a=d<<16>>16;h=f<<16>>16;i=g<<16>>16;if(!((e|d|f|g)<<16>>16)){g=c;f=g;b[f>>1]=0;b[f+2>>1]=0>>>16;f=g+4|0;b[f>>1]=0;b[f+2>>1]=0>>>16;return}else{f=(e<<16>>16)*13377|0;e=(h*15212|0)+(a*5283|0)+(i*9929|0)|0;g=(S(h,-5283)|0)+(a*9929|0)+(S(i,-15212)|0)|0;d=f+8192|0;b[c>>1]=(d+e|0)>>>14;b[c+2>>1]=(d+g|0)>>>14;b[c+4>>1]=(((a-h+i|0)*13377|0)+8192|0)>>>14;b[c+6>>1]=(8192-f+g+e|0)>>>14;return}}function _c(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b[a+14>>1]|0;e=d<<16>>16;f=b[a>>1]|0;g=f<<16>>16;h=b[a+10>>1]|0;i=h<<16>>16;j=b[a+4>>1]|0;k=j<<16>>16;l=b[a+6>>1]|0;m=l<<16>>16;n=b[a+8>>1]|0;o=n<<16>>16;p=b[a+2>>1]|0;q=p<<16>>16;r=b[a+12>>1]|0;a=r<<16>>16;if(!((f|d|h|j|l|n|p|r)<<16>>16)){b[c>>1]=0;b[c+2>>1]=0;b[c+4>>1]=0;b[c+6>>1]=0;b[c+8>>1]=0;b[c+10>>1]=0;b[c+12>>1]=0;b[c+14>>1]=0;return}else{r=(o*12665|0)+(m*10394|0)|0;p=(S(o,-10394)|0)+(m*12665|0)|0;m=(a*15679|0)+(q*4756|0)|0;o=(S(a,-4756)|0)+(q*15679|0)|0;q=(g*1606|0)+(e*16305|0)+8192|0;a=q+r>>14;n=(S(g,-16305)|0)+(e*1606|0)+8192|0;e=n+p>>14;g=(k*7723|0)+(i*14449|0)+8192|0;l=g+m>>14;j=(S(k,-14449)|0)+(i*7723|0)+8192|0;i=j+o>>14;k=q-r>>14;r=n-p>>14;p=g-m>>14;m=j-o>>14;o=(S(p,-6270)|0)+(m*15137|0)|0;j=(p*15137|0)+(m*6270|0)|0;m=a-l|0;p=e-i|0;g=(k*15137|0)+(r*6270|0)+8192|0;n=(k*6270|0)+(S(r,-15137)|0)+8192|0;r=g-o>>14;k=n-j>>14;b[c>>1]=l+a;b[c+2>>1]=0-((g+o|0)>>>14);b[c+4>>1]=(((r+k|0)*11585|0)+8192|0)>>>14;b[c+6>>1]=0-((((m+p|0)*11585|0)+8192|0)>>>14);b[c+8>>1]=(((m-p|0)*11585|0)+8192|0)>>>14;b[c+10>>1]=0-((((r-k|0)*11585|0)+8192|0)>>>14);b[c+12>>1]=(n+j|0)>>>14;b[c+14>>1]=0-(e+i);return}}function $c(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=l;l=l+160|0;h=g+32|0;i=g+16|0;j=g;k=h;m=k+128|0;do{b[k>>1]=0;k=k+2|0}while((k|0)<(m|0));Wc(c,h);Wc(c+16|0,h+16|0);Wc(c+32|0,h+32|0);Wc(c+48|0,h+48|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=j+2|0;s=f<<1;t=j+4|0;u=f*3|0;v=j+6|0;w=f<<2;x=j+8|0;y=f*5|0;z=j+10|0;A=f*6|0;B=j+12|0;C=f*7|0;D=j+14|0;E=0;do{b[i>>1]=b[h+(E<<1)>>1]|0;b[c>>1]=b[h+(E+8<<1)>>1]|0;b[k>>1]=b[h+(E+16<<1)>>1]|0;b[m>>1]=b[h+(E+24<<1)>>1]|0;b[n>>1]=b[h+(E+32<<1)>>1]|0;b[o>>1]=b[h+(E+40<<1)>>1]|0;b[p>>1]=b[h+(E+48<<1)>>1]|0;b[q>>1]=b[h+(E+56<<1)>>1]|0;Wc(i,j);F=e+E|0;G=((b[j>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(E+f)|0;F=((b[r>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(s+E)|0;G=((b[t>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(u+E)|0;F=((b[v>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(w+E)|0;G=((b[x>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(y+E)|0;F=((b[z>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;F=e+(A+E)|0;G=((b[B>>1]|0)+16>>5)+(d[F>>0]|0)|0;a[F>>0]=(G|0)>255?-1:((G|0)>0?G:0)&255;G=e+(C+E)|0;F=((b[D>>1]|0)+16>>5)+(d[G>>0]|0)|0;a[G>>0]=(F|0)>255?-1:((F|0)>0?F:0)&255;E=E+1|0}while((E|0)!=8);l=g;return}function ad(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=b[a+2>>1]|0;e=b[a+30>>1]|0;f=b[a+18>>1]|0;g=b[a+14>>1]|0;h=b[a+10>>1]|0;i=b[a+22>>1]|0;j=b[a+26>>1]|0;k=b[a+6>>1]|0;l=b[a+4>>1]|0;m=b[a+28>>1]|0;n=b[a+20>>1]|0;o=b[a+12>>1]|0;p=((d*1606|0)+8192+(S(e,-16305)|0)|0)>>>14<<16>>16;q=((f*12665|0)+8192+(S(g,-10394)|0)|0)>>>14<<16>>16;r=((h*7723|0)+8192+(S(i,-14449)|0)|0)>>>14<<16>>16;s=((j*15679|0)+8192+(S(k,-4756)|0)|0)>>>14<<16>>16;t=((j*4756|0)+8192+(k*15679|0)|0)>>>14<<16>>16;k=((h*14449|0)+8192+(i*7723|0)|0)>>>14<<16>>16;i=((f*10394|0)+8192+(g*12665|0)|0)>>>14<<16>>16;g=((d*16305|0)+8192+(e*1606|0)|0)>>>14<<16>>16;e=b[a>>1]|0;d=b[a+16>>1]|0;f=b[a+8>>1]|0;h=b[a+24>>1]|0;a=((l*3196|0)+8192+(S(m,-16069)|0)|0)>>>14<<16>>16;j=((n*13623|0)+8192+(S(o,-9102)|0)|0)>>>14<<16>>16;u=((n*9102|0)+8192+(o*13623|0)|0)>>>14<<16>>16;o=((l*16069|0)+8192+(m*3196|0)|0)>>>14<<16>>16;m=p-q<<16>>16;l=g-i<<16>>16;n=s-r<<16>>16;v=t-k<<16>>16;w=(((d+e|0)*11585|0)+8192|0)>>>14<<16>>16;x=((f*15137|0)+8192+(h*6270|0)|0)>>>14<<16>>16;y=(((e-d|0)*11585|0)+8192|0)>>>14<<16>>16;d=((f*6270|0)+8192+(S(h,-15137)|0)|0)>>>14<<16>>16;h=o-u<<16>>16;f=a-j<<16>>16;e=p+q<<16>>16;q=r+s<<16>>16;s=((l*6270|0)+8192+(S(m,-15137)|0)|0)>>>14<<16>>16;r=((S(v,-15137)|0)+8192+(S(n,-6270)|0)|0)>>>14<<16>>16;p=k+t<<16>>16;t=g+i<<16>>16;i=((v*6270|0)+8192+(S(n,-15137)|0)|0)>>>14<<16>>16;n=((l*15137|0)+8192+(m*6270|0)|0)>>>14<<16>>16;m=x+w<<16>>16;l=o+u<<16>>16;u=d+y<<16>>16;o=(((f+h|0)*11585|0)+8192|0)>>>14<<16>>16;v=y-d<<16>>16;d=(((h-f|0)*11585|0)+8192|0)>>>14<<16>>16;f=w-x<<16>>16;x=a+j<<16>>16;j=s-r<<16>>16;a=n-i<<16>>16;w=e-q<<16>>16;h=t-p<<16>>16;y=l+m<<16>>16;g=t+p<<16>>16;b[c>>1]=g+y;p=o+u<<16>>16;t=n+i<<16>>16;b[c+2>>1]=t+p;i=d+v<<16>>16;n=(((j+a|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+4>>1]=n+i;k=x+f<<16>>16;z=(((w+h|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+6>>1]=z+k;A=f-x<<16>>16;x=(((h-w|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+8>>1]=x+A;w=v-d<<16>>16;d=(((a-j|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+10>>1]=d+w;j=u-o<<16>>16;o=s+r<<16>>16;b[c+12>>1]=o+j;r=m-l<<16>>16;l=e+q<<16>>16;b[c+14>>1]=l+r;b[c+16>>1]=r-l;b[c+18>>1]=j-o;b[c+20>>1]=w-d;b[c+22>>1]=A-x;b[c+24>>1]=k-z;b[c+26>>1]=i-n;b[c+28>>1]=p-t;b[c+30>>1]=y-g;return}function bd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=l;l=l+576|0;h=g+64|0;i=g+32|0;j=g;ad(c,h);ad(c+32|0,h+32|0);ad(c+64|0,h+64|0);ad(c+96|0,h+96|0);ad(c+128|0,h+128|0);ad(c+160|0,h+160|0);ad(c+192|0,h+192|0);ad(c+224|0,h+224|0);ad(c+256|0,h+256|0);ad(c+288|0,h+288|0);ad(c+320|0,h+320|0);ad(c+352|0,h+352|0);ad(c+384|0,h+384|0);ad(c+416|0,h+416|0);ad(c+448|0,h+448|0);ad(c+480|0,h+480|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=i+16|0;s=i+18|0;t=i+20|0;u=i+22|0;v=i+24|0;w=i+26|0;x=i+28|0;y=i+30|0;z=0;do{b[i>>1]=b[h+(z<<1)>>1]|0;b[c>>1]=b[h+(z+16<<1)>>1]|0;b[k>>1]=b[h+(z+32<<1)>>1]|0;b[m>>1]=b[h+(z+48<<1)>>1]|0;b[n>>1]=b[h+(z+64<<1)>>1]|0;b[o>>1]=b[h+(z+80<<1)>>1]|0;b[p>>1]=b[h+(z+96<<1)>>1]|0;b[q>>1]=b[h+(z+112<<1)>>1]|0;b[r>>1]=b[h+(z+128<<1)>>1]|0;b[s>>1]=b[h+(z+144<<1)>>1]|0;b[t>>1]=b[h+(z+160<<1)>>1]|0;b[u>>1]=b[h+(z+176<<1)>>1]|0;b[v>>1]=b[h+(z+192<<1)>>1]|0;b[w>>1]=b[h+(z+208<<1)>>1]|0;b[x>>1]=b[h+(z+224<<1)>>1]|0;b[y>>1]=b[h+(z+240<<1)>>1]|0;ad(i,j);A=0;do{B=e+((S(A,f)|0)+z)|0;C=((b[j+(A<<1)>>1]|0)+32>>6)+(d[B>>0]|0)|0;a[B>>0]=(C|0)>255?-1:((C|0)>0?C:0)&255;A=A+1|0}while((A|0)!=16);z=z+1|0}while((z|0)!=16);l=g;return}function cd(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=b[a+30>>1]|0;e=d<<16>>16;f=b[a>>1]|0;g=f<<16>>16;h=b[a+26>>1]|0;i=h<<16>>16;j=b[a+4>>1]|0;k=j<<16>>16;l=b[a+22>>1]|0;m=l<<16>>16;n=b[a+8>>1]|0;o=n<<16>>16;p=b[a+18>>1]|0;q=p<<16>>16;r=b[a+12>>1]|0;s=r<<16>>16;t=b[a+14>>1]|0;u=t<<16>>16;v=b[a+16>>1]|0;w=v<<16>>16;x=b[a+10>>1]|0;y=x<<16>>16;z=b[a+20>>1]|0;A=z<<16>>16;B=b[a+6>>1]|0;C=B<<16>>16;D=b[a+24>>1]|0;E=D<<16>>16;F=b[a+2>>1]|0;G=F<<16>>16;H=b[a+28>>1]|0;a=H<<16>>16;if(!((f|d|h|j|l|n|p|r|t|v|x|z|B|D|F|H)<<16>>16)){H=c;F=H+32|0;do{b[H>>1]=0;H=H+2|0}while((H|0)<(F|0));return}else{H=(w*12140|0)+(u*11003|0)|0;F=(S(w,-11003)|0)+(u*12140|0)|0;u=(A*14053|0)+(y*8423|0)|0;w=(S(A,-8423)|0)+(y*14053|0)|0;y=(E*15426|0)+(C*5520|0)|0;A=(S(E,-5520)|0)+(C*15426|0)|0;C=(a*16207|0)+(G*2404|0)|0;E=(S(a,-2404)|0)+(G*16207|0)|0;G=(g*804|0)+(e*16364|0)+8192|0;a=G+H>>14;D=(S(g,-16364)|0)+(e*804|0)+8192|0;e=D+F>>14;g=(k*3981|0)+(i*15893|0)+8192|0;B=g+u>>14;z=(S(k,-15893)|0)+(i*3981|0)+8192|0;i=z+w>>14;k=(o*7005|0)+(m*14811|0)+8192|0;x=k+y>>14;v=(S(o,-14811)|0)+(m*7005|0)+8192|0;m=v+A>>14;o=(s*9760|0)+(q*13160|0)+8192|0;t=o+C>>14;r=(S(s,-13160)|0)+(q*9760|0)+8192|0;q=r+E>>14;s=G-H>>14;H=D-F>>14;F=g-u>>14;u=z-w>>14;w=k-y>>14;y=v-A>>14;A=o-C>>14;C=r-E>>14;E=(S(w,-3196)|0)+(y*16069|0)|0;r=(w*16069|0)+(y*3196|0)|0;y=(S(A,-13623)|0)+(C*9102|0)|0;w=(A*9102|0)+(C*13623|0)|0;C=x+a|0;A=m+e|0;o=t+B|0;v=q+i|0;k=a-x|0;x=e-m|0;m=B-t|0;t=i-q|0;q=(s*16069|0)+(H*3196|0)+8192|0;i=q+E>>14;B=(s*3196|0)+(S(H,-16069)|0)+8192|0;H=B+r>>14;s=(F*9102|0)+(u*13623|0)+8192|0;e=s+y>>14;a=(F*13623|0)+(S(u,-9102)|0)+8192|0;u=a+w>>14;F=q-E>>14;E=B-r>>14;r=s-y>>14;y=a-w>>14;w=(S(m,-6270)|0)+(t*15137|0)|0;a=(m*15137|0)+(t*6270|0)|0;t=(S(r,-6270)|0)+(y*15137|0)|0;m=(r*15137|0)+(y*6270|0)|0;y=C-o|0;r=A-v|0;s=(k*15137|0)+(x*6270|0)+8192|0;B=(k*6270|0)+(S(x,-15137)|0)+8192|0;x=s-w>>14;k=B-a>>14;q=i-e|0;z=H-u|0;g=(F*15137|0)+(E*6270|0)+8192|0;D=(F*6270|0)+(S(E,-15137)|0)+8192|0;E=g-t>>14;F=D-m>>14;G=((S(y+r|0,-11585)|0)+8192|0)>>>14;p=((S(E+F|0,-11585)|0)+8192|0)>>>14;b[c>>1]=o+C;b[c+2>>1]=0-(i+e);b[c+4>>1]=(g+t|0)>>>14;b[c+6>>1]=0-((s+w|0)>>>14);b[c+8>>1]=(((x+k|0)*11585|0)+8192|0)>>>14;b[c+10>>1]=p;b[c+12>>1]=(((q+z|0)*11585|0)+8192|0)>>>14;b[c+14>>1]=G;b[c+16>>1]=(((y-r|0)*11585|0)+8192|0)>>>14;b[c+18>>1]=(((z-q|0)*11585|0)+8192|0)>>>14;b[c+20>>1]=(((E-F|0)*11585|0)+8192|0)>>>14;b[c+22>>1]=(((k-x|0)*11585|0)+8192|0)>>>14;b[c+24>>1]=(B+a|0)>>>14;b[c+26>>1]=0-((D+m|0)>>>14);b[c+28>>1]=u+H;b[c+30>>1]=0-(A+v);return}}function dd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=l;l=l+576|0;h=g+64|0;i=g+32|0;j=g;qh(h|0,0,512)|0;ad(c,h);ad(c+32|0,h+32|0);ad(c+64|0,h+64|0);ad(c+96|0,h+96|0);c=i+2|0;k=i+4|0;m=i+6|0;n=i+8|0;o=i+10|0;p=i+12|0;q=i+14|0;r=i+16|0;s=i+18|0;t=i+20|0;u=i+22|0;v=i+24|0;w=i+26|0;x=i+28|0;y=i+30|0;z=0;do{b[i>>1]=b[h+(z<<1)>>1]|0;b[c>>1]=b[h+(z+16<<1)>>1]|0;b[k>>1]=b[h+(z+32<<1)>>1]|0;b[m>>1]=b[h+(z+48<<1)>>1]|0;b[n>>1]=b[h+(z+64<<1)>>1]|0;b[o>>1]=b[h+(z+80<<1)>>1]|0;b[p>>1]=b[h+(z+96<<1)>>1]|0;b[q>>1]=b[h+(z+112<<1)>>1]|0;b[r>>1]=b[h+(z+128<<1)>>1]|0;b[s>>1]=b[h+(z+144<<1)>>1]|0;b[t>>1]=b[h+(z+160<<1)>>1]|0;b[u>>1]=b[h+(z+176<<1)>>1]|0;b[v>>1]=b[h+(z+192<<1)>>1]|0;b[w>>1]=b[h+(z+208<<1)>>1]|0;b[x>>1]=b[h+(z+224<<1)>>1]|0;b[y>>1]=b[h+(z+240<<1)>>1]|0;ad(i,j);A=0;do{B=e+((S(A,f)|0)+z)|0;C=((b[j+(A<<1)>>1]|0)+32>>6)+(d[B>>0]|0)|0;a[B>>0]=(C|0)>255?-1:((C|0)>0?C:0)&255;A=A+1|0}while((A|0)!=16);z=z+1|0}while((z|0)!=16);l=g;return}function ed(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+32>>6;c=e;e=0;while(1){h=0;do{i=c+h|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;h=h+1|0}while((h|0)!=16);e=e+1|0;if((e|0)==16)break;else c=c+f|0}return}\nfunction fd(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;d=b[a+2>>1]|0;e=b[a+62>>1]|0;f=((d*804|0)+8192+(S(e,-16364)|0)|0)>>>14;g=b[a+34>>1]|0;h=b[a+30>>1]|0;i=((g*12140|0)+8192+(S(h,-11003)|0)|0)>>>14;j=b[a+18>>1]|0;k=b[a+46>>1]|0;l=((j*7005|0)+8192+(S(k,-14811)|0)|0)>>>14;m=b[a+50>>1]|0;n=b[a+14>>1]|0;o=((m*15426|0)+8192+(S(n,-5520)|0)|0)>>>14;p=b[a+10>>1]|0;q=b[a+54>>1]|0;r=((p*3981|0)+8192+(S(q,-15893)|0)|0)>>>14;s=b[a+42>>1]|0;t=b[a+22>>1]|0;u=((s*14053|0)+8192+(S(t,-8423)|0)|0)>>>14;v=b[a+26>>1]|0;w=b[a+38>>1]|0;x=((v*9760|0)+8192+(S(w,-13160)|0)|0)>>>14;y=b[a+58>>1]|0;z=b[a+6>>1]|0;A=b[a+4>>1]|0;B=b[a+60>>1]|0;C=b[a+36>>1]|0;D=b[a+28>>1]|0;E=b[a+20>>1]|0;F=b[a+44>>1]|0;G=b[a+52>>1]|0;H=b[a+12>>1]|0;I=f<<16>>16;f=i<<16>>16;i=l<<16>>16;l=o<<16>>16;o=r<<16>>16;r=u<<16>>16;u=x<<16>>16;x=((y*16207|0)+8192+(S(z,-2404)|0)|0)>>>14<<16>>16;J=((y*2404|0)+8192+(z*16207|0)|0)>>>14<<16>>16;z=((v*13160|0)+8192+(w*9760|0)|0)>>>14<<16>>16;w=((s*8423|0)+8192+(t*14053|0)|0)>>>14<<16>>16;t=((p*15893|0)+8192+(q*3981|0)|0)>>>14<<16>>16;q=((m*5520|0)+8192+(n*15426|0)|0)>>>14<<16>>16;n=((j*14811|0)+8192+(k*7005|0)|0)>>>14<<16>>16;k=((g*11003|0)+8192+(h*12140|0)|0)>>>14<<16>>16;h=((d*16364|0)+8192+(e*804|0)|0)>>>14<<16>>16;e=b[a+8>>1]|0;d=b[a+56>>1]|0;g=b[a+40>>1]|0;j=b[a+24>>1]|0;m=((A*1606|0)+8192+(S(B,-16305)|0)|0)>>>14<<16>>16;p=((C*12665|0)+8192+(S(D,-10394)|0)|0)>>>14<<16>>16;s=((E*7723|0)+8192+(S(F,-14449)|0)|0)>>>14<<16>>16;v=((G*15679|0)+8192+(S(H,-4756)|0)|0)>>>14<<16>>16;y=((G*4756|0)+8192+(H*15679|0)|0)>>>14<<16>>16;H=((E*14449|0)+8192+(F*7723|0)|0)>>>14<<16>>16;F=((C*10394|0)+8192+(D*12665|0)|0)>>>14<<16>>16;D=((A*16305|0)+8192+(B*1606|0)|0)>>>14<<16>>16;B=I-f<<16>>16;A=h-k<<16>>16;C=l-i<<16>>16;E=q-n<<16>>16;G=o-r<<16>>16;K=t-w<<16>>16;L=x-u<<16>>16;M=J-z<<16>>16;N=b[a>>1]|0;O=b[a+32>>1]|0;P=b[a+16>>1]|0;Q=b[a+48>>1]|0;a=((e*3196|0)+8192+(S(d,-16069)|0)|0)>>>14<<16>>16;R=((g*13623|0)+8192+(S(j,-9102)|0)|0)>>>14<<16>>16;T=((g*9102|0)+8192+(j*13623|0)|0)>>>14<<16>>16;j=((e*16069|0)+8192+(d*3196|0)|0)>>>14<<16>>16;d=m-p<<16>>16;e=D-F<<16>>16;g=v-s<<16>>16;U=y-H<<16>>16;V=f+I<<16>>16;I=l+i<<16>>16;i=((A*3196|0)+8192+(S(B,-16069)|0)|0)>>>14<<16>>16;l=((S(E,-16069)|0)+8192+(S(C,-3196)|0)|0)>>>14<<16>>16;f=r+o<<16>>16;o=x+u<<16>>16;u=((K*13623|0)+8192+(S(G,-9102)|0)|0)>>>14<<16>>16;x=((S(M,-9102)|0)+8192+(S(L,-13623)|0)|0)>>>14<<16>>16;r=J+z<<16>>16;z=w+t<<16>>16;t=((M*13623|0)+8192+(S(L,-9102)|0)|0)>>>14<<16>>16;L=((K*9102|0)+8192+(G*13623|0)|0)>>>14<<16>>16;G=q+n<<16>>16;n=k+h<<16>>16;h=((E*3196|0)+8192+(S(C,-16069)|0)|0)>>>14<<16>>16;C=((A*16069|0)+8192+(B*3196|0)|0)>>>14<<16>>16;B=(((O+N|0)*11585|0)+8192|0)>>>14<<16>>16;A=((P*15137|0)+8192+(Q*6270|0)|0)>>>14<<16>>16;E=(((N-O|0)*11585|0)+8192|0)>>>14<<16>>16;O=((P*6270|0)+8192+(S(Q,-15137)|0)|0)>>>14<<16>>16;Q=j-T<<16>>16;P=a-R<<16>>16;N=m+p<<16>>16;p=s+v<<16>>16;v=((e*6270|0)+8192+(S(d,-15137)|0)|0)>>>14<<16>>16;s=((S(U,-15137)|0)+8192+(S(g,-6270)|0)|0)>>>14<<16>>16;m=H+y<<16>>16;y=D+F<<16>>16;F=((U*6270|0)+8192+(S(g,-15137)|0)|0)>>>14<<16>>16;g=((e*15137|0)+8192+(d*6270|0)|0)>>>14<<16>>16;d=i-l<<16>>16;e=C-h<<16>>16;U=V-I<<16>>16;D=n-G<<16>>16;H=o-f<<16>>16;k=r-z<<16>>16;q=x-u<<16>>16;K=t-L<<16>>16;M=A+B<<16>>16;w=j+T<<16>>16;T=O+E<<16>>16;j=(((P+Q|0)*11585|0)+8192|0)>>>14<<16>>16;J=E-O<<16>>16;O=(((Q-P|0)*11585|0)+8192|0)>>>14<<16>>16;P=B-A<<16>>16;A=a+R<<16>>16;R=v-s<<16>>16;a=g-F<<16>>16;B=N-p<<16>>16;Q=y-m<<16>>16;E=I+V<<16>>16;V=o+f<<16>>16;f=l+i<<16>>16;i=x+u<<16>>16;u=((e*6270|0)+8192+(S(d,-15137)|0)|0)>>>14<<16>>16;x=((S(K,-15137)|0)+8192+(S(q,-6270)|0)|0)>>>14<<16>>16;l=((D*6270|0)+8192+(S(U,-15137)|0)|0)>>>14<<16>>16;o=((S(k,-15137)|0)+8192+(S(H,-6270)|0)|0)>>>14<<16>>16;I=r+z<<16>>16;z=G+n<<16>>16;n=t+L<<16>>16;L=h+C<<16>>16;C=((K*6270|0)+8192+(S(q,-15137)|0)|0)>>>14<<16>>16;q=((e*15137|0)+8192+(d*6270|0)|0)>>>14<<16>>16;d=((k*6270|0)+8192+(S(H,-15137)|0)|0)>>>14<<16>>16;H=((D*15137|0)+8192+(U*6270|0)|0)>>>14<<16>>16;U=w+M<<16>>16;D=y+m<<16>>16;m=j+T<<16>>16;y=g+F<<16>>16;F=O+J<<16>>16;g=(((R+a|0)*11585|0)+8192|0)>>>14<<16>>16;k=A+P<<16>>16;e=(((B+Q|0)*11585|0)+8192|0)>>>14<<16>>16;K=P-A<<16>>16;A=(((Q-B|0)*11585|0)+8192|0)>>>14<<16>>16;B=J-O<<16>>16;O=(((a-R|0)*11585|0)+8192|0)>>>14<<16>>16;R=T-j<<16>>16;j=v+s<<16>>16;s=M-w<<16>>16;w=N+p<<16>>16;p=l-o<<16>>16;N=H-d<<16>>16;M=u-x<<16>>16;v=q-C<<16>>16;T=f-i<<16>>16;a=L-n<<16>>16;J=E-V<<16>>16;Q=z-I<<16>>16;P=D+U<<16>>16;h=I+z<<16>>16;b[c>>1]=h+P;z=y+m<<16>>16;I=n+L<<16>>16;b[c+2>>1]=I+z;L=g+F<<16>>16;n=C+q<<16>>16;b[c+4>>1]=n+L;q=e+k<<16>>16;C=d+H<<16>>16;b[c+6>>1]=C+q;H=A+K<<16>>16;d=(((p+N|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+8>>1]=d+H;t=O+B<<16>>16;G=(((M+v|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+10>>1]=G+t;r=j+R<<16>>16;W=(((T+a|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+12>>1]=W+r;X=w+s<<16>>16;Y=(((J+Q|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+14>>1]=Y+X;Z=s-w<<16>>16;w=(((Q-J|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+16>>1]=w+Z;J=R-j<<16>>16;j=(((a-T|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+18>>1]=j+J;T=B-O<<16>>16;O=(((v-M|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+20>>1]=O+T;M=K-A<<16>>16;A=(((N-p|0)*11585|0)+8192|0)>>>14<<16>>16;b[c+22>>1]=A+M;p=k-e<<16>>16;e=o+l<<16>>16;b[c+24>>1]=e+p;l=F-g<<16>>16;g=x+u<<16>>16;b[c+26>>1]=g+l;u=m-y<<16>>16;y=i+f<<16>>16;b[c+28>>1]=y+u;f=U-D<<16>>16;D=V+E<<16>>16;b[c+30>>1]=D+f;b[c+32>>1]=f-D;b[c+34>>1]=u-y;b[c+36>>1]=l-g;b[c+38>>1]=p-e;b[c+40>>1]=M-A;b[c+42>>1]=T-O;b[c+44>>1]=J-j;b[c+46>>1]=Z-w;b[c+48>>1]=X-Y;b[c+50>>1]=r-W;b[c+52>>1]=t-G;b[c+54>>1]=H-d;b[c+56>>1]=q-C;b[c+58>>1]=L-n;b[c+60>>1]=z-I;b[c+62>>1]=P-h;return}function gd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;g=l;l=l+2208|0;h=g+160|0;i=g+96|0;j=g+32|0;k=g;m=k+2|0;n=k+4|0;o=k+6|0;p=k+8|0;q=k+10|0;r=k+12|0;s=k+14|0;t=k+16|0;u=k+18|0;v=k+20|0;w=k+22|0;x=k+24|0;y=k+26|0;z=k+28|0;A=k+30|0;B=0;C=c;c=h;while(1){D=0;do{E=D<<1;b[k+(D<<1)>>1]=b[C+((E|1)<<1)>>1]|b[C+(E<<1)>>1];D=D+1|0}while((D|0)!=16);D=b[m>>1]|b[k>>1];E=b[o>>1]|b[n>>1];F=b[q>>1]|b[p>>1];G=b[s>>1]|b[r>>1];H=b[u>>1]|b[t>>1];b[p>>1]=H;I=b[w>>1]|b[v>>1];b[q>>1]=I;J=b[y>>1]|b[x>>1];b[r>>1]=J;K=b[A>>1]|b[z>>1];b[s>>1]=K;L=I|H;b[n>>1]=L;H=K|J;b[o>>1]=H;J=G|F|(E|D);b[k>>1]=J;D=H|L;b[m>>1]=D;if(!((D|J)<<16>>16)){J=c;D=J+64|0;do{b[J>>1]=0;J=J+2|0}while((J|0)<(D|0))}else fd(C,c);B=B+1|0;if((B|0)==32)break;else{C=C+64|0;c=c+64|0}}c=0;do{C=0;do{b[i+(C<<1)>>1]=b[h+((C<<5)+c<<1)>>1]|0;C=C+1|0}while((C|0)!=32);fd(i,j);C=0;do{B=e+((S(C,f)|0)+c)|0;m=((b[j+(C<<1)>>1]|0)+32>>6)+(d[B>>0]|0)|0;a[B>>0]=(m|0)>255?-1:((m|0)>0?m:0)&255;C=C+1|0}while((C|0)!=32);c=c+1|0}while((c|0)!=32);l=g;return}function hd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;g=l;l=l+2176|0;h=g+128|0;i=g+64|0;j=g;qh(h|0,0,2048)|0;fd(c,h);fd(c+64|0,h+64|0);fd(c+128|0,h+128|0);fd(c+192|0,h+192|0);fd(c+256|0,h+256|0);fd(c+320|0,h+320|0);fd(c+384|0,h+384|0);fd(c+448|0,h+448|0);fd(c+512|0,h+512|0);fd(c+576|0,h+576|0);fd(c+640|0,h+640|0);fd(c+704|0,h+704|0);fd(c+768|0,h+768|0);fd(c+832|0,h+832|0);fd(c+896|0,h+896|0);fd(c+960|0,h+960|0);c=0;do{k=0;do{b[i+(k<<1)>>1]=b[h+((k<<5)+c<<1)>>1]|0;k=k+1|0}while((k|0)!=32);fd(i,j);k=0;do{m=e+((S(k,f)|0)+c)|0;n=((b[j+(k<<1)>>1]|0)+32>>6)+(d[m>>0]|0)|0;a[m>>0]=(n|0)>255?-1:((n|0)>0?n:0)&255;k=k+1|0}while((k|0)!=32);c=c+1|0}while((c|0)!=32);l=g;return}function id(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;g=l;l=l+2176|0;h=g+128|0;i=g+64|0;j=g;qh(h|0,0,2048)|0;fd(c,h);fd(c+64|0,h+64|0);fd(c+128|0,h+128|0);fd(c+192|0,h+192|0);fd(c+256|0,h+256|0);fd(c+320|0,h+320|0);fd(c+384|0,h+384|0);fd(c+448|0,h+448|0);c=0;do{k=0;do{b[i+(k<<1)>>1]=b[h+((k<<5)+c<<1)>>1]|0;k=k+1|0}while((k|0)!=32);fd(i,j);k=0;do{m=e+((S(k,f)|0)+c)|0;n=((b[j+(k<<1)>>1]|0)+32>>6)+(d[m>>0]|0)|0;a[m>>0]=(n|0)>255?-1:((n|0)>0?n:0)&255;k=k+1|0}while((k|0)!=32);c=c+1|0}while((c|0)!=32);l=g;return}function jd(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=(((((((b[c>>1]|0)*11585|0)+8192|0)>>>14<<16>>16)*11585|0)+8192|0)>>>14<<16>>16)+32>>6;c=e;e=0;while(1){h=0;do{i=c+h|0;j=(d[i>>0]|0)+g|0;a[i>>0]=(j|0)>255?-1:((j|0)>0?j:0)&255;h=h+1|0}while((h|0)!=32);e=e+1|0;if((e|0)==32)break;else c=c+f|0}return}function kd(){if(c[8577]|0)return;c[8577]=1;return}function ld(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;return}function md(a){a=a|0;var b=0;c[a+20>>2]=0;b=a+4|0;if(c[b>>2]|0)return 1;c[b>>2]=1;return 1}function nd(a){a=a|0;return (c[a+20>>2]|0)==0|0}function od(a){a=a|0;var b=0,d=0;b=c[a+8>>2]|0;if(!b)return;d=(Ea[b&31](c[a+12>>2]|0,c[a+16>>2]|0)|0)==0&1;b=a+20|0;c[b>>2]=d|c[b>>2];return}function pd(a){a=a|0;var b=0,d=0;b=c[a+8>>2]|0;if(!b)return;d=(Ea[b&31](c[a+12>>2]|0,c[a+16>>2]|0)|0)==0&1;b=a+20|0;c[b>>2]=d|c[b>>2];return}function qd(a){a=a|0;c[a+4>>2]=0;return}function rd(){return 19464}function sd(a){a=a|0;return}function td(a){a=a|0;return}function ud(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+7>>3;c[a+608>>2]=e;b=d+7>>3;c[a+600>>2]=b;c[a+612>>2]=e+8;d=e+1>>1;c[a+604>>2]=d;e=b+1>>1;c[a+596>>2]=e;c[a+592>>2]=S(e,d)|0;return}function vd(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+8|0;d=0;do{e=a+12+(d*160|0)|0;if((c[e>>2]|0)>0?(f=a+12+(d*160|0)+16|0,c[f>>2]|0):0){Ea[c[b>>2]&31](c[a>>2]|0,f)|0;c[e>>2]=0}e=a+12+(d*160|0)+4|0;Wa(c[e>>2]|0);c[e>>2]=0;Xa(a+12+(d*160|0)+28|0)|0;d=d+1|0}while((d|0)!=15);return}function wd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=b+7>>3;b=a+608|0;c[b>>2]=e;f=d+7>>3;d=a+600|0;c[d>>2]=f;g=e+8|0;h=a+612|0;c[h>>2]=g;i=e+1>>1;j=a+604|0;c[j>>2]=i;k=f+1>>1;l=a+596|0;c[l>>2]=k;m=a+592|0;c[m>>2]=S(k,i)|0;i=S(f+8|0,g)|0;if((c[a+700>>2]|0)<(i|0)){ya[c[a+724>>2]&15](a);if(!(Ea[c[a+720>>2]&31](a,i)|0)){n=c[b>>2]|0;o=c[d>>2]|0;p=4}}else{n=e;o=f;p=4}do if((p|0)==4){f=a+776|0;if((c[f>>2]|0)<(S(n,o)|0)){e=a+760|0;Wa(c[e>>2]|0);c[e>>2]=0;i=a+764|0;Wa(c[i>>2]|0);c[i>>2]=0;g=a+772|0;c[g>>2]=0;k=a+4096|0;if(!(c[k>>2]|0))c[a+768>>2]=0;q=S(c[b>>2]|0,c[d>>2]|0)|0;r=Va(q,1)|0;c[e>>2]=r;if(!r)break;r=Va(q,1)|0;c[i>>2]=r;if(!r)break;c[f>>2]=q;c[a+752>>2]=0;c[a+756>>2]=1;c[g>>2]=c[a+760>>2];if(!(c[k>>2]|0))c[a+768>>2]=r}r=a+17416|0;if((c[r>>2]|0)<(c[b>>2]|0)){k=a+17412|0;Wa(c[k>>2]|0);g=Va(((c[b>>2]|0)+7&-8)*6|0,1)|0;c[k>>2]=g;if(!g)break;g=a+17408|0;Wa(c[g>>2]|0);k=Va((c[b>>2]|0)+7&-8,1)|0;c[g>>2]=k;if(!k)break;c[r>>2]=c[b>>2]}r=a+3972|0;Wa(c[r>>2]|0);k=(c[b>>2]|0)+7>>3;c[a+3976>>2]=k;g=Va(S((c[d>>2]|0)+7>>3,k)|0,160)|0;c[r>>2]=g;if(g|0){s=0;return s|0}}while(0);c[b>>2]=0;c[d>>2]=0;c[h>>2]=8;c[j>>2]=0;c[l>>2]=0;c[m>>2]=0;ya[c[a+724>>2]&15](a);m=a+760|0;Wa(c[m>>2]|0);c[m>>2]=0;m=a+764|0;Wa(c[m>>2]|0);c[m>>2]=0;c[a+772>>2]=0;if(!(c[a+4096>>2]|0))c[a+768>>2]=0;m=a+17412|0;Wa(c[m>>2]|0);c[m>>2]=0;m=a+17408|0;Wa(c[m>>2]|0);c[m>>2]=0;m=a+3972|0;Wa(c[m>>2]|0);c[m>>2]=0;s=1;return s|0}function xd(a){a=a|0;var b=0;ya[c[a+724>>2]&15](a);b=a+760|0;Wa(c[b>>2]|0);c[b>>2]=0;b=a+764|0;Wa(c[b>>2]|0);c[b>>2]=0;c[a+772>>2]=0;if(!(c[a+4096>>2]|0))c[a+768>>2]=0;b=a+17412|0;Wa(c[b>>2]|0);c[b>>2]=0;b=a+17408|0;Wa(c[b>>2]|0);c[b>>2]=0;b=a+3972|0;Wa(c[b>>2]|0);c[b>>2]=0;b=a+4108|0;Wa(c[b>>2]|0);c[b>>2]=0;b=a+4112|0;Wa(c[b>>2]|0);c[b>>2]=0;return}function yd(a){a=a|0;var b=0;ya[c[a+728>>2]&15](a);b=c[a+768>>2]|0;if(!b)return;if(c[a+4096>>2]|0)return;qh(b|0,0,S(c[a+608>>2]|0,c[a+600>>2]|0)|0)|0;return}function zd(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+752|0;d=c[b>>2]|0;e=a+756|0;f=c[e>>2]|0;c[b>>2]=f;c[e>>2]=d;c[a+772>>2]=c[a+760+(f<<2)>>2];c[a+768>>2]=c[a+760+(d<<2)>>2];return}function Ad(b,c,e){b=b|0;c=c|0;e=e|0;var f=0;if((e|2|0)!=2){f=a[b+20+((e+-1|0)*12|0)>>0]|0;return f|0}if(!c){f=0;return f|0}if((a[c+8>>0]|0)>0){f=0;return f|0}f=a[((d[c>>0]|0)<3?c+20+((e+1|0)*12|0)|0:c+1|0)>>0]|0;return f|0}function Bd(b,c,e){b=b|0;c=c|0;e=e|0;var f=0;if((e|1|0)!=1){f=a[b+20+((e+-2|0)*12|0)>>0]|0;return f|0}if(!c){f=0;return f|0}if((a[c+8>>0]|0)>0){f=0;return f|0}f=a[((d[c>>0]|0)<3?c+20+((e+2|0)*12|0)|0:c+1|0)>>0]|0;return f|0}function Cd(a,b,d){a=a|0;b=b|0;d=d|0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+92>>2]=b;c[a+96>>2]=d;c[a+180>>2]=b;c[a+184>>2]=d;return}function Dd(a){a=a|0;var b=0;b=a+4108|0;vh((c[b>>2]|0)+174|0,24898,432)|0;vh((c[b>>2]|0)+606|0,25330,432)|0;vh((c[b>>2]|0)+1038|0,25762,432)|0;vh((c[b>>2]|0)+1470|0,26194,432)|0;return}function Ed(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if((c[b+564>>2]|0)!=0?(a[b+580>>0]|0)==0:0)d=(c[b+560>>2]|0)==0?128:112;else d=112;e=b+4112|0;f=b+4116|0;g=b+4108|0;h=0;do{i=c[e>>2]|0;j=c[f>>2]|0;k=c[g>>2]|0;l=0;do{m=0;do{n=0;do{o=(n|0)==0?3:6;p=0;do{q=c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)>>2]|0;r=c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)+4>>2]|0;s=c[b+14152+(h*576|0)+(l*288|0)+(m*144|0)+(n*24|0)+(p<<2)>>2]|0;t=(c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)+8>>2]|0)+r|0;u=a[i+(j*2044|0)+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)>>0]|0;if(!s)v=128;else{w=sh(c[b+4936+(h*2304|0)+(l*1152|0)+(m*576|0)+(n*96|0)+(p<<4)+12>>2]|0,0,8)|0;x=ph(w|0,D|0,s>>>1|0,0)|0;w=yh(x|0,D|0,s|0,0)|0;v=((255-w|0)>>>23|w)&255|(w|0)==0}w=((S(s>>>0<24?s:24,d)|0)>>>0)/24|0;a[k+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)>>0]=((S(256-w|0,u&255)|0)+128+(S(v,w)|0)|0)>>>8;w=a[i+(j*2044|0)+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+1>>0]|0;u=t+q|0;if(!u)y=128;else{s=sh(q|0,0,8)|0;q=ph(u>>>1|0,0,s|0,D|0)|0;s=yh(q|0,D|0,u|0,0)|0;y=((255-s|0)>>>23|s)&255|(s|0)==0}s=((S(u>>>0<24?u:24,d)|0)>>>0)/24|0;a[k+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+1>>0]=((S(w&255,256-s|0)|0)+128+(S(y,s)|0)|0)>>>8;s=a[i+(j*2044|0)+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+2>>0]|0;if(!t)z=128;else{w=sh(r|0,0,8)|0;r=ph(t>>>1|0,0,w|0,D|0)|0;w=yh(r|0,D|0,t|0,0)|0;z=((255-w|0)>>>23|w)&255|(w|0)==0}w=((S(t>>>0<24?t:24,d)|0)>>>0)/24|0;a[k+174+(h*432|0)+(l*216|0)+(m*108|0)+(n*18|0)+(p*3|0)+2>>0]=((S(s&255,256-w|0)|0)+128+(S(z,w)|0)|0)>>>8;p=p+1|0}while((p|0)<(o|0));n=n+1|0}while((n|0)!=6);m=m+1|0}while((m|0)!=2);l=l+1|0}while((l|0)!=2);h=h+1|0}while((h|0)!=4);return}function Fd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;d=c[b+4108>>2]|0;e=c[b+4112>>2]|0;f=c[b+4116>>2]|0;g=a[e+(f*2044|0)+1931>>0]|0;h=c[b+16616>>2]|0;i=(c[b+16620>>2]|0)+h|0;if(!i)j=g;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(h|0,0,8)|0;h=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(h|0,D|0,i|0,0)|0;j=((S(256-k|0,g&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,k)|0)|0)>>>8&255}a[d+1931>>0]=j;j=a[e+(f*2044|0)+1932>>0]|0;k=c[b+16624>>2]|0;l=(c[b+16628>>2]|0)+k|0;if(!l)m=j;else{g=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(k|0,0,8)|0;k=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(k|0,D|0,l|0,0)|0;m=((S(256-g|0,j&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,g)|0)|0)>>>8&255}a[d+1932>>0]=m;m=a[e+(f*2044|0)+1933>>0]|0;g=c[b+16632>>2]|0;i=(c[b+16636>>2]|0)+g|0;if(!i)n=m;else{j=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(g|0,0,8)|0;g=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(g|0,D|0,i|0,0)|0;n=((S(256-j|0,m&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,j)|0)|0)>>>8&255}a[d+1933>>0]=n;n=a[e+(f*2044|0)+1934>>0]|0;j=c[b+16640>>2]|0;l=(c[b+16644>>2]|0)+j|0;if(!l)o=n;else{m=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(j|0,0,8)|0;j=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(j|0,D|0,l|0,0)|0;o=((S(256-m|0,n&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,m)|0)|0)>>>8&255}a[d+1934>>0]=o;o=a[e+(f*2044|0)+1935>>0]|0;m=c[b+16648>>2]|0;i=(c[b+16652>>2]|0)+m|0;if(!i)p=o;else{n=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(m|0,0,8)|0;m=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(m|0,D|0,i|0,0)|0;p=((S(256-n|0,o&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,n)|0)|0)>>>8&255}a[d+1935>>0]=p;p=a[e+(f*2044|0)+1936>>0]|0;n=c[b+16656>>2]|0;l=(c[b+16660>>2]|0)+n|0;if(!l)q=p;else{o=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(n|0,0,8)|0;n=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(n|0,D|0,l|0,0)|0;q=((S(256-o|0,p&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,o)|0)|0)>>>8&255}a[d+1936>>0]=q;q=a[e+(f*2044|0)+1937>>0]|0;o=c[b+16664>>2]|0;i=(c[b+16668>>2]|0)+o|0;if(!i)r=q;else{p=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(o|0,0,8)|0;o=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(o|0,D|0,i|0,0)|0;r=((S(256-p|0,q&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,p)|0)|0)>>>8&255}a[d+1937>>0]=r;r=a[e+(f*2044|0)+1938>>0]|0;p=c[b+16672>>2]|0;l=(c[b+16676>>2]|0)+p|0;if(!l)s=r;else{q=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(p|0,0,8)|0;p=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(p|0,D|0,l|0,0)|0;s=((S(256-q|0,r&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,q)|0)|0)>>>8&255}a[d+1938>>0]=s;s=a[e+(f*2044|0)+1939>>0]|0;q=c[b+16680>>2]|0;i=(c[b+16684>>2]|0)+q|0;if(!i)t=s;else{r=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(q|0,0,8)|0;q=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(q|0,D|0,i|0,0)|0;t=((S(256-r|0,s&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,r)|0)|0)>>>8&255}a[d+1939>>0]=t;t=a[e+(f*2044|0)+1950>>0]|0;r=c[b+16768>>2]|0;l=(c[b+16772>>2]|0)+r|0;if(!l)u=t;else{s=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(r|0,0,8)|0;r=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(r|0,D|0,l|0,0)|0;u=((S(256-s|0,t&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,s)|0)|0)>>>8&255}a[d+1950>>0]=u;u=a[e+(f*2044|0)+1951>>0]|0;s=c[b+16776>>2]|0;i=(c[b+16780>>2]|0)+s|0;if(!i)v=u;else{t=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(s|0,0,8)|0;s=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(s|0,D|0,i|0,0)|0;v=((S(256-t|0,u&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,t)|0)|0)>>>8&255}a[d+1951>>0]=v;v=a[e+(f*2044|0)+1952>>0]|0;t=c[b+16784>>2]|0;l=(c[b+16788>>2]|0)+t|0;if(!l)w=v;else{u=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(t|0,0,8)|0;t=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(t|0,D|0,l|0,0)|0;w=((S(256-u|0,v&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,u)|0)|0)>>>8&255}a[d+1952>>0]=w;w=a[e+(f*2044|0)+1953>>0]|0;u=c[b+16792>>2]|0;i=(c[b+16796>>2]|0)+u|0;if(!i)x=w;else{v=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(u|0,0,8)|0;u=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(u|0,D|0,i|0,0)|0;x=((S(256-v|0,w&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,v)|0)|0)>>>8&255}a[d+1953>>0]=x;x=a[e+(f*2044|0)+1954>>0]|0;v=c[b+16800>>2]|0;l=(c[b+16804>>2]|0)+v|0;if(!l)y=x;else{w=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(v|0,0,8)|0;v=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(v|0,D|0,l|0,0)|0;y=((S(256-w|0,x&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,w)|0)|0)>>>8&255}a[d+1954>>0]=y;y=a[e+(f*2044|0)+1940>>0]|0;w=c[b+16688>>2]|0;i=(c[b+16692>>2]|0)+w|0;if(!i)z=y;else{x=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(w|0,0,8)|0;w=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(w|0,D|0,i|0,0)|0;z=((S(256-x|0,y&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,x)|0)|0)>>>8&255}a[d+1940>>0]=z;z=a[e+(f*2044|0)+1941>>0]|0;x=c[b+16696>>2]|0;l=(c[b+16700>>2]|0)+x|0;if(!l)A=z;else{y=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(x|0,0,8)|0;x=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(x|0,D|0,l|0,0)|0;A=((S(256-y|0,z&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,y)|0)|0)>>>8&255}a[d+1941>>0]=A;A=a[e+(f*2044|0)+1942>>0]|0;y=c[b+16704>>2]|0;i=(c[b+16708>>2]|0)+y|0;if(!i)B=A;else{z=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(y|0,0,8)|0;y=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(y|0,D|0,i|0,0)|0;B=((S(256-z|0,A&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,z)|0)|0)>>>8&255}a[d+1942>>0]=B;B=a[e+(f*2044|0)+1943>>0]|0;z=c[b+16712>>2]|0;l=(c[b+16716>>2]|0)+z|0;if(!l)C=B;else{A=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(z|0,0,8)|0;z=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(z|0,D|0,l|0,0)|0;C=((S(256-A|0,B&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,A)|0)|0)>>>8&255}a[d+1943>>0]=C;C=a[e+(f*2044|0)+1944>>0]|0;A=c[b+16720>>2]|0;i=(c[b+16724>>2]|0)+A|0;if(!i)E=C;else{B=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(A|0,0,8)|0;A=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(A|0,D|0,i|0,0)|0;E=((S(256-B|0,C&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,B)|0)|0)>>>8&255}a[d+1944>>0]=E;E=a[e+(f*2044|0)+1945>>0]|0;B=c[b+16728>>2]|0;l=(c[b+16732>>2]|0)+B|0;if(!l)F=E;else{C=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(B|0,0,8)|0;B=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(B|0,D|0,l|0,0)|0;F=((S(256-C|0,E&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,C)|0)|0)>>>8&255}a[d+1945>>0]=F;F=a[e+(f*2044|0)+1946>>0]|0;C=c[b+16736>>2]|0;i=(c[b+16740>>2]|0)+C|0;if(!i)G=F;else{E=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(C|0,0,8)|0;C=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(C|0,D|0,i|0,0)|0;G=((S(256-E|0,F&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,E)|0)|0)>>>8&255}a[d+1946>>0]=G;G=a[e+(f*2044|0)+1947>>0]|0;E=c[b+16744>>2]|0;l=(c[b+16748>>2]|0)+E|0;if(!l)H=G;else{F=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(E|0,0,8)|0;E=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(E|0,D|0,l|0,0)|0;H=((S(256-F|0,G&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,F)|0)|0)>>>8&255}a[d+1947>>0]=H;H=a[e+(f*2044|0)+1948>>0]|0;F=c[b+16752>>2]|0;i=(c[b+16756>>2]|0)+F|0;if(!i)I=H;else{G=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=sh(F|0,0,8)|0;F=ph(i>>>1|0,0,l|0,D|0)|0;l=yh(F|0,D|0,i|0,0)|0;I=((S(256-G|0,H&255)|0)+128+(S(((255-l|0)>>>23|l)&255|(l|0)==0,G)|0)|0)>>>8&255}a[d+1948>>0]=I;I=a[e+(f*2044|0)+1949>>0]|0;G=c[b+16760>>2]|0;l=(c[b+16764>>2]|0)+G|0;if(!l)J=I;else{H=c[19488+((l>>>0<20?l:20)<<2)>>2]|0;i=sh(G|0,0,8)|0;G=ph(l>>>1|0,0,i|0,D|0)|0;i=yh(G|0,D|0,l|0,0)|0;J=((S(256-H|0,I&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,H)|0)|0)>>>8&255}a[d+1949>>0]=J;ab(27682,e+(f*2044|0)+1910|0,b+16504|0,d+1910|0);ab(27682,e+(f*2044|0)+1913|0,b+16520|0,d+1913|0);ab(27682,e+(f*2044|0)+1916|0,b+16536|0,d+1916|0);ab(27682,e+(f*2044|0)+1919|0,b+16552|0,d+1919|0);ab(27682,e+(f*2044|0)+1922|0,b+16568|0,d+1922|0);ab(27682,e+(f*2044|0)+1925|0,b+16584|0,d+1925|0);ab(27682,e+(f*2044|0)+1928|0,b+16600|0,d+1928|0);ab(27664,e+(f*2044|0)|0,b+4120|0,d);ab(27664,e+(f*2044|0)+9|0,b+4160|0,d+9|0);ab(27664,e+(f*2044|0)+18|0,b+4200|0,d+18|0);ab(27664,e+(f*2044|0)+27|0,b+4240|0,d+27|0);ab(27664,e+(f*2044|0)+36|0,b+4280|0,d+36|0);ab(27664,e+(f*2044|0)+45|0,b+4320|0,d+45|0);ab(27664,e+(f*2044|0)+54|0,b+4360|0,d+54|0);ab(27664,e+(f*2044|0)+63|0,b+4400|0,d+63|0);ab(27664,e+(f*2044|0)+72|0,b+4440|0,d+72|0);ab(27664,e+(f*2044|0)+81|0,b+4480|0,d+81|0);ab(27664,e+(f*2044|0)+90|0,b+4520|0,d+90|0);ab(27664,e+(f*2044|0)+99|0,b+4560|0,d+99|0);ab(27664,e+(f*2044|0)+108|0,b+4600|0,d+108|0);ab(27664,e+(f*2044|0)+117|0,b+4640|0,d+117|0);ab(27688,e+(f*2044|0)+126|0,b+4680|0,d+126|0);ab(27688,e+(f*2044|0)+129|0,b+4696|0,d+129|0);ab(27688,e+(f*2044|0)+132|0,b+4712|0,d+132|0);ab(27688,e+(f*2044|0)+135|0,b+4728|0,d+135|0);ab(27688,e+(f*2044|0)+138|0,b+4744|0,d+138|0);ab(27688,e+(f*2044|0)+141|0,b+4760|0,d+141|0);ab(27688,e+(f*2044|0)+144|0,b+4776|0,d+144|0);ab(27688,e+(f*2044|0)+147|0,b+4792|0,d+147|0);ab(27688,e+(f*2044|0)+150|0,b+4808|0,d+150|0);ab(27688,e+(f*2044|0)+153|0,b+4824|0,d+153|0);ab(27688,e+(f*2044|0)+156|0,b+4840|0,d+156|0);ab(27688,e+(f*2044|0)+159|0,b+4856|0,d+159|0);ab(27688,e+(f*2044|0)+162|0,b+4872|0,d+162|0);ab(27688,e+(f*2044|0)+165|0,b+4888|0,d+165|0);ab(27688,e+(f*2044|0)+168|0,b+4904|0,d+168|0);ab(27688,e+(f*2044|0)+171|0,b+4920|0,d+171|0);if((a[b+780>>0]|0)==4){ab(27694,e+(f*2044|0)+1902|0,b+16456|0,d+1902|0);ab(27694,e+(f*2044|0)+1904|0,b+16468|0,d+1904|0);ab(27694,e+(f*2044|0)+1906|0,b+16480|0,d+1906|0);ab(27694,e+(f*2044|0)+1908|0,b+16492|0,d+1908|0)}if((c[b+616>>2]|0)==4){J=c[b+16864>>2]|0;H=a[e+(f*2044|0)+1965>>0]|0;i=(c[b+16868>>2]|0)+J|0;if(!i)K=H;else{I=sh(J|0,0,8)|0;J=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;l=ph(i>>>1|0,0,I|0,D|0)|0;I=yh(l|0,D|0,i|0,0)|0;K=((S(256-J|0,H&255)|0)+128+(S(((255-I|0)>>>23|I)&255|(I|0)==0,J)|0)|0)>>>8&255}a[d+1965>>0]=K;K=c[b+16840>>2]|0;J=c[b+16844>>2]|0;I=(c[b+16848>>2]|0)+J|0;H=a[e+(f*2044|0)+1961>>0]|0;i=I+K|0;if(!i)L=H;else{l=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;G=sh(K|0,0,8)|0;K=ph(i>>>1|0,0,G|0,D|0)|0;G=yh(K|0,D|0,i|0,0)|0;L=((S(256-l|0,H&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,l)|0)|0)>>>8&255}a[d+1961>>0]=L;L=a[e+(f*2044|0)+1962>>0]|0;if(!I)M=L;else{l=c[19488+((I>>>0<20?I:20)<<2)>>2]|0;G=sh(J|0,0,8)|0;J=ph(I>>>1|0,0,G|0,D|0)|0;G=yh(J|0,D|0,I|0,0)|0;M=((S(256-l|0,L&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,l)|0)|0)>>>8&255}a[d+1962>>0]=M;M=c[b+16808>>2]|0;l=c[b+16812>>2]|0;G=c[b+16816>>2]|0;L=c[b+16820>>2]|0;I=L+G|0;J=a[e+(f*2044|0)+1955>>0]|0;H=G+l+L+M|0;if(!H)N=J;else{L=c[19488+((H>>>0<20?H:20)<<2)>>2]|0;i=sh(M|0,0,8)|0;M=ph(H>>>1|0,0,i|0,D|0)|0;i=yh(M|0,D|0,H|0,0)|0;N=((S(256-L|0,J&255)|0)+128+(S(((255-i|0)>>>23|i)&255|(i|0)==0,L)|0)|0)>>>8&255}a[d+1955>>0]=N;N=a[e+(f*2044|0)+1956>>0]|0;L=I+l|0;if(!L)O=N;else{i=c[19488+((L>>>0<20?L:20)<<2)>>2]|0;J=sh(l|0,0,8)|0;l=ph(L>>>1|0,0,J|0,D|0)|0;J=yh(l|0,D|0,L|0,0)|0;O=((S(256-i|0,N&255)|0)+128+(S(((255-J|0)>>>23|J)&255|(J|0)==0,i)|0)|0)>>>8&255}a[d+1956>>0]=O;O=a[e+(f*2044|0)+1957>>0]|0;if(!I)P=O;else{i=c[19488+((I>>>0<20?I:20)<<2)>>2]|0;J=sh(G|0,0,8)|0;G=ph(I>>>1|0,0,J|0,D|0)|0;J=yh(G|0,D|0,I|0,0)|0;P=((S(256-i|0,O&255)|0)+128+(S(((255-J|0)>>>23|J)&255|(J|0)==0,i)|0)|0)>>>8&255}a[d+1957>>0]=P;P=c[b+16872>>2]|0;i=a[e+(f*2044|0)+1966>>0]|0;J=(c[b+16876>>2]|0)+P|0;if(!J)Q=i;else{O=sh(P|0,0,8)|0;P=c[19488+((J>>>0<20?J:20)<<2)>>2]|0;I=ph(J>>>1|0,0,O|0,D|0)|0;O=yh(I|0,D|0,J|0,0)|0;Q=((S(256-P|0,i&255)|0)+128+(S(((255-O|0)>>>23|O)&255|(O|0)==0,P)|0)|0)>>>8&255}a[d+1966>>0]=Q;Q=c[b+16852>>2]|0;P=c[b+16856>>2]|0;O=(c[b+16860>>2]|0)+P|0;i=a[e+(f*2044|0)+1963>>0]|0;J=O+Q|0;if(!J)R=i;else{I=c[19488+((J>>>0<20?J:20)<<2)>>2]|0;G=sh(Q|0,0,8)|0;Q=ph(J>>>1|0,0,G|0,D|0)|0;G=yh(Q|0,D|0,J|0,0)|0;R=((S(256-I|0,i&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,I)|0)|0)>>>8&255}a[d+1963>>0]=R;R=a[e+(f*2044|0)+1964>>0]|0;if(!O)T=R;else{I=c[19488+((O>>>0<20?O:20)<<2)>>2]|0;G=sh(P|0,0,8)|0;P=ph(O>>>1|0,0,G|0,D|0)|0;G=yh(P|0,D|0,O|0,0)|0;T=((S(256-I|0,R&255)|0)+128+(S(((255-G|0)>>>23|G)&255|(G|0)==0,I)|0)|0)>>>8&255}a[d+1964>>0]=T;T=c[b+16824>>2]|0;I=c[b+16828>>2]|0;G=c[b+16832>>2]|0;R=c[b+16836>>2]|0;O=R+G|0;P=a[e+(f*2044|0)+1958>>0]|0;i=G+I+R+T|0;if(!i)U=P;else{R=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;J=sh(T|0,0,8)|0;T=ph(i>>>1|0,0,J|0,D|0)|0;J=yh(T|0,D|0,i|0,0)|0;U=((S(256-R|0,P&255)|0)+128+(S(((255-J|0)>>>23|J)&255|(J|0)==0,R)|0)|0)>>>8&255}a[d+1958>>0]=U;U=a[e+(f*2044|0)+1959>>0]|0;R=O+I|0;if(!R)V=U;else{J=c[19488+((R>>>0<20?R:20)<<2)>>2]|0;P=sh(I|0,0,8)|0;I=ph(R>>>1|0,0,P|0,D|0)|0;P=yh(I|0,D|0,R|0,0)|0;V=((S(256-J|0,U&255)|0)+128+(S(((255-P|0)>>>23|P)&255|(P|0)==0,J)|0)|0)>>>8&255}a[d+1959>>0]=V;V=a[e+(f*2044|0)+1960>>0]|0;if(!O)W=V;else{J=c[19488+((O>>>0<20?O:20)<<2)>>2]|0;P=sh(G|0,0,8)|0;G=ph(O>>>1|0,0,P|0,D|0)|0;P=yh(G|0,D|0,O|0,0)|0;W=((S(256-J|0,V&255)|0)+128+(S(((255-P|0)>>>23|P)&255|(P|0)==0,J)|0)|0)>>>8&255}a[d+1960>>0]=W}W=a[e+(f*2044|0)+1967>>0]|0;J=c[b+16896>>2]|0;P=(c[b+16900>>2]|0)+J|0;if(!P)X=W;else{V=c[19488+((P>>>0<20?P:20)<<2)>>2]|0;O=sh(J|0,0,8)|0;J=ph(P>>>1|0,0,O|0,D|0)|0;O=yh(J|0,D|0,P|0,0)|0;X=((S(256-V|0,W&255)|0)+128+(S(((255-O|0)>>>23|O)&255|(O|0)==0,V)|0)|0)>>>8&255}a[d+1967>>0]=X;X=a[e+(f*2044|0)+1968>>0]|0;V=c[b+16904>>2]|0;O=(c[b+16908>>2]|0)+V|0;if(!O)Y=X;else{W=c[19488+((O>>>0<20?O:20)<<2)>>2]|0;P=sh(V|0,0,8)|0;V=ph(O>>>1|0,0,P|0,D|0)|0;P=yh(V|0,D|0,O|0,0)|0;Y=((S(256-W|0,X&255)|0)+128+(S(((255-P|0)>>>23|P)&255|(P|0)==0,W)|0)|0)>>>8&255}a[d+1968>>0]=Y;Y=a[e+(f*2044|0)+1969>>0]|0;f=c[b+16912>>2]|0;e=(c[b+16916>>2]|0)+f|0;if(!e){Z=Y;_=d+1969|0;a[_>>0]=Z;return}b=c[19488+((e>>>0<20?e:20)<<2)>>2]|0;W=sh(f|0,0,8)|0;f=ph(e>>>1|0,0,W|0,D|0)|0;W=yh(f|0,D|0,e|0,0)|0;Z=((S(256-b|0,Y&255)|0)+128+(S(((255-W|0)>>>23|W)&255|(W|0)==0,b)|0)|0)>>>8&255;_=d+1969|0;a[_>>0]=Z;return}function Gd(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;he(d+3980|0);a[d+3983>>0]=0;e=c[d+768>>2]|0;if(e|0?(c[d+4096>>2]|0)==0:0)qh(e|0,0,S(c[d+608>>2]|0,c[d+600>>2]|0)|0)|0;e=c[d+772>>2]|0;if(e|0)qh(e|0,0,S(c[d+608>>2]|0,c[d+600>>2]|0)|0)|0;e=d+3962|0;b[e>>1]=0;b[e+2>>1]=0>>>16;b[d+3968>>1]=0;a[d+3956>>0]=1;a[d+3957>>0]=1;a[d+3958>>0]=1;a[d+3959>>0]=0;a[d+3960>>0]=-1;a[d+3961>>0]=-1;a[d+3966>>0]=0;a[d+3967>>0]=0;c[d+3952>>2]=-1;Dd(d);e=d+4108|0;f=c[e>>2]|0;g=f+36|0;h=27698;i=g+90|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));g=f;h=27788;i=g+36|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));j=f+1902|0;k=j;a[k>>0]=-14376213;a[k+1>>0]=-14376213>>8;a[k+2>>0]=-14376213>>16;a[k+3>>0]=-14376213>>24;k=j+4|0;a[k>>0]=-1869282526;a[k+1>>0]=-1869282526>>8;a[k+2>>0]=-1869282526>>16;a[k+3>>0]=-1869282526>>24;g=f+126|0;h=27824;i=g+48|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));k=f+1931|0;a[k>>0]=-507812343;a[k+1>>0]=-507812343>>8;a[k+2>>0]=-507812343>>16;a[k+3>>0]=-507812343>>24;k=f+1935|0;a[k>>0]=a[27872]|0;a[k+1>>0]=a[27873]|0;a[k+2>>0]=a[27874]|0;a[k+3>>0]=a[27875]|0;a[k+4>>0]=a[27876]|0;k=f+1950|0;a[k>>0]=a[27877]|0;a[k+1>>0]=a[27878]|0;a[k+2>>0]=a[27879]|0;a[k+3>>0]=a[27880]|0;a[k+4>>0]=a[27881]|0;g=f+1940|0;h=27882;i=g+10|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));g=f+1955|0;h=27892;i=g+12|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));k=f+1967|0;a[k>>0]=a[27904]|0;a[k+1>>0]=a[27905]|0;a[k+2>>0]=a[27906]|0;g=f+1910|0;h=27907;i=g+21|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));Jd(d);h=c[e>>2]|0;c[h+2040>>2]=1;g=d+564|0;a:do if((c[g>>2]|0)!=0?(c[d+17360>>2]|0)==0:0){switch(c[d+588>>2]|0){case 3:{l=9;break a;break}case 2:break;default:break a}vh((c[d+4112>>2]|0)+((c[d+4116>>2]|0)*2044|0)|0,h|0,2044)|0}else l=9;while(0);if((l|0)==9){l=d+4112|0;vh(c[l>>2]|0,h|0,2044)|0;vh((c[l>>2]|0)+2044|0,c[e>>2]|0,2044)|0;vh((c[l>>2]|0)+4088|0,c[e>>2]|0,2044)|0;vh((c[l>>2]|0)+6132|0,c[e>>2]|0,2044)|0}if(c[g>>2]|0?(a[d+580>>0]|0)==0:0){m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}g=c[d+712>>2]|0;if(!g){m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}if(c[d+4096>>2]|0){m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}qh(g|0,0,S((c[d+612>>2]|0)*68|0,(c[d+600>>2]|0)+1|0)|0)|0;m=d+3924|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;n=d+4116|0;c[n>>2]=0;return}function Hd(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!e)return;f=b[a>>1]|0;g=b[a+2>>1]|0;a=g<<16>>16==0;h=f<<16>>16==0?(a^1)&1:a?2:3;a=e+(h<<2)|0;c[a>>2]=(c[a>>2]|0)+1;if((h|1|0)==3){a=f<<16>>16;i=e+16+(a>>>31<<2)|0;c[i>>2]=(c[i>>2]|0)+1;i=(f<<16>>16<0?0-a|0:a)+-1|0;if((i|0)>8191)j=10;else j=d[27962+(i>>3)>>0]|0;a=(j|0)==0;f=i-(a?0:8<<j)|0;i=e+24+(j<<2)|0;c[i>>2]=(c[i>>2]|0)+1;i=f>>3;k=f>>>1&3;l=f&1;if(a){a=e+68+(i<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=e+156+(i<<4)+(k<<2)|0;c[a>>2]=(c[a>>2]|0)+1;m=e+204+(l<<2)|0}else{a=0;do{f=e+76+(a<<3)+((i>>>a&1)<<2)|0;c[f>>2]=(c[f>>2]|0)+1;a=a+1|0}while((a|0)<(j|0));j=e+188+(k<<2)|0;c[j>>2]=(c[j>>2]|0)+1;m=e+212+(l<<2)|0}c[m>>2]=(c[m>>2]|0)+1}if((h|2|0)!=3)return;h=g<<16>>16;m=e+220+(h>>>31<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=(g<<16>>16<0?0-h|0:h)+-1|0;if((m|0)>8191)n=10;else n=d[27962+(m>>3)>>0]|0;h=(n|0)==0;g=m-(h?0:8<<n)|0;m=e+228+(n<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=g>>3;l=g>>>1&3;j=g&1;if(h){h=e+272+(m<<2)|0;c[h>>2]=(c[h>>2]|0)+1;h=e+360+(m<<4)+(l<<2)|0;c[h>>2]=(c[h>>2]|0)+1;o=e+408+(j<<2)|0}else{h=0;do{g=e+280+(h<<3)+((m>>>h&1)<<2)|0;c[g>>2]=(c[g>>2]|0)+1;h=h+1|0}while((h|0)<(n|0));n=e+392+(l<<2)|0;c[n>>2]=(c[n>>2]|0)+1;o=e+416+(j<<2)|0}c[o>>2]=(c[o>>2]|0)+1;return}function Id(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=c[b+4108>>2]|0;f=c[b+4112>>2]|0;g=c[b+4116>>2]|0;ab(27928,f+(g*2044|0)+1970|0,b+16920|0,e+1970|0);h=(d|0)==0;d=0;do{i=a[f+(g*2044|0)+1973+(d*33|0)>>0]|0;j=c[b+16936+(d*204|0)>>2]|0;k=(c[b+16936+(d*204|0)+4>>2]|0)+j|0;if(!k)l=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;n=sh(j|0,0,8)|0;j=ph(k>>>1|0,0,n|0,D|0)|0;n=yh(j|0,D|0,k|0,0)|0;l=((S(256-m|0,i&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)>>0]=l;ab(27934,f+(g*2044|0)+1973+(d*33|0)+1|0,b+16936+(d*204|0)+8|0,e+1973+(d*33|0)+1|0);ab(27954,f+(g*2044|0)+1973+(d*33|0)+11|0,b+16936+(d*204|0)+52|0,e+1973+(d*33|0)+11|0);m=a[f+(g*2044|0)+1973+(d*33|0)+12>>0]|0;n=c[b+16936+(d*204|0)+60>>2]|0;i=(c[b+16936+(d*204|0)+64>>2]|0)+n|0;if(!i)o=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;j=sh(n|0,0,8)|0;n=ph(i>>>1|0,0,j|0,D|0)|0;j=yh(n|0,D|0,i|0,0)|0;o=((S(256-k|0,m&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+12>>0]=o;k=a[f+(g*2044|0)+1973+(d*33|0)+13>>0]|0;j=c[b+16936+(d*204|0)+68>>2]|0;m=(c[b+16936+(d*204|0)+72>>2]|0)+j|0;if(!m)p=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;n=sh(j|0,0,8)|0;j=ph(m>>>1|0,0,n|0,D|0)|0;n=yh(j|0,D|0,m|0,0)|0;p=((S(256-i|0,k&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+13>>0]=p;i=a[f+(g*2044|0)+1973+(d*33|0)+14>>0]|0;n=c[b+16936+(d*204|0)+76>>2]|0;k=(c[b+16936+(d*204|0)+80>>2]|0)+n|0;if(!k)q=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;j=sh(n|0,0,8)|0;n=ph(k>>>1|0,0,j|0,D|0)|0;j=yh(n|0,D|0,k|0,0)|0;q=((S(256-m|0,i&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+14>>0]=q;m=a[f+(g*2044|0)+1973+(d*33|0)+15>>0]|0;j=c[b+16936+(d*204|0)+84>>2]|0;i=(c[b+16936+(d*204|0)+88>>2]|0)+j|0;if(!i)r=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;n=sh(j|0,0,8)|0;j=ph(i>>>1|0,0,n|0,D|0)|0;n=yh(j|0,D|0,i|0,0)|0;r=((S(256-k|0,m&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+15>>0]=r;k=a[f+(g*2044|0)+1973+(d*33|0)+16>>0]|0;n=c[b+16936+(d*204|0)+92>>2]|0;m=(c[b+16936+(d*204|0)+96>>2]|0)+n|0;if(!m)s=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;j=sh(n|0,0,8)|0;n=ph(m>>>1|0,0,j|0,D|0)|0;j=yh(n|0,D|0,m|0,0)|0;s=((S(256-i|0,k&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+16>>0]=s;i=a[f+(g*2044|0)+1973+(d*33|0)+17>>0]|0;j=c[b+16936+(d*204|0)+100>>2]|0;k=(c[b+16936+(d*204|0)+104>>2]|0)+j|0;if(!k)t=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;n=sh(j|0,0,8)|0;j=ph(k>>>1|0,0,n|0,D|0)|0;n=yh(j|0,D|0,k|0,0)|0;t=((S(256-m|0,i&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+17>>0]=t;m=a[f+(g*2044|0)+1973+(d*33|0)+18>>0]|0;n=c[b+16936+(d*204|0)+108>>2]|0;i=(c[b+16936+(d*204|0)+112>>2]|0)+n|0;if(!i)u=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;j=sh(n|0,0,8)|0;n=ph(i>>>1|0,0,j|0,D|0)|0;j=yh(n|0,D|0,i|0,0)|0;u=((S(256-k|0,m&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+18>>0]=u;k=a[f+(g*2044|0)+1973+(d*33|0)+19>>0]|0;j=c[b+16936+(d*204|0)+116>>2]|0;m=(c[b+16936+(d*204|0)+120>>2]|0)+j|0;if(!m)v=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;n=sh(j|0,0,8)|0;j=ph(m>>>1|0,0,n|0,D|0)|0;n=yh(j|0,D|0,m|0,0)|0;v=((S(256-i|0,k&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+19>>0]=v;i=a[f+(g*2044|0)+1973+(d*33|0)+20>>0]|0;n=c[b+16936+(d*204|0)+124>>2]|0;k=(c[b+16936+(d*204|0)+128>>2]|0)+n|0;if(!k)w=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;j=sh(n|0,0,8)|0;n=ph(k>>>1|0,0,j|0,D|0)|0;j=yh(n|0,D|0,k|0,0)|0;w=((S(256-m|0,i&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+20>>0]=w;m=a[f+(g*2044|0)+1973+(d*33|0)+21>>0]|0;j=c[b+16936+(d*204|0)+132>>2]|0;i=(c[b+16936+(d*204|0)+136>>2]|0)+j|0;if(!i)x=m;else{k=c[19488+((i>>>0<20?i:20)<<2)>>2]|0;n=sh(j|0,0,8)|0;j=ph(i>>>1|0,0,n|0,D|0)|0;n=yh(j|0,D|0,i|0,0)|0;x=((S(256-k|0,m&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,k)|0)|0)>>>8&255}a[e+1973+(d*33|0)+21>>0]=x;ab(27956,f+(g*2044|0)+1973+(d*33|0)+22|0,b+16936+(d*204|0)+140|0,e+1973+(d*33|0)+22|0);ab(27956,f+(g*2044|0)+1973+(d*33|0)+25|0,b+16936+(d*204|0)+156|0,e+1973+(d*33|0)+25|0);ab(27956,f+(g*2044|0)+1973+(d*33|0)+28|0,b+16936+(d*204|0)+172|0,e+1973+(d*33|0)+28|0);if(!h){k=a[f+(g*2044|0)+1973+(d*33|0)+31>>0]|0;n=c[b+16936+(d*204|0)+188>>2]|0;m=(c[b+16936+(d*204|0)+192>>2]|0)+n|0;if(!m)y=k;else{i=c[19488+((m>>>0<20?m:20)<<2)>>2]|0;j=sh(n|0,0,8)|0;n=ph(m>>>1|0,0,j|0,D|0)|0;j=yh(n|0,D|0,m|0,0)|0;y=((S(256-i|0,k&255)|0)+128+(S(((255-j|0)>>>23|j)&255|(j|0)==0,i)|0)|0)>>>8&255}a[e+1973+(d*33|0)+31>>0]=y;i=a[f+(g*2044|0)+1973+(d*33|0)+32>>0]|0;j=c[b+16936+(d*204|0)+196>>2]|0;k=(c[b+16936+(d*204|0)+200>>2]|0)+j|0;if(!k)z=i;else{m=c[19488+((k>>>0<20?k:20)<<2)>>2]|0;n=sh(j|0,0,8)|0;j=ph(k>>>1|0,0,n|0,D|0)|0;n=yh(j|0,D|0,k|0,0)|0;z=((S(256-m|0,i&255)|0)+128+(S(((255-n|0)>>>23|n)&255|(n|0)==0,m)|0)|0)>>>8&255}a[e+1973+(d*33|0)+32>>0]=z}d=d+1|0}while((d|0)!=2);return}function Jd(b){b=b|0;var d=0,e=0;d=(c[b+4108>>2]|0)+1970|0;b=28987;e=d+69|0;do{a[d>>0]=a[b>>0]|0;d=d+1|0;b=b+1|0}while((d|0)<(e|0));return}function Kd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+4|0;d=c[b>>2]|0;if((c[a>>2]|0)>0){e=d;f=0;while(1){Wa(c[e+(f*12|0)>>2]|0);g=c[b>>2]|0;c[g+(f*12|0)>>2]=0;f=f+1|0;if((f|0)>=(c[a>>2]|0)){h=g;break}else e=g}}else h=d;Wa(h);c[b>>2]=0;c[a>>2]=16;a=Va(16,12)|0;c[b>>2]=a;return (a|0)==0|0}function Ld(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+4|0;d=c[b>>2]|0;if((c[a>>2]|0)>0){e=d;f=0}else{g=d;Wa(g);c[b>>2]=0;return}while(1){Wa(c[e+(f*12|0)>>2]|0);d=c[b>>2]|0;c[d+(f*12|0)>>2]=0;f=f+1|0;if((f|0)>=(c[a>>2]|0)){g=d;break}else e=d}Wa(g);c[b>>2]=0;return}function Md(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!a){e=-1;return e|0}f=c[a>>2]|0;a:do if((f|0)>0){g=c[a+4>>2]|0;h=0;while(1){if(!(c[g+(h*12|0)+8>>2]|0)){i=h;break a}j=h+1|0;if((j|0)<(f|0))h=j;else{i=j;break}}}else i=0;while(0);if((i|0)==(f|0)){e=-1;return e|0}f=a+4|0;a=c[f>>2]|0;h=c[a+(i*12|0)+4>>2]|0;do if(h>>>0<b>>>0){Wa(c[a+(i*12|0)>>2]|0);g=Va(1,b)|0;j=c[f>>2]|0;c[j+(i*12|0)>>2]=g;if(!g){e=-1;return e|0}else{c[j+(i*12|0)+4>>2]=b;k=j;l=b;break}}else{k=a;l=h}while(0);c[d>>2]=c[k+(i*12|0)>>2];c[d+4>>2]=l;c[k+(i*12|0)+8>>2]=1;c[d+8>>2]=k+(i*12|0);e=0;return e|0}function Nd(a,b){a=a|0;b=b|0;a=c[b+8>>2]|0;if(!a)return 0;c[a+8>>2]=0;return 0}function Od(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+48|0;j=i+16|0;k=i+8|0;m=i;n=c[19572+(h<<3)+4>>2]|0;za[n&7](e,j);za[n&7](e+8|0,j+8|0);za[n&7](e+16|0,j+16|0);za[n&7](e+24|0,j+24|0);e=c[19572+(h<<3)>>2]|0;h=k+2|0;n=k+4|0;o=k+6|0;p=m+2|0;q=g<<1;r=m+4|0;s=g*3|0;t=m+6|0;u=0;do{b[k>>1]=b[j+(u<<1)>>1]|0;b[h>>1]=b[j+(u+4<<1)>>1]|0;b[n>>1]=b[j+(u+8<<1)>>1]|0;b[o>>1]=b[j+(u+12<<1)>>1]|0;za[e&7](k,m);v=f+u|0;w=((b[m>>1]|0)+8>>4)+(d[v>>0]|0)|0;a[v>>0]=(w|0)>255?-1:((w|0)>0?w:0)&255;w=f+(u+g)|0;v=((b[p>>1]|0)+8>>4)+(d[w>>0]|0)|0;a[w>>0]=(v|0)>255?-1:((v|0)>0?v:0)&255;v=f+(q+u)|0;w=((b[r>>1]|0)+8>>4)+(d[v>>0]|0)|0;a[v>>0]=(w|0)>255?-1:((w|0)>0?w:0)&255;w=f+(s+u)|0;v=((b[t>>1]|0)+8>>4)+(d[w>>0]|0)|0;a[w>>0]=(v|0)>255?-1:((v|0)>0?v:0)&255;u=u+1|0}while((u|0)!=4);l=i;return}function Pd(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;i=l;l=l+160|0;j=i+32|0;k=i+16|0;m=i;n=c[19604+(h<<3)>>2]|0;o=c[19604+(h<<3)+4>>2]|0;za[o&7](e,j);za[o&7](e+16|0,j+16|0);za[o&7](e+32|0,j+32|0);za[o&7](e+48|0,j+48|0);za[o&7](e+64|0,j+64|0);za[o&7](e+80|0,j+80|0);za[o&7](e+96|0,j+96|0);za[o&7](e+112|0,j+112|0);e=k+2|0;o=k+4|0;h=k+6|0;p=k+8|0;q=k+10|0;r=k+12|0;s=k+14|0;t=m+2|0;u=g<<1;v=m+4|0;w=g*3|0;x=m+6|0;y=g<<2;z=m+8|0;A=g*5|0;B=m+10|0;C=g*6|0;D=m+12|0;E=g*7|0;F=m+14|0;G=0;do{b[k>>1]=b[j+(G<<1)>>1]|0;b[e>>1]=b[j+(G+8<<1)>>1]|0;b[o>>1]=b[j+(G+16<<1)>>1]|0;b[h>>1]=b[j+(G+24<<1)>>1]|0;b[p>>1]=b[j+(G+32<<1)>>1]|0;b[q>>1]=b[j+(G+40<<1)>>1]|0;b[r>>1]=b[j+(G+48<<1)>>1]|0;b[s>>1]=b[j+(G+56<<1)>>1]|0;za[n&7](k,m);H=f+G|0;I=((b[m>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(G+g)|0;H=((b[t>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;H=f+(u+G)|0;I=((b[v>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(w+G)|0;H=((b[x>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;H=f+(y+G)|0;I=((b[z>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(A+G)|0;H=((b[B>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;H=f+(C+G)|0;I=((b[D>>1]|0)+16>>5)+(d[H>>0]|0)|0;a[H>>0]=(I|0)>255?-1:((I|0)>0?I:0)&255;I=f+(E+G)|0;H=((b[F>>1]|0)+16>>5)+(d[I>>0]|0)|0;a[I>>0]=(H|0)>255?-1:((H|0)>0?H:0)&255;G=G+1|0}while((G|0)!=8);l=i;return}function Qd(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;i=l;l=l+576|0;j=i+64|0;k=i+32|0;m=i;n=c[19636+(h<<3)>>2]|0;o=c[19636+(h<<3)+4>>2]|0;za[o&7](e,j);za[o&7](e+32|0,j+32|0);za[o&7](e+64|0,j+64|0);za[o&7](e+96|0,j+96|0);za[o&7](e+128|0,j+128|0);za[o&7](e+160|0,j+160|0);za[o&7](e+192|0,j+192|0);za[o&7](e+224|0,j+224|0);za[o&7](e+256|0,j+256|0);za[o&7](e+288|0,j+288|0);za[o&7](e+320|0,j+320|0);za[o&7](e+352|0,j+352|0);za[o&7](e+384|0,j+384|0);za[o&7](e+416|0,j+416|0);za[o&7](e+448|0,j+448|0);za[o&7](e+480|0,j+480|0);e=k+2|0;o=k+4|0;h=k+6|0;p=k+8|0;q=k+10|0;r=k+12|0;s=k+14|0;t=k+16|0;u=k+18|0;v=k+20|0;w=k+22|0;x=k+24|0;y=k+26|0;z=k+28|0;A=k+30|0;B=0;do{b[k>>1]=b[j+(B<<1)>>1]|0;b[e>>1]=b[j+(B+16<<1)>>1]|0;b[o>>1]=b[j+(B+32<<1)>>1]|0;b[h>>1]=b[j+(B+48<<1)>>1]|0;b[p>>1]=b[j+(B+64<<1)>>1]|0;b[q>>1]=b[j+(B+80<<1)>>1]|0;b[r>>1]=b[j+(B+96<<1)>>1]|0;b[s>>1]=b[j+(B+112<<1)>>1]|0;b[t>>1]=b[j+(B+128<<1)>>1]|0;b[u>>1]=b[j+(B+144<<1)>>1]|0;b[v>>1]=b[j+(B+160<<1)>>1]|0;b[w>>1]=b[j+(B+176<<1)>>1]|0;b[x>>1]=b[j+(B+192<<1)>>1]|0;b[y>>1]=b[j+(B+208<<1)>>1]|0;b[z>>1]=b[j+(B+224<<1)>>1]|0;b[A>>1]=b[j+(B+240<<1)>>1]|0;za[n&7](k,m);C=0;do{D=f+((S(C,g)|0)+B)|0;E=((b[m+(C<<1)>>1]|0)+32>>6)+(d[D>>0]|0)|0;a[D>>0]=(E|0)>255?-1:((E|0)>0?E:0)&255;C=C+1|0}while((C|0)!=16);B=B+1|0}while((B|0)!=16);l=i;return}function Rd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)>1){Uc(a,b,c);return}else{Vc(a,b,c);return}}function Sd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)>1){Rc(a,b,c);return}else{Sc(a,b,c);return}}function Td(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)==1){Yc(a,b,c);return}if((d|0)<13){$c(a,b,c);return}else{Xc(a,b,c);return}}function Ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)==1){ed(a,b,c);return}if((d|0)<11){dd(a,b,c);return}else{bd(a,b,c);return}}function Vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)==1){jd(a,b,c);return}if((d|0)<35){id(a,b,c);return}if((d|0)<136){hd(a,b,c);return}else{gd(a,b,c);return}}function Wd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(a|0){Od(b,c,d,a);return}if((e|0)>1){Uc(b,c,d);return}else{Vc(b,c,d);return}}function Xd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(a|0){Pd(b,c,d,a);return}if((e|0)==1){Yc(b,c,d);return}if((e|0)<13){$c(b,c,d);return}else{Xc(b,c,d);return}}function Yd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(a|0){Qd(b,c,d,a);return}if((e|0)==1){ed(b,c,d);return}if((e|0)<11){dd(b,c,d);return}else{bd(b,c,d);return}}function Zd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[d+300>>2]|0;f=c[d+296>>2]|0;d=(e|0)!=0;g=(f|0)!=0;if(!(d&g)){if(!(d|g)){h=1;return h|0}g=d?e:f;if((a[g+9>>0]|0)>0){h=3;return h|0}h=(a[g+8>>0]|0)==(a[b+4100>>0]|0)&1;return h|0}g=(a[f+9>>0]|0)>0;if((a[e+9>>0]|0)>0){if(g){h=4;return h|0}d=a[f+8>>0]|0;if(d<<24>>24==(a[b+4100>>0]|0)){h=3;return h|0}h=d<<24>>24>0?2:3;return h|0}d=a[e+8>>0]|0;e=a[b+4100>>0]|0;b=d<<24>>24==e<<24>>24;if(!g){h=(b^(a[f+8>>0]|0)==e<<24>>24)&1;return h|0}if(b){h=3;return h|0}h=d<<24>>24>0?2:3;return h|0}function _d(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=c[d+300>>2]|0;f=c[d+296>>2]|0;d=(e|0)!=0;g=(f|0)!=0;h=a[b+4100>>0]|0;i=(c[b+3924+(h<<24>>24<<2)>>2]|0)==0;j=i&1;if(!(d&g)){if(!(d|g)){k=2;return k|0}g=d?e:f;d=a[g+8>>0]|0;if(d<<24>>24<=0){k=2;return k|0}l=a[b+4102>>0]|0;if((a[g+9>>0]|0)>0){k=((a[g+8+j>>0]|0)!=l<<24>>24&1)<<2;return k|0}else{k=d<<24>>24!=l<<24>>24?3:0;return k|0}}l=(a[e+8>>0]|0)>0;d=(a[f+8>>0]|0)>0;if(!(l|d)){k=2;return k|0}if(!(l&d)){d=l?e:f;k=((a[((a[d+9>>0]|0)>0&i&1)+(d+8)>>0]|0)!=(a[b+4102>>0]|0)&1)<<1|1;return k|0}d=(a[f+9>>0]|0)>0;l=(a[e+9>>0]|0)>0;j=a[(i&l&1)+(e+8)>>0]|0;e=a[(i&d&1)+(f+8)>>0]|0;f=j<<24>>24==e<<24>>24;if(f?(a[b+4102>>0]|0)==j<<24>>24:0){k=0;return k|0}if(d|l){if(d&l){k=f?4:2;return k|0}i=d?e:j;d=l?e:j;l=a[b+4102>>0]|0;if(i<<24>>24!=l<<24>>24?1:d<<24>>24==l<<24>>24)return ((d<<24>>24!=l<<24>>24?1:i<<24>>24==l<<24>>24)?4:2)|0;else{k=1;return k|0}}if(j<<24>>24==h<<24>>24?e<<24>>24==(a[b+4101>>0]|0):0){k=4;return k|0}if(e<<24>>24==h<<24>>24?j<<24>>24==(a[b+4101>>0]|0):0){k=4;return k|0}k=f?3:1;return k|0}function $d(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[b+300>>2]|0;e=c[b+296>>2]|0;b=(d|0)!=0;f=(e|0)!=0;if(!(b&f)){if(!(b|f)){g=2;return g|0}f=b?d:e;b=a[f+8>>0]|0;if(b<<24>>24<=0){g=2;return g|0}h=a[f+9>>0]|0;f=b<<24>>24==1;if(h<<24>>24<=0){g=(f&1)<<2;return g|0}if(f){g=2;return g|0}g=h<<24>>24==1?2:1;return g|0}h=a[d+8>>0]|0;f=h<<24>>24>0;b=a[e+8>>0]|0;i=b<<24>>24>0;if(!(f|i)){g=2;return g|0}if(!(f&i)){i=f?d:e;f=a[i+9>>0]|0;j=(a[i+8>>0]|0)==1;if(f<<24>>24<=0){g=(j&1)<<2;return g|0}if(j){g=2;return g|0}g=f<<24>>24==1?2:1;return g|0}f=a[d+9>>0]|0;d=f<<24>>24>0;j=a[e+9>>0]|0;e=j<<24>>24>0;if(d&e){g=h<<24>>24==1|f<<24>>24==1|b<<24>>24==1|j<<24>>24==1?2:1;return g|0}if(!(d|e)){g=(b<<24>>24==1&1)+(h<<24>>24==1&1)<<1;return g|0}e=(d?h:b)<<24>>24==1?1:(d?f:j)<<24>>24==1;if((d?b:h)<<24>>24==1){g=e?4:3;return g|0}else{g=e&1;return g|0}return 0}function ae(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[b+300>>2]|0;e=c[b+296>>2]|0;b=(d|0)!=0;f=(e|0)!=0;if(!(b&f)){if(!(b|f)){g=2;return g|0}f=b?d:e;b=a[f+8>>0]|0;if(b<<24>>24<=0){g=2;return g|0}h=a[f+9>>0]|0;f=h<<24>>24>0;do if(b<<24>>24==1){if(!f){g=2;return g|0}}else{i=b<<24>>24==2;if(f){if(i)g=3;else break;return g|0}else{g=(i&1)<<2;return g|0}}while(0);g=h<<24>>24==2?3:0;return g|0}h=a[d+8>>0]|0;f=h<<24>>24>0;b=a[e+8>>0]|0;i=b<<24>>24>0;if(!(f|i)){g=2;return g|0}if(!(f&i)){i=f?d:e;f=a[i+9>>0]|0;j=a[i+8>>0]|0;if(f<<24>>24<=0)return (j<<24>>24==1?3:(j<<24>>24==2&1)<<2)|0;g=((j<<24>>24==2|f<<24>>24==2)&1)<<1|1;return g|0}f=a[d+9>>0]|0;d=f<<24>>24>0;j=a[e+9>>0]|0;e=j<<24>>24>0;if(d&e){if(!(h<<24>>24==b<<24>>24?f<<24>>24==j<<24>>24:0)){g=2;return g|0}g=h<<24>>24==2|f<<24>>24==2?3:0;return g|0}if(!(d|e)){e=h<<24>>24==1;i=b<<24>>24==1;if(e&i){g=3;return g|0}if(e|i){g=((e?b:h)<<24>>24==2&1)<<2;return g|0}else{g=(b<<24>>24==2&1)+(h<<24>>24==2&1)<<1;return g|0}}else{e=d?f:j;j=(d?h:b)<<24>>24==2;switch((d?b:h)<<24>>24){case 2:{g=j|e<<24>>24==2?4:3;return g|0}case 3:{g=(j|e<<24>>24==2)&1;return g|0}default:{g=((j|e<<24>>24==2)&1)<<1|1;return g|0}}}return 0}function be(){if(c[8578]|0)return;c[8578]=1;return}function ce(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;h=e<<4;e=c[g>>2]|0;i=((e|0)<0)<<31>>31;j=Ah(e|0,i|0,h|0,((h|0)<0)<<31>>31|0)|0;h=rh(j|0,D|0,14)|0;j=f<<4;f=c[g+4>>2]|0;g=((f|0)<0)<<31>>31;k=Ah(f|0,g|0,j|0,((j|0)<0)<<31>>31|0)|0;j=rh(k|0,D|0,14)|0;k=b[d>>1]|0;l=Ah(k|0,((k|0)<0)<<31>>31|0,f|0,g|0)|0;g=rh(l|0,D|0,14)|0;l=b[d+2>>1]|0;d=Ah(l|0,((l|0)<0)<<31>>31|0,e|0,i|0)|0;i=rh(d|0,D|0,14)|0;c[a>>2]=g+(j&15);c[a+4>>2]=i+(h&15);return}function de(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((d<<4|0)<(f|0)|((b<<4|0)<(e|0)|((e<<1|0)<(b|0)|(f<<1|0)<(d|0)))){c[a>>2]=-1;c[a+4>>2]=-1;return}g=(b<<14|0)/(e|0)|0;c[a>>2]=g;e=(d<<14|0)/(f|0)|0;c[a+4>>2]=e;f=g>>10;c[a+8>>2]=f;d=e>>10;c[a+12>>2]=d;if((g|0)==-1)h=0;else h=(e|0)!=-1&((g|0)!=16384|(e|0)!=16384);c[a+16>>2]=h?18:19;c[a+20>>2]=h?20:19;h=(f|0)==16;f=(d|0)==16;if(h){i=f?5:2;j=f?6:4;k=f?9:10;l=f?3:4;m=f?7:8;n=f?1:2}else{d=f?11:8;e=f?12:10;i=8;j=10;k=e;l=e;m=d;n=d}c[a+24>>2]=n;c[a+28>>2]=l;c[a+32>>2]=i;c[a+36>>2]=j;c[a+40>>2]=m;c[a+44>>2]=k;k=a+48|0;if(h&f){c[k>>2]=13;c[a+52>>2]=14;return}else{c[k>>2]=8;c[a+52>>2]=10;return}}function ee(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;b=Ah(d|0,((d|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=rh(b|0,D|0,14)|0;return a|0}function fe(a,b){a=a|0;b=b|0;return a|0}function ge(a,b){a=a|0;b=b|0;var d=0;d=c[b+4>>2]|0;b=Ah(d|0,((d|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=rh(b|0,D|0,14)|0;return a|0}function he(a){a=a|0;var b=0;b=a+16|0;a=b+100|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+80+(b<<2)|0;c[e>>2]=c[e>>2]|1<<d;return}function je(a){a=a|0;return c[19684+(a<<2)>>2]|0}function ke(a){a=a|0;return c[19700+(a<<2)>>2]|0}function le(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[a+16+(c<<3)+(d<<1)>>1]=e;return}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+600>>2]|0;f=c[b+17372>>2]|0;b=e+7>>3;g=(S(b,d)|0)>>f<<3;c[a>>2]=(g|0)<(e|0)?g:e;g=(S(b,d+1|0)|0)>>f<<3;c[a+4>>2]=(g|0)<(e|0)?g:e;return}function ne(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+608>>2]|0;f=c[b+17368>>2]|0;b=e+7>>3;g=(S(b,d)|0)>>f<<3;c[a+8>>2]=(g|0)<(e|0)?g:e;g=(S(b,d+1|0)|0)>>f<<3;c[a+12>>2]=(g|0)<(e|0)?g:e;return}function oe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c[b+600>>2]|0;g=c[b+17372>>2]|0;h=f+7>>3;i=(S(h,d)|0)>>g<<3;c[a>>2]=(i|0)<(f|0)?i:f;i=(S(h,d+1|0)|0)>>g<<3;c[a+4>>2]=(i|0)<(f|0)?i:f;f=c[b+608>>2]|0;i=c[b+17368>>2]|0;b=f+7>>3;g=(S(b,e)|0)>>i<<3;c[a+8>>2]=(g|0)<(f|0)?g:f;g=(S(b,e+1|0)|0)>>i<<3;c[a+12>>2]=(g|0)<(f|0)?g:f;return}function pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+7>>3;a=0;while(1)if((64<<a|0)<(e|0))a=a+1|0;else break;c[b>>2]=a;a=1;while(1)if((e>>a|0)>3)a=a+1|0;else break;c[d>>2]=a+-1;return}function qe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+3948|0;d=c[b>>2]|0;e=(d|0)>0;f=(e&1)+((d|0)>4&1)|0;g=9-d|0;if(e){e=0;do{d=e>>f;h=(d|0)>(g|0)?g:d;d=(h|0)>1?h:1;qh(a+784+(e*48|0)+16|0,d&255|0,16)|0;qh(a+784+(e*48|0)|0,(e<<1)+4+d&255|0,16)|0;e=e+1|0}while((e|0)!=64)}else{e=0;do{g=e>>f;d=(g|0)>1?g:1;qh(a+784+(e*48|0)+16|0,d&255|0,16)|0;qh(a+784+(e*48|0)|0,(e<<1)+4+d&255|0,16)|0;e=e+1|0}while((e|0)!=64)}c[a+3952>>2]=c[b>>2];b=0;do{qh(a+784+(b*48|0)+32|0,b>>>4&255|0,16)|0;b=b+1|0}while((b|0)!=64);return}function re(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=e>>5;g=d+3952|0;h=d+3948|0;i=c[h>>2]|0;if((c[g>>2]|0)!=(i|0)){j=(i|0)>0;k=(j&1)+((i|0)>4&1)|0;l=9-i|0;if(j){j=0;do{i=j>>k;m=(i|0)>(l|0)?l:i;i=(m|0)>1?m:1;qh(d+784+(j*48|0)+16|0,i&255|0,16)|0;qh(d+784+(j*48|0)|0,(j<<1)+4+i&255|0,16)|0;j=j+1|0}while((j|0)!=64)}else{j=0;do{l=j>>k;i=(l|0)>1?l:1;qh(d+784+(j*48|0)+16|0,i&255|0,16)|0;qh(d+784+(j*48|0)|0,(j<<1)+4+i&255|0,16)|0;j=j+1|0}while((j|0)!=64)}c[g>>2]=c[h>>2]}h=d+3980|0;g=d+3956|0;j=d+3958|0;k=d+3983|0;i=d+3959|0;l=d+3966|0;m=d+3967|0;n=d+3960|0;o=d+3961|0;p=0;do{if((a[h>>0]|0)!=0?(c[d+4060+(p<<2)>>2]&2|0)!=0:0){q=((a[k>>0]|0)==1?0:e)+(b[d+3996+(p<<3)+2>>1]|0)|0;r=(q|0)<0?0:(q|0)<63?q:63}else r=e;if(!(a[g>>0]|0))qh(d+3856+(p<<3)|0,r&255|0,8)|0;else{q=(a[j>>0]<<f)+r|0;a[d+3856+(p<<3)>>0]=(q|0)<0?0:((q|0)<63?q:63)&255;q=(a[i>>0]<<f)+r|0;s=a[l>>0]<<f;t=q+s|0;a[d+3856+(p<<3)+2>>0]=(t|0)<0?0:((t|0)<63?t:63)&255;t=a[m>>0]<<f;u=q+t|0;a[d+3856+(p<<3)+3>>0]=(u|0)<0?0:((u|0)<63?u:63)&255;u=(a[n>>0]<<f)+r|0;q=u+s|0;a[d+3856+(p<<3)+4>>0]=(q|0)<0?0:((q|0)<63?q:63)&255;q=u+t|0;a[d+3856+(p<<3)+5>>0]=(q|0)<0?0:((q|0)<63?q:63)&255;q=(a[o>>0]<<f)+r|0;u=q+s|0;a[d+3856+(p<<3)+6>>0]=(u|0)<0?0:((u|0)<63?u:63)&255;u=q+t|0;a[d+3856+(p<<3)+7>>0]=(u|0)<0?0:((u|0)<63?u:63)&255}p=p+1|0}while((p|0)!=8);return}function se(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0;h=g+24|0;i=g+16|0;j=i;k=c[j>>2]|c[h>>2];l=c[j+4>>2]|c[h+4>>2];h=i;c[h>>2]=k;c[h+4>>2]=l;h=g+56|0;j=g+48|0;m=j;n=c[m>>2]|c[h>>2];o=c[m+4>>2]|c[h+4>>2];h=j;c[h>>2]=n;c[h+4>>2]=o;h=g+76|0;m=b[h>>1]|b[g+78>>1];b[h>>1]=m;p=g+84|0;q=b[p>>1]|b[g+86>>1];b[p>>1]=q;r=g;s=c[r>>2]|0;t=c[r+4>>2]|0;r=g+8|0;u=r;v=c[u>>2]|s&286331153;w=c[u+4>>2]|t&286331153;u=r;c[u>>2]=v;c[u+4>>2]=w;u=s&-286331154;s=t&-286331154;t=g;c[t>>2]=u;c[t+4>>2]=s;t=g+32|0;x=t;y=c[x>>2]|0;z=c[x+4>>2]|0;x=g+40|0;A=x;B=c[A>>2]|y&255;C=c[A+4>>2]|z&255;A=x;c[A>>2]=B;c[A+4>>2]=C;A=y&-256;y=z&-256;z=t;c[z>>2]=A;c[z+4>>2]=y;z=g+72|0;E=e[z>>1]|0;F=g+74|0;G=e[F>>1]|0|E&4369;H=G&65535;b[F>>1]=H;I=E&61166;E=I&65535;b[z>>1]=E;J=g+80|0;K=e[J>>1]|0;L=g+82|0;M=e[L>>1]|0|K&15;b[L>>1]=M;N=K&65520;b[J>>1]=N;K=c[a+600>>2]|0;a:do if((d+8|0)>(K|0)){O=K-d|0;P=((O|0)<0)<<31>>31;Q=sh(O|0,P|0,3)|0;R=sh(1,0,Q|0)|0;Q=ph(R|0,D|0,-1,-1)|0;R=D;S=ph(O|0,P|0,1,0)|0;P=rh(S|0,D|0,1)|0;S=sh(P|0,D|0,2)|0;P=(1<<S)+65535|0;S=u&Q;T=s&R;U=g;c[U>>2]=S;c[U+4>>2]=T;U=A&Q;V=y&R;W=t;c[W>>2]=U;c[W+4>>2]=V;W=I&P&65535;b[z>>1]=W;X=N&P;b[J>>1]=X;Y=v&Q;Z=w&R;_=r;c[_>>2]=Y;c[_+4>>2]=Z;_=B&Q;$=C&R;aa=x;c[aa>>2]=_;c[aa+4>>2]=$;aa=G&P&65535;b[F>>1]=aa;ba=M&P;b[L>>1]=ba;ca=k&Q;da=l&R;ea=i;c[ea>>2]=ca;c[ea+4>>2]=da;ea=n&Q;fa=o&R;ga=j;c[ga>>2]=ea;c[ga+4>>2]=fa;ga=m&65535&P&65535;b[h>>1]=ga;ha=q&65535&P;ia=ha&65535;b[p>>1]=ia;ja=g+64|0;ka=ja;la=c[ka+4>>2]&R;R=ja;c[R>>2]=c[ka>>2]&Q;c[R+4>>2]=la;la=g+88|0;b[la>>1]=(e[la>>1]|0)&P;switch(O|0){case 1:{O=ba|ha;b[L>>1]=O;b[p>>1]=0;ma=S;na=T;oa=U;pa=V;qa=W;ra=X;sa=Y;ta=Z;ua=_;va=$;wa=aa;xa=O;ya=ca;za=da;Aa=ea;Ba=fa;Ca=ga;Da=0;break a;break}case 5:{O=ba|ha&65280;b[L>>1]=O;P=((ha|255)^65280)&ha&65535;b[p>>1]=P;ma=S;na=T;oa=U;pa=V;qa=W;ra=X;sa=Y;ta=Z;ua=_;va=$;wa=aa;xa=O;ya=ca;za=da;Aa=ea;Ba=fa;Ca=ga;Da=P;break a;break}default:{ma=S;na=T;oa=U;pa=V;qa=W;ra=X;sa=Y;ta=Z;ua=_;va=$;wa=aa;xa=ba;ya=ca;za=da;Aa=ea;Ba=fa;Ca=ga;Da=ia;break a}}}else{ma=u;na=s;oa=A;pa=y;qa=E;ra=N;sa=v;ta=w;ua=B;va=C;wa=H;xa=M;ya=k;za=l;Aa=n;Ba=o;Ca=m;Da=q}while(0);q=c[a+608>>2]|0;b:do if((f+8|0)>(q|0)){a=q-f|0;m=((a|0)<0)<<31>>31;o=(1<<a)+-1|0;n=Ah(o|0,((o|0)<0)<<31>>31|0,16843009,16843009)|0;o=D;l=ph(a|0,m|0,1,0)|0;k=rh(l|0,D|0,1)|0;l=(4369<<k)+61167|0;k=rh(a|0,m|0,1)|0;m=ma&n;M=na&o;H=g;c[H>>2]=m;c[H+4>>2]=M;H=t;c[H>>2]=oa&n;c[H+4>>2]=pa&o;H=qa&65535&l&65535;b[z>>1]=H;b[J>>1]=ra&l;C=sa&n;B=ta&o;w=r;c[w>>2]=C;c[w+4>>2]=B;w=x;c[w>>2]=ua&n;c[w+4>>2]=va&o;w=wa&65535&l;v=w&65535;b[F>>1]=v;b[L>>1]=xa&l;N=ya&n;E=za&o;y=i;c[y>>2]=N;c[y+4>>2]=E;y=j;c[y>>2]=Aa&n;c[y+4>>2]=Ba&o;y=Ca&65535&l;A=y&65535;b[h>>1]=A;b[p>>1]=Da&65535&l;l=g+64|0;s=l;u=c[s+4>>2]&o;o=l;c[o>>2]=c[s>>2]&n;c[o+4>>2]=u;u=g+88|0;b[u>>1]=(e[u>>1]|0)&(4369<<k)+61167;switch(a|0){case 1:{a=(w|y)&65535;b[F>>1]=a;b[h>>1]=0;Ea=m;Fa=M;Ga=H;Ha=C;Ia=B;Ja=a;Ka=N;La=E;Ma=0;break b;break}case 5:{a=(w|y&52428)&65535;b[F>>1]=a;w=((y|13107)^52428)&y&65535;b[h>>1]=w;Ea=m;Fa=M;Ga=H;Ha=C;Ia=B;Ja=a;Ka=N;La=E;Ma=w;break b;break}default:{Ea=m;Fa=M;Ga=H;Ha=C;Ia=B;Ja=v;Ka=N;La=E;Ma=A;break b}}}else{Ea=ma;Fa=na;Ga=qa;Ha=sa;Ia=ta;Ja=wa;Ka=ya;La=za;Ma=Ca}while(0);if(f|0)return;f=g;c[f>>2]=Ea&-16843010;c[f+4>>2]=Fa&-16843010;b[z>>1]=Ga&-4370;Ga=r;c[Ga>>2]=Ha&-16843010;c[Ga+4>>2]=Ia&-16843010;b[F>>1]=Ja&-4370;Ja=i;c[Ja>>2]=Ka&-16843010;c[Ja+4>>2]=La&-16843010;b[h>>1]=Ma&-4370;return}function te(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0;i=l;l=l+192|0;j=i+96|0;k=i+64|0;m=i+32|0;n=i;o=i+128|0;p=e+4|0;q=c[p>>2]|0;r=e+8|0;s=c[r>>2]|0;t=1<<s;u=1<<q;v=c[b+612>>2]<<s;w=e+12|0;x=c[w>>2]|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;c[k+28>>2]=0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;c[m+28>>2]=0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;c[n+28>>2]=0;y=b+600|0;z=b+608|0;A=(s|0)==0;B=~((h|0)==0);C=e+16|0;e=x;D=(q|0)!=0;E=A^1;F=e;G=f;f=0;while(1){H=f+g|0;I=c[y>>2]|0;if((H|0)>=(I|0))break;J=f<<3;K=n+(f<<2)|0;L=(f>>s&3|0)==0;M=k+(f<<2)|0;N=j+(f<<2)|0;O=(f&t|0)==0;P=c[z>>2]|0;Q=P+-1|0;R=(H|0)==(I+-1|0)&E;I=R?M:N;H=R?M:N;N=0;M=0;R=0;S=0;while(1){T=N+h|0;if((T|0)>=(P|0)){U=M;V=R;W=S;break}X=c[G+(N<<2)>>2]|0;if(!(a[X+3>>0]|0))Y=0;else Y=(a[X+8>>0]|0)>0;Z=d[X>>0]|0;if((d[29208+Z>>0]|0)>1)_=((d[29234+Z>>0]|0)+-1&N|0)==0&1;else _=1;$=Y&(_|0)==0;if((d[29221+Z>>0]|0)>1)aa=((d[29247+Z>>0]|0)+-1&f|0)==0&1;else aa=1;ba=Y&(aa|0)==0;ca=a[(c[r>>2]|0)+(29382+(Z<<4)+(d[X+2>>0]<<2)+(c[p>>2]<<1))>>0]|0;Z=(T|0)==(Q|0)&D;T=a[(c[19716+(d[X+1>>0]<<2)>>2]|0)+(b+3856+(a[X+4>>0]<<3)+(a[X+8>>0]<<1))>>0]|0;X=N>>q;a[o+(X+J)>>0]=T;a:do if(!(T<<24>>24)){da=M;ea=R;fa=S}else switch(ca<<24>>24){case 3:{do if((X&3|0)==0&($^1)){ga=1<<X;if(Z){ha=M;ia=ga|S;break}else{ha=ga|M;ia=S;break}}else{ha=M;ia=S}while(0);if(ba|L^1){da=ha;ea=R;fa=ia;break a}c[I>>2]=c[I>>2]|1<<X;da=ha;ea=R;fa=ia;break a;break}case 2:{do if((X&1|0)==0&($^1)){ga=1<<X;if(Z){ja=M;ka=ga|S;break}else{ja=ga|M;ka=S;break}}else{ja=M;ka=S}while(0);if(ba|O^1){da=ja;ea=R;fa=ka;break a}c[H>>2]=c[H>>2]|1<<X;da=ja;ea=R;fa=ka;break a;break}default:{do if(!$){ga=1<<X;if((X&3|0)==0|ca<<24>>24==1){la=R;ma=ga|S;break}else{la=ga|R;ma=S;break}}else{la=R;ma=S}while(0);if(!ba){ga=(L|ca<<24>>24==1?k:m)+(f<<2)|0;c[ga>>2]=c[ga>>2]|1<<X}if(Y|(ca<<24>>24!=0|Z)){da=M;ea=la;fa=ma;break a}c[K>>2]=c[K>>2]|1<<X;da=M;ea=la;fa=ma;break a}}while(0);N=N+u|0;if((N|0)>=8){U=da;V=ea;W=fa;break}else{M=da;R=ea;S=fa}}S=c[C>>2]|0;R=U&B;M=W&B;N=V&B;L=c[K>>2]|0;H=M|N|R|L;if(!H){na=S;oa=F}else{O=o+J|0;I=H;H=R;R=N;N=L;L=M;M=F;while(1){Q=d[O>>0]|0;P=b+784+(Q*48|0)|0;do if(I&1|0){if(H&1|0){Oc(M,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0);break}if(L&1|0){Ic(M,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0);break}if(R&1|0)Dc(M,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0)}while(0);if(N&1|0)Dc(M+4|0,S,P,b+784+(Q*48|0)+16|0,b+784+(Q*48|0)+32|0);I=I>>>1;if(!I)break;else{O=O+1|0;H=H>>>1;R=R>>>1;N=N>>>1;L=L>>>1;M=M+8|0}}na=c[C>>2]|0;oa=c[w>>2]|0}F=oa+(na<<3)|0;c[w>>2]=F;f=f+t|0;if((f|0)>=8)break;else G=G+(v<<2)|0}c[w>>2]=x;x=b+784|0;if(A){A=e;b=0;while(1){v=b+g|0;if((v|0)>=(c[y>>2]|0)){pa=59;break}if(!v){qa=0;ra=0;sa=0}else{qa=c[j+(b<<2)>>2]|0;ra=c[m+(b<<2)>>2]|0;sa=c[k+(b<<2)>>2]|0}ue(A,c[C>>2]|0,qa,sa,ra,c[n+(b<<2)>>2]|0,x,o+(b<<3)|0);A=(c[w>>2]|0)+(c[C>>2]<<3)|0;c[w>>2]=A;b=b+t|0;if((b|0)>=8){pa=59;break}}if((pa|0)==59){l=i;return}}else{ta=e;ua=0}while(1){e=ua+g|0;b=c[y>>2]|0;if((e|0)>=(b|0)){pa=59;break}if((e|0)==(b+-1|0))va=0;else va=c[n+(ua<<2)>>2]|0;if(!e){wa=0;xa=0;ya=0}else{wa=c[j+(ua<<2)>>2]|0;xa=c[m+(ua<<2)>>2]|0;ya=c[k+(ua<<2)>>2]|0}ue(ta,c[C>>2]|0,wa,ya,xa,va,x,o+(ua<<3)|0);ta=(c[w>>2]|0)+(c[C>>2]<<3)|0;c[w>>2]=ta;ua=ua+t|0;if((ua|0)>=8){pa=59;break}}if((pa|0)==59){l=i;return}}function ue(a,b,c,e,f,g,h,i){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=e|c|f|g;if(!j)return;k=b<<2;l=i;i=j;j=c;c=f;f=g;g=e;e=a;while(1){do if(i&1){a=d[l>>0]|0;m=h+(a*48|0)|0;if(j&1|0){n=h+(a*48|0)+16|0;o=h+(a*48|0)+32|0;if((j&3|0)==3){Nc(e,b,m,n,o);p=2;break}else{Kc(e,b,m,n,o);p=1;break}}if(g&1|0){if((g&3|0)!=3){o=h+(a*48|0)+16|0;n=h+(a*48|0)+32|0;Fc(e,b,m,o,n);if(!(f&1)){p=1;break}Bc(e+k|0,b,m,o,n);p=1;break}n=d[l+1>>0]|0;o=h+(a*48|0)+16|0;q=h+(a*48|0)+32|0;r=h+(n*48|0)|0;s=h+(n*48|0)+16|0;t=h+(n*48|0)+32|0;Hc(e,b,m,o,q,r,s,t);if((f&3|0)==3){Cc(e+k|0,b,m,o,q,r,s,t);p=2;break}if(f&1|0){Bc(e+k|0,b,m,o,q);p=2;break}if(!(f&2)){p=2;break}Bc(e+8+k|0,b,r,s,t);p=2;break}if(!(c&1)){Bc(e+k|0,b,m,h+(a*48|0)+16|0,h+(a*48|0)+32|0);p=1;break}if((c&3|0)!=3){t=h+(a*48|0)+16|0;s=h+(a*48|0)+32|0;Bc(e,b,m,t,s);if(!(f&1)){p=1;break}Bc(e+k|0,b,m,t,s);p=1;break}s=d[l+1>>0]|0;t=h+(a*48|0)+16|0;r=h+(a*48|0)+32|0;a=h+(s*48|0)|0;q=h+(s*48|0)+16|0;o=h+(s*48|0)+32|0;Cc(e,b,m,t,r,a,q,o);if((f&3|0)==3){Cc(e+k|0,b,m,t,r,a,q,o);p=2;break}if(f&1|0){Bc(e+k|0,b,m,t,r);p=2;break}if(!(f&2))p=2;else{Bc(e+8+k|0,b,a,q,o);p=2}}else p=1;while(0);i=i>>>p;if(!i)break;else{l=l+p|0;j=j>>>p;c=c>>>p;f=f>>>p;g=g>>>p;e=e+(p<<3)|0}}return}function ve(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;f=b+12|0;g=c[f>>2]|0;h=e+16|0;i=c[h>>2]|0;j=c[h+4>>2]|0;h=e+8|0;k=c[h>>2]|0;l=c[h+4>>2]|0;h=e;m=c[h>>2]|0;n=c[h+4>>2]|0;h=e+64|0;o=h;p=c[o>>2]|0;q=c[o+4>>2]|0;o=a+600|0;r=b+4|0;s=b+16|0;b=a+784|0;a=g;if((((c[o>>2]|0)>(d|0)?(we(c[r>>2]|0,a,c[s>>2]|0,i,k,m,p,b,e+90|0),t=c[s>>2]|0,u=(c[f>>2]|0)+(t<<4)|0,c[f>>2]=u,(d+2|0)<(c[o>>2]|0)):0)?(v=rh(p|0,q|0,16)|0,w=rh(m|0,n|0,16)|0,x=rh(k|0,l|0,16)|0,y=rh(i|0,j|0,16)|0,we(c[r>>2]|0,u,t,y,x,w,v,b,e+106|0),v=c[s>>2]|0,w=(c[f>>2]|0)+(v<<4)|0,c[f>>2]=w,(d+4|0)<(c[o>>2]|0)):0)?(we(c[r>>2]|0,w,v,j,l,n,q,b,e+122|0),v=c[s>>2]|0,w=(c[f>>2]|0)+(v<<4)|0,c[f>>2]=w,(d+6|0)<(c[o>>2]|0)):0){x=rh(p|0,q|0,48)|0;q=rh(m|0,n|0,48)|0;n=rh(k|0,l|0,48)|0;l=rh(i|0,j|0,48)|0;we(c[r>>2]|0,w,v,l,n,q,x,b,e+138|0);c[f>>2]=(c[f>>2]|0)+(c[s>>2]<<4)}c[f>>2]=g;g=e+48|0;x=e+40|0;q=e+32|0;n=h;h=c[g>>2]|0;l=c[x>>2]|0;v=c[q>>2]|0;w=c[n>>2]|0;r=a;a=c[g+4>>2]|0;g=c[x+4>>2]|0;x=c[q+4>>2]|0;q=c[n+4>>2]|0;n=0;while(1){j=n+d|0;if((j|0)>=(c[o>>2]|0)){z=8;break}if(!j){A=0;B=0;C=0}else{A=h&255;B=v&255;C=l&255}ue(r,c[s>>2]|0,A,C,B,w&255,b,(n<<3)+(e+90)|0);r=(c[f>>2]|0)+(c[s>>2]<<3)|0;c[f>>2]=r;h=rh(h|0,a|0,8)|0;a=D;l=rh(l|0,g|0,8)|0;g=D;v=rh(v|0,x|0,8)|0;x=D;w=rh(w|0,q|0,8)|0;n=n+1|0;if((n|0)>=8){z=8;break}else q=D}if((z|0)==8)return}function we(a,b,e,f,g,h,i,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;m=l;l=l+16|0;n=m+8|0;o=m;p=(a|0)!=0;a=p?4:8;q=1<<a;r=q|1;c[n>>2]=b;s=(g|f|h|i)&(p?255:65535);if(!s){l=m;return}p=q^-2;q=o+4|0;t=e<<3;u=n+4|0;v=b;b=k;k=s;s=f;f=h;h=i;i=g;while(1){if(k&r|0){g=d[b>>0]|0;w=j+(g*48|0)|0;c[o>>2]=w;x=d[b+a>>0]|0;y=j+(x*48|0)|0;c[q>>2]=y;c[u>>2]=v+t;z=s&r;do if(z|0)if((z|0)==(r|0)){Qc(v,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0);break}else{A=s&1^1;B=c[o+(A<<2)>>2]|0;Oc(c[n+(A<<2)>>2]|0,e,B,B+16|0,B+32|0);break}while(0);z=i&r;do if(z|0)if((z|0)==(r|0)){Jc(v,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0,y,j+(x*48|0)+16|0,j+(x*48|0)+32|0);break}else{B=i&1^1;A=c[o+(B<<2)>>2]|0;Ic(c[n+(B<<2)>>2]|0,e,A,A+16|0,A+32|0);break}while(0);z=f&r;do if(z|0)if((z|0)==(r|0)){Ec(v,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0,y,j+(x*48|0)+16|0,j+(x*48|0)+32|0);break}else{A=f&1^1;B=c[o+(A<<2)>>2]|0;Dc(c[n+(A<<2)>>2]|0,e,B,B+16|0,B+32|0);break}while(0);z=h&r;do if(z|0)if((z|0)==(r|0)){Ec(v+4|0,e,w,j+(g*48|0)+16|0,j+(g*48|0)+32|0,y,j+(x*48|0)+16|0,j+(x*48|0)+32|0);break}else{B=h&1^1;A=c[o+(B<<2)>>2]|0;Dc((c[n+(B<<2)>>2]|0)+4|0,e,A,A+16|0,A+32|0);break}while(0)}v=v+8|0;c[n>>2]=v;k=(k&p)>>>1;if(!k)break;else{b=b+1|0;s=s>>>1;f=f>>>1;h=h>>>1;i=i>>>1}}l=m;return}function xe(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=l;l=l+16|0;i=h;j=e+12|0;k=c[j>>2]|0;m=b[g+76>>1]|0;n=b[g+74>>1]|0;o=b[g+72>>1]|0;p=g+88|0;q=b[p>>1]|0;r=d+600|0;s=e+4|0;t=e+16|0;e=d+784|0;d=k;if((c[r>>2]|0)>(f|0)?(a[i>>0]=a[g+90>>0]|0,a[i+4>>0]=a[g+106>>0]|0,a[i+1>>0]=a[g+92>>0]|0,a[i+5>>0]=a[g+108>>0]|0,a[i+2>>0]=a[g+94>>0]|0,a[i+6>>0]=a[g+110>>0]|0,a[i+3>>0]=a[g+96>>0]|0,a[i+7>>0]=a[g+112>>0]|0,we(c[s>>2]|0,d,c[t>>2]|0,m&65535,n&65535,o&65535,q&65535,e,i),u=c[t>>2]|0,v=(c[j>>2]|0)+(u<<4)|0,c[j>>2]=v,(f+4|0)<(c[r>>2]|0)):0){w=i+8|0;a[w>>0]=a[g+122>>0]|0;a[i+12>>0]=a[g+138>>0]|0;a[i+9>>0]=a[g+124>>0]|0;a[i+13>>0]=a[g+140>>0]|0;a[i+10>>0]=a[g+126>>0]|0;a[i+14>>0]=a[g+142>>0]|0;a[i+11>>0]=a[g+128>>0]|0;a[i+15>>0]=a[g+144>>0]|0;we(c[s>>2]|0,v,u,(m&65535)>>>8&65535,(n&65535)>>>8&65535,(o&65535)>>>8&65535,(q&65535)>>>8&65535,e,w);c[j>>2]=(c[j>>2]|0)+(c[t>>2]<<4)}c[j>>2]=k;k=d;d=b[g+84>>1]|0;w=b[g+80>>1]|0;q=b[p>>1]|0;p=b[g+82>>1]|0;g=0;while(1){o=g+f|0;n=c[r>>2]|0;if((o|0)>=(n|0)){x=6;break}m=(o|0)==0;ue(k,c[t>>2]|0,m?0:d&15,m?0:p&15,m?0:w&15,(o|0)==(n+-1|0)?0:q&15,e,i+(g<<1)|0);k=(c[j>>2]|0)+(c[t>>2]<<3)|0;c[j>>2]=k;g=g+2|0;if((g|0)>=8){x=6;break}else{d=(d&65535)>>>4;w=(w&65535)>>>4;q=(q&65535)>>>4;p=(p&65535)>>>4}}if((x|0)==6){l=h;return}}function ye(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=(g|0)!=0;g=h?1:3;a:do if(h)i=1;else{switch(c[d+96>>2]|0){case 1:{if((c[d+92>>2]|0)==1){i=0;break a}break}case 0:{if(!(c[d+92>>2]|0)){i=1;break a}break}default:{}}i=2}while(0);if((e|0)>=(f|0))return;j=b+736|0;k=b+612|0;l=b+3972|0;m=b+3976|0;n=b+608|0;o=(i&3)==2;p=c[n>>2]|0;q=e;while(1){e=(c[j>>2]|0)+((S(c[k>>2]|0,q)|0)<<2)|0;if((p|0)>0){r=(c[l>>2]|0)+((S(c[m>>2]|0,q>>3)|0)*160|0)|0;s=0;while(1){Me(d,a,q,s);se(b,q,s,r);ve(b,d,q,r);if(!h){t=e+(s<<2)|0;switch(i&3){case 0:{u=1;do{xe(b,d+(u*88|0)|0,q,r);u=u+1|0}while((u|0)<(g|0));break}case 1:{u=1;do{ve(b,d+(u*88|0)|0,q,r);u=u+1|0}while((u|0)<(g|0));break}default:{u=1;do{if(o)te(b,d+(u*88|0)|0,t,q,s);u=u+1|0}while((u|0)<(g|0))}}}s=s+8|0;u=c[n>>2]|0;if((s|0)>=(u|0)){v=u;break}else r=r+160|0}}else v=p;q=q+8|0;if((q|0)>=(f|0))break;else p=v}return}function ze(f,g,h,i,j,k){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;l=a[g+2>>0]|0;m=g+8|0;n=a[(c[19716+(d[g+1>>0]<<2)>>2]|0)+(f+3856+(a[g+4>>0]<<3)+(a[m>>0]<<1))>>0]|0;o=d[g>>0]|0;p=l&255;q=a[29382+(o<<4)+(p<<2)+3>>0]|0;r=c[f+3972>>2]|0;s=(S(c[f+3976>>2]|0,h>>3)|0)+(i>>3)|0;f=r+(s*160|0)+(p<<3)|0;t=r+(s*160|0)+32+(p<<3)|0;u=r+(s*160|0)+64|0;v=q&255;w=r+(s*160|0)+72+(v<<1)|0;x=r+(s*160|0)+80+(v<<1)|0;y=r+(s*160|0)+88|0;z=h&7;h=i&7;i=h|z<<3;A=h>>>1|z>>>1<<2;B=a[29070+(z<<3)+h>>0]|0;if(!(n<<24>>24))return;if((k|0)>0){h=0;z=i;while(1){qh(r+(s*160|0)+90+z|0,n|0,j|0)|0;h=h+1|0;if((h|0)==(k|0))break;else z=z+8|0}}z=19088+(o<<3)|0;k=sh(c[z>>2]|0,c[z+4>>2]|0,i|0)|0;z=t;h=c[z+4>>2]|D;j=t;c[j>>2]=c[z>>2]|k;c[j+4>>2]=h;h=19192+(o<<3)|0;j=sh(c[h>>2]|0,c[h+4>>2]|0,i|0)|0;h=f;k=c[h+4>>2]|D;z=f;c[z>>2]=c[h>>2]|j;c[z+4>>2]=k;k=B<<24>>24!=0;if(k){b[x>>1]=e[x>>1]|e[21740+(o<<1)>>1]<<A;b[w>>1]=e[w>>1]|e[21766+(o<<1)>>1]<<A}if(a[g+3>>0]|0?(a[m>>0]|0)>0:0)return;m=19296+(o<<3)|0;g=c[m>>2]|0;B=c[m+4>>2]|0;m=19400+(p<<3)|0;z=sh(c[m>>2]&g|0,c[m+4>>2]&B|0,i|0)|0;m=t;j=D|c[m+4>>2];h=t;c[h>>2]=z|c[m>>2];c[h+4>>2]=j;j=19432+(p<<3)|0;p=sh(c[j>>2]&g|0,c[j+4>>2]&B|0,i|0)|0;j=f;h=D|c[j+4>>2];m=f;c[m>>2]=p|c[j>>2];c[m+4>>2]=h;if(k){h=b[21792+(o<<1)>>1]|0;b[x>>1]=(b[21818+(v<<1)>>1]&h&65535)<<A|e[x>>1];b[w>>1]=(b[21826+(v<<1)>>1]&h&65535)<<A|e[w>>1]}if(!(l<<24>>24)){l=sh(g|0,B|0,i|0)|0;i=u;B=c[i+4>>2]|D;g=u;c[g>>2]=c[i>>2]|l;c[g+4>>2]=B}if(!(q<<24>>24==0&k))return;b[y>>1]=e[y>>1]|e[21792+(o<<1)>>1]<<A;return}function Ae(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+272>>2]=0;c[a+276>>2]=0;c[a+280>>2]=0;vh(a+8|0,e|0,264)|0;return}function Be(a){a=a|0;if(!(c[a+3940>>2]|0))return;qh(c[a+3972>>2]|0,0,S((c[a+3976>>2]|0)*160|0,(c[a+600>>2]|0)+7>>3)|0)|0;return}function Ce(a,b){a=a|0;b=b|0;ye(c[a>>2]|0,c[a+4>>2]|0,a+8|0,c[a+272>>2]|0,c[a+276>>2]|0,c[a+280>>2]|0);return 1}function De(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;k=l;l=l+16|0;m=k+8|0;n=k;if(!e){l=k;return}o=b+600|0;p=c[o>>2]|0;if((g|0)!=0&(p|0)>8){q=(p|0)>71?p>>>3:8;r=p>>>1&2147483640}else{q=p;r=0}p=q+r|0;re(b,e);e=rd()|0;q=(c[o>>2]|0)+7>>3;o=1<<c[b+17368>>2];g=(o|0)>(i|0)?i:o;o=j+4|0;i=j+8|0;if(((c[o>>2]|0)!=0?(q|0)==(c[i>>2]|0):0)?(g|0)<=(c[j+16>>2]|0):0){s=j;t=q<<2}else{u=j+12|0;Wa(c[u>>2]|0);Wa(c[j>>2]|0);c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;v=c[b+256>>2]|0;c[i>>2]=q;i=Ua(g*284|0)|0;c[u>>2]=i;if(!i)Sa(b,2,29134,n);c[j+16>>2]=g;n=q<<2;q=Ua(n)|0;c[j>>2]=q;if(!q)Sa(b,2,29169,m);c[o>>2]=(v|0)<640?1:(v|0)<1281?2:(v|0)<4097?4:8;s=j;t=n}qh(c[s>>2]|0,-1,t|0)|0;if((g|0)<=0){l=k;return}t=j+12|0;s=g+-1|0;n=e+16|0;v=e+12|0;o=0;do{m=h+(o*24|0)|0;q=c[t>>2]|0;i=q+(o*284|0)|0;c[h+(o*24|0)+8>>2]=21;c[h+(o*24|0)+12>>2]=j;c[h+(o*24|0)+16>>2]=i;Ae(i,a,b,d);c[q+(o*284|0)+272>>2]=(o<<3)+r;c[q+(o*284|0)+276>>2]=p;c[q+(o*284|0)+280>>2]=f;if((o|0)==(s|0))ya[c[n>>2]&15](m);else ya[c[v>>2]&15](m);o=o+1|0}while((o|0)<(g|0));o=e+8|0;e=0;do{Aa[c[o>>2]&7](h+(e*24|0)|0)|0;e=e+1|0}while((e|0)<(g|0));l=k;return}function Ee(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=c[b>>2]|0;e=c[b+4>>2]|0;f=b+8|0;g=c[b+272>>2]|0;h=c[b+276>>2]|0;i=(c[b+280>>2]|0)!=0;j=i?1:3;k=e+608|0;a:do if(i)l=1;else{switch(c[b+104>>2]|0){case 1:{if((c[b+100>>2]|0)==1){l=0;break a}break}case 0:{if(!(c[b+100>>2]|0)){l=1;break a}break}default:{}}l=2}while(0);if((g|0)>=(h|0))return 1;m=e+736|0;n=e+612|0;o=e+3972|0;p=e+3976|0;q=a+16|0;a=c[k>>2]|0;r=g;while(1){g=(c[m>>2]|0)+((S(c[n>>2]|0,r)|0)<<2)|0;b:do if((a|0)>0){s=(c[o>>2]|0)+((S(c[p>>2]|0,r>>3)|0)*160|0)|0;if(i){t=s;u=0;while(1){Me(f,d,r,u);se(e,r,u,t);ve(e,f,r,t);u=u+8|0;v=c[k>>2]|0;if((u|0)>=(v|0)){w=v;break b}else t=t+160|0}}else{x=s;y=0}while(1){Me(f,d,r,y);se(e,r,y,x);ve(e,f,r,x);t=g+(y<<2)|0;switch(l&3){case 0:{u=1;do{xe(e,b+8+(u*88|0)|0,r,x);u=u+1|0}while((u|0)<(j|0));break}case 1:{u=1;do{ve(e,b+8+(u*88|0)|0,r,x);u=u+1|0}while((u|0)<(j|0));break}case 2:{u=1;do{te(e,b+8+(u*88|0)|0,t,r,y);u=u+1|0}while((u|0)<(j|0));break}default:{}}y=y+8|0;u=c[k>>2]|0;if((y|0)>=(u|0)){w=u;break b}else x=x+160|0}}else w=a;while(0);r=(c[q>>2]<<3)+r|0;if((r|0)>=(h|0))break;else a=w}return 1}function Fe(a){a=a|0;if(!a)return;Wa(c[a+12>>2]|0);Wa(c[a>>2]|0);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;return}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=0;do{f=a+(e*40|0)|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)>>2]|0);f=a+(e*40|0)+4|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+4>>2]|0);f=a+(e*40|0)+8|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+8>>2]|0);f=a+(e*40|0)+12|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+12>>2]|0);f=a+(e*40|0)+16|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+16>>2]|0);f=a+(e*40|0)+20|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+20>>2]|0);f=a+(e*40|0)+24|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+24>>2]|0);f=a+(e*40|0)+28|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+28>>2]|0);f=a+(e*40|0)+32|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+32>>2]|0);f=a+(e*40|0)+36|0;c[f>>2]=(c[f>>2]|0)+(c[b+(e*40|0)+36>>2]|0);e=e+1|0}while((e|0)!=4);g=0;do{e=a+160+(g*40|0)|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)>>2]|0);e=a+160+(g*40|0)+4|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+4>>2]|0);e=a+160+(g*40|0)+8|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+8>>2]|0);e=a+160+(g*40|0)+12|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+12>>2]|0);e=a+160+(g*40|0)+16|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+16>>2]|0);e=a+160+(g*40|0)+20|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+20>>2]|0);e=a+160+(g*40|0)+24|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+24>>2]|0);e=a+160+(g*40|0)+28|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+28>>2]|0);e=a+160+(g*40|0)+32|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+32>>2]|0);e=a+160+(g*40|0)+36|0;c[e>>2]=(c[e>>2]|0)+(c[b+160+(g*40|0)+36>>2]|0);g=g+1|0}while((g|0)!=10);h=0;do{g=a+560+(h<<4)|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)>>2]|0);g=a+560+(h<<4)+4|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)+4>>2]|0);g=a+560+(h<<4)+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)+8>>2]|0);g=a+560+(h<<4)+12|0;c[g>>2]=(c[g>>2]|0)+(c[b+560+(h<<4)+12>>2]|0);h=h+1|0}while((h|0)!=16);if(!d){d=0;do{h=0;do{g=0;do{e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+4|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+4>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+8|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+8>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+12|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+12>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+16|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+16>>2]|0);e=a+10032+(d*576|0)+(h*288|0)+(g*24|0)+20|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+(g*24|0)+20>>2]|0);g=g+1|0}while((g|0)!=6);i=0;do{g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+4|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+4>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+8>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+12|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+12>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+16|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+16>>2]|0);g=a+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+20|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(h*288|0)+144+(i*24|0)+20>>2]|0);i=i+1|0}while((i|0)!=6);h=h+1|0}while((h|0)!=2);d=d+1|0}while((d|0)!=4)}else{d=0;do{i=0;do{h=0;do{g=0;do{e=a+10032+(d*576|0)+(i*288|0)+(h*24|0)+(g<<2)|0;c[e>>2]=(c[e>>2]|0)+(c[b+10032+(d*576|0)+(i*288|0)+(h*24|0)+(g<<2)>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+4|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+4>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+8|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+8>>2]|0);e=a+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+12|0;c[e>>2]=(c[e>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+(h*96|0)+(g<<4)+12>>2]|0);g=g+1|0}while((g|0)!=6);h=h+1|0}while((h|0)!=6);j=0;do{h=0;do{g=a+10032+(d*576|0)+(i*288|0)+144+(j*24|0)+(h<<2)|0;c[g>>2]=(c[g>>2]|0)+(c[b+10032+(d*576|0)+(i*288|0)+144+(j*24|0)+(h<<2)>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+4|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+4>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+8>>2]|0);g=a+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+12|0;c[g>>2]=(c[g>>2]|0)+(c[b+816+(d*2304|0)+(i*1152|0)+576+(j*96|0)+(h<<4)+12>>2]|0);h=h+1|0}while((h|0)!=6);j=j+1|0}while((j|0)!=6);i=i+1|0}while((i|0)!=2);d=d+1|0}while((d|0)!=4)}d=a+12336|0;c[d>>2]=(c[d>>2]|0)+(c[b+12336>>2]|0);d=a+12340|0;c[d>>2]=(c[d>>2]|0)+(c[b+12340>>2]|0);d=a+12344|0;c[d>>2]=(c[d>>2]|0)+(c[b+12344>>2]|0);d=a+12348|0;c[d>>2]=(c[d>>2]|0)+(c[b+12348>>2]|0);d=a+12352|0;c[d>>2]=(c[d>>2]|0)+(c[b+12352>>2]|0);d=a+12356|0;c[d>>2]=(c[d>>2]|0)+(c[b+12356>>2]|0);d=a+12360|0;c[d>>2]=(c[d>>2]|0)+(c[b+12360>>2]|0);d=a+12364|0;c[d>>2]=(c[d>>2]|0)+(c[b+12364>>2]|0);d=a+12368|0;c[d>>2]=(c[d>>2]|0)+(c[b+12368>>2]|0);d=a+12372|0;c[d>>2]=(c[d>>2]|0)+(c[b+12372>>2]|0);d=a+12376|0;c[d>>2]=(c[d>>2]|0)+(c[b+12376>>2]|0);d=a+12380|0;c[d>>2]=(c[d>>2]|0)+(c[b+12380>>2]|0);d=0;do{j=a+12384+(d<<4)|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)>>2]|0);j=a+12384+(d<<4)+4|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)+4>>2]|0);j=a+12384+(d<<4)+8|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)+8>>2]|0);j=a+12384+(d<<4)+12|0;c[j>>2]=(c[j>>2]|0)+(c[b+12384+(d<<4)+12>>2]|0);d=d+1|0}while((d|0)!=7);d=a+12496|0;c[d>>2]=(c[d>>2]|0)+(c[b+12496>>2]|0);d=a+12500|0;c[d>>2]=(c[d>>2]|0)+(c[b+12500>>2]|0);d=a+12504|0;c[d>>2]=(c[d>>2]|0)+(c[b+12504>>2]|0);d=a+12508|0;c[d>>2]=(c[d>>2]|0)+(c[b+12508>>2]|0);d=a+12512|0;c[d>>2]=(c[d>>2]|0)+(c[b+12512>>2]|0);d=a+12516|0;c[d>>2]=(c[d>>2]|0)+(c[b+12516>>2]|0);d=a+12520|0;c[d>>2]=(c[d>>2]|0)+(c[b+12520>>2]|0);d=a+12524|0;c[d>>2]=(c[d>>2]|0)+(c[b+12524>>2]|0);d=a+12528|0;c[d>>2]=(c[d>>2]|0)+(c[b+12528>>2]|0);d=a+12532|0;c[d>>2]=(c[d>>2]|0)+(c[b+12532>>2]|0);d=a+12536|0;c[d>>2]=(c[d>>2]|0)+(c[b+12536>>2]|0);d=a+12540|0;c[d>>2]=(c[d>>2]|0)+(c[b+12540>>2]|0);d=a+12544|0;c[d>>2]=(c[d>>2]|0)+(c[b+12544>>2]|0);d=a+12548|0;c[d>>2]=(c[d>>2]|0)+(c[b+12548>>2]|0);d=a+12552|0;c[d>>2]=(c[d>>2]|0)+(c[b+12552>>2]|0);d=a+12556|0;c[d>>2]=(c[d>>2]|0)+(c[b+12556>>2]|0);d=a+12560|0;c[d>>2]=(c[d>>2]|0)+(c[b+12560>>2]|0);d=a+12564|0;c[d>>2]=(c[d>>2]|0)+(c[b+12564>>2]|0);d=a+12568|0;c[d>>2]=(c[d>>2]|0)+(c[b+12568>>2]|0);d=a+12572|0;c[d>>2]=(c[d>>2]|0)+(c[b+12572>>2]|0);d=a+12576|0;c[d>>2]=(c[d>>2]|0)+(c[b+12576>>2]|0);d=a+12580|0;c[d>>2]=(c[d>>2]|0)+(c[b+12580>>2]|0);d=a+12584|0;c[d>>2]=(c[d>>2]|0)+(c[b+12584>>2]|0);d=a+12588|0;c[d>>2]=(c[d>>2]|0)+(c[b+12588>>2]|0);d=a+12592|0;c[d>>2]=(c[d>>2]|0)+(c[b+12592>>2]|0);d=a+12596|0;c[d>>2]=(c[d>>2]|0)+(c[b+12596>>2]|0);d=a+12600|0;c[d>>2]=(c[d>>2]|0)+(c[b+12600>>2]|0);d=a+12604|0;c[d>>2]=(c[d>>2]|0)+(c[b+12604>>2]|0);d=a+12608|0;c[d>>2]=(c[d>>2]|0)+(c[b+12608>>2]|0);d=a+12612|0;c[d>>2]=(c[d>>2]|0)+(c[b+12612>>2]|0);d=a+12616|0;c[d>>2]=(c[d>>2]|0)+(c[b+12616>>2]|0);d=a+12620|0;c[d>>2]=(c[d>>2]|0)+(c[b+12620>>2]|0);d=a+12624|0;c[d>>2]=(c[d>>2]|0)+(c[b+12624>>2]|0);d=a+12628|0;c[d>>2]=(c[d>>2]|0)+(c[b+12628>>2]|0);d=a+12632|0;c[d>>2]=(c[d>>2]|0)+(c[b+12632>>2]|0);d=a+12636|0;c[d>>2]=(c[d>>2]|0)+(c[b+12636>>2]|0);d=a+12640|0;c[d>>2]=(c[d>>2]|0)+(c[b+12640>>2]|0);d=a+12644|0;c[d>>2]=(c[d>>2]|0)+(c[b+12644>>2]|0);d=a+12648|0;c[d>>2]=(c[d>>2]|0)+(c[b+12648>>2]|0);d=a+12652|0;c[d>>2]=(c[d>>2]|0)+(c[b+12652>>2]|0);d=a+12656|0;c[d>>2]=(c[d>>2]|0)+(c[b+12656>>2]|0);d=a+12660|0;c[d>>2]=(c[d>>2]|0)+(c[b+12660>>2]|0);d=a+12664|0;c[d>>2]=(c[d>>2]|0)+(c[b+12664>>2]|0);d=a+12668|0;c[d>>2]=(c[d>>2]|0)+(c[b+12668>>2]|0);d=a+12672|0;c[d>>2]=(c[d>>2]|0)+(c[b+12672>>2]|0);d=a+12676|0;c[d>>2]=(c[d>>2]|0)+(c[b+12676>>2]|0);d=a+12680|0;c[d>>2]=(c[d>>2]|0)+(c[b+12680>>2]|0);d=a+12684|0;c[d>>2]=(c[d>>2]|0)+(c[b+12684>>2]|0);d=a+12688|0;c[d>>2]=(c[d>>2]|0)+(c[b+12688>>2]|0);d=a+12692|0;c[d>>2]=(c[d>>2]|0)+(c[b+12692>>2]|0);d=a+12696|0;c[d>>2]=(c[d>>2]|0)+(c[b+12696>>2]|0);d=a+12700|0;c[d>>2]=(c[d>>2]|0)+(c[b+12700>>2]|0);d=a+12720|0;c[d>>2]=(c[d>>2]|0)+(c[b+12720>>2]|0);d=a+12724|0;c[d>>2]=(c[d>>2]|0)+(c[b+12724>>2]|0);d=a+12728|0;c[d>>2]=(c[d>>2]|0)+(c[b+12728>>2]|0);d=a+12744|0;c[d>>2]=(c[d>>2]|0)+(c[b+12744>>2]|0);d=a+12748|0;c[d>>2]=(c[d>>2]|0)+(c[b+12748>>2]|0);d=a+12704|0;c[d>>2]=(c[d>>2]|0)+(c[b+12704>>2]|0);d=a+12708|0;c[d>>2]=(c[d>>2]|0)+(c[b+12708>>2]|0);d=a+12712|0;c[d>>2]=(c[d>>2]|0)+(c[b+12712>>2]|0);d=a+12716|0;c[d>>2]=(c[d>>2]|0)+(c[b+12716>>2]|0);d=a+12732|0;c[d>>2]=(c[d>>2]|0)+(c[b+12732>>2]|0);d=a+12736|0;c[d>>2]=(c[d>>2]|0)+(c[b+12736>>2]|0);d=a+12740|0;c[d>>2]=(c[d>>2]|0)+(c[b+12740>>2]|0);d=a+12752|0;c[d>>2]=(c[d>>2]|0)+(c[b+12752>>2]|0);d=a+12756|0;c[d>>2]=(c[d>>2]|0)+(c[b+12756>>2]|0);d=a+12760|0;c[d>>2]=(c[d>>2]|0)+(c[b+12760>>2]|0);d=a+12764|0;c[d>>2]=(c[d>>2]|0)+(c[b+12764>>2]|0);d=a+12768|0;c[d>>2]=(c[d>>2]|0)+(c[b+12768>>2]|0);d=a+12772|0;c[d>>2]=(c[d>>2]|0)+(c[b+12772>>2]|0);d=a+12776|0;c[d>>2]=(c[d>>2]|0)+(c[b+12776>>2]|0);d=a+12780|0;c[d>>2]=(c[d>>2]|0)+(c[b+12780>>2]|0);d=a+12784|0;c[d>>2]=(c[d>>2]|0)+(c[b+12784>>2]|0);d=a+12788|0;c[d>>2]=(c[d>>2]|0)+(c[b+12788>>2]|0);d=a+12792|0;c[d>>2]=(c[d>>2]|0)+(c[b+12792>>2]|0);d=a+12796|0;c[d>>2]=(c[d>>2]|0)+(c[b+12796>>2]|0);d=a+12800|0;c[d>>2]=(c[d>>2]|0)+(c[b+12800>>2]|0);d=a+12804|0;c[d>>2]=(c[d>>2]|0)+(c[b+12804>>2]|0);d=a+12808|0;c[d>>2]=(c[d>>2]|0)+(c[b+12808>>2]|0);d=a+12812|0;c[d>>2]=(c[d>>2]|0)+(c[b+12812>>2]|0);d=0;do{j=a+12816+(d*204|0)|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)>>2]|0);j=a+12816+(d*204|0)+188|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+188>>2]|0);j=a+12816+(d*204|0)+196|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+196>>2]|0);j=a+12816+(d*204|0)+4|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+4>>2]|0);j=a+12816+(d*204|0)+192|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+192>>2]|0);j=a+12816+(d*204|0)+200|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+200>>2]|0);j=a+12816+(d*204|0)+8|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+8>>2]|0);j=a+12816+(d*204|0)+12|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+12>>2]|0);j=a+12816+(d*204|0)+16|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+16>>2]|0);j=a+12816+(d*204|0)+20|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+20>>2]|0);j=a+12816+(d*204|0)+24|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+24>>2]|0);j=a+12816+(d*204|0)+28|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+28>>2]|0);j=a+12816+(d*204|0)+32|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+32>>2]|0);j=a+12816+(d*204|0)+36|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+36>>2]|0);j=a+12816+(d*204|0)+40|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+40>>2]|0);j=a+12816+(d*204|0)+44|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+44>>2]|0);j=a+12816+(d*204|0)+48|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+48>>2]|0);j=a+12816+(d*204|0)+52|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+52>>2]|0);j=a+12816+(d*204|0)+140|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+140>>2]|0);j=a+12816+(d*204|0)+144|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+144>>2]|0);j=a+12816+(d*204|0)+148|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+148>>2]|0);j=a+12816+(d*204|0)+152|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+152>>2]|0);j=a+12816+(d*204|0)+56|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+56>>2]|0);j=a+12816+(d*204|0)+156|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+156>>2]|0);j=a+12816+(d*204|0)+160|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+160>>2]|0);j=a+12816+(d*204|0)+164|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+164>>2]|0);j=a+12816+(d*204|0)+168|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+168>>2]|0);j=a+12816+(d*204|0)+60|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+60>>2]|0);j=a+12816+(d*204|0)+64|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+64>>2]|0);j=a+12816+(d*204|0)+68|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+68>>2]|0);j=a+12816+(d*204|0)+72|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+72>>2]|0);j=a+12816+(d*204|0)+76|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+76>>2]|0);j=a+12816+(d*204|0)+80|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+80>>2]|0);j=a+12816+(d*204|0)+84|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+84>>2]|0);j=a+12816+(d*204|0)+88|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+88>>2]|0);j=a+12816+(d*204|0)+92|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+92>>2]|0);j=a+12816+(d*204|0)+96|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+96>>2]|0);j=a+12816+(d*204|0)+100|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+100>>2]|0);j=a+12816+(d*204|0)+104|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+104>>2]|0);j=a+12816+(d*204|0)+108|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+108>>2]|0);j=a+12816+(d*204|0)+112|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+112>>2]|0);j=a+12816+(d*204|0)+116|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+116>>2]|0);j=a+12816+(d*204|0)+120|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+120>>2]|0);j=a+12816+(d*204|0)+124|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+124>>2]|0);j=a+12816+(d*204|0)+128|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+128>>2]|0);j=a+12816+(d*204|0)+132|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+132>>2]|0);j=a+12816+(d*204|0)+136|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+136>>2]|0);j=a+12816+(d*204|0)+172|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+172>>2]|0);j=a+12816+(d*204|0)+176|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+176>>2]|0);j=a+12816+(d*204|0)+180|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+180>>2]|0);j=a+12816+(d*204|0)+184|0;c[j>>2]=(c[j>>2]|0)+(c[b+12816+(d*204|0)+184>>2]|0);d=d+1|0}while((d|0)!=2);return}function He(a,c,d){a=a|0;c=c|0;d=d|0;d=c+a|0;return b[21834+(((d|0)<0?0:(d|0)<255?d:255)<<1)>>1]|0}function Ie(a,c,d){a=a|0;c=c|0;d=d|0;d=c+a|0;return b[22346+(((d|0)<0?0:(d|0)<255?d:255)<<1)>>1]|0}function Je(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0;if(!(a[d>>0]|0)){g=f;return g|0}if(!(c[d+80+(e<<2)>>2]&1)){g=f;return g|0}h=((a[d+3>>0]|0)==1?0:f)+(b[d+16+(e<<3)>>1]|0)|0;g=(h|0)<0?0:(h|0)<255?h:255;return g|0}function Ke(a,d,e,f,g,h,i){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0;j=f<<4;f=g<<4;g=1-i|0;i=1-h|0;h=-64-j+(c[d+316>>2]<<i)|0;k=j+48+(c[d+320>>2]<<i)|0;j=-64-f+(c[d+324>>2]<<g)|0;l=f+48+(c[d+328>>2]<<g)|0;d=b[e+2>>1]<<i<<16>>16;i=b[e>>1]<<g<<16>>16;g=((i|0)<(j|0)?j:(i|0)>(l|0)?l:i)&65535|((d|0)<(h|0)?h:(d|0)>(k|0)?k:d)<<16;b[a>>1]=g;b[a+2>>1]=g>>>16;return}function Le(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;switch((((c[d+4>>2]|0)>0&1)<<1|(c[d+8>>2]|0)>0)&3){case 0:{d=f+20+(h*12|0)+4+(g<<2)|0;i=e[d>>1]|e[d+2>>1]<<16;b[a>>1]=i;b[a+2>>1]=i>>>16;return}case 1:{d=f+20+(h*12|0)+4+(g<<2)|0;j=f+20+((h+2|0)*12|0)+4+(g<<2)|0;k=(b[j>>1]|0)+(b[d>>1]|0)|0;l=(b[j+2>>1]|0)+(b[d+2>>1]|0)|0;i=(((l>>31|1)+l|0)/2|0)<<16|(((k>>31|1)+k|0)/2|0)&65535;b[a>>1]=i;b[a+2>>1]=i>>>16;return}case 2:{k=f+20+(h*12|0)+4+(g<<2)|0;l=f+20+((h+1|0)*12|0)+4+(g<<2)|0;h=(b[l>>1]|0)+(b[k>>1]|0)|0;d=(b[l+2>>1]|0)+(b[k+2>>1]|0)|0;i=(((d>>31|1)+d|0)/2|0)<<16|(((h>>31|1)+h|0)/2|0)&65535;b[a>>1]=i;b[a+2>>1]=i>>>16;return}case 3:{h=f+24+(g<<2)|0;d=f+36+(g<<2)|0;k=f+48+(g<<2)|0;l=f+60+(g<<2)|0;g=(b[d>>1]|0)+(b[h>>1]|0)+(b[k>>1]|0)+(b[l>>1]|0)|0;f=(b[d+2>>1]|0)+(b[h+2>>1]|0)+(b[k+2>>1]|0)+(b[l+2>>1]|0)|0;i=(((f>>31&-4|2)+f|0)/4|0)<<16|(((g>>31&-4|2)+g|0)/4|0)&65535;b[a>>1]=i;b[a+2>>1]=i>>>16;return}default:{}}}function Me(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=c[b+56>>2]|0;g=c[b+60>>2]|0;h=c[b+16>>2]|0;i=c[b+36>>2]|0;j=e<<3;e=d<<3;c[a+12>>2]=(c[b+52>>2]|0)+((S(e>>c[a+8>>2],h)|0)+(j>>c[a+4>>2]));c[a+16>>2]=h;c[a+100>>2]=f+((S(e>>c[a+96>>2],i)|0)+(j>>c[a+92>>2]));c[a+104>>2]=i;c[a+188>>2]=g+((S(e>>c[a+184>>2],i)|0)+(j>>c[a+180>>2]));c[a+192>>2]=i;return}function Ne(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!d)return;h=c[d+52>>2]|0;i=c[d+56>>2]|0;j=c[d+60>>2]|0;k=c[d+16>>2]|0;l=c[d+36>>2]|0;d=f<<3;f=e<<3;e=g+16|0;m=g+20|0;n=d>>c[a+4>>2];o=f>>c[a+8>>2];if(!g){c[a+20+(b<<3)>>2]=h+((S(o,k)|0)+n);c[a+20+(b<<3)+4>>2]=k;c[a+108+(b<<3)>>2]=i+((S(f>>c[a+96>>2],l)|0)+(d>>c[a+92>>2]));c[a+108+(b<<3)+4>>2]=l;p=d>>c[a+180>>2];q=f>>c[a+184>>2]}else{r=Ea[c[e>>2]&31](n,g)|0;c[a+20+(b<<3)>>2]=h+((S(Ea[c[m>>2]&31](o,g)|0,k)|0)+r);c[a+20+(b<<3)+4>>2]=k;k=f>>c[a+96>>2];r=Ea[c[e>>2]&31](d>>c[a+92>>2],g)|0;c[a+108+(b<<3)>>2]=i+((S(Ea[c[m>>2]&31](k,g)|0,l)|0)+r);c[a+108+(b<<3)+4>>2]=l;r=f>>c[a+184>>2];f=Ea[c[e>>2]&31](d>>c[a+180>>2],g)|0;p=f;q=Ea[c[m>>2]&31](r,g)|0}c[a+196+(b<<3)>>2]=j+((S(q,l)|0)+p);c[a+196+(b<<3)+4>>2]=l;return}\nfunction Oe(b,d,e,f,g,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;o=l;l=l+112|0;p=o+80|0;q=o;r=e&255;if(!m)s=(c[b+300>>2]|0)!=0;else s=1;t=s&1;if(!k)u=(c[b+296>>2]|0)!=0;else u=1;v=u&1;w=((1<<r)+k|0)<(1<<d|0);d=q+16|0;x=4<<r;y=(n|0)==0;z=c[b+344>>2]|0;A=c[(y?z:z+20|0)>>2]|0;B=c[(y?z+4|0:z+24|0)>>2]|0;z=(0-(c[b+316>>2]|0)>>(c[b+(n*88|0)+4>>2]|0)+3)+(k<<2)|0;k=(0-(c[b+324>>2]|0)>>(c[b+(n*88|0)+8>>2]|0)+3)+(m<<2)|0;m=f&255;a:do if(757>>>m&1|0){if(!u){qh(p|0,-127,x|0)|0;break}if((c[b+328>>2]|0)>=0){if((x|0)>0)C=0;else break;while(1){a[p+C>>0]=a[g+((S(C,h)|0)+-1)>>0]|0;C=C+1|0;if((C|0)==(x|0))break a}}if((k+x|0)<=(B|0)){if((x|0)>0)D=0;else break;while(1){a[p+D>>0]=a[g+((S(D,h)|0)+-1)>>0]|0;D=D+1|0;if((D|0)==(x|0))break a}}n=B-k|0;if((n|0)>0){y=0;do{a[p+y>>0]=a[g+((S(y,h)|0)+-1)>>0]|0;y=y+1|0}while((y|0)!=(n|0));E=n}else E=0;if((x|0)>(E|0))qh(p+E|0,a[g+((S(n+-1|0,h)|0)+-1)>>0]|0,x-E|0)|0}while(0);if(!(627>>>m&1))F=d;else{do if(s){E=g+(0-h)|0;do if((c[b+320>>2]|0)<0){k=z+x|0;if((k|0)<=(A|0)){vh(d|0,E|0,x|0)|0;G=27;break}B=A-z|0;if((A|0)<(z|0))G=27;else{vh(d|0,E|0,B|0)|0;qh(d+B|0,a[d+(B+-1)>>0]|0,k-A|0)|0;G=27}}else if(e<<24>>24==0&w&u)H=E;else{vh(d|0,E|0,x|0)|0;G=27}while(0);if((G|0)==27)if(u)H=d;else{I=-127;J=d;break}I=a[E+-1>>0]|0;J=H}else{qh(d|0,127,x|0)|0;I=127;J=d}while(0);a[q+15>>0]=I;F=J}switch(f<<24>>24){case 3:case 8:{G=32;break}case 0:{Ga[c[34316+(v<<5)+(t<<4)+(r<<2)>>2]&63](i,j,F,p);l=o;return}default:K=F}if((G|0)==32){do if(s){t=g+(0-h)|0;do if((c[b+320>>2]|0)<0){v=x<<1;f=z+v|0;if((f|0)<=(A|0))if(e<<24>>24==0&w){vh(d|0,t|0,v|0)|0;G=48;break}else{vh(d|0,t|0,x|0)|0;qh(d+x|0,a[d+(x+-1)>>0]|0,x|0)|0;G=48;break}if((z+x|0)>(A|0)){v=A-z|0;if((A|0)<(z|0)){G=48;break}vh(d|0,t|0,v|0)|0;qh(d+v|0,a[d+(v+-1)>>0]|0,f-A|0)|0;G=48;break}v=A-z|0;if(e<<24>>24==0&w){vh(d|0,t|0,v|0)|0;qh(d+v|0,a[d+(v+-1)>>0]|0,f-A|0)|0;G=48;break}else{vh(d|0,t|0,x|0)|0;qh(d+x|0,a[d+(x+-1)>>0]|0,x|0)|0;G=48;break}}else{f=e<<24>>24==0&w;if(!(f&u)){vh(d|0,t|0,x|0)|0;v=d+x|0;if(f){vh(v|0,t+x|0,x|0)|0;G=48;break}else{qh(v|0,a[d+(x+-1)>>0]|0,x|0)|0;G=48;break}}else L=t}while(0);if((G|0)==48)if(u)L=F;else{M=-127;N=F;break}M=a[t+-1>>0]|0;N=L}else{qh(d|0,127,x<<1|0)|0;M=127;N=F}while(0);a[q+15>>0]=M;K=N}Ga[c[34380+(m<<4)+(r<<2)>>2]&63](i,j,K,p);l=o;return}function Pe(){if(c[8635]|0)return;c[8599]=1;c[8600]=2;c[8601]=3;c[8602]=4;c[8603]=5;c[8604]=6;c[8605]=7;c[8606]=8;c[8623]=9;c[8624]=10;c[8625]=11;c[8626]=12;c[8607]=13;c[8608]=14;c[8609]=15;c[8610]=16;c[8627]=17;c[8628]=18;c[8629]=19;c[8630]=20;c[8615]=21;c[8616]=22;c[8617]=23;c[8618]=24;c[8611]=25;c[8612]=26;c[8613]=27;c[8614]=28;c[8619]=29;c[8620]=30;c[8621]=31;c[8622]=32;c[8631]=33;c[8632]=34;c[8633]=35;c[8634]=36;c[8579]=37;c[8580]=38;c[8581]=39;c[8582]=40;c[8583]=41;c[8584]=42;c[8585]=43;c[8586]=44;c[8587]=45;c[8588]=46;c[8589]=47;c[8590]=48;c[8591]=49;c[8592]=50;c[8593]=51;c[8594]=52;c[8635]=1;return}function Qe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;b=a+24|0;if(c[b>>2]|0){d=0;return d|0}e=Va(1,1080)|0;if(!e){d=2;return d|0}c[b>>2]=e;b=c[a+16>>2]|0;c[e+4>>2]=b;c[e+196>>2]=16;c[e+344>>2]=0;f=a+20|0;a=c[f>>2]|0;if(!a){c[e+364>>2]=0;d=0;return d|0}else{c[e+364>>2]=(b&524288|0)!=0&(c[a>>2]|0)>>>0>1&1;b=e+184|0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[f>>2]=b;d=0;return d|0}return 0}function Re(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a+368|0;d=c[b>>2]|0;if(d|0?(e=a+372|0,(c[e>>2]|0)>0):0){ya[c[(rd()|0)+20>>2]&15](d);d=c[e>>2]|0;if((d|0)>1){f=1;do{g=(c[b>>2]|0)+(f*24|0)|0;ya[c[(rd()|0)+20>>2]&15](g);f=f+1|0;g=c[e>>2]|0}while((f|0)<(g|0));h=g}else h=d;if((h|0)>0){h=0;do{d=c[(c[b>>2]|0)+(h*24|0)+12>>2]|0;xd((c[d>>2]|0)+432|0);Uf(c[d>>2]|0);Wa(c[d+32>>2]|0);Wa(d);h=h+1|0}while((h|0)<(c[e>>2]|0))}}e=a+1056|0;h=c[e>>2]|0;if(!h){i=c[b>>2]|0;Wa(i);j=c[e>>2]|0;Wa(j);Wa(a);return 0}vd(h);Ld((c[e>>2]|0)+2412|0);i=c[b>>2]|0;Wa(i);j=c[e>>2]|0;Wa(j);Wa(a);return 0}function Se(a,b,c){a=a|0;b=b|0;c=c|0;return _e(a,b,c,0,0,0)|0}function Te(a,b){a=a|0;b=b|0;var d=0;d=a+196|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b>>2]=16;return 0}function Ue(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;g=l;l=l+64|0;h=g;i=g+48|0;j=g+40|0;k=g+44|0;m=g+8|0;n=g+4|0;c[j>>2]=d;o=d;c[k>>2]=o;p=d+e|0;q=b+344|0;if((e|0)==0&(d|0)==0){c[q>>2]=1;r=0;l=g;return r|0}c[q>>2]=0;s=b+368|0;if(!(c[s>>2]|0)){t=rd()|0;c[b+352>>2]=-1;c[b+376>>2]=0;c[b+380>>2]=0;c[b+384>>2]=0;c[b+1044>>2]=0;c[b+1040>>2]=0;c[b+1048>>2]=0;c[b+1052>>2]=1;u=b+364|0;if((c[u>>2]|0)==1)v=c[b+184>>2]|0;else v=1;w=b+372|0;x=(v|0)<8?v:8;c[w>>2]=x;c[b+388>>2]=x;c[q>>2]=0;q=Va(1,2420)|0;x=b+1056|0;c[x>>2]=q;if(!q){r=2;l=g;return r|0}q=Ua((c[w>>2]|0)*24|0)|0;c[s>>2]=q;if(!q){c[b>>2]=29661;r=2;l=g;return r|0}v=c[w>>2]|0;a:do if((v|0)>0){y=b+184|0;z=b+348|0;A=t+4|0;ya[c[t>>2]&15](q);B=Ta(32,48)|0;c[q+12>>2]=B;b:do if(B|0){C=q;D=q;E=B;F=0;while(1){G=Tf(c[x>>2]|0)|0;c[E>>2]=G;if(!G){H=15;break}c[G+17872>>2]=D;c[E+24>>2]=F;I=E+28|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;I=c[u>>2]|0;if(!I)J=c[y>>2]|0;else J=0;c[G+18712>>2]=J;c[G+18716>>2]=c[z>>2];c[G+17864>>2]=I;c[G+4528>>2]=I;c[C+(F*24|0)+8>>2]=22;F=F+1|0;if(!(Aa[c[A>>2]&7](D)|0)){H=19;break}I=c[w>>2]|0;if((F|0)>=(I|0)){K=I;break a}C=c[s>>2]|0;D=C+(F*24|0)|0;ya[c[t>>2]&15](D);E=Ta(32,48)|0;c[C+(F*24|0)+12>>2]=E;if(!E)break b}if((H|0)==15){c[b>>2]=29694;r=2;l=g;return r|0}else if((H|0)==19){c[b>>2]=29731;r=2;l=g;return r|0}}while(0);c[b>>2]=29694;r=2;l=g;return r|0}else K=v;while(0);if((c[b+212>>2]|0)==0?c[b+4>>2]&65536|0:0){c[b+216>>2]=3;c[b+220>>2]=4;c[b+224>>2]=0}if((K|0)>0){v=b+356|0;t=b+360|0;J=b+1064|0;u=b+1068|0;x=b+1060|0;q=K;K=0;while(1){A=c[c[(c[s>>2]|0)+(K*24|0)+12>>2]>>2]|0;z=c[A+17836>>2]|0;c[A+988>>2]=-1;c[A+17808>>2]=c[v>>2];c[A+17812>>2]=c[t>>2];y=c[J>>2]|0;if((y|0)!=0?(B=c[u>>2]|0,(B|0)!=0):0){c[z+4>>2]=y;c[z+8>>2]=B;L=c[x>>2]|0;M=q}else{c[z+4>>2]=5;c[z+8>>2]=23;B=z+2412|0;if(Kd(B)|0)Sa(A+432|0,2,29767,h);L=B;M=c[w>>2]|0}c[z>>2]=L;K=K+1|0;if((K|0)>=(M|0))break;else q=M}}}M=b+228|0;q=b+232|0;K=ag(d,e,m,n,c[M>>2]|0,c[q>>2]|0)|0;if(K|0){r=K;l=g;return r|0}if(c[b+1072>>2]|0){K=c[b+1076>>2]|0;L=c[n>>2]|0;w=K+1|0;if((K|0)<(L+-1|0)){c[n>>2]=w;N=w}else N=L}else N=c[n>>2]|0;L=(N|0)>0;if(c[b+364>>2]|0){if(!L){do if(!(c[b+388>>2]|0)){if((c[b+1048>>2]|0)<6){Ye(b);break}c[b>>2]=29811;r=1;l=g;return r|0}while(0);r=Ze(b,j,e,f)|0;l=g;return r|0}j=p;N=b+388|0;w=b+1048|0;K=o;h=d;x=c[k>>2]|0;u=0;while(1){c[i>>2]=K;J=c[m+(u<<2)>>2]|0;if(K>>>0<d>>>0|J>>>0>(j-K|0)>>>0){O=29839;P=7;H=46;break}if(!(c[N>>2]|0)){if((c[w>>2]|0)>=6){O=29811;P=1;H=46;break}Ye(b)}Q=Ze(b,i,J,f)|0;if(Q|0){H=47;break}h=h+J|0;u=u+1|0;if((u|0)>=(c[n>>2]|0)){H=74;break}else{K=h;x=h}}if((H|0)==46){c[k>>2]=x;c[b>>2]=O;R=P}else if((H|0)==47){c[k>>2]=x;R=Q}else if((H|0)==74){c[k>>2]=h;r=0;l=g;return r|0}r=R;l=g;return r|0}if(L){L=p;R=o;o=d;h=c[k>>2]|0;Q=0;while(1){c[i>>2]=R;x=c[m+(Q<<2)>>2]|0;if(R>>>0<d>>>0|x>>>0>(L-R|0)>>>0){H=58;break}S=Ze(b,i,x,f)|0;if(S|0){H=61;break}o=o+x|0;Q=Q+1|0;if((Q|0)>=(c[n>>2]|0)){H=73;break}else{R=o;h=o}}if((H|0)==58){c[k>>2]=h;c[b>>2]=29839;T=7}else if((H|0)==61){c[k>>2]=h;T=S}else if((H|0)==73){c[k>>2]=o;r=0;l=g;return r|0}r=T;l=g;return r|0}T=p;if((e|0)>0)U=d;else{r=0;l=g;return r|0}while(1){d=Ze(b,k,T-U|0,f)|0;if(d|0){r=d;H=75;break}d=c[k>>2]|0;do if(d>>>0<p>>>0){e=d;while(1){o=c[M>>2]|0;if(!o)V=a[e>>0]|0;else{Ga[o&63](c[q>>2]|0,e,i,1);V=a[i>>0]|0}if(V<<24>>24){H=63;break}W=e+1|0;if(W>>>0<p>>>0)e=W;else{H=64;break}}if((H|0)==63){H=0;c[k>>2]=e;X=e;break}else if((H|0)==64){H=0;c[k>>2]=W;X=W;break}}else X=d;while(0);if(X>>>0<p>>>0)U=X;else{r=0;H=75;break}}if((H|0)==75){l=g;return r|0}return 0}function Ve(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=l;l=l+144|0;f=e+16|0;g=e;h=b+364|0;i=(c[h>>2]|0)==0;if((!i?(c[b+388>>2]|0)>0:0)?(c[b+344>>2]|0)==0:0){j=0;l=e;return j|0}k=b+1048|0;if((c[k>>2]|0)>0){m=c[b+1056>>2]|0;n=b+352|0;if(((((!i?(c[n>>2]|0)>-1:0)?(i=c[n>>2]|0,(i|0)>-1):0)?(o=m+12+(i*160|0)|0,p=c[o>>2]|0,(p|0)>0):0)?(q=p+-1|0,c[o>>2]=q,(q|0)==0):0)?c[m+12+(i*160|0)+24>>2]|0:0)Ea[c[m+8>>2]&31](c[m>>2]|0,m+12+(i*160|0)+16|0)|0;i=b+1044|0;m=c[i>>2]|0;c[n>>2]=c[b+392+(m*108|0)>>2];if(c[b+1052>>2]|0){j=0;l=e;return j|0}c[i>>2]=(m+1|0)%6|0;c[k>>2]=(c[k>>2]|0)+-1;j=b+392+(m*108|0)+4|0;l=e;return j|0}if(c[d>>2]|0){j=0;l=e;return j|0}d=b+368|0;if(!(c[d>>2]|0)){j=0;l=e;return j|0}m=b+384|0;k=b+372|0;i=b+4|0;n=b+388|0;q=b+1052|0;o=b+344|0;p=b+376|0;r=b+216|0;s=b+220|0;t=b+224|0;u=g+4|0;v=g+8|0;while(1){c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;w=rd()|0;x=c[d>>2]|0;y=c[m>>2]|0;z=c[x+(y*24|0)+12>>2]|0;c[m>>2]=(y+1|0)%(c[k>>2]|0)|0;if(c[i>>2]&65536|0){A=c[s>>2]|0;B=c[t>>2]|0;c[g>>2]=c[r>>2];c[u>>2]=A;c[v>>2]=B}B=z+28|0;if(!(Aa[c[w+8>>2]&7](x+(y*24|0)|0)|0)){c[B>>2]=0;c[n>>2]=(c[n>>2]|0)+1;c[q>>2]=1;if((c[o>>2]|0)!=1){C=0;break}}else{do if((c[B>>2]|0)==1){c[n>>2]=(c[n>>2]|0)+1;c[B>>2]=0;y=c[z>>2]|0;if((c[q>>2]|0)==1?(c[y+18720>>2]|0)==0:0){if((a[y+1012>>0]|0)==0?c[y+996>>2]|0:0){D=y;E=z;break}c[q>>2]=0;D=y;E=z}else{D=y;E=z}}else{D=c[z>>2]|0;E=z}while(0);if(!($f(D,f,g)|0)){F=29;break}}if((c[m>>2]|0)==(c[p>>2]|0)){j=0;F=42;break}}if((F|0)==42){l=e;return j|0}if((F|0)==29){F=c[E>>2]|0;p=c[F+17836>>2]|0;m=c[b+1056>>2]|0;g=b+352|0;if((c[h>>2]|0)!=0?(c[g>>2]|0)>-1:0){h=c[g>>2]|0;if((((h|0)>-1?(D=m+12+(h*160|0)|0,n=c[D>>2]|0,(n|0)>0):0)?(o=n+-1|0,c[D>>2]=o,(o|0)==0):0)?c[m+12+(h*160|0)+24>>2]|0:0)Ea[c[m+8>>2]&31](c[m>>2]|0,m+12+(h*160|0)+16|0)|0;G=c[E>>2]|0}else G=F;c[g>>2]=c[G+988>>2];if(!(c[q>>2]|0)){q=b+236|0;G=c[z+16>>2]|0;z=c[f+88>>2]|0;g=(z|0)==0;E=c[f+84>>2]|0;h=(E|0)!=0;c[q>>2]=g?(h?261:262):h?258:263;c[b+240>>2]=c[f+96>>2];c[b+244>>2]=c[f+100>>2];c[b+256>>2]=8;m=c[f+16>>2]|0;c[b+248>>2]=m;c[b+252>>2]=(c[f+4>>2]|0)+327&-8;c[b+260>>2]=c[f+8>>2];c[b+264>>2]=c[f+12>>2];c[b+268>>2]=c[f+104>>2];c[b+272>>2]=c[f+108>>2];c[b+276>>2]=E;c[b+280>>2]=z;c[b+284>>2]=c[f+52>>2];c[b+288>>2]=c[f+56>>2];c[b+292>>2]=c[f+60>>2];c[b+296>>2]=0;c[b+300>>2]=m;z=c[f+36>>2]|0;c[b+304>>2]=z;c[b+308>>2]=z;c[b+312>>2]=m;c[b+316>>2]=g?(h?16:24):h?12:16;c[b+320>>2]=G;c[b+324>>2]=c[f+68>>2];c[b+328>>2]=0;c[b+332>>2]=0;c[b+336>>2]=c[p+12+((c[F+988>>2]|0)*160|0)+24>>2];C=q}else C=0}j=C;l=e;return j|0}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;if((b|0)==0|(d|0)==0){f=8;return f|0}if(c[a+368>>2]|0){f=1;return f|0}c[a+1064>>2]=b;c[a+1068>>2]=d;c[a+1060>>2]=e;f=0;return f|0}function Xe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=l;l=l+16|0;d=b;e=a+4|0;c[d>>2]=c[e>>2];f=a+12|0;g=_f(c[a>>2]|0,c[f>>2]|0,d)|0;c[a+20>>2]=g;h=c[d>>2]|0;c[a+8>>2]=h;d=c[a>>2]|0;i=(g|0)!=0;j=h;do if(!(c[d+17864>>2]|0)){if(i){c[(c[d+17868>>2]|0)+140>>2]=1;c[d+18720>>2]=1}}else{if(!i?((c[e>>2]|0)+(c[f>>2]|0)+-1|0)>>>0<=j>>>0:0)break;c[a+40>>2]=1;c[(c[(c[a>>2]|0)+17868>>2]|0)+140>>2]=1;c[(c[a>>2]|0)+18720>>2]=1;k=0;l=b;return k|0}while(0);k=(g|0)==0&1;l=b;return k|0}function Ye(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+144|0;e=d+16|0;f=d;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;g=rd()|0;h=c[b+368>>2]|0;i=b+384|0;j=c[i>>2]|0;k=c[h+(j*24|0)+12>>2]|0;c[i>>2]=(j+1|0)%(c[b+372>>2]|0)|0;Aa[c[g+8>>2]&7](h+(j*24|0)|0)|0;c[k+28>>2]=0;j=b+388|0;c[j>>2]=(c[j>>2]|0)+1;j=c[k>>2]|0;h=b+1052|0;do if((c[h>>2]|0)==1?(c[j+18720>>2]|0)==0:0){if((a[j+1012>>0]|0)==0?c[j+996>>2]|0:0)break;c[h>>2]=0}while(0);if($f(j,e,f)|0){l=d;return}f=c[k>>2]|0;j=c[f+17836>>2]|0;h=f+988|0;f=b+1040|0;c[b+392+((c[f>>2]|0)*108|0)>>2]=c[h>>2];g=c[f>>2]|0;i=c[k+16>>2]|0;k=c[e+88>>2]|0;m=(k|0)==0;n=c[e+84>>2]|0;o=(n|0)!=0;c[b+392+(g*108|0)+4>>2]=m?(o?261:262):o?258:263;c[b+392+(g*108|0)+8>>2]=c[e+96>>2];c[b+392+(g*108|0)+12>>2]=c[e+100>>2];c[b+392+(g*108|0)+24>>2]=8;p=c[e+16>>2]|0;c[b+392+(g*108|0)+16>>2]=p;c[b+392+(g*108|0)+20>>2]=(c[e+4>>2]|0)+327&-8;c[b+392+(g*108|0)+28>>2]=c[e+8>>2];c[b+392+(g*108|0)+32>>2]=c[e+12>>2];c[b+392+(g*108|0)+36>>2]=c[e+104>>2];c[b+392+(g*108|0)+40>>2]=c[e+108>>2];c[b+392+(g*108|0)+44>>2]=n;c[b+392+(g*108|0)+48>>2]=k;c[b+392+(g*108|0)+52>>2]=c[e+52>>2];c[b+392+(g*108|0)+56>>2]=c[e+56>>2];c[b+392+(g*108|0)+60>>2]=c[e+60>>2];c[b+392+(g*108|0)+64>>2]=0;c[b+392+(g*108|0)+68>>2]=p;k=c[e+36>>2]|0;c[b+392+(g*108|0)+72>>2]=k;c[b+392+(g*108|0)+76>>2]=k;c[b+392+(g*108|0)+80>>2]=p;c[b+392+(g*108|0)+84>>2]=m?(o?16:24):o?12:16;c[b+392+(g*108|0)+88>>2]=i;c[b+392+(g*108|0)+92>>2]=c[e+68>>2];c[b+392+(g*108|0)+96>>2]=0;c[b+392+(g*108|0)+100>>2]=0;c[b+392+((c[f>>2]|0)*108|0)+104>>2]=c[j+12+((c[h>>2]|0)*160|0)+24>>2];c[f>>2]=((c[f>>2]|0)+1|0)%6|0;f=b+1048|0;c[f>>2]=(c[f>>2]|0)+1;l=d;return}function Ze(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=l;l=l+16|0;h=g;i=rd()|0;do if(!(c[b+204>>2]|0)){c[h>>2]=0;j=_e(c[d>>2]|0,e,b+196|0,h,c[b+228>>2]|0,c[b+232>>2]|0)|0;if(!j){if(!(c[h>>2]|c[b+208>>2]))k=1;else break;l=g;return k|0}else{k=j;l=g;return k|0}}while(0);h=c[b+368>>2]|0;if(c[b+364>>2]|0){j=b+376|0;m=c[j>>2]|0;n=h+(m*24|0)|0;o=c[h+(m*24|0)+12>>2]|0;p=b+380|0;c[(c[o>>2]|0)+17856>>2]=0;q=o+36|0;r=o+32|0;s=c[r>>2]|0;do if((c[q>>2]|0)>>>0<e>>>0){Wa(s);t=Ua(e)|0;c[r>>2]=t;if(t|0){c[q>>2]=e;u=t;break}c[b>>2]=29867;k=2;l=g;return k|0}else u=s;while(0);c[o+12>>2]=e;vh(u|0,c[d>>2]|0,e|0)|0;c[o+44>>2]=0;c[o+40>>2]=0;c[o+28>>2]=1;c[o+4>>2]=c[r>>2];c[o+16>>2]=f;o=c[j>>2]|0;r=c[p>>2]|0;u=c[b+372>>2]|0;if((o|0)!=(r|0))c[p>>2]=(r+1|0)%(u|0)|0;c[j>>2]=(o+1|0)%(u|0)|0;u=b+388|0;c[u>>2]=(c[u>>2]|0)+-1;c[h+(m*24|0)+20>>2]=0;ya[c[i+12>>2]&15](n);k=0;l=g;return k|0}n=c[h+12>>2]|0;c[n+4>>2]=c[d>>2];c[n+12>>2]=e;c[n+16>>2]=f;c[n+28>>2]=1;f=c[n>>2]|0;c[f+18704>>2]=c[b+228>>2];c[f+18708>>2]=c[b+232>>2];f=h+20|0;c[f>>2]=0;ya[c[i+16>>2]&15](h);c[d>>2]=c[n+8>>2];d=c[n>>2]|0;if(c[f>>2]|0){f=c[d+432>>2]|0;if(!f){k=0;l=g;return k|0}c[b>>2]=c[d+436>>2]|0?d+440|0:0;k=f;l=g;return k|0}f=b+1052|0;if((c[f>>2]|0)!=1){k=0;l=g;return k|0}if(c[d+18720>>2]|0){k=0;l=g;return k|0}if((a[d+1012>>0]|0)==0?c[d+996>>2]|0:0){k=0;l=g;return k|0}c[f>>2]=0;k=0;l=g;return k|0}function _e(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;h=l;l=l+32|0;i=h+20|0;j=h;if((b|0)<1){k=8;l=h;return k|0}m=d+12|0;c[m>>2]=0;n=d+8|0;c[n>>2]=0;o=d+4|0;c[o>>2]=0;d=b>>>0<10?b:10;if(!f){p=a;q=b}else{Ga[f&63](g,a,i,d);p=i;q=d}c[j>>2]=p;c[j+4>>2]=p+q;p=j+8|0;c[p>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;d=hb(j,2)|0;i=yf(j)|0;a:do if(!((d|0)!=2|i>>>0>3)){if(gb(j)|0){if(q>>>0<2&i>>>0>2){r=5;break}hb(j,3)|0;r=0;break}if(q>>>0>=10){c[m>>2]=(gb(j)|0)==0&1;a=gb(j)|0;g=gb(j)|0;do if(!(c[m>>2]|0)){if(a|0){c[p>>2]=(c[p>>2]|0)+(g|0?0:2);s=0;break}f=gb(j)|0;c[p>>2]=(c[p>>2]|0)+(g|0?0:2);if(!f)s=0;else{if(!(wf(j)|0)){r=5;break a}switch(i|0){case 0:{t=c[p>>2]|0;break}case 1:{u=27;break}default:{c[p>>2]=(c[p>>2]|0)+1;u=27}}do if((u|0)==27){b=(i|2|0)==3;if((hb(j,3)|0)==7){if(!b){r=5;break a}v=c[p>>2]|0}else{w=c[p>>2]|0;x=w+1|0;c[p>>2]=x;if(!b){t=x;break}x=w+3|0;c[p>>2]=x;v=x}x=v+1|0;c[p>>2]=x;t=x}while(0);c[p>>2]=t+8;xf(j,o,n);s=f}}else{if(!(wf(j)|0)){r=5;break a}if(i>>>0>1)c[p>>2]=(c[p>>2]|0)+1;x=(i|2|0)==3;if((hb(j,3)|0)!=7){w=c[p>>2]|0;c[p>>2]=w+1;if(x){b=w+3|0;c[p>>2]=b;y=b;u=18}}else{if(!x){r=5;break a}y=c[p>>2]|0;u=18}if((u|0)==18)c[p>>2]=y+1;xf(j,o,n);s=0}while(0);if(!e){k=0;l=h;return k|0}c[e>>2]=s;k=0;l=h;return k|0}else r=5}else r=5;while(0);k=r;l=h;return k|0}function $e(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(c[a+364>>2]|0){c[a>>2]=29903;h=4;l=d;return h|0}if(!g){h=8;l=d;return h|0}f=c[(c[a+368>>2]|0)+12>>2]|0;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];a=c[g+28>>2]|0;c[e+8>>2]=a;b=c[g+32>>2]|0;c[e+12>>2]=b;c[e+104>>2]=c[g+36>>2];c[e+108>>2]=c[g+40>>2];c[e>>2]=a;c[e+4>>2]=b;i=c[g+44>>2]|0;j=(i|0)==1?(a+1|0)/2|0:a;c[e+20>>2]=j;a=c[g+48>>2]|0;k=(a|0)==1?(b+1|0)/2|0:b;c[e+24>>2]=k;c[e+28>>2]=j;c[e+32>>2]=k;k=c[g+68>>2]|0;c[e+16>>2]=k;c[e+36>>2]=c[g+72>>2];c[e+96>>2]=c[g+8>>2];c[e+100>>2]=c[g+12>>2];c[e+76>>2]=(k-(c[g+16>>2]|0)|0)>>>1;c[e+84>>2]=i;c[e+88>>2]=a;h=Yf(c[f>>2]|0,c[g>>2]|0,e)|0;l=d;return h|0}function af(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;d=l;l=l+128|0;e=d;f=(c[b>>2]|0)+(4-1)&~(4-1);g=c[f>>2]|0;c[b>>2]=f+4;if(c[a+364>>2]|0){c[a>>2]=29903;h=4;l=d;return h|0}if(!g){h=8;l=d;return h|0}f=c[(c[a+368>>2]|0)+12>>2]|0;c[e+52>>2]=c[g+52>>2];c[e+56>>2]=c[g+56>>2];c[e+60>>2]=c[g+60>>2];a=c[g+28>>2]|0;c[e+8>>2]=a;b=c[g+32>>2]|0;c[e+12>>2]=b;c[e+104>>2]=c[g+36>>2];c[e+108>>2]=c[g+40>>2];c[e>>2]=a;c[e+4>>2]=b;i=c[g+44>>2]|0;j=(i|0)==1?(a+1|0)/2|0:a;c[e+20>>2]=j;a=c[g+48>>2]|0;k=(a|0)==1?(b+1|0)/2|0:b;c[e+24>>2]=k;c[e+28>>2]=j;c[e+32>>2]=k;k=c[g+68>>2]|0;c[e+16>>2]=k;c[e+36>>2]=c[g+72>>2];c[e+96>>2]=c[g+8>>2];c[e+100>>2]=c[g+12>>2];c[e+76>>2]=(k-(c[g+16>>2]|0)|0)>>>1;c[e+84>>2]=i;c[e+88>>2]=a;a=(c[f>>2]|0)+432|0;f=c[g>>2]|0;switch(f|0){case 4:case 2:case 1:{m=f;break}default:m=1}h=Zf(a,m,e)|0;l=d;return h|0}function bf(a,b){a=a|0;b=b|0;return 4}function cf(a,b){a=a|0;b=b|0;var d=0,e=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;c[a+348>>2]=e;return 0}function df(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){c[a+228>>2]=0;f=0;g=a+232|0;c[g>>2]=f;return 0}else{c[a+228>>2]=c[e>>2];f=c[e+4>>2]|0;g=a+232|0;c[g>>2]=f;return 0}return 0}function ef(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(e|0){if((e+-32|0)>>>0>992){f=8;return f|0}if(e+-1&e|0){f=8;return f|0}}c[a+356>>2]=e;d=c[a+368>>2]|0;if(!d){f=0;return f|0}c[(c[c[d+12>>2]>>2]|0)+17808>>2]=e;f=0;return f|0}function ff(a,b){a=a|0;b=b|0;var d=0,e=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;c[a+360>>2]=e;d=c[a+368>>2]|0;if(!d)return 0;c[(c[c[d+12>>2]>>2]|0)+17812>>2]=e;return 0}function gf(a,b){a=a|0;b=b|0;var d=0,e=0;c[a+1072>>2]=1;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;c[a+1076>>2]=e;return e>>31&8|0}function hf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29903;f=4;return f|0}if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}c[e>>2]=c[(c[c[d+12>>2]>>2]|0)+17860>>2];f=0;return f|0}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}b=c[c[d+12>>2]>>2]|0;if(!(c[b+720>>2]|0)){f=1;return f|0}d=c[a+352>>2]|0;if((d|0)<=-1){f=0;return f|0}c[e>>2]=c[(c[b+17836>>2]|0)+12+(d*160|0)+140>>2];f=0;return f|0}function kf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29903;f=4;return f|0}if(!e){f=8;return f|0}d=c[c[(c[a+368>>2]|0)+12>>2]>>2]|0;a=c[e>>2]|0;if(a>>>0>7){f=1;return f|0}b=c[d+732+(a<<2)>>2]|0;if((b|0)<0){f=1;return f|0}a=c[d+17836>>2]|0;d=c[a+12+(b*160|0)+116>>2]|0;g=(d|0)==0;h=c[a+12+(b*160|0)+112>>2]|0;i=(h|0)!=0;c[e+4>>2]=g?(i?261:262):i?258:263;c[e+8>>2]=c[a+12+(b*160|0)+124>>2];c[e+12>>2]=c[a+12+(b*160|0)+128>>2];c[e+24>>2]=8;j=a+12+(b*160|0)+44|0;k=c[j>>2]|0;c[e+16>>2]=k;c[e+20>>2]=(c[a+12+(b*160|0)+32>>2]|0)+327&-8;c[e+28>>2]=c[a+12+(b*160|0)+36>>2];c[e+32>>2]=c[a+12+(b*160|0)+40>>2];c[e+36>>2]=c[a+12+(b*160|0)+132>>2];c[e+40>>2]=c[a+12+(b*160|0)+136>>2];c[e+44>>2]=h;c[e+48>>2]=d;c[e+52>>2]=c[a+12+(b*160|0)+80>>2];c[e+56>>2]=c[a+12+(b*160|0)+84>>2];c[e+60>>2]=c[a+12+(b*160|0)+88>>2];c[e+64>>2]=0;c[e+68>>2]=k;k=a+12+(b*160|0)+64|0;c[e+72>>2]=c[k>>2];c[e+76>>2]=c[k>>2];c[e+80>>2]=c[j>>2];c[e+84>>2]=g?(i?16:24):i?12:16;c[e+88>>2]=0;c[e+92>>2]=c[a+12+(b*160|0)+96>>2];c[e+96>>2]=0;c[e+100>>2]=0;f=0;return f|0}function lf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29903;f=4;return f|0}if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}a=c[c[d+12>>2]>>2]|0;c[e>>2]=c[a+696>>2];c[e+4>>2]=c[a+700>>2];f=0;return f|0}function mf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;d=c[a+368>>2]|0;b=c[a+384>>2]|0;if(!e){f=8;return f|0}if(!(d+(b*24|0)|0)){f=1;return f|0}c[e>>2]=c[(c[c[d+(b*24|0)+12>>2]>>2]|0)+17784>>2];f=0;return f|0}function nf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[b>>2]=d+4;if(c[a+364>>2]|0){c[a>>2]=29903;f=4;return f|0}if(!e){f=8;return f|0}d=c[a+368>>2]|0;if(!d){f=1;return f|0}a=c[c[d+12>>2]>>2]|0;c[e>>2]=c[a+688>>2];c[e+4>>2]=c[a+692>>2];f=0;return f|0}function of(){return 20052}function pf(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0;k=l;l=l+32|0;m=k;n=k+24|0;o=k+16|0;p=k+8|0;q=e+12|0;r=e+13280|0;s=f+432|0;t=e+13572|0;u=c[c[t>>2]>>2]|0;v=c[(c[f+728>>2]|0)+4>>2]|0;w=f+1040|0;x=c[w>>2]|0;if(c[f+996>>2]|0?(a[f+1012>>0]|0)==0:0){y=S(x,g)|0;z=v+(y*12|0)+(h*12|0)|0;v=y+h|0;y=f+4412|0;a:do if(a[y>>0]|0){A=c[f+1200>>2]|0;B=(A|0)==0;if(!B)if((i|0)>0&(j|0)>0){C=2147483647;D=0;while(1){E=(S(D,x)|0)+v|0;F=C;G=0;do{H=d[A+(E+G)>>0]|0;F=(F|0)<(H|0)?F:H;G=G+1|0}while((G|0)!=(i|0));D=D+1|0;if((D|0)==(j|0)){I=F;break}else C=F}}else I=2147483647;else I=0;if(!(a[f+4413>>0]|0)){C=c[f+1204>>2]|0;if(!((i|0)>0&(j|0)>0)){J=I;break}if(B){D=0;while(1){G=0;do{a[C+(G+v+(S(c[w>>2]|0,D)|0))>>0]=0;G=G+1|0}while((G|0)!=(i|0));D=D+1|0;if((D|0)==(j|0)){J=I;break a}}}else{D=0;while(1){B=0;do{G=B+v+(S(c[w>>2]|0,D)|0)|0;a[C+G>>0]=a[A+G>>0]|0;B=B+1|0}while((B|0)!=(i|0));D=D+1|0;if((D|0)==(j|0)){J=I;break a}}}}if(a[f+4416>>0]|0){D=c[e+13576>>2]|0;A=c[e+13580>>2]|0;if(!A)K=0;else K=a[A+5>>0]|0;if(!D)L=0;else L=a[D+5>>0]|0;D=d[L+K+(f+4424)>>0]|0;A=e+16|0;C=(256-D+(S(c[A>>2]|0,D)|0)|0)>>>8;D=e+20|0;B=c[D>>2]|0;if((B|0)<0){db(q);M=c[D>>2]|0}else M=B;B=c[q>>2]|0;G=C<<24;if(B>>>0<G>>>0){N=0;O=C;P=B}else{N=1;O=(c[A>>2]|0)-C|0;P=B-G|0}G=d[1280+O>>0]|0;B=O<<G;C=M-G|0;c[q>>2]=P<<G;c[D>>2]=C;c[A>>2]=B;a[u+5>>0]=N;if(!N){Q=B;R=C;T=D;U=A;V=q;W=100}else X=I}else{A=e+16|0;D=e+20|0;Q=c[A>>2]|0;R=c[D>>2]|0;T=D;U=A;V=q;W=100}if((W|0)==100){A=Q;D=R;C=0;do{B=C<<24>>24;G=d[(B>>1)+(f+4417)>>0]|0;F=(256-G+(S(G,A)|0)|0)>>>8;if((D|0)<0){db(q);Y=c[T>>2]|0}else Y=D;G=c[V>>2]|0;E=F<<24;if(G>>>0<E>>>0){Z=0;_=F;$=G}else{Z=1;_=(c[U>>2]|0)-F|0;$=G-E|0}E=d[1280+_>>0]|0;A=_<<E;D=Y-E|0;c[V>>2]=$<<E;c[T>>2]=D;c[U>>2]=A;C=a[29056+(Z+B)>>0]|0}while(C<<24>>24>0);X=0-(C<<24>>24)|0}if((j|0)>0?(A=X&255,D=f+1204|0,(i|0)>0):0){B=0;do{E=0;do{a[(c[D>>2]|0)+(E+v+(S(c[w>>2]|0,B)|0))>>0]=A;E=E+1|0}while((E|0)!=(i|0));B=B+1|0}while((B|0)!=(j|0));J=X}else J=X}else J=0;while(0);X=u+4|0;a[X>>0]=J;v=u+3|0;a[v>>0]=qf(s,r,J<<24>>24,q)|0;J=a[X>>0]|0;if((a[y>>0]|0)!=0?(c[f+4492+(J<<2)>>2]&4|0)!=0:0)aa=(b[f+4428+(J<<3)+4>>1]|0)!=0&1;else{J=c[e+13576>>2]|0;Z=c[e+13580>>2]|0;U=(Z|0)!=0;T=(J|0)!=0;if(!(T&U))if(T|U)ba=((a[(U?Z:J)+8>>0]|0)<1&1)<<1;else ba=0;else{U=(a[Z+8>>0]|0)>0;Z=(a[J+8>>0]|0)>0;ba=U|Z?(U&Z^1)&1:3}Z=d[(c[f+4540>>2]|0)+1931+ba>>0]|0;U=e+16|0;J=(256-Z+(S(c[U>>2]|0,Z)|0)|0)>>>8;Z=e+20|0;T=c[Z>>2]|0;if((T|0)<0){db(q);ca=c[Z>>2]|0}else ca=T;T=c[q>>2]|0;$=J<<24;if(T>>>0<$>>>0){da=0;ea=J;fa=T}else{da=1;ea=(c[U>>2]|0)-J|0;fa=T-$|0}$=d[1280+ea>>0]|0;c[q>>2]=fa<<$;c[Z>>2]=ca-$;c[U>>2]=ea<<$;$=c[e+13548>>2]|0;ea=$+12496+(ba<<3)+(da<<2)|0;if(!$)aa=da;else{c[ea>>2]=(c[ea>>2]|0)+1;aa=da}}da=(aa|0)==0;a[u+2>>0]=rf(s,r,(da|(a[v>>0]|0)==0)&1,q)|0;v=a[u>>0]|0;if(da){switch(v<<24>>24){case 0:{da=f+4540|0;aa=e+16|0;ea=e+20|0;$=e+13548|0;ba=0;do{U=c[da>>2]|0;ca=c[aa>>2]|0;Z=c[ea>>2]|0;fa=0;do{T=fa<<24>>24;J=d[U+(T>>1)>>0]|0;V=(256-J+(S(J,ca)|0)|0)>>>8;if((Z|0)<0){db(q);ga=c[ea>>2]|0}else ga=Z;J=c[q>>2]|0;Y=V<<24;if(J>>>0<Y>>>0){ha=0;ia=V;ja=J}else{ha=1;ia=(c[aa>>2]|0)-V|0;ja=J-Y|0}Y=d[1280+ia>>0]|0;ca=ia<<Y;Z=ga-Y|0;c[q>>2]=ja<<Y;c[ea>>2]=Z;c[aa>>2]=ca;fa=a[27664+(ha+T)>>0]|0}while(fa<<24>>24>0);ca=0-(fa&255)|0;Z=c[$>>2]|0;U=Z+((ca&255)<<2)|0;if(Z|0)c[U>>2]=(c[U>>2]|0)+1;a[u+20+(ba*12|0)>>0]=ca;ba=ba+1|0}while((ba|0)!=4);ba=a[u+56>>0]|0;a[u+1>>0]=ba;ka=ba;la=da;ma=ea;na=aa;oa=q;break}case 1:{aa=f+4540|0;ea=c[aa>>2]|0;da=e+16|0;ba=e+20|0;$=c[da>>2]|0;ha=c[ba>>2]|0;ja=0;do{ga=ja<<24>>24;ia=d[ea+(ga>>1)>>0]|0;ca=(256-ia+(S(ia,$)|0)|0)>>>8;if((ha|0)<0){db(q);pa=c[ba>>2]|0}else pa=ha;ia=c[q>>2]|0;U=ca<<24;if(ia>>>0<U>>>0){qa=0;ra=ca;sa=ia}else{qa=1;ra=(c[da>>2]|0)-ca|0;sa=ia-U|0}U=d[1280+ra>>0]|0;$=ra<<U;ha=pa-U|0;c[q>>2]=sa<<U;c[ba>>2]=ha;c[da>>2]=$;ja=a[27664+(qa+ga)>>0]|0}while(ja<<24>>24>0);qa=0-(ja&255)|0;ja=qa&255;sa=e+13548|0;pa=c[sa>>2]|0;ra=pa+((qa&255)<<2)|0;if(!pa){ta=$;ua=ha}else{c[ra>>2]=(c[ra>>2]|0)+1;ta=c[da>>2]|0;ua=c[ba>>2]|0}a[u+44>>0]=ja;a[u+20>>0]=ja;ja=c[aa>>2]|0;ra=ta;ta=ua;ua=0;do{ha=ua<<24>>24;$=d[ja+(ha>>1)>>0]|0;pa=(256-$+(S($,ra)|0)|0)>>>8;if((ta|0)<0){db(q);va=c[ba>>2]|0}else va=ta;$=c[q>>2]|0;qa=pa<<24;if($>>>0<qa>>>0){wa=0;xa=pa;ya=$}else{wa=1;xa=(c[da>>2]|0)-pa|0;ya=$-qa|0}qa=d[1280+xa>>0]|0;ra=xa<<qa;ta=va-qa|0;c[q>>2]=ya<<qa;c[ba>>2]=ta;c[da>>2]=ra;ua=a[27664+(wa+ha)>>0]|0}while(ua<<24>>24>0);wa=0-(ua&255)|0;ua=wa&255;ra=c[sa>>2]|0;sa=ra+((wa&255)<<2)|0;if(ra|0)c[sa>>2]=(c[sa>>2]|0)+1;a[u+1>>0]=ua;a[u+56>>0]=ua;a[u+32>>0]=ua;ka=ua;la=aa;ma=ba;na=da;oa=q;break}case 2:{da=f+4540|0;ba=c[da>>2]|0;aa=e+16|0;ua=e+20|0;sa=c[aa>>2]|0;ra=c[ua>>2]|0;wa=0;do{ta=wa<<24>>24;ya=d[ba+(ta>>1)>>0]|0;va=(256-ya+(S(ya,sa)|0)|0)>>>8;if((ra|0)<0){db(q);za=c[ua>>2]|0}else za=ra;ya=c[q>>2]|0;xa=va<<24;if(ya>>>0<xa>>>0){Aa=0;Ba=va;Ca=ya}else{Aa=1;Ba=(c[aa>>2]|0)-va|0;Ca=ya-xa|0}xa=d[1280+Ba>>0]|0;sa=Ba<<xa;ra=za-xa|0;c[q>>2]=Ca<<xa;c[ua>>2]=ra;c[aa>>2]=sa;wa=a[27664+(Aa+ta)>>0]|0}while(wa<<24>>24>0);Aa=0-(wa&255)|0;wa=Aa&255;Ca=e+13548|0;za=c[Ca>>2]|0;Ba=za+((Aa&255)<<2)|0;if(!za){Da=sa;Ea=ra}else{c[Ba>>2]=(c[Ba>>2]|0)+1;Da=c[aa>>2]|0;Ea=c[ua>>2]|0}a[u+32>>0]=wa;a[u+20>>0]=wa;wa=c[da>>2]|0;Ba=Da;Da=Ea;Ea=0;do{ra=Ea<<24>>24;sa=d[wa+(ra>>1)>>0]|0;za=(256-sa+(S(sa,Ba)|0)|0)>>>8;if((Da|0)<0){db(q);Fa=c[ua>>2]|0}else Fa=Da;sa=c[q>>2]|0;Aa=za<<24;if(sa>>>0<Aa>>>0){Ga=0;Ha=za;Ia=sa}else{Ga=1;Ha=(c[aa>>2]|0)-za|0;Ia=sa-Aa|0}Aa=d[1280+Ha>>0]|0;Ba=Ha<<Aa;Da=Fa-Aa|0;c[q>>2]=Ia<<Aa;c[ua>>2]=Da;c[aa>>2]=Ba;Ea=a[27664+(Ga+ra)>>0]|0}while(Ea<<24>>24>0);Ga=0-(Ea&255)|0;Ea=Ga&255;Ba=c[Ca>>2]|0;Ca=Ba+((Ga&255)<<2)|0;if(Ba|0)c[Ca>>2]=(c[Ca>>2]|0)+1;a[u+1>>0]=Ea;a[u+56>>0]=Ea;a[u+44>>0]=Ea;ka=Ea;la=da;ma=ua;na=aa;oa=q;break}default:{aa=d[29312+(v&255)>>0]|0;ua=f+4540|0;da=c[ua>>2]|0;Ea=e+16|0;Ca=e+20|0;Ba=c[Ea>>2]|0;Ga=c[Ca>>2]|0;Da=0;do{Ia=Da<<24>>24;Fa=d[(Ia>>1)+(da+(aa*9|0))>>0]|0;Ha=(256-Fa+(S(Fa,Ba)|0)|0)>>>8;if((Ga|0)<0){db(q);Ja=c[Ca>>2]|0}else Ja=Ga;Fa=c[q>>2]|0;wa=Ha<<24;if(Fa>>>0<wa>>>0){Ka=0;La=Ha;Ma=Fa}else{Ka=1;La=(c[Ea>>2]|0)-Ha|0;Ma=Fa-wa|0}wa=d[1280+La>>0]|0;Ba=La<<wa;Ga=Ja-wa|0;c[q>>2]=Ma<<wa;c[Ca>>2]=Ga;c[Ea>>2]=Ba;Da=a[27664+(Ka+Ia)>>0]|0}while(Da<<24>>24>0);Ka=0-(Da&255)|0;Da=Ka&255;Ba=c[e+13548>>2]|0;Ga=Ba+(aa*40|0)+((Ka&255)<<2)|0;if(Ba|0)c[Ga>>2]=(c[Ga>>2]|0)+1;a[u+1>>0]=Da;ka=Da;la=ua;ma=Ca;na=Ea;oa=q}}Ea=c[la>>2]|0;la=ka&255;ka=c[na>>2]|0;Ca=c[ma>>2]|0;ua=0;do{Da=ua<<24>>24;Ga=d[(Da>>1)+(Ea+36+(la*9|0))>>0]|0;Ba=(256-Ga+(S(Ga,ka)|0)|0)>>>8;if((Ca|0)<0){db(q);Na=c[ma>>2]|0}else Na=Ca;Ga=c[oa>>2]|0;Ka=Ba<<24;if(Ga>>>0<Ka>>>0){Oa=0;Pa=Ba;Qa=Ga}else{Oa=1;Pa=(c[na>>2]|0)-Ba|0;Qa=Ga-Ka|0}Ka=d[1280+Pa>>0]|0;ka=Pa<<Ka;Ca=Na-Ka|0;c[oa>>2]=Qa<<Ka;c[ma>>2]=Ca;c[na>>2]=ka;ua=a[27664+(Oa+Da)>>0]|0}while(ua<<24>>24>0);Oa=0-(ua&255)|0;ua=c[e+13548>>2]|0;ka=ua+160+(la*40|0)+((Oa&255)<<2)|0;if(ua|0)c[ka>>2]=(c[ka>>2]|0)+1;a[u+6>>0]=Oa;a[u+7>>0]=3;a[u+8>>0]=0;a[u+9>>0]=-1}else{Oa=c[f+1016>>2]|0;ka=v&255;ua=20248+(ka<<6)|0;la=a[X>>0]|0;na=u+8|0;Ca=f+4540|0;ma=c[Ca>>2]|0;Qa=e+13548|0;oa=c[Qa>>2]|0;if((a[y>>0]|0)!=0?(c[f+4492+(la<<2)>>2]&4|0)!=0:0){a[na>>0]=b[f+4428+(la<<3)+4>>1];Ra=-1;Ta=1;W=159}else W=129;b:do if((W|0)==129){la=c[f+4536>>2]|0;if((la|0)==2){Na=Zd(s,r)|0;Pa=d[(c[Ca>>2]|0)+1935+Na>>0]|0;Ea=e+16|0;Da=(256-Pa+(S(c[Ea>>2]|0,Pa)|0)|0)>>>8;Pa=e+20|0;Ka=c[Pa>>2]|0;if((Ka|0)<0){db(q);Ua=c[Pa>>2]|0}else Ua=Ka;Ka=c[q>>2]|0;Ga=Da<<24;if(Ka>>>0<Ga>>>0){Va=0;Wa=Da;Xa=Ka}else{Va=1;Wa=(c[Ea>>2]|0)-Da|0;Xa=Ka-Ga|0}Ga=d[1280+Wa>>0]|0;c[q>>2]=Xa<<Ga;c[Pa>>2]=Ua-Ga;c[Ea>>2]=Wa<<Ga;Ga=c[Qa>>2]|0;Ea=Ga+12528+(Na<<3)+(Va<<2)|0;if(!Ga)Ya=Va;else{c[Ea>>2]=(c[Ea>>2]|0)+1;Ya=Va}}else Ya=la;switch(Ya|0){case 1:{la=f+4532|0;Ea=c[f+4356+(a[la>>0]<<2)>>2]|0;Ga=_d(s,r)|0;Na=d[ma+1950+Ga>>0]|0;Pa=e+16|0;Ka=(256-Na+(S(c[Pa>>2]|0,Na)|0)|0)>>>8;Na=e+20|0;Da=c[Na>>2]|0;if((Da|0)<0){db(q);Za=c[Na>>2]|0}else Za=Da;Da=c[q>>2]|0;Ba=Ka<<24;if(Da>>>0<Ba>>>0){_a=0;$a=Ka;ab=Da}else{_a=1;$a=(c[Pa>>2]|0)-Ka|0;ab=Da-Ba|0}Ba=d[1280+$a>>0]|0;c[q>>2]=ab<<Ba;c[Na>>2]=Za-Ba;c[Pa>>2]=$a<<Ba;Ba=oa+12648+(Ga<<3)+(_a<<2)|0;if(oa|0)c[Ba>>2]=(c[Ba>>2]|0)+1;a[u+8+Ea>>0]=a[la>>0]|0;Ra=a[f+4533+_a>>0]|0;Ta=(Ea|0)==0&1;W=159;break b;break}case 0:break;default:break b}Ea=$d(r)|0;la=d[ma+1940+(Ea<<1)>>0]|0;Ba=e+16|0;Ga=(256-la+(S(c[Ba>>2]|0,la)|0)|0)>>>8;la=e+20|0;Pa=c[la>>2]|0;if((Pa|0)<0){db(q);bb=c[la>>2]|0}else bb=Pa;Pa=c[q>>2]|0;Na=Ga<<24;if(Pa>>>0<Na>>>0){cb=0;eb=Ga;fb=Pa}else{cb=1;eb=(c[Ba>>2]|0)-Ga|0;fb=Pa-Na|0}Na=d[1280+eb>>0]|0;c[q>>2]=fb<<Na;c[la>>2]=bb-Na;c[Ba>>2]=eb<<Na;Na=(oa|0)!=0;Pa=oa+12568+(Ea<<4)+(cb<<2)|0;if(Na)c[Pa>>2]=(c[Pa>>2]|0)+1;if(!cb)gb=1;else{Pa=ae(r)|0;Ea=d[ma+1940+(Pa<<1)+1>>0]|0;Ga=(256-Ea+(S(c[Ba>>2]|0,Ea)|0)|0)>>>8;Ea=c[la>>2]|0;if((Ea|0)<0){db(q);hb=c[la>>2]|0}else hb=Ea;Ea=c[q>>2]|0;Da=Ga<<24;if(Ea>>>0<Da>>>0){ib=0;jb=Ga;kb=Ea}else{ib=1;jb=(c[Ba>>2]|0)-Ga|0;kb=Ea-Da|0}Da=d[1280+jb>>0]|0;c[q>>2]=kb<<Da;c[la>>2]=hb-Da;c[Ba>>2]=jb<<Da;Da=oa+12568+(Pa<<4)+8+(ib<<2)|0;if(Na)c[Da>>2]=(c[Da>>2]|0)+1;gb=ib|0?3:2}a[na>>0]=gb;Ra=-1;Ta=1;W=159}while(0);if((W|0)==159)a[u+8+Ta>>0]=Ra;Ra=(a[u+9>>0]|0)>0;Ta=Ra&1;gb=f+1032|0;na=e+13560|0;ib=e+13564|0;oa=e+13568|0;jb=c[ua>>2]|0;hb=jb+g|0;if(((hb|0)>=0?(kb=c[20248+(ka<<6)+4>>2]|0,ma=kb+h|0,(hb|0)<(c[gb>>2]|0)?(ma|0)>=(c[na>>2]|0):0):0)?(ma|0)<(c[ib>>2]|0):0)lb=c[21080+(d[(c[(c[t>>2]|0)+((S(c[oa>>2]|0,jb)|0)+kb<<2)>>2]|0)+1>>0]<<2)>>2]|0;else lb=0;kb=c[20248+(ka<<6)+8>>2]|0;jb=kb+g|0;if(((jb|0)>=0?(ma=c[20248+(ka<<6)+12>>2]|0,ka=ma+h|0,(jb|0)<(c[gb>>2]|0)?(ka|0)>=(c[na>>2]|0):0):0)?(ka|0)<(c[ib>>2]|0):0)mb=(c[21080+(d[(c[(c[t>>2]|0)+((S(c[oa>>2]|0,kb)|0)+ma<<2)>>2]|0)+1>>0]<<2)>>2]|0)+lb|0;else mb=lb;lb=c[21136+(mb<<2)>>2]|0;if((a[y>>0]|0)!=0?(c[f+4492+(a[X>>0]<<2)>>2]&8|0)!=0:0){a[u+1>>0]=12;if((v&255)<3)Sa(c[e+13708>>2]|0,5,29942,m);else W=204}else W=172;c:do if((W|0)==172){if((v&255)>2){m=lb&255;X=c[Ca>>2]|0;y=e+16|0;mb=e+20|0;ma=c[y>>2]|0;kb=c[mb>>2]|0;oa=0;do{ib=oa<<24>>24;ka=d[(ib>>1)+(X+1910+(m*3|0))>>0]|0;na=(256-ka+(S(ka,ma)|0)|0)>>>8;if((kb|0)<0){db(q);nb=c[mb>>2]|0}else nb=kb;ka=c[q>>2]|0;gb=na<<24;if(ka>>>0<gb>>>0){ob=0;pb=na;qb=ka}else{ob=1;pb=(c[y>>2]|0)-na|0;qb=ka-gb|0}gb=d[1280+pb>>0]|0;ma=pb<<gb;kb=nb-gb|0;c[q>>2]=qb<<gb;c[mb>>2]=kb;c[y>>2]=ma;oa=a[27682+(ob+ib)>>0]|0}while(oa<<24>>24>0);ma=oa<<24>>24;y=c[Qa>>2]|0;kb=y+12384+(m<<4)+(0-ma<<2)|0;if(y|0)c[kb>>2]=(c[kb>>2]|0)+1;kb=10-ma&255;ma=u+1|0;a[ma>>0]=kb;if(kb<<24>>24==12){W=204;break}else{rb=kb;sb=ma}}else{ma=u+1|0;a[ma>>0]=10;rb=10;sb=ma}ma=n+-4|0;kb=Ra?2:1;if(!Oa){y=rb;mb=0;while(1){X=tf(s,r,y,a[u+8+mb>>0]|0,ua,n,g,h,-1,0,7,f)|0;if((X|0)>0){fa=0;do{ib=n+(fa<<2)|0;gb=b[ib>>1]|0;ka=gb<<16>>16;if(ka&1|0)b[ib>>1]=(gb<<16>>16>0?65535:1)+ka;ka=ib+2|0;ib=b[ka>>1]|0;gb=ib<<16>>16;if(gb&1|0)b[ka>>1]=(ib<<16>>16>0?65535:1)+gb;fa=fa+1|0}while((fa|0)!=(X|0));c[o+(mb<<2)>>2]=c[ma+(X<<2)>>2]}fa=mb+1|0;if((fa|0)==(kb|0)){W=204;break c}y=a[sb>>0]|0;mb=fa}}else{tb=rb;ub=0}while(1){mb=tf(s,r,tb,a[u+8+ub>>0]|0,ua,n,g,h,-1,0,7,f)|0;if((mb|0)>0){y=0;do{m=n+(y<<2)|0;oa=b[m>>1]|0;fa=oa<<16>>16;if(!(((oa<<16>>16>-1?fa:0-fa|0)|0)<64?(gb=b[m+2>>1]|0,ib=gb<<16>>16,((gb<<16>>16>-1?ib:0-ib|0)|0)<64):0))W=196;do if((W|0)==196){W=0;if(fa&1|0)b[m>>1]=(oa<<16>>16>0?65535:1)+fa;ib=m+2|0;gb=b[ib>>1]|0;ka=gb<<16>>16;if(!(ka&1))break;b[ib>>1]=(gb<<16>>16>0?65535:1)+ka}while(0);y=y+1|0}while((y|0)!=(mb|0));c[o+(ub<<2)>>2]=c[ma+(mb<<2)>>2]}y=ub+1|0;if((y|0)==(kb|0)){W=204;break c}tb=a[sb>>0]|0;ub=y}}while(0);do if((W|0)==204){ub=a[f+1212>>0]|0;if(ub<<24>>24==4){sb=c[e+13576>>2]|0;if(!sb)vb=3;else vb=d[sb+7>>0]|0;sb=c[e+13580>>2]|0;if(!sb)wb=3;else wb=d[sb+7>>0]|0;sb=(vb|0)==(wb|0)?vb:(vb|0)==3?wb:(wb|0)==3?vb:3;tb=c[Ca>>2]|0;rb=e+16|0;ob=e+20|0;qb=c[rb>>2]|0;nb=c[ob>>2]|0;pb=0;do{kb=pb<<24>>24;ma=d[(kb>>1)+(tb+1902+(sb<<1))>>0]|0;y=(256-ma+(S(ma,qb)|0)|0)>>>8;if((nb|0)<0){db(q);xb=c[ob>>2]|0}else xb=nb;ma=c[q>>2]|0;X=y<<24;if(ma>>>0<X>>>0){yb=0;zb=y;Ab=ma}else{yb=1;zb=(c[rb>>2]|0)-y|0;Ab=ma-X|0}X=d[1280+zb>>0]|0;qb=zb<<X;nb=xb-X|0;c[q>>2]=Ab<<X;c[ob>>2]=nb;c[rb>>2]=qb;pb=a[27694+(yb+kb)>>0]|0}while(pb<<24>>24>0);qb=0-(pb<<24>>24)|0;rb=qb&255;nb=c[Qa>>2]|0;ob=nb+12336+(sb*12|0)+((qb&255)<<2)|0;if(!nb)Bb=rb;else{c[ob>>2]=(c[ob>>2]|0)+1;Bb=rb}}else Bb=ub;a[u+7>>0]=Bb;if((v&255)>=3){rb=(uf(s,r,a[u+1>>0]|0,u+12|0,o,o,Ta,Oa,q)|0)==0&1;ob=e+13704|0;c[ob>>2]=rb|c[ob>>2];break}ob=a[e+13544>>0]|0;rb=1<<(ob&255);nb=a[e+13545>>0]|0;qb=1<<(nb&255);c[p+4>>2]=-2147450880;tb=lb&255;kb=e+16|0;X=e+20|0;ma=n+4|0;y=nb<<24>>24==1;nb=ob<<24>>24==1;ob=e+13704|0;m=Ra?2:1;fa=0;do{oa=fa<<1;ka=0;do{gb=c[Ca>>2]|0;ib=c[kb>>2]|0;na=c[X>>2]|0;jb=0;do{hb=jb<<24>>24;cb=d[(hb>>1)+(gb+1910+(tb*3|0))>>0]|0;eb=(256-cb+(S(cb,ib)|0)|0)>>>8;if((na|0)<0){db(q);Cb=c[X>>2]|0}else Cb=na;cb=c[q>>2]|0;bb=eb<<24;if(cb>>>0<bb>>>0){Db=0;Eb=eb;Fb=cb}else{Db=1;Eb=(c[kb>>2]|0)-eb|0;Fb=cb-bb|0}bb=d[1280+Eb>>0]|0;ib=Eb<<bb;na=Cb-bb|0;c[q>>2]=Fb<<bb;c[X>>2]=na;c[kb>>2]=ib;jb=a[27682+(Db+hb)>>0]|0}while(jb<<24>>24>0);ib=ka+oa|0;na=jb<<24>>24;gb=c[Qa>>2]|0;hb=gb+12384+(tb<<4)+(0-na<<2)|0;if(gb|0)c[hb>>2]=(c[hb>>2]|0)+1;Gb=10-na&255;d:do if((Gb&-2)<<24>>24==10){na=Gb<<24>>24==10;switch(ib|0){case 0:{hb=0;do{c[p+(hb<<2)>>2]=c[n+((tf(s,r,Gb,a[(c[c[t>>2]>>2]|0)+8+hb>>0]|0,ua,n,g,h,0,1,0,0)|0)+-1<<2)>>2];hb=hb+1|0}while((hb|0)!=(m|0));break}case 3:{if(na){hb=0;while(1){gb=c[c[t>>2]>>2]|0;tf(s,r,10,a[gb+8+hb>>0]|0,ua,n,g,h,3,1,0,0)|0;c[p+(hb<<2)>>2]=c[gb+48+(hb<<2)>>2];hb=hb+1|0;if((hb|0)==(m|0))break d}}else Hb=0;do{hb=c[c[t>>2]>>2]|0;tf(s,r,Gb,a[hb+8+Hb>>0]|0,ua,n,g,h,3,1,0,0)|0;gb=c[hb+36+(Hb<<2)>>2]|0;bb=c[hb+24+(Hb<<2)>>2]|0;cb=c[n>>2]|0;eb=c[ma>>2]|0;fb=p+(Hb<<2)|0;c[fb>>2]=0;do if((c[hb+48+(Hb<<2)>>2]|0)==(gb|0)){if((gb|0)!=(bb|0)){Ib=bb;W=245;break}if((gb|0)!=(cb|0)){Ib=cb;W=245;break}if((gb|0)!=(eb|0)){Ib=eb;W=245}}else{Ib=gb;W=245}while(0);if((W|0)==245){W=0;c[fb>>2]=Ib}Hb=Hb+1|0}while((Hb|0)!=(m|0));break}default:{if((ib+-1|0)>>>0<2)Jb=0;else{gb=0;while(1){tf(s,r,Gb,a[(c[c[t>>2]>>2]|0)+8+gb>>0]|0,ua,n,g,h,ib,1,0,0)|0;gb=gb+1|0;if((gb|0)==(m|0))break d}}do{gb=c[c[t>>2]>>2]|0;eb=tf(s,r,Gb,a[gb+8+Jb>>0]|0,ua,n,g,h,ib,1,0,0)|0;cb=p+(Jb<<2)|0;e:do if(na)c[cb>>2]=c[gb+24+(Jb<<2)>>2];else{c[cb>>2]=0;if((eb|0)<=0)break;bb=c[gb+24+(Jb<<2)>>2]|0;hb=0;while(1){Kb=c[n+(hb<<2)>>2]|0;hb=hb+1|0;if((bb|0)!=(Kb|0))break;if((hb|0)>=(eb|0))break e}c[cb>>2]=Kb}while(0);Jb=Jb+1|0}while((Jb|0)!=(m|0))}}}while(0);jb=u+20+(ib*12|0)|0;if(!(uf(s,r,Gb,u+20+(ib*12|0)+4|0,o,p,Ta,Oa,q)|0)){W=250;break}if(y){na=u+20+((ib+2|0)*12|0)|0;c[na>>2]=c[jb>>2];c[na+4>>2]=c[jb+4>>2];c[na+8>>2]=c[jb+8>>2]}if(nb){na=u+20+((ib+1|0)*12|0)|0;c[na>>2]=c[jb>>2];c[na+4>>2]=c[jb+4>>2];c[na+8>>2]=c[jb+8>>2]}ka=ka+rb|0}while((ka|0)<2);if((W|0)==250){W=0;c[ob>>2]=c[ob>>2]|1}fa=fa+qb|0}while((fa|0)<2);a[u+1>>0]=Gb;fa=u+60|0;qb=c[fa+4>>2]|0;ob=u+12|0;c[ob>>2]=c[fa>>2];c[ob+4>>2]=qb}while(0)}if((j|0)<=0){l=k;return}Gb=u+8|0;W=u+12|0;if((i|0)>0){Lb=z;Mb=0}else{l=k;return}while(1){z=0;do{Oa=Lb+(z*12|0)+8|0;Ta=d[Gb>>0]|d[Gb+1>>0]<<8;a[Oa>>0]=Ta;a[Oa+1>>0]=Ta>>8;Ta=W;Oa=c[Ta+4>>2]|0;p=Lb+(z*12|0)|0;c[p>>2]=c[Ta>>2];c[p+4>>2]=Oa;z=z+1|0}while((z|0)!=(i|0));Mb=Mb+1|0;if((Mb|0)==(j|0))break;else Lb=Lb+((c[w>>2]|0)*12|0)|0}l=k;return}Lb=c[e+13580>>2]|0;Mb=c[e+13576>>2]|0;W=a[u>>0]|0;Gb=(S(x,g)|0)+h|0;f:do if(a[f+4412>>0]|0){if(!(a[f+4413>>0]|0)){h=c[f+1200>>2]|0;g=c[f+1204>>2]|0;if(!((i|0)>0&(j|0)>0)){Nb=0;break}if(!h){x=0;while(1){z=0;do{a[g+(z+Gb+(S(c[w>>2]|0,x)|0))>>0]=0;z=z+1|0}while((z|0)!=(i|0));x=x+1|0;if((x|0)==(j|0)){Nb=0;break f}}}else{x=0;while(1){z=0;do{Oa=z+Gb+(S(c[w>>2]|0,x)|0)|0;a[g+Oa>>0]=a[h+Oa>>0]|0;z=z+1|0}while((z|0)!=(i|0));x=x+1|0;if((x|0)==(j|0)){Nb=0;break f}}}}x=e+16|0;h=e+20|0;g=c[x>>2]|0;z=c[h>>2]|0;Oa=0;do{p=Oa<<24>>24;Ta=d[(p>>1)+(f+4417)>>0]|0;o=(256-Ta+(S(Ta,g)|0)|0)>>>8;if((z|0)<0){db(q);Ob=c[h>>2]|0}else Ob=z;Ta=c[q>>2]|0;Jb=o<<24;if(Ta>>>0<Jb>>>0){Pb=0;Qb=o;Rb=Ta}else{Pb=1;Qb=(c[x>>2]|0)-o|0;Rb=Ta-Jb|0}Jb=d[1280+Qb>>0]|0;g=Qb<<Jb;z=Ob-Jb|0;c[q>>2]=Rb<<Jb;c[h>>2]=z;c[x>>2]=g;Oa=a[29056+(Pb+p)>>0]|0}while(Oa<<24>>24>0);g=0-(Oa<<24>>24)|0;if((j|0)>0?(x=g&255,z=f+1204|0,(i|0)>0):0){h=0;do{p=0;do{a[(c[z>>2]|0)+(p+Gb+(S(c[w>>2]|0,h)|0))>>0]=x;p=p+1|0}while((p|0)!=(i|0));h=h+1|0}while((h|0)!=(j|0));Nb=g}else Nb=g}else Nb=0;while(0);a[u+4>>0]=Nb;a[u+3>>0]=qf(s,r,Nb<<24>>24,q)|0;a[u+2>>0]=rf(s,r,1,q)|0;a[u+8>>0]=0;a[u+9>>0]=-1;switch(W<<24>>24){case 0:{W=e+16|0;r=e+20|0;s=0;do{Nb=Bd(u,Lb,s)|0;j=Nb&255;Nb=(Ad(u,Mb,s)|0)&255;Sb=c[W>>2]|0;Tb=c[r>>2]|0;i=0;do{w=i<<24>>24;Gb=d[(w>>1)+(26626+(j*90|0)+(Nb*9|0))>>0]|0;f=(256-Gb+(S(Gb,Sb)|0)|0)>>>8;if((Tb|0)<0){db(q);Ub=c[r>>2]|0}else Ub=Tb;Gb=c[q>>2]|0;Pb=f<<24;if(Gb>>>0<Pb>>>0){Vb=0;Wb=f;Xb=Gb}else{Vb=1;Wb=(c[W>>2]|0)-f|0;Xb=Gb-Pb|0}Pb=d[1280+Wb>>0]|0;Sb=Wb<<Pb;Yb=Xb<<Pb;Tb=Ub-Pb|0;c[q>>2]=Yb;c[r>>2]=Tb;c[W>>2]=Sb;i=a[27664+(Vb+w)>>0]|0}while(i<<24>>24>0);a[u+20+(s*12|0)>>0]=0-(i&255);s=s+1|0}while((s|0)!=4);s=a[u+56>>0]|0;a[u+1>>0]=s;Zb=Sb;_b=Tb;$b=Yb;ac=s;bc=r;cc=W;dc=q;break}case 1:{W=Bd(u,Lb,0)|0;r=W&255;W=(Ad(u,Mb,0)|0)&255;s=e+16|0;Yb=e+20|0;Tb=c[s>>2]|0;Sb=c[Yb>>2]|0;Vb=0;do{Ub=Vb<<24>>24;Xb=d[(Ub>>1)+(26626+(r*90|0)+(W*9|0))>>0]|0;Wb=(256-Xb+(S(Xb,Tb)|0)|0)>>>8;if((Sb|0)<0){db(q);ec=c[Yb>>2]|0}else ec=Sb;Xb=c[q>>2]|0;Nb=Wb<<24;if(Xb>>>0<Nb>>>0){fc=0;gc=Wb;hc=Xb}else{fc=1;gc=(c[s>>2]|0)-Wb|0;hc=Xb-Nb|0}Nb=d[1280+gc>>0]|0;Tb=gc<<Nb;Sb=ec-Nb|0;c[q>>2]=hc<<Nb;c[Yb>>2]=Sb;c[s>>2]=Tb;Vb=a[27664+(fc+Ub)>>0]|0}while(Vb<<24>>24>0);fc=0-(Vb&255)&255;a[u+44>>0]=fc;a[u+20>>0]=fc;fc=Bd(u,Lb,1)|0;Vb=fc&255;fc=(Ad(u,Mb,1)|0)&255;Tb=c[s>>2]|0;Sb=c[Yb>>2]|0;hc=0;do{ec=hc<<24>>24;gc=d[(ec>>1)+(26626+(Vb*90|0)+(fc*9|0))>>0]|0;W=(256-gc+(S(gc,Tb)|0)|0)>>>8;if((Sb|0)<0){db(q);ic=c[Yb>>2]|0}else ic=Sb;gc=c[q>>2]|0;r=W<<24;if(gc>>>0<r>>>0){jc=0;kc=W;lc=gc}else{jc=1;kc=(c[s>>2]|0)-W|0;lc=gc-r|0}r=d[1280+kc>>0]|0;Tb=kc<<r;mc=lc<<r;Sb=ic-r|0;c[q>>2]=mc;c[Yb>>2]=Sb;c[s>>2]=Tb;hc=a[27664+(jc+ec)>>0]|0}while(hc<<24>>24>0);jc=0-(hc&255)&255;a[u+1>>0]=jc;a[u+56>>0]=jc;a[u+32>>0]=jc;Zb=Tb;_b=Sb;$b=mc;ac=jc;bc=Yb;cc=s;dc=q;break}case 2:{s=Bd(u,Lb,0)|0;Yb=s&255;s=(Ad(u,Mb,0)|0)&255;jc=e+16|0;mc=e+20|0;Sb=c[jc>>2]|0;Tb=c[mc>>2]|0;hc=0;do{ic=hc<<24>>24;lc=d[(ic>>1)+(26626+(Yb*90|0)+(s*9|0))>>0]|0;kc=(256-lc+(S(lc,Sb)|0)|0)>>>8;if((Tb|0)<0){db(q);nc=c[mc>>2]|0}else nc=Tb;lc=c[q>>2]|0;fc=kc<<24;if(lc>>>0<fc>>>0){oc=0;pc=kc;qc=lc}else{oc=1;pc=(c[jc>>2]|0)-kc|0;qc=lc-fc|0}fc=d[1280+pc>>0]|0;Sb=pc<<fc;Tb=nc-fc|0;c[q>>2]=qc<<fc;c[mc>>2]=Tb;c[jc>>2]=Sb;hc=a[27664+(oc+ic)>>0]|0}while(hc<<24>>24>0);oc=0-(hc&255)&255;a[u+32>>0]=oc;a[u+20>>0]=oc;oc=Bd(u,Lb,2)|0;hc=oc&255;oc=(Ad(u,Mb,2)|0)&255;Sb=c[jc>>2]|0;Tb=c[mc>>2]|0;qc=0;do{nc=qc<<24>>24;pc=d[(nc>>1)+(26626+(hc*90|0)+(oc*9|0))>>0]|0;s=(256-pc+(S(pc,Sb)|0)|0)>>>8;if((Tb|0)<0){db(q);rc=c[mc>>2]|0}else rc=Tb;pc=c[q>>2]|0;Yb=s<<24;if(pc>>>0<Yb>>>0){sc=0;tc=s;uc=pc}else{sc=1;tc=(c[jc>>2]|0)-s|0;uc=pc-Yb|0}Yb=d[1280+tc>>0]|0;Sb=tc<<Yb;vc=uc<<Yb;Tb=rc-Yb|0;c[q>>2]=vc;c[mc>>2]=Tb;c[jc>>2]=Sb;qc=a[27664+(sc+nc)>>0]|0}while(qc<<24>>24>0);sc=0-(qc&255)&255;a[u+1>>0]=sc;a[u+56>>0]=sc;a[u+44>>0]=sc;Zb=Sb;_b=Tb;$b=vc;ac=sc;bc=mc;cc=jc;dc=q;break}default:{jc=Bd(u,Lb,0)|0;Lb=jc&255;jc=(Ad(u,Mb,0)|0)&255;Mb=e+16|0;mc=e+20|0;e=c[Mb>>2]|0;sc=c[mc>>2]|0;vc=0;do{Tb=vc<<24>>24;Sb=d[(Tb>>1)+(26626+(Lb*90|0)+(jc*9|0))>>0]|0;qc=(256-Sb+(S(Sb,e)|0)|0)>>>8;if((sc|0)<0){db(q);wc=c[mc>>2]|0}else wc=sc;Sb=c[q>>2]|0;rc=qc<<24;if(Sb>>>0<rc>>>0){xc=0;yc=qc;zc=Sb}else{xc=1;yc=(c[Mb>>2]|0)-qc|0;zc=Sb-rc|0}rc=d[1280+yc>>0]|0;e=yc<<rc;Ac=zc<<rc;sc=wc-rc|0;c[q>>2]=Ac;c[mc>>2]=sc;c[Mb>>2]=e;vc=a[27664+(xc+Tb)>>0]|0}while(vc<<24>>24>0);xc=0-(vc&255)&255;a[u+1>>0]=xc;Zb=e;_b=sc;$b=Ac;ac=xc;bc=mc;cc=Mb;dc=q}}Mb=ac&255;ac=$b;$b=Zb;Zb=_b;_b=0;do{mc=_b<<24>>24;xc=d[(mc>>1)+(27526+(Mb*9|0))>>0]|0;Ac=(256-xc+(S(xc,$b)|0)|0)>>>8;if((Zb|0)<0){db(q);Bc=c[dc>>2]|0;Cc=c[bc>>2]|0}else{Bc=ac;Cc=Zb}xc=Ac<<24;if(Bc>>>0<xc>>>0){Dc=0;Ec=Ac;Fc=Bc}else{Dc=1;Ec=(c[cc>>2]|0)-Ac|0;Fc=Bc-xc|0}xc=d[1280+Ec>>0]|0;$b=Ec<<xc;ac=Fc<<xc;Zb=Cc-xc|0;c[dc>>2]=ac;c[bc>>2]=Zb;c[cc>>2]=$b;_b=a[27664+(Dc+mc)>>0]|0}while(_b<<24>>24>0);a[u+6>>0]=0-(_b&255);l=k;return}function qf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(a[b+3980>>0]|0?c[b+4060+(f<<2)>>2]&8|0:0){h=1;return h|0}f=c[e+296>>2]|0;i=c[e+300>>2]|0;if(!i)j=0;else j=a[i+3>>0]|0;if(!f)k=0;else k=a[f+3>>0]|0;f=k+j|0;j=d[(c[b+4108>>2]|0)+1967+f>>0]|0;b=g+4|0;k=(256-j+(S(c[b>>2]|0,j)|0)|0)>>>8;j=g+8|0;i=c[j>>2]|0;if((i|0)<0){db(g);l=c[j>>2]|0}else l=i;i=c[g>>2]|0;m=k<<24;if(i>>>0<m>>>0){n=0;o=k;p=i}else{n=1;o=(c[b>>2]|0)-k|0;p=i-m|0}m=d[1280+o>>0]|0;c[g>>2]=p<<m;c[j>>2]=l-m;c[b>>2]=o<<m;m=c[e+268>>2]|0;e=m+12776+(f<<3)+(n<<2)|0;if(!m){h=n;return h|0}c[e>>2]=(c[e>>2]|0)+1;h=n;return h|0}function rf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=c[b+616>>2]|0;i=a[c[c[e+292>>2]>>2]>>0]|0;j=a[29312+(i&255)>>0]|0;if(!((f|0)!=0&(h|0)==4&(i&255)>2)){i=a[29325+h>>0]|0;k=(j&255)<(i&255)?j:i;return k|0}i=c[e+268>>2]|0;h=c[e+296>>2]|0;f=c[e+300>>2]|0;e=j&255;l=(f|0)!=0;m=(h|0)!=0;if(l?(a[f+3>>0]|0)==0:0)n=d[f+2>>0]|0;else n=e;if(m?(a[h+3>>0]|0)==0:0)o=d[h+2>>0]|0;else o=e;h=m?o:n;o=((l?n:h)+h|0)>>>0>e>>>0&1;e=c[b+4108>>2]|0;switch(j<<24>>24){case 1:{p=e+1965+o|0;break}case 2:{p=e+1961+(o<<1)|0;break}case 3:{p=e+1955+(o*3|0)|0;break}default:p=0}e=d[p>>0]|0;b=g+4|0;h=(256-e+(S(c[b>>2]|0,e)|0)|0)>>>8;e=g+8|0;n=c[e>>2]|0;if((n|0)<0){db(g);q=c[e>>2]|0}else q=n;n=c[g>>2]|0;l=h<<24;if(n>>>0<l>>>0){r=0;s=h;t=n}else{r=1;s=(c[b>>2]|0)-h|0;t=n-l|0}l=d[1280+s>>0]|0;n=s<<l;s=t<<l;t=q-l|0;c[g>>2]=s;c[e>>2]=t;c[b>>2]=n;if((j&255)>1&(r|0)!=0){l=d[p+1>>0]|0;q=(256-l+(S(l,n)|0)|0)>>>8;if((t|0)<0){db(g);u=c[g>>2]|0;v=c[e>>2]|0}else{u=s;v=t}t=q<<24;if(u>>>0<t>>>0){w=0;x=q;y=u}else{w=1;x=(c[b>>2]|0)-q|0;y=u-t|0}t=d[1280+x>>0]|0;u=x<<t;x=y<<t;y=v-t|0;c[g>>2]=x;c[e>>2]=y;c[b>>2]=u;t=w+r|0;if((j&255)>2&(t|0)!=1){w=d[p+2>>0]|0;p=(256-w+(S(w,u)|0)|0)>>>8;if((y|0)<0){db(g);z=c[g>>2]|0;A=c[e>>2]|0}else{z=x;A=y}y=p<<24;if(z>>>0<y>>>0){B=0;C=p;D=z}else{B=1;C=(c[b>>2]|0)-p|0;D=z-y|0}y=d[1280+C>>0]|0;c[g>>2]=D<<y;c[e>>2]=A-y;c[b>>2]=C<<y;E=B+t|0}else E=t}else E=r;if(i|0){switch(j<<24>>24){case 1:{F=i+12744+(o<<3)|0;break}case 2:{F=i+12720+(o*12|0)|0;break}case 3:{F=i+12688+(o<<4)|0;break}default:F=0}o=F+(E<<2)|0;c[o>>2]=(c[o>>2]|0)+1}k=E&255;return k|0}function sf(a,b){a=a|0;b=b|0;return}function tf(e,f,g,h,i,j,k,l,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;if(!(c[e+748>>2]|0))q=0;else q=(c[(c[e+292>>2]|0)+4>>2]|0)+((S(c[e+608>>2]|0,k)|0)*12|0)+(l*12|0)|0;r=g<<24>>24!=11;s=j;c[s>>2]=0;c[s+4>>2]=0;a:do if(n){s=e+600|0;t=f+280|0;u=f+284|0;v=f+292|0;w=f+288|0;x=(m|0)>-1;y=c[i>>2]|0;z=y+k|0;A=(z|0)<0;do if(x){do if((!A?(B=c[i+4>>2]|0,C=B+l|0,(z|0)<(c[s>>2]|0)?(C|0)>=(c[t>>2]|0):0):0)?(C|0)<(c[u>>2]|0):0){C=c[(c[v>>2]|0)+((S(c[w>>2]|0,y)|0)+B<<2)>>2]|0;if((a[C+8>>0]|0)==h<<24>>24){if((d[C>>0]|0)<3)D=C+20+((c[21212+(m<<3)+(((B|0)==0&1)<<2)>>2]|0)*12|0)+4|0;else D=C+12|0;E=c[D>>2]|0;c[j>>2]=E;if(r){F=1;break a}else{G=E;H=1;I=1;break}}if((a[C+9>>0]|0)==h<<24>>24){if((d[C>>0]|0)<3)J=C+20+((c[21212+(m<<3)+(((B|0)==0&1)<<2)>>2]|0)*12|0)+8|0;else J=C+16|0;C=c[J>>2]|0;c[j>>2]=C;if(r){F=1;break a}else{G=C;H=1;I=1}}else{G=0;H=1;I=0}}else{G=0;H=0;I=0}while(0);C=c[i+8>>2]|0;B=C+k|0;if((B|0)<0){K=G;L=H;M=2;N=I;O=22;break a}E=i+12|0;P=c[E>>2]|0;Q=P+l|0;if(!((B|0)<(c[s>>2]|0)?(Q|0)>=(c[t>>2]|0):0)){K=G;L=H;M=2;N=I;O=22;break a}if((Q|0)>=(c[u>>2]|0)){K=G;L=H;M=2;N=I;O=22;break a}Q=c[(c[v>>2]|0)+((S(c[w>>2]|0,C)|0)+P<<2)>>2]|0;if((a[Q+8>>0]|0)==h<<24>>24){C=(d[Q>>0]|0)<3;if(!I){if(C)R=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+4|0;else R=Q+12|0;B=c[R>>2]|0;c[j>>2]=B;if(r){F=1;break a}else{T=B;O=20;break}}else{if(C)U=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+4|0;else U=Q+12|0;if((c[U>>2]|0)==(G|0)){K=G;L=1;M=2;N=1;O=22;break a}else{V=E;W=Q;O=39;break}}}if((a[Q+9>>0]|0)!=h<<24>>24){K=G;L=1;M=2;N=I;O=22;break a}C=(d[Q>>0]|0)<3;if(!I){if(C)X=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+8|0;else X=Q+16|0;B=c[X>>2]|0;c[j>>2]=B;if(r){F=1;break a}else{T=B;O=20;break}}else{if(C)Y=Q+20+((c[21212+(m<<3)+(((P|0)==0&1)<<2)>>2]|0)*12|0)+8|0;else Y=Q+16|0;if((c[Y>>2]|0)==(G|0)){K=G;L=1;M=2;N=1;O=22;break a}else{Z=E;_=Q;O=46;break}}}else{do if((!A?(Q=c[i+4>>2]|0,E=Q+l|0,(z|0)<(c[s>>2]|0)?(E|0)>=(c[t>>2]|0):0):0)?(E|0)<(c[u>>2]|0):0){E=c[(c[v>>2]|0)+((S(c[w>>2]|0,y)|0)+Q<<2)>>2]|0;if((a[E+8>>0]|0)==h<<24>>24){Q=c[E+12>>2]|0;c[j>>2]=Q;if(r){F=1;break a}else{$=Q;aa=1;ba=1;break}}if((a[E+9>>0]|0)==h<<24>>24){Q=c[E+16>>2]|0;c[j>>2]=Q;if(r){F=1;break a}else{$=Q;aa=1;ba=1}}else{$=0;aa=1;ba=0}}else{$=0;aa=0;ba=0}while(0);Q=c[i+8>>2]|0;E=Q+k|0;if((E|0)<0){K=$;L=aa;M=2;N=ba;O=22;break a}P=i+12|0;C=c[P>>2]|0;B=C+l|0;if(!((E|0)<(c[s>>2]|0)?(B|0)>=(c[t>>2]|0):0)){K=$;L=aa;M=2;N=ba;O=22;break a}if((B|0)>=(c[u>>2]|0)){K=$;L=aa;M=2;N=ba;O=22;break a}B=c[(c[v>>2]|0)+((S(c[w>>2]|0,Q)|0)+C<<2)>>2]|0;if((a[B+8>>0]|0)==h<<24>>24){C=c[B+12>>2]|0;if(!ba){c[j>>2]=C;if(r){F=1;break a}else{T=C;O=20;break}}if((C|0)==($|0)){K=$;L=1;M=2;N=1;O=22;break a}if(x){V=P;W=B;O=39;break}else{ca=B;O=41;break}}if((a[B+9>>0]|0)!=h<<24>>24){K=$;L=1;M=2;N=ba;O=22;break a}C=c[B+16>>2]|0;if(!ba){c[j>>2]=C;if(r){F=1;break a}else{T=C;O=20;break}}if((C|0)==($|0)){K=$;L=1;M=2;N=1;O=22;break a}if(x){Z=P;_=B;O=46}else{da=B;O=48}}while(0);if((O|0)==20){ea=T;fa=1;ga=2;ha=f+292|0;ia=f+284|0;ja=f+280|0;ka=e+600|0;la=f+288|0;ma=1;O=21;break}else if((O|0)==39)if((d[W>>0]|0)<3){na=W+20+((c[21212+(m<<3)+(((c[V>>2]|0)==0&1)<<2)>>2]|0)*12|0)+4|0;O=42}else{ca=W;O=41}else if((O|0)==46)if((d[_>>0]|0)<3){oa=_+20+((c[21212+(m<<3)+(((c[Z>>2]|0)==0&1)<<2)>>2]|0)*12|0)+8|0;O=49}else{da=_;O=48}if((O|0)==41){na=ca+12|0;O=42}else if((O|0)==48){oa=da+16|0;O=49}if((O|0)==42){c[j+4>>2]=c[na>>2];F=2;break}else if((O|0)==49){c[j+4>>2]=c[oa>>2];F=2;break}}else{K=0;L=0;M=0;N=0;O=22}while(0);b:do if((O|0)==22){oa=e+600|0;na=f+280|0;da=f+284|0;ca=f+292|0;_=f+288|0;if(r){Z=(N|0)==0;m=(N|0)==0;W=K;V=L;T=M;c:while(1){$=c[i+(T<<3)>>2]|0;ba=$+k|0;do if(((ba|0)>=0?(aa=c[i+(T<<3)+4>>2]|0,G=aa+l|0,(ba|0)<(c[oa>>2]|0)?(G|0)>=(c[na>>2]|0):0):0)?(G|0)<(c[da>>2]|0):0){G=c[(c[ca>>2]|0)+((S(c[_>>2]|0,$)|0)+aa<<2)>>2]|0;if((a[G+8>>0]|0)==h<<24>>24){aa=G+12|0;if(Z){pa=aa;break c}Y=c[aa>>2]|0;if((Y|0)==(K|0)){qa=K;ra=1;break}else{sa=Y;ta=N;O=58;break b}}if((a[G+9>>0]|0)==h<<24>>24){Y=G+16|0;if(m){pa=Y;break c}G=c[Y>>2]|0;if((G|0)!=(W|0)){ua=G;va=N;O=63;break b}else{qa=W;ra=1}}else{qa=W;ra=1}}else{qa=W;ra=V}while(0);T=T+1|0;if((T|0)>=8){wa=ra;xa=N;O=66;break b}else{W=qa;V=ra}}c[j+(N<<2)>>2]=c[pa>>2];F=1}else{ea=K;fa=L;ga=M;ha=ca;ia=da;ja=na;ka=oa;la=_;ma=N;O=21}}while(0);d:do if((O|0)==21){N=ea;M=ea;L=fa;K=ga;pa=ma;while(1){ra=c[i+(K<<3)>>2]|0;qa=ra+k|0;do if(((qa|0)>=0?(V=c[i+(K<<3)+4>>2]|0,W=V+l|0,(qa|0)<(c[ka>>2]|0)?(W|0)>=(c[ja>>2]|0):0):0)?(W|0)<(c[ia>>2]|0):0){W=c[(c[ha>>2]|0)+((S(c[la>>2]|0,ra)|0)+V<<2)>>2]|0;if((a[W+8>>0]|0)==h<<24>>24){V=c[W+12>>2]|0;if(pa)if((V|0)==(N|0)){ya=M;Aa=N;Ba=1;Ca=pa;break}else{sa=V;ta=pa;O=58;break d}else{c[j>>2]=V;ya=V;Aa=V;Ba=1;Ca=1;break}}if((a[W+9>>0]|0)==h<<24>>24){V=c[W+16>>2]|0;if(pa)if((V|0)==(M|0)){ya=M;Aa=M;Ba=1;Ca=pa;break}else{ua=V;va=pa;O=63;break d}else{c[j>>2]=V;ya=V;Aa=V;Ba=1;Ca=1;break}}else{ya=M;Aa=N;Ba=1;Ca=pa}}else{ya=M;Aa=N;Ba=L;Ca=pa}while(0);K=K+1|0;if((K|0)>=8){wa=Ba;xa=Ca;O=66;break}else{N=Aa;M=ya;L=Ba;pa=Ca}}}while(0);e:do if((O|0)==58){c[j+(ta<<2)>>2]=sa;Da=ta;O=110}else if((O|0)==63){c[j+(va<<2)>>2]=ua;Da=va;O=110}else if((O|0)==66){Ca=(q|0)!=0;do if(Ca){if((o|0)!=0&(c[e+4096>>2]|0)!=0)za[o&7](p,k);if((a[q+8>>0]|0)==h<<24>>24){if(!xa){c[j>>2]=c[q>>2];if(r){F=1;break e}else{Ea=1;break}}Ba=c[q>>2]|0;if((Ba|0)==(c[j>>2]|0)){Ea=xa;break}c[j+(xa<<2)>>2]=Ba;Da=xa;O=110;break e}if((a[q+9>>0]|0)==h<<24>>24){Ba=q+4|0;if(!xa){c[j>>2]=c[Ba>>2];if(r){F=1;break e}else{Ea=1;break}}ya=c[Ba>>2]|0;if((ya|0)!=(c[j>>2]|0)){c[j+(xa<<2)>>2]=ya;Da=xa;O=110;break e}else Ea=xa}else Ea=xa}else Ea=xa;while(0);f:do if(wa){ya=e+600|0;Ba=f+280|0;Aa=f+284|0;la=f+292|0;ha=f+288|0;ia=e+3924+(h<<24>>24<<2)|0;ja=0;ka=Ea;g:while(1){ma=c[i+(ja<<3)>>2]|0;ga=ma+k|0;do if((((ga|0)>=0?(fa=c[i+(ja<<3)+4>>2]|0,ea=fa+l|0,(ga|0)<(c[ya>>2]|0)?(ea|0)>=(c[Ba>>2]|0):0):0)?(ea|0)<(c[Aa>>2]|0):0)?(ea=c[(c[la>>2]|0)+((S(c[ha>>2]|0,ma)|0)+fa<<2)>>2]|0,fa=a[ea+8>>0]|0,fa<<24>>24>0):0){do if(fa<<24>>24!=h<<24>>24){pa=ea+12|0;L=b[pa>>1]|0;M=b[pa+2>>1]|0;pa=(c[e+3924+(fa<<24>>24<<2)>>2]|0)==(c[ia>>2]|0);Fa=((pa?M:0-(M&65535)&65535)&65535)<<16|(pa?L:0-(L&65535)&65535)&65535;if(!ka){c[j>>2]=Fa;if(r){F=1;break e}else{Ga=1;break}}else if((Fa|0)==(c[j>>2]|0)){Ga=ka;break}else{O=88;break g}}else Ga=ka;while(0);fa=a[ea+9>>0]|0;if(!(fa<<24>>24<1?1:fa<<24>>24==h<<24>>24)?(L=c[ea+16>>2]|0,(L|0)!=(c[ea+12>>2]|0)):0){pa=b[ea+16+2>>1]|0;M=(c[e+3924+(fa<<24>>24<<2)>>2]|0)==(c[ia>>2]|0);Ha=((M?pa:0-(pa&65535)&65535)&65535)<<16|(M?L:0-L|0)&65535;if(!Ga){c[j>>2]=Ha;if(r){F=1;break e}else{Ia=1;break}}else if((Ha|0)==(c[j>>2]|0)){Ia=Ga;break}else{O=94;break g}}else Ia=Ga}else Ia=ka;while(0);ja=ja+1|0;if((ja|0)>=8){Ja=Ia;break f}else ka=Ia}if((O|0)==88){c[j+(ka<<2)>>2]=Fa;Da=ka;O=110;break e}else if((O|0)==94){c[j+(Ga<<2)>>2]=Ha;Da=Ga;O=110;break e}}else Ja=Ea;while(0);do if(Ca){ja=a[q+8>>0]|0;ia=h<<24>>24;do if(ja<<24>>24>0?ja<<24>>24!=h<<24>>24:0){ha=b[q>>1]|0;la=b[q+2>>1]|0;Aa=(c[e+3924+(ja<<24>>24<<2)>>2]|0)==(c[e+3924+(ia<<2)>>2]|0);Ba=Aa?la:0-(la&65535)&65535;la=Aa?ha:0-(ha&65535)&65535;if(!Ja){b[j>>1]=la;b[j+2>>1]=Ba;if(r){F=1;break e}else{Ka=1;break}}if(((Ba&65535)<<16|la&65535|0)!=(c[j>>2]|0)){ha=j+(Ja<<2)|0;b[ha>>1]=la;b[ha+2>>1]=Ba;Da=Ja;O=110;break e}else Ka=Ja}else Ka=Ja;while(0);ja=a[q+9>>0]|0;ka=ja<<24>>24;if(!(ja<<24>>24<1?1:ja<<24>>24==h<<24>>24)?(ja=q+4|0,Ba=c[ja>>2]|0,(Ba|0)!=(c[q>>2]|0)):0){ha=b[ja+2>>1]|0;ja=(c[e+3924+(ka<<2)>>2]|0)==(c[e+3924+(ia<<2)>>2]|0);ka=ja?ha:0-(ha&65535)&65535;ha=ja?Ba:0-Ba|0;Ba=ha&65535;if(!Ka){b[j>>1]=Ba;b[j+2>>1]=ka;if(r){F=1;break e}else break}if(((ka&65535)<<16|ha&65535|0)!=(c[j>>2]|0)){ha=j+(Ka<<2)|0;b[ha>>1]=Ba;b[ha+2>>1]=ka;Da=Ka;O=110;break e}}}while(0);F=g<<24>>24==11?2:1}while(0);if((O|0)==110){O=Da+1|0;if((Da|0)>-1)F=O;else{La=O;return La|0}}O=(c[f+316>>2]|0)+-128|0;Da=(c[f+320>>2]|0)+128|0;g=(c[f+324>>2]|0)+-128|0;Ka=(c[f+328>>2]|0)+128|0;f=0;do{r=j+(f<<2)|0;e=r+2|0;q=b[e>>1]|0;b[e>>1]=(q|0)<(O|0)?O:(q|0)>(Da|0)?Da:q;q=b[r>>1]|0;b[r>>1]=(q|0)<(g|0)?g:(q|0)>(Ka|0)?Ka:q;f=f+1|0}while((f|0)!=(F|0));La=F;return La|0}function uf(f,g,h,i,j,k,m,n,o){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;p=l;l=l+16|0;q=p;switch(h<<24>>24){case 13:{h=c[g+268>>2]|0;g=h|0?h+12800|0:0;if((m|0)<0){r=1;l=p;return r|0}h=f+4108|0;f=o+4|0;s=o+8|0;t=(n|0)==0;n=q+2|0;u=0;v=1;while(1){w=i+(u<<2)|0;x=j+(u<<2)|0;y=c[h>>2]|0;z=c[f>>2]|0;A=c[s>>2]|0;B=0;do{C=B<<24>>24;D=d[(C>>1)+(y+1970)>>0]|0;E=(256-D+(S(D,z)|0)|0)>>>8;if((A|0)<0){db(o);F=c[s>>2]|0}else F=A;D=c[o>>2]|0;G=E<<24;if(D>>>0<G>>>0){H=0;I=E;J=D}else{H=1;I=(c[f>>2]|0)-E|0;J=D-G|0}G=d[1280+I>>0]|0;z=I<<G;A=F-G|0;c[o>>2]=J<<G;c[s>>2]=A;c[f>>2]=z;B=a[27928+(H+C)>>0]|0}while(B<<24>>24>0);z=0-(B<<24>>24)|0;if(!t?(A=b[x>>1]|0,C=A<<16>>16,((A<<16>>16>-1?C:0-C|0)|0)<64):0){C=b[x+2>>1]|0;A=C<<16>>16;K=((C<<16>>16>-1?A:0-A|0)|0)<64}else K=0;A=K&1;c[q>>2]=0;if((z|1|0)==3)b[q>>1]=vf(o,y+1973|0,A)|0;if((z|2|0)==3)b[n>>1]=vf(o,y+2006|0,A)|0;Hd(q,g);A=(e[q>>1]|0)+(e[x>>1]|0)&65535;b[w>>1]=A;z=(e[n>>1]|0)+(e[x+2>>1]|0)&65535;b[w+2>>1]=z;if((v|0)!=0&(A+16383&65535)<32766)L=(z+16383&65535)<32766;else L=0;z=L&1;if((u|0)==(m|0)){r=z;break}else{u=u+1|0;v=z}}l=p;return r|0}case 10:case 11:{v=k;k=c[v+4>>2]|0;u=i;c[u>>2]=c[v>>2];c[u+4>>2]=k;r=1;l=p;return r|0}case 12:{k=i;c[k>>2]=0;c[k+4>>2]=0;r=1;l=p;return r|0}default:{r=0;l=p;return r|0}}return 0}function vf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=d[e>>0]|0;h=b+4|0;i=(256-g+(S(c[h>>2]|0,g)|0)|0)>>>8;g=b+8|0;j=c[g>>2]|0;if((j|0)<0){db(b);k=c[g>>2]|0}else k=j;j=c[b>>2]|0;l=i<<24;if(j>>>0<l>>>0){m=0;n=i;o=j}else{m=1;n=(c[h>>2]|0)-i|0;o=j-l|0}l=d[1280+n>>0]|0;j=n<<l;n=o<<l;o=k-l|0;c[b>>2]=n;c[g>>2]=o;c[h>>2]=j;l=n;n=j;j=o;o=0;do{k=o<<24>>24;i=d[(k>>1)+(e+1)>>0]|0;p=(256-i+(S(i,n)|0)|0)>>>8;if((j|0)<0){db(b);q=c[b>>2]|0;r=c[g>>2]|0}else{q=l;r=j}i=p<<24;if(q>>>0<i>>>0){s=0;t=p;u=q}else{s=1;t=(c[h>>2]|0)-p|0;u=q-i|0}i=d[1280+t>>0]|0;n=t<<i;l=u<<i;j=r-i|0;c[b>>2]=l;c[g>>2]=j;c[h>>2]=n;o=a[27934+(s+k)>>0]|0}while(o<<24>>24>0);s=o<<24>>24;r=0-s|0;u=o<<24>>24==0;if(u){o=d[e+11>>0]|0;t=(256-o+(S(o,n)|0)|0)>>>8;if((j|0)<0){db(b);v=c[b>>2]|0;w=c[g>>2]|0}else{v=l;w=j}o=t<<24;if(v>>>0<o>>>0){x=0;y=t;z=v}else{x=1;y=(c[h>>2]|0)-t|0;z=v-o|0}o=d[1280+y>>0]|0;v=y<<o;y=z<<o;z=w-o|0;c[b>>2]=y;c[g>>2]=z;c[h>>2]=v;A=v;B=z;C=y;D=x;E=1}else{x=n;n=j;j=l;l=0;y=0;do{z=d[e+12+y>>0]|0;v=(256-z+(S(x,z)|0)|0)>>>8;if((n|0)<0){db(b);F=c[b>>2]|0;G=c[g>>2]|0}else{F=j;G=n}z=v<<24;if(F>>>0<z>>>0){H=0;I=v;J=F}else{H=1;I=(c[h>>2]|0)-v|0;J=F-z|0}z=d[1280+I>>0]|0;x=I<<z;j=J<<z;n=G-z|0;c[b>>2]=j;c[g>>2]=n;c[h>>2]=x;l=H<<y|l;y=y+1|0}while((y|0)<(r|0));A=x;B=n;C=j;D=l;E=(2<<2-s)+1|0}s=u?e+22+(D*3|0)|0:e+28|0;l=A;A=B;B=C;C=0;do{j=C<<24>>24;n=d[s+(j>>1)>>0]|0;x=(256-n+(S(n,l)|0)|0)>>>8;if((A|0)<0){db(b);K=c[b>>2]|0;L=c[g>>2]|0}else{K=B;L=A}n=x<<24;if(K>>>0<n>>>0){M=0;N=x;O=K}else{M=1;N=(c[h>>2]|0)-x|0;O=K-n|0}n=d[1280+N>>0]|0;l=N<<n;B=O<<n;A=L-n|0;c[b>>2]=B;c[g>>2]=A;c[h>>2]=l;C=a[27956+(M+j)>>0]|0}while(C<<24>>24>0);M=0-(C<<24>>24)|0;if(!f){P=1;Q=D<<3;R=M<<1;T=R|Q;U=T|P;V=E+U|0;W=(m|0)!=0;X=0-V|0;Y=W?X:V;return Y|0}f=d[(u?e+31|0:e+32|0)>>0]|0;e=(256-f+(S(f,l)|0)|0)>>>8;if((A|0)<0){db(b);Z=c[b>>2]|0;_=c[g>>2]|0}else{Z=B;_=A}A=e<<24;if(Z>>>0<A>>>0){$=0;aa=e;ba=Z}else{$=1;aa=(c[h>>2]|0)-e|0;ba=Z-A|0}A=d[1280+aa>>0]|0;c[b>>2]=ba<<A;c[g>>2]=_-A;c[h>>2]=aa<<A;P=$;Q=D<<3;R=M<<1;T=R|Q;U=T|P;V=E+U|0;W=(m|0)!=0;X=0-V|0;Y=W?X:V;return Y|0}function wf(a){a=a|0;var b=0;if((hb(a,8)|0)==73?(hb(a,8)|0)==131:0)b=(hb(a,8)|0)==66;else b=0;return b&1|0}function xf(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=(hb(a,16)|0)+1;c[d>>2]=(hb(a,16)|0)+1;return}function yf(a){a=a|0;var b=0,c=0,d=0;b=gb(a)|0;c=(gb(a)|0)<<1|b;if((c|0)<=2){d=c;return d|0}d=(gb(a)|0)+c|0;return d|0}function zf(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,za=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Va=0,Xa=0,Za=0,_a=0,$a=0,ab=0,bb=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0;i=l;l=l+3440|0;j=i+240|0;k=i+232|0;m=i+224|0;n=i+216|0;o=i+208|0;p=i+200|0;q=i+192|0;r=i+184|0;s=i+176|0;t=i+168|0;u=i+160|0;v=i+152|0;w=i+144|0;x=i+136|0;y=i+128|0;z=i+120|0;A=i+112|0;B=i+104|0;C=i+96|0;D=i+88|0;E=i+80|0;F=i+72|0;G=i+64|0;H=i+56|0;I=i+48|0;J=i+40|0;K=i+32|0;L=i+24|0;M=i+16|0;N=i+280|0;O=i+264|0;P=i+244|0;Q=i+3352|0;R=e+432|0;c[P+8>>2]=0;c[P+16>>2]=5;c[P+12>>2]=R;S=e+18704|0;T=c[S>>2]|0;U=g;W=U-f|0;X=(W|0)<80?W:80;if(!T){Y=f;Z=g}else{Ga[T&63](c[e+18708>>2]|0,f,Q,X);Y=Q;Z=Q+X|0}c[P>>2]=Y;c[P+4>>2]=Z;Z=e+17836|0;Y=c[Z>>2]|0;X=e+996|0;Q=e+992|0;c[Q>>2]=c[X>>2];T=e+1012|0;W=e+1013|0;a[W>>0]=a[T>>0]|0;if((hb(P,2)|0)!=2)Sa(R,5,29992,i);_=gb(P)|0;$=(gb(P)|0)<<1|_;if(($|0)>2)aa=(gb(P)|0)+$|0;else aa=$;$=e+17780|0;c[$>>2]=aa;if(aa>>>0>1)Sa(R,5,30013,i+8|0);aa=gb(P)|0;c[e+1008>>2]=aa;do if(aa){_=c[e+732+((hb(P,3)|0)<<2)>>2]|0;if(!((_|0)>=0?(c[Y+12+(_*160|0)>>2]|0)>=1:0)){c[M>>2]=_;Sa(R,5,30043,M)}ba=e+988|0;ca=c[ba>>2]|0;if((ca|0)>-1?(da=Y+12+(ca*160|0)|0,ca=c[da>>2]|0,(ca|0)>0):0)c[da>>2]=ca+-1;c[ba>>2]=_;ca=Y+12+(_*160|0)|0;c[ca>>2]=(c[ca>>2]|0)+1;c[e+17860>>2]=0;c[e+4372>>2]=0;c[e+1e3>>2]=1;if(!(c[e+17864>>2]|0)){ea=ba;fa=0}else{c[e+764>>2]=c[e+732>>2];c[e+768>>2]=c[e+736>>2];c[e+772>>2]=c[e+740>>2];c[e+776>>2]=c[e+744>>2];c[e+780>>2]=c[e+748>>2];c[e+784>>2]=c[e+752>>2];c[e+788>>2]=c[e+756>>2];c[e+792>>2]=c[e+760>>2];ea=ba;fa=0}}else{c[X>>2]=gb(P)|0;ba=e+1e3|0;c[ba>>2]=gb(P)|0;ca=gb(P)|0;_=e+17792|0;c[_>>2]=ca;do if(!(c[X>>2]|0)){if(!(((hb(P,8)|0)==73?(hb(P,8)|0)==131:0)?(hb(P,8)|0)==66:0))Sa(R,5,30086,L);Bf(R,P);c[e+17860>>2]=255;c[e+796>>2]=-1;c[e+800>>2]=0;c[e+860>>2]=-1;c[e+864>>2]=0;c[e+924>>2]=-1;c[e+928>>2]=0;Cf(R,P);da=e+18720|0;if(!(c[da>>2]|0))ga=0;else{ha=e+732|0;c[ha>>2]=-1;c[ha+4>>2]=-1;c[ha+8>>2]=-1;c[ha+12>>2]=-1;c[ha+16>>2]=-1;c[ha+20>>2]=-1;c[ha+24>>2]=-1;c[ha+28>>2]=-1;c[da>>2]=0;ga=0}}else{if(!(c[ba>>2]|0)){da=gb(P)|0;ia=c[_>>2]|0;ja=da}else{ia=ca;ja=0}da=ja&255;a[T>>0]=da;if(!ia){ha=hb(P,2)|0;ka=a[T>>0]|0;la=ha}else{ka=da;la=0}c[e+1020>>2]=la;if(ka<<24>>24){if(!(((hb(P,8)|0)==73?(hb(P,8)|0)==131:0)?(hb(P,8)|0)==66:0))Sa(R,5,30086,K);if(!(c[$>>2]|0)){c[e+680>>2]=1;c[e+684>>2]=0;c[e+712>>2]=1;c[e+716>>2]=1;c[e+17784>>2]=8}else Bf(R,P);c[e+17860>>2]=hb(P,8)|0;Cf(R,P);da=e+18720|0;if(!(c[da>>2]|0)){ga=0;break}ha=e+732|0;c[ha>>2]=-1;c[ha+4>>2]=-1;c[ha+8>>2]=-1;c[ha+12>>2]=-1;c[ha+16>>2]=-1;c[ha+20>>2]=-1;c[ha+24>>2]=-1;c[ha+28>>2]=-1;c[da>>2]=0;ga=0;break}da=e+18720|0;if((c[da>>2]|0)==1)ga=1;else{c[e+17860>>2]=hb(P,8)|0;ha=c[e+732+((hb(P,3)|0)<<2)>>2]|0;ma=e+796|0;c[ma>>2]=ha;na=e+800|0;c[na>>2]=Y+12+(ha*160|0)+28;c[e+4360>>2]=gb(P)|0;ha=c[e+732+((hb(P,3)|0)<<2)>>2]|0;oa=e+860|0;c[oa>>2]=ha;pa=e+864|0;c[pa>>2]=Y+12+(ha*160|0)+28;c[e+4364>>2]=gb(P)|0;ha=c[e+732+((hb(P,3)|0)<<2)>>2]|0;qa=e+924|0;c[qa>>2]=ha;ra=e+928|0;c[ra>>2]=Y+12+(ha*160|0)+28;c[e+4368>>2]=gb(P)|0;ha=c[Z>>2]|0;if(gb(P)|0)if((c[ma>>2]|0)==-1){Sa(R,7,30110,J);sa=44}else{ta=0;sa=42}else sa=44;do if((sa|0)==44){if(gb(P)|0){if((c[oa>>2]|0)!=-1){ta=1;sa=42;break}Sa(R,7,30110,C)}if(gb(P)|0){if((c[qa>>2]|0)!=-1){ta=2;sa=42;break}Sa(R,7,30110,B)}ua=(hb(P,16)|0)+1|0;va=(hb(P,16)|0)+1|0;wa=ua}while(0);if((sa|0)==42){ua=c[e+796+(ta<<6)+4>>2]|0;va=c[ua+12>>2]|0;wa=c[ua+8>>2]|0}if((wa|0)<1|(va|0)<1)Sa(R,7,30138,I);ua=wa<<1;xa=va<<1;za=c[ma>>2]|0;if((za|0)==-1)Ba=0;else{Ca=c[na>>2]|0;Da=c[Ca+8>>2]|0;Ea=c[Ca+12>>2]|0;Ba=(Ea<<4|0)>=(va|0)&(((Da<<4|0)<(wa|0)|((ua|0)<(Da|0)|(xa|0)<(Ea|0)))^1)}if((c[oa>>2]|0)==-1)Fa=0;else{Ea=c[pa>>2]|0;Da=c[Ea+8>>2]|0;Ca=c[Ea+12>>2]|0;Fa=(Ca<<4|0)>=(va|0)&(((Da<<4|0)<(wa|0)|((ua|0)<(Da|0)|(xa|0)<(Ca|0)))^1)}if((c[qa>>2]|0)==-1)Ha=0;else{Ca=c[ra>>2]|0;Da=c[Ca+8>>2]|0;Ea=c[Ca+12>>2]|0;Ha=(Ea<<4|0)>=(va|0)&(((Da<<4|0)<(wa|0)|((ua|0)<(Da|0)|(xa|0)<(Ea|0)))^1)}if(Ba|Fa|Ha)Ia=za;else{Sa(R,7,30157,H);Ia=c[ma>>2]|0}za=e+17784|0;Ea=e+712|0;xa=e+716|0;if(!((Ia|0)!=-1?(Da=c[na>>2]|0,((c[Da+92>>2]|0)==(c[za>>2]|0)?(c[Da+84>>2]|0)==(c[Ea>>2]|0):0)&(c[Da+88>>2]|0)==(c[xa>>2]|0)):0))Sa(R,7,30191,G);if(!((c[oa>>2]|0)!=-1?(Da=c[pa>>2]|0,((c[Da+92>>2]|0)==(c[za>>2]|0)?(c[Da+84>>2]|0)==(c[Ea>>2]|0):0)&(c[Da+88>>2]|0)==(c[xa>>2]|0)):0))Sa(R,7,30191,E);if(!((c[qa>>2]|0)!=-1?(Da=c[ra>>2]|0,((c[Da+92>>2]|0)==(c[za>>2]|0)?(c[Da+84>>2]|0)==(c[Ea>>2]|0):0)&(c[Da+88>>2]|0)==(c[xa>>2]|0)):0))Sa(R,7,30191,D);Df(R,wa,va);Da=e+688|0;ua=e+696|0;c[ua>>2]=c[Da>>2];Ca=e+692|0;Ja=e+700|0;c[Ja>>2]=c[Ca>>2];if(gb(P)|0){c[ua>>2]=(hb(P,16)|0)+1;c[Ja>>2]=(hb(P,16)|0)+1}Ka=e+988|0;La=c[Ka>>2]|0;if(Ya((c[Z>>2]|0)+12+(La*160|0)+28|0,c[Da>>2]|0,c[Ca>>2]|0,c[Ea>>2]|0,c[xa>>2]|0,32,c[e+17808>>2]|0,ha+12+(La*160|0)+16|0,c[ha+4>>2]|0,c[ha>>2]|0)|0)Sa(R,2,30238,F);La=c[Ka>>2]|0;c[ha+12+(La*160|0)+112>>2]=c[Ea>>2];c[ha+12+(La*160|0)+116>>2]=c[xa>>2];c[ha+12+(La*160|0)+120>>2]=c[za>>2];c[ha+12+(La*160|0)+124>>2]=c[e+680>>2];c[ha+12+(La*160|0)+128>>2]=c[e+684>>2];c[ha+12+(La*160|0)+132>>2]=c[ua>>2];c[ha+12+(La*160|0)+136>>2]=c[Ja>>2];c[e+1016>>2]=gb(P)|0;if(!(gb(P)|0))Ma=a[30270+(hb(P,2)|0)>>0]|0;else Ma=4;a[e+1212>>0]=Ma;Ja=c[na>>2]|0;de(e+804|0,c[Ja+8>>2]|0,c[Ja+12>>2]|0,c[Da>>2]|0,c[Ca>>2]|0);Ja=c[pa>>2]|0;de(e+868|0,c[Ja+8>>2]|0,c[Ja+12>>2]|0,c[Da>>2]|0,c[Ca>>2]|0);Ja=c[ra>>2]|0;de(e+932|0,c[Ja+8>>2]|0,c[Ja+12>>2]|0,c[Da>>2]|0,c[Ca>>2]|0);ga=c[da>>2]|0}}while(0);ca=e+988|0;ba=c[ca>>2]|0;Ca=c[Z>>2]|0;c[Ca+12+(ba*160|0)+124>>2]=c[e+680>>2];c[Ca+12+(ba*160|0)+128>>2]=c[e+684>>2];c[Ca+12+(ba*160|0)+132>>2]=c[e+696>>2];c[Ca+12+(ba*160|0)+136>>2]=c[e+700>>2];if(ga|0)Sa(R,7,30274,A);if(!(c[_>>2]|0)){c[e+4352>>2]=gb(P)|0;ba=gb(P)|0;c[e+17796>>2]=ba;if(!ba)qh(e+4552|0,0,13224)|0}else{c[e+4352>>2]=0;c[e+17796>>2]=1}c[e+4548>>2]=hb(P,2)|0;ba=c[e+17860>>2]|0;if(ba){Ca=ba;ba=0;do{if(!(Ca&1)){Da=c[e+732+(ba<<2)>>2]|0;c[e+764+(ba<<2)>>2]=Da;Na=Da}else{c[e+764+(ba<<2)>>2]=c[ca>>2];Da=Y+12+((c[ca>>2]|0)*160|0)|0;c[Da>>2]=(c[Da>>2]|0)+1;Na=c[e+732+(ba<<2)>>2]|0}Da=Y+12+(Na*160|0)|0;if((Na|0)>-1)c[Da>>2]=(c[Da>>2]|0)+1;ba=ba+1|0;Ca=Ca>>1}while((Ca|0)!=0);if((ba|0)<8){Oa=ba;sa=91}}else{Oa=0;sa=91}if((sa|0)==91)while(1){sa=0;Ca=c[e+732+(Oa<<2)>>2]|0;c[e+764+(Oa<<2)>>2]=Ca;Da=Y+12+(Ca*160|0)|0;if((Ca|0)>-1)c[Da>>2]=(c[Da>>2]|0)+1;Oa=Oa+1|0;if((Oa|0)==8)break;else sa=91}c[e+18724>>2]=1;if(!(((c[X>>2]|0)!=0?(a[T>>0]|0)==0:0)?!(c[_>>2]|0):0))Gd(R);c[e+4372>>2]=hb(P,6)|0;c[e+4380>>2]=hb(P,3)|0;ba=e+4389|0;a[ba>>0]=0;Da=(gb(P)|0)&255;a[e+4388>>0]=Da;if(Da<<24>>24?(Da=(gb(P)|0)&255,a[ba>>0]=Da,Da<<24>>24):0){if(gb(P)|0)a[e+4390>>0]=ib(P,6)|0;if(gb(P)|0)a[e+4391>>0]=ib(P,6)|0;if(gb(P)|0)a[e+4392>>0]=ib(P,6)|0;if(gb(P)|0)a[e+4393>>0]=ib(P,6)|0;if(gb(P)|0)a[e+4398>>0]=ib(P,6)|0;if(gb(P)|0)a[e+4399>>0]=ib(P,6)|0}Da=e+1052|0;c[Da>>2]=hb(P,8)|0;if(!(gb(P)|0))Pa=0;else Pa=ib(P,4)|0;ba=e+1056|0;c[ba>>2]=Pa;if(!(gb(P)|0))Qa=0;else Qa=ib(P,4)|0;Ca=e+1060|0;c[Ca>>2]=Qa;if(!(gb(P)|0))Ra=0;else Ra=ib(P,4)|0;Ja=e+1064|0;c[Ja>>2]=Ra;La=e+17784|0;c[e+17788>>2]=c[La>>2];if((c[Da>>2]|0)==0?(c[ba>>2]|0)==0:0)Va=(c[Ca>>2]|Ra|0)==0;else Va=0;c[e+420>>2]=Va&1;ua=e+4412|0;za=e+4413|0;a[za>>0]=0;xa=e+4414|0;a[xa>>0]=0;Ea=(gb(P)|0)&255;a[ua>>0]=Ea;do if(!(Ea<<24>>24))sa=156;else{Ka=(gb(P)|0)&255;a[za>>0]=Ka;do if(Ka<<24>>24){if(!(gb(P)|0))Xa=-1;else Xa=(hb(P,8)|0)&255;a[e+4417>>0]=Xa;if(!(gb(P)|0))Za=-1;else Za=(hb(P,8)|0)&255;a[e+4418>>0]=Za;if(!(gb(P)|0))_a=-1;else _a=(hb(P,8)|0)&255;a[e+4419>>0]=_a;if(!(gb(P)|0))$a=-1;else $a=(hb(P,8)|0)&255;a[e+4420>>0]=$a;if(!(gb(P)|0))ab=-1;else ab=(hb(P,8)|0)&255;a[e+4421>>0]=ab;if(!(gb(P)|0))bb=-1;else bb=(hb(P,8)|0)&255;a[e+4422>>0]=bb;if(!(gb(P)|0))jb=-1;else jb=(hb(P,8)|0)&255;a[e+4423>>0]=jb;kb=(gb(P)|0)&255;a[e+4416>>0]=kb;if(!(kb<<24>>24)){kb=e+4424|0;a[kb>>0]=255;a[kb+1>>0]=255;a[kb+2>>0]=255;break}if(!(gb(P)|0))lb=-1;else lb=(hb(P,8)|0)&255;a[e+4424>>0]=lb;if(!(gb(P)|0))mb=-1;else mb=(hb(P,8)|0)&255;a[e+4425>>0]=mb;if(!(gb(P)|0))nb=-1;else nb=(hb(P,8)|0)&255;a[e+4426>>0]=nb}while(0);Ka=(gb(P)|0)&255;a[xa>>0]=Ka;if(Ka<<24>>24){a[e+4415>>0]=gb(P)|0;he(ua);Ka=0;do{da=0;do{do if(!(gb(P)|0))ob=0;else{ie(ua,Ka,da);ra=je(da)|0;pa=((V(ra|0)|0)^31)+1|0;na=hb(P,(ra|0)==0?0:pa)|0;pa=(na|0)>(ra|0)?ra:na;if(!(ke(da)|0)){ob=pa;break}na=(gb(P)|0)!=0;ob=na?0-pa|0:pa}while(0);le(ua,Ka,da,ob);da=da+1|0}while((da|0)!=4);Ka=Ka+1|0}while((Ka|0)!=8)}if(!(a[ua>>0]|0)){sa=156;break}else pb=0;do{Ka=Je(ua,pb,c[Da>>2]|0)|0;b[e+1068+(pb<<2)>>1]=He(Ka,c[ba>>2]|0,c[La>>2]|0)|0;b[e+1068+(pb<<2)+2>>1]=Ie(Ka,0,c[La>>2]|0)|0;b[e+1100+(pb<<2)>>1]=He(Ka,c[Ca>>2]|0,c[La>>2]|0)|0;b[e+1100+(pb<<2)+2>>1]=Ie(Ka,c[Ja>>2]|0,c[La>>2]|0)|0;pb=pb+1|0}while((pb|0)!=8)}while(0);if((sa|0)==156){ua=c[Da>>2]|0;b[e+1068>>1]=He(ua,c[ba>>2]|0,c[La>>2]|0)|0;b[e+1070>>1]=Ie(ua,0,c[La>>2]|0)|0;b[e+1100>>1]=He(ua,c[Ca>>2]|0,c[La>>2]|0)|0;b[e+1102>>1]=Ie(ua,c[Ja>>2]|0,c[La>>2]|0)|0}pe(c[e+1040>>2]|0,N,O);ua=c[N>>2]|0;xa=(c[O>>2]|0)-ua|0;za=e+17800|0;c[za>>2]=ua;a:do if(!xa)qb=ua;else{Ea=xa;while(1){Ea=Ea+-1|0;_=(gb(P)|0)==0;Ka=c[za>>2]|0;if(_){qb=Ka;break a}_=Ka+1|0;c[za>>2]=_;if(!Ea){qb=_;break}}}while(0);if((qb|0)>6)Sa(R,7,30334,z);za=gb(P)|0;xa=e+17804|0;c[xa>>2]=za;if(za|0){za=gb(P)|0;c[xa>>2]=(c[xa>>2]|0)+za}za=hb(P,16)|0;if(za|0){ea=ca;fa=za;break}Sa(R,7,30365,y);ea=ca;fa=0}while(0);y=e+17804|0;z=c[y>>2]|0;qb=1<<z;pb=e+17800|0;ob=c[pb>>2]|0;nb=1<<ob;mb=c[ea>>2]|0;lb=c[Z>>2]|0;jb=lb+12+(mb*160|0)+28|0;c[e+344>>2]=jb;if(!fa){c[h>>2]=f+((c[$>>2]|0)>>>0<3?1:2);l=i;return}$=f+(fb(P)|0)|0;if((U-$|0)>>>0<fa>>>0)Sa(R,7,30385,x);x=e+17792|0;if(((((c[x>>2]|0)==0?(c[e+688>>2]|0)==(c[e+704>>2]|0):0)?(c[e+692>>2]|0)==(c[e+708>>2]|0):0)?(a[W>>0]|0)==0:0)?(c[e+1004>>2]|0)!=0:0)rb=(c[Q>>2]|0)!=0;else rb=0;c[e+1180>>2]=rb&1;Cd(e,c[e+712>>2]|0,c[e+716>>2]|0);rb=e+4540|0;Q=e+4544|0;W=e+4548|0;vh(c[rb>>2]|0,(c[Q>>2]|0)+((c[W>>2]|0)*2044|0)|0,2044)|0;P=c[rb>>2]|0;if(!(c[P+2040>>2]|0)){Sa(R,7,30427,w);sb=c[rb>>2]|0}else sb=P;P=e+424|0;c[P>>2]=0;w=e+18708|0;if(cb(N,$,fa,c[S>>2]|0,c[w>>2]|0)|0)Sa(e+432|0,2,30458,v);v=N+4|0;f=N+8|0;if(!(c[e+420>>2]|0)){bb=c[v>>2]|0;ab=c[f>>2]|0;$a=((bb<<7)+128|0)>>>8;if((ab|0)<0){db(N);tb=c[v>>2]|0;ub=c[f>>2]|0}else{tb=bb;ub=ab}ab=c[N>>2]|0;bb=$a<<24;_a=ab>>>0<bb>>>0;Za=_a?$a:tb-$a|0;$a=d[1280+Za>>0]|0;tb=Za<<$a;Za=ab-(_a?0:bb)<<$a;bb=ub-$a|0;c[N>>2]=Za;c[f>>2]=bb;c[v>>2]=tb;$a=((tb<<7)+128|0)>>>8;if((bb|0)<0){db(N);vb=c[N>>2]|0;wb=c[v>>2]|0;xb=c[f>>2]|0}else{vb=Za;wb=tb;xb=bb}bb=$a<<24;tb=vb>>>0<bb>>>0;Za=tb?$a:wb-$a|0;$a=d[1280+Za>>0]|0;wb=Za<<$a;Za=vb-(tb?0:bb)<<$a;bb=xb-$a|0;c[N>>2]=Za;c[f>>2]=bb;c[v>>2]=wb;$a=(tb^1)&1|(_a?0:2);if(($a|0)==3){_a=((wb<<7)+128|0)>>>8;if((bb|0)<0){db(N);yb=c[N>>2]|0;zb=c[v>>2]|0;Ab=c[f>>2]|0}else{yb=Za;zb=wb;Ab=bb}bb=_a<<24;wb=yb>>>0<bb>>>0;Za=wb?_a:zb-_a|0;_a=d[1280+Za>>0]|0;c[N>>2]=yb-(wb?0:bb)<<_a;c[f>>2]=Ab-_a;c[v>>2]=Za<<_a;_a=e+1048|0;c[_a>>2]=wb?3:4;if(wb)Bb=3;else{bg(N,sb+1965|0);bg(N,sb+1966|0);bg(N,sb+1961|0);bg(N,sb+1962|0);bg(N,sb+1963|0);bg(N,sb+1964|0);bg(N,sb+1955|0);bg(N,sb+1956|0);bg(N,sb+1957|0);bg(N,sb+1958|0);bg(N,sb+1959|0);bg(N,sb+1960|0);Bb=c[_a>>2]|0}}else{Cb=$a;sa=189}}else{Cb=0;sa=189}if((sa|0)==189){c[e+1048>>2]=Cb;Bb=Cb}Cb=a[29325+Bb>>0]|0;Bb=0;do{$a=Bb&255;_a=c[v>>2]|0;wb=((_a<<7)+128|0)>>>8;Za=c[f>>2]|0;if((Za|0)<0){db(N);Db=c[v>>2]|0;Eb=c[f>>2]|0}else{Db=_a;Eb=Za}Za=c[N>>2]|0;_a=wb<<24;Ab=Za>>>0<_a>>>0;bb=Ab?wb:Db-wb|0;wb=d[1280+bb>>0]|0;c[N>>2]=Za-(Ab?0:_a)<<wb;c[f>>2]=Eb-wb;c[v>>2]=bb<<wb;if(!Ab){Ab=0;do{wb=0;do{bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+1|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+2|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+3|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+4|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+5|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+6|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+7|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+8|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+18|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+19|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+20|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+21|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+22|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+23|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+24|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+25|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+26|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+27|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+28|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+29|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+30|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+31|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+32|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+33|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+34|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+35|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+36|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+37|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+38|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+39|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+40|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+41|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+42|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+43|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+44|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+45|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+46|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+47|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+48|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+49|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+50|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+51|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+52|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+53|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+54|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+55|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+56|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+57|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+58|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+59|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+60|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+61|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+62|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+63|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+64|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+65|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+66|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+67|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+68|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+69|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+70|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+71|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+72|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+73|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+74|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+75|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+76|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+77|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+78|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+79|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+80|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+81|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+82|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+83|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+84|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+85|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+86|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+87|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+88|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+89|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+90|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+91|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+92|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+93|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+94|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+95|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+96|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+97|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+98|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+99|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+100|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+101|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+102|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+103|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+104|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+105|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+106|0);bg(N,sb+174+($a*432|0)+(Ab*216|0)+(wb*108|0)+107|0);wb=wb+1|0}while((wb|0)!=2);Ab=Ab+1|0}while((Ab|0)!=2)}Bb=Bb+1<<24>>24}while((Bb&255)<=(Cb&255));bg(N,sb+1967|0);bg(N,sb+1968|0);bg(N,sb+1969|0);if(c[X>>2]|0?(a[T>>0]|0)==0:0){bg(N,sb+1910|0);bg(N,sb+1911|0);bg(N,sb+1912|0);bg(N,sb+1913|0);bg(N,sb+1914|0);bg(N,sb+1915|0);bg(N,sb+1916|0);bg(N,sb+1917|0);bg(N,sb+1918|0);bg(N,sb+1919|0);bg(N,sb+1920|0);bg(N,sb+1921|0);bg(N,sb+1922|0);bg(N,sb+1923|0);bg(N,sb+1924|0);bg(N,sb+1925|0);bg(N,sb+1926|0);bg(N,sb+1927|0);bg(N,sb+1928|0);bg(N,sb+1929|0);bg(N,sb+1930|0);if((a[e+1212>>0]|0)==4){bg(N,sb+1902|0);bg(N,sb+1903|0);bg(N,sb+1904|0);bg(N,sb+1905|0);bg(N,sb+1906|0);bg(N,sb+1907|0);bg(N,sb+1908|0);bg(N,sb+1909|0)}bg(N,sb+1931|0);bg(N,sb+1932|0);bg(N,sb+1933|0);bg(N,sb+1934|0);Cb=e+4360|0;Bb=1;while(1){if((Bb|0)>=3){sa=212;break}Bb=Bb+1|0;if((c[e+4356+(Bb<<2)>>2]|0)!=(c[Cb>>2]|0)){sa=206;break}}do if((sa|0)==206){Bb=c[v>>2]|0;Eb=((Bb<<7)+128|0)>>>8;Db=c[f>>2]|0;if((Db|0)<0){db(N);Fb=c[v>>2]|0;Gb=c[f>>2]|0}else{Fb=Bb;Gb=Db}Db=c[N>>2]|0;Bb=Eb<<24;Ab=Db>>>0<Bb>>>0;$a=Ab?Eb:Fb-Eb|0;Eb=d[1280+$a>>0]|0;ca=$a<<Eb;$a=Db-(Ab?0:Bb)<<Eb;Bb=Gb-Eb|0;c[N>>2]=$a;c[f>>2]=Bb;c[v>>2]=ca;if(!Ab){Ab=((ca<<7)+128|0)>>>8;if((Bb|0)<0){db(N);Hb=c[N>>2]|0;Ib=c[v>>2]|0;Jb=c[f>>2]|0}else{Hb=$a;Ib=ca;Jb=Bb}Bb=Ab<<24;ca=Hb>>>0<Bb>>>0;$a=ca?Ab:Ib-Ab|0;Ab=d[1280+$a>>0]|0;c[N>>2]=Hb-(ca?0:Bb)<<Ab;c[f>>2]=Jb-Ab;c[v>>2]=$a<<Ab;Ab=e+4536|0;c[Ab>>2]=ca?1:2;$a=c[Cb>>2]|0;do if(($a|0)!=(c[e+4364>>2]|0)){Bb=e+4532|0;if(($a|0)==(c[e+4368>>2]|0)){a[Bb>>0]=2;Kb=1;Lb=3;break}else{a[Bb>>0]=1;Kb=2;Lb=3;break}}else{a[e+4532>>0]=3;Kb=1;Lb=2}while(0);a[e+4533>>0]=Kb;a[e+4534>>0]=Lb;$a=c[rb>>2]|0;if(ca){Mb=$a;sa=220;break}bg(N,$a+1935|0);bg(N,$a+1936|0);bg(N,$a+1937|0);bg(N,$a+1938|0);bg(N,$a+1939|0);if((c[Ab>>2]|0)==1){Mb=$a;sa=220}else{Nb=$a;Ob=Ab;sa=219}}else sa=212}while(0);if((sa|0)==212){Lb=e+4536|0;c[Lb>>2]=0;Nb=c[rb>>2]|0;Ob=Lb;sa=219}if((sa|0)==219){bg(N,Nb+1940|0);bg(N,Nb+1941|0);bg(N,Nb+1942|0);bg(N,Nb+1943|0);bg(N,Nb+1944|0);bg(N,Nb+1945|0);bg(N,Nb+1946|0);bg(N,Nb+1947|0);bg(N,Nb+1948|0);bg(N,Nb+1949|0);if(!(c[Ob>>2]|0))Pb=0;else{Mb=Nb;sa=220}}if((sa|0)==220){bg(N,Mb+1950|0);bg(N,Mb+1951|0);bg(N,Mb+1952|0);bg(N,Mb+1953|0);bg(N,Mb+1954|0);Pb=0}do{bg(N,sb+(Pb*9|0)|0);bg(N,sb+(Pb*9|0)+1|0);bg(N,sb+(Pb*9|0)+2|0);bg(N,sb+(Pb*9|0)+3|0);bg(N,sb+(Pb*9|0)+4|0);bg(N,sb+(Pb*9|0)+5|0);bg(N,sb+(Pb*9|0)+6|0);bg(N,sb+(Pb*9|0)+7|0);bg(N,sb+(Pb*9|0)+8|0);Pb=Pb+1|0}while((Pb|0)!=4);Qb=0;do{bg(N,sb+126+(Qb*3|0)|0);bg(N,sb+126+(Qb*3|0)+1|0);bg(N,sb+126+(Qb*3|0)+2|0);Qb=Qb+1|0}while((Qb|0)!=16);Qb=c[e+1016>>2]|0;Ef(sb+1970|0,3,N);Ef(sb+1973|0,1,N);Ef(sb+1974|0,10,N);Ef(sb+1984|0,1,N);Ef(sb+1985|0,10,N);Ef(sb+2006|0,1,N);Ef(sb+2007|0,10,N);Ef(sb+2017|0,1,N);Ef(sb+2018|0,10,N);Ef(sb+1995|0,3,N);Ef(sb+1998|0,3,N);Ef(sb+2001|0,3,N);Ef(sb+2028|0,3,N);Ef(sb+2031|0,3,N);Ef(sb+2034|0,3,N);if(Qb|0){Ef(sb+2004|0,1,N);Ef(sb+2005|0,1,N);Ef(sb+2037|0,1,N);Ef(sb+2038|0,1,N)}}sb=((c[f>>2]|0)+-33|0)>>>0<1073741791;c[lb+12+(mb*160|0)+140>>2]=sb&1;if(sb)Sa(R,7,30492,u);u=e+4372|0;sb=c[u>>2]|0;if(sb|0?(c[e+17812>>2]|0)==0:0)re(R,sb);sb=e+17864|0;if((c[sb>>2]|0)!=0?(c[e+17796>>2]|0)!=0:0){mb=c[(c[e+17872>>2]|0)+12>>2]|0;if(!(c[e+4352>>2]|0))Rb=0;else{vh((c[Q>>2]|0)+((c[W>>2]|0)*2044|0)|0,c[rb>>2]|0,2044)|0;Rb=1}lb=c[e+17868>>2]|0;c[lb+152>>2]=-1;c[lb+156>>2]=-1;c[mb+40>>2]=1;Sb=Rb}else Sb=0;Rb=e+17904|0;mb=c[Rb>>2]|0;lb=qb<<ob;if((mb|0)!=0?(lb|0)==(c[e+18680>>2]|0):0)Tb=e+18712|0;else{ob=e+18712|0;qb=c[ob>>2]|0;Wa(mb);mb=Ta(32,(((qb|0)>1?qb:0)+lb|0)*16016|0)|0;c[Rb>>2]=mb;if(!mb)Sa(R,2,30539,t);c[e+18680>>2]=lb;Tb=ob}ob=(nb|0)>1&((z|0)==0&(c[Tb>>2]|0)>1);z=$+fa|0;fa=rd()|0;$=e+1040|0;nb=(c[$>>2]|0)+7&-8;lb=c[pb>>2]|0;pb=1<<lb;t=c[y>>2]|0;y=1<<t;do if(ob){mb=c[Tb>>2]|0;qb=(mb|0)<(pb|0);f=qb?mb:pb;Qb=e+18676|0;do if(!(c[Qb>>2]|0)){Pb=Ua(mb*24|0)|0;Mb=e+17900|0;c[Mb>>2]=Pb;if(!Pb)Sa(R,2,30580,s);if((mb|0)<=0)break;Pb=mb+-1|0;Nb=fa+4|0;Ob=0;do{Lb=(c[Mb>>2]|0)+(Ob*24|0)|0;c[Qb>>2]=(c[Qb>>2]|0)+1;ya[c[fa>>2]&15](Lb);do if((Ob|0)<(Pb|0)){if(Aa[c[Nb>>2]&7](Lb)|0)break;Sa(R,1,30617,r)}while(0);Ob=Ob+1|0}while((Ob|0)!=(mb|0))}while(0);mb=(f|0)>0;if(mb){Ab=e+17900|0;ca=e+18680|0;Ob=fa+8|0;Nb=e+17796|0;Pb=0;do{Mb=c[Ab>>2]|0;Lb=c[Rb>>2]|0;Kb=(c[ca>>2]|0)+Pb|0;Aa[c[Ob>>2]&7](Mb+(Pb*24|0)|0)|0;vh(Lb+(Kb*16016|0)+13280|0,e|0,432)|0;c[Lb+(Kb*16016|0)+13548>>2]=c[Nb>>2]|0?0:Lb+(Kb*16016|0)+48|0;c[Mb+(Pb*24|0)+8>>2]=24;c[Mb+(Pb*24|0)+12>>2]=Lb+(Kb*16016|0);c[Mb+(Pb*24|0)+16>>2]=e;Pb=Pb+1|0}while((Pb|0)<(f|0))}qh(c[e+17844>>2]|0,0,nb*6|0)|0;qh(c[e+17840>>2]|0,0,nb|0)|0;Be(R);Pb=e+17908|0;Gf(e,z,g,pb,y,Pb);Wg(Pb,pb,12,25);if(qb){if((pb|0)>2){Nb=pb+-2|0;Ob=0;do{ca=e+17908+(Ob*12|0)|0;c[N>>2]=c[ca>>2];c[N+4>>2]=c[ca+4>>2];c[N+8>>2]=c[ca+8>>2];Ab=e+17908+(Nb*12|0)|0;c[ca>>2]=c[Ab>>2];c[ca+4>>2]=c[Ab+4>>2];c[ca+8>>2]=c[Ab+8>>2];c[Ab>>2]=c[N>>2];c[Ab+4>>2]=c[N+4>>2];c[Ab+8>>2]=c[N+8>>2];Ob=Ob+2|0;Nb=Nb+-2|0}while((Ob|0)<(Nb|0))}}else{c[N>>2]=c[Pb>>2];c[N+4>>2]=c[Pb+4>>2];c[N+8>>2]=c[Pb+8>>2];Nb=pb+-1|0;Ch(Pb|0,e+17920|0,Nb*12|0)|0;Ob=e+17908+(Nb*12|0)|0;c[Ob>>2]=c[N>>2];c[Ob+4>>2]=c[N+4>>2];c[Ob+8>>2]=c[N+8>>2]}Ob=e+17796|0;Nb=e+17900|0;if(mb&(c[Ob>>2]|0)==0){qb=0;do{qh((c[(c[Nb>>2]|0)+(qb*24|0)+12>>2]|0)+48|0,0,13224)|0;qb=qb+1|0}while((qb|0)<(f|0))}qb=(pb|0)/(f|0)|0;Pb=(pb|0)%(f|0)|0;if(mb){Ab=f+-1|0;ca=fa+16|0;Mb=fa+12|0;Kb=0;Lb=0;do{Cb=c[Nb>>2]|0;v=Cb+(Lb*24|0)|0;Jb=c[Cb+(Lb*24|0)+12>>2]|0;c[Jb+4>>2]=Kb;Kb=Kb+qb+((Lb+Pb|0)/(f|0)|0)|0;c[Jb+8>>2]=Kb+-1;c[Jb>>2]=g;c[Cb+(Lb*24|0)+20>>2]=0;if((Lb|0)==(Ab|0))ya[c[ca>>2]&15](v);else ya[c[Mb>>2]&15](v);Lb=Lb+1|0}while((Lb|0)<(f|0));Ub=f}else Ub=0;Lb=fa+8|0;Mb=Ub;while(1){if((Mb|0)<=0){Vb=0;break}ca=c[Nb>>2]|0;Wb=Mb+-1|0;Ab=c[ca+(Wb*24|0)+12>>2]|0;Kb=(Aa[c[Lb>>2]&7](ca+(Wb*24|0)|0)|0)==0&1;c[P>>2]=Kb|c[P>>2];Xb=c[Ab>>2]|0;if(!Xb)Mb=Wb;else{sa=270;break}}do if((sa|0)==270){if((Mb|0)>1)Yb=Wb;else{Vb=Xb;break}do{Ab=Yb;Yb=Yb+-1|0;Kb=(Aa[c[Lb>>2]&7]((c[Nb>>2]|0)+(Yb*24|0)|0)|0)==0&1;c[P>>2]=Kb|c[P>>2]}while((Ab|0)>1);Vb=Xb}while(0);if(mb&(c[Ob>>2]|0)==0){Lb=e+4552|0;Mb=0;do{Ge(Lb,(c[(c[Nb>>2]|0)+(Mb*24|0)+12>>2]|0)+48|0,1);Mb=Mb+1|0}while((Mb|0)<(f|0))}c[h>>2]=Vb;if(c[P>>2]|0){Sa(R,7,30653,q);break}if(c[e+17812>>2]|0)break;De(jb,R,e,c[u>>2]|0,0,0,c[Nb>>2]|0,c[Qb>>2]|0,e+18684|0)}else{do if(c[u>>2]|0){f=e+17812|0;do if(!(c[f>>2]|0)){Mb=e+17888|0;if(c[Mb>>2]|0)break;Lb=Ta(32,284)|0;c[Mb>>2]=Lb;if(!Lb)Sa(R,2,30693,p);c[e+17884>>2]=26;if((c[Tb>>2]|0)<=1)break;if(Aa[c[fa+4>>2]&7](e+17876|0)|0)break;Sa(R,1,30733,o)}while(0);if(!(c[u>>2]|0))break;if(c[f>>2]|0)break;Lb=c[e+17888>>2]|0;Aa[c[fa+8>>2]&7](e+17876|0)|0;Ae(Lb,(c[Z>>2]|0)+12+((c[ea>>2]|0)*160|0)+28|0,R,e)}while(0);Qb=e+17844|0;qh(c[Qb>>2]|0,0,nb*6|0)|0;Nb=e+17840|0;qh(c[Nb>>2]|0,0,nb|0)|0;Be(R);Gf(e,z,g,pb,y,N);if((t|0)!=31){Lb=(lb|0)==31;Mb=e+17796|0;Ob=e+4552|0;mb=e+1100|0;Ab=e+1068|0;Kb=e+1044|0;if(!Lb){ca=0;do{Pb=ca<<lb;qb=0;do{v=(c[Rb>>2]|0)+(Pb*16016|0)+(qb*16016|0)|0;Cb=v+13280|0;vh(Cb|0,e|0,432)|0;c[Cb+424>>2]=0;c[Cb+268>>2]=c[Mb>>2]|0?0:Ob;Jb=v+13712|0;qh(Jb|0,0,2048)|0;oe(Cb+272|0,R,ca,qb);Hb=c[N+(ca*768|0)+(qb*12|0)>>2]|0;Ib=c[N+(ca*768|0)+(qb*12|0)+4>>2]|0;Gb=c[S>>2]|0;Fb=c[w>>2]|0;if(!((Ib|0)!=0&(U-Hb|0)>>>0>=Ib>>>0))Sa(R,7,30768,n);if(cb(v+12|0,Hb,Ib,Gb,Fb)|0){c[m>>2]=1;Sa(R,2,30808,m)}Fb=Cb+332|0;c[Cb>>2]=Jb;c[Cb+348>>2]=c[Qb>>2];Gb=Cb+44|0;c[Gb>>2]=c[Ab>>2];c[Gb+4>>2]=c[Ab+4>>2];c[Gb+8>>2]=c[Ab+8>>2];c[Gb+12>>2]=c[Ab+12>>2];c[Gb+16>>2]=c[Ab+16>>2];c[Gb+20>>2]=c[Ab+20>>2];c[Gb+24>>2]=c[Ab+24>>2];c[Gb+28>>2]=c[Ab+28>>2];Gb=c[Qb>>2]|0;Ib=(c[$>>2]<<1)+14&-16;c[Fb>>2]=c[rb>>2];c[Cb+88>>2]=Jb;c[Cb+352>>2]=Gb+Ib;Ib=Cb+132|0;c[Ib>>2]=c[mb>>2];c[Ib+4>>2]=c[mb+4>>2];c[Ib+8>>2]=c[mb+8>>2];c[Ib+12>>2]=c[mb+12>>2];c[Ib+16>>2]=c[mb+16>>2];c[Ib+20>>2]=c[mb+20>>2];c[Ib+24>>2]=c[mb+24>>2];c[Ib+28>>2]=c[mb+28>>2];Ib=c[Qb>>2]|0;Gb=(c[$>>2]<<2)+28&-32;c[Fb>>2]=c[rb>>2];c[Cb+176>>2]=Jb;c[Cb+356>>2]=Ib+Gb;Gb=Cb+220|0;c[Gb>>2]=c[mb>>2];c[Gb+4>>2]=c[mb+4>>2];c[Gb+8>>2]=c[mb+8>>2];c[Gb+12>>2]=c[mb+12>>2];c[Gb+16>>2]=c[mb+16>>2];c[Gb+20>>2]=c[mb+20>>2];c[Gb+24>>2]=c[mb+24>>2];c[Gb+28>>2]=c[mb+28>>2];Gb=c[rb>>2]|0;Ib=c[Nb>>2]|0;Jb=c[Kb>>2]|0;Hb=Gb;v=(c[X>>2]|0)==0;c[Fb>>2]=Gb;c[Cb+408>>2]=Ib;c[Cb+288>>2]=Jb;c[Cb+428>>2]=R;do if(v)Zb=27616;else{if(a[T>>0]|0){Zb=27616;break}Zb=Hb+126|0}while(0);c[Cb+312>>2]=Zb;qb=qb+1|0}while((qb|0)<(pb|0));ca=ca+1|0}while((ca|0)<(y|0))}ca=O+4|0;Kb=e+17812|0;Nb=e+17876|0;mb=e+17888|0;Qb=e+1032|0;Ab=fa+8|0;Ob=fa+12|0;Mb=fa+16|0;qb=e+18716|0;Pb=pb+-1|0;f=O+8|0;Hb=O+12|0;v=0;do{me(O,R,v);Jb=c[O>>2]|0;b:do if((Jb|0)<(c[ca>>2]|0)){Ib=v<<lb;if(Lb){Gb=Jb;while(1){do if(c[u>>2]|0){if(c[Kb>>2]|0){sa=329;break}Fb=c[mb>>2]|0;if((Gb|0)<8)break;if((Gb+8|0)>=(c[Qb>>2]|0))break;Aa[c[Ab>>2]&7](Nb)|0;c[Fb+272>>2]=Gb+-8;c[Fb+276>>2]=Gb;if((c[Tb>>2]|0)>1){ya[c[Ob>>2]&15](Nb);sa=329;break}else{ya[c[Mb>>2]&15](Nb);sa=329;break}}else sa=329;while(0);do if((sa|0)==329?(sa=0,(c[sb>>2]|0)==0):0)break;while(0);Gb=Gb+8|0;if((Gb|0)>=(c[ca>>2]|0))break b}}else _b=Jb;do{Gb=0;do{Cb=(c[qb>>2]|0)==0?Gb:Pb-Gb|0;Fb=(c[Rb>>2]|0)+(Ib*16016|0)+(Cb*16016|0)|0;ne(O,R,Cb);Cb=Fb+13280|0;$a=Cb+360|0;Bb=$a+48|0;do{c[$a>>2]=0;$a=$a+4|0}while(($a|0)<(Bb|0));$a=Cb+412|0;c[$a>>2]=0;c[$a+4>>2]=0;$a=c[f>>2]|0;if(($a|0)<(c[Hb>>2]|0)){Bb=$a;do{If(Fb,e,_b,Bb,12,4);Bb=Bb+8|0}while((Bb|0)<(c[Hb>>2]|0))}Bb=c[P>>2]|c[Cb+424>>2];c[P>>2]=Bb;if(Bb|0)Sa(R,7,30843,k);Gb=Gb+1|0}while((pb|0)>(Gb|0));do if(c[u>>2]|0){if(c[Kb>>2]|0){sa=313;break}Gb=c[mb>>2]|0;if((_b|0)<8)break;if((_b+8|0)>=(c[Qb>>2]|0))break;Aa[c[Ab>>2]&7](Nb)|0;c[Gb+272>>2]=_b+-8;c[Gb+276>>2]=_b;if((c[Tb>>2]|0)>1){ya[c[Ob>>2]&15](Nb);sa=313;break}else{ya[c[Mb>>2]&15](Nb);sa=313;break}}else sa=313;while(0);do if((sa|0)==313?(sa=0,(c[sb>>2]|0)==0):0)break;while(0);_b=_b+8|0}while((_b|0)<(c[ca>>2]|0))}while(0);v=v+1|0}while((v|0)<(y|0))}do if(c[u>>2]|0){if(c[e+17812>>2]|0)break;v=e+17876|0;ca=c[e+17888>>2]|0;Aa[c[fa+8>>2]&7](v)|0;Nb=ca+276|0;c[ca+272>>2]=c[Nb>>2];c[Nb>>2]=c[e+1032>>2];ya[c[fa+16>>2]&15](v)}while(0);c[h>>2]=eb((c[Rb>>2]|0)+((y<<lb)*16016|0)+-16016+12|0)|0}while(0);do if(!(c[P>>2]|0)){if(!(c[x>>2]|0)){if(c[e+17796>>2]|0)break;Ed(R);if(!(c[X>>2]|0))break;if(a[T>>0]|0)break;Fd(R);Id(R,c[e+1016>>2]|0)}}else Sa(R,7,30653,j);while(0);if((Sb|0)!=0|(c[e+4352>>2]|0)==0){l=i;return}vh((c[Q>>2]|0)+((c[W>>2]|0)*2044|0)|0,c[rb>>2]|0,2044)|0;l=i;return}function Af(a){a=a|0;var b=0;b=l;l=l+16|0;Sa(a,7,31145,b);l=b;return}function Bf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+32|0;e=d+16|0;f=d+8|0;g=d;h=a+17348|0;if((c[h>>2]|0)>>>0>1){i=(gb(b)|0)!=0;j=i?12:10}else j=8;c[a+17352>>2]=j;j=hb(b,3)|0;c[a+248>>2]=j;if((j|0)==7){c[a+252>>2]=1;switch(c[h>>2]|0){case 3:case 1:break;default:{Sa(a,5,31101,d+24|0);l=d;return}}c[a+280>>2]=0;c[a+284>>2]=0;if(!(gb(b)|0)){l=d;return}Sa(a,5,31084,e);l=d;return}c[a+252>>2]=gb(b)|0;switch(c[h>>2]|0){case 3:case 1:break;default:{c[a+280>>2]=1;c[a+284>>2]=1;l=d;return}}h=a+280|0;c[h>>2]=gb(b)|0;e=gb(b)|0;c[a+284>>2]=e;if((e|0)==1&(c[h>>2]|0)==1)Sa(a,5,31040,g);if(!(gb(b)|0)){l=d;return}Sa(a,5,31084,f);l=d;return}function Cf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;d=l;l=l+16|0;e=a+17404|0;f=c[e>>2]|0;g=(hb(b,16)|0)+1|0;Df(a,g,(hb(b,16)|0)+1|0);g=a+256|0;h=a+264|0;c[h>>2]=c[g>>2];i=a+260|0;j=a+268|0;c[j>>2]=c[i>>2];if(gb(b)|0){c[h>>2]=(hb(b,16)|0)+1;c[j>>2]=(hb(b,16)|0)+1}b=a+556|0;k=c[b>>2]|0;m=a+280|0;n=a+284|0;if(Ya((c[e>>2]|0)+12+(k*160|0)+28|0,c[g>>2]|0,c[i>>2]|0,c[m>>2]|0,c[n>>2]|0,32,c[a+17376>>2]|0,f+12+(k*160|0)+16|0,c[f+4>>2]|0,c[f>>2]|0)|0)Sa(a,2,30238,d);k=c[b>>2]|0;c[f+12+(k*160|0)+112>>2]=c[m>>2];c[f+12+(k*160|0)+116>>2]=c[n>>2];c[f+12+(k*160|0)+120>>2]=c[a+17352>>2];c[f+12+(k*160|0)+124>>2]=c[a+248>>2];c[f+12+(k*160|0)+128>>2]=c[a+252>>2];c[f+12+(k*160|0)+132>>2]=c[h>>2];c[f+12+(k*160|0)+136>>2]=c[j>>2];l=d;return}\nfunction Df(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=e;h=a+256|0;if(!((c[h>>2]|0)==(b|0)?(c[a+260>>2]|0)==(d|0):0)){if((b+7>>3|0)<=(c[a+608>>2]|0)?(d+7>>3|0)<=(c[a+600>>2]|0):0)ud(a,b,d);else i=5;if((i|0)==5?wd(a,b,d)|0:0)Sa(a,2,30967,g);yd(a);c[h>>2]=b;c[a+260>>2]=d}d=a+296|0;b=c[d>>2]|0;h=c[b+4>>2]|0;g=a+600|0;if((h|0?(c[g>>2]|0)<=(c[b+8>>2]|0):0)?(c[a+608>>2]|0)<=(c[b+12>>2]|0):0){l=e;return}Wa(h);h=c[g>>2]|0;g=c[d>>2]|0;c[g+8>>2]=h;b=c[a+608>>2]|0;c[g+12>>2]=b;g=Va(S(b,h)|0,12)|0;c[(c[d>>2]|0)+4>>2]=g;if(g|0){l=e;return}Sa(a,2,31002,f);l=e;return}function Ef(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if((e|0)<=0)return;g=f+4|0;h=f+8|0;i=0;do{j=(((c[g>>2]|0)*252|0)+4|0)>>>8;k=c[h>>2]|0;if((k|0)<0){db(f);l=c[h>>2]|0}else l=k;k=c[f>>2]|0;m=j<<24;if(k>>>0<m>>>0){n=1;o=j;p=k}else{n=0;o=(c[g>>2]|0)-j|0;p=k-m|0}m=d[1280+o>>0]|0;k=o<<m;j=p<<m;q=l-m|0;c[f>>2]=j;c[h>>2]=q;c[g>>2]=k;if(!n){m=j;j=k;k=q;q=7;r=0;do{s=q;q=q+-1|0;t=((j<<7)+128|0)>>>8;if((k|0)<0){db(f);u=c[h>>2]|0;v=c[f>>2]|0}else{u=k;v=m}w=t<<24;if(v>>>0<w>>>0){x=0;y=t;z=v}else{x=1;y=(c[g>>2]|0)-t|0;z=v-w|0}w=d[1280+y>>0]|0;j=y<<w;m=z<<w;k=u-w|0;c[f>>2]=m;c[h>>2]=k;c[g>>2]=j;r=x<<q|r}while((s|0)>1);a[b+i>>0]=r<<1|1}i=i+1|0}while((i|0)!=(e|0));return}function Ff(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,fa=0,ga=0,ia=0,la=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0;e=l;l=l+32|0;f=e+8|0;g=e;h=4;i=ih(40)|0;c[i>>2]=0;j=e+20|0;k=e+16|0;m=e+12|0;c[j>>2]=b+13552;n=d+432|0;q=(1<<c[d+17800>>2])+-1|0;c[k>>2]=0;c[m>>2]=c[b+4>>2];r=b+15760|0;s=b+15848|0;c[s>>2]=1;i=th(b+15852|0,1,i|0,h|0)|0;h=D;o=0;t=o;o=0;if((t|0)!=0&(p|0)!=0){u=uh(c[t>>2]|0,i|0,h|0)|0;if(!u)ma(t|0,p|0);D=p}else u=-1;if((u|0)==1)v=D;else v=0;a:while(1){if(v|0){w=4;break}u=b+13704|0;c[u>>2]=0;t=b+13712|0;x=b+12|0;y=d+18704|0;z=d+18708|0;A=d+17844|0;B=d+1040|0;C=d+1100|0;E=d+4540|0;F=b+13612|0;G=b+13280|0;H=b+13628|0;I=b+13324|0;J=d+1068|0;K=b+13368|0;L=b+13632|0;M=b+13412|0;N=b+13456|0;O=b+13636|0;P=b+13500|0;Q=d+17840|0;R=d+1044|0;S=d+996|0;T=b+13688|0;U=b+13568|0;V=b+13708|0;W=b+13592|0;X=b+8|0;Y=b+13640|0;Z=b+13692|0;_=d+1012|0;while(1){$=c[m>>2]|0;qh(t|0,0,2048)|0;aa=d+17908+($*12|0)+8|0;o=0;ka(53,c[j>>2]|0,n|0,0,c[aa>>2]|0);ba=o;o=0;if((ba|0)!=0&(p|0)!=0){ca=uh(c[ba>>2]|0,i|0,h|0)|0;if(!ca)ma(ba|0,p|0);D=p}else ca=-1;if((ca|0)==1){v=D;continue a}ba=c[d+17908+($*12|0)>>2]|0;da=c[d+17908+($*12|0)+4>>2]|0;$=c[y>>2]|0;fa=c[z>>2]|0;if(!(da|0?((c[b>>2]|0)-ba|0)>>>0>=da>>>0:0)){o=0;ka(54,r|0,7,30768,g|0);ga=o;o=0;if((ga|0)!=0&(p|0)!=0){ia=uh(c[ga>>2]|0,i|0,h|0)|0;if(!ia)ma(ga|0,p|0);D=p}else ia=-1;if((ia|0)==1){v=D;continue a}}o=0;ga=ja(2,x|0,ba|0,da|0,$|0,fa|0)|0;fa=o;o=0;if((fa|0)!=0&(p|0)!=0){la=uh(c[fa>>2]|0,i|0,h|0)|0;if(!la)ma(fa|0,p|0);D=p}else la=-1;if((la|0)==1){v=D;continue a}if(ga|0){o=0;c[f>>2]=1;ka(54,r|0,2,30808,f|0);ga=o;o=0;if((ga|0)!=0&(p|0)!=0){na=uh(c[ga>>2]|0,i|0,h|0)|0;if(!na)ma(ga|0,p|0);D=p}else na=-1;if((na|0)==1){v=D;continue a}}c[G>>2]=t;c[H>>2]=c[A>>2];c[I>>2]=c[J>>2];c[I+4>>2]=c[J+4>>2];c[I+8>>2]=c[J+8>>2];c[I+12>>2]=c[J+12>>2];c[I+16>>2]=c[J+16>>2];c[I+20>>2]=c[J+20>>2];c[I+24>>2]=c[J+24>>2];c[I+28>>2]=c[J+28>>2];ga=c[A>>2]|0;fa=(c[B>>2]<<1)+14&-16;c[F>>2]=c[E>>2];c[K>>2]=t;c[L>>2]=ga+fa;c[M>>2]=c[C>>2];c[M+4>>2]=c[C+4>>2];c[M+8>>2]=c[C+8>>2];c[M+12>>2]=c[C+12>>2];c[M+16>>2]=c[C+16>>2];c[M+20>>2]=c[C+20>>2];c[M+24>>2]=c[C+24>>2];c[M+28>>2]=c[C+28>>2];fa=c[A>>2]|0;ga=(c[B>>2]<<2)+28&-32;c[F>>2]=c[E>>2];c[N>>2]=t;c[O>>2]=fa+ga;c[P>>2]=c[C>>2];c[P+4>>2]=c[C+4>>2];c[P+8>>2]=c[C+8>>2];c[P+12>>2]=c[C+12>>2];c[P+16>>2]=c[C+16>>2];c[P+20>>2]=c[C+20>>2];c[P+24>>2]=c[C+24>>2];c[P+28>>2]=c[C+28>>2];ga=c[E>>2]|0;fa=c[Q>>2]|0;$=c[R>>2]|0;da=ga;ba=(c[S>>2]|0)==0;c[F>>2]=ga;c[T>>2]=fa;c[U>>2]=$;c[V>>2]=n;if(!ba?(a[_>>0]|0)==0:0)oa=da+126|0;else oa=27616;c[W>>2]=oa;c[V>>2]=r;da=c[c[j>>2]>>2]|0;if((da|0)<(c[(c[j>>2]|0)+4>>2]|0)){ba=da;while(1){da=Y;$=da+48|0;do{c[da>>2]=0;da=da+4|0}while((da|0)<($|0));da=Z;c[da>>2]=0;c[da+4>>2]=0;da=c[(c[j>>2]|0)+8>>2]|0;if((da|0)<(c[(c[j>>2]|0)+12>>2]|0)){$=da;while(1){o=0;ha(1,b|0,d|0,ba|0,$|0,12,4);da=o;o=0;if((da|0)!=0&(p|0)!=0){pa=uh(c[da>>2]|0,i|0,h|0)|0;if(!pa)ma(da|0,p|0);D=p}else pa=-1;if((pa|0)==1){v=D;continue a}$=$+8|0;if(($|0)>=(c[(c[j>>2]|0)+12>>2]|0))break}}ba=ba+8|0;if((ba|0)>=(c[(c[j>>2]|0)+4>>2]|0))break}}if((c[aa>>2]|0)==(q|0)){o=0;ba=ea(5,x|0)|0;$=o;o=0;if(($|0)!=0&(p|0)!=0){qa=uh(c[$>>2]|0,i|0,h|0)|0;if(!qa)ma($|0,p|0);D=p}else qa=-1;if((qa|0)==1){v=D;continue a}c[k>>2]=ba}ra=(c[u>>2]|0)==0;if(!ra){w=27;break a}ba=c[m>>2]|0;c[m>>2]=ba+1;if((ba|0)>=(c[X>>2]|0)){w=27;break a}}}if((w|0)==4){c[s>>2]=0;c[b+13704>>2]=1;c[b>>2]=0;sa=0;jh(i|0);l=e;return sa|0}else if((w|0)==27){c[b>>2]=c[k>>2];sa=ra&1;jh(i|0);l=e;return sa|0}return 0}function Gf(a,b,e,f,g,h){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;i=l;l=l+32|0;j=i+24|0;k=i+16|0;m=i+8|0;n=i;o=i+28|0;if((g|0)<=0){l=i;return}p=(f|0)>0;q=g+-1|0;r=f+-1|0;s=a+432|0;t=a+18704|0;u=a+18708|0;a=e;e=o+1|0;v=o+2|0;w=o+3|0;x=b;b=0;while(1){a:do if(p){if((b|0)==(q|0)){y=0;z=x}else{A=0;B=x;while(1){c[h+(b*768|0)+(A*12|0)+8>>2]=A;C=c[t>>2]|0;D=c[u>>2]|0;if((a-B|0)>>>0<=3)Sa(s,7,30768,k);if(!C){E=B;F=E;G=(d[E+1>>0]|0)<<16|(d[E>>0]|0)<<24|(d[E+2>>0]|0)<<8|(d[E+3>>0]|0)}else{E=B;Ga[C&63](D,E,o,4);F=E;G=(d[e>>0]|0)<<16|(d[o>>0]|0)<<24|(d[v>>0]|0)<<8|(d[w>>0]|0)}E=F+4|0;D=E;if(G>>>0>(a-D|0)>>>0)Sa(s,7,30929,j);c[h+(b*768|0)+(A*12|0)>>2]=D;c[h+(b*768|0)+(A*12|0)+4>>2]=G;D=E+G|0;A=A+1|0;if((A|0)==(f|0)){H=D;break a}else B=D}}while(1){B=h+(q*768|0)+(y*12|0)|0;c[h+(q*768|0)+(y*12|0)+8>>2]=y;A=c[t>>2]|0;D=c[u>>2]|0;E=a-z|0;if((y|0)!=(r|0)){if(E>>>0<=3)Sa(s,7,30768,n);if(!A){C=z;I=C;J=(d[C+1>>0]|0)<<16|(d[C>>0]|0)<<24|(d[C+2>>0]|0)<<8|(d[C+3>>0]|0)}else{C=z;Ga[A&63](D,C,o,4);I=C;J=(d[e>>0]|0)<<16|(d[o>>0]|0)<<24|(d[v>>0]|0)<<8|(d[w>>0]|0)}C=I+4|0;if(J>>>0>(a-C|0)>>>0){Sa(s,7,30929,m);K=C;L=J}else{K=C;L=J}}else{K=z;L=E}c[B>>2]=K;c[h+(q*768|0)+(y*12|0)+4>>2]=L;B=K+L|0;y=y+1|0;if((y|0)==(f|0)){H=B;break}else z=B}}else H=x;while(0);b=b+1|0;if((b|0)==(g|0))break;else x=H}l=i;return}function Hf(a,b){a=a|0;b=b|0;return (c[b+4>>2]|0)-(c[a+4>>2]|0)|0}function If(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;j=i+-1|0;k=1<<j;l=k>>1;m=l+f|0;n=c[e+1032>>2]|0;o=(m|0)<(n|0);p=l+g|0;q=c[e+1040>>2]|0;r=(p|0)<(q|0);if(!((n|0)>(f|0)&(q|0)>(g|0)))return;q=b+13688|0;n=(f&7)+(b+13692)|0;s=(a[(c[q>>2]|0)+g>>0]|0)>>>j&1|j<<2|(a[n>>0]|0)>>>j<<1&2;t=c[b+13592>>2]|0;u=c[b+13548>>2]|0;v=b+12|0;do if(!(o&r)){w=o^1;if(r&w){x=d[t+(s*3|0)+1>>0]|0;y=b+16|0;z=(256-x+(S(c[y>>2]|0,x)|0)|0)>>>8;x=b+20|0;A=c[x>>2]|0;if((A|0)<0){db(v);B=c[x>>2]|0}else B=A;A=c[v>>2]|0;C=z<<24;if(A>>>0<C>>>0){D=1;E=z;F=A}else{D=3;E=(c[y>>2]|0)-z|0;F=A-C|0}C=d[1280+E>>0]|0;c[v>>2]=F<<C;c[x>>2]=B-C;c[y>>2]=E<<C;G=D;break}if(r|w)G=3;else{w=d[t+(s*3|0)+2>>0]|0;C=b+16|0;y=(256-w+(S(c[C>>2]|0,w)|0)|0)>>>8;w=b+20|0;x=c[w>>2]|0;if((x|0)<0){db(v);H=c[w>>2]|0}else H=x;x=c[v>>2]|0;A=y<<24;if(x>>>0<A>>>0){I=2;J=y;K=x}else{I=3;J=(c[C>>2]|0)-y|0;K=x-A|0}A=d[1280+J>>0]|0;c[v>>2]=K<<A;c[w>>2]=H-A;c[C>>2]=J<<A;G=I}}else{A=b+16|0;C=b+20|0;w=c[A>>2]|0;x=c[C>>2]|0;y=0;do{z=y<<24>>24;L=d[(z>>1)+(t+(s*3|0))>>0]|0;M=(256-L+(S(L,w)|0)|0)>>>8;if((x|0)<0){db(v);N=c[C>>2]|0}else N=x;L=c[v>>2]|0;O=M<<24;if(L>>>0<O>>>0){P=0;Q=M;R=L}else{P=1;Q=(c[A>>2]|0)-M|0;R=L-O|0}O=d[1280+Q>>0]|0;w=Q<<O;x=N-O|0;c[v>>2]=R<<O;c[C>>2]=x;c[A>>2]=w;y=a[27688+(P+z)>>0]|0}while(y<<24>>24>0);G=0-(y<<24>>24)|0}while(0);P=u+560+(s<<4)+(G<<2)|0;if(u|0)c[P>>2]=(c[P>>2]|0)+1;P=a[(h&255)+(29260+(G*13|0))>>0]|0;a:do if(!l){a[b+13544>>0]=1>>>(G>>>1&1);a[b+13545>>0]=1>>>(G&1);Jf(b,e,f,g,P,1,1)}else switch(G|0){case 0:{Jf(b,e,f,g,P,i,i);break a;break}case 1:{Jf(b,e,f,g,P,i,j);if(!o)break a;Jf(b,e,m,g,P,i,j);break a;break}case 2:{Jf(b,e,f,g,P,j,i);if(!r)break a;Jf(b,e,f,p,P,j,i);break a;break}case 3:{If(b,e,f,g,P,j);If(b,e,f,p,P,j);If(b,e,m,g,P,j);If(b,e,m,p,P,j);break a;break}default:break a}while(0);if((h&255)<=2)return;if(!(h<<24>>24==3|(G|0)!=3))return;G=P&255;qh((c[q>>2]|0)+g|0,a[29590+(G<<1)>>0]|0,k|0)|0;qh(n|0,a[29590+(G<<1)+1>>0]|0,k|0)|0;return}function Jf(f,g,h,i,j,k,m){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0;n=l;l=l+16|0;o=n+8|0;p=n;q=n+12|0;r=g+432|0;s=j&255;t=1<<k+-1;u=1<<m+-1;v=c[g+1040>>2]|0;w=v-i|0;x=(t|0)<(w|0)?t:w;w=c[g+1032>>2]|0;y=w-h|0;z=(u|0)<(y|0)?u:y;y=f+13280|0;A=c[g+1044>>2]|0;B=(S(A,h)|0)+i|0;C=(c[g+1168>>2]|0)+(B<<2)|0;D=f+13572|0;c[D>>2]=C;c[C>>2]=(c[g+1140>>2]|0)+(B*68|0);a[c[c[D>>2]>>2]>>0]=j;if((z|0)>0){B=0;do{C=(B|0)==0&1;if((C|0)<(x|0)){E=S(B,A)|0;F=C;do{C=c[D>>2]|0;c[C+(F+E<<2)>>2]=c[C>>2];F=F+1|0}while((F|0)!=(x|0))}B=B+1|0}while((B|0)!=(z|0))}B=t<<1;A=u<<1;F=c[f+13284>>2]|0;E=f+13356|0;b[E>>1]=B>>F;C=c[f+13288>>2]|0;G=f+13358|0;b[G>>1]=A>>C;a[f+13360>>0]=k-F;a[f+13361>>0]=m-C;H=c[f+13372>>2]|0;I=f+13444|0;b[I>>1]=B>>H;J=c[f+13376>>2]|0;K=f+13446|0;b[K>>1]=A>>J;a[f+13448>>0]=k-H;a[f+13449>>0]=m-J;L=c[f+13460>>2]|0;M=f+13532|0;b[M>>1]=B>>L;B=c[f+13464>>2]|0;N=f+13534|0;b[N>>1]=A>>B;a[f+13536>>0]=k-L;a[f+13537>>0]=m-B;m=i<<1;k=h<<1&14;A=f+13316|0;c[A>>2]=(c[f+13628>>2]|0)+(m>>F);F=f+13320|0;c[F>>2]=(k>>>C)+(f+13640);C=f+13404|0;c[C>>2]=(c[f+13632>>2]|0)+(m>>H);H=f+13408|0;c[H>>2]=(k>>>J)+(f+13656);J=f+13492|0;c[J>>2]=(c[f+13636>>2]|0)+(m>>L);L=f+13496|0;c[L>>2]=(k>>>B)+(f+13672);c[f+13604>>2]=0-(h<<6);B=f+13608|0;c[B>>2]=w-(u+h)<<6;c[f+13596>>2]=0-(i<<6);w=f+13600|0;c[w>>2]=v-(t+i)<<6;if(!h)O=0;else O=c[(c[D>>2]|0)+(0-(c[f+13568>>2]|0)<<2)>>2]|0;c[f+13580>>2]=O;if((c[f+13560>>2]|0)<(i|0))P=c[(c[D>>2]|0)+-4>>2]|0;else P=0;c[f+13576>>2]=P;P=g+17836|0;Me(y,(c[P>>2]|0)+12+((c[g+988>>2]|0)*160|0)+28|0,h,i);O=c[c[D>>2]>>2]|0;v=(j&255)>2;if((v?(j=c[g+712>>2]|0,k=c[g+716>>2]|0,k|j|0):0)?(a[29330+(s<<2)+(j<<1)+k>>0]|0)==13:0)Sa(c[f+13708>>2]|0,7,30870,p);pf(f,g,h,i,x,z);z=O+3|0;if(a[z>>0]|0){qh(c[A>>2]|0,0,e[E>>1]|0)|0;qh(c[F>>2]|0,0,e[G>>1]|0)|0;qh(c[C>>2]|0,0,e[I>>1]|0)|0;qh(c[H>>2]|0,0,e[K>>1]|0)|0;qh(c[J>>2]|0,0,e[M>>1]|0)|0;qh(c[L>>2]|0,0,e[N>>1]|0)|0}if((a[O+8>>0]|0)>0){L=i<<3;J=h<<3;H=c[c[D>>2]>>2]|0;C=c[19668+(d[H+7>>0]<<2)>>2]|0;if(!(c[g+17864>>2]|0))Q=0;else Q=c[g+17872>>2]|0;F=f+13708|0;A=(d[H>>0]|0)<3;x=(a[H+9>>0]|0)>0?2:1;p=f+13292|0;k=f+13380|0;j=f+13468|0;s=0;do{m=(a[H+8+s>>0]|0)+-1|0;R=g+796+(m<<6)|0;T=g+796+(m<<6)+8|0;U=(c[P>>2]|0)+12+((c[R>>2]|0)*160|0)|0;V=c[T>>2]|0;if((V|0)!=-1?(W=c[g+796+(m<<6)+12>>2]|0,(W|0)!=-1):0){X=W;Y=V;Z=59}else{Sa(c[F>>2]|0,5,30890,o);V=c[T>>2]|0;if((V|0)==-1)_=0;else{X=c[g+796+(m<<6)+12>>2]|0;Y=V;Z=59}}if((Z|0)==59){Z=0;_=(X|0)!=-1&((Y|0)!=16384|(X|0)!=16384)}V=_&1;Ne(y,s,c[g+796+(m<<6)+4>>2]|0,h,i,_?T:0);c[f+13616+(s<<2)>>2]=R;if(A){R=0;do{m=f+13280+(R*88|0)|0;W=f+13280+(R*88|0)+12|0;$=b[f+13280+(R*88|0)+76>>1]|0;aa=$&65535;ba=b[f+13280+(R*88|0)+78>>1]|0;ca=ba&65535;da=aa<<2;ea=ca<<2;fa=f+13280+(R*88|0)+20+(s<<3)|0;if(!($<<16>>16==0|ba<<16>>16==0)){ba=0;$=0;while(1){ga=$<<2;ha=ba;ia=0;while(1){Le(q,m,H,s,ha);Kf(Q,y,R,da,ea,ia<<2,ga,4,4,L,J,C,T,fa,W,q,U,V,s);ia=ia+1|0;if((ia|0)==(aa|0))break;else ha=ha+1|0}$=$+1|0;if(($|0)==(ca|0))break;else ba=ba+aa|0}}R=R+1|0}while((R|0)!=3)}else{R=H+12+(s<<2)|0;c[q>>2]=e[R>>1]|e[R+2>>1]<<16;R=e[E>>1]<<2;aa=e[G>>1]<<2;Kf(Q,y,0,R,aa,0,0,R,aa,L,J,C,T,f+13300+(s<<3)|0,p,q,U,V,s);aa=e[I>>1]<<2;R=e[K>>1]<<2;Kf(Q,y,1,aa,R,0,0,aa,R,L,J,C,T,f+13388+(s<<3)|0,k,q,U,V,s);R=e[M>>1]<<2;aa=e[N>>1]<<2;Kf(Q,y,2,R,aa,0,0,R,aa,L,J,C,T,f+13476+(s<<3)|0,j,q,U,V,s)}s=s+1|0}while((s|0)!=(x|0));if(!(a[z>>0]|0)){x=O+2|0;s=f+13584|0;q=f+13588|0;j=O+4|0;C=f+13700|0;J=0;L=0;while(1){if(!L)ja=x;else ja=(c[f+13280+(L*88|0)+8>>2]|0)+(29382+(d[O>>0]<<4)+(d[x>>0]<<2)+(c[f+13280+(L*88|0)+4>>2]<<1))|0;Q=a[ja>>0]|0;N=Q&255;M=1<<N;k=c[w>>2]|0;K=(k|0)>-1;if(K)ka=0;else ka=k>>(c[f+13280+(L*88|0)+4>>2]|0)+5;k=ka+(e[f+13280+(L*88|0)+76>>1]|0)|0;I=c[B>>2]|0;p=(I|0)>-1;if(p)la=0;else la=I>>(c[f+13280+(L*88|0)+8>>2]|0)+5;I=la+(e[f+13280+(L*88|0)+78>>1]|0)|0;c[s>>2]=K?0:k;c[q>>2]=p?0:I;if((I|0)>0){p=(k|0)>0;K=19812+(N*12|0)|0;G=f+13280+(L*88|0)+12|0;E=f+13280+(L*88|0)+16|0;H=f+13280+(L*88|0)|0;A=(Q&255)<3;_=32<<N;X=Q<<24>>24==3;Y=32<<(N<<1);N=Q<<24>>24==0;Z=J;o=0;while(1){a:do if(p){if(N){F=0;P=Z;while(1){aa=Lf(f,L,K,F,o,0,a[j>>0]|0)|0;do if((aa|0)>0){R=c[E>>2]|0;ba=(c[G>>2]|0)+((S(R,o)|0)+F<<2)|0;ca=c[H>>2]|0;if(!(c[C>>2]|0))Rd(ca,ba,R,aa);else Sd(ca,ba,R,aa);if((aa|0)==1){b[ca>>1]=0;break}if(A&(aa|0)<11){qh(ca|0,0,_|0)|0;break}if(X&(aa|0)<35){qh(ca|0,0,512)|0;break}else{qh(ca|0,0,Y|0)|0;break}}while(0);ca=aa+P|0;F=F+M|0;if((F|0)>=(k|0)){ma=ca;break a}else P=ca}}else{na=0;oa=Z}while(1){P=Lf(f,L,K,na,o,Q,a[j>>0]|0)|0;b:do if((P|0)>0){F=c[E>>2]|0;ca=(c[G>>2]|0)+((S(F,o)|0)+na<<2)|0;R=c[H>>2]|0;c:do if(!(c[C>>2]|0))switch(Q<<24>>24){case 3:{Vd(R,ca,F,P);break c;break}case 1:{Td(R,ca,F,P);break c;break}case 2:{Ud(R,ca,F,P);break c;break}default:break b}else Sd(R,ca,F,P);while(0);if((P|0)==1){b[R>>1]=0;break}if(A&(P|0)<11){qh(R|0,0,_|0)|0;break}if(X&(P|0)<35){qh(R|0,0,512)|0;break}else{qh(R|0,0,Y|0)|0;break}}while(0);aa=P+oa|0;na=na+M|0;if((na|0)>=(k|0)){ma=aa;break}else oa=aa}}else ma=Z;while(0);o=o+M|0;if((o|0)>=(I|0)){pa=ma;break}else Z=ma}}else pa=J;L=L+1|0;if((L|0)==3)break;else J=pa}if(v&(pa|0)==0)a[z>>0]=1}}else{pa=O+2|0;v=f+13584|0;J=f+13588|0;L=O+6|0;ma=O+1|0;oa=f+13700|0;na=O+4|0;C=0;do{j=(C|0)==0;if(j)qa=pa;else qa=(c[f+13280+(C*88|0)+8>>2]|0)+(29382+(d[O>>0]<<4)+(d[pa>>0]<<2)+(c[f+13280+(C*88|0)+4>>2]<<1))|0;q=a[qa>>0]|0;s=q&255;la=1<<s;ka=c[w>>2]|0;ja=(ka|0)>-1;if(ja)ra=0;else ra=ka>>(c[f+13280+(C*88|0)+4>>2]|0)+5;ka=ra+(e[f+13280+(C*88|0)+76>>1]|0)|0;x=c[B>>2]|0;Z=(x|0)>-1;if(Z)sa=0;else sa=x>>(c[f+13280+(C*88|0)+8>>2]|0)+5;x=sa+(e[f+13280+(C*88|0)+78>>1]|0)|0;c[v>>2]=ja?0:ka;c[J>>2]=Z?0:x;if((x|0)>0){Z=(ka|0)>0;ja=j?ma:L;I=f+13280+(C*88|0)+12|0;o=f+13280+(C*88|0)+16|0;M=f+13280+(C*88|0)+80|0;k=f+13280+(C*88|0)|0;Y=(q&255)<3;X=32<<s;_=q<<24>>24==3;A=32<<(s<<1);Q=19812+(s*12|0)|0;H=0;do{if(Z){G=H<<1;E=0;do{K=c[o>>2]|0;N=(c[I>>2]|0)+((S(K,H)|0)+E<<2)|0;if(j&(d[O>>0]|0)<3)ta=(c[c[D>>2]>>2]|0)+20+((E+G|0)*12|0)|0;else ta=ja;p=a[ta>>0]|0;Oe(y,d[M>>0]|0,q,p,N,K,N,K,E,H,C);d:do if(!(a[z>>0]|0)){do if(j){if(c[oa>>2]|0){ua=0;va=Q;break}K=c[19772+((p&255)<<2)>>2]|0;ua=K;va=19860+(s*48|0)+(K*12|0)|0}else{ua=0;va=Q}while(0);P=Lf(f,C,va,E,H,q,a[na>>0]|0)|0;if((P|0)<=0)break;K=c[o>>2]|0;V=c[k>>2]|0;e:do if(!(c[oa>>2]|0))switch(q<<24>>24){case 0:{Wd(ua,V,N,K,P);break e;break}case 1:{Xd(ua,V,N,K,P);break e;break}case 2:{Yd(ua,V,N,K,P);break e;break}case 3:{Vd(V,N,K,P);break e;break}default:break d}else Sd(V,N,K,P);while(0);if((P|0)==1){b[V>>1]=0;break}if((ua|0)==0&(Y&(P|0)<11)){qh(V|0,0,X|0)|0;break}if(_&(P|0)<35){qh(V|0,0,512)|0;break}else{qh(V|0,0,A|0)|0;break}}while(0);E=E+la|0}while((E|0)<(ka|0))}H=H+la|0}while((H|0)<(x|0))}C=C+1|0}while((C|0)!=3)}C=f+13704|0;c[C>>2]=((c[f+20>>2]|0)+-33|0)>>>0<1073741791|c[C>>2];if(!(c[g+4372>>2]|0)){l=n;return}ze(r,O,h,i,t,u);l=n;return}function Kf(d,e,f,g,h,i,j,k,m,n,o,p,q,r,s,t,u,v,w){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;d=l;l=l+25616|0;x=d;y=d+25600|0;z=s+4|0;A=(c[s>>2]|0)+(S(c[z>>2]|0,j)|0)+i|0;s=(f|0)==0;B=c[(s?u+80|0:(f|0)==1?u+84|0:u+88|0)>>2]|0;C=c[(s?u+36|0:u+56|0)>>2]|0;D=c[(s?u+40|0:u+60|0)>>2]|0;u=(v|0)!=0;if(u){v=e+(f*88|0)+4|0;s=e+(f*88|0)+8|0;Ke(x,e,t,g,h,c[v>>2]|0,c[s>>2]|0);h=(0-(c[e+316>>2]|0)>>(c[v>>2]|0)+3)+i|0;v=(0-(c[e+324>>2]|0)>>(c[s>>2]|0)+3)+j|0;s=q+16|0;g=Ea[c[s>>2]&31](h<<4,q)|0;E=q+20|0;F=Ea[c[E>>2]&31](v<<4,q)|0;G=Ea[c[s>>2]&31](h,q)|0;h=Ea[c[E>>2]&31](v,q)|0;ce(y,x,n+i|0,o+j|0,q);H=c[y>>2]|0;I=c[y+4>>2]|0;J=G;K=g;L=c[q+8>>2]|0;M=h;N=F;O=c[q+12>>2]|0}else{F=c[e+(f*88|0)+4>>2]|0;h=(0-(c[e+316>>2]|0)>>F+3)+i|0;i=c[e+(f*88|0)+8>>2]|0;f=(0-(c[e+324>>2]|0)>>i+3)+j|0;H=b[t>>1]<<1-i;I=b[t+2>>1]<<1-F;J=h;K=h<<4;L=16;M=f;N=f<<4;O=16}f=I&15;h=H&15;F=(I>>4)+J|0;J=(H>>4)+M|0;M=H+N|0;N=c[r+4>>2]|0;r=B+(S(J,N)|0)+F|0;do if(((D|C)&7|H|I|0)==0&(u^1)){}else{t=M+(S(O,m+-1|0)|0)>>4;i=t+1|0;j=(S(L,k+-1|0)|0)+K+I>>4;if((f|0)==0?(c[q+8>>2]|0)==16:0){P=F;Q=j+1|0;R=0}else{P=F+-3|0;Q=j+5|0;R=3}if((h|0)==0?(c[q+12>>2]|0)==16:0){T=J;U=i;V=0}else{T=J+-3|0;U=t+5|0;V=3}t=(P|0)<0;if(((!t?!((Q|0)<0|(P|0)>=(C|0)):0)?!((Q|0)>=(C|0)|(T|0)<0):0)?(U|0)<(D|0)&((T|0)<(D|0)&(U|0)>-1):0)break;i=S(T,N)|0;j=Q-P+1|0;e=U-T+1|0;g=(S(V,j)|0)+R|0;G=c[z>>2]|0;y=0-P|0;o=B+i+P+y+(0-i)|0;n=o+(S(N,D+-1|0)|0)|0;v=(T|0)<(D|0)?((T|0)>0?o+i|0:o):n;n=t?y:0;y=(n|0)>(j|0)?j:n;n=(Q|0)>=(C|0)?1-C+Q|0:0;t=(n|0)>(j|0)?j:n;n=j-y-t|0;o=(n|0)==0;i=(t|0)==0;E=C+-1|0;a:do if(!y){if(o){if(i)break;else{W=e;X=x;Y=v;Z=T}while(1){qh(X|0,a[Y+E>>0]|0,t|0)|0;s=Z+1|0;W=W+-1|0;if(!W)break a;else{X=X+j|0;Y=(Z|0)>-1&(s|0)<(D|0)?Y+N|0:Y;Z=s}}}if(i){s=e;_=x;$=v;aa=T;while(1){vh(_|0,$+P|0,n|0)|0;ba=aa+1|0;s=s+-1|0;if(!s)break;else{_=_+j|0;$=(aa|0)>-1&(ba|0)<(D|0)?$+N|0:$;aa=ba}}}else{aa=e;$=x;_=v;s=T;while(1){vh($|0,_+P|0,n|0)|0;qh($+n|0,a[_+E>>0]|0,t|0)|0;ba=s+1|0;aa=aa+-1|0;if(!aa)break;else{$=$+j|0;_=(s|0)>-1&(ba|0)<(D|0)?_+N|0:_;s=ba}}}}else if(o)if(i){s=e;_=x;$=v;aa=T;while(1){qh(_|0,a[$>>0]|0,y|0)|0;ba=aa+1|0;s=s+-1|0;if(!s)break;else{_=_+j|0;$=(aa|0)>-1&(ba|0)<(D|0)?$+N|0:$;aa=ba}}}else{aa=e;$=x;_=v;s=T;while(1){qh($|0,a[_>>0]|0,y|0)|0;qh($+y|0,a[_+E>>0]|0,t|0)|0;ba=s+1|0;aa=aa+-1|0;if(!aa)break;else{$=$+j|0;_=(s|0)>-1&(ba|0)<(D|0)?_+N|0:_;s=ba}}}else if(i){s=e;_=x;$=v;aa=T;while(1){qh(_|0,a[$>>0]|0,y|0)|0;vh(_+y|0,$+P+y|0,n|0)|0;ba=aa+1|0;s=s+-1|0;if(!s)break;else{_=_+j|0;$=(aa|0)>-1&(ba|0)<(D|0)?$+N|0:$;aa=ba}}}else{aa=e;$=x;_=v;s=T;while(1){qh($|0,a[_>>0]|0,y|0)|0;ba=$+y|0;vh(ba|0,_+P+y|0,n|0)|0;qh(ba+n|0,a[_+E>>0]|0,t|0)|0;ba=s+1|0;aa=aa+-1|0;if(!aa)break;else{$=$+j|0;_=(s|0)>-1&(ba|0)<(D|0)?_+N|0:_;s=ba}}}while(0);wa[c[q+24+(((f|0)!=0&1)<<4)+(((h|0)!=0&1)<<3)+(w<<2)>>2]&15](x+g|0,j,A,G,p+(f<<4)|0,L,p+(h<<4)|0,O,k,m);l=d;return}while(0);wa[c[q+24+(((f|0)!=0&1)<<4)+(((h|0)!=0&1)<<3)+(w<<2)>>2]&15](r,N,A,c[z>>2]|0,p+(f<<4)|0,L,p+(h<<4)|0,O,k,m);l=d;return}function Lf(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=d+12|0;l=d+13280+(e*88|0)|0;m=d+13280+(e*88|0)+44+(j<<2)|0;j=(c[d+13280+(e*88|0)+36>>2]|0)+g|0;n=(c[d+13280+(e*88|0)+40>>2]|0)+h|0;switch(i<<24>>24){case 0:{i=Mf(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,0,m,((a[n>>0]|0)!=0&1)+((a[j>>0]|0)!=0&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;o=(i|0)>0&1;a[n>>0]=o;a[j>>0]=o;p=i;return p|0}case 1:{i=c[d+13584>>2]|0;o=g+2|0;q=c[d+13588>>2]|0;r=h+2|0;s=Mf(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,1,m,((b[n>>1]|0)!=0&1)+((b[j>>1]|0)!=0&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;t=(s|0)>0?257:0;b[j>>1]=t>>>((i|0)!=0&o>>>0>i>>>0?o-i<<3:0);b[n>>1]=t>>>((q|0)!=0&r>>>0>q>>>0?r-q<<3:0);p=s;return p|0}case 2:{s=c[d+13584>>2]|0;q=g+4|0;r=c[d+13588>>2]|0;t=h+4|0;i=Mf(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,2,m,((c[n>>2]|0)!=0&1)+((c[j>>2]|0)!=0&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;o=(i|0)>0?16843009:0;c[j>>2]=o>>>((s|0)!=0&q>>>0>s>>>0?q-s<<3:0);c[n>>2]=o>>>((r|0)!=0&t>>>0>r>>>0?t-r<<3:0);p=i;return p|0}case 3:{i=c[d+13584>>2]|0;r=g+8|0;g=c[d+13588>>2]|0;t=h+8|0;h=j;o=n;s=Mf(c[d+13548>>2]|0,a[(c[c[d+13572>>2]>>2]|0)+8>>0]|0,c[d+13612>>2]|0,(e|0)>0&1,c[l>>2]|0,3,m,(((c[o>>2]|0)!=0|(c[o+4>>2]|0)!=0)&1)+(((c[h>>2]|0)!=0|(c[h+4>>2]|0)!=0)&1)|0,c[f>>2]|0,c[f+8>>2]|0,k)|0;k=(s|0)>0;f=k?16843009:0;h=k?16843009:0;k=j;c[k>>2]=rh(f|0,h|0,((i|0)!=0&r>>>0>i>>>0?r-i<<3:0)|0)|0;c[k+4>>2]=D;k=n;c[k>>2]=rh(f|0,h|0,((g|0)!=0&t>>>0>g>>>0?t-g<<3:0)|0)|0;c[k+4>>2]=D;p=s;return p|0}default:{p=0;return p|0}}return 0}function Mf(e,f,g,h,i,j,k,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0;q=l;l=l+1024|0;r=q;s=j&255;t=16<<(s<<1);u=f<<24>>24>0&1;f=j<<24>>24==3&1;v=c[p>>2]|0;w=p+4|0;x=c[w>>2]|0;y=p+8|0;z=c[y>>2]|0;A=(e|0)!=0;if((t|0)<=0){B=0;C=x;D=v;E=z;c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}F=k+2|0;G=d[1536]|0;H=256-G|0;I=d[1552]|0;J=256-I|0;K=d[1553]|0;L=256-K|0;M=d[1568]|0;N=256-M|0;O=d[1569]|0;P=256-O|0;Q=d[1570]|0;R=256-Q|0;T=d[1584]|0;U=256-T|0;V=d[1585]|0;W=256-V|0;X=d[1586]|0;Y=256-X|0;Z=d[1587]|0;_=256-Z|0;$=j<<24>>24==0?2656:1632;j=0;aa=z;z=m;m=k;k=x;x=v;a:while(1){v=b[m>>1]|0;ba=d[$>>0]|0;ca=g+174+(s*432|0)+(h*216|0)+(u*108|0)+(ba*18|0)+(z*3|0)|0;da=e+10032+(s*576|0)+(h*288|0)+(u*144|0)+(ba*24|0)+(z<<2)|0;if(A)c[da>>2]=(c[da>>2]|0)+1;da=d[ca>>0]|0;ea=(256-da+(S(da,k)|0)|0)>>>8;da=ea<<24;if((aa|0)<0){c[p>>2]=x;c[y>>2]=aa;db(p);fa=c[y>>2]|0;ga=c[p>>2]|0}else{fa=aa;ga=x}if(ga>>>0<da>>>0){ha=14;break}ia=k-ea|0;ja=d[1280+ia>>0]|0;ka=ia<<ja;ia=ga-da<<ja;da=fa-ja|0;b:do if(A){ja=ba;la=$;ma=j;na=da;oa=z;pa=v;qa=ca;ra=ka;sa=ia;while(1){ta=la+1|0;ua=d[qa+1>>0]|0;va=(256-ua+(S(ua,ra)|0)|0)>>>8;ua=va<<24;if((na|0)<0){c[p>>2]=sa;c[y>>2]=na;db(p);wa=c[y>>2]|0;xa=c[p>>2]|0}else{wa=na;xa=sa}if(xa>>>0>=ua>>>0){ya=ja;za=ta;Aa=ma;Ba=wa;Ca=oa;Da=pa;Ea=qa;Fa=ra;Ga=ua;Ha=va;Ia=xa;break b}ua=d[1280+va>>0]|0;Ja=va<<ua;va=xa<<ua;Ka=wa-ua|0;ua=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ja*96|0)+(oa<<4)|0;c[ua>>2]=(c[ua>>2]|0)+1;ua=b[F>>1]|0;a[r+(b[n+(ma<<1)>>1]|0)>>0]=0;La=ma+1|0;if((La|0)>=(t|0)){B=La;C=Ja;D=va;E=Ka;ha=102;break a}Ma=La<<1;Na=((d[r+(b[o+(Ma<<1)>>1]|0)>>0]|0)+1+(d[r+(b[o+((Ma|1)<<1)>>1]|0)>>0]|0)|0)>>>1;Ma=d[ta>>0]|0;ja=Ma;la=ta;ma=La;na=Ka;oa=Na;pa=ua;qa=g+174+(s*432|0)+(h*216|0)+(u*108|0)+(Ma*18|0)+(Na*3|0)|0;ra=Ja;sa=va}}else{sa=ba;ra=$;qa=j;pa=da;oa=z;na=v;ma=ca;la=ka;ja=ia;while(1){va=ra+1|0;Ja=d[ma+1>>0]|0;Na=(256-Ja+(S(Ja,la)|0)|0)>>>8;Ja=Na<<24;if((pa|0)<0){c[p>>2]=ja;c[y>>2]=pa;db(p);Oa=c[y>>2]|0;Pa=c[p>>2]|0}else{Oa=pa;Pa=ja}if(Pa>>>0>=Ja>>>0){ya=sa;za=va;Aa=qa;Ba=Oa;Ca=oa;Da=na;Ea=ma;Fa=la;Ga=Ja;Ha=Na;Ia=Pa;break b}Ja=d[1280+Na>>0]|0;Ma=Na<<Ja;Na=Pa<<Ja;ua=Oa-Ja|0;Ja=b[F>>1]|0;a[r+(b[n+(qa<<1)>>1]|0)>>0]=0;Ka=qa+1|0;if((Ka|0)>=(t|0)){B=Ka;C=Ma;D=Na;E=ua;ha=102;break a}La=Ka<<1;ta=((d[r+(b[o+(La<<1)>>1]|0)>>0]|0)+1+(d[r+(b[o+((La|1)<<1)>>1]|0)>>0]|0)|0)>>>1;La=d[va>>0]|0;sa=La;ra=va;qa=Ka;pa=ua;oa=ta;na=Ja;ma=g+174+(s*432|0)+(h*216|0)+(u*108|0)+(La*18|0)+(ta*3|0)|0;la=Ma;ja=Na}}while(0);ia=Fa-Ha|0;ka=d[1280+ia>>0]|0;ca=ia<<ka;ia=Ia-Ga<<ka;v=Ba-ka|0;ka=Ea+2|0;da=d[ka>>0]|0;ja=(256-da+(S(ca,da)|0)|0)>>>8;da=ja<<24;if((v|0)<0){c[p>>2]=ia;c[y>>2]=v;db(p);Qa=c[y>>2]|0;Ra=c[p>>2]|0}else{Qa=v;Ra=ia}do if(Ra>>>0<da>>>0){ia=d[1280+ja>>0]|0;v=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ya*96|0)+(Ca<<4)+4|0;if(A)c[v>>2]=(c[v>>2]|0)+1;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=1;Sa=Qa-ia|0;Ta=Da<<16>>16;Ua=ja<<ia;Va=Ra<<ia}else{ia=ca-ja|0;v=d[1280+ia>>0]|0;la=ia<<v;ia=Ra-da<<v;ma=Qa-v|0;v=(d[ka>>0]|0)+-1|0;na=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ya*96|0)+(Ca<<4)+8|0;if(A)c[na>>2]=(c[na>>2]|0)+1;na=d[22858+(v<<3)>>0]|0;oa=(256-na+(S(na,la)|0)|0)>>>8;na=oa<<24;if((ma|0)<0){c[p>>2]=ia;c[y>>2]=ma;db(p);Wa=c[y>>2]|0;Xa=c[p>>2]|0}else{Wa=ma;Xa=ia}if(Xa>>>0<na>>>0){ia=d[1280+oa>>0]|0;ma=oa<<ia;pa=Xa<<ia;qa=Wa-ia|0;ia=d[22858+(v<<3)+1>>0]|0;ra=(256-ia+(S(ma,ia)|0)|0)>>>8;ia=ra<<24;if((qa|0)<0){c[p>>2]=pa;c[y>>2]=qa;db(p);Ya=c[y>>2]|0;Za=c[p>>2]|0}else{Ya=qa;Za=pa}if(Za>>>0<ia>>>0){pa=d[1280+ra>>0]|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=2;Sa=Ya-pa|0;Ta=Da<<16>>16<<1;Ua=ra<<pa;Va=Za<<pa;break}pa=ma-ra|0;ra=d[1280+pa>>0]|0;ma=pa<<ra;pa=Za-ia<<ra;ia=Ya-ra|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=3;ra=d[22858+(v<<3)+2>>0]|0;qa=(256-ra+(S(ra,ma)|0)|0)>>>8;ra=qa<<24;if((ia|0)<0){c[p>>2]=pa;c[y>>2]=ia;db(p);_a=c[y>>2]|0;$a=c[p>>2]|0}else{_a=ia;$a=pa}if($a>>>0<ra>>>0){pa=d[1280+qa>>0]|0;ab=pa;bb=3;cb=qa<<pa;eb=$a}else{pa=ma-qa|0;qa=d[1280+pa>>0]|0;ab=qa;bb=4;cb=pa<<qa;eb=$a-ra|0}Sa=_a-ab|0;Ta=S(bb,Da<<16>>16)|0;Ua=cb;Va=eb<<ab;break}ra=la-oa|0;oa=d[1280+ra>>0]|0;la=ra<<oa;ra=Xa-na<<oa;na=Wa-oa|0;oa=d[22858+(v<<3)+3>>0]|0;qa=(256-oa+(S(la,oa)|0)|0)>>>8;oa=qa<<24;if((na|0)<0){c[p>>2]=ra;c[y>>2]=na;db(p);fb=c[y>>2]|0;gb=c[p>>2]|0}else{fb=na;gb=ra}c:do if(gb>>>0<oa>>>0){ra=d[1280+qa>>0]|0;na=qa<<ra;pa=gb<<ra;ma=fb-ra|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=4;ra=d[22858+(v<<3)+4>>0]|0;ia=(256-ra+(S(ra,na)|0)|0)>>>8;ra=ia<<24;if((ma|0)<0){c[p>>2]=pa;c[y>>2]=ma;db(p);hb=c[y>>2]|0;ib=c[p>>2]|0}else{hb=ma;ib=pa}if(ib>>>0<ra>>>0){pa=d[1280+ia>>0]|0;ma=ia<<pa;sa=ib<<pa;Na=hb-pa|0;pa=(H+(S(G,ma)|0)|0)>>>8;Ma=pa<<24;if((Na|0)<0){c[p>>2]=sa;c[y>>2]=Na;db(p);jb=c[y>>2]|0;kb=c[p>>2]|0}else{jb=Na;kb=sa}if(kb>>>0<Ma>>>0){sa=d[1280+pa>>0]|0;lb=sa;mb=0;nb=pa<<sa;ob=kb}else{sa=ma-pa|0;pa=d[1280+sa>>0]|0;lb=pa;mb=1;nb=sa<<pa;ob=kb-Ma|0}pb=5;qb=mb;rb=jb-lb|0;sb=nb;tb=ob<<lb;break}Ma=na-ia|0;ia=d[1280+Ma>>0]|0;na=Ma<<ia;Ma=ib-ra<<ia;ra=hb-ia|0;ia=(J+(S(I,na)|0)|0)>>>8;pa=ia<<24;if((ra|0)<0){c[p>>2]=Ma;c[y>>2]=ra;db(p);ub=c[y>>2]|0;vb=c[p>>2]|0}else{ub=ra;vb=Ma}if(vb>>>0<pa>>>0){Ma=d[1280+ia>>0]|0;wb=Ma;xb=0;yb=ia<<Ma;zb=vb}else{Ma=na-ia|0;ia=d[1280+Ma>>0]|0;wb=ia;xb=2;yb=Ma<<ia;zb=vb-pa|0}pa=zb<<wb;ia=ub-wb|0;Ma=(L+(S(K,yb)|0)|0)>>>8;na=Ma<<24;if((ia|0)<0){c[p>>2]=pa;c[y>>2]=ia;db(p);Ab=c[y>>2]|0;Bb=c[p>>2]|0}else{Ab=ia;Bb=pa}if(Bb>>>0<na>>>0){pa=d[1280+Ma>>0]|0;Cb=pa;Db=0;Eb=Ma<<pa;Fb=Bb}else{pa=yb-Ma|0;Ma=d[1280+pa>>0]|0;Cb=Ma;Db=1;Eb=pa<<Ma;Fb=Bb-na|0}pb=7;qb=Db|xb;rb=Ab-Cb|0;sb=Eb;tb=Fb<<Cb}else{na=la-qa|0;Ma=d[1280+na>>0]|0;pa=na<<Ma;na=gb-oa<<Ma;ia=fb-Ma|0;a[r+(b[n+(Aa<<1)>>1]|0)>>0]=5;Ma=d[22858+(v<<3)+5>>0]|0;ra=(256-Ma+(S(Ma,pa)|0)|0)>>>8;Ma=ra<<24;if((ia|0)<0){c[p>>2]=na;c[y>>2]=ia;db(p);Gb=c[y>>2]|0;Hb=c[p>>2]|0}else{Gb=ia;Hb=na}if(Hb>>>0>=Ma>>>0){na=pa-ra|0;pa=d[1280+na>>0]|0;ia=na<<pa;na=Hb-Ma<<pa;Ma=Gb-pa|0;pa=d[22858+(v<<3)+7>>0]|0;sa=(256-pa+(S(ia,pa)|0)|0)>>>8;pa=sa<<24;if((Ma|0)<0){c[p>>2]=na;c[y>>2]=Ma;db(p);Ib=c[y>>2]|0;Jb=c[p>>2]|0}else{Ib=Ma;Jb=na}if(Jb>>>0<pa>>>0){na=d[1280+sa>>0]|0;Ma=Ib-na|0;ma=0;Na=sa<<na;ta=0;La=Jb<<na;while(1){na=d[1600+ma>>0]|0;Ja=(256-na+(S(na,Na)|0)|0)>>>8;na=Ja<<24;if((Ma|0)<0){c[p>>2]=La;c[y>>2]=Ma;db(p);Kb=c[y>>2]|0;Lb=c[p>>2]|0}else{Kb=Ma;Lb=La}if(Lb>>>0<na>>>0){ua=d[1280+Ja>>0]|0;Mb=ua;Nb=0;Ob=Ja<<ua;Pb=Lb}else{ua=Na-Ja|0;Ja=d[1280+ua>>0]|0;Mb=Ja;Nb=1;Ob=ua<<Ja;Pb=Lb-na|0}na=Pb<<Mb;Ja=Kb-Mb|0;ua=Nb|ta<<1;ma=ma+1|0;if((ma|0)==5){pb=35;qb=ua;rb=Ja;sb=Ob;tb=na;break c}else{Ma=Ja;Na=Ob;ta=ua;La=na}}}else{La=ia-sa|0;ta=d[1280+La>>0]|0;Na=Ib-ta|0;Ma=0;ma=La<<ta;La=0;na=Jb-pa<<ta;while(1){ta=d[1616+Ma>>0]|0;ua=(256-ta+(S(ta,ma)|0)|0)>>>8;ta=ua<<24;if((Na|0)<0){c[p>>2]=na;c[y>>2]=Na;db(p);Qb=c[y>>2]|0;Rb=c[p>>2]|0}else{Qb=Na;Rb=na}if(Rb>>>0<ta>>>0){Ja=d[1280+ua>>0]|0;Sb=Ja;Tb=0;Ub=ua<<Ja;Vb=Rb}else{Ja=ma-ua|0;ua=d[1280+Ja>>0]|0;Sb=ua;Tb=1;Ub=Ja<<ua;Vb=Rb-ta|0}ta=Vb<<Sb;ua=Qb-Sb|0;Ja=Tb|La<<1;Ma=Ma+1|0;if((Ma|0)==14){pb=67;qb=Ja;rb=ua;sb=Ub;tb=ta;break c}else{Na=ua;ma=Ub;La=Ja;na=ta}}}}na=d[1280+ra>>0]|0;La=ra<<na;ma=Hb<<na;Na=Gb-na|0;na=d[22858+(v<<3)+6>>0]|0;Ma=(256-na+(S(La,na)|0)|0)>>>8;na=Ma<<24;if((Na|0)<0){c[p>>2]=ma;c[y>>2]=Na;db(p);Wb=c[y>>2]|0;Xb=c[p>>2]|0}else{Wb=Na;Xb=ma}if(Xb>>>0<na>>>0){ma=d[1280+Ma>>0]|0;Na=Ma<<ma;pa=Xb<<ma;sa=Wb-ma|0;ma=(N+(S(M,Na)|0)|0)>>>8;ia=ma<<24;if((sa|0)<0){c[p>>2]=pa;c[y>>2]=sa;db(p);Yb=c[y>>2]|0;Zb=c[p>>2]|0}else{Yb=sa;Zb=pa}if(Zb>>>0<ia>>>0){pa=d[1280+ma>>0]|0;_b=pa;$b=0;ac=ma<<pa;bc=Zb}else{pa=Na-ma|0;ma=d[1280+pa>>0]|0;_b=ma;$b=4;ac=pa<<ma;bc=Zb-ia|0}ia=bc<<_b;ma=Yb-_b|0;pa=(P+(S(O,ac)|0)|0)>>>8;Na=pa<<24;if((ma|0)<0){c[p>>2]=ia;c[y>>2]=ma;db(p);cc=c[y>>2]|0;dc=c[p>>2]|0}else{cc=ma;dc=ia}if(dc>>>0<Na>>>0){ia=d[1280+pa>>0]|0;ec=ia;fc=0;gc=pa<<ia;hc=dc}else{ia=ac-pa|0;pa=d[1280+ia>>0]|0;ec=pa;fc=2;gc=ia<<pa;hc=dc-Na|0}Na=hc<<ec;pa=cc-ec|0;ia=(R+(S(Q,gc)|0)|0)>>>8;ma=ia<<24;if((pa|0)<0){c[p>>2]=Na;c[y>>2]=pa;db(p);ic=c[y>>2]|0;jc=c[p>>2]|0}else{ic=pa;jc=Na}if(jc>>>0<ma>>>0){Na=d[1280+ia>>0]|0;kc=Na;lc=0;mc=ia<<Na;nc=jc}else{Na=gc-ia|0;ia=d[1280+Na>>0]|0;kc=ia;lc=1;mc=Na<<ia;nc=jc-ma|0}pb=11;qb=lc|(fc|$b);rb=ic-kc|0;sb=mc;tb=nc<<kc;break}ma=La-Ma|0;Ma=d[1280+ma>>0]|0;La=ma<<Ma;ma=Xb-na<<Ma;na=Wb-Ma|0;Ma=(U+(S(T,La)|0)|0)>>>8;ia=Ma<<24;if((na|0)<0){c[p>>2]=ma;c[y>>2]=na;db(p);oc=c[y>>2]|0;pc=c[p>>2]|0}else{oc=na;pc=ma}if(pc>>>0<ia>>>0){ma=d[1280+Ma>>0]|0;qc=ma;rc=0;sc=Ma<<ma;tc=pc}else{ma=La-Ma|0;Ma=d[1280+ma>>0]|0;qc=Ma;rc=8;sc=ma<<Ma;tc=pc-ia|0}ia=tc<<qc;Ma=oc-qc|0;ma=(W+(S(V,sc)|0)|0)>>>8;La=ma<<24;if((Ma|0)<0){c[p>>2]=ia;c[y>>2]=Ma;db(p);uc=c[y>>2]|0;vc=c[p>>2]|0}else{uc=Ma;vc=ia}if(vc>>>0<La>>>0){ia=d[1280+ma>>0]|0;wc=ia;xc=0;yc=ma<<ia;zc=vc}else{ia=sc-ma|0;ma=d[1280+ia>>0]|0;wc=ma;xc=4;yc=ia<<ma;zc=vc-La|0}La=zc<<wc;ma=uc-wc|0;ia=(Y+(S(X,yc)|0)|0)>>>8;Ma=ia<<24;if((ma|0)<0){c[p>>2]=La;c[y>>2]=ma;db(p);Ac=c[y>>2]|0;Bc=c[p>>2]|0}else{Ac=ma;Bc=La}if(Bc>>>0<Ma>>>0){La=d[1280+ia>>0]|0;Cc=La;Dc=0;Ec=ia<<La;Fc=Bc}else{La=yc-ia|0;ia=d[1280+La>>0]|0;Cc=ia;Dc=2;Ec=La<<ia;Fc=Bc-Ma|0}Ma=Fc<<Cc;ia=Ac-Cc|0;La=(_+(S(Z,Ec)|0)|0)>>>8;ma=La<<24;if((ia|0)<0){c[p>>2]=Ma;c[y>>2]=ia;db(p);Gc=c[y>>2]|0;Hc=c[p>>2]|0}else{Gc=ia;Hc=Ma}if(Hc>>>0<ma>>>0){Ma=d[1280+La>>0]|0;Ic=Ma;Jc=0;Kc=La<<Ma;Lc=Hc}else{Ma=Ec-La|0;La=d[1280+Ma>>0]|0;Ic=La;Jc=1;Kc=Ma<<La;Lc=Hc-ma|0}pb=19;qb=Jc|(Dc|(xc|rc));rb=Gc-Ic|0;sb=Kc;tb=Lc<<Ic}while(0);Sa=rb;Ta=S(qb+pb|0,Da<<16>>16)|0;Ua=sb;Va=tb}while(0);ka=Ta>>f;da=((Ua<<7)+128|0)>>>8;ja=da<<24;if((Sa|0)<0){c[p>>2]=Va;c[y>>2]=Sa;db(p);Mc=c[y>>2]|0;Nc=c[p>>2]|0}else{Mc=Sa;Nc=Va}if(Nc>>>0<ja>>>0){ca=d[1280+da>>0]|0;Oc=ka;Pc=ca;Qc=da<<ca;Rc=Nc<<ca}else{ca=Ua-da|0;da=d[1280+ca>>0]|0;Oc=0-ka|0;Pc=da;Qc=ca<<da;Rc=Nc-ja<<da}da=Mc-Pc|0;b[i+(b[n+(Aa<<1)>>1]<<1)>>1]=Oc;ja=Aa+1|0;ca=ja<<1;if((ja|0)<(t|0)){$=za;j=ja;aa=da;z=((d[r+(b[o+(ca<<1)>>1]|0)>>0]|0)+1+(d[r+(b[o+((ca|1)<<1)>>1]|0)>>0]|0)|0)>>>1;m=F;k=Qc;x=Rc}else{B=ja;C=Qc;D=Rc;E=da;ha=102;break}}if((ha|0)==14){Rc=d[1280+ea>>0]|0;Qc=ea<<Rc;ea=ga<<Rc;ga=fa-Rc|0;Rc=e+816+(s*2304|0)+(h*1152|0)+(u*576|0)+(ba*96|0)+(z<<4)+12|0;if(!A){B=j;C=Qc;D=ea;E=ga;c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}c[Rc>>2]=(c[Rc>>2]|0)+1;B=j;C=Qc;D=ea;E=ga;c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}else if((ha|0)==102){c[p>>2]=D;c[w>>2]=C;c[y>>2]=E;l=q;return B|0}return 0}function Nf(a){a=a|0;return}function Of(a){a=a|0;return}function Pf(a){a=a|0;return}function Qf(a,b,c){a=a|0;b=b|0;c=c|0;return}function Rf(a,b){a=a|0;b=b|0;return}function Sf(a,b){a=a|0;b=b|0;return}function Tf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0;b=l;l=l+32|0;d=b+8|0;e=b;f=4;g=ih(40)|0;c[g>>2]=0;h=b+16|0;i=b+12|0;o=0;j=ia(27,32,18736)|0;k=o;o=0;if((k|0)!=0&(p|0)!=0){m=uh(c[k>>2]|0,g|0,f|0)|0;if(!m)ma(k|0,p|0);D=p}else m=-1;if((m|0)!=1){c[h>>2]=j;if(!(c[h>>2]|0))n=0;else n=(c[h>>2]|0)+432|0;c[i>>2]=n;if(!(c[i>>2]|0)){q=i;r=0;jh(g|0);l=b;return r|0}qh(c[h>>2]|0,0,18736)|0;g=th((c[i>>2]|0)+92|0,1,g|0,f|0)|0;f=D;o=0;n=o;o=0;if((n|0)!=0&(p|0)!=0){s=uh(c[n>>2]|0,g|0,f|0)|0;if(!s)ma(n|0,p|0);D=p}else s=-1;if((s|0)==1){t=D;u=i}else{t=0;u=i}}else{t=D;u=0}while(1){s=(c[i>>2]|0)+88|0;if(t|0){c[s>>2]=0;o=0;ca(6,c[h>>2]|0);n=o;o=0;if((n|0)!=0&(p|0)!=0){v=uh(c[n>>2]|0,g|0,f|0)|0;if(!v)ma(n|0,p|0);D=p}else v=-1;if((v|0)==1){w=u;t=D;u=w;continue}else{x=9;break}}c[s>>2]=1;o=0;s=ia(28,1,2044)|0;n=o;o=0;if((n|0)!=0&(p|0)!=0){y=uh(c[n>>2]|0,g|0,f|0)|0;if(!y)ma(n|0,p|0);D=p}else y=-1;if((y|0)==1){w=u;t=D;u=w;continue}c[(c[i>>2]|0)+4108>>2]=s;if(!(c[(c[i>>2]|0)+4108>>2]|0)){o=0;ka(54,c[i>>2]|0,2,31162,e|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){z=uh(c[s>>2]|0,g|0,f|0)|0;if(!z)ma(s|0,p|0);D=p}else z=-1;if((z|0)==1){w=u;t=D;u=w;continue}}o=0;s=ia(28,4,2044)|0;n=o;o=0;if((n|0)!=0&(p|0)!=0){A=uh(c[n>>2]|0,g|0,f|0)|0;if(!A)ma(n|0,p|0);D=p}else A=-1;if((A|0)==1){w=u;t=D;u=w;continue}c[(c[i>>2]|0)+4112>>2]=s;if(!(c[(c[i>>2]|0)+4112>>2]|0)){o=0;ka(54,c[i>>2]|0,2,31188,d|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){B=uh(c[s>>2]|0,g|0,f|0)|0;if(!B)ma(s|0,p|0);D=p}else B=-1;if((B|0)==1){w=u;t=D;u=w;continue}}c[(c[h>>2]|0)+18720>>2]=1;if(!(c[8636]|0)){if(!(c[8637]|0)){o=0;fa(1);s=o;o=0;if((s|0)!=0&(p|0)!=0){C=uh(c[s>>2]|0,g|0,f|0)|0;if(!C)ma(s|0,p|0);D=p}else C=-1;if((C|0)==1){w=u;t=D;u=w;continue}o=0;fa(2);s=o;o=0;if((s|0)!=0&(p|0)!=0){E=uh(c[s>>2]|0,g|0,f|0)|0;if(!E)ma(s|0,p|0);D=p}else E=-1;if((E|0)==1){w=u;t=D;u=w;continue}o=0;fa(3);s=o;o=0;if((s|0)!=0&(p|0)!=0){F=uh(c[s>>2]|0,g|0,f|0)|0;if(!F)ma(s|0,p|0);D=p}else F=-1;if((F|0)==1){w=u;t=D;u=w;continue}o=0;fa(4);s=o;o=0;if((s|0)!=0&(p|0)!=0){G=uh(c[s>>2]|0,g|0,f|0)|0;if(!G)ma(s|0,p|0);D=p}else G=-1;if((G|0)==1){w=u;t=D;u=w;continue}c[8637]=1}c[8636]=1}s=(c[i>>2]|0)+300|0;c[s>>2]=-1;c[s+4>>2]=-1;c[s+8>>2]=-1;c[s+12>>2]=-1;c[s+16>>2]=-1;c[s+20>>2]=-1;c[s+24>>2]=-1;c[s+28>>2]=-1;s=(c[i>>2]|0)+332|0;c[s>>2]=-1;c[s+4>>2]=-1;c[s+8>>2]=-1;c[s+12>>2]=-1;c[s+16>>2]=-1;c[s+20>>2]=-1;c[s+24>>2]=-1;c[s+28>>2]=-1;c[(c[i>>2]|0)+17344>>2]=0;c[(c[h>>2]|0)+17856>>2]=1;c[(c[h>>2]|0)+17836>>2]=a;c[(c[i>>2]|0)+17352>>2]=8;c[(c[i>>2]|0)+17356>>2]=8;c[(c[i>>2]|0)+720>>2]=29;c[(c[i>>2]|0)+724>>2]=7;c[(c[i>>2]|0)+728>>2]=8;o=0;ca(9,c[i>>2]|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){H=uh(c[s>>2]|0,g|0,f|0)|0;if(!H)ma(s|0,p|0);D=p}else H=-1;if((H|0)==1){w=u;t=D;u=w;continue}c[(c[i>>2]|0)+88>>2]=0;o=0;s=ba(1)|0;n=o;o=0;if((n|0)!=0&(p|0)!=0){I=uh(c[n>>2]|0,g|0,f|0)|0;if(!I)ma(n|0,p|0);D=p}else I=-1;if((I|0)==1){w=u;t=D;u=w;continue}o=0;ca(c[s>>2]|0,(c[h>>2]|0)+17876|0);s=o;o=0;if((s|0)!=0&(p|0)!=0){J=uh(c[s>>2]|0,g|0,f|0)|0;if(!J)ma(s|0,p|0);D=p}else J=-1;if((J|0)==1){w=u;t=D;u=w}else{x=29;break}}if((x|0)==9){q=u;r=0;jh(g|0);l=b;return r|0}else if((x|0)==29){q=u;r=c[h>>2]|0;jh(g|0);l=b;return r|0}return 0}function Uf(a){a=a|0;var b=0,d=0,e=0,f=0;if(!a)return;ya[c[(rd()|0)+20>>2]&15](a+17876|0);Wa(c[a+17888>>2]|0);b=a+18676|0;d=a+17900|0;if((c[b>>2]|0)>0){e=0;do{f=(c[d>>2]|0)+(e*24|0)|0;ya[c[(rd()|0)+20>>2]&15](f);e=e+1|0}while((e|0)<(c[b>>2]|0))}Wa(c[a+17904>>2]|0);Wa(c[d>>2]|0);if((c[b>>2]|0)>0)Fe(a+18684|0);Wa(a);return}function Vf(a,b){a=a|0;b=b|0;var d=0,e=0;d=Va(b,68)|0;c[a+704>>2]=d;if(!d){e=1;return e|0}c[a+700>>2]=b;d=Va(b,4)|0;c[a+732>>2]=d;e=(d|0)==0&1;return e|0}function Wf(a){a=a|0;var b=0;b=a+704|0;Wa(c[b>>2]|0);c[b>>2]=0;b=a+732|0;Wa(c[b>>2]|0);c[b>>2]=0;return}function Xf(a){a=a|0;var b=0,d=0;b=c[a+612>>2]|0;c[a+708>>2]=(c[a+704>>2]|0)+(b*68|0)+68;d=c[a+732>>2]|0;c[a+736>>2]=d+(b<<2)+4;qh(d|0,0,S(b<<2,(c[a+600>>2]|0)+1|0)|0)|0;return}function Yf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+32|0;f=e+16|0;g=e+8|0;h=e;i=a+432|0;do if((b|0)==1){j=c[a+732>>2]|0;if((j|0)<0){Sa(i,1,31226,h);k=1;l=e;return k|0}m=c[a+17836>>2]|0;n=m+12+(j*160|0)+28|0;if((((c[m+12+(j*160|0)+32>>2]|0)==(c[d+4>>2]|0)?(c[n>>2]|0)==(c[d>>2]|0):0)?(c[m+12+(j*160|0)+52>>2]|0)==(c[d+24>>2]|0):0)?(c[m+12+(j*160|0)+48>>2]|0)==(c[d+20>>2]|0):0){_a(n,d);break}Sa(i,1,31252,g)}else Sa(i,1,31280,f);while(0);k=c[i>>2]|0;l=e;return k|0}function Zf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+32|0;f=e+16|0;g=e+8|0;switch(b|0){case 1:{h=0;break}case 2:{h=1;break}case 4:{h=2;break}default:{Sa(a,1,31280,e);i=c[a>>2]|0;l=e;return i|0}}b=c[a+300+(h<<2)>>2]|0;if(b>>>0>14){Sa(a,1,31304,g);i=c[a>>2]|0;l=e;return i|0}g=c[a+17404>>2]|0;h=g+12+(b*160|0)+28|0;if((((c[g+12+(b*160|0)+32>>2]|0)==(c[d+4>>2]|0)?(c[h>>2]|0)==(c[d>>2]|0):0)?(c[g+12+(b*160|0)+52>>2]|0)==(c[d+24>>2]|0):0)?(c[g+12+(b*160|0)+48>>2]|0)==(c[d+20>>2]|0):0){_a(d,h);i=c[a>>2]|0;l=e;return i|0}Sa(a,1,31252,f);i=c[a>>2]|0;l=e;return i|0}function _f(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,da=0,fa=0,ga=0;f=l;l=l+16|0;g=f;h=4;i=ih(40)|0;c[i>>2]=0;j=f+12|0;k=f+8|0;m=f+4|0;c[j>>2]=b+432;c[k>>2]=c[(c[j>>2]|0)+17404>>2];c[m>>2]=(c[(c[j>>2]|0)+17404>>2]|0)+12;n=c[e>>2]|0;c[c[j>>2]>>2]=0;if((d|0)==0?(c[(c[j>>2]|0)+364>>2]|0)>0:0)c[(c[(c[j>>2]|0)+368>>2]|0)+112>>2]=1;q=b+17856|0;c[q>>2]=0;r=b+17864|0;if(((c[r>>2]|0)==0?(c[(c[j>>2]|0)+556>>2]|0)>-1:0)?(c[(c[m>>2]|0)+((c[(c[j>>2]|0)+556>>2]|0)*160|0)>>2]|0)==0:0){o=0;ia(c[(c[k>>2]|0)+8>>2]|0,c[c[k>>2]>>2]|0,(c[m>>2]|0)+((c[(c[j>>2]|0)+556>>2]|0)*160|0)+16|0)|0;s=o;o=0;if((s|0)!=0&(p|0)!=0){t=uh(c[s>>2]|0,i|0,h|0)|0;if(!t)ma(s|0,p|0);D=p}else t=-1;if((t|0)==1){u=D;v=0}else w=9}else w=9;do if((w|0)==9){t=c[(c[j>>2]|0)+17404>>2]|0;o=0;s=o;o=0;if((s|0)!=0&(p|0)!=0){x=uh(c[s>>2]|0,i|0,h|0)|0;if(!x)ma(s|0,p|0);D=p}else x=-1;if((x|0)!=1){if(c[t+12>>2]|0)if(c[t+172>>2]|0)if(c[t+332>>2]|0)if(c[t+492>>2]|0)if(c[t+652>>2]|0)if(c[t+812>>2]|0)if(c[t+972>>2]|0)if(c[t+1132>>2]|0)if(c[t+1292>>2]|0)if(c[t+1452>>2]|0)if(c[t+1612>>2]|0)if(c[t+1772>>2]|0)if(c[t+1932>>2]|0)if(c[t+2092>>2]|0)if(!(c[t+2252>>2]|0)){y=14;w=12}else z=-1;else{y=13;w=12}else{y=12;w=12}else{y=11;w=12}else{y=10;w=12}else{y=9;w=12}else{y=8;w=12}else{y=7;w=12}else{y=6;w=12}else{y=5;w=12}else{y=4;w=12}else{y=3;w=12}else{y=2;w=12}else{y=1;w=12}else{y=0;w=12}if((w|0)==12){c[t+12+(y*160|0)>>2]=1;z=y}o=0;t=o;o=0;if((t|0)!=0&(p|0)!=0){A=uh(c[t>>2]|0,i|0,h|0)|0;if(!A)ma(t|0,p|0);D=p}else A=-1;if((A|0)!=1){c[(c[j>>2]|0)+556>>2]=z;if((c[(c[j>>2]|0)+556>>2]|0)==-1){o=0;ka(54,c[j>>2]|0,2,31332,g|0);t=o;o=0;if((t|0)!=0&(p|0)!=0){B=uh(c[t>>2]|0,i|0,h|0)|0;if(!B)ma(t|0,p|0);D=p}else B=-1;if((B|0)==1){u=D;v=0;break}C=c[c[j>>2]>>2]|0;jh(i|0);l=f;return C|0}c[(c[j>>2]|0)+296>>2]=(c[k>>2]|0)+12+((c[(c[j>>2]|0)+556>>2]|0)*160|0);t=b+18724|0;c[t>>2]=0;if(c[r>>2]|0){s=c[b+17872>>2]|0;o=0;E=o;o=0;if((E|0)!=0&(p|0)!=0){F=uh(c[E>>2]|0,i|0,h|0)|0;if(!F)ma(E|0,p|0);D=p}else F=-1;if((F|0)==1){u=D;v=t;break}c[(c[m>>2]|0)+((c[(c[j>>2]|0)+556>>2]|0)*160|0)+148>>2]=s;s=c[m>>2]|0;E=c[(c[j>>2]|0)+556>>2]|0;c[b+17868>>2]=s+(E*160|0);c[s+(E*160|0)+152>>2]=-1;c[s+(E*160|0)+156>>2]=-1;o=0;E=o;o=0;if((E|0)!=0&(p|0)!=0){G=uh(c[E>>2]|0,i|0,h|0)|0;if(!G)ma(E|0,p|0);D=p}else G=-1;if((G|0)==1){u=D;v=t;break}}else c[b+17868>>2]=(c[m>>2]|0)+((c[(c[j>>2]|0)+556>>2]|0)*160|0);i=th((c[j>>2]|0)+92|0,1,i|0,h|0)|0;h=D;o=0;E=o;o=0;if((E|0)!=0&(p|0)!=0){H=uh(c[E>>2]|0,i|0,h|0)|0;if(!H)ma(E|0,p|0);D=p}else H=-1;if((H|0)==1){u=D;v=t}else{u=0;v=t}}else{u=D;v=0}}else{u=D;v=0}}while(0);a:while(1){if(u|0){o=0;H=ba(1)|0;G=o;o=0;if((G|0)!=0&(p|0)!=0){I=uh(c[G>>2]|0,i|0,h|0)|0;if(!I)ma(G|0,p|0);D=p}else I=-1;if((I|0)==1){J=v;u=D;v=J;continue}c[(c[j>>2]|0)+88>>2]=0;c[q>>2]=1;G=H+8|0;o=0;ea(c[G>>2]|0,b+17876|0)|0;H=o;o=0;if((H|0)!=0&(p|0)!=0){K=uh(c[H>>2]|0,i|0,h|0)|0;if(!K)ma(H|0,p|0);D=p}else K=-1;if((K|0)==1){J=v;u=D;v=J;continue}H=b+18676|0;if((c[H>>2]|0)>0){F=b+17900|0;B=0;while(1){o=0;ea(c[G>>2]|0,(c[F>>2]|0)+(B*24|0)|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){L=uh(c[g>>2]|0,i|0,h|0)|0;if(!L)ma(g|0,p|0);D=p}else L=-1;if((L|0)==1){J=v;u=D;v=J;continue a}B=B+1|0;if((B|0)>=(c[H>>2]|0))break}}o=0;H=o;o=0;if((H|0)!=0&(p|0)!=0){M=uh(c[H>>2]|0,i|0,h|0)|0;if(!M)ma(H|0,p|0);D=p}else M=-1;if((M|0)==1){J=v;u=D;v=J;continue}if((c[v>>2]|0)==1){H=c[b+17860>>2]|0;if(H){B=H;H=0;while(1){F=c[(c[j>>2]|0)+300+(H<<2)>>2]|0;G=c[m>>2]|0;g=c[k>>2]|0;z=(F|0)>-1;if(((z?(A=G+(F*160|0)|0,y=c[A>>2]|0,(y|0)>0):0)?(x=y+-1|0,c[A>>2]=x,(x|0)==0):0)?c[G+(F*160|0)+24>>2]|0:0){o=0;ia(c[g+8>>2]|0,c[g>>2]|0,G+(F*160|0)+16|0)|0;G=o;o=0;if((G|0)!=0&(p|0)!=0){N=uh(c[G>>2]|0,i|0,h|0)|0;if(!N)ma(G|0,p|0);D=p}else N=-1;if((N|0)==1){J=v;u=D;v=J;continue a}}do if(((B&1|0?(G=c[m>>2]|0,g=c[k>>2]|0,z):0)?(x=G+(F*160|0)|0,A=c[x>>2]|0,(A|0)>0):0)?(y=A+-1|0,c[x>>2]=y,(y|0)==0):0){if(!(c[G+(F*160|0)+24>>2]|0))break;o=0;ia(c[g+8>>2]|0,c[g>>2]|0,G+(F*160|0)+16|0)|0;G=o;o=0;if((G|0)!=0&(p|0)!=0){O=uh(c[G>>2]|0,i|0,h|0)|0;if(!O)ma(G|0,p|0);D=p}else O=-1;if((O|0)==1){J=v;u=D;v=J;continue a}}while(0);H=H+1|0;B=B>>1;if(!B)break}if((H|0)<8){P=H;w=62}}else{P=0;w=62}b:do if((w|0)==62)while(1){w=0;if(c[(c[j>>2]|0)+576>>2]|0)break b;B=c[(c[j>>2]|0)+300+(P<<2)>>2]|0;F=c[m>>2]|0;z=c[k>>2]|0;if((((B|0)>-1?(G=F+(B*160|0)|0,g=c[G>>2]|0,(g|0)>0):0)?(y=g+-1|0,c[G>>2]=y,(y|0)==0):0)?c[F+(B*160|0)+24>>2]|0:0){o=0;ia(c[z+8>>2]|0,c[z>>2]|0,F+(B*160|0)+16|0)|0;B=o;o=0;if((B|0)!=0&(p|0)!=0){Q=uh(c[B>>2]|0,i|0,h|0)|0;if(!Q)ma(B|0,p|0);D=p}else Q=-1;if((Q|0)==1){J=v;u=D;v=J;continue a}}P=P+1|0;if((P|0)>=8)break;else w=62}while(0);c[v>>2]=0}H=c[(c[j>>2]|0)+556>>2]|0;B=c[m>>2]|0;F=c[k>>2]|0;if((((H|0)>-1?(z=B+(H*160|0)|0,y=c[z>>2]|0,(y|0)>0):0)?(G=y+-1|0,c[z>>2]=G,(G|0)==0):0)?c[B+(H*160|0)+24>>2]|0:0){o=0;ia(c[F+8>>2]|0,c[F>>2]|0,B+(H*160|0)+16|0)|0;H=o;o=0;if((H|0)!=0&(p|0)!=0){R=uh(c[H>>2]|0,i|0,h|0)|0;if(!R)ma(H|0,p|0);D=p}else R=-1;if((R|0)==1){J=v;u=D;v=J;continue}}o=0;H=o;o=0;if((H|0)!=0&(p|0)!=0){S=uh(c[H>>2]|0,i|0,h|0)|0;if(!S)ma(H|0,p|0);D=p}else S=-1;if((S|0)==1){J=v;u=D;v=J;continue}else{w=78;break}}c[(c[j>>2]|0)+88>>2]=1;o=0;ka(55,b|0,n|0,n+d|0,e|0);H=o;o=0;if((H|0)!=0&(p|0)!=0){T=uh(c[H>>2]|0,i|0,h|0)|0;if(!T)ma(H|0,p|0);D=p}else T=-1;if((T|0)==1){J=v;u=D;v=J;continue}H=b+17836|0;B=c[H>>2]|0;o=0;F=o;o=0;if((F|0)!=0&(p|0)!=0){U=uh(c[F>>2]|0,i|0,h|0)|0;if(!U)ma(F|0,p|0);D=p}else U=-1;if((U|0)==1){J=v;u=D;v=J;continue}F=c[b+17860>>2]|0;G=B+8|0;if(F){z=F;F=0;while(1){y=b+732+(F<<2)|0;g=c[y>>2]|0;if((g|0)>-1){x=B+12+(g*160|0)|0;A=c[x>>2]|0;if(((A|0)>0?(t=A+-1|0,c[x>>2]=t,(t|0)==0):0)?c[B+12+(g*160|0)+24>>2]|0:0){o=0;ia(c[G>>2]|0,c[B>>2]|0,B+12+(g*160|0)+16|0)|0;t=o;o=0;if((t|0)!=0&(p|0)!=0){V=uh(c[t>>2]|0,i|0,h|0)|0;if(!V)ma(t|0,p|0);D=p}else V=-1;if((V|0)==1){J=v;u=D;v=J;continue a}}if(((z&1|0?(t=c[x>>2]|0,(t|0)>0):0)?(A=t+-1|0,c[x>>2]=A,(A|0)==0):0)?c[B+12+(g*160|0)+24>>2]|0:0){o=0;ia(c[G>>2]|0,c[B>>2]|0,B+12+(g*160|0)+16|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){W=uh(c[g>>2]|0,i|0,h|0)|0;if(!W)ma(g|0,p|0);D=p}else W=-1;if((W|0)==1){J=v;u=D;v=J;continue a}}}c[y>>2]=c[b+764+(F<<2)>>2];F=F+1|0;z=z>>1;if(!z)break}if((F|0)<8){X=F;w=83}}else{X=0;w=83}c:do if((w|0)==83){w=0;z=b+1008|0;y=X;while(1){if(c[z>>2]|0)break c;g=b+732+(y<<2)|0;A=c[g>>2]|0;if((((A|0)>-1?(x=B+12+(A*160|0)|0,t=c[x>>2]|0,(t|0)>0):0)?(E=t+-1|0,c[x>>2]=E,(E|0)==0):0)?c[B+12+(A*160|0)+24>>2]|0:0){o=0;ia(c[G>>2]|0,c[B>>2]|0,B+12+(A*160|0)+16|0)|0;A=o;o=0;if((A|0)!=0&(p|0)!=0){Y=uh(c[A>>2]|0,i|0,h|0)|0;if(!Y)ma(A|0,p|0);D=p}else Y=-1;if((Y|0)==1){J=v;u=D;v=J;continue a}}c[g>>2]=c[b+764+(y<<2)>>2];y=y+1|0;if((y|0)>=8)break}}while(0);o=0;G=o;o=0;if((G|0)!=0&(p|0)!=0){Z=uh(c[G>>2]|0,i|0,h|0)|0;if(!Z)ma(G|0,p|0);D=p}else Z=-1;if((Z|0)==1){J=v;u=D;v=J;continue}c[v>>2]=0;G=b+988|0;c[b+720>>2]=(c[H>>2]|0)+12+((c[G>>2]|0)*160|0)+28;if(!((c[r>>2]|0)!=0?(c[b+1e3>>2]|0)!=0:0)){o=0;F=o;o=0;if((F|0)!=0&(p|0)!=0){_=uh(c[F>>2]|0,i|0,h|0)|0;if(!_)ma(F|0,p|0);D=p}else _=-1;if((_|0)==1){J=v;u=D;v=J;continue}F=B+12+((c[G>>2]|0)*160|0)|0;c[F>>2]=(c[F>>2]|0)+-1;o=0;F=o;o=0;if((F|0)!=0&(p|0)!=0){$=uh(c[F>>2]|0,i|0,h|0)|0;if(!$)ma(F|0,p|0);D=p}else $=-1;if(($|0)==1){J=v;u=D;v=J;continue}}c[b+796>>2]=-1;c[b+860>>2]=-1;c[b+924>>2]=-1;if((c[(c[j>>2]|0)+576>>2]|0)==0?(c[(c[j>>2]|0)+572>>2]=c[(c[j>>2]|0)+568>>2],c[(c[j>>2]|0)+292>>2]=c[(c[j>>2]|0)+296>>2],(a[(c[j>>2]|0)+3980>>0]|0)!=0):0){if(!(c[r>>2]|0)){o=0;ca(10,c[j>>2]|0);F=o;o=0;if((F|0)!=0&(p|0)!=0){aa=uh(c[F>>2]|0,i|0,h|0)|0;if(!aa)ma(F|0,p|0);D=p}else aa=-1;if((aa|0)==1){J=v;u=D;v=J;continue}w=116}}else w=116;if((w|0)==116?(w=0,(c[r>>2]|0)==0):0){w=123;break}F=c[(c[b+17872>>2]|0)+12>>2]|0;o=0;G=o;o=0;if((G|0)!=0&(p|0)!=0){da=uh(c[G>>2]|0,i|0,h|0)|0;if(!da)ma(G|0,p|0);D=p}else da=-1;if((da|0)==1){J=v;u=D;v=J;continue}if(c[(c[j>>2]|0)+568>>2]|0){G=(c[j>>2]|0)+17344|0;c[G>>2]=(c[G>>2]|0)+1}c[F+44>>2]=1;c[F+40>>2]=1;o=0;F=o;o=0;if((F|0)!=0&(p|0)!=0){fa=uh(c[F>>2]|0,i|0,h|0)|0;if(!fa)ma(F|0,p|0);D=p}else fa=-1;if((fa|0)==1){J=v;u=D;v=J;continue}o=0;F=o;o=0;if((F|0)!=0&(p|0)!=0){ga=uh(c[F>>2]|0,i|0,h|0)|0;if(!ga)ma(F|0,p|0);D=p}else ga=-1;if((ga|0)==1){J=v;u=D;v=J}else{w=122;break}}if((w|0)==78){C=-1;jh(i|0);l=f;return C|0}else if((w|0)!=122)if((w|0)==123?(c[(c[j>>2]|0)+272>>2]=c[(c[j>>2]|0)+256>>2],c[(c[j>>2]|0)+276>>2]=c[(c[j>>2]|0)+260>>2],c[(c[j>>2]|0)+568>>2]|0):0){w=(c[j>>2]|0)+17344|0;c[w>>2]=(c[w>>2]|0)+1}c[(c[j>>2]|0)+88>>2]=0;C=0;jh(i|0);l=f;return C|0}function $f(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=a+17856|0;if((c[d>>2]|0)==1){e=-1;return e|0}c[d>>2]=1;if(!(c[a+1e3>>2]|0)){e=-1;return e|0}d=b;b=c[a+720>>2]|0;a=d+120|0;do{c[d>>2]=c[b>>2];d=d+4|0;b=b+4|0}while((d|0)<(a|0));e=0;return e|0}function ag(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=l;l=l+32|0;k=j;m=b+e|0;n=m+-1|0;o=(h|0)==0;if(o)p=a[n>>0]|0;else{Ga[h&63](i,n,k,1);p=a[k>>0]|0}c[g>>2]=0;n=p&255;if((n&224|0)!=192){q=0;l=j;return q|0}r=(n&7)+1|0;s=(n>>>3&3)+1|0;n=S(s,r)|0;if((n+2|0)>>>0>e>>>0){q=7;l=j;return q|0}t=-2-n|0;u=m+t|0;if(o)v=a[u>>0]|0;else{Ga[h&63](i,u,k,1);v=a[k>>0]|0}if(p<<24>>24!=v<<24>>24){q=7;l=j;return q|0}v=b+(e+1+t)|0;if(o){w=0;x=v}else{Ga[h&63](i,v,k,n);w=0;x=k}while(1){k=0;n=0;v=x;while(1){n=(d[v>>0]|0)<<(k<<3)|n;k=k+1|0;if((k|0)==(s|0))break;else v=v+1|0}c[f+(w<<2)>>2]=n;w=w+1|0;if((w|0)==(r|0))break;else x=x+s|0}c[g>>2]=r;q=0;l=j;return q|0}function bg(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,eb=0,fb=0;f=b+4|0;g=(((c[f>>2]|0)*252|0)+4|0)>>>8;h=b+8|0;i=c[h>>2]|0;if((i|0)<0){db(b);j=c[h>>2]|0}else j=i;i=c[b>>2]|0;k=g<<24;if(i>>>0<k>>>0){l=1;m=g;n=i}else{l=0;m=(c[f>>2]|0)-g|0;n=i-k|0}k=d[1280+m>>0]|0;i=m<<k;m=n<<k;n=j-k|0;c[b>>2]=m;c[h>>2]=n;c[f>>2]=i;if(l)return;l=((i<<7)+128|0)>>>8;if((n|0)<0){db(b);o=c[b>>2]|0;p=c[h>>2]|0}else{o=m;p=n}n=l<<24;if(o>>>0<n>>>0){q=1;r=l;s=o}else{q=0;r=(c[f>>2]|0)-l|0;s=o-n|0}n=d[1280+r>>0]|0;o=r<<n;r=s<<n;s=p-n|0;c[b>>2]=r;c[h>>2]=s;c[f>>2]=o;n=((o<<7)+128|0)>>>8;o=(s|0)<0;do if(q){if(o){db(b);t=c[b>>2]|0;u=c[h>>2]|0}else{t=r;u=s}p=n<<24;if(t>>>0<p>>>0){v=0;w=n;x=t}else{v=8;w=(c[f>>2]|0)-n|0;x=t-p|0}p=d[1280+w>>0]|0;l=w<<p;m=x<<p;i=u-p|0;c[b>>2]=m;c[h>>2]=i;c[f>>2]=l;p=((l<<7)+128|0)>>>8;if((i|0)<0){db(b);y=c[b>>2]|0;z=c[h>>2]|0}else{y=m;z=i}i=p<<24;if(y>>>0<i>>>0){A=0;B=p;C=y}else{A=4;B=(c[f>>2]|0)-p|0;C=y-i|0}i=d[1280+B>>0]|0;p=B<<i;m=C<<i;l=z-i|0;c[b>>2]=m;c[h>>2]=l;c[f>>2]=p;i=((p<<7)+128|0)>>>8;if((l|0)<0){db(b);D=c[b>>2]|0;E=c[h>>2]|0}else{D=m;E=l}l=i<<24;if(D>>>0<l>>>0){F=0;G=i;H=D}else{F=2;G=(c[f>>2]|0)-i|0;H=D-l|0}l=d[1280+G>>0]|0;i=G<<l;m=H<<l;p=E-l|0;c[b>>2]=m;c[h>>2]=p;c[f>>2]=i;l=((i<<7)+128|0)>>>8;if((p|0)<0){db(b);I=c[b>>2]|0;J=c[h>>2]|0}else{I=m;J=p}p=l<<24;if(I>>>0<p>>>0){K=0;L=l;M=I}else{K=1;L=(c[f>>2]|0)-l|0;M=I-p|0}p=d[1280+L>>0]|0;c[b>>2]=M<<p;c[h>>2]=J-p;c[f>>2]=L<<p;N=A|v|F|K}else{if(o){db(b);O=c[b>>2]|0;P=c[h>>2]|0}else{O=r;P=s}p=n<<24;if(O>>>0<p>>>0){Q=1;R=n;S=O}else{Q=0;R=(c[f>>2]|0)-n|0;S=O-p|0}p=d[1280+R>>0]|0;l=R<<p;m=S<<p;i=P-p|0;c[b>>2]=m;c[h>>2]=i;c[f>>2]=l;p=((l<<7)+128|0)>>>8;l=(i|0)<0;if(Q){if(l){db(b);T=c[b>>2]|0;U=c[h>>2]|0}else{T=m;U=i}k=p<<24;if(T>>>0<k>>>0){V=16;W=p;X=T}else{V=24;W=(c[f>>2]|0)-p|0;X=T-k|0}k=d[1280+W>>0]|0;j=W<<k;g=X<<k;Y=U-k|0;c[b>>2]=g;c[h>>2]=Y;c[f>>2]=j;k=((j<<7)+128|0)>>>8;if((Y|0)<0){db(b);Z=c[b>>2]|0;_=c[h>>2]|0}else{Z=g;_=Y}Y=k<<24;if(Z>>>0<Y>>>0){$=0;aa=k;ba=Z}else{$=4;aa=(c[f>>2]|0)-k|0;ba=Z-Y|0}Y=d[1280+aa>>0]|0;k=aa<<Y;g=ba<<Y;j=_-Y|0;c[b>>2]=g;c[h>>2]=j;c[f>>2]=k;Y=((k<<7)+128|0)>>>8;if((j|0)<0){db(b);ca=c[b>>2]|0;da=c[h>>2]|0}else{ca=g;da=j}j=Y<<24;if(ca>>>0<j>>>0){ea=0;fa=Y;ga=ca}else{ea=2;fa=(c[f>>2]|0)-Y|0;ga=ca-j|0}j=d[1280+fa>>0]|0;Y=fa<<j;g=ga<<j;k=da-j|0;c[b>>2]=g;c[h>>2]=k;c[f>>2]=Y;j=((Y<<7)+128|0)>>>8;if((k|0)<0){db(b);ha=c[b>>2]|0;ia=c[h>>2]|0}else{ha=g;ia=k}k=j<<24;if(ha>>>0<k>>>0){ja=0;ka=j;la=ha}else{ja=1;ka=(c[f>>2]|0)-j|0;la=ha-k|0}k=d[1280+ka>>0]|0;c[b>>2]=la<<k;c[h>>2]=ia-k;c[f>>2]=ka<<k;N=V|$|ea|ja;break}if(l){db(b);ma=c[b>>2]|0;na=c[h>>2]|0}else{ma=m;na=i}i=p<<24;if(ma>>>0<i>>>0){oa=1;pa=p;qa=ma}else{oa=0;pa=(c[f>>2]|0)-p|0;qa=ma-i|0}i=d[1280+pa>>0]|0;p=pa<<i;m=qa<<i;l=na-i|0;c[b>>2]=m;c[h>>2]=l;c[f>>2]=p;if(!oa){i=p;k=l;j=m;g=7;Y=0;do{ra=g;g=g+-1|0;sa=((i<<7)+128|0)>>>8;if((k|0)<0){db(b);ta=c[b>>2]|0;ua=c[h>>2]|0}else{ta=j;ua=k}va=sa<<24;if(ta>>>0<va>>>0){wa=0;xa=sa;ya=ta}else{wa=1;xa=(c[f>>2]|0)-sa|0;ya=ta-va|0}va=d[1280+xa>>0]|0;i=xa<<va;j=ya<<va;k=ua-va|0;c[b>>2]=j;c[h>>2]=k;c[f>>2]=i;Y=wa<<g|Y}while((ra|0)>1);if((Y|0)<65)za=Y;else{g=((i<<7)+128|0)>>>8;if((k|0)<0){db(b);Aa=c[b>>2]|0;Ba=c[h>>2]|0}else{Aa=j;Ba=k}ra=g<<24;if(Aa>>>0<ra>>>0){Ca=0;Da=g;Ea=Aa}else{Ca=1;Da=(c[f>>2]|0)-g|0;Ea=Aa-ra|0}ra=d[1280+Da>>0]|0;c[b>>2]=Ea<<ra;c[h>>2]=Ba-ra;c[f>>2]=Da<<ra;za=(Y<<1)+-65+Ca|0}N=za+64|0;break}ra=((p<<7)+128|0)>>>8;if((l|0)<0){db(b);Fa=c[b>>2]|0;Ga=c[h>>2]|0}else{Fa=m;Ga=l}g=ra<<24;if(Fa>>>0<g>>>0){Ha=32;Ia=ra;Ja=Fa}else{Ha=48;Ia=(c[f>>2]|0)-ra|0;Ja=Fa-g|0}g=d[1280+Ia>>0]|0;ra=Ia<<g;va=Ja<<g;sa=Ga-g|0;c[b>>2]=va;c[h>>2]=sa;c[f>>2]=ra;g=((ra<<7)+128|0)>>>8;if((sa|0)<0){db(b);Ka=c[b>>2]|0;La=c[h>>2]|0}else{Ka=va;La=sa}sa=g<<24;if(Ka>>>0<sa>>>0){Ma=0;Na=g;Oa=Ka}else{Ma=8;Na=(c[f>>2]|0)-g|0;Oa=Ka-sa|0}sa=d[1280+Na>>0]|0;g=Na<<sa;va=Oa<<sa;ra=La-sa|0;c[b>>2]=va;c[h>>2]=ra;c[f>>2]=g;sa=((g<<7)+128|0)>>>8;if((ra|0)<0){db(b);Pa=c[b>>2]|0;Qa=c[h>>2]|0}else{Pa=va;Qa=ra}ra=sa<<24;if(Pa>>>0<ra>>>0){Ra=0;Sa=sa;Ta=Pa}else{Ra=4;Sa=(c[f>>2]|0)-sa|0;Ta=Pa-ra|0}ra=d[1280+Sa>>0]|0;sa=Sa<<ra;va=Ta<<ra;g=Qa-ra|0;c[b>>2]=va;c[h>>2]=g;c[f>>2]=sa;ra=((sa<<7)+128|0)>>>8;if((g|0)<0){db(b);Ua=c[b>>2]|0;Va=c[h>>2]|0}else{Ua=va;Va=g}g=ra<<24;if(Ua>>>0<g>>>0){Wa=0;Xa=ra;Ya=Ua}else{Wa=2;Xa=(c[f>>2]|0)-ra|0;Ya=Ua-g|0}g=d[1280+Xa>>0]|0;ra=Xa<<g;va=Ya<<g;sa=Va-g|0;c[b>>2]=va;c[h>>2]=sa;c[f>>2]=ra;g=((ra<<7)+128|0)>>>8;if((sa|0)<0){db(b);Za=c[b>>2]|0;_a=c[h>>2]|0}else{Za=va;_a=sa}sa=g<<24;if(Za>>>0<sa>>>0){$a=0;ab=g;bb=Za}else{$a=1;ab=(c[f>>2]|0)-g|0;bb=Za-sa|0}sa=d[1280+ab>>0]|0;c[b>>2]=bb<<sa;c[h>>2]=_a-sa;c[f>>2]=ab<<sa;N=Ha|Ma|Ra|Wa|$a}while(0);$a=d[e>>0]|0;Wa=d[31365+N>>0]|0;N=$a+-1|0;Ra=N<<1;if((Ra|0)<256){do if((Ra|0)>=(Wa|0))if(!(Wa&1)){cb=(Wa>>>1)+N|0;break}else{cb=N-((Wa+1|0)>>>1)|0;break}else cb=Wa;while(0);eb=cb+1|0}else{cb=$a^255;do if(cb<<1>>>0>=Wa>>>0)if(!(Wa&1)){fb=(Wa>>>1)+cb|0;break}else{fb=cb-((Wa+1|0)>>>1)|0;break}else fb=Wa;while(0);eb=255-fb|0}a[e>>0]=eb;return}function cg(){var a=0,b=0,d=0;a=l;l=l+16|0;b=a;d=of()|0;c[8638]=d;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;Oa(34556,d,b,0,10)|0;l=a;return}function dg(){return 0}function eg(){return}function fg(a,b){a=a|0;b=b|0;hh(31620)|0;return 0}function gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;d=l;l=l+16|0;e=d;f=d+4|0;Pa(34556,a,b,0,1)|0;Pa(34556,0,0,0,1)|0;c[f>>2]=0;b=Qa(34556,f)|0;if(!b){g=0;l=d;return g|0}else{h=b;i=0}a:while(1){if(i|0){j=3;break}k=c[h>>2]|0;switch(k|0){case 258:{b=c[h+12>>2]|0;a=c[h+16>>2]|0;m=b;n=a;o=a>>>1;p=b>>>1;break}case 261:{b=c[h+12>>2]|0;a=c[h+16>>2]|0;m=b;n=a;o=a;p=b>>>1;break}case 262:{b=c[h+12>>2]|0;a=c[h+16>>2]|0;m=b;n=a;o=a;p=b;break}default:{j=8;break a}}la(c[h+48>>2]|0,c[h+64>>2]|0,c[h+52>>2]|0,c[h+68>>2]|0,c[h+56>>2]|0,c[h+72>>2]|0,m|0,n|0,p|0,o|0);h=Qa(34556,f)|0;if(!h){g=1;j=10;break}else i=1}if((j|0)==3){while(1){j=0;hh(31658)|0;if(!(Qa(34556,f)|0)){g=i;break}else j=3}l=d;return g|0}else if((j|0)==8){c[e>>2]=k;gh(31708,e)|0;g=0;l=d;return g|0}else if((j|0)==10){l=d;return g|0}return 0}function hg(){return 34584}function ig(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=pg(c[a+60>>2]|0)|0;a=lg(na(6,d|0)|0)|0;l=b;return a|0}function jg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=l;l=l+48|0;f=e+16|0;g=e;h=e+32|0;i=a+28|0;j=c[i>>2]|0;c[h>>2]=j;k=a+20|0;m=(c[k>>2]|0)-j|0;c[h+4>>2]=m;c[h+8>>2]=b;c[h+12>>2]=d;b=m+d|0;m=a+60|0;c[g>>2]=c[m>>2];c[g+4>>2]=h;c[g+8>>2]=2;j=lg(ta(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=j;n=h;o=2;p=b;while(1){if((g|0)<0)break;p=p-g|0;q=c[n+4>>2]|0;r=g>>>0>q>>>0;s=r?n+8|0:n;t=(r<<31>>31)+o|0;u=g-(r?q:0)|0;c[s>>2]=(c[s>>2]|0)+u;q=s+4|0;c[q>>2]=(c[q>>2]|0)-u;c[f>>2]=c[m>>2];c[f+4>>2]=s;c[f+8>>2]=t;g=lg(ta(146,f|0)|0)|0;if((p|0)==(g|0)){v=3;break a}else{n=s;o=t}}c[a+16>>2]=0;c[i>>2]=0;c[k>>2]=0;c[a>>2]=c[a>>2]|32;if((o|0)==2)w=0;else w=d-(c[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=c[a+44>>2]|0;c[a+16>>2]=v+(c[a+48>>2]|0);c[i>>2]=v;c[k>>2]=v;w=d}l=e;return w|0}function kg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+32|0;f=e;g=e+20|0;c[f>>2]=c[a+60>>2];c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=g;c[f+16>>2]=d;if((lg(sa(140,f|0)|0)|0)<0){c[g>>2]=-1;h=-1}else h=c[g>>2]|0;l=e;return h|0}function lg(a){a=a|0;var b=0;if(a>>>0>4294963200){c[(mg()|0)>>2]=0-a;b=-1}else b=a;return b|0}function mg(){return (ng()|0)+64|0}function ng(){return og()|0}function og(){return 21244}function pg(a){a=a|0;return a|0}function qg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[b+36>>2]=6;if((c[b>>2]&64|0)==0?(c[g>>2]=c[b+60>>2],c[g+4>>2]=21523,c[g+8>>2]=f+16,ra(54,g|0)|0):0)a[b+75>>0]=-1;g=jg(b,d,e)|0;l=f;return g|0}function rg(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=b;b=c;do{d=d+1|0;b=b+1|0;c=a[d>>0]|0;e=a[b>>0]|0}while(!(c<<24>>24==0?1:c<<24>>24!=e<<24>>24));f=e;g=c}return (g&255)-(f&255)|0}function sg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+128|0;h=g+124|0;i=g;j=i;k=21616;m=j+124|0;do{c[j>>2]=c[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(m|0));if((d+-1|0)>>>0>2147483646)if(!d){n=1;o=h;p=4}else{c[(mg()|0)>>2]=75;q=-1}else{n=d;o=b;p=4}if((p|0)==4){p=-2-o|0;b=n>>>0>p>>>0?p:n;c[i+48>>2]=b;n=i+20|0;c[n>>2]=o;c[i+44>>2]=o;p=o+b|0;o=i+16|0;c[o>>2]=p;c[i+28>>2]=p;p=tg(i,e,f)|0;if(!b)q=p;else{b=c[n>>2]|0;a[b+(((b|0)==(c[o>>2]|0))<<31>>31)>>0]=0;q=p}}l=g;return q|0}function tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+224|0;g=f+120|0;h=f+80|0;i=f;j=f+136|0;k=h;m=k+40|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[g>>2]=c[e>>2];if((ug(0,d,g,i,h)|0)<0)n=-1;else{if((c[b+76>>2]|0)>-1)o=vg(b)|0;else o=0;e=c[b>>2]|0;k=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){m=b+44|0;p=c[m>>2]|0;c[m>>2]=j;q=b+28|0;c[q>>2]=j;r=b+20|0;c[r>>2]=j;c[e>>2]=80;s=b+16|0;c[s>>2]=j+80;j=ug(b,d,g,i,h)|0;if(!p)t=j;else{va[c[b+36>>2]&7](b,0,0)|0;u=(c[r>>2]|0)==0?-1:j;c[m>>2]=p;c[e>>2]=0;c[s>>2]=0;c[q>>2]=0;c[r>>2]=0;t=u}}else t=ug(b,d,g,i,h)|0;h=c[b>>2]|0;c[b>>2]=h|k;if(o|0)wg(b);n=(h&32|0)==0?t:-1}l=f;return n|0}function ug(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;j=l;l=l+64|0;k=j+16|0;m=j;n=j+24|0;o=j+8|0;p=j+20|0;c[k>>2]=e;q=(d|0)!=0;r=n+40|0;s=r;t=n+39|0;n=o+4|0;u=e;e=0;v=0;w=0;a:while(1){do if((e|0)>-1)if((v|0)>(2147483647-e|0)){c[(mg()|0)>>2]=75;x=-1;break}else{x=v+e|0;break}else x=e;while(0);y=a[u>>0]|0;if(!(y<<24>>24)){z=87;break}else{A=y;B=u}b:while(1){switch(A<<24>>24){case 37:{C=B;E=B;z=9;break b;break}case 0:{F=B;G=B;break b;break}default:{}}y=B+1|0;c[k>>2]=y;A=a[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((a[C+1>>0]|0)!=37){F=C;G=E;break c}y=E+1|0;H=C+2|0;c[k>>2]=H;if((a[H>>0]|0)==37){C=H;E=y;z=9}else{F=H;G=y;break}}while(0);y=G-u|0;if(q)xg(d,u,y);if(y|0){u=F;e=x;v=y;continue}y=F+1|0;H=(a[y>>0]|0)+-48|0;if(H>>>0<10){I=(a[F+2>>0]|0)==36;J=I?H:-1;K=I?1:w;L=I?F+3|0:y}else{J=-1;K=w;L=y}c[k>>2]=L;y=a[L>>0]|0;I=(y<<24>>24)+-32|0;d:do if(I>>>0<32){H=y;M=0;N=L;O=I;while(1){P=1<<O;if(!(P&75913)){Q=H;R=N;S=M;break d}T=P|M;P=N+1|0;c[k>>2]=P;U=a[P>>0]|0;O=(U<<24>>24)+-32|0;if(O>>>0>=32){Q=U;R=P;S=T;break}else{H=U;M=T;N=P}}}else{Q=y;R=L;S=0}while(0);if(Q<<24>>24==42){y=R+1|0;I=(a[y>>0]|0)+-48|0;if(I>>>0<10?(a[R+2>>0]|0)==36:0){c[i+(I<<2)>>2]=10;V=1;W=R+3|0;X=c[g+((a[y>>0]|0)+-48<<3)>>2]|0}else{if(K|0){Y=-1;break}if(q){I=(c[f>>2]|0)+(4-1)&~(4-1);N=c[I>>2]|0;c[f>>2]=I+4;V=0;W=y;X=N}else{V=0;W=y;X=0}}c[k>>2]=W;y=(X|0)<0;Z=W;_=y?S|8192:S;$=V;aa=y?0-X|0:X}else{y=yg(k)|0;if((y|0)<0){Y=-1;break}Z=c[k>>2]|0;_=S;$=K;aa=y}do if((a[Z>>0]|0)==46){if((a[Z+1>>0]|0)!=42){c[k>>2]=Z+1;y=yg(k)|0;ba=c[k>>2]|0;ca=y;break}y=Z+2|0;N=(a[y>>0]|0)+-48|0;if(N>>>0<10?(a[Z+3>>0]|0)==36:0){c[i+(N<<2)>>2]=10;N=c[g+((a[y>>0]|0)+-48<<3)>>2]|0;I=Z+4|0;c[k>>2]=I;ba=I;ca=N;break}if($|0){Y=-1;break a}if(q){N=(c[f>>2]|0)+(4-1)&~(4-1);I=c[N>>2]|0;c[f>>2]=N+4;da=I}else da=0;c[k>>2]=y;ba=y;ca=da}else{ba=Z;ca=-1}while(0);y=ba;I=0;while(1){if(((a[y>>0]|0)+-65|0)>>>0>57){Y=-1;break a}ea=y+1|0;c[k>>2]=ea;fa=a[(a[y>>0]|0)+-65+(31753+(I*58|0))>>0]|0;ga=fa&255;if((ga+-1|0)>>>0<8){y=ea;I=ga}else break}if(!(fa<<24>>24)){Y=-1;break}N=(J|0)>-1;do if(fa<<24>>24==19)if(N){Y=-1;break a}else z=49;else{if(N){c[i+(J<<2)>>2]=ga;M=g+(J<<3)|0;H=c[M+4>>2]|0;O=m;c[O>>2]=c[M>>2];c[O+4>>2]=H;z=49;break}if(!q){Y=0;break a}zg(m,ga,f)}while(0);if((z|0)==49?(z=0,!q):0){u=ea;e=x;v=0;w=$;continue}N=a[y>>0]|0;H=(I|0)!=0&(N&15|0)==3?N&-33:N;N=_&-65537;O=(_&8192|0)==0?_:N;e:do switch(H|0){case 110:{switch((I&255)<<24>>24){case 0:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 1:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 2:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}case 3:{b[c[m>>2]>>1]=x;u=ea;e=x;v=0;w=$;continue a;break}case 4:{a[c[m>>2]>>0]=x;u=ea;e=x;v=0;w=$;continue a;break}case 6:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 7:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}default:{u=ea;e=x;v=0;w=$;continue a}}break}case 112:{ha=O|8;ia=ca>>>0>8?ca:8;ja=120;z=61;break}case 88:case 120:{ha=O;ia=ca;ja=H;z=61;break}case 111:{M=m;P=c[M>>2]|0;T=c[M+4>>2]|0;M=Bg(P,T,r)|0;U=s-M|0;ka=P;la=T;ma=M;na=O;oa=(O&8|0)==0|(ca|0)>(U|0)?ca:U+1|0;pa=0;qa=32217;z=67;break}case 105:case 100:{U=m;M=c[U>>2]|0;T=c[U+4>>2]|0;if((T|0)<0){U=oh(0,0,M|0,T|0)|0;P=D;ra=m;c[ra>>2]=U;c[ra+4>>2]=P;sa=U;ta=P;ua=1;va=32217;z=66;break e}else{sa=M;ta=T;ua=(O&2049|0)!=0&1;va=(O&2048|0)==0?((O&1|0)==0?32217:32219):32218;z=66;break e}break}case 117:{T=m;sa=c[T>>2]|0;ta=c[T+4>>2]|0;ua=0;va=32217;z=66;break}case 99:{a[t>>0]=c[m>>2];wa=t;xa=N;ya=1;za=0;Aa=32217;Ba=r;break}case 109:{Ca=Dg(c[(mg()|0)>>2]|0)|0;z=71;break}case 115:{T=c[m>>2]|0;Ca=T|0?T:32227;z=71;break}case 67:{c[o>>2]=c[m>>2];c[n>>2]=0;c[m>>2]=o;Da=o;Ea=-1;z=75;break}case 83:{T=c[m>>2]|0;if(!ca){Fg(d,32,aa,0,O);Fa=0;z=84}else{Da=T;Ea=ca;z=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{u=ea;e=x;v=Hg(d,+h[m>>3],aa,ca,O,H)|0;w=$;continue a;break}default:{wa=u;xa=O;ya=ca;za=0;Aa=32217;Ba=r}}while(0);f:do if((z|0)==61){z=0;H=m;I=c[H>>2]|0;y=c[H+4>>2]|0;H=Ag(I,y,r,ja&32)|0;T=(ha&8|0)==0|(I|0)==0&(y|0)==0;ka=I;la=y;ma=H;na=ha;oa=ia;pa=T?0:2;qa=T?32217:32217+(ja>>4)|0;z=67}else if((z|0)==66){z=0;ka=sa;la=ta;ma=Cg(sa,ta,r)|0;na=O;oa=ca;pa=ua;qa=va;z=67}else if((z|0)==71){z=0;T=Eg(Ca,0,ca)|0;H=(T|0)==0;wa=Ca;xa=N;ya=H?ca:T-Ca|0;za=0;Aa=32217;Ba=H?Ca+ca|0:T}else if((z|0)==75){z=0;T=0;H=0;y=Da;while(1){I=c[y>>2]|0;if(!I){Ga=T;Ha=H;break}M=Gg(p,I)|0;if((M|0)<0|M>>>0>(Ea-T|0)>>>0){Ga=T;Ha=M;break}I=M+T|0;if(Ea>>>0>I>>>0){T=I;H=M;y=y+4|0}else{Ga=I;Ha=M;break}}if((Ha|0)<0){Y=-1;break a}Fg(d,32,aa,Ga,O);if(!Ga){Fa=0;z=84}else{y=0;H=Da;while(1){T=c[H>>2]|0;if(!T){Fa=Ga;z=84;break f}M=Gg(p,T)|0;y=M+y|0;if((y|0)>(Ga|0)){Fa=Ga;z=84;break f}xg(d,p,M);if(y>>>0>=Ga>>>0){Fa=Ga;z=84;break}else H=H+4|0}}}while(0);if((z|0)==67){z=0;N=(ka|0)!=0|(la|0)!=0;H=(oa|0)!=0|N;y=((N^1)&1)+(s-ma)|0;wa=H?ma:r;xa=(oa|0)>-1?na&-65537:na;ya=H?((oa|0)>(y|0)?oa:y):oa;za=pa;Aa=qa;Ba=r}else if((z|0)==84){z=0;Fg(d,32,aa,Fa,O^8192);u=ea;e=x;v=(aa|0)>(Fa|0)?aa:Fa;w=$;continue}y=Ba-wa|0;H=(ya|0)<(y|0)?y:ya;N=H+za|0;M=(aa|0)<(N|0)?N:aa;Fg(d,32,M,N,xa);xg(d,Aa,za);Fg(d,48,M,N,xa^65536);Fg(d,48,H,y,0);xg(d,wa,y);Fg(d,32,M,N,xa^8192);u=ea;e=x;v=M;w=$}g:do if((z|0)==87)if(!d)if(!w)Y=0;else{$=1;while(1){v=c[i+($<<2)>>2]|0;if(!v){Ia=$;break}zg(g+($<<3)|0,v,f);$=$+1|0;if(($|0)>=10){Y=1;break g}}while(1){if(c[i+(Ia<<2)>>2]|0){Y=-1;break g}Ia=Ia+1|0;if((Ia|0)>=10){Y=1;break}}}else Y=x;while(0);l=j;return Y|0}function vg(a){a=a|0;return 0}function wg(a){a=a|0;return}function xg(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))Tg(b,d,a)|0;return}function yg(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;e=(a[d>>0]|0)+-48|0;if(e>>>0<10){f=d;d=0;g=e;while(1){e=g+(d*10|0)|0;f=f+1|0;c[b>>2]=f;g=(a[f>>0]|0)+-48|0;if(g>>>0>=10){h=e;break}else d=e}}else h=0;return h|0}function zg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f;break a;break}case 10:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a;break}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=f;c[e+4>>2]=0;break a;break}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);f=e;g=c[f>>2]|0;i=c[f+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=g;c[e+4>>2]=i;break a;break}case 13:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&65535)<<16>>16;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 14:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&65535;c[i+4>>2]=0;break a;break}case 15:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&255)<<24>>24;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 16:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&255;c[i+4>>2]=0;break a;break}case 17:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}case 18:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}default:break a}while(0);while(0);return}function Ag(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==0&(c|0)==0)g=e;else{h=b;b=c;c=e;while(1){e=c+-1|0;a[e>>0]=d[32269+(h&15)>>0]|0|f;h=rh(h|0,b|0,4)|0;b=D;if((h|0)==0&(b|0)==0){g=e;break}else c=e}}return g|0}function Bg(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((b|0)==0&(c|0)==0)e=d;else{f=b;b=c;c=d;while(1){d=c+-1|0;a[d>>0]=f&7|48;f=rh(f|0,b|0,3)|0;b=D;if((f|0)==0&(b|0)==0){e=d;break}else c=d}}return e|0}function Cg(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){e=b;f=c;c=d;while(1){g=Dh(e|0,f|0,10,0)|0;c=c+-1|0;a[c>>0]=g&255|48;g=e;e=yh(e|0,f|0,10,0)|0;if(!(f>>>0>9|(f|0)==9&g>>>0>4294967295))break;else f=D}h=c;i=e}else{h=d;i=b}if(!i)j=h;else{b=h;h=i;while(1){i=b+-1|0;a[i>>0]=(h>>>0)%10|0|48;if(h>>>0<10){j=i;break}else{b=i;h=(h>>>0)/10|0}}}return j|0}function Dg(a){a=a|0;return Og(a,c[(Ng()|0)+188>>2]|0)|0}function Eg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=d&255;g=(e|0)!=0;a:do if(g&(b&3|0)!=0){h=d&255;i=e;j=b;while(1){if((a[j>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=j+1|0;o=i+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=o;j=n}else{q=o;r=n;s=p;m=5;break}}}else{q=e;r=b;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=0;u=r}b:do if((m|0)==6){r=d&255;if((a[l>>0]|0)==r<<24>>24){t=k;u=l}else{q=S(f,16843009)|0;c:do if(k>>>0>3){s=k;g=l;while(1){b=c[g>>2]^q;if((b&-2139062144^-2139062144)&b+-16843009|0)break;b=g+4|0;e=s+-4|0;if(e>>>0>3){s=e;g=b}else{v=e;w=b;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!v){t=0;u=w;break}else{x=v;y=w}while(1){if((a[y>>0]|0)==r<<24>>24){t=x;u=y;break b}q=y+1|0;x=x+-1|0;if(!x){t=0;u=q;break}else y=q}}}while(0);return (t|0?u:0)|0}function Fg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;qh(g|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{xg(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;xg(a,g,h)}l=f;return}function Gg(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Lg(a,b,0)|0;return c|0}function Hg(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;j=l;l=l+560|0;k=j+8|0;m=j;n=j+524|0;o=n;p=j+512|0;c[m>>2]=0;q=p+12|0;Ig(e)|0;if((D|0)<0){r=1;s=32234;t=-e}else{r=(h&2049|0)!=0&1;s=(h&2048|0)==0?((h&1|0)==0?32235:32240):32237;t=e}Ig(t)|0;u=D&2146435072;do if(u>>>0<2146435072|(u|0)==2146435072&0<0){e=+Jg(t,m)*2.0;v=e!=0.0;if(v)c[m>>2]=(c[m>>2]|0)+-1;w=i|32;if((w|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-g|0;do if(!(g>>>0>11|(A|0)==0)){B=A;C=8.0;do{B=B+-1|0;C=C*16.0}while((B|0)!=0);if((a[y>>0]|0)==45){E=-(C+(-e-C));break}else{E=e+C-C;break}}else E=e;while(0);A=c[m>>2]|0;B=(A|0)<0?0-A|0:A;F=Cg(B,((B|0)<0)<<31>>31,q)|0;if((F|0)==(q|0)){B=p+11|0;a[B>>0]=48;G=B}else G=F;a[G+-1>>0]=(A>>31&2)+43;A=G+-2|0;a[A>>0]=i+15;F=(g|0)<1;B=(h&8|0)==0;H=n;I=E;while(1){J=~~I;K=H+1|0;a[H>>0]=d[32269+J>>0]|x;I=(I-+(J|0))*16.0;if((K-o|0)==1?!(B&(F&I==0.0)):0){a[K>>0]=46;L=H+2|0}else L=K;if(!(I!=0.0))break;else H=L}H=L-o|0;F=q-A|0;B=(g|0)!=0&(H+-2|0)<(g|0)?g+2|0:H;x=F+z+B|0;Fg(b,32,f,x,h);xg(b,y,z);Fg(b,48,f,x,h^65536);xg(b,n,H);Fg(b,48,B-H|0,0,0);xg(b,A,F);Fg(b,32,f,x,h^8192);M=x;break}x=(g|0)<0?6:g;if(v){F=(c[m>>2]|0)+-28|0;c[m>>2]=F;N=F;O=e*268435456.0}else{N=c[m>>2]|0;O=e}F=(N|0)<0?k:k+288|0;I=O;H=F;do{B=~~I>>>0;c[H>>2]=B;H=H+4|0;I=(I-+(B>>>0))*1.0e9}while(I!=0.0);if((N|0)>0){v=N;A=F;z=H;while(1){y=(v|0)<29?v:29;B=z+-4|0;if(B>>>0>=A>>>0){K=0;J=B;do{B=sh(c[J>>2]|0,0,y|0)|0;P=ph(B|0,D|0,K|0,0)|0;B=D;Q=Dh(P|0,B|0,1e9,0)|0;c[J>>2]=Q;K=yh(P|0,B|0,1e9,0)|0;J=J+-4|0}while(J>>>0>=A>>>0);if(K){J=A+-4|0;c[J>>2]=K;R=J}else R=A}else R=A;J=z;while(1){if(J>>>0<=R>>>0)break;B=J+-4|0;if(!(c[B>>2]|0))J=B;else break}K=(c[m>>2]|0)-y|0;c[m>>2]=K;if((K|0)>0){v=K;A=R;z=J}else{T=K;U=R;V=J;break}}}else{T=N;U=F;V=H}if((T|0)<0){z=((x+25|0)/9|0)+1|0;A=(w|0)==102;v=T;K=U;B=V;while(1){P=0-v|0;Q=(P|0)<9?P:9;if(K>>>0<B>>>0){P=(1<<Q)+-1|0;W=1e9>>>Q;X=0;Y=K;do{Z=c[Y>>2]|0;c[Y>>2]=(Z>>>Q)+X;X=S(Z&P,W)|0;Y=Y+4|0}while(Y>>>0<B>>>0);Y=(c[K>>2]|0)==0?K+4|0:K;if(!X){_=Y;$=B}else{c[B>>2]=X;_=Y;$=B+4|0}}else{_=(c[K>>2]|0)==0?K+4|0:K;$=B}Y=A?F:_;W=($-Y>>2|0)>(z|0)?Y+(z<<2)|0:$;v=(c[m>>2]|0)+Q|0;c[m>>2]=v;if((v|0)>=0){aa=_;ba=W;break}else{K=_;B=W}}}else{aa=U;ba=V}B=F;if(aa>>>0<ba>>>0){K=(B-aa>>2)*9|0;v=c[aa>>2]|0;if(v>>>0<10)ca=K;else{z=K;K=10;while(1){K=K*10|0;A=z+1|0;if(v>>>0<K>>>0){ca=A;break}else z=A}}}else ca=0;z=(w|0)==103;K=(x|0)!=0;v=x-((w|0)!=102?ca:0)+((K&z)<<31>>31)|0;if((v|0)<(((ba-B>>2)*9|0)+-9|0)){A=v+9216|0;v=F+4+(((A|0)/9|0)+-1024<<2)|0;H=((A|0)%9|0)+1|0;if((H|0)<9){A=10;W=H;while(1){H=A*10|0;W=W+1|0;if((W|0)==9){da=H;break}else A=H}}else da=10;A=c[v>>2]|0;W=(A>>>0)%(da>>>0)|0;w=(v+4|0)==(ba|0);if(!(w&(W|0)==0)){C=(((A>>>0)/(da>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;H=(da|0)/2|0;I=W>>>0<H>>>0?.5:w&(W|0)==(H|0)?1.0:1.5;if(!r){ea=C;fa=I}else{H=(a[s>>0]|0)==45;ea=H?-C:C;fa=H?-I:I}H=A-W|0;c[v>>2]=H;if(ea+fa!=ea){W=H+da|0;c[v>>2]=W;if(W>>>0>999999999){W=aa;H=v;while(1){A=H+-4|0;c[H>>2]=0;if(A>>>0<W>>>0){w=W+-4|0;c[w>>2]=0;ga=w}else ga=W;w=(c[A>>2]|0)+1|0;c[A>>2]=w;if(w>>>0>999999999){W=ga;H=A}else{ha=ga;ia=A;break}}}else{ha=aa;ia=v}H=(B-ha>>2)*9|0;W=c[ha>>2]|0;if(W>>>0<10){ja=ha;ka=ia;la=H}else{A=H;H=10;while(1){H=H*10|0;w=A+1|0;if(W>>>0<H>>>0){ja=ha;ka=ia;la=w;break}else A=w}}}else{ja=aa;ka=v;la=ca}}else{ja=aa;ka=v;la=ca}A=ka+4|0;ma=ja;na=la;oa=ba>>>0>A>>>0?A:ba}else{ma=aa;na=ca;oa=ba}A=oa;while(1){if(A>>>0<=ma>>>0){pa=0;break}H=A+-4|0;if(!(c[H>>2]|0))A=H;else{pa=1;break}}v=0-na|0;do if(z){H=((K^1)&1)+x|0;if((H|0)>(na|0)&(na|0)>-5){qa=H+-1-na|0;ra=i+-1|0}else{qa=H+-1|0;ra=i+-2|0}H=h&8;if(!H){if(pa?(W=c[A+-4>>2]|0,(W|0)!=0):0)if(!((W>>>0)%10|0)){w=10;Y=0;while(1){w=w*10|0;P=Y+1|0;if((W>>>0)%(w>>>0)|0|0){sa=P;break}else Y=P}}else sa=0;else sa=9;Y=((A-B>>2)*9|0)+-9|0;if((ra|32|0)==102){w=Y-sa|0;W=(w|0)>0?w:0;ta=0;ua=(qa|0)<(W|0)?qa:W;va=ra;break}else{W=Y+na-sa|0;Y=(W|0)>0?W:0;ta=0;ua=(qa|0)<(Y|0)?qa:Y;va=ra;break}}else{ta=H;ua=qa;va=ra}}else{ta=h&8;ua=x;va=i}while(0);x=ua|ta;B=(x|0)!=0&1;K=(va|32|0)==102;if(K){wa=0;xa=(na|0)>0?na:0}else{z=(na|0)<0?v:na;Y=Cg(z,((z|0)<0)<<31>>31,q)|0;z=q;if((z-Y|0)<2){W=Y;while(1){w=W+-1|0;a[w>>0]=48;if((z-w|0)<2)W=w;else{ya=w;break}}}else ya=Y;a[ya+-1>>0]=(na>>31&2)+43;W=ya+-2|0;a[W>>0]=va;wa=W;xa=z-W|0}W=r+1+ua+B+xa|0;Fg(b,32,f,W,h);xg(b,s,r);Fg(b,48,f,W,h^65536);if(K){v=ma>>>0>F>>>0?F:ma;w=n+9|0;Q=w;X=n+8|0;P=v;do{J=Cg(c[P>>2]|0,0,w)|0;if((P|0)==(v|0))if((J|0)==(w|0)){a[X>>0]=48;za=X}else za=J;else if(J>>>0>n>>>0){qh(n|0,48,J-o|0)|0;y=J;while(1){Z=y+-1|0;if(Z>>>0>n>>>0)y=Z;else{za=Z;break}}}else za=J;xg(b,za,Q-za|0);P=P+4|0}while(P>>>0<=F>>>0);if(x|0)xg(b,32285,1);if(P>>>0<A>>>0&(ua|0)>0){F=P;Q=ua;while(1){X=Cg(c[F>>2]|0,0,w)|0;if(X>>>0>n>>>0){qh(n|0,48,X-o|0)|0;v=X;while(1){K=v+-1|0;if(K>>>0>n>>>0)v=K;else{Aa=K;break}}}else Aa=X;xg(b,Aa,(Q|0)<9?Q:9);F=F+4|0;v=Q+-9|0;if(!(F>>>0<A>>>0&(Q|0)>9)){Ba=v;break}else Q=v}}else Ba=ua;Fg(b,48,Ba+9|0,9,0)}else{Q=pa?A:ma+4|0;if((ua|0)>-1){F=n+9|0;w=(ta|0)==0;P=F;x=0-o|0;v=n+8|0;J=ma;K=ua;while(1){B=Cg(c[J>>2]|0,0,F)|0;if((B|0)==(F|0)){a[v>>0]=48;Ca=v}else Ca=B;do if((J|0)==(ma|0)){B=Ca+1|0;xg(b,Ca,1);if(w&(K|0)<1){Da=B;break}xg(b,32285,1);Da=B}else{if(Ca>>>0<=n>>>0){Da=Ca;break}qh(n|0,48,Ca+x|0)|0;B=Ca;while(1){z=B+-1|0;if(z>>>0>n>>>0)B=z;else{Da=z;break}}}while(0);X=P-Da|0;xg(b,Da,(K|0)>(X|0)?X:K);B=K-X|0;J=J+4|0;if(!(J>>>0<Q>>>0&(B|0)>-1)){Ea=B;break}else K=B}}else Ea=ua;Fg(b,48,Ea+18|0,18,0);xg(b,wa,q-wa|0)}Fg(b,32,f,W,h^8192);M=W}else{K=(i&32|0)!=0;Q=r+3|0;Fg(b,32,f,Q,h&-65537);xg(b,s,r);xg(b,t!=t|0.0!=0.0?(K?32261:32265):K?32253:32257,3);Fg(b,32,f,Q,h^8192);M=Q}while(0);l=j;return ((M|0)<(f|0)?f:M)|0}function Ig(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function Jg(a,b){a=+a;b=b|0;return +(+Kg(a,b))}function Kg(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,k=0.0,l=0.0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=rh(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){g=+Kg(a*18446744073709551616.0,b);i=(c[b>>2]|0)+-64|0;k=g}else{i=0;k=a}c[b>>2]=i;l=k;break}case 2047:{l=a;break}default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;l=+h[j>>3]}}return +l}function Lg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;do if(b){if(d>>>0<128){a[b>>0]=d;f=1;break}if(!(c[c[(Mg()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;f=1;break}else{c[(mg()|0)>>2]=84;f=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;f=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;f=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;f=4;break}else{c[(mg()|0)>>2]=84;f=-1;break}}else f=1;while(0);return f|0}function Mg(){return og()|0}function Ng(){return og()|0}function Og(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=0;while(1){if((d[32287+f>>0]|0)==(b|0)){g=2;break}h=f+1|0;if((h|0)==87){i=87;j=32375;g=5;break}else f=h}if((g|0)==2)if(!f)k=32375;else{i=f;j=32375;g=5}if((g|0)==5)while(1){g=0;f=j;do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);i=i+-1|0;if(!i){k=f;break}else{j=f;g=5}}return Pg(k,c[e+20>>2]|0)|0}function Pg(a,b){a=a|0;b=b|0;return Qg(a,b)|0}function Qg(a,b){a=a|0;b=b|0;var d=0;if(!b)d=0;else d=Rg(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (d|0?d:a)|0}function Rg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=(c[b>>2]|0)+1794895138|0;g=Sg(c[b+8>>2]|0,f)|0;h=Sg(c[b+12>>2]|0,f)|0;i=Sg(c[b+16>>2]|0,f)|0;a:do if((g>>>0<d>>>2>>>0?(j=d-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=Sg(c[b+(q<<2)>>2]|0,f)|0;s=Sg(c[b+(q+1<<2)>>2]|0,f)|0;if(!(s>>>0<d>>>0&r>>>0<(d-s|0)>>>0)){t=0;break a}if(a[b+(s+r)>>0]|0){t=0;break a}r=rg(e,b+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=Sg(c[b+(m<<2)>>2]|0,f)|0;j=Sg(c[b+(m+1<<2)>>2]|0,f)|0;if(j>>>0<d>>>0&l>>>0<(d-j|0)>>>0)t=(a[b+(j+l)>>0]|0)==0?b+j|0:0;else t=0}else t=0;while(0);return t|0}function Sg(a,b){a=a|0;b=b|0;var c=0;c=Eh(a|0)|0;return ((b|0)==0?a:c)|0}function Tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Ug(e)|0)){h=c[f>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=e+20|0;f=c[g>>2]|0;k=f;if((h-f|0)>>>0<d>>>0){j=va[c[e+36>>2]&7](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){l=k;m=0;n=d;o=b;break b}p=f+-1|0;if((a[b+p>>0]|0)==10)break;else f=p}p=va[c[e+36>>2]&7](e,b,f)|0;if(p>>>0<f>>>0){j=p;break a}l=c[g>>2]|0;m=f;n=d-f|0;o=b+f|0}else{l=k;m=0;n=d;o=b}while(0);vh(l|0,o|0,n|0)|0;c[g>>2]=(c[g>>2]|0)+n;j=m+n|0}while(0);return j|0}function Ug(b){b=b|0;var d=0,e=0,f=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;e=c[b>>2]|0;if(!(e&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);f=0}else{c[b>>2]=e|32;f=-1}return f|0}function Vg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=a+20|0;f=c[e>>2]|0;g=(c[a+16>>2]|0)-f|0;a=g>>>0>d>>>0?d:g;vh(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Wg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+208|0;g=f+8|0;h=f;i=S(d,b)|0;b=h;c[b>>2]=1;c[b+4>>2]=0;a:do if(i|0){b=0-d|0;c[g+4>>2]=d;c[g>>2]=d;j=d;k=d;m=2;while(1){n=j+d+k|0;c[g+(m<<2)>>2]=n;if(n>>>0<i>>>0){o=k;k=n;m=m+1|0;j=o}else break}j=a+i+b|0;if(j>>>0>a>>>0){m=j;k=1;o=a;n=1;while(1){do if((k&3|0)!=3){p=n+-1|0;if((c[g+(p<<2)>>2]|0)>>>0<(m-o|0)>>>0)Xg(o,d,e,n,g);else Zg(o,d,e,h,n,0,g);if((n|0)==1){_g(h,1);q=0;break}else{_g(h,p);q=1;break}}else{Xg(o,d,e,n,g);Yg(h,2);q=n+2|0}while(0);p=c[h>>2]|1;c[h>>2]=p;r=o+d|0;if(r>>>0<j>>>0){k=p;o=r;n=q}else{s=p;t=r;u=q;break}}}else{s=1;t=a;u=1}Zg(t,d,e,h,u,0,g);n=h+4|0;o=s;k=t;j=u;while(1){if((j|0)==1&(o|0)==1){if(!(c[n>>2]|0))break a}else if((j|0)>=2){_g(h,2);m=j+-2|0;c[h>>2]=c[h>>2]^7;Yg(h,1);Zg(k+(0-(c[g+(m<<2)>>2]|0))+b|0,d,e,h,j+-1|0,1,g);_g(h,1);r=c[h>>2]|1;c[h>>2]=r;p=k+b|0;Zg(p,d,e,h,m,1,g);o=r;k=p;j=m;continue}m=$g(h)|0;Yg(h,m);o=c[h>>2]|0;k=k+b|0;j=m+j|0}}while(0);l=f;return}function Xg(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=l;l=l+240|0;h=g;c[h>>2]=a;a:do if((e|0)>1){i=0-b|0;j=a;k=a;m=1;n=e;while(1){o=k+i|0;p=n+-2|0;q=o+(0-(c[f+(p<<2)>>2]|0))|0;if((Ea[d&31](j,q)|0)>-1?(Ea[d&31](j,o)|0)>-1:0){r=m;break a}s=m+1|0;t=h+(m<<2)|0;if((Ea[d&31](q,o)|0)>-1){c[t>>2]=q;u=q;v=n+-1|0}else{c[t>>2]=o;u=o;v=p}if((v|0)<=1){r=s;break a}j=c[h>>2]|0;k=u;m=s;n=v}}else r=1;while(0);bh(b,h,r);l=g;return}function Yg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+4|0;if(b>>>0>31){e=c[d>>2]|0;c[a>>2]=e;c[d>>2]=0;f=e;g=0;h=b+-32|0}else{f=c[a>>2]|0;g=c[d>>2]|0;h=b}c[a>>2]=g<<32-h|f>>>h;c[d>>2]=g>>>h;return}function Zg(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;i=l;l=l+240|0;j=i+232|0;k=i;m=c[e>>2]|0;c[j>>2]=m;n=c[e+4>>2]|0;e=j+4|0;c[e>>2]=n;c[k>>2]=a;a:do if((m|0)!=1|(n|0)!=0?(o=0-b|0,p=a+(0-(c[h+(f<<2)>>2]|0))|0,(Ea[d&31](p,a)|0)>=1):0){q=p;p=a;r=1;s=f;t=(g|0)==0;while(1){if(t&(s|0)>1){u=p+o|0;v=c[h+(s+-2<<2)>>2]|0;if((Ea[d&31](u,q)|0)>-1){w=p;x=r;y=s;z=10;break a}if((Ea[d&31](u+(0-v)|0,q)|0)>-1){w=p;x=r;y=s;z=10;break a}}v=r+1|0;c[k+(r<<2)>>2]=q;u=$g(j)|0;Yg(j,u);A=u+s|0;if(!((c[j>>2]|0)!=1|(c[e>>2]|0)!=0)){w=q;x=v;y=A;z=10;break a}u=q+(0-(c[h+(A<<2)>>2]|0))|0;if((Ea[d&31](u,c[k>>2]|0)|0)<1){B=q;C=v;D=A;E=0;z=9;break}else{F=q;q=u;r=v;s=A;t=1;p=F}}}else{B=a;C=1;D=f;E=g;z=9}while(0);if((z|0)==9?(E|0)==0:0){w=B;x=C;y=D;z=10}if((z|0)==10){bh(b,k,x);Xg(w,b,d,y,h)}l=i;return}function _g(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+4|0;if(b>>>0>31){e=c[a>>2]|0;c[d>>2]=e;c[a>>2]=0;f=e;g=0;h=b+-32|0}else{f=c[d>>2]|0;g=c[a>>2]|0;h=b}c[d>>2]=g>>>(32-h|0)|f<<h;c[a>>2]=g<<h;return}function $g(a){a=a|0;var b=0,d=0;b=ah((c[a>>2]|0)+-1|0)|0;if(!b){d=ah(c[a+4>>2]|0)|0;return ((d|0)==0?0:d+32|0)|0}else return b|0;return 0}function ah(a){a=a|0;var b=0,c=0,d=0;if(a)if(!(a&1)){b=0;c=a;while(1){a=b+1|0;c=c>>>1;if(c&1|0){d=a;break}else b=a}}else d=0;else d=32;return d|0}function bh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+256|0;f=e;a:do if((d|0)>=2?(g=b+(d<<2)|0,c[g>>2]=f,a|0):0){h=f;i=a;while(1){j=i>>>0<256?i:256;vh(h|0,c[b>>2]|0,j|0)|0;k=0;do{m=b+(k<<2)|0;k=k+1|0;vh(c[m>>2]|0,c[b+(k<<2)>>2]|0,j|0)|0;c[m>>2]=(c[m>>2]|0)+j}while((k|0)!=(d|0));k=i-j|0;if(!k)break a;h=c[g>>2]|0;i=k}}while(0);l=e;return}function ch(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b;a:do if(!(d&3)){e=b;f=4}else{g=d;h=b;while(1){if(!(a[h>>0]|0)){i=g;break a}j=h+1|0;g=j;if(!(g&3)){e=j;f=4;break}else h=j}}while(0);if((f|0)==4){f=e;while(1){k=c[f>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))f=f+4|0;else break}if(!((k&255)<<24>>24))l=f;else{k=f;while(1){f=k+1|0;if(!(a[f>>0]|0)){l=f;break}else k=f}}i=l}return i-d|0}function dh(a,b){a=a|0;b=b|0;var c=0;c=ch(a)|0;return ((eh(a,1,c,b)|0)!=(c|0))<<31>>31|0}function eh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=S(d,b)|0;g=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){d=(vg(e)|0)==0;h=Tg(a,f,e)|0;if(d)i=h;else{wg(e);i=h}}else i=Tg(a,f,e)|0;if((i|0)==(f|0))j=g;else j=(i>>>0)/(b>>>0)|0;return j|0}function fh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+16|0;g=f;h=e&255;a[g>>0]=h;i=b+16|0;j=c[i>>2]|0;if(!j)if(!(Ug(b)|0)){k=c[i>>2]|0;m=4}else n=-1;else{k=j;m=4}do if((m|0)==4){j=b+20|0;i=c[j>>2]|0;if(i>>>0<k>>>0?(o=e&255,(o|0)!=(a[b+75>>0]|0)):0){c[j>>2]=i+1;a[i>>0]=h;n=o;break}if((va[c[b+36>>2]&7](b,g,1)|0)==1)n=d[g>>0]|0;else n=-1}while(0);l=f;return n|0}function gh(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=tg(c[5372]|0,a,e)|0;l=d;return b|0}function hh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[5372]|0;if((c[d+76>>2]|0)>-1)e=vg(d)|0;else e=0;do if((dh(b,d)|0)<0)f=1;else{if((a[d+75>>0]|0)!=10?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=10;f=0;break}f=(fh(d,10)|0)<0}while(0);if(e|0)wg(d);return f<<31>>31|0}\nfunction ih(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;b=l;l=l+16|0;d=b;do if(a>>>0<245){e=a>>>0<11?16:a+11&-8;f=e>>>3;g=c[8662]|0;h=g>>>f;if(h&3|0){i=(h&1^1)+f|0;j=34688+(i<<1<<2)|0;k=j+8|0;m=c[k>>2]|0;n=m+8|0;o=c[n>>2]|0;do if((j|0)!=(o|0)){if(o>>>0<(c[8666]|0)>>>0)pa();p=o+12|0;if((c[p>>2]|0)==(m|0)){c[p>>2]=j;c[k>>2]=o;break}else pa()}else c[8662]=g&~(1<<i);while(0);o=i<<3;c[m+4>>2]=o|3;k=m+o+4|0;c[k>>2]=c[k>>2]|1;q=n;l=b;return q|0}k=c[8664]|0;if(e>>>0>k>>>0){if(h|0){o=2<<f;j=h<<f&(o|0-o);o=(j&0-j)+-1|0;j=o>>>12&16;p=o>>>j;o=p>>>5&8;r=p>>>o;p=r>>>2&4;s=r>>>p;r=s>>>1&2;t=s>>>r;s=t>>>1&1;u=(o|j|p|r|s)+(t>>>s)|0;s=34688+(u<<1<<2)|0;t=s+8|0;r=c[t>>2]|0;p=r+8|0;j=c[p>>2]|0;do if((s|0)!=(j|0)){if(j>>>0<(c[8666]|0)>>>0)pa();o=j+12|0;if((c[o>>2]|0)==(r|0)){c[o>>2]=s;c[t>>2]=j;v=g;break}else pa()}else{o=g&~(1<<u);c[8662]=o;v=o}while(0);j=(u<<3)-e|0;c[r+4>>2]=e|3;t=r+e|0;c[t+4>>2]=j|1;c[t+j>>2]=j;if(k|0){s=c[8667]|0;f=k>>>3;h=34688+(f<<1<<2)|0;n=1<<f;if(v&n){f=h+8|0;m=c[f>>2]|0;if(m>>>0<(c[8666]|0)>>>0)pa();else{w=f;x=m}}else{c[8662]=v|n;w=h+8|0;x=h}c[w>>2]=s;c[x+12>>2]=s;c[s+8>>2]=x;c[s+12>>2]=h}c[8664]=j;c[8667]=t;q=p;l=b;return q|0}t=c[8663]|0;if(t){j=(t&0-t)+-1|0;h=j>>>12&16;s=j>>>h;j=s>>>5&8;n=s>>>j;s=n>>>2&4;m=n>>>s;n=m>>>1&2;f=m>>>n;m=f>>>1&1;i=c[34952+((j|h|s|n|m)+(f>>>m)<<2)>>2]|0;m=(c[i+4>>2]&-8)-e|0;f=c[i+16+(((c[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){y=m;z=i}else{n=f;f=m;m=i;while(1){i=(c[n+4>>2]&-8)-e|0;s=i>>>0<f>>>0;h=s?i:f;i=s?n:m;n=c[n+16+(((c[n+16>>2]|0)==0&1)<<2)>>2]|0;if(!n){y=h;z=i;break}else{f=h;m=i}}}m=c[8666]|0;if(z>>>0<m>>>0)pa();f=z+e|0;if(z>>>0>=f>>>0)pa();n=c[z+24>>2]|0;p=c[z+12>>2]|0;do if((p|0)==(z|0)){r=z+20|0;u=c[r>>2]|0;if(!u){i=z+16|0;h=c[i>>2]|0;if(!h){A=0;break}else{B=h;C=i}}else{B=u;C=r}while(1){r=B+20|0;u=c[r>>2]|0;if(u|0){B=u;C=r;continue}r=B+16|0;u=c[r>>2]|0;if(!u)break;else{B=u;C=r}}if(C>>>0<m>>>0)pa();else{c[C>>2]=0;A=B;break}}else{r=c[z+8>>2]|0;if(r>>>0<m>>>0)pa();u=r+12|0;if((c[u>>2]|0)!=(z|0))pa();i=p+8|0;if((c[i>>2]|0)==(z|0)){c[u>>2]=p;c[i>>2]=r;A=p;break}else pa()}while(0);a:do if(n|0){p=c[z+28>>2]|0;m=34952+(p<<2)|0;do if((z|0)==(c[m>>2]|0)){c[m>>2]=A;if(!A){c[8663]=t&~(1<<p);break a}}else if(n>>>0>=(c[8666]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(z|0)&1)<<2)>>2]=A;if(!A)break a;else break}else pa();while(0);p=c[8666]|0;if(A>>>0<p>>>0)pa();c[A+24>>2]=n;m=c[z+16>>2]|0;do if(m|0)if(m>>>0<p>>>0)pa();else{c[A+16>>2]=m;c[m+24>>2]=A;break}while(0);m=c[z+20>>2]|0;if(m|0)if(m>>>0<(c[8666]|0)>>>0)pa();else{c[A+20>>2]=m;c[m+24>>2]=A;break}}while(0);if(y>>>0<16){n=y+e|0;c[z+4>>2]=n|3;t=z+n+4|0;c[t>>2]=c[t>>2]|1}else{c[z+4>>2]=e|3;c[f+4>>2]=y|1;c[f+y>>2]=y;if(k|0){t=c[8667]|0;n=k>>>3;m=34688+(n<<1<<2)|0;p=1<<n;if(g&p){n=m+8|0;r=c[n>>2]|0;if(r>>>0<(c[8666]|0)>>>0)pa();else{D=n;E=r}}else{c[8662]=g|p;D=m+8|0;E=m}c[D>>2]=t;c[E+12>>2]=t;c[t+8>>2]=E;c[t+12>>2]=m}c[8664]=y;c[8667]=f}q=z+8|0;l=b;return q|0}else F=e}else F=e}else if(a>>>0<=4294967231){m=a+11|0;t=m&-8;p=c[8663]|0;if(p){r=0-t|0;n=m>>>8;if(n)if(t>>>0>16777215)G=31;else{m=(n+1048320|0)>>>16&8;i=n<<m;n=(i+520192|0)>>>16&4;u=i<<n;i=(u+245760|0)>>>16&2;h=14-(n|m|i)+(u<<i>>>15)|0;G=t>>>(h+7|0)&1|h<<1}else G=0;h=c[34952+(G<<2)>>2]|0;b:do if(!h){H=r;I=0;J=0;K=81}else{i=r;u=0;m=t<<((G|0)==31?0:25-(G>>>1)|0);n=h;s=0;while(1){j=(c[n+4>>2]&-8)-t|0;if(j>>>0<i>>>0)if(!j){L=0;M=n;N=n;K=85;break b}else{O=j;P=n}else{O=i;P=s}j=c[n+20>>2]|0;n=c[n+16+(m>>>31<<2)>>2]|0;o=(j|0)==0|(j|0)==(n|0)?u:j;j=(n|0)==0;if(j){H=O;I=o;J=P;K=81;break}else{i=O;u=o;m=m<<((j^1)&1);s=P}}}while(0);if((K|0)==81){if((I|0)==0&(J|0)==0){h=2<<G;r=p&(h|0-h);if(!r){F=t;break}h=(r&0-r)+-1|0;r=h>>>12&16;e=h>>>r;h=e>>>5&8;f=e>>>h;e=f>>>2&4;g=f>>>e;f=g>>>1&2;k=g>>>f;g=k>>>1&1;Q=c[34952+((h|r|e|f|g)+(k>>>g)<<2)>>2]|0;R=0}else{Q=I;R=J}if(!Q){S=H;T=R}else{L=H;M=Q;N=R;K=85}}if((K|0)==85)while(1){K=0;g=(c[M+4>>2]&-8)-t|0;k=g>>>0<L>>>0;f=k?g:L;g=k?M:N;M=c[M+16+(((c[M+16>>2]|0)==0&1)<<2)>>2]|0;if(!M){S=f;T=g;break}else{L=f;N=g;K=85}}if((T|0)!=0?S>>>0<((c[8664]|0)-t|0)>>>0:0){g=c[8666]|0;if(T>>>0<g>>>0)pa();f=T+t|0;if(T>>>0>=f>>>0)pa();k=c[T+24>>2]|0;e=c[T+12>>2]|0;do if((e|0)==(T|0)){r=T+20|0;h=c[r>>2]|0;if(!h){s=T+16|0;m=c[s>>2]|0;if(!m){U=0;break}else{V=m;W=s}}else{V=h;W=r}while(1){r=V+20|0;h=c[r>>2]|0;if(h|0){V=h;W=r;continue}r=V+16|0;h=c[r>>2]|0;if(!h)break;else{V=h;W=r}}if(W>>>0<g>>>0)pa();else{c[W>>2]=0;U=V;break}}else{r=c[T+8>>2]|0;if(r>>>0<g>>>0)pa();h=r+12|0;if((c[h>>2]|0)!=(T|0))pa();s=e+8|0;if((c[s>>2]|0)==(T|0)){c[h>>2]=e;c[s>>2]=r;U=e;break}else pa()}while(0);c:do if(k){e=c[T+28>>2]|0;g=34952+(e<<2)|0;do if((T|0)==(c[g>>2]|0)){c[g>>2]=U;if(!U){r=p&~(1<<e);c[8663]=r;X=r;break c}}else if(k>>>0>=(c[8666]|0)>>>0){c[k+16+(((c[k+16>>2]|0)!=(T|0)&1)<<2)>>2]=U;if(!U){X=p;break c}else break}else pa();while(0);e=c[8666]|0;if(U>>>0<e>>>0)pa();c[U+24>>2]=k;g=c[T+16>>2]|0;do if(g|0)if(g>>>0<e>>>0)pa();else{c[U+16>>2]=g;c[g+24>>2]=U;break}while(0);g=c[T+20>>2]|0;if(g)if(g>>>0<(c[8666]|0)>>>0)pa();else{c[U+20>>2]=g;c[g+24>>2]=U;X=p;break}else X=p}else X=p;while(0);do if(S>>>0>=16){c[T+4>>2]=t|3;c[f+4>>2]=S|1;c[f+S>>2]=S;p=S>>>3;if(S>>>0<256){k=34688+(p<<1<<2)|0;g=c[8662]|0;e=1<<p;if(g&e){p=k+8|0;r=c[p>>2]|0;if(r>>>0<(c[8666]|0)>>>0)pa();else{Y=p;Z=r}}else{c[8662]=g|e;Y=k+8|0;Z=k}c[Y>>2]=f;c[Z+12>>2]=f;c[f+8>>2]=Z;c[f+12>>2]=k;break}k=S>>>8;if(k)if(S>>>0>16777215)_=31;else{e=(k+1048320|0)>>>16&8;g=k<<e;k=(g+520192|0)>>>16&4;r=g<<k;g=(r+245760|0)>>>16&2;p=14-(k|e|g)+(r<<g>>>15)|0;_=S>>>(p+7|0)&1|p<<1}else _=0;p=34952+(_<<2)|0;c[f+28>>2]=_;g=f+16|0;c[g+4>>2]=0;c[g>>2]=0;g=1<<_;if(!(X&g)){c[8663]=X|g;c[p>>2]=f;c[f+24>>2]=p;c[f+12>>2]=f;c[f+8>>2]=f;break}g=S<<((_|0)==31?0:25-(_>>>1)|0);r=c[p>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(S|0)){K=139;break}$=r+16+(g>>>31<<2)|0;p=c[$>>2]|0;if(!p){K=136;break}else{g=g<<1;r=p}}if((K|0)==136)if($>>>0<(c[8666]|0)>>>0)pa();else{c[$>>2]=f;c[f+24>>2]=r;c[f+12>>2]=f;c[f+8>>2]=f;break}else if((K|0)==139){g=r+8|0;p=c[g>>2]|0;e=c[8666]|0;if(p>>>0>=e>>>0&r>>>0>=e>>>0){c[p+12>>2]=f;c[g>>2]=f;c[f+8>>2]=p;c[f+12>>2]=r;c[f+24>>2]=0;break}else pa()}}else{p=S+t|0;c[T+4>>2]=p|3;g=T+p+4|0;c[g>>2]=c[g>>2]|1}while(0);q=T+8|0;l=b;return q|0}else F=t}else F=t}else F=-1;while(0);T=c[8664]|0;if(T>>>0>=F>>>0){S=T-F|0;$=c[8667]|0;if(S>>>0>15){_=$+F|0;c[8667]=_;c[8664]=S;c[_+4>>2]=S|1;c[_+S>>2]=S;c[$+4>>2]=F|3}else{c[8664]=0;c[8667]=0;c[$+4>>2]=T|3;S=$+T+4|0;c[S>>2]=c[S>>2]|1}q=$+8|0;l=b;return q|0}$=c[8665]|0;if($>>>0>F>>>0){S=$-F|0;c[8665]=S;T=c[8668]|0;_=T+F|0;c[8668]=_;c[_+4>>2]=S|1;c[T+4>>2]=F|3;q=T+8|0;l=b;return q|0}if(!(c[8780]|0)){c[8782]=4096;c[8781]=4096;c[8783]=-1;c[8784]=-1;c[8785]=0;c[8773]=0;T=d&-16^1431655768;c[d>>2]=T;c[8780]=T;aa=4096}else aa=c[8782]|0;T=F+48|0;d=F+47|0;S=aa+d|0;_=0-aa|0;aa=S&_;if(aa>>>0<=F>>>0){q=0;l=b;return q|0}X=c[8772]|0;if(X|0?(Z=c[8770]|0,Y=Z+aa|0,Y>>>0<=Z>>>0|Y>>>0>X>>>0):0){q=0;l=b;return q|0}d:do if(!(c[8773]&4)){X=c[8668]|0;e:do if(X){Y=35096;while(1){Z=c[Y>>2]|0;if(Z>>>0<=X>>>0?(ba=Y+4|0,(Z+(c[ba>>2]|0)|0)>>>0>X>>>0):0)break;Z=c[Y+8>>2]|0;if(!Z){K=163;break e}else Y=Z}r=S-$&_;if(r>>>0<2147483647){Z=Bh(r|0)|0;if((Z|0)==((c[Y>>2]|0)+(c[ba>>2]|0)|0))if((Z|0)==(-1|0))ca=r;else{da=Z;ea=r;K=180;break d}else{fa=Z;ga=r;K=171}}else ca=0}else K=163;while(0);do if((K|0)==163){X=Bh(0)|0;if((X|0)!=(-1|0)?(t=X,r=c[8781]|0,Z=r+-1|0,U=((Z&t|0)==0?0:(Z+t&0-r)-t|0)+aa|0,t=c[8770]|0,r=U+t|0,U>>>0>F>>>0&U>>>0<2147483647):0){Z=c[8772]|0;if(Z|0?r>>>0<=t>>>0|r>>>0>Z>>>0:0){ca=0;break}Z=Bh(U|0)|0;if((Z|0)==(X|0)){da=X;ea=U;K=180;break d}else{fa=Z;ga=U;K=171}}else ca=0}while(0);do if((K|0)==171){U=0-ga|0;if(!(T>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=fa;ea=ga;K=180;break d}Z=c[8782]|0;X=d-ga+Z&0-Z;if(X>>>0>=2147483647){da=fa;ea=ga;K=180;break d}if((Bh(X|0)|0)==(-1|0)){Bh(U|0)|0;ca=0;break}else{da=fa;ea=X+ga|0;K=180;break d}}while(0);c[8773]=c[8773]|4;ha=ca;K=178}else{ha=0;K=178}while(0);if(((K|0)==178?aa>>>0<2147483647:0)?(ca=Bh(aa|0)|0,aa=Bh(0)|0,ga=aa-ca|0,fa=ga>>>0>(F+40|0)>>>0,!((ca|0)==(-1|0)|fa^1|ca>>>0<aa>>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ca;ea=fa?ga:ha;K=180}if((K|0)==180){ha=(c[8770]|0)+ea|0;c[8770]=ha;if(ha>>>0>(c[8771]|0)>>>0)c[8771]=ha;ha=c[8668]|0;do if(ha){ga=35096;while(1){ia=c[ga>>2]|0;ja=ga+4|0;ka=c[ja>>2]|0;if((da|0)==(ia+ka|0)){K=190;break}fa=c[ga+8>>2]|0;if(!fa)break;else ga=fa}if(((K|0)==190?(c[ga+12>>2]&8|0)==0:0)?ha>>>0<da>>>0&ha>>>0>=ia>>>0:0){c[ja>>2]=ka+ea;fa=ha+8|0;ca=(fa&7|0)==0?0:0-fa&7;fa=ha+ca|0;aa=(c[8665]|0)+(ea-ca)|0;c[8668]=fa;c[8665]=aa;c[fa+4>>2]=aa|1;c[fa+aa+4>>2]=40;c[8669]=c[8784];break}aa=c[8666]|0;if(da>>>0<aa>>>0){c[8666]=da;la=da}else la=aa;aa=da+ea|0;fa=35096;while(1){if((c[fa>>2]|0)==(aa|0)){K=198;break}ca=c[fa+8>>2]|0;if(!ca)break;else fa=ca}if((K|0)==198?(c[fa+12>>2]&8|0)==0:0){c[fa>>2]=da;ga=fa+4|0;c[ga>>2]=(c[ga>>2]|0)+ea;ga=da+8|0;ca=da+((ga&7|0)==0?0:0-ga&7)|0;ga=aa+8|0;d=aa+((ga&7|0)==0?0:0-ga&7)|0;ga=ca+F|0;T=d-ca-F|0;c[ca+4>>2]=F|3;do if((d|0)!=(ha|0)){if((d|0)==(c[8667]|0)){ba=(c[8664]|0)+T|0;c[8664]=ba;c[8667]=ga;c[ga+4>>2]=ba|1;c[ga+ba>>2]=ba;break}ba=c[d+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;f:do if(ba>>>0>=256){S=c[d+24>>2]|0;X=c[d+12>>2]|0;do if((X|0)==(d|0)){U=d+16|0;Z=U+4|0;r=c[Z>>2]|0;if(!r){t=c[U>>2]|0;if(!t){ma=0;break}else{na=t;oa=U}}else{na=r;oa=Z}while(1){Z=na+20|0;r=c[Z>>2]|0;if(r|0){na=r;oa=Z;continue}Z=na+16|0;r=c[Z>>2]|0;if(!r)break;else{na=r;oa=Z}}if(oa>>>0<la>>>0)pa();else{c[oa>>2]=0;ma=na;break}}else{Z=c[d+8>>2]|0;if(Z>>>0<la>>>0)pa();r=Z+12|0;if((c[r>>2]|0)!=(d|0))pa();U=X+8|0;if((c[U>>2]|0)==(d|0)){c[r>>2]=X;c[U>>2]=Z;ma=X;break}else pa()}while(0);if(!S)break;X=c[d+28>>2]|0;Z=34952+(X<<2)|0;do if((d|0)!=(c[Z>>2]|0))if(S>>>0>=(c[8666]|0)>>>0){c[S+16+(((c[S+16>>2]|0)!=(d|0)&1)<<2)>>2]=ma;if(!ma)break f;else break}else pa();else{c[Z>>2]=ma;if(ma|0)break;c[8663]=c[8663]&~(1<<X);break f}while(0);X=c[8666]|0;if(ma>>>0<X>>>0)pa();c[ma+24>>2]=S;Z=d+16|0;U=c[Z>>2]|0;do if(U|0)if(U>>>0<X>>>0)pa();else{c[ma+16>>2]=U;c[U+24>>2]=ma;break}while(0);U=c[Z+4>>2]|0;if(!U)break;if(U>>>0<(c[8666]|0)>>>0)pa();else{c[ma+20>>2]=U;c[U+24>>2]=ma;break}}else{U=c[d+8>>2]|0;X=c[d+12>>2]|0;S=34688+($<<1<<2)|0;do if((U|0)!=(S|0)){if(U>>>0<la>>>0)pa();if((c[U+12>>2]|0)==(d|0))break;pa()}while(0);if((X|0)==(U|0)){c[8662]=c[8662]&~(1<<$);break}do if((X|0)==(S|0))qa=X+8|0;else{if(X>>>0<la>>>0)pa();Z=X+8|0;if((c[Z>>2]|0)==(d|0)){qa=Z;break}pa()}while(0);c[U+12>>2]=X;c[qa>>2]=U}while(0);ra=d+_|0;sa=_+T|0}else{ra=d;sa=T}$=ra+4|0;c[$>>2]=c[$>>2]&-2;c[ga+4>>2]=sa|1;c[ga+sa>>2]=sa;$=sa>>>3;if(sa>>>0<256){ba=34688+($<<1<<2)|0;Y=c[8662]|0;S=1<<$;do if(!(Y&S)){c[8662]=Y|S;ta=ba+8|0;ua=ba}else{$=ba+8|0;Z=c[$>>2]|0;if(Z>>>0>=(c[8666]|0)>>>0){ta=$;ua=Z;break}pa()}while(0);c[ta>>2]=ga;c[ua+12>>2]=ga;c[ga+8>>2]=ua;c[ga+12>>2]=ba;break}S=sa>>>8;do if(!S)va=0;else{if(sa>>>0>16777215){va=31;break}Y=(S+1048320|0)>>>16&8;_=S<<Y;Z=(_+520192|0)>>>16&4;$=_<<Z;_=($+245760|0)>>>16&2;r=14-(Z|Y|_)+($<<_>>>15)|0;va=sa>>>(r+7|0)&1|r<<1}while(0);S=34952+(va<<2)|0;c[ga+28>>2]=va;ba=ga+16|0;c[ba+4>>2]=0;c[ba>>2]=0;ba=c[8663]|0;r=1<<va;if(!(ba&r)){c[8663]=ba|r;c[S>>2]=ga;c[ga+24>>2]=S;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}r=sa<<((va|0)==31?0:25-(va>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(sa|0)){K=265;break}wa=ba+16+(r>>>31<<2)|0;S=c[wa>>2]|0;if(!S){K=262;break}else{r=r<<1;ba=S}}if((K|0)==262)if(wa>>>0<(c[8666]|0)>>>0)pa();else{c[wa>>2]=ga;c[ga+24>>2]=ba;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}else if((K|0)==265){r=ba+8|0;S=c[r>>2]|0;_=c[8666]|0;if(S>>>0>=_>>>0&ba>>>0>=_>>>0){c[S+12>>2]=ga;c[r>>2]=ga;c[ga+8>>2]=S;c[ga+12>>2]=ba;c[ga+24>>2]=0;break}else pa()}}else{S=(c[8665]|0)+T|0;c[8665]=S;c[8668]=ga;c[ga+4>>2]=S|1}while(0);q=ca+8|0;l=b;return q|0}ga=35096;while(1){T=c[ga>>2]|0;if(T>>>0<=ha>>>0?(xa=T+(c[ga+4>>2]|0)|0,xa>>>0>ha>>>0):0)break;ga=c[ga+8>>2]|0}ga=xa+-47|0;ca=ga+8|0;T=ga+((ca&7|0)==0?0:0-ca&7)|0;ca=ha+16|0;ga=T>>>0<ca>>>0?ha:T;T=ga+8|0;d=da+8|0;aa=(d&7|0)==0?0:0-d&7;d=da+aa|0;fa=ea+-40-aa|0;c[8668]=d;c[8665]=fa;c[d+4>>2]=fa|1;c[d+fa+4>>2]=40;c[8669]=c[8784];fa=ga+4|0;c[fa>>2]=27;c[T>>2]=c[8774];c[T+4>>2]=c[8775];c[T+8>>2]=c[8776];c[T+12>>2]=c[8777];c[8774]=da;c[8775]=ea;c[8777]=0;c[8776]=T;T=ga+24|0;do{d=T;T=T+4|0;c[T>>2]=7}while((d+8|0)>>>0<xa>>>0);if((ga|0)!=(ha|0)){T=ga-ha|0;c[fa>>2]=c[fa>>2]&-2;c[ha+4>>2]=T|1;c[ga>>2]=T;d=T>>>3;if(T>>>0<256){aa=34688+(d<<1<<2)|0;S=c[8662]|0;r=1<<d;if(S&r){d=aa+8|0;_=c[d>>2]|0;if(_>>>0<(c[8666]|0)>>>0)pa();else{ya=d;za=_}}else{c[8662]=S|r;ya=aa+8|0;za=aa}c[ya>>2]=ha;c[za+12>>2]=ha;c[ha+8>>2]=za;c[ha+12>>2]=aa;break}aa=T>>>8;if(aa)if(T>>>0>16777215)Aa=31;else{r=(aa+1048320|0)>>>16&8;S=aa<<r;aa=(S+520192|0)>>>16&4;_=S<<aa;S=(_+245760|0)>>>16&2;d=14-(aa|r|S)+(_<<S>>>15)|0;Aa=T>>>(d+7|0)&1|d<<1}else Aa=0;d=34952+(Aa<<2)|0;c[ha+28>>2]=Aa;c[ha+20>>2]=0;c[ca>>2]=0;S=c[8663]|0;_=1<<Aa;if(!(S&_)){c[8663]=S|_;c[d>>2]=ha;c[ha+24>>2]=d;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}_=T<<((Aa|0)==31?0:25-(Aa>>>1)|0);S=c[d>>2]|0;while(1){if((c[S+4>>2]&-8|0)==(T|0)){K=292;break}Ba=S+16+(_>>>31<<2)|0;d=c[Ba>>2]|0;if(!d){K=289;break}else{_=_<<1;S=d}}if((K|0)==289)if(Ba>>>0<(c[8666]|0)>>>0)pa();else{c[Ba>>2]=ha;c[ha+24>>2]=S;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}else if((K|0)==292){_=S+8|0;T=c[_>>2]|0;ca=c[8666]|0;if(T>>>0>=ca>>>0&S>>>0>=ca>>>0){c[T+12>>2]=ha;c[_>>2]=ha;c[ha+8>>2]=T;c[ha+12>>2]=S;c[ha+24>>2]=0;break}else pa()}}}else{T=c[8666]|0;if((T|0)==0|da>>>0<T>>>0)c[8666]=da;c[8774]=da;c[8775]=ea;c[8777]=0;c[8671]=c[8780];c[8670]=-1;T=0;do{_=34688+(T<<1<<2)|0;c[_+12>>2]=_;c[_+8>>2]=_;T=T+1|0}while((T|0)!=32);T=da+8|0;S=(T&7|0)==0?0:0-T&7;T=da+S|0;_=ea+-40-S|0;c[8668]=T;c[8665]=_;c[T+4>>2]=_|1;c[T+_+4>>2]=40;c[8669]=c[8784]}while(0);ea=c[8665]|0;if(ea>>>0>F>>>0){da=ea-F|0;c[8665]=da;ea=c[8668]|0;ha=ea+F|0;c[8668]=ha;c[ha+4>>2]=da|1;c[ea+4>>2]=F|3;q=ea+8|0;l=b;return q|0}}c[(mg()|0)>>2]=12;q=0;l=b;return q|0}function jh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;if(!a)return;b=a+-8|0;d=c[8666]|0;if(b>>>0<d>>>0)pa();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)pa();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(!a)return;i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)pa();if((i|0)==(c[8667]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;break}c[8664]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;return}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;p=34688+(l<<1<<2)|0;if((h|0)!=(p|0)){if(h>>>0<d>>>0)pa();if((c[h+12>>2]|0)!=(i|0))pa()}if((k|0)==(h|0)){c[8662]=c[8662]&~(1<<l);m=i;n=i;o=j;break}if((k|0)!=(p|0)){if(k>>>0<d>>>0)pa();p=k+8|0;if((c[p>>2]|0)==(i|0))q=p;else pa()}else q=k+8|0;c[h+12>>2]=k;c[q>>2]=h;m=i;n=i;o=j;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){p=i+16|0;l=p+4|0;r=c[l>>2]|0;if(!r){s=c[p>>2]|0;if(!s){t=0;break}else{u=s;v=p}}else{u=r;v=l}while(1){l=u+20|0;r=c[l>>2]|0;if(r|0){u=r;v=l;continue}l=u+16|0;r=c[l>>2]|0;if(!r)break;else{u=r;v=l}}if(v>>>0<d>>>0)pa();else{c[v>>2]=0;t=u;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)pa();r=l+12|0;if((c[r>>2]|0)!=(i|0))pa();p=k+8|0;if((c[p>>2]|0)==(i|0)){c[r>>2]=k;c[p>>2]=l;t=k;break}else pa()}while(0);if(h){k=c[i+28>>2]|0;l=34952+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=t;if(!t){c[8663]=c[8663]&~(1<<k);m=i;n=i;o=j;break a}}else if(h>>>0>=(c[8666]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=t;if(!t){m=i;n=i;o=j;break a}else break}else pa();while(0);k=c[8666]|0;if(t>>>0<k>>>0)pa();c[t+24>>2]=h;l=i+16|0;p=c[l>>2]|0;do if(p|0)if(p>>>0<k>>>0)pa();else{c[t+16>>2]=p;c[p+24>>2]=t;break}while(0);p=c[l+4>>2]|0;if(p)if(p>>>0<(c[8666]|0)>>>0)pa();else{c[t+20>>2]=p;c[p+24>>2]=t;m=i;n=i;o=j;break}else{m=i;n=i;o=j}}else{m=i;n=i;o=j}}else{m=b;n=b;o=f}while(0);if(m>>>0>=g>>>0)pa();f=g+4|0;b=c[f>>2]|0;if(!(b&1))pa();if(!(b&2)){t=c[8667]|0;if((g|0)==(c[8668]|0)){d=(c[8665]|0)+o|0;c[8665]=d;c[8668]=n;c[n+4>>2]=d|1;if((n|0)!=(t|0))return;c[8667]=0;c[8664]=0;return}if((g|0)==(t|0)){t=(c[8664]|0)+o|0;c[8664]=t;c[8667]=m;c[n+4>>2]=t|1;c[m+t>>2]=t;return}t=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){u=c[g+24>>2]|0;v=c[g+12>>2]|0;do if((v|0)==(g|0)){q=g+16|0;a=q+4|0;e=c[a>>2]|0;if(!e){p=c[q>>2]|0;if(!p){w=0;break}else{x=p;y=q}}else{x=e;y=a}while(1){a=x+20|0;e=c[a>>2]|0;if(e|0){x=e;y=a;continue}a=x+16|0;e=c[a>>2]|0;if(!e)break;else{x=e;y=a}}if(y>>>0<(c[8666]|0)>>>0)pa();else{c[y>>2]=0;w=x;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[8666]|0)>>>0)pa();e=a+12|0;if((c[e>>2]|0)!=(g|0))pa();q=v+8|0;if((c[q>>2]|0)==(g|0)){c[e>>2]=v;c[q>>2]=a;w=v;break}else pa()}while(0);if(u|0){v=c[g+28>>2]|0;j=34952+(v<<2)|0;do if((g|0)==(c[j>>2]|0)){c[j>>2]=w;if(!w){c[8663]=c[8663]&~(1<<v);break b}}else if(u>>>0>=(c[8666]|0)>>>0){c[u+16+(((c[u+16>>2]|0)!=(g|0)&1)<<2)>>2]=w;if(!w)break b;else break}else pa();while(0);v=c[8666]|0;if(w>>>0<v>>>0)pa();c[w+24>>2]=u;j=g+16|0;i=c[j>>2]|0;do if(i|0)if(i>>>0<v>>>0)pa();else{c[w+16>>2]=i;c[i+24>>2]=w;break}while(0);i=c[j+4>>2]|0;if(i|0)if(i>>>0<(c[8666]|0)>>>0)pa();else{c[w+20>>2]=i;c[i+24>>2]=w;break}}}else{i=c[g+8>>2]|0;v=c[g+12>>2]|0;u=34688+(d<<1<<2)|0;if((i|0)!=(u|0)){if(i>>>0<(c[8666]|0)>>>0)pa();if((c[i+12>>2]|0)!=(g|0))pa()}if((v|0)==(i|0)){c[8662]=c[8662]&~(1<<d);break}if((v|0)!=(u|0)){if(v>>>0<(c[8666]|0)>>>0)pa();u=v+8|0;if((c[u>>2]|0)==(g|0))z=u;else pa()}else z=v+8|0;c[i+12>>2]=v;c[z>>2]=i}while(0);c[n+4>>2]=t|1;c[m+t>>2]=t;if((n|0)==(c[8667]|0)){c[8664]=t;return}else A=t}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;A=o}o=A>>>3;if(A>>>0<256){m=34688+(o<<1<<2)|0;b=c[8662]|0;f=1<<o;if(b&f){o=m+8|0;t=c[o>>2]|0;if(t>>>0<(c[8666]|0)>>>0)pa();else{B=o;C=t}}else{c[8662]=b|f;B=m+8|0;C=m}c[B>>2]=n;c[C+12>>2]=n;c[n+8>>2]=C;c[n+12>>2]=m;return}m=A>>>8;if(m)if(A>>>0>16777215)D=31;else{C=(m+1048320|0)>>>16&8;B=m<<C;m=(B+520192|0)>>>16&4;f=B<<m;B=(f+245760|0)>>>16&2;b=14-(m|C|B)+(f<<B>>>15)|0;D=A>>>(b+7|0)&1|b<<1}else D=0;b=34952+(D<<2)|0;c[n+28>>2]=D;c[n+20>>2]=0;c[n+16>>2]=0;B=c[8663]|0;f=1<<D;do if(B&f){C=A<<((D|0)==31?0:25-(D>>>1)|0);m=c[b>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(A|0)){E=124;break}F=m+16+(C>>>31<<2)|0;t=c[F>>2]|0;if(!t){E=121;break}else{C=C<<1;m=t}}if((E|0)==121)if(F>>>0<(c[8666]|0)>>>0)pa();else{c[F>>2]=n;c[n+24>>2]=m;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((E|0)==124){C=m+8|0;j=c[C>>2]|0;t=c[8666]|0;if(j>>>0>=t>>>0&m>>>0>=t>>>0){c[j+12>>2]=n;c[C>>2]=n;c[n+8>>2]=j;c[n+12>>2]=m;c[n+24>>2]=0;break}else pa()}}else{c[8663]=B|f;c[b>>2]=n;c[n+24>>2]=b;c[n+12>>2]=n;c[n+8>>2]=n}while(0);n=(c[8670]|0)+-1|0;c[8670]=n;if(!n)G=35104;else return;while(1){n=c[G>>2]|0;if(!n)break;else G=n+8|0}c[8670]=-1;return}function kh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a){d=ih(b)|0;return d|0}if(b>>>0>4294967231){c[(mg()|0)>>2]=12;d=0;return d|0}e=lh(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(e|0){d=e+8|0;return d|0}e=ih(b)|0;if(!e){d=0;return d|0}f=c[a+-4>>2]|0;g=(f&-8)-((f&3|0)==0?8:4)|0;vh(e|0,a|0,(g>>>0<b>>>0?g:b)|0)|0;jh(a);d=e;return d|0}function lh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a+f|0;h=c[8666]|0;i=e&3;if(!((i|0)!=1&a>>>0>=h>>>0&a>>>0<g>>>0))pa();j=c[g+4>>2]|0;if(!(j&1))pa();if(!i){if(b>>>0<256){k=0;return k|0}if(f>>>0>=(b+4|0)>>>0?(f-b|0)>>>0<=c[8782]<<1>>>0:0){k=a;return k|0}k=0;return k|0}if(f>>>0>=b>>>0){i=f-b|0;if(i>>>0<=15){k=a;return k|0}l=a+b|0;c[d>>2]=e&1|b|2;c[l+4>>2]=i|3;m=l+i+4|0;c[m>>2]=c[m>>2]|1;mh(l,i);k=a;return k|0}if((g|0)==(c[8668]|0)){i=(c[8665]|0)+f|0;l=i-b|0;m=a+b|0;if(i>>>0<=b>>>0){k=0;return k|0}c[d>>2]=e&1|b|2;c[m+4>>2]=l|1;c[8668]=m;c[8665]=l;k=a;return k|0}if((g|0)==(c[8667]|0)){l=(c[8664]|0)+f|0;if(l>>>0<b>>>0){k=0;return k|0}m=l-b|0;i=e&1;if(m>>>0>15){n=a+b|0;o=n+m|0;c[d>>2]=i|b|2;c[n+4>>2]=m|1;c[o>>2]=m;p=o+4|0;c[p>>2]=c[p>>2]&-2;q=n;r=m}else{c[d>>2]=i|l|2;i=a+l+4|0;c[i>>2]=c[i>>2]|1;q=0;r=0}c[8664]=r;c[8667]=q;k=a;return k|0}if(j&2|0){k=0;return k|0}q=(j&-8)+f|0;if(q>>>0<b>>>0){k=0;return k|0}f=q-b|0;r=j>>>3;a:do if(j>>>0>=256){i=c[g+24>>2]|0;l=c[g+12>>2]|0;do if((l|0)==(g|0)){m=g+16|0;n=m+4|0;p=c[n>>2]|0;if(!p){o=c[m>>2]|0;if(!o){s=0;break}else{t=o;u=m}}else{t=p;u=n}while(1){n=t+20|0;p=c[n>>2]|0;if(p|0){t=p;u=n;continue}n=t+16|0;p=c[n>>2]|0;if(!p)break;else{t=p;u=n}}if(u>>>0<h>>>0)pa();else{c[u>>2]=0;s=t;break}}else{n=c[g+8>>2]|0;if(n>>>0<h>>>0)pa();p=n+12|0;if((c[p>>2]|0)!=(g|0))pa();m=l+8|0;if((c[m>>2]|0)==(g|0)){c[p>>2]=l;c[m>>2]=n;s=l;break}else pa()}while(0);if(i|0){l=c[g+28>>2]|0;n=34952+(l<<2)|0;do if((g|0)==(c[n>>2]|0)){c[n>>2]=s;if(!s){c[8663]=c[8663]&~(1<<l);break a}}else if(i>>>0>=(c[8666]|0)>>>0){c[i+16+(((c[i+16>>2]|0)!=(g|0)&1)<<2)>>2]=s;if(!s)break a;else break}else pa();while(0);l=c[8666]|0;if(s>>>0<l>>>0)pa();c[s+24>>2]=i;n=g+16|0;m=c[n>>2]|0;do if(m|0)if(m>>>0<l>>>0)pa();else{c[s+16>>2]=m;c[m+24>>2]=s;break}while(0);m=c[n+4>>2]|0;if(m|0)if(m>>>0<(c[8666]|0)>>>0)pa();else{c[s+20>>2]=m;c[m+24>>2]=s;break}}}else{m=c[g+8>>2]|0;l=c[g+12>>2]|0;i=34688+(r<<1<<2)|0;if((m|0)!=(i|0)){if(m>>>0<h>>>0)pa();if((c[m+12>>2]|0)!=(g|0))pa()}if((l|0)==(m|0)){c[8662]=c[8662]&~(1<<r);break}if((l|0)!=(i|0)){if(l>>>0<h>>>0)pa();i=l+8|0;if((c[i>>2]|0)==(g|0))v=i;else pa()}else v=l+8|0;c[m+12>>2]=l;c[v>>2]=m}while(0);v=e&1;if(f>>>0<16){c[d>>2]=q|v|2;e=a+q+4|0;c[e>>2]=c[e>>2]|1;k=a;return k|0}else{e=a+b|0;c[d>>2]=v|b|2;c[e+4>>2]=f|3;b=e+f+4|0;c[b>>2]=c[b>>2]|1;mh(e,f);k=a;return k|0}return 0}function mh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=a+b|0;e=c[a+4>>2]|0;a:do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;i=c[8666]|0;if(g>>>0<i>>>0)pa();if((g|0)==(c[8667]|0)){j=d+4|0;k=c[j>>2]|0;if((k&3|0)!=3){l=g;m=h;break}c[8664]=h;c[j>>2]=k&-2;c[g+4>>2]=h|1;c[g+h>>2]=h;return}k=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;j=c[g+12>>2]|0;n=34688+(k<<1<<2)|0;if((f|0)!=(n|0)){if(f>>>0<i>>>0)pa();if((c[f+12>>2]|0)!=(g|0))pa()}if((j|0)==(f|0)){c[8662]=c[8662]&~(1<<k);l=g;m=h;break}if((j|0)!=(n|0)){if(j>>>0<i>>>0)pa();n=j+8|0;if((c[n>>2]|0)==(g|0))o=n;else pa()}else o=j+8|0;c[f+12>>2]=j;c[o>>2]=f;l=g;m=h;break}f=c[g+24>>2]|0;j=c[g+12>>2]|0;do if((j|0)==(g|0)){n=g+16|0;k=n+4|0;p=c[k>>2]|0;if(!p){q=c[n>>2]|0;if(!q){r=0;break}else{s=q;t=n}}else{s=p;t=k}while(1){k=s+20|0;p=c[k>>2]|0;if(p|0){s=p;t=k;continue}k=s+16|0;p=c[k>>2]|0;if(!p)break;else{s=p;t=k}}if(t>>>0<i>>>0)pa();else{c[t>>2]=0;r=s;break}}else{k=c[g+8>>2]|0;if(k>>>0<i>>>0)pa();p=k+12|0;if((c[p>>2]|0)!=(g|0))pa();n=j+8|0;if((c[n>>2]|0)==(g|0)){c[p>>2]=j;c[n>>2]=k;r=j;break}else pa()}while(0);if(f){j=c[g+28>>2]|0;i=34952+(j<<2)|0;do if((g|0)==(c[i>>2]|0)){c[i>>2]=r;if(!r){c[8663]=c[8663]&~(1<<j);l=g;m=h;break a}}else if(f>>>0>=(c[8666]|0)>>>0){c[f+16+(((c[f+16>>2]|0)!=(g|0)&1)<<2)>>2]=r;if(!r){l=g;m=h;break a}else break}else pa();while(0);j=c[8666]|0;if(r>>>0<j>>>0)pa();c[r+24>>2]=f;i=g+16|0;k=c[i>>2]|0;do if(k|0)if(k>>>0<j>>>0)pa();else{c[r+16>>2]=k;c[k+24>>2]=r;break}while(0);k=c[i+4>>2]|0;if(k)if(k>>>0<(c[8666]|0)>>>0)pa();else{c[r+20>>2]=k;c[k+24>>2]=r;l=g;m=h;break}else{l=g;m=h}}else{l=g;m=h}}else{l=a;m=b}while(0);b=c[8666]|0;if(d>>>0<b>>>0)pa();a=d+4|0;r=c[a>>2]|0;if(!(r&2)){s=c[8667]|0;if((d|0)==(c[8668]|0)){t=(c[8665]|0)+m|0;c[8665]=t;c[8668]=l;c[l+4>>2]=t|1;if((l|0)!=(s|0))return;c[8667]=0;c[8664]=0;return}if((d|0)==(s|0)){s=(c[8664]|0)+m|0;c[8664]=s;c[8667]=l;c[l+4>>2]=s|1;c[l+s>>2]=s;return}s=(r&-8)+m|0;t=r>>>3;b:do if(r>>>0>=256){o=c[d+24>>2]|0;e=c[d+12>>2]|0;do if((e|0)==(d|0)){k=d+16|0;j=k+4|0;f=c[j>>2]|0;if(!f){n=c[k>>2]|0;if(!n){u=0;break}else{v=n;w=k}}else{v=f;w=j}while(1){j=v+20|0;f=c[j>>2]|0;if(f|0){v=f;w=j;continue}j=v+16|0;f=c[j>>2]|0;if(!f)break;else{v=f;w=j}}if(w>>>0<b>>>0)pa();else{c[w>>2]=0;u=v;break}}else{j=c[d+8>>2]|0;if(j>>>0<b>>>0)pa();f=j+12|0;if((c[f>>2]|0)!=(d|0))pa();k=e+8|0;if((c[k>>2]|0)==(d|0)){c[f>>2]=e;c[k>>2]=j;u=e;break}else pa()}while(0);if(o|0){e=c[d+28>>2]|0;h=34952+(e<<2)|0;do if((d|0)==(c[h>>2]|0)){c[h>>2]=u;if(!u){c[8663]=c[8663]&~(1<<e);break b}}else if(o>>>0>=(c[8666]|0)>>>0){c[o+16+(((c[o+16>>2]|0)!=(d|0)&1)<<2)>>2]=u;if(!u)break b;else break}else pa();while(0);e=c[8666]|0;if(u>>>0<e>>>0)pa();c[u+24>>2]=o;h=d+16|0;g=c[h>>2]|0;do if(g|0)if(g>>>0<e>>>0)pa();else{c[u+16>>2]=g;c[g+24>>2]=u;break}while(0);g=c[h+4>>2]|0;if(g|0)if(g>>>0<(c[8666]|0)>>>0)pa();else{c[u+20>>2]=g;c[g+24>>2]=u;break}}}else{g=c[d+8>>2]|0;e=c[d+12>>2]|0;o=34688+(t<<1<<2)|0;if((g|0)!=(o|0)){if(g>>>0<b>>>0)pa();if((c[g+12>>2]|0)!=(d|0))pa()}if((e|0)==(g|0)){c[8662]=c[8662]&~(1<<t);break}if((e|0)!=(o|0)){if(e>>>0<b>>>0)pa();o=e+8|0;if((c[o>>2]|0)==(d|0))x=o;else pa()}else x=e+8|0;c[g+12>>2]=e;c[x>>2]=g}while(0);c[l+4>>2]=s|1;c[l+s>>2]=s;if((l|0)==(c[8667]|0)){c[8664]=s;return}else y=s}else{c[a>>2]=r&-2;c[l+4>>2]=m|1;c[l+m>>2]=m;y=m}m=y>>>3;if(y>>>0<256){r=34688+(m<<1<<2)|0;a=c[8662]|0;s=1<<m;if(a&s){m=r+8|0;x=c[m>>2]|0;if(x>>>0<(c[8666]|0)>>>0)pa();else{z=m;A=x}}else{c[8662]=a|s;z=r+8|0;A=r}c[z>>2]=l;c[A+12>>2]=l;c[l+8>>2]=A;c[l+12>>2]=r;return}r=y>>>8;if(r)if(y>>>0>16777215)B=31;else{A=(r+1048320|0)>>>16&8;z=r<<A;r=(z+520192|0)>>>16&4;s=z<<r;z=(s+245760|0)>>>16&2;a=14-(r|A|z)+(s<<z>>>15)|0;B=y>>>(a+7|0)&1|a<<1}else B=0;a=34952+(B<<2)|0;c[l+28>>2]=B;c[l+20>>2]=0;c[l+16>>2]=0;z=c[8663]|0;s=1<<B;if(!(z&s)){c[8663]=z|s;c[a>>2]=l;c[l+24>>2]=a;c[l+12>>2]=l;c[l+8>>2]=l;return}s=y<<((B|0)==31?0:25-(B>>>1)|0);B=c[a>>2]|0;while(1){if((c[B+4>>2]&-8|0)==(y|0)){C=121;break}D=B+16+(s>>>31<<2)|0;a=c[D>>2]|0;if(!a){C=118;break}else{s=s<<1;B=a}}if((C|0)==118){if(D>>>0<(c[8666]|0)>>>0)pa();c[D>>2]=l;c[l+24>>2]=B;c[l+12>>2]=l;c[l+8>>2]=l;return}else if((C|0)==121){C=B+8|0;D=c[C>>2]|0;s=c[8666]|0;if(!(D>>>0>=s>>>0&B>>>0>=s>>>0))pa();c[D+12>>2]=l;c[C>>2]=l;c[l+8>>2]=D;c[l+12>>2]=B;c[l+24>>2]=0;return}}function nh(){}function oh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (D=e,a-c>>>0|0)|0}function ph(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (D=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function qh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function rh(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function sh(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function th(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;q=q+1|0;c[a>>2]=q;while((f|0)<(e|0)){if(!(c[d+(f<<3)>>2]|0)){c[d+(f<<3)>>2]=q;c[d+((f<<3)+4)>>2]=b;c[d+((f<<3)+8)>>2]=0;D=e;return d|0}f=f+1|0}e=e*2|0;d=kh(d|0,8*(e+1|0)|0)|0;d=th(a|0,b|0,d|0,e|0)|0;D=e;return d|0}function uh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){f=c[b+(e<<3)>>2]|0;if(!f)break;if((f|0)==(a|0))return c[b+((e<<3)+4)>>2]|0;e=e+1|0}return 0}function vh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return qa(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function wh(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function xh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;g=a;h=b;i=h;j=d;k=e;l=k;if(!i){m=(f|0)!=0;if(!l){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (D=n,o)|0}else{if(!m){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return (D=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(V(l|0)|0)-(V(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}r=j-1|0;if(r&j|0){s=(V(j|0)|0)+33-(V(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(f|0){c[f>>2]=r&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (D=n,o)|0}else{r=wh(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (D=n,o)|0}}else{if(m){if(f|0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (D=n,o)|0}if(!g){if(f|0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (D=n,o)|0}r=l-1|0;if(!(r&l)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=r&i|b&0}n=0;o=i>>>((wh(l|0)|0)>>>0);return (D=n,o)|0}r=(V(l|0)|0)-(V(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}while(0);if(!t){B=x;C=w;E=v;F=u;G=0;H=0}else{b=d|0|0;d=k|e&0;e=ph(b|0,d|0,-1,-1)|0;k=D;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;oh(e|0,k|0,g|0,a|0)|0;i=D;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=oh(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&d|0)|0;w=D;u=u-1|0}while((u|0)!=0);B=h;C=x;E=w;F=v;G=0;H=t}t=C;C=0;if(f|0){c[f>>2]=F;c[f+4>>2]=E}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|G;o=(t<<1|0>>>31)&-2|H;return (D=n,o)|0}function yh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return xh(a,b,c,d,0)|0}function zh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=S(d,c)|0;f=a>>>16;a=(e>>>16)+(S(d,f)|0)|0;d=b>>>16;b=S(d,c)|0;return (D=(a>>>16)+(S(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Ah(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=zh(e,a)|0;f=D;return (D=(S(b,a)|0)+(S(d,e)|0)+f|f&0,c|0|0)|0}function Bh(a){a=a|0;var b=0,d=0;a=a+15&-16|0;b=c[i>>2]|0;d=b+a|0;if((a|0)>0&(d|0)<(b|0)|(d|0)<0){_()|0;oa(12);return -1}c[i>>2]=d;if((d|0)>(Z()|0)?(Y()|0)==0:0){oa(12);c[i>>2]=b;return -1}return b|0}function Ch(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else vh(b,c,d)|0;return b|0}function Dh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f|0;xh(a,b,d,e,g)|0;l=f;return (D=c[g+4>>2]|0,c[g>>2]|0)|0}function Eh(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Fh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return va[a&7](b|0,c|0,d|0)|0}function Gh(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;wa[a&15](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Hh(a){a=a|0;return xa[a&1]()|0}function Ih(a,b){a=a|0;b=b|0;ya[a&15](b|0)}function Jh(a,b,c){a=a|0;b=b|0;c=c|0;za[a&7](b|0,c|0)}function Kh(a,b){a=a|0;b=b|0;return Aa[a&7](b|0)|0}function Lh(a){a=a|0;Ba[a&7]()}function Mh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Ca[a&1](b|0,c|0,d|0,e|0)|0}function Nh(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Da[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function Oh(a,b,c){a=a|0;b=b|0;c=c|0;return Ea[a&31](b|0,c|0)|0}function Ph(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Fa[a&3](b|0,c|0,d|0,e|0,f|0)|0}function Qh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ga[a&63](b|0,c|0,d|0,e|0)}function Rh(a,b,c){a=a|0;b=b|0;c=c|0;W(0);return 0}function Sh(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;W(1)}function Th(){W(2);return 0}function Uh(a){a=a|0;W(3)}function Vh(a,b){a=a|0;b=b|0;W(4)}function Wh(a){a=a|0;W(5);return 0}function Xh(){W(6)}function Yh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(7);return 0}function Zh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(8)}function _h(a,b){a=a|0;b=b|0;W(9);return 0}function $h(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(10);return 0}function ai(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(11)}\n\n// EMSCRIPTEN_END_FUNCS\nvar va=[Rh,Se,qg,kg,Vg,Md,jg,Rh];var wa=[Sh,uc,wc,tc,zc,oc,qc,lc,xc,nc,Ac,vc,yc,rc,sc,Sh];var xa=[Th,rd];var ya=[Uh,ld,od,pd,qd,Af,Uf,Wf,Xf,qe,zd,Uh,Uh,Uh,Uh,Uh];var za=[Vh,Tc,Zc,Wc,_c,ad,cd,sf];var Aa=[Wh,md,nd,Re,ig,eb,Wh,Wh];var Ba=[Xh,be,kd,$a,Pe,Xh,Xh,Xh];var Ca=[Yh,We];var Da=[Zh,If];var Ea=[_h,Qe,Te,Ve,$e,af,bf,cf,df,ef,ff,gf,hf,jf,kf,lf,mf,nf,ee,fe,ge,Ee,Xe,Nd,Ff,Hf,Ce,Ta,Va,Vf,_h,_h];var Fa=[$h,Ue,cb,$h];var Ga=[ai,Lb,Mb,Nb,Ob,Pb,Qb,Rb,Sb,jb,pb,rb,sb,lb,wb,xb,yb,kb,tb,ub,vb,mb,zb,Bb,Cb,nb,Db,Fb,Gb,ob,Hb,Jb,Kb,Tb,Ub,Vb,Wb,Xb,Yb,Zb,_b,dc,ec,fc,gc,$b,ac,bc,cc,hc,ic,jc,kc,oe,Sa,zf,ai,ai,ai,ai,ai,ai,ai,ai];return{_ogv_video_decoder_destroy:eg,stackSave:Ia,_ogv_video_decoder_init:cg,_llvm_cttz_i32:wh,_ogv_video_decoder_process_frame:gg,getTempRet0:Na,_bitshift64Lshr:rh,_bitshift64Shl:sh,_ogv_video_decoder_process_header:fg,_memset:qh,_sbrk:Bh,_memcpy:vh,stackAlloc:Ha,___muldi3:Ah,___uremdi3:Dh,_i64Subtract:oh,___udivmoddi4:xh,setTempRet0:Ma,_realloc:kh,_i64Add:ph,_ogv_video_decoder_async:dg,_emscripten_get_global_libc:hg,___udivdi3:yh,_llvm_bswap_i32:Eh,___muldsi3:zh,_testSetjmp:uh,_saveSetjmp:th,_free:jh,runPostSets:nh,setThrew:La,establishStackSpace:Ka,_memmove:Ch,stackRestore:Ja,_malloc:ih,stackAlloc:Ha,stackSave:Ia,stackRestore:Ja,establishStackSpace:Ka,setThrew:La,setTempRet0:Ma,getTempRet0:Na,dynCall_iiii:Fh,dynCall_viiiiiiiiii:Gh,dynCall_i:Hh,dynCall_vi:Ih,dynCall_vii:Jh,dynCall_ii:Kh,dynCall_v:Lh,dynCall_iiiii:Mh,dynCall_viiiiii:Nh,dynCall_iii:Oh,dynCall_iiiiii:Ph,dynCall_viiii:Qh}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _ogv_video_decoder_destroy=Module[\"_ogv_video_decoder_destroy\"]=asm[\"_ogv_video_decoder_destroy\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var _ogv_video_decoder_init=Module[\"_ogv_video_decoder_init\"]=asm[\"_ogv_video_decoder_init\"];var _llvm_cttz_i32=Module[\"_llvm_cttz_i32\"]=asm[\"_llvm_cttz_i32\"];var _ogv_video_decoder_process_frame=Module[\"_ogv_video_decoder_process_frame\"]=asm[\"_ogv_video_decoder_process_frame\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _ogv_video_decoder_process_header=Module[\"_ogv_video_decoder_process_header\"]=asm[\"_ogv_video_decoder_process_header\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var ___udivmoddi4=Module[\"___udivmoddi4\"]=asm[\"___udivmoddi4\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _realloc=Module[\"_realloc\"]=asm[\"_realloc\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _ogv_video_decoder_async=Module[\"_ogv_video_decoder_async\"]=asm[\"_ogv_video_decoder_async\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var ___muldsi3=Module[\"___muldsi3\"]=asm[\"___muldsi3\"];var _testSetjmp=Module[\"_testSetjmp\"]=asm[\"_testSetjmp\"];var _saveSetjmp=Module[\"_saveSetjmp\"]=asm[\"_saveSetjmp\"];var _free=Module[\"_free\"]=asm[\"_free\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_viiiiiiiiii=Module[\"dynCall_viiiiiiiiii\"]=asm[\"dynCall_viiiiiiiiii\"];var dynCall_i=Module[\"dynCall_i\"]=asm[\"dynCall_i\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_v=Module[\"dynCall_v\"]=asm[\"dynCall_v\"];var dynCall_iiiii=Module[\"dynCall_iiiii\"]=asm[\"dynCall_iiiii\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=asm[\"dynCall_iiiiii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module.cpuTime+=getTimestamp()-start;return ret}function copyByteArray(bytes){var heap=bytes.buffer;if(heap instanceof ArrayBuffer&&typeof heap.slice===\"function\"){var extract=heap.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength);return new Uint8Array(extract)}else{return new Uint8Array(bytes)}}Module.loadedMetadata=!!options.videoFormat;Module.videoFormat=options.videoFormat||null;Module.frameBuffer=null;Module.cpuTime=0;Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Module.init=(function(callback){function finish(){time((function(){Module._ogv_video_decoder_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.processHeader=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_header(buffer,len)}));callback(ret)});Module.callbacks=[];Module.processFrame=(function(data,callback){var isAsync=Module._ogv_video_decoder_async();var len=data.byteLength;var buffer=Module._malloc(len);function callbackWrapper(ret){Module._free(buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time((function(){Module.HEAPU8.set(new Uint8Array(data),buffer);return Module._ogv_video_decoder_process_frame(buffer,len)}));if(!isAsync){callbackWrapper(ret)}});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDecoderVideoVP9;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-demuxer-ogg-wasm.js",
    "content": "var OGVDemuxerOggW\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDemuxerOggW = function(OGVDemuxerOggW) {\n  OGVDemuxerOggW = OGVDemuxerOggW || {};\n  if (!OGVDemuxerOggW.currentScriptUrl) OGVDemuxerOggW.currentScriptUrl = scriptSrc;\n  var Module = OGVDemuxerOggW;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDemuxerOggW=Module;var Module;if(!Module)Module=(typeof OGVDemuxerOggW!==\"undefined\"?OGVDemuxerOggW:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Memory===\"function\"){Module[\"wasmMemory\"]=new WebAssembly.Memory({\"initial\":TOTAL_MEMORY/WASM_PAGE_SIZE,\"maximum\":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\"wasmMemory\"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"fround\"]){var froundBuffer=new Float32Array(1);Math[\"fround\"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math[\"fround\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module[\"wasmJSMethod\"]||\"native-wasm\";Module[\"wasmJSMethod\"]=method;var wasmTextFile=Module[\"wasmTextFile\"]||\"ogv-demuxer-ogg-wasm.wast\";var wasmBinaryFile=Module[\"wasmBinaryFile\"]||\"ogv-demuxer-ogg-wasm.wasm\";var asmjsCodeFile=Module[\"asmjsCodeFile\"]||\"ogv-demuxer-ogg-wasm.temp.asm.js\";if(typeof Module[\"locateFile\"]===\"function\"){wasmTextFile=Module[\"locateFile\"](wasmTextFile);wasmBinaryFile=Module[\"locateFile\"](wasmBinaryFile);asmjsCodeFile=Module[\"locateFile\"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={\"f64-rem\":(function(x,y){return x%y}),\"f64-to-int\":(function(x){return x|0}),\"i32s-div\":(function(x,y){return(x|0)/(y|0)|0}),\"i32u-div\":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\"i32s-rem\":(function(x,y){return(x|0)%(y|0)|0}),\"i32u-rem\":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\"debugger\":(function(){debugger})};var info={\"global\":null,\"env\":null,\"asm2wasm\":asm2wasmImports,\"parent\":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(\".\")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(\".\");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\"bad lookupImport to (\"+mod+\").\"+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module[\"buffer\"];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\"printErr\"](\"the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here\")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\"STATIC_BASE\"],Module[\"STATIC_BASE\"]+Module[\"STATIC_BUMP\"]),Module[\"STATIC_BASE\"])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function fixImports(imports){if(!0)return imports;var ret={};for(var i in imports){var fixed=i;if(fixed[0]==\"_\")fixed=fixed.substr(1);ret[fixed]=imports[i]}return ret}function getBinary(){var binary;if(Module[\"wasmBinary\"]){binary=Module[\"wasmBinary\"];binary=new Uint8Array(binary)}else if(Module[\"readBinary\"]){binary=Module[\"readBinary\"](wasmBinaryFile)}else{throw\"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)\"}return binary}function getBinaryPromise(){if(!Module[\"wasmBinary\"]&&typeof fetch===\"function\"){return fetch(wasmBinaryFile).then((function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doJustAsm(global,env,providedBuffer){if(typeof Module[\"asm\"]!==\"function\"||Module[\"asm\"]===methodHandler){if(!Module[\"asmPreload\"]){eval(Module[\"read\"](asmjsCodeFile))}else{Module[\"asm\"]=Module[\"asmPreload\"]}}if(typeof Module[\"asm\"]!==\"function\"){Module[\"printErr\"](\"asm evalling did not set the module properly\");return false}return Module[\"asm\"](global,env,providedBuffer)}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!==\"object\"){Module[\"printErr\"](\"no native wasm support detected\");return false}if(!(Module[\"wasmMemory\"]instanceof WebAssembly.Memory)){Module[\"printErr\"](\"no native wasm Memory in use\");return false}env[\"memory\"]=Module[\"wasmMemory\"];info[\"global\"]={\"NaN\":NaN,\"Infinity\":Infinity};info[\"global.Math\"]=global.Math;info[\"env\"]=env;function receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\"asm\"]=exports;Module[\"usingWasm\"]=true;removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){Module[\"printErr\"](\"Module.instantiateWasm callback failed with error: \"+e);return false}}getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\"instance\"])})).catch((function(reason){Module[\"printErr\"](\"failed to asynchronously prepare wasm: \"+reason);Module[\"quit\"](1,reason)}));return{}}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!==\"function\"){Module[\"printErr\"](\"WasmJS not detected - polyfill not bundled?\");return false}var wasmJS=WasmJS({});wasmJS[\"outside\"]=Module;wasmJS[\"info\"]=info;wasmJS[\"lookupImport\"]=lookupImport;assert(providedBuffer===Module[\"buffer\"]);info.global=global;info.env=env;assert(providedBuffer===Module[\"buffer\"]);env[\"memory\"]=providedBuffer;assert(env[\"memory\"]instanceof ArrayBuffer);wasmJS[\"providedTotalMemory\"]=Module[\"buffer\"].byteLength;var code;if(method===\"interpret-binary\"){code=getBinary()}else{code=Module[\"read\"](method==\"interpret-asm2wasm\"?asmjsCodeFile:wasmTextFile)}var temp;if(method==\"interpret-asm2wasm\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_asm2wasm\"](temp)}else if(method===\"interpret-s-expr\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_s_expr2wasm\"](temp)}else if(method===\"interpret-binary\"){temp=wasmJS[\"_malloc\"](code.length);wasmJS[\"HEAPU8\"].set(code,temp);wasmJS[\"_load_binary2wasm\"](temp,code.length)}else{throw\"what? \"+method}wasmJS[\"_free\"](temp);wasmJS[\"_instantiate\"](temp);if(Module[\"newBuffer\"]){mergeMemory(Module[\"newBuffer\"]);Module[\"newBuffer\"]=null}exports=wasmJS[\"asmExports\"];return exports}Module[\"asmPreload\"]=Module[\"asm\"];Module[\"reallocBuffer\"]=(function(size){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module[\"buffer\"];var oldSize=old.byteLength;if(Module[\"usingWasm\"]){try{var result=Module[\"wasmMemory\"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module[\"buffer\"]=Module[\"wasmMemory\"].buffer}else{return null}}catch(e){return null}}else{exports[\"__growWasmMemory\"]((size-oldSize)/wasmPageSize);return Module[\"buffer\"]!==old?Module[\"buffer\"]:null}});Module[\"asm\"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\"table\"]){var TABLE_SIZE=Module[\"wasmTableSize\"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module[\"wasmMaxTableSize\"];if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Table===\"function\"){if(MAX_TABLE_SIZE!==undefined){env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,\"maximum\":MAX_TABLE_SIZE,\"element\":\"anyfunc\"})}else{env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,element:\"anyfunc\"})}}else{env[\"table\"]=new Array(TABLE_SIZE)}Module[\"wasmTable\"]=env[\"table\"]}if(!env[\"memoryBase\"]){env[\"memoryBase\"]=Module[\"STATIC_BASE\"]}if(!env[\"tableBase\"]){env[\"tableBase\"]=0}var exports;var methods=method.split(\",\");for(var i=0;i<methods.length;i++){var curr=methods[i];if(curr===\"native-wasm\"){if(exports=doNativeWasm(global,env,providedBuffer))break}else if(curr===\"asmjs\"){if(exports=doJustAsm(global,env,providedBuffer))break}else if(curr===\"interpret-asm2wasm\"||curr===\"interpret-s-expr\"||curr===\"interpret-binary\"){if(exports=doWasmPolyfill(global,env,providedBuffer,curr))break}else{throw\"bad method: \"+curr}}if(!exports)throw\"no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods\";return exports});var methodHandler=Module[\"asm\"]}integrateWasmJS(Module);var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+8240;__ATINIT__.push();memoryInitializer=Module[\"wasmJSMethod\"].indexOf(\"asmjs\")>=0||Module[\"wasmJSMethod\"].indexOf(\"interpret-asm2wasm\")>=0?\"ogv-demuxer-ogg-wasm.js.mem\":null;var STATIC_BUMP=8240;Module[\"STATIC_BASE\"]=STATIC_BASE;Module[\"STATIC_BUMP\"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_memset\"]=_memset;function _ogvjs_callback_loaded_metadata(videoCodecStr,audioCodecStr){if(videoCodecStr){Module.videoCodec=Module.Pointer_stringify(videoCodecStr)}if(audioCodecStr){Module.audioCodec=Module.Pointer_stringify(audioCodecStr)}var len=Module._ogv_demuxer_media_duration();if(len>=0){Module.duration=len}else{Module.duration=NaN}Module.loadedMetadata=true}function _abort(){Module[\"abort\"]()}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall3(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get(),count=SYSCALLS.get();return FS.read(stream,HEAP8,buf,count)}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___lock(){}function ___unlock(){}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _ogvjs_callback_audio_packet(buffer,len,audioTimestamp){Module.audioPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:audioTimestamp})}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;Module[\"_memmove\"]=_memmove;function _ogvjs_callback_video_packet(buffer,len,frameTimestamp,keyframeTimestamp,isKeyframe){Module.videoPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:frameTimestamp,keyframeTimestamp:keyframeTimestamp,isKeyframe:!!isKeyframe})}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\"wasmTableSize\"]=66;Module[\"wasmMaxTableSize\"]=66;function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_jiiji(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_jiiji\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_jjiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_jjiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_jjii(index,a1,a2,a3,a4){try{return Module[\"dynCall_jjii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_jiiji\":invoke_jiiji,\"invoke_vi\":invoke_vi,\"invoke_jjiii\":invoke_jjiii,\"invoke_ii\":invoke_ii,\"invoke_jjii\":invoke_jjii,\"invoke_iiiii\":invoke_iiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"_ogvjs_callback_loaded_metadata\":_ogvjs_callback_loaded_metadata,\"___syscall3\":___syscall3,\"___lock\":___lock,\"_abort\":_abort,\"___setErrNo\":___setErrNo,\"___syscall6\":___syscall6,\"___unlock\":___unlock,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"_ogvjs_callback_audio_packet\":_ogvjs_callback_audio_packet,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"_ogvjs_callback_video_packet\":_ogvjs_callback_video_packet,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};var asm=Module[\"asm\"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\"asm\"]=asm;var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=(function(){return Module[\"asm\"][\"_llvm_bswap_i32\"].apply(null,arguments)});var _ogv_demuxer_receive_input=Module[\"_ogv_demuxer_receive_input\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_receive_input\"].apply(null,arguments)});var setThrew=Module[\"setThrew\"]=(function(){return Module[\"asm\"][\"setThrew\"].apply(null,arguments)});var _ogv_demuxer_keypoint_offset=Module[\"_ogv_demuxer_keypoint_offset\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_keypoint_offset\"].apply(null,arguments)});var _ogv_demuxer_process=Module[\"_ogv_demuxer_process\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_process\"].apply(null,arguments)});var _memset=Module[\"_memset\"]=(function(){return Module[\"asm\"][\"_memset\"].apply(null,arguments)});var _ogv_demuxer_destroy=Module[\"_ogv_demuxer_destroy\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_destroy\"].apply(null,arguments)});var _sbrk=Module[\"_sbrk\"]=(function(){return Module[\"asm\"][\"_sbrk\"].apply(null,arguments)});var _memcpy=Module[\"_memcpy\"]=(function(){return Module[\"asm\"][\"_memcpy\"].apply(null,arguments)});var stackAlloc=Module[\"stackAlloc\"]=(function(){return Module[\"asm\"][\"stackAlloc\"].apply(null,arguments)});var getTempRet0=Module[\"getTempRet0\"]=(function(){return Module[\"asm\"][\"getTempRet0\"].apply(null,arguments)});var setTempRet0=Module[\"setTempRet0\"]=(function(){return Module[\"asm\"][\"setTempRet0\"].apply(null,arguments)});var _ogv_demuxer_media_duration=Module[\"_ogv_demuxer_media_duration\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_media_duration\"].apply(null,arguments)});var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=(function(){return Module[\"asm\"][\"_emscripten_get_global_libc\"].apply(null,arguments)});var _ogv_demuxer_media_length=Module[\"_ogv_demuxer_media_length\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_media_length\"].apply(null,arguments)});var _free=Module[\"_free\"]=(function(){return Module[\"asm\"][\"_free\"].apply(null,arguments)});var stackRestore=Module[\"stackRestore\"]=(function(){return Module[\"asm\"][\"stackRestore\"].apply(null,arguments)});var stackSave=Module[\"stackSave\"]=(function(){return Module[\"asm\"][\"stackSave\"].apply(null,arguments)});var _ogv_demuxer_seek_to_keypoint=Module[\"_ogv_demuxer_seek_to_keypoint\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_seek_to_keypoint\"].apply(null,arguments)});var runPostSets=Module[\"runPostSets\"]=(function(){return Module[\"asm\"][\"runPostSets\"].apply(null,arguments)});var establishStackSpace=Module[\"establishStackSpace\"]=(function(){return Module[\"asm\"][\"establishStackSpace\"].apply(null,arguments)});var _memmove=Module[\"_memmove\"]=(function(){return Module[\"asm\"][\"_memmove\"].apply(null,arguments)});var _ogv_demuxer_init=Module[\"_ogv_demuxer_init\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_init\"].apply(null,arguments)});var _ogv_demuxer_seekable=Module[\"_ogv_demuxer_seekable\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_seekable\"].apply(null,arguments)});var _malloc=Module[\"_malloc\"]=(function(){return Module[\"asm\"][\"_malloc\"].apply(null,arguments)});var _ogv_demuxer_flush=Module[\"_ogv_demuxer_flush\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_flush\"].apply(null,arguments)});var dynCall_iiii=Module[\"dynCall_iiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiii\"].apply(null,arguments)});var dynCall_jiiji=Module[\"dynCall_jiiji\"]=(function(){return Module[\"asm\"][\"dynCall_jiiji\"].apply(null,arguments)});var dynCall_vi=Module[\"dynCall_vi\"]=(function(){return Module[\"asm\"][\"dynCall_vi\"].apply(null,arguments)});var dynCall_jjiii=Module[\"dynCall_jjiii\"]=(function(){return Module[\"asm\"][\"dynCall_jjiii\"].apply(null,arguments)});var dynCall_ii=Module[\"dynCall_ii\"]=(function(){return Module[\"asm\"][\"dynCall_ii\"].apply(null,arguments)});var dynCall_jjii=Module[\"dynCall_jjii\"]=(function(){return Module[\"asm\"][\"dynCall_jjii\"].apply(null,arguments)});var dynCall_iiiii=Module[\"dynCall_iiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiii\"].apply(null,arguments)});var dynCall_iii=Module[\"dynCall_iii\"]=(function(){return Module[\"asm\"][\"dynCall_iii\"].apply(null,arguments)});var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiiiii\"].apply(null,arguments)});Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;if(memoryInitializer){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];if(request.status!==200&&request.status!==0){console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();var delta=getTimestamp()-start;Module.cpuTime+=delta;return ret}Module.loadedMetadata=false;Module.videoCodec=null;Module.audioCodec=null;Module.duration=NaN;Module.onseek=null;Module.cpuTime=0;Module.audioPackets=[];Object.defineProperty(Module,\"hasAudio\",{get:(function(){return Module.loadedMetadata&&Module.audioCodec})});Object.defineProperty(Module,\"audioReady\",{get:(function(){return Module.audioPackets.length>0})});Object.defineProperty(Module,\"audioTimestamp\",{get:(function(){if(Module.audioPackets.length>0){return Module.audioPackets[0].timestamp}else{return-1}})});Module.videoPackets=[];Object.defineProperty(Module,\"hasVideo\",{get:(function(){return Module.loadedMetadata&&Module.videoCodec})});Object.defineProperty(Module,\"frameReady\",{get:(function(){return Module.videoPackets.length>0})});Object.defineProperty(Module,\"frameTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].timestamp}else{return-1}})});Object.defineProperty(Module,\"keyframeTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].keyframeTimestamp}else{return-1}})});Object.defineProperty(Module,\"nextKeyframeTimestamp\",{get:(function(){for(var i=0;i<Module.videoPackets.length;i++){var packet=Module.videoPackets[i];if(packet.isKeyframe){return packet.timestamp}}return-1})});Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Object.defineProperty(Module,\"seekable\",{get:(function(){return!!Module._ogv_demuxer_seekable()})});Module.init=(function(callback){function finish(){time((function(){Module._ogv_demuxer_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.receiveInput=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);Module._ogv_demuxer_receive_input(buffer,len)}));callback()});Module.process=(function(callback){var ret=time((function(){return Module._ogv_demuxer_process()}));callback(!!ret)});Module.dequeueVideoPacket=(function(callback){if(Module.videoPackets.length){var packet=Module.videoPackets.shift().data;callback(packet)}else{callback(null)}});Module.dequeueAudioPacket=(function(callback){if(Module.audioPackets.length){var packet=Module.audioPackets.shift().data;callback(packet)}else{callback(null)}});Module.getKeypointOffset=(function(timeSeconds,callback){var offset=time((function(){return Module._ogv_demuxer_keypoint_offset(timeSeconds*1e3)}));callback(offset)});Module.seekToKeypoint=(function(timeSeconds,callback){var ret=time((function(){return Module._ogv_demuxer_seek_to_keypoint(timeSeconds*1e3)}));if(ret){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length)}callback(!!ret)});Module.flush=(function(callback){time((function(){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length);Module._ogv_demuxer_flush()}));callback()});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n  return OGVDemuxerOggW;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-demuxer-ogg.js",
    "content": "var OGVDemuxerOgg\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDemuxerOgg = function(OGVDemuxerOgg) {\n  OGVDemuxerOgg = OGVDemuxerOgg || {};\n  if (!OGVDemuxerOgg.currentScriptUrl) OGVDemuxerOgg.currentScriptUrl = scriptSrc;\n  var Module = OGVDemuxerOgg;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDemuxerOgg=Module;var Module;if(!Module)Module=(typeof OGVDemuxerOgg!==\"undefined\"?OGVDemuxerOgg:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+7216;__ATINIT__.push();allocate([0,0,0,0,183,29,193,4,110,59,130,9,217,38,67,13,220,118,4,19,107,107,197,23,178,77,134,26,5,80,71,30,184,237,8,38,15,240,201,34,214,214,138,47,97,203,75,43,100,155,12,53,211,134,205,49,10,160,142,60,189,189,79,56,112,219,17,76,199,198,208,72,30,224,147,69,169,253,82,65,172,173,21,95,27,176,212,91,194,150,151,86,117,139,86,82,200,54,25,106,127,43,216,110,166,13,155,99,17,16,90,103,20,64,29,121,163,93,220,125,122,123,159,112,205,102,94,116,224,182,35,152,87,171,226,156,142,141,161,145,57,144,96,149,60,192,39,139,139,221,230,143,82,251,165,130,229,230,100,134,88,91,43,190,239,70,234,186,54,96,169,183,129,125,104,179,132,45,47,173,51,48,238,169,234,22,173,164,93,11,108,160,144,109,50,212,39,112,243,208,254,86,176,221,73,75,113,217,76,27,54,199,251,6,247,195,34,32,180,206,149,61,117,202,40,128,58,242,159,157,251,246,70,187,184,251,241,166,121,255,244,246,62,225,67,235,255,229,154,205,188,232,45,208,125,236,119,112,134,52,192,109,71,48,25,75,4,61,174,86,197,57,171,6,130,39,28,27,67,35,197,61,0,46,114,32,193,42,207,157,142,18,120,128,79,22,161,166,12,27,22,187,205,31,19,235,138,1,164,246,75,5,125,208,8,8,202,205,201,12,7,171,151,120,176,182,86,124,105,144,21,113,222,141,212,117,219,221,147,107,108,192,82,111,181,230,17,98,2,251,208,102,191,70,159,94,8,91,94,90,209,125,29,87,102,96,220,83,99,48,155,77,212,45,90,73,13,11,25,68,186,22,216,64,151,198,165,172,32,219,100,168,249,253,39,165,78,224,230,161,75,176,161,191,252,173,96,187,37,139,35,182,146,150,226,178,47,43,173,138,152,54,108,142,65,16,47,131,246,13,238,135,243,93,169,153,68,64,104,157,157,102,43,144,42,123,234,148,231,29,180,224,80,0,117,228,137,38,54,233,62,59,247,237,59,107,176,243,140,118,113,247,85,80,50,250,226,77,243,254,95,240,188,198,232,237,125,194,49,203,62,207,134,214,255,203,131,134,184,213,52,155,121,209,237,189,58,220,90,160,251,216,238,224,12,105,89,253,205,109,128,219,142,96,55,198,79,100,50,150,8,122,133,139,201,126,92,173,138,115,235,176,75,119,86,13,4,79,225,16,197,75,56,54,134,70,143,43,71,66,138,123,0,92,61,102,193,88,228,64,130,85,83,93,67,81,158,59,29,37,41,38,220,33,240,0,159,44,71,29,94,40,66,77,25,54,245,80,216,50,44,118,155,63,155,107,90,59,38,214,21,3,145,203,212,7,72,237,151,10,255,240,86,14,250,160,17,16,77,189,208,20,148,155,147,25,35,134,82,29,14,86,47,241,185,75,238,245,96,109,173,248,215,112,108,252,210,32,43,226,101,61,234,230,188,27,169,235,11,6,104,239,182,187,39,215,1,166,230,211,216,128,165,222,111,157,100,218,106,205,35,196,221,208,226,192,4,246,161,205,179,235,96,201,126,141,62,189,201,144,255,185,16,182,188,180,167,171,125,176,162,251,58,174,21,230,251,170,204,192,184,167,123,221,121,163,198,96,54,155,113,125,247,159,168,91,180,146,31,70,117,150,26,22,50,136,173,11,243,140,116,45,176,129,195,48,113,133,153,144,138,93,46,141,75,89,247,171,8,84,64,182,201,80,69,230,142,78,242,251,79,74,43,221,12,71,156,192,205,67,33,125,130,123,150,96,67,127,79,70,0,114,248,91,193,118,253,11,134,104,74,22,71,108,147,48,4,97,36,45,197,101,233,75,155,17,94,86,90,21,135,112,25,24,48,109,216,28,53,61,159,2,130,32,94,6,91,6,29,11,236,27,220,15,81,166,147,55,230,187,82,51,63,157,17,62,136,128,208,58,141,208,151,36,58,205,86,32,227,235,21,45,84,246,212,41,121,38,169,197,206,59,104,193,23,29,43,204,160,0,234,200,165,80,173,214,18,77,108,210,203,107,47,223,124,118,238,219,193,203,161,227,118,214,96,231,175,240,35,234,24,237,226,238,29,189,165,240,170,160,100,244,115,134,39,249,196,155,230,253,9,253,184,137,190,224,121,141,103,198,58,128,208,219,251,132,213,139,188,154,98,150,125,158,187,176,62,147,12,173,255,151,177,16,176,175,6,13,113,171,223,43,50,166,104,54,243,162,109,102,180,188,218,123,117,184,3,93,54,181,180,64,247,177,229,9,0,0,7,0,0,0,237,9,0,0,1,0,0,0,1,0,0,0,2,0,0,0,244,9,0,0,7,0,0,0,252,9,0,0,3,0,0,0,2,0,0,0,4,0,0,0,3,10,0,0,5,0,0,0,3,10,0,0,5,0,0,0,3,0,0,0,0,0,0,0,9,10,0,0,8,0,0,0,18,10,0,0,6,0,0,0,0,0,0,0,0,0,0,0,22,10,0,0,8,0,0,0,31,10,0,0,7,0,0,0,0,0,0,0,0,0,0,0,36,10,0,0,7,0,0,0,36,10,0,0,8,0,0,0,0,0,0,0,0,0,0,0,44,10,0,0,7,0,0,0,52,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,61,10,0,0,4,0,0,0,66,10,0,0,10,0,0,0,4,0,0,0,0,0,0,0,72,10,0,0,5,0,0,0,78,10,0,0,11,0,0,0,4,0,0,0,0,0,0,0,83,10,0,0,7,0,0,0,83,10,0,0,12,0,0,0,0,0,0,0,0,0,0,0,91,10,0,0,8,0,0,0,100,10,0,0,13,0,0,0,5,0,0,0,0,0,0,0,105,10,0,0,8,0,0,0,114,10,0,0,14,0,0,0,0,0,0,0,0,0,0,0,119,10,0,0,5,0,0,0,125,10,0,0,15,0,0,0,0,0,0,0,0,0,0,0,131,10,0,0,8,0,0,0,140,10,0,0,16,0,0,0,6,0,0,0,17,0,0,0,145,10,0,0,5,0,0,0,151,10,0,0,18,0,0,0,7,0,0,0,0,0,0,0,36,24,0,0,0,0,0,0,155,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,1,0,0,192,3,0,0,128,7,0,0,64,11,0,0,224,1,0,0,192,3,0,0,128,7,0,0,64,11,0,0,224,1,0,0,192,3,0,0,128,7,0,0,64,11,0,0,224,1,0,0,192,3,0,0,224,1,0,0,192,3,0,0,120,0,0,0,240,0,0,0,224,1,0,0,192,3,0,0,120,0,0,0,240,0,0,0,224,1,0,0,192,3,0,0,120,0,0,0,240,0,0,0,224,1,0,0,192,3,0,0,120,0,0,0,240,0,0,0,224,1,0,0,192,3,0,0,128,2,0,0,204,1,0,0,24,0,0,0,1,0,0,0,176,0,0,0,120,0,0,0,96,1,0,0,240,0,0,0,96,1,0,0,32,1,0,0,192,2,0,0,224,1,0,0,192,2,0,0,64,2,0,0,208,2,0,0,224,1,0,0,208,2,0,0,64,2,0,0,0,5,0,0,208,2,0,0,0,5,0,0,208,2,0,0,128,7,0,0,56,4,0,0,128,7,0,0,56,4,0,0,128,7,0,0,56,4,0,0,128,7,0,0,56,4,0,0,0,8,0,0,56,4,0,0,0,16,0,0,112,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,9,0,0,0,10,0,0,0,9,0,0,0,10,0,0,0,9,0,0,0,10,0,0,0,4,0,0,0,3,0,0,0,7,0,0,0,6,0,0,0,4,0,0,0,3,0,0,0,7,0,0,0,6,0,0,0,2,0,0,0,2,0,0,0,7,0,0,0,6,0,0,0,7,0,0,0,6,0,0,0,1,0,0,0,1,0,0,0,192,93,0,0,233,3,0,0,24,0,0,0,1,0,0,0,25,0,0,0,1,0,0,0,48,117,0,0,233,3,0,0,30,0,0,0,1,0,0,0,50,0,0,0,1,0,0,0,96,234,0,0,233,3,0,0,60,0,0,0,1,0,0,0,152,58,0,0,233,3,0,0,25,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,7,0,0,0,15,0,0,0,31,0,0,0,63,0,0,0,127,0,0,0,255,0,0,0,255,1,0,0,255,3,0,0,255,7,0,0,255,15,0,0,255,31,0,0,255,63,0,0,255,127,0,0,255,255,0,0,255,255,1,0,255,255,3,0,255,255,7,0,255,255,15,0,255,255,31,0,255,255,63,0,255,255,127,0,255,255,255,0,255,255,255,1,255,255,255,3,255,255,255,7,255,255,255,15,255,255,255,31,255,255,255,63,255,255,255,127,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,45,24,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,9,0,0,79,103,103,83,0,128,116,104,101,111,114,97,0,84,104,101,111,114,97,0,1,118,111,114,98,105,115,0,86,111,114,98,105,115,0,83,112,101,101,120,0,80,67,77,32,32,32,32,32,0,80,67,77,0,67,77,77,76,0,0,0,0,0,67,77,77,76,0,65,110,110,111,100,101,120,0,102,105,115,104,101,97,100,0,83,107,101,108,101,116,111,110,0,102,76,97,67,0,70,108,97,99,48,0,127,70,76,65,67,0,70,108,97,99,0,65,110,120,68,97,116,97,0,67,69,76,84,32,32,32,32,0,67,69,76,84,0,128,107,97,116,101,0,0,0,0,75,97,116,101,0,66,66,67,68,0,0,68,105,114,97,99,0,79,112,117,115,72,101,97,100,0,79,112,117,115,0,79,86,80,56,48,0,86,80,56,0,85,110,107,110,111,119,110,0,86,80,56,48,0,3,118,111,114,98,105,115,0,129,116,104,101,111,114,97,0,129,107,97,116,101,0,0,0,0,79,112,117,115,84,97,103,115,0,79,86,80,56,48,2,32,0,102,105,115,98,111,110,101,0,0,102,105,115,104,101,97,100,0,0,105,110,100,101,120,0,0,66,117,102,102,101,114,32,115,101,101,107,32,102,97,105,108,117,114,101,32,105,110,32,111,103,103,32,100,101,109,117,120,101,114,59,32,37,108,108,100,32,40,37,108,100,32,37,100,41,10,0,116,104,101,111,114,97,0,118,111,114,98,105,115,0,111,112,117,115,0,73,110,118,97,108,105,100,32,111,103,103,32,115,107,101,108,101,116,111,110,32,116,114,97,99,107,32,100,97,116,97,63,32,37,100,10,0,73,110,118,97,108,105,100,32,115,116,97,116,101,32,105,110,32,79,103,103,32,114,101,97,100,80,97,99,107,101,116,67,97,108,108,98,97,99,107,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,115,107,101,108,101,116,111,110,32,112,97,99,107,101,116,58,32,37,100,10,0,69,114,114,111,114,32,37,100,32,102,114,111,109,32,111,103,103,122,95,114,101,97,100,10,0,70,97,105,108,101,100,32,116,111,32,39,115,101,101,107,39,32,111,103,103,122,32,37,100,10,0,116,114,121,105,110,103,32,116,111,32,115,101,101,107,32,116,111,32,37,108,108,100,10,0,102,97,105,108,101,100,32,98,113,95,114,101,97,100,32,108,101,110,32,37,100,32,97,116,32,112,111,115,32,37,108,108,100,10,0,102,97,105,108,101,100,32,97,32,98,113,95,114,101,97,100,32,108,101,110,32,37,100,32,97,116,32,112,111,115,32,37,108,108,100,10,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_bitshift64Ashr\"]=_bitshift64Ashr;function _ogvjs_callback_loaded_metadata(videoCodecStr,audioCodecStr){if(videoCodecStr){Module.videoCodec=Module.Pointer_stringify(videoCodecStr)}if(audioCodecStr){Module.audioCodec=Module.Pointer_stringify(audioCodecStr)}var len=Module._ogv_demuxer_media_duration();if(len>=0){Module.duration=len}else{Module.duration=NaN}Module.loadedMetadata=true}Module[\"_i64Subtract\"]=_i64Subtract;Module[\"_i64Add\"]=_i64Add;Module[\"_memset\"]=_memset;Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _abort(){Module[\"abort\"]()}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);Module[\"_llvm_cttz_i32\"]=_llvm_cttz_i32;Module[\"___udivmoddi4\"]=___udivmoddi4;Module[\"___divdi3\"]=___divdi3;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall3(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get(),count=SYSCALLS.get();return FS.read(stream,HEAP8,buf,count)}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___lock(){}function ___unlock(){}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module[\"___udivdi3\"]=___udivdi3;Module[\"___muldsi3\"]=___muldsi3;Module[\"___muldi3\"]=___muldi3;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;function _ogvjs_callback_audio_packet(buffer,len,audioTimestamp){Module.audioPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:audioTimestamp})}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;Module[\"_memmove\"]=_memmove;function _ogvjs_callback_video_packet(buffer,len,frameTimestamp,keyframeTimestamp,isKeyframe){Module.videoPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:frameTimestamp,keyframeTimestamp:keyframeTimestamp,isKeyframe:!!isKeyframe})}Module[\"___uremdi3\"]=___uremdi3;Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_vi\":invoke_vi,\"invoke_ii\":invoke_ii,\"invoke_iiiii\":invoke_iiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"_ogvjs_callback_loaded_metadata\":_ogvjs_callback_loaded_metadata,\"___syscall3\":___syscall3,\"___lock\":___lock,\"___syscall6\":___syscall6,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"___unlock\":___unlock,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"_ogvjs_callback_audio_packet\":_ogvjs_callback_audio_packet,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"_ogvjs_callback_video_packet\":_ogvjs_callback_video_packet,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_iiii;var aa=env.invoke_vi;var ba=env.invoke_ii;var ca=env.invoke_iiiii;var da=env.invoke_iii;var ea=env.invoke_iiiiii;var fa=env._ogvjs_callback_loaded_metadata;var ga=env.___syscall3;var ha=env.___lock;var ia=env.___syscall6;var ja=env.___setErrNo;var ka=env._abort;var la=env.___unlock;var ma=env._emscripten_memcpy_big;var na=env.___syscall54;var oa=env._ogvjs_callback_audio_packet;var pa=env.___syscall140;var qa=env.___syscall146;var ra=env._ogvjs_callback_video_packet;var sa=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction za(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function Aa(){return l|0}function Ba(a){a=a|0;l=a}function Ca(a,b){a=a|0;b=b|0;l=a;m=b}function Da(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Ea(a){a=a|0;D=a}function Fa(){return D|0}function Ga(b){b=b|0;return a[(c[b>>2]|0)+5>>0]&1|0}function Ha(b){b=b|0;return a[(c[b>>2]|0)+5>>0]&2|0}function Ia(a){a=a|0;var b=0,e=0;b=c[a>>2]|0;a=Of(d[b+13>>0]|0|0,0,8)|0;e=Of(a|(d[b+12>>0]|0)|0,D|0,8)|0;a=Of(e|(d[b+11>>0]|0)|0,D|0,8)|0;e=Of(a|(d[b+10>>0]|0)|0,D|0,8)|0;a=Of(e|(d[b+9>>0]|0)|0,D|0,8)|0;e=Of(a|(d[b+8>>0]|0)|0,D|0,8)|0;a=Of(e|(d[b+7>>0]|0)|0,D|0,8)|0;return a|(d[b+6>>0]|0)|0}function Ja(a){a=a|0;var b=0;b=c[a>>2]|0;return (d[b+15>>0]|0)<<8|(d[b+14>>0]|0)|(d[b+16>>0]|0)<<16|(d[b+17>>0]|0)<<24|0}function Ka(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!a){d=-1;return d|0}Mf(a+8|0,0,352)|0;c[a+4>>2]=16384;c[a+24>>2]=1024;e=Cf(16384)|0;c[a>>2]=e;f=Cf(4096)|0;g=a+16|0;c[g>>2]=f;h=Cf(8192)|0;i=a+20|0;c[i>>2]=h;do if(!e){j=f;k=f}else{if((h|0)==0|(f|0)==0){Df(e);l=c[g>>2]|0;j=l;k=l;break}c[a+336>>2]=b;d=0;return d|0}while(0);if(j|0)Df(k);k=c[i>>2]|0;if(k|0)Df(k);Mf(a|0,0,360)|0;d=-1;return d|0}function La(a){a=a|0;var b=0;if(!a)return 0;b=c[a>>2]|0;if(b|0)Df(b);b=c[a+16>>2]|0;if(b|0)Df(b);b=c[a+20>>2]|0;if(b|0)Df(b);Mf(a|0,0,360)|0;return 0}function Ma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+24|0;e=c[d>>2]|0;if((e-b|0)>(c[a+28>>2]|0)){f=0;return f|0}if((e|0)>(2147483647-b|0)){g=c[a>>2]|0;if(g|0)Df(g);g=c[a+16>>2]|0;if(g|0)Df(g);g=c[a+20>>2]|0;if(g|0)Df(g);Mf(a|0,0,360)|0;f=-1;return f|0}g=e+b|0;b=(g|0)<2147483615?g+32|0:g;g=a+16|0;e=Ff(c[g>>2]|0,b<<2)|0;if(!e){h=c[a>>2]|0;if(h|0)Df(h);h=c[g>>2]|0;if(h|0)Df(h);h=c[a+20>>2]|0;if(h|0)Df(h);Mf(a|0,0,360)|0;f=-1;return f|0}c[g>>2]=e;e=a+20|0;h=Ff(c[e>>2]|0,b<<3)|0;if(h|0){c[e>>2]=h;c[d>>2]=b;f=0;return f|0}b=c[a>>2]|0;if(b|0)Df(b);b=c[g>>2]|0;if(b|0)Df(b);b=c[e>>2]|0;if(b|0)Df(b);Mf(a|0,0,360)|0;f=-1;return f|0}function Na(a){a=a|0;if(!a)return 0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;return 0}function Oa(a){a=a|0;var b=0;if(!a)return 0;b=c[a>>2]|0;if(b|0)Df(b);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;return 0}function Pa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=a+4|0;e=c[d>>2]|0;if((e|0)<=-1){f=0;return f|0}g=a+12|0;h=c[g>>2]|0;i=a+8|0;if(!h)j=e;else{k=(c[i>>2]|0)-h|0;c[i>>2]=k;if((k|0)>0){l=c[a>>2]|0;Xf(l|0,l+h|0,k|0)|0;m=c[d>>2]|0}else m=e;c[g>>2]=0;j=m}m=c[i>>2]|0;do if((j-m|0)<(b|0)){g=b+4096+m|0;e=c[a>>2]|0;if(!e)n=Cf(g)|0;else n=Ff(e,g)|0;if(n|0){c[a>>2]=n;c[d>>2]=g;o=n;p=c[i>>2]|0;break}g=c[a>>2]|0;if(g|0)Df(g);c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;f=0;return f|0}else{o=c[a>>2]|0;p=m}while(0);f=o+p|0;return f|0}function Qa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+4>>2]|0;if((d|0)<=-1){e=-1;return e|0}f=a+8|0;a=(c[f>>2]|0)+b|0;if((a|0)>(d|0)){e=-1;return e|0}c[f>>2]=a;e=0;return e|0}function Ra(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;f=l;l=l+16|0;g=f;h=c[b>>2]|0;i=b+12|0;j=c[i>>2]|0;k=h+j|0;m=b+8|0;n=(c[m>>2]|0)-j|0;if((c[b+4>>2]|0)<=-1){o=0;l=f;return o|0}j=b+20|0;p=c[j>>2]|0;do if(!p){if((n|0)<27){o=0;l=f;return o|0}if(De(k,2528,4)|0){q=h;r=b+24|0;break}s=k+26|0;t=a[s>>0]|0;u=(t&255)+27|0;if((n|0)<(u|0)){o=0;l=f;return o|0}if(t<<24>>24){t=b+24|0;v=c[t>>2]|0;w=0;do{v=v+(d[k+(w+27)>>0]|0)|0;c[t>>2]=v;w=w+1|0}while((w|0)<(d[s>>0]|0|0))}c[j>>2]=u;x=u;y=11}else{x=p;y=11}while(0);do if((y|0)==11){p=b+24|0;if((x+(c[p>>2]|0)|0)>(n|0)){o=0;l=f;return o|0}h=k+22|0;s=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;c[g>>2]=s;a[h>>0]=0;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;w=c[j>>2]|0;v=k+w|0;t=c[p>>2]|0;z=k+23|0;A=k+24|0;B=k+25|0;a[h>>0]=0;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;if((w|0)>0){C=0;D=0;while(1){E=c[8+(((d[k+D>>0]|0)^C>>>24)<<2)>>2]^C<<8;D=D+1|0;if((D|0)==(w|0)){F=E;break}else C=E}}else F=0;C=F>>>24;if((t|0)>0){w=F;D=0;u=C;while(1){E=c[8+(((d[v+D>>0]|0)^u)<<2)>>2]^w<<8;D=D+1|0;G=E>>>24;if((D|0)==(t|0)){H=E;I=G;break}else{w=E;u=G}}}else{H=F;I=C}a[h>>0]=H;a[z>>0]=H>>>8;a[A>>0]=H>>>16;a[B>>0]=I;if(De(g,h,4)|0){a[h>>0]=s;a[h+1>>0]=s>>8;a[h+2>>0]=s>>16;a[h+3>>0]=s>>24;q=c[b>>2]|0;r=p;break}u=c[i>>2]|0;w=(c[b>>2]|0)+u|0;t=c[j>>2]|0;D=c[p>>2]|0;if(e|0){c[e>>2]=w;c[e+4>>2]=t;c[e+8>>2]=w+t;c[e+12>>2]=D}c[b+16>>2]=0;w=D+t|0;c[i>>2]=w+u;c[j>>2]=0;c[p>>2]=0;o=w;l=f;return o|0}while(0);c[j>>2]=0;c[r>>2]=0;r=Pe(k+1|0,79,n+-1|0)|0;if(!r)J=q+(c[m>>2]|0)|0;else J=r;r=J;c[i>>2]=r-q;o=k-r|0;l=f;return o|0}function Sa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0;f=c[e>>2]|0;g=c[e+8>>2]|0;h=c[e+12>>2]|0;e=a[f+4>>0]|0;i=a[f+5>>0]|0;j=i&1;k=i&2;l=i&4;i=Of(d[f+13>>0]|0|0,0,8)|0;m=Of(i|(d[f+12>>0]|0)|0,D|0,8)|0;i=Of(m|(d[f+11>>0]|0)|0,D|0,8)|0;m=Of(i|(d[f+10>>0]|0)|0,D|0,8)|0;i=Of(m|(d[f+9>>0]|0)|0,D|0,8)|0;m=Of(i|(d[f+8>>0]|0)|0,D|0,8)|0;i=Of(m|(d[f+7>>0]|0)|0,D|0,8)|0;m=D;n=i|(d[f+6>>0]|0);i=(d[f+15>>0]|0)<<8|(d[f+14>>0]|0)|(d[f+16>>0]|0)<<16|(d[f+17>>0]|0)<<24;o=(d[f+19>>0]|0)<<8|(d[f+18>>0]|0)|(d[f+20>>0]|0)<<16|(d[f+21>>0]|0)<<24;p=a[f+26>>0]|0;q=p&255;if(!b){r=-1;return r|0}s=c[b>>2]|0;if(!s){r=-1;return r|0}t=b+36|0;u=c[t>>2]|0;v=b+12|0;w=c[v>>2]|0;if(w|0){x=b+8|0;y=(c[x>>2]|0)-w|0;c[x>>2]=y;if(y|0)Xf(s|0,s+w|0,y|0)|0;c[v>>2]=0}if(u|0){v=b+28|0;y=c[v>>2]|0;w=y-u|0;if(!w)z=y;else{y=c[b+16>>2]|0;Xf(y|0,y+(u<<2)|0,w<<2|0)|0;w=c[b+20>>2]|0;Xf(w|0,w+(u<<3)|0,(c[v>>2]|0)-u<<3|0)|0;z=c[v>>2]|0}c[v>>2]=z-u;z=b+32|0;c[z>>2]=(c[z>>2]|0)-u;c[t>>2]=0}if(e<<24>>24?1:(i|0)!=(c[b+336>>2]|0)){r=-1;return r|0}if(Ma(b,q+1|0)|0){r=-1;return r|0}i=b+340|0;e=c[i>>2]|0;if((o|0)!=(e|0)){t=b+32|0;u=c[t>>2]|0;z=b+28|0;v=c[z>>2]|0;if((u|0)<(v|0)){w=c[b+16>>2]|0;y=b+8|0;s=u;x=c[y>>2]|0;do{x=x-(c[w+(s<<2)>>2]&255)|0;s=s+1|0}while((s|0)<(v|0));c[y>>2]=x}c[z>>2]=u;if((e|0)!=-1){e=c[b+16>>2]|0;x=u+1|0;c[z>>2]=x;c[e+(u<<2)>>2]=1024;c[t>>2]=x}}a:do if(j<<24>>24){x=c[b+28>>2]|0;if((x|0)>=1?(c[(c[b+16>>2]|0)+(x+-1<<2)>>2]|0)!=1024:0){A=g;B=h;C=k;E=0;break}if(!(p<<24>>24)){A=g;B=h;C=0;E=0}else{x=g;t=h;u=0;while(1){e=a[f+(u+27)>>0]|0;z=e&255;y=x+z|0;v=t-z|0;z=e<<24>>24==-1;e=((z^1)&1)+u|0;if(!z){A=y;B=v;C=0;E=e;break a}z=e+1|0;if((z|0)<(q|0)){x=y;t=v;u=z}else{A=y;B=v;C=0;E=z;break}}}}else{A=g;B=h;C=k;E=0}while(0);if(B|0){k=b+4|0;h=c[k>>2]|0;g=b+8|0;p=c[g>>2]|0;do if((h-B|0)>(p|0)){F=c[b>>2]|0;G=p}else{if((h|0)>(2147483647-B|0)){j=c[b>>2]|0;if(j|0)Df(j);j=c[b+16>>2]|0;if(j|0)Df(j);j=c[b+20>>2]|0;if(j|0)Df(j);Mf(b|0,0,360)|0;r=-1;return r|0}j=h+B|0;u=(j|0)<2147482623?j+1024|0:j;j=Ff(c[b>>2]|0,u)|0;if(j|0){c[k>>2]=u;c[b>>2]=j;F=j;G=c[g>>2]|0;break}j=c[b>>2]|0;if(j|0)Df(j);j=c[b+16>>2]|0;if(j|0)Df(j);j=c[b+20>>2]|0;if(j|0)Df(j);Mf(b|0,0,360)|0;r=-1;return r|0}while(0);Wf(F+G|0,A|0,B|0)|0;c[g>>2]=(c[g>>2]|0)+B}B=b+16|0;g=b+28|0;A=b+20|0;G=b+32|0;F=C;C=-1;k=E;b:while(1){E=F;h=k;while(1){if((h|0)>=(q|0))break b;p=a[f+(h+27)>>0]|0;j=p&255;H=c[g>>2]|0;u=(c[B>>2]|0)+(H<<2)|0;c[u>>2]=j;t=(c[A>>2]|0)+(H<<3)|0;c[t>>2]=-1;c[t+4>>2]=-1;if(E|0)c[u>>2]=j|256;I=H+1|0;c[g>>2]=I;h=h+1|0;if(p<<24>>24!=-1)break;else E=0}c[G>>2]=I;F=0;C=H;k=h}if((C|0)!=-1){k=(c[A>>2]|0)+(C<<3)|0;c[k>>2]=n;c[k+4>>2]=m}if(l<<24>>24?(c[b+328>>2]=1,b=c[g>>2]|0,(b|0)>0):0){g=(c[B>>2]|0)+(b+-1<<2)|0;c[g>>2]=c[g>>2]|512}c[i>>2]=o+1;r=0;return r|0}function Ta(a){a=a|0;var b=0,d=0;if((c[a+4>>2]|0)<=-1){b=-1;return b|0}d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;b=0;return b|0}function Ua(a){a=a|0;var b=0,d=0;if(!a){b=-1;return b|0}if(!(c[a>>2]|0)){b=-1;return b|0}c[a+8>>2]=0;c[a+12>>2]=0;c[a+28>>2]=0;c[a+32>>2]=0;c[a+36>>2]=0;c[a+324>>2]=0;c[a+328>>2]=0;c[a+332>>2]=0;c[a+340>>2]=-1;d=a+344|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;b=0;return b|0}function Va(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;if(!a){d=0;return d|0}e=c[a>>2]|0;if(!e){d=0;return d|0}f=a+36|0;g=c[f>>2]|0;if((c[a+32>>2]|0)<=(g|0)){d=0;return d|0}h=c[a+16>>2]|0;i=c[h+(g<<2)>>2]|0;if(i&1024|0){c[f>>2]=g+1;j=a+344|0;k=j;l=Lf(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;k=j;c[k>>2]=l;c[k+4>>2]=D;d=-1;return d|0}k=(b|0)==0;l=i&255;j=i&512;m=i&256;if((l|0)==255){i=255;n=j;o=g;while(1){p=o+1|0;q=c[h+(p<<2)>>2]|0;r=q&255;s=(q&512|0)==0?n:512;q=r+i|0;if((r|0)==255){i=q;n=s;o=p}else{t=q;u=s;v=p;break}}}else{t=l;u=j;v=g}if(k){k=a+12|0;g=a+344|0;j=g;w=c[k>>2]|0;x=c[j>>2]|0;y=c[j+4>>2]|0;z=k;A=g}else{c[b+12>>2]=u;c[b+8>>2]=m;m=a+12|0;u=c[m>>2]|0;c[b>>2]=e+u;e=a+344|0;g=e;k=c[g>>2]|0;j=c[g+4>>2]|0;g=b+24|0;c[g>>2]=k;c[g+4>>2]=j;g=(c[a+20>>2]|0)+(v<<3)|0;a=c[g+4>>2]|0;l=b+16|0;c[l>>2]=c[g>>2];c[l+4>>2]=a;c[b+4>>2]=t;w=u;x=k;y=j;z=m;A=e}c[z>>2]=w+t;c[f>>2]=v+1;v=Lf(x|0,y|0,1,0)|0;y=A;c[y>>2]=v;c[y+4>>2]=D;d=1;return d|0}function Wa(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;i=l;l=l+48|0;j=i+40|0;k=i+36|0;m=i+32|0;n=i+28|0;o=i+24|0;p=i+16|0;q=i+12|0;r=i+8|0;s=i+4|0;t=i+44|0;u=i;c[k>>2]=b;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[i+20>>2]=h;c[p>>2]=c[n>>2];a[t>>0]=0;if((c[o>>2]|0)<41){c[j>>2]=0;v=c[j>>2]|0;l=i;return v|0}c[q>>2]=(d[(c[p>>2]|0)+7>>0]<<16)+(d[(c[p>>2]|0)+8>>0]<<8)+(d[(c[p>>2]|0)+9>>0]|0);c[r>>2]=tb((c[p>>2]|0)+22|0)|0;c[s>>2]=tb((c[p>>2]|0)+26|0)|0;if(!(c[r>>2]|0))c[r>>2]=1;a[t>>0]=(d[(c[p>>2]|0)+40>>0]&3)<<3;a[t>>0]=a[t>>0]|(d[(c[p>>2]|0)+41>>0]&224)>>5;c[u>>2]=a[t>>0];t=c[k>>2]|0;p=c[m>>2]|0;o=c[r>>2]|0;r=c[s>>2]|0;s=Uf(1e3,0,r|0,((r|0)<0)<<31>>31|0)|0;ub(t,p,o,((o|0)<0)<<31>>31,s,D)|0;vb(c[k>>2]|0,c[m>>2]|0,c[u>>2]|0)|0;if((c[q>>2]|0)<197120)Jb(c[k>>2]|0,c[m>>2]|0,-1,-1)|0;wb(c[k>>2]|0,c[m>>2]|0,3)|0;c[j>>2]=1;v=c[j>>2]|0;l=i;return v|0}function Xa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=l;l=l+48|0;i=h+8|0;j=h;k=h+32|0;m=h+28|0;n=h+24|0;o=h+20|0;p=h+36|0;q=h+16|0;r=j;c[r>>2]=b;c[r+4>>2]=e;c[k>>2]=f;c[m>>2]=g;if(!(c[(c[m>>2]|0)+4>>2]|0))s=64;else s=d[c[c[m>>2]>>2]>>0]|0;a[p>>0]=s;c[q>>2]=c[(c[k>>2]|0)+504>>2];a:do if(!((d[p>>0]|0)&128|0)){s=j;m=c[s+4>>2]|0;if((m|0)>-1|(m|0)==-1&(c[s>>2]|0)>>>0>4294967295){c[c[q>>2]>>2]=1;s=j;m=c[s+4>>2]|0;g=i;c[g>>2]=c[s>>2];c[g+4>>2]=m;break}m=(c[k>>2]|0)+488|0;g=c[q>>2]|0;if((c[m>>2]|0)==-1?(c[m+4>>2]|0)==-1:0){c[g>>2]=1;m=i;c[m>>2]=-1;c[m+4>>2]=-1;break}if(!(c[g>>2]|0)){c[c[q>>2]>>2]=1;g=i;c[g>>2]=-1;c[g+4>>2]=-1;break}g=c[k>>2]|0;if((d[p>>0]|0)&64|0){m=g+488|0;s=Lf(c[m>>2]|0,c[m+4>>2]|0,1,0)|0;m=i;c[m>>2]=s;c[m+4>>2]=D;break}else{c[o>>2]=c[g+408>>2];g=(c[k>>2]|0)+488|0;m=Jf(c[g>>2]|0,c[g+4>>2]|0,c[o>>2]|0)|0;c[n>>2]=m;m=(c[k>>2]|0)+488|0;g=(1<<c[o>>2])-1|0;s=Lf(c[m>>2]&g|0,c[m+4>>2]&((g|0)<0)<<31>>31|0,1,0)|0;g=c[n>>2]|0;m=Lf(g|0,((g|0)<0)<<31>>31|0,s|0,D|0)|0;c[n>>2]=m;m=c[n>>2]|0;s=Of(m|0,((m|0)<0)<<31>>31|0,c[o>>2]|0)|0;m=i;c[m>>2]=s;c[m+4>>2]=D;break}}else{do if(!(c[q>>2]|0)){m=Cf(4)|0;c[(c[k>>2]|0)+504>>2]=m;if(!(c[(c[k>>2]|0)+504>>2]|0)){m=i;c[m>>2]=-1;c[m+4>>2]=-1;break a}else{c[q>>2]=c[(c[k>>2]|0)+504>>2];break}}while(0);c[c[q>>2]>>2]=0;m=i;c[m>>2]=0;c[m+4>>2]=0}while(0);q=i;D=c[q+4>>2]|0;l=h;return c[q>>2]|0}function Ya(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=l;l=l+48|0;h=g+8|0;i=g;j=g+32|0;k=g+20|0;m=g+16|0;n=i;c[n>>2]=a;c[n+4>>2]=b;c[j>>2]=d;c[g+28>>2]=e;c[g+24>>2]=f;f=i;e=Jf(c[f>>2]|0,c[f+4>>2]|0,c[(c[j>>2]|0)+408>>2]|0)|0;c[k>>2]=e;e=i;i=c[k>>2]<<c[(c[j>>2]|0)+408>>2];f=Kf(c[e>>2]|0,c[e+4>>2]|0,i|0,((i|0)<0)<<31>>31|0)|0;c[m>>2]=f;f=c[k>>2]|0;if(!(c[m>>2]|0)){k=(f-60<<c[(c[j>>2]|0)+408>>2])+59|0;i=h;c[i>>2]=k;c[i+4>>2]=((k|0)<0)<<31>>31;o=h;p=o;q=c[p>>2]|0;r=o+4|0;s=r;t=c[s>>2]|0;D=t;l=g;return q|0}else{k=Of(f|0,((f|0)<0)<<31>>31|0,c[(c[j>>2]|0)+408>>2]|0)|0;j=(c[m>>2]|0)-1|0;m=Lf(k|0,D|0,j|0,((j|0)<0)<<31>>31|0)|0;j=h;c[j>>2]=m;c[j+4>>2]=D;o=h;p=o;q=c[p>>2]|0;r=o+4|0;s=r;t=c[s>>2]|0;D=t;l=g;return q|0}return 0}function Za(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;g=l;l=l+48|0;h=g+32|0;i=g+28|0;j=g+24|0;k=g+20|0;m=g+16|0;n=g+8|0;o=g;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[g+12>>2]=f;c[n>>2]=c[k>>2];k=o;c[k>>2]=0;c[k+4>>2]=0;if((c[m>>2]|0)<30){c[h>>2]=0;p=c[h>>2]|0;l=g;return p|0}else{m=Qb((c[n>>2]|0)+12|0)|0;n=o;c[n>>2]=m;c[n+4>>2]=((m|0)<0)<<31>>31;m=o;ub(c[i>>2]|0,c[j>>2]|0,c[m>>2]|0,c[m+4>>2]|0,1e3,0)|0;Tb(c[i>>2]|0,c[j>>2]|0,2)|0;wb(c[i>>2]|0,c[j>>2]|0,3)|0;c[h>>2]=1;p=c[h>>2]|0;l=g;return p|0}return 0}function _a(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;g=l;l=l+96|0;h=g+16|0;i=g+8|0;j=g+80|0;k=g+76|0;m=g+72|0;n=g+68|0;o=g+64|0;p=g+60|0;q=g+56|0;r=g+52|0;s=g+48|0;t=g+44|0;u=g+40|0;v=g+36|0;w=g+32|0;x=g+28|0;y=g+24|0;z=g;A=i;c[A>>2]=a;c[A+4>>2]=b;c[j>>2]=e;c[k>>2]=f;f=c[c[k>>2]>>2]|0;if(!(c[(c[j>>2]|0)+504>>2]|0)){c[p>>2]=1<<((d[f+28>>0]|0)>>4);c[o>>2]=1<<((d[(c[c[k>>2]>>2]|0)+28>>0]|0)&15);e=Cf(44)|0;c[(c[j>>2]|0)+504>>2]=e;if(!(c[(c[j>>2]|0)+504>>2]|0)){e=h;c[e>>2]=-1;c[e+4>>2]=-1;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}else{c[m>>2]=c[(c[j>>2]|0)+504>>2];c[(c[m>>2]|0)+12>>2]=c[p>>2]>>1;c[(c[m>>2]|0)+8>>2]=((c[p>>2]>>2)*3|0)-(c[o>>2]>>2);c[(c[m>>2]|0)+4>>2]=(c[p>>2]>>2)+(c[o>>2]>>2);c[c[m>>2]>>2]=c[(c[m>>2]|0)+12>>2];c[(c[m>>2]|0)+20>>2]=c[o>>2];c[(c[m>>2]|0)+24>>2]=c[p>>2];c[(c[m>>2]|0)+16>>2]=c[o>>2]>>1;c[(c[m>>2]|0)+28>>2]=0;o=h;c[o>>2]=0;c[o+4>>2]=0;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}}if(!((d[f>>0]|0)&1)){c[m>>2]=c[(c[j>>2]|0)+504>>2];c[x>>2]=(d[c[c[k>>2]>>2]>>0]|0)>>1&(1<<c[(c[m>>2]|0)+36>>2])-1;c[y>>2]=c[(c[m>>2]|0)+40+(c[x>>2]<<2)>>2];x=i;f=c[x+4>>2]|0;if((f|0)>-1|(f|0)==-1&(c[x>>2]|0)>>>0>4294967295?(x=(c[j>>2]|0)+488|0,(c[x>>2]|0)==-1?(c[x+4>>2]|0)==-1:0):0){c[(c[m>>2]|0)+28>>2]=1;c[(c[m>>2]|0)+32>>2]=c[y>>2];x=i;i=c[x+4>>2]|0;f=h;c[f>>2]=c[x>>2];c[f+4>>2]=i;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}if(!(c[(c[m>>2]|0)+28>>2]|0)){c[(c[m>>2]|0)+28>>2]=1;c[(c[m>>2]|0)+32>>2]=c[y>>2];i=h;c[i>>2]=-1;c[i+4>>2]=-1;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}i=(c[j>>2]|0)+488|0;if((c[i>>2]|0)==-1?(c[i+4>>2]|0)==-1:0){c[(c[m>>2]|0)+32>>2]=c[y>>2];i=h;c[i>>2]=-1;c[i+4>>2]=-1;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}else{i=(c[j>>2]|0)+488|0;f=c[m>>2]|0;x=c[m>>2]|0;o=((c[(c[(c[m>>2]|0)+32>>2]|0?f+24|0:f+20|0)>>2]|0)+(c[(c[y>>2]|0?x+24|0:x+20|0)>>2]|0)|0)/4|0;x=Lf(c[i>>2]|0,c[i+4>>2]|0,o|0,((o|0)<0)<<31>>31|0)|0;o=z;c[o>>2]=x;c[o+4>>2]=D;c[(c[m>>2]|0)+32>>2]=c[y>>2];y=z;z=c[y+4>>2]|0;o=h;c[o>>2]=c[y>>2];c[o+4>>2]=z;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}}a:do if((d[c[c[k>>2]>>2]>>0]|0|0)==5){c[q>>2]=(c[c[k>>2]>>2]|0)+((c[(c[k>>2]|0)+4>>2]|0)-1);c[s>>2]=0;c[r>>2]=8;while(1){z=(c[r>>2]|0)+-1|0;c[r>>2]=z;if(!((1<<z&(d[c[q>>2]>>0]|0)|0)!=0^1))break;if(c[r>>2]|0)continue;c[r>>2]=8;c[q>>2]=(c[q>>2]|0)+-1}while(1){c[r>>2]=((c[r>>2]|0)+7|0)%8|0;if((c[r>>2]|0)==7)c[q>>2]=(c[q>>2]|0)+-1;if((d[(c[q>>2]|0)+-5>>0]|0)&~((1<<(c[r>>2]|0)+1)-1)|0)break;if(d[(c[q>>2]|0)+-4>>0]|0|0)break;if(d[(c[q>>2]|0)+-3>>0]|0|0)break;if(d[(c[q>>2]|0)+-2>>0]|0|0)break;if((d[(c[q>>2]|0)+-1>>0]|0)&(1<<(c[r>>2]|0)+1)-1|0)break;c[s>>2]=(c[s>>2]|0)+1;c[q>>2]=(c[q>>2]|0)+-5}c[n>>2]=0;while(1){if((c[n>>2]|0)>=2)break;z=d[c[q>>2]>>0]|0;o=c[r>>2]|0;if((c[r>>2]|0)>4)c[t>>2]=z>>o-5&63;else{c[t>>2]=z&(1<<o+1)-1;c[t>>2]=c[t>>2]<<5-(c[r>>2]|0);c[t>>2]=c[t>>2]|((d[(c[q>>2]|0)+-1>>0]|0)&~((1<<(c[r>>2]|0)+3)-1))>>(c[r>>2]|0)+3}c[t>>2]=(c[t>>2]|0)+1;if((c[t>>2]|0)==(c[s>>2]|0))break;c[r>>2]=((c[r>>2]|0)+1|0)%8|0;if(!(c[r>>2]|0))c[q>>2]=(c[q>>2]|0)+1;c[q>>2]=(c[q>>2]|0)+5;c[s>>2]=(c[s>>2]|0)-1;c[n>>2]=(c[n>>2]|0)+1}c[w>>2]=44+((c[s>>2]|0)-1<<2);if((c[w>>2]|0)>>>0<44){o=h;c[o>>2]=-1;c[o+4>>2]=-1;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}c[m>>2]=Ff(c[(c[j>>2]|0)+504>>2]|0,c[w>>2]|0)|0;if(!(c[m>>2]|0)){o=h;c[o>>2]=-1;c[o+4>>2]=-1;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}c[(c[j>>2]|0)+504>>2]=c[m>>2];c[v>>2]=-1;do{o=(c[v>>2]|0)+1|0;c[v>>2]=o}while((1<<o|0)<(c[s>>2]|0));c[(c[m>>2]|0)+36>>2]=c[v>>2];c[u>>2]=(c[m>>2]|0)+40;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[s>>2]|0))break a;c[r>>2]=((c[r>>2]|0)+1|0)%8|0;if(!(c[r>>2]|0))c[q>>2]=(c[q>>2]|0)+1;o=(d[c[q>>2]>>0]|0)>>c[r>>2]&1;z=c[u>>2]|0;c[u>>2]=z+4;c[z>>2]=o;c[q>>2]=(c[q>>2]|0)+5;c[v>>2]=(c[v>>2]|0)+1}}while(0);v=h;c[v>>2]=0;c[v+4>>2]=0;B=h;C=B;E=c[C>>2]|0;F=B+4|0;G=F;H=c[G>>2]|0;D=H;l=g;return E|0}function $a(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;h=l;l=l+64|0;i=h+16|0;j=h+8|0;k=h+48|0;m=h+44|0;n=h+40|0;o=h+36|0;p=h+32|0;q=h+28|0;r=h+24|0;s=h;t=j;c[t>>2]=a;c[t+4>>2]=b;c[k>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=c[(c[k>>2]|0)+504>>2];c[p>>2]=(d[c[c[m>>2]>>2]>>0]|0)>>1&(1<<c[(c[o>>2]|0)+36>>2])-1;m=c[o>>2]|0;c[q>>2]=c[(c[(c[o>>2]|0)+40+(c[p>>2]<<2)>>2]|0?m+24|0:m+20|0)>>2];c[p>>2]=(d[c[c[n>>2]>>2]>>0]|0)>>1&(1<<c[(c[o>>2]|0)+36>>2])-1;n=c[o>>2]|0;c[r>>2]=c[(c[(c[o>>2]|0)+40+(c[p>>2]<<2)>>2]|0?n+24|0:n+20|0)>>2];n=j;j=((c[q>>2]|0)+(c[r>>2]|0)|0)/4|0;r=Kf(c[n>>2]|0,c[n+4>>2]|0,j|0,((j|0)<0)<<31>>31|0)|0;j=s;c[j>>2]=r;c[j+4>>2]=D;if((c[s+4>>2]|0)<0){j=i;c[j>>2]=0;c[j+4>>2]=0;u=i;v=u;w=c[v>>2]|0;x=u+4|0;y=x;z=c[y>>2]|0;D=z;l=h;return w|0}else{j=s;s=c[j+4>>2]|0;r=i;c[r>>2]=c[j>>2];c[r+4>>2]=s;u=i;v=u;w=c[v>>2]|0;x=u+4|0;y=x;z=c[y>>2]|0;D=z;l=h;return w|0}return 0}function ab(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+48|0;h=g+36|0;i=g+32|0;j=g+28|0;k=g+24|0;m=g+20|0;n=g+12|0;o=g;p=g+8|0;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[g+16>>2]=f;c[n>>2]=c[k>>2];k=o;c[k>>2]=0;c[k+4>>2]=0;if((c[m>>2]|0)<68){c[h>>2]=0;q=c[h>>2]|0;l=g;return q|0}else{m=Qb((c[n>>2]|0)+36|0)|0;k=o;c[k>>2]=m;c[k+4>>2]=((m|0)<0)<<31>>31;m=o;ub(c[i>>2]|0,c[j>>2]|0,c[m>>2]|0,c[m+4>>2]|0,1e3,0)|0;Tb(c[i>>2]|0,c[j>>2]|0,3)|0;m=Qb((c[n>>2]|0)+68|0)|0;n=Lf(m|0,((m|0)<0)<<31>>31|0,2,0)|0;c[p>>2]=n;wb(c[i>>2]|0,c[j>>2]|0,c[p>>2]|0)|0;c[h>>2]=1;q=c[h>>2]|0;l=g;return q|0}return 0}function bb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;f=l;l=l+32|0;g=f+8|0;h=f;i=f+24|0;j=f+20|0;k=f+16|0;m=h;c[m>>2]=a;c[m+4>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=c[(c[i>>2]|0)+504>>2];do if(!(c[(c[i>>2]|0)+504>>2]|0)){e=Cf(12)|0;c[(c[i>>2]|0)+504>>2]=e;if(!(c[(c[i>>2]|0)+504>>2]|0)){e=g;c[e>>2]=-1;c[e+4>>2]=-1;break}else{c[k>>2]=c[(c[i>>2]|0)+504>>2];c[(c[k>>2]|0)+8>>2]=0;e=S(c[(c[c[j>>2]>>2]|0)+64>>2]|0,c[(c[c[j>>2]>>2]|0)+56>>2]|0)|0;c[(c[k>>2]|0)+4>>2]=e;c[c[k>>2]>>2]=1;e=g;c[e>>2]=0;c[e+4>>2]=0;break}}else{e=c[k>>2]|0;if((c[c[k>>2]>>2]|0)<2)c[e>>2]=(c[e>>2]|0)+1;else c[e+8>>2]=1;e=h;d=c[e+4>>2]|0;if((d|0)>-1|(d|0)==-1&(c[e>>2]|0)>>>0>4294967295){e=h;d=c[e+4>>2]|0;b=g;c[b>>2]=c[e>>2];c[b+4>>2]=d;break}if(!(c[(c[k>>2]|0)+8>>2]|0)){d=g;c[d>>2]=0;c[d+4>>2]=0;break}d=(c[i>>2]|0)+488|0;b=c[d+4>>2]|0;if((b|0)>0|(b|0)==0&(c[d>>2]|0)>>>0>0){d=(c[i>>2]|0)+488|0;b=c[(c[k>>2]|0)+4>>2]|0;e=Lf(c[d>>2]|0,c[d+4>>2]|0,b|0,((b|0)<0)<<31>>31|0)|0;b=g;c[b>>2]=e;c[b+4>>2]=D;break}else{b=g;c[b>>2]=-1;c[b+4>>2]=-1;break}}while(0);k=g;D=c[k+4>>2]|0;l=f;return c[k>>2]|0}function cb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;g=l;l=l+48|0;h=g+32|0;i=g+28|0;j=g+24|0;k=g+20|0;m=g+16|0;n=g+8|0;o=g;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[g+12>>2]=f;c[n>>2]=c[k>>2];if((c[m>>2]|0)<28){c[h>>2]=0;p=c[h>>2]|0;l=g;return p|0}else{m=tb((c[n>>2]|0)+16|0)|0;n=o;c[n>>2]=m;c[n+4>>2]=((m|0)<0)<<31>>31;m=o;ub(c[i>>2]|0,c[j>>2]|0,c[m>>2]|0,c[m+4>>2]|0,1e3,0)|0;wb(c[i>>2]|0,c[j>>2]|0,3)|0;c[h>>2]=1;p=c[h>>2]|0;l=g;return p|0}return 0}function db(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=l;l=l+48|0;i=h+44|0;j=h+40|0;k=h+36|0;m=h+32|0;n=h+28|0;o=h+20|0;p=h+8|0;q=h;r=h+16|0;c[j>>2]=a;c[k>>2]=b;c[m>>2]=e;c[n>>2]=f;c[h+24>>2]=g;c[o>>2]=c[m>>2];m=p;c[m>>2]=0;c[m+4>>2]=0;m=q;c[m>>2]=0;c[m+4>>2]=0;if((c[n>>2]|0)<28){c[i>>2]=0;s=c[i>>2]|0;l=h;return s|0}m=Rb((c[o>>2]|0)+12|0)|0;g=p;c[g>>2]=m;c[g+4>>2]=D;g=Rb((c[o>>2]|0)+20|0)|0;m=q;c[m>>2]=g;c[m+4>>2]=D;if((c[n>>2]|0)>28)c[r>>2]=d[(c[o>>2]|0)+28>>0];else c[r>>2]=0;o=c[j>>2]|0;n=c[k>>2]|0;m=p;p=c[m>>2]|0;g=c[m+4>>2]|0;m=q;q=Uf(1e3,0,c[m>>2]|0,c[m+4>>2]|0)|0;ub(o,n,p,g,q,D)|0;vb(c[j>>2]|0,c[k>>2]|0,c[r>>2]|0)|0;wb(c[j>>2]|0,c[k>>2]|0,3)|0;c[i>>2]=1;s=c[i>>2]|0;l=h;return s|0}function eb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+32|0;h=g+16|0;i=g+12|0;c[h>>2]=a;c[i>>2]=b;c[g+8>>2]=d;c[g+4>>2]=e;c[g>>2]=f;ub(c[h>>2]|0,c[i>>2]|0,0,0,1,0)|0;l=g;return 1}function fb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+32|0;h=g+16|0;i=g+12|0;c[h>>2]=a;c[i>>2]=b;c[g+8>>2]=d;c[g+4>>2]=e;c[g>>2]=f;ub(c[h>>2]|0,c[i>>2]|0,0,0,1,0)|0;wb(c[h>>2]|0,c[i>>2]|0,1)|0;l=g;return 1}function gb(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;h=l;l=l+32|0;i=h+28|0;j=h+24|0;k=h+20|0;m=h+8|0;n=h;c[i>>2]=a;c[j>>2]=b;c[k>>2]=e;c[h+16>>2]=f;c[h+12>>2]=g;c[m>>2]=c[k>>2];k=n;c[k>>2]=0;c[k+4>>2]=0;k=(d[(c[m>>2]|0)+14>>0]|0)<<12;g=(d[(c[m>>2]|0)+15>>0]|0)<<4;f=(d[(c[m>>2]|0)+16>>0]|0)>>4&15;m=n;c[m>>2]=k|g|f;c[m+4>>2]=((k|0)<0)<<31>>31|((g|0)<0)<<31>>31|((f|0)<0)<<31>>31;f=n;ub(c[i>>2]|0,c[j>>2]|0,c[f>>2]|0,c[f+4>>2]|0,1e3,0)|0;wb(c[i>>2]|0,c[j>>2]|0,3)|0;l=h;return 1}function hb(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=l;l=l+48|0;i=h+8|0;j=h;k=h+28|0;m=h+24|0;n=h+20|0;o=h+32|0;p=h+16|0;q=j;c[q>>2]=b;c[q+4>>2]=e;c[k>>2]=f;c[m>>2]=g;do if(c[(c[k>>2]|0)+504>>2]|0){c[n>>2]=c[(c[k>>2]|0)+504>>2];if((d[c[c[m>>2]>>2]>>0]|0|0)==255)c[(c[n>>2]|0)+8>>2]=1;g=j;if((((c[g>>2]|0)==-1?(c[g+4>>2]|0)==-1:0)?(d[c[c[m>>2]>>2]>>0]|0|0)==255:0)?(c[(c[m>>2]|0)+4>>2]|0)>2:0){a[o>>0]=((d[(c[c[m>>2]>>2]|0)+2>>0]|0)&240)>>4;do switch(d[o>>0]|0|0){case 0:{c[p>>2]=-1;break}case 1:{c[p>>2]=192;break}case 2:{c[p>>2]=576;break}case 3:{c[p>>2]=1152;break}case 4:{c[p>>2]=2304;break}case 5:{c[p>>2]=4608;break}case 6:{c[p>>2]=-1;break}case 7:{c[p>>2]=-1;break}case 8:{c[p>>2]=256;break}case 9:{c[p>>2]=512;break}case 10:{c[p>>2]=1024;break}case 11:{c[p>>2]=2048;break}case 12:{c[p>>2]=4096;break}case 13:{c[p>>2]=8192;break}case 14:{c[p>>2]=16384;break}case 15:{c[p>>2]=32768;break}default:c[p>>2]=-1}while(0);if((c[p>>2]|0)==-1)break;g=c[n>>2]|0;f=c[p>>2]|0;e=Lf(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;f=j;c[f>>2]=e;c[f+4>>2]=D;break}f=j;if(((c[f>>2]|0)==-1?(c[f+4>>2]|0)==-1:0)?(c[(c[n>>2]|0)+8>>2]|0)==0:0){f=j;c[f>>2]=0;c[f+4>>2]=0}}else{f=Cf(16)|0;c[(c[k>>2]|0)+504>>2]=f;if(c[(c[k>>2]|0)+504>>2]|0){c[n>>2]=c[(c[k>>2]|0)+504>>2];f=c[n>>2]|0;c[f>>2]=0;c[f+4>>2]=0;c[(c[n>>2]|0)+8>>2]=0;break}f=i;c[f>>2]=-1;c[f+4>>2]=-1;r=i;s=r;t=c[s>>2]|0;u=r+4|0;v=u;w=c[v>>2]|0;D=w;l=h;return t|0}while(0);k=j;p=c[k+4>>2]|0;o=c[n>>2]|0;c[o>>2]=c[k>>2];c[o+4>>2]=p;p=j;j=c[p+4>>2]|0;o=i;c[o>>2]=c[p>>2];c[o+4>>2]=j;r=i;s=r;t=c[s>>2]|0;u=r+4|0;v=u;w=c[v>>2]|0;D=w;l=h;return t|0}function ib(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;h=l;l=l+48|0;i=h+36|0;j=h+32|0;k=h+28|0;m=h+24|0;n=h+20|0;o=h+12|0;p=h;q=h+8|0;c[j>>2]=a;c[k>>2]=b;c[m>>2]=e;c[n>>2]=f;c[h+16>>2]=g;c[o>>2]=c[m>>2];m=p;c[m>>2]=0;c[m+4>>2]=0;if((c[n>>2]|0)<51){c[i>>2]=0;r=c[i>>2]|0;l=h;return r|0}else{n=(d[(c[o>>2]|0)+27>>0]|0)<<12;m=(d[(c[o>>2]|0)+28>>0]|0)<<4;g=(d[(c[o>>2]|0)+29>>0]|0)>>4&15;f=p;c[f>>2]=n|m|g;c[f+4>>2]=((n|0)<0)<<31>>31|((m|0)<0)<<31>>31|((g|0)<0)<<31>>31;g=p;ub(c[j>>2]|0,c[k>>2]|0,c[g>>2]|0,c[g+4>>2]|0,1e3,0)|0;c[q>>2]=(Sb((c[o>>2]|0)+7|0)|0)&65535;wb(c[j>>2]|0,c[k>>2]|0,c[q>>2]|0)|0;c[i>>2]=1;r=c[i>>2]|0;l=h;return r|0}return 0}function jb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+48|0;h=g+40|0;i=g+36|0;j=g+32|0;k=g+28|0;m=g+24|0;n=g+16|0;o=g+8|0;p=g;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[g+20>>2]=f;c[n>>2]=c[k>>2];k=o;c[k>>2]=0;c[k+4>>2]=0;k=p;c[k>>2]=0;c[k+4>>2]=0;if((c[m>>2]|0)<28){c[h>>2]=0;q=c[h>>2]|0;l=g;return q|0}else{m=Rb((c[n>>2]|0)+8|0)|0;k=o;c[k>>2]=m;c[k+4>>2]=D;k=Rb((c[n>>2]|0)+16|0)|0;n=p;c[n>>2]=k;c[n+4>>2]=D;n=c[i>>2]|0;i=c[j>>2]|0;j=o;o=c[j>>2]|0;k=c[j+4>>2]|0;j=p;p=Uf(1e3,0,c[j>>2]|0,c[j+4>>2]|0)|0;ub(n,i,o,k,p,D)|0;c[h>>2]=1;q=c[h>>2]|0;l=g;return q|0}return 0}function kb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+48|0;h=g+36|0;i=g+32|0;j=g+28|0;k=g+24|0;m=g+20|0;n=g+12|0;o=g;p=g+8|0;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[g+16>>2]=f;c[n>>2]=c[k>>2];k=o;c[k>>2]=0;c[k+4>>2]=0;if((c[m>>2]|0)<56){c[h>>2]=0;q=c[h>>2]|0;l=g;return q|0}else{m=Qb((c[n>>2]|0)+40|0)|0;k=o;c[k>>2]=m;c[k+4>>2]=((m|0)<0)<<31>>31;m=o;ub(c[i>>2]|0,c[j>>2]|0,c[m>>2]|0,c[m+4>>2]|0,1e3,0)|0;m=Qb((c[n>>2]|0)+52|0)|0;n=Lf(m|0,((m|0)<0)<<31>>31|0,2,0)|0;c[p>>2]=n;wb(c[i>>2]|0,c[j>>2]|0,c[p>>2]|0)|0;c[h>>2]=1;q=c[h>>2]|0;l=g;return q|0}return 0}function lb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+32|0;g=f+8|0;h=f;i=f+24|0;j=f+16|0;k=h;c[k>>2]=a;c[k+4>>2]=b;c[i>>2]=d;c[f+20>>2]=e;c[j>>2]=c[(c[i>>2]|0)+504>>2];do if(!(c[(c[i>>2]|0)+504>>2]|0)){e=Cf(12)|0;c[(c[i>>2]|0)+504>>2]=e;if(!(c[(c[i>>2]|0)+504>>2]|0)){e=g;c[e>>2]=-1;c[e+4>>2]=-1;break}else{c[j>>2]=c[(c[i>>2]|0)+504>>2];c[(c[j>>2]|0)+8>>2]=0;c[(c[j>>2]|0)+4>>2]=256;c[c[j>>2]>>2]=1;e=g;c[e>>2]=0;c[e+4>>2]=0;break}}else{e=c[j>>2]|0;if((c[c[j>>2]>>2]|0)<2)c[e>>2]=(c[e>>2]|0)+1;else c[e+8>>2]=1;e=h;d=c[e+4>>2]|0;if((d|0)>-1|(d|0)==-1&(c[e>>2]|0)>>>0>4294967295){e=h;d=c[e+4>>2]|0;b=g;c[b>>2]=c[e>>2];c[b+4>>2]=d;break}if(!(c[(c[j>>2]|0)+8>>2]|0)){d=g;c[d>>2]=0;c[d+4>>2]=0;break}d=(c[i>>2]|0)+488|0;b=c[d+4>>2]|0;if((b|0)>0|(b|0)==0&(c[d>>2]|0)>>>0>0){d=(c[i>>2]|0)+488|0;b=c[(c[j>>2]|0)+4>>2]|0;e=Lf(c[d>>2]|0,c[d+4>>2]|0,b|0,((b|0)<0)<<31>>31|0)|0;b=g;c[b>>2]=e;c[b+4>>2]=D;break}else{b=g;c[b>>2]=-1;c[b+4>>2]=-1;break}}while(0);j=g;D=c[j+4>>2]|0;l=f;return c[j>>2]|0}function mb(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;i=l;l=l+48|0;j=i+36|0;k=i+32|0;m=i+28|0;n=i+24|0;o=i+20|0;p=i+12|0;q=i+8|0;r=i+4|0;s=i+40|0;t=i;c[k>>2]=b;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[i+16>>2]=h;c[p>>2]=c[n>>2];a[s>>0]=0;if((c[o>>2]|0)<64){c[j>>2]=0;u=c[j>>2]|0;l=i;return u|0}else{c[q>>2]=Qb((c[p>>2]|0)+24|0)|0;c[r>>2]=Qb((c[p>>2]|0)+28|0)|0;a[s>>0]=a[(c[p>>2]|0)+15>>0]|0;c[t>>2]=d[(c[p>>2]|0)+11>>0];p=c[k>>2]|0;o=c[m>>2]|0;n=c[q>>2]|0;q=c[r>>2]|0;r=Uf(1e3,0,q|0,((q|0)<0)<<31>>31|0)|0;ub(p,o,n,((n|0)<0)<<31>>31,r,D)|0;vb(c[k>>2]|0,c[m>>2]|0,d[s>>0]|0)|0;wb(c[k>>2]|0,c[m>>2]|0,c[t>>2]|0)|0;c[j>>2]=1;u=c[j>>2]|0;l=i;return u|0}return 0}function nb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;g=l;l=l+32|0;h=g+28|0;i=g+24|0;j=g+20|0;k=g+16|0;m=g+12|0;n=g+4|0;o=g;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[g+8>>2]=f;c[n>>2]=22;c[o>>2]=Cf(48)|0;if(!(c[o>>2]|0)){c[h>>2]=-1;p=c[h>>2]|0;l=g;return p|0}if((Kb(c[o>>2]|0,c[k>>2]|0,c[m>>2]|0)|0)==-1){Df(c[o>>2]|0);c[h>>2]=-1;p=c[h>>2]|0;l=g;return p|0}else{m=c[i>>2]|0;k=c[j>>2]|0;f=Uf(2,0,c[(c[o>>2]|0)+32>>2]|0,0)|0;e=D;d=Uf(1e3,0,c[(c[o>>2]|0)+36>>2]|0,0)|0;ub(m,k,f,e,d,D)|0;vb(c[i>>2]|0,c[j>>2]|0,c[n>>2]|0)|0;wb(c[i>>2]|0,c[j>>2]|0,0)|0;Df(c[o>>2]|0);c[h>>2]=1;p=c[h>>2]|0;l=g;return p|0}return 0}function ob(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;i=l;l=l+32|0;j=i+24|0;k=i+20|0;m=i+16|0;n=i+12|0;o=i+8|0;p=i+28|0;c[k>>2]=b;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[i+4>>2]=h;c[i>>2]=c[n>>2];if((c[o>>2]|0)<19){c[j>>2]=0;q=c[j>>2]|0;l=i;return q|0}a[p>>0]=a[(c[n>>2]|0)+9>>0]|0;if((d[p>>0]|0|0)<1){c[j>>2]=0;q=c[j>>2]|0;l=i;return q|0}else{ub(c[k>>2]|0,c[m>>2]|0,48e3,0,1e3,0)|0;vb(c[k>>2]|0,c[m>>2]|0,0)|0;p=c[k>>2]|0;o=c[m>>2]|0;Jb(p,o,(Ib((c[n>>2]|0)+10|0)|0)&65535,0)|0;wb(c[k>>2]|0,c[m>>2]|0,2)|0;c[j>>2]=1;q=c[j>>2]|0;l=i;return q|0}return 0}function pb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=l;l=l+48|0;g=f+24|0;h=f+16|0;i=f+40|0;j=f+36|0;k=f+32|0;m=f+8|0;n=f;o=h;c[o>>2]=a;c[o+4>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=c[(c[i>>2]|0)+504>>2];if(!(c[(c[i>>2]|0)+504>>2]|0)){e=Cf(16)|0;c[(c[i>>2]|0)+504>>2]=e;if(!(c[(c[i>>2]|0)+504>>2]|0)){e=g;c[e>>2]=-1;c[e+4>>2]=-1;p=g;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=f;return r|0}else{c[k>>2]=c[(c[i>>2]|0)+504>>2];c[(c[k>>2]|0)+4>>2]=0;c[c[k>>2]>>2]=1;e=(c[k>>2]|0)+8|0;c[e>>2]=0;c[e+4>>2]=0;e=g;c[e>>2]=0;c[e+4>>2]=0;p=g;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=f;return r|0}}e=c[k>>2]|0;if((c[c[k>>2]>>2]|0)<2)c[e>>2]=(c[e>>2]|0)+1;else c[e+4>>2]=1;e=h;d=c[e+4>>2]|0;if((d|0)>-1|(d|0)==-1&(c[e>>2]|0)>>>0>4294967295){e=h;h=c[e+4>>2]|0;d=g;c[d>>2]=c[e>>2];c[d+4>>2]=h;p=g;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=f;return r|0}if(!(c[(c[k>>2]|0)+4>>2]|0)){h=g;c[h>>2]=0;c[h+4>>2]=0;p=g;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=f;return r|0}h=Hb(c[j>>2]|0)|0;j=m;c[j>>2]=h;c[j+4>>2]=D;j=(c[i>>2]|0)+488|0;h=c[j+4>>2]|0;if(!((h|0)>0|(h|0)==0&(c[j>>2]|0)>>>0>0)){j=m;h=(c[k>>2]|0)+8|0;k=h;d=Lf(c[k>>2]|0,c[k+4>>2]|0,c[j>>2]|0,c[j+4>>2]|0)|0;j=h;c[j>>2]=d;c[j+4>>2]=D;j=g;c[j>>2]=-1;c[j+4>>2]=-1;p=g;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=f;return r|0}j=(c[i>>2]|0)+488|0;d=m;m=Lf(c[j>>2]|0,c[j+4>>2]|0,c[d>>2]|0,c[d+4>>2]|0)|0;d=n;c[d>>2]=m;c[d+4>>2]=D;d=n;m=c[d+4>>2]|0;j=(c[i>>2]|0)+496|0;h=c[j+4>>2]|0;if((m|0)>(h|0)|((m|0)==(h|0)?(c[d>>2]|0)>>>0>(c[j>>2]|0)>>>0:0)?(j=(c[i>>2]|0)+496|0,d=c[j+4>>2]|0,h=(c[i>>2]|0)+488|0,m=c[h+4>>2]|0,(d|0)>(m|0)|((d|0)==(m|0)?(c[j>>2]|0)>>>0>=(c[h>>2]|0)>>>0:0)):0){h=(c[i>>2]|0)+496|0;v=c[h>>2]|0;w=c[h+4>>2]|0}else{h=n;v=c[h>>2]|0;w=c[h+4>>2]|0}h=g;c[h>>2]=v;c[h+4>>2]=w;p=g;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=f;return r|0}function qb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=l;l=l+32|0;h=g+8|0;i=g+28|0;j=g+24|0;k=g+20|0;m=g+16|0;n=g;o=h;c[o>>2]=a;c[o+4>>2]=b;c[i>>2]=d;c[j>>2]=e;c[k>>2]=f;c[m>>2]=c[(c[i>>2]|0)+504>>2];i=h;f=c[i+4>>2]|0;e=(c[m>>2]|0)+8|0;d=c[e+4>>2]|0;b=h;h=c[b>>2]|0;o=c[b+4>>2]|0;if(!((f|0)>(d|0)|((f|0)==(d|0)?(c[i>>2]|0)>>>0>=(c[e>>2]|0)>>>0:0))){e=n;c[e>>2]=h;c[e+4>>2]=o;e=Hb(c[j>>2]|0)|0;j=(c[m>>2]|0)+8|0;i=j;d=Kf(c[i>>2]|0,c[i+4>>2]|0,e|0,D|0)|0;e=j;c[e>>2]=d;c[e+4>>2]=D;p=n;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=g;return r|0}e=Hb(c[k>>2]|0)|0;k=Kf(h|0,o|0,e|0,D|0)|0;e=n;c[e>>2]=k;c[e+4>>2]=D;e=n;k=c[e+4>>2]|0;o=(c[m>>2]|0)+8|0;h=c[o+4>>2]|0;if((k|0)<(h|0)|((k|0)==(h|0)?(c[e>>2]|0)>>>0<(c[o>>2]|0)>>>0:0)){o=(c[m>>2]|0)+8|0;e=c[o+4>>2]|0;h=n;c[h>>2]=c[o>>2];c[h+4>>2]=e}e=(c[m>>2]|0)+8|0;c[e>>2]=0;c[e+4>>2]=0;p=n;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=g;return r|0}function rb(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;h=l;l=l+48|0;i=h+32|0;j=h+28|0;k=h+24|0;m=h+20|0;n=h+16|0;o=h+8|0;p=h+4|0;q=h;c[j>>2]=a;c[k>>2]=b;c[m>>2]=e;c[n>>2]=f;c[h+12>>2]=g;c[o>>2]=c[m>>2];if((c[n>>2]|0)<26){c[i>>2]=0;r=c[i>>2]|0;l=h;return r|0}if((d[c[m>>2]>>0]|0|0)!=79){c[i>>2]=0;r=c[i>>2]|0;l=h;return r|0}if(De((c[m>>2]|0)+1|0,2723,4)|0){c[i>>2]=0;r=c[i>>2]|0;l=h;return r|0}if((d[(c[m>>2]|0)+5>>0]|0|0)!=1){c[i>>2]=0;r=c[i>>2]|0;l=h;return r|0}if((d[(c[m>>2]|0)+6>>0]|0|0)!=1){c[i>>2]=0;r=c[i>>2]|0;l=h;return r|0}else{c[p>>2]=tb((c[o>>2]|0)+18|0)|0;c[q>>2]=tb((c[o>>2]|0)+22|0)|0;o=c[j>>2]|0;m=c[k>>2]|0;n=c[p>>2]|0;p=c[q>>2]|0;q=Uf(1e3,0,p|0,((p|0)<0)<<31>>31|0)|0;ub(o,m,n,((n|0)<0)<<31>>31,q,D)|0;vb(c[j>>2]|0,c[k>>2]|0,32)|0;wb(c[j>>2]|0,c[k>>2]|0,1)|0;c[i>>2]=1;r=c[i>>2]|0;l=h;return r|0}return 0}function sb(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0;g=l;l=l+80|0;h=g+40|0;i=g+32|0;j=g+68|0;k=g+64|0;m=g+60|0;n=g+56|0;o=g+52|0;p=g+48|0;q=g+24|0;r=g+16|0;s=g+8|0;t=g;u=i;c[u>>2]=a;c[u+4>>2]=b;c[j>>2]=e;c[k>>2]=f;c[p>>2]=c[(c[j>>2]|0)+504>>2];if(!(c[(c[j>>2]|0)+504>>2]|0)){f=Cf(8)|0;c[(c[j>>2]|0)+504>>2]=f;if(!(c[(c[j>>2]|0)+504>>2]|0)){f=h;c[f>>2]=-1;c[f+4>>2]=-1;v=h;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=g;return x|0}else{c[p>>2]=c[(c[j>>2]|0)+504>>2];c[(c[p>>2]|0)+4>>2]=0;c[c[p>>2]>>2]=1;f=h;c[f>>2]=0;c[f+4>>2]=0;v=h;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=g;return x|0}}if(!(c[(c[k>>2]|0)+4>>2]|0))B=1;else B=(d[c[c[k>>2]>>2]>>0]|0|0)==79;c[m>>2]=B&1;if(!(c[m>>2]|0)?(c[(c[k>>2]|0)+4>>2]|0)>0:0)C=((d[c[c[k>>2]>>2]>>0]|0)&1|0)==0;else C=0;c[n>>2]=C&1;if(!(c[m>>2]|0)?(c[(c[k>>2]|0)+4>>2]|0)>0:0)E=((d[c[c[k>>2]>>2]>>0]|0)>>4&1|0)!=0;else E=0;c[o>>2]=E&1;E=c[p>>2]|0;if(c[m>>2]|0)c[E>>2]=(c[E>>2]|0)+1;else c[E+4>>2]=1;E=i;k=c[E+4>>2]|0;if((k|0)>-1|(k|0)==-1&(c[E>>2]|0)>>>0>4294967295){E=i;i=c[E+4>>2]|0;k=h;c[k>>2]=c[E>>2];c[k+4>>2]=i;v=h;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=g;return x|0}if(!(c[(c[p>>2]|0)+4>>2]|0)){p=h;c[p>>2]=0;c[p+4>>2]=0;v=h;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=g;return x|0}p=(c[j>>2]|0)+488|0;i=c[p+4>>2]|0;if(!((i|0)>0|(i|0)==0&(c[p>>2]|0)>>>0>0)){p=h;c[p>>2]=-1;c[p+4>>2]=-1;v=h;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=g;return x|0}p=(c[j>>2]|0)+488|0;i=c[p>>2]|0;k=c[p+4>>2]|0;if(c[m>>2]|0){m=h;c[m>>2]=i;c[m+4>>2]=k;v=h;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=g;return x|0}m=Jf(i|0,k|0,32)|0;k=q;c[k>>2]=m;c[k+4>>2]=D;k=(c[j>>2]|0)+488|0;m=Jf(c[k>>2]|0,c[k+4>>2]|0,30)|0;k=r;c[k>>2]=m&3;c[k+4>>2]=0;k=(c[j>>2]|0)+488|0;j=Jf(c[k>>2]|0,c[k+4>>2]|0,3)|0;k=s;c[k>>2]=j&134217727;c[k+4>>2]=0;if(c[n>>2]|0){n=s;c[n>>2]=0;c[n+4>>2]=0}else{n=s;k=Lf(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;n=s;c[n>>2]=k;c[n+4>>2]=D}do if(!(c[o>>2]|0)){n=r;if((c[n>>2]|0)==3&(c[n+4>>2]|0)==0){n=r;c[n>>2]=0;c[n+4>>2]=0;break}else{n=r;k=Lf(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;n=r;c[n>>2]=k;c[n+4>>2]=D;break}}else{n=q;k=Lf(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;n=q;c[n>>2]=k;c[n+4>>2]=D;n=r;c[n>>2]=3;c[n+4>>2]=0}while(0);o=c[q>>2]|0;q=r;r=Of(c[q>>2]|0,c[q+4>>2]|0,30)|0;q=o|D;o=s;s=Of(c[o>>2]|0,c[o+4>>2]|0,3)|0;o=t;c[o>>2]=r|s;c[o+4>>2]=q|D;q=t;t=c[q+4>>2]|0;o=h;c[o>>2]=c[q>>2];c[o+4>>2]=t;v=h;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=g;return x|0}function tb(a){a=a|0;var b=0,e=0;b=l;l=l+16|0;e=b;c[e>>2]=a;l=b;return (d[c[e>>2]>>0]|0)<<24|(d[(c[e>>2]|0)+1>>0]|0)<<16|(d[(c[e>>2]|0)+2>>0]|0)<<8|(d[(c[e>>2]|0)+3>>0]|0)|0}function ub(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;h=l;l=l+32|0;i=h+28|0;j=h+24|0;k=h+20|0;m=h+8|0;n=h;o=h+16|0;c[j>>2]=a;c[k>>2]=b;b=m;c[b>>2]=d;c[b+4>>2]=e;e=n;c[e>>2]=f;c[e+4>>2]=g;if(!(c[j>>2]|0)){c[i>>2]=-2;p=c[i>>2]|0;l=h;return p|0}c[o>>2]=xb(c[j>>2]|0,c[k>>2]|0)|0;if(!(c[o>>2]|0)){c[i>>2]=-20;p=c[i>>2]|0;l=h;return p|0}else{g=m;m=c[g+4>>2]|0;e=(c[o>>2]|0)+376|0;c[e>>2]=c[g>>2];c[e+4>>2]=m;m=n;n=c[m+4>>2]|0;e=(c[o>>2]|0)+384|0;c[e>>2]=c[m>>2];c[e+4>>2]=n;c[i>>2]=Ab(c[j>>2]|0,c[k>>2]|0)|0;p=c[i>>2]|0;l=h;return p|0}return 0}function vb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if(!(c[g>>2]|0)){c[f>>2]=-2;k=c[f>>2]|0;l=e;return k|0}c[j>>2]=xb(c[g>>2]|0,c[h>>2]|0)|0;if(!(c[j>>2]|0)){c[f>>2]=-20;k=c[f>>2]|0;l=e;return k|0}else{c[(c[j>>2]|0)+408>>2]=c[i>>2];c[f>>2]=Ab(c[g>>2]|0,c[h>>2]|0)|0;k=c[f>>2]|0;l=e;return k|0}return 0}function wb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if(!(c[g>>2]|0)){c[f>>2]=-2;k=c[f>>2]|0;l=e;return k|0}c[j>>2]=xb(c[g>>2]|0,c[h>>2]|0)|0;if(!(c[j>>2]|0)){c[f>>2]=-20;k=c[f>>2]|0;l=e;return k|0}else{c[(c[j>>2]|0)+364>>2]=c[i>>2];c[f>>2]=0;k=c[f>>2]|0;l=e;return k|0}return 0}function xb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[f>>2]=a;c[g>>2]=b;if((c[g>>2]|0)==-1){c[e>>2]=0;h=c[e>>2]|0;l=d;return h|0}else{c[e>>2]=zb(c[(c[f>>2]|0)+80>>2]|0,1,c[g>>2]|0)|0;h=c[e>>2]|0;l=d;return h|0}return 0}function yb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[e>>2]=a;c[f>>2]=b;c[g>>2]=c[e>>2];l=d;return (c[(c[g>>2]|0)+336>>2]|0)==(c[f>>2]|0)|0}function zb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[(c[g>>2]|0)+4>>2]|0)){m=6;break}c[j>>2]=c[(c[(c[g>>2]|0)+8>>2]|0)+(c[k>>2]<<2)>>2];if(xa[c[h>>2]&1](c[j>>2]|0,c[i>>2]|0)|0){m=4;break}c[k>>2]=(c[k>>2]|0)+1}if((m|0)==4){c[f>>2]=c[j>>2];n=c[f>>2]|0;l=e;return n|0}else if((m|0)==6){c[f>>2]=0;n=c[f>>2]|0;l=e;return n|0}return 0}function Ab(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;if(!(c[f>>2]|0)){c[e>>2]=-2;i=c[e>>2]|0;l=d;return i|0}c[h>>2]=xb(c[f>>2]|0,c[g>>2]|0)|0;if(!(c[h>>2]|0)){c[e>>2]=-20;i=c[e>>2]|0;l=d;return i|0}b=(c[h>>2]|0)+376|0;if((c[b>>2]|0)==0&(c[b+4>>2]|0)==0){b=(c[h>>2]|0)+376|0;c[b>>2]=1;c[b+4>>2]=0;b=(c[h>>2]|0)+384|0;c[b>>2]=0;c[b+4>>2]=0}b=c[f>>2]|0;a=c[g>>2]|0;if(!(c[(c[h>>2]|0)+408>>2]|0)){c[e>>2]=Cb(b,a,19,0,1)|0;i=c[e>>2]|0;l=d;return i|0}h=(Db(b,a)|0)==12;a=c[f>>2]|0;b=c[g>>2]|0;if(h){c[e>>2]=Cb(a,b,20,0,1)|0;i=c[e>>2]|0;l=d;return i|0}h=(Db(a,b)|0)==14;b=c[f>>2]|0;f=c[g>>2]|0;if(h){c[e>>2]=Cb(b,f,21,0,1)|0;i=c[e>>2]|0;l=d;return i|0}else{c[e>>2]=Cb(b,f,22,0,1)|0;i=c[e>>2]|0;l=d;return i|0}return 0}function Bb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=l;l=l+32|0;h=g+8|0;i=g+28|0;j=g+24|0;k=g;m=g+16|0;c[i>>2]=a;c[j>>2]=b;b=k;c[b>>2]=d;c[b+4>>2]=e;c[g+20>>2]=f;c[m>>2]=xb(c[i>>2]|0,c[j>>2]|0)|0;if(!(c[m>>2]|0)){j=h;c[j>>2]=-1;c[j+4>>2]=-1;n=h;o=n;p=c[o>>2]|0;q=n+4|0;r=q;s=c[r>>2]|0;D=s;l=g;return p|0}j=k;i=c[j+4>>2]|0;f=(c[m>>2]|0)+392|0;e=c[f+4>>2]|0;if((i|0)<(e|0)|((i|0)==(e|0)?(c[j>>2]|0)>>>0<=(c[f>>2]|0)>>>0:0)){t=0;u=0}else{f=k;j=(c[m>>2]|0)+392|0;e=Kf(c[f>>2]|0,c[f+4>>2]|0,c[j>>2]|0,c[j+4>>2]|0)|0;t=e;u=D}e=k;c[e>>2]=t;c[e+4>>2]=u;u=(c[m>>2]|0)+384|0;e=k;k=Uf(c[u>>2]|0,c[u+4>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0;e=(c[m>>2]|0)+376|0;m=Rf(k|0,D|0,c[e>>2]|0,c[e+4>>2]|0)|0;e=h;c[e>>2]=m;c[e+4>>2]=D;n=h;o=n;p=c[o>>2]|0;q=n+4|0;r=q;s=c[r>>2]|0;D=s;l=g;return p|0}function Cb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;g=l;l=l+32|0;h=g+24|0;i=g+20|0;j=g+16|0;k=g+12|0;m=g+8|0;n=g+4|0;o=g;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;if(!(c[i>>2]|0)){c[h>>2]=-2;p=c[h>>2]|0;l=g;return p|0}f=c[i>>2]|0;if((c[j>>2]|0)==-1){if(c[f+96>>2]|0?c[(c[i>>2]|0)+92>>2]|0:0)Df(c[(c[i>>2]|0)+92>>2]|0);c[(c[i>>2]|0)+88>>2]=c[k>>2];c[(c[i>>2]|0)+92>>2]=c[m>>2];c[(c[i>>2]|0)+96>>2]=c[n>>2]}else{c[o>>2]=xb(f,c[j>>2]|0)|0;if(!(c[o>>2]|0)){c[h>>2]=-20;p=c[h>>2]|0;l=g;return p|0}if(c[(c[o>>2]|0)+456>>2]|0?c[(c[o>>2]|0)+452>>2]|0:0)Df(c[(c[o>>2]|0)+452>>2]|0);c[(c[o>>2]|0)+448>>2]=c[k>>2];c[(c[o>>2]|0)+452>>2]=c[m>>2];c[(c[o>>2]|0)+456>>2]=c[n>>2]}c[h>>2]=0;p=c[h>>2]|0;l=g;return p|0}function Db(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;if(!(c[f>>2]|0)){c[e>>2]=-2;i=c[e>>2]|0;l=d;return i|0}c[h>>2]=xb(c[f>>2]|0,c[g>>2]|0)|0;if(!(c[h>>2]|0)){c[e>>2]=-20;i=c[e>>2]|0;l=d;return i|0}else{c[e>>2]=c[(c[h>>2]|0)+360>>2];i=c[e>>2]|0;l=d;return i|0}return 0}function Eb(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;i=l;l=l+80|0;j=i+40|0;k=i+64|0;m=i+60|0;n=i+32|0;o=i+52|0;p=i+24|0;q=i+16|0;r=i+48|0;s=i+68|0;t=i+8|0;u=i;c[k>>2]=a;c[m>>2]=d;d=n;c[d>>2]=f;c[d+4>>2]=g;c[i+56>>2]=h;c[o>>2]=xb(c[k>>2]|0,c[m>>2]|0)|0;if(!(c[o>>2]|0)){m=j;c[m>>2]=-1;c[m+4>>2]=-1;v=j;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=i;return x|0}else{m=n;k=Jf(c[m>>2]|0,c[m+4>>2]|0,c[(c[o>>2]|0)+408>>2]|0)|0;m=p;c[m>>2]=k;c[m+4>>2]=D;m=n;n=c[m>>2]|0;k=c[m+4>>2]|0;m=p;h=Of(c[m>>2]|0,c[m+4>>2]|0,c[(c[o>>2]|0)+408>>2]|0)|0;m=Kf(n|0,k|0,h|0,D|0)|0;h=q;c[h>>2]=m;c[h+4>>2]=D;h=p;p=q;m=Lf(c[h>>2]|0,c[h+4>>2]|0,c[p>>2]|0,c[p+4>>2]|0)|0;p=Jf(m|0,D|0,9)|0;c[r>>2]=p;p=q;q=Jf(c[p>>2]|0,c[p+4>>2]|0,9)|0;b[s>>1]=q;q=Kf(c[r>>2]|0,0,e[s>>1]|0|0,0)|0;s=t;c[s>>2]=q;c[s+4>>2]=D;s=t;t=(c[o>>2]|0)+384|0;q=Uf(c[s>>2]|0,c[s+4>>2]|0,c[t>>2]|0,c[t+4>>2]|0)|0;t=(c[o>>2]|0)+376|0;o=Rf(q|0,D|0,c[t>>2]|0,c[t+4>>2]|0)|0;t=u;c[t>>2]=o;c[t+4>>2]=D;t=u;u=c[t+4>>2]|0;o=j;c[o>>2]=c[t>>2];c[o+4>>2]=u;v=j;w=v;x=c[w>>2]|0;y=v+4|0;z=y;A=c[z>>2]|0;D=A;l=i;return x|0}return 0}function Fb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=l;l=l+48|0;h=g+24|0;i=g+44|0;j=g+40|0;k=g+16|0;m=g+32|0;n=g+8|0;o=g;c[i>>2]=a;c[j>>2]=b;b=k;c[b>>2]=d;c[b+4>>2]=e;c[g+36>>2]=f;c[m>>2]=xb(c[i>>2]|0,c[j>>2]|0)|0;if(!(c[m>>2]|0)){j=h;c[j>>2]=-1;c[j+4>>2]=-1;p=h;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=g;return r|0}else{j=k;k=Jf(c[j>>2]|0,c[j+4>>2]|0,c[(c[m>>2]|0)+408>>2]|0)|0;j=n;c[j>>2]=k;c[j+4>>2]=D;j=n;n=(c[m>>2]|0)+384|0;k=Uf(c[j>>2]|0,c[j+4>>2]|0,c[n>>2]|0,c[n+4>>2]|0)|0;n=(c[m>>2]|0)+376|0;m=Rf(k|0,D|0,c[n>>2]|0,c[n+4>>2]|0)|0;n=o;c[n>>2]=m;c[n+4>>2]=D;n=o;o=c[n+4>>2]|0;m=h;c[m>>2]=c[n>>2];c[m+4>>2]=o;p=h;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=g;return r|0}return 0}function Gb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=l;l=l+64|0;h=g+32|0;i=g+52|0;j=g+48|0;k=g+24|0;m=g+40|0;n=g+16|0;o=g+8|0;p=g;c[i>>2]=a;c[j>>2]=b;b=k;c[b>>2]=d;c[b+4>>2]=e;c[g+44>>2]=f;c[m>>2]=xb(c[i>>2]|0,c[j>>2]|0)|0;if(!(c[m>>2]|0)){j=h;c[j>>2]=-1;c[j+4>>2]=-1;q=h;r=q;s=c[r>>2]|0;t=q+4|0;u=t;v=c[u>>2]|0;D=v;l=g;return s|0}j=k;i=Jf(c[j>>2]|0,c[j+4>>2]|0,c[(c[m>>2]|0)+408>>2]|0)|0;j=n;c[j>>2]=i;c[j+4>>2]=D;j=k;i=c[j>>2]|0;f=c[j+4>>2]|0;j=n;e=Of(c[j>>2]|0,c[j+4>>2]|0,c[(c[m>>2]|0)+408>>2]|0)|0;j=Kf(i|0,f|0,e|0,D|0)|0;e=o;c[e>>2]=j;c[e+4>>2]=D;e=n;n=o;o=Lf(c[e>>2]|0,c[e+4>>2]|0,c[n>>2]|0,c[n+4>>2]|0)|0;n=k;c[n>>2]=o;c[n+4>>2]=D;n=k;o=c[n+4>>2]|0;if((o|0)>0|(o|0)==0&(c[n>>2]|0)>>>0>0){n=(c[m>>2]|0)+392|0;o=k;e=Kf(c[o>>2]|0,c[o+4>>2]|0,c[n>>2]|0,c[n+4>>2]|0)|0;n=k;c[n>>2]=e;c[n+4>>2]=D}n=k;k=(c[m>>2]|0)+384|0;e=Uf(c[n>>2]|0,c[n+4>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0;k=(c[m>>2]|0)+376|0;m=Rf(e|0,D|0,c[k>>2]|0,c[k+4>>2]|0)|0;k=p;c[k>>2]=m;c[k+4>>2]=D;k=p;p=c[k+4>>2]|0;m=h;c[m>>2]=c[k>>2];c[m+4>>2]=p;q=h;r=q;s=c[r>>2]|0;t=q+4|0;u=t;v=c[u>>2]|0;D=v;l=g;return s|0}function Hb(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+32|0;f=e;g=e+16|0;h=e+22|0;i=e+21|0;j=e+20|0;k=e+12|0;m=e+8|0;c[g>>2]=b;do if((c[(c[g>>2]|0)+4>>2]|0)>=1){a[h>>0]=a[c[c[g>>2]>>2]>>0]|0;a[i>>0]=(d[h>>0]|0)&3;c[k>>2]=c[1416+((d[h>>0]|0)>>3<<2)>>2];if((d[i>>0]|0|0)==3?(c[(c[g>>2]|0)+4>>2]|0)<2:0){b=f;c[b>>2]=0;c[b+4>>2]=0;break}switch(d[i>>0]|0|0){case 0:{a[j>>0]=1;break}case 2:case 1:{a[j>>0]=2;break}case 3:{a[j>>0]=(d[(c[c[g>>2]>>2]|0)+1>>0]|0)&63;break}default:{}}c[m>>2]=S(c[k>>2]|0,d[j>>0]|0)|0;if((c[m>>2]|0)>5760){b=f;c[b>>2]=0;c[b+4>>2]=0;break}else{b=c[m>>2]|0;n=f;c[n>>2]=b;c[n+4>>2]=((b|0)<0)<<31>>31;break}}else{b=f;c[b>>2]=0;c[b+4>>2]=0}while(0);m=f;D=c[m+4>>2]|0;l=e;return c[m>>2]|0}function Ib(a){a=a|0;var b=0,e=0;b=l;l=l+16|0;e=b;c[e>>2]=a;l=b;return (d[c[e>>2]>>0]|0|(d[(c[e>>2]|0)+1>>0]|0)<<8)&65535|0}function Jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f;k=f+8|0;c[h>>2]=a;c[i>>2]=b;b=j;c[b>>2]=d;c[b+4>>2]=e;if(!(c[h>>2]|0)){c[g>>2]=-2;m=c[g>>2]|0;l=f;return m|0}c[k>>2]=xb(c[h>>2]|0,c[i>>2]|0)|0;if(!(c[k>>2]|0)){c[g>>2]=-20;m=c[g>>2]|0;l=f;return m|0}else{e=j;j=c[e+4>>2]|0;b=(c[k>>2]|0)+392|0;c[b>>2]=c[e>>2];c[b+4>>2]=j;c[g>>2]=Ab(c[h>>2]|0,c[i>>2]|0)|0;m=c[g>>2]|0;l=f;return m|0}return 0}function Kb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;e=l;l=l+48|0;f=e+44|0;g=e+40|0;h=e+36|0;i=e+32|0;j=e+16|0;k=e+8|0;m=e+4|0;n=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;Lb(j,c[h>>2]|0,c[i>>2]|0);Mb(j,104);i=Nb(j)|0;c[c[g>>2]>>2]=i;i=Nb(j)|0;c[(c[g>>2]|0)+4>>2]=i;i=Nb(j)|0;c[(c[g>>2]|0)+8>>2]=i;i=Nb(j)|0;c[(c[g>>2]|0)+12>>2]=i;i=Nb(j)|0;c[k>>2]=i;c[(c[g>>2]|0)+20>>2]=i;if((c[k>>2]|0)>>>0>=17){c[f>>2]=-1;o=c[f>>2]|0;l=e;return o|0}c[(c[g>>2]|0)+24>>2]=c[1544+(c[k>>2]<<3)>>2];c[(c[g>>2]|0)+28>>2]=c[1544+(c[k>>2]<<3)+4>>2];if(Ob(j)|0){i=Nb(j)|0;c[(c[g>>2]|0)+24>>2]=i;i=Nb(j)|0;c[(c[g>>2]|0)+28>>2]=i}if(Ob(j)|0){i=Nb(j)|0;c[(c[g>>2]|0)+16>>2]=i}if(Ob(j)|0){c[m>>2]=Nb(j)|0;i=(c[m>>2]|0)<2;p=i?c[m>>2]|0:0;q=i?c[g>>2]|0:c[g>>2]|0}else{p=c[1680+(c[k>>2]<<2)>>2]|0;q=c[g>>2]|0}c[q+40>>2]=p;c[(c[g>>2]|0)+44>>2]=c[1764+(c[k>>2]<<2)>>2];c[(c[g>>2]|0)+32>>2]=c[1932+(c[1848+(c[k>>2]<<2)>>2]<<3)>>2];c[(c[g>>2]|0)+36>>2]=c[1932+(c[1848+(c[k>>2]<<2)>>2]<<3)+4>>2];if(Ob(j)|0?(c[n>>2]=Nb(j)|0,c[(c[g>>2]|0)+32>>2]=c[1932+(c[n>>2]<<3)>>2],c[(c[g>>2]|0)+36>>2]=c[1932+(c[n>>2]<<3)+4>>2],(c[n>>2]|0)==0):0){n=Nb(j)|0;c[(c[g>>2]|0)+32>>2]=n;n=Nb(j)|0;c[(c[g>>2]|0)+36>>2]=n}c[f>>2]=0;o=c[f>>2]|0;l=e;return o|0}function Lb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[c[f>>2]>>2]=c[g>>2];c[(c[f>>2]|0)+4>>2]=c[g>>2];c[(c[f>>2]|0)+8>>2]=(c[(c[f>>2]|0)+4>>2]|0)+(c[h>>2]|0);c[(c[f>>2]|0)+12>>2]=8;l=e;return}function Mb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;b=(c[e>>2]|0)+12|0;c[b>>2]=(c[b>>2]|0)-(c[f>>2]|0);while(1){if((c[(c[e>>2]|0)+12>>2]|0)>0)break;f=(c[e>>2]|0)+4|0;c[f>>2]=(c[f>>2]|0)+1;f=(c[e>>2]|0)+12|0;c[f>>2]=(c[f>>2]|0)+8}l=d;return}function Nb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=l;l=l+16|0;d=b+8|0;e=b+4|0;f=b;c[d>>2]=a;c[e>>2]=0;c[f>>2]=0;while(1){a=(Pb(c[d>>2]|0,1)|0)!=0^1;g=c[e>>2]|0;if(!a)break;c[e>>2]=g+1;c[f>>2]=c[f>>2]<<1;a=Pb(c[d>>2]|0,1)|0;c[f>>2]=c[f>>2]|a}l=b;return (1<<g)-1+(c[f>>2]|0)|0}function Ob(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=Pb(c[d>>2]|0,1)|0;l=b;return a|0}function Pb(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[j>>2]=0;while(1){if((c[h>>2]|0)<=0){k=9;break}if((c[(c[g>>2]|0)+4>>2]|0)>>>0>=(c[(c[g>>2]|0)+8>>2]|0)>>>0){k=9;break}b=(c[(c[g>>2]|0)+12>>2]|0)-(c[h>>2]|0)|0;c[i>>2]=b;m=d[c[(c[g>>2]|0)+4>>2]>>0]|0;if((b|0)>=0)break;c[j>>2]=c[j>>2]|(m&c[2020+(c[(c[g>>2]|0)+12>>2]<<2)>>2])<<0-(c[i>>2]|0);c[h>>2]=(c[h>>2]|0)-(c[(c[g>>2]|0)+12>>2]|0);b=(c[g>>2]|0)+4|0;c[b>>2]=(c[b>>2]|0)+1;c[(c[g>>2]|0)+12>>2]=8}if((k|0)==9){c[f>>2]=c[j>>2];n=c[f>>2]|0;l=e;return n|0}c[j>>2]=c[j>>2]|m>>c[i>>2]&c[2020+(c[h>>2]<<2)>>2];i=(c[g>>2]|0)+12|0;c[i>>2]=(c[i>>2]|0)-(c[h>>2]|0);if(!(c[(c[g>>2]|0)+12>>2]|0)){h=(c[g>>2]|0)+4|0;c[h>>2]=(c[h>>2]|0)+1;c[(c[g>>2]|0)+12>>2]=8}c[f>>2]=c[j>>2];n=c[f>>2]|0;l=e;return n|0}function Qb(a){a=a|0;var b=0,e=0;b=l;l=l+16|0;e=b;c[e>>2]=a;l=b;return d[c[e>>2]>>0]|0|(d[(c[e>>2]|0)+1>>0]|0)<<8|(d[(c[e>>2]|0)+2>>0]|0)<<16|(d[(c[e>>2]|0)+3>>0]|0)<<24|0}function Rb(a){a=a|0;var b=0,e=0,f=0,g=0;b=l;l=l+16|0;e=b+8|0;f=b+4|0;g=b;c[e>>2]=a;c[f>>2]=d[c[e>>2]>>0]|0|(d[(c[e>>2]|0)+1>>0]|0)<<8|(d[(c[e>>2]|0)+2>>0]|0)<<16|(d[(c[e>>2]|0)+3>>0]|0)<<24;c[g>>2]=d[(c[e>>2]|0)+4>>0]|0|(d[(c[e>>2]|0)+5>>0]|0)<<8|(d[(c[e>>2]|0)+6>>0]|0)<<16|(d[(c[e>>2]|0)+7>>0]|0)<<24;D=c[g>>2]|0;l=b;return c[f>>2]|0}function Sb(a){a=a|0;var b=0,e=0;b=l;l=l+16|0;e=b;c[e>>2]=a;l=b;return ((d[c[e>>2]>>0]|0)<<8|(d[(c[e>>2]|0)+1>>0]|0))&65535|0}function Tb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if(!(c[g>>2]|0)){c[f>>2]=-2;k=c[f>>2]|0;l=e;return k|0}c[j>>2]=xb(c[g>>2]|0,c[h>>2]|0)|0;if(!(c[j>>2]|0)){c[f>>2]=-20;k=c[f>>2]|0;l=e;return k|0}else{c[(c[j>>2]|0)+368>>2]=c[i>>2];c[f>>2]=0;k=c[f>>2]|0;l=e;return k|0}return 0}function Ub(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=l;l=l+16|0;d=b+8|0;e=b+4|0;f=b;c[e>>2]=a;if(Vb(c[e>>2]|0)|0){c[d>>2]=0;g=c[d>>2]|0;l=b;return g|0}c[f>>2]=Cf(568)|0;if(!(c[f>>2]|0)){c[d>>2]=0;g=c[d>>2]|0;l=b;return g|0}c[c[f>>2]>>2]=c[e>>2];c[(c[f>>2]|0)+4>>2]=0;c[(c[f>>2]|0)+8>>2]=0;c[(c[f>>2]|0)+64>>2]=0;c[(c[f>>2]|0)+68>>2]=0;c[(c[f>>2]|0)+72>>2]=1024;c[(c[f>>2]|0)+76>>2]=0;e=Wb()|0;c[(c[f>>2]|0)+80>>2]=e;do if(c[(c[f>>2]|0)+80>>2]|0){c[(c[f>>2]|0)+84>>2]=0;c[(c[f>>2]|0)+88>>2]=0;c[(c[f>>2]|0)+92>>2]=0;c[(c[f>>2]|0)+96>>2]=0;c[(c[f>>2]|0)+100>>2]=0;c[(c[f>>2]|0)+104>>2]=0;e=Xb()|0;c[(c[f>>2]|0)+560>>2]=e;e=c[f>>2]|0;if(!(c[(c[f>>2]|0)+560>>2]|0)){Df(c[e+80>>2]|0);break}Yb(e)|0;c[d>>2]=c[f>>2];g=c[d>>2]|0;l=b;return g|0}while(0);Df(c[f>>2]|0);c[d>>2]=0;g=c[d>>2]|0;l=b;return g|0}function Vb(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;if(c[e>>2]&1|0)c[d>>2]=-11;else c[d>>2]=0;l=b;return c[d>>2]|0}function Wb(){var a=0,b=0,d=0,e=0;a=l;l=l+16|0;b=a+4|0;d=a;c[d>>2]=Cf(20)|0;if(!(c[d>>2]|0)){c[b>>2]=0;e=c[b>>2]|0;l=a;return e|0}else{c[c[d>>2]>>2]=0;c[(c[d>>2]|0)+4>>2]=0;c[(c[d>>2]|0)+8>>2]=0;c[(c[d>>2]|0)+12>>2]=0;c[(c[d>>2]|0)+16>>2]=0;c[b>>2]=c[d>>2];e=c[b>>2]|0;l=a;return e|0}return 0}function Xb(){var a=0,b=0,d=0,e=0,f=0,g=0;a=l;l=l+16|0;b=a+12|0;d=a+8|0;e=a+4|0;f=a;c[d>>2]=Cf(8)|0;if(!(c[d>>2]|0)){c[b>>2]=0;g=c[b>>2]|0;l=a;return g|0}c[e>>2]=Cf(12)|0;if(!(c[e>>2]|0)){Df(c[d>>2]|0);c[b>>2]=0;g=c[b>>2]|0;l=a;return g|0}c[f>>2]=Cf(12)|0;if(!(c[f>>2]|0)){Df(c[e>>2]|0);Df(c[d>>2]|0);c[b>>2]=0;g=c[b>>2]|0;l=a;return g|0}else{c[c[e>>2]>>2]=c[f>>2];c[(c[e>>2]|0)+4>>2]=0;c[(c[f>>2]|0)+4>>2]=c[e>>2];c[c[f>>2]>>2]=0;c[c[d>>2]>>2]=c[e>>2];c[(c[d>>2]|0)+4>>2]=c[f>>2];c[b>>2]=c[d>>2];g=c[b>>2]|0;l=a;return g|0}return 0}function Yb(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=(c[d>>2]|0)+112;Na(c[e>>2]|0)|0;Ka((c[e>>2]|0)+32|0,-1)|0;c[(c[e>>2]|0)+392>>2]=-1;c[(c[e>>2]|0)+396>>2]=0;c[(c[e>>2]|0)+400>>2]=0;c[(c[e>>2]|0)+404>>2]=0;c[(c[e>>2]|0)+408>>2]=0;a=(c[e>>2]|0)+416|0;c[a>>2]=0;c[a+4>>2]=0;c[(c[e>>2]|0)+432>>2]=0;c[(c[e>>2]|0)+436>>2]=0;c[(c[e>>2]|0)+440>>2]=0;l=b;return c[d>>2]|0}function Zb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=l;l=l+16|0;d=b+8|0;e=b+4|0;f=b;c[e>>2]=a;a=c[e>>2]|0;do if(c[(c[e>>2]|0)+4>>2]|0)if((pf(c[a+4>>2]|0)|0)==-1)c[d>>2]=-10;else g=10;else{h=c[a+8>>2]|0;c[f>>2]=h;if(!h){c[d>>2]=-3;break}if(!(c[(c[f>>2]|0)+32>>2]|0)){c[d>>2]=-3;break}if((va[c[(c[f>>2]|0)+32>>2]&15](c[(c[f>>2]|0)+36>>2]|0)|0)==-1)c[d>>2]=-1;else g=10}while(0);if((g|0)==10)c[d>>2]=0;l=b;return c[d>>2]|0}function _b(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;if(!(c[e>>2]|0)){c[d>>2]=-2;f=c[d>>2]|0;l=b;return f|0}$b(c[e>>2]|0)|0;bc(c[(c[e>>2]|0)+80>>2]|0,2)|0;cc(c[(c[e>>2]|0)+80>>2]|0);ec(c[(c[e>>2]|0)+560>>2]|0,3)|0;fc(c[(c[e>>2]|0)+560>>2]|0);if(c[(c[e>>2]|0)+96>>2]|0)Df(c[(c[e>>2]|0)+92>>2]|0);if(c[(c[e>>2]|0)+4>>2]|0?(of(c[(c[e>>2]|0)+4>>2]|0)|0)==-1:0){c[d>>2]=-10;f=c[d>>2]|0;l=b;return f|0}if(c[(c[e>>2]|0)+8>>2]|0){Zb(c[e>>2]|0)|0;Df(c[(c[e>>2]|0)+8>>2]|0)}Df(c[e>>2]|0);c[d>>2]=0;f=c[d>>2]|0;l=b;return f|0}function $b(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=(c[d>>2]|0)+112;La((c[e>>2]|0)+32|0)|0;Oa(c[e>>2]|0)|0;l=b;return c[d>>2]|0}function ac(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=c[d>>2];ic(c[e>>2]|0)|0;if((c[(c[e>>2]|0)+336>>2]|0)!=-1)La(c[e>>2]|0)|0;if(c[(c[e>>2]|0)+456>>2]|0)Df(c[(c[e>>2]|0)+452>>2]|0);if(!(c[(c[e>>2]|0)+504>>2]|0)){f=c[e>>2]|0;Df(f);l=b;return 0}Df(c[(c[e>>2]|0)+504>>2]|0);f=c[e>>2]|0;Df(f);l=b;return 0}function bc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[e>>2]=a;c[f>>2]=b;c[g>>2]=0;while(1){if((c[g>>2]|0)>=(c[(c[e>>2]|0)+4>>2]|0))break;va[c[f>>2]&15](c[(c[(c[e>>2]|0)+8>>2]|0)+(c[g>>2]<<2)>>2]|0)|0;c[g>>2]=(c[g>>2]|0)+1}l=d;return 0}function cc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;hc(c[d>>2]|0);Df(c[d>>2]|0);l=b;return}function dc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=c[d>>2];gc(c[e>>2]|0);l=b;return 1}function ec(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+32|0;e=d+20|0;f=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;c[e>>2]=a;c[f>>2]=b;c[i>>2]=0;c[g>>2]=c[c[c[e>>2]>>2]>>2];while(1){if((c[g>>2]|0)==(c[(c[e>>2]|0)+4>>2]|0)){k=7;break}c[j>>2]=va[c[f>>2]&15](c[(c[g>>2]|0)+8>>2]|0)|0;if((c[j>>2]|0)==-1)c[i>>2]=-1;if(!(c[j>>2]|0)){k=7;break}c[h>>2]=c[c[g>>2]>>2];c[c[(c[g>>2]|0)+4>>2]>>2]=c[c[g>>2]>>2];c[(c[c[g>>2]>>2]|0)+4>>2]=c[(c[g>>2]|0)+4>>2];Df(c[g>>2]|0);c[g>>2]=c[h>>2]}if((k|0)==7){l=d;return c[i>>2]|0}return 0}function fc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=c[c[c[d>>2]>>2]>>2];while(1){if(!(c[e>>2]|0))break;Df(c[(c[e>>2]|0)+4>>2]|0);c[e>>2]=c[c[e>>2]>>2]}Df(c[(c[d>>2]|0)+4>>2]|0);Df(c[d>>2]|0);l=b;return}function gc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;Df(c[c[d>>2]>>2]|0);Df(c[d>>2]|0);l=b;return}function hc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;if(c[(c[d>>2]|0)+8>>2]|0){Df(c[(c[d>>2]|0)+8>>2]|0);c[(c[d>>2]|0)+8>>2]=0}c[(c[d>>2]|0)+4>>2]=0;c[c[d>>2]>>2]=0;l=b;return}function ic(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b;c[d>>2]=a;bc(c[(c[d>>2]|0)+416>>2]|0,1)|0;cc(c[(c[d>>2]|0)+416>>2]|0);c[(c[d>>2]|0)+416>>2]=0;if(!(c[(c[d>>2]|0)+412>>2]|0)){e=c[d>>2]|0;f=e+412|0;c[f>>2]=0;l=b;return 0}Df(c[(c[d>>2]|0)+412>>2]|0);e=c[d>>2]|0;f=e+412|0;c[f>>2]=0;l=b;return 0}function jc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;if(!(c[d>>2]|0)){l=b;return}if(c[c[d>>2]>>2]|0)Df(c[c[d>>2]>>2]|0);if(c[(c[d>>2]|0)+4>>2]|0)Df(c[(c[d>>2]|0)+4>>2]|0);Df(c[d>>2]|0);l=b;return}function kc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=l;l=l+16|0;d=b;e=b+12|0;f=b+8|0;c[e>>2]=a;do if(c[e>>2]|0)if(c[c[e>>2]>>2]&1|0){a=d;c[a>>2]=-3;c[a+4>>2]=-1;break}else{c[f>>2]=(c[e>>2]|0)+112;a=(c[f>>2]|0)+416|0;g=c[a+4>>2]|0;h=d;c[h>>2]=c[a>>2];c[h+4>>2]=g;break}else{g=d;c[g>>2]=-2;c[g+4>>2]=-1}while(0);f=d;D=c[f+4>>2]|0;l=b;return c[f>>2]|0}function lc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=l;l=l+16|0;d=b;e=b+8|0;c[e>>2]=a;do if(c[e>>2]|0)if(c[c[e>>2]>>2]&1|0){a=d;c[a>>2]=-3;c[a+4>>2]=-1;break}else{a=(c[e>>2]|0)+112+424|0;f=c[a+4>>2]|0;g=d;c[g>>2]=c[a>>2];c[g+4>>2]=f;break}else{f=d;c[f>>2]=-2;c[f+4>>2]=-1}while(0);e=d;D=c[e+4>>2]|0;l=b;return c[e>>2]|0}function mc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;d=l;l=l+48|0;e=d+36|0;f=d+32|0;g=d+28|0;h=d+24|0;i=d+20|0;j=d+16|0;k=d+12|0;m=d+8|0;n=d+4|0;o=d;c[f>>2]=a;c[g>>2]=b;c[k>>2]=1;c[m>>2]=c[g>>2];c[n>>2]=0;c[o>>2]=0;if(!(c[f>>2]|0)){c[e>>2]=-2;p=c[e>>2]|0;l=d;return p|0}if(c[c[f>>2]>>2]&1|0){c[e>>2]=-3;p=c[e>>2]|0;l=d;return p|0}g=c[(c[f>>2]|0)+76>>2]|0;c[o>>2]=g;b=c[f>>2]|0;if(g|0){c[b+76>>2]=0;c[e>>2]=nc(c[o>>2]|0)|0;p=c[e>>2]|0;l=d;return p|0}c[h>>2]=b+112;c[o>>2]=oc(c[f>>2]|0)|0;if((c[o>>2]|0)==-18){c[e>>2]=c[o>>2];p=c[e>>2]|0;l=d;return p|0}while(1){if(!((c[o>>2]|0)!=-1&(c[o>>2]|0)!=1&(c[k>>2]|0)>0&(c[m>>2]|0)>0)){q=15;break}c[j>>2]=(c[m>>2]|0)<65536?c[m>>2]|0:65536;c[i>>2]=Pa(c[h>>2]|0,c[j>>2]|0)|0;c[k>>2]=pc(c[f>>2]|0,c[i>>2]|0,c[j>>2]|0)|0;if((c[k>>2]|0)==-10){q=11;break}if((c[k>>2]|0)<=0)continue;Qa(c[h>>2]|0,c[k>>2]|0)|0;c[m>>2]=(c[m>>2]|0)-(c[k>>2]|0);c[n>>2]=(c[n>>2]|0)+(c[k>>2]|0);c[o>>2]=oc(c[f>>2]|0)|0;if((c[o>>2]|0)==-18|(c[o>>2]|0)==-17){q=14;break}}if((q|0)==11){c[e>>2]=-10;p=c[e>>2]|0;l=d;return p|0}else if((q|0)==14){c[e>>2]=c[o>>2];p=c[e>>2]|0;l=d;return p|0}else if((q|0)==15){if((c[o>>2]|0)==-1)qc(c[f>>2]|0)|0;if(c[n>>2]|0){if((c[o>>2]|0)==-404)c[o>>2]=0;c[(c[f>>2]|0)+76>>2]=c[o>>2];c[e>>2]=c[n>>2];p=c[e>>2]|0;l=d;return p|0}switch(c[k>>2]|0){case -10:case -16:{c[e>>2]=c[k>>2];p=c[e>>2]|0;l=d;return p|0}default:{}}if((c[o>>2]|0)==-404){c[e>>2]=0;p=c[e>>2]|0;l=d;return p|0}else{c[e>>2]=nc(c[o>>2]|0)|0;p=c[e>>2]|0;l=d;return p|0}}return 0}function nc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;switch(c[e>>2]|0){case 0:{c[d>>2]=0;break}case 1:{c[d>>2]=-14;break}case -1:{c[d>>2]=-15;break}default:c[d>>2]=c[e>>2]}l=b;return c[d>>2]|0}function oc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0;b=l;l=l+160|0;d=b+148|0;e=b+144|0;f=b+140|0;g=b+136|0;h=b+132|0;i=b+128|0;j=b+124|0;k=b+120|0;m=b+24|0;n=b+104|0;o=b+96|0;p=b+16|0;q=b+92|0;r=b+88|0;s=b+84|0;t=b+8|0;u=b+80|0;v=b;c[e>>2]=a;c[f>>2]=(c[e>>2]|0)+112;c[o>>2]=0;c[i>>2]=m;c[j>>2]=m+32;a:while(1){if(c[o>>2]|0){w=76;break}b:do if((c[o>>2]|0)==0?(c[(c[f>>2]|0)+392>>2]|0)!=-1:0)do{c[k>>2]=c[(c[f>>2]|0)+392>>2];c[g>>2]=xb(c[e>>2]|0,c[k>>2]|0)|0;if((c[g>>2]|0)==0?(a=zc(c[e>>2]|0,c[k>>2]|0)|0,c[g>>2]=a,(a|0)==0):0){w=7;break a}c[h>>2]=c[g>>2];c[q>>2]=Va(c[h>>2]|0,c[i>>2]|0)|0;if((c[q>>2]|0)==-1){a=(c[g>>2]|0)+440|0;x=c[a+4>>2]|0;y=(c[(c[g>>2]|0)+364>>2]|0)-1|0;z=((y|0)<0)<<31>>31;if((x|0)<(z|0)|((x|0)==(z|0)?(c[a>>2]|0)>>>0<y>>>0:0)){w=10;break a}c[q>>2]=Va(c[h>>2]|0,c[i>>2]|0)|0;if((c[q>>2]|0)==-1){w=12;break a}c[(c[f>>2]|0)+440>>2]=1;c[(c[f>>2]|0)+436>>2]=c[(c[e>>2]|0)+64>>2];c[(c[f>>2]|0)+444>>2]=1}if((c[q>>2]|0)<=0)break b;y=(c[g>>2]|0)+440|0;a=y;z=Lf(c[a>>2]|0,c[a+4>>2]|0,1,0)|0;a=y;c[a>>2]=z;c[a+4>>2]=D;a=(c[i>>2]|0)+16|0;z=c[a+4>>2]|0;y=p;c[y>>2]=c[a>>2];c[y+4>>2]=z;c[r>>2]=Db(c[e>>2]|0,c[k>>2]|0)|0;do if(!((c[r>>2]|0)<0|(c[r>>2]|0)>=15)){if(((c[r>>2]|0)==6?1:(c[(c[g>>2]|0)+448>>2]|0)==0)?c[c[e>>2]>>2]&32|0:0)Ac(c[e>>2]|0,c[i>>2]|0,c[k>>2]|0,0)|0;if(!(c[c[e>>2]>>2]&32)){z=p;y=c[z+4>>2]|0;a=(c[f>>2]|0)+424|0;c[a>>2]=c[z>>2];c[a+4>>2]=y;break}y=p;a=Bc(c[r>>2]|0,c[y>>2]|0,c[y+4>>2]|0,c[g>>2]|0,c[i>>2]|0)|0;y=(c[f>>2]|0)+424|0;c[y>>2]=a;c[y+4>>2]=D;y=p;if(((c[y>>2]|0)!=-1?1:(c[y+4>>2]|0)!=-1)?(y=(c[f>>2]|0)+424|0,a=c[y+4>>2]|0,z=p,x=c[z+4>>2]|0,(a|0)<(x|0)|((a|0)==(x|0)?(c[y>>2]|0)>>>0<(c[z>>2]|0)>>>0:0)):0){z=p;y=c[z+4>>2]|0;x=(c[f>>2]|0)+424|0;c[x>>2]=c[z>>2];c[x+4>>2]=y}}else{y=p;x=c[y+4>>2]|0;z=(c[f>>2]|0)+424|0;c[z>>2]=c[y>>2];c[z+4>>2]=x}while(0);x=(c[f>>2]|0)+424|0;z=c[x+4>>2]|0;y=(c[g>>2]|0)+488|0;c[y>>2]=c[x>>2];c[y+4>>2]=z;if(!(!(c[(c[e>>2]|0)+88>>2]|0)?!(c[(c[g>>2]|0)+448>>2]|0):0))w=27;if((w|0)==27?(w=0,z=(c[f>>2]|0)+424|0,(c[z>>2]|0)!=-1?1:(c[z+4>>2]|0)!=-1):0){z=(c[f>>2]|0)+424|0;y=Cc(c[e>>2]|0,c[k>>2]|0,c[z>>2]|0,c[z+4>>2]|0)|0;z=(c[f>>2]|0)+416|0;c[z>>2]=y;c[z+4>>2]=D}z=(c[g>>2]|0)+440|0;if((c[z>>2]|0)==1&(c[z+4>>2]|0)==0)Dc(c[e>>2]|0,c[g>>2]|0,c[k>>2]|0,c[i>>2]|0)|0;z=(c[f>>2]|0)+424|0;y=c[z+4>>2]|0;x=c[j>>2]|0;c[x>>2]=c[z>>2];c[x+4>>2]=y;c[(c[j>>2]|0)+8>>2]=c[(c[f>>2]|0)+436>>2];c[(c[j>>2]|0)+12>>2]=c[(c[e>>2]|0)+64>>2];c[(c[j>>2]|0)+16>>2]=c[(c[f>>2]|0)+440>>2];c[(c[j>>2]|0)+20>>2]=c[(c[f>>2]|0)+444>>2];do if(c[c[e>>2]>>2]&32|0){y=(c[f>>2]|0)+424|0;x=c[e>>2]|0;if((c[y>>2]|0)==-1?(c[y+4>>2]|0)==-1:0){c[s>>2]=Ec(x,m,c[k>>2]|0,c[g>>2]|0,c[f>>2]|0)|0;Fc(c[(c[e>>2]|0)+560>>2]|0,c[s>>2]|0)|0;w=45;break}if(!(Gc(c[x+560>>2]|0)|0)){x=(c[g>>2]|0)+488|0;y=c[x+4>>2]|0;z=t;c[z>>2]=c[x>>2];c[z+4>>2]=y;c[(c[g>>2]|0)+508>>2]=c[i>>2];Ic(c[(c[e>>2]|0)+560>>2]|0,4);c[(c[e>>2]|0)+76>>2]=0;if((ec(c[(c[e>>2]|0)+560>>2]|0,5)|0)==-1){w=36;break a}y=(c[e>>2]|0)+76|0;if((c[(c[e>>2]|0)+76>>2]|0)>0){c[o>>2]=c[y>>2];c[(c[e>>2]|0)+76>>2]=0;break}c[y>>2]=0;y=t;z=c[y+4>>2]|0;x=(c[g>>2]|0)+488|0;c[x>>2]=c[y>>2];c[x+4>>2]=z;if(!(Gc(c[(c[e>>2]|0)+560>>2]|0)|0)){c[u>>2]=Ec(c[e>>2]|0,m,c[k>>2]|0,c[g>>2]|0,c[f>>2]|0)|0;Fc(c[(c[e>>2]|0)+560>>2]|0,c[u>>2]|0)|0;w=45}else w=41}else w=41}else w=41;while(0);do if((w|0)==41){w=0;if(c[(c[g>>2]|0)+468>>2]|0){c[o>>2]=wa[c[(c[g>>2]|0)+468>>2]&15](c[e>>2]|0,m,c[k>>2]|0,c[(c[g>>2]|0)+472>>2]|0)|0;w=45;break}if(c[(c[f>>2]|0)+396>>2]|0){c[o>>2]=wa[c[(c[f>>2]|0)+396>>2]&15](c[e>>2]|0,m,c[k>>2]|0,c[(c[f>>2]|0)+400>>2]|0)|0;w=45}else w=45}while(0);if((w|0)==45){w=0;if((c[(c[f>>2]|0)+436>>2]|0)==(c[(c[e>>2]|0)+64>>2]|0)){z=(c[f>>2]|0)+444|0;c[z>>2]=(c[z>>2]|0)+1}else{c[(c[f>>2]|0)+436>>2]=c[(c[e>>2]|0)+64>>2];c[(c[f>>2]|0)+444>>2]=1}c[(c[f>>2]|0)+440>>2]=1;if(!(c[(c[i>>2]|0)+8>>2]|0))c[(c[g>>2]|0)+420>>2]=1}}while(!(c[o>>2]|0));while(0);if((c[o>>2]|0)==1|(c[o>>2]|0)==-1|(c[o>>2]|0)==-17){w=51;break}if((Kc(c[e>>2]|0,n)|0)<0){w=53;break}c[k>>2]=Ja(n)|0;c[(c[f>>2]|0)+392>>2]=c[k>>2];c[g>>2]=xb(c[e>>2]|0,c[k>>2]|0)|0;z=c[e>>2]|0;x=c[k>>2]|0;if(!(c[g>>2]|0)){y=zc(z,x)|0;c[g>>2]=y;if(!y){w=56;break}Lc(c[e>>2]|0,n,c[k>>2]|0)|0;if(c[c[e>>2]>>2]&32|0)Mc(c[e>>2]|0,n,c[k>>2]|0,0)|0}else if((Db(z,x)|0)==9)Lc(c[e>>2]|0,n,c[k>>2]|0)|0;c[h>>2]=c[g>>2];x=Ia(n)|0;z=v;c[z>>2]=x;c[z+4>>2]=D;z=v;x=c[z+4>>2]|0;y=(c[g>>2]|0)+496|0;c[y>>2]=c[z>>2];c[y+4>>2]=x;if(c[(c[e>>2]|0)+88>>2]|0){x=v;if((c[x>>2]|0)!=-1?1:(c[x+4>>2]|0)!=-1)w=64;else w=65}else{x=v;if((c[(c[g>>2]|0)+448>>2]|0)!=0&((c[x>>2]|0)!=-1?1:(c[x+4>>2]|0)!=-1))w=64;else w=65}if((w|0)==64){w=0;x=v;y=Cc(c[e>>2]|0,c[k>>2]|0,c[x>>2]|0,c[x+4>>2]|0)|0;A=c[f>>2]|0;B=y;C=D;w=67}else if((w|0)==65?(w=0,y=v,(c[y>>2]|0)==0&(c[y+4>>2]|0)==0):0){A=c[f>>2]|0;B=0;C=0;w=67}if((w|0)==67){w=0;y=A+416|0;c[y>>2]=B;c[y+4>>2]=C}if(!(c[(c[g>>2]|0)+476>>2]|0)){if(c[(c[f>>2]|0)+404>>2]|0)c[o>>2]=wa[c[(c[f>>2]|0)+404>>2]&15](c[e>>2]|0,n,c[k>>2]|0,c[(c[f>>2]|0)+408>>2]|0)|0}else c[o>>2]=wa[c[(c[g>>2]|0)+476>>2]&15](c[e>>2]|0,n,c[k>>2]|0,c[(c[g>>2]|0)+480>>2]|0)|0;Sa(c[h>>2]|0,n)|0;y=(Ga(n)|0)!=0;x=(c[f>>2]|0)+440|0;if(!y){c[x>>2]=1;c[(c[f>>2]|0)+436>>2]=c[(c[e>>2]|0)+64>>2];c[(c[f>>2]|0)+444>>2]=0;continue}if((c[x>>2]|0)==-1)continue;x=(c[f>>2]|0)+440|0;c[x>>2]=(c[x>>2]|0)+1}if((w|0)==7){c[d>>2]=-18;E=c[d>>2]|0;l=b;return E|0}else if((w|0)==10){c[d>>2]=-17;E=c[d>>2]|0;l=b;return E|0}else if((w|0)==12){c[d>>2]=-17;E=c[d>>2]|0;l=b;return E|0}else if((w|0)==36){c[d>>2]=-17;E=c[d>>2]|0;l=b;return E|0}else if((w|0)==51){c[d>>2]=c[o>>2];E=c[d>>2]|0;l=b;return E|0}else if((w|0)==53){c[d>>2]=-404;E=c[d>>2]|0;l=b;return E|0}else if((w|0)==56){c[d>>2]=-18;E=c[d>>2]|0;l=b;return E|0}else if((w|0)==76){c[d>>2]=c[o>>2];E=c[d>>2]|0;l=b;return E|0}return 0}function pc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;d=c[g>>2]|0;do if(c[(c[g>>2]|0)+4>>2]|0){b=zf(c[d+4>>2]|0)|0;a=jf(b,c[h>>2]|0,c[i>>2]|0)|0;c[k>>2]=a;if((a|0)==0?rf(c[(c[g>>2]|0)+4>>2]|0)|0:0){c[f>>2]=-10;m=c[f>>2]|0;l=e;return m|0}}else{a=c[d+8>>2]|0;c[j>>2]=a;if(!a){c[f>>2]=-3;m=c[f>>2]|0;l=e;return m|0}if(c[c[j>>2]>>2]|0){c[k>>2]=ta[c[c[j>>2]>>2]&7](c[(c[j>>2]|0)+4>>2]|0,c[h>>2]|0,c[i>>2]|0)|0;break}c[f>>2]=-1;m=c[f>>2]|0;l=e;return m|0}while(0);c[f>>2]=c[k>>2];m=c[f>>2]|0;l=e;return m|0}function qc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;do if(!(c[e>>2]|0))c[d>>2]=-2;else{if(c[c[e>>2]>>2]&1|0){c[d>>2]=-3;break}rc(c[e>>2]|0);if(c[(c[e>>2]|0)+4>>2]|0?(sc(c[e>>2]|0,c[(c[e>>2]|0)+64>>2]|0,-1,-1,0)|0)<0:0){c[d>>2]=-10;break}c[d>>2]=0}while(0);l=b;return c[d>>2]|0}function rc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;bc(c[(c[d>>2]|0)+80>>2]|0,6)|0;l=b;return}function sc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=l;l=l+32|0;h=g+16|0;i=g+12|0;j=g;k=g+8|0;c[h>>2]=a;c[i>>2]=b;b=j;c[b>>2]=d;c[b+4>>2]=e;c[k>>2]=f;rc(c[h>>2]|0);f=j;j=tc(c[h>>2]|0,c[i>>2]|0,c[f>>2]|0,c[f+4>>2]|0,c[k>>2]|0)|0;l=g;return j|0}function tc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;g=l;l=l+32|0;h=g+28|0;i=g+24|0;j=g+20|0;k=g;m=g+16|0;n=g+12|0;o=g+8|0;c[i>>2]=a;c[j>>2]=b;b=k;c[b>>2]=d;c[b+4>>2]=e;c[m>>2]=f;c[n>>2]=(c[i>>2]|0)+112;c[o>>2]=uc(c[i>>2]|0,c[j>>2]|0,c[m>>2]|0)|0;if((c[o>>2]|0)==-1){c[h>>2]=-1;p=c[h>>2]|0;l=g;return p|0}c[(c[i>>2]|0)+64>>2]=c[o>>2];i=k;if((c[i>>2]|0)!=-1?1:(c[i+4>>2]|0)!=-1){i=k;k=c[i+4>>2]|0;m=(c[n>>2]|0)+416|0;c[m>>2]=c[i>>2];c[m+4>>2]=k}c[h>>2]=c[o>>2];p=c[h>>2]|0;l=g;return p|0}function uc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=(c[g>>2]|0)+112;if((vc(c[g>>2]|0,c[h>>2]|0,c[i>>2]|0)|0)==-1){c[f>>2]=-1;m=c[f>>2]|0;l=e;return m|0}else{c[k>>2]=wc(c[g>>2]|0)|0;c[(c[g>>2]|0)+64>>2]=c[k>>2];Ta(c[j>>2]|0)|0;bc(c[(c[g>>2]|0)+80>>2]|0,7)|0;c[f>>2]=c[k>>2];m=c[f>>2]|0;l=e;return m|0}return 0}function vc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;d=c[g>>2]|0;if(c[(c[g>>2]|0)+4>>2]|0){if((sf(c[d+4>>2]|0,c[h>>2]|0,c[i>>2]|0)|0)==-1){ve()|0;c[f>>2]=-10;k=c[f>>2]|0;l=e;return k|0}}else{g=c[d+8>>2]|0;c[j>>2]=g;if(!g){c[f>>2]=-3;k=c[f>>2]|0;l=e;return k|0}if(!(c[(c[j>>2]|0)+16>>2]|0)){c[f>>2]=-1;k=c[f>>2]|0;l=e;return k|0}if((ta[c[(c[j>>2]|0)+16>>2]&7](c[(c[j>>2]|0)+20>>2]|0,c[h>>2]|0,c[i>>2]|0)|0)==-1){c[f>>2]=-1;k=c[f>>2]|0;l=e;return k|0}}c[f>>2]=0;k=c[f>>2]|0;l=e;return k|0}function wc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=l;l=l+16|0;d=b+12|0;e=b+8|0;f=b+4|0;g=b;c[e>>2]=a;a=c[e>>2]|0;do if(c[(c[e>>2]|0)+4>>2]|0){h=Af(c[a+4>>2]|0)|0;c[g>>2]=h;if((h|0)==-1){ve()|0;c[d>>2]=-1}else i=10}else{h=c[a+8>>2]|0;c[f>>2]=h;if(!h){c[d>>2]=-3;break}if(!(c[(c[f>>2]|0)+24>>2]|0)){c[d>>2]=-1;break}h=va[c[(c[f>>2]|0)+24>>2]&15](c[(c[f>>2]|0)+28>>2]|0)|0;c[g>>2]=h;if((h|0)==-1)c[d>>2]=-1;else i=10}while(0);if((i|0)==10)c[d>>2]=c[g>>2];l=b;return c[d>>2]|0}function xc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;a=(c[d>>2]|0)+488|0;c[a>>2]=-1;c[a+4>>2]=-1;l=b;return 0}function yc(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=c[d>>2];if((c[(c[e>>2]|0)+336>>2]|0)==-1){l=b;return 0}Ua(c[e>>2]|0)|0;l=b;return 0}function zc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=Cf(512)|0;if(!(c[h>>2]|0)){c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}Ka(c[h>>2]|0,c[g>>2]|0)|0;g=(gd(c[h>>2]|0)|0)==-1;b=c[h>>2]|0;if(g){Df(b);c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}else{c[b+360>>2]=15;c[(c[h>>2]|0)+364>>2]=3;c[(c[h>>2]|0)+368>>2]=0;b=(c[h>>2]|0)+376|0;c[b>>2]=1;c[b+4>>2]=0;b=(c[h>>2]|0)+384|0;c[b>>2]=1;c[b+4>>2]=0;b=(c[h>>2]|0)+392|0;c[b>>2]=0;c[b+4>>2]=0;b=(c[h>>2]|0)+400|0;c[b>>2]=0;c[b+4>>2]=0;c[(c[h>>2]|0)+408>>2]=0;c[(c[h>>2]|0)+420>>2]=0;c[(c[h>>2]|0)+424>>2]=1;c[(c[h>>2]|0)+428>>2]=0;b=(c[h>>2]|0)+432|0;c[b>>2]=0;c[b+4>>2]=0;b=(c[h>>2]|0)+440|0;c[b>>2]=-1;c[b+4>>2]=-1;c[(c[h>>2]|0)+448>>2]=0;c[(c[h>>2]|0)+452>>2]=0;c[(c[h>>2]|0)+456>>2]=0;c[(c[h>>2]|0)+460>>2]=0;c[(c[h>>2]|0)+464>>2]=0;c[(c[h>>2]|0)+468>>2]=0;c[(c[h>>2]|0)+472>>2]=0;c[(c[h>>2]|0)+476>>2]=0;c[(c[h>>2]|0)+480>>2]=0;c[(c[h>>2]|0)+504>>2]=0;$c(c[(c[f>>2]|0)+80>>2]|0,c[h>>2]|0)|0;c[e>>2]=c[h>>2];i=c[e>>2]|0;l=d;return i|0}return 0}function Ac(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=0;c[m>>2]=Db(c[h>>2]|0,c[j>>2]|0)|0;if((c[m>>2]|0)<0|(c[m>>2]|0)>=15){c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}if((c[m>>2]|0)==6?(c[(c[i>>2]|0)+8>>2]|0)==0:0){c[g>>2]=Nc(c[h>>2]|0,c[j>>2]|0,c[c[i>>2]>>2]|0,c[(c[i>>2]|0)+4>>2]|0,c[k>>2]|0)|0;n=c[g>>2]|0;l=f;return n|0}c[g>>2]=ya[c[1032+((c[m>>2]|0)*24|0)+12>>2]&31](c[h>>2]|0,c[j>>2]|0,c[c[i>>2]>>2]|0,c[(c[i>>2]|0)+4>>2]|0,c[k>>2]|0)|0;n=c[g>>2]|0;l=f;return n|0}function Bc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=l;l=l+48|0;h=g+16|0;i=g+32|0;j=g+8|0;k=g+28|0;m=g+24|0;n=g;c[i>>2]=a;a=j;c[a>>2]=b;c[a+4>>2]=d;c[k>>2]=e;c[m>>2]=f;if(c[1032+((c[i>>2]|0)*24|0)+16>>2]|0){f=j;e=wa[c[1032+((c[i>>2]|0)*24|0)+16>>2]&15](c[f>>2]|0,c[f+4>>2]|0,c[k>>2]|0,c[m>>2]|0)|0;m=n;c[m>>2]=e;c[m+4>>2]=D;m=n;n=c[m+4>>2]|0;e=h;c[e>>2]=c[m>>2];c[e+4>>2]=n;o=h;p=o;q=c[p>>2]|0;r=o+4|0;s=r;t=c[s>>2]|0;D=t;l=g;return q|0}else{n=j;j=c[n+4>>2]|0;e=h;c[e>>2]=c[n>>2];c[e+4>>2]=j;o=h;p=o;q=c[p>>2]|0;r=o+4|0;s=r;t=c[s>>2]|0;D=t;l=g;return q|0}return 0}function Cc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+32|0;g=f+8|0;h=f+24|0;i=f+20|0;j=f;k=f+16|0;c[h>>2]=a;c[i>>2]=b;b=j;c[b>>2]=d;c[b+4>>2]=e;do if(!(c[h>>2]|0)){e=g;c[e>>2]=-2;c[e+4>>2]=-1}else{e=j;if((c[e>>2]|0)==-1?(c[e+4>>2]|0)==-1:0){e=g;c[e>>2]=-1;c[e+4>>2]=-1;break}e=c[h>>2]|0;if((c[i>>2]|0)==-1){if(c[e+88>>2]|0){b=j;d=ya[c[(c[h>>2]|0)+88>>2]&31](c[h>>2]|0,c[i>>2]|0,c[b>>2]|0,c[b+4>>2]|0,c[(c[h>>2]|0)+92>>2]|0)|0;b=g;c[b>>2]=d;c[b+4>>2]=D;break}}else{c[k>>2]=xb(e,c[i>>2]|0)|0;if(!(c[k>>2]|0)){e=g;c[e>>2]=-1;c[e+4>>2]=-1;break}if(c[(c[k>>2]|0)+448>>2]|0){e=j;b=ya[c[(c[k>>2]|0)+448>>2]&31](c[h>>2]|0,c[i>>2]|0,c[e>>2]|0,c[e+4>>2]|0,c[(c[k>>2]|0)+452>>2]|0)|0;e=g;c[e>>2]=b;c[e+4>>2]=D;break}if(c[(c[h>>2]|0)+88>>2]|0){e=j;b=ya[c[(c[h>>2]|0)+88>>2]&31](c[h>>2]|0,c[i>>2]|0,c[e>>2]|0,c[e+4>>2]|0,c[(c[h>>2]|0)+92>>2]|0)|0;e=g;c[e>>2]=b;c[e+4>>2]=D;break}}e=g;c[e>>2]=-1;c[e+4>>2]=-1}while(0);h=g;D=c[h+4>>2]|0;l=f;return c[h>>2]|0}function Dc(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;g=l;l=l+32|0;h=g+20|0;i=g+16|0;j=g+12|0;k=g+8|0;m=g+4|0;n=g;c[h>>2]=a;c[i>>2]=b;c[j>>2]=e;c[k>>2]=f;c[m>>2]=-1;c[n>>2]=-1;switch(c[(c[i>>2]|0)+360>>2]|0){case 1:{if((c[(c[k>>2]|0)+4>>2]|0)>7?(De(c[c[k>>2]>>2]|0,2728,7)|0)==0:0)c[m>>2]=7;break}case 3:case 2:{c[m>>2]=0;break}case 0:{if((c[(c[k>>2]|0)+4>>2]|0)>7?(De(c[c[k>>2]>>2]|0,2736,7)|0)==0:0)c[m>>2]=7;break}case 11:{if((c[(c[k>>2]|0)+4>>2]|0)>9?(De(c[c[k>>2]>>2]|0,2744,8)|0)==0:0)c[m>>2]=9;break}case 8:{if((c[(c[k>>2]|0)+4>>2]|0)>4?((d[c[c[k>>2]>>2]>>0]|0)&7|0)==4:0){c[n>>2]=((d[(c[c[k>>2]>>2]|0)+1>>0]|0)<<16)+((d[(c[c[k>>2]>>2]|0)+2>>0]|0)<<8)+(d[(c[c[k>>2]>>2]|0)+3>>0]|0);c[m>>2]=4}break}case 13:{if((c[(c[k>>2]|0)+4>>2]|0)>8?(De(c[c[k>>2]>>2]|0,2753,8)|0)==0:0)c[m>>2]=8;break}case 14:{if((c[(c[k>>2]|0)+4>>2]|0)>7?(De(c[c[k>>2]>>2]|0,2762,7)|0)==0:0)c[m>>2]=7;break}default:{}}if((c[n>>2]|0)==-1)c[n>>2]=(c[(c[k>>2]|0)+4>>2]|0)-(c[m>>2]|0);if((c[m>>2]|0)<0){l=g;return 0}Tc(c[h>>2]|0,c[j>>2]|0,(c[c[k>>2]>>2]|0)+(c[m>>2]|0)|0,c[n>>2]|0)|0;l=g;return 0}function Ec(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;g=l;l=l+32|0;h=g+28|0;i=g+24|0;j=g+20|0;k=g+16|0;m=g+12|0;n=g+8|0;o=g+4|0;p=g;c[i>>2]=a;c[j>>2]=b;c[k>>2]=d;c[m>>2]=e;c[n>>2]=f;c[p>>2]=c[j>>2];f=Cf(72)|0;c[o>>2]=f;if(!f){c[h>>2]=0;q=c[h>>2]|0;l=g;return q|0}f=c[o>>2]|0;e=c[j>>2]|0;j=f+56|0;do{c[f>>2]=c[e>>2];f=f+4|0;e=e+4|0}while((f|0)<(j|0));e=Cf(c[(c[p>>2]|0)+4>>2]|0)|0;c[c[o>>2]>>2]=e;f=c[o>>2]|0;if(!e){Df(f);c[h>>2]=0;q=c[h>>2]|0;l=g;return q|0}else{Wf(c[f>>2]|0,c[c[p>>2]>>2]|0,c[(c[p>>2]|0)+4>>2]|0)|0;c[(c[o>>2]|0)+56>>2]=c[m>>2];c[(c[o>>2]|0)+68>>2]=c[k>>2];c[(c[o>>2]|0)+60>>2]=c[n>>2];c[(c[o>>2]|0)+64>>2]=c[i>>2];c[h>>2]=c[o>>2];q=c[h>>2]|0;l=g;return q|0}return 0}function Fc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;if(!(c[f>>2]|0)){c[e>>2]=-1;i=c[e>>2]|0;l=d;return i|0}c[h>>2]=Cf(12)|0;if(!(c[h>>2]|0)){c[e>>2]=-1;i=c[e>>2]|0;l=d;return i|0}else{c[(c[h>>2]|0)+8>>2]=c[g>>2];c[c[h>>2]>>2]=c[(c[f>>2]|0)+4>>2];c[(c[h>>2]|0)+4>>2]=c[(c[(c[f>>2]|0)+4>>2]|0)+4>>2];c[c[(c[h>>2]|0)+4>>2]>>2]=c[h>>2];c[(c[c[h>>2]>>2]|0)+4>>2]=c[h>>2];c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}return 0}function Gc(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=a;l=b;return (c[c[c[d>>2]>>2]>>2]|0)==(c[(c[d>>2]|0)+4>>2]|0)|0}function Hc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+16|0;d=b+12|0;e=b+8|0;f=b+4|0;g=b;c[e>>2]=a;c[f>>2]=c[e>>2];e=(c[f>>2]|0)+32|0;do if(((c[e>>2]|0)==-1?(c[e+4>>2]|0)==-1:0)?(a=(c[(c[f>>2]|0)+56>>2]|0)+488|0,(c[a>>2]|0)!=-1?1:(c[a+4>>2]|0)!=-1):0){c[g>>2]=Db(c[(c[f>>2]|0)+64>>2]|0,c[(c[f>>2]|0)+68>>2]|0)|0;if(!((c[g>>2]|0)<0|(c[g>>2]|0)>=15)){a=(c[(c[f>>2]|0)+56>>2]|0)+488|0;h=Sc(c[g>>2]|0,c[a>>2]|0,c[a+4>>2]|0,c[(c[f>>2]|0)+56>>2]|0,c[f>>2]|0,c[(c[(c[f>>2]|0)+56>>2]|0)+508>>2]|0)|0;a=(c[f>>2]|0)+32|0;c[a>>2]=h;c[a+4>>2]=D;a=(c[f>>2]|0)+32|0;h=c[a+4>>2]|0;i=(c[(c[f>>2]|0)+56>>2]|0)+488|0;c[i>>2]=c[a>>2];c[i+4>>2]=h;c[(c[(c[f>>2]|0)+56>>2]|0)+508>>2]=c[f>>2];break}c[d>>2]=0;j=c[d>>2]|0;l=b;return j|0}while(0);c[d>>2]=1;j=c[d>>2]|0;l=b;return j|0}function Ic(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[e>>2]=a;c[f>>2]=b;c[g>>2]=c[(c[(c[e>>2]|0)+4>>2]|0)+4>>2];while(1){if((c[g>>2]|0)==(c[c[e>>2]>>2]|0)){h=5;break}if(!(va[c[f>>2]&15](c[(c[g>>2]|0)+8>>2]|0)|0)){h=5;break}c[g>>2]=c[(c[g>>2]|0)+4>>2]}if((h|0)==5){l=d;return}}function Jc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=l;l=l+32|0;d=b+28|0;e=b+24|0;f=b+20|0;g=b+8|0;h=b;i=b+16|0;c[e>>2]=a;c[f>>2]=c[e>>2];e=(c[f>>2]|0)+32|0;if((c[e>>2]|0)==-1?(c[e+4>>2]|0)==-1:0){c[d>>2]=0;j=c[d>>2]|0;l=b;return j|0}e=(c[(c[f>>2]|0)+60>>2]|0)+424|0;a=c[e+4>>2]|0;k=g;c[k>>2]=c[e>>2];c[k+4>>2]=a;a=(c[(c[f>>2]|0)+60>>2]|0)+416|0;k=c[a+4>>2]|0;e=h;c[e>>2]=c[a>>2];c[e+4>>2]=k;k=(c[f>>2]|0)+32|0;e=c[k+4>>2]|0;a=(c[(c[f>>2]|0)+60>>2]|0)+424|0;c[a>>2]=c[k>>2];c[a+4>>2]=e;e=(c[f>>2]|0)+32|0;a=Cc(c[(c[f>>2]|0)+64>>2]|0,c[(c[f>>2]|0)+68>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0;e=(c[(c[f>>2]|0)+60>>2]|0)+416|0;c[e>>2]=a;c[e+4>>2]=D;e=c[f>>2]|0;if(c[(c[(c[f>>2]|0)+56>>2]|0)+468>>2]|0){a=wa[c[(c[e+56>>2]|0)+468>>2]&15](c[(c[f>>2]|0)+64>>2]|0,c[f>>2]|0,c[(c[f>>2]|0)+68>>2]|0,c[(c[(c[f>>2]|0)+56>>2]|0)+472>>2]|0)|0;c[i>>2]=a;if((a|0)<0?(c[(c[(c[f>>2]|0)+64>>2]|0)+76>>2]=c[i>>2],(c[i>>2]|0)==-1):0){c[d>>2]=-1;j=c[d>>2]|0;l=b;return j|0}}else if((c[(c[e+60>>2]|0)+396>>2]|0?(e=wa[c[(c[(c[f>>2]|0)+60>>2]|0)+396>>2]&15](c[(c[f>>2]|0)+64>>2]|0,c[f>>2]|0,c[(c[f>>2]|0)+68>>2]|0,c[(c[(c[f>>2]|0)+60>>2]|0)+400>>2]|0)|0,c[i>>2]=e,(e|0)<0):0)?(c[(c[(c[f>>2]|0)+64>>2]|0)+76>>2]=c[i>>2],(c[i>>2]|0)==-1):0){c[d>>2]=-1;j=c[d>>2]|0;l=b;return j|0}i=g;g=c[i+4>>2]|0;e=(c[(c[f>>2]|0)+60>>2]|0)+424|0;c[e>>2]=c[i>>2];c[e+4>>2]=g;g=h;h=c[g+4>>2]|0;e=(c[(c[f>>2]|0)+60>>2]|0)+416|0;c[e>>2]=c[g>>2];c[e+4>>2]=h;gc(c[f>>2]|0);c[d>>2]=1;j=c[d>>2]|0;l=b;return j|0}function Kc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;d=l;l=l+32|0;e=d+20|0;f=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=(c[f>>2]|0)+112;c[j>>2]=0;b=(c[f>>2]|0)+64|0;c[b>>2]=(c[b>>2]|0)+(c[(c[h>>2]|0)+432>>2]|0);while(1){c[i>>2]=Ra(c[h>>2]|0,c[g>>2]|0)|0;if(!(c[i>>2]|0)){k=3;break}b=c[i>>2]|0;if((c[i>>2]|0)<0){a=(c[f>>2]|0)+64|0;c[a>>2]=(c[a>>2]|0)+(0-b)}else{c[(c[h>>2]|0)+432>>2]=b;c[j>>2]=1}if(!((c[j>>2]|0)!=0^1)){k=8;break}}if((k|0)==3){c[e>>2]=-2;m=c[e>>2]|0;l=d;return m|0}else if((k|0)==8){c[e>>2]=c[(c[f>>2]|0)+64>>2];m=c[e>>2]|0;l=d;return m|0}return 0}function Lc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;d=Qc(c[f>>2]|0,c[h>>2]|0,c[(c[g>>2]|0)+8>>2]|0,c[(c[g>>2]|0)+12>>2]|0)|0;l=e;return d|0}function Mc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=0;c[m>>2]=Db(c[h>>2]|0,c[j>>2]|0)|0;if((c[m>>2]|0)<0|(c[m>>2]|0)>=15){c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}if((c[m>>2]|0)==6?(Ha(c[i>>2]|0)|0)==0:0){c[g>>2]=Nc(c[h>>2]|0,c[j>>2]|0,c[(c[i>>2]|0)+8>>2]|0,c[(c[i>>2]|0)+12>>2]|0,c[k>>2]|0)|0;n=c[g>>2]|0;l=f;return n|0}c[g>>2]=ya[c[1032+((c[m>>2]|0)*24|0)+12>>2]&31](c[h>>2]|0,c[j>>2]|0,c[(c[i>>2]|0)+8>>2]|0,c[(c[i>>2]|0)+12>>2]|0,c[k>>2]|0)|0;n=c[g>>2]|0;l=f;return n|0}function Nc(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=l;l=l+64|0;i=h+52|0;j=h+48|0;k=h+44|0;m=h+40|0;n=h+36|0;o=h+28|0;p=h+24|0;q=h+8|0;r=h;s=h+20|0;t=h+16|0;c[j>>2]=a;c[k>>2]=b;c[m>>2]=e;c[n>>2]=f;c[h+32>>2]=g;c[o>>2]=c[m>>2];m=q;c[m>>2]=0;c[m+4>>2]=0;m=r;c[m>>2]=0;c[m+4>>2]=0;if((c[n>>2]|0)<48){c[i>>2]=0;u=c[i>>2]|0;l=h;return u|0}c[p>>2]=Qb((c[o>>2]|0)+12|0)|0;if(Oc(c[j>>2]|0,c[p>>2]|0)|0){c[i>>2]=1;u=c[i>>2]|0;l=h;return u|0}else{n=Rb((c[o>>2]|0)+20|0)|0;m=q;c[m>>2]=n;c[m+4>>2]=D;m=Rb((c[o>>2]|0)+28|0)|0;n=r;c[n>>2]=m;c[n+4>>2]=D;c[s>>2]=d[(c[o>>2]|0)+48>>0];o=c[j>>2]|0;n=c[p>>2]|0;m=q;q=c[m>>2]|0;g=c[m+4>>2]|0;m=r;r=Uf(1e3,0,c[m>>2]|0,c[m+4>>2]|0)|0;ub(o,n,q,g,r,D)|0;vb(c[j>>2]|0,c[p>>2]|0,c[s>>2]|0)|0;c[t>>2]=Pc(c[j>>2]|0,c[k>>2]|0)|0;wb(c[j>>2]|0,c[k>>2]|0,(c[t>>2]|0)+1|0)|0;c[i>>2]=1;u=c[i>>2]|0;l=h;return u|0}return 0}function Oc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;do if(!(c[(c[f>>2]|0)+88>>2]|0)){c[h>>2]=xb(c[f>>2]|0,c[g>>2]|0)|0;if(!(c[h>>2]|0)){c[e>>2]=-20;break}if(c[(c[h>>2]|0)+448>>2]|0){c[e>>2]=1;break}else{c[e>>2]=0;break}}else c[e>>2]=1;while(0);l=d;return c[e>>2]|0}function Pc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;if(!(c[f>>2]|0)){c[e>>2]=-2;i=c[e>>2]|0;l=d;return i|0}c[h>>2]=xb(c[f>>2]|0,c[g>>2]|0)|0;if(!(c[h>>2]|0)){c[e>>2]=-20;i=c[e>>2]|0;l=d;return i|0}else{c[e>>2]=c[(c[h>>2]|0)+364>>2];i=c[e>>2]|0;l=d;return i|0}return 0}function Qc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;f=l;l=l+32|0;g=f+24|0;h=f+20|0;i=f+16|0;j=f+12|0;k=f+8|0;m=f+4|0;n=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=0;while(1){if((c[m>>2]|0)>=15){o=7;break}c[n>>2]=1032+((c[m>>2]|0)*24|0);if((c[k>>2]|0)>=(c[(c[n>>2]|0)+4>>2]|0)?(De(c[j>>2]|0,c[c[n>>2]>>2]|0,c[(c[n>>2]|0)+4>>2]|0)|0)==0:0){o=5;break}c[m>>2]=(c[m>>2]|0)+1}if((o|0)==5){Rc(c[h>>2]|0,c[i>>2]|0,c[m>>2]|0)|0;c[g>>2]=1;p=c[g>>2]|0;l=f;return p|0}else if((o|0)==7){Rc(c[h>>2]|0,c[i>>2]|0,15)|0;c[g>>2]=0;p=c[g>>2]|0;l=f;return p|0}return 0}function Rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=xb(c[g>>2]|0,c[h>>2]|0)|0;if(!(c[j>>2]|0)){c[f>>2]=-20;k=c[f>>2]|0;l=e;return k|0}else{c[(c[j>>2]|0)+360>>2]=c[i>>2];c[f>>2]=0;k=c[f>>2]|0;l=e;return k|0}return 0}function Sc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=l;l=l+32|0;i=h+8|0;j=h+28|0;k=h;m=h+24|0;n=h+20|0;o=h+16|0;c[j>>2]=a;a=k;c[a>>2]=b;c[a+4>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;if(c[1032+((c[j>>2]|0)*24|0)+20>>2]|0){g=k;k=ya[c[1032+((c[j>>2]|0)*24|0)+20>>2]&31](c[g>>2]|0,c[g+4>>2]|0,c[m>>2]|0,c[n>>2]|0,c[o>>2]|0)|0;o=i;c[o>>2]=k;c[o+4>>2]=D;p=i;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=h;return r|0}else{o=i;c[o>>2]=0;c[o+4>>2]=0;p=i;q=p;r=c[q>>2]|0;s=p+4|0;t=s;u=c[t>>2]|0;D=u;l=h;return r|0}return 0}function Tc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=l;l=l+64|0;h=g+56|0;i=g+52|0;j=g+48|0;k=g+44|0;m=g+40|0;n=g+36|0;o=g+32|0;p=g+28|0;q=g+24|0;r=g+20|0;s=g+16|0;t=g+12|0;u=g+8|0;v=g+4|0;w=g;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=f;c[o>>2]=c[k>>2];c[w>>2]=0;if((c[m>>2]|0)<8){c[h>>2]=-1;x=c[h>>2]|0;l=g;return x|0}c[t>>2]=(c[o>>2]|0)+(c[m>>2]|0);c[s>>2]=a[(c[o>>2]|0)+3>>0]<<24&-16777216|a[(c[o>>2]|0)+2>>0]<<16&16711680|a[(c[o>>2]|0)+1>>0]<<8&65280|a[c[o>>2]>>0]&255;c[o>>2]=(c[o>>2]|0)+4;if((c[s>>2]|0)>>>0>((c[t>>2]|0)-(c[o>>2]|0)|0)>>>0){c[h>>2]=-1;x=c[h>>2]|0;l=g;return x|0}c[n>>2]=xb(c[i>>2]|0,c[j>>2]|0)|0;if(!(c[n>>2]|0)){c[h>>2]=-20;x=c[h>>2]|0;l=g;return x|0}if((c[s>>2]|0)>>>0>0){m=Uc(c[o>>2]|0,c[s>>2]|0)|0;c[w>>2]=m;if(!m){c[h>>2]=-18;x=c[h>>2]|0;l=g;return x|0}m=(Vc(c[i>>2]|0,c[j>>2]|0,c[w>>2]|0)|0)==-18;Df(c[w>>2]|0);if(m){c[h>>2]=-18;x=c[h>>2]|0;l=g;return x|0}}c[o>>2]=(c[o>>2]|0)+(c[s>>2]|0);if(((c[o>>2]|0)+4|0)>>>0>(c[t>>2]|0)>>>0){c[h>>2]=-1;x=c[h>>2]|0;l=g;return x|0}c[q>>2]=a[(c[o>>2]|0)+3>>0]<<24&-16777216|a[(c[o>>2]|0)+2>>0]<<16&16711680|a[(c[o>>2]|0)+1>>0]<<8&65280|a[c[o>>2]>>0]&255;c[o>>2]=(c[o>>2]|0)+4;c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[q>>2]|0)){y=34;break}if(((c[o>>2]|0)+4|0)>>>0>(c[t>>2]|0)>>>0){y=17;break}c[s>>2]=a[(c[o>>2]|0)+3>>0]<<24&-16777216|a[(c[o>>2]|0)+2>>0]<<16&16711680|a[(c[o>>2]|0)+1>>0]<<8&65280|a[c[o>>2]>>0]&255;c[o>>2]=(c[o>>2]|0)+4;if((c[s>>2]|0)>>>0>((c[t>>2]|0)-(c[o>>2]|0)|0)>>>0){y=19;break}c[r>>2]=0;c[u>>2]=c[o>>2];c[v>>2]=Wc(c[o>>2]|0,61,c[s>>2]|0)|0;if(c[v>>2]|0){a[c[v>>2]>>0]=0;c[v>>2]=(c[v>>2]|0)+1;c[r>>2]=(c[o>>2]|0)+(c[s>>2]|0)-(c[v>>2]|0)}if(c[r>>2]|0){m=Uc(c[v>>2]|0,c[r>>2]|0)|0;c[w>>2]=m;if(!m){y=24;break}m=(Xc(c[n>>2]|0,c[u>>2]|0,c[w>>2]|0)|0)==0;Df(c[w>>2]|0);if(m){y=26;break}}else{m=Uc(c[u>>2]|0,c[s>>2]|0)|0;c[w>>2]=m;if(!m){y=28;break}m=(Xc(c[n>>2]|0,c[w>>2]|0,0)|0)==0;Df(c[w>>2]|0);if(m){y=30;break}}if(c[v>>2]|0)a[(c[v>>2]|0)+-1>>0]=61;c[o>>2]=(c[o>>2]|0)+(c[s>>2]|0);c[p>>2]=(c[p>>2]|0)+1}if((y|0)==17){c[h>>2]=-1;x=c[h>>2]|0;l=g;return x|0}else if((y|0)==19){c[h>>2]=-1;x=c[h>>2]|0;l=g;return x|0}else if((y|0)==24){c[h>>2]=-18;x=c[h>>2]|0;l=g;return x|0}else if((y|0)==26){c[h>>2]=-18;x=c[h>>2]|0;l=g;return x|0}else if((y|0)==28){c[h>>2]=-18;x=c[h>>2]|0;l=g;return x|0}else if((y|0)==30){c[h>>2]=-18;x=c[h>>2]|0;l=g;return x|0}else if((y|0)==34){c[h>>2]=0;x=c[h>>2]|0;l=g;return x|0}return 0}function Uc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=b;c[h>>2]=d;do if(c[g>>2]|0){if(!(c[h>>2]|0)){c[f>>2]=0;break}c[h>>2]=(c[h>>2]|0)>>>0<4294967294?c[h>>2]|0:-2;c[i>>2]=Cf((c[h>>2]|0)+1|0)|0;if(!(c[i>>2]|0)){c[f>>2]=0;break}d=(vf(c[i>>2]|0,c[g>>2]|0,c[h>>2]|0)|0)==0;b=c[i>>2]|0;if(d){Df(b);c[f>>2]=0;break}else{a[b+(c[h>>2]|0)>>0]=0;c[f>>2]=c[i>>2];break}}else c[f>>2]=0;while(0);l=e;return c[f>>2]|0}function Vc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if(!(c[g>>2]|0)){c[f>>2]=-2;k=c[f>>2]|0;l=e;return k|0}c[j>>2]=xb(c[g>>2]|0,c[h>>2]|0)|0;if(!(c[j>>2]|0)){c[f>>2]=-20;k=c[f>>2]|0;l=e;return k|0}if(c[(c[j>>2]|0)+412>>2]|0)Df(c[(c[j>>2]|0)+412>>2]|0);h=ed(c[i>>2]|0)|0;c[(c[j>>2]|0)+412>>2]=h;if(!h){c[f>>2]=-18;k=c[f>>2]|0;l=e;return k|0}else{c[f>>2]=0;k=c[f>>2]|0;l=e;return k|0}return 0}function Wc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+12|0;h=f+8|0;i=f+16|0;j=f+4|0;k=f;c[h>>2]=b;a[i>>0]=d;c[j>>2]=e;c[k>>2]=0;while(1){if(!(a[c[h>>2]>>0]|0)){m=7;break}if((c[k>>2]|0)>=(c[j>>2]|0)){m=7;break}if((a[c[h>>2]>>0]|0)==(a[i>>0]|0)){m=5;break}c[k>>2]=(c[k>>2]|0)+1;c[h>>2]=(c[h>>2]|0)+1}if((m|0)==5){c[g>>2]=c[h>>2];n=c[g>>2]|0;l=f;return n|0}else if((m|0)==7){c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}return 0}function Xc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;e=l;l=l+32|0;f=e+24|0;g=e+20|0;h=e+16|0;i=e+12|0;j=e+8|0;k=e+4|0;m=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[m>>2]=0;a:while(1){d=c[m>>2]|0;if((d|0)>=(Yc(c[(c[g>>2]|0)+416>>2]|0)|0)){n=14;break}c[j>>2]=Zc(c[(c[g>>2]|0)+416>>2]|0,c[m>>2]|0)|0;do if(c[c[j>>2]>>2]|0?(ef(c[h>>2]|0,c[c[j>>2]>>2]|0)|0)==0:0){d=c[i>>2]|0;if(!(c[(c[j>>2]|0)+4>>2]|0))if(!d){n=7;break a}else break;if(d|0?(Ce(c[i>>2]|0,c[(c[j>>2]|0)+4>>2]|0)|0)==0:0){n=12;break a}if((c[i>>2]|0)==0?(c[(c[j>>2]|0)+4>>2]|0)==0:0){n=12;break a}}while(0);c[m>>2]=(c[m>>2]|0)+1}if((n|0)==7){c[f>>2]=c[j>>2];o=c[f>>2]|0;l=e;return o|0}else if((n|0)==12){c[f>>2]=c[j>>2];o=c[f>>2]|0;l=e;return o|0}else if((n|0)==14){n=_c(c[h>>2]|0,c[i>>2]|0)|0;c[k>>2]=n;if(!n){c[f>>2]=0;o=c[f>>2]|0;l=e;return o|0}else{c[f>>2]=$c(c[(c[g>>2]|0)+416>>2]|0,c[k>>2]|0)|0;o=c[f>>2]|0;l=e;return o|0}}return 0}function Yc(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;if(!(c[e>>2]|0)){c[d>>2]=0;f=c[d>>2]|0;l=b;return f|0}else{c[d>>2]=c[(c[e>>2]|0)+4>>2];f=c[d>>2]|0;l=b;return f|0}return 0}function Zc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[f>>2]=a;c[g>>2]=b;if(!(c[f>>2]|0)){c[e>>2]=0;h=c[e>>2]|0;l=d;return h|0}if((c[g>>2]|0)>=(c[(c[f>>2]|0)+4>>2]|0)){c[e>>2]=0;h=c[e>>2]|0;l=d;return h|0}else{c[e>>2]=c[(c[(c[f>>2]|0)+8>>2]|0)+(c[g>>2]<<2)>>2];h=c[e>>2]|0;l=d;return h|0}return 0}function _c(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;if(!(dd(c[f>>2]|0)|0)){c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}c[h>>2]=Cf(8)|0;if(!(c[h>>2]|0)){c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}b=ed(c[f>>2]|0)|0;c[c[h>>2]>>2]=b;if(!(c[c[h>>2]>>2]|0)){Df(c[h>>2]|0);c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}if(c[g>>2]|0){b=ed(c[g>>2]|0)|0;c[(c[h>>2]|0)+4>>2]=b;if(!(c[(c[h>>2]|0)+4>>2]|0)){Df(c[c[h>>2]>>2]|0);Df(c[h>>2]|0);c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}}else c[(c[h>>2]|0)+4>>2]=0;c[e>>2]=c[h>>2];i=c[e>>2]|0;l=d;return i|0}function $c(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[f>>2]=a;c[g>>2]=b;if(!(ad(c[f>>2]|0)|0)){c[e>>2]=0;h=c[e>>2]|0;l=d;return h|0}else{c[(c[(c[f>>2]|0)+8>>2]|0)+((c[(c[f>>2]|0)+4>>2]|0)-1<<2)>>2]=c[g>>2];bd(c[f>>2]|0);c[e>>2]=c[g>>2];h=c[e>>2]|0;l=d;return h|0}return 0}function ad(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=l;l=l+16|0;d=b+12|0;e=b+8|0;f=b+4|0;g=b;c[e>>2]=a;a=(c[e>>2]|0)+4|0;c[a>>2]=(c[a>>2]|0)+1;do if((c[(c[e>>2]|0)+4>>2]|0)>(c[c[e>>2]>>2]|0)){if(!(c[c[e>>2]>>2]|0))c[g>>2]=1;else c[g>>2]=c[c[e>>2]>>2]<<1;c[f>>2]=Ff(c[(c[e>>2]|0)+8>>2]|0,c[g>>2]<<2)|0;if(c[f>>2]|0){c[c[e>>2]>>2]=c[g>>2];c[(c[e>>2]|0)+8>>2]=c[f>>2];break}a=(c[e>>2]|0)+4|0;c[a>>2]=(c[a>>2]|0)+-1;c[d>>2]=0;h=c[d>>2]|0;l=b;return h|0}while(0);c[d>>2]=c[e>>2];h=c[d>>2]|0;l=b;return h|0}function bd(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;if(!(c[(c[d>>2]|0)+12>>2]|0)){l=b;return}c[e>>2]=(c[(c[d>>2]|0)+4>>2]|0)-1;while(1){if((c[e>>2]|0)<=0){f=6;break}if((ta[c[(c[d>>2]|0)+12>>2]&7](c[(c[(c[d>>2]|0)+8>>2]|0)+((c[e>>2]|0)-1<<2)>>2]|0,c[(c[(c[d>>2]|0)+8>>2]|0)+(c[e>>2]<<2)>>2]|0,c[(c[d>>2]|0)+16>>2]|0)|0)<=0){f=6;break}cd(c[(c[d>>2]|0)+8>>2]|0,c[e>>2]|0,(c[e>>2]|0)-1|0);c[e>>2]=(c[e>>2]|0)+-1}if((f|0)==6){l=b;return}}function cd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[i>>2]=c[(c[f>>2]|0)+(c[g>>2]<<2)>>2];c[(c[f>>2]|0)+(c[g>>2]<<2)>>2]=c[(c[f>>2]|0)+(c[h>>2]<<2)>>2];c[(c[f>>2]|0)+(c[h>>2]<<2)>>2]=c[i>>2];l=e;return}function dd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+8|0;f=d+4|0;g=d;c[f>>2]=b;if(!(c[f>>2]|0)){c[e>>2]=0;h=c[e>>2]|0;l=d;return h|0}c[g>>2]=c[f>>2];while(1){if(!(a[c[g>>2]>>0]|0)){i=10;break}if((a[c[g>>2]>>0]|0)<32){i=8;break}if((a[c[g>>2]>>0]|0)>125){i=8;break}if((a[c[g>>2]>>0]|0)==61){i=8;break}c[g>>2]=(c[g>>2]|0)+1}if((i|0)==8){c[e>>2]=0;h=c[e>>2]|0;l=d;return h|0}else if((i|0)==10){c[e>>2]=1;h=c[e>>2]|0;l=d;return h|0}return 0}function ed(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+8|0;e=b+4|0;f=b;c[e>>2]=a;do if(c[e>>2]|0){c[f>>2]=Cf((fd(c[e>>2]|0)|0)+1|0)|0;if(!(c[f>>2]|0)){c[d>>2]=0;break}else{c[d>>2]=gf(c[f>>2]|0,c[e>>2]|0)|0;break}}else c[d>>2]=0;while(0);l=b;return c[d>>2]|0}function fd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=l;l=l+16|0;d=b+8|0;e=b+4|0;f=b;c[e>>2]=a;if(!(c[e>>2]|0)){c[d>>2]=0;g=c[d>>2]|0;l=b;return g|0}else{c[f>>2]=ff(c[e>>2]|0)|0;c[d>>2]=(c[f>>2]|0)>>>0<4294967294?c[f>>2]|0:-2;g=c[d>>2]|0;l=b;return g|0}return 0}function gd(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;c[(c[e>>2]|0)+412>>2]=0;a=Wb()|0;c[(c[e>>2]|0)+416>>2]=a;if(!(c[(c[e>>2]|0)+416>>2]|0)){c[d>>2]=-1;f=c[d>>2]|0;l=b;return f|0}else{id(c[(c[e>>2]|0)+416>>2]|0,3,0)|0;c[d>>2]=0;f=c[d>>2]|0;l=b;return f|0}return 0}function hd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;c[g>>2]=a;c[h>>2]=b;c[e>>2]=d;do if((c[g>>2]|0)!=(c[h>>2]|0)){if(!((c[g>>2]|0)!=0&(c[h>>2]|0)!=0)){c[f>>2]=0;break}if(ef(c[c[g>>2]>>2]|0,c[c[h>>2]>>2]|0)|0){c[f>>2]=0;break}if(Ce(c[(c[g>>2]|0)+4>>2]|0,c[(c[h>>2]|0)+4>>2]|0)|0){c[f>>2]=0;break}else{c[f>>2]=1;break}}else c[f>>2]=1;while(0);l=e;return c[f>>2]|0}function id(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[(c[f>>2]|0)+12>>2]=c[g>>2];c[(c[f>>2]|0)+16>>2]=c[h>>2];if(!(c[g>>2]|0)){l=e;return 0}jd(c[f>>2]|0,0,(c[(c[f>>2]|0)+4>>2]|0)-1|0);l=e;return 0}function jd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[k>>2]=c[(c[f>>2]|0)+8>>2];if((c[g>>2]|0)>=(c[h>>2]|0)){l=e;return}cd(c[k>>2]|0,c[g>>2]|0,((c[g>>2]|0)+(c[h>>2]|0)|0)/2|0);c[j>>2]=c[g>>2];c[i>>2]=(c[g>>2]|0)+1;while(1){if((c[i>>2]|0)>(c[h>>2]|0))break;if((ta[c[(c[f>>2]|0)+12>>2]&7](c[(c[k>>2]|0)+(c[i>>2]<<2)>>2]|0,c[(c[k>>2]|0)+(c[g>>2]<<2)>>2]|0,c[(c[f>>2]|0)+16>>2]|0)|0)<0){d=c[k>>2]|0;b=(c[j>>2]|0)+1|0;c[j>>2]=b;cd(d,b,c[i>>2]|0)}c[i>>2]=(c[i>>2]|0)+1}cd(c[k>>2]|0,c[g>>2]|0,c[j>>2]|0);jd(c[f>>2]|0,c[g>>2]|0,(c[j>>2]|0)-1|0);jd(c[f>>2]|0,(c[j>>2]|0)+1|0,c[h>>2]|0);l=e;return}function kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if(!(c[g>>2]|0)){c[f>>2]=-2;j=c[f>>2]|0;l=e;return j|0}if(c[(c[g>>2]|0)+4>>2]|0){c[f>>2]=-3;j=c[f>>2]|0;l=e;return j|0}if((c[(c[g>>2]|0)+8>>2]|0)==0?(ld(c[g>>2]|0)|0)==-1:0){c[f>>2]=-18;j=c[f>>2]|0;l=e;return j|0}c[c[(c[g>>2]|0)+8>>2]>>2]=c[h>>2];c[(c[(c[g>>2]|0)+8>>2]|0)+4>>2]=c[i>>2];c[f>>2]=0;j=c[f>>2]|0;l=e;return j|0}function ld(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;a=Cf(40)|0;c[(c[e>>2]|0)+8>>2]=a;if(!(c[(c[e>>2]|0)+8>>2]|0)){c[d>>2]=-1;f=c[d>>2]|0;l=b;return f|0}else{a=c[(c[e>>2]|0)+8>>2]|0;e=a+40|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(e|0));c[d>>2]=0;f=c[d>>2]|0;l=b;return f|0}return 0}function md(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if(!(c[g>>2]|0)){c[f>>2]=-2;j=c[f>>2]|0;l=e;return j|0}if(c[(c[g>>2]|0)+4>>2]|0){c[f>>2]=-3;j=c[f>>2]|0;l=e;return j|0}if((c[(c[g>>2]|0)+8>>2]|0)==0?(ld(c[g>>2]|0)|0)==-1:0){c[f>>2]=-18;j=c[f>>2]|0;l=e;return j|0}c[(c[(c[g>>2]|0)+8>>2]|0)+16>>2]=c[h>>2];c[(c[(c[g>>2]|0)+8>>2]|0)+20>>2]=c[i>>2];c[f>>2]=0;j=c[f>>2]|0;l=e;return j|0}function nd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;if(!(c[g>>2]|0)){c[f>>2]=-2;j=c[f>>2]|0;l=e;return j|0}if(c[(c[g>>2]|0)+4>>2]|0){c[f>>2]=-3;j=c[f>>2]|0;l=e;return j|0}if((c[(c[g>>2]|0)+8>>2]|0)==0?(ld(c[g>>2]|0)|0)==-1:0){c[f>>2]=-18;j=c[f>>2]|0;l=e;return j|0}c[(c[(c[g>>2]|0)+8>>2]|0)+24>>2]=c[h>>2];c[(c[(c[g>>2]|0)+8>>2]|0)+28>>2]=c[i>>2];c[f>>2]=0;j=c[f>>2]|0;l=e;return j|0}function od(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+32|0;g=f+24|0;h=f+20|0;i=f+16|0;j=f+12|0;k=f+8|0;m=f+4|0;n=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;if(!(c[h>>2]|0)){c[g>>2]=-2;o=c[g>>2]|0;l=f;return o|0}c[m>>2]=(c[h>>2]|0)+112;if(c[c[h>>2]>>2]&1|0){c[g>>2]=-3;o=c[g>>2]|0;l=f;return o|0}do if((c[i>>2]|0)==-1){c[(c[m>>2]|0)+396>>2]=c[j>>2];c[(c[m>>2]|0)+400>>2]=c[k>>2]}else{c[n>>2]=xb(c[h>>2]|0,c[i>>2]|0)|0;if(!(c[n>>2]|0))c[n>>2]=zc(c[h>>2]|0,c[i>>2]|0)|0;if(c[n>>2]|0){c[(c[n>>2]|0)+468>>2]=c[j>>2];c[(c[n>>2]|0)+472>>2]=c[k>>2];break}c[g>>2]=-18;o=c[g>>2]|0;l=f;return o|0}while(0);c[g>>2]=0;o=c[g>>2]|0;l=f;return o|0}function pd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+24|0;g=e+20|0;h=e+16|0;i=e+12|0;j=e+8|0;k=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;d=k;c[d>>2]=-1;c[d+4>>2]=-1;if(!(c[g>>2]|0)){c[f>>2]=-1;m=c[f>>2]|0;l=e;return m|0}if(c[c[g>>2]>>2]&1|0){c[f>>2]=-1;m=c[f>>2]|0;l=e;return m|0}if((c[h>>2]|0)==0&(c[i>>2]|0)==0){d=k;c[d>>2]=0;c[d+4>>2]=0}c[j>>2]=(c[g>>2]|0)+112;if(!((c[h>>2]|0)==0&(c[i>>2]|0)==1)){d=(c[j>>2]|0)+416|0;c[d>>2]=-1;c[d+4>>2]=-1}d=k;c[f>>2]=sc(c[g>>2]|0,c[h>>2]|0,c[d>>2]|0,c[d+4>>2]|0,c[i>>2]|0)|0;m=c[f>>2]|0;l=e;return m|0}function qd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;if(!(c[f>>2]|0)){c[e>>2]=-2;i=c[e>>2]|0;l=d;return i|0}c[h>>2]=xb(c[f>>2]|0,c[g>>2]|0)|0;if(!(c[h>>2]|0)){c[e>>2]=-20;i=c[e>>2]|0;l=d;return i|0}else{c[e>>2]=c[(c[h>>2]|0)+408>>2];i=c[e>>2]|0;l=d;return i|0}return 0}function rd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=e;if(!(c[h>>2]|0)){c[g>>2]=-2;n=c[g>>2]|0;l=f;return n|0}c[m>>2]=xb(c[h>>2]|0,c[i>>2]|0)|0;if(!(c[m>>2]|0)){c[g>>2]=-20;n=c[g>>2]|0;l=f;return n|0}else{i=(c[m>>2]|0)+376|0;h=c[i+4>>2]|0;e=c[j>>2]|0;c[e>>2]=c[i>>2];c[e+4>>2]=h;h=(c[m>>2]|0)+384|0;m=Sf(c[h>>2]|0,c[h+4>>2]|0,1e3,0)|0;h=c[k>>2]|0;c[h>>2]=m;c[h+4>>2]=D;c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}return 0}function sd(){var a=0,d=0,e=0,f=0,g=0;a=l;l=l+16|0;d=a+4|0;e=a;c[e>>2]=0;c[e>>2]=Ef(1,136)|0;if(!(c[e>>2]|0)){c[d>>2]=0;f=c[d>>2]|0;l=a;return f|0}g=td()|0;c[(c[e>>2]|0)+112>>2]=g;g=c[e>>2]|0;if(!(c[(c[e>>2]|0)+112>>2]|0)){Df(g);c[d>>2]=0;f=c[d>>2]|0;l=a;return f|0}else{b[g+116>>1]=0;b[(c[e>>2]|0)+118>>1]=0;c[(c[e>>2]|0)+120>>2]=0;g=(c[e>>2]|0)+128|0;c[g>>2]=0;c[g+4>>2]=0;c[d>>2]=c[e>>2];f=c[d>>2]|0;l=a;return f|0}return 0}function td(){var a=0,b=0,d=0;a=l;l=l+16|0;b=a+4|0;d=a;c[d>>2]=Ef(1,8)|0;if(!(c[d>>2]|0))c[b>>2]=0;else c[b>>2]=c[d>>2];l=a;return c[b>>2]|0}function ud(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[e>>2]=a;if(!(c[e>>2]|0)){c[d>>2]=-2;f=c[d>>2]|0;l=b;return f|0}else{vd(c[(c[e>>2]|0)+112>>2]|0);Df(c[e>>2]|0);c[d>>2]=0;f=c[d>>2]|0;l=b;return f|0}return 0}function vd(a){a=a|0;var b=0,d=0,e=0,f=0;b=l;l=l+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=0;if(!(c[d>>2]|0)){l=b;return}if(c[(c[d>>2]|0)+4>>2]|0){c[e>>2]=0;while(1){f=c[(c[d>>2]|0)+4>>2]|0;if((c[e>>2]|0)>>>0>=(c[c[d>>2]>>2]|0)>>>0)break;if(c[f+((c[e>>2]|0)*12|0)+4>>2]|0){if(c[(c[(c[(c[d>>2]|0)+4>>2]|0)+((c[e>>2]|0)*12|0)+4>>2]|0)+48>>2]|0)Df(c[(c[(c[(c[d>>2]|0)+4>>2]|0)+((c[e>>2]|0)*12|0)+4>>2]|0)+48>>2]|0);Df(c[(c[(c[d>>2]|0)+4>>2]|0)+((c[e>>2]|0)*12|0)+4>>2]|0)}if(c[(c[(c[d>>2]|0)+4>>2]|0)+((c[e>>2]|0)*12|0)+8>>2]|0){if(c[(c[(c[(c[d>>2]|0)+4>>2]|0)+((c[e>>2]|0)*12|0)+8>>2]|0)+40>>2]|0)Df(c[(c[(c[(c[d>>2]|0)+4>>2]|0)+((c[e>>2]|0)*12|0)+8>>2]|0)+40>>2]|0);Df(c[(c[(c[d>>2]|0)+4>>2]|0)+((c[e>>2]|0)*12|0)+8>>2]|0)}c[e>>2]=(c[e>>2]|0)+1}Df(f)}Df(c[d>>2]|0);l=b;return}function wd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=0;do if(c[g>>2]|0){if(!(c[h>>2]|0)){c[f>>2]=-1;break}c[j>>2]=xd(c[g>>2]|0,c[i>>2]|0)|0;if(!(c[j>>2]|0)){c[f>>2]=-4;break}if(c[(c[j>>2]|0)+4>>2]|0){c[f>>2]=-1;break}else{c[(c[j>>2]|0)+4>>2]=c[h>>2];c[f>>2]=1;break}}else c[f>>2]=-1;while(0);l=e;return c[f>>2]|0}function xd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=0;b=yd(c[f>>2]|0,c[g>>2]|0)|0;c[h>>2]=b;do if(!b){c[h>>2]=Ff(c[(c[f>>2]|0)+4>>2]|0,((c[c[f>>2]>>2]|0)+1|0)*12|0)|0;if(c[h>>2]|0){c[(c[f>>2]|0)+4>>2]=c[h>>2];a=c[f>>2]|0;c[a>>2]=(c[a>>2]|0)+1;c[h>>2]=(c[(c[f>>2]|0)+4>>2]|0)+(((c[c[f>>2]>>2]|0)-1|0)*12|0);c[c[h>>2]>>2]=c[g>>2];c[(c[h>>2]|0)+4>>2]=0;c[(c[h>>2]|0)+8>>2]=0;break}c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}while(0);c[e>>2]=c[h>>2];i=c[e>>2]|0;l=d;return i|0}function yd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=0;c[h>>2]=0;while(1){if((c[h>>2]|0)>>>0>=(c[c[f>>2]>>2]|0)>>>0){i=6;break}if((c[(c[(c[f>>2]|0)+4>>2]|0)+((c[h>>2]|0)*12|0)>>2]|0)==(c[g>>2]|0)){i=4;break}c[h>>2]=(c[h>>2]|0)+1}if((i|0)==4){c[e>>2]=(c[(c[f>>2]|0)+4>>2]|0)+((c[h>>2]|0)*12|0);j=c[e>>2]|0;l=d;return j|0}else if((i|0)==6){c[e>>2]=0;j=c[e>>2]|0;l=d;return j|0}return 0}function zd(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=a;c[h>>2]=d;c[i>>2]=-1;if(!(c[g>>2]|0)){c[f>>2]=-2;j=c[f>>2]|0;l=e;return j|0}if(!(c[h>>2]|0)){c[f>>2]=-13;j=c[f>>2]|0;l=e;return j|0}if(c[(c[h>>2]|0)+12>>2]|0){if((c[(c[g>>2]|0)+120>>2]|0)!=1){c[f>>2]=-1;j=c[f>>2]|0;l=e;return j|0}b[(c[g>>2]|0)+118>>1]=1;c[(c[g>>2]|0)+120>>2]=2;if(c[(c[h>>2]|0)+4>>2]|0){c[f>>2]=-6;j=c[f>>2]|0;l=e;return j|0}else{c[f>>2]=0;j=c[f>>2]|0;l=e;return j|0}}do if(!(De(c[c[h>>2]>>2]|0,2779,8)|0)){c[i>>2]=Ad(c[g>>2]|0,c[h>>2]|0)|0;if(c[i>>2]|0){if(c[(c[h>>2]|0)+8>>2]|0){if(c[(c[g>>2]|0)+120>>2]|0)c[i>>2]=-14}else c[i>>2]=-12;c[(c[g>>2]|0)+120>>2]=1}}else{if(!(De(c[c[h>>2]>>2]|0,2770,8)|0)){c[i>>2]=Bd(c[g>>2]|0,c[h>>2]|0)|0;if(!(c[i>>2]|0))break;if((c[(c[g>>2]|0)+120>>2]|0)==1)break;c[i>>2]=-14;break}if(De(c[c[h>>2]>>2]|0,2788,6)|0){c[i>>2]=-1;break}b[(c[g>>2]|0)+116>>1]=1;c[i>>2]=Cd(c[g>>2]|0,c[h>>2]|0)|0;if(c[i>>2]|0?(c[(c[g>>2]|0)+120>>2]|0)!=1:0)c[i>>2]=-14}while(0);c[f>>2]=c[i>>2];j=c[f>>2]|0;l=e;return j|0}function Ad(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;f=l;l=l+32|0;g=f+16|0;h=f+12|0;i=f+8|0;j=f+4|0;k=f;c[h>>2]=b;c[i>>2]=d;c[k>>2]=0;if(!(c[h>>2]|0)){c[g>>2]=-2;m=c[g>>2]|0;l=f;return m|0}if(c[i>>2]|0?c[c[i>>2]>>2]|0:0){c[k>>2]=(c[c[i>>2]>>2]|0)+8;c[k>>2]=Id(c[k>>2]|0,c[h>>2]|0)|0;c[k>>2]=Id(c[k>>2]|0,(c[h>>2]|0)+2|0)|0;c[j>>2]=(e[c[h>>2]>>1]|0)<<16|(e[(c[h>>2]|0)+2>>1]|0);if((c[j>>2]|0)>>>0>262144){c[g>>2]=-11;m=c[g>>2]|0;l=f;return m|0}if((c[j>>2]|0)==262144?(c[(c[i>>2]|0)+4>>2]|0)!=80:0){c[g>>2]=-18;m=c[g>>2]|0;l=f;return m|0}if((e[c[h>>2]>>1]|0|0)==3){if((e[(c[h>>2]|0)+2>>1]|0|0)>=2?(c[(c[i>>2]|0)+4>>2]|0)!=112:0){c[g>>2]=-18;m=c[g>>2]|0;l=f;return m|0}if((e[(c[h>>2]|0)+2>>1]|0|0)==0?(c[(c[i>>2]|0)+4>>2]|0)!=64:0){c[g>>2]=-18;m=c[g>>2]|0;l=f;return m|0}}c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+8|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+16|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+24|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+32|0)|0;i=(c[h>>2]|0)+40|0;d=c[k>>2]|0;b=i+20|0;do{a[i>>0]=a[d>>0]|0;i=i+1|0;d=d+1|0}while((i|0)<(b|0));if((c[j>>2]|0)>>>0>=196610){c[k>>2]=(c[k>>2]|0)+20;if((e[c[h>>2]>>1]|0|0)==3){c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+64|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+72|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+80|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+88|0)|0}c[k>>2]=Ed(c[k>>2]|0,(c[h>>2]|0)+96|0)|0;Ed(c[k>>2]|0,(c[h>>2]|0)+104|0)|0}c[g>>2]=1;m=c[g>>2]|0;l=f;return m|0}c[g>>2]=-13;m=c[g>>2]|0;l=f;return m|0}function Bd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+20|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;c[g>>2]=b;c[h>>2]=d;c[i>>2]=0;c[j>>2]=-1;c[k>>2]=0;if(!(c[g>>2]|0)){c[f>>2]=-2;m=c[f>>2]|0;l=e;return m|0}if(c[h>>2]|0?c[c[h>>2]>>2]|0:0){if((c[(c[h>>2]|0)+4>>2]|0)<52){c[f>>2]=-7;m=c[f>>2]|0;l=e;return m|0}c[i>>2]=Ef(1,56)|0;if(!(c[i>>2]|0)){c[f>>2]=-4;m=c[f>>2]|0;l=e;return m|0}c[k>>2]=(c[c[h>>2]>>2]|0)+8;c[k>>2]=Hd(c[k>>2]|0,c[i>>2]|0)|0;c[k>>2]=Dd(c[k>>2]|0,(c[i>>2]|0)+4|0)|0;c[k>>2]=Hd(c[k>>2]|0,(c[i>>2]|0)+8|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[i>>2]|0)+16|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[i>>2]|0)+24|0)|0;c[k>>2]=Ed(c[k>>2]|0,(c[i>>2]|0)+32|0)|0;c[k>>2]=Hd(c[k>>2]|0,(c[i>>2]|0)+40|0)|0;a[(c[i>>2]|0)+44>>0]=a[c[k>>2]>>0]|0;k=Ef((c[(c[h>>2]|0)+4>>2]|0)-52|0,1)|0;c[(c[i>>2]|0)+48>>2]=k;k=c[i>>2]|0;if(!(c[(c[i>>2]|0)+48>>2]|0)){Df(k);c[f>>2]=-4;m=c[f>>2]|0;l=e;return m|0}Wf(c[k+48>>2]|0,(c[c[h>>2]>>2]|0)+52|0,(c[(c[h>>2]|0)+4>>2]|0)-52|0)|0;c[j>>2]=wd(c[(c[g>>2]|0)+112>>2]|0,c[i>>2]|0,c[(c[i>>2]|0)+4>>2]|0)|0;if((c[j>>2]|0)<0)Df(c[i>>2]|0);c[f>>2]=c[j>>2];m=c[f>>2]|0;l=e;return m|0}c[f>>2]=-13;m=c[f>>2]|0;l=e;return m|0}function Cd(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=l;l=l+80|0;f=d+76|0;g=d+72|0;h=d+68|0;i=d+48|0;j=d+40|0;k=d+32|0;m=d+24|0;n=d+64|0;o=d+16|0;p=d+60|0;q=d+56|0;r=d+8|0;s=d;c[g>>2]=a;c[h>>2]=b;b=i;c[b>>2]=0;c[b+4>>2]=0;b=j;c[b>>2]=0;c[b+4>>2]=0;b=k;c[b>>2]=0;c[b+4>>2]=0;b=m;c[b>>2]=1e3;c[b+4>>2]=0;c[n>>2]=0;b=o;c[b>>2]=-1;c[b+4>>2]=-1;c[p>>2]=0;c[q>>2]=-1;if(!(c[g>>2]|0)){c[f>>2]=-2;t=c[f>>2]|0;l=d;return t|0}if(c[h>>2]|0?c[c[h>>2]>>2]|0:0){c[n>>2]=Ef(1,48)|0;if(!(c[n>>2]|0)){c[f>>2]=-4;t=c[f>>2]|0;l=d;return t|0}c[p>>2]=(c[c[h>>2]>>2]|0)+6;c[p>>2]=Dd(c[p>>2]|0,c[n>>2]|0)|0;c[p>>2]=Ed(c[p>>2]|0,(c[n>>2]|0)+8|0)|0;c[p>>2]=Ed(c[p>>2]|0,(c[n>>2]|0)+16|0)|0;if(((e[c[g>>2]>>1]|0)<<16|(e[(c[g>>2]|0)+2>>1]|0)|0)==262144){c[p>>2]=Ed(c[p>>2]|0,(c[n>>2]|0)+24|0)|0;c[p>>2]=Ed(c[p>>2]|0,(c[n>>2]|0)+32|0)|0}b=(c[n>>2]|0)+16|0;do if((c[b>>2]|0)==0&(c[b+4>>2]|0)==0)c[q>>2]=-9;else{a=(c[n>>2]|0)+8|0;u=Uf(c[a>>2]|0,c[a+4>>2]|0,2,0)|0;a=Lf(26,0,u|0,D|0)|0;u=o;c[u>>2]=a;c[u+4>>2]=D;u=o;a=c[u+4>>2]|0;v=c[(c[h>>2]|0)+4>>2]|0;w=((v|0)<0)<<31>>31;if((a|0)>(w|0)|((a|0)==(w|0)?(c[u>>2]|0)>>>0>v>>>0:0)){c[q>>2]=-10;break}v=Ef(c[(c[n>>2]|0)+8>>2]|0,16)|0;c[(c[n>>2]|0)+40>>2]=v;if(!(c[(c[n>>2]|0)+40>>2]|0)){c[q>>2]=-4;break}v=i;c[v>>2]=0;c[v+4>>2]=0;while(1){v=i;u=c[v+4>>2]|0;w=(c[n>>2]|0)+8|0;a=c[w+4>>2]|0;if(!((u|0)<(a|0)|((u|0)==(a|0)?(c[v>>2]|0)>>>0<(c[w>>2]|0)>>>0:0)))break;w=r;c[w>>2]=0;c[w+4>>2]=0;w=s;c[w>>2]=0;c[w+4>>2]=0;c[p>>2]=Fd(c[p>>2]|0,r)|0;w=r;v=j;a=Lf(c[v>>2]|0,c[v+4>>2]|0,c[w>>2]|0,c[w+4>>2]|0)|0;w=j;c[w>>2]=a;c[w+4>>2]=D;c[p>>2]=Fd(c[p>>2]|0,s)|0;w=s;a=k;v=Lf(c[a>>2]|0,c[a+4>>2]|0,c[w>>2]|0,c[w+4>>2]|0)|0;w=k;c[w>>2]=v;c[w+4>>2]=D;w=j;v=c[w+4>>2]|0;a=(c[(c[n>>2]|0)+40>>2]|0)+(c[i>>2]<<4)|0;c[a>>2]=c[w>>2];c[a+4>>2]=v;v=k;a=m;w=Uf(c[v>>2]|0,c[v+4>>2]|0,c[a>>2]|0,c[a+4>>2]|0)|0;a=(c[n>>2]|0)+16|0;v=Rf(w|0,D|0,c[a>>2]|0,c[a+4>>2]|0)|0;a=(c[(c[n>>2]|0)+40>>2]|0)+(c[i>>2]<<4)+8|0;c[a>>2]=v;c[a+4>>2]=D;a=i;v=Lf(c[a>>2]|0,c[a+4>>2]|0,1,0)|0;a=i;c[a>>2]=v;c[a+4>>2]=D}c[q>>2]=Gd(c[(c[g>>2]|0)+112>>2]|0,c[n>>2]|0,c[c[n>>2]>>2]|0)|0}while(0);if((c[q>>2]|0)<0)Df(c[n>>2]|0);c[f>>2]=c[q>>2];t=c[f>>2]|0;l=d;return t|0}c[f>>2]=-13;t=c[f>>2]|0;l=d;return t|0}function Dd(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[g>>2]=a;c[h>>2]=b;if((c[g>>2]|0)==0|(c[h>>2]|0)==0){c[f>>2]=0;i=c[f>>2]|0;l=e;return i|0}else{c[c[h>>2]>>2]=d[c[g>>2]>>0]|0|(d[(c[g>>2]|0)+1>>0]|0)<<8|(d[(c[g>>2]|0)+2>>0]|0)<<16|(d[(c[g>>2]|0)+3>>0]|0)<<24;c[f>>2]=(c[g>>2]|0)+4;i=c[f>>2]|0;l=e;return i|0}return 0}function Ed(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;i=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=-1;c[i>>2]=-1;if((c[f>>2]|0)==0|(c[g>>2]|0)==0){c[e>>2]=0;j=c[e>>2]|0;l=d;return j|0}else{c[f>>2]=Hd(c[f>>2]|0,h)|0;c[f>>2]=Dd(c[f>>2]|0,i)|0;b=c[i>>2]|0;i=Lf(c[h>>2]|0,0,0,b|0)|0;b=c[g>>2]|0;c[b>>2]=i;c[b+4>>2]=D;c[e>>2]=c[f>>2];j=c[e>>2]|0;l=d;return j|0}return 0}function Fd(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e;c[f>>2]=a;c[g>>2]=b;c[h>>2]=0;b=i;c[b>>2]=0;c[b+4>>2]=0;b=c[g>>2]|0;c[b>>2]=0;c[b+4>>2]=0;do{b=i;c[b>>2]=d[c[f>>2]>>0];c[b+4>>2]=0;b=Of(c[i>>2]&127|0,0,c[h>>2]|0)|0;a=c[g>>2]|0;j=a;k=c[j+4>>2]|D;m=a;c[m>>2]=c[j>>2]|b;c[m+4>>2]=k;c[h>>2]=(c[h>>2]|0)+7;c[f>>2]=(c[f>>2]|0)+1}while(0?1:(c[i>>2]&128|0)!=128);l=e;return c[f>>2]|0}function Gd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+32|0;f=e+16|0;g=e+12|0;h=e+8|0;i=e+4|0;j=e;c[g>>2]=a;c[h>>2]=b;c[i>>2]=d;c[j>>2]=0;do if(c[g>>2]|0){if(!(c[h>>2]|0)){c[f>>2]=-1;break}c[j>>2]=xd(c[g>>2]|0,c[i>>2]|0)|0;if(!(c[j>>2]|0)){c[f>>2]=-4;break}if(c[(c[j>>2]|0)+8>>2]|0){c[f>>2]=-1;break}else{c[(c[j>>2]|0)+8>>2]=c[h>>2];c[f>>2]=1;break}}else c[f>>2]=-1;while(0);l=e;return c[f>>2]|0}function Hd(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[g>>2]=a;c[h>>2]=b;if((c[g>>2]|0)==0|(c[h>>2]|0)==0){c[f>>2]=0;i=c[f>>2]|0;l=e;return i|0}else{c[c[h>>2]>>2]=d[c[g>>2]>>0]|0|(d[(c[g>>2]|0)+1>>0]|0)<<8|(d[(c[g>>2]|0)+2>>0]|0)<<16|(d[(c[g>>2]|0)+3>>0]|0)<<24;c[f>>2]=(c[g>>2]|0)+4;i=c[f>>2]|0;l=e;return i|0}return 0}function Id(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=l;l=l+16|0;g=f+8|0;h=f+4|0;i=f;c[h>>2]=a;c[i>>2]=e;if((c[h>>2]|0)==0|(c[i>>2]|0)==0){c[g>>2]=0;j=c[g>>2]|0;l=f;return j|0}else{b[c[i>>2]>>1]=d[c[h>>2]>>0]|0|(d[(c[h>>2]|0)+1>>0]|0)<<8;c[g>>2]=(c[h>>2]|0)+2;j=c[g>>2]|0;l=f;return j|0}return 0}function Jd(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=a;c[h>>2]=d;c[i>>2]=-1;d=Kd(c[g>>2]|0,c[h>>2]|0)|0;c[i>>2]=d;if((d|0)<0){c[f>>2]=c[i>>2];j=c[f>>2]|0;l=e;return j|0}else{b[c[h>>2]>>1]=b[c[g>>2]>>1]|0;c[f>>2]=0;j=c[f>>2]|0;l=e;return j|0}return 0}function Kd(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e+8|0;g=e+4|0;h=e;c[g>>2]=a;c[h>>2]=d;do if(c[g>>2]|0){if(!(b[(c[g>>2]|0)+118>>1]|0)){c[f>>2]=-5;break}if(!(c[h>>2]|0)){c[f>>2]=-16;break}else{c[f>>2]=0;break}}else c[f>>2]=-2;while(0);l=e;return c[f>>2]|0}function Ld(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=l;l=l+16|0;f=e+12|0;g=e+8|0;h=e+4|0;i=e;c[g>>2]=a;c[h>>2]=d;c[i>>2]=-1;d=Kd(c[g>>2]|0,c[h>>2]|0)|0;c[i>>2]=d;if((d|0)<0){c[f>>2]=c[i>>2];j=c[f>>2]|0;l=e;return j|0}else{b[c[h>>2]>>1]=b[(c[g>>2]|0)+2>>1]|0;c[f>>2]=0;j=c[f>>2]|0;l=e;return j|0}return 0}function Md(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0;d=l;l=l+32|0;f=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;c[g>>2]=a;c[h>>2]=b;c[i>>2]=-1;c[j>>2]=0;b=Kd(c[g>>2]|0,c[h>>2]|0)|0;c[i>>2]=b;if((b|0)<0){c[f>>2]=c[i>>2];k=c[f>>2]|0;l=d;return k|0}c[j>>2]=(e[c[g>>2]>>1]|0)<<16|(e[(c[g>>2]|0)+2>>1]|0);if((c[j>>2]|0)>>>0<196610){c[f>>2]=-1;k=c[f>>2]|0;l=d;return k|0}else{j=(c[g>>2]|0)+96|0;g=c[j+4>>2]|0;i=c[h>>2]|0;c[i>>2]=c[j>>2];c[i+4>>2]=g;c[f>>2]=0;k=c[f>>2]|0;l=d;return k|0}return 0}function Nd(a,d,f,g,h,i){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=l;l=l+64|0;k=j+48|0;m=j+44|0;n=j+40|0;o=j+36|0;p=j+8|0;q=j+32|0;r=j+28|0;s=j+24|0;t=j+20|0;u=j;v=j+16|0;c[m>>2]=a;c[n>>2]=d;c[o>>2]=f;f=p;c[f>>2]=g;c[f+4>>2]=h;c[q>>2]=i;c[r>>2]=0;c[s>>2]=-1;c[t>>2]=0;i=u;c[i>>2]=-1;c[i+4>>2]=2147483647;i=Kd(c[m>>2]|0,c[q>>2]|0)|0;c[s>>2]=i;if((i|0)<0){c[k>>2]=c[s>>2];w=c[k>>2]|0;l=j;return w|0}if(!(b[(c[m>>2]|0)+116>>1]|0)){c[k>>2]=-19;w=c[k>>2]|0;l=j;return w|0}if((c[n>>2]|0)==0|(c[o>>2]|0)==0){c[k>>2]=-1;w=c[k>>2]|0;l=j;return w|0}do if((e[c[m>>2]>>1]|0)==3){s=(c[m>>2]|0)+80|0;i=c[s+4>>2]|0;h=p;f=c[h+4>>2]|0;if(!((i|0)<(f|0)|((i|0)==(f|0)?(c[s>>2]|0)>>>0<(c[h>>2]|0)>>>0:0))?(h=p,s=c[h+4>>2]|0,f=(c[m>>2]|0)+64|0,i=c[f+4>>2]|0,!((s|0)<(i|0)|((s|0)==(i|0)?(c[h>>2]|0)>>>0<(c[f>>2]|0)>>>0:0))):0)break;c[k>>2]=-17;w=c[k>>2]|0;l=j;return w|0}while(0);c[t>>2]=0;while(1){if((c[t>>2]|0)>>>0>=(c[o>>2]|0)>>>0){x=23;break}c[v>>2]=0;f=Od(c[(c[m>>2]|0)+112>>2]|0,c[(c[n>>2]|0)+(c[t>>2]<<2)>>2]|0)|0;c[r>>2]=f;if(!f){x=14;break}if((e[c[m>>2]>>1]|0)==4){f=(c[r>>2]|0)+32|0;h=c[f+4>>2]|0;i=p;s=c[i+4>>2]|0;if((h|0)<(s|0)|((h|0)==(s|0)?(c[f>>2]|0)>>>0<(c[i>>2]|0)>>>0:0)){x=18;break}i=p;f=c[i+4>>2]|0;s=(c[r>>2]|0)+24|0;h=c[s+4>>2]|0;if((f|0)<(h|0)|((f|0)==(h|0)?(c[i>>2]|0)>>>0<(c[s>>2]|0)>>>0:0)){x=18;break}}s=p;c[v>>2]=Pd(c[r>>2]|0,c[s>>2]|0,c[s+4>>2]|0)|0;if(c[v>>2]|0?(s=c[v>>2]|0,i=c[s+4>>2]|0,h=u,f=c[h+4>>2]|0,!((i|0)>(f|0)|((i|0)==(f|0)?(c[s>>2]|0)>>>0>(c[h>>2]|0)>>>0:0))):0){h=c[v>>2]|0;s=c[h+4>>2]|0;f=u;c[f>>2]=c[h>>2];c[f+4>>2]=s}c[t>>2]=(c[t>>2]|0)+1}if((x|0)==14){c[k>>2]=-8;w=c[k>>2]|0;l=j;return w|0}else if((x|0)==18){c[k>>2]=-17;w=c[k>>2]|0;l=j;return w|0}else if((x|0)==23){x=u;if((c[x>>2]|0)==-1?(c[x+4>>2]|0)==2147483647:0){c[k>>2]=-1;w=c[k>>2]|0;l=j;return w|0}else{x=u;u=c[x+4>>2]|0;t=c[q>>2]|0;c[t>>2]=c[x>>2];c[t+4>>2]=u;c[k>>2]=0;w=c[k>>2]|0;l=j;return w|0}}return 0}function Od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=l;l=l+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[g>>2]=b;c[h>>2]=0;if(!(c[f>>2]|0)){c[e>>2]=0;i=c[e>>2]|0;l=d;return i|0}c[h>>2]=yd(c[f>>2]|0,c[g>>2]|0)|0;if(!(c[h>>2]|0))j=0;else j=c[(c[h>>2]|0)+8>>2]|0;c[e>>2]=j;i=c[e>>2]|0;l=d;return i|0}function Pd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;e=l;l=l+48|0;f=e+36|0;g=e+32|0;h=e+24|0;i=e+16|0;j=e+8|0;k=e;c[g>>2]=a;a=h;c[a>>2]=b;c[a+4>>2]=d;d=i;c[d>>2]=0;c[d+4>>2]=0;d=j;c[d>>2]=0;c[d+4>>2]=0;if(!(c[g>>2]|0)){c[f>>2]=0;m=c[f>>2]|0;l=e;return m|0}d=(c[g>>2]|0)+8|0;a=Kf(c[d>>2]|0,c[d+4>>2]|0,1,0)|0;d=j;c[d>>2]=a;c[d+4>>2]=D;while(1){d=j;a=c[d+4>>2]|0;b=i;n=c[b+4>>2]|0;if(!((a|0)>(n|0)|((a|0)==(n|0)?(c[d>>2]|0)>>>0>(c[b>>2]|0)>>>0:0)))break;b=i;d=j;n=Lf(c[b>>2]|0,c[b+4>>2]|0,c[d>>2]|0,c[d+4>>2]|0)|0;d=Lf(n|0,D|0,1,0)|0;n=Jf(d|0,D|0,1)|0;d=k;c[d>>2]=n;c[d+4>>2]=D;d=(c[(c[g>>2]|0)+40>>2]|0)+(c[k>>2]<<4)+8|0;n=h;if((c[d>>2]|0)==(c[n>>2]|0)?(c[d+4>>2]|0)==(c[n+4>>2]|0):0){o=6;break}n=(c[(c[g>>2]|0)+40>>2]|0)+(c[k>>2]<<4)+8|0;d=c[n+4>>2]|0;b=h;a=c[b+4>>2]|0;p=k;q=c[p>>2]|0;r=c[p+4>>2]|0;if((d|0)<(a|0)|((d|0)==(a|0)?(c[n>>2]|0)>>>0<(c[b>>2]|0)>>>0:0)){b=i;c[b>>2]=q;c[b+4>>2]=r;continue}else{b=Kf(q|0,r|0,1,0)|0;r=j;c[r>>2]=b;c[r+4>>2]=D;continue}}if((o|0)==6){o=k;k=c[o+4>>2]|0;j=i;c[j>>2]=c[o>>2];c[j+4>>2]=k}c[f>>2]=(c[(c[g>>2]|0)+40>>2]|0)+(c[i>>2]<<4);m=c[f>>2]|0;l=e;return m|0}function Qd(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=-1;d=Kd(c[h>>2]|0,c[j>>2]|0)|0;c[k>>2]=d;if((d|0)<0){c[g>>2]=c[k>>2];n=c[g>>2]|0;l=f;return n|0}do if((e[c[h>>2]>>1]|0|0)<4){k=(c[h>>2]|0)+64|0;d=c[k+4>>2]|0;b=c[j>>2]|0;c[b>>2]=c[k>>2];c[b+4>>2]=d}else{c[m>>2]=0;d=Od(c[(c[h>>2]|0)+112>>2]|0,c[i>>2]|0)|0;c[m>>2]=d;if(d|0){d=(c[m>>2]|0)+24|0;b=c[d+4>>2]|0;k=c[j>>2]|0;c[k>>2]=c[d>>2];c[k+4>>2]=b;break}c[g>>2]=-8;n=c[g>>2]|0;l=f;return n|0}while(0);c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}function Rd(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=-1;d=Kd(c[h>>2]|0,c[j>>2]|0)|0;c[k>>2]=d;if((d|0)<0){c[g>>2]=c[k>>2];n=c[g>>2]|0;l=f;return n|0}do if((e[c[h>>2]>>1]|0|0)<4){k=(c[h>>2]|0)+72|0;d=c[k+4>>2]|0;b=c[j>>2]|0;c[b>>2]=c[k>>2];c[b+4>>2]=d}else{c[m>>2]=0;d=Od(c[(c[h>>2]|0)+112>>2]|0,c[i>>2]|0)|0;c[m>>2]=d;if(d|0){d=(c[m>>2]|0)+16|0;b=c[d+4>>2]|0;k=c[j>>2]|0;c[k>>2]=c[d>>2];c[k+4>>2]=b;break}c[g>>2]=-8;n=c[g>>2]|0;l=f;return n|0}while(0);c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}function Sd(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=-1;d=Kd(c[h>>2]|0,c[j>>2]|0)|0;c[k>>2]=d;if((d|0)<0){c[g>>2]=c[k>>2];n=c[g>>2]|0;l=f;return n|0}do if((e[c[h>>2]>>1]|0|0)<4){k=(c[h>>2]|0)+80|0;d=c[k+4>>2]|0;b=c[j>>2]|0;c[b>>2]=c[k>>2];c[b+4>>2]=d}else{c[m>>2]=0;d=Od(c[(c[h>>2]|0)+112>>2]|0,c[i>>2]|0)|0;c[m>>2]=d;if(d|0){d=(c[m>>2]|0)+32|0;b=c[d+4>>2]|0;k=c[j>>2]|0;c[k>>2]=c[d>>2];c[k+4>>2]=b;break}c[g>>2]=-8;n=c[g>>2]|0;l=f;return n|0}while(0);c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}function Td(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;f=l;l=l+32|0;g=f+20|0;h=f+16|0;i=f+12|0;j=f+8|0;k=f+4|0;m=f;c[h>>2]=a;c[i>>2]=b;c[j>>2]=d;c[k>>2]=-1;d=Kd(c[h>>2]|0,c[j>>2]|0)|0;c[k>>2]=d;if((d|0)<0){c[g>>2]=c[k>>2];n=c[g>>2]|0;l=f;return n|0}do if((e[c[h>>2]>>1]|0|0)<4){k=(c[h>>2]|0)+88|0;d=c[k+4>>2]|0;b=c[j>>2]|0;c[b>>2]=c[k>>2];c[b+4>>2]=d}else{c[m>>2]=0;d=Od(c[(c[h>>2]|0)+112>>2]|0,c[i>>2]|0)|0;c[m>>2]=d;if(d|0){d=(c[m>>2]|0)+16|0;b=c[d+4>>2]|0;k=c[j>>2]|0;c[k>>2]=c[d>>2];c[k+4>>2]=b;break}c[g>>2]=-8;n=c[g>>2]|0;l=f;return n|0}while(0);c[g>>2]=0;n=c[g>>2]|0;l=f;return n|0}function Ud(){var a=0;c[1394]=0;c[1401]=ie()|0;a=Ub(32)|0;c[1395]=a;od(a,-1,8,0)|0;kd(c[1395]|0,4,c[1401]|0)|0;md(c[1395]|0,5,c[1401]|0)|0;nd(c[1395]|0,8,c[1401]|0)|0;c[1396]=sd()|0;return}function Vd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;e=l;l=l+16|0;a=e+8|0;f=e;a:do switch(c[1394]|0){case 0:{if(!(c[b+8>>2]|0))if(!(c[1393]|0)){c[1394]=2;fa(c[1390]|0,c[1392]|0);g=_d(b,d)|0;break a}else{c[1394]=1;g=Zd(b,d)|0;break a}h=Db(c[1395]|0,d)|0;if(!(c[1389]|h)){c[1389]=1;c[1390]=2846;c[1398]=d;ra(c[b>>2]|0,c[b+4>>2]|0,-1.0,-1.0,0);g=0;break a}i=(c[1391]|0)==0;if((h|0)==1&i){c[1391]=1;c[1392]=2853;c[1399]=d;oa(c[b>>2]|0,c[b+4>>2]|0,-1.0);g=0;break a}if((h|0)==13&i){c[1391]=1;c[1392]=2860;c[1399]=d;oa(c[b>>2]|0,c[b+4>>2]|0,-1.0);g=0;break a}if((h|0)==6&(c[1393]|0)==0){c[1393]=1;c[1400]=d;h=zd(c[1396]|0,b)|0;if(!h){c[1397]=1;g=0;break a}if((h|0)<=0){c[f>>2]=h;Bf(2865,f)|0;g=-1}else g=0}else g=0;break}case 1:{g=Zd(b,d)|0;break}case 2:{g=_d(b,d)|0;break}default:{Bf(2902,a)|0;g=-1}}while(0);l=e;return g|0}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ke(a)|0;e=d>>>0>c>>>0?c:d;d=(oe(a,b,e)|0)<0;return (d?-1:e)|0}function Xd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=l;l=l+16|0;f=e;switch(d|0){case 0:{g=b;h=((b|0)<0)<<31>>31;break}case 1:{g=Lf(je(a)|0,D|0,b|0,((b|0)<0)<<31>>31|0)|0;h=D;break}default:{i=-1;l=e;return i|0}}if(!(le(a,g,h)|0)){i=g;l=e;return i|0}else{a=f;c[a>>2]=g;c[a+4>>2]=h;c[f+8>>2]=b;c[f+12>>2]=d;Bf(2795,f)|0;i=-1;l=e;return i|0}return 0}function Yd(a){a=a|0;var b=0;b=je(a)|0;return b|0}function Zd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0.0,j=0,k=0,m=0,n=0.0,o=0;d=l;l=l+32|0;e=d+16|0;f=d+8|0;g=d;h=kc(c[1395]|0)|0;i=(+(h>>>0)+4294967296.0*+(D|0))/1.0e3;h=lc(c[1395]|0)|0;j=D;k=qd(c[1395]|0,b)|0;m=f;c[m>>2]=0;c[m+4>>2]=0;m=g;c[m>>2]=0;c[m+4>>2]=0;rd(c[1395]|0,b,f,g)|0;m=Jf(h|0,j|0,k|0)|0;k=g;g=f;n=(+(m>>>0)+4294967296.0*+(D|0))*(+((c[k>>2]|0)>>>0)+4294967296.0*+(c[k+4>>2]|0))/(+((c[g>>2]|0)>>>0)+4294967296.0*+(c[g+4>>2]|0));do if((c[1393]|0)!=0&(c[1400]|0)==(b|0)){g=zd(c[1396]|0,a)|0;if((g|0)<0){c[e>>2]=g;Bf(2942,e)|0;o=-1;l=d;return o|0}else{if(!(c[a+12>>2]|0))break;c[1397]=1;c[1394]=2;fa(c[1390]|0,c[1392]|0);break}}while(0);if((c[1389]|0)!=0&(c[1398]|0)==(b|0)){e=c[a>>2]|0;g=c[a+4>>2]|0;k=lc(c[1395]|0)|0;m=D;f=qd(c[1395]|0,c[1398]|0)|0;j=Jf(k|0,m|0,f|0)|0;h=Of(j|0,D|0,f|0)|0;ra(e|0,g|0,+i,+n,(k|0)==(h|0)&(m|0)==(D|0)&1|0)}if(!((c[1391]|0)!=0&(c[1399]|0)==(b|0))){o=0;l=d;return o|0}oa(c[a>>2]|0,c[a+4>>2]|0,+i);o=0;l=d;return o|0}function _d(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0.0,i=0,j=0,k=0,m=0.0,n=0,o=0;d=l;l=l+16|0;e=d+8|0;f=d;g=kc(c[1395]|0)|0;h=(+(g>>>0)+4294967296.0*+(D|0))/1.0e3;g=lc(c[1395]|0)|0;i=D;j=qd(c[1395]|0,b)|0;k=e;c[k>>2]=0;c[k+4>>2]=0;k=f;c[k>>2]=0;c[k+4>>2]=0;rd(c[1395]|0,b,e,f)|0;k=Jf(g|0,i|0,j|0)|0;j=f;f=e;m=(+(k>>>0)+4294967296.0*+(D|0))*(+((c[j>>2]|0)>>>0)+4294967296.0*+(c[j+4>>2]|0))/(+((c[f>>2]|0)>>>0)+4294967296.0*+(c[f+4>>2]|0));if((c[1389]|0)!=0&(c[1398]|0)==(b|0)?(f=c[a+4>>2]|0,(f|0)>0):0){j=c[a>>2]|0;k=lc(c[1395]|0)|0;e=D;i=qd(c[1395]|0,c[1398]|0)|0;g=Jf(k|0,e|0,i|0)|0;n=Of(g|0,D|0,i|0)|0;ra(j|0,f|0,+h,+m,(k|0)==(n|0)&(e|0)==(D|0)&1|0);o=1;l=d;return o|0}if(!((c[1391]|0)!=0&(c[1399]|0)==(b|0))){o=0;l=d;return o|0}oa(c[a>>2]|0,c[a+4>>2]|0,+h);o=1;l=d;return o|0}function $d(a,b){a=a|0;b=b|0;ne(c[1401]|0,a,b);return}function ae(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;a=l;l=l+16|0;b=a;do{d=ke(c[1401]|0)|0;e=D;f=(e|0)<0|(e|0)==0&d>>>0<65536;e=f?d:65536;g=mc(c[1395]|0,e)|0;if((g|0)==-14){h=1;i=6;break}}while((g|0)>0);if((i|0)==6){l=a;return h|0}if(!g){h=0;l=a;return h|0}c[b>>2]=g;Bf(2980,b)|0;h=0;l=a;return h|0}function be(){ud(c[1396]|0)|0;_b(c[1395]|0)|0;pe(c[1401]|0);c[1401]=0;return}\nfunction ce(){var a=0,b=0,d=0,e=0;a=l;l=l+16|0;b=a;d=b;c[d>>2]=-1;c[d+4>>2]=-1;if(!(c[1397]|0)){e=-1;l=a;return e|0}Md(c[1396]|0,b)|0;e=c[b>>2]|0;l=a;return e|0}function de(){var a=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0.0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;a=l;l=l+48|0;d=a+42|0;e=a+40|0;f=a+32|0;g=a+24|0;h=a+16|0;i=a+8|0;j=a;if(!(c[1397]|0)){k=-1.0;l=a;return +k}b[d>>1]=-1;b[e>>1]=-1;Jd(c[1396]|0,d)|0;Ld(c[1396]|0,e)|0;e=c[1398]|0;if(!e)m=0;else{c[f>>2]=e;m=1}e=c[1399]|0;if(!e)if(!m){n=-1.0;o=-1.0}else{p=1;q=7}else{c[f+(m<<2)>>2]=e;p=m+1|0;q=7}if((q|0)==7){r=-1.0;q=0;s=-1.0;while(1){m=g;c[m>>2]=-1;c[m+4>>2]=-1;m=h;c[m>>2]=-1;c[m+4>>2]=-1;m=i;c[m>>2]=-1;c[m+4>>2]=-1;m=j;c[m>>2]=-1;c[m+4>>2]=-1;m=c[f+(q<<2)>>2]|0;Qd(c[1396]|0,m,g)|0;Rd(c[1396]|0,m,h)|0;Sd(c[1396]|0,m,i)|0;Td(c[1396]|0,m,j)|0;m=g;e=h;t=(+((c[m>>2]|0)>>>0)+4294967296.0*+(c[m+4>>2]|0))/(+((c[e>>2]|0)>>>0)+4294967296.0*+(c[e+4>>2]|0));u=r==-1.0|t<r?t:r;e=i;m=j;t=(+((c[e>>2]|0)>>>0)+4294967296.0*+(c[e+4>>2]|0))/(+((c[m>>2]|0)>>>0)+4294967296.0*+(c[m+4>>2]|0));v=s==-1.0|t>s?t:s;q=q+1|0;if((q|0)==(p|0)){n=u;o=v;break}else{r=u;s=v}}}k=o-n;l=a;return +k}function ee(){return 1}function fe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=l;l=l+16|0;d=b;e=b+8|0;f=d;c[f>>2]=-1;c[f+4>>2]=-1;if(!(c[1397]|0)){g=-1;l=b;return g|0}if(!(c[1389]|0))if(!(c[1391]|0)){h=e;i=0}else{j=5596;k=5}else{j=5592;k=5}if((k|0)==5){c[e>>2]=c[j>>2];h=e;i=1}Nd(c[1396]|0,h,i,a,((a|0)<0)<<31>>31,d)|0;g=c[d>>2]|0;l=b;return g|0}function ge(a){a=a|0;return 0}function he(){var a=0,b=0,d=0;a=l;l=l+16|0;b=a;qc(c[1395]|0)|0;d=pd(c[1395]|0,0,1)|0;if((d|0)<0){c[b>>2]=d;Bf(3005,b)|0}me(c[1401]|0);l=a;return}function ie(){var a=0,b=0;a=Cf(32)|0;b=a+16|0;c[b>>2]=0;c[b+4>>2]=0;c[a+4>>2]=0;c[a+8>>2]=8;c[a>>2]=Cf(192)|0;return a|0}function je(a){a=a|0;var b=0;b=a+16|0;D=c[b+4>>2]|0;return c[b>>2]|0}function ke(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=c[a+4>>2]|0;if(!b){d=a+16|0;e=c[d>>2]|0;f=c[d+4>>2]|0;g=e;h=f;i=e;j=f;k=Kf(g|0,h|0,i|0,j|0)|0;l=D;D=l;return k|0}else{f=c[a>>2]|0;e=b+-1|0;b=f+(e*24|0)+8|0;d=Lf(c[f+(e*24|0)+16>>2]|0,0,c[b>>2]|0,c[b+4>>2]|0)|0;b=a+16|0;g=d;h=D;i=c[b>>2]|0;j=c[b+4>>2]|0;k=Kf(g|0,h|0,i|0,j|0)|0;l=D;D=l;return k|0}return 0}function le(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=l;l=l+16|0;f=e+8|0;g=e;h=c[a+4>>2]|0;i=(h|0)==0;if(i)j=a+16|0;else j=(c[a>>2]|0)+8|0;k=j;j=c[k+4>>2]|0;if((j|0)>(d|0)|((j|0)==(d|0)?(c[k>>2]|0)>>>0>b>>>0:0)){k=g;c[k>>2]=b;c[k+4>>2]=d;Bf(3031,g)|0;m=a+24|0;n=-1;o=m;p=o;c[p>>2]=b;q=o+4|0;r=q;c[r>>2]=d;l=e;return n|0}if(i){i=a+16|0;s=c[i+4>>2]|0;t=c[i>>2]|0}else{i=c[a>>2]|0;g=h+-1|0;h=i+(g*24|0)+8|0;k=Lf(c[i+(g*24|0)+16>>2]|0,0,c[h>>2]|0,c[h+4>>2]|0)|0;s=D;t=k}if((s|0)<(d|0)|(s|0)==(d|0)&t>>>0<b>>>0){t=f;c[t>>2]=b;c[t+4>>2]=d;Bf(3031,f)|0;m=a+24|0;n=-1;o=m;p=o;c[p>>2]=b;q=o+4|0;r=q;c[r>>2]=d;l=e;return n|0}else{m=a+16|0;n=0;o=m;p=o;c[p>>2]=b;q=o+4|0;r=q;c[r>>2]=d;l=e;return n|0}return 0}function me(a){a=a|0;var b=0,d=0,e=0;b=a+4|0;if(!(c[b>>2]|0)){c[b>>2]=0;return}d=c[a>>2]|0;e=0;do{Df(c[d+(e*24|0)>>2]|0);d=c[a>>2]|0;c[d+(e*24|0)>>2]=0;e=e+1|0}while(e>>>0<(c[b>>2]|0)>>>0);c[b>>2]=0;return}function ne(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;do if((f|0)==(c[g>>2]|0))if(!f)h=0;else{i=a+16|0;j=c[a>>2]|0;k=f;l=0;while(1){m=j+(l*24|0)+8|0;n=Lf(c[j+(l*24|0)+16>>2]|0,0,c[m>>2]|0,c[m+4>>2]|0)|0;m=D;o=i;p=c[o+4>>2]|0;if(!((m|0)<(p|0)|((m|0)==(p|0)?n>>>0<(c[o>>2]|0)>>>0:0))){q=6;break}Df(c[j+(l*24|0)>>2]|0);o=c[a>>2]|0;c[o+(l*24|0)>>2]=0;n=l+1|0;p=c[e>>2]|0;if(n>>>0<p>>>0){j=o;k=p;l=n}else{r=p;s=o;t=n;break}}if((q|0)==6)if(!l){h=k;break}else{r=k;s=j;t=l}i=r-t|0;c[e>>2]=i;Xf(s|0,s+(t*24|0)|0,i*24|0)|0;h=c[e>>2]|0}else h=f;while(0);f=c[g>>2]|0;t=f+8|0;if((h|0)==(f|0)){c[g>>2]=t;c[a>>2]=Ff(c[a>>2]|0,t*24|0)|0;u=c[e>>2]|0}else u=h;if(!u){h=a+16|0;v=c[a>>2]|0;w=c[h>>2]|0;x=c[h+4>>2]|0;y=v+(u*24|0)+8|0;z=y;A=z;c[A>>2]=w;B=z+4|0;C=B;c[C>>2]=x;E=v+(u*24|0)+16|0;c[E>>2]=d;F=Cf(d)|0;G=v+(u*24|0)|0;c[G>>2]=F;Wf(F|0,b|0,d|0)|0;H=c[e>>2]|0;I=H+1|0;c[e>>2]=I;return}else{h=c[a>>2]|0;a=u+-1|0;t=h+(a*24|0)+8|0;g=Lf(c[h+(a*24|0)+16>>2]|0,0,c[t>>2]|0,c[t+4>>2]|0)|0;v=h;w=g;x=D;y=v+(u*24|0)+8|0;z=y;A=z;c[A>>2]=w;B=z+4|0;C=B;c[C>>2]=x;E=v+(u*24|0)+16|0;c[E>>2]=d;F=Cf(d)|0;G=v+(u*24|0)|0;c[G>>2]=F;Wf(F|0,b|0,d|0)|0;H=c[e>>2]|0;I=H+1|0;c[e>>2]=I;return}}function oe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;e=l;l=l+32|0;f=e+16|0;g=e;h=a+4|0;i=c[h>>2]|0;j=(i|0)==0;k=a+16|0;m=k;n=c[m>>2]|0;o=c[m+4>>2]|0;if(j){p=n;q=o}else{m=c[a>>2]|0;r=i+-1|0;s=m+(r*24|0)+8|0;t=Lf(c[m+(r*24|0)+16>>2]|0,0,c[s>>2]|0,c[s+4>>2]|0)|0;p=t;q=D}t=Kf(p|0,q|0,n|0,o|0)|0;q=D;if((q|0)<0|(q|0)==0&t>>>0<d>>>0){c[g>>2]=d;t=g+8|0;c[t>>2]=n;c[t+4>>2]=o;Bf(3055,g)|0;u=-1;l=e;return u|0}a:do if(j){v=n;w=o}else{g=o;t=n;q=i;p=0;s=0;r=d;while(1){m=c[a>>2]|0;x=m+(p*24|0)+8|0;y=c[x>>2]|0;z=c[x+4>>2]|0;x=c[m+(p*24|0)+16>>2]|0;A=Lf(x|0,0,y|0,z|0)|0;B=D;if((B|0)<(g|0)|(B|0)==(g|0)&A>>>0<t>>>0){C=q;E=t;F=g;G=s;H=r}else{A=Kf(t|0,g|0,y|0,z|0)|0;z=x-A|0;x=z>>>0>r>>>0?r:z;Wf(b+s|0,(c[m+(p*24|0)>>2]|0)+A|0,x|0)|0;A=k;m=Lf(c[A>>2]|0,c[A+4>>2]|0,x|0,0)|0;A=D;z=k;c[z>>2]=m;c[z+4>>2]=A;z=r-x|0;if(!z){u=0;break}C=c[h>>2]|0;E=m;F=A;G=x+s|0;H=z}p=p+1|0;if(p>>>0>=C>>>0){v=E;w=F;break a}else{g=F;t=E;q=C;s=G;r=H}}l=e;return u|0}while(0);c[f>>2]=d;d=f+8|0;c[d>>2]=v;c[d+4>>2]=w;Bf(3090,f)|0;u=-1;l=e;return u|0}function pe(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+4|0;if(!(c[b>>2]|0)){d=c[a>>2]|0;c[b>>2]=0;Df(d);Df(a);return}e=c[a>>2]|0;f=0;do{Df(c[e+(f*24|0)>>2]|0);e=c[a>>2]|0;c[e+(f*24|0)>>2]=0;f=f+1|0}while(f>>>0<(c[b>>2]|0)>>>0);d=e;c[b>>2]=0;Df(d);Df(a);return}function qe(){return 5608}function re(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=ye(c[a+60>>2]|0)|0;a=ue(ia(6,d|0)|0)|0;l=b;return a|0}function se(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=l;l=l+48|0;f=e+16|0;g=e;h=e+32|0;i=a+28|0;j=c[i>>2]|0;c[h>>2]=j;k=a+20|0;m=(c[k>>2]|0)-j|0;c[h+4>>2]=m;c[h+8>>2]=b;c[h+12>>2]=d;b=m+d|0;m=a+60|0;c[g>>2]=c[m>>2];c[g+4>>2]=h;c[g+8>>2]=2;j=ue(qa(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=j;n=h;o=2;p=b;while(1){if((g|0)<0)break;p=p-g|0;q=c[n+4>>2]|0;r=g>>>0>q>>>0;s=r?n+8|0:n;t=(r<<31>>31)+o|0;u=g-(r?q:0)|0;c[s>>2]=(c[s>>2]|0)+u;q=s+4|0;c[q>>2]=(c[q>>2]|0)-u;c[f>>2]=c[m>>2];c[f+4>>2]=s;c[f+8>>2]=t;g=ue(qa(146,f|0)|0)|0;if((p|0)==(g|0)){v=3;break a}else{n=s;o=t}}c[a+16>>2]=0;c[i>>2]=0;c[k>>2]=0;c[a>>2]=c[a>>2]|32;if((o|0)==2)w=0;else w=d-(c[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=c[a+44>>2]|0;c[a+16>>2]=v+(c[a+48>>2]|0);c[i>>2]=v;c[k>>2]=v;w=d}l=e;return w|0}function te(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+32|0;f=e;g=e+20|0;c[f>>2]=c[a+60>>2];c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=g;c[f+16>>2]=d;if((ue(pa(140,f|0)|0)|0)<0){c[g>>2]=-1;h=-1}else h=c[g>>2]|0;l=e;return h|0}function ue(a){a=a|0;var b=0;if(a>>>0>4294963200){c[(ve()|0)>>2]=0-a;b=-1}else b=a;return b|0}function ve(){return (we()|0)+64|0}function we(){return xe()|0}function xe(){return 2152}function ye(a){a=a|0;return a|0}function ze(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[b+36>>2]=6;if((c[b>>2]&64|0)==0?(c[g>>2]=c[b+60>>2],c[g+4>>2]=21523,c[g+8>>2]=f+16,na(54,g|0)|0):0)a[b+75>>0]=-1;g=se(b,d,e)|0;l=f;return g|0}function Ae(a){a=a|0;var b=0;b=(Be(a)|0)==0;return (b?a:a|32)|0}function Be(a){a=a|0;return (a+-65|0)>>>0<26|0}function Ce(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=b;b=c;do{d=d+1|0;b=b+1|0;c=a[d>>0]|0;e=a[b>>0]|0}while(!(c<<24>>24==0?1:c<<24>>24!=e<<24>>24));f=e;g=c}return (g&255)-(f&255)|0}function De(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=b;g=d;h=c;while(1){i=a[f>>0]|0;j=a[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}function Ee(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+224|0;g=f+120|0;h=f+80|0;i=f;j=f+136|0;k=h;m=k+40|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[g>>2]=c[e>>2];if((Fe(0,d,g,i,h)|0)<0)n=-1;else{if((c[b+76>>2]|0)>-1)o=Ge(b)|0;else o=0;e=c[b>>2]|0;k=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){m=b+44|0;p=c[m>>2]|0;c[m>>2]=j;q=b+28|0;c[q>>2]=j;r=b+20|0;c[r>>2]=j;c[e>>2]=80;s=b+16|0;c[s>>2]=j+80;j=Fe(b,d,g,i,h)|0;if(!p)t=j;else{ta[c[b+36>>2]&7](b,0,0)|0;u=(c[r>>2]|0)==0?-1:j;c[m>>2]=p;c[e>>2]=0;c[s>>2]=0;c[q>>2]=0;c[r>>2]=0;t=u}}else t=Fe(b,d,g,i,h)|0;h=c[b>>2]|0;c[b>>2]=h|k;if(o|0)He(b);n=(h&32|0)==0?t:-1}l=f;return n|0}function Fe(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;j=l;l=l+64|0;k=j+16|0;m=j;n=j+24|0;o=j+8|0;p=j+20|0;c[k>>2]=e;q=(d|0)!=0;r=n+40|0;s=r;t=n+39|0;n=o+4|0;u=e;e=0;v=0;w=0;a:while(1){do if((e|0)>-1)if((v|0)>(2147483647-e|0)){c[(ve()|0)>>2]=75;x=-1;break}else{x=v+e|0;break}else x=e;while(0);y=a[u>>0]|0;if(!(y<<24>>24)){z=87;break}else{A=y;B=u}b:while(1){switch(A<<24>>24){case 37:{C=B;E=B;z=9;break b;break}case 0:{F=B;G=B;break b;break}default:{}}y=B+1|0;c[k>>2]=y;A=a[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((a[C+1>>0]|0)!=37){F=C;G=E;break c}y=E+1|0;H=C+2|0;c[k>>2]=H;if((a[H>>0]|0)==37){C=H;E=y;z=9}else{F=H;G=y;break}}while(0);y=G-u|0;if(q)Ie(d,u,y);if(y|0){u=F;e=x;v=y;continue}y=F+1|0;H=(a[y>>0]|0)+-48|0;if(H>>>0<10){I=(a[F+2>>0]|0)==36;J=I?H:-1;K=I?1:w;L=I?F+3|0:y}else{J=-1;K=w;L=y}c[k>>2]=L;y=a[L>>0]|0;I=(y<<24>>24)+-32|0;d:do if(I>>>0<32){H=y;M=0;N=L;O=I;while(1){P=1<<O;if(!(P&75913)){Q=H;R=N;S=M;break d}T=P|M;P=N+1|0;c[k>>2]=P;U=a[P>>0]|0;O=(U<<24>>24)+-32|0;if(O>>>0>=32){Q=U;R=P;S=T;break}else{H=U;M=T;N=P}}}else{Q=y;R=L;S=0}while(0);if(Q<<24>>24==42){y=R+1|0;I=(a[y>>0]|0)+-48|0;if(I>>>0<10?(a[R+2>>0]|0)==36:0){c[i+(I<<2)>>2]=10;V=1;W=R+3|0;X=c[g+((a[y>>0]|0)+-48<<3)>>2]|0}else{if(K|0){Y=-1;break}if(q){I=(c[f>>2]|0)+(4-1)&~(4-1);N=c[I>>2]|0;c[f>>2]=I+4;V=0;W=y;X=N}else{V=0;W=y;X=0}}c[k>>2]=W;y=(X|0)<0;Z=W;_=y?S|8192:S;$=V;aa=y?0-X|0:X}else{y=Je(k)|0;if((y|0)<0){Y=-1;break}Z=c[k>>2]|0;_=S;$=K;aa=y}do if((a[Z>>0]|0)==46){if((a[Z+1>>0]|0)!=42){c[k>>2]=Z+1;y=Je(k)|0;ba=c[k>>2]|0;ca=y;break}y=Z+2|0;N=(a[y>>0]|0)+-48|0;if(N>>>0<10?(a[Z+3>>0]|0)==36:0){c[i+(N<<2)>>2]=10;N=c[g+((a[y>>0]|0)+-48<<3)>>2]|0;I=Z+4|0;c[k>>2]=I;ba=I;ca=N;break}if($|0){Y=-1;break a}if(q){N=(c[f>>2]|0)+(4-1)&~(4-1);I=c[N>>2]|0;c[f>>2]=N+4;da=I}else da=0;c[k>>2]=y;ba=y;ca=da}else{ba=Z;ca=-1}while(0);y=ba;I=0;while(1){if(((a[y>>0]|0)+-65|0)>>>0>57){Y=-1;break a}ea=y+1|0;c[k>>2]=ea;fa=a[(a[y>>0]|0)+-65+(3127+(I*58|0))>>0]|0;ga=fa&255;if((ga+-1|0)>>>0<8){y=ea;I=ga}else break}if(!(fa<<24>>24)){Y=-1;break}N=(J|0)>-1;do if(fa<<24>>24==19)if(N){Y=-1;break a}else z=49;else{if(N){c[i+(J<<2)>>2]=ga;M=g+(J<<3)|0;H=c[M+4>>2]|0;O=m;c[O>>2]=c[M>>2];c[O+4>>2]=H;z=49;break}if(!q){Y=0;break a}Ke(m,ga,f)}while(0);if((z|0)==49?(z=0,!q):0){u=ea;e=x;v=0;w=$;continue}N=a[y>>0]|0;H=(I|0)!=0&(N&15|0)==3?N&-33:N;N=_&-65537;O=(_&8192|0)==0?_:N;e:do switch(H|0){case 110:{switch((I&255)<<24>>24){case 0:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 1:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 2:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}case 3:{b[c[m>>2]>>1]=x;u=ea;e=x;v=0;w=$;continue a;break}case 4:{a[c[m>>2]>>0]=x;u=ea;e=x;v=0;w=$;continue a;break}case 6:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 7:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}default:{u=ea;e=x;v=0;w=$;continue a}}break}case 112:{ha=O|8;ia=ca>>>0>8?ca:8;ja=120;z=61;break}case 88:case 120:{ha=O;ia=ca;ja=H;z=61;break}case 111:{M=m;P=c[M>>2]|0;T=c[M+4>>2]|0;M=Me(P,T,r)|0;U=s-M|0;ka=P;la=T;ma=M;na=O;oa=(O&8|0)==0|(ca|0)>(U|0)?ca:U+1|0;pa=0;qa=3591;z=67;break}case 105:case 100:{U=m;M=c[U>>2]|0;T=c[U+4>>2]|0;if((T|0)<0){U=Kf(0,0,M|0,T|0)|0;P=D;ra=m;c[ra>>2]=U;c[ra+4>>2]=P;sa=U;ta=P;ua=1;va=3591;z=66;break e}else{sa=M;ta=T;ua=(O&2049|0)!=0&1;va=(O&2048|0)==0?((O&1|0)==0?3591:3593):3592;z=66;break e}break}case 117:{T=m;sa=c[T>>2]|0;ta=c[T+4>>2]|0;ua=0;va=3591;z=66;break}case 99:{a[t>>0]=c[m>>2];wa=t;xa=N;ya=1;za=0;Aa=3591;Ba=r;break}case 109:{Ca=Oe(c[(ve()|0)>>2]|0)|0;z=71;break}case 115:{T=c[m>>2]|0;Ca=T|0?T:3601;z=71;break}case 67:{c[o>>2]=c[m>>2];c[n>>2]=0;c[m>>2]=o;Da=o;Ea=-1;z=75;break}case 83:{T=c[m>>2]|0;if(!ca){Qe(d,32,aa,0,O);Fa=0;z=84}else{Da=T;Ea=ca;z=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{u=ea;e=x;v=Se(d,+h[m>>3],aa,ca,O,H)|0;w=$;continue a;break}default:{wa=u;xa=O;ya=ca;za=0;Aa=3591;Ba=r}}while(0);f:do if((z|0)==61){z=0;H=m;I=c[H>>2]|0;y=c[H+4>>2]|0;H=Le(I,y,r,ja&32)|0;T=(ha&8|0)==0|(I|0)==0&(y|0)==0;ka=I;la=y;ma=H;na=ha;oa=ia;pa=T?0:2;qa=T?3591:3591+(ja>>4)|0;z=67}else if((z|0)==66){z=0;ka=sa;la=ta;ma=Ne(sa,ta,r)|0;na=O;oa=ca;pa=ua;qa=va;z=67}else if((z|0)==71){z=0;T=Pe(Ca,0,ca)|0;H=(T|0)==0;wa=Ca;xa=N;ya=H?ca:T-Ca|0;za=0;Aa=3591;Ba=H?Ca+ca|0:T}else if((z|0)==75){z=0;T=0;H=0;y=Da;while(1){I=c[y>>2]|0;if(!I){Ga=T;Ha=H;break}M=Re(p,I)|0;if((M|0)<0|M>>>0>(Ea-T|0)>>>0){Ga=T;Ha=M;break}I=M+T|0;if(Ea>>>0>I>>>0){T=I;H=M;y=y+4|0}else{Ga=I;Ha=M;break}}if((Ha|0)<0){Y=-1;break a}Qe(d,32,aa,Ga,O);if(!Ga){Fa=0;z=84}else{y=0;H=Da;while(1){T=c[H>>2]|0;if(!T){Fa=Ga;z=84;break f}M=Re(p,T)|0;y=M+y|0;if((y|0)>(Ga|0)){Fa=Ga;z=84;break f}Ie(d,p,M);if(y>>>0>=Ga>>>0){Fa=Ga;z=84;break}else H=H+4|0}}}while(0);if((z|0)==67){z=0;N=(ka|0)!=0|(la|0)!=0;H=(oa|0)!=0|N;y=((N^1)&1)+(s-ma)|0;wa=H?ma:r;xa=(oa|0)>-1?na&-65537:na;ya=H?((oa|0)>(y|0)?oa:y):oa;za=pa;Aa=qa;Ba=r}else if((z|0)==84){z=0;Qe(d,32,aa,Fa,O^8192);u=ea;e=x;v=(aa|0)>(Fa|0)?aa:Fa;w=$;continue}y=Ba-wa|0;H=(ya|0)<(y|0)?y:ya;N=H+za|0;M=(aa|0)<(N|0)?N:aa;Qe(d,32,M,N,xa);Ie(d,Aa,za);Qe(d,48,M,N,xa^65536);Qe(d,48,H,y,0);Ie(d,wa,y);Qe(d,32,M,N,xa^8192);u=ea;e=x;v=M;w=$}g:do if((z|0)==87)if(!d)if(!w)Y=0;else{$=1;while(1){v=c[i+($<<2)>>2]|0;if(!v){Ia=$;break}Ke(g+($<<3)|0,v,f);$=$+1|0;if(($|0)>=10){Y=1;break g}}while(1){if(c[i+(Ia<<2)>>2]|0){Y=-1;break g}Ia=Ia+1|0;if((Ia|0)>=10){Y=1;break}}}else Y=x;while(0);l=j;return Y|0}function Ge(a){a=a|0;return 0}function He(a){a=a|0;return}function Ie(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))cf(b,d,a)|0;return}function Je(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;e=(a[d>>0]|0)+-48|0;if(e>>>0<10){f=d;d=0;g=e;while(1){e=g+(d*10|0)|0;f=f+1|0;c[b>>2]=f;g=(a[f>>0]|0)+-48|0;if(g>>>0>=10){h=e;break}else d=e}}else h=0;return h|0}function Ke(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f;break a;break}case 10:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a;break}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=f;c[e+4>>2]=0;break a;break}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);f=e;g=c[f>>2]|0;i=c[f+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=g;c[e+4>>2]=i;break a;break}case 13:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&65535)<<16>>16;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 14:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&65535;c[i+4>>2]=0;break a;break}case 15:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&255)<<24>>24;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 16:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&255;c[i+4>>2]=0;break a;break}case 17:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}case 18:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}default:break a}while(0);while(0);return}function Le(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==0&(c|0)==0)g=e;else{h=b;b=c;c=e;while(1){e=c+-1|0;a[e>>0]=d[3643+(h&15)>>0]|0|f;h=Nf(h|0,b|0,4)|0;b=D;if((h|0)==0&(b|0)==0){g=e;break}else c=e}}return g|0}function Me(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((b|0)==0&(c|0)==0)e=d;else{f=b;b=c;c=d;while(1){d=c+-1|0;a[d>>0]=f&7|48;f=Nf(f|0,b|0,3)|0;b=D;if((f|0)==0&(b|0)==0){e=d;break}else c=d}}return e|0}function Ne(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){e=b;f=c;c=d;while(1){g=Yf(e|0,f|0,10,0)|0;c=c+-1|0;a[c>>0]=g&255|48;g=e;e=Sf(e|0,f|0,10,0)|0;if(!(f>>>0>9|(f|0)==9&g>>>0>4294967295))break;else f=D}h=c;i=e}else{h=d;i=b}if(!i)j=h;else{b=h;h=i;while(1){i=b+-1|0;a[i>>0]=(h>>>0)%10|0|48;if(h>>>0<10){j=i;break}else{b=i;h=(h>>>0)/10|0}}}return j|0}function Oe(a){a=a|0;return Ze(a,c[(Ye()|0)+188>>2]|0)|0}function Pe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=d&255;g=(e|0)!=0;a:do if(g&(b&3|0)!=0){h=d&255;i=e;j=b;while(1){if((a[j>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=j+1|0;o=i+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=o;j=n}else{q=o;r=n;s=p;m=5;break}}}else{q=e;r=b;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=0;u=r}b:do if((m|0)==6){r=d&255;if((a[l>>0]|0)==r<<24>>24){t=k;u=l}else{q=S(f,16843009)|0;c:do if(k>>>0>3){s=k;g=l;while(1){b=c[g>>2]^q;if((b&-2139062144^-2139062144)&b+-16843009|0)break;b=g+4|0;e=s+-4|0;if(e>>>0>3){s=e;g=b}else{v=e;w=b;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!v){t=0;u=w;break}else{x=v;y=w}while(1){if((a[y>>0]|0)==r<<24>>24){t=x;u=y;break b}q=y+1|0;x=x+-1|0;if(!x){t=0;u=q;break}else y=q}}}while(0);return (t|0?u:0)|0}function Qe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Mf(g|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{Ie(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;Ie(a,g,h)}l=f;return}function Re(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=We(a,b,0)|0;return c|0}function Se(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;j=l;l=l+560|0;k=j+8|0;m=j;n=j+524|0;o=n;p=j+512|0;c[m>>2]=0;q=p+12|0;Te(e)|0;if((D|0)<0){r=1;s=3608;t=-e}else{r=(h&2049|0)!=0&1;s=(h&2048|0)==0?((h&1|0)==0?3609:3614):3611;t=e}Te(t)|0;u=D&2146435072;do if(u>>>0<2146435072|(u|0)==2146435072&0<0){e=+Ue(t,m)*2.0;v=e!=0.0;if(v)c[m>>2]=(c[m>>2]|0)+-1;w=i|32;if((w|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-g|0;do if(!(g>>>0>11|(A|0)==0)){B=A;C=8.0;do{B=B+-1|0;C=C*16.0}while((B|0)!=0);if((a[y>>0]|0)==45){E=-(C+(-e-C));break}else{E=e+C-C;break}}else E=e;while(0);A=c[m>>2]|0;B=(A|0)<0?0-A|0:A;F=Ne(B,((B|0)<0)<<31>>31,q)|0;if((F|0)==(q|0)){B=p+11|0;a[B>>0]=48;G=B}else G=F;a[G+-1>>0]=(A>>31&2)+43;A=G+-2|0;a[A>>0]=i+15;F=(g|0)<1;B=(h&8|0)==0;H=n;I=E;while(1){J=~~I;K=H+1|0;a[H>>0]=d[3643+J>>0]|x;I=(I-+(J|0))*16.0;if((K-o|0)==1?!(B&(F&I==0.0)):0){a[K>>0]=46;L=H+2|0}else L=K;if(!(I!=0.0))break;else H=L}H=L-o|0;F=q-A|0;B=(g|0)!=0&(H+-2|0)<(g|0)?g+2|0:H;x=F+z+B|0;Qe(b,32,f,x,h);Ie(b,y,z);Qe(b,48,f,x,h^65536);Ie(b,n,H);Qe(b,48,B-H|0,0,0);Ie(b,A,F);Qe(b,32,f,x,h^8192);M=x;break}x=(g|0)<0?6:g;if(v){F=(c[m>>2]|0)+-28|0;c[m>>2]=F;N=F;O=e*268435456.0}else{N=c[m>>2]|0;O=e}F=(N|0)<0?k:k+288|0;I=O;H=F;do{B=~~I>>>0;c[H>>2]=B;H=H+4|0;I=(I-+(B>>>0))*1.0e9}while(I!=0.0);if((N|0)>0){v=N;A=F;z=H;while(1){y=(v|0)<29?v:29;B=z+-4|0;if(B>>>0>=A>>>0){K=0;J=B;do{B=Of(c[J>>2]|0,0,y|0)|0;P=Lf(B|0,D|0,K|0,0)|0;B=D;Q=Yf(P|0,B|0,1e9,0)|0;c[J>>2]=Q;K=Sf(P|0,B|0,1e9,0)|0;J=J+-4|0}while(J>>>0>=A>>>0);if(K){J=A+-4|0;c[J>>2]=K;R=J}else R=A}else R=A;J=z;while(1){if(J>>>0<=R>>>0)break;B=J+-4|0;if(!(c[B>>2]|0))J=B;else break}K=(c[m>>2]|0)-y|0;c[m>>2]=K;if((K|0)>0){v=K;A=R;z=J}else{T=K;U=R;V=J;break}}}else{T=N;U=F;V=H}if((T|0)<0){z=((x+25|0)/9|0)+1|0;A=(w|0)==102;v=T;K=U;B=V;while(1){P=0-v|0;Q=(P|0)<9?P:9;if(K>>>0<B>>>0){P=(1<<Q)+-1|0;W=1e9>>>Q;X=0;Y=K;do{Z=c[Y>>2]|0;c[Y>>2]=(Z>>>Q)+X;X=S(Z&P,W)|0;Y=Y+4|0}while(Y>>>0<B>>>0);Y=(c[K>>2]|0)==0?K+4|0:K;if(!X){_=Y;$=B}else{c[B>>2]=X;_=Y;$=B+4|0}}else{_=(c[K>>2]|0)==0?K+4|0:K;$=B}Y=A?F:_;W=($-Y>>2|0)>(z|0)?Y+(z<<2)|0:$;v=(c[m>>2]|0)+Q|0;c[m>>2]=v;if((v|0)>=0){aa=_;ba=W;break}else{K=_;B=W}}}else{aa=U;ba=V}B=F;if(aa>>>0<ba>>>0){K=(B-aa>>2)*9|0;v=c[aa>>2]|0;if(v>>>0<10)ca=K;else{z=K;K=10;while(1){K=K*10|0;A=z+1|0;if(v>>>0<K>>>0){ca=A;break}else z=A}}}else ca=0;z=(w|0)==103;K=(x|0)!=0;v=x-((w|0)!=102?ca:0)+((K&z)<<31>>31)|0;if((v|0)<(((ba-B>>2)*9|0)+-9|0)){A=v+9216|0;v=F+4+(((A|0)/9|0)+-1024<<2)|0;H=((A|0)%9|0)+1|0;if((H|0)<9){A=10;W=H;while(1){H=A*10|0;W=W+1|0;if((W|0)==9){da=H;break}else A=H}}else da=10;A=c[v>>2]|0;W=(A>>>0)%(da>>>0)|0;w=(v+4|0)==(ba|0);if(!(w&(W|0)==0)){C=(((A>>>0)/(da>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;H=(da|0)/2|0;I=W>>>0<H>>>0?.5:w&(W|0)==(H|0)?1.0:1.5;if(!r){ea=C;fa=I}else{H=(a[s>>0]|0)==45;ea=H?-C:C;fa=H?-I:I}H=A-W|0;c[v>>2]=H;if(ea+fa!=ea){W=H+da|0;c[v>>2]=W;if(W>>>0>999999999){W=aa;H=v;while(1){A=H+-4|0;c[H>>2]=0;if(A>>>0<W>>>0){w=W+-4|0;c[w>>2]=0;ga=w}else ga=W;w=(c[A>>2]|0)+1|0;c[A>>2]=w;if(w>>>0>999999999){W=ga;H=A}else{ha=ga;ia=A;break}}}else{ha=aa;ia=v}H=(B-ha>>2)*9|0;W=c[ha>>2]|0;if(W>>>0<10){ja=ha;ka=ia;la=H}else{A=H;H=10;while(1){H=H*10|0;w=A+1|0;if(W>>>0<H>>>0){ja=ha;ka=ia;la=w;break}else A=w}}}else{ja=aa;ka=v;la=ca}}else{ja=aa;ka=v;la=ca}A=ka+4|0;ma=ja;na=la;oa=ba>>>0>A>>>0?A:ba}else{ma=aa;na=ca;oa=ba}A=oa;while(1){if(A>>>0<=ma>>>0){pa=0;break}H=A+-4|0;if(!(c[H>>2]|0))A=H;else{pa=1;break}}v=0-na|0;do if(z){H=((K^1)&1)+x|0;if((H|0)>(na|0)&(na|0)>-5){qa=H+-1-na|0;ra=i+-1|0}else{qa=H+-1|0;ra=i+-2|0}H=h&8;if(!H){if(pa?(W=c[A+-4>>2]|0,(W|0)!=0):0)if(!((W>>>0)%10|0)){w=10;Y=0;while(1){w=w*10|0;P=Y+1|0;if((W>>>0)%(w>>>0)|0|0){sa=P;break}else Y=P}}else sa=0;else sa=9;Y=((A-B>>2)*9|0)+-9|0;if((ra|32|0)==102){w=Y-sa|0;W=(w|0)>0?w:0;ta=0;ua=(qa|0)<(W|0)?qa:W;va=ra;break}else{W=Y+na-sa|0;Y=(W|0)>0?W:0;ta=0;ua=(qa|0)<(Y|0)?qa:Y;va=ra;break}}else{ta=H;ua=qa;va=ra}}else{ta=h&8;ua=x;va=i}while(0);x=ua|ta;B=(x|0)!=0&1;K=(va|32|0)==102;if(K){wa=0;xa=(na|0)>0?na:0}else{z=(na|0)<0?v:na;Y=Ne(z,((z|0)<0)<<31>>31,q)|0;z=q;if((z-Y|0)<2){W=Y;while(1){w=W+-1|0;a[w>>0]=48;if((z-w|0)<2)W=w;else{ya=w;break}}}else ya=Y;a[ya+-1>>0]=(na>>31&2)+43;W=ya+-2|0;a[W>>0]=va;wa=W;xa=z-W|0}W=r+1+ua+B+xa|0;Qe(b,32,f,W,h);Ie(b,s,r);Qe(b,48,f,W,h^65536);if(K){v=ma>>>0>F>>>0?F:ma;w=n+9|0;Q=w;X=n+8|0;P=v;do{J=Ne(c[P>>2]|0,0,w)|0;if((P|0)==(v|0))if((J|0)==(w|0)){a[X>>0]=48;za=X}else za=J;else if(J>>>0>n>>>0){Mf(n|0,48,J-o|0)|0;y=J;while(1){Z=y+-1|0;if(Z>>>0>n>>>0)y=Z;else{za=Z;break}}}else za=J;Ie(b,za,Q-za|0);P=P+4|0}while(P>>>0<=F>>>0);if(x|0)Ie(b,3659,1);if(P>>>0<A>>>0&(ua|0)>0){F=P;Q=ua;while(1){X=Ne(c[F>>2]|0,0,w)|0;if(X>>>0>n>>>0){Mf(n|0,48,X-o|0)|0;v=X;while(1){K=v+-1|0;if(K>>>0>n>>>0)v=K;else{Aa=K;break}}}else Aa=X;Ie(b,Aa,(Q|0)<9?Q:9);F=F+4|0;v=Q+-9|0;if(!(F>>>0<A>>>0&(Q|0)>9)){Ba=v;break}else Q=v}}else Ba=ua;Qe(b,48,Ba+9|0,9,0)}else{Q=pa?A:ma+4|0;if((ua|0)>-1){F=n+9|0;w=(ta|0)==0;P=F;x=0-o|0;v=n+8|0;J=ma;K=ua;while(1){B=Ne(c[J>>2]|0,0,F)|0;if((B|0)==(F|0)){a[v>>0]=48;Ca=v}else Ca=B;do if((J|0)==(ma|0)){B=Ca+1|0;Ie(b,Ca,1);if(w&(K|0)<1){Da=B;break}Ie(b,3659,1);Da=B}else{if(Ca>>>0<=n>>>0){Da=Ca;break}Mf(n|0,48,Ca+x|0)|0;B=Ca;while(1){z=B+-1|0;if(z>>>0>n>>>0)B=z;else{Da=z;break}}}while(0);X=P-Da|0;Ie(b,Da,(K|0)>(X|0)?X:K);B=K-X|0;J=J+4|0;if(!(J>>>0<Q>>>0&(B|0)>-1)){Ea=B;break}else K=B}}else Ea=ua;Qe(b,48,Ea+18|0,18,0);Ie(b,wa,q-wa|0)}Qe(b,32,f,W,h^8192);M=W}else{K=(i&32|0)!=0;Q=r+3|0;Qe(b,32,f,Q,h&-65537);Ie(b,s,r);Ie(b,t!=t|0.0!=0.0?(K?3635:3639):K?3627:3631,3);Qe(b,32,f,Q,h^8192);M=Q}while(0);l=j;return ((M|0)<(f|0)?f:M)|0}function Te(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function Ue(a,b){a=+a;b=b|0;return +(+Ve(a,b))}function Ve(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,k=0.0,l=0.0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Nf(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){g=+Ve(a*18446744073709551616.0,b);i=(c[b>>2]|0)+-64|0;k=g}else{i=0;k=a}c[b>>2]=i;l=k;break}case 2047:{l=a;break}default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;l=+h[j>>3]}}return +l}function We(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;do if(b){if(d>>>0<128){a[b>>0]=d;f=1;break}if(!(c[c[(Xe()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;f=1;break}else{c[(ve()|0)>>2]=84;f=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;f=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;f=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;f=4;break}else{c[(ve()|0)>>2]=84;f=-1;break}}else f=1;while(0);return f|0}function Xe(){return xe()|0}function Ye(){return xe()|0}function Ze(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=0;while(1){if((d[3661+f>>0]|0)==(b|0)){g=2;break}h=f+1|0;if((h|0)==87){i=87;j=3749;g=5;break}else f=h}if((g|0)==2)if(!f)k=3749;else{i=f;j=3749;g=5}if((g|0)==5)while(1){g=0;f=j;do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);i=i+-1|0;if(!i){k=f;break}else{j=f;g=5}}return _e(k,c[e+20>>2]|0)|0}function _e(a,b){a=a|0;b=b|0;return $e(a,b)|0}function $e(a,b){a=a|0;b=b|0;var d=0;if(!b)d=0;else d=af(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (d|0?d:a)|0}function af(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=(c[b>>2]|0)+1794895138|0;g=bf(c[b+8>>2]|0,f)|0;h=bf(c[b+12>>2]|0,f)|0;i=bf(c[b+16>>2]|0,f)|0;a:do if((g>>>0<d>>>2>>>0?(j=d-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=bf(c[b+(q<<2)>>2]|0,f)|0;s=bf(c[b+(q+1<<2)>>2]|0,f)|0;if(!(s>>>0<d>>>0&r>>>0<(d-s|0)>>>0)){t=0;break a}if(a[b+(s+r)>>0]|0){t=0;break a}r=Ce(e,b+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=bf(c[b+(m<<2)>>2]|0,f)|0;j=bf(c[b+(m+1<<2)>>2]|0,f)|0;if(j>>>0<d>>>0&l>>>0<(d-j|0)>>>0)t=(a[b+(j+l)>>0]|0)==0?b+j|0:0;else t=0}else t=0;while(0);return t|0}function bf(a,b){a=a|0;b=b|0;var c=0;c=Zf(a|0)|0;return ((b|0)==0?a:c)|0}function cf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(df(e)|0)){h=c[f>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=e+20|0;f=c[g>>2]|0;k=f;if((h-f|0)>>>0<d>>>0){j=ta[c[e+36>>2]&7](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){l=k;m=0;n=d;o=b;break b}p=f+-1|0;if((a[b+p>>0]|0)==10)break;else f=p}p=ta[c[e+36>>2]&7](e,b,f)|0;if(p>>>0<f>>>0){j=p;break a}l=c[g>>2]|0;m=f;n=d-f|0;o=b+f|0}else{l=k;m=0;n=d;o=b}while(0);Wf(l|0,o|0,n|0)|0;c[g>>2]=(c[g>>2]|0)+n;j=m+n|0}while(0);return j|0}function df(b){b=b|0;var d=0,e=0,f=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;e=c[b>>2]|0;if(!(e&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);f=0}else{c[b>>2]=e|32;f=-1}return f|0}function ef(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=a[b>>0]|0;f=e&255;a:do if(!(e<<24>>24)){g=f;h=c}else{i=e;j=f;k=b;l=c;while(1){m=a[l>>0]|0;if(!(m<<24>>24)){g=j;h=l;break a}if(i<<24>>24!=m<<24>>24?(n=Ae(j)|0,(n|0)!=(Ae(m&255)|0)):0){g=j;h=l;break a}k=k+1|0;m=l+1|0;i=a[k>>0]|0;n=i&255;if(!(i<<24>>24)){g=n;h=m;break}else{j=n;l=m}}}while(0);c=Ae(g)|0;return c-(Ae(d[h>>0]|0)|0)|0}function ff(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b;a:do if(!(d&3)){e=b;f=4}else{g=d;h=b;while(1){if(!(a[h>>0]|0)){i=g;break a}j=h+1|0;g=j;if(!(g&3)){e=j;f=4;break}else h=j}}while(0);if((f|0)==4){f=e;while(1){k=c[f>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))f=f+4|0;else break}if(!((k&255)<<24>>24))l=f;else{k=f;while(1){f=k+1|0;if(!(a[f>>0]|0)){l=f;break}else k=f}}i=l}return i-d|0}function gf(a,b){a=a|0;b=b|0;hf(a,b)|0;return a|0}function hf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=d;a:do if(!((e^b)&3)){if(!(e&3)){f=b;g=d}else{h=b;i=d;while(1){j=a[i>>0]|0;a[h>>0]=j;if(!(j<<24>>24)){k=h;break a}j=i+1|0;l=h+1|0;if(!(j&3)){f=l;g=j;break}else{h=l;i=j}}}i=c[g>>2]|0;if(!((i&-2139062144^-2139062144)&i+-16843009)){h=i;i=f;j=g;while(1){l=j+4|0;m=i+4|0;c[i>>2]=h;h=c[l>>2]|0;if((h&-2139062144^-2139062144)&h+-16843009|0){n=m;o=l;break}else{i=m;j=l}}}else{n=f;o=g}p=n;q=o;r=8}else{p=b;q=d;r=8}while(0);if((r|0)==8){r=a[q>>0]|0;a[p>>0]=r;if(!(r<<24>>24))k=p;else{r=p;p=q;while(1){p=p+1|0;q=r+1|0;d=a[p>>0]|0;a[q>>0]=d;if(!(d<<24>>24)){k=q;break}else r=q}}}return k|0}function jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=a;c[f+4>>2]=b;c[f+8>>2]=d;d=ue(ga(3,f|0)|0)|0;l=e;return d|0}function kf(a){a=a|0;var b=0,d=0,e=0;if(c[a+68>>2]|0){b=c[a+116>>2]|0;d=a+112|0;if(b|0)c[b+112>>2]=c[d>>2];a=c[d>>2]|0;if(!a)e=(lf()|0)+232|0;else e=a+116|0;c[e>>2]=b}return}function lf(){return xe()|0}function mf(){ha(5672);return 5680}function nf(){la(5672);return}function of(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if((c[a+76>>2]|0)>-1)b=Ge(a)|0;else b=0;kf(a);d=(c[a>>2]&1|0)!=0;if(!d){e=mf()|0;f=c[a+52>>2]|0;g=a+56|0;if(f|0)c[f+56>>2]=c[g>>2];h=c[g>>2]|0;if(h|0)c[h+52>>2]=f;if((c[e>>2]|0)==(a|0))c[e>>2]=h;nf()}h=pf(a)|0;e=va[c[a+12>>2]&15](a)|0|h;h=c[a+92>>2]|0;if(h|0)Df(h);if(d){if(b|0)He(a)}else Df(a);return e|0}function pf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;do if(a){if((c[a+76>>2]|0)<=-1){b=qf(a)|0;break}d=(Ge(a)|0)==0;e=qf(a)|0;if(d)b=e;else{He(a);b=e}}else{if(!(c[631]|0))f=0;else f=pf(c[631]|0)|0;e=c[(mf()|0)>>2]|0;if(!e)g=f;else{d=e;e=f;while(1){if((c[d+76>>2]|0)>-1)h=Ge(d)|0;else h=0;if((c[d+20>>2]|0)>>>0>(c[d+28>>2]|0)>>>0)i=qf(d)|0|e;else i=e;if(h|0)He(d);d=c[d+56>>2]|0;if(!d){g=i;break}else e=i}}nf();b=g}while(0);return b|0}function qf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a+20|0;d=a+28|0;if((c[b>>2]|0)>>>0>(c[d>>2]|0)>>>0?(ta[c[a+36>>2]&7](a,0,0)|0,(c[b>>2]|0)==0):0)e=-1;else{f=a+4|0;g=c[f>>2]|0;h=a+8|0;i=c[h>>2]|0;if(g>>>0<i>>>0)ta[c[a+40>>2]&7](a,g-i|0,1)|0;c[a+16>>2]=0;c[d>>2]=0;c[b>>2]=0;c[h>>2]=0;c[f>>2]=0;e=0}return e|0}function rf(a){a=a|0;var b=0,d=0,e=0;if((c[a+76>>2]|0)>-1){b=(Ge(a)|0)==0;d=(c[a>>2]|0)>>>5&1;if(b)e=d;else e=d}else e=(c[a>>2]|0)>>>5&1;return e|0}function sf(a,b,c){a=a|0;b=b|0;c=c|0;return tf(a,b,c)|0}function tf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[a+76>>2]|0)>-1){e=(Ge(a)|0)==0;f=uf(a,b,d)|0;if(e)g=f;else{He(a);g=f}}else g=uf(a,b,d)|0;return g|0}function uf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((d|0)==1)e=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)|0;else e=b;b=a+20|0;f=a+28|0;if((c[b>>2]|0)>>>0>(c[f>>2]|0)>>>0?(ta[c[a+36>>2]&7](a,0,0)|0,(c[b>>2]|0)==0):0)g=-1;else{c[a+16>>2]=0;c[f>>2]=0;c[b>>2]=0;if((ta[c[a+40>>2]&7](a,e,d)|0)<0)g=-1;else{c[a+8>>2]=0;c[a+4>>2]=0;c[a>>2]=c[a>>2]&-17;g=0}}return g|0}function vf(a,b,c){a=a|0;b=b|0;c=c|0;wf(a,b,c)|0;return a|0}function wf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;f=d;do if(!((f^b)&3)){g=(e|0)!=0;a:do if(g&(f&3|0)!=0){h=b;i=e;j=d;while(1){k=a[j>>0]|0;a[h>>0]=k;if(!(k<<24>>24)){l=h;m=i;n=j;break a}k=i+-1|0;o=j+1|0;p=h+1|0;q=(k|0)!=0;if(q&(o&3|0)!=0){h=p;i=k;j=o}else{r=p;s=k;t=o;u=q;v=5;break}}}else{r=b;s=e;t=d;u=g;v=5}while(0);if((v|0)==5)if(u){l=r;m=s;n=t}else{w=r;x=0;break}if(!(a[n>>0]|0)){w=l;x=m}else{b:do if(m>>>0>3){g=m;j=l;i=n;while(1){h=c[i>>2]|0;if((h&-2139062144^-2139062144)&h+-16843009|0){y=g;z=j;A=i;break b}c[j>>2]=h;h=g+-4|0;q=i+4|0;o=j+4|0;if(h>>>0>3){g=h;j=o;i=q}else{y=h;z=o;A=q;break}}}else{y=m;z=l;A=n}while(0);B=z;C=y;D=A;v=11}}else{B=b;C=e;D=d;v=11}while(0);c:do if((v|0)==11)if(!C){w=B;x=0}else{d=B;e=C;b=D;while(1){A=a[b>>0]|0;a[d>>0]=A;if(!(A<<24>>24)){w=d;x=e;break c}e=e+-1|0;A=d+1|0;if(!e){w=A;x=0;break}else{d=A;b=b+1|0}}}while(0);Mf(w|0,0,x|0)|0;return w|0}function xf(a){a=a|0;var b=0,d=0,e=0;if((c[a+76>>2]|0)>-1){b=(Ge(a)|0)==0;d=yf(a)|0;if(b)e=d;else e=d}else e=yf(a)|0;return e|0}function yf(a){a=a|0;var b=0,d=0,e=0;if(!(c[a>>2]&128))b=1;else b=(c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0?2:1;d=ta[c[a+40>>2]&7](a,0,b)|0;if((d|0)<0)e=d;else e=d-(c[a+8>>2]|0)+(c[a+4>>2]|0)+(c[a+20>>2]|0)-(c[a+28>>2]|0)|0;return e|0}function zf(a){a=a|0;(c[a+76>>2]|0)>-1?Ge(a)|0:0;return c[a+60>>2]|0}function Af(a){a=a|0;return xf(a)|0}function Bf(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=Ee(c[599]|0,a,e)|0;l=d;return b|0}function Cf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;b=l;l=l+16|0;d=b;do if(a>>>0<245){e=a>>>0<11?16:a+11&-8;f=e>>>3;g=c[1421]|0;h=g>>>f;if(h&3|0){i=(h&1^1)+f|0;j=5724+(i<<1<<2)|0;k=j+8|0;m=c[k>>2]|0;n=m+8|0;o=c[n>>2]|0;do if((j|0)!=(o|0)){if(o>>>0<(c[1425]|0)>>>0)ka();p=o+12|0;if((c[p>>2]|0)==(m|0)){c[p>>2]=j;c[k>>2]=o;break}else ka()}else c[1421]=g&~(1<<i);while(0);o=i<<3;c[m+4>>2]=o|3;k=m+o+4|0;c[k>>2]=c[k>>2]|1;q=n;l=b;return q|0}k=c[1423]|0;if(e>>>0>k>>>0){if(h|0){o=2<<f;j=h<<f&(o|0-o);o=(j&0-j)+-1|0;j=o>>>12&16;p=o>>>j;o=p>>>5&8;r=p>>>o;p=r>>>2&4;s=r>>>p;r=s>>>1&2;t=s>>>r;s=t>>>1&1;u=(o|j|p|r|s)+(t>>>s)|0;s=5724+(u<<1<<2)|0;t=s+8|0;r=c[t>>2]|0;p=r+8|0;j=c[p>>2]|0;do if((s|0)!=(j|0)){if(j>>>0<(c[1425]|0)>>>0)ka();o=j+12|0;if((c[o>>2]|0)==(r|0)){c[o>>2]=s;c[t>>2]=j;v=g;break}else ka()}else{o=g&~(1<<u);c[1421]=o;v=o}while(0);j=(u<<3)-e|0;c[r+4>>2]=e|3;t=r+e|0;c[t+4>>2]=j|1;c[t+j>>2]=j;if(k|0){s=c[1426]|0;f=k>>>3;h=5724+(f<<1<<2)|0;n=1<<f;if(v&n){f=h+8|0;m=c[f>>2]|0;if(m>>>0<(c[1425]|0)>>>0)ka();else{w=f;x=m}}else{c[1421]=v|n;w=h+8|0;x=h}c[w>>2]=s;c[x+12>>2]=s;c[s+8>>2]=x;c[s+12>>2]=h}c[1423]=j;c[1426]=t;q=p;l=b;return q|0}t=c[1422]|0;if(t){j=(t&0-t)+-1|0;h=j>>>12&16;s=j>>>h;j=s>>>5&8;n=s>>>j;s=n>>>2&4;m=n>>>s;n=m>>>1&2;f=m>>>n;m=f>>>1&1;i=c[5988+((j|h|s|n|m)+(f>>>m)<<2)>>2]|0;m=(c[i+4>>2]&-8)-e|0;f=c[i+16+(((c[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){y=m;z=i}else{n=f;f=m;m=i;while(1){i=(c[n+4>>2]&-8)-e|0;s=i>>>0<f>>>0;h=s?i:f;i=s?n:m;n=c[n+16+(((c[n+16>>2]|0)==0&1)<<2)>>2]|0;if(!n){y=h;z=i;break}else{f=h;m=i}}}m=c[1425]|0;if(z>>>0<m>>>0)ka();f=z+e|0;if(z>>>0>=f>>>0)ka();n=c[z+24>>2]|0;p=c[z+12>>2]|0;do if((p|0)==(z|0)){r=z+20|0;u=c[r>>2]|0;if(!u){i=z+16|0;h=c[i>>2]|0;if(!h){A=0;break}else{B=h;C=i}}else{B=u;C=r}while(1){r=B+20|0;u=c[r>>2]|0;if(u|0){B=u;C=r;continue}r=B+16|0;u=c[r>>2]|0;if(!u)break;else{B=u;C=r}}if(C>>>0<m>>>0)ka();else{c[C>>2]=0;A=B;break}}else{r=c[z+8>>2]|0;if(r>>>0<m>>>0)ka();u=r+12|0;if((c[u>>2]|0)!=(z|0))ka();i=p+8|0;if((c[i>>2]|0)==(z|0)){c[u>>2]=p;c[i>>2]=r;A=p;break}else ka()}while(0);a:do if(n|0){p=c[z+28>>2]|0;m=5988+(p<<2)|0;do if((z|0)==(c[m>>2]|0)){c[m>>2]=A;if(!A){c[1422]=t&~(1<<p);break a}}else if(n>>>0>=(c[1425]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(z|0)&1)<<2)>>2]=A;if(!A)break a;else break}else ka();while(0);p=c[1425]|0;if(A>>>0<p>>>0)ka();c[A+24>>2]=n;m=c[z+16>>2]|0;do if(m|0)if(m>>>0<p>>>0)ka();else{c[A+16>>2]=m;c[m+24>>2]=A;break}while(0);m=c[z+20>>2]|0;if(m|0)if(m>>>0<(c[1425]|0)>>>0)ka();else{c[A+20>>2]=m;c[m+24>>2]=A;break}}while(0);if(y>>>0<16){n=y+e|0;c[z+4>>2]=n|3;t=z+n+4|0;c[t>>2]=c[t>>2]|1}else{c[z+4>>2]=e|3;c[f+4>>2]=y|1;c[f+y>>2]=y;if(k|0){t=c[1426]|0;n=k>>>3;m=5724+(n<<1<<2)|0;p=1<<n;if(g&p){n=m+8|0;r=c[n>>2]|0;if(r>>>0<(c[1425]|0)>>>0)ka();else{D=n;E=r}}else{c[1421]=g|p;D=m+8|0;E=m}c[D>>2]=t;c[E+12>>2]=t;c[t+8>>2]=E;c[t+12>>2]=m}c[1423]=y;c[1426]=f}q=z+8|0;l=b;return q|0}else F=e}else F=e}else if(a>>>0<=4294967231){m=a+11|0;t=m&-8;p=c[1422]|0;if(p){r=0-t|0;n=m>>>8;if(n)if(t>>>0>16777215)G=31;else{m=(n+1048320|0)>>>16&8;i=n<<m;n=(i+520192|0)>>>16&4;u=i<<n;i=(u+245760|0)>>>16&2;h=14-(n|m|i)+(u<<i>>>15)|0;G=t>>>(h+7|0)&1|h<<1}else G=0;h=c[5988+(G<<2)>>2]|0;b:do if(!h){H=r;I=0;J=0;K=81}else{i=r;u=0;m=t<<((G|0)==31?0:25-(G>>>1)|0);n=h;s=0;while(1){j=(c[n+4>>2]&-8)-t|0;if(j>>>0<i>>>0)if(!j){L=0;M=n;N=n;K=85;break b}else{O=j;P=n}else{O=i;P=s}j=c[n+20>>2]|0;n=c[n+16+(m>>>31<<2)>>2]|0;o=(j|0)==0|(j|0)==(n|0)?u:j;j=(n|0)==0;if(j){H=O;I=o;J=P;K=81;break}else{i=O;u=o;m=m<<((j^1)&1);s=P}}}while(0);if((K|0)==81){if((I|0)==0&(J|0)==0){h=2<<G;r=p&(h|0-h);if(!r){F=t;break}h=(r&0-r)+-1|0;r=h>>>12&16;e=h>>>r;h=e>>>5&8;f=e>>>h;e=f>>>2&4;g=f>>>e;f=g>>>1&2;k=g>>>f;g=k>>>1&1;Q=c[5988+((h|r|e|f|g)+(k>>>g)<<2)>>2]|0;R=0}else{Q=I;R=J}if(!Q){S=H;T=R}else{L=H;M=Q;N=R;K=85}}if((K|0)==85)while(1){K=0;g=(c[M+4>>2]&-8)-t|0;k=g>>>0<L>>>0;f=k?g:L;g=k?M:N;M=c[M+16+(((c[M+16>>2]|0)==0&1)<<2)>>2]|0;if(!M){S=f;T=g;break}else{L=f;N=g;K=85}}if((T|0)!=0?S>>>0<((c[1423]|0)-t|0)>>>0:0){g=c[1425]|0;if(T>>>0<g>>>0)ka();f=T+t|0;if(T>>>0>=f>>>0)ka();k=c[T+24>>2]|0;e=c[T+12>>2]|0;do if((e|0)==(T|0)){r=T+20|0;h=c[r>>2]|0;if(!h){s=T+16|0;m=c[s>>2]|0;if(!m){U=0;break}else{V=m;W=s}}else{V=h;W=r}while(1){r=V+20|0;h=c[r>>2]|0;if(h|0){V=h;W=r;continue}r=V+16|0;h=c[r>>2]|0;if(!h)break;else{V=h;W=r}}if(W>>>0<g>>>0)ka();else{c[W>>2]=0;U=V;break}}else{r=c[T+8>>2]|0;if(r>>>0<g>>>0)ka();h=r+12|0;if((c[h>>2]|0)!=(T|0))ka();s=e+8|0;if((c[s>>2]|0)==(T|0)){c[h>>2]=e;c[s>>2]=r;U=e;break}else ka()}while(0);c:do if(k){e=c[T+28>>2]|0;g=5988+(e<<2)|0;do if((T|0)==(c[g>>2]|0)){c[g>>2]=U;if(!U){r=p&~(1<<e);c[1422]=r;X=r;break c}}else if(k>>>0>=(c[1425]|0)>>>0){c[k+16+(((c[k+16>>2]|0)!=(T|0)&1)<<2)>>2]=U;if(!U){X=p;break c}else break}else ka();while(0);e=c[1425]|0;if(U>>>0<e>>>0)ka();c[U+24>>2]=k;g=c[T+16>>2]|0;do if(g|0)if(g>>>0<e>>>0)ka();else{c[U+16>>2]=g;c[g+24>>2]=U;break}while(0);g=c[T+20>>2]|0;if(g)if(g>>>0<(c[1425]|0)>>>0)ka();else{c[U+20>>2]=g;c[g+24>>2]=U;X=p;break}else X=p}else X=p;while(0);do if(S>>>0>=16){c[T+4>>2]=t|3;c[f+4>>2]=S|1;c[f+S>>2]=S;p=S>>>3;if(S>>>0<256){k=5724+(p<<1<<2)|0;g=c[1421]|0;e=1<<p;if(g&e){p=k+8|0;r=c[p>>2]|0;if(r>>>0<(c[1425]|0)>>>0)ka();else{Y=p;Z=r}}else{c[1421]=g|e;Y=k+8|0;Z=k}c[Y>>2]=f;c[Z+12>>2]=f;c[f+8>>2]=Z;c[f+12>>2]=k;break}k=S>>>8;if(k)if(S>>>0>16777215)_=31;else{e=(k+1048320|0)>>>16&8;g=k<<e;k=(g+520192|0)>>>16&4;r=g<<k;g=(r+245760|0)>>>16&2;p=14-(k|e|g)+(r<<g>>>15)|0;_=S>>>(p+7|0)&1|p<<1}else _=0;p=5988+(_<<2)|0;c[f+28>>2]=_;g=f+16|0;c[g+4>>2]=0;c[g>>2]=0;g=1<<_;if(!(X&g)){c[1422]=X|g;c[p>>2]=f;c[f+24>>2]=p;c[f+12>>2]=f;c[f+8>>2]=f;break}g=S<<((_|0)==31?0:25-(_>>>1)|0);r=c[p>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(S|0)){K=139;break}$=r+16+(g>>>31<<2)|0;p=c[$>>2]|0;if(!p){K=136;break}else{g=g<<1;r=p}}if((K|0)==136)if($>>>0<(c[1425]|0)>>>0)ka();else{c[$>>2]=f;c[f+24>>2]=r;c[f+12>>2]=f;c[f+8>>2]=f;break}else if((K|0)==139){g=r+8|0;p=c[g>>2]|0;e=c[1425]|0;if(p>>>0>=e>>>0&r>>>0>=e>>>0){c[p+12>>2]=f;c[g>>2]=f;c[f+8>>2]=p;c[f+12>>2]=r;c[f+24>>2]=0;break}else ka()}}else{p=S+t|0;c[T+4>>2]=p|3;g=T+p+4|0;c[g>>2]=c[g>>2]|1}while(0);q=T+8|0;l=b;return q|0}else F=t}else F=t}else F=-1;while(0);T=c[1423]|0;if(T>>>0>=F>>>0){S=T-F|0;$=c[1426]|0;if(S>>>0>15){_=$+F|0;c[1426]=_;c[1423]=S;c[_+4>>2]=S|1;c[_+S>>2]=S;c[$+4>>2]=F|3}else{c[1423]=0;c[1426]=0;c[$+4>>2]=T|3;S=$+T+4|0;c[S>>2]=c[S>>2]|1}q=$+8|0;l=b;return q|0}$=c[1424]|0;if($>>>0>F>>>0){S=$-F|0;c[1424]=S;T=c[1427]|0;_=T+F|0;c[1427]=_;c[_+4>>2]=S|1;c[T+4>>2]=F|3;q=T+8|0;l=b;return q|0}if(!(c[1539]|0)){c[1541]=4096;c[1540]=4096;c[1542]=-1;c[1543]=-1;c[1544]=0;c[1532]=0;T=d&-16^1431655768;c[d>>2]=T;c[1539]=T;aa=4096}else aa=c[1541]|0;T=F+48|0;d=F+47|0;S=aa+d|0;_=0-aa|0;aa=S&_;if(aa>>>0<=F>>>0){q=0;l=b;return q|0}X=c[1531]|0;if(X|0?(Z=c[1529]|0,Y=Z+aa|0,Y>>>0<=Z>>>0|Y>>>0>X>>>0):0){q=0;l=b;return q|0}d:do if(!(c[1532]&4)){X=c[1427]|0;e:do if(X){Y=6132;while(1){Z=c[Y>>2]|0;if(Z>>>0<=X>>>0?(ba=Y+4|0,(Z+(c[ba>>2]|0)|0)>>>0>X>>>0):0)break;Z=c[Y+8>>2]|0;if(!Z){K=163;break e}else Y=Z}r=S-$&_;if(r>>>0<2147483647){Z=Vf(r|0)|0;if((Z|0)==((c[Y>>2]|0)+(c[ba>>2]|0)|0))if((Z|0)==(-1|0))ca=r;else{da=Z;ea=r;K=180;break d}else{fa=Z;ga=r;K=171}}else ca=0}else K=163;while(0);do if((K|0)==163){X=Vf(0)|0;if((X|0)!=(-1|0)?(t=X,r=c[1540]|0,Z=r+-1|0,U=((Z&t|0)==0?0:(Z+t&0-r)-t|0)+aa|0,t=c[1529]|0,r=U+t|0,U>>>0>F>>>0&U>>>0<2147483647):0){Z=c[1531]|0;if(Z|0?r>>>0<=t>>>0|r>>>0>Z>>>0:0){ca=0;break}Z=Vf(U|0)|0;if((Z|0)==(X|0)){da=X;ea=U;K=180;break d}else{fa=Z;ga=U;K=171}}else ca=0}while(0);do if((K|0)==171){U=0-ga|0;if(!(T>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=fa;ea=ga;K=180;break d}Z=c[1541]|0;X=d-ga+Z&0-Z;if(X>>>0>=2147483647){da=fa;ea=ga;K=180;break d}if((Vf(X|0)|0)==(-1|0)){Vf(U|0)|0;ca=0;break}else{da=fa;ea=X+ga|0;K=180;break d}}while(0);c[1532]=c[1532]|4;ha=ca;K=178}else{ha=0;K=178}while(0);if(((K|0)==178?aa>>>0<2147483647:0)?(ca=Vf(aa|0)|0,aa=Vf(0)|0,ga=aa-ca|0,fa=ga>>>0>(F+40|0)>>>0,!((ca|0)==(-1|0)|fa^1|ca>>>0<aa>>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ca;ea=fa?ga:ha;K=180}if((K|0)==180){ha=(c[1529]|0)+ea|0;c[1529]=ha;if(ha>>>0>(c[1530]|0)>>>0)c[1530]=ha;ha=c[1427]|0;do if(ha){ga=6132;while(1){ia=c[ga>>2]|0;ja=ga+4|0;la=c[ja>>2]|0;if((da|0)==(ia+la|0)){K=190;break}fa=c[ga+8>>2]|0;if(!fa)break;else ga=fa}if(((K|0)==190?(c[ga+12>>2]&8|0)==0:0)?ha>>>0<da>>>0&ha>>>0>=ia>>>0:0){c[ja>>2]=la+ea;fa=ha+8|0;ca=(fa&7|0)==0?0:0-fa&7;fa=ha+ca|0;aa=(c[1424]|0)+(ea-ca)|0;c[1427]=fa;c[1424]=aa;c[fa+4>>2]=aa|1;c[fa+aa+4>>2]=40;c[1428]=c[1543];break}aa=c[1425]|0;if(da>>>0<aa>>>0){c[1425]=da;ma=da}else ma=aa;aa=da+ea|0;fa=6132;while(1){if((c[fa>>2]|0)==(aa|0)){K=198;break}ca=c[fa+8>>2]|0;if(!ca)break;else fa=ca}if((K|0)==198?(c[fa+12>>2]&8|0)==0:0){c[fa>>2]=da;ga=fa+4|0;c[ga>>2]=(c[ga>>2]|0)+ea;ga=da+8|0;ca=da+((ga&7|0)==0?0:0-ga&7)|0;ga=aa+8|0;d=aa+((ga&7|0)==0?0:0-ga&7)|0;ga=ca+F|0;T=d-ca-F|0;c[ca+4>>2]=F|3;do if((d|0)!=(ha|0)){if((d|0)==(c[1426]|0)){ba=(c[1423]|0)+T|0;c[1423]=ba;c[1426]=ga;c[ga+4>>2]=ba|1;c[ga+ba>>2]=ba;break}ba=c[d+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;f:do if(ba>>>0>=256){S=c[d+24>>2]|0;X=c[d+12>>2]|0;do if((X|0)==(d|0)){U=d+16|0;Z=U+4|0;r=c[Z>>2]|0;if(!r){t=c[U>>2]|0;if(!t){na=0;break}else{oa=t;pa=U}}else{oa=r;pa=Z}while(1){Z=oa+20|0;r=c[Z>>2]|0;if(r|0){oa=r;pa=Z;continue}Z=oa+16|0;r=c[Z>>2]|0;if(!r)break;else{oa=r;pa=Z}}if(pa>>>0<ma>>>0)ka();else{c[pa>>2]=0;na=oa;break}}else{Z=c[d+8>>2]|0;if(Z>>>0<ma>>>0)ka();r=Z+12|0;if((c[r>>2]|0)!=(d|0))ka();U=X+8|0;if((c[U>>2]|0)==(d|0)){c[r>>2]=X;c[U>>2]=Z;na=X;break}else ka()}while(0);if(!S)break;X=c[d+28>>2]|0;Z=5988+(X<<2)|0;do if((d|0)!=(c[Z>>2]|0))if(S>>>0>=(c[1425]|0)>>>0){c[S+16+(((c[S+16>>2]|0)!=(d|0)&1)<<2)>>2]=na;if(!na)break f;else break}else ka();else{c[Z>>2]=na;if(na|0)break;c[1422]=c[1422]&~(1<<X);break f}while(0);X=c[1425]|0;if(na>>>0<X>>>0)ka();c[na+24>>2]=S;Z=d+16|0;U=c[Z>>2]|0;do if(U|0)if(U>>>0<X>>>0)ka();else{c[na+16>>2]=U;c[U+24>>2]=na;break}while(0);U=c[Z+4>>2]|0;if(!U)break;if(U>>>0<(c[1425]|0)>>>0)ka();else{c[na+20>>2]=U;c[U+24>>2]=na;break}}else{U=c[d+8>>2]|0;X=c[d+12>>2]|0;S=5724+($<<1<<2)|0;do if((U|0)!=(S|0)){if(U>>>0<ma>>>0)ka();if((c[U+12>>2]|0)==(d|0))break;ka()}while(0);if((X|0)==(U|0)){c[1421]=c[1421]&~(1<<$);break}do if((X|0)==(S|0))qa=X+8|0;else{if(X>>>0<ma>>>0)ka();Z=X+8|0;if((c[Z>>2]|0)==(d|0)){qa=Z;break}ka()}while(0);c[U+12>>2]=X;c[qa>>2]=U}while(0);ra=d+_|0;sa=_+T|0}else{ra=d;sa=T}$=ra+4|0;c[$>>2]=c[$>>2]&-2;c[ga+4>>2]=sa|1;c[ga+sa>>2]=sa;$=sa>>>3;if(sa>>>0<256){ba=5724+($<<1<<2)|0;Y=c[1421]|0;S=1<<$;do if(!(Y&S)){c[1421]=Y|S;ta=ba+8|0;ua=ba}else{$=ba+8|0;Z=c[$>>2]|0;if(Z>>>0>=(c[1425]|0)>>>0){ta=$;ua=Z;break}ka()}while(0);c[ta>>2]=ga;c[ua+12>>2]=ga;c[ga+8>>2]=ua;c[ga+12>>2]=ba;break}S=sa>>>8;do if(!S)va=0;else{if(sa>>>0>16777215){va=31;break}Y=(S+1048320|0)>>>16&8;_=S<<Y;Z=(_+520192|0)>>>16&4;$=_<<Z;_=($+245760|0)>>>16&2;r=14-(Z|Y|_)+($<<_>>>15)|0;va=sa>>>(r+7|0)&1|r<<1}while(0);S=5988+(va<<2)|0;c[ga+28>>2]=va;ba=ga+16|0;c[ba+4>>2]=0;c[ba>>2]=0;ba=c[1422]|0;r=1<<va;if(!(ba&r)){c[1422]=ba|r;c[S>>2]=ga;c[ga+24>>2]=S;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}r=sa<<((va|0)==31?0:25-(va>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(sa|0)){K=265;break}wa=ba+16+(r>>>31<<2)|0;S=c[wa>>2]|0;if(!S){K=262;break}else{r=r<<1;ba=S}}if((K|0)==262)if(wa>>>0<(c[1425]|0)>>>0)ka();else{c[wa>>2]=ga;c[ga+24>>2]=ba;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}else if((K|0)==265){r=ba+8|0;S=c[r>>2]|0;_=c[1425]|0;if(S>>>0>=_>>>0&ba>>>0>=_>>>0){c[S+12>>2]=ga;c[r>>2]=ga;c[ga+8>>2]=S;c[ga+12>>2]=ba;c[ga+24>>2]=0;break}else ka()}}else{S=(c[1424]|0)+T|0;c[1424]=S;c[1427]=ga;c[ga+4>>2]=S|1}while(0);q=ca+8|0;l=b;return q|0}ga=6132;while(1){T=c[ga>>2]|0;if(T>>>0<=ha>>>0?(xa=T+(c[ga+4>>2]|0)|0,xa>>>0>ha>>>0):0)break;ga=c[ga+8>>2]|0}ga=xa+-47|0;ca=ga+8|0;T=ga+((ca&7|0)==0?0:0-ca&7)|0;ca=ha+16|0;ga=T>>>0<ca>>>0?ha:T;T=ga+8|0;d=da+8|0;aa=(d&7|0)==0?0:0-d&7;d=da+aa|0;fa=ea+-40-aa|0;c[1427]=d;c[1424]=fa;c[d+4>>2]=fa|1;c[d+fa+4>>2]=40;c[1428]=c[1543];fa=ga+4|0;c[fa>>2]=27;c[T>>2]=c[1533];c[T+4>>2]=c[1534];c[T+8>>2]=c[1535];c[T+12>>2]=c[1536];c[1533]=da;c[1534]=ea;c[1536]=0;c[1535]=T;T=ga+24|0;do{d=T;T=T+4|0;c[T>>2]=7}while((d+8|0)>>>0<xa>>>0);if((ga|0)!=(ha|0)){T=ga-ha|0;c[fa>>2]=c[fa>>2]&-2;c[ha+4>>2]=T|1;c[ga>>2]=T;d=T>>>3;if(T>>>0<256){aa=5724+(d<<1<<2)|0;S=c[1421]|0;r=1<<d;if(S&r){d=aa+8|0;_=c[d>>2]|0;if(_>>>0<(c[1425]|0)>>>0)ka();else{ya=d;za=_}}else{c[1421]=S|r;ya=aa+8|0;za=aa}c[ya>>2]=ha;c[za+12>>2]=ha;c[ha+8>>2]=za;c[ha+12>>2]=aa;break}aa=T>>>8;if(aa)if(T>>>0>16777215)Aa=31;else{r=(aa+1048320|0)>>>16&8;S=aa<<r;aa=(S+520192|0)>>>16&4;_=S<<aa;S=(_+245760|0)>>>16&2;d=14-(aa|r|S)+(_<<S>>>15)|0;Aa=T>>>(d+7|0)&1|d<<1}else Aa=0;d=5988+(Aa<<2)|0;c[ha+28>>2]=Aa;c[ha+20>>2]=0;c[ca>>2]=0;S=c[1422]|0;_=1<<Aa;if(!(S&_)){c[1422]=S|_;c[d>>2]=ha;c[ha+24>>2]=d;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}_=T<<((Aa|0)==31?0:25-(Aa>>>1)|0);S=c[d>>2]|0;while(1){if((c[S+4>>2]&-8|0)==(T|0)){K=292;break}Ba=S+16+(_>>>31<<2)|0;d=c[Ba>>2]|0;if(!d){K=289;break}else{_=_<<1;S=d}}if((K|0)==289)if(Ba>>>0<(c[1425]|0)>>>0)ka();else{c[Ba>>2]=ha;c[ha+24>>2]=S;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}else if((K|0)==292){_=S+8|0;T=c[_>>2]|0;ca=c[1425]|0;if(T>>>0>=ca>>>0&S>>>0>=ca>>>0){c[T+12>>2]=ha;c[_>>2]=ha;c[ha+8>>2]=T;c[ha+12>>2]=S;c[ha+24>>2]=0;break}else ka()}}}else{T=c[1425]|0;if((T|0)==0|da>>>0<T>>>0)c[1425]=da;c[1533]=da;c[1534]=ea;c[1536]=0;c[1430]=c[1539];c[1429]=-1;T=0;do{_=5724+(T<<1<<2)|0;c[_+12>>2]=_;c[_+8>>2]=_;T=T+1|0}while((T|0)!=32);T=da+8|0;S=(T&7|0)==0?0:0-T&7;T=da+S|0;_=ea+-40-S|0;c[1427]=T;c[1424]=_;c[T+4>>2]=_|1;c[T+_+4>>2]=40;c[1428]=c[1543]}while(0);ea=c[1424]|0;if(ea>>>0>F>>>0){da=ea-F|0;c[1424]=da;ea=c[1427]|0;ha=ea+F|0;c[1427]=ha;c[ha+4>>2]=da|1;c[ea+4>>2]=F|3;q=ea+8|0;l=b;return q|0}}c[(ve()|0)>>2]=12;q=0;l=b;return q|0}function Df(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;if(!a)return;b=a+-8|0;d=c[1425]|0;if(b>>>0<d>>>0)ka();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)ka();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(!a)return;i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)ka();if((i|0)==(c[1426]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;break}c[1423]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;return}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;p=5724+(l<<1<<2)|0;if((h|0)!=(p|0)){if(h>>>0<d>>>0)ka();if((c[h+12>>2]|0)!=(i|0))ka()}if((k|0)==(h|0)){c[1421]=c[1421]&~(1<<l);m=i;n=i;o=j;break}if((k|0)!=(p|0)){if(k>>>0<d>>>0)ka();p=k+8|0;if((c[p>>2]|0)==(i|0))q=p;else ka()}else q=k+8|0;c[h+12>>2]=k;c[q>>2]=h;m=i;n=i;o=j;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){p=i+16|0;l=p+4|0;r=c[l>>2]|0;if(!r){s=c[p>>2]|0;if(!s){t=0;break}else{u=s;v=p}}else{u=r;v=l}while(1){l=u+20|0;r=c[l>>2]|0;if(r|0){u=r;v=l;continue}l=u+16|0;r=c[l>>2]|0;if(!r)break;else{u=r;v=l}}if(v>>>0<d>>>0)ka();else{c[v>>2]=0;t=u;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)ka();r=l+12|0;if((c[r>>2]|0)!=(i|0))ka();p=k+8|0;if((c[p>>2]|0)==(i|0)){c[r>>2]=k;c[p>>2]=l;t=k;break}else ka()}while(0);if(h){k=c[i+28>>2]|0;l=5988+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=t;if(!t){c[1422]=c[1422]&~(1<<k);m=i;n=i;o=j;break a}}else if(h>>>0>=(c[1425]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=t;if(!t){m=i;n=i;o=j;break a}else break}else ka();while(0);k=c[1425]|0;if(t>>>0<k>>>0)ka();c[t+24>>2]=h;l=i+16|0;p=c[l>>2]|0;do if(p|0)if(p>>>0<k>>>0)ka();else{c[t+16>>2]=p;c[p+24>>2]=t;break}while(0);p=c[l+4>>2]|0;if(p)if(p>>>0<(c[1425]|0)>>>0)ka();else{c[t+20>>2]=p;c[p+24>>2]=t;m=i;n=i;o=j;break}else{m=i;n=i;o=j}}else{m=i;n=i;o=j}}else{m=b;n=b;o=f}while(0);if(m>>>0>=g>>>0)ka();f=g+4|0;b=c[f>>2]|0;if(!(b&1))ka();if(!(b&2)){t=c[1426]|0;if((g|0)==(c[1427]|0)){d=(c[1424]|0)+o|0;c[1424]=d;c[1427]=n;c[n+4>>2]=d|1;if((n|0)!=(t|0))return;c[1426]=0;c[1423]=0;return}if((g|0)==(t|0)){t=(c[1423]|0)+o|0;c[1423]=t;c[1426]=m;c[n+4>>2]=t|1;c[m+t>>2]=t;return}t=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){u=c[g+24>>2]|0;v=c[g+12>>2]|0;do if((v|0)==(g|0)){q=g+16|0;a=q+4|0;e=c[a>>2]|0;if(!e){p=c[q>>2]|0;if(!p){w=0;break}else{x=p;y=q}}else{x=e;y=a}while(1){a=x+20|0;e=c[a>>2]|0;if(e|0){x=e;y=a;continue}a=x+16|0;e=c[a>>2]|0;if(!e)break;else{x=e;y=a}}if(y>>>0<(c[1425]|0)>>>0)ka();else{c[y>>2]=0;w=x;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[1425]|0)>>>0)ka();e=a+12|0;if((c[e>>2]|0)!=(g|0))ka();q=v+8|0;if((c[q>>2]|0)==(g|0)){c[e>>2]=v;c[q>>2]=a;w=v;break}else ka()}while(0);if(u|0){v=c[g+28>>2]|0;j=5988+(v<<2)|0;do if((g|0)==(c[j>>2]|0)){c[j>>2]=w;if(!w){c[1422]=c[1422]&~(1<<v);break b}}else if(u>>>0>=(c[1425]|0)>>>0){c[u+16+(((c[u+16>>2]|0)!=(g|0)&1)<<2)>>2]=w;if(!w)break b;else break}else ka();while(0);v=c[1425]|0;if(w>>>0<v>>>0)ka();c[w+24>>2]=u;j=g+16|0;i=c[j>>2]|0;do if(i|0)if(i>>>0<v>>>0)ka();else{c[w+16>>2]=i;c[i+24>>2]=w;break}while(0);i=c[j+4>>2]|0;if(i|0)if(i>>>0<(c[1425]|0)>>>0)ka();else{c[w+20>>2]=i;c[i+24>>2]=w;break}}}else{i=c[g+8>>2]|0;v=c[g+12>>2]|0;u=5724+(d<<1<<2)|0;if((i|0)!=(u|0)){if(i>>>0<(c[1425]|0)>>>0)ka();if((c[i+12>>2]|0)!=(g|0))ka()}if((v|0)==(i|0)){c[1421]=c[1421]&~(1<<d);break}if((v|0)!=(u|0)){if(v>>>0<(c[1425]|0)>>>0)ka();u=v+8|0;if((c[u>>2]|0)==(g|0))z=u;else ka()}else z=v+8|0;c[i+12>>2]=v;c[z>>2]=i}while(0);c[n+4>>2]=t|1;c[m+t>>2]=t;if((n|0)==(c[1426]|0)){c[1423]=t;return}else A=t}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;A=o}o=A>>>3;if(A>>>0<256){m=5724+(o<<1<<2)|0;b=c[1421]|0;f=1<<o;if(b&f){o=m+8|0;t=c[o>>2]|0;if(t>>>0<(c[1425]|0)>>>0)ka();else{B=o;C=t}}else{c[1421]=b|f;B=m+8|0;C=m}c[B>>2]=n;c[C+12>>2]=n;c[n+8>>2]=C;c[n+12>>2]=m;return}m=A>>>8;if(m)if(A>>>0>16777215)D=31;else{C=(m+1048320|0)>>>16&8;B=m<<C;m=(B+520192|0)>>>16&4;f=B<<m;B=(f+245760|0)>>>16&2;b=14-(m|C|B)+(f<<B>>>15)|0;D=A>>>(b+7|0)&1|b<<1}else D=0;b=5988+(D<<2)|0;c[n+28>>2]=D;c[n+20>>2]=0;c[n+16>>2]=0;B=c[1422]|0;f=1<<D;do if(B&f){C=A<<((D|0)==31?0:25-(D>>>1)|0);m=c[b>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(A|0)){E=124;break}F=m+16+(C>>>31<<2)|0;t=c[F>>2]|0;if(!t){E=121;break}else{C=C<<1;m=t}}if((E|0)==121)if(F>>>0<(c[1425]|0)>>>0)ka();else{c[F>>2]=n;c[n+24>>2]=m;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((E|0)==124){C=m+8|0;j=c[C>>2]|0;t=c[1425]|0;if(j>>>0>=t>>>0&m>>>0>=t>>>0){c[j+12>>2]=n;c[C>>2]=n;c[n+8>>2]=j;c[n+12>>2]=m;c[n+24>>2]=0;break}else ka()}}else{c[1422]=B|f;c[b>>2]=n;c[n+24>>2]=b;c[n+12>>2]=n;c[n+8>>2]=n}while(0);n=(c[1429]|0)+-1|0;c[1429]=n;if(!n)G=6140;else return;while(1){n=c[G>>2]|0;if(!n)break;else G=n+8|0}c[1429]=-1;return}function Ef(a,b){a=a|0;b=b|0;var d=0,e=0;if(a){d=S(b,a)|0;if((b|a)>>>0>65535)e=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1;else e=d}else e=0;d=Cf(e)|0;if(!d)return d|0;if(!(c[d+-4>>2]&3))return d|0;Mf(d|0,0,e|0)|0;return d|0}function Ff(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a){d=Cf(b)|0;return d|0}if(b>>>0>4294967231){c[(ve()|0)>>2]=12;d=0;return d|0}e=Gf(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(e|0){d=e+8|0;return d|0}e=Cf(b)|0;if(!e){d=0;return d|0}f=c[a+-4>>2]|0;g=(f&-8)-((f&3|0)==0?8:4)|0;Wf(e|0,a|0,(g>>>0<b>>>0?g:b)|0)|0;Df(a);d=e;return d|0}function Gf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a+f|0;h=c[1425]|0;i=e&3;if(!((i|0)!=1&a>>>0>=h>>>0&a>>>0<g>>>0))ka();j=c[g+4>>2]|0;if(!(j&1))ka();if(!i){if(b>>>0<256){k=0;return k|0}if(f>>>0>=(b+4|0)>>>0?(f-b|0)>>>0<=c[1541]<<1>>>0:0){k=a;return k|0}k=0;return k|0}if(f>>>0>=b>>>0){i=f-b|0;if(i>>>0<=15){k=a;return k|0}l=a+b|0;c[d>>2]=e&1|b|2;c[l+4>>2]=i|3;m=l+i+4|0;c[m>>2]=c[m>>2]|1;Hf(l,i);k=a;return k|0}if((g|0)==(c[1427]|0)){i=(c[1424]|0)+f|0;l=i-b|0;m=a+b|0;if(i>>>0<=b>>>0){k=0;return k|0}c[d>>2]=e&1|b|2;c[m+4>>2]=l|1;c[1427]=m;c[1424]=l;k=a;return k|0}if((g|0)==(c[1426]|0)){l=(c[1423]|0)+f|0;if(l>>>0<b>>>0){k=0;return k|0}m=l-b|0;i=e&1;if(m>>>0>15){n=a+b|0;o=n+m|0;c[d>>2]=i|b|2;c[n+4>>2]=m|1;c[o>>2]=m;p=o+4|0;c[p>>2]=c[p>>2]&-2;q=n;r=m}else{c[d>>2]=i|l|2;i=a+l+4|0;c[i>>2]=c[i>>2]|1;q=0;r=0}c[1423]=r;c[1426]=q;k=a;return k|0}if(j&2|0){k=0;return k|0}q=(j&-8)+f|0;if(q>>>0<b>>>0){k=0;return k|0}f=q-b|0;r=j>>>3;a:do if(j>>>0>=256){i=c[g+24>>2]|0;l=c[g+12>>2]|0;do if((l|0)==(g|0)){m=g+16|0;n=m+4|0;p=c[n>>2]|0;if(!p){o=c[m>>2]|0;if(!o){s=0;break}else{t=o;u=m}}else{t=p;u=n}while(1){n=t+20|0;p=c[n>>2]|0;if(p|0){t=p;u=n;continue}n=t+16|0;p=c[n>>2]|0;if(!p)break;else{t=p;u=n}}if(u>>>0<h>>>0)ka();else{c[u>>2]=0;s=t;break}}else{n=c[g+8>>2]|0;if(n>>>0<h>>>0)ka();p=n+12|0;if((c[p>>2]|0)!=(g|0))ka();m=l+8|0;if((c[m>>2]|0)==(g|0)){c[p>>2]=l;c[m>>2]=n;s=l;break}else ka()}while(0);if(i|0){l=c[g+28>>2]|0;n=5988+(l<<2)|0;do if((g|0)==(c[n>>2]|0)){c[n>>2]=s;if(!s){c[1422]=c[1422]&~(1<<l);break a}}else if(i>>>0>=(c[1425]|0)>>>0){c[i+16+(((c[i+16>>2]|0)!=(g|0)&1)<<2)>>2]=s;if(!s)break a;else break}else ka();while(0);l=c[1425]|0;if(s>>>0<l>>>0)ka();c[s+24>>2]=i;n=g+16|0;m=c[n>>2]|0;do if(m|0)if(m>>>0<l>>>0)ka();else{c[s+16>>2]=m;c[m+24>>2]=s;break}while(0);m=c[n+4>>2]|0;if(m|0)if(m>>>0<(c[1425]|0)>>>0)ka();else{c[s+20>>2]=m;c[m+24>>2]=s;break}}}else{m=c[g+8>>2]|0;l=c[g+12>>2]|0;i=5724+(r<<1<<2)|0;if((m|0)!=(i|0)){if(m>>>0<h>>>0)ka();if((c[m+12>>2]|0)!=(g|0))ka()}if((l|0)==(m|0)){c[1421]=c[1421]&~(1<<r);break}if((l|0)!=(i|0)){if(l>>>0<h>>>0)ka();i=l+8|0;if((c[i>>2]|0)==(g|0))v=i;else ka()}else v=l+8|0;c[m+12>>2]=l;c[v>>2]=m}while(0);v=e&1;if(f>>>0<16){c[d>>2]=q|v|2;e=a+q+4|0;c[e>>2]=c[e>>2]|1;k=a;return k|0}else{e=a+b|0;c[d>>2]=v|b|2;c[e+4>>2]=f|3;b=e+f+4|0;c[b>>2]=c[b>>2]|1;Hf(e,f);k=a;return k|0}return 0}function Hf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=a+b|0;e=c[a+4>>2]|0;a:do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;i=c[1425]|0;if(g>>>0<i>>>0)ka();if((g|0)==(c[1426]|0)){j=d+4|0;k=c[j>>2]|0;if((k&3|0)!=3){l=g;m=h;break}c[1423]=h;c[j>>2]=k&-2;c[g+4>>2]=h|1;c[g+h>>2]=h;return}k=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;j=c[g+12>>2]|0;n=5724+(k<<1<<2)|0;if((f|0)!=(n|0)){if(f>>>0<i>>>0)ka();if((c[f+12>>2]|0)!=(g|0))ka()}if((j|0)==(f|0)){c[1421]=c[1421]&~(1<<k);l=g;m=h;break}if((j|0)!=(n|0)){if(j>>>0<i>>>0)ka();n=j+8|0;if((c[n>>2]|0)==(g|0))o=n;else ka()}else o=j+8|0;c[f+12>>2]=j;c[o>>2]=f;l=g;m=h;break}f=c[g+24>>2]|0;j=c[g+12>>2]|0;do if((j|0)==(g|0)){n=g+16|0;k=n+4|0;p=c[k>>2]|0;if(!p){q=c[n>>2]|0;if(!q){r=0;break}else{s=q;t=n}}else{s=p;t=k}while(1){k=s+20|0;p=c[k>>2]|0;if(p|0){s=p;t=k;continue}k=s+16|0;p=c[k>>2]|0;if(!p)break;else{s=p;t=k}}if(t>>>0<i>>>0)ka();else{c[t>>2]=0;r=s;break}}else{k=c[g+8>>2]|0;if(k>>>0<i>>>0)ka();p=k+12|0;if((c[p>>2]|0)!=(g|0))ka();n=j+8|0;if((c[n>>2]|0)==(g|0)){c[p>>2]=j;c[n>>2]=k;r=j;break}else ka()}while(0);if(f){j=c[g+28>>2]|0;i=5988+(j<<2)|0;do if((g|0)==(c[i>>2]|0)){c[i>>2]=r;if(!r){c[1422]=c[1422]&~(1<<j);l=g;m=h;break a}}else if(f>>>0>=(c[1425]|0)>>>0){c[f+16+(((c[f+16>>2]|0)!=(g|0)&1)<<2)>>2]=r;if(!r){l=g;m=h;break a}else break}else ka();while(0);j=c[1425]|0;if(r>>>0<j>>>0)ka();c[r+24>>2]=f;i=g+16|0;k=c[i>>2]|0;do if(k|0)if(k>>>0<j>>>0)ka();else{c[r+16>>2]=k;c[k+24>>2]=r;break}while(0);k=c[i+4>>2]|0;if(k)if(k>>>0<(c[1425]|0)>>>0)ka();else{c[r+20>>2]=k;c[k+24>>2]=r;l=g;m=h;break}else{l=g;m=h}}else{l=g;m=h}}else{l=a;m=b}while(0);b=c[1425]|0;if(d>>>0<b>>>0)ka();a=d+4|0;r=c[a>>2]|0;if(!(r&2)){s=c[1426]|0;if((d|0)==(c[1427]|0)){t=(c[1424]|0)+m|0;c[1424]=t;c[1427]=l;c[l+4>>2]=t|1;if((l|0)!=(s|0))return;c[1426]=0;c[1423]=0;return}if((d|0)==(s|0)){s=(c[1423]|0)+m|0;c[1423]=s;c[1426]=l;c[l+4>>2]=s|1;c[l+s>>2]=s;return}s=(r&-8)+m|0;t=r>>>3;b:do if(r>>>0>=256){o=c[d+24>>2]|0;e=c[d+12>>2]|0;do if((e|0)==(d|0)){k=d+16|0;j=k+4|0;f=c[j>>2]|0;if(!f){n=c[k>>2]|0;if(!n){u=0;break}else{v=n;w=k}}else{v=f;w=j}while(1){j=v+20|0;f=c[j>>2]|0;if(f|0){v=f;w=j;continue}j=v+16|0;f=c[j>>2]|0;if(!f)break;else{v=f;w=j}}if(w>>>0<b>>>0)ka();else{c[w>>2]=0;u=v;break}}else{j=c[d+8>>2]|0;if(j>>>0<b>>>0)ka();f=j+12|0;if((c[f>>2]|0)!=(d|0))ka();k=e+8|0;if((c[k>>2]|0)==(d|0)){c[f>>2]=e;c[k>>2]=j;u=e;break}else ka()}while(0);if(o|0){e=c[d+28>>2]|0;h=5988+(e<<2)|0;do if((d|0)==(c[h>>2]|0)){c[h>>2]=u;if(!u){c[1422]=c[1422]&~(1<<e);break b}}else if(o>>>0>=(c[1425]|0)>>>0){c[o+16+(((c[o+16>>2]|0)!=(d|0)&1)<<2)>>2]=u;if(!u)break b;else break}else ka();while(0);e=c[1425]|0;if(u>>>0<e>>>0)ka();c[u+24>>2]=o;h=d+16|0;g=c[h>>2]|0;do if(g|0)if(g>>>0<e>>>0)ka();else{c[u+16>>2]=g;c[g+24>>2]=u;break}while(0);g=c[h+4>>2]|0;if(g|0)if(g>>>0<(c[1425]|0)>>>0)ka();else{c[u+20>>2]=g;c[g+24>>2]=u;break}}}else{g=c[d+8>>2]|0;e=c[d+12>>2]|0;o=5724+(t<<1<<2)|0;if((g|0)!=(o|0)){if(g>>>0<b>>>0)ka();if((c[g+12>>2]|0)!=(d|0))ka()}if((e|0)==(g|0)){c[1421]=c[1421]&~(1<<t);break}if((e|0)!=(o|0)){if(e>>>0<b>>>0)ka();o=e+8|0;if((c[o>>2]|0)==(d|0))x=o;else ka()}else x=e+8|0;c[g+12>>2]=e;c[x>>2]=g}while(0);c[l+4>>2]=s|1;c[l+s>>2]=s;if((l|0)==(c[1426]|0)){c[1423]=s;return}else y=s}else{c[a>>2]=r&-2;c[l+4>>2]=m|1;c[l+m>>2]=m;y=m}m=y>>>3;if(y>>>0<256){r=5724+(m<<1<<2)|0;a=c[1421]|0;s=1<<m;if(a&s){m=r+8|0;x=c[m>>2]|0;if(x>>>0<(c[1425]|0)>>>0)ka();else{z=m;A=x}}else{c[1421]=a|s;z=r+8|0;A=r}c[z>>2]=l;c[A+12>>2]=l;c[l+8>>2]=A;c[l+12>>2]=r;return}r=y>>>8;if(r)if(y>>>0>16777215)B=31;else{A=(r+1048320|0)>>>16&8;z=r<<A;r=(z+520192|0)>>>16&4;s=z<<r;z=(s+245760|0)>>>16&2;a=14-(r|A|z)+(s<<z>>>15)|0;B=y>>>(a+7|0)&1|a<<1}else B=0;a=5988+(B<<2)|0;c[l+28>>2]=B;c[l+20>>2]=0;c[l+16>>2]=0;z=c[1422]|0;s=1<<B;if(!(z&s)){c[1422]=z|s;c[a>>2]=l;c[l+24>>2]=a;c[l+12>>2]=l;c[l+8>>2]=l;return}s=y<<((B|0)==31?0:25-(B>>>1)|0);B=c[a>>2]|0;while(1){if((c[B+4>>2]&-8|0)==(y|0)){C=121;break}D=B+16+(s>>>31<<2)|0;a=c[D>>2]|0;if(!a){C=118;break}else{s=s<<1;B=a}}if((C|0)==118){if(D>>>0<(c[1425]|0)>>>0)ka();c[D>>2]=l;c[l+24>>2]=B;c[l+12>>2]=l;c[l+8>>2]=l;return}else if((C|0)==121){C=B+8|0;D=c[C>>2]|0;s=c[1425]|0;if(!(D>>>0>=s>>>0&B>>>0>=s>>>0))ka();c[D+12>>2]=l;c[C>>2]=l;c[l+8>>2]=D;c[l+12>>2]=B;c[l+24>>2]=0;return}}function If(){}function Jf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=(b|0)<0?-1:0;return b>>c-32|0}function Kf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (D=e,a-c>>>0|0)|0}function Lf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (D=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function Mf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Nf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function Of(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function Pf(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function Qf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;g=a;h=b;i=h;j=d;k=e;l=k;if(!i){m=(f|0)!=0;if(!l){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (D=n,o)|0}else{if(!m){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return (D=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(V(l|0)|0)-(V(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}r=j-1|0;if(r&j|0){s=(V(j|0)|0)+33-(V(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(f|0){c[f>>2]=r&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (D=n,o)|0}else{r=Pf(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (D=n,o)|0}}else{if(m){if(f|0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (D=n,o)|0}if(!g){if(f|0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (D=n,o)|0}r=l-1|0;if(!(r&l)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=r&i|b&0}n=0;o=i>>>((Pf(l|0)|0)>>>0);return (D=n,o)|0}r=(V(l|0)|0)-(V(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}while(0);if(!t){B=x;C=w;E=v;F=u;G=0;H=0}else{b=d|0|0;d=k|e&0;e=Lf(b|0,d|0,-1,-1)|0;k=D;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Kf(e|0,k|0,g|0,a|0)|0;i=D;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Kf(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&d|0)|0;w=D;u=u-1|0}while((u|0)!=0);B=h;C=x;E=w;F=v;G=0;H=t}t=C;C=0;if(f|0){c[f>>2]=F;c[f+4>>2]=E}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|G;o=(t<<1|0>>>31)&-2|H;return (D=n,o)|0}function Rf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=Kf(e^a|0,f^b|0,e|0,f|0)|0;b=D;a=g^e;e=h^f;return Kf((Qf(i,b,Kf(g^c|0,h^d|0,g|0,h|0)|0,D,0)|0)^a|0,D^e|0,a|0,e|0)|0}function Sf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qf(a,b,c,d,0)|0}function Tf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=S(d,c)|0;f=a>>>16;a=(e>>>16)+(S(d,f)|0)|0;d=b>>>16;b=S(d,c)|0;return (D=(a>>>16)+(S(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Uf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=Tf(e,a)|0;f=D;return (D=(S(b,a)|0)+(S(d,e)|0)+f|f&0,c|0|0)|0}function Vf(a){a=a|0;var b=0,d=0;a=a+15&-16|0;b=c[i>>2]|0;d=b+a|0;if((a|0)>0&(d|0)<(b|0)|(d|0)<0){_()|0;ja(12);return -1}c[i>>2]=d;if((d|0)>(Z()|0)?(Y()|0)==0:0){ja(12);c[i>>2]=b;return -1}return b|0}function Wf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return ma(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function Xf(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Wf(b,c,d)|0;return b|0}function Yf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f|0;Qf(a,b,d,e,g)|0;l=f;return (D=c[g+4>>2]|0,c[g>>2]|0)|0}function Zf(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function _f(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ta[a&7](b|0,c|0,d|0)|0}function $f(a,b){a=a|0;b=b|0;ua[a&1](b|0)}function ag(a,b){a=a|0;b=b|0;return va[a&15](b|0)|0}function bg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return wa[a&15](b|0,c|0,d|0,e|0)|0}function cg(a,b,c){a=a|0;b=b|0;c=c|0;return xa[a&1](b|0,c|0)|0}function dg(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return ya[a&31](b|0,c|0,d|0,e|0,f|0)|0}function eg(a,b,c){a=a|0;b=b|0;c=c|0;W(0);return 0}function fg(a){a=a|0;W(1)}function gg(a){a=a|0;W(2);return 0}function hg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(3);return 0}function ig(a,b){a=a|0;b=b|0;W(4);return 0}function jg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(5);return 0}\n\n// EMSCRIPTEN_END_FUNCS\nvar ta=[eg,ze,te,hd,Wd,Xd,se,eg];var ua=[fg,jc];var va=[gg,re,ac,dc,Hc,Jc,yc,xc,Yd,gg,gg,gg,gg,gg,gg,gg];var wa=[hg,Xa,_a,bb,hb,lb,pb,sb,Vd,hg,hg,hg,hg,hg,hg,hg];var xa=[ig,yb];var ya=[jg,Wa,Ya,Za,$a,ab,cb,db,eb,fb,gb,ib,jb,kb,mb,nb,ob,qb,rb,Bb,Eb,Fb,Gb,jg,jg,jg,jg,jg,jg,jg,jg,jg];return{_ogv_demuxer_receive_input:$d,stackSave:Aa,getTempRet0:Fa,___udivdi3:Sf,setThrew:Da,_bitshift64Lshr:Nf,_bitshift64Shl:Of,_ogv_demuxer_keypoint_offset:fe,_ogv_demuxer_process:ae,_bitshift64Ashr:Jf,_llvm_cttz_i32:Pf,_ogv_demuxer_destroy:be,_sbrk:Vf,_ogv_demuxer_media_duration:de,stackAlloc:za,___muldi3:Uf,___uremdi3:Yf,___divdi3:Rf,_i64Subtract:Kf,___udivmoddi4:Qf,setTempRet0:Ea,_i64Add:Lf,_ogv_demuxer_seekable:ee,_ogv_demuxer_media_length:ce,_free:Df,stackRestore:Ba,_llvm_bswap_i32:Zf,___muldsi3:Tf,_ogv_demuxer_seek_to_keypoint:ge,runPostSets:If,establishStackSpace:Ca,_ogv_demuxer_flush:he,_ogv_demuxer_init:Ud,_emscripten_get_global_libc:qe,_malloc:Cf,_memcpy:Wf,_memmove:Xf,_memset:Mf,stackAlloc:za,stackSave:Aa,stackRestore:Ba,establishStackSpace:Ca,setThrew:Da,setTempRet0:Ea,getTempRet0:Fa,dynCall_iiii:_f,dynCall_vi:$f,dynCall_ii:ag,dynCall_iiiii:bg,dynCall_iii:cg,dynCall_iiiiii:dg}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _ogv_demuxer_receive_input=Module[\"_ogv_demuxer_receive_input\"]=asm[\"_ogv_demuxer_receive_input\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _ogv_demuxer_keypoint_offset=Module[\"_ogv_demuxer_keypoint_offset\"]=asm[\"_ogv_demuxer_keypoint_offset\"];var _ogv_demuxer_process=Module[\"_ogv_demuxer_process\"]=asm[\"_ogv_demuxer_process\"];var _bitshift64Ashr=Module[\"_bitshift64Ashr\"]=asm[\"_bitshift64Ashr\"];var _llvm_cttz_i32=Module[\"_llvm_cttz_i32\"]=asm[\"_llvm_cttz_i32\"];var _ogv_demuxer_destroy=Module[\"_ogv_demuxer_destroy\"]=asm[\"_ogv_demuxer_destroy\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _ogv_demuxer_media_duration=Module[\"_ogv_demuxer_media_duration\"]=asm[\"_ogv_demuxer_media_duration\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var ___divdi3=Module[\"___divdi3\"]=asm[\"___divdi3\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var ___udivmoddi4=Module[\"___udivmoddi4\"]=asm[\"___udivmoddi4\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _ogv_demuxer_seekable=Module[\"_ogv_demuxer_seekable\"]=asm[\"_ogv_demuxer_seekable\"];var _ogv_demuxer_media_length=Module[\"_ogv_demuxer_media_length\"]=asm[\"_ogv_demuxer_media_length\"];var _free=Module[\"_free\"]=asm[\"_free\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var ___muldsi3=Module[\"___muldsi3\"]=asm[\"___muldsi3\"];var _ogv_demuxer_seek_to_keypoint=Module[\"_ogv_demuxer_seek_to_keypoint\"]=asm[\"_ogv_demuxer_seek_to_keypoint\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var _ogv_demuxer_flush=Module[\"_ogv_demuxer_flush\"]=asm[\"_ogv_demuxer_flush\"];var _ogv_demuxer_init=Module[\"_ogv_demuxer_init\"]=asm[\"_ogv_demuxer_init\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_iiiii=Module[\"dynCall_iiiii\"]=asm[\"dynCall_iiiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=asm[\"dynCall_iiiiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();var delta=getTimestamp()-start;Module.cpuTime+=delta;return ret}Module.loadedMetadata=false;Module.videoCodec=null;Module.audioCodec=null;Module.duration=NaN;Module.onseek=null;Module.cpuTime=0;Module.audioPackets=[];Object.defineProperty(Module,\"hasAudio\",{get:(function(){return Module.loadedMetadata&&Module.audioCodec})});Object.defineProperty(Module,\"audioReady\",{get:(function(){return Module.audioPackets.length>0})});Object.defineProperty(Module,\"audioTimestamp\",{get:(function(){if(Module.audioPackets.length>0){return Module.audioPackets[0].timestamp}else{return-1}})});Module.videoPackets=[];Object.defineProperty(Module,\"hasVideo\",{get:(function(){return Module.loadedMetadata&&Module.videoCodec})});Object.defineProperty(Module,\"frameReady\",{get:(function(){return Module.videoPackets.length>0})});Object.defineProperty(Module,\"frameTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].timestamp}else{return-1}})});Object.defineProperty(Module,\"keyframeTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].keyframeTimestamp}else{return-1}})});Object.defineProperty(Module,\"nextKeyframeTimestamp\",{get:(function(){for(var i=0;i<Module.videoPackets.length;i++){var packet=Module.videoPackets[i];if(packet.isKeyframe){return packet.timestamp}}return-1})});Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Object.defineProperty(Module,\"seekable\",{get:(function(){return!!Module._ogv_demuxer_seekable()})});Module.init=(function(callback){function finish(){time((function(){Module._ogv_demuxer_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.receiveInput=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);Module._ogv_demuxer_receive_input(buffer,len)}));callback()});Module.process=(function(callback){var ret=time((function(){return Module._ogv_demuxer_process()}));callback(!!ret)});Module.dequeueVideoPacket=(function(callback){if(Module.videoPackets.length){var packet=Module.videoPackets.shift().data;callback(packet)}else{callback(null)}});Module.dequeueAudioPacket=(function(callback){if(Module.audioPackets.length){var packet=Module.audioPackets.shift().data;callback(packet)}else{callback(null)}});Module.getKeypointOffset=(function(timeSeconds,callback){var offset=time((function(){return Module._ogv_demuxer_keypoint_offset(timeSeconds*1e3)}));callback(offset)});Module.seekToKeypoint=(function(timeSeconds,callback){var ret=time((function(){return Module._ogv_demuxer_seek_to_keypoint(timeSeconds*1e3)}));if(ret){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length)}callback(!!ret)});Module.flush=(function(callback){time((function(){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length);Module._ogv_demuxer_flush()}));callback()});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDemuxerOgg;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-demuxer-webm-wasm.js",
    "content": "var OGVDemuxerWebMW\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDemuxerWebMW = function(OGVDemuxerWebMW) {\n  OGVDemuxerWebMW = OGVDemuxerWebMW || {};\n  if (!OGVDemuxerWebMW.currentScriptUrl) OGVDemuxerWebMW.currentScriptUrl = scriptSrc;\n  var Module = OGVDemuxerWebMW;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDemuxerWebMW=Module;var Module;if(!Module)Module=(typeof OGVDemuxerWebMW!==\"undefined\"?OGVDemuxerWebMW:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Memory===\"function\"){Module[\"wasmMemory\"]=new WebAssembly.Memory({\"initial\":TOTAL_MEMORY/WASM_PAGE_SIZE,\"maximum\":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\"wasmMemory\"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"fround\"]){var froundBuffer=new Float32Array(1);Math[\"fround\"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math[\"fround\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module[\"wasmJSMethod\"]||\"native-wasm\";Module[\"wasmJSMethod\"]=method;var wasmTextFile=Module[\"wasmTextFile\"]||\"ogv-demuxer-webm-wasm.wast\";var wasmBinaryFile=Module[\"wasmBinaryFile\"]||\"ogv-demuxer-webm-wasm.wasm\";var asmjsCodeFile=Module[\"asmjsCodeFile\"]||\"ogv-demuxer-webm-wasm.temp.asm.js\";if(typeof Module[\"locateFile\"]===\"function\"){wasmTextFile=Module[\"locateFile\"](wasmTextFile);wasmBinaryFile=Module[\"locateFile\"](wasmBinaryFile);asmjsCodeFile=Module[\"locateFile\"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={\"f64-rem\":(function(x,y){return x%y}),\"f64-to-int\":(function(x){return x|0}),\"i32s-div\":(function(x,y){return(x|0)/(y|0)|0}),\"i32u-div\":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\"i32s-rem\":(function(x,y){return(x|0)%(y|0)|0}),\"i32u-rem\":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\"debugger\":(function(){debugger})};var info={\"global\":null,\"env\":null,\"asm2wasm\":asm2wasmImports,\"parent\":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(\".\")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(\".\");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\"bad lookupImport to (\"+mod+\").\"+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module[\"buffer\"];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\"printErr\"](\"the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here\")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\"STATIC_BASE\"],Module[\"STATIC_BASE\"]+Module[\"STATIC_BUMP\"]),Module[\"STATIC_BASE\"])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function fixImports(imports){if(!0)return imports;var ret={};for(var i in imports){var fixed=i;if(fixed[0]==\"_\")fixed=fixed.substr(1);ret[fixed]=imports[i]}return ret}function getBinary(){var binary;if(Module[\"wasmBinary\"]){binary=Module[\"wasmBinary\"];binary=new Uint8Array(binary)}else if(Module[\"readBinary\"]){binary=Module[\"readBinary\"](wasmBinaryFile)}else{throw\"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)\"}return binary}function getBinaryPromise(){if(!Module[\"wasmBinary\"]&&typeof fetch===\"function\"){return fetch(wasmBinaryFile).then((function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doJustAsm(global,env,providedBuffer){if(typeof Module[\"asm\"]!==\"function\"||Module[\"asm\"]===methodHandler){if(!Module[\"asmPreload\"]){eval(Module[\"read\"](asmjsCodeFile))}else{Module[\"asm\"]=Module[\"asmPreload\"]}}if(typeof Module[\"asm\"]!==\"function\"){Module[\"printErr\"](\"asm evalling did not set the module properly\");return false}return Module[\"asm\"](global,env,providedBuffer)}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!==\"object\"){Module[\"printErr\"](\"no native wasm support detected\");return false}if(!(Module[\"wasmMemory\"]instanceof WebAssembly.Memory)){Module[\"printErr\"](\"no native wasm Memory in use\");return false}env[\"memory\"]=Module[\"wasmMemory\"];info[\"global\"]={\"NaN\":NaN,\"Infinity\":Infinity};info[\"global.Math\"]=global.Math;info[\"env\"]=env;function receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\"asm\"]=exports;Module[\"usingWasm\"]=true;removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){Module[\"printErr\"](\"Module.instantiateWasm callback failed with error: \"+e);return false}}getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\"instance\"])})).catch((function(reason){Module[\"printErr\"](\"failed to asynchronously prepare wasm: \"+reason);Module[\"quit\"](1,reason)}));return{}}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!==\"function\"){Module[\"printErr\"](\"WasmJS not detected - polyfill not bundled?\");return false}var wasmJS=WasmJS({});wasmJS[\"outside\"]=Module;wasmJS[\"info\"]=info;wasmJS[\"lookupImport\"]=lookupImport;assert(providedBuffer===Module[\"buffer\"]);info.global=global;info.env=env;assert(providedBuffer===Module[\"buffer\"]);env[\"memory\"]=providedBuffer;assert(env[\"memory\"]instanceof ArrayBuffer);wasmJS[\"providedTotalMemory\"]=Module[\"buffer\"].byteLength;var code;if(method===\"interpret-binary\"){code=getBinary()}else{code=Module[\"read\"](method==\"interpret-asm2wasm\"?asmjsCodeFile:wasmTextFile)}var temp;if(method==\"interpret-asm2wasm\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_asm2wasm\"](temp)}else if(method===\"interpret-s-expr\"){temp=wasmJS[\"_malloc\"](code.length+1);wasmJS[\"writeAsciiToMemory\"](code,temp);wasmJS[\"_load_s_expr2wasm\"](temp)}else if(method===\"interpret-binary\"){temp=wasmJS[\"_malloc\"](code.length);wasmJS[\"HEAPU8\"].set(code,temp);wasmJS[\"_load_binary2wasm\"](temp,code.length)}else{throw\"what? \"+method}wasmJS[\"_free\"](temp);wasmJS[\"_instantiate\"](temp);if(Module[\"newBuffer\"]){mergeMemory(Module[\"newBuffer\"]);Module[\"newBuffer\"]=null}exports=wasmJS[\"asmExports\"];return exports}Module[\"asmPreload\"]=Module[\"asm\"];Module[\"reallocBuffer\"]=(function(size){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module[\"buffer\"];var oldSize=old.byteLength;if(Module[\"usingWasm\"]){try{var result=Module[\"wasmMemory\"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module[\"buffer\"]=Module[\"wasmMemory\"].buffer}else{return null}}catch(e){return null}}else{exports[\"__growWasmMemory\"]((size-oldSize)/wasmPageSize);return Module[\"buffer\"]!==old?Module[\"buffer\"]:null}});Module[\"asm\"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\"table\"]){var TABLE_SIZE=Module[\"wasmTableSize\"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module[\"wasmMaxTableSize\"];if(typeof WebAssembly===\"object\"&&typeof WebAssembly.Table===\"function\"){if(MAX_TABLE_SIZE!==undefined){env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,\"maximum\":MAX_TABLE_SIZE,\"element\":\"anyfunc\"})}else{env[\"table\"]=new WebAssembly.Table({\"initial\":TABLE_SIZE,element:\"anyfunc\"})}}else{env[\"table\"]=new Array(TABLE_SIZE)}Module[\"wasmTable\"]=env[\"table\"]}if(!env[\"memoryBase\"]){env[\"memoryBase\"]=Module[\"STATIC_BASE\"]}if(!env[\"tableBase\"]){env[\"tableBase\"]=0}var exports;var methods=method.split(\",\");for(var i=0;i<methods.length;i++){var curr=methods[i];if(curr===\"native-wasm\"){if(exports=doNativeWasm(global,env,providedBuffer))break}else if(curr===\"asmjs\"){if(exports=doJustAsm(global,env,providedBuffer))break}else if(curr===\"interpret-asm2wasm\"||curr===\"interpret-s-expr\"||curr===\"interpret-binary\"){if(exports=doWasmPolyfill(global,env,providedBuffer,curr))break}else{throw\"bad method: \"+curr}}if(!exports)throw\"no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods\";return exports});var methodHandler=Module[\"asm\"]}integrateWasmJS(Module);var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+11312;__ATINIT__.push();memoryInitializer=Module[\"wasmJSMethod\"].indexOf(\"asmjs\")>=0||Module[\"wasmJSMethod\"].indexOf(\"interpret-asm2wasm\")>=0?\"ogv-demuxer-webm-wasm.js.mem\":null;var STATIC_BUMP=11312;Module[\"STATIC_BASE\"]=STATIC_BASE;Module[\"STATIC_BUMP\"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_memset\"]=_memset;function ___assert_fail(condition,filename,line,func){ABORT=true;throw\"Assertion failed: \"+Pointer_stringify(condition)+\", at: \"+[filename?Pointer_stringify(filename):\"unknown filename\",line,func?Pointer_stringify(func):\"unknown function\"]+\" at \"+stackTrace()}function _ogvjs_callback_loaded_metadata(videoCodecStr,audioCodecStr){if(videoCodecStr){Module.videoCodec=Module.Pointer_stringify(videoCodecStr)}if(audioCodecStr){Module.audioCodec=Module.Pointer_stringify(audioCodecStr)}var len=Module._ogv_demuxer_media_duration();if(len>=0){Module.duration=len}else{Module.duration=NaN}Module.loadedMetadata=true}function _abort(){Module[\"abort\"]()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;function _ogvjs_callback_audio_packet(buffer,len,audioTimestamp){Module.audioPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:audioTimestamp})}Module[\"_memmove\"]=_memmove;function _ogvjs_callback_video_packet(buffer,len,frameTimestamp,keyframeTimestamp,isKeyframe){Module.videoPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:frameTimestamp,keyframeTimestamp:keyframeTimestamp,isKeyframe:!!isKeyframe})}function _ogvjs_callback_init_video(frameWidth,frameHeight,chromaWidth,chromaHeight,fps,picWidth,picHeight,picX,picY,displayWidth,displayHeight){Module.videoFormat={width:frameWidth,height:frameHeight,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:picX,cropTop:picY,cropWidth:picWidth,cropHeight:picHeight,displayWidth:displayWidth,displayHeight:displayHeight,fps:fps}}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _ogvjs_callback_seek(offsetLow,offsetHigh){var offset=offsetLow+offsetHigh*4294967296;if(Module.onseek){Module.onseek(offset)}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\"wasmTableSize\"]=22;Module[\"wasmMaxTableSize\"]=22;function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ijii(index,a1,a2,a3,a4){try{return Module[\"dynCall_ijii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_ji(index,a1){try{return Module[\"dynCall_ji\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiii\":invoke_iiii,\"invoke_ijii\":invoke_ijii,\"invoke_ii\":invoke_ii,\"invoke_ji\":invoke_ji,\"invoke_iii\":invoke_iii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_init_video\":_ogvjs_callback_init_video,\"_ogvjs_callback_loaded_metadata\":_ogvjs_callback_loaded_metadata,\"_abort\":_abort,\"___setErrNo\":___setErrNo,\"___syscall6\":___syscall6,\"_ogvjs_callback_audio_packet\":_ogvjs_callback_audio_packet,\"_ogvjs_callback_seek\":_ogvjs_callback_seek,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"___syscall140\":___syscall140,\"___assert_fail\":___assert_fail,\"___syscall146\":___syscall146,\"_ogvjs_callback_video_packet\":_ogvjs_callback_video_packet,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};var asm=Module[\"asm\"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\"asm\"]=asm;var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=(function(){return Module[\"asm\"][\"_llvm_bswap_i32\"].apply(null,arguments)});var _ogv_demuxer_receive_input=Module[\"_ogv_demuxer_receive_input\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_receive_input\"].apply(null,arguments)});var setThrew=Module[\"setThrew\"]=(function(){return Module[\"asm\"][\"setThrew\"].apply(null,arguments)});var _ogv_demuxer_keypoint_offset=Module[\"_ogv_demuxer_keypoint_offset\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_keypoint_offset\"].apply(null,arguments)});var _ogv_demuxer_process=Module[\"_ogv_demuxer_process\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_process\"].apply(null,arguments)});var _memset=Module[\"_memset\"]=(function(){return Module[\"asm\"][\"_memset\"].apply(null,arguments)});var _ogv_demuxer_destroy=Module[\"_ogv_demuxer_destroy\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_destroy\"].apply(null,arguments)});var _sbrk=Module[\"_sbrk\"]=(function(){return Module[\"asm\"][\"_sbrk\"].apply(null,arguments)});var _memcpy=Module[\"_memcpy\"]=(function(){return Module[\"asm\"][\"_memcpy\"].apply(null,arguments)});var stackAlloc=Module[\"stackAlloc\"]=(function(){return Module[\"asm\"][\"stackAlloc\"].apply(null,arguments)});var getTempRet0=Module[\"getTempRet0\"]=(function(){return Module[\"asm\"][\"getTempRet0\"].apply(null,arguments)});var setTempRet0=Module[\"setTempRet0\"]=(function(){return Module[\"asm\"][\"setTempRet0\"].apply(null,arguments)});var _ogv_demuxer_media_duration=Module[\"_ogv_demuxer_media_duration\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_media_duration\"].apply(null,arguments)});var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=(function(){return Module[\"asm\"][\"_emscripten_get_global_libc\"].apply(null,arguments)});var _ogv_demuxer_media_length=Module[\"_ogv_demuxer_media_length\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_media_length\"].apply(null,arguments)});var _free=Module[\"_free\"]=(function(){return Module[\"asm\"][\"_free\"].apply(null,arguments)});var stackRestore=Module[\"stackRestore\"]=(function(){return Module[\"asm\"][\"stackRestore\"].apply(null,arguments)});var stackSave=Module[\"stackSave\"]=(function(){return Module[\"asm\"][\"stackSave\"].apply(null,arguments)});var _ogv_demuxer_seek_to_keypoint=Module[\"_ogv_demuxer_seek_to_keypoint\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_seek_to_keypoint\"].apply(null,arguments)});var runPostSets=Module[\"runPostSets\"]=(function(){return Module[\"asm\"][\"runPostSets\"].apply(null,arguments)});var establishStackSpace=Module[\"establishStackSpace\"]=(function(){return Module[\"asm\"][\"establishStackSpace\"].apply(null,arguments)});var _memmove=Module[\"_memmove\"]=(function(){return Module[\"asm\"][\"_memmove\"].apply(null,arguments)});var _ogv_demuxer_init=Module[\"_ogv_demuxer_init\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_init\"].apply(null,arguments)});var _ogv_demuxer_seekable=Module[\"_ogv_demuxer_seekable\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_seekable\"].apply(null,arguments)});var _malloc=Module[\"_malloc\"]=(function(){return Module[\"asm\"][\"_malloc\"].apply(null,arguments)});var _ogv_demuxer_flush=Module[\"_ogv_demuxer_flush\"]=(function(){return Module[\"asm\"][\"_ogv_demuxer_flush\"].apply(null,arguments)});var dynCall_iiii=Module[\"dynCall_iiii\"]=(function(){return Module[\"asm\"][\"dynCall_iiii\"].apply(null,arguments)});var dynCall_ijii=Module[\"dynCall_ijii\"]=(function(){return Module[\"asm\"][\"dynCall_ijii\"].apply(null,arguments)});var dynCall_ii=Module[\"dynCall_ii\"]=(function(){return Module[\"asm\"][\"dynCall_ii\"].apply(null,arguments)});var dynCall_ji=Module[\"dynCall_ji\"]=(function(){return Module[\"asm\"][\"dynCall_ji\"].apply(null,arguments)});var dynCall_iii=Module[\"dynCall_iii\"]=(function(){return Module[\"asm\"][\"dynCall_iii\"].apply(null,arguments)});var dynCall_viiii=Module[\"dynCall_viiii\"]=(function(){return Module[\"asm\"][\"dynCall_viiii\"].apply(null,arguments)});Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;if(memoryInitializer){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];if(request.status!==200&&request.status!==0){console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();var delta=getTimestamp()-start;Module.cpuTime+=delta;return ret}Module.loadedMetadata=false;Module.videoCodec=null;Module.audioCodec=null;Module.duration=NaN;Module.onseek=null;Module.cpuTime=0;Module.audioPackets=[];Object.defineProperty(Module,\"hasAudio\",{get:(function(){return Module.loadedMetadata&&Module.audioCodec})});Object.defineProperty(Module,\"audioReady\",{get:(function(){return Module.audioPackets.length>0})});Object.defineProperty(Module,\"audioTimestamp\",{get:(function(){if(Module.audioPackets.length>0){return Module.audioPackets[0].timestamp}else{return-1}})});Module.videoPackets=[];Object.defineProperty(Module,\"hasVideo\",{get:(function(){return Module.loadedMetadata&&Module.videoCodec})});Object.defineProperty(Module,\"frameReady\",{get:(function(){return Module.videoPackets.length>0})});Object.defineProperty(Module,\"frameTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].timestamp}else{return-1}})});Object.defineProperty(Module,\"keyframeTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].keyframeTimestamp}else{return-1}})});Object.defineProperty(Module,\"nextKeyframeTimestamp\",{get:(function(){for(var i=0;i<Module.videoPackets.length;i++){var packet=Module.videoPackets[i];if(packet.isKeyframe){return packet.timestamp}}return-1})});Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Object.defineProperty(Module,\"seekable\",{get:(function(){return!!Module._ogv_demuxer_seekable()})});Module.init=(function(callback){function finish(){time((function(){Module._ogv_demuxer_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.receiveInput=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);Module._ogv_demuxer_receive_input(buffer,len)}));callback()});Module.process=(function(callback){var ret=time((function(){return Module._ogv_demuxer_process()}));callback(!!ret)});Module.dequeueVideoPacket=(function(callback){if(Module.videoPackets.length){var packet=Module.videoPackets.shift().data;callback(packet)}else{callback(null)}});Module.dequeueAudioPacket=(function(callback){if(Module.audioPackets.length){var packet=Module.audioPackets.shift().data;callback(packet)}else{callback(null)}});Module.getKeypointOffset=(function(timeSeconds,callback){var offset=time((function(){return Module._ogv_demuxer_keypoint_offset(timeSeconds*1e3)}));callback(offset)});Module.seekToKeypoint=(function(timeSeconds,callback){var ret=time((function(){return Module._ogv_demuxer_seek_to_keypoint(timeSeconds*1e3)}));if(ret){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length)}callback(!!ret)});Module.flush=(function(callback){time((function(){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length);Module._ogv_demuxer_flush()}));callback()});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n  return OGVDemuxerWebMW;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-demuxer-webm.js",
    "content": "var OGVDemuxerWebM\n(function() {\n  var scriptSrc;\n  if (typeof document !== 'undefined' && document.currentScript) scriptSrc = document.currentScript.src;\nOGVDemuxerWebM = function(OGVDemuxerWebM) {\n  OGVDemuxerWebM = OGVDemuxerWebM || {};\n  if (!OGVDemuxerWebM.currentScriptUrl) OGVDemuxerWebM.currentScriptUrl = scriptSrc;\n  var Module = OGVDemuxerWebM;\n\nvar options=Module;Module={print:(function(str){console.log(str)})};if(typeof OGVLoader!==\"undefined\"){Module[\"pthreadMainPrefixURL\"]=OGVLoader.base+\"/\"}if(options[\"memoryLimit\"]&&!options.wasmBinary){Module[\"TOTAL_MEMORY\"]=options[\"memoryLimit\"]}for(option in options){if(options.hasOwnProperty(option)){Module[option]=options[option]}}var Math_imul_orig=Math.imul;var OGVDemuxerWebM=Module;var Module;if(!Module)Module=(typeof OGVDemuxerWebM!==\"undefined\"?OGVDemuxerWebM:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else if(Module[\"ENVIRONMENT\"]===\"PTHREAD\"){ENVIRONMENT_IS_WORKER=true;ENVIRONMENT_IS_PTHREAD=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function shell_read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function shell_print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\"var stack = \"+JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\"stackRestore\"].body.replace(\"()\",\"(stack)\")+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+10304;__ATINIT__.push();allocate([128,14,0,0,0,0,0,0,163,223,69,26,0,0,0,0,1,0,0,0,40,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,136,14,0,0,0,0,0,0,103,128,83,24,0,0,0,0,1,0,0,0,152,0,0,0,4,0,0,0,192,1,0,0,0,0,0,0,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,17,0,0,0,0,0,0,134,66,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,17,0,0,0,0,0,0,247,66,0,0,0,0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,17,0,0,0,0,0,0,242,66,0,0,0,0,0,0,2,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,17,0,0,0,0,0,0,243,66,0,0,0,0,0,0,2,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,17,0,0,0,0,0,0,130,66,0,0,0,0,0,0,4,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,17,0,0,0,0,0,0,135,66,0,0,0,0,0,0,2,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,17,0,0,0,0,0,0,133,66,0,0,0,0,0,0,2,0,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147,14,0,0,0,0,0,0,116,155,77,17,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,176,2,0,0,8,0,0,0,0,0,0,0,160,14,0,0,0,0,0,0,102,169,73,21,0,0,0,0,1,0,0,0,8,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,168,14,0,0,0,0,0,0,117,182,67,31,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,179,14,0,0,0,0,0,0,107,174,84,22,0,0,0,0,1,0,0,0,40,0,0,0,0,0,0,0,120,3,0,0,0,0,0,0,0,0,0,0,189,14,0,0,0,0,0,0,107,187,83,28,0,0,0,0,1,0,0,0,48,0,0,0,0,0,0,0,200,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,17,0,0,0,0,0,0,187,77,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,8,10,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,16,0,0,0,0,0,0,177,215,42,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,17,0,0,0,0,0,0,137,68,0,0,0,0,0,0,3,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,15,0,0,0,0,0,0,174,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,48,5,0,0,160,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,14,0,0,0,0,0,0,187,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,24,4,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,14,0,0,0,0,0,0,179,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,222,14,0,0,0,0,0,0,183,0,0,0,0,0,0,0,1,0,0,0,16,0,0,0,1,0,0,0,144,4,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,245,14,0,0,0,0,0,0,247,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,15,0,0,0,0,0,0,241,0,0,0,0,0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,15,0,0,0,0,0,0,120,83,0,0,0,0,0,0,2,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,15,0,0,0,0,0,0,215,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,15,0,0,0,0,0,0,197,115,0,0,0,0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,15,0,0,0,0,0,0,131,0,0,0,0,0,0,0,2,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,15,0,0,0,0,0,0,185,0,0,0,0,0,0,0,2,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,15,0,0,0,0,0,0,136,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,15,0,0,0,0,0,0,156,0,0,0,0,0,0,0,2,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,15,0,0,0,0,0,0,79,49,35,0,0,0,0,0,3,0,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,15,0,0,0,0,0,0,156,181,34,0,0,0,0,0,4,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,187,15,0,0,0,0,0,0,134,0,0,0,0,0,0,0,4,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,15,0,0,0,0,0,0,162,99,0,0,0,0,0,0,5,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,15,0,0,0,0,0,0,170,86,0,0,0,0,0,0,2,0,0,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,15,0,0,0,0,0,0,187,86,0,0,0,0,0,0,2,0,0,0,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,15,0,0,0,0,0,0,131,227,35,0,0,0,0,0,2,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,16,0,0,0,0,0,0,224,0,0,0,0,0,0,0,1,0,0,0,208,0,0,0,0,0,0,0,176,7,0,0,0,0,0,0,0,0,0,0,20,16,0,0,0,0,0,0,225,0,0,0,0,0,0,0,1,0,0,0,112,1,0,0,0,0,0,0,104,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,16,0,0,0,0,0,0,184,83,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,16,0,0,0,0,0,0,192,83,0,0,0,0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,16,0,0,0,0,0,0,176,0,0,0,0,0,0,0,2,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,16,0,0,0,0,0,0,186,0,0,0,0,0,0,0,2,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,16,0,0,0,0,0,0,170,84,0,0,0,0,0,0,2,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,16,0,0,0,0,0,0,187,84,0,0,0,0,0,0,2,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,16,0,0,0,0,0,0,204,84,0,0,0,0,0,0,2,0,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,16,0,0,0,0,0,0,221,84,0,0,0,0,0,0,2,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,214,16,0,0,0,0,0,0,176,84,0,0,0,0,0,0,2,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,16,0,0,0,0,0,0,186,84,0,0,0,0,0,0,2,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,16,0,0,0,0,0,0,181,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,16,0,0,0,0,0,0,159,0,0,0,0,0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,16,0,0,0,0,0,0,100,98,0,0,0,0,0,0,2,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,17,0,0,0,0,0,0,171,83,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,17,0,0,0,0,0,0,172,83,0,0,0,0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,0,0,0,0,0,0,0,255,31,0,0,0,0,0,0,255,255,15,0,0,0,0,0,255,255,255,7,0,0,0,0,255,255,255,255,3,0,0,0,255,255,255,255,255,1,0,0,255,255,255,255,255,255,0,0,255,255,255,255,255,255,127,0,0,0,0,0,0,0,240,191,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,11,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,55,36,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,116,120,45,62,97,110,99,101,115,116,111,114,32,61,61,32,78,85,76,76,0,46,46,47,46,46,47,46,46,47,108,105,98,110,101,115,116,101,103,103,47,115,114,99,47,110,101,115,116,101,103,103,46,99,0,110,101,115,116,101,103,103,95,100,101,115,116,114,111,121,0,99,116,120,32,37,112,0,116,121,112,101,46,116,121,112,101,32,61,61,32,84,89,80,69,95,85,73,78,84,0,110,101,95,103,101,116,95,117,105,110,116,0,116,121,112,101,46,116,121,112,101,32,61,61,32,84,89,80,69,95,83,84,82,73,78,71,0,110,101,95,103,101,116,95,115,116,114,105,110,103,0,109,97,116,114,111,115,107,97,0,119,101,98,109,0,99,116,120,45,62,97,110,99,101,115,116,111,114,0,110,101,95,112,97,114,115,101,0,101,108,101,109,101,110,116,45,62,105,100,32,61,61,32,73,68,95,67,76,85,83,84,69,82,32,38,38,32,101,108,101,109,101,110,116,45,62,116,121,112,101,32,61,61,32,84,89,80,69,95,77,65,83,84,69,82,0,115,117,115,112,101,110,100,32,112,97,114,115,101,32,97,116,32,37,108,108,120,0,105,100,32,61,61,32,112,101,101,107,101,100,95,105,100,0,109,117,108,116,105,32,109,97,115,116,101,114,32,101,108,101,109,101,110,116,32,37,108,108,120,32,40,37,115,41,0,32,45,62,32,117,115,105,110,103,32,100,97,116,97,32,37,112,0,115,105,110,103,108,101,32,109,97,115,116,101,114,32,101,108,101,109,101,110,116,32,37,108,108,120,32,40,37,115,41,0,32,45,62,32,117,115,105,110,103,32,100,97,116,97,32,37,112,32,40,37,117,41,0,101,108,101,109,101,110,116,32,37,108,108,120,32,40,37,115,41,32,97,108,114,101,97,100,121,32,114,101,97,100,44,32,115,107,105,112,112,105,110,103,0,101,108,101,109,101,110,116,32,37,108,108,120,32,40,37,115,41,32,45,62,32,37,112,32,40,37,117,41,0,48,0,110,101,95,114,101,97,100,95,115,105,109,112,108,101,0,112,97,114,101,110,116,32,101,108,101,109,101,110,116,32,37,108,108,120,0,42,42,42,32,112,97,114,115,101,32,97,98,111,117,116,32,116,111,32,98,97,99,107,32,117,112,32,112,97,115,116,32,116,111,112,95,108,101,118,101,108,0,117,110,107,110,111,119,110,32,101,108,101,109,101,110,116,32,37,108,108,120,0,73,68,95,69,66,77,76,0,73,68,95,83,69,71,77,69,78,84,0,73,68,95,83,69,69,75,95,72,69,65,68,0,73,68,95,73,78,70,79,0,73,68,95,67,76,85,83,84,69,82,0,73,68,95,84,82,65,67,75,83,0,73,68,95,67,85,69,83,0,73,68,95,67,85,69,95,80,79,73,78,84,0,73,68,95,67,85,69,95,84,73,77,69,0,73,68,95,67,85,69,95,84,82,65,67,75,95,80,79,83,73,84,73,79,78,83,0,73,68,95,67,85,69,95,84,82,65,67,75,0,73,68,95,67,85,69,95,67,76,85,83,84,69,82,95,80,79,83,73,84,73,79,78,0,73,68,95,67,85,69,95,66,76,79,67,75,95,78,85,77,66,69,82,0,73,68,95,84,82,65,67,75,95,69,78,84,82,89,0,73,68,95,84,82,65,67,75,95,78,85,77,66,69,82,0,73,68,95,84,82,65,67,75,95,85,73,68,0,73,68,95,84,82,65,67,75,95,84,89,80,69,0,73,68,95,70,76,65,71,95,69,78,65,66,76,69,68,0,73,68,95,70,76,65,71,95,68,69,70,65,85,76,84,0,73,68,95,70,76,65,71,95,76,65,67,73,78,71,0,73,68,95,84,82,65,67,75,95,84,73,77,69,67,79,68,69,95,83,67,65,76,69,0,73,68,95,76,65,78,71,85,65,71,69,0,73,68,95,67,79,68,69,67,95,73,68,0,73,68,95,67,79,68,69,67,95,80,82,73,86,65,84,69,0,73,68,95,67,79,68,69,67,95,68,69,76,65,89,0,73,68,95,83,69,69,75,95,80,82,69,82,79,76,76,0,73,68,95,68,69,70,65,85,76,84,95,68,85,82,65,84,73,79,78,0,73,68,95,86,73,68,69,79,0,73,68,95,65,85,68,73,79,0,73,68,95,83,65,77,80,76,73,78,71,95,70,82,69,81,85,69,78,67,89,0,73,68,95,67,72,65,78,78,69,76,83,0,73,68,95,66,73,84,95,68,69,80,84,72,0,73,68,95,83,84,69,82,69,79,95,77,79,68,69,0,73,68,95,65,76,80,72,65,95,77,79,68,69,0,73,68,95,80,73,88,69,76,95,87,73,68,84,72,0,73,68,95,80,73,88,69,76,95,72,69,73,71,72,84,0,73,68,95,80,73,88,69,76,95,67,82,79,80,95,66,79,84,84,79,77,0,73,68,95,80,73,88,69,76,95,67,82,79,80,95,84,79,80,0,73,68,95,80,73,88,69,76,95,67,82,79,80,95,76,69,70,84,0,73,68,95,80,73,88,69,76,95,67,82,79,80,95,82,73,71,72,84,0,73,68,95,68,73,83,80,76,65,89,95,87,73,68,84,72,0,73,68,95,68,73,83,80,76,65,89,95,72,69,73,71,72,84,0,73,68,95,84,73,77,69,67,79,68,69,95,83,67,65,76,69,0,73,68,95,68,85,82,65,84,73,79,78,0,73,68,95,83,69,69,75,0,73,68,95,83,69,69,75,95,73,68,0,73,68,95,83,69,69,75,95,80,79,83,73,84,73,79,78,0,73,68,95,69,66,77,76,95,86,69,82,83,73,79,78,0,73,68,95,69,66,77,76,95,82,69,65,68,95,86,69,82,83,73,79,78,0,73,68,95,69,66,77,76,95,77,65,88,95,73,68,95,76,69,78,71,84,72,0,73,68,95,69,66,77,76,95,77,65,88,95,83,73,90,69,95,76,69,78,71,84,72,0,73,68,95,68,79,67,84,89,80,69,0,73,68,95,68,79,67,84,89,80,69,95,86,69,82,83,73,79,78,0,73,68,95,68,79,67,84,89,80,69,95,82,69,65,68,95,86,69,82,83,73,79,78,0,116,121,112,101,46,116,121,112,101,32,61,61,32,84,89,80,69,95,70,76,79,65,84,0,110,101,95,103,101,116,95,102,108,111,97,116,0,110,111,100,101,45,62,105,100,32,61,61,32,73,68,95,84,82,65,67,75,95,69,78,84,82,89,0,110,101,95,109,97,112,95,116,114,97,99,107,95,110,117,109,98,101,114,95,116,111,95,105,110,100,101,120,0,110,101,95,105,110,105,116,95,99,117,101,95,112,111,105,110,116,115,0,115,101,101,107,58,32,112,97,114,115,105,110,103,32,99,117,101,32,101,108,101,109,101,110,116,115,0,115,101,101,107,95,104,101,97,100,45,62,105,100,32,61,61,32,73,68,95,83,69,69,75,95,72,69,65,68,0,110,101,95,102,105,110,100,95,115,101,101,107,95,102,111,114,95,105,100,0,115,101,101,107,45,62,105,100,32,61,61,32,73,68,95,83,69,69,75,0,116,121,112,101,46,116,121,112,101,32,61,61,32,84,89,80,69,95,66,73,78,65,82,89,0,110,101,95,103,101,116,95,98,105,110,97,114,121,0,110,101,115,116,101,103,103,95,111,102,102,115,101,116,95,115,101,101,107,0,99,117,101,95,112,111,105,110,116,45,62,105,100,32,61,61,32,73,68,95,67,85,69,95,80,79,73,78,84,0,110,101,95,102,105,110,100,95,99,117,101,95,112,111,105,110,116,95,102,111,114,95,116,115,116,97,109,112,0,110,111,100,101,45,62,105,100,32,61,61,32,73,68,95,67,85,69,95,84,82,65,67,75,95,80,79,83,73,84,73,79,78,83,0,110,101,95,102,105,110,100,95,99,117,101,95,112,111,115,105,116,105,111,110,95,102,111,114,95,116,114,97,99,107,0,110,101,95,102,105,110,100,95,116,114,97,99,107,95,101,110,116,114,121,0,86,95,86,80,56,0,86,95,86,80,57,0,65,95,86,79,82,66,73,83,0,65,95,79,80,85,83,0,110,101,115,116,101,103,103,95,114,101,97,100,95,114,101,115,101,116,0,110,101,115,116,101,103,103,95,114,101,97,100,95,112,97,99,107,101,116,0,114,101,97,100,95,112,97,99,107,101,116,58,32,117,110,107,110,111,119,110,32,101,108,101,109,101,110,116,32,37,108,108,120,0,117,110,107,110,111,119,110,32,101,108,101,109,101,110,116,32,37,108,108,120,32,105,110,32,66,108,111,99,107,65,100,100,105,116,105,111,110,115,0,68,105,115,97,108,108,111,119,101,100,32,66,108,111,99,107,65,100,100,73,100,32,48,32,117,115,101,100,0,77,117,108,116,105,112,108,101,32,66,108,111,99,107,65,100,100,105,116,105,111,110,97,108,32,101,108,101,109,101,110,116,115,32,105,110,32,97,32,66,108,111,99,107,77,111,114,101,0,117,110,107,110,111,119,110,32,101,108,101,109,101,110,116,32,37,108,108,120,32,105,110,32,66,108,111,99,107,77,111,114,101,0,78,111,32,66,108,111,99,107,65,100,100,105,116,105,111,110,97,108,32,101,108,101,109,101,110,116,32,105,110,32,97,32,66,108,111,99,107,77,111,114,101,0,114,101,97,100,95,112,97,99,107,101,116,58,32,117,110,107,110,111,119,110,32,101,108,101,109,101,110,116,32,37,108,108,120,32,105,110,32,66,108,111,99,107,71,114,111,117,112,0,114,101,97,100,95,98,108,111,99,107,32,61,61,32,40,42,112,107,116,32,33,61,32,78,85,76,76,41,0,115,105,109,112,108,101,0,37,115,98,108,111,99,107,32,116,32,37,108,108,100,32,112,116,115,32,37,102,32,102,32,37,108,108,120,32,102,114,97,109,101,115,58,32,37,108,108,117,0,33,32,97,108,108,111,99,97,116,111,114,0,46,46,47,46,46,47,46,46,47,108,105,98,110,101,115,116,101,103,103,47,104,97,108,108,111,99,47,115,114,99,47,104,97,108,108,111,99,46,99,0,104,97,108,108,111,99,95,115,101,116,95,97,108,108,111,99,97,116,111,114,0,97,108,108,111,99,97,116,111,114,0,104,97,108,108,111,99,0,112,45,62,109,97,103,105,99,32,61,61,32,72,72,95,77,65,71,73,67,0,112,32,38,38,32,112,45,62,109,97,103,105,99,32,61,61,32,72,72,95,77,65,71,73,67,0,95,102,114,101,101,95,99,104,105,108,100,114,101,110,0,33,32,112,97,114,101,110,116,0,104,97,116,116,97,99,104,0,98,45,62,109,97,103,105,99,32,61,61,32,72,72,95,77,65,71,73,67,0,98,32,33,61,32,112,0,33,32,95,114,101,108,97,116,101,40,112,44,32,98,41,0,110,101,115,116,101,103,103,95,105,110,105,116,32,115,116,97,114,116,105,110,103,46,46,46,0,110,101,115,116,101,103,103,95,105,110,105,116,32,102,97,105,108,101,100,0,118,112,56,0,118,112,57,0,118,111,114,98,105,115,0,111,112,117,115,0,99,111,100,101,99,32,100,97,116,97,32,102,111,114,32,97,117,100,105,111,58,32,37,100,10,0,102,97,105,108,101,100,32,116,111,32,114,101,97,100,32,99,111,100,101,99,32,100,97,116,97,32,37,100,10,0,68,111,110,101,32,119,105,116,104,32,104,101,97,100,101,114,115,32,115,116,101,112,0,119,101,98,109,32,112,114,111,99,101,115,115,68,101,99,111,100,105,110,103,58,32,101,114,114,111,114,32,37,100,10,0,112,97,99,107,101,116,32,105,115,32,37,108,108,120,44,32,115,105,122,101,32,105,115,32,37,108,108,100,44,32,104,101,97,100,114,111,111,109,32,37,108,108,100,10,0,110,111,116,32,114,101,97,100,121,32,116,111,32,114,101,97,100,32,116,104,101,32,99,117,101,115,0,73,110,118,97,108,105,100,32,97,112,112,83,116,97,116,101,32,105,110,32,111,103,118,95,100,101,109,117,120,101,114,95,112,114,111,99,101,115,115,0,105,115,32,115,101,101,107,105,110,103,32,112,114,111,99,101,115,115,105,110,103,46,46,46,32,70,65,73,76,69,68,32,97,116,32,37,108,108,100,32,37,108,108,100,32,37,108,108,100,10,0,105,115,32,115,101,101,107,105,110,103,32,112,114,111,99,101,115,115,105,110,103,46,46,46,32,77,79,65,82,32,83,69,69,75,32,37,108,108,100,32,37,108,108,100,32,37,108,108,100,10,0,105,115,32,115,101,101,107,105,110,103,32,112,114,111,99,101,115,115,105,110,103,46,46,46,32,76,79,79,75,83,32,82,79,76,76,32,79,86,69,82,0,111,117,116,32,111,102,32,98,121,116,101,115,32,97,116,32,115,116,97,114,116,32,111,102,32,102,105,101,108,100,0,122,101,114,111,32,102,105,101,108,100,0,111,117,116,32,111,102,32,98,121,116,101,115,32,105,110,32,102,105,101,108,100,0,66,117,102,102,101,114,32,115,101,101,107,32,102,97,105,108,117,114,101,32,105,110,32,119,101,98,109,32,100,101,109,117,120,101,114,0,116,114,121,105,110,103,32,116,111,32,115,101,101,107,32,116,111,32,37,108,108,100,10,0,102,97,105,108,101,100,32,98,113,95,114,101,97,100,32,108,101,110,32,37,100,32,97,116,32,112,111,115,32,37,108,108,100,10,0,102,97,105,108,101,100,32,97,32,98,113,95,114,101,97,100,32,108,101,110,32,37,100,32,97,116,32,112,111,115,32,37,108,108,100,10,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _ogvjs_callback_loaded_metadata(videoCodecStr,audioCodecStr){if(videoCodecStr){Module.videoCodec=Module.Pointer_stringify(videoCodecStr)}if(audioCodecStr){Module.audioCodec=Module.Pointer_stringify(audioCodecStr)}var len=Module._ogv_demuxer_media_duration();if(len>=0){Module.duration=len}else{Module.duration=NaN}Module.loadedMetadata=true}Module[\"_i64Subtract\"]=_i64Subtract;function ___assert_fail(condition,filename,line,func){ABORT=true;throw\"Assertion failed: \"+Pointer_stringify(condition)+\", at: \"+[filename?Pointer_stringify(filename):\"unknown filename\",line,func?Pointer_stringify(func):\"unknown function\"]+\" at \"+stackTrace()}Module[\"_memset\"]=_memset;Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _abort(){Module[\"abort\"]()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;function _ogvjs_callback_seek(offsetLow,offsetHigh){var offset=offsetLow+offsetHigh*4294967296;if(Module.onseek){Module.onseek(offset)}}Module[\"_i64Add\"]=_i64Add;var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);Module[\"_llvm_cttz_i32\"]=_llvm_cttz_i32;Module[\"___udivmoddi4\"]=___udivmoddi4;Module[\"___udivdi3\"]=___udivdi3;Module[\"___muldsi3\"]=___muldsi3;Module[\"___muldi3\"]=___muldi3;function _ogvjs_callback_audio_packet(buffer,len,audioTimestamp){Module.audioPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:audioTimestamp})}Module[\"_memmove\"]=_memmove;function _ogvjs_callback_video_packet(buffer,len,frameTimestamp,keyframeTimestamp,isKeyframe){Module.videoPackets.push({data:Module.HEAPU8.buffer.slice?Module.HEAPU8.buffer.slice(buffer,buffer+len):(new Uint8Array(new Uint8Array(Module.HEAPU8.buffer,buffer,len))).buffer,timestamp:frameTimestamp,keyframeTimestamp:keyframeTimestamp,isKeyframe:!!isKeyframe})}Module[\"___uremdi3\"]=___uremdi3;function _ogvjs_callback_init_video(frameWidth,frameHeight,chromaWidth,chromaHeight,fps,picWidth,picHeight,picX,picY,displayWidth,displayHeight){Module.videoFormat={width:frameWidth,height:frameHeight,chromaWidth:chromaWidth,chromaHeight:chromaHeight,cropLeft:picX,cropTop:picY,cropWidth:picWidth,cropHeight:picHeight,displayWidth:displayWidth,displayHeight:displayHeight,fps:fps}}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_ii\":invoke_ii,\"invoke_iiii\":invoke_iiii,\"invoke_iii\":invoke_iii,\"invoke_iiiii\":invoke_iiiii,\"invoke_viiii\":invoke_viiii,\"_ogvjs_callback_init_video\":_ogvjs_callback_init_video,\"_ogvjs_callback_video_packet\":_ogvjs_callback_video_packet,\"___syscall6\":___syscall6,\"___setErrNo\":___setErrNo,\"_abort\":_abort,\"___syscall140\":___syscall140,\"_ogvjs_callback_seek\":_ogvjs_callback_seek,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"___syscall54\":___syscall54,\"_ogvjs_callback_audio_packet\":_ogvjs_callback_audio_packet,\"___assert_fail\":___assert_fail,\"___syscall146\":___syscall146,\"_ogvjs_callback_loaded_metadata\":_ogvjs_callback_loaded_metadata,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_ii;var aa=env.invoke_iiii;var ba=env.invoke_iii;var ca=env.invoke_iiiii;var da=env.invoke_viiii;var ea=env._ogvjs_callback_init_video;var fa=env._ogvjs_callback_video_packet;var ga=env.___syscall6;var ha=env.___setErrNo;var ia=env._abort;var ja=env.___syscall140;var ka=env._ogvjs_callback_seek;var la=env._emscripten_memcpy_big;var ma=env.___syscall54;var na=env._ogvjs_callback_audio_packet;var oa=env.___assert_fail;var pa=env.___syscall146;var qa=env._ogvjs_callback_loaded_metadata;var ra=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction xa(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function ya(){return l|0}function za(a){a=a|0;l=a}function Aa(a,b){a=a|0;b=b|0;l=a;m=b}function Ba(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Ca(a){a=a|0;D=a}function Da(){return D|0}function Ea(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;h=l;l=l+16|0;i=h+8|0;j=h;if(!(c[b>>2]|0)){k=-1;l=h;return k|0}if(!(c[b+4>>2]|0)){k=-1;l=h;return k|0}if(!(c[b+8>>2]|0)){k=-1;l=h;return k|0}m=Ac(1,272)|0;if(!m){k=-1;l=h;return k|0}n=Ac(1,16)|0;c[m>>2]=n;if(!n){fb(0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0};c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];b=m+4|0;c[b>>2]=e;e=eb(1)|0;n=m+8|0;c[n>>2]=e;if(!e){if(c[m+36>>2]|0)oa(3152,3174,1879,3208);fb(e);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}if(!(c[b>>2]|0))c[b>>2]=1;if((Ga(m,j,0)|0)!=1){if(c[m+36>>2]|0)oa(3152,3174,1879,3208);fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}e=j;if(!((c[e>>2]|0)==440786851&(c[e+4>>2]|0)==0)){if(c[m+36>>2]|0)oa(3152,3174,1879,3208);fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}e=c[b>>2]|0;c[i>>2]=m;wa[e&3](m,1,3224,i);i=Ac(1,12)|0;e=m+36|0;if(i|0){c[i>>2]=c[e>>2];c[i+4>>2]=8;c[i+8>>2]=m;c[e>>2]=i}i=Ha(m,0,f,g)|0;g=c[e>>2]|0;if(g|0){f=g;do{c[e>>2]=c[f>>2];zc(f);f=c[e>>2]|0}while((f|0)!=0)}if((i|0)!=1){fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}i=m+56|0;f=c[i>>2]|0;g=c[i+4>>2]|0;if(c[m+68>>2]|0){if((c[m+64>>2]|0)!=2)oa(3231,3174,725,3254);if(!((f|0)==1&(g|0)==0)){fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}}g=m+116|0;if(d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24){g=m+104|0;f=m+112|0;if((d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24|0)==4)o=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;else oa(3266,3174,751,3291)}else o=3305;if(Qb(o,3314)|0){fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}o=m+136|0;g=c[o>>2]|0;f=c[o+4>>2]|0;if(c[m+148>>2]|0){if((c[m+144>>2]|0)!=2)oa(3231,3174,725,3254);o=Kc(g|0,f|0,-1,-1)|0;f=D;if(f>>>0>0|(f|0)==0&o>>>0>1){fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}}o=c[m+192>>2]|0;if(!o){fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}f=m+216|0;c[f>>2]=0;g=0;i=o;do{g=g+1|0;i=c[i>>2]|0}while((i|0)!=0);c[f>>2]=g;g=c[m>>2]|0;f=sa[c[g+8>>2]&3](c[g+12>>2]|0)|0;g=D;i=m+240|0;c[i>>2]=f;c[i+4>>2]=g;if((g|0)>=0){g=m+16|0;i=c[g+4>>2]|0;f=m+248|0;c[f>>2]=c[g>>2];c[f+4>>2]=i;i=m+24|0;f=c[i+4>>2]|0;g=m+256|0;c[g>>2]=c[i>>2];c[g+4>>2]=f;c[m+264>>2]=c[m+32>>2];c[a>>2]=m;k=0;l=h;return k|0}if(c[e>>2]|0)oa(3152,3174,1879,3208);fb(c[n>>2]|0);zc(c[m>>2]|0);zc(m);k=-1;l=h;return k|0}function Fa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Ga(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0;g=l;l=l+16|0;h=g;i=b+32|0;if(c[i>>2]|0){if(e|0){j=b+16|0;k=c[j+4>>2]|0;m=e;c[m>>2]=c[j>>2];c[m+4>>2]=k}if(!f){n=1;l=g;return n|0}k=b+24|0;m=c[k+4>>2]|0;j=f;c[j>>2]=c[k>>2];c[j+4>>2]=m;n=1;l=g;return n|0}m=c[b>>2]|0;j=b+16|0;k=m+12|0;o=ta[c[m>>2]&7](h,1,c[k>>2]|0)|0;a:do if((o|0)==1){p=a[h>>0]|0;q=p&255;do if(!(q&128)){if(!(q&64))if(!(q&32))if(!(q&16))if(!(q&8)){r=8-(q>>>1&1)+-1|0;if(!(q&4)){s=j;c[s>>2]=p&255;c[s+4>>2]=0;if(!r)break;else t=r}else{u=5;v=10}}else{u=4;v=10}else{u=3;v=10}else{u=2;v=10}else{u=1;v=10}if((v|0)==10){r=j;c[r>>2]=p&255;c[r+4>>2]=0;t=u}do{r=ta[c[m>>2]&7](h,1,c[k>>2]|0)|0;if((r|0)!=1){w=r;break a}r=j;s=Ic(c[r>>2]|0,c[r+4>>2]|0,8)|0;r=j;c[r>>2]=d[h>>0]|0|s;c[r+4>>2]=D;t=t+-1|0}while((t|0)!=0)}else{r=j;c[r>>2]=p&255;c[r+4>>2]=0}while(0);p=c[b>>2]|0;q=b+24|0;r=p+12|0;s=ta[c[p>>2]&7](h,1,c[r>>2]|0)|0;b:do if((s|0)==1){x=d[h>>0]|0;do if(!(x&128)){if(!(x&64))if(!(x&32))if(!(x&16))if(!(x&8)){y=x>>>1&1;z=8-y+-1|0;if(!(x&4)){A=q;c[A>>2]=-2-y&x;c[A+4>>2]=0;if(!z)break;else B=z}else{C=5;E=-5;v=23}}else{C=4;E=-9;v=23}else{C=3;E=-17;v=23}else{C=2;E=-33;v=23}else{C=1;E=-65;v=23}if((v|0)==23){z=q;c[z>>2]=E&x;c[z+4>>2]=0;B=C}do{z=ta[c[p>>2]&7](h,1,c[r>>2]|0)|0;if((z|0)!=1){F=z;break b}z=q;A=Ic(c[z>>2]|0,c[z+4>>2]|0,8)|0;z=q;c[z>>2]=d[h>>0]|0|A;c[z+4>>2]=D;B=B+-1|0}while((B|0)!=0)}else{z=q;c[z>>2]=x&127;c[z+4>>2]=0}while(0);if(e|0){x=j;z=c[x+4>>2]|0;A=e;c[A>>2]=c[x>>2];c[A+4>>2]=z}if(f|0){z=q;A=c[z+4>>2]|0;x=f;c[x>>2]=c[z>>2];c[x+4>>2]=A}c[i>>2]=1;n=1;l=g;return n|0}else F=s;while(0);n=F;l=g;return n|0}else w=o;while(0);n=w;l=g;return n|0}function Ha(b,e,f,i){b=b|0;e=e|0;f=f|0;i=i|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0.0,la=0,ma=0,na=0;k=l;l=l+8336|0;m=k+128|0;n=k+120|0;o=k+112|0;p=k+88|0;q=k+72|0;r=k+64|0;s=k+48|0;t=k+40|0;u=k+24|0;v=k+16|0;w=k+136|0;x=k+8|0;y=k;z=b+36|0;if(!(c[z>>2]|0))oa(3319,3174,997,3333);A=(i|0)>0|(i|0)==0&f>>>0>0;B=b+32|0;C=b+4|0;E=(e|0)==0;F=b+8|0;a:while(1){if(A?(G=c[b>>2]|0,H=sa[c[G+8>>2]&3](c[G+12>>2]|0)|0,G=D,!((G|0)<(i|0)|(G|0)==(i|0)&H>>>0<f>>>0)):0){I=1;J=86;break}H=Ga(b,x,y)|0;if((H|0)!=1){K=H;break}H=x;L=c[H>>2]|0;M=c[H+4>>2]|0;H=c[z>>2]|0;G=c[H+4>>2]|0;N=G+8|0;O=c[N>>2]|0;P=c[N+4>>2]|0;b:do if(!((O|0)==0&(P|0)==0)){N=O;Q=P;R=G;while(1){if((N|0)==(L|0)&(Q|0)==(M|0))break;S=R+48|0;N=c[S>>2]|0;Q=c[S+4>>2]|0;if((N|0)==0&(Q|0)==0)break b;else R=R+40|0}if(R|0){Q=R+24|0;if(c[Q>>2]&2|0){J=12;break a}N=Ga(b,x,y)|0;if((N|0)!=1){K=N;break a}c[B>>2]=0;N=x;if(!((c[N>>2]|0)==(L|0)?(c[N+4>>2]|0)==(M|0):0)){J=18;break a}if(c[Q>>2]&4|0?(N=(c[(c[z>>2]|0)+8>>2]|0)+(c[R+36>>2]|0)|0,S=c[b>>2]|0,T=sa[c[S+8>>2]&3](c[S+12>>2]|0)|0,S=D,U=N,c[U>>2]=T,c[U+4>>2]=S,(S|0)<0):0){K=-1;break a}S=R+16|0;U=c[S>>2]|0;if((U|0)==1){T=c[C>>2]|0;N=R+8|0;V=N;W=c[V>>2]|0;X=c[V+4>>2]|0;V=c[R>>2]|0;if(!(c[Q>>2]&1)){Q=s;c[Q>>2]=W;c[Q+4>>2]=X;c[s+8>>2]=V;wa[T&3](b,1,3487,s);Q=c[C>>2]|0;Y=R+20|0;Z=c[Y>>2]|0;c[r>>2]=(c[(c[z>>2]|0)+8>>2]|0)+Z;c[r+4>>2]=Z;wa[Q&3](b,1,3519,r);Q=c[R+28>>2]|0;Z=c[z>>2]|0;_=c[Z+8>>2]|0;$=c[Y>>2]|0;Y=Ac(1,12)|0;if(!Y){I=1;J=86;break a}c[Y>>2]=Z;c[Y+4>>2]=Q;c[Y+8>>2]=_+$;c[z>>2]=Y;continue a}Y=u;c[Y>>2]=W;c[Y+4>>2]=X;c[u+8>>2]=V;wa[T&3](b,1,3438,u);T=(c[(c[z>>2]|0)+8>>2]|0)+(c[R+20>>2]|0)|0;V=c[F>>2]|0;aa=eb(24)|0;if(!aa){I=1;J=86;break a}cb(aa,V);V=aa;X=V+24|0;do{a[V>>0]=0;V=V+1|0}while((V|0)<(X|0));V=N;X=c[V+4>>2]|0;Y=aa+8|0;c[Y>>2]=c[V>>2];c[Y+4>>2]=X;X=c[R+32>>2]|0;Y=c[F>>2]|0;V=eb(X)|0;if(!V){J=25;break a}cb(V,Y);Gc(V|0,0,X|0)|0;X=aa+16|0;c[X>>2]=V;Y=T+4|0;W=c[Y>>2]|0;if(W|0)c[W>>2]=aa;c[Y>>2]=aa;if(!(c[T>>2]|0))c[T>>2]=aa;Y=c[C>>2]|0;c[t>>2]=V;wa[Y&3](b,1,3469,t);Y=c[R+28>>2]|0;V=c[X>>2]|0;X=Ac(1,12)|0;if(!X){I=1;J=86;break a}c[X>>2]=c[z>>2];c[X+4>>2]=Y;c[X+8>>2]=V;c[z>>2]=X;continue a}X=c[y>>2]|0;V=c[R+20>>2]|0;ba=(c[(c[z>>2]|0)+8>>2]|0)+V|0;Y=ba+12|0;W=c[C>>2]|0;$=c[R>>2]|0;_=R+8|0;Q=c[_>>2]|0;Z=c[_+4>>2]|0;if(c[Y>>2]|0){_=q;c[_>>2]=Q;c[_+4>>2]=Z;c[q+8>>2]=$;wa[W&3](b,1,3542,q);continue a}c[ba+8>>2]=U;_=p;c[_>>2]=Q;c[_+4>>2]=Z;c[p+8>>2]=$;c[p+12>>2]=ba;c[p+16>>2]=V;wa[W&3](b,1,3583,p);c:do switch(c[S>>2]|0){case 2:{W=c[b>>2]|0;V=Kc(X|0,0,-1,-1)|0;$=D;d:do if(!($>>>0>0|($|0)==0&V>>>0>7)){Z=W+12|0;_=ta[c[W>>2]&7](w,1,c[Z>>2]|0)|0;if((_|0)==1){Q=ba;c[Q>>2]=d[w>>0];c[Q+4>>2]=0;if((V|0)==0&($|0)==0)ca=1;else{Q=V;da=$;while(1){ea=ta[c[W>>2]&7](w,1,c[Z>>2]|0)|0;if((ea|0)!=1){ca=ea;break d}ea=ba;fa=Ic(c[ea>>2]|0,c[ea+4>>2]|0,8)|0;ea=ba;c[ea>>2]=d[w>>0]|0|fa;c[ea+4>>2]=D;Q=Kc(Q|0,da|0,-1,-1)|0;da=D;if((Q|0)==0&(da|0)==0){ca=1;break}}}}else ca=_}else ca=-1;while(0);ga=ca;J=61;break}case 3:{W=c[b>>2]|0;switch(X|0){case 4:case 8:break;default:{K=-1;break a}}$=Kc(X|0,0,-1,-1)|0;V=D;e:do if(!(V>>>0>0|(V|0)==0&$>>>0>7)){da=W+12|0;Q=ta[c[W>>2]&7](w,1,c[da>>2]|0)|0;if((Q|0)==1){Z=d[w>>0]|0;ea=$;fa=V;ha=0;do{ia=ta[c[W>>2]&7](w,1,c[da>>2]|0)|0;if((ia|0)!=1){ja=ia;break e}ia=Z;Z=d[w>>0]|0|Z<<8;ha=Hc(ia|0,ha|0,24)|0;ea=Kc(ea|0,fa|0,-1,-1)|0;fa=D}while(!((ea|0)==0&(fa|0)==0));ka=(c[j>>2]=Z,+g[j>>2]);c[j>>2]=Z;c[j+4>>2]=ha;h[ba>>3]=(X|0)==4?ka:+h[j>>3];J=62;break c}else ja=Q}else ja=-1;while(0);la=ja;J=63;break}case 4:{if(X>>>0>1048576){K=-1;break a}W=X+1|0;V=c[F>>2]|0;$=eb(W)|0;if(!$){K=-1;break a}cb($,V);Gc($|0,0,W|0)|0;if(X|0?(W=c[b>>2]|0,V=ta[c[W>>2]&7]($,X,c[W+12>>2]|0)|0,(V|0)!=1):0){la=V;J=63;break c}a[$+X>>0]=0;c[ba>>2]=$;J=62;break}case 5:{$=Kc(X|0,0,-1,-1)|0;V=D;if(V>>>0>0|(V|0)==0&$>>>0>16777215){K=-1;break a}$=c[F>>2]|0;V=eb(X)|0;if(!V){J=58;break a}cb(V,$);Gc(V|0,0,X|0)|0;c[ba>>2]=V;c[ba+4>>2]=X;$=c[b>>2]|0;ga=ta[c[$>>2]&7](V,X,c[$+12>>2]|0)|0;J=61;break}default:{J=60;break a}}while(0);if((J|0)==61){J=0;if((ga|0)==1)J=62;else{la=ga;J=63}}if((J|0)==62){J=0;c[Y>>2]=1;continue a}else if((J|0)==63){J=0;if((la|0)<0){K=la;break a}else continue a}}}while(0);G=c[H>>2]|0;f:do if(G|0){P=G;g:while(1){O=c[P+4>>2]|0;X=O+8|0;S=c[X>>2]|0;U=c[X+4>>2]|0;if(!((S|0)==0&(U|0)==0)){X=S;S=U;U=O;while(1){if((X|0)==(L|0)&(S|0)==(M|0))break g;O=U+48|0;X=c[O>>2]|0;S=c[O+4>>2]|0;if((X|0)==0&(S|0)==0)break;else U=U+40|0}}P=c[P>>2]|0;if(!P)break f}P=c[C>>2]|0;Y=o;c[Y>>2]=L;c[Y+4>>2]=M;wa[P&3](b,1,3629,o);P=c[z>>2]|0;if(!E?(c[P+4>>2]|0)==(e|0):0){J=71;break a}c[z>>2]=c[P>>2];zc(P);continue a}while(0);G=Ga(b,x,y)|0;if((G|0)!=1){K=G;break}c[B>>2]=0;G=x;H=c[G>>2]|0;P=c[G+4>>2]|0;switch(H|0){case 191:{if(P|0)J=77;break}case 236:{if(P|0)J=77;break}default:J=77}if((J|0)==77){J=0;G=c[C>>2]|0;Y=m;c[Y>>2]=H;c[Y+4>>2]=P;wa[G&3](b,1,3691,m)}G=c[b>>2]|0;P=c[y>>2]|0;if(P|0){Y=G+12|0;H=P;do{P=H>>>0<8192?H:8192;ma=ta[c[G>>2]&7](w,P,c[Y>>2]|0)|0;H=H-P|0;if((ma|0)!=1){J=83;break a}}while((H|0)!=0)}}if((J|0)==12){w=R+8|0;if(!((c[w>>2]|0)==524531317&(c[w+4>>2]|0)==0))oa(3342,3174,1013,3333);if((c[R+16>>2]|0)!=1)oa(3342,3174,1013,3333);R=c[C>>2]|0;w=v;c[w>>2]=L;c[w+4>>2]=M;wa[R&3](b,1,3400,v);I=1;l=k;return I|0}else if((J|0)==18)oa(3422,3174,1022,3333);else if((J|0)==25){c[aa+16>>2]=0;I=1;l=k;return I|0}else if((J|0)==58){c[ba>>2]=0;K=-1}else if((J|0)==60)oa(3612,3174,979,3614);else if((J|0)==71){wa[c[C>>2]&3](b,1,3649,n);I=1;l=k;return I|0}else if((J|0)==83)K=ma;else if((J|0)==86){l=k;return I|0}J=c[z>>2]|0;if(!J){I=K;l=k;return I|0}else na=J;do{c[z>>2]=c[na>>2];zc(na);na=c[z>>2]|0}while((na|0)!=0);I=K;l=k;return I|0}function Ia(b,e){b=b|0;e=e|0;var f=0,g=0.0,i=0,k=0,l=0,m=0.0;f=b+176|0;a[j>>0]=a[f>>0];a[j+1>>0]=a[f+1>>0];a[j+2>>0]=a[f+2>>0];a[j+3>>0]=a[f+3>>0];a[j+4>>0]=a[f+4>>0];a[j+5>>0]=a[f+5>>0];a[j+6>>0]=a[f+6>>0];a[j+7>>0]=a[f+7>>0];g=+h[j>>3];f=b+188|0;if(!(d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24)){i=-1;return i|0}f=b+184|0;if((d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24|0)!=3)oa(4548,3174,738,4572);if(c[b+172>>2]|0){f=b+160|0;if((c[b+168>>2]|0)==2){k=c[f>>2]|0;l=c[f+4>>2]|0}else oa(3231,3174,725,3254)}else{k=1e6;l=0}if(g<0.0){i=-1;return i|0}f=Nc(-1,-1,k|0,l|0)|0;if(g>+(f>>>0)+4294967296.0*+(D>>>0)){i=-1;return i|0}m=g*(+(k>>>0)+4294967296.0*+(l>>>0));l=+F(m)>=1.0?(m>0.0?~~+T(+E(m/4294967296.0),4294967295.0)>>>0:~~+R((m-+(~~m>>>0))/4294967296.0)>>>0):0;k=e;c[k>>2]=~~m>>>0;c[k+4>>2]=l;i=0;return i|0}function Ja(a,b){a=a|0;b=b|0;c[b>>2]=c[a+216>>2];return 0}function Ka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=l;l=l+16|0;f=e+8|0;g=e;h=a+152|0;i=a+200|0;if(!(c[i>>2]|0)){j=La(c[h>>2]|0)|0;if(!j){k=-1;l=e;return k|0}m=j+16|0;n=c[m>>2]|0;o=c[m+4>>2]|0;if(!(c[j+28>>2]|0)){k=-1;l=e;return k|0}if((c[j+24>>2]|0)!=2)oa(3231,3174,725,3254);j=c[a>>2]|0;m=sa[c[j+8>>2]&3](c[j+12>>2]|0)|0;j=D;if((j|0)<0){k=-1;l=e;return k|0}p=a+16|0;q=p;r=c[q>>2]|0;s=c[q+4>>2]|0;q=a+24|0;t=q;u=c[t>>2]|0;v=c[t+4>>2]|0;t=a+32|0;w=c[t>>2]|0;x=c[a>>2]|0;y=a+208|0;z=Kc(c[y>>2]|0,c[y+4>>2]|0,n|0,o|0)|0;if(va[c[x+4>>2]&1](z,D,0,c[x+12>>2]|0)|0){k=-1;l=e;return k|0}c[t>>2]=0;if((Ga(a,g,0)|0)!=1){k=-1;l=e;return k|0}c[t>>2]=0;x=g;if(!((c[x>>2]|0)==475249515&(c[x+4>>2]|0)==0)){k=-1;l=e;return k|0}x=a+36|0;g=c[x>>2]|0;if(g|0)oa(3152,3174,1631,4641);z=Ac(1,12)|0;if(!z){k=-1;l=e;return k|0}c[z>>2]=g;c[z+4>>2]=8;c[z+8>>2]=a;c[x>>2]=z;g=Ac(1,12)|0;if(!g){k=-1;l=e;return k|0}c[g>>2]=z;c[g+4>>2]=448;c[g+8>>2]=h;c[x>>2]=g;h=Ac(1,12)|0;if(!h){k=-1;l=e;return k|0}c[h>>2]=g;c[h+4>>2]=968;c[h+8>>2]=i;c[x>>2]=h;wa[c[a+4>>2]&3](a,1,4660,f);f=Ha(a,968,b,d)|0;d=c[x>>2]|0;if(d|0){b=d;do{c[x>>2]=c[b>>2];zc(b);b=c[x>>2]|0}while((b|0)!=0)}b=c[a>>2]|0;if(va[c[b+4>>2]&1](m,j,0,c[b+12>>2]|0)|0){k=-1;l=e;return k|0}b=p;c[b>>2]=r;c[b+4>>2]=s;s=q;c[s>>2]=u;c[s+4>>2]=v;c[t>>2]=w;if((f|0)<0){k=-1;l=e;return k|0}if(!(c[i>>2]|0)){k=-1;l=e;return k|0}}k=0;l=e;return k|0}function La(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!a){b=0;return b|0}else e=a;a:while(1){a=e+8|0;if(!((c[a>>2]|0)==290298740&(c[a+4>>2]|0)==0)){f=3;break}a=c[c[e+16>>2]>>2]|0;if(a|0){g=a;do{a=g+8|0;if(!((c[a>>2]|0)==19899&(c[a+4>>2]|0)==0)){f=6;break a}a=c[g+16>>2]|0;h=c[a>>2]|0;i=c[a+4>>2]|0;if(c[a+12>>2]|0){if((c[a+8>>2]|0)!=5){f=9;break a}if(i|0){j=0;k=0;l=i;i=h;while(1){l=l+-1|0;h=Ic(j|0,k|0,8)|0;k=D;j=d[i>>0]|0|h;if(!l)break;else i=i+1|0}if((j|0)==475249515&(k|0)==0){b=a;f=15;break a}}}g=c[g>>2]|0}while((g|0)!=0)}e=c[e>>2]|0;if(!e){b=0;f=15;break}}if((f|0)==3)oa(4687,3174,1516,4717);else if((f|0)==6)oa(4737,3174,1521,4717);else if((f|0)==9)oa(4757,3174,764,4782);else if((f|0)==15)return b|0;return 0}function Ma(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;f=a+200|0;if((c[f>>2]|0)==0?Ka(a,-1,-1)|0:0){g=-1;return g|0}if(c[a+172>>2]|0){h=a+160|0;if((c[a+168>>2]|0)==2){i=c[h>>2]|0;j=c[h+4>>2]|0}else oa(3231,3174,725,3254)}else{i=1e6;j=0}h=c[f>>2]|0;if(!h){g=-1;return g|0}f=a+192|0;k=h;h=0;a:while(1){l=k+8|0;if(!((c[l>>2]|0)==187&(c[l+4>>2]|0)==0)){m=9;break}l=c[k+16>>2]|0;n=(h|0)==0?l:h;o=l;p=c[o>>2]|0;q=c[o+4>>2]|0;if(c[l+12>>2]|0){if((c[l+8>>2]|0)!=2){m=12;break}o=Pc(p|0,q|0,i|0,j|0)|0;q=D;if(q>>>0>e>>>0|(q|0)==(e|0)&o>>>0>d>>>0){r=n;m=33;break}}o=c[l+16>>2]|0;b:do if(!o)s=0;else{q=o;while(1){p=q+8|0;if(!((c[p>>2]|0)==183&(c[p+4>>2]|0)==0)){m=16;break a}p=c[q+16>>2]|0;t=c[p>>2]|0;if(!(c[p+12>>2]|0)){s=0;break b}if((c[p+8>>2]|0)!=2){m=19;break a}if(!t){s=0;break b}u=c[f>>2]|0;if(!u){s=0;break b}v=u;u=0;while(1){w=v+8|0;if(!((c[w>>2]|0)==174&(c[w+4>>2]|0)==0)){m=24;break a}w=c[v+16>>2]|0;x=w;if(!(c[w+12>>2]|0)){s=0;break b}if((c[w+8>>2]|0)!=2){m=27;break a}if((c[x+4>>2]|0)==0?(c[x>>2]|0)==(t|0):0)break;v=c[v>>2]|0;if(!v){s=0;break b}else u=u+1|0}if((u|0)==(b|0)){s=p;break b}q=c[q>>2]|0;if(!q){s=0;break}}}while(0);o=(s|0)==0?n:l;k=c[k>>2]|0;if(!k){r=o;m=33;break}else h=o}if((m|0)==9)oa(4816,3174,1569,4846);else if((m|0)==12)oa(3231,3174,725,3254);else if((m|0)==16)oa(4875,3174,1545,4910);else if((m|0)==19)oa(3231,3174,725,3254);else if((m|0)==24)oa(4585,3174,1187,4612);else if((m|0)==27)oa(3231,3174,725,3254);else if((m|0)==33){if(!r){g=-1;return g|0}h=c[r+16>>2]|0;if(!h){g=-1;return g|0}else y=h;c:while(1){h=y+8|0;if(!((c[h>>2]|0)==183&(c[h+4>>2]|0)==0)){m=36;break}z=c[y+16>>2]|0;h=c[z>>2]|0;if(!(c[z+12>>2]|0)){g=-1;m=60;break}if((c[z+8>>2]|0)!=2){m=39;break}if(!h){g=-1;m=60;break}r=c[f>>2]|0;if(!r){g=-1;m=60;break}k=r;r=0;while(1){s=k+8|0;if(!((c[s>>2]|0)==174&(c[s+4>>2]|0)==0)){m=44;break c}s=c[k+16>>2]|0;d=s;if(!(c[s+12>>2]|0)){g=-1;m=60;break c}if((c[s+8>>2]|0)!=2){m=47;break c}if((c[d+4>>2]|0)==0?(c[d>>2]|0)==(h|0):0)break;k=c[k>>2]|0;if(!k){g=-1;m=60;break c}else r=r+1|0}if((r|0)==(b|0)){m=52;break}y=c[y>>2]|0;if(!y){g=-1;m=60;break}}if((m|0)==36)oa(4875,3174,1545,4910);else if((m|0)==39)oa(3231,3174,725,3254);else if((m|0)==44)oa(4585,3174,1187,4612);else if((m|0)==47)oa(3231,3174,725,3254);else if((m|0)==52){if(!z){g=-1;return g|0}y=z+16|0;b=c[y>>2]|0;f=c[y+4>>2]|0;if(!(c[z+28>>2]|0)){g=-1;return g|0}if((c[z+24>>2]|0)!=2)oa(3231,3174,725,3254);z=a+208|0;y=Kc(c[z>>2]|0,c[z+4>>2]|0,b|0,f|0)|0;f=D;if((f|0)<0){g=-1;return g|0}b=c[a>>2]|0;if(va[c[b+4>>2]&1](y,f,0,c[b+12>>2]|0)|0){g=-1;return g|0}c[a+32>>2]=0;if(!(c[a+36>>2]|0)){g=0;return g|0}else oa(3152,3174,2002,4796)}else if((m|0)==60)return g|0}return 0}function Na(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[a+192>>2]|0;if(!d)return -1;else{e=d;f=0}while(1){d=e+8|0;if(!((c[d>>2]|0)==174&(c[d+4>>2]|0)==0)){g=3;break}if((f|0)==(b|0)){g=6;break}d=c[e>>2]|0;if(!d){g=11;break}else{e=d;f=f+1|0}}if((g|0)==3)oa(4585,3174,1208,4941);else if((g|0)==6){f=c[e+16>>2]|0;if(!f)return -1;e=c[f+32>>2]|0;if(!(c[f+44>>2]|0))return -1;if((c[f+40>>2]|0)==2)return ((e&1|0)==0&0==0?((e&2|0)==0&0==0?2147483647:1):0)|0;else oa(3231,3174,725,3254)}else if((g|0)==11)return -1;return 0}function Oa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0;e=c[a+192>>2]|0;if(!e){f=-1;return f|0}else{g=e;h=0}while(1){e=g+8|0;if(!((c[e>>2]|0)==174&(c[e+4>>2]|0)==0)){i=3;break}if((h|0)==(b|0)){i=6;break}e=c[g>>2]|0;if(!e){f=-1;i=14;break}else{g=e;h=h+1|0}}if((i|0)==3)oa(4585,3174,1208,4941);else if((i|0)==6){h=c[g+16>>2]|0;if(!h){f=-1;return f|0}g=h+128|0;b=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;g=h+140|0;if(!(d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24)){f=-1;return f|0}g=h+136|0;if((d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24|0)!=4)oa(3266,3174,751,3291);if(!(Qb(b,4961)|0)){f=0;return f|0}if(!(Qb(b,4967)|0)){f=2;return f|0}if(!(Qb(b,4973)|0)){f=1;return f|0}g=(Qb(b,4982)|0)==0;f=g?3:2147483647;return f|0}else if((i|0)==14)return f|0;return 0}function Pa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;c[e>>2]=0;f=c[a+192>>2]|0;if(!f){g=-1;return g|0}else{h=f;i=0}while(1){f=h+8|0;if(!((c[f>>2]|0)==174&(c[f+4>>2]|0)==0)){j=3;break}if((i|0)==(b|0)){j=6;break}f=c[h>>2]|0;if(!f){g=-1;j=14;break}else{h=f;i=i+1|0}}if((j|0)==3)oa(4585,3174,1208,4941);else if((j|0)==6){i=c[h+16>>2]|0;if(!i){g=-1;return g|0}switch(Oa(a,b)|0){case 3:{c[e>>2]=1;g=0;return g|0}case 1:{b=c[i+144>>2]|0;a=c[i+148>>2]|0;if(!(c[i+156>>2]|0)){g=-1;return g|0}if((c[i+152>>2]|0)!=5)oa(4757,3174,764,4782);if(!a){g=-1;return g|0}a=(d[b>>0]|0)+1|0;c[e>>2]=a;g=(a>>>0>3)<<31>>31;return g|0}default:{g=-1;return g|0}}}else if((j|0)==14)return g|0;return 0}function Qa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;h=l;l=l+32|0;i=h;c[f>>2]=0;c[g>>2]=0;j=c[b+192>>2]|0;if(!j){k=-1;l=h;return k|0}else{m=j;n=0}while(1){j=m+8|0;if(!((c[j>>2]|0)==174&(c[j+4>>2]|0)==0)){o=3;break}if((n|0)==(d|0)){o=6;break}j=c[m>>2]|0;if(!j){k=-1;o=27;break}else{m=j;n=n+1|0}}if((o|0)==3)oa(4585,3174,1208,4941);else if((o|0)==6){n=c[m+16>>2]|0;if(!n){k=-1;l=h;return k|0}if((Oa(b,d)|0)!=1?(Oa(b,d)|0)!=3:0){k=-1;l=h;return k|0}m=c[n+144>>2]|0;j=c[n+148>>2]|0;if(!(c[n+156>>2]|0)){k=-1;l=h;return k|0}if((c[n+152>>2]|0)!=5)oa(4757,3174,764,4782);do if((Oa(b,d)|0)!=1)if(!e){c[f>>2]=m;p=j;break}else{k=-1;l=h;return k|0}else{n=m;if(!j){k=-1;l=h;return k|0}q=n+1|0;r=a[n>>0]|0;n=r&255;s=n+1|0;t=Kc(j|0,0,-1,-1)|0;u=D;if(!(s>>>0<4&s>>>0>e>>>0)){k=-1;l=h;return k|0}a:do if(r<<24>>24){s=0;v=0;w=t;x=u;y=0;z=q;b:while(1){A=w;B=x;C=0;E=0;F=z;do{G=Fc(A|0,B|0,s|0,v|0)|0;H=D;if(!(H>>>0>C>>>0|(H|0)==(C|0)&G>>>0>E>>>0)){k=-1;o=27;break b}G=a[F>>0]|0;E=Kc(G&255|0,0,E|0,C|0)|0;C=D;A=Kc(A|0,B|0,-1,-1)|0;B=D;F=F+1|0}while(G<<24>>24==-1);G=Fc(A|0,B|0,s|0,v|0)|0;H=D;if(H>>>0<C>>>0|(H|0)==(C|0)&G>>>0<E>>>0){k=-1;o=27;break}G=i+(y<<3)|0;c[G>>2]=E;c[G+4>>2]=C;G=Kc(E|0,C|0,s|0,v|0)|0;H=D;I=y+1|0;if(I>>>0<n>>>0){s=G;v=H;w=A;x=B;y=I;z=F}else{J=A;K=B;L=G;M=H;N=I;O=F;break a}}if((o|0)==27){l=h;return k|0}}else{J=t;K=u;L=0;M=0;N=0;O=q}while(0);q=Fc(J|0,K|0,L|0,M|0)|0;u=i+(N<<3)|0;c[u>>2]=q;c[u+4>>2]=D;if(!e)P=O;else{u=0;q=O;while(1){t=q+(c[i+(u<<3)>>2]|0)|0;u=u+1|0;if((u|0)==(e|0)){P=t;break}else q=t}}c[f>>2]=P;p=c[i+(e<<3)>>2]|0}while(0);c[g>>2]=p;k=0;l=h;return k|0}else if((o|0)==27){l=h;return k|0}return 0}function Ra(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=d;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));e=c[a+192>>2]|0;if(!e){g=-1;return g|0}else{h=e;i=0}while(1){a=h+8|0;if(!((c[a>>2]|0)==174&(c[a+4>>2]|0)==0)){j=3;break}if((i|0)==(b|0)){j=6;break}a=c[h>>2]|0;if(!a){g=-1;j=54;break}else{h=a;i=i+1|0}}if((j|0)==3)oa(4585,3174,1208,4941);else if((j|0)==6){i=c[h+16>>2]|0;if(!i){g=-1;return g|0}else{k=e;l=0}while(1){e=k+8|0;if(!((c[e>>2]|0)==174&(c[e+4>>2]|0)==0)){j=8;break}if((l|0)==(b|0)){j=11;break}e=c[k>>2]|0;if(!e){g=-1;j=54;break}else{k=e;l=l+1|0}}if((j|0)==8)oa(4585,3174,1208,4941);else if((j|0)==11){l=c[k+16>>2]|0;if(!l){g=-1;return g|0}k=c[l+32>>2]|0;if(!(c[l+44>>2]|0)){g=-1;return g|0}if((c[l+40>>2]|0)!=2)oa(3231,3174,725,3254);if((k&1|0)==0&0==0){g=-1;return g|0}k=i+208|0;l=c[k>>2]|0;b=c[k+4>>2]|0;a:do if(!(c[i+220>>2]|0)){m=0;j=25}else{if((c[i+216>>2]|0)!=2)oa(3231,3174,725,3254);switch(l|0){case 0:{if(!b){m=l;j=25;break a}else break a;break}case 1:{if(!b){m=l;j=25;break a}else break a;break}case 2:{if(!b){m=l;j=25;break a}else break a;break}case 3:{if(!b){m=l;j=25;break a}else break a;break}case 11:{if(!b){m=l;j=25;break a}else break a;break}default:break a}}while(0);if((j|0)==25)c[d>>2]=m;if(c[i+236>>2]|0)if((c[i+232>>2]|0)==2)n=c[i+224>>2]|0;else oa(3231,3174,725,3254);else n=0;c[d+36>>2]=n;n=c[i+240>>2]|0;if(!(c[i+252>>2]|0)){g=-1;return g|0}if((c[i+248>>2]|0)!=2)oa(3231,3174,725,3254);c[d+4>>2]=n;m=c[i+256>>2]|0;if(!(c[i+268>>2]|0)){g=-1;return g|0}if((c[i+264>>2]|0)!=2)oa(3231,3174,725,3254);c[d+8>>2]=m;if(c[i+284>>2]|0)if((c[i+280>>2]|0)==2)o=c[i+272>>2]|0;else oa(3231,3174,725,3254);else o=0;c[d+20>>2]=o;if(c[i+300>>2]|0)if((c[i+296>>2]|0)==2)p=c[i+288>>2]|0;else oa(3231,3174,725,3254);else p=0;c[d+24>>2]=p;if(c[i+316>>2]|0)if((c[i+312>>2]|0)==2)q=c[i+304>>2]|0;else oa(3231,3174,725,3254);else q=0;c[d+28>>2]=q;if(c[i+332>>2]|0)if((c[i+328>>2]|0)==2)r=c[i+320>>2]|0;else oa(3231,3174,725,3254);else r=0;c[d+32>>2]=r;do if(!(c[i+348>>2]|0))s=n;else{if((c[i+344>>2]|0)==2){s=c[i+336>>2]|0;break}oa(3231,3174,725,3254)}while(0);c[d+12>>2]=s;do if(!(c[i+364>>2]|0))t=m;else{if((c[i+360>>2]|0)==2){t=c[i+352>>2]|0;break}oa(3231,3174,725,3254)}while(0);c[d+16>>2]=t;g=0;return g|0}else if((j|0)==54)return g|0}else if((j|0)==54)return g|0;return 0}function Sa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;g=c[b+192>>2]|0;if(!g){i=-1;return i|0}else{k=g;l=0}while(1){b=k+8|0;if(!((c[b>>2]|0)==174&(c[b+4>>2]|0)==0)){m=3;break}if((l|0)==(e|0)){m=6;break}b=c[k>>2]|0;if(!b){i=-1;m=33;break}else{k=b;l=l+1|0}}if((m|0)==3)oa(4585,3174,1208,4941);else if((m|0)==6){l=c[k+16>>2]|0;if(!l){i=-1;return i|0}else{n=g;o=0}while(1){g=n+8|0;if(!((c[g>>2]|0)==174&(c[g+4>>2]|0)==0)){m=8;break}if((o|0)==(e|0)){m=11;break}g=c[n>>2]|0;if(!g){i=-1;m=33;break}else{n=g;o=o+1|0}}if((m|0)==8)oa(4585,3174,1208,4941);else if((m|0)==11){o=c[n+16>>2]|0;if(!o){i=-1;return i|0}n=c[o+32>>2]|0;if(!(c[o+44>>2]|0)){i=-1;return i|0}if((c[o+40>>2]|0)!=2)oa(3231,3174,725,3254);if(!((n&3|0)==2&0==0)){i=-1;return i|0}h[f>>3]=8.0e3;n=l+368|0;a[j>>0]=a[n>>0];a[j+1>>0]=a[n+1>>0];a[j+2>>0]=a[n+2>>0];a[j+3>>0]=a[n+3>>0];a[j+4>>0]=a[n+4>>0];a[j+5>>0]=a[n+5>>0];a[j+6>>0]=a[n+6>>0];a[j+7>>0]=a[n+7>>0];p=+h[j>>3];n=l+380|0;do if(d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24|0){o=l+376|0;if((d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24|0)==3){h[f>>3]=p;break}else oa(4548,3174,738,4572)}while(0);if(c[l+396>>2]|0)if((c[l+392>>2]|0)==2)q=c[l+384>>2]|0;else oa(3231,3174,725,3254);else q=1;c[f+8>>2]=q;if(c[l+412>>2]|0)if((c[l+408>>2]|0)==2)r=c[l+400>>2]|0;else oa(3231,3174,725,3254);else r=16;c[f+12>>2]=r;if(c[l+172>>2]|0){r=l+160|0;if((c[l+168>>2]|0)==2){s=c[r>>2]|0;t=c[r+4>>2]|0}else oa(3231,3174,725,3254)}else{s=0;t=0}r=f+16|0;c[r>>2]=s;c[r+4>>2]=t;if(c[l+188>>2]|0){t=l+176|0;if((c[l+184>>2]|0)==2){u=c[t>>2]|0;v=c[t+4>>2]|0}else oa(3231,3174,725,3254)}else{u=0;v=0}t=f+24|0;c[t>>2]=u;c[t+4>>2]=v;i=0;return i|0}else if((m|0)==33)return i|0}else if((m|0)==33)return i|0;return 0}function Ta(a){a=a|0;var b=0,d=0,e=0,f=0;if(c[a+36>>2]|0)oa(3152,3174,2325,4989);b=a+240|0;d=c[b+4>>2]|0;if((d|0)<0){e=-1;return e|0}f=c[a>>2]|0;if(va[c[f+4>>2]&1](c[b>>2]|0,d,0,c[f+12>>2]|0)|0){e=-1;return e|0}f=a+248|0;d=c[f+4>>2]|0;b=a+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=d;d=a+256|0;b=c[d+4>>2]|0;f=a+24|0;c[f>>2]=c[d>>2];c[f+4>>2]=b;c[a+32>>2]=c[a+264>>2];e=0;return e|0}function Ua(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,pa=0,qa=0,ra=0,ua=0,va=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0;f=l;l=l+8288|0;g=f+80|0;h=f+72|0;i=f+64|0;j=f+56|0;k=f+48|0;m=f+40|0;n=f+32|0;o=f+88|0;p=f+24|0;q=f+16|0;r=f+8|0;s=f;c[e>>2]=0;if(c[b+36>>2]|0)oa(3152,3174,2337,5008);t=c[b>>2]|0;u=sa[c[t+8>>2]&3](c[t+12>>2]|0)|0;t=D;v=b+240|0;c[v>>2]=u;c[v+4>>2]=t;if((t|0)<0){w=-1;l=f;return w|0}t=b+16|0;v=c[t+4>>2]|0;u=b+248|0;c[u>>2]=c[t>>2];c[u+4>>2]=v;v=b+24|0;u=c[v+4>>2]|0;t=b+256|0;c[t>>2]=c[v>>2];c[t+4>>2]=u;u=b+32|0;c[b+264>>2]=c[u>>2];t=b+4|0;v=b+224|0;x=b+232|0;y=b+172|0;z=b+168|0;A=b+160|0;a:while(1){B=Ga(b,r,s)|0;if((B|0)!=1){w=B;C=136;break}b:while(1){c[u>>2]=0;B=r;E=c[B>>2]|0;F=c[B+4>>2]|0;c:do if((E|0)<163){switch(E|0){case 160:break;default:{C=18;break c}}if(!F)break b;else C=18}else{if((E|0)<524531317){switch(E|0){case 163:break;default:{C=18;break c}}if(!F){C=25;break a}else{C=18;break}}switch(E|0){case 524531317:break;default:{C=18;break c}}if(!F){B=Ga(b,r,s)|0;if((B|0)!=1){w=B;C=136;break a}c[u>>2]=0;B=r;if(!((c[B>>2]|0)==231&(c[B+4>>2]|0)==0)){w=-1;C=136;break a}B=c[b>>2]|0;G=s;H=Kc(c[G>>2]|0,c[G+4>>2]|0,-1,-1)|0;G=D;if(G>>>0>0|(G|0)==0&H>>>0>7){I=-1;C=24;break a}J=B+12|0;K=ta[c[B>>2]&7](o,1,c[J>>2]|0)|0;if((K|0)!=1){I=K;C=24;break a}K=v;c[K>>2]=d[o>>0];c[K+4>>2]=0;if(!((H|0)==0&(G|0)==0)){K=H;H=G;do{G=ta[c[B>>2]&7](o,1,c[J>>2]|0)|0;if((G|0)!=1){I=G;C=24;break a}G=v;L=Ic(c[G>>2]|0,c[G+4>>2]|0,8)|0;G=v;c[G>>2]=d[o>>0]|0|L;c[G+4>>2]=D;K=Kc(K|0,H|0,-1,-1)|0;H=D}while(!((K|0)==0&(H|0)==0))}c[x>>2]=1}else C=18}while(0);if((C|0)==18?(C=0,H=c[t>>2]|0,K=n,c[K>>2]=E,c[K+4>>2]=F,wa[H&3](b,1,5028,n),H=c[b>>2]|0,K=c[s>>2]|0,K|0):0){J=H+12|0;B=K;do{K=B>>>0<8192?B:8192;M=ta[c[H>>2]&7](o,K,c[J>>2]|0)|0;B=B-K|0;if((M|0)!=1){C=135;break a}}while((B|0)!=0)}B=Ga(b,r,s)|0;if((B|0)!=1){w=B;C=136;break a}}B=c[b>>2]|0;J=sa[c[B+8>>2]&3](c[B+12>>2]|0)|0;B=s;H=Kc(c[B>>2]|0,c[B+4>>2]|0,J|0,D|0)|0;J=D;B=0;F=0;E=0;K=0;G=0;L=0;N=0;O=0;P=0;Q=0;R=0;d:while(1){S=E;T=K;U=G;V=L;W=N;X=O;Y=Q;Z=R;e:while(1){_=U;$=V;aa=W;ba=X;ca=Z;f:while(1){da=aa;ea=ba;g:while(1){fa=ea;h:while(1){ga=c[b>>2]|0;ha=sa[c[ga+8>>2]&3](c[ga+12>>2]|0)|0;ga=D;if(!((ga|0)<(J|0)|(ga|0)==(J|0)&ha>>>0<H>>>0))break d;i:while(1){ha=Ga(b,r,s)|0;if((ha|0)!=1){w=ha;C=136;break a}c[u>>2]=0;ha=r;ga=c[ha>>2]|0;ia=c[ha+4>>2]|0;j:do if((ga|0)>=236)if((ga|0)<30113)switch(ga|0){case 236:{if(!ia)break j;else{C=121;break j}break}case 251:{if(!ia)break g;else{C=121;break j}break}default:{C=121;break j}}else switch(ga|0){case 30113:{if(!ia)break h;else{C=121;break j}break}case 30114:{if(!ia)break f;else{C=121;break j}break}default:{C=121;break j}}else switch(ga|0){case 155:{if(!ia)break e;else{C=121;break j}break}case 161:{if(!ia)break i;else{C=121;break j}break}case 191:{if(!ia)break j;else{C=121;break j}break}default:{C=121;break j}}while(0);if((C|0)==121){C=0;ha=c[t>>2]|0;ja=g;c[ja>>2]=ga;c[ja+4>>2]=ia;wa[ha&3](b,1,5255,g)}ha=c[b>>2]|0;ja=c[s>>2]|0;if(!ja)ka=ha;else{la=ha+12|0;ma=ja;do{ja=ma>>>0<8192?ma:8192;na=ta[c[ha>>2]&7](o,ja,c[la>>2]|0)|0;ma=ma-ja|0;if((na|0)!=1){C=128;break a}}while((ma|0)!=0);ka=c[b>>2]|0}ma=sa[c[ka+8>>2]&3](c[ka+12>>2]|0)|0;la=D;if(!((la|0)<(J|0)|(la|0)==(J|0)&ma>>>0<H>>>0))break d}ma=s;la=Va(b,161,0,c[ma>>2]|0,c[ma+4>>2]|0,e)|0;if((la|0)==1)fa=1;else{w=la;C=136;break a}}if(da|0){w=-1;C=136;break a}la=s;ma=c[la>>2]|0;ha=c[la+4>>2]|0;la=c[b>>2]|0;ia=sa[c[la+8>>2]&3](c[la+12>>2]|0)|0;la=Kc(ia|0,D|0,ma|0,ha|0)|0;ha=D;ma=c[b>>2]|0;ia=sa[c[ma+8>>2]&3](c[ma+12>>2]|0)|0;ma=D;k:do if((ma|0)<(ha|0)|(ma|0)==(ha|0)&ia>>>0<la>>>0){ga=0;ja=0;while(1){l:while(1){pa=Ga(b,p,q)|0;if((pa|0)!=1){qa=pa;break a}c[u>>2]=0;pa=p;ra=c[pa>>2]|0;ua=c[pa+4>>2]|0;switch(ra|0){case 166:{if(!ua)break l;else C=68;break}case 191:{if(ua|0)C=68;break}case 236:{if(ua|0)C=68;break}default:C=68}if((C|0)==68){C=0;pa=c[t>>2]|0;va=m;c[va>>2]=ra;c[va+4>>2]=ua;wa[pa&3](b,1,5062,m)}pa=c[b>>2]|0;ua=c[q>>2]|0;if(!ua)xa=pa;else{va=pa+12|0;ra=ua;do{ua=ra>>>0<8192?ra:8192;ya=ta[c[pa>>2]&7](o,ua,c[va>>2]|0)|0;ra=ra-ua|0;if((ya|0)!=1){C=75;break a}}while((ra|0)!=0);xa=c[b>>2]|0}ra=sa[c[xa+8>>2]&3](c[xa+12>>2]|0)|0;va=D;if(!((va|0)<(ha|0)|(va|0)==(ha|0)&ra>>>0<la>>>0)){za=ga;break k}}ra=c[b>>2]|0;va=sa[c[ra+8>>2]&3](c[ra+12>>2]|0)|0;ra=q;pa=Kc(c[ra>>2]|0,c[ra+4>>2]|0,va|0,D|0)|0;va=D;ra=1;ua=0;Aa=ja;Ba=0;m:while(1){Ca=ua;Da=Aa;Ea=Ba;n:while(1){Fa=Da;Ha=Ea;while(1){Ia=c[b>>2]|0;Ja=sa[c[Ia+8>>2]&3](c[Ia+12>>2]|0)|0;Ia=D;if(!((Ia|0)<(va|0)|(Ia|0)==(va|0)&Ja>>>0<pa>>>0))break m;o:while(1){Ka=Ga(b,p,q)|0;if((Ka|0)!=1){C=81;break a}c[u>>2]=0;Ja=p;Ia=c[Ja>>2]|0;La=c[Ja+4>>2]|0;switch(Ia|0){case 165:{if(!La)break o;else C=101;break}case 191:{if(La|0)C=101;break}case 236:{if(La|0)C=101;break}case 238:{if(!La)break n;else C=101;break}default:C=101}if((C|0)==101){C=0;Ja=c[t>>2]|0;Ma=i;c[Ma>>2]=Ia;c[Ma+4>>2]=La;wa[Ja&3](b,1,5179,i)}Ja=c[b>>2]|0;La=c[q>>2]|0;if(!La)Na=Ja;else{Ma=Ja+12|0;Ia=La;do{La=Ia>>>0<8192?Ia:8192;Oa=ta[c[Ja>>2]&7](o,La,c[Ma>>2]|0)|0;Ia=Ia-La|0;if((Oa|0)!=1){C=108;break a}}while((Ia|0)!=0);Na=c[b>>2]|0}Ia=sa[c[Na+8>>2]&3](c[Na+12>>2]|0)|0;Ma=D;if(!((Ma|0)<(va|0)|(Ma|0)==(va|0)&Ia>>>0<pa>>>0))break m}if(Ha|0){C=96;break a}Ia=q;Pa=c[Ia>>2]|0;Ma=Kc(Pa|0,c[Ia+4>>2]|0,-1,-1)|0;Ia=D;if(Ia>>>0<0|(Ia|0)==0&Ma>>>0<268435455)break;else{Fa=Pa;Ha=1}}Qa=Ac(1,Pa)|0;if(!Qa){qa=-1;break a}Ma=c[b>>2]|0;Ra=ta[c[Ma>>2]&7](Qa,Pa,c[Ma+12>>2]|0)|0;if((Ra|0)==1){Ca=Qa;Da=Pa;Ea=1}else{C=100;break a}}Ea=c[b>>2]|0;Da=q;Ma=Kc(c[Da>>2]|0,c[Da+4>>2]|0,-1,-1)|0;Da=D;if(Da>>>0>0|(Da|0)==0&Ma>>>0>7){Sa=-1;C=92;break a}Ia=Ea+12|0;Ja=ta[c[Ea>>2]&7](o,1,c[Ia>>2]|0)|0;if((Ja|0)!=1){Sa=Ja;C=92;break a}Ja=d[o>>0]|0;if((Ma|0)==0&(Da|0)==0){Ta=Ja;Ua=0}else{La=Ja;Ja=0;Wa=Ma;Ma=Da;while(1){Da=ta[c[Ea>>2]&7](o,1,c[Ia>>2]|0)|0;if((Da|0)!=1){Sa=Da;C=92;break a}Da=Ic(La|0,Ja|0,8)|0;Xa=D;Ya=d[o>>0]|0|Da;Wa=Kc(Wa|0,Ma|0,-1,-1)|0;Ma=D;if((Wa|0)==0&(Ma|0)==0){Ta=Ya;Ua=Xa;break}else{La=Ya;Ja=Xa}}}if((Ta|0)==0&(Ua|0)==0){C=94;break a}else{ra=Ta;ua=Ca;Aa=Fa;Ba=Ha}}if(!Ha){C=110;break a}Ba=Ac(1,16)|0;c[Ba+12>>2]=ga;c[Ba>>2]=ra;c[Ba+4>>2]=Ca;c[Ba+8>>2]=Fa;Aa=Ba;Ba=c[b>>2]|0;ua=sa[c[Ba+8>>2]&3](c[Ba+12>>2]|0)|0;Ba=D;if((Ba|0)<(ha|0)|(Ba|0)==(ha|0)&ua>>>0<la>>>0){ga=Aa;ja=Fa}else{za=Aa;break}}}else za=0;while(0);da=za;ea=fa}ea=c[b>>2]|0;la=s;ha=c[la>>2]|0;ia=c[la+4>>2]|0;la=Kc(ha|0,ia|0,-1,-1)|0;ma=D;if(ma>>>0>0|(ma|0)==0&la>>>0>7){Za=-1;C=120;break a}ja=ea+12|0;ga=ta[c[ea>>2]&7](o,1,c[ja>>2]|0)|0;if((ga|0)!=1){Za=ga;C=120;break a}ga=d[o>>0]|0;if((la|0)==0&(ma|0)==0){_a=0;$a=ga}else{Aa=ga;ga=0;ua=la;la=ma;while(1){ma=ta[c[ea>>2]&7](o,1,c[ja>>2]|0)|0;if((ma|0)!=1){Za=ma;C=120;break a}ma=Ic(Aa|0,ga|0,8)|0;Ba=D;pa=d[o>>0]|0|ma;ua=Kc(ua|0,la|0,-1,-1)|0;la=D;if((ua|0)==0&(la|0)==0){_a=Ba;$a=pa;break}else{Aa=pa;ga=Ba}}}ga=ia>>>0<0|(ia|0)==0&ha>>>0<8;Aa=Ic(ha|0,ia|0,3)|0;la=Kc(Aa|0,D|0,-1,-1)|0;ua=Ic(1,0,la|0)|0;la=D;ja=_a>>>0<la>>>0|(_a|0)==(la|0)&$a>>>0<ua>>>0;ua=Ic(1,0,Aa|0)|0;Aa=Fc($a|0,_a|0,(ga?(ja?0:ua):0)|0,(ga?(ja?0:D):0)|0)|0;_=Aa;$=D;aa=da;ba=fa;ca=1}ba=c[b>>2]|0;aa=s;Aa=c[aa>>2]|0;ja=c[aa+4>>2]|0;aa=Kc(Aa|0,ja|0,-1,-1)|0;ga=D;if(ga>>>0>0|(ga|0)==0&aa>>>0>7){ab=-1;C=59;break a}ua=ba+12|0;la=ta[c[ba>>2]&7](o,1,c[ua>>2]|0)|0;if((la|0)!=1){ab=la;C=59;break a}la=d[o>>0]|0;if((aa|0)==0&(ga|0)==0){bb=0;cb=la}else{ea=la;la=0;Ba=aa;aa=ga;while(1){ga=ta[c[ba>>2]&7](o,1,c[ua>>2]|0)|0;if((ga|0)!=1){ab=ga;C=59;break a}ga=Ic(ea|0,la|0,8)|0;pa=D;ma=d[o>>0]|0|ga;Ba=Kc(Ba|0,aa|0,-1,-1)|0;aa=D;if((Ba|0)==0&(aa|0)==0){bb=pa;cb=ma;break}else{ea=ma;la=pa}}}la=ja>>>0<0|(ja|0)==0&Aa>>>0<8;ea=Ic(Aa|0,ja|0,3)|0;aa=Kc(ea|0,D|0,-1,-1)|0;Ba=Ic(1,0,aa|0)|0;aa=D;ua=bb>>>0<aa>>>0|(bb|0)==(aa|0)&cb>>>0<Ba>>>0;Ba=Ic(1,0,ea|0)|0;ea=Fc(cb|0,bb|0,(la?(ua?0:Ba):0)|0,(la?(ua?0:D):0)|0)|0;S=ea;T=D;U=_;V=$;W=da;X=fa;Y=1;Z=ca}Z=c[b>>2]|0;X=s;W=Kc(c[X>>2]|0,c[X+4>>2]|0,-1,-1)|0;X=D;if(X>>>0>0|(X|0)==0&W>>>0>7){db=-1;C=48;break a}V=Z+12|0;U=ta[c[Z>>2]&7](o,1,c[V>>2]|0)|0;if((U|0)!=1){db=U;C=48;break a}U=d[o>>0]|0;if((W|0)==0&(X|0)==0){eb=U;fb=0}else{ea=U;U=0;ua=W;W=X;while(1){X=ta[c[Z>>2]&7](o,1,c[V>>2]|0)|0;if((X|0)!=1){db=X;C=48;break a}X=Ic(ea|0,U|0,8)|0;la=D;Ba=d[o>>0]|0|X;ua=Kc(ua|0,W|0,-1,-1)|0;W=D;if((ua|0)==0&(W|0)==0){eb=Ba;fb=la;break}else{ea=Ba;U=la}}}if(c[y>>2]|0){U=A;if((c[z>>2]|0)==2){gb=c[U>>2]|0;hb=c[U+4>>2]|0}else{C=51;break a}}else{gb=1e6;hb=0}U=Pc(gb|0,hb|0,eb|0,fb|0)|0;B=U;F=D;E=S;K=T;G=_;L=$;N=da;O=fa;P=1;Q=Y;R=ca}R=c[e>>2]|0;Q=(R|0)!=0;if((fa|0)!=(Q&1|0)){C=130;break}if(Q){Q=R+16|0;c[Q>>2]=B;c[Q+4>>2]=F;c[R+24>>2]=P;Q=R+40|0;c[Q>>2]=S;c[Q+4>>2]=T;c[R+48>>2]=Y;Q=R+56|0;c[Q>>2]=_;c[Q+4>>2]=$;c[R+64>>2]=ca;c[R+32>>2]=da;R=c[e>>2]|0;if(c[R+64>>2]|0)a[R+68>>0]=0}else zc(da);if(fa|0){w=1;C=136;break}}switch(C|0){case 24:{w=I;l=f;return w|0}case 25:{I=s;w=Va(b,163,0,c[I>>2]|0,c[I+4>>2]|0,e)|0;l=f;return w|0}case 48:{w=db;l=f;return w|0}case 51:{oa(3231,3174,725,3254);break}case 59:{w=ab;l=f;return w|0}case 75:{qa=ya;break}case 81:{zc(Ca);qa=Ka;break}case 92:{zc(Ca);qa=Sa;break}case 94:{wa[c[t>>2]&3](b,1e3,5101,k);zc(Ca);qa=-1;break}case 96:{wa[c[t>>2]&3](b,1e3,5130,j);zc(Ca);qa=-1;break}case 100:{zc(Qa);qa=Ra;break}case 108:{zc(Ca);qa=Oa;break}case 110:{wa[c[t>>2]&3](b,1e3,5213,h);qa=-1;break}case 120:{w=Za;l=f;return w|0}case 128:{w=na;l=f;return w|0}case 130:{oa(5303,3174,2441,5008);break}case 135:{w=M;l=f;return w|0}case 136:{l=f;return w|0}}w=qa;l=f;return w|0}function Va(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,pa=0,qa=0,ra=0,sa=0,ua=0,va=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0.0,kb=0,lb=0;k=l;l=l+2096|0;m=k+2048|0;n=k+2088|0;o=k;c[j>>2]=0;if(i>>>0>0|(i|0)==0&g>>>0>1073741824){p=-1;l=k;return p|0}q=c[b>>2]|0;r=q+12|0;s=ta[c[q>>2]&7](n,1,c[r>>2]|0)|0;a:do if((s|0)==1){t=d[n>>0]|0;do if(!(t&128)){if(!(t&64))if(!(t&32))if(!(t&16))if(!(t&8)){u=(t&4|0)==0;v=t>>>1&1;w=u?8-v|0:6;x=(u?-2-v|0:251)&t;v=w+-1|0;if(!v){y=x;z=0;A=1;break}else{B=x;C=0;G=w;H=v}}else{I=5;J=-9;K=6}else{I=4;J=-17;K=6}else{I=3;J=-33;K=6}else{I=2;J=-65;K=6}if((K|0)==6){B=J&t;C=0;G=I;H=I+-1|0}v=B;w=C;x=H;while(1){u=ta[c[q>>2]&7](n,1,c[r>>2]|0)|0;if((u|0)!=1){L=u;break a}u=Ic(v|0,w|0,8)|0;M=D;N=d[n>>0]|0|u;x=x+-1|0;if(!x){y=N;z=M;A=G;break}else{v=N;w=M}}}else{y=t&127;z=0;A=1}while(0);if((y|0)==0&(z|0)==0){p=-1;l=k;return p|0}t=c[b>>2]|0;w=t+12|0;v=ta[c[t>>2]&7](n,1,c[w>>2]|0)|0;if((v|0)==1){x=a[n>>0]|0;M=ta[c[t>>2]&7](n,1,c[w>>2]|0)|0;if((M|0)==1){w=Ic(x&255|0,0,8)|0;x=D;t=d[n>>0]|0|w;w=x>>>0<0|(x|0)==0&t>>>0<32768;N=Fc(t|0,x|0,(w?0:65536)|0,(w?0:0)|0)|0;w=D;x=c[b>>2]|0;t=ta[c[x>>2]&7](n,1,c[x+12>>2]|0)|0;if((t|0)!=1){p=t;l=k;return p|0}t=a[n>>0]|0;x=t&255;u=A+3|0;O=(e|0)==163&(f|0)==0?(t&255)>>>7:2;P=(t&255)>>>1;b:do if(!(P&3)){Q=g;S=i;U=u;V=0;W=1;X=0;Y=u;Z=0;K=72}else{t=c[b>>2]|0;_=ta[c[t>>2]&7](n,1,c[t+12>>2]|0)|0;if((_|0)!=1){p=_;l=k;return p|0}_=a[n>>0]|0;t=_&255;$=A+4|0;aa=Kc(t|0,0,1,0)|0;ba=D;switch(P&3){case 3:{if(!(_<<24>>24)){p=-1;l=k;return p|0}ca=c[b>>2]|0;da=ca+12|0;ea=ta[c[ca>>2]&7](n,1,c[da>>2]|0)|0;c:do if((ea|0)==1){fa=d[n>>0]|0;d:do if(!(fa&128)){do if(!(fa&64)){if(fa&32|0){ga=3;ha=-33;K=45;break}if(fa&16|0){ga=4;ha=-17;K=45;break}if(fa&8|0){ga=5;ha=-9;K=45;break}ia=(fa&4|0)==0;ja=fa>>>1&1;ka=ia?8-ja|0:6;la=(ia?-2-ja|0:251)&fa;ja=ka+-1|0;if(!ja){ma=la;na=0;pa=1;break d}else{qa=la;ra=0;sa=ka;ua=ja}}else{ga=2;ha=-65;K=45}while(0);if((K|0)==45){qa=ha&fa;ra=0;sa=ga;ua=ga+-1|0}ja=qa;ka=ra;la=ua;while(1){ia=ta[c[ca>>2]&7](n,1,c[da>>2]|0)|0;if((ia|0)!=1){va=ia;break c}ia=Ic(ja|0,ka|0,8)|0;xa=D;ya=d[n>>0]|0|ia;la=la+-1|0;if(!la){ma=ya;na=xa;pa=sa;break}else{ja=ya;ka=xa}}}else{ma=fa&127;na=0;pa=1}while(0);fa=pa+$|0;ka=o;c[ka>>2]=ma;c[ka+4>>2]=na;ka=Kc(t|0,0,-1,-1)|0;ja=D;e:do if((ka|0)==0&(ja|0)==0){za=ma;Aa=na;Ba=fa;Ca=1}else{la=ma;xa=na;ya=ma;ia=na;Da=ka;Ea=ja;Fa=fa;Ga=1;f:while(1){Ha=ta[c[ca>>2]&7](n,1,c[da>>2]|0)|0;if((Ha|0)!=1){Ia=Ha;break}Ha=d[n>>0]|0;g:do if(!(Ha&128)){do if(!(Ha&64)){if(Ha&32|0){Ja=3;Ka=-33;K=59;break}if(Ha&16|0){Ja=4;Ka=-17;K=59;break}if(Ha&8|0){Ja=5;Ka=-9;K=59;break}La=(Ha&4|0)==0;Ma=Ha>>>1&1;Na=La?8-Ma|0:6;Oa=(La?-2-Ma|0:251)&Ha;Ma=Na+-1|0;if(!Ma){Pa=Oa;Qa=0;Ra=1;Sa=0;break g}else{Ta=Oa;Ua=0;Va=Na;Wa=Ma}}else{Ja=2;Ka=-65;K=59}while(0);if((K|0)==59){K=0;Ta=Ka&Ha;Ua=0;Va=Ja;Wa=Ja+-1|0}Ma=Ta;Na=Ua;Oa=Wa;while(1){La=ta[c[ca>>2]&7](n,1,c[da>>2]|0)|0;if((La|0)!=1){Ia=La;break f}La=Ic(Ma|0,Na|0,8)|0;Xa=D;Ya=d[n>>0]|0|La;Oa=Oa+-1|0;if(!Oa){Pa=Ya;Qa=Xa;Ra=Va;Sa=Wa;break}else{Ma=Ya;Na=Xa}}}else{Pa=Ha&127;Qa=0;Ra=1;Sa=0}while(0);Ha=2688+(Sa<<3)|0;Na=Fc(Pa|0,Qa|0,c[Ha>>2]|0,c[Ha+4>>2]|0)|0;Ha=Ra+Fa|0;la=Kc(la|0,xa|0,Na|0,D|0)|0;xa=D;Na=o+(Ga<<3)|0;c[Na>>2]=la;c[Na+4>>2]=xa;Na=Kc(la|0,xa|0,ya|0,ia|0)|0;Ma=D;Oa=Ga+1|0;Da=Kc(Da|0,Ea|0,-1,-1)|0;Ea=D;if((Da|0)==0&(Ea|0)==0){za=Na;Aa=Ma;Ba=Ha;Ca=Oa;break e}else{ya=Na;ia=Ma;Fa=Ha;Ga=Oa}}p=Ia;l=k;return p|0}while(0);fa=Kc(Ba|0,0,za|0,Aa|0)|0;ja=D;if(ja>>>0>0|(ja|0)==0&fa>>>0>g>>>0){p=-1;l=k;return p|0}else{Q=g-Ba|0;S=0;U=za;V=Aa;W=aa;X=ba;Y=Ba;Z=Ca;K=72;break b}}else va=ea;while(0);p=va;l=k;return p|0}case 1:{if(!(_<<24>>24)){p=-1;l=k;return p|0}ea=c[b>>2]|0;da=ea+12|0;ca=0;fa=0;ja=t;ka=0;Ga=$;Fa=0;h:while(1){ia=o+(Fa<<3)|0;Za=ta[c[ea>>2]&7](n,1,c[da>>2]|0)|0;if((Za|0)!=1){K=29;break}ya=a[n>>0]|0;Ea=ya&255;Da=Ga+1|0;xa=ia;c[xa>>2]=Ea;c[xa+4>>2]=0;if(ya<<24>>24==-1){ya=Ea;xa=0;la=Da;while(1){_a=ta[c[ea>>2]&7](n,1,c[da>>2]|0)|0;if((_a|0)!=1){K=32;break h}Oa=a[n>>0]|0;Ha=la+1|0;Ma=Kc(ya|0,xa|0,Oa&255|0,0)|0;Na=D;Xa=ia;c[Xa>>2]=Ma;c[Xa+4>>2]=Na;if(Oa<<24>>24==-1){ya=Ma;xa=Na;la=Ha}else{$a=Ma;ab=Na;bb=Ha;break}}}else{$a=Ea;ab=0;bb=Da}ca=Kc($a|0,ab|0,ca|0,fa|0)|0;fa=D;Fa=Fa+1|0;ja=Kc(ja|0,ka|0,-1,-1)|0;ka=D;if((ja|0)==0&(ka|0)==0){K=35;break}else Ga=bb}if((K|0)==29){p=Za;l=k;return p|0}else if((K|0)==32){p=_a;l=k;return p|0}else if((K|0)==35){Ga=Kc(ca|0,fa|0,bb|0,0)|0;ka=D;if(ka>>>0>0|(ka|0)==0&Ga>>>0>g>>>0){p=-1;l=k;return p|0}else{Q=g-bb|0;S=0;U=ca;V=fa;W=aa;X=ba;Y=bb;Z=Fa;K=72;break b}}break}case 2:{Ga=Fc(g|0,i|0,$|0,0)|0;ka=D;ja=Rc(Ga|0,ka|0,aa|0,ba|0)|0;if(!((ja|0)==0&(D|0)==0)){p=-1;l=k;return p|0}ja=Nc(Ga|0,ka|0,aa|0,ba|0)|0;ka=D;Ga=0;do{da=o+(Ga<<3)|0;c[da>>2]=ja;c[da+4>>2]=ka;Ga=Ga+1|0}while(0<ba>>>0|0==(ba|0)&Ga>>>0<aa>>>0);cb=ba;db=aa;eb=$;break}default:{}}}while(0);if((K|0)==72){P=Fc(Q|0,S|0,U|0,V|0)|0;u=o+(Z<<3)|0;c[u>>2]=P;c[u+4>>2]=D;cb=X;db=W;eb=Y}u=eb;P=0;$=0;do{aa=o+($<<3)|0;u=Kc(c[aa>>2]|0,c[aa+4>>2]|0,u|0,P|0)|0;P=D;$=$+1|0}while(0<cb>>>0|0==(cb|0)&$>>>0<db>>>0);if((y|0)==0|(P>>>0>i>>>0|(P|0)==(i|0)&u>>>0>g>>>0)){p=-1;l=k;return p|0}$=c[b+192>>2]|0;if(!$){p=-1;l=k;return p|0}aa=$;ba=0;while(1){Ga=aa+8|0;if(!((c[Ga>>2]|0)==174&(c[Ga+4>>2]|0)==0)){K=79;break}Ga=c[aa+16>>2]|0;ka=Ga;if(!(c[Ga+12>>2]|0)){p=-1;K=131;break}if((c[Ga+8>>2]|0)!=2){K=82;break}if((c[ka+4>>2]|0)==0?(c[ka>>2]|0)==(y|0):0){fb=$;gb=0;K=85;break}aa=c[aa>>2]|0;if(!aa){p=-1;K=131;break}else ba=ba+1|0}if((K|0)==79)oa(4585,3174,1187,4612);else if((K|0)==82)oa(3231,3174,725,3254);else if((K|0)==85){while(1){K=0;aa=fb+8|0;if(!((c[aa>>2]|0)==174&(c[aa+4>>2]|0)==0)){K=86;break}if((gb|0)==(ba|0)){K=89;break}aa=c[fb>>2]|0;if(!aa){p=-1;K=131;break}else{fb=aa;gb=gb+1|0;K=85}}if((K|0)==86)oa(4585,3174,1208,4941);else if((K|0)==89){if(!(c[fb+16>>2]|0)){p=-1;l=k;return p|0}if(c[b+172>>2]|0){aa=b+160|0;if((c[b+168>>2]|0)==2){hb=c[aa>>2]|0;ib=c[aa+4>>2]|0}else oa(3231,3174,725,3254)}else{hb=1e6;ib=0}if(!(c[b+232>>2]|0)){p=-1;l=k;return p|0}aa=b+224|0;$=Kc(c[aa>>2]|0,c[aa+4>>2]|0,N|0,w|0)|0;aa=D;if((aa|0)<0){p=-1;l=k;return p|0}u=Ac(1,72)|0;if(!u){p=-1;l=k;return p|0}P=u;c[P>>2]=ba;c[P+4>>2]=0;P=Pc($|0,aa|0,hb|0,ib|0)|0;jb=+(P>>>0)+4294967296.0*+(D>>>0);P=~~jb>>>0;aa=+F(jb)>=1.0?(jb>0.0?~~+T(+E(jb/4294967296.0),4294967295.0)>>>0:~~+R((jb-+(~~jb>>>0))/4294967296.0)>>>0):0;$=u+8|0;c[$>>2]=P;c[$+4>>2]=aa;a[u+68>>0]=O;$=c[b+4>>2]|0;c[m>>2]=(e|0)==161&(f|0)==0?9260:5332;ka=m+8|0;c[ka>>2]=ba;c[ka+4>>2]=0;h[m+16>>3]=(+(P>>>0)+4294967296.0*+(aa>>>0))/1.0e9;aa=m+24|0;c[aa>>2]=x;c[aa+4>>2]=0;aa=m+32|0;c[aa>>2]=db;c[aa+4>>2]=cb;wa[$&3](b,1,5339,m);$=u+28|0;aa=0;P=0;while(1){ka=o+(aa<<3)|0;Ga=c[ka>>2]|0;ja=c[ka+4>>2]|0;if(ja>>>0>0|(ja|0)==0&Ga>>>0>268435456){K=98;break}ja=P;P=Ac(1,12)|0;if(!P){K=106;break}ka=Ac(1,Ga)|0;c[P>>2]=ka;if(!ka){K=114;break}c[P+4>>2]=Ga;Fa=c[b>>2]|0;kb=ta[c[Fa>>2]&7](ka,Ga,c[Fa+12>>2]|0)|0;if((kb|0)!=1){K=122;break}c[(ja|0?ja+8|0:$)>>2]=P;aa=aa+1|0;if(!(0<cb>>>0|0==(cb|0)&aa>>>0<db>>>0)){K=130;break}}if((K|0)==98){aa=c[$>>2]|0;if(aa|0){x=aa;do{c[$>>2]=c[x+8>>2];zc(c[x>>2]|0);zc(x);x=c[$>>2]|0}while((x|0)!=0)}x=u+32|0;aa=c[x>>2]|0;if(aa|0){ba=aa;do{c[x>>2]=c[ba+12>>2];zc(c[ba+4>>2]|0);zc(ba);ba=c[x>>2]|0}while((ba|0)!=0)}zc(u);p=-1;l=k;return p|0}else if((K|0)==106){ba=c[$>>2]|0;if(ba|0){x=ba;do{c[$>>2]=c[x+8>>2];zc(c[x>>2]|0);zc(x);x=c[$>>2]|0}while((x|0)!=0)}x=u+32|0;ba=c[x>>2]|0;if(ba|0){aa=ba;do{c[x>>2]=c[aa+12>>2];zc(c[aa+4>>2]|0);zc(aa);aa=c[x>>2]|0}while((aa|0)!=0)}zc(u);p=-1;l=k;return p|0}else if((K|0)==114){zc(P);aa=c[$>>2]|0;if(aa|0){x=aa;do{c[$>>2]=c[x+8>>2];zc(c[x>>2]|0);zc(x);x=c[$>>2]|0}while((x|0)!=0)}x=u+32|0;aa=c[x>>2]|0;if(aa|0){ba=aa;do{c[x>>2]=c[ba+12>>2];zc(c[ba+4>>2]|0);zc(ba);ba=c[x>>2]|0}while((ba|0)!=0)}zc(u);p=-1;l=k;return p|0}else if((K|0)==122){zc(c[P>>2]|0);zc(P);ba=c[$>>2]|0;if(ba|0){x=ba;do{c[$>>2]=c[x+8>>2];zc(c[x>>2]|0);zc(x);x=c[$>>2]|0}while((x|0)!=0)}x=u+32|0;$=c[x>>2]|0;if($|0){P=$;do{c[x>>2]=c[P+12>>2];zc(c[P+4>>2]|0);zc(P);P=c[x>>2]|0}while((P|0)!=0)}zc(u);p=kb;l=k;return p|0}else if((K|0)==130){c[j>>2]=u;p=1;l=k;return p|0}}else if((K|0)==131){l=k;return p|0}}else if((K|0)==131){l=k;return p|0}}else lb=M}else lb=v;p=lb;l=k;return p|0}else L=s;while(0);p=L;l=k;return p|0}function Wa(a){a=a|0;var b=0,d=0,e=0;b=a+28|0;d=c[b>>2]|0;if(d|0){e=d;do{c[b>>2]=c[e+8>>2];zc(c[e>>2]|0);zc(e);e=c[b>>2]|0}while((e|0)!=0)}e=a+32|0;b=c[e>>2]|0;if(!b){zc(a);return}d=b;do{c[e>>2]=c[d+12>>2];zc(c[d+4>>2]|0);zc(d);d=c[e>>2]|0}while((d|0)!=0);zc(a);return}function Xa(a,b){a=a|0;b=b|0;c[b>>2]=c[a>>2];return 0}function Ya(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;a=c[d+4>>2]|0;e=b;c[e>>2]=c[d>>2];c[e+4>>2]=a;return 0}function Za(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=c[a+28>>2]|0;c[d>>2]=0;c[e>>2]=0;if(!f){g=-1;return g|0}else{h=f;i=0}while(1){if((i|0)==(b|0))break;f=c[h+8>>2]|0;if(!f){g=-1;j=5;break}else{h=f;i=i+1|0}}if((j|0)==5)return g|0;c[d>>2]=c[h>>2];c[e>>2]=c[h+4>>2];g=0;return g|0}function _a(a){a=a|0;var b=0,d=0;if(c[a+200>>2]|0){b=1;d=b&1;return d|0}b=(La(c[a+152>>2]|0)|0)!=0;d=b&1;return d|0}function $a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[2164]|0;do if(!d){e=Bc(0,1)|0;if(e|0){if(!(Bc(e,0)|0)){c[2164]=1;f=1;break}if(c[2164]|0)oa(5381,5393,181,5433);e=Bc(0,1)|0;if(e|0){zc(e);c[2164]=2;f=2;break}}e=c[2164]|0;if(!e)oa(5454,5393,69,5464);else f=e}else f=d;while(0);d=(b|0)!=0;if(!a){if(!d){g=0;return g|0}e=ua[f&3](0,b+16|0)|0;if(!e){g=0;return g|0}c[e>>2]=537134360;c[e+12>>2]=8660;h=e+4|0;c[e+8>>2]=h;c[h>>2]=8660;g=e+16|0;return g|0}e=a+-16|0;if((c[e>>2]|0)!=537134360)oa(5471,5393,91,5464);if(!d){bb(e);d=a+-12|0;h=c[d>>2]|0;i=a+-8|0;c[h+4>>2]=c[i>>2];c[c[i>>2]>>2]=h;c[i>>2]=d;c[d>>2]=8660;ua[c[2164]&3](e,0)|0;g=0;return g|0}d=ua[f&3](e,b+16|0)|0;if(!d){g=0;return g|0}b=d+4|0;c[c[d+8>>2]>>2]=b;c[(c[b>>2]|0)+4>>2]=b;b=d+12|0;c[(c[b>>2]|0)+4>>2]=b;g=d+16|0;return g|0}function ab(a,b){a=a|0;b=b|0;var c=0;if(!b){zc(a);c=0}else c=Bc(a,b)|0;return c|0}function bb(a){a=a|0;var b=0,d=0;if(!a)oa(5492,5393,247,5518);if((c[a>>2]|0)!=537134360)oa(5492,5393,247,5518);c[a>>2]=0;b=c[a+12>>2]|0;if((b|0)==8660)return;else d=b;do{b=d;d=c[d>>2]|0;a=b+-4|0;bb(a);ua[c[2164]&3](a,0)|0}while((d|0)!=8660);return}function cb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a)if(!b)return;else oa(5533,5393,120,5542);d=a+-16|0;if((c[d>>2]|0)!=537134360)oa(5550,5393,126,5542);e=a+-12|0;f=c[e>>2]|0;g=a+-8|0;c[f+4>>2]=c[g>>2];c[c[g>>2]>>2]=f;c[g>>2]=e;c[e>>2]=8660;if(!b)return;f=b+-16|0;if((c[f>>2]|0)!=537134360)oa(5471,5393,135,5542);if((a|0)==(b|0))oa(5571,5393,138,5542);if(db(f,d)|0)oa(5578,5393,139,5542);d=b+-4|0;b=c[d>>2]|0;c[e>>2]=b;c[b+4>>2]=e;c[d>>2]=e;c[g>>2]=d;return}function db(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;a:do if((a|0)!=0&(b|0)!=0?(d=c[b+12>>2]|0,(d|0)!=8660):0){e=d;while(1){d=e+-4|0;if((d|0)==(a|0)){f=1;break a}if(db(a,d)|0){f=1;break a}e=c[e>>2]|0;if((e|0)==8660){f=0;break}}}else f=0;while(0);return f|0}function eb(a){a=a|0;return $a(0,a)|0}function fb(a){a=a|0;$a(a,0)|0;return}function gb(){c[2167]=0;c[2168]=wb()|0;return}function hb(a,b){a=a|0;b=b|0;if((b|0)<=0)return;Db(c[2168]|0,a,b);return}function ib(){var b=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,E=0,F=0;b=l;l=l+128|0;e=b+96|0;f=b+72|0;g=b+64|0;i=b+56|0;j=b+48|0;k=b+8|0;m=b;n=b+116|0;o=b+112|0;switch(c[2167]|0){case 0:{p=Ab(c[2168]|0)|0;q=D;if(!((q|0)>0|(q|0)==0&p>>>0>262144)){r=0;l=b;return r|0}wc(5594)|0;c[693]=c[2168];c[e>>2]=c[690];c[e+4>>2]=c[691];c[e+8>>2]=c[692];c[e+12>>2]=c[693];if((Ea(8676,e,2,-1,-1)|0)<0){wc(5619)|0;r=0;l=b;return r|0}if((Ja(c[2169]|0,e)|0)>=0)if(!(c[e>>2]|0))s=8;else{p=0;while(1){q=Na(c[2169]|0,p)|0;t=Oa(c[2169]|0,p)|0;u=a[9261]|0;a:do if(!((q|0)==0&u<<24>>24==0))if((q|0)==1&(a[9262]|0)==0)switch(t|0){case 1:{a[9262]=1;c[2172]=p;c[2173]=5647;v=u;break a;break}case 3:{a[9262]=1;c[2172]=p;c[2173]=5654;v=u;break a;break}default:{v=u;break a}}else v=u;else switch(t|0){case 0:{a[9261]=1;c[2170]=p;c[694]=0;c[2171]=5639;v=1;break a;break}case 2:{a[9261]=1;c[2170]=p;c[694]=2;c[2171]=5643;v=1;break a;break}default:{v=0;break a}}while(0);p=p+1|0;if(p>>>0>=(c[e>>2]|0)>>>0){w=v;break}}}else{c[e>>2]=0;s=8}if((s|0)==8)w=a[9261]|0;if(w<<24>>24)if((Ra(c[2169]|0,c[2170]|0,k)|0)<0)a[9261]=0;else{w=c[k+4>>2]|0;v=c[k+8>>2]|0;p=c[k+28>>2]|0;t=c[k+24>>2]|0;ea(w|0,v|0,w>>>1|0,v>>>1|0,0.0,w-p-(c[k+32>>2]|0)|0,v-t-(c[k+20>>2]|0)|0,p|0,t|0,c[k+12>>2]|0,c[k+16>>2]|0)}if(a[9262]|0)if((Sa(c[2169]|0,c[2172]|0,k)|0)<0)a[9262]=0;else{Pa(c[2169]|0,c[2172]|0,m)|0;c[j>>2]=c[m>>2];vc(5659,j)|0;b:do if(c[m>>2]|0){t=0;while(1){if((Qa(c[2169]|0,c[2172]|0,t,j,n)|0)<0)break;na(c[j>>2]|0,c[n>>2]|0,-1.0);p=t+1|0;if(p>>>0<(c[m>>2]|0)>>>0)t=p;else break b}c[i>>2]=t;vc(5685,i)|0;ia()}while(0)}c[2167]=1;wc(5715)|0;qa(c[2171]|0,c[2173]|0);r=1;l=b;return r|0}case 1:{c[e>>2]=0;i=Ua(c[2169]|0,e)|0;do if(!i){Ta(c[2169]|0)|0;x=0}else{if((i|0)<0){c[g>>2]=i;vc(5738,g)|0;x=0;break}Xa(c[e>>2]|0,k)|0;Ya(c[e>>2]|0,m)|0;j=m;y=(+((c[j>>2]|0)>>>0)+4294967296.0*+((c[j+4>>2]|0)>>>0))/1.0e9;c[n>>2]=0;c[o>>2]=0;Za(c[e>>2]|0,0,n,o)|0;if((a[9261]|0)!=0?(c[k>>2]|0)==(c[2170]|0):0){j=c[694]|0;p=c[o>>2]|0;if(!j)if(p){v=c[n>>2]|0;if(!(a[v>>0]&1)){z=v;s=47}else{A=p;s=44}}else{A=0;s=44}else if(!((j|0)!=2|(p|0)==0)){j=c[n>>2]|0;v=d[j>>0]|0;if((v>>>7<<1|v>>>6&1|0)==2?(((v&48|0)==48?6:12)&v|0)==0:0){z=j;s=47}else{B=j;C=p;E=0}}else{A=p;s=44}if((s|0)==44){B=c[n>>2]|0;C=A;E=0}else if((s|0)==47){h[344]=y;B=z;C=p;E=1}fa(B|0,C|0,+y,+(+h[344]),E|0)}else s=49;if(((s|0)==49?a[9262]|0:0)?(c[k>>2]|0)==(c[2172]|0):0)na(c[n>>2]|0,c[o>>2]|0,+y);Wa(c[e>>2]|0);x=1}while(0);r=x;l=b;return r|0}case 2:{x=zb(c[2168]|0)|0;o=D;if(kb(c[2168]|0,e,1)|0){n=e;e=c[n>>2]|0;s=c[n+4>>2]|0;n=(e|0)!=475249515|(s|0)!=0;if(!(kb(c[2168]|0,k,0)|0))F=n;else{E=k;k=c[E>>2]|0;C=c[E+4>>2]|0;E=Ab(c[2168]|0)|0;B=f;c[B>>2]=e;c[B+4>>2]=s;s=f+8|0;c[s>>2]=k;c[s+4>>2]=C;s=f+16|0;c[s>>2]=E;c[s+4>>2]=D;vc(5770,f)|0;f=Ab(c[2168]|0)|0;s=D;F=n|((s|0)>(C|0)|(s|0)==(C|0)&f>>>0>=k>>>0)}Bb(c[2168]|0,x,o)|0;if(F){lb();r=0;l=b;return r|0}}else Bb(c[2168]|0,x,o)|0;wc(5815)|0;r=0;l=b;return r|0}default:{wc(5842)|0;r=0;l=b;return r|0}}return 0}function jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a=l;l=l+16|0;f=a;if(b>>>0<=9){l=a;return}c[f>>2]=e;xc(d,f)|0;l=a;return}function kb(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=l;l=l+16|0;h=g+1|0;i=g;if(Eb(b,h,1)|0){wc(6025)|0;j=0;l=g;return j|0}k=a[h>>0]|0;if(!(k<<24>>24)){wc(6056)|0;j=0;l=g;return j|0}m=k&255;if(!(m&128)){n=m;m=1;while(1){o=n<<1;p=m+1|0;if(!(o&128)){n=o&254;m=p}else break}n=o&255;a[h>>0]=n;q=n;r=p;s=m}else{q=k;r=1;s=0}if(!f){f=q&127;a[h>>0]=f;t=f}else t=q;q=(t&255)>>>s;t=e;c[t>>2]=q;c[t+4>>2]=((q|0)<0)<<31>>31;if((s|0)<1){j=r;l=g;return j|0}else u=1;while(1){if(Eb(b,i,1)|0)break;q=e;t=Ic(c[q>>2]|0,c[q+4>>2]|0,8)|0;q=e;c[q>>2]=d[i>>0]|0|t;c[q+4>>2]=D;if((u|0)<(s|0))u=u+1|0;else{j=r;v=14;break}}if((v|0)==14){l=g;return j|0}wc(6067)|0;j=0;l=g;return j|0}function lb(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;a=l;l=l+48|0;b=a+24|0;d=a;e=(c[2168]|0)+24|0;c[e>>2]=0;c[e+4>>2]=0;e=8648;if(!(Ma(c[2169]|0,c[2174]|0,c[e>>2]|0,c[e+4>>2]|0)|0)){c[2167]=1;wc(5984)|0;l=a;return}e=c[2168]|0;f=e+24|0;g=c[f>>2]|0;h=c[f+4>>2]|0;if((g|0)==0&(h|0)==0){f=e+16|0;i=c[f>>2]|0;j=c[f+4>>2]|0;f=xb(e)|0;k=D;m=yb(c[2168]|0)|0;n=d;c[n>>2]=i;c[n+4>>2]=j;j=d+8|0;c[j>>2]=f;c[j+4>>2]=k;k=d+16|0;c[k>>2]=m;c[k+4>>2]=D;vc(5882,d)|0;l=a;return}else{d=xb(e)|0;e=D;k=yb(c[2168]|0)|0;m=b;c[m>>2]=g;c[m+4>>2]=h;h=b+8|0;c[h>>2]=d;c[h+4>>2]=e;e=b+16|0;c[e>>2]=k;c[e+4>>2]=D;vc(5933,b)|0;b=c[2168]|0;e=b+24|0;k=c[e>>2]|0;h=c[e+4>>2]|0;Cb(b);b=(c[2168]|0)+16|0;c[b>>2]=k;c[b+4>>2]=h;ka(k|0,h|0);l=a;return}}function mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=Ab(c)|0;e=D;if((e|0)<0|(e|0)==0&d>>>0<b>>>0){f=0;return f|0}d=(Eb(c,a,b)|0)==0;f=d?1:-1;return f|0}function nb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;switch(d|0){case 0:{f=a;g=b;break}case 1:{d=e+16|0;f=Kc(c[d>>2]|0,c[d+4>>2]|0,a|0,b|0)|0;g=D;break}default:{h=-1;return h|0}}if(!(Bb(e,f,g)|0)){h=0;return h|0}wc(6089)|0;h=-1;return h|0}function ob(a){a=a|0;var b=0;b=zb(a)|0;return b|0}function pb(){Fb(c[2168]|0);c[2168]=0;return}function qb(){Cb(c[2168]|0);h[344]=-1.0;return}function rb(){return -1}function sb(){var a=0,b=0,d=0.0,e=0;a=l;l=l+16|0;b=a;if((Ia(c[2169]|0,b)|0)<0){d=-1.0;l=a;return +d}e=b;d=(+((c[e>>2]|0)>>>0)+4294967296.0*+((c[e+4>>2]|0)>>>0))/1.0e9;l=a;return +d}function tb(){return _a(c[2169]|0)|0}function ub(a){a=a|0;return -1}function vb(b){b=b|0;var d=0,e=0,f=0;c[2167]=2;d=Pc(b|0,((b|0)<0)<<31>>31|0,1e6,0)|0;b=8648;c[b>>2]=d;c[b+4>>2]=D;if(!(a[9261]|0))if(!(a[9262]|0)){e=0;return e|0}else f=8688;else f=8680;c[2174]=c[f>>2];lb();e=1;return e|0}function wb(){var a=0,b=0;a=yc(32)|0;b=a+16|0;c[b>>2]=0;c[b+4>>2]=0;c[a+4>>2]=0;c[a+8>>2]=8;c[a>>2]=yc(192)|0;return a|0}function xb(a){a=a|0;var b=0;if(!(c[a+4>>2]|0))b=a+16|0;else b=(c[a>>2]|0)+8|0;a=b;D=c[a+4>>2]|0;return c[a>>2]|0}function yb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=c[a+4>>2]|0;if(!b){d=a+16|0;e=c[d+4>>2]|0;f=c[d>>2]|0;D=e;return f|0}else{d=c[a>>2]|0;a=b+-1|0;b=d+(a*24|0)+8|0;g=Kc(c[d+(a*24|0)+16>>2]|0,0,c[b>>2]|0,c[b+4>>2]|0)|0;e=D;f=g;D=e;return f|0}return 0}function zb(a){a=a|0;var b=0;b=a+16|0;D=c[b+4>>2]|0;return c[b>>2]|0}function Ab(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=c[a+4>>2]|0;if(!b){d=a+16|0;e=c[d>>2]|0;f=c[d+4>>2]|0;g=e;h=f;i=e;j=f;k=Fc(g|0,h|0,i|0,j|0)|0;l=D;D=l;return k|0}else{f=c[a>>2]|0;e=b+-1|0;b=f+(e*24|0)+8|0;d=Kc(c[f+(e*24|0)+16>>2]|0,0,c[b>>2]|0,c[b+4>>2]|0)|0;b=a+16|0;g=d;h=D;i=c[b>>2]|0;j=c[b+4>>2]|0;k=Fc(g|0,h|0,i|0,j|0)|0;l=D;D=l;return k|0}return 0}function Bb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=l;l=l+16|0;f=e+8|0;g=e;h=c[a+4>>2]|0;i=(h|0)==0;if(i)j=a+16|0;else j=(c[a>>2]|0)+8|0;k=j;j=c[k+4>>2]|0;if((j|0)>(d|0)|((j|0)==(d|0)?(c[k>>2]|0)>>>0>b>>>0:0)){k=g;c[k>>2]=b;c[k+4>>2]=d;vc(6125,g)|0;m=a+24|0;n=-1;o=m;p=o;c[p>>2]=b;q=o+4|0;r=q;c[r>>2]=d;l=e;return n|0}if(i){i=a+16|0;s=c[i+4>>2]|0;t=c[i>>2]|0}else{i=c[a>>2]|0;g=h+-1|0;h=i+(g*24|0)+8|0;k=Kc(c[i+(g*24|0)+16>>2]|0,0,c[h>>2]|0,c[h+4>>2]|0)|0;s=D;t=k}if((s|0)<(d|0)|(s|0)==(d|0)&t>>>0<b>>>0){t=f;c[t>>2]=b;c[t+4>>2]=d;vc(6125,f)|0;m=a+24|0;n=-1;o=m;p=o;c[p>>2]=b;q=o+4|0;r=q;c[r>>2]=d;l=e;return n|0}else{m=a+16|0;n=0;o=m;p=o;c[p>>2]=b;q=o+4|0;r=q;c[r>>2]=d;l=e;return n|0}return 0}function Cb(a){a=a|0;var b=0,d=0,e=0;b=a+4|0;if(!(c[b>>2]|0)){c[b>>2]=0;return}d=c[a>>2]|0;e=0;do{zc(c[d+(e*24|0)>>2]|0);d=c[a>>2]|0;c[d+(e*24|0)>>2]=0;e=e+1|0}while(e>>>0<(c[b>>2]|0)>>>0);c[b>>2]=0;return}function Db(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;do if((f|0)==(c[g>>2]|0))if(!f)h=0;else{i=a+16|0;j=c[a>>2]|0;k=f;l=0;while(1){m=j+(l*24|0)+8|0;n=Kc(c[j+(l*24|0)+16>>2]|0,0,c[m>>2]|0,c[m+4>>2]|0)|0;m=D;o=i;p=c[o+4>>2]|0;if(!((m|0)<(p|0)|((m|0)==(p|0)?n>>>0<(c[o>>2]|0)>>>0:0))){q=6;break}zc(c[j+(l*24|0)>>2]|0);o=c[a>>2]|0;c[o+(l*24|0)>>2]=0;n=l+1|0;p=c[e>>2]|0;if(n>>>0<p>>>0){j=o;k=p;l=n}else{r=p;s=o;t=n;break}}if((q|0)==6)if(!l){h=k;break}else{r=k;s=j;t=l}i=r-t|0;c[e>>2]=i;Qc(s|0,s+(t*24|0)|0,i*24|0)|0;h=c[e>>2]|0}else h=f;while(0);f=c[g>>2]|0;t=f+8|0;if((h|0)==(f|0)){c[g>>2]=t;c[a>>2]=Bc(c[a>>2]|0,t*24|0)|0;u=c[e>>2]|0}else u=h;if(!u){h=a+16|0;v=c[a>>2]|0;w=c[h>>2]|0;x=c[h+4>>2]|0;y=v+(u*24|0)+8|0;z=y;A=z;c[A>>2]=w;B=z+4|0;C=B;c[C>>2]=x;E=v+(u*24|0)+16|0;c[E>>2]=d;F=yc(d)|0;G=v+(u*24|0)|0;c[G>>2]=F;Jc(F|0,b|0,d|0)|0;H=c[e>>2]|0;I=H+1|0;c[e>>2]=I;return}else{h=c[a>>2]|0;a=u+-1|0;t=h+(a*24|0)+8|0;g=Kc(c[h+(a*24|0)+16>>2]|0,0,c[t>>2]|0,c[t+4>>2]|0)|0;v=h;w=g;x=D;y=v+(u*24|0)+8|0;z=y;A=z;c[A>>2]=w;B=z+4|0;C=B;c[C>>2]=x;E=v+(u*24|0)+16|0;c[E>>2]=d;F=yc(d)|0;G=v+(u*24|0)|0;c[G>>2]=F;Jc(F|0,b|0,d|0)|0;H=c[e>>2]|0;I=H+1|0;c[e>>2]=I;return}}function Eb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;e=l;l=l+32|0;f=e+16|0;g=e;h=a+4|0;i=c[h>>2]|0;j=(i|0)==0;k=a+16|0;m=k;n=c[m>>2]|0;o=c[m+4>>2]|0;if(j){p=n;q=o}else{m=c[a>>2]|0;r=i+-1|0;s=m+(r*24|0)+8|0;t=Kc(c[m+(r*24|0)+16>>2]|0,0,c[s>>2]|0,c[s+4>>2]|0)|0;p=t;q=D}t=Fc(p|0,q|0,n|0,o|0)|0;q=D;if((q|0)<0|(q|0)==0&t>>>0<d>>>0){c[g>>2]=d;t=g+8|0;c[t>>2]=n;c[t+4>>2]=o;vc(6149,g)|0;u=-1;l=e;return u|0}a:do if(j){v=n;w=o}else{g=o;t=n;q=i;p=0;s=0;r=d;while(1){m=c[a>>2]|0;x=m+(p*24|0)+8|0;y=c[x>>2]|0;z=c[x+4>>2]|0;x=c[m+(p*24|0)+16>>2]|0;A=Kc(x|0,0,y|0,z|0)|0;B=D;if((B|0)<(g|0)|(B|0)==(g|0)&A>>>0<t>>>0){C=q;E=t;F=g;G=s;H=r}else{A=Fc(t|0,g|0,y|0,z|0)|0;z=x-A|0;x=z>>>0>r>>>0?r:z;Jc(b+s|0,(c[m+(p*24|0)>>2]|0)+A|0,x|0)|0;A=k;m=Kc(c[A>>2]|0,c[A+4>>2]|0,x|0,0)|0;A=D;z=k;c[z>>2]=m;c[z+4>>2]=A;z=r-x|0;if(!z){u=0;break}C=c[h>>2]|0;E=m;F=A;G=x+s|0;H=z}p=p+1|0;if(p>>>0>=C>>>0){v=E;w=F;break a}else{g=F;t=E;q=C;s=G;r=H}}l=e;return u|0}while(0);c[f>>2]=d;d=f+8|0;c[d>>2]=v;c[d+4>>2]=w;vc(6184,f)|0;u=-1;l=e;return u|0}function Fb(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+4|0;if(!(c[b>>2]|0)){d=c[a>>2]|0;c[b>>2]=0;zc(d);zc(a);return}e=c[a>>2]|0;f=0;do{zc(c[e+(f*24|0)>>2]|0);e=c[a>>2]|0;c[e+(f*24|0)>>2]=0;f=f+1|0}while(f>>>0<(c[b>>2]|0)>>>0);d=e;c[b>>2]=0;zc(d);zc(a);return}function Gb(){return 8700}function Hb(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Ob(c[a+60>>2]|0)|0;a=Kb(ga(6,d|0)|0)|0;l=b;return a|0}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=l;l=l+48|0;f=e+16|0;g=e;h=e+32|0;i=a+28|0;j=c[i>>2]|0;c[h>>2]=j;k=a+20|0;m=(c[k>>2]|0)-j|0;c[h+4>>2]=m;c[h+8>>2]=b;c[h+12>>2]=d;b=m+d|0;m=a+60|0;c[g>>2]=c[m>>2];c[g+4>>2]=h;c[g+8>>2]=2;j=Kb(pa(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=j;n=h;o=2;p=b;while(1){if((g|0)<0)break;p=p-g|0;q=c[n+4>>2]|0;r=g>>>0>q>>>0;s=r?n+8|0:n;t=(r<<31>>31)+o|0;u=g-(r?q:0)|0;c[s>>2]=(c[s>>2]|0)+u;q=s+4|0;c[q>>2]=(c[q>>2]|0)-u;c[f>>2]=c[m>>2];c[f+4>>2]=s;c[f+8>>2]=t;g=Kb(pa(146,f|0)|0)|0;if((p|0)==(g|0)){v=3;break a}else{n=s;o=t}}c[a+16>>2]=0;c[i>>2]=0;c[k>>2]=0;c[a>>2]=c[a>>2]|32;if((o|0)==2)w=0;else w=d-(c[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=c[a+44>>2]|0;c[a+16>>2]=v+(c[a+48>>2]|0);c[i>>2]=v;c[k>>2]=v;w=d}l=e;return w|0}function Jb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+32|0;f=e;g=e+20|0;c[f>>2]=c[a+60>>2];c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=g;c[f+16>>2]=d;if((Kb(ja(140,f|0)|0)|0)<0){c[g>>2]=-1;h=-1}else h=c[g>>2]|0;l=e;return h|0}function Kb(a){a=a|0;var b=0;if(a>>>0>4294963200){c[(Lb()|0)>>2]=0-a;b=-1}else b=a;return b|0}function Lb(){return (Mb()|0)+64|0}function Mb(){return Nb()|0}function Nb(){return 2780}function Ob(a){a=a|0;return a|0}function Pb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[b+36>>2]=4;if((c[b>>2]&64|0)==0?(c[g>>2]=c[b+60>>2],c[g+4>>2]=21523,c[g+8>>2]=f+16,ma(54,g|0)|0):0)a[b+75>>0]=-1;g=Ib(b,d,e)|0;l=f;return g|0}function Qb(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=b;b=c;do{d=d+1|0;b=b+1|0;c=a[d>>0]|0;e=a[b>>0]|0}while(!(c<<24>>24==0?1:c<<24>>24!=e<<24>>24));f=e;g=c}return (g&255)-(f&255)|0}function Rb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=l;l=l+224|0;g=f+120|0;h=f+80|0;i=f;j=f+136|0;k=h;m=k+40|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));c[g>>2]=c[e>>2];if((Sb(0,d,g,i,h)|0)<0)n=-1;else{if((c[b+76>>2]|0)>-1)o=Tb(b)|0;else o=0;e=c[b>>2]|0;k=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){m=b+44|0;p=c[m>>2]|0;c[m>>2]=j;q=b+28|0;c[q>>2]=j;r=b+20|0;c[r>>2]=j;c[e>>2]=80;s=b+16|0;c[s>>2]=j+80;j=Sb(b,d,g,i,h)|0;if(!p)t=j;else{ta[c[b+36>>2]&7](b,0,0)|0;u=(c[r>>2]|0)==0?-1:j;c[m>>2]=p;c[e>>2]=0;c[s>>2]=0;c[q>>2]=0;c[r>>2]=0;t=u}}else t=Sb(b,d,g,i,h)|0;h=c[b>>2]|0;c[b>>2]=h|k;if(o|0)Ub(b);n=(h&32|0)==0?t:-1}l=f;return n|0}function Sb(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;j=l;l=l+64|0;k=j+16|0;m=j;n=j+24|0;o=j+8|0;p=j+20|0;c[k>>2]=e;q=(d|0)!=0;r=n+40|0;s=r;t=n+39|0;n=o+4|0;u=e;e=0;v=0;w=0;a:while(1){do if((e|0)>-1)if((v|0)>(2147483647-e|0)){c[(Lb()|0)>>2]=75;x=-1;break}else{x=v+e|0;break}else x=e;while(0);y=a[u>>0]|0;if(!(y<<24>>24)){z=87;break}else{A=y;B=u}b:while(1){switch(A<<24>>24){case 37:{C=B;E=B;z=9;break b;break}case 0:{F=B;G=B;break b;break}default:{}}y=B+1|0;c[k>>2]=y;A=a[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((a[C+1>>0]|0)!=37){F=C;G=E;break c}y=E+1|0;H=C+2|0;c[k>>2]=H;if((a[H>>0]|0)==37){C=H;E=y;z=9}else{F=H;G=y;break}}while(0);y=G-u|0;if(q)Vb(d,u,y);if(y|0){u=F;e=x;v=y;continue}y=F+1|0;H=(a[y>>0]|0)+-48|0;if(H>>>0<10){I=(a[F+2>>0]|0)==36;J=I?H:-1;K=I?1:w;L=I?F+3|0:y}else{J=-1;K=w;L=y}c[k>>2]=L;y=a[L>>0]|0;I=(y<<24>>24)+-32|0;d:do if(I>>>0<32){H=y;M=0;N=L;O=I;while(1){P=1<<O;if(!(P&75913)){Q=H;R=N;S=M;break d}T=P|M;P=N+1|0;c[k>>2]=P;U=a[P>>0]|0;O=(U<<24>>24)+-32|0;if(O>>>0>=32){Q=U;R=P;S=T;break}else{H=U;M=T;N=P}}}else{Q=y;R=L;S=0}while(0);if(Q<<24>>24==42){y=R+1|0;I=(a[y>>0]|0)+-48|0;if(I>>>0<10?(a[R+2>>0]|0)==36:0){c[i+(I<<2)>>2]=10;V=1;W=R+3|0;X=c[g+((a[y>>0]|0)+-48<<3)>>2]|0}else{if(K|0){Y=-1;break}if(q){I=(c[f>>2]|0)+(4-1)&~(4-1);N=c[I>>2]|0;c[f>>2]=I+4;V=0;W=y;X=N}else{V=0;W=y;X=0}}c[k>>2]=W;y=(X|0)<0;Z=W;_=y?S|8192:S;$=V;aa=y?0-X|0:X}else{y=Wb(k)|0;if((y|0)<0){Y=-1;break}Z=c[k>>2]|0;_=S;$=K;aa=y}do if((a[Z>>0]|0)==46){if((a[Z+1>>0]|0)!=42){c[k>>2]=Z+1;y=Wb(k)|0;ba=c[k>>2]|0;ca=y;break}y=Z+2|0;N=(a[y>>0]|0)+-48|0;if(N>>>0<10?(a[Z+3>>0]|0)==36:0){c[i+(N<<2)>>2]=10;N=c[g+((a[y>>0]|0)+-48<<3)>>2]|0;I=Z+4|0;c[k>>2]=I;ba=I;ca=N;break}if($|0){Y=-1;break a}if(q){N=(c[f>>2]|0)+(4-1)&~(4-1);I=c[N>>2]|0;c[f>>2]=N+4;da=I}else da=0;c[k>>2]=y;ba=y;ca=da}else{ba=Z;ca=-1}while(0);y=ba;I=0;while(1){if(((a[y>>0]|0)+-65|0)>>>0>57){Y=-1;break a}ea=y+1|0;c[k>>2]=ea;fa=a[(a[y>>0]|0)+-65+(6221+(I*58|0))>>0]|0;ga=fa&255;if((ga+-1|0)>>>0<8){y=ea;I=ga}else break}if(!(fa<<24>>24)){Y=-1;break}N=(J|0)>-1;do if(fa<<24>>24==19)if(N){Y=-1;break a}else z=49;else{if(N){c[i+(J<<2)>>2]=ga;M=g+(J<<3)|0;H=c[M+4>>2]|0;O=m;c[O>>2]=c[M>>2];c[O+4>>2]=H;z=49;break}if(!q){Y=0;break a}Xb(m,ga,f)}while(0);if((z|0)==49?(z=0,!q):0){u=ea;e=x;v=0;w=$;continue}N=a[y>>0]|0;H=(I|0)!=0&(N&15|0)==3?N&-33:N;N=_&-65537;O=(_&8192|0)==0?_:N;e:do switch(H|0){case 110:{switch((I&255)<<24>>24){case 0:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 1:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 2:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}case 3:{b[c[m>>2]>>1]=x;u=ea;e=x;v=0;w=$;continue a;break}case 4:{a[c[m>>2]>>0]=x;u=ea;e=x;v=0;w=$;continue a;break}case 6:{c[c[m>>2]>>2]=x;u=ea;e=x;v=0;w=$;continue a;break}case 7:{M=c[m>>2]|0;c[M>>2]=x;c[M+4>>2]=((x|0)<0)<<31>>31;u=ea;e=x;v=0;w=$;continue a;break}default:{u=ea;e=x;v=0;w=$;continue a}}break}case 112:{ha=O|8;ia=ca>>>0>8?ca:8;ja=120;z=61;break}case 88:case 120:{ha=O;ia=ca;ja=H;z=61;break}case 111:{M=m;P=c[M>>2]|0;T=c[M+4>>2]|0;M=Zb(P,T,r)|0;U=s-M|0;ka=P;la=T;ma=M;na=O;oa=(O&8|0)==0|(ca|0)>(U|0)?ca:U+1|0;pa=0;qa=6685;z=67;break}case 105:case 100:{U=m;M=c[U>>2]|0;T=c[U+4>>2]|0;if((T|0)<0){U=Fc(0,0,M|0,T|0)|0;P=D;ra=m;c[ra>>2]=U;c[ra+4>>2]=P;sa=U;ta=P;ua=1;va=6685;z=66;break e}else{sa=M;ta=T;ua=(O&2049|0)!=0&1;va=(O&2048|0)==0?((O&1|0)==0?6685:6687):6686;z=66;break e}break}case 117:{T=m;sa=c[T>>2]|0;ta=c[T+4>>2]|0;ua=0;va=6685;z=66;break}case 99:{a[t>>0]=c[m>>2];wa=t;xa=N;ya=1;za=0;Aa=6685;Ba=r;break}case 109:{Ca=$b(c[(Lb()|0)>>2]|0)|0;z=71;break}case 115:{T=c[m>>2]|0;Ca=T|0?T:6695;z=71;break}case 67:{c[o>>2]=c[m>>2];c[n>>2]=0;c[m>>2]=o;Da=o;Ea=-1;z=75;break}case 83:{T=c[m>>2]|0;if(!ca){bc(d,32,aa,0,O);Fa=0;z=84}else{Da=T;Ea=ca;z=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{u=ea;e=x;v=dc(d,+h[m>>3],aa,ca,O,H)|0;w=$;continue a;break}default:{wa=u;xa=O;ya=ca;za=0;Aa=6685;Ba=r}}while(0);f:do if((z|0)==61){z=0;H=m;I=c[H>>2]|0;y=c[H+4>>2]|0;H=Yb(I,y,r,ja&32)|0;T=(ha&8|0)==0|(I|0)==0&(y|0)==0;ka=I;la=y;ma=H;na=ha;oa=ia;pa=T?0:2;qa=T?6685:6685+(ja>>4)|0;z=67}else if((z|0)==66){z=0;ka=sa;la=ta;ma=_b(sa,ta,r)|0;na=O;oa=ca;pa=ua;qa=va;z=67}else if((z|0)==71){z=0;T=ac(Ca,0,ca)|0;H=(T|0)==0;wa=Ca;xa=N;ya=H?ca:T-Ca|0;za=0;Aa=6685;Ba=H?Ca+ca|0:T}else if((z|0)==75){z=0;T=0;H=0;y=Da;while(1){I=c[y>>2]|0;if(!I){Ga=T;Ha=H;break}M=cc(p,I)|0;if((M|0)<0|M>>>0>(Ea-T|0)>>>0){Ga=T;Ha=M;break}I=M+T|0;if(Ea>>>0>I>>>0){T=I;H=M;y=y+4|0}else{Ga=I;Ha=M;break}}if((Ha|0)<0){Y=-1;break a}bc(d,32,aa,Ga,O);if(!Ga){Fa=0;z=84}else{y=0;H=Da;while(1){T=c[H>>2]|0;if(!T){Fa=Ga;z=84;break f}M=cc(p,T)|0;y=M+y|0;if((y|0)>(Ga|0)){Fa=Ga;z=84;break f}Vb(d,p,M);if(y>>>0>=Ga>>>0){Fa=Ga;z=84;break}else H=H+4|0}}}while(0);if((z|0)==67){z=0;N=(ka|0)!=0|(la|0)!=0;H=(oa|0)!=0|N;y=((N^1)&1)+(s-ma)|0;wa=H?ma:r;xa=(oa|0)>-1?na&-65537:na;ya=H?((oa|0)>(y|0)?oa:y):oa;za=pa;Aa=qa;Ba=r}else if((z|0)==84){z=0;bc(d,32,aa,Fa,O^8192);u=ea;e=x;v=(aa|0)>(Fa|0)?aa:Fa;w=$;continue}y=Ba-wa|0;H=(ya|0)<(y|0)?y:ya;N=H+za|0;M=(aa|0)<(N|0)?N:aa;bc(d,32,M,N,xa);Vb(d,Aa,za);bc(d,48,M,N,xa^65536);bc(d,48,H,y,0);Vb(d,wa,y);bc(d,32,M,N,xa^8192);u=ea;e=x;v=M;w=$}g:do if((z|0)==87)if(!d)if(!w)Y=0;else{$=1;while(1){v=c[i+($<<2)>>2]|0;if(!v){Ia=$;break}Xb(g+($<<3)|0,v,f);$=$+1|0;if(($|0)>=10){Y=1;break g}}while(1){if(c[i+(Ia<<2)>>2]|0){Y=-1;break g}Ia=Ia+1|0;if((Ia|0)>=10){Y=1;break}}}else Y=x;while(0);l=j;return Y|0}function Tb(a){a=a|0;return 0}function Ub(a){a=a|0;return}function Vb(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))pc(b,d,a)|0;return}function Wb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;e=(a[d>>0]|0)+-48|0;if(e>>>0<10){f=d;d=0;g=e;while(1){e=g+(d*10|0)|0;f=f+1|0;c[b>>2]=f;g=(a[f>>0]|0)+-48|0;if(g>>>0>=10){h=e;break}else d=e}}else h=0;return h|0}function Xb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f;break a;break}case 10:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a;break}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=f;c[e+4>>2]=0;break a;break}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);f=e;g=c[f>>2]|0;i=c[f+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=g;c[e+4>>2]=i;break a;break}case 13:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&65535)<<16>>16;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 14:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&65535;c[i+4>>2]=0;break a;break}case 15:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=(e&255)<<24>>24;e=a;c[e>>2]=i;c[e+4>>2]=((i|0)<0)<<31>>31;break a;break}case 16:{i=(c[d>>2]|0)+(4-1)&~(4-1);e=c[i>>2]|0;c[d>>2]=i+4;i=a;c[i>>2]=e&255;c[i+4>>2]=0;break a;break}case 17:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}case 18:{i=(c[d>>2]|0)+(8-1)&~(8-1);j=+h[i>>3];c[d>>2]=i+8;h[a>>3]=j;break a;break}default:break a}while(0);while(0);return}function Yb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==0&(c|0)==0)g=e;else{h=b;b=c;c=e;while(1){e=c+-1|0;a[e>>0]=d[6737+(h&15)>>0]|0|f;h=Hc(h|0,b|0,4)|0;b=D;if((h|0)==0&(b|0)==0){g=e;break}else c=e}}return g|0}function Zb(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((b|0)==0&(c|0)==0)e=d;else{f=b;b=c;c=d;while(1){d=c+-1|0;a[d>>0]=f&7|48;f=Hc(f|0,b|0,3)|0;b=D;if((f|0)==0&(b|0)==0){e=d;break}else c=d}}return e|0}function _b(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){e=b;f=c;c=d;while(1){g=Rc(e|0,f|0,10,0)|0;c=c+-1|0;a[c>>0]=g&255|48;g=e;e=Nc(e|0,f|0,10,0)|0;if(!(f>>>0>9|(f|0)==9&g>>>0>4294967295))break;else f=D}h=c;i=e}else{h=d;i=b}if(!i)j=h;else{b=h;h=i;while(1){i=b+-1|0;a[i>>0]=(h>>>0)%10|0|48;if(h>>>0<10){j=i;break}else{b=i;h=(h>>>0)/10|0}}}return j|0}function $b(a){a=a|0;return kc(a,c[(jc()|0)+188>>2]|0)|0}function ac(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=d&255;g=(e|0)!=0;a:do if(g&(b&3|0)!=0){h=d&255;i=e;j=b;while(1){if((a[j>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=j+1|0;o=i+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=o;j=n}else{q=o;r=n;s=p;m=5;break}}}else{q=e;r=b;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=0;u=r}b:do if((m|0)==6){r=d&255;if((a[l>>0]|0)==r<<24>>24){t=k;u=l}else{q=S(f,16843009)|0;c:do if(k>>>0>3){s=k;g=l;while(1){b=c[g>>2]^q;if((b&-2139062144^-2139062144)&b+-16843009|0)break;b=g+4|0;e=s+-4|0;if(e>>>0>3){s=e;g=b}else{v=e;w=b;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!v){t=0;u=w;break}else{x=v;y=w}while(1){if((a[y>>0]|0)==r<<24>>24){t=x;u=y;break b}q=y+1|0;x=x+-1|0;if(!x){t=0;u=q;break}else y=q}}}while(0);return (t|0?u:0)|0}function bc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Gc(g|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{Vb(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;Vb(a,g,h)}l=f;return}function cc(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=hc(a,b,0)|0;return c|0}function dc(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;j=l;l=l+560|0;k=j+8|0;m=j;n=j+524|0;o=n;p=j+512|0;c[m>>2]=0;q=p+12|0;ec(e)|0;if((D|0)<0){r=1;s=6702;t=-e}else{r=(h&2049|0)!=0&1;s=(h&2048|0)==0?((h&1|0)==0?6703:6708):6705;t=e}ec(t)|0;u=D&2146435072;do if(u>>>0<2146435072|(u|0)==2146435072&0<0){e=+fc(t,m)*2.0;v=e!=0.0;if(v)c[m>>2]=(c[m>>2]|0)+-1;w=i|32;if((w|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-g|0;do if(!(g>>>0>11|(A|0)==0)){B=A;C=8.0;do{B=B+-1|0;C=C*16.0}while((B|0)!=0);if((a[y>>0]|0)==45){E=-(C+(-e-C));break}else{E=e+C-C;break}}else E=e;while(0);A=c[m>>2]|0;B=(A|0)<0?0-A|0:A;F=_b(B,((B|0)<0)<<31>>31,q)|0;if((F|0)==(q|0)){B=p+11|0;a[B>>0]=48;G=B}else G=F;a[G+-1>>0]=(A>>31&2)+43;A=G+-2|0;a[A>>0]=i+15;F=(g|0)<1;B=(h&8|0)==0;H=n;I=E;while(1){J=~~I;K=H+1|0;a[H>>0]=d[6737+J>>0]|x;I=(I-+(J|0))*16.0;if((K-o|0)==1?!(B&(F&I==0.0)):0){a[K>>0]=46;L=H+2|0}else L=K;if(!(I!=0.0))break;else H=L}H=L-o|0;F=q-A|0;B=(g|0)!=0&(H+-2|0)<(g|0)?g+2|0:H;x=F+z+B|0;bc(b,32,f,x,h);Vb(b,y,z);bc(b,48,f,x,h^65536);Vb(b,n,H);bc(b,48,B-H|0,0,0);Vb(b,A,F);bc(b,32,f,x,h^8192);M=x;break}x=(g|0)<0?6:g;if(v){F=(c[m>>2]|0)+-28|0;c[m>>2]=F;N=F;O=e*268435456.0}else{N=c[m>>2]|0;O=e}F=(N|0)<0?k:k+288|0;I=O;H=F;do{B=~~I>>>0;c[H>>2]=B;H=H+4|0;I=(I-+(B>>>0))*1.0e9}while(I!=0.0);if((N|0)>0){v=N;A=F;z=H;while(1){y=(v|0)<29?v:29;B=z+-4|0;if(B>>>0>=A>>>0){K=0;J=B;do{B=Ic(c[J>>2]|0,0,y|0)|0;P=Kc(B|0,D|0,K|0,0)|0;B=D;Q=Rc(P|0,B|0,1e9,0)|0;c[J>>2]=Q;K=Nc(P|0,B|0,1e9,0)|0;J=J+-4|0}while(J>>>0>=A>>>0);if(K){J=A+-4|0;c[J>>2]=K;R=J}else R=A}else R=A;J=z;while(1){if(J>>>0<=R>>>0)break;B=J+-4|0;if(!(c[B>>2]|0))J=B;else break}K=(c[m>>2]|0)-y|0;c[m>>2]=K;if((K|0)>0){v=K;A=R;z=J}else{T=K;U=R;V=J;break}}}else{T=N;U=F;V=H}if((T|0)<0){z=((x+25|0)/9|0)+1|0;A=(w|0)==102;v=T;K=U;B=V;while(1){P=0-v|0;Q=(P|0)<9?P:9;if(K>>>0<B>>>0){P=(1<<Q)+-1|0;W=1e9>>>Q;X=0;Y=K;do{Z=c[Y>>2]|0;c[Y>>2]=(Z>>>Q)+X;X=S(Z&P,W)|0;Y=Y+4|0}while(Y>>>0<B>>>0);Y=(c[K>>2]|0)==0?K+4|0:K;if(!X){_=Y;$=B}else{c[B>>2]=X;_=Y;$=B+4|0}}else{_=(c[K>>2]|0)==0?K+4|0:K;$=B}Y=A?F:_;W=($-Y>>2|0)>(z|0)?Y+(z<<2)|0:$;v=(c[m>>2]|0)+Q|0;c[m>>2]=v;if((v|0)>=0){aa=_;ba=W;break}else{K=_;B=W}}}else{aa=U;ba=V}B=F;if(aa>>>0<ba>>>0){K=(B-aa>>2)*9|0;v=c[aa>>2]|0;if(v>>>0<10)ca=K;else{z=K;K=10;while(1){K=K*10|0;A=z+1|0;if(v>>>0<K>>>0){ca=A;break}else z=A}}}else ca=0;z=(w|0)==103;K=(x|0)!=0;v=x-((w|0)!=102?ca:0)+((K&z)<<31>>31)|0;if((v|0)<(((ba-B>>2)*9|0)+-9|0)){A=v+9216|0;v=F+4+(((A|0)/9|0)+-1024<<2)|0;H=((A|0)%9|0)+1|0;if((H|0)<9){A=10;W=H;while(1){H=A*10|0;W=W+1|0;if((W|0)==9){da=H;break}else A=H}}else da=10;A=c[v>>2]|0;W=(A>>>0)%(da>>>0)|0;w=(v+4|0)==(ba|0);if(!(w&(W|0)==0)){C=(((A>>>0)/(da>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;H=(da|0)/2|0;I=W>>>0<H>>>0?.5:w&(W|0)==(H|0)?1.0:1.5;if(!r){ea=C;fa=I}else{H=(a[s>>0]|0)==45;ea=H?-C:C;fa=H?-I:I}H=A-W|0;c[v>>2]=H;if(ea+fa!=ea){W=H+da|0;c[v>>2]=W;if(W>>>0>999999999){W=aa;H=v;while(1){A=H+-4|0;c[H>>2]=0;if(A>>>0<W>>>0){w=W+-4|0;c[w>>2]=0;ga=w}else ga=W;w=(c[A>>2]|0)+1|0;c[A>>2]=w;if(w>>>0>999999999){W=ga;H=A}else{ha=ga;ia=A;break}}}else{ha=aa;ia=v}H=(B-ha>>2)*9|0;W=c[ha>>2]|0;if(W>>>0<10){ja=ha;ka=ia;la=H}else{A=H;H=10;while(1){H=H*10|0;w=A+1|0;if(W>>>0<H>>>0){ja=ha;ka=ia;la=w;break}else A=w}}}else{ja=aa;ka=v;la=ca}}else{ja=aa;ka=v;la=ca}A=ka+4|0;ma=ja;na=la;oa=ba>>>0>A>>>0?A:ba}else{ma=aa;na=ca;oa=ba}A=oa;while(1){if(A>>>0<=ma>>>0){pa=0;break}H=A+-4|0;if(!(c[H>>2]|0))A=H;else{pa=1;break}}v=0-na|0;do if(z){H=((K^1)&1)+x|0;if((H|0)>(na|0)&(na|0)>-5){qa=H+-1-na|0;ra=i+-1|0}else{qa=H+-1|0;ra=i+-2|0}H=h&8;if(!H){if(pa?(W=c[A+-4>>2]|0,(W|0)!=0):0)if(!((W>>>0)%10|0)){w=10;Y=0;while(1){w=w*10|0;P=Y+1|0;if((W>>>0)%(w>>>0)|0|0){sa=P;break}else Y=P}}else sa=0;else sa=9;Y=((A-B>>2)*9|0)+-9|0;if((ra|32|0)==102){w=Y-sa|0;W=(w|0)>0?w:0;ta=0;ua=(qa|0)<(W|0)?qa:W;va=ra;break}else{W=Y+na-sa|0;Y=(W|0)>0?W:0;ta=0;ua=(qa|0)<(Y|0)?qa:Y;va=ra;break}}else{ta=H;ua=qa;va=ra}}else{ta=h&8;ua=x;va=i}while(0);x=ua|ta;B=(x|0)!=0&1;K=(va|32|0)==102;if(K){wa=0;xa=(na|0)>0?na:0}else{z=(na|0)<0?v:na;Y=_b(z,((z|0)<0)<<31>>31,q)|0;z=q;if((z-Y|0)<2){W=Y;while(1){w=W+-1|0;a[w>>0]=48;if((z-w|0)<2)W=w;else{ya=w;break}}}else ya=Y;a[ya+-1>>0]=(na>>31&2)+43;W=ya+-2|0;a[W>>0]=va;wa=W;xa=z-W|0}W=r+1+ua+B+xa|0;bc(b,32,f,W,h);Vb(b,s,r);bc(b,48,f,W,h^65536);if(K){v=ma>>>0>F>>>0?F:ma;w=n+9|0;Q=w;X=n+8|0;P=v;do{J=_b(c[P>>2]|0,0,w)|0;if((P|0)==(v|0))if((J|0)==(w|0)){a[X>>0]=48;za=X}else za=J;else if(J>>>0>n>>>0){Gc(n|0,48,J-o|0)|0;y=J;while(1){Z=y+-1|0;if(Z>>>0>n>>>0)y=Z;else{za=Z;break}}}else za=J;Vb(b,za,Q-za|0);P=P+4|0}while(P>>>0<=F>>>0);if(x|0)Vb(b,6753,1);if(P>>>0<A>>>0&(ua|0)>0){F=P;Q=ua;while(1){X=_b(c[F>>2]|0,0,w)|0;if(X>>>0>n>>>0){Gc(n|0,48,X-o|0)|0;v=X;while(1){K=v+-1|0;if(K>>>0>n>>>0)v=K;else{Aa=K;break}}}else Aa=X;Vb(b,Aa,(Q|0)<9?Q:9);F=F+4|0;v=Q+-9|0;if(!(F>>>0<A>>>0&(Q|0)>9)){Ba=v;break}else Q=v}}else Ba=ua;bc(b,48,Ba+9|0,9,0)}else{Q=pa?A:ma+4|0;if((ua|0)>-1){F=n+9|0;w=(ta|0)==0;P=F;x=0-o|0;v=n+8|0;J=ma;K=ua;while(1){B=_b(c[J>>2]|0,0,F)|0;if((B|0)==(F|0)){a[v>>0]=48;Ca=v}else Ca=B;do if((J|0)==(ma|0)){B=Ca+1|0;Vb(b,Ca,1);if(w&(K|0)<1){Da=B;break}Vb(b,6753,1);Da=B}else{if(Ca>>>0<=n>>>0){Da=Ca;break}Gc(n|0,48,Ca+x|0)|0;B=Ca;while(1){z=B+-1|0;if(z>>>0>n>>>0)B=z;else{Da=z;break}}}while(0);X=P-Da|0;Vb(b,Da,(K|0)>(X|0)?X:K);B=K-X|0;J=J+4|0;if(!(J>>>0<Q>>>0&(B|0)>-1)){Ea=B;break}else K=B}}else Ea=ua;bc(b,48,Ea+18|0,18,0);Vb(b,wa,q-wa|0)}bc(b,32,f,W,h^8192);M=W}else{K=(i&32|0)!=0;Q=r+3|0;bc(b,32,f,Q,h&-65537);Vb(b,s,r);Vb(b,t!=t|0.0!=0.0?(K?6729:6733):K?6721:6725,3);bc(b,32,f,Q,h^8192);M=Q}while(0);l=j;return ((M|0)<(f|0)?f:M)|0}function ec(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function fc(a,b){a=+a;b=b|0;return +(+gc(a,b))}function gc(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,k=0.0,l=0.0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Hc(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){g=+gc(a*18446744073709551616.0,b);i=(c[b>>2]|0)+-64|0;k=g}else{i=0;k=a}c[b>>2]=i;l=k;break}case 2047:{l=a;break}default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;l=+h[j>>3]}}return +l}function hc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;do if(b){if(d>>>0<128){a[b>>0]=d;f=1;break}if(!(c[c[(ic()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;f=1;break}else{c[(Lb()|0)>>2]=84;f=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;f=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;f=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;f=4;break}else{c[(Lb()|0)>>2]=84;f=-1;break}}else f=1;while(0);return f|0}function ic(){return Nb()|0}function jc(){return Nb()|0}function kc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=0;while(1){if((d[6755+f>>0]|0)==(b|0)){g=2;break}h=f+1|0;if((h|0)==87){i=87;j=6843;g=5;break}else f=h}if((g|0)==2)if(!f)k=6843;else{i=f;j=6843;g=5}if((g|0)==5)while(1){g=0;f=j;do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);i=i+-1|0;if(!i){k=f;break}else{j=f;g=5}}return lc(k,c[e+20>>2]|0)|0}function lc(a,b){a=a|0;b=b|0;return mc(a,b)|0}function mc(a,b){a=a|0;b=b|0;var d=0;if(!b)d=0;else d=nc(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (d|0?d:a)|0}function nc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=(c[b>>2]|0)+1794895138|0;g=oc(c[b+8>>2]|0,f)|0;h=oc(c[b+12>>2]|0,f)|0;i=oc(c[b+16>>2]|0,f)|0;a:do if((g>>>0<d>>>2>>>0?(j=d-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=oc(c[b+(q<<2)>>2]|0,f)|0;s=oc(c[b+(q+1<<2)>>2]|0,f)|0;if(!(s>>>0<d>>>0&r>>>0<(d-s|0)>>>0)){t=0;break a}if(a[b+(s+r)>>0]|0){t=0;break a}r=Qb(e,b+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=oc(c[b+(m<<2)>>2]|0,f)|0;j=oc(c[b+(m+1<<2)>>2]|0,f)|0;if(j>>>0<d>>>0&l>>>0<(d-j|0)>>>0)t=(a[b+(j+l)>>0]|0)==0?b+j|0:0;else t=0}else t=0;while(0);return t|0}function oc(a,b){a=a|0;b=b|0;var c=0;c=Sc(a|0)|0;return ((b|0)==0?a:c)|0}function pc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(qc(e)|0)){h=c[f>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=e+20|0;f=c[g>>2]|0;k=f;if((h-f|0)>>>0<d>>>0){j=ta[c[e+36>>2]&7](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){l=k;m=0;n=d;o=b;break b}p=f+-1|0;if((a[b+p>>0]|0)==10)break;else f=p}p=ta[c[e+36>>2]&7](e,b,f)|0;if(p>>>0<f>>>0){j=p;break a}l=c[g>>2]|0;m=f;n=d-f|0;o=b+f|0}else{l=k;m=0;n=d;o=b}while(0);Jc(l|0,o|0,n|0)|0;c[g>>2]=(c[g>>2]|0)+n;j=m+n|0}while(0);return j|0}function qc(b){b=b|0;var d=0,e=0,f=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;e=c[b>>2]|0;if(!(e&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);f=0}else{c[b>>2]=e|32;f=-1}return f|0}function rc(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b;a:do if(!(d&3)){e=b;f=4}else{g=d;h=b;while(1){if(!(a[h>>0]|0)){i=g;break a}j=h+1|0;g=j;if(!(g&3)){e=j;f=4;break}else h=j}}while(0);if((f|0)==4){f=e;while(1){k=c[f>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))f=f+4|0;else break}if(!((k&255)<<24>>24))l=f;else{k=f;while(1){f=k+1|0;if(!(a[f>>0]|0)){l=f;break}else k=f}}i=l}return i-d|0}function sc(a,b){a=a|0;b=b|0;var c=0;c=rc(a)|0;return ((tc(a,1,c,b)|0)!=(c|0))<<31>>31|0}function tc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=S(d,b)|0;g=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){d=(Tb(e)|0)==0;h=pc(a,f,e)|0;if(d)i=h;else{Ub(e);i=h}}else i=pc(a,f,e)|0;if((i|0)==(f|0))j=g;else j=(i>>>0)/(b>>>0)|0;return j|0}function uc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+16|0;g=f;h=e&255;a[g>>0]=h;i=b+16|0;j=c[i>>2]|0;if(!j)if(!(qc(b)|0)){k=c[i>>2]|0;m=4}else n=-1;else{k=j;m=4}do if((m|0)==4){j=b+20|0;i=c[j>>2]|0;if(i>>>0<k>>>0?(o=e&255,(o|0)!=(a[b+75>>0]|0)):0){c[j>>2]=i+1;a[i>>0]=h;n=o;break}if((ta[c[b+36>>2]&7](b,g,1)|0)==1)n=d[g>>0]|0;else n=-1}while(0);l=f;return n|0}function vc(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=Rb(c[756]|0,a,e)|0;l=d;return b|0}function wc(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[756]|0;if((c[d+76>>2]|0)>-1)e=Tb(d)|0;else e=0;do if((sc(b,d)|0)<0)f=1;else{if((a[d+75>>0]|0)!=10?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=10;f=0;break}f=(uc(d,10)|0)<0}while(0);if(e|0)Ub(d);return f<<31>>31|0}function xc(a,b){a=a|0;b=b|0;return Rb(c[756]|0,a,b)|0}function yc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;b=l;l=l+16|0;d=b;do if(a>>>0<245){e=a>>>0<11?16:a+11&-8;f=e>>>3;g=c[2191]|0;h=g>>>f;if(h&3|0){i=(h&1^1)+f|0;j=8804+(i<<1<<2)|0;k=j+8|0;m=c[k>>2]|0;n=m+8|0;o=c[n>>2]|0;do if((j|0)!=(o|0)){if(o>>>0<(c[2195]|0)>>>0)ia();p=o+12|0;if((c[p>>2]|0)==(m|0)){c[p>>2]=j;c[k>>2]=o;break}else ia()}else c[2191]=g&~(1<<i);while(0);o=i<<3;c[m+4>>2]=o|3;k=m+o+4|0;c[k>>2]=c[k>>2]|1;q=n;l=b;return q|0}k=c[2193]|0;if(e>>>0>k>>>0){if(h|0){o=2<<f;j=h<<f&(o|0-o);o=(j&0-j)+-1|0;j=o>>>12&16;p=o>>>j;o=p>>>5&8;r=p>>>o;p=r>>>2&4;s=r>>>p;r=s>>>1&2;t=s>>>r;s=t>>>1&1;u=(o|j|p|r|s)+(t>>>s)|0;s=8804+(u<<1<<2)|0;t=s+8|0;r=c[t>>2]|0;p=r+8|0;j=c[p>>2]|0;do if((s|0)!=(j|0)){if(j>>>0<(c[2195]|0)>>>0)ia();o=j+12|0;if((c[o>>2]|0)==(r|0)){c[o>>2]=s;c[t>>2]=j;v=g;break}else ia()}else{o=g&~(1<<u);c[2191]=o;v=o}while(0);j=(u<<3)-e|0;c[r+4>>2]=e|3;t=r+e|0;c[t+4>>2]=j|1;c[t+j>>2]=j;if(k|0){s=c[2196]|0;f=k>>>3;h=8804+(f<<1<<2)|0;n=1<<f;if(v&n){f=h+8|0;m=c[f>>2]|0;if(m>>>0<(c[2195]|0)>>>0)ia();else{w=f;x=m}}else{c[2191]=v|n;w=h+8|0;x=h}c[w>>2]=s;c[x+12>>2]=s;c[s+8>>2]=x;c[s+12>>2]=h}c[2193]=j;c[2196]=t;q=p;l=b;return q|0}t=c[2192]|0;if(t){j=(t&0-t)+-1|0;h=j>>>12&16;s=j>>>h;j=s>>>5&8;n=s>>>j;s=n>>>2&4;m=n>>>s;n=m>>>1&2;f=m>>>n;m=f>>>1&1;i=c[9068+((j|h|s|n|m)+(f>>>m)<<2)>>2]|0;m=(c[i+4>>2]&-8)-e|0;f=c[i+16+(((c[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){y=m;z=i}else{n=f;f=m;m=i;while(1){i=(c[n+4>>2]&-8)-e|0;s=i>>>0<f>>>0;h=s?i:f;i=s?n:m;n=c[n+16+(((c[n+16>>2]|0)==0&1)<<2)>>2]|0;if(!n){y=h;z=i;break}else{f=h;m=i}}}m=c[2195]|0;if(z>>>0<m>>>0)ia();f=z+e|0;if(z>>>0>=f>>>0)ia();n=c[z+24>>2]|0;p=c[z+12>>2]|0;do if((p|0)==(z|0)){r=z+20|0;u=c[r>>2]|0;if(!u){i=z+16|0;h=c[i>>2]|0;if(!h){A=0;break}else{B=h;C=i}}else{B=u;C=r}while(1){r=B+20|0;u=c[r>>2]|0;if(u|0){B=u;C=r;continue}r=B+16|0;u=c[r>>2]|0;if(!u)break;else{B=u;C=r}}if(C>>>0<m>>>0)ia();else{c[C>>2]=0;A=B;break}}else{r=c[z+8>>2]|0;if(r>>>0<m>>>0)ia();u=r+12|0;if((c[u>>2]|0)!=(z|0))ia();i=p+8|0;if((c[i>>2]|0)==(z|0)){c[u>>2]=p;c[i>>2]=r;A=p;break}else ia()}while(0);a:do if(n|0){p=c[z+28>>2]|0;m=9068+(p<<2)|0;do if((z|0)==(c[m>>2]|0)){c[m>>2]=A;if(!A){c[2192]=t&~(1<<p);break a}}else if(n>>>0>=(c[2195]|0)>>>0){c[n+16+(((c[n+16>>2]|0)!=(z|0)&1)<<2)>>2]=A;if(!A)break a;else break}else ia();while(0);p=c[2195]|0;if(A>>>0<p>>>0)ia();c[A+24>>2]=n;m=c[z+16>>2]|0;do if(m|0)if(m>>>0<p>>>0)ia();else{c[A+16>>2]=m;c[m+24>>2]=A;break}while(0);m=c[z+20>>2]|0;if(m|0)if(m>>>0<(c[2195]|0)>>>0)ia();else{c[A+20>>2]=m;c[m+24>>2]=A;break}}while(0);if(y>>>0<16){n=y+e|0;c[z+4>>2]=n|3;t=z+n+4|0;c[t>>2]=c[t>>2]|1}else{c[z+4>>2]=e|3;c[f+4>>2]=y|1;c[f+y>>2]=y;if(k|0){t=c[2196]|0;n=k>>>3;m=8804+(n<<1<<2)|0;p=1<<n;if(g&p){n=m+8|0;r=c[n>>2]|0;if(r>>>0<(c[2195]|0)>>>0)ia();else{D=n;E=r}}else{c[2191]=g|p;D=m+8|0;E=m}c[D>>2]=t;c[E+12>>2]=t;c[t+8>>2]=E;c[t+12>>2]=m}c[2193]=y;c[2196]=f}q=z+8|0;l=b;return q|0}else F=e}else F=e}else if(a>>>0<=4294967231){m=a+11|0;t=m&-8;p=c[2192]|0;if(p){r=0-t|0;n=m>>>8;if(n)if(t>>>0>16777215)G=31;else{m=(n+1048320|0)>>>16&8;i=n<<m;n=(i+520192|0)>>>16&4;u=i<<n;i=(u+245760|0)>>>16&2;h=14-(n|m|i)+(u<<i>>>15)|0;G=t>>>(h+7|0)&1|h<<1}else G=0;h=c[9068+(G<<2)>>2]|0;b:do if(!h){H=r;I=0;J=0;K=81}else{i=r;u=0;m=t<<((G|0)==31?0:25-(G>>>1)|0);n=h;s=0;while(1){j=(c[n+4>>2]&-8)-t|0;if(j>>>0<i>>>0)if(!j){L=0;M=n;N=n;K=85;break b}else{O=j;P=n}else{O=i;P=s}j=c[n+20>>2]|0;n=c[n+16+(m>>>31<<2)>>2]|0;o=(j|0)==0|(j|0)==(n|0)?u:j;j=(n|0)==0;if(j){H=O;I=o;J=P;K=81;break}else{i=O;u=o;m=m<<((j^1)&1);s=P}}}while(0);if((K|0)==81){if((I|0)==0&(J|0)==0){h=2<<G;r=p&(h|0-h);if(!r){F=t;break}h=(r&0-r)+-1|0;r=h>>>12&16;e=h>>>r;h=e>>>5&8;f=e>>>h;e=f>>>2&4;g=f>>>e;f=g>>>1&2;k=g>>>f;g=k>>>1&1;Q=c[9068+((h|r|e|f|g)+(k>>>g)<<2)>>2]|0;R=0}else{Q=I;R=J}if(!Q){S=H;T=R}else{L=H;M=Q;N=R;K=85}}if((K|0)==85)while(1){K=0;g=(c[M+4>>2]&-8)-t|0;k=g>>>0<L>>>0;f=k?g:L;g=k?M:N;M=c[M+16+(((c[M+16>>2]|0)==0&1)<<2)>>2]|0;if(!M){S=f;T=g;break}else{L=f;N=g;K=85}}if((T|0)!=0?S>>>0<((c[2193]|0)-t|0)>>>0:0){g=c[2195]|0;if(T>>>0<g>>>0)ia();f=T+t|0;if(T>>>0>=f>>>0)ia();k=c[T+24>>2]|0;e=c[T+12>>2]|0;do if((e|0)==(T|0)){r=T+20|0;h=c[r>>2]|0;if(!h){s=T+16|0;m=c[s>>2]|0;if(!m){U=0;break}else{V=m;W=s}}else{V=h;W=r}while(1){r=V+20|0;h=c[r>>2]|0;if(h|0){V=h;W=r;continue}r=V+16|0;h=c[r>>2]|0;if(!h)break;else{V=h;W=r}}if(W>>>0<g>>>0)ia();else{c[W>>2]=0;U=V;break}}else{r=c[T+8>>2]|0;if(r>>>0<g>>>0)ia();h=r+12|0;if((c[h>>2]|0)!=(T|0))ia();s=e+8|0;if((c[s>>2]|0)==(T|0)){c[h>>2]=e;c[s>>2]=r;U=e;break}else ia()}while(0);c:do if(k){e=c[T+28>>2]|0;g=9068+(e<<2)|0;do if((T|0)==(c[g>>2]|0)){c[g>>2]=U;if(!U){r=p&~(1<<e);c[2192]=r;X=r;break c}}else if(k>>>0>=(c[2195]|0)>>>0){c[k+16+(((c[k+16>>2]|0)!=(T|0)&1)<<2)>>2]=U;if(!U){X=p;break c}else break}else ia();while(0);e=c[2195]|0;if(U>>>0<e>>>0)ia();c[U+24>>2]=k;g=c[T+16>>2]|0;do if(g|0)if(g>>>0<e>>>0)ia();else{c[U+16>>2]=g;c[g+24>>2]=U;break}while(0);g=c[T+20>>2]|0;if(g)if(g>>>0<(c[2195]|0)>>>0)ia();else{c[U+20>>2]=g;c[g+24>>2]=U;X=p;break}else X=p}else X=p;while(0);do if(S>>>0>=16){c[T+4>>2]=t|3;c[f+4>>2]=S|1;c[f+S>>2]=S;p=S>>>3;if(S>>>0<256){k=8804+(p<<1<<2)|0;g=c[2191]|0;e=1<<p;if(g&e){p=k+8|0;r=c[p>>2]|0;if(r>>>0<(c[2195]|0)>>>0)ia();else{Y=p;Z=r}}else{c[2191]=g|e;Y=k+8|0;Z=k}c[Y>>2]=f;c[Z+12>>2]=f;c[f+8>>2]=Z;c[f+12>>2]=k;break}k=S>>>8;if(k)if(S>>>0>16777215)_=31;else{e=(k+1048320|0)>>>16&8;g=k<<e;k=(g+520192|0)>>>16&4;r=g<<k;g=(r+245760|0)>>>16&2;p=14-(k|e|g)+(r<<g>>>15)|0;_=S>>>(p+7|0)&1|p<<1}else _=0;p=9068+(_<<2)|0;c[f+28>>2]=_;g=f+16|0;c[g+4>>2]=0;c[g>>2]=0;g=1<<_;if(!(X&g)){c[2192]=X|g;c[p>>2]=f;c[f+24>>2]=p;c[f+12>>2]=f;c[f+8>>2]=f;break}g=S<<((_|0)==31?0:25-(_>>>1)|0);r=c[p>>2]|0;while(1){if((c[r+4>>2]&-8|0)==(S|0)){K=139;break}$=r+16+(g>>>31<<2)|0;p=c[$>>2]|0;if(!p){K=136;break}else{g=g<<1;r=p}}if((K|0)==136)if($>>>0<(c[2195]|0)>>>0)ia();else{c[$>>2]=f;c[f+24>>2]=r;c[f+12>>2]=f;c[f+8>>2]=f;break}else if((K|0)==139){g=r+8|0;p=c[g>>2]|0;e=c[2195]|0;if(p>>>0>=e>>>0&r>>>0>=e>>>0){c[p+12>>2]=f;c[g>>2]=f;c[f+8>>2]=p;c[f+12>>2]=r;c[f+24>>2]=0;break}else ia()}}else{p=S+t|0;c[T+4>>2]=p|3;g=T+p+4|0;c[g>>2]=c[g>>2]|1}while(0);q=T+8|0;l=b;return q|0}else F=t}else F=t}else F=-1;while(0);T=c[2193]|0;if(T>>>0>=F>>>0){S=T-F|0;$=c[2196]|0;if(S>>>0>15){_=$+F|0;c[2196]=_;c[2193]=S;c[_+4>>2]=S|1;c[_+S>>2]=S;c[$+4>>2]=F|3}else{c[2193]=0;c[2196]=0;c[$+4>>2]=T|3;S=$+T+4|0;c[S>>2]=c[S>>2]|1}q=$+8|0;l=b;return q|0}$=c[2194]|0;if($>>>0>F>>>0){S=$-F|0;c[2194]=S;T=c[2197]|0;_=T+F|0;c[2197]=_;c[_+4>>2]=S|1;c[T+4>>2]=F|3;q=T+8|0;l=b;return q|0}if(!(c[2309]|0)){c[2311]=4096;c[2310]=4096;c[2312]=-1;c[2313]=-1;c[2314]=0;c[2302]=0;T=d&-16^1431655768;c[d>>2]=T;c[2309]=T;aa=4096}else aa=c[2311]|0;T=F+48|0;d=F+47|0;S=aa+d|0;_=0-aa|0;aa=S&_;if(aa>>>0<=F>>>0){q=0;l=b;return q|0}X=c[2301]|0;if(X|0?(Z=c[2299]|0,Y=Z+aa|0,Y>>>0<=Z>>>0|Y>>>0>X>>>0):0){q=0;l=b;return q|0}d:do if(!(c[2302]&4)){X=c[2197]|0;e:do if(X){Y=9212;while(1){Z=c[Y>>2]|0;if(Z>>>0<=X>>>0?(ba=Y+4|0,(Z+(c[ba>>2]|0)|0)>>>0>X>>>0):0)break;Z=c[Y+8>>2]|0;if(!Z){K=163;break e}else Y=Z}r=S-$&_;if(r>>>0<2147483647){Z=Tc(r|0)|0;if((Z|0)==((c[Y>>2]|0)+(c[ba>>2]|0)|0))if((Z|0)==(-1|0))ca=r;else{da=Z;ea=r;K=180;break d}else{fa=Z;ga=r;K=171}}else ca=0}else K=163;while(0);do if((K|0)==163){X=Tc(0)|0;if((X|0)!=(-1|0)?(t=X,r=c[2310]|0,Z=r+-1|0,U=((Z&t|0)==0?0:(Z+t&0-r)-t|0)+aa|0,t=c[2299]|0,r=U+t|0,U>>>0>F>>>0&U>>>0<2147483647):0){Z=c[2301]|0;if(Z|0?r>>>0<=t>>>0|r>>>0>Z>>>0:0){ca=0;break}Z=Tc(U|0)|0;if((Z|0)==(X|0)){da=X;ea=U;K=180;break d}else{fa=Z;ga=U;K=171}}else ca=0}while(0);do if((K|0)==171){U=0-ga|0;if(!(T>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=fa;ea=ga;K=180;break d}Z=c[2311]|0;X=d-ga+Z&0-Z;if(X>>>0>=2147483647){da=fa;ea=ga;K=180;break d}if((Tc(X|0)|0)==(-1|0)){Tc(U|0)|0;ca=0;break}else{da=fa;ea=X+ga|0;K=180;break d}}while(0);c[2302]=c[2302]|4;ha=ca;K=178}else{ha=0;K=178}while(0);if(((K|0)==178?aa>>>0<2147483647:0)?(ca=Tc(aa|0)|0,aa=Tc(0)|0,ga=aa-ca|0,fa=ga>>>0>(F+40|0)>>>0,!((ca|0)==(-1|0)|fa^1|ca>>>0<aa>>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ca;ea=fa?ga:ha;K=180}if((K|0)==180){ha=(c[2299]|0)+ea|0;c[2299]=ha;if(ha>>>0>(c[2300]|0)>>>0)c[2300]=ha;ha=c[2197]|0;do if(ha){ga=9212;while(1){ja=c[ga>>2]|0;ka=ga+4|0;la=c[ka>>2]|0;if((da|0)==(ja+la|0)){K=190;break}fa=c[ga+8>>2]|0;if(!fa)break;else ga=fa}if(((K|0)==190?(c[ga+12>>2]&8|0)==0:0)?ha>>>0<da>>>0&ha>>>0>=ja>>>0:0){c[ka>>2]=la+ea;fa=ha+8|0;ca=(fa&7|0)==0?0:0-fa&7;fa=ha+ca|0;aa=(c[2194]|0)+(ea-ca)|0;c[2197]=fa;c[2194]=aa;c[fa+4>>2]=aa|1;c[fa+aa+4>>2]=40;c[2198]=c[2313];break}aa=c[2195]|0;if(da>>>0<aa>>>0){c[2195]=da;ma=da}else ma=aa;aa=da+ea|0;fa=9212;while(1){if((c[fa>>2]|0)==(aa|0)){K=198;break}ca=c[fa+8>>2]|0;if(!ca)break;else fa=ca}if((K|0)==198?(c[fa+12>>2]&8|0)==0:0){c[fa>>2]=da;ga=fa+4|0;c[ga>>2]=(c[ga>>2]|0)+ea;ga=da+8|0;ca=da+((ga&7|0)==0?0:0-ga&7)|0;ga=aa+8|0;d=aa+((ga&7|0)==0?0:0-ga&7)|0;ga=ca+F|0;T=d-ca-F|0;c[ca+4>>2]=F|3;do if((d|0)!=(ha|0)){if((d|0)==(c[2196]|0)){ba=(c[2193]|0)+T|0;c[2193]=ba;c[2196]=ga;c[ga+4>>2]=ba|1;c[ga+ba>>2]=ba;break}ba=c[d+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;f:do if(ba>>>0>=256){S=c[d+24>>2]|0;X=c[d+12>>2]|0;do if((X|0)==(d|0)){U=d+16|0;Z=U+4|0;r=c[Z>>2]|0;if(!r){t=c[U>>2]|0;if(!t){na=0;break}else{oa=t;pa=U}}else{oa=r;pa=Z}while(1){Z=oa+20|0;r=c[Z>>2]|0;if(r|0){oa=r;pa=Z;continue}Z=oa+16|0;r=c[Z>>2]|0;if(!r)break;else{oa=r;pa=Z}}if(pa>>>0<ma>>>0)ia();else{c[pa>>2]=0;na=oa;break}}else{Z=c[d+8>>2]|0;if(Z>>>0<ma>>>0)ia();r=Z+12|0;if((c[r>>2]|0)!=(d|0))ia();U=X+8|0;if((c[U>>2]|0)==(d|0)){c[r>>2]=X;c[U>>2]=Z;na=X;break}else ia()}while(0);if(!S)break;X=c[d+28>>2]|0;Z=9068+(X<<2)|0;do if((d|0)!=(c[Z>>2]|0))if(S>>>0>=(c[2195]|0)>>>0){c[S+16+(((c[S+16>>2]|0)!=(d|0)&1)<<2)>>2]=na;if(!na)break f;else break}else ia();else{c[Z>>2]=na;if(na|0)break;c[2192]=c[2192]&~(1<<X);break f}while(0);X=c[2195]|0;if(na>>>0<X>>>0)ia();c[na+24>>2]=S;Z=d+16|0;U=c[Z>>2]|0;do if(U|0)if(U>>>0<X>>>0)ia();else{c[na+16>>2]=U;c[U+24>>2]=na;break}while(0);U=c[Z+4>>2]|0;if(!U)break;if(U>>>0<(c[2195]|0)>>>0)ia();else{c[na+20>>2]=U;c[U+24>>2]=na;break}}else{U=c[d+8>>2]|0;X=c[d+12>>2]|0;S=8804+($<<1<<2)|0;do if((U|0)!=(S|0)){if(U>>>0<ma>>>0)ia();if((c[U+12>>2]|0)==(d|0))break;ia()}while(0);if((X|0)==(U|0)){c[2191]=c[2191]&~(1<<$);break}do if((X|0)==(S|0))qa=X+8|0;else{if(X>>>0<ma>>>0)ia();Z=X+8|0;if((c[Z>>2]|0)==(d|0)){qa=Z;break}ia()}while(0);c[U+12>>2]=X;c[qa>>2]=U}while(0);ra=d+_|0;sa=_+T|0}else{ra=d;sa=T}$=ra+4|0;c[$>>2]=c[$>>2]&-2;c[ga+4>>2]=sa|1;c[ga+sa>>2]=sa;$=sa>>>3;if(sa>>>0<256){ba=8804+($<<1<<2)|0;Y=c[2191]|0;S=1<<$;do if(!(Y&S)){c[2191]=Y|S;ta=ba+8|0;ua=ba}else{$=ba+8|0;Z=c[$>>2]|0;if(Z>>>0>=(c[2195]|0)>>>0){ta=$;ua=Z;break}ia()}while(0);c[ta>>2]=ga;c[ua+12>>2]=ga;c[ga+8>>2]=ua;c[ga+12>>2]=ba;break}S=sa>>>8;do if(!S)va=0;else{if(sa>>>0>16777215){va=31;break}Y=(S+1048320|0)>>>16&8;_=S<<Y;Z=(_+520192|0)>>>16&4;$=_<<Z;_=($+245760|0)>>>16&2;r=14-(Z|Y|_)+($<<_>>>15)|0;va=sa>>>(r+7|0)&1|r<<1}while(0);S=9068+(va<<2)|0;c[ga+28>>2]=va;ba=ga+16|0;c[ba+4>>2]=0;c[ba>>2]=0;ba=c[2192]|0;r=1<<va;if(!(ba&r)){c[2192]=ba|r;c[S>>2]=ga;c[ga+24>>2]=S;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}r=sa<<((va|0)==31?0:25-(va>>>1)|0);ba=c[S>>2]|0;while(1){if((c[ba+4>>2]&-8|0)==(sa|0)){K=265;break}wa=ba+16+(r>>>31<<2)|0;S=c[wa>>2]|0;if(!S){K=262;break}else{r=r<<1;ba=S}}if((K|0)==262)if(wa>>>0<(c[2195]|0)>>>0)ia();else{c[wa>>2]=ga;c[ga+24>>2]=ba;c[ga+12>>2]=ga;c[ga+8>>2]=ga;break}else if((K|0)==265){r=ba+8|0;S=c[r>>2]|0;_=c[2195]|0;if(S>>>0>=_>>>0&ba>>>0>=_>>>0){c[S+12>>2]=ga;c[r>>2]=ga;c[ga+8>>2]=S;c[ga+12>>2]=ba;c[ga+24>>2]=0;break}else ia()}}else{S=(c[2194]|0)+T|0;c[2194]=S;c[2197]=ga;c[ga+4>>2]=S|1}while(0);q=ca+8|0;l=b;return q|0}ga=9212;while(1){T=c[ga>>2]|0;if(T>>>0<=ha>>>0?(xa=T+(c[ga+4>>2]|0)|0,xa>>>0>ha>>>0):0)break;ga=c[ga+8>>2]|0}ga=xa+-47|0;ca=ga+8|0;T=ga+((ca&7|0)==0?0:0-ca&7)|0;ca=ha+16|0;ga=T>>>0<ca>>>0?ha:T;T=ga+8|0;d=da+8|0;aa=(d&7|0)==0?0:0-d&7;d=da+aa|0;fa=ea+-40-aa|0;c[2197]=d;c[2194]=fa;c[d+4>>2]=fa|1;c[d+fa+4>>2]=40;c[2198]=c[2313];fa=ga+4|0;c[fa>>2]=27;c[T>>2]=c[2303];c[T+4>>2]=c[2304];c[T+8>>2]=c[2305];c[T+12>>2]=c[2306];c[2303]=da;c[2304]=ea;c[2306]=0;c[2305]=T;T=ga+24|0;do{d=T;T=T+4|0;c[T>>2]=7}while((d+8|0)>>>0<xa>>>0);if((ga|0)!=(ha|0)){T=ga-ha|0;c[fa>>2]=c[fa>>2]&-2;c[ha+4>>2]=T|1;c[ga>>2]=T;d=T>>>3;if(T>>>0<256){aa=8804+(d<<1<<2)|0;S=c[2191]|0;r=1<<d;if(S&r){d=aa+8|0;_=c[d>>2]|0;if(_>>>0<(c[2195]|0)>>>0)ia();else{ya=d;za=_}}else{c[2191]=S|r;ya=aa+8|0;za=aa}c[ya>>2]=ha;c[za+12>>2]=ha;c[ha+8>>2]=za;c[ha+12>>2]=aa;break}aa=T>>>8;if(aa)if(T>>>0>16777215)Aa=31;else{r=(aa+1048320|0)>>>16&8;S=aa<<r;aa=(S+520192|0)>>>16&4;_=S<<aa;S=(_+245760|0)>>>16&2;d=14-(aa|r|S)+(_<<S>>>15)|0;Aa=T>>>(d+7|0)&1|d<<1}else Aa=0;d=9068+(Aa<<2)|0;c[ha+28>>2]=Aa;c[ha+20>>2]=0;c[ca>>2]=0;S=c[2192]|0;_=1<<Aa;if(!(S&_)){c[2192]=S|_;c[d>>2]=ha;c[ha+24>>2]=d;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}_=T<<((Aa|0)==31?0:25-(Aa>>>1)|0);S=c[d>>2]|0;while(1){if((c[S+4>>2]&-8|0)==(T|0)){K=292;break}Ba=S+16+(_>>>31<<2)|0;d=c[Ba>>2]|0;if(!d){K=289;break}else{_=_<<1;S=d}}if((K|0)==289)if(Ba>>>0<(c[2195]|0)>>>0)ia();else{c[Ba>>2]=ha;c[ha+24>>2]=S;c[ha+12>>2]=ha;c[ha+8>>2]=ha;break}else if((K|0)==292){_=S+8|0;T=c[_>>2]|0;ca=c[2195]|0;if(T>>>0>=ca>>>0&S>>>0>=ca>>>0){c[T+12>>2]=ha;c[_>>2]=ha;c[ha+8>>2]=T;c[ha+12>>2]=S;c[ha+24>>2]=0;break}else ia()}}}else{T=c[2195]|0;if((T|0)==0|da>>>0<T>>>0)c[2195]=da;c[2303]=da;c[2304]=ea;c[2306]=0;c[2200]=c[2309];c[2199]=-1;T=0;do{_=8804+(T<<1<<2)|0;c[_+12>>2]=_;c[_+8>>2]=_;T=T+1|0}while((T|0)!=32);T=da+8|0;S=(T&7|0)==0?0:0-T&7;T=da+S|0;_=ea+-40-S|0;c[2197]=T;c[2194]=_;c[T+4>>2]=_|1;c[T+_+4>>2]=40;c[2198]=c[2313]}while(0);ea=c[2194]|0;if(ea>>>0>F>>>0){da=ea-F|0;c[2194]=da;ea=c[2197]|0;ha=ea+F|0;c[2197]=ha;c[ha+4>>2]=da|1;c[ea+4>>2]=F|3;q=ea+8|0;l=b;return q|0}}c[(Lb()|0)>>2]=12;q=0;l=b;return q|0}function zc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;if(!a)return;b=a+-8|0;d=c[2195]|0;if(b>>>0<d>>>0)ia();e=c[a+-4>>2]|0;a=e&3;if((a|0)==1)ia();f=e&-8;g=b+f|0;a:do if(!(e&1)){h=c[b>>2]|0;if(!a)return;i=b+(0-h)|0;j=h+f|0;if(i>>>0<d>>>0)ia();if((i|0)==(c[2196]|0)){k=g+4|0;l=c[k>>2]|0;if((l&3|0)!=3){m=i;n=i;o=j;break}c[2193]=j;c[k>>2]=l&-2;c[i+4>>2]=j|1;c[i+j>>2]=j;return}l=h>>>3;if(h>>>0<256){h=c[i+8>>2]|0;k=c[i+12>>2]|0;p=8804+(l<<1<<2)|0;if((h|0)!=(p|0)){if(h>>>0<d>>>0)ia();if((c[h+12>>2]|0)!=(i|0))ia()}if((k|0)==(h|0)){c[2191]=c[2191]&~(1<<l);m=i;n=i;o=j;break}if((k|0)!=(p|0)){if(k>>>0<d>>>0)ia();p=k+8|0;if((c[p>>2]|0)==(i|0))q=p;else ia()}else q=k+8|0;c[h+12>>2]=k;c[q>>2]=h;m=i;n=i;o=j;break}h=c[i+24>>2]|0;k=c[i+12>>2]|0;do if((k|0)==(i|0)){p=i+16|0;l=p+4|0;r=c[l>>2]|0;if(!r){s=c[p>>2]|0;if(!s){t=0;break}else{u=s;v=p}}else{u=r;v=l}while(1){l=u+20|0;r=c[l>>2]|0;if(r|0){u=r;v=l;continue}l=u+16|0;r=c[l>>2]|0;if(!r)break;else{u=r;v=l}}if(v>>>0<d>>>0)ia();else{c[v>>2]=0;t=u;break}}else{l=c[i+8>>2]|0;if(l>>>0<d>>>0)ia();r=l+12|0;if((c[r>>2]|0)!=(i|0))ia();p=k+8|0;if((c[p>>2]|0)==(i|0)){c[r>>2]=k;c[p>>2]=l;t=k;break}else ia()}while(0);if(h){k=c[i+28>>2]|0;l=9068+(k<<2)|0;do if((i|0)==(c[l>>2]|0)){c[l>>2]=t;if(!t){c[2192]=c[2192]&~(1<<k);m=i;n=i;o=j;break a}}else if(h>>>0>=(c[2195]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=t;if(!t){m=i;n=i;o=j;break a}else break}else ia();while(0);k=c[2195]|0;if(t>>>0<k>>>0)ia();c[t+24>>2]=h;l=i+16|0;p=c[l>>2]|0;do if(p|0)if(p>>>0<k>>>0)ia();else{c[t+16>>2]=p;c[p+24>>2]=t;break}while(0);p=c[l+4>>2]|0;if(p)if(p>>>0<(c[2195]|0)>>>0)ia();else{c[t+20>>2]=p;c[p+24>>2]=t;m=i;n=i;o=j;break}else{m=i;n=i;o=j}}else{m=i;n=i;o=j}}else{m=b;n=b;o=f}while(0);if(m>>>0>=g>>>0)ia();f=g+4|0;b=c[f>>2]|0;if(!(b&1))ia();if(!(b&2)){t=c[2196]|0;if((g|0)==(c[2197]|0)){d=(c[2194]|0)+o|0;c[2194]=d;c[2197]=n;c[n+4>>2]=d|1;if((n|0)!=(t|0))return;c[2196]=0;c[2193]=0;return}if((g|0)==(t|0)){t=(c[2193]|0)+o|0;c[2193]=t;c[2196]=m;c[n+4>>2]=t|1;c[m+t>>2]=t;return}t=(b&-8)+o|0;d=b>>>3;b:do if(b>>>0>=256){u=c[g+24>>2]|0;v=c[g+12>>2]|0;do if((v|0)==(g|0)){q=g+16|0;a=q+4|0;e=c[a>>2]|0;if(!e){p=c[q>>2]|0;if(!p){w=0;break}else{x=p;y=q}}else{x=e;y=a}while(1){a=x+20|0;e=c[a>>2]|0;if(e|0){x=e;y=a;continue}a=x+16|0;e=c[a>>2]|0;if(!e)break;else{x=e;y=a}}if(y>>>0<(c[2195]|0)>>>0)ia();else{c[y>>2]=0;w=x;break}}else{a=c[g+8>>2]|0;if(a>>>0<(c[2195]|0)>>>0)ia();e=a+12|0;if((c[e>>2]|0)!=(g|0))ia();q=v+8|0;if((c[q>>2]|0)==(g|0)){c[e>>2]=v;c[q>>2]=a;w=v;break}else ia()}while(0);if(u|0){v=c[g+28>>2]|0;j=9068+(v<<2)|0;do if((g|0)==(c[j>>2]|0)){c[j>>2]=w;if(!w){c[2192]=c[2192]&~(1<<v);break b}}else if(u>>>0>=(c[2195]|0)>>>0){c[u+16+(((c[u+16>>2]|0)!=(g|0)&1)<<2)>>2]=w;if(!w)break b;else break}else ia();while(0);v=c[2195]|0;if(w>>>0<v>>>0)ia();c[w+24>>2]=u;j=g+16|0;i=c[j>>2]|0;do if(i|0)if(i>>>0<v>>>0)ia();else{c[w+16>>2]=i;c[i+24>>2]=w;break}while(0);i=c[j+4>>2]|0;if(i|0)if(i>>>0<(c[2195]|0)>>>0)ia();else{c[w+20>>2]=i;c[i+24>>2]=w;break}}}else{i=c[g+8>>2]|0;v=c[g+12>>2]|0;u=8804+(d<<1<<2)|0;if((i|0)!=(u|0)){if(i>>>0<(c[2195]|0)>>>0)ia();if((c[i+12>>2]|0)!=(g|0))ia()}if((v|0)==(i|0)){c[2191]=c[2191]&~(1<<d);break}if((v|0)!=(u|0)){if(v>>>0<(c[2195]|0)>>>0)ia();u=v+8|0;if((c[u>>2]|0)==(g|0))z=u;else ia()}else z=v+8|0;c[i+12>>2]=v;c[z>>2]=i}while(0);c[n+4>>2]=t|1;c[m+t>>2]=t;if((n|0)==(c[2196]|0)){c[2193]=t;return}else A=t}else{c[f>>2]=b&-2;c[n+4>>2]=o|1;c[m+o>>2]=o;A=o}o=A>>>3;if(A>>>0<256){m=8804+(o<<1<<2)|0;b=c[2191]|0;f=1<<o;if(b&f){o=m+8|0;t=c[o>>2]|0;if(t>>>0<(c[2195]|0)>>>0)ia();else{B=o;C=t}}else{c[2191]=b|f;B=m+8|0;C=m}c[B>>2]=n;c[C+12>>2]=n;c[n+8>>2]=C;c[n+12>>2]=m;return}m=A>>>8;if(m)if(A>>>0>16777215)D=31;else{C=(m+1048320|0)>>>16&8;B=m<<C;m=(B+520192|0)>>>16&4;f=B<<m;B=(f+245760|0)>>>16&2;b=14-(m|C|B)+(f<<B>>>15)|0;D=A>>>(b+7|0)&1|b<<1}else D=0;b=9068+(D<<2)|0;c[n+28>>2]=D;c[n+20>>2]=0;c[n+16>>2]=0;B=c[2192]|0;f=1<<D;do if(B&f){C=A<<((D|0)==31?0:25-(D>>>1)|0);m=c[b>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(A|0)){E=124;break}F=m+16+(C>>>31<<2)|0;t=c[F>>2]|0;if(!t){E=121;break}else{C=C<<1;m=t}}if((E|0)==121)if(F>>>0<(c[2195]|0)>>>0)ia();else{c[F>>2]=n;c[n+24>>2]=m;c[n+12>>2]=n;c[n+8>>2]=n;break}else if((E|0)==124){C=m+8|0;j=c[C>>2]|0;t=c[2195]|0;if(j>>>0>=t>>>0&m>>>0>=t>>>0){c[j+12>>2]=n;c[C>>2]=n;c[n+8>>2]=j;c[n+12>>2]=m;c[n+24>>2]=0;break}else ia()}}else{c[2192]=B|f;c[b>>2]=n;c[n+24>>2]=b;c[n+12>>2]=n;c[n+8>>2]=n}while(0);n=(c[2199]|0)+-1|0;c[2199]=n;if(!n)G=9220;else return;while(1){n=c[G>>2]|0;if(!n)break;else G=n+8|0}c[2199]=-1;return}function Ac(a,b){a=a|0;b=b|0;var d=0,e=0;if(a){d=S(b,a)|0;if((b|a)>>>0>65535)e=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1;else e=d}else e=0;d=yc(e)|0;if(!d)return d|0;if(!(c[d+-4>>2]&3))return d|0;Gc(d|0,0,e|0)|0;return d|0}function Bc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a){d=yc(b)|0;return d|0}if(b>>>0>4294967231){c[(Lb()|0)>>2]=12;d=0;return d|0}e=Cc(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(e|0){d=e+8|0;return d|0}e=yc(b)|0;if(!e){d=0;return d|0}f=c[a+-4>>2]|0;g=(f&-8)-((f&3|0)==0?8:4)|0;Jc(e|0,a|0,(g>>>0<b>>>0?g:b)|0)|0;zc(a);d=e;return d|0}\nfunction Cc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a+f|0;h=c[2195]|0;i=e&3;if(!((i|0)!=1&a>>>0>=h>>>0&a>>>0<g>>>0))ia();j=c[g+4>>2]|0;if(!(j&1))ia();if(!i){if(b>>>0<256){k=0;return k|0}if(f>>>0>=(b+4|0)>>>0?(f-b|0)>>>0<=c[2311]<<1>>>0:0){k=a;return k|0}k=0;return k|0}if(f>>>0>=b>>>0){i=f-b|0;if(i>>>0<=15){k=a;return k|0}l=a+b|0;c[d>>2]=e&1|b|2;c[l+4>>2]=i|3;m=l+i+4|0;c[m>>2]=c[m>>2]|1;Dc(l,i);k=a;return k|0}if((g|0)==(c[2197]|0)){i=(c[2194]|0)+f|0;l=i-b|0;m=a+b|0;if(i>>>0<=b>>>0){k=0;return k|0}c[d>>2]=e&1|b|2;c[m+4>>2]=l|1;c[2197]=m;c[2194]=l;k=a;return k|0}if((g|0)==(c[2196]|0)){l=(c[2193]|0)+f|0;if(l>>>0<b>>>0){k=0;return k|0}m=l-b|0;i=e&1;if(m>>>0>15){n=a+b|0;o=n+m|0;c[d>>2]=i|b|2;c[n+4>>2]=m|1;c[o>>2]=m;p=o+4|0;c[p>>2]=c[p>>2]&-2;q=n;r=m}else{c[d>>2]=i|l|2;i=a+l+4|0;c[i>>2]=c[i>>2]|1;q=0;r=0}c[2193]=r;c[2196]=q;k=a;return k|0}if(j&2|0){k=0;return k|0}q=(j&-8)+f|0;if(q>>>0<b>>>0){k=0;return k|0}f=q-b|0;r=j>>>3;a:do if(j>>>0>=256){i=c[g+24>>2]|0;l=c[g+12>>2]|0;do if((l|0)==(g|0)){m=g+16|0;n=m+4|0;p=c[n>>2]|0;if(!p){o=c[m>>2]|0;if(!o){s=0;break}else{t=o;u=m}}else{t=p;u=n}while(1){n=t+20|0;p=c[n>>2]|0;if(p|0){t=p;u=n;continue}n=t+16|0;p=c[n>>2]|0;if(!p)break;else{t=p;u=n}}if(u>>>0<h>>>0)ia();else{c[u>>2]=0;s=t;break}}else{n=c[g+8>>2]|0;if(n>>>0<h>>>0)ia();p=n+12|0;if((c[p>>2]|0)!=(g|0))ia();m=l+8|0;if((c[m>>2]|0)==(g|0)){c[p>>2]=l;c[m>>2]=n;s=l;break}else ia()}while(0);if(i|0){l=c[g+28>>2]|0;n=9068+(l<<2)|0;do if((g|0)==(c[n>>2]|0)){c[n>>2]=s;if(!s){c[2192]=c[2192]&~(1<<l);break a}}else if(i>>>0>=(c[2195]|0)>>>0){c[i+16+(((c[i+16>>2]|0)!=(g|0)&1)<<2)>>2]=s;if(!s)break a;else break}else ia();while(0);l=c[2195]|0;if(s>>>0<l>>>0)ia();c[s+24>>2]=i;n=g+16|0;m=c[n>>2]|0;do if(m|0)if(m>>>0<l>>>0)ia();else{c[s+16>>2]=m;c[m+24>>2]=s;break}while(0);m=c[n+4>>2]|0;if(m|0)if(m>>>0<(c[2195]|0)>>>0)ia();else{c[s+20>>2]=m;c[m+24>>2]=s;break}}}else{m=c[g+8>>2]|0;l=c[g+12>>2]|0;i=8804+(r<<1<<2)|0;if((m|0)!=(i|0)){if(m>>>0<h>>>0)ia();if((c[m+12>>2]|0)!=(g|0))ia()}if((l|0)==(m|0)){c[2191]=c[2191]&~(1<<r);break}if((l|0)!=(i|0)){if(l>>>0<h>>>0)ia();i=l+8|0;if((c[i>>2]|0)==(g|0))v=i;else ia()}else v=l+8|0;c[m+12>>2]=l;c[v>>2]=m}while(0);v=e&1;if(f>>>0<16){c[d>>2]=q|v|2;e=a+q+4|0;c[e>>2]=c[e>>2]|1;k=a;return k|0}else{e=a+b|0;c[d>>2]=v|b|2;c[e+4>>2]=f|3;b=e+f+4|0;c[b>>2]=c[b>>2]|1;Dc(e,f);k=a;return k|0}return 0}function Dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=a+b|0;e=c[a+4>>2]|0;a:do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;i=c[2195]|0;if(g>>>0<i>>>0)ia();if((g|0)==(c[2196]|0)){j=d+4|0;k=c[j>>2]|0;if((k&3|0)!=3){l=g;m=h;break}c[2193]=h;c[j>>2]=k&-2;c[g+4>>2]=h|1;c[g+h>>2]=h;return}k=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;j=c[g+12>>2]|0;n=8804+(k<<1<<2)|0;if((f|0)!=(n|0)){if(f>>>0<i>>>0)ia();if((c[f+12>>2]|0)!=(g|0))ia()}if((j|0)==(f|0)){c[2191]=c[2191]&~(1<<k);l=g;m=h;break}if((j|0)!=(n|0)){if(j>>>0<i>>>0)ia();n=j+8|0;if((c[n>>2]|0)==(g|0))o=n;else ia()}else o=j+8|0;c[f+12>>2]=j;c[o>>2]=f;l=g;m=h;break}f=c[g+24>>2]|0;j=c[g+12>>2]|0;do if((j|0)==(g|0)){n=g+16|0;k=n+4|0;p=c[k>>2]|0;if(!p){q=c[n>>2]|0;if(!q){r=0;break}else{s=q;t=n}}else{s=p;t=k}while(1){k=s+20|0;p=c[k>>2]|0;if(p|0){s=p;t=k;continue}k=s+16|0;p=c[k>>2]|0;if(!p)break;else{s=p;t=k}}if(t>>>0<i>>>0)ia();else{c[t>>2]=0;r=s;break}}else{k=c[g+8>>2]|0;if(k>>>0<i>>>0)ia();p=k+12|0;if((c[p>>2]|0)!=(g|0))ia();n=j+8|0;if((c[n>>2]|0)==(g|0)){c[p>>2]=j;c[n>>2]=k;r=j;break}else ia()}while(0);if(f){j=c[g+28>>2]|0;i=9068+(j<<2)|0;do if((g|0)==(c[i>>2]|0)){c[i>>2]=r;if(!r){c[2192]=c[2192]&~(1<<j);l=g;m=h;break a}}else if(f>>>0>=(c[2195]|0)>>>0){c[f+16+(((c[f+16>>2]|0)!=(g|0)&1)<<2)>>2]=r;if(!r){l=g;m=h;break a}else break}else ia();while(0);j=c[2195]|0;if(r>>>0<j>>>0)ia();c[r+24>>2]=f;i=g+16|0;k=c[i>>2]|0;do if(k|0)if(k>>>0<j>>>0)ia();else{c[r+16>>2]=k;c[k+24>>2]=r;break}while(0);k=c[i+4>>2]|0;if(k)if(k>>>0<(c[2195]|0)>>>0)ia();else{c[r+20>>2]=k;c[k+24>>2]=r;l=g;m=h;break}else{l=g;m=h}}else{l=g;m=h}}else{l=a;m=b}while(0);b=c[2195]|0;if(d>>>0<b>>>0)ia();a=d+4|0;r=c[a>>2]|0;if(!(r&2)){s=c[2196]|0;if((d|0)==(c[2197]|0)){t=(c[2194]|0)+m|0;c[2194]=t;c[2197]=l;c[l+4>>2]=t|1;if((l|0)!=(s|0))return;c[2196]=0;c[2193]=0;return}if((d|0)==(s|0)){s=(c[2193]|0)+m|0;c[2193]=s;c[2196]=l;c[l+4>>2]=s|1;c[l+s>>2]=s;return}s=(r&-8)+m|0;t=r>>>3;b:do if(r>>>0>=256){o=c[d+24>>2]|0;e=c[d+12>>2]|0;do if((e|0)==(d|0)){k=d+16|0;j=k+4|0;f=c[j>>2]|0;if(!f){n=c[k>>2]|0;if(!n){u=0;break}else{v=n;w=k}}else{v=f;w=j}while(1){j=v+20|0;f=c[j>>2]|0;if(f|0){v=f;w=j;continue}j=v+16|0;f=c[j>>2]|0;if(!f)break;else{v=f;w=j}}if(w>>>0<b>>>0)ia();else{c[w>>2]=0;u=v;break}}else{j=c[d+8>>2]|0;if(j>>>0<b>>>0)ia();f=j+12|0;if((c[f>>2]|0)!=(d|0))ia();k=e+8|0;if((c[k>>2]|0)==(d|0)){c[f>>2]=e;c[k>>2]=j;u=e;break}else ia()}while(0);if(o|0){e=c[d+28>>2]|0;h=9068+(e<<2)|0;do if((d|0)==(c[h>>2]|0)){c[h>>2]=u;if(!u){c[2192]=c[2192]&~(1<<e);break b}}else if(o>>>0>=(c[2195]|0)>>>0){c[o+16+(((c[o+16>>2]|0)!=(d|0)&1)<<2)>>2]=u;if(!u)break b;else break}else ia();while(0);e=c[2195]|0;if(u>>>0<e>>>0)ia();c[u+24>>2]=o;h=d+16|0;g=c[h>>2]|0;do if(g|0)if(g>>>0<e>>>0)ia();else{c[u+16>>2]=g;c[g+24>>2]=u;break}while(0);g=c[h+4>>2]|0;if(g|0)if(g>>>0<(c[2195]|0)>>>0)ia();else{c[u+20>>2]=g;c[g+24>>2]=u;break}}}else{g=c[d+8>>2]|0;e=c[d+12>>2]|0;o=8804+(t<<1<<2)|0;if((g|0)!=(o|0)){if(g>>>0<b>>>0)ia();if((c[g+12>>2]|0)!=(d|0))ia()}if((e|0)==(g|0)){c[2191]=c[2191]&~(1<<t);break}if((e|0)!=(o|0)){if(e>>>0<b>>>0)ia();o=e+8|0;if((c[o>>2]|0)==(d|0))x=o;else ia()}else x=e+8|0;c[g+12>>2]=e;c[x>>2]=g}while(0);c[l+4>>2]=s|1;c[l+s>>2]=s;if((l|0)==(c[2196]|0)){c[2193]=s;return}else y=s}else{c[a>>2]=r&-2;c[l+4>>2]=m|1;c[l+m>>2]=m;y=m}m=y>>>3;if(y>>>0<256){r=8804+(m<<1<<2)|0;a=c[2191]|0;s=1<<m;if(a&s){m=r+8|0;x=c[m>>2]|0;if(x>>>0<(c[2195]|0)>>>0)ia();else{z=m;A=x}}else{c[2191]=a|s;z=r+8|0;A=r}c[z>>2]=l;c[A+12>>2]=l;c[l+8>>2]=A;c[l+12>>2]=r;return}r=y>>>8;if(r)if(y>>>0>16777215)B=31;else{A=(r+1048320|0)>>>16&8;z=r<<A;r=(z+520192|0)>>>16&4;s=z<<r;z=(s+245760|0)>>>16&2;a=14-(r|A|z)+(s<<z>>>15)|0;B=y>>>(a+7|0)&1|a<<1}else B=0;a=9068+(B<<2)|0;c[l+28>>2]=B;c[l+20>>2]=0;c[l+16>>2]=0;z=c[2192]|0;s=1<<B;if(!(z&s)){c[2192]=z|s;c[a>>2]=l;c[l+24>>2]=a;c[l+12>>2]=l;c[l+8>>2]=l;return}s=y<<((B|0)==31?0:25-(B>>>1)|0);B=c[a>>2]|0;while(1){if((c[B+4>>2]&-8|0)==(y|0)){C=121;break}D=B+16+(s>>>31<<2)|0;a=c[D>>2]|0;if(!a){C=118;break}else{s=s<<1;B=a}}if((C|0)==118){if(D>>>0<(c[2195]|0)>>>0)ia();c[D>>2]=l;c[l+24>>2]=B;c[l+12>>2]=l;c[l+8>>2]=l;return}else if((C|0)==121){C=B+8|0;D=c[C>>2]|0;s=c[2195]|0;if(!(D>>>0>=s>>>0&B>>>0>=s>>>0))ia();c[D+12>>2]=l;c[C>>2]=l;c[l+8>>2]=D;c[l+12>>2]=B;c[l+24>>2]=0;return}}function Ec(){}function Fc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (D=e,a-c>>>0|0)|0}function Gc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=f&-4|0;h=g-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(h|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function Ic(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function Jc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return la(b|0,d|0,e|0)|0;f=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}h=g&-4|0;e=h-64|0;while((b|0)<=(e|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(h|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{h=g-4|0;while((b|0)<(h|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return f|0}function Kc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (D=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function Lc(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function Mc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;g=a;h=b;i=h;j=d;k=e;l=k;if(!i){m=(f|0)!=0;if(!l){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (D=n,o)|0}else{if(!m){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return (D=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(V(l|0)|0)-(V(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}r=j-1|0;if(r&j|0){s=(V(j|0)|0)+33-(V(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(f|0){c[f>>2]=r&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (D=n,o)|0}else{r=Lc(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (D=n,o)|0}}else{if(m){if(f|0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (D=n,o)|0}if(!g){if(f|0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (D=n,o)|0}r=l-1|0;if(!(r&l)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=r&i|b&0}n=0;o=i>>>((Lc(l|0)|0)>>>0);return (D=n,o)|0}r=(V(l|0)|0)-(V(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!f){n=0;o=0;return (D=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return (D=n,o)|0}while(0);if(!t){B=x;C=w;E=v;F=u;G=0;H=0}else{b=d|0|0;d=k|e&0;e=Kc(b|0,d|0,-1,-1)|0;k=D;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Fc(e|0,k|0,g|0,a|0)|0;i=D;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Fc(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&d|0)|0;w=D;u=u-1|0}while((u|0)!=0);B=h;C=x;E=w;F=v;G=0;H=t}t=C;C=0;if(f|0){c[f>>2]=F;c[f+4>>2]=E}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|G;o=(t<<1|0>>>31)&-2|H;return (D=n,o)|0}function Nc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Mc(a,b,c,d,0)|0}function Oc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=S(d,c)|0;f=a>>>16;a=(e>>>16)+(S(d,f)|0)|0;d=b>>>16;b=S(d,c)|0;return (D=(a>>>16)+(S(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Pc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=Oc(e,a)|0;f=D;return (D=(S(b,a)|0)+(S(d,e)|0)+f|f&0,c|0|0)|0}function Qc(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Jc(b,c,d)|0;return b|0}function Rc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f|0;Mc(a,b,d,e,g)|0;l=f;return (D=c[g+4>>2]|0,c[g>>2]|0)|0}function Sc(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Tc(a){a=a|0;var b=0,d=0;a=a+15&-16|0;b=c[i>>2]|0;d=b+a|0;if((a|0)>0&(d|0)<(b|0)|(d|0)<0){_()|0;ha(12);return -1}c[i>>2]=d;if((d|0)>(Z()|0)?(Y()|0)==0:0){ha(12);c[i>>2]=b;return -1}return b|0}function Uc(a,b){a=a|0;b=b|0;return sa[a&3](b|0)|0}function Vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ta[a&7](b|0,c|0,d|0)|0}function Wc(a,b,c){a=a|0;b=b|0;c=c|0;return ua[a&3](b|0,c|0)|0}function Xc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return va[a&1](b|0,c|0,d|0,e|0)|0}function Yc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;wa[a&3](b|0,c|0,d|0,e|0)}function Zc(a){a=a|0;W(0);return 0}function _c(a,b,c){a=a|0;b=b|0;c=c|0;W(1);return 0}function $c(a,b){a=a|0;b=b|0;W(2);return 0}function ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(3);return 0}function bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(4)}\n\n// EMSCRIPTEN_END_FUNCS\nvar sa=[Zc,ob,Hb,Zc];var ta=[_c,mb,Pb,Jb,Ib,_c,_c,_c];var ua=[$c,Bc,ab,$c];var va=[ad,nb];var wa=[bd,Fa,jb,bd];return{_ogv_demuxer_receive_input:hb,stackSave:ya,getTempRet0:Da,___udivdi3:Nc,setThrew:Ba,_bitshift64Lshr:Hc,_bitshift64Shl:Ic,_ogv_demuxer_keypoint_offset:ub,_ogv_demuxer_process:ib,_memset:Gc,_ogv_demuxer_destroy:pb,_sbrk:Tc,_ogv_demuxer_media_duration:sb,stackAlloc:xa,___muldi3:Pc,___uremdi3:Rc,_llvm_cttz_i32:Lc,_i64Subtract:Fc,___udivmoddi4:Mc,setTempRet0:Ca,_i64Add:Kc,_ogv_demuxer_seekable:tb,_ogv_demuxer_media_length:rb,_ogv_demuxer_seek_to_keypoint:vb,stackRestore:za,_llvm_bswap_i32:Sc,___muldsi3:Oc,_free:zc,runPostSets:Ec,establishStackSpace:Aa,_ogv_demuxer_flush:qb,_ogv_demuxer_init:gb,_emscripten_get_global_libc:Gb,_malloc:yc,_memcpy:Jc,_memmove:Qc,stackAlloc:xa,stackSave:ya,stackRestore:za,establishStackSpace:Aa,setThrew:Ba,setTempRet0:Ca,getTempRet0:Da,dynCall_ii:Uc,dynCall_iiii:Vc,dynCall_iii:Wc,dynCall_iiiii:Xc,dynCall_viiii:Yc}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _ogv_demuxer_receive_input=Module[\"_ogv_demuxer_receive_input\"]=asm[\"_ogv_demuxer_receive_input\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _ogv_demuxer_keypoint_offset=Module[\"_ogv_demuxer_keypoint_offset\"]=asm[\"_ogv_demuxer_keypoint_offset\"];var _ogv_demuxer_process=Module[\"_ogv_demuxer_process\"]=asm[\"_ogv_demuxer_process\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _ogv_demuxer_destroy=Module[\"_ogv_demuxer_destroy\"]=asm[\"_ogv_demuxer_destroy\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _ogv_demuxer_media_duration=Module[\"_ogv_demuxer_media_duration\"]=asm[\"_ogv_demuxer_media_duration\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var _llvm_cttz_i32=Module[\"_llvm_cttz_i32\"]=asm[\"_llvm_cttz_i32\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var ___udivmoddi4=Module[\"___udivmoddi4\"]=asm[\"___udivmoddi4\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _ogv_demuxer_seekable=Module[\"_ogv_demuxer_seekable\"]=asm[\"_ogv_demuxer_seekable\"];var _ogv_demuxer_media_length=Module[\"_ogv_demuxer_media_length\"]=asm[\"_ogv_demuxer_media_length\"];var _ogv_demuxer_seek_to_keypoint=Module[\"_ogv_demuxer_seek_to_keypoint\"]=asm[\"_ogv_demuxer_seek_to_keypoint\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var ___muldsi3=Module[\"___muldsi3\"]=asm[\"___muldsi3\"];var _free=Module[\"_free\"]=asm[\"_free\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var _ogv_demuxer_flush=Module[\"_ogv_demuxer_flush\"]=asm[\"_ogv_demuxer_flush\"];var _ogv_demuxer_init=Module[\"_ogv_demuxer_init\"]=asm[\"_ogv_demuxer_init\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiii=Module[\"dynCall_iiiii\"]=asm[\"dynCall_iiiii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=false;if(Module[\"noInitialRun\"]){shouldRunNow=false}Module[\"noExitRuntime\"]=true;run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module._free(inputBuffer)}inputBufferSize=size;inputBuffer=Module._malloc(inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance===\"undefined\"||typeof performance.now===\"undefined\"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();var delta=getTimestamp()-start;Module.cpuTime+=delta;return ret}Module.loadedMetadata=false;Module.videoCodec=null;Module.audioCodec=null;Module.duration=NaN;Module.onseek=null;Module.cpuTime=0;Module.audioPackets=[];Object.defineProperty(Module,\"hasAudio\",{get:(function(){return Module.loadedMetadata&&Module.audioCodec})});Object.defineProperty(Module,\"audioReady\",{get:(function(){return Module.audioPackets.length>0})});Object.defineProperty(Module,\"audioTimestamp\",{get:(function(){if(Module.audioPackets.length>0){return Module.audioPackets[0].timestamp}else{return-1}})});Module.videoPackets=[];Object.defineProperty(Module,\"hasVideo\",{get:(function(){return Module.loadedMetadata&&Module.videoCodec})});Object.defineProperty(Module,\"frameReady\",{get:(function(){return Module.videoPackets.length>0})});Object.defineProperty(Module,\"frameTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].timestamp}else{return-1}})});Object.defineProperty(Module,\"keyframeTimestamp\",{get:(function(){if(Module.videoPackets.length>0){return Module.videoPackets[0].keyframeTimestamp}else{return-1}})});Object.defineProperty(Module,\"nextKeyframeTimestamp\",{get:(function(){for(var i=0;i<Module.videoPackets.length;i++){var packet=Module.videoPackets[i];if(packet.isKeyframe){return packet.timestamp}}return-1})});Object.defineProperty(Module,\"processing\",{get:function getProcessing(){return false}});Object.defineProperty(Module,\"seekable\",{get:(function(){return!!Module._ogv_demuxer_seekable()})});Module.init=(function(callback){function finish(){time((function(){Module._ogv_demuxer_init()}));callback()}if(Module.wasmBinary){Module.onRuntimeInitialized=(function(){finish()})}else{finish()}});Module.receiveInput=(function(data,callback){var ret=time((function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);Module.HEAPU8.set(new Uint8Array(data),buffer);Module._ogv_demuxer_receive_input(buffer,len)}));callback()});Module.process=(function(callback){var ret=time((function(){return Module._ogv_demuxer_process()}));callback(!!ret)});Module.dequeueVideoPacket=(function(callback){if(Module.videoPackets.length){var packet=Module.videoPackets.shift().data;callback(packet)}else{callback(null)}});Module.dequeueAudioPacket=(function(callback){if(Module.audioPackets.length){var packet=Module.audioPackets.shift().data;callback(packet)}else{callback(null)}});Module.getKeypointOffset=(function(timeSeconds,callback){var offset=time((function(){return Module._ogv_demuxer_keypoint_offset(timeSeconds*1e3)}));callback(offset)});Module.seekToKeypoint=(function(timeSeconds,callback){var ret=time((function(){return Module._ogv_demuxer_seek_to_keypoint(timeSeconds*1e3)}));if(ret){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length)}callback(!!ret)});Module.flush=(function(callback){time((function(){Module.audioPackets.splice(0,Module.audioPackets.length);Module.videoPackets.splice(0,Module.videoPackets.length);Module._ogv_demuxer_flush()}));callback()});Module.close=(function(){});Math.imul=Math_imul_orig\n\n\n\n\n\n  return OGVDemuxerWebM;\n};\n})();\n"
  },
  {
    "path": "app/vendor/ogv.js/ogv-support.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\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t//\n\t// -- ogv-support.js\n\t// https://github.com/brion/ogv.js\n\t// Copyright (c) 2013-2016 Brion Vibber\n\t//\n\n\t(function() {\n\n\t  var OGVCompat = __webpack_require__(1),\n\t    OGVVersion = (\"1.4.2-20170425024925-504d7197\");\n\n\t  if (window) {\n\t    // 1.0-compat globals\n\t    window.OGVCompat = OGVCompat;\n\t    window.OGVVersion = OGVVersion;\n\t  }\n\n\t  module.exports = {\n\t    OGVCompat: OGVCompat,\n\t    OGVVersion: OGVVersion\n\t  };\n\n\t})();\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar BogoSlow = __webpack_require__(2);\n\n\tvar OGVCompat = {\n\t\tbenchmark: new BogoSlow(),\n\n\t\thasTypedArrays: function() {\n\t\t\t// emscripten-compiled code requires typed arrays\n\t\t\treturn !!window.Uint32Array;\n\t\t},\n\n\t\thasWebAudio: function() {\n\t\t\treturn !!(window.AudioContext || window.webkitAudioContext);\n\t\t},\n\n\t\thasFlash: function() {\n\t\t\tif (navigator.userAgent.indexOf('Trident') !== -1) {\n\t\t\t\t// We only do the ActiveX test because we only need Flash in\n\t\t\t\t// Internet Explorer 10/11. Other browsers use Web Audio directly\n\t\t\t\t// (Edge, Safari) or native playback, so there's no need to test\n\t\t\t\t// other ways of loading Flash.\n\t\t\t\ttry {\n\t\t\t\t\tvar obj = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n\t\t\t\t\treturn true;\n\t\t\t\t} catch(e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\thasAudio: function() {\n\t\t\treturn this.hasWebAudio() || this.hasFlash();\n\t\t},\n\n\t\tisBlacklisted: function(userAgent) {\n\t\t\t// JIT bugs in old Safari versions\n\t\t\tvar blacklist = [\n\t\t\t\t/\\(i.* OS [67]_.* like Mac OS X\\).* Mobile\\/.* Safari\\//,\n\t\t\t\t/\\(Macintosh.* Version\\/6\\..* Safari\\/\\d/\n\t\t\t];\n\t\t\tvar blacklisted = false;\n\t\t\tblacklist.forEach(function(regex) {\n\t\t\t\tif (userAgent.match(regex)) {\n\t\t\t\t\tblacklisted = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn blacklisted;\n\t\t},\n\n\t\tisSlow: function() {\n\t\t\treturn this.benchmark.slow;\n\t\t},\n\n\t\tisTooSlow: function() {\n\t\t\treturn this.benchmark.tooSlow;\n\t\t},\n\n\t\tsupported: function(component) {\n\t\t\tif (component === 'OGVDecoder') {\n\t\t\t\treturn (this.hasTypedArrays() && !this.isBlacklisted(navigator.userAgent));\n\t\t\t}\n\t\t\tif (component === 'OGVPlayer') {\n\t\t\t\treturn (this.supported('OGVDecoder') && this.hasAudio() && !this.isTooSlow());\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tmodule.exports = OGVCompat;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * A quick CPU/JS engine benchmark to guesstimate whether we're\n\t * fast enough to handle 360p video in JavaScript.\n\t */\n\tfunction BogoSlow() {\n\t\tvar self = this;\n\n\t\tvar timer;\n\t\t// FIXME: avoid to use window scope here\n\t\tif (window.performance && window.performance.now) {\n\t\t\ttimer = function() {\n\t\t\t\treturn window.performance.now();\n\t\t\t};\n\t\t} else {\n\t\t\ttimer = function() {\n\t\t\t\treturn Date.now();\n\t\t\t};\n\t\t}\n\n\t\tvar savedSpeed = null;\n\t\tfunction run() {\n\t\t\tvar ops = 0;\n\t\t\tvar fibonacci = function(n) {\n\t\t\t\tops++;\n\t\t\t\tif (n < 2) {\n\t\t\t\t\treturn n;\n\t\t\t\t} else {\n\t\t\t\t\treturn fibonacci(n - 2) + fibonacci(n - 1);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar start = timer();\n\n\t\t\tfibonacci(30);\n\n\t\t\tvar delta = timer() - start;\n\t\t\tsavedSpeed = (ops / delta);\n\t\t}\n\n\t\t/**\n\t\t * Return a scale value of operations/sec from the benchmark.\n\t\t * If the benchmark has already been run, uses a memoized result.\n\t\t *\n\t\t * @property {number}\n\t\t */\n\t\tObject.defineProperty(self, 'speed', {\n\t\t\tget: function() {\n\t\t\t\tif (savedSpeed === null) {\n\t\t\t\t\trun();\n\t\t\t\t}\n\t\t\t\treturn savedSpeed;\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Return the defined cutoff speed value for 'slow' devices,\n\t\t * based on results measured from some test devices.\n\t\t *\n\t\t * @property {number}\n\t\t */\n\t\tObject.defineProperty(self, 'slowCutoff', {\n\t\t\tget: function() {\n\t\t\t\t// 2012 Retina MacBook Pro (Safari 7)  ~150,000\n\t\t\t\t// 2009 Dell T5500         (IE 11)     ~100,000\n\t\t\t\t// iPad Air                (iOS 7)      ~65,000\n\t\t\t\t// 2010 MBP / OS X 10.9    (Safari 7)   ~62,500\n\t\t\t\t// 2010 MBP / Win7 VM      (IE 11)      ~50,000+-\n\t\t\t\t//   ^ these play 360p ok\n\t\t\t\t// ----------- line of moderate doom ----------\n\t\t\t\treturn 50000;\n\t\t\t\t//   v these play 160p ok\n\t\t\t\t// iPad Mini non-Retina    (iOS 8 beta) ~25,000\n\t\t\t\t// Dell Inspiron Duo       (IE 11)      ~25,000\n\t\t\t\t// Surface RT              (IE 11)      ~18,000\n\t\t\t\t// iPod Touch 5th-gen      (iOS 8 beta) ~16,000\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Return the defined cutoff speed value for 'too slow' devices,\n\t\t * based on results measured from some test devices.\n\t\t *\n\t\t * No longer used.\n\t\t *\n\t\t * @property {number}\n\t\t * @deprecated\n\t\t */\n\t\tObject.defineProperty(self, 'tooSlowCutoff', {\n\t\t\tget: function() {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * 'Slow' devices can play audio and should sorta play our\n\t\t * extra-tiny Wikimedia 160p15 transcodes\n\t\t *\n\t\t * @property {boolean}\n\t\t */\n\t\tObject.defineProperty(self, 'slow', {\n\t\t\tget: function() {\n\t\t\t\treturn (self.speed < self.slowCutoff);\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * 'Too slow' devices aren't reliable at all\n\t\t *\n\t\t * @property {boolean}\n\t\t */\n\t\tObject.defineProperty(self, 'tooSlow', {\n\t\t\tget: function() {\n\t\t\t\treturn (self.speed < self.tooSlowCutoff);\n\t\t\t}\n\t\t});\n\t}\n\n\tmodule.exports = BogoSlow;\n\n\n/***/ })\n/******/ ]);"
  },
  {
    "path": "app/vendor/ogv.js/ogv-version.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\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t//\n\t// -- ogv-support.js\n\t// https://github.com/brion/ogv.js\n\t// Copyright (c) 2013-2016 Brion Vibber\n\t//\n\n\t(function() {\n\n\t  var OGVVersion = (\"1.4.2-20170425024925-504d7197\");\n\n\t  if (window) {\n\t    // 1.0-compat globals\n\t    window.OGVVersion = OGVVersion;\n\t  }\n\n\t  module.exports = {\n\t    OGVVersion: OGVVersion\n\t  };\n\n\t})();\n\n\n/***/ })\n/******/ ]);"
  },
  {
    "path": "app/vendor/ogv.js/ogv-worker-audio.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\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1);\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVWorkerSupport = __webpack_require__(2);\n\n\tvar proxy = new OGVWorkerSupport([\n\t\t'loadedMetadata',\n\t\t'audioFormat',\n\t\t'audioBuffer',\n\t\t'cpuTime'\n\t], {\n\t\tinit: function(args, callback) {\n\t\t\tthis.target.init(callback);\n\t\t},\n\n\t\tprocessHeader: function(args, callback) {\n\t\t\tthis.target.processHeader(args[0], function(ok) {\n\t\t\t\tcallback([ok]);\n\t\t\t});\n\t\t},\n\n\t\tprocessAudio: function(args, callback) {\n\t\t\tthis.target.processAudio(args[0], function(ok) {\n\t\t\t\tcallback([ok]);\n\t\t\t});\n\t\t}\n\t});\n\n\tmodule.exports = proxy;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVLoader = __webpack_require__(3);\n\n\t/**\n\t * Web Worker wrapper for codec fun\n\t */\n\tfunction OGVWorkerSupport(propList, handlers) {\n\n\t\tvar transferables = (function() {\n\t\t\tvar buffer = new ArrayBuffer(1024),\n\t\t\t\tbytes = new Uint8Array(buffer);\n\t\t\ttry {\n\t\t\t\tpostMessage({\n\t\t\t\t\taction: 'transferTest',\n\t\t\t\t\tbytes: bytes\n\t\t\t\t}, [buffer]);\n\t\t\t\tif (buffer.byteLength) {\n\t\t\t\t\t// No transferable support\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t})();\n\n\t\tvar self = this;\n\t\tself.target = null;\n\n\t\tvar sentProps = {},\n\t\t\tpendingEvents = [];\n\n\t\tfunction copyObject(obj) {\n\t\t\tvar copy = {};\n\t\t\tfor (var prop in obj) {\n\t\t\t\tif (obj.hasOwnProperty(prop)) {\n\t\t\t\t\tcopy[prop] = obj[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn copy;\n\t\t}\n\n\t\tfunction copyAudioBuffer(data) {\n\t\t\tif (data == null) {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\t// Array of Float32Arrays\n\t\t\t\tvar copy = [];\n\t\t\t\tfor (var i = 0; i < data.length; i++) {\n\t\t\t\t\tcopy[i] = new Float32Array(data[i]);\n\t\t\t\t}\n\t\t\t\treturn copy;\n\t\t\t}\n\t\t}\n\n\t\tfunction handleEvent(data) {\n\t\t\thandlers[data.action].call(self, data.args, function(args) {\n\t\t\t\targs = args || [];\n\n\t\t\t\t// Collect and send any changed properties...\n\t\t\t\tvar props = {},\n\t\t\t\t\ttransfers = [];\n\t\t\t\tpropList.forEach(function(propName) {\n\t\t\t\t\tvar propVal = self.target[propName];\n\n\t\t\t\t\tif (sentProps[propName] !== propVal) {\n\t\t\t\t\t\t// Save this value for later reference...\n\t\t\t\t\t\tsentProps[propName] = propVal;\n\n\t\t\t\t\t\tif (propName == 'duration' && isNaN(propVal) && isNaN(sentProps[propName])) {\n\t\t\t\t\t\t\t// NaN is not === itself. Nice!\n\t\t\t\t\t\t\t// no need to update it here.\n\t\t\t\t\t\t} else if (propName == 'audioBuffer') {\n\t\t\t\t\t\t\t// Don't send the entire emscripten heap!\n\t\t\t\t\t\t\tpropVal = copyAudioBuffer(propVal);\n\t\t\t\t\t\t\tprops[propName] = propVal;\n\t\t\t\t\t\t\tif (propVal) {\n\t\t\t\t\t\t\t\tfor (var i = 0; i < propVal.length; i++) {\n\t\t\t\t\t\t\t\t\ttransfers.push(propVal[i].buffer);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (propName == 'frameBuffer') {\n\t\t\t\t\t\t\t// We already extract ahead of time now,\n\t\t\t\t\t\t\t// so transfer the small buffers.\n\t\t\t\t\t\t\tprops[propName] = propVal;\n\t\t\t\t\t\t\tif (propVal) {\n\t\t\t\t\t\t\t\ttransfers.push(propVal.y.bytes.buffer);\n\t\t\t\t\t\t\t\ttransfers.push(propVal.u.bytes.buffer);\n\t\t\t\t\t\t\t\ttransfers.push(propVal.v.bytes.buffer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprops[propName] = propVal;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tvar out = {\n\t\t\t\t\taction: 'callback',\n\t\t\t\t\tcallbackId: data.callbackId,\n\t\t\t\t\targs: args,\n\t\t\t\t\tprops: props\n\t\t\t\t};\n\t\t\t\tif (transferables) {\n\t\t\t\t\tpostMessage(out, transfers);\n\t\t\t\t} else {\n\t\t\t\t\tpostMessage(out);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\thandlers.construct = function(args, callback) {\n\t\t\tvar className = args[0],\n\t\t\t\toptions = args[1];\n\n\t\t\tOGVLoader.loadClass(className, function(classObj) {\n\t\t\t\tself.target = new classObj(options);\n\t\t\t\tcallback();\n\t\t\t\twhile (pendingEvents.length) {\n\t\t\t\t\thandleEvent(pendingEvents.shift());\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\taddEventListener('message', function workerOnMessage(event) {\n\t\t\tvar data = event.data;\n\t\t\tif (!data || typeof data !== 'object') {\n\t\t\t\t// invalid\n\t\t\t\treturn;\n\t\t\t} else if (data.action == 'transferTest') {\n\t\t\t\t// ignore\n\t\t\t} else if (typeof data.action !== 'string' || typeof data.callbackId !== 'string' || typeof data.args !== 'object') {\n\t\t\t\tconsole.log('invalid message data', data);\n\t\t\t} else if (!(data.action in handlers)) {\n\t\t\t\tconsole.log('invalid message action', data.action);\n\t\t\t} else if (data.action == 'construct') {\n\t\t\t\t// always handle constructor\n\t\t\t\thandleEvent(data);\n\t\t\t} else if (!self.target) {\n\t\t\t\t// queue until constructed\n\t\t\t\tpendingEvents.push(data);\n\t\t\t} else {\n\t\t\t\thandleEvent(data);\n\t\t\t}\n\t\t});\n\n\t}\n\n\tmodule.exports = OGVWorkerSupport;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVVersion = (\"1.4.2-20170425024925-504d7197\");\n\n\t(function() {\n\t\tvar global = this;\n\n\t\tvar scriptMap = {\n\t\t\tOGVDemuxerOgg: 'ogv-demuxer-ogg.js',\n\t\t\tOGVDemuxerOggW: 'ogv-demuxer-ogg-wasm.js',\n\t\t\tOGVDemuxerWebM: 'ogv-demuxer-webm.js',\n\t\t\tOGVDemuxerWebMW: 'ogv-demuxer-webm-wasm.js',\n\t\t\tOGVDecoderAudioOpus: 'ogv-decoder-audio-opus.js',\n\t\t\tOGVDecoderAudioOpusW: 'ogv-decoder-audio-opus-wasm.js',\n\t\t\tOGVDecoderAudioVorbis: 'ogv-decoder-audio-vorbis.js',\n\t\t\tOGVDecoderAudioVorbisW: 'ogv-decoder-audio-vorbis-wasm.js',\n\t\t\tOGVDecoderVideoTheora: 'ogv-decoder-video-theora.js',\n\t\t\tOGVDecoderVideoTheoraW: 'ogv-decoder-video-theora-wasm.js',\n\t\t\tOGVDecoderVideoVP8: 'ogv-decoder-video-vp8.js',\n\t\t\tOGVDecoderVideoVP8W: 'ogv-decoder-video-vp8-wasm.js',\n\t\t\tOGVDecoderVideoVP8MT: 'ogv-decoder-video-vp8-mt.js',\n\t\t\tOGVDecoderVideoVP9: 'ogv-decoder-video-vp9.js',\n\t\t\tOGVDecoderVideoVP9W: 'ogv-decoder-video-vp9-wasm.js',\n\t\t\tOGVDecoderVideoVP9MT: 'ogv-decoder-video-vp9-mt.js'\n\t\t};\n\n\t  // @fixme make this less awful\n\t\tvar proxyTypes = {\n\t\t\tOGVDecoderAudioOpus: 'audio',\n\t\t\tOGVDecoderAudioOpusW: 'audio',\n\t\t\tOGVDecoderAudioVorbis: 'audio',\n\t\t\tOGVDecoderAudioVorbisW: 'audio',\n\t\t\tOGVDecoderVideoTheora: 'video',\n\t\t\tOGVDecoderVideoTheoraW: 'video',\n\t\t\tOGVDecoderVideoVP8: 'video',\n\t\t\tOGVDecoderVideoVP8W: 'video',\n\t\t\tOGVDecoderVideoVP9: 'video',\n\t\t\tOGVDecoderVideoVP9W: 'video'\n\t\t};\n\t\tvar proxyInfo = {\n\t\t\taudio: {\n\t\t\t\tproxy: __webpack_require__(4),\n\t\t\t\tworker: 'ogv-worker-audio.js',\n\t\t\t},\n\t\t\tvideo: {\n\t\t\t\tproxy: __webpack_require__(6),\n\t\t\t\tworker: 'ogv-worker-video.js'\n\t\t\t}\n\t\t}\n\n\t\tfunction urlForClass(className) {\n\t\t\tvar scriptName = scriptMap[className];\n\t\t\tif (scriptName) {\n\t\t\t\treturn urlForScript(scriptName);\n\t\t\t} else {\n\t\t\t\tthrow new Error('asked for URL for unknown class ' + className);\n\t\t\t}\n\t\t};\n\n\t\tfunction urlForScript(scriptName) {\n\t\t\tif (scriptName) {\n\t\t\t\tvar base = OGVLoader.base;\n\t\t\t\tif (base === undefined) {\n\t\t\t\t\tbase = '';\n\t\t\t\t} else {\n\t\t\t\t\tbase += '/';\n\t\t\t\t}\n\t\t\t\treturn base + scriptName + '?version=' + encodeURIComponent(OGVVersion);\n\t\t\t} else {\n\t\t\t\tthrow new Error('asked for URL for unknown script ' + scriptName);\n\t\t\t}\n\t\t};\n\n\t\tvar scriptStatus = {},\n\t\t\tscriptCallbacks = {};\n\t\tfunction loadWebScript(src, callback) {\n\t\t\tif (scriptStatus[src] == 'done') {\n\t\t\t\tcallback();\n\t\t\t} else if (scriptStatus[src] == 'loading') {\n\t\t\t\tscriptCallbacks[src].push(callback);\n\t\t\t} else {\n\t\t\t\tscriptStatus[src] = 'loading';\n\t\t\t\tscriptCallbacks[src] = [callback];\n\n\t\t\t\tvar scriptNode = document.createElement('script');\n\t\t\t\tfunction done(event) {\n\t\t\t\t\tvar callbacks = scriptCallbacks[src];\n\t\t\t\t\tdelete scriptCallbacks[src];\n\t\t\t\t\tscriptStatus[src] = 'done';\n\n\t\t\t\t\tcallbacks.forEach(function(cb) {\n\t\t\t\t\t\tcb();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tscriptNode.addEventListener('load', done);\n\t\t\t\tscriptNode.addEventListener('error', done);\n\t\t\t\tscriptNode.src = src;\n\t\t\t\tdocument.querySelector('head').appendChild(scriptNode);\n\t\t\t}\n\t\t}\n\n\t\tfunction loadWebAssembly(src, callback) {\n\t\t\tif (!src.match(/-wasm\\.js/)) {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tvar wasmSrc = src.replace(/-wasm\\.js/, '-wasm.wasm');\n\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\txhr.responseType = 'arraybuffer';\n\t\t\t\txhr.onload = function() {\n\t\t\t\t\tcallback(xhr.response);\n\t\t\t\t};\n\t\t\t\txhr.onerror = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\txhr.open('GET', wasmSrc);\n\t\t\t\txhr.send();\n\t\t\t}\n\t\t}\n\n\t\tfunction defaultBase() {\n\t\t\tif (typeof global.window === 'object') {\n\n\t\t\t\t// for browser, try to autodetect\n\t\t\t\tvar scriptNodes = document.querySelectorAll('script'),\n\t\t\t\t\tregex = /^(?:|(.*)\\/)ogv(?:-support)?\\.js(?:\\?|#|$)/,\n\t\t\t\t\tpath,\n\t\t\t\t\tmatches;\n\t\t\t\tfor (var i = 0; i < scriptNodes.length; i++) {\n\t\t\t\t\tpath = scriptNodes[i].getAttribute('src');\n\t\t\t\t\tif (path) {\n\t\t\t\t\t\tmatches = path.match(regex);\n\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\treturn matches[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn undefined; // current dir\n\n\t\t\t} else {\n\n\t\t\t\t// for workers, assume current directory\n\t\t\t\t// if not a worker, too bad.\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\t\t}\n\n\t\tvar OGVLoader = {\n\t\t\tbase: defaultBase(),\n\n\t\t\tloadClass: function(className, callback, options) {\n\t\t\t\toptions = options || {};\n\t\t\t\tif (options.worker) {\n\t\t\t\t\tthis.workerProxy(className, callback);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar url = urlForClass(className);\n\t\t\t\tloadWebAssembly(url, function(wasmBinary) {\n\t\t\t\t\tfunction wasmClassWrapper(options) {\n\t\t\t\t\t\toptions = options || {};\n\t\t\t\t\t\tif (wasmBinary !== null) {\n\t\t\t\t\t\t\toptions.wasmBinary = wasmBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new global[className](options);\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof global[className] === 'function') {\n\t\t\t\t\t\t// already loaded!\n\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t} else if (typeof global.window === 'object') {\n\t\t\t\t\t\tloadWebScript(url, function() {\n\t\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (typeof global.importScripts === 'function') {\n\t\t\t\t\t\t// worker has convenient sync importScripts\n\t\t\t\t\t\tglobal.importScripts(url);\n\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tworkerProxy: function(className, callback) {\n\t\t\t\tvar proxyType = proxyTypes[className],\n\t\t\t\t\tinfo = proxyInfo[proxyType];\n\n\t\t\t\tif (!info) {\n\t\t\t\t\tthrow new Error('Requested worker for class with no proxy: ' + className);\n\t\t\t\t}\n\n\t\t\t\tvar proxyClass = info.proxy,\n\t\t\t\t\tworkerScript = info.worker,\n\t\t\t\t\tcodecUrl = urlForScript(scriptMap[className]),\n\t\t\t\t\tworkerUrl = urlForScript(workerScript),\n\t\t\t\t\tworker;\n\n\t\t\t\tvar construct = function(options) {\n\t\t\t\t\treturn new proxyClass(worker, className, options);\n\t\t\t\t};\n\n\t\t\t\tif (workerUrl.match(/^https?:|\\/\\//i)) {\n\t\t\t\t\t// Can't load workers natively cross-domain, but if CORS\n\t\t\t\t\t// is set up we can fetch the worker stub and the desired\n\t\t\t\t\t// class and load them from a blob.\n\t\t\t\t\tvar getCodec,\n\t\t\t\t\t\tgetWorker,\n\t\t\t\t\t\tcodecResponse,\n\t\t\t\t\t\tworkerResponse,\n\t\t\t\t\t\tcodecLoaded = false,\n\t\t\t\t\t\tworkerLoaded = false,\n\t\t\t\t\t\tblob;\n\n\t\t\t\t\tfunction completionCheck() {\n\t\t\t\t\t\tif ((codecLoaded == true) && (workerLoaded == true)) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tblob = new Blob([codecResponse + \" \" + workerResponse], {type: 'application/javascript'});\n\t\t\t\t\t\t\t} catch (e) { // Backwards-compatibility\n\t\t\t\t\t\t\t\twindow.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n\t\t\t\t\t\t\t\tblob = new BlobBuilder();\n\t\t\t\t\t\t\t\tblob.append(codecResponse + \" \" + workerResponse);\n\t\t\t\t\t\t\t\tblob = blob.getBlob();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Create the web worker\n\t\t\t\t\t\t\tworker = new Worker(URL.createObjectURL(blob));\n\t\t\t\t\t\t\tcallback(construct);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Load the codec\n\t\t\t\t\tgetCodec = new XMLHttpRequest();\n\t\t\t\t\tgetCodec.open(\"GET\", codecUrl, true);\n\t\t\t\t\tgetCodec.onreadystatechange = function() {\n\t\t\t\t\t\tif(getCodec.readyState == 4 && getCodec.status == 200) {\n\t\t\t\t\t\t\tcodecResponse = getCodec.responseText;\n\t\t\t\t\t\t\t// Update the codec response loaded flag\n\t\t\t\t\t\t\tcodecLoaded = true;\n\t\t\t\t\t\t\tcompletionCheck();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tgetCodec.send();\n\n\t\t\t\t\t// Load the worker\n\t\t\t\t\tgetWorker = new XMLHttpRequest();\n\t\t\t\t\tgetWorker.open(\"GET\", workerUrl, true);\n\t\t\t\t\tgetWorker.onreadystatechange = function() {\n\t\t\t\t\t\tif(getWorker.readyState == 4 && getWorker.status == 200) {\n\t\t\t\t\t\t\tworkerResponse = getWorker.responseText;\n\t\t\t\t\t\t\t// Update the worker response loaded flag\n\t\t\t\t\t\t\tworkerLoaded = true;\n\t\t\t\t\t\t\tcompletionCheck();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tgetWorker.send();\n\t\t\t\t} else {\n\t\t\t\t\t// Local URL; load it directly for simplicity.\n\t\t\t\t\tworker = new Worker(workerUrl);\n\t\t\t\t\tcallback(construct);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tmodule.exports = OGVLoader;\n\n\t})();\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVProxyClass = __webpack_require__(5);\n\n\tvar OGVDecoderAudioProxy = OGVProxyClass({\n\t\tloadedMetadata: false,\n\t\taudioFormat: null,\n\t\taudioBuffer: null,\n\t\tcpuTime: 0\n\t}, {\n\t\tinit: function(callback) {\n\t\t\tthis.proxy('init', [], callback);\n\t\t},\n\n\t\tprocessHeader: function(data, callback) {\n\t\t\tthis.proxy('processHeader', [data], callback, [data]);\n\t\t},\n\n\t\tprocessAudio: function(data, callback) {\n\t\t\tthis.proxy('processAudio', [data], callback, [data]);\n\t\t},\n\n\t\tclose: function() {\n\t\t\tthis.terminate();\n\t\t}\n\t});\n\n\tmodule.exports = OGVDecoderAudioProxy;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * Proxy object for web worker interface for codec classes.\n\t *\n\t * Used by the high-level player interface.\n\t *\n\t * @author Brion Vibber <brion@pobox.com>\n\t * @copyright 2015\n\t * @license MIT-style\n\t */\n\tfunction OGVProxyClass(initialProps, methods) {\n\t\treturn function(worker, className, options) {\n\t\t\toptions = options || {};\n\t\t\tvar self = this;\n\n\t\t\tvar transferables = (function() {\n\t\t\t\tvar buffer = new ArrayBuffer(1024),\n\t\t\t\t\tbytes = new Uint8Array(buffer);\n\t\t\t\ttry {\n\t\t\t\t\tworker.postMessage({\n\t\t\t\t\t\taction: 'transferTest',\n\t\t\t\t\t\tbytes: bytes\n\t\t\t\t\t}, [buffer]);\n\t\t\t\t\tif (buffer.byteLength) {\n\t\t\t\t\t\t// No transferable support\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\t// Set up proxied property getters\n\t\t\tvar props = {};\n\t\t\tfor (var iPropName in initialProps) {\n\t\t\t\tif (initialProps.hasOwnProperty(iPropName)) {\n\t\t\t\t\t(function(propName) {\n\t\t\t\t\t\tprops[propName] = initialProps[propName];\n\t\t\t\t\t\tObject.defineProperty(self, propName, {\n\t\t\t\t\t\t\tget: function getProperty() {\n\t\t\t\t\t\t\t\treturn props[propName];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})(iPropName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Current player wants to avoid async confusion.\n\t\t\tvar processingQueue = 0;\n\t\t\tObject.defineProperty(self, 'processing', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn (processingQueue > 0);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Set up proxied methods\n\t\t\tfor (var method in methods) {\n\t\t\t\tif (methods.hasOwnProperty(method)) {\n\t\t\t\t\tself[method] = methods[method];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// And some infrastructure!\n\t\t\tvar messageCount = 0,\n\t\t\t\tpendingCallbacks = {};\n\t\t\tthis.proxy = function(action, args, callback, transfers) {\n\t\t\t\tif (!worker) {\n\t\t\t\t\tthrow 'Tried to call \"' + action + '\" method on closed proxy object';\n\t\t\t\t}\n\t\t\t\tvar callbackId = 'callback-' + (++messageCount) + '-' + action;\n\t\t\t\tif (callback) {\n\t\t\t\t\tpendingCallbacks[callbackId] = callback;\n\t\t\t\t}\n\t\t\t\tvar out = {\n\t\t\t\t\t'action': action,\n\t\t\t\t\t'callbackId': callbackId,\n\t\t\t\t\t'args': args || []\n\t\t\t\t};\n\t\t\t\tprocessingQueue++;\n\t\t\t\tif (transferables) {\n\t\t\t\t\tworker.postMessage(out, transfers || []);\n\t\t\t\t} else {\n\t\t\t\t\tworker.postMessage(out);\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.terminate = function() {\n\t\t\t\tif (worker) {\n\t\t\t\t\tworker.terminate();\n\t\t\t\t\tworker = null;\n\t\t\t\t\tprocessingQueue = 0;\n\t\t\t\t\tpendingCallbacks = {};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tworker.addEventListener('message', function proxyOnMessage(event) {\n\t\t\t\tprocessingQueue--;\n\t\t\t\tif (event.data.action !== 'callback') {\n\t\t\t\t\t// ignore\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar data = event.data,\n\t\t\t\t\tcallbackId = data.callbackId,\n\t\t\t\t\targs = data.args,\n\t\t\t\t\tcallback = pendingCallbacks[callbackId];\n\n\t\t\t\t// Save any updated properties returned to us...\n\t\t\t\tif (data.props) {\n\t\t\t\t\tfor (var propName in data.props) {\n\t\t\t\t\t\tif (data.props.hasOwnProperty(propName)) {\n\t\t\t\t\t\t\tprops[propName] = data.props[propName];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tdelete pendingCallbacks[callbackId];\n\t\t\t\t\tcallback.apply(this, args);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Tell the proxy to load and initialize the appropriate class\n\t\t\tself.proxy('construct', [className, options], function() {});\n\n\t\t\treturn self;\n\t\t};\n\t}\n\n\tmodule.exports = OGVProxyClass;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVProxyClass = __webpack_require__(5);\n\n\tvar OGVDecoderVideoProxy = OGVProxyClass({\n\t\tloadedMetadata: false,\n\t\tvideoFormat: null,\n\t\tframeBuffer: null,\n\t\tcpuTime: 0\n\t}, {\n\t\tinit: function(callback) {\n\t\t\tthis.proxy('init', [], callback);\n\t\t},\n\n\t\tprocessHeader: function(data, callback) {\n\t\t\tthis.proxy('processHeader', [data], callback, [data]);\n\t\t},\n\n\t\tprocessFrame: function(data, callback) {\n\t\t\tthis.proxy('processFrame', [data], callback, [data]);\n\t\t},\n\n\t\tclose: function() {\n\t\t\tthis.terminate();\n\t\t}\n\t});\n\n\tmodule.exports = OGVDecoderVideoProxy;\n\n/***/ })\n/******/ ]);"
  },
  {
    "path": "app/vendor/ogv.js/ogv-worker-video.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\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1);\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVWorkerSupport = __webpack_require__(2);\n\n\tvar proxy = new OGVWorkerSupport([\n\t\t'loadedMetadata',\n\t\t'videoFormat',\n\t\t'frameBuffer',\n\t\t'cpuTime'\n\t], {\n\t\tinit: function(args, callback) {\n\t\t\tthis.target.init(callback);\n\t\t},\n\n\t\tprocessHeader: function(args, callback) {\n\t\t\tthis.target.processHeader(args[0], function(ok) {\n\t\t\t\tcallback([ok]);\n\t\t\t});\n\t\t},\n\n\t\tprocessFrame: function(args, callback) {\n\t\t\tthis.target.processFrame(args[0], function(ok) {\n\t\t\t\tcallback([ok]);\n\t\t\t});\n\t\t}\n\t});\n\n\tmodule.exports = proxy;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVLoader = __webpack_require__(3);\n\n\t/**\n\t * Web Worker wrapper for codec fun\n\t */\n\tfunction OGVWorkerSupport(propList, handlers) {\n\n\t\tvar transferables = (function() {\n\t\t\tvar buffer = new ArrayBuffer(1024),\n\t\t\t\tbytes = new Uint8Array(buffer);\n\t\t\ttry {\n\t\t\t\tpostMessage({\n\t\t\t\t\taction: 'transferTest',\n\t\t\t\t\tbytes: bytes\n\t\t\t\t}, [buffer]);\n\t\t\t\tif (buffer.byteLength) {\n\t\t\t\t\t// No transferable support\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t})();\n\n\t\tvar self = this;\n\t\tself.target = null;\n\n\t\tvar sentProps = {},\n\t\t\tpendingEvents = [];\n\n\t\tfunction copyObject(obj) {\n\t\t\tvar copy = {};\n\t\t\tfor (var prop in obj) {\n\t\t\t\tif (obj.hasOwnProperty(prop)) {\n\t\t\t\t\tcopy[prop] = obj[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn copy;\n\t\t}\n\n\t\tfunction copyAudioBuffer(data) {\n\t\t\tif (data == null) {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\t// Array of Float32Arrays\n\t\t\t\tvar copy = [];\n\t\t\t\tfor (var i = 0; i < data.length; i++) {\n\t\t\t\t\tcopy[i] = new Float32Array(data[i]);\n\t\t\t\t}\n\t\t\t\treturn copy;\n\t\t\t}\n\t\t}\n\n\t\tfunction handleEvent(data) {\n\t\t\thandlers[data.action].call(self, data.args, function(args) {\n\t\t\t\targs = args || [];\n\n\t\t\t\t// Collect and send any changed properties...\n\t\t\t\tvar props = {},\n\t\t\t\t\ttransfers = [];\n\t\t\t\tpropList.forEach(function(propName) {\n\t\t\t\t\tvar propVal = self.target[propName];\n\n\t\t\t\t\tif (sentProps[propName] !== propVal) {\n\t\t\t\t\t\t// Save this value for later reference...\n\t\t\t\t\t\tsentProps[propName] = propVal;\n\n\t\t\t\t\t\tif (propName == 'duration' && isNaN(propVal) && isNaN(sentProps[propName])) {\n\t\t\t\t\t\t\t// NaN is not === itself. Nice!\n\t\t\t\t\t\t\t// no need to update it here.\n\t\t\t\t\t\t} else if (propName == 'audioBuffer') {\n\t\t\t\t\t\t\t// Don't send the entire emscripten heap!\n\t\t\t\t\t\t\tpropVal = copyAudioBuffer(propVal);\n\t\t\t\t\t\t\tprops[propName] = propVal;\n\t\t\t\t\t\t\tif (propVal) {\n\t\t\t\t\t\t\t\tfor (var i = 0; i < propVal.length; i++) {\n\t\t\t\t\t\t\t\t\ttransfers.push(propVal[i].buffer);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (propName == 'frameBuffer') {\n\t\t\t\t\t\t\t// We already extract ahead of time now,\n\t\t\t\t\t\t\t// so transfer the small buffers.\n\t\t\t\t\t\t\tprops[propName] = propVal;\n\t\t\t\t\t\t\tif (propVal) {\n\t\t\t\t\t\t\t\ttransfers.push(propVal.y.bytes.buffer);\n\t\t\t\t\t\t\t\ttransfers.push(propVal.u.bytes.buffer);\n\t\t\t\t\t\t\t\ttransfers.push(propVal.v.bytes.buffer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprops[propName] = propVal;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tvar out = {\n\t\t\t\t\taction: 'callback',\n\t\t\t\t\tcallbackId: data.callbackId,\n\t\t\t\t\targs: args,\n\t\t\t\t\tprops: props\n\t\t\t\t};\n\t\t\t\tif (transferables) {\n\t\t\t\t\tpostMessage(out, transfers);\n\t\t\t\t} else {\n\t\t\t\t\tpostMessage(out);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\thandlers.construct = function(args, callback) {\n\t\t\tvar className = args[0],\n\t\t\t\toptions = args[1];\n\n\t\t\tOGVLoader.loadClass(className, function(classObj) {\n\t\t\t\tself.target = new classObj(options);\n\t\t\t\tcallback();\n\t\t\t\twhile (pendingEvents.length) {\n\t\t\t\t\thandleEvent(pendingEvents.shift());\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\taddEventListener('message', function workerOnMessage(event) {\n\t\t\tvar data = event.data;\n\t\t\tif (!data || typeof data !== 'object') {\n\t\t\t\t// invalid\n\t\t\t\treturn;\n\t\t\t} else if (data.action == 'transferTest') {\n\t\t\t\t// ignore\n\t\t\t} else if (typeof data.action !== 'string' || typeof data.callbackId !== 'string' || typeof data.args !== 'object') {\n\t\t\t\tconsole.log('invalid message data', data);\n\t\t\t} else if (!(data.action in handlers)) {\n\t\t\t\tconsole.log('invalid message action', data.action);\n\t\t\t} else if (data.action == 'construct') {\n\t\t\t\t// always handle constructor\n\t\t\t\thandleEvent(data);\n\t\t\t} else if (!self.target) {\n\t\t\t\t// queue until constructed\n\t\t\t\tpendingEvents.push(data);\n\t\t\t} else {\n\t\t\t\thandleEvent(data);\n\t\t\t}\n\t\t});\n\n\t}\n\n\tmodule.exports = OGVWorkerSupport;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVVersion = (\"1.4.2-20170425024925-504d7197\");\n\n\t(function() {\n\t\tvar global = this;\n\n\t\tvar scriptMap = {\n\t\t\tOGVDemuxerOgg: 'ogv-demuxer-ogg.js',\n\t\t\tOGVDemuxerOggW: 'ogv-demuxer-ogg-wasm.js',\n\t\t\tOGVDemuxerWebM: 'ogv-demuxer-webm.js',\n\t\t\tOGVDemuxerWebMW: 'ogv-demuxer-webm-wasm.js',\n\t\t\tOGVDecoderAudioOpus: 'ogv-decoder-audio-opus.js',\n\t\t\tOGVDecoderAudioOpusW: 'ogv-decoder-audio-opus-wasm.js',\n\t\t\tOGVDecoderAudioVorbis: 'ogv-decoder-audio-vorbis.js',\n\t\t\tOGVDecoderAudioVorbisW: 'ogv-decoder-audio-vorbis-wasm.js',\n\t\t\tOGVDecoderVideoTheora: 'ogv-decoder-video-theora.js',\n\t\t\tOGVDecoderVideoTheoraW: 'ogv-decoder-video-theora-wasm.js',\n\t\t\tOGVDecoderVideoVP8: 'ogv-decoder-video-vp8.js',\n\t\t\tOGVDecoderVideoVP8W: 'ogv-decoder-video-vp8-wasm.js',\n\t\t\tOGVDecoderVideoVP8MT: 'ogv-decoder-video-vp8-mt.js',\n\t\t\tOGVDecoderVideoVP9: 'ogv-decoder-video-vp9.js',\n\t\t\tOGVDecoderVideoVP9W: 'ogv-decoder-video-vp9-wasm.js',\n\t\t\tOGVDecoderVideoVP9MT: 'ogv-decoder-video-vp9-mt.js'\n\t\t};\n\n\t  // @fixme make this less awful\n\t\tvar proxyTypes = {\n\t\t\tOGVDecoderAudioOpus: 'audio',\n\t\t\tOGVDecoderAudioOpusW: 'audio',\n\t\t\tOGVDecoderAudioVorbis: 'audio',\n\t\t\tOGVDecoderAudioVorbisW: 'audio',\n\t\t\tOGVDecoderVideoTheora: 'video',\n\t\t\tOGVDecoderVideoTheoraW: 'video',\n\t\t\tOGVDecoderVideoVP8: 'video',\n\t\t\tOGVDecoderVideoVP8W: 'video',\n\t\t\tOGVDecoderVideoVP9: 'video',\n\t\t\tOGVDecoderVideoVP9W: 'video'\n\t\t};\n\t\tvar proxyInfo = {\n\t\t\taudio: {\n\t\t\t\tproxy: __webpack_require__(4),\n\t\t\t\tworker: 'ogv-worker-audio.js',\n\t\t\t},\n\t\t\tvideo: {\n\t\t\t\tproxy: __webpack_require__(6),\n\t\t\t\tworker: 'ogv-worker-video.js'\n\t\t\t}\n\t\t}\n\n\t\tfunction urlForClass(className) {\n\t\t\tvar scriptName = scriptMap[className];\n\t\t\tif (scriptName) {\n\t\t\t\treturn urlForScript(scriptName);\n\t\t\t} else {\n\t\t\t\tthrow new Error('asked for URL for unknown class ' + className);\n\t\t\t}\n\t\t};\n\n\t\tfunction urlForScript(scriptName) {\n\t\t\tif (scriptName) {\n\t\t\t\tvar base = OGVLoader.base;\n\t\t\t\tif (base === undefined) {\n\t\t\t\t\tbase = '';\n\t\t\t\t} else {\n\t\t\t\t\tbase += '/';\n\t\t\t\t}\n\t\t\t\treturn base + scriptName + '?version=' + encodeURIComponent(OGVVersion);\n\t\t\t} else {\n\t\t\t\tthrow new Error('asked for URL for unknown script ' + scriptName);\n\t\t\t}\n\t\t};\n\n\t\tvar scriptStatus = {},\n\t\t\tscriptCallbacks = {};\n\t\tfunction loadWebScript(src, callback) {\n\t\t\tif (scriptStatus[src] == 'done') {\n\t\t\t\tcallback();\n\t\t\t} else if (scriptStatus[src] == 'loading') {\n\t\t\t\tscriptCallbacks[src].push(callback);\n\t\t\t} else {\n\t\t\t\tscriptStatus[src] = 'loading';\n\t\t\t\tscriptCallbacks[src] = [callback];\n\n\t\t\t\tvar scriptNode = document.createElement('script');\n\t\t\t\tfunction done(event) {\n\t\t\t\t\tvar callbacks = scriptCallbacks[src];\n\t\t\t\t\tdelete scriptCallbacks[src];\n\t\t\t\t\tscriptStatus[src] = 'done';\n\n\t\t\t\t\tcallbacks.forEach(function(cb) {\n\t\t\t\t\t\tcb();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tscriptNode.addEventListener('load', done);\n\t\t\t\tscriptNode.addEventListener('error', done);\n\t\t\t\tscriptNode.src = src;\n\t\t\t\tdocument.querySelector('head').appendChild(scriptNode);\n\t\t\t}\n\t\t}\n\n\t\tfunction loadWebAssembly(src, callback) {\n\t\t\tif (!src.match(/-wasm\\.js/)) {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tvar wasmSrc = src.replace(/-wasm\\.js/, '-wasm.wasm');\n\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\txhr.responseType = 'arraybuffer';\n\t\t\t\txhr.onload = function() {\n\t\t\t\t\tcallback(xhr.response);\n\t\t\t\t};\n\t\t\t\txhr.onerror = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\txhr.open('GET', wasmSrc);\n\t\t\t\txhr.send();\n\t\t\t}\n\t\t}\n\n\t\tfunction defaultBase() {\n\t\t\tif (typeof global.window === 'object') {\n\n\t\t\t\t// for browser, try to autodetect\n\t\t\t\tvar scriptNodes = document.querySelectorAll('script'),\n\t\t\t\t\tregex = /^(?:|(.*)\\/)ogv(?:-support)?\\.js(?:\\?|#|$)/,\n\t\t\t\t\tpath,\n\t\t\t\t\tmatches;\n\t\t\t\tfor (var i = 0; i < scriptNodes.length; i++) {\n\t\t\t\t\tpath = scriptNodes[i].getAttribute('src');\n\t\t\t\t\tif (path) {\n\t\t\t\t\t\tmatches = path.match(regex);\n\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\treturn matches[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn undefined; // current dir\n\n\t\t\t} else {\n\n\t\t\t\t// for workers, assume current directory\n\t\t\t\t// if not a worker, too bad.\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\t\t}\n\n\t\tvar OGVLoader = {\n\t\t\tbase: defaultBase(),\n\n\t\t\tloadClass: function(className, callback, options) {\n\t\t\t\toptions = options || {};\n\t\t\t\tif (options.worker) {\n\t\t\t\t\tthis.workerProxy(className, callback);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar url = urlForClass(className);\n\t\t\t\tloadWebAssembly(url, function(wasmBinary) {\n\t\t\t\t\tfunction wasmClassWrapper(options) {\n\t\t\t\t\t\toptions = options || {};\n\t\t\t\t\t\tif (wasmBinary !== null) {\n\t\t\t\t\t\t\toptions.wasmBinary = wasmBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new global[className](options);\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof global[className] === 'function') {\n\t\t\t\t\t\t// already loaded!\n\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t} else if (typeof global.window === 'object') {\n\t\t\t\t\t\tloadWebScript(url, function() {\n\t\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (typeof global.importScripts === 'function') {\n\t\t\t\t\t\t// worker has convenient sync importScripts\n\t\t\t\t\t\tglobal.importScripts(url);\n\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tworkerProxy: function(className, callback) {\n\t\t\t\tvar proxyType = proxyTypes[className],\n\t\t\t\t\tinfo = proxyInfo[proxyType];\n\n\t\t\t\tif (!info) {\n\t\t\t\t\tthrow new Error('Requested worker for class with no proxy: ' + className);\n\t\t\t\t}\n\n\t\t\t\tvar proxyClass = info.proxy,\n\t\t\t\t\tworkerScript = info.worker,\n\t\t\t\t\tcodecUrl = urlForScript(scriptMap[className]),\n\t\t\t\t\tworkerUrl = urlForScript(workerScript),\n\t\t\t\t\tworker;\n\n\t\t\t\tvar construct = function(options) {\n\t\t\t\t\treturn new proxyClass(worker, className, options);\n\t\t\t\t};\n\n\t\t\t\tif (workerUrl.match(/^https?:|\\/\\//i)) {\n\t\t\t\t\t// Can't load workers natively cross-domain, but if CORS\n\t\t\t\t\t// is set up we can fetch the worker stub and the desired\n\t\t\t\t\t// class and load them from a blob.\n\t\t\t\t\tvar getCodec,\n\t\t\t\t\t\tgetWorker,\n\t\t\t\t\t\tcodecResponse,\n\t\t\t\t\t\tworkerResponse,\n\t\t\t\t\t\tcodecLoaded = false,\n\t\t\t\t\t\tworkerLoaded = false,\n\t\t\t\t\t\tblob;\n\n\t\t\t\t\tfunction completionCheck() {\n\t\t\t\t\t\tif ((codecLoaded == true) && (workerLoaded == true)) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tblob = new Blob([codecResponse + \" \" + workerResponse], {type: 'application/javascript'});\n\t\t\t\t\t\t\t} catch (e) { // Backwards-compatibility\n\t\t\t\t\t\t\t\twindow.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n\t\t\t\t\t\t\t\tblob = new BlobBuilder();\n\t\t\t\t\t\t\t\tblob.append(codecResponse + \" \" + workerResponse);\n\t\t\t\t\t\t\t\tblob = blob.getBlob();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Create the web worker\n\t\t\t\t\t\t\tworker = new Worker(URL.createObjectURL(blob));\n\t\t\t\t\t\t\tcallback(construct);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Load the codec\n\t\t\t\t\tgetCodec = new XMLHttpRequest();\n\t\t\t\t\tgetCodec.open(\"GET\", codecUrl, true);\n\t\t\t\t\tgetCodec.onreadystatechange = function() {\n\t\t\t\t\t\tif(getCodec.readyState == 4 && getCodec.status == 200) {\n\t\t\t\t\t\t\tcodecResponse = getCodec.responseText;\n\t\t\t\t\t\t\t// Update the codec response loaded flag\n\t\t\t\t\t\t\tcodecLoaded = true;\n\t\t\t\t\t\t\tcompletionCheck();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tgetCodec.send();\n\n\t\t\t\t\t// Load the worker\n\t\t\t\t\tgetWorker = new XMLHttpRequest();\n\t\t\t\t\tgetWorker.open(\"GET\", workerUrl, true);\n\t\t\t\t\tgetWorker.onreadystatechange = function() {\n\t\t\t\t\t\tif(getWorker.readyState == 4 && getWorker.status == 200) {\n\t\t\t\t\t\t\tworkerResponse = getWorker.responseText;\n\t\t\t\t\t\t\t// Update the worker response loaded flag\n\t\t\t\t\t\t\tworkerLoaded = true;\n\t\t\t\t\t\t\tcompletionCheck();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tgetWorker.send();\n\t\t\t\t} else {\n\t\t\t\t\t// Local URL; load it directly for simplicity.\n\t\t\t\t\tworker = new Worker(workerUrl);\n\t\t\t\t\tcallback(construct);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tmodule.exports = OGVLoader;\n\n\t})();\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVProxyClass = __webpack_require__(5);\n\n\tvar OGVDecoderAudioProxy = OGVProxyClass({\n\t\tloadedMetadata: false,\n\t\taudioFormat: null,\n\t\taudioBuffer: null,\n\t\tcpuTime: 0\n\t}, {\n\t\tinit: function(callback) {\n\t\t\tthis.proxy('init', [], callback);\n\t\t},\n\n\t\tprocessHeader: function(data, callback) {\n\t\t\tthis.proxy('processHeader', [data], callback, [data]);\n\t\t},\n\n\t\tprocessAudio: function(data, callback) {\n\t\t\tthis.proxy('processAudio', [data], callback, [data]);\n\t\t},\n\n\t\tclose: function() {\n\t\t\tthis.terminate();\n\t\t}\n\t});\n\n\tmodule.exports = OGVDecoderAudioProxy;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * Proxy object for web worker interface for codec classes.\n\t *\n\t * Used by the high-level player interface.\n\t *\n\t * @author Brion Vibber <brion@pobox.com>\n\t * @copyright 2015\n\t * @license MIT-style\n\t */\n\tfunction OGVProxyClass(initialProps, methods) {\n\t\treturn function(worker, className, options) {\n\t\t\toptions = options || {};\n\t\t\tvar self = this;\n\n\t\t\tvar transferables = (function() {\n\t\t\t\tvar buffer = new ArrayBuffer(1024),\n\t\t\t\t\tbytes = new Uint8Array(buffer);\n\t\t\t\ttry {\n\t\t\t\t\tworker.postMessage({\n\t\t\t\t\t\taction: 'transferTest',\n\t\t\t\t\t\tbytes: bytes\n\t\t\t\t\t}, [buffer]);\n\t\t\t\t\tif (buffer.byteLength) {\n\t\t\t\t\t\t// No transferable support\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\t// Set up proxied property getters\n\t\t\tvar props = {};\n\t\t\tfor (var iPropName in initialProps) {\n\t\t\t\tif (initialProps.hasOwnProperty(iPropName)) {\n\t\t\t\t\t(function(propName) {\n\t\t\t\t\t\tprops[propName] = initialProps[propName];\n\t\t\t\t\t\tObject.defineProperty(self, propName, {\n\t\t\t\t\t\t\tget: function getProperty() {\n\t\t\t\t\t\t\t\treturn props[propName];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})(iPropName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Current player wants to avoid async confusion.\n\t\t\tvar processingQueue = 0;\n\t\t\tObject.defineProperty(self, 'processing', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn (processingQueue > 0);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Set up proxied methods\n\t\t\tfor (var method in methods) {\n\t\t\t\tif (methods.hasOwnProperty(method)) {\n\t\t\t\t\tself[method] = methods[method];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// And some infrastructure!\n\t\t\tvar messageCount = 0,\n\t\t\t\tpendingCallbacks = {};\n\t\t\tthis.proxy = function(action, args, callback, transfers) {\n\t\t\t\tif (!worker) {\n\t\t\t\t\tthrow 'Tried to call \"' + action + '\" method on closed proxy object';\n\t\t\t\t}\n\t\t\t\tvar callbackId = 'callback-' + (++messageCount) + '-' + action;\n\t\t\t\tif (callback) {\n\t\t\t\t\tpendingCallbacks[callbackId] = callback;\n\t\t\t\t}\n\t\t\t\tvar out = {\n\t\t\t\t\t'action': action,\n\t\t\t\t\t'callbackId': callbackId,\n\t\t\t\t\t'args': args || []\n\t\t\t\t};\n\t\t\t\tprocessingQueue++;\n\t\t\t\tif (transferables) {\n\t\t\t\t\tworker.postMessage(out, transfers || []);\n\t\t\t\t} else {\n\t\t\t\t\tworker.postMessage(out);\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.terminate = function() {\n\t\t\t\tif (worker) {\n\t\t\t\t\tworker.terminate();\n\t\t\t\t\tworker = null;\n\t\t\t\t\tprocessingQueue = 0;\n\t\t\t\t\tpendingCallbacks = {};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tworker.addEventListener('message', function proxyOnMessage(event) {\n\t\t\t\tprocessingQueue--;\n\t\t\t\tif (event.data.action !== 'callback') {\n\t\t\t\t\t// ignore\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar data = event.data,\n\t\t\t\t\tcallbackId = data.callbackId,\n\t\t\t\t\targs = data.args,\n\t\t\t\t\tcallback = pendingCallbacks[callbackId];\n\n\t\t\t\t// Save any updated properties returned to us...\n\t\t\t\tif (data.props) {\n\t\t\t\t\tfor (var propName in data.props) {\n\t\t\t\t\t\tif (data.props.hasOwnProperty(propName)) {\n\t\t\t\t\t\t\tprops[propName] = data.props[propName];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tdelete pendingCallbacks[callbackId];\n\t\t\t\t\tcallback.apply(this, args);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Tell the proxy to load and initialize the appropriate class\n\t\t\tself.proxy('construct', [className, options], function() {});\n\n\t\t\treturn self;\n\t\t};\n\t}\n\n\tmodule.exports = OGVProxyClass;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVProxyClass = __webpack_require__(5);\n\n\tvar OGVDecoderVideoProxy = OGVProxyClass({\n\t\tloadedMetadata: false,\n\t\tvideoFormat: null,\n\t\tframeBuffer: null,\n\t\tcpuTime: 0\n\t}, {\n\t\tinit: function(callback) {\n\t\t\tthis.proxy('init', [], callback);\n\t\t},\n\n\t\tprocessHeader: function(data, callback) {\n\t\t\tthis.proxy('processHeader', [data], callback, [data]);\n\t\t},\n\n\t\tprocessFrame: function(data, callback) {\n\t\t\tthis.proxy('processFrame', [data], callback, [data]);\n\t\t},\n\n\t\tclose: function() {\n\t\t\tthis.terminate();\n\t\t}\n\t});\n\n\tmodule.exports = OGVDecoderVideoProxy;\n\n/***/ })\n/******/ ]);"
  },
  {
    "path": "app/vendor/ogv.js/ogv.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ogvjs\"] = factory();\n\telse\n\t\troot[\"ogvjs\"] = factory();\n})(this, function() {\nreturn /******/ (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\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t//\n\t// -- ogv.js\n\t// https://github.com/brion/ogv.js\n\t// Copyright (c) 2013-2016 Brion Vibber\n\t//\n\n\tvar OGVCompat = __webpack_require__(1),\n\t\tOGVLoader = __webpack_require__(3),\n\t\tOGVMediaType = __webpack_require__(7),\n\t\tOGVPlayer = __webpack_require__(8),\n\t\tOGVVersion = (\"1.4.2-20170425024925-504d7197\");\n\n\t// Version 1.0's web-facing and test-facing interfaces\n\tif (window) {\n\t\twindow.OGVCompat = OGVCompat;\n\t\twindow.OGVLoader = OGVLoader;\n\t\twindow.OGVMediaType = OGVMediaType;\n\t\twindow.OGVPlayer = OGVPlayer;\n\t\twindow.OGVVersion = OGVVersion;\n\t}\n\n\tmodule.exports = {\n\t\tOGVCompat: OGVCompat,\n\t\tOGVLoader: OGVLoader,\n\t\tOGVMediaType: OGVMediaType,\n\t\tOGVPlayer: OGVPlayer,\n\t\tOGVVersion: OGVVersion\n\t};\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar BogoSlow = __webpack_require__(2);\n\n\tvar OGVCompat = {\n\t\tbenchmark: new BogoSlow(),\n\n\t\thasTypedArrays: function() {\n\t\t\t// emscripten-compiled code requires typed arrays\n\t\t\treturn !!window.Uint32Array;\n\t\t},\n\n\t\thasWebAudio: function() {\n\t\t\treturn !!(window.AudioContext || window.webkitAudioContext);\n\t\t},\n\n\t\thasFlash: function() {\n\t\t\tif (navigator.userAgent.indexOf('Trident') !== -1) {\n\t\t\t\t// We only do the ActiveX test because we only need Flash in\n\t\t\t\t// Internet Explorer 10/11. Other browsers use Web Audio directly\n\t\t\t\t// (Edge, Safari) or native playback, so there's no need to test\n\t\t\t\t// other ways of loading Flash.\n\t\t\t\ttry {\n\t\t\t\t\tvar obj = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n\t\t\t\t\treturn true;\n\t\t\t\t} catch(e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\thasAudio: function() {\n\t\t\treturn this.hasWebAudio() || this.hasFlash();\n\t\t},\n\n\t\tisBlacklisted: function(userAgent) {\n\t\t\t// JIT bugs in old Safari versions\n\t\t\tvar blacklist = [\n\t\t\t\t/\\(i.* OS [67]_.* like Mac OS X\\).* Mobile\\/.* Safari\\//,\n\t\t\t\t/\\(Macintosh.* Version\\/6\\..* Safari\\/\\d/\n\t\t\t];\n\t\t\tvar blacklisted = false;\n\t\t\tblacklist.forEach(function(regex) {\n\t\t\t\tif (userAgent.match(regex)) {\n\t\t\t\t\tblacklisted = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn blacklisted;\n\t\t},\n\n\t\tisSlow: function() {\n\t\t\treturn this.benchmark.slow;\n\t\t},\n\n\t\tisTooSlow: function() {\n\t\t\treturn this.benchmark.tooSlow;\n\t\t},\n\n\t\tsupported: function(component) {\n\t\t\tif (component === 'OGVDecoder') {\n\t\t\t\treturn (this.hasTypedArrays() && !this.isBlacklisted(navigator.userAgent));\n\t\t\t}\n\t\t\tif (component === 'OGVPlayer') {\n\t\t\t\treturn (this.supported('OGVDecoder') && this.hasAudio() && !this.isTooSlow());\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tmodule.exports = OGVCompat;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * A quick CPU/JS engine benchmark to guesstimate whether we're\n\t * fast enough to handle 360p video in JavaScript.\n\t */\n\tfunction BogoSlow() {\n\t\tvar self = this;\n\n\t\tvar timer;\n\t\t// FIXME: avoid to use window scope here\n\t\tif (window.performance && window.performance.now) {\n\t\t\ttimer = function() {\n\t\t\t\treturn window.performance.now();\n\t\t\t};\n\t\t} else {\n\t\t\ttimer = function() {\n\t\t\t\treturn Date.now();\n\t\t\t};\n\t\t}\n\n\t\tvar savedSpeed = null;\n\t\tfunction run() {\n\t\t\tvar ops = 0;\n\t\t\tvar fibonacci = function(n) {\n\t\t\t\tops++;\n\t\t\t\tif (n < 2) {\n\t\t\t\t\treturn n;\n\t\t\t\t} else {\n\t\t\t\t\treturn fibonacci(n - 2) + fibonacci(n - 1);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar start = timer();\n\n\t\t\tfibonacci(30);\n\n\t\t\tvar delta = timer() - start;\n\t\t\tsavedSpeed = (ops / delta);\n\t\t}\n\n\t\t/**\n\t\t * Return a scale value of operations/sec from the benchmark.\n\t\t * If the benchmark has already been run, uses a memoized result.\n\t\t *\n\t\t * @property {number}\n\t\t */\n\t\tObject.defineProperty(self, 'speed', {\n\t\t\tget: function() {\n\t\t\t\tif (savedSpeed === null) {\n\t\t\t\t\trun();\n\t\t\t\t}\n\t\t\t\treturn savedSpeed;\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Return the defined cutoff speed value for 'slow' devices,\n\t\t * based on results measured from some test devices.\n\t\t *\n\t\t * @property {number}\n\t\t */\n\t\tObject.defineProperty(self, 'slowCutoff', {\n\t\t\tget: function() {\n\t\t\t\t// 2012 Retina MacBook Pro (Safari 7)  ~150,000\n\t\t\t\t// 2009 Dell T5500         (IE 11)     ~100,000\n\t\t\t\t// iPad Air                (iOS 7)      ~65,000\n\t\t\t\t// 2010 MBP / OS X 10.9    (Safari 7)   ~62,500\n\t\t\t\t// 2010 MBP / Win7 VM      (IE 11)      ~50,000+-\n\t\t\t\t//   ^ these play 360p ok\n\t\t\t\t// ----------- line of moderate doom ----------\n\t\t\t\treturn 50000;\n\t\t\t\t//   v these play 160p ok\n\t\t\t\t// iPad Mini non-Retina    (iOS 8 beta) ~25,000\n\t\t\t\t// Dell Inspiron Duo       (IE 11)      ~25,000\n\t\t\t\t// Surface RT              (IE 11)      ~18,000\n\t\t\t\t// iPod Touch 5th-gen      (iOS 8 beta) ~16,000\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Return the defined cutoff speed value for 'too slow' devices,\n\t\t * based on results measured from some test devices.\n\t\t *\n\t\t * No longer used.\n\t\t *\n\t\t * @property {number}\n\t\t * @deprecated\n\t\t */\n\t\tObject.defineProperty(self, 'tooSlowCutoff', {\n\t\t\tget: function() {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * 'Slow' devices can play audio and should sorta play our\n\t\t * extra-tiny Wikimedia 160p15 transcodes\n\t\t *\n\t\t * @property {boolean}\n\t\t */\n\t\tObject.defineProperty(self, 'slow', {\n\t\t\tget: function() {\n\t\t\t\treturn (self.speed < self.slowCutoff);\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * 'Too slow' devices aren't reliable at all\n\t\t *\n\t\t * @property {boolean}\n\t\t */\n\t\tObject.defineProperty(self, 'tooSlow', {\n\t\t\tget: function() {\n\t\t\t\treturn (self.speed < self.tooSlowCutoff);\n\t\t\t}\n\t\t});\n\t}\n\n\tmodule.exports = BogoSlow;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVVersion = (\"1.4.2-20170425024925-504d7197\");\n\n\t(function() {\n\t\tvar global = this;\n\n\t\tvar scriptMap = {\n\t\t\tOGVDemuxerOgg: 'ogv-demuxer-ogg.js',\n\t\t\tOGVDemuxerOggW: 'ogv-demuxer-ogg-wasm.js',\n\t\t\tOGVDemuxerWebM: 'ogv-demuxer-webm.js',\n\t\t\tOGVDemuxerWebMW: 'ogv-demuxer-webm-wasm.js',\n\t\t\tOGVDecoderAudioOpus: 'ogv-decoder-audio-opus.js',\n\t\t\tOGVDecoderAudioOpusW: 'ogv-decoder-audio-opus-wasm.js',\n\t\t\tOGVDecoderAudioVorbis: 'ogv-decoder-audio-vorbis.js',\n\t\t\tOGVDecoderAudioVorbisW: 'ogv-decoder-audio-vorbis-wasm.js',\n\t\t\tOGVDecoderVideoTheora: 'ogv-decoder-video-theora.js',\n\t\t\tOGVDecoderVideoTheoraW: 'ogv-decoder-video-theora-wasm.js',\n\t\t\tOGVDecoderVideoVP8: 'ogv-decoder-video-vp8.js',\n\t\t\tOGVDecoderVideoVP8W: 'ogv-decoder-video-vp8-wasm.js',\n\t\t\tOGVDecoderVideoVP8MT: 'ogv-decoder-video-vp8-mt.js',\n\t\t\tOGVDecoderVideoVP9: 'ogv-decoder-video-vp9.js',\n\t\t\tOGVDecoderVideoVP9W: 'ogv-decoder-video-vp9-wasm.js',\n\t\t\tOGVDecoderVideoVP9MT: 'ogv-decoder-video-vp9-mt.js'\n\t\t};\n\n\t  // @fixme make this less awful\n\t\tvar proxyTypes = {\n\t\t\tOGVDecoderAudioOpus: 'audio',\n\t\t\tOGVDecoderAudioOpusW: 'audio',\n\t\t\tOGVDecoderAudioVorbis: 'audio',\n\t\t\tOGVDecoderAudioVorbisW: 'audio',\n\t\t\tOGVDecoderVideoTheora: 'video',\n\t\t\tOGVDecoderVideoTheoraW: 'video',\n\t\t\tOGVDecoderVideoVP8: 'video',\n\t\t\tOGVDecoderVideoVP8W: 'video',\n\t\t\tOGVDecoderVideoVP9: 'video',\n\t\t\tOGVDecoderVideoVP9W: 'video'\n\t\t};\n\t\tvar proxyInfo = {\n\t\t\taudio: {\n\t\t\t\tproxy: __webpack_require__(4),\n\t\t\t\tworker: 'ogv-worker-audio.js',\n\t\t\t},\n\t\t\tvideo: {\n\t\t\t\tproxy: __webpack_require__(6),\n\t\t\t\tworker: 'ogv-worker-video.js'\n\t\t\t}\n\t\t}\n\n\t\tfunction urlForClass(className) {\n\t\t\tvar scriptName = scriptMap[className];\n\t\t\tif (scriptName) {\n\t\t\t\treturn urlForScript(scriptName);\n\t\t\t} else {\n\t\t\t\tthrow new Error('asked for URL for unknown class ' + className);\n\t\t\t}\n\t\t};\n\n\t\tfunction urlForScript(scriptName) {\n\t\t\tif (scriptName) {\n\t\t\t\tvar base = OGVLoader.base;\n\t\t\t\tif (base === undefined) {\n\t\t\t\t\tbase = '';\n\t\t\t\t} else {\n\t\t\t\t\tbase += '/';\n\t\t\t\t}\n\t\t\t\treturn base + scriptName + '?version=' + encodeURIComponent(OGVVersion);\n\t\t\t} else {\n\t\t\t\tthrow new Error('asked for URL for unknown script ' + scriptName);\n\t\t\t}\n\t\t};\n\n\t\tvar scriptStatus = {},\n\t\t\tscriptCallbacks = {};\n\t\tfunction loadWebScript(src, callback) {\n\t\t\tif (scriptStatus[src] == 'done') {\n\t\t\t\tcallback();\n\t\t\t} else if (scriptStatus[src] == 'loading') {\n\t\t\t\tscriptCallbacks[src].push(callback);\n\t\t\t} else {\n\t\t\t\tscriptStatus[src] = 'loading';\n\t\t\t\tscriptCallbacks[src] = [callback];\n\n\t\t\t\tvar scriptNode = document.createElement('script');\n\t\t\t\tfunction done(event) {\n\t\t\t\t\tvar callbacks = scriptCallbacks[src];\n\t\t\t\t\tdelete scriptCallbacks[src];\n\t\t\t\t\tscriptStatus[src] = 'done';\n\n\t\t\t\t\tcallbacks.forEach(function(cb) {\n\t\t\t\t\t\tcb();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tscriptNode.addEventListener('load', done);\n\t\t\t\tscriptNode.addEventListener('error', done);\n\t\t\t\tscriptNode.src = src;\n\t\t\t\tdocument.querySelector('head').appendChild(scriptNode);\n\t\t\t}\n\t\t}\n\n\t\tfunction loadWebAssembly(src, callback) {\n\t\t\tif (!src.match(/-wasm\\.js/)) {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tvar wasmSrc = src.replace(/-wasm\\.js/, '-wasm.wasm');\n\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\txhr.responseType = 'arraybuffer';\n\t\t\t\txhr.onload = function() {\n\t\t\t\t\tcallback(xhr.response);\n\t\t\t\t};\n\t\t\t\txhr.onerror = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\txhr.open('GET', wasmSrc);\n\t\t\t\txhr.send();\n\t\t\t}\n\t\t}\n\n\t\tfunction defaultBase() {\n\t\t\tif (typeof global.window === 'object') {\n\n\t\t\t\t// for browser, try to autodetect\n\t\t\t\tvar scriptNodes = document.querySelectorAll('script'),\n\t\t\t\t\tregex = /^(?:|(.*)\\/)ogv(?:-support)?\\.js(?:\\?|#|$)/,\n\t\t\t\t\tpath,\n\t\t\t\t\tmatches;\n\t\t\t\tfor (var i = 0; i < scriptNodes.length; i++) {\n\t\t\t\t\tpath = scriptNodes[i].getAttribute('src');\n\t\t\t\t\tif (path) {\n\t\t\t\t\t\tmatches = path.match(regex);\n\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\treturn matches[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn undefined; // current dir\n\n\t\t\t} else {\n\n\t\t\t\t// for workers, assume current directory\n\t\t\t\t// if not a worker, too bad.\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\t\t}\n\n\t\tvar OGVLoader = {\n\t\t\tbase: defaultBase(),\n\n\t\t\tloadClass: function(className, callback, options) {\n\t\t\t\toptions = options || {};\n\t\t\t\tif (options.worker) {\n\t\t\t\t\tthis.workerProxy(className, callback);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar url = urlForClass(className);\n\t\t\t\tloadWebAssembly(url, function(wasmBinary) {\n\t\t\t\t\tfunction wasmClassWrapper(options) {\n\t\t\t\t\t\toptions = options || {};\n\t\t\t\t\t\tif (wasmBinary !== null) {\n\t\t\t\t\t\t\toptions.wasmBinary = wasmBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new global[className](options);\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof global[className] === 'function') {\n\t\t\t\t\t\t// already loaded!\n\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t} else if (typeof global.window === 'object') {\n\t\t\t\t\t\tloadWebScript(url, function() {\n\t\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (typeof global.importScripts === 'function') {\n\t\t\t\t\t\t// worker has convenient sync importScripts\n\t\t\t\t\t\tglobal.importScripts(url);\n\t\t\t\t\t\tcallback(wasmClassWrapper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tworkerProxy: function(className, callback) {\n\t\t\t\tvar proxyType = proxyTypes[className],\n\t\t\t\t\tinfo = proxyInfo[proxyType];\n\n\t\t\t\tif (!info) {\n\t\t\t\t\tthrow new Error('Requested worker for class with no proxy: ' + className);\n\t\t\t\t}\n\n\t\t\t\tvar proxyClass = info.proxy,\n\t\t\t\t\tworkerScript = info.worker,\n\t\t\t\t\tcodecUrl = urlForScript(scriptMap[className]),\n\t\t\t\t\tworkerUrl = urlForScript(workerScript),\n\t\t\t\t\tworker;\n\n\t\t\t\tvar construct = function(options) {\n\t\t\t\t\treturn new proxyClass(worker, className, options);\n\t\t\t\t};\n\n\t\t\t\tif (workerUrl.match(/^https?:|\\/\\//i)) {\n\t\t\t\t\t// Can't load workers natively cross-domain, but if CORS\n\t\t\t\t\t// is set up we can fetch the worker stub and the desired\n\t\t\t\t\t// class and load them from a blob.\n\t\t\t\t\tvar getCodec,\n\t\t\t\t\t\tgetWorker,\n\t\t\t\t\t\tcodecResponse,\n\t\t\t\t\t\tworkerResponse,\n\t\t\t\t\t\tcodecLoaded = false,\n\t\t\t\t\t\tworkerLoaded = false,\n\t\t\t\t\t\tblob;\n\n\t\t\t\t\tfunction completionCheck() {\n\t\t\t\t\t\tif ((codecLoaded == true) && (workerLoaded == true)) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tblob = new Blob([codecResponse + \" \" + workerResponse], {type: 'application/javascript'});\n\t\t\t\t\t\t\t} catch (e) { // Backwards-compatibility\n\t\t\t\t\t\t\t\twindow.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n\t\t\t\t\t\t\t\tblob = new BlobBuilder();\n\t\t\t\t\t\t\t\tblob.append(codecResponse + \" \" + workerResponse);\n\t\t\t\t\t\t\t\tblob = blob.getBlob();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Create the web worker\n\t\t\t\t\t\t\tworker = new Worker(URL.createObjectURL(blob));\n\t\t\t\t\t\t\tcallback(construct);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Load the codec\n\t\t\t\t\tgetCodec = new XMLHttpRequest();\n\t\t\t\t\tgetCodec.open(\"GET\", codecUrl, true);\n\t\t\t\t\tgetCodec.onreadystatechange = function() {\n\t\t\t\t\t\tif(getCodec.readyState == 4 && getCodec.status == 200) {\n\t\t\t\t\t\t\tcodecResponse = getCodec.responseText;\n\t\t\t\t\t\t\t// Update the codec response loaded flag\n\t\t\t\t\t\t\tcodecLoaded = true;\n\t\t\t\t\t\t\tcompletionCheck();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tgetCodec.send();\n\n\t\t\t\t\t// Load the worker\n\t\t\t\t\tgetWorker = new XMLHttpRequest();\n\t\t\t\t\tgetWorker.open(\"GET\", workerUrl, true);\n\t\t\t\t\tgetWorker.onreadystatechange = function() {\n\t\t\t\t\t\tif(getWorker.readyState == 4 && getWorker.status == 200) {\n\t\t\t\t\t\t\tworkerResponse = getWorker.responseText;\n\t\t\t\t\t\t\t// Update the worker response loaded flag\n\t\t\t\t\t\t\tworkerLoaded = true;\n\t\t\t\t\t\t\tcompletionCheck();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tgetWorker.send();\n\t\t\t\t} else {\n\t\t\t\t\t// Local URL; load it directly for simplicity.\n\t\t\t\t\tworker = new Worker(workerUrl);\n\t\t\t\t\tcallback(construct);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tmodule.exports = OGVLoader;\n\n\t})();\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVProxyClass = __webpack_require__(5);\n\n\tvar OGVDecoderAudioProxy = OGVProxyClass({\n\t\tloadedMetadata: false,\n\t\taudioFormat: null,\n\t\taudioBuffer: null,\n\t\tcpuTime: 0\n\t}, {\n\t\tinit: function(callback) {\n\t\t\tthis.proxy('init', [], callback);\n\t\t},\n\n\t\tprocessHeader: function(data, callback) {\n\t\t\tthis.proxy('processHeader', [data], callback, [data]);\n\t\t},\n\n\t\tprocessAudio: function(data, callback) {\n\t\t\tthis.proxy('processAudio', [data], callback, [data]);\n\t\t},\n\n\t\tclose: function() {\n\t\t\tthis.terminate();\n\t\t}\n\t});\n\n\tmodule.exports = OGVDecoderAudioProxy;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * Proxy object for web worker interface for codec classes.\n\t *\n\t * Used by the high-level player interface.\n\t *\n\t * @author Brion Vibber <brion@pobox.com>\n\t * @copyright 2015\n\t * @license MIT-style\n\t */\n\tfunction OGVProxyClass(initialProps, methods) {\n\t\treturn function(worker, className, options) {\n\t\t\toptions = options || {};\n\t\t\tvar self = this;\n\n\t\t\tvar transferables = (function() {\n\t\t\t\tvar buffer = new ArrayBuffer(1024),\n\t\t\t\t\tbytes = new Uint8Array(buffer);\n\t\t\t\ttry {\n\t\t\t\t\tworker.postMessage({\n\t\t\t\t\t\taction: 'transferTest',\n\t\t\t\t\t\tbytes: bytes\n\t\t\t\t\t}, [buffer]);\n\t\t\t\t\tif (buffer.byteLength) {\n\t\t\t\t\t\t// No transferable support\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\t// Set up proxied property getters\n\t\t\tvar props = {};\n\t\t\tfor (var iPropName in initialProps) {\n\t\t\t\tif (initialProps.hasOwnProperty(iPropName)) {\n\t\t\t\t\t(function(propName) {\n\t\t\t\t\t\tprops[propName] = initialProps[propName];\n\t\t\t\t\t\tObject.defineProperty(self, propName, {\n\t\t\t\t\t\t\tget: function getProperty() {\n\t\t\t\t\t\t\t\treturn props[propName];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})(iPropName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Current player wants to avoid async confusion.\n\t\t\tvar processingQueue = 0;\n\t\t\tObject.defineProperty(self, 'processing', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn (processingQueue > 0);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Set up proxied methods\n\t\t\tfor (var method in methods) {\n\t\t\t\tif (methods.hasOwnProperty(method)) {\n\t\t\t\t\tself[method] = methods[method];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// And some infrastructure!\n\t\t\tvar messageCount = 0,\n\t\t\t\tpendingCallbacks = {};\n\t\t\tthis.proxy = function(action, args, callback, transfers) {\n\t\t\t\tif (!worker) {\n\t\t\t\t\tthrow 'Tried to call \"' + action + '\" method on closed proxy object';\n\t\t\t\t}\n\t\t\t\tvar callbackId = 'callback-' + (++messageCount) + '-' + action;\n\t\t\t\tif (callback) {\n\t\t\t\t\tpendingCallbacks[callbackId] = callback;\n\t\t\t\t}\n\t\t\t\tvar out = {\n\t\t\t\t\t'action': action,\n\t\t\t\t\t'callbackId': callbackId,\n\t\t\t\t\t'args': args || []\n\t\t\t\t};\n\t\t\t\tprocessingQueue++;\n\t\t\t\tif (transferables) {\n\t\t\t\t\tworker.postMessage(out, transfers || []);\n\t\t\t\t} else {\n\t\t\t\t\tworker.postMessage(out);\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.terminate = function() {\n\t\t\t\tif (worker) {\n\t\t\t\t\tworker.terminate();\n\t\t\t\t\tworker = null;\n\t\t\t\t\tprocessingQueue = 0;\n\t\t\t\t\tpendingCallbacks = {};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tworker.addEventListener('message', function proxyOnMessage(event) {\n\t\t\t\tprocessingQueue--;\n\t\t\t\tif (event.data.action !== 'callback') {\n\t\t\t\t\t// ignore\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar data = event.data,\n\t\t\t\t\tcallbackId = data.callbackId,\n\t\t\t\t\targs = data.args,\n\t\t\t\t\tcallback = pendingCallbacks[callbackId];\n\n\t\t\t\t// Save any updated properties returned to us...\n\t\t\t\tif (data.props) {\n\t\t\t\t\tfor (var propName in data.props) {\n\t\t\t\t\t\tif (data.props.hasOwnProperty(propName)) {\n\t\t\t\t\t\t\tprops[propName] = data.props[propName];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tdelete pendingCallbacks[callbackId];\n\t\t\t\t\tcallback.apply(this, args);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Tell the proxy to load and initialize the appropriate class\n\t\t\tself.proxy('construct', [className, options], function() {});\n\n\t\t\treturn self;\n\t\t};\n\t}\n\n\tmodule.exports = OGVProxyClass;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar OGVProxyClass = __webpack_require__(5);\n\n\tvar OGVDecoderVideoProxy = OGVProxyClass({\n\t\tloadedMetadata: false,\n\t\tvideoFormat: null,\n\t\tframeBuffer: null,\n\t\tcpuTime: 0\n\t}, {\n\t\tinit: function(callback) {\n\t\t\tthis.proxy('init', [], callback);\n\t\t},\n\n\t\tprocessHeader: function(data, callback) {\n\t\t\tthis.proxy('processHeader', [data], callback, [data]);\n\t\t},\n\n\t\tprocessFrame: function(data, callback) {\n\t\t\tthis.proxy('processFrame', [data], callback, [data]);\n\t\t},\n\n\t\tclose: function() {\n\t\t\tthis.terminate();\n\t\t}\n\t});\n\n\tmodule.exports = OGVDecoderVideoProxy;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\n\tfunction OGVMediaType(contentType) {\n\t\tcontentType = '' + contentType;\n\n\t\tvar self = this;\n\t\tself.major = null;\n\t\tself.minor = null;\n\t\tself.codecs = null;\n\n\t\tfunction trim(str) {\n\t\t\treturn str.replace(/^\\s+/, '').replace(/\\s+$/, '');\n\t\t}\n\n\t\tfunction split(str, sep, limit) {\n\t\t\tvar bits = str.split(sep, limit).map(function(substr) {\n\t\t\t\treturn trim(substr);\n\t\t\t});\n\t\t\tif (typeof limit === 'number') {\n\t\t\t\twhile (bits.length < limit) {\n\t\t\t\t\tbits.push(null);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn bits;\n\t\t}\n\n\t\tvar parts = split(contentType, ';');\n\t\tif (parts.length) {\n\t\t\tvar base = parts.shift();\n\t\t\tif (base) {\n\t\t\t\tvar bits = split(base, '/', 2);\n\t\t\t\tself.major = bits[0];\n\t\t\t\tself.minor = bits[1];\n\t\t\t}\n\n\t\t\tparts.forEach(function(str) {\n\t\t\t\tvar matches = str.match(/^codecs\\s*=\\s*\"(.*?)\"$/);\n\t\t\t\tif (matches) {\n\t\t\t\t\tself.codecs = split(matches[1], ',');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmodule.exports = OGVMediaType;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(9).polyfill();\n\n\tvar YUVCanvas = __webpack_require__(12);\n\n\t// -- OGVLoader.js\n\tvar OGVLoader = __webpack_require__(3);\n\n\t// -- StreamFile.js\n\tvar StreamFile = __webpack_require__(19);\n\n\t// -- AudioFeeder.js\n\tvar AudioFeeder = __webpack_require__(30),\n\t\tdynamicaudio_swf = __webpack_require__(31);\n\n\t// -- Bisector.js\n\tvar Bisector = __webpack_require__(32);\n\n\t// -- OGVMediaType.js\n\tvar OGVMediaType = __webpack_require__(7);\n\n\t// -- OGVWrapperCodec.js\n\tvar OGVWrapperCodec = __webpack_require__(33);\n\n\t// -- OGVDecoderAudioProxy.js\n\tvar OGVDecoderAudioProxy = __webpack_require__(4);\n\n\t// -- OGVDecoderVideoProxy.js\n\tvar OGVDecoderVideoProxy = __webpack_require__(6);\n\n\t/**\n\t * Constructor for an analogue of the TimeRanges class\n\t * returned by various HTMLMediaElement properties\n\t *\n\t * Pass an array of two-element arrays, each containing a start and end time.\n\t */\n\t// FIXME: not use window scope if possible here\n\tvar OGVTimeRanges = window.OGVTimeRanges = function(ranges) {\n\t\tObject.defineProperty(this, 'length', {\n\t\t\tget: function getLength() {\n\t\t\t\treturn ranges.length;\n\t\t\t}\n\t\t});\n\t\tthis.start = function(i) {\n\t\t\treturn ranges[i][0];\n\t\t};\n\t\tthis.end = function(i) {\n\t\t\treturn ranges[i][1];\n\t\t};\n\t\treturn this;\n\t};\n\n\tvar OGVMediaErrorConstants = {\n\t\tMEDIA_ERR_ABORTED: 1,\n\t\tMEDIA_ERR_NETWORK: 2,\n\t\tMEDIA_ERR_DECODE: 3,\n\t\tMEDIA_ERR_SRC_NOT_SUPPORTED: 4\n\t};\n\tfunction extend(dest, src) {\n\t\tfor (prop in src) {\n\t\t\tif (src.hasOwnProperty(prop)) {\n\t\t\t\tdest[prop] = src[prop];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Constructor for analogue of the MediaError class\n\t * returned by HTMLMediaElement.error property\n\t */\n\tvar OGVMediaError = window.OGVMediaError = function(code, message) {\n\t\tthis.code = code;\n\t\tthis.message = message;\n\t};\n\textend(OGVMediaError, OGVMediaErrorConstants);\n\textend(OGVMediaError.prototype, OGVMediaErrorConstants);\n\n\t/**\n\t * Player class -- instantiate one of these to get an 'ogvjs' HTML element\n\t * which has a similar interface to the HTML audio/video elements.\n\t *\n\t * @param options: optional dictionary of options:\n\t *                 'base': string; base URL for additional resources, such as Flash audio shim\n\t *                 'webGL': bool; pass true to use WebGL acceleration if available\n\t *                 'forceWebGL': bool; pass true to require WebGL even if not detected\n\t *                 'sync': string; A/V sync plan: one of:\n\t *                     'delay-audio' (pre-1.3.2 behavior) stop audio when behind, then play all frames to catch up\n\t *                     'skip-frames' (default) to preserve audio, skipping frames until the next sync point (keyframe)\n\t */\n\tvar OGVPlayer = function(options) {\n\t\toptions = options || {};\n\n\t\tvar instanceId = 'ogvjs' + (++OGVPlayer.instanceCount);\n\n\t\tvar codecClass = null,\n\t\t\tcodecType = null;\n\n\t\tvar canvasOptions = {};\n\t\tif (options.webGL !== undefined) {\n\t\t\t// @fixme confirm format of webGL option\n\t\t\tcanvasOptions.webGL = options.webGL;\n\t\t}\n\t\tif(!!options.forceWebGL) {\n\t\t\tcanvasOptions.webGL = 'required';\n\t\t}\n\n\t\t// Experimental options\n\t\tvar enableWebM = !!options.enableWebM;\n\n\t\t// Running the codec in a worker thread equals happy times!\n\t\tvar enableWorker = !!window.Worker;\n\t\tif (typeof options.worker !== 'undefined') {\n\t\t\tenableWorker = !!options.worker;\n\t\t}\n\t\tvar enableThreading = !!options.threading;\n\t\tvar enableWASM = !!options.wasm;\n\n\t\tif (options.sync === undefined) {\n\t\t\toptions.sync = 'skip-frames';\n\t\t}\n\n\t\tvar State = {\n\t\t\tINITIAL: 'INITIAL',\n\t\t\tSEEKING_END: 'SEEKING_END',\n\t\t\tLOADED: 'LOADED',\n\t\t\tPRELOAD: 'PRELOAD',\n\t\t\tREADY: 'READY',\n\t\t\tPLAYING: 'PLAYING',\n\t\t\tSEEKING: 'SEEKING',\n\t\t\tENDED: 'ENDED',\n\t\t\tERROR: 'ERROR'\n\t\t}, state = State.INITIAL;\n\n\t\tvar SeekState = {\n\t\t\tNOT_SEEKING: 'NOT_SEEKING',\n\t\t\tBISECT_TO_TARGET: 'BISECT_TO_TARGET',\n\t\t\tBISECT_TO_KEYPOINT: 'BISECT_TO_KEYPOINT',\n\t\t\tLINEAR_TO_TARGET: 'LINEAR_TO_TARGET'\n\t\t}, seekState = SeekState.NOT_SEEKING;\n\n\t\tvar audioOptions = {},\n\t\t\tcodecOptions = {};\n\t\toptions.base = options.base || OGVLoader.base;\n\t\tif (typeof options.base === 'string') {\n\t\t\t// Pass the resource dir down to AudioFeeder, so it can load the dynamicaudio.swf\n\t\t\taudioOptions.base = options.base;\n\n\t\t\t// And to the worker thread, so it can load the codec JS\n\t\t\tcodecOptions.base = options.base;\n\t\t}\n\t\tif (typeof options.audioContext !== 'undefined') {\n\t\t\t// Try passing a pre-created audioContext in?\n\t\t\taudioOptions.audioContext = options.audioContext;\n\t\t}\n\t\tif (typeof options.audioDestination !== 'undefined') {\n\t\t\t// Try passing a pre-created audioContext in?\n\t\t\taudioOptions.output = options.audioDestination;\n\t\t}\n\t\t// Buffer in largeish chunks to survive long CPU spikes on slow CPUs (eg, 32-bit iOS)\n\t\taudioOptions.bufferSize = 8192;\n\n\t\tcodecOptions.worker = enableWorker;\n\t\tcodecOptions.threading = enableThreading;\n\t\tcodecOptions.wasm = enableWASM;\n\t\tif (typeof options.memoryLimit === 'number') {\n\t\t\tcodecOptions.memoryLimit = options.memoryLimit;\n\t\t}\n\n\t\tvar canvas = document.createElement('canvas');\n\t\tvar frameSink;\n\n\t\t// Return a magical custom element!\n\t\tvar self = document.createElement('ogvjs');\n\t\tself.className = instanceId;\n\n\t\textend(self, constants);\n\n\t\tcanvas.style.position = 'absolute';\n\t\tcanvas.style.top = '0';\n\t\tcanvas.style.left = '0';\n\t\tcanvas.style.width = '100%';\n\t\tcanvas.style.height = '100%';\n\t\tcanvas.style.objectFit = 'contain';\n\t\tself.appendChild(canvas);\n\n\t\tvar getTimestamp;\n\t\t// FIXME: don't use window scope, see BogoSlow.js\n\t\tif (window.performance === undefined || window.performance.now === undefined) {\n\t\t\tgetTimestamp = Date.now;\n\t\t} else {\n\t\t\tgetTimestamp = window.performance.now.bind(window.performance);\n\t\t}\n\t\tfunction time(cb) {\n\t\t\tvar start = getTimestamp();\n\t\t\tcb();\n\t\t\tvar delta = getTimestamp() - start;\n\t\t\tlastFrameDecodeTime += delta;\n\t\t\treturn delta;\n\t\t}\n\n\t\tvar then = getTimestamp();\n\t\tfunction log(msg) {\n\t\t\tif (options.debug) {\n\t\t\t\tvar now = getTimestamp(),\n\t\t\t\t\tdelta = now - then;\n\n\t\t\t\t//console.log('+' + delta + 'ms ' + msg);\n\t\t\t\t//then = now;\n\t\t\t\t\n\t\t\t\tif (!options.debugFilter || msg.match(options.debugFilter)) {\n\t\t\t\t\tconsole.log('[' + (Math.round(delta * 10) / 10) + 'ms] ' + msg);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction fireEvent(eventName, props) {\n\t\t\tlog('fireEvent ' + eventName);\n\t\t\tvar event;\n\t\t\tprops = props || {};\n\n\t\t\tvar standard = (typeof window.Event == 'function');\n\t\t\tif (standard) {\n\t\t\t\t// standard event creation\n\t\t\t\tevent = new CustomEvent(eventName);\n\t\t\t} else {\n\t\t\t\t// IE back-compat mode\n\t\t\t\t// https://msdn.microsoft.com/en-us/library/dn905219%28v=vs.85%29.aspx\n\t\t\t\tevent = document.createEvent('Event');\n\t\t\t\tevent.initEvent(eventName, false, false);\n\t\t\t}\n\n\t\t\tfor (var prop in props) {\n\t\t\t\tif (props.hasOwnProperty(prop)) {\n\t\t\t\t\tevent[prop] = props[prop];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar allowDefault = self.dispatchEvent(event);\n\t\t\tif (!standard && eventName === 'resize' && self.onresize && allowDefault) {\n\t\t\t\t// resize demands special treatment!\n\t\t\t\t// in IE 11 it doesn't fire through to the .onresize handler\n\t\t\t\t// for some crazy reason\n\t\t\t\tself.onresize.call(self, event);\n\t\t\t}\n\t\t}\n\t\tfunction fireEventAsync(eventName, props) {\n\t\t\tlog('fireEventAsync ' + eventName);\n\t\t\tsetTimeout(function() {\n\t\t\t\tfireEvent(eventName, props);\n\t\t\t}, 0);\n\t\t}\n\n\t\tvar codec = null,\n\t\t\tvideoInfo = null,\n\t\t\taudioInfo = null,\n\t\t\tactionQueue = [],\n\t\t\taudioFeeder = null;\n\t\tvar muted = false,\n\t\t\tinitialPlaybackPosition = 0.0,\n\t\t\tinitialPlaybackOffset = 0.0,\n\t\t\tprebufferingAudio = false,\n\t\t\tstoppedForLateFrame = false,\n\t\t\tinitialSeekTime = 0.0;\n\t\tfunction initAudioFeeder() {\n\t\t\taudioFeeder = new AudioFeeder( audioOptions );\n\t\t\taudioFeeder.init(audioInfo.channels, audioInfo.rate);\n\n\t\t\t// At our requested 8192 buffer size, bufferDuration should be\n\t\t\t// about 185ms at 44.1 kHz or 170ms at 48 kHz output, covering\n\t\t\t// 4-6 frames at 24-30fps.\n\t\t\t//\n\t\t\t// 2 or 3 buffers' worth will be in flight at any given time;\n\t\t\t// be warned that durationBuffered includes that in-flight stuff.\n\t\t\t//\n\t\t\t// Set our bufferThreshold to a full 1s for plenty of extra headroom,\n\t\t\t// and make sure we've queued up twice that when we're operating.\n\t\t\taudioFeeder.bufferThreshold = 1;\n\n\t\t\taudioFeeder.volume = self.volume;\n\t\t\taudioFeeder.muted = self.muted;\n\n\t\t\t// If we're in a background tab, timers may be throttled.\n\t\t\t// audioFeeder will call us when buffers need refilling,\n\t\t\t// without any throttling.\n\t\t\taudioFeeder.onbufferlow = function audioCallback() {\n\t\t\t\tlog('onbufferlow');\n\t\t\t\tif ((stream && (stream.buffering || stream.seeking)) || pendingAudio) {\n\t\t\t\t\t// We're waiting on input or other async processing;\n\t\t\t\t\t// we'll get triggered later.\n\t\t\t\t} else {\n\t\t\t\t\t// We're in an async event so it's safe to run the loop:\n\t\t\t\t\tpingProcessing();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// If we ran out of audio *completely* schedule some more processing.\n\t\t\t// This shouldn't happen if we keep up with onbufferlow, except at\n\t\t\t// the very beginning of playback when we haven't buffered any data yet.\n\t\t\t// @todo pre-buffer a little data to avoid needing this\n\t\t\taudioFeeder.onstarved = function () {\n\t\t\t\tif (dataEnded) {\n\t\t\t\t\t// Probably end of file.\n\t\t\t\t\t// Do nothing!\n\t\t\t\t\tlog('onstarved: appear to have reached end of audio');\n\t\t\t\t} else {\n\t\t\t\t\tlog('onstarved: halting audio due to starvation');\n\t\t\t\t\tstopPlayback();\n\t\t\t\t\tprebufferingAudio = true;\n\t\t\t\t}\n\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t// We're waiting on input or other async processing;\n\t\t\t\t\t// we'll get triggered later.\n\t\t\t\t} else {\n\t\t\t\t\t// Schedule loop after this synchronous event.\n\t\t\t\t\tpingProcessing(0);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction startPlayback(offset) {\n\t\t\tif (audioFeeder) {\n\t\t\t\taudioFeeder.start();\n\t\t\t\tvar state = audioFeeder.getPlaybackState();\n\t\t\t\tinitialPlaybackPosition = state.playbackPosition;\n\t\t\t} else {\n\t\t\t\tinitialPlaybackPosition = getTimestamp() / 1000;\n\t\t\t}\n\t\t\tif (offset !== undefined) {\n\t\t\t\tinitialPlaybackOffset = offset;\n\t\t\t}\n\t\t\t// Clear the late flag if it was set.\n\t\t\tprebufferingAudio = false;\n\t\t\tstoppedForLateFrame = false;\n\t\t\tlog('continuing at ' + initialPlaybackPosition + ', ' + initialPlaybackOffset);\n\t\t}\n\n\t\tfunction stopPlayback() {\n\t\t\tinitialPlaybackOffset = getPlaybackTime();\n\t\t\tlog('pausing at ' + initialPlaybackOffset);\n\t\t\tif (audioFeeder) {\n\t\t\t\taudioFeeder.stop();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Get audio playback time position in file's units\n\t\t *\n\t\t * @return {number} seconds since file start\n\t\t */\n\t\tfunction getPlaybackTime(state) {\n\t\t\tif (prebufferingAudio || stoppedForLateFrame || paused) {\n\t\t\t\treturn initialPlaybackOffset;\n\t\t\t} else {\n\t\t\t\tvar position;\n\t\t\t\tif (audioFeeder) {\n\t\t\t\t\tstate = state || audioFeeder.getPlaybackState();\n\t\t\t\t\tposition = state.playbackPosition;\n\t\t\t\t} else {\n\t\t\t\t\t// @fixme handle paused/stoped time better\n\t\t\t\t\tposition = getTimestamp() / 1000;\n\t\t\t\t}\n\t\t\t\treturn (position - initialPlaybackPosition) + initialPlaybackOffset;\n\t\t\t}\n\t\t}\n\n\t\tvar currentSrc = '',\n\t\t\tstream,\n\t\t\tstreamEnded = false,\n\t\t\tseekCancel = {},\n\t\t\treadCancel = {},\n\t\t\tmediaError = null,\n\t\t\tdataEnded = false,\n\t\t\tbyteLength = 0,\n\t\t\tduration = null,\n\t\t\tlastSeenTimestamp = null,\n\t\t\tnextProcessingTimer,\n\t\t\tnextFrameTimer = null,\n\t\t\tloading = false,\n\t\t\tstarted = false,\n\t\t\tpaused = true,\n\t\t\tended = false,\n\t\t\tstartedPlaybackInDocument = false;\n\n\t\tvar framesPlayed = 0;\n\t\t// Benchmark data, exposed via getPlaybackStats()\n\t\tvar framesProcessed = 0, // frames\n\t\t\ttargetPerFrameTime = 1000 / 60, // ms\n\t\t\tactualPerFrameTime = 0, // ms\n\t\t\ttotalFrameTime = 0, // ms\n\t\t\ttotalFrameCount = 0, // frames\n\t\t\tplayTime = 0, // ms\n\t\t\tbufferTime = 0, // ms\n\t\t\tdrawingTime = 0, // ms\n\t\t\tproxyTime = 0, // ms\n\t\t\ttotalJitter = 0; // sum of ms we're off from expected frame delivery time\n\t\t// Benchmark data that doesn't clear\n\t\tvar droppedAudio = 0, // number of times we were starved for audio\n\t\t\tdelayedAudio = 0, // seconds audio processing was delayed by blocked CPU\n\t\t\tlateFrames = 0;   // number of times a frame was late and we had to halt audio\n\t\tvar poster = '', thumbnail;\n\n\t\t// called when stopping old video on load()\n\t\tfunction stopVideo() {\n\t\t\tlog(\"STOPPING\");\n\t\t\t// kill the previous video if any\n\t\t\tstate = State.INITIAL;\n\t\t\tseekState = SeekState.NOT_SEEKING;\n\t\t\tstarted = false;\n\t\t\t//paused = true; // don't change this?\n\t\t\tended = false;\n\t\t\tframeEndTimestamp = 0.0;\n\t\t\taudioEndTimestamp = 0.0;\n\t\t\tlastFrameDecodeTime = 0.0;\n\t\t\tstoppedForLateFrame = false;\n\t\t\tprebufferingAudio = false;\n\n\t\t\t// Abort all queued actions\n\t\t\tactionQueue.splice(0, actionQueue.length);\n\n\t\t\tif (stream) {\n\t\t\t\t// @todo fire an abort event if still loading\n\t\t\t\t// @todo fire an emptied event if previously had data\n\t\t\t\tstream.abort();\n\t\t\t\tstream = null;\n\t\t\t\tstreamEnded = false;\n\t\t\t}\n\t\t\tif (codec) {\n\t\t\t\tcodec.close();\n\t\t\t\tcodec = null;\n\t\t\t\tpendingFrame = 0;\n\t\t\t\tpendingAudio = 0;\n\t\t\t\tdataEnded = false;\n\t\t\t}\n\t\t\tvideoInfo = null;\n\t\t\taudioInfo = null;\n\t\t\tif (audioFeeder) {\n\t\t\t\taudioFeeder.close();\n\t\t\t\taudioFeeder = null;\n\t\t\t}\n\t\t\tif (nextProcessingTimer) {\n\t\t\t\tclearTimeout(nextProcessingTimer);\n\t\t\t\tnextProcessingTimer = null;\n\t\t\t}\n\t\t\tif (nextFrameTimer) {\n\t\t\t\tclearTimeout(nextFrameTimer);\n\t\t\t\tnextFrameTimer = null;\n\t\t\t}\n\t\t\tif (frameSink) {\n\t\t\t\tframeSink.clear();\n\t\t\t\tframeSink = null;\n\t\t\t}\n\t\t\tif (decodedFrames) {\n\t\t\t\tdecodedFrames = [];\n\t\t\t}\n\t\t\tif (pendingFrames) {\n\t\t\t\tpendingFrames = [];\n\t\t\t}\n\t\t\tinitialSeekTime = 0.0;\n\t\t\t// @todo set playback position, may need to fire timeupdate if wasnt previously 0\n\t\t\tinitialPlaybackPosition = 0;\n\t\t\tinitialPlaybackOffset = 0;\n\t\t\tduration = null; // do not fire durationchange\n\t\t\t// timeline offset to 0?\n\t\t}\n\n\t\tvar lastFrameTime = getTimestamp(),\n\t\t\tframeEndTimestamp = 0.0,\n\t\t\taudioEndTimestamp = 0.0,\n\t\t\tdecodedFrames = [],\n\t\t\tpendingFrames = [];\n\t\tvar lastFrameDecodeTime = 0.0,\n\t\t\tlastFrameVideoCpuTime = 0,\n\t\t\tlastFrameAudioCpuTime = 0,\n\t\t\tlastFrameDemuxerCpuTime = 0,\n\t\t\tlastFrameDrawingTime = 0,\n\t\t\tlastFrameBufferTime = 0,\n\t\t\tlastFrameProxyTime = 0,\n\t\t\tlastVideoCpuTime = 0,\n\t\t\tlastAudioCpuTime = 0,\n\t\t\tlastDemuxerCpuTime = 0,\n\t\t\tlastBufferTime = 0,\n\t\t\tlastProxyTime = 0,\n\t\t\tlastDrawingTime = 0;\n\t\tvar lastFrameTimestamp = 0.0,\n\t\t\tcurrentVideoCpuTime = 0.0;\n\n\t\tvar lastTimeUpdate = 0, // ms\n\t\t\ttimeUpdateInterval = 250; // ms\n\n\t\tfunction doFrameComplete(data) {\n\t\t\tdata = data || {};\n\n\t\t\tif (startedPlaybackInDocument && !document.body.contains(self)) {\n\t\t\t\t// We've been de-parented since we last ran\n\t\t\t\t// Stop playback at next opportunity!\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tself.stop();\n\t\t\t\t}, 0);\n\t\t\t}\n\n\t\t\tvar newFrameTimestamp = getTimestamp(),\n\t\t\t\twallClockTime = newFrameTimestamp - lastFrameTimestamp,\n\t\t\t\t//jitter = wallClockTime - targetPerFrameTime;\n\t\t\t\tjitter = actualPerFrameTime - targetPerFrameTime;\n\t\t\ttotalJitter += Math.abs(jitter);\n\t\t\tplayTime += wallClockTime;\n\n\t\t\tvar timing = {\n\t\t\t\tcpuTime: lastFrameDecodeTime,\n\t\t\t\tdrawingTime: drawingTime - lastFrameDrawingTime,\n\t\t\t\tbufferTime: bufferTime - lastFrameBufferTime,\n\t\t\t\tproxyTime: proxyTime - lastFrameProxyTime,\n\t\t\t\t\n\t\t\t\tdemuxerTime: 0,\n\t\t\t\tvideoTime: 0,\n\t\t\t\taudioTime: 0,\n\t\t\t\t//clockTime: wallClockTime\n\t\t\t\tclockTime: actualPerFrameTime,\n\n\t\t\t\tlate: stoppedForLateFrame || data.dropped,\n\t\t\t\tdropped: data.dropped\n\t\t\t};\n\t\t\tif (codec) {\n\t\t\t\ttiming.demuxerTime = (codec.demuxerCpuTime - lastFrameDemuxerCpuTime);\n\t\t\t\ttiming.videoTime += (currentVideoCpuTime - lastFrameVideoCpuTime);\n\t\t\t\ttiming.audioTime += (codec.audioCpuTime - lastFrameAudioCpuTime);\n\t\t\t}\n\t\t\ttiming.cpuTime += timing.demuxerTime;\n\t\t\tlastFrameDecodeTime = 0;\n\t\t\tlastFrameTimestamp = newFrameTimestamp;\n\t\t\tif (codec) {\n\t\t\t\tlastFrameVideoCpuTime = currentVideoCpuTime;\n\t\t\t\tlastFrameAudioCpuTime = codec.audioCpuTime;\n\t\t\t\tlastFrameDemuxerCpuTime = codec.demuxerCpuTime;\n\t\t\t} else {\n\t\t\t\tlastFrameVideoCpuTime = 0;\n\t\t\t\tlastFrameAudioCpuTime = 0;\n\t\t\t\tlastFrameDemuxerCpuTime = 0;\n\t\t\t}\n\t\t\tlastFrameDrawingTime = drawingTime;\n\t\t\tlastFrameBufferTime = bufferTime;\n\t\t\tlastFrameProxyTime = proxyTime;\n\n\t\t\tfunction n(x) {\n\t\t\t\treturn Math.round(x * 10) / 10;\n\t\t\t}\n\t\t\tlog('drew frame ' + data.frameEndTimestamp + ': ' +\n\t\t\t\t'clock time ' + n(wallClockTime) + ' (jitter ' + n(jitter) + ') ' +\n\t\t\t\t'cpu: ' + n(timing.cpuTime) + ' (mux: ' + n(timing.demuxerTime) + ' buf: ' + n(timing.bufferTime) + ' draw: ' + n(timing.drawingTime) + ' proxy: ' + n(timing.proxyTime) + ') ' +\n\t\t\t\t'vid: ' + n(timing.videoTime) + ' aud: ' + n(timing.audioTime));\n\t\t\tfireEventAsync('framecallback', timing);\n\n\t\t\tif (!lastTimeUpdate || (newFrameTimestamp - lastTimeUpdate) >= timeUpdateInterval) {\n\t\t\t\tlastTimeUpdate = newFrameTimestamp;\n\t\t\t\tfireEventAsync('timeupdate');\n\t\t\t}\n\t\t}\n\n\n\t\t// -- seek functions\n\t\tvar seekTargetTime = 0.0,\n\t\t\tseekTargetKeypoint = 0.0,\n\t\t\tbisectTargetTime = 0.0,\n\t\t\tseekMode,\n\t\t\tlastSeekPosition,\n\t\t\tlastFrameSkipped,\n\t\t\tseekBisector,\n\t\t\tdidSeek;\n\n\t\tvar SeekMode = {\n\t\t\tEXACT: \"exact\",\n\t\t\tFAST: \"fast\"\n\t\t};\n\n\t\tfunction Cancel(msg) {\n\t\t\tError.call(this, msg);\n\t\t}\n\t\tCancel.prototype = Object.create(Error);\n\n\t\tfunction seekStream(offset) {\n\t\t\tif (stream.seeking) {\n\t\t\t\tseekCancel.cancel(new Cancel('cancel for new seek'));\n\t\t\t}\n\t\t\tif (stream.buffering) {\n\t\t\t\treadCancel.cancel(new Cancel('cancel for new seek'));\n\t\t\t}\n\t\t\tstreamEnded = false;\n\t\t\tdataEnded = false;\n\t\t\tended = false;\n\t\t\tstream.seek(offset, seekCancel).then(function() {\n\t\t\t\treadBytesAndWait();\n\t\t\t}).catch(onStreamError);\n\t\t}\n\n\t\tfunction startBisection(targetTime) {\n\t\t\t// leave room for potentially long Ogg page syncing\n\t\t\tvar endPoint = Math.max(0, stream.length - 65536);\n\n\t\t\tbisectTargetTime = targetTime;\n\t\t\tseekBisector = new Bisector({\n\t\t\t\tstart: 0,\n\t\t\t\tend: endPoint,\n\t\t\t\tprocess: function(start, end, position) {\n\t\t\t\t\tif (position == lastSeekPosition) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastSeekPosition = position;\n\t\t\t\t\t\tlastFrameSkipped = false;\n\t\t\t\t\t\tcodec.flush(function() {\n\t\t\t\t\t\t\tseekStream(position);\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tseekBisector.start();\n\t\t}\n\n\t\tfunction seek(toTime, mode) {\n\t\t\tlog('requested seek to ' + toTime + ', mode ' + mode);\n\n\t\t\tif (self.readyState == self.HAVE_NOTHING) {\n\t\t\t\tlog('not yet loaded; saving seek position for later');\n\t\t\t\tinitialSeekTime = toTime;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (stream && !stream.seekable) {\n\t\t\tconsole.log(stream)\n\t\t\t\tthrow new Error('Cannot seek a non-seekable stream');\n\t\t\t}\n\n\t\t\tfunction prepForSeek(callback) {\n\t\t\t\tif (stream && stream.buffering) {\n\t\t\t\t\treadCancel.cancel(new Cancel('cancel for new seek'));\n\t\t\t\t}\n\t\t\t\tif (stream && stream.seeking) {\n\t\t\t\t\tseekCancel.cancel(new Cancel('cancel for new seek'));\n\t\t\t\t}\n\t\t\t\t// clear any queued input/seek-start\n\t\t\t\tactionQueue.splice(0, actionQueue.length);\n\t\t\t\tstopPlayback();\n\t\t\t\tprebufferingAudio = false;\n\t\t\t\tstoppedForLateFrame = false;\n\t\t\t\tif (audioFeeder) {\n\t\t\t\t\taudioFeeder.flush();\n\t\t\t\t}\n\t\t\t\tstate = State.SEEKING;\n\t\t\t\tseekTargetTime = toTime;\n\t\t\t\tseekMode = mode;\n\t\t\t\tif (codec) {\n\t\t\t\t\tcodec.flush(callback);\n\t\t\t\t} else {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Abort any previous seek or play suitably\n\t\t\tprepForSeek(function() {\n\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t// already waiting on input\n\t\t\t\t} else {\n\t\t\t\t\t// start up the new load *after* event loop churn\n\t\t\t\t\tpingProcessing(0);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tactionQueue.push(function() {\n\t\t\t\t// Just in case another async task stopped us...\n\t\t\t\tprepForSeek(function() {\n\t\t\t\t\tdoSeek(toTime)\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tfunction doSeek(toTime) {\n\t\t\tstreamEnded = false;\n\t\t\tdataEnded = false;\n\t\t\tended = false;\n\t\t\tstate = State.SEEKING;\n\t\t\tseekTargetTime = toTime;\n\t\t\tseekTargetKeypoint = -1;\n\t\t\tlastFrameSkipped = false;\n\t\t\tlastSeekPosition = -1;\n\n\t\t\tdecodedFrames = [];\n\t\t\tpendingFrames = [];\n\t\t\tpendingFrame = 0;\n\t\t\tpendingAudio = 0;\n\n\t\t\tdidSeek = false;\n\t\t\tcodec.seekToKeypoint(toTime, function(seeking) {\n\t\t\t\tif (seeking) {\n\t\t\t\t\tseekState = SeekState.LINEAR_TO_TARGET;\n\t\t\t\t\tfireEventAsync('seeking');\n\n\t\t\t\t\tif (didSeek) {\n\t\t\t\t\t\t// wait for i/o to trigger readBytesAndWait\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Use the old interface still implemented on ogg demuxer\n\t\t\t\tcodec.getKeypointOffset(toTime, function(offset) {\n\t\t\t\t\tif (offset > 0) {\n\t\t\t\t\t\t// This file has an index!\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// Start at the keypoint, then decode forward to the desired time.\n\t\t\t\t\t\t//\n\t\t\t\t\t\tseekState = SeekState.LINEAR_TO_TARGET;\n\t\t\t\t\t\tseekStream(offset);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No index.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// Bisect through the file finding our target time, then we'll\n\t\t\t\t\t\t// have to do it again to reach the keypoint, and *then* we'll\n\t\t\t\t\t\t// have to decode forward back to the desired time.\n\t\t\t\t\t\t//\n\t\t\t\t\t\tseekState = SeekState.BISECT_TO_TARGET;\n\t\t\t\t\t\tstartBisection(seekTargetTime);\n\t\t\t\t\t}\n\n\t\t\t\t\tfireEventAsync('seeking');\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tfunction continueSeekedPlayback() {\n\t\t\tseekState = SeekState.NOT_SEEKING;\n\t\t\tstate = State.READY;\n\t\t\tframeEndTimestamp = codec.frameTimestamp;\n\t\t\taudioEndTimestamp = codec.audioTimestamp;\n\t\t\tif (codec.hasAudio) {\n\t\t\t\tseekTargetTime = codec.audioTimestamp;\n\t\t\t} else {\n\t\t\t\tseekTargetTime = codec.frameTimestamp;\n\t\t\t}\n\t\t\tinitialPlaybackOffset = seekTargetTime;\n\n\t\t\tfunction finishedSeeking() {\n\t\t\t\tlastTimeUpdate = seekTargetTime;\n\t\t\t\tfireEventAsync('timeupdate');\n\t\t\t\tfireEventAsync('seeked');\n\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t// wait for whatever's going on to complete\n\t\t\t\t} else {\n\t\t\t\t\tpingProcessing();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Decode and show first frame immediately\n\t\t\tif (codec.hasVideo && codec.frameReady) {\n\t\t\t\t// hack! move this into the main loop when retooling\n\t\t\t\t// to avoid maintaining this double draw\n\t\t\t\tcodec.decodeFrame(function(ok) {\n\t\t\t\t\tif (ok) {\n\t\t\t\t\t\tif (thumbnail) {\n\t\t\t\t\t\t\tself.removeChild(thumbnail);\n\t\t\t\t\t\t\tthumbnail = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tframeSink.drawFrame(codec.frameBuffer);\n\t\t\t\t\t}\n\t\t\t\t\tfinishedSeeking();\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tfinishedSeeking();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * @return {boolean} true to continue processing, false to wait for input data\n\t\t */\n\t\tfunction doProcessLinearSeeking() {\n\t\t\tvar frameDuration;\n\t\t\tif (codec.hasVideo) {\n\t\t\t\tframeDuration = targetPerFrameTime / 1000;\n\t\t\t} else {\n\t\t\t\tframeDuration = 1 / 256; // approximate packet audio size, fake!\n\t\t\t}\n\n\t\t\tif (codec.hasVideo) {\n\t\t\t\tif (pendingFrame) {\n\t\t\t\t\t// wait\n\t\t\t\t\treturn;\n\t\t\t\t} else if (!codec.frameReady) {\n\t\t\t\t\t// Haven't found a frame yet, process more data\n\t\t\t\t\tcodec.process(function(more) {\n\t\t\t\t\t\tif (more) {\n\t\t\t\t\t\t\t// need more packets\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t} else if (streamEnded) {\n\t\t\t\t\t\t\tlog('stream ended during linear seeking on video');\n\t\t\t\t\t\t\tdataEnded = true;\n\t\t\t\t\t\t\tcontinueSeekedPlayback();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treadBytesAndWait();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} else if (seekMode === SeekMode.FAST && codec.keyframeTimestamp == codec.frameTimestamp) {\n\t\t\t\t\t// Found some frames? Go ahead now!\n\t\t\t\t\tcontinueSeekedPlayback();\n\t\t\t\t\treturn;\n\t\t\t\t} else if (codec.frameTimestamp + frameDuration < seekTargetTime) {\n\t\t\t\t\t// Haven't found a time yet, or haven't reached the target time.\n\t\t\t\t\t// Decode it in case we're at our keyframe or a following intraframe...\n\t\t\t\t\tcodec.decodeFrame(function() {\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} else {\n\t\t\t\t\t// Reached or surpassed the target time.\n\t\t\t\t\tif (codec.hasAudio) {\n\t\t\t\t\t\t// Keep processing the audio track\n\t\t\t\t\t\t// fall through...\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontinueSeekedPlayback();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (codec.hasAudio) {\n\t\t\t\tif (pendingAudio) {\n\t\t\t\t\t// wait\n\t\t\t\t\treturn;\n\t\t\t\t} if (!codec.audioReady) {\n\t\t\t\t\t// Haven't found an audio packet yet, process more data\n\t\t\t\t\tcodec.process(function(more) {\n\t\t\t\t\t\tif (more) {\n\t\t\t\t\t\t\t// need more packets\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t} else if (streamEnded) {\n\t\t\t\t\t\t\tlog('stream ended during linear seeking on audio');\n\t\t\t\t\t\t\tdataEnded = true;\n\t\t\t\t\t\t\tcontinueSeekedPlayback();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treadBytesAndWait();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} else if (codec.audioTimestamp + frameDuration < seekTargetTime) {\n\t\t\t\t\t// Haven't found a time yet, or haven't reached the target time.\n\t\t\t\t\t// Decode it so when we reach the target we've got consistent data.\n\t\t\t\t\tcodec.decodeAudio(function() {\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} else {\n\t\t\t\t\tcontinueSeekedPlayback();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction doProcessBisectionSeek() {\n\t\t\tvar frameDuration,\n\t\t\t\ttimestamp;\n\t\t\tif (codec.hasVideo) {\n\t\t\t\ttimestamp = codec.frameTimestamp;\n\t\t\t\tframeDuration = targetPerFrameTime / 1000;\n\t\t\t} else if (codec.hasAudio) {\n\t\t\t\ttimestamp = codec.audioTimestamp;\n\t\t\t\tframeDuration = 1 / 256; // approximate packet audio size, fake!\n\t\t\t} else {\n\t\t\t\tthrow new Error('Invalid seek state; no audio or video track available');\n\t\t\t}\n\n\t\t\tif (timestamp < 0) {\n\t\t\t\t// Haven't found a packet yet.\n\t\t\t\tcodec.process(function(more) {\n\t\t\t\t\tif (more) {\n\t\t\t\t\t\t// need more data\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t} else if (streamEnded) {\n\t\t\t\t\t\tlog('stream ended during bisection seek');\n\t\t\t\t\t\t// We may have to go back further to find packets.\n\t\t\t\t\t\tif (seekBisector.right()) {\n\t\t\t\t\t\t\t// wait for new data to come in\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlog('failed going back');\n\t\t\t\t\t\t\tthrow new Error('not sure what to do');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treadBytesAndWait();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (timestamp - frameDuration / 2 > bisectTargetTime) {\n\t\t\t\tif (seekBisector.left()) {\n\t\t\t\t\t// wait for new data to come in\n\t\t\t\t} else {\n\t\t\t\t\tlog('close enough (left)');\n\n\t\t\t\t\t// We're having trouble finding a new packet position;\n\t\t\t\t\t// likely it's an audio file with lots of small packets.\n\t\t\t\t\t// Since we can't find an earlier packet, just continue here.\n\t\t\t\t\tseekTargetTime = timestamp;\n\t\t\t\t\tcontinueSeekedPlayback();\n\t\t\t\t}\n\t\t\t} else if (timestamp + frameDuration / 2 < bisectTargetTime) {\n\t\t\t\tif (seekBisector.right()) {\n\t\t\t\t\t// wait for new data to come in\n\t\t\t\t} else {\n\t\t\t\t\tlog('close enough (right)');\n\n\t\t\t\t\t// We're having trouble finding a new packet position;\n\t\t\t\t\t// likely it's an audio file with lots of small packets.\n\t\t\t\t\t// Switch to linear mode to find the final target.\n\t\t\t\t\tseekState = SeekState.LINEAR_TO_TARGET;\n\t\t\t\t\tpingProcessing();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Reached the bisection target!\n\t\t\t\tif (seekState == SeekState.BISECT_TO_TARGET && (codec.hasVideo && codec.keyframeTimestamp < codec.frameTimestamp)) {\n\t\t\t\t\t// We have to go back and find a keyframe. Sigh.\n\t\t\t\t\tlog('finding the keypoint now');\n\t\t\t\t\tseekState = SeekState.BISECT_TO_KEYPOINT;\n\t\t\t\t\tstartBisection(codec.keyframeTimestamp);\n\t\t\t\t} else {\n\t\t\t\t\tlog('straight seeking now');\n\t\t\t\t\t// Switch to linear mode to find the final target.\n\t\t\t\t\tseekState = SeekState.LINEAR_TO_TARGET;\n\t\t\t\t\tpingProcessing();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction setupVideo() {\n\t\t\tif (videoInfo.fps > 0) {\n\t\t\t\ttargetPerFrameTime = 1000 / videoInfo.fps;\n\t\t\t} else {\n\t\t\t\ttargetPerFrameTime = 16.667; // recalc this later\n\t\t\t}\n\n\t\t\tcanvas.width = videoInfo.displayWidth;\n\t\t\tcanvas.height = videoInfo.displayHeight;\n\t\t\tOGVPlayer.styleManager.appendRule('.' + instanceId, {\n\t\t\t\twidth: videoInfo.displayWidth + 'px',\n\t\t\t\theight: videoInfo.displayHeight + 'px'\n\t\t\t});\n\t\t\tOGVPlayer.updatePositionOnResize();\n\n\t\t\tframeSink = YUVCanvas.attach(canvas, canvasOptions);\n\t\t}\n\n\t\tvar depth = 0,\n\t\t\tneedProcessing = false,\n\t\t\tpendingFrame = 0,\n\t\t\tpendingAudio = 0,\n\t\t\tframePipelineDepth = 3,\n\t\t\taudioPipelineDepth = 4;\n\n\t\tfunction doProcessing() {\n\t\t\tif (didSeek) {\n\t\t\t\tdidSeek = false;\n\t\t\t}\n\t\t\tnextProcessingTimer = null;\n\n\t\t\tif (isProcessing()) {\n\t\t\t\t// Called async while waiting for something else to complete...\n\t\t\t\t// let it finish, then we'll get called again to continue.\n\t\t\t\t//return;\n\t\t\t\t//throw new Error('REENTRANCY FAIL: doProcessing during processing');\n\t\t\t}\n\n\t\t\tif (depth > 0) {\n\t\t\t\tthrow new Error('REENTRANCY FAIL: doProcessing recursing unexpectedly');\n\t\t\t}\n\t\t\tvar iters = 0;\n\t\t\tdo {\n\t\t\t\tneedProcessing = false;\n\t\t\t\tdepth++;\n\t\t\t\tdoProcessingLoop();\n\t\t\t\tdepth--;\n\t\t\t\t\n\t\t\t\tif (needProcessing && isProcessing()) {\n\t\t\t\t\tthrow new Error('REENTRANCY FAIL: waiting on input or codec but asked to keep processing');\n\t\t\t\t}\n\t\t\t\tif (++iters > 500) {\n\t\t\t\t\tlog('stuck in processing loop; breaking with timer');\n\t\t\t\t\tneedProcessing = 0;\n\t\t\t\t\tpingProcessing(0);\n\t\t\t\t}\n\t\t\t} while (needProcessing);\n\t\t}\n\n\t\tfunction doProcessingLoop() {\n\n\t\t\tif (actionQueue.length) {\n\t\t\t\t// data or user i/o to process in our serialized event stream\n\t\t\t\t// The function should eventually bring us back here via pingProcessing(),\n\t\t\t\t// directly or via further i/o.\n\n\t\t\t\tvar action = actionQueue.shift();\n\t\t\t\taction();\n\n\t\t\t} else if (state == State.INITIAL) {\n\n\t\t\t\tif (codec.loadedMetadata) {\n\t\t\t\t\t// we just fell over from headers into content; call onloadedmetadata etc\n\t\t\t\t\tif (!codec.hasVideo && !codec.hasAudio) {\n\t\t\t\t\t\tthrow new Error('No audio or video found, something is wrong');\n\t\t\t\t\t}\n\t\t\t\t\tif (codec.hasAudio) {\n\t\t\t\t\t\taudioInfo = codec.audioFormat;\n\t\t\t\t\t}\n\t\t\t\t\tif (codec.hasVideo) {\n\t\t\t\t\t\tvideoInfo = codec.videoFormat;\n\t\t\t\t\t\tsetupVideo();\n\t\t\t\t\t}\n\t\t\t\t\tif (!isNaN(codec.duration)) {\n\t\t\t\t\t\tduration = codec.duration;\n\t\t\t\t\t}\n\t\t\t\t\tif (duration === null) {\n\t\t\t\t\t\tif (stream.seekable) {\n\t\t\t\t\t\t\tstate = State.SEEKING_END;\n\t\t\t\t\t\t\tlastSeenTimestamp = -1;\n\t\t\t\t\t\t\tcodec.flush(function() {\n\t\t\t\t\t\t\t\tseekStream(Math.max(0, stream.length - 65536 * 2));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Stream not seekable and no x-content-duration; assuming infinite stream.\n\t\t\t\t\t\t\tstate = State.LOADED;\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// We already know the duration.\n\t\t\t\t\t\tstate = State.LOADED;\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcodec.process(function processInitial(more) {\n\t\t\t\t\t\tif (more) {\n\t\t\t\t\t\t\t// Keep processing headers\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t} else if (streamEnded) {\n\t\t\t\t\t\t\tthrow new Error('end of file before headers found');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Read more data!\n\t\t\t\t\t\t\tlog('reading more cause we are out of data');\n\t\t\t\t\t\t\treadBytesAndWait();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t} else if (state == State.SEEKING_END) {\n\n\t\t\t\t// Look for the last item.\n\t\t\t\tif (codec.frameReady) {\n\t\t\t\t\tlog('saw frame with ' + codec.frameTimestamp);\n\t\t\t\t\tlastSeenTimestamp = Math.max(lastSeenTimestamp, codec.frameTimestamp);\n\t\t\t\t\tcodec.discardFrame(function() {\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t});\n\t\t\t\t} else if (codec.audioReady) {\n\t\t\t\t\tlog('saw audio with ' + codec.audioTimestamp);\n\t\t\t\t\tlastSeenTimestamp = Math.max(lastSeenTimestamp, codec.audioTimestamp);\n\t\t\t\t\tcodec.discardAudio(function() {\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tcodec.process(function processSeekingEnd(more) {\n\t\t\t\t\t\tif (more) {\n\t\t\t\t\t\t\t// Keep processing headers\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Read more data!\n\t\t\t\t\t\t\tif (!stream.eof) {\n\t\t\t\t\t\t\t\treadBytesAndWait();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// We are at the end!\n\t\t\t\t\t\t\t\tlog('seek-duration: we are at the end: ' + lastSeenTimestamp);\n\t\t\t\t\t\t\t\tif (lastSeenTimestamp > 0) {\n\t\t\t\t\t\t\t\t\tduration = lastSeenTimestamp;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Ok, seek back to the beginning and resync the streams.\n\t\t\t\t\t\t\t\tstate = State.LOADED;\n\t\t\t\t\t\t\t\tcodec.flush(function() {\n\t\t\t\t\t\t\t\t\tstreamEnded = false;\n\t\t\t\t\t\t\t\t\tdataEnded = false;\n\t\t\t\t\t\t\t\t\tseekStream(0);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t} else if (state == State.LOADED) {\n\n\t\t\t\tstate = State.PRELOAD;\n\t\t\t\tfireEventAsync('loadedmetadata');\n\t\t\t\tfireEventAsync('durationchange');\n\t\t\t\tif (codec.hasVideo) {\n\t\t\t\t\tfireEventAsync('resize');\n\t\t\t\t}\n\t\t\t\tpingProcessing(0);\n\n\t\t\t} else if (state == State.PRELOAD) {\n\n\t\t\t\tif ((codec.frameReady || !codec.hasVideo) &&\n\t\t\t\t    (codec.audioReady || !codec.hasAudio)) {\n\n\t\t\t\t\tstate = State.READY;\n\t\t\t\t\tfireEventAsync('loadeddata');\n\t\t\t\t\tpingProcessing();\n\t\t\t\t} else {\n\t\t\t\t\tcodec.process(function doProcessPreload(more) {\n\t\t\t\t\t\tif (more) {\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t} else if (streamEnded) {\n\t\t\t\t\t\t\t// Ran out of data before data available...?\n\t\t\t\t\t\t\tended = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treadBytesAndWait();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t} else if (state == State.READY) {\n\t\t\t\tlog('initial seek to ' + initialSeekTime);\n\n\t\t\t\tif (initialSeekTime > 0) {\n\n\t\t\t\t\tvar target = initialSeekTime;\n\t\t\t\t\tinitialSeekTime = 0;\n\t\t\t\t\tlog('initial seek to ' + target);\n\t\t\t\t\tdoSeek(target);\n\n\t\t\t\t} else if (paused) {\n\n\t\t\t\t\t// Paused? stop here.\n\t\t\t\t\tlog('paused while in ready');\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfunction finishStartPlaying() {\n\t\t\t\t\t\tlog('finishStartPlaying');\n\n\t\t\t\t\t\tstate = State.PLAYING;\n\t\t\t\t\t\tlastFrameTimestamp = getTimestamp();\n\n\t\t\t\t\t\tif (codec.hasAudio && audioFeeder) {\n\t\t\t\t\t\t\t// Pre-queue audio before we start the clock\n\t\t\t\t\t\t\tprebufferingAudio = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstartPlayback();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpingProcessing(0);\n\t\t\t\t\t\tfireEventAsync('play');\n\t\t\t\t\t\tfireEventAsync('playing');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (codec.hasAudio && !audioFeeder && !muted) {\n\t\t\t\t\t\tinitAudioFeeder();\n\t\t\t\t\t\taudioFeeder.waitUntilReady(finishStartPlaying);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfinishStartPlaying();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else if (state == State.SEEKING) {\n\n\t\t\t\tif (seekState == SeekState.NOT_SEEKING) {\n\t\t\t\t\tthrow new Error('seeking in invalid state (not seeking?)');\n\t\t\t\t} else if (seekState == SeekState.BISECT_TO_TARGET) {\n\t\t\t\t\tdoProcessBisectionSeek();\n\t\t\t\t} else if (seekState == SeekState.BISECT_TO_KEYPOINT) {\n\t\t\t\t\tdoProcessBisectionSeek();\n\t\t\t\t} else if (seekState == SeekState.LINEAR_TO_TARGET) {\n\t\t\t\t\tdoProcessLinearSeeking();\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Invalid seek state ' + seekState);\n\t\t\t\t}\n\n\t\t\t} else if (state == State.PLAYING) {\n\n\t\t\t\tfunction doProcessPlay() {\n\n\t\t\t\t\t//console.log(more, codec.audioReady, codec.frameReady, codec.audioTimestamp, codec.frameTimestamp);\n\n\t\t\t\t\tif (paused) {\n\n\t\t\t\t\t\t// ok we're done for now!\n\t\t\t\t\t\tlog('paused during playback; stopping loop');\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ((!codec.hasAudio || codec.audioReady || pendingAudio || dataEnded) &&\n\t\t\t\t\t\t\t(!codec.hasVideo || codec.frameReady || pendingFrame || decodedFrames.length || dataEnded)\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tvar audioState = null,\n\t\t\t\t\t\t\t\tplaybackPosition = 0,\n\t\t\t\t\t\t\t\treadyForAudioDecode,\n\t\t\t\t\t\t\t\taudioEnded = false,\n\t\t\t\t\t\t\t\treadyForFrameDraw,\n\t\t\t\t\t\t\t\tframeDelay = 0,\n\t\t\t\t\t\t\t\treadyForFrameDecode,\n\t\t\t\t\t\t\t\t// timers never fire earlier than 4ms\n\t\t\t\t\t\t\t\ttimerMinimum = 4,\n\t\t\t\t\t\t\t\t// ok to draw a couple ms early\n\t\t\t\t\t\t\t\tfudgeDelta = timerMinimum;\n\n\n\t\t\t\t\t\t\tif (codec.hasAudio && audioFeeder) {\n\t\t\t\t\t\t\t\t// Drive on the audio clock!\n\n\t\t\t\t\t\t\t\taudioState = audioFeeder.getPlaybackState();\n\t\t\t\t\t\t\t\tplaybackPosition = getPlaybackTime(audioState);\n\t\t\t\t\t\t\t\taudioEnded = (dataEnded && audioFeeder.durationBuffered == 0);\n\n\t\t\t\t\t\t\t\tif (prebufferingAudio && (audioFeeder.durationBuffered >= audioFeeder.bufferThreshold * 2 || dataEnded)) {\n\t\t\t\t\t\t\t\t\tlog('prebuffering audio done; buffered to ' + audioFeeder.durationBuffered);\n\t\t\t\t\t\t\t\t\tstartPlayback(playbackPosition);\n\t\t\t\t\t\t\t\t\tprebufferingAudio = false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (audioState.dropped != droppedAudio) {\n\t\t\t\t\t\t\t\t\tlog('dropped ' + (audioState.dropped - droppedAudio));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (audioState.delayed != delayedAudio) {\n\t\t\t\t\t\t\t\t\tlog('delayed ' + (audioState.delayed - delayedAudio));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdroppedAudio = audioState.dropped;\n\t\t\t\t\t\t\t\tdelayedAudio = audioState.delayed;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\treadyForAudioDecode = audioFeeder.durationBuffered <=\n\t\t\t\t\t\t\t\t\taudioFeeder.bufferThreshold * 2;\n\n\t\t\t\t\t\t\t\tif (!readyForAudioDecode) {\n\t\t\t\t\t\t\t\t\t// just to skip the remaining items in debug log\n\t\t\t\t\t\t\t\t} else if (!codec.audioReady) {\n\t\t\t\t\t\t\t\t\t// NEED MOAR BUFFERS\n\t\t\t\t\t\t\t\t\treadyForAudioDecode = false;\n\t\t\t\t\t\t\t\t} else if (pendingAudio >= audioPipelineDepth) {\n\t\t\t\t\t\t\t\t\t// We'll check in when done decoding\n\t\t\t\t\t\t\t\t\tlog('audio decode disabled: ' + pendingAudio + ' packets in flight');\n\t\t\t\t\t\t\t\t\treadyForAudioDecode = false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// No audio; drive on the general clock.\n\t\t\t\t\t\t\t\t// @fixme account for dropped frame times...\n\t\t\t\t\t\t\t\tplaybackPosition = getPlaybackTime();\n\n\t\t\t\t\t\t\t\t// If playing muted with no audio output device,\n\t\t\t\t\t\t\t\t// just keep up with audio in general.\n\t\t\t\t\t\t\t\treadyForAudioDecode = codec.audioReady && (audioEndTimestamp < playbackPosition);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (codec.hasVideo) {\n\t\t\t\t\t\t\t\treadyForFrameDraw = decodedFrames.length > 0;\n\t\t\t\t\t\t\t\treadyForFrameDecode = (pendingFrame + decodedFrames.length < framePipelineDepth) && codec.frameReady;\n\n\t\t\t\t\t\t\t\tif (readyForFrameDraw) {\n\t\t\t\t\t\t\t\t\tframeDelay = (decodedFrames[0].frameEndTimestamp - playbackPosition) * 1000;\n\t\t\t\t\t\t\t\t\tactualPerFrameTime = targetPerFrameTime - frameDelay;\n\t\t\t\t\t\t\t\t\t//frameDelay = Math.max(0, frameDelay);\n\t\t\t\t\t\t\t\t\t//frameDelay = Math.min(frameDelay, targetPerFrameTime);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar audioSyncThreshold = targetPerFrameTime;\n\t\t\t\t\t\t\t\tif (prebufferingAudio) {\n\t\t\t\t\t\t\t\t\tif (readyForFrameDecode) {\n\t\t\t\t\t\t\t\t\t\tlog('decoding a frame during prebuffering');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treadyForFrameDraw = false;\n\t\t\t\t\t\t\t\t} else if (readyForFrameDraw && dataEnded && audioEnded) {\n\t\t\t\t\t\t\t\t\t// If audio timeline reached end, make sure the last frame draws\n\t\t\t\t\t\t\t\t\tlog('audio timeline ended? ready to draw frame');\n\t\t\t\t\t\t\t\t} else if (readyForFrameDraw && -frameDelay >= audioSyncThreshold) {\n\t\t\t\t\t\t\t\t\t// late frame!\n\t\t\t\t\t\t\t\t\tif (options.sync == 'delay-audio') {\n\t\t\t\t\t\t\t\t\t\t// Delay audio while video catches up. Old default.\n\t\t\t\t\t\t\t\t\t\tif (!stoppedForLateFrame) {\n\t\t\t\t\t\t\t\t\t\t\tlog('late frame at ' + playbackPosition + ': ' + (-frameDelay) + ' expected ' + audioSyncThreshold);\n\t\t\t\t\t\t\t\t\t\t\tlateFrames++;\n\t\t\t\t\t\t\t\t\t\t\tif (decodedFrames.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\tlog('late frame has a neighbor; skipping to next frame');\n\t\t\t\t\t\t\t\t\t\t\t\tvar frame = decodedFrames.shift();\n\t\t\t\t\t\t\t\t\t\t\t\tframeDelay = (frame.frameEndTimestamp - playbackPosition) * 1000;\n\t\t\t\t\t\t\t\t\t\t\t\tactualPerFrameTime = targetPerFrameTime - frameDelay;\n\t\t\t\t\t\t\t\t\t\t\t\tframesProcessed++; // pretend!\n\t\t\t\t\t\t\t\t\t\t\t\tdoFrameComplete({\n\t\t\t\t\t\t\t\t\t\t\t\t\tframeEndTimestamp: frame.frameEndTimestamp,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdropped: true\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tstopPlayback();\n\t\t\t\t\t\t\t\t\t\t\t\tstoppedForLateFrame = true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else if (options.sync == 'skip-frames') {\n\t\t\t\t\t\t\t\t\t\tvar skipPast = -1;\n\t\t\t\t\t\t\t\t\t\tfor (var i = 0; i < decodedFrames.length - 1; i++) {\n\t\t\t\t\t\t\t\t\t\t\tif (decodedFrames[i].frameEndTimestamp < playbackPosition) {\n\t\t\t\t\t\t\t\t\t\t\t\tskipPast = i - 1;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (skipPast >= 0) {\n\t\t\t\t\t\t\t\t\t\t\twhile (skipPast-- >= 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tlateFrames++;\n\t\t\t\t\t\t\t\t\t\t\t\tvar frame = decodedFrames.shift();\n\t\t\t\t\t\t\t\t\t\t\t\tlog('skipping already-decoded late frame at ' + frame.frameEndTimestamp);\n\t\t\t\t\t\t\t\t\t\t\t\tframeDelay = (frame.frameEndTimestamp - playbackPosition) * 1000;\n\t\t\t\t\t\t\t\t\t\t\t\tframeEndTimestamp = frame.frameEndTimestamp;\n\t\t\t\t\t\t\t\t\t\t\t\tactualPerFrameTime = targetPerFrameTime - frameDelay;\n\t\t\t\t\t\t\t\t\t\t\t\tframesProcessed++; // pretend!\n\t\t\t\t\t\t\t\t\t\t\t\tframe.dropped = true;\n\t\t\t\t\t\t\t\t\t\t\t\tdoFrameComplete();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Resync at the next keyframe. Default as of 1.3.2.\n\t\t\t\t\t\t\t\t\t\tvar nextKeyframe = codec.nextKeyframeTimestamp;\n\n\t\t\t\t\t\t\t\t\t\t// When resyncing, allow time to decode a couple frames!\n\t\t\t\t\t\t\t\t\t\tvar videoSyncPadding = (targetPerFrameTime / 1000) * (framePipelineDepth + pendingFrame);\n\t\t\t\t\t\t\t\t\t\tvar timeToResync = nextKeyframe - videoSyncPadding;\n\n\t\t\t\t\t\t\t\t\t\tif (nextKeyframe >= 0 && nextKeyframe != codec.frameTimestamp && playbackPosition  >= timeToResync) {\n\t\t\t\t\t\t\t\t\t\t\tlog('skipping late frame at ' + decodedFrames[0].frameEndTimestamp + ' vs ' + playbackPosition + ', expect to see keyframe at ' + nextKeyframe);\n\n\t\t\t\t\t\t\t\t\t\t\t// First skip any already-decoded frames\n\t\t\t\t\t\t\t\t\t\t\tfor (var i = 0; i < decodedFrames.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar frame = decodedFrames[i];\n\t\t\t\t\t\t\t\t\t\t\t\tlateFrames++;\n\t\t\t\t\t\t\t\t\t\t\t\tframesProcessed++; // pretend!\n\t\t\t\t\t\t\t\t\t\t\t\tframeEndTimestamp = frame.frameEndTimestamp;\n\t\t\t\t\t\t\t\t\t\t\t\tframeDelay = (frame.frameEndTimestamp - playbackPosition) * 1000;\n\t\t\t\t\t\t\t\t\t\t\t\tactualPerFrameTime = targetPerFrameTime - frameDelay;\n\t\t\t\t\t\t\t\t\t\t\t\tframe.dropped = true;\n\t\t\t\t\t\t\t\t\t\t\t\tdoFrameComplete(frame);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tdecodedFrames = [];\n\t\t\t\t\t\t\t\t\t\t\tfor (var i = 0; i < pendingFrames.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar frame = pendingFrames[i];\n\t\t\t\t\t\t\t\t\t\t\t\tlateFrames++;\n\t\t\t\t\t\t\t\t\t\t\t\tframesProcessed++; // pretend!\n\t\t\t\t\t\t\t\t\t\t\t\tframeEndTimestamp = frame.frameEndTimestamp;\n\t\t\t\t\t\t\t\t\t\t\t\tframeDelay = (frame.frameEndTimestamp - playbackPosition) * 1000;\n\t\t\t\t\t\t\t\t\t\t\t\tactualPerFrameTime = targetPerFrameTime - frameDelay;\n\t\t\t\t\t\t\t\t\t\t\t\tframe.dropped = true;\n\t\t\t\t\t\t\t\t\t\t\t\tdoFrameComplete(frame);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tpendingFrames = [];\n\t\t\t\t\t\t\t\t\t\t\tpendingFrame = 0;\n\n\t\t\t\t\t\t\t\t\t\t\t// Now discard anything up to the keyframe\n\t\t\t\t\t\t\t\t\t\t\twhile (codec.frameReady && codec.frameTimestamp < nextKeyframe) {\n\t\t\t\t\t\t\t\t\t\t\t\t// note: this is a known synchronous operation :)\n\t\t\t\t\t\t\t\t\t\t\t\tvar frame = {\n\t\t\t\t\t\t\t\t\t\t\t\t\tframeEndTimestamp: codec.frameTimestamp,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdropped: true\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t\tframeDelay = (frame.frameEndTimestamp - playbackPosition) * 1000;\n\t\t\t\t\t\t\t\t\t\t\t\tactualPerFrameTime = targetPerFrameTime - frameDelay;\n\t\t\t\t\t\t\t\t\t\t\t\tlateFrames++;\n\t\t\t\t\t\t\t\t\t\t\t\tcodec.discardFrame(function() {/*fake*/});\n\t\t\t\t\t\t\t\t\t\t\t\tframesProcessed++; // pretend!\n\t\t\t\t\t\t\t\t\t\t\t\tdoFrameComplete(frame);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t\t\t\t\t\t\t\t// wait\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (readyForFrameDraw && stoppedForLateFrame && !readyForFrameDecode && !readyForAudioDecode && frameDelay > fudgeDelta) {\n\t\t\t\t\t\t\t\t\t// catching up, ok if we were early\n\t\t\t\t\t\t\t\t\tlog('late frame recovery reached ' + frameDelay);\n\t\t\t\t\t\t\t\t\tstartPlayback(playbackPosition);\n\t\t\t\t\t\t\t\t\tstoppedForLateFrame = false;\n\t\t\t\t\t\t\t\t\treadyForFrameDraw = false; // go back through the loop again\n\t\t\t\t\t\t\t\t} else if (readyForFrameDraw && stoppedForLateFrame) {\n\t\t\t\t\t\t\t\t\t// draw asap\n\t\t\t\t\t\t\t\t} else if (readyForFrameDraw && frameDelay <= fudgeDelta) {\n\t\t\t\t\t\t\t\t\t// on time! draw\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// not yet\n\t\t\t\t\t\t\t\t\treadyForFrameDraw = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (readyForFrameDecode) {\n\n\t\t\t\t\t\t\t\tlog('play loop: ready to decode frame; thread depth: ' + pendingFrame + ', have buffered: ' + decodedFrames.length);\n\n\t\t\t\t\t\t\t\tif (videoInfo.fps == 0 && (codec.frameTimestamp - frameEndTimestamp) > 0) {\n\t\t\t\t\t\t\t\t\t// WebM doesn't encode a frame rate\n\t\t\t\t\t\t\t\t\ttargetPerFrameTime = (codec.frameTimestamp - frameEndTimestamp) * 1000;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttotalFrameTime += targetPerFrameTime;\n\t\t\t\t\t\t\t\ttotalFrameCount++;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar nextFrameEndTimestamp = frameEndTimestamp = codec.frameTimestamp;\n\t\t\t\t\t\t\t\tpendingFrame++;\n\t\t\t\t\t\t\t\tpendingFrames.push({\n\t\t\t\t\t\t\t\t\tframeEndTimestamp: nextFrameEndTimestamp\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tvar currentPendingFrames = pendingFrames;\n\t\t\t\t\t\t\t\tvar wasAsync = false;\n\t\t\t\t\t\t\t\tvar frameDecodeTime = time(function() {\n\t\t\t\t\t\t\t\t\tcodec.decodeFrame(function processingDecodeFrame(ok) {\n\t\t\t\t\t\t\t\t\t\tif (currentPendingFrames !== pendingFrames) {\n\t\t\t\t\t\t\t\t\t\t\tlog('play loop callback after flush, discarding');\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tlog('play loop callback: decoded frame');\n\t\t\t\t\t\t\t\t\t\tpendingFrame--;\n\t\t\t\t\t\t\t\t\t\tpendingFrames.shift();\n\t\t\t\t\t\t\t\t\t\tif (ok) {\n\t\t\t\t\t\t\t\t\t\t\t// Save the buffer until it's time to draw\n\t\t\t\t\t\t\t\t\t\t\tdecodedFrames.push({\n\t\t\t\t\t\t\t\t\t\t\t\tyCbCrBuffer: codec.frameBuffer,\n\t\t\t\t\t\t\t\t\t\t\t\tvideoCpuTime: codec.videoCpuTime,\n\t\t\t\t\t\t\t\t\t\t\t\tframeEndTimestamp: nextFrameEndTimestamp\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t// Bad packet or something.\n\t\t\t\t\t\t\t\t\t\t\tlog('Bad video packet or something');\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcodec.process(function() {\n\t\t\t\t\t\t\t\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t\t\t\t\t\t\t\t// wait\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tpingProcessing(wasAsync ? undefined : 0);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (pendingFrame) {\n\t\t\t\t\t\t\t\t\twasAsync = true;\n\t\t\t\t\t\t\t\t\tproxyTime += frameDecodeTime;\n\t\t\t\t\t\t\t\t\t// We can process something else while that's running\n\t\t\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if (readyForAudioDecode) {\n\n\t\t\t\t\t\t\t\tlog('play loop: ready for audio; depth: ' + pendingAudio);\n\n\t\t\t\t\t\t\t\tpendingAudio++;\n\t\t\t\t\t\t\t\tvar nextAudioEndTimestamp = codec.audioTimestamp;\n\t\t\t\t\t\t\t\tvar audioDecodeTime = time(function() {\n\t\t\t\t\t\t\t\t\tcodec.decodeAudio(function processingDecodeAudio(ok) {\n\t\t\t\t\t\t\t\t\t\tpendingAudio--;\n\t\t\t\t\t\t\t\t\t\tlog('play loop callback: decoded audio');\n\t\t\t\t\t\t\t\t\t\taudioEndTimestamp = nextAudioEndTimestamp;\n\n\t\t\t\t\t\t\t\t\t\tif (ok) {\n\t\t\t\t\t\t\t\t\t\t\tvar buffer = codec.audioBuffer;\n\t\t\t\t\t\t\t\t\t\t\tif (buffer) {\n\t\t\t\t\t\t\t\t\t\t\t\t// Keep track of how much time we spend queueing audio as well\n\t\t\t\t\t\t\t\t\t\t\t\t// This is slow when using the Flash shim on IE 10/11\n\t\t\t\t\t\t\t\t\t\t\t\tbufferTime += time(function() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (audioFeeder) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taudioFeeder.bufferData(buffer);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\tif (!codec.hasVideo) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tframesProcessed++; // pretend!\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar frame = {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tframeEndTimestamp: audioEndTimestamp\n\t\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t\t\tdoFrameComplete(frame);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t\t\t\t\t\t\t// wait\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (pendingAudio) {\n\t\t\t\t\t\t\t\t\tproxyTime += audioDecodeTime;\n\t\t\t\t\t\t\t\t\t// We can process something else while that's running\n\t\t\t\t\t\t\t\t\tif (codec.audioReady) {\n\t\t\t\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Trigger a demux immediately if we need it;\n\t\t\t\t\t\t\t\t\t\t// audio processing is our mostly-idle time\n\t\t\t\t\t\t\t\t\t\tdoProcessPlayDemux();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if (readyForFrameDraw) {\n\n\t\t\t\t\t\t\t\tlog('play loop: ready to draw frame');\n\n\t\t\t\t\t\t\t\tif (nextFrameTimer) {\n\t\t\t\t\t\t\t\t\tclearTimeout(nextFrameTimer);\n\t\t\t\t\t\t\t\t\tnextFrameTimer = null;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Ready to draw the decoded frame...\n\t\t\t\t\t\t\t\tif (thumbnail) {\n\t\t\t\t\t\t\t\t\tself.removeChild(thumbnail);\n\t\t\t\t\t\t\t\t\tthumbnail = null;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar frame = decodedFrames.shift();\n\t\t\t\t\t\t\t\tcurrentVideoCpuTime = frame.videoCpuTime;\n\n\t\t\t\t\t\t\t\tdrawingTime += time(function() {\n\t\t\t\t\t\t\t\t\tframeSink.drawFrame(frame.yCbCrBuffer);\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tframesProcessed++;\n\t\t\t\t\t\t\t\tframesPlayed++;\n\n\t\t\t\t\t\t\t\tdoFrameComplete(frame);\n\n\t\t\t\t\t\t\t\tpingProcessing();\n\n\t\t\t\t\t\t\t} else if (decodedFrames.length && !nextFrameTimer && !prebufferingAudio) {\n\n\t\t\t\t\t\t\t\tvar targetTimer = frameDelay;\n\t\t\t\t\t\t\t\t// @todo consider using requestAnimationFrame\n\t\t\t\t\t\t\t\tlog('play loop: setting a timer for drawing ' + targetTimer);\n\t\t\t\t\t\t\t\tnextFrameTimer = setTimeout(function() {\n\t\t\t\t\t\t\t\t\tnextFrameTimer = null;\n\t\t\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t\t\t}, targetTimer);\n\n\t\t\t\t\t\t\t} else if (dataEnded && !(pendingAudio || pendingFrame || decodedFrames.length)) {\n\t\t\t\t\t\t\t\tlog('play loop: playback reached end of data ' + [pendingAudio, pendingFrame, decodedFrames.length]);\n\t\t\t\t\t\t\t\tvar finalDelay = 0;\n\t\t\t\t\t\t\t\tif (codec.hasAudio && audioFeeder) {\n\t\t\t\t\t\t\t\t\tfinalDelay = audioFeeder.durationBuffered * 1000;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (finalDelay > 0) {\n\t\t\t\t\t\t\t\t\tlog('play loop: ending pending ' + finalDelay + ' ms');\n\t\t\t\t\t\t\t\t\tpingProcessing(Math.max(0, finalDelay));\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlog('play loop: ENDING NOW: playback time ' + getPlaybackTime() + '; frameEndTimestamp: ' + frameEndTimestamp);\n\t\t\t\t\t\t\t\t\tstopPlayback();\n\t\t\t\t\t\t\t\t\tstoppedForLateFrame = false;\n\t\t\t\t\t\t\t\t\tprebufferingAudio = false;\n\t\t\t\t\t\t\t\t\tinitialPlaybackOffset = Math.max(audioEndTimestamp, frameEndTimestamp);\n\t\t\t\t\t\t\t\t\tended = true;\n\t\t\t\t\t\t\t\t\t// @todo implement loop behavior\n\t\t\t\t\t\t\t\t\tpaused = true;\n\t\t\t\t\t\t\t\t\tfireEventAsync('pause');\n\t\t\t\t\t\t\t\t\tfireEventAsync('ended');\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tlog('play loop: waiting on async/timers');\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tlog('play loop: demuxing');\n\n\t\t\t\t\t\t\tdoProcessPlayDemux();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction doProcessPlayDemux() {\n\t\t\t\t\tvar wasFrameReady = codec.frameReady,\n\t\t\t\t\t\twasAudioReady = codec.audioReady;\n\t\t\t\t\tcodec.process(function doProcessPlayDemuxHandler(more) {\n\t\t\t\t\t\tif ((codec.frameReady && !wasFrameReady) || (codec.audioReady && !wasAudioReady)) {\n\t\t\t\t\t\t\tlog('demuxer has packets');\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t} else if (more) {\n\t\t\t\t\t\t\t// Have to process some more pages to find data.\n\t\t\t\t\t\t\tlog('demuxer processing to find more packets');\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlog('demuxer ran out of data');\n\t\t\t\t\t\t\tif (!streamEnded) {\n\t\t\t\t\t\t\t\t// Ran out of buffered input\n\t\t\t\t\t\t\t\tlog('demuxer loading more data');\n\t\t\t\t\t\t\t\treadBytesAndWait();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Ran out of stream!\n\t\t\t\t\t\t\t\tlog('demuxer reached end of data stream');\n\t\t\t\t\t\t\t\tdataEnded = true;\n\t\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdoProcessPlay();\n\n\t\t\t} else if (state == State.ERROR) {\n\n\t\t\t\t// Nothing to do.\n\t\t\t\tconsole.log(\"Reached error state. Sorry bout that.\");\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unexpected OGVPlayer state ' + state);\n\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Are we waiting on an async operation that will return later?\n\t\t */\n\t\tfunction isProcessing() {\n\t\t\treturn (stream && (stream.buffering || stream.seeking)) || (codec && codec.processing);\n\t\t}\n\n\t\tfunction readBytesAndWait() {\n\t\t\tif (stream.buffering || stream.seeking) {\n\t\t\t\tlog('readBytesAndWait during i/o');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// keep i/o size small to reduce CPU impact of demuxing on slow machines\n\t\t\t// @todo make buffer size larger when packets are larger?\n\t\t\tvar bufferSize = 32768;\n\t\t\tstream.read(bufferSize, readCancel).then(function(data) {\n\t\t\t\tlog('got input ' + [data.byteLength]);\n\n\t\t\t\tif (data.byteLength) {\n\t\t\t\t\t// Save chunk to pass into the codec's buffer\n\t\t\t\t\tactionQueue.push(function doReceiveInput() {\n\t\t\t\t\t\tcodec.receiveInput(data, function() {\n\t\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (stream.eof) {\n\t\t\t\t\t// @todo record doneness in networkState\n\t\t\t\t\tlog('stream is at end!');\n\t\t\t\t\tstreamEnded = true;\n\t\t\t\t}\n\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t// We're waiting on the codec already...\n\t\t\t\t} else {\n\t\t\t\t\t// Let the read/decode/draw loop know we're out!\n\t\t\t\t\tpingProcessing();\n\t\t\t\t}\n\t\t\t}).catch(onStreamError);\n\t\t}\n\n\t\tfunction onStreamError(err) {\n\t\t\tif (err instanceof Cancel) {\n\t\t\t\t// do nothing\n\t\t\t\tlog('i/o promise canceled; ignoring');\n\t\t\t} else {\n\t\t\t\tlog(\"i/o error: \" + err);\n\t\t\t\tmediaError = new OGVMediaError(OGVMediaError.MEDIA_ERR_NETWORK, '' + err);\n\t\t\t\tstate = State.ERROR;\n\t\t\t\tstopPlayback();\n\t\t\t}\n\t\t}\n\n\t\tfunction pingProcessing(delay) {\n\t\t\tif (delay === undefined) {\n\t\t\t\tdelay = -1;\n\t\t\t}\n\t\t\t/*\n\t\t\tif (isProcessing()) {\n\t\t\t\t// We'll get pinged again when whatever we were doing returns...\n\t\t\t\tlog('REENTRANCY FAIL: asked to pingProcessing() while already waiting');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t*/\n\t\t\tif (stream && stream.waiting) {\n\t\t\t\t// wait for this input pls\n\t\t\t\tlog('waiting on input');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (nextProcessingTimer) {\n\t\t\t\tlog('canceling old processing timer');\n\t\t\t\tclearTimeout(nextProcessingTimer);\n\t\t\t\tnextProcessingTimer = null;\n\t\t\t}\n\t\t\tvar fudge = -1 / 256;\n\t\t\tif (delay > fudge) {\n\t\t\t\t//log('pingProcessing delay: ' + delay);\n\t\t\t\tnextProcessingTimer = setTimeout(function() {\n\t\t\t\t\t// run through pingProcessing again to check\n\t\t\t\t\t// in case some io started asynchronously in the meantime\n\t\t\t\t\tpingProcessing();\n\t\t\t\t}, delay);\n\t\t\t} else if (depth) {\n\t\t\t\t//log('pingProcessing tail call (' + delay + ')');\n\t\t\t\tneedProcessing = true;\n\t\t\t} else {\n\t\t\t\tdoProcessing();\n\t\t\t}\n\t\t}\n\n\t\tvar videoInfo,\n\t\t\taudioInfo;\n\n\t\tfunction startProcessingVideo() {\n\t\t\tif (started || codec) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tframesProcessed = 0;\n\t\t\tbufferTime = 0;\n\t\t\tdrawingTime = 0;\n\t\t\tproxyTime = 0;\n\t\t\tstarted = true;\n\t\t\tended = false;\n\n\t\t\tcodec = new codecClass(codecOptions);\n\t\t\tlastVideoCpuTime = 0;\n\t\t\tlastAudioCpuTime = 0;\n\t\t\tlastDemuxerCpuTime = 0;\n\t\t\tlastBufferTime = 0;\n\t\t\tlastDrawingTime = 0;\n\t\t\tlastProxyTime = 0;\n\t\t\tlastFrameVideoCpuTime = 0;\n\t\t\tlastFrameAudioCpuTime = 0;\n\t\t\tlastFrameDemuxerCpuTime = 0;\n\t\t\tlastFrameBufferTime = 0;\n\t\t\tlastFrameProxyTime = 0;\n\t\t\tlastFrameDrawingTime = 0;\n\t\t\tcurrentVideoCpuTime = 0;\n\t\t\tcodec.onseek = function(offset) {\n\t\t\t\tdidSeek = true;\n\t\t\t\tif (stream) {\n\t\t\t\t\tseekStream(offset);\n\t\t\t\t}\n\t\t\t};\n\t\t\tcodec.init(function() {\n\t\t\t\treadBytesAndWait();\n\t\t\t});\n\t\t}\n\n\t\tfunction loadCodec(callback) {\n\t\t\t// @todo use the demuxer and codec interfaces directly\n\n\t\t\t// @todo fix detection proper\n\t\t\tif (enableWebM && currentSrc.match(/\\.webm$/i)) {\n\t\t\t\tcodecOptions.type = 'video/webm';\n\t\t\t} else {\n\t\t\t\tcodecOptions.type = 'video/ogg';\n\t\t\t}\n\n\t\t\tcodecClass = OGVWrapperCodec;\n\t\t\tcallback();\n\t\t}\n\n\t\t/**\n\t\t * HTMLMediaElement load method\n\t\t *\n\t\t * https://www.w3.org/TR/html5/embedded-content-0.html#concept-media-load-algorithm\n\t\t */\n\t\tself.load = function() {\n\t\t\tprepForLoad();\n\t\t};\n\n\t\tfunction prepForLoad(preload) {\n\t\t\tstopVideo();\n\n\t\t\tfunction doLoad() {\n\t\t\t\t// @todo networkState == NETWORK_LOADING\n\t\t\t\tstream = new StreamFile({\n\t\t\t\t\turl: self.src,\n\t\t\t\t\tcacheSize: 16 * 1024 * 1024,\n\t\t\t\t});\n\t\t\t\tstream.load().then(function() {\n\t\t\t\t\tloading = false;\n\n\t\t\t\t\t// @todo handle failure / unrecognized type\n\n\t\t\t\t\tcurrentSrc = self.src;\n\n\t\t\t\t\t// Fire off the read/decode/draw loop...\n\t\t\t\t\tbyteLength = stream.seekable ? stream.length : 0;\n\n\t\t\t\t\t// If we get X-Content-Duration, that's as good as an explicit hint\n\t\t\t\t\tvar durationHeader = stream.headers['x-content-duration'];\n\t\t\t\t\tif (typeof durationHeader === 'string') {\n\t\t\t\t\t\tduration = parseFloat(durationHeader);\n\t\t\t\t\t}\n\t\t\t\t\tloadCodec(startProcessingVideo);\n\t\t\t\t}).catch(onStreamError);\n\t\t\t}\n\n\t\t\t// @todo networkState = self.NETWORK_NO_SOURCE;\n\t\t\t// @todo show poster\n\t\t\t// @todo set 'delay load event flag'\n\n\t\t\tcurrentSrc = '';\n\t\t\tloading = true;\n\t\t\tactionQueue.push(function() {\n\t\t\t\tif (preload && self.preload === 'none') {\n\t\t\t\t\t// Done for now, we'll pick up if someone hits play() or load()\n\t\t\t\t\tloading = false;\n\t\t\t\t} else {\n\t\t\t\t\tdoLoad();\n\t\t\t\t}\n\t\t\t});\n\t\t\tpingProcessing(0);\n\t\t}\n\n\t\t/**\n\t\t * HTMLMediaElement canPlayType method\n\t\t */\n\t\tself.canPlayType = function(contentType) {\n\t\t\tvar type = new OGVMediaType(contentType);\n\t\t\tif (type.minor === 'ogg' &&\n\t\t\t\t(type.major === 'audio' || type.major === 'video' || type.major === 'application')) {\n\t\t\t\tif (type.codecs) {\n\t\t\t\t\tvar supported = ['vorbis', 'opus', 'theora'],\n\t\t\t\t\t\tknownCodecs = 0,\n\t\t\t\t\t\tunknownCodecs = 0;\n\t\t\t\t\ttype.codecs.forEach(function(codec) {\n\t\t\t\t\t\tif (supported.indexOf(codec) >= 0) {\n\t\t\t\t\t\t\tknownCodecs++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunknownCodecs++;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (knownCodecs === 0) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t} else if (unknownCodecs > 0) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t\t// All listed codecs are ones we know. Neat!\n\t\t\t\t\treturn 'probably';\n\t\t\t\t} else {\n\t\t\t\t\treturn 'maybe';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// @todo when webm support is more complete, handle it\n\t\t\t\treturn '';\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * HTMLMediaElement play method\n\t\t */\n\t\tself.play = function() {\n\t\t\tif (!muted && !audioOptions.audioContext) {\n\t\t\t\tOGVPlayer.initSharedAudioContext();\n\t\t\t}\n\n\t\t\tif (paused) {\n\t\t\t\tstartedPlaybackInDocument = document.body.contains(self);\n\n\t\t\t\tpaused = false;\n\n\t\t\t\tif (state == State.SEEKING) {\n\n\t\t\t\t\t// Seeking? Just make sure we know to pick up after.\n\n\t\t\t\t} else if (started && codec && codec.loadedMetadata) {\n\n\t\t\t\t\tif (ended && stream && byteLength) {\n\n\t\t\t\t\t\tlog('.play() starting over after end');\n\t\t\t\t\t\tseek(0);\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog('.play() while already started');\n\t\t\t\t\t}\n\n\t\t\t\t\tstate = State.READY;\n\t\t\t\t\tif (isProcessing()) {\n\t\t\t\t\t\t// waiting on the codec already\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpingProcessing();\n\t\t\t\t\t}\n\n\t\t\t\t} else if (loading) {\n\n\t\t\t\t\tlog('.play() while loading');\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlog('.play() before started');\n\n\t\t\t\t\t// Let playback begin when metadata loading is complete\n\t\t\t\t\tif (!stream) {\n\t\t\t\t\t\tself.load();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * custom getPlaybackStats method\n\t\t */\n\t\tself.getPlaybackStats = function() {\n\t\t\treturn {\n\t\t\t\ttargetPerFrameTime: targetPerFrameTime,\n\t\t\t\tframesProcessed: framesProcessed,\n\t\t\t\tplayTime: playTime,\n\t\t\t\tdemuxingTime: codec ? (codec.demuxerCpuTime - lastDemuxerCpuTime) : 0,\n\t\t\t\tvideoDecodingTime: codec ? (codec.videoCpuTime - lastVideoCpuTime) : 0,\n\t\t\t\taudioDecodingTime: codec ? (codec.audioCpuTime - lastAudioCpuTime) : 0,\n\t\t\t\tbufferTime: bufferTime - lastBufferTime,\n\t\t\t\tdrawingTime: drawingTime - lastDrawingTime,\n\t\t\t\tproxyTime: proxyTime - lastProxyTime,\n\t\t\t\tdroppedAudio: droppedAudio,\n\t\t\t\tdelayedAudio: delayedAudio,\n\t\t\t\tjitter: totalJitter / framesProcessed,\n\t\t\t\tlateFrames: lateFrames\n\t\t\t};\n\t\t};\n\t\tself.resetPlaybackStats = function() {\n\t\t\tframesProcessed = 0;\n\t\t\tplayTime = 0;\n\t\t\tif (codec) {\n\t\t\t\tlastDemuxerCpuTime = codec.demuxerCpuTime;\n\t\t\t\tlastVideoCpuTime = codec.videoCpuTime;\n\t\t\t\tlastAudioCpuTime = codec.audioCpuTime;\n\t\t\t}\n\t\t\tlastBufferTime = bufferTime;\n\t\t\tlastDrawingTime = drawingTime;\n\t\t\tlastProxyTime = proxyTime;\n\t\t\ttotalJitter = 0;\n\t\t\ttotalFrameTime = 0;\n\t\t\ttotalFrameCount = 0;\n\t\t};\n\n\t\tself.getVideoFrameSink = function() {\n\t\t\treturn frameSink;\n\t\t};\n\n\t\tself.getCanvas = function() {\n\t\t\treturn canvas;\n\t\t};\n\n\t\t/**\n\t\t * HTMLMediaElement pause method\n\t\t */\n\t\tself.pause = function() {\n\t\t\tif (!paused) {\n\t\t\t\tclearTimeout(nextProcessingTimer);\n\t\t\t\tnextProcessingTimer = null;\n\t\t\t\tstopPlayback();\n\t\t\t\tprebufferingAudio = false;\n\t\t\t\tstoppedForLateFrame = false;\n\t\t\t\tpaused = true;\n\t\t\t\tfireEvent('pause');\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * custom 'stop' method\n\t\t */\n\t\tself.stop = function() {\n\t\t\tstopVideo();\n\t\t\tpaused = true;\n\t\t};\n\n\t\t/**\n\t\t * @todo implement the fast part of the behavior!\n\t\t */\n\t\tself.fastSeek = function(seekToTime) {\n\t\t\tseek(+seekToTime, SeekMode.FAST);\n\t\t};\n\n\t\t/**\n\t\t * HTMLMediaElement src property\n\t\t */\n\t\tObject.defineProperty(self, \"src\", {\n\t\t\tget: function getSrc() {\n\t\t\t\treturn self.getAttribute('src') || '';\n\t\t\t},\n\t\t\tset: function setSrc(val) {\n\t\t\t\tself.setAttribute('src', val);\n\t\t\t\tloading = false; // just in case?\n\t\t\t\tprepForLoad(\"interactive\");\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement buffered property\n\t\t */\n\t\tObject.defineProperty(self, \"buffered\", {\n\t\t\tget: function getBuffered() {\n\t\t\t\tvar ranges;\n\t\t\t\tif (stream && byteLength && duration) {\n\t\t\t\t\tranges = stream.getBufferedRanges().map(function(range) {\n\t\t\t\t\t\treturn range.map(function(offset) {\n\t\t\t\t\t\t\treturn (offset / stream.length) * duration;\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tranges = [[0, 0]];\n\t\t\t\t}\n\t\t\t\treturn new OGVTimeRanges(ranges);\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement seekable property\n\t\t */\n\t\tObject.defineProperty(self, \"seekable\", {\n\t\t\tget: function getSeekable() {\n\t\t\t\tif (self.duration < Infinity && stream && stream.seekable && codec && codec.seekable) {\n\t\t\t\t\treturn new OGVTimeRanges([[0, duration]]);\n\t\t\t\t} else {\n\t\t\t\t\treturn new OGVTimeRanges([]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement currentTime property\n\t\t */\n\t\tObject.defineProperty(self, \"currentTime\", {\n\t\t\tget: function getCurrentTime() {\n\t\t\t\tif (state == State.SEEKING) {\n\t\t\t\t\treturn seekTargetTime;\n\t\t\t\t} else {\n\t\t\t\t\tif (codec) {\n\t\t\t\t\t\tif (state == State.PLAYING && !paused) {\n\t\t\t\t\t\t\treturn getPlaybackTime();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn initialPlaybackOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn initialSeekTime;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tset: function setCurrentTime(val) {\n\t\t\t\tseek(val, SeekMode.EXACT);\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement duration property\n\t\t */\n\t\tObject.defineProperty(self, \"duration\", {\n\t\t\tget: function getDuration() {\n\t\t\t\tif (codec && codec.loadedMetadata) {\n\t\t\t\t\tif (duration !== null) {\n\t\t\t\t\t\treturn duration;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn Infinity;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn NaN;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement paused property\n\t\t */\n\t\tObject.defineProperty(self, \"paused\", {\n\t\t\tget: function getPaused() {\n\t\t\t\treturn paused;\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement ended property\n\t\t */\n\t\tObject.defineProperty(self, \"ended\", {\n\t\t\tget: function getEnded() {\n\t\t\t\treturn ended;\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement ended property\n\t\t */\n\t\tObject.defineProperty(self, \"seeking\", {\n\t\t\tget: function getSeeking() {\n\t\t\t\treturn (state == State.SEEKING);\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * HTMLMediaElement muted property\n\t\t */\n\t\tObject.defineProperty(self, \"muted\", {\n\t\t\tget: function getMuted() {\n\t\t\t\treturn muted;\n\t\t\t},\n\t\t\tset: function setMuted(val) {\n\t\t\t\tmuted = val;\n\t\t\t\tif (audioFeeder) {\n\t\t\t\t\taudioFeeder.muted = muted;\n\t\t\t\t} else if (started && !muted && codec && codec.hasAudio) {\n\t\t\t\t\tlog('unmuting: switching from timer to audio clock');\n\t\t\t\t\tinitAudioFeeder();\n\t\t\t\t\tstartPlayback(audioEndTimestamp);\n\t\t\t\t}\n\t\t\t\tfireEventAsync('volumechange');\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, \"poster\", {\n\t\t\tget: function getPoster() {\n\t\t\t\treturn poster;\n\t\t\t},\n\t\t\tset: function setPoster(val) {\n\t\t\t\tposter = val;\n\t\t\t\tif (!started) {\n\t\t\t\t\tif (thumbnail) {\n\t\t\t\t\t\tself.removeChild(thumbnail);\n\t\t\t\t\t}\n\t\t\t\t\tthumbnail = new Image();\n\t\t\t\t\tthumbnail.src = poster;\n\t\t\t\t\tthumbnail.className = 'ogvjs-poster';\n\t\t\t\t\tthumbnail.style.position = 'absolute';\n\t\t\t\t\tthumbnail.style.top = '0';\n\t\t\t\t\tthumbnail.style.left = '0';\n\t\t\t\t\tthumbnail.style.width = '100%';\n\t\t\t\t\tthumbnail.style.height = '100%';\n\t\t\t\t\tthumbnail.style.objectFit = 'contain';\n\t\t\t\t\tthumbnail.style.visibility = 'hidden';\n\t\t\t\t\tthumbnail.addEventListener('load', function() {\n\t\t\t\t\t\tif (thumbnail === this) {\n\t\t\t\t\t\t\tOGVPlayer.styleManager.appendRule('.' + instanceId, {\n\t\t\t\t\t\t\t\twidth: thumbnail.naturalWidth + 'px',\n\t\t\t\t\t\t\t\theight: thumbnail.naturalHeight + 'px'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tOGVPlayer.updatePositionOnResize();\n\t\t\t\t\t\t\tthumbnail.style.visibility = 'visible';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tself.appendChild(thumbnail);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Video metadata properties...\n\t\tObject.defineProperty(self, \"videoWidth\", {\n\t\t\tget: function getVideoWidth() {\n\t\t\t\tif (videoInfo) {\n\t\t\t\t\treturn videoInfo.displayWidth;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(self, \"videoHeight\", {\n\t\t\tget: function getVideoHeight() {\n\t\t\t\tif (videoInfo) {\n\t\t\t\t\treturn videoInfo.displayHeight;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(self, \"ogvjsVideoFrameRate\", {\n\t\t\tget: function getOgvJsVideoFrameRate() {\n\t\t\t\tif (videoInfo) {\n\t\t\t\t\tif (videoInfo.fps == 0) {\n\t\t\t\t\t\treturn totalFrameCount / (totalFrameTime / 1000);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn videoInfo.fps;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Audio metadata properties...\n\t\tObject.defineProperty(self, \"ogvjsAudioChannels\", {\n\t\t\tget: function getOgvJsAudioChannels() {\n\t\t\t\tif (audioInfo) {\n\t\t\t\t\treturn audioInfo.channels;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(self, \"ogvjsAudioSampleRate\", {\n\t\t\tget: function getOgvJsAudioChannels() {\n\t\t\t\tif (audioInfo) {\n\t\t\t\t\treturn audioInfo.rate;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Display size...\n\t\tvar width = 0, height = 0;\n\t\t/**\n\t\t * @property width\n\t\t * @todo reflect to the width attribute?\n\t\t */\n\t\tObject.defineProperty(self, \"width\", {\n\t\t\tget: function getWidth() {\n\t\t\t\treturn width;\n\t\t\t},\n\t\t\tset: function setWidth(val) {\n\t\t\t\twidth = parseInt(val, 10);\n\t\t\t\tself.style.width = width + 'px';\n\t\t\t\tOGVPlayer.updatePositionOnResize();\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property height\n\t\t * @todo reflect to the height attribute?\n\t\t */\n\t\tObject.defineProperty(self, \"height\", {\n\t\t\tget: function getHeight() {\n\t\t\t\treturn height;\n\t\t\t},\n\t\t\tset: function setHeight(val) {\n\t\t\t\theight = parseInt(val, 10);\n\t\t\t\tself.style.height = height + 'px';\n\t\t\t\tOGVPlayer.updatePositionOnResize();\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property autoplay {boolean} stub prop\n\t\t * @todo reflect to the autoplay attribute?\n\t\t * @todo implement actual autoplay behavior\n\t\t */\n\t\tObject.defineProperty(self, \"autoplay\", {\n\t\t\tget: function getAutoplay() {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function setAutoplay(val) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property controls {boolean} stub prop\n\t\t * @todo reflect to the controls attribute?\n\t\t * @todo implement actual control behavior\n\t\t */\n\t\tObject.defineProperty(self, \"controls\", {\n\t\t\tget: function getControls() {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function setControls(val) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property loop {boolean} stub prop\n\t\t * @todo reflect to the controls attribute?\n\t\t * @todo implement actual loop behavior\n\t\t */\n\t\tObject.defineProperty(self, \"loop\", {\n\t\t\tget: function getLoop() {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function setLoop(val) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property crossOrigin {string|null} stub prop\n\t\t * @todo reflect to the crossorigin attribute?\n\t\t * @todo implement actual behavior\n\t\t */\n\t\tObject.defineProperty(self, \"crossOrigin\", {\n\t\t\tget: function getCrossOrigin() {\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\tset: function setCrossOrigin(val) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Returns the URL to the currently-playing resource.\n\t\t * @property currentSrc {string|null}\n\t\t */\n\t\tObject.defineProperty(self, \"currentSrc\", {\n\t\t\tget: function getCurrentSrc() {\n\t\t\t\t// @todo return absolute URL per spec\n\t\t\t\treturn currentSrc;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, \"defaultMuted\", {\n\t\t\tget: function getDefaultMuted() {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, \"defaultPlaybackRate\", {\n\t\t\tget: function getDefaultPlaybackRate() {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property error {string|null}\n\t\t * @todo implement\n\t\t */\n\t\tObject.defineProperty(self, \"error\", {\n\t\t\tget: function getError() {\n\t\t\t\tif (state === State.ERROR) {\n\t\t\t\t\tif (mediaError) {\n\t\t\t\t\t\treturn mediaError;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn new OGVMediaError(\"unknown error occurred in media procesing\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t/**\n\t \t * @property preload {string}\n\t\t */\n\t\tObject.defineProperty(self, \"preload\", {\n\t\t\tget: function getPreload() {\n\t\t\t\treturn self.getAttribute('preload') || '';\n\t\t\t},\n\t\t\tset: function setPreload(val) {\n\t\t\t\tself.setAttribute('preload', val);\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property readyState {number}\n\t\t * @todo return more accurate info about availability of data\n\t\t */\n\t\tObject.defineProperty(self, \"readyState\", {\n\t\t\tget: function getReadyState() {\n\t\t\t\tif (stream && codec && codec.loadedMetadata) {\n\t\t\t\t\t// for now we don't really calc this stuff\n\t\t\t\t\t// just pretend we have lots of data coming in already\n\t\t\t\t\treturn OGVPlayer.HAVE_ENOUGH_DATA;\n\t\t\t\t} else {\n\t\t\t\t\treturn OGVPlayer.HAVE_NOTHING;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property networkState {number}\n\t\t * @todo implement\n\t\t */\n\t\tObject.defineProperty(self, \"networkState\", {\n\t\t\tget: function getNetworkState() {\n\t\t\t\tif (stream) {\n\t\t\t\t\tif (stream.waiting) {\n\t\t\t\t\t\treturn OGVPlayer.NETWORK_LOADING;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn OGVPlayer.NETWORK_IDLE;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (self.readyState == OGVPlayer.HAVE_NOTHING) {\n\t\t\t\t\t\treturn OGVPlayer.NETWORK_EMPTY;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn OGVPlayer.NETWORK_NO_SOURCE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property playbackRate {number}\n\t\t * @todo implement\n\t\t */\n\t\tObject.defineProperty(self, \"playbackRate\", {\n\t\t\tget: function getPlaybackRate() {\n\t\t\t\treturn 1;\n\t\t\t},\n\t\t\tset: function setPlaybackRate(val) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * @property played {OGVTimeRanges}\n\t\t * @todo implement correctly more or less\n\t\t */\n\t\tObject.defineProperty(self, \"played\", {\n\t\t\tget: function getPlayed() {\n\t\t\t\treturn new OGVTimeRanges([[0, self.currentTime]]);\n\t\t\t}\n\t\t});\n\n\t\tvar _volume = 1;\n\n\t\t/**\n\t\t * @property volume {number}\n\t\t * @todo implement\n\t\t */\n\t\tObject.defineProperty(self, \"volume\", {\n\t\t\tget: function getVolume() {\n\t\t\t\treturn _volume;\n\t\t\t},\n\t\t\tset: function setVolume(val) {\n\t\t\t\t_volume = +val;\n\t\t\t\tif (audioFeeder) {\n\t\t\t\t\taudioFeeder.volume = _volume;\n\t\t\t\t}\n\t\t\t\tfireEventAsync('volumechange');\n\t\t\t}\n\t\t});\n\n\n\t\t// Events!\n\n\t\t/**\n\t\t * custom onframecallback, takes frame decode time in ms\n\t\t */\n\t\tself.onframecallback = null;\n\n\t\t/**\n\t\t * Network state events\n\t\t * @todo implement\n\t\t */\n\t\tself.onloadstate = null;\n\t\tself.onprogress = null;\n\t\tself.onsuspend = null;\n\t\tself.onabort = null;\n\t\tself.onemptied = null;\n\t\tself.onstalled = null;\n\n\t\t/**\n\t\t * Called when all metadata is available.\n\t\t * Note in theory we must know 'duration' at this point.\n\t\t */\n\t\tself.onloadedmetadata = null;\n\n\t\t/**\n\t\t * Called when enough data for first frame is ready.\n\t\t * @todo implement\n\t\t */\n\t\tself.onloadeddata = null;\n\n\t\t/**\n\t\t * Called when enough data is ready to start some playback.\n\t\t * @todo implement\n\t\t */\n\t\tself.oncanplay = null;\n\n\t\t/**\n\t\t * Called when enough data is ready to play through to the\n\t\t * end if no surprises in network download rate.\n\t\t * @todo implement\n\t\t */\n\t\tself.oncanplaythrough = null;\n\n\t\t/**\n\t\t * Called when playback continues after a stall\n\t\t * @todo implement\n\t\t */\n\t\tself.onplaying = null;\n\n\t\t/**\n\t\t * Called when playback is delayed waiting on data\n\t\t * @todo implement\n\t\t */\n\t\tself.onwaiting = null;\n\n\t\t/**\n\t\t * Called when seeking begins\n\t\t * @todo implement\n\t\t */\n\t\tself.onseeking = null;\n\n\t\t/**\n\t\t * Called when seeking ends\n\t\t * @todo implement\n\t\t */\n\t\tself.onseeked = null;\n\n\t\t/**\n\t\t * Called when playback ends\n\t\t */\n\t\tself.onended = null;\n\n\t\t/**\n\t\t * Called when duration becomes known\n\t\t * @todo implement\n\t\t */\n\t\tself.ondurationchange = null;\n\n\t\t/**\n\t\t * Called periodically during playback\n\t\t */\n\t\tself.ontimeupdate = null;\n\n\t\t/**\n\t\t * Called when we start playback\n\t\t */\n\t\tself.onplay = null;\n\n\t\t/**\n\t\t * Called when we get paused\n\t\t */\n\t\tself.onpause = null;\n\n\t\t/**\n\t\t * Called when the playback rate changes\n\t\t * @todo implement\n\t\t */\n\t\tself.onratechange = null;\n\n\t\t/**\n\t\t * Called when the size of the video stream changes\n\t\t * @todo implement\n\t\t */\n\t\tself.onresize = null;\n\n\t\t/**\n\t\t * Called when the volume setting changes\n\t\t * @todo implement\n\t\t */\n\t\tself.onvolumechange = null;\n\n\t\treturn self;\n\t};\n\n\tOGVPlayer.initSharedAudioContext = function() {\n\t\tAudioFeeder.initSharedAudioContext();\n\t};\n\n\t/**\n\t * Set up constants on the class and instances\n\t */\n\tvar constants = {\n\t\t/**\n\t\t * Constants for networkState\n\t\t */\n\t\tNETWORK_EMPTY: 0,\n\t\tNETWORK_IDLE: 1,\n\t\tNETWORK_LOADING: 2,\n\t\tNETWORK_NO_SOURCE: 3,\n\n\t\t/**\n\t\t * Constants for readyState\n\t\t */\n\t\tHAVE_NOTHING: 0,\n\t\tHAVE_METADATA: 1,\n\t\tHAVE_CURRENT_DATA: 2,\n\t\tHAVE_FUTURE_DATA: 3,\n\t\tHAVE_ENOUGH_DATA: 4\n\t};\n\textend(OGVPlayer, constants);\n\n\tOGVPlayer.instanceCount = 0;\n\n\tfunction StyleManager() {\n\t\tvar self = this;\n\t\tvar el = document.createElement('style');\n\t\tel.type = 'text/css';\n\t\tel.textContent = 'ogvjs { ' +\n\t\t\t'display: inline-block; ' +\n\t\t\t'position: relative; ' +\n\t\t\t'-webkit-user-select: none; ' +\n\t\t\t'-webkit-tap-highlight-color: rgba(0,0,0,0); '\n\t\t\t'}';\n\t\tdocument.head.appendChild(el);\n\n\t\tvar sheet = el.sheet;\n\n\t\tself.appendRule = function(selector, defs) {\n\t\t\tvar bits = [];\n\t\t\tfor (var prop in defs) {\n\t\t\t\tif (defs.hasOwnProperty(prop)) {\n\t\t\t\t\tbits.push(prop + ':' + defs[prop]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar rule = selector + '{' + bits.join(';') + '}';\n\t\t\tsheet.insertRule(rule, sheet.cssRules.length - 1);\n\t\t};\n\t}\n\tOGVPlayer.styleManager = new StyleManager();\n\n\t// IE 10/11 and Edge 12 don't support object-fit.\n\t// Also just for fun, IE 10 doesn't support 'auto' sizing on canvas. o_O\n\tOGVPlayer.supportsObjectFit = (typeof document.createElement('div').style.objectFit === 'string');\n\tif (OGVPlayer.supportsObjectFit && navigator.userAgent.match(/iPhone|iPad|iPod Touch/)) {\n\t\t// Safari for iOS 8/9 supports it but positions our <canvas> incorrectly when using WebGL >:(\n\t\tOGVPlayer.supportsObjectFit = false;\n\t}\n\tif (OGVPlayer.supportsObjectFit) {\n\t\tOGVPlayer.updatePositionOnResize = function() {\n\t\t\t// no-op\n\t\t};\n\t} else {\n\t\tOGVPlayer.updatePositionOnResize = function() {\n\t\t\tfunction fixup(el, width, height) {\n\t\t\t\tvar container = el.offsetParent || el.parentNode,\n\t\t\t\t\tcontainerAspect = container.offsetWidth / container.offsetHeight,\n\t\t\t\t\tintrinsicAspect = width / height;\n\t\t\t\tif (intrinsicAspect > containerAspect) {\n\t\t\t\t\tvar vsize = container.offsetWidth / intrinsicAspect,\n\t\t\t\t\t\tvpad = (container.offsetHeight - vsize) / 2;\n\t\t\t\t\tel.style.width = '100%';\n\t\t\t\t\tel.style.height = vsize + 'px';\n\t\t\t\t\tel.style.marginLeft = 0;\n\t\t\t\t\tel.style.marginRight = 0;\n\t\t\t\t\tel.style.marginTop = vpad + 'px';\n\t\t\t\t\tel.style.marginBottom = vpad + 'px';\n\t\t\t\t} else {\n\t\t\t\t\tvar hsize = container.offsetHeight * intrinsicAspect,\n\t\t\t\t\t\thpad = (container.offsetWidth - hsize) / 2;\n\t\t\t\t\tel.style.width = hsize + 'px';\n\t\t\t\t\tel.style.height = '100%';\n\t\t\t\t\tel.style.marginLeft = hpad + 'px';\n\t\t\t\t\tel.style.marginRight = hpad + 'px';\n\t\t\t\t\tel.style.marginTop = 0;\n\t\t\t\t\tel.style.marginBottom = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction queryOver(selector, callback) {\n\t\t\t\tvar nodeList = document.querySelectorAll(selector),\n\t\t\t\t\tnodeArray = Array.prototype.slice.call(nodeList);\n\t\t\t\tnodeArray.forEach(callback);\n\t\t\t}\n\n\t\t\tqueryOver('ogvjs > canvas', function(canvas) {\n\t\t\t\tfixup(canvas, canvas.width, canvas.height);\n\t\t\t});\n\t\t\tqueryOver('ogvjs > img', function(poster) {\n\t\t\t\tfixup(poster, poster.naturalWidth, poster.naturalHeight);\n\t\t\t});\n\t\t};\n\t\tvar fullResizeVideo = function() {\n\t\t\t// fullscreens may ping us before the resize happens\n\t\t\tsetTimeout(OGVPlayer.updatePositionOnResize, 0);\n\t\t};\n\n\t\twindow.addEventListener('resize', OGVPlayer.updatePositionOnResize);\n\t\twindow.addEventListener('orientationchange', OGVPlayer.updatePositionOnResize);\n\n\t\tdocument.addEventListener('fullscreenchange', fullResizeVideo);\n\t\tdocument.addEventListener('mozfullscreenchange', fullResizeVideo);\n\t\tdocument.addEventListener('webkitfullscreenchange', fullResizeVideo);\n\t\tdocument.addEventListener('MSFullscreenChange', fullResizeVideo);\n\t}\n\n\tmodule.exports = OGVPlayer;\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar require;/* WEBPACK VAR INJECTION */(function(process, global) {/*!\n\t * @overview es6-promise - a tiny implementation of Promises/A+.\n\t * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n\t * @license   Licensed under MIT license\n\t *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n\t * @version   4.1.0\n\t */\n\n\t(function (global, factory) {\n\t     true ? module.exports = factory() :\n\t    typeof define === 'function' && define.amd ? define(factory) :\n\t    (global.ES6Promise = factory());\n\t}(this, (function () { 'use strict';\n\n\tfunction objectOrFunction(x) {\n\t  return typeof x === 'function' || typeof x === 'object' && x !== null;\n\t}\n\n\tfunction isFunction(x) {\n\t  return typeof x === 'function';\n\t}\n\n\tvar _isArray = undefined;\n\tif (!Array.isArray) {\n\t  _isArray = function (x) {\n\t    return Object.prototype.toString.call(x) === '[object Array]';\n\t  };\n\t} else {\n\t  _isArray = Array.isArray;\n\t}\n\n\tvar isArray = _isArray;\n\n\tvar len = 0;\n\tvar vertxNext = undefined;\n\tvar customSchedulerFn = undefined;\n\n\tvar asap = function asap(callback, arg) {\n\t  queue[len] = callback;\n\t  queue[len + 1] = arg;\n\t  len += 2;\n\t  if (len === 2) {\n\t    // If len is 2, that means that we need to schedule an async flush.\n\t    // If additional callbacks are queued before the queue is flushed, they\n\t    // will be processed by this flush that we are scheduling.\n\t    if (customSchedulerFn) {\n\t      customSchedulerFn(flush);\n\t    } else {\n\t      scheduleFlush();\n\t    }\n\t  }\n\t};\n\n\tfunction setScheduler(scheduleFn) {\n\t  customSchedulerFn = scheduleFn;\n\t}\n\n\tfunction setAsap(asapFn) {\n\t  asap = asapFn;\n\t}\n\n\tvar browserWindow = typeof window !== 'undefined' ? window : undefined;\n\tvar browserGlobal = browserWindow || {};\n\tvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n\tvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n\t// test for web worker but not in IE10\n\tvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n\t// node\n\tfunction useNextTick() {\n\t  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n\t  // see https://github.com/cujojs/when/issues/410 for details\n\t  return function () {\n\t    return process.nextTick(flush);\n\t  };\n\t}\n\n\t// vertx\n\tfunction useVertxTimer() {\n\t  if (typeof vertxNext !== 'undefined') {\n\t    return function () {\n\t      vertxNext(flush);\n\t    };\n\t  }\n\n\t  return useSetTimeout();\n\t}\n\n\tfunction useMutationObserver() {\n\t  var iterations = 0;\n\t  var observer = new BrowserMutationObserver(flush);\n\t  var node = document.createTextNode('');\n\t  observer.observe(node, { characterData: true });\n\n\t  return function () {\n\t    node.data = iterations = ++iterations % 2;\n\t  };\n\t}\n\n\t// web worker\n\tfunction useMessageChannel() {\n\t  var channel = new MessageChannel();\n\t  channel.port1.onmessage = flush;\n\t  return function () {\n\t    return channel.port2.postMessage(0);\n\t  };\n\t}\n\n\tfunction useSetTimeout() {\n\t  // Store setTimeout reference so es6-promise will be unaffected by\n\t  // other code modifying setTimeout (like sinon.useFakeTimers())\n\t  var globalSetTimeout = setTimeout;\n\t  return function () {\n\t    return globalSetTimeout(flush, 1);\n\t  };\n\t}\n\n\tvar queue = new Array(1000);\n\tfunction flush() {\n\t  for (var i = 0; i < len; i += 2) {\n\t    var callback = queue[i];\n\t    var arg = queue[i + 1];\n\n\t    callback(arg);\n\n\t    queue[i] = undefined;\n\t    queue[i + 1] = undefined;\n\t  }\n\n\t  len = 0;\n\t}\n\n\tfunction attemptVertx() {\n\t  try {\n\t    var r = require;\n\t    var vertx = __webpack_require__(11);\n\t    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n\t    return useVertxTimer();\n\t  } catch (e) {\n\t    return useSetTimeout();\n\t  }\n\t}\n\n\tvar scheduleFlush = undefined;\n\t// Decide what async method to use to triggering processing of queued callbacks:\n\tif (isNode) {\n\t  scheduleFlush = useNextTick();\n\t} else if (BrowserMutationObserver) {\n\t  scheduleFlush = useMutationObserver();\n\t} else if (isWorker) {\n\t  scheduleFlush = useMessageChannel();\n\t} else if (browserWindow === undefined && \"function\" === 'function') {\n\t  scheduleFlush = attemptVertx();\n\t} else {\n\t  scheduleFlush = useSetTimeout();\n\t}\n\n\tfunction then(onFulfillment, onRejection) {\n\t  var _arguments = arguments;\n\n\t  var parent = this;\n\n\t  var child = new this.constructor(noop);\n\n\t  if (child[PROMISE_ID] === undefined) {\n\t    makePromise(child);\n\t  }\n\n\t  var _state = parent._state;\n\n\t  if (_state) {\n\t    (function () {\n\t      var callback = _arguments[_state - 1];\n\t      asap(function () {\n\t        return invokeCallback(_state, child, callback, parent._result);\n\t      });\n\t    })();\n\t  } else {\n\t    subscribe(parent, child, onFulfillment, onRejection);\n\t  }\n\n\t  return child;\n\t}\n\n\t/**\n\t  `Promise.resolve` returns a promise that will become resolved with the\n\t  passed `value`. It is shorthand for the following:\n\n\t  ```javascript\n\t  let promise = new Promise(function(resolve, reject){\n\t    resolve(1);\n\t  });\n\n\t  promise.then(function(value){\n\t    // value === 1\n\t  });\n\t  ```\n\n\t  Instead of writing the above, your code now simply becomes the following:\n\n\t  ```javascript\n\t  let promise = Promise.resolve(1);\n\n\t  promise.then(function(value){\n\t    // value === 1\n\t  });\n\t  ```\n\n\t  @method resolve\n\t  @static\n\t  @param {Any} value value that the returned promise will be resolved with\n\t  Useful for tooling.\n\t  @return {Promise} a promise that will become fulfilled with the given\n\t  `value`\n\t*/\n\tfunction resolve(object) {\n\t  /*jshint validthis:true */\n\t  var Constructor = this;\n\n\t  if (object && typeof object === 'object' && object.constructor === Constructor) {\n\t    return object;\n\t  }\n\n\t  var promise = new Constructor(noop);\n\t  _resolve(promise, object);\n\t  return promise;\n\t}\n\n\tvar PROMISE_ID = Math.random().toString(36).substring(16);\n\n\tfunction noop() {}\n\n\tvar PENDING = void 0;\n\tvar FULFILLED = 1;\n\tvar REJECTED = 2;\n\n\tvar GET_THEN_ERROR = new ErrorObject();\n\n\tfunction selfFulfillment() {\n\t  return new TypeError(\"You cannot resolve a promise with itself\");\n\t}\n\n\tfunction cannotReturnOwn() {\n\t  return new TypeError('A promises callback cannot return that same promise.');\n\t}\n\n\tfunction getThen(promise) {\n\t  try {\n\t    return promise.then;\n\t  } catch (error) {\n\t    GET_THEN_ERROR.error = error;\n\t    return GET_THEN_ERROR;\n\t  }\n\t}\n\n\tfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n\t  try {\n\t    then.call(value, fulfillmentHandler, rejectionHandler);\n\t  } catch (e) {\n\t    return e;\n\t  }\n\t}\n\n\tfunction handleForeignThenable(promise, thenable, then) {\n\t  asap(function (promise) {\n\t    var sealed = false;\n\t    var error = tryThen(then, thenable, function (value) {\n\t      if (sealed) {\n\t        return;\n\t      }\n\t      sealed = true;\n\t      if (thenable !== value) {\n\t        _resolve(promise, value);\n\t      } else {\n\t        fulfill(promise, value);\n\t      }\n\t    }, function (reason) {\n\t      if (sealed) {\n\t        return;\n\t      }\n\t      sealed = true;\n\n\t      _reject(promise, reason);\n\t    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n\t    if (!sealed && error) {\n\t      sealed = true;\n\t      _reject(promise, error);\n\t    }\n\t  }, promise);\n\t}\n\n\tfunction handleOwnThenable(promise, thenable) {\n\t  if (thenable._state === FULFILLED) {\n\t    fulfill(promise, thenable._result);\n\t  } else if (thenable._state === REJECTED) {\n\t    _reject(promise, thenable._result);\n\t  } else {\n\t    subscribe(thenable, undefined, function (value) {\n\t      return _resolve(promise, value);\n\t    }, function (reason) {\n\t      return _reject(promise, reason);\n\t    });\n\t  }\n\t}\n\n\tfunction handleMaybeThenable(promise, maybeThenable, then$$) {\n\t  if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) {\n\t    handleOwnThenable(promise, maybeThenable);\n\t  } else {\n\t    if (then$$ === GET_THEN_ERROR) {\n\t      _reject(promise, GET_THEN_ERROR.error);\n\t      GET_THEN_ERROR.error = null;\n\t    } else if (then$$ === undefined) {\n\t      fulfill(promise, maybeThenable);\n\t    } else if (isFunction(then$$)) {\n\t      handleForeignThenable(promise, maybeThenable, then$$);\n\t    } else {\n\t      fulfill(promise, maybeThenable);\n\t    }\n\t  }\n\t}\n\n\tfunction _resolve(promise, value) {\n\t  if (promise === value) {\n\t    _reject(promise, selfFulfillment());\n\t  } else if (objectOrFunction(value)) {\n\t    handleMaybeThenable(promise, value, getThen(value));\n\t  } else {\n\t    fulfill(promise, value);\n\t  }\n\t}\n\n\tfunction publishRejection(promise) {\n\t  if (promise._onerror) {\n\t    promise._onerror(promise._result);\n\t  }\n\n\t  publish(promise);\n\t}\n\n\tfunction fulfill(promise, value) {\n\t  if (promise._state !== PENDING) {\n\t    return;\n\t  }\n\n\t  promise._result = value;\n\t  promise._state = FULFILLED;\n\n\t  if (promise._subscribers.length !== 0) {\n\t    asap(publish, promise);\n\t  }\n\t}\n\n\tfunction _reject(promise, reason) {\n\t  if (promise._state !== PENDING) {\n\t    return;\n\t  }\n\t  promise._state = REJECTED;\n\t  promise._result = reason;\n\n\t  asap(publishRejection, promise);\n\t}\n\n\tfunction subscribe(parent, child, onFulfillment, onRejection) {\n\t  var _subscribers = parent._subscribers;\n\t  var length = _subscribers.length;\n\n\t  parent._onerror = null;\n\n\t  _subscribers[length] = child;\n\t  _subscribers[length + FULFILLED] = onFulfillment;\n\t  _subscribers[length + REJECTED] = onRejection;\n\n\t  if (length === 0 && parent._state) {\n\t    asap(publish, parent);\n\t  }\n\t}\n\n\tfunction publish(promise) {\n\t  var subscribers = promise._subscribers;\n\t  var settled = promise._state;\n\n\t  if (subscribers.length === 0) {\n\t    return;\n\t  }\n\n\t  var child = undefined,\n\t      callback = undefined,\n\t      detail = promise._result;\n\n\t  for (var i = 0; i < subscribers.length; i += 3) {\n\t    child = subscribers[i];\n\t    callback = subscribers[i + settled];\n\n\t    if (child) {\n\t      invokeCallback(settled, child, callback, detail);\n\t    } else {\n\t      callback(detail);\n\t    }\n\t  }\n\n\t  promise._subscribers.length = 0;\n\t}\n\n\tfunction ErrorObject() {\n\t  this.error = null;\n\t}\n\n\tvar TRY_CATCH_ERROR = new ErrorObject();\n\n\tfunction tryCatch(callback, detail) {\n\t  try {\n\t    return callback(detail);\n\t  } catch (e) {\n\t    TRY_CATCH_ERROR.error = e;\n\t    return TRY_CATCH_ERROR;\n\t  }\n\t}\n\n\tfunction invokeCallback(settled, promise, callback, detail) {\n\t  var hasCallback = isFunction(callback),\n\t      value = undefined,\n\t      error = undefined,\n\t      succeeded = undefined,\n\t      failed = undefined;\n\n\t  if (hasCallback) {\n\t    value = tryCatch(callback, detail);\n\n\t    if (value === TRY_CATCH_ERROR) {\n\t      failed = true;\n\t      error = value.error;\n\t      value.error = null;\n\t    } else {\n\t      succeeded = true;\n\t    }\n\n\t    if (promise === value) {\n\t      _reject(promise, cannotReturnOwn());\n\t      return;\n\t    }\n\t  } else {\n\t    value = detail;\n\t    succeeded = true;\n\t  }\n\n\t  if (promise._state !== PENDING) {\n\t    // noop\n\t  } else if (hasCallback && succeeded) {\n\t      _resolve(promise, value);\n\t    } else if (failed) {\n\t      _reject(promise, error);\n\t    } else if (settled === FULFILLED) {\n\t      fulfill(promise, value);\n\t    } else if (settled === REJECTED) {\n\t      _reject(promise, value);\n\t    }\n\t}\n\n\tfunction initializePromise(promise, resolver) {\n\t  try {\n\t    resolver(function resolvePromise(value) {\n\t      _resolve(promise, value);\n\t    }, function rejectPromise(reason) {\n\t      _reject(promise, reason);\n\t    });\n\t  } catch (e) {\n\t    _reject(promise, e);\n\t  }\n\t}\n\n\tvar id = 0;\n\tfunction nextId() {\n\t  return id++;\n\t}\n\n\tfunction makePromise(promise) {\n\t  promise[PROMISE_ID] = id++;\n\t  promise._state = undefined;\n\t  promise._result = undefined;\n\t  promise._subscribers = [];\n\t}\n\n\tfunction Enumerator(Constructor, input) {\n\t  this._instanceConstructor = Constructor;\n\t  this.promise = new Constructor(noop);\n\n\t  if (!this.promise[PROMISE_ID]) {\n\t    makePromise(this.promise);\n\t  }\n\n\t  if (isArray(input)) {\n\t    this._input = input;\n\t    this.length = input.length;\n\t    this._remaining = input.length;\n\n\t    this._result = new Array(this.length);\n\n\t    if (this.length === 0) {\n\t      fulfill(this.promise, this._result);\n\t    } else {\n\t      this.length = this.length || 0;\n\t      this._enumerate();\n\t      if (this._remaining === 0) {\n\t        fulfill(this.promise, this._result);\n\t      }\n\t    }\n\t  } else {\n\t    _reject(this.promise, validationError());\n\t  }\n\t}\n\n\tfunction validationError() {\n\t  return new Error('Array Methods must be provided an Array');\n\t};\n\n\tEnumerator.prototype._enumerate = function () {\n\t  var length = this.length;\n\t  var _input = this._input;\n\n\t  for (var i = 0; this._state === PENDING && i < length; i++) {\n\t    this._eachEntry(_input[i], i);\n\t  }\n\t};\n\n\tEnumerator.prototype._eachEntry = function (entry, i) {\n\t  var c = this._instanceConstructor;\n\t  var resolve$$ = c.resolve;\n\n\t  if (resolve$$ === resolve) {\n\t    var _then = getThen(entry);\n\n\t    if (_then === then && entry._state !== PENDING) {\n\t      this._settledAt(entry._state, i, entry._result);\n\t    } else if (typeof _then !== 'function') {\n\t      this._remaining--;\n\t      this._result[i] = entry;\n\t    } else if (c === Promise) {\n\t      var promise = new c(noop);\n\t      handleMaybeThenable(promise, entry, _then);\n\t      this._willSettleAt(promise, i);\n\t    } else {\n\t      this._willSettleAt(new c(function (resolve$$) {\n\t        return resolve$$(entry);\n\t      }), i);\n\t    }\n\t  } else {\n\t    this._willSettleAt(resolve$$(entry), i);\n\t  }\n\t};\n\n\tEnumerator.prototype._settledAt = function (state, i, value) {\n\t  var promise = this.promise;\n\n\t  if (promise._state === PENDING) {\n\t    this._remaining--;\n\n\t    if (state === REJECTED) {\n\t      _reject(promise, value);\n\t    } else {\n\t      this._result[i] = value;\n\t    }\n\t  }\n\n\t  if (this._remaining === 0) {\n\t    fulfill(promise, this._result);\n\t  }\n\t};\n\n\tEnumerator.prototype._willSettleAt = function (promise, i) {\n\t  var enumerator = this;\n\n\t  subscribe(promise, undefined, function (value) {\n\t    return enumerator._settledAt(FULFILLED, i, value);\n\t  }, function (reason) {\n\t    return enumerator._settledAt(REJECTED, i, reason);\n\t  });\n\t};\n\n\t/**\n\t  `Promise.all` accepts an array of promises, and returns a new promise which\n\t  is fulfilled with an array of fulfillment values for the passed promises, or\n\t  rejected with the reason of the first passed promise to be rejected. It casts all\n\t  elements of the passed iterable to promises as it runs this algorithm.\n\n\t  Example:\n\n\t  ```javascript\n\t  let promise1 = resolve(1);\n\t  let promise2 = resolve(2);\n\t  let promise3 = resolve(3);\n\t  let promises = [ promise1, promise2, promise3 ];\n\n\t  Promise.all(promises).then(function(array){\n\t    // The array here would be [ 1, 2, 3 ];\n\t  });\n\t  ```\n\n\t  If any of the `promises` given to `all` are rejected, the first promise\n\t  that is rejected will be given as an argument to the returned promises's\n\t  rejection handler. For example:\n\n\t  Example:\n\n\t  ```javascript\n\t  let promise1 = resolve(1);\n\t  let promise2 = reject(new Error(\"2\"));\n\t  let promise3 = reject(new Error(\"3\"));\n\t  let promises = [ promise1, promise2, promise3 ];\n\n\t  Promise.all(promises).then(function(array){\n\t    // Code here never runs because there are rejected promises!\n\t  }, function(error) {\n\t    // error.message === \"2\"\n\t  });\n\t  ```\n\n\t  @method all\n\t  @static\n\t  @param {Array} entries array of promises\n\t  @param {String} label optional string for labeling the promise.\n\t  Useful for tooling.\n\t  @return {Promise} promise that is fulfilled when all `promises` have been\n\t  fulfilled, or rejected if any of them become rejected.\n\t  @static\n\t*/\n\tfunction all(entries) {\n\t  return new Enumerator(this, entries).promise;\n\t}\n\n\t/**\n\t  `Promise.race` returns a new promise which is settled in the same way as the\n\t  first passed promise to settle.\n\n\t  Example:\n\n\t  ```javascript\n\t  let promise1 = new Promise(function(resolve, reject){\n\t    setTimeout(function(){\n\t      resolve('promise 1');\n\t    }, 200);\n\t  });\n\n\t  let promise2 = new Promise(function(resolve, reject){\n\t    setTimeout(function(){\n\t      resolve('promise 2');\n\t    }, 100);\n\t  });\n\n\t  Promise.race([promise1, promise2]).then(function(result){\n\t    // result === 'promise 2' because it was resolved before promise1\n\t    // was resolved.\n\t  });\n\t  ```\n\n\t  `Promise.race` is deterministic in that only the state of the first\n\t  settled promise matters. For example, even if other promises given to the\n\t  `promises` array argument are resolved, but the first settled promise has\n\t  become rejected before the other promises became fulfilled, the returned\n\t  promise will become rejected:\n\n\t  ```javascript\n\t  let promise1 = new Promise(function(resolve, reject){\n\t    setTimeout(function(){\n\t      resolve('promise 1');\n\t    }, 200);\n\t  });\n\n\t  let promise2 = new Promise(function(resolve, reject){\n\t    setTimeout(function(){\n\t      reject(new Error('promise 2'));\n\t    }, 100);\n\t  });\n\n\t  Promise.race([promise1, promise2]).then(function(result){\n\t    // Code here never runs\n\t  }, function(reason){\n\t    // reason.message === 'promise 2' because promise 2 became rejected before\n\t    // promise 1 became fulfilled\n\t  });\n\t  ```\n\n\t  An example real-world use case is implementing timeouts:\n\n\t  ```javascript\n\t  Promise.race([ajax('foo.json'), timeout(5000)])\n\t  ```\n\n\t  @method race\n\t  @static\n\t  @param {Array} promises array of promises to observe\n\t  Useful for tooling.\n\t  @return {Promise} a promise which settles in the same way as the first passed\n\t  promise to settle.\n\t*/\n\tfunction race(entries) {\n\t  /*jshint validthis:true */\n\t  var Constructor = this;\n\n\t  if (!isArray(entries)) {\n\t    return new Constructor(function (_, reject) {\n\t      return reject(new TypeError('You must pass an array to race.'));\n\t    });\n\t  } else {\n\t    return new Constructor(function (resolve, reject) {\n\t      var length = entries.length;\n\t      for (var i = 0; i < length; i++) {\n\t        Constructor.resolve(entries[i]).then(resolve, reject);\n\t      }\n\t    });\n\t  }\n\t}\n\n\t/**\n\t  `Promise.reject` returns a promise rejected with the passed `reason`.\n\t  It is shorthand for the following:\n\n\t  ```javascript\n\t  let promise = new Promise(function(resolve, reject){\n\t    reject(new Error('WHOOPS'));\n\t  });\n\n\t  promise.then(function(value){\n\t    // Code here doesn't run because the promise is rejected!\n\t  }, function(reason){\n\t    // reason.message === 'WHOOPS'\n\t  });\n\t  ```\n\n\t  Instead of writing the above, your code now simply becomes the following:\n\n\t  ```javascript\n\t  let promise = Promise.reject(new Error('WHOOPS'));\n\n\t  promise.then(function(value){\n\t    // Code here doesn't run because the promise is rejected!\n\t  }, function(reason){\n\t    // reason.message === 'WHOOPS'\n\t  });\n\t  ```\n\n\t  @method reject\n\t  @static\n\t  @param {Any} reason value that the returned promise will be rejected with.\n\t  Useful for tooling.\n\t  @return {Promise} a promise rejected with the given `reason`.\n\t*/\n\tfunction reject(reason) {\n\t  /*jshint validthis:true */\n\t  var Constructor = this;\n\t  var promise = new Constructor(noop);\n\t  _reject(promise, reason);\n\t  return promise;\n\t}\n\n\tfunction needsResolver() {\n\t  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n\t}\n\n\tfunction needsNew() {\n\t  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n\t}\n\n\t/**\n\t  Promise objects represent the eventual result of an asynchronous operation. The\n\t  primary way of interacting with a promise is through its `then` method, which\n\t  registers callbacks to receive either a promise's eventual value or the reason\n\t  why the promise cannot be fulfilled.\n\n\t  Terminology\n\t  -----------\n\n\t  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n\t  - `thenable` is an object or function that defines a `then` method.\n\t  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n\t  - `exception` is a value that is thrown using the throw statement.\n\t  - `reason` is a value that indicates why a promise was rejected.\n\t  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n\t  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n\t  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n\t  state.  Promises that are rejected have a rejection reason and are in the\n\t  rejected state.  A fulfillment value is never a thenable.\n\n\t  Promises can also be said to *resolve* a value.  If this value is also a\n\t  promise, then the original promise's settled state will match the value's\n\t  settled state.  So a promise that *resolves* a promise that rejects will\n\t  itself reject, and a promise that *resolves* a promise that fulfills will\n\t  itself fulfill.\n\n\n\t  Basic Usage:\n\t  ------------\n\n\t  ```js\n\t  let promise = new Promise(function(resolve, reject) {\n\t    // on success\n\t    resolve(value);\n\n\t    // on failure\n\t    reject(reason);\n\t  });\n\n\t  promise.then(function(value) {\n\t    // on fulfillment\n\t  }, function(reason) {\n\t    // on rejection\n\t  });\n\t  ```\n\n\t  Advanced Usage:\n\t  ---------------\n\n\t  Promises shine when abstracting away asynchronous interactions such as\n\t  `XMLHttpRequest`s.\n\n\t  ```js\n\t  function getJSON(url) {\n\t    return new Promise(function(resolve, reject){\n\t      let xhr = new XMLHttpRequest();\n\n\t      xhr.open('GET', url);\n\t      xhr.onreadystatechange = handler;\n\t      xhr.responseType = 'json';\n\t      xhr.setRequestHeader('Accept', 'application/json');\n\t      xhr.send();\n\n\t      function handler() {\n\t        if (this.readyState === this.DONE) {\n\t          if (this.status === 200) {\n\t            resolve(this.response);\n\t          } else {\n\t            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n\t          }\n\t        }\n\t      };\n\t    });\n\t  }\n\n\t  getJSON('/posts.json').then(function(json) {\n\t    // on fulfillment\n\t  }, function(reason) {\n\t    // on rejection\n\t  });\n\t  ```\n\n\t  Unlike callbacks, promises are great composable primitives.\n\n\t  ```js\n\t  Promise.all([\n\t    getJSON('/posts'),\n\t    getJSON('/comments')\n\t  ]).then(function(values){\n\t    values[0] // => postsJSON\n\t    values[1] // => commentsJSON\n\n\t    return values;\n\t  });\n\t  ```\n\n\t  @class Promise\n\t  @param {function} resolver\n\t  Useful for tooling.\n\t  @constructor\n\t*/\n\tfunction Promise(resolver) {\n\t  this[PROMISE_ID] = nextId();\n\t  this._result = this._state = undefined;\n\t  this._subscribers = [];\n\n\t  if (noop !== resolver) {\n\t    typeof resolver !== 'function' && needsResolver();\n\t    this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n\t  }\n\t}\n\n\tPromise.all = all;\n\tPromise.race = race;\n\tPromise.resolve = resolve;\n\tPromise.reject = reject;\n\tPromise._setScheduler = setScheduler;\n\tPromise._setAsap = setAsap;\n\tPromise._asap = asap;\n\n\tPromise.prototype = {\n\t  constructor: Promise,\n\n\t  /**\n\t    The primary way of interacting with a promise is through its `then` method,\n\t    which registers callbacks to receive either a promise's eventual value or the\n\t    reason why the promise cannot be fulfilled.\n\t  \n\t    ```js\n\t    findUser().then(function(user){\n\t      // user is available\n\t    }, function(reason){\n\t      // user is unavailable, and you are given the reason why\n\t    });\n\t    ```\n\t  \n\t    Chaining\n\t    --------\n\t  \n\t    The return value of `then` is itself a promise.  This second, 'downstream'\n\t    promise is resolved with the return value of the first promise's fulfillment\n\t    or rejection handler, or rejected if the handler throws an exception.\n\t  \n\t    ```js\n\t    findUser().then(function (user) {\n\t      return user.name;\n\t    }, function (reason) {\n\t      return 'default name';\n\t    }).then(function (userName) {\n\t      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n\t      // will be `'default name'`\n\t    });\n\t  \n\t    findUser().then(function (user) {\n\t      throw new Error('Found user, but still unhappy');\n\t    }, function (reason) {\n\t      throw new Error('`findUser` rejected and we're unhappy');\n\t    }).then(function (value) {\n\t      // never reached\n\t    }, function (reason) {\n\t      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n\t      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n\t    });\n\t    ```\n\t    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\t  \n\t    ```js\n\t    findUser().then(function (user) {\n\t      throw new PedagogicalException('Upstream error');\n\t    }).then(function (value) {\n\t      // never reached\n\t    }).then(function (value) {\n\t      // never reached\n\t    }, function (reason) {\n\t      // The `PedgagocialException` is propagated all the way down to here\n\t    });\n\t    ```\n\t  \n\t    Assimilation\n\t    ------------\n\t  \n\t    Sometimes the value you want to propagate to a downstream promise can only be\n\t    retrieved asynchronously. This can be achieved by returning a promise in the\n\t    fulfillment or rejection handler. The downstream promise will then be pending\n\t    until the returned promise is settled. This is called *assimilation*.\n\t  \n\t    ```js\n\t    findUser().then(function (user) {\n\t      return findCommentsByAuthor(user);\n\t    }).then(function (comments) {\n\t      // The user's comments are now available\n\t    });\n\t    ```\n\t  \n\t    If the assimliated promise rejects, then the downstream promise will also reject.\n\t  \n\t    ```js\n\t    findUser().then(function (user) {\n\t      return findCommentsByAuthor(user);\n\t    }).then(function (comments) {\n\t      // If `findCommentsByAuthor` fulfills, we'll have the value here\n\t    }, function (reason) {\n\t      // If `findCommentsByAuthor` rejects, we'll have the reason here\n\t    });\n\t    ```\n\t  \n\t    Simple Example\n\t    --------------\n\t  \n\t    Synchronous Example\n\t  \n\t    ```javascript\n\t    let result;\n\t  \n\t    try {\n\t      result = findResult();\n\t      // success\n\t    } catch(reason) {\n\t      // failure\n\t    }\n\t    ```\n\t  \n\t    Errback Example\n\t  \n\t    ```js\n\t    findResult(function(result, err){\n\t      if (err) {\n\t        // failure\n\t      } else {\n\t        // success\n\t      }\n\t    });\n\t    ```\n\t  \n\t    Promise Example;\n\t  \n\t    ```javascript\n\t    findResult().then(function(result){\n\t      // success\n\t    }, function(reason){\n\t      // failure\n\t    });\n\t    ```\n\t  \n\t    Advanced Example\n\t    --------------\n\t  \n\t    Synchronous Example\n\t  \n\t    ```javascript\n\t    let author, books;\n\t  \n\t    try {\n\t      author = findAuthor();\n\t      books  = findBooksByAuthor(author);\n\t      // success\n\t    } catch(reason) {\n\t      // failure\n\t    }\n\t    ```\n\t  \n\t    Errback Example\n\t  \n\t    ```js\n\t  \n\t    function foundBooks(books) {\n\t  \n\t    }\n\t  \n\t    function failure(reason) {\n\t  \n\t    }\n\t  \n\t    findAuthor(function(author, err){\n\t      if (err) {\n\t        failure(err);\n\t        // failure\n\t      } else {\n\t        try {\n\t          findBoooksByAuthor(author, function(books, err) {\n\t            if (err) {\n\t              failure(err);\n\t            } else {\n\t              try {\n\t                foundBooks(books);\n\t              } catch(reason) {\n\t                failure(reason);\n\t              }\n\t            }\n\t          });\n\t        } catch(error) {\n\t          failure(err);\n\t        }\n\t        // success\n\t      }\n\t    });\n\t    ```\n\t  \n\t    Promise Example;\n\t  \n\t    ```javascript\n\t    findAuthor().\n\t      then(findBooksByAuthor).\n\t      then(function(books){\n\t        // found books\n\t    }).catch(function(reason){\n\t      // something went wrong\n\t    });\n\t    ```\n\t  \n\t    @method then\n\t    @param {Function} onFulfilled\n\t    @param {Function} onRejected\n\t    Useful for tooling.\n\t    @return {Promise}\n\t  */\n\t  then: then,\n\n\t  /**\n\t    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n\t    as the catch block of a try/catch statement.\n\t  \n\t    ```js\n\t    function findAuthor(){\n\t      throw new Error('couldn't find that author');\n\t    }\n\t  \n\t    // synchronous\n\t    try {\n\t      findAuthor();\n\t    } catch(reason) {\n\t      // something went wrong\n\t    }\n\t  \n\t    // async with promises\n\t    findAuthor().catch(function(reason){\n\t      // something went wrong\n\t    });\n\t    ```\n\t  \n\t    @method catch\n\t    @param {Function} onRejection\n\t    Useful for tooling.\n\t    @return {Promise}\n\t  */\n\t  'catch': function _catch(onRejection) {\n\t    return this.then(null, onRejection);\n\t  }\n\t};\n\n\tfunction polyfill() {\n\t    var local = undefined;\n\n\t    if (typeof global !== 'undefined') {\n\t        local = global;\n\t    } else if (typeof self !== 'undefined') {\n\t        local = self;\n\t    } else {\n\t        try {\n\t            local = Function('return this')();\n\t        } catch (e) {\n\t            throw new Error('polyfill failed because global object is unavailable in this environment');\n\t        }\n\t    }\n\n\t    var P = local.Promise;\n\n\t    if (P) {\n\t        var promiseToString = null;\n\t        try {\n\t            promiseToString = Object.prototype.toString.call(P.resolve());\n\t        } catch (e) {\n\t            // silently ignored\n\t        }\n\n\t        if (promiseToString === '[object Promise]' && !P.cast) {\n\t            return;\n\t        }\n\t    }\n\n\t    local.Promise = Promise;\n\t}\n\n\t// Strange compat..\n\tPromise.polyfill = polyfill;\n\tPromise.Promise = Promise;\n\n\treturn Promise;\n\n\t})));\n\n\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10), (function() { return this; }())))\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\n\t// shim for using process in browser\n\tvar process = module.exports = {};\n\n\t// cached from whatever global is present so that test runners that stub it\n\t// don't break things.  But we need to wrap it in a try catch in case it is\n\t// wrapped in strict mode code which doesn't define any globals.  It's inside a\n\t// function because try/catches deoptimize in certain engines.\n\n\tvar cachedSetTimeout;\n\tvar cachedClearTimeout;\n\n\tfunction defaultSetTimout() {\n\t    throw new Error('setTimeout has not been defined');\n\t}\n\tfunction defaultClearTimeout () {\n\t    throw new Error('clearTimeout has not been defined');\n\t}\n\t(function () {\n\t    try {\n\t        if (typeof setTimeout === 'function') {\n\t            cachedSetTimeout = setTimeout;\n\t        } else {\n\t            cachedSetTimeout = defaultSetTimout;\n\t        }\n\t    } catch (e) {\n\t        cachedSetTimeout = defaultSetTimout;\n\t    }\n\t    try {\n\t        if (typeof clearTimeout === 'function') {\n\t            cachedClearTimeout = clearTimeout;\n\t        } else {\n\t            cachedClearTimeout = defaultClearTimeout;\n\t        }\n\t    } catch (e) {\n\t        cachedClearTimeout = defaultClearTimeout;\n\t    }\n\t} ())\n\tfunction runTimeout(fun) {\n\t    if (cachedSetTimeout === setTimeout) {\n\t        //normal enviroments in sane situations\n\t        return setTimeout(fun, 0);\n\t    }\n\t    // if setTimeout wasn't available but was latter defined\n\t    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n\t        cachedSetTimeout = setTimeout;\n\t        return setTimeout(fun, 0);\n\t    }\n\t    try {\n\t        // when when somebody has screwed with setTimeout but no I.E. maddness\n\t        return cachedSetTimeout(fun, 0);\n\t    } catch(e){\n\t        try {\n\t            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t            return cachedSetTimeout.call(null, fun, 0);\n\t        } catch(e){\n\t            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n\t            return cachedSetTimeout.call(this, fun, 0);\n\t        }\n\t    }\n\n\n\t}\n\tfunction runClearTimeout(marker) {\n\t    if (cachedClearTimeout === clearTimeout) {\n\t        //normal enviroments in sane situations\n\t        return clearTimeout(marker);\n\t    }\n\t    // if clearTimeout wasn't available but was latter defined\n\t    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n\t        cachedClearTimeout = clearTimeout;\n\t        return clearTimeout(marker);\n\t    }\n\t    try {\n\t        // when when somebody has screwed with setTimeout but no I.E. maddness\n\t        return cachedClearTimeout(marker);\n\t    } catch (e){\n\t        try {\n\t            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n\t            return cachedClearTimeout.call(null, marker);\n\t        } catch (e){\n\t            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n\t            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n\t            return cachedClearTimeout.call(this, marker);\n\t        }\n\t    }\n\n\n\n\t}\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\n\tfunction cleanUpNextTick() {\n\t    if (!draining || !currentQueue) {\n\t        return;\n\t    }\n\t    draining = false;\n\t    if (currentQueue.length) {\n\t        queue = currentQueue.concat(queue);\n\t    } else {\n\t        queueIndex = -1;\n\t    }\n\t    if (queue.length) {\n\t        drainQueue();\n\t    }\n\t}\n\n\tfunction drainQueue() {\n\t    if (draining) {\n\t        return;\n\t    }\n\t    var timeout = runTimeout(cleanUpNextTick);\n\t    draining = true;\n\n\t    var len = queue.length;\n\t    while(len) {\n\t        currentQueue = queue;\n\t        queue = [];\n\t        while (++queueIndex < len) {\n\t            if (currentQueue) {\n\t                currentQueue[queueIndex].run();\n\t            }\n\t        }\n\t        queueIndex = -1;\n\t        len = queue.length;\n\t    }\n\t    currentQueue = null;\n\t    draining = false;\n\t    runClearTimeout(timeout);\n\t}\n\n\tprocess.nextTick = function (fun) {\n\t    var args = new Array(arguments.length - 1);\n\t    if (arguments.length > 1) {\n\t        for (var i = 1; i < arguments.length; i++) {\n\t            args[i - 1] = arguments[i];\n\t        }\n\t    }\n\t    queue.push(new Item(fun, args));\n\t    if (queue.length === 1 && !draining) {\n\t        runTimeout(drainQueue);\n\t    }\n\t};\n\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t    this.fun = fun;\n\t    this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t    this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\n\tfunction noop() {}\n\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\n\tprocess.binding = function (name) {\n\t    throw new Error('process.binding is not supported');\n\t};\n\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t    throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t/* (ignored) */\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\tCopyright (c) 2014-2016 Brion Vibber <brion@pobox.com>\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n\tthe Software, and to permit persons to whom the Software is furnished to do so,\n\tsubject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n\tFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n\tCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n\tIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n\tCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t*/\n\t(function() {\n\t  \"use strict\";\n\n\t  var FrameSink = __webpack_require__(13),\n\t    SoftwareFrameSink = __webpack_require__(14),\n\t    WebGLFrameSink = __webpack_require__(17);\n\n\t  /**\n\t   * @typedef {Object} YUVCanvasOptions\n\t   * @property {boolean} webGL - Whether to use WebGL to draw to the canvas and accelerate color space conversion. If left out, defaults to auto-detect.\n\t   */\n\n\t  var YUVCanvas = {\n\t    FrameSink: FrameSink,\n\n\t    SoftwareFrameSink: SoftwareFrameSink,\n\n\t    WebGLFrameSink: WebGLFrameSink,\n\n\t    /**\n\t     * Attach a suitable FrameSink instance to an HTML5 canvas element.\n\t     *\n\t     * This will take over the drawing context of the canvas and may turn\n\t     * it into a WebGL 3d canvas if possible. Do not attempt to use the\n\t     * drawing context directly after this.\n\t     *\n\t     * @param {HTMLCanvasElement} canvas - HTML canvas element to attach to\n\t     * @param {YUVCanvasOptions} options - map of options\n\t     * @returns {FrameSink} - instance of suitable subclass.\n\t     */\n\t    attach: function(canvas, options) {\n\t      options = options || {};\n\t      var webGL = ('webGL' in options) ? options.webGL : WebGLFrameSink.isAvailable();\n\t      if (webGL) {\n\t        return new WebGLFrameSink(canvas, options);\n\t      } else {\n\t        return new SoftwareFrameSink(canvas, options);\n\t      }\n\t    }\n\t  };\n\n\t  module.exports = YUVCanvas;\n\t})();\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports) {\n\n\t(function() {\n\t  \"use strict\";\n\n\t  /**\n\t   * Create a YUVCanvas and attach it to an HTML5 canvas element.\n\t   *\n\t   * This will take over the drawing context of the canvas and may turn\n\t   * it into a WebGL 3d canvas if possible. Do not attempt to use the\n\t   * drawing context directly after this.\n\t   *\n\t   * @param {HTMLCanvasElement} canvas - HTML canvas element to attach to\n\t   * @param {YUVCanvasOptions} options - map of options\n\t   * @throws exception if WebGL requested but unavailable\n\t   * @constructor\n\t   * @abstract\n\t   */\n\t  function FrameSink(canvas, options) {\n\t    throw new Error('abstract');\n\t  }\n\n\t  /**\n\t   * Draw a single YUV frame on the underlying canvas, converting to RGB.\n\t   * If necessary the canvas will be resized to the optimal pixel size\n\t   * for the given buffer's format.\n\t   *\n\t   * @param {YUVBuffer} buffer - the YUV buffer to draw\n\t   * @see {@link https://www.npmjs.com/package/yuv-buffer|yuv-buffer} for format\n\t   */\n\t  FrameSink.prototype.drawFrame = function(buffer) {\n\t    throw new Error('abstract');\n\t  };\n\n\t  /**\n\t   * Clear the canvas using appropriate underlying 2d or 3d context.\n\t   */\n\t  FrameSink.prototype.clear = function() {\n\t    throw new Error('abstract');\n\t  };\n\n\t  module.exports = FrameSink;\n\n\t})();\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\tCopyright (c) 2014-2016 Brion Vibber <brion@pobox.com>\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n\tthe Software, and to permit persons to whom the Software is furnished to do so,\n\tsubject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n\tFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n\tCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n\tIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n\tCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t*/\n\t(function() {\n\t\t\"use strict\";\n\n\t\tvar FrameSink = __webpack_require__(13),\n\t\t\tYCbCr = __webpack_require__(15);\n\n\t\t/**\n\t\t * @param {HTMLCanvasElement} canvas - HTML canvas eledment to attach to\n\t\t * @constructor\n\t\t */\n\t\tfunction SoftwareFrameSink(canvas) {\n\t\t\tvar self = this,\n\t\t\t\tctx = canvas.getContext('2d'),\n\t\t\t\timageData = null,\n\t\t\t\tresampleCanvas = null,\n\t\t\t\tresampleContext = null;\n\n\n\n\t\t\tfunction initImageData(width, height) {\n\t\t\t\timageData = ctx.createImageData(width, height);\n\n\t\t\t\t// Prefill the alpha to opaque\n\t\t\t\tvar data = imageData.data,\n\t\t\t\t\tpixelCount = width * height * 4;\n\t\t\t\tfor (var i = 0; i < pixelCount; i += 4) {\n\t\t\t\t\tdata[i + 3] = 255;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction initResampleCanvas(cropWidth, cropHeight) {\n\t\t\t\tresampleCanvas = document.createElement('canvas');\n\t\t\t\tresampleCanvas.width = cropWidth;\n\t\t\t\tresampleCanvas.height = cropHeight;\n\t\t\t\tresampleContext = resampleCanvas.getContext('2d');\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Actually draw a frame into the canvas.\n\t\t\t * @param {YUVFrame} buffer - YUV frame buffer object to draw\n\t\t\t */\n\t\t\tself.drawFrame = function drawFrame(buffer) {\n\t\t\t\tvar format = buffer.format;\n\n\t\t\t\tif (canvas.width !== format.displayWidth || canvas.height !== format.displayHeight) {\n\t\t\t\t\t// Keep the canvas at the right size...\n\t\t\t\t\tcanvas.width = format.displayWidth;\n\t\t\t\t\tcanvas.height = format.displayHeight;\n\t\t\t\t}\n\n\t\t\t\tif (imageData === null ||\n\t\t\t\t\t\timageData.width != format.width ||\n\t\t\t\t\t\timageData.height != format.height) {\n\t\t\t\t\tinitImageData(format.width, format.height);\n\t\t\t\t}\n\n\t\t\t\t// YUV -> RGB over the entire encoded frame\n\t\t\t\tYCbCr.convertYCbCr(buffer, imageData.data);\n\n\t\t\t\tvar resample = (format.cropWidth != format.displayWidth || format.cropHeight != format.displayHeight);\n\t\t\t\tvar drawContext;\n\t\t\t\tif (resample) {\n\t\t\t\t\t// hack for non-square aspect-ratio\n\t\t\t\t\t// putImageData doesn't resample, so we have to draw in two steps.\n\t\t\t\t\tif (!resampleCanvas) {\n\t\t\t\t\t\tinitResampleCanvas(format.cropWidth, format.cropHeight);\n\t\t\t\t\t}\n\t\t\t\t\tdrawContext = resampleContext;\n\t\t\t\t} else {\n\t\t\t\t\tdrawContext = ctx;\n\t\t\t\t}\n\n\t\t\t\t// Draw cropped frame to either the final or temporary canvas\n\t\t\t\tdrawContext.putImageData(imageData,\n\t\t\t\t\t\t\t\t         0, 0,\n\t\t\t\t\t\t\t\t\t\t\t\t format.cropLeft, format.cropTop,\n\t\t\t\t\t\t\t\t\t\t\t\t format.cropWidth, format.cropHeight);\n\n\t\t\t\tif (resample) {\n\t\t\t\t\tctx.drawImage(resampleCanvas, 0, 0, format.displayWidth, format.displayHeight);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tself.clear = function() {\n\t\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\n\t\t\t};\n\n\t\t\treturn self;\n\t\t}\n\n\t\tSoftwareFrameSink.prototype = Object.create(FrameSink.prototype);\n\n\t\tmodule.exports = SoftwareFrameSink;\n\t})();\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\tCopyright (c) 2014-2016 Brion Vibber <brion@pobox.com>\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n\tthe Software, and to permit persons to whom the Software is furnished to do so,\n\tsubject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n\tFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n\tCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n\tIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n\tCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t*/\n\t(function() {\n\t\t\"use strict\";\n\n\t\tvar depower = __webpack_require__(16);\n\n\t\t/**\n\t\t * Basic YCbCr->RGB conversion\n\t\t *\n\t\t * @author Brion Vibber <brion@pobox.com>\n\t\t * @copyright 2014-2016\n\t\t * @license MIT-style\n\t\t *\n\t\t * @param {YUVFrame} buffer - input frame buffer\n\t\t * @param {Uint8ClampedArray} output - array to draw RGBA into\n\t\t * Assumes that the output array already has alpha channel set to opaque.\n\t\t */\n\t\tfunction convertYCbCr(buffer, output) {\n\t\t\tvar width = buffer.format.width,\n\t\t\t\theight = buffer.format.height,\n\t\t\t\thdec = depower(buffer.format.width / buffer.format.chromaWidth),\n\t\t\t\tvdec = depower(buffer.format.height / buffer.format.chromaHeight),\n\t\t\t\tbytesY = buffer.y.bytes,\n\t\t\t\tbytesCb = buffer.u.bytes,\n\t\t\t\tbytesCr = buffer.v.bytes,\n\t\t\t\tstrideY = buffer.y.stride,\n\t\t\t\tstrideCb = buffer.u.stride,\n\t\t\t\tstrideCr = buffer.v.stride,\n\t\t\t\toutStride = 4 * width,\n\t\t\t\tYPtr = 0, Y0Ptr = 0, Y1Ptr = 0,\n\t\t\t\tCbPtr = 0, CrPtr = 0,\n\t\t\t\toutPtr = 0, outPtr0 = 0, outPtr1 = 0,\n\t\t\t\tcolorCb = 0, colorCr = 0,\n\t\t\t\tmultY = 0, multCrR = 0, multCbCrG = 0, multCbB = 0,\n\t\t\t\tx = 0, y = 0, xdec = 0, ydec = 0;\n\n\t\t\tif (hdec == 1 && vdec == 1) {\n\t\t\t\t// Optimize for 4:2:0, which is most common\n\t\t\t\toutPtr0 = 0;\n\t\t\t\toutPtr1 = outStride;\n\t\t\t\tydec = 0;\n\t\t\t\tfor (y = 0; y < height; y += 2) {\n\t\t\t\t\tY0Ptr = y * strideY;\n\t\t\t\t\tY1Ptr = Y0Ptr + strideY;\n\t\t\t\t\tCbPtr = ydec * strideCb;\n\t\t\t\t\tCrPtr = ydec * strideCr;\n\t\t\t\t\tfor (x = 0; x < width; x += 2) {\n\t\t\t\t\t\tcolorCb = bytesCb[CbPtr++];\n\t\t\t\t\t\tcolorCr = bytesCr[CrPtr++];\n\n\t\t\t\t\t\t// Quickie YUV conversion\n\t\t\t\t\t\t// https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.2020_conversion\n\t\t\t\t\t\t// multiplied by 256 for integer-friendliness\n\t\t\t\t\t\tmultCrR   = (409 * colorCr) - 57088;\n\t\t\t\t\t\tmultCbCrG = (100 * colorCb) + (208 * colorCr) - 34816;\n\t\t\t\t\t\tmultCbB   = (516 * colorCb) - 70912;\n\n\t\t\t\t\t\tmultY = (298 * bytesY[Y0Ptr++]);\n\t\t\t\t\t\toutput[outPtr0++] = (multY + multCrR) >> 8;\n\t\t\t\t\t\toutput[outPtr0++] = (multY - multCbCrG) >> 8;\n\t\t\t\t\t\toutput[outPtr0++] = (multY + multCbB) >> 8;\n\t\t\t\t\t\toutPtr0++;\n\n\t\t\t\t\t\tmultY = (298 * bytesY[Y0Ptr++]);\n\t\t\t\t\t\toutput[outPtr0++] = (multY + multCrR) >> 8;\n\t\t\t\t\t\toutput[outPtr0++] = (multY - multCbCrG) >> 8;\n\t\t\t\t\t\toutput[outPtr0++] = (multY + multCbB) >> 8;\n\t\t\t\t\t\toutPtr0++;\n\n\t\t\t\t\t\tmultY = (298 * bytesY[Y1Ptr++]);\n\t\t\t\t\t\toutput[outPtr1++] = (multY + multCrR) >> 8;\n\t\t\t\t\t\toutput[outPtr1++] = (multY - multCbCrG) >> 8;\n\t\t\t\t\t\toutput[outPtr1++] = (multY + multCbB) >> 8;\n\t\t\t\t\t\toutPtr1++;\n\n\t\t\t\t\t\tmultY = (298 * bytesY[Y1Ptr++]);\n\t\t\t\t\t\toutput[outPtr1++] = (multY + multCrR) >> 8;\n\t\t\t\t\t\toutput[outPtr1++] = (multY - multCbCrG) >> 8;\n\t\t\t\t\t\toutput[outPtr1++] = (multY + multCbB) >> 8;\n\t\t\t\t\t\toutPtr1++;\n\t\t\t\t\t}\n\t\t\t\t\toutPtr0 += outStride;\n\t\t\t\t\toutPtr1 += outStride;\n\t\t\t\t\tydec++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutPtr = 0;\n\t\t\t\tfor (y = 0; y < height; y++) {\n\t\t\t\t\txdec = 0;\n\t\t\t\t\tydec = y >> vdec;\n\t\t\t\t\tYPtr = y * strideY;\n\t\t\t\t\tCbPtr = ydec * strideCb;\n\t\t\t\t\tCrPtr = ydec * strideCr;\n\n\t\t\t\t\tfor (x = 0; x < width; x++) {\n\t\t\t\t\t\txdec = x >> hdec;\n\t\t\t\t\t\tcolorCb = bytesCb[CbPtr + xdec];\n\t\t\t\t\t\tcolorCr = bytesCr[CrPtr + xdec];\n\n\t\t\t\t\t\t// Quickie YUV conversion\n\t\t\t\t\t\t// https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.2020_conversion\n\t\t\t\t\t\t// multiplied by 256 for integer-friendliness\n\t\t\t\t\t\tmultCrR   = (409 * colorCr) - 57088;\n\t\t\t\t\t\tmultCbCrG = (100 * colorCb) + (208 * colorCr) - 34816;\n\t\t\t\t\t\tmultCbB   = (516 * colorCb) - 70912;\n\n\t\t\t\t\t\tmultY = 298 * bytesY[YPtr++];\n\t\t\t\t\t\toutput[outPtr++] = (multY + multCrR) >> 8;\n\t\t\t\t\t\toutput[outPtr++] = (multY - multCbCrG) >> 8;\n\t\t\t\t\t\toutput[outPtr++] = (multY + multCbB) >> 8;\n\t\t\t\t\t\toutPtr++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmodule.exports = {\n\t\t\tconvertYCbCr: convertYCbCr\n\t\t};\n\t})();\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n\t/*\n\tCopyright (c) 2014-2016 Brion Vibber <brion@pobox.com>\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n\tthe Software, and to permit persons to whom the Software is furnished to do so,\n\tsubject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n\tFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n\tCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n\tIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n\tCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t*/\n\t(function() {\n\t  \"use strict\";\n\n\t  /**\n\t   * Convert a ratio into a bit-shift count; for instance a ratio of 2\n\t   * becomes a bit-shift of 1, while a ratio of 1 is a bit-shift of 0.\n\t   *\n\t   * @author Brion Vibber <brion@pobox.com>\n\t   * @copyright 2016\n\t   * @license MIT-style\n\t   *\n\t   * @param {number} ratio - the integer ratio to convert.\n\t   * @returns {number} - number of bits to shift to multiply/divide by the ratio.\n\t   * @throws exception if given a non-power-of-two\n\t   */\n\t  function depower(ratio) {\n\t    var shiftCount = 0,\n\t      n = ratio >> 1;\n\t    while (n != 0) {\n\t      n = n >> 1;\n\t      shiftCount++\n\t    }\n\t    if (ratio !== (1 << shiftCount)) {\n\t      throw 'chroma plane dimensions must be power of 2 ratio to luma plane dimensions; got ' + ratio;\n\t    }\n\t    return shiftCount;\n\t  }\n\n\t  module.exports = depower;\n\t})();\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\tCopyright (c) 2014-2016 Brion Vibber <brion@pobox.com>\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n\tthe Software, and to permit persons to whom the Software is furnished to do so,\n\tsubject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n\tFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n\tCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n\tIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n\tCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t*/\n\t(function() {\n\t\t\"use strict\";\n\n\t\tvar FrameSink = __webpack_require__(13),\n\t\t\tshaders = __webpack_require__(18);\n\n\t\t/**\n\t\t * Warning: canvas must not have been used for 2d drawing prior!\n\t\t *\n\t\t * @param {HTMLCanvasElement} canvas - HTML canvas element to attach to\n\t\t * @constructor\n\t\t */\n\t\tfunction WebGLFrameSink(canvas) {\n\t\t\tvar self = this,\n\t\t\t\tgl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'),\n\t\t\t\tdebug = false; // swap this to enable more error checks, which can slow down rendering\n\n\t\t\tif (gl === null) {\n\t\t\t\tthrow new Error('WebGL unavailable');\n\t\t\t}\n\n\t\t\t// GL!\n\t\t\tfunction checkError() {\n\t\t\t\tif (debug) {\n\t\t\t\t\terr = gl.getError();\n\t\t\t\t\tif (err !== 0) {\n\t\t\t\t\t\tthrow new Error(\"GL error \" + err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction compileShader(type, source) {\n\t\t\t\tvar shader = gl.createShader(type);\n\t\t\t\tgl.shaderSource(shader, source);\n\t\t\t\tgl.compileShader(shader);\n\n\t\t\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\t\t\tvar err = gl.getShaderInfoLog(shader);\n\t\t\t\t\tgl.deleteShader(shader);\n\t\t\t\t\tthrow new Error('GL shader compilation for ' + type + ' failed: ' + err);\n\t\t\t\t}\n\n\t\t\t\treturn shader;\n\t\t\t}\n\n\n\t\t\tvar vertexShader,\n\t\t\t\tfragmentShader,\n\t\t\t\tprogram,\n\t\t\t\tbuf,\n\t\t\t\terr;\n\n\t\t\t// In the world of GL there are no rectangles.\n\t\t\t// There are only triangles.\n\t\t\t// THERE IS NO SPOON.\n\t\t\tvar rectangle = new Float32Array([\n\t\t\t\t// First triangle (top left, clockwise)\n\t\t\t\t-1.0, -1.0,\n\t\t\t\t+1.0, -1.0,\n\t\t\t\t-1.0, +1.0,\n\n\t\t\t\t// Second triangle (bottom right, clockwise)\n\t\t\t\t-1.0, +1.0,\n\t\t\t\t+1.0, -1.0,\n\t\t\t\t+1.0, +1.0\n\t\t\t]);\n\n\t\t\tvar textures = {};\n\t\t\tfunction attachTexture(name, register, index, width, height, data) {\n\t\t\t\tvar texture,\n\t\t\t\t\ttexWidth = WebGLFrameSink.stripe ? (width / 4) : width,\n\t\t\t\t\tformat = WebGLFrameSink.stripe ? gl.RGBA : gl.LUMINANCE,\n\t\t\t\t\tfilter = WebGLFrameSink.stripe ? gl.NEAREST : gl.LINEAR;\n\n\t\t\t\tif (textures[name]) {\n\t\t\t\t\t// Reuse & update the existing texture\n\t\t\t\t\ttexture = textures[name];\n\t\t\t\t} else {\n\t\t\t\t\ttextures[name] = texture = gl.createTexture();\n\t\t\t\t\tcheckError();\n\n\t\t\t\t\tgl.uniform1i(gl.getUniformLocation(program, name), index);\n\t\t\t\t\tcheckError();\n\t\t\t\t}\n\t\t\t\tgl.activeTexture(register);\n\t\t\t\tcheckError();\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\t\t\t\tcheckError();\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\t\tcheckError();\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\t\t\tcheckError();\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n\t\t\t\tcheckError();\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n\t\t\t\tcheckError();\n\n\t\t\t\tgl.texImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0, // mip level\n\t\t\t\t\tformat, // internal format\n\t\t\t\t\ttexWidth,\n\t\t\t\t\theight,\n\t\t\t\t\t0, // border\n\t\t\t\t\tformat, // format\n\t\t\t\t\tgl.UNSIGNED_BYTE, //type\n\t\t\t\t\tdata // data!\n\t\t\t\t);\n\t\t\t\tcheckError();\n\n\t\t\t\treturn texture;\n\t\t\t}\n\n\t\t\tfunction buildStripe(width, height) {\n\t\t\t\tvar len = width * height,\n\t\t\t\t\tout = new Uint32Array(len);\n\t\t\t\tfor (var i = 0; i < len; i += 4) {\n\t\t\t\t\tout[i    ] = 0x000000ff;\n\t\t\t\t\tout[i + 1] = 0x0000ff00;\n\t\t\t\t\tout[i + 2] = 0x00ff0000;\n\t\t\t\t\tout[i + 3] = 0xff000000;\n\t\t\t\t}\n\t\t\t\treturn new Uint8Array(out.buffer);\n\t\t\t}\n\n\t\t\tfunction init(buffer) {\n\t\t\t\tvertexShader = compileShader(gl.VERTEX_SHADER, shaders.vertex);\n\t\t\t\tif (WebGLFrameSink.stripe) {\n\t\t\t\t\tfragmentShader = compileShader(gl.FRAGMENT_SHADER, shaders.fragmentStripe);\n\t\t\t\t} else {\n\t\t\t\t\tfragmentShader = compileShader(gl.FRAGMENT_SHADER, shaders.fragment);\n\t\t\t\t}\n\n\t\t\t\tprogram = gl.createProgram();\n\t\t\t\tgl.attachShader(program, vertexShader);\n\t\t\t\tcheckError();\n\n\t\t\t\tgl.attachShader(program, fragmentShader);\n\t\t\t\tcheckError();\n\n\t\t\t\tgl.linkProgram(program);\n\t\t\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\t\t\tvar err = gl.getProgramInfoLog(program);\n\t\t\t\t\tgl.deleteProgram(program);\n\t\t\t\t\tthrow new Error('GL program linking failed: ' + err);\n\t\t\t\t}\n\n\t\t\t\tgl.useProgram(program);\n\t\t\t\tcheckError();\n\n\t\t\t\tif (WebGLFrameSink.stripe) {\n\t\t\t\t\tattachTexture(\n\t\t\t\t\t\t'uStripeLuma',\n\t\t\t\t\t\tgl.TEXTURE3,\n\t\t\t\t\t\t3,\n\t\t\t\t\t\tbuffer.y.stride * 4,\n\t\t\t\t\t\tbuffer.format.height,\n\t\t\t\t\t\tbuildStripe(buffer.y.stride, buffer.format.height)\n\t\t\t\t\t);\n\t\t\t\t\tcheckError();\n\n\t\t\t\t\tattachTexture(\n\t\t\t\t\t\t'uStripeChroma',\n\t\t\t\t\t\tgl.TEXTURE4,\n\t\t\t\t\t\t4,\n\t\t\t\t\t\tbuffer.u.stride * 4,\n\t\t\t\t\t\tbuffer.format.chromaHeight,\n\t\t\t\t\t\tbuildStripe(buffer.u.stride, buffer.format.chromaHeight)\n\t\t\t\t\t);\n\t\t\t\t\tcheckError();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Actually draw a frame.\n\t\t\t * @param {YUVFrame} buffer - YUV frame buffer object\n\t\t\t */\n\t\t\tself.drawFrame = function(buffer) {\n\t\t\t\tvar format = buffer.format;\n\n\t\t\t\tif (canvas.width !== format.displayWidth || canvas.height !== format.displayHeight) {\n\t\t\t\t\t// Keep the canvas at the right size...\n\t\t\t\t\tcanvas.width = format.displayWidth;\n\t\t\t\t\tcanvas.height = format.displayHeight;\n\t\t\t\t\tself.clear();\n\t\t\t\t}\n\n\t\t\t\tif (!program) {\n\t\t\t\t\tinit(buffer);\n\t\t\t\t}\n\n\t\t\t\t// Set up the rectangle and draw it\n\n\t\t\t\t//\n\t\t\t\t// Set up geometry\n\t\t\t\t//\n\n\t\t\t\tbuf = gl.createBuffer();\n\t\t\t\tcheckError();\n\n\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buf);\n\t\t\t\tcheckError();\n\n\t\t\t\tgl.bufferData(gl.ARRAY_BUFFER, rectangle, gl.STATIC_DRAW);\n\t\t\t\tcheckError();\n\n\t\t\t\tvar positionLocation = gl.getAttribLocation(program, 'aPosition');\n\t\t\t\tcheckError();\n\n\t\t\t\tgl.enableVertexAttribArray(positionLocation);\n\t\t\t\tcheckError();\n\n\t\t\t\tgl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\t\t\t\tcheckError();\n\n\n\t\t\t\t// Set up the texture geometry...\n\t\t\t\tfunction setupTexturePosition(varname, texWidth) {\n\t\t\t\t\t// Warning: assumes that the stride for Cb and Cr is the same size in output pixels\n\t\t\t\t\tvar textureX0 = format.cropLeft / texWidth;\n\t\t\t\t\tvar textureX1 = (format.cropLeft + format.cropWidth) / texWidth;\n\t\t\t\t\tvar textureY0 = (format.cropTop + format.cropHeight) / format.height;\n\t\t\t\t\tvar textureY1 = format.cropTop / format.height;\n\t\t\t\t\tvar textureRectangle = new Float32Array([\n\t\t\t\t\t\ttextureX0, textureY0,\n\t\t\t\t\t\ttextureX1, textureY0,\n\t\t\t\t\t\ttextureX0, textureY1,\n\t\t\t\t\t\ttextureX0, textureY1,\n\t\t\t\t\t\ttextureX1, textureY0,\n\t\t\t\t\t\ttextureX1, textureY1\n\t\t\t\t\t]);\n\n\t\t\t\t\tvar texturePositionBuffer = gl.createBuffer();\n\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, texturePositionBuffer);\n\t\t\t\t\tcheckError();\n\n\t\t\t\t\tgl.bufferData(gl.ARRAY_BUFFER, textureRectangle, gl.STATIC_DRAW);\n\t\t\t\t\tcheckError();\n\n\t\t\t\t\tvar texturePositionLocation = gl.getAttribLocation(program, varname);\n\t\t\t\t\tcheckError();\n\n\t\t\t\t\tgl.enableVertexAttribArray(texturePositionLocation);\n\t\t\t\t\tcheckError();\n\n\t\t\t\t\tgl.vertexAttribPointer(texturePositionLocation, 2, gl.FLOAT, false, 0, 0);\n\t\t\t\t\tcheckError();\n\t\t\t\t}\n\t\t\t\tsetupTexturePosition('aLumaPosition', buffer.y.stride);\n\t\t\t\tsetupTexturePosition('aChromaPosition', buffer.u.stride * format.width / format.chromaWidth);\n\n\t\t\t\t// Create the textures...\n\t\t\t\tvar textureY = attachTexture(\n\t\t\t\t\t'uTextureY',\n\t\t\t\t\tgl.TEXTURE0,\n\t\t\t\t\t0,\n\t\t\t\t\tbuffer.y.stride,\n\t\t\t\t\tformat.height,\n\t\t\t\t\tbuffer.y.bytes\n\t\t\t\t);\n\t\t\t\tvar textureCb = attachTexture(\n\t\t\t\t\t'uTextureCb',\n\t\t\t\t\tgl.TEXTURE1,\n\t\t\t\t\t1,\n\t\t\t\t\tbuffer.u.stride,\n\t\t\t\t\tformat.chromaHeight,\n\t\t\t\t\tbuffer.u.bytes\n\t\t\t\t);\n\t\t\t\tvar textureCr = attachTexture(\n\t\t\t\t\t'uTextureCr',\n\t\t\t\t\tgl.TEXTURE2,\n\t\t\t\t\t2,\n\t\t\t\t\tbuffer.v.stride,\n\t\t\t\t\tformat.chromaHeight,\n\t\t\t\t\tbuffer.v.bytes\n\t\t\t\t);\n\n\t\t\t\t// Aaaaand draw stuff.\n\t\t\t\tgl.drawArrays(gl.TRIANGLES, 0, rectangle.length / 2);\n\t\t\t\tcheckError();\n\t\t\t};\n\n\t\t\tself.clear = function() {\n\t\t\t\tgl.viewport(0, 0, canvas.width, canvas.height);\n\t\t\t\tgl.clearColor(0.0, 0.0, 0.0, 0.0);\n\t\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\t};\n\n\t\t\tself.clear();\n\n\t\t\treturn self;\n\t\t}\n\n\t\t// For Windows; luminance and alpha textures are ssllooww to upload,\n\t\t// so we pack into RGBA and unpack in the shaders.\n\t\t//\n\t\t// This seems to affect all browsers on Windows, probably due to fun\n\t\t// mismatches between GL and D3D.\n\t\tWebGLFrameSink.stripe = (function() {\n\t\t\tif (navigator.userAgent.indexOf('Windows') !== -1) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t})();\n\n\t\t/**\n\t\t * Static function to check if WebGL will be available with appropriate features.\n\t\t *\n\t\t * @returns {boolean} - true if available\n\t\t */\n\t\tWebGLFrameSink.isAvailable = function() {\n\t\t\tvar canvas = document.createElement('canvas'),\n\t\t\t\tgl;\n\t\t\tcanvas.width = 1;\n\t\t\tcanvas.height = 1;\n\t\t\tvar options = {\n\t\t\t\t// Still dithering on whether to use this.\n\t\t\t\t// Recommend avoiding it, as it's overly conservative\n\t\t\t\t//failIfMajorPerformanceCaveat: true\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tgl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\t\t\t} catch (e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (gl) {\n\t\t\t\tvar register = gl.TEXTURE0,\n\t\t\t\t\twidth = 4,\n\t\t\t\t\theight = 4,\n\t\t\t\t\ttexture = gl.createTexture(),\n\t\t\t\t\tdata = new Uint8Array(width * height),\n\t\t\t\t\ttexWidth = WebGLFrameSink.stripe ? (width / 4) : width,\n\t\t\t\t\tformat = WebGLFrameSink.stripe ? gl.RGBA : gl.LUMINANCE,\n\t\t\t\t\tfilter = WebGLFrameSink.stripe ? gl.NEAREST : gl.LINEAR;\n\n\t\t\t\tgl.activeTexture(register);\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n\t\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n\t\t\t\tgl.texImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0, // mip level\n\t\t\t\t\tformat, // internal format\n\t\t\t\t\ttexWidth,\n\t\t\t\t\theight,\n\t\t\t\t\t0, // border\n\t\t\t\t\tformat, // format\n\t\t\t\t\tgl.UNSIGNED_BYTE, //type\n\t\t\t\t\tdata // data!\n\t\t\t\t);\n\n\t\t\t\tvar err = gl.getError();\n\t\t\t\tif (err) {\n\t\t\t\t\t// Doesn't support luminance textures?\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\tWebGLFrameSink.prototype = Object.create(FrameSink.prototype);\n\n\t\tmodule.exports = WebGLFrameSink;\n\t})();\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\n\tmodule.exports = {\n\t  vertex: \"attribute vec2 aPosition;\\nattribute vec2 aLumaPosition;\\nattribute vec2 aChromaPosition;\\nvarying vec2 vLumaPosition;\\nvarying vec2 vChromaPosition;\\nvoid main() {\\n    gl_Position = vec4(aPosition, 0, 1);\\n    vLumaPosition = aLumaPosition;\\n    vChromaPosition = aChromaPosition;\\n}\\n\",\n\t  fragment: \"// inspired by https://github.com/mbebenita/Broadway/blob/master/Player/canvas.js\\n\\nprecision mediump float;\\nuniform sampler2D uTextureY;\\nuniform sampler2D uTextureCb;\\nuniform sampler2D uTextureCr;\\nvarying vec2 vLumaPosition;\\nvarying vec2 vChromaPosition;\\nvoid main() {\\n   // Y, Cb, and Cr planes are uploaded as LUMINANCE textures.\\n   float fY = texture2D(uTextureY, vLumaPosition).x;\\n   float fCb = texture2D(uTextureCb, vChromaPosition).x;\\n   float fCr = texture2D(uTextureCr, vChromaPosition).x;\\n\\n   // Premultipy the Y...\\n   float fYmul = fY * 1.1643828125;\\n\\n   // And convert that to RGB!\\n   gl_FragColor = vec4(\\n     fYmul + 1.59602734375 * fCr - 0.87078515625,\\n     fYmul - 0.39176171875 * fCb - 0.81296875 * fCr + 0.52959375,\\n     fYmul + 2.017234375   * fCb - 1.081390625,\\n     1\\n   );\\n}\\n\",\n\t  fragmentStripe: \"// inspired by https://github.com/mbebenita/Broadway/blob/master/Player/canvas.js\\n// extra 'stripe' texture fiddling to work around IE 11's poor performance on gl.LUMINANCE and gl.ALPHA textures\\n\\nprecision mediump float;\\nuniform sampler2D uStripeLuma;\\nuniform sampler2D uStripeChroma;\\nuniform sampler2D uTextureY;\\nuniform sampler2D uTextureCb;\\nuniform sampler2D uTextureCr;\\nvarying vec2 vLumaPosition;\\nvarying vec2 vChromaPosition;\\nvoid main() {\\n   // Y, Cb, and Cr planes are mapped into a pseudo-RGBA texture\\n   // so we can upload them without expanding the bytes on IE 11\\n   // which doesn\\\\'t allow LUMINANCE or ALPHA textures.\\n   // The stripe textures mark which channel to keep for each pixel.\\n   vec4 vStripeLuma = texture2D(uStripeLuma, vLumaPosition);\\n   vec4 vStripeChroma = texture2D(uStripeChroma, vChromaPosition);\\n\\n   // Each texture extraction will contain the relevant value in one\\n   // channel only.\\n   vec4 vY = texture2D(uTextureY, vLumaPosition) * vStripeLuma;\\n   vec4 vCb = texture2D(uTextureCb, vChromaPosition) * vStripeChroma;\\n   vec4 vCr = texture2D(uTextureCr, vChromaPosition) * vStripeChroma;\\n\\n   // Now assemble that into a YUV vector, and premultipy the Y...\\n   vec3 YUV = vec3(\\n     (vY.x  + vY.y  + vY.z  + vY.w) * 1.1643828125,\\n     (vCb.x + vCb.y + vCb.z + vCb.w),\\n     (vCr.x + vCr.y + vCr.z + vCr.w)\\n   );\\n   // And convert that to RGB!\\n   gl_FragColor = vec4(\\n     YUV.x + 1.59602734375 * YUV.z - 0.87078515625,\\n     YUV.x - 0.39176171875 * YUV.y - 0.81296875 * YUV.z + 0.52959375,\\n     YUV.x + 2.017234375   * YUV.y - 1.081390625,\\n     1\\n   );\\n}\\n\"\n\t};\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar EventEmitter = __webpack_require__(20);\n\tvar CachePool = __webpack_require__(21);\n\tvar Backend = __webpack_require__(24);\n\n\t/**\n\t * @typedef {Object} StreamFileOptions\n\t * @property {string} url - the URL to fetch\n\t * @property {number} chunkSize - max size of each chunked HTTP request / readahead target\n\t * @property {number} cacheSize - max amount of data to keep buffered in memory for seeks\n\t */\n\n\t/**\n\t * Utility class for chunked streaming of large files via XMLHttpRequest.\n\t * Provides an abstraction of a seekable input stream, backed by in-memory\n\t * caching, and some convenient promise-based i/o methods.\n\t * @param {StreamFileOptions} options\n\t * @constructor\n\t */\n\n\tvar StreamFile = function () {\n\t  function StreamFile(_ref) {\n\t    var _ref$url = _ref.url;\n\t    var url = _ref$url === undefined ? '' : _ref$url;\n\t    var _ref$chunkSize = _ref.chunkSize;\n\t    var chunkSize = _ref$chunkSize === undefined ? 1 * 1024 * 1024 : _ref$chunkSize;\n\t    var _ref$cacheSize = _ref.cacheSize;\n\t    var cacheSize = _ref$cacheSize === undefined ? 0 : _ref$cacheSize;\n\n\t    _classCallCheck(this, StreamFile);\n\n\t    // InputStream public API\n\t    this.length = -1;\n\t    this.loaded = false;\n\t    this.loading = false;\n\t    this.seekable = false;\n\t    this.buffering = false;\n\t    this.seeking = false;\n\n\t    Object.defineProperties(this, {\n\t      /**\n\t       * Byte offset of the read head\n\t       */\n\t      offset: {\n\t        get: function get() {\n\t          return this._cache.readOffset;\n\t        }\n\t      },\n\n\t      /**\n\t       * Is the read head at the end of the file?\n\t       */\n\t      eof: {\n\t        get: function get() {\n\t          return this.length === this._cache.readOffset;\n\t        }\n\t      }\n\t    });\n\n\t    // StreamFile public API\n\t    this.url = url;\n\t    this.headers = {};\n\n\t    // Private\n\t    this._cache = new CachePool({\n\t      cacheSize: cacheSize\n\t    });\n\n\t    this._backend = null;\n\t    this._cachever = 0;\n\t    this._chunkSize = chunkSize;\n\t  }\n\n\t  /**\n\t   * Open the file, get metadata, and start buffering some data.\n\t   * On success, loaded will become true, headers may be filled out,\n\t   * and length may be available.\n\t   *\n\t   * @returns {Promise}\n\t   */\n\n\n\t  _createClass(StreamFile, [{\n\t    key: 'load',\n\t    value: function load() {\n\t      var _this = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        if (_this.loading) {\n\t          throw new Error('cannot load when loading');\n\t        }\n\t        if (_this.loaded) {\n\t          throw new Error('cannot load when loaded');\n\t        }\n\t        _this.loading = true;\n\t        _this._openBackend().then(function (backend) {\n\t          // Save metadata from the first set...\n\t          // Beware this._backend may be null already,\n\t          // if the first segment was very short!\n\t          _this.seekable = backend.seekable;\n\t          _this.headers = backend.headers;\n\t          _this.length = backend.length;\n\t          _this.loaded = true;\n\t          _this.loading = false;\n\t          resolve();\n\t        }).catch(function (err) {\n\t          if (err.name !== 'AbortError') {\n\t            _this.loading = false;\n\t          }\n\t          reject(err);\n\t        });\n\t      });\n\t    }\n\n\t    /**\n\t     * Create a backend and wait for it to load.\n\t     * The returned 'backend' object may be null if there is no data to read.\n\t     *\n\t     * @returns {Promise}\n\t     */\n\n\t  }, {\n\t    key: '_openBackend',\n\t    value: function _openBackend() {\n\t      var _this2 = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        if (_this2._backend) {\n\t          resolve(_this2._backend);\n\t        } else if (_this2.eof) {\n\t          reject(new Error('cannot open at end of file'));\n\t        } else {\n\t          var cache = _this2._cache;\n\t          var max = _this2._chunkSize;\n\n\t          // Seek forward to the next unread point, up to chunk size\n\t          var readable = cache.bytesReadable(max);\n\t          var readTail = cache.readOffset + readable;\n\t          cache.seekWrite(readTail);\n\n\t          // Did we already cache the entire file?\n\t          if (_this2.length >= 0 && readTail >= _this2.length) {\n\t            resolve(null);\n\t            return;\n\t          }\n\n\t          // Do we have space to write within that chunk?\n\t          var writable = cache.bytesWritable(max);\n\t          if (writable === 0) {\n\t            // Nothing to read/write within the current readahead area.\n\t            resolve(null);\n\t          } else {\n\t            (function () {\n\t              var backend = _this2._backend = new Backend({\n\t                url: _this2.url,\n\t                offset: _this2._cache.writeOffset,\n\t                length: writable,\n\t                cachever: _this2._cachever\n\t              });\n\n\t              var oncomplete = null;\n\n\t              var checkOpen = function checkOpen() {\n\t                if (backend !== _this2._backend) {\n\t                  oncomplete();\n\t                  reject(new Error('invalid state'));\n\t                } else {\n\t                  backend.on('buffer', function (buffer) {\n\t                    if (backend === _this2._backend) {\n\t                      _this2._cache.write(buffer);\n\t                    }\n\t                  });\n\t                  backend.on('done', function () {\n\t                    if (backend === _this2._backend) {\n\t                      if (_this2.length === -1) {\n\t                        // save length on those final thingies\n\t                        _this2.length = _this2._backend.offset + _this2._backend.bytesRead;\n\t                      }\n\t                      _this2._backend = null;\n\t                    }\n\t                  });\n\t                  resolve(backend);\n\t                }\n\t              };\n\n\t              var checkError = function checkError(err) {\n\t                if (backend !== _this2._backend) {\n\t                  reject(new Error('invalid state'));\n\t                } else {\n\t                  _this2._backend = null;\n\t                  reject(err);\n\t                }\n\t              };\n\n\t              oncomplete = function oncomplete() {\n\t                backend.off('open', checkOpen);\n\t                backend.off('error', checkError);\n\t              };\n\t              backend.on('open', checkOpen);\n\t              backend.on('error', checkError);\n\t              backend.on('cachever', function () {\n\t                _this2._cachever++;\n\t              });\n\n\t              backend.load();\n\t            })();\n\t          }\n\t        }\n\t      });\n\t    }\n\n\t    /**\n\t     * If we have empty space within the readahead area and there is not already\n\t     * a download backend in place, create one and start it loading in background.\n\t     * @returns {Promise}\n\t     */\n\n\t  }, {\n\t    key: '_readAhead',\n\t    value: function _readAhead() {\n\t      var _this3 = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        if (_this3._backend || _this3.eof) {\n\t          // do nothing\n\t          resolve();\n\t        } else {\n\t          _this3._openBackend().then(function () {\n\t            resolve();\n\t          }).catch(function (err) {\n\t            reject(err);\n\t          });\n\t        }\n\t      });\n\t    }\n\n\t    /**\n\t     * Seek the read position to a new location in the file, asynchronously.\n\t     * After succesful completion, reads will continue at the new offset.\n\t     * May fail due to network problems, invalid input, or bad state.\n\t     * @param {number} offset - target byte offset from beginning of file\n\t     * @returns {Promise} - resolved when ready to read at the new position\n\t     */\n\n\t  }, {\n\t    key: 'seek',\n\t    value: function seek(offset) {\n\t      var _this4 = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        if (!_this4.loaded || _this4.buffering || _this4.seeking) {\n\t          throw new Error('invalid state');\n\t        } else if (offset !== (offset | 0) || offset < 0) {\n\t          throw new Error('invalid input');\n\t        } else if (_this4.length >= 0 && offset > _this4.length) {\n\t          throw new Error('seek past end of file');\n\t        } else if (!_this4.seekable) {\n\t          throw new Error('seek on non-seekable stream');\n\t        } else {\n\t          if (_this4._backend) {\n\t            // @todo if a short seek forward, just keep reading?\n\t            _this4.abort();\n\t          }\n\t          _this4._cache.seekRead(offset);\n\t          _this4._cache.seekWrite(offset);\n\n\t          // Fire off a download if necessary.\n\t          _this4._readAhead().then(resolve).catch(reject);\n\t        }\n\t      });\n\t    }\n\n\t    /**\n\t     * Read up to the requested number of bytes, or until end of file is reached,\n\t     * and advance the read head.\n\t     *\n\t     * May wait on network activity if data is not yet available.\n\t     *\n\t     * @param {number} nbytes - max number of bytes to read\n\t     * @returns {ArrayBuffer} - between 0 and nbytes of data, inclusive\n\t     */\n\n\t  }, {\n\t    key: 'read',\n\t    value: function read(nbytes) {\n\t      var _this5 = this;\n\n\t      return this.buffer(nbytes).then(function (available) {\n\t        return _this5.readSync(available);\n\t      });\n\t    }\n\n\t    /**\n\t     * Read up to the requested number of bytes, or however much is available\n\t     * in the buffer until the next empty segment, and advance the read head.\n\t     *\n\t     * Returns immediately.\n\t     *\n\t     * @param {number} nbytes - max number of bytes to read\n\t     * @returns {ArrayBuffer} - between 0 and nbytes of data, inclusive\n\t     */\n\n\t  }, {\n\t    key: 'readSync',\n\t    value: function readSync(nbytes) {\n\t      var available = this.bytesAvailable(nbytes);\n\t      var dest = new Uint8Array(available);\n\t      var actual = this.readBytes(dest);\n\t      if (actual !== available) {\n\t        throw new Error('failed to read expected data');\n\t      }\n\t      return dest.buffer;\n\t    }\n\n\t    /**\n\t     * Read bytes into destination array until out of buffer or space,\n\t     * and advance the read head.\n\t     *\n\t     * Returns immediately.\n\t     *\n\t     * @param {dest} Uint8Array - destination byte array\n\t     * @returns {number} - count of actual bytes read\n\t     */\n\n\t  }, {\n\t    key: 'readBytes',\n\t    value: function readBytes(dest) {\n\t      if (!this.loaded || this.buffering || this.seeking) {\n\t        throw new Error('invalid state');\n\t      } else if (!(dest instanceof Uint8Array)) {\n\t        throw new Error('invalid input');\n\t      }\n\t      var nbytes = this._cache.readBytes(dest);\n\n\t      // Trigger readahead if necessary.\n\t      this._readAhead();\n\n\t      return nbytes;\n\t    }\n\n\t    /**\n\t     * Wait until the given number of bytes are available to read, or end of file.\n\t     * @param {number} nbytes - max bytes to wait for\n\t     * @returns {Promise} - resolved with available byte count when ready\n\t     */\n\n\t  }, {\n\t    key: 'buffer',\n\t    value: function buffer(nbytes) {\n\t      var _this6 = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        if (!_this6.loaded || _this6.buffering || _this6.seeking) {\n\t          throw new Error('invalid state');\n\t        } else if (nbytes !== (nbytes | 0) || nbytes < 0) {\n\t          throw new Error('invalid input');\n\t        }\n\t        var end = _this6._clampToLength(_this6.offset + nbytes);\n\t        var readable = end - _this6.offset;\n\n\t        var canceled = false;\n\n\t        var available = _this6.bytesAvailable(readable);\n\t        if (available >= readable) {\n\t          // Requested data is immediately available.\n\t          resolve(available);\n\t        } else {\n\t          _this6.buffering = true;\n\n\t          // If we don't already have a backend open, start downloading.\n\t          _this6._openBackend().then(function (backend) {\n\t            if (backend) {\n\t              return backend.bufferToOffset(end).then(function () {\n\t                // We might have to roll over to another download,\n\t                // so loop back around!\n\t                _this6.buffering = false;\n\t                return _this6.buffer(nbytes);\n\t              });\n\t            } else {\n\t              // No more data to read.\n\t              return Promise.resolve(available);\n\t            }\n\t          }).then(function (available) {\n\t            _this6.buffering = false;\n\t            resolve(available);\n\t          }).catch(function (err) {\n\t            if (err.name !== 'AbortError') {\n\t              // was already set synchronously; avoid stomping on old promise\n\t              _this6.buffering = false;\n\t            }\n\t            reject(err);\n\t          });\n\t        }\n\t      });\n\t    }\n\n\t    /**\n\t     * Number of bytes available to read immediately from the current offset.\n\t     * This is the max number of bytes that can be returned from a read() call.\n\t     * @returns {boolean}\n\t     */\n\n\t  }, {\n\t    key: 'bytesAvailable',\n\t    value: function bytesAvailable() {\n\t      var max = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;\n\n\t      return this._cache.bytesReadable(max);\n\t    }\n\n\t    /**\n\t     * Abort any currently running downloads and operations.\n\t     */\n\n\t  }, {\n\t    key: 'abort',\n\t    value: function abort() {\n\t      // Clear state synchronously, so can immediately launch new i/o...\n\t      if (this.loading) {\n\t        this.loading = false;\n\t      }\n\t      if (this.buffering) {\n\t        this.buffering = false;\n\t      }\n\t      if (this.seeking) {\n\t        this.seeking = false;\n\t      }\n\n\t      // Abort any active backend request...\n\t      if (this._backend) {\n\t        this._backend.abort();\n\t        this._backend = null;\n\t      }\n\t    }\n\n\t    /**\n\t     * Return an array of byte ranges that are buffered.\n\t     * Each range is a two-element array of start and end.\n\t     * @returns {Array<Array<number>>}\n\t     */\n\n\t  }, {\n\t    key: 'getBufferedRanges',\n\t    value: function getBufferedRanges() {\n\t      return this._cache.ranges();\n\t    }\n\n\t    // ------\n\t    // private methods\n\t    // ------\n\n\t  }, {\n\t    key: '_clampToLength',\n\t    value: function _clampToLength(offset) {\n\t      if (this.length < 0) {\n\t        return offset;\n\t      } else {\n\t        return Math.min(this.length, offset);\n\t      }\n\t    }\n\t  }]);\n\n\t  return StreamFile;\n\t}();\n\n\tmodule.exports = StreamFile;\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\n\t\"use strict\";\n\n\t// just the bits we need\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar TinyEvents = function () {\n\t  function TinyEvents() {\n\t    _classCallCheck(this, TinyEvents);\n\n\t    this._e = {};\n\t  }\n\n\t  _createClass(TinyEvents, [{\n\t    key: \"on\",\n\t    value: function on(name, handler) {\n\t      (this._e[name] || (this._e[name] = [])).push(handler);\n\t    }\n\t  }, {\n\t    key: \"off\",\n\t    value: function off(name, handler) {\n\t      var l = this._e[name] || [];\n\t      var i = l.indexOf(handler);\n\t      if (handler >= 0) {\n\t        l.splice(i, 1);\n\t      }\n\t    }\n\t  }, {\n\t    key: \"emit\",\n\t    value: function emit(name, arg) {\n\t      (this._e[name] || []).slice().forEach(function (f) {\n\t        return f(arg);\n\t      });\n\t    }\n\t  }]);\n\n\t  return TinyEvents;\n\t}();\n\n\tmodule.exports = TinyEvents;\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tmodule.exports = __webpack_require__(22);\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar CacheItem = __webpack_require__(23);\n\n\t/**\n\t * Seekable, readable, writable buffer cache to represent a file.\n\t * @todo add max cache size and LRU cache expiration\n\t *\n\t * Internally, will always contain entries from 0 to some given out point.\n\t * Each item may either contain data, or be empty.\n\t * Empty ranges cannot be copied out via read(), non-empty ranges can.\n\t * Empty ranges can be filled up with write(), non-empty ranges cannot.\n\t *\n\t * Internal invariants:\n\t * - head and tail are always present, may be same for empty\n\t * - tail item is always empty/eof\n\t * - non-empty items are never 0 bytes\n\t * - adjacent list items are always continguous\n\t * - empty items are never adjacent to each other\n\t */\n\n\tvar CachePool = function () {\n\t  function CachePool() {\n\t    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t    var _ref$cacheSize = _ref.cacheSize;\n\t    var cacheSize = _ref$cacheSize === undefined ? 0 : _ref$cacheSize;\n\n\t    _classCallCheck(this, CachePool);\n\n\t    var eof = new CacheItem({ eof: true });\n\t    this.head = eof;\n\t    this.tail = eof;\n\t    this.readOffset = 0;\n\t    this.readCursor = eof;\n\t    this.writeOffset = 0;\n\t    this.writeCursor = eof;\n\t    this.cacheSize = cacheSize;\n\t  }\n\n\t  /**\n\t   * Is the read cursor at the end of the file?\n\t   */\n\n\n\t  _createClass(CachePool, [{\n\t    key: 'bytesReadable',\n\n\n\t    /**\n\t     * Count how many bytes are available from the given offset.\n\t     * @param {number} max - optional maximum to read\n\t     * @returns {number} 0 or more\n\t     */\n\t    value: function bytesReadable() {\n\t      var max = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;\n\n\t      var offset = this.readOffset;\n\t      var cursor = this.readCursor;\n\t      var last = cursor.last(function (item) {\n\t        return !item.empty && item.start <= offset + max;\n\t      });\n\t      if (last) {\n\t        return Math.min(max, last.end - offset);\n\t      }\n\t      return 0;\n\t    }\n\n\t    /**\n\t     * Count how many bytes are available to write.\n\t     * @param {number} max - optional maximum to write\n\t     * @returns {number} 0 or more, or +Infinity\n\t     */\n\n\t  }, {\n\t    key: 'bytesWritable',\n\t    value: function bytesWritable() {\n\t      var max = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;\n\n\t      var offset = this.writeOffset;\n\t      var cursor = this.writeCursor;\n\t      if (cursor.eof) {\n\t        return max;\n\t      }\n\t      var last = cursor.last(function (item) {\n\t        return item.empty && item.start <= offset + max;\n\t      });\n\t      if (last) {\n\t        return Math.min(max, last.end - offset);\n\t      }\n\t      return 0;\n\t    }\n\n\t    /**\n\t     * Move the read head to a given offset. The read head can move beyond the\n\t     * currently known end of the file, but cannot move before 0.\n\t     * @param {number} offset - bytes from beginning of virtual file to read from\n\t     */\n\n\t  }, {\n\t    key: 'seekRead',\n\t    value: function seekRead(offset) {\n\t      var target = this.head.first(function (item) {\n\t        return item.contains(offset);\n\t      });\n\t      if (!target) {\n\t        throw new Error('read seek out of range');\n\t      }\n\t      this.readOffset = offset;\n\t      this.readCursor = target;\n\t    }\n\n\t    /**\n\t     * Move the write head to a given offset. The write head can move beyond the\n\t     * currently known end of the file, but cannot move before 0.\n\t     * @param {number} offset - bytes from beginning of virtual file to write to\n\t     */\n\n\t  }, {\n\t    key: 'seekWrite',\n\t    value: function seekWrite(offset) {\n\t      var target = this.head.first(function (item) {\n\t        return item.contains(offset);\n\t      });\n\t      if (!target) {\n\t        throw new Error('write seek out of range');\n\t      }\n\t      this.writeOffset = offset;\n\t      this.writeCursor = target;\n\t    }\n\n\t    /**\n\t     * Read up to the requested number of bytes, or however much is available\n\t     * in the buffer until the next empty segment, and advance the read head.\n\t     *\n\t     * Returns immediately.\n\t     *\n\t     * @param {Uint8Array} dest - destination array to read to\n\t     * @returns {number} - count of bytes actually read\n\t     */\n\n\t  }, {\n\t    key: 'readBytes',\n\t    value: function readBytes(dest) {\n\t      var nbytes = dest.byteLength;\n\t      var len = this.bytesReadable(nbytes);\n\t      var start = this.readOffset;\n\t      var end = start + len;\n\n\t      var readHead = start;\n\t      var writeHead = 0;\n\t      for (var item = this.readCursor; item; item = item.next) {\n\t        if (item.empty) {\n\t          break;\n\t        }\n\t        if (item.start >= end) {\n\t          break;\n\t        }\n\t        var readTail = Math.min(end, item.end);\n\t        var chunk = dest.subarray(readHead - start, readTail - start);\n\t        item.readBytes(chunk, readHead, readTail);\n\t        readHead = readTail;\n\t      }\n\t      this.readOffset = readHead;\n\t      this.readCursor = this.readCursor.first(function (item) {\n\t        return item.contains(readHead);\n\t      });\n\n\t      return len;\n\t    }\n\n\t    /**\n\t     * Write a data buffer at the write head and advance the write head.\n\t     * The data must fit in the available empty space in the buffer cache.\n\t     * @param {ArrayBuffer|String} buffer\n\t     */\n\n\t  }, {\n\t    key: 'write',\n\t    value: function write(buffer) {\n\t      var item = this.bufferItem(buffer);\n\t      var cursor = this.writeCursor;\n\n\t      if (!cursor.empty) {\n\t        throw new Error('write cursor not empty');\n\t      }\n\t      if (!cursor.contains(item.end) && cursor.end !== item.end) {\n\t        throw new Error('write cursor too small');\n\t      }\n\n\t      if (cursor.start < item.start) {\n\t        this.split(cursor, item.start);\n\t        cursor = this.writeCursor;\n\t      }\n\n\t      if (item.end < cursor.end || cursor.eof) {\n\t        this.split(cursor, item.end);\n\t        cursor = this.writeCursor;\n\t      }\n\n\t      this.splice(cursor, cursor, item, item);\n\t      this.writeOffset = item.end;\n\t      this.writeCursor = item.next;\n\n\t      this.gc();\n\t    }\n\t  }, {\n\t    key: 'bufferItem',\n\t    value: function bufferItem(buffer) {\n\t      if (buffer instanceof ArrayBuffer) {\n\t        return new CacheItem({\n\t          start: this.writeOffset,\n\t          end: this.writeOffset + buffer.byteLength,\n\t          buffer: buffer\n\t        });\n\t      } else if (typeof buffer === 'string') {\n\t        return new CacheItem({\n\t          start: this.writeOffset,\n\t          end: this.writeOffset + buffer.length,\n\t          string: buffer\n\t        });\n\t      } else {\n\t        throw new Error('invalid input to write');\n\t      }\n\t    }\n\t  }, {\n\t    key: 'split',\n\t    value: function split(oldItem, offset) {\n\t      var items = oldItem.split(offset);\n\t      this.splice(oldItem, oldItem, items[0], items[1]);\n\t    }\n\n\t    /**\n\t     * Return an array of arrays of consolidated cached ranges\n\t     */\n\n\t  }, {\n\t    key: 'ranges',\n\t    value: function ranges() {\n\t      var ranges = [];\n\n\t      for (var item = this.head; item; item = item.next) {\n\t        if (item.empty) {\n\t          continue;\n\t        }\n\t        var start = item;\n\t        item = item.last(function (i) {\n\t          return !i.empty;\n\t        });\n\t        ranges.push([start.start, item.end]);\n\t      }\n\n\t      return ranges;\n\t    }\n\t  }, {\n\t    key: 'gc',\n\t    value: function gc() {\n\t      // Simple gc: look at anything not between read head and write head,\n\t      // and discard the oldest items until we have room\n\t      var cachedBytes = 0;\n\t      var candidates = [];\n\t      for (var item = this.head; item; item = item.next) {\n\t        if (!item.empty) {\n\t          cachedBytes += item.length;\n\t          if (item.end < this.readOffset || item.start > this.readOffset + this.chunkSize) {\n\t            // Not in the 'hot' readahead range\n\t            candidates.push(item);\n\t          }\n\t        }\n\t      }\n\t      if (cachedBytes > this.cacheSize) {\n\t        candidates.sort(function (a, b) {\n\t          return a.timestamp - b.timestamp;\n\t        });\n\n\t        for (var i = 0; i < candidates.length; i++) {\n\t          var _item = candidates[i];\n\t          if (cachedBytes <= this.cacheSize) {\n\t            break;\n\t          }\n\t          this.remove(_item);\n\t          cachedBytes -= _item.length;\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: 'remove',\n\t    value: function remove(item) {\n\t      var replacement = new CacheItem({\n\t        start: item.start,\n\t        end: item.end\n\t      });\n\t      this.splice(item, item, replacement, replacement);\n\t      item = replacement;\n\n\t      // Consolidate adjacent ranges\n\t      if (item.prev && item.prev.empty) {\n\t        item = this.consolidate(item.prev);\n\t      }\n\t      if (item.next && item.next.empty && !item.next.eof) {\n\t        item = this.consolidate(item);\n\t      }\n\t      if (item.start === 0) {\n\t        this.head = item;\n\t      }\n\t    }\n\t  }, {\n\t    key: 'consolidate',\n\t    value: function consolidate(first) {\n\t      var last = first.last(function (item) {\n\t        return item.empty && !item.eof;\n\t      });\n\t      var replacement = new CacheItem({\n\t        start: first.start,\n\t        end: last.end\n\t      });\n\t      this.splice(first, last, replacement, replacement);\n\t      return replacement;\n\t    }\n\t  }, {\n\t    key: 'splice',\n\t    value: function splice(oldHead, oldTail, newHead, newTail) {\n\t      var _this = this;\n\n\t      if (oldHead.start !== newHead.start) {\n\t        throw new Error('invalid splice head');\n\t      }\n\t      if (oldTail.end !== newTail.end) {\n\t        if (oldTail.eof && newTail.eof) {\n\t          // only eof is expandable\n\t        } else {\n\t          throw new Error('invalid splice tail');\n\t        }\n\t      }\n\t      var prev = oldHead.prev;\n\t      var next = oldTail.next;\n\n\t      oldHead.prev = null;\n\t      oldTail.next = null;\n\n\t      if (prev) {\n\t        prev.next = newHead;\n\t        newHead.prev = prev;\n\t      }\n\t      if (next) {\n\t        next.prev = newTail;\n\t        newTail.next = next;\n\t      }\n\n\t      if (oldHead === this.head) {\n\t        this.head = newHead;\n\t      }\n\t      if (oldTail === this.tail) {\n\t        this.tail = newTail;\n\t      }\n\t      this.readCursor = this.head.first(function (item) {\n\t        return item.contains(_this.readOffset);\n\t      });\n\t      this.writeCursor = this.head.first(function (item) {\n\t        return item.contains(_this.writeOffset);\n\t      });\n\t    }\n\t  }, {\n\t    key: 'eof',\n\t    get: function get() {\n\t      return this.readCursor.eof;\n\t    }\n\t  }]);\n\n\t  return CachePool;\n\t}();\n\n\tmodule.exports = CachePool;\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\n\t\"use strict\";\n\n\t/**\n\t * Double-linked list cache items\n\t */\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar CacheItem = function () {\n\t  function CacheItem() {\n\t    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t    var _ref$buffer = _ref.buffer;\n\t    var buffer = _ref$buffer === undefined ? undefined : _ref$buffer;\n\t    var _ref$string = _ref.string;\n\t    var string = _ref$string === undefined ? undefined : _ref$string;\n\t    var _ref$start = _ref.start;\n\t    var start = _ref$start === undefined ? 0 : _ref$start;\n\t    var _ref$end = _ref.end;\n\t    var end = _ref$end === undefined ? start + (buffer ? buffer.byteLength : string ? string.length : 0) : _ref$end;\n\t    var _ref$prev = _ref.prev;\n\t    var prev = _ref$prev === undefined ? null : _ref$prev;\n\t    var _ref$next = _ref.next;\n\t    var next = _ref$next === undefined ? null : _ref$next;\n\t    var _ref$eof = _ref.eof;\n\t    var eof = _ref$eof === undefined ? false : _ref$eof;\n\t    var _ref$empty = _ref.empty;\n\t    var empty = _ref$empty === undefined ? !(buffer || string) : _ref$empty;\n\t    var _ref$timestamp = _ref.timestamp;\n\t    var timestamp = _ref$timestamp === undefined ? Date.now() : _ref$timestamp;\n\n\t    _classCallCheck(this, CacheItem);\n\n\t    this.start = start;\n\t    this.end = end;\n\t    this.prev = prev;\n\t    this.next = next;\n\t    this.eof = eof;\n\t    this.empty = empty;\n\t    this.timestamp = timestamp;\n\t    this.buffer = buffer;\n\t    this.string = string;\n\t    Object.defineProperty(this, 'length', {\n\t      get: function get() {\n\t        return this.end - this.start;\n\t      }\n\t    });\n\t  }\n\n\t  /**\n\t   * True if this cache item contains the given byte offset.\n\t   * False if outside.\n\t   */\n\n\n\t  _createClass(CacheItem, [{\n\t    key: 'contains',\n\t    value: function contains(offset) {\n\t      return offset >= this.start && (offset < this.end || this.eof);\n\t    }\n\t  }, {\n\t    key: 'readBytes',\n\t    value: function readBytes(dest, start, end) {\n\t      var readHead = start - this.start;\n\t      var len = end - start;\n\t      if (this.buffer) {\n\t        var sourceBytes = new Uint8Array(this.buffer, readHead, len);\n\t        dest.set(sourceBytes);\n\t      } else if (this.string) {\n\t        var chunk = this.string;\n\t        for (var i = 0; i < len; i++) {\n\t          dest[i] = chunk.charCodeAt(readHead + i);\n\t        }\n\t      } else {\n\t        throw new Error('invalid state');\n\t      }\n\t      this.timestamp = Date.now();\n\t    }\n\t  }, {\n\t    key: 'split',\n\t    value: function split(offset) {\n\t      if (!this.empty || !this.contains(offset)) {\n\t        throw new Error('invalid split');\n\t      }\n\t      var a = new CacheItem({\n\t        start: this.start,\n\t        end: offset\n\t      });\n\t      var b = new CacheItem({\n\t        start: offset,\n\t        end: this.eof ? offset : this.end,\n\t        eof: this.eof\n\t      });\n\t      a.next = b;\n\t      b.prev = a;\n\t      return [a, b];\n\t    }\n\n\t    /**\n\t     * Iterate forwards, returning the first element matching the callback.\n\t     * @param {function} callback - return true for a match on item\n\t     * @returns {CacheItem|null} - matching item or null if none found\n\t     */\n\n\t  }, {\n\t    key: 'first',\n\t    value: function first(callback) {\n\t      for (var item = this; item; item = item.next) {\n\t        if (callback(item)) {\n\t          return item;\n\t        }\n\t      }\n\t      return null;\n\t    }\n\n\t    /**\n\t     * Iterate forwards, returning the last element matching the callback before\n\t     * reaching one that doesn't match or we find the end.\n\t     * @param {function} callback - return true for a match on item\n\t     * @returns {CacheItem|null} - matching item or null if none found\n\t     */\n\n\t  }, {\n\t    key: 'last',\n\t    value: function last(callback) {\n\t      var last = null;\n\t      for (var item = this; item; item = item.next) {\n\t        if (!callback(item)) {\n\t          break;\n\t        }\n\t        last = item;\n\t      }\n\t      return last;\n\t    }\n\t  }]);\n\n\t  return CacheItem;\n\t}();\n\n\tmodule.exports = CacheItem;\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar MozChunkedBackend = __webpack_require__(25);\n\tvar MSStreamBackend = __webpack_require__(28);\n\tvar BinaryStringBackend = __webpack_require__(29);\n\n\tfunction autoselect() {\n\t  if (MozChunkedBackend.supported()) {\n\t    return MozChunkedBackend;\n\t  } else if (BinaryStringBackend.supported()) {\n\t    return BinaryStringBackend;\n\t  } else if (MSStreamBackend.supported()) {\n\t    return MSStreamBackend;\n\t  } else {\n\t    return null;\n\t  }\n\t}\n\n\tvar backendClass = null;\n\n\tfunction instantiate(options) {\n\t  if (!backendClass) {\n\t    backendClass = autoselect();\n\t  }\n\t  if (!backendClass) {\n\t    throw new Error('No supported backend class');\n\t  }\n\t  return new backendClass(options);\n\t}\n\n\tmodule.exports = instantiate;\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar DownloadBackend = __webpack_require__(26);\n\n\tvar type = 'moz-chunked-arraybuffer';\n\n\tvar MozChunkedBackend = function (_DownloadBackend) {\n\t  _inherits(MozChunkedBackend, _DownloadBackend);\n\n\t  function MozChunkedBackend() {\n\t    _classCallCheck(this, MozChunkedBackend);\n\n\t    return _possibleConstructorReturn(this, (MozChunkedBackend.__proto__ || Object.getPrototypeOf(MozChunkedBackend)).apply(this, arguments));\n\t  }\n\n\t  _createClass(MozChunkedBackend, [{\n\t    key: 'initXHR',\n\t    value: function initXHR() {\n\t      _get(MozChunkedBackend.prototype.__proto__ || Object.getPrototypeOf(MozChunkedBackend.prototype), 'initXHR', this).call(this);\n\t      this.xhr.responseType = type;\n\t    }\n\t  }, {\n\t    key: 'onXHRProgress',\n\t    value: function onXHRProgress() {\n\t      var buffer = this.xhr.response;\n\t      this.bytesRead += buffer.byteLength;\n\t      this.emit('buffer', buffer);\n\t    }\n\t  }]);\n\n\t  return MozChunkedBackend;\n\t}(DownloadBackend);\n\n\tMozChunkedBackend.supported = function () {\n\t  try {\n\t    var xhr = new XMLHttpRequest();\n\t    xhr.responseType = type;\n\t    return xhr.responseType === type;\n\t  } catch (e) {\n\t    return false;\n\t  }\n\t};\n\n\tmodule.exports = MozChunkedBackend;\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Backend = __webpack_require__(27);\n\n\t/**\n\t * Backend for progressive downloading.\n\t * Subclasses handle details of strings/buffers.\n\t */\n\n\tvar DownloadBackend = function (_Backend) {\n\t  _inherits(DownloadBackend, _Backend);\n\n\t  function DownloadBackend() {\n\t    _classCallCheck(this, DownloadBackend);\n\n\t    return _possibleConstructorReturn(this, (DownloadBackend.__proto__ || Object.getPrototypeOf(DownloadBackend)).apply(this, arguments));\n\t  }\n\n\t  _createClass(DownloadBackend, [{\n\t    key: 'bufferToOffset',\n\t    value: function bufferToOffset(end) {\n\t      var _this2 = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        if (_this2.eof || _this2.offset >= end) {\n\t          resolve();\n\t        } else {\n\t          (function () {\n\t            var oncomplete = null;\n\t            _this2._onAbort = function (err) {\n\t              oncomplete();\n\t              reject(reason);\n\t            };\n\n\t            var checkBuffer = function checkBuffer() {\n\t              if (_this2.offset >= end && !_this2.eof) {\n\t                oncomplete();\n\t                resolve();\n\t              }\n\t            };\n\t            var checkDone = function checkDone() {\n\t              oncomplete();\n\t              resolve();\n\t            };\n\t            var checkError = function checkError() {\n\t              oncomplete();\n\t              reject(new Error('error streaming'));\n\t            };\n\n\t            oncomplete = function oncomplete() {\n\t              _this2.buffering = false;\n\t              _this2.off('buffer', checkBuffer);\n\t              _this2.off('done', checkDone);\n\t              _this2.off('error', checkError);\n\t              _this2._onAbort = null;\n\t            };\n\n\t            _this2.buffering = true;\n\t            _this2.on('buffer', checkBuffer);\n\t            _this2.on('done', checkDone);\n\t            _this2.on('error', checkError);\n\t          })();\n\t        }\n\t      });\n\t    }\n\t  }, {\n\t    key: 'initXHR',\n\t    value: function initXHR() {\n\t      _get(DownloadBackend.prototype.__proto__ || Object.getPrototypeOf(DownloadBackend.prototype), 'initXHR', this).call(this);\n\t    }\n\t  }, {\n\t    key: 'onXHRStart',\n\t    value: function onXHRStart() {\n\t      var _this3 = this;\n\n\t      // Event handlers to drive output\n\t      this.xhr.addEventListener('progress', function () {\n\t        return _this3.onXHRProgress();\n\t      });\n\t      this.xhr.addEventListener('error', function () {\n\t        return _this3.onXHRError();\n\t      });\n\t      this.xhr.addEventListener('load', function () {\n\t        return _this3.onXHRLoad();\n\t      });\n\n\t      this.emit('open');\n\t    }\n\t  }, {\n\t    key: 'onXHRProgress',\n\t    value: function onXHRProgress() {\n\t      throw new Error('abstract');\n\t    }\n\t  }, {\n\t    key: 'onXHRError',\n\t    value: function onXHRError() {\n\t      this.emit('error');\n\t    }\n\t  }, {\n\t    key: 'onXHRLoad',\n\t    value: function onXHRLoad() {\n\t      this.eof = true;\n\t      this.emit('done');\n\t    }\n\t  }]);\n\n\t  return DownloadBackend;\n\t}(Backend);\n\n\tmodule.exports = DownloadBackend;\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar TinyEvents = __webpack_require__(20);\n\n\t/**\n\t * Extract the file's total length from the XHR returned headers.\n\t * @returns {number} - byte length or -1\n\t * @access private\n\t */\n\tfunction getXHRLength(xhr) {\n\t  if (xhr.status == 206) {\n\t    return getXHRRangeTotal(xhr);\n\t  } else {\n\t    var contentLength = xhr.getResponseHeader('Content-Length');\n\t    if (contentLength === null || contentLength === '') {\n\t      // Unknown file length... maybe streaming live?\n\t      return -1;\n\t    } else {\n\t      return parseInt(contentLength, 10);\n\t    }\n\t  }\n\t}\n\n\t/**\n\t * Extract the range chunk info from the XHR returned headers.\n\t * @returns {Array} - byte length or -1\n\t * @access private\n\t */\n\tfunction getXHRRangeMatches(xhr) {\n\t  // Note Content-Range must be whitelisted for CORS requests\n\t  var contentRange = xhr.getResponseHeader('Content-Range');\n\t  return contentRange && contentRange.match(/^bytes (\\d+)-(\\d+)\\/(\\d+)/);\n\t}\n\n\t/**\n\t * Extract the chunk start position from the XHR returned headers.\n\t * @returns {number} - byte position or 0\n\t * @access private\n\t */\n\tfunction getXHRRangeStart(xhr) {\n\t  var matches = getXHRRangeMatches(xhr);\n\t  if (matches) {\n\t    return parseInt(matches[1], 10);\n\t  } else {\n\t    return 0;\n\t  }\n\t}\n\n\t/**\n\t * Extract the file's total length from the XHR returned headers.\n\t * @returns {number} - byte length or -1\n\t * @access private\n\t */\n\tfunction getXHRRangeTotal(xhr) {\n\t  var matches = getXHRRangeMatches(xhr);\n\t  if (matches) {\n\t    return parseInt(matches[3], 10);\n\t  } else {\n\t    return -1;\n\t  }\n\t}\n\n\t/**\n\t * Record the HTTP headers from the initial request, in case some are useful.\n\t * @returns {Object} map of headers\n\t * @access private\n\t */\n\tfunction getXHRHeaders(xhr) {\n\t  var headers = {};\n\t  var headerLines = xhr.getAllResponseHeaders().split(/\\n/);\n\t  headerLines.forEach(function (line) {\n\t    var bits = line.split(/:\\s*/, 2);\n\t    if (bits.length > 1) {\n\t      headers[bits[0].toLowerCase()] = bits[1];\n\t    }\n\t  });\n\t  return headers;\n\t}\n\n\t/**\n\t * Represents a single HTTP request pass through part of a URL.\n\t *\n\t * Subclasses handle details of chunking/strings/streams and provide\n\t * a unified internal API.\n\t *\n\t * Events sent:\n\t * - 'open' - called when file metadata ready\n\t * - 'buffer' - passes a BufferSegment in with some new data\n\t * - 'done' - called at end of file\n\t * - 'error' - called in case of error\n\t * - 'cachever' - triggered when old Safari caching bug found\n\t */\n\n\tvar Backend = function (_TinyEvents) {\n\t  _inherits(Backend, _TinyEvents);\n\n\t  function Backend(_ref) {\n\t    var url = _ref.url;\n\t    var offset = _ref.offset;\n\t    var length = _ref.length;\n\t    var _ref$cachever = _ref.cachever;\n\t    var cachever = _ref$cachever === undefined ? 0 : _ref$cachever;\n\n\t    _classCallCheck(this, Backend);\n\n\t    var _this = _possibleConstructorReturn(this, (Backend.__proto__ || Object.getPrototypeOf(Backend)).call(this));\n\n\t    _this.url = url;\n\t    _this.offset = offset;\n\t    _this.length = length;\n\t    _this.cachever = cachever;\n\n\t    _this.loaded = false;\n\t    _this.seekable = false;\n\t    _this.headers = {};\n\t    _this.eof = false;\n\t    _this.bytesRead = 0;\n\t    _this.xhr = new XMLHttpRequest();\n\t    return _this;\n\t  }\n\n\t  _createClass(Backend, [{\n\t    key: 'load',\n\t    value: function load() {\n\t      var _this2 = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        var oncomplete = null;\n\t        _this2._onAbort = function (err) {\n\t          oncomplete();\n\t          reject(err);\n\t        };\n\t        var checkOpen = function checkOpen() {\n\t          // There doesn't seem to be a good match for readyState 2 on the XHR2 events model.\n\t          if (_this2.xhr.readyState == 2) {\n\t            if (_this2.xhr.status == 206) {\n\t              // Partial content -- we are streamable\n\t              var foundPosition = getXHRRangeStart(_this2.xhr);\n\t              if (_this2.offset != foundPosition) {\n\t                //\n\t                // Safari sometimes messes up and gives us the wrong chunk.\n\t                // Seems to be a general problem with Safari and cached XHR ranges.\n\t                //\n\t                // Interestingly, it allows you to request _later_ ranges successfully,\n\t                // but when requesting _earlier_ ranges it returns the latest one retrieved.\n\t                // So we only need to update the cache-buster when we rewind and actually\n\t                // get an incorrect range.\n\t                //\n\t                // https://bugs.webkit.org/show_bug.cgi?id=82672\n\t                //\n\t                console.log('Expected start at ' + _this2.offset + ' but got ' + foundPosition + '; working around Safari range caching bug: https://bugs.webkit.org/show_bug.cgi?id=82672');\n\t                _this2.cachever++;\n\t                _this2.emit('cachever');\n\t                _this2.abort();\n\t                oncomplete();\n\t                _this2.load().then(resolve).catch(reject);\n\t                return;\n\t              }\n\t              _this2.seekable = true;\n\t            }\n\t            if (_this2.xhr.status >= 200 && _this2.xhr.status < 300) {\n\t              _this2.length = getXHRLength(_this2.xhr);\n\t              _this2.headers = getXHRHeaders(_this2.xhr);\n\t              _this2.onXHRStart();\n\n\t              if (_this2.xhr.responseURL &&\n\t              \t\t_this2.xhr.responseURL.substr(0, 5) == 'data:') {\n\t\t              _this2.seekable = true;\n\t              }\n\t            } else {\n\t              oncomplete();\n\t              reject(new Error('HTTP error ' + _this2.xhr.status));\n\t            }\n\t          }\n\t        };\n\t        var checkError = function checkError() {\n\t          oncomplete();\n\t          reject(new Error('network error'));\n\t        };\n\t        var checkBackendOpen = function checkBackendOpen() {\n\t          oncomplete();\n\t          resolve();\n\t        };\n\t        oncomplete = function oncomplete() {\n\t          _this2.xhr.removeEventListener('readystatechange', checkOpen);\n\t          _this2.xhr.removeEventListener('error', checkError);\n\t          _this2.off('open', checkBackendOpen);\n\t          _this2._onAbort = null;\n\t        };\n\n\t        _this2.initXHR();\n\n\t        // Events for the open promise\n\t        _this2.xhr.addEventListener('readystatechange', checkOpen);\n\t        _this2.xhr.addEventListener('error', checkError);\n\t        _this2.on('open', checkBackendOpen);\n\n\t        _this2.xhr.send();\n\t      });\n\t    }\n\n\t    /**\n\t     * Wait until we download up to the given offset, reach eof, or error out.\n\t     * Actual data will be returned via 'buffer' events in the meantime.\n\t     *\n\t     * Note that MSStream backend will need this to be called explicitly,\n\t     * while the other backends download progressively even without a call.\n\t     */\n\n\t  }, {\n\t    key: 'bufferToOffset',\n\t    value: function bufferToOffset(end) {\n\t      return Promise.reject(new Error('abstract'));\n\t    }\n\t  }, {\n\t    key: 'abort',\n\t    value: function abort() {\n\t      this.xhr.abort();\n\n\t      if (this._onAbort) {\n\t        var onAbort = this._onAbort;\n\t        this._onAbort = null;\n\n\t        var err = new Error('Aborted');\n\t        err.name = 'AbortError';\n\n\t        onAbort(err);\n\t      }\n\t    }\n\n\t    // ---------------\n\t    // Private methods\n\t    // ---------------\n\n\t  }, {\n\t    key: 'initXHR',\n\t    value: function initXHR() {\n\t      var getUrl = this.url;\n\t      if (this.cachever) {\n\t        //\n\t        // Safari sometimes messes up and gives us the wrong chunk.\n\t        // Seems to be a general problem with Safari and cached XHR ranges.\n\t        //\n\t        // Interestingly, it allows you to request _later_ ranges successfully,\n\t        // but when requesting _earlier_ ranges it returns the latest one retrieved.\n\t        // So we only need to update the cache-buster when we rewind.\n\t        //\n\t        // https://bugs.webkit.org/show_bug.cgi?id=82672\n\t        //\n\t        getUrl += '?buggy_cachever=' + this.cachever;\n\t      }\n\n\t      this.xhr.open(\"GET\", getUrl);\n\n\t      var range = null;\n\t      if (this.offset || this.length) {\n\t        range = 'bytes=' + this.offset + '-';\n\t      }\n\t      if (this.length) {\n\t        range += this.offset + this.length - 1;\n\t      }\n\t      if (range !== null) {\n\t        this.xhr.setRequestHeader('Range', range);\n\t      }\n\t    }\n\t  }, {\n\t    key: 'onXHRStart',\n\t    value: function onXHRStart() {\n\t      throw new Error('abstract');\n\t    }\n\t  }]);\n\n\t  return Backend;\n\t}(TinyEvents);\n\n\tmodule.exports = Backend;\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Backend = __webpack_require__(27);\n\n\tvar type = 'ms-stream';\n\n\tvar MSStreamBackend = function (_Backend) {\n\t  _inherits(MSStreamBackend, _Backend);\n\n\t  function MSStreamBackend(options) {\n\t    _classCallCheck(this, MSStreamBackend);\n\n\t    var _this = _possibleConstructorReturn(this, (MSStreamBackend.__proto__ || Object.getPrototypeOf(MSStreamBackend)).call(this, options));\n\n\t    _this.stream = null;\n\t    _this.streamReader = null;\n\t    return _this;\n\t  }\n\n\t  _createClass(MSStreamBackend, [{\n\t    key: 'initXHR',\n\t    value: function initXHR() {\n\t      _get(MSStreamBackend.prototype.__proto__ || Object.getPrototypeOf(MSStreamBackend.prototype), 'initXHR', this).call(this);\n\t      this.xhr.responseType = type;\n\t    }\n\t  }, {\n\t    key: 'onXHRStart',\n\t    value: function onXHRStart() {\n\t      var _this2 = this;\n\n\t      var checkProgress = function checkProgress() {\n\t        if (_this2.xhr.readyState === 3) {\n\t          // We don't get the stream until readyState 3, and it's gone after load.\n\t          _this2.stream = _this2.xhr.response;\n\t          _this2.xhr.removeEventListener('readystatechange', checkProgress);\n\t          _this2.emit('open');\n\t        }\n\t      };\n\t      this.xhr.addEventListener('readystatechange', checkProgress);\n\t    }\n\t  }, {\n\t    key: 'waitForStream',\n\t    value: function waitForStream() {\n\t      var _this3 = this;\n\n\t      return new Promise(function (resolve, reject) {\n\t        if (_this3.stream) {\n\t          resolve(_this3.stream);\n\t        } else {\n\t          (function () {\n\t            var oncomplete = null;\n\t            _this3._onAbort = function (err) {\n\t              oncomplete();\n\t              reject(err);\n\t            };\n\t            var checkStart = function checkStart() {\n\t              resolve(_this3.stream);\n\t            };\n\t            oncomplete = function oncomplete() {\n\t              _this3.off('open', checkStart);\n\t              _this3._onAbort = null;\n\t            };\n\t            _this3.on('open', checkStart);\n\t          })();\n\t        }\n\t      });\n\t    }\n\n\t    /**\n\t     * Trigger further download of bytes\n\t     * @returns {Promise}\n\t     */\n\n\t  }, {\n\t    key: 'bufferToOffset',\n\t    value: function bufferToOffset(end) {\n\t      var _this4 = this;\n\n\t      return this.waitForStream().then(function (stream) {\n\t        return new Promise(function (resolve, reject) {\n\t          if (_this4.streamReader) {\n\t            throw new Error('cannot trigger read when reading');\n\t          }\n\t          if (_this4.offset >= end || _this4.eof) {\n\t            resolve();\n\t          } else {\n\t            var nbytes = end - _this4.offset;\n\t            _this4.streamReader = new MSStreamReader();\n\t            _this4.streamReader.onload = function (event) {\n\t              _this4.streamReader = null;\n\t              var buffer = event.target.result;\n\t              if (buffer.byteLength > 0) {\n\t                _this4.bytesRead += buffer.byteLength;\n\t                _this4.emit('buffer', buffer);\n\t              } else {\n\t                // Zero length means end of stream.\n\t                _this4.eof = true;\n\t                _this4.emit('done');\n\t              }\n\t              resolve();\n\t            };\n\t            _this4.streamReader.onerror = function () {\n\t              _this4.streamReader = null;\n\t              _this4.stream = null;\n\t              _this4.emit('error');\n\t              reject(new Error('mystery error streaming'));\n\t            };\n\t            _this4._onAbort = function (err) {\n\t              _this4.streamReader.abort();\n\t              _this4.streamReader = null;\n\t              _this4.stream = null;\n\t              _this4.emit('error');\n\t              reject(reason);\n\t            };\n\t            _this4.streamReader.readAsArrayBuffer(stream, nbytes);\n\t          }\n\t        });\n\t      });\n\t    }\n\t  }, {\n\t    key: 'abort',\n\t    value: function abort() {\n\t      if (this.streamReader) {\n\t        this.streamReader.abort();\n\t        this.streamReader = null;\n\t      }\n\t      if (this.stream) {\n\t        this.stream.msClose();\n\t        this.stream = null;\n\t      }\n\t      _get(MSStreamBackend.prototype.__proto__ || Object.getPrototypeOf(MSStreamBackend.prototype), 'abort', this).call(this);\n\t    }\n\t  }]);\n\n\t  return MSStreamBackend;\n\t}(Backend);\n\n\tMSStreamBackend.supported = function () {\n\t  try {\n\t    var xhr = new XMLHttpRequest();\n\t    // IE demands that open() be called before we can set xhr.responseType\n\t    xhr.open(\"GET\", \"/robots.txt\");\n\t    xhr.responseType = type;\n\t    return xhr.responseType === type;\n\t  } catch (e) {\n\t    return false;\n\t  }\n\t};\n\n\tmodule.exports = MSStreamBackend;\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar DownloadBackend = __webpack_require__(26);\n\n\tvar BinaryStringBackend = function (_DownloadBackend) {\n\t  _inherits(BinaryStringBackend, _DownloadBackend);\n\n\t  function BinaryStringBackend() {\n\t    _classCallCheck(this, BinaryStringBackend);\n\n\t    return _possibleConstructorReturn(this, (BinaryStringBackend.__proto__ || Object.getPrototypeOf(BinaryStringBackend)).apply(this, arguments));\n\t  }\n\n\t  _createClass(BinaryStringBackend, [{\n\t    key: \"initXHR\",\n\t    value: function initXHR() {\n\t      _get(BinaryStringBackend.prototype.__proto__ || Object.getPrototypeOf(BinaryStringBackend.prototype), \"initXHR\", this).call(this);\n\t      this.xhr.responseType = \"text\";\n\t      this.xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t    }\n\t  }, {\n\t    key: \"onXHRProgress\",\n\t    value: function onXHRProgress() {\n\t      var slice = this.xhr.responseText.slice(this.bytesRead);\n\t      if (slice.length > 0) {\n\t        this.bytesRead += slice.length;\n\t        this.emit('buffer', slice);\n\t      }\n\t    }\n\t  }, {\n\t    key: \"onXHRLoad\",\n\t    value: function onXHRLoad() {\n\t      // We may or may not get that final event\n\t      this.onXHRProgress();\n\t      _get(BinaryStringBackend.prototype.__proto__ || Object.getPrototypeOf(BinaryStringBackend.prototype), \"onXHRLoad\", this).call(this);\n\t    }\n\t  }]);\n\n\t  return BinaryStringBackend;\n\t}(DownloadBackend);\n\n\tBinaryStringBackend.supported = function () {\n\t  try {\n\t    var xhr = new XMLHttpRequest();\n\t    return !!xhr.overrideMimeType;\n\t  } catch (e) {\n\t    return false;\n\t  }\n\t};\n\n\tmodule.exports = BinaryStringBackend;\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t(function webpackUniversalModuleDefinition(root, factory) {\n\t\tif(true)\n\t\t\tmodule.exports = factory();\n\t\telse if(typeof define === 'function' && define.amd)\n\t\t\tdefine([], factory);\n\t\telse if(typeof exports === 'object')\n\t\t\texports[\"AudioFeeder\"] = factory();\n\t\telse\n\t\t\troot[\"AudioFeeder\"] = factory();\n\t})(this, function() {\n\treturn /******/ (function(modules) { // webpackBootstrap\n\t/******/ \t// The module cache\n\t/******/ \tvar installedModules = {};\n\n\t/******/ \t// The require function\n\t/******/ \tfunction __webpack_require__(moduleId) {\n\n\t/******/ \t\t// Check if module is in cache\n\t/******/ \t\tif(installedModules[moduleId])\n\t/******/ \t\t\treturn installedModules[moduleId].exports;\n\n\t/******/ \t\t// Create a new module (and put it into the cache)\n\t/******/ \t\tvar module = installedModules[moduleId] = {\n\t/******/ \t\t\texports: {},\n\t/******/ \t\t\tid: moduleId,\n\t/******/ \t\t\tloaded: false\n\t/******/ \t\t};\n\n\t/******/ \t\t// Execute the module function\n\t/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t/******/ \t\t// Flag the module as loaded\n\t/******/ \t\tmodule.loaded = true;\n\n\t/******/ \t\t// Return the exports of the module\n\t/******/ \t\treturn module.exports;\n\t/******/ \t}\n\n\n\t/******/ \t// expose the modules object (__webpack_modules__)\n\t/******/ \t__webpack_require__.m = modules;\n\n\t/******/ \t// expose the module cache\n\t/******/ \t__webpack_require__.c = installedModules;\n\n\t/******/ \t// __webpack_public_path__\n\t/******/ \t__webpack_require__.p = \"\";\n\n\t/******/ \t// Load entry module and return exports\n\t/******/ \treturn __webpack_require__(0);\n\t/******/ })\n\t/************************************************************************/\n\t/******/ ([\n\t/* 0 */\n\t/***/ function(module, exports, __webpack_require__) {\n\n\t\t(function() {\n\n\t\t\tvar BufferQueue = __webpack_require__(1),\n\t\t\t\tWebAudioBackend = __webpack_require__(2),\n\t\t\t\tFlashBackend = __webpack_require__(4);\n\n\n\t\t\t/**\n\t\t\t * Audio sample buffer format passed to {@link AudioFeeder#bufferData} and its backends.\n\t\t\t *\n\t\t\t * Buffers are arrays containing one Float32Array of sample data\n\t\t\t * per channel. Channel counts must match the expected value, and\n\t\t\t * all channels within a buffer must have the same length in samples.\n\t\t\t *\n\t\t\t * Since input data may be stored for a while before being taken\n\t\t\t * back out, be sure that your Float32Arrays for channel data are\n\t\t\t * standalone, not backed on an ArrayBuffer that might change!\n\t\t\t *\n\t\t\t * @typedef {SampleBuffer} SampleBuffer\n\t\t\t * @todo consider replacing this with AudioBuffer-like wrapper object\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Object dictionary format used to pass options into {@link AudioFeeder} and its backends.\n\t\t\t *\n\t\t\t * @typedef {Object} AudioFeederOptions\n\t\t\t * @property {string} base - (optional) base URL to find additional resources in,\n\t\t\t *                           such as the Flash audio output shim\n\t\t\t * @property {AudioContext} audioContext - (optional) Web Audio API AudioContext\n\t\t\t *                          instance to use inplace of creating a default one\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Object dictionary format returned from {@link AudioFeeder#getPlaybackState} and friends.\n\t\t\t *\n\t\t\t * @typedef {Object} PlaybackState\n\t\t\t * @property {number} playbackPosition - total seconds so far of audio data that have played\n\t\t\t * @property {number} samplesQueued - number of samples at target rate that are queued up for playback\n\t\t\t * @property {number} dropped - number of underrun events, when we had to play silence due to data starvation\n\t\t\t * @property {number} delayedTime - total seconds so far of silent time during playback due to data starvation\n\t\t\t * @todo drop 'dropped' in favor of delayedTime\n\t\t\t * @todo replace sampledQueued with a time unit?\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Object that we can throw audio data into and have it drain out.\n\t\t\t * @class\n\t\t\t * @param {AudioFeederOptions} options - dictionary of config settings\n\t\t\t *\n\t\t\t * @classdesc\n\t\t\t * Object that we can throw audio data into and have it drain out.\n\t\t\t */\n\t\t\tfunction AudioFeeder(options) {\n\t\t\t\tthis._options = options || {};\n\t\t\t\tthis._backend = null; // AudioBackend instance, after init...\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Sample rate in Hz, as requested by the caller in {@link AudioFeeder#init}.\n\t\t\t *\n\t\t\t * If the backend's actual sample rate differs from this requested rate,\n\t\t\t * input data will be resampled automatically.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @readonly\n\t\t\t * @see AudioFeeder#targetRate\n\t\t\t */\n\t\t\tAudioFeeder.prototype.rate = 0;\n\n\t\t\t/**\n\t\t\t * Actual output sample rate in Hz, as provided by the backend.\n\t\t\t * This may differ from the rate requested, in which case input data\n\t\t\t * will be resampled automatically.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @readonly\n\t\t\t * @see AudioFeeder#rate\n\t\t\t */\n\t\t\tAudioFeeder.prototype.targetRate = 0;\n\n\t\t\t/**\n\t\t\t * Number of output channels, as requested by the caller in {@link AudioFeeder#init}.\n\t\t\t *\n\t\t\t * If the backend's actual channel count differs from this requested count,\n\t\t\t * input data will be resampled automatically.\n\t\t\t *\n\t\t\t * Warning: currently more than 2 channels may result in additional channels\n\t\t\t * being cropped out, as downmixing has not yet been implemented.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @readonly\n\t\t\t */\n\t\t\tAudioFeeder.prototype.channels = 0;\n\n\t\t\t/**\n\t\t\t * Size of output buffers in samples, as a hint for latency/scheduling\n\t\t\t * @type {number}\n\t\t\t * @readonly\n\t\t\t */\n\t\t\tAudioFeeder.prototype.bufferSize = 0;\n\n\t\t\t/**\n\t\t\t * Duration of the minimum buffer size, in seconds.\n\t\t\t * If the amount of buffered data falls below this,\n\t\t\t * caller will receive a synchronous 'starved' event\n\t\t\t * with a last chance to buffer more data.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @readonly\n\t\t\t */\n\t\t\tObject.defineProperty(AudioFeeder.prototype, 'bufferDuration', {\n\t\t\t\tget: function getBufferDuration() {\n\t\t\t\t\tif (this.targetRate) {\n\t\t\t\t\t\treturn this.bufferSize / this.targetRate;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Duration of remaining data at which a 'bufferlow' event will be\n\t\t\t * triggered, in seconds.\n\t\t\t *\n\t\t\t * This defaults to twice bufferDuration, but can be overridden.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tObject.defineProperty(AudioFeeder.prototype, 'bufferThreshold', {\n\t\t\t\tget: function getBufferThreshold() {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\treturn this._backend.bufferThreshold / this.targetRate;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tset: function setBufferThreshold(val) {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\tthis._backend.bufferThreshold = Math.round(val * this.targetRate);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'Invalid state: AudioFeeder cannot set bufferThreshold before init';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Current playback position, in seconds.\n\t\t\t * This compensates for drops and underruns, and is suitable for a/v sync.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @readonly\n\t\t\t */\n\t\t\tObject.defineProperty(AudioFeeder.prototype, 'playbackPosition', {\n\t\t\t\tget: function getPlaybackPosition() {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\tvar playbackState = this.getPlaybackState();\n\t\t\t\t\t\treturn playbackState.playbackPosition;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Duration of remaining queued data, in seconds.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tObject.defineProperty(AudioFeeder.prototype, 'durationBuffered', {\n\t\t\t\tget: function getDurationBuffered() {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\tvar playbackState = this.getPlaybackState();\n\t\t\t\t\t\treturn playbackState.samplesQueued / this.targetRate;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Is the feeder currently set to mute output?\n\t\t\t * When muted, this overrides the volume property.\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tObject.defineProperty(AudioFeeder.prototype, 'muted', {\n\t\t \t\tget: function getMuted() {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\treturn this._backend.muted;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'Invalid state: cannot get mute before init';\n\t\t\t\t\t}\n\t\t \t\t},\n\t\t \t\tset: function setMuted(val) {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\tthis._backend.muted = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'Invalid state: cannot set mute before init';\n\t\t\t\t\t}\n\t\t \t\t}\n\t\t \t});\n\n\t\t\t/**\n\t\t\t * @deprecated in favor of muted and volume properties\n\t\t\t */\n\t\t\tAudioFeeder.prototype.mute = function() {\n\t\t\t\tthis.muted = true;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t* @deprecated in favor of muted and volume properties\n\t\t\t */\n\t\t\tAudioFeeder.prototype.unmute = function() {\n\t\t\t\tthis.muted = false;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Volume multiplier, defaults to 1.0.\n\t\t\t * @name volume\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tObject.defineProperty(AudioFeeder.prototype, 'volume', {\n\t\t\t\tget: function getVolume() {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\treturn this._backend.volume;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'Invalid state: cannot get volume before init';\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tset: function setVolume(val) {\n\t\t\t\t\tif (this._backend) {\n\t\t\t\t\t\tthis._backend.volume = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'Invalid state: cannot set volume before init';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Start setting up for output with the given channel count and sample rate.\n\t\t\t * Audio data you provide will be resampled if necessary to whatever the\n\t\t\t * backend actually supports.\n\t\t\t *\n\t\t\t * @param {number} numChannels - requested number of channels (output may differ)\n\t\t\t * @param {number} sampleRate - requested sample rate in Hz (output may differ)\n\t\t\t *\n\t\t\t * @todo merge into constructor?\n\t\t\t */\n\t\t\tAudioFeeder.prototype.init = function(numChannels, sampleRate) {\n\t\t\t\tthis.channels = numChannels;\n\t\t\t\tthis.rate = sampleRate;\n\n\t\t\t\tif (WebAudioBackend.isSupported()) {\n\t\t\t\t\tthis._backend = new WebAudioBackend(numChannels, sampleRate, this._options);\n\t\t\t\t} else if (FlashBackend.isSupported()) {\n\t\t\t\t\tthis._backend = new FlashBackend(numChannels, sampleRate, this._options);\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'No supported backend';\n\t\t\t\t}\n\n\t\t\t\tthis.targetRate = this._backend.rate;\n\t\t\t\tthis.bufferSize = this._backend.bufferSize;\n\n\t\t\t\t// Pass through the starved event\n\t\t\t\tthis._backend.onstarved = (function() {\n\t\t\t\t\tif (this.onstarved) {\n\t\t\t\t\t\tthis.onstarved();\n\t\t\t\t\t}\n\t\t\t\t}).bind(this);\n\t\t\t\tthis._backend.onbufferlow = (function() {\n\t\t\t\t\tif (this.onbufferlow) {\n\t\t\t\t\t\tthis.onbufferlow();\n\t\t\t\t\t}\n\t\t\t\t}).bind(this);\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Resample a buffer from the input rate/channel count to the output.\n\t\t\t *\n\t\t\t * This is horribly naive and wrong.\n\t\t\t * Replace me with a better algo!\n\t\t\t *\n\t\t\t * @param {SampleBuffer} sampleData - input data in requested sample rate / channel count\n\t\t\t * @returns {SampleBuffer} output data in backend's sample rate/channel count\n\t\t\t */\n\t\t\tAudioFeeder.prototype._resample = function(sampleData) {\n\t\t\t\tvar rate = this.rate,\n\t\t\t\t\tchannels = this.channels,\n\t\t\t\t\ttargetRate = this._backend.rate,\n\t\t\t\t\ttargetChannels = this._backend.channels;\n\n\t\t\t\tif (rate == targetRate && channels == targetChannels) {\n\t\t\t\t\treturn sampleData;\n\t\t\t\t} else {\n\t\t\t\t\tvar newSamples = [];\n\t\t\t\t\tfor (var channel = 0; channel < targetChannels; channel++) {\n\t\t\t\t\t\tvar inputChannel = channel;\n\t\t\t\t\t\tif (channel >= channels) {\n\t\t\t\t\t\t\t// Flash forces output to stereo; if input is mono, dupe the first channel\n\t\t\t\t\t\t\tinputChannel = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar input = sampleData[inputChannel],\n\t\t\t\t\t\t\toutput = new Float32Array(Math.round(input.length * targetRate / rate));\n\t\t\t\t\t\tfor (var i = 0; i < output.length; i++) {\n\t\t\t\t\t\t\toutput[i] = input[(i * rate / targetRate) | 0];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnewSamples.push(output);\n\t\t\t\t\t}\n\t\t\t\t\treturn newSamples;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Queue up some audio data for playback.\n\t\t\t *\n\t\t\t * @param {SampleBuffer} sampleData - input data to queue up for playback\n\t\t\t *\n\t\t\t * @todo throw if data invalid or uneven\n\t\t\t */\n\t\t\tAudioFeeder.prototype.bufferData = function(sampleData) {\n\t\t\t\tif (this._backend) {\n\t\t\t\t\tvar samples = this._resample(sampleData);\n\t\t\t\t\tthis._backend.appendBuffer(samples);\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'Invalid state: AudioFeeder cannot bufferData before init';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Get an object with information about the current playback state.\n\t\t\t *\n\t\t\t * @return {PlaybackState} - info about current playback state\n\t\t\t */\n\t\t\tAudioFeeder.prototype.getPlaybackState = function() {\n\t\t\t\tif (this._backend) {\n\t\t\t\t\treturn this._backend.getPlaybackState();\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'Invalid state: AudioFeeder cannot getPlaybackState before init';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Checks if audio system is ready and calls the callback when ready\n\t\t\t * to begin playback.\n\t\t\t *\n\t\t\t * This will wait for the Flash shim to load on IE 10/11; waiting\n\t\t\t * is not required when using native Web Audio but you should use\n\t\t\t * this callback to support older browsers.\n\t\t\t *\n\t\t\t * @param {function} callback - called when ready\n\t\t\t */\n\t\t\tAudioFeeder.prototype.waitUntilReady = function(callback) {\n\t\t\t\tif (this._backend) {\n\t\t\t\t\tthis._backend.waitUntilReady(callback);\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'Invalid state: AudioFeeder cannot waitUntilReady before init';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Start/continue playback as soon as possible.\n\t\t\t *\n\t\t\t * You should buffer some audio ahead of time to avoid immediately\n\t\t\t * running into starvation.\n\t\t\t */\n\t\t\tAudioFeeder.prototype.start = function() {\n\t\t\t\tif (this._backend) {\n\t\t\t\t\tthis._backend.start();\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'Invalid state: AudioFeeder cannot start before init';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Stop/pause playback as soon as possible.\n\t\t\t *\n\t\t\t * Audio that has been buffered but not yet sent to the device will\n\t\t\t * remain buffered, and can be continued with another call to start().\n\t\t\t */\n\t\t\tAudioFeeder.prototype.stop = function() {\n\t\t\t\tif (this._backend) {\n\t\t\t\t\tthis._backend.stop();\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'Invalid state: AudioFeeder cannot stop before init';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Flush any queued data out of the system.\n\t\t\t */\n\t\t\tAudioFeeder.prototype.flush = function() {\n\t\t\t\tif (this._backend) {\n\t\t\t\t\tthis._backend.flush();\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'Invalid state: AudioFeeder cannot flush before init';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Close out the audio channel. The AudioFeeder instance will no\n\t\t\t * longer be usable after closing.\n\t\t\t *\n\t\t\t * @todo close out the AudioContext if no longer needed\n\t\t\t * @todo make the instance respond more consistently once closed\n\t\t\t */\n\t\t\tAudioFeeder.prototype.close = function() {\n\t\t\t\tif (this._backend) {\n\t\t\t\t\tthis._backend.close();\n\t\t\t\t\tthis._backend = null;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Synchronous callback when we find we're out of buffered data.\n\t\t\t *\n\t\t\t * @type {function}\n\t\t\t */\n\t\t\tAudioFeeder.prototype.onstarved = null;\n\n\t\t\t/**\n\t\t\t * Asynchronous callback when we're running low on buffered data.\n\t\t\t *\n\t\t\t * @type {function}\n\t\t\t */\n\t\t\tAudioFeeder.prototype.onbufferlow = null;\n\n\t\t\t/**\n\t\t\t * Is the AudioFeeder class supported in this browser?\n\t\t\t *\n\t\t\t * Note that it's still possible to be supported but not work, for instance\n\t\t\t * if there are no audio output devices but the APIs are available.\n\t\t\t *\n\t\t\t * @returns {boolean} - true if Web Audio API is available\n\t\t\t */\n\t\t\tAudioFeeder.isSupported = function() {\n\t\t\t\treturn !!Float32Array && (WebAudioBackend.isSupported() || FlashBackend.isSupported());\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Force initialization of the default Web Audio API context, if applicable.\n\t\t\t *\n\t\t\t * Some browsers (such as mobile Safari) disable audio output unless\n\t\t\t * first triggered from a UI event handler; call this method as a hint\n\t\t\t * that you will be starting up an AudioFeeder soon but won't have data\n\t\t\t * for it until a later callback.\n\t\t\t *\n\t\t\t * @returns {AudioContext|null} - initialized AudioContext instance, if applicable\n\t\t\t */\n\t\t\tAudioFeeder.initSharedAudioContext = function() {\n\t\t\t\tif (WebAudioBackend.isSupported()) {\n\t\t\t\t\treturn WebAudioBackend.initSharedAudioContext();\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tmodule.exports = AudioFeeder;\n\n\t\t})();\n\n\n\t/***/ },\n\t/* 1 */\n\t/***/ function(module, exports) {\n\n\t\t/**\n\t\t * @file Abstraction around a queue of audio buffers.\n\t\t *\n\t\t * @author Brion Vibber <brion@pobox.com>\n\t\t * @copyright (c) 2013-2016 Brion Vibber\n\t\t * @license MIT\n\t\t */\n\n\t\t/**\n\t\t * Constructor for BufferQueue class.\n\t\t * @class\n\t\t * @param {number} numChannels - channel count to validate against\n\t\t * @param {number} bufferSize - desired size of pre-chunked output buffers, in samples\n\t\t *\n\t\t * @classdesc\n\t\t * Abstraction around a queue of audio buffers.\n\t\t *\n\t\t * Stuff input buffers of any length in via {@link BufferQueue#appendBuffer},\n\t\t * check how much is queued with {@link BufferQueue#sampleCount}, and pull out\n\t\t * data in fixed-size chunks from the start with {@link BufferQueue#shift}.\n\t\t */\n\t\tfunction BufferQueue(numChannels, bufferSize) {\n\t\t  if (numChannels < 1 || numChannels !== Math.round(numChannels)) {\n\t\t    throw 'Invalid channel count for BufferQueue';\n\t\t  }\n\t\t  this.channels = numChannels;\n\t\t  this.bufferSize = bufferSize;\n\t\t  this.flush();\n\t\t}\n\n\t\t/**\n\t\t * Flush any data out of the queue, resetting to empty state.\n\t\t */\n\t\tBufferQueue.prototype.flush = function() {\n\t\t  this._buffers = [];\n\t\t  this._pendingBuffer = this.createBuffer(this.bufferSize);\n\t\t  this._pendingPos = 0;\n\t\t};\n\n\t\t/**\n\t\t * Count how many samples are queued up\n\t\t *\n\t\t * @returns {number} - total count in samples\n\t\t */\n\t\tBufferQueue.prototype.sampleCount = function() {\n\t\t  var count = 0;\n\t\t  this._buffers.forEach(function(buffer) {\n\t\t    count += buffer[0].length;\n\t\t  });\n\t\t  return count;\n\t\t};\n\n\t\t/**\n\t\t * Create an empty audio sample buffer with space for the given count of samples.\n\t\t *\n\t\t * @param {number} sampleCount - number of samples to reserve in the buffer\n\t\t * @returns {SampleBuffer} - empty buffer\n\t\t */\n\t\tBufferQueue.prototype.createBuffer = function(sampleCount) {\n\t\t  var output = [];\n\t\t  for (var i = 0; i < this.channels; i++) {\n\t\t    output[i] = new Float32Array(sampleCount);\n\t\t  }\n\t\t  return output;\n\t\t};\n\n\t\t/**\n\t\t * Validate a buffer for correct object layout\n\t\t *\n\t\t * @param {SampleBuffer} buffer - an audio buffer to check\n\t\t * @returns {boolean} - true if input buffer is valid\n\t\t */\n\t\tBufferQueue.prototype.validate = function(buffer) {\n\t\t  if (buffer.length !== this.channels) {\n\t\t    return false;\n\t\t  }\n\n\t\t  var sampleCount;\n\t\t  for (var i = 0; i < buffer.length; i++) {\n\t\t    var channelData = buffer[i];\n\t\t    if (!(channelData instanceof Float32Array)) {\n\t\t      return false;\n\t\t    }\n\t\t    if (i == 0) {\n\t\t      sampleCount = channelData.length;\n\t\t    } else if (channelData.length !== sampleCount) {\n\t\t      return false;\n\t\t    }\n\t\t  }\n\n\t\t  return true;\n\t\t};\n\n\t\t/**\n\t\t * Append a buffer of input data to the queue...\n\t\t *\n\t\t * @param {SampleBuffer} sampleData - an audio buffer to append\n\t\t * @throws exception on invalid input\n\t\t */\n\t\tBufferQueue.prototype.appendBuffer = function(sampleData) {\n\t\t  if (!this.validate(sampleData)) {\n\t\t    throw \"Invalid audio buffer passed to BufferQueue.appendBuffer\";\n\t\t  }\n\n\t\t  var firstChannel = sampleData[0],\n\t\t    sampleCount = firstChannel.length;\n\n\t\t  // @todo this seems hella inefficient\n\t\t  for (var i = 0; i < sampleCount; i++) {\n\t\t    for (var channel = 0; channel < this.channels; channel++) {\n\t\t      this._pendingBuffer[channel][this._pendingPos] = sampleData[channel][i];\n\t\t    }\n\t\t    if (++this._pendingPos == this.bufferSize) {\n\t\t      this._buffers.push(this._pendingBuffer);\n\t\t      this._pendingPos = 0;\n\t\t      this._pendingBuffer = this.createBuffer(this.bufferSize);\n\t\t    }\n\t\t  }\n\n\t\t};\n\n\t\t/**\n\t\t * Unshift the given sample buffer onto the beginning of the buffer queue.\n\t\t *\n\t\t * @param {SampleBuffer} sampleData - an audio buffer to prepend\n\t\t * @throws exception on invalid input\n\t\t *\n\t\t * @todo this is currently pretty inefficient as it rechunks all the buffers.\n\t\t */\n\t\tBufferQueue.prototype.prependBuffer = function(sampleData) {\n\t\t  if (!this.validate(sampleData)) {\n\t\t    throw \"Invalid audio buffer passed to BufferQueue.prependBuffer\";\n\t\t  }\n\n\t\t  // Since everything is pre-chunked in the queue, we're going to have\n\t\t  // to pull everything out and re-append it.\n\t\t  var buffers = this._buffers.slice(0)\n\t\t  buffers.push(this.trimBuffer(this._pendingBuffer, 0, this._pendingPos));\n\n\t\t  this.flush();\n\t\t  this.appendBuffer(sampleData);\n\n\t\t  // Now put back any old buffers, dividing them up into chunks.\n\t\t  for (var i = 0; i < buffers.length; i++) {\n\t\t    this.appendBuffer(buffers[i]);\n\t\t  }\n\t\t};\n\n\t\t/**\n\t\t * Shift out a buffer from the head of the queue, containing a maximum of\n\t\t * {@link BufferQueue#bufferSize} samples; if there are not enough samples\n\t\t * you may get a shorter buffer. Call {@link BufferQueue#sampleCount} to\n\t\t * check if enough samples are available for your needs.\n\t\t *\n\t\t * @returns {SampleBuffer} - an audio buffer with zero or more samples\n\t\t */\n\t\tBufferQueue.prototype.nextBuffer = function() {\n\t\t  if (this._buffers.length) {\n\t\t    return this._buffers.shift();\n\t\t  } else {\n\t\t    var trimmed = this.trimBuffer(this._pendingBuffer, 0, this._pendingPos);\n\t\t    this._pendingBuffer = this.createBuffer(this.bufferSize);\n\t\t    this._pendingPos = 0;\n\t\t    return trimmed;\n\t\t  }\n\t\t};\n\n\t\t/**\n\t\t * Trim a buffer down to a given maximum sample count.\n\t\t * Any additional samples will simply be cropped off of the view.\n\t\t * If no trimming is required, the same buffer will be returned.\n\t\t *\n\t\t * @param {SampleBuffer} sampleData - input data\n\t\t * @param {number} start - sample number to start at\n\t\t * @param {number} maxSamples - count of samples to crop to\n\t\t * @returns {SampleBuffer} - output data with at most maxSamples samples\n\t\t */\n\t\tBufferQueue.prototype.trimBuffer = function(sampleData, start, maxSamples) {\n\t\t  var bufferLength = sampleData[0].length,\n\t\t    end = start + Math.min(maxSamples, bufferLength);\n\t\t  if (start == 0 && end >= bufferLength) {\n\t\t    return sampleData;\n\t\t  } else {\n\t\t    var output = [];\n\t\t    for (var i = 0; i < this.channels; i++) {\n\t\t      output[i] = sampleData[i].subarray(start, end);\n\t\t    }\n\t\t    return output;\n\t\t  }\n\t\t};\n\n\t\tmodule.exports = BufferQueue;\n\n\n\t/***/ },\n\t/* 2 */\n\t/***/ function(module, exports, __webpack_require__) {\n\n\t\t/**\n\t\t * @file Web Audio API backend for AudioFeeder\n\t\t * @author Brion Vibber <brion@pobox.com>\n\t\t * @copyright (c) 2013-2016 Brion Vibber\n\t\t * @license MIT\n\t\t */\n\n\t\t(function() {\n\n\t\t  var AudioContext = window.AudioContext || window.webkitAudioContext,\n\t\t    BufferQueue = __webpack_require__(1),\n\t\t    nextTick = __webpack_require__(3);\n\n\t\t  /**\n\t\t   * Constructor for AudioFeeder's Web Audio API backend.\n\t\t   * @class\n\t\t   * @param {number} numChannels - requested count of output channels\n\t\t   * @param {number} sampleRate - requested sample rate for output\n\t\t   * @param {Object} options - pass URL path to directory containing 'dynamicaudio.swf' in 'base' parameter\n\t\t   *\n\t\t   * @classdesc Web Audio API output backend for AudioFeeder.\n\t\t   * Maintains an internal {@link BufferQueue} of audio samples to be output on demand.\n\t\t   */\n\t\t  function WebAudioBackend(numChannels, sampleRate, options) {\n\t\t    var context = options.audioContext || WebAudioBackend.initSharedAudioContext();\n\n\t\t    this._context = context;\n\n\n\t\t    /*\n\t\t     * Optional audio node can be provided to connect the feeder to\n\t\t     * @type {AudioNode}\n\t\t     */\n\t\t    this.output = options.output || context.destination\n\n\t\t    /**\n\t\t     * Actual sample rate supported for output, in Hz\n\t\t     * @type {number}\n\t\t     * @readonly\n\t\t     */\n\t\t    this.rate = context.sampleRate;\n\n\t\t    /**\n\t\t     * Actual count of channels supported for output\n\t\t     * @type {number}\n\t\t     * @readonly\n\t\t     */\n\t\t    this.channels = Math.min(numChannels, 2); // @fixme remove this limit\n\n\t\t    if (options.bufferSize) {\n\t\t        this.bufferSize = (options.bufferSize | 0);\n\t\t    }\n\t\t    this.bufferThreshold = 2 * this.bufferSize;\n\n\t\t    this._bufferQueue = new BufferQueue(this.channels, this.bufferSize);\n\t\t    this._playbackTimeAtBufferTail = context.currentTime;\n\t\t    this._queuedTime = 0;\n\t\t    this._delayedTime = 0;\n\t\t    this._dropped = 0;\n\t\t    this._liveBuffer = this._bufferQueue.createBuffer(this.bufferSize);\n\n\t\t    // @todo support new audio worker mode too\n\t\t    if (context.createScriptProcessor) {\n\t\t      this._node = context.createScriptProcessor(this.bufferSize, 0, this.channels);\n\t\t    } else if (context.createJavaScriptNode) {\n\t\t      // In older Safari versions\n\t\t      this._node = context.createJavaScriptNode(this.bufferSize, 0, this.channels);\n\t\t    } else {\n\t\t      throw new Error(\"Bad version of web audio API?\");\n\t\t    }\n\t\t  }\n\n\t\t  /**\n\t\t   * Size of output buffers in samples, as a hint for latency/scheduling\n\t\t   * @type {number}\n\t\t   * @readonly\n\t\t   */\n\t\t  WebAudioBackend.prototype.bufferSize = 4096;\n\n\t\t  /**\n\t\t   * Remaining sample count at which a 'bufferlow' event will be triggered.\n\t\t   *\n\t\t   * Will be pinged when falling below bufferThreshold or bufferSize,\n\t\t   * whichever is larger.\n\t\t   *\n\t\t   * @type {number}\n\t\t   */\n\t\t  WebAudioBackend.prototype.bufferThreshold = 8192;\n\n\t\t  /**\n\t\t   * Internal volume property backing.\n\t\t   * @type {number}\n\t\t   * @access private\n\t\t   */\n\t\t  WebAudioBackend.prototype._volume = 1;\n\n\t\t  /**\n\t\t\t * Volume multiplier, defaults to 1.0.\n\t\t\t * @name volume\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tObject.defineProperty(WebAudioBackend.prototype, 'volume', {\n\t\t\t\tget: function getVolume() {\n\t\t      return this._volume;\n\t\t\t\t},\n\t\t\t\tset: function setVolume(val) {\n\t\t      this._volume = +val;\n\t\t\t\t}\n\t\t\t});\n\n\t\t  /**\n\t\t   * Internal muted property backing.\n\t\t   * @type {number}\n\t\t   * @access private\n\t\t   */\n\t\t  WebAudioBackend.prototype._muted = false;\n\n\t\t  /**\n\t\t\t * Is the backend currently set to mute output?\n\t\t\t * When muted, this overrides the volume property.\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tObject.defineProperty(WebAudioBackend.prototype, 'muted', {\n\t\t \t\tget: function getMuted() {\n\t\t      return this._muted;\n\t\t \t\t},\n\t\t \t\tset: function setMuted(val) {\n\t\t      this._muted = !!val;\n\t\t \t\t}\n\t\t \t});\n\n\t\t  /**\n\t\t   * onaudioprocess event handler for the ScriptProcessorNode\n\t\t   * @param {AudioProcessingEvent} event - audio processing event object\n\t\t   * @access private\n\t\t   */\n\t\t  WebAudioBackend.prototype._audioProcess = function(event) {\n\t\t    var channel, input, output, i, playbackTime;\n\t\t    if (typeof event.playbackTime === 'number') {\n\t\t      playbackTime = event.playbackTime;\n\t\t    } else {\n\t\t      // Safari 6.1 hack\n\t\t      playbackTime = this._context.currentTime + (this.bufferSize / this.rate);\n\t\t    }\n\n\t\t    var expectedTime = this._playbackTimeAtBufferTail;\n\t\t    if (expectedTime < playbackTime) {\n\t\t      // we may have lost some time while something ran too slow\n\t\t      this._delayedTime += (playbackTime - expectedTime);\n\t\t    }\n\n\t\t    if (this._bufferQueue.sampleCount() < this.bufferSize) {\n\t\t      // We might be in a throttled background tab; go ping the decoder\n\t\t      // and let it know we need more data now!\n\t\t      // @todo use standard event firing?\n\t\t      if (this.onstarved) {\n\t\t        this.onstarved();\n\t\t      }\n\t\t    }\n\n\t\t    // If we still haven't got enough data, write a buffer of silence\n\t\t    // to all channels and record an underrun event.\n\t\t    // @todo go ahead and output the data we _do_ have?\n\t\t    if (this._bufferQueue.sampleCount() < this.bufferSize) {\n\t\t      for (channel = 0; channel < this.channels; channel++) {\n\t\t        output = event.outputBuffer.getChannelData(channel);\n\t\t        for (i = 0; i < this.bufferSize; i++) {\n\t\t          output[i] = 0;\n\t\t        }\n\t\t      }\n\t\t      this._dropped++;\n\t\t      return;\n\t\t    }\n\n\t\t    var volume = (this.muted ? 0 : this.volume);\n\n\t\t    // Actually get that data and write it out...\n\t\t    var inputBuffer = this._bufferQueue.nextBuffer();\n\t\t    if (inputBuffer[0].length < this.bufferSize) {\n\t\t      // This should not happen, but trust no invariants!\n\t\t      throw 'Audio buffer not expected length.';\n\t\t    }\n\t\t    for (channel = 0; channel < this.channels; channel++) {\n\t\t      input = inputBuffer[channel];\n\n\t\t      // Save this buffer data for later in case we pause\n\t\t      this._liveBuffer[channel].set(inputBuffer[channel]);\n\n\t\t      // And play it out with volume applied...\n\t\t      output = event.outputBuffer.getChannelData(channel);\n\t\t      for (i = 0; i < input.length; i++) {\n\t\t        output[i] = input[i] * volume;\n\t\t      }\n\t\t    }\n\t\t    this._queuedTime += (this.bufferSize / this.rate);\n\t\t    this._playbackTimeAtBufferTail = playbackTime + (this.bufferSize / this.rate);\n\n\t\t    if (this._bufferQueue.sampleCount() < Math.max(this.bufferSize, this.bufferThreshold)) {\n\t\t      // Let the decoder know ahead of time we're running low on data.\n\t\t      // @todo use standard event firing?\n\t\t      if (this.onbufferlow) {\n\t\t        nextTick(this.onbufferlow.bind(this));\n\t\t      }\n\t\t    }\n\t\t  };\n\n\n\t\t  /**\n\t\t   * Return a count of samples that have been queued or output but not yet played.\n\t\t   *\n\t\t   * @returns {number} - sample count\n\t\t   * @access private\n\t\t   */\n\t\t  WebAudioBackend.prototype._samplesQueued = function() {\n\t\t    var bufferedSamples = this._bufferQueue.sampleCount();\n\t\t    var remainingSamples = Math.floor(this._timeAwaitingPlayback() * this.rate);\n\n\t\t    return bufferedSamples + remainingSamples;\n\t\t  };\n\n\t\t  /**\n\t\t   * Return time duration between the present and the endpoint of audio\n\t\t   * we have already sent out from our queue to Web Audio.\n\t\t   *\n\t\t   * @returns {number} - seconds\n\t\t   */\n\t\t  WebAudioBackend.prototype._timeAwaitingPlayback = function() {\n\t\t    return Math.max(0, this._playbackTimeAtBufferTail - this._context.currentTime);\n\t\t  };\n\n\t\t  /**\n\t\t   * Get info about current playback state.\n\t\t   *\n\t\t   * @return {PlaybackState} - info about current playback state\n\t\t   */\n\t\t  WebAudioBackend.prototype.getPlaybackState = function() {\n\t\t    return {\n\t\t      playbackPosition: this._queuedTime - this._timeAwaitingPlayback(),\n\t\t      samplesQueued: this._samplesQueued(),\n\t\t      dropped: this._dropped,\n\t\t      delayed: this._delayedTime\n\t\t    };\n\t\t  };\n\n\t\t  /**\n\t\t   * Wait asynchronously until the backend is ready before continuing.\n\t\t   *\n\t\t   * This will always call immediately for the Web Audio API backend,\n\t\t   * as there is no async setup process.\n\t\t   *\n\t\t   * @param {function} callback - to be called when ready\n\t\t   */\n\t\t  WebAudioBackend.prototype.waitUntilReady = function(callback) {\n\t\t    callback();\n\t\t  };\n\n\t\t  /**\n\t\t   * Append a buffer of audio data to the output queue for playback.\n\t\t   *\n\t\t   * Audio data must be at the expected sample rate; resampling is done\n\t\t   * upstream in {@link AudioFeeder}.\n\t\t   *\n\t\t   * @param {SampleBuffer} sampleData - audio data at target sample rate\n\t\t   */\n\t\t  WebAudioBackend.prototype.appendBuffer = function(sampleData) {\n\t\t    this._bufferQueue.appendBuffer(sampleData);\n\t\t  };\n\n\t\t  /**\n\t\t   * Start playback.\n\t\t   *\n\t\t   * Audio should have already been queued at this point,\n\t\t   * or starvation may occur immediately.\n\t\t   */\n\t\t  WebAudioBackend.prototype.start = function() {\n\t\t    this._node.onaudioprocess = this._audioProcess.bind(this);\n\t\t    this._node.connect(this.output);\n\t\t    this._playbackTimeAtBufferTail = this._context.currentTime;\n\t\t  };\n\n\t\t  /**\n\t\t   * Stop playback, but don't release resources or clear the buffers.\n\t\t   * We'll probably come back soon.\n\t\t   */\n\t\t  WebAudioBackend.prototype.stop = function() {\n\t\t    if (this._node) {\n\t\t      var timeRemaining = this._timeAwaitingPlayback();\n\t\t      if (timeRemaining > 0) {\n\t\t        // We have some leftover samples that got queued but didn't get played.\n\t\t        // Unshift them back onto the beginning of the buffer.\n\t\t        // @todo make this not a horrible hack\n\t\t        var samplesRemaining = Math.round(timeRemaining * this.rate),\n\t\t            samplesAvailable = this._liveBuffer ? this._liveBuffer[0].length : 0;\n\t\t        if (samplesRemaining > samplesAvailable) {\n\t\t          //console.log('liveBuffer size ' + samplesRemaining + ' vs ' + samplesAvailable);\n\t\t          this._bufferQueue.prependBuffer(this._liveBuffer);\n\t\t          this._bufferQueue.prependBuffer(\n\t\t            this._bufferQueue.createBuffer(samplesRemaining - samplesAvailable));\n\t\t        } else {\n\t\t          this._bufferQueue.prependBuffer(\n\t\t            this._bufferQueue.trimBuffer(this._liveBuffer, samplesAvailable - samplesRemaining, samplesRemaining));\n\t\t        }\n\t\t        this._playbackTimeAtBufferTail -= timeRemaining;\n\t\t      }\n\t\t      this._node.onaudioprocess = null;\n\t\t      this._node.disconnect();\n\t\t    }\n\t\t  };\n\n\t\t  /**\n\t\t   * Flush any queued data out of the system.\n\t\t   */\n\t\t  WebAudioBackend.prototype.flush = function() {\n\t\t    this._bufferQueue.flush();\n\t\t  };\n\n\t\t  /**\n\t\t   * Close out the playback system and release resources.\n\t\t   *\n\t\t   * @todo consider releasing the AudioContext when possible\n\t\t   */\n\t\t  WebAudioBackend.prototype.close = function() {\n\t\t    this.stop();\n\n\t\t    this._context = null;\n\t\t  };\n\n\t\t  /**\n\t\t   * Synchronous callback for when we run out of input data\n\t\t   *\n\t\t   * @type function|null\n\t\t   */\n\t\t  WebAudioBackend.prototype.onstarved = null;\n\n\t\t  /**\n\t\t   * Asynchronous callback for when the buffer runs low and\n\t\t   * should be refilled soon.\n\t\t   *\n\t\t   * @type function|null\n\t\t   */\n\t\t  WebAudioBackend.prototype.onbufferlow = null;\n\n\t\t  /**\n\t\t   * Check if Web Audio API appears to be supported.\n\t\t   *\n\t\t   * Note this is somewhat optimistic; will return true even if there are no\n\t\t   * audio devices available, as long as the API is present.\n\t\t   *\n\t\t   * @returns {boolean} - true if this browser appears to support Web Audio API\n\t\t   */\n\t\t  WebAudioBackend.isSupported = function() {\n\t\t    return !!AudioContext;\n\t\t  };\n\n\t\t  /**\n\t\t   * Holder of audio context to be used/reused by WebAudioBackend.\n\t\t   * @see {WebAudioBackend#initSharedAudioContext}\n\t\t   *\n\t\t   * @type {AudioContext}\n\t\t   */\n\t\t  WebAudioBackend.sharedAudioContext = null;\n\n\t\t  /**\n\t\t\t * Force initialization of the default Web Audio API context.\n\t\t\t *\n\t\t\t * Some browsers (such as mobile Safari) disable audio output unless\n\t\t\t * first triggered from a UI event handler; call this method as a hint\n\t\t\t * that you will be starting up an AudioFeeder soon but won't have data\n\t\t\t * for it until a later callback.\n\t\t   *\n\t\t   * @returns {AudioContext|null} - initialized AudioContext instance, if applicable\n\t\t\t */\n\t\t  WebAudioBackend.initSharedAudioContext = function() {\n\t\t\t\tif (!WebAudioBackend.sharedAudioContext) {\n\t\t\t\t\tif (WebAudioBackend.isSupported()) {\n\t\t\t\t\t\t// We're only allowed 4 contexts on many browsers\n\t\t\t\t\t\t// and there's no way to discard them (!)...\n\t\t\t\t\t\tvar context = new AudioContext(),\n\t\t\t\t\t\t\tnode;\n\t\t\t\t\t\tif (context.createScriptProcessor) {\n\t\t\t\t\t\t\tnode = context.createScriptProcessor(1024, 0, 2);\n\t\t\t\t\t\t} else if (context.createJavaScriptNode) {\n\t\t\t\t\t\t\tnode = context.createJavaScriptNode(1024, 0, 2);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error( \"Bad version of web audio API?\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Don't actually run any audio, just start & stop the node\n\t\t\t\t\t\tnode.connect(context.destination);\n\t\t\t\t\t\tnode.disconnect();\n\n\t\t        // So far so good. Keep it around!\n\t\t        WebAudioBackend.sharedAudioContext = context;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t    return WebAudioBackend.sharedAudioContext;\n\t\t\t};\n\n\t\t  module.exports = WebAudioBackend;\n\n\t\t})();\n\n\n\t/***/ },\n\t/* 3 */\n\t/***/ function(module, exports) {\n\n\t\tmodule.exports = (function() {\n\t\t\t// Don't try to check for setImmediate directly; webpack implements\n\t\t\t// it using setTimeout which will be throttled in background tabs.\n\t\t\t// Checking directly on the global window object skips this interference.\n\t\t\tif (typeof window.setImmediate !== 'undefined') {\n\t\t\t\treturn window.setImmediate;\n\t\t\t}\n\n\t\t\t// window.postMessage goes straight to the event loop, no throttling.\n\t\t\tif (window && window.postMessage) {\n\t\t\t\tvar nextTickQueue = [];\n\t\t\t\twindow.addEventListener('message', function(event) {\n\t\t\t\t\tif (event.source === window) {\n\t\t\t\t\t\tvar data = event.data;\n\t\t\t\t\t\tif (typeof data === 'object' && data.nextTickBrowserPingMessage) {\n\t\t\t\t\t\t\tvar callback = nextTickQueue.pop();\n\t\t\t\t\t\t\tif (callback) {\n\t\t\t\t\t\t\t\tcallback();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn function(callback) {\n\t\t\t\t\tnextTickQueue.push(callback);\n\t\t\t\t\twindow.postMessage({\n\t\t\t\t\t\tnextTickBrowserPingMessage: true\n\t\t\t\t\t}, document.location.toString())\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Timeout fallback may be poor in background tabs\n\t\t\treturn function(callback) {\n\t\t\t\tsetTimeout(callback, 0);\n\t\t\t}\n\t\t})();\n\n\n\t/***/ },\n\t/* 4 */\n\t/***/ function(module, exports, __webpack_require__) {\n\n\t\t(function() {\n\n\t\t  /* global ActiveXObject */\n\t\t  var dynamicaudio_swf = __webpack_require__(5);\n\n\t\t  var nextTick = __webpack_require__(3);\n\n\t\t  /**\n\t\t   * Constructor for AudioFeeder's Flash audio backend.\n\t\t   * @class\n\t\t   * @param {number} numChannels - requested count of output channels (actual will be fixed at 2)\n\t\t   * @param {number} sampleRate - requested sample rate for output (actual will be fixed at 44.1 kHz)\n\t\t   * @param {Object} options - pass URL path to directory containing 'dynamicaudio.swf' in 'base' parameter\n\t\t   *\n\t\t   * @classdesc Flash audio output backend for AudioFeeder.\n\t\t   * Maintains a local queue of data to be sent down to the Flash shim.\n\t\t   * Resampling to stereo 44.1 kHz is done upstream in AudioFeeder.\n\t\t   */\n\t\t  var FlashBackend = function(numChannels, sampleRate, options) {\n\t\t    options = options || {};\n\t\t    var flashOptions = {};\n\t\t    if (typeof options.base === 'string') {\n\t\t      // @fixme replace the version string with an auto-updateable one\n\t\t      flashOptions.swf = options.base + '/' + dynamicaudio_swf;\n\t\t    }\n\t\t    if (options.bufferSize) {\n\t\t      this.bufferSize = (options.bufferSize | 0);\n\t\t    }\n\n\t\t    this._flashaudio = new DynamicAudio(flashOptions);\n\t\t    this._flashBuffer = '';\n\t\t    this._flushTimeout = null;\n\t\t    this._flushInterval = 40; // flush added buffers no more often than every X ms\n\t\t    this._cachedFlashState = null;\n\t\t    this._cachedFlashTime = 0;\n\t\t    this._cachedFlashInterval = 40; // resync state no more often than every X ms\n\n\t\t    this._waitUntilReadyQueue = [];\n\t\t    this.onready = function() {\n\t\t        this._flashaudio.flashElement.setBufferSize(this.bufferSize);\n\t\t        this._flashaudio.flashElement.setBufferThreshold(this.bufferThreshold);\n\t\t        while (this._waitUntilReadyQueue.length) {\n\t\t            var callback = this._waitUntilReadyQueue.shift();\n\t\t            callback.apply(this);\n\t\t        }\n\t\t    };\n\t\t    this.onlog = function(msg) {\n\t\t        console.log('AudioFeeder FlashBackend: ' + msg);\n\t\t    }\n\n\t\t    this.bufferThreshold = this.bufferSize * 2;\n\n\t\t    var events = {\n\t\t        'ready': 'sync',\n\t\t        'log': 'sync',\n\t\t        'starved': 'sync',\n\t\t        'bufferlow': 'async'\n\t\t    };\n\t\t    this._callbackName = 'AudioFeederFlashBackendCallback' + this._flashaudio.id;\n\t\t    var self = this;\n\t\t    window[this._callbackName] = (function(eventName) {\n\t\t        var method = events[eventName],\n\t\t            callback = this['on' + eventName];\n\t\t        if (method && callback) {\n\t\t            if (method === 'async') {\n\t\t                nextTick(callback.bind(this));\n\t\t            } else {\n\t\t                callback.apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t                this._flushFlashBuffer();\n\t\t            }\n\t\t        }\n\t\t    }).bind(this);\n\t\t  };\n\n\t\t  /**\n\t\t   * Actual sample rate supported for output, in Hz\n\t\t   * Fixed to 44.1 kHz for Flash backend.\n\t\t   * @type {number}\n\t\t   * @readonly\n\t\t   */\n\t\t  FlashBackend.prototype.rate = 44100;\n\n\t\t  /**\n\t\t   * Actual count of channels supported for output\n\t\t   * Fixed to stereo for Flash backend.\n\t\t   * @type {number}\n\t\t   * @readonly\n\t\t   */\n\t\t  FlashBackend.prototype.channels = 2;\n\n\t\t  /**\n\t\t   * Buffer size hint.\n\t\t   * @type {number}\n\t\t   * @readonly\n\t\t   */\n\t\t  FlashBackend.prototype.bufferSize = 4096;\n\n\t\t  /**\n\t\t   * Internal bufferThreshold property backing.\n\t\t   * @type {number}\n\t\t   * @access private\n\t\t   */\n\t\t  FlashBackend.prototype._bufferThreshold = 8192;\n\n\t\t  /**\n\t\t   * Remaining sample count at which a 'bufferlow' event will be triggered.\n\t\t   *\n\t\t   * Will be pinged when falling below bufferThreshold or bufferSize,\n\t\t   * whichever is larger.\n\t\t   *\n\t\t   * @type {number}\n\t\t   */\n\t\t  Object.defineProperty(FlashBackend.prototype, 'bufferThreshold', {\n\t\t    get: function getBufferThreshold() {\n\t\t      return this._bufferThreshold;\n\t\t    },\n\t\t    set: function setBufferThreshold(val) {\n\t\t      this._bufferThreshold = val | 0;\n\t\t      this.waitUntilReady((function() {\n\t\t        this._flashaudio.flashElement.setBufferThreshold(this._bufferThreshold);\n\t\t      }).bind(this));\n\t\t    }\n\t\t  });\n\n\t\t  /**\n\t\t   * Internal volume property backing.\n\t\t   * @type {number}\n\t\t   * @access private\n\t\t   */\n\t\t  FlashBackend.prototype._volume = 1;\n\n\t\t  /**\n\t\t\t * Volume multiplier, defaults to 1.0.\n\t\t\t * @name volume\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tObject.defineProperty(FlashBackend.prototype, 'volume', {\n\t\t\t\tget: function getVolume() {\n\t\t      return this._volume;\n\t\t\t\t},\n\t\t\t\tset: function setVolume(val) {\n\t\t      this._volume = +val;\n\t\t      this.waitUntilReady(this._flashVolumeUpdate.bind(this));\n\t\t\t\t}\n\t\t\t});\n\n\t\t  /**\n\t\t   * Internal muted property backing.\n\t\t   * @type {number}\n\t\t   * @access private\n\t\t   */\n\t\t  FlashBackend.prototype._muted = false;\n\n\t\t  /**\n\t\t\t * Is the backend currently set to mute output?\n\t\t\t * When muted, this overrides the volume property.\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tObject.defineProperty(FlashBackend.prototype, 'muted', {\n\t\t \t\tget: function getMuted() {\n\t\t      return this._muted;\n\t\t \t\t},\n\t\t \t\tset: function setMuted(val) {\n\t\t      this._muted = !!val;\n\t\t      this.waitUntilReady(this._flashVolumeUpdate.bind(this));\n\t\t \t\t}\n\t\t \t});\n\n\t\t  /**\n\t\t   * Are we paused/idle?\n\t\t   * @type {boolean}\n\t\t   * @access private\n\t\t   */\n\t\t  FlashBackend.prototype._paused = true;\n\n\t\t  /**\n\t\t   * Pass the currently configured muted+volume state down to the Flash plugin\n\t\t   * @access private\n\t\t   */\n\t\t  FlashBackend.prototype._flashVolumeUpdate = function() {\n\t\t    if (this._flashaudio && this._flashaudio.flashElement && this._flashaudio.flashElement.setVolume) {\n\t\t      this._flashaudio.flashElement.setVolume(this.muted ? 0 : this.volume);\n\t\t    }\n\t\t  }\n\n\t\t  /**\n\t\t   * Scaling and reordering of output for the Flash fallback.\n\t\t   * Input data must be pre-resampled to the correct sample rate.\n\t\t   *\n\t\t   * @param {SampleBuffer} samples - input data as separate channels of 32-bit float\n\t\t   * @returns {Int16Array} - interleaved stereo 16-bit signed integer output\n\t\t   * @access private\n\t\t   *\n\t\t   * @todo handle input with higher channel counts better\n\t\t   * @todo try sending floats to flash without losing precision?\n\t\t   */\n\t\t  FlashBackend.prototype._resampleFlash = function(samples) {\n\t\t    var sampleincr = 1;\n\t\t  \tvar samplecount = samples[0].length;\n\t\t  \tvar newSamples = new Int16Array(samplecount * 2);\n\t\t  \tvar chanLeft = samples[0];\n\t\t  \tvar chanRight = this.channels > 1 ? samples[1] : chanLeft;\n\t\t    var volume = this.muted ? 0 : this.volume;\n\t\t  \tvar multiplier = volume * 16384; // smaller than 32768 to allow some headroom from those floats\n\t\t  \tfor(var s = 0; s < samplecount; s++) {\n\t\t  \t\tvar idx = (s * sampleincr) | 0;\n\t\t  \t\tvar idx_out = s * 2;\n\t\t  \t\t// Use a smaller\n\t\t  \t\tnewSamples[idx_out] = chanLeft[idx] * multiplier;\n\t\t  \t\tnewSamples[idx_out + 1] = chanRight[idx] * multiplier;\n\t\t  \t}\n\t\t  \treturn newSamples;\n\t\t  };\n\n\t\t  var hexDigits = ['0', '1', '2', '3', '4', '5', '6', '7',\n\t\t           '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\n\t\t  var hexBytes = [];\n\t\t  for (var i = 0; i < 256; i++) {\n\t\t    hexBytes[i] = hexDigits[(i & 0x0f)] +\n\t\t            hexDigits[(i & 0xf0) >> 4];\n\t\t  }\n\t\t  function hexString(buffer) {\n\t\t    var samples = new Uint8Array(buffer);\n\t\t    var digits = \"\",\n\t\t      len = samples.length;\n\t\t    for (var i = 0; i < len; i++) {\n\t\t      // Note that in IE 11 string concatenation is twice as fast as\n\t\t      // the traditional make-an-array-and-join here.\n\t\t      digits += hexBytes[samples[i]];\n\t\t    }\n\t\t    return digits;\n\t\t  }\n\n\t\t  /**\n\t\t   * Send any pending data off to the Flash plugin.\n\t\t   *\n\t\t   * @access private\n\t\t   */\n\t\t  FlashBackend.prototype._flushFlashBuffer = function() {\n\t\t    var chunk = this._flashBuffer,\n\t\t      flashElement = this._flashaudio.flashElement;\n\n\t\t    if (this._cachedFlashState) {\n\t\t        this._cachedFlashState.samplesQueued += chunk.length / 8;\n\t\t    }\n\t\t    this._flashBuffer = '';\n\t\t    this._flushTimeout = null;\n\n\t\t    if (chunk.length > 0) {\n\t\t      this.waitUntilReady(function() {\n\t\t        flashElement.write(chunk);\n\t\t      });\n\t\t    }\n\t\t  };\n\n\t\t  /**\n\t\t   * Append a buffer of audio data to the output queue for playback.\n\t\t   *\n\t\t   * Audio data must be at the expected sample rate; resampling is done\n\t\t   * upstream in {@link AudioFeeder}.\n\t\t   *\n\t\t   * @param {SampleBuffer} sampleData - audio data at target sample rate\n\t\t   */\n\t\t  FlashBackend.prototype.appendBuffer = function(sampleData) {\n\t\t    var resamples = this._resampleFlash(sampleData);\n\t\t    if (resamples.length > 0) {\n\t\t      var str = hexString(resamples.buffer);\n\t\t      this._flashBuffer += str;\n\t\t      if (!this._flushTimeout) {\n\t\t        // consolidate multiple consecutive tiny buffers in one pass;\n\t\t        // pushing data to Flash is relatively expensive on slow machines\n\t\t        this._flushTimeout = setTimeout(this._flushFlashBuffer.bind(this), this._flushInterval);\n\t\t      }\n\t\t    }\n\t\t  };\n\n\t\t  /**\n\t\t   * Get info about current playback state.\n\t\t   *\n\t\t   * @return {PlaybackState} - info about current playback state\n\t\t   */\n\t\t  FlashBackend.prototype.getPlaybackState = function() {\n\t\t    if (this._flashaudio && this._flashaudio.flashElement && this._flashaudio.flashElement.write) {\n\t\t      var now = Date.now(),\n\t\t        delta = this._paused ? 0 : (now - this._cachedFlashTime),\n\t\t        state;\n\t\t      if (this._cachedFlashState && delta < this._cachedFlashInterval) {\n\t\t        var cachedFlashState = this._cachedFlashState;\n\t\t        state = {\n\t\t          playbackPosition: cachedFlashState.playbackPosition + delta / 1000,\n\t\t          samplesQueued: cachedFlashState.samplesQueued -\n\t\t            Math.max(0, Math.round(delta * this.rate / 1000)),\n\t\t          dropped: cachedFlashState.dropped,\n\t\t          delayed: cachedFlashState.delayed\n\t\t        };\n\t\t      } else {\n\t\t        state = this._flashaudio.flashElement.getPlaybackState();\n\t\t        this._cachedFlashState = state;\n\t\t        this._cachedFlashTime = now;\n\t\t      }\n\t\t      state.samplesQueued += this._flashBuffer.length / 8;\n\t\t      return state;\n\t\t    } else {\n\t\t      //console.log('getPlaybackState USED TOO EARLY');\n\t\t      return {\n\t\t        playbackPosition: 0,\n\t\t        samplesQueued: 0,\n\t\t        dropped: 0,\n\t\t        delayed: 0\n\t\t      };\n\t\t    }\n\t\t  };\n\n\t\t  /**\n\t\t   * Wait until the backend is ready to start, then call the callback.\n\t\t   *\n\t\t   * @param {function} callback - called on completion\n\t\t   * @todo handle fail case better?\n\t\t   */\n\t\t  FlashBackend.prototype.waitUntilReady = function(callback) {\n\t\t    if (this._flashaudio && this._flashaudio.flashElement.write) {\n\t\t      callback.apply(this);\n\t\t    } else {\n\t\t      this._waitUntilReadyQueue.push(callback);\n\t\t    }\n\t\t  };\n\n\t\t  /**\n\t\t   * Start playback.\n\t\t   *\n\t\t   * Audio should have already been queued at this point,\n\t\t   * or starvation may occur immediately.\n\t\t   */\n\t\t  FlashBackend.prototype.start = function() {\n\t\t    this._flashaudio.flashElement.start();\n\t\t    this._paused = false;\n\t\t    this._cachedFlashState = null;\n\t\t  };\n\n\t\t  /**\n\t\t   * Stop playback, but don't release resources or clear the buffers.\n\t\t   * We'll probably come back soon.\n\t\t   */\n\t\t  FlashBackend.prototype.stop = function() {\n\t\t    this._flashaudio.flashElement.stop();\n\t\t    this._paused = true;\n\t\t    this._cachedFlashState = null;\n\t\t  };\n\n\t\t  /**\n\t\t   * Flush any queued data out of the system.\n\t\t   */\n\t\t  FlashBackend.prototype.flush = function() {\n\t\t    this._flashaudio.flashElement.flush();\n\t\t    this._cachedFlashState = null;\n\t\t  };\n\n\t\t  /**\n\t\t   * Close out the playback system and release resources.\n\t\t   */\n\t\t  FlashBackend.prototype.close = function() {\n\t\t    this.stop();\n\n\t\t    var wrapper = this._flashaudio.flashWrapper;\n\t\t    wrapper.parentNode.removeChild(wrapper);\n\t\t    this._flashaudio = null;\n\t\t    delete window[this._callbackName];\n\t\t  };\n\n\t\t  /**\n\t\t   * Synchronous callback for when we run out of input data\n\t\t   *\n\t\t   * @type function|null\n\t\t   */\n\t\t  FlashBackend.prototype.onstarved = null;\n\n\t\t  /**\n\t\t   * Asynchronous callback for when the buffer runs low and\n\t\t   * should be refilled soon.\n\t\t   *\n\t\t   * @type function|null\n\t\t   */\n\t\t  FlashBackend.prototype.onbufferlow = null;\n\n\t\t  /**\n\t\t   * Check if the browser appears to support Flash.\n\t\t   *\n\t\t   * Note this is somewhat optimistic, in that Flash may be supported\n\t\t   * but the dynamicaudio.swf file might not load, or it might load\n\t\t   * but there might be no audio devices, etc.\n\t\t   *\n\t\t   * Currently only checks for the ActiveX Flash plugin for Internet Explorer,\n\t\t   * as other target browsers support Web Audio API.\n\t\t   *\n\t\t   * @returns {boolean} - true if this browser appears to support Flash\n\t\t   */\n\t\t  FlashBackend.isSupported = function() {\n\t\t\t\tif (navigator.userAgent.indexOf('Trident') !== -1) {\n\t\t\t\t\t// We only do the ActiveX test because we only need Flash in\n\t\t\t\t\t// Internet Explorer 10/11. Other browsers use Web Audio directly\n\t\t\t\t\t// (Edge, Safari) or native playback, so there's no need to test\n\t\t\t\t\t// other ways of loading Flash.\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar obj = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t  };\n\n\t\t\t/** Flash fallback **/\n\n\t\t\t/*\n\t\t\tThe Flash fallback is based on https://github.com/an146/dynamicaudio.js\n\n\t\t\tThis is the contents of the LICENSE file:\n\n\t\t\tCopyright (c) 2010, Ben Firshman\n\t\t\tAll rights reserved.\n\n\t\t\tRedistribution and use in source and binary forms, with or without\n\t\t\tmodification, are permitted provided that the following conditions are met:\n\n\t\t\t * Redistributions of source code must retain the above copyright notice, this\n\t\t\t   list of conditions and the following disclaimer.\n\t\t\t * Redistributions in binary form must reproduce the above copyright notice,\n\t\t\t   this list of conditions and the following disclaimer in the documentation\n\t\t\t   and/or other materials provided with the distribution.\n\t\t\t * The names of its contributors may not be used to endorse or promote products\n\t\t\t   derived from this software without specific prior written permission.\n\n\t\t\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n\t\t\tANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n\t\t\tWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\t\t\tDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n\t\t\tANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n\t\t\t(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n\t\t\tLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n\t\t\tANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t\t\t(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n\t\t\tSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t\t\t*/\n\n\n\t\t  /**\n\t\t   * Wrapper class for instantiating Flash plugin.\n\t\t   *\n\t\t   * @constructor\n\t\t   * @param {Object} args - pass 'swf' to override default dynamicaudio.swf URL\n\t\t   * @access private\n\t\t   */\n\t\t\tfunction DynamicAudio(args) {\n\t\t\t\tif (this instanceof arguments.callee) {\n\t\t\t\t\tif (typeof this.init === \"function\") {\n\t\t\t\t\t\tthis.init.apply(this, (args && args.callee) ? args : arguments);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn new arguments.callee(arguments);\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tDynamicAudio.nextId = 1;\n\n\t\t\tDynamicAudio.prototype = {\n\t\t\t\tnextId: null,\n\t\t\t\tswf: dynamicaudio_swf,\n\n\t\t\t\tflashWrapper: null,\n\t\t\t\tflashElement: null,\n\n\t\t\t\tinit: function(opts) {\n\t\t\t\t\tvar self = this;\n\t\t\t\t\tself.id = DynamicAudio.nextId++;\n\n\t\t\t\t\tif (opts && typeof opts.swf !== 'undefined') {\n\t\t\t\t\t\tself.swf = opts.swf;\n\t\t\t\t\t}\n\n\n\t\t\t\t\tself.flashWrapper = document.createElement('div');\n\t\t\t\t\tself.flashWrapper.id = 'dynamicaudio-flashwrapper-'+self.id;\n\t\t\t\t\t// Credit to SoundManager2 for this:\n\t\t\t\t\tvar s = self.flashWrapper.style;\n\t\t\t\t\ts.position = 'fixed';\n\t\t\t\t\ts.width = '11px'; // must be at least 6px for flash to run fast\n\t\t\t\t\ts.height = '11px';\n\t\t\t\t\ts.bottom = s.left = '0px';\n\t\t\t\t\ts.overflow = 'hidden';\n\t\t\t\t\tself.flashElement = document.createElement('div');\n\t\t\t\t\tself.flashElement.id = 'dynamicaudio-flashelement-'+self.id;\n\t\t\t\t\tself.flashWrapper.appendChild(self.flashElement);\n\n\t\t\t\t\tdocument.body.appendChild(self.flashWrapper);\n\n\t\t\t\t\tvar id = self.flashElement.id;\n\t\t            var params = '<param name=\"FlashVars\" value=\"objectId=' + self.id + '\">';\n\n\t\t\t\t\tself.flashWrapper.innerHTML = \"<object id='\"+id+\"' width='10' height='10' type='application/x-shockwave-flash' data='\"+self.swf+\"' style='visibility: visible;'><param name='allowscriptaccess' value='always'>\" + params + \"</object>\";\n\t\t\t\t\tself.flashElement = document.getElementById(id);\n\t\t\t\t},\n\t\t\t};\n\n\t\t  module.exports = FlashBackend;\n\n\t\t})();\n\n\n\t/***/ },\n\t/* 5 */\n\t/***/ function(module, exports, __webpack_require__) {\n\n\t\tmodule.exports = __webpack_require__.p + \"dynamicaudio.swf?version=0f98a83acdc72cf30968c16a018e1cf1\";\n\n\t/***/ }\n\t/******/ ])\n\t});\n\t;\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__.p + \"dynamicaudio.swf?version=0f98a83acdc72cf30968c16a018e1cf1\";\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * Give as your 'process' function something that will trigger an async\n\t * operation, then call the left() or right() methods to run another\n\t * iteration, bisecting to the given direction.\n\t *\n\t * Caller is responsible for determining when done.\n\t *\n\t * @params options object {\n\t *   start: number,\n\t *   end: number,\n\t *   process: function(start, position, end)\n\t * }\n\t */\n\tfunction Bisector(options) {\n\t\tvar start = options.start,\n\t\t\tend = options.end,\n\t\t\tposition = 0,\n\t\t\tself = this,\n\t\t\tn = 0;\n\n\t\tfunction iterate() {\n\t\t\tn++;\n\t\t\tposition = Math.floor((start + end) / 2);\n\t\t\treturn options.process(start, end, position);\n\t\t}\n\n\t\tself.start = function() {\n\t\t\titerate();\n\t\t\treturn self;\n\t\t};\n\n\t\tself.left = function() {\n\t\t\tend = position;\n\t\t\treturn iterate();\n\t\t};\n\n\t\tself.right = function() {\n\t\t\tstart = position;\n\t\t\treturn iterate();\n\t\t};\n\t}\n\n\tmodule.exports = Bisector;\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Proxy object for web worker interface for codec classes.\n\t *\n\t * Used by the high-level player interface.\n\t *\n\t * @author Brion Vibber <brion@pobox.com>\n\t * @copyright 2015\n\t * @license MIT-style\n\t */\n\tvar OGVLoader = __webpack_require__(3);\n\n\tvar OGVWrapperCodec = (function(options) {\n\t\toptions = options || {};\n\t\tvar self = this,\n\t\t\tsuffix = '?version=' + encodeURIComponent((\"1.4.2-20170425024925-504d7197\")),\n\t\t\tbase = (typeof options.base === 'string') ? (options.base + '/') : '',\n\t\t\ttype = (typeof options.type === 'string') ? options.type : 'video/ogg',\n\t\t\tprocessing = false,\n\t\t\tdemuxer = null,\n\t\t\tvideoDecoder = null,\n\t\t\taudioDecoder = null,\n\t\t\tflushIter = 0;\n\n\t\t// Wrapper for callbacks to drop them after a flush\n\t\tfunction flushSafe(func) {\n\t\t\tvar savedFlushIter = flushIter;\n\t\t\treturn function(arg) {\n\t\t\t\tif (flushIter <= savedFlushIter) {\n\t\t\t\t\tfunc(arg);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tvar loadedMetadata = false;\n\t\tObject.defineProperty(self, 'loadedMetadata', {\n\t\t\tget: function() {\n\t\t\t\treturn loadedMetadata;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'processing', {\n\t\t\tget: function() {\n\t\t\t\treturn processing/*\n\t\t\t\t\t|| (videoDecoder && videoDecoder.processing)\n\t\t\t\t\t|| (audioDecoder && audioDecoder.processing)*/;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'duration', {\n\t\t\tget: function() {\n\t\t\t\tif (self.loadedMetadata) {\n\t\t\t\t\treturn demuxer.duration;\n\t\t\t\t} else {\n\t\t\t\t\treturn NaN;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'hasAudio', {\n\t\t\tget: function() {\n\t\t\t\treturn self.loadedMetadata && !!audioDecoder;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'audioReady', {\n\t\t\tget: function() {\n\t\t\t\treturn self.hasAudio && demuxer.audioReady;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'audioTimestamp', {\n\t\t\tget: function() {\n\t\t\t\treturn demuxer.audioTimestamp;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'audioFormat', {\n\t\t\tget: function() {\n\t\t\t\tif (self.hasAudio) {\n\t\t\t\t\treturn audioDecoder.audioFormat;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'audioBuffer', {\n\t\t\tget: function() {\n\t\t\t\tif (self.hasAudio) {\n\t\t\t\t\treturn audioDecoder.audioBuffer;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'hasVideo', {\n\t\t\tget: function() {\n\t\t\t\treturn self.loadedMetadata && !!videoDecoder;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'frameReady', {\n\t\t\tget: function() {\n\t\t\t\treturn self.hasVideo && demuxer.frameReady;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'frameTimestamp', {\n\t\t\tget: function() {\n\t\t\t\treturn demuxer.frameTimestamp;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'keyframeTimestamp', {\n\t\t\tget: function() {\n\t\t\t\treturn demuxer.keyframeTimestamp;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'nextKeyframeTimestamp', {\n\t\t\tget: function() {\n\t\t\t\treturn demuxer.nextKeyframeTimestamp;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'videoFormat', {\n\t\t\tget: function() {\n\t\t\t\tif (self.hasVideo) {\n\t\t\t\t\treturn videoDecoder.videoFormat;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'frameBuffer', {\n\t\t\tget: function() {\n\t\t\t\tif (self.hasVideo) {\n\t\t\t\t\treturn videoDecoder.frameBuffer;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(self, 'seekable', {\n\t\t\tget: function() {\n\t\t\t\treturn demuxer.seekable;\n\t\t\t}\n\t\t});\n\n\t\t// - public methods\n\t\tself.init = function(callback) {\n\t\t\tvar demuxerClassName;\n\t\t\tif (options.type === 'video/webm') {\n\t\t\t\tdemuxerClassName = options.wasm ? 'OGVDemuxerWebMW' : 'OGVDemuxerWebM';\n\t\t\t} else {\n\t\t\t\tdemuxerClassName = options.wasm ? 'OGVDemuxerOggW' : 'OGVDemuxerOgg';\n\t\t\t}\n\t\t\tprocessing = true;\n\t\t\tOGVLoader.loadClass(demuxerClassName, function(demuxerClass) {\n\t\t\t\tdemuxer = new demuxerClass();\n\t\t\t\tdemuxer.onseek = function(offset) {\n\t\t\t\t\tif (self.onseek) {\n\t\t\t\t\t\tself.onseek(offset);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdemuxer.init(function() {\n\t\t\t\t\tprocessing = false;\n\t\t\t\t\tcallback();\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tself.close = function() {\n\t\t\tif (demuxer) {\n\t\t\t\tdemuxer.close();\n\t\t\t\tdemuxer = null;\n\t\t\t}\n\t\t\tif (videoDecoder) {\n\t\t\t\tvideoDecoder.close();\n\t\t\t\tvideoDecoder = null;\n\t\t\t}\n\t\t\tif (audioDecoder) {\n\t\t\t\taudioDecoder.close();\n\t\t\t\taudioDecoder = null;\n\t\t\t}\n\t\t};\n\n\t\tself.receiveInput = function(data, callback) {\n\t\t\tdemuxer.receiveInput(data, callback);\n\t\t};\n\n\t\tvar audioClassMap = {\n\t\t\tvorbis: options.wasm ? 'OGVDecoderAudioVorbisW' : 'OGVDecoderAudioVorbis',\n\t\t\topus: options.wasm ? 'OGVDecoderAudioOpusW' : 'OGVDecoderAudioOpus'\n\t\t};\n\t\tfunction loadAudioCodec(callback) {\n\t\t\tif (demuxer.audioCodec) {\n\t\t\t\tvar className = audioClassMap[demuxer.audioCodec];\n\t\t\t\tprocessing = true;\n\t\t\t\tOGVLoader.loadClass(className, function(audioCodecClass) {\n\t\t\t\t\tvar audioOptions = {};\n\t\t\t\t\tif (demuxer.audioFormat) {\n\t\t\t\t\t\taudioOptions.audioFormat = demuxer.audioFormat;\n\t\t\t\t\t}\n\t\t\t\t\taudioDecoder = new audioCodecClass(audioOptions);\n\t\t\t\t\taudioDecoder.init(function() {\n\t\t\t\t\t\tloadedAudioMetadata = audioDecoder.loadedMetadata;\n\t\t\t\t\t\tprocessing = false;\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t});\n\t\t\t\t}, {\n\t\t\t\t\tworker: options.worker\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\n\t\tvar videoClassMap = {\n\t\t\ttheora: options.wasm ? 'OGVDecoderVideoTheoraW' : 'OGVDecoderVideoTheora',\n\t\t\tvp8: options.wasm ? 'OGVDecoderVideoVP8W' : (options.threading ? 'OGVDecoderVideoVP8MT' : 'OGVDecoderVideoVP8'),\n\t\t\tvp9: options.wasm ? 'OGVDecoderVideoVP9W' : (options.threading ? 'OGVDecoderVideoVP9MT' : 'OGVDecoderVideoVP9')\n\t\t};\n\t\tfunction loadVideoCodec(callback) {\n\t\t\tif (demuxer.videoCodec) {\n\t\t\t\tvar className = videoClassMap[demuxer.videoCodec];\n\t\t\t\tprocessing = true;\n\t\t\t\tOGVLoader.loadClass(className, function(videoCodecClass) {\n\t\t\t\t\tvar videoOptions = {};\n\t\t\t\t\tif (demuxer.videoFormat) {\n\t\t\t\t\t\tvideoOptions.videoFormat = demuxer.videoFormat;\n\t\t\t\t\t}\n\t\t\t\t\tif (options.memoryLimit) {\n\t\t\t\t\t\tvideoOptions.memoryLimit = options.memoryLimit;\n\t\t\t\t\t}\n\t\t\t\t\tvideoDecoder = new videoCodecClass(videoOptions);\n\t\t\t\t\tvideoDecoder.init(function() {\n\t\t\t\t\t\tloadedVideoMetadata = videoDecoder.loadedMetadata;\n\t\t\t\t\t\tprocessing = false;\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t});\n\t\t\t\t}, {\n\t\t\t\t\tworker: options.worker && !options.threading\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\n\t\tvar loadedDemuxerMetadata = false,\n\t\t\tloadedAudioMetadata = false,\n\t\t\tloadedVideoMetadata = false,\n\t\t\tloadedAllMetadata = false;\n\n\t\tself.process = function(callback) {\n\t\t\tif (processing) {\n\t\t\t\tthrow new Error('reentrancy fail on OGVWrapperCodec.process');\n\t\t\t}\n\t\t\tprocessing = true;\n\n\t\t\tvar videoPacketCount = demuxer.videoPackets.length,\n\t\t\t\taudioPacketCount = demuxer.audioPackets.length,\n\t\t\t\tstart = (window.performance ? performance.now() : Date.now());\n\t\t\tfunction finish(result) {\n\t\t\t\tprocessing = false;\n\t\t\t\tvar delta = (window.performance ? performance.now() : Date.now()) - start;\n\t\t\t\tif (delta > 8) {\n\t\t\t\t\tconsole.log('slow demux in ' + delta + ' ms; ' +\n\t\t\t\t\t\t(demuxer.videoPackets.length - videoPacketCount) + ' +video packets, ' +\n\t\t\t\t\t\t(demuxer.audioPackets.length - audioPacketCount) + ' +audio packets');\n\t\t\t\t}\n\t\t\t\t//console.log('demux returned ' + (result ? 'true' : 'false') + '; ' + demuxer.videoPackets.length + '; ' + demuxer.audioPackets.length);\n\t\t\t\tcallback(result);\n\t\t\t}\n\n\t\t\tfunction doProcessData() {\n\t\t\t\tdemuxer.process(finish);\n\t\t\t}\n\n\t\t\tif (demuxer.loadedMetadata && !loadedDemuxerMetadata) {\n\n\t\t\t\t// Demuxer just reached its metadata. Load the relevant codecs!\n\t\t\t\tloadAudioCodec(function() {\n\t\t\t\t\tloadVideoCodec(function() {\n\t\t\t\t\t\tloadedDemuxerMetadata = true;\n\t\t\t\t\t\tloadedAudioMetadata = !audioDecoder;\n\t\t\t\t\t\tloadedVideoMetadata = !videoDecoder;\n\t\t\t\t\t\tloadedAllMetadata = loadedAudioMetadata && loadedVideoMetadata;\n\t\t\t\t\t\tfinish(true);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t} else if (loadedDemuxerMetadata && !loadedAudioMetadata) {\n\n\t\t\t\tif (audioDecoder.loadedMetadata) {\n\n\t\t\t\t\tloadedAudioMetadata = true;\n\t\t\t\t\tloadedAllMetadata = loadedAudioMetadata && loadedVideoMetadata;\n\t\t\t\t\tfinish(true);\n\n\t\t\t\t} else if (demuxer.audioReady) {\n\n\t\t\t\t\tdemuxer.dequeueAudioPacket(function(packet) {\n\t\t\t\t\t\taudioDecoder.processHeader(packet, function(ret) {\n\t\t\t\t\t\t\tfinish(true);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdoProcessData();\n\n\t\t\t\t}\n\n\t\t\t} else if (loadedAudioMetadata && !loadedVideoMetadata) {\n\n\t\t\t\tif (videoDecoder.loadedMetadata) {\n\n\t\t\t\t\tloadedVideoMetadata = true;\n\t\t\t\t\tloadedAllMetadata = loadedAudioMetadata && loadedVideoMetadata;\n\t\t\t\t\tfinish(true);\n\n\t\t\t\t} else if (demuxer.frameReady) {\n\n\t\t\t\t\tprocessing = true;\n\t\t\t\t\tdemuxer.dequeueVideoPacket(function(packet) {\n\t\t\t\t\t\tvideoDecoder.processHeader(packet, function() {\n\t\t\t\t\t\t\tfinish(true);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdoProcessData();\n\n\t\t\t\t}\n\n\t\t\t} else if (loadedVideoMetadata && !self.loadedMetadata && loadedAllMetadata) {\n\n\t\t\t\t// Ok we've found all the metadata there is. Enjoy.\n\t\t\t\tloadedMetadata = true;\n\t\t\t\tfinish(true);\n\n\t\t\t} else if (self.loadedMetadata && (!self.hasAudio || demuxer.audioReady) && (!self.hasVideo || demuxer.frameReady)) {\n\n\t\t\t\t// Already queued up some packets. Go read them!\n\t\t\t\tfinish(true);\n\n\t\t\t} else {\n\n\t\t\t\t// We need to process more of the data we've already received,\n\t\t\t\t// or ask for more if we ran out!\n\t\t\t\tdoProcessData();\n\n\t\t\t}\n\n\t\t};\n\n\t\tself.decodeFrame = function(callback) {\n\t\t\tvar cb = flushSafe(callback),\n\t\t\t\ttimestamp = self.frameTimestamp,\n\t\t\t\tkeyframeTimestamp = self.keyframeTimestamp;\n\t\t\tdemuxer.dequeueVideoPacket(function(packet) {\n\t\t\t\tvideoDecoder.processFrame(packet, function(ok) {\n\t\t\t\t\t// hack\n\t\t\t\t\tif (videoDecoder.frameBuffer) {\n\t\t\t\t\t\tvideoDecoder.frameBuffer.timestamp = timestamp;\n\t\t\t\t\t\tvideoDecoder.frameBuffer.keyframeTimestamp = keyframeTimestamp;\n\t\t\t\t\t}\n\t\t\t\t\tcb(ok);\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tself.decodeAudio = function(callback) {\n\t\t\tvar cb = flushSafe(callback);\n\t\t\tdemuxer.dequeueAudioPacket(function(packet) {\n\t\t\t\taudioDecoder.processAudio(packet, cb);\n\t\t\t});\n\t\t}\n\n\t\tself.discardFrame = function(callback) {\n\t\t\tdemuxer.dequeueVideoPacket(function(packet) {\n\t\t\t\tcallback();\n\t\t\t});\n\t\t};\n\n\t\tself.discardAudio = function(callback) {\n\t\t\tdemuxer.dequeueAudioPacket(function(packet) {\n\t\t\t\tcallback();\n\t\t\t});\n\t\t};\n\n\t\tself.flush = function(callback) {\n\t\t\tflushIter++;\n\t\t\tdemuxer.flush(callback);\n\t\t};\n\n\t\tself.getKeypointOffset = function(timeSeconds, callback) {\n\t\t\tdemuxer.getKeypointOffset(timeSeconds, callback);\n\t\t};\n\n\t\tself.seekToKeypoint = function(timeSeconds, callback) {\n\t\t\tdemuxer.seekToKeypoint(timeSeconds, flushSafe(callback));\n\t\t}\n\n\t\tself.onseek = null;\n\n\t\tObject.defineProperty(self, \"demuxerCpuTime\", {\n\t\t\tget: function() {\n\t\t\t\tif (demuxer) {\n\t\t\t\t\treturn demuxer.cpuTime;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(self, \"audioCpuTime\", {\n\t\t\tget: function() {\n\t\t\t\tif (audioDecoder) {\n\t\t\t\t\treturn audioDecoder.cpuTime;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(self, \"videoCpuTime\", {\n\t\t\tget: function() {\n\t\t\t\tif (videoDecoder) {\n\t\t\t\t\treturn videoDecoder.cpuTime;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn self;\n\t});\n\n\tmodule.exports = OGVWrapperCodec;\n\n\n/***/ })\n/******/ ])\n});\n;"
  },
  {
    "path": "app/vendor/ogv.js/pthread-main.js",
    "content": "// Pthread Web Worker startup routine:\n// This is the entry point file that is loaded first by each Web Worker\n// that executes pthreads on the Emscripten application.\n\n// Thread-local, communicated via globals:\nvar threadInfoStruct = 0; // Info area for this thread in Emscripten HEAP (shared). If zero, this worker is not currently hosting an executing pthread.\nvar selfThreadId = 0; // The ID of this thread. 0 if not hosting a pthread.\nvar parentThreadId = 0; // The ID of the parent pthread that launched this thread.\n\n// Send the pthreads mode and other params in through Module object settings\nvar Module = {\n  ENVIRONMENT: 'PTHREAD'\n};\n\n// Cannot use console.log or console.error in a web worker, since that would risk a browser deadlock! https://bugzilla.mozilla.org/show_bug.cgi?id=1049091\n// Therefore implement custom logging facility for threads running in a worker, which queue the messages to main thread to print.\nfunction threadPrint() {\n  var text = Array.prototype.slice.call(arguments).join(' ');\n  console.log(text);\n}\nfunction threadPrintErr() {\n  var text = Array.prototype.slice.call(arguments).join(' ');\n  console.error(text);\n}\nfunction threadAlert() {\n  var text = Array.prototype.slice.call(arguments).join(' ');\n  postMessage({cmd: 'alert', text: text, threadId: selfThreadId});\n}\nModule['print'] = threadPrint;\nModule['printErr'] = threadPrintErr;\nthis.alert = threadAlert;\n\n// If modularized, we can't reuse the module's assert() function.\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nthis.onmessage = function(e) {\n  if (e.data.cmd === 'load') { // Preload command that is called once per worker to parse and load the Emscripten code.\n    // Initialize the thread-local field(s):\n    Module['tempDoublePtr'] = e.data.tempDoublePtr;\n\n    // Initialize the global \"process\"-wide fields:\n    Module['buffer'] = e.data.buffer;\n    Module['TOTAL_MEMORY'] = e.data.TOTAL_MEMORY;\n    Module['STATICTOP'] = e.data.STATICTOP;\n    Module['DYNAMIC_BASE'] = e.data.DYNAMIC_BASE;\n    Module['DYNAMICTOP_PTR'] = e.data.DYNAMICTOP_PTR;\n\n    Module['pthreadWorkerInit'] = e.data.PthreadWorkerInit;\n    importScripts(e.data.url);\n    if (e.data.modularize) {\n      // Feed input options into the modularized constructor...\n      // 'this' is the Worker, which is also global scope.\n      Module = new this[e.data.moduleExportName](Module);\n    }\n    if (typeof FS !== 'undefined') FS.createStandardStreams();\n    postMessage({ cmd: 'loaded' });\n  } else if (e.data.cmd === 'objectTransfer') {\n    Module.PThread.receiveObjectTransfer(e.data);\n  } else if (e.data.cmd === 'run') { // This worker was idle, and now should start executing its pthread entry point.\n    threadInfoStruct = e.data.threadInfoStruct;\n    Module.PThread.registerPthreadPtr(threadInfoStruct, /*isMainBrowserThread=*/0, /*isMainRuntimeThread=*/0); // Pass the thread address inside the asm.js scope to store it for fast access that avoids the need for a FFI out.\n    assert(threadInfoStruct);\n    selfThreadId = e.data.selfThreadId;\n    parentThreadId = e.data.parentThreadId;\n    assert(selfThreadId);\n    assert(parentThreadId);\n    Module.PThread.setStackSpace(e.data.stackBase, e.data.stackBase + e.data.stackSize);\n    var result = 0;\n\n    Module.PThread.receiveObjectTransfer(e.data);\n\n    Module.PThread.setThreadStatus(threadInfoStruct, 1/*EM_THREAD_STATUS_RUNNING*/);\n\n    try {\n      Module.PThread.runThreadFunc(e.data.start_routine, e.data.arg);\n    } catch(e) {\n      if (e === 'Canceled!') {\n        Module.PThread.threadCancel();\n        return;\n      } else {\n        Atomics.store(Module.HEAPU32, (threadInfoStruct + 4 /*{{{ C_STRUCTS.pthread.threadExitCode }}}*/ ) >> 2, -2 /*A custom entry specific to Emscripten denoting that the thread crashed.*/);\n        Atomics.store(Module.HEAPU32, (threadInfoStruct + 0 /*{{{ C_STRUCTS.pthread.threadStatus }}}*/ ) >> 2, 1); // Mark the thread as no longer running.\n        Module.PThread.wakeAllThreads();\n        throw e;\n      }\n    }\n    // The thread might have finished without calling pthread_exit(). If so, then perform the exit operation ourselves.\n    // (This is a no-op if explicit pthread_exit() had been called prior.)\n    if (!Module['noExitRuntime']) Module.PThread.threadExit(result);\n    else console.log('pthread noExitRuntime: not quitting.');\n  } else if (e.data.cmd === 'cancel') { // Main thread is asking for a pthread_cancel() on this thread.\n    if (threadInfoStruct && Module.PThread.thisThreadCancelState == 0/*PTHREAD_CANCEL_ENABLE*/) {\n      Module.PThread.threadCancel();\n    }\n  } else {\n    // Module['printErr']('pthread-main.js received unknown command ' + e.data.cmd);\n    // console.error(e.data)\n  }\n}\n"
  },
  {
    "path": "app/vendor/recorderjs/encoder_worker.js",
    "content": "var Module;if(!Module)Module=(typeof Module!==\"undefined\"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else{throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=console.log;if(!Module[\"printErr\"])Module[\"printErr\"]=console.warn;var nodeFS;var nodePath;Module[\"read\"]=function read(filename,binary){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module[\"load\"]=function load(f){globalEval(read(f))};if(!Module[\"thisProgram\"]){if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}else{Module[\"thisProgram\"]=\"unknown-program\"}}Module[\"arguments\"]=process[\"argv\"].slice(2);if(typeof module!==\"undefined\"){module[\"exports\"]=Module}process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function read(){throw\"no read() available\"}}Module[\"readBinary\"]=function readBinary(f){if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}var data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return xhr.response}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\"load\"]=importScripts}if(typeof Module[\"setWindowTitle\"]===\"undefined\"){Module[\"setWindowTitle\"]=(function(title){document.title=title})}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){abort(\"NO_DYNAMIC_EXECUTION=1 was set, cannot eval\")}if(!Module[\"load\"]&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}if(!Module[\"quit\"]){Module[\"quit\"]=(function(status,toThrow){throw toThrow})}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\"double\"||type===\"i64\"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){abort(\"NO_DYNAMIC_EXECUTION=1 was set, cannot eval\")}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var JSfuncs={\"stackSave\":(function(){Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore()}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};cwrap=function cwrap(ident,returnType,argTypes){return(function(){return ccall(ident,returnType,argTypes,arguments)})}}))();Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module[\"getMemory\"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module[\"UTF8ToString\"](ptr)}Module[\"Pointer_stringify\"]=Pointer_stringify;function AsciiToString(ptr){var str=\"\";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module[\"AsciiToString\"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module[\"stringToAscii\"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\"UTF8ArrayToString\"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module[\"UTF8ToString\"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module[\"stringToUTF8Array\"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\"stringToUTF8\"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module[\"lengthBytesUTF8\"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){var __cxa_demangle_func=Module[\"___cxa_demangle\"]||Module[\"__cxa_demangle\"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}Module[\"stackTrace\"]=stackTrace;var HEAP;var buffer;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module[\"HEAP\"]=HEAP;Module[\"buffer\"]=buffer;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];if(!Math[\"clz32\"])Math[\"clz32\"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math[\"clz32\"];if(!Math[\"trunc\"])Math[\"trunc\"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\"trunc\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var ASM_CONSTS=[];STATIC_BASE=8;STATICTOP=STATIC_BASE+34512;__ATINIT__.push();allocate([200,81,12,210,132,244,239,63,0,0,0,0,0,0,240,63,200,81,12,210,132,244,239,63,246,149,7,233,41,210,239,63,218,211,196,241,50,153,239,63,212,253,16,217,15,74,239,63,126,159,187,110,91,229,238,63,97,193,63,157,217,107,238,63,29,215,241,37,117,222,237,63,106,127,111,236,60,62,237,63,201,234,53,193,96,140,236,63,119,36,69,1,46,202,235,63,30,188,126,218,11,249,234,63,58,208,191,52,119,26,234,63,245,37,35,128,254,47,233,63,242,64,67,131,61,59,232,63,14,7,83,222,216,61,231,63,247,242,175,163,121,57,230,63,76,200,197,32,201,47,229,63,206,184,120,145,108,34,228,63,255,153,90,25,1,19,227,63,47,156,49,237,23,3,226,63,99,217,6,205,50,244,224,63,77,90,134,114,129,207,223,63,205,143,100,251,53,190,221,63,21,198,55,144,5,183,219,63,224,7,173,168,61,188,217,63,96,51,10,147,243,207,215,63,243,29,252,196,1,244,213,63,74,133,103,248,5,42,212,63,231,205,60,20,96,115,210,63,141,202,52,55,50,209,208,63,216,209,122,240,193,136,206,63,175,39,120,18,42,155,203,63,200,72,147,222,121,218,200,63,181,207,91,35,31,71,198,63,61,87,66,20,31,225,195,63,181,205,1,64,29,168,193,63,77,186,144,187,198,54,191,63,46,12,38,56,212,115,187,63,102,146,5,10,196,4,184,63,128,84,22,199,121,230,180,63,98,72,78,38,110,21,178,63,164,21,132,151,133,27,175,63,236,178,235,32,167,150,170,63,151,168,65,69,147,147,166,63,62,120,47,239,88,9,163,63,213,231,172,71,200,221,159,63,108,207,77,23,57,118,154,63,244,241,216,232,255,201,149,63,15,11,181,166,121,199,145,63,85,23,108,250,30,187,140,63,254,164,177,40,178,247,134,63,60,183,150,234,126,37,130,63,165,251,181,204,84,78,124,63,103,31,84,119,159,194,117,63,5,196,127,21,59,117,112,63,116,127,179,156,157,111,104,63,211,240,243,0,146,192,97,63,247,82,219,250,167,35,89,63,63,193,172,237,121,64,81,63,241,66,0,145,250,194,70,63,123,178,205,83,62,128,60,63,38,81,146,34,240,143,48,63,199,84,110,96,122,20,33,63,125,137,127,55,32,171,11,63,241,104,227,136,181,248,228,62,0,0,0,0,0,0,0,0,185,166,163,144,34,218,239,63,0,0,0,0,0,0,240,63,185,166,163,144,34,218,239,63,133,11,22,218,123,105,239,63,68,70,205,120,215,176,238,63,38,83,195,134,192,180,237,63,51,218,46,93,86,123,236,63,169,206,23,57,19,12,235,63,169,234,113,33,135,111,233,63,114,230,145,30,10,175,231,63,214,209,105,196,105,212,229,63,192,167,164,20,149,233,227,63,57,160,0,229,74,248,225,63,234,131,27,223,205,9,224,63,85,106,213,50,66,77,220,63,67,93,222,251,159,172,216,63,15,90,246,193,133,62,213,63,31,5,219,202,67,13,210,63,160,103,55,35,24,65,206,63,140,139,122,243,225,250,200,63,240,174,72,134,251,76,196,63,116,227,39,31,204,55,192,63,238,97,138,205,34,111,185,63,59,78,85,202,0,138,179,63,232,97,46,202,232,87,173,63,36,51,205,42,34,121,165,63,187,105,109,249,204,130,158,63,34,44,116,111,143,239,148,63,62,17,221,22,217,140,139,63,93,194,95,155,166,50,129,63,80,8,178,216,5,7,116,63,129,200,42,190,4,27,101,63,220,238,171,147,175,219,82,63,27,202,154,162,109,70,55,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,83,76,206,30,226,239,63,0,0,0,0,0,0,240,63,193,83,76,206,30,226,239,63,207,66,200,154,13,137,239,63,12,109,231,152,127,246,238,63,136,18,45,121,60,45,238,63,154,77,244,183,12,49,237,63,181,176,192,186,158,6,236,63,204,153,14,25,102,179,234,63,220,121,44,199,117,61,233,63,81,171,34,187,86,171,231,63,149,54,201,77,220,3,230,63,117,171,231,164,247,77,228,63,119,0,155,222,139,144,226,63,19,129,234,31,68,210,224,63,198,0,195,209,217,50,222,63,83,62,4,85,163,215,218,63,217,8,97,193,63,157,215,63,168,106,6,225,159,140,212,63,110,36,125,24,41,173,209,63,90,239,121,246,67,9,206,63,27,0,96,43,87,46,201,63,81,150,107,27,144,206,196,63,139,236,90,173,217,235,192,63,233,214,41,94,126,10,187,63,223,23,250,212,111,46,181,63,6,13,129,76,0,56,176,63,202,189,68,229,244,47,168,63,166,21,248,237,152,120,161,63,75,245,83,210,121,67,152,63,148,207,159,244,141,1,144,63,0,110,55,61,255,168,131,63,222,105,25,70,205,153,117,63,224,133,140,203,225,40,99,63,252,169,241,210,77,98,64,63,0,0,0,0,0,0,0,0,37,145,224,186,32,234,239,63,0,0,0,0,0,0,240,63,37,145,224,186,32,234,239,63,222,75,43,207,205,168,239,63,90,31,255,154,230,60,239,63,85,207,23,181,218,167,238,63,190,160,100,246,162,235,237,63,215,144,110,58,184,10,237,63,139,232,207,101,7,8,236,63,181,222,111,180,227,230,234,63,88,0,116,20,247,170,233,63,34,114,85,52,49,88,232,63,80,197,174,105,181,242,230,63,88,228,182,1,200,126,229,63,148,69,39,108,187,0,228,63,71,43,74,75,221,124,226,63,169,163,227,106,100,247,224,63,170,169,151,165,190,232,222,63,22,196,122,130,72,239,219,63,75,102,204,143,133,9,217,63,63,233,225,87,238,61,214,63,194,106,110,125,63,146,211,63,160,190,167,106,105,11,209,63,43,114,95,57,8,91,205,63,39,153,98,47,144,247,200,63,161,7,202,175,23,241,196,63,202,98,172,128,140,74,193,63,34,197,190,108,84,10,188,63,97,133,0,133,31,65,182,63,143,222,112,31,185,53,177,63,67,132,201,158,78,195,169,63,33,123,123,223,17,120,162,63,243,71,40,232,188,231,152,63,89,237,14,231,233,117,142,63,33,2,14,161,74,205,126,63,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,6,0,0,0,1,0,0,0,5,0,0,0,2,0,0,0,15,0,0,0,0,0,0,0,8,0,0,0,7,0,0,0,12,0,0,0,3,0,0,0,11,0,0,0,4,0,0,0,14,0,0,0,1,0,0,0,9,0,0,0,6,0,0,0,13,0,0,0,2,0,0,0,10,0,0,0,5,0,0,0,0,0,157,62,0,64,94,62,0,192,4,62,0,128,237,62,0,64,137,62,0,0,0,0,0,192,76,63,0,0,205,61,0,0,0,0,0,0,128,63,0,0,0,64,0,0,64,64,0,0,128,64,0,0,160,64,0,0,192,64,0,0,224,64,0,0,0,65,0,0,128,65,0,0,192,65,0,0,16,66,0,0,48,66,0,0,72,66,0,0,96,66,0,0,120,66,0,0,134,66,0,0,144,66,0,0,158,66,0,0,176,66,0,0,212,66,0,0,6,67,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,64,64,0,0,64,64,0,0,128,64,0,0,160,64,0,0,192,64,0,0,0,65,0,0,0,65,8,7,0,0,200,9,0,0,132,12,0,0,60,15,0,0,240,17,0,0,160,20,0,0,76,23,0,0,180,24,0,0,112,25,0,0,228,25,0,0,48,26,0,0,104,26,0,0,136,26,0,0,160,26,0,0,172,26,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,7,0,0,0,9,0,0,0,11,0,0,0,13,0,0,0,15,0,0,0,17,0,0,0,19,0,0,0,21,0,0,0,23,0,0,0,25,0,0,0,27,0,0,0,29,0,0,0,31,0,0,0,33,0,0,0,35,0,0,0,37,0,0,0,39,0,0,0,41,0,0,0,43,0,0,0,45,0,0,0,47,0,0,0,49,0,0,0,51,0,0,0,53,0,0,0,55,0,0,0,57,0,0,0,59,0,0,0,61,0,0,0,63,0,0,0,65,0,0,0,67,0,0,0,69,0,0,0,71,0,0,0,73,0,0,0,75,0,0,0,77,0,0,0,79,0,0,0,81,0,0,0,83,0,0,0,85,0,0,0,87,0,0,0,89,0,0,0,91,0,0,0,93,0,0,0,95,0,0,0,97,0,0,0,99,0,0,0,101,0,0,0,103,0,0,0,105,0,0,0,107,0,0,0,109,0,0,0,111,0,0,0,113,0,0,0,115,0,0,0,117,0,0,0,119,0,0,0,121,0,0,0,123,0,0,0,125,0,0,0,127,0,0,0,129,0,0,0,131,0,0,0,133,0,0,0,135,0,0,0,137,0,0,0,139,0,0,0,141,0,0,0,143,0,0,0,145,0,0,0,147,0,0,0,149,0,0,0,151,0,0,0,153,0,0,0,155,0,0,0,157,0,0,0,159,0,0,0,161,0,0,0,163,0,0,0,165,0,0,0,167,0,0,0,169,0,0,0,171,0,0,0,173,0,0,0,175,0,0,0,177,0,0,0,179,0,0,0,181,0,0,0,183,0,0,0,185,0,0,0,187,0,0,0,189,0,0,0,191,0,0,0,193,0,0,0,195,0,0,0,197,0,0,0,199,0,0,0,201,0,0,0,203,0,0,0,205,0,0,0,207,0,0,0,209,0,0,0,211,0,0,0,213,0,0,0,215,0,0,0,217,0,0,0,219,0,0,0,221,0,0,0,223,0,0,0,225,0,0,0,227,0,0,0,229,0,0,0,231,0,0,0,233,0,0,0,235,0,0,0,237,0,0,0,239,0,0,0,241,0,0,0,243,0,0,0,245,0,0,0,247,0,0,0,249,0,0,0,251,0,0,0,253,0,0,0,255,0,0,0,1,1,0,0,3,1,0,0,5,1,0,0,7,1,0,0,9,1,0,0,11,1,0,0,13,1,0,0,15,1,0,0,17,1,0,0,19,1,0,0,21,1,0,0,23,1,0,0,25,1,0,0,27,1,0,0,29,1,0,0,31,1,0,0,33,1,0,0,35,1,0,0,37,1,0,0,39,1,0,0,41,1,0,0,43,1,0,0,45,1,0,0,47,1,0,0,49,1,0,0,51,1,0,0,53,1,0,0,55,1,0,0,57,1,0,0,59,1,0,0,61,1,0,0,63,1,0,0,65,1,0,0,67,1,0,0,69,1,0,0,71,1,0,0,73,1,0,0,75,1,0,0,77,1,0,0,79,1,0,0,81,1,0,0,83,1,0,0,85,1,0,0,87,1,0,0,89,1,0,0,91,1,0,0,93,1,0,0,95,1,0,0,13,0,0,0,25,0,0,0,41,0,0,0,61,0,0,0,85,0,0,0,113,0,0,0,145,0,0,0,181,0,0,0,221,0,0,0,9,1,0,0,57,1,0,0,109,1,0,0,165,1,0,0,225,1,0,0,33,2,0,0,101,2,0,0,173,2,0,0,249,2,0,0,73,3,0,0,157,3,0,0,245,3,0,0,81,4,0,0,177,4,0,0,21,5,0,0,125,5,0,0,233,5,0,0,89,6,0,0,205,6,0,0,69,7,0,0,193,7,0,0,65,8,0,0,197,8,0,0,77,9,0,0,217,9,0,0,105,10,0,0,253,10,0,0,149,11,0,0,49,12,0,0,209,12,0,0,117,13,0,0,29,14,0,0,201,14,0,0,121,15,0,0,45,16,0,0,229,16,0,0,161,17,0,0,97,18,0,0,37,19,0,0,237,19,0,0,185,20,0,0,137,21,0,0,93,22,0,0,53,23,0,0,17,24,0,0,241,24,0,0,213,25,0,0,189,26,0,0,169,27,0,0,153,28,0,0,141,29,0,0,133,30,0,0,129,31,0,0,129,32,0,0,133,33,0,0,141,34,0,0,153,35,0,0,169,36,0,0,189,37,0,0,213,38,0,0,241,39,0,0,17,41,0,0,53,42,0,0,93,43,0,0,137,44,0,0,185,45,0,0,237,46,0,0,37,48,0,0,97,49,0,0,161,50,0,0,229,51,0,0,45,53,0,0,121,54,0,0,201,55,0,0,29,57,0,0,117,58,0,0,209,59,0,0,49,61,0,0,149,62,0,0,253,63,0,0,105,65,0,0,217,66,0,0,77,68,0,0,197,69,0,0,65,71,0,0,193,72,0,0,69,74,0,0,205,75,0,0,89,77,0,0,233,78,0,0,125,80,0,0,21,82,0,0,177,83,0,0,81,85,0,0,245,86,0,0,157,88,0,0,73,90,0,0,249,91,0,0,173,93,0,0,101,95,0,0,33,97,0,0,225,98,0,0,165,100,0,0,109,102,0,0,57,104,0,0,9,106,0,0,221,107,0,0,181,109,0,0,145,111,0,0,113,113,0,0,85,115,0,0,61,117,0,0,41,119,0,0,25,121,0,0,13,123,0,0,5,125,0,0,1,127,0,0,1,129,0,0,5,131,0,0,13,133,0,0,25,135,0,0,41,137,0,0,61,139,0,0,85,141,0,0,113,143,0,0,145,145,0,0,181,147,0,0,221,149,0,0,9,152,0,0,57,154,0,0,109,156,0,0,165,158,0,0,225,160,0,0,33,163,0,0,101,165,0,0,173,167,0,0,249,169,0,0,73,172,0,0,157,174,0,0,245,176,0,0,81,179,0,0,177,181,0,0,21,184,0,0,125,186,0,0,233,188,0,0,89,191,0,0,205,193,0,0,69,196,0,0,193,198,0,0,65,201,0,0,197,203,0,0,77,206,0,0,217,208,0,0,105,211,0,0,253,213,0,0,149,216,0,0,49,219,0,0,209,221,0,0,117,224,0,0,29,227,0,0,201,229,0,0,121,232,0,0,45,235,0,0,229,237,0,0,161,240,0,0,63,0,0,0,129,0,0,0,231,0,0,0,121,1,0,0,63,2,0,0,65,3,0,0,135,4,0,0,25,6,0,0,255,7,0,0,65,10,0,0,231,12,0,0,249,15,0,0,127,19,0,0,129,23,0,0,7,28,0,0,25,33,0,0,191,38,0,0,1,45,0,0,231,51,0,0,121,59,0,0,191,67,0,0,193,76,0,0,135,86,0,0,25,97,0,0,127,108,0,0,193,120,0,0,231,133,0,0,249,147,0,0,255,162,0,0,1,179,0,0,7,196,0,0,25,214,0,0,63,233,0,0,129,253,0,0,231,18,1,0,121,41,1,0,63,65,1,0,65,90,1,0,135,116,1,0,25,144,1,0,255,172,1,0,65,203,1,0,231,234,1,0,249,11,2,0,127,46,2,0,129,82,2,0,7,120,2,0,25,159,2,0,191,199,2,0,1,242,2,0,231,29,3,0,121,75,3,0,191,122,3,0,193,171,3,0,135,222,3,0,25,19,4,0,127,73,4,0,193,129,4,0,231,187,4,0,249,247,4,0,255,53,5,0,1,118,5,0,7,184,5,0,25,252,5,0,63,66,6,0,129,138,6,0,231,212,6,0,121,33,7,0,63,112,7,0,65,193,7,0,135,20,8,0,25,106,8,0,255,193,8,0,65,28,9,0,231,120,9,0,249,215,9,0,127,57,10,0,129,157,10,0,7,4,11,0,25,109,11,0,191,216,11,0,1,71,12,0,231,183,12,0,121,43,13,0,191,161,13,0,193,26,14,0,135,150,14,0,25,21,15,0,127,150,15,0,193,26,16,0,231,161,16,0,249,43,17,0,255,184,17,0,1,73,18,0,7,220,18,0,25,114,19,0,63,11,20,0,129,167,20,0,231,70,21,0,121,233,21,0,63,143,22,0,65,56,23,0,135,228,23,0,25,148,24,0,255,70,25,0,65,253,25,0,231,182,26,0,249,115,27,0,127,52,28,0,129,248,28,0,7,192,29,0,25,139,30,0,191,89,31,0,1,44,32,0,231,1,33,0,121,219,33,0,191,184,34,0,193,153,35,0,135,126,36,0,25,103,37,0,127,83,38,0,193,67,39,0,231,55,40,0,249,47,41,0,255,43,42,0,1,44,43,0,7,48,44,0,25,56,45,0,63,68,46,0,129,84,47,0,231,104,48,0,121,129,49,0,63,158,50,0,65,191,51,0,135,228,52,0,25,14,54,0,255,59,55,0,65,110,56,0,231,164,57,0,249,223,58,0,127,31,60,0,129,99,61,0,7,172,62,0,25,249,63,0,191,74,65,0,1,161,66,0,231,251,67,0,121,91,69,0,191,191,70,0,193,40,72,0,135,150,73,0,25,9,75,0,127,128,76,0,193,252,77,0,231,125,79,0,249,3,81,0,255,142,82,0,1,31,84,0,7,180,85,0,25,78,87,0,63,237,88,0,129,145,90,0,231,58,92,0,121,233,93,0,63,157,95,0,65,86,97,0,135,20,99,0,25,216,100,0,255,160,102,0,65,111,104,0,231,66,106,0,249,27,108,0,127,250,109,0,65,1,0,0,169,2,0,0,9,5,0,0,193,8,0,0,65,14,0,0,9,22,0,0,169,32,0,0,193,46,0,0,1,65,0,0,41,88,0,0,9,117,0,0,129,152,0,0,129,195,0,0,9,247,0,0,41,52,1,0,1,124,1,0,193,207,1,0,169,48,2,0,9,160,2,0,65,31,3,0,193,175,3,0,9,83,4,0,169,10,5,0,65,216,5,0,129,189,6,0,41,188,7,0,9,214,8,0,1,13,10,0,1,99,11,0,9,218,12,0,41,116,14,0,129,51,16,0,65,26,18,0,169,42,20,0,9,103,22,0,193,209,24,0,65,109,27,0,9,60,30,0,169,64,33,0,193,125,36,0,1,246,39,0,41,172,43,0,9,163,47,0,129,221,51,0,129,94,56,0,9,41,61,0,41,64,66,0,1,167,71,0,193,96,77,0,169,112,83,0,9,218,89,0,65,160,96,0,193,198,103,0,9,81,111,0,169,66,119,0,65,159,127,0,129,106,136,0,41,168,145,0,9,92,155,0,1,138,165,0,1,54,176,0,9,100,187,0,41,24,199,0,129,86,211,0,65,35,224,0,169,130,237,0,9,121,251,0,193,10,10,1,65,60,25,1,9,18,41,1,169,144,57,1,193,188,74,1,1,155,92,1,41,48,111,1,9,129,130,1,129,146,150,1,129,105,171,1,9,11,193,1,41,124,215,1,1,194,238,1,193,225,6,2,169,224,31,2,9,196,57,2,65,145,84,2,193,77,112,2,9,255,140,2,169,170,170,2,65,86,201,2,129,7,233,2,41,196,9,3,9,146,43,3,1,119,78,3,1,121,114,3,9,158,151,3,41,236,189,3,129,105,229,3,65,28,14,4,169,10,56,4,9,59,99,4,193,179,143,4,65,123,189,4,9,152,236,4,169,16,29,5,193,235,78,5,1,48,130,5,41,228,182,5,9,15,237,5,129,183,36,6,129,228,93,6,9,157,152,6,41,232,212,6,1,205,18,7,193,82,82,7,169,128,147,7,9,94,214,7,65,242,26,8,193,68,97,8,9,93,169,8,169,66,243,8,65,253,62,9,129,148,140,9,41,16,220,9,9,120,45,10,1,212,128,10,1,44,214,10,9,136,45,11,41,240,134,11,129,108,226,11,65,5,64,12,169,194,159,12,9,173,1,13,193,204,101,13,65,42,204,13,9,206,52,14,169,192,159,14,193,10,13,15,1,181,124,15,41,200,238,15,9,77,99,16,129,76,218,16,129,207,83,17,9,223,207,17,41,132,78,18,1,200,207,18,193,179,83,19,169,80,218,19,9,168,99,20,65,195,239,20,193,171,126,21,9,107,16,22,169,10,165,22,65,148,60,23,129,17,215,23,41,140,116,24,9,14,21,25,1,161,184,25,1,79,95,26,9,34,9,27,41,36,182,27,129,95,102,28,65,222,25,29,169,170,208,29,9,207,138,30,193,85,72,31,65,73,9,32,9,180,205,32,169,160,149,33,193,25,97,34,1,42,48,35,41,220,2,36,9,59,217,36,129,81,179,37,147,6,0,0,69,14,0,0,15,28,0,0,17,51,0,0,91,87,0,0,13,142,0,0,119,221,0,0,57,77,1,0,99,230,1,0,149,179,2,0,31,193,3,0,33,29,5,0,171,215,6,0,221,2,9,0,7,179,11,0,201,254,14,0,51,255,18,0,229,207,23,0,47,143,29,0,49,94,36,0,251,96,44,0,173,190,53,0,151,161,64,0,89,55,77,0,3,177,91,0,53,67,108,0,63,38,127,0,65,150,148,0,75,211,172,0,125,33,200,0,39,201,230,0,233,22,9,1,211,91,47,1,133,237,89,1,79,38,137,1,81,101,189,1,155,14,247,1,77,139,54,2,183,73,124,2,121,189,200,2,163,95,28,3,213,174,119,3,95,47,219,3,97,107,71,4,235,242,188,4,29,92,60,5,71,67,198,5,9,75,91,6,115,28,252,6,37,103,169,7,111,225,99,8,113,72,44,9,59,96,3,10,237,243,233,10,215,213,224,11,153,223,232,12,67,242,2,14,117,246,47,15,127,220,112,16,129,156,198,17,139,54,50,19,189,178,180,20,103,33,79,22,41,155,2,24,19,65,208,25,197,60,185,27,143,192,190,29,145,7,226,31,219,85,36,34,141,248,134,36,247,69,11,39,185,157,178,41,227,104,126,44,21,26,112,47,159,45,137,50,161,41,203,53,43,158,55,57,93,37,208,60,135,99,150,64,73,7,140,68,179,201,178,72,101,110,12,77,175,195,154,81,177,162,95,86,123,239,92,91,45,153,148,96,23,154,8,102,217,247,186,107,131,195,173,113,181,25,227,119,191,34,93,126,29,35,0,0,113,77,0,0,145,156,0,0,253,38,1,0,101,12,2,0,233,119,3,0,153,162,5,0,53,214,8,0,45,112,13,0,225,228,19,0,33,195,28,0,237,183,40,0,117,146,56,0,89,72,77,0,41,250,103,0,37,248,137,0,61,199,180,0,81,38,234,0,177,19,44,1,221,210,124,1,133,242,222,1,201,82,85,2,185,43,227,2,21,20,140,3,77,8,84,4,193,113,63,5,65,46,83,6,205,151,148,7,149,140,9,9,57,119,184,10,73,87,168,12,5,202,224,14,93,19,106,17,49,39,77,20,209,178,147,23,189,38,72,27,165,192,117,31,169,149,40,36,217,156,109,41,245,185,82,47,109,200,230,53,161,166,57,61,97,65,92,69,173,159,96,78,181,238,89,88,25,142,92,99,105,28,126,111,229,131,213,124,255,189,0,0,1,168,1,0,143,107,3,0,241,158,6,0,63,35,12,0,193,61,21,0,143,182,35,0,241,252,57,0,255,81,91,0,1,250,139,0,15,117,209,0,113,191,50,1,63,154,184,1,193,220,109,2,15,207,95,3,113,142,158,4,255,123,61,6,1,182,83,8,143,156,252,10,241,97,88,14,63,167,140,18,193,37,197,23,143,101,52,30,241,129,20,38,255,251,167,47,1,156,58,59,15,98,34,73,113,134,192,89,63,138,130,109,193,88,227,132,1,14,4,0,145,33,9,0,17,44,19,0,65,238,37,0,65,79,71,0,145,67,128,0,17,247,221,0,1,70,115,1,1,146,90,2,17,1,184,3,145,53,188,5,65,143,167,8,65,6,206,12,17,178,155,18,145,15,154,26,1,26,118,37,1,76,7,52,145,158,87,71,17,157,172,96,65,166,145,129,35,81,22,0,197,158,50,0,23,185,107,0,153,246,216,0,107,137,160,1,13,196,254,2,31,1,80,5,33,217,29,9,51,108,48,15,213,162,164,24,167,103,8,39,41,253,125,60,123,181,231,91,29,119,29,137,175,160,45,201,173,142,123,0,137,230,25,1,57,150,94,2,61,22,216,4,181,99,119,9,225,40,198,17,33,3,52,32,117,72,130,56,125,87,87,96,191,91,175,2,129,216,39,6,247,132,94,13,233,254,173,27,127,139,235,54,129,183,229,104,23,3,156,193,193,12,255,14,57,106,133,34,25,238,145,75,129,120,43,158,51,225,9,84,149,139,0,0,55,152,0,0,255,165,0,0,4,181,0,0,103,197,0,0,69,215,0,0,193,234,0,0,255,255,0,0,128,187,0,0,120,0,0,0,21,0,0,0,21,0,0,0,0,154,89,63,0,0,0,0,0,0,128,63,0,0,128,63,248,94,0,0,3,0,0,0,8,0,0,0,120,0,0,0,11,0,0,0,84,113,0,0,36,95,0,0,116,27,0,0,128,7,0,0,3,0,0,0,84,29,0,0,140,29,0,0,196,29,0,0,252,29,0,0,52,30,0,0,136,1,0,0,78,95,0,0,59,114,0,0,195,115,0,0,106,28,141,56,82,187,30,58,8,105,220,58,130,237,87,59,137,99,178,59,3,42,5,60,48,220,57,60,180,62,119,60,28,163,158,60,209,242,197,60,254,134,241,60,155,171,16,61,5,173,42,61,132,194,70,61,83,230,100,61,17,137,130,61,135,159,147,61,203,178,165,61,209,190,184,61,58,191,204,61,84,175,225,61,20,138,247,61,14,37,7,62,217,244,18,62,95,49,31,62,104,215,43,62,138,227,56,62,48,82,70,62,148,31,84,62,191,71,98,62,142,198,112,62,176,151,127,62,82,91,135,62,96,15,143,62,152,229,150,62,121,219,158,62,112,238,166,62,216,27,175,62,251,96,183,62,17,187,191,62,70,39,200,62,183,162,208,62,120,42,217,62,148,187,225,62,12,83,234,62,222,237,242,62,6,137,251,62,190,16,2,63,31,90,6,63,36,159,10,63,80,222,14,63,43,22,19,63,65,69,23,63,37,106,27,63,115,131,31,63,206,143,35,63,230,141,39,63,116,124,43,63,63,90,47,63,25,38,51,63,231,222,54,63,153,131,58,63,51,19,62,63,197,140,65,63,119,239,68,63,127,58,72,63,39,109,75,63,206,134,78,63,229,134,81,63,241,108,84,63,142,56,87,63,105,233,89,63,69,127,92,63,250,249,94,63,115,89,97,63,175,157,99,63,193,198,101,63,207,212,103,63,17,200,105,63,210,160,107,63,110,95,109,63,80,4,111,63,244,143,112,63,230,2,114,63,189,93,115,63,31,161,116,63,191,205,117,63,87,228,118,63,176,229,119,63,151,210,120,63,227,171,121,63,115,114,122,63,39,39,123,63,231,202,123,63,157,94,124,63,53,227,124,63,156,89,125,63,189,194,125,63,134,31,126,63,222,112,126,63,171,183,126,63,207,244,126,63,38,41,127,63,134,85,127,63,190,122,127,63,150,153,127,63,204,178,127,63,20,199,127,63,28,215,127,63,130,227,127,63,221,236,127,63,182,243,127,63,138,248,127,63,200,251,127,63,214,253,127,63,7,255,127,63,165,255,127,63,232,255,127,63,253,255,127,63,0,0,128,63,224,1,0,0,135,136,8,59,255,255,255,255,5,0,96,0,3,0,32,0,4,0,8,0,2,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,104,99,0,0,84,58,0,0,0,0,0,0,240,0,0,0,137,136,136,59,1,0,0,0,5,0,48,0,3,0,16,0,4,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,97,0,0,84,58,0,0,0,0,0,0,120,0,0,0,136,136,8,60,2,0,0,0,5,0,24,0,3,0,8,0,2,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,96,0,0,84,58,0,0,0,0,0,0,60,0,0,0,137,136,136,60,3,0,0,0,5,0,12,0,3,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,96,0,0,84,58,0,0,0,0,0,0,255,255,127,63,142,255,127,63,106,254,127,63,147,252,127,63,7,250,127,63,200,246,127,63,214,242,127,63,48,238,127,63,214,232,127,63,200,226,127,63,7,220,127,63,147,212,127,63,107,204,127,63,143,195,127,63,0,186,127,63,189,175,127,63,199,164,127,63,29,153,127,63,192,140,127,63,176,127,127,63,236,113,127,63,118,99,127,63,75,84,127,63,110,68,127,63,222,51,127,63,154,34,127,63,163,16,127,63,250,253,126,63,157,234,126,63,141,214,126,63,203,193,126,63,86,172,126,63,46,150,126,63,83,127,126,63,198,103,126,63,134,79,126,63,148,54,126,63,239,28,126,63,152,2,126,63,143,231,125,63,211,203,125,63,102,175,125,63,70,146,125,63,116,116,125,63,241,85,125,63,188,54,125,63,213,22,125,63,60,246,124,63,242,212,124,63,246,178,124,63,73,144,124,63,235,108,124,63,219,72,124,63,27,36,124,63,169,254,123,63,135,216,123,63,180,177,123,63,48,138,123,63,252,97,123,63,23,57,123,63,130,15,123,63,61,229,122,63,72,186,122,63,162,142,122,63,77,98,122,63,72,53,122,63,148,7,122,63,48,217,121,63,29,170,121,63,90,122,121,63,233,73,121,63,200,24,121,63,249,230,120,63,123,180,120,63,78,129,120,63,115,77,120,63,234,24,120,63,178,227,119,63,205,173,119,63,58,119,119,63,249,63,119,63,10,8,119,63,110,207,118,63,37,150,118,63,47,92,118,63,140,33,118,63,60,230,117,63,64,170,117,63,151,109,117,63,66,48,117,63,65,242,116,63,148,179,116,63,59,116,116,63,55,52,116,63,135,243,115,63,44,178,115,63,38,112,115,63,118,45,115,63,26,234,114,63,20,166,114,63,100,97,114,63,10,28,114,63,5,214,113,63,87,143,113,63,0,72,113,63,255,255,112,63,85,183,112,63,2,110,112,63,6,36,112,63,98,217,111,63,21,142,111,63,32,66,111,63,132,245,110,63,63,168,110,63,83,90,110,63,192,11,110,63,134,188,109,63,165,108,109,63,29,28,109,63,239,202,108,63,27,121,108,63,161,38,108,63,128,211,107,63,187,127,107,63,80,43,107,63,64,214,106,63,140,128,106,63,50,42,106,63,53,211,105,63,147,123,105,63,77,35,105,63,100,202,104,63,216,112,104,63,168,22,104,63,213,187,103,63,96,96,103,63,72,4,103,63,143,167,102,63,51,74,102,63,54,236,101,63,151,141,101,63,87,46,101,63,119,206,100,63,245,109,100,63,212,12,100,63,18,171,99,63,177,72,99,63,176,229,98,63,16,130,98,63,209,29,98,63,243,184,97,63,119,83,97,63,92,237,96,63,164,134,96,63,78,31,96,63,91,183,95,63,203,78,95,63,158,229,94,63,213,123,94,63,112,17,94,63,110,166,93,63,210,58,93,63,154,206,92,63,198,97,92,63,89,244,91,63,81,134,91,63,174,23,91,63,114,168,90,63,157,56,90,63,46,200,89,63,39,87,89,63,135,229,88,63,79,115,88,63,127,0,88,63,23,141,87,63,24,25,87,63,130,164,86,63,86,47,86,63,147,185,85,63,58,67,85,63,75,204,84,63,199,84,84,63,174,220,83,63,1,100,83,63,191,234,82,63,233,112,82,63,127,246,81,63,130,123,81,63,242,255,80,63,207,131,80,63,26,7,80,63,210,137,79,63,250,11,79,63,144,141,78,63,148,14,78,63,9,143,77,63,237,14,77,63,65,142,76,63,5,13,76,63,59,139,75,63,225,8,75,63,249,133,74,63,131,2,74,63,127,126,73,63,238,249,72,63,207,116,72,63,36,239,71,63,237,104,71,63,41,226,70,63,218,90,70,63,0,211,69,63,155,74,69,63,172,193,68,63,50,56,68,63,47,174,67,63,162,35,67,63,141,152,66,63,239,12,66,63,200,128,65,63,26,244,64,63,229,102,64,63,40,217,63,63,229,74,63,63,27,188,62,63,204,44,62,63,247,156,61,63,157,12,61,63,190,123,60,63,92,234,59,63,117,88,59,63,10,198,58,63,29,51,58,63,173,159,57,63,187,11,57,63,71,119,56,63,81,226,55,63,218,76,55,63,227,182,54,63,107,32,54,63,116,137,53,63,253,241,52,63,7,90,52,63,147,193,51,63,160,40,51,63,48,143,50,63,66,245,49,63,216,90,49,63,241,191,48,63,142,36,48,63,175,136,47,63,85,236,46,63,129,79,46,63,50,178,45,63,105,20,45,63,39,118,44,63,107,215,43,63,55,56,43,63,139,152,42,63,103,248,41,63,204,87,41,63,186,182,40,63,50,21,40,63,51,115,39,63,191,208,38,63,214,45,38,63,121,138,37,63,167,230,36,63,97,66,36,63,169,157,35,63,125,248,34,63,223,82,34,63,207,172,33,63,77,6,33,63,91,95,32,63,248,183,31,63,37,16,31,63,226,103,30,63,48,191,29,63,16,22,29,63,129,108,28,63,132,194,27,63,26,24,27,63,67,109,26,63,0,194,25,63,81,22,25,63,54,106,24,63,177,189,23,63,193,16,23,63,103,99,22,63,163,181,21,63,118,7,21,63,225,88,20,63,228,169,19,63,127,250,18,63,179,74,18,63,128,154,17,63,231,233,16,63,232,56,16,63,132,135,15,63,187,213,14,63,142,35,14,63,254,112,13,63,10,190,12,63,179,10,12,63,250,86,11,63,223,162,10,63,99,238,9,63,134,57,9,63,73,132,8,63,172,206,7,63,175,24,7,63,84,98,6,63,155,171,5,63,131,244,4,63,15,61,4,63,61,133,3,63,15,205,2,63,134,20,2,63,161,91,1,63,97,162,0,63,143,209,255,62,167,93,254,62,14,233,252,62,194,115,251,62,198,253,249,62,27,135,248,62,193,15,247,62,186,151,245,62,6,31,244,62,168,165,242,62,158,43,241,62,236,176,239,62,145,53,238,62,144,185,236,62,232,60,235,62,154,191,233,62,169,65,232,62,21,195,230,62,223,67,229,62,8,196,227,62,145,67,226,62,124,194,224,62,200,64,223,62,120,190,221,62,140,59,220,62,6,184,218,62,230,51,217,62,46,175,215,62,223,41,214,62,249,163,212,62,125,29,211,62,110,150,209,62,204,14,208,62,151,134,206,62,210,253,204,62,125,116,203,62,153,234,201,62,39,96,200,62,40,213,198,62,159,73,197,62,138,189,195,62,236,48,194,62,198,163,192,62,25,22,191,62,230,135,189,62,45,249,187,62,241,105,186,62,50,218,184,62,241,73,183,62,47,185,181,62,238,39,180,62,47,150,178,62,242,3,177,62,57,113,175,62,4,222,173,62,86,74,172,62,47,182,170,62,144,33,169,62,122,140,167,62,239,246,165,62,239,96,164,62,124,202,162,62,151,51,161,62,64,156,159,62,122,4,158,62,68,108,156,62,161,211,154,62,145,58,153,62,22,161,151,62,48,7,150,62,225,108,148,62,41,210,146,62,11,55,145,62,135,155,143,62,158,255,141,62,81,99,140,62,162,198,138,62,145,41,137,62,32,140,135,62,80,238,133,62,34,80,132,62,151,177,130,62,176,18,129,62,222,230,126,62,169,167,123,62,195,103,120,62,47,39,117,62,238,229,113,62,4,164,110,62,115,97,107,62,60,30,104,62,98,218,100,62,232,149,97,62,207,80,94,62,26,11,91,62,204,196,87,62,230,125,84,62,107,54,81,62,93,238,77,62,191,165,74,62,146,92,71,62,218,18,68,62,151,200,64,62,206,125,61,62,128,50,58,62,174,230,54,62,93,154,51,62,141,77,48,62,66,0,45,62,125,178,41,62,66,100,38,62,145,21,35,62,110,198,31,62,219,118,28,62,218,38,25,62,109,214,21,62,152,133,18,62,91,52,15,62,186,226,11,62,183,144,8,62,84,62,5,62,148,235,1,62,240,48,253,61,6,138,246,61,113,226,239,61,51,58,233,61,79,145,226,61,207,231,219,61,181,61,213,61,3,147,206,61,192,231,199,61,242,59,193,61,156,143,186,61,195,226,179,61,108,53,173,61,155,135,166,61,85,217,159,61,159,42,153,61,126,123,146,61,246,203,139,61,11,28,133,61,135,215,124,61,70,118,111,61,93,20,98,61,214,177,84,61,185,78,71,61,16,235,57,61,229,134,44,61,64,34,31,61,44,189,17,61,178,87,4,61,181,227,237,60,96,23,211,60,118,74,184,60,11,125,157,60,50,175,130,60,250,193,79,60,254,36,26,60,42,15,201,59,153,167,59,59,46,125,214,185,210,70,113,187,171,222,227,187,166,140,39,188,129,41,93,188,225,98,137,188,160,48,164,188,236,253,190,188,179,202,217,188,224,150,244,188,49,177,7,189,147,22,21,189,140,123,34,189,19,224,47,189,30,68,61,189,165,167,74,189,157,10,88,189,254,108,101,189,190,206,114,189,234,23,128,189,27,200,134,189,237,119,141,189,92,39,148,189,99,214,154,189,253,132,161,189,38,51,168,189,217,224,174,189,17,142,181,189,202,58,188,189,254,230,194,189,170,146,201,189,200,61,208,189,84,232,214,189,74,146,221,189,164,59,228,189,93,228,234,189,114,140,241,189,221,51,248,189,154,218,254,189,82,192,2,190,252,18,6,190,71,101,9,190,50,183,12,190,186,8,16,190,221,89,19,190,152,170,22,190,234,250,25,190,208,74,29,190,71,154,32,190,78,233,35,190,225,55,39,190,0,134,42,190,166,211,45,190,211,32,49,190,131,109,52,190,181,185,55,190,101,5,59,190,147,80,62,190,58,155,65,190,90,229,68,190,240,46,72,190,249,119,75,190,116,192,78,190,93,8,82,190,179,79,85,190,115,150,88,190,156,220,91,190,42,34,95,190,27,103,98,190,109,171,101,190,31,239,104,190,44,50,108,190,148,116,111,190,84,182,114,190,106,247,117,190,211,55,121,190,141,119,124,190,150,182,127,190,117,122,129,190,69,25,131,190,185,183,132,190,208,85,134,190,136,243,135,190,225,144,137,190,218,45,139,190,112,202,140,190,164,102,142,190,116,2,144,190,223,157,145,190,228,56,147,190,129,211,148,190,182,109,150,190,129,7,152,190,226,160,153,190,215,57,155,190,95,210,156,190,121,106,158,190,35,2,160,190,94,153,161,190,38,48,163,190,125,198,164,190,96,92,166,190,206,241,167,190,198,134,169,190,71,27,171,190,80,175,172,190,224,66,174,190,245,213,175,190,143,104,177,190,173,250,178,190,77,140,180,190,110,29,182,190,16,174,183,190,48,62,185,190,207,205,186,190,234,92,188,190,130,235,189,190,148,121,191,190,31,7,193,190,35,148,194,190,159,32,196,190,145,172,197,190,248,55,199,190,211,194,200,190,34,77,202,190,226,214,203,190,19,96,205,190,181,232,206,190,197,112,208,190,66,248,209,190,45,127,211,190,131,5,213,190,67,139,214,190,109,16,216,190,255,148,217,190,249,24,219,190,89,156,220,190,29,31,222,190,70,161,223,190,211,34,225,190,193,163,226,190,16,36,228,190,190,163,229,190,204,34,231,190,56,161,232,190,0,31,234,190,36,156,235,190,162,24,237,190,122,148,238,190],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([171,15,240,190,51,138,241,190,18,4,243,190,70,125,244,190,207,245,245,190,170,109,247,190,217,228,248,190,88,91,250,190,40,209,251,190,71,70,253,190,181,186,254,190,56,23,0,191,187,208,0,191,228,137,1,191,178,66,2,191,37,251,2,191,59,179,3,191,246,106,4,191,83,34,5,191,83,217,5,191,245,143,6,191,56,70,7,191,29,252,7,191,162,177,8,191,199,102,9,191,140,27,10,191,240,207,10,191,243,131,11,191,147,55,12,191,209,234,12,191,172,157,13,191,36,80,14,191,56,2,15,191,232,179,15,191,50,101,16,191,24,22,17,191,151,198,17,191,176,118,18,191,99,38,19,191,174,213,19,191,145,132,20,191,13,51,21,191,31,225,21,191,200,142,22,191,8,60,23,191,221,232,23,191,72,149,24,191,72,65,25,191,220,236,25,191,4,152,26,191,192,66,27,191,15,237,27,191,240,150,28,191,99,64,29,191,104,233,29,191,254,145,30,191,37,58,31,191,220,225,31,191,35,137,32,191,250,47,33,191,95,214,33,191,82,124,34,191,212,33,35,191,227,198,35,191,127,107,36,191,167,15,37,191,92,179,37,191,157,86,38,191,104,249,38,191,191,155,39,191,160,61,40,191,11,223,40,191,255,127,41,191,125,32,42,191,131,192,42,191,17,96,43,191,39,255,43,191,196,157,44,191,232,59,45,191,146,217,45,191,195,118,46,191,121,19,47,191,180,175,47,191,115,75,48,191,183,230,48,191,127,129,49,191,203,27,50,191,153,181,50,191,234,78,51,191,189,231,51,191,18,128,52,191,232,23,53,191,63,175,53,191,22,70,54,191,110,220,54,191,69,114,55,191,156,7,56,191,113,156,56,191,197,48,57,191,150,196,57,191,230,87,58,191,178,234,58,191,252,124,59,191,194,14,60,191,3,160,60,191,193,48,61,191,250,192,61,191,173,80,62,191,219,223,62,191,131,110,63,191,165,252,63,191,64,138,64,191,83,23,65,191,224,163,65,191,228,47,66,191,96,187,66,191,83,70,67,191,190,208,67,191,158,90,68,191,246,227,68,191,194,108,69,191,5,245,69,191,188,124,70,191,232,3,71,191,137,138,71,191,157,16,72,191,37,150,72,191,32,27,73,191,142,159,73,191,111,35,74,191,193,166,74,191,134,41,75,191,188,171,75,191,99,45,76,191,122,174,76,191,2,47,77,191,250,174,77,191,98,46,78,191,57,173,78,191,126,43,79,191,51,169,79,191,85,38,80,191,230,162,80,191,228,30,81,191,80,154,81,191,40,21,82,191,109,143,82,191,30,9,83,191,59,130,83,191,195,250,83,191,183,114,84,191,22,234,84,191,223,96,85,191,18,215,85,191,176,76,86,191,183,193,86,191,39,54,87,191,0,170,87,191,66,29,88,191,236,143,88,191,254,1,89,191,120,115,89,191,89,228,89,191,162,84,90,191,81,196,90,191,102,51,91,191,226,161,91,191,195,15,92,191,10,125,92,191,183,233,92,191,200,85,93,191,62,193,93,191,24,44,94,191,87,150,94,191,249,255,94,191,255,104,95,191,104,209,95,191,51,57,96,191,98,160,96,191,243,6,97,191,229,108,97,191,58,210,97,191,240,54,98,191,8,155,98,191,128,254,98,191,89,97,99,191,146,195,99,191,44,37,100,191,37,134,100,191,126,230,100,191,55,70,101,191,78,165,101,191,197,3,102,191,154,97,102,191,205,190,102,191,94,27,103,191,77,119,103,191,154,210,103,191,68,45,104,191,75,135,104,191,174,224,104,191,111,57,105,191,139,145,105,191,4,233,105,191,217,63,106,191,9,150,106,191,148,235,106,191,123,64,107,191,188,148,107,191,89,232,107,191,79,59,108,191,160,141,108,191,75,223,108,191,79,48,109,191,173,128,109,191,101,208,109,191,117,31,110,191,223,109,110,191,161,187,110,191,187,8,111,191,46,85,111,191,248,160,111,191,27,236,111,191,149,54,112,191,103,128,112,191,144,201,112,191,15,18,113,191,230,89,113,191,19,161,113,191,151,231,113,191,113,45,114,191,160,114,114,191,38,183,114,191,1,251,114,191,50,62,115,191,184,128,115,191,148,194,115,191,196,3,116,191,73,68,116,191,34,132,116,191,80,195,116,191,210,1,117,191,168,63,117,191,210,124,117,191,80,185,117,191,33,245,117,191,69,48,118,191,189,106,118,191,136,164,118,191,166,221,118,191,22,22,119,191,217,77,119,191,239,132,119,191,87,187,119,191,17,241,119,191,29,38,120,191,122,90,120,191,42,142,120,191,43,193,120,191,125,243,120,191,33,37,121,191,22,86,121,191,92,134,121,191,242,181,121,191,218,228,121,191,18,19,122,191,154,64,122,191,115,109,122,191,157,153,122,191,22,197,122,191,223,239,122,191,248,25,123,191,97,67,123,191,26,108,123,191,34,148,123,191,122,187,123,191,32,226,123,191,23,8,124,191,92,45,124,191,240,81,124,191,211,117,124,191,5,153,124,191,134,187,124,191,85,221,124,191,115,254,124,191,223,30,125,191,154,62,125,191,163,93,125,191,250,123,125,191,159,153,125,191,146,182,125,191,211,210,125,191,98,238,125,191,63,9,126,191,105,35,126,191,225,60,126,191,167,85,126,191,186,109,126,191,27,133,126,191,201,155,126,191,196,177,126,191,13,199,126,191,162,219,126,191,133,239,126,191,181,2,127,191,50,21,127,191,252,38,127,191,19,56,127,191,118,72,127,191,39,88,127,191,36,103,127,191,110,117,127,191,5,131,127,191,232,143,127,191,25,156,127,191,149,167,127,191,95,178,127,191,116,188,127,191,215,197,127,191,133,206,127,191,129,214,127,191,200,221,127,191,93,228,127,191,61,234,127,191,106,239,127,191,227,243,127,191,169,247,127,191,187,250,127,191,25,253,127,191,196,254,127,191,187,255,127,191,250,255,127,63,57,254,127,63,169,249,127,63,75,242,127,63,30,232,127,63,35,219,127,63,89,203,127,63,193,184,127,63,91,163,127,63,40,139,127,63,39,112,127,63,90,82,127,63,191,49,127,63,88,14,127,63,37,232,126,63,38,191,126,63,92,147,126,63,200,100,126,63,105,51,126,63,65,255,125,63,79,200,125,63,150,142,125,63,20,82,125,63,203,18,125,63,188,208,124,63,231,139,124,63,77,68,124,63,239,249,123,63,205,172,123,63,233,92,123,63,67,10,123,63,221,180,122,63,182,92,122,63,209,1,122,63,46,164,121,63,206,67,121,63,178,224,120,63,220,122,120,63,76,18,120,63,4,167,119,63,4,57,119,63,79,200,118,63,228,84,118,63,198,222,117,63,246,101,117,63,117,234,116,63,68,108,116,63,101,235,115,63,218,103,115,63,163,225,114,63,194,88,114,63,57,205,113,63,9,63,113,63,52,174,112,63,187,26,112,63,160,132,111,63,228,235,110,63,138,80,110,63,147,178,109,63,1,18,109,63,213,110,108,63,17,201,107,63,183,32,107,63,201,117,106,63,73,200,105,63,57,24,105,63,155,101,104,63,111,176,103,63,186,248,102,63,124,62,102,63,184,129,101,63,111,194,100,63,164,0,100,63,90,60,99,63,145,117,98,63,76,172,97,63,142,224,96,63,89,18,96,63,174,65,95,63,145,110,94,63,3,153,93,63,8,193,92,63,160,230,91,63,207,9,91,63,152,42,90,63,251,72,89,63,253,100,88,63,159,126,87,63,229,149,86,63,208,170,85,63,99,189,84,63,161,205,83,63,140,219,82,63,39,231,81,63,117,240,80,63,121,247,79,63,52,252,78,63,171,254,77,63,223,254,76,63,212,252,75,63,140,248,74,63,10,242,73,63,82,233,72,63,101,222,71,63,71,209,70,63,251,193,69,63,132,176,68,63,229,156,67,63,32,135,66,63,58,111,65,63,52,85,64,63,19,57,63,63,216,26,62,63,136,250,60,63,38,216,59,63,180,179,58,63,54,141,57,63,175,100,56,63,34,58,55,63,147,13,54,63,5,223,52,63,124,174,51,63,249,123,50,63,130,71,49,63,25,17,48,63,194,216,46,63,127,158,45,63,86,98,44,63,72,36,43,63,90,228,41,63,144,162,40,63,235,94,39,63,113,25,38,63,37,210,36,63,9,137,35,63,35,62,34,63,117,241,32,63,4,163,31,63,210,82,30,63,228,0,29,63,61,173,27,63,225,87,26,63,211,0,25,63,25,168,23,63,180,77,22,63,170,241,20,63,253,147,19,63,178,52,18,63,204,211,16,63,80,113,15,63,66,13,14,63,164,167,12,63,124,64,11,63,205,215,9,63,154,109,8,63,233,1,7,63,189,148,5,63,25,38,4,63,3,182,2,63,126,68,1,63,28,163,255,62,110,186,252,62,250,206,249,62,202,224,246,62,228,239,243,62,81,252,240,62,26,6,238,62,71,13,235,62,224,17,232,62,237,19,229,62,119,19,226,62,135,16,223,62,36,11,220,62,88,3,217,62,42,249,213,62,164,236,210,62,205,221,207,62,175,204,204,62,82,185,201,62,191,163,198,62,254,139,195,62,24,114,192,62,22,86,189,62,0,56,186,62,224,23,183,62,189,245,179,62,161,209,176,62,149,171,173,62,162,131,170,62,207,89,167,62,39,46,164,62,178,0,161,62,121,209,157,62,133,160,154,62,223,109,151,62,143,57,148,62,160,3,145,62,26,204,141,62,5,147,138,62,107,88,135,62,86,28,132,62,205,222,128,62,182,63,123,62,16,191,116,62,187,59,110,62,201,181,103,62,77,45,97,62,89,162,90,62,255,20,84,62,81,133,77,62,99,243,70,62,70,95,64,62,13,201,57,62,202,48,51,62,144,150,44,62,114,250,37,62,130,92,31,62,210,188,24,62,118,27,18,62,127,120,11,62,1,212,4,62,29,92,252,61,114,13,239,61,41,188,225,61,102,104,212,61,78,18,199,61,8,186,185,61,184,95,172,61,132,3,159,61,146,165,145,61,7,70,132,61,18,202,109,61,122,5,83,61,145,62,56,61,164,117,29,61,252,170,2,61,202,189,207,60,86,35,154,60,97,14,73,60,197,167,187,59,61,122,86,186,9,70,241,187,18,221,99,188,80,138,167,188,65,36,221,188,227,93,9,189,35,40,36,189,150,240,62,189,242,182,89,189,234,122,116,189,26,158,135,189,66,253,148,189,200,90,162,189,134,182,175,189,87,16,189,189,22,104,202,189,155,189,215,189,195,16,229,189,105,97,242,189,101,175,255,189,74,125,6,190,104,33,13,190,250,195,19,190,237,100,26,190,46,4,33,190,172,161,39,190,83,61,46,190,16,215,52,190,210,110,59,190,134,4,66,190,25,152,72,190,121,41,79,190,148,184,85,190,86,69,92,190,174,207,98,190,137,87,105,190,214,220,111,190,128,95,118,190,120,223,124,190,84,174,129,190,129,235,132,190,56,39,136,190,114,97,139,190,36,154,142,190,69,209,145,190,205,6,149,190,179,58,152,190,238,108,155,190,116,157,158,190,61,204,161,190,64,249,164,190,115,36,168,190,207,77,171,190,73,117,174,190,218,154,177,190,120,190,180,190,27,224,183,190,186,255,186,190,75,29,190,190,199,56,193,190,37,82,196,190,91,105,199,190,97,126,202,190,48,145,205,190,188,161,208,190,0,176,211,190,241,187,214,190,135,197,217,190,186,204,220,190,129,209,223,190,211,211,226,190,169,211,229,190,250,208,232,190,189,203,235,190,234,195,238,190,120,185,241,190,96,172,244,190,154,156,247,190,28,138,250,190,223,116,253,190,109,46,0,191,3,161,1,191,45,18,3,191,230,129,4,191,44,240,5,191,250,92,7,191,76,200,8,191,30,50,10,191,108,154,11,191,50,1,13,191,108,102,14,191,23,202,15,191,45,44,17,191,172,140,18,191,144,235,19,191,213,72,21,191,118,164,22,191,113,254,23,191,192,86,25,191,98,173,26,191,81,2,28,191,138,85,29,191,9,167,30,191,203,246,31,191,204,68,33,191,9,145,34,191,124,219,35,191,36,36,37,191,253,106,38,191,2,176,39,191,48,243,40,191,132,52,42,191,250,115,43,191,143,177,44,191,63,237,45,191,7,39,47,191,227,94,48,191,208,148,49,191,202,200,50,191,206,250,51,191,218,42,53,191,232,88,54,191,247,132,55,191,2,175,56,191,7,215,57,191,3,253,58,191,241,32,60,191,207,66,61,191,154,98,62,191,79,128,63,191,233,155,64,191,104,181,65,191,198,204,66,191,1,226,67,191,23,245,68,191,3,6,70,191,196,20,71,191,86,33,72,191,182,43,73,191,225,51,74,191,212,57,75,191,141,61,76,191,9,63,77,191,68,62,78,191,61,59,79,191,240,53,80,191,90,46,81,191,121,36,82,191,74,24,83,191,202,9,84,191,247,248,84,191,206,229,85,191,77,208,86,191,112,184,87,191,55,158,88,191,156,129,89,191,160,98,90,191,62,65,91,191,117,29,92,191,65,247,92,191,162,206,93,191,148,163,94,191,20,118,95,191,34,70,96,191,186,19,97,191,217,222,97,191,127,167,98,191,169,109,99,191,84,49,100,191,126,242,100,191,38,177,101,191,73,109,102,191,229,38,103,191,248,221,103,191,128,146,104,191,123,68,105,191,232,243,105,191,195,160,106,191,12,75,107,191,192,242,107,191,222,151,108,191,100,58,109,191,80,218,109,191,160,119,110,191,83,18,111,191,102,170,111,191,217,63,112,191,169,210,112,191,213,98,113,191,91,240,113,191,58,123,114,191,113,3,115,191,253,136,115,191,222,11,116,191,17,140,116,191,150,9,117,191,107,132,117,191,143,252,117,191,0,114,118,191,189,228,118,191,198,84,119,191,24,194,119,191,178,44,120,191,147,148,120,191,187,249,120,191,40,92,121,191,217,187,121,191,205,24,122,191,2,115,122,191,121,202,122,191,47,31,123,191,36,113,123,191,88,192,123,191,201,12,124,191,118,86,124,191,95,157,124,191,130,225,124,191,224,34,125,191,119,97,125,191,71,157,125,191,79,214,125,191,142,12,126,191,4,64,126,191,176,112,126,191,146,158,126,191,169,201,126,191,245,241,126,191,117,23,127,191,41,58,127,191,16,90,127,191,43,119,127,191,120,145,127,191,248,168,127,191,170,189,127,191,143,207,127,191,165,222,127,191,237,234,127,191,102,244,127,191,17,251,127,191,237,254,127,191,234,255,127,63,229,248,127,63,166,230,127,63,45,201,127,63,124,160,127,63,149,108,127,63,121,45,127,63,44,227,126,63,177,141,126,63,11,45,126,63,63,193,125,63,82,74,125,63,72,200,124,63,40,59,124,63,247,162,123,63,189,255,122,63,128,81,122,63,72,152,121,63,30,212,120,63,9,5,120,63,19,43,119,63,70,70,118,63,172,86,117,63,78,92,116,63,56,87,115,63,118,71,114,63,19,45,113,63,28,8,112,63,158,216,110,63,165,158,109,63,64,90,108,63,126,11,107,63,107,178,105,63,25,79,104,63,150,225,102,63,242,105,101,63,62,232,99,63,139,92,98,63,234,198,96,63,109,39,95,63,38,126,93,63,40,203,91,63,133,14,90,63,83,72,88,63,163,120,86,63,139,159,84,63,32,189,82,63,118,209,80,63,163,220,78,63,189,222,76,63,219,215,74,63,19,200,72,63,124,175,70,63,46,142,68,63,65,100,66,63,206,49,64,63,236,246,61,63,180,179,59,63,66,104,57,63,173,20,55,63,16,185,52,63,134,85,50,63,41,234,47,63,21,119,45,63,101,252,42,63,53,122,40,63,161,240,37,63,198,95,35,63,192,199,32,63,172,40,30,63,169,130,27,63,212,213,24,63,74,34,22,63,42,104,19,63,147,167,16,63,164,224,13,63,123,19,11,63,57,64,8,63,253,102,5,63,231,135,2,63,45,70,255,62,91,113,249,62,151,145,243,62,36,167,237,62,69,178,231,62,60,179,225,62,76,170,219,62,186,151,213,62,201,123,207,62,190,86,201,62,223,40,195,62,112,242,188,62,183,179,182,62,251,108,176,62,129,30,170,62,146,200,163,62,115,107,157,62,108,7,151,62,197,156,144,62,199,43,138,62,185,180,131,62,199,111,122,62,33,107,109,62,17,92,96,62,41,67,83,62,253,32,70,62,32,246,56,62,38,195,43,62,164,136,30,62,45,71,17,62,87,255,3,62,110,99,237,61,194,189,210,61,218,14,184,61,222,87,157,61,251,153,130,61,188,172,79,61,101,28,26,61,153,10,201,60,42,167,59,60,193,120,214,186,45,68,113,188,87,215,227,188,76,129,39,189,148,15,93,189,21,74,137,189,90,6,164,189,109,187,190,189,34,104,217,189,78,11,244,189,227,81,7,190,47,152,20,190,247,215,33,190,165,16,47,190,166,65,60,190,100,106,73,190,77,138,86,190,205,160,99,190,80,173,112,190,69,175,125,190,13,83,133,190,158,200,139,190,13,56,146,190,18,161,152,190,102,3,159,190,191,94,165,190,216,178,171,190,105,255,177,190,43,68,184,190,216,128,190,190,42,181,196,190,219,224,202,190,165,3,209,190,69,29,215,190,117,45,221,190,241,51,227,190,118,48,233,190,192,34,239,190,141,10,245,190,155,231,250,190,211,92,0,191,56,64,3,191,219,29,6,191,155,245,8,191,90,199,11,191,247,146,14,191,84,88,17,191,80,23,20,191,205,207,22,191,172,129,25,191,208,44,28,191,26,209,30,191,109,110,33,191,171,4,36,191,183,147,38,191,116,27,41,191,199,155,43,191,147,20,46,191,187,133,48,191,38,239,50,191,183,80,53,191,85,170,55,191,227,251,57,191,74,69,60,191,110,134,62,191,55,191,64,191,139,239,66,191,83,23,69,191,117,54,71,191,218,76,73,191,107,90,75,191,16,95,77,191,179,90,79,191,62,77,81,191,154,54,83,191,179,22,85,191,114,237,86,191,197,186,88,191,149,126,90,191,208,56,92,191,98,233,93,191,56,144,95,191,64,45,97,191,103,192,98,191,156,73,100,191,206,200,101,191,235,61,103,191,227,168,104,191,167,9,106,191,39,96,107,191,84,172,108,191,31,238,109,191,122,37,111,191,88,82,112,191,171,116,113,191,103,140,114,191,127,153,115,191,231,155,116,191,149,147,117,191,126,128,118,191,150,98,119,191,212,57,120,191,47,6,121,191,158,199,121,191,23,126,122,191,148,41,123,191,13,202,123,191,122,95,124,191,213,233,124,191,24,105,125,191,62,221,125,191,64,70,126,191,28,164,126,191,204,246,126,191,77,62,127,191,156,122,127,191,182,171,127,191,153,209,127,191,67,236,127,191,180,251,127,191,166,255,127,63,148,227,127,63,156,154,127,63,204,36,127,63,56,130,126,63,253,178,125,63,63,183,124,63,42,143,123,63,243,58,122,63,212,186,120,63,17,15,119,63,246,55,117,63,213,53,115,63,8,9,113,63,241,177,110,63,249,48,108,63,144,134,105,63,47,179,102,63,83,183,99,63,132,147,96,63,78,72,93,63,69,214,89,63,3,62,86,63,43,128,82,63,101,157,78,63,94,150,74,63,204,107,70,63,106,30,66,63,249,174,61,63,64,30,57,63,13,109,52,63,50,156,47,63,135,172,42,63,235,158,37,63,63,116,32,63,109,45,27,63,97,203,21,63,13,79,16,63,104,185,10,63,107,11,5,63,46,140,254,62,221,212,242,62,241,242,230,62,127,232,218,62,166,183,206,62,136,98,194,62,78,235,181,62,42,84,169,62,81,159,156,62,253,206,143,62,109,229,130,62,206,201,107,62,98,159,81,62,48,80,55,62,211,224,28,62,241,85,2,62,98,104,207,61,124,0,154,61,36,251,72,61,27,164,187,60,243,119,86,187,100,61,241,188,187,192,99,189,103,93,167,189,20,189,220,189,3,251,8,190,115,127,35,190,52,231,61,190,164,45,88,190,38,78,114,190,18,34,134,190,137,5,147,190,52,207,159,190,213,124,172,190,51,12,185,190,26,123,197,190,91,199,209,190,205,238,221,190,80,239,233,190,199,198,245,190,144,185,0,191,38,121,6,191,36,33,12,191,141,176,17,191,102,38,23,191,186,129,28,191,152,193,33,191,21,229,38,191,74,235,43,191,86,211,48,191,91,156,53,191,131,69,58,191,253,205,62,191,252,52,67,191,188,121,71,191,125,155,75,191,132,153,79,191,31,115,83,191,161,39,87,191,99,182,90,191,198,30,94,191,48,96,97,191,15,122,100,191,216,107,103,191,7,53,106,191,31,213,108,191,169,75,111,191,55,152,113,191,98,186,115,191,201,177,117,191,22,126,119,191,246,30,121,191,33,148,122,191,85,221,123,191,89,250,124,191,250,234,125,191,14,175,126,191,116,70,127,191,15,177,127,191,206,238,127,191,0,0,128,63,0,0,0,128,99,250,127,63,191,117,86,188,139,233,127,63,10,113,214,188,121,205,127,63,231,206,32,189,47,166,127,63,58,94,86,189,175,115,127,63,19,242,133,189,249,53,127,63,42,175,160,189,18,237,126,63,51,101,187,189,253,152,126,63,4,19,214,189,188,57,126,63,115,183,240,189,85,207,125,63,168,168,5,190,203,89,125,63,187,239,18,190,37,217,124,63,92,48,32,190,103,77,124,63,245,105,45,190,152,182,123,63,243,155,58,190,190,20,123,63,194,197,71,190,226,103,122,63,205,230,84,190,9,176,121,63,130,254,97,190,60,237,120,63,77,12,111,190,132,31,120,63,156,15,124,190,234,70,119,63,238,131,132,190,119,99,118,63,62,250,138,190,54,117,117,63,117,106,145,190,48,124,116,63,76,212,151,190,113,120,115,63,122,55,158,190,3,106,114,63,183,147,164,190,244,80,113,63,188,232,170,190,79,45,112,63,65,54,177,190,33,255,110,63,1,124,183,190,118,198,109,63,180,185,189,190,94,131,108,63,21,239,195,190,231,53,107,63,222,27,202,190,30,222,105,63,201,63,208,190,18,124,104,63,146,90,214,190,212,15,103,63,243,107,220,190,116,153,101,63,170,115,226,190,1,25,100,63,113,113,232,190,141,142,98,63,7,101,238,190,40,250,96,63,39,78,244,190,230,91,95,63,144,44,250,190,215,179,93,63,0,0,0,191,15,2,92,63,27,228,2,191,160,70,90,63,119,194,5,191,158,129,88,63,246,154,8,191,29,179,86,63,119,109,11,191,49,219,84,63,218,57,14,191,239,249,82,63,0,0,17,191,108,15,81,63,202,191,19,191,189,27,79,63,24,121,22,191,248,30,77,63,205,43,25,191,52,25,75,63,202,215,27,191,136,10,73,63,241,124,30,191,10,243,70,63,36,27,33,191,209,210,68,63,70,178,35,191,247,169,66,63,58,66,38,191,147,120,64,63,227,202,40,191,189,62,62,63,37,76,43,191,143,252,59,63,227,197,45,191,34,178,57,63,1,56,48,191,144,95,55,63,101,162,50,191,243,4,53,63,243,4,53,191,101,162,50,63,144,95,55,191,1,56,48,63,34,178,57,191,227,197,45,63,143,252,59,191,37,76,43,63,189,62,62,191,227,202,40,63,147,120,64,191,58,66,38,63,247,169,66,191,70,178,35,63,209,210,68,191,36,27,33,63,10,243,70,191,241,124,30,63,136,10,73,191,202,215,27,63,52,25,75,191,205,43,25,63,248,30,77,191,24,121,22,63,189,27,79,191,202,191,19,63,108,15,81,191,0,0,17,63,239,249,82,191,218,57,14,63,49,219,84,191,119,109,11,63,29,179,86,191,246,154,8,63,158,129,88,191,119,194,5,63,160,70,90,191,27,228,2,63,15,2,92,191,0,0,0,63,215,179,93,191,144,44,250,62,230,91,95,191,39,78,244,62,40,250,96,191,7,101,238,62,141,142,98,191,113,113,232,62,1,25,100,191,170,115,226,62,116,153,101,191,243,107,220,62,212,15,103,191,146,90,214,62,18,124,104,191,201,63,208,62,30,222,105,191,222,27,202,62,231,53,107,191,21,239,195,62,94,131,108,191,180,185,189,62,118,198,109,191,1,124,183,62,33,255,110,191,65,54,177,62,79,45,112,191,188,232,170,62,244,80,113,191,183,147,164,62,3,106,114,191,122,55,158,62,113,120,115,191,76,212,151,62,48,124,116,191,117,106,145,62,54,117,117,191,62,250,138,62,119,99,118,191,238,131,132,62,234,70,119,191,156,15,124,62,132,31,120,191,77,12,111,62,60,237,120,191,130,254,97,62,9,176,121,191,205,230,84,62,226,103,122,191,194,197,71,62,190,20,123,191,243,155,58,62,152,182,123,191,245,105,45,62,103,77,124,191,92,48,32,62,37,217,124,191,187,239,18,62,203,89,125,191,168,168,5,62,85,207,125,191,115,183,240,61,188,57,126,191,4,19,214,61,253,152,126,191,51,101,187,61,18,237,126,191,42,175,160,61,249,53,127,191,19,242,133,61,175,115,127,191,58,94,86,61,47,166,127,191,231,206,32,61,121,205,127,191,10,113,214,60,139,233,127,191,191,117,86,60,99,250,127,191,0,48,141,36,0,0,128,191,191,117,86,188,99,250,127,191,10,113,214,188,139,233,127,191,231,206,32,189,121,205,127,191,58,94,86,189,47,166,127,191,19,242,133,189,175,115,127,191,42,175,160,189,249,53,127,191,51,101,187,189,18,237,126,191,4,19,214,189,253,152,126,191,115,183,240,189,188,57,126,191,168,168,5,190,85,207,125,191,187,239,18,190,203,89,125,191,92,48,32,190,37,217,124,191,245,105,45,190,103,77,124,191,243,155,58,190,152,182,123,191,194,197,71,190,190,20,123,191,205,230,84,190,226,103,122,191,130,254,97,190,9,176,121,191,77,12,111,190,60,237,120,191,156,15,124,190,132,31,120,191,238,131,132,190,234,70,119,191,62,250,138,190,119,99,118,191,117,106,145,190,54,117,117,191,76,212,151,190,48,124,116,191,122,55,158,190,113,120,115,191,183,147,164,190,3,106,114,191,188,232,170,190,244,80,113,191,65,54,177,190,79,45,112,191,1,124,183,190,33,255,110,191,180,185,189,190,118,198,109,191,21,239,195,190,94,131,108,191,222,27,202,190,231,53,107,191,201,63,208,190,30,222,105,191,146,90,214,190,18,124,104,191,243,107,220,190,212,15,103,191,170,115,226,190,116,153,101,191,113,113,232,190,1,25,100,191,7,101,238,190,141,142,98,191,39,78,244,190,40,250,96,191,144,44,250,190,230,91,95,191,0,0,0,191,215,179,93,191,27,228,2,191,15,2,92,191,119,194,5,191,160,70,90,191,246,154,8,191,158,129,88,191,119,109,11,191,29,179,86,191,218,57,14,191,49,219,84,191,0,0,17,191,239,249,82,191,202,191,19,191,108,15,81,191,24,121,22,191,189,27,79,191,205,43,25,191,248,30,77,191,202,215,27,191,52,25,75,191,241,124,30,191,136,10,73,191,36,27,33,191,10,243,70,191,70,178,35,191,209,210,68,191,58,66,38,191,247,169,66,191,227,202,40,191,147,120,64,191,37,76,43,191,189,62,62,191,227,197,45,191,143,252,59,191,1,56,48,191,34,178,57,191,101,162,50,191,144,95,55,191,243,4,53,191,243,4,53,191,144,95,55,191,101,162,50,191,34,178,57,191,1,56,48,191,143,252,59,191,227,197,45,191,189,62,62,191,37,76,43,191,147,120,64,191,227,202,40,191,247,169,66,191,58,66,38,191,209,210,68,191,70,178,35,191,10,243,70,191,36,27,33,191,136,10,73,191,241,124,30,191,52,25,75,191,202,215,27,191,248,30,77,191,205,43,25,191,189,27,79,191,24,121,22,191,108,15,81,191,202,191,19,191,239,249,82,191,0,0,17,191,49,219,84,191,218,57,14,191,29,179,86,191,119,109,11,191,158,129,88,191,246,154,8,191,160,70,90,191,119,194,5,191,15,2,92,191,27,228,2,191,215,179,93,191,0,0,0,191,230,91,95,191,144,44,250,190,40,250,96,191,39,78,244,190,141,142,98,191,7,101,238,190,1,25,100,191,113,113,232,190,116,153,101,191,170,115,226,190,212,15,103,191,243,107,220,190,18,124,104,191,146,90,214,190,30,222,105,191,201,63,208,190,231,53,107,191,222,27,202,190,94,131,108,191,21,239,195,190,118,198,109,191,180,185,189,190,33,255,110,191,1,124,183,190,79,45,112,191,65,54,177,190,244,80,113,191,188,232,170,190,3,106,114,191,183,147,164,190,113,120,115,191,122,55,158,190,48,124,116,191,76,212,151,190,54,117,117,191,117,106,145,190,119,99,118,191,62,250,138,190,234,70,119,191,238,131,132,190,132,31,120,191,156,15,124,190,60,237,120,191,77,12,111,190,9,176,121,191,130,254,97,190,226,103,122,191,205,230,84,190,190,20,123,191,194,197,71,190,152,182,123,191,243,155,58,190,103,77,124,191,245,105,45,190,37,217,124,191,92,48,32,190,203,89,125,191,187,239,18,190,85,207,125,191,168,168,5,190,188,57,126,191,115,183,240,189,253,152,126,191,4,19,214,189,18,237,126,191,51,101,187,189,249,53,127,191,42,175,160,189,175,115,127,191,19,242,133,189,47,166,127,191,58,94,86,189,121,205,127,191,231,206,32,189,139,233,127,191,10,113,214,188,99,250,127,191,191,117,86,188,0,0,128,191,0,48,13,165,99,250,127,191,191,117,86,60,139,233,127,191,10,113,214,60,121,205,127,191,231,206,32,61,47,166,127,191,58,94,86,61,175,115,127,191,19,242,133,61,249,53,127,191,42,175,160,61,18,237,126,191,51,101,187,61,253,152,126,191,4,19,214,61,188,57,126,191,115,183,240,61,85,207,125,191,168,168,5,62,203,89,125,191,187,239,18,62,37,217,124,191,92,48,32,62,103,77,124,191,245,105,45,62,152,182,123,191,243,155,58,62,190,20,123,191,194,197,71,62,226,103,122,191,205,230,84,62,9,176,121,191,130,254,97,62,60,237,120,191,77,12,111,62,132,31,120,191,156,15,124,62,234,70,119,191,238,131,132,62,119,99,118,191,62,250,138,62,54,117,117,191,117,106,145,62,48,124,116,191,76,212,151,62,113,120,115,191,122,55,158,62,3,106,114,191,183,147,164,62,244,80,113,191,188,232,170,62,79,45,112,191,65,54,177,62,33,255,110,191,1,124,183,62,118,198,109,191,180,185,189,62,94,131,108,191,21,239,195,62,231,53,107,191,222,27,202,62,30,222,105,191,201,63,208,62,18,124,104,191,146,90,214,62,212,15,103,191,243,107,220,62,116,153,101,191,170,115,226,62,1,25,100,191,113,113,232,62,141,142,98,191,7,101,238,62,40,250,96,191,39,78,244,62,230,91,95,191,144,44,250,62,215,179,93,191,0,0,0,63,15,2,92,191,27,228,2,63,160,70,90,191,119,194,5,63,158,129,88,191,246,154,8,63,29,179,86,191,119,109,11,63,49,219,84,191,218,57,14,63,239,249,82,191,0,0,17,63,108,15,81,191,202,191,19,63,189,27,79,191,24,121,22,63,248,30,77,191,205,43,25,63,52,25,75,191,202,215,27,63,136,10,73,191,241,124,30,63,10,243,70,191,36,27,33,63,209,210,68,191,70,178,35,63,247,169,66,191,58,66,38,63,147,120,64,191,227,202,40,63,189,62,62,191,37,76,43,63,143,252,59,191,227,197,45,63,34,178,57,191,1,56,48,63,144,95,55,191,101,162,50,63,243,4,53,191,243,4,53,63,101,162,50,191,144,95,55,63,1,56,48,191,34,178,57,63,227,197,45,191,143,252,59,63,37,76,43,191,189,62,62,63,227,202,40,191,147,120,64,63,58,66,38,191,247,169,66,63,70,178,35,191,209,210,68,63,36,27,33,191,10,243,70,63,241,124,30,191,136,10,73,63,202,215,27,191,52,25,75,63,205,43,25,191,248,30,77,63,24,121,22,191,189,27,79,63,202,191,19,191,108,15,81,63,0,0,17,191,239,249,82,63,218,57,14,191,49,219,84,63,119,109,11,191,29,179,86,63,246,154,8,191,158,129,88,63,119,194,5,191,160,70,90,63,27,228,2,191,15,2,92,63,0,0,0,191,215,179,93,63,144,44,250,190,230,91,95,63,39,78,244,190,40,250,96,63,7,101,238,190,141,142,98,63,113,113,232,190,1,25,100,63,170,115,226,190,116,153,101,63,243,107,220,190,212,15,103,63,146,90,214,190,18,124,104,63,201,63,208,190,30,222,105,63,222,27,202,190,231,53,107,63,21,239,195,190,94,131,108,63,180,185,189,190,118,198,109,63,1,124,183,190,33,255,110,63,65,54,177,190,79,45,112,63,188,232,170,190,244,80,113,63,183,147,164,190,3,106,114,63,122,55,158,190,113,120,115,63,76,212,151,190,48,124,116,63,117,106,145,190,54,117,117,63,62,250,138,190,119,99,118,63,238,131,132,190,234,70,119,63,156,15,124,190,132,31,120,63,77,12,111,190,60,237,120,63,130,254,97,190,9,176,121,63,205,230,84,190,226,103,122,63,194,197,71,190,190,20,123,63,243,155,58,190,152,182,123,63,245,105,45,190,103,77,124,63,92,48,32,190,37,217,124,63,187,239,18,190,203,89,125,63,168,168,5,190,85,207,125,63,115,183,240,189,188,57,126,63,4,19,214,189,253,152,126,63,51,101,187,189,18,237,126,63,42,175,160,189,249,53,127,63,19,242,133,189,175,115,127,63,58,94,86,189,47,166,127,63,231,206,32,189,121,205,127,63,10,113,214,188,139,233,127,63,191,117,86,188,99,250,127,63,0,200,83,165,0,0,128,63,191,117,86,60,99,250,127,63,10,113,214,60,139,233,127,63,231,206,32,61,121,205,127,63,58,94,86,61,47,166,127,63,19,242,133,61,175,115,127,63,42,175,160,61,249,53,127,63,51,101,187,61,18,237,126,63,4,19,214,61,253,152,126,63,115,183,240,61,188,57,126,63,168,168,5,62,85,207,125,63,187,239,18,62,203,89,125,63,92,48,32,62,37,217,124,63,245,105,45,62,103,77,124,63,243,155,58,62,152,182,123,63,194,197,71,62,190,20,123,63,205,230,84,62,226,103,122,63,130,254,97,62,9,176,121,63,77,12,111,62,60,237,120,63,156,15,124,62,132,31,120,63,238,131,132,62,234,70,119,63,62,250,138,62,119,99,118,63,117,106,145,62,54,117,117,63,76,212,151,62,48,124,116,63,122,55,158,62,113,120,115,63,183,147,164,62,3,106,114,63,188,232,170,62,244,80,113,63,65,54,177,62,79,45,112,63,1,124,183,62,33,255,110,63,180,185,189,62,118,198,109,63,21,239,195,62,94,131,108,63,222,27,202,62,231,53,107,63,201,63,208,62,30,222,105,63,146,90,214,62,18,124,104,63,243,107,220,62,212,15,103,63,170,115,226,62,116,153,101,63,113,113,232,62,1,25,100,63,7,101,238,62,141,142,98,63,39,78,244,62,40,250,96,63,144,44,250,62,230,91,95,63,0,0,0,63,215,179,93,63,27,228,2,63,15,2,92,63,119,194,5,63,160,70,90,63,246,154,8,63,158,129,88,63,119,109,11,63,29,179,86,63,218,57,14,63,49,219,84,63,0,0,17,63,239,249,82,63,202,191,19,63,108,15,81,63,24,121,22,63,189,27,79,63,205,43,25,63,248,30,77,63,202,215,27,63,52,25,75,63,241,124,30,63,136,10,73,63,36,27,33,63,10,243,70,63,70,178,35,63,209,210,68,63,58,66,38,63,247,169,66,63,227,202,40,63,147,120,64,63,37,76,43,63,189,62,62,63,227,197,45,63,143,252,59,63,1,56,48,63,34,178,57,63,101,162,50,63,144,95,55,63,243,4,53,63,243,4,53,63,144,95,55,63,101,162,50,63,34,178,57,63,1,56,48,63,143,252,59,63,227,197,45,63,189,62,62,63,37,76,43,63,147,120,64,63,227,202,40,63,247,169,66,63,58,66,38,63,209,210,68,63,70,178,35,63,10,243,70,63,36,27,33,63,136,10,73,63,241,124,30,63,52,25,75,63,202,215,27,63,248,30,77,63,205,43,25,63,189,27,79,63,24,121,22,63,108,15,81,63,202,191,19,63,239,249,82,63,0,0,17,63,49,219,84,63,218,57,14,63,29,179,86,63,119,109,11,63,158,129,88,63,246,154,8,63,160,70,90,63,119,194,5,63,15,2,92,63,27,228,2,63,215,179,93,63,0,0,0,63,230,91,95,63,144,44,250,62,40,250,96,63,39,78,244,62,141,142,98,63,7,101,238,62,1,25,100,63,113,113,232,62,116,153,101,63,170,115,226,62,212,15,103,63,243,107,220,62,18,124,104,63,146,90,214,62,30,222,105,63,201,63,208,62,231,53,107,63,222,27,202,62,94,131,108,63,21,239,195,62,118,198,109,63,180,185,189,62,33,255,110,63,1,124,183,62,79,45,112,63,65,54,177,62,244,80,113,63,188,232,170,62,3,106,114,63,183,147,164,62,113,120,115,63,122,55,158,62,48,124,116,63,76,212,151,62,54,117,117,63,117,106,145,62,119,99,118,63,62,250,138,62,234,70,119,63,238,131,132,62,132,31,120,63,156,15,124,62,60,237,120,63,77,12,111,62,9,176,121,63,130,254,97,62,226,103,122,63,205,230,84,62,190,20,123,63,194,197,71,62,152,182,123,63,243,155,58,62,103,77,124,63,245,105,45,62,37,217,124,63,92,48,32,62,203,89,125,63,187,239,18,62,85,207,125,63,168,168,5,62,188,57,126,63,115,183,240,61,253,152,126,63,4,19,214,61,18,237,126,63,51,101,187,61,249,53,127,63,42,175,160,61,175,115,127,63,19,242,133,61,47,166,127,63,58,94,86,61,121,205,127,63,231,206,32,61,139,233,127,63,10,113,214,60,99,250,127,63,191,117,86,60,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,5,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,5,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,0,0,206,64,0,0,200,64,0,0,184,64,0,0,170,64,0,0,162,64,0,0,154,64,0,0,144,64,0,0,140,64,0,0,156,64,0,0,150,64,0,0,146,64,0,0,142,64,0,0,156,64,0,0,148,64,0,0,138,64,0,0,144,64,0,0,140,64,0,0,148,64,0,0,152,64,0,0,142,64,0,0,112,64,0,0,112,64,0,0,112,64,0,0,112,64,0,0,112,64,0,0,102,63,0,0,76,63,0,0,38,63,0,0,0,63,0,134,107,63,0,20,46,63,0,112,189,62,0,208,76,62,15,0,0,0,10,0,0,0,5,0,0,0,26,118,0,0,34,118,0,0,50,118,0,0,82,118,0,0,90,118,0,0,106,118,0,0,138,118,0,0,178,118,0,0,2,119,0,0,162,119,0,0,170,119,0,0,186,119,0,0,32,0,10,0,20,46,100,1,221,119,0,0,40,103,0,0,29,121,0,0,93,121,0,0,111,121,0,0,15,122,0,0,87,122,0,0,168,105,0,0,32,0,16,0,102,38,171,1,159,122,0,0,190,105,0,0,159,124,0,0,223,124,0,0,253,124,0,0,253,125,0,0,69,126,0,0,190,109,0,0,0,0,0,0,64,31,0,0,184,36,0,0,236,44,0,0,188,52,0,0,92,68,0,0,168,97,0,0,128,56,1,0,0,0,0,0,40,35,0,0,224,46,0,0,164,56,0,0,68,72,0,0,180,95,0,0,172,138,0,0,128,56,1,0,0,0,0,0,4,41,0,0,176,54,0,0,104,66,0,0,252,83,0,0,84,111,0,0,16,164,0,0,128,56,1,0,168,126,0,0,171,126,0,0,10,103,242,14,86,205,228,29,10,103,242,14,117,82,130,12,89,154,4,25,117,82,130,12,70,17,49,10,237,3,98,20,70,17,49,10,218,2,215,7,249,198,173,15,218,2,215,7,34,182,82,5,218,250,164,10,34,182,82,5,70,243,46,30,43,227,75,14,31,102,128,24,28,44,29,10,218,97,72,18,237,156,244,6,236,48,19,11,227,144,165,4,237,164,29,2,10,223,107,3,48,117,0,0,112,23,0,0,32,209,255,255,32,209,255,255,0,64,0,0,108,34,0,0,66,15,0,0,18,6,0,0,77,2,0,0,219,0,0,0,237,0,0,0,153,0,0,0,73,0,0,0,30,0,0,0,12,0,0,0,7,0,0,0,0,64,0,0,147,93,0,0,189,112,0,0,237,121,0,0,178,125,0,0,36,127,0,0,16,39,0,0,232,3,0,0,248,42,0,0,232,3,0,0,188,52,0,0,232,3,0,0,176,54,0,0,208,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,46,0,0,16,39,0,0,16,39,0,0,248,42,0,0,248,42,0,0,128,62,0,0,188,52,0,0,188,52,0,0,152,58,0,0,152,58,0,0,32,78,0,0,128,62,0,0,128,62,0,0,80,70,0,0,80,70,0,0,192,93,0,0,80,70,0,0,80,70,0,0,8,82,0,0,8,82,0,0,0,125,0,0,240,85,0,0,240,85,0,0,96,109,0,0,96,109,0,0,0,250,0,0,112,148,0,0,112,148,0,0,80,195,0,0,80,195,0,0,224,46,0,0,232,3,0,0,176,54,0,0,232,3,0,0,128,62,0,0,232,3,0,0,32,78,0,0,232,3,0,0,240,85,0,0,232,3,0,0,230,90,52,56,119,78,51,57,211,217,201,57,146,145,51,58,204,96,140,58,97,251,201,58,153,126,9,59,203,128,51,59,213,37,99,59,119,46,140,59,168,138,169,59,69,184,201,59,135,166,236,59,232,46,9,60,174,102,29,60,247,2,51,60,147,255,73,60,79,88,98,60,94,17,124,60,46,145,139,60,189,199,153,60,92,172,168,60,243,60,184,60,129,121,200,60,238,95,217,60,57,240,234,60,99,42,253,60,53,7,8,61,16,204,17,61,205,228,27,61,97,80,38,61,203,14,49,61,0,31,60,61,254,128,71,61,198,52,83,61,63,56,95,61,105,139,107,61,69,46,120,61,105,144,130,61,123,48,137,61,224,247,143,61,138,229,150,61,123,249,157,61,177,51,165,61,33,147,172,61,80,24,180,61,51,194,187,61,79,145,195,61,18,132,203,61,2,155,211,61,31,214,219,61,215,51,228,61,175,180,236,61,33,88,245,61,168,29,254,61,161,130,3,62,242,6,8,62,199,155,12,62,221,64,17,62,52,246,21,62,69,187,26,62,17,144,31,62,84,116,36,62,203,103,41,62,51,106,46,62,141,123,51,62,82,155,56,62,197,201,61,62,28,6,67,62,89,80,72,62,122,168,77,62,183,13,83,62,82,128,88,62,8,0,94,62,84,140,99,62,242,36,105,62,37,202,110,62,36,123,116,62,172,55,122,62,0,0,128,62,171,233,130,62,249,216,133,62,133,205,136,62,80,199,139,62,55,198,142,62,247,201,145,62,179,210,148,62,38,224,151,62,15,242,154,62,108,8,158,62,28,35,161,62,255,65,164,62,208,100,167,62,177,139,170,62,28,182,173,62,84,228,176,62,211,21,180,62,186,74,183,62,232,130,186,62,249,189,189,62,13,252,192,62,226,60,196,62,86,128,199,62,71,198,202,62,149,14,206,62,251,88,209,62,122,165,212,62,241,243,215,62,28,68,219,62,217,149,222,62,8,233,225,62,167,61,229,62,83,147,232,62,12,234,235,62,175,65,239,62,28,154,242,62,14,243,245,62,136,76,249,62,34,166,252,62,0,0,0,63,239,172,1,63,188,89,3,63,121,6,5,63,242,178,6,63,41,95,8,63,250,10,10,63,86,182,11,63,44,97,13,63,124,11,15,63,19,181,16,63,242,93,18,63,8,6,20,63,67,173,21,63,130,83,23,63,182,248,24,63,220,156,26,63,213,63,28,63,143,225,29,63,249,129,31,63,4,33,33,63,140,190,34,63,163,90,36,63,23,245,37,63,214,141,39,63,242,36,41,63,40,186,42,63,152,77,44,63,1,223,45,63,114,110,47,63,202,251,48,63,249,134,50,63,237,15,52,63,167,150,53,63,4,27,55,63,229,156,56,63,88,28,58,63,61,153,59,63,131,19,61,63,42,139,62,63,0,0,64,63,21,114,65,63,55,225,66,63,119,77,68,63,195,182,69,63,235,28,71,63,254,127,72,63,236,223,73,63,146,60,75,63,225,149,76,63,234,235,77,63,121,62,79,63,143,141,80,63,43,217,81,63,29,33,83,63,115,101,84,63,13,166,85,63,235,226,86,63,252,27,88,63,47,81,89,63,115,130,90,63,201,175,91,63,14,217,92,63,67,254,93,63,88,31,95,63,75,60,96,63,252,84,97,63,106,105,98,63,133,121,99,63,60,133,100,63,160,140,101,63,126,143,102,63,214,141,103,63,186,135,104,63,246,124,105,63,156,109,106,63,138,89,107,63,209,64,108,63,79,35,109,63,4,1,110,63,241,217,110,63,243,173,111,63,28,125,112,63,73,71,113,63,124,12,114,63,180,204,114,63,240,135,115,63,16,62,116,63,19,239,116,63,250,154,117,63,179,65,118,63,63,227,118,63,141,127,119,63,173,22,120,63,126,168,120,63,1,53,121,63,52,188,121,63,24,62,122,63,157,186,122,63,194,49,123,63],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([119,163,123,63,187,15,124,63,159,118,124,63,2,216,124,63,244,51,125,63,101,138,125,63,68,219,125,63,179,38,126,63,143,108,126,63,235,172,126,63,163,231,126,63,218,28,127,63,127,76,127,63,129,118,127,63,2,155,127,63,208,185,127,63,28,211,127,63,197,230,127,63,203,244,127,63,47,253,127,63,0,0,128,63,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,28,0,0,0,32,0,0,0,40,0,0,0,48,0,0,0,56,0,0,0,64,0,0,0,80,0,0,0,96,0,0,0,112,0,0,0,136,0,0,0,160,0,0,0,192,0,0,0,240,0,0,0,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,208,37,180,62,151,57,173,62,9,165,159,62,250,237,139,62,205,172,101,62,248,169,42,62,52,48,210,61,90,241,13,61,90,241,13,189,52,48,210,189,248,169,42,190,205,172,101,190,250,237,139,190,9,165,159,190,151,57,173,190,208,37,180,190,135,138,177,62,27,131,150,62,96,35,73,62,196,66,141,61,196,66,141,189,96,35,73,190,27,131,150,190,135,138,177,190,135,138,177,190,27,131,150,190,96,35,73,190,196,66,141,189,196,66,141,61,96,35,73,62,27,131,150,62,135,138,177,62,151,57,173,62,205,172,101,62,90,241,13,61,248,169,42,190,9,165,159,190,208,37,180,190,250,237,139,190,52,48,210,189,52,48,210,61,250,237,139,62,208,37,180,62,9,165,159,62,248,169,42,62,90,241,13,189,205,172,101,190,151,57,173,190,125,61,167,62,210,139,10,62,210,139,10,190,125,61,167,190,125,61,167,190,210,139,10,190,210,139,10,62,125,61,167,62,125,61,167,62,210,139,10,62,210,139,10,190,125,61,167,190,125,61,167,190,210,139,10,190,210,139,10,62,125,61,167,62,9,165,159,62,90,241,13,61,250,237,139,190,151,57,173,190,52,48,210,189,205,172,101,62,208,37,180,62,248,169,42,62,248,169,42,190,208,37,180,190,205,172,101,190,52,48,210,61,151,57,173,62,250,237,139,62,90,241,13,189,9,165,159,190,27,131,150,62,196,66,141,189,135,138,177,190,96,35,73,190,96,35,73,62,135,138,177,62,196,66,141,61,27,131,150,190,27,131,150,190,196,66,141,61,135,138,177,62,96,35,73,62,96,35,73,190,135,138,177,190,196,66,141,189,27,131,150,62,250,237,139,62,248,169,42,190,151,57,173,190,90,241,13,61,208,37,180,62,52,48,210,61,9,165,159,190,205,172,101,190,205,172,101,62,9,165,159,62,52,48,210,189,208,37,180,190,90,241,13,189,151,57,173,62,248,169,42,62,250,237,139,190,22,235,181,64,30,107,94,64,35,164,226,63,185,197,204,63,91,124,113,64,184,115,10,64,116,96,161,63,136,245,142,63,19,155,245,63,0,0,0,0,5,193,35,61,233,125,163,61,37,150,244,61,226,116,34,62,172,28,74,62,221,37,113,62,52,186,139,62,180,119,158,62,228,191,176,62,173,136,194,62,37,201,211,62,24,122,228,62,24,149,244,62,200,10,2,63,28,124,9,63,73,157,16,63,202,109,23,63,192,237,29,63,159,29,36,63,84,254,41,63,46,145,47,63,224,215,52,63,99,212,57,63,240,136,62,63,211,247,66,63,171,35,71,63,23,15,75,63,216,188,78,63,173,47,82,63,106,106,85,63,206,111,88,63,154,66,91,63,142,229,93,63,75,91,96,63,110,166,98,63,100,201,100,63,155,198,102,63,111,160,104,63,247,88,106,63,128,242,107,63,223,110,109,63,11,208,110,63,202,23,112,63,224,71,113,63,225,97,114,63,77,103,115,63,150,89,116,63,12,58,117,63,255,9,118,63,138,202,118,63,187,124,119,63,192,33,120,63,98,186,120,63,157,71,121,63,75,202,121,63,36,67,122,63,242,178,122,63,59,26,123,63,200,121,123,63,32,210,123,63,200,35,124,63,55,111,124,63,242,180,124,63,94,245,124,63,224,48,125,63,236,103,125,63,183,154,125,63,180,201,125,63,6,245,125,63,17,29,126,63,24,66,126,63,78,100,126,63,211,131,126,63,253,160,126,63,237,187,126,63,195,212,126,63,179,235,126,63,239,0,127,63,135,20,127,63,141,38,127,63,67,55,127,63,170,70,127,63,227,84,127,63,15,98,127,63,47,110,127,63,100,121,127,63,190,131,127,63,63,141,127,63,24,150,127,63,56,158,127,63,194,165,127,63,163,172,127,63,16,179,127,63,245,184,127,63,119,190,127,63,114,195,127,63,25,200,127,63,108,204,127,63,91,208,127,63,6,212,127,63,111,215,127,63,131,218,127,63,102,221,127,63,21,224,127,63,130,226,127,63,205,228,127,63,230,230,127,63,205,232,127,63,146,234,127,63,70,236,127,63,200,237,127,63,40,239,127,63,120,240,127,63,166,241,127,63,195,242,127,63,191,243,127,63,186,244,127,63,148,245,127,63,94,246,127,63,39,247,127,63,207,247,127,63,119,248,127,63,253,248,127,63,148,249,127,63,9,250,127,63,127,250,127,63,244,250,127,63,89,251,127,63,173,251,127,63,1,252,127,63,84,252,127,63,152,252,127,63,219,252,127,63,30,253,127,63,80,253,127,63,130,253,127,63,181,253,127,63,231,253,127,63,9,254,127,63,59,254,127,63,93,254,127,63,126,254,127,63,143,254,127,63,176,254,127,63,210,254,127,63,227,254,127,63,244,254,127,63,21,255,127,63,38,255,127,63,55,255,127,63,71,255,127,63,88,255,127,63,88,255,127,63,105,255,127,63,122,255,127,63,122,255,127,63,139,255,127,63,155,255,127,63,155,255,127,63,155,255,127,63,172,255,127,63,172,255,127,63,189,255,127,63,189,255,127,63,189,255,127,63,206,255,127,63,206,255,127,63,206,255,127,63,206,255,127,63,206,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,102,190,3,191,246,224,191,60,157,186,18,190,208,219,179,189,72,48,246,186,182,229,210,188,213,65,222,61,240,207,90,59,200,178,191,59,159,161,201,188,250,37,18,62,197,7,143,187,243,14,38,60,204,209,227,189,36,194,165,189,19,194,153,189,224,23,242,60,183,254,6,60,92,0,26,62,74,110,3,61,5,134,145,189,72,22,184,191,116,238,38,63,186,69,133,61,191,43,198,191,247,0,45,62,205,175,246,191,184,41,84,61,240,93,137,189,55,86,141,189,79,56,34,59,47,210,85,189,222,77,129,61,157,57,90,61,141,150,67,61,69,240,63,188,125,202,17,62,2,75,238,188,143,251,142,190,149,243,221,190,5,218,162,189,100,203,194,190,39,249,81,189,42,200,95,62,214,27,165,190,164,136,136,63,50,60,214,189,63,111,150,192,80,195,159,62,251,6,142,62,97,253,45,192,185,165,217,63,209,63,17,190,180,109,61,60,3,0,129,61,242,108,37,61,88,112,100,60,129,36,141,187,229,187,47,189,84,203,113,189,208,108,77,189,79,79,233,188,214,67,42,189,98,208,51,189,100,123,168,61,57,237,73,62,37,204,20,61,8,85,111,189,139,21,154,61,88,204,163,189,29,201,21,190,118,138,37,62,218,3,61,190,199,15,21,62,178,185,226,62,230,92,206,63,144,73,142,63,20,203,39,64,23,217,30,192,78,154,230,189,146,7,226,189,77,44,16,190,254,13,58,190,51,217,132,61,13,126,172,61,34,72,191,61,149,185,25,62,103,69,4,62,164,23,53,62,2,41,17,62,65,44,139,190,118,193,112,62,203,236,136,61,157,47,222,190,107,184,232,61,144,105,45,190,5,81,179,191,150,236,32,63,41,117,9,190,159,233,205,62,180,142,238,63,17,30,197,63,82,68,138,192,112,63,60,63,211,218,76,63,69,170,30,188,69,115,46,61,66,58,161,60,31,242,150,188,151,84,180,185,62,113,136,187,167,56,146,58,51,199,141,60,39,156,35,188,11,40,212,188,79,56,162,58,13,132,170,187,1,112,103,189,205,137,130,61,148,208,167,59,196,86,181,60,179,87,6,60,229,78,63,189,5,145,96,189,7,211,77,187,8,119,151,191,169,193,240,63,130,173,210,190,233,67,61,192,175,125,5,191,135,20,139,190,176,227,255,61,100,74,90,189,25,231,207,61,249,177,90,57,241,48,72,189,162,143,131,61,97,57,29,189,102,66,93,60,68,104,41,189,187,177,5,189,140,38,97,188,217,127,184,188,160,220,187,189,109,54,142,190,55,222,61,190,90,249,64,61,109,230,0,190,19,98,134,62,172,230,89,190,94,72,231,189,81,218,255,191,62,64,207,190,163,201,101,62,122,81,35,63,128,96,142,190,253,67,148,189,55,57,92,189,204,197,9,189,1,172,185,189,16,87,131,189,39,34,146,189,159,194,86,61,112,127,199,59,156,112,154,61,143,12,72,189,31,40,220,187,138,79,43,61,116,169,91,61,133,210,7,190,219,65,219,60,245,100,126,190,239,164,42,188,150,150,17,61,236,219,89,190,14,21,155,190,182,147,18,189,233,240,192,62,161,214,24,63,78,38,42,191,156,110,137,62,66,232,192,190,17,1,135,191,163,56,108,60,194,107,55,62,253,132,19,61,93,140,97,62,208,191,184,187,132,236,1,61,125,99,126,61,65,92,255,187,234,84,1,60,194,197,101,59,21,184,43,60,200,161,20,61,53,126,33,190,108,31,135,189,165,179,189,189,163,146,252,59,34,91,129,61,80,100,167,61,50,61,217,190,1,75,51,189,139,84,120,190,81,18,54,63,81,136,60,191,127,106,12,192,174,99,220,189,24,92,51,190,247,37,22,189,95,199,73,188,87,184,128,189,206,98,179,188,177,79,227,187,88,204,227,59,156,64,166,59,62,126,107,59,64,143,172,59,105,168,17,61,28,193,28,61,18,40,12,61,94,122,1,188,146,5,140,188,123,161,64,61,208,173,161,60,78,99,123,188,30,236,131,61,195,187,188,190,240,54,138,189,251,232,52,192,25,173,171,63,106,99,161,189,62,150,94,192,224,218,1,63,38,254,80,191,194,71,105,188,199,103,2,190,5,252,218,189,211,66,19,189,213,33,215,61,145,70,149,62,88,26,72,62,144,102,177,61,134,89,136,189,241,71,209,189,58,152,200,61,137,239,4,190,134,228,204,62,125,148,209,190,190,6,115,189,240,99,134,189,162,97,81,190,4,30,56,62,13,116,5,58,172,248,203,61,197,32,24,192,57,181,47,191,13,83,111,63,83,34,141,63,204,238,177,63,211,193,138,192,180,6,45,187,141,166,233,59,241,160,217,61,233,44,19,62,184,89,140,189,248,222,95,189,235,197,144,188,28,62,158,189,31,179,216,188,241,26,42,188,67,20,221,188,189,29,225,187,42,57,103,62,189,196,208,62,235,236,122,189,120,72,108,189,67,116,56,190,88,30,100,190,115,105,236,190,14,164,171,62,201,89,132,63,65,183,135,64,44,12,177,190,93,52,24,191,10,72,152,194,66,210,135,190,50,246,79,61,6,178,131,61,143,160,29,61,193,219,45,61,143,217,30,189,243,83,193,188,118,170,151,189,48,53,221,188,47,137,16,60,76,64,98,189,35,52,159,187,70,235,160,62,105,138,184,62,236,49,161,189,205,1,226,61,114,248,212,190,65,42,197,190,242,96,139,190,202,137,198,191,154,64,17,190,53,211,229,62,16,62,16,191,17,25,20,192,238,234,245,189,33,229,191,191,126,86,81,191,15,26,75,189,126,14,189,188,36,131,183,188,139,197,239,61,176,15,33,61,206,250,84,61,4,123,7,61,3,233,226,189,114,242,172,60,0,152,161,188,108,145,153,60,142,25,77,60,139,84,24,62,30,136,188,61,226,88,175,190,190,132,10,62,211,48,44,190,142,230,8,189,15,166,119,189,82,237,3,190,247,57,42,63,24,122,20,190,3,178,17,64,75,176,164,63,255,89,87,63,128,101,27,192,70,205,188,60,103,38,104,62,241,132,25,189,157,42,31,62,231,250,35,61,84,30,61,190,92,146,3,62,205,105,192,189,79,250,108,189,83,225,217,60,65,169,204,189,174,52,4,189,120,95,165,190,121,234,65,190,23,242,60,191,60,155,154,189,198,222,91,62,119,244,191,189,21,28,50,191,29,45,184,61,216,245,3,192,230,36,140,190,73,160,101,191,176,175,5,62,139,222,9,62,12,147,165,63,152,163,170,59,90,205,4,189,116,209,173,59,15,154,157,60,13,108,87,59,139,124,205,60,206,221,174,59,233,66,145,188,201,195,202,59,186,38,172,59,152,24,137,58,222,164,19,189,3,211,36,61,254,112,38,189,228,68,96,60,51,95,180,61,14,192,161,188,106,49,184,61,77,150,36,60,66,210,66,189,67,144,59,191,88,83,25,61,119,17,22,190,14,191,107,190,40,39,68,192,197,114,179,191,231,152,162,60,102,0,35,61,3,216,155,188,12,206,64,61,6,132,6,190,131,82,68,190,218,92,144,188,143,192,68,189,71,31,99,190,111,47,137,190,208,181,239,188,43,186,122,61,122,254,4,190,79,228,205,59,199,245,175,189,164,171,143,60,29,153,93,61,39,17,166,189,102,249,194,190,166,98,99,190,149,68,2,191,108,93,242,190,106,76,248,62,220,46,18,192,64,149,100,60,99,156,121,64,210,227,219,63,35,132,183,191,67,86,45,192,108,178,226,63,167,92,175,64,132,42,185,63,203,185,0,64,87,33,241,191,184,146,105,192,178,186,161,191,34,136,71,63,187,68,7,64,105,169,70,64,117,31,216,63,117,200,142,192,147,169,206,191,224,74,102,64,30,220,27,64,194,221,161,191,93,252,213,62,40,184,188,63,122,165,10,64,29,90,244,191,194,48,84,191,159,171,177,63,6,129,43,192,192,94,225,189,230,92,250,63,155,171,50,63,41,95,160,190,38,170,99,191,79,4,145,62,190,51,114,63,8,0,0,0,4,0,0,0,225,122,84,63,246,40,92,63,212,93,0,0,16,0,0,0,4,0,0,0,154,153,89,63,174,71,97,63,212,93,0,0,32,0,0,0,4,0,0,0,193,202,97,63,195,245,104,63,212,93,0,0,48,0,0,0,8,0,0,0,184,30,101,63,131,192,106,63,220,93,0,0,64,0,0,0,8,0,0,0,168,198,107,63,215,163,112,63,220,93,0,0,80,0,0,0,16,0,0,0,49,8,108,63,215,163,112,63,228,93,0,0,96,0,0,0,16,0,0,0,215,163,112,63,133,235,113,63,228,93,0,0,128,0,0,0,16,0,0,0,51,51,115,63,51,51,115,63,228,93,0,0,160,0,0,0,16,0,0,0,143,194,117,63,143,194,117,63,228,93,0,0,192,0,0,0,32,0,0,0,217,206,119,63,217,206,119,63,236,93,0,0,0,1,0,0,32,0,0,0,154,153,121,63,154,153,121,63,236,93,0,0,104,4,0,0,32,0,0,0,72,3,0,0,32,0,0,0,40,2,0,0,32,0,0,0,8,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,202,69,27,76,255,82,130,90,179,98,162,107,96,117,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,10,0,12,0,14,0,16,0,20,0,24,0,28,0,34,0,40,0,48,0,60,0,78,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,8,0,8,0,16,0,16,0,16,0,21,0,21,0,24,0,29,0,34,0,36,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,41,0,41,0,41,0,82,0,82,0,123,0,164,0,200,0,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,41,0,41,0,41,0,123,0,123,0,123,0,164,0,164,0,240,0,10,1,27,1,39,1,41,0,41,0,41,0,41,0,41,0,41,0,41,0,41,0,123,0,123,0,123,0,123,0,240,0,240,0,240,0,10,1,10,1,49,1,62,1,72,1,80,1,123,0,123,0,123,0,123,0,123,0,123,0,123,0,123,0,240,0,240,0,240,0,240,0,49,1,49,1,49,1,62,1,62,1,87,1,95,1,102,1,108,1,240,0,240,0,240,0,240,0,240,0,240,0,240,0,240,0,49,1,49,1,49,1,49,1,87,1,87,1,87,1,95,1,95,1,114,1,120,1,126,1,131,1,0,0,12,0,24,0,36,0,48,0,4,0,16,0,28,0,40,0,52,0,8,0,20,0,32,0,44,0,56,0,1,0,13,0,25,0,37,0,49,0,5,0,17,0,29,0,41,0,53,0,9,0,21,0,33,0,45,0,57,0,2,0,14,0,26,0,38,0,50,0,6,0,18,0,30,0,42,0,54,0,10,0,22,0,34,0,46,0,58,0,3,0,15,0,27,0,39,0,51,0,7,0,19,0,31,0,43,0,55,0,11,0,23,0,35,0,47,0,59,0,0,0,24,0,48,0,72,0,96,0,8,0,32,0,56,0,80,0,104,0,16,0,40,0,64,0,88,0,112,0,4,0,28,0,52,0,76,0,100,0,12,0,36,0,60,0,84,0,108,0,20,0,44,0,68,0,92,0,116,0,1,0,25,0,49,0,73,0,97,0,9,0,33,0,57,0,81,0,105,0,17,0,41,0,65,0,89,0,113,0,5,0,29,0,53,0,77,0,101,0,13,0,37,0,61,0,85,0,109,0,21,0,45,0,69,0,93,0,117,0,2,0,26,0,50,0,74,0,98,0,10,0,34,0,58,0,82,0,106,0,18,0,42,0,66,0,90,0,114,0,6,0,30,0,54,0,78,0,102,0,14,0,38,0,62,0,86,0,110,0,22,0,46,0,70,0,94,0,118,0,3,0,27,0,51,0,75,0,99,0,11,0,35,0,59,0,83,0,107,0,19,0,43,0,67,0,91,0,115,0,7,0,31,0,55,0,79,0,103,0,15,0,39,0,63,0,87,0,111,0,23,0,47,0,71,0,95,0,119,0,0,0,48,0,96,0,144,0,192,0,16,0,64,0,112,0,160,0,208,0,32,0,80,0,128,0,176,0,224,0,4,0,52,0,100,0,148,0,196,0,20,0,68,0,116,0,164,0,212,0,36,0,84,0,132,0,180,0,228,0,8,0,56,0,104,0,152,0,200,0,24,0,72,0,120,0,168,0,216,0,40,0,88,0,136,0,184,0,232,0,12,0,60,0,108,0,156,0,204,0,28,0,76,0,124,0,172,0,220,0,44,0,92,0,140,0,188,0,236,0,1,0,49,0,97,0,145,0,193,0,17,0,65,0,113,0,161,0,209,0,33,0,81,0,129,0,177,0,225,0,5,0,53,0,101,0,149,0,197,0,21,0,69,0,117,0,165,0,213,0,37,0,85,0,133,0,181,0,229,0,9,0,57,0,105,0,153,0,201,0,25,0,73,0,121,0,169,0,217,0,41,0,89,0,137,0,185,0,233,0,13,0,61,0,109,0,157,0,205,0,29,0,77,0,125,0,173,0,221,0,45,0,93,0,141,0,189,0,237,0,2,0,50,0,98,0,146,0,194,0,18,0,66,0,114,0,162,0,210,0,34,0,82,0,130,0,178,0,226,0,6,0,54,0,102,0,150,0,198,0,22,0,70,0,118,0,166,0,214,0,38,0,86,0,134,0,182,0,230,0,10,0,58,0,106,0,154,0,202,0,26,0,74,0,122,0,170,0,218,0,42,0,90,0,138,0,186,0,234,0,14,0,62,0,110,0,158,0,206,0,30,0,78,0,126,0,174,0,222,0,46,0,94,0,142,0,190,0,238,0,3,0,51,0,99,0,147,0,195,0,19,0,67,0,115,0,163,0,211,0,35,0,83,0,131,0,179,0,227,0,7,0,55,0,103,0,151,0,199,0,23,0,71,0,119,0,167,0,215,0,39,0,87,0,135,0,183,0,231,0,11,0,59,0,107,0,155,0,203,0,27,0,75,0,123,0,171,0,219,0,43,0,91,0,139,0,187,0,235,0,15,0,63,0,111,0,159,0,207,0,31,0,79,0,127,0,175,0,223,0,47,0,95,0,143,0,191,0,239,0,0,0,96,0,192,0,32,1,128,1,32,0,128,0,224,0,64,1,160,1,64,0,160,0,0,1,96,1,192,1,8,0,104,0,200,0,40,1,136,1,40,0,136,0,232,0,72,1,168,1,72,0,168,0,8,1,104,1,200,1,16,0,112,0,208,0,48,1,144,1,48,0,144,0,240,0,80,1,176,1,80,0,176,0,16,1,112,1,208,1,24,0,120,0,216,0,56,1,152,1,56,0,152,0,248,0,88,1,184,1,88,0,184,0,24,1,120,1,216,1,4,0,100,0,196,0,36,1,132,1,36,0,132,0,228,0,68,1,164,1,68,0,164,0,4,1,100,1,196,1,12,0,108,0,204,0,44,1,140,1,44,0,140,0,236,0,76,1,172,1,76,0,172,0,12,1,108,1,204,1,20,0,116,0,212,0,52,1,148,1,52,0,148,0,244,0,84,1,180,1,84,0,180,0,20,1,116,1,212,1,28,0,124,0,220,0,60,1,156,1,60,0,156,0,252,0,92,1,188,1,92,0,188,0,28,1,124,1,220,1,1,0,97,0,193,0,33,1,129,1,33,0,129,0,225,0,65,1,161,1,65,0,161,0,1,1,97,1,193,1,9,0,105,0,201,0,41,1,137,1,41,0,137,0,233,0,73,1,169,1,73,0,169,0,9,1,105,1,201,1,17,0,113,0,209,0,49,1,145,1,49,0,145,0,241,0,81,1,177,1,81,0,177,0,17,1,113,1,209,1,25,0,121,0,217,0,57,1,153,1,57,0,153,0,249,0,89,1,185,1,89,0,185,0,25,1,121,1,217,1,5,0,101,0,197,0,37,1,133,1,37,0,133,0,229,0,69,1,165,1,69,0,165,0,5,1,101,1,197,1,13,0,109,0,205,0,45,1,141,1,45,0,141,0,237,0,77,1,173,1,77,0,173,0,13,1,109,1,205,1,21,0,117,0,213,0,53,1,149,1,53,0,149,0,245,0,85,1,181,1,85,0,181,0,21,1,117,1,213,1,29,0,125,0,221,0,61,1,157,1,61,0,157,0,253,0,93,1,189,1,93,0,189,0,29,1,125,1,221,1,2,0,98,0,194,0,34,1,130,1,34,0,130,0,226,0,66,1,162,1,66,0,162,0,2,1,98,1,194,1,10,0,106,0,202,0,42,1,138,1,42,0,138,0,234,0,74,1,170,1,74,0,170,0,10,1,106,1,202,1,18,0,114,0,210,0,50,1,146,1,50,0,146,0,242,0,82,1,178,1,82,0,178,0,18,1,114,1,210,1,26,0,122,0,218,0,58,1,154,1,58,0,154,0,250,0,90,1,186,1,90,0,186,0,26,1,122,1,218,1,6,0,102,0,198,0,38,1,134,1,38,0,134,0,230,0,70,1,166,1,70,0,166,0,6,1,102,1,198,1,14,0,110,0,206,0,46,1,142,1,46,0,142,0,238,0,78,1,174,1,78,0,174,0,14,1,110,1,206,1,22,0,118,0,214,0,54,1,150,1,54,0,150,0,246,0,86,1,182,1,86,0,182,0,22,1,118,1,214,1,30,0,126,0,222,0,62,1,158,1,62,0,158,0,254,0,94,1,190,1,94,0,190,0,30,1,126,1,222,1,3,0,99,0,195,0,35,1,131,1,35,0,131,0,227,0,67,1,163,1,67,0,163,0,3,1,99,1,195,1,11,0,107,0,203,0,43,1,139,1,43,0,139,0,235,0,75,1,171,1,75,0,171,0,11,1,107,1,203,1,19,0,115,0,211,0,51,1,147,1,51,0,147,0,243,0,83,1,179,1,83,0,179,0,19,1,115,1,211,1,27,0,123,0,219,0,59,1,155,1,59,0,155,0,251,0,91,1,187,1,91,0,187,0,27,1,123,1,219,1,7,0,103,0,199,0,39,1,135,1,39,0,135,0,231,0,71,1,167,1,71,0,167,0,7,1,103,1,199,1,15,0,111,0,207,0,47,1,143,1,47,0,143,0,239,0,79,1,175,1,79,0,175,0,15,1,111,1,207,1,23,0,119,0,215,0,55,1,151,1,55,0,151,0,247,0,87,1,183,1,87,0,183,0,23,1,119,1,215,1,31,0,127,0,223,0,63,1,159,1,63,0,159,0,255,0,95,1,191,1,95,0,191,0,31,1,127,1,223,1,81,11,10,9,10,9,10,9,239,8,239,8,10,9,252,8,23,9,239,8,72,11,20,10,90,9,63,9,10,9,226,8,226,8,226,8,226,8,146,8,183,9,36,9,36,9,10,9,10,9,10,9,36,9,36,9,63,9,50,9,144,12,206,10,36,9,36,9,10,9,226,8,173,8,159,8,213,8,146,8,156,9,170,9,63,9,90,9,90,9,90,9,90,9,63,9,103,9,10,9,151,13,240,11,79,8,159,8,226,8,226,8,226,8,239,8,10,9,213,8,210,12,69,12,20,10,90,9,199,8,173,8,159,8,146,8,146,8,66,8,0,16,5,15,173,8,60,10,60,10,103,9,10,9,90,9,63,9,26,8,106,12,172,12,63,9,173,8,249,9,130,9,36,9,10,9,119,8,173,8,10,13,160,13,166,10,146,8,213,8,156,9,50,9,63,9,159,8,53,8,50,9,116,9,23,9,63,9,90,9,116,9,116,9,116,9,156,9,63,9,195,14,45,14,130,9,223,9,63,9,226,8,226,8,252,8,159,8,0,8,182,12,153,12,153,10,30,11,143,9,23,9,252,8,252,8,226,8,79,8,191,12,228,12,193,10,246,10,143,9,213,8,213,8,199,8,79,8,53,8,57,11,165,11,73,10,63,9,103,9,50,9,146,8,199,8,199,8,66,8,153,12,125,12,73,10,20,10,226,8,133,8,199,8,173,8,173,8,93,8,106,12,238,12,180,10,103,9,226,8,226,8,226,8,239,8,146,8,66,8,69,12,200,12,156,9,13,8,239,8,196,9,63,9,183,9,130,9,133,8,179,13,210,12,10,9,140,10,87,10,170,9,63,9,90,9,36,9,79,8,95,13,207,13,222,11,240,11,252,8,158,7,173,8,226,8,226,8,226,8,76,13,38,13,39,8,127,10,57,11,50,9,116,9,226,8,170,9,236,9,176,14,160,13,158,7,100,10,81,11,223,9,90,9,63,9,156,9,213,8,212,11,200,12,180,10,72,11,180,10,106,8,79,8,239,8,186,8,199,8,111,14,73,14,233,7,177,7,100,10,140,10,20,10,196,9,23,9,63,9,135,12,85,13,50,9,26,8,72,11,72,11,36,9,183,9,199,8,119,8,10,13,38,13,30,11,220,10,23,9,106,8,226,8,239,8,66,8,13,8,23,9,252,8,133,8,119,8,133,8,63,9,73,10,140,10,140,10,249,9,103,9,130,9,173,8,213,8,173,8,173,8,36,9,116,9,47,10,140,10,222,11,172,12,246,10,72,11,170,9,26,8,252,8,10,9,50,9,76,9,173,8,106,8,79,8,239,8,196,9,233,10,233,10,60,10,20,10,63,9,92,14,129,14,186,8,46,7,133,8,193,10,166,10,113,10,209,9,159,8,233,10,88,12,166,10,249,9,30,11,209,9,133,8,90,9,173,8,133,8,250,0,3,0,6,0,3,0,3,0,3,0,4,0,3,0,3,0,3,0,205,1,73,14,109,11,109,11,109,11,109,11,109,11,109,11,109,11,109,11,109,11,109,11,109,11,147,11,147,11,109,11,30,11,144,12,13,12,156,11,240,11,240,11,194,11,194,11,194,11,147,11,147,11,194,11,156,11,72,11,30,11,30,11,166,10,80,15,174,15,165,11,135,12,135,12,118,11,240,11,30,11,50,12,172,12,109,11,30,11,60,10,249,9,220,10,109,11,188,13,125,12,194,11,31,12,203,11,72,11,109,11,109,11,109,11,109,11,72,11,72,11,72,11,72,11,72,11,193,10,190,19,190,19,118,11,245,13,57,13,240,11,13,12,233,10,88,12,88,12,156,11,30,11,209,9,236,9,193,10,72,11,76,17,53,16,140,10,193,10,156,11,194,11,109,11,30,11,165,11,203,11,109,11,109,11,109,11,109,11,72,11,166,10,36,14,203,11,156,11,240,11,240,11,57,11,246,10,240,11,144,12,231,11,165,11,219,12,219,12,165,11,238,12,175,11,107,20,150,19,236,9,10,13,198,13,57,13,125,12,22,12,48,13,165,11,140,10,87,10,127,10,233,10,30,11,113,10,217,19,54,20,7,18,76,17,156,9,81,11,231,11,135,12,97,12,127,10,180,10,72,11,30,11,233,10,30,11,140,10,50,12,72,11,147,11,109,11,109,11,109,11,109,11,147,11,147,11,147,11,147,11,109,11,109,11,147,11,147,11,147,11,106,16,135,12,165,11,31,12,194,11,72,11,72,11,109,11,156,11,57,11,100,11,203,11,156,11,194,11,125,12,57,11,176,14,176,14,172,12,31,12,165,11,72,11,109,11,72,11,156,11,118,11,233,10,233,10,30,11,72,11,72,11,100,10,14,15,174,15,135,12,50,12,172,12,118,11,231,11,147,11,147,11,13,12,30,11,233,10,233,10,233,10,233,10,20,10,5,15,240,15,29,13,188,13,22,12,180,10,194,11,118,11,50,12,13,12,30,11,30,11,87,10,87,10,30,11,246,10,27,20,30,19,153,12,5,15,113,13,97,12,81,11,85,13,123,13,140,10,20,10,113,10,180,10,30,11,246,10,193,10,13,16,205,14,219,12,88,12,109,11,72,11,72,11,109,11,233,10,180,10,233,10,180,10,233,10,30,11,72,11,246,10,217,19,190,19,231,11,217,13,172,12,240,11,13,12,128,11,31,12,81,11,180,10,180,10,180,10,30,11,233,10,60,10,213,16,213,16,44,11,223,9,135,12,48,13,48,13,3,12,3,12,48,13,240,11,30,11,87,10,20,10,166,10,193,10,240,11,100,11,246,10,72,11,180,10,127,10,81,11,31,12,78,12,78,12,144,12,97,12,240,11,194,11,147,11,30,11,23,17,42,15,109,11,72,11,30,11,72,11,30,11,30,11,72,11,72,11,72,11,30,11,72,11,109,11,72,11,30,11,165,11,100,11,100,11,165,11,165,11,240,11,50,12,144,12,78,12,240,11,194,11,156,11,156,11,156,11,109,11,180,10,133,16,53,16,238,12,19,13,109,11,147,11,72,11,165,11,165,11,30,11,233,10,180,10,30,11,30,11,30,11,233,10,240,15,174,15,31,12,194,11,109,11,109,11,109,11,72,11,109,11,109,11,30,11,30,11,30,11,233,10,72,11,220,10,7,18,223,17,97,12,113,13,135,12,165,11,81,11,222,11,50,12,180,10,127,10,127,10,127,10,180,10,233,10,140,10,53,16,173,16,205,14,73,14,166,10,220,10,72,11,72,11,194,11,156,11,109,11,30,11,127,10,127,10,233,10,72,11,119,16,226,13,193,10,30,11,30,11,72,11,72,11,72,11,109,11,109,11,72,11,109,11,109,11,109,11,147,11,72,11,54,20,57,19,213,8,104,13,205,14,151,13,19,13,30,11,238,12,151,13,78,12,81,11,156,9,183,9,193,10,109,11,123,13,101,14,50,12,125,12,29,13,231,11,135,12,135,12,165,11,144,12,13,12,109,11,109,11,127,10,236,9,130,9,165,11,194,11,233,10,233,10,180,10,233,10,30,11,156,11,240,11,31,12,78,12,78,12,78,12,31,12,194,11,194,11,128,11,57,11,127,10,166,10,220,10,194,11,104,13,217,13,29,13,172,12,240,11,194,11,147,11,109,11,72,11,30,11,203,11,128,11,81,11,194,11,194,11,156,11,203,11,31,12,240,11,240,11,194,11,72,11,30,11,109,11,109,11,72,11,80,15,127,15,194,11,125,12,29,13,144,12,219,12,219,12,151,13,120,14,113,13,166,10,133,8,156,9,20,10,47,10,100,0,3,0,40,0,3,0,3,0,3,0,5,0,14,0,14,0,10,0,11,0,3,0,8,0,9,0,7,0,3,0,91,1,18,0,29,0,38,0,40,0,46,0,52,0,62,0,84,0,92,202,190,216,182,223,154,226,156,230,120,236,122,244,204,252,52,3,134,11,136,19,100,25,102,29,74,32,66,39,164,53,100,0,240,0,32,0,100,0,205,60,0,48,0,32,0,32,254,31,246,31,234,31,216,31,194,31,168,31,136,31,98,31,58,31,10,31,216,30,160,30,98,30,34,30,220,29,144,29,66,29,238,28,150,28,58,28,216,27,114,27,10,27,156,26,42,26,180,25,58,25,188,24,60,24,182,23,46,23,160,22,16,22,126,21,232,20,78,20,176,19,16,19,110,18,200,17,30,17,116,16,198,15,22,15,100,14,174,13,248,12,64,12,132,11,200,10,10,10,74,9,138,8,198,7,2,7,62,6,120,5,178,4,234,3,34,3,90,2,146,1,202,0,0,0,54,255,110,254,166,253,222,252,22,252,78,251,136,250,194,249,254,248,58,248,118,247,182,246,246,245,56,245,124,244,192,243,8,243,82,242,156,241,234,240,58,240,140,239,226,238,56,238,146,237,240,236,80,236,178,235,24,235,130,234,240,233,96,233,210,232,74,232,196,231,68,231,198,230,76,230,214,229,100,229,246,228,142,228,40,228,198,227,106,227,18,227,190,226,112,226,36,226,222,225,158,225,96,225,40,225,246,224,198,224,158,224,120,224,88,224,62,224,40,224,22,224,10,224,2,224,0,224,42,175,213,201,207,255,64,0,17,0,99,255,97,1,16,254,163,0,39,43,189,86,217,255,6,0,91,0,86,255,186,0,23,0,128,252,192,24,216,77,237,255,220,255,102,0,167,255,232,255,72,1,73,252,8,10,37,62,135,199,61,201,64,0,128,0,134,255,36,0,54,1,0,253,72,2,51,36,69,69,12,0,128,0,18,0,114,255,32,1,139,255,159,252,27,16,123,56,104,2,13,200,246,255,39,0,58,0,210,255,172,255,120,0,184,0,197,254,227,253,4,5,4,21,64,35,230,62,198,196,243,255,0,0,20,0,26,0,5,0,225,255,213,255,252,255,65,0,90,0,7,0,99,255,8,255,212,255,81,2,47,6,52,10,199,12,228,87,5,197,3,0,242,255,236,255,241,255,2,0,25,0,37,0,25,0,240,255,185,255,149,255,177,255,50,0,36,1,111,2,214,3,8,5,184,5,148,107,103,196,17,0,12,0,8,0,1,0,246,255,234,255,226,255,224,255,234,255,3,0,44,0,100,0,168,0,243,0,61,1,125,1,173,1,199,1,19,245,149,230,89,18,243,41,31,6,84,32,189,0,168,253,105,2,103,119,117,0,97,255,210,251,8,116,52,0,221,0,168,246,116,110,252,255,17,2,234,242,229,102,208,255,246,2,140,240,165,93,176,255,137,3,117,239,6,83,157,255,204,3,130,239,102,71,149,255,199,3,139,240,39,59,153,255,128,3,97,242,174,46,165,255,5,3,207,244,94,34,185,255,99,2,161,247,152,22,210,255,169,1,161,250,180,11,0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3,0,3,12,15,48,51,60,63,192,195,204,207,240,243,252,255,0,255,0,255,0,255,0,255,0,255,0,254,1,0,1,255,0,254,0,253,2,0,1,255,0,254,0,253,3,0,1,255,2,1,0,25,23,2,0,126,124,119,109,87,41,19,9,4,2,0,255,255,156,110,86,70,59,51,45,40,37,33,31,28,26,25,23,22,21,20,19,18,17,16,16,15,15,14,13,13,12,12,12,12,11,11,11,10,10,10,9,9,9,9,9,9,8,8,8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,80,75,69,63,56,49,40,34,29,20,18,10,0,0,0,0,0,0,0,0,110,100,90,84,78,71,65,58,51,45,39,32,26,20,12,0,0,0,0,0,0,118,110,103,93,86,80,75,70,65,59,53,47,40,31,23,15,4,0,0,0,0,126,119,112,104,95,89,83,78,72,66,60,54,47,39,32,25,17,12,1,0,0,134,127,120,114,103,97,91,85,78,72,66,60,54,47,41,35,29,23,16,10,1,144,137,130,124,113,107,101,95,88,82,76,70,64,57,51,45,39,33,26,15,1,152,145,138,132,123,117,111,105,98,92,86,80,74,67,61,55,49,43,36,20,1,162,155,148,142,133,127,121,115,108,102,96,90,84,77,71,65,59,53,46,30,1,172,165,158,152,143,137,131,125,118,112,106,100,94,87,81,75,69,63,56,45,20,200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104,40,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,40,15,23,28,31,34,36,38,39,41,42,43,44,45,46,47,47,49,50,51,52,53,54,55,55,57,58,59,60,61,62,63,63,65,66,67,68,69,70,71,71,40,20,33,41,48,53,57,61,64,66,69,71,73,75,76,78,80,82,85,87,89,91,92,94,96,98,101,103,105,107,108,110,112,114,117,119,121,123,124,126,128,40,23,39,51,60,67,73,79,83,87,91,94,97,100,102,105,107,111,115,118,121,124,126,129,131,135,139,142,145,148,150,153,155,159,163,166,169,172,174,177,179,35,28,49,65,78,89,99,107,114,120,126,132,136,141,145,149,153,159,165,171,176,180,185,189,192,199,205,211,216,220,225,229,232,239,245,251,21,33,58,79,97,112,125,137,148,157,166,174,182,189,195,201,207,217,227,235,243,251,17,35,63,86,106,123,139,152,165,177,187,197,206,214,222,230,237,250,25,31,55,75,91,105,117,128,138,146,154,161,168,174,180,185,190,200,208,215,222,229,235,240,245,255,16,36,65,89,110,128,144,159,173,185,196,207,217,226,234,242,250,11,41,74,103,128,151,172,191,209,225,241,255,9,43,79,110,138,163,186,207,227,246,12,39,71,99,123,144,164,182,198,214,228,241,253,9,44,81,113,142,168,192,214,235,255,7,49,90,127,160,191,220,247,6,51,95,134,170,203,234,7,47,87,123,155,184,212,237,6,52,97,137,174,208,240,5,57,106,151,192,231,5,59,111,158,202,243,5,55,103,147,187,224,5,60,113,161,206,248,4,65,122,175,224,4,67,127,182,234,224,224,224,224,224,224,224,224,160,160,160,160,185,185,185,178,178,168,134,61,37,224,224,224,224,224,224,224,224,240,240,240,240,207,207,207,198,198,183,144,66,40,160,160,160,160,160,160,160,160,185,185,185,185,193,193,193,183,183,172,138,64,38,240,240,240,240,240,240,240,240,207,207,207,207,204,204,204,193,193,180,143,66,40,185,185,185,185,185,185,185,185,193,193,193,193,193,193,193,183,183,172,138,65,39,207,207,207,207,207,207,207,207,204,204,204,204,201,201,201,188,188,176,141,66,40,193,193,193,193,193,193,193,193,193,193,193,193,194,194,194,184,184,173,139,65,39,204,204,204,204,204,204,204,204,201,201,201,201,198,198,198,187,187,175,140,66,40,72,127,65,129,66,128,65,128,64,128,62,128,64,128,64,128,92,78,92,79,92,78,90,79,116,41,115,40,114,40,132,26,132,26,145,17,161,12,176,10,177,11,24,179,48,138,54,135,54,132,53,134,56,133,55,132,55,132,61,114,70,96,74,88,75,88,87,74,89,66,91,67,100,59,108,50,120,40,122,37,97,43,78,50,83,78,84,81,88,75,86,74,87,71,90,73,93,74,93,74,109,40,114,36,117,34,117,34,143,17,145,18,146,19,162,12,165,10,178,7,189,6,190,8,177,9,23,178,54,115,63,102,66,98,69,99,74,89,71,91,73,91,78,89,86,80,92,66,93,64,102,59,103,60,104,60,117,52,123,44,138,35,133,31,97,38,77,45,61,90,93,60,105,42,107,41,110,45,116,38,113,38,112,38,124,26,132,27,136,19,140,20,155,14,159,16,158,18,170,13,177,10,187,8,192,6,175,9,159,10,21,178,59,110,71,86,75,85,84,83,91,66,88,73,87,72,92,75,98,72,105,58,107,54,115,52,114,55,112,56,129,51,132,40,150,33,140,29,98,35,77,42,42,121,96,66,108,43,111,40,117,44,123,32,120,36,119,33,127,33,134,34,139,21,147,23,152,20,158,25,154,26,166,21,173,16,184,13,184,10,150,13,139,15,22,178,63,114,74,82,84,83,92,82,103,62,96,72,96,67,101,73,107,72,113,55,118,52,125,52,118,52,117,55,135,49,137,39,157,32,145,29,97,33,77,40,2,1,0,0,8,13,16,19,21,23,24,26,27,28,29,30,31,32,32,33,34,34,35,36,36,37,37,224,112,44,15,3,2,1,0,254,237,192,132,70,23,4,0,255,252,226,155,61,11,2,0,250,245,234,203,71,50,42,38,35,33,31,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,179,99,0,71,56,43,30,21,12,6,0,199,165,144,124,109,96,84,71,61,51,42,32,23,15,8,0,241,225,211,199,187,175,164,153,142,132,123,114,105,96,88,80,72,64,57,50,44,38,33,29,24,20,16,12,9,5,2,0,15,131,138,138,155,155,173,173,69,93,115,118,131,138,141,138,150,150,155,150,155,160,166,160,131,128,134,141,141,141,145,145,145,150,155,155,155,155,160,160,160,160,166,166,173,173,182,192,182,192,192,192,205,192,205,224,4,6,24,7,5,0,0,2,0,0,12,28,41,13,252,247,15,42,25,14,1,254,62,41,247,246,37,65,252,3,250,4,66,7,248,16,14,38,253,33,13,22,39,23,12,255,36,64,27,250,249,10,55,43,17,1,1,8,1,1,6,245,74,53,247,244,55,76,244,8,253,3,93,27,252,26,39,59,3,248,2,0,77,11,9,248,22,44,250,7,40,9,26,3,9,249,20,101,249,4,3,248,42,26,0,241,33,68,2,23,254,55,46,254,15,3,255,21,16,41,250,27,61,39,5,245,42,88,4,1,254,60,65,6,252,255,251,73,56,1,247,19,94,29,247,0,12,99,6,4,8,237,102,46,243,3,2,13,3,2,9,235,84,72,238,245,46,104,234,8,18,38,48,23,0,240,70,83,235,11,5,245,117,22,248,250,23,117,244,3,3,248,95,28,4,246,15,77,60,241,255,4,124,2,252,3,38,84,24,231,2,13,42,13,31,21,252,56,46,255,255,35,79,243,19,249,65,88,247,242,20,4,81,49,227,20,0,75,3,239,5,247,44,92,248,1,253,22,69,31,250,95,41,244,5,39,67,16,252,1,0,250,120,55,220,243,44,122,4,232,81,5,11,3,7,2,0,9,10,88,46,2,90,87,93,91,82,98,109,120,118,12,113,115,117,119,99,59,87,111,63,111,112,80,126,124,125,124,129,121,126,23,132,127,127,127,126,127,122,133,130,134,101,118,119,145,126,86,124,120,123,119,170,173,107,109,8,16,32,12,35,60,83,108,132,157,180,206,228,15,32,55,77,101,125,151,175,201,225,19,42,66,89,114,137,162,184,209,230,12,25,50,72,97,120,147,172,200,223,26,44,69],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);allocate([90,114,135,159,180,205,225,13,22,53,80,106,130,156,180,205,228,15,25,44,64,90,115,142,168,196,222,19,24,62,82,100,120,145,168,190,214,22,31,50,79,103,120,151,170,203,227,21,29,45,65,106,124,150,171,196,224,30,49,75,97,121,142,165,186,209,229,19,25,52,70,93,116,143,166,192,219,26,34,62,75,97,118,145,167,194,217,25,33,56,70,91,113,143,165,196,223,21,34,51,72,97,117,145,171,196,222,20,29,50,67,90,117,144,168,197,221,22,31,48,66,95,117,146,168,196,222,24,33,51,77,116,134,158,180,200,224,21,28,70,87,106,124,149,170,194,217,26,33,53,64,83,117,152,173,204,225,27,34,65,95,108,129,155,174,210,225,20,26,72,99,113,131,154,176,200,219,34,43,61,78,93,114,155,177,205,229,23,29,54,97,124,138,163,179,209,229,30,38,56,89,118,129,158,178,200,231,21,29,49,63,85,111,142,163,193,222,27,48,77,103,133,158,179,196,215,232,29,47,74,99,124,151,176,198,220,237,33,42,61,76,93,121,155,174,207,225,29,53,87,112,136,154,170,188,208,227,24,30,52,84,131,150,166,186,203,229,37,48,64,84,104,118,156,177,201,230,212,178,148,129,108,96,85,82,79,77,61,59,57,56,51,49,48,45,42,41,40,38,36,34,31,30,21,12,10,3,1,0,255,245,244,236,233,225,217,203,190,176,175,161,149,136,125,114,102,91,81,71,60,52,43,35,28,20,19,18,12,11,5,0,179,138,140,148,151,149,153,151,163,116,67,82,59,92,72,100,89,92,16,0,0,0,0,99,66,36,36,34,36,34,34,34,34,83,69,36,52,34,116,102,70,68,68,176,102,68,68,34,65,85,68,84,36,116,141,152,139,170,132,187,184,216,137,132,249,168,185,139,104,102,100,68,68,178,218,185,185,170,244,216,187,187,170,244,187,187,219,138,103,155,184,185,137,116,183,155,152,136,132,217,184,184,170,164,217,171,155,139,244,169,184,185,170,164,216,223,218,138,214,143,188,218,168,244,141,136,155,170,168,138,220,219,139,164,219,202,216,137,168,186,246,185,139,116,185,219,185,138,100,100,134,100,102,34,68,68,100,68,168,203,221,218,168,167,154,136,104,70,164,246,171,137,139,137,155,218,219,139,255,254,253,238,14,3,2,1,0,255,254,252,218,35,3,2,1,0,255,254,250,208,59,4,2,1,0,255,254,246,194,71,10,2,1,0,255,252,236,183,82,8,2,1,0,255,252,235,180,90,17,2,1,0,255,248,224,171,97,30,4,1,0,255,254,236,173,95,37,7,1,0,255,255,255,131,6,145,255,255,255,255,255,236,93,15,96,255,255,255,255,255,194,83,25,71,221,255,255,255,255,162,73,34,66,162,255,255,255,210,126,73,43,57,173,255,255,255,201,125,71,48,58,130,255,255,255,166,110,73,57,62,104,210,255,255,251,123,65,55,68,100,171,255,7,23,38,54,69,85,100,116,131,147,162,178,193,208,223,239,13,25,41,55,69,83,98,112,127,142,157,171,187,203,220,236,15,21,34,51,61,78,92,106,126,136,152,167,185,205,225,240,10,21,36,50,63,79,95,110,126,141,157,173,189,205,221,237,17,20,37,51,59,78,89,107,123,134,150,164,184,205,224,240,10,15,32,51,67,81,96,112,129,142,158,173,189,204,220,236,8,21,37,51,65,79,98,113,126,138,155,168,179,192,209,218,12,15,34,55,63,78,87,108,118,131,148,167,185,203,219,236,16,19,32,36,56,79,91,108,118,136,154,171,186,204,220,237,11,28,43,58,74,89,105,120,135,150,165,180,196,211,226,241,6,16,33,46,60,75,92,107,123,137,156,169,185,199,214,225,11,19,30,44,57,74,89,105,121,135,152,169,186,202,218,234,12,19,29,46,57,71,88,100,120,132,148,165,182,199,216,233,17,23,35,46,56,77,92,106,123,134,152,167,185,204,222,237,14,17,45,53,63,75,89,107,115,132,151,171,188,206,221,240,9,16,29,40,56,71,88,103,119,137,154,171,189,205,222,237,16,19,36,48,57,76,87,105,118,132,150,167,185,202,218,236,12,17,29,54,71,81,94,104,126,136,149,164,182,201,221,237,15,28,47,62,79,97,115,129,142,155,168,180,194,208,223,238,8,14,30,45,62,78,94,111,127,143,159,175,192,207,223,239,17,30,49,62,79,92,107,119,132,145,160,174,190,204,220,235,14,19,36,45,61,76,91,108,121,138,154,172,189,205,222,238,12,18,31,45,60,76,91,107,123,138,154,171,187,204,221,236,13,17,31,43,53,70,83,103,114,131,149,167,185,203,220,237,17,22,35,42,58,78,93,110,125,139,155,170,188,206,224,240,8,15,34,50,67,83,99,115,131,146,162,178,193,209,224,239,13,16,41,66,73,86,95,111,128,137,150,163,183,206,225,241,17,25,37,52,63,75,92,102,119,132,144,160,175,191,212,231,19,31,49,65,83,100,117,133,147,161,174,187,200,213,227,242,18,31,52,68,88,103,117,126,138,149,163,177,192,207,223,239,16,29,47,61,76,90,106,119,133,147,161,176,193,209,224,240,15,21,35,50,61,73,86,97,110,119,129,141,175,198,218,237,225,204,201,184,183,175,158,154,153,135,119,115,113,110,109,99,98,95,79,68,52,50,48,45,43,32,31,27,18,10,3,0,255,251,235,230,212,201,196,182,167,166,163,151,138,124,110,104,90,78,76,70,69,57,45,34,24,21,11,6,5,4,3,0,175,148,160,176,178,173,174,164,177,174,196,182,198,192,182,68,62,66,60,72,117,85,90,118,136,151,142,160,142,155,0,0,0,0,0,0,0,1,100,102,102,68,68,36,34,96,164,107,158,185,180,185,139,102,64,66,36,34,34,0,1,32,208,139,141,191,152,185,155,104,96,171,104,166,102,102,102,132,1,0,0,0,0,16,16,0,80,109,78,107,185,139,103,101,208,212,141,139,173,153,123,103,36,0,0,0,0,0,0,1,48,0,0,0,0,0,0,32,68,135,123,119,119,103,69,98,68,103,120,118,118,102,71,98,134,136,157,184,182,153,139,134,208,168,248,75,189,143,121,107,32,49,34,34,34,0,17,2,210,235,139,123,185,137,105,134,98,135,104,182,100,183,171,134,100,70,68,70,66,66,34,131,64,166,102,68,36,2,1,0,134,166,102,68,34,34,66,132,212,246,158,139,107,107,87,102,100,219,125,122,137,118,103,132,114,135,137,105,171,106,50,34,164,214,141,143,185,151,121,103,192,34,0,0,0,0,0,1,208,109,74,187,134,249,159,137,102,110,154,118,87,101,119,101,0,2,0,36,36,66,68,35,96,164,102,100,36,0,2,33,167,138,174,102,100,84,2,2,100,107,120,119,36,197,24,0,255,254,253,244,12,3,2,1,0,255,254,252,224,38,3,2,1,0,255,254,251,209,57,4,2,1,0,255,254,244,195,69,4,2,1,0,255,251,232,184,84,7,2,1,0,255,254,240,186,86,14,2,1,0,255,254,239,178,91,30,5,1,0,255,248,227,177,100,19,2,1,0,255,255,255,156,4,154,255,255,255,255,255,227,102,15,92,255,255,255,255,255,213,83,24,72,236,255,255,255,255,150,76,33,63,214,255,255,255,190,121,77,43,55,185,255,255,255,245,137,71,43,59,139,255,255,255,255,131,66,50,66,107,194,255,255,166,116,76,55,53,125,255,255,249,247,246,245,244,234,210,202,201,200,197,174,82,59,56,55,54,46,22,12,11,10,9,7,0,64,0,203,150,0,215,195,166,125,110,82,0,120,0,128,64,0,232,158,10,0,230,0,243,221,192,181,0,171,85,0,192,128,64,0,205,154,102,51,0,213,171,128,85,43,0,224,192,160,128,96,64,32,0,100,40,16,7,3,1,0,253,250,244,233,212,182,150,131,120,110,98,85,72,60,49,40,32,25,19,15,13,11,9,8,7,6,5,4,3,2,1,0,210,208,206,203,199,193,183,168,142,104,74,52,37,27,20,14,10,6,4,2,0,223,201,183,167,152,138,124,111,98,88,79,70,62,56,50,44,39,35,31,27,24,21,18,16,14,12,10,8,6,4,3,2,1,0,188,176,155,138,119,97,67,43,26,10,0,165,119,80,61,47,35,27,20,14,9,4,0,113,63,0,125,51,26,18,15,12,11,10,9,8,7,6,5,4,3,2,1,0,198,105,45,22,15,12,11,10,9,8,7,6,5,4,3,2,1,0,213,162,116,83,59,43,32,24,18,15,12,9,7,6,5,3,2,0,239,187,116,59,28,16,11,10,9,8,7,6,5,4,3,2,1,0,250,229,188,135,86,51,30,19,13,10,8,6,5,4,3,2,1,0,249,235,213,185,156,128,103,83,66,53,42,33,26,21,17,13,10,0,254,249,235,206,164,118,77,46,27,16,10,7,5,4,3,2,1,0,255,253,249,239,220,191,156,119,85,57,37,23,15,10,6,4,2,0,255,253,251,246,237,223,203,179,152,124,98,75,55,40,29,21,15,0,255,254,253,247,220,162,106,67,42,28,18,12,9,6,4,3,2,0,31,57,107,160,205,205,255,255,255,255,255,255,255,255,255,255,255,255,69,47,67,111,166,205,255,255,255,255,255,255,255,255,255,255,255,255,82,74,79,95,109,128,145,160,173,205,205,205,224,255,255,224,255,224,125,74,59,69,97,141,182,255,255,255,255,255,255,255,255,255,255,255,173,115,85,73,76,92,115,145,173,205,224,224,255,255,255,255,255,255,166,134,113,102,101,102,107,118,125,138,145,155,166,182,192,192,205,150,224,182,134,101,83,79,85,97,120,145,173,205,224,255,255,255,255,255,255,224,192,150,120,101,92,89,93,102,118,134,160,182,192,224,224,224,255,224,224,182,155,134,118,109,104,102,106,111,118,131,145,160,173,131,241,190,178,132,87,74,41,14,0,223,193,157,140,106,57,39,18,0,131,74,141,79,80,138,95,104,134,95,99,91,125,93,76,123,115,123,128,0,214,42,0,235,128,21,0,244,184,72,11,0,248,214,128,42,7,0,248,225,170,80,25,5,0,251,236,198,126,54,18,3,0,250,238,211,159,82,35,15,5,0,250,231,203,168,128,88,53,25,6,0,252,238,216,185,148,108,71,40,18,4,0,253,243,225,199,166,128,90,57,31,13,3,0,254,246,233,212,183,147,109,73,44,23,10,2,0,255,250,240,223,198,166,128,90,58,33,16,6,1,0,255,251,244,231,210,181,146,110,75,46,25,12,5,1,0,255,253,248,238,221,196,164,128,92,60,35,18,8,3,1,0,255,253,249,242,229,208,180,146,110,76,48,27,14,7,3,1,0,129,0,207,50,0,236,129,20,0,245,185,72,10,0,249,213,129,42,6,0,250,226,169,87,27,4,0,251,233,194,130,62,20,4,0,250,236,207,160,99,47,17,3,0,255,240,217,182,131,81,41,11,1,0,255,254,233,201,159,107,61,20,2,1,0,255,249,233,206,170,128,86,50,23,7,1,0,255,250,238,217,186,148,108,70,39,18,6,1,0,255,252,243,226,200,166,128,90,56,30,13,4,1,0,255,252,245,231,209,180,146,110,76,47,25,11,4,1,0,255,253,248,237,219,194,163,128,93,62,37,19,8,3,1,0,255,254,250,241,226,205,177,145,111,79,51,30,15,6,2,1,0,129,0,203,54,0,234,129,23,0,245,184,73,10,0,250,215,129,41,5,0,252,232,173,86,24,3,0,253,240,200,129,56,15,2,0,253,244,217,164,94,38,10,1,0,253,245,226,189,132,71,27,7,1,0,253,246,231,203,159,105,56,23,6,1,0,255,248,235,213,179,133,85,47,19,5,1,0,255,254,243,221,194,159,117,70,37,12,2,1,0,255,254,248,234,208,171,128,85,48,22,8,2,1,0,255,254,250,240,220,189,149,107,67,36,16,6,2,1,0,255,254,251,243,227,201,166,128,90,55,29,13,5,2,1,0,255,254,252,246,234,213,183,147,109,73,43,22,10,4,2,1,0,130,0,200,58,0,231,130,26,0,244,184,76,12,0,249,214,130,43,6,0,252,232,173,87,24,3,0,253,241,203,131,56,14,2,0,254,246,221,167,94,35,8,1,0,254,249,232,193,130,65,23,5,1,0,255,251,239,211,162,99,45,15,4,1,0,255,251,243,223,186,131,74,33,11,3,1,0,255,252,245,230,202,158,105,57,24,8,2,1,0,255,253,247,235,214,179,132,84,44,19,7,2,1,0,255,254,250,240,223,196,159,112,69,36,15,6,2,1,0,255,254,253,245,231,209,176,136,93,55,27,11,3,2,1,0,255,254,253,252,239,221,194,158,117,76,42,18,4,3,2,1,0,0,0,2,5,9,14,20,27,35,44,54,65,77,90,104,119,135,254,49,67,77,82,93,99,198,11,18,24,31,36,45,255,46,66,78,87,94,104,208,14,21,32,42,51,66,255,94,104,109,112,115,118,248,53,69,80,88,95,102,0,15,8,7,4,11,12,3,2,13,10,5,6,9,14,1,0,9,6,3,4,5,8,1,2,7,0,1,0,0,0,1,0,0,1,255,1,255,2,254,2,254,3,253,0,1,0,1,255,2,255,2,254,3,254,3,253,7,254,7,0,2,255,255,255,0,0,1,1,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,255,2,1,0,1,1,0,0,255,255,0,0,1,255,0,1,255,0,255,1,254,2,254,254,2,253,2,3,253,252,3,252,4,4,251,5,250,251,6,249,6,5,8,247,0,0,1,0,0,0,0,0,0,0,255,1,0,0,1,255,0,1,255,255,1,255,2,1,255,2,254,254,2,254,2,2,3,253,0,1,0,0,0,0,0,0,1,0,1,0,0,1,255,1,0,0,2,1,255,2,255,255,2,255,2,2,255,3,254,254,254,3,0,1,0,0,1,0,1,255,2,255,2,255,2,3,254,3,254,254,4,4,253,5,253,252,6,252,6,5,251,8,250,251,249,9,251,8,255,6,255,6,252,10,250,10,254,6,255,6,251,10,247,12,253,7,254,7,249,13,16,24,34,6,0,3,0,7,3,0,1,10,0,2,6,18,10,12,4,0,2,0,0,0,9,4,7,4,0,3,12,7,7],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE+30720);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module[\"_bitshift64Ashr\"]=_bitshift64Ashr;Module[\"_i64Add\"]=_i64Add;function _llvm_exp2_f32(x){return Math.pow(2,x)}function _llvm_exp2_f64(){return _llvm_exp2_f32.apply(null,arguments)}Module[\"_memset\"]=_memset;Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;function _abort(){Module[\"abort\"]()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var _llvm_pow_f64=Math_pow;Module[\"___muldsi3\"]=___muldsi3;Module[\"___muldi3\"]=___muldi3;function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLVM_SAVEDSTACKS[p];self.LLVM_SAVEDSTACKS.splice(p,1);Runtime.stackRestore(ret)}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}Module[\"_sbrk\"]=_sbrk;function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDSTACKS){self.LLVM_SAVEDSTACKS=[]}self.LLVM_SAVEDSTACKS.push(Runtime.stackSave());return self.LLVM_SAVEDSTACKS.length-1}Module[\"_memmove\"]=_memmove;DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module[\"dynCall_iiiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){try{Module[\"dynCall_viiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_iiiiiii\":invoke_iiiiiii,\"invoke_viiiiiii\":invoke_viiiiiii,\"_llvm_exp2_f64\":_llvm_exp2_f64,\"_llvm_pow_f64\":_llvm_pow_f64,\"_llvm_exp2_f32\":_llvm_exp2_f32,\"_abort\":_abort,\"___setErrNo\":___setErrNo,\"_llvm_stacksave\":_llvm_stacksave,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_llvm_stackrestore\":_llvm_stackrestore,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX};// EMSCRIPTEN_START_ASM\nvar asm=(function(global,env,buffer) {\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;var C=0;var D=global.Math.floor;var E=global.Math.abs;var F=global.Math.sqrt;var G=global.Math.pow;var H=global.Math.cos;var I=global.Math.sin;var J=global.Math.tan;var K=global.Math.acos;var L=global.Math.asin;var M=global.Math.atan;var N=global.Math.atan2;var O=global.Math.exp;var P=global.Math.log;var Q=global.Math.ceil;var R=global.Math.imul;var S=global.Math.min;var T=global.Math.max;var U=global.Math.clz32;var V=env.abort;var W=env.assert;var X=env.enlargeMemory;var Y=env.getTotalMemory;var Z=env.abortOnCannotGrowMemory;var _=env.invoke_iiiiiii;var $=env.invoke_viiiiiii;var aa=env._llvm_exp2_f64;var ba=env._llvm_pow_f64;var ca=env._llvm_exp2_f32;var da=env._abort;var ea=env.___setErrNo;var fa=env._llvm_stacksave;var ga=env._emscripten_memcpy_big;var ha=env._llvm_stackrestore;var ia=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction la(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function ma(){return l|0}function na(a){a=a|0;l=a}function oa(a,b){a=a|0;b=b|0;l=a;m=b}function pa(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function qa(a){a=a|0;C=a}function ra(){return C|0}function sa(a,b){a=+a;b=b|0;var c=0,d=0;c=0;while(1){if((c|0)>=21)break;if(+g[1572+(c<<2)>>2]>a)break;c=c+1|0}if((c|0)>(b|0)?+g[1572+(b<<2)>>2]+ +g[1656+(b<<2)>>2]>a:0)return b|0;if((c|0)>=(b|0)){b=c;return b|0}d=b+-1|0;if(!(+g[1572+(d<<2)>>2]-+g[1656+(d<<2)>>2]<a)){d=c;return d|0}d=b;return d|0}function ta(a){a=a|0;return (R(a,1664525)|0)+1013904223|0}function ua(a){a=a|0;var b=0;b=a<<16>>16;b=((R(b,b)|0)+4096|0)>>>13;a=b<<16>>16;return 32767-b+(((R(a,(((R(a,(((R(a,-626)|0)+16384|0)>>>15<<16)+542441472>>16)|0)+16384|0)>>>15<<16)+-501415936>>16)|0)+16384|0)>>>15)+1&65535|0}function va(a,b){a=a|0;b=b|0;var c=0,d=0;c=32-(U(b|0)|0)|0;d=32-(U(a|0)|0)|0;a=a<<15-d<<16>>16;b=b<<15-c<<16>>16;return (d-c<<11)+((R(a,(((R(a,-2597)|0)+16384|0)>>>15<<16)+519831552>>16)|0)+16384>>15)-((R(b,(((R(b,-2597)|0)+16384|0)>>>15<<16)+519831552>>16)|0)+16384>>15)|0}function wa(a,d,e,f,h,i){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0;n=c[a+32>>2]|0;m=c[a+44>>2]<<i;k=a+8|0;a=0;do{l=R(a,m)|0;j=0;while(1){if((j|0)>=(f|0))break;q=b[n+(j<<1)>>1]|0;r=d+(l+(q<<i)<<2)|0;o=j+1|0;p=+F(+(+xa(r,r,(b[n+(o<<1)>>1]|0)-q<<i)+1.0000000272452012e-27));g[e+(j+(R(a,c[k>>2]|0)|0)<<2)>>2]=p;j=o}a=a+1|0}while((a|0)<(h|0));return}function xa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;d=d+ +g[a+(e<<2)>>2]*+g[b+(e<<2)>>2];e=e+1|0}return +d}function ya(a,d,e,f,h,i,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0;r=c[a+32>>2]|0;q=R(c[a+44>>2]|0,j)|0;n=a+8|0;m=0;while(1){o=R(m,q)|0;a=0;a:while(1){if((a|0)>=(h|0))break;p=1.0/(+g[f+(a+(R(m,c[n>>2]|0)|0)<<2)>>2]+1.0000000272452012e-27);k=R(b[r+(a<<1)>>1]|0,j)|0;a=a+1|0;l=R(b[r+(a<<1)>>1]|0,j)|0;while(1){if((k|0)>=(l|0))continue a;s=k+o|0;g[e+(s<<2)>>2]=+g[d+(s<<2)>>2]*p;k=k+1|0}}m=m+1|0;if((m|0)>=(i|0))break}return}function za(a,b){a=a|0;b=b|0;return (a>>>0)/(b>>>0)|0|0}function Aa(a,d,e,f,h,i,j,k,l,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0;A=c[a+32>>2]|0;B=R(c[a+44>>2]|0,m)|0;if((R((b[A+(k<<1)>>1]|0)-(b[A+(k+-1<<1)>>1]|0)|0,m)|0)<9){i=0;return i|0}y=a+8|0;w=0;n=0;o=0;a=0;while(1){z=R(w,B)|0;x=0;C=a;while(1){if((x|0)>=(k|0))break;v=b[A+(x<<1)>>1]|0;p=d+((R(v,m)|0)<<2)+(z<<2)|0;u=x+1|0;v=R((b[A+(u<<1)>>1]|0)-v|0,m)|0;if((v|0)<9){x=u;continue}q=+(v|0);a=0;r=0;s=0;t=0;while(1){if((a|0)==(v|0))break;D=+g[p+(a<<2)>>2];D=D*D*q;a=a+1|0;r=r+(D<.25&1)|0;s=s+(D<.0625&1)|0;t=t+(D<.015625&1)|0}if((x|0)>((c[y>>2]|0)+-4|0))n=n+(za(s+r<<5,v)|0)|0;x=u;C=C+(((t<<1|0)>=(v|0)&1)+((s<<1|0)>=(v|0)&1)+((r<<1|0)>=(v|0)&1)<<8)|0;o=o+1|0}w=w+1|0;if((w|0)>=(l|0))break;else a=C}if(j|0){if(!n)a=0;else a=za(n,R(4-(c[y>>2]|0)+k|0,l)|0)|0;a=(c[h>>2]|0)+a>>1;c[h>>2]=a;switch(c[i>>2]|0){case 2:{a=a+4|0;break}case 0:{a=a+-4|0;break}default:{}}c[i>>2]=(a|0)>22?2:(a|0)>18&1}a=za(C,o)|0;a=a+(c[e>>2]|0)>>1;c[e>>2]=a;a=(a*3|0)+(3-f<<7|64)+2>>2;if((a|0)<80){i=3;return i|0}if((a|0)<256){i=2;return i|0}else return (a|0)<384|0;return 0}function Ba(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,i=0.0,j=0.0,k=0;e=b>>1;f=c<<1;d=0;while(1){if((d|0)<(c|0))b=0;else break;while(1){if((b|0)>=(e|0))break;k=a+((R(f,b)|0)+d<<2)|0;j=+g[k>>2]*.7071067690849304;h=a+((R(b<<1|1,c)|0)+d<<2)|0;i=+g[h>>2]*.7071067690849304;g[k>>2]=j+i;g[h>>2]=j-i;b=b+1|0}d=d+1|0}return}function Ca(e,f,h,i,j,k,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B){e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;A=A|0;B=B|0;var C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0.0;Ua=l;l=l+1552|0;Ka=Ua+216|0;Ba=Ua+24|0;Ca=Ua;La=Ua+168|0;Ma=Ua+108|0;Na=Ua+48|0;Oa=Ua+276|0;Pa=Ua+40|0;Qa=e+32|0;Ra=c[Qa>>2]|0;Sa=j|0?2:1;Ta=(j|0)==0;za=(q|0)==0&(Ta^1)&(z|0)>7;Aa=1<<w;qa=(o|0)==0?1:Aa;ra=Ra+(f<<1)|0;sa=b[ra>>1]<<w;ta=e+8|0;z=c[ta>>2]|0;o=b[Ra+(z+-1<<1)>>1]|0;C=o<<w;va=(R(Sa,C-sa|0)|0)<<2;ua=l;l=l+((1*va|0)+15&-16)|0;va=0-sa|0;wa=ua+(C<<2)+(va<<2)|0;if(za){z=(b[Ra+(z<<1)>>1]|0)-o<<w;o=l;l=l+((1*(z<<2)|0)+15&-16)|0}else{o=i+(C<<2)|0;z=1}la=l;l=l+((1*(z<<2)|0)+15&-16)|0;ma=l;l=l+((1*(z<<2)|0)+15&-16)|0;na=l;l=l+((1*(z<<2)|0)+15&-16)|0;oa=l;l=l+((1*(z<<2)|0)+15&-16)|0;pa=l;l=l+((1*(z<<2)|0)+15&-16)|0;c[Ka+36>>2]=m;c[Ka+28>>2]=v;c[Ka>>2]=1;c[Ka+16>>2]=r;c[Ka+8>>2]=e;ka=Ka+40|0;c[ka>>2]=c[y>>2];c[Ka+20>>2]=p;c[Ka+44>>2]=A;c[Ka+52>>2]=B;c[Ka+4>>2]=za&1;da=Ka+48|0;c[da>>2]=0;ea=(qa|0)>1;fa=Ka+56|0;c[fa>>2]=ea&1;ga=Ka+12|0;ha=h+-1|0;ba=v+20|0;ca=v+28|0;ia=Ka+32|0;ja=Ka+24|0;Z=e+12|0;_=(1<<qa)+-1|0;W=v+4|0;X=v+8|0;Y=v+24|0;$=Pa+4|0;aa=f+1|0;e=1;B=0;z=u;V=f;while(1){if((V|0)>=(h|0))break;c[ga>>2]=V;N=(V|0)==(ha|0);O=Ra+(V<<1)|0;S=b[O>>1]<<w;C=i+(S<<2)|0;A=Ta?0:j+(S<<2)|0;U=V+1|0;S=(b[Ra+(U<<1)>>1]<<w)-S|0;T=zb(c[ba>>2]|0,c[ca>>2]|0)|0;Q=z-((V|0)==(f|0)?0:T)|0;z=t-T|0;c[ia>>2]=z+-1;if((V|0)<(x|0)?(Ia=x-V|0,Ia=Da(Q,(Ia|0)<3?Ia:3)|0,Ia=(c[n+(V<<2)>>2]|0)+Ia|0,Ja=(z|0)<(Ia|0),!(((Ja?z:Ia)|0)<16384&((Ja?z:Ia)|0)<0)):0)P=((Ja?z:Ia)|0)>16383?16383:Ja?z:Ia;else P=0;if(za?((b[O>>1]<<w)-S|0)>=(b[ra>>1]<<w|0):0)B=(e|0)!=0|(B|0)==0?V:B;K=c[s+(V<<2)>>2]|0;c[ja>>2]=K;M=(V|0)<(c[Z>>2]|0);o=M?o:0;L=M?C:ua;M=M?A:Ta?0:ua;o=N?(za?o:0):o;if((B|0)!=0?(p|0)!=3|ea|(K|0)<0:0){u=(b[Ra+(B<<1)>>1]<<w)-sa|0;u=(u|0)<(S|0)?0:u-S|0;z=u+sa|0;A=B;do A=A+-1|0;while((b[Ra+(A<<1)>>1]<<w|0)>(z|0));z=z+S|0;e=B+-1|0;while(1){C=e+1|0;if((b[Ra+(C<<1)>>1]<<w|0)<(z|0))e=C;else{C=0;z=0;break}}while(1){K=R(A,Sa)|0;z=z|d[k+K>>0];C=C|d[k+(K+Sa+-1)>>0];if((A|0)<(e|0))A=A+1|0;else{D=C;A=z;break}}}else{u=-1;D=_;A=_}a:do if(q)if((V|0)==(r|0)){if(!za){ya=29;break}C=Ra+(r<<1)|0;z=0;while(1){if((z|0)>=((b[C>>1]<<w)-sa|0)){ya=29;break a}ya=ua+(z<<2)|0;g[ya>>2]=(+g[ya>>2]+ +g[wa+(z<<2)>>2])*.5;z=z+1|0}}else{e=(P|0)/2|0;C=(u|0)==-1;z=C?0:ua+(u<<2)|0;if(N){z=Ea(Ka,L,S,e,qa,z,w,0,1.0,o,A)|0;A=C?0:wa+(u<<2)|0;C=0}else{z=Ea(Ka,L,S,e,qa,z,w,ua+(b[O>>1]<<w<<2)+(va<<2)|0,1.0,o,A)|0;A=C?0:wa+(u<<2)|0;C=wa+(b[O>>1]<<w<<2)+(va<<2)|0}C=Ea(Ka,M,S,e,qa,A,w,C,1.0,o,D)|0;break}else ya=29;while(0);do if((ya|0)==29){ya=0;if(!M){if(N)z=0;else z=ua+(b[O>>1]<<w<<2)+(va<<2)|0;z=Ea(Ka,L,S,P,qa,(u|0)==-1?0:ua+(u<<2)|0,w,z,1.0,o,A|D)|0;q=0;C=z;break}if(!(za&(V|0)<(r|0))){c[da>>2]=0;if(N)z=0;else z=ua+(b[O>>1]<<w<<2)+(va<<2)|0;z=Ga(Ka,L,M,S,P,qa,(u|0)==-1?0:ua+(u<<2)|0,w,z,o,A|D)|0;q=0;C=z;break}Fa(+g[m+(V<<2)>>2],+g[m+(V+(c[ta>>2]|0)<<2)>>2],Pa);E=A|D;e=c[v>>2]|0;q=c[W>>2]|0;c[Ba>>2]=c[X>>2];c[Ba+4>>2]=c[X+4>>2];c[Ba+8>>2]=c[X+8>>2];c[Ba+12>>2]=c[X+12>>2];D=c[Y>>2]|0;c[Ca>>2]=c[ca>>2];c[Ca+4>>2]=c[ca+4>>2];c[Ca+8>>2]=c[ca+8>>2];c[Ca+12>>2]=c[ca+12>>2];c[Ca+16>>2]=c[ca+16>>2];z=Ma;C=Ka;A=z+60|0;do{c[z>>2]=c[C>>2];z=z+4|0;C=C+4|0}while((z|0)<(A|0));J=S<<2;Sh(la|0,L|0,J|0)|0;Sh(ma|0,M|0,J|0)|0;c[da>>2]=-1;F=(u|0)==-1;if(N)z=0;else z=ua+(b[O>>1]<<w<<2)+(va<<2)|0;K=Ga(Ka,L,M,S,P,qa,F?0:ua+(u<<2)|0,w,z,o,E)|0;Va=+g[Pa>>2];Va=Va*+xa(la,L,S);G=+g[$>>2];G=Va+G*+xa(ma,M,S);z=La;C=v;A=z+48|0;do{c[z>>2]=c[C>>2];z=z+4|0;C=C+4|0}while((z|0)<(A|0));z=Na;C=Ka;A=z+60|0;do{c[z>>2]=c[C>>2];z=z+4|0;C=C+4|0}while((z|0)<(A|0));Sh(na|0,L|0,J|0)|0;Sh(oa|0,M|0,J|0)|0;if(!N)Sh(pa|0,ua+(b[O>>1]<<w<<2)+(va<<2)|0,J|0)|0;H=e+D|0;I=q-D|0;Sh(Oa|0,H|0,I|0)|0;c[v>>2]=e;c[W>>2]=q;c[X>>2]=c[Ba>>2];c[X+4>>2]=c[Ba+4>>2];c[X+8>>2]=c[Ba+8>>2];c[X+12>>2]=c[Ba+12>>2];c[Y>>2]=D;c[ca>>2]=c[Ca>>2];c[ca+4>>2]=c[Ca+4>>2];c[ca+8>>2]=c[Ca+8>>2];c[ca+12>>2]=c[Ca+12>>2];c[ca+16>>2]=c[Ca+16>>2];z=Ka;C=Ma;A=z+60|0;do{c[z>>2]=c[C>>2];z=z+4|0;C=C+4|0}while((z|0)<(A|0));Sh(L|0,la|0,J|0)|0;Sh(M|0,ma|0,J|0)|0;if((V|0)==(aa|0))Ha(c[Qa>>2]|0,ua,wa,f,Aa,0);c[da>>2]=1;if(N)z=0;else z=ua+(b[O>>1]<<w<<2)+(va<<2)|0;z=Ga(Ka,L,M,S,P,qa,F?0:ua+(u<<2)|0,w,z,o,E)|0;Wa=+g[Pa>>2];Wa=Wa*+xa(la,L,S);Va=+g[$>>2];if(!(G>=Wa+Va*+xa(ma,M,S))){q=0;C=z}else{z=v;C=La;A=z+48|0;do{c[z>>2]=c[C>>2];z=z+4|0;C=C+4|0}while((z|0)<(A|0));z=Ka;C=Na;A=z+60|0;do{c[z>>2]=c[C>>2];z=z+4|0;C=C+4|0}while((z|0)<(A|0));Sh(L|0,na|0,J|0)|0;Sh(M|0,oa|0,J|0)|0;if(!N)Sh(ua+(b[O>>1]<<w<<2)+(va<<2)|0,pa|0,J|0)|0;Sh(H|0,Oa|0,I|0)|0;q=0;C=K;z=K}}while(0);e=R(V,Sa)|0;a[k+e>>0]=z;a[k+(e+Sa+-1)>>0]=C;z=c[n+(V<<2)>>2]|0;c[fa>>2]=0;e=(P|0)>(S<<3|0)&1;z=Q+(z+T)|0;V=U}c[y>>2]=c[ka>>2];l=Ua;return}function Da(a,b){a=a|0;b=b|0;return (a|0)/(b|0)|0|0}function Ea(b,e,f,h,i,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=+m;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;p=c[b>>2]|0;q=c[b+24>>2]|0;v=(i|0)==1&1;r=za(f,i)|0;if((f|0)==1){Ia(b,e,0,h,l);l=1;return l|0}w=(q|0)>0?q:0;do if(n)if(!j)n=0;else{if((q|0)<1?!((r&1|0)==0&(q|0)!=0|(i|0)>1):0){n=j;break}Sh(n|0,j|0,f<<2|0)|0}else n=j;while(0);s=(p|0)==0;t=(n|0)==0;p=o;j=0;while(1){if((j|0)>=(w|0))break;if(!s)Ba(e,f>>j,1<<j);if(!t)Ba(n,f>>j,1<<j);p=d[28802+(p&15)>>0]|0|(d[28802+(p>>4)>>0]|0)<<2;j=j+1|0}u=0;j=r<<w;o=i>>w;while(1){if(!((j&1|0)==0&(q|0)<0))break;if(!s)Ba(e,j,o);if(!t)Ba(n,j,o);i=p|p<<o;u=u+1|0;j=j>>1;q=q+1|0;o=o<<1;p=i}q=(o|0)>1;if(q){if(!s)Ja(e,j>>w,o<<w,v);if(!t)Ja(n,j>>w,o<<w,v)}p=Ka(b,e,f,h,o,n,k,m,p)|0;if(!(c[b+4>>2]|0)){l=p;return l|0}if(q){La(e,j>>w,o<<w,v);n=0}else n=0;while(1){if((n|0)>=(u|0)){j=0;break}v=o>>1;b=j<<1;Ba(e,b,v);p=p|p>>>v;n=n+1|0;j=b;o=v}while(1){if((j|0)>=(w|0))break;v=a[28818+p>>0]|0;Ba(e,f>>j,1<<j);p=v&255;j=j+1|0}n=o<<w;a:do if(l|0){m=+F(+(+(f|0)));j=0;while(1){if((j|0)>=(f|0))break a;g[l+(j<<2)>>2]=m*+g[e+(j<<2)>>2];j=j+1|0}}while(0);l=p&(1<<n)+-1;return l|0}function Fa(a,b,c){a=+a;b=+b;c=c|0;var d=0.0;d=(a<b?a:b)/3.0;g[c>>2]=d+a;g[c+4>>2]=d+b;return}function Ga(a,b,d,e,f,h,i,j,k,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0,C=0.0;B=l;l=l+32|0;o=B+28|0;s=B+24|0;p=B;c[o>>2]=f;c[s>>2]=n;t=c[a>>2]|0;u=c[a+28>>2]|0;if((e|0)==1){Ia(a,b,d,f,k);e=1;l=B;return e|0}Ma(a,p,b,d,e,o,h,h,j,1,s);y=c[p>>2]|0;w=c[p+16>>2]|0;v=c[p+20>>2]|0;z=+(c[p+4>>2]|0)*.000030517578125;x=+(c[p+8>>2]|0)*.000030517578125;A=(e|0)==2;do if(A){f=c[o>>2]|0;if((w|0)<16384)switch(w|0){case 0:{r=0;break}default:q=5}else switch(w|0){case 16384:{r=0;break}default:q=5}if((q|0)==5)r=8;q=f-r|0;p=(w|0)>8192;o=a+32|0;c[o>>2]=(c[o>>2]|0)-(v+r);o=p?d:b;p=p?b:d;do if(r)if(!t){f=Hb(u,1)|0;break}else{f=+g[o>>2]*+g[p+4>>2]-+g[o+4>>2]*+g[p>>2]<0.0&1;Tb(u,f,1);break}else f=0;while(0);w=1-(f<<1)|0;f=Ea(a,o,2,q,h,i,j,k,1.0,m,n)|0;g[p>>2]=+(0-w|0)*+g[o+4>>2];g[p+4>>2]=+(w|0)*+g[o>>2];if(c[a+4>>2]|0){g[b>>2]=z*+g[b>>2];k=b+4|0;g[k>>2]=z*+g[k>>2];C=x*+g[d>>2];g[d>>2]=C;m=d+4|0;g[m>>2]=x*+g[m>>2];x=+g[b>>2];g[b>>2]=x-C;g[d>>2]=x+ +g[d>>2];x=+g[k>>2];g[k>>2]=x-+g[m>>2];g[m>>2]=x+ +g[m>>2]}}else{q=c[o>>2]|0;p=(q-(c[p+12>>2]|0)|0)/2|0;r=(q|0)<(p|0);p=((r?q:p)|0)<0?0:r?q:p;q=q-p|0;r=a+32|0;o=(c[r>>2]|0)-v|0;c[r>>2]=o;f=c[s>>2]|0;if((p|0)<(q|0)){v=Ea(a,d,e,q,h,0,j,0,x,0,f>>h)|0;n=q+((c[r>>2]|0)-o)|0;f=v|(Ea(a,b,e,p+((n|0)<25|(w|0)==16384?0:n+-24|0)|0,h,i,j,k,1.0,m,f)|0);break}else{k=Ea(a,b,e,p,h,i,j,k,1.0,m,f)|0;m=p+((c[r>>2]|0)-o)|0;f=k|(Ea(a,d,e,q+((m|0)<25|(w|0)==0?0:m+-24|0)|0,h,0,j,0,x,0,f>>h)|0);break}}while(0);if(!(c[a+4>>2]|0)){e=f;l=B;return e|0}if(!A)Ta(b,d,z,e);if(!y){e=f;l=B;return e|0}else o=0;while(1){if((o|0)>=(e|0))break;b=d+(o<<2)|0;g[b>>2]=-+g[b>>2];o=o+1|0}l=B;return f|0}function Ha(a,c,d,e,f,g){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=b[a+(e+1<<1)>>1]|0;h=R(i-(b[a+(e<<1)>>1]|0)|0,f)|0;e=R((b[a+(e+2<<1)>>1]|0)-i|0,f)|0;a=(h<<1)-e|0;e=e-h<<2;Sh(c+(h<<2)|0,c+(a<<2)|0,e|0)|0;if(!g)return;Sh(d+(h<<2)|0,d+(a<<2)|0,e|0)|0;return}function Ia(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0;l=c[a+28>>2]|0;m=a+32|0;k=(c[a>>2]|0)==0;i=a+4|0;j=d|0?2:1;a=b;h=0;while(1){if((c[m>>2]|0)>7){if(k)e=Hb(l,1)|0;else{e=+g[a>>2]<0.0&1;Tb(l,e,1)}c[m>>2]=(c[m>>2]|0)+-8}else e=0;if(c[i>>2]|0)g[a>>2]=e|0?-1.0:1.0;h=h+1|0;if((h|0)>=(j|0))break;else a=d}if(!f)return;c[f>>2]=c[b>>2];return}function Ja(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;k=l;i=R(b,d)|0;j=l;l=l+((1*(i<<2)|0)+15&-16)|0;if(!e){f=0;while(1){if((f|0)>=(d|0))break;g=R(f,b)|0;e=0;while(1){if((e|0)>=(b|0))break;c[j+(g+e<<2)>>2]=c[a+((R(e,d)|0)+f<<2)>>2];e=e+1|0}f=f+1|0}i=i<<2;Sh(a|0,j|0,i|0)|0;l=k;return}h=1416+(d<<2)+-8|0;f=0;while(1){if((f|0)>=(d|0))break;g=h+(f<<2)|0;e=0;while(1){if((e|0)>=(b|0))break;m=c[a+((R(e,d)|0)+f<<2)>>2]|0;c[j+((R(c[g>>2]|0,b)|0)+e<<2)>>2]=m;e=e+1|0}f=f+1|0}m=i<<2;Sh(a|0,j|0,m|0)|0;l=k;return}function Ka(a,e,f,h,i,j,k,m,n){a=a|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=+m;n=n|0;var o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;B=l;l=l+32|0;z=B+28|0;A=B+24|0;y=B;c[z>>2]=h;c[A>>2]=n;u=c[a>>2]|0;r=c[a+8>>2]|0;t=c[a+12>>2]|0;w=c[a+20>>2]|0;x=c[a+28>>2]|0;o=c[r+100>>2]|0;p=c[r+96>>2]|0;q=c[r+8>>2]|0;C=o+(b[p+((R(k+1|0,q)|0)+t<<1)>>1]|0)|0;if((k|0)!=-1?((f|0)>2?((d[C+(d[C>>0]|0)>>0]|0)+12|0)<(h|0):0):0){w=f>>1;x=e+(w<<2)|0;f=k+-1|0;if((i|0)==1)c[A>>2]=n&1|n<<1;t=i+1>>1;Ma(a,y,e,x,w,z,t,i,f,0,A);o=c[y+12>>2]|0;u=c[y+16>>2]|0;p=c[y+20>>2]|0;v=+(c[y+4>>2]|0)*.000030517578125;s=+(c[y+8>>2]|0)*.000030517578125;do if(!((i|0)<2|(u&16383|0)==0))if((u|0)>8192){o=o-(o>>5-k)|0;break}else{o=o+(w<<3>>6-k)|0;o=(o|0)<0?o:0;break}while(0);h=c[z>>2]|0;q=(h-o|0)/2|0;r=(h|0)<(q|0);q=((r?h:q)|0)<0?0:r?h:q;h=h-q|0;r=a+32|0;p=(c[r>>2]|0)-p|0;c[r>>2]=p;o=(j|0)==0?0:j+(w<<2)|0;if((q|0)<(h|0)){C=c[A>>2]|0;i=(Ka(a,x,w,h,t,o,f,s*m,C>>t)|0)<<(i>>1);A=h+((c[r>>2]|0)-p)|0;C=i|(Ka(a,e,w,q+((A|0)<25|(u|0)==16384?0:A+-24|0)|0,t,j,f,v*m,C)|0);l=B;return C|0}else{C=c[A>>2]|0;j=Ka(a,e,w,q,t,j,f,v*m,C)|0;e=q+((c[r>>2]|0)-p)|0;C=j|(Ka(a,x,w,h+((e|0)<25|(u|0)==0?0:e+-24|0)|0,t,o,f,s*m,C>>t)|0)<<(i>>1);l=B;return C|0}}o=Na(q,p,o,t,k,h)|0;h=Oa(r,t,k,o)|0;q=a+32|0;p=h;h=(c[q>>2]|0)-h|0;while(1){c[q>>2]=h;if(!((h|0)<0&(o|0)>0))break;z=h+p|0;c[q>>2]=z;y=o+-1|0;C=Oa(r,t,k,y)|0;o=y;p=C;h=z-C|0}if(o|0){o=Pa(o)|0;if(!u){C=Mc(e,f,o,w,i,x,m)|0;l=B;return C|0}else{C=Jc(e,f,o,w,i,x,m,c[a+4>>2]|0)|0;l=B;return C|0}}if(!(c[a+4>>2]|0)){C=0;l=B;return C|0}o=(1<<i)+-1|0;p=o&n;c[A>>2]=p;if(!p){Qh(e|0,0,f<<2|0)|0;C=0;l=B;return C|0}q=a+40|0;a:do if(!j){p=0;while(1){if((p|0)>=(f|0))break a;C=ta(c[q>>2]|0)|0;c[q>>2]=C;g[e+(p<<2)>>2]=+(C>>20|0);p=p+1|0}}else{o=0;while(1){if((o|0)>=(f|0)){o=p;break a}C=ta(c[q>>2]|0)|0;c[q>>2]=C;g[e+(o<<2)>>2]=+g[j+(o<<2)>>2]+((C&32768|0)==0?-.00390625:.00390625);o=o+1|0}}while(0);Nc(e,f,m);C=o;l=B;return C|0}function La(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;i=R(b,d)|0;j=l;l=l+((1*(i<<2)|0)+15&-16)|0;if(!e){f=0;while(1){if((f|0)>=(d|0))break;g=R(f,b)|0;e=0;while(1){if((e|0)>=(b|0))break;c[j+((R(e,d)|0)+f<<2)>>2]=c[a+(g+e<<2)>>2];e=e+1|0}f=f+1|0}i=i<<2;Sh(a|0,j|0,i|0)|0;l=k;return}h=1416+(d<<2)+-8|0;f=0;while(1){if((f|0)>=(d|0))break;g=h+(f<<2)|0;e=0;while(1){if((e|0)>=(b|0))break;c[j+((R(e,d)|0)+f<<2)>>2]=c[a+((R(c[g>>2]|0,b)|0)+e<<2)>>2];e=e+1|0}f=f+1|0}i=i<<2;Sh(a|0,j|0,i|0)|0;l=k;return}function Ma(a,d,e,f,h,i,j,k,l,m,n){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;u=c[a>>2]|0;r=c[a+8>>2]|0;s=c[a+12>>2]|0;z=c[a+16>>2]|0;w=c[a+28>>2]|0;t=c[a+36>>2]|0;v=(b[(c[r+56>>2]|0)+(s<<1)>>1]|0)+(l<<3)|0;p=(m|0)==0;o=c[i>>2]|0;v=Qa(h,o,(v>>1)-((h|0)==2&(p^1)?16:4)|0,v,m)|0;v=p|(s|0)<(z|0)?v:1;u=(u|0)==0;if(u)m=0;else m=Pc(e,f,m,h)|0;x=w+20|0;y=w+28|0;z=zb(c[x>>2]|0,c[y>>2]|0)|0;a:do if((v|0)==1)if(p){o=0;q=57}else{if(u)l=0;else{b:do if((m|0)>8192){v=(c[a+52>>2]|0)==0;l=v&1;if(v){o=0;while(1){if((o|0)>=(h|0))break b;v=f+(o<<2)|0;g[v>>2]=-+g[v>>2];o=o+1|0}}}else l=0;while(0);Ra(c[r+8>>2]|0,e,f,t,s,h);o=c[i>>2]|0}do if((o|0)>16?(c[a+32>>2]|0)>16:0)if(u){l=Fb(w,2)|0;break}else{Qb(w,l,2);break}else l=0;while(0);o=(c[a+52>>2]|0)==0?l:0;q=56}else{do if(u)if(p)q=26;else q=13;else if(!p){l=c[a+48>>2]|0;if(!l){m=(R(m,v)|0)+8192>>14;q=13;break}else{m=(R(m,v)|0)+((((m|0)>8192?32767:-32767)|0)/(v|0)|0)|0;q=(m|0)<0;m=((v|0)>((q?0:m>>14)|0)?(q?0:m>>14):v+-1|0)+(l>>>31^1)|0;q=13;break}}else{m=(R(m,v)|0)+8192>>14;if(!((c[a+56>>2]|0)!=0&(m|0)>0&(m|0)<(v|0))){q=26;break}q=za(m<<14,v)|0;l=(ua(q&65535)|0)<<16>>16;l=(R((h<<23)+-8388608>>16,(va((ua(16384-q&65535)|0)<<16>>16,l)|0)<<16>>16)|0)+16384>>15;if((l|0)>(o|0)){m=v;q=26;break}m=(l|0)<(0-o|0)?0:m;q=26;break}while(0);do if((q|0)==13)if((h|0)>2){k=(v|0)/2|0;a=(k*3|0)+3|0;p=a+k|0;if(!u){o=(m|0)>(k|0);if(o)l=m+-1-k+a|0;else l=m*3|0;Kb(w,l,o?m-k+a|0:(m*3|0)+3|0,p);m=za(m<<14,v)|0;break}l=Cb(w,p)|0;if((l|0)<(a|0))l=(l|0)/3|0;else l=k+1+(l-a)|0;o=(l|0)>(k|0);if(o)m=l+-1-k+a|0;else m=l*3|0;Eb(w,m,o?l-k+a|0:(l*3|0)+3|0,p);q=38}else q=27;else if((q|0)==26)if(!((k|0)>1|p^1)){o=v>>1;k=o+1|0;a=R(k,k)|0;if(u){l=Cb(w,a)|0;if((l|0)<((R(o,k)|0)>>1|0)){l=((ec(l<<3|1)|0)+-1|0)>>>1;m=l+1|0;o=(R(l,m)|0)>>>1}else{l=((v<<1)+2-(ec((a-l<<3)+-7|0)|0)|0)>>>1;m=v+1-l|0;o=a-((R(m,v+2-l|0)|0)>>1)|0}Eb(w,o,o+m|0,a);q=38;break}else{l=(m|0)>(o|0);if(l)o=a-((R(v+1-m|0,v+2-m|0)|0)>>1)|0;else o=(R(m,m+1|0)|0)>>1;Kb(w,o,o+(l?v+1-m|0:m+1|0)|0,a);m=za(m<<14,v)|0;o=0;q=57;break a}}else q=27;while(0);do if((q|0)==27){l=v+1|0;if(!u){Sb(w,m,l);m=za(m<<14,v)|0;if(p){o=0;q=57;break a}else break}else{l=Gb(w,l)|0;q=38;break}}while(0);if((q|0)==38){m=za(l<<14,v)|0;o=0;q=57;break}if(!m){Ra(c[r+8>>2]|0,e,f,t,s,h);o=0;q=56;break}else{Sa(e,f,h);o=0;q=57;break}}while(0);c:do if((q|0)==56){l=(zb(c[x>>2]|0,c[y>>2]|0)|0)-z|0;c[i>>2]=(c[i>>2]|0)-l;m=0}else if((q|0)==57){l=(zb(c[x>>2]|0,c[y>>2]|0)|0)-z|0;c[i>>2]=(c[i>>2]|0)-l;d:do if((m|0)<16384)switch(m|0){case 0:break c;default:{}}else{switch(m|0){case 16384:break;default:break d}c[n>>2]=c[n>>2]&(1<<j)+-1<<j;z=16384;i=m;y=32767;x=0;j=o;n=l;c[d>>2]=j;j=d+4|0;c[j>>2]=x;j=d+8|0;c[j>>2]=y;j=d+12|0;c[j>>2]=z;j=d+16|0;c[j>>2]=i;j=d+20|0;c[j>>2]=n;return}while(0);x=(ua(m&65535)|0)<<16>>16;y=(ua(16384-m&65535)|0)<<16>>16;z=(R((h<<23)+-8388608>>16,(va(y,x)|0)<<16>>16)|0)+16384>>15;i=m;j=o;n=l;c[d>>2]=j;j=d+4|0;c[j>>2]=x;j=d+8|0;c[j>>2]=y;j=d+12|0;c[j>>2]=z;j=d+16|0;c[j>>2]=i;j=d+20|0;c[j>>2]=n;return}while(0);c[n>>2]=c[n>>2]&(1<<j)+-1;z=-16384;i=m;y=0;x=32767;j=o;n=l;c[d>>2]=j;j=d+4|0;c[j>>2]=x;j=d+8|0;c[j>>2]=y;j=d+12|0;c[j>>2]=z;j=d+16|0;c[j>>2]=i;j=d+20|0;c[j>>2]=n;return}function Na(a,c,e,f,g,h){a=a|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;g=e+(b[c+((R(g+1|0,a)|0)+f<<1)>>1]|0)|0;f=h+-1|0;e=d[g>>0]|0;a=0;c=0;while(1){if((c|0)==6)break;h=a+e+1>>1;i=(d[g+h>>0]|0)<(f|0);e=i?e:h;a=i?h:a;c=c+1|0}if(!a)c=-1;else c=d[g+a>>0]|0;return ((f-c|0)>((d[g+e>>0]|0)-f|0)?e:a)|0}function Oa(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;if(!g){g=0;return g|0}g=(d[(c[a+100>>2]|0)+(b[(c[a+96>>2]|0)+((R(f+1|0,c[a+8>>2]|0)|0)+e<<1)>>1]|0)+g>>0]|0)+1|0;return g|0}function Pa(a){a=a|0;if((a|0)<8)return a|0;a=(a&7|8)<<(a>>3)+-1;return a|0}function Qa(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;a=(a<<1)+((f|0)!=0&(a|0)==2?-2:-1)|0;a=Da((R(a,d)|0)+c|0,a)|0;f=c-e+-32|0;a=(f|0)<(a|0)?f:a;if((a|0)<=64){if((a|0)<4){f=1;return f|0}}else a=64;f=(b[24296+((a&7)<<1)>>1]>>14-(a>>3))+1&-2;return f|0}function Ra(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0;h=+g[d+(e<<2)>>2];j=+g[d+(a+e<<2)>>2];i=+F(+(h*h+1.0000000036274937e-15+j*j))+1.0000000036274937e-15;h=h/i;i=j/i;a=0;while(1){if((a|0)>=(f|0))break;e=b+(a<<2)|0;g[e>>2]=h*+g[e>>2]+i*+g[c+(a<<2)>>2];a=a+1|0}return}function Sa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0,h=0.0,i=0;d=0;while(1){if((d|0)>=(c|0))break;i=a+(d<<2)|0;f=+g[i>>2]*.7071067690849304;e=b+(d<<2)|0;h=+g[e>>2]*.7071067690849304;g[i>>2]=f+h;g[e>>2]=h-f;d=d+1|0}return}function Ta(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0.0,f=0,h=0.0,i=0.0,j=0,k=0,m=0.0,n=0;j=l;l=l+16|0;k=j+4|0;f=j;g[k>>2]=0.0;g[f>>2]=0.0;Ua(b,a,b,d,k,f);h=+g[k>>2]*c;g[k>>2]=h;i=c*c+ +g[f>>2];h=h*2.0;e=i-h;h=i+h;if(h<6.000000284984708e-04|e<6.000000284984708e-04){Sh(b|0,a|0,d<<2|0)|0;l=j;return}i=1.0/+F(+e);e=1.0/+F(+h);f=0;while(1){if((f|0)>=(d|0))break;n=a+(f<<2)|0;m=+g[n>>2]*c;k=b+(f<<2)|0;h=+g[k>>2];g[n>>2]=i*(m-h);g[k>>2]=e*(m+h);f=f+1|0}l=j;return}function Ua(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0,k=0.0;h=0.0;i=0.0;j=0;while(1){if((j|0)>=(d|0))break;k=+g[a+(j<<2)>>2];h=h+k*+g[c+(j<<2)>>2];i=i+k*+g[b+(j<<2)>>2];j=j+1|0}g[e>>2]=i;g[f>>2]=h;return}function Va(a){a=a|0;var b=0;a:do if((a|0)<16e3)if((a|0)<12e3){switch(a|0){case 8e3:break;default:{b=6;break a}}a=6;break}else{switch(a|0){case 12e3:break;default:{b=6;break a}}a=4;break}else{if((a|0)<24e3){switch(a|0){case 16e3:break;default:{b=6;break a}}a=3;break}if((a|0)>=48e3)switch(a|0){case 48e3:{a=1;break a}default:{b=6;break a}}switch(a|0){case 24e3:break;default:{b=6;break a}}a=2}while(0);if((b|0)==6)a=0;return a|0}function Wa(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;h=+h;i=i|0;j=j|0;k=k|0;l=l|0;var m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0;if(f==0.0&h==0.0){if((b|0)==(a|0))return;Wh(a|0,b|0,e<<2|0)|0;return}w=(c|0)>15?c:15;p=(d|0)>15?d:15;q=+g[1536+(i*12|0)>>2]*f;r=+g[1536+(i*12|0)+4>>2]*f;s=+g[1536+(i*12|0)+8>>2]*f;t=+g[1536+(j*12|0)>>2]*h;u=+g[1536+(j*12|0)+4>>2]*h;v=+g[1536+(j*12|0)+8>>2]*h;d=f==h&(w|0)==(p|0)&(i|0)==(j|0)?0:l;f=+g[b+(-2-p<<2)>>2];m=+g[b+(~p<<2)>>2];n=+g[b+(0-p<<2)>>2];o=+g[b+(1-p<<2)>>2];c=0;while(1){if((c|0)>=(d|0))break;A=+g[b+(c-p+2<<2)>>2];z=+g[k+(c<<2)>>2];z=z*z;y=1.0-z;j=c-w|0;g[a+(c<<2)>>2]=+g[b+(c<<2)>>2]+y*q*+g[b+(j<<2)>>2]+y*r*(+g[b+(j+1<<2)>>2]+ +g[b+(j+-1<<2)>>2])+y*s*(+g[b+(j+2<<2)>>2]+ +g[b+(j+-2<<2)>>2])+z*t*n+z*u*(o+m)+z*v*(A+f);z=o;y=n;x=m;o=A;c=c+1|0;n=z;m=y;f=x}if(!(h==0.0)){Xa(a+(c<<2)|0,b+(c<<2)|0,p,e-c|0,t,u,v);return}if((b|0)==(a|0))return;Wh(a+(d<<2)|0,b+(d<<2)|0,e-d<<2|0)|0;return}function Xa(a,b,c,d,e,f,h){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;h=+h;var i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;i=0;j=+g[b+(-2-c<<2)>>2];k=+g[b+(~c<<2)>>2];l=+g[b+(0-c<<2)>>2];m=+g[b+(1-c<<2)>>2];while(1){if((i|0)>=(d|0))break;q=+g[b+(i-c+2<<2)>>2];g[a+(i<<2)>>2]=+g[b+(i<<2)>>2]+l*e+(m+k)*f+(q+j)*h;p=m;o=l;n=k;i=i+1|0;m=q;l=p;k=o;j=n}return}function Ya(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=a+8|0;l=a+32|0;i=a+104|0;j=(f<<1)+g+-1|0;a=0;while(1){h=c[k>>2]|0;if((a|0)>=(h|0))break;n=c[l>>2]|0;m=a+1|0;c[e+(a<<2)>>2]=(R(R((d[(c[i>>2]|0)+((R(h,j)|0)+a)>>0]|0)+64|0,g)|0,(b[n+(m<<1)>>1]|0)-(b[n+(a<<1)>>1]|0)<<f)|0)>>2;a=m}return}function Za(a){a=a|0;var b=0;b=gc()|0;return _a(c[b+4>>2]|0,c[b+8>>2]|0,a)|0}function _a(a,b,c){a=a|0;b=b|0;c=c|0;return ((R(a,c)|0)<<2)+236+(c<<12)+((R(c<<2,b)|0)<<2)|0}function $a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;d=ab(a,gc()|0,d,e)|0;if(d|0){b=d;return b|0}c[a+28>>2]=Va(b)|0;b=0;return b|0}function ab(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;if(d>>>0>2){e=-1;l=f;return e|0}if((a|0)==0|(b|0)==0){e=-7;l=f;return e|0}Qh(a|0,0,_a(c[b+4>>2]|0,c[b+8>>2]|0,d)|0)|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=d;c[a+28>>2]=1;c[a+32>>2]=0;c[a+36>>2]=c[b+12>>2];c[a+48>>2]=1;c[a+72>>2]=e;c[a+52>>2]=1;c[a+16>>2]=1;c[a+40>>2]=-1;c[a+44>>2]=0;c[a+12>>2]=0;c[a+24>>2]=5;c[a+60>>2]=24;bb(a,4028,f)|0;e=0;l=f;return e|0}function bb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0;j=l;l=l+16|0;e=j;c[e>>2]=d;do switch(b|0){case 4010:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if(b>>>0>10)b=43;else{c[a+24>>2]=b;b=42}break}case 10010:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if((b|0)>=0?(b|0)<(c[(c[a>>2]|0)+8>>2]|0):0){c[a+32>>2]=b;b=42}else b=43;break}case 10012:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if((b|0)>=1?(b|0)<=(c[(c[a>>2]|0)+8>>2]|0):0){c[a+36>>2]=b;b=42}else b=43;break}case 10002:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if(b>>>0>2)b=43;else{c[a+20>>2]=(b|0)!=2&1;c[a+12>>2]=(b|0)==0&1;b=42}break}case 4014:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if(b>>>0>100)b=43;else{c[a+56>>2]=b;b=42}break}case 4020:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;c[a+52>>2]=b;b=42;break}case 4006:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;c[a+44>>2]=b;b=42;break}case 4002:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if((b|0)>500|(b|0)==-1){i=(c[a+4>>2]|0)*26e4|0;c[a+40>>2]=(b|0)<(i|0)?b:i;b=42}else b=43;break}case 10008:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if((b+-1|0)>>>0>1)b=43;else{c[a+8>>2]=b;b=42}break}case 4036:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if((b+-8|0)>>>0>16)b=43;else{c[a+60>>2]=b;b=42}break}case 4037:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;c[b>>2]=c[a+60>>2];b=42;break}case 4046:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if(b>>>0>1)b=43;else{c[a+68>>2]=b;b=42}break}case 4047:{i=(c[e>>2]|0)+(4-1)&~(4-1);b=c[i>>2]|0;c[e>>2]=i+4;if(!b)b=43;else{c[b>>2]=c[a+68>>2];b=42}break}case 4028:{d=a+4|0;i=c[d>>2]|0;h=c[a>>2]|0;k=c[h+4>>2]|0;e=a+236+((R(i,k+1024|0)|0)<<2)|0;b=c[h+8>>2]|0;f=R(i,b)|0;e=e+(f<<2)|0;f=e+(f<<2)|0;Qh(a+76|0,0,(_a(k,b,i)|0)+-76|0)|0;b=0;while(1){if((b|0)>=(R(i,c[h+8>>2]|0)|0))break;g[f+(b<<2)>>2]=-28.0;g[e+(b<<2)>>2]=-28.0;b=b+1|0;h=c[a>>2]|0;i=c[d>>2]|0}c[a+208>>2]=0;g[a+84>>2]=1.0;c[a+80>>2]=2;c[a+88>>2]=256;c[a+96>>2]=0;c[a+100>>2]=0;b=42;break}case 10016:{k=(c[e>>2]|0)+(4-1)&~(4-1);b=c[k>>2]|0;c[e>>2]=k+4;c[a+48>>2]=b;b=42;break}case 10022:{k=(c[e>>2]|0)+(4-1)&~(4-1);b=c[k>>2]|0;c[e>>2]=k+4;if(!b)b=42;else{e=a+120|0;d=e+56|0;do{c[e>>2]=c[b>>2];e=e+4|0;b=b+4|0}while((e|0)<(d|0));b=42}break}case 10028:{k=(c[e>>2]|0)+(4-1)&~(4-1);b=c[k>>2]|0;c[e>>2]=k+4;if(!b)b=42;else{i=b;k=c[i+4>>2]|0;b=a+176|0;c[b>>2]=c[i>>2];c[b+4>>2]=k;b=42}break}case 10015:{k=(c[e>>2]|0)+(4-1)&~(4-1);b=c[k>>2]|0;c[e>>2]=k+4;if(!b)b=43;else{c[b>>2]=c[a>>2];b=42}break}case 4031:{k=(c[e>>2]|0)+(4-1)&~(4-1);b=c[k>>2]|0;c[e>>2]=k+4;if(!b)b=43;else{c[b>>2]=c[a+76>>2];b=42}break}case 10024:{k=(c[e>>2]|0)+(4-1)&~(4-1);b=c[k>>2]|0;c[e>>2]=k+4;c[a+64>>2]=b;b=42;break}case 10026:{k=(c[e>>2]|0)+(4-1)&~(4-1);b=c[k>>2]|0;c[e>>2]=k+4;c[a+228>>2]=b;b=42;break}default:{k=-5;l=j;return k|0}}while(0);if((b|0)==42){k=0;l=j;return k|0}else if((b|0)==43){k=-1;l=j;return k|0}return 0}function cb(a,b,c,d,e,f,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;h=+h;i=i|0;j=j|0;var k=0.0,l=0,m=0,n=0;k=+g[i>>2];do if(h==0.0){if((e|0)!=1){l=(c|0)/(e|0)|0;n=8;break}if(!j){l=0;while(1){if((l|0)>=(c|0))break;h=+g[a+((R(l,d)|0)<<2)>>2]*32768.0;g[b+(l<<2)>>2]=h-k;k=h*f;l=l+1|0}g[i>>2]=k;return}else m=c}else{l=(c|0)/(e|0)|0;if((e|0)==1)m=l;else n=8}while(0);if((n|0)==8){Qh(b|0,0,c<<2|0)|0;m=l}l=0;while(1){if((l|0)>=(m|0))break;g[b+((R(l,e)|0)<<2)>>2]=+g[a+((R(l,d)|0)<<2)>>2]*32768.0;l=l+1|0}a:do if(!j)l=0;else{l=0;while(1){if((l|0)>=(m|0)){l=0;break a}d=b+((R(l,e)|0)<<2)|0;h=+g[d>>2];j=h>65536.0;a=h<-65536.0&(j^1);g[d>>2]=a|j?(a?-65536.0:65536.0):h;l=l+1|0}}while(0);while(1){if((l|0)>=(c|0))break;d=b+(l<<2)|0;h=+g[d>>2];g[d>>2]=h-k;k=h*f;l=l+1|0}g[i>>2]=k;return}function db(a,d,e,f,h,i){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0,A=0,B=0.0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ga=0.0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,ta=0,ua=0,va=0,xa=0,za=0,Ba=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0;Qa=l;l=l+96|0;q=Qa+40|0;Ia=Qa+32|0;F=Qa+28|0;Ea=Qa+24|0;Ba=Qa+20|0;P=Qa+16|0;ma=Qa+12|0;na=Qa+8|0;Q=Qa+4|0;G=Qa;Ma=c[a+4>>2]|0;Ha=c[a+8>>2]|0;c[Ia>>2]=15;g[F>>2]=0.0;c[Ea>>2]=0;c[P>>2]=0;c[Q>>2]=0;Da=c[a>>2]|0;oa=Da+8|0;Na=c[oa>>2]|0;C=c[Da+4>>2]|0;pa=Da+32|0;da=c[pa>>2]|0;Oa=c[a+32>>2]|0;Pa=c[a+36>>2]|0;la=(Oa|0)!=0;g[ma>>2]=0.0;if((h|0)<2|(d|0)==0){Pa=-1;l=Qa;return Pa|0}J=a+28|0;k=R(c[J>>2]|0,e)|0;j=Da+44|0;ia=Da+36|0;e=c[ia>>2]|0;za=0;while(1){if((za|0)>(e|0)){e=-1;X=221;break}if((c[j>>2]<<za|0)==(k|0))break;za=za+1|0}if((X|0)==221){l=Qa;return e|0}T=1<<za;xa=c[j>>2]<<za;D=a+236+((R(Ma,C)|0)<<2)|0;Ja=a+236+((R(Ma,C+1024|0)|0)<<2)|0;Ga=R(Ma,Na)|0;Ka=Ja+(Ga<<2)|0;La=Ka+(Ga<<2)|0;Fa=La+(Ga<<2)|0;o=(i|0)==0;if(o){x=0;A=1;ka=1}else{x=c[i+20>>2]|0;A=c[i+28>>2]|0;ka=zb(x,A)|0;A=eb(x,A)|0;x=A+4>>3}j=(h|0)<1275?h:1275;p=j-x|0;W=a+44|0;e=c[a+40>>2]|0;if(!(c[W>>2]|0))if((e|0)==-1)X=13;else{va=R(e,k)|0;X=c[Da>>2]|0;X=((va+((A|0)>1?A:0)+(X<<2)|0)/(X<<3|0)|0)-((c[a+48>>2]|0)!=0&1)|0;va=(j|0)<(X|0);j=((va?j:X)|0)<2?2:va?j:X;X=13}else if((e|0)==-1){e=-1;X=13}else{qa=c[Da>>2]|0;qa=((R(e,k)|0)+(qa>>4)|0)/(qa>>3|0)|0;z=qa>>6}if((X|0)==13){z=j-x|0;qa=0}ea=3-za|0;h=R((Ha*40|0)+20|0,(400>>>za)+-50|0)|0;k=(j*400>>ea)-h|0;if((e|0)==-1)ta=k;else{ta=e-h|0;ta=(k|0)<(ta|0)?k:ta}if(o){Jb(q,f,j);va=q}else va=i;$=(qa|0)>0;if((($?(c[a+52>>2]|0)!=0:0)?(r=(A|0)==1?2:0,s=(qa<<1)-(c[a+200>>2]|0)>>6,t=(r|0)>(s|0),((t?r:s)|0)<(p|0)):0)?(n=t?r:s,(n|0)<(p|0)):0){j=x+n|0;Wb(va,j)}else n=p;h=j<<3;O=c[Da+12>>2]|0;O=(Pa|0)>(O|0)?O:Pa;q=xa+C|0;S=R(Ma,q)|0;ua=fa()|0;I=l;l=l+((1*(S<<2)|0)+15&-16)|0;S=a+216|0;m=+g[S>>2];o=R(Ha,xa-C|0)|0;e=c[J>>2]|0;o=(o|0)/(e|0)|0;ga=+fb(d,o);ga=m>ga?m:ga;m=+fb(d+(o<<2)|0,(R(Ha,C)|0)/(e|0)|0);g[S>>2]=m;m=ga>m?ga:m;S=a+60|0;e=m<=1.0/+(1<<c[S>>2]|0);o=e&1;if((A|0)==1){Qb(va,o,15);if(e){if($){e=x+2|0;j=(j|0)<(e|0)?j:e;Wb(va,j);e=j<<3;k=j;n=2}else{e=h;k=z}i=j<<3;ra=va+20|0;h=c[ra>>2]|0;c[ra>>2]=h+(i-(eb(h,c[va+28>>2]|0)|0));ra=o;h=e;t=j}else{ra=0;i=1;k=z;t=j}}else{ra=0;i=A;k=z;t=j}p=a+16|0;f=Da+16|0;o=Da+20|0;j=m>65536.0;e=0;do{ja=I+((R(e,q)|0)<<2)+(C<<2)|0;cb(d+(e<<2)|0,ja,xa,Ma,c[J>>2]|0,+g[f>>2],+g[o>>2],a+184+(e<<2)|0,j&(c[p>>2]|0)!=0&1);e=e+1|0}while((e|0)<(Ma|0));ba=a+64|0;if(((c[ba>>2]|0)!=0&(n|0)>3|(n|0)>(Ha*12|0))&(la^1)&(ra|0)==0?(c[a+20>>2]|0)==0:0)e=(c[a+24>>2]|0)>4;else e=0;M=a+100|0;ja=c[M>>2]|0;e=gb(a,I,D,Ma,xa,ja,Ia,F,G,e&1,n)|0;ga=+g[F>>2];if(!(ga>.4000000059604645)?!(+g[a+108>>2]>.4000000059604645):0)V=0;else X=35;do if((X|0)==35){if(c[a+120>>2]|0?!(+g[a+124>>2]>.3):0){V=0;break}y=+(c[Ia>>2]|0);B=+(c[a+104>>2]|0);V=(y>B*1.26|y<B*.79)&1}while(0);F=(e|0)==0;if(F){if(!(la|(i+16|0)>(h|0)))Qb(va,0,1)}else{Qb(va,1,1);ca=c[Ia>>2]|0;Z=ca+1|0;aa=32-(U(Z|0)|0)|0;_=aa+-5|0;Sb(va,_,6);Tb(va,Z-(16<<_)|0,aa+-1|0);c[Ia>>2]=ca;Tb(va,c[G>>2]|0,3);Rb(va,ja,28866,2)}aa=a+24|0;if((c[aa>>2]|0)>0?(c[ba>>2]|0)==0:0){if(la&(k|0)<15)e=(c[a+180>>2]|0)>99;else e=0;j=hb(I,q,Ma,ma,P,e&1,Q)|0}else j=0;d=(za|0)>0;a:do if(d?((eb(c[va+20>>2]|0,c[va+28>>2]|0)|0)+3|0)<=(h|0):0)if(j){f=(R(Ma,xa)|0)<<2;p=l;l=l+((1*f|0)+15&-16)|0;f=l;l=l+((1*(Ga<<2)|0)+15&-16)|0;i=l;l=l+((1*(Ga<<2)|0)+15&-16)|0;o=R(Ha,Na)|0;q=l;l=l+((1*(o<<2)|0)+15&-16)|0;if((c[aa>>2]|0)>7){ib(Da,0,I,p,Ha,Ma,za,c[J>>2]|0);wa(Da,p,f,O,Ha,za);Bc(Da,O,Pa,f,q,Ha);m=+(za|0)*.5;e=0;while(1){if((e|0)>=(o|0)){ca=0;C=T;z=0;A=1;break a}ca=q+(e<<2)|0;g[ca>>2]=+g[ca>>2]+m;e=e+1|0}}else{ca=0;C=T;z=0;A=0}}else{e=0;X=50}else{e=1;j=0;X=50}while(0);if((X|0)==50){f=(R(Ma,xa)|0)<<2;p=l;l=l+((1*f|0)+15&-16)|0;f=l;l=l+((1*(Ga<<2)|0)+15&-16)|0;i=l;l=l+((1*(Ga<<2)|0)+15&-16)|0;ca=(R(Ha,Na)|0)<<2;q=l;l=l+((1*ca|0)+15&-16)|0;ca=e;C=0;z=1;A=0}ib(Da,C,I,p,Ha,Ma,za,c[J>>2]|0);_=(Ma|0)==2;if(_&(Ha|0)==1)c[P>>2]=0;wa(Da,p,f,O,Ha,za);b:do if(!(c[ba>>2]|0))Y=f;else{e=2;while(1){if((e|0)>=(Pa|0)){Y=f;break b}Z=f+(e<<2)|0;y=+g[Z>>2];B=+g[f>>2]*9.999999747378752e-05;B=y<B?y:B;g[Z>>2]=B>1.0000000036274937e-15?B:1.0000000036274937e-15;e=e+1|0}}while(0);Bc(Da,O,Pa,Y,i,Ha);Z=R(Ha,Na)|0;D=l;l=l+((1*(Z<<2)|0)+15&-16)|0;Qh(D|0,0,Pa<<2|0)|0;do if(!la?(H=c[a+228>>2]|0,(H|0)!=0):0){e=c[ba>>2]|0;if(e|0){y=0.0;u=0.0;B=0.0;e=(e|0)==0;break}x=c[a+92>>2]|0;x=(x|0)>2?x:2;e=0;u=0.0;m=0.0;r=0;while(1){if((r|0)>=(Ha|0))break;s=R(Na,r)|0;v=m;f=0;while(1){if((f|0)>=(x|0))break;m=+g[H+(s+f<<2)>>2];o=m<.25;do if(m>-2.0|o^1){if(o){if(!(m>0.0))break}else m=.25;m=m*.5}else m=-2.0;while(0);X=f+1|0;N=(b[da+(X<<1)>>1]|0)-(b[da+(f<<1)>>1]|0)|0;e=e+N|0;u=u+m*+((f<<1|1)-x|0);v=v+m*+(N|0);f=X}m=v;r=r+1|0}m=m/+(e|0)+.20000000298023224;u=u*6.0/+(R(R(R(Ha,x+-1|0)|0,x+1|0)|0,x)|0)*.5;e=u<.03099999949336052;u=e?(e&!(u>-.03099999949336052)?-.03099999949336052:u):.03099999949336052;e=(b[da+(x<<1)>>1]|0)/2|0;s=0;while(1){o=s+1|0;if((b[da+(o<<1)>>1]|0)<e<<16>>16)s=o;else break}r=(Ha|0)==2;e=0;f=0;while(1){if((f|0)>=(x|0))break;o=H+(f<<2)|0;if(r){X=H+(Na+f<<2)|0;o=+g[o>>2]>+g[X>>2]?o:X}v=+g[o>>2];v=(v<0.0?v:0.0)-(m+u*+(f-s|0));if(v>.25){g[D+(f<<2)>>2]=v+-.25;e=e+1|0}f=f+1|0}c:do if((e|0)>2){m=m+.25;if(m>0.0){Qh(D|0,0,x<<2|0)|0;u=0.0;m=0.0;break}else e=0;while(1){if((e|0)>=(x|0))break c;X=D+(e<<2)|0;B=+g[X>>2]+-.25;g[X>>2]=B<0.0?0.0:B;e=e+1|0}}while(0);y=m+.20000000298023224;B=u*64.0;X=89}else{y=0.0;B=0.0;X=89}while(0);if((X|0)==89){e=(c[ba>>2]|0)==0;if(e){w=z?0.0:+(za|0)*.5;f=(Ha|0)==2;v=0.0;m=-10.0;o=Oa;while(1){if((o|0)>=(Pa|0))break;u=m+-1.0;m=+g[i+(o<<2)>>2]-w;m=u>m?u:m;do if(f){u=+g[i+(o+Na<<2)>>2]-w;if(m>u)break;m=u}while(0);v=v+m;o=o+1|0}N=a+232|0;w=+g[N>>2];u=v/+(Pa-Oa|0)-w;K=u<-1.5;L=u>3.0&(K^1);u=L|K?(L?3.0:-1.5):u;g[N>>2]=w+u*.019999999552965164}else u=0.0}if(!A)Sh(q|0,i|0,Z<<2|0)|0;if(d){r=va+20|0;f=c[r>>2]|0;s=va+28|0;o=c[s>>2]|0;do if(((eb(f,o)|0)+3|0)<=(h|0)&(j|0)==0){if((c[aa>>2]|0)<=4){e=C;j=0;break}if(!e){e=C;j=0;break}if(la){e=C;j=0;break}if(!(jb(i,Ja,Na,0,Pa,Ha)|0)){e=C;j=0;break}ib(Da,T,I,p,Ha,Ma,za,c[J>>2]|0);wa(Da,p,Y,O,Ha,za);Bc(Da,O,Pa,Y,i,Ha);m=+(za|0)*.5;e=0;while(1){if((e|0)>=(Z|0))break;N=q+(e<<2)|0;g[N>>2]=+g[N>>2]+m;e=e+1|0}g[ma>>2]=.20000000298023224;f=c[r>>2]|0;o=c[s>>2]|0;e=T;j=1}else e=C;while(0);if(((eb(f,o)|0)+3|0)>(h|0)){L=e;N=j}else{Qb(va,j,3);L=e;N=j}}else{L=C;N=j}J=(R(Ha,xa)|0)<<2;K=l;l=l+((1*J|0)+15&-16)|0;ya(Da,p,K,Y,O,Ha,T);J=l;l=l+((1*(Na<<2)|0)+15&-16)|0;d:do if((k|0)<(Ha*15|0))if(la)X=119;else{e=0;X=125}else if(la)X=119;else{if((c[aa>>2]|0)<=1){e=0;X=125;break}if(c[ba>>2]|0){e=0;X=125;break}j=(1280/(k|0)|0)+2|0;j=kb(Da,O,N,J,(j|0)>5?j:5,K,xa,za,+g[ma>>2],c[P>>2]|0)|0;o=J+(O+-1<<2)|0;e=O;while(1){if((e|0)>=(Pa|0))break d;c[J+(e<<2)>>2]=c[o>>2];e=e+1|0}}while(0);e:do if((X|0)==119){if(c[Q>>2]|0){e=0;while(1){if((e|0)>=(Pa|0)){j=0;break e}c[J+(e<<2)>>2]=1;e=e+1|0}}if((k|0)<15)e=0;else{e=0;X=125;break}while(1){if((e|0)>=(Pa|0)){j=N;break e}c[J+(e<<2)>>2]=0;e=e+1|0}}while(0);f:do if((X|0)==125)while(1){X=0;if((e|0)>=(Pa|0)){j=0;break f}c[J+(e<<2)>>2]=N;e=e+1|0;X=125}while(0);H=l;l=l+((1*(Z<<2)|0)+15&-16)|0;o=0;do{p=R(o,Na)|0;e=Oa;while(1){if((e|0)>=(Pa|0))break;f=e+p|0;r=i+(f<<2)|0;m=+g[r>>2];if(+E(+(m-+g[Ja+(f<<2)>>2]))<2.0)g[r>>2]=m-+g[Fa+(f<<2)>>2]*.25;e=e+1|0}o=o+1|0}while((o|0)<(Ha|0));uc(Da,Oa,Pa,O,i,Ja,h,H,va,Ha,za,n,c[a+12>>2]|0,a+84|0,(c[aa>>2]|0)>3&1,c[a+56>>2]|0,c[ba>>2]|0);lb(Oa,Pa,N,J,za,j,va);G=va+20|0;I=va+28|0;if(((eb(c[G>>2]|0,c[I>>2]|0)|0)+4|0)<=(h|0)){do if(!(c[ba>>2]|0))if(la){if(!(c[aa>>2]|0)){c[a+80>>2]=0;e=0;break}e=a+80|0;if(!N){c[e>>2]=3;e=3;break}else{c[e>>2]=2;e=2;break}}else{j=c[aa>>2]|0;if(!((L|0)!=0|(j|0)<3|(n|0)<(Ha*10|0))){Q=a+80|0;e=Aa(Da,K,a+88|0,c[Q>>2]|0,a+96|0,M,(F^1)&1,O,Ha,T)|0;c[Q>>2]=e;break}e=a+80|0;if(!j){c[e>>2]=0;e=0;break}else{c[e>>2]=2;e=2;break}}else{c[M>>2]=0;c[a+80>>2]=2;e=2}while(0);Rb(va,e,28869,5)}F=l;l=l+((1*(Na<<2)|0)+15&-16)|0;A=a+52|0;d=a+120|0;m=+mb(i,q,Na,Oa,Pa,Ha,F,c[S>>2]|0,c[Da+56>>2]|0,N,c[W>>2]|0,c[A>>2]|0,da,za,k,na,c[ba>>2]|0,D,d);if(c[ba>>2]|0)c[F>>2]=(k|0)>26?8:(k|0)/3|0;D=l;l=l+((1*(Na<<2)|0)+15&-16)|0;Ya(Da,D,za,Ha);z=h<<3;W=c[G>>2]|0;k=c[I>>2]|0;h=6;o=0;j=W;e=k;n=Oa;k=zb(W,k)|0;while(1){if((n|0)>=(Pa|0))break;x=n+1|0;p=(R(Ha,(b[da+(x<<1)>>1]|0)-(b[da+(n<<1)>>1]|0)|0)|0)<<za;s=p<<3;f=(p|0)<48;p=(s|0)<((f?48:p)|0)?s:f?48:p;f=D+(n<<2)|0;s=F+(n<<2)|0;q=0;r=0;n=h;while(1){if((k+(n<<3)|0)>=(z-o|0))break;if((r|0)>=(c[f>>2]|0))break;W=(q|0)<(c[s>>2]|0);Qb(va,W&1,n);j=c[G>>2]|0;e=c[I>>2]|0;k=zb(j,e)|0;if(!W)break;q=q+1|0;r=r+p|0;n=1;o=o+p|0}if(q)h=(h|0)<3?2:h+-1|0;c[s>>2]=r;n=x}C=(Ha|0)==2;if(C){if(za|0)c[Ea>>2]=nb(Da,K,za,xa)|0;da=a+224|0;W=sa(+((ta|0)/1e3|0|0),c[da>>2]|0)|0;T=(Oa|0)>(W|0);c[da>>2]=(Pa|0)<((T?Oa:W)|0)?Pa:T?Oa:W}if((k+48|0)>(z-o|0))x=5;else{do if((Oa|0)>0)X=168;else{if(c[ba>>2]|0){X=168;break}h=ob(Da,K,i,Pa,za,Ha,xa,d,a+220|0,+g[ma>>2],c[a+224>>2]|0,B,ta)|0}while(0);if((X|0)==168){g[a+220>>2]=0.0;h=5}Rb(va,h,28873,7);da=c[G>>2]|0;k=c[I>>2]|0;j=da;e=k;x=h;k=zb(da,k)|0}if($){f=(c[ia>>2]|0)-za|0;i=1275>>>ea;i=(t|0)<(i|0)?t:i;if(la){e=(Ha*72|0)+32|0;e=(qa|0)<(e|0)?0:qa-e|0}else e=qa-((Ha*320|0)+160)|0;h=c[A>>2]|0;p=(h|0)==0;if(!p)e=e+(c[a+208>>2]>>f)|0;if(la){pa=c[a+180>>2]|0;B=+g[ma>>2];e=e+((pa|0)<100?96>>>ea:0)-((pa|0)>100?144>>>ea:0)+~~((B+-.25)*400.0)|0;pa=(k+o+63>>6)+2|0;j=ka+296+o+63>>6;j=(pa|0)>(j|0)?pa:j;e=!(B>.699999988079071)|(e|0)>400?e:400}else{j=(k+o+63>>6)+2|0;e=pb(c[oa>>2]|0,c[pa>>2]|0,d,e,za,ta,c[a+92>>2]|0,Ha,c[a+224>>2]|0,h,+g[a+220>>2],c[na>>2]|0,+g[ma>>2],V,m,c[ba>>2]|0,(c[a+228>>2]|0)!=0&1,y,u)|0}k=e+k|0;n=k+32>>6;n=(j|0)>(n|0)?j:n;n=(i|0)<(n|0)?i:n;o=(ra|0)==0;e=o?n:2;j=a+212|0;h=c[j>>2]|0;if((h|0)<970){c[j>>2]=h+1;m=1.0/+(h+21|0)}else m=1.0000000474974513e-03;do if(!p){j=a+200|0;c[j>>2]=(c[j>>2]|0)+((o?n<<6:128)-qa);j=a+208|0;pa=a+204|0;h=c[pa>>2]|0;h=h+~~(m*+(((o?k-qa|0:0)<<f)-(c[j>>2]|0)-h|0))|0;c[pa>>2]=h;c[j>>2]=0-h;j=a+200|0;h=c[j>>2]|0;if((h|0)>=0)break;c[j>>2]=0;e=o?n+((h|0)/-64|0)|0:2}while(0);t=(i|0)<(e|0)?i:e;Wb(va,t);j=c[G>>2]|0;e=c[I>>2]|0}f=l;l=l+((1*(Na<<2)|0)+15&-16)|0;i=l;l=l+((1*(Na<<2)|0)+15&-16)|0;q=l;l=l+((1*(Na<<2)|0)+15&-16)|0;r=t<<6;e=r-(zb(j,e)|0)+-1|0;s=(N|0)==0;if((za|0)>1&(s^1))o=(e|0)>=((za<<3)+16|0);else o=0;n=o?8:0;j=e-n|0;if(!(c[a+120>>2]|0))e=Pa+-1|0;else{do if((ta|0)<(Ha*32e3|0))e=13;else{if((ta|0)<(Ha*48e3|0)){e=16;break}if((ta|0)<(Ha*6e4|0)){e=18;break}e=(ta|0)<(Ha*8e4|0)?19:20}while(0);ta=c[a+148>>2]|0;e=(ta|0)>(e|0)?ta:e}k=a+224|0;h=a+92|0;j=Cc(Da,Oa,Pa,F,D,x,k,Ea,j,Ba,i,f,q,Ha,za,va,c[h>>2]|0,(c[ba>>2]|0)==0?e:1)|0;e=c[h>>2]|0;if(!e)e=j;else{qa=e+1|0;e=e+-1|0;ta=(e|0)>(j|0);e=(qa|0)<((ta?e:j)|0)?qa:ta?e:j}c[h>>2]=e;zc(Da,Oa,Pa,Ja,H,f,va,Ha);ta=l;l=l+((1*Z|0)+15&-16)|0;p=a+76|0;Ca(Da,Oa,Pa,K,C?K+(xa<<2)|0:0,ta,Y,i,L,c[a+80>>2]|0,c[Ea>>2]|0,c[k>>2]|0,J,r-n|0,c[Ba>>2]|0,va,za,j,p,c[aa>>2]|0,c[a+72>>2]|0,c[a+68>>2]|0);if(o)Tb(va,(c[a+116>>2]|0)<2&1,1);Ac(Da,Oa,Pa,Ja,H,f,q,(t<<3)-(eb(c[G>>2]|0,c[I>>2]|0)|0)|0,va,Ha);k=Ga<<2;Qh(Fa|0,0,k|0)|0;j=0;do{h=R(j,Na)|0;e=Oa;while(1){if((e|0)>=(Pa|0))break;Ea=e+h|0;B=+g[H+(Ea<<2)>>2];Ba=B>.5;Da=B<-.5&(Ba^1);g[Fa+(Ea<<2)>>2]=Da|Ba?(Da?-.5:.5):B;e=e+1|0}j=j+1|0}while((j|0)<(Ha|0));g:do if(ra|0){e=0;while(1){if((e|0)>=(Z|0))break g;g[Ja+(e<<2)>>2]=-28.0;e=e+1|0}}while(0);c[a+104>>2]=c[Ia>>2];g[a+108>>2]=ga;c[a+112>>2]=ja;if(_&(Ha|0)==1)Sh(Ja+(Na<<2)|0,Ja|0,Na<<2|0)|0;h:do if(s){Sh(La|0,Ka|0,k|0)|0;Sh(Ka|0,Ja|0,k|0)|0;j=0}else{e=0;while(1){if((e|0)>=(Ga|0)){j=0;break h}Ia=Ka+(e<<2)|0;B=+g[Ia>>2];ga=+g[Ja+(e<<2)>>2];g[Ia>>2]=B<ga?B:ga;e=e+1|0}}while(0);do{h=R(j,Na)|0;e=0;while(1){if((e|0)>=(Oa|0)){e=Pa;break}Ia=h+e|0;g[Ja+(Ia<<2)>>2]=0.0;g[La+(Ia<<2)>>2]=-28.0;g[Ka+(Ia<<2)>>2]=-28.0;e=e+1|0}while(1){if((e|0)>=(Na|0))break;Ia=h+e|0;g[Ja+(Ia<<2)>>2]=0.0;g[La+(Ia<<2)>>2]=-28.0;g[Ka+(Ia<<2)>>2]=-28.0;e=e+1|0}j=j+1|0}while((j|0)<(Ma|0));j=a+116|0;if(!(N|ca))e=0;else e=(c[j>>2]|0)+1|0;c[j>>2]=e;c[p>>2]=c[I>>2];Xb(va);Pa=(qb(c[va+44>>2]|0)|0)==0;ha(ua|0);Pa=Pa?t:-3;l=Qa;return Pa|0}function eb(a,b){a=a|0;b=b|0;return (U(b|0)|0)+-32+a|0}function fb(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0;c=0.0;d=0.0;e=0;while(1){if((e|0)>=(b|0))break;f=+g[a+(e<<2)>>2];c=c<f?c:f;d=d>f?d:f;e=e+1|0}f=-c;return +(d>f?d:f)}function gb(a,b,d,e,f,h,i,j,k,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;N=l;l=l+16|0;J=N+8|0;s=N;v=c[a>>2]|0;K=c[v+4>>2]|0;q=f+1024|0;M=(R(q,e)|0)<<2;L=l;l=l+((1*M|0)+15&-16)|0;c[J>>2]=L;c[J+4>>2]=L+(q<<2);L=K+f|0;M=f<<2;o=0;do{I=c[J+(o<<2)>>2]|0;Sh(I|0,d+(o<<10<<2)|0,4096)|0;Sh(I+4096|0,b+((R(o,L)|0)<<2)+(K<<2)|0,M|0)|0;o=o+1|0}while((o|0)<(e|0));if(!m){c[s>>2]=15;t=0.0;q=a+104|0;I=15}else{m=fa()|0;o=l;l=l+((1*(q>>1<<2)|0)+15&-16)|0;hc(J,o,q,e);mc(o+2048|0,o,f,s);c[s>>2]=1024-(c[s>>2]|0);q=a+104|0;p=+oc(o,f,s,c[q>>2]|0,+g[a+108>>2]);o=c[s>>2]|0;if((o|0)>1022){c[s>>2]=1022;o=1022}t=p*.699999988079071;I=c[a+56>>2]|0;t=(I|0)>2?t*.5:t;ha(m|0);t=(I|0)>8?0.0:(I|0)>4?t*.5:t;I=o}s=c[q>>2]|0;H=I-s|0;p=(((H|0)>-1?H:0-H|0)*10|0)>(I|0)?.4000000059604645:.20000000298023224;if((n|0)>=25){if((n|0)<35)u=11}else{p=p+.10000000149011612;u=11}if((u|0)==11)p=p+.10000000149011612;H=a+108|0;r=+g[H>>2];p=r>.4000000059604645?p+-.10000000149011612:p;p=r>.550000011920929?p+-.10000000149011612:p;if(t<(p>.20000000298023224?p:.20000000298023224)){F=0;G=0;p=0.0}else{m=+E(+(t-r))<.10000000149011612;m=~~+D(+((m?r:t)*32.0/3.0+.5));o=m+-1|0;if((o|0)<=7)if((m|0)<1)o=0;else u=15;else{o=7;u=15}F=o;G=1;p=+(o+1|0)*.09375}A=v+44|0;B=K<<2;r=-p;C=a+112|0;w=v+60|0;x=(f|0)>1024;y=1024-f<<2;z=0-f|0;o=0;m=s;while(1){v=(c[A>>2]|0)-K|0;c[q>>2]=(m|0)>15?m:15;m=b+((R(o,L)|0)<<2)|0;s=a+236+((R(o,K)|0)<<2)|0;Sh(m|0,s|0,B|0)|0;if(!v)u=c[J+(o<<2)>>2]|0;else{u=c[J+(o<<2)>>2]|0;O=c[q>>2]|0;t=-+g[H>>2];n=c[C>>2]|0;Wa(m+(K<<2)|0,u+4096|0,O,O,v,t,t,n,n,0,0)}n=u+4096|0;Wa(m+(K<<2)+(v<<2)|0,n+(v<<2)|0,c[q>>2]|0,I,f-v|0,-+g[H>>2],r,c[C>>2]|0,h,c[w>>2]|0,K);Sh(s|0,m+(f<<2)|0,B|0)|0;m=d+(o<<10<<2)|0;if(x)Sh(m|0,u+(f<<2)|0,4096)|0;else{Wh(m|0,m+(f<<2)|0,y|0)|0;Sh(m+4096+(z<<2)|0,n|0,M|0)|0}o=o+1|0;if((o|0)>=(e|0))break;m=c[q>>2]|0}g[j>>2]=p;c[i>>2]=I;c[k>>2]=F;l=N;return G|0}function hb(a,b,e,f,h,i,j){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,E=0,G=0;A=l;y=l;l=l+((1*(b<<2)|0)+15&-16)|0;c[j>>2]=0;w=(i|0)==0;p=w?.0625:.03125;x=(b|0)/2|0;s=+(x|0);t=+(x|0);u=x+-5|0;v=(x*6|0)+-102|0;q=0;r=0;while(1){if((q|0)>=(e|0))break;n=R(q,b)|0;k=0.0;i=0;m=0.0;while(1){if((i|0)>=(b|0))break;C=+g[a+(i+n<<2)>>2];B=m+C;g[y+(i<<2)>>2]=B;o=k+B-C*2.0;k=C-B*.5;i=i+1|0;m=o}i=y;n=i+48|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(n|0));o=0.0;k=0.0;i=0;while(1){if((i|0)>=(x|0)){i=x;m=0.0;break}n=i<<1;C=+g[y+(n<<2)>>2];B=+g[y+((n|1)<<2)>>2];B=C*C+B*B;C=k+p*(B-k);g[y+(i<<2)>>2]=C;o=o+B;k=C;i=i+1|0}a:while(1){n=i;k=m;while(1){i=n+-1|0;if((n|0)<=0)break a;n=y+(i<<2)|0;k=k+(+g[n>>2]-k)*.125;g[n>>2]=k;if(m>k)n=i;else{m=k;continue a}}}k=t/(+F(+(o*m*.5*s))+1.0000000036274937e-15)*64.0;i=0;n=12;while(1){if((n|0)>=(u|0))break;C=+D(+(k*(+g[y+(n<<2)>>2]+1.0000000036274937e-15)));G=C>127.0;E=C<0.0&(G^1);i=i+(d[28884+~~(E|G?(E?0.0:127.0):C)>>0]|0)|0;n=n+4|0}i=(i<<8|0)/(v|0)|0;if((i|0)>(r|0))c[h>>2]=q;else i=r;q=q+1|0;r=i}if((r+-201|0)>>>0<399&(w^1)){c[j>>2]=1;i=0}else i=(r|0)>200&1;k=+F(+(+(r*27|0)))+-42.0;if(!(k<0.0))if(k>163.0)m=163.0;else z=22;else{k=0.0;z=22}if((z|0)==22)m=k;if(m*.006899999920278788+-.139<0.0){C=0.0;C=+F(+C);g[f>>2]=C;l=A;return i|0}C=(k>163.0?163.0:k)*.006899999920278788+-.139;C=+F(+C);g[f>>2]=C;l=A;return i|0}function ib(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;q=c[a+4>>2]|0;n=(b|0)==0;t=c[a+44>>2]<<(n?i:0);s=n?1:b;n=(c[a+36>>2]|0)-(n?i:0)|0;o=a+64|0;r=R(s,t)|0;p=r+q|0;a=a+60|0;b=0;do{k=d+((R(b,p)|0)<<2)|0;m=R(R(b,t)|0,s)|0;i=0;while(1){if((i|0)>=(s|0))break;u=k+((R(i,t)|0)<<2)|0;fc(o,u,e+(i+m<<2)|0,c[a>>2]|0,q,n,s);i=i+1|0}b=b+1|0}while((b|0)<(h|0));a:do if((h|0)==2&(f|0)==1){b=0;while(1){if((b|0)>=(r|0))break a;u=e+(b<<2)|0;g[u>>2]=+g[u>>2]*.5+ +g[e+(r+b<<2)>>2]*.5;b=b+1|0}}while(0);if((j|0)==1)return;m=(r|0)/(j|0)|0;l=+(j|0);a=r-m<<2;b=0;do{k=R(R(b,s)|0,t)|0;i=0;while(1){if((i|0)>=(m|0))break;u=e+(k+i<<2)|0;g[u>>2]=+g[u>>2]*l;i=i+1|0}Qh(e+(k+m<<2)|0,0,a|0)|0;b=b+1|0}while((b|0)<(f|0));return}function jb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0.0,m=0,n=0.0,o=0.0,p=0,q=0,r=0;r=l;l=l+112|0;q=r;i=b+(e<<2)|0;a:do if((h|0)==1){p=c[i>>2]|0;c[q+(e<<2)>>2]=p;i=e;k=(c[j>>2]=p,+g[j>>2]);while(1){i=i+1|0;if((i|0)>=(f|0))break a;o=+g[b+(i<<2)>>2];o=k+-1.0>o?k+-1.0:o;g[q+(i<<2)>>2]=o;k=o}}else{o=+g[i>>2];k=+g[b+(e+d<<2)>>2];i=e;k=o>k?o:k;while(1){g[q+(i<<2)>>2]=k;i=i+1|0;if((i|0)>=(f|0))break a;n=+g[b+(i<<2)>>2];o=+g[b+(i+d<<2)>>2];m=n>o;if(k+-1.0>(m?n:o)){k=k+-1.0;continue}else{k=m?n:o;continue}}}while(0);i=f+-2|0;while(1){if((i|0)<(e|0))break;p=q+(i<<2)|0;n=+g[p>>2];o=+g[q+(i+1<<2)>>2]+-1.0;g[p>>2]=n>o?n:o;i=i+-1|0}p=(e|0)<2;b=f+-1|0;k=0.0;m=0;do{f=R(m,d)|0;i=p?2:e;while(1){if((i|0)>=(b|0))break;n=+g[a+(i+f<<2)>>2];o=+g[q+(i<<2)>>2];o=(n<0.0?0.0:n)-(o<0.0?0.0:o);k=k+(o<0.0?0.0:o);i=i+1|0}m=m+1|0}while((m|0)<(h|0));q=k/+(R(b-(p?2:e)|0,h)|0)>1.0&1;l=r;return q|0}function kb(d,e,f,g,h,i,j,k,m,n){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=+m;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0,J=0;G=l;l=l+16|0;A=G;y=.5-m;y=(y<-.25?-.25:y)*.03999999910593033;D=l;l=l+((1*(e<<2)|0)+15&-16)|0;v=d+32|0;E=c[v>>2]|0;C=e+-1|0;E=(b[E+(e<<1)>>1]|0)-(b[E+(C<<1)>>1]|0)<<k;w=l;l=l+((1*(E<<2)|0)+15&-16)|0;x=l;l=l+((1*(E<<2)|0)+15&-16)|0;E=l;l=l+((1*(e<<2)|0)+15&-16)|0;F=l;l=l+((1*(e<<2)|0)+15&-16)|0;p=R(n,j)|0;B=(f|0)==0;q=1<<k;r=k+1|0;s=R(k,-2)|0;o=0;while(1){if((o|0)>=(e|0))break;u=c[v>>2]|0;t=o+1|0;j=b[u+(o<<1)>>1]|0;u=(b[u+(t<<1)>>1]|0)-j|0;n=u<<k;u=(u|0)==1;d=n<<2;Sh(w|0,i+(p+(j<<k)<<2)|0,d|0)|0;if(!B){m=+ub(w,n,k,y);if(!u?(Sh(x|0,w|0,d|0)|0,Ba(x,n>>k,q),z=+ub(x,n,r,y),z<m):0){d=0;j=-1;m=z}else{d=0;j=0}}else{d=0;j=0;m=+ub(w,n,0,y)}while(1){if((d|0)>=((B&(u^1)&1)+k|0))break;Ba(w,n>>d,1<<d);H=+ub(w,n,B?d+1|0:k-d+-1|0,y);I=H<m;J=d+1|0;d=J;j=I?J:j;m=I?H:m}d=R(j,-2)|0;j=B?d:j<<1;d=D+(o<<2)|0;c[d>>2]=j;if(!u){o=t;continue}if(!((j|0)==0|(j|0)==(s|0))){o=t;continue}c[d>>2]=j+-1;o=t}r=f<<2;n=0;while(1){if((n|0)==2)break;q=r+(n<<1)|0;p=28834+(k<<3)+q|0;q=(q|1)+(28834+(k<<3))|0;d=0;j=B?h:0;o=1;while(1){if((o|0)>=(e|0))break;f=j+h|0;I=d+h|0;J=c[D+(o<<2)>>2]|0;i=J-(a[p>>0]<<1)|0;J=J-(a[q>>0]<<1)|0;d=((d|0)<(f|0)?d:f)+((i|0)>-1?i:0-i|0)|0;j=((I|0)<(j|0)?I:j)+((J|0)>-1?J:0-J|0)|0;o=o+1|0}c[A+(n<<2)>>2]=(d|0)<(j|0)?d:j;n=n+1|0}q=(c[A+4>>2]|0)<(c[A>>2]|0)&(B^1)&1;o=r|q<<1;p=28834+(k<<3)+o|0;o=(o|1)+(28834+(k<<3))|0;n=0;d=B?h:0;j=1;while(1){if((j|0)>=(e|0))break;A=d+h|0;i=(n|0)<(A|0);c[E+(j<<2)>>2]=(i^1)&1;I=n+h|0;k=(I|0)<(d|0);c[F+(j<<2)>>2]=(k^1)&1;J=c[D+(j<<2)>>2]|0;B=J-(a[p>>0]<<1)|0;J=J-(a[o>>0]<<1)|0;n=(i?n:A)+((B|0)>-1?B:0-B|0)|0;d=(k?I:d)+((J|0)>-1?J:0-J|0)|0;j=j+1|0}j=(n|0)>=(d|0)&1;c[g+(C<<2)>>2]=j;d=e+-2|0;while(1){if((d|0)<=-1)break;J=c[((j|0)==1?F:E)+(d+1<<2)>>2]|0;c[g+(d<<2)>>2]=J;d=d+-1|0;j=J}l=G;return q|0}function lb(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=c[i+4>>2]<<3;r=i+20|0;s=i+28|0;l=eb(c[r>>2]|0,c[s>>2]|0)|0;k=(e|0)!=0;m=k?2:4;if((g|0)>0)t=(l+m+1|0)>>>0<=j>>>0;else t=0;q=j-(t&1)|0;p=k?4:5;n=0;o=b;k=0;while(1){if((o|0)>=(d|0))break;j=f+(o<<2)|0;if((l+m|0)>>>0>q>>>0){c[j>>2]=k;j=n}else{Qb(i,c[j>>2]^k,m);l=eb(c[r>>2]|0,c[s>>2]|0)|0;k=c[j>>2]|0;j=n|k}m=p;n=j;o=o+1|0}k=e<<2;if(t?(a[k+n+(28834+(g<<3))>>0]|0)!=(a[(k|2)+n+(28834+(g<<3))>>0]|0):0){Qb(i,h,1);j=h<<1}else j=0;j=k+j|0;while(1){if((b|0)>=(d|0))break;i=f+(b<<2)|0;c[i>>2]=a[j+(c[i>>2]|0)+(28834+(g<<3))>>0];b=b+1|0}return}function mb(a,e,f,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y){a=a|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;var z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0.0;K=l;F=R(k,f)|0;I=l;l=l+((1*(F<<2)|0)+15&-16)|0;G=l;l=l+((1*(F<<2)|0)+15&-16)|0;Qh(m|0,0,f<<2|0)|0;z=+(9-n|0);n=0;while(1){if((n|0)>=(i|0)){n=0;z=-31.899999618530273;break}F=n+5|0;g[G+(n<<2)>>2]=+(b[o+(n<<1)>>1]|0)*.0625+.5+z-+g[18836+(n<<2)>>2]+ +(R(F,F)|0)*.006200000178068876;n=n+1|0}while(1){A=R(n,f)|0;o=0;H=z;while(1){if((o|0)>=(i|0))break;z=+g[a+(A+o<<2)>>2]-+g[G+(o<<2)>>2];o=o+1|0;H=H>z?H:z}n=n+1|0;if((n|0)>=(k|0))break;else z=H}if(!((u|0)>50&(t|0)>0&(w|0)==0)){J=0;c[v>>2]=J;l=K;return +H}D=i+-2|0;E=i+-1|0;n=0;C=0;while(1){w=R(C,f)|0;F=I+(w<<2)|0;B=e+(w<<2)|0;o=c[B>>2]|0;c[F>>2]=o;A=n;n=1;z=(c[j>>2]=o,+g[j>>2]);while(1){if((n|0)>=(i|0)){o=A;break}o=w+n|0;L=+g[e+(o<<2)>>2];o=L>+g[e+(o+-1<<2)>>2]+.5?n:A;L=z+1.5<L?z+1.5:L;g[F+(n<<2)>>2]=L;A=o;n=n+1|0;z=L}while(1){n=o+-1|0;if((o|0)<=0){n=2;break}M=F+(n<<2)|0;O=+g[M>>2];z=+g[F+(o<<2)>>2]+2.0;L=+g[e+(w+n<<2)>>2];N=z<L;g[M>>2]=O<(N?z:L)?O:N?z:L;o=n}while(1){if((n|0)>=(D|0))break;N=F+(n<<2)|0;L=+g[N>>2];O=+sb(e+(w+n+-2<<2)|0)+-1.0;g[N>>2]=L>O?L:O;n=n+1|0}O=+tb(B)+-1.0;L=+g[F>>2];g[F>>2]=L>O?L:O;n=F+4|0;L=+g[n>>2];g[n>>2]=L>O?L:O;O=+tb(e+(w+i+-3<<2)|0)+-1.0;n=F+(D<<2)|0;L=+g[n>>2];g[n>>2]=L>O?L:O;n=F+(E<<2)|0;L=+g[n>>2];g[n>>2]=L>O?L:O;n=0;while(1){if((n|0)>=(i|0))break;N=F+(n<<2)|0;L=+g[N>>2];O=+g[G+(n<<2)>>2];g[N>>2]=L>O?L:O;n=n+1|0}C=C+1|0;if((C|0)>=(k|0))break;else n=A}a:do if((k|0)==2){n=h;while(1){if((n|0)>=(i|0)){n=h;break a}G=n+f|0;M=I+(G<<2)|0;O=+g[M>>2];N=I+(n<<2)|0;L=+g[N>>2]+-4.0;L=O>L?O:L;g[M>>2]=L;O=+g[N>>2];L=L+-4.0;L=O>L?O:L;g[N>>2]=L;L=+g[a+(n<<2)>>2]-L;O=+g[a+(G<<2)>>2]-+g[M>>2];g[N>>2]=((L<0.0?0.0:L)+(O<0.0?0.0:O))*.5;n=n+1|0}}else{n=h;while(1){if((n|0)>=(i|0)){n=h;break a}N=I+(n<<2)|0;O=+g[a+(n<<2)>>2]-+g[N>>2];g[N>>2]=O<0.0?0.0:O;n=n+1|0}}while(0);while(1){if((n|0)>=(i|0))break;N=I+(n<<2)|0;L=+g[N>>2];O=+g[x+(n<<2)>>2];g[N>>2]=L>O?L:O;n=n+1|0}D=(q|0)==0;b:do if((D|(r|0)!=0)&(p|0)==0){n=h;while(1){if((n|0)>=(i|0)){n=h;break b}N=I+(n<<2)|0;g[N>>2]=+g[N>>2]*.5;n=n+1|0}}else n=h;while(0);while(1){if((n|0)>=(i|0))break;if((n|0)>=8){if((n|0)>11){z=.5;J=34}}else{z=2.0;J=34}if((J|0)==34){J=0;N=I+(n<<2)|0;g[N>>2]=+g[N>>2]*z}n=n+1|0}c:do if(c[y>>2]|0){n=h;while(1){if((n|0)>=(((i|0)<19?i:19)|0))break c;N=I+(n<<2)|0;g[N>>2]=+g[N>>2]+ +(d[y+36+n>>0]|0)*.015625;n=n+1|0}}while(0);C=(u<<1|0)/3|0;B=(r|0)==0;n=0;while(1){if((h|0)>=(i|0)){J=50;break}w=I+(h<<2)|0;z=+g[w>>2];z=z<4.0?z:4.0;g[w>>2]=z;w=h+1|0;o=(R((b[s+(w<<1)>>1]|0)-(b[s+(h<<1)>>1]|0)|0,k)|0)<<t;do if((o|0)>=6)if((o|0)>48){A=~~(z*8.0);o=((R(A,o)|0)<<3|0)/8|0;break}else{A=~~(z*+(o|0)/6.0);o=A*48|0;break}else{A=~~z;o=(R(A,o)|0)<<3}while(0);if(!((B|(p|0)!=0)&(D^1))?(n+o>>6|0)>(C|0):0)break;c[m+(h<<2)>>2]=A;n=n+o|0;h=w}if((J|0)==50){c[v>>2]=n;l=K;return +H}N=C<<6;c[m+(h<<2)>>2]=N-n;c[v>>2]=N;l=K;return +H}function nb(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;l=a+32|0;h=1.0000000036274937e-15;i=1.0000000036274937e-15;a=0;a:while(1){if((a|0)==13)break;m=c[l>>2]|0;j=a+1|0;k=b[m+(j<<1)>>1]<<e;a=b[m+(a<<1)>>1]<<e;while(1){if((a|0)>=(k|0)){a=j;continue a}o=+g[d+(a<<2)>>2];n=+g[d+(a+f<<2)>>2];a=a+1|0;h=h+(+E(+(o+n))+ +E(+(o-n)));i=i+(+E(+o)+ +E(+n))}}m=b[(c[l>>2]|0)+26>>1]<<e+1;return +(m+((e|0)<2?5:13)|0)*(h*.7071070075035095)>+(m|0)*i|0}function ob(a,d,e,f,h,i,j,k,l,m,n,o,p){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=+m;n=n|0;o=+o;p=p|0;var q=0.0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0.0;if((p|0)>=64e3)if((p|0)<8e4)s=+(p+-64e3>>10|0)*.0625+4.0;else s=5.0;else s=4.0;if((i|0)==2){r=a+32|0;q=0.0;p=0;while(1){if((p|0)==8)break;w=c[r>>2]|0;v=b[w+(p<<1)>>1]|0;x=v<<h;u=p+1|0;q=q+ +rb(d+(x<<2)|0,d+(x+j<<2)|0,(b[w+(u<<1)>>1]|0)-v<<h);p=u}t=+E(+(q*.125));t=t>1.0?1.0:t;q=t;p=8;while(1){if((p|0)>=(n|0))break;v=c[r>>2]|0;w=b[v+(p<<1)>>1]|0;u=w<<h;x=p+1|0;y=+E(+(+rb(d+(u<<2)|0,d+(u+j<<2)|0,(b[v+(x<<1)>>1]|0)-w<<h)));q=q<y?q:y;p=x}q=+E(+q);q=q>1.0?1.0:q;y=+P(+(1.0010000467300415-t*t))*1.4426950408889634;z=y*.5;t=+P(+(1.0010000467300415-q*q))*1.4426950408889634;y=y*.75;q=+g[l>>2]+.25;t=-((z>t?z:t)*.5);g[l>>2]=q<t?q:t;s=s+(y<-4.0?-4.0:y)}n=f+-1|0;d=a+8|0;r=0;q=0.0;do{p=0;while(1){if((p|0)>=(n|0))break;q=q+ +g[e+(p+(R(r,c[d>>2]|0)|0)<<2)>>2]*+((p<<1)+2-f|0);p=p+1|0}r=r+1|0}while((r|0)<(i|0));q=(q/+(R(n,i)|0)+1.0)/6.0;w=q>2.0;x=q<-2.0&(w^1);q=s-(x|w?(x?-2.0:2.0):q)-o-m*2.0;if(c[k>>2]|0){z=(+g[k+8>>2]+.05000000074505806)*2.0;w=z>2.0;x=z<-2.0&(w^1);q=q-(x|w?(x?-2.0:2.0):z)}p=~~+D(+(q+.5));if((p|0)<=10){if((p|0)<0){x=0;return x|0}}else p=10;x=p;return x|0}function pb(a,d,e,f,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=+n;o=o|0;p=+p;q=q|0;r=+r;s=s|0;t=t|0;u=+u;v=+v;var w=0.0,x=0,y=0,z=0,A=0;x=(j|0)==0?a:j;j=b[d+(x<<1)>>1]<<h;y=(k|0)==2;if(y)A=j+(b[d+(((x|0)>(l|0)?l:x)<<1)>>1]<<h)|0;else A=j;z=(c[e>>2]|0)==0;if(!z?(w=+g[e+16>>2],w<.4):0)j=f-~~(+(A<<3|0)*(.4000000059604645-w))|0;else j=f;if(y){l=(x|0)>(l|0)?l:x;l=(b[d+(l<<1)>>1]<<h)-l|0;w=+(l|0)*.800000011920929/+(A|0)*+(j|0);n=((n<1.0?n:1.0)+-.10000000149011612)*+(l<<3|0);j=j-~~(w<n?w:n)|0}j=j+(o-(19<<h))|0;j=j+~~((p+-.04399999976158142)*+(j|0))|0;if((s|0)==0&(z^1)){n=+g[e+4>>2]+-.15000000596046448;w=+(A<<3|0);j=j+~~(w*1.2000000476837158*(n<0.0?-.11999999731779099:n+-.11999999731779099))|0;if(q)j=j+~~(w*.800000011920929)|0}x=(t|0)==0;if((s|0)==0&(x^1)){t=j+~~(+(A<<3|0)*u)|0;j=(j|0)/4|0;j=(j|0)>(t|0)?j:t}h=~~(+((R(b[d+(a+-2<<1)>>1]<<h,k)|0)<<3|0)*r);k=j>>2;k=(h|0)>(k|0)?h:k;j=(j|0)<(k|0)?j:k;if((s|0)==0&(x^1)){i=j;f=f<<1;m=(f|0)<(i|0);i=m?f:i;return i|0}if(m)j=~~(+(j-f|0)*.6700000166893005)+f|0;if(!(x&p<.20000000298023224)){i=j;f=f<<1;m=(f|0)<(i|0);i=m?f:i;return i|0}m=96e3-i|0;s=(m|0)>32e3;i=(i|0)>96e3&(s^1);i=j+~~((i|s?(i?0.0:.09919999539852142):+(m|0)*3.099999958067201e-06)*v*+(j|0))|0;f=f<<1;m=(f|0)<(i|0);i=m?f:i;return i|0}function qb(a){a=a|0;return a|0}function rb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;d=d+ +g[a+(e<<2)>>2]*+g[b+(e<<2)>>2];e=e+1|0}return +d}function sb(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0;e=+g[a+8>>2];c=+g[a>>2];h=+g[a+4>>2];i=c>h;f=i?c:h;c=i?h:c;h=+g[a+12>>2];b=+g[a+16>>2];a=h>b;d=a?b:h;b=a?h:b;a=c>d;d=a?c:d;c=a?b:f;b=a?f:b;if(e>c)if(c<d){if(e<d){h=e;return +h}h=d;return +h}else{if(b<c){h=b;return +h}h=c;return +h}else if(e<d){if(c<d){h=c;return +h}h=d;return +h}else{if(e<b){h=e;return +h}h=b;return +h}return 0.0}function tb(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0;b=+g[a>>2];d=+g[a+4>>2];e=b>d;c=e?d:b;d=e?b:d;b=+g[a+8>>2];if(d<b)return +d;if(c<b){d=b;return +d}d=c;return +d}function ub(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0.0,f=0;e=0.0;f=0;while(1){if((f|0)>=(b|0))break;e=e+ +E(+(+g[a+(f<<2)>>2]));f=f+1|0}return +(e+ +(c|0)*d*e)}function vb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=wb(b,a)|0;f=(b|0)>(d|0);a=d+1|0;Sb(e,g,(c[(c[1740+(((b|0)<(d|0)?b:d)<<2)>>2]|0)+((f?b:d)<<2)>>2]|0)+(c[(c[1740+((f?a:b)<<2)>>2]|0)+(((a|0)<(b|0)?b:a)<<2)>>2]|0)|0);return}function wb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=a+-1|0;d=c[b+(g<<2)>>2]|0;f=(d|0)>-1?d:0-d|0;d=d>>>31;do{h=g;g=g+-1|0;e=a-g|0;d=d+(c[(c[1740+(((e|0)<(f|0)?e:f)<<2)>>2]|0)+(((e|0)>(f|0)?e:f)<<2)>>2]|0)|0;i=c[b+(g<<2)>>2]|0;f=f+((i|0)>-1?i:0-i|0)|0;if((i|0)<0){i=f+1|0;d=d+(c[(c[1740+(((e|0)>(f|0)?i:e)<<2)>>2]|0)+(((e|0)>(i|0)?e:i)<<2)>>2]|0)|0}}while((h|0)>1);return d|0}function xb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=(b|0)>(d|0);f=d+1|0;return +(+yb(b,d,Gb(e,(c[(c[1740+(((b|0)<(d|0)?b:d)<<2)>>2]|0)+((g?b:d)<<2)>>2]|0)+(c[(c[1740+((g?f:b)<<2)>>2]|0)+(((f|0)<(b|0)?b:f)<<2)>>2]|0)|0)|0,a))}function yb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,i=0,j=0,k=0.0;h=0.0;j=e;while(1){if((a|0)<=2)break;do if((b|0)<(a|0)){e=c[(c[1740+(b<<2)>>2]|0)+(a<<2)>>2]|0;f=c[(c[1740+(b+1<<2)>>2]|0)+(a<<2)>>2]|0;if(d>>>0>=e>>>0&d>>>0<f>>>0){c[j>>2]=0;e=d-e|0;break}g=d>>>0>=f>>>0;d=d-(g?f:0)|0;f=b;do{f=f+-1|0;e=c[(c[1740+(f<<2)>>2]|0)+(a<<2)>>2]|0}while(d>>>0<e>>>0);i=g<<31>>31;b=b-f+i^i;c[j>>2]=b<<16>>16;k=+((b&65535)<<16>>16);h=h+k*k;e=d-e|0;b=f}else{f=c[1740+(a<<2)>>2]|0;i=c[f+(b+1<<2)>>2]|0;e=d>>>0>=i>>>0;g=e<<31>>31;i=d-(e?i:0)|0;a:do if((c[f+(a<<2)>>2]|0)>>>0>i>>>0){d=a;do{d=d+-1|0;e=c[(c[1740+(d<<2)>>2]|0)+(a<<2)>>2]|0}while(e>>>0>i>>>0)}else{d=b;while(1){e=c[f+(d<<2)>>2]|0;if(e>>>0<=i>>>0)break a;d=d+-1|0}}while(0);b=b-d+g^g;c[j>>2]=b<<16>>16;k=+((b&65535)<<16>>16);h=h+k*k;e=i-e|0;b=d}while(0);a=a+-1|0;d=e;j=j+4|0}a=b<<1|1;i=d>>>0>=a>>>0;e=i<<31>>31;a=d-(i?a:0)|0;d=(a+1|0)>>>1;if(!d){f=a;g=b-d|0;g=g+e|0;e=g^e;g=e&65535;e=e<<16;e=e>>16;i=j+4|0;c[j>>2]=e;k=+(g<<16>>16);k=k*k;h=h+k;g=0-f|0;j=d-f|0;g=j^g;j=g&65535;g=g<<16;g=g>>16;c[i>>2]=g;k=+(j<<16>>16);k=k*k;k=h+k;return +k}f=a-((d<<1)+-1)|0;g=b-d|0;g=g+e|0;e=g^e;g=e&65535;e=e<<16;e=e>>16;i=j+4|0;c[j>>2]=e;k=+(g<<16>>16);k=k*k;h=h+k;g=0-f|0;j=d-f|0;g=j^g;j=g&65535;g=g<<16;g=g>>16;c[i>>2]=g;k=+(j<<16>>16);k=k*k;k=h+k;return +k}function zb(a,b){a=a|0;b=b|0;var d=0,e=0;e=32-(U(b|0)|0)|0;d=b>>>(e+-16|0);b=(d>>>12)+-8|0;return (a<<3)-((e<<3)+(b+(d>>>0>(c[6888+(b<<2)>>2]|0)>>>0&1)))|0}function Ab(a){a=a|0;var b=0,e=0;b=a+24|0;e=c[b>>2]|0;if(e>>>0>=(c[a+4>>2]|0)>>>0){e=0;return e|0}a=c[a>>2]|0;c[b>>2]=e+1;e=d[a+e>>0]|0;return e|0}function Bb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+28|0;d=a+20|0;e=a+40|0;f=a+32|0;while(1){g=c[b>>2]|0;if(g>>>0>=8388609)break;c[d>>2]=(c[d>>2]|0)+8;c[b>>2]=g<<8;h=c[e>>2]|0;g=Ab(a)|0;c[e>>2]=g;c[f>>2]=((h<<8|g)>>>1&255|c[f>>2]<<8&2147483392)^255}return}function Cb(a,b){a=a|0;b=b|0;var d=0;d=Db(c[a+28>>2]|0,b)|0;c[a+36>>2]=d;a=(((c[a+32>>2]|0)>>>0)/(d>>>0)|0)+1|0;return b-(a>>>0>b>>>0?b:a)|0}function Db(a,b){a=a|0;b=b|0;return (a>>>0)/(b>>>0)|0|0}function Eb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[a+36>>2]|0;e=R(f,e-d|0)|0;g=a+32|0;c[g>>2]=(c[g>>2]|0)-e;if(!b){f=a+28|0;g=f;f=(c[f>>2]|0)-e|0;c[g>>2]=f;Bb(a);return}else{g=a+28|0;f=R(f,d-b|0)|0;c[g>>2]=f;Bb(a);return}}function Fb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=a+28|0;d=c[h>>2]|0;e=a+32|0;f=c[e>>2]|0;b=d>>>b;g=f>>>0<b>>>0;if(!g){c[e>>2]=f-b;b=d-b|0}c[h>>2]=b;Bb(a);return g&1|0}function Gb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=b+-1|0;d=32-(U(e|0)|0)|0;if((d|0)<=8){e=Cb(a,b)|0;Eb(a,e,e+1|0,b);return e|0}b=d+-8|0;f=(e>>>b)+1|0;d=Cb(a,f)|0;Eb(a,d,d+1|0,f);b=d<<b|(Hb(a,b)|0);if(b>>>0<=e>>>0){f=b;return f|0}c[a+44>>2]=1;f=e;return f|0}function Hb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=a+12|0;d=c[g>>2]|0;h=a+16|0;e=c[h>>2]|0;if(e>>>0<b>>>0){f=e+8|0;f=e+(((f|0)>25?f:25)+-1-e&-8)|0;do{d=d|(Ib(a)|0)<<e;e=e+8|0}while((e|0)<25);e=f+8|0}c[g>>2]=d>>>b;c[h>>2]=e-b;h=a+20|0;c[h>>2]=(c[h>>2]|0)+b;return d&(1<<b)+-1|0}function Ib(a){a=a|0;var b=0,e=0,f=0;b=a+8|0;e=c[b>>2]|0;f=c[a+4>>2]|0;if(e>>>0>=f>>>0){f=0;return f|0}a=c[a>>2]|0;e=e+1|0;c[b>>2]=e;f=d[a+(f-e)>>0]|0;return f|0}function Jb(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=33;c[a+24>>2]=0;c[a+28>>2]=-2147483648;c[a+40>>2]=-1;c[a+32>>2]=0;c[a+36>>2]=0;c[a+4>>2]=d;c[a+44>>2]=0;return}function Kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=a+28|0;g=c[f>>2]|0;h=Lb(g,e)|0;if(!b){h=g-(R(h,e-d|0)|0)|0;c[f>>2]=h;Mb(a);return}else{e=g-(R(h,e-b|0)|0)|0;g=a+32|0;c[g>>2]=(c[g>>2]|0)+e;h=R(h,d-b|0)|0;c[f>>2]=h;Mb(a);return}}function Lb(a,b){a=a|0;b=b|0;return (a>>>0)/(b>>>0)|0|0}function Mb(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+28|0;d=a+32|0;e=a+20|0;f=c[b>>2]|0;while(1){if(f>>>0>=8388609)break;Nb(a,(c[d>>2]|0)>>>23);c[d>>2]=c[d>>2]<<8&2147483392;f=c[b>>2]<<8;c[b>>2]=f;c[e>>2]=(c[e>>2]|0)+8}return}function Nb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((b|0)==255){g=a+36|0;c[g>>2]=(c[g>>2]|0)+1;return}e=b>>8;g=a+40|0;d=c[g>>2]|0;if((d|0)>-1){d=Ob(a,d+e|0)|0;f=a+44|0;c[f>>2]=c[f>>2]|d}f=a+36|0;if(c[f>>2]|0){d=e+255&255;e=a+44|0;do{h=Ob(a,d)|0;c[e>>2]=c[e>>2]|h;h=(c[f>>2]|0)+-1|0;c[f>>2]=h}while((h|0)!=0)}c[g>>2]=b&255;return}function Ob(b,d){b=b|0;d=d|0;var e=0,f=0;e=b+24|0;f=c[e>>2]|0;if((f+(c[b+8>>2]|0)|0)>>>0>=(c[b+4>>2]|0)>>>0){f=-1;return f|0}b=c[b>>2]|0;c[e>>2]=f+1;a[b+f>>0]=d;f=0;return f|0}function Pb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=a+28|0;f=c[e>>2]|0;g=f>>>15;if(!b){g=f-(R(g,32768-d|0)|0)|0;c[e>>2]=g;Mb(a);return}else{h=f-(R(g,32768-b|0)|0)|0;f=a+32|0;c[f>>2]=(c[f>>2]|0)+h;g=R(g,d-b|0)|0;c[e>>2]=g;Mb(a);return}}function Qb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=a+28|0;e=c[f>>2]|0;d=e>>>d;e=e-d|0;if(!b)d=e;else{b=a+32|0;c[b>>2]=(c[b>>2]|0)+e}c[f>>2]=d;Mb(a);return}function Rb(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=a+28|0;h=c[g>>2]|0;f=h>>>f;if((b|0)>0){i=e+(b+-1)|0;j=h-(R(f,d[i>>0]|0)|0)|0;h=a+32|0;c[h>>2]=(c[h>>2]|0)+j;h=R(f,(d[i>>0]|0)-(d[e+b>>0]|0)|0)|0;c[g>>2]=h;Mb(a);return}else{j=h-(R(f,d[e+b>>0]|0)|0)|0;c[g>>2]=j;Mb(a);return}}function Sb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=c+-1|0;e=32-(U(d|0)|0)|0;if((e|0)>8){e=e+-8|0;c=b>>>e;Kb(a,c,c+1|0,(d>>>e)+1|0);Tb(a,(1<<e)+-1&b,e);return}else{Kb(a,b,b+1|0,c);return}}function Tb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;j=a+12|0;e=c[j>>2]|0;k=a+16|0;f=c[k>>2]|0;if((f+d|0)>>>0>32){i=a+44|0;h=7-f|0;h=f+((h|0)>-8?h:-8)&-8;g=f;do{l=Ub(a,e&255)|0;c[i>>2]=c[i>>2]|l;e=e>>>8;g=g+-8|0}while((g|0)>7);f=f+-8-h|0}c[j>>2]=e|b<<f;c[k>>2]=f+d;l=a+20|0;c[l>>2]=(c[l>>2]|0)+d;return}function Ub(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=b+8|0;f=c[e>>2]|0;g=c[b+4>>2]|0;if(((c[b+24>>2]|0)+f|0)>>>0>=g>>>0){g=-1;return g|0}b=c[b>>2]|0;f=f+1|0;c[e>>2]=f;a[b+(g-f)>>0]=d;g=0;return g|0}function Vb(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=8-f|0;j=(1<<f)+-1<<i;if(c[b+24>>2]|0){f=c[b>>2]|0;a[f>>0]=(d[f>>0]|0)&(j^255)|e<<i;return}g=b+40|0;h=c[g>>2]|0;if((h|0)>-1){c[g>>2]=h&~j|e<<i;return}if((c[b+28>>2]|0)>>>0>-2147483648>>>f>>>0){c[b+44>>2]=-1;return}else{f=b+32|0;c[f>>2]=c[f>>2]&~(j<<23)|e<<i+23;return}}function Wb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[a>>2]|0;d=c[a+8>>2]|0;e=0-d|0;a=a+4|0;Wh(f+b+e|0,f+(c[a>>2]|0)+e|0,d|0)|0;c[a>>2]=b;return}function Xb(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=c[b+28>>2]|0;f=U(m|0)|0;g=2147483647>>>f;h=c[b+32>>2]|0;e=h+g&~g;if((e|g)>>>0>=(h+m|0)>>>0){e=g>>>1;f=f+1|0;e=h+e&~e}m=~f;m=f+((m|0)>-1?m:-1)+8&-8;g=f;while(1){if((g|0)<=0)break;Nb(b,e>>>23);g=g+-8|0;e=e<<8&2147483392}if(!((c[b+40>>2]|0)<=-1?!(c[b+36>>2]|0):0))Nb(b,0);h=c[b+16>>2]|0;l=b+44|0;i=~h;i=h+((i|0)>-8?i:-8)+8&-8;e=c[b+12>>2]|0;g=h;while(1){if((g|0)<=7)break;k=Ub(b,e&255)|0;c[l>>2]=c[l>>2]|k;e=e>>>8;g=g+-8|0}i=h-i|0;if(c[l>>2]|0)return;j=b+24|0;k=c[j>>2]|0;h=b+4|0;g=b+8|0;Qh((c[b>>2]|0)+k|0,0,(c[h>>2]|0)-k-(c[g>>2]|0)|0)|0;if((i|0)<=0)return;k=c[g>>2]|0;g=c[h>>2]|0;if(g>>>0<=k>>>0){c[l>>2]=-1;return}f=m-f|0;if((i|0)>(f|0)?((c[j>>2]|0)+k|0)>>>0>=g>>>0:0){c[l>>2]=-1;e=e&(1<<f)+-1}b=(c[b>>2]|0)+(g-k+-1)|0;a[b>>0]=d[b>>0]|0|e;return}function Yb(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+32|0;k=m;j=c[a+8>>2]|0;j=(j|0)>0?j:0;c[k>>2]=1;f=0;e=1;while(1){g=f<<1;i=b[a+12+((g|1)<<1)>>1]|0;e=R(e,b[a+12+(g<<1)>>1]|0)|0;g=f+1|0;c[k+(g<<2)>>2]=e;if(i<<16>>16==1)break;else f=g}i=a+48|0;g=b[a+12+((g<<1)+-1<<1)>>1]|0;while(1){if((f|0)<=-1)break;h=f<<1;if(!f)e=1;else e=b[a+12+(h+-1<<1)>>1]|0;switch(b[a+12+(h<<1)>>1]|0){case 2:{Zb(d,c[k+(f<<2)>>2]|0);break}case 4:{h=c[k+(f<<2)>>2]|0;_b(d,h<<j,a,g,h,e);break}case 3:{h=c[k+(f<<2)>>2]|0;$b(d,h<<j,a,g,h,e);break}case 5:{h=c[k+(f<<2)>>2]|0;ac(d,h<<j,c[i>>2]|0,g,h,e);break}default:{}}f=f+-1|0;g=e}l=m;return}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,h=0,i=0.0,j=0.0,k=0;c=0;while(1){if((c|0)>=(b|0))break;h=a+32|0;f=+g[h>>2];d=a+36|0;i=+g[d>>2];j=+g[a>>2];g[h>>2]=j-f;h=a+4|0;e=+g[h>>2];g[d>>2]=e-i;g[a>>2]=j+f;g[h>>2]=e+i;h=a+40|0;i=+g[h>>2];d=a+44|0;e=+g[d>>2];f=(i+e)*.7071067690849304;i=(e-i)*.7071067690849304;k=a+8|0;e=+g[k>>2];g[h>>2]=e-f;h=a+12|0;j=+g[h>>2];g[d>>2]=j-i;g[k>>2]=e+f;g[h>>2]=j+i;h=a+52|0;i=+g[h>>2];k=a+48|0;j=+g[k>>2];d=a+16|0;f=+g[d>>2];g[k>>2]=f-i;k=a+20|0;e=+g[k>>2];g[h>>2]=e+j;g[d>>2]=f+i;g[k>>2]=e-j;k=a+60|0;j=+g[k>>2];d=a+56|0;e=+g[d>>2];i=(j-e)*.7071067690849304;e=(j+e)*-.7071067690849304;h=a+24|0;j=+g[h>>2];g[d>>2]=j-i;d=a+28|0;f=+g[d>>2];g[k>>2]=f-e;g[h>>2]=j+i;g[d>>2]=f+e;a=a+64|0;c=c+1|0}return}function _b(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;if((e|0)==1){d=0;while(1){if((d|0)>=(f|0))break;s=+g[a>>2];o=a+16|0;B=+g[o>>2];v=s-B;b=a+4|0;x=+g[b>>2];p=a+20|0;z=+g[p>>2];t=x-z;B=s+B;z=x+z;e=a+8|0;x=+g[e>>2];r=a+24|0;s=+g[r>>2];A=x+s;q=a+12|0;w=+g[q>>2];h=a+28|0;u=+g[h>>2];y=w+u;g[o>>2]=B-A;g[p>>2]=z-y;g[a>>2]=B+A;g[b>>2]=z+y;s=x-s;u=w-u;g[e>>2]=v+u;g[q>>2]=t-s;g[r>>2]=v-u;g[h>>2]=t+s;a=a+32|0;d=d+1|0}return}q=e<<1;r=e*3|0;n=d+48|0;o=b<<1;p=b*3|0;m=0;while(1){if((m|0)>=(f|0))break;l=a+((R(m,h)|0)<<3)|0;j=c[n>>2]|0;d=j;i=j;k=0;while(1){if((k|0)>=(e|0))break;F=l+(e<<3)|0;w=+g[F>>2];t=+g[j>>2];E=l+(e<<3)+4|0;x=+g[E>>2];v=+g[j+4>>2];s=w*t-x*v;t=w*v+x*t;I=l+(q<<3)|0;x=+g[I>>2];v=+g[i>>2];H=l+(q<<3)+4|0;w=+g[H>>2];z=+g[i+4>>2];u=x*v-w*z;v=x*z+w*v;D=l+(r<<3)|0;w=+g[D>>2];z=+g[d>>2];C=l+(r<<3)+4|0;x=+g[C>>2];y=+g[d+4>>2];B=w*z-x*y;z=w*y+x*z;x=+g[l>>2];y=x-u;G=l+4|0;w=+g[G>>2];A=w-v;u=x+u;g[l>>2]=u;v=w+v;g[G>>2]=v;w=s+B;x=t+z;B=s-B;z=t-z;g[I>>2]=u-w;g[H>>2]=v-x;g[l>>2]=+g[l>>2]+w;g[G>>2]=+g[G>>2]+x;g[F>>2]=y+z;g[E>>2]=A-B;g[D>>2]=y-z;g[C>>2]=A+B;d=d+(p<<3)|0;i=i+(o<<3)|0;j=j+(b<<3)|0;k=k+1|0;l=l+8|0}m=m+1|0}return}function $b(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;p=e<<1;o=d+48|0;m=+g[(c[o>>2]|0)+((R(b,e)|0)<<3)+4>>2];n=b<<1;l=0;while(1){if((l|0)>=(f|0))break;d=a+((R(l,h)|0)<<3)|0;j=c[o>>2]|0;i=j;k=e;while(1){s=d+(e<<3)|0;y=+g[s>>2];z=+g[j>>2];q=d+(e<<3)+4|0;B=+g[q>>2];t=+g[j+4>>2];A=y*z-B*t;z=y*t+B*z;v=d+(p<<3)|0;B=+g[v>>2];t=+g[i>>2];u=d+(p<<3)+4|0;y=+g[u>>2];x=+g[i+4>>2];r=B*t-y*x;t=B*x+y*t;y=A+r;x=z+t;g[s>>2]=+g[d>>2]-y*.5;w=d+4|0;g[q>>2]=+g[w>>2]-x*.5;r=(A-r)*m;t=(z-t)*m;g[d>>2]=+g[d>>2]+y;g[w>>2]=+g[w>>2]+x;g[v>>2]=+g[s>>2]+t;g[u>>2]=+g[q>>2]-r;g[s>>2]=+g[s>>2]-t;g[q>>2]=+g[q>>2]+r;k=k+-1|0;if(!k)break;else{d=d+8|0;i=i+(n<<3)|0;j=j+(b<<3)|0}}l=l+1|0}return}function ac(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0;q=R(b,d)|0;t=+g[c+(q<<3)>>2];u=+g[c+(q<<3)+4>>2];q=R(b<<1,d)|0;o=+g[c+(q<<3)>>2];p=+g[c+(q<<3)+4>>2];q=d<<1;r=d*3|0;s=d<<2;i=0;while(1){if((i|0)>=(e|0))break;n=a+((R(i,f)|0)<<3)|0;h=0;j=n+(s<<3)|0;k=n+(r<<3)|0;l=n+(q<<3)|0;m=n;n=n+(d<<3)|0;while(1){if((h|0)>=(d|0))break;G=+g[m>>2];N=m+4|0;E=+g[N>>2];F=+g[n>>2];O=R(h,b)|0;z=+g[c+(O<<3)>>2];M=n+4|0;K=+g[M>>2];L=+g[c+(O<<3)+4>>2];x=F*z-K*L;z=F*L+K*z;K=+g[l>>2];O=R(h<<1,b)|0;L=+g[c+(O<<3)>>2];A=l+4|0;F=+g[A>>2];C=+g[c+(O<<3)+4>>2];J=K*L-F*C;L=K*C+F*L;F=+g[k>>2];O=R(h*3|0,b)|0;C=+g[c+(O<<3)>>2];v=k+4|0;K=+g[v>>2];y=+g[c+(O<<3)+4>>2];w=F*C-K*y;C=F*y+K*C;K=+g[j>>2];O=R(h<<2,b)|0;y=+g[c+(O<<3)>>2];H=j+4|0;F=+g[H>>2];D=+g[c+(O<<3)+4>>2];B=K*y-F*D;y=K*D+F*y;F=x+B;D=z+y;B=x-B;y=z-y;z=J+w;x=L+C;w=J-w;C=L-C;g[m>>2]=G+(F+z);g[N>>2]=E+(D+x);L=G+(F*t+z*o);J=E+(D*t+x*o);K=y*u+C*p;I=B*u+w*p;g[n>>2]=L-K;g[M>>2]=J+I;g[j>>2]=L+K;g[H>>2]=J-I;z=G+(F*o+z*t);x=E+(D*o+x*t);y=C*u-y*p;w=B*p-w*u;g[l>>2]=z+y;g[A>>2]=x+w;g[k>>2]=z-y;g[v>>2]=x-w;h=h+1|0;j=j+8|0;k=k+8|0;l=l+8|0;m=m+8|0;n=n+8|0}i=i+1|0}return}function bc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0.0;h=+g[a+4>>2];i=a+44|0;f=0;while(1){if((f|0)>=(c[a>>2]|0))break;j=+g[d+(f<<3)+4>>2];g[e+(b[(c[i>>2]|0)+(f<<1)>>1]<<3)>>2]=h*+g[d+(f<<3)>>2];g[e+(b[(c[i>>2]|0)+(f<<1)>>1]<<3)+4>>2]=h*j;f=f+1|0}Yb(a,e);return}function cc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=c[b>>2]|0;if(!f){j=d;b=0;j=b+j|0;Pb(a,b,j);return}j=f>>31;i=f+j^j;g=1;h=dc(d,e)|0;while(1){if(!h){f=6;break}if((i|0)<=(g|0)){f=7;break}f=h<<1;g=g+1|0;h=(R(f,e)|0)>>>15;d=d+(f+2)|0}if((f|0)==6){i=i-g|0;e=(32768-d-j>>1)+-1|0;e=(i|0)<(e|0)?i:e;i=d+((e<<1|1)+j)|0;c[b>>2]=g+e+j^j;j=(i|0)!=32768&1;b=i;j=b+j|0;Pb(a,b,j);return}else if((f|0)==7){b=h+1|0;i=b;b=d+(b&~j)|0;j=b+i|0;Pb(a,b,j);return}}function dc(a,b){a=a|0;b=b|0;return (R(32736-a|0,16384-b|0)|0)>>>15|0}function ec(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;d=32-(U(a|0)|0)+-1>>1;b=1<<d;c=0;while(1){e=(c<<1)+b<<d;f=a>>>0<e>>>0;c=c+(f?0:b)|0;if((d|0)<=0)break;else{a=a-(f?0:e)|0;b=b>>>1;d=d+-1|0}}return c|0}function fc(a,d,e,f,h,i,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0;x=l;t=c[a+8+(i<<2)>>2]|0;s=+g[t+4>>2];k=0;m=c[a>>2]|0;w=c[a+24>>2]|0;while(1){u=m>>1;if((k|0)>=(i|0))break;k=k+1|0;m=u;w=w+(u<<2)|0}v=m>>2;k=l;l=l+((1*(u<<2)|0)+15&-16)|0;a=l;l=l+((1*(v<<3)|0)+15&-16)|0;m=h>>1;p=f+(m<<2)|0;q=h+3>>2;r=0-u|0;i=d+(m<<2)|0;o=p+-4|0;n=k;d=d+(u<<2)+-4+(m<<2)|0;m=0;while(1){if((m|0)>=(q|0))break;y=+g[o>>2];z=+g[p>>2];g[n>>2]=y*+g[i+(u<<2)>>2]+z*+g[d>>2];g[n+4>>2]=z*+g[i>>2]-y*+g[d+(r<<2)>>2];i=i+8|0;o=o+-8|0;p=p+8|0;n=n+8|0;d=d+-8|0;m=m+1|0}p=f+(h<<2)|0;o=v-q|0;while(1){if((m|0)>=(o|0))break;c[n>>2]=c[d>>2];c[n+4>>2]=c[i>>2];d=d+-8|0;i=i+8|0;n=n+8|0;m=m+1|0}p=p+-4|0;o=f;while(1){if((m|0)>=(v|0))break;g[n>>2]=+g[p>>2]*+g[d>>2]-+g[o>>2]*+g[i+(r<<2)>>2];g[n+4>>2]=+g[p>>2]*+g[i>>2]+ +g[o>>2]*+g[d+(u<<2)>>2];p=p+-8|0;o=o+8|0;n=n+8|0;d=d+-8|0;i=i+8|0;m=m+1|0}i=t+44|0;m=0;while(1){if((m|0)>=(v|0))break;A=+g[w+(m<<2)>>2];z=+g[w+(v+m<<2)>>2];y=+g[k>>2];B=+g[k+4>>2];r=b[(c[i>>2]|0)+(m<<1)>>1]|0;g[a+(r<<3)>>2]=s*(y*A-B*z);g[a+(r<<3)+4>>2]=s*(B*A+y*z);k=k+8|0;m=m+1|0}Yb(t,a);i=j<<1;d=0-i|0;m=e+((R(u+-1|0,j)|0)<<2)|0;k=0;while(1){if((k|0)>=(v|0))break;A=+g[a+4>>2];z=+g[w+(v+k<<2)>>2];y=+g[a>>2];B=+g[w+(k<<2)>>2];g[e>>2]=A*z-y*B;g[m>>2]=y*z+A*B;m=m+(d<<2)|0;e=e+(i<<2)|0;a=a+8|0;k=k+1|0}l=x;return}function gc(){return 6920}function hc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0;o=l;l=l+80|0;i=o+56|0;k=o+40|0;m=o+20|0;n=o;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;j=d>>1;d=1;while(1){h=c[a>>2]|0;if((d|0)>=(j|0))break;p=d<<1;g[b+(d<<2)>>2]=((+g[h+(p+-1<<2)>>2]+ +g[h+((p|1)<<2)>>2])*.5+ +g[h+(p<<2)>>2])*.5;d=d+1|0}g[b>>2]=(+g[h+4>>2]*.5+ +g[h>>2])*.5;if((e|0)==2){h=a+4|0;d=1;while(1){a=c[h>>2]|0;if((d|0)>=(j|0))break;e=d<<1;p=b+(d<<2)|0;g[p>>2]=+g[p>>2]+((+g[a+(e+-1<<2)>>2]+ +g[a+((e|1)<<2)>>2])*.5+ +g[a+(e<<2)>>2])*.5;d=d+1|0}g[b>>2]=+g[b>>2]+(+g[a+4>>2]*.5+ +g[a>>2])*.5}tc(b,i,j);g[i>>2]=+g[i>>2]*1.000100016593933;d=1;while(1){if((d|0)==5)break;p=i+(d<<2)|0;q=+g[p>>2];f=+(d|0)*.00800000037997961;g[p>>2]=q-q*f*f;d=d+1|0}sc(k,i);f=1.0;d=0;while(1){if((d|0)==4)break;q=f*.8999999761581421;p=k+(d<<2)|0;g[p>>2]=+g[p>>2]*q;f=q;d=d+1|0}f=+g[k>>2];g[n>>2]=f+.800000011920929;q=+g[k+4>>2];g[n+4>>2]=q+f*.800000011920929;f=+g[k+8>>2];g[n+8>>2]=f+q*.800000011920929;q=+g[k+12>>2];g[n+12>>2]=q+f*.800000011920929;g[n+16>>2]=q*.800000011920929;ic(b,n,b,j,m);l=o;return}function ic(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;r=+g[b>>2];s=+g[b+4>>2];t=+g[b+8>>2];q=+g[b+12>>2];l=+g[b+16>>2];m=e+4|0;n=e+8|0;o=e+12|0;p=e+16|0;f=+g[p>>2];h=+g[o>>2];i=+g[n>>2];j=+g[m>>2];k=+g[e>>2];b=0;while(1){if((b|0)>=(d|0))break;y=+g[a+(b<<2)>>2];g[c+(b<<2)>>2]=y+r*k+s*j+t*i+q*h+l*f;x=k;w=j;v=i;u=h;k=y;b=b+1|0;j=x;i=w;h=v;f=u}g[e>>2]=k;g[m>>2]=j;g[n>>2]=i;g[o>>2]=h;g[p>>2]=f;return}function jc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;j=p;k=f+-3|0;m=j+4|0;n=j+8|0;o=j+12|0;h=((k|0)>0?k:0)+3&-4;i=0;while(1){if((i|0)>=(k|0))break;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;kc(a,b+(i<<2)|0,j,e);c[d+(i<<2)>>2]=c[j>>2];c[d+((i|1)<<2)>>2]=c[m>>2];c[d+((i|2)<<2)>>2]=c[n>>2];c[d+((i|3)<<2)>>2]=c[o>>2];i=i+4|0}while(1){if((h|0)>=(f|0))break;g[d+(h<<2)>>2]=+lc(a,b+(h<<2)|0,e);h=h+1|0}l=p;return}function kc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,h=0.0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;l=d+-3|0;p=c+4|0;q=c+8|0;r=c+12|0;e=((l|0)>0?l:0)+3|0;m=e&-4;e=b+((e|3)<<2)|0;i=a;j=b+12|0;n=+g[b+4>>2];h=0.0;o=+g[b+8>>2];k=0;f=+g[b>>2];while(1){if((k|0)>=(l|0))break;w=+g[i>>2];h=+g[j>>2];z=+g[c>>2]+w*f;g[c>>2]=z;y=+g[p>>2]+w*n;g[p>>2]=y;x=+g[q>>2]+w*o;g[q>>2]=x;w=+g[r>>2]+w*h;g[r>>2]=w;v=+g[i+4>>2];s=+g[j+4>>2];z=z+v*n;g[c>>2]=z;y=y+v*o;g[p>>2]=y;x=x+v*h;g[q>>2]=x;v=w+v*s;g[r>>2]=v;w=+g[i+8>>2];u=+g[j+8>>2];z=z+w*o;g[c>>2]=z;y=y+w*h;g[p>>2]=y;x=x+w*s;g[q>>2]=x;w=v+w*u;g[r>>2]=w;v=+g[i+12>>2];t=+g[j+12>>2];g[c>>2]=z+v*h;g[p>>2]=y+v*s;g[q>>2]=x+v*u;g[r>>2]=w+v*t;i=i+16|0;j=j+16|0;n=u;o=t;k=k+4|0;f=s}b=a+(m<<2)|0;i=m|1;if((m|0)<(d|0)){z=+g[b>>2];h=+g[e>>2];g[c>>2]=+g[c>>2]+z*f;g[p>>2]=+g[p>>2]+z*n;g[q>>2]=+g[q>>2]+z*o;g[r>>2]=+g[r>>2]+z*h;b=b+4|0;e=e+4|0}if((i|0)<(d|0)){z=+g[b>>2];f=+g[e>>2];g[c>>2]=+g[c>>2]+z*n;g[p>>2]=+g[p>>2]+z*o;g[q>>2]=+g[q>>2]+z*h;g[r>>2]=+g[r>>2]+z*f;b=b+4|0;e=e+4|0}if((i+1|0)>=(d|0))return;y=+g[b>>2];z=+g[e>>2];g[c>>2]=+g[c>>2]+y*o;g[p>>2]=+g[p>>2]+y*h;g[q>>2]=+g[q>>2]+y*f;g[r>>2]=+g[r>>2]+y*z;return}function lc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;d=d+ +g[a+(e<<2)>>2]*+g[b+(e<<2)>>2];e=e+1|0}return +d}function mc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+1968|0;p=r;k=p;c[k>>2]=0;c[k+4>>2]=0;k=d>>2;m=l;l=l+((1*(k<<2)|0)+15&-16)|0;n=d+979>>2;o=l;l=l+((1*(n<<2)|0)+15&-16)|0;q=r+8|0;h=0;while(1){if((h|0)>=(k|0))break;c[m+(h<<2)>>2]=c[a+(h<<1<<2)>>2];h=h+1|0}h=0;while(1){if((h|0)>=(n|0))break;c[o+(h<<2)>>2]=c[b+(h<<1<<2)>>2];h=h+1|0}jc(m,o,q,k,244);nc(q,o,k,244,p);n=c[p>>2]<<1;o=c[p+4>>2]<<1;k=d>>1;h=0;while(1){if((h|0)==489)break;m=q+(h<<2)|0;g[m>>2]=0.0;d=h-n|0;if(!((((d|0)>-1?d:0-d|0)|0)>2?(d=h-o|0,(((d|0)>-1?d:0-d|0)|0)>2):0)){j=+lc(a,b+(h<<2)|0,k);g[m>>2]=j<-1.0?-1.0:j}h=h+1|0}nc(q,b,k,489,p);h=c[p>>2]|0;if((h+-1|0)>>>0>=487){q=0;p=h<<1;q=p-q|0;c[e>>2]=q;l=r;return}i=+g[q+(h+-1<<2)>>2];j=+g[q+(h<<2)>>2];f=+g[q+(h+1<<2)>>2];if(f-i>(j-i)*.699999988079071){q=1;p=h<<1;q=p-q|0;c[e>>2]=q;l=r;return}if(i-f>(j-f)*.699999988079071){q=-1;p=h<<1;q=p-q|0;c[e>>2]=q;l=r;return}q=0;p=h<<1;q=p-q|0;c[e>>2]=q;l=r;return}function nc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0;c[f>>2]=0;s=f+4|0;c[s>>2]=1;i=1.0;h=0;while(1){if((h|0)>=(d|0)){q=0;p=0.0;n=-1.0;k=0.0;m=-1.0;h=0;l=-1.0;o=0.0;break}p=+g[b+(h<<2)>>2];i=i+p*p;h=h+1|0}while(1){if((q|0)>=(e|0))break;j=+g[a+(q<<2)>>2];do if(j>0.0?(r=j*9.999999960041972e-13,r=r*r,r*p>n*i):0)if(r*k>m*i){c[s>>2]=h;c[f>>2]=q;h=q;n=l;l=r;m=r;j=o;o=i;k=i;break}else{c[s>>2]=q;n=r;j=i;break}else j=p;while(0);t=+g[b+(q+d<<2)>>2];p=+g[b+(q<<2)>>2];p=i+(t*t-p*p);q=q+1|0;i=p<1.0?1.0:p;p=j}return}function oc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=l;l=l+2080|0;B=F+2072|0;z=F+2068|0;C=F+2064|0;E=F+2052|0;u=c[d>>2]|0;x=(e|0)/2|0;D=(b|0)/2|0;A=a+2048|0;u=(u|0)>1023?511:(u|0)/2|0;c[d>>2]=u;w=F;pc(A,A,A+(0-u<<2)|0,D,z,B);e=c[z>>2]|0;c[w>>2]=e;v=(c[j>>2]=e,+g[j>>2]);h=v;e=1;while(1){if((e|0)==513)break;t=+g[A+(0-e<<2)>>2];y=+g[A+(D-e<<2)>>2];y=h+t*t-y*y;g[w+(e<<2)>>2]=y<0.0?0.0:y;h=y;e=e+1|0}p=+g[w+(u<<2)>>2];h=+g[B>>2];y=+qc(h,v,p);q=u<<1;r=y*.699999988079071;s=y*.8500000238418579;t=f*.5;a=2;z=u;while(1){if((a|0)>=16)break;e=a<<1;b=rc(q+a|0,e)|0;if((b|0)<7)break;if((a|0)==2){e=b+u|0;e=(e|0)>512?u:e}else e=rc((R(c[18772+(a<<2)>>2]<<1,u)|0)+a|0,e)|0;pc(A,A+(0-b<<2)|0,A+(0-e<<2)|0,D,B,C);o=(+g[B>>2]+ +g[C>>2])*.5;g[B>>2]=o;n=(+g[w+(b<<2)>>2]+ +g[w+(e<<2)>>2])*.5;k=+qc(o,v,n);e=b-x|0;e=(e|0)>-1?e:0-e|0;if((e|0)>=2)if((e|0)==2){e=(R(a*5|0,a)|0)<(u|0);m=e?t:0.0}else m=0.0;else m=f;i=r-m;i=i<.30000001192092896?.30000001192092896:i;if((b|0)<21){i=s-m;if(i<.4000000059604645)i=.4000000059604645}if(k>i){i=n;h=o;e=b}else{k=y;i=p;e=z}y=k;p=i;a=a+1|0;z=e}h=h<0.0?0.0:h;if(!(p<=h))m=h/(p+1.0);else m=1.0;e=0;while(1){if((e|0)==3)break;g[E+(e<<2)>>2]=+lc(A,A+(1-(z+e)<<2)|0,D);e=e+1|0}i=+g[E+8>>2];k=+g[E>>2];h=+g[E+4>>2];if(i-k>(h-k)*.699999988079071){E=1;D=m>y;f=D?y:m;D=z<<1;E=D+E|0;D=(E|0)>15;E=D?E:15;c[d>>2]=E;l=F;return +f}if(k-i>(h-i)*.699999988079071){E=-1;D=m>y;f=D?y:m;D=z<<1;E=D+E|0;D=(E|0)>15;E=D?E:15;c[d>>2]=E;l=F;return +f}E=0;D=m>y;f=D?y:m;D=z<<1;E=D+E|0;D=(E|0)>15;E=D?E:15;c[d>>2]=E;l=F;return +f}function pc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0,k=0.0;h=0.0;i=0.0;j=0;while(1){if((j|0)>=(d|0))break;k=+g[a+(j<<2)>>2];h=h+k*+g[c+(j<<2)>>2];i=i+k*+g[b+(j<<2)>>2];j=j+1|0}g[e>>2]=i;g[f>>2]=h;return}function qc(a,b,c){a=+a;b=+b;c=+c;return +(a/+F(+(b*c+1.0)))}function rc(a,b){a=a|0;b=b|0;return (a>>>0)/(b>>>0)|0|0}function sc(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0;e=+g[b>>2];c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;if(+g[b>>2]!=0.0)k=0;else return;while(1){if((k|0)<4){f=0.0;d=0}else{d=9;break}while(1){if((k|0)==(d|0))break;f=f+ +g[a+(d<<2)>>2]*+g[b+(k-d<<2)>>2];d=d+1|0}j=k;k=k+1|0;f=(f+ +g[b+(k<<2)>>2])/e;h=-f;g[a+(j<<2)>>2]=h;i=k>>1;j=j+-1|0;d=0;while(1){if((d|0)>=(i|0))break;o=a+(d<<2)|0;m=+g[o>>2];l=a+(j-d<<2)|0;n=+g[l>>2];g[o>>2]=m+n*h;g[l>>2]=n+m*h;d=d+1|0}e=e-f*f*e;if(e<+g[b>>2]*1.0000000474974513e-03){d=9;break}}if((d|0)==9)return}function tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0,h=0;h=c+-4|0;jc(a,a,b,h,5);d=0;while(1){if((d|0)==5)break;e=0.0;f=d+h|0;while(1){if((f|0)>=(c|0))break;e=e+ +g[a+(f<<2)>>2]*+g[a+(f-d<<2)>>2];f=f+1|0}f=b+(d<<2)|0;g[f>>2]=+g[f>>2]+e;d=d+1|0}return}function uc(a,b,d,e,f,h,i,j,k,m,n,o,p,q,r,s,t){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;var u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+96|0;M=Q+72|0;N=Q+48|0;O=Q+24|0;P=Q;if(!p)if((r|0)==0?(u=d-b|0,+g[q>>2]>+(R(m<<1,u)|0)):0)w=(R(u,m)|0)<(o|0);else w=0;else w=1;K=~~(+(i>>>0)*+g[q>>2]*+(s|0)/+(m<<9|0));L=a+8|0;s=c[L>>2]|0;J=+vc(f,h,b,e,s,m);I=k+20|0;u=c[I>>2]|0;H=k+28|0;p=c[H>>2]|0;G=wc(u,p)|0;e=(G+3|0)>>>0>i>>>0;F=w&(e^1)&1;if(!((d-b|0)>10?(v=+(o|0)*.125,!(v>16.0)):0))v=16.0;v=(t|0)==0?v:3.0;c[M>>2]=c[k>>2];c[M+4>>2]=c[k+4>>2];c[M+8>>2]=c[k+8>>2];c[M+12>>2]=c[k+12>>2];c[M+16>>2]=c[k+16>>2];c[M+20>>2]=c[k+20>>2];E=k+24|0;B=c[E>>2]|0;c[N>>2]=c[H>>2];c[N+4>>2]=c[H+4>>2];c[N+8>>2]=c[H+8>>2];c[N+12>>2]=c[H+12>>2];c[N+16>>2]=c[H+16>>2];A=R(s,m)|0;C=l;l=l+((1*(A<<2)|0)+15&-16)|0;D=l;l=l+((1*(A<<2)|0)+15&-16)|0;Sh(C|0,h|0,A<<2|0)|0;A=e|(r|0)==0;if(A)if(e|w^1){z=0;y=B}else{xc(a,b,d,f,C,i,G,29803+(n*84|0)+42|0,D,k,m,n,1,v,t)|0;x=17}else{p=xc(a,b,d,f,C,i,G,29803+(n*84|0)+42|0,D,k,m,n,1,v,t)|0;if(e|w^1){z=p;u=c[I>>2]|0;p=c[H>>2]|0;y=c[E>>2]|0}else x=17}if((x|0)==17){Sh(h|0,C|0,(R(c[L>>2]|0,m)|0)<<2|0)|0;Sh(j|0,D|0,(R(c[L>>2]|0,m)|0)<<2|0)|0;g[q>>2]=J;l=Q;return}e=zb(u,p)|0;u=c[k>>2]|0;s=k+4|0;c[O>>2]=c[s>>2];c[O+4>>2]=c[s+4>>2];c[O+8>>2]=c[s+8>>2];c[O+12>>2]=c[s+12>>2];c[O+16>>2]=c[s+16>>2];c[P>>2]=c[H>>2];c[P+4>>2]=c[H+4>>2];c[P+8>>2]=c[H+8>>2];c[P+12>>2]=c[H+12>>2];c[P+16>>2]=c[H+16>>2];r=yc(B)|0;o=u+r|0;r=(yc(y)|0)-r|0;w=fa()|0;x=l;l=l+((1*((r|0)==0?1:r)|0)+15&-16)|0;Sh(x|0,o|0,r|0)|0;c[k>>2]=c[M>>2];c[k+4>>2]=c[M+4>>2];c[k+8>>2]=c[M+8>>2];c[k+12>>2]=c[M+12>>2];c[k+16>>2]=c[M+16>>2];c[k+20>>2]=c[M+20>>2];c[E>>2]=B;c[H>>2]=c[N>>2];c[H+4>>2]=c[N+4>>2];c[H+8>>2]=c[N+8>>2];c[H+12>>2]=c[N+12>>2];c[H+16>>2]=c[N+16>>2];p=xc(a,b,d,f,h,i,G,29803+(n*84|0)+(F*42|0)|0,j,k,m,n,0,v,t)|0;do if(!A){if((z|0)>=(p|0)){if((z|0)!=(p|0))break;if(((zb(c[I>>2]|0,c[H>>2]|0)|0)+K|0)<=(e|0))break}c[k>>2]=u;c[s>>2]=c[O>>2];c[s+4>>2]=c[O+4>>2];c[s+8>>2]=c[O+8>>2];c[s+12>>2]=c[O+12>>2];c[s+16>>2]=c[O+16>>2];c[E>>2]=y;c[H>>2]=c[P>>2];c[H+4>>2]=c[P+4>>2];c[H+8>>2]=c[P+8>>2];c[H+12>>2]=c[P+12>>2];c[H+16>>2]=c[P+16>>2];Sh(o|0,x|0,r|0)|0;Sh(h|0,C|0,(R(c[L>>2]|0,m)|0)<<2|0)|0;Sh(j|0,D|0,(R(c[L>>2]|0,m)|0)<<2|0)|0;ha(w|0);g[q>>2]=J;l=Q;return}while(0);ha(w|0);v=+g[18936+(n<<2)>>2];J=v*v*+g[q>>2]+J;g[q>>2]=J;l=Q;return}function vc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0,k=0,l=0.0,m=0;h=0.0;j=0;do{k=R(j,e)|0;i=c;while(1){if((i|0)>=(d|0))break;m=i+k|0;l=+g[a+(m<<2)>>2]-+g[b+(m<<2)>>2];i=i+1|0;h=h+l*l}j=j+1|0}while((j|0)<(f|0));return +(h>200.0?200.0:h)}function wc(a,b){a=a|0;b=b|0;return (U(b|0)|0)+-32+a|0}function xc(a,b,e,f,h,i,j,k,m,n,o,p,q,r,s){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=+r;s=s|0;var t=0.0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0;P=l;l=l+16|0;N=P;O=P+8|0;K=N;c[K>>2]=0;c[K+4>>2]=0;if((j+3|0)<=(i|0))Qb(n,q,3);if(!q){M=+g[18952+(p<<2)>>2];L=+g[18936+(p<<2)>>2]}else{M=.149993896484375;L=0.0}J=a+8|0;H=n+20|0;I=n+28|0;K=o*3|0;C=(s|0)==0;q=0;B=b;while(1){if((B|0)>=(e|0))break;E=R(K,e-B|0)|0;F=(B|0)!=(b|0);G=(B|0)<20;A=0;do{x=B+(R(A,c[J>>2]|0)|0)|0;t=+g[f+(x<<2)>>2];u=+g[h+(x<<2)>>2];w=L*(u<-9.0?-9.0:u);x=N+(A<<2)|0;y=+g[x>>2];z=t-w-y;j=~~+D(+(z+.5));u=(u<-28.0?-28.0:u)-r;if((j|0)<0&t<u){v=j+~~(u-t)|0;v=(v|0)<0?v:0}else v=j;c[O>>2]=v;a=wc(c[H>>2]|0,c[I>>2]|0)|0;s=i-a|0;p=s-E|0;if((p|0)<24&F){j=(v|0)<1?v:1;c[O>>2]=j;if((p|0)<16){j=(j|0)>-1?j:-1;c[O>>2]=j}}else j=v;if(!(C|(B|0)<2)){j=(j|0)<0?j:0;c[O>>2]=j}do if((s|0)<=14){if((s|0)>1){j=(j|0)<-1?-1:(j|0)<1?j:1;c[O>>2]=j;Rb(n,j<<1^j>>31,30139,2);break}if((a|0)<(i|0)){j=(j|0)<0?j:0;c[O>>2]=j;Qb(n,0-j|0,1);break}else{c[O>>2]=-1;j=-1;break}}else{j=(G?B:20)<<1;cc(n,O,(d[k+j>>0]|0)<<7,(d[k+(j|1)>>0]|0)<<6);j=c[O>>2]|0}while(0);u=+(j|0);g[m+(B+(R(A,c[J>>2]|0)|0)<<2)>>2]=z-u;v=v-j|0;q=q+((v|0)>-1?v:0-v|0)|0;g[h+(B+(R(A,c[J>>2]|0)|0)<<2)>>2]=w+y+u;g[x>>2]=y+u-M*u;A=A+1|0}while((A|0)<(o|0));B=B+1|0}l=P;return (C?q:0)|0}function yc(a){a=a|0;return a|0}function zc(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,l=0.0,m=0,n=0,o=0,p=0,q=0.0;o=a+8|0;while(1){if((b|0)>=(d|0))break;n=h+(b<<2)|0;a=c[n>>2]|0;if((a|0)>=1){k=65536<<a>>16;l=+(k|0);m=k+-1|0;a=0;do{p=~~+D(+((+g[f+(b+(R(a,c[o>>2]|0)|0)<<2)>>2]+.5)*l));p=(p|0)<(k|0)?p:m;p=(p|0)>0?p:0;Tb(i,p,c[n>>2]|0);q=(+(p|0)+.5)*+(1<<14-(c[n>>2]|0)|0)*.00006103515625+-.5;p=e+(b+(R(a,c[o>>2]|0)|0)<<2)|0;g[p>>2]=+g[p>>2]+q;p=f+(b+(R(a,c[o>>2]|0)|0)<<2)|0;g[p>>2]=+g[p>>2]-q;a=a+1|0}while((a|0)<(j|0))}b=b+1|0}return}function Ac(a,b,d,e,f,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0.0;p=a+8|0;o=0;a=j;while(1){if((o|0)==2)break;else n=b;while(1){if(!((n|0)<(d|0)&(a|0)>=(l|0)))break;m=h+(n<<2)|0;if((c[m>>2]|0)<=7?(c[i+(n<<2)>>2]|0)==(o|0):0){j=0;do{q=!(+g[f+(n+(R(j,c[p>>2]|0)|0)<<2)>>2]<0.0);Tb(k,q&1,1);r=(+(q&1)+-.5)*+(1<<14-(c[m>>2]|0)+-1|0)*.00006103515625;q=e+(n+(R(j,c[p>>2]|0)|0)<<2)|0;g[q>>2]=+g[q>>2]+r;q=f+(n+(R(j,c[p>>2]|0)|0)<<2)|0;g[q>>2]=+g[q>>2]-r;a=a+-1|0;j=j+1|0}while((j|0)<(l|0))}n=n+1|0}o=o+1|0}return}function Bc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0.0;j=a+8|0;i=0;do{a=0;while(1){if((a|0)>=(b|0)){a=b;break}k=a+(R(i,c[j>>2]|0)|0)|0;l=+P(+(+g[e+(k<<2)>>2]))*1.4426950408889634;g[f+(k<<2)>>2]=l-+g[18836+(a<<2)>>2];a=a+1|0}while(1){if((a|0)>=(d|0))break;g[f+((R(i,c[j>>2]|0)|0)+a<<2)>>2]=-14.0;a=a+1|0}i=i+1|0}while((i|0)<(h|0));return}function Cc(a,e,f,g,h,i,j,k,m,n,o,p,q,r,s,t,u,v){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;var w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;m=(m|0)>0?m:0;F=c[a+8>>2]|0;P=(m|0)>7?8:0;m=m-P|0;if((r|0)==2?(w=d[30142+(f-e)>>0]|0,(m|0)>=(w|0)):0){m=m-w|0;J=(m|0)>7?8:0;m=m-J|0}else{w=0;J=0}K=l;l=l+((1*(F<<2)|0)+15&-16)|0;L=l;l=l+((1*(F<<2)|0)+15&-16)|0;M=l;l=l+((1*(F<<2)|0)+15&-16)|0;N=l;l=l+((1*(F<<2)|0)+15&-16)|0;D=r<<3;O=a+32|0;x=i+-5-s|0;y=s+3|0;i=e;while(1){if((i|0)>=(f|0))break;H=c[O>>2]|0;I=i+1|0;H=(b[H+(I<<1)>>1]|0)-(b[H+(i<<1)>>1]|0)|0;G=H*3<<s<<3>>4;c[M+(i<<2)>>2]=(D|0)>(G|0)?D:G;G=(R(R(R(H,r)|0,x)|0,f-i+-1|0)|0)<<y>>6;c[N+(i<<2)>>2]=G-((H<<s|0)==1?D:0);i=I}H=c[a+48>>2]|0;I=a+52|0;z=H+-1|0;G=1;do{B=G+z>>1;C=R(B,F)|0;x=0;A=0;i=f;a:while(1){y=x;b:while(1){do{x=i;i=i+-1|0;if((x|0)<=(e|0))break a;E=c[O>>2]|0;x=R((b[E+(x<<1)>>1]|0)-(b[E+(i<<1)>>1]|0)|0,r)|0;x=(R(x,d[(c[I>>2]|0)+(C+i)>>0]|0)|0)<<s>>2;if((x|0)>0){x=x+(c[N+(i<<2)>>2]|0)|0;x=(x|0)>0?x:0}x=x+(c[g+(i<<2)>>2]|0)|0;if((x|0)>=(c[M+(i<<2)>>2]|0)|A)break b}while((x|0)<(D|0));y=y+D|0}A=c[h+(i<<2)>>2]|0;x=y+((x|0)<(A|0)?x:A)|0;A=1}E=(y|0)>(m|0);G=E?G:B+1|0;z=E?B+-1|0:z}while((G|0)<=(z|0));E=R(G+-1|0,F)|0;B=R(G,F)|0;C=(G|0)>1;z=e;A=e;while(1){if((A|0)>=(f|0))break;i=c[O>>2]|0;D=A+1|0;i=R((b[i+(D<<1)>>1]|0)-(b[i+(A<<1)>>1]|0)|0,r)|0;y=c[I>>2]|0;x=(R(i,d[y+(E+A)>>0]|0)|0)<<s>>2;if((G|0)<(H|0))i=(R(i,d[y+(B+A)>>0]|0)|0)<<s>>2;else i=c[h+(A<<2)>>2]|0;if((x|0)>0){x=x+(c[N+(A<<2)>>2]|0)|0;x=(x|0)>0?x:0}if((i|0)>0){i=i+(c[N+(A<<2)>>2]|0)|0;i=(i|0)>0?i:0}F=c[g+(A<<2)>>2]|0;y=x+(C?F:0)|0;x=i+F|0;c[K+(A<<2)>>2]=y;c[L+(A<<2)>>2]=(x|0)<(y|0)?0:x-y|0;z=(F|0)>0?A:z;A=D}n=Dc(a,e,f,z,K,L,M,h,m,n,P,j,w,k,J,o,p,q,r,s,t,1,u,v)|0;l=Q;return n|0}function Dc(a,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;A=A|0;var B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;O=v<<3;K=(v|0)>1;P=K&1;E=0;F=64;I=0;while(1){if((E|0)==6)break;H=I+F>>1;B=f;C=0;G=0;a:while(1){b:while(1){do{N=B;B=B+-1|0;if((N|0)<=(e|0))break a;D=(c[h+(B<<2)>>2]|0)+((R(H,c[i+(B<<2)>>2]|0)|0)>>6)|0;if((D|0)>=(c[j+(B<<2)>>2]|0)|G)break b}while((D|0)<(O|0));C=C+O|0}G=c[k+(B<<2)>>2]|0;C=C+((D|0)<(G|0)?D:G)|0;G=1}N=(C|0)>(l|0);E=E+1|0;F=N?H:F;I=N?I:H}N=w<<3;B=f;C=0;E=0;while(1){D=B+-1|0;if((B|0)<=(e|0))break;B=(c[h+(D<<2)>>2]|0)+((R(I,c[i+(D<<2)>>2]|0)|0)>>6)|0;H=(B|0)<(c[j+(D<<2)>>2]|0);L=(C|0)==0;B=H&L?((B|0)<(O|0)?0:O):B;M=c[k+(D<<2)>>2]|0;M=(B|0)<(M|0)?B:M;c[s+(D<<2)>>2]=M;B=D;C=(H&L^1)&1;E=E+M|0}M=a+32|0;h=O+8|0;i=(y|0)==0;I=e+2|0;L=f;H=p;D=E;while(1){F=L+-1|0;if((F|0)<=(g|0)){J=17;break}y=l-D|0;C=c[M>>2]|0;G=b[C+(L<<1)>>1]|0;E=b[C+(e<<1)>>1]|0;B=G-E|0;p=Ec(y,B)|0;B=y-(R(B,p)|0)|0;C=b[C+(F<<1)>>1]|0;E=B+(E-C)|0;C=G-C|0;G=s+(F<<2)|0;B=c[G>>2]|0;E=B+(R(p,C)|0)+((E|0)>0?E:0)|0;p=c[j+(F<<2)>>2]|0;if((E|0)>=(((p|0)>(h|0)?p:h)|0)){if(i){if(Fb(x,1)|0)break}else{if((L|0)<=(I|0)){J=22;break}if(!((F|0)>(A|0)?1:(E|0)<=((R((L|0)>17?((L|0)<=(z|0)?7:9):0,C)|0)<<w<<3>>4|0))){J=22;break}Qb(x,0,1)}E=E+-8|0;D=D+8|0;B=c[G>>2]|0}if((H|0)>0)C=d[30142+(F-e)>>0]|0;else C=H;L=(E|0)<(O|0);D=D-(B+H)+C+(L?0:O)|0;c[G>>2]=L?0:O;L=F;H=C}if((J|0)==17)l=l+n|0;else if((J|0)==22)Qb(x,1,1);do if((H|0)>0)if(i){B=(Gb(x,L+1-e|0)|0)+e|0;c[o>>2]=B;break}else{B=c[o>>2]|0;B=(B|0)<(L|0)?B:L;c[o>>2]=B;Sb(x,B-e|0,L+1-e|0);B=c[o>>2]|0;break}else{c[o>>2]=0;B=0}while(0);do if((B|0)>(e|0))if((r|0)>0)if(i){c[q>>2]=Fb(x,1)|0;break}else{Qb(x,c[q>>2]|0,1);break}else J=40;else{l=l+r|0;J=40}while(0);if((J|0)==40)c[q>>2]=0;B=l-D|0;D=c[M>>2]|0;D=(b[D+(L<<1)>>1]|0)-(b[D+(e<<1)>>1]|0)|0;C=Ec(B,D)|0;D=R(D,C)|0;l=e;while(1){if((l|0)>=(L|0))break;r=c[M>>2]|0;J=l+1|0;r=R(C,(b[r+(J<<1)>>1]|0)-(b[r+(l<<1)>>1]|0)|0)|0;x=s+(l<<2)|0;c[x>>2]=(c[x>>2]|0)+r;l=J}l=B-D|0;B=e;while(1){if((B|0)>=(L|0))break;x=c[M>>2]|0;J=B+1|0;x=(b[x+(J<<1)>>1]|0)-(b[x+(B<<1)>>1]|0)|0;x=(l|0)<(x|0)?l:x;r=s+(B<<2)|0;c[r>>2]=(c[r>>2]|0)+x;l=l-x|0;B=J}p=(v|0)==2;y=a+56|0;i=K?4:3;h=0;while(1){if((e|0)>=(L|0))break;E=c[M>>2]|0;I=e+1|0;E=(b[E+(I<<1)>>1]|0)-(b[E+(e<<1)>>1]|0)<<w;H=s+(e<<2)|0;B=(c[H>>2]|0)+h|0;if((E|0)>1){l=c[k+(e<<2)>>2]|0;l=(B|0)>(l|0)?B-l|0:0;F=B-l|0;c[H>>2]=F;B=R(E,v)|0;if(p&(E|0)!=2?(c[q>>2]|0)==0:0)C=(e|0)<(c[o>>2]|0);else C=0;G=B+(C&1)|0;D=R(G,(b[(c[y>>2]|0)+(e<<1)>>1]|0)+N|0)|0;B=(D>>1)+(R(G,-21)|0)|0;if((E|0)==2)B=B+(G<<3>>2)|0;C=F+B|0;if((C|0)>=(G<<4|0))if((C|0)<(G*24|0))E=B+(D>>3)|0;else E=B;else E=B+(D>>2)|0;B=F+E+(G<<2)|0;B=(Ec((B|0)>0?B:0,G)|0)>>>3;D=t+(e<<2)|0;c[D>>2]=B;K=R(B,v)|0;C=c[H>>2]|0;if((K|0)>(C>>3|0)){B=C>>P>>3;c[D>>2]=B}K=(B|0)<8?B:8;c[D>>2]=K;K=R(K,G<<3)|0;c[u+(e<<2)>>2]=(K|0)>=((c[H>>2]|0)+E|0)&1;K=(R(c[D>>2]|0,v)|0)<<3;c[H>>2]=(c[H>>2]|0)-K}else{l=(B|0)<(O|0)?0:B-O|0;c[H>>2]=B-l;c[t+(e<<2)>>2]=0;c[u+(e<<2)>>2]=1}if(!l){h=l;e=I;continue}x=l>>>i;a=t+(e<<2)|0;J=c[a>>2]|0;K=8-J|0;K=(x|0)<(K|0)?x:K;c[a>>2]=J+K;K=(R(K,v)|0)<<3;c[u+(e<<2)>>2]=(K|0)>=(l-h|0)&1;h=l-K|0;e=I}c[m>>2]=h;while(1){if((e|0)>=(f|0))break;k=s+(e<<2)|0;m=t+(e<<2)|0;c[m>>2]=c[k>>2]>>P>>3;c[k>>2]=0;c[u+(e<<2)>>2]=(c[m>>2]|0)<1&1;e=e+1|0}return L|0}function Ec(a,b){a=a|0;b=b|0;return (a>>>0)/(b>>>0)|0|0}function Fc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0.0,j=0.0,k=0,l=0.0,m=0.0;if((f<<1|0)>=(b|0)|(g|0)==0)return;m=+(b|0)/+((R(c[18968+(g+-1<<2)>>2]|0,f)|0)+b|0);m=m*m*.5;l=+H(+(m*1.5707963705062866));m=+H(+((1.0-m)*1.5707963705062866));a:do if((e<<3|0)>(b|0))f=0;else{g=e>>2;f=1;while(1){if(((R((R(f,f)|0)+f|0,e)|0)+g|0)>=(b|0))break a;f=f+1|0}}while(0);k=Gc(b,e)|0;d=(d|0)<0;h=(f|0)==0;i=-m;j=-l;g=0;while(1){if((g|0)>=(e|0))break;b=a+((R(g,k)|0)<<2)|0;if(!d){Hc(b,k,1,l,i);if(!h)Hc(b,k,f,m,j)}else{if(!h)Hc(b,k,f,m,l);Hc(b,k,1,l,m)}g=g+1|0}return}function Gc(a,b){a=a|0;b=b|0;return (a>>>0)/(b>>>0)|0|0}function Hc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0;j=-e;i=b-c|0;f=a;h=0;while(1){if((h|0)>=(i|0))break;l=+g[f>>2];m=f+(c<<2)|0;k=+g[m>>2];g[m>>2]=k*d+l*e;g[f>>2]=l*d+k*j;f=f+4|0;h=h+1|0}h=b-(c<<1)|0;f=a+(h+-1<<2)|0;while(1){if((h|0)<=0)break;k=+g[f>>2];m=f+(c<<2)|0;l=+g[m>>2];g[m>>2]=l*d+k*e;g[f>>2]=k*d+l*j;f=f+-4|0;h=h+-1|0}return}function Ic(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0;t=l;r=l;l=l+((1*(e<<2)|0)+15&-16)|0;s=l;l=l+((1*(e<<2)|0)+15&-16)|0;f=0;do{q=a+(f<<2)|0;o=+g[q>>2];c[s+(f<<2)>>2]=o<0.0&1;g[q>>2]=+E(+o);c[b+(f<<2)>>2]=0;g[r+(f<<2)>>2]=0.0;f=f+1|0}while((f|0)<(e|0));if((e>>1|0)<(d|0)){h=0.0;f=0;do{h=h+ +g[a+(f<<2)>>2];f=f+1|0}while((f|0)<(e|0));if(!(h>1.0000000036274937e-15&h<64.0)){g[a>>2]=1.0;f=1;do{g[a+(f<<2)>>2]=0.0;f=f+1|0}while((f|0)<(e|0));h=1.0}j=(+(d|0)+.800000011920929)*(1.0/h);i=0.0;h=0.0;f=d;d=0;do{p=a+(d<<2)|0;q=~~+D(+(j*+g[p>>2]));c[b+(d<<2)>>2]=q;o=+(q|0);h=h+o*o;i=i+ +g[p>>2]*o;g[r+(d<<2)>>2]=o*2.0;f=f-q|0;d=d+1|0}while((d|0)<(e|0))}else{i=0.0;h=0.0;f=d}if((f|0)>(e+3|0)){o=+(f|0);h=h+o*o+o*+g[r>>2];c[b>>2]=(c[b>>2]|0)+f;f=0}q=0;while(1){if((q|0)>=(f|0)){f=0;break}m=h+1.0;j=i+ +g[a>>2];h=m+ +g[r>>2];j=j*j;d=0;k=1;while(1){o=i+ +g[a+(k<<2)>>2];n=m+ +g[r+(k<<2)>>2];o=o*o;p=h*o>n*j;d=p?k:d;k=k+1|0;if((k|0)>=(e|0))break;else{h=p?n:h;j=p?o:j}}o=+g[a+(d<<2)>>2];p=r+(d<<2)|0;h=+g[p>>2];g[p>>2]=h+2.0;p=b+(d<<2)|0;c[p>>2]=(c[p>>2]|0)+1;q=q+1|0;i=i+o;h=m+h}do{r=b+(f<<2)|0;a=c[s+(f<<2)>>2]|0;c[r>>2]=(c[r>>2]^0-a)+a;f=f+1|0}while((f|0)<(e|0));l=t;return +h}function Jc(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;var i=0.0,j=0,k=0;k=l;j=l;l=l+((1*(b+3<<2)|0)+15&-16)|0;Fc(a,b,1,e,c,d);i=+Ic(a,j,c,b);vb(j,b,c,f);if(!h){j=Lc(j,b,e)|0;l=k;return j|0}Kc(j,a,b,i,g);Fc(a,b,-1,e,c,d);j=Lc(j,b,e)|0;l=k;return j|0}function Kc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=+f;var h=0;e=1.0/+F(+e)*f;h=0;do{g[b+(h<<2)>>2]=e*+(c[a+(h<<2)>>2]|0);h=h+1|0}while((h|0)<(d|0));return}function Lc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if((d|0)<2){d=1;return d|0}i=Gc(b,d)|0;h=0;b=0;do{g=R(h,i)|0;e=0;f=0;do{e=e|c[a+(g+f<<2)>>2];f=f+1|0}while((f|0)<(i|0));b=b|((e|0)!=0&1)<<h;h=h+1|0}while((h|0)!=(d|0));return b|0}function Mc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;var h=0,i=0;h=l;i=l;l=l+((1*(b<<2)|0)+15&-16)|0;Kc(i,a,b,+xb(i,b,c,f),g);Fc(a,b,-1,e,c,d);f=Lc(i,b,e)|0;l=h;return f|0}function Nc(a,b,c){a=a|0;b=b|0;c=+c;var d=0;c=1.0/+F(+(+Oc(a,a,b)+1.0000000036274937e-15))*c;d=0;while(1){if((d|0)>=(b|0))break;g[a>>2]=c*+g[a>>2];a=a+4|0;d=d+1|0}return}function Oc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;d=d+ +g[a+(e<<2)>>2]*+g[b+(e<<2)>>2];e=e+1|0}return +d}function Pc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;a:do if(!c){e=+Oc(a,a,d)+1.0000000036274937e-15;f=+Oc(b,b,d)+1.0000000036274937e-15}else{f=1.0000000036274937e-15;e=1.0000000036274937e-15;c=0;while(1){if((c|0)>=(d|0))break a;j=+g[a+(c<<2)>>2];i=+g[b+(c<<2)>>2];h=j+i;i=j-i;f=f+i*i;e=e+h*h;c=c+1|0}}while(0);return ~~+D(+(+Qc(+F(+f),+F(+e))*10430.3818359375+.5))|0}function Qc(a,b){a=+a;b=+b;var c=0.0,d=0.0;c=b*b;d=a*a;if(c+d<1.000000045813705e-18){d=0.0;return +d}if(c<d){d=-(b*a*(d+c*.43157973885536194))/((d+c*.6784840226173401)*(d+c*.0859554186463356))+(a<0.0?-1.5707963705062866:1.5707963705062866);return +d}else{b=b*a;d=b*(c+d*.43157973885536194)/((c+d*.6784840226173401)*(c+d*.0859554186463356))+(a<0.0?-1.5707963705062866:1.5707963705062866)-(b<0.0?-1.5707963705062866:1.5707963705062866);return +d}return 0.0}function Rc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;a[k+1>>0]=0;j=33599+(((f<<1)+g<<16>>16)*7|0)|0;i=e+8>>4;e=0;while(1){if((e|0)>=(i|0))break;f=c[h+(e<<2)>>2]|0;a:do if((f|0)>0){a[k>>0]=a[j+((f&30)>>>0<6?f&31:6)>>0]|0;f=0;while(1){if((f|0)==16)break a;g=a[d+f>>0]|0;if(g<<24>>24)Rb(b,(g<<24>>24>>15)+1|0,k,8);f=f+1|0}}while(0);d=d+16|0;e=e+1|0}l=m;return}function Sc(a){a=a|0;c[a>>2]=20208;return 0}function Tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;Qh(a|0,0,20208)|0;e=0;f=0;while(1){if((f|0)==2)break;e=e+(be(a+(f*10060|0)|0,b)|0)|0;f=f+1|0}c[a+20184>>2]=1;c[a+20188>>2]=1;return e+(Uc(a,d)|0)|0}function Uc(a,b){a=a|0;b=b|0;var d=0;c[b>>2]=c[a+20184>>2];c[b+4>>2]=c[a+20188>>2];c[b+8>>2]=c[a+4552>>2];c[b+12>>2]=c[a+4560>>2];c[b+16>>2]=c[a+4564>>2];c[b+20>>2]=c[a+4568>>2];c[b+24>>2]=c[a+4608>>2];c[b+28>>2]=c[a+4604>>2];c[b+32>>2]=c[a+4612>>2];c[b+36>>2]=c[a+4620>>2];c[b+40>>2]=c[a+6084>>2];c[b+48>>2]=c[a+6072>>2];c[b+52>>2]=c[a+4672>>2];d=a+4572|0;c[b+72>>2]=(c[d>>2]<<16>>16)*1e3;c[b+76>>2]=c[a+4532>>2];if((c[d>>2]|0)!=16){a=0;a=a&1;d=b+80|0;c[d>>2]=a;return 0}a=(c[a+28>>2]|0)==0;a=a&1;d=b+80|0;c[d>>2]=a;return 0}function Vc(d,f,g,h,i,j,k){d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ga=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;Ka=l;l=l+16|0;Fa=Ka;Ga=Ka+8|0;if(c[f+68>>2]|0){c[d+4660>>2]=1;c[d+14720>>2]=1}c[d+15804>>2]=0;Ca=d+5744|0;c[Ca>>2]=0;m=$d(f)|0;if(m|0){f=m;l=Ka;return f|0}c[f+88>>2]=0;Ja=f+4|0;o=d+20188|0;if((c[Ja>>2]|0)>(c[o>>2]|0)){m=d+10060|0;n=be(m,c[d+5088>>2]|0)|0;c[d+20120>>2]=0;c[d+20128>>2]=0;c[d+20132>>2]=0;c[d+20136>>2]=1;c[d+20140>>2]=0;c[d+20144>>2]=1;b[d+20150>>1]=0;b[d+20148>>1]=16384;if((c[d+20184>>2]|0)==2){Sh(d+15832|0,d+5772|0,300)|0;Aa=d;Ba=c[Aa+4>>2]|0;Ha=m;c[Ha>>2]=c[Aa>>2];c[Ha+4>>2]=Ba}}else n=0;Ha=f+24|0;if((c[Ha>>2]|0)==(c[d+4608>>2]|0))s=(c[o>>2]|0)!=(c[Ja>>2]|0);else s=1;c[d+20184>>2]=c[f>>2];c[o>>2]=c[Ja>>2];m=h*100|0;o=c[f+8>>2]|0;r=(m|0)/(o|0)|0;Aa=(r|0)>1?r>>1:1;Ba=(k|0)==0;a:do if(Ba){if((R(r,o)|0)!=(m|0)|(h|0)<0){f=-101;l=Ka;return f|0}if((h*1e3|0)>(R(c[Ha>>2]|0,o)|0)){f=-101;l=Ka;return f|0}else{p=0;q=0;za=d;break}}else{if((r|0)!=1){f=-101;l=Ka;return f|0}m=0;while(1){k=c[Ja>>2]|0;if((m|0)>=(k|0))break;n=be(d+(m*10060|0)|0,c[d+(m*10060|0)+5088>>2]|0)|0;m=m+1|0}p=c[Ha>>2]|0;c[Ha>>2]=10;o=f+36|0;q=c[o>>2]|0;c[o>>2]=0;o=0;m=k;while(1){if((o|0)>=(m|0)){za=d;break a}c[d+(o*10060|0)+4664>>2]=0;c[d+(o*10060|0)+4676>>2]=1;o=o+1|0;m=c[Ja>>2]|0}}while(0);ya=d+4572|0;xa=d+20200|0;wa=d+5740|0;o=0;while(1){if((o|0)>=(c[Ja>>2]|0))break;if((o|0)==1)m=c[ya>>2]|0;else m=0;m=ce(za+(o*10060|0)|0,f,c[xa>>2]|0,o,m)|0;if(m|0){Ia=145;break}b:do if((c[za+(o*10060|0)+4660>>2]|0)!=0|s){m=0;while(1){if((m|0)>=(c[wa>>2]|0))break b;c[za+(o*10060|0)+4720+(m<<2)>>2]=0;m=m+1|0}}while(0);c[za+(o*10060|0)+6076>>2]=c[za+(o*10060|0)+6072>>2];o=o+1|0;n=0}if((Ia|0)==145){l=Ka;return m|0}B=r*10|0;F=c[ya>>2]|0;C=R(B,F)|0;D=d+4552|0;F=(R(C,c[D>>2]|0)|0)/(F*1e3|0)|0;va=fa()|0;E=l;l=l+((1*(F<<1)|0)+15&-16)|0;F=d+4580|0;G=d+5736|0;ta=d+20192|0;H=d+15832|0;I=d+5772|0;J=d+5092|0;K=d+14640|0;L=d+15796|0;M=d+14632|0;N=d+15152|0;O=d+20154|0;P=d+14780|0;Q=d+20172|0;z=i+20|0;A=i+28|0;S=d+20176|0;T=f+28|0;U=d+20180|0;V=d+20120|0;W=d+5096|0;X=d+15156|0;Y=d+4528|0;ua=f+60|0;Z=d+20204|0;_=d+17224|0;$=d+10204|0;aa=d+10076|0;ba=d+14600|0;ca=d+14532|0;da=d+14597|0;ea=d+14548|0;ga=d+14720|0;ia=d+10060|0;ja=d+14776|0;ka=f+56|0;la=f+52|0;ma=Fa+4|0;na=Aa<<1;oa=Aa+-1|0;pa=d+6076|0;qa=d+20196|0;ra=d+16136|0;sa=d+20124|0;y=0;while(1){k=c[G>>2]|0;r=(c[F>>2]|0)-k|0;r=(r|0)<(C|0)?r:C;s=R(r,c[D>>2]|0)|0;s=(s|0)/((c[ya>>2]|0)*1e3|0)|0;do if((c[f>>2]|0)==2)if((c[Ja>>2]|0)==2){o=c[Ca>>2]|0;m=0;while(1){if((m|0)>=(s|0))break;b[E+(m<<1)>>1]=b[g+(m<<1<<1)>>1]|0;m=m+1|0}if((c[ta>>2]|0)==1&(o|0)==0)Sh(H|0,I|0,300)|0;Ne(I,J+(k+2<<1)|0,E,s);c[G>>2]=(c[G>>2]|0)+r;k=c[L>>2]|0;m=(c[K>>2]|0)-k|0;o=R(B,c[M>>2]|0)|0;o=(m|0)<(o|0)?m:o;m=0;while(1){if((m|0)>=(s|0))break;b[E+(m<<1)>>1]=b[g+((m<<1|1)<<1)>>1]|0;m=m+1|0}Ne(H,N+(k+2<<1)|0,E,s);c[L>>2]=(c[L>>2]|0)+o;m=c[G>>2]|0;break}else{if((c[Ja>>2]|0)==1)m=0;else{Ia=50;break}while(1){if((m|0)>=(s|0))break;x=m<<1;x=(b[g+(x<<1)>>1]|0)+(b[g+((x|1)<<1)>>1]|0)|0;b[E+(m<<1)>>1]=(x>>>1)+(x&1);m=m+1|0}Ne(I,J+(k+2<<1)|0,E,s);c:do if((c[ta>>2]|0)==2?(c[Ca>>2]|0)==0:0){Ne(H,N+((c[L>>2]|0)+2<<1)|0,E,s);m=0;while(1){if((m|0)>=(c[F>>2]|0))break c;x=J+((c[G>>2]|0)+m+2<<1)|0;b[x>>1]=((b[x>>1]|0)+(b[N+((c[L>>2]|0)+m+2<<1)>>1]|0)|0)>>>1;m=m+1|0}}while(0);m=(c[G>>2]|0)+r|0;c[G>>2]=m;break}else Ia=50;while(0);if((Ia|0)==50){Ia=0;Sh(E|0,g|0,s<<1|0)|0;Ne(I,J+(k+2<<1)|0,E,s);m=(c[G>>2]|0)+r|0;c[G>>2]=m}x=g+((R(s,c[f>>2]|0)|0)<<1)|0;w=h-s|0;c[xa>>2]=0;if((m|0)<(c[F>>2]|0)){m=0;break}if(!((c[Ca>>2]|0)!=0|Ba^1)){b[Ga>>1]=0;a[Ga>>0]=256-(256>>>(R((c[wa>>2]|0)+1|0,c[Ja>>2]|0)|0));Rb(i,0,Ga,8);r=0;while(1){m=c[Ja>>2]|0;if((r|0)>=(m|0)){t=0;break}k=c[za+(r*10060|0)+5740>>2]|0;m=0;o=0;while(1){if((o|0)>=(k|0))break;m=m|c[za+(r*10060|0)+4720+(o<<2)>>2]<<o;o=o+1|0}a[za+(r*10060|0)+4719>>0]=(m|0)>0&1;if((m|0)!=0&(k|0)>1)Rb(i,m+-1|0,c[19204+(k+-2<<2)>>2]|0,8);r=r+1|0}while(1){if((t|0)>=(c[wa>>2]|0)){o=0;break}k=O+(t*6|0)|0;r=P+(t<<2)|0;s=Q+t|0;h=(t|0)>0;g=t+-1|0;o=0;while(1){if((o|0)>=(m|0))break;if(c[za+(o*10060|0)+4720+(t<<2)>>2]|0){if((m|0)==2&(o|0)==0?(bf(i,k),(c[r>>2]|0)==0):0)cf(i,a[s>>0]|0);if(h?(c[za+(o*10060|0)+4720+(g<<2)>>2]|0)!=0:0)m=2;else m=0;Xc(za+(o*10060|0)|0,i,t,1,m);Yc(i,a[za+(o*10060|0)+6096+(t*36|0)+29>>0]|0,a[za+(o*10060|0)+6096+(t*36|0)+30>>0]|0,za+(o*10060|0)+6204+(t*320|0)|0,c[za+(o*10060|0)+4580>>2]|0);m=c[Ja>>2]|0}o=o+1|0}t=t+1|0}while(1){if((o|0)>=(m|0))break;m=za+(o*10060|0)+4720|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;o=o+1|0;m=c[Ja>>2]|0}c[S>>2]=Wc(c[z>>2]|0,c[A>>2]|0)|0}Pd(d);r=c[T>>2]|0;k=c[Ha>>2]|0;m=(R(r,k)|0)/1e3|0;if(Ba)m=m-(c[S>>2]|0)|0;o=(m|0)/(c[wa>>2]|0)|0;m=R(o<<16>>16,(k|0)==10?100:50)|0;m=m-(c[U>>2]<<1)|0;if(Ba?(Da=c[Ca>>2]|0,(Da|0)>0):0){v=Wc(c[z>>2]|0,c[A>>2]|0)|0;m=m-(v-(c[S>>2]|0)-(R(o,Da)|0)<<1)|0}if((r|0)>5e3){if((m|0)<=(r|0))r=(m|0)>5e3?m:5e3}else if((m|0)>5e3)r=5e3;else r=(m|0)<(r|0)?r:m;if((c[Ja>>2]|0)==2){m=c[Ca>>2]|0;Xd(V,W,X,O+(m*6|0)|0,Q+m|0,Fa,r,c[Y>>2]|0,c[ua>>2]|0,c[ya>>2]|0,c[F>>2]|0);m=c[Ca>>2]|0;if(!(a[Q+m>>0]|0)){if((c[Z>>2]|0)==1){c[_>>2]=0;c[_+4>>2]=0;c[_+8>>2]=0;v=aa;c[v>>2]=0;c[v+4>>2]=0;Qh($|0,0,4384)|0;c[ba>>2]=100;c[ca>>2]=100;a[_>>0]=10;a[da>>0]=0;c[ea>>2]=65536;c[ga>>2]=1}qf(ia)}else a[ja+m>>0]=0;if(Ba?(bf(i,O+((c[Ca>>2]|0)*6|0)|0),Ea=c[Ca>>2]|0,(a[ja+Ea>>0]|0)==0):0)cf(i,a[Q+Ea>>0]|0)}else{c[J>>2]=c[sa>>2];v=J+(c[F>>2]<<1)|0;v=e[v>>1]|e[v+2>>1]<<16;b[sa>>1]=v;b[sa+2>>1]=v>>>16}qf(d);g=(y|0)==0;t=c[ma>>2]|0;u=(y|0)==(oa|0);v=(y|0)==1;h=0;while(1){m=c[Ja>>2]|0;if((h|0)>=(m|0))break;s=c[ka>>2]|0;d:do switch(Aa|0){case 2:{if(g)o=(s*3|0)/5|0;else o=s;break}case 3:{if(g){o=(s<<1|0)/5|0;break d}if(v)o=(s*3|0)/4|0;else o=s;break}default:o=s}while(0);k=u&(c[la>>2]|0)!=0&1;if((m|0)!=1){m=c[Fa+(h<<2)>>2]|0;if(!((h|0)!=0|(t|0)<1)){k=0;o=o-((s|0)/(na|0)|0)|0}}else m=r;if((m|0)>0){ae(za+(h*10060|0)|0,m);do if((c[Ca>>2]|0)>(h|0)){if((h|0)>0?c[Z>>2]|0:0){m=1;break}m=2}else m=0;while(0);n=rf(za+(h*10060|0)|0,j,i,m,o,k)|0}c[za+(h*10060|0)+4664>>2]=0;c[za+(h*10060|0)+5736>>2]=0;s=za+(h*10060|0)+5744|0;c[s>>2]=(c[s>>2]|0)+1;h=h+1|0}r=c[Ca>>2]|0;c[Z>>2]=a[Q+(r+-1)>>0];do if((c[j>>2]|0)>0?(r|0)==(c[wa>>2]|0):0){s=c[Ja>>2]|0;m=0;k=0;while(1){if((k|0)>=(s|0))break;h=c[za+(k*10060|0)+5740>>2]|0;o=0;while(1){m=m<<1;if((o|0)>=(h|0))break;m=m|a[za+(k*10060|0)+4716+o>>0];o=o+1|0}m=m|a[za+(k*10060|0)+4719>>0];k=k+1|0}if(Ba)Vb(i,m,R(r+1|0,s)|0);do if(c[pa>>2]|0){if((c[Ja>>2]|0)!=1?(c[ra>>2]|0)==0:0)break;c[j>>2]=0}while(0);m=(c[U>>2]|0)+(c[j>>2]<<3)|0;c[U>>2]=m;m=m-((R(c[T>>2]|0,c[Ha>>2]|0)|0)/1e3|0)|0;c[U>>2]=(m|0)>1e4?1e4:(m|0)>0?m:0;m=c[qa>>2]|0;if((c[Y>>2]|0)<(((m<<16>>16)*3188>>16)+13|0)){c[xa>>2]=1;c[qa>>2]=0;break}else{c[xa>>2]=0;c[qa>>2]=m+(c[Ha>>2]|0);break}}while(0);if(!w){Ia=134;break}g=x;h=w;y=y+1|0}if((Ia|0)==134)m=c[xa>>2]|0;c[ta>>2]=c[Ja>>2];c[f+76>>2]=m;if((c[ya>>2]|0)==16)m=(c[d+28>>2]|0)==0;else m=0;c[f+80>>2]=m&1;c[f+72>>2]=(c[ya>>2]<<16>>16)*1e3;if(!(c[ua>>2]|0))m=b[d+20148>>1]|0;else m=0;c[f+84>>2]=m;e:do if(!Ba){c[Ha>>2]=p;c[f+36>>2]=q;m=0;while(1){if((m|0)>=(c[Ja>>2]|0))break e;c[za+(m*10060|0)+4664>>2]=0;c[za+(m*10060|0)+4676>>2]=0;m=m+1|0}}while(0);Ja=d+4761|0;c[f+92>>2]=a[Ja>>0];c[f+96>>2]=b[28176+(a[Ja>>0]>>1<<2)+(a[d+4762>>0]<<1)>>1];ha(va|0);f=n;l=Ka;return f|0}function Wc(a,b){a=a|0;b=b|0;return (U(b|0)|0)+-32+a|0}function Xc(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+48|0;o=t;i=t+32|0;p=(g|0)==0;q=p?d+4732|0:d+6096+(f*36|0)|0;r=q+29|0;f=(a[r>>0]<<1)+(a[q+30>>0]|0)|0;if((f|0)>1|p^1)Rb(e,f+-2|0,32439,8);else Rb(e,f,32443,8);n=(h|0)==2;f=a[q>>0]|0;if(n)Rb(e,f,30190,8);else{Rb(e,f>>3,30166+(a[r>>0]<<3)|0,8);Rb(e,a[q>>0]&7,32468,8)}p=d+4576|0;f=1;while(1){if((f|0)>=(c[p>>2]|0))break;Rb(e,a[q+f>>0]|0,30190,8);f=f+1|0}f=q+8|0;m=d+4688|0;k=c[m>>2]|0;Rb(e,a[f>>0]|0,(c[k+16>>2]|0)+(R(a[r>>0]>>1,b[k>>1]|0)|0)|0,8);Ud(o,i,c[m>>2]|0,a[f>>0]|0);f=0;while(1){g=c[m>>2]|0;if((f|0)>=(b[g+2>>1]|0))break;i=f+1|0;j=q+8+i|0;k=a[j>>0]|0;if(k<<24>>24>3){Rb(e,8,(c[g+28>>2]|0)+(b[o+(f<<1)>>1]|0)|0,8);Rb(e,(a[j>>0]|0)+-4|0,32476,8);f=i;continue}if(k<<24>>24<-3){Rb(e,0,(c[g+28>>2]|0)+(b[o+(f<<1)>>1]|0)|0,8);Rb(e,-4-(a[j>>0]|0)|0,32476,8);f=i;continue}else{Rb(e,(k<<24>>24)+4|0,(c[g+28>>2]|0)+(b[o+(f<<1)>>1]|0)|0,8);f=i;continue}}if((c[p>>2]|0)==4)Rb(e,a[q+31>>0]|0,32445,8);if((a[r>>0]|0)!=2){s=a[r>>0]|0;s=s<<24>>24;h=d+5764|0;c[h>>2]=s;h=q+34|0;h=a[h>>0]|0;h=h<<24>>24;Rb(e,h,32453,8);l=t;return}do if(n?(c[d+5764>>2]|0)==2:0){f=q+26|0;g=d+5768|0;i=(b[f>>1]|0)-(b[g>>1]|0)|0;if((i+8|0)>>>0>19){Rb(e,0,32515,8);s=25;break}else{Rb(e,i+9|0,32515,8);break}}else s=25;while(0);if((s|0)==25){f=q+26|0;o=b[f>>1]|0;g=c[d+4572>>2]|0;s=(o|0)/(g>>1|0)|0;g=o-(R(s<<16>>16,g<<15>>16)|0)|0;Rb(e,s,32483,8);Rb(e,g,c[d+4680>>2]|0,8);g=d+5768|0}b[g>>1]=b[f>>1]|0;Rb(e,a[q+28>>0]|0,c[d+4684>>2]|0,8);g=q+32|0;Rb(e,a[g>>0]|0,30231,8);f=0;while(1){if((f|0)>=(c[p>>2]|0))break;Rb(e,a[q+4+f>>0]|0,c[18980+(a[g>>0]<<2)>>2]|0,8);f=f+1|0}if(h|0){s=a[r>>0]|0;s=s<<24>>24;h=d+5764|0;c[h>>2]=s;h=q+34|0;h=a[h>>0]|0;h=h<<24>>24;Rb(e,h,32453,8);l=t;return}Rb(e,a[q+33>>0]|0,32436,8);s=a[r>>0]|0;s=s<<24>>24;h=d+5764|0;c[h>>2]=s;h=q+34|0;h=a[h>>0]|0;h=h<<24>>24;Rb(e,h,32453,8);l=t;return}function Yc(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+32|0;p=v;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;c[p+16>>2]=0;c[p+20>>2]=0;c[p+24>>2]=0;c[p+28>>2]=0;i=h>>4;if((i<<4|0)<(h|0)){i=i+1|0;j=g+h|0;k=j+16|0;do{a[j>>0]=0;j=j+1|0}while((j|0)<(k|0))}k=i<<4;s=l;l=l+((1*(k<<2)|0)+15&-16)|0;j=0;while(1){if((j|0)>=(k|0))break;r=a[g+j>>0]|0;u=r<<24>>24;c[s+(j<<2)>>2]=r<<24>>24>0?u:0-u|0;u=j|1;r=a[g+u>>0]|0;t=r<<24>>24;c[s+(u<<2)>>2]=r<<24>>24>0?t:0-t|0;u=j|2;t=a[g+u>>0]|0;r=t<<24>>24;c[s+(u<<2)>>2]=t<<24>>24>0?r:0-r|0;u=j|3;r=a[g+u>>0]|0;t=r<<24>>24;c[s+(u<<2)>>2]=r<<24>>24>0?t:0-t|0;j=j+4|0}t=l;l=l+((1*(i<<2)|0)+15&-16)|0;u=l;l=l+((1*(i<<2)|0)+15&-16)|0;j=s;m=0;while(1){if((m|0)>=(i|0))break;n=u+(m<<2)|0;c[n>>2]=0;o=t+(m<<2)|0;a:while(1){r=Zc(p,j,8,8)|0;r=r+(Zc(p,p,10,4)|0)|0;r=r+(Zc(p,p,12,2)|0)|0;if((r|0)==(0-(Zc(o,p,16,1)|0)|0))break;c[n>>2]=(c[n>>2]|0)+1;k=0;while(1){if((k|0)==16)continue a;r=j+(k<<2)|0;c[r>>2]=c[r>>2]>>1;k=k+1|0}}j=j+64|0;m=m+1|0}q=e>>1;k=2147483647;m=0;n=0;while(1){if((n|0)==9)break;r=32776+(n*18|0)+17|0;j=d[32956+(q*9|0)+n>>0]|0;o=0;while(1){if((o|0)>=(i|0))break;if((c[u+(o<<2)>>2]|0)>0)p=r;else p=(c[t+(o<<2)>>2]|0)+(32776+(n*18|0))|0;j=j+(d[p>>0]|0)|0;o=o+1|0}r=(j|0)<(k|0);k=r?j:k;m=r?n:m;n=n+1|0}Rb(b,m,32938+(q*9|0)|0,8);n=32596+(m*18|0)|0;m=0;while(1){if((m|0)>=(i|0)){j=0;break}j=c[u+(m<<2)>>2]|0;if(!j)Rb(b,c[t+(m<<2)>>2]|0,n,8);else{Rb(b,17,n,8);k=j+-1|0;j=0;while(1){if((j|0)>=(k|0))break;Rb(b,17,32758,8);j=j+1|0}Rb(b,c[t+(m<<2)>>2]|0,32758,8)}m=m+1|0}while(1){if((j|0)>=(i|0)){n=0;break}if((c[t+(j<<2)>>2]|0)>0)zd(b,s+(j<<4<<2)|0);j=j+1|0}while(1){if((n|0)>=(i|0))break;o=c[u+(n<<2)>>2]|0;b:do if((o|0)>0){p=g+(n<<4)|0;m=0;while(1){if((m|0)==16)break b;k=a[p+m>>0]|0;q=k<<24>>24;q=(k<<24>>24>0?q:0-q|0)<<24>>24;k=o;while(1){j=k+-1|0;if((k|0)<=1)break;Rb(b,q>>>j&1,32434,8);k=j}Rb(b,q&1,32434,8);m=m+1|0}}while(0);n=n+1|0}Rc(b,g,h,e,f,t);l=v;return}function Zc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=0;while(1){if((f|0)>=(e|0)){f=0;a=5;break}g=f<<1;g=(c[b+(g<<2)>>2]|0)+(c[b+((g|1)<<2)>>2]|0)|0;if((g|0)>(d|0)){f=1;a=5;break}c[a+(f<<2)>>2]=g;f=f+1|0}if((a|0)==5)return f|0;return 0}function _c(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;m=0;while(1){if((m|0)>=(h|0))break;n=e+(m<<2)|0;ue(c[n>>2]|0)|0;k=((((ue(c[n>>2]|0)|0)<<16)+-136970240>>16)*2251|0)>>>16;i=k&255;l=b+m|0;a[l>>0]=i;if((k<<24>>24|0)<(a[f>>0]|0)){i=i+1<<24>>24;a[l>>0]=i}if(i<<24>>24>63)i=63;else i=(i<<24>>24>0?i:0)&255;a[l>>0]=i;j=a[f>>0]|0;if(!(m|g)){i=(j<<24>>24)+-4|0;j=a[b>>0]|0;if((i|0)>63){if((j<<24>>24|0)<=(i|0))i=(j<<24>>24>63?j:63)&255}else if(j<<24>>24>63)i=63;else{l=j<<24>>24;i=(l|0)<(i|0)?i:l}i=i&255;a[b>>0]=i;a[f>>0]=i}else{j=i-(j&255)|0;i=j&255;a[l>>0]=i;k=(a[f>>0]|0)+8|0;j=j<<24>>24;if((j|0)>(k|0)){i=k+((j-k+1|0)>>>1)&255;a[l>>0]=i}if(i<<24>>24>36)i=36;else i=(i<<24>>24>-4?i:-4)<<24>>24;a[l>>0]=i;if((i|0)>(k|0)){i=(d[f>>0]|0)+((i<<1)-k)|0;a[f>>0]=i;i=$c(i<<24>>24)|0}else i=(d[f>>0]|0)+(i&255)|0;a[f>>0]=i;a[l>>0]=(d[l>>0]|0)+4;i=a[f>>0]|0}l=i<<24>>24;c[n>>2]=ye(ad((l*29|0)+(l*7281>>16)+2090|0)|0)|0;m=m+1|0}return}function $c(a){a=a|0;return ((a|0)<63?a:63)|0}function ad(a){a=a|0;return ((a|0)<3967?a:3967)|0}function bd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;l=0;while(1){if((l|0)>=(g|0))break;do if(l|f){h=(a[d+l>>0]|0)+-4|0;i=a[e>>0]|0;j=i<<24>>24;k=j+8|0;if((h|0)>(k|0)){i=j+((h<<1)-k)|0;break}else{i=(i&255)+h|0;break}}else i=cd(a[d>>0]|0,(a[e>>0]|0)+-16|0)|0;while(0);h=i&255;a[e>>0]=h;if((i<<24|0)<=1056964608)if(h<<24>>24<0)h=0;else h=i<<24>>24;else h=63;a[e>>0]=h;c[b+(l<<2)>>2]=ye(ad((h*29|0)+(h*7281>>16)+2090|0)|0)|0;l=l+1|0}return}function cd(a,b){a=a|0;b=b|0;return ((a|0)>(b|0)?a:b)|0}function dd(b,c){b=b|0;c=c|0;var d=0,e=0;d=0;e=0;while(1){if((e|0)>=(c|0))break;d=(a[b+e>>0]|0)+(d<<8)|0;e=e+1|0}return d|0}function ed(a,c,d,f,g){a=a|0;c=c|0;d=d|0;f=f|0;g=g|0;var h=0,i=0;h=f<<16>>16;f=0;while(1){if((f|0)>=(g|0))break;i=e[c+(f<<1)>>1]|0;b[a+(f<<1)>>1]=i+((R((e[d+(f<<1)>>1]|0)-i<<16>>16,h)|0)>>>2);f=f+1|0}return}function fd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l+32|0;e=h+8|0;f=h;g=a+12|0;if(!(c[g>>2]|0)){l=h;return}i=a+8|0;k=256-(c[i>>2]|0)<<10;j=k>>16;gd(e,f,j,k-(j<<16)|0);g=(c[i>>2]|0)+(c[g>>2]|0)|0;c[i>>2]=(g|0)>256?256:(g|0)>0?g:0;re(b,e,c[f>>2]|0,c[f+4>>2]|0,a,b,d);l=h;return}function gd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((d|0)>=4){c[a>>2]=c[4815];c[a+4>>2]=c[4816];c[a+8>>2]=c[4817];g=b;c[g>>2]=35497197;c[g+4>>2]=57401098;return}if((e|0)<=0){f=19212+(d*12|0)|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];d=19272+(d<<3)|0;f=c[d+4>>2]|0;g=b;c[g>>2]=c[d>>2];c[g+4>>2]=f;return}f=d+1|0;g=e<<16>>16;if((e|0)<32768){e=0;while(1){if((e|0)==3){e=0;break}i=c[19212+(d*12|0)+(e<<2)>>2]|0;h=(c[19212+(f*12|0)+(e<<2)>>2]|0)-i|0;c[a+(e<<2)>>2]=i+((R(h>>16,g)|0)+((R(h&65535,g)|0)>>16));e=e+1|0}while(1){if((e|0)==2)break;h=c[19272+(d<<3)+(e<<2)>>2]|0;i=(c[19272+(f<<3)+(e<<2)>>2]|0)-h|0;c[b+(e<<2)>>2]=h+((R(i>>16,g)|0)+((R(i&65535,g)|0)>>16));e=e+1|0}return}else{e=0;while(1){if((e|0)==3){e=0;break}h=c[19212+(f*12|0)+(e<<2)>>2]|0;i=h-(c[19212+(d*12|0)+(e<<2)>>2]|0)|0;c[a+(e<<2)>>2]=h+((R(i>>16,g)|0)+((R(i&65535,g)|0)>>16));e=e+1|0}while(1){if((e|0)==2)break;h=c[19272+(f<<3)+(e<<2)>>2]|0;i=h-(c[19272+(d<<3)+(e<<2)>>2]|0)|0;c[b+(e<<2)>>2]=h+((R(i>>16,g)|0)+((R(i&65535,g)|0)>>16));e=e+1|0}return}}function hd(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;l=l+80|0;o=n+64|0;m=n;Ud(n+32|0,o,g,a[f>>0]|0);k=g+2|0;id(m,f+1|0,o,b[g+4>>1]|0,b[k>>1]|0);o=b[k>>1]|0;j=R(a[f>>0]|0,o<<16>>16)|0;i=(c[g+8>>2]|0)+j|0;j=(c[g+12>>2]|0)+(j<<1)|0;h=0;f=o;while(1){f=f<<16>>16;if((h|0)>=(f|0))break;f=((b[m+(h<<1)>>1]<<14|0)/(b[j+(h<<1)>>1]|0)|0)+(d[i+h>>0]<<7)|0;b[e+(h<<1)>>1]=(f|0)>32767?32767:((f|0)>0?f:0)&65535;h=h+1|0;f=b[k>>1]|0}Ge(e,c[g+36>>2]|0,f);l=n;return}function id(c,e,f,g,h){c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0;k=g<<16>>16;i=0;g=h<<16>>16;while(1){j=g+-1|0;if((g|0)<=0)break;i=(R(i<<16>>16,d[f+j>>0]|0)|0)>>8;g=a[e+j>>0]|0;h=g<<24>>24<<10;if(g<<24>>24>0)g=h+-102|0;else g=g<<24>>24?h|102:h;i=i+((R(g>>16,k)|0)+((R(g&65535,k)|0)>>16))|0;b[c+(j<<1)>>1]=i;g=j}return}function jd(d,e,f,g,h,i,j,k,m,n,o,p,q,r,s){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;var t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0;S=l;c[e+4340>>2]=a[f+34>>0];O=e+4328|0;u=c[O>>2]|0;P=f+29|0;Q=b[28176+(a[P>>0]>>1<<2)+(a[f+30>>0]<<1)>>1]|0;L=(a[f+31>>0]|0)!=4&1;B=d+4588|0;H=c[B>>2]|0;C=d+4580|0;F=H+(c[C>>2]|0)|0;D=l;l=l+((1*(F<<2)|0)+15&-16)|0;E=l;l=l+((1*(F<<1)|0)+15&-16)|0;F=d+4584|0;G=l;l=l+((1*(c[F>>2]<<2)|0)+15&-16)|0;c[e+4336>>2]=H;H=e+4332|0;c[H>>2]=c[B>>2];I=d+4576|0;J=L^1;K=e+4348|0;L=L<<1^3;M=d+4636|0;N=d+4632|0;A=e+(c[B>>2]<<1)|0;z=0;while(1){f=c[I>>2]|0;if((z|0)>=(f|0))break;v=i+((z>>1|J)<<4<<1)|0;w=j+(z*5<<1)|0;x=k+(z*24<<1)|0;y=c[m+(z<<2)>>2]|0;y=y>>2|y>>>1<<16;c[K>>2]=0;t=a[P>>0]|0;if(t<<24>>24==2){f=c[q+(z<<2)>>2]|0;if(!(z&L)){T=c[B>>2]|0;t=c[M>>2]|0;u=T-f-t+-2|0;ze(E+(u<<1)|0,e+(u+(R(z,c[F>>2]|0)|0)<<1)|0,v,T-u|0,t);c[K>>2]=1;c[H>>2]=c[B>>2];t=a[P>>0]|0}else t=2}else f=u;kd(d,e,g,G,E,D,z,s,p,q,t<<24>>24);ld(e,a[P>>0]|0,G,h,A,D,v,w,x,f,y,c[n+(z<<2)>>2]|0,c[o+(z<<2)>>2]|0,c[p+(z<<2)>>2]|0,r,Q,c[F>>2]|0,c[N>>2]|0,c[M>>2]|0);u=c[F>>2]|0;A=A+(u<<1)|0;g=g+(u<<1)|0;h=h+u|0;u=f;z=z+1|0}c[O>>2]=c[q+(f+-1<<2)>>2];Wh(e|0,e+(c[C>>2]<<1)|0,c[B>>2]<<1|0)|0;Wh(e+1280|0,e+1280+(c[C>>2]<<2)|0,c[B>>2]<<2|0)|0;l=S;return}function kd(a,d,e,f,g,h,i,j,k,l,m){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;r=c[l+(i<<2)>>2]|0;s=k+(i<<2)|0;l=c[s>>2]|0;l=od((l|0)>1?l:1)|0;p=(l>>4)+1|0;n=a+4584|0;o=p>>>1<<16>>16;p=(p>>16)+1>>1;k=0;while(1){if((k|0)>=(c[n>>2]|0))break;t=b[e+(k<<1)>>1]|0;q=t<<16>>16;c[f+(k<<2)>>2]=(R(q>>16,o)|0)+((R(t&65535,o)|0)>>16)+(R(q,p)|0);k=k+1|0}q=d+4348|0;a:do if(c[q>>2]|0){if(!i){t=j<<16>>16;l=(R(l>>16,t)|0)+((R(l&65535,t)|0)>>16)<<2}o=d+4332|0;n=c[o>>2]|0;p=l>>16;k=l&65535;l=n-r+-2|0;while(1){if((l|0)>=(n|0))break a;n=b[g+(l<<1)>>1]|0;c[h+(l<<2)>>2]=(R(p,n)|0)+((R(k,n)|0)>>16);l=l+1|0;n=c[o>>2]|0}}while(0);l=c[s>>2]|0;f=d+4344|0;k=c[f>>2]|0;if((l|0)==(k|0))return;o=pd(k,l)|0;n=d+4336|0;k=c[n>>2]|0;p=o>>16;e=o&65535;l=k-(c[a+4588>>2]|0)|0;while(1){if((l|0)>=(k|0))break;k=d+1280+(l<<2)|0;t=c[k>>2]|0;a=t<<16>>16;c[k>>2]=(R(p,a)|0)+((R(e,a)|0)>>16)+(R(o,(t>>15)+1>>1)|0);l=l+1|0;k=c[n>>2]|0}b:do if((m|0)==2?(c[q>>2]|0)==0:0){n=d+4332|0;k=c[n>>2]|0;l=k-r+-2|0;while(1){if((l|0)>=(k|0))break b;k=h+(l<<2)|0;t=c[k>>2]|0;r=t<<16>>16;c[k>>2]=(R(p,r)|0)+((R(e,r)|0)>>16)+(R(o,(t>>15)+1>>1)|0);l=l+1|0;k=c[n>>2]|0}}while(0);l=d+4320|0;t=c[l>>2]|0;h=t<<16>>16;c[l>>2]=(R(p,h)|0)+((R(e,h)|0)>>16)+(R(o,(t>>15)+1>>1)|0);l=d+4324|0;t=c[l>>2]|0;h=t<<16>>16;c[l>>2]=(R(p,h)|0)+((R(e,h)|0)>>16)+(R(o,(t>>15)+1>>1)|0);l=0;while(1){if((l|0)==16){l=0;break}t=d+3840+(l<<2)|0;h=c[t>>2]|0;r=h<<16>>16;c[t>>2]=(R(p,r)|0)+((R(e,r)|0)>>16)+(R(o,(h>>15)+1>>1)|0);l=l+1|0}while(1){if((l|0)==24)break;t=d+4224+(l<<2)|0;h=c[t>>2]|0;r=h<<16>>16;c[t>>2]=(R(p,r)|0)+((R(e,r)|0)>>16)+(R(o,(h>>15)+1>>1)|0);l=l+1|0}c[f>>2]=c[s>>2];return}function ld(d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;var w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;ba=d+4336|0;ca=d+4332|0;da=d+4340|0;V=(e|0)==2;W=k+2|0;X=k+4|0;Y=k+6|0;Z=k+8|0;_=d+4324|0;$=d+4224|0;aa=d+4320|0;T=o<<16>>16;U=p<<16>>16;P=p>>16;Q=(m|0)>0;S=n<<16>>16;L=n>>16;M=(r|0)>2048;O=(r|0)/2|0;N=O+-512|0;O=512-O|0;J=r<<16>>16;K=q>>>6<<16>>16;D=(q>>21)+1>>1;E=s+944|0;F=R(s<<16>>16,J)|0;G=R(E<<16>>16,J)|0;H=s+-944|0;I=R(944-s<<16>>16,J)|0;e=i+((c[ca>>2]|0)-m+2<<2)|0;p=d+1280+((c[ba>>2]|0)-m+1<<2)|0;A=0;B=d+3900|0;while(1){if((A|0)>=(t|0))break;c[da>>2]=(R(c[da>>2]|0,196314165)|0)+907633515;C=md(B,j,v)|0;if(V){y=c[e>>2]|0;z=b[k>>1]|0;z=(R(y>>16,z)|0)+((R(y&65535,z)|0)>>16)+2|0;y=c[e+-4>>2]|0;x=b[W>>1]|0;x=z+((R(y>>16,x)|0)+((R(y&65535,x)|0)>>16))|0;y=c[e+-8>>2]|0;z=b[X>>1]|0;z=x+((R(y>>16,z)|0)+((R(y&65535,z)|0)>>16))|0;y=c[e+-12>>2]|0;x=b[Y>>1]|0;x=z+((R(y>>16,x)|0)+((R(y&65535,x)|0)>>16))|0;y=c[e+-16>>2]|0;z=b[Z>>1]|0;z=x+((R(y>>16,z)|0)+((R(y&65535,z)|0)>>16))|0;e=e+4|0}else z=0;x=nd(c[_>>2]|0,$,l,u)|0;y=c[aa>>2]|0;o=y>>16;y=y&65535;x=x+((R(o,T)|0)+((R(y,T)|0)>>16))|0;w=c[d+1280+((c[ba>>2]|0)+-1<<2)>>2]|0;y=(R(w>>16,U)|0)+((R(w&65535,U)|0)>>16)+(R(o,P)|0)+((R(y,P)|0)>>16)|0;o=(C<<2)-x-y|0;if(Q){m=(c[p>>2]|0)+(c[p+-8>>2]|0)|0;m=(R(m>>16,S)|0)+((R(m&65535,S)|0)>>16)|0;w=c[p+-4>>2]|0;o=z-(m+(R(w>>16,L)|0)+((R(w&65535,L)|0)>>16)<<1)+(o<<1)>>2;p=p+4|0}else o=o>>1;w=f+(A<<2)|0;m=(c[w>>2]|0)-(o+1>>1)|0;m=(c[da>>2]|0)<0?0-m|0:m;m=(m|0)>30720?30720:(m|0)>-31744?m:-31744;o=m-s|0;do if(M){if((o|0)>(N|0)){o=o-N|0;ea=14;break}if((o|0)>=(O|0))if((o|0)<0){ea=17;break}else{o=G;n=F;r=E;q=s;break}else{o=o+N|0;ea=14;break}}else ea=14;while(0);a:do if((ea|0)==14){ea=0;o=o>>10;if((o|0)>0){q=(o<<10)+-80+s|0;r=q+1024|0;o=R(r<<16>>16,J)|0;n=R(q<<16>>16,J)|0;break}switch(o|0){case 0:{o=G;n=F;r=E;q=s;break a}case -1:{ea=17;break a}default:{}}q=(o<<10|80)+s|0;o=R(-1024-q<<16>>16,J)|0;n=R(0-q<<16>>16,J)|0;r=q+1024|0}while(0);if((ea|0)==17){ea=0;o=F;n=I;r=s;q=H}fa=m-q<<16>>16;m=m-r<<16>>16;m=(o+(R(m,m)|0)|0)<(n+(R(fa,fa)|0)|0);q=m?r:q;m=g+A|0;a[m>>0]=((q>>>9)+1|0)>>>1;q=q<<4;z=((c[da>>2]|0)<0?0-q|0:q)+(z<<1)|0;q=z+(C<<4)|0;C=((R(q>>16,K)|0)+((R(q&65534,K)|0)>>16)+(R(q,D)|0)>>7)+1>>1;b[h+(A<<1)>>1]=(C|0)>32767?32767:((C|0)>-32768?C:-32768)&65535;C=B+4|0;c[C>>2]=q;w=q-(c[w>>2]<<4)|0;c[_>>2]=w;x=w-(x<<2)|0;c[aa>>2]=x;c[d+1280+(c[ba>>2]<<2)>>2]=x-(y<<2);c[i+(c[ca>>2]<<2)>>2]=z<<1;c[ba>>2]=(c[ba>>2]|0)+1;c[ca>>2]=(c[ca>>2]|0)+1;c[da>>2]=(c[da>>2]|0)+(a[m>>0]|0);A=A+1|0;B=C}p=d+3840|0;e=d+3840+(t<<2)|0;o=p+64|0;do{c[p>>2]=c[e>>2];p=p+4|0;e=e+4|0}while((p|0)<(o|0));return}function md(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[a>>2]|0;h=b[d>>1]|0;h=(e>>1)+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-4>>2]|0;f=b[d+2>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-8>>2]|0;h=b[d+4>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-12>>2]|0;f=b[d+6>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-16>>2]|0;h=b[d+8>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-20>>2]|0;f=b[d+10>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-24>>2]|0;h=b[d+12>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-28>>2]|0;f=b[d+14>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-32>>2]|0;h=b[d+16>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-36>>2]|0;f=b[d+18>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;if((e|0)!=16){h=f;return h|0}g=c[a+-40>>2]|0;e=b[d+20>>1]|0;e=f+((R(g>>16,e)|0)+((R(g&65535,e)|0)>>16))|0;g=c[a+-44>>2]|0;h=b[d+22>>1]|0;h=e+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-48>>2]|0;e=b[d+24>>1]|0;e=h+((R(g>>16,e)|0)+((R(g&65535,e)|0)>>16))|0;g=c[a+-52>>2]|0;h=b[d+26>>1]|0;h=e+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-56>>2]|0;e=b[d+28>>1]|0;e=h+((R(g>>16,e)|0)+((R(g&65535,e)|0)>>16))|0;g=c[a+-60>>2]|0;h=b[d+30>>1]|0;h=e+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;return h|0}function nd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;h=c[d>>2]|0;c[d>>2]=a;i=b[e>>1]|0;g=2;a=(f>>1)+((R(a>>16,i)|0)+((R(a&65535,i)|0)>>16))|0;while(1){if((g|0)>=(f|0))break;l=g+-1|0;i=d+(l<<2)|0;k=c[i>>2]|0;c[i>>2]=h;l=b[e+(l<<1)>>1]|0;i=d+(g<<2)|0;j=c[i>>2]|0;c[i>>2]=k;l=l<<16>>16;i=b[e+(g<<1)>>1]|0;i=a+((R(h>>16,l)|0)+((R(h&65535,l)|0)>>16))+((R(k>>16,i)|0)+((R(k&65535,i)|0)>>16))|0;g=g+2|0;h=j;a=i}l=f+-1|0;c[d+(l<<2)>>2]=h;l=b[e+(l<<1)>>1]|0;return a+((R(h>>16,l)|0)+((R(h&65535,l)|0)>>16))<<1|0}function od(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;b=qd((a|0)>0?a:0-a|0)|0;a=a<<b+-1;f=a>>16;d=536870911/(f|0)|0;e=d<<16;c=e>>16;a=536870912-((R(f,c)|0)+((R(a&65535,c)|0)>>16))<<3;d=e+((R(a>>16,c)|0)+((R(a&65528,c)|0)>>16))+(R(a,(d>>15)+1>>1)|0)|0;a=62-b|0;b=a+-47|0;if((b|0)>=1)return ((b|0)<32?d>>b:0)|0;a=47-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){f=b;f=f<<a;return f|0}f=(d|0)<(c|0)?c:d;f=f<<a;return f|0}else{if((d|0)>(c|0)){f=c;f=f<<a;return f|0}f=(d|0)<(b|0)?b:d;f=f<<a;return f|0}return 0}function pd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=qd((a|0)>0?a:0-a|0)|0;f=a<<c+-1;a=(qd((b|0)>0?b:0-b|0)|0)+-1|0;b=b<<a;d=(536870911/(b>>16|0)|0)<<16>>16;e=(R(f>>16,d)|0)+((R(f&65535,d)|0)>>16)|0;b=Uh(b|0,((b|0)<0)<<31>>31|0,e|0,((e|0)<0)<<31>>31|0)|0;b=Rh(b|0,C|0,29)|0;b=f-(b&-8)|0;d=e+((R(b>>16,d)|0)+((R(b&65535,d)|0)>>16))|0;a=c+28-a|0;b=a+-16|0;if((a|0)>=16)return ((b|0)<32?d>>b:0)|0;a=16-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){f=b;f=f<<a;return f|0}f=(d|0)<(c|0)?c:d;f=f<<a;return f|0}else{if((d|0)>(c|0)){f=c;f=f<<a;return f|0}f=(d|0)<(b|0)?b:d;f=f<<a;return f|0}return 0}function qd(a){a=a|0;return U(a|0)|0}function rd(e,f,g,h,i,j,k,m,n,o,p,q,r,s,t){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;var u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;ha=l;l=l+176|0;$=ha+160|0;V=ha;aa=f+4328|0;z=c[aa>>2]|0;W=e+4624|0;v=c[W>>2]|0;ba=l;l=l+((1*(v*1300|0)|0)+15&-16)|0;Qh(ba|0,0,v*1300|0)|0;Z=g+34|0;ca=f+4320|0;da=f+4324|0;ea=e+4588|0;fa=f+3840|0;ga=f+4224|0;u=0;while(1){if((u|0)>=(v|0))break;y=u+(d[Z>>0]|0)&3;c[ba+(u*1300|0)+1288>>2]=y;c[ba+(u*1300|0)+1292>>2]=y;c[ba+(u*1300|0)+1296>>2]=0;c[ba+(u*1300|0)+1280>>2]=c[ca>>2];c[ba+(u*1300|0)+1284>>2]=c[da>>2];c[ba+(u*1300|0)+1024>>2]=c[f+1280+((c[ea>>2]|0)+-1<<2)>>2];y=ba+(u*1300|0)|0;w=fa;x=y+64|0;do{c[y>>2]=c[w>>2];y=y+4|0;w=w+4|0}while((y|0)<(x|0));y=ba+(u*1300|0)+1184|0;w=ga;x=y+96|0;do{c[y>>2]=c[w>>2];y=y+4|0;w=w+4|0}while((y|0)<(x|0));u=u+1|0}Q=g+29|0;Y=a[Q>>0]|0;S=b[28176+(Y<<24>>24>>1<<2)+(a[g+30>>0]<<1)>>1]|0;c[$>>2]=0;_=e+4584|0;x=c[_>>2]|0;u=sd(40,x)|0;a:do if(Y<<24>>24!=2)if((z|0)>0)U=sd(u,z+-3|0)|0;else U=u;else{w=c[e+4576>>2]|0;v=0;while(1){if((v|0)>=(w|0)){U=u;break a}u=sd(u,(c[r+(v<<2)>>2]|0)+-3|0)|0;v=v+1|0}}while(0);G=(a[g+31>>0]|0)!=4&1;P=c[ea>>2]|0;Y=e+4580|0;N=P+(c[Y>>2]|0)|0;L=l;l=l+((1*(N<<2)|0)+15&-16)|0;M=l;l=l+((1*(N<<1)|0)+15&-16)|0;N=l;l=l+((1*(x<<2)|0)+15&-16)|0;T=f+4336|0;c[T>>2]=P;D=f+4332|0;c[D>>2]=c[ea>>2];X=e+4576|0;E=G^1;F=f+4348|0;G=G<<1^3;O=ba+1296|0;H=q+4|0;I=e+4636|0;J=e+4632|0;K=e+4668|0;v=0;u=z;P=f+(P<<1)|0;y=0;while(1){if((y|0)>=(c[X>>2]|0))break;z=j+((y>>1|E)<<4<<1)|0;A=k+(y*5<<1)|0;B=m+(y*24<<1)|0;C=c[n+(y<<2)>>2]|0;C=C>>2|C>>>1<<16;c[F>>2]=0;w=a[Q>>0]|0;if(w<<24>>24==2){u=c[r+(y<<2)>>2]|0;if(!(y&G)){b:do if((y|0)==2){x=c[W>>2]|0;v=c[O>>2]|0;g=0;w=1;while(1){if((w|0)>=(x|0)){v=0;break}ja=c[ba+(w*1300|0)+1296>>2]|0;ia=(ja|0)<(v|0);v=ia?ja:v;g=ia?w:g;w=w+1|0}while(1){if((v|0)>=(x|0))break;if((v|0)!=(g|0)){ja=ba+(v*1300|0)+1296|0;c[ja>>2]=(c[ja>>2]|0)+134217727}v=v+1|0}v=(c[$>>2]|0)+U|0;w=0;while(1){if((w|0)>=(U|0)){v=0;break b}ja=(v+-1|0)%40|0;ja=(ja|0)<0?ja+40|0:ja;ia=w-U|0;a[i+ia>>0]=(((c[ba+(g*1300|0)+544+(ja<<2)>>2]|0)>>>9)+1|0)>>>1;ka=c[ba+(g*1300|0)+704+(ja<<2)>>2]|0;x=c[H>>2]|0;la=x<<16>>16;x=((R(ka>>16,la)|0)+((R(ka&65535,la)|0)>>16)+(R(ka,(x>>15)+1>>1)|0)>>13)+1>>1;b[P+(ia<<1)>>1]=(x|0)>32767?32767:((x|0)>-32768?x:-32768)&65535;c[f+1280+((c[T>>2]|0)-U+w<<2)>>2]=c[ba+(g*1300|0)+1024+(ja<<2)>>2];v=ja;w=w+1|0}}while(0);ka=c[ea>>2]|0;w=c[I>>2]|0;la=ka-u-w+-2|0;ze(M+(la<<1)|0,f+(la+(R(y,c[_>>2]|0)|0)<<1)|0,z,ka-la|0,w);c[D>>2]=c[ea>>2];c[F>>2]=1;w=a[Q>>0]|0}else w=2}td(e,f,ba,h,N,M,L,y,c[W>>2]|0,t,q,r,w<<24>>24,U);ud(f,ba,a[Q>>0]|0,N,i,P,L,V,z,A,B,u,C,c[o+(y<<2)>>2]|0,c[p+(y<<2)>>2]|0,c[q+(y<<2)>>2]|0,s,S,c[_>>2]|0,v,c[J>>2]|0,c[I>>2]|0,c[K>>2]|0,c[W>>2]|0,$,U);la=c[_>>2]|0;h=h+(la<<1)|0;v=v+1|0;i=i+la|0;P=P+(la<<1)|0;y=y+1|0}w=c[W>>2]|0;u=c[O>>2]|0;g=0;v=1;while(1){if((v|0)>=(w|0))break;ka=c[ba+(v*1300|0)+1296>>2]|0;la=(ka|0)<(u|0);u=la?ka:u;g=la?v:g;v=v+1|0}a[Z>>0]=c[ba+(g*1300|0)+1292>>2];x=c[q+((c[X>>2]|0)+-1<<2)>>2]|0;w=x>>>6<<16>>16;x=(x>>21)+1>>1;u=(c[$>>2]|0)+U|0;v=0;while(1){if((v|0)>=(U|0))break;la=(u+-1|0)%40|0;la=(la|0)<0?la+40|0:la;ka=v-U|0;a[i+ka>>0]=(((c[ba+(g*1300|0)+544+(la<<2)>>2]|0)>>>9)+1|0)>>>1;ja=c[ba+(g*1300|0)+704+(la<<2)>>2]|0;ja=((R(ja>>16,w)|0)+((R(ja&65535,w)|0)>>16)+(R(ja,x)|0)>>7)+1>>1;b[P+(ka<<1)>>1]=(ja|0)>32767?32767:((ja|0)>-32768?ja:-32768)&65535;c[f+1280+((c[T>>2]|0)-U+v<<2)>>2]=c[ba+(g*1300|0)+1024+(la<<2)>>2];u=la;v=v+1|0}y=fa;w=ba+(g*1300|0)+(c[_>>2]<<2)|0;x=y+64|0;do{c[y>>2]=c[w>>2];y=y+4|0;w=w+4|0}while((y|0)<(x|0));y=ga;w=ba+(g*1300|0)+1184|0;x=y+96|0;do{c[y>>2]=c[w>>2];y=y+4|0;w=w+4|0}while((y|0)<(x|0));c[ca>>2]=c[ba+(g*1300|0)+1280>>2];c[da>>2]=c[ba+(g*1300|0)+1284>>2];c[aa>>2]=c[r+((c[X>>2]|0)+-1<<2)>>2];Wh(f|0,f+(c[Y>>2]<<1)|0,c[ea>>2]<<1|0)|0;Wh(f+1280|0,f+1280+(c[Y>>2]<<2)|0,c[ea>>2]<<2|0)|0;l=ha;return}function sd(a,b){a=a|0;b=b|0;return ((a|0)<(b|0)?a:b)|0}function td(a,d,e,f,g,h,i,j,k,l,m,n,o,p){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0;u=c[n+(j<<2)>>2]|0;v=m+(j<<2)|0;n=c[v>>2]|0;n=wd((n|0)>1?n:1)|0;s=(n>>4)+1|0;q=a+4584|0;r=s>>>1<<16>>16;s=(s>>16)+1>>1;m=0;while(1){if((m|0)>=(c[q>>2]|0))break;w=b[f+(m<<1)>>1]|0;t=w<<16>>16;c[g+(m<<2)>>2]=(R(t>>16,r)|0)+((R(w&65535,r)|0)>>16)+(R(t,s)|0);m=m+1|0}t=d+4348|0;a:do if(c[t>>2]|0){if(!j){w=l<<16>>16;n=(R(n>>16,w)|0)+((R(n&65535,w)|0)>>16)<<2}r=d+4332|0;q=c[r>>2]|0;s=n>>16;m=n&65535;n=q-u+-2|0;while(1){if((n|0)>=(q|0))break a;q=b[h+(n<<1)>>1]|0;c[i+(n<<2)>>2]=(R(s,q)|0)+((R(m,q)|0)>>16);n=n+1|0;q=c[r>>2]|0}}while(0);n=c[v>>2]|0;g=d+4344|0;m=c[g>>2]|0;if((n|0)==(m|0))return;r=xd(m,n)|0;q=d+4336|0;m=c[q>>2]|0;s=r>>16;f=r&65535;n=m-(c[a+4588>>2]|0)|0;while(1){if((n|0)>=(m|0))break;m=d+1280+(n<<2)|0;w=c[m>>2]|0;a=w<<16>>16;c[m>>2]=(R(s,a)|0)+((R(f,a)|0)>>16)+(R(r,(w>>15)+1>>1)|0);n=n+1|0;m=c[q>>2]|0}b:do if((o|0)==2?(c[t>>2]|0)==0:0){q=d+4332|0;m=c[q>>2]|0;n=m-u+-2|0;while(1){if((n|0)>=(m-p|0)){m=0;break b}m=i+(n<<2)|0;w=c[m>>2]|0;u=w<<16>>16;c[m>>2]=(R(s,u)|0)+((R(f,u)|0)>>16)+(R(r,(w>>15)+1>>1)|0);n=n+1|0;m=c[q>>2]|0}}else m=0;while(0);while(1){if((m|0)>=(k|0))break;n=e+(m*1300|0)+1280|0;w=c[n>>2]|0;i=w<<16>>16;c[n>>2]=(R(s,i)|0)+((R(f,i)|0)>>16)+(R(r,(w>>15)+1>>1)|0);n=e+(m*1300|0)+1284|0;w=c[n>>2]|0;i=w<<16>>16;c[n>>2]=(R(s,i)|0)+((R(f,i)|0)>>16)+(R(r,(w>>15)+1>>1)|0);n=0;while(1){if((n|0)==16){n=0;break}w=e+(m*1300|0)+(n<<2)|0;i=c[w>>2]|0;p=i<<16>>16;c[w>>2]=(R(s,p)|0)+((R(f,p)|0)>>16)+(R(r,(i>>15)+1>>1)|0);n=n+1|0}while(1){if((n|0)==24){n=0;break}w=e+(m*1300|0)+1184+(n<<2)|0;i=c[w>>2]|0;p=i<<16>>16;c[w>>2]=(R(s,p)|0)+((R(f,p)|0)>>16)+(R(r,(i>>15)+1>>1)|0);n=n+1|0}while(1){if((n|0)==40)break;w=e+(m*1300|0)+864+(n<<2)|0;i=c[w>>2]|0;p=i<<16>>16;c[w>>2]=(R(s,p)|0)+((R(f,p)|0)>>16)+(R(r,(i>>15)+1>>1)|0);w=e+(m*1300|0)+1024+(n<<2)|0;i=c[w>>2]|0;p=i<<16>>16;c[w>>2]=(R(s,p)|0)+((R(f,p)|0)>>16)+(R(r,(i>>15)+1>>1)|0);n=n+1|0}m=m+1|0}c[g>>2]=c[v>>2];return}\nfunction ud(d,e,f,g,h,i,j,k,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;A=A|0;B=B|0;C=C|0;D=D|0;var E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0;sa=l;oa=l;l=l+((1*(B*56|0)|0)+15&-16)|0;pa=d+4336|0;qa=d+4332|0;na=t>>6;ga=(f|0)==2;ha=n+2|0;ia=n+4|0;ja=n+6|0;ka=n+8|0;la=(p|0)>0;ma=q<<16>>16;fa=q>>16;ba=A<<16>>16;ca=y>>1;da=y+-1|0;ea=o+(da<<1)|0;$=r<<16>>16;aa=s<<16>>16;X=s>>16;Y=(u|0)>2048;_=(u|0)/2|0;Z=_+-512|0;_=512-_|0;O=u<<16>>16;P=v+944|0;Q=R(v<<16>>16,O)|0;S=R(P<<16>>16,O)|0;T=v+-944|0;U=R(944-v<<16>>16,O)|0;V=oa+4|0;W=oa+32|0;N=(x|0)<1;f=d+1280+((c[pa>>2]|0)-p+1<<2)|0;t=j+((c[qa>>2]|0)-p+2<<2)|0;M=0;while(1){if((M|0)>=(w|0)){t=0;break}if(ga){L=c[t>>2]|0;K=b[n>>1]|0;K=(R(L>>16,K)|0)+((R(L&65535,K)|0)>>16)+2|0;L=c[t+-4>>2]|0;J=b[ha>>1]|0;J=K+((R(L>>16,J)|0)+((R(L&65535,J)|0)>>16))|0;L=c[t+-8>>2]|0;K=b[ia>>1]|0;K=J+((R(L>>16,K)|0)+((R(L&65535,K)|0)>>16))|0;L=c[t+-12>>2]|0;J=b[ja>>1]|0;J=K+((R(L>>16,J)|0)+((R(L&65535,J)|0)>>16))|0;L=c[t+-16>>2]|0;K=b[ka>>1]|0;K=J+((R(L>>16,K)|0)+((R(L&65535,K)|0)>>16))<<1;t=t+4|0}else K=0;if(la){L=(c[f>>2]|0)+(c[f+-8>>2]|0)|0;L=(R(L>>16,ma)|0)+((R(L&65535,ma)|0)>>16)|0;J=c[f+-4>>2]|0;J=K-(L+(R(J>>16,fa)|0)+((R(J&65535,fa)|0)>>16)<<2)|0;L=f+4|0}else{J=0;L=f}H=M+15|0;I=g+(M<<2)|0;G=0;while(1){if((G|0)>=(B|0))break;s=e+(G*1300|0)+1288|0;c[s>>2]=(R(c[s>>2]|0,196314165)|0)+907633515;q=vd(e+(G*1300|0)+(H<<2)|0,m,z)|0;A=e+(G*1300|0)+1184|0;F=c[A>>2]|0;f=(c[e+(G*1300|0)+1284>>2]|0)+((R(F>>16,ba)|0)+((R(F&65535,ba)|0)>>16))|0;r=(c[e+(G*1300|0)+1188>>2]|0)-f|0;r=F+((R(r>>16,ba)|0)+((R(r&65535,ba)|0)>>16))|0;c[A>>2]=f;A=b[o>>1]|0;A=ca+((R(f>>16,A)|0)+((R(f&65535,A)|0)>>16))|0;f=2;while(1){if((f|0)>=(y|0))break;u=f+-1|0;F=e+(G*1300|0)+1184+(u<<2)|0;p=e+(G*1300|0)+1184+(f<<2)|0;E=c[p>>2]|0;x=E-r|0;x=(c[F>>2]|0)+((R(x>>16,ba)|0)+((R(x&65535,ba)|0)>>16))|0;c[F>>2]=r;u=b[o+(u<<1)>>1]|0;F=c[e+(G*1300|0)+1184+((f|1)<<2)>>2]|0;c[p>>2]=x;u=u<<16>>16;p=b[o+(f<<1)>>1]|0;F=F-x|0;A=A+((R(r>>16,u)|0)+((R(r&65535,u)|0)>>16))+((R(x>>16,p)|0)+((R(x&65535,p)|0)>>16))|0;r=E+((R(F>>16,ba)|0)+((R(F&65535,ba)|0)>>16))|0;f=f+2|0}F=q<<4;c[e+(G*1300|0)+1184+(da<<2)>>2]=r;x=b[ea>>1]|0;x=A+((R(r>>16,x)|0)+((R(r&65535,x)|0)>>16))<<1;p=c[e+(G*1300|0)+1280>>2]|0;E=p>>16;p=p&65535;x=x+((R(E,$)|0)+((R(p,$)|0)>>16))<<2;u=c[e+(G*1300|0)+1024+(c[C>>2]<<2)>>2]|0;p=(R(u>>16,aa)|0)+((R(u&65535,aa)|0)>>16)+(R(E,X)|0)+((R(p,X)|0)>>16)<<2;E=c[I>>2]|0;u=E-((J+F-(x+p)>>3)+1>>1)|0;s=(c[s>>2]|0)<0;u=s?0-u|0:u;u=(u|0)>30720?30720:(u|0)>-31744?u:-31744;f=u-v|0;do if(Y){if((f|0)>(Z|0)){f=f-Z|0;ra=18;break}if((f|0)>=(_|0))if((f|0)<0){ra=21;break}else{f=P;q=v;A=S;r=Q;break}else{f=f+Z|0;ra=18;break}}else ra=18;while(0);a:do if((ra|0)==18){ra=0;f=f>>10;if((f|0)>0){r=(f<<10)+-80+v|0;A=r+1024|0;f=A;q=r;A=R(A<<16>>16,O)|0;r=R(r<<16>>16,O)|0;break}switch(f|0){case 0:{f=P;q=v;A=S;r=Q;break a}case -1:{ra=21;break a}default:{}}r=(f<<10|80)+v|0;f=r+1024|0;q=r;A=R(-1024-r<<16>>16,O)|0;r=R(0-r<<16>>16,O)|0}while(0);if((ra|0)==21){ra=0;f=v;q=T;A=Q;r=U}ta=u-q<<16>>16;ta=r+(R(ta,ta)|0)>>10;u=u-f<<16>>16;u=A+(R(u,u)|0)>>10;ua=(ta|0)<(u|0);va=c[e+(G*1300|0)+1296>>2]|0;A=ua?q:f;r=ua?f:q;c[oa+(G*56|0)+4>>2]=va+(ua?ta:u);c[oa+(G*56|0)+32>>2]=va+(ua?u:ta);c[oa+(G*56|0)>>2]=A;c[oa+(G*56|0)+28>>2]=r;q=A<<4;q=(s?0-q|0:q)+K|0;A=q+F|0;u=E<<4;E=A-u|0;c[oa+(G*56|0)+16>>2]=E;E=E-x|0;c[oa+(G*56|0)+20>>2]=E-p;c[oa+(G*56|0)+12>>2]=E;c[oa+(G*56|0)+24>>2]=q;c[oa+(G*56|0)+8>>2]=A;E=r<<4;E=(s?0-E|0:E)+K|0;F=E+F|0;u=F-u|0;c[oa+(G*56|0)+44>>2]=u;x=u-x|0;c[oa+(G*56|0)+48>>2]=x-p;c[oa+(G*56|0)+40>>2]=x;c[oa+(G*56|0)+52>>2]=E;c[oa+(G*56|0)+36>>2]=F;G=G+1|0}A=((c[C>>2]|0)+-1|0)%40|0;x=(A|0)<0;f=A+40|0;c[C>>2]=x?f:A;A=(x?f:A)+D|0;f=c[V>>2]|0;x=0;q=1;while(1){if((q|0)>=(B|0))break;ua=c[oa+(q*56|0)+4>>2]|0;va=(ua|0)<(f|0);f=va?ua:f;x=va?q:x;q=q+1|0}u=(A|0)%40|0;q=c[e+(x*1300|0)+384+(u<<2)>>2]|0;f=0;while(1){if((f|0)>=(B|0))break;if((c[e+(f*1300|0)+384+(u<<2)>>2]|0)!=(q|0)){va=oa+(f*56|0)+4|0;c[va>>2]=(c[va>>2]|0)+134217727;va=oa+(f*56|0)+32|0;c[va>>2]=(c[va>>2]|0)+134217727}f=f+1|0}f=c[V>>2]|0;q=0;A=0;r=c[W>>2]|0;s=1;while(1){if((s|0)>=(B|0))break;K=c[oa+(s*56|0)+4>>2]|0;ta=(K|0)>(f|0);va=c[oa+(s*56|0)+32>>2]|0;ua=(va|0)<(r|0);f=ta?K:f;q=ta?s:q;A=ua?s:A;r=ua?va:r;s=s+1|0}if((r|0)<(f|0)){Sh(e+(q*1300|0)+(M<<2)|0,e+(A*1300|0)+(M<<2)|0,1300-(M<<2)|0)|0;va=oa+(q*56|0)|0;ua=oa+(A*56|0)+28|0;c[va>>2]=c[ua>>2];c[va+4>>2]=c[ua+4>>2];c[va+8>>2]=c[ua+8>>2];c[va+12>>2]=c[ua+12>>2];c[va+16>>2]=c[ua+16>>2];c[va+20>>2]=c[ua+20>>2];c[va+24>>2]=c[ua+24>>2]}if(!(N&(M|0)<(D|0))){va=M-D|0;a[h+va>>0]=(((c[e+(x*1300|0)+544+(u<<2)>>2]|0)>>>9)+1|0)>>>1;ta=c[e+(x*1300|0)+704+(u<<2)>>2]|0;ua=c[k+(u<<2)>>2]|0;K=ua<<16>>16;ua=((R(ta>>16,K)|0)+((R(ta&65535,K)|0)>>16)+(R(ta,(ua>>15)+1>>1)|0)>>7)+1>>1;b[i+(va<<1)>>1]=(ua|0)>32767?32767:((ua|0)>-32768?ua:-32768)&65535;c[d+1280+((c[pa>>2]|0)-D<<2)>>2]=c[e+(x*1300|0)+1024+(u<<2)>>2];c[j+((c[qa>>2]|0)-D<<2)>>2]=c[e+(x*1300|0)+864+(u<<2)>>2]}c[pa>>2]=(c[pa>>2]|0)+1;c[qa>>2]=(c[qa>>2]|0)+1;q=M+16|0;f=0;while(1){if((f|0)>=(B|0))break;c[e+(f*1300|0)+1280>>2]=c[oa+(f*56|0)+12>>2];c[e+(f*1300|0)+1284>>2]=c[oa+(f*56|0)+16>>2];va=c[oa+(f*56|0)+8>>2]|0;c[e+(f*1300|0)+(q<<2)>>2]=va;c[e+(f*1300|0)+704+(c[C>>2]<<2)>>2]=va;va=c[oa+(f*56|0)>>2]|0;c[e+(f*1300|0)+544+(c[C>>2]<<2)>>2]=va;c[e+(f*1300|0)+864+(c[C>>2]<<2)>>2]=c[oa+(f*56|0)+24>>2]<<1;c[e+(f*1300|0)+1024+(c[C>>2]<<2)>>2]=c[oa+(f*56|0)+20>>2];ua=e+(f*1300|0)+1288|0;va=(c[ua>>2]|0)+((va>>9)+1>>1)|0;c[ua>>2]=va;c[e+(f*1300|0)+384+(c[C>>2]<<2)>>2]=va;c[e+(f*1300|0)+1296>>2]=c[oa+(f*56|0)+4>>2];f=f+1|0}c[k+(c[C>>2]<<2)>>2]=na;f=L;M=M+1|0}while(1){if((t|0)>=(B|0))break;f=e+(t*1300|0)|0;q=e+(t*1300|0)+(w<<2)|0;A=f+64|0;do{c[f>>2]=c[q>>2];f=f+4|0;q=q+4|0}while((f|0)<(A|0));t=t+1|0}l=sa;return}function vd(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[a>>2]|0;h=b[d>>1]|0;h=(e>>1)+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-4>>2]|0;f=b[d+2>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-8>>2]|0;h=b[d+4>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-12>>2]|0;f=b[d+6>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-16>>2]|0;h=b[d+8>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-20>>2]|0;f=b[d+10>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-24>>2]|0;h=b[d+12>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-28>>2]|0;f=b[d+14>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;g=c[a+-32>>2]|0;h=b[d+16>>1]|0;h=f+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-36>>2]|0;f=b[d+18>>1]|0;f=h+((R(g>>16,f)|0)+((R(g&65535,f)|0)>>16))|0;if((e|0)!=16){h=f;return h|0}g=c[a+-40>>2]|0;e=b[d+20>>1]|0;e=f+((R(g>>16,e)|0)+((R(g&65535,e)|0)>>16))|0;g=c[a+-44>>2]|0;h=b[d+22>>1]|0;h=e+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-48>>2]|0;e=b[d+24>>1]|0;e=h+((R(g>>16,e)|0)+((R(g&65535,e)|0)>>16))|0;g=c[a+-52>>2]|0;h=b[d+26>>1]|0;h=e+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;g=c[a+-56>>2]|0;e=b[d+28>>1]|0;e=h+((R(g>>16,e)|0)+((R(g&65535,e)|0)>>16))|0;g=c[a+-60>>2]|0;h=b[d+30>>1]|0;h=e+((R(g>>16,h)|0)+((R(g&65535,h)|0)>>16))|0;return h|0}function wd(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;b=yd((a|0)>0?a:0-a|0)|0;a=a<<b+-1;f=a>>16;d=536870911/(f|0)|0;e=d<<16;c=e>>16;a=536870912-((R(f,c)|0)+((R(a&65535,c)|0)>>16))<<3;d=e+((R(a>>16,c)|0)+((R(a&65528,c)|0)>>16))+(R(a,(d>>15)+1>>1)|0)|0;a=62-b|0;b=a+-47|0;if((b|0)>=1)return ((b|0)<32?d>>b:0)|0;a=47-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){f=b;f=f<<a;return f|0}f=(d|0)<(c|0)?c:d;f=f<<a;return f|0}else{if((d|0)>(c|0)){f=c;f=f<<a;return f|0}f=(d|0)<(b|0)?b:d;f=f<<a;return f|0}return 0}function xd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=yd((a|0)>0?a:0-a|0)|0;f=a<<c+-1;a=(yd((b|0)>0?b:0-b|0)|0)+-1|0;b=b<<a;d=(536870911/(b>>16|0)|0)<<16>>16;e=(R(f>>16,d)|0)+((R(f&65535,d)|0)>>16)|0;b=Uh(b|0,((b|0)<0)<<31>>31|0,e|0,((e|0)<0)<<31>>31|0)|0;b=Rh(b|0,C|0,29)|0;b=f-(b&-8)|0;d=e+((R(b>>16,d)|0)+((R(b&65535,d)|0)>>16))|0;a=c+28-a|0;b=a+-16|0;if((a|0)>=16)return ((b|0)<32?d>>b:0)|0;a=16-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){f=b;f=f<<a;return f|0}f=(d|0)<(c|0)?c:d;f=f<<a;return f|0}else{if((d|0)>(c|0)){f=c;f=f<<a;return f|0}f=(d|0)<(b|0)?b:d;f=f<<a;return f|0}return 0}function yd(a){a=a|0;return U(a|0)|0}function zd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=l;l=l+64|0;e=d+32|0;g=d+16|0;f=d+8|0;i=d;Ad(e,b,8);Ad(g,e,4);Ad(f,g,2);Ad(i,f,1);h=c[f>>2]|0;Bd(a,h,c[i>>2]|0,33430);i=c[g>>2]|0;Bd(a,i,h,33278);h=c[e>>2]|0;Bd(a,h,i,33126);Bd(a,c[b>>2]|0,h,32974);Bd(a,c[b+8>>2]|0,c[e+4>>2]|0,32974);h=c[e+8>>2]|0;Bd(a,h,c[g+4>>2]|0,33126);Bd(a,c[b+16>>2]|0,h,32974);Bd(a,c[b+24>>2]|0,c[e+12>>2]|0,32974);h=c[g+8>>2]|0;Bd(a,h,c[f+4>>2]|0,33278);f=c[e+16>>2]|0;Bd(a,f,h,33126);Bd(a,c[b+32>>2]|0,f,32974);Bd(a,c[b+40>>2]|0,c[e+20>>2]|0,32974);f=c[e+24>>2]|0;Bd(a,f,c[g+12>>2]|0,33126);Bd(a,c[b+48>>2]|0,f,32974);Bd(a,c[b+56>>2]|0,c[e+28>>2]|0,32974);l=d;return}function Ad(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=0;while(1){if((e|0)>=(d|0))break;f=e<<1;c[a+(e<<2)>>2]=(c[b+(f<<2)>>2]|0)+(c[b+((f|1)<<2)>>2]|0);e=e+1|0}return}function Bd(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;if((c|0)<=0)return;Rb(a,b,e+(d[33582+c>>0]|0)|0,8);return}function Cd(a){a=a|0;var b=0,d=0;b=a;d=b+112|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=0;while(1){if((b|0)==4){b=0;break}d=b+1|0;c[a+92+(b<<2)>>2]=Dd(50/(d|0)|0)|0;b=d}while(1){if((b|0)==4)break;d=(c[a+92+(b<<2)>>2]|0)*100|0;c[a+60+(b<<2)>>2]=d;c[a+76+(b<<2)>>2]=2147483647/(d|0)|0;b=b+1|0}c[a+108>>2]=15;b=0;while(1){if((b|0)==4)break;c[a+40+(b<<2)>>2]=25600;b=b+1|0}return 0}function Dd(a){a=a|0;return ((a|0)>1?a:1)|0}function Ed(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=l;l=l+48|0;s=v+32|0;u=v+16|0;q=v;r=a+32|0;t=a+4580|0;m=c[t>>2]|0;o=m>>1;h=m>>2;f=m>>3;c[q>>2]=0;g=f+h|0;c[q+4>>2]=g;n=g+f|0;c[q+8>>2]=n;k=n+h|0;c[q+12>>2]=k;p=l;l=l+((1*(k+o<<1)|0)+15&-16)|0;qe(d,r,p,p+(k<<1)|0,m);qe(p,a+40|0,p,p+(n<<1)|0,o);qe(p,a+48|0,p,p+(g<<1)|0,h);h=p+(f+-1<<1)|0;g=b[h>>1]>>1;b[h>>1]=g;h=g;while(1){d=f+-1|0;if((f|0)<=1)break;n=p+(f+-2<<1)|0;o=b[n>>1]>>1;b[n>>1]=o;b[p+(d<<1)>>1]=(h&65535)-(o&65535);f=d;h=o}d=a+88|0;b[p>>1]=(e[p>>1]|0)-(e[d>>1]|0);b[d>>1]=g;d=0;j=0;while(1){if((j|0)==4)break;k=c[t>>2]|0;k=k>>(Fd(4-j|0,3)|0)>>2;m=a+56+(j<<2)|0;g=c[m>>2]|0;n=s+(j<<2)|0;c[n>>2]=g;o=q+(j<<2)|0;h=0;i=0;while(1){if((i|0)==4)break;else{f=0;d=0}while(1){if((f|0)>=(k|0))break;w=b[p+((c[o>>2]|0)+f+h<<1)>>1]>>3;f=f+1|0;d=d+(R(w,w)|0)|0}w=g+(d>>((i|0)>2&1))|0;w=(w|0)<0?2147483647:w;c[n>>2]=w;h=h+k|0;i=i+1|0;g=w}c[m>>2]=d;j=j+1|0}Gd(s,r);f=0;j=0;h=0;while(1){if((j|0)==4)break;d=c[s+(j<<2)>>2]|0;g=c[a+92+(j<<2)>>2]|0;i=d-g|0;if((i|0)>0){w=d>>>0<8388608;d=((w?d<<8:d)|0)/((w?g:g>>8)+1|0)|0;c[u+(j<<2)>>2]=d;d=(ue(d)|0)+-1024|0;g=d<<16>>16;h=h+(R(g,g)|0)|0;if((i|0)<1048576){d=R((Hd(i)|0)<<6>>16,g)|0;d=d+((R((Hd(i)|0)<<6&65472,g)|0)>>16)|0}w=c[19312+(j<<2)>>2]|0;d=d<<16>>16;f=f+((R(w>>16,d)|0)+((R(w&65535,d)|0)>>16))|0;d=h}else{c[u+(j<<2)>>2]=256;d=h}j=j+1|0;h=d}g=(((Hd((h|0)/4|0)|0)*196608>>16)*45e3>>16)+-128|0;c[a+4708>>2]=((Xe(f)|0)<<1)+-32768;f=0;d=0;while(1){if((d|0)==4)break;w=d+1|0;f=f+(R(w,(c[s+(d<<2)>>2]|0)-(c[a+92+(d<<2)>>2]|0)>>4)|0)|0;d=w}d=Xe(g)|0;if((f|0)>=1){if((f|0)<32768){w=(Hd(f<<((c[t>>2]|0)==((c[a+4572>>2]|0)*10|0)?16:15))|0)+32768|0;d=d<<16>>16;d=(R(w>>16,d)|0)+((R(w&65535,d)|0)>>16)|0}}else d=d>>1;c[a+4528>>2]=Fd(d>>7,255)|0;f=d<<16>>16;d=((R(d>>16,f)|0)<<16)+(R(d&65535,f)|0)|0;d=d>>((c[t>>2]|0)==((c[a+4572>>2]|0)*10|0)?21:20);f=0;while(1){if((f|0)==4)break;t=a+72+(f<<2)|0;s=c[t>>2]|0;w=(c[u+(f<<2)>>2]|0)-s|0;w=s+((R(w>>16,d)|0)+((R(w&65535,d)|0)>>16))|0;c[t>>2]=w;c[a+4692+(f<<2)>>2]=Xe(((ue(w)|0)*3|0)+-5120>>4)|0;f=f+1|0}l=v;return}function Fd(a,b){a=a|0;b=b|0;return ((a|0)<(b|0)?a:b)|0}function Gd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;j=b+108|0;d=c[j>>2]|0;if((d|0)<1e3)f=32767/((d>>4)+1|0)|0;else f=0;g=0;while(1){if((g|0)==4)break;i=b+60+(g<<2)|0;e=c[i>>2]|0;d=(c[a+(g<<2)>>2]|0)+(c[b+92+(g<<2)>>2]|0)|0;d=(d|0)<0?2147483647:d;h=2147483647/(d>>>0)|0;if((d|0)<=(e<<3|0))if((d|0)<(e|0))d=1024;else{k=e<<16>>16;l=R(h>>>16,k)|0;k=R(h&65535,k)|0;d=R(h,(e>>15)+1>>1)|0;d=l+(k>>16)+d>>16<<11|(l+(k>>>16)+d|0)>>>5&2047}else d=128;l=Ld(d,f)|0;k=b+76+(g<<2)|0;e=c[k>>2]|0;h=h-e|0;l=l<<16>>16;l=e+((R(h>>16,l)|0)+((R(h&65535,l)|0)>>16))|0;c[k>>2]=l;l=2147483647/(l|0)|0;c[i>>2]=(l|0)<16777215?l:16777215;g=g+1|0}c[j>>2]=(c[j>>2]|0)+1;return}function Hd(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;b=e+4|0;d=e;if((a|0)<1){d=0;l=e;return d|0}Id(a,b,d);b=c[b>>2]|0;b=((b&1|0)==0?46214:32768)>>>(b>>1);d=(R(c[d>>2]<<16>>16,13959168)|0)>>16;d=b+((R(b>>16,d)|0)+((R(b&65535,d)|0)>>16))|0;l=e;return d|0}function Id(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Jd(a)|0;c[b>>2]=e;c[d>>2]=(Kd(a,24-e|0)|0)&127;return}function Jd(a){a=a|0;return U(a|0)|0}function Kd(a,b){a=a|0;b=b|0;if(!b){b=a;return b|0}if((b|0)<0){b=a<<0-b|a>>>(b+32|0);return b|0}else{b=a<<32-b|a>>>b;return b|0}return 0}function Ld(a,b){a=a|0;b=b|0;return ((a|0)>(b|0)?a:b)|0}function Md(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=c[a+4572>>2]|0;f=h<<16>>16;g=f*1e3|0;if(!f){b=c[a+4568>>2]|0;h=c[a+4552>>2]|0;h=(((b|0)<(h|0)?b:h)|0)/1e3|0;return h|0}e=c[a+4552>>2]|0;d=c[a+4560>>2]|0;if(!((g|0)>(e|0)|(g|0)>(d|0))?(g|0)>=(c[a+4564>>2]|0):0){f=a+24|0;d=c[f>>2]|0;if((d|0)>255)c[a+28>>2]=0;if((c[a+4532>>2]|0)==0?(c[b+64>>2]|0)==0:0)return h|0;e=c[a+4568>>2]|0;if((g|0)>(e|0)){e=a+28|0;if(!(c[e>>2]|0)){c[f>>2]=256;d=a+16|0;c[d>>2]=0;c[d+4>>2]=0;d=256}if(c[b+64>>2]|0){c[e>>2]=0;h=(h|0)==16?12:8;return h|0}if((d|0)<1){c[b+88>>2]=1;a=b+56|0;g=c[a>>2]|0;c[a>>2]=g-((g*5|0)/((c[b+24>>2]|0)+5|0)|0);return h|0}else{c[e>>2]=-2;return h|0}}if((g|0)>=(e|0)){d=a+28|0;if((c[d>>2]|0)>=0)return h|0;c[d>>2]=1;return h|0}if(c[b+64>>2]|0){c[f>>2]=0;b=a+16|0;c[b>>2]=0;c[b+4>>2]=0;c[a+28>>2]=1;h=(h|0)==8?12:16;return h|0}d=a+28|0;if(!(c[d>>2]|0)){c[b+88>>2]=1;a=b+56|0;g=c[a>>2]|0;c[a>>2]=g-((g*5|0)/((c[b+24>>2]|0)+5|0)|0);return h|0}else{c[d>>2]=1;return h|0}}b=(e|0)<(d|0)?e:d;h=c[a+4564>>2]|0;h=(((b|0)>(h|0)?b:h)|0)/1e3|0;return h|0}function Nd(d,e,f,g,h,i,j,k,m){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=l;l=l+16|0;E=G+12|0;B=G+8|0;C=G+4|0;D=G;F=0;n=2147483647;s=0;A=0;while(1){if((A|0)==3)break;w=c[18992+(A<<2)>>2]|0;x=c[19004+(A<<2)>>2]|0;y=c[19016+(A<<2)>>2]|0;z=a[30682+A>>0]|0;o=c[g>>2]|0;t=0;p=0;u=j;v=i;s=0;while(1){if((t|0)>=(m|0))break;Od(E+t|0,B,C,D,v,u,x,y,w,k,(ye(5333-o+896|0)|0)+-51|0,z);r=s+(c[B>>2]|0)|0;q=p+(c[C>>2]|0)|0;p=(c[D>>2]|0)+51|0;if((o+(ue(p)|0)|0)<896)o=0;else o=o+(ue(p)|0)+-896|0;t=t+1|0;p=(q|0)<0?2147483647:q;u=u+20|0;v=v+100|0;s=(r|0)<0?2147483647:r}if((p|0)>(n|0))o=F;else{a[f>>0]=A;Sh(e|0,E|0,m|0)|0;n=p}F=o;A=A+1|0}p=c[19004+(a[f>>0]<<2)>>2]|0;o=0;while(1){if((o|0)>=(m|0))break;q=e+o|0;r=o*5|0;n=0;while(1){if((n|0)==5)break;b[d+(r+n<<1)>>1]=a[p+(((a[q>>0]|0)*5|0)+n)>>0]<<7;n=n+1|0}o=o+1|0}c[g>>2]=F;c[h>>2]=R(((ue(s>>((m|0)==2?1:2))|0)<<16)+-125829120>>16,-3)|0;l=G;return}function Od(b,e,f,g,h,i,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;G=c[i>>2]<<7;J=c[i+4>>2]<<7;K=c[i+8>>2]<<7;L=c[i+12>>2]<<7;E=0-(c[i+16>>2]<<7)|0;c[f>>2]=2147483647;c[e>>2]=2147483647;a[b>>0]=0;r=h+4|0;s=h+8|0;t=h+12|0;u=h+16|0;v=h+28|0;w=h+32|0;x=h+36|0;y=h+24|0;z=h+52|0;A=h+56|0;B=h+48|0;C=h+76|0;D=h+72|0;E=E<<1;F=h+96|0;q=m<<16>>16;i=0;while(1){if((i|0)>=(o|0))break;p=d[k+i>>0]|0;P=a[j+1>>0]|0;M=(R(c[r>>2]|0,P)|0)-G|0;O=a[j+2>>0]|0;M=M+(R(c[s>>2]|0,O)|0)|0;N=a[j+3>>0]|0;M=M+(R(c[t>>2]|0,N)|0)|0;m=a[j+4>>0]|0;M=M+(R(c[u>>2]|0,m)|0)<<1;Q=a[j>>0]|0;M=M+(R(c[h>>2]|0,Q)|0)|0;Q=(R(M>>16,Q)|0)+((R(M&65535,Q)|0)>>16)+32801|0;M=(R(c[v>>2]|0,O)|0)-J|0;M=M+(R(c[w>>2]|0,N)|0)|0;M=M+(R(c[x>>2]|0,m)|0)<<1;M=M+(R(c[y>>2]|0,P)|0)|0;P=Q+((R(M>>16,P)|0)+((R(M&65535,P)|0)>>16))|0;M=(R(c[z>>2]|0,N)|0)-K|0;M=M+(R(c[A>>2]|0,m)|0)<<1;M=M+(R(c[B>>2]|0,O)|0)|0;O=P+((R(M>>16,O)|0)+((R(M&65535,O)|0)>>16))|0;M=(R(c[C>>2]|0,m)|0)-L<<1;M=M+(R(c[D>>2]|0,N)|0)|0;N=O+((R(M>>16,N)|0)+((R(M&65535,N)|0)>>16))|0;M=E+(R(c[F>>2]|0,m)|0)|0;m=N+((R(M>>16,m)|0)+((R(M&65535,m)|0)>>16))|0;if((m|0)>-1?(H=m+((p|0)>(n|0)?p-n<<11:0)|0,I=R(q,((ue(H)|0)<<16)+-125829120>>16)|0,I=I+(d[l+i>>0]<<2)|0,(I|0)<=(c[f>>2]|0)):0){c[f>>2]=I;c[e>>2]=H;a[b>>0]=i;c[g>>2]=p}j=j+5|0;i=i+1|0}return}function Pd(b){b=b|0;var d=0,e=0,f=0,g=0;if((a[b+4537>>0]|0)!=2)return;e=R(c[b+4572>>2]|0,65536e3)|0;e=(ue((e|0)/(c[b+4540>>2]|0)|0)|0)+-2048|0;d=c[b+4692>>2]|0;g=0-d<<2;d=d<<16>>16;f=R(g>>16,d)|0;d=R(g&65532,d)|0;g=R(f+(d>>16)>>16,e-((ue(3932160)|0)+63488)<<16>>16)|0;e=e+(g+((R(f+(d>>>16)&65535,e-((ue(3932160)|0)+63488)<<16>>16)|0)>>16))|0;d=b+8|0;f=c[d>>2]|0;e=e-(f>>8)|0;e=(e|0)<0?e*3|0:e;e=R(c[b+4528>>2]<<16>>16,(e|0)>51?51:((e|0)>-51?e:-51)<<16>>16)|0;c[d>>2]=f+(((e>>16)*6554|0)+(((e&65535)*6554|0)>>>16));e=(ue(60)|0)<<8;e=(e|0)>((ue(100)|0)<<8|0);b=c[d>>2]|0;do if(e){if((b|0)>((ue(60)|0)<<8|0)){b=(ue(60)|0)<<8;break}g=c[d>>2]|0;if((g|0)<((ue(100)|0)<<8|0)){b=(ue(100)|0)<<8;break}else{b=c[d>>2]|0;break}}else{if((b|0)>((ue(100)|0)<<8|0)){b=(ue(100)|0)<<8;break}g=c[d>>2]|0;if((g|0)<((ue(60)|0)<<8|0)){b=(ue(60)|0)<<8;break}else{b=c[d>>2]|0;break}}while(0);c[d>>2]=b;return}function Qd(f,g,h,i,j,k,m){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;J=l;l=l+128|0;G=J;H=J+72|0;I=J+40|0;u=J+104|0;v=J+8|0;w=h+2|0;Ge(g,c[h+36>>2]|0,b[w>>1]|0);z=b[h>>1]|0;A=l;l=l+((1*((z&65535)<<2)|0)+15&-16)|0;x=h+8|0;y=h+12|0;Td(A,g,c[x>>2]|0,c[y>>2]|0,z<<16>>16,b[w>>1]|0);z=l;l=l+((1*(k<<2)|0)+15&-16)|0;Ye(A,z,b[h>>1]|0,k);A=l;l=l+((1*(k<<2)|0)+15&-16)|0;B=l;l=l+((1*(k<<4)|0)+15&-16)|0;C=h+32|0;D=h+4|0;E=h+6|0;F=h+16|0;r=m>>1;s=j<<14>>16;q=0;while(1){if((q|0)>=(k|0))break;t=c[z+(q<<2)>>2]|0;n=b[w>>1]|0;p=R(t,n)|0;o=(c[x>>2]|0)+p|0;p=(c[y>>2]|0)+(p<<1)|0;m=0;while(1){if((m|0)>=(n|0))break;K=b[p+(m<<1)>>1]|0;b[H+(m<<1)>>1]=(R((e[g+(m<<1)>>1]|0)-(d[o+m>>0]<<7)<<16>>16,K)|0)>>>14;b[I+(m<<1)>>1]=Rd(b[i+(m<<1)>>1]|0,R(K,K)|0)|0;m=m+1|0}Ud(v,u,h,t);n=Vd(B+(q<<4)|0,H,I,u,v,c[C>>2]|0,b[D>>1]|0,b[E>>1]|0,j,b[w>>1]|0)|0;o=A+(q<<2)|0;c[o>>2]=n;p=(c[F>>2]|0)+(R(r,b[h>>1]|0)|0)|0;if(!t)m=256;else m=d[p+(t+-1)>>0]|0;c[o>>2]=n+(R(1024-(ue(m-(d[p+t>>0]|0)|0)|0)<<16>>16,s)|0);q=q+1|0}Ye(A,G,k,1);K=c[G>>2]|0;a[f>>0]=c[z+(K<<2)>>2];Sh(f+1|0,B+(K<<4)|0,b[w>>1]|0)|0;hd(g,f,h);l=J;return}function Rd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=Sd((a|0)>0?a:0-a|0)|0;f=a<<c+-1;a=(Sd((b|0)>0?b:0-b|0)|0)+-1|0;b=b<<a;d=(536870911/(b>>16|0)|0)<<16>>16;e=(R(f>>16,d)|0)+((R(f&65535,d)|0)>>16)|0;b=Uh(b|0,((b|0)<0)<<31>>31|0,e|0,((e|0)<0)<<31>>31|0)|0;b=Rh(b|0,C|0,29)|0;b=f-(b&-8)|0;d=e+((R(b>>16,d)|0)+((R(b&65535,d)|0)>>16))|0;a=c+28-a|0;b=a+-21|0;if((a|0)>=21)return ((b|0)<32?d>>b:0)|0;a=21-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){f=b;f=f<<a;return f|0}f=(d|0)<(c|0)?c:d;f=f<<a;return f|0}else{if((d|0)>(c|0)){f=c;f=f<<a;return f|0}f=(d|0)<(b|0)?b:d;f=f<<a;return f|0}return 0}function Sd(a){a=a|0;return U(a|0)|0}function Td(a,f,g,h,i,j){a=a|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;m=0;while(1){if((m|0)<(i|0)){k=0;l=0;o=j}else break;while(1){n=o+-2|0;if((n|0)<=-1)break;r=o+-1|0;r=R((e[f+(r<<1)>>1]|0)-(d[g+r>>0]<<7)<<16>>16,b[h+(r<<1)>>1]|0)|0;s=k>>1;p=R((e[f+(n<<1)>>1]|0)-(d[g+n>>0]<<7)<<16>>16,b[h+(n<<1)>>1]|0)|0;q=r>>1;k=p;l=l+((r|0)>(s|0)?r-s|0:s-r|0)+((p|0)>(q|0)?p-q|0:q-p|0)|0;o=n}c[a+(m<<2)>>2]=l;g=g+j|0;h=h+(j<<1)|0;m=m+1|0}return}function Ud(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;j=f+2|0;h=b[j>>1]|0;i=f+20|0;f=(c[f+24>>2]|0)+((R(h<<16>>16,g)|0)/2|0)|0;g=0;while(1){if((g|0)>=(h<<16>>16|0))break;l=a[f>>0]|0;k=l&255;b[d+(g<<1)>>1]=(k>>>1&7)*9;a[e+g>>0]=a[(c[i>>2]|0)+(g+((b[j>>1]|0)+-1&0-(l&1)))>>0]|0;h=g|1;b[d+(h<<1)>>1]=((l&255)>>>5)*9&255;a[e+h>>0]=a[(c[i>>2]|0)+(g+((b[j>>1]|0)+-1&0-(k>>>4&1))+1)>>0]|0;f=f+1|0;g=g+2|0;h=b[j>>1]|0}return}function Vd(e,f,g,h,i,j,k,m,n,o){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;J=l;l=l+320|0;B=J+224|0;I=J+256|0;C=J+240|0;H=J+192|0;D=J+176|0;E=J+160|0;F=J+80|0;G=J;r=k<<16>>16;q=-10;while(1){if((q|0)==10)break;k=q<<10;p=k+1024|0;a:do if((q|0)>0){p=(p<<16>>16)+-102|0;k=(q<<26>>16)+-102|0}else{switch(q|0){case 0:{p=(p<<16>>16)+-102|0;break a}case -1:{k=-1024;break}default:p=p|102}k=k|102}while(0);A=q+10|0;c[F+(A<<2)>>2]=(R(k<<16>>16,r)|0)>>16;c[G+(A<<2)>>2]=(R(p<<16>>16,r)|0)>>16;q=q+1|0}c[H>>2]=0;b[C>>1]=0;A=o<<16>>16;z=m<<16>>16;y=n<<16>>16;q=1;k=A;b:while(1){x=(q|0)<3;p=k;c:while(1){k=p+-1|0;if((p|0)<=0){q=0;r=2147483647;k=0;break b}m=j+(b[i+(k<<1)>>1]|0)|0;n=b[f+(k<<1)>>1]|0;s=h+k|0;t=g+(k<<1)|0;r=0;while(1){if((r|0)>=(q|0))break;w=C+(r<<1)|0;v=(R(d[s>>0]|0,b[w>>1]|0)|0)>>8;p=(R(z,n-v<<16>>16)|0)>>16;p=(p|0)>9?9:(p|0)>-10?p:-10;a[I+(r<<4)+k>>0]=p;o=p+10|0;u=(c[F+(o<<2)>>2]|0)+v|0;v=(c[G+(o<<2)>>2]|0)+v|0;b[w>>1]=u;w=r+q|0;b[C+(w<<1)>>1]=v;do if((p|0)>2)if((p|0)==3){o=280;p=d[m+7>>0]|0;break}else{p=p*43|0;o=p+151|0;p=p+108|0;break}else{if((p|0)>=-3){o=d[m+(p+5)>>0]|0;p=d[m+(p+4)>>0]|0;break}if((p|0)==-4){o=d[m+1>>0]|0;p=280;break}else{p=R(p,-43)|0;o=p+65|0;p=p+108|0;break}}while(0);L=H+(r<<2)|0;K=c[L>>2]|0;M=n-u<<16>>16;M=R(M,M)|0;u=b[t>>1]|0;c[L>>2]=K+(R(M,u)|0)+(R(y,p<<16>>16)|0);v=n-v<<16>>16;c[H+(w<<2)>>2]=K+(R(R(v,v)|0,u)|0)+(R(y,o<<16>>16)|0);r=r+1|0}if(x){p=0;break}else t=0;while(1){if((t|0)==4)break;o=H+(t<<2)|0;p=c[o>>2]|0;r=t+4|0;m=H+(r<<2)|0;s=c[m>>2]|0;n=E+(t<<2)|0;if((p|0)>(s|0)){c[n>>2]=p;c[o>>2]=s;c[m>>2]=p;L=C+(t<<1)|0;M=b[L>>1]|0;p=C+(r<<1)|0;b[L>>1]=b[p>>1]|0;b[p>>1]=M;p=s}else{c[n>>2]=s;r=t}c[D+(t<<2)>>2]=p;c[B+(t<<2)>>2]=r;t=t+1|0}while(1){p=0;r=2147483647;o=0;n=0;m=0;while(1){if((m|0)==4)break;K=c[E+(m<<2)>>2]|0;M=(r|0)>(K|0);w=c[D+(m<<2)>>2]|0;L=(p|0)<(w|0);p=L?w:p;r=M?K:r;o=L?m:o;n=M?m:n;m=m+1|0}if((r|0)>=(p|0)){p=0;break}c[B+(o<<2)>>2]=c[B+(n<<2)>>2]^4;p=n+4|0;c[H+(o<<2)>>2]=c[H+(p<<2)>>2];b[C+(o<<1)>>1]=b[C+(p<<1)>>1]|0;c[D+(o<<2)>>2]=0;c[E+(n<<2)>>2]=2147483647;o=I+(o<<4)|0;p=I+(n<<4)|0;r=o+16|0;do{a[o>>0]=a[p>>0]|0;o=o+1|0;p=p+1|0}while((o|0)<(r|0))}while(1){if((p|0)==4){p=k;continue c}M=I+(p<<4)+k|0;a[M>>0]=(d[M>>0]|0)+((c[B+(p<<2)>>2]|0)>>>2);p=p+1|0}}while(1){if((p|0)>=(q|0))break;a[I+(p+q<<4)+k>>0]=(d[I+(p<<4)+k>>0]|0)+1;p=p+1|0}q=q<<1;p=q;while(1){if((p|0)>=4)continue b;a[I+(p<<4)+k>>0]=a[I+(p-q<<4)+k>>0]|0;p=p+1|0}}while(1){if((k|0)==8)break;M=c[H+(k<<2)>>2]|0;L=(r|0)>(M|0);q=L?k:q;r=L?M:r;k=k+1|0}p=q&3;k=0;while(1){if((k|0)>=(A|0))break;a[e+k>>0]=a[I+(p<<4)+k>>0]|0;k=k+1|0}a[e>>0]=(d[e>>0]|0)+(q>>>2);l=J;return r|0}function Wd(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+96|0;p=q+64|0;n=q+32|0;k=q;m=c[d+4528>>2]<<16>>16;m=(R(m,-5)|0)+(m*59246>>16)+3146|0;m=m+((c[d+4576>>2]|0)==2?m>>1:0)|0;o=d+4636|0;Je(n,f,c[o>>2]|0);a:do if((c[d+4628>>2]|0)==1?(h=d+4763|0,i=a[h>>0]|0,i<<24>>24<4):0){ed(p,g,f,i<<24>>24,c[o>>2]|0);Je(k,p,c[o>>2]|0);j=a[h>>0]|0;j=(R(j,j)|0)<<27;i=c[o>>2]|0;j=j>>16;h=0;while(1){if((h|0)>=(i|0)){j=1;break a}r=n+(h<<1)|0;b[r>>1]=((b[r>>1]|0)>>>1)+((R(b[k+(h<<1)>>1]|0,j)|0)>>>16);h=h+1|0}}else j=0;while(0);Qd(d+4740|0,f,c[d+4688>>2]|0,n,m,c[d+4656>>2]|0,a[d+4761>>0]|0);h=e+32|0;Ee(h,f,c[o>>2]|0);i=c[o>>2]|0;if(j){ed(p,g,f,a[d+4763>>0]|0,i);Ee(e,p,c[o>>2]|0);l=q;return}else{Sh(e|0,h|0,i<<1|0)|0;l=q;return}}function Xd(d,f,g,h,i,j,k,m,n,o,p){d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;C=l;l=l+16|0;z=C+8|0;w=C+4|0;x=C;A=f+-4|0;r=p+2|0;B=l;l=l+((1*(r<<1)|0)+15&-16)|0;q=0;while(1){if((q|0)>=(r|0))break;y=q+-2|0;u=b[f+(y<<1)>>1]|0;y=b[g+(y<<1)>>1]|0;v=u+y|0;y=u-y|0;b[A+(q<<1)>>1]=(v>>>1)+(v&1);y=(y>>1)+(y&1)|0;b[B+(q<<1)>>1]=(y|0)>32767?32767:((y|0)>-32768?y:-32768)&65535;q=q+1|0}v=d+4|0;t=e[v>>1]|e[v+2>>1]<<16;b[A>>1]=t;b[A+2>>1]=t>>>16;t=d+8|0;r=e[t>>1]|e[t+2>>1]<<16;c[B>>2]=r;q=A+(p<<1)|0;q=e[q>>1]|e[q+2>>1]<<16;b[v>>1]=q;b[v+2>>1]=q>>>16;v=B+(p<<1)|0;v=e[v>>1]|e[v+2>>1]<<16;b[t>>1]=v;b[t+2>>1]=v>>>16;t=l;l=l+((1*(p<<1)|0)+15&-16)|0;v=l;l=l+((1*(p<<1)|0)+15&-16)|0;q=0;while(1){if((q|0)>=(p|0))break;y=q+1|0;s=b[A+(y<<1)>>1]|0;u=((b[A+(q<<1)>>1]|0)+(b[A+(q+2<<1)>>1]|0)+(s<<16>>16<<1)>>1)+1>>1;b[t+(q<<1)>>1]=u;b[v+(q<<1)>>1]=(s&65535)-u;q=y}s=l;l=l+((1*(p<<1)|0)+15&-16)|0;u=l;l=l+((1*(p<<1)|0)+15&-16)|0;f=0;q=r&65535;while(1){if((f|0)>=(p|0))break;r=f+1|0;y=b[B+(r<<1)>>1]|0;D=((q<<16>>16)+(b[B+(f+2<<1)>>1]|0)+(y<<16>>16<<1)>>1)+1>>1;b[s+(f<<1)>>1]=D;b[u+(f<<1)>>1]=(y&65535)-D;f=r;q=y}r=(o*10|0)==(p|0);y=r?328:655;m=m<<16>>16;m=R(m,m)|0;m=(R(m>>>16,y)|0)+((R(m&65535,y)|0)>>>16)|0;y=df(w,t,s,d+12|0,p,m)|0;c[z>>2]=y;t=df(x,v,u,d+20|0,p,m)|0;v=z+4|0;c[v>>2]=t;s=(c[x>>2]|0)+((c[w>>2]<<16>>16)*3|0)|0;s=(s|0)<65536?s:65536;u=k-(r?1200:600)|0;u=(u|0)>1?u:1;r=((o<<16>>16)*900|0)+2e3|0;q=s*3|0;f=Yd(u,q+851968|0,19)|0;c[j>>2]=f;if((f|0)<(r|0)){c[j>>2]=r;k=u-r|0;c[j+4>>2]=k;D=r<<16>>16;q=Yd((k<<1)-r|0,(R(q+65536>>16,D)|0)+((R(q&65535,D)|0)>>16)|0,16)|0;if((q|0)>16384)q=16384;else q=(q|0)>0?q:0}else{c[j+4>>2]=u-f;q=16384}f=d+28|0;x=b[f>>1]|0;k=x&65535;D=m<<16>>16;b[f>>1]=k+((R(q-(x<<16>>16)>>16,D)|0)+((R(q-k&65535,D)|0)>>>16));a[i>>0]=0;a:do if(!n){q=u<<3;do if(!(b[d+30>>1]|0)){if((q|0)>=(r*13|0)){q=b[f>>1]|0;D=q<<16>>16;if(((R(s>>16,D)|0)+((R(s&65535,D)|0)>>16)|0)>=819){q=b[f>>1]|0;break}}else q=b[f>>1]|0;q=q<<16>>16;c[z>>2]=(R(q,y<<16>>16)|0)>>14;c[v>>2]=(R(q,t<<16>>16)|0)>>14;lf(z,h);c[z>>2]=0;c[v>>2]=0;c[j>>2]=u;c[j+4>>2]=0;a[i>>0]=1;q=0;r=30;break a}else{if((q|0)>=(r*11|0)){q=b[f>>1]|0;D=q<<16>>16;if(((R(s>>16,D)|0)+((R(s&65535,D)|0)>>16)|0)>=328)break}else q=b[f>>1]|0;q=q<<16>>16;c[z>>2]=(R(q,y<<16>>16)|0)>>14;c[v>>2]=(R(q,t<<16>>16)|0)>>14;lf(z,h);c[z>>2]=0;c[v>>2]=0;q=0;r=29;break a}while(0);if(q<<16>>16>15565){lf(z,h);q=16384;r=29;break}else{q=q<<16>>16;c[z>>2]=(R(q,y<<16>>16)|0)>>14;c[v>>2]=(R(q,t<<16>>16)|0)>>14;lf(z,h);q=b[f>>1]|0;r=29;break}}else{c[z>>2]=0;c[v>>2]=0;lf(z,h);q=0;r=29}while(0);if((r|0)==29)if((a[i>>0]|0)==1)r=30;else{b[d+32>>1]=0;r=34}do if((r|0)==30){f=d+32|0;D=(e[f>>1]|0)+(p-(o<<3))|0;b[f>>1]=D;if((D<<16>>16|0)<(o*5|0)){a[i>>0]=0;f=q;r=35;break}else{b[f>>1]=1e4;r=34;break}}while(0);if((r|0)==34)if(!(a[i>>0]|0)){f=q;r=35}if((r|0)==35){q=j+4|0;if((c[q>>2]|0)<1){c[q>>2]=1;c[j>>2]=Zd(u+-1|0)|0;q=f}else q=f}t=b[d>>1]|0;y=d+2|0;s=b[y>>1]|0;n=d+30|0;u=b[n>>1]|0;r=u<<16>>16;f=o<<3;k=c[z>>2]|0;m=(65536/(f|0)|0)<<16>>16;w=((R(k-(t&65535)<<16>>16,m)|0)>>15)+1>>1;x=c[v>>2]|0;v=((R(x-(s&65535)<<16>>16,m)|0)>>15)+1>>1;m=(R(q-r>>16,m)|0)+((R(q-(u&65535)&65535,m)|0)>>16)<<10;r=r<<10;s=0-(s<<16>>16)|0;t=0-(t<<16>>16)|0;u=0;while(1){if((u|0)>=(f|0))break;z=t-w|0;o=s-v|0;j=r+m|0;D=u+1|0;h=b[A+(D<<1)>>1]|0;F=(b[A+(u<<1)>>1]|0)+(b[A+(u+2<<1)>>1]|0)+(h<<1)|0;G=b[B+(D<<1)>>1]|0;E=z<<16>>16;i=o<<16>>16;i=((R(j>>16,G)|0)+((R(j&64512,G)|0)>>16)+((R(F>>7,E)|0)+((R(F<<9&65024,E)|0)>>16))+((R(h>>5,i)|0)+((R(h<<11&63488,i)|0)>>16))>>7)+1>>1;b[g+(u+-1<<1)>>1]=(i|0)>32767?32767:((i|0)>-32768?i:-32768)&65535;r=j;s=o;t=z;u=D}r=q>>6;s=q<<10&64512;t=0-k<<16>>16;u=0-x<<16>>16;while(1){if((f|0)>=(p|0))break;G=f+1|0;F=b[A+(G<<1)>>1]|0;E=(b[A+(f<<1)>>1]|0)+(b[A+(f+2<<1)>>1]|0)+(F<<1)|0;D=b[B+(G<<1)>>1]|0;F=((R(r,D)|0)+((R(s,D)|0)>>16)+((R(E>>7,t)|0)+((R(E<<9&65024,t)|0)>>16))+((R(F>>5,u)|0)+((R(F<<11&63488,u)|0)>>16))>>7)+1>>1;b[g+(f+-1<<1)>>1]=(F|0)>32767?32767:((F|0)>-32768?F:-32768)&65535;f=G}b[d>>1]=k;b[y>>1]=x;b[n>>1]=q;l=C;return}function Yd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=_d((a|0)>0?a:0-a|0)|0;g=a<<e+-1;a=(_d((b|0)>0?b:0-b|0)|0)+-1|0;b=b<<a;d=(536870911/(b>>16|0)|0)<<16>>16;f=(R(g>>16,d)|0)+((R(g&65535,d)|0)>>16)|0;b=Uh(b|0,((b|0)<0)<<31>>31|0,f|0,((f|0)<0)<<31>>31|0)|0;b=Rh(b|0,C|0,29)|0;b=g-(b&-8)|0;d=f+((R(b>>16,d)|0)+((R(b&65535,d)|0)>>16))|0;a=e+28-a-c|0;if((a|0)>=0)return ((a|0)<32?d>>a:0)|0;a=0-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){g=b;g=g<<a;return g|0}g=(d|0)<(c|0)?c:d;g=g<<a;return g|0}else{if((d|0)>(c|0)){g=c;g=g<<a;return g|0}g=(d|0)<(b|0)?b:d;g=g<<a;return g|0}return 0}function Zd(a){a=a|0;return ((a|0)>1?a:1)|0}function _d(a){a=a|0;return U(a|0)|0}function $d(a){a=a|0;var b=0,d=0,e=0;b=c[a+8>>2]|0;a:do if((b|0)<24e3){if((b|0)<12e3)switch(b|0){case 8e3:{d=2;break a}default:{b=-102;break a}}if((b|0)<16e3)switch(b|0){case 12e3:{d=2;break a}default:{b=-102;break a}}else switch(b|0){case 16e3:{d=2;break a}default:{b=-102;break a}}}else if((b|0)<44100)if((b|0)<32e3)switch(b|0){case 24e3:{d=2;break a}default:{b=-102;break a}}else switch(b|0){case 32e3:{d=2;break a}default:{b=-102;break a}}else if((b|0)<48e3)switch(b|0){case 44100:{d=2;break a}default:{b=-102;break a}}else switch(b|0){case 48e3:{d=2;break a}default:{b=-102;break a}}while(0);b:do if((d|0)==2){b=c[a+20>>2]|0;c:do if((b|0)>=12e3)if((b|0)<16e3)switch(b|0){case 12e3:break c;default:{b=-102;break b}}else switch(b|0){case 16e3:break c;default:{b=-102;break b}}else switch(b|0){case 8e3:break;default:{b=-102;break b}}while(0);d=c[a+12>>2]|0;d:do if((d|0)>=12e3)if((d|0)<16e3)switch(d|0){case 12e3:break d;default:{b=-102;break b}}else switch(d|0){case 16e3:break d;default:{b=-102;break b}}else switch(d|0){case 8e3:break;default:{b=-102;break b}}while(0);e=c[a+16>>2]|0;e:do if((e|0)>=12e3)if((e|0)<16e3)switch(e|0){case 12e3:break e;default:{b=-102;break b}}else switch(e|0){case 16e3:break e;default:{b=-102;break b}}else switch(e|0){case 8e3:break;default:{b=-102;break b}}while(0);if(!((e|0)>(b|0)|(d|0)<(b|0)|(e|0)>(d|0))){switch(c[a+24>>2]|0){case 60:case 40:case 20:case 10:break;default:{b=-103;break b}}if((c[a+32>>2]|0)>>>0<=100)if((c[a+48>>2]|0)>>>0<=1)if((c[a+52>>2]|0)>>>0<=1)if((c[a+40>>2]|0)>>>0<=1){b=c[a>>2]|0;if((b+-1|0)>>>0<=1?(e=c[a+4>>2]|0,!((e+-1|0)>>>0>1|(e|0)>(b|0))):0)return ((c[a+36>>2]|0)>>>0>10?-106:0)|0;else b=-111}else b=-107;else b=-109;else b=-108;else b=-105}else b=-102}while(0);return b|0}function ae(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0;e=(d|0)>8e4?8e4:(d|0)>5e3?d:5e3;d=a+4604|0;if((e|0)==(c[d>>2]|0))return;c[d>>2]=e;g=c[a+4572>>2]|0;g=(g|0)==8?19108:(g|0)==12?19140:19172;e=(c[a+4576>>2]|0)==2?e+-2200|0:e;d=1;while(1){if((d|0)>=8){h=7;break}f=c[g+(d<<2)>>2]|0;if((e|0)<=(f|0))break;d=d+1|0}if((h|0)==7)return;h=d+-1|0;g=c[g+(h<<2)>>2]|0;h=b[28128+(h<<1)>>1]|0;c[a+4712>>2]=(h<<6)+(R((e-g<<6|0)/(f-g|0)|0,(b[28128+(d<<1)>>1]|0)-h|0)|0);return}function be(a,b){a=a|0;b=b|0;Qh(a|0,0,10060)|0;c[a+5088>>2]=b;b=((ue(3932160)|0)<<8)+-524288|0;c[a+8>>2]=b;c[a+12>>2]=b;c[a+4660>>2]=1;return Cd(a+32|0)|0}function ce(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;c[a+6072>>2]=c[b+48>>2];c[a+4672>>2]=c[b+52>>2];g=c[b+8>>2]|0;c[a+4552>>2]=g;c[a+4560>>2]=c[b+12>>2];c[a+4564>>2]=c[b+16>>2];c[a+4568>>2]=c[b+20>>2];c[a+6084>>2]=c[b+40>>2];c[a+5748>>2]=c[b>>2];c[a+5752>>2]=c[b+4>>2];c[a+4532>>2]=d;c[a+5756>>2]=e;d=a+4664|0;if(c[d>>2]|0?(c[a+4676>>2]|0)==0:0){if((g|0)==(c[a+4556>>2]|0)){a=0;return a|0}d=c[a+4572>>2]|0;if((d|0)<=0){a=0;return a|0}a=de(a,d)|0;return a|0}g=Md(a,b)|0;f=(f|0)==0?g:f;g=de(a,f)|0;f=g+(ee(a,f,c[b+24>>2]|0)|0)|0;f=f+(fe(a,c[b+36>>2]|0)|0)|0;c[a+4612>>2]=c[b+32>>2];a=f+(ge(a,c[b+44>>2]|0)|0)|0;c[d>>2]=1;return a|0}function de(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;h=l;l=l+304|0;d=h;e=a+4572|0;f=c[e>>2]|0;if((f|0)==(b|0)?(g=a+4552|0,(c[a+4556>>2]|0)==(c[g>>2]|0)):0){f=0;e=g;e=c[e>>2]|0;g=a+4556|0;c[g>>2]=e;l=h;return f|0}if(!f){e=a+4552|0;g=Me(a+5772|0,c[e>>2]|0,b*1e3|0,1)|0;e=c[e>>2]|0;f=a+4556|0;c[f>>2]=e;l=h;return g|0}else{n=((c[a+4576>>2]|0)*10|0)+5|0;g=R(n,f)|0;j=R(n,b)|0;i=fa()|0;k=l;l=l+((1*(((g|0)>(j|0)?g:j)<<1)|0)+15&-16)|0;m=a+7176|0;je(k,m,g);f=a+4552|0;e=Me(d,(c[e>>2]<<16>>16)*1e3|0,c[f>>2]|0,0)|0;n=R(n,(c[f>>2]|0)/1e3|0)|0;o=l;l=l+((1*(n<<1)|0)+15&-16)|0;Ne(d,o,k,g);d=a+5772|0;g=Me(d,c[f>>2]|0,(b<<16>>16)*1e3|0,1)|0;Ne(d,k,o,n);ke(m,k,j);ha(i|0);g=e+g|0;e=f;e=c[e>>2]|0;f=a+4556|0;c[f>>2]=e;l=h;return g|0}return 0}function ee(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=b+4608|0;if((c[k>>2]|0)==(e|0)){f=b+4572|0;h=0;g=f;f=c[f>>2]|0}else{f=(e|0)==10;a:do if(!f){switch(e|0){case 60:case 40:case 20:{h=0;break}default:if((e|0)<11){h=-103;j=6;break a}else h=-103}c[b+5740>>2]=(e|0)/20|0;c[b+4576>>2]=4;g=d<<16>>16;c[b+4580>>2]=g*20;c[b+4544>>2]=g*24;g=b+4572|0;f=c[g>>2]|0;i=b+4684|0;if((f|0)==8){c[i>>2]=32570;f=8;break}else{c[i>>2]=32536;break}}else{h=0;j=6}while(0);do if((j|0)==6){c[b+5740>>2]=1;c[b+4576>>2]=f?2:1;g=d<<16>>16;c[b+4580>>2]=R(e<<16>>16,g)|0;c[b+4544>>2]=g*14;g=b+4572|0;f=c[g>>2]|0;i=b+4684|0;if((f|0)==8){c[i>>2]=32593;f=8;break}else{c[i>>2]=32581;break}}while(0);c[k>>2]=e;c[b+4604>>2]=0}if((f|0)==(d|0))return h|0;k=b+7164|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;j=b+16|0;c[j>>2]=0;c[j+4>>2]=0;c[b+5736>>2]=0;c[b+5744>>2]=0;c[b+4604>>2]=0;Qh(b+144|0,0,4384)|0;c[b+4540>>2]=100;c[b+4660>>2]=1;a[k>>0]=10;c[b+4472>>2]=100;c[b+4488>>2]=65536;a[b+4537>>0]=0;c[g>>2]=d;k=c[b+4576>>2]|0;j=(k|0)==4;c[b+4684>>2]=(d|0)==8?(j?32570:32593):j?32536:32581;j=(d|4|0)==12;c[b+4636>>2]=j?10:16;c[b+4688>>2]=j?19028:19068;c[b+4584>>2]=d*5;c[b+4580>>2]=R(d*327680>>16,k<<16>>16)|0;j=d<<16;e=j>>16;c[b+4588>>2]=e*20;c[b+4592>>2]=j>>15;c[b+4548>>2]=e*18;c[b+4544>>2]=R(e,(k|0)==4?24:14)|0;c[b+4680>>2]=(d|0)==16?32468:(d|0)==12?32462:32453;return h|0}function fe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;do if((b|0)>=1){if((b|0)==1){c[a+4640>>2]=1;c[a+4648>>2]=49807;f=a+4644|0;c[f>>2]=8;c[a+4632>>2]=14;e=c[a+4572>>2]|0;d=e*5|0;c[a+4596>>2]=d;c[a+4624>>2]=1;c[a+4628>>2]=0;c[a+4656>>2]=3;g=0;h=8;break}if((b|0)<3){c[a+4640>>2]=0;c[a+4648>>2]=52429;f=a+4644|0;c[f>>2]=6;c[a+4632>>2]=12;e=c[a+4572>>2]|0;d=e*3|0;c[a+4596>>2]=d;c[a+4624>>2]=2;c[a+4628>>2]=0;c[a+4656>>2]=2;g=0;h=6;break}if((b|0)==3){c[a+4640>>2]=1;c[a+4648>>2]=49807;f=a+4644|0;c[f>>2]=8;c[a+4632>>2]=14;e=c[a+4572>>2]|0;d=e*5|0;c[a+4596>>2]=d;c[a+4624>>2]=2;c[a+4628>>2]=0;c[a+4656>>2]=4;g=0;h=8;break}if((b|0)<6){c[a+4640>>2]=1;c[a+4648>>2]=48497;f=a+4644|0;c[f>>2]=10;c[a+4632>>2]=16;e=c[a+4572>>2]|0;d=e*5|0;c[a+4596>>2]=d;c[a+4624>>2]=2;c[a+4628>>2]=1;c[a+4656>>2]=6;g=e*983|0;h=10;break}e=c[a+4572>>2]|0;d=a+4640|0;if((b|0)<8){c[d>>2]=1;c[a+4648>>2]=47186;f=a+4644|0;c[f>>2]=12;c[a+4632>>2]=20;d=e*5|0;c[a+4596>>2]=d;c[a+4624>>2]=3;c[a+4628>>2]=1;c[a+4656>>2]=8;g=e*983|0;h=12;break}else{c[d>>2]=2;c[a+4648>>2]=45875;f=a+4644|0;c[f>>2]=16;c[a+4632>>2]=24;d=e*5|0;c[a+4596>>2]=d;c[a+4624>>2]=4;c[a+4628>>2]=1;c[a+4656>>2]=16;g=e*983|0;h=16;break}}else{c[a+4640>>2]=0;c[a+4648>>2]=52429;f=a+4644|0;c[f>>2]=6;c[a+4632>>2]=12;e=c[a+4572>>2]|0;d=e*3|0;c[a+4596>>2]=d;c[a+4624>>2]=1;c[a+4628>>2]=0;c[a+4656>>2]=2;g=0;h=6}while(0);c[a+4668>>2]=g;c[f>>2]=ie(h,c[a+4636>>2]|0)|0;c[a+4600>>2]=(e*5|0)+(d<<1);c[a+4620>>2]=b;return 0}function ge(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+6088|0;d=c[e>>2]|0;c[e>>2]=b;if(!b)return 0;if(!d)b=7;else{b=c[a+4612>>2]|0;b=he(7-(((b>>16)*26214|0)+(((b&65535)*26214|0)>>>16))|0)|0}c[a+6092>>2]=b;return 0}function he(a){a=a|0;return ((a|0)>2?a:2)|0}function ie(a,b){a=a|0;b=b|0;return ((a|0)<(b|0)?a:b)|0}function je(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;while(1){e=d+-1|0;if((d|0)<=0)break;d=Jh(+g[c+(e<<2)>>2])|0;b[a+(e<<1)>>1]=(d|0)>32767?32767:((d|0)>-32768?d:-32768)&65535;d=e}return}function ke(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;while(1){e=d+-1|0;if((d|0)<=0)break;g[a+(e<<2)>>2]=+(b[c+(e<<1)>>1]|0);d=e}return}function le(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+112|0;u=z+60|0;v=z+8|0;w=z;c[w>>2]=u;c[w+4>>2]=v;x=f>>1;me(d,u,v,x);g=ne(u,8192,x)|0;if((g|0)<0){b[a>>1]=0;t=0;i=v;g=ne(v,8192,x)|0;h=1}else{t=0;i=u;h=0}a:while(1){j=0;k=8192;m=1;s=h;b:while(1){h=j;o=k;while(1){k=b[28190+(m<<1)>>1]|0;n=ne(i,k,x)|0;if((g|0)<1){if((n|0)>=(h|0))break;if(!((g|0)<0|(n|0)>(0-h|0)))break}else if((n|0)<=(0-h|0))break;if((m|0)>127)break b;else{h=0;o=k;m=m+1|0;g=n}}j=(n|0)==0&1;r=0;p=-256;while(1){if((r|0)==3)break;h=o+k|0;h=(h>>1)+(h&1)|0;q=ne(i,h,x)|0;if((g|0)<1)if((q|0)>-1|(g|0)==0){k=h;n=q}else y=14;else if((q|0)<1){k=h;n=q}else y=14;if((y|0)==14){y=0;p=p+(128>>>r)|0;o=h;g=q}r=r+1|0}h=g-n|0;if((((g|0)>0?g:0-g|0)|0)<65536)if(!h)g=p;else g=p+(((g<<5)+(h>>1)|0)/(h|0)|0)|0;else g=p+((g|0)/(h>>5|0)|0)|0;b[a+(s<<1)>>1]=oe((m<<8)+g|0)|0;h=s+1|0;if((h|0)>=(f|0)){y=29;break a}k=b[28190+(m+-1<<1)>>1]|0;i=c[w+((h&1)<<2)>>2]|0;g=1-(h&2)<<12;s=h}g=t+1|0;if((t|0)>15)break;se(d,f,65536-(1<<g)|0);me(d,u,v,x);h=ne(u,8192,x)|0;if((h|0)>=0){t=g;i=u;g=h;h=0;continue}b[a>>1]=0;t=g;i=v;g=ne(v,8192,x)|0;h=1}if((y|0)==29){l=z;return}h=32768/(f+1|0)|0;b[a>>1]=h;g=1;while(1){if((g|0)>=(f|0))break;y=(h&65535)+(e[a>>1]|0)|0;b[a+(g<<1)>>1]=y;g=g+1|0;h=y}l=z;return}function me(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;c[b+(e<<2)>>2]=65536;c[d+(e<<2)>>2]=65536;f=0;while(1){if((f|0)>=(e|0)){f=e;break}g=a+(e-f+-1<<2)|0;h=a+(f+e<<2)|0;c[b+(f<<2)>>2]=0-(c[g>>2]|0)-(c[h>>2]|0);c[d+(f<<2)>>2]=(c[h>>2]|0)-(c[g>>2]|0);f=f+1|0}while(1){if((f|0)<=0)break;h=f+-1|0;g=b+(h<<2)|0;c[g>>2]=(c[g>>2]|0)-(c[b+(f<<2)>>2]|0);g=d+(h<<2)|0;c[g>>2]=(c[g>>2]|0)+(c[d+(f<<2)>>2]|0);f=h}pe(b,e);pe(d,e);return}function ne(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a+(d<<2)>>2]|0;f=b<<4;if((d|0)==8){d=b<<20>>16;g=(f>>15)+1>>1;f=(c[a+28>>2]|0)+((R(e>>16,d)|0)+((R(e&65535,d)|0)>>16))+(R(e,g)|0)|0;f=(c[a+24>>2]|0)+((R(f>>16,d)|0)+((R(f&65535,d)|0)>>16))+(R(f,g)|0)|0;f=(c[a+20>>2]|0)+((R(f>>16,d)|0)+((R(f&65535,d)|0)>>16))+(R(f,g)|0)|0;f=(c[a+16>>2]|0)+((R(f>>16,d)|0)+((R(f&65535,d)|0)>>16))+(R(f,g)|0)|0;f=(c[a+12>>2]|0)+((R(f>>16,d)|0)+((R(f&65535,d)|0)>>16))+(R(f,g)|0)|0;f=(c[a+8>>2]|0)+((R(f>>16,d)|0)+((R(f&65535,d)|0)>>16))+(R(f,g)|0)|0;f=(c[a+4>>2]|0)+((R(f>>16,d)|0)+((R(f&65535,d)|0)>>16))+(R(f,g)|0)|0;a=(c[a>>2]|0)+((R(f>>16,d)|0)+((R(f&65535,d)|0)>>16))+(R(f,g)|0)|0;return a|0}g=b<<20>>16;f=(f>>15)+1>>1;while(1){b=d+-1|0;if((d|0)<=0)break;e=(c[a+(b<<2)>>2]|0)+((R(e>>16,g)|0)+((R(e&65535,g)|0)>>16))+(R(e,f)|0)|0;d=b}return e|0}function oe(a){a=a|0;return ((a|0)<32767?a:32767)|0}function pe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=2;while(1){if((e|0)>(b|0))break;else d=b;while(1){if((d|0)<=(e|0))break;f=a+(d+-2<<2)|0;c[f>>2]=(c[f>>2]|0)-(c[a+(d<<2)>>2]|0);d=d+-1|0}f=a+(e+-2<<2)|0;c[f>>2]=(c[f>>2]|0)-(c[a+(e<<2)>>2]<<1);e=e+1|0}return}function qe(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=g>>1;i=d+4|0;g=0;while(1){if((g|0)>=(h|0))break;m=g<<1;n=b[a+(m<<1)>>1]<<10;l=n-(c[d>>2]|0)|0;k=(R(l>>16,-24290)|0)+((R(l&65535,-24290)|0)>>16)|0;j=n+k|0;c[d>>2]=n+(l+k);m=b[a+((m|1)<<1)>>1]<<10;k=c[i>>2]|0;l=m-k|0;l=((l>>16)*10788|0)+(((l&65535)*10788|0)>>>16)|0;k=k+l|0;c[i>>2]=m+l;l=(k+j>>10)+1>>1;b[e+(g<<1)>>1]=(l|0)>32767?32767:((l|0)>-32768?l:-32768)&65535;j=(k-j>>10)+1>>1;b[f+(g<<1)>>1]=(j|0)>32767?32767:((j|0)>-32768?j:-32768)&65535;g=g+1|0}return}function re(a,d,e,f,g,h,i){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=0-e|0;o=j&16383;l=0-f|0;n=l&16383;f=g+4|0;j=j>>>14<<16>>16;k=d+4|0;l=l>>>14<<16>>16;m=d+8|0;e=0;while(1){if((e|0)>=(i|0))break;p=c[d>>2]|0;q=b[a+(e<<1)>>1]|0;p=(c[g>>2]|0)+((R(p>>16,q)|0)+((R(p&65535,q)|0)>>16))<<2;r=p>>16;s=p&65532;u=(c[f>>2]|0)+(((R(r,o)|0)+((R(s,o)|0)>>>16)>>13)+1>>1)+((R(r,j)|0)+((R(s,j)|0)>>16))|0;c[g>>2]=u;t=c[k>>2]|0;c[g>>2]=u+((R(t>>16,q)|0)+((R(t&65535,q)|0)>>16));s=(((R(r,n)|0)+((R(s,n)|0)>>>16)>>13)+1>>1)+((R(r,l)|0)+((R(s,l)|0)>>16))|0;c[f>>2]=s;r=c[m>>2]|0;c[f>>2]=s+((R(r>>16,q)|0)+((R(r&65535,q)|0)>>16));p=p+16383>>14;b[h+(e<<1)>>1]=(p|0)>32767?32767:((p|0)>-32768?p:-32768)&65535;e=e+1|0}return}function se(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=d+-65536|0;f=b+-1|0;e=0;b=d;while(1){d=b>>16;if((e|0)>=(f|0))break;h=a+(e<<2)|0;i=c[h>>2]|0;j=i<<16>>16;c[h>>2]=(R(d,j)|0)+((R(b&65535,j)|0)>>16)+(R(b,(i>>15)+1>>1)|0);e=e+1|0;b=b+(((R(b,g)|0)>>15)+1>>1)|0}j=a+(f<<2)|0;i=c[j>>2]|0;h=i<<16>>16;c[j>>2]=(R(d,h)|0)+((R(b&65535,h)|0)>>16)+(R(b,(i>>15)+1>>1)|0);return}function te(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=0;g=0;while(1){if((g|0)>=(e|0))break;f=f+((R(b[a+(g<<1)>>1]|0,b[c+(g<<1)>>1]|0)|0)>>d)|0;g=g+1|0}return f|0}function ue(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;b=e+4|0;d=e;ve(a,b,d);d=c[d>>2]|0;a=R(d,128-d|0)|0;l=e;return d+(((a>>16)*179|0)+(((a&65535)*179|0)>>>16))+(31-(c[b>>2]|0)<<7)|0}function ve(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=we(a)|0;c[b>>2]=e;c[d>>2]=(xe(a,24-e|0)|0)&127;return}function we(a){a=a|0;return U(a|0)|0}function xe(a,b){a=a|0;b=b|0;if(!b){b=a;return b|0}if((b|0)<0){b=a<<0-b|a>>>(b+32|0);return b|0}else{b=a<<32-b|a>>>b;return b|0}return 0}function ye(a){a=a|0;var b=0,c=0,d=0;if((a|0)<0){d=0;return d|0}if((a|0)>3966){d=2147483647;return d|0}b=a>>7;d=1<<b;c=a&127;if((a|0)<2048)a=c+((R(R(c,128-c|0)|0,-174)|0)>>16)<<b>>7;else a=R(d>>7,c+((R(R(c,128-c|0)|0,-174)|0)>>16)|0)|0;d=d+a|0;return d|0}function ze(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;k=d+2|0;l=d+4|0;m=d+6|0;n=d+8|0;o=d+10|0;h=f;while(1){if((h|0)>=(e|0))break;j=c+(h+-1<<1)|0;g=R(b[j>>1]|0,b[d>>1]|0)|0;g=g+(R(b[j+-2>>1]|0,b[k>>1]|0)|0)|0;g=g+(R(b[j+-4>>1]|0,b[l>>1]|0)|0)|0;g=g+(R(b[j+-6>>1]|0,b[m>>1]|0)|0)|0;g=g+(R(b[j+-8>>1]|0,b[n>>1]|0)|0)|0;g=g+(R(b[j+-10>>1]|0,b[o>>1]|0)|0)|0;i=6;while(1){if((i|0)>=(f|0))break;p=g+(R(b[j+(0-i<<1)>>1]|0,b[d+(i<<1)>>1]|0)|0)|0;g=p+(R(b[j+(~i<<1)>>1]|0,b[d+((i|1)<<1)>>1]|0)|0)|0;i=i+2|0}p=((b[j+2>>1]<<12)-g>>11)+1>>1;b[a+(h<<1)>>1]=(p|0)>32767?32767:((p|0)>-32768?p:-32768)&65535;h=h+1|0}Qh(a|0,0,f<<1|0)|0;return}function Ae(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+96|0;g=h;e=0;f=0;while(1){if((f|0)>=(d|0))break;i=b[a+(f<<1)>>1]|0;c[g+(f<<2)>>2]=i<<12;e=e+i|0;f=f+1|0}if((e|0)>4095){i=0;l=h;return i|0}i=Be(g,d)|0;l=h;return i|0}function Be(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=1073741824;f=0;a:while(1){u=b+-1|0;d=c[a+(u<<2)>>2]|0;e=(d+16773022|0)>>>0>33546044;if((b|0)<=1){b=17;break}if(e){b=19;break}s=0-(d<<7)|0;t=((s|0)<0)<<31>>31;Uh(s|0,t|0,s|0,t|0)|0;d=1073741824-C|0;r=Uh(g|0,f|0,d|0,((d|0)<0)<<31>>31|0)|0;r=Rh(r|0,C|0,30)|0;r=r&-4;if((r|0)<107374){b=19;break}o=32-(Ce((d|0)>0?d:0-d|0)|0)|0;q=De(d,o+30|0)|0;l=b>>1;m=(o|0)==1;n=((q|0)<0)<<31>>31;o=o+-1|0;k=0;while(1){if((k|0)>=(l|0))break;h=a+(k<<2)|0;i=c[h>>2]|0;p=a+(u-k+-1<<2)|0;j=c[p>>2]|0;b=Uh(j|0,((j|0)<0)<<31>>31|0,s|0,t|0)|0;b=Rh(b|0,C|0,30)|0;b=Ph(b|0,C|0,1,0)|0;b=Rh(b|0,C|0,1)|0;d=i-b|0;e=(d|0)>-1;f=((e?i:i^-2147483648)&(e?b^-2147483648:b)|0)<0?d>>31^-2147483648:d;f=Uh(f|0,((f|0)<0)<<31>>31|0,q|0,n|0)|0;g=C;if(m){f=Oh(f|0,g|0,1)|0;g=C;b=((e?i:i^-2147483648)&(e?b^-2147483648:b)|0)<0?d>>31^-2147483648:d;b=Uh(b|0,((b|0)<0)<<31>>31|0,q|0,n|0)|0;b=Ph(f|0,g|0,b&1|0,0)|0;d=C}else{b=Oh(f|0,g|0,o|0)|0;b=Ph(b|0,C|0,1,0)|0;b=Oh(b|0,C|0,1)|0;d=C}g=Ph(b|0,d|0,-2147483648,0)|0;f=C;if(f>>>0>0|(f|0)==0&g>>>0>4294967295){b=19;break a}c[h>>2]=b;b=Uh(i|0,((i|0)<0)<<31>>31|0,s|0,t|0)|0;b=Rh(b|0,C|0,30)|0;b=Ph(b|0,C|0,1,0)|0;b=Rh(b|0,C|0,1)|0;d=j-b|0;e=(d|0)>-1;f=((e?j:j^-2147483648)&(e?b^-2147483648:b)|0)<0?d>>31^-2147483648:d;f=Uh(f|0,((f|0)<0)<<31>>31|0,q|0,n|0)|0;g=C;if(m){h=Oh(f|0,g|0,1)|0;i=C;b=((e?j:j^-2147483648)&(e?b^-2147483648:b)|0)<0?d>>31^-2147483648:d;b=Uh(b|0,((b|0)<0)<<31>>31|0,q|0,n|0)|0;b=Ph(h|0,i|0,b&1|0,0)|0;d=C}else{b=Oh(f|0,g|0,o|0)|0;b=Ph(b|0,C|0,1,0)|0;b=Oh(b|0,C|0,1)|0;d=C}j=Ph(b|0,d|0,-2147483648,0)|0;i=C;if(i>>>0>0|(i|0)==0&j>>>0>4294967295){b=19;break a}c[p>>2]=b;k=k+1|0}b=u;g=r;f=((r|0)<0)<<31>>31}if((b|0)==17)if(e)return 0;else{u=0-(c[a>>2]<<7)|0;a=((u|0)<0)<<31>>31;Uh(u|0,a|0,u|0,a|0)|0;a=1073741824-C|0;a=Uh(g|0,f|0,a|0,((a|0)<0)<<31>>31|0)|0;a=Rh(a|0,C|0,30)|0;a=a&-4;return ((a|0)<107374?0:a)|0}else if((b|0)==19)return 0;return 0}function Ce(a){a=a|0;return U(a|0)|0}function De(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=Ce((a|0)>0?a:0-a|0)|0;a=a<<c+-1;g=a>>16;d=536870911/(g|0)|0;f=d<<16;e=f>>16;a=536870912-((R(g,e)|0)+((R(a&65535,e)|0)>>16))<<3;d=f+((R(a>>16,e)|0)+((R(a&65528,e)|0)>>16))+(R(a,(d>>15)+1>>1)|0)|0;a=62-c-b|0;if((a|0)>=1)return ((a|0)<32?d>>a:0)|0;a=0-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){g=b;g=g<<a;return g|0}g=(d|0)<(c|0)?c:d;g=g<<a;return g|0}else{if((d|0)>(c|0)){g=c;g=g<<a;return g|0}g=(d|0)<(b|0)?b:d;g=g<<a;return g|0}return 0}function Ee(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;n=l;l=l+304|0;i=n+200|0;j=n+148|0;k=n+96|0;m=n;h=(f|0)==16?33641:33657;g=0;while(1){if((g|0)>=(f|0))break;p=b[e+(g<<1)>>1]|0;o=p>>8;q=b[28190+(o<<1)>>1]|0;o=((q<<8)+(R((b[28190+(o+1<<1)>>1]|0)-q|0,p-(o<<8)|0)|0)>>3)+1>>1;c[i+(d[h+g>>0]<<2)>>2]=o;g=g+1|0}e=f>>1;Fe(j,i,e);Fe(k,i+4|0,e);g=0;while(1){if((g|0)>=(e|0))break;q=g+1|0;p=(c[j+(q<<2)>>2]|0)+(c[j+(g<<2)>>2]|0)|0;o=(c[k+(q<<2)>>2]|0)-(c[k+(g<<2)>>2]|0)|0;c[m+(g<<2)>>2]=0-o-p;c[m+(f-g+-1<<2)>>2]=o-p;g=q}mf(a,m,f);g=0;while(1){if(!((Ae(a,f)|0)==0&(g|0)<16))break;se(m,f,65536-(2<<g)|0);e=0;while(1){if((e|0)>=(f|0))break;b[a+(e<<1)>>1]=(((c[m+(e<<2)>>2]|0)>>>4)+1|0)>>>1;e=e+1|0}g=g+1|0}l=n;return}function Fe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c[a>>2]=65536;j=a+4|0;f=1;e=0-(c[b>>2]|0)|0;while(1){c[j>>2]=e;if((f|0)>=(d|0))break;i=c[b+(f<<1<<2)>>2]|0;k=c[a+(f+-1<<2)>>2]|0;g=((i|0)<0)<<31>>31;e=c[a+(f<<2)>>2]|0;e=Uh(i|0,g|0,e|0,((e|0)<0)<<31>>31|0)|0;e=Rh(e|0,C|0,15)|0;e=Ph(e|0,C|0,1,0)|0;e=Rh(e|0,C|0,1)|0;h=f+1|0;c[a+(h<<2)>>2]=(k<<1)-e;e=f;f=k;while(1){if((e|0)<=1)break;k=c[a+(e+-2<<2)>>2]|0;m=Uh(i|0,g|0,f|0,((f|0)<0)<<31>>31|0)|0;m=Rh(m|0,C|0,15)|0;m=Ph(m|0,C|0,1,0)|0;m=Rh(m|0,C|0,1)|0;l=a+(e<<2)|0;c[l>>2]=(c[l>>2]|0)+(k-m);e=e+-1|0;f=k}f=h;e=(c[j>>2]|0)-i|0}return}function Ge(a,c,d){a=a|0;c=c|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=a+(d+-1<<1)|0;q=c+(d<<1)|0;n=0;while(1){if((n|0)>=20)break;h=b[a>>1]|0;j=b[c>>1]|0;i=(h<<16>>16)-(j<<16>>16)|0;f=1;g=0;while(1){if((f|0)>=(d|0))break;m=b[a+(f<<1)>>1]|0;k=(m<<16>>16)-((h<<16>>16)+(b[c+(f<<1)>>1]|0))|0;r=(k|0)<(i|0);l=r?f:g;i=r?k:i;f=f+1|0;g=l;h=m}r=32768-((b[p>>1]|0)+(b[q>>1]|0))|0;m=(r|0)<(i|0);k=m?d:g;if(((m?r:i)|0)>-1){o=30;break}do if(!k)b[a>>1]=j;else{if((k|0)==(d|0)){b[p>>1]=32768-(e[q>>1]|0);break}else{h=0;f=0}while(1){if((f|0)>=(k|0))break;h=h+(b[c+(f<<1)>>1]|0)|0;f=f+1|0}l=c+(k<<1)|0;m=b[l>>1]|0;i=m>>1;g=32768;f=d;while(1){if((f|0)<=(k|0))break;g=g-(b[c+(f<<1)>>1]|0)|0;f=f+-1|0}f=h+i|0;h=g-i|0;j=a+(k+-1<<1)|0;r=b[j>>1]|0;i=a+(k<<1)|0;g=b[i>>1]|0;g=((r<<16>>16)+(g<<16>>16)>>1)+((r&65535)+(g&65535)&1)|0;if((f|0)>(h|0)){if((g|0)<=(f|0))f=(g|0)<(h|0)?h:g}else if((g|0)>(h|0))f=h;else f=(g|0)<(f|0)?f:g;r=f-(m>>>1)|0;b[j>>1]=r;b[i>>1]=r+(e[l>>1]|0)}while(0);n=n+1|0}if((o|0)==30)return;if((n|0)!=20)return;Ze(a,d);g=He(b[a>>1]|0,b[c>>1]|0)|0;b[a>>1]=g;f=1;while(1){if((f|0)>=(d|0))break;o=a+(f<<1)|0;r=(g<<16>>16)+(b[c+(f<<1)>>1]|0)|0;r=He(b[o>>1]|0,(r|0)>32767?32767:((r|0)>-32768?r:-32768)<<16>>16)|0;b[o>>1]=r;f=f+1|0;g=r}g=Ie(b[p>>1]|0,32768-(b[q>>1]|0)|0)|0;b[p>>1]=g;f=d+-2|0;while(1){if((f|0)<=-1)break;q=a+(f<<1)|0;r=Ie(b[q>>1]|0,(g<<16>>16)-(b[c+(f+1<<1)>>1]|0)|0)|0;b[q>>1]=r;f=f+-1|0;g=r}return}function He(a,b){a=a|0;b=b|0;return ((a|0)>(b|0)?a:b)|0}function Ie(a,b){a=a|0;b=b|0;return ((a|0)<(b|0)?a:b)|0}function Je(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=b[c>>1]|0;f=131072/(Ke(e)|0)|0;e=131072/(Ke((b[c+2>>1]|0)-e|0)|0)|0;b[a>>1]=Le(f+e|0)|0;f=d+-1|0;d=e;e=1;while(1){if((e|0)>=(f|0))break;i=e+1|0;h=c+(i<<1)|0;j=131072/(Ke((b[h>>1]|0)-(b[c+(e<<1)>>1]|0)|0)|0)|0;b[a+(e<<1)>>1]=Le(j+d|0)|0;g=e+2|0;h=131072/(Ke((b[c+(g<<1)>>1]|0)-(b[h>>1]|0)|0)|0)|0;b[a+(i<<1)>>1]=Le(j+h|0)|0;d=h;e=g}b[a+(f<<1)>>1]=Le((131072/(Ke(32768-(b[c+(f<<1)>>1]|0)|0)|0)|0)+d|0)|0;return}function Ke(a){a=a|0;return ((a|0)>1?a:1)|0}function Le(a){a=a|0;return ((a|0)<32767?a:32767)|0}function Me(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;Qh(b|0,0,300)|0;if(!f){a:do if((d|0)>=12e3)if((d|0)<16e3){switch(d|0){case 12e3:break a;default:f=-1}return f|0}else{switch(d|0){case 16e3:break a;default:f=-1}return f|0}else{switch(d|0){case 8e3:break a;default:f=-1}return f|0}while(0);b:do if((e|0)<16e3)if((e|0)<12e3){switch(e|0){case 8e3:break b;default:f=-1}return f|0}else{switch(e|0){case 12e3:break b;default:f=-1}return f|0}else{if((e|0)<24e3){switch(e|0){case 16e3:break b;default:f=-1}return f|0}if((e|0)<48e3){switch(e|0){case 24e3:break b;default:f=-1}return f|0}else{switch(e|0){case 48e3:break b;default:f=-1}return f|0}}while(0);f=((e>>12)-((e|0)>16e3&1)>>((e|0)>24e3&1))+-1+(33923+((((d>>12)-((d|0)>16e3&1)>>((d|0)>24e3&1))+-1|0)*5|0))|0}else{c:do if((d|0)<16e3)if((d|0)<12e3){switch(d|0){case 8e3:break c;default:f=-1}return f|0}else{switch(d|0){case 12e3:break c;default:f=-1}return f|0}else{if((d|0)<24e3){switch(d|0){case 16e3:break c;default:f=-1}return f|0}if((d|0)<48e3){switch(d|0){case 24e3:break c;default:f=-1}return f|0}else{switch(d|0){case 48e3:break c;default:f=-1}return f|0}}while(0);d:do if((e|0)>=12e3)if((e|0)<16e3){switch(e|0){case 12e3:break d;default:f=-1}return f|0}else{switch(e|0){case 16e3:break d;default:f=-1}return f|0}else{switch(e|0){case 8e3:break d;default:f=-1}return f|0}while(0);f=((e>>12)-((e|0)>16e3&1)>>((e|0)>24e3&1))+-1+(33908+((((d>>12)-((d|0)>16e3&1)>>((d|0)>24e3&1))+-1|0)*3|0))|0}c[b+292>>2]=a[f>>0];i=(d|0)/1e3|0;c[b+284>>2]=i;c[b+288>>2]=(e|0)/1e3|0;c[b+268>>2]=i*10;do if((e|0)>(d|0)){f=b+264|0;if((d<<1|0)==(e|0)){c[f>>2]=1;f=0;break}else{c[f>>2]=2;f=1;break}}else{f=b+264|0;if((e|0)>=(d|0)){c[f>>2]=0;f=0;break}c[f>>2]=3;f=e<<2;if((f|0)==(d*3|0)){c[b+280>>2]=3;c[b+276>>2]=18;c[b+296>>2]=28448;f=0;break}g=e*3|0;if((g|0)==(d<<1|0)){c[b+280>>2]=2;c[b+276>>2]=18;c[b+296>>2]=28506;f=0;break}if((e<<1|0)==(d|0)){c[b+280>>2]=1;c[b+276>>2]=24;c[b+296>>2]=28546;f=0;break}if((g|0)==(d|0)){c[b+280>>2]=1;c[b+276>>2]=36;c[b+296>>2]=28574;f=0;break}if((f|0)==(d|0)){c[b+280>>2]=1;c[b+276>>2]=36;c[b+296>>2]=28614;f=0;break}if((e*6|0)==(d|0)){c[b+280>>2]=1;c[b+276>>2]=36;c[b+296>>2]=28654;f=0;break}else{d=-1;return d|0}}while(0);g=((d<<(f|14)|0)/(e|0)|0)<<2;h=b+272|0;c[h>>2]=g;i=e<<16>>16;b=(e>>15)+1>>1;f=d<<f;while(1){if(((R(g>>16,i)|0)+((R(g&65535,i)|0)>>16)+(R(g,b)|0)|0)>=(f|0)){f=0;break}d=g+1|0;c[h>>2]=d;g=d}return f|0}function Ne(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=a+284|0;h=a+292|0;i=c[h>>2]|0;g=(c[f>>2]|0)-i|0;Sh(a+168+(i<<1)|0,d|0,g<<1|0)|0;switch(c[a+264>>2]|0){case 1:{i=a+168|0;We(a,b,i,c[f>>2]|0);We(a,b+(c[a+288>>2]<<1)|0,d+(g<<1)|0,e-(c[f>>2]|0)|0);a=i;break}case 2:{i=a+168|0;Te(a,b,i,c[f>>2]|0);Te(a,b+(c[a+288>>2]<<1)|0,d+(g<<1)|0,e-(c[f>>2]|0)|0);a=i;break}case 3:{i=a+168|0;Re(a,b,i,c[f>>2]|0);Re(a,b+(c[a+288>>2]<<1)|0,d+(g<<1)|0,e-(c[f>>2]|0)|0);a=i;break}default:{i=a+168|0;Sh(b|0,i|0,c[f>>2]<<1|0)|0;Sh(b+(c[a+288>>2]<<1)|0,d+(g<<1)|0,e-(c[f>>2]|0)<<1|0)|0;a=i}}i=c[h>>2]|0;Sh(a|0,d+(e-i<<1)|0,i<<1|0)|0;return}function Oe(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;n=l;l=l+1936|0;j=n;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];k=a+16|0;m=j+16|0;while(1){i=(f|0)<480?f:480;Qe(k,m,e,28694,i);g=j;h=i;while(1){if((h|0)<=2)break;u=c[g>>2]|0;s=g+4|0;t=c[s>>2]|0;r=g+8|0;p=c[r>>2]|0;o=g+12|0;q=c[o>>2]|0;q=(((u>>16)*4697|0)+(((u&65535)*4697|0)>>>16)+(((t>>16)*10739|0)+(((t&65535)*10739|0)>>>16))+(((p>>16)*8276|0)+(((p&65535)*8276|0)>>>16))+(((q>>16)*1567|0)+(((q&65535)*1567|0)>>>16))>>5)+1>>1;b[d>>1]=(q|0)>32767?32767:((q|0)>-32768?q:-32768)&65535;s=c[s>>2]|0;r=c[r>>2]|0;q=c[o>>2]|0;p=c[g+16>>2]|0;p=(((s>>16)*1567|0)+(((s&65535)*1567|0)>>>16)+(((r>>16)*8276|0)+(((r&65535)*8276|0)>>>16))+(((q>>16)*10739|0)+(((q&65535)*10739|0)>>>16))+(((p>>16)*4697|0)+(((p&65535)*4697|0)>>>16))>>5)+1>>1;b[d+2>>1]=(p|0)>32767?32767:((p|0)>-32768?p:-32768)&65535;g=o;h=h+-3|0;d=d+4|0}f=f-i|0;if((f|0)<=0)break;u=j+(i<<2)|0;c[j>>2]=c[u>>2];c[j+4>>2]=c[u+4>>2];c[j+8>>2]=c[u+8>>2];c[j+12>>2]=c[u+12>>2];e=e+(i<<1)|0}u=j+(i<<2)|0;c[a>>2]=c[u>>2];c[a+4>>2]=c[u+4>>2];c[a+8>>2]=c[u+8>>2];c[a+12>>2]=c[u+12>>2];l=n;return}function Pe(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=f>>1;h=a+4|0;f=0;while(1){if((f|0)>=(g|0))break;m=f<<1;l=b[e+(m<<1)>>1]<<10;j=l-(c[a>>2]|0)|0;k=(R(j>>16,-25727)|0)+((R(j&65535,-25727)|0)>>16)|0;c[a>>2]=l+(j+k);m=b[e+((m|1)<<1)>>1]<<10;j=c[h>>2]|0;i=m-j|0;i=((i>>16)*9872|0)+(((i&65535)*9872|0)>>>16)|0;c[h>>2]=m+i;i=(l+k+j+i>>10)+1>>1;b[d+(f<<1)>>1]=(i|0)>32767?32767:((i|0)>-32768?i:-32768)&65535;f=f+1|0}return}function Qe(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;i=a+4|0;j=f+2|0;h=0;while(1){if((h|0)>=(g|0))break;l=(c[a>>2]|0)+(b[e+(h<<1)>>1]<<8)|0;c[d+(h<<2)>>2]=l;l=l<<2;m=l>>16;k=b[f>>1]|0;l=l&65532;c[a>>2]=(c[i>>2]|0)+((R(m,k)|0)+((R(l,k)|0)>>16));k=b[j>>1]|0;c[i>>2]=(R(m,k)|0)+((R(l,k)|0)>>16);h=h+1|0}return}function Re(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;n=a+268|0;r=c[n>>2]|0;o=a+276|0;f=c[o>>2]|0;p=l;l=l+((1*(r+f<<2)|0)+15&-16)|0;h=a+24|0;Sh(p|0,h|0,f<<2|0)|0;i=a+296|0;j=(c[i>>2]|0)+4|0;k=c[a+272>>2]|0;m=a+280|0;g=d;d=r;while(1){d=(e|0)<(d|0)?e:d;Qe(a,p+(f<<2)|0,g,c[i>>2]|0,d);b=Se(b,p,j,c[o>>2]|0,c[m>>2]|0,d<<16,k)|0;e=e-d|0;if((e|0)<=1)break;f=c[o>>2]|0;Sh(p|0,p+(d<<2)|0,f<<2|0)|0;g=g+(d<<1)|0;d=c[n>>2]|0}Sh(h|0,p+(d<<2)|0,c[o>>2]<<2|0)|0;l=q;return}function Se(a,d,e,f,g,h,i){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;switch(f|0){case 18:{j=g<<16>>16;g=g+-1|0;f=0;while(1){if((f|0)>=(h|0))break;x=d+(f>>16<<2)|0;y=(R(f&65535,j)|0)>>16;w=e+(y*9<<1)|0;v=c[x>>2]|0;t=b[w>>1]|0;t=(R(v>>16,t)|0)+((R(v&65535,t)|0)>>16)|0;v=c[x+4>>2]|0;u=b[w+2>>1]|0;u=t+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+8>>2]|0;t=b[w+4>>1]|0;t=u+((R(v>>16,t)|0)+((R(v&65535,t)|0)>>16))|0;v=c[x+12>>2]|0;u=b[w+6>>1]|0;u=t+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+16>>2]|0;t=b[w+8>>1]|0;t=u+((R(v>>16,t)|0)+((R(v&65535,t)|0)>>16))|0;v=c[x+20>>2]|0;u=b[w+10>>1]|0;u=t+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+24>>2]|0;t=b[w+12>>1]|0;t=u+((R(v>>16,t)|0)+((R(v&65535,t)|0)>>16))|0;v=c[x+28>>2]|0;u=b[w+14>>1]|0;u=t+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+32>>2]|0;w=b[w+16>>1]|0;w=u+((R(v>>16,w)|0)+((R(v&65535,w)|0)>>16))|0;y=e+((g-y|0)*9<<1)|0;v=c[x+68>>2]|0;u=b[y>>1]|0;u=w+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+64>>2]|0;w=b[y+2>>1]|0;w=u+((R(v>>16,w)|0)+((R(v&65535,w)|0)>>16))|0;v=c[x+60>>2]|0;u=b[y+4>>1]|0;u=w+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+56>>2]|0;w=b[y+6>>1]|0;w=u+((R(v>>16,w)|0)+((R(v&65535,w)|0)>>16))|0;v=c[x+52>>2]|0;u=b[y+8>>1]|0;u=w+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+48>>2]|0;w=b[y+10>>1]|0;w=u+((R(v>>16,w)|0)+((R(v&65535,w)|0)>>16))|0;v=c[x+44>>2]|0;u=b[y+12>>1]|0;u=w+((R(v>>16,u)|0)+((R(v&65535,u)|0)>>16))|0;v=c[x+40>>2]|0;w=b[y+14>>1]|0;w=u+((R(v>>16,w)|0)+((R(v&65535,w)|0)>>16))|0;x=c[x+36>>2]|0;y=b[y+16>>1]|0;y=(w+((R(x>>16,y)|0)+((R(x&65535,y)|0)>>16))>>5)+1>>1;b[a>>1]=(y|0)>32767?32767:((y|0)>-32768?y:-32768)&65535;a=a+2|0;f=f+i|0}return a|0}case 24:{g=e+2|0;j=e+4|0;k=e+6|0;l=e+8|0;m=e+10|0;n=e+12|0;o=e+14|0;p=e+16|0;q=e+18|0;r=e+20|0;s=e+22|0;f=0;while(1){if((f|0)>=(h|0))break;x=d+(f>>16<<2)|0;y=(c[x>>2]|0)+(c[x+92>>2]|0)|0;w=b[e>>1]|0;w=(R(y>>16,w)|0)+((R(y&65535,w)|0)>>16)|0;y=(c[x+4>>2]|0)+(c[x+88>>2]|0)|0;v=b[g>>1]|0;v=w+((R(y>>16,v)|0)+((R(y&65535,v)|0)>>16))|0;y=(c[x+8>>2]|0)+(c[x+84>>2]|0)|0;w=b[j>>1]|0;w=v+((R(y>>16,w)|0)+((R(y&65535,w)|0)>>16))|0;y=(c[x+12>>2]|0)+(c[x+80>>2]|0)|0;v=b[k>>1]|0;v=w+((R(y>>16,v)|0)+((R(y&65535,v)|0)>>16))|0;y=(c[x+16>>2]|0)+(c[x+76>>2]|0)|0;w=b[l>>1]|0;w=v+((R(y>>16,w)|0)+((R(y&65535,w)|0)>>16))|0;y=(c[x+20>>2]|0)+(c[x+72>>2]|0)|0;v=b[m>>1]|0;v=w+((R(y>>16,v)|0)+((R(y&65535,v)|0)>>16))|0;y=(c[x+24>>2]|0)+(c[x+68>>2]|0)|0;w=b[n>>1]|0;w=v+((R(y>>16,w)|0)+((R(y&65535,w)|0)>>16))|0;y=(c[x+28>>2]|0)+(c[x+64>>2]|0)|0;v=b[o>>1]|0;v=w+((R(y>>16,v)|0)+((R(y&65535,v)|0)>>16))|0;y=(c[x+32>>2]|0)+(c[x+60>>2]|0)|0;w=b[p>>1]|0;w=v+((R(y>>16,w)|0)+((R(y&65535,w)|0)>>16))|0;y=(c[x+36>>2]|0)+(c[x+56>>2]|0)|0;v=b[q>>1]|0;v=w+((R(y>>16,v)|0)+((R(y&65535,v)|0)>>16))|0;y=(c[x+40>>2]|0)+(c[x+52>>2]|0)|0;w=b[r>>1]|0;w=v+((R(y>>16,w)|0)+((R(y&65535,w)|0)>>16))|0;x=(c[x+44>>2]|0)+(c[x+48>>2]|0)|0;y=b[s>>1]|0;y=(w+((R(x>>16,y)|0)+((R(x&65535,y)|0)>>16))>>5)+1>>1;b[a>>1]=(y|0)>32767?32767:((y|0)>-32768?y:-32768)&65535;a=a+2|0;f=f+i|0}return a|0}case 36:{w=e+2|0;x=e+4|0;y=e+6|0;g=e+8|0;j=e+10|0;k=e+12|0;l=e+14|0;m=e+16|0;n=e+18|0;o=e+20|0;p=e+22|0;q=e+24|0;r=e+26|0;s=e+28|0;t=e+30|0;u=e+32|0;v=e+34|0;f=0;while(1){if((f|0)>=(h|0))break;A=d+(f>>16<<2)|0;z=(c[A>>2]|0)+(c[A+140>>2]|0)|0;B=b[e>>1]|0;B=(R(z>>16,B)|0)+((R(z&65535,B)|0)>>16)|0;z=(c[A+4>>2]|0)+(c[A+136>>2]|0)|0;C=b[w>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+8>>2]|0)+(c[A+132>>2]|0)|0;B=b[x>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;z=(c[A+12>>2]|0)+(c[A+128>>2]|0)|0;C=b[y>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+16>>2]|0)+(c[A+124>>2]|0)|0;B=b[g>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;z=(c[A+20>>2]|0)+(c[A+120>>2]|0)|0;C=b[j>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+24>>2]|0)+(c[A+116>>2]|0)|0;B=b[k>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;z=(c[A+28>>2]|0)+(c[A+112>>2]|0)|0;C=b[l>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+32>>2]|0)+(c[A+108>>2]|0)|0;B=b[m>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;z=(c[A+36>>2]|0)+(c[A+104>>2]|0)|0;C=b[n>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+40>>2]|0)+(c[A+100>>2]|0)|0;B=b[o>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;z=(c[A+44>>2]|0)+(c[A+96>>2]|0)|0;C=b[p>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+48>>2]|0)+(c[A+92>>2]|0)|0;B=b[q>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;z=(c[A+52>>2]|0)+(c[A+88>>2]|0)|0;C=b[r>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+56>>2]|0)+(c[A+84>>2]|0)|0;B=b[s>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;z=(c[A+60>>2]|0)+(c[A+80>>2]|0)|0;C=b[t>>1]|0;C=B+((R(z>>16,C)|0)+((R(z&65535,C)|0)>>16))|0;z=(c[A+64>>2]|0)+(c[A+76>>2]|0)|0;B=b[u>>1]|0;B=C+((R(z>>16,B)|0)+((R(z&65535,B)|0)>>16))|0;A=(c[A+68>>2]|0)+(c[A+72>>2]|0)|0;z=b[v>>1]|0;z=(B+((R(A>>16,z)|0)+((R(A&65535,z)|0)>>16))>>5)+1>>1;b[a>>1]=(z|0)>32767?32767:((z|0)>-32768?z:-32768)&65535;a=a+2|0;f=f+i|0}return a|0}default:{C=a;return C|0}}return 0}function Te(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;j=a+268|0;o=c[j>>2]|0;k=l;l=l+((1*((o<<1)+8<<1)|0)+15&-16)|0;m=a+24|0;b[k>>1]=b[m>>1]|0;b[k+2>>1]=b[m+2>>1]|0;b[k+4>>1]=b[m+4>>1]|0;b[k+6>>1]=b[m+6>>1]|0;b[k+8>>1]=b[m+8>>1]|0;b[k+10>>1]=b[m+10>>1]|0;b[k+12>>1]=b[m+12>>1]|0;b[k+14>>1]=b[m+14>>1]|0;h=c[a+272>>2]|0;i=k+16|0;g=e;e=o;while(1){e=(f|0)<(e|0)?f:e;Ve(a,i,g,e);d=Ue(d,k,e<<17,h)|0;f=f-e|0;if((f|0)<=0)break;o=k+(e<<1<<1)|0;b[k>>1]=b[o>>1]|0;b[k+2>>1]=b[o+2>>1]|0;b[k+4>>1]=b[o+4>>1]|0;b[k+6>>1]=b[o+6>>1]|0;b[k+8>>1]=b[o+8>>1]|0;b[k+10>>1]=b[o+10>>1]|0;b[k+12>>1]=b[o+12>>1]|0;b[k+14>>1]=b[o+14>>1]|0;g=g+(e<<1)|0;e=c[j>>2]|0}o=k+(e<<1<<1)|0;b[m>>1]=b[o>>1]|0;b[m+2>>1]=b[o+2>>1]|0;b[m+4>>1]=b[o+4>>1]|0;b[m+6>>1]=b[o+6>>1]|0;b[m+8>>1]=b[o+8>>1]|0;b[m+10>>1]=b[o+10>>1]|0;b[m+12>>1]=b[o+12>>1]|0;b[m+14>>1]=b[o+14>>1]|0;l=n;return}function Ue(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=0;while(1){if((f|0)>=(d|0))break;g=((f&65535)*12|0)>>>16;h=c+(f>>16<<1)|0;i=R(b[h>>1]|0,b[28706+(g<<3)>>1]|0)|0;i=i+(R(b[h+2>>1]|0,b[28706+(g<<3)+2>>1]|0)|0)|0;i=i+(R(b[h+4>>1]|0,b[28706+(g<<3)+4>>1]|0)|0)|0;i=i+(R(b[h+6>>1]|0,b[28706+(g<<3)+6>>1]|0)|0)|0;g=11-g|0;i=i+(R(b[h+8>>1]|0,b[28706+(g<<3)+6>>1]|0)|0)|0;i=i+(R(b[h+10>>1]|0,b[28706+(g<<3)+4>>1]|0)|0)|0;i=i+(R(b[h+12>>1]|0,b[28706+(g<<3)+2>>1]|0)|0)|0;g=(i+(R(b[h+14>>1]|0,b[28706+(g<<3)>>1]|0)|0)>>14)+1>>1;b[a>>1]=(g|0)>32767?32767:((g|0)>-32768?g:-32768)&65535;a=a+2|0;f=f+e|0}return a|0}function Ve(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=a+4|0;i=a+8|0;j=a+12|0;k=a+16|0;l=a+20|0;g=0;while(1){if((g|0)>=(f|0))break;p=b[e+(g<<1)>>1]<<10;n=c[a>>2]|0;m=p-n|0;m=((m>>16)*1746|0)+(((m&65535)*1746|0)>>>16)|0;n=n+m|0;c[a>>2]=p+m;m=c[h>>2]|0;o=n-m|0;o=((o>>16)*14986|0)+(((o&65535)*14986|0)>>>16)|0;m=m+o|0;c[h>>2]=n+o;o=m-(c[i>>2]|0)|0;n=(R(o>>16,-26453)|0)+((R(o&65535,-26453)|0)>>16)|0;c[i>>2]=m+(o+n);n=(m+n>>9)+1>>1;m=g<<1;b[d+(m<<1)>>1]=(n|0)>32767?32767:((n|0)>-32768?n:-32768)&65535;n=c[j>>2]|0;o=p-n|0;o=((o>>16)*6854|0)+(((o&65535)*6854|0)>>>16)|0;n=n+o|0;c[j>>2]=p+o;o=c[k>>2]|0;p=n-o|0;p=((p>>16)*25769|0)+(((p&65535)*25769|0)>>>16)|0;o=o+p|0;c[k>>2]=n+p;p=o-(c[l>>2]|0)|0;n=(R(p>>16,-9994)|0)+((R(p&65535,-9994)|0)>>16)|0;c[l>>2]=o+(p+n);n=(o+n>>9)+1>>1;b[d+((m|1)<<1)>>1]=(n|0)>32767?32767:((n|0)>-32768?n:-32768)&65535;g=g+1|0}return}function We(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ve(a,b,c,d);return}function Xe(a){a=a|0;var b=0;if((a|0)<0){b=0-a|0;if((a|0)<-191){b=0;return b|0}a=b>>5;b=(c[19328+(a<<2)>>2]|0)-(R(c[19352+(a<<2)>>2]<<16>>16,b&31)|0)|0;return b|0}else{if((a|0)>191){b=32767;return b|0}b=a>>5;b=(c[19376+(b<<2)>>2]|0)+(R(c[19352+(b<<2)>>2]<<16>>16,a&31)|0)|0;return b|0}return 0}function Ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=0;while(1){if((f|0)>=(e|0)){h=1;break}c[b+(f<<2)>>2]=f;f=f+1|0}while(1){if((h|0)>=(e|0))break;i=c[a+(h<<2)>>2]|0;g=h;while(1){f=g+-1|0;if((g|0)<=0)break;j=c[a+(f<<2)>>2]|0;if((i|0)>=(j|0))break;c[a+(g<<2)>>2]=j;c[b+(g<<2)>>2]=c[b+(f<<2)>>2];g=f}c[a+(g<<2)>>2]=i;c[b+(g<<2)>>2]=h;h=h+1|0}k=a+(e+-1<<2)|0;j=e+-2|0;g=e;while(1){if((g|0)>=(d|0))break;h=c[a+(g<<2)>>2]|0;if((h|0)<(c[k>>2]|0)){f=j;while(1){if((f|0)<=-1)break;i=c[a+(f<<2)>>2]|0;if((h|0)>=(i|0))break;e=f+1|0;c[a+(e<<2)>>2]=i;c[b+(e<<2)>>2]=c[b+(f<<2)>>2];f=f+-1|0}e=f+1|0;c[a+(e<<2)>>2]=h;c[b+(e<<2)>>2]=g}g=g+1|0}return}function Ze(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;f=1;while(1){if((f|0)>=(c|0))break;g=b[a+(f<<1)>>1]|0;e=f;while(1){d=e+-1|0;if((e|0)<=0)break;h=b[a+(d<<1)>>1]|0;if(g<<16>>16>=h<<16>>16)break;b[a+(e<<1)>>1]=h;e=d}b[a+(e<<1)>>1]=g;f=f+1|0}return}function _e(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=31-($e(f)|0)|0;k=f+-1|0;i=((k|0)>0?k:0)+1&-2;g=f;h=0;while(1){if((h|0)>=(k|0))break;m=b[e+(h<<1)>>1]|0;m=R(m,m)|0;l=b[e+((h|1)<<1)>>1]|0;g=g+((m+(R(l,l)|0)|0)>>>j)|0;h=h+2|0}if((i|0)<(f|0)){m=b[e+(i<<1)>>1]|0;g=g+((R(m,m)|0)>>>j)|0}i=af(j+3-($e(g)|0)|0)|0;j=((k|0)>0?k:0)+1&-2;g=0;h=0;while(1){if((g|0)>=(k|0))break;l=b[e+(g<<1)>>1]|0;l=R(l,l)|0;m=b[e+((g|1)<<1)>>1]|0;g=g+2|0;h=h+((l+(R(m,m)|0)|0)>>>i)|0}if((j|0)>=(f|0)){m=h;c[d>>2]=i;c[a>>2]=m;return}m=b[e+(j<<1)>>1]|0;m=h+((R(m,m)|0)>>>i)|0;c[d>>2]=i;c[a>>2]=m;return}function $e(a){a=a|0;return U(a|0)|0}function af(a){a=a|0;return ((a|0)>0?a:0)|0}function bf(b,c){b=b|0;c=c|0;var d=0;Rb(b,((a[c+2>>0]|0)*5|0)+(a[c+5>>0]|0)|0,32397,8);d=0;while(1){if((d|0)==2)break;Rb(b,a[c+(d*3|0)>>0]|0,32450,8);Rb(b,a[c+(d*3|0)+1>>0]|0,32457,8);d=d+1|0}return}function cf(a,b){a=a|0;b=b|0;Rb(a,b<<24>>24,32422,8);return}function df(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;h=l;l=l+16|0;i=h+12|0;o=h+8|0;n=h+4|0;j=h;_e(n,i,b,f);_e(j,o,d,f);i=c[i>>2]|0;o=c[o>>2]|0;q=ef(i,o)|0;q=q+(q&1)|0;o=c[j>>2]>>q-o;c[j>>2]=o;i=ef(c[n>>2]>>q-i,1)|0;c[n>>2]=i;n=te(b,d,q,f)|0;f=ff(n,i,13)|0;f=(f|0)>16384?16384:(f|0)>-16384?f:-16384;m=f<<16>>16;k=(R(f>>16,m)|0)+((R(f&65535,m)|0)>>16)|0;d=ef(g,(k|0)>0?k:0-k|0)|0;b=q>>1;q=c[e>>2]|0;p=(gf(i)|0)<<b;d=d<<16>>16;p=R(p-(c[e>>2]|0)>>16,d)|0;g=(gf(i)|0)<<b;c[e>>2]=q+(p+((R(g-(c[e>>2]|0)&65535,d)|0)>>16));k=k<<16>>16;k=o-((R(n>>16,m)|0)+((R(n&65535,m)|0)>>16)<<4)+((R(i>>16,k)|0)+((R(i&65535,k)|0)>>16)<<6)|0;c[j>>2]=k;g=e+4|0;j=c[g>>2]|0;i=(gf(k)|0)<<b;i=R(i-(c[g>>2]|0)>>16,d)|0;b=(gf(k)|0)<<b;d=j+(i+((R(b-(c[g>>2]|0)&65535,d)|0)>>16))|0;c[g>>2]=d;g=c[e>>2]|0;g=ff(d,(g|0)>1?g:1,14)|0;c[a>>2]=(g|0)>32767?32767:(g|0)>0?g:0;l=h;return f|0}function ef(a,b){a=a|0;b=b|0;return ((a|0)>(b|0)?a:b)|0}function ff(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=jf((a|0)>0?a:0-a|0)|0;g=a<<e+-1;a=(jf((b|0)>0?b:0-b|0)|0)+-1|0;b=b<<a;d=(536870911/(b>>16|0)|0)<<16>>16;f=(R(g>>16,d)|0)+((R(g&65535,d)|0)>>16)|0;b=Uh(b|0,((b|0)<0)<<31>>31|0,f|0,((f|0)<0)<<31>>31|0)|0;b=Rh(b|0,C|0,29)|0;b=g-(b&-8)|0;d=f+((R(b>>16,d)|0)+((R(b&65535,d)|0)>>16))|0;a=e+28-a-c|0;if((a|0)>=0)return ((a|0)<32?d>>a:0)|0;a=0-a|0;b=-2147483648>>a;c=2147483647>>>a;if((b|0)>(c|0)){if((d|0)>(b|0)){g=b;g=g<<a;return g|0}g=(d|0)<(c|0)?c:d;g=g<<a;return g|0}else{if((d|0)>(c|0)){g=c;g=g<<a;return g|0}g=(d|0)<(b|0)?b:d;g=g<<a;return g|0}return 0}function gf(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;b=e+4|0;d=e;if((a|0)<1){d=0;l=e;return d|0}hf(a,b,d);b=c[b>>2]|0;b=((b&1|0)==0?46214:32768)>>>(b>>1);d=(R(c[d>>2]<<16>>16,13959168)|0)>>16;d=b+((R(b>>16,d)|0)+((R(b&65535,d)|0)>>16))|0;l=e;return d|0}function hf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=jf(a)|0;c[b>>2]=e;c[d>>2]=(kf(a,24-e|0)|0)&127;return}function jf(a){a=a|0;return U(a|0)|0}function kf(a,b){a=a|0;b=b|0;if(!b){b=a;return b|0}if((b|0)<0){b=a<<0-b|a>>>(b+32|0);return b|0}else{b=a<<32-b|a>>>b;return b|0}return 0}function lf(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=0;p=0;while(1){if((p|0)==2)break;q=d+(p<<2)|0;r=e+(p*3|0)|0;o=e+(p*3|0)+1|0;h=2147483647;g=0;a:while(1){if((g|0)>=15)break;l=b[28144+(g<<1)>>1]|0;m=g+1|0;n=b[28144+(m<<1)>>1]|0;n=(R((n<<16>>16)-l>>16,429522944)|0)+(((n&65535)-l&65535)*6554|0)>>16;k=g&255;j=0;i=h;while(1){if((j|0)>=5){h=i;g=m;continue a}g=l+(R(n,j<<17>>16|1)|0)|0;h=c[q>>2]|0;h=(h|0)>(g|0)?h-g|0:g-h|0;if((h|0)>=(i|0))break a;a[r>>0]=k;a[o>>0]=j;j=j+1|0;i=h;f=g}}n=a[r>>0]|0;o=(n<<24>>24)/3|0;a[e+(p*3|0)+2>>0]=o;a[r>>0]=(n&255)+(R(o<<24>>24,-3)|0);c[q>>2]=f;p=p+1|0}c[d>>2]=(c[d>>2]|0)-(c[d+4>>2]|0);return}function mf(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=0;j=0;while(1){if((j|0)<10){g=0;h=0;i=f}else break;while(1){if((h|0)>=(e|0))break;k=c[d+(h<<2)>>2]|0;k=(k|0)>0?k:0-k|0;l=(k|0)>(g|0);f=l?h:i;g=l?k:g;h=h+1|0;i=f}f=(g>>4)+1>>1;if((f|0)<=32767)break;f=(f|0)<163838?f:163838;se(d,e,65470-(((f<<14)+-536854528|0)/((R(f,i+1|0)|0)>>2|0)|0)|0);f=i;j=j+1|0}if((j|0)==10){f=0;while(1){if((f|0)>=(e|0))break;l=d+(f<<2)|0;k=(c[l>>2]>>4)+1>>1;k=(k|0)>32767?32767:(k|0)>-32768?k:-32768;b[a+(f<<1)>>1]=k;c[l>>2]=k<<16>>11;f=f+1|0}return}else{f=0;while(1){if((f|0)>=(e|0))break;b[a+(f<<1)>>1]=(((c[d+(f<<2)>>2]|0)>>>4)+1|0)>>>1;f=f+1|0}return}}function nf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0;e=3.1415927410125732/+(d+1|0);h=2.0-e*e;i=(c|0)<2;c=0;e=i?e:h*.5;f=i?0.0:1.0;while(1){if((c|0)>=(d|0))break;g[a+(c<<2)>>2]=+g[b+(c<<2)>>2]*.5*(f+e);i=c|1;g[a+(i<<2)>>2]=+g[b+(i<<2)>>2]*e;j=h*e-f;i=c|2;g[a+(i<<2)>>2]=+g[b+(i<<2)>>2]*.5*(e+j);i=c|3;g[a+(i<<2)>>2]=+g[b+(i<<2)>>2]*j;c=c+4|0;e=h*j-e;f=j}return}function of(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;a=a+16|0;e=0;while(1){if((e|0)==5)break;g[d+(e<<2)>>2]=+ag(a,b,c);a=a+-4|0;e=e+1|0}return}function pf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0,m=0;i=a+16|0;d=+$f(i,b);g[c>>2]=d;e=1;while(1){if((e|0)==5)break;k=+g[i+(0-e<<2)>>2];j=+g[i+(b-e<<2)>>2];j=d+(k*k-j*j);g[c+(e*6<<2)>>2]=j;d=j;e=e+1|0}e=a+12|0;a=1;while(1){if((a|0)==5)break;d=+ag(i,e,b);k=d;g[c+(a*5<<2)>>2]=k;g[c+(a<<2)>>2]=k;h=5-a|0;f=1;while(1){if((f|0)>=(h|0))break;m=0-f|0;l=b-f|0;k=d+(+g[i+(m<<2)>>2]*+g[e+(m<<2)>>2]-+g[i+(l<<2)>>2]*+g[e+(l<<2)>>2]);j=k;l=a+f|0;g[c+((l*5|0)+f<<2)>>2]=j;g[c+((f*5|0)+l<<2)>>2]=j;d=k;f=f+1|0}e=e+-4|0;a=a+1|0}return}function qf(b){b=b|0;var d=0,e=0,f=0;Ed(b,b+5094|0);do if((c[b+4528>>2]|0)<13){a[b+4761>>0]=0;d=b+6080|0;e=c[d>>2]|0;f=e+1|0;c[d>>2]=f;if((f|0)>=10){if((e|0)<=29){d=0;break}c[d>>2]=10}c[b+6076>>2]=0;d=0}else{c[b+6080>>2]=0;c[b+6076>>2]=0;a[b+4761>>0]=1;d=1}while(0);a[(c[b+5744>>2]|0)+(b+4716)>>0]=d;return}function rf(d,e,f,h,i,j){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0.0,va=0,wa=0;ta=l;l=l+13584|0;pa=ta+11536|0;n=ta+8848|0;qa=ta+8800|0;ca=ta+24|0;da=ta;ra=ta+4448|0;ea=ta+96|0;fa=ta+80|0;ga=ta+12296|0;ha=ta+64|0;ia=ta+12288|0;ja=ta+48|0;c[ha>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;c[ha+12>>2]=0;ka=d+4616|0;la=c[ka>>2]|0;c[ka>>2]=la+1;ka=d+4766|0;a[ka>>0]=la&3;la=d+4588|0;m=c[la>>2]|0;ma=d+7176+(m<<2)|0;k=d+5094|0;na=d+4580|0;fd(d+16|0,k,c[na>>2]|0);oa=d+4572|0;sf(ma+((c[oa>>2]|0)*5<<2)|0,k,c[na>>2]|0);k=0;while(1){if((k|0)==8)break;ba=ma+(((c[oa>>2]|0)*5|0)+(R(k,c[na>>2]>>3)|0)<<2)|0;g[ba>>2]=+g[ba>>2]+ +(1-(k&2)|0)*9.999999974752427e-07;k=k+1|0}k=n+(m<<2)|0;ba=d+4676|0;a:do if(!(c[ba>>2]|0)){yf(d,pa,n,ma);If(d,pa,k,ma);zf(d,pa,k,ma,h);Of(d,pa,h);tf(d,pa,ma,h);I=d+4732|0;J=d+4576|0;k=dd(I,c[J>>2]|0)|0;m=qa;o=f;p=m+48|0;do{c[m>>2]=c[o>>2];m=m+4|0;o=o+4|0}while((m|0)<(p|0));K=d+144|0;Sh(ra|0,K|0,4352)|0;L=a[ka>>0]|0;M=d+5768|0;N=b[M>>1]|0;O=d+5764|0;P=c[O>>2]|0;Q=pa+692|0;S=d+4762|0;T=d+4584|0;U=pa+744|0;V=d+7164|0;W=(h|0)==2;X=W&1;Y=i+-5|0;G=f+24|0;H=f+28|0;Z=d+4732|0;_=d+4768|0;$=d+5744|0;aa=d+4761|0;F=f+20|0;E=0;D=-1;u=0;t=0;v=0;x=0;w=0;y=0;B=0;C=256;r=-1;n=0;while(1){q=(k|0)==(D|0);if(!q)if((k|0)!=(r|0)){if((E|0)>0){m=f;o=qa;p=m+48|0;do{c[m>>2]=c[o>>2];m=m+4|0;o=o+4|0}while((m|0)<(p|0));Sh(K|0,ra|0,4352)|0;a[ka>>0]=L;b[M>>1]=N;c[O>>2]=P}Wf(d,pa,Z,K,_,ma);o=(E|0)==6;if(o&(t|0)==0){c[ca>>2]=c[f>>2];c[ca+4>>2]=c[f+4>>2];c[ca+8>>2]=c[f+8>>2];c[ca+12>>2]=c[f+12>>2];c[ca+16>>2]=c[f+16>>2];c[ca+20>>2]=c[f+20>>2];n=c[G>>2]|0;c[da>>2]=c[H>>2];c[da+4>>2]=c[H+4>>2];c[da+8>>2]=c[H+8>>2];c[da+12>>2]=c[H+12>>2];c[da+16>>2]=c[H+16>>2]}Xc(d,f,c[$>>2]|0,0,h);Yc(f,a[aa>>0]|0,a[S>>0]|0,_,c[na>>2]|0);m=uf(c[F>>2]|0,c[H>>2]|0)|0;if(o&(t|0)==0&(m|0)>(i|0)){c[f>>2]=c[ca>>2];c[f+4>>2]=c[ca+4>>2];c[f+8>>2]=c[ca+8>>2];c[f+12>>2]=c[ca+12>>2];c[f+16>>2]=c[ca+16>>2];c[f+20>>2]=c[ca+20>>2];c[G>>2]=n;c[H>>2]=c[da>>2];c[H+4>>2]=c[da+4>>2];c[H+8>>2]=c[da+8>>2];c[H+12>>2]=c[da+12>>2];c[H+16>>2]=c[da+16>>2];o=a[U>>0]|0;a[V>>0]=o;m=0;while(1){if((m|0)>=(c[J>>2]|0))break;a[d+4732+m>>0]=4;m=m+1|0}if(!W)a[I>>0]=o;b[M>>1]=N;c[O>>2]=P;m=0;while(1){if((m|0)>=(c[na>>2]|0))break;a[d+4768+m>>0]=0;m=m+1|0}Xc(d,f,c[$>>2]|0,0,h);Yc(f,a[aa>>0]|0,a[S>>0]|0,_,c[na>>2]|0);m=uf(c[F>>2]|0,c[H>>2]|0)|0}if(!(E|j))if((m|0)>(i|0))A=m;else break a;else sa=24}else{m=w;sa=24}else{m=y;sa=24}if((sa|0)==24){sa=0;if((E|0)==6)break;else A=m}z=(A|0)>(i|0);b:do if(!z){if((A|0)>=(Y|0))break a;m=C<<16>>16;if(q){t=1;x=m;y=A;q=B;s=n}else{c[ca>>2]=c[f>>2];c[ca+4>>2]=c[f+4>>2];c[ca+8>>2]=c[f+8>>2];c[ca+12>>2]=c[f+12>>2];c[ca+16>>2]=c[f+16>>2];c[ca+20>>2]=c[f+20>>2];s=c[G>>2]|0;c[da>>2]=c[H>>2];c[da+4>>2]=c[H+4>>2];c[da+8>>2]=c[H+8>>2];c[da+12>>2]=c[H+12>>2];c[da+16>>2]=c[H+16>>2];Sh(ga|0,c[f>>2]|0,s|0)|0;Sh(ea|0,K|0,4352)|0;t=1;x=m;y=A;q=a[V>>0]|0}}else{if(t|0){r=k;k=D;u=1;v=C<<16>>16;w=A;q=B;s=n;break}if((E|0)>1){ua=+g[Q>>2]*1.5;g[Q>>2]=ua>1.5?ua:1.5;a[S>>0]=0;k=-1;u=0}else{u=1;v=C<<16>>16;w=A}r=c[J>>2]|0;s=(E|0)==0;q=0;c:while(1){if((q|0)>=(r|0)){t=0;r=k;k=D;q=B;s=n;break b}m=c[T>>2]|0;t=q+1|0;o=R(t,m)|0;p=0;m=R(q,m)|0;while(1){if((m|0)>=(o|0))break;wa=a[d+4768+m>>0]|0;va=wa<<24>>24;p=p+(wa<<24>>24>-1?va:0-va|0)|0;m=m+1|0}m=ja+(q<<2)|0;do if(!s){o=ha+(q<<2)|0;if((p|0)<(c[m>>2]|0)?(c[o>>2]|0)==0:0)break;c[o>>2]=1;q=t;continue c}while(0);c[m>>2]=p;b[ia+(q<<1)>>1]=C;q=t}}while(0);do if(!(t&u)){if(!z){wa=ye(((A-i<<7|0)/(c[na>>2]|0)|0)+2048|0)|0;p=C<<16>>16;p=(R(wa>>16,p)|0)+((R(wa&65535,p)|0)>>>16)&65535;break}if(C<<16>>16<16384)p=C<<16>>16<<1&65535;else p=32767}else{p=v-x|0;n=x+((R(p,i-y|0)|0)/(w-y|0)|0)|0;o=n<<16>>16;p=p>>2;m=x+p|0;if((o|0)<=(m|0)){m=v-p|0;m=(o|0)<(m|0)?m:n}p=m&65535}while(0);o=c[J>>2]|0;n=0;while(1){if((n|0)>=(o|0))break;if(!(c[ha+(n<<2)>>2]|0))m=p;else m=b[ia+(n<<1)>>1]|0;va=c[pa+728+(n<<2)>>2]|0;wa=m<<16>>16;wa=(R(va>>16,wa)|0)+((R(va&65535,wa)|0)>>16)|0;c[fa+(n<<2)>>2]=(wa|0)>8388607?2147483392:((wa|0)>-8388608?wa:-8388608)<<8;n=n+1|0}a[V>>0]=a[U>>0]|0;_c(I,fa,V,X,o);n=c[J>>2]|0;o=dd(I,n)|0;m=0;while(1){if((m|0)>=(n|0))break;g[pa+(m<<2)>>2]=+(c[fa+(m<<2)>>2]|0)*.0000152587890625;m=m+1|0}E=E+1|0;D=k;k=o;B=q;C=p;n=s}if((t|0)!=0&(q|(m|0)>(i|0))){c[f>>2]=c[ca>>2];c[f+4>>2]=c[ca+4>>2];c[f+8>>2]=c[ca+8>>2];c[f+12>>2]=c[ca+12>>2];c[f+16>>2]=c[ca+16>>2];c[f+20>>2]=c[ca+20>>2];c[G>>2]=n;c[H>>2]=c[da>>2];c[H+4>>2]=c[da+4>>2];c[H+8>>2]=c[da+8>>2];c[H+12>>2]=c[da+12>>2];c[H+16>>2]=c[da+16>>2];Sh(c[f>>2]|0,ga|0,n|0)|0;Sh(K|0,ea|0,4352)|0;a[V>>0]=B}}while(0);Wh(d+7176|0,d+7176+(c[na>>2]<<2)|0,(c[la>>2]|0)+((c[oa>>2]|0)*5|0)<<2|0)|0;if(c[ba>>2]|0){wa=0;c[e>>2]=wa;l=ta;return 0}c[d+4540>>2]=c[pa+228+((c[d+4576>>2]|0)+-1<<2)>>2];a[d+4537>>0]=a[d+4761>>0]|0;c[d+4660>>2]=0;wa=(uf(c[f+20>>2]|0,c[f+28>>2]|0)|0)+7>>3;c[e>>2]=wa;l=ta;return 0}function sf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;while(1){e=d+-1|0;if((d|0)<=0)break;g[a+(e<<2)>>2]=+(b[c+(e<<1)>>1]|0);d=e}return}function tf(e,f,h,i){e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+4384|0;n=s+4368|0;o=s+4352|0;p=s;q=e+5744|0;j=c[q>>2]|0;r=e+6096+(j*36|0)|0;if(!(c[e+6088>>2]|0)){l=s;return}if((c[e+4528>>2]|0)<=77){l=s;return}c[e+4720+(j<<2)>>2]=1;Sh(p|0,e+144|0,4352)|0;j=r;k=e+4732|0;m=j+36|0;do{b[j>>1]=b[k>>1]|0;j=j+2|0;k=k+2|0}while((j|0)<(m|0));m=e+4576|0;j=c[m>>2]|0;Sh(o|0,f|0,j<<2|0)|0;k=c[q>>2]|0;if((k|0)!=0?(c[e+4720+(k+-1<<2)>>2]|0)!=0:0)k=e+4536|0;else{k=e+4536|0;a[k>>0]=a[e+7164>>0]|0;a[r>>0]=vf((d[r>>0]|0)+(c[e+6092>>2]|0)<<24>>24)|0;j=c[m>>2]|0}bd(n,r,k,(i|0)==2&1,j);j=0;while(1){if((j|0)>=(c[m>>2]|0))break;g[f+(j<<2)>>2]=+(c[n+(j<<2)>>2]|0)*.0000152587890625;j=j+1|0}Wf(e,f,r,p,e+6204+((c[q>>2]|0)*320|0)|0,h);Sh(f|0,o|0,c[m>>2]<<2|0)|0;l=s;return}function uf(a,b){a=a|0;b=b|0;return (U(b|0)|0)+-32+a|0}function vf(a){a=a|0;return ((a|0)<63?a:63)|0}function wf(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var g=0.0,h=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;s=l;l=l+1696|0;o=s+1600|0;p=s+1664|0;q=s+1536|0;r=s;j=b+4636|0;h=c[j>>2]|0;k=(c[b+4584>>2]|0)+h|0;m=b+4763|0;a[m>>0]=4;n=b+4576|0;g=+Zf(o,e,f,k,c[n>>2]|0,h);a:do if((c[b+4628>>2]|0?(c[b+4660>>2]|0)==0:0)?(c[n>>2]|0)==4:0){n=k<<1;g=g-+Zf(q,e+(n<<2)|0,f,k,2,c[j>>2]|0);Sf(d,q,c[j>>2]|0);h=b+4496|0;f=3402823466385288598117041.0e14;b=3;while(1){if((b|0)<=-1)break a;ed(p,h,d,b,c[j>>2]|0);Uf(q,p,c[j>>2]|0);Af(r,q,e,n,c[j>>2]|0);t=c[j>>2]|0;u=r+(t<<2)|0;t=k-t|0;i=+$f(u,t);i=i+ +$f(u+(k<<2)|0,t);if(!(i<g)){if(i>f)break a}else{a[m>>0]=b;g=i}f=i;b=b+-1|0}}while(0);if((a[m>>0]|0)!=4){l=s;return}Sf(d,o,c[j>>2]|0);l=s;return}function xf(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,l=0.0,m=0;j=f+5|0;i=b;b=0;while(1){if((b|0)>=(h|0))break;m=d+(-2-(c[e+(b<<2)>>2]|0)<<2)|0;pf(m,f,a);of(m,d,f,i);l=+$f(d,j);k=(+g[a>>2]+ +g[a+96>>2])*.014999999664723873+1.0;k=1.0/(l>k?l:k);lg(a,k,25);lg(i,k,5);a=a+100|0;i=i+20|0;d=d+(f<<2)|0;b=b+1|0}return}function yf(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;j=l;l=l+1744|0;q=j+1664|0;m=j+1600|0;n=j+1536|0;s=j;v=d+4592|0;t=c[v>>2]|0;k=c[d+4588>>2]|0;i=t+(c[d+4580>>2]|0)+k|0;k=h+(0-k<<2)|0;r=d+4544|0;u=k+(i<<2)+(0-(c[r>>2]|0)<<2)|0;nf(s,u,1,t);h=c[v>>2]|0;v=s+(h<<2)|0;u=u+(h<<2)|0;t=(c[r>>2]|0)-(h<<1)|0;Sh(v|0,u|0,t<<2|0)|0;nf(v+(t<<2)|0,u+(t<<2)|0,2,h);h=d+4644|0;Yf(q,s,c[r>>2]|0,(c[h>>2]|0)+1|0);p=+g[q>>2];p=p+(p*1.0000000474974513e-03+1.0);g[q>>2]=p;o=+mg(n,q,c[h>>2]|0);g[e+704>>2]=p/(o>1.0?o:1.0);bg(m,n,c[h>>2]|0);_f(m,c[h>>2]|0,.9900000095367432);Af(f,m,k,i,c[h>>2]|0);i=d+4761|0;if(a[i>>0]|0?(c[d+4660>>2]|0)==0:0)if(!(cg(f,e+228|0,d+4758|0,d+4760|0,d+10056|0,c[d+4540>>2]|0,+(c[d+4648>>2]|0)*.0000152587890625,.6000000238418579-+(c[h>>2]|0)*.004000000189989805-+(c[d+4528>>2]|0)*.10000000149011612*.00390625-+(a[d+4537>>0]>>1|0)*.15000000596046448-+(c[d+4708>>2]|0)*.10000000149011612*.000030517578125,c[d+4572>>2]|0,c[d+4640>>2]|0,c[d+4576>>2]|0)|0)){a[i>>0]=2;l=j;return}else{a[i>>0]=1;l=j;return}v=e+228|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;b[d+4758>>1]=0;a[d+4760>>0]=0;g[d+10056>>2]=0.0;l=j;return}function zf(d,e,f,h,i){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;u=l;l=l+2064|0;m=u+1632|0;n=u+1552|0;s=u+1536|0;j=u+2032|0;t=u;r=d+4576|0;q=c[r>>2]|0;k=0;while(1){if((k|0)>=(q|0))break;g[s+(k<<2)>>2]=1.0/+g[e+(k<<2)>>2];k=k+1|0}if((a[d+4761>>0]|0)==2){o=e+228|0;p=d+4584|0;xf(m,n,f,o,c[p>>2]|0,q);f=e+144|0;Xf(f,d+4736|0,d+4764|0,d+4652|0,e+708|0,m,n,c[p>>2]|0,c[r>>2]|0);Hf(d,e,i);q=c[d+4636>>2]|0;Gf(t,h+(0-q<<2)|0,f,o,s,c[p>>2]|0,c[r>>2]|0,q)}else{o=d+4636|0;f=c[o>>2]|0;p=d+4584|0;n=t;i=h+(0-f<<2)|0;m=0;k=q;while(1){if((m|0)>=(k|0))break;kg(n,i,+g[s+(m<<2)>>2],(c[p>>2]|0)+f|0);k=c[p>>2]|0;q=c[o>>2]|0;n=n+(k+q<<2)|0;i=i+(k<<2)|0;m=m+1|0;k=c[r>>2]|0;f=q}Qh(e+144|0,0,k*20|0)|0;g[e+708>>2]=0.0;c[d+4652>>2]=0}if(c[d+4660>>2]|0){v=.009999999776482582;wf(d,j,t,v);h=e+16|0;f=d+4496|0;Vf(d,h,j,f);p=e+712|0;q=d+4584|0;q=c[q>>2]|0;s=c[r>>2]|0;k=d+4636|0;k=c[k>>2]|0;Qf(p,t,h,e,q,s,k);k=f+32|0;do{b[f>>1]=b[j>>1]|0;f=f+2|0;j=j+2|0}while((f|0)<(k|0));l=u;return}v=+aa(+(+g[e+708>>2]/3.0))/1.0e4;v=v/(+g[e+700>>2]*.75+.25);wf(d,j,t,v);h=e+16|0;f=d+4496|0;Vf(d,h,j,f);p=e+712|0;q=d+4584|0;q=c[q>>2]|0;s=c[r>>2]|0;k=d+4636|0;k=c[k>>2]|0;Qf(p,t,h,e,q,s,k);k=f+32|0;do{b[f>>1]=b[j>>1]|0;f=f+2|0;j=j+2|0}while((f|0)<(k|0));l=u;return}function Af(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;switch(e|0){case 6:{Bf(a,b,c,d);break}case 8:{Cf(a,b,c,d);break}case 10:{Df(a,b,c,d);break}case 12:{Ef(a,b,c,d);break}case 16:{Ff(a,b,c,d);break}default:{}}Qh(a|0,0,e<<2|0)|0;return}function Bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0;f=b+4|0;h=b+8|0;i=b+12|0;j=b+16|0;k=b+20|0;e=6;while(1){if((e|0)>=(d|0))break;l=c+(e+-1<<2)|0;g[a+(e<<2)>>2]=+g[l+4>>2]-(+g[l>>2]*+g[b>>2]+ +g[l+-4>>2]*+g[f>>2]+ +g[l+-8>>2]*+g[h>>2]+ +g[l+-12>>2]*+g[i>>2]+ +g[l+-16>>2]*+g[j>>2]+ +g[l+-20>>2]*+g[k>>2]);e=e+1|0}return}function Cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=b+4|0;i=b+8|0;j=b+12|0;k=b+16|0;l=b+20|0;m=b+24|0;f=b+28|0;e=8;while(1){if((e|0)>=(d|0))break;n=c+(e+-1<<2)|0;g[a+(e<<2)>>2]=+g[n+4>>2]-(+g[n>>2]*+g[b>>2]+ +g[n+-4>>2]*+g[h>>2]+ +g[n+-8>>2]*+g[i>>2]+ +g[n+-12>>2]*+g[j>>2]+ +g[n+-16>>2]*+g[k>>2]+ +g[n+-20>>2]*+g[l>>2]+ +g[n+-24>>2]*+g[m>>2]+ +g[n+-28>>2]*+g[f>>2]);e=e+1|0}return}function Df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=b+4|0;k=b+8|0;l=b+12|0;m=b+16|0;n=b+20|0;o=b+24|0;f=b+28|0;h=b+32|0;i=b+36|0;e=10;while(1){if((e|0)>=(d|0))break;p=c+(e+-1<<2)|0;g[a+(e<<2)>>2]=+g[p+4>>2]-(+g[p>>2]*+g[b>>2]+ +g[p+-4>>2]*+g[j>>2]+ +g[p+-8>>2]*+g[k>>2]+ +g[p+-12>>2]*+g[l>>2]+ +g[p+-16>>2]*+g[m>>2]+ +g[p+-20>>2]*+g[n>>2]+ +g[p+-24>>2]*+g[o>>2]+ +g[p+-28>>2]*+g[f>>2]+ +g[p+-32>>2]*+g[h>>2]+ +g[p+-36>>2]*+g[i>>2]);e=e+1|0}return}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;l=b+4|0;m=b+8|0;n=b+12|0;o=b+16|0;p=b+20|0;q=b+24|0;f=b+28|0;h=b+32|0;i=b+36|0;j=b+40|0;k=b+44|0;e=12;while(1){if((e|0)>=(d|0))break;r=c+(e+-1<<2)|0;g[a+(e<<2)>>2]=+g[r+4>>2]-(+g[r>>2]*+g[b>>2]+ +g[r+-4>>2]*+g[l>>2]+ +g[r+-8>>2]*+g[m>>2]+ +g[r+-12>>2]*+g[n>>2]+ +g[r+-16>>2]*+g[o>>2]+ +g[r+-20>>2]*+g[p>>2]+ +g[r+-24>>2]*+g[q>>2]+ +g[r+-28>>2]*+g[f>>2]+ +g[r+-32>>2]*+g[h>>2]+ +g[r+-36>>2]*+g[i>>2]+ +g[r+-40>>2]*+g[j>>2]+ +g[r+-44>>2]*+g[k>>2]);e=e+1|0}return}function Ff(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;p=b+4|0;q=b+8|0;r=b+12|0;s=b+16|0;t=b+20|0;u=b+24|0;f=b+28|0;h=b+32|0;i=b+36|0;j=b+40|0;k=b+44|0;l=b+48|0;m=b+52|0;n=b+56|0;o=b+60|0;e=16;while(1){if((e|0)>=(d|0))break;v=c+(e+-1<<2)|0;g[a+(e<<2)>>2]=+g[v+4>>2]-(+g[v>>2]*+g[b>>2]+ +g[v+-4>>2]*+g[p>>2]+ +g[v+-8>>2]*+g[q>>2]+ +g[v+-12>>2]*+g[r>>2]+ +g[v+-16>>2]*+g[s>>2]+ +g[v+-20>>2]*+g[t>>2]+ +g[v+-24>>2]*+g[u>>2]+ +g[v+-28>>2]*+g[f>>2]+ +g[v+-32>>2]*+g[h>>2]+ +g[v+-36>>2]*+g[i>>2]+ +g[v+-40>>2]*+g[j>>2]+ +g[v+-44>>2]*+g[k>>2]+ +g[v+-48>>2]*+g[l>>2]+ +g[v+-52>>2]*+g[m>>2]+ +g[v+-56>>2]*+g[n>>2]+ +g[v+-60>>2]*+g[o>>2]);e=e+1|0}return}function Gf(a,b,d,e,f,h,i,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;var m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0.0;u=l;l=l+32|0;t=u;s=h+k|0;r=0;while(1){if((r|0)>=(i|0))break;m=0-(c[e+(r<<2)>>2]|0)|0;q=+g[f+(r<<2)>>2];n=r*5|0;k=0;while(1){if((k|0)==5)break;c[t+(k<<2)>>2]=c[d+(n+k<<2)>>2];k=k+1|0}m=b+(m<<2)|0;n=0;while(1){if((n|0)>=(s|0))break;v=c[b+(n<<2)>>2]|0;o=a+(n<<2)|0;c[o>>2]=v;k=0;p=(c[j>>2]=v,+g[j>>2]);while(1){if((k|0)==5)break;w=p-+g[t+(k<<2)>>2]*+g[m+(2-k<<2)>>2];g[o>>2]=w;k=k+1|0;p=w}g[o>>2]=p*q;m=m+4|0;n=n+1|0}r=r+1|0;a=a+(s<<2)|0;b=b+(h<<2)|0}l=u;return}function Hf(d,e,f){d=d|0;e=e|0;f=f|0;var h=0.0;if(!f){h=+((c[d+4612>>2]|0)+(c[d+5740>>2]|0)|0)*+g[e+708>>2]*.10000000149011612;if(!(h>2.0))if(h<0.0)f=0;else f=~~h;else f=2}else f=0;a[d+4765>>0]=f;g[e+224>>2]=+(b[28184+(f<<24>>24<<1)>>1]|0)*.00006103515625;return}function If(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;C=l;l=l+1168|0;v=C+200|0;w=C+100|0;x=C;h=f+(0-(c[b+4596>>2]|0)<<2)|0;f=b+4712|0;i=+(c[f>>2]|0)*.0078125;y=b+4692|0;m=+((c[y>>2]|0)+(c[b+4696>>2]|0)|0)*.5*.000030517578125;A=d+696|0;g[A>>2]=m;k=+Jf((i+-20.0)*.25);B=d+700|0;g[B>>2]=k;if(!(c[b+4672>>2]|0)){o=1.0-+(c[b+4528>>2]|0)*.00390625;i=i-k*2.0*(m*.5+.5)*o*o}z=b+4761|0;do if((a[z>>0]|0)!=2){o=i+(+(c[f>>2]|0)*-.4000000059604645*.0078125+6.0)*(1.0-m);q=b+4572|0;j=c[q>>2]<<1;r=b+4576|0;p=((c[r>>2]<<16>>16)*5|0)/2|0;n=+(j|0);f=e;i=0.0;e=0;k=0.0;while(1){if((e|0)>=(p|0))break;m=+Kf(n+ +$f(f,j));if((e|0)>0)i=i+ +E(+(m-k));f=f+(j<<2)|0;e=e+1|0;k=m}f=b+4762|0;if(i>+(p+-1|0)*.6000000238418579){a[f>>0]=0;break}else{a[f>>0]=1;break}}else{o=i+ +g[b+10056>>2]*2.0;a[b+4762>>0]=0;q=b+4572|0;r=b+4576|0}while(0);k=+g[d+704>>2]*1.0000000474974513e-03;k=.9399999976158142/(k*k+1.0);p=b+4668|0;m=+(c[p>>2]|0)*.0000152587890625+ +g[B>>2]*.009999999776482582;s=b+4600|0;t=b+4584|0;u=b+4632|0;j=0;while(1){f=c[r>>2]|0;if((j|0)>=(f|0))break;D=c[q>>2]|0;e=D*3|0;f=((c[s>>2]|0)-e|0)/2|0;nf(v,h,1,f);Sh(v+(f<<2)|0,h+(f<<2)|0,D*12|0)|0;e=f+e|0;nf(v+(e<<2)|0,h+(e<<2)|0,2,f);h=h+(c[t>>2]<<2)|0;f=c[s>>2]|0;e=c[u>>2]|0;if((c[p>>2]|0)>0)Rf(w,v,m,f,e);else Yf(w,v,f,e+1|0);i=+g[w>>2];g[w>>2]=i+(i*2.9999999242136255e-05+1.0);i=+mg(x,w,c[u>>2]|0);e=d+244+(j*24<<2)|0;bg(e,x,c[u>>2]|0);i=+F(+i);f=d+(j<<2)|0;g[f>>2]=i;if((c[p>>2]|0)>0)g[f>>2]=i*+Lf(e,m,c[u>>2]|0);_f(e,c[u>>2]|0,k);f=c[u>>2]|0;if((c[p>>2]|0)>0)Mf(e,m,f);else Nf(e,f);j=j+1|0}i=+aa(+(o*-.1599999964237213));h=0;while(1){if((h|0)>=(f|0))break;f=d+(h<<2)|0;g[f>>2]=+g[f>>2]*i+1.2483305931091309;h=h+1|0;f=c[r>>2]|0}e=b+4528|0;i=((+(c[y>>2]|0)*.000030517578125+-1.0)*.5+1.0)*4.0*(+(c[e>>2]|0)*.00390625);a:do if((a[z>>0]|0)==2){h=0;while(1){if((h|0)>=(f|0))break;o=.20000000298023224/+(c[q>>2]|0)+3.0/+(c[d+228+(h<<2)>>2]|0);g[d+628+(h<<2)>>2]=o+-1.0;g[d+644+(h<<2)>>2]=1.0-o-o*i;h=h+1|0;f=c[r>>2]|0}k=-.25-+(c[e>>2]|0)*.26249998807907104*.00390625}else{o=1.2999999523162842/+(c[q>>2]|0);e=d+628|0;g[e>>2]=o+-1.0;j=d+644|0;g[j>>2]=1.0-o-o*i*.6000000238418579;h=1;while(1){f=c[r>>2]|0;if((h|0)>=(f|0)){k=-.25;break a}c[d+628+(h<<2)>>2]=c[e>>2];c[d+644+(h<<2)>>2]=c[j>>2];h=h+1|0}}while(0);if((a[z>>0]|0)==2)i=((1.0-(1.0-+g[B>>2])*+g[A>>2])*.20000000298023224+.30000001192092896)*+F(+(+g[b+10056>>2]));else i=0.0;j=b+7168|0;e=b+7172|0;h=0;while(1){if((h|0)>=(f|0))break;o=+g[j>>2];o=o+(i-o)*.4000000059604645;g[j>>2]=o;g[d+676+(h<<2)>>2]=o;o=+g[e>>2];o=o+(k-o)*.4000000059604645;g[e>>2]=o;g[d+660+(h<<2)>>2]=o;h=h+1|0;f=c[r>>2]|0}l=C;return}function Jf(a){a=+a;return +(1.0/(+O(+-a)+1.0))}function Kf(a){a=+a;return +(+Ih(a)*3.32192809488736)}function Lf(a,b,c){a=a|0;b=+b;c=c|0;var d=0.0;d=+g[a+(c+-1<<2)>>2];c=c+-2|0;while(1){d=d*b;if((c|0)<=-1)break;d=+g[a+(c<<2)>>2]-d;c=c+-1|0}return +(1.0/(d+1.0))}function Mf(a,b,c){a=a|0;b=+b;c=c|0;var d=0,e=0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0.0,m=0;e=c;while(1){d=e+-1|0;if((e|0)<=1)break;j=a+(e+-2<<2)|0;g[j>>2]=+g[j>>2]-+g[a+(d<<2)>>2]*b;e=d}k=1.0-b*b;f=k/(+g[a>>2]*b+1.0);d=0;while(1){if((d|0)>=(c|0)){d=0;j=0;break}j=a+(d<<2)|0;g[j>>2]=+g[j>>2]*f;d=d+1|0}while(1){if((j|0)<10){i=-1.0;e=0}else{d=23;break}while(1){if((e|0)>=(c|0))break;l=+E(+(+g[a+(e<<2)>>2]));h=l>i;i=h?l:i;d=h?e:d;e=e+1|0}if(!(i<=3.999000072479248))e=1;else{d=23;break}while(1){if((e|0)>=(c|0))break;h=a+(e+-1<<2)|0;g[h>>2]=+g[h>>2]+ +g[a+(e<<2)>>2]*b;e=e+1|0}f=1.0/f;e=0;while(1){if((e|0)>=(c|0))break;h=a+(e<<2)|0;g[h>>2]=+g[h>>2]*f;e=e+1|0}_f(a,c,.9900000095367432-(+(j|0)*.10000000149011612+.800000011920929)*(i+-3.999000072479248)/(i*+(d+1|0)));h=c;while(1){e=h+-1|0;if((h|0)<=1)break;m=a+(h+-2<<2)|0;g[m>>2]=+g[m>>2]-+g[a+(e<<2)>>2]*b;h=e}f=k/(+g[a>>2]*b+1.0);e=0;while(1){if((e|0)>=(c|0))break;m=a+(e<<2)|0;g[m>>2]=+g[m>>2]*f;e=e+1|0}j=j+1|0}if((d|0)==23)return}function Nf(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0,h=0,i=0.0,j=0;c=0;e=0;while(1){if((e|0)<10){d=-1.0;f=0}else{c=7;break}while(1){if((f|0)>=(b|0))break;i=+E(+(+g[a+(f<<2)>>2]));j=i>d;h=j?f:c;d=j?i:d;f=f+1|0;c=h}if(d<=3.999000072479248){c=7;break}_f(a,b,.9900000095367432-(+(e|0)*.10000000149011612+.800000011920929)*(d+-3.999000072479248)/(d*+(c+1|0)));e=e+1|0}if((c|0)==7)return}function Of(d,e,f){d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+16|0;m=o;n=d+4761|0;a:do if((a[n>>0]|0)==2){j=1.0-+Pf((+g[e+708>>2]+-12.0)*.25)*.5;i=d+4576|0;h=0;while(1){if((h|0)>=(c[i>>2]|0))break a;k=e+(h<<2)|0;g[k>>2]=+g[k>>2]*j;h=h+1|0}}else i=d+4576|0;while(0);j=+aa(+((21.0-+(c[d+4712>>2]|0)*.0078125)*.33000001311302185));j=j/+(c[d+4584>>2]|0);h=0;while(1){k=c[i>>2]|0;if((h|0)>=(k|0)){h=0;break}k=e+(h<<2)|0;p=+g[k>>2];p=+F(+(p*p+ +g[e+712+(h<<2)>>2]*j));g[k>>2]=p<32767.0?p:32767.0;h=h+1|0}while(1){if((h|0)>=(k|0))break;c[m+(h<<2)>>2]=~~(+g[e+(h<<2)>>2]*65536.0);h=h+1|0}Sh(e+728|0,m|0,k<<2|0)|0;h=d+7164|0;a[e+744>>0]=a[h>>0]|0;_c(d+4732|0,m,h,(f|0)==2&1,c[i>>2]|0);h=0;while(1){if((h|0)>=(c[i>>2]|0))break;g[e+(h<<2)>>2]=+(c[m+(h<<2)>>2]|0)*.0000152587890625;h=h+1|0}i=a[n>>0]|0;do if(i<<24>>24==2){h=d+4762|0;if(+g[e+708>>2]+ +(c[d+4708>>2]|0)*.000030517578125>1.0){a[h>>0]=0;h=0;break}else{a[h>>0]=1;h=1;break}}else h=a[d+4762>>0]|0;while(0);g[e+692>>2]=+(c[d+4624>>2]|0)*-.05000000074505806+1.2000000476837158+ +(c[d+4528>>2]|0)*-.20000000298023224*.00390625+ +g[e+696>>2]*-.10000000149011612+ +g[e+700>>2]*-.20000000298023224+ +(b[28176+(i<<24>>24>>1<<2)+(h<<24>>24<<1)>>1]|0)*.0009765625*.800000011920929;l=o;return}function Pf(a){a=+a;return +(1.0/(+O(+-a)+1.0))}function Qf(a,b,c,d,e,f,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0.0;n=l;l=l+768|0;k=n;m=k+(h<<2)|0;j=h+e|0;i=j<<1;Af(k,c,b,i,h);o=+g[d>>2];g[a>>2]=o*o*+$f(m,e);o=+g[d+4>>2];j=m+(j<<2)|0;g[a+4>>2]=o*o*+$f(j,e);if((f|0)!=4){l=n;return}Af(k,c+64|0,b+(i<<2)|0,i,h);o=+g[d+8>>2];g[a+8>>2]=o*o*+$f(m,e);o=+g[d+12>>2];g[a+12>>2]=o*o*+$f(j,e);l=n;return}function Rf(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;var f=0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0;q=l;l=l+400|0;o=q+200|0;p=q;Qh(o|0,0,200)|0;Qh(p|0,0,200)|0;m=o+(e<<3)|0;n=p+(e<<3)|0;k=0;i=0.0;while(1){if((k|0)>=(d|0)){f=0;break}j=+g[b+(k<<2)>>2];f=0;while(1){if((f|0)>=(e|0))break;v=f|1;w=o+(v<<3)|0;u=+h[w>>3];t=i+c*(u-j);h[o+(f<<3)>>3]=j;s=p+(f<<3)|0;h[s>>3]=+h[s>>3]+ +h[o>>3]*j;s=f+2|0;r=+h[o+(s<<3)>>3];h[w>>3]=t;v=p+(v<<3)|0;h[v>>3]=+h[v>>3]+ +h[o>>3]*t;j=u+c*(r-t);f=s;i=r}h[m>>3]=j;i=+h[o>>3];h[n>>3]=+h[n>>3]+i*j;k=k+1|0}while(1){if((f|0)>(e|0))break;g[a+(f<<2)>>2]=+h[p+(f<<3)>>3];f=f+1|0}l=q;return}function Sf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0;h=l;l=l+64|0;f=h;e=0;while(1){if((e|0)>=(d|0))break;c[f+(e<<2)>>2]=Tf(+g[b+(e<<2)>>2]*65536.0)|0;e=e+1|0}le(a,f,d);l=h;return}function Tf(a){a=+a;return Jh(a)|0}function Uf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;f=l;l=l+32|0;e=f;Ee(e,c,d);c=0;while(1){if((c|0)>=(d|0))break;g[a+(c<<2)>>2]=+(b[e+(c<<1)>>1]|0)*.000244140625;c=c+1|0}l=f;return}function Vf(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,i=0;i=l;l=l+64|0;h=i;Wd(a,h,e,f);f=a+4636|0;a=0;while(1){if((a|0)==2)break;else e=0;while(1){if((e|0)>=(c[f>>2]|0))break;g[d+(a<<6)+(e<<2)>>2]=+(b[h+(a<<5)+(e<<1)>>1]|0)*.000244140625;e=e+1|0}a=a+1|0}l=i;return}function Wf(d,e,f,h,i,j){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=l;l=l+1008|0;w=A+360|0;x=A+48|0;y=A+296|0;z=A+256|0;s=A+64|0;t=A+32|0;u=A+16|0;v=A;r=c[d+4576>>2]|0;o=d+4632|0;m=0;while(1){if((m|0)>=(r|0)){k=0;break}p=c[o>>2]|0;q=m*24|0;k=0;while(1){if((k|0)>=(p|0))break;B=q+k|0;b[s+(B<<1)>>1]=Tf(+g[e+244+(B<<2)>>2]*8192.0)|0;k=k+1|0}m=m+1|0}while(1){if((k|0)>=(r|0))break;B=(Tf(+g[e+644+(k<<2)>>2]*16384.0)|0)<<16;c[t+(k<<2)>>2]=B|(Tf(+g[e+628+(k<<2)>>2]*16384.0)|0)&65535;c[u+(k<<2)>>2]=Tf(+g[e+660+(k<<2)>>2]*16384.0)|0;c[v+(k<<2)>>2]=Tf(+g[e+676+(k<<2)>>2]*16384.0)|0;k=k+1|0}n=+g[e+692>>2]*1024.0;m=r*5|0;k=0;while(1){if((k|0)>=(m|0))break;b[z+(k<<1)>>1]=Tf(+g[e+144+(k<<2)>>2]*16384.0)|0;k=k+1|0}q=Tf(n)|0;o=d+4636|0;k=0;while(1){if((k|0)==2){k=0;break}p=c[o>>2]|0;m=0;while(1){if((m|0)>=(p|0))break;b[y+(k<<5)+(m<<1)>>1]=Tf(+g[e+16+(k<<6)+(m<<2)>>2]*4096.0)|0;m=m+1|0}k=k+1|0}while(1){if((k|0)>=(r|0))break;c[x+(k<<2)>>2]=Tf(+g[e+(k<<2)>>2]*65536.0)|0;k=k+1|0}if((a[f+29>>0]|0)==2)k=b[28184+(a[f+33>>0]<<1)>>1]|0;else k=0;o=c[d+4580>>2]|0;m=0;while(1){if((m|0)>=(o|0))break;b[w+(m<<1)>>1]=Tf(+g[j+(m<<2)>>2])|0;m=m+1|0}if((c[d+4624>>2]|0)<=1?(c[d+4668>>2]|0)<=0:0){jd(d,h,f,w,i,y,z,s,v,u,t,x,e+228|0,q,k);l=A;return}rd(d,h,f,w,i,y,z,s,v,u,t,x,e+228|0,q,k);l=A;return}function Xf(a,d,e,f,h,i,j,k,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+528|0;s=t+480|0;r=t+488|0;p=t+80|0;q=t;o=m*25|0;n=0;while(1){if((n|0)>=(o|0))break;c[p+(n<<2)>>2]=Tf(+g[i+(n<<2)>>2]*131072.0)|0;n=n+1|0}o=m*5|0;n=0;while(1){if((n|0)>=(o|0))break;c[q+(n<<2)>>2]=Tf(+g[j+(n<<2)>>2]*131072.0)|0;n=n+1|0}Nd(r,d,e,f,s,p,q,k,m);n=0;while(1){if((n|0)>=(o|0))break;g[a+(n<<2)>>2]=+(b[r+(n<<1)>>1]|0)*.00006103515625;n=n+1|0}g[h>>2]=+(c[s>>2]|0)*.0078125;l=t;return}function Yf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;d=(d|0)>(c|0)?c:d;e=0;while(1){if((e|0)>=(d|0))break;g[a+(e<<2)>>2]=+ag(b,b+(e<<2)|0,c-e|0);e=e+1|0}return}function Zf(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;f=f|0;var i=0.0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0.0,G=0.0,H=0.0,I=0;D=l;l=l+976|0;w=D+784|0;x=D+592|0;B=D+392|0;y=D+192|0;C=D;i=+$f(b,R(e,d)|0);Qh(w|0,0,192)|0;j=0;while(1){if((j|0)>=(e|0))break;m=b+((R(j,d)|0)<<2)|0;k=1;while(1){if((k|0)>(f|0))break;A=+ag(m,m+(k<<2)|0,d-k|0);v=w+(k+-1<<3)|0;h[v>>3]=+h[v>>3]+A;k=k+1|0}j=j+1|0}Sh(x|0,w|0,192)|0;A=i*9.999999747378752e-06;u=i+A+9.999999717180685e-10;h[B>>3]=u;h[y>>3]=u;u=c;c=1.0;v=1;k=0;while(1){if((k|0)>=(f|0))break;q=d-k|0;s=q+-1|0;m=0;while(1){if((m|0)>=(e|0))break;t=b+((R(m,d)|0)<<2)|0;n=+g[t+(k<<2)>>2];o=+g[t+(s<<2)>>2];p=o;r=n;j=0;while(1){if((k|0)==(j|0)){j=0;break}G=+g[t+(k-j+-1<<2)>>2];I=w+(j<<3)|0;h[I>>3]=+h[I>>3]-n*G;H=+g[t+(q+j<<2)>>2];I=x+(j<<3)|0;h[I>>3]=+h[I>>3]-o*H;E=+h[C+(j<<3)>>3];p=p+H*E;r=r+G*E;j=j+1|0}while(1){if((j|0)==(v|0))break;I=B+(j<<3)|0;h[I>>3]=+h[I>>3]-r*+g[t+(k-j<<2)>>2];I=y+(j<<3)|0;h[I>>3]=+h[I>>3]-p*+g[t+(q+j+-1<<2)>>2];j=j+1|0}m=m+1|0}n=+h[x+(k<<3)>>3];o=+h[w+(k<<3)>>3];j=0;while(1){if((k|0)==(j|0))break;H=+h[C+(j<<3)>>3];I=k-j+-1|0;n=n+ +h[w+(I<<3)>>3]*H;o=o+ +h[x+(I<<3)>>3]*H;j=j+1|0}s=k+1|0;h[B+(s<<3)>>3]=o;h[y+(s<<3)>>3]=n;o=+h[B>>3];p=+h[y>>3];j=0;while(1){if((k|0)==(j|0))break;H=+h[C+(j<<3)>>3];I=j+1|0;n=n+ +h[y+(k-j<<3)>>3]*H;o=o+ +h[B+(I<<3)>>3]*H;p=p+ +h[y+(I<<3)>>3]*H;j=I}p=n*-2.0/(o+p);o=c*(1.0-p*p);if(!(o<=u)){j=0;c=o;n=p}else{H=+F(+(1.0-u/c));j=1;c=u;n=n>0.0?-H:H}q=s>>1;m=0;while(1){if((m|0)>=(q|0))break;t=C+(m<<3)|0;H=+h[t>>3];I=C+(k-m+-1<<3)|0;G=+h[I>>3];h[t>>3]=H+n*G;h[I>>3]=G+n*H;m=m+1|0}h[C+(k<<3)>>3]=n;if(!j)j=0;else{z=29;break}while(1){if((j|0)>(s|0))break;t=B+(j<<3)|0;H=+h[t>>3];I=y+(k-j+1<<3)|0;G=+h[I>>3];h[t>>3]=H+n*G;h[I>>3]=G+n*H;j=j+1|0}v=v+1|0;k=s}if((z|0)==29){while(1){k=k+1|0;if((k|0)>=(f|0))break;h[C+(k<<3)>>3]=0.0;z=29}if(j|0){j=0;while(1){if((j|0)>=(f|0)){j=0;break}g[a+(j<<2)>>2]=-+h[C+(j<<3)>>3];j=j+1|0}while(1){if((j|0)>=(e|0))break;i=i-+$f(b+((R(j,d)|0)<<2)|0,f);j=j+1|0}H=i*c;l=D;return +H}}i=+h[B>>3];c=1.0;j=0;while(1){if((j|0)>=(f|0))break;H=+h[C+(j<<3)>>3];I=j+1|0;G=+h[B+(I<<3)>>3];g[a+(j<<2)>>2]=-H;i=i+G*H;c=c+H*H;j=I}H=i-A*c;l=D;return +H}function _f(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0,f=0;e=b+-1|0;d=c;b=0;while(1){if((b|0)>=(e|0))break;f=a+(b<<2)|0;g[f>>2]=+g[f>>2]*d;d=d*c;b=b+1|0}f=a+(e<<2)|0;g[f>>2]=+g[f>>2]*d;return}function $f(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0;f=b+-3|0;c=((f|0)>0?f:0)+3&-4;d=0.0;e=0;while(1){if((e|0)>=(f|0))break;k=+g[a+(e<<2)>>2];j=+g[a+((e|1)<<2)>>2];i=+g[a+((e|2)<<2)>>2];h=+g[a+((e|3)<<2)>>2];d=d+(k*k+j*j+i*i+h*h);e=e+4|0}while(1){if((c|0)>=(b|0))break;k=+g[a+(c<<2)>>2];d=d+k*k;c=c+1|0}return +d}function ag(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0,h=0,i=0,j=0,k=0;h=c+-3|0;d=((h|0)>0?h:0)+3&-4;e=0.0;f=0;while(1){if((f|0)>=(h|0))break;k=f|1;j=f|2;i=f|3;e=e+(+g[a+(f<<2)>>2]*+g[b+(f<<2)>>2]+ +g[a+(k<<2)>>2]*+g[b+(k<<2)>>2]+ +g[a+(j<<2)>>2]*+g[b+(j<<2)>>2]+ +g[a+(i<<2)>>2]*+g[b+(i<<2)>>2]);f=f+4|0}while(1){if((d|0)>=(c|0))break;e=e+ +g[a+(d<<2)>>2]*+g[b+(d<<2)>>2];d=d+1|0}return +e}function bg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0,h=0,i=0,j=0,k=0.0,l=0.0,m=0;e=0;while(1){if((e|0)>=(c|0))break;f=+g[b+(e<<2)>>2];h=e+1|0;i=h>>1;d=0;while(1){if((d|0)>=(i|0))break;m=a+(d<<2)|0;k=+g[m>>2];j=a+(e-d+-1<<2)|0;l=+g[j>>2];g[m>>2]=k+l*f;g[j>>2]=l+k*f;d=d+1|0}g[a+(e<<2)>>2]=-f;e=h}return}function cg(d,f,h,i,j,k,m,n,o,p,q){d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=+m;n=+n;o=o|0;p=p|0;q=q|0;var r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0;X=l;l=l+13680|0;K=X+8888|0;D=X+8248|0;r=X+13032|0;w=X+12712|0;x=X;N=X+5864|0;I=X+5604|0;O=X+5560|0;P=X+5464|0;L=X+12408|0;T=X+2744|0;U=X+24|0;s=X+11128|0;t=X+10168|0;u=R((q*5|0)+20|0,o)|0;z=q*20|0;A=z+80|0;B=(q*40|0)+160|0;S=o*5|0;W=o<<1;V=o*18|0;Q=V+-1|0;M=(o|0)==16;do if(!M)if((o|0)==12){dg(t,d,u);c[x>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;Oe(x,r,t,u);eg(K,r,B);s=x;break}else{dg(r,d,B);s=x;break}else{dg(s,d,u);J=x;c[J>>2]=0;c[J+4>>2]=0;Pe(x,r,s,u);eg(K,r,B);s=x}while(0);J=x;c[J>>2]=0;c[J+4>>2]=0;Pe(s,w,r,B);eg(D,w,A);r=z+79|0;while(1){if((r|0)<=0)break;s=D+(r<<2)|0;r=r+-1|0;v=+(~~+g[s>>2]|0)+ +g[D+(r<<2)>>2];if(!(v>32767.0)){if(v<-32768.0)v=-32768.0}else v=32767.0;g[s>>2]=+(~~v<<16>>16)}Qh(N|0,0,q*596|0)|0;w=q>>1;x=I+256|0;z=N+32|0;u=0;s=D+320|0;while(1){if((u|0)>=(w|0)){r=72;break}t=s+-32|0;jc(s,s+-288|0,I,40,65);H=+g[x>>2];v=+$f(s,40);v=v+ +$f(t,40)+16.0e4;g[z>>2]=+g[z>>2]+H*2.0/v;r=9;while(1){if((r|0)==73)break;J=t+-4|0;G=+g[J>>2];H=+g[t+156>>2];H=v+(G*G-H*H);D=N+(r<<2)|0;g[D>>2]=+g[D>>2]+ +g[I+(72-r<<2)>>2]*2.0/H;r=r+1|0;t=J;v=H}u=u+1|0;s=s+160|0}while(1){if((r|0)<=7)break;J=N+(r<<2)|0;H=+g[J>>2];g[J>>2]=H-H*+(r|0)*.000244140625;r=r+-1|0}r=(p<<1)+4|0;ng(z,P,65,r);v=+g[z>>2];if(v<.20000000298023224){Qh(f|0,0,q<<2|0)|0;g[j>>2]=0.0;b[h>>1]=0;h=1;W=0;a[i>>0]=W;l=X;return h|0}v=v*m;s=0;while(1){if((s|0)>=(r|0)){s=r;break}if(!(+g[N+(s+8<<2)>>2]>v))break;J=P+(s<<2)|0;c[J>>2]=(c[J>>2]<<1)+16;s=s+1|0}r=11;while(1){if((r|0)==148){r=0;break}b[L+(r<<1)>>1]=0;r=r+1|0}while(1){if((r|0)>=(s|0)){r=146;break}b[L+(c[P+(r<<2)>>2]<<1)>>1]=1;r=r+1|0}while(1){if((r|0)<=15){J=0;r=16;break}J=r+-1|0;I=L+(r<<1)|0;b[I>>1]=(e[I>>1]|0)+((e[L+(J<<1)>>1]|0)+(e[L+(r+-2<<1)>>1]|0));r=J}while(1){if((r|0)==144){r=146;break}s=r+1|0;if((b[L+(s<<1)>>1]|0)<=0){r=s;continue}c[P+(J<<2)>>2]=r;J=J+1|0;r=s}while(1){if((r|0)<=15){r=0;s=16;break}I=r+-1|0;D=L+(r<<1)|0;b[D>>1]=(e[D>>1]|0)+((e[L+(I<<1)>>1]|0)+(e[L+(r+-2<<1)>>1]|0)+(e[L+(r+-3<<1)>>1]|0));r=I}while(1){if((s|0)==147)break;if((b[L+(s<<1)>>1]|0)>0){b[L+(r<<1)>>1]=s+65534;r=r+1|0}s=s+1|0}Qh(N|0,0,2384)|0;z=(o|0)==8;x=0;u=z?d+640|0:K+640|0;while(1){if((x|0)>=(q|0))break;m=+$f(u,40)+1.0;t=0;while(1){if((t|0)>=(r|0))break;w=b[L+(t<<1)>>1]|0;s=u+(0-w<<2)|0;v=+ag(s,u,40);if(v>0.0)v=v*2.0/(+$f(s,40)+m);else v=0.0;g[N+(x*596|0)+(w<<2)>>2]=v;t=t+1|0}x=x+1|0;u=u+160|0}if((k|0)>0){if((o|0)==12)k=(k<<1|0)/3|0;else k=k>>(M&1);H=+fg(+(k|0))}else H=0.0;I=(q|0)==4;if(I){B=33701;D=11;A=z&(p|0)>0?11:3}else{B=33667;D=3;A=3}F=+(q|0);G=F*.20000000298023224;x=(k|0)>0;E=F*n;z=-1;r=0;y=-1.0e3;C=0.0;u=0;while(1){if((u|0)>=(J|0))break;w=c[P+(u<<2)>>2]|0;k=0;while(1){if((k|0)>=(A|0)){s=0;n=-1.0e3;k=0;break}t=O+(k<<2)|0;g[t>>2]=0.0;s=0;v=0.0;while(1){if((s|0)>=(q|0))break;n=v+ +g[N+(s*596|0)+(w+(a[B+((R(s,D)|0)+k)>>0]|0)<<2)>>2];g[t>>2]=n;s=s+1|0;v=n}k=k+1|0}while(1){if((k|0)>=(A|0))break;m=+g[O+(k<<2)>>2];M=m>n;s=M?k:s;n=M?m:n;k=k+1|0}m=+fg(+(w|0));v=n-G*m;if(x){m=m-H;m=m*m;v=v-G*+g[j>>2]*m/(m+.5)}M=v>y&n>E;z=M?w:z;r=M?s:r;y=M?v:y;C=M?n:C;u=u+1|0}if((z|0)==-1){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;g[j>>2]=0.0;b[h>>1]=0;h=1;W=0;a[i>>0]=W;l=X;return h|0}g[j>>2]=C/F;if((o|0)>8){if((o|0)==12){k=(z<<16>>16)*3|0;k=(k>>1)+(k&1)|0}else k=z<<1;if((W|0)<(V|0))if((k|0)<(V|0))k=(k|0)<(W|0)?W:k;else k=Q;else if((k|0)>(W|0))k=W;else k=(k|0)<(Q|0)?Q:k;r=gg(k+-2|0,W)|0;A=hg(k+2|0,Q)|0;ig(U,d,r,S,q,p);jg(T,d,r,S,q,p);C=.05000000074505806/+(k|0);if(I){B=33745;D=34;z=a[33905+p>>0]|0}else{B=33673;D=12;z=12}y=+$f(d+(o*20<<2)|0,R(S,q)|0)+1.0;w=k;x=0;u=r;r=0;v=-1.0e3;while(1){if((u|0)>(A|0))break;else{k=w;t=0}while(1){if((t|0)<(z|0)){m=0.0;n=y;s=0}else break;while(1){if((s|0)>=(q|0))break;m=m+ +g[U+(s*680|0)+(t*20|0)+(x<<2)>>2];n=n+ +g[T+(s*680|0)+(t*20|0)+(x<<2)>>2];s=s+1|0}if(m>0.0)m=m*2.0/n*(1.0-C*+(t|0));else m=0.0;if(m>v){o=(u+(a[33745+t>>0]|0)|0)<(V|0);k=o?u:k;r=o?t:r;v=o?m:v}t=t+1|0}w=k;x=x+1|0;u=u+1|0}t=(W|0)>(V|0);s=0;while(1){if((s|0)>=(q|0))break;k=w+(a[B+((R(s,D)|0)+r)>>0]|0)|0;u=f+(s<<2)|0;c[u>>2]=k;if(t)if((k|0)>(W|0))k=W;else k=(k|0)<(V|0)?V:k;else if((k|0)>(V|0))k=V;else k=(k|0)<(W|0)?W:k;c[u>>2]=k;s=s+1|0}k=w-W|0}else{k=0;while(1){if((k|0)>=(q|0))break;W=z+(a[B+((R(k,D)|0)+r)>>0]|0)|0;c[f+(k<<2)>>2]=(W|0)>144?144:(W|0)>16?W:16;k=k+1|0}k=z+65520|0}b[h>>1]=k;h=0;W=r&255;a[i>>0]=W;l=X;return h|0}function dg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;while(1){e=d+-1|0;if((d|0)<=0)break;d=Jh(+g[c+(e<<2)>>2])|0;b[a+(e<<1)>>1]=(d|0)>32767?32767:((d|0)>-32768?d:-32768)&65535;d=e}return}function eg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;while(1){e=d+-1|0;if((d|0)<=0)break;g[a+(e<<2)>>2]=+(b[c+(e<<1)>>1]|0);d=e}return}function fg(a){a=+a;return +(+Ih(a)*3.32192809488736)}function gg(a,b){a=a|0;b=b|0;return ((a|0)>(b|0)?a:b)|0}function hg(a,b){a=a|0;b=b|0;return ((a|0)<(b|0)?a:b)|0}function ig(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+176|0;s=u+88|0;t=u;if((g|0)==4){p=33745;q=33881+(h<<3)|0;r=34;o=a[33905+h>>0]|0}else{p=33673;q=33697;r=12;o=12}n=0-e|0;m=0;j=d+(f<<2<<2)|0;while(1){if((m|0)>=(g|0))break;d=m<<1;k=a[q+d>>0]|0;d=a[q+(d|1)>>0]|0;jc(j,j+(n<<2)+(0-d<<2)|0,t,f,d-k+1|0);h=0;e=k;while(1){if((d|0)<(e|0))break;c[s+(h<<2)>>2]=c[t+(d-e<<2)>>2];h=h+1|0;e=e+1|0}d=R(m,r)|0;h=0;while(1){if((h|0)>=(o|0))break;i=(a[p+(d+h)>>0]|0)-k|0;e=0;while(1){if((e|0)==5)break;c[b+(m*680|0)+(h*20|0)+(e<<2)>>2]=c[s+(i+e<<2)>>2];e=e+1|0}h=h+1|0}m=m+1|0;j=j+(f<<2)|0}l=u;return}function jg(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0;v=l;l=l+96|0;u=v;if((h|0)==4){r=33745;s=33881+(i<<3)|0;t=34;q=a[33905+i>>0]|0}else{r=33673;s=33697;t=12;q=12}n=d+(f<<2<<2)|0;o=0;while(1){if((o|0)>=(h|0))break;k=o<<1;p=a[s+k>>0]|0;d=n+(0-(p+e)<<2)|0;j=+$f(d,f)+.001;g[u>>2]=j;k=(a[s+(k|1)>>0]|0)-p|0;i=1;while(1){if((i|0)>(k|0))break;x=+g[d+(f-i<<2)>>2];w=+g[d+(0-i<<2)>>2];w=j-x*x+w*w;g[u+(i<<2)>>2]=w;i=i+1|0;j=w}k=R(o,t)|0;d=0;while(1){if((d|0)>=(q|0))break;m=(a[r+(k+d)>>0]|0)-p|0;i=0;while(1){if((i|0)==5)break;c[b+(o*680|0)+(d*20|0)+(i<<2)>>2]=c[u+(m+i<<2)>>2];i=i+1|0}d=d+1|0}n=n+(f<<2)|0;o=o+1|0}l=v;return}function kg(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0,f=0,h=0;e=d&65532;f=0;while(1){if((f|0)>=(e|0))break;g[a+(f<<2)>>2]=+g[b+(f<<2)>>2]*c;h=f|1;g[a+(h<<2)>>2]=+g[b+(h<<2)>>2]*c;h=f|2;g[a+(h<<2)>>2]=+g[b+(h<<2)>>2]*c;h=f|3;g[a+(h<<2)>>2]=+g[b+(h<<2)>>2]*c;f=f+4|0}while(1){if((e|0)>=(d|0))break;g[a+(e<<2)>>2]=+g[b+(e<<2)>>2]*c;e=e+1|0}return}function lg(a,b,c){a=a|0;b=+b;c=c|0;var d=0,e=0,f=0;d=c&65532;e=0;while(1){if((e|0)>=(d|0))break;f=a+(e<<2)|0;g[f>>2]=+g[f>>2]*b;f=a+((e|1)<<2)|0;g[f>>2]=+g[f>>2]*b;f=a+((e|2)<<2)|0;g[f>>2]=+g[f>>2]*b;f=a+((e|3)<<2)|0;g[f>>2]=+g[f>>2]*b;e=e+4|0}while(1){if((d|0)>=(c|0))break;f=a+(d<<2)|0;g[f>>2]=+g[f>>2]*b;d=d+1|0}return}function mg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0;m=l;l=l+400|0;k=m;d=0;while(1){i=+g[b+(d<<2)>>2];h[k+(d<<4)+8>>3]=i;h[k+(d<<4)>>3]=i;if((d|0)<(c|0))d=d+1|0;else break}e=k+8|0;b=0;a:while(1){if((b|0)>=(c|0))break;f=b+1|0;i=+h[e>>3];i=-+h[k+(f<<4)>>3]/(i>9.999999717180685e-10?i:9.999999717180685e-10);g[a+(b<<2)>>2]=i;j=c-b|0;d=0;while(1){if((d|0)>=(j|0)){b=f;continue a}q=k+(d+b+1<<4)|0;o=+h[q>>3];n=k+(d<<4)+8|0;p=+h[n>>3];h[q>>3]=o+p*i;h[n>>3]=p+o*i;d=d+1|0}}l=m;return +(+h[e>>3])}function ng(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0;f=0;while(1){if((f|0)>=(e|0)){i=1;break}c[b+(f<<2)>>2]=f;f=f+1|0}while(1){if((i|0)>=(e|0))break;j=+g[a+(i<<2)>>2];h=i;while(1){f=h+-1|0;if((h|0)<=0)break;k=+g[a+(f<<2)>>2];if(!(j>k))break;g[a+(h<<2)>>2]=k;c[b+(h<<2)>>2]=c[b+(f<<2)>>2];h=f}g[a+(h<<2)>>2]=j;c[b+(h<<2)>>2]=i;i=i+1|0}l=a+(e+-1<<2)|0;i=e+-2|0;h=e;while(1){if((h|0)>=(d|0))break;j=+g[a+(h<<2)>>2];if(j>+g[l>>2]){f=i;while(1){if((f|0)<=-1)break;k=+g[a+(f<<2)>>2];if(!(j>k))break;e=f+1|0;g[a+(e<<2)>>2]=k;c[b+(e<<2)>>2]=c[b+(f<<2)>>2];f=f+-1|0}e=f+1|0;g[a+(e<<2)>>2]=j;c[b+(e<<2)>>2]=h}h=h+1|0}return}function og(b,c){b=b|0;c=c|0;var d=0;if((b|0)<252){a[c>>0]=b;c=1;return c|0}else{d=b|252;a[c>>0]=d;a[c+1>>0]=(b-(d&255)|0)>>>2;c=2;return c|0}return 0}function pg(a,b){a=a|0;b=b|0;if(a<<24>>24<0){b=(b<<((a&255)>>>3&3)|0)/400|0;return b|0}if((a&96)==96)if(!(a&8)){b=(b|0)/100|0;return b|0}else{b=(b|0)/50|0;return b|0}else{a=(a&255)>>>3&3;if((a|0)==3){b=(b*60|0)/1e3|0;return b|0}else{b=(b<<a|0)/100|0;return b|0}}return 0}function qg(d,e,f,g,h,i){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;if((i|0)==0|(e|0)<0){I=-1;return I|0}if(!e){I=-4;return I|0}I=a[d>>0]|0;n=pg(I,48e3)|0;o=d+1|0;r=e+-1|0;a:do switch(I&3){case 0:{x=0;y=1;w=o;m=r;l=r;s=29;break}case 1:{if(!f)if(!(r&1)){A=(r|0)/2|0;b[i>>1]=A;z=2;B=o;s=37;break a}else{I=-4;return I|0}else{F=1;H=2;E=o;G=r;C=r;s=30}break}case 2:{k=rg(o,r,i)|0;l=r-k|0;d=b[i>>1]|0;if(d<<16>>16<0){I=-4;return I|0}d=d<<16>>16;if((l|0)<(d|0)){I=-4;return I|0}else{x=0;y=2;w=o+k|0;m=l-d|0;s=29;break a}}default:{if((e|0)<2){I=-4;return I|0}k=d+2|0;o=a[o>>0]|0;t=o&63;v=t&255;if(t<<24>>24==0|(R(n,v)|0)>5760){I=-4;return I|0}d=e+-2|0;if(o&64){while(1){if((d|0)<1){u=-4;s=46;break}q=k+1|0;p=a[k>>0]|0;if(p<<24>>24!=-1)break;k=q;d=d+-255|0}if((s|0)==46)return u|0;d=d+-1-(p&255)|0;if((d|0)<0){I=-4;return I|0}else{n=d;e=q}}else{n=d;e=k}s=(o&255)>>>7^1;t=s&255;if(s<<24>>24){if(f|0){F=t;H=v;E=e;G=r;C=n;s=30;break a}m=(n|0)/(v|0)|0;if((R(m,v)|0)!=(n|0)){I=-4;return I|0}k=v+-1|0;l=m&65535;d=0;while(1){if((d|0)>=(k|0)){x=t;y=v;w=e;l=n;s=29;break a}b[i+(d<<1)>>1]=l;d=d+1|0}}q=v+-1|0;o=0;r=n;p=e;while(1){if((o|0)>=(q|0)){s=23;break}d=i+(o<<1)|0;k=rg(p,n,d)|0;e=n-k|0;d=b[d>>1]|0;if(d<<16>>16<0){u=-4;s=46;break}d=d<<16>>16;if((d|0)>(e|0)){u=-4;s=46;break}o=o+1|0;r=r-(k+d)|0;p=p+k|0;n=e}if((s|0)==23){if((r|0)<0)u=-4;else{x=t;y=v;w=p;m=r;l=n;s=29;break a}return u|0}else if((s|0)==46)return u|0}}while(0);if((s|0)==29)if(!f){z=y;A=m;B=w;s=37}else{F=x;H=y;E=w;G=m;C=l;s=30}b:do if((s|0)==30){l=rg(E,C,i+(H<<1)+-2|0)|0;k=C-l|0;m=H+-1|0;e=i+(m<<1)|0;j=b[e>>1]|0;if(j<<16>>16<0){I=-4;return I|0}d=j<<16>>16;if((d|0)>(k|0)){I=-4;return I|0}j=E+l|0;if(!F){if((l+d|0)>(G|0))u=-4;else{D=H;break}return u|0}if((R(d,H)|0)>(k|0)){I=-4;return I|0}else d=0;while(1){if((d|0)>=(m|0)){D=H;break b}b[i+(d<<1)>>1]=b[e>>1]|0;d=d+1|0}}else if((s|0)==37)if((A|0)>1275){I=-4;return I|0}else{b[i+(z+-1<<1)>>1]=A;D=z;j=B;break}while(0);k=(h|0)==0;d=0;while(1){if((d|0)>=(D|0))break;if(!k)c[h+(d<<2)>>2]=j;H=j+(b[i+(d<<1)>>1]|0)|0;d=d+1|0;j=H}if(!g){I=D;return I|0}a[g>>0]=I;I=D;return I|0}function rg(c,e,f){c=c|0;e=e|0;f=f|0;var g=0,h=0;do if((e|0)>=1){h=a[c>>0]|0;if((h&255)<252){g=1;e=h&255;break}if((e|0)>=2){g=2;e=((d[c+1>>0]|0)<<2)+(h&255)&65535}else{g=-1;e=-1}}else{g=-1;e=-1}while(0);b[f>>1]=e;return g|0}function sg(b,c){b=b|0;c=c|0;a:do if((c|0)>=1){switch(a[b>>0]&3){case 0:{b=1;break a}case 3:break;default:{b=2;break a}}if((c|0)<2)b=-4;else b=a[b+1>>0]&63}else b=-1;while(0);return b|0}function tg(a){a=a|0;var b=0,d=0,e=0;d=l;l=l+16|0;b=d;if((a+-1|0)>>>0>1){b=0;l=d;return b|0}if(Sc(b)|0){b=0;l=d;return b|0}e=ug(c[b>>2]|0)|0;c[b>>2]=e;b=Za(a)|0;b=(ug(18036)|0)+e+b|0;l=d;return b|0}function ug(a){a=a|0;return a+3&-4|0}function vg(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o+8|0;m=o;h=o+12|0;a:do if((d|0)<16e3)if((d|0)<12e3){switch(d|0){case 8e3:break a;default:h=-1}l=o;return h|0}else{switch(d|0){case 12e3:break a;default:h=-1}l=o;return h|0}else{if((d|0)<24e3){switch(d|0){case 16e3:break a;default:h=-1}l=o;return h|0}if((d|0)<48e3){switch(d|0){case 24e3:break a;default:h=-1}l=o;return h|0}else{switch(d|0){case 48e3:break a;default:h=-1}l=o;return h|0}}while(0);if((e+-1|0)>>>0>=2){n=-1;l=o;return n|0}switch(f|0){case 2051:case 2049:case 2048:break;default:{n=-1;l=o;return n|0}}Qh(a|0,0,tg(e)|0)|0;if(Sc(h)|0){n=-1;l=o;return n|0}i=ug(c[h>>2]|0)|0;c[h>>2]=i;k=ug(18036)|0;c[a+4>>2]=k;h=k+i|0;c[a>>2]=h;h=a+h|0;c[a+112>>2]=e;c[a+14088>>2]=e;i=a+144|0;c[i>>2]=d;j=a+180|0;c[j>>2]=0;if(Tc(a+k|0,0,a+8|0)|0){n=-3;l=o;return n|0}c[a+8>>2]=e;c[a+12>>2]=e;c[a+16>>2]=c[i>>2];c[a+20>>2]=16e3;c[a+24>>2]=8e3;c[a+28>>2]=16e3;c[a+32>>2]=20;c[a+36>>2]=25e3;c[a+40>>2]=0;k=a+44|0;c[k>>2]=9;c[a+48>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;c[a+76>>2]=0;if($a(h,d,e,c[j>>2]|0)|0){n=-3;l=o;return n|0}c[m>>2]=0;bb(h,10016,m)|0;c[n>>2]=c[k>>2];bb(h,4010,n)|0;c[a+148>>2]=1;c[a+152>>2]=1;c[a+164>>2]=-1e3;c[a+160>>2]=(R(d,e)|0)+3e3;n=a+108|0;c[n>>2]=f;c[a+124>>2]=-1e3;c[a+128>>2]=-1e3;c[a+132>>2]=1105;c[a+120>>2]=-1e3;c[a+136>>2]=-1e3;c[a+140>>2]=-1;m=c[i>>2]|0;c[a+172>>2]=(m|0)/100|0;c[a+168>>2]=24;c[a+156>>2]=5e3;c[a+116>>2]=(m|0)/250|0;b[a+14092>>1]=16384;g[a+14100>>2]=1.0;c[a+14096>>2]=(ue(60)|0)<<8;c[a+14148>>2]=1;c[a+14120>>2]=1001;c[a+14136>>2]=1105;bh(a+188|0,c[i>>2]|0);c[a+192>>2]=c[n>>2];n=0;l=o;return n|0}function wg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;a:do if((a|0)<16e3)if((a|0)<12e3)switch(a|0){case 8e3:{f=2;break a}default:break a}else switch(a|0){case 12e3:{f=2;break a}default:break a}else{if((a|0)<24e3)switch(a|0){case 16e3:{f=2;break a}default:break a}if((a|0)<48e3)switch(a|0){case 24e3:{f=2;break a}default:break a}else switch(a|0){case 48e3:{f=2;break a}default:break a}}while(0);b:do if((f|0)==2?(b+-1|0)>>>0<2:0){switch(d|0){case 2051:case 2049:case 2048:break;default:break b}g=xg(tg(b)|0)|0;if(!g){if(!e){e=0;return e|0}c[e>>2]=-7;e=0;return e|0}f=vg(g,a,b,d)|0;if(e|0)c[e>>2]=f;if(!f){e=g;return e|0}yg(g);e=0;return e|0}while(0);if(!e){e=0;return e|0}c[e>>2]=-1;e=0;return e|0}function xg(a){a=a|0;return Kh(a)|0}function yg(a){a=a|0;Lh(a);return}function zg(a,b,c,d,e,f,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0;i=0;while(1){if((i|0)>=(c|0))break;g[b+(i<<2)>>2]=+g[a+((R(i+d|0,h)|0)+e<<2)>>2]*32768.0;i=i+1|0}if((f|0)>-1){i=0;while(1){if((i|0)>=(c|0))break;j=+g[a+((R(i+d|0,h)|0)+f<<2)>>2]*32768.0;e=b+(i<<2)|0;g[e>>2]=+g[e>>2]+j;i=i+1|0}return}if((f|0)==-2)i=1;else return;while(1){if((i|0)<(h|0))e=0;else break;while(1){if((e|0)>=(c|0))break;j=+g[a+((R(e+d|0,h)|0)+i<<2)>>2]*32768.0;f=b+(e<<2)|0;g[f>>2]=+g[f>>2]+j;e=e+1|0}i=i+1|0}return}function Ag(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=(c|0)/400|0;if((d|0)>(a|0)){c=-1;return c|0}if((b|0)!=5e3){if((b+-5001|0)>>>0>=9){c=-1;return c|0}if((b|0)<5006)b=d<<b+-5001;else b=(R(b+-5003|0,c)|0)/50|0;if((b|0)>(a|0)){c=-1;return c|0}}else b=a;if(!((b*400|0)==(c|0)|(b*200|0)==(c|0)|(b*100|0)==(c|0))?(a=b*50|0,!((a|0)==(c|0)|(b*25|0)==(c|0)|(a|0)==(c*3|0)|(a|0)==(c<<2|0)|(a|0)==(c*5|0)|(a|0)==(c*6|0))):0){c=-1;return c|0}c=b;return c|0}function Bg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0;k=(c|0)/(b|0)|0;i=(k|0)<50;j=25.0/+(k|0);b=b+-3|0;c=0;f=0.0;h=0.0;e=0.0;while(1){if((c|0)>=(b|0))break;t=c<<1;o=+g[a+(t<<2)>>2];s=+g[a+((t|1)<<2)>>2];n=+g[a+((t|2)<<2)>>2];r=+g[a+((t|3)<<2)>>2];m=+g[a+((t|4)<<2)>>2];q=+g[a+((t|5)<<2)>>2];l=+g[a+((t|6)<<2)>>2];p=+g[a+((t|7)<<2)>>2];c=c+4|0;f=f+(s*s+r*r+q*q+p*p);h=h+(o*s+n*r+m*q+l*p);e=e+(o*o+n*n+m*m+l*l)}r=i?.5:1.0-j;s=+g[d>>2];e=s+r*(e-s);g[d>>2]=e;c=d+4|0;s=+g[c>>2];s=s+r*(h-s);g[c>>2]=s;t=d+8|0;h=+g[t>>2];h=h+r*(f-h);g[t>>2]=h;e=e<0.0?0.0:e;g[d>>2]=e;f=s<0.0?0.0:s;g[c>>2]=f;h=h<0.0?0.0:h;g[t>>2]=h;if((e>h?e:h)>7.999999797903001e-04){p=+F(+e);r=+F(+h);s=+F(+p);q=+F(+r);r=p*r;p=f<r?f:r;g[c>>2]=p;r=p/(r+1.0000000036274937e-15);q=+F(+(1.0-r*r))*(+E(+(s-q))/(s+1.0000000036274937e-15+q));t=d+12|0;s=+g[t>>2];r=+(k|0);s=s+(q-s)/r;g[t>>2]=s;t=d+16|0;r=+g[t>>2]-.019999999552965164/r;s=r>s?r:s;g[t>>2]=s;s=s*20.0;t=s>1.0;s=t?1.0:s;return +s}else{s=+g[d+16>>2];s=s*20.0;t=s>1.0;s=t?1.0:s;return +s}return 0.0}\nfunction Cg(d,e,f,h,i,j,k,m,n,o,p,q){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;var r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0.0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ga=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0;Ya=l;l=l+528|0;Sa=Ya+240|0;Pa=Ya+232|0;Oa=Ya+224|0;Na=Ya+216|0;Ma=Ya+208|0;La=Ya+200|0;Ka=Ya+192|0;Ja=Ya+184|0;Ia=Ya+176|0;Ha=Ya+168|0;Fa=Ya+160|0;Ea=Ya+152|0;Da=Ya+144|0;Ca=Ya+136|0;Ba=Ya+128|0;Aa=Ya+120|0;za=Ya+112|0;ya=Ya+104|0;xa=Ya+96|0;ka=Ya+88|0;ja=Ya+80|0;ia=Ya+72|0;ga=Ya+64|0;ea=Ya+56|0;ba=Ya+48|0;aa=Ya+40|0;$=Ya+32|0;da=Ya+24|0;ca=Ya+16|0;N=Ya+8|0;s=Ya;_=Ya+512|0;Va=Ya+464|0;Ta=Ya+460|0;qa=Ya+456|0;Ua=Ya+400|0;G=Ya+296|0;H=Ya+264|0;Y=Ya+256|0;wa=Ya+248|0;Ga=Ya+518|0;Qa=Ya+516|0;c[Ta>>2]=0;r=(i|0)<1276?i:1276;Wa=d+18032|0;c[Wa>>2]=0;if((f|0)<1|(r|0)<1){h=-1;l=Ya;return h|0}if((r|0)==1?(c[d+144>>2]|0)==(f*10|0):0){h=-2;l=Ya;return h|0}Z=d+(c[d+4>>2]|0)|0;Ra=d+(c[d>>2]|0)|0;U=d+108|0;if((c[U>>2]|0)==2051)na=0;else na=c[d+116>>2]|0;P=c[d+168>>2]|0;P=(P|0)>(j|0)?j:P;c[s>>2]=qa;bb(Ra,10015,s)|0;c[Ua>>2]=0;y=d+44|0;do if((c[y>>2]|0)>6?(u=c[d+144>>2]|0,(u|0)>15999):0){j=d+112|0;if(Dg(e,f,c[j>>2]|0,P)|0){p=d+18016|0;c[p>>2]=0;s=-1;M=-1;va=1;break}s=c[d+8464>>2]|0;t=c[d+8468>>2]|0;eh(d+188|0,c[qa>>2]|0,k,m,f,0,n,o,u,P,p,Ua);if(+g[Ua+32>>2]>.10000000149011612){sa=d+18024|0;x=+g[sa>>2]*.9990000128746033;A=+Eg(e,f,c[j>>2]|0);g[sa>>2]=x>A?x:A;sa=12}else sa=12}else{s=-1;t=-1;sa=12}while(0);if((sa|0)==12){c[d+140>>2]=-1;Xa=c[Ua>>2]|0;p=d+18016|0;c[p>>2]=0;if(!Xa){M=t;va=0}else{if((c[d+124>>2]|0)==-1e3)c[d+140>>2]=~~+D(+((1.0-+g[Ua+20>>2])*100.0+.5));j=c[Ua+28>>2]|0;if((j|0)>=13)if((j|0)>=15)if((j|0)<17)j=1103;else j=(j|0)<19?1104:1105;else j=1102;else j=1101;c[p>>2]=j;M=t;va=0}}ua=d+112|0;if((c[ua>>2]|0)==2?(c[d+120>>2]|0)!=1:0)v=+Bg(e,f,c[d+144>>2]|0,d+14156|0);else v=0.0;j=Fg(d,f,r)|0;pa=d+160|0;c[pa>>2]=j;ta=d+144|0;z=c[ta>>2]|0;t=(z|0)/(f|0)|0;Xa=d+148|0;B=c[Xa>>2]|0;if(!B){ra=(z*12|0)/(f|0)|0;j=(((j*12|0)/8|0)+((ra|0)/2|0)|0)/(ra|0)|0;r=(j|0)<(r|0)?j:r;j=((R(r,ra)|0)<<3|0)/12|0;c[pa>>2]=j;if((r|0)<1)r=1;else sa=25}else sa=25;do if((sa|0)==25)if(!((r|0)<3|(j|0)<(t*24|0))){if((t|0)<50){u=R(r,t)|0;if((u|0)<300|(j|0)<2400)break;else V=u}else V=R(t,r)|0;W=V<<3;m=c[ua>>2]|0;o=c[y>>2]|0;L=d+40|0;y=c[L>>2]|0;k=Hg(j,m,t,B,0,o,y)|0;a:do switch(c[d+124>>2]|0){case 3001:{E=127;break}case 3002:{E=0;break}default:{u=c[d+140>>2]|0;if((u|0)>-1){E=u*327>>8;E=(c[U>>2]|0)!=2049|(E|0)<115?E:115;break a}else{E=(c[U>>2]|0)==2048?115:48;break a}}}while(0);C=d+120|0;u=c[C>>2]|0;do if(!((u|0)!=-1e3&(m|0)==2)){u=d+14088|0;if((m|0)==2){m=(k|0)>(((c[u>>2]|0)==2?23e3:25e3)|0)?2:1;c[u>>2]=m;ra=u;break}else{c[u>>2]=m;ra=u;break}}else{ra=d+14088|0;c[ra>>2]=u;m=u}while(0);n=Hg(j,m,t,B,0,o,y)|0;k=c[U>>2]|0;do if((k|0)!=2051){u=c[d+136>>2]|0;if((u|0)==-1e3){A=1.0-v;u=~~(A*16.0e3+v*16.0e3);u=u+((R(R(E,E)|0,~~(A*64.0e3+v*36.0e3)-u|0)|0)>>14)|0;u=(k|0)==2048?u+8e3|0:u;k=c[d+14124>>2]|0;if((k|0)==1002)u=u+-4e3|0;else u=(k|0)>0?u+4e3|0:u;u=(n|0)>=(u|0)?1002:1e3;k=d+14120|0;c[k>>2]=u;if((c[d+48>>2]|0)!=0?(y|0)>(128-E>>4|0):0){c[k>>2]=1e3;u=1e3}do if(c[d+184>>2]|0){if(c[Ua>>2]|0){c[d+56>>2]=0;break}c[d+56>>2]=va^1;if((va|0)==0&(E|0)>100){c[k>>2]=1e3;u=1e3}}else c[d+56>>2]=0;while(0);if((r|0)<((R((t|0)>50?9e3:6e3,f)|0)/(z<<3|0)|0|0)){c[k>>2]=1002;oa=k;u=1002;break}}else{k=d+14120|0;c[k>>2]=u}if((u|0)!=1002)if(((z|0)/100|0|0)>(f|0)){c[k>>2]=1002;oa=k;u=1002}else oa=k;else{oa=k;u=1002}}else{oa=d+14120|0;c[oa>>2]=1002;u=1002}while(0);Q=d+176|0;if(c[Q>>2]|0){c[oa>>2]=1002;u=1002}ma=d+14124|0;n=c[ma>>2]|0;do if((n|0)>0){k=(u|0)==1002;if((n|0)==1002&(k^1)){la=(u|0)!=1002;k=la&1;if(la){I=k;K=1;la=0;break}else u=k}else{if(!k){I=0;K=0;la=0;break}if((n|0)==1002){I=0;K=0;la=0;u=1002;break}u=(u|0)!=1002&1}if(((z|0)/100|0|0)>(f|0)){I=u;K=0;la=0;u=1002}else{c[oa>>2]=n;I=u;K=1;la=1;u=n}}else{I=0;K=0;la=0}while(0);if(((m|0)==1?(c[d+14128>>2]|0)==2:0)?(F=d+68|0,!((c[F>>2]|0)!=0|(u|0)==1002|(n|0)==1002)):0){c[F>>2]=1;c[ra>>2]=2;m=2}else c[d+68>>2]=0;X=Hg(j,m,t,B,u,o,y)|0;do if((u|0)!=1002){if((n|0)==1002){Tc(Z,c[d+180>>2]|0,G)|0;u=c[oa>>2]|0;j=(u|0)==1002;if(j){y=1;o=j;sa=99;break}else k=1}else{k=0;j=(u|0)==1002}if((c[d+14148>>2]|0)==0?(c[d+84>>2]|0)==0:0){o=d+14136|0;y=k;z=o;k=c[o>>2]|0;o=j}else{y=k;o=j;sa=99}}else{y=0;o=1;u=1002;sa=99}while(0);do if((sa|0)==99){if((c[ua>>2]|0)==2?(c[C>>2]|0)!=1:0){m=19400;n=19400}else{m=19400;n=19400}k=R(E,E)|0;j=0;while(1){if((j|0)==8)break;sa=c[m+(j<<2)>>2]|0;c[H+(j<<2)>>2]=sa+((R(k,(c[n+(j<<2)>>2]|0)-sa|0)|0)>>14);j=j+1|0}n=(c[d+14148>>2]|0)==0;m=d+14140|0;j=c[H+24>>2]|0;k=c[H+28>>2]|0;do if(n)if((c[m>>2]|0)<1105){j=j+k|0;break}else{j=j-k|0;break}while(0);do if((X|0)<(j|0)){j=c[H+16>>2]|0;k=c[H+20>>2]|0;do if(n)if((c[m>>2]|0)<1104){j=j+k|0;break}else{j=j-k|0;break}while(0);if((X|0)>=(j|0)){k=1104;break}j=c[H+8>>2]|0;k=c[H+12>>2]|0;do if(n)if((c[m>>2]|0)<1103){j=j+k|0;break}else{j=j-k|0;break}while(0);if((X|0)>=(j|0)){k=1103;break}j=c[H>>2]|0;k=c[H+4>>2]|0;do if(n)if((c[m>>2]|0)<1102){j=j+k|0;break}else{j=j-k|0;break}while(0);k=(X|0)<(j|0)?1101:1102}else k=1105;while(0);c[m>>2]=k;j=d+14136|0;c[j>>2]=k;if(o|n^1)z=j;else{if(!((c[d+88>>2]|0)==0&k>>>0>1103)){z=j;break}c[j>>2]=1103;z=j;k=1103}}while(0);j=c[d+132>>2]|0;if((k|0)>(j|0))c[z>>2]=j;else j=k;k=c[d+128>>2]|0;n=(k|0)==-1e3;if(!n){c[z>>2]=k;j=k}if((W|0)<15e3&(o^1)){j=(j|0)<1103?j:1103;c[z>>2]=j}k=c[ta>>2]|0;if((k|0)<24001&(j|0)>1104){c[z>>2]=1104;j=1104}if((k|0)<16001&(j|0)>1103){c[z>>2]=1103;j=1103}if((k|0)<12001&(j|0)>1102){c[z>>2]=1102;j=1102}if((k|0)<8001&(j|0)>1101){c[z>>2]=1101;k=1101}else k=j;m=c[p>>2]|0;if(!((m|0)==0|n^1)){j=c[ra>>2]|0;do if((X|0)>(j*18e3|0)|o^1){if(!((X|0)>(j*24e3|0)|o^1)){j=1102;break}if((X|0)<=(j*3e4|0)){j=1103;break}j=(X|0)>(j*44e3|0)?1105:1104}else j=1101;while(0);sa=(m|0)>(j|0)?m:j;c[p>>2]=sa;c[z>>2]=(k|0)<(sa|0)?k:sa}J=d+52|0;c[J>>2]=Ig(c[d+48>>2]|0,c[L>>2]|0,c[J>>2]|0,u,z,X)|0;c[N>>2]=P;bb(Ra,4036,N)|0;j=c[oa>>2]|0;do if((j|0)==1002){if((c[z>>2]|0)!=1102)break;c[z>>2]=1103}while(0);if(!(c[Q>>2]|0))L=c[z>>2]|0;else{c[z>>2]=1101;L=1101}do if((j|0)==1e3){if((L|0)<=1103){sa=146;break}c[oa>>2]=1001;j=1001;sa=147}else{if((j|0)!=1001){sa=147;break}if((L|0)>=1104){j=1001;sa=147;break}c[oa>>2]=1e3;sa=146}while(0);if((sa|0)==146){p=c[ta>>2]|0;k=p;j=1e3;p=(p|0)/50|0;sa=148}else if((sa|0)==147){p=c[ta>>2]|0;u=(p|0)/50|0;if((u|0)>=(f|0)|(j|0)==1e3){k=p;p=u;sa=148}else r=u}do if((sa|0)==148){if(((k*3|0)/50|0|0)<(f|0)){r=k;if((j|0)!=1e3){r=p;break}if(((r<<1|0)/25|0|0)==(f|0)){r=(r|0)/25|0;break}else{Xa=r*3|0;r=((((Xa|0)/25|0|0)==(f|0)?Xa:r)|0)/50|0;break}}N=d+14144|0;if(!(c[N>>2]|0)){H=y;s=I;p=K}else{c[N>>2]=0;H=1;s=1;p=1}if((j|0)==1002|(p|0)==0){j=0;u=0}else{u=Kg(r,c[pa>>2]|0,t,c[ra>>2]|0)|0;j=u;u=(u|0)==0?0:p}S=r-j|0;n=(R(c[pa>>2]|0,f)|0)/(k<<3|0)|0;n=(S|0)<(n|0)?S:n;S=h+1|0;P=r+-1|0;Jb(Va,S,P);M=na+f|0;K=R(M,c[ua>>2]|0)|0;T=fa()|0;i=l;l=l+((1*(K<<2)|0)+15&-16)|0;K=d+172|0;p=c[ua>>2]|0;Sh(i|0,d+14176+((R((c[K>>2]|0)-na|0,p)|0)<<2)|0,(R(na,p)|0)<<2|0)|0;if((c[oa>>2]|0)==1002){k=(ue(60)|0)<<8;p=c[ua>>2]|0}else k=c[Z+8>>2]|0;m=d+14096|0;I=c[m>>2]|0;k=k-I|0;k=I+(((k>>16)*983|0)+(((k&65535)*983|0)>>>16))|0;c[m>>2]=k;m=c[ta>>2]|0;if((c[U>>2]|0)==2048)Lg(e,ye(k>>8)|0,i+((R(na,p)|0)<<2)|0,d+14104|0,f,p,m);else Mg(e,i+((R(na,p)|0)<<2)|0,d+14104|0,f,p,m);do if(q|0){k=c[ua>>2]|0;p=i+((R(na,k)|0)<<2)|0;k=R(k,f)|0;A=+Ng(p,p,k);if(!(!(A<1.0e9)|(A!=A|0.0!=0.0)))break;Qh(p|0,0,k<<2|0)|0;q=d+14104|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0}while(0);b:do if((c[oa>>2]|0)==1002){w=1.0;o=j;y=s;m=L;sa=228}else{m=R(c[ua>>2]|0,f)|0;I=fa()|0;G=l;l=l+((1*(m<<1)|0)+15&-16)|0;m=R((n<<3)+-8|0,t)|0;E=c[oa>>2]|0;F=(E|0)==1001;do if(!F){c[d+36>>2]=m;p=c[d+14152>>2]|0;if(!p){w=1.0;z=m}else{w=1.0;sa=174}}else{k=Og(m,L,(c[ta>>2]|0)==(f*50|0)&1,c[Xa>>2]|0,c[J>>2]|0)|0;c[d+36>>2]=k;p=c[d+14152>>2]|0;if(p|0){w=1.0;m=k;sa=174;break}w=1.0-+O(+(+(k-m|0)*.0009765625*.6931471805599453));z=k}while(0);do if((sa|0)==174){if(!(c[Xa>>2]|0)){z=m;break}if(c[Q>>2]|0){z=m;break}C=c[z>>2]|0;switch(C|0){case 1101:{y=13;A=8.0e3;break}case 1102:{y=15;A=12.0e3;break}default:{y=17;A=16.0e3}}z=c[ua>>2]|0;o=0;v=0.0;while(1){if((o|0)>=(z|0))break;B=o*21|0;n=0;while(1){if((n|0)>=(y|0))break;x=+g[p+(B+n<<2)>>2];k=x<.5;do if(x>-2.0|k^1){if(k){if(!(x>0.0))break}else x=.5;x=x*.5}else x=-2.0;while(0);v=v+x;n=n+1|0}o=o+1|0}q=~~(A*(v/+(y|0)*+(z|0)+.20000000298023224));k=d+36|0;p=(R(m,-2)|0)/3|0;p=(q|0)>(p|0)?q:p;if((C&-2|0)==1104){z=m+((p*3|0)/5|0)|0;c[k>>2]=z;break}else{z=m+p|0;c[k>>2]=z;break}}while(0);y=c[ta>>2]|0;c[d+32>>2]=(f*1e3|0)/(y|0)|0;m=c[ua>>2]|0;c[d+8>>2]=m;c[d+12>>2]=c[ra>>2];o=(L|0)==1101;c[d+28>>2]=o?8e3:(L|0)==1102?12e3:16e3;c[d+24>>2]=F?16e3:8e3;n=d+20|0;c[n>>2]=16e3;do if((E|0)==1e3){if((t|0)>50)p=(V<<4|0)/3|0;else p=W;if((p|0)>=8e3)break;c[n>>2]=12e3;k=d+28|0;c[k>>2]=o?8e3:12e3;if((p|0)>=7e3)break;c[n>>2]=8e3;c[k>>2]=8e3}while(0);k=c[Xa>>2]|0;n=(k|0)==0;c[d+60>>2]=n&1;p=(r<<3)+-8|0;o=d+64|0;c[o>>2]=p;do if((u|0)!=0&(j|0)>1){p=p-(j<<3|1)|0;c[o>>2]=p;if(!F)break;p=p+-20|0;c[o>>2]=p}while(0);do if(n){if(!F)break;W=(R(z,f)|0)/(y|0)|0;c[o>>2]=(p|0)<(W|0)?p:W}else{if(!F)break;W=(R(p,y)|0)/(f|0)|0;c[o>>2]=(R(Og(W,L,(y|0)==(f*50|0)&1,k,c[J>>2]|0)|0,f)|0)/(y|0)|0}while(0);if(H){c[Y>>2]=0;W=(y|0)/400|0;k=R(m,(c[K>>2]|0)-(c[d+116>>2]|0)-W|0)|0;V=d+14176+(k<<2)|0;p=c[qa>>2]|0;Pg(V,V,0.0,1.0,c[p+4>>2]|0,W,m,c[p+60>>2]|0,y);Qh(d+14176|0,0,k<<2|0)|0;k=c[K>>2]|0;m=R(k,c[ua>>2]|0)|0;p=0;while(1){if((p|0)>=(m|0))break;b[G+(p<<1)>>1]=Qg(+g[d+14176+(p<<2)>>2])|0;p=p+1|0}Vc(Z,d+8|0,G,k,0,Y,1)|0;m=c[ua>>2]|0}k=R(m,f)|0;p=0;while(1){if((p|0)>=(k|0))break;b[G+(p<<1)>>1]=Qg(+g[i+((R(na,m)|0)+p<<2)>>2])|0;p=p+1|0}do if(!(Vc(Z,d+8|0,G,f,Va,_,0)|0)){k=c[oa>>2]|0;c:do if((k|0)==1e3){p=c[d+80>>2]|0;d:do if((p|0)>=12e3)if((p|0)<16e3){switch(p|0){case 12e3:break;default:break d}m=1102;break c}else{switch(p|0){case 16e3:break;default:break d}m=1103;break c}else switch(p|0){case 8e3:{m=1101;break c}default:{}}while(0);m=L}else m=L;while(0);if(!(c[d+96>>2]|0))p=0;else p=(c[d+18028>>2]|0)==0;c[d+72>>2]=p&1;if(!(c[_>>2]|0)){c[Wa>>2]=0;a[h>>0]=Gg(k,(c[ta>>2]|0)/(f|0)|0,m,c[ra>>2]|0)|0;r=1;break}if(p){u=Kg(r,c[pa>>2]|0,t,c[ra>>2]|0)|0;c[N>>2]=1;j=u;s=0;u=(u|0)!=0&1}ha(I|0);o=j;y=s;sa=228;break b}else r=-3;while(0);ha(I|0)}while(0);e:do if((sa|0)==228){switch(m|0){case 1101:{j=13;break}case 1103:case 1102:{j=17;break}case 1104:{j=19;break}default:j=21}c[ca>>2]=j;bb(Ra,10012,ca)|0;c[da>>2]=c[ra>>2];bb(Ra,10008,da)|0;c[$>>2]=-1;bb(Ra,4002,$)|0;do if((c[oa>>2]|0)==1e3){t=c[ua>>2]|0;ka=((R(t,c[ta>>2]|0)|0)/400|0)<<2;n=l;l=l+((1*ka|0)+15&-16)|0}else{c[aa>>2]=0;bb(Ra,4006,aa)|0;c[ba>>2]=(c[d+76>>2]|0)==0?2:0;bb(Ra,10002,ba)|0;j=(c[Xa>>2]|0)==0;do if((c[oa>>2]|0)==1001){if(j)break;c[ea>>2]=(c[pa>>2]|0)-(c[d+36>>2]|0);bb(Ra,4002,ea)|0;c[ga>>2]=0;bb(Ra,4020,ga)|0}else{if(j)break;c[ia>>2]=1;bb(Ra,4006,ia)|0;c[ja>>2]=c[d+152>>2];bb(Ra,4020,ja)|0;c[ka>>2]=c[pa>>2];bb(Ra,4002,ka)|0}while(0);j=c[oa>>2]|0;s=c[ua>>2]|0;t=c[ta>>2]|0;p=(R(s,t)|0)/400|0;k=l;l=l+((1*(p<<2)|0)+15&-16)|0;if((j|0)==1e3){t=s;n=k;break}ka=c[ma>>2]|0;if(!((j|0)!=(ka|0)&(ka|0)>0)){t=s;n=k;break}Sh(k|0,d+14176+((R((c[K>>2]|0)-na-((t|0)/400|0)|0,s)|0)<<2)|0,p<<2|0)|0;t=s;n=k}while(0);j=c[K>>2]|0;s=d+14176|0;if((R(t,j-M|0)|0)>0){na=R(t,j-f-na|0)|0;Wh(s|0,d+14176+((R(t,f)|0)<<2)|0,na<<2|0)|0;Sh(d+14176+(na<<2)|0,i|0,(R(M,t)|0)<<2|0)|0}else Sh(s|0,i+((R(M-j|0,t)|0)<<2)|0,(R(j,t)|0)<<2|0)|0;j=d+14100|0;v=+g[j>>2];if(v<1.0|w<1.0){na=c[qa>>2]|0;Pg(i,i,v,w,c[na+4>>2]|0,f,c[ua>>2]|0,c[na+60>>2]|0,c[ta>>2]|0)}g[j>>2]=w;k=c[oa>>2]|0;if(!((k|0)==1001?(c[ra>>2]|0)!=1:0)){if((X|0)>=24e3){j=X+-24e3|0;if((j<<1|0)>16384)j=16384;else sa=251}else{j=0;sa=251}if((sa|0)==251)j=j<<1;c[d+92>>2]=j}do if(!(c[d+14152>>2]|0)){if((c[ua>>2]|0)!=2){j=k;break}t=d+14092|0;p=b[t>>1]|0;j=d+92|0;s=c[j>>2]|0;if(!(p<<16>>16<16384|(s|0)<16384)){j=k;break}qa=c[qa>>2]|0;Rg(i,i,+(p<<16>>16)*.00006103515625,+(s|0)*.00006103515625,c[qa+4>>2]|0,f,2,c[qa+60>>2]|0,c[ta>>2]|0);b[t>>1]=c[j>>2];j=c[oa>>2]|0}else j=k;while(0);do if((j|0)==1002)sa=267;else{s=Va+20|0;t=Va+28|0;qa=(Sg(c[s>>2]|0,c[t>>2]|0)|0)+17|0;j=(j|0)==1001;if((qa+(j?20:0)|0)>((r<<3)+-8|0)){sa=267;break}if(j)Qb(Va,u,12);if(!u){sa=267;break}Qb(Va,y,1);p=(c[oa>>2]|0)==1001;j=Sg(c[s>>2]|0,c[t>>2]|0)|0;j=P-(j+(p?18:7)>>3)|0;j=(j|0)<(o|0)?j:o;if((j|0)>=2)if((j|0)>257)j=257;else sa=264;else{j=2;sa=264}if(!p){k=j;break}Sb(Va,j+-2|0,256);k=j}while(0);if((sa|0)==267){c[N>>2]=0;u=0;k=0}sa=c[oa>>2]|0;t=(sa|0)==1002?0:17;if((sa|0)==1e3){j=(Sg(c[Va+20>>2]|0,c[Va+28>>2]|0)|0)+7>>3;Xb(Va);s=j}else{s=P-k|0;Wb(Va,s);j=0}p=(u|0)==0;if(p?(c[oa>>2]|0)==1e3:0)sa=275;else sa=273;do if((sa|0)==273){c[xa>>2]=Ua;bb(Ra,10022,xa)|0;if((c[oa>>2]|0)!=1001){sa=275;break}c[wa>>2]=c[d+100>>2];c[wa+4>>2]=c[d+104>>2];c[ya>>2]=wa;bb(Ra,10028,ya)|0}while(0);if((sa|0)==275){c[za>>2]=0;bb(Ra,10028,za)|0}if(!(p|(y|0)==0)){c[Aa>>2]=0;bb(Ra,10010,Aa)|0;c[Ba>>2]=0;bb(Ra,4006,Ba)|0;c[Ca>>2]=-1;bb(Ra,4002,Ca)|0;if((db(Ra,i,(c[ta>>2]|0)/200|0,S+s|0,k,0)|0)<0){r=-3;break}c[Da>>2]=Ta;bb(Ra,4031,Da)|0;bb(Ra,4028,Ea)|0}c[Fa>>2]=t;bb(Ra,10010,Fa)|0;t=c[oa>>2]|0;do if((t|0)==1e3)sa=293;else{Fa=c[ma>>2]|0;if((t|0)!=(Fa|0)&(Fa|0)>0){bb(Ra,4028,Ha)|0;db(Ra,n,(c[ta>>2]|0)/400|0,Ga,2,0)|0;c[Ia>>2]=0;bb(Ra,10002,Ia)|0}if((Sg(c[Va+20>>2]|0,c[Va+28>>2]|0)|0)>(s<<3|0)){sa=293;break}do if(!(p|(y|0)==0)){if((c[oa>>2]|0)!=1001)break;if(!(c[Xa>>2]|0))break;c[Ja>>2]=(c[pa>>2]|0)-(c[d+36>>2]|0);bb(Ra,4002,Ja)|0}while(0);c[Ka>>2]=c[Xa>>2];bb(Ra,4006,Ka)|0;j=db(Ra,i,f,0,s,Va)|0;if((j|0)<0){r=-3;break e}if(p){u=0;break}if(!y){sa=295;break}if((c[oa>>2]|0)!=1001)break;if(!(c[Xa>>2]|0))break;Wh(S+j|0,S+s|0,k|0)|0}while(0);do if((sa|0)==293){if(p){u=0;break}if(!y)sa=295}while(0);if((sa|0)==295){p=c[ta>>2]|0;t=(p|0)/200|0;p=(p|0)/400|0;bb(Ra,4028,La)|0;c[Ma>>2]=0;bb(Ra,10010,Ma)|0;c[Na>>2]=0;bb(Ra,10002,Na)|0;c[Oa>>2]=0;bb(Ra,4006,Oa)|0;c[Pa>>2]=-1;bb(Ra,4002,Pa)|0;if((c[oa>>2]|0)==1001){Wb(Va,j);s=j}Pa=f-t|0;db(Ra,i+((R(c[ua>>2]|0,Pa-p|0)|0)<<2)|0,p,Qa,2,0)|0;if((db(Ra,i+((R(c[ua>>2]|0,Pa)|0)<<2)|0,t,S+s|0,k,0)|0)<0){r=-3;break}c[Sa>>2]=Ta;bb(Ra,4031,Sa)|0}a[h>>0]=Gg(c[oa>>2]|0,(c[ta>>2]|0)/(f|0)|0,m,c[ra>>2]|0)|0;p=Va+28|0;s=c[p>>2]|0;c[Wa>>2]=s^c[Ta>>2];if(!la)t=c[oa>>2]|0;else t=1002;c[ma>>2]=t;c[d+14128>>2]=c[ra>>2];c[d+14132>>2]=f;c[d+14148>>2]=0;do if(c[d+184>>2]|0){if(!(c[Ua>>2]|va))break;if(!(Tg(+g[Ua+32>>2],d+18020|0,+g[d+18024>>2],e,f,c[ua>>2]|0,va)|0)){s=c[p>>2]|0;break}else{c[Wa>>2]=0;a[h>>0]=Gg(c[oa>>2]|0,(c[ta>>2]|0)/(f|0)|0,m,c[ra>>2]|0)|0;r=1;break e}}while(0);f:do if((Sg(c[Va+20>>2]|0,s)|0)>((r<<3)+-8|0)){if((r|0)<2){r=-2;break e}a[S>>0]=0;c[Wa>>2]=0;j=1}else{if(!((c[oa>>2]|0)==1e3&(u|0)==0))break;while(1){if((j|0)<=2)break f;if(a[h+j>>0]|0)break f;j=j+-1|0}}while(0);j=j+(k+1)|0;if(!(c[Xa>>2]|0)){if(ah(h,j,r)|0){r=-3;break}}else r=j}while(0);ha(T|0);h=r;l=Ya;return h|0}while(0);if((s|0)!=-1){c[d+8464>>2]=s;c[d+8468>>2]=M}h=Jg(d,e,(f|0)/(r|0)|0,r,h,i,la,P,q)|0;l=Ya;return h|0}while(0);j=c[d+14120>>2]|0;u=c[d+14136>>2]|0;u=(u|0)==0?1101:u;j=(j|0)==0?1e3:j;g:do if((t|0)<=100){do if((t|0)==25)if((j|0)==1e3){s=0;p=0;t=25}else{s=0;p=1;t=50;sa=37}else if((t|0)<17){if((i|0)!=1?(j|0)!=1e3|(t|0)==10:0){s=50/(t|0)|0;p=3;t=50;sa=37;break}s=0;p=(t|0)<13&1;t=(t|0)==12?25:16}else{s=0;p=0;sa=37}while(0);h:do if((sa|0)==37){switch(j|0){case 1002:{sa=39;break g}case 1e3:break h;case 1001:break;default:break g}u=(u|0)>1104?u:1104;j=1001;break g}while(0);if((u|0)>1103){u=1103;j=1e3}else{j=1e3;sa=40}}else{s=0;p=0;sa=39}while(0);if((sa|0)==39)if((u|0)==1102){u=1101;j=1002}else{j=1002;sa=40}a[h>>0]=(Gg(j,t,u,c[d+14088>>2]|0)|0)&255|p;j=(p|0)<2?1:2;r=(r|0)>(j|0)?r:j;if((p|0)==3)a[h+1>>0]=s;if(!(c[Xa>>2]|0)){h=(ah(h,j,r)|0)==0;l=Ya;return (h?r:-3)|0}else{h=j;l=Ya;return h|0}return 0}function Dg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +Vg(a,R(b,c)|0)<=1.0/+(1<<d|0)|0}function Eg(a,b,c){a=a|0;b=b|0;c=c|0;c=R(b,c)|0;return +(+Ng(a,a,c)/+(c|0))}function Fg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(!b)b=(c[a+144>>2]|0)/400|0;e=c[a+164>>2]|0;switch(e|0){case -1e3:{d=c[a+144>>2]|0;d=((d*60|0)/(b|0)|0)+(R(d,c[a+112>>2]|0)|0)|0;return d|0}case -1:{d=(R(d<<3,c[a+144>>2]|0)|0)/(b|0)|0;return d|0}default:{d=e;return d|0}}return 0}function Gg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((b|0)>=400)break;b=b<<1;e=e+1|0}switch(a|0){case 1e3:{b=(c<<5)+96&224|(e<<3)+-16;break}case 1002:{b=((c|0)<1102?0:(c<<5)+64&96)|e<<3|128;break}default:b=c<<4|(e<<3)+240|96}return (b|((d|0)==2&1)<<2)&255|0}function Hg(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;a=a-(R((b*40|0)+20|0,c+-50|0)|0)|0;if(!d)a=a-((a|0)/12|0)|0;a=(R(a,f+90|0)|0)/100|0;switch(e|0){case 1001:case 1e3:{if((f|0)<2)a=(a<<2|0)/5|0;g=a-((R(a,g)|0)/((g*6|0)+10|0)|0)|0;return g|0}case 1002:{if((f|0)>=5){g=a;return g|0}g=(a*9|0)/10|0;return g|0}default:{g=a-((R(a,g)|0)/((g*12|0)+20|0)|0)|0;return g|0}}return 0}function Ig(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;if((a|0)==0|(b|0)==0|(e|0)==1002){m=0;return m|0}l=c[f>>2]|0;h=(b|0)<25;i=125-b|0;j=(b|0)<6;k=l;while(1){e=k<<1;a=c[19572+(e+-2202<<2)>>2]|0;e=c[19572+(e+-2201<<2)>>2]|0;switch(d|0){case 1:{a=a-e|0;break}case 0:{a=a+e|0;break}default:{}}e=((R(a,h?i:100)|0)>>16)*655|0;a=(e+((((R(a,h?125-b|0:100)|0)&65535)*655|0)>>>16)|0)<(g|0);if(a|j){a=a&1;m=10;break}if((k|0)<=1101)break;e=k+-1|0;c[f>>2]=e;k=e}if((m|0)==10)return a|0;c[f>>2]=l;m=0;return m|0}function Jg(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+304|0;C=D;k=(d|0)==2?3:d<<1;B=a+148|0;if((c[B>>2]|0)==0?(c[a+164>>2]|0)!=-1:0){A=((c[a+160>>2]|0)*3|0)/(((c[a+144>>2]|0)*24|0)/(R(e,d)|0)|0|0)|0;g=(A|0)<(g|0)?A:g}r=(g-k|0)/(d|0)|0;r=(r|0)>1275?1276:r+1|0;t=R(r,d)|0;s=l;l=l+((1*t|0)+15&-16)|0;Yg(C);t=a+136|0;u=c[t>>2]|0;v=a+128|0;w=c[v>>2]|0;x=a+120|0;y=c[x>>2]|0;c[t>>2]=c[a+14120>>2];c[v>>2]=c[a+14136>>2];k=c[a+14088>>2]|0;c[x>>2]=k;z=a+68|0;A=c[z>>2]|0;if(!A)c[a+14128>>2]=k;else c[x>>2]=1;p=d+-1|0;q=a+18028|0;h=(h|0)!=0;m=a+112|0;k=0;while(1){if((k|0)>=(d|0)){k=14;break}c[z>>2]=0;c[q>>2]=(k|0)<(p|0)&1;if(h&(k|0)==(p|0))c[t>>2]=1002;n=s+(R(k,r)|0)|0;o=Cg(a,b+((R(k,R(c[m>>2]|0,e)|0)|0)<<2)|0,e,n,r,i,0,0,0,0,0,j)|0;if((o|0)<0){g=-3;k=16;break}if((Zg(C,n,o)|0)<0){g=-3;k=16;break}k=k+1|0}if((k|0)==14){g=$g(C,d,f,g,(c[B>>2]|0)==0&1)|0;if((g|0)<0){C=-3;l=D;return C|0}c[t>>2]=u;c[v>>2]=w;c[x>>2]=y;c[z>>2]=A;C=g;l=D;return C|0}else if((k|0)==16){l=D;return g|0}return 0}function Kg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=(d*40|0)+20|0;b=(((R(e,200-c|0)|0)+b|0)*3|0)/3200|0;a=(((((a<<3)-(e<<1)|0)*240|0)/((48e3/(c|0)|0)+240|0)|0)+e|0)/8|0;a=(b|0)<(a|0)?b:a;if((a|0)>(d<<3|4|0))return ((a|0)<257?a:257)|0;else return 0;return 0}function Lg(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=((b<<16>>16)*2471|0)/((g|0)/1e3|0|0)|0;g=R(h,-471)|0;b=g+268435456|0;g=-268435456-g<<1;i=b>>6;l=b>>22;j=h<<16>>16;m=R(h>>16,j)|0;j=R(h&65535,j)|0;h=R(h,(h>>15)+1>>1)|0;n=m+(j>>>16)+h<<16>>16;k=i&65535;h=(R(l,n)|0)+((R(k,n)|0)>>16)+(R(i,(m+(j>>16)+h+-8388608>>15)+1>>1)|0)|0;j=i<<16>>16;i=(R(l,j)|0)+((R(k,j)|0)>>16)+(R(i,(b>>21)+1>>1)|0)|0;Ug(a,b,g,b,h,i,d,c,e,f);if((f|0)!=2)return;Ug(a+4|0,b,g,b,h,i,d+8|0,c+4|0,e,2);return}function Mg(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0;n=12.0/+(f|0);o=1.0-n;h=+g[c>>2];m=c+4|0;i=+g[m>>2];if((e|0)!=2){f=0;while(1){if((f|0)>=(d|0))break;k=+g[a+(f<<2)>>2];j=k-h;g[b+(f<<2)>>2]=j-i;i=n*j+1.0000000031710769e-30+o*i;h=n*k+1.0000000031710769e-30+o*h;f=f+1|0}g[c>>2]=h;g[m>>2]=i;return}e=c+8|0;l=c+12|0;j=+g[l>>2];k=+g[e>>2];f=0;while(1){if((f|0)>=(d|0))break;u=f<<1;p=+g[a+(u<<2)>>2];t=u|1;r=+g[a+(t<<2)>>2];q=p-h;s=r-k;g[b+(u<<2)>>2]=q-i;g[b+(t<<2)>>2]=s-j;j=n*s+1.0000000031710769e-30+o*j;k=n*r+1.0000000031710769e-30+o*k;i=n*q+1.0000000031710769e-30+o*i;h=n*p+1.0000000031710769e-30+o*h;f=f+1|0}g[c>>2]=h;g[m>>2]=i;g[e>>2]=k;g[l>>2]=j;return}function Ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;d=d+ +g[a+(e<<2)>>2]*+g[b+(e<<2)>>2];e=e+1|0}return +d}function Og(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=d+1+(f<<1)|0;f=1;while(1){if((f|0)>=7){h=5;break}d=c[19432+(f*20|0)>>2]|0;if((d|0)>(a|0))break;f=f+1|0}do if((h|0)==5){if((f|0)!=7){d=c[19432+(f*20|0)>>2]|0;break}h=(c[19552+(g<<2)>>2]|0)+((a+-64e3|0)/2|0)|0;a=(e|0)==0;e=h+100|0;h=a?e:h;b=(b|0)==1104;e=h+300|0;h=b?e:h;return h|0}while(0);i=f+-1|0;h=c[19432+(i*20|0)>>2]|0;h=((R(c[19432+(i*20|0)+(g<<2)>>2]|0,d-a|0)|0)+(R(c[19432+(f*20|0)+(g<<2)>>2]|0,a-h|0)|0)|0)/(d-h|0)|0;a=(e|0)==0;e=h+100|0;h=a?e:h;b=(b|0)==1104;e=h+300|0;h=b?e:h;return h|0}function Pg(a,b,c,d,e,f,h,i,j){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0.0;k=48e3/(j|0)|0;l=(e|0)/(k|0)|0;a:do if((h|0)==1){j=0;while(1){if((j|0)>=(l|0)){j=0;break a}m=+g[i+((R(j,k)|0)<<2)>>2];m=m*m;g[b+(j<<2)>>2]=(m*d+(1.0-m)*c)*+g[a+(j<<2)>>2];j=j+1|0}}else{j=0;while(1){if((j|0)>=(l|0)){j=0;break a}m=+g[i+((R(j,k)|0)<<2)>>2];m=m*m;m=m*d+(1.0-m)*c;e=j<<1;g[b+(e<<2)>>2]=m*+g[a+(e<<2)>>2];e=e|1;g[b+(e<<2)>>2]=m*+g[a+(e<<2)>>2];j=j+1|0}}while(0);do{e=l;while(1){if((e|0)>=(f|0))break;i=(R(e,h)|0)+j|0;g[b+(i<<2)>>2]=+g[a+(i<<2)>>2]*d;e=e+1|0}j=j+1|0}while((j|0)<(h|0));return}function Qg(a){a=+a;a=a*32768.0;if(a>-32768.0){if(!(a<32767.0))a=32767.0}else a=-32768.0;return (Jh(a)|0)&65535|0}function Rg(a,b,c,d,e,f,h,i,j){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0.0,n=0;k=48e3/(j|0)|0;e=(e|0)/(k|0)|0;c=1.0-c;d=1.0-d;j=0;while(1){if((j|0)>=(e|0))break;m=+g[i+((R(j,k)|0)<<2)>>2];m=m*m;n=R(j,h)|0;l=n+1|0;m=(m*d+(1.0-m)*c)*((+g[a+(n<<2)>>2]-+g[a+(l<<2)>>2])*.5);n=b+(n<<2)|0;g[n>>2]=+g[n>>2]-m;l=b+(l<<2)|0;g[l>>2]=+g[l>>2]+m;j=j+1|0}while(1){if((j|0)>=(f|0))break;l=R(j,h)|0;n=l+1|0;m=d*((+g[a+(l<<2)>>2]-+g[a+(n<<2)>>2])*.5);l=b+(l<<2)|0;g[l>>2]=+g[l>>2]-m;n=b+(n<<2)|0;g[n>>2]=+g[n>>2]+m;j=j+1|0}return}function Sg(a,b){a=a|0;b=b|0;return (U(b|0)|0)+-32+a|0}function Tg(a,b,d,e,f,g,h){a=+a;b=b|0;d=+d;e=e|0;f=f|0;g=g|0;h=h|0;do if(!h){h=a<.10000000149011612;if(h?!(!(+Eg(e,f,g)*316.2300109863281<=d)|h^1):0)break;c[b>>2]=0;b=0;return b|0}while(0);g=c[b>>2]|0;h=g+1|0;c[b>>2]=h;if((g|0)<=9){b=0;return b|0}if((h|0)<31){b=1;return b|0}c[b>>2]=10;b=0;return b|0}function Ug(a,b,c,d,e,f,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;p=+(e|0)*3.725290298461914e-09;o=+(f|0)*3.725290298461914e-09;n=+(b|0)*3.725290298461914e-09;m=+(c|0)*3.725290298461914e-09;l=+(d|0)*3.725290298461914e-09;f=h+4|0;e=0;while(1){if((e|0)>=(j|0))break;d=R(e,k)|0;r=+g[a+(d<<2)>>2];q=+g[h>>2]+n*r;g[h>>2]=+g[f>>2]-q*p+m*r;g[f>>2]=l*r-q*o+1.0000000031710769e-30;g[i+(d<<2)>>2]=q;e=e+1|0}return}function Vg(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0;c=0.0;d=0.0;e=0;while(1){if((e|0)>=(b|0))break;f=+g[a+(e<<2)>>2];c=c<f?c:f;d=d>f?d:f;e=e+1|0}f=-c;return +(d>f?d:f)}function Wg(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=Ag(d,c[a+156>>2]|0,c[a+144>>2]|0)|0;return Cg(a,b,g,e,f,24,b,d,-2,c[a+112>>2]|0,1,1)|0}function Xg(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+192|0;o=t+64|0;j=t+56|0;i=t+48|0;h=t+40|0;n=t+32|0;m=t+24|0;q=t+16|0;p=t+8|0;k=t;s=t+168|0;f=t+68|0;c[s>>2]=e;r=a+(c[a>>2]|0)|0;a:do switch(d|0){case 4e3:{r=(c[s>>2]|0)+(4-1)&~(4-1);d=c[r>>2]|0;c[s>>2]=r+4;switch(d|0){case 2051:case 2049:case 2048:break;default:{e=-1;d=104;break a}}e=a+108|0;if((c[a+14148>>2]|0)==0?(c[e>>2]|0)!=(d|0):0){e=-1;d=104;break a}c[e>>2]=d;c[a+192>>2]=d;e=0;d=104;break}case 4001:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+108>>2];e=0;d=104}break}case 4002:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;switch(e|0){case -1e3:{e=-1e3;break}case -1:{e=-1;break}default:{if((e|0)<1){d=105;break a}if((e|0)<501)e=500;else{s=(c[a+112>>2]|0)*3e5|0;e=(e|0)>(s|0)?s:e}}}c[a+164>>2]=e;e=0;d=104;break}case 4003:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=Fg(a,c[a+14132>>2]|0,1276)|0;e=0;d=104}break}case 4022:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if((e|0)<1){if((e|0)!=-1e3){d=105;break a}}else if((e|0)>(c[a+112>>2]|0)){d=105;break a}c[a+120>>2]=e;e=0;d=104;break}case 4023:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+120>>2];e=0;d=104}break}case 4004:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if((e+-1101|0)>>>0>4)d=105;else{c[a+132>>2]=e;switch(e|0){case 1101:{c[a+20>>2]=8e3;e=0;d=104;break a}case 1102:{c[a+20>>2]=12e3;e=0;d=104;break a}default:{c[a+20>>2]=16e3;e=0;d=104;break a}}}break}case 4005:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+132>>2];e=0;d=104}break}case 4008:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if((e|0)>=1101){if((e|0)>1105){d=105;break a}c[a+128>>2]=e;if((e|0)==1101){c[a+20>>2]=8e3;e=0;d=104;break a}else d=e;e=a+20|0;if((d|0)==1102){c[e>>2]=12e3;e=0;d=104;break a}}else{if((e|0)!=-1e3){d=105;break a}c[a+128>>2]=-1e3;e=a+20|0}c[e>>2]=16e3;e=0;d=104;break}case 4009:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+14136>>2];e=0;d=104}break}case 4016:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(e>>>0>1)d=105;else{c[a+184>>2]=e;e=0;d=104}break}case 4017:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+184>>2];e=0;d=104}break}case 4010:{q=(c[s>>2]|0)+(4-1)&~(4-1);e=c[q>>2]|0;c[s>>2]=q+4;if(e>>>0>10)d=105;else{c[a+44>>2]=e;c[k>>2]=e;bb(r,4010,k)|0;e=0;d=104}break}case 4011:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+44>>2];e=0;d=104}break}case 4012:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(e>>>0>1)d=105;else{c[a+48>>2]=e;e=0;d=104}break}case 4013:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+48>>2];e=0;d=104}break}case 4014:{q=(c[s>>2]|0)+(4-1)&~(4-1);e=c[q>>2]|0;c[s>>2]=q+4;if(e>>>0>100)d=105;else{c[a+40>>2]=e;c[p>>2]=e;bb(r,4014,p)|0;e=0;d=104}break}case 4015:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+40>>2];e=0;d=104}break}case 4006:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(e>>>0>1)d=105;else{c[a+148>>2]=e;c[a+60>>2]=1-e;e=0;d=104}break}case 4007:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+148>>2];e=0;d=104}break}case 11018:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if((e+1|0)>>>0>101)d=105;else{c[a+140>>2]=e;e=0;d=104}break}case 11019:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+140>>2];e=0;d=104}break}case 4020:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(e>>>0>1)d=105;else{c[a+152>>2]=e;e=0;d=104}break}case 4021:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+152>>2];e=0;d=104}break}case 4024:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if((e|0)<3001)switch(e|0){case -1e3:break;default:{d=105;break a}}else switch(e|0){case 3002:case 3001:break;default:{d=105;break a}}c[a+124>>2]=e;e=0;d=104;break}case 4025:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+124>>2];e=0;d=104}break}case 4027:{r=(c[s>>2]|0)+(4-1)&~(4-1);d=c[r>>2]|0;c[s>>2]=r+4;if(d){e=(c[a+144>>2]|0)/400|0;c[d>>2]=e;if((c[a+108>>2]|0)==2051){e=0;d=104}else{c[d>>2]=e+(c[a+116>>2]|0);e=0;d=104}}else d=105;break}case 4029:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+144>>2];e=0;d=104}break}case 4031:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+18032>>2];e=0;d=104}break}case 4036:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if((e+-8|0)>>>0>16)d=105;else{c[a+168>>2]=e;e=0;d=104}break}case 4037:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+168>>2];e=0;d=104}break}case 4040:{p=(c[s>>2]|0)+(4-1)&~(4-1);e=c[p>>2]|0;c[s>>2]=p+4;if((e+-5e3|0)>>>0<10){c[a+156>>2]=e;c[q>>2]=e;bb(r,4040,q)|0;e=0;d=104}else d=105;break}case 4041:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+156>>2];e=0;d=104}break}case 4042:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(e>>>0>1)d=105;else{c[a+76>>2]=e;e=0;d=104}break}case 4043:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if(!e)d=105;else{c[e>>2]=c[a+76>>2];e=0;d=104}break}case 4046:{a=(c[s>>2]|0)+(4-1)&~(4-1);e=c[a>>2]|0;c[s>>2]=a+4;if(e>>>0>1)d=105;else{c[m>>2]=e;bb(r,4046,m)|0;e=0;d=104}break}case 4047:{a=(c[s>>2]|0)+(4-1)&~(4-1);e=c[a>>2]|0;c[s>>2]=a+4;if(!e)d=105;else{c[n>>2]=e;bb(r,4047,n)|0;e=0;d=104}break}case 4028:{d=a+(c[a+4>>2]|0)|0;ch(a+188|0);e=a+14088|0;Qh(e|0,0,3948)|0;bb(r,4028,h)|0;Tc(d,c[a+180>>2]|0,f)|0;c[e>>2]=c[a+112>>2];b[a+14092>>1]=16384;g[a+14100>>2]=1.0;c[a+14148>>2]=1;c[a+14120>>2]=1001;c[a+14136>>2]=1105;c[a+14096>>2]=(ue(60)|0)<<8;e=0;d=104;break}case 11002:{r=(c[s>>2]|0)+(4-1)&~(4-1);e=c[r>>2]|0;c[s>>2]=r+4;if((e|0)<1e3){if((e|0)!=-1e3){d=105;break a}}else if((e|0)>1002){d=105;break a}c[a+136>>2]=e;e=0;d=104;break}case 10024:{d=(c[s>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[s>>2]=d+4;c[a+176>>2]=e;c[i>>2]=e;e=bb(r,10024,i)|0;d=104;break}case 10026:{d=(c[s>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[s>>2]=d+4;c[a+14152>>2]=e;c[j>>2]=e;e=bb(r,10026,j)|0;d=104;break}case 10015:{a=(c[s>>2]|0)+(4-1)&~(4-1);e=c[a>>2]|0;c[s>>2]=a+4;if(!e)d=105;else{c[o>>2]=e;e=bb(r,10015,o)|0;d=104}break}default:{e=-5;d=104}}while(0);if((d|0)==104){a=e;l=t;return a|0}else if((d|0)==105){a=-1;l=t;return a|0}return 0}function Yg(a){a=a|0;c[a+4>>2]=0;return}function Zg(a,b,c){a=a|0;b=b|0;c=c|0;return _g(a,b,c)|0}function _g(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;f=j;if((e|0)<1){i=-4;l=j;return i|0}i=b+4|0;g=c[i>>2]|0;if(g){if(((a[b>>0]^a[d>>0])&255)>3){i=-4;l=j;return i|0}}else{a[b>>0]=a[d>>0]|0;c[b+296>>2]=pg(a[d>>0]|0,8e3)|0}h=sg(d,e)|0;if((h|0)<1){i=-4;l=j;return i|0}if((R(h+g|0,c[b+296>>2]|0)|0)>960){i=-4;l=j;return i|0}b=qg(d,e,0,f,b+8+(g<<2)|0,b+200+(g<<1)|0)|0;if((b|0)<1){i=b;l=j;return i|0}c[i>>2]=(c[i>>2]|0)+h;i=0;l=j;return i|0}function $g(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)<1){h=-1;return h|0}if((c[d+4>>2]|0)<(e|0)){h=-1;return h|0}k=d+200|0;a:do switch(e|0){case 1:{i=b[k>>1]|0;if((i|0)<(g|0)){a[f>>0]=a[d>>0]&-4;j=f+1|0;i=i+1|0;l=11;break a}else{h=-2;return h|0}}case 2:{i=b[d+202>>1]|0;j=b[k>>1]|0;if(i<<16>>16==j<<16>>16){i=i<<16>>16<<1|1;if((i|0)>(g|0)){h=-2;return h|0}else{a[f>>0]=a[d>>0]&-4|1;j=f+1|0;l=11;break a}}else{i=(j<<16>>16)+(i<<16>>16)+2+(j<<16>>16>251&1)|0;if((i|0)>(g|0)){h=-2;return h|0}else{j=f+1|0;a[f>>0]=a[d>>0]&-4|2;j=j+(og(b[k>>1]|0,j)|0)|0;l=11;break a}}}default:{i=1;l=12}}while(0);if((l|0)==11)if((h|0)!=0&(i|0)<(g|0)){i=1;l=12}b:do if((l|0)==12){while(1){if((i|0)>=(e|0)){l=20;break}if((b[d+200+(i<<1)>>1]|0)!=(b[k>>1]|0)){l=14;break}i=i+1|0;l=12}do if((l|0)==14){k=e+-1|0;i=0;j=2;while(1){if((i|0)>=(k|0))break;m=b[d+200+(i<<1)>>1]|0;i=i+1|0;j=j+((m<<16>>16>251?2:1)+(m<<16>>16))|0}i=j+(b[d+200+(k<<1)>>1]|0)|0;if((i|0)>(g|0)){h=-2;return h|0}else{a[f>>0]=a[d>>0]|3;k=(e|128)&255;a[f+1>>0]=k;m=1;break}}else if((l|0)==20){i=(R(b[k>>1]|0,e)|0)+2|0;if((i|0)>(g|0)){h=-2;return h|0}else{a[f>>0]=a[d>>0]|3;k=e&255;a[f+1>>0]=k;m=0;break}}while(0);j=f+2|0;if((h|0)!=0?(n=g-i|0,(n|0)!=0):0){a[f+1>>0]=k|64;k=(n+-1|0)/255|0;i=0;while(1){if((i|0)>=(k|0))break;a[j>>0]=-1;i=i+1|0;j=j+1|0}a[j>>0]=n+(R(k,-255)|0)+255;j=j+1|0;i=g}if(m){l=e+-1|0;k=0;while(1){if((k|0)>=(l|0))break b;n=j+(og(b[d+200+(k<<1)>>1]|0,j)|0)|0;k=k+1|0;j=n}}}while(0);k=0;while(1){if((k|0)>=(e|0))break;n=d+200+(k<<1)|0;Wh(j|0,c[d+8+(k<<2)>>2]|0,b[n>>1]|0)|0;j=j+(b[n>>1]|0)|0;k=k+1|0}if(!h){h=i;return h|0}k=f+g|0;while(1){if(j>>>0>=k>>>0)break;a[j>>0]=0;j=j+1|0}return i|0}function ah(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+304|0;e=f;if((b|0)<1){e=-1;l=f;return e|0}if((b|0)==(d|0)){e=0;l=f;return e|0}if((b|0)>(d|0)){e=-1;l=f;return e|0}Yg(e);g=a+d+(0-b)|0;Wh(g|0,a|0,b|0)|0;b=Zg(e,g,b)|0;if(!b){g=$g(e,c[e+4>>2]|0,a,d,1)|0;l=f;return ((g|0)<0?g:0)|0}else{g=b;l=f;return g|0}return 0}function bh(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+8>>2]=b;ch(a);return}function ch(a){a=a|0;Qh(a+12|0,0,13888)|0;g[a+8260>>2]=.8999999761581421;g[a+8256>>2]=.10000000149011612;return}function dh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;p=a+8276|0;e=c[p>>2]|0;m=a+8272|0;h=c[m>>2]|0;o=h-e|0;o=(o|0)<0?o+100|0:o;n=a+8|0;if(!((h|0)==(e|0)?1:((c[n>>2]|0)/50|0|0)>=(d|0))){e=e+1|0;e=(e|0)==100?0:e}l=(e|0)==(h|0)?h+-1|0:e;l=(l|0)<0?99:l;e=b;h=a+8300+(l*56|0)|0;i=e+56|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));k=b+4|0;j=+g[k>>2];h=0;i=1;f=j;e=l;while(1){if((h|0)>=3)break;e=e+1|0;e=(e|0)==100?0:e;if((e|0)==(c[m>>2]|0))break;q=+g[a+8300+(e*56|0)+4>>2];h=h+1|0;i=i+1|0;f=f+q;j=j>q?j:q}f=f/+(i|0);q=j+-.20000000298023224;g[k>>2]=f>q?f:q;h=a+8280|0;e=(c[h>>2]|0)+((d|0)/((c[n>>2]|0)/400|0|0)|0)|0;c[h>>2]=e;while(1){if((e|0)<=7)break;d=e+-8|0;c[h>>2]=d;c[p>>2]=(c[p>>2]|0)+1;e=d}e=c[p>>2]|0;if((e|0)>99)c[p>>2]=e+-100;h=(o|0)>1?101-o|0:100;f=0.0;e=0;while(1){if((e|0)>=(h|0))break;f=f+ +g[a+7856+(e<<2)>>2];e=e+1|0}while(1){if((e|0)>=100)break;f=f+ +g[a+7456+(e<<2)>>2];e=e+1|0}g[b+20>>2]=f*+g[a+8260>>2]+(1.0-f)*+g[a+8256>>2];return}function eh(a,b,d,e,f,g,h,i,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0;e=e&-2;if(!d){c[m>>2]=0;dh(a,m,f);return}o=(j*95|0)/50|0;o=(o|0)<(e|0)?o:e;p=a+7452|0;q=c[p>>2]|0;n=(j|0)/50|0;e=o-q|0;j=q;while(1){if((e|0)<=0)break;fh(a,b,d,(e|0)>(n|0)?n:e,j,g,h,i,k,l);e=e-n|0;j=j+n|0}c[p>>2]=o-f;c[m>>2]=0;dh(a,m,f);return}function fh(b,d,e,f,h,i,k,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0,Z=0,_=0.0,$=0,aa=0.0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0.0,la=0.0;ia=l;l=l+11120|0;J=ia+11040|0;$=ia+10968|0;ca=ia+10936|0;da=ia+10832|0;ea=ia+10824|0;H=ia+9864|0;ba=ia+9832|0;N=ia+9752|0;O=ia+9676|0;Q=ia+9600|0;C=ia+5760|0;Y=ia+1920|0;K=ia+960|0;L=ia;fa=b+7448|0;w=c[fa>>2]|0;W=w+1|0;aa=(w|0)>9?.10000000149011612:1.0/+(W|0);_=(w|0)>24?.03999999910593033:1.0/+(W|0);W=(w|0)>499;V=1.0/+(w+1|0);Z=b+8|0;y=c[Z>>2]|0;a:do if((y|0)<48e3){switch(y|0){case 16e3:break;default:{A=h;break a}}f=(f*3|0)/2|0;A=(h*3|0)/2|0}else{switch(y|0){case 48e3:break;default:{A=h;break a}}f=(f|0)/2|0;A=(h|0)/2|0}while(0);if((w|0)<4){g[b+7424>>2]=(c[b+4>>2]|0)==2048?.10000000149011612:.625;h=c[d+72>>2]|0;d=b+5772|0;if(!w){c[d>>2]=240;x=240}else{w=d;M=7}}else{w=b+5772|0;h=c[d+72>>2]|0;M=7}if((M|0)==7){x=c[w>>2]|0;d=w}z=b+8288|0;w=720-x|0;X=+gh(o,e,b+2892+(x<<2)|0,z,(f|0)<(w|0)?f:w,A,i,k,m,y);x=b+8284|0;X=+g[x>>2]+X;g[x>>2]=X;y=c[d>>2]|0;w=y+f|0;if((w|0)<720){c[d>>2]=w;l=ia;return}w=b+8272|0;ga=c[w>>2]|0;ha=b+8300+(ga*56|0)|0;c[w>>2]=ga+((ga|0)>98?-99:1);w=0;while(1){if((w|0)==240)break;U=+g[19612+(w<<2)>>2];g[C+(w<<3)>>2]=U*+g[b+2892+(w<<2)>>2];g[C+(w<<3)+4>>2]=U*+g[b+2892+(w+240<<2)>>2];ja=480-w+-1|0;g[C+(ja<<3)>>2]=U*+g[b+2892+(ja<<2)>>2];g[C+(ja<<3)+4>>2]=U*+g[b+2892+(720-w+-1<<2)>>2];w=w+1|0}Sh(b+2892|0,b+4812|0,960)|0;ja=f+(y+-720)|0;g[x>>2]=+gh(o,e,b+3852|0,z,ja,A+720-y|0,i,k,m,c[Z>>2]|0);c[d>>2]=ja+240;bc(h,C,Y);p=+g[Y>>2];if(p!=p|0.0!=0.0){c[ha>>2]=0;l=ia;return}else f=1;while(1){if((f|0)==240){f=2;break}B=+g[Y+(f<<3)>>2];m=480-f|0;v=+g[Y+(m<<3)>>2];I=+g[Y+(f<<3)+4>>2];S=+g[Y+(m<<3)+4>>2];T=+hh(I-S,B+v)*.15915493667125702;m=b+12+(f<<2)|0;U=T-+g[m>>2];o=b+972+(f<<2)|0;R=U-+g[o>>2];S=+hh(v-B,I+S)*.15915493667125702;T=S-T;U=T-U;R=R-+(Jh(R)|0);I=+E(+R);R=R*R;U=U-+(Jh(U)|0);g[L+(f<<2)>>2]=I+ +E(+U);U=U*U;U=U*U;ja=b+1932+(f<<2)|0;g[K+(f<<2)>>2]=1.0/((+g[ja>>2]+R*R+U*2.0)*.25*62341.81640625+1.0)+-.014999999664723873;g[H+(f<<2)>>2]=1.0/(U*62341.81640625+1.0)+-.014999999664723873;g[m>>2]=S;g[o>>2]=T;g[ja>>2]=U;f=f+1|0}while(1){if((f|0)==239)break;m=f+-1|0;S=+g[H+(m<<2)>>2];ja=f+1|0;U=+g[H+(ja<<2)>>2];k=S>U;o=K+(f<<2)|0;T=+g[o>>2];U=+g[H+((+g[H+(f<<2)>>2]<(k?S:U)?f:k?m:ja)<<2)>>2]+-.10000000149011612;g[o>>2]=(T>U?T:U)*.8999999761581421;f=ja}A=b+8300+(ga*56|0)+16|0;g[A>>2]=0.0;b:do if(!(c[fa>>2]|0)){f=0;while(1){if((f|0)==18)break b;g[b+7008+(f<<2)>>2]=1.0e10;g[b+7080+(f<<2)>>2]=-1.0e10;f=f+1|0}}while(0);U=p*2.0;p=+g[Y+4>>2]*2.0;p=U*U+p*p;f=1;while(1){if((f|0)==4)break;R=+g[Y+(f<<3)>>2];T=+g[Y+(f<<3)+4>>2];ja=480-f|0;S=+g[Y+(ja<<3)>>2];U=+g[Y+(ja<<3)+4>>2];p=p+(R*R+S*S+T*T+U*U);f=f+1|0}g[N>>2]=+P(+(p+1.000000013351432e-10))*.7213475108146667;z=b+7440|0;p=0.0;S=0.0;B=0.0;U=0.0;R=0.0;T=0.0;I=0.0;d=0;while(1){if((d|0)>=18)break;w=d+1|0;h=c[20572+(w<<2)>>2]|0;q=0.0;v=0.0;r=0.0;f=c[20572+(d<<2)>>2]|0;while(1){if((f|0)>=(h|0))break;ka=+g[Y+(f<<3)>>2];ja=480-f|0;s=+g[Y+(ja<<3)>>2];t=+g[Y+(f<<3)+4>>2];u=+g[Y+(ja<<3)+4>>2];u=ka*ka+s*s+t*t+u*u;t=+g[K+(f<<2)>>2];q=q+u*2.0*(.5-+g[L+(f<<2)>>2]);v=v+u*(t<0.0?0.0:t);r=r+u;f=f+1|0}if(!(r<1.0e9)|(r!=r|0.0!=0.0)){M=32;break}g[b+5856+((c[z>>2]|0)*72|0)+(d<<2)>>2]=r;t=r+1.0000000036274937e-15;B=B+q/t;s=r+1.000000013351432e-10;u=I+ +F(+s);s=+P(+s);g[$+(d<<2)>>2]=s;g[N+(w<<2)>>2]=s*.7213475108146667;g[b+6432+((c[z>>2]|0)*72|0)+(d<<2)>>2]=s;if(!(c[fa>>2]|0)){h=b+7008+(d<<2)|0;g[h>>2]=s;f=b+7080+(d<<2)|0;g[f>>2]=s;q=s;r=s}else{H=b+7080+(d<<2)|0;ja=b+7008+(d<<2)|0;f=H;h=ja;q=+g[H>>2];r=+g[ja>>2]}do if(q>r+7.5)if(q-s>s-r){q=q+-.009999999776482582;g[f>>2]=q;break}else{r=r+.009999999776482582;g[h>>2]=r;break}while(0);if(!(s>q)){if(s<r){g[h>>2]=s;r=s+15.0;q=r<q?r:q;g[f>>2]=q;r=s}}else{g[f>>2]=s;q=s+-15.0;r=q>r?q:r;g[h>>2]=r;q=s}s=(s-r)/(q-r+1.0000000036274937e-15);q=0.0;r=0.0;f=0;while(1){if((f|0)==8)break;ka=+g[b+5856+(f*72|0)+(d<<2)>>2];q=q+ka;r=r+ +F(+ka);f=f+1|0}r=r/+F(+(q*8.0+1.0e-15));r=r>.9900000095367432?.9900000095367432:r;r=r*r;r=r*r;ka=v/t;f=b+5776+(d<<2)|0;q=r*+g[f>>2];q=ka>q?ka:q;g[J+(d<<2)>>2]=q;p=p+q;if((d|0)>8)p=p-+g[J+(d+-9<<2)>>2];I=(+(d+-18|0)*.029999999329447746+1.0)*p;g[f>>2]=q;S=S>I?S:I;U=U+q*+(d+-8|0);R=R+r;T=T+s;I=u;d=w}if((M|0)==32){c[ha>>2]=0;l=ia;return}f=c[N>>2]|0;c[O>>2]=f;p=(c[j>>2]=f,+g[j>>2])+-2.5;g[Q>>2]=p;f=1;while(1){if((f|0)==19){f=16;break}ja=f+-1|0;v=+((c[20572+(f<<2)>>2]|0)-(c[20572+(ja<<2)>>2]|0)|0)*2.0*.25;u=+g[O+(ja<<2)>>2]+v;ka=+g[N+(f<<2)>>2];g[O+(f<<2)>>2]=u<ka?u:ka;v=p-v;ka=ka+-2.5;ka=v>ka?v:ka;g[Q+(f<<2)>>2]=ka;f=f+1|0;p=ka}while(1){if((f|0)<=-1){f=0;break}ja=f+1|0;v=+((c[20572+(ja<<2)>>2]|0)-(c[20572+(f<<2)>>2]|0)|0)*2.0*.25;u=+g[O+(ja<<2)>>2]+v;M=O+(f<<2)|0;ka=+g[M>>2];g[M>>2]=u<ka?u:ka;v=+g[Q+(ja<<2)>>2]-v;ja=Q+(f<<2)|0;ka=+g[ja>>2];g[ja>>2]=v>ka?v:ka;f=f+-1|0}while(1){if((f|0)==19){r=0.0;d=0;break}ka=+g[N+(f<<2)>>2];v=+g[Q+(f<<2)>>2]-ka;ka=ka-(+g[O+(f<<2)>>2]+2.5);ja=~~+D(+(((v<0.0?0.0:v)+(ka<0.0?0.0:ka))*64.0+.5));a[b+8300+(ga*56|0)+36+f>>0]=(ja|0)<255?ja:255;f=f+1|0}while(1){if((d|0)==8)break;else{q=999999986991104.0;h=0}while(1){if((h|0)==8)break;else{p=0.0;f=0}while(1){if((f|0)==18)break;ka=+g[b+6432+(d*72|0)+(f<<2)>>2]-+g[b+6432+(h*72|0)+(f<<2)>>2];p=p+ka*ka;f=f+1|0}q=(h|0)==(d|0)|q<p?q:p;h=h+1|0}r=r+q;d=d+1|0}v=+F(+(r*.125/18.0));u=(n|0)<8?5.699999746866524e-04:5.699999746866524e-04/+(1<<n+-8|0);u=u*u;t=W?.9980000257492065:1.0-V;p=0.0;f=0;q=0.0;d=0;while(1){if((d|0)==18)break;w=c[20572+(d<<2)>>2]|0;x=d+1|0;y=c[20572+(x<<2)>>2]|0;r=0.0;h=w;while(1){if((h|0)>=(y|0))break;la=+g[Y+(h<<3)>>2];V=+g[Y+(h<<3)+4>>2];ja=480-h|0;s=+g[Y+(ja<<3)>>2];ka=+g[Y+(ja<<3)+4>>2];r=r+(la*la+s*s+V*V+ka*ka);h=h+1|0}s=q>r?q:r;ja=b+7152+(d<<2)|0;q=t*+g[ja>>2];q=q>r?q:r;g[ja>>2]=q;q=r>q?r:q;p=p*.05000000074505806;p=p>q?p:q;if(!(q>p*.1&q*1.0e9>s)){ja=f;q=s;d=x;f=ja;continue}if(!(q>u*+(y-w|0))){ja=f;q=s;d=x;f=ja;continue}f=x;q=s;d=x}if((c[Z>>2]|0)==48e3){V=X*1.7361111531499773e-05;X=(c[b+5852>>2]|0)==20?.029999999329447746:.07000000029802322;ja=b+7224|0;la=t*+g[ja>>2];la=la>V?la:V;g[ja>>2]=la;la=V>la?V:la;ka=p*.05000000074505806;f=(la*1.0e9>(q>V?q:V)?la>X*(ka>la?ka:la):0)&la>u*160.0|(f|0)>16?20:f}w=c[fa>>2]|0;y=(w|0)<3?20:f;X=+Ih(I)*20.0;x=b+7432|0;ka=+g[x>>2]+-.003000000026077032;ka=ka>X?ka:X;g[x>>2]=ka;x=b+7436|0;la=+g[x>>2]*(1.0-_);g[x>>2]=X<ka+-30.0?la+_:la;h=0;while(1){if((h|0)==8){h=0;break}d=h<<4;p=0.0;f=0;while(1){if((f|0)==16)break;p=p+ +g[20648+(d+f<<2)>>2]*+g[$+(f<<2)>>2];f=f+1|0}g[ca+(h<<2)>>2]=p;h=h+1|0}while(1){if((h|0)==8)break;d=h<<4;p=0.0;f=0;while(1){if((f|0)==16)break;p=p+ +g[20648+(d+f<<2)>>2]*.5*(+g[b+7080+(f<<2)>>2]+ +g[b+7008+(f<<2)>>2]);f=f+1|0}g[ba+(h<<2)>>2]=p;h=h+1|0}q=R/18.0;B=B/18.0;g[A>>2]=B+(1.0-B)*((w|0)<10?.5:T/18.0);ka=S/9.0;d=b+5848|0;la=+g[d>>2]*.800000011920929;la=ka>la?ka:la;g[d>>2]=la;d=b+8300+(ga*56|0)+8|0;g[d>>2]=U*.015625;c[z>>2]=((c[z>>2]|0)+1|0)%8|0;h=w+1|0;c[fa>>2]=(h|0)<1e4?h:1e4;h=b+8300+(ga*56|0)+4|0;g[h>>2]=la;f=0;while(1){if((f|0)==4)break;g[da+(f<<2)>>2]=(+g[ca+(f<<2)>>2]+ +g[b+7228+(f+24<<2)>>2])*-.12298999726772308+(+g[b+7228+(f<<2)>>2]+ +g[b+7228+(f+16<<2)>>2])*.49195000529289246+ +g[b+7228+(f+8<<2)>>2]*.6969299912452698-+g[b+7356+(f<<2)>>2]*1.4349000453948975;f=f+1|0}p=1.0-aa;f=0;while(1){if((f|0)==4){f=0;break}ja=b+7356+(f<<2)|0;g[ja>>2]=p*+g[ja>>2]+aa*+g[ca+(f<<2)>>2];f=f+1|0}while(1){if((f|0)==4){f=0;break}g[da+(f+4<<2)>>2]=(+g[ca+(f<<2)>>2]-+g[b+7228+(f+24<<2)>>2])*.6324599981307983+(+g[b+7228+(f<<2)>>2]-+g[b+7228+(f+16<<2)>>2])*.31622999906539917;f=f+1|0}while(1){if((f|0)==3)break;ja=f+8|0;g[da+(ja<<2)>>2]=(+g[ca+(f<<2)>>2]+ +g[b+7228+(f+24<<2)>>2])*.5345199704170227-(+g[b+7228+(f<<2)>>2]+ +g[b+7228+(f+16<<2)>>2])*.26725998520851135-+g[b+7228+(ja<<2)>>2]*.5345199704170227;f=f+1|0}c:do if((c[fa>>2]|0)>5){f=0;while(1){if((f|0)==9){f=0;break c}ja=b+7388+(f<<2)|0;la=+g[da+(f<<2)>>2];g[ja>>2]=p*+g[ja>>2]+aa*la*la;f=f+1|0}}else f=0;while(0);while(1){if((f|0)==4){f=0;break}g[da+(f<<2)>>2]=+g[ca+(f<<2)>>2]-+g[ba+(f<<2)>>2];f=f+1|0}while(1){if((f|0)==8){f=0;break}ja=b+7228+(f+16<<2)|0;c[b+7228+(f+24<<2)>>2]=c[ja>>2];ba=b+7228+(f+8<<2)|0;c[ja>>2]=c[ba>>2];ja=b+7228+(f<<2)|0;c[ba>>2]=c[ja>>2];c[ja>>2]=c[ca+(f<<2)>>2];f=f+1|0}while(1){if((f|0)==9)break;la=+F(+(+g[b+7388+(f<<2)>>2]));g[da+(f+11<<2)>>2]=la-+g[21160+(f<<2)>>2];f=f+1|0}g[da+72>>2]=v+-.7799999713897705;g[da+80>>2]=+g[h>>2]+-.15472300350666046;g[da+84>>2]=+g[A>>2]+-.7246429920196533;g[da+88>>2]=q+-.7437170147895813;g[da+92>>2]=+g[d>>2]+.06921599805355072;g[da+96>>2]=+g[x>>2]+-.06792999804019928;jh(da,ea);t=(+g[ea>>2]+1.0)*.5;g[ea>>2]=t;d=ea+4|0;u=+g[d>>2]*.5+.5;u=u*u;g[d>>2]=u;g[b+8300+(ga*56|0)+32>>2]=u;d=b+7424|0;ka=+g[d>>2];aa=1.0-ka;la=ka*1.0000000474974513e-03+aa*.009999999776482582;ca=u>.949999988079071;ja=u<.05000000074505806&(ca^1);s=ja|ca?(ja?.05000000074505806:.949999988079071):u;ja=b+7428|0;_=+g[ja>>2];ca=_>.949999988079071;da=_<.05000000074505806&(ca^1);v=da|ca?(da?.05000000074505806:.949999988079071):_;V=1.0-_;X=1.0-la;s=+E(+(s-v))*.05000000074505806/(s*(1.0-v)+v*(1.0-s))+.019999999552965164;v=(_*X+V*la)*+G(+u,+s);v=v/((V*X+_*la)*+G(+(1.0-u),+s)+v);g[ja>>2]=v;g[b+8300+(ga*56|0)+24>>2]=v;v=+g[ja>>2];v=v*t+(1.0-v)*.5;g[ea>>2]=v;ja=v>.949999988079071;ea=v<.05000000074505806&(ja^1);t=ea|ja?(ea?.05000000074505806:.949999988079071):v;ea=ka>.949999988079071;ja=ka<.05000000074505806&(ea^1);s=ja|ea?(ja?.05000000074505806:.949999988079071):ka;t=+E(+(t-s))*.05000000074505806/(t*(1.0-s)+s*(1.0-t))+.019999999552965164;s=+G(+(1.0-v),+t);t=+G(+v,+t);la=(ka*.9998999834060669+aa*9.999999747378752e-05)*t;la=la/((aa*.9998999834060669+ka*9.999999747378752e-05)*s+la);g[d>>2]=la;g[b+8300+(ga*56|0)+20>>2]=la;if((c[fa>>2]|0)==1){q=(c[b+4>>2]|0)==2048?.10000000149011612:.625;h=b+7856|0;g[h>>2]=q;p=1.0-q;f=b+7456|0;g[f>>2]=p}else{fa=b+7456|0;ja=b+7856|0;f=fa;h=ja;p=+g[fa>>2];q=+g[ja>>2]}r=p+ +g[b+7460>>2];p=q+ +g[b+7860>>2];g[f>>2]=r*.9998999834060669*s;g[h>>2]=p*.9998999834060669*t;f=1;while(1){if((f|0)==99)break;ja=f+1|0;g[b+7456+(f<<2)>>2]=+g[b+7456+(ja<<2)>>2]*s;g[b+7856+(f<<2)>>2]=+g[b+7856+(ja<<2)>>2]*t;f=ja}g[b+7852>>2]=p*9.999999747378752e-05*s;g[b+8252>>2]=r*9.999999747378752e-05*t;p=9.999999682655225e-21;f=0;while(1){if((f|0)==100)break;p=p+(+g[b+7456+(f<<2)>>2]+ +g[b+7856+(f<<2)>>2]);f=f+1|0}p=1.0/p;f=0;while(1){if((f|0)==100)break;ja=b+7456+(f<<2)|0;g[ja>>2]=+g[ja>>2]*p;ja=b+7856+(f<<2)|0;g[ja>>2]=+g[ja>>2]*p;f=f+1|0}q=+g[d>>2];if(u>.75){p=q;if(p>.9){ja=b+8268|0;fa=(c[ja>>2]|0)+1|0;c[ja>>2]=(fa|0)<500?fa:500;ja=b+8260|0;ka=+g[ja>>2];la=v-ka;g[ja>>2]=ka+1.0/+(fa|0)*(la<-.20000000298023224?-.20000000298023224:la)}if(p<.1){ja=b+8264|0;fa=(c[ja>>2]|0)+1|0;c[ja>>2]=(fa|0)<500?fa:500;ja=b+8256|0;ka=+g[ja>>2];la=v-ka;g[ja>>2]=ka+1.0/+(fa|0)*(la>.20000000298023224?.20000000298023224:la)}}c[b+7444>>2]=q>.5&1;c[b+8300+(ga*56|0)+28>>2]=y;c[b+5852>>2]=y;g[b+8300+(ga*56|0)+12>>2]=B;c[ha>>2]=1;l=ia;return}function gh(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0,p=0,q=0,r=0,s=0;s=l;if(!f){n=0.0;l=s;return +n}o=(m|0)==48e3;if(!o)if((m|0)==16e3){h=(h<<1|0)/3|0;p=(f<<1|0)/3|0}else p=f;else{h=h<<1;p=f<<1}r=fa()|0;q=l;l=l+((1*(p<<2)|0)+15&-16)|0;ka[a&1](b,q,p,h,i,j,k);if((j|0)==-2)n=.000030517578125/+(k|0);else n=(j|0)>-1?.0000152587890625:.000030517578125;h=0;while(1){if((h|0)>=(p|0))break;k=q+(h<<2)|0;g[k>>2]=+g[k>>2]*n;h=h+1|0}a:do if(o)n=+ih(e,d,q,p);else{if((m|0)>=24e3){switch(m|0){case 24e3:break;default:{n=0.0;break a}}Sh(d|0,q|0,p<<2|0)|0;n=0.0;break}switch(m|0){case 16e3:break;default:{n=0.0;break a}}f=p*3|0;a=fa()|0;b=l;l=l+((1*(f<<2)|0)+15&-16)|0;h=0;while(1){if((h|0)>=(p|0))break;o=c[q+(h<<2)>>2]|0;m=h*3|0;c[b+(m<<2)>>2]=o;c[b+(m+1<<2)>>2]=o;c[b+(m+2<<2)>>2]=o;h=h+1|0}+ih(e,d,b,f);ha(a|0);n=0.0}while(0);ha(r|0);l=s;return +n}function hh(a,b){a=+a;b=+b;var c=0.0,d=0.0;c=b*b;d=a*a;if(c+d<1.000000045813705e-18){d=0.0;return +d}if(c<d){d=-(b*a*(d+c*.43157973885536194))/((d+c*.6784840226173401)*(d+c*.0859554186463356))+(a<0.0?-1.5707963705062866:1.5707963705062866);return +d}else{b=b*a;d=b*(c+d*.43157973885536194)/((c+d*.6784840226173401)*(c+d*.0859554186463356))+(a<0.0?-1.5707963705062866:1.5707963705062866)-(b<0.0?-1.5707963705062866:1.5707963705062866);return +d}return 0.0}function ih(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0;f=(d|0)/2|0;h=a+4|0;i=a+8|0;e=0.0;d=0;while(1){if((d|0)>=(f|0))break;p=d<<1;l=+g[c+(p<<2)>>2];m=+g[a>>2];n=(l-m)*.6074370741844177;m=m+n;g[a>>2]=l+n;n=+g[c+((p|1)<<2)>>2];l=+g[h>>2];k=(n-l)*.15062999725341797;g[h>>2]=n+k;j=+g[i>>2];o=(-n-j)*.15062999725341797;j=m+j+o;g[i>>2]=o-n;g[b+(d<<2)>>2]=(m+l+k)*.5;e=e+j*j;d=d+1|0}return +e}function jh(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0,h=0,i=0,j=0;j=l;l=l+400|0;i=j;e=0;f=22e3;while(1){if((e|0)==16){f=0;h=23664;break}d=+g[f>>2];c=f;h=0;while(1){c=c+4|0;if((h|0)==25)break;d=d+ +g[a+(h<<2)>>2]*+g[c>>2];h=h+1|0}g[i+(e<<2)>>2]=+kh(d);e=e+1|0;f=f+104|0}while(1){if((f|0)==2)break;d=+g[h>>2];e=0;c=h;while(1){c=c+4|0;if((e|0)==16)break;d=d+ +g[i+(e<<2)>>2]*+g[c>>2];e=e+1|0}g[b+(f<<2)>>2]=+kh(d);f=f+1|0;h=h+68|0}l=j;return}function kh(a){a=+a;var b=0.0,c=0,d=0;if(!(a<8.0)){a=1.0;return +a}if(!(a>-8.0)){a=-1.0;return +a}if(a!=a|0.0!=0.0){a=0.0;return +a}c=a<0.0;a=c?-a:a;d=~~+D(+(a*25.0+.5));a=a-+(d|0)*.03999999910593033;b=+g[21196+(d<<2)>>2];a=(c?-1.0:1.0)*(b+a*(1.0-b*b)*(1.0-b*a));return +a}function lh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return mh(a,b,c,b,c,d,e)|0}function mh(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0;if(h>>>0>10){if(!i){i=0;return i|0}c[i>>2]=3;i=0;return i|0}j=nh(96)|0;o=j+52|0;c[o>>2]=0;c[j+56>>2]=0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=-1;c[j+80>>2]=0;c[j+28>>2]=0;c[j+24>>2]=0;c[j+72>>2]=0;c[j+84>>2]=0;g[j+44>>2]=1.0;c[j+20>>2]=a;c[j+88>>2]=1;c[j+92>>2]=1;c[j+32>>2]=160;k=a<<2;l=j+60|0;c[l>>2]=nh(k)|0;m=j+68|0;c[m>>2]=nh(k)|0;n=j+64|0;c[n>>2]=nh(k)|0;k=0;while(1){if((k|0)==(a|0))break;c[(c[l>>2]|0)+(k<<2)>>2]=0;c[(c[m>>2]|0)+(k<<2)>>2]=0;c[(c[n>>2]|0)+(k<<2)>>2]=0;k=k+1|0}oh(j,h);ph(j,b,d,e,f);k=qh(j)|0;if(!k)c[o>>2]=1;else{rh(j);j=0}if(!i){i=j;return i|0}c[i>>2]=k;i=j;return i|0}function nh(a){a=a|0;var b=0;b=Kh(a)|0;if(!b)return b|0;if(!(c[b+-4>>2]&3))return b|0;Qh(b|0,0,a|0)|0;return b|0}function oh(a,b){a=a|0;b=b|0;var d=0;if(b>>>0>10)return;d=a+16|0;if((c[d>>2]|0)==(b|0))return;c[d>>2]=b;if(!(c[a+52>>2]|0))return;qh(a)|0;return}function ph(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=a+4|0;if((((c[a>>2]|0)==(e|0)?(c[g>>2]|0)==(f|0):0)?(c[a+8>>2]|0)==(b|0):0)?(c[a+12>>2]|0)==(d|0):0)return;h=a+12|0;i=c[h>>2]|0;c[a>>2]=e;c[g>>2]=f;g=a+8|0;c[g>>2]=b;c[h>>2]=d;f=2;e=b;while(1){if(f>>>0>(c[(e>>>0<d>>>0?g:h)>>2]|0)>>>0)break;e=c[g>>2]|0;while(1){if((e>>>0)%(f>>>0)|0|0)break;d=c[h>>2]|0;if((d>>>0)%(f>>>0)|0|0)break;b=(e>>>0)/(f>>>0)|0;c[g>>2]=b;d=(d>>>0)/(f>>>0)|0;c[h>>2]=d;e=b}f=f+1|0}a:do if(i|0){e=a+20|0;f=a+64|0;d=0;while(1){if(d>>>0>=(c[e>>2]|0)>>>0)break a;g=(c[f>>2]|0)+(d<<2)|0;c[g>>2]=((R(c[g>>2]|0,c[h>>2]|0)|0)>>>0)/(i>>>0)|0;g=(c[f>>2]|0)+(d<<2)|0;b=c[h>>2]|0;if((c[g>>2]|0)>>>0>=b>>>0)c[g>>2]=b+-1;d=d+1|0}}while(0);if(!(c[a+52>>2]|0))return;qh(a)|0;return}function qh(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0;o=a+24|0;p=c[o>>2]|0;q=a+28|0;n=c[q>>2]|0;f=c[a+8>>2]|0;k=a+12|0;h=c[k>>2]|0;c[a+36>>2]=(f>>>0)/(h>>>0)|0;c[a+40>>2]=(f>>>0)%(h>>>0)|0;m=a+16|0;d=c[m>>2]|0;b=c[23800+(d*20|0)+4>>2]|0;j=a+48|0;c[j>>2]=b;e=c[23800+(d*20|0)>>2]|0;c[o>>2]=e;if(f>>>0>h>>>0){g[a+44>>2]=+g[23800+(d*20|0)+8>>2]*+(h>>>0)/+(f>>>0);e=(((R(e,f)|0)>>>0)/(h>>>0)|0)+7&-8;c[o>>2]=e;if(h<<1>>>0<f>>>0){b=b>>>1;c[j>>2]=b}if(h<<2>>>0<f>>>0){b=b>>>1;c[j>>2]=b}if(h<<3>>>0<f>>>0){b=b>>>1;c[j>>2]=b}if(h<<4>>>0<f>>>0){b=b>>>1;c[j>>2]=b}if(!b){c[j>>2]=1;b=1}}else c[a+44>>2]=c[23800+(d*20|0)+12>>2];d=R(e,h)|0;f=(R(e,b)|0)+8|0;if(d>>>0<=f>>>0?(536870911/(h>>>0)|0)>>>0>=e>>>0:0){i=1;h=16}else h=15;if((h|0)==15?(536870903/(b>>>0)|0)>>>0>=e>>>0:0){d=f;i=0;h=16}do if((h|0)==16){b=a+80|0;if((c[b>>2]|0)>>>0<d>>>0){e=a+76|0;f=th(c[e>>2]|0,d<<2)|0;if(!f)break;c[e>>2]=f;c[b>>2]=d}f=a+44|0;h=a+76|0;do if(i){b=0;while(1){if(b>>>0>=(c[k>>2]|0)>>>0)break;l=+(b>>>0);d=0;while(1){e=c[o>>2]|0;if(d>>>0>=e>>>0)break;r=+uh(+g[f>>2],+(d-((e|0)/2|0)+1|0)-l/+((c[k>>2]|0)>>>0),e,c[23800+((c[m>>2]|0)*20|0)+16>>2]|0);g[(c[h>>2]|0)+((R(b,e)|0)+d<<2)>>2]=r;d=d+1|0}b=b+1|0}b=a+84|0;if((c[m>>2]|0)>8){c[b>>2]=1;break}else{c[b>>2]=2;break}}else{b=-4;while(1){e=c[j>>2]|0;d=c[o>>2]|0;if((b|0)>=((R(e,d)|0)+4|0))break;r=+uh(+g[f>>2],+(b|0)/+(e>>>0)-+(d>>>1>>>0),d,c[23800+((c[m>>2]|0)*20|0)+16>>2]|0);g[(c[h>>2]|0)+(b+4<<2)>>2]=r;b=b+1|0}b=a+84|0;if((c[m>>2]|0)>8){c[b>>2]=3;break}else{c[b>>2]=4;break}}while(0);b=(c[o>>2]|0)+-1+(c[a+32>>2]|0)|0;d=c[q>>2]|0;if(b>>>0>d>>>0){d=c[a+20>>2]|0;if((536870911/(d>>>0)|0)>>>0<b>>>0)break;e=a+72|0;d=th(c[e>>2]|0,(R(d,b)|0)<<2)|0;if(!d)break;c[e>>2]=d;c[q>>2]=b}else b=d;if(!(c[a+56>>2]|0)){f=a+20|0;e=a+72|0;d=0;while(1){if(d>>>0>=(R(c[f>>2]|0,b)|0)>>>0){b=0;break}g[(c[e>>2]|0)+(d<<2)>>2]=0.0;d=d+1|0;b=c[q>>2]|0}return b|0}b=c[o>>2]|0;if(b>>>0<=p>>>0){if(b>>>0>=p>>>0){q=0;return q|0}j=a+20|0;k=a+68|0;e=a+72|0;d=0;while(1){if(d>>>0>=(c[j>>2]|0)>>>0){b=0;break}b=(c[k>>2]|0)+(d<<2)|0;f=c[b>>2]|0;c[b>>2]=(p-(c[o>>2]|0)|0)>>>1;b=0;while(1){h=(c[k>>2]|0)+(d<<2)|0;i=c[h>>2]|0;if(b>>>0>=((c[o>>2]|0)+-1+i+f|0)>>>0)break;a=c[e>>2]|0;n=(R(d,c[q>>2]|0)|0)+b|0;c[a+(n<<2)>>2]=c[a+(n+i<<2)>>2];b=b+1|0}c[h>>2]=i+f;d=d+1|0}return b|0}i=a+68|0;j=p+-1|0;k=a+72|0;m=a+60|0;b=c[a+20>>2]|0;a:while(1){h=b+-1|0;if(!b){b=0;break}b=c[(c[i>>2]|0)+(h<<2)>>2]|0;f=b<<1;d=R(h,n)|0;b=j+b|0;while(1){e=b+-1|0;if(!b){b=0;break}a=c[k>>2]|0;b=(R(h,c[q>>2]|0)|0)+e|0;c[a+(b+(c[(c[i>>2]|0)+(h<<2)>>2]|0)<<2)>>2]=c[a+(d+e<<2)>>2];b=e}while(1){d=(c[i>>2]|0)+(h<<2)|0;if(b>>>0>=(c[d>>2]|0)>>>0)break;g[(c[k>>2]|0)+((R(h,c[q>>2]|0)|0)+b<<2)>>2]=0.0;b=b+1|0}f=p+f|0;c[d>>2]=0;b=c[o>>2]|0;if(f>>>0>=b>>>0){c[(c[i>>2]|0)+(h<<2)>>2]=(f-b|0)>>>1;b=0;while(1){d=c[(c[i>>2]|0)+(h<<2)>>2]|0;if(b>>>0>=((c[o>>2]|0)+-1+d|0)>>>0){b=h;continue a}f=c[k>>2]|0;a=(R(h,c[q>>2]|0)|0)+b|0;c[f+(a<<2)>>2]=c[f+(a+d<<2)>>2];b=b+1|0}}b=f+-1|0;e=f+-2|0;d=0;while(1){if((d|0)==(b|0))break;s=c[k>>2]|0;a=R(h,c[q>>2]|0)|0;c[s+(a+((c[o>>2]|0)+-2-d)<<2)>>2]=c[s+(a+(e-d)<<2)>>2];d=d+1|0}while(1){d=c[o>>2]|0;if(b>>>0>=(d+-1|0)>>>0)break;g[(c[k>>2]|0)+((R(h,c[q>>2]|0)|0)+(d+-2-b)<<2)>>2]=0.0;b=b+1|0}b=(c[m>>2]|0)+(h<<2)|0;c[b>>2]=(c[b>>2]|0)+((d-f|0)>>>1);b=h}return b|0}while(0);c[a+84>>2]=5;c[o>>2]=p;s=1;return s|0}function rh(a){a=a|0;sh(c[a+72>>2]|0);sh(c[a+76>>2]|0);sh(c[a+60>>2]|0);sh(c[a+68>>2]|0);sh(c[a+64>>2]|0);sh(a);return}function sh(a){a=a|0;Lh(a);return}function th(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!a){a=Kh(b)|0;return a|0}if(b>>>0>4294967231){c[6029]=12;a=0;return a|0}o=b>>>0<11?16:b+11&-8;n=a+-8|0;p=a+-4|0;m=c[p>>2]|0;d=m&-8;j=a+(d+-8)|0;h=c[8506]|0;e=m&3;if(!((e|0)!=1&n>>>0>=h>>>0&(d|0)>0))da();f=c[j+4>>2]|0;if(!(f&1))da();do if(!e){if(!(o>>>0<256|d>>>0<(o|4)>>>0)?(d-o|0)>>>0<=c[8622]<<1>>>0:0)return a|0}else{if(d>>>0>=o>>>0){d=d-o|0;if(d>>>0<=15)return a|0;n=n+o|0;c[p>>2]=m&1|o|2;c[n+4>>2]=d|3;p=n+d+4|0;c[p>>2]=c[p>>2]|1;Mh(n,d);return a|0}if((j|0)==(c[8508]|0)){l=(c[8505]|0)+d|0;e=l-o|0;d=n+o|0;if(l>>>0<=o>>>0)break;c[p>>2]=m&1|o|2;c[d+4>>2]=e|1;c[8508]=d;c[8505]=e;return a|0}if((j|0)==(c[8507]|0)){f=(c[8504]|0)+d|0;if(f>>>0<o>>>0)break;d=f-o|0;e=m&1;if(d>>>0>15){n=n+o|0;m=n+d|0;c[p>>2]=e|o|2;c[n+4>>2]=d|1;c[m>>2]=d;e=m+4|0;c[e>>2]=c[e>>2]&-2;e=n}else{c[p>>2]=e|f|2;e=n+f+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[8504]=d;c[8507]=e;return a|0}if((f&2|0)==0?(l=(f&-8)+d|0,l>>>0>=o>>>0):0){k=l-o|0;b=f>>>3;a:do if(f>>>0>=256){g=c[j+24>>2]|0;f=c[j+12>>2]|0;do if((f|0)==(j|0)){f=j+16|0;e=f+4|0;d=c[e>>2]|0;if(!d){d=c[f>>2]|0;if(!d){i=0;break}else e=f}while(1){f=d+20|0;b=c[f>>2]|0;if(b|0){d=b;e=f;continue}f=d+16|0;b=c[f>>2]|0;if(!b)break;else{d=b;e=f}}if(e>>>0<h>>>0)da();else{c[e>>2]=0;i=d;break}}else{b=c[j+8>>2]|0;if(b>>>0<h>>>0)da();d=b+12|0;if((c[d>>2]|0)!=(j|0))da();e=f+8|0;if((c[e>>2]|0)==(j|0)){c[d>>2]=f;c[e>>2]=b;i=f;break}else da()}while(0);if(g|0){d=c[j+28>>2]|0;e=34312+(d<<2)|0;do if((j|0)==(c[e>>2]|0)){c[e>>2]=i;if(!i){c[8503]=c[8503]&~(1<<d);break a}}else if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=i;if(!i)break a;else break}else da();while(0);f=c[8506]|0;if(i>>>0<f>>>0)da();c[i+24>>2]=g;d=j+16|0;e=c[d>>2]|0;do if(e|0)if(e>>>0<f>>>0)da();else{c[i+16>>2]=e;c[e+24>>2]=i;break}while(0);d=c[d+4>>2]|0;if(d|0)if(d>>>0<(c[8506]|0)>>>0)da();else{c[i+20>>2]=d;c[d+24>>2]=i;break}}}else{e=c[j+8>>2]|0;f=c[j+12>>2]|0;d=34048+(b<<1<<2)|0;if((e|0)!=(d|0)){if(e>>>0<h>>>0)da();if((c[e+12>>2]|0)!=(j|0))da()}if((f|0)==(e|0)){c[8502]=c[8502]&~(1<<b);break}if((f|0)!=(d|0)){if(f>>>0<h>>>0)da();d=f+8|0;if((c[d>>2]|0)==(j|0))g=d;else da()}else g=f+8|0;c[e+12>>2]=f;c[g>>2]=e}while(0);d=m&1;if(k>>>0<16){c[p>>2]=l|d|2;p=n+l+4|0;c[p>>2]=c[p>>2]|1;return a|0}else{n=n+o|0;c[p>>2]=d|o|2;c[n+4>>2]=k|3;p=n+k+4|0;c[p>>2]=c[p>>2]|1;Mh(n,k);return a|0}}}while(0);d=Kh(b)|0;if(!d){a=0;return a|0}p=c[p>>2]|0;p=(p&-8)-((p&3|0)==0?8:4)|0;Sh(d|0,a|0,(p>>>0<b>>>0?p:b)|0)|0;Lh(a);a=d;return a|0}function uh(a,b,d,e){a=+a;b=+b;d=d|0;e=e|0;var f=0.0,g=0.0;g=+E(+b);if(g<1.0e-06){g=a;return +g}f=+(d|0);if(g>f*.5){g=0.0;return +g}g=b*a*3.141592653589793;a=a*+I(+g)/g;g=+E(+(b*2.0/f));g=a*+Bh(g,c[e>>2]|0,c[e+4>>2]|0);return +g}function vh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;w=c[a+24>>2]|0;y=a+60|0;x=a+64|0;s=c[a+76>>2]|0;t=c[a+92>>2]|0;u=c[a+36>>2]|0;v=c[a+40>>2]|0;m=c[a+12>>2]|0;p=c[(c[x>>2]|0)+(b<<2)>>2]|0;q=c[(c[y>>2]|0)+(b<<2)>>2]|0;r=0;while(1){if((q|0)>=(c[e>>2]|0)){a=8;break}if((r|0)>=(c[h>>2]|0)){a=8;break}n=s+((R(p,w)|0)<<2)|0;o=d+(q<<2)|0;a=0;i=0.0;j=0.0;k=0.0;l=0.0;while(1){if((a|0)>=(w|0))break;C=i+ +g[n+(a<<2)>>2]*+g[o+(a<<2)>>2];A=a|1;z=a|2;B=a|3;a=a+4|0;i=C;j=j+ +g[n+(B<<2)>>2]*+g[o+(B<<2)>>2];k=k+ +g[n+(A<<2)>>2]*+g[o+(A<<2)>>2];l=l+ +g[n+(z<<2)>>2]*+g[o+(z<<2)>>2]}g[f+((R(t,r)|0)<<2)>>2]=i+k+l+j;A=p+v|0;B=A>>>0<m>>>0;p=A-(B?0:m)|0;q=q+u+((B^1)&1)|0;r=r+1|0}if((a|0)==8){c[(c[y>>2]|0)+(b<<2)>>2]=q;c[(c[x>>2]|0)+(b<<2)>>2]=p;return r|0}return 0}function wh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;t=c[a+24>>2]|0;v=a+60|0;u=a+64|0;p=c[a+76>>2]|0;q=c[a+92>>2]|0;r=c[a+36>>2]|0;s=c[a+40>>2]|0;j=c[a+12>>2]|0;m=c[(c[u>>2]|0)+(b<<2)>>2]|0;n=c[(c[v>>2]|0)+(b<<2)>>2]|0;o=0;while(1){if((n|0)>=(c[e>>2]|0)){a=8;break}if((o|0)>=(c[h>>2]|0)){a=8;break}k=p+((R(m,t)|0)<<2)|0;l=d+(n<<2)|0;a=0;i=0.0;while(1){if((a|0)>=(t|0))break;w=i+ +g[k+(a<<2)>>2]*+g[l+(a<<2)>>2];a=a+1|0;i=w}g[f+((R(q,o)|0)<<2)>>2]=i;k=m+s|0;l=k>>>0<j>>>0;m=k-(l?0:j)|0;n=n+r+((l^1)&1)|0;o=o+1|0}if((a|0)==8){c[(c[v>>2]|0)+(b<<2)>>2]=n;c[(c[u>>2]|0)+(b<<2)>>2]=m;return o|0}return 0}function xh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0;J=l;l=l+16|0;F=J;G=c[a+24>>2]|0;I=a+60|0;H=a+64|0;z=c[a+92>>2]|0;A=c[a+36>>2]|0;B=c[a+40>>2]|0;C=a+12|0;D=c[C>>2]|0;E=a+48|0;n=a+76|0;o=F+4|0;p=F+8|0;q=F+12|0;w=c[(c[H>>2]|0)+(b<<2)>>2]|0;x=c[(c[I>>2]|0)+(b<<2)>>2]|0;y=0;while(1){if((x|0)>=(c[e>>2]|0)){a=8;break}if((y|0)>=(c[h>>2]|0)){a=8;break}r=d+(x<<2)|0;s=c[E>>2]|0;u=R(w,s)|0;a=c[C>>2]|0;t=(u>>>0)/(a>>>0)|0;u=(u>>>0)%(a>>>0)|0;v=+(a>>>0);a=0;i=0.0;j=0.0;k=0.0;m=0.0;while(1){if((a|0)>=(G|0))break;M=+g[r+(a<<2)>>2];L=c[n>>2]|0;N=a+1|0;K=(R(N,s)|0)+4-t|0;a=N;i=i+M*+g[L+(K+-2<<2)>>2];j=j+M*+g[L+(K+1<<2)>>2];k=k+M*+g[L+(K+-1<<2)>>2];m=m+M*+g[L+(K<<2)>>2]}Ah(+(u>>>0)/v,F);g[f+((R(z,y)|0)<<2)>>2]=+g[F>>2]*i+ +g[o>>2]*k+ +g[p>>2]*m+ +g[q>>2]*j;L=w+B|0;N=L>>>0<D>>>0;w=L-(N?0:D)|0;x=x+A+((N^1)&1)|0;y=y+1|0}if((a|0)==8){c[(c[I>>2]|0)+(b<<2)>>2]=x;c[(c[H>>2]|0)+(b<<2)>>2]=w;l=J;return y|0}return 0}function yh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0;J=l;l=l+16|0;F=J;G=c[a+24>>2]|0;I=a+60|0;H=a+64|0;z=c[a+92>>2]|0;A=c[a+36>>2]|0;B=c[a+40>>2]|0;C=a+12|0;D=c[C>>2]|0;E=a+48|0;n=a+76|0;o=F+4|0;p=F+8|0;q=F+12|0;w=c[(c[H>>2]|0)+(b<<2)>>2]|0;x=c[(c[I>>2]|0)+(b<<2)>>2]|0;y=0;while(1){if((x|0)>=(c[e>>2]|0)){a=8;break}if((y|0)>=(c[h>>2]|0)){a=8;break}r=d+(x<<2)|0;s=c[E>>2]|0;u=R(w,s)|0;a=c[C>>2]|0;t=(u>>>0)/(a>>>0)|0;u=(u>>>0)%(a>>>0)|0;v=+(a>>>0);a=0;i=0.0;j=0.0;k=0.0;m=0.0;while(1){if((a|0)>=(G|0))break;M=+g[r+(a<<2)>>2];L=c[n>>2]|0;N=a+1|0;K=(R(N,s)|0)+4-t|0;a=N;i=i+M*+g[L+(K+-2<<2)>>2];j=j+M*+g[L+(K+1<<2)>>2];k=k+M*+g[L+(K+-1<<2)>>2];m=m+M*+g[L+(K<<2)>>2]}Ah(+(u>>>0)/v,F);g[f+((R(z,y)|0)<<2)>>2]=+g[F>>2]*i+ +g[o>>2]*k+ +g[p>>2]*m+ +g[q>>2]*j;L=w+B|0;N=L>>>0<D>>>0;w=L-(N?0:D)|0;x=x+A+((N^1)&1)|0;y=y+1|0}if((a|0)==8){c[(c[I>>2]|0)+(b<<2)>>2]=x;c[(c[H>>2]|0)+(b<<2)>>2]=w;l=J;return y|0}return 0}function zh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=a+60|0;n=a+64|0;k=c[a+92>>2]|0;l=c[a+36>>2]|0;m=c[a+40>>2]|0;d=c[a+12>>2]|0;a=c[(c[n>>2]|0)+(b<<2)>>2]|0;i=c[(c[o>>2]|0)+(b<<2)>>2]|0;j=0;while(1){if((i|0)>=(c[e>>2]|0)){d=5;break}if((j|0)>=(c[h>>2]|0)){d=5;break}g[f+((R(k,j)|0)<<2)>>2]=0.0;q=a+m|0;p=q>>>0<d>>>0;a=q-(p?0:d)|0;i=i+l+((p^1)&1)|0;j=j+1|0}if((d|0)==5){c[(c[o>>2]|0)+(b<<2)>>2]=i;c[(c[n>>2]|0)+(b<<2)>>2]=a;return j|0}return 0}function Ah(a,b){a=+a;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0;e=a*.16666999459266663*a*a;d=a*-.16666999459266663+e;g[b>>2]=d;f=a*.5*a;c=f+a-f*a;g[b+4>>2]=c;a=a*-.3333300054073334+f-e;g[b+12>>2]=a;g[b+8>>2]=1.0-d-c-a;return}function Bh(a,b,c){a=+a;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;d=+(c|0)*a;c=~~+D(+d);d=d-+(c|0);g=d;f=d*d;d=f*d;e=d*.1666666667;a=g*-.1666666667+e;f=f*.5;d=g+f-d*.5;e=g*-.3333333333+f-e;return +(e*+h[b+(c<<3)>>3]+(1.0-a-d-e)*+h[b+(c+1<<3)>>3]+d*+h[b+(c+2<<3)>>3]+a*+h[b+(c+3<<3)>>3])}function Ch(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=l;l=l+16|0;s=v+8|0;t=v+4|0;u=v;c[s>>2]=f;i=c[e>>2]|0;f=c[h>>2]|0;q=c[a+28>>2]|0;o=(c[a+72>>2]|0)+((R(q,b)|0)<<2)|0;p=(c[a+24>>2]|0)+-1|0;q=q-p|0;r=c[a+88>>2]|0;j=a+68|0;if(c[(c[j>>2]|0)+(b<<2)>>2]|0){f=f-(Dh(a,b,s,f)|0)|0;if(c[(c[j>>2]|0)+(b<<2)>>2]|0){t=i;u=f;s=c[e>>2]|0;t=s-t|0;c[e>>2]=t;e=c[h>>2]|0;e=e-u|0;c[h>>2]=e;l=v;return}}n=a+92|0;m=d;a:while(1){k=(m|0)==0;do{if(!((i|0)!=0&(f|0)!=0))break a;j=i>>>0>q>>>0?q:i;c[t>>2]=j;c[u>>2]=f;b:do if(k){d=0;while(1){if(d>>>0>=j>>>0)break b;g[o+(d+p<<2)>>2]=0.0;d=d+1|0;j=c[t>>2]|0}}else{d=0;while(1){if(d>>>0>=j>>>0)break b;c[o+(d+p<<2)>>2]=c[m+((R(d,r)|0)<<2)>>2];d=d+1|0;j=c[t>>2]|0}}while(0);w=c[s>>2]|0;Eh(a,b,t,w,u);j=c[t>>2]|0;i=i-j|0;d=c[u>>2]|0;f=f-d|0;c[s>>2]=w+((R(d,c[n>>2]|0)|0)<<2)}while(k);m=m+((R(j,r)|0)<<2)|0}w=c[e>>2]|0;w=w-i|0;c[e>>2]=w;w=c[h>>2]|0;w=w-f|0;c[h>>2]=w;l=v;return}function Dh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;k=n+4|0;m=n;c[k>>2]=e;j=a+68|0;c[m>>2]=c[(c[j>>2]|0)+(b<<2)>>2];i=(c[a+72>>2]|0)+((R(c[a+28>>2]|0,b)|0)<<2)|0;e=c[a+24>>2]|0;Eh(a,b,m,c[d>>2]|0,k);g=(c[j>>2]|0)+(b<<2)|0;c[g>>2]=(c[g>>2]|0)-(c[m>>2]|0);g=c[(c[j>>2]|0)+(b<<2)>>2]|0;if(!g){m=c[k>>2]|0;k=a+92|0;k=c[k>>2]|0;k=R(m,k)|0;b=c[d>>2]|0;k=b+(k<<2)|0;c[d>>2]=k;l=n;return m|0}h=e+-1|0;f=0;e=g;while(1){if(f>>>0>=e>>>0)break;e=h+f|0;c[i+(e<<2)>>2]=c[i+(e+(c[m>>2]|0)<<2)>>2];f=f+1|0;e=c[(c[j>>2]|0)+(b<<2)>>2]|0}m=c[k>>2]|0;k=a+92|0;k=c[k>>2]|0;k=R(m,k)|0;b=c[d>>2]|0;k=b+(k<<2)|0;c[d>>2]=k;l=n;return m|0}function Eh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=c[a+24>>2]|0;i=(c[a+72>>2]|0)+((R(c[a+28>>2]|0,b)|0)<<2)|0;c[a+56>>2]=1;g=ja[c[a+84>>2]&7](a,b,i,d,e,f)|0;e=a+60|0;a=c[(c[e>>2]|0)+(b<<2)>>2]|0;if((a|0)<(c[d>>2]|0))c[d>>2]=a;c[f>>2]=g;g=(c[e>>2]|0)+(b<<2)|0;c[g>>2]=(c[g>>2]|0)-(c[d>>2]|0);g=c[d>>2]|0;a=h+-1|0;e=0;while(1){if((e|0)>=(a|0))break;c[i+(e<<2)>>2]=c[i+(e+g<<2)>>2];e=e+1|0}return}function Fh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=c[f>>2]|0;m=c[d>>2]|0;n=a+88|0;o=c[n>>2]|0;p=a+92|0;h=c[p>>2]|0;i=a+20|0;k=c[i>>2]|0;c[p>>2]=k;c[n>>2]=k;j=(b|0)==0;g=0;while(1){if(g>>>0>=k>>>0)break;c[f>>2]=l;c[d>>2]=m;if(j)Ch(a,g,0,d,e+(g<<2)|0,f);else Ch(a,g,b+(g<<2)|0,d,e+(g<<2)|0,f);g=g+1|0;k=c[i>>2]|0}c[n>>2]=o;c[p>>2]=h;return (c[a+84>>2]|0)==5|0}function Gh(){return 33944}function Hh(a){a=+a;var b=0;b=(g[j>>2]=a,c[j>>2]|0);if((b&2130706432)>>>0<=1249902592){b=(b|0)<0;a=(b?8388608.0:-8388608.0)+((b?-8388608.0:8388608.0)+a);if(a==0.0)a=b?-0.0:0.0}return +a}function Ih(a){a=+a;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,k=0.0,l=0.0,m=0.0;h[j>>3]=a;b=c[j>>2]|0;d=c[j+4>>2]|0;e=(d|0)<0;do if(e|d>>>0<1048576){if((b|0)==0&(d&2147483647|0)==0){a=-1.0/(a*a);break}if(e){a=(a-a)/0.0;break}else{h[j>>3]=a*18014398509481984.0;d=c[j+4>>2]|0;e=-1077;b=c[j>>2]|0;f=9;break}}else if(d>>>0<=2146435071)if((b|0)==0&0==0&(d|0)==1072693248)a=0.0;else{e=-1023;f=9}while(0);if((f|0)==9){f=d+614242|0;c[j>>2]=b;c[j+4>>2]=(f&1048575)+1072079006;k=+h[j>>3]+-1.0;i=k*(k*.5);l=k/(k+2.0);m=l*l;a=m*m;h[j>>3]=k-i;d=c[j+4>>2]|0;c[j>>2]=0;c[j+4>>2]=d;g=+h[j>>3];a=k-g-i+l*(i+(a*(a*(a*.15313837699209373+.22222198432149784)+.3999999999940942)+m*(a*(a*(a*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));m=g*.4342944818781689;i=+(e+(f>>>20)|0);l=i*.30102999566361177;k=l+m;a=k+(m+(l-k)+(a*.4342944818781689+(i*3.694239077158931e-13+(g+a)*2.5082946711645275e-11)))}return +a}function Jh(a){a=+a;return ~~+Hh(a)|0}function Kh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+16|0;o=K;do if(a>>>0<245){p=a>>>0<11?16:a+11&-8;a=p>>>3;t=c[8502]|0;d=t>>>a;if(d&3|0){a=(d&1^1)+a|0;d=34048+(a<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[8506]|0)>>>0)da();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else da()}else c[8502]=t&~(1<<a);while(0);J=a<<3;c[f+4>>2]=J|3;J=f+J+4|0;c[J>>2]=c[J>>2]|1;J=g;l=K;return J|0}s=c[8504]|0;if(p>>>0>s>>>0){if(d|0){i=2<<a;a=d<<a&(i|0-i);a=(a&0-a)+-1|0;i=a>>>12&16;a=a>>>i;e=a>>>5&8;a=a>>>e;g=a>>>2&4;a=a>>>g;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=(e|i|g|d|b)+(a>>>b)|0;a=34048+(b<<1<<2)|0;d=a+8|0;g=c[d>>2]|0;i=g+8|0;e=c[i>>2]|0;do if((a|0)!=(e|0)){if(e>>>0<(c[8506]|0)>>>0)da();f=e+12|0;if((c[f>>2]|0)==(g|0)){c[f>>2]=a;c[d>>2]=e;j=t;break}else da()}else{j=t&~(1<<b);c[8502]=j}while(0);h=(b<<3)-p|0;c[g+4>>2]=p|3;e=g+p|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(s|0){f=c[8507]|0;b=s>>>3;d=34048+(b<<1<<2)|0;b=1<<b;if(j&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[8506]|0)>>>0)da();else{k=a;m=b}}else{c[8502]=j|b;k=d;m=d+8|0}c[m>>2]=f;c[k+12>>2]=f;c[f+8>>2]=k;c[f+12>>2]=d}c[8504]=h;c[8507]=e;J=i;l=K;return J|0}k=c[8503]|0;if(k){a=(k&0-k)+-1|0;I=a>>>12&16;a=a>>>I;H=a>>>5&8;a=a>>>H;J=a>>>2&4;a=a>>>J;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=c[34312+((H|I|J|d|b)+(a>>>b)<<2)>>2]|0;a=(c[b+4>>2]&-8)-p|0;d=c[b+16+(((c[b+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=b;h=a}else{do{I=(c[d+4>>2]&-8)-p|0;J=I>>>0<a>>>0;a=J?I:a;b=J?d:b;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=b;h=a}f=c[8506]|0;if(j>>>0<f>>>0)da();i=j+p|0;if(j>>>0>=i>>>0)da();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)da();else{c[a>>2]=0;n=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)da();b=e+12|0;if((c[b>>2]|0)!=(j|0))da();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;n=d;break}else da()}while(0);a:do if(g|0){b=c[j+28>>2]|0;a=34312+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[8503]=k&~(1<<b);break a}}else if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=n;if(!n)break a;else break}else da();while(0);a=c[8506]|0;if(n>>>0<a>>>0)da();c[n+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)da();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[j+20>>2]|0;if(b|0)if(b>>>0<(c[8506]|0)>>>0)da();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(h>>>0<16){J=h+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}else{c[j+4>>2]=p|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(s|0){e=c[8507]|0;b=s>>>3;d=34048+(b<<1<<2)|0;b=1<<b;if(t&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[8506]|0)>>>0)da();else{q=a;r=b}}else{c[8502]=t|b;q=d;r=d+8|0}c[r>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[8504]=h;c[8507]=i}J=j+8|0;l=K;return J|0}}}else if(a>>>0<=4294967231){a=a+11|0;p=a&-8;k=c[8503]|0;if(k){e=0-p|0;a=a>>>8;if(a)if(p>>>0>16777215)i=31;else{r=(a+1048320|0)>>>16&8;C=a<<r;q=(C+520192|0)>>>16&4;C=C<<q;i=(C+245760|0)>>>16&2;i=14-(q|r|i)+(C<<i>>>15)|0;i=p>>>(i+7|0)&1|i<<1}else i=0;d=c[34312+(i<<2)>>2]|0;b:do if(!d){d=0;a=0;C=81}else{a=0;h=p<<((i|0)==31?0:25-(i>>>1)|0);g=0;while(1){f=(c[d+4>>2]&-8)-p|0;if(f>>>0<e>>>0)if(!f){a=d;e=0;f=d;C=85;break b}else{a=d;e=f}f=c[d+20>>2]|0;d=c[d+16+(h>>>31<<2)>>2]|0;g=(f|0)==0|(f|0)==(d|0)?g:f;f=(d|0)==0;if(f){d=g;C=81;break}else h=h<<((f^1)&1)}}while(0);if((C|0)==81){if((d|0)==0&(a|0)==0){a=2<<i;a=k&(a|0-a);if(!a)break;r=(a&0-a)+-1|0;m=r>>>12&16;r=r>>>m;j=r>>>5&8;r=r>>>j;n=r>>>2&4;r=r>>>n;q=r>>>1&2;r=r>>>q;d=r>>>1&1;a=0;d=c[34312+((j|m|n|q|d)+(r>>>d)<<2)>>2]|0}if(!d){j=a;i=e}else{f=d;C=85}}if((C|0)==85)while(1){C=0;d=(c[f+4>>2]&-8)-p|0;r=d>>>0<e>>>0;d=r?d:e;a=r?f:a;f=c[f+16+(((c[f+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){j=a;i=d;break}else{e=d;C=85}}if((j|0)!=0?i>>>0<((c[8504]|0)-p|0)>>>0:0){f=c[8506]|0;if(j>>>0<f>>>0)da();h=j+p|0;if(j>>>0>=h>>>0)da();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){s=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)da();else{c[a>>2]=0;s=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)da();b=e+12|0;if((c[b>>2]|0)!=(j|0))da();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;s=d;break}else da()}while(0);c:do if(g){b=c[j+28>>2]|0;a=34312+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=s;if(!s){t=k&~(1<<b);c[8503]=t;break c}}else if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=s;if(!s){t=k;break c}else break}else da();while(0);a=c[8506]|0;if(s>>>0<a>>>0)da();c[s+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)da();else{c[s+16>>2]=b;c[b+24>>2]=s;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[8506]|0)>>>0)da();else{c[s+20>>2]=b;c[b+24>>2]=s;t=k;break}else t=k}else t=k;while(0);do if(i>>>0>=16){c[j+4>>2]=p|3;c[h+4>>2]=i|1;c[h+i>>2]=i;b=i>>>3;if(i>>>0<256){d=34048+(b<<1<<2)|0;a=c[8502]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[8506]|0)>>>0)da();else{x=a;y=b}}else{c[8502]=a|b;x=d;y=d+8|0}c[y>>2]=h;c[x+12>>2]=h;c[h+8>>2]=x;c[h+12>>2]=d;break}b=i>>>8;if(b)if(i>>>0>16777215)b=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=i>>>(b+7|0)&1|b<<1}else b=0;d=34312+(b<<2)|0;c[h+28>>2]=b;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<b;if(!(t&a)){c[8503]=t|a;c[d>>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}a=i<<((b|0)==31?0:25-(b>>>1)|0);e=c[d>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){C=139;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=136;break}else{a=a<<1;e=b}}if((C|0)==136)if(d>>>0<(c[8506]|0)>>>0)da();else{c[d>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((C|0)==139){b=e+8|0;a=c[b>>2]|0;J=c[8506]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=e;c[h+24>>2]=0;break}else da()}}else{J=i+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}while(0);J=j+8|0;l=K;return J|0}}}else p=-1;while(0);d=c[8504]|0;if(d>>>0>=p>>>0){b=d-p|0;a=c[8507]|0;if(b>>>0>15){J=a+p|0;c[8507]=J;c[8504]=b;c[J+4>>2]=b|1;c[J+b>>2]=b;c[a+4>>2]=p|3}else{c[8504]=0;c[8507]=0;c[a+4>>2]=d|3;J=a+d+4|0;c[J>>2]=c[J>>2]|1}J=a+8|0;l=K;return J|0}h=c[8505]|0;if(h>>>0>p>>>0){H=h-p|0;c[8505]=H;J=c[8508]|0;I=J+p|0;c[8508]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}if(!(c[8620]|0)){c[8622]=4096;c[8621]=4096;c[8623]=-1;c[8624]=-1;c[8625]=0;c[8613]=0;a=o&-16^1431655768;c[o>>2]=a;c[8620]=a;a=4096}else a=c[8622]|0;i=p+48|0;j=p+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=p>>>0){J=0;l=K;return J|0}a=c[8612]|0;if(a|0?(x=c[8610]|0,y=x+k|0,y>>>0<=x>>>0|y>>>0>a>>>0):0){J=0;l=K;return J|0}d:do if(!(c[8613]&4)){d=c[8508]|0;e:do if(d){e=34456;while(1){a=c[e>>2]|0;if(a>>>0<=d>>>0?(w=e+4|0,(a+(c[w>>2]|0)|0)>>>0>d>>>0):0)break;a=c[e+8>>2]|0;if(!a){C=163;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=Vh(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[w>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;C=180;break d}}else{e=a;C=171}}else b=0}else C=163;while(0);do if((C|0)==163){d=Vh(0)|0;if((d|0)!=(-1|0)?(b=d,u=c[8621]|0,v=u+-1|0,b=((v&b|0)==0?0:(v+b&0-u)-b|0)+k|0,u=c[8610]|0,v=b+u|0,b>>>0>p>>>0&b>>>0<2147483647):0){y=c[8612]|0;if(y|0?v>>>0<=u>>>0|v>>>0>y>>>0:0){b=0;break}a=Vh(b|0)|0;if((a|0)==(d|0)){h=b;g=d;C=180;break d}else{e=a;C=171}}else b=0}while(0);do if((C|0)==171){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;C=180;break d}a=c[8622]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;C=180;break d}if((Vh(a|0)|0)==(-1|0)){Vh(d|0)|0;b=0;break}else{h=a+b|0;g=e;C=180;break d}}while(0);c[8613]=c[8613]|4;C=178}else{b=0;C=178}while(0);if(((C|0)==178?k>>>0<2147483647:0)?(B=Vh(k|0)|0,y=Vh(0)|0,z=y-B|0,A=z>>>0>(p+40|0)>>>0,!((B|0)==(-1|0)|A^1|B>>>0<y>>>0&((B|0)!=(-1|0)&(y|0)!=(-1|0))^1)):0){h=A?z:b;g=B;C=180}if((C|0)==180){b=(c[8610]|0)+h|0;c[8610]=b;if(b>>>0>(c[8611]|0)>>>0)c[8611]=b;k=c[8508]|0;do if(k){b=34456;while(1){a=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;if((g|0)==(a+e|0)){C=190;break}f=c[b+8>>2]|0;if(!f)break;else b=f}if(((C|0)==190?(c[b+12>>2]&8|0)==0:0)?k>>>0<g>>>0&k>>>0>=a>>>0:0){c[d>>2]=e+h;J=k+8|0;J=(J&7|0)==0?0:0-J&7;I=k+J|0;J=(c[8505]|0)+(h-J)|0;c[8508]=I;c[8505]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[8509]=c[8624];break}b=c[8506]|0;if(g>>>0<b>>>0){c[8506]=g;i=g}else i=b;d=g+h|0;b=34456;while(1){if((c[b>>2]|0)==(d|0)){C=198;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((C|0)==198?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;n=b+4|0;c[n>>2]=(c[n>>2]|0)+h;n=g+8|0;n=g+((n&7|0)==0?0:0-n&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;m=n+p|0;j=b-n-p|0;c[n+4>>2]=p|3;do if((b|0)!=(k|0)){if((b|0)==(c[8507]|0)){J=(c[8504]|0)+j|0;c[8504]=J;c[8507]=m;c[m+4>>2]=J|1;c[m+J>>2]=J;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;f=a>>>3;f:do if(a>>>0>=256){g=c[b+24>>2]|0;e=c[b+12>>2]|0;do if((e|0)==(b|0)){e=b+16|0;d=e+4|0;a=c[d>>2]|0;if(!a){a=c[e>>2]|0;if(!a){H=0;break}else d=e}while(1){e=a+20|0;f=c[e>>2]|0;if(f|0){a=f;d=e;continue}e=a+16|0;f=c[e>>2]|0;if(!f)break;else{a=f;d=e}}if(d>>>0<i>>>0)da();else{c[d>>2]=0;H=a;break}}else{f=c[b+8>>2]|0;if(f>>>0<i>>>0)da();a=f+12|0;if((c[a>>2]|0)!=(b|0))da();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;H=e;break}else da()}while(0);if(!g)break;a=c[b+28>>2]|0;d=34312+(a<<2)|0;do if((b|0)!=(c[d>>2]|0))if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(b|0)&1)<<2)>>2]=H;if(!H)break f;else break}else da();else{c[d>>2]=H;if(H|0)break;c[8503]=c[8503]&~(1<<a);break f}while(0);e=c[8506]|0;if(H>>>0<e>>>0)da();c[H+24>>2]=g;a=b+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<e>>>0)da();else{c[H+16>>2]=d;c[d+24>>2]=H;break}while(0);a=c[a+4>>2]|0;if(!a)break;if(a>>>0<(c[8506]|0)>>>0)da();else{c[H+20>>2]=a;c[a+24>>2]=H;break}}else{d=c[b+8>>2]|0;e=c[b+12>>2]|0;a=34048+(f<<1<<2)|0;do if((d|0)!=(a|0)){if(d>>>0<i>>>0)da();if((c[d+12>>2]|0)==(b|0))break;da()}while(0);if((e|0)==(d|0)){c[8502]=c[8502]&~(1<<f);break}do if((e|0)==(a|0))E=e+8|0;else{if(e>>>0<i>>>0)da();a=e+8|0;if((c[a>>2]|0)==(b|0)){E=a;break}da()}while(0);c[d+12>>2]=e;c[E>>2]=d}while(0);b=b+h|0;f=h+j|0}else f=j;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[m+4>>2]=f|1;c[m+f>>2]=f;b=f>>>3;if(f>>>0<256){d=34048+(b<<1<<2)|0;a=c[8502]|0;b=1<<b;do if(!(a&b)){c[8502]=a|b;I=d;J=d+8|0}else{b=d+8|0;a=c[b>>2]|0;if(a>>>0>=(c[8506]|0)>>>0){I=a;J=b;break}da()}while(0);c[J>>2]=m;c[I+12>>2]=m;c[m+8>>2]=I;c[m+12>>2]=d;break}b=f>>>8;do if(!b)b=0;else{if(f>>>0>16777215){b=31;break}I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=f>>>(b+7|0)&1|b<<1}while(0);e=34312+(b<<2)|0;c[m+28>>2]=b;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[8503]|0;d=1<<b;if(!(a&d)){c[8503]=a|d;c[e>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}a=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){C=265;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=262;break}else{a=a<<1;e=b}}if((C|0)==262)if(d>>>0<(c[8506]|0)>>>0)da();else{c[d>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}else if((C|0)==265){b=e+8|0;a=c[b>>2]|0;J=c[8506]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=m;c[b>>2]=m;c[m+8>>2]=a;c[m+12>>2]=e;c[m+24>>2]=0;break}else da()}}else{J=(c[8505]|0)+j|0;c[8505]=J;c[8508]=m;c[m+4>>2]=J|1}while(0);J=n+8|0;l=K;return J|0}b=34456;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(D=a+(c[b+4>>2]|0)|0,D>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=D+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=k+16|0;a=a>>>0<f>>>0?k:a;b=a+8|0;d=g+8|0;d=(d&7|0)==0?0:0-d&7;J=g+d|0;d=h+-40-d|0;c[8508]=J;c[8505]=d;c[J+4>>2]=d|1;c[J+d+4>>2]=40;c[8509]=c[8624];d=a+4|0;c[d>>2]=27;c[b>>2]=c[8614];c[b+4>>2]=c[8615];c[b+8>>2]=c[8616];c[b+12>>2]=c[8617];c[8614]=g;c[8615]=h;c[8617]=0;c[8616]=b;b=a+24|0;do{J=b;b=b+4|0;c[b>>2]=7}while((J+8|0)>>>0<D>>>0);if((a|0)!=(k|0)){g=a-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=34048+(b<<1<<2)|0;a=c[8502]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[8506]|0)>>>0)da();else{F=a;G=b}}else{c[8502]=a|b;F=d;G=d+8|0}c[G>>2]=k;c[F+12>>2]=k;c[k+8>>2]=F;c[k+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)d=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;d=(J+245760|0)>>>16&2;d=14-(H|I|d)+(J<<d>>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=34312+(d<<2)|0;c[k+28>>2]=d;c[k+20>>2]=0;c[f>>2]=0;b=c[8503]|0;a=1<<d;if(!(b&a)){c[8503]=b|a;c[e>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}a=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){C=292;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=289;break}else{a=a<<1;e=b}}if((C|0)==289)if(d>>>0<(c[8506]|0)>>>0)da();else{c[d>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((C|0)==292){b=e+8|0;a=c[b>>2]|0;J=c[8506]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=k;c[b>>2]=k;c[k+8>>2]=a;c[k+12>>2]=e;c[k+24>>2]=0;break}else da()}}}else{J=c[8506]|0;if((J|0)==0|g>>>0<J>>>0)c[8506]=g;c[8614]=g;c[8615]=h;c[8617]=0;c[8511]=c[8620];c[8510]=-1;b=0;do{J=34048+(b<<1<<2)|0;c[J+12>>2]=J;c[J+8>>2]=J;b=b+1|0}while((b|0)!=32);J=g+8|0;J=(J&7|0)==0?0:0-J&7;I=g+J|0;J=h+-40-J|0;c[8508]=I;c[8505]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[8509]=c[8624]}while(0);b=c[8505]|0;if(b>>>0>p>>>0){H=b-p|0;c[8505]=H;J=c[8508]|0;I=J+p|0;c[8508]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}}c[6029]=12;J=0;l=K;return J|0}function Lh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!a)return;d=a+-8|0;h=c[8506]|0;if(d>>>0<h>>>0)da();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)da();e=a&-8;o=d+e|0;a:do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0<h>>>0)da();if((k|0)==(c[8507]|0)){a=o+4|0;b=c[a>>2]|0;if((b&3|0)!=3){r=k;f=j;m=k;break}c[8504]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=34048+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<h>>>0)da();if((c[b+12>>2]|0)!=(k|0))da()}if((d|0)==(b|0)){c[8502]=c[8502]&~(1<<e);r=k;f=j;m=k;break}if((d|0)!=(a|0)){if(d>>>0<h>>>0)da();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else da()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;r=k;f=j;m=k;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<h>>>0)da();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0<h>>>0)da();a=e+12|0;if((c[a>>2]|0)!=(k|0))da();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else da()}while(0);if(g){a=c[k+28>>2]|0;b=34312+(a<<2)|0;do if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[8503]=c[8503]&~(1<<a);r=k;f=j;m=k;break a}}else if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(k|0)&1)<<2)>>2]=i;if(!i){r=k;f=j;m=k;break a}else break}else da();while(0);d=c[8506]|0;if(i>>>0<d>>>0)da();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)da();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[8506]|0)>>>0)da();else{c[i+20>>2]=a;c[a+24>>2]=i;r=k;f=j;m=k;break}else{r=k;f=j;m=k}}else{r=k;f=j;m=k}}else{r=d;f=e;m=d}while(0);if(m>>>0>=o>>>0)da();a=o+4|0;b=c[a>>2]|0;if(!(b&1))da();if(!(b&2)){a=c[8507]|0;if((o|0)==(c[8508]|0)){q=(c[8505]|0)+f|0;c[8505]=q;c[8508]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[8507]=0;c[8504]=0;return}if((o|0)==(a|0)){q=(c[8504]|0)+f|0;c[8504]=q;c[8507]=m;c[r+4>>2]=q|1;c[m+q>>2]=q;return}f=(b&-8)+f|0;e=b>>>3;b:do if(b>>>0>=256){g=c[o+24>>2]|0;a=c[o+12>>2]|0;do if((a|0)==(o|0)){d=o+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[8506]|0)>>>0)da();else{c[b>>2]=0;n=a;break}}else{b=c[o+8>>2]|0;if(b>>>0<(c[8506]|0)>>>0)da();d=b+12|0;if((c[d>>2]|0)!=(o|0))da();e=a+8|0;if((c[e>>2]|0)==(o|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else da()}while(0);if(g|0){a=c[o+28>>2]|0;b=34312+(a<<2)|0;do if((o|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[8503]=c[8503]&~(1<<a);break b}}else if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else da();while(0);d=c[8506]|0;if(n>>>0<d>>>0)da();c[n+24>>2]=g;a=o+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)da();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[8506]|0)>>>0)da();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[o+8>>2]|0;d=c[o+12>>2]|0;a=34048+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[8506]|0)>>>0)da();if((c[b+12>>2]|0)!=(o|0))da()}if((d|0)==(b|0)){c[8502]=c[8502]&~(1<<e);break}if((d|0)!=(a|0)){if(d>>>0<(c[8506]|0)>>>0)da();a=d+8|0;if((c[a>>2]|0)==(o|0))l=a;else da()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[r+4>>2]=f|1;c[m+f>>2]=f;if((r|0)==(c[8507]|0)){c[8504]=f;return}}else{c[a>>2]=b&-2;c[r+4>>2]=f|1;c[m+f>>2]=f}a=f>>>3;if(f>>>0<256){d=34048+(a<<1<<2)|0;b=c[8502]|0;a=1<<a;if(b&a){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[8506]|0)>>>0)da();else{p=b;q=a}}else{c[8502]=b|a;p=d;q=d+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=34312+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;b=c[8503]|0;d=1<<a;do if(b&d){b=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=124;break}d=e+16+(b>>>31<<2)|0;a=c[d>>2]|0;if(!a){a=121;break}else{b=b<<1;e=a}}if((a|0)==121)if(d>>>0<(c[8506]|0)>>>0)da();else{c[d>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;break}else if((a|0)==124){a=e+8|0;b=c[a>>2]|0;q=c[8506]|0;if(b>>>0>=q>>>0&e>>>0>=q>>>0){c[b+12>>2]=r;c[a>>2]=r;c[r+8>>2]=b;c[r+12>>2]=e;c[r+24>>2]=0;break}else da()}}else{c[8503]=b|d;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r}while(0);r=(c[8510]|0)+-1|0;c[8510]=r;if(!r)a=34464;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[8510]=-1;return}function Mh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;a:do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[8506]|0;if(l>>>0<i>>>0)da();if((l|0)==(c[8507]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[8504]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){d=c[l+8>>2]|0;b=c[l+12>>2]|0;a=34048+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<i>>>0)da();if((c[d+12>>2]|0)!=(l|0))da()}if((b|0)==(d|0)){c[8502]=c[8502]&~(1<<e);r=l;f=k;break}if((b|0)!=(a|0)){if(b>>>0<i>>>0)da();a=b+8|0;if((c[a>>2]|0)==(l|0))h=a;else da()}else h=b+8|0;c[d+12>>2]=b;c[h>>2]=d;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){j=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<i>>>0)da();else{c[d>>2]=0;j=a;break}}else{e=c[l+8>>2]|0;if(e>>>0<i>>>0)da();a=e+12|0;if((c[a>>2]|0)!=(l|0))da();d=b+8|0;if((c[d>>2]|0)==(l|0)){c[a>>2]=b;c[d>>2]=e;j=b;break}else da()}while(0);if(g){a=c[l+28>>2]|0;d=34312+(a<<2)|0;do if((l|0)==(c[d>>2]|0)){c[d>>2]=j;if(!j){c[8503]=c[8503]&~(1<<a);r=l;f=k;break a}}else if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(l|0)&1)<<2)>>2]=j;if(!j){r=l;f=k;break a}else break}else da();while(0);b=c[8506]|0;if(j>>>0<b>>>0)da();c[j+24>>2]=g;a=l+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)da();else{c[j+16>>2]=d;c[d+24>>2]=j;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[8506]|0)>>>0)da();else{c[j+20>>2]=a;c[a+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[8506]|0;if(o>>>0<h>>>0)da();a=o+4|0;d=c[a>>2]|0;if(!(d&2)){a=c[8507]|0;if((o|0)==(c[8508]|0)){q=(c[8505]|0)+f|0;c[8505]=q;c[8508]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[8507]=0;c[8504]=0;return}if((o|0)==(a|0)){q=(c[8504]|0)+f|0;c[8504]=q;c[8507]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(d&-8)+f|0;e=d>>>3;b:do if(d>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){n=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<h>>>0)da();else{c[d>>2]=0;n=a;break}}else{e=c[o+8>>2]|0;if(e>>>0<h>>>0)da();a=e+12|0;if((c[a>>2]|0)!=(o|0))da();d=b+8|0;if((c[d>>2]|0)==(o|0)){c[a>>2]=b;c[d>>2]=e;n=b;break}else da()}while(0);if(g|0){a=c[o+28>>2]|0;d=34312+(a<<2)|0;do if((o|0)==(c[d>>2]|0)){c[d>>2]=n;if(!n){c[8503]=c[8503]&~(1<<a);break b}}else if(g>>>0>=(c[8506]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else da();while(0);b=c[8506]|0;if(n>>>0<b>>>0)da();c[n+24>>2]=g;a=o+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)da();else{c[n+16>>2]=d;c[d+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[8506]|0)>>>0)da();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{d=c[o+8>>2]|0;b=c[o+12>>2]|0;a=34048+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<h>>>0)da();if((c[d+12>>2]|0)!=(o|0))da()}if((b|0)==(d|0)){c[8502]=c[8502]&~(1<<e);break}if((b|0)!=(a|0)){if(b>>>0<h>>>0)da();a=b+8|0;if((c[a>>2]|0)==(o|0))m=a;else da()}else m=b+8|0;c[d+12>>2]=b;c[m>>2]=d}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[8507]|0)){c[8504]=f;return}}else{c[a>>2]=d&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}a=f>>>3;if(f>>>0<256){b=34048+(a<<1<<2)|0;d=c[8502]|0;a=1<<a;if(d&a){a=b+8|0;d=c[a>>2]|0;if(d>>>0<(c[8506]|0)>>>0)da();else{p=d;q=a}}else{c[8502]=d|a;p=b;q=b+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=b;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=34312+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;d=c[8503]|0;b=1<<a;if(!(d&b)){c[8503]=d|b;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}d=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=121;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=118;break}else{d=d<<1;e=a}}if((a|0)==118){if(b>>>0<(c[8506]|0)>>>0)da();c[b>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((a|0)==121){a=e+8|0;d=c[a>>2]|0;q=c[8506]|0;if(!(d>>>0>=q>>>0&e>>>0>=q>>>0))da();c[d+12>>2]=r;c[a>>2]=r;c[r+8>>2]=d;c[r+12>>2]=e;c[r+24>>2]=0;return}}function Nh(){}function Oh(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}C=(b|0)<0?-1:0;return b>>c-32|0}function Ph(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (C=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function Qh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function Rh(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}C=0;return b>>>c-32|0}function Sh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return ga(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function Th(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=R(e,f)|0;d=a>>>16;a=(c>>>16)+(R(e,d)|0)|0;e=b>>>16;b=R(e,f)|0;return (C=(a>>>16)+(R(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function Uh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=Th(e,f)|0;a=C;return (C=(R(b,f)|0)+(R(d,e)|0)+a|a&0,c|0|0)|0}function Vh(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){Z()|0;ea(12);return -1}c[i>>2]=a;if((a|0)>(Y()|0)?(X()|0)==0:0){ea(12);c[i>>2]=b;return -1}return b|0}function Wh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Sh(b,c,d)|0;return b|0}function Xh(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return ja[a&7](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Yh(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;ka[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function Zh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;V(0);return 0}function _h(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;V(1)}\n\n// EMSCRIPTEN_END_FUNCS\nvar ja=[Zh,vh,wh,xh,yh,zh,Zh,Zh];var ka=[_h,zg];return{___muldsi3:Th,_sbrk:Vh,_speex_resampler_destroy:rh,_free:Lh,_memset:Qh,_opus_encode_float:Wg,_speex_resampler_init:lh,_memmove:Wh,_bitshift64Ashr:Oh,_opus_encoder_create:wg,_speex_resampler_process_interleaved_float:Fh,_malloc:Kh,_i64Add:Ph,_emscripten_get_global_libc:Gh,_memcpy:Sh,___muldi3:Uh,_bitshift64Lshr:Rh,_opus_encoder_ctl:Xg,runPostSets:Nh,stackAlloc:la,stackSave:ma,stackRestore:na,establishStackSpace:oa,setTempRet0:qa,getTempRet0:ra,setThrew:pa,stackAlloc:la,stackSave:ma,stackRestore:na,establishStackSpace:oa,setThrew:pa,setTempRet0:qa,getTempRet0:ra,dynCall_iiiiiii:Xh,dynCall_viiiiiii:Yh}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _speex_resampler_destroy=Module[\"_speex_resampler_destroy\"]=asm[\"_speex_resampler_destroy\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Ashr=Module[\"_bitshift64Ashr\"]=asm[\"_bitshift64Ashr\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var _speex_resampler_init=Module[\"_speex_resampler_init\"]=asm[\"_speex_resampler_init\"];var _emscripten_get_global_libc=Module[\"_emscripten_get_global_libc\"]=asm[\"_emscripten_get_global_libc\"];var _opus_encoder_ctl=Module[\"_opus_encoder_ctl\"]=asm[\"_opus_encoder_ctl\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var ___muldsi3=Module[\"___muldsi3\"]=asm[\"___muldsi3\"];var _free=Module[\"_free\"]=asm[\"_free\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var _opus_encode_float=Module[\"_opus_encode_float\"]=asm[\"_opus_encode_float\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var _speex_resampler_process_interleaved_float=Module[\"_speex_resampler_process_interleaved_float\"]=asm[\"_speex_resampler_process_interleaved_float\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _opus_encoder_create=Module[\"_opus_encoder_create\"]=asm[\"_opus_encoder_create\"];var dynCall_iiiiiii=Module[\"dynCall_iiiiiii\"]=asm[\"dynCall_iiiiiii\"];var dynCall_viiiiiii=Module[\"dynCall_viiiiiii\"]=asm[\"dynCall_viiiiiii\"];Runtime.stackAlloc=Module[\"stackAlloc\"];Runtime.stackSave=Module[\"stackSave\"];Runtime.stackRestore=Module[\"stackRestore\"];Runtime.establishStackSpace=Module[\"establishStackSpace\"];Runtime.setTempRet0=Module[\"setTempRet0\"];Runtime.getTempRet0=Module[\"getTempRet0\"];Module[\"asm\"]=asm;function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);try{var ret=Module[\"_main\"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{var toLog=e;if(e&&typeof e===\"object\"&&e.stack){toLog=[e,e.stack]}Module.printErr(\"exception thrown: \"+toLog);Module[\"quit\"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();if(Module[\"_main\"]&&shouldRunNow)Module[\"callMain\"](args);postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";var output=\"abort(\"+what+\") at \"+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=true;if(Module[\"noInitialRun\"]){shouldRunNow=false}run();\"use strict\";var root=typeof self===\"object\"&&self.self===self&&self||typeof global===\"object\"&&global.global===global&&global||this;((function(global){var encoder;global[\"onmessage\"]=(function(e){switch(e[\"data\"][\"command\"]){case\"encode\":if(encoder){encoder.encode(e[\"data\"][\"buffers\"])}break;case\"done\":if(encoder){encoder.encodeFinalFrame()}break;case\"init\":encoder=new OggOpusEncoder(e[\"data\"]);break;default:}});var OggOpusEncoder=(function(config){this.numberOfChannels=config[\"numberOfChannels\"]||1;this.originalSampleRate=config[\"originalSampleRate\"];this.originalSampleRateOverride=config[\"originalSampleRateOverride\"];this.encoderSampleRate=config[\"encoderSampleRate\"]||48e3;this.maxBuffersPerPage=config[\"maxBuffersPerPage\"]||40;this.encoderApplication=config[\"encoderApplication\"]||2049;this.encoderFrameSize=config[\"encoderFrameSize\"]||20;this.encoderComplexity=config[\"encoderComplexity\"];this.bufferLength=config[\"bufferLength\"]||4096;this.resampleQuality=config[\"resampleQuality\"]||3;this.bitRate=config[\"bitRate\"];this.pageIndex=0;this.granulePosition=0;this.segmentData=new Uint8Array(65025);this.segmentDataIndex=0;this.segmentTable=new Uint8Array(255);this.segmentTableIndex=0;this.buffersInPage=0;this.serial=Math.floor(Math.random()*Math.pow(2,32));this.initChecksumTable();this.initCodec();this.initResampler();this.generateIdPage();this.generateCommentPage();if(this.numberOfChannels===1){this.interleave=(function(buffers){return buffers[0]})}else{this.interleavedBuffers=new Float32Array(this.bufferLength*this.numberOfChannels)}});OggOpusEncoder._opus_encoder_create=_opus_encoder_create;OggOpusEncoder._opus_encoder_ctl=_opus_encoder_ctl;OggOpusEncoder._speex_resampler_process_interleaved_float=_speex_resampler_process_interleaved_float;OggOpusEncoder._speex_resampler_init=_speex_resampler_init;OggOpusEncoder._opus_encode_float=_opus_encode_float;OggOpusEncoder._free=_free;OggOpusEncoder._malloc=_malloc;OggOpusEncoder.prototype.encode=(function(buffers){var samples=this.interleave(buffers);var sampleIndex=0;while(sampleIndex<samples.length){var lengthToCopy=Math.min(this.resampleBufferLength-this.resampleBufferIndex,samples.length-sampleIndex);this.resampleBuffer.set(samples.subarray(sampleIndex,sampleIndex+lengthToCopy),this.resampleBufferIndex);sampleIndex+=lengthToCopy;this.resampleBufferIndex+=lengthToCopy;if(this.resampleBufferIndex===this.resampleBufferLength){OggOpusEncoder._speex_resampler_process_interleaved_float(this.resampler,this.resampleBufferPointer,this.resampleSamplesPerChannelPointer,this.encoderBufferPointer,this.encoderSamplesPerChannelPointer);var packetLength=OggOpusEncoder._opus_encode_float(this.encoder,this.encoderBufferPointer,this.encoderSamplesPerChannel,this.encoderOutputPointer,this.encoderOutputMaxLength);this.segmentPacket(packetLength);this.resampleBufferIndex=0}}this.buffersInPage++;if(this.buffersInPage>=this.maxBuffersPerPage){this.generatePage()}});OggOpusEncoder.prototype.encodeFinalFrame=(function(){var finalFrameBuffers=[];for(var i=0;i<this.numberOfChannels;++i){finalFrameBuffers.push(new Float32Array(this.bufferLength-this.resampleBufferIndex/this.numberOfChannels))}this.encode(finalFrameBuffers);this.headerType+=4;this.generatePage();global[\"postMessage\"](null);global[\"close\"]()});OggOpusEncoder.prototype.getChecksum=(function(data){var checksum=0;for(var i=0;i<data.length;i++){checksum=checksum<<8^this.checksumTable[checksum>>>24&255^data[i]]}return checksum>>>0});OggOpusEncoder.prototype.generateCommentPage=(function(){var segmentDataView=new DataView(this.segmentData.buffer);segmentDataView.setUint32(0,1937076303,true);segmentDataView.setUint32(4,1936154964,true);segmentDataView.setUint32(8,10,true);segmentDataView.setUint32(12,1868784978,true);segmentDataView.setUint32(16,1919247474,true);segmentDataView.setUint16(20,21322,true);segmentDataView.setUint32(22,0,true);this.segmentTableIndex=1;this.segmentDataIndex=this.segmentTable[0]=26;this.headerType=0;this.generatePage()});OggOpusEncoder.prototype.generateIdPage=(function(){var segmentDataView=new DataView(this.segmentData.buffer);segmentDataView.setUint32(0,1937076303,true);segmentDataView.setUint32(4,1684104520,true);segmentDataView.setUint8(8,1,true);segmentDataView.setUint8(9,this.numberOfChannels,true);segmentDataView.setUint16(10,3840,true);segmentDataView.setUint32(12,this.originalSampleRateOverride||this.originalSampleRate,true);segmentDataView.setUint16(16,0,true);segmentDataView.setUint8(18,0,true);this.segmentTableIndex=1;this.segmentDataIndex=this.segmentTable[0]=19;this.headerType=2;this.generatePage()});OggOpusEncoder.prototype.generatePage=(function(){var granulePosition=this.lastPositiveGranulePosition===this.granulePosition?-1:this.granulePosition;var pageBuffer=new ArrayBuffer(27+this.segmentTableIndex+this.segmentDataIndex);var pageBufferView=new DataView(pageBuffer);var page=new Uint8Array(pageBuffer);pageBufferView.setUint32(0,1399285583,true);pageBufferView.setUint8(4,0,true);pageBufferView.setUint8(5,this.headerType,true);pageBufferView.setUint32(6,granulePosition,true);if(granulePosition>4294967296||granulePosition<0){pageBufferView.setUint32(10,Math.floor(granulePosition/4294967296),true)}pageBufferView.setUint32(14,this.serial,true);pageBufferView.setUint32(18,this.pageIndex++,true);pageBufferView.setUint8(26,this.segmentTableIndex,true);page.set(this.segmentTable.subarray(0,this.segmentTableIndex),27);page.set(this.segmentData.subarray(0,this.segmentDataIndex),27+this.segmentTableIndex);pageBufferView.setUint32(22,this.getChecksum(page),true);global[\"postMessage\"](page,[page.buffer]);this.segmentTableIndex=0;this.segmentDataIndex=0;this.buffersInPage=0;if(granulePosition>0){this.lastPositiveGranulePosition=granulePosition}});OggOpusEncoder.prototype.initChecksumTable=(function(){this.checksumTable=[];for(var i=0;i<256;i++){var r=i<<24;for(var j=0;j<8;j++){r=(r&2147483648)!=0?r<<1^79764919:r<<1}this.checksumTable[i]=r&4294967295}});OggOpusEncoder.prototype.initCodec=(function(){var errLocation=OggOpusEncoder._malloc(4);this.encoder=OggOpusEncoder._opus_encoder_create(this.encoderSampleRate,this.numberOfChannels,this.encoderApplication,errLocation);OggOpusEncoder._free(errLocation);if(this.bitRate){var bitRateLocation=OggOpusEncoder._malloc(4);HEAP32[bitRateLocation>>2]=this.bitRate;OggOpusEncoder._opus_encoder_ctl(this.encoder,4002,bitRateLocation);OggOpusEncoder._free(bitRateLocation)}if(this.encoderComplexity){var encoderComplexityLocation=OggOpusEncoder._malloc(4);HEAP32[encoderComplexityLocation>>2]=this.encoderComplexity;OggOpusEncoder._opus_encoder_ctl(this.encoder,4010,encoderComplexityLocation);OggOpusEncoder._free(encoderComplexityLocation)}this.encoderSamplesPerChannel=this.encoderSampleRate*this.encoderFrameSize/1e3;this.encoderSamplesPerChannelPointer=OggOpusEncoder._malloc(4);HEAP32[this.encoderSamplesPerChannelPointer>>2]=this.encoderSamplesPerChannel;this.encoderBufferLength=this.encoderSamplesPerChannel*this.numberOfChannels;this.encoderBufferPointer=OggOpusEncoder._malloc(this.encoderBufferLength*4);this.encoderBuffer=HEAPF32.subarray(this.encoderBufferPointer>>2,(this.encoderBufferPointer>>2)+this.encoderBufferLength);this.encoderOutputMaxLength=4e3;this.encoderOutputPointer=OggOpusEncoder._malloc(this.encoderOutputMaxLength);this.encoderOutputBuffer=HEAPU8.subarray(this.encoderOutputPointer,this.encoderOutputPointer+this.encoderOutputMaxLength)});OggOpusEncoder.prototype.initResampler=(function(){var errLocation=OggOpusEncoder._malloc(4);this.resampler=OggOpusEncoder._speex_resampler_init(this.numberOfChannels,this.originalSampleRate,this.encoderSampleRate,this.resampleQuality,errLocation);OggOpusEncoder._free(errLocation);this.resampleBufferIndex=0;this.resampleSamplesPerChannel=this.originalSampleRate*this.encoderFrameSize/1e3;this.resampleSamplesPerChannelPointer=OggOpusEncoder._malloc(4);HEAP32[this.resampleSamplesPerChannelPointer>>2]=this.resampleSamplesPerChannel;this.resampleBufferLength=this.resampleSamplesPerChannel*this.numberOfChannels;this.resampleBufferPointer=OggOpusEncoder._malloc(this.resampleBufferLength*4);this.resampleBuffer=HEAPF32.subarray(this.resampleBufferPointer>>2,(this.resampleBufferPointer>>2)+this.resampleBufferLength)});OggOpusEncoder.prototype.interleave=(function(buffers){for(var i=0;i<this.bufferLength;i++){for(var channel=0;channel<this.numberOfChannels;channel++){this.interleavedBuffers[i*this.numberOfChannels+channel]=buffers[channel][i]}}return this.interleavedBuffers});OggOpusEncoder.prototype.segmentPacket=(function(packetLength){var packetIndex=0;while(packetLength>=0){if(this.segmentTableIndex===255){this.generatePage();this.headerType=1}var segmentLength=Math.min(packetLength,255);this.segmentTable[this.segmentTableIndex++]=segmentLength;this.segmentData.set(this.encoderOutputBuffer.subarray(packetIndex,packetIndex+segmentLength),this.segmentDataIndex);this.segmentDataIndex+=segmentLength;packetIndex+=segmentLength;packetLength-=255}this.granulePosition+=48*this.encoderFrameSize;if(this.segmentTableIndex===255){this.generatePage();this.headerType=0}});global.OggOpusEncoder=OggOpusEncoder;if(typeof module==\"object\"&&module.exports){module.exports=OggOpusEncoder}}))(root)\n\n\n\n\n"
  },
  {
    "path": "app/vendor/recorderjs/recorder.js",
    "content": "\"use strict\";\n\nvar root = (typeof self === 'object' && self.self === self && self) || (typeof global === 'object' && global.global === global && global) || this;\n\n(function( global ) {\n\n  var Recorder = function( config ){\n\n    var that = this;\n\n    if ( !Recorder.isRecordingSupported() ) {\n      throw new Error(\"Recording is not supported in this browser\");\n    }\n\n    this.state = \"inactive\";\n    this.eventTarget = global.document.createDocumentFragment();\n    this.audioContext = new global.AudioContext();\n    this.monitorNode = this.audioContext.createGain();\n\n    this.config = config = config || {};\n    this.config.command = \"init\";\n    this.config.bufferLength = config.bufferLength || 4096;\n    this.config.monitorGain = config.monitorGain || 0;\n    this.config.numberOfChannels = config.numberOfChannels || 1;\n    this.config.originalSampleRate = this.audioContext.sampleRate;\n    this.config.encoderSampleRate = config.encoderSampleRate || 48000;\n    this.config.encoderPath = config.encoderPath || 'encoderWorker.min.js';\n    this.config.streamPages = config.streamPages || false;\n    this.config.leaveStreamOpen = config.leaveStreamOpen || false;\n    this.config.maxBuffersPerPage = config.maxBuffersPerPage || 40;\n    this.config.encoderApplication = config.encoderApplication || 2049;\n    this.config.encoderFrameSize = config.encoderFrameSize || 20;\n    this.config.resampleQuality = config.resampleQuality || 3;\n    this.config.streamOptions = config.streamOptions || {\n      optional: [],\n      mandatory: {\n        googEchoCancellation: false,\n        googAutoGainControl: false,\n        googNoiseSuppression: false,\n        googHighpassFilter: false\n      }\n    };\n\n    this.setMonitorGain( this.config.monitorGain );\n    this.scriptProcessorNode = this.audioContext.createScriptProcessor( this.config.bufferLength, this.config.numberOfChannels, this.config.numberOfChannels );\n    this.scriptProcessorNode.onaudioprocess = function( e ){\n      that.encodeBuffers( e.inputBuffer );\n    };\n  };\n\n  Recorder.isRecordingSupported = function(){\n    return global.AudioContext && global.navigator && ( global.navigator.getUserMedia || ( global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia ) );\n  };\n\n  Recorder.prototype.addEventListener = function( type, listener, useCapture ){\n    this.eventTarget.addEventListener( type, listener, useCapture );\n  };\n\n  Recorder.prototype.clearStream = function() {\n    if ( this.stream ) {\n\n      if ( this.stream.getTracks ) {\n        this.stream.getTracks().forEach(function ( track ) {\n          track.stop();\n        });\n      }\n\n      else {\n        this.stream.stop();\n      }\n\n      delete this.stream;\n    }\n  };\n\n  Recorder.prototype.encodeBuffers = function( inputBuffer ){\n    if ( this.state === \"recording\" ) {\n      var buffers = [];\n      for ( var i = 0; i < inputBuffer.numberOfChannels; i++ ) {\n        buffers[i] = inputBuffer.getChannelData(i);\n      }\n\n      this.encoder.postMessage({\n        command: \"encode\",\n        buffers: buffers\n      });\n    }\n  };\n\n  Recorder.prototype.initStream = function(){\n    var that = this;\n\n    var onStreamInit = function( stream ){\n      that.stream = stream;\n      that.sourceNode = that.audioContext.createMediaStreamSource( stream );\n      that.sourceNode.connect( that.scriptProcessorNode );\n      that.sourceNode.connect( that.monitorNode );\n      that.eventTarget.dispatchEvent( new global.Event( \"streamReady\" ) );\n      return stream;\n    }\n\n    var onStreamError = function( e ){\n      that.eventTarget.dispatchEvent( new global.ErrorEvent( \"streamError\", { error: e } ) );\n    }\n\n    var constraints = { audio : this.config.streamOptions };\n\n    if ( this.stream ) {\n      this.eventTarget.dispatchEvent( new global.Event( \"streamReady\" ) );\n      return global.Promise.resolve( this.stream );\n    }\n\n    if ( global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia ) {\n      return global.navigator.mediaDevices.getUserMedia( constraints ).then( onStreamInit, onStreamError );\n    }\n\n    if ( global.navigator.getUserMedia ) {\n      return new global.Promise( function( resolve, reject ) {\n        global.navigator.getUserMedia( constraints, resolve, reject );\n      }).then( onStreamInit, onStreamError );\n    }\n  };\n\n  Recorder.prototype.pause = function(){\n    if ( this.state === \"recording\" ){\n      this.state = \"paused\";\n      this.eventTarget.dispatchEvent( new global.Event( 'pause' ) );\n    }\n  };\n\n  Recorder.prototype.removeEventListener = function( type, listener, useCapture ){\n    this.eventTarget.removeEventListener( type, listener, useCapture );\n  };\n\n  Recorder.prototype.resume = function() {\n    if ( this.state === \"paused\" ) {\n      this.state = \"recording\";\n      this.eventTarget.dispatchEvent( new global.Event( 'resume' ) );\n    }\n  };\n\n  Recorder.prototype.setMonitorGain = function( gain ){\n    this.monitorNode.gain.value = gain;\n  };\n\n  Recorder.prototype.start = function(){\n    if ( this.state === \"inactive\" && this.stream ) {\n      var that = this;\n      this.encoder = new global.Worker( this.config.encoderPath );\n\n      if (this.config.streamPages){\n        this.encoder.addEventListener( \"message\", function( e ) {\n          that.streamPage( e.data );\n        });\n      }\n\n      else {\n        this.recordedPages = [];\n        this.totalLength = 0;\n        this.encoder.addEventListener( \"message\", function( e ) {\n          that.storePage( e.data );\n        });\n      }\n\n      // First buffer can contain old data. Don't encode it.\n      this.encodeBuffers = function(){\n        delete this.encodeBuffers;\n      };\n\n      this.state = \"recording\";\n      this.monitorNode.connect( this.audioContext.destination );\n      this.scriptProcessorNode.connect( this.audioContext.destination );\n      this.eventTarget.dispatchEvent( new global.Event( 'start' ) );\n      this.encoder.postMessage( this.config );\n    }\n  };\n\n  Recorder.prototype.stop = function(){\n    if ( this.state !== \"inactive\" ) {\n      this.state = \"inactive\";\n      this.monitorNode.disconnect();\n      this.scriptProcessorNode.disconnect();\n\n      if ( !this.config.leaveStreamOpen ) {\n        this.clearStream();\n      }\n\n      this.audioContext.close();\n      this.audioContext = null;\n\n      this.encoder.postMessage({ command: \"done\" });\n    }\n  };\n\n  Recorder.prototype.storePage = function( page ) {\n    if ( page === null ) {\n      var outputData = new Uint8Array( this.totalLength );\n      var outputIndex = 0;\n\n      for ( var i = 0; i < this.recordedPages.length; i++ ) {\n        outputData.set( this.recordedPages[i], outputIndex );\n        outputIndex += this.recordedPages[i].length;\n      }\n\n      this.eventTarget.dispatchEvent( new global.CustomEvent( 'dataAvailable', {\n        detail: outputData\n      }));\n\n      this.recordedPages = [];\n      this.eventTarget.dispatchEvent( new global.Event( 'stop' ) );\n    }\n\n    else {\n      this.recordedPages.push( page );\n      this.totalLength += page.length;\n    }\n  };\n\n  Recorder.prototype.streamPage = function( page ) {\n    if ( page === null ) {\n      this.eventTarget.dispatchEvent( new global.Event( 'stop' ) );\n    }\n\n    else {\n      this.eventTarget.dispatchEvent( new global.CustomEvent( 'dataAvailable', {\n        detail: page\n      }));\n    }\n  };\n\n\n  // Exports\n  global.Recorder = Recorder;\n\n  if ( typeof define === 'function' && define.amd ) {\n    define( [], function() {\n      return Recorder;\n    });\n  }\n\n  else if ( typeof module == 'object' && module.exports ) {\n    module.exports = Recorder;\n  }\n\n})(root);\n"
  },
  {
    "path": "app/vendor/rusha/rusha.js",
    "content": "/*\n * Rusha, a JavaScript implementation of the Secure Hash Algorithm, SHA-1,\n * as defined in FIPS PUB 180-1, tuned for high performance with large inputs.\n * (http://github.com/srijs/rusha)\n *\n * Inspired by Paul Johnstons implementation (http://pajhome.org.uk/crypt/md5).\n *\n * Copyright (c) 2013 Sam Rijs (http://awesam.de).\n * Released under the terms of the MIT license as follows:\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n(function (global) {\n    // If we'e running in Node.JS, export a module.\n    if (typeof module !== 'undefined') {\n        module.exports = Rusha;\n    }\n    // If we're running in a DOM context, export\n    // the Rusha object to toplevel.\n    if (typeof global !== 'undefined') {\n        global.Rusha = Rusha;\n    }\n    // If we're running in a webworker, accept\n    // messages containing a jobid and a buffer\n    // or blob object, and return the hash result.\n    if (typeof FileReaderSync !== 'undefined') {\n        var reader = new FileReaderSync(), hasher = new Rusha(4 * 1024 * 1024);\n        self.onmessage = function onMessage(event) {\n            var hash, data = event.data.data;\n            if (data instanceof Blob) {\n                try {\n                    data = reader.readAsBinaryString(data);\n                } catch (e) {\n                    self.postMessage({\n                        id: event.data.id,\n                        error: e.name\n                    });\n                    return;\n                }\n            }\n            hash = hasher.digest(data);\n            self.postMessage({\n                id: event.data.id,\n                hash: hash\n            });\n        };\n    }\n    var util = {\n            getDataType: function (data) {\n                if (typeof data === 'string') {\n                    return 'string';\n                }\n                if (data instanceof Array) {\n                    return 'array';\n                }\n                if (typeof global !== 'undefined' && global.Buffer && global.Buffer.isBuffer(data)) {\n                    return 'buffer';\n                }\n                if (data instanceof ArrayBuffer) {\n                    return 'arraybuffer';\n                }\n                if (data.buffer instanceof ArrayBuffer) {\n                    return 'view';\n                }\n                throw new Error('Unsupported data type.');\n            }\n        };\n    // The Rusha object is a wrapper around the low-level RushaCore.\n    // It provides means of converting different inputs to the\n    // format accepted by RushaCore as well as other utility methods.\n    function Rusha(chunkSize) {\n        'use strict';\n        // Private object structure.\n        var self$2 = { fill: 0 };\n        // Calculate the length of buffer that the sha1 routine uses\n        // including the padding.\n        var padlen = function (len) {\n            for (len += 9; len % 64 > 0; len += 1);\n            return len;\n        };\n        var padZeroes = function (bin, len) {\n            for (var i = len >> 2; i < bin.length; i++)\n                bin[i] = 0;\n        };\n        var padData = function (bin, chunkLen, msgLen) {\n            bin[chunkLen >> 2] |= 128 << 24 - (chunkLen % 4 << 3);\n            bin[((chunkLen >> 2) + 2 & ~15) + 15] = msgLen << 3;\n        };\n        // Convert a binary string and write it to the heap.\n        // A binary string is expected to only contain char codes < 256.\n        var convStr = function (H8, H32, start, len, off) {\n            var str = this, i, om = off % 4, lm = len % 4, j = len - lm;\n            if (j > 0) {\n                switch (om) {\n                case 0:\n                    H8[off + 3 | 0] = str.charCodeAt(start);\n                case 1:\n                    H8[off + 2 | 0] = str.charCodeAt(start + 1);\n                case 2:\n                    H8[off + 1 | 0] = str.charCodeAt(start + 2);\n                case 3:\n                    H8[off | 0] = str.charCodeAt(start + 3);\n                }\n            }\n            for (i = om; i < j; i = i + 4 | 0) {\n                H32[off + i >> 2] = str.charCodeAt(start + i) << 24 | str.charCodeAt(start + i + 1) << 16 | str.charCodeAt(start + i + 2) << 8 | str.charCodeAt(start + i + 3);\n            }\n            switch (lm) {\n            case 3:\n                H8[off + j + 1 | 0] = str.charCodeAt(start + j + 2);\n            case 2:\n                H8[off + j + 2 | 0] = str.charCodeAt(start + j + 1);\n            case 1:\n                H8[off + j + 3 | 0] = str.charCodeAt(start + j);\n            }\n        };\n        // Convert a buffer or array and write it to the heap.\n        // The buffer or array is expected to only contain elements < 256.\n        var convBuf = function (H8, H32, start, len, off) {\n            var buf = this, i, om = off % 4, lm = len % 4, j = len - lm;\n            if (j > 0) {\n                switch (om) {\n                case 0:\n                    H8[off + 3 | 0] = buf[start];\n                case 1:\n                    H8[off + 2 | 0] = buf[start + 1];\n                case 2:\n                    H8[off + 1 | 0] = buf[start + 2];\n                case 3:\n                    H8[off | 0] = buf[start + 3];\n                }\n            }\n            for (i = 4 - om; i < j; i = i += 4 | 0) {\n                H32[off + i >> 2] = buf[start + i] << 24 | buf[start + i + 1] << 16 | buf[start + i + 2] << 8 | buf[start + i + 3];\n            }\n            switch (lm) {\n            case 3:\n                H8[off + j + 1 | 0] = buf[start + j + 2];\n            case 2:\n                H8[off + j + 2 | 0] = buf[start + j + 1];\n            case 1:\n                H8[off + j + 3 | 0] = buf[start + j];\n            }\n        };\n        var convFn = function (data) {\n            switch (util.getDataType(data)) {\n            case 'string':\n                return convStr.bind(data);\n            case 'array':\n                return convBuf.bind(data);\n            case 'buffer':\n                return convBuf.bind(data);\n            case 'arraybuffer':\n                return convBuf.bind(new Uint8Array(data));\n            case 'view':\n                return convBuf.bind(new Uint8Array(data.buffer));\n            }\n        };\n        var slice = function (data, offset) {\n            switch (util.getDataType(data)) {\n            case 'string':\n                return data.slice(offset);\n            case 'array':\n                return data.slice(offset);\n            case 'buffer':\n                return data.slice(offset);\n            case 'arraybuffer':\n                return data.slice(offset);\n            case 'view':\n                return data.buffer.slice(offset);\n            }\n        };\n        // Convert an ArrayBuffer into its hexadecimal string representation.\n        var hex = function (arrayBuffer) {\n            var i, x, hex_tab = '0123456789abcdef', res = [], binarray = new Uint8Array(arrayBuffer);\n            for (i = 0; i < binarray.length; i++) {\n                x = binarray[i];\n                res[i] = hex_tab.charAt(x >> 4 & 15) + hex_tab.charAt(x >> 0 & 15);\n            }\n            return res.join('');\n        };\n        var ceilHeapSize = function (v) {\n            // The asm.js spec says:\n            // The heap object's byteLength must be either\n            // 2^n for n in [12, 24) or 2^24 * n for n ≥ 1.\n            // Also, byteLengths smaller than 2^16 are deprecated.\n            var p;\n            // If v is smaller than 2^16, the smallest possible solution\n            // is 2^16.\n            if (v <= 65536)\n                return 65536;\n            // If v < 2^24, we round up to 2^n,\n            // otherwise we round up to 2^24 * n.\n            if (v < 16777216) {\n                for (p = 1; p < v; p = p << 1);\n            } else {\n                for (p = 16777216; p < v; p += 16777216);\n            }\n            return p;\n        };\n        // Initialize the internal data structures to a new capacity.\n        var init = function (size) {\n            if (size % 64 > 0) {\n                throw new Error('Chunk size must be a multiple of 128 bit');\n            }\n            self$2.maxChunkLen = size;\n            self$2.padMaxChunkLen = padlen(size);\n            // The size of the heap is the sum of:\n            // 1. The padded input message size\n            // 2. The extended space the algorithm needs (320 byte)\n            // 3. The 160 bit state the algoritm uses\n            self$2.heap = new ArrayBuffer(ceilHeapSize(self$2.padMaxChunkLen + 320 + 20));\n            self$2.h32 = new Int32Array(self$2.heap);\n            self$2.h8 = new Int8Array(self$2.heap);\n            self$2.core = RushaCore({\n                Int32Array: Int32Array,\n                DataView: DataView\n            }, {}, self$2.heap);\n            self$2.buffer = null;\n        };\n        // Iinitializethe datastructures according\n        // to a chunk siyze.\n        init(chunkSize || 64 * 1024);\n        var initState = function (heap, padMsgLen) {\n            var io = new Int32Array(heap, padMsgLen + 320, 5);\n            io[0] = 1732584193;\n            io[1] = -271733879;\n            io[2] = -1732584194;\n            io[3] = 271733878;\n            io[4] = -1009589776;\n        };\n        var padChunk = function (chunkLen, msgLen) {\n            var padChunkLen = padlen(chunkLen);\n            var view = new Int32Array(self$2.heap, 0, padChunkLen >> 2);\n            padZeroes(view, chunkLen);\n            padData(view, chunkLen, msgLen);\n            return padChunkLen;\n        };\n        // Write data to the heap.\n        var write = function (data, chunkOffset, chunkLen) {\n            convFn(data)(self$2.h8, self$2.h32, chunkOffset, chunkLen, 0);\n        };\n        // Initialize and call the RushaCore,\n        // assuming an input buffer of length len * 4.\n        var coreCall = function (data, chunkOffset, chunkLen, msgLen, finalize) {\n            var padChunkLen = chunkLen;\n            if (finalize) {\n                padChunkLen = padChunk(chunkLen, msgLen);\n            }\n            write(data, chunkOffset, chunkLen);\n            self$2.core.hash(padChunkLen, self$2.padMaxChunkLen);\n        };\n        var getRawDigest = function (heap, padMaxChunkLen) {\n            var io = new Int32Array(heap, padMaxChunkLen + 320, 5);\n            var out = new Int32Array(5);\n            var arr = new DataView(out.buffer);\n            arr.setInt32(0, io[0], false);\n            arr.setInt32(4, io[1], false);\n            arr.setInt32(8, io[2], false);\n            arr.setInt32(12, io[3], false);\n            arr.setInt32(16, io[4], false);\n            return out;\n        };\n        // Calculate the hash digest as an array of 5 32bit integers.\n        var rawDigest = this.rawDigest = function (str) {\n                var msgLen = str.byteLength || str.length;\n                initState(self$2.heap, self$2.padMaxChunkLen);\n                var chunkOffset = 0, chunkLen = self$2.maxChunkLen, last;\n                for (chunkOffset = 0; msgLen > chunkOffset + chunkLen; chunkOffset += chunkLen) {\n                    coreCall(str, chunkOffset, chunkLen, msgLen, false);\n                }\n                coreCall(str, chunkOffset, msgLen - chunkOffset, msgLen, true);\n                return getRawDigest(self$2.heap, self$2.padMaxChunkLen);\n            };\n        // The digest and digestFrom* interface returns the hash digest\n        // as a hex string.\n        this.digest = this.digestFromString = this.digestFromBuffer = this.digestFromArrayBuffer = function (str) {\n            return hex(rawDigest(str).buffer);\n        };\n    }\n    ;\n    // The low-level RushCore module provides the heart of Rusha,\n    // a high-speed sha1 implementation working on an Int32Array heap.\n    // At first glance, the implementation seems complicated, however\n    // with the SHA1 spec at hand, it is obvious this almost a textbook\n    // implementation that has a few functions hand-inlined and a few loops\n    // hand-unrolled.\n    function RushaCore(stdlib, foreign, heap) {\n        'use asm';\n        var H = new stdlib.Int32Array(heap);\n        function hash(k, x) {\n            // k in bytes\n            k = k | 0;\n            x = x | 0;\n            var i = 0, j = 0, y0 = 0, z0 = 0, y1 = 0, z1 = 0, y2 = 0, z2 = 0, y3 = 0, z3 = 0, y4 = 0, z4 = 0, t0 = 0, t1 = 0;\n            y0 = H[x + 320 >> 2] | 0;\n            y1 = H[x + 324 >> 2] | 0;\n            y2 = H[x + 328 >> 2] | 0;\n            y3 = H[x + 332 >> 2] | 0;\n            y4 = H[x + 336 >> 2] | 0;\n            for (i = 0; (i | 0) < (k | 0); i = i + 64 | 0) {\n                z0 = y0;\n                z1 = y1;\n                z2 = y2;\n                z3 = y3;\n                z4 = y4;\n                for (j = 0; (j | 0) < 64; j = j + 4 | 0) {\n                    t1 = H[i + j >> 2] | 0;\n                    t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | ~y1 & y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0;\n                    y4 = y3;\n                    y3 = y2;\n                    y2 = y1 << 30 | y1 >>> 2;\n                    y1 = y0;\n                    y0 = t0;\n                    ;\n                    H[k + j >> 2] = t1;\n                }\n                for (j = k + 64 | 0; (j | 0) < (k + 80 | 0); j = j + 4 | 0) {\n                    t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n                    t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | ~y1 & y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0;\n                    y4 = y3;\n                    y3 = y2;\n                    y2 = y1 << 30 | y1 >>> 2;\n                    y1 = y0;\n                    y0 = t0;\n                    ;\n                    H[j >> 2] = t1;\n                }\n                for (j = k + 80 | 0; (j | 0) < (k + 160 | 0); j = j + 4 | 0) {\n                    t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n                    t0 = ((y0 << 5 | y0 >>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) + 1859775393 | 0) | 0;\n                    y4 = y3;\n                    y3 = y2;\n                    y2 = y1 << 30 | y1 >>> 2;\n                    y1 = y0;\n                    y0 = t0;\n                    ;\n                    H[j >> 2] = t1;\n                }\n                for (j = k + 160 | 0; (j | 0) < (k + 240 | 0); j = j + 4 | 0) {\n                    t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n                    t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | y1 & y3 | y2 & y3) | 0) + ((t1 + y4 | 0) - 1894007588 | 0) | 0;\n                    y4 = y3;\n                    y3 = y2;\n                    y2 = y1 << 30 | y1 >>> 2;\n                    y1 = y0;\n                    y0 = t0;\n                    ;\n                    H[j >> 2] = t1;\n                }\n                for (j = k + 240 | 0; (j | 0) < (k + 320 | 0); j = j + 4 | 0) {\n                    t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n                    t0 = ((y0 << 5 | y0 >>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) - 899497514 | 0) | 0;\n                    y4 = y3;\n                    y3 = y2;\n                    y2 = y1 << 30 | y1 >>> 2;\n                    y1 = y0;\n                    y0 = t0;\n                    ;\n                    H[j >> 2] = t1;\n                }\n                y0 = y0 + z0 | 0;\n                y1 = y1 + z1 | 0;\n                y2 = y2 + z2 | 0;\n                y3 = y3 + z3 | 0;\n                y4 = y4 + z4 | 0;\n            }\n            H[x + 320 >> 2] = y0;\n            H[x + 324 >> 2] = y1;\n            H[x + 328 >> 2] = y2;\n            H[x + 332 >> 2] = y3;\n            H[x + 336 >> 2] = y4;\n        }\n        return { hash: hash };\n    }\n}(this));\n"
  },
  {
    "path": "app/vendor/ui-bootstrap/THIRDPARTY_LICENSE",
    "content": "The MIT License\r\n\r\nCopyright (c) 2012-2013 the AngularUI Team, https://github.com/organizations/angular-ui/teams/291112\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n\r\n"
  },
  {
    "path": "app/vendor/ui-bootstrap/ui-bootstrap-custom-tpls-0.12.0.js",
    "content": "/*\n * angular-ui-bootstrap\n * http://angular-ui.github.io/bootstrap/\n\n * Version: 0.12.0 - 2014-11-16\n * License: MIT\n */\nangular.module(\"ui.bootstrap\", [\"ui.bootstrap.tpls\",\"ui.bootstrap.dropdown\",\"ui.bootstrap.tooltip\",\"ui.bootstrap.position\",\"ui.bootstrap.bindHtml\",\"ui.bootstrap.modal\",\"ui.bootstrap.transition\"]);\nangular.module(\"ui.bootstrap.tpls\", [\"template/tooltip/tooltip-html-unsafe-popup.html\",\"template/tooltip/tooltip-popup.html\",\"template/modal/backdrop.html\",\"template/modal/window.html\"]);\nangular.module('ui.bootstrap.dropdown', [])\n\n.constant('dropdownConfig', {\n  openClass: 'open'\n})\n\n.service('dropdownService', ['$document', function($document) {\n  var openScope = null;\n\n  this.open = function( dropdownScope ) {\n    if ( !openScope ) {\n      $document.bind('click', closeDropdown);\n      $document.bind('keydown', escapeKeyBind);\n    }\n\n    if ( openScope && openScope !== dropdownScope ) {\n        openScope.isOpen = false;\n    }\n\n    openScope = dropdownScope;\n  };\n\n  this.close = function( dropdownScope ) {\n    if ( openScope === dropdownScope ) {\n      openScope = null;\n      $document.unbind('click', closeDropdown);\n      $document.unbind('keydown', escapeKeyBind);\n    }\n  };\n\n  var closeDropdown = function( evt ) {\n    // This method may still be called during the same mouse event that\n    // unbound this event handler. So check openScope before proceeding.\n    if (!openScope) { return; }\n\n    var toggleElement = openScope.getToggleElement();\n    if ( evt && toggleElement && toggleElement[0].contains(evt.target) ) {\n        return;\n    }\n\n    openScope.$apply(function() {\n      openScope.isOpen = false;\n    });\n  };\n\n  var escapeKeyBind = function( evt ) {\n    if ( evt.which === 27 ) {\n      openScope.focusToggleElement();\n      closeDropdown();\n    }\n  };\n}])\n\n.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) {\n  var self = this,\n      scope = $scope.$new(), // create a child scope so we are not polluting original one\n      openClass = dropdownConfig.openClass,\n      getIsOpen,\n      setIsOpen = angular.noop,\n      toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop;\n\n  this.init = function( element ) {\n    self.$element = element;\n\n    if ( $attrs.isOpen ) {\n      getIsOpen = $parse($attrs.isOpen);\n      setIsOpen = getIsOpen.assign;\n\n      $scope.$watch(getIsOpen, function(value) {\n        scope.isOpen = !!value;\n      });\n    }\n  };\n\n  this.toggle = function( open ) {\n    return scope.isOpen = arguments.length ? !!open : !scope.isOpen;\n  };\n\n  // Allow other directives to watch status\n  this.isOpen = function() {\n    return scope.isOpen;\n  };\n\n  scope.getToggleElement = function() {\n    return self.toggleElement;\n  };\n\n  scope.focusToggleElement = function() {\n    if ( self.toggleElement ) {\n      self.toggleElement[0].focus();\n    }\n  };\n\n  scope.$watch('isOpen', function( isOpen, wasOpen ) {\n    $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass);\n\n    if ( isOpen ) {\n      scope.focusToggleElement();\n      dropdownService.open( scope );\n    } else {\n      dropdownService.close( scope );\n    }\n\n    setIsOpen($scope, isOpen);\n    if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\n      toggleInvoker($scope, { open: !!isOpen });\n    }\n  });\n\n  $scope.$on('$locationChangeSuccess', function() {\n    scope.isOpen = false;\n  });\n\n  $scope.$on('$destroy', function() {\n    scope.$destroy();\n  });\n}])\n\n.directive('dropdown', function() {\n  return {\n    controller: 'DropdownController',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      dropdownCtrl.init( element );\n    }\n  };\n})\n\n.directive('dropdownToggle', function() {\n  return {\n    require: '?^dropdown',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      if ( !dropdownCtrl ) {\n        return;\n      }\n\n      dropdownCtrl.toggleElement = element;\n\n      var toggleDropdown = function(event) {\n        event.preventDefault();\n\n        if ( !element.hasClass('disabled') && !attrs.disabled ) {\n          scope.$apply(function() {\n            dropdownCtrl.toggle();\n          });\n        }\n      };\n\n      element.bind('click', toggleDropdown);\n\n      // WAI-ARIA\n      element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\n      scope.$watch(dropdownCtrl.isOpen, function( isOpen ) {\n        element.attr('aria-expanded', !!isOpen);\n      });\n\n      scope.$on('$destroy', function() {\n        element.unbind('click', toggleDropdown);\n      });\n    }\n  };\n});\n\n/**\n * The following features are still outstanding: animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html tooltips, and selector delegation.\n */\nangular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] )\n\n/**\n * The $tooltip service creates tooltip- and popover-like directives as well as\n * houses global options for them.\n */\n.provider( '$tooltip', function () {\n  // The default options tooltip and popover.\n  var defaultOptions = {\n    placement: 'top',\n    animation: true,\n    popupDelay: 0\n  };\n\n  // Default hide triggers for each show trigger\n  var triggerMap = {\n    'mouseenter': 'mouseleave',\n    'click': 'click',\n    'focus': 'blur'\n  };\n\n  // The options specified to the provider globally.\n  var globalOptions = {};\n\n  /**\n   * `options({})` allows global configuration of all tooltips in the\n   * application.\n   *\n   *   var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {\n   *     // place tooltips left instead of top by default\n   *     $tooltipProvider.options( { placement: 'left' } );\n   *   });\n   */\n  this.options = function( value ) {\n    angular.extend( globalOptions, value );\n  };\n\n  /**\n   * This allows you to extend the set of trigger mappings available. E.g.:\n   *\n   *   $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' );\n   */\n  this.setTriggers = function setTriggers ( triggers ) {\n    angular.extend( triggerMap, triggers );\n  };\n\n  /**\n   * This is a helper function for translating camel-case to snake-case.\n   */\n  function snake_case(name){\n    var regexp = /[A-Z]/g;\n    var separator = '-';\n    return name.replace(regexp, function(letter, pos) {\n      return (pos ? separator : '') + letter.toLowerCase();\n    });\n  }\n\n  /**\n   * Returns the actual instance of the $tooltip service.\n   * TODO support multiple triggers\n   */\n  this.$get = [ '$window', '$compile', '$timeout', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $document, $position, $interpolate ) {\n    return function $tooltip ( type, prefix, defaultTriggerShow ) {\n      var options = angular.extend( {}, defaultOptions, globalOptions );\n\n      /**\n       * Returns an object of show and hide triggers.\n       *\n       * If a trigger is supplied,\n       * it is used to show the tooltip; otherwise, it will use the `trigger`\n       * option passed to the `$tooltipProvider.options` method; else it will\n       * default to the trigger supplied to this directive factory.\n       *\n       * The hide trigger is based on the show trigger. If the `trigger` option\n       * was passed to the `$tooltipProvider.options` method, it will use the\n       * mapped trigger from `triggerMap` or the passed trigger if the map is\n       * undefined; otherwise, it uses the `triggerMap` value of the show\n       * trigger; else it will just use the show trigger.\n       */\n      function getTriggers ( trigger ) {\n        var show = trigger || options.trigger || defaultTriggerShow;\n        var hide = triggerMap[show] || show;\n        return {\n          show: show,\n          hide: hide\n        };\n      }\n\n      var directiveName = snake_case( type );\n\n      var startSym = $interpolate.startSymbol();\n      var endSym = $interpolate.endSymbol();\n      var template =\n        '<div '+ directiveName +'-popup '+\n          'title=\"'+startSym+'title'+endSym+'\" '+\n          'content=\"'+startSym+'content'+endSym+'\" '+\n          'placement=\"'+startSym+'placement'+endSym+'\" '+\n          'animation=\"animation\" '+\n          'is-open=\"isOpen\"'+\n          '>'+\n        '</div>';\n\n      return {\n        restrict: 'EA',\n        compile: function (tElem, tAttrs) {\n          var tooltipLinker = $compile( template );\n\n          return function link ( scope, element, attrs ) {\n            var tooltip;\n            var tooltipLinkedScope;\n            var transitionTimeout;\n            var popupTimeout;\n            var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false;\n            var triggers = getTriggers( undefined );\n            var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']);\n            var ttScope = scope.$new(true);\n\n            var positionTooltip = function () {\n\n              var ttPosition = $position.positionElements(element, tooltip, ttScope.placement, appendToBody);\n              ttPosition.top += 'px';\n              ttPosition.left += 'px';\n\n              // Now set the calculated positioning.\n              tooltip.css( ttPosition );\n            };\n\n            // By default, the tooltip is not open.\n            // TODO add ability to start tooltip opened\n            ttScope.isOpen = false;\n\n            function toggleTooltipBind () {\n              if ( ! ttScope.isOpen ) {\n                showTooltipBind();\n              } else {\n                hideTooltipBind();\n              }\n            }\n\n            // Show the tooltip with delay if specified, otherwise show it immediately\n            function showTooltipBind() {\n              if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) {\n                return;\n              }\n\n              prepareTooltip();\n\n              if ( ttScope.popupDelay ) {\n                // Do nothing if the tooltip was already scheduled to pop-up.\n                // This happens if show is triggered multiple times before any hide is triggered.\n                if (!popupTimeout) {\n                  popupTimeout = $timeout( show, ttScope.popupDelay, false );\n                  popupTimeout.then(function(reposition){reposition();});\n                }\n              } else {\n                show()();\n              }\n            }\n\n            function hideTooltipBind () {\n              scope.$apply(function () {\n                hide();\n              });\n            }\n\n            // Show the tooltip popup element.\n            function show() {\n\n              popupTimeout = null;\n\n              // If there is a pending remove transition, we must cancel it, lest the\n              // tooltip be mysteriously removed.\n              if ( transitionTimeout ) {\n                $timeout.cancel( transitionTimeout );\n                transitionTimeout = null;\n              }\n\n              // Don't show empty tooltips.\n              if ( ! ttScope.content ) {\n                return angular.noop;\n              }\n\n              createTooltip();\n\n              // Set the initial positioning.\n              tooltip.css({ top: 0, left: 0, display: 'block' });\n\n              // Now we add it to the DOM because need some info about it. But it's not\n              // visible yet anyway.\n              if ( appendToBody ) {\n                  $document.find( 'body' ).append( tooltip );\n              } else {\n                element.after( tooltip );\n              }\n\n              positionTooltip();\n\n              // And show the tooltip.\n              ttScope.isOpen = true;\n              ttScope.$digest(); // digest required as $apply is not called\n\n              // Return positioning function as promise callback for correct\n              // positioning after draw.\n              return positionTooltip;\n            }\n\n            // Hide the tooltip popup element.\n            function hide() {\n              // First things first: we don't show it anymore.\n              ttScope.isOpen = false;\n\n              //if tooltip is going to be shown after delay, we must cancel this\n              $timeout.cancel( popupTimeout );\n              popupTimeout = null;\n\n              // And now we remove it from the DOM. However, if we have animation, we\n              // need to wait for it to expire beforehand.\n              // FIXME: this is a placeholder for a port of the transitions library.\n              if ( ttScope.animation ) {\n                if (!transitionTimeout) {\n                  transitionTimeout = $timeout(removeTooltip, 500);\n                }\n              } else {\n                removeTooltip();\n              }\n            }\n\n            function createTooltip() {\n              // There can only be one tooltip element per directive shown at once.\n              if (tooltip) {\n                removeTooltip();\n              }\n              tooltipLinkedScope = ttScope.$new();\n              tooltip = tooltipLinker(tooltipLinkedScope, angular.noop);\n            }\n\n            function removeTooltip() {\n              transitionTimeout = null;\n              if (tooltip) {\n                tooltip.remove();\n                tooltip = null;\n              }\n              if (tooltipLinkedScope) {\n                tooltipLinkedScope.$destroy();\n                tooltipLinkedScope = null;\n              }\n            }\n\n            function prepareTooltip() {\n              prepPlacement();\n              prepPopupDelay();\n            }\n\n            /**\n             * Observe the relevant attributes.\n             */\n            attrs.$observe( type, function ( val ) {\n              ttScope.content = val;\n\n              if (!val && ttScope.isOpen ) {\n                hide();\n              }\n            });\n\n            attrs.$observe( prefix+'Title', function ( val ) {\n              ttScope.title = val;\n            });\n\n            function prepPlacement() {\n              var val = attrs[ prefix + 'Placement' ];\n              ttScope.placement = angular.isDefined( val ) ? val : options.placement;\n            }\n\n            function prepPopupDelay() {\n              var val = attrs[ prefix + 'PopupDelay' ];\n              var delay = parseInt( val, 10 );\n              ttScope.popupDelay = ! isNaN(delay) ? delay : options.popupDelay;\n            }\n\n            var unregisterTriggers = function () {\n              element.unbind(triggers.show, showTooltipBind);\n              element.unbind(triggers.hide, hideTooltipBind);\n            };\n\n            function prepTriggers() {\n              var val = attrs[ prefix + 'Trigger' ];\n              unregisterTriggers();\n\n              triggers = getTriggers( val );\n\n              if ( triggers.show === triggers.hide ) {\n                element.bind( triggers.show, toggleTooltipBind );\n              } else {\n                element.bind( triggers.show, showTooltipBind );\n                element.bind( triggers.hide, hideTooltipBind );\n              }\n            }\n            prepTriggers();\n\n            var animation = scope.$eval(attrs[prefix + 'Animation']);\n            ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation;\n\n            var appendToBodyVal = scope.$eval(attrs[prefix + 'AppendToBody']);\n            appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody;\n\n            // if a tooltip is attached to <body> we need to remove it on\n            // location change as its parent scope will probably not be destroyed\n            // by the change.\n            if ( appendToBody ) {\n              scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () {\n              if ( ttScope.isOpen ) {\n                hide();\n              }\n            });\n            }\n\n            // Make sure tooltip is destroyed and removed.\n            scope.$on('$destroy', function onDestroyTooltip() {\n              $timeout.cancel( transitionTimeout );\n              $timeout.cancel( popupTimeout );\n              unregisterTriggers();\n              removeTooltip();\n              ttScope = null;\n            });\n          };\n        }\n      };\n    };\n  }];\n})\n\n.directive( 'tooltipPopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/tooltip/tooltip-popup.html'\n  };\n})\n\n.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'tooltip', 'tooltip', 'mouseenter' );\n}])\n\n.directive( 'tooltipHtmlUnsafePopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html'\n  };\n})\n\n.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' );\n}]);\n\nangular.module('ui.bootstrap.position', [])\n\n/**\n * A set of utility methods that can be use to retrieve position of DOM elements.\n * It is meant to be used where we need to absolute-position DOM elements in\n * relation to other, existing elements (this is the case for tooltips, popovers,\n * typeahead suggestions etc.).\n */\n  .factory('$position', ['$document', '$window', function ($document, $window) {\n\n    function getStyle(el, cssprop) {\n      if (el.currentStyle) { //IE\n        return el.currentStyle[cssprop];\n      } else if ($window.getComputedStyle) {\n        return $window.getComputedStyle(el)[cssprop];\n      }\n      // finally try and get inline style\n      return el.style[cssprop];\n    }\n\n    /**\n     * Checks if a given element is statically positioned\n     * @param element - raw DOM element\n     */\n    function isStaticPositioned(element) {\n      return (getStyle(element, 'position') || 'static' ) === 'static';\n    }\n\n    /**\n     * returns the closest, non-statically positioned parentOffset of a given element\n     * @param element\n     */\n    var parentOffsetEl = function (element) {\n      var docDomEl = $document[0];\n      var offsetParent = element.offsetParent || docDomEl;\n      while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) {\n        offsetParent = offsetParent.offsetParent;\n      }\n      return offsetParent || docDomEl;\n    };\n\n    return {\n      /**\n       * Provides read-only equivalent of jQuery's position function:\n       * http://api.jquery.com/position/\n       */\n      position: function (element) {\n        var elBCR = this.offset(element);\n        var offsetParentBCR = { top: 0, left: 0 };\n        var offsetParentEl = parentOffsetEl(element[0]);\n        if (offsetParentEl != $document[0]) {\n          offsetParentBCR = this.offset(angular.element(offsetParentEl));\n          offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop;\n          offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft;\n        }\n\n        var boundingClientRect = element[0].getBoundingClientRect();\n        return {\n          width: boundingClientRect.width || element.prop('offsetWidth'),\n          height: boundingClientRect.height || element.prop('offsetHeight'),\n          top: elBCR.top - offsetParentBCR.top,\n          left: elBCR.left - offsetParentBCR.left\n        };\n      },\n\n      /**\n       * Provides read-only equivalent of jQuery's offset function:\n       * http://api.jquery.com/offset/\n       */\n      offset: function (element) {\n        var boundingClientRect = element[0].getBoundingClientRect();\n        return {\n          width: boundingClientRect.width || element.prop('offsetWidth'),\n          height: boundingClientRect.height || element.prop('offsetHeight'),\n          top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\n          left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\n        };\n      },\n\n      /**\n       * Provides coordinates for the targetEl in relation to hostEl\n       */\n      positionElements: function (hostEl, targetEl, positionStr, appendToBody) {\n\n        var positionStrParts = positionStr.split('-');\n        var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center';\n\n        var hostElPos,\n          targetElWidth,\n          targetElHeight,\n          targetElPos;\n\n        hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl);\n\n        targetElWidth = targetEl.prop('offsetWidth');\n        targetElHeight = targetEl.prop('offsetHeight');\n\n        var shiftWidth = {\n          center: function () {\n            return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2;\n          },\n          left: function () {\n            return hostElPos.left;\n          },\n          right: function () {\n            return hostElPos.left + hostElPos.width;\n          }\n        };\n\n        var shiftHeight = {\n          center: function () {\n            return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2;\n          },\n          top: function () {\n            return hostElPos.top;\n          },\n          bottom: function () {\n            return hostElPos.top + hostElPos.height;\n          }\n        };\n\n        switch (pos0) {\n          case 'right':\n            targetElPos = {\n              top: shiftHeight[pos1](),\n              left: shiftWidth[pos0]()\n            };\n            break;\n          case 'left':\n            targetElPos = {\n              top: shiftHeight[pos1](),\n              left: hostElPos.left - targetElWidth\n            };\n            break;\n          case 'bottom':\n            targetElPos = {\n              top: shiftHeight[pos0](),\n              left: shiftWidth[pos1]()\n            };\n            break;\n          default:\n            targetElPos = {\n              top: hostElPos.top - targetElHeight,\n              left: shiftWidth[pos1]()\n            };\n            break;\n        }\n\n        return targetElPos;\n      }\n    };\n  }]);\n\nangular.module('ui.bootstrap.bindHtml', [])\n\n  .directive('bindHtmlUnsafe', function () {\n    return function (scope, element, attr) {\n      element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe);\n      scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) {\n        element.html(value || '');\n      });\n    };\n  });\nangular.module('ui.bootstrap.modal', ['ui.bootstrap.transition'])\n\n/**\n * A helper, internal data structure that acts as a map but also allows getting / removing\n * elements in the LIFO order\n */\n  .factory('$$stackedMap', function () {\n    return {\n      createNew: function () {\n        var stack = [];\n\n        return {\n          add: function (key, value) {\n            stack.push({\n              key: key,\n              value: value\n            });\n          },\n          get: function (key) {\n            for (var i = 0; i < stack.length; i++) {\n              if (key == stack[i].key) {\n                return stack[i];\n              }\n            }\n          },\n          keys: function() {\n            var keys = [];\n            for (var i = 0; i < stack.length; i++) {\n              keys.push(stack[i].key);\n            }\n            return keys;\n          },\n          top: function () {\n            return stack[stack.length - 1];\n          },\n          remove: function (key) {\n            var idx = -1;\n            for (var i = 0; i < stack.length; i++) {\n              if (key == stack[i].key) {\n                idx = i;\n                break;\n              }\n            }\n            return stack.splice(idx, 1)[0];\n          },\n          removeTop: function () {\n            return stack.splice(stack.length - 1, 1)[0];\n          },\n          length: function () {\n            return stack.length;\n          }\n        };\n      }\n    };\n  })\n\n/**\n * A helper directive for the $modal service. It creates a backdrop element.\n */\n  .directive('modalBackdrop', ['$timeout', function ($timeout) {\n    return {\n      restrict: 'EA',\n      replace: true,\n      templateUrl: 'template/modal/backdrop.html',\n      link: function (scope, element, attrs) {\n        scope.backdropClass = attrs.backdropClass || '';\n\n        scope.animate = false;\n\n        //trigger CSS transitions\n        $timeout(function () {\n          scope.animate = true;\n        });\n      }\n    };\n  }])\n\n  .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) {\n    return {\n      restrict: 'EA',\n      scope: {\n        index: '@',\n        animate: '='\n      },\n      replace: true,\n      transclude: true,\n      templateUrl: function(tElement, tAttrs) {\n        return tAttrs.templateUrl || 'template/modal/window.html';\n      },\n      link: function (scope, element, attrs) {\n        element.addClass(attrs.windowClass || '');\n        scope.size = attrs.size;\n\n        // moved from template to fix issue #2280\n        element.on('click', function(evt) {\n          scope.close(evt);\n        });\n\n        $modalStack.registerObserverCallback(function(hiddenBySingle) {\n          scope.hiddenBySingle = hiddenBySingle || false;\n        });\n\n        $timeout(function () {\n          // trigger CSS transitions\n          scope.animate = true;\n\n          /**\n           * Auto-focusing of a freshly-opened modal element causes any child elements\n           * with the autofocus attribute to lose focus. This is an issue on touch\n           * based devices which will show and then hide the onscreen keyboard.\n           * Attempts to refocus the autofocus element via JavaScript will not reopen\n           * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus\n           * the modal element if the modal does not contain an autofocus element.\n           */\n          if (!element[0].querySelectorAll('[autofocus]').length) {\n            element[0].focus();\n          }\n        });\n\n        scope.close = function (evt) {\n          var modal = $modalStack.getTop();\n          if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) {\n            evt.preventDefault();\n            evt.stopPropagation();\n            $modalStack.dismiss(modal.key, 'backdrop click');\n          }\n        };\n      }\n    };\n  }])\n\n  .directive('modalTransclude', function () {\n    return {\n      link: function($scope, $element, $attrs, controller, $transclude) {\n        $transclude($scope.$parent, function(clone) {\n          $element.empty();\n          $element.append(clone);\n        });\n      }\n    };\n  })\n\n  .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap',\n    function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) {\n\n      var OPENED_MODAL_CLASS = 'modal-open';\n\n      var backdropDomEl, backdropScope;\n      var openedWindows = $$stackedMap.createNew();\n      var $modalStack = {};\n      var observerCallbacks = [];\n\n      function notifyObservers() {\n        angular.forEach(observerCallbacks, function(callback, index) {\n          var hasSingleParent = false,\n              opened = openedWindows.keys();\n\n          for (var i = 0; i < opened.length; i++) {\n            var item = openedWindows.get(opened[i]).value;\n\n            if (item.backdrop == 'single' && item.index > index) {\n              hasSingleParent = true;\n              break;\n            }\n          }\n\n          callback(hasSingleParent);\n        });\n      };\n\n      function backdropIndex() {\n        var topBackdropIndex = -1;\n        var opened = openedWindows.keys();\n        for (var i = 0; i < opened.length; i++) {\n          if (openedWindows.get(opened[i]).value.backdrop) {\n            topBackdropIndex = i;\n          }\n        }\n        return topBackdropIndex;\n      }\n\n      $rootScope.$watch(backdropIndex, function(newBackdropIndex){\n        if (backdropScope) {\n          backdropScope.index = newBackdropIndex;\n        }\n      });\n\n      function removeModalWindow(modalInstance) {\n        var body = $document.find('body').eq(0);\n        var modalWindow = openedWindows.get(modalInstance).value;\n\n        //clean up the stack\n        openedWindows.remove(modalInstance);\n\n        //clean up the observer\n        observerCallbacks.splice(modalWindow.index, 1);\n\n        //remove window DOM element\n        removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 0, function() {\n          modalWindow.modalScope.$destroy();\n          body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0);\n          checkRemoveBackdrop();\n        });\n      }\n\n      function checkRemoveBackdrop() {\n          //remove backdrop if no longer needed\n          if (backdropDomEl && backdropIndex() == -1) {\n            var backdropScopeRef = backdropScope;\n            removeAfterAnimate(backdropDomEl, backdropScope, 0, function () {\n              backdropScopeRef.$destroy();\n              backdropScopeRef = null;\n            });\n            backdropDomEl = undefined;\n            backdropScope = undefined;\n          } else {\n            notifyObservers();\n          }\n      }\n\n      function removeAfterAnimate(domEl, scope, emulateTime, done) {\n        // Closing animation\n        scope.animate = false;\n\n        var transitionEndEventName = $transition.transitionEndEventName;\n        if (transitionEndEventName) {\n          // transition out\n          var timeout = $timeout(afterAnimating, emulateTime);\n\n          domEl.bind(transitionEndEventName, function () {\n            $timeout.cancel(timeout);\n            afterAnimating();\n            scope.$apply();\n          });\n        } else {\n          // Ensure this call is async\n          $timeout(afterAnimating);\n        }\n\n        function afterAnimating() {\n          if (afterAnimating.done) {\n            return;\n          }\n          afterAnimating.done = true;\n\n          domEl.remove();\n          if (done) {\n            done();\n          }\n        }\n      }\n\n      $document.bind('keydown', function (evt) {\n        var modal;\n\n        if (evt.which === 27) {\n          modal = openedWindows.top();\n          if (modal && modal.value.keyboard) {\n            evt.preventDefault();\n            $rootScope.$apply(function () {\n              $modalStack.dismiss(modal.key, 'escape key press');\n            });\n          }\n        }\n      });\n\n      $modalStack.registerObserverCallback = function(callback){\n        observerCallbacks.push(callback);\n      };\n\n      $modalStack.open = function (modalInstance, modal) {\n        openedWindows.add(modalInstance, {\n          deferred: modal.deferred,\n          modalScope: modal.scope,\n          backdrop: modal.backdrop,\n          keyboard: modal.keyboard\n        });\n\n        var body = $document.find('body').eq(0),\n            currBackdropIndex = backdropIndex();\n\n        if (currBackdropIndex >= 0 && !backdropDomEl) {\n          backdropScope = $rootScope.$new(true);\n          backdropScope.index = currBackdropIndex;\n          var angularBackgroundDomEl = angular.element('<div modal-backdrop></div>');\n          angularBackgroundDomEl.attr('backdrop-class', modal.backdropClass);\n          backdropDomEl = $compile(angularBackgroundDomEl)(backdropScope);\n          body.append(backdropDomEl);\n        }\n\n        var angularDomEl = angular.element('<div modal-window></div>'),\n            index = openedWindows.length() - 1;\n\n        angularDomEl.attr({\n          'template-url': modal.windowTemplateUrl,\n          'window-class': modal.windowClass,\n          'size': modal.size,\n          'index': index,\n          'animate': 'animate'\n        }).html(modal.content);\n\n        var modalDomEl = $compile(angularDomEl)(modal.scope);\n        openedWindows.top().value.modalDomEl = modalDomEl;\n        openedWindows.top().value.index = index;\n        body.append(modalDomEl);\n        body.addClass(OPENED_MODAL_CLASS);\n\n        notifyObservers();\n      };\n\n      $modalStack.close = function (modalInstance, result) {\n        var modalWindow = openedWindows.get(modalInstance);\n        if (modalWindow) {\n          modalWindow.value.deferred.resolve(result);\n          removeModalWindow(modalInstance);\n        }\n      };\n\n      $modalStack.dismiss = function (modalInstance, reason) {\n        var modalWindow = openedWindows.get(modalInstance);\n        if (modalWindow) {\n          modalWindow.value.deferred.reject(reason);\n          removeModalWindow(modalInstance);\n        }\n      };\n\n      $modalStack.dismissAll = function (reason) {\n        var topModal = this.getTop();\n        while (topModal) {\n          this.dismiss(topModal.key, reason);\n          topModal = this.getTop();\n        }\n      };\n\n      $modalStack.getTop = function () {\n        return openedWindows.top();\n      };\n\n      return $modalStack;\n    }])\n\n  .provider('$modal', function () {\n\n    var $modalProvider = {\n      options: {\n        backdrop: true, //can be also false or 'static'\n        keyboard: true\n      },\n      $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack',\n        function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) {\n\n          var $modal = {};\n\n          function getTemplatePromise(options) {\n            return options.template ? $q.when(options.template) :\n              $http.get(angular.isFunction(options.templateUrl) ? (options.templateUrl)() : options.templateUrl,\n                {cache: $templateCache}).then(function (result) {\n                  return result.data;\n              });\n          }\n\n          function getResolvePromises(resolves) {\n            var promisesArr = [];\n            angular.forEach(resolves, function (value) {\n              if (angular.isFunction(value) || angular.isArray(value)) {\n                promisesArr.push($q.when($injector.invoke(value)));\n              }\n            });\n            return promisesArr;\n          }\n\n          $modal.open = function (modalOptions) {\n\n            var modalResultDeferred = $q.defer();\n            var modalOpenedDeferred = $q.defer();\n\n            //prepare an instance of a modal to be injected into controllers and returned to a caller\n            var modalInstance = {\n              result: modalResultDeferred.promise,\n              opened: modalOpenedDeferred.promise,\n              close: function (result) {\n                $modalStack.close(modalInstance, result);\n              },\n              dismiss: function (reason) {\n                $modalStack.dismiss(modalInstance, reason);\n              }\n            };\n\n            //merge and clean up options\n            modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\n            modalOptions.resolve = modalOptions.resolve || {};\n\n            //verify options\n            if (!modalOptions.template && !modalOptions.templateUrl) {\n              throw new Error('One of template or templateUrl options is required.');\n            }\n\n            var templateAndResolvePromise =\n              $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));\n\n\n            templateAndResolvePromise.then(function resolveSuccess(tplAndVars) {\n\n              var modalScope = (modalOptions.scope || $rootScope).$new();\n              modalScope.$close = modalInstance.close;\n              modalScope.$dismiss = modalInstance.dismiss;\n\n              var ctrlInstance, ctrlLocals = {};\n              var resolveIter = 1;\n\n              //controllers\n              if (modalOptions.controller) {\n                ctrlLocals.$scope = modalScope;\n                ctrlLocals.$modalInstance = modalInstance;\n                angular.forEach(modalOptions.resolve, function (value, key) {\n                  ctrlLocals[key] = tplAndVars[resolveIter++];\n                });\n\n                ctrlInstance = $controller(modalOptions.controller, ctrlLocals);\n                if (modalOptions.controllerAs) {\n                  modalScope[modalOptions.controllerAs] = ctrlInstance;\n                }\n              }\n\n              $modalStack.open(modalInstance, {\n                scope: modalScope,\n                deferred: modalResultDeferred,\n                content: tplAndVars[0],\n                backdrop: modalOptions.backdrop,\n                keyboard: modalOptions.keyboard,\n                backdropClass: modalOptions.backdropClass,\n                windowClass: modalOptions.windowClass,\n                windowTemplateUrl: modalOptions.windowTemplateUrl,\n                size: modalOptions.size\n              });\n\n            }, function resolveError(reason) {\n              modalResultDeferred.reject(reason);\n            });\n\n            templateAndResolvePromise.then(function () {\n              modalOpenedDeferred.resolve(true);\n            }, function () {\n              modalOpenedDeferred.reject(false);\n            });\n\n            return modalInstance;\n          };\n\n          return $modal;\n        }]\n    };\n\n    return $modalProvider;\n  });\n\nangular.module('ui.bootstrap.transition', [])\n\n/**\n * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete.\n * @param  {DOMElement} element  The DOMElement that will be animated.\n * @param  {string|object|function} trigger  The thing that will cause the transition to start:\n *   - As a string, it represents the css class to be added to the element.\n *   - As an object, it represents a hash of style attributes to be applied to the element.\n *   - As a function, it represents a function to be called that will cause the transition to occur.\n * @return {Promise}  A promise that is resolved when the transition finishes.\n */\n.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) {\n\n  var $transition = function(element, trigger, options) {\n    options = options || {};\n    var deferred = $q.defer();\n    var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName'];\n\n    var transitionEndHandler = function(event) {\n      $rootScope.$apply(function() {\n        element.unbind(endEventName, transitionEndHandler);\n        deferred.resolve(element);\n      });\n    };\n\n    if (endEventName) {\n      element.bind(endEventName, transitionEndHandler);\n    }\n\n    // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur\n    $timeout(function() {\n      if ( angular.isString(trigger) ) {\n        element.addClass(trigger);\n      } else if ( angular.isFunction(trigger) ) {\n        trigger(element);\n      } else if ( angular.isObject(trigger) ) {\n        element.css(trigger);\n      }\n      //If browser does not support transitions, instantly resolve\n      if ( !endEventName ) {\n        deferred.resolve(element);\n      }\n    });\n\n    // Add our custom cancel function to the promise that is returned\n    // We can call this if we are about to run a new transition, which we know will prevent this transition from ending,\n    // i.e. it will therefore never raise a transitionEnd event for that transition\n    deferred.promise.cancel = function() {\n      if ( endEventName ) {\n        element.unbind(endEventName, transitionEndHandler);\n      }\n      deferred.reject('Transition cancelled');\n    };\n\n    return deferred.promise;\n  };\n\n  // Work out the name of the transitionEnd event\n  var transElement = document.createElement('trans');\n  var transitionEndEventNames = {\n    'WebkitTransition': 'webkitTransitionEnd',\n    'MozTransition': 'transitionend',\n    'OTransition': 'oTransitionEnd',\n    'transition': 'transitionend'\n  };\n  var animationEndEventNames = {\n    'WebkitTransition': 'webkitAnimationEnd',\n    'MozTransition': 'animationend',\n    'OTransition': 'oAnimationEnd',\n    'transition': 'animationend'\n  };\n  function findEndEventName(endEventNames) {\n    for (var name in endEventNames){\n      if (transElement.style[name] !== undefined) {\n        return endEventNames[name];\n      }\n    }\n  }\n  $transition.transitionEndEventName = findEndEventName(transitionEndEventNames);\n  $transition.animationEndEventName = findEndEventName(animationEndEventNames);\n  return $transition;\n}]);\n\nangular.module(\"template/tooltip/tooltip-html-unsafe-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tooltip/tooltip-html-unsafe-popup.html\",\n    \"<div class=\\\"tooltip {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"  <div class=\\\"tooltip-inner\\\" bind-html-unsafe=\\\"content\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/tooltip/tooltip-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tooltip/tooltip-popup.html\",\n    \"<div class=\\\"tooltip {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"  <div class=\\\"tooltip-inner\\\" ng-bind=\\\"content\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/modal/backdrop.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/modal/backdrop.html\",\n    \"<div class=\\\"modal-backdrop fade {{ backdropClass }}\\\"\\n\" +\n    \"     ng-class=\\\"{in: animate}\\\"\\n\" +\n    \"     ng-style=\\\"{'z-index': 1040 + (index && 1 || 0) + index*10}\\\"\\n\" +\n    \"></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/modal/window.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/modal/window.html\",\n    \"<div tabindex=\\\"-1\\\" role=\\\"dialog\\\" class=\\\"modal fade\\\" ng-class=\\\"{in: animate}\\\" ng-style=\\\"{'z-index': 1050 + index*10, display: hiddenBySingle ? 'none' : 'block'}\\\">\\n\" +\n    \"  <div class=\\\"modal_close_wrap\\\" ng-click=\\\"close($event)\\\">\\n\" +\n    \"    <div class=\\\"modal_close\\\"></div>\\n\" +\n    \"  </div>\\n\" +\n    \"    <div class=\\\"modal-dialog\\\" ng-class=\\\"{'modal-sm': size == 'sm', 'modal-lg': size == 'lg'}\\\"><div class=\\\"modal-content\\\" modal-transclude></div></div>\\n\" +\n     \"</div>\");\n}]);\n"
  },
  {
    "path": "app/vendor/zlib/THIRDPARTY_LICENSE",
    "content": "/**\n * @license\n * zlib.js\n * JavaScript Zlib Library\n * https://github.com/imaya/zlib.js\n *\n * The MIT License\n *\n * Copyright (c) 2012 imaya\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n"
  },
  {
    "path": "app/webogram.appcache",
    "content": "CACHE MANIFEST\n\n# 78\n\nNETWORK:\n*\n"
  },
  {
    "path": "gulpfile.js",
    "content": "var packageJson = require('./package.json')\nvar gulp = require('gulp')\nvar $ = require('gulp-load-plugins')({ lazy: false })\nvar path = require('path')\nvar http = require('http')\nvar st = require('st')\nvar del = require('del')\nvar swPrecache = require('sw-precache')\nvar Server = require('karma').Server\n\n// The generated file is being created at src\n// so it can be fetched by usemin.\ngulp.task('templates', function () {\n  return gulp.src('app/partials/**/*.html')\n    .pipe($.angularTemplatecache('templates.js', {\n      root: 'partials',\n      module: 'myApp.templates',\n      standalone: true\n    }))\n    .pipe(gulp.dest('app/js'))\n})\n\ngulp.task('clean-templates', function () {\n  return del(['app/js/templates.js'])\n})\n\ngulp.task('usemin-index', function () {\n  return gulp.src('app/index.html')\n    .pipe($.usemin({\n      html: [$.minifyHtml({ empty: true })],\n      js: ['concat', $.ngAnnotate(), $.uglify({ outSourceMap: false })],\n      css: ['concat', $.minifyCss({ compatibility: true, keepBreaks: true })]\n    }))\n    .pipe(gulp.dest('dist'))\n})\n\ngulp.task('usemin-badbrowser', function () {\n  return gulp.src('app/badbrowser.html')\n    .pipe($.usemin({\n      html: [$.minifyHtml({ empty: true })],\n      css: ['concat', $.minifyCss({ compatibility: true, keepBreaks: true })]\n    }))\n    .pipe(gulp.dest('dist'))\n})\n\n// ulimit -n 10240 on OS X\ngulp.task('imagemin', function () {\n  return gulp.src(['app/img/**/*', '!app/img/screenshot*', '!app/img/*.wav'])\n    .pipe($.imagemin())\n    .pipe(gulp.dest('dist/img'))\n})\n\ngulp.task('standard', function () {\n  return gulp.src(['app/**/*.js', '!app/vendor/**/*', 'gulpfile.js'])\n    .pipe($.standard())\n    .pipe($.standard.reporter('default', {\n      breakOnError: true\n    }))\n})\n\ngulp.task('copy-images', function () {\n  return gulp.src(['app/img/**/*', '!app/img/screenshot*', '!app/img/*.wav'])\n    .pipe(gulp.dest('dist/img'))\n})\n\ngulp.task('copy', gulp.parallel(\n  function () {\n    return gulp.src(['app/favicon.ico', 'app/favicon_unread.ico', 'app/manifest.webapp', 'app/manifest.webapp.json', 'app/manifest.json', 'app/**/*worker.js'])\n      .pipe(gulp.dest('dist'))\n  },\n  function () {\n    return gulp.src(['app/img/**/*.wav'])\n      .pipe(gulp.dest('dist/img'))\n  },\n  function () {\n    return gulp.src(['app/js/lib/polyfill.js', 'app/js/lib/bin_utils.js'])\n      .pipe(gulp.dest('dist/js/lib'))\n  },\n  function () {\n    return gulp.src('app/vendor/closure/long.js')\n      .pipe(gulp.dest('dist/vendor/closure'))\n  },\n  function () {\n    return gulp.src(['app/css/desktop.css', 'app/css/mobile.css'])\n      .pipe(gulp.dest('dist/css'))\n  },\n  function () {\n    return gulp.src('app/vendor/jsbn/jsbn_combined.js')\n      .pipe(gulp.dest('dist/vendor/jsbn'))\n  },\n  function () {\n    return gulp.src('app/vendor/leemon_bigint/bigint.js')\n      .pipe(gulp.dest('dist/vendor/leemon_bigint'))\n  },\n  function () {\n    return gulp.src('app/vendor/rusha/rusha.js')\n      .pipe(gulp.dest('dist/vendor/rusha'))\n  },\n  function () {\n    return gulp.src('app/vendor/cryptoJS/crypto.js')\n      .pipe(gulp.dest('dist/vendor/cryptoJS'))\n  },\n  function () {\n    return gulp.src(['app/nacl/mtproto_crypto.pexe', 'app/nacl/mtproto_crypto.nmf'])\n      .pipe(gulp.dest('dist/nacl/'))\n  },\n  function () {\n    return gulp.src('app/js/background.js')\n      .pipe(gulp.dest('dist/js'))\n  }\n))\n\ngulp.task('copy-locales', function (callback) {\n  var langpackSrc = []\n  var ngSrc = []\n\n  packageJson.locales.forEach(function (locale) {\n    langpackSrc.push('app/js/locales/' + locale + '.json')\n    ngSrc.push('app/vendor/angular/i18n/angular-locale_' + locale + '.js')\n  })\n  gulp.parallel(\n    function () {\n      return gulp.src(langpackSrc)\n        .pipe(gulp.dest('dist/js/locales/'))\n    },\n    function () {\n      return gulp.src(ngSrc)\n        .pipe(gulp.dest('dist/vendor/angular/i18n/'))\n    }\n  )(callback)\n})\n\ngulp.task('clean', function () {\n  return del(['dist/*', 'app/js/templates.js', 'app/css/*', '!dist/.git'])\n})\n\ngulp.task('less', function () {\n  return gulp.src('app/less/*.less')\n    .pipe($.less({\n      paths: [path.join(__dirname, 'less', 'includes')],\n      javascriptEnabled: true\n    }))\n    .pipe(gulp.dest('app/css'))\n})\n\ngulp.task('disable-production', gulp.parallel(\n  function () {\n    return gulp.src('app/index.html')\n      .pipe($.replace(/PRODUCTION_ONLY_BEGIN-->/g, 'PRODUCTION_ONLY_BEGIN'))\n      .pipe($.replace(/<!--PRODUCTION_ONLY_END/g, 'PRODUCTION_ONLY_END'))\n      .pipe(gulp.dest('app'))\n  },\n  function () {\n    return gulp.src('app/**/*.js')\n      .pipe($.replace(/PRODUCTION_ONLY_BEGIN(\\*\\/)?/g, 'PRODUCTION_ONLY_BEGIN'))\n      .pipe($.replace(/(\\/\\*)?PRODUCTION_ONLY_END/g, 'PRODUCTION_ONLY_END'))\n      .pipe(gulp.dest('app'))\n  }\n))\n\ngulp.task('enable-production', gulp.parallel(\n  function () {\n    return gulp.src('app/**/*.html')\n      .pipe($.replace(/PRODUCTION_ONLY_BEGIN/g, 'PRODUCTION_ONLY_BEGIN-->'))\n      .pipe($.replace(/PRODUCTION_ONLY_END/, '<!--PRODUCTION_ONLY_END'))\n      .pipe(gulp.dest('app'))\n  },\n  function () {\n    return gulp.src('app/**/*.js')\n      .pipe($.replace(/PRODUCTION_ONLY_BEGIN(\\*\\/)?/g, 'PRODUCTION_ONLY_BEGIN*/'))\n      .pipe($.replace(/(\\/\\*)?PRODUCTION_ONLY_END/g, '/*PRODUCTION_ONLY_END'))\n      .pipe(gulp.dest('app'))\n  }\n))\n\ngulp.task('build', gulp.series(\n  'clean',\n  gulp.parallel('less', 'templates'),\n  'enable-production',\n  'usemin-index',\n  'usemin-badbrowser',\n  gulp.parallel('copy', 'copy-locales', 'copy-images', 'disable-production'),\n  'clean-templates'\n))\n\ngulp.task('compress-dist', gulp.series('build', function () {\n  return gulp.src('**/*', { cwd: path.join(process.cwd(), '/dist') })\n    .pipe($.zip('webogram_v' + packageJson.version + '.zip'))\n    .pipe(gulp.dest('releases'))\n}))\n\ngulp.task('cleanup-dist', gulp.series('compress-dist', function () {\n  return del(['releases/**/*', '!releases/*.zip'])\n}))\n\ngulp.task('bump-version-manifests', function () {\n  return gulp.src(['app/manifest.webapp', 'app/manifest.json'])\n    .pipe($.replace(/\"version\": \".*\",/, '\"version\": \"' + packageJson.version + '\",'))\n    .pipe(gulp.dest('app'))\n})\n\ngulp.task('bump-version-config', function () {\n  return gulp.src('app/js/lib/config.js')\n    .pipe($.replace(/version: '.*?'/, \"version: '\" + packageJson.version + \"'\"))\n    .pipe(gulp.dest('app/js/lib'))\n})\n\ngulp.task('bump-version-comments', function () {\n  return gulp.src('app/**/*.js')\n    .pipe($.replace(/Webogram v[0-9.]*/, 'Webogram v' + packageJson.version))\n    .pipe(gulp.dest('app'))\n})\n\nvar fileGlobs = [\n  './dist/**/*',\n  '!dist/manifest.*',\n  '!dist/*.html',\n  '!dist/fonts/*',\n  '!dist/img/icons/icon*.png',\n  '!dist/js/background.js',\n  '!dist/css/badbrowser.css'\n]\n\nfunction writeServiceWorkerFile (rootDir, handleFetch, callback) {\n  var config = {\n    cacheId: packageJson.name,\n    handleFetch: handleFetch,\n    staticFileGlobs: fileGlobs,\n    stripPrefix: './' + rootDir + '/',\n    importScripts: ['js/lib/push_worker.js'],\n    verbose: true,\n    maximumFileSizeToCacheInBytes: 3004152, // about 3MB, default is \"2097152\" 2MB,\n    navigateFallback: 'index.html'\n  }\n  swPrecache.write(path.join(rootDir, 'service_worker.js'), config, callback)\n}\n\ngulp.task('generate-service-worker', gulp.series('build', function (callback) {\n  writeServiceWorkerFile('dist', true, callback)\n}))\n\ngulp.task('add-appcache-manifest', gulp.series('build', function () {\n  return gulp.src(fileGlobs)\n    .pipe($.manifest3({\n      timestamp: false,\n      hash: true,\n      network: ['http://*', 'https://*', '*'],\n      filename: 'webogram.appcache',\n      exclude: ['webogram.appcache', 'app.manifest']\n    })\n    )\n    .pipe(gulp.dest('./dist'))\n}))\n\ngulp.task('package-dev', gulp.parallel(\n  function () {\n    return gulp.src('app/partials/*.html')\n      .pipe($.angularTemplatecache('templates.js', {\n        root: 'partials',\n        module: 'myApp.templates',\n        standalone: true\n      }))\n      .pipe(gulp.dest('dist_package/js'));\n  },\n  function () {\n    return gulp.src(['app/favicon.ico', 'app/favicon_unread.ico', 'app/manifest.webapp', 'app/manifest.json'])\n      .pipe(gulp.dest('dist_package'));\n  },\n  function () {\n    return gulp.src(['app/css/**/*'])\n      .pipe(gulp.dest('dist_package/css'));\n  },\n  function () {\n    return gulp.src(['app/img/**/*'])\n      .pipe(gulp.dest('dist_package/img'));\n  },\n  function () {\n    return gulp.src('app/vendor/**/*')\n      .pipe(gulp.dest('dist_package/vendor'));\n  },\n  function () {\n    return gulp.src('app/**/*.json')\n      .pipe(gulp.dest('dist_package'));\n  },\n  function () {\n    return gulp.src('app/**/*.html')\n      .pipe($.replace(/PRODUCTION_ONLY_BEGIN/g, 'PRODUCTION_ONLY_BEGIN-->'))\n      .pipe($.replace(/PRODUCTION_ONLY_END/, '<!--PRODUCTION_ONLY_END'))\n      .pipe(gulp.dest('dist_package'));\n  },\n\n  function () {\n    return gulp.src('app/**/*.js')\n      .pipe($.ngAnnotate())\n      .pipe($.replace(/PRODUCTION_ONLY_BEGIN(\\*\\/)?/g, 'PRODUCTION_ONLY_BEGIN*/'))\n      .pipe($.replace(/(\\/\\*)?PRODUCTION_ONLY_END/g, '/*PRODUCTION_ONLY_END'))\n      .pipe(gulp.dest('dist_package'));\n  }\n)\n)\n\ngulp.task('watchcss', function () {\n  return gulp.src('app/css/*.css')\n    .pipe($.livereload())\n})\n\ngulp.task('watchhtml', function () {\n  return gulp.src('app/partials/**/*.html')\n    .pipe($.livereload())\n})\n\ngulp.task('server', function (done) {\n  http.createServer(\n    st({ path: __dirname, index: 'index.html', cache: false })\n  ).listen(8000, done)\n})\n\ngulp.task('watch', gulp.series(gulp.parallel('server', 'less'), function () {\n  $.livereload.listen({ basePath: 'app' })\n  gulp.watch('app/css/*.css', gulp.series('watchcss'))\n  gulp.watch('app/less/**/*.less', gulp.series('less'))\n  gulp.watch('app/partials/**/*.html', gulp.series('watchhtml'))\n}))\n\ngulp.task('bump', gulp.series(gulp.parallel('bump-version-manifests', 'bump-version-config'), function () {\n  gulp.start('bump-version-comments')\n}))\n\n// Single run of karma\ngulp.task('karma-single', function (done) {\n  new Server({\n    configFile: path.join(__dirname, '/karma.conf.js'),\n    singleRun: true\n  }, done).start()\n})\n\n// Continuous testing with karma by watching for changes\ngulp.task('karma-tdd', function (done) {\n  new Server({\n    configFile: path.join(__dirname, '/karma.conf.js')\n  }, done).start()\n})\n\ngulp.task('test', gulp.series('templates', 'karma-single', 'clean-templates'))\n\ngulp.task('tdd', gulp.series('templates', 'karma-tdd'))\n\ngulp.task('package', gulp.series('cleanup-dist'))\n\ngulp.task('publish', gulp.series('add-appcache-manifest', 'generate-service-worker'))\n\ngulp.task('default', gulp.series('build'))\n"
  },
  {
    "path": "karma.conf.js",
    "content": "// Karma configuration\n// Generated on Thu Dec 15 2016 21:12:39 GMT+0100 (CET)\n\nmodule.exports = function (config) {\n  config.set({\n\n    // base path that will be used to resolve all patterns (eg. files, exclude)\n    basePath: 'app',\n\n\n    // frameworks to use\n    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter\n    frameworks: ['jasmine'],\n\n\n    // list of files / patterns to load in the browser\n    // Load files to access global variables\n    files: [\n      {pattern: 'js/lib/polyfill.js', watched: false},\n      {pattern: 'vendor/jquery/jquery.min.js', watched: false},\n      {pattern: 'js/lib/config.js', watched: false},\n      {pattern: 'vendor/jquery.nanoscroller/nanoscroller.js', watched: false},\n      {pattern: 'vendor/angular/angular.js', watched: false},\n      {pattern: 'vendor/angular/angular-mocks.js', watched: false},\n      {pattern: 'vendor/angular/angular-route.js', watched: false},\n      {pattern: 'vendor/angular/angular-animate.js', watched: false},\n      {pattern: 'vendor/angular/angular-sanitize.js', watched: false},\n      {pattern: 'vendor/angular/angular-touch.js', watched: false},\n      {pattern: 'vendor/ui-bootstrap/ui-bootstrap-custom-tpls-0.12.0.js', watched: false},\n      {pattern: 'vendor/angular-media-player/angular-media-player.js', watched: false},\n      {pattern: 'vendor/jsbn/jsbn_combined.js', watched: false},\n      {pattern: 'vendor/cryptoJS/crypto.js', watched: false},\n      {pattern: 'vendor/rusha/rusha.js', watched: false},\n      {pattern: 'vendor/zlib/gunzip.min.js', watched: false},\n      {pattern: 'vendor/closure/long.js', watched: false},\n      {pattern: 'vendor/leemon_bigint/bigint.js', watched: false},\n      {pattern: 'vendor/libwebpjs/libwebp-0.2.0.js', watched: false},\n      {pattern: 'vendor/angularjs-toaster/toaster.js', watched: false},\n      {pattern: 'vendor/clipboard/clipboard.js', watched: false},\n      {pattern: 'js/lib/utils.js', watched: false},\n      {pattern: 'js/lib/bin_utils.js', watched: false},\n      {pattern: 'js/lib/tl_utils.js', watched: false},\n      {pattern: 'js/lib/ng_utils.js', watched: false},\n      {pattern: 'js/lib/i18n.js', watched: false},\n      {pattern: 'js/lib/mtproto.js', watched: false},\n      {pattern: 'js/lib/mtproto_wrapper.js', watched: false},\n      {pattern: 'js/locales/*.json', watched: false, served: true, included: false},\n      {pattern: '../test/test-init.js', watched: false},\n      'js/templates.js',  // Generated by `gulp templates`\n      'js/services.js',\n      'js/filters.js',\n      'js/controllers.js',\n      'js/directives.js',\n      '../test/unit/**/*.js'\n    ],\n\n\n    // list of files to exclude\n    exclude: [\n      'js/background.js'\n    ],\n\n\n    // preprocess matching files before serving them to the browser\n    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor\n    preprocessors: {\n        'js/*.js': ['coverage']\n    },\n\n\n    // test results reporter to use\n    // possible values: 'dots', 'progress'\n    // available reporters: https://npmjs.org/browse/keyword/karma-reporter\n    reporters: ['progress', 'coverage'],\n\n\n    coverageReporter: {\n        type: 'text',\n        dir: 'coverage/'\n    },\n\n\n    // web server port\n    port: 9876,\n\n\n    // enable / disable colors in the output (reporters and logs)\n    colors: true,\n\n\n    // level of logging\n    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG\n    logLevel: config.LOG_INFO,\n\n\n    // enable / disable watching file and executing tests whenever any file changes\n    autoWatch: true,\n\n\n    // start these browsers\n    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher\n    browsers: ['PhantomJS'],\n\n\n    // Continuous Integration mode\n    // if true, Karma captures browsers, runs the tests and exits\n    singleRun: false,\n\n    // Concurrency level\n    // how many browser should be started simultaneous\n    concurrency: Infinity\n  })\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"Telegram\",\n  \"description\": \"Telegram Web App.\\nMore info & source code here: https://github.com/zhukov/webogram\",\n  \"version\": \"0.7.0\",\n  \"main\": \"app/index.html\",\n  \"single-instance\": true,\n  \"dom_storage_quota\": 40,\n  \"window\": {\n    \"title\": \"Telegram\",\n    \"icon\": \"app/img/icons/icon128.png\",\n    \"toolbar\": false,\n    \"frame\": true,\n    \"position\": \"center\",\n    \"resizable\": true,\n    \"width\": 800,\n    \"min_width\": 675,\n    \"height\": 650,\n    \"min_height\": 650,\n    \"show\": true\n  },\n  \"scripts\": {\n    \"clean\": \"gulp clean\",\n    \"start\": \"gulp watch\",\n    \"test\": \"gulp test\",\n    \"build\": \"gulp publish\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/zhukov/webogram.git\"\n  },\n  \"author\": \"zhukov\",\n  \"license\": \"GPL-3.0\",\n  \"bugs\": {\n    \"url\": \"https://github.com/zhukov/webogram/issues\"\n  },\n  \"locales\": [\n    \"en-us\",\n    \"es-es\",\n    \"de-de\",\n    \"it-it\",\n    \"ru-ru\",\n    \"nl-nl\",\n    \"pt-br\"\n  ],\n  \"homepage\": \"http://zhukov.github.io/webogram\",\n  \"devDependencies\": {\n    \"del\": \"^4.1.1\",\n    \"gulp\": \"^4.0.2\",\n    \"gulp-angular-templatecache\": \"^3.0.0\",\n    \"gulp-concat\": \"^2.1.7\",\n    \"gulp-grep-stream\": \"0.0.2\",\n    \"gulp-imagemin\": \"^5.0.3\",\n    \"gulp-less\": \"^4.0.1\",\n    \"gulp-livereload\": \"^4.0.1\",\n    \"gulp-load-plugins\": \"^2.0.1\",\n    \"gulp-manifest3\": \"0.1.2\",\n    \"gulp-minify-css\": \"^0.3.12\",\n    \"gulp-minify-html\": \"^0.1.1\",\n    \"gulp-ng-annotate\": \"~0.5.2\",\n    \"gulp-replace\": \"^0.2.0\",\n    \"gulp-rev\": \"^1.1.0\",\n    \"gulp-standard\": \"^7.0.1\",\n    \"gulp-uglify\": \"^1.0.2\",\n    \"gulp-usemin\": \"^0.3.29\",\n    \"gulp-zip\": \"^0.1.2\",\n    \"http\": \"0.0.0\",\n    \"jasmine-core\": \"^2.5.2\",\n    \"karma\": \"^4.1.0\",\n    \"karma-coverage\": \"^1.1.1\",\n    \"karma-jasmine\": \"^1.1.0\",\n    \"karma-phantomjs-launcher\": \"^1.0.2\",\n    \"phantomjs-prebuilt\": \"^2.1.14\",\n    \"st\": \">=1.2.2\",\n    \"sw-precache\": \"^3.2.0\"\n  },\n  \"standard\": {\n    \"globals\": [\n      \"angular\",\n      \"$\",\n      \"chrome\"\n    ]\n  },\n  \"dependencies\": {}\n}\n"
  },
  {
    "path": "scripts/cldr_localize.js",
    "content": "/* A little utility to translate Country names for Webogram.\n * You need to install nodejs.\n * Usage: node <thisfile> <languageCode> <inputFile> [outputFile]\n * If outputFile is not specified, inputFile will be overwritten.\n *\n * @author: Michele Locati <mlocati@gmail.com>\n * @licence: MIT\n */\ntry {\n\tvar fs = require('fs'), path = require('path');\n\n\tvar cldrFolder = path.join(__dirname, 'cldr');\n\tif(!(isDir(cldrFolder) && isDir(path.join(cldrFolder, 'main')))) {\n\t\t\tprocess.stderr.write('Please download the CLDR json data from http://cldr.unicode.org and extract it to the following directory:\\n' + cldrFolder + '\\n');\n\t\t\tprocess.exit(1);\n\t}\n\n\tvar locale, inputFile, outputFile = '';\n\tswitch(process.argv.length) {\n\t\tcase 5:\n\t\t\toutputFile = process.argv[4];\n\t\t\t/*-fallthrough*/\n\t\tcase 4:\n\t\t\tinputFile = process.argv[3];\n\t\t\tlocale = process.argv[2];\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tprocess.stderr.write('Syntax:\\n' + process.argv[0] + ' ' + path.basename(process.argv[1]) + ' <languageCode> <inputFile> [outputFile]' + '\\n');\n\t\t\tprocess.exit(1);\n\t}\n\n\tvar foundLocale = '';\n\tgetLocaleAlternatives(locale).every(function(loc) {\n\t\tif(isDir(path.join(cldrFolder, 'main', loc))) {\n\t\t\tfoundLocale = loc;\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\tif(foundLocale.length === 0) {\n\t\tprocess.stderr.write('Unable to find data folder for the \"' + locale + '\" language.');\n\t\tprocess.exit(1);\n\t}\n\tprocess.stdout.write('Found locale: ' + foundLocale + '\\n');\n\tvar territoryData = readJsonFromFile(path.join(cldrFolder, 'main', foundLocale, 'territories.json'));\n\tvar displayNames = territoryData.main[foundLocale].localeDisplayNames.territories;\n\tvar theData = readJsonFromFile(inputFile);\n\tvar inputKey, match, territoryID;\n\tfor(inputKey in theData) {\n\t\tif (theData.hasOwnProperty(inputKey)) {\n\t\t\tmatch = /^country_select_modal_country_([a-z]+)$/.exec(inputKey);\n\t\t\tif(match) {\n\t\t\t\tterritoryID = match[1].toUpperCase();\n\t\t\t\tprocess.stdout.write('Found territory: ' + territoryID + ' (' + theData[inputKey] + ')... ');\n\t\t\t\tif(displayNames.hasOwnProperty(territoryID)) {\n\t\t\t\t\tprocess.stdout.write('translated as \"' + displayNames[territoryID] + '\"\\n');\n\t\t\t\t\ttheData[inputKey] = displayNames[territoryID];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tprocess.stdout.write('NOT FOUND IN CLDR!\\n');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif(outputFile.length === 0) {\n\t\toutputFile = inputFile;\n\t}\n\twriteJsonToFile(outputFile, theData);\n\tprocess.stdout.write('File written: \"' + outputFile  + '\"!\\n');\n}\ncatch(e) {\n\tprocess.stderr.write(e.message + '\\n');\n\tprocess.exit(1);\n}\n\nfunction isFile(path) {\n\tvar r = false;\n\tif((typeof(path) === 'string') && (path.length > 0)) {\n\t\ttry {\n\t\t\tif(fs.existsSync(path)) {\n\t\t\t\tif(fs.lstatSync(path).isFile()) {\n\t\t\t\t\tr = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch(x) {\n\t\t}\n\t}\n\treturn r;\n}\n\nfunction isDir(path) {\n\tvar r = false;\n\tif((typeof(path) === 'string') && (path.length > 0)) {\n\t\ttry {\n\t\t\tif(fs.existsSync(path)) {\n\t\t\t\tif(fs.lstatSync(path).isDirectory()) {\n\t\t\t\t\tr = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch(x) {\n\t\t}\n\t}\n\treturn r;\n}\n\nfunction getLocaleAlternatives(locale) {\n\tvar language = '', script = '', territory = '';\n\tlocale.replace(/_/g, '-').split('-').forEach(function(chunk, index) {\n\t\tif(index === 0) {\n\t\t\tlanguage = chunk.toLowerCase();\n\t\t}\n\t\telse if(chunk.length === 4) {\n\t\t\tif(script.length > 0) {\n\t\t\t\tthrow new Error('\"' + locale + '\" is not a valid locale identifier');\n\t\t\t}\n\t\t\tscript = chunk.charAt(0).toUpperCase() + chunk.substr(1).toLowerCase();\n\t\t}\n\t\telse if(territory.length) {\n\t\t\tthrow new Error('\"' + locale + '\" is not a valid locale identifier');\n\t\t}\n\t\telse {\n\t\t\tif(/^[a-z]{2}$/i.test(chunk) || /^[0-9]{3}$/i.test(chunk)) {\n\t\t\t\tterritory = chunk.toUpperCase();\n\t\t\t}\n\t\t\telse {\n\t\t\tconsole.log(chunk);\n\t\t\t\tthrow new Error('\"' + locale + '\" is not a valid locale identifier');\n\t\t\t}\n\t\t}\n\t});\n\tif(language.length === 0) {\n\t\tthrow new Error('\"' + locale + '\" is not a valid locale identifier');\n\t}\n\tvar result = [];\n\tif((script.length > 0) && (territory.length > 0)) {\n\t\tresult.push([language, script, territory].join('-'));\n\t}\n\tif(script.length > 0) {\n\t\tresult.push([language, script].join('-'));\n\t}\n\tif(territory.length > 0) {\n\t\tresult.push([language, territory].join('-'));\n\t}\n\tresult.push(language);\n\treturn result;\n}\n\nfunction readJsonFromFile(path) {\n\tif(!isFile(path)) {\n\t\tthrow new Error('File not found: ' + path);\n\t}\n\tvar fileContents = fs.readFileSync(path), data;\n\ttry {\n\t\tdata = JSON.parse(fileContents);\n\t}\n\tcatch(e) {\n\t\tthrow new Error('Error reading JSON file ' + path + ':\\n' + e.message);\n\t}\n\treturn data;\n}\nfunction writeJsonToFile(path, data) {\n\tfs.writeFileSync(path, JSON.stringify(data, null, 4));\n}\n"
  },
  {
    "path": "scripts/emoji_data/build.php",
    "content": "<?\n  $in = file_get_contents('emoji.json');\n  $d = json_decode($in, true);\n\n\n  #\n  # build the catalog\n  #\n\n  $out = array();\n\n  foreach ($d as $row){\n    list($key) = explode('.', $row['image']);\n    $out[$key] = array(\n      calc_bytes($row['unified']),\n      $row['short_names'],\n    );\n    if ($row['text']) $out[$key][] = $row['text'];\n  }\n\n  $json = json_encode($out);\n  $json = str_replace('\\\\\\\\u', '\\\\u', $json);\n\n  echo $json;\n\n\n  #\n  # turn 0+ codepoints into a JS string\n  #\n\n  function calc_bytes($codes){\n    if (!$codes) return '';\n    $out = '';\n    $codes = explode('-', $codes);\n    foreach ($codes as $code){\n      $out .= format_codepoint($code);\n    }\n    return $out;\n  }\n\n\n  #\n  # turn a hex codepoint into a JS string\n  #\n\n  function format_codepoint($hex){\n\n    $code = hexdec($hex);\n\n    # simple codepoint\n    if ($code <= 0xFFFF) return \"\\\\u\".sprintf('%04X', $code);\n\n    # surrogate pair\n    $code -= 0x10000;\n    $byte1 = 0xD800 | (($code >> 10) & 0x3FF);\n    $byte2 = 0xDC00 | ($code & 0x3FF);\n\n    return \"\\\\u\".sprintf('%04X', $byte1).\"\\\\u\".sprintf('%04X', $byte2);\n  }"
  },
  {
    "path": "scripts/emoji_data/emoji.json",
    "content": "[{\"name\":\"COPYRIGHT SIGN\",\"unified\":\"00A9\",\"docomo\":\"E731\",\"au\":\"E558\",\"softbank\":\"E24E\",\"google\":\"FEB29\",\"image\":\"00a9.png\",\"sheet_x\":0,\"sheet_y\":11,\"short_name\":\"copyright\",\"short_names\":[\"copyright\"],\"text\":null},{\"name\":\"REGISTERED SIGN\",\"unified\":\"00AE\",\"docomo\":\"E736\",\"au\":\"E559\",\"softbank\":\"E24F\",\"google\":\"FEB2D\",\"image\":\"00ae.png\",\"sheet_x\":0,\"sheet_y\":12,\"short_name\":\"registered\",\"short_names\":[\"registered\"],\"text\":null},{\"name\":\"DOUBLE EXCLAMATION MARK\",\"unified\":\"203C\",\"docomo\":\"E704\",\"au\":\"EB30\",\"softbank\":\"\",\"google\":\"FEB06\",\"image\":\"203c.png\",\"sheet_x\":24,\"sheet_y\":7,\"short_name\":\"bangbang\",\"short_names\":[\"bangbang\"],\"text\":null},{\"name\":\"EXCLAMATION QUESTION MARK\",\"unified\":\"2049\",\"docomo\":\"E703\",\"au\":\"EB2F\",\"softbank\":\"\",\"google\":\"FEB05\",\"image\":\"2049.png\",\"sheet_x\":24,\"sheet_y\":8,\"short_name\":\"interrobang\",\"short_names\":[\"interrobang\"],\"text\":null},{\"name\":\"TRADE MARK SIGN\",\"unified\":\"2122\",\"docomo\":\"E732\",\"au\":\"E54E\",\"softbank\":\"E537\",\"google\":\"FEB2A\",\"image\":\"2122.png\",\"sheet_x\":24,\"sheet_y\":9,\"short_name\":\"tm\",\"short_names\":[\"tm\"],\"text\":null},{\"name\":\"INFORMATION SOURCE\",\"unified\":\"2139\",\"docomo\":\"\",\"au\":\"E533\",\"softbank\":\"\",\"google\":\"FEB47\",\"image\":\"2139.png\",\"sheet_x\":24,\"sheet_y\":10,\"short_name\":\"information_source\",\"short_names\":[\"information_source\"],\"text\":null},{\"name\":\"LEFT RIGHT ARROW\",\"unified\":\"2194\",\"docomo\":\"E73C\",\"au\":\"EB7A\",\"softbank\":\"\",\"google\":\"FEAF6\",\"image\":\"2194.png\",\"sheet_x\":24,\"sheet_y\":11,\"short_name\":\"left_right_arrow\",\"short_names\":[\"left_right_arrow\"],\"text\":null},{\"name\":\"UP DOWN ARROW\",\"unified\":\"2195\",\"docomo\":\"E73D\",\"au\":\"EB7B\",\"softbank\":\"\",\"google\":\"FEAF7\",\"image\":\"2195.png\",\"sheet_x\":24,\"sheet_y\":12,\"short_name\":\"arrow_up_down\",\"short_names\":[\"arrow_up_down\"],\"text\":null},{\"name\":\"NORTH WEST ARROW\",\"unified\":\"2196\",\"docomo\":\"E697\",\"au\":\"E54C\",\"softbank\":\"E237\",\"google\":\"FEAF2\",\"image\":\"2196.png\",\"sheet_x\":24,\"sheet_y\":13,\"short_name\":\"arrow_upper_left\",\"short_names\":[\"arrow_upper_left\"],\"text\":null},{\"name\":\"NORTH EAST ARROW\",\"unified\":\"2197\",\"docomo\":\"E678\",\"au\":\"E555\",\"softbank\":\"E236\",\"google\":\"FEAF0\",\"image\":\"2197.png\",\"sheet_x\":24,\"sheet_y\":14,\"short_name\":\"arrow_upper_right\",\"short_names\":[\"arrow_upper_right\"],\"text\":null},{\"name\":\"SOUTH EAST ARROW\",\"unified\":\"2198\",\"docomo\":\"E696\",\"au\":\"E54D\",\"softbank\":\"E238\",\"google\":\"FEAF1\",\"image\":\"2198.png\",\"sheet_x\":24,\"sheet_y\":15,\"short_name\":\"arrow_lower_right\",\"short_names\":[\"arrow_lower_right\"],\"text\":null},{\"name\":\"SOUTH WEST ARROW\",\"unified\":\"2199\",\"docomo\":\"E6A5\",\"au\":\"E556\",\"softbank\":\"E239\",\"google\":\"FEAF3\",\"image\":\"2199.png\",\"sheet_x\":24,\"sheet_y\":16,\"short_name\":\"arrow_lower_left\",\"short_names\":[\"arrow_lower_left\"],\"text\":null},{\"name\":\"LEFTWARDS ARROW WITH HOOK\",\"unified\":\"21A9\",\"docomo\":\"E6DA\",\"au\":\"E55D\",\"softbank\":\"\",\"google\":\"FEB83\",\"image\":\"21a9.png\",\"sheet_x\":24,\"sheet_y\":17,\"short_name\":\"leftwards_arrow_with_hook\",\"short_names\":[\"leftwards_arrow_with_hook\"],\"text\":null},{\"name\":\"RIGHTWARDS ARROW WITH HOOK\",\"unified\":\"21AA\",\"docomo\":\"\",\"au\":\"E55C\",\"softbank\":\"\",\"google\":\"FEB88\",\"image\":\"21aa.png\",\"sheet_x\":24,\"sheet_y\":18,\"short_name\":\"arrow_right_hook\",\"short_names\":[\"arrow_right_hook\"],\"text\":null},{\"name\":\"WATCH\",\"unified\":\"231A\",\"docomo\":\"E71F\",\"au\":\"E57A\",\"softbank\":\"\",\"google\":\"FE01D\",\"image\":\"231a.png\",\"sheet_x\":24,\"sheet_y\":19,\"short_name\":\"watch\",\"short_names\":[\"watch\"],\"text\":null},{\"name\":\"HOURGLASS\",\"unified\":\"231B\",\"docomo\":\"E71C\",\"au\":\"E57B\",\"softbank\":\"\",\"google\":\"FE01C\",\"image\":\"231b.png\",\"sheet_x\":24,\"sheet_y\":20,\"short_name\":\"hourglass\",\"short_names\":[\"hourglass\"],\"text\":null},{\"name\":\"BLACK RIGHT-POINTING DOUBLE TRIANGLE\",\"unified\":\"23E9\",\"docomo\":\"\",\"au\":\"E530\",\"softbank\":\"E23C\",\"google\":\"FEAFE\",\"image\":\"23e9.png\",\"sheet_x\":24,\"sheet_y\":21,\"short_name\":\"fast_forward\",\"short_names\":[\"fast_forward\"],\"text\":null},{\"name\":\"BLACK LEFT-POINTING DOUBLE TRIANGLE\",\"unified\":\"23EA\",\"docomo\":\"\",\"au\":\"E52F\",\"softbank\":\"E23D\",\"google\":\"FEAFF\",\"image\":\"23ea.png\",\"sheet_x\":24,\"sheet_y\":22,\"short_name\":\"rewind\",\"short_names\":[\"rewind\"],\"text\":null},{\"name\":\"BLACK UP-POINTING DOUBLE TRIANGLE\",\"unified\":\"23EB\",\"docomo\":\"\",\"au\":\"E545\",\"softbank\":\"\",\"google\":\"FEB03\",\"image\":\"23eb.png\",\"sheet_x\":24,\"sheet_y\":23,\"short_name\":\"arrow_double_up\",\"short_names\":[\"arrow_double_up\"],\"text\":null},{\"name\":\"BLACK DOWN-POINTING DOUBLE TRIANGLE\",\"unified\":\"23EC\",\"docomo\":\"\",\"au\":\"E544\",\"softbank\":\"\",\"google\":\"FEB02\",\"image\":\"23ec.png\",\"sheet_x\":24,\"sheet_y\":24,\"short_name\":\"arrow_double_down\",\"short_names\":[\"arrow_double_down\"],\"text\":null},{\"name\":\"ALARM CLOCK\",\"unified\":\"23F0\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E02D\",\"google\":\"FE02A\",\"image\":\"23f0.png\",\"sheet_x\":24,\"sheet_y\":25,\"short_name\":\"alarm_clock\",\"short_names\":[\"alarm_clock\"],\"text\":null},{\"name\":\"HOURGLASS WITH FLOWING SAND\",\"unified\":\"23F3\",\"docomo\":\"E71C\",\"au\":\"E47C\",\"softbank\":\"\",\"google\":\"FE01B\",\"image\":\"23f3.png\",\"sheet_x\":24,\"sheet_y\":26,\"short_name\":\"hourglass_flowing_sand\",\"short_names\":[\"hourglass_flowing_sand\"],\"text\":null},{\"name\":\"CIRCLED LATIN CAPITAL LETTER M\",\"unified\":\"24C2\",\"docomo\":\"E65C\",\"au\":\"E5BC\",\"softbank\":\"E434\",\"google\":\"FE7E1\",\"image\":\"24c2.png\",\"sheet_x\":24,\"sheet_y\":27,\"short_name\":\"m\",\"short_names\":[\"m\"],\"text\":null},{\"name\":\"BLACK SMALL SQUARE\",\"unified\":\"25AA\",\"docomo\":\"\",\"au\":\"E532\",\"softbank\":\"E21A\",\"google\":\"FEB6E\",\"image\":\"25aa.png\",\"sheet_x\":24,\"sheet_y\":28,\"short_name\":\"black_small_square\",\"short_names\":[\"black_small_square\"],\"text\":null},{\"name\":\"WHITE SMALL SQUARE\",\"unified\":\"25AB\",\"docomo\":\"\",\"au\":\"E531\",\"softbank\":\"E21B\",\"google\":\"FEB6D\",\"image\":\"25ab.png\",\"sheet_x\":24,\"sheet_y\":29,\"short_name\":\"white_small_square\",\"short_names\":[\"white_small_square\"],\"text\":null},{\"name\":\"BLACK RIGHT-POINTING TRIANGLE\",\"unified\":\"25B6\",\"docomo\":\"\",\"au\":\"E52E\",\"softbank\":\"E23A\",\"google\":\"FEAFC\",\"image\":\"25b6.png\",\"sheet_x\":25,\"sheet_y\":0,\"short_name\":\"arrow_forward\",\"short_names\":[\"arrow_forward\"],\"text\":null},{\"name\":\"BLACK LEFT-POINTING TRIANGLE\",\"unified\":\"25C0\",\"docomo\":\"\",\"au\":\"E52D\",\"softbank\":\"E23B\",\"google\":\"FEAFD\",\"image\":\"25c0.png\",\"sheet_x\":25,\"sheet_y\":1,\"short_name\":\"arrow_backward\",\"short_names\":[\"arrow_backward\"],\"text\":null},{\"name\":\"WHITE MEDIUM SQUARE\",\"unified\":\"25FB\",\"docomo\":\"\",\"au\":\"E538\",\"softbank\":\"E21B\",\"google\":\"FEB71\",\"image\":\"25fb.png\",\"sheet_x\":25,\"sheet_y\":2,\"short_name\":\"white_medium_square\",\"short_names\":[\"white_medium_square\"],\"text\":null},{\"name\":\"BLACK MEDIUM SQUARE\",\"unified\":\"25FC\",\"docomo\":\"\",\"au\":\"E539\",\"softbank\":\"E21A\",\"google\":\"FEB72\",\"image\":\"25fc.png\",\"sheet_x\":25,\"sheet_y\":3,\"short_name\":\"black_medium_square\",\"short_names\":[\"black_medium_square\"],\"text\":null},{\"name\":\"WHITE MEDIUM SMALL SQUARE\",\"unified\":\"25FD\",\"docomo\":\"\",\"au\":\"E534\",\"softbank\":\"E21B\",\"google\":\"FEB6F\",\"image\":\"25fd.png\",\"sheet_x\":25,\"sheet_y\":4,\"short_name\":\"white_medium_small_square\",\"short_names\":[\"white_medium_small_square\"],\"text\":null},{\"name\":\"BLACK MEDIUM SMALL SQUARE\",\"unified\":\"25FE\",\"docomo\":\"\",\"au\":\"E535\",\"softbank\":\"E21A\",\"google\":\"FEB70\",\"image\":\"25fe.png\",\"sheet_x\":25,\"sheet_y\":5,\"short_name\":\"black_medium_small_square\",\"short_names\":[\"black_medium_small_square\"],\"text\":null},{\"name\":\"BLACK SUN WITH RAYS\",\"unified\":\"2600\",\"docomo\":\"E63E\",\"au\":\"E488\",\"softbank\":\"E04A\",\"google\":\"FE000\",\"image\":\"2600.png\",\"sheet_x\":25,\"sheet_y\":6,\"short_name\":\"sunny\",\"short_names\":[\"sunny\"],\"text\":null},{\"name\":\"CLOUD\",\"unified\":\"2601\",\"docomo\":\"E63F\",\"au\":\"E48D\",\"softbank\":\"E049\",\"google\":\"FE001\",\"image\":\"2601.png\",\"sheet_x\":25,\"sheet_y\":7,\"short_name\":\"cloud\",\"short_names\":[\"cloud\"],\"text\":null},{\"name\":\"BLACK TELEPHONE\",\"unified\":\"260E\",\"docomo\":\"E687\",\"au\":\"E596\",\"softbank\":\"E009\",\"google\":\"FE523\",\"image\":\"260e.png\",\"sheet_x\":25,\"sheet_y\":8,\"short_name\":\"phone\",\"short_names\":[\"phone\",\"telephone\"],\"text\":null},{\"name\":\"BALLOT BOX WITH CHECK\",\"unified\":\"2611\",\"docomo\":\"\",\"au\":\"EB02\",\"softbank\":\"\",\"google\":\"FEB8B\",\"image\":\"2611.png\",\"sheet_x\":25,\"sheet_y\":9,\"short_name\":\"ballot_box_with_check\",\"short_names\":[\"ballot_box_with_check\"],\"text\":null},{\"name\":\"UMBRELLA WITH RAIN DROPS\",\"unified\":\"2614\",\"docomo\":\"E640\",\"au\":\"E48C\",\"softbank\":\"E04B\",\"google\":\"FE002\",\"image\":\"2614.png\",\"sheet_x\":25,\"sheet_y\":10,\"short_name\":\"umbrella\",\"short_names\":[\"umbrella\"],\"text\":null},{\"name\":\"HOT BEVERAGE\",\"unified\":\"2615\",\"docomo\":\"E670\",\"au\":\"E597\",\"softbank\":\"E045\",\"google\":\"FE981\",\"image\":\"2615.png\",\"sheet_x\":25,\"sheet_y\":11,\"short_name\":\"coffee\",\"short_names\":[\"coffee\"],\"text\":null},{\"name\":\"WHITE UP POINTING INDEX\",\"unified\":\"261D\",\"docomo\":\"\",\"au\":\"E4F6\",\"softbank\":\"E00F\",\"google\":\"FEB98\",\"image\":\"261d.png\",\"sheet_x\":25,\"sheet_y\":12,\"short_name\":\"point_up\",\"short_names\":[\"point_up\"],\"text\":null},{\"name\":\"WHITE SMILING FACE\",\"unified\":\"263A\",\"docomo\":\"E6F0\",\"au\":\"E4FB\",\"softbank\":\"E414\",\"google\":\"FE336\",\"image\":\"263a.png\",\"sheet_x\":25,\"sheet_y\":13,\"short_name\":\"relaxed\",\"short_names\":[\"relaxed\"],\"text\":null},{\"name\":\"ARIES\",\"unified\":\"2648\",\"docomo\":\"E646\",\"au\":\"E48F\",\"softbank\":\"E23F\",\"google\":\"FE02B\",\"image\":\"2648.png\",\"sheet_x\":25,\"sheet_y\":14,\"short_name\":\"aries\",\"short_names\":[\"aries\"],\"text\":null},{\"name\":\"TAURUS\",\"unified\":\"2649\",\"docomo\":\"E647\",\"au\":\"E490\",\"softbank\":\"E240\",\"google\":\"FE02C\",\"image\":\"2649.png\",\"sheet_x\":25,\"sheet_y\":15,\"short_name\":\"taurus\",\"short_names\":[\"taurus\"],\"text\":null},{\"name\":\"GEMINI\",\"unified\":\"264A\",\"docomo\":\"E648\",\"au\":\"E491\",\"softbank\":\"E241\",\"google\":\"FE02D\",\"image\":\"264a.png\",\"sheet_x\":25,\"sheet_y\":16,\"short_name\":\"gemini\",\"short_names\":[\"gemini\"],\"text\":null},{\"name\":\"CANCER\",\"unified\":\"264B\",\"docomo\":\"E649\",\"au\":\"E492\",\"softbank\":\"E242\",\"google\":\"FE02E\",\"image\":\"264b.png\",\"sheet_x\":25,\"sheet_y\":17,\"short_name\":\"cancer\",\"short_names\":[\"cancer\"],\"text\":null},{\"name\":\"LEO\",\"unified\":\"264C\",\"docomo\":\"E64A\",\"au\":\"E493\",\"softbank\":\"E243\",\"google\":\"FE02F\",\"image\":\"264c.png\",\"sheet_x\":25,\"sheet_y\":18,\"short_name\":\"leo\",\"short_names\":[\"leo\"],\"text\":null},{\"name\":\"VIRGO\",\"unified\":\"264D\",\"docomo\":\"E64B\",\"au\":\"E494\",\"softbank\":\"E244\",\"google\":\"FE030\",\"image\":\"264d.png\",\"sheet_x\":25,\"sheet_y\":19,\"short_name\":\"virgo\",\"short_names\":[\"virgo\"],\"text\":null},{\"name\":\"LIBRA\",\"unified\":\"264E\",\"docomo\":\"E64C\",\"au\":\"E495\",\"softbank\":\"E245\",\"google\":\"FE031\",\"image\":\"264e.png\",\"sheet_x\":25,\"sheet_y\":20,\"short_name\":\"libra\",\"short_names\":[\"libra\"],\"text\":null},{\"name\":\"SCORPIUS\",\"unified\":\"264F\",\"docomo\":\"E64D\",\"au\":\"E496\",\"softbank\":\"E246\",\"google\":\"FE032\",\"image\":\"264f.png\",\"sheet_x\":25,\"sheet_y\":21,\"short_name\":\"scorpius\",\"short_names\":[\"scorpius\"],\"text\":null},{\"name\":\"SAGITTARIUS\",\"unified\":\"2650\",\"docomo\":\"E64E\",\"au\":\"E497\",\"softbank\":\"E247\",\"google\":\"FE033\",\"image\":\"2650.png\",\"sheet_x\":25,\"sheet_y\":22,\"short_name\":\"sagittarius\",\"short_names\":[\"sagittarius\"],\"text\":null},{\"name\":\"CAPRICORN\",\"unified\":\"2651\",\"docomo\":\"E64F\",\"au\":\"E498\",\"softbank\":\"E248\",\"google\":\"FE034\",\"image\":\"2651.png\",\"sheet_x\":25,\"sheet_y\":23,\"short_name\":\"capricorn\",\"short_names\":[\"capricorn\"],\"text\":null},{\"name\":\"AQUARIUS\",\"unified\":\"2652\",\"docomo\":\"E650\",\"au\":\"E499\",\"softbank\":\"E249\",\"google\":\"FE035\",\"image\":\"2652.png\",\"sheet_x\":25,\"sheet_y\":24,\"short_name\":\"aquarius\",\"short_names\":[\"aquarius\"],\"text\":null},{\"name\":\"PISCES\",\"unified\":\"2653\",\"docomo\":\"E651\",\"au\":\"E49A\",\"softbank\":\"E24A\",\"google\":\"FE036\",\"image\":\"2653.png\",\"sheet_x\":25,\"sheet_y\":25,\"short_name\":\"pisces\",\"short_names\":[\"pisces\"],\"text\":null},{\"name\":\"BLACK SPADE SUIT\",\"unified\":\"2660\",\"docomo\":\"E68E\",\"au\":\"E5A1\",\"softbank\":\"E20E\",\"google\":\"FEB1B\",\"image\":\"2660.png\",\"sheet_x\":25,\"sheet_y\":26,\"short_name\":\"spades\",\"short_names\":[\"spades\"],\"text\":null},{\"name\":\"BLACK CLUB SUIT\",\"unified\":\"2663\",\"docomo\":\"E690\",\"au\":\"E5A3\",\"softbank\":\"E20F\",\"google\":\"FEB1D\",\"image\":\"2663.png\",\"sheet_x\":25,\"sheet_y\":27,\"short_name\":\"clubs\",\"short_names\":[\"clubs\"],\"text\":null},{\"name\":\"BLACK HEART SUIT\",\"unified\":\"2665\",\"docomo\":\"E68D\",\"au\":\"EAA5\",\"softbank\":\"E20C\",\"google\":\"FEB1A\",\"image\":\"2665.png\",\"sheet_x\":25,\"sheet_y\":28,\"short_name\":\"hearts\",\"short_names\":[\"hearts\"],\"text\":null},{\"name\":\"BLACK DIAMOND SUIT\",\"unified\":\"2666\",\"docomo\":\"E68F\",\"au\":\"E5A2\",\"softbank\":\"E20D\",\"google\":\"FEB1C\",\"image\":\"2666.png\",\"sheet_x\":25,\"sheet_y\":29,\"short_name\":\"diamonds\",\"short_names\":[\"diamonds\"],\"text\":null},{\"name\":\"HOT SPRINGS\",\"unified\":\"2668\",\"docomo\":\"E6F7\",\"au\":\"E4BC\",\"softbank\":\"E123\",\"google\":\"FE7FA\",\"image\":\"2668.png\",\"sheet_x\":26,\"sheet_y\":0,\"short_name\":\"hotsprings\",\"short_names\":[\"hotsprings\"],\"text\":null},{\"name\":\"BLACK UNIVERSAL RECYCLING SYMBOL\",\"unified\":\"267B\",\"docomo\":\"E735\",\"au\":\"EB79\",\"softbank\":\"\",\"google\":\"FEB2C\",\"image\":\"267b.png\",\"sheet_x\":26,\"sheet_y\":1,\"short_name\":\"recycle\",\"short_names\":[\"recycle\"],\"text\":null},{\"name\":\"WHEELCHAIR SYMBOL\",\"unified\":\"267F\",\"docomo\":\"E69B\",\"au\":\"E47F\",\"softbank\":\"E20A\",\"google\":\"FEB20\",\"image\":\"267f.png\",\"sheet_x\":26,\"sheet_y\":2,\"short_name\":\"wheelchair\",\"short_names\":[\"wheelchair\"],\"text\":null},{\"name\":\"ANCHOR\",\"unified\":\"2693\",\"docomo\":\"E661\",\"au\":\"E4A9\",\"softbank\":\"E202\",\"google\":\"FE4C1\",\"image\":\"2693.png\",\"sheet_x\":26,\"sheet_y\":3,\"short_name\":\"anchor\",\"short_names\":[\"anchor\"],\"text\":null},{\"name\":\"WARNING SIGN\",\"unified\":\"26A0\",\"docomo\":\"E737\",\"au\":\"E481\",\"softbank\":\"E252\",\"google\":\"FEB23\",\"image\":\"26a0.png\",\"sheet_x\":26,\"sheet_y\":4,\"short_name\":\"warning\",\"short_names\":[\"warning\"],\"text\":null},{\"name\":\"HIGH VOLTAGE SIGN\",\"unified\":\"26A1\",\"docomo\":\"E642\",\"au\":\"E487\",\"softbank\":\"E13D\",\"google\":\"FE004\",\"image\":\"26a1.png\",\"sheet_x\":26,\"sheet_y\":5,\"short_name\":\"zap\",\"short_names\":[\"zap\"],\"text\":null},{\"name\":\"MEDIUM WHITE CIRCLE\",\"unified\":\"26AA\",\"docomo\":\"E69C\",\"au\":\"E53A\",\"softbank\":\"E219\",\"google\":\"FEB65\",\"image\":\"26aa.png\",\"sheet_x\":26,\"sheet_y\":6,\"short_name\":\"white_circle\",\"short_names\":[\"white_circle\"],\"text\":null},{\"name\":\"MEDIUM BLACK CIRCLE\",\"unified\":\"26AB\",\"docomo\":\"E69C\",\"au\":\"E53B\",\"softbank\":\"E219\",\"google\":\"FEB66\",\"image\":\"26ab.png\",\"sheet_x\":26,\"sheet_y\":7,\"short_name\":\"black_circle\",\"short_names\":[\"black_circle\"],\"text\":null},{\"name\":\"SOCCER BALL\",\"unified\":\"26BD\",\"docomo\":\"E656\",\"au\":\"E4B6\",\"softbank\":\"E018\",\"google\":\"FE7D4\",\"image\":\"26bd.png\",\"sheet_x\":26,\"sheet_y\":8,\"short_name\":\"soccer\",\"short_names\":[\"soccer\"],\"text\":null},{\"name\":\"BASEBALL\",\"unified\":\"26BE\",\"docomo\":\"E653\",\"au\":\"E4BA\",\"softbank\":\"E016\",\"google\":\"FE7D1\",\"image\":\"26be.png\",\"sheet_x\":26,\"sheet_y\":9,\"short_name\":\"baseball\",\"short_names\":[\"baseball\"],\"text\":null},{\"name\":\"SNOWMAN WITHOUT SNOW\",\"unified\":\"26C4\",\"docomo\":\"E641\",\"au\":\"E485\",\"softbank\":\"E048\",\"google\":\"FE003\",\"image\":\"26c4.png\",\"sheet_x\":26,\"sheet_y\":10,\"short_name\":\"snowman\",\"short_names\":[\"snowman\"],\"text\":null},{\"name\":\"SUN BEHIND CLOUD\",\"unified\":\"26C5\",\"docomo\":\"E63E-E63F\",\"au\":\"E48E\",\"softbank\":\"E04A-E049\",\"google\":\"FE00F\",\"image\":\"26c5.png\",\"sheet_x\":26,\"sheet_y\":11,\"short_name\":\"partly_sunny\",\"short_names\":[\"partly_sunny\"],\"text\":null},{\"name\":\"OPHIUCHUS\",\"unified\":\"26CE\",\"docomo\":\"\",\"au\":\"E49B\",\"softbank\":\"E24B\",\"google\":\"FE037\",\"image\":\"26ce.png\",\"sheet_x\":26,\"sheet_y\":12,\"short_name\":\"ophiuchus\",\"short_names\":[\"ophiuchus\"],\"text\":null},{\"name\":\"NO ENTRY\",\"unified\":\"26D4\",\"docomo\":\"E72F\",\"au\":\"E484\",\"softbank\":\"E137\",\"google\":\"FEB26\",\"image\":\"26d4.png\",\"sheet_x\":26,\"sheet_y\":13,\"short_name\":\"no_entry\",\"short_names\":[\"no_entry\"],\"text\":null},{\"name\":\"CHURCH\",\"unified\":\"26EA\",\"docomo\":\"\",\"au\":\"E5BB\",\"softbank\":\"E037\",\"google\":\"FE4BB\",\"image\":\"26ea.png\",\"sheet_x\":26,\"sheet_y\":14,\"short_name\":\"church\",\"short_names\":[\"church\"],\"text\":null},{\"name\":\"FOUNTAIN\",\"unified\":\"26F2\",\"docomo\":\"\",\"au\":\"E5CF\",\"softbank\":\"E121\",\"google\":\"FE4BC\",\"image\":\"26f2.png\",\"sheet_x\":26,\"sheet_y\":15,\"short_name\":\"fountain\",\"short_names\":[\"fountain\"],\"text\":null},{\"name\":\"FLAG IN HOLE\",\"unified\":\"26F3\",\"docomo\":\"E654\",\"au\":\"E599\",\"softbank\":\"E014\",\"google\":\"FE7D2\",\"image\":\"26f3.png\",\"sheet_x\":26,\"sheet_y\":16,\"short_name\":\"golf\",\"short_names\":[\"golf\"],\"text\":null},{\"name\":\"SAILBOAT\",\"unified\":\"26F5\",\"docomo\":\"E6A3\",\"au\":\"E4B4\",\"softbank\":\"E01C\",\"google\":\"FE7EA\",\"image\":\"26f5.png\",\"sheet_x\":26,\"sheet_y\":17,\"short_name\":\"boat\",\"short_names\":[\"boat\",\"sailboat\"],\"text\":null},{\"name\":\"TENT\",\"unified\":\"26FA\",\"docomo\":\"\",\"au\":\"E5D0\",\"softbank\":\"E122\",\"google\":\"FE7FB\",\"image\":\"26fa.png\",\"sheet_x\":26,\"sheet_y\":18,\"short_name\":\"tent\",\"short_names\":[\"tent\"],\"text\":null},{\"name\":\"FUEL PUMP\",\"unified\":\"26FD\",\"docomo\":\"E66B\",\"au\":\"E571\",\"softbank\":\"E03A\",\"google\":\"FE7F5\",\"image\":\"26fd.png\",\"sheet_x\":26,\"sheet_y\":19,\"short_name\":\"fuelpump\",\"short_names\":[\"fuelpump\"],\"text\":null},{\"name\":\"BLACK SCISSORS\",\"unified\":\"2702\",\"docomo\":\"E675\",\"au\":\"E516\",\"softbank\":\"E313\",\"google\":\"FE53E\",\"image\":\"2702.png\",\"sheet_x\":26,\"sheet_y\":20,\"short_name\":\"scissors\",\"short_names\":[\"scissors\"],\"text\":null},{\"name\":\"WHITE HEAVY CHECK MARK\",\"unified\":\"2705\",\"docomo\":\"\",\"au\":\"E55E\",\"softbank\":\"\",\"google\":\"FEB4A\",\"image\":\"2705.png\",\"sheet_x\":26,\"sheet_y\":21,\"short_name\":\"white_check_mark\",\"short_names\":[\"white_check_mark\"],\"text\":null},{\"name\":\"AIRPLANE\",\"unified\":\"2708\",\"docomo\":\"E662\",\"au\":\"E4B3\",\"softbank\":\"E01D\",\"google\":\"FE7E9\",\"image\":\"2708.png\",\"sheet_x\":26,\"sheet_y\":22,\"short_name\":\"airplane\",\"short_names\":[\"airplane\"],\"text\":null},{\"name\":\"ENVELOPE\",\"unified\":\"2709\",\"docomo\":\"E6D3\",\"au\":\"E521\",\"softbank\":\"E103\",\"google\":\"FE529\",\"image\":\"2709.png\",\"sheet_x\":26,\"sheet_y\":23,\"short_name\":\"email\",\"short_names\":[\"email\",\"envelope\"],\"text\":null},{\"name\":\"RAISED FIST\",\"unified\":\"270A\",\"docomo\":\"E693\",\"au\":\"EB83\",\"softbank\":\"E010\",\"google\":\"FEB93\",\"image\":\"270a.png\",\"sheet_x\":26,\"sheet_y\":24,\"short_name\":\"fist\",\"short_names\":[\"fist\"],\"text\":null},{\"name\":\"RAISED HAND\",\"unified\":\"270B\",\"docomo\":\"E695\",\"au\":\"E5A7\",\"softbank\":\"E012\",\"google\":\"FEB95\",\"image\":\"270b.png\",\"sheet_x\":26,\"sheet_y\":25,\"short_name\":\"hand\",\"short_names\":[\"hand\",\"raised_hand\"],\"text\":null},{\"name\":\"VICTORY HAND\",\"unified\":\"270C\",\"docomo\":\"E694\",\"au\":\"E5A6\",\"softbank\":\"E011\",\"google\":\"FEB94\",\"image\":\"270c.png\",\"sheet_x\":26,\"sheet_y\":26,\"short_name\":\"v\",\"short_names\":[\"v\"],\"text\":null},{\"name\":\"PENCIL\",\"unified\":\"270F\",\"docomo\":\"E719\",\"au\":\"E4A1\",\"softbank\":\"E301\",\"google\":\"FE539\",\"image\":\"270f.png\",\"sheet_x\":26,\"sheet_y\":27,\"short_name\":\"pencil2\",\"short_names\":[\"pencil2\"],\"text\":null},{\"name\":\"BLACK NIB\",\"unified\":\"2712\",\"docomo\":\"E6AE\",\"au\":\"EB03\",\"softbank\":\"\",\"google\":\"FE536\",\"image\":\"2712.png\",\"sheet_x\":26,\"sheet_y\":28,\"short_name\":\"black_nib\",\"short_names\":[\"black_nib\"],\"text\":null},{\"name\":\"HEAVY CHECK MARK\",\"unified\":\"2714\",\"docomo\":\"\",\"au\":\"E557\",\"softbank\":\"\",\"google\":\"FEB49\",\"image\":\"2714.png\",\"sheet_x\":26,\"sheet_y\":29,\"short_name\":\"heavy_check_mark\",\"short_names\":[\"heavy_check_mark\"],\"text\":null},{\"name\":\"HEAVY MULTIPLICATION X\",\"unified\":\"2716\",\"docomo\":\"\",\"au\":\"E54F\",\"softbank\":\"E333\",\"google\":\"FEB53\",\"image\":\"2716.png\",\"sheet_x\":27,\"sheet_y\":0,\"short_name\":\"heavy_multiplication_x\",\"short_names\":[\"heavy_multiplication_x\"],\"text\":null},{\"name\":\"SPARKLES\",\"unified\":\"2728\",\"docomo\":\"E6FA\",\"au\":\"EAAB\",\"softbank\":\"E32E\",\"google\":\"FEB60\",\"image\":\"2728.png\",\"sheet_x\":27,\"sheet_y\":1,\"short_name\":\"sparkles\",\"short_names\":[\"sparkles\"],\"text\":null},{\"name\":\"EIGHT SPOKED ASTERISK\",\"unified\":\"2733\",\"docomo\":\"E6F8\",\"au\":\"E53E\",\"softbank\":\"E206\",\"google\":\"FEB62\",\"image\":\"2733.png\",\"sheet_x\":27,\"sheet_y\":2,\"short_name\":\"eight_spoked_asterisk\",\"short_names\":[\"eight_spoked_asterisk\"],\"text\":null},{\"name\":\"EIGHT POINTED BLACK STAR\",\"unified\":\"2734\",\"docomo\":\"E6F8\",\"au\":\"E479\",\"softbank\":\"E205\",\"google\":\"FEB61\",\"image\":\"2734.png\",\"sheet_x\":27,\"sheet_y\":3,\"short_name\":\"eight_pointed_black_star\",\"short_names\":[\"eight_pointed_black_star\"],\"text\":null},{\"name\":\"SNOWFLAKE\",\"unified\":\"2744\",\"docomo\":\"\",\"au\":\"E48A\",\"softbank\":\"\",\"google\":\"FE00E\",\"image\":\"2744.png\",\"sheet_x\":27,\"sheet_y\":4,\"short_name\":\"snowflake\",\"short_names\":[\"snowflake\"],\"text\":null},{\"name\":\"SPARKLE\",\"unified\":\"2747\",\"docomo\":\"E6FA\",\"au\":\"E46C\",\"softbank\":\"E32E\",\"google\":\"FEB77\",\"image\":\"2747.png\",\"sheet_x\":27,\"sheet_y\":5,\"short_name\":\"sparkle\",\"short_names\":[\"sparkle\"],\"text\":null},{\"name\":\"CROSS MARK\",\"unified\":\"274C\",\"docomo\":\"\",\"au\":\"E550\",\"softbank\":\"E333\",\"google\":\"FEB45\",\"image\":\"274c.png\",\"sheet_x\":27,\"sheet_y\":6,\"short_name\":\"x\",\"short_names\":[\"x\"],\"text\":null},{\"name\":\"NEGATIVE SQUARED CROSS MARK\",\"unified\":\"274E\",\"docomo\":\"\",\"au\":\"E551\",\"softbank\":\"E333\",\"google\":\"FEB46\",\"image\":\"274e.png\",\"sheet_x\":27,\"sheet_y\":7,\"short_name\":\"negative_squared_cross_mark\",\"short_names\":[\"negative_squared_cross_mark\"],\"text\":null},{\"name\":\"BLACK QUESTION MARK ORNAMENT\",\"unified\":\"2753\",\"docomo\":\"\",\"au\":\"E483\",\"softbank\":\"E020\",\"google\":\"FEB09\",\"image\":\"2753.png\",\"sheet_x\":27,\"sheet_y\":8,\"short_name\":\"question\",\"short_names\":[\"question\"],\"text\":null},{\"name\":\"WHITE QUESTION MARK ORNAMENT\",\"unified\":\"2754\",\"docomo\":\"\",\"au\":\"E483\",\"softbank\":\"E336\",\"google\":\"FEB0A\",\"image\":\"2754.png\",\"sheet_x\":27,\"sheet_y\":9,\"short_name\":\"grey_question\",\"short_names\":[\"grey_question\"],\"text\":null},{\"name\":\"WHITE EXCLAMATION MARK ORNAMENT\",\"unified\":\"2755\",\"docomo\":\"E702\",\"au\":\"E482\",\"softbank\":\"E337\",\"google\":\"FEB0B\",\"image\":\"2755.png\",\"sheet_x\":27,\"sheet_y\":10,\"short_name\":\"grey_exclamation\",\"short_names\":[\"grey_exclamation\"],\"text\":null},{\"name\":\"HEAVY EXCLAMATION MARK SYMBOL\",\"unified\":\"2757\",\"docomo\":\"E702\",\"au\":\"E482\",\"softbank\":\"E021\",\"google\":\"FEB04\",\"image\":\"2757.png\",\"sheet_x\":27,\"sheet_y\":11,\"short_name\":\"exclamation\",\"short_names\":[\"exclamation\",\"heavy_exclamation_mark\"],\"text\":null},{\"name\":\"HEAVY BLACK HEART\",\"unified\":\"2764\",\"docomo\":\"E6EC\",\"au\":\"E595\",\"softbank\":\"E022\",\"google\":\"FEB0C\",\"image\":\"2764.png\",\"sheet_x\":27,\"sheet_y\":12,\"short_name\":\"heart\",\"short_names\":[\"heart\"],\"text\":\"<3\"},{\"name\":\"HEAVY PLUS SIGN\",\"unified\":\"2795\",\"docomo\":\"\",\"au\":\"E53C\",\"softbank\":\"\",\"google\":\"FEB51\",\"image\":\"2795.png\",\"sheet_x\":27,\"sheet_y\":13,\"short_name\":\"heavy_plus_sign\",\"short_names\":[\"heavy_plus_sign\"],\"text\":null},{\"name\":\"HEAVY MINUS SIGN\",\"unified\":\"2796\",\"docomo\":\"\",\"au\":\"E53D\",\"softbank\":\"\",\"google\":\"FEB52\",\"image\":\"2796.png\",\"sheet_x\":27,\"sheet_y\":14,\"short_name\":\"heavy_minus_sign\",\"short_names\":[\"heavy_minus_sign\"],\"text\":null},{\"name\":\"HEAVY DIVISION SIGN\",\"unified\":\"2797\",\"docomo\":\"\",\"au\":\"E554\",\"softbank\":\"\",\"google\":\"FEB54\",\"image\":\"2797.png\",\"sheet_x\":27,\"sheet_y\":15,\"short_name\":\"heavy_division_sign\",\"short_names\":[\"heavy_division_sign\"],\"text\":null},{\"name\":\"BLACK RIGHTWARDS ARROW\",\"unified\":\"27A1\",\"docomo\":\"\",\"au\":\"E552\",\"softbank\":\"E234\",\"google\":\"FEAFA\",\"image\":\"27a1.png\",\"sheet_x\":27,\"sheet_y\":16,\"short_name\":\"arrow_right\",\"short_names\":[\"arrow_right\"],\"text\":null},{\"name\":\"CURLY LOOP\",\"unified\":\"27B0\",\"docomo\":\"E70A\",\"au\":\"EB31\",\"softbank\":\"\",\"google\":\"FEB08\",\"image\":\"27b0.png\",\"sheet_x\":27,\"sheet_y\":17,\"short_name\":\"curly_loop\",\"short_names\":[\"curly_loop\"],\"text\":null},{\"name\":\"DOUBLE CURLY LOOP\",\"unified\":\"27BF\",\"docomo\":\"E6DF\",\"au\":\"\",\"softbank\":\"E211\",\"google\":\"FE82B\",\"image\":\"27bf.png\",\"sheet_x\":27,\"sheet_y\":18,\"short_name\":\"loop\",\"short_names\":[\"loop\"],\"text\":null},{\"name\":\"ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS\",\"unified\":\"2934\",\"docomo\":\"E6F5\",\"au\":\"EB2D\",\"softbank\":\"E236\",\"google\":\"FEAF4\",\"image\":\"2934.png\",\"sheet_x\":27,\"sheet_y\":19,\"short_name\":\"arrow_heading_up\",\"short_names\":[\"arrow_heading_up\"],\"text\":null},{\"name\":\"ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS\",\"unified\":\"2935\",\"docomo\":\"E700\",\"au\":\"EB2E\",\"softbank\":\"E238\",\"google\":\"FEAF5\",\"image\":\"2935.png\",\"sheet_x\":27,\"sheet_y\":20,\"short_name\":\"arrow_heading_down\",\"short_names\":[\"arrow_heading_down\"],\"text\":null},{\"name\":\"LEFTWARDS BLACK ARROW\",\"unified\":\"2B05\",\"docomo\":\"\",\"au\":\"E553\",\"softbank\":\"E235\",\"google\":\"FEAFB\",\"image\":\"2b05.png\",\"sheet_x\":27,\"sheet_y\":21,\"short_name\":\"arrow_left\",\"short_names\":[\"arrow_left\"],\"text\":null},{\"name\":\"UPWARDS BLACK ARROW\",\"unified\":\"2B06\",\"docomo\":\"\",\"au\":\"E53F\",\"softbank\":\"E232\",\"google\":\"FEAF8\",\"image\":\"2b06.png\",\"sheet_x\":27,\"sheet_y\":22,\"short_name\":\"arrow_up\",\"short_names\":[\"arrow_up\"],\"text\":null},{\"name\":\"DOWNWARDS BLACK ARROW\",\"unified\":\"2B07\",\"docomo\":\"\",\"au\":\"E540\",\"softbank\":\"E233\",\"google\":\"FEAF9\",\"image\":\"2b07.png\",\"sheet_x\":27,\"sheet_y\":23,\"short_name\":\"arrow_down\",\"short_names\":[\"arrow_down\"],\"text\":null},{\"name\":\"BLACK LARGE SQUARE\",\"unified\":\"2B1B\",\"docomo\":\"\",\"au\":\"E549\",\"softbank\":\"E21A\",\"google\":\"FEB6C\",\"image\":\"2b1b.png\",\"sheet_x\":27,\"sheet_y\":24,\"short_name\":\"black_large_square\",\"short_names\":[\"black_large_square\"],\"text\":null},{\"name\":\"WHITE LARGE SQUARE\",\"unified\":\"2B1C\",\"docomo\":\"\",\"au\":\"E548\",\"softbank\":\"E21B\",\"google\":\"FEB6B\",\"image\":\"2b1c.png\",\"sheet_x\":27,\"sheet_y\":25,\"short_name\":\"white_large_square\",\"short_names\":[\"white_large_square\"],\"text\":null},{\"name\":\"WHITE MEDIUM STAR\",\"unified\":\"2B50\",\"docomo\":\"\",\"au\":\"E48B\",\"softbank\":\"E32F\",\"google\":\"FEB68\",\"image\":\"2b50.png\",\"sheet_x\":27,\"sheet_y\":26,\"short_name\":\"star\",\"short_names\":[\"star\"],\"text\":null},{\"name\":\"HEAVY LARGE CIRCLE\",\"unified\":\"2B55\",\"docomo\":\"E6A0\",\"au\":\"EAAD\",\"softbank\":\"E332\",\"google\":\"FEB44\",\"image\":\"2b55.png\",\"sheet_x\":27,\"sheet_y\":27,\"short_name\":\"o\",\"short_names\":[\"o\"],\"text\":null},{\"name\":\"WAVY DASH\",\"unified\":\"3030\",\"docomo\":\"E709\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FEB07\",\"image\":\"3030.png\",\"sheet_x\":27,\"sheet_y\":28,\"short_name\":\"wavy_dash\",\"short_names\":[\"wavy_dash\"],\"text\":null},{\"name\":\"PART ALTERNATION MARK\",\"unified\":\"303D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E12C\",\"google\":\"FE81B\",\"image\":\"303d.png\",\"sheet_x\":27,\"sheet_y\":29,\"short_name\":\"part_alternation_mark\",\"short_names\":[\"part_alternation_mark\"],\"text\":null},{\"name\":\"CIRCLED IDEOGRAPH CONGRATULATION\",\"unified\":\"3297\",\"docomo\":\"\",\"au\":\"EA99\",\"softbank\":\"E30D\",\"google\":\"FEB43\",\"image\":\"3297.png\",\"sheet_x\":28,\"sheet_y\":0,\"short_name\":\"congratulations\",\"short_names\":[\"congratulations\"],\"text\":null},{\"name\":\"CIRCLED IDEOGRAPH SECRET\",\"unified\":\"3299\",\"docomo\":\"E734\",\"au\":\"E4F1\",\"softbank\":\"E315\",\"google\":\"FEB2B\",\"image\":\"3299.png\",\"sheet_x\":28,\"sheet_y\":1,\"short_name\":\"secret\",\"short_names\":[\"secret\"],\"text\":null},{\"name\":\"MAHJONG TILE RED DRAGON\",\"unified\":\"1F004\",\"docomo\":\"\",\"au\":\"E5D1\",\"softbank\":\"E12D\",\"google\":\"FE80B\",\"image\":\"1f004.png\",\"sheet_x\":0,\"sheet_y\":13,\"short_name\":\"mahjong\",\"short_names\":[\"mahjong\"],\"text\":null},{\"name\":\"PLAYING CARD BLACK JOKER\",\"unified\":\"1F0CF\",\"docomo\":\"\",\"au\":\"EB6F\",\"softbank\":\"\",\"google\":\"FE812\",\"image\":\"1f0cf.png\",\"sheet_x\":0,\"sheet_y\":14,\"short_name\":\"black_joker\",\"short_names\":[\"black_joker\"],\"text\":null},{\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER A\",\"unified\":\"1F170\",\"docomo\":\"\",\"au\":\"EB26\",\"softbank\":\"E532\",\"google\":\"FE50B\",\"image\":\"1f170.png\",\"sheet_x\":0,\"sheet_y\":15,\"short_name\":\"a\",\"short_names\":[\"a\"],\"text\":null},{\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER B\",\"unified\":\"1F171\",\"docomo\":\"\",\"au\":\"EB27\",\"softbank\":\"E533\",\"google\":\"FE50C\",\"image\":\"1f171.png\",\"sheet_x\":0,\"sheet_y\":16,\"short_name\":\"b\",\"short_names\":[\"b\"],\"text\":null},{\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER O\",\"unified\":\"1F17E\",\"docomo\":\"\",\"au\":\"EB28\",\"softbank\":\"E535\",\"google\":\"FE50E\",\"image\":\"1f17e.png\",\"sheet_x\":0,\"sheet_y\":17,\"short_name\":\"o2\",\"short_names\":[\"o2\"],\"text\":null},{\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER P\",\"unified\":\"1F17F\",\"docomo\":\"E66C\",\"au\":\"E4A6\",\"softbank\":\"E14F\",\"google\":\"FE7F6\",\"image\":\"1f17f.png\",\"sheet_x\":0,\"sheet_y\":18,\"short_name\":\"parking\",\"short_names\":[\"parking\"],\"text\":null},{\"name\":\"NEGATIVE SQUARED AB\",\"unified\":\"1F18E\",\"docomo\":\"\",\"au\":\"EB29\",\"softbank\":\"E534\",\"google\":\"FE50D\",\"image\":\"1f18e.png\",\"sheet_x\":0,\"sheet_y\":19,\"short_name\":\"ab\",\"short_names\":[\"ab\"],\"text\":null},{\"name\":\"SQUARED CL\",\"unified\":\"1F191\",\"docomo\":\"E6DB\",\"au\":\"E5AB\",\"softbank\":\"\",\"google\":\"FEB84\",\"image\":\"1f191.png\",\"sheet_x\":0,\"sheet_y\":20,\"short_name\":\"cl\",\"short_names\":[\"cl\"],\"text\":null},{\"name\":\"SQUARED COOL\",\"unified\":\"1F192\",\"docomo\":\"\",\"au\":\"EA85\",\"softbank\":\"E214\",\"google\":\"FEB38\",\"image\":\"1f192.png\",\"sheet_x\":0,\"sheet_y\":21,\"short_name\":\"cool\",\"short_names\":[\"cool\"],\"text\":null},{\"name\":\"SQUARED FREE\",\"unified\":\"1F193\",\"docomo\":\"E6D7\",\"au\":\"E578\",\"softbank\":\"\",\"google\":\"FEB21\",\"image\":\"1f193.png\",\"sheet_x\":0,\"sheet_y\":22,\"short_name\":\"free\",\"short_names\":[\"free\"],\"text\":null},{\"name\":\"SQUARED ID\",\"unified\":\"1F194\",\"docomo\":\"E6D8\",\"au\":\"EA88\",\"softbank\":\"E229\",\"google\":\"FEB81\",\"image\":\"1f194.png\",\"sheet_x\":0,\"sheet_y\":23,\"short_name\":\"id\",\"short_names\":[\"id\"],\"text\":null},{\"name\":\"SQUARED NEW\",\"unified\":\"1F195\",\"docomo\":\"E6DD\",\"au\":\"E5B5\",\"softbank\":\"E212\",\"google\":\"FEB36\",\"image\":\"1f195.png\",\"sheet_x\":0,\"sheet_y\":24,\"short_name\":\"new\",\"short_names\":[\"new\"],\"text\":null},{\"name\":\"SQUARED NG\",\"unified\":\"1F196\",\"docomo\":\"E72F\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FEB28\",\"image\":\"1f196.png\",\"sheet_x\":0,\"sheet_y\":25,\"short_name\":\"ng\",\"short_names\":[\"ng\"],\"text\":null},{\"name\":\"SQUARED OK\",\"unified\":\"1F197\",\"docomo\":\"E70B\",\"au\":\"E5AD\",\"softbank\":\"E24D\",\"google\":\"FEB27\",\"image\":\"1f197.png\",\"sheet_x\":0,\"sheet_y\":26,\"short_name\":\"ok\",\"short_names\":[\"ok\"],\"text\":null},{\"name\":\"SQUARED SOS\",\"unified\":\"1F198\",\"docomo\":\"\",\"au\":\"E4E8\",\"softbank\":\"\",\"google\":\"FEB4F\",\"image\":\"1f198.png\",\"sheet_x\":0,\"sheet_y\":27,\"short_name\":\"sos\",\"short_names\":[\"sos\"],\"text\":null},{\"name\":\"SQUARED UP WITH EXCLAMATION MARK\",\"unified\":\"1F199\",\"docomo\":\"\",\"au\":\"E50F\",\"softbank\":\"E213\",\"google\":\"FEB37\",\"image\":\"1f199.png\",\"sheet_x\":0,\"sheet_y\":28,\"short_name\":\"up\",\"short_names\":[\"up\"],\"text\":null},{\"name\":\"SQUARED VS\",\"unified\":\"1F19A\",\"docomo\":\"\",\"au\":\"E5D2\",\"softbank\":\"E12E\",\"google\":\"FEB32\",\"image\":\"1f19a.png\",\"sheet_x\":0,\"sheet_y\":29,\"short_name\":\"vs\",\"short_names\":[\"vs\"],\"text\":null},{\"name\":\"SQUARED KATAKANA KOKO\",\"unified\":\"1F201\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E203\",\"google\":\"FEB24\",\"image\":\"1f201.png\",\"sheet_x\":1,\"sheet_y\":10,\"short_name\":\"koko\",\"short_names\":[\"koko\"],\"text\":null},{\"name\":\"SQUARED KATAKANA SA\",\"unified\":\"1F202\",\"docomo\":\"\",\"au\":\"EA87\",\"softbank\":\"E228\",\"google\":\"FEB3F\",\"image\":\"1f202.png\",\"sheet_x\":1,\"sheet_y\":11,\"short_name\":\"sa\",\"short_names\":[\"sa\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7121\",\"unified\":\"1F21A\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E216\",\"google\":\"FEB3A\",\"image\":\"1f21a.png\",\"sheet_x\":1,\"sheet_y\":12,\"short_name\":\"u7121\",\"short_names\":[\"u7121\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6307\",\"unified\":\"1F22F\",\"docomo\":\"\",\"au\":\"EA8B\",\"softbank\":\"E22C\",\"google\":\"FEB40\",\"image\":\"1f22f.png\",\"sheet_x\":1,\"sheet_y\":13,\"short_name\":\"u6307\",\"short_names\":[\"u6307\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7981\",\"unified\":\"1F232\",\"docomo\":\"E738\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FEB2E\",\"image\":\"1f232.png\",\"sheet_x\":1,\"sheet_y\":14,\"short_name\":\"u7981\",\"short_names\":[\"u7981\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7A7A\",\"unified\":\"1F233\",\"docomo\":\"E739\",\"au\":\"EA8A\",\"softbank\":\"E22B\",\"google\":\"FEB2F\",\"image\":\"1f233.png\",\"sheet_x\":1,\"sheet_y\":15,\"short_name\":\"u7a7a\",\"short_names\":[\"u7a7a\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-5408\",\"unified\":\"1F234\",\"docomo\":\"E73A\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FEB30\",\"image\":\"1f234.png\",\"sheet_x\":1,\"sheet_y\":16,\"short_name\":\"u5408\",\"short_names\":[\"u5408\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6E80\",\"unified\":\"1F235\",\"docomo\":\"E73B\",\"au\":\"EA89\",\"softbank\":\"E22A\",\"google\":\"FEB31\",\"image\":\"1f235.png\",\"sheet_x\":1,\"sheet_y\":17,\"short_name\":\"u6e80\",\"short_names\":[\"u6e80\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6709\",\"unified\":\"1F236\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E215\",\"google\":\"FEB39\",\"image\":\"1f236.png\",\"sheet_x\":1,\"sheet_y\":18,\"short_name\":\"u6709\",\"short_names\":[\"u6709\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6708\",\"unified\":\"1F237\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E217\",\"google\":\"FEB3B\",\"image\":\"1f237.png\",\"sheet_x\":1,\"sheet_y\":19,\"short_name\":\"u6708\",\"short_names\":[\"u6708\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7533\",\"unified\":\"1F238\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E218\",\"google\":\"FEB3C\",\"image\":\"1f238.png\",\"sheet_x\":1,\"sheet_y\":20,\"short_name\":\"u7533\",\"short_names\":[\"u7533\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-5272\",\"unified\":\"1F239\",\"docomo\":\"\",\"au\":\"EA86\",\"softbank\":\"E227\",\"google\":\"FEB3E\",\"image\":\"1f239.png\",\"sheet_x\":1,\"sheet_y\":21,\"short_name\":\"u5272\",\"short_names\":[\"u5272\"],\"text\":null},{\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-55B6\",\"unified\":\"1F23A\",\"docomo\":\"\",\"au\":\"EA8C\",\"softbank\":\"E22D\",\"google\":\"FEB41\",\"image\":\"1f23a.png\",\"sheet_x\":1,\"sheet_y\":22,\"short_name\":\"u55b6\",\"short_names\":[\"u55b6\"],\"text\":null},{\"name\":\"CIRCLED IDEOGRAPH ADVANTAGE\",\"unified\":\"1F250\",\"docomo\":\"\",\"au\":\"E4F7\",\"softbank\":\"E226\",\"google\":\"FEB3D\",\"image\":\"1f250.png\",\"sheet_x\":1,\"sheet_y\":23,\"short_name\":\"ideograph_advantage\",\"short_names\":[\"ideograph_advantage\"],\"text\":null},{\"name\":\"CIRCLED IDEOGRAPH ACCEPT\",\"unified\":\"1F251\",\"docomo\":\"\",\"au\":\"EB01\",\"softbank\":\"\",\"google\":\"FEB50\",\"image\":\"1f251.png\",\"sheet_x\":1,\"sheet_y\":24,\"short_name\":\"accept\",\"short_names\":[\"accept\"],\"text\":null},{\"name\":\"CYCLONE\",\"unified\":\"1F300\",\"docomo\":\"E643\",\"au\":\"E469\",\"softbank\":\"E443\",\"google\":\"FE005\",\"image\":\"1f300.png\",\"sheet_x\":1,\"sheet_y\":25,\"short_name\":\"cyclone\",\"short_names\":[\"cyclone\"],\"text\":null},{\"name\":\"FOGGY\",\"unified\":\"1F301\",\"docomo\":\"E644\",\"au\":\"E598\",\"softbank\":\"\",\"google\":\"FE006\",\"image\":\"1f301.png\",\"sheet_x\":1,\"sheet_y\":26,\"short_name\":\"foggy\",\"short_names\":[\"foggy\"],\"text\":null},{\"name\":\"CLOSED UMBRELLA\",\"unified\":\"1F302\",\"docomo\":\"E645\",\"au\":\"EAE8\",\"softbank\":\"E43C\",\"google\":\"FE007\",\"image\":\"1f302.png\",\"sheet_x\":1,\"sheet_y\":27,\"short_name\":\"closed_umbrella\",\"short_names\":[\"closed_umbrella\"],\"text\":null},{\"name\":\"NIGHT WITH STARS\",\"unified\":\"1F303\",\"docomo\":\"E6B3\",\"au\":\"EAF1\",\"softbank\":\"E44B\",\"google\":\"FE008\",\"image\":\"1f303.png\",\"sheet_x\":1,\"sheet_y\":28,\"short_name\":\"stars\",\"short_names\":[\"stars\"],\"text\":null},{\"name\":\"SUNRISE OVER MOUNTAINS\",\"unified\":\"1F304\",\"docomo\":\"E63E\",\"au\":\"EAF4\",\"softbank\":\"E04D\",\"google\":\"FE009\",\"image\":\"1f304.png\",\"sheet_x\":1,\"sheet_y\":29,\"short_name\":\"sunrise_over_mountains\",\"short_names\":[\"sunrise_over_mountains\"],\"text\":null},{\"name\":\"SUNRISE\",\"unified\":\"1F305\",\"docomo\":\"E63E\",\"au\":\"EAF4\",\"softbank\":\"E449\",\"google\":\"FE00A\",\"image\":\"1f305.png\",\"sheet_x\":2,\"sheet_y\":0,\"short_name\":\"sunrise\",\"short_names\":[\"sunrise\"],\"text\":null},{\"name\":\"CITYSCAPE AT DUSK\",\"unified\":\"1F306\",\"docomo\":\"\",\"au\":\"E5DA\",\"softbank\":\"E146\",\"google\":\"FE00B\",\"image\":\"1f306.png\",\"sheet_x\":2,\"sheet_y\":1,\"short_name\":\"city_sunset\",\"short_names\":[\"city_sunset\"],\"text\":null},{\"name\":\"SUNSET OVER BUILDINGS\",\"unified\":\"1F307\",\"docomo\":\"E63E\",\"au\":\"E5DA\",\"softbank\":\"E44A\",\"google\":\"FE00C\",\"image\":\"1f307.png\",\"sheet_x\":2,\"sheet_y\":2,\"short_name\":\"city_sunrise\",\"short_names\":[\"city_sunrise\"],\"text\":null},{\"name\":\"RAINBOW\",\"unified\":\"1F308\",\"docomo\":\"\",\"au\":\"EAF2\",\"softbank\":\"E44C\",\"google\":\"FE00D\",\"image\":\"1f308.png\",\"sheet_x\":2,\"sheet_y\":3,\"short_name\":\"rainbow\",\"short_names\":[\"rainbow\"],\"text\":null},{\"name\":\"BRIDGE AT NIGHT\",\"unified\":\"1F309\",\"docomo\":\"E6B3\",\"au\":\"E4BF\",\"softbank\":\"E44B\",\"google\":\"FE010\",\"image\":\"1f309.png\",\"sheet_x\":2,\"sheet_y\":4,\"short_name\":\"bridge_at_night\",\"short_names\":[\"bridge_at_night\"],\"text\":null},{\"name\":\"WATER WAVE\",\"unified\":\"1F30A\",\"docomo\":\"E73F\",\"au\":\"EB7C\",\"softbank\":\"E43E\",\"google\":\"FE038\",\"image\":\"1f30a.png\",\"sheet_x\":2,\"sheet_y\":5,\"short_name\":\"ocean\",\"short_names\":[\"ocean\"],\"text\":null},{\"name\":\"VOLCANO\",\"unified\":\"1F30B\",\"docomo\":\"\",\"au\":\"EB53\",\"softbank\":\"\",\"google\":\"FE03A\",\"image\":\"1f30b.png\",\"sheet_x\":2,\"sheet_y\":6,\"short_name\":\"volcano\",\"short_names\":[\"volcano\"],\"text\":null},{\"name\":\"MILKY WAY\",\"unified\":\"1F30C\",\"docomo\":\"E6B3\",\"au\":\"EB5F\",\"softbank\":\"E44B\",\"google\":\"FE03B\",\"image\":\"1f30c.png\",\"sheet_x\":2,\"sheet_y\":7,\"short_name\":\"milky_way\",\"short_names\":[\"milky_way\"],\"text\":null},{\"name\":\"EARTH GLOBE EUROPE-AFRICA\",\"unified\":\"1F30D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f30d.png\",\"sheet_x\":2,\"sheet_y\":8,\"short_name\":\"earth_africa\",\"short_names\":[\"earth_africa\"],\"text\":null},{\"name\":\"EARTH GLOBE AMERICAS\",\"unified\":\"1F30E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f30e.png\",\"sheet_x\":2,\"sheet_y\":9,\"short_name\":\"earth_americas\",\"short_names\":[\"earth_americas\"],\"text\":null},{\"name\":\"EARTH GLOBE ASIA-AUSTRALIA\",\"unified\":\"1F30F\",\"docomo\":\"\",\"au\":\"E5B3\",\"softbank\":\"\",\"google\":\"FE039\",\"image\":\"1f30f.png\",\"sheet_x\":2,\"sheet_y\":10,\"short_name\":\"earth_asia\",\"short_names\":[\"earth_asia\"],\"text\":null},{\"name\":\"GLOBE WITH MERIDIANS\",\"unified\":\"1F310\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f310.png\",\"sheet_x\":2,\"sheet_y\":11,\"short_name\":\"globe_with_meridians\",\"short_names\":[\"globe_with_meridians\"],\"text\":null},{\"name\":\"NEW MOON SYMBOL\",\"unified\":\"1F311\",\"docomo\":\"E69C\",\"au\":\"E5A8\",\"softbank\":\"\",\"google\":\"FE011\",\"image\":\"1f311.png\",\"sheet_x\":2,\"sheet_y\":12,\"short_name\":\"new_moon\",\"short_names\":[\"new_moon\"],\"text\":null},{\"name\":\"WAXING CRESCENT MOON SYMBOL\",\"unified\":\"1F312\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f312.png\",\"sheet_x\":2,\"sheet_y\":13,\"short_name\":\"waxing_crescent_moon\",\"short_names\":[\"waxing_crescent_moon\"],\"text\":null},{\"name\":\"FIRST QUARTER MOON SYMBOL\",\"unified\":\"1F313\",\"docomo\":\"E69E\",\"au\":\"E5AA\",\"softbank\":\"E04C\",\"google\":\"FE013\",\"image\":\"1f313.png\",\"sheet_x\":2,\"sheet_y\":14,\"short_name\":\"first_quarter_moon\",\"short_names\":[\"first_quarter_moon\"],\"text\":null},{\"name\":\"WAXING GIBBOUS MOON SYMBOL\",\"unified\":\"1F314\",\"docomo\":\"E69D\",\"au\":\"E5A9\",\"softbank\":\"E04C\",\"google\":\"FE012\",\"image\":\"1f314.png\",\"sheet_x\":2,\"sheet_y\":15,\"short_name\":\"moon\",\"short_names\":[\"moon\",\"waxing_gibbous_moon\"],\"text\":null},{\"name\":\"FULL MOON SYMBOL\",\"unified\":\"1F315\",\"docomo\":\"E6A0\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE015\",\"image\":\"1f315.png\",\"sheet_x\":2,\"sheet_y\":16,\"short_name\":\"full_moon\",\"short_names\":[\"full_moon\"],\"text\":null},{\"name\":\"WANING GIBBOUS MOON SYMBOL\",\"unified\":\"1F316\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f316.png\",\"sheet_x\":2,\"sheet_y\":17,\"short_name\":\"waning_gibbous_moon\",\"short_names\":[\"waning_gibbous_moon\"],\"text\":null},{\"name\":\"LAST QUARTER MOON SYMBOL\",\"unified\":\"1F317\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f317.png\",\"sheet_x\":2,\"sheet_y\":18,\"short_name\":\"last_quarter_moon\",\"short_names\":[\"last_quarter_moon\"],\"text\":null},{\"name\":\"WANING CRESCENT MOON SYMBOL\",\"unified\":\"1F318\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f318.png\",\"sheet_x\":2,\"sheet_y\":19,\"short_name\":\"waning_crescent_moon\",\"short_names\":[\"waning_crescent_moon\"],\"text\":null},{\"name\":\"CRESCENT MOON\",\"unified\":\"1F319\",\"docomo\":\"E69F\",\"au\":\"E486\",\"softbank\":\"E04C\",\"google\":\"FE014\",\"image\":\"1f319.png\",\"sheet_x\":2,\"sheet_y\":20,\"short_name\":\"crescent_moon\",\"short_names\":[\"crescent_moon\"],\"text\":null},{\"name\":\"NEW MOON WITH FACE\",\"unified\":\"1F31A\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f31a.png\",\"sheet_x\":2,\"sheet_y\":21,\"short_name\":\"new_moon_with_face\",\"short_names\":[\"new_moon_with_face\"],\"text\":null},{\"name\":\"FIRST QUARTER MOON WITH FACE\",\"unified\":\"1F31B\",\"docomo\":\"E69E\",\"au\":\"E489\",\"softbank\":\"E04C\",\"google\":\"FE016\",\"image\":\"1f31b.png\",\"sheet_x\":2,\"sheet_y\":22,\"short_name\":\"first_quarter_moon_with_face\",\"short_names\":[\"first_quarter_moon_with_face\"],\"text\":null},{\"name\":\"LAST QUARTER MOON WITH FACE\",\"unified\":\"1F31C\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f31c.png\",\"sheet_x\":2,\"sheet_y\":23,\"short_name\":\"last_quarter_moon_with_face\",\"short_names\":[\"last_quarter_moon_with_face\"],\"text\":null},{\"name\":\"FULL MOON WITH FACE\",\"unified\":\"1F31D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f31d.png\",\"sheet_x\":2,\"sheet_y\":24,\"short_name\":\"full_moon_with_face\",\"short_names\":[\"full_moon_with_face\"],\"text\":null},{\"name\":\"SUN WITH FACE\",\"unified\":\"1F31E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f31e.png\",\"sheet_x\":2,\"sheet_y\":25,\"short_name\":\"sun_with_face\",\"short_names\":[\"sun_with_face\"],\"text\":null},{\"name\":\"GLOWING STAR\",\"unified\":\"1F31F\",\"docomo\":\"\",\"au\":\"E48B\",\"softbank\":\"E335\",\"google\":\"FEB69\",\"image\":\"1f31f.png\",\"sheet_x\":2,\"sheet_y\":26,\"short_name\":\"star2\",\"short_names\":[\"star2\"],\"text\":null},{\"name\":\"CHESTNUT\",\"unified\":\"1F330\",\"docomo\":\"\",\"au\":\"EB38\",\"softbank\":\"\",\"google\":\"FE04C\",\"image\":\"1f330.png\",\"sheet_x\":2,\"sheet_y\":27,\"short_name\":\"chestnut\",\"short_names\":[\"chestnut\"],\"text\":null},{\"name\":\"SEEDLING\",\"unified\":\"1F331\",\"docomo\":\"E746\",\"au\":\"EB7D\",\"softbank\":\"E110\",\"google\":\"FE03E\",\"image\":\"1f331.png\",\"sheet_x\":2,\"sheet_y\":28,\"short_name\":\"seedling\",\"short_names\":[\"seedling\"],\"text\":null},{\"name\":\"EVERGREEN TREE\",\"unified\":\"1F332\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f332.png\",\"sheet_x\":2,\"sheet_y\":29,\"short_name\":\"evergreen_tree\",\"short_names\":[\"evergreen_tree\"],\"text\":null},{\"name\":\"DECIDUOUS TREE\",\"unified\":\"1F333\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f333.png\",\"sheet_x\":3,\"sheet_y\":0,\"short_name\":\"deciduous_tree\",\"short_names\":[\"deciduous_tree\"],\"text\":null},{\"name\":\"PALM TREE\",\"unified\":\"1F334\",\"docomo\":\"\",\"au\":\"E4E2\",\"softbank\":\"E307\",\"google\":\"FE047\",\"image\":\"1f334.png\",\"sheet_x\":3,\"sheet_y\":1,\"short_name\":\"palm_tree\",\"short_names\":[\"palm_tree\"],\"text\":null},{\"name\":\"CACTUS\",\"unified\":\"1F335\",\"docomo\":\"\",\"au\":\"EA96\",\"softbank\":\"E308\",\"google\":\"FE048\",\"image\":\"1f335.png\",\"sheet_x\":3,\"sheet_y\":2,\"short_name\":\"cactus\",\"short_names\":[\"cactus\"],\"text\":null},{\"name\":\"TULIP\",\"unified\":\"1F337\",\"docomo\":\"E743\",\"au\":\"E4E4\",\"softbank\":\"E304\",\"google\":\"FE03D\",\"image\":\"1f337.png\",\"sheet_x\":3,\"sheet_y\":3,\"short_name\":\"tulip\",\"short_names\":[\"tulip\"],\"text\":null},{\"name\":\"CHERRY BLOSSOM\",\"unified\":\"1F338\",\"docomo\":\"E748\",\"au\":\"E4CA\",\"softbank\":\"E030\",\"google\":\"FE040\",\"image\":\"1f338.png\",\"sheet_x\":3,\"sheet_y\":4,\"short_name\":\"cherry_blossom\",\"short_names\":[\"cherry_blossom\"],\"text\":null},{\"name\":\"ROSE\",\"unified\":\"1F339\",\"docomo\":\"\",\"au\":\"E5BA\",\"softbank\":\"E032\",\"google\":\"FE041\",\"image\":\"1f339.png\",\"sheet_x\":3,\"sheet_y\":5,\"short_name\":\"rose\",\"short_names\":[\"rose\"],\"text\":null},{\"name\":\"HIBISCUS\",\"unified\":\"1F33A\",\"docomo\":\"\",\"au\":\"EA94\",\"softbank\":\"E303\",\"google\":\"FE045\",\"image\":\"1f33a.png\",\"sheet_x\":3,\"sheet_y\":6,\"short_name\":\"hibiscus\",\"short_names\":[\"hibiscus\"],\"text\":null},{\"name\":\"SUNFLOWER\",\"unified\":\"1F33B\",\"docomo\":\"\",\"au\":\"E4E3\",\"softbank\":\"E305\",\"google\":\"FE046\",\"image\":\"1f33b.png\",\"sheet_x\":3,\"sheet_y\":7,\"short_name\":\"sunflower\",\"short_names\":[\"sunflower\"],\"text\":null},{\"name\":\"BLOSSOM\",\"unified\":\"1F33C\",\"docomo\":\"\",\"au\":\"EB49\",\"softbank\":\"E305\",\"google\":\"FE04D\",\"image\":\"1f33c.png\",\"sheet_x\":3,\"sheet_y\":8,\"short_name\":\"blossom\",\"short_names\":[\"blossom\"],\"text\":null},{\"name\":\"EAR OF MAIZE\",\"unified\":\"1F33D\",\"docomo\":\"\",\"au\":\"EB36\",\"softbank\":\"\",\"google\":\"FE04A\",\"image\":\"1f33d.png\",\"sheet_x\":3,\"sheet_y\":9,\"short_name\":\"corn\",\"short_names\":[\"corn\"],\"text\":null},{\"name\":\"EAR OF RICE\",\"unified\":\"1F33E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E444\",\"google\":\"FE049\",\"image\":\"1f33e.png\",\"sheet_x\":3,\"sheet_y\":10,\"short_name\":\"ear_of_rice\",\"short_names\":[\"ear_of_rice\"],\"text\":null},{\"name\":\"HERB\",\"unified\":\"1F33F\",\"docomo\":\"E741\",\"au\":\"EB82\",\"softbank\":\"E110\",\"google\":\"FE04E\",\"image\":\"1f33f.png\",\"sheet_x\":3,\"sheet_y\":11,\"short_name\":\"herb\",\"short_names\":[\"herb\"],\"text\":null},{\"name\":\"FOUR LEAF CLOVER\",\"unified\":\"1F340\",\"docomo\":\"E741\",\"au\":\"E513\",\"softbank\":\"E110\",\"google\":\"FE03C\",\"image\":\"1f340.png\",\"sheet_x\":3,\"sheet_y\":12,\"short_name\":\"four_leaf_clover\",\"short_names\":[\"four_leaf_clover\"],\"text\":null},{\"name\":\"MAPLE LEAF\",\"unified\":\"1F341\",\"docomo\":\"E747\",\"au\":\"E4CE\",\"softbank\":\"E118\",\"google\":\"FE03F\",\"image\":\"1f341.png\",\"sheet_x\":3,\"sheet_y\":13,\"short_name\":\"maple_leaf\",\"short_names\":[\"maple_leaf\"],\"text\":null},{\"name\":\"FALLEN LEAF\",\"unified\":\"1F342\",\"docomo\":\"E747\",\"au\":\"E5CD\",\"softbank\":\"E119\",\"google\":\"FE042\",\"image\":\"1f342.png\",\"sheet_x\":3,\"sheet_y\":14,\"short_name\":\"fallen_leaf\",\"short_names\":[\"fallen_leaf\"],\"text\":null},{\"name\":\"LEAF FLUTTERING IN WIND\",\"unified\":\"1F343\",\"docomo\":\"\",\"au\":\"E5CD\",\"softbank\":\"E447\",\"google\":\"FE043\",\"image\":\"1f343.png\",\"sheet_x\":3,\"sheet_y\":15,\"short_name\":\"leaves\",\"short_names\":[\"leaves\"],\"text\":null},{\"name\":\"MUSHROOM\",\"unified\":\"1F344\",\"docomo\":\"\",\"au\":\"EB37\",\"softbank\":\"\",\"google\":\"FE04B\",\"image\":\"1f344.png\",\"sheet_x\":3,\"sheet_y\":16,\"short_name\":\"mushroom\",\"short_names\":[\"mushroom\"],\"text\":null},{\"name\":\"TOMATO\",\"unified\":\"1F345\",\"docomo\":\"\",\"au\":\"EABB\",\"softbank\":\"E349\",\"google\":\"FE055\",\"image\":\"1f345.png\",\"sheet_x\":3,\"sheet_y\":17,\"short_name\":\"tomato\",\"short_names\":[\"tomato\"],\"text\":null},{\"name\":\"AUBERGINE\",\"unified\":\"1F346\",\"docomo\":\"\",\"au\":\"EABC\",\"softbank\":\"E34A\",\"google\":\"FE056\",\"image\":\"1f346.png\",\"sheet_x\":3,\"sheet_y\":18,\"short_name\":\"eggplant\",\"short_names\":[\"eggplant\"],\"text\":null},{\"name\":\"GRAPES\",\"unified\":\"1F347\",\"docomo\":\"\",\"au\":\"EB34\",\"softbank\":\"\",\"google\":\"FE059\",\"image\":\"1f347.png\",\"sheet_x\":3,\"sheet_y\":19,\"short_name\":\"grapes\",\"short_names\":[\"grapes\"],\"text\":null},{\"name\":\"MELON\",\"unified\":\"1F348\",\"docomo\":\"\",\"au\":\"EB32\",\"softbank\":\"\",\"google\":\"FE057\",\"image\":\"1f348.png\",\"sheet_x\":3,\"sheet_y\":20,\"short_name\":\"melon\",\"short_names\":[\"melon\"],\"text\":null},{\"name\":\"WATERMELON\",\"unified\":\"1F349\",\"docomo\":\"\",\"au\":\"E4CD\",\"softbank\":\"E348\",\"google\":\"FE054\",\"image\":\"1f349.png\",\"sheet_x\":3,\"sheet_y\":21,\"short_name\":\"watermelon\",\"short_names\":[\"watermelon\"],\"text\":null},{\"name\":\"TANGERINE\",\"unified\":\"1F34A\",\"docomo\":\"\",\"au\":\"EABA\",\"softbank\":\"E346\",\"google\":\"FE052\",\"image\":\"1f34a.png\",\"sheet_x\":3,\"sheet_y\":22,\"short_name\":\"tangerine\",\"short_names\":[\"tangerine\"],\"text\":null},{\"name\":\"LEMON\",\"unified\":\"1F34B\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f34b.png\",\"sheet_x\":3,\"sheet_y\":23,\"short_name\":\"lemon\",\"short_names\":[\"lemon\"],\"text\":null},{\"name\":\"BANANA\",\"unified\":\"1F34C\",\"docomo\":\"E744\",\"au\":\"EB35\",\"softbank\":\"\",\"google\":\"FE050\",\"image\":\"1f34c.png\",\"sheet_x\":3,\"sheet_y\":24,\"short_name\":\"banana\",\"short_names\":[\"banana\"],\"text\":null},{\"name\":\"PINEAPPLE\",\"unified\":\"1F34D\",\"docomo\":\"\",\"au\":\"EB33\",\"softbank\":\"\",\"google\":\"FE058\",\"image\":\"1f34d.png\",\"sheet_x\":3,\"sheet_y\":25,\"short_name\":\"pineapple\",\"short_names\":[\"pineapple\"],\"text\":null},{\"name\":\"RED APPLE\",\"unified\":\"1F34E\",\"docomo\":\"E745\",\"au\":\"EAB9\",\"softbank\":\"E345\",\"google\":\"FE051\",\"image\":\"1f34e.png\",\"sheet_x\":3,\"sheet_y\":26,\"short_name\":\"apple\",\"short_names\":[\"apple\"],\"text\":null},{\"name\":\"GREEN APPLE\",\"unified\":\"1F34F\",\"docomo\":\"E745\",\"au\":\"EB5A\",\"softbank\":\"E345\",\"google\":\"FE05B\",\"image\":\"1f34f.png\",\"sheet_x\":3,\"sheet_y\":27,\"short_name\":\"green_apple\",\"short_names\":[\"green_apple\"],\"text\":null},{\"name\":\"PEAR\",\"unified\":\"1F350\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f350.png\",\"sheet_x\":3,\"sheet_y\":28,\"short_name\":\"pear\",\"short_names\":[\"pear\"],\"text\":null},{\"name\":\"PEACH\",\"unified\":\"1F351\",\"docomo\":\"\",\"au\":\"EB39\",\"softbank\":\"\",\"google\":\"FE05A\",\"image\":\"1f351.png\",\"sheet_x\":3,\"sheet_y\":29,\"short_name\":\"peach\",\"short_names\":[\"peach\"],\"text\":null},{\"name\":\"CHERRIES\",\"unified\":\"1F352\",\"docomo\":\"E742\",\"au\":\"E4D2\",\"softbank\":\"\",\"google\":\"FE04F\",\"image\":\"1f352.png\",\"sheet_x\":4,\"sheet_y\":0,\"short_name\":\"cherries\",\"short_names\":[\"cherries\"],\"text\":null},{\"name\":\"STRAWBERRY\",\"unified\":\"1F353\",\"docomo\":\"\",\"au\":\"E4D4\",\"softbank\":\"E347\",\"google\":\"FE053\",\"image\":\"1f353.png\",\"sheet_x\":4,\"sheet_y\":1,\"short_name\":\"strawberry\",\"short_names\":[\"strawberry\"],\"text\":null},{\"name\":\"HAMBURGER\",\"unified\":\"1F354\",\"docomo\":\"E673\",\"au\":\"E4D6\",\"softbank\":\"E120\",\"google\":\"FE960\",\"image\":\"1f354.png\",\"sheet_x\":4,\"sheet_y\":2,\"short_name\":\"hamburger\",\"short_names\":[\"hamburger\"],\"text\":null},{\"name\":\"SLICE OF PIZZA\",\"unified\":\"1F355\",\"docomo\":\"\",\"au\":\"EB3B\",\"softbank\":\"\",\"google\":\"FE975\",\"image\":\"1f355.png\",\"sheet_x\":4,\"sheet_y\":3,\"short_name\":\"pizza\",\"short_names\":[\"pizza\"],\"text\":null},{\"name\":\"MEAT ON BONE\",\"unified\":\"1F356\",\"docomo\":\"\",\"au\":\"E4C4\",\"softbank\":\"\",\"google\":\"FE972\",\"image\":\"1f356.png\",\"sheet_x\":4,\"sheet_y\":4,\"short_name\":\"meat_on_bone\",\"short_names\":[\"meat_on_bone\"],\"text\":null},{\"name\":\"POULTRY LEG\",\"unified\":\"1F357\",\"docomo\":\"\",\"au\":\"EB3C\",\"softbank\":\"\",\"google\":\"FE976\",\"image\":\"1f357.png\",\"sheet_x\":4,\"sheet_y\":5,\"short_name\":\"poultry_leg\",\"short_names\":[\"poultry_leg\"],\"text\":null},{\"name\":\"RICE CRACKER\",\"unified\":\"1F358\",\"docomo\":\"\",\"au\":\"EAB3\",\"softbank\":\"E33D\",\"google\":\"FE969\",\"image\":\"1f358.png\",\"sheet_x\":4,\"sheet_y\":6,\"short_name\":\"rice_cracker\",\"short_names\":[\"rice_cracker\"],\"text\":null},{\"name\":\"RICE BALL\",\"unified\":\"1F359\",\"docomo\":\"E749\",\"au\":\"E4D5\",\"softbank\":\"E342\",\"google\":\"FE961\",\"image\":\"1f359.png\",\"sheet_x\":4,\"sheet_y\":7,\"short_name\":\"rice_ball\",\"short_names\":[\"rice_ball\"],\"text\":null},{\"name\":\"COOKED RICE\",\"unified\":\"1F35A\",\"docomo\":\"E74C\",\"au\":\"EAB4\",\"softbank\":\"E33E\",\"google\":\"FE96A\",\"image\":\"1f35a.png\",\"sheet_x\":4,\"sheet_y\":8,\"short_name\":\"rice\",\"short_names\":[\"rice\"],\"text\":null},{\"name\":\"CURRY AND RICE\",\"unified\":\"1F35B\",\"docomo\":\"\",\"au\":\"EAB6\",\"softbank\":\"E341\",\"google\":\"FE96C\",\"image\":\"1f35b.png\",\"sheet_x\":4,\"sheet_y\":9,\"short_name\":\"curry\",\"short_names\":[\"curry\"],\"text\":null},{\"name\":\"STEAMING BOWL\",\"unified\":\"1F35C\",\"docomo\":\"E74C\",\"au\":\"E5B4\",\"softbank\":\"E340\",\"google\":\"FE963\",\"image\":\"1f35c.png\",\"sheet_x\":4,\"sheet_y\":10,\"short_name\":\"ramen\",\"short_names\":[\"ramen\"],\"text\":null},{\"name\":\"SPAGHETTI\",\"unified\":\"1F35D\",\"docomo\":\"\",\"au\":\"EAB5\",\"softbank\":\"E33F\",\"google\":\"FE96B\",\"image\":\"1f35d.png\",\"sheet_x\":4,\"sheet_y\":11,\"short_name\":\"spaghetti\",\"short_names\":[\"spaghetti\"],\"text\":null},{\"name\":\"BREAD\",\"unified\":\"1F35E\",\"docomo\":\"E74D\",\"au\":\"EAAF\",\"softbank\":\"E339\",\"google\":\"FE964\",\"image\":\"1f35e.png\",\"sheet_x\":4,\"sheet_y\":12,\"short_name\":\"bread\",\"short_names\":[\"bread\"],\"text\":null},{\"name\":\"FRENCH FRIES\",\"unified\":\"1F35F\",\"docomo\":\"\",\"au\":\"EAB1\",\"softbank\":\"E33B\",\"google\":\"FE967\",\"image\":\"1f35f.png\",\"sheet_x\":4,\"sheet_y\":13,\"short_name\":\"fries\",\"short_names\":[\"fries\"],\"text\":null},{\"name\":\"ROASTED SWEET POTATO\",\"unified\":\"1F360\",\"docomo\":\"\",\"au\":\"EB3A\",\"softbank\":\"\",\"google\":\"FE974\",\"image\":\"1f360.png\",\"sheet_x\":4,\"sheet_y\":14,\"short_name\":\"sweet_potato\",\"short_names\":[\"sweet_potato\"],\"text\":null},{\"name\":\"DANGO\",\"unified\":\"1F361\",\"docomo\":\"\",\"au\":\"EAB2\",\"softbank\":\"E33C\",\"google\":\"FE968\",\"image\":\"1f361.png\",\"sheet_x\":4,\"sheet_y\":15,\"short_name\":\"dango\",\"short_names\":[\"dango\"],\"text\":null},{\"name\":\"ODEN\",\"unified\":\"1F362\",\"docomo\":\"\",\"au\":\"EAB7\",\"softbank\":\"E343\",\"google\":\"FE96D\",\"image\":\"1f362.png\",\"sheet_x\":4,\"sheet_y\":16,\"short_name\":\"oden\",\"short_names\":[\"oden\"],\"text\":null},{\"name\":\"SUSHI\",\"unified\":\"1F363\",\"docomo\":\"\",\"au\":\"EAB8\",\"softbank\":\"E344\",\"google\":\"FE96E\",\"image\":\"1f363.png\",\"sheet_x\":4,\"sheet_y\":17,\"short_name\":\"sushi\",\"short_names\":[\"sushi\"],\"text\":null},{\"name\":\"FRIED SHRIMP\",\"unified\":\"1F364\",\"docomo\":\"\",\"au\":\"EB70\",\"softbank\":\"\",\"google\":\"FE97F\",\"image\":\"1f364.png\",\"sheet_x\":4,\"sheet_y\":18,\"short_name\":\"fried_shrimp\",\"short_names\":[\"fried_shrimp\"],\"text\":null},{\"name\":\"FISH CAKE WITH SWIRL DESIGN\",\"unified\":\"1F365\",\"docomo\":\"E643\",\"au\":\"E4ED\",\"softbank\":\"\",\"google\":\"FE973\",\"image\":\"1f365.png\",\"sheet_x\":4,\"sheet_y\":19,\"short_name\":\"fish_cake\",\"short_names\":[\"fish_cake\"],\"text\":null},{\"name\":\"SOFT ICE CREAM\",\"unified\":\"1F366\",\"docomo\":\"\",\"au\":\"EAB0\",\"softbank\":\"E33A\",\"google\":\"FE966\",\"image\":\"1f366.png\",\"sheet_x\":4,\"sheet_y\":20,\"short_name\":\"icecream\",\"short_names\":[\"icecream\"],\"text\":null},{\"name\":\"SHAVED ICE\",\"unified\":\"1F367\",\"docomo\":\"\",\"au\":\"EAEA\",\"softbank\":\"E43F\",\"google\":\"FE971\",\"image\":\"1f367.png\",\"sheet_x\":4,\"sheet_y\":21,\"short_name\":\"shaved_ice\",\"short_names\":[\"shaved_ice\"],\"text\":null},{\"name\":\"ICE CREAM\",\"unified\":\"1F368\",\"docomo\":\"\",\"au\":\"EB4A\",\"softbank\":\"\",\"google\":\"FE977\",\"image\":\"1f368.png\",\"sheet_x\":4,\"sheet_y\":22,\"short_name\":\"ice_cream\",\"short_names\":[\"ice_cream\"],\"text\":null},{\"name\":\"DOUGHNUT\",\"unified\":\"1F369\",\"docomo\":\"\",\"au\":\"EB4B\",\"softbank\":\"\",\"google\":\"FE978\",\"image\":\"1f369.png\",\"sheet_x\":4,\"sheet_y\":23,\"short_name\":\"doughnut\",\"short_names\":[\"doughnut\"],\"text\":null},{\"name\":\"COOKIE\",\"unified\":\"1F36A\",\"docomo\":\"\",\"au\":\"EB4C\",\"softbank\":\"\",\"google\":\"FE979\",\"image\":\"1f36a.png\",\"sheet_x\":4,\"sheet_y\":24,\"short_name\":\"cookie\",\"short_names\":[\"cookie\"],\"text\":null},{\"name\":\"CHOCOLATE BAR\",\"unified\":\"1F36B\",\"docomo\":\"\",\"au\":\"EB4D\",\"softbank\":\"\",\"google\":\"FE97A\",\"image\":\"1f36b.png\",\"sheet_x\":4,\"sheet_y\":25,\"short_name\":\"chocolate_bar\",\"short_names\":[\"chocolate_bar\"],\"text\":null},{\"name\":\"CANDY\",\"unified\":\"1F36C\",\"docomo\":\"\",\"au\":\"EB4E\",\"softbank\":\"\",\"google\":\"FE97B\",\"image\":\"1f36c.png\",\"sheet_x\":4,\"sheet_y\":26,\"short_name\":\"candy\",\"short_names\":[\"candy\"],\"text\":null},{\"name\":\"LOLLIPOP\",\"unified\":\"1F36D\",\"docomo\":\"\",\"au\":\"EB4F\",\"softbank\":\"\",\"google\":\"FE97C\",\"image\":\"1f36d.png\",\"sheet_x\":4,\"sheet_y\":27,\"short_name\":\"lollipop\",\"short_names\":[\"lollipop\"],\"text\":null},{\"name\":\"CUSTARD\",\"unified\":\"1F36E\",\"docomo\":\"\",\"au\":\"EB56\",\"softbank\":\"\",\"google\":\"FE97D\",\"image\":\"1f36e.png\",\"sheet_x\":4,\"sheet_y\":28,\"short_name\":\"custard\",\"short_names\":[\"custard\"],\"text\":null},{\"name\":\"HONEY POT\",\"unified\":\"1F36F\",\"docomo\":\"\",\"au\":\"EB59\",\"softbank\":\"\",\"google\":\"FE97E\",\"image\":\"1f36f.png\",\"sheet_x\":4,\"sheet_y\":29,\"short_name\":\"honey_pot\",\"short_names\":[\"honey_pot\"],\"text\":null},{\"name\":\"SHORTCAKE\",\"unified\":\"1F370\",\"docomo\":\"E74A\",\"au\":\"E4D0\",\"softbank\":\"E046\",\"google\":\"FE962\",\"image\":\"1f370.png\",\"sheet_x\":5,\"sheet_y\":0,\"short_name\":\"cake\",\"short_names\":[\"cake\"],\"text\":null},{\"name\":\"BENTO BOX\",\"unified\":\"1F371\",\"docomo\":\"\",\"au\":\"EABD\",\"softbank\":\"E34C\",\"google\":\"FE96F\",\"image\":\"1f371.png\",\"sheet_x\":5,\"sheet_y\":1,\"short_name\":\"bento\",\"short_names\":[\"bento\"],\"text\":null},{\"name\":\"POT OF FOOD\",\"unified\":\"1F372\",\"docomo\":\"\",\"au\":\"EABE\",\"softbank\":\"E34D\",\"google\":\"FE970\",\"image\":\"1f372.png\",\"sheet_x\":5,\"sheet_y\":2,\"short_name\":\"stew\",\"short_names\":[\"stew\"],\"text\":null},{\"name\":\"COOKING\",\"unified\":\"1F373\",\"docomo\":\"\",\"au\":\"E4D1\",\"softbank\":\"E147\",\"google\":\"FE965\",\"image\":\"1f373.png\",\"sheet_x\":5,\"sheet_y\":3,\"short_name\":\"egg\",\"short_names\":[\"egg\"],\"text\":null},{\"name\":\"FORK AND KNIFE\",\"unified\":\"1F374\",\"docomo\":\"E66F\",\"au\":\"E4AC\",\"softbank\":\"E043\",\"google\":\"FE980\",\"image\":\"1f374.png\",\"sheet_x\":5,\"sheet_y\":4,\"short_name\":\"fork_and_knife\",\"short_names\":[\"fork_and_knife\"],\"text\":null},{\"name\":\"TEACUP WITHOUT HANDLE\",\"unified\":\"1F375\",\"docomo\":\"E71E\",\"au\":\"EAAE\",\"softbank\":\"E338\",\"google\":\"FE984\",\"image\":\"1f375.png\",\"sheet_x\":5,\"sheet_y\":5,\"short_name\":\"tea\",\"short_names\":[\"tea\"],\"text\":null},{\"name\":\"SAKE BOTTLE AND CUP\",\"unified\":\"1F376\",\"docomo\":\"E74B\",\"au\":\"EA97\",\"softbank\":\"E30B\",\"google\":\"FE985\",\"image\":\"1f376.png\",\"sheet_x\":5,\"sheet_y\":6,\"short_name\":\"sake\",\"short_names\":[\"sake\"],\"text\":null},{\"name\":\"WINE GLASS\",\"unified\":\"1F377\",\"docomo\":\"E756\",\"au\":\"E4C1\",\"softbank\":\"E044\",\"google\":\"FE986\",\"image\":\"1f377.png\",\"sheet_x\":5,\"sheet_y\":7,\"short_name\":\"wine_glass\",\"short_names\":[\"wine_glass\"],\"text\":null},{\"name\":\"COCKTAIL GLASS\",\"unified\":\"1F378\",\"docomo\":\"E671\",\"au\":\"E4C2\",\"softbank\":\"E044\",\"google\":\"FE982\",\"image\":\"1f378.png\",\"sheet_x\":5,\"sheet_y\":8,\"short_name\":\"cocktail\",\"short_names\":[\"cocktail\"],\"text\":null},{\"name\":\"TROPICAL DRINK\",\"unified\":\"1F379\",\"docomo\":\"E671\",\"au\":\"EB3E\",\"softbank\":\"E044\",\"google\":\"FE988\",\"image\":\"1f379.png\",\"sheet_x\":5,\"sheet_y\":9,\"short_name\":\"tropical_drink\",\"short_names\":[\"tropical_drink\"],\"text\":null},{\"name\":\"BEER MUG\",\"unified\":\"1F37A\",\"docomo\":\"E672\",\"au\":\"E4C3\",\"softbank\":\"E047\",\"google\":\"FE983\",\"image\":\"1f37a.png\",\"sheet_x\":5,\"sheet_y\":10,\"short_name\":\"beer\",\"short_names\":[\"beer\"],\"text\":null},{\"name\":\"CLINKING BEER MUGS\",\"unified\":\"1F37B\",\"docomo\":\"E672\",\"au\":\"EA98\",\"softbank\":\"E30C\",\"google\":\"FE987\",\"image\":\"1f37b.png\",\"sheet_x\":5,\"sheet_y\":11,\"short_name\":\"beers\",\"short_names\":[\"beers\"],\"text\":null},{\"name\":\"BABY BOTTLE\",\"unified\":\"1F37C\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f37c.png\",\"sheet_x\":5,\"sheet_y\":12,\"short_name\":\"baby_bottle\",\"short_names\":[\"baby_bottle\"],\"text\":null},{\"name\":\"RIBBON\",\"unified\":\"1F380\",\"docomo\":\"E684\",\"au\":\"E59F\",\"softbank\":\"E314\",\"google\":\"FE50F\",\"image\":\"1f380.png\",\"sheet_x\":5,\"sheet_y\":13,\"short_name\":\"ribbon\",\"short_names\":[\"ribbon\"],\"text\":null},{\"name\":\"WRAPPED PRESENT\",\"unified\":\"1F381\",\"docomo\":\"E685\",\"au\":\"E4CF\",\"softbank\":\"E112\",\"google\":\"FE510\",\"image\":\"1f381.png\",\"sheet_x\":5,\"sheet_y\":14,\"short_name\":\"gift\",\"short_names\":[\"gift\"],\"text\":null},{\"name\":\"BIRTHDAY CAKE\",\"unified\":\"1F382\",\"docomo\":\"E686\",\"au\":\"E5A0\",\"softbank\":\"E34B\",\"google\":\"FE511\",\"image\":\"1f382.png\",\"sheet_x\":5,\"sheet_y\":15,\"short_name\":\"birthday\",\"short_names\":[\"birthday\"],\"text\":null},{\"name\":\"JACK-O-LANTERN\",\"unified\":\"1F383\",\"docomo\":\"\",\"au\":\"EAEE\",\"softbank\":\"E445\",\"google\":\"FE51F\",\"image\":\"1f383.png\",\"sheet_x\":5,\"sheet_y\":16,\"short_name\":\"jack_o_lantern\",\"short_names\":[\"jack_o_lantern\"],\"text\":null},{\"name\":\"CHRISTMAS TREE\",\"unified\":\"1F384\",\"docomo\":\"E6A4\",\"au\":\"E4C9\",\"softbank\":\"E033\",\"google\":\"FE512\",\"image\":\"1f384.png\",\"sheet_x\":5,\"sheet_y\":17,\"short_name\":\"christmas_tree\",\"short_names\":[\"christmas_tree\"],\"text\":null},{\"name\":\"FATHER CHRISTMAS\",\"unified\":\"1F385\",\"docomo\":\"\",\"au\":\"EAF0\",\"softbank\":\"E448\",\"google\":\"FE513\",\"image\":\"1f385.png\",\"sheet_x\":5,\"sheet_y\":18,\"short_name\":\"santa\",\"short_names\":[\"santa\"],\"text\":null},{\"name\":\"FIREWORKS\",\"unified\":\"1F386\",\"docomo\":\"\",\"au\":\"E5CC\",\"softbank\":\"E117\",\"google\":\"FE515\",\"image\":\"1f386.png\",\"sheet_x\":5,\"sheet_y\":19,\"short_name\":\"fireworks\",\"short_names\":[\"fireworks\"],\"text\":null},{\"name\":\"FIREWORK SPARKLER\",\"unified\":\"1F387\",\"docomo\":\"\",\"au\":\"EAEB\",\"softbank\":\"E440\",\"google\":\"FE51D\",\"image\":\"1f387.png\",\"sheet_x\":5,\"sheet_y\":20,\"short_name\":\"sparkler\",\"short_names\":[\"sparkler\"],\"text\":null},{\"name\":\"BALLOON\",\"unified\":\"1F388\",\"docomo\":\"\",\"au\":\"EA9B\",\"softbank\":\"E310\",\"google\":\"FE516\",\"image\":\"1f388.png\",\"sheet_x\":5,\"sheet_y\":21,\"short_name\":\"balloon\",\"short_names\":[\"balloon\"],\"text\":null},{\"name\":\"PARTY POPPER\",\"unified\":\"1F389\",\"docomo\":\"\",\"au\":\"EA9C\",\"softbank\":\"E312\",\"google\":\"FE517\",\"image\":\"1f389.png\",\"sheet_x\":5,\"sheet_y\":22,\"short_name\":\"tada\",\"short_names\":[\"tada\"],\"text\":null},{\"name\":\"CONFETTI BALL\",\"unified\":\"1F38A\",\"docomo\":\"\",\"au\":\"E46F\",\"softbank\":\"\",\"google\":\"FE520\",\"image\":\"1f38a.png\",\"sheet_x\":5,\"sheet_y\":23,\"short_name\":\"confetti_ball\",\"short_names\":[\"confetti_ball\"],\"text\":null},{\"name\":\"TANABATA TREE\",\"unified\":\"1F38B\",\"docomo\":\"\",\"au\":\"EB3D\",\"softbank\":\"\",\"google\":\"FE521\",\"image\":\"1f38b.png\",\"sheet_x\":5,\"sheet_y\":24,\"short_name\":\"tanabata_tree\",\"short_names\":[\"tanabata_tree\"],\"text\":null},{\"name\":\"CROSSED FLAGS\",\"unified\":\"1F38C\",\"docomo\":\"\",\"au\":\"E5D9\",\"softbank\":\"E143\",\"google\":\"FE514\",\"image\":\"1f38c.png\",\"sheet_x\":5,\"sheet_y\":25,\"short_name\":\"crossed_flags\",\"short_names\":[\"crossed_flags\"],\"text\":null},{\"name\":\"PINE DECORATION\",\"unified\":\"1F38D\",\"docomo\":\"\",\"au\":\"EAE3\",\"softbank\":\"E436\",\"google\":\"FE518\",\"image\":\"1f38d.png\",\"sheet_x\":5,\"sheet_y\":26,\"short_name\":\"bamboo\",\"short_names\":[\"bamboo\"],\"text\":null},{\"name\":\"JAPANESE DOLLS\",\"unified\":\"1F38E\",\"docomo\":\"\",\"au\":\"EAE4\",\"softbank\":\"E438\",\"google\":\"FE519\",\"image\":\"1f38e.png\",\"sheet_x\":5,\"sheet_y\":27,\"short_name\":\"dolls\",\"short_names\":[\"dolls\"],\"text\":null},{\"name\":\"CARP STREAMER\",\"unified\":\"1F38F\",\"docomo\":\"\",\"au\":\"EAE7\",\"softbank\":\"E43B\",\"google\":\"FE51C\",\"image\":\"1f38f.png\",\"sheet_x\":5,\"sheet_y\":28,\"short_name\":\"flags\",\"short_names\":[\"flags\"],\"text\":null},{\"name\":\"WIND CHIME\",\"unified\":\"1F390\",\"docomo\":\"\",\"au\":\"EAED\",\"softbank\":\"E442\",\"google\":\"FE51E\",\"image\":\"1f390.png\",\"sheet_x\":5,\"sheet_y\":29,\"short_name\":\"wind_chime\",\"short_names\":[\"wind_chime\"],\"text\":null},{\"name\":\"MOON VIEWING CEREMONY\",\"unified\":\"1F391\",\"docomo\":\"\",\"au\":\"EAEF\",\"softbank\":\"E446\",\"google\":\"FE017\",\"image\":\"1f391.png\",\"sheet_x\":6,\"sheet_y\":0,\"short_name\":\"rice_scene\",\"short_names\":[\"rice_scene\"],\"text\":null},{\"name\":\"SCHOOL SATCHEL\",\"unified\":\"1F392\",\"docomo\":\"\",\"au\":\"EAE6\",\"softbank\":\"E43A\",\"google\":\"FE51B\",\"image\":\"1f392.png\",\"sheet_x\":6,\"sheet_y\":1,\"short_name\":\"school_satchel\",\"short_names\":[\"school_satchel\"],\"text\":null},{\"name\":\"GRADUATION CAP\",\"unified\":\"1F393\",\"docomo\":\"\",\"au\":\"EAE5\",\"softbank\":\"E439\",\"google\":\"FE51A\",\"image\":\"1f393.png\",\"sheet_x\":6,\"sheet_y\":2,\"short_name\":\"mortar_board\",\"short_names\":[\"mortar_board\"],\"text\":null},{\"name\":\"CAROUSEL HORSE\",\"unified\":\"1F3A0\",\"docomo\":\"E679\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE7FC\",\"image\":\"1f3a0.png\",\"sheet_x\":6,\"sheet_y\":3,\"short_name\":\"carousel_horse\",\"short_names\":[\"carousel_horse\"],\"text\":null},{\"name\":\"FERRIS WHEEL\",\"unified\":\"1F3A1\",\"docomo\":\"\",\"au\":\"E46D\",\"softbank\":\"E124\",\"google\":\"FE7FD\",\"image\":\"1f3a1.png\",\"sheet_x\":6,\"sheet_y\":4,\"short_name\":\"ferris_wheel\",\"short_names\":[\"ferris_wheel\"],\"text\":null},{\"name\":\"ROLLER COASTER\",\"unified\":\"1F3A2\",\"docomo\":\"\",\"au\":\"EAE2\",\"softbank\":\"E433\",\"google\":\"FE7FE\",\"image\":\"1f3a2.png\",\"sheet_x\":6,\"sheet_y\":5,\"short_name\":\"roller_coaster\",\"short_names\":[\"roller_coaster\"],\"text\":null},{\"name\":\"FISHING POLE AND FISH\",\"unified\":\"1F3A3\",\"docomo\":\"E751\",\"au\":\"EB42\",\"softbank\":\"E019\",\"google\":\"FE7FF\",\"image\":\"1f3a3.png\",\"sheet_x\":6,\"sheet_y\":6,\"short_name\":\"fishing_pole_and_fish\",\"short_names\":[\"fishing_pole_and_fish\"],\"text\":null},{\"name\":\"MICROPHONE\",\"unified\":\"1F3A4\",\"docomo\":\"E676\",\"au\":\"E503\",\"softbank\":\"E03C\",\"google\":\"FE800\",\"image\":\"1f3a4.png\",\"sheet_x\":6,\"sheet_y\":7,\"short_name\":\"microphone\",\"short_names\":[\"microphone\"],\"text\":null},{\"name\":\"MOVIE CAMERA\",\"unified\":\"1F3A5\",\"docomo\":\"E677\",\"au\":\"E517\",\"softbank\":\"E03D\",\"google\":\"FE801\",\"image\":\"1f3a5.png\",\"sheet_x\":6,\"sheet_y\":8,\"short_name\":\"movie_camera\",\"short_names\":[\"movie_camera\"],\"text\":null},{\"name\":\"CINEMA\",\"unified\":\"1F3A6\",\"docomo\":\"E677\",\"au\":\"E517\",\"softbank\":\"E507\",\"google\":\"FE802\",\"image\":\"1f3a6.png\",\"sheet_x\":6,\"sheet_y\":9,\"short_name\":\"cinema\",\"short_names\":[\"cinema\"],\"text\":null},{\"name\":\"HEADPHONE\",\"unified\":\"1F3A7\",\"docomo\":\"E67A\",\"au\":\"E508\",\"softbank\":\"E30A\",\"google\":\"FE803\",\"image\":\"1f3a7.png\",\"sheet_x\":6,\"sheet_y\":10,\"short_name\":\"headphones\",\"short_names\":[\"headphones\"],\"text\":null},{\"name\":\"ARTIST PALETTE\",\"unified\":\"1F3A8\",\"docomo\":\"E67B\",\"au\":\"E59C\",\"softbank\":\"E502\",\"google\":\"FE804\",\"image\":\"1f3a8.png\",\"sheet_x\":6,\"sheet_y\":11,\"short_name\":\"art\",\"short_names\":[\"art\"],\"text\":null},{\"name\":\"TOP HAT\",\"unified\":\"1F3A9\",\"docomo\":\"E67C\",\"au\":\"EAF5\",\"softbank\":\"E503\",\"google\":\"FE805\",\"image\":\"1f3a9.png\",\"sheet_x\":6,\"sheet_y\":12,\"short_name\":\"tophat\",\"short_names\":[\"tophat\"],\"text\":null},{\"name\":\"CIRCUS TENT\",\"unified\":\"1F3AA\",\"docomo\":\"E67D\",\"au\":\"E59E\",\"softbank\":\"\",\"google\":\"FE806\",\"image\":\"1f3aa.png\",\"sheet_x\":6,\"sheet_y\":13,\"short_name\":\"circus_tent\",\"short_names\":[\"circus_tent\"],\"text\":null},{\"name\":\"TICKET\",\"unified\":\"1F3AB\",\"docomo\":\"E67E\",\"au\":\"E49E\",\"softbank\":\"E125\",\"google\":\"FE807\",\"image\":\"1f3ab.png\",\"sheet_x\":6,\"sheet_y\":14,\"short_name\":\"ticket\",\"short_names\":[\"ticket\"],\"text\":null},{\"name\":\"CLAPPER BOARD\",\"unified\":\"1F3AC\",\"docomo\":\"E6AC\",\"au\":\"E4BE\",\"softbank\":\"E324\",\"google\":\"FE808\",\"image\":\"1f3ac.png\",\"sheet_x\":6,\"sheet_y\":15,\"short_name\":\"clapper\",\"short_names\":[\"clapper\"],\"text\":null},{\"name\":\"PERFORMING ARTS\",\"unified\":\"1F3AD\",\"docomo\":\"\",\"au\":\"E59D\",\"softbank\":\"E503\",\"google\":\"FE809\",\"image\":\"1f3ad.png\",\"sheet_x\":6,\"sheet_y\":16,\"short_name\":\"performing_arts\",\"short_names\":[\"performing_arts\"],\"text\":null},{\"name\":\"VIDEO GAME\",\"unified\":\"1F3AE\",\"docomo\":\"E68B\",\"au\":\"E4C6\",\"softbank\":\"\",\"google\":\"FE80A\",\"image\":\"1f3ae.png\",\"sheet_x\":6,\"sheet_y\":17,\"short_name\":\"video_game\",\"short_names\":[\"video_game\"],\"text\":null},{\"name\":\"DIRECT HIT\",\"unified\":\"1F3AF\",\"docomo\":\"\",\"au\":\"E4C5\",\"softbank\":\"E130\",\"google\":\"FE80C\",\"image\":\"1f3af.png\",\"sheet_x\":6,\"sheet_y\":18,\"short_name\":\"dart\",\"short_names\":[\"dart\"],\"text\":null},{\"name\":\"SLOT MACHINE\",\"unified\":\"1F3B0\",\"docomo\":\"\",\"au\":\"E46E\",\"softbank\":\"E133\",\"google\":\"FE80D\",\"image\":\"1f3b0.png\",\"sheet_x\":6,\"sheet_y\":19,\"short_name\":\"slot_machine\",\"short_names\":[\"slot_machine\"],\"text\":null},{\"name\":\"BILLIARDS\",\"unified\":\"1F3B1\",\"docomo\":\"\",\"au\":\"EADD\",\"softbank\":\"E42C\",\"google\":\"FE80E\",\"image\":\"1f3b1.png\",\"sheet_x\":6,\"sheet_y\":20,\"short_name\":\"8ball\",\"short_names\":[\"8ball\"],\"text\":null},{\"name\":\"GAME DIE\",\"unified\":\"1F3B2\",\"docomo\":\"\",\"au\":\"E4C8\",\"softbank\":\"\",\"google\":\"FE80F\",\"image\":\"1f3b2.png\",\"sheet_x\":6,\"sheet_y\":21,\"short_name\":\"game_die\",\"short_names\":[\"game_die\"],\"text\":null},{\"name\":\"BOWLING\",\"unified\":\"1F3B3\",\"docomo\":\"\",\"au\":\"EB43\",\"softbank\":\"\",\"google\":\"FE810\",\"image\":\"1f3b3.png\",\"sheet_x\":6,\"sheet_y\":22,\"short_name\":\"bowling\",\"short_names\":[\"bowling\"],\"text\":null},{\"name\":\"FLOWER PLAYING CARDS\",\"unified\":\"1F3B4\",\"docomo\":\"\",\"au\":\"EB6E\",\"softbank\":\"\",\"google\":\"FE811\",\"image\":\"1f3b4.png\",\"sheet_x\":6,\"sheet_y\":23,\"short_name\":\"flower_playing_cards\",\"short_names\":[\"flower_playing_cards\"],\"text\":null},{\"name\":\"MUSICAL NOTE\",\"unified\":\"1F3B5\",\"docomo\":\"E6F6\",\"au\":\"E5BE\",\"softbank\":\"E03E\",\"google\":\"FE813\",\"image\":\"1f3b5.png\",\"sheet_x\":6,\"sheet_y\":24,\"short_name\":\"musical_note\",\"short_names\":[\"musical_note\"],\"text\":null},{\"name\":\"MULTIPLE MUSICAL NOTES\",\"unified\":\"1F3B6\",\"docomo\":\"E6FF\",\"au\":\"E505\",\"softbank\":\"E326\",\"google\":\"FE814\",\"image\":\"1f3b6.png\",\"sheet_x\":6,\"sheet_y\":25,\"short_name\":\"notes\",\"short_names\":[\"notes\"],\"text\":null},{\"name\":\"SAXOPHONE\",\"unified\":\"1F3B7\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E040\",\"google\":\"FE815\",\"image\":\"1f3b7.png\",\"sheet_x\":6,\"sheet_y\":26,\"short_name\":\"saxophone\",\"short_names\":[\"saxophone\"],\"text\":null},{\"name\":\"GUITAR\",\"unified\":\"1F3B8\",\"docomo\":\"\",\"au\":\"E506\",\"softbank\":\"E041\",\"google\":\"FE816\",\"image\":\"1f3b8.png\",\"sheet_x\":6,\"sheet_y\":27,\"short_name\":\"guitar\",\"short_names\":[\"guitar\"],\"text\":null},{\"name\":\"MUSICAL KEYBOARD\",\"unified\":\"1F3B9\",\"docomo\":\"\",\"au\":\"EB40\",\"softbank\":\"\",\"google\":\"FE817\",\"image\":\"1f3b9.png\",\"sheet_x\":6,\"sheet_y\":28,\"short_name\":\"musical_keyboard\",\"short_names\":[\"musical_keyboard\"],\"text\":null},{\"name\":\"TRUMPET\",\"unified\":\"1F3BA\",\"docomo\":\"\",\"au\":\"EADC\",\"softbank\":\"E042\",\"google\":\"FE818\",\"image\":\"1f3ba.png\",\"sheet_x\":6,\"sheet_y\":29,\"short_name\":\"trumpet\",\"short_names\":[\"trumpet\"],\"text\":null},{\"name\":\"VIOLIN\",\"unified\":\"1F3BB\",\"docomo\":\"\",\"au\":\"E507\",\"softbank\":\"\",\"google\":\"FE819\",\"image\":\"1f3bb.png\",\"sheet_x\":7,\"sheet_y\":0,\"short_name\":\"violin\",\"short_names\":[\"violin\"],\"text\":null},{\"name\":\"MUSICAL SCORE\",\"unified\":\"1F3BC\",\"docomo\":\"E6FF\",\"au\":\"EACC\",\"softbank\":\"E326\",\"google\":\"FE81A\",\"image\":\"1f3bc.png\",\"sheet_x\":7,\"sheet_y\":1,\"short_name\":\"musical_score\",\"short_names\":[\"musical_score\"],\"text\":null},{\"name\":\"RUNNING SHIRT WITH SASH\",\"unified\":\"1F3BD\",\"docomo\":\"E652\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE7D0\",\"image\":\"1f3bd.png\",\"sheet_x\":7,\"sheet_y\":2,\"short_name\":\"running_shirt_with_sash\",\"short_names\":[\"running_shirt_with_sash\"],\"text\":null},{\"name\":\"TENNIS RACQUET AND BALL\",\"unified\":\"1F3BE\",\"docomo\":\"E655\",\"au\":\"E4B7\",\"softbank\":\"E015\",\"google\":\"FE7D3\",\"image\":\"1f3be.png\",\"sheet_x\":7,\"sheet_y\":3,\"short_name\":\"tennis\",\"short_names\":[\"tennis\"],\"text\":null},{\"name\":\"SKI AND SKI BOOT\",\"unified\":\"1F3BF\",\"docomo\":\"E657\",\"au\":\"EAAC\",\"softbank\":\"E013\",\"google\":\"FE7D5\",\"image\":\"1f3bf.png\",\"sheet_x\":7,\"sheet_y\":4,\"short_name\":\"ski\",\"short_names\":[\"ski\"],\"text\":null},{\"name\":\"BASKETBALL AND HOOP\",\"unified\":\"1F3C0\",\"docomo\":\"E658\",\"au\":\"E59A\",\"softbank\":\"E42A\",\"google\":\"FE7D6\",\"image\":\"1f3c0.png\",\"sheet_x\":7,\"sheet_y\":5,\"short_name\":\"basketball\",\"short_names\":[\"basketball\"],\"text\":null},{\"name\":\"CHEQUERED FLAG\",\"unified\":\"1F3C1\",\"docomo\":\"E659\",\"au\":\"E4B9\",\"softbank\":\"E132\",\"google\":\"FE7D7\",\"image\":\"1f3c1.png\",\"sheet_x\":7,\"sheet_y\":6,\"short_name\":\"checkered_flag\",\"short_names\":[\"checkered_flag\"],\"text\":null},{\"name\":\"SNOWBOARDER\",\"unified\":\"1F3C2\",\"docomo\":\"E712\",\"au\":\"E4B8\",\"softbank\":\"\",\"google\":\"FE7D8\",\"image\":\"1f3c2.png\",\"sheet_x\":7,\"sheet_y\":7,\"short_name\":\"snowboarder\",\"short_names\":[\"snowboarder\"],\"text\":null},{\"name\":\"RUNNER\",\"unified\":\"1F3C3\",\"docomo\":\"E733\",\"au\":\"E46B\",\"softbank\":\"E115\",\"google\":\"FE7D9\",\"image\":\"1f3c3.png\",\"sheet_x\":7,\"sheet_y\":8,\"short_name\":\"runner\",\"short_names\":[\"runner\",\"running\"],\"text\":null},{\"name\":\"SURFER\",\"unified\":\"1F3C4\",\"docomo\":\"E712\",\"au\":\"EB41\",\"softbank\":\"E017\",\"google\":\"FE7DA\",\"image\":\"1f3c4.png\",\"sheet_x\":7,\"sheet_y\":9,\"short_name\":\"surfer\",\"short_names\":[\"surfer\"],\"text\":null},{\"name\":\"TROPHY\",\"unified\":\"1F3C6\",\"docomo\":\"\",\"au\":\"E5D3\",\"softbank\":\"E131\",\"google\":\"FE7DB\",\"image\":\"1f3c6.png\",\"sheet_x\":7,\"sheet_y\":10,\"short_name\":\"trophy\",\"short_names\":[\"trophy\"],\"text\":null},{\"name\":\"HORSE RACING\",\"unified\":\"1F3C7\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f3c7.png\",\"sheet_x\":7,\"sheet_y\":11,\"short_name\":\"horse_racing\",\"short_names\":[\"horse_racing\"],\"text\":null},{\"name\":\"AMERICAN FOOTBALL\",\"unified\":\"1F3C8\",\"docomo\":\"\",\"au\":\"E4BB\",\"softbank\":\"E42B\",\"google\":\"FE7DD\",\"image\":\"1f3c8.png\",\"sheet_x\":7,\"sheet_y\":12,\"short_name\":\"football\",\"short_names\":[\"football\"],\"text\":null},{\"name\":\"RUGBY FOOTBALL\",\"unified\":\"1F3C9\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f3c9.png\",\"sheet_x\":7,\"sheet_y\":13,\"short_name\":\"rugby_football\",\"short_names\":[\"rugby_football\"],\"text\":null},{\"name\":\"SWIMMER\",\"unified\":\"1F3CA\",\"docomo\":\"\",\"au\":\"EADE\",\"softbank\":\"E42D\",\"google\":\"FE7DE\",\"image\":\"1f3ca.png\",\"sheet_x\":7,\"sheet_y\":14,\"short_name\":\"swimmer\",\"short_names\":[\"swimmer\"],\"text\":null},{\"name\":\"HOUSE BUILDING\",\"unified\":\"1F3E0\",\"docomo\":\"E663\",\"au\":\"E4AB\",\"softbank\":\"E036\",\"google\":\"FE4B0\",\"image\":\"1f3e0.png\",\"sheet_x\":7,\"sheet_y\":15,\"short_name\":\"house\",\"short_names\":[\"house\"],\"text\":null},{\"name\":\"HOUSE WITH GARDEN\",\"unified\":\"1F3E1\",\"docomo\":\"E663\",\"au\":\"EB09\",\"softbank\":\"E036\",\"google\":\"FE4B1\",\"image\":\"1f3e1.png\",\"sheet_x\":7,\"sheet_y\":16,\"short_name\":\"house_with_garden\",\"short_names\":[\"house_with_garden\"],\"text\":null},{\"name\":\"OFFICE BUILDING\",\"unified\":\"1F3E2\",\"docomo\":\"E664\",\"au\":\"E4AD\",\"softbank\":\"E038\",\"google\":\"FE4B2\",\"image\":\"1f3e2.png\",\"sheet_x\":7,\"sheet_y\":17,\"short_name\":\"office\",\"short_names\":[\"office\"],\"text\":null},{\"name\":\"JAPANESE POST OFFICE\",\"unified\":\"1F3E3\",\"docomo\":\"E665\",\"au\":\"E5DE\",\"softbank\":\"E153\",\"google\":\"FE4B3\",\"image\":\"1f3e3.png\",\"sheet_x\":7,\"sheet_y\":18,\"short_name\":\"post_office\",\"short_names\":[\"post_office\"],\"text\":null},{\"name\":\"EUROPEAN POST OFFICE\",\"unified\":\"1F3E4\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f3e4.png\",\"sheet_x\":7,\"sheet_y\":19,\"short_name\":\"european_post_office\",\"short_names\":[\"european_post_office\"],\"text\":null},{\"name\":\"HOSPITAL\",\"unified\":\"1F3E5\",\"docomo\":\"E666\",\"au\":\"E5DF\",\"softbank\":\"E155\",\"google\":\"FE4B4\",\"image\":\"1f3e5.png\",\"sheet_x\":7,\"sheet_y\":20,\"short_name\":\"hospital\",\"short_names\":[\"hospital\"],\"text\":null},{\"name\":\"BANK\",\"unified\":\"1F3E6\",\"docomo\":\"E667\",\"au\":\"E4AA\",\"softbank\":\"E14D\",\"google\":\"FE4B5\",\"image\":\"1f3e6.png\",\"sheet_x\":7,\"sheet_y\":21,\"short_name\":\"bank\",\"short_names\":[\"bank\"],\"text\":null},{\"name\":\"AUTOMATED TELLER MACHINE\",\"unified\":\"1F3E7\",\"docomo\":\"E668\",\"au\":\"E4A3\",\"softbank\":\"E154\",\"google\":\"FE4B6\",\"image\":\"1f3e7.png\",\"sheet_x\":7,\"sheet_y\":22,\"short_name\":\"atm\",\"short_names\":[\"atm\"],\"text\":null},{\"name\":\"HOTEL\",\"unified\":\"1F3E8\",\"docomo\":\"E669\",\"au\":\"EA81\",\"softbank\":\"E158\",\"google\":\"FE4B7\",\"image\":\"1f3e8.png\",\"sheet_x\":7,\"sheet_y\":23,\"short_name\":\"hotel\",\"short_names\":[\"hotel\"],\"text\":null},{\"name\":\"LOVE HOTEL\",\"unified\":\"1F3E9\",\"docomo\":\"E669-E6EF\",\"au\":\"EAF3\",\"softbank\":\"E501\",\"google\":\"FE4B8\",\"image\":\"1f3e9.png\",\"sheet_x\":7,\"sheet_y\":24,\"short_name\":\"love_hotel\",\"short_names\":[\"love_hotel\"],\"text\":null},{\"name\":\"CONVENIENCE STORE\",\"unified\":\"1F3EA\",\"docomo\":\"E66A\",\"au\":\"E4A4\",\"softbank\":\"E156\",\"google\":\"FE4B9\",\"image\":\"1f3ea.png\",\"sheet_x\":7,\"sheet_y\":25,\"short_name\":\"convenience_store\",\"short_names\":[\"convenience_store\"],\"text\":null},{\"name\":\"SCHOOL\",\"unified\":\"1F3EB\",\"docomo\":\"E73E\",\"au\":\"EA80\",\"softbank\":\"E157\",\"google\":\"FE4BA\",\"image\":\"1f3eb.png\",\"sheet_x\":7,\"sheet_y\":26,\"short_name\":\"school\",\"short_names\":[\"school\"],\"text\":null},{\"name\":\"DEPARTMENT STORE\",\"unified\":\"1F3EC\",\"docomo\":\"\",\"au\":\"EAF6\",\"softbank\":\"E504\",\"google\":\"FE4BD\",\"image\":\"1f3ec.png\",\"sheet_x\":7,\"sheet_y\":27,\"short_name\":\"department_store\",\"short_names\":[\"department_store\"],\"text\":null},{\"name\":\"FACTORY\",\"unified\":\"1F3ED\",\"docomo\":\"\",\"au\":\"EAF9\",\"softbank\":\"E508\",\"google\":\"FE4C0\",\"image\":\"1f3ed.png\",\"sheet_x\":7,\"sheet_y\":28,\"short_name\":\"factory\",\"short_names\":[\"factory\"],\"text\":null},{\"name\":\"IZAKAYA LANTERN\",\"unified\":\"1F3EE\",\"docomo\":\"E74B\",\"au\":\"E4BD\",\"softbank\":\"E30B\",\"google\":\"FE4C2\",\"image\":\"1f3ee.png\",\"sheet_x\":7,\"sheet_y\":29,\"short_name\":\"izakaya_lantern\",\"short_names\":[\"izakaya_lantern\",\"lantern\"],\"text\":null},{\"name\":\"JAPANESE CASTLE\",\"unified\":\"1F3EF\",\"docomo\":\"\",\"au\":\"EAF7\",\"softbank\":\"E505\",\"google\":\"FE4BE\",\"image\":\"1f3ef.png\",\"sheet_x\":8,\"sheet_y\":0,\"short_name\":\"japanese_castle\",\"short_names\":[\"japanese_castle\"],\"text\":null},{\"name\":\"EUROPEAN CASTLE\",\"unified\":\"1F3F0\",\"docomo\":\"\",\"au\":\"EAF8\",\"softbank\":\"E506\",\"google\":\"FE4BF\",\"image\":\"1f3f0.png\",\"sheet_x\":8,\"sheet_y\":1,\"short_name\":\"european_castle\",\"short_names\":[\"european_castle\"],\"text\":null},{\"name\":\"RAT\",\"unified\":\"1F400\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f400.png\",\"sheet_x\":8,\"sheet_y\":2,\"short_name\":\"rat\",\"short_names\":[\"rat\"],\"text\":null},{\"name\":\"MOUSE\",\"unified\":\"1F401\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f401.png\",\"sheet_x\":8,\"sheet_y\":3,\"short_name\":\"mouse2\",\"short_names\":[\"mouse2\"],\"text\":null},{\"name\":\"OX\",\"unified\":\"1F402\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f402.png\",\"sheet_x\":8,\"sheet_y\":4,\"short_name\":\"ox\",\"short_names\":[\"ox\"],\"text\":null},{\"name\":\"WATER BUFFALO\",\"unified\":\"1F403\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f403.png\",\"sheet_x\":8,\"sheet_y\":5,\"short_name\":\"water_buffalo\",\"short_names\":[\"water_buffalo\"],\"text\":null},{\"name\":\"COW\",\"unified\":\"1F404\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f404.png\",\"sheet_x\":8,\"sheet_y\":6,\"short_name\":\"cow2\",\"short_names\":[\"cow2\"],\"text\":null},{\"name\":\"TIGER\",\"unified\":\"1F405\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f405.png\",\"sheet_x\":8,\"sheet_y\":7,\"short_name\":\"tiger2\",\"short_names\":[\"tiger2\"],\"text\":null},{\"name\":\"LEOPARD\",\"unified\":\"1F406\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f406.png\",\"sheet_x\":8,\"sheet_y\":8,\"short_name\":\"leopard\",\"short_names\":[\"leopard\"],\"text\":null},{\"name\":\"RABBIT\",\"unified\":\"1F407\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f407.png\",\"sheet_x\":8,\"sheet_y\":9,\"short_name\":\"rabbit2\",\"short_names\":[\"rabbit2\"],\"text\":null},{\"name\":\"CAT\",\"unified\":\"1F408\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f408.png\",\"sheet_x\":8,\"sheet_y\":10,\"short_name\":\"cat2\",\"short_names\":[\"cat2\"],\"text\":null},{\"name\":\"DRAGON\",\"unified\":\"1F409\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f409.png\",\"sheet_x\":8,\"sheet_y\":11,\"short_name\":\"dragon\",\"short_names\":[\"dragon\"],\"text\":null},{\"name\":\"CROCODILE\",\"unified\":\"1F40A\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f40a.png\",\"sheet_x\":8,\"sheet_y\":12,\"short_name\":\"crocodile\",\"short_names\":[\"crocodile\"],\"text\":null},{\"name\":\"WHALE\",\"unified\":\"1F40B\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f40b.png\",\"sheet_x\":8,\"sheet_y\":13,\"short_name\":\"whale2\",\"short_names\":[\"whale2\"],\"text\":null},{\"name\":\"SNAIL\",\"unified\":\"1F40C\",\"docomo\":\"E74E\",\"au\":\"EB7E\",\"softbank\":\"\",\"google\":\"FE1B9\",\"image\":\"1f40c.png\",\"sheet_x\":8,\"sheet_y\":14,\"short_name\":\"snail\",\"short_names\":[\"snail\"],\"text\":null},{\"name\":\"SNAKE\",\"unified\":\"1F40D\",\"docomo\":\"\",\"au\":\"EB22\",\"softbank\":\"E52D\",\"google\":\"FE1D3\",\"image\":\"1f40d.png\",\"sheet_x\":8,\"sheet_y\":15,\"short_name\":\"snake\",\"short_names\":[\"snake\"],\"text\":null},{\"name\":\"HORSE\",\"unified\":\"1F40E\",\"docomo\":\"E754\",\"au\":\"E4D8\",\"softbank\":\"E134\",\"google\":\"FE7DC\",\"image\":\"1f40e.png\",\"sheet_x\":8,\"sheet_y\":16,\"short_name\":\"racehorse\",\"short_names\":[\"racehorse\"],\"text\":null},{\"name\":\"RAM\",\"unified\":\"1F40F\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f40f.png\",\"sheet_x\":8,\"sheet_y\":17,\"short_name\":\"ram\",\"short_names\":[\"ram\"],\"text\":null},{\"name\":\"GOAT\",\"unified\":\"1F410\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f410.png\",\"sheet_x\":8,\"sheet_y\":18,\"short_name\":\"goat\",\"short_names\":[\"goat\"],\"text\":null},{\"name\":\"SHEEP\",\"unified\":\"1F411\",\"docomo\":\"\",\"au\":\"E48F\",\"softbank\":\"E529\",\"google\":\"FE1CF\",\"image\":\"1f411.png\",\"sheet_x\":8,\"sheet_y\":19,\"short_name\":\"sheep\",\"short_names\":[\"sheep\"],\"text\":null},{\"name\":\"MONKEY\",\"unified\":\"1F412\",\"docomo\":\"\",\"au\":\"E4D9\",\"softbank\":\"E528\",\"google\":\"FE1CE\",\"image\":\"1f412.png\",\"sheet_x\":8,\"sheet_y\":20,\"short_name\":\"monkey\",\"short_names\":[\"monkey\"],\"text\":null},{\"name\":\"ROOSTER\",\"unified\":\"1F413\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f413.png\",\"sheet_x\":8,\"sheet_y\":21,\"short_name\":\"rooster\",\"short_names\":[\"rooster\"],\"text\":null},{\"name\":\"CHICKEN\",\"unified\":\"1F414\",\"docomo\":\"\",\"au\":\"EB23\",\"softbank\":\"E52E\",\"google\":\"FE1D4\",\"image\":\"1f414.png\",\"sheet_x\":8,\"sheet_y\":22,\"short_name\":\"chicken\",\"short_names\":[\"chicken\"],\"text\":null},{\"name\":\"DOG\",\"unified\":\"1F415\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f415.png\",\"sheet_x\":8,\"sheet_y\":23,\"short_name\":\"dog2\",\"short_names\":[\"dog2\"],\"text\":null},{\"name\":\"PIG\",\"unified\":\"1F416\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f416.png\",\"sheet_x\":8,\"sheet_y\":24,\"short_name\":\"pig2\",\"short_names\":[\"pig2\"],\"text\":null},{\"name\":\"BOAR\",\"unified\":\"1F417\",\"docomo\":\"\",\"au\":\"EB24\",\"softbank\":\"E52F\",\"google\":\"FE1D5\",\"image\":\"1f417.png\",\"sheet_x\":8,\"sheet_y\":25,\"short_name\":\"boar\",\"short_names\":[\"boar\"],\"text\":null},{\"name\":\"ELEPHANT\",\"unified\":\"1F418\",\"docomo\":\"\",\"au\":\"EB1F\",\"softbank\":\"E526\",\"google\":\"FE1CC\",\"image\":\"1f418.png\",\"sheet_x\":8,\"sheet_y\":26,\"short_name\":\"elephant\",\"short_names\":[\"elephant\"],\"text\":null},{\"name\":\"OCTOPUS\",\"unified\":\"1F419\",\"docomo\":\"\",\"au\":\"E5C7\",\"softbank\":\"E10A\",\"google\":\"FE1C5\",\"image\":\"1f419.png\",\"sheet_x\":8,\"sheet_y\":27,\"short_name\":\"octopus\",\"short_names\":[\"octopus\"],\"text\":null},{\"name\":\"SPIRAL SHELL\",\"unified\":\"1F41A\",\"docomo\":\"\",\"au\":\"EAEC\",\"softbank\":\"E441\",\"google\":\"FE1C6\",\"image\":\"1f41a.png\",\"sheet_x\":8,\"sheet_y\":28,\"short_name\":\"shell\",\"short_names\":[\"shell\"],\"text\":null},{\"name\":\"BUG\",\"unified\":\"1F41B\",\"docomo\":\"\",\"au\":\"EB1E\",\"softbank\":\"E525\",\"google\":\"FE1CB\",\"image\":\"1f41b.png\",\"sheet_x\":8,\"sheet_y\":29,\"short_name\":\"bug\",\"short_names\":[\"bug\"],\"text\":null},{\"name\":\"ANT\",\"unified\":\"1F41C\",\"docomo\":\"\",\"au\":\"E4DD\",\"softbank\":\"\",\"google\":\"FE1DA\",\"image\":\"1f41c.png\",\"sheet_x\":9,\"sheet_y\":0,\"short_name\":\"ant\",\"short_names\":[\"ant\"],\"text\":null},{\"name\":\"HONEYBEE\",\"unified\":\"1F41D\",\"docomo\":\"\",\"au\":\"EB57\",\"softbank\":\"\",\"google\":\"FE1E1\",\"image\":\"1f41d.png\",\"sheet_x\":9,\"sheet_y\":1,\"short_name\":\"bee\",\"short_names\":[\"bee\",\"honeybee\"],\"text\":null},{\"name\":\"LADY BEETLE\",\"unified\":\"1F41E\",\"docomo\":\"\",\"au\":\"EB58\",\"softbank\":\"\",\"google\":\"FE1E2\",\"image\":\"1f41e.png\",\"sheet_x\":9,\"sheet_y\":2,\"short_name\":\"beetle\",\"short_names\":[\"beetle\"],\"text\":null},{\"name\":\"FISH\",\"unified\":\"1F41F\",\"docomo\":\"E751\",\"au\":\"E49A\",\"softbank\":\"E019\",\"google\":\"FE1BD\",\"image\":\"1f41f.png\",\"sheet_x\":9,\"sheet_y\":3,\"short_name\":\"fish\",\"short_names\":[\"fish\"],\"text\":null},{\"name\":\"TROPICAL FISH\",\"unified\":\"1F420\",\"docomo\":\"E751\",\"au\":\"EB1D\",\"softbank\":\"E522\",\"google\":\"FE1C9\",\"image\":\"1f420.png\",\"sheet_x\":9,\"sheet_y\":4,\"short_name\":\"tropical_fish\",\"short_names\":[\"tropical_fish\"],\"text\":null},{\"name\":\"BLOWFISH\",\"unified\":\"1F421\",\"docomo\":\"E751\",\"au\":\"E4D3\",\"softbank\":\"E019\",\"google\":\"FE1D9\",\"image\":\"1f421.png\",\"sheet_x\":9,\"sheet_y\":5,\"short_name\":\"blowfish\",\"short_names\":[\"blowfish\"],\"text\":null},{\"name\":\"TURTLE\",\"unified\":\"1F422\",\"docomo\":\"\",\"au\":\"E5D4\",\"softbank\":\"\",\"google\":\"FE1DC\",\"image\":\"1f422.png\",\"sheet_x\":9,\"sheet_y\":6,\"short_name\":\"turtle\",\"short_names\":[\"turtle\"],\"text\":null},{\"name\":\"HATCHING CHICK\",\"unified\":\"1F423\",\"docomo\":\"E74F\",\"au\":\"E5DB\",\"softbank\":\"E523\",\"google\":\"FE1DD\",\"image\":\"1f423.png\",\"sheet_x\":9,\"sheet_y\":7,\"short_name\":\"hatching_chick\",\"short_names\":[\"hatching_chick\"],\"text\":null},{\"name\":\"BABY CHICK\",\"unified\":\"1F424\",\"docomo\":\"E74F\",\"au\":\"E4E0\",\"softbank\":\"E523\",\"google\":\"FE1BA\",\"image\":\"1f424.png\",\"sheet_x\":9,\"sheet_y\":8,\"short_name\":\"baby_chick\",\"short_names\":[\"baby_chick\"],\"text\":null},{\"name\":\"FRONT-FACING BABY CHICK\",\"unified\":\"1F425\",\"docomo\":\"E74F\",\"au\":\"EB76\",\"softbank\":\"E523\",\"google\":\"FE1BB\",\"image\":\"1f425.png\",\"sheet_x\":9,\"sheet_y\":9,\"short_name\":\"hatched_chick\",\"short_names\":[\"hatched_chick\"],\"text\":null},{\"name\":\"BIRD\",\"unified\":\"1F426\",\"docomo\":\"E74F\",\"au\":\"E4E0\",\"softbank\":\"E521\",\"google\":\"FE1C8\",\"image\":\"1f426.png\",\"sheet_x\":9,\"sheet_y\":10,\"short_name\":\"bird\",\"short_names\":[\"bird\"],\"text\":null},{\"name\":\"PENGUIN\",\"unified\":\"1F427\",\"docomo\":\"E750\",\"au\":\"E4DC\",\"softbank\":\"E055\",\"google\":\"FE1BC\",\"image\":\"1f427.png\",\"sheet_x\":9,\"sheet_y\":11,\"short_name\":\"penguin\",\"short_names\":[\"penguin\"],\"text\":null},{\"name\":\"KOALA\",\"unified\":\"1F428\",\"docomo\":\"\",\"au\":\"EB20\",\"softbank\":\"E527\",\"google\":\"FE1CD\",\"image\":\"1f428.png\",\"sheet_x\":9,\"sheet_y\":12,\"short_name\":\"koala\",\"short_names\":[\"koala\"],\"text\":null},{\"name\":\"POODLE\",\"unified\":\"1F429\",\"docomo\":\"E6A1\",\"au\":\"E4DF\",\"softbank\":\"E052\",\"google\":\"FE1D8\",\"image\":\"1f429.png\",\"sheet_x\":9,\"sheet_y\":13,\"short_name\":\"poodle\",\"short_names\":[\"poodle\"],\"text\":null},{\"name\":\"DROMEDARY CAMEL\",\"unified\":\"1F42A\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f42a.png\",\"sheet_x\":9,\"sheet_y\":14,\"short_name\":\"dromedary_camel\",\"short_names\":[\"dromedary_camel\"],\"text\":null},{\"name\":\"BACTRIAN CAMEL\",\"unified\":\"1F42B\",\"docomo\":\"\",\"au\":\"EB25\",\"softbank\":\"E530\",\"google\":\"FE1D6\",\"image\":\"1f42b.png\",\"sheet_x\":9,\"sheet_y\":15,\"short_name\":\"camel\",\"short_names\":[\"camel\"],\"text\":null},{\"name\":\"DOLPHIN\",\"unified\":\"1F42C\",\"docomo\":\"\",\"au\":\"EB1B\",\"softbank\":\"E520\",\"google\":\"FE1C7\",\"image\":\"1f42c.png\",\"sheet_x\":9,\"sheet_y\":16,\"short_name\":\"dolphin\",\"short_names\":[\"dolphin\",\"flipper\"],\"text\":null},{\"name\":\"MOUSE FACE\",\"unified\":\"1F42D\",\"docomo\":\"\",\"au\":\"E5C2\",\"softbank\":\"E053\",\"google\":\"FE1C2\",\"image\":\"1f42d.png\",\"sheet_x\":9,\"sheet_y\":17,\"short_name\":\"mouse\",\"short_names\":[\"mouse\"],\"text\":null},{\"name\":\"COW FACE\",\"unified\":\"1F42E\",\"docomo\":\"\",\"au\":\"EB21\",\"softbank\":\"E52B\",\"google\":\"FE1D1\",\"image\":\"1f42e.png\",\"sheet_x\":9,\"sheet_y\":18,\"short_name\":\"cow\",\"short_names\":[\"cow\"],\"text\":null},{\"name\":\"TIGER FACE\",\"unified\":\"1F42F\",\"docomo\":\"\",\"au\":\"E5C0\",\"softbank\":\"E050\",\"google\":\"FE1C0\",\"image\":\"1f42f.png\",\"sheet_x\":9,\"sheet_y\":19,\"short_name\":\"tiger\",\"short_names\":[\"tiger\"],\"text\":null},{\"name\":\"RABBIT FACE\",\"unified\":\"1F430\",\"docomo\":\"\",\"au\":\"E4D7\",\"softbank\":\"E52C\",\"google\":\"FE1D2\",\"image\":\"1f430.png\",\"sheet_x\":9,\"sheet_y\":20,\"short_name\":\"rabbit\",\"short_names\":[\"rabbit\"],\"text\":null},{\"name\":\"CAT FACE\",\"unified\":\"1F431\",\"docomo\":\"E6A2\",\"au\":\"E4DB\",\"softbank\":\"E04F\",\"google\":\"FE1B8\",\"image\":\"1f431.png\",\"sheet_x\":9,\"sheet_y\":21,\"short_name\":\"cat\",\"short_names\":[\"cat\"],\"text\":null},{\"name\":\"DRAGON FACE\",\"unified\":\"1F432\",\"docomo\":\"\",\"au\":\"EB3F\",\"softbank\":\"\",\"google\":\"FE1DE\",\"image\":\"1f432.png\",\"sheet_x\":9,\"sheet_y\":22,\"short_name\":\"dragon_face\",\"short_names\":[\"dragon_face\"],\"text\":null},{\"name\":\"SPOUTING WHALE\",\"unified\":\"1F433\",\"docomo\":\"\",\"au\":\"E470\",\"softbank\":\"E054\",\"google\":\"FE1C3\",\"image\":\"1f433.png\",\"sheet_x\":9,\"sheet_y\":23,\"short_name\":\"whale\",\"short_names\":[\"whale\"],\"text\":null},{\"name\":\"HORSE FACE\",\"unified\":\"1F434\",\"docomo\":\"E754\",\"au\":\"E4D8\",\"softbank\":\"E01A\",\"google\":\"FE1BE\",\"image\":\"1f434.png\",\"sheet_x\":9,\"sheet_y\":24,\"short_name\":\"horse\",\"short_names\":[\"horse\"],\"text\":null},{\"name\":\"MONKEY FACE\",\"unified\":\"1F435\",\"docomo\":\"\",\"au\":\"E4D9\",\"softbank\":\"E109\",\"google\":\"FE1C4\",\"image\":\"1f435.png\",\"sheet_x\":9,\"sheet_y\":25,\"short_name\":\"monkey_face\",\"short_names\":[\"monkey_face\"],\"text\":null},{\"name\":\"DOG FACE\",\"unified\":\"1F436\",\"docomo\":\"E6A1\",\"au\":\"E4E1\",\"softbank\":\"E052\",\"google\":\"FE1B7\",\"image\":\"1f436.png\",\"sheet_x\":9,\"sheet_y\":26,\"short_name\":\"dog\",\"short_names\":[\"dog\"],\"text\":null},{\"name\":\"PIG FACE\",\"unified\":\"1F437\",\"docomo\":\"E755\",\"au\":\"E4DE\",\"softbank\":\"E10B\",\"google\":\"FE1BF\",\"image\":\"1f437.png\",\"sheet_x\":9,\"sheet_y\":27,\"short_name\":\"pig\",\"short_names\":[\"pig\"],\"text\":null},{\"name\":\"FROG FACE\",\"unified\":\"1F438\",\"docomo\":\"\",\"au\":\"E4DA\",\"softbank\":\"E531\",\"google\":\"FE1D7\",\"image\":\"1f438.png\",\"sheet_x\":9,\"sheet_y\":28,\"short_name\":\"frog\",\"short_names\":[\"frog\"],\"text\":null},{\"name\":\"HAMSTER FACE\",\"unified\":\"1F439\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E524\",\"google\":\"FE1CA\",\"image\":\"1f439.png\",\"sheet_x\":9,\"sheet_y\":29,\"short_name\":\"hamster\",\"short_names\":[\"hamster\"],\"text\":null},{\"name\":\"WOLF FACE\",\"unified\":\"1F43A\",\"docomo\":\"E6A1\",\"au\":\"E4E1\",\"softbank\":\"E52A\",\"google\":\"FE1D0\",\"image\":\"1f43a.png\",\"sheet_x\":10,\"sheet_y\":0,\"short_name\":\"wolf\",\"short_names\":[\"wolf\"],\"text\":null},{\"name\":\"BEAR FACE\",\"unified\":\"1F43B\",\"docomo\":\"\",\"au\":\"E5C1\",\"softbank\":\"E051\",\"google\":\"FE1C1\",\"image\":\"1f43b.png\",\"sheet_x\":10,\"sheet_y\":1,\"short_name\":\"bear\",\"short_names\":[\"bear\"],\"text\":null},{\"name\":\"PANDA FACE\",\"unified\":\"1F43C\",\"docomo\":\"\",\"au\":\"EB46\",\"softbank\":\"\",\"google\":\"FE1DF\",\"image\":\"1f43c.png\",\"sheet_x\":10,\"sheet_y\":2,\"short_name\":\"panda_face\",\"short_names\":[\"panda_face\"],\"text\":null},{\"name\":\"PIG NOSE\",\"unified\":\"1F43D\",\"docomo\":\"E755\",\"au\":\"EB48\",\"softbank\":\"E10B\",\"google\":\"FE1E0\",\"image\":\"1f43d.png\",\"sheet_x\":10,\"sheet_y\":3,\"short_name\":\"pig_nose\",\"short_names\":[\"pig_nose\"],\"text\":null},{\"name\":\"PAW PRINTS\",\"unified\":\"1F43E\",\"docomo\":\"E698\",\"au\":\"E4EE\",\"softbank\":\"E536\",\"google\":\"FE1DB\",\"image\":\"1f43e.png\",\"sheet_x\":10,\"sheet_y\":4,\"short_name\":\"feet\",\"short_names\":[\"feet\",\"paw_prints\"],\"text\":null},{\"name\":\"EYES\",\"unified\":\"1F440\",\"docomo\":\"E691\",\"au\":\"E5A4\",\"softbank\":\"E419\",\"google\":\"FE190\",\"image\":\"1f440.png\",\"sheet_x\":10,\"sheet_y\":5,\"short_name\":\"eyes\",\"short_names\":[\"eyes\"],\"text\":null},{\"name\":\"EAR\",\"unified\":\"1F442\",\"docomo\":\"E692\",\"au\":\"E5A5\",\"softbank\":\"E41B\",\"google\":\"FE191\",\"image\":\"1f442.png\",\"sheet_x\":10,\"sheet_y\":6,\"short_name\":\"ear\",\"short_names\":[\"ear\"],\"text\":null},{\"name\":\"NOSE\",\"unified\":\"1F443\",\"docomo\":\"\",\"au\":\"EAD0\",\"softbank\":\"E41A\",\"google\":\"FE192\",\"image\":\"1f443.png\",\"sheet_x\":10,\"sheet_y\":7,\"short_name\":\"nose\",\"short_names\":[\"nose\"],\"text\":null},{\"name\":\"MOUTH\",\"unified\":\"1F444\",\"docomo\":\"E6F9\",\"au\":\"EAD1\",\"softbank\":\"E41C\",\"google\":\"FE193\",\"image\":\"1f444.png\",\"sheet_x\":10,\"sheet_y\":8,\"short_name\":\"lips\",\"short_names\":[\"lips\"],\"text\":null},{\"name\":\"TONGUE\",\"unified\":\"1F445\",\"docomo\":\"E728\",\"au\":\"EB47\",\"softbank\":\"E409\",\"google\":\"FE194\",\"image\":\"1f445.png\",\"sheet_x\":10,\"sheet_y\":9,\"short_name\":\"tongue\",\"short_names\":[\"tongue\"],\"text\":null},{\"name\":\"WHITE UP POINTING BACKHAND INDEX\",\"unified\":\"1F446\",\"docomo\":\"\",\"au\":\"EA8D\",\"softbank\":\"E22E\",\"google\":\"FEB99\",\"image\":\"1f446.png\",\"sheet_x\":10,\"sheet_y\":10,\"short_name\":\"point_up_2\",\"short_names\":[\"point_up_2\"],\"text\":null},{\"name\":\"WHITE DOWN POINTING BACKHAND INDEX\",\"unified\":\"1F447\",\"docomo\":\"\",\"au\":\"EA8E\",\"softbank\":\"E22F\",\"google\":\"FEB9A\",\"image\":\"1f447.png\",\"sheet_x\":10,\"sheet_y\":11,\"short_name\":\"point_down\",\"short_names\":[\"point_down\"],\"text\":null},{\"name\":\"WHITE LEFT POINTING BACKHAND INDEX\",\"unified\":\"1F448\",\"docomo\":\"\",\"au\":\"E4FF\",\"softbank\":\"E230\",\"google\":\"FEB9B\",\"image\":\"1f448.png\",\"sheet_x\":10,\"sheet_y\":12,\"short_name\":\"point_left\",\"short_names\":[\"point_left\"],\"text\":null},{\"name\":\"WHITE RIGHT POINTING BACKHAND INDEX\",\"unified\":\"1F449\",\"docomo\":\"\",\"au\":\"E500\",\"softbank\":\"E231\",\"google\":\"FEB9C\",\"image\":\"1f449.png\",\"sheet_x\":10,\"sheet_y\":13,\"short_name\":\"point_right\",\"short_names\":[\"point_right\"],\"text\":null},{\"name\":\"FISTED HAND SIGN\",\"unified\":\"1F44A\",\"docomo\":\"E6FD\",\"au\":\"E4F3\",\"softbank\":\"E00D\",\"google\":\"FEB96\",\"image\":\"1f44a.png\",\"sheet_x\":10,\"sheet_y\":14,\"short_name\":\"facepunch\",\"short_names\":[\"facepunch\",\"punch\"],\"text\":null},{\"name\":\"WAVING HAND SIGN\",\"unified\":\"1F44B\",\"docomo\":\"E695\",\"au\":\"EAD6\",\"softbank\":\"E41E\",\"google\":\"FEB9D\",\"image\":\"1f44b.png\",\"sheet_x\":10,\"sheet_y\":15,\"short_name\":\"wave\",\"short_names\":[\"wave\"],\"text\":null},{\"name\":\"OK HAND SIGN\",\"unified\":\"1F44C\",\"docomo\":\"E70B\",\"au\":\"EAD4\",\"softbank\":\"E420\",\"google\":\"FEB9F\",\"image\":\"1f44c.png\",\"sheet_x\":10,\"sheet_y\":16,\"short_name\":\"ok_hand\",\"short_names\":[\"ok_hand\"],\"text\":null},{\"name\":\"THUMBS UP SIGN\",\"unified\":\"1F44D\",\"docomo\":\"E727\",\"au\":\"E4F9\",\"softbank\":\"E00E\",\"google\":\"FEB97\",\"image\":\"1f44d.png\",\"sheet_x\":10,\"sheet_y\":17,\"short_name\":\"+1\",\"short_names\":[\"+1\",\"thumbsup\"],\"text\":null},{\"name\":\"THUMBS DOWN SIGN\",\"unified\":\"1F44E\",\"docomo\":\"E700\",\"au\":\"EAD5\",\"softbank\":\"E421\",\"google\":\"FEBA0\",\"image\":\"1f44e.png\",\"sheet_x\":10,\"sheet_y\":18,\"short_name\":\"-1\",\"short_names\":[\"-1\",\"thumbsdown\"],\"text\":null},{\"name\":\"CLAPPING HANDS SIGN\",\"unified\":\"1F44F\",\"docomo\":\"\",\"au\":\"EAD3\",\"softbank\":\"E41F\",\"google\":\"FEB9E\",\"image\":\"1f44f.png\",\"sheet_x\":10,\"sheet_y\":19,\"short_name\":\"clap\",\"short_names\":[\"clap\"],\"text\":null},{\"name\":\"OPEN HANDS SIGN\",\"unified\":\"1F450\",\"docomo\":\"E695\",\"au\":\"EAD6\",\"softbank\":\"E422\",\"google\":\"FEBA1\",\"image\":\"1f450.png\",\"sheet_x\":10,\"sheet_y\":20,\"short_name\":\"open_hands\",\"short_names\":[\"open_hands\"],\"text\":null},{\"name\":\"CROWN\",\"unified\":\"1F451\",\"docomo\":\"E71A\",\"au\":\"E5C9\",\"softbank\":\"E10E\",\"google\":\"FE4D1\",\"image\":\"1f451.png\",\"sheet_x\":10,\"sheet_y\":21,\"short_name\":\"crown\",\"short_names\":[\"crown\"],\"text\":null},{\"name\":\"WOMANS HAT\",\"unified\":\"1F452\",\"docomo\":\"\",\"au\":\"EA9E\",\"softbank\":\"E318\",\"google\":\"FE4D4\",\"image\":\"1f452.png\",\"sheet_x\":10,\"sheet_y\":22,\"short_name\":\"womans_hat\",\"short_names\":[\"womans_hat\"],\"text\":null},{\"name\":\"EYEGLASSES\",\"unified\":\"1F453\",\"docomo\":\"E69A\",\"au\":\"E4FE\",\"softbank\":\"\",\"google\":\"FE4CE\",\"image\":\"1f453.png\",\"sheet_x\":10,\"sheet_y\":23,\"short_name\":\"eyeglasses\",\"short_names\":[\"eyeglasses\"],\"text\":null},{\"name\":\"NECKTIE\",\"unified\":\"1F454\",\"docomo\":\"\",\"au\":\"EA93\",\"softbank\":\"E302\",\"google\":\"FE4D3\",\"image\":\"1f454.png\",\"sheet_x\":10,\"sheet_y\":24,\"short_name\":\"necktie\",\"short_names\":[\"necktie\"],\"text\":null},{\"name\":\"T-SHIRT\",\"unified\":\"1F455\",\"docomo\":\"E70E\",\"au\":\"E5B6\",\"softbank\":\"E006\",\"google\":\"FE4CF\",\"image\":\"1f455.png\",\"sheet_x\":10,\"sheet_y\":25,\"short_name\":\"shirt\",\"short_names\":[\"shirt\",\"tshirt\"],\"text\":null},{\"name\":\"JEANS\",\"unified\":\"1F456\",\"docomo\":\"E711\",\"au\":\"EB77\",\"softbank\":\"\",\"google\":\"FE4D0\",\"image\":\"1f456.png\",\"sheet_x\":10,\"sheet_y\":26,\"short_name\":\"jeans\",\"short_names\":[\"jeans\"],\"text\":null},{\"name\":\"DRESS\",\"unified\":\"1F457\",\"docomo\":\"\",\"au\":\"EB6B\",\"softbank\":\"E319\",\"google\":\"FE4D5\",\"image\":\"1f457.png\",\"sheet_x\":10,\"sheet_y\":27,\"short_name\":\"dress\",\"short_names\":[\"dress\"],\"text\":null},{\"name\":\"KIMONO\",\"unified\":\"1F458\",\"docomo\":\"\",\"au\":\"EAA3\",\"softbank\":\"E321\",\"google\":\"FE4D9\",\"image\":\"1f458.png\",\"sheet_x\":10,\"sheet_y\":28,\"short_name\":\"kimono\",\"short_names\":[\"kimono\"],\"text\":null},{\"name\":\"BIKINI\",\"unified\":\"1F459\",\"docomo\":\"\",\"au\":\"EAA4\",\"softbank\":\"E322\",\"google\":\"FE4DA\",\"image\":\"1f459.png\",\"sheet_x\":10,\"sheet_y\":29,\"short_name\":\"bikini\",\"short_names\":[\"bikini\"],\"text\":null},{\"name\":\"WOMANS CLOTHES\",\"unified\":\"1F45A\",\"docomo\":\"E70E\",\"au\":\"E50D\",\"softbank\":\"E006\",\"google\":\"FE4DB\",\"image\":\"1f45a.png\",\"sheet_x\":11,\"sheet_y\":0,\"short_name\":\"womans_clothes\",\"short_names\":[\"womans_clothes\"],\"text\":null},{\"name\":\"PURSE\",\"unified\":\"1F45B\",\"docomo\":\"E70F\",\"au\":\"E504\",\"softbank\":\"\",\"google\":\"FE4DC\",\"image\":\"1f45b.png\",\"sheet_x\":11,\"sheet_y\":1,\"short_name\":\"purse\",\"short_names\":[\"purse\"],\"text\":null},{\"name\":\"HANDBAG\",\"unified\":\"1F45C\",\"docomo\":\"E682\",\"au\":\"E49C\",\"softbank\":\"E323\",\"google\":\"FE4F0\",\"image\":\"1f45c.png\",\"sheet_x\":11,\"sheet_y\":2,\"short_name\":\"handbag\",\"short_names\":[\"handbag\"],\"text\":null},{\"name\":\"POUCH\",\"unified\":\"1F45D\",\"docomo\":\"E6AD\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE4F1\",\"image\":\"1f45d.png\",\"sheet_x\":11,\"sheet_y\":3,\"short_name\":\"pouch\",\"short_names\":[\"pouch\"],\"text\":null},{\"name\":\"MANS SHOE\",\"unified\":\"1F45E\",\"docomo\":\"E699\",\"au\":\"E5B7\",\"softbank\":\"E007\",\"google\":\"FE4CC\",\"image\":\"1f45e.png\",\"sheet_x\":11,\"sheet_y\":4,\"short_name\":\"mans_shoe\",\"short_names\":[\"mans_shoe\",\"shoe\"],\"text\":null},{\"name\":\"ATHLETIC SHOE\",\"unified\":\"1F45F\",\"docomo\":\"E699\",\"au\":\"EB2B\",\"softbank\":\"E007\",\"google\":\"FE4CD\",\"image\":\"1f45f.png\",\"sheet_x\":11,\"sheet_y\":5,\"short_name\":\"athletic_shoe\",\"short_names\":[\"athletic_shoe\"],\"text\":null},{\"name\":\"HIGH-HEELED SHOE\",\"unified\":\"1F460\",\"docomo\":\"E674\",\"au\":\"E51A\",\"softbank\":\"E13E\",\"google\":\"FE4D6\",\"image\":\"1f460.png\",\"sheet_x\":11,\"sheet_y\":6,\"short_name\":\"high_heel\",\"short_names\":[\"high_heel\"],\"text\":null},{\"name\":\"WOMANS SANDAL\",\"unified\":\"1F461\",\"docomo\":\"E674\",\"au\":\"E51A\",\"softbank\":\"E31A\",\"google\":\"FE4D7\",\"image\":\"1f461.png\",\"sheet_x\":11,\"sheet_y\":7,\"short_name\":\"sandal\",\"short_names\":[\"sandal\"],\"text\":null},{\"name\":\"WOMANS BOOTS\",\"unified\":\"1F462\",\"docomo\":\"\",\"au\":\"EA9F\",\"softbank\":\"E31B\",\"google\":\"FE4D8\",\"image\":\"1f462.png\",\"sheet_x\":11,\"sheet_y\":8,\"short_name\":\"boot\",\"short_names\":[\"boot\"],\"text\":null},{\"name\":\"FOOTPRINTS\",\"unified\":\"1F463\",\"docomo\":\"E698\",\"au\":\"EB2A\",\"softbank\":\"E536\",\"google\":\"FE553\",\"image\":\"1f463.png\",\"sheet_x\":11,\"sheet_y\":9,\"short_name\":\"footprints\",\"short_names\":[\"footprints\"],\"text\":null},{\"name\":\"BUST IN SILHOUETTE\",\"unified\":\"1F464\",\"docomo\":\"E6B1\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE19A\",\"image\":\"1f464.png\",\"sheet_x\":11,\"sheet_y\":10,\"short_name\":\"bust_in_silhouette\",\"short_names\":[\"bust_in_silhouette\"],\"text\":null},{\"name\":\"BUSTS IN SILHOUETTE\",\"unified\":\"1F465\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f465.png\",\"sheet_x\":11,\"sheet_y\":11,\"short_name\":\"busts_in_silhouette\",\"short_names\":[\"busts_in_silhouette\"],\"text\":null},{\"name\":\"BOY\",\"unified\":\"1F466\",\"docomo\":\"E6F0\",\"au\":\"E4FC\",\"softbank\":\"E001\",\"google\":\"FE19B\",\"image\":\"1f466.png\",\"sheet_x\":11,\"sheet_y\":12,\"short_name\":\"boy\",\"short_names\":[\"boy\"],\"text\":null},{\"name\":\"GIRL\",\"unified\":\"1F467\",\"docomo\":\"E6F0\",\"au\":\"E4FA\",\"softbank\":\"E002\",\"google\":\"FE19C\",\"image\":\"1f467.png\",\"sheet_x\":11,\"sheet_y\":13,\"short_name\":\"girl\",\"short_names\":[\"girl\"],\"text\":null},{\"name\":\"MAN\",\"unified\":\"1F468\",\"docomo\":\"E6F0\",\"au\":\"E4FC\",\"softbank\":\"E004\",\"google\":\"FE19D\",\"image\":\"1f468.png\",\"sheet_x\":11,\"sheet_y\":14,\"short_name\":\"man\",\"short_names\":[\"man\"],\"text\":null},{\"name\":\"WOMAN\",\"unified\":\"1F469\",\"docomo\":\"E6F0\",\"au\":\"E4FA\",\"softbank\":\"E005\",\"google\":\"FE19E\",\"image\":\"1f469.png\",\"sheet_x\":11,\"sheet_y\":15,\"short_name\":\"woman\",\"short_names\":[\"woman\"],\"text\":null},{\"name\":\"FAMILY\",\"unified\":\"1F46A\",\"docomo\":\"\",\"au\":\"E501\",\"softbank\":\"\",\"google\":\"FE19F\",\"image\":\"1f46a.png\",\"sheet_x\":11,\"sheet_y\":16,\"short_name\":\"family\",\"short_names\":[\"family\"],\"text\":null},{\"name\":\"MAN AND WOMAN HOLDING HANDS\",\"unified\":\"1F46B\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E428\",\"google\":\"FE1A0\",\"image\":\"1f46b.png\",\"sheet_x\":11,\"sheet_y\":17,\"short_name\":\"couple\",\"short_names\":[\"couple\"],\"text\":null},{\"name\":\"TWO MEN HOLDING HANDS\",\"unified\":\"1F46C\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f46c.png\",\"sheet_x\":11,\"sheet_y\":18,\"short_name\":\"two_men_holding_hands\",\"short_names\":[\"two_men_holding_hands\"],\"text\":null},{\"name\":\"TWO WOMEN HOLDING HANDS\",\"unified\":\"1F46D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f46d.png\",\"sheet_x\":11,\"sheet_y\":19,\"short_name\":\"two_women_holding_hands\",\"short_names\":[\"two_women_holding_hands\"],\"text\":null},{\"name\":\"POLICE OFFICER\",\"unified\":\"1F46E\",\"docomo\":\"\",\"au\":\"E5DD\",\"softbank\":\"E152\",\"google\":\"FE1A1\",\"image\":\"1f46e.png\",\"sheet_x\":11,\"sheet_y\":20,\"short_name\":\"cop\",\"short_names\":[\"cop\"],\"text\":null},{\"name\":\"WOMAN WITH BUNNY EARS\",\"unified\":\"1F46F\",\"docomo\":\"\",\"au\":\"EADB\",\"softbank\":\"E429\",\"google\":\"FE1A2\",\"image\":\"1f46f.png\",\"sheet_x\":11,\"sheet_y\":21,\"short_name\":\"dancers\",\"short_names\":[\"dancers\"],\"text\":null},{\"name\":\"BRIDE WITH VEIL\",\"unified\":\"1F470\",\"docomo\":\"\",\"au\":\"EAE9\",\"softbank\":\"\",\"google\":\"FE1A3\",\"image\":\"1f470.png\",\"sheet_x\":11,\"sheet_y\":22,\"short_name\":\"bride_with_veil\",\"short_names\":[\"bride_with_veil\"],\"text\":null},{\"name\":\"PERSON WITH BLOND HAIR\",\"unified\":\"1F471\",\"docomo\":\"\",\"au\":\"EB13\",\"softbank\":\"E515\",\"google\":\"FE1A4\",\"image\":\"1f471.png\",\"sheet_x\":11,\"sheet_y\":23,\"short_name\":\"person_with_blond_hair\",\"short_names\":[\"person_with_blond_hair\"],\"text\":null},{\"name\":\"MAN WITH GUA PI MAO\",\"unified\":\"1F472\",\"docomo\":\"\",\"au\":\"EB14\",\"softbank\":\"E516\",\"google\":\"FE1A5\",\"image\":\"1f472.png\",\"sheet_x\":11,\"sheet_y\":24,\"short_name\":\"man_with_gua_pi_mao\",\"short_names\":[\"man_with_gua_pi_mao\"],\"text\":null},{\"name\":\"MAN WITH TURBAN\",\"unified\":\"1F473\",\"docomo\":\"\",\"au\":\"EB15\",\"softbank\":\"E517\",\"google\":\"FE1A6\",\"image\":\"1f473.png\",\"sheet_x\":11,\"sheet_y\":25,\"short_name\":\"man_with_turban\",\"short_names\":[\"man_with_turban\"],\"text\":null},{\"name\":\"OLDER MAN\",\"unified\":\"1F474\",\"docomo\":\"\",\"au\":\"EB16\",\"softbank\":\"E518\",\"google\":\"FE1A7\",\"image\":\"1f474.png\",\"sheet_x\":11,\"sheet_y\":26,\"short_name\":\"older_man\",\"short_names\":[\"older_man\"],\"text\":null},{\"name\":\"OLDER WOMAN\",\"unified\":\"1F475\",\"docomo\":\"\",\"au\":\"EB17\",\"softbank\":\"E519\",\"google\":\"FE1A8\",\"image\":\"1f475.png\",\"sheet_x\":11,\"sheet_y\":27,\"short_name\":\"older_woman\",\"short_names\":[\"older_woman\"],\"text\":null},{\"name\":\"BABY\",\"unified\":\"1F476\",\"docomo\":\"\",\"au\":\"EB18\",\"softbank\":\"E51A\",\"google\":\"FE1A9\",\"image\":\"1f476.png\",\"sheet_x\":11,\"sheet_y\":28,\"short_name\":\"baby\",\"short_names\":[\"baby\"],\"text\":null},{\"name\":\"CONSTRUCTION WORKER\",\"unified\":\"1F477\",\"docomo\":\"\",\"au\":\"EB19\",\"softbank\":\"E51B\",\"google\":\"FE1AA\",\"image\":\"1f477.png\",\"sheet_x\":11,\"sheet_y\":29,\"short_name\":\"construction_worker\",\"short_names\":[\"construction_worker\"],\"text\":null},{\"name\":\"PRINCESS\",\"unified\":\"1F478\",\"docomo\":\"\",\"au\":\"EB1A\",\"softbank\":\"E51C\",\"google\":\"FE1AB\",\"image\":\"1f478.png\",\"sheet_x\":12,\"sheet_y\":0,\"short_name\":\"princess\",\"short_names\":[\"princess\"],\"text\":null},{\"name\":\"JAPANESE OGRE\",\"unified\":\"1F479\",\"docomo\":\"\",\"au\":\"EB44\",\"softbank\":\"\",\"google\":\"FE1AC\",\"image\":\"1f479.png\",\"sheet_x\":12,\"sheet_y\":1,\"short_name\":\"japanese_ogre\",\"short_names\":[\"japanese_ogre\"],\"text\":null},{\"name\":\"JAPANESE GOBLIN\",\"unified\":\"1F47A\",\"docomo\":\"\",\"au\":\"EB45\",\"softbank\":\"\",\"google\":\"FE1AD\",\"image\":\"1f47a.png\",\"sheet_x\":12,\"sheet_y\":2,\"short_name\":\"japanese_goblin\",\"short_names\":[\"japanese_goblin\"],\"text\":null},{\"name\":\"GHOST\",\"unified\":\"1F47B\",\"docomo\":\"\",\"au\":\"E4CB\",\"softbank\":\"E11B\",\"google\":\"FE1AE\",\"image\":\"1f47b.png\",\"sheet_x\":12,\"sheet_y\":3,\"short_name\":\"ghost\",\"short_names\":[\"ghost\"],\"text\":null},{\"name\":\"BABY ANGEL\",\"unified\":\"1F47C\",\"docomo\":\"\",\"au\":\"E5BF\",\"softbank\":\"E04E\",\"google\":\"FE1AF\",\"image\":\"1f47c.png\",\"sheet_x\":12,\"sheet_y\":4,\"short_name\":\"angel\",\"short_names\":[\"angel\"],\"text\":null},{\"name\":\"EXTRATERRESTRIAL ALIEN\",\"unified\":\"1F47D\",\"docomo\":\"\",\"au\":\"E50E\",\"softbank\":\"E10C\",\"google\":\"FE1B0\",\"image\":\"1f47d.png\",\"sheet_x\":12,\"sheet_y\":5,\"short_name\":\"alien\",\"short_names\":[\"alien\"],\"text\":null},{\"name\":\"ALIEN MONSTER\",\"unified\":\"1F47E\",\"docomo\":\"\",\"au\":\"E4EC\",\"softbank\":\"E12B\",\"google\":\"FE1B1\",\"image\":\"1f47e.png\",\"sheet_x\":12,\"sheet_y\":6,\"short_name\":\"space_invader\",\"short_names\":[\"space_invader\"],\"text\":null},{\"name\":\"IMP\",\"unified\":\"1F47F\",\"docomo\":\"\",\"au\":\"E4EF\",\"softbank\":\"E11A\",\"google\":\"FE1B2\",\"image\":\"1f47f.png\",\"sheet_x\":12,\"sheet_y\":7,\"short_name\":\"imp\",\"short_names\":[\"imp\"],\"text\":null},{\"name\":\"SKULL\",\"unified\":\"1F480\",\"docomo\":\"\",\"au\":\"E4F8\",\"softbank\":\"E11C\",\"google\":\"FE1B3\",\"image\":\"1f480.png\",\"sheet_x\":12,\"sheet_y\":8,\"short_name\":\"skull\",\"short_names\":[\"skull\"],\"text\":null},{\"name\":\"INFORMATION DESK PERSON\",\"unified\":\"1F481\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E253\",\"google\":\"FE1B4\",\"image\":\"1f481.png\",\"sheet_x\":12,\"sheet_y\":9,\"short_name\":\"information_desk_person\",\"short_names\":[\"information_desk_person\"],\"text\":null},{\"name\":\"GUARDSMAN\",\"unified\":\"1F482\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E51E\",\"google\":\"FE1B5\",\"image\":\"1f482.png\",\"sheet_x\":12,\"sheet_y\":10,\"short_name\":\"guardsman\",\"short_names\":[\"guardsman\"],\"text\":null},{\"name\":\"DANCER\",\"unified\":\"1F483\",\"docomo\":\"\",\"au\":\"EB1C\",\"softbank\":\"E51F\",\"google\":\"FE1B6\",\"image\":\"1f483.png\",\"sheet_x\":12,\"sheet_y\":11,\"short_name\":\"dancer\",\"short_names\":[\"dancer\"],\"text\":null},{\"name\":\"LIPSTICK\",\"unified\":\"1F484\",\"docomo\":\"E710\",\"au\":\"E509\",\"softbank\":\"E31C\",\"google\":\"FE195\",\"image\":\"1f484.png\",\"sheet_x\":12,\"sheet_y\":12,\"short_name\":\"lipstick\",\"short_names\":[\"lipstick\"],\"text\":null},{\"name\":\"NAIL POLISH\",\"unified\":\"1F485\",\"docomo\":\"\",\"au\":\"EAA0\",\"softbank\":\"E31D\",\"google\":\"FE196\",\"image\":\"1f485.png\",\"sheet_x\":12,\"sheet_y\":13,\"short_name\":\"nail_care\",\"short_names\":[\"nail_care\"],\"text\":null},{\"name\":\"FACE MASSAGE\",\"unified\":\"1F486\",\"docomo\":\"\",\"au\":\"E50B\",\"softbank\":\"E31E\",\"google\":\"FE197\",\"image\":\"1f486.png\",\"sheet_x\":12,\"sheet_y\":14,\"short_name\":\"massage\",\"short_names\":[\"massage\"],\"text\":null},{\"name\":\"HAIRCUT\",\"unified\":\"1F487\",\"docomo\":\"E675\",\"au\":\"EAA1\",\"softbank\":\"E31F\",\"google\":\"FE198\",\"image\":\"1f487.png\",\"sheet_x\":12,\"sheet_y\":15,\"short_name\":\"haircut\",\"short_names\":[\"haircut\"],\"text\":null},{\"name\":\"BARBER POLE\",\"unified\":\"1F488\",\"docomo\":\"\",\"au\":\"EAA2\",\"softbank\":\"E320\",\"google\":\"FE199\",\"image\":\"1f488.png\",\"sheet_x\":12,\"sheet_y\":16,\"short_name\":\"barber\",\"short_names\":[\"barber\"],\"text\":null},{\"name\":\"SYRINGE\",\"unified\":\"1F489\",\"docomo\":\"\",\"au\":\"E510\",\"softbank\":\"E13B\",\"google\":\"FE509\",\"image\":\"1f489.png\",\"sheet_x\":12,\"sheet_y\":17,\"short_name\":\"syringe\",\"short_names\":[\"syringe\"],\"text\":null},{\"name\":\"PILL\",\"unified\":\"1F48A\",\"docomo\":\"\",\"au\":\"EA9A\",\"softbank\":\"E30F\",\"google\":\"FE50A\",\"image\":\"1f48a.png\",\"sheet_x\":12,\"sheet_y\":18,\"short_name\":\"pill\",\"short_names\":[\"pill\"],\"text\":null},{\"name\":\"KISS MARK\",\"unified\":\"1F48B\",\"docomo\":\"E6F9\",\"au\":\"E4EB\",\"softbank\":\"E003\",\"google\":\"FE823\",\"image\":\"1f48b.png\",\"sheet_x\":12,\"sheet_y\":19,\"short_name\":\"kiss\",\"short_names\":[\"kiss\"],\"text\":null},{\"name\":\"LOVE LETTER\",\"unified\":\"1F48C\",\"docomo\":\"E717\",\"au\":\"EB78\",\"softbank\":\"E103-E328\",\"google\":\"FE824\",\"image\":\"1f48c.png\",\"sheet_x\":12,\"sheet_y\":20,\"short_name\":\"love_letter\",\"short_names\":[\"love_letter\"],\"text\":null},{\"name\":\"RING\",\"unified\":\"1F48D\",\"docomo\":\"E71B\",\"au\":\"E514\",\"softbank\":\"E034\",\"google\":\"FE825\",\"image\":\"1f48d.png\",\"sheet_x\":12,\"sheet_y\":21,\"short_name\":\"ring\",\"short_names\":[\"ring\"],\"text\":null},{\"name\":\"GEM STONE\",\"unified\":\"1F48E\",\"docomo\":\"E71B\",\"au\":\"E514\",\"softbank\":\"E035\",\"google\":\"FE826\",\"image\":\"1f48e.png\",\"sheet_x\":12,\"sheet_y\":22,\"short_name\":\"gem\",\"short_names\":[\"gem\"],\"text\":null},{\"name\":\"KISS\",\"unified\":\"1F48F\",\"docomo\":\"E6F9\",\"au\":\"E5CA\",\"softbank\":\"E111\",\"google\":\"FE827\",\"image\":\"1f48f.png\",\"sheet_x\":12,\"sheet_y\":23,\"short_name\":\"couplekiss\",\"short_names\":[\"couplekiss\"],\"text\":null},{\"name\":\"BOUQUET\",\"unified\":\"1F490\",\"docomo\":\"\",\"au\":\"EA95\",\"softbank\":\"E306\",\"google\":\"FE828\",\"image\":\"1f490.png\",\"sheet_x\":12,\"sheet_y\":24,\"short_name\":\"bouquet\",\"short_names\":[\"bouquet\"],\"text\":null},{\"name\":\"COUPLE WITH HEART\",\"unified\":\"1F491\",\"docomo\":\"E6ED\",\"au\":\"EADA\",\"softbank\":\"E425\",\"google\":\"FE829\",\"image\":\"1f491.png\",\"sheet_x\":12,\"sheet_y\":25,\"short_name\":\"couple_with_heart\",\"short_names\":[\"couple_with_heart\"],\"text\":null},{\"name\":\"WEDDING\",\"unified\":\"1F492\",\"docomo\":\"\",\"au\":\"E5BB\",\"softbank\":\"E43D\",\"google\":\"FE82A\",\"image\":\"1f492.png\",\"sheet_x\":12,\"sheet_y\":26,\"short_name\":\"wedding\",\"short_names\":[\"wedding\"],\"text\":null},{\"name\":\"BEATING HEART\",\"unified\":\"1F493\",\"docomo\":\"E6ED\",\"au\":\"EB75\",\"softbank\":\"E327\",\"google\":\"FEB0D\",\"image\":\"1f493.png\",\"sheet_x\":12,\"sheet_y\":27,\"short_name\":\"heartbeat\",\"short_names\":[\"heartbeat\"],\"text\":null},{\"name\":\"BROKEN HEART\",\"unified\":\"1F494\",\"docomo\":\"E6EE\",\"au\":\"E477\",\"softbank\":\"E023\",\"google\":\"FEB0E\",\"image\":\"1f494.png\",\"sheet_x\":12,\"sheet_y\":28,\"short_name\":\"broken_heart\",\"short_names\":[\"broken_heart\"],\"text\":\"<\\/3\"},{\"name\":\"TWO HEARTS\",\"unified\":\"1F495\",\"docomo\":\"E6EF\",\"au\":\"E478\",\"softbank\":\"E327\",\"google\":\"FEB0F\",\"image\":\"1f495.png\",\"sheet_x\":12,\"sheet_y\":29,\"short_name\":\"two_hearts\",\"short_names\":[\"two_hearts\"],\"text\":null},{\"name\":\"SPARKLING HEART\",\"unified\":\"1F496\",\"docomo\":\"E6EC\",\"au\":\"EAA6\",\"softbank\":\"E327\",\"google\":\"FEB10\",\"image\":\"1f496.png\",\"sheet_x\":13,\"sheet_y\":0,\"short_name\":\"sparkling_heart\",\"short_names\":[\"sparkling_heart\"],\"text\":null},{\"name\":\"GROWING HEART\",\"unified\":\"1F497\",\"docomo\":\"E6ED\",\"au\":\"EB75\",\"softbank\":\"E328\",\"google\":\"FEB11\",\"image\":\"1f497.png\",\"sheet_x\":13,\"sheet_y\":1,\"short_name\":\"heartpulse\",\"short_names\":[\"heartpulse\"],\"text\":null},{\"name\":\"HEART WITH ARROW\",\"unified\":\"1F498\",\"docomo\":\"E6EC\",\"au\":\"E4EA\",\"softbank\":\"E329\",\"google\":\"FEB12\",\"image\":\"1f498.png\",\"sheet_x\":13,\"sheet_y\":2,\"short_name\":\"cupid\",\"short_names\":[\"cupid\"],\"text\":null},{\"name\":\"BLUE HEART\",\"unified\":\"1F499\",\"docomo\":\"E6EC\",\"au\":\"EAA7\",\"softbank\":\"E32A\",\"google\":\"FEB13\",\"image\":\"1f499.png\",\"sheet_x\":13,\"sheet_y\":3,\"short_name\":\"blue_heart\",\"short_names\":[\"blue_heart\"],\"text\":\"<3\"},{\"name\":\"GREEN HEART\",\"unified\":\"1F49A\",\"docomo\":\"E6EC\",\"au\":\"EAA8\",\"softbank\":\"E32B\",\"google\":\"FEB14\",\"image\":\"1f49a.png\",\"sheet_x\":13,\"sheet_y\":4,\"short_name\":\"green_heart\",\"short_names\":[\"green_heart\"],\"text\":\"<3\"},{\"name\":\"YELLOW HEART\",\"unified\":\"1F49B\",\"docomo\":\"E6EC\",\"au\":\"EAA9\",\"softbank\":\"E32C\",\"google\":\"FEB15\",\"image\":\"1f49b.png\",\"sheet_x\":13,\"sheet_y\":5,\"short_name\":\"yellow_heart\",\"short_names\":[\"yellow_heart\"],\"text\":\"<3\"},{\"name\":\"PURPLE HEART\",\"unified\":\"1F49C\",\"docomo\":\"E6EC\",\"au\":\"EAAA\",\"softbank\":\"E32D\",\"google\":\"FEB16\",\"image\":\"1f49c.png\",\"sheet_x\":13,\"sheet_y\":6,\"short_name\":\"purple_heart\",\"short_names\":[\"purple_heart\"],\"text\":\"<3\"},{\"name\":\"HEART WITH RIBBON\",\"unified\":\"1F49D\",\"docomo\":\"E6EC\",\"au\":\"EB54\",\"softbank\":\"E437\",\"google\":\"FEB17\",\"image\":\"1f49d.png\",\"sheet_x\":13,\"sheet_y\":7,\"short_name\":\"gift_heart\",\"short_names\":[\"gift_heart\"],\"text\":null},{\"name\":\"REVOLVING HEARTS\",\"unified\":\"1F49E\",\"docomo\":\"E6ED\",\"au\":\"E5AF\",\"softbank\":\"E327\",\"google\":\"FEB18\",\"image\":\"1f49e.png\",\"sheet_x\":13,\"sheet_y\":8,\"short_name\":\"revolving_hearts\",\"short_names\":[\"revolving_hearts\"],\"text\":null},{\"name\":\"HEART DECORATION\",\"unified\":\"1F49F\",\"docomo\":\"E6F8\",\"au\":\"E595\",\"softbank\":\"E204\",\"google\":\"FEB19\",\"image\":\"1f49f.png\",\"sheet_x\":13,\"sheet_y\":9,\"short_name\":\"heart_decoration\",\"short_names\":[\"heart_decoration\"],\"text\":null},{\"name\":\"DIAMOND SHAPE WITH A DOT INSIDE\",\"unified\":\"1F4A0\",\"docomo\":\"E6F8\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FEB55\",\"image\":\"1f4a0.png\",\"sheet_x\":13,\"sheet_y\":10,\"short_name\":\"diamond_shape_with_a_dot_inside\",\"short_names\":[\"diamond_shape_with_a_dot_inside\"],\"text\":null},{\"name\":\"ELECTRIC LIGHT BULB\",\"unified\":\"1F4A1\",\"docomo\":\"E6FB\",\"au\":\"E476\",\"softbank\":\"E10F\",\"google\":\"FEB56\",\"image\":\"1f4a1.png\",\"sheet_x\":13,\"sheet_y\":11,\"short_name\":\"bulb\",\"short_names\":[\"bulb\"],\"text\":null},{\"name\":\"ANGER SYMBOL\",\"unified\":\"1F4A2\",\"docomo\":\"E6FC\",\"au\":\"E4E5\",\"softbank\":\"E334\",\"google\":\"FEB57\",\"image\":\"1f4a2.png\",\"sheet_x\":13,\"sheet_y\":12,\"short_name\":\"anger\",\"short_names\":[\"anger\"],\"text\":null},{\"name\":\"BOMB\",\"unified\":\"1F4A3\",\"docomo\":\"E6FE\",\"au\":\"E47A\",\"softbank\":\"E311\",\"google\":\"FEB58\",\"image\":\"1f4a3.png\",\"sheet_x\":13,\"sheet_y\":13,\"short_name\":\"bomb\",\"short_names\":[\"bomb\"],\"text\":null},{\"name\":\"SLEEPING SYMBOL\",\"unified\":\"1F4A4\",\"docomo\":\"E701\",\"au\":\"E475\",\"softbank\":\"E13C\",\"google\":\"FEB59\",\"image\":\"1f4a4.png\",\"sheet_x\":13,\"sheet_y\":14,\"short_name\":\"zzz\",\"short_names\":[\"zzz\"],\"text\":null},{\"name\":\"COLLISION SYMBOL\",\"unified\":\"1F4A5\",\"docomo\":\"E705\",\"au\":\"E5B0\",\"softbank\":\"\",\"google\":\"FEB5A\",\"image\":\"1f4a5.png\",\"sheet_x\":13,\"sheet_y\":15,\"short_name\":\"boom\",\"short_names\":[\"boom\",\"collision\"],\"text\":null},{\"name\":\"SPLASHING SWEAT SYMBOL\",\"unified\":\"1F4A6\",\"docomo\":\"E706\",\"au\":\"E5B1\",\"softbank\":\"E331\",\"google\":\"FEB5B\",\"image\":\"1f4a6.png\",\"sheet_x\":13,\"sheet_y\":16,\"short_name\":\"sweat_drops\",\"short_names\":[\"sweat_drops\"],\"text\":null},{\"name\":\"DROPLET\",\"unified\":\"1F4A7\",\"docomo\":\"E707\",\"au\":\"E4E6\",\"softbank\":\"E331\",\"google\":\"FEB5C\",\"image\":\"1f4a7.png\",\"sheet_x\":13,\"sheet_y\":17,\"short_name\":\"droplet\",\"short_names\":[\"droplet\"],\"text\":null},{\"name\":\"DASH SYMBOL\",\"unified\":\"1F4A8\",\"docomo\":\"E708\",\"au\":\"E4F4\",\"softbank\":\"E330\",\"google\":\"FEB5D\",\"image\":\"1f4a8.png\",\"sheet_x\":13,\"sheet_y\":18,\"short_name\":\"dash\",\"short_names\":[\"dash\"],\"text\":null},{\"name\":\"PILE OF POO\",\"unified\":\"1F4A9\",\"docomo\":\"\",\"au\":\"E4F5\",\"softbank\":\"E05A\",\"google\":\"FE4F4\",\"image\":\"1f4a9.png\",\"sheet_x\":13,\"sheet_y\":19,\"short_name\":\"hankey\",\"short_names\":[\"hankey\",\"poop\",\"shit\"],\"text\":null},{\"name\":\"FLEXED BICEPS\",\"unified\":\"1F4AA\",\"docomo\":\"\",\"au\":\"E4E9\",\"softbank\":\"E14C\",\"google\":\"FEB5E\",\"image\":\"1f4aa.png\",\"sheet_x\":13,\"sheet_y\":20,\"short_name\":\"muscle\",\"short_names\":[\"muscle\"],\"text\":null},{\"name\":\"DIZZY SYMBOL\",\"unified\":\"1F4AB\",\"docomo\":\"\",\"au\":\"EB5C\",\"softbank\":\"E407\",\"google\":\"FEB5F\",\"image\":\"1f4ab.png\",\"sheet_x\":13,\"sheet_y\":21,\"short_name\":\"dizzy\",\"short_names\":[\"dizzy\"],\"text\":null},{\"name\":\"SPEECH BALLOON\",\"unified\":\"1F4AC\",\"docomo\":\"\",\"au\":\"E4FD\",\"softbank\":\"\",\"google\":\"FE532\",\"image\":\"1f4ac.png\",\"sheet_x\":13,\"sheet_y\":22,\"short_name\":\"speech_balloon\",\"short_names\":[\"speech_balloon\"],\"text\":null},{\"name\":\"THOUGHT BALLOON\",\"unified\":\"1F4AD\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f4ad.png\",\"sheet_x\":13,\"sheet_y\":23,\"short_name\":\"thought_balloon\",\"short_names\":[\"thought_balloon\"],\"text\":null},{\"name\":\"WHITE FLOWER\",\"unified\":\"1F4AE\",\"docomo\":\"\",\"au\":\"E4F0\",\"softbank\":\"\",\"google\":\"FEB7A\",\"image\":\"1f4ae.png\",\"sheet_x\":13,\"sheet_y\":24,\"short_name\":\"white_flower\",\"short_names\":[\"white_flower\"],\"text\":null},{\"name\":\"HUNDRED POINTS SYMBOL\",\"unified\":\"1F4AF\",\"docomo\":\"\",\"au\":\"E4F2\",\"softbank\":\"\",\"google\":\"FEB7B\",\"image\":\"1f4af.png\",\"sheet_x\":13,\"sheet_y\":25,\"short_name\":\"100\",\"short_names\":[\"100\"],\"text\":null},{\"name\":\"MONEY BAG\",\"unified\":\"1F4B0\",\"docomo\":\"E715\",\"au\":\"E4C7\",\"softbank\":\"E12F\",\"google\":\"FE4DD\",\"image\":\"1f4b0.png\",\"sheet_x\":13,\"sheet_y\":26,\"short_name\":\"moneybag\",\"short_names\":[\"moneybag\"],\"text\":null},{\"name\":\"CURRENCY EXCHANGE\",\"unified\":\"1F4B1\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E149\",\"google\":\"FE4DE\",\"image\":\"1f4b1.png\",\"sheet_x\":13,\"sheet_y\":27,\"short_name\":\"currency_exchange\",\"short_names\":[\"currency_exchange\"],\"text\":null},{\"name\":\"HEAVY DOLLAR SIGN\",\"unified\":\"1F4B2\",\"docomo\":\"E715\",\"au\":\"E579\",\"softbank\":\"E12F\",\"google\":\"FE4E0\",\"image\":\"1f4b2.png\",\"sheet_x\":13,\"sheet_y\":28,\"short_name\":\"heavy_dollar_sign\",\"short_names\":[\"heavy_dollar_sign\"],\"text\":null},{\"name\":\"CREDIT CARD\",\"unified\":\"1F4B3\",\"docomo\":\"\",\"au\":\"E57C\",\"softbank\":\"\",\"google\":\"FE4E1\",\"image\":\"1f4b3.png\",\"sheet_x\":13,\"sheet_y\":29,\"short_name\":\"credit_card\",\"short_names\":[\"credit_card\"],\"text\":null},{\"name\":\"BANKNOTE WITH YEN SIGN\",\"unified\":\"1F4B4\",\"docomo\":\"E6D6\",\"au\":\"E57D\",\"softbank\":\"\",\"google\":\"FE4E2\",\"image\":\"1f4b4.png\",\"sheet_x\":14,\"sheet_y\":0,\"short_name\":\"yen\",\"short_names\":[\"yen\"],\"text\":null},{\"name\":\"BANKNOTE WITH DOLLAR SIGN\",\"unified\":\"1F4B5\",\"docomo\":\"E715\",\"au\":\"E585\",\"softbank\":\"E12F\",\"google\":\"FE4E3\",\"image\":\"1f4b5.png\",\"sheet_x\":14,\"sheet_y\":1,\"short_name\":\"dollar\",\"short_names\":[\"dollar\"],\"text\":null},{\"name\":\"BANKNOTE WITH EURO SIGN\",\"unified\":\"1F4B6\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f4b6.png\",\"sheet_x\":14,\"sheet_y\":2,\"short_name\":\"euro\",\"short_names\":[\"euro\"],\"text\":null},{\"name\":\"BANKNOTE WITH POUND SIGN\",\"unified\":\"1F4B7\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f4b7.png\",\"sheet_x\":14,\"sheet_y\":3,\"short_name\":\"pound\",\"short_names\":[\"pound\"],\"text\":null},{\"name\":\"MONEY WITH WINGS\",\"unified\":\"1F4B8\",\"docomo\":\"\",\"au\":\"EB5B\",\"softbank\":\"\",\"google\":\"FE4E4\",\"image\":\"1f4b8.png\",\"sheet_x\":14,\"sheet_y\":4,\"short_name\":\"money_with_wings\",\"short_names\":[\"money_with_wings\"],\"text\":null},{\"name\":\"CHART WITH UPWARDS TREND AND YEN SIGN\",\"unified\":\"1F4B9\",\"docomo\":\"\",\"au\":\"E5DC\",\"softbank\":\"E14A\",\"google\":\"FE4DF\",\"image\":\"1f4b9.png\",\"sheet_x\":14,\"sheet_y\":5,\"short_name\":\"chart\",\"short_names\":[\"chart\"],\"text\":null},{\"name\":\"SEAT\",\"unified\":\"1F4BA\",\"docomo\":\"E6B2\",\"au\":\"\",\"softbank\":\"E11F\",\"google\":\"FE537\",\"image\":\"1f4ba.png\",\"sheet_x\":14,\"sheet_y\":6,\"short_name\":\"seat\",\"short_names\":[\"seat\"],\"text\":null},{\"name\":\"PERSONAL COMPUTER\",\"unified\":\"1F4BB\",\"docomo\":\"E716\",\"au\":\"E5B8\",\"softbank\":\"E00C\",\"google\":\"FE538\",\"image\":\"1f4bb.png\",\"sheet_x\":14,\"sheet_y\":7,\"short_name\":\"computer\",\"short_names\":[\"computer\"],\"text\":null},{\"name\":\"BRIEFCASE\",\"unified\":\"1F4BC\",\"docomo\":\"E682\",\"au\":\"E5CE\",\"softbank\":\"E11E\",\"google\":\"FE53B\",\"image\":\"1f4bc.png\",\"sheet_x\":14,\"sheet_y\":8,\"short_name\":\"briefcase\",\"short_names\":[\"briefcase\"],\"text\":null},{\"name\":\"MINIDISC\",\"unified\":\"1F4BD\",\"docomo\":\"\",\"au\":\"E582\",\"softbank\":\"E316\",\"google\":\"FE53C\",\"image\":\"1f4bd.png\",\"sheet_x\":14,\"sheet_y\":9,\"short_name\":\"minidisc\",\"short_names\":[\"minidisc\"],\"text\":null},{\"name\":\"FLOPPY DISK\",\"unified\":\"1F4BE\",\"docomo\":\"\",\"au\":\"E562\",\"softbank\":\"E316\",\"google\":\"FE53D\",\"image\":\"1f4be.png\",\"sheet_x\":14,\"sheet_y\":10,\"short_name\":\"floppy_disk\",\"short_names\":[\"floppy_disk\"],\"text\":null},{\"name\":\"OPTICAL DISC\",\"unified\":\"1F4BF\",\"docomo\":\"E68C\",\"au\":\"E50C\",\"softbank\":\"E126\",\"google\":\"FE81D\",\"image\":\"1f4bf.png\",\"sheet_x\":14,\"sheet_y\":11,\"short_name\":\"cd\",\"short_names\":[\"cd\"],\"text\":null},{\"name\":\"DVD\",\"unified\":\"1F4C0\",\"docomo\":\"E68C\",\"au\":\"E50C\",\"softbank\":\"E127\",\"google\":\"FE81E\",\"image\":\"1f4c0.png\",\"sheet_x\":14,\"sheet_y\":12,\"short_name\":\"dvd\",\"short_names\":[\"dvd\"],\"text\":null},{\"name\":\"FILE FOLDER\",\"unified\":\"1F4C1\",\"docomo\":\"\",\"au\":\"E58F\",\"softbank\":\"\",\"google\":\"FE543\",\"image\":\"1f4c1.png\",\"sheet_x\":14,\"sheet_y\":13,\"short_name\":\"file_folder\",\"short_names\":[\"file_folder\"],\"text\":null},{\"name\":\"OPEN FILE FOLDER\",\"unified\":\"1F4C2\",\"docomo\":\"\",\"au\":\"E590\",\"softbank\":\"\",\"google\":\"FE544\",\"image\":\"1f4c2.png\",\"sheet_x\":14,\"sheet_y\":14,\"short_name\":\"open_file_folder\",\"short_names\":[\"open_file_folder\"],\"text\":null},{\"name\":\"PAGE WITH CURL\",\"unified\":\"1F4C3\",\"docomo\":\"E689\",\"au\":\"E561\",\"softbank\":\"E301\",\"google\":\"FE540\",\"image\":\"1f4c3.png\",\"sheet_x\":14,\"sheet_y\":15,\"short_name\":\"page_with_curl\",\"short_names\":[\"page_with_curl\"],\"text\":null},{\"name\":\"PAGE FACING UP\",\"unified\":\"1F4C4\",\"docomo\":\"E689\",\"au\":\"E569\",\"softbank\":\"E301\",\"google\":\"FE541\",\"image\":\"1f4c4.png\",\"sheet_x\":14,\"sheet_y\":16,\"short_name\":\"page_facing_up\",\"short_names\":[\"page_facing_up\"],\"text\":null},{\"name\":\"CALENDAR\",\"unified\":\"1F4C5\",\"docomo\":\"\",\"au\":\"E563\",\"softbank\":\"\",\"google\":\"FE542\",\"image\":\"1f4c5.png\",\"sheet_x\":14,\"sheet_y\":17,\"short_name\":\"date\",\"short_names\":[\"date\"],\"text\":null},{\"name\":\"TEAR-OFF CALENDAR\",\"unified\":\"1F4C6\",\"docomo\":\"\",\"au\":\"E56A\",\"softbank\":\"\",\"google\":\"FE549\",\"image\":\"1f4c6.png\",\"sheet_x\":14,\"sheet_y\":18,\"short_name\":\"calendar\",\"short_names\":[\"calendar\"],\"text\":null},{\"name\":\"CARD INDEX\",\"unified\":\"1F4C7\",\"docomo\":\"E683\",\"au\":\"E56C\",\"softbank\":\"E148\",\"google\":\"FE54D\",\"image\":\"1f4c7.png\",\"sheet_x\":14,\"sheet_y\":19,\"short_name\":\"card_index\",\"short_names\":[\"card_index\"],\"text\":null},{\"name\":\"CHART WITH UPWARDS TREND\",\"unified\":\"1F4C8\",\"docomo\":\"\",\"au\":\"E575\",\"softbank\":\"E14A\",\"google\":\"FE54B\",\"image\":\"1f4c8.png\",\"sheet_x\":14,\"sheet_y\":20,\"short_name\":\"chart_with_upwards_trend\",\"short_names\":[\"chart_with_upwards_trend\"],\"text\":null},{\"name\":\"CHART WITH DOWNWARDS TREND\",\"unified\":\"1F4C9\",\"docomo\":\"\",\"au\":\"E576\",\"softbank\":\"\",\"google\":\"FE54C\",\"image\":\"1f4c9.png\",\"sheet_x\":14,\"sheet_y\":21,\"short_name\":\"chart_with_downwards_trend\",\"short_names\":[\"chart_with_downwards_trend\"],\"text\":null},{\"name\":\"BAR CHART\",\"unified\":\"1F4CA\",\"docomo\":\"\",\"au\":\"E574\",\"softbank\":\"E14A\",\"google\":\"FE54A\",\"image\":\"1f4ca.png\",\"sheet_x\":14,\"sheet_y\":22,\"short_name\":\"bar_chart\",\"short_names\":[\"bar_chart\"],\"text\":null},{\"name\":\"CLIPBOARD\",\"unified\":\"1F4CB\",\"docomo\":\"E689\",\"au\":\"E564\",\"softbank\":\"E301\",\"google\":\"FE548\",\"image\":\"1f4cb.png\",\"sheet_x\":14,\"sheet_y\":23,\"short_name\":\"clipboard\",\"short_names\":[\"clipboard\"],\"text\":null},{\"name\":\"PUSHPIN\",\"unified\":\"1F4CC\",\"docomo\":\"\",\"au\":\"E56D\",\"softbank\":\"\",\"google\":\"FE54E\",\"image\":\"1f4cc.png\",\"sheet_x\":14,\"sheet_y\":24,\"short_name\":\"pushpin\",\"short_names\":[\"pushpin\"],\"text\":null},{\"name\":\"ROUND PUSHPIN\",\"unified\":\"1F4CD\",\"docomo\":\"\",\"au\":\"E560\",\"softbank\":\"\",\"google\":\"FE53F\",\"image\":\"1f4cd.png\",\"sheet_x\":14,\"sheet_y\":25,\"short_name\":\"round_pushpin\",\"short_names\":[\"round_pushpin\"],\"text\":null},{\"name\":\"PAPERCLIP\",\"unified\":\"1F4CE\",\"docomo\":\"E730\",\"au\":\"E4A0\",\"softbank\":\"\",\"google\":\"FE53A\",\"image\":\"1f4ce.png\",\"sheet_x\":14,\"sheet_y\":26,\"short_name\":\"paperclip\",\"short_names\":[\"paperclip\"],\"text\":null},{\"name\":\"STRAIGHT RULER\",\"unified\":\"1F4CF\",\"docomo\":\"\",\"au\":\"E570\",\"softbank\":\"\",\"google\":\"FE550\",\"image\":\"1f4cf.png\",\"sheet_x\":14,\"sheet_y\":27,\"short_name\":\"straight_ruler\",\"short_names\":[\"straight_ruler\"],\"text\":null},{\"name\":\"TRIANGULAR RULER\",\"unified\":\"1F4D0\",\"docomo\":\"\",\"au\":\"E4A2\",\"softbank\":\"\",\"google\":\"FE551\",\"image\":\"1f4d0.png\",\"sheet_x\":14,\"sheet_y\":28,\"short_name\":\"triangular_ruler\",\"short_names\":[\"triangular_ruler\"],\"text\":null},{\"name\":\"BOOKMARK TABS\",\"unified\":\"1F4D1\",\"docomo\":\"E689\",\"au\":\"EB0B\",\"softbank\":\"E301\",\"google\":\"FE552\",\"image\":\"1f4d1.png\",\"sheet_x\":14,\"sheet_y\":29,\"short_name\":\"bookmark_tabs\",\"short_names\":[\"bookmark_tabs\"],\"text\":null},{\"name\":\"LEDGER\",\"unified\":\"1F4D2\",\"docomo\":\"E683\",\"au\":\"E56E\",\"softbank\":\"E148\",\"google\":\"FE54F\",\"image\":\"1f4d2.png\",\"sheet_x\":15,\"sheet_y\":0,\"short_name\":\"ledger\",\"short_names\":[\"ledger\"],\"text\":null},{\"name\":\"NOTEBOOK\",\"unified\":\"1F4D3\",\"docomo\":\"E683\",\"au\":\"E56B\",\"softbank\":\"E148\",\"google\":\"FE545\",\"image\":\"1f4d3.png\",\"sheet_x\":15,\"sheet_y\":1,\"short_name\":\"notebook\",\"short_names\":[\"notebook\"],\"text\":null},{\"name\":\"NOTEBOOK WITH DECORATIVE COVER\",\"unified\":\"1F4D4\",\"docomo\":\"E683\",\"au\":\"E49D\",\"softbank\":\"E148\",\"google\":\"FE547\",\"image\":\"1f4d4.png\",\"sheet_x\":15,\"sheet_y\":2,\"short_name\":\"notebook_with_decorative_cover\",\"short_names\":[\"notebook_with_decorative_cover\"],\"text\":null},{\"name\":\"CLOSED BOOK\",\"unified\":\"1F4D5\",\"docomo\":\"E683\",\"au\":\"E568\",\"softbank\":\"E148\",\"google\":\"FE502\",\"image\":\"1f4d5.png\",\"sheet_x\":15,\"sheet_y\":3,\"short_name\":\"closed_book\",\"short_names\":[\"closed_book\"],\"text\":null},{\"name\":\"OPEN BOOK\",\"unified\":\"1F4D6\",\"docomo\":\"E683\",\"au\":\"E49F\",\"softbank\":\"E148\",\"google\":\"FE546\",\"image\":\"1f4d6.png\",\"sheet_x\":15,\"sheet_y\":4,\"short_name\":\"book\",\"short_names\":[\"book\",\"open_book\"],\"text\":null},{\"name\":\"GREEN BOOK\",\"unified\":\"1F4D7\",\"docomo\":\"E683\",\"au\":\"E565\",\"softbank\":\"E148\",\"google\":\"FE4FF\",\"image\":\"1f4d7.png\",\"sheet_x\":15,\"sheet_y\":5,\"short_name\":\"green_book\",\"short_names\":[\"green_book\"],\"text\":null},{\"name\":\"BLUE BOOK\",\"unified\":\"1F4D8\",\"docomo\":\"E683\",\"au\":\"E566\",\"softbank\":\"E148\",\"google\":\"FE500\",\"image\":\"1f4d8.png\",\"sheet_x\":15,\"sheet_y\":6,\"short_name\":\"blue_book\",\"short_names\":[\"blue_book\"],\"text\":null},{\"name\":\"ORANGE BOOK\",\"unified\":\"1F4D9\",\"docomo\":\"E683\",\"au\":\"E567\",\"softbank\":\"E148\",\"google\":\"FE501\",\"image\":\"1f4d9.png\",\"sheet_x\":15,\"sheet_y\":7,\"short_name\":\"orange_book\",\"short_names\":[\"orange_book\"],\"text\":null},{\"name\":\"BOOKS\",\"unified\":\"1F4DA\",\"docomo\":\"E683\",\"au\":\"E56F\",\"softbank\":\"E148\",\"google\":\"FE503\",\"image\":\"1f4da.png\",\"sheet_x\":15,\"sheet_y\":8,\"short_name\":\"books\",\"short_names\":[\"books\"],\"text\":null},{\"name\":\"NAME BADGE\",\"unified\":\"1F4DB\",\"docomo\":\"\",\"au\":\"E51D\",\"softbank\":\"\",\"google\":\"FE504\",\"image\":\"1f4db.png\",\"sheet_x\":15,\"sheet_y\":9,\"short_name\":\"name_badge\",\"short_names\":[\"name_badge\"],\"text\":null},{\"name\":\"SCROLL\",\"unified\":\"1F4DC\",\"docomo\":\"E70A\",\"au\":\"E55F\",\"softbank\":\"\",\"google\":\"FE4FD\",\"image\":\"1f4dc.png\",\"sheet_x\":15,\"sheet_y\":10,\"short_name\":\"scroll\",\"short_names\":[\"scroll\"],\"text\":null},{\"name\":\"MEMO\",\"unified\":\"1F4DD\",\"docomo\":\"E689\",\"au\":\"EA92\",\"softbank\":\"E301\",\"google\":\"FE527\",\"image\":\"1f4dd.png\",\"sheet_x\":15,\"sheet_y\":11,\"short_name\":\"memo\",\"short_names\":[\"memo\",\"pencil\"],\"text\":null},{\"name\":\"TELEPHONE RECEIVER\",\"unified\":\"1F4DE\",\"docomo\":\"E687\",\"au\":\"E51E\",\"softbank\":\"E009\",\"google\":\"FE524\",\"image\":\"1f4de.png\",\"sheet_x\":15,\"sheet_y\":12,\"short_name\":\"telephone_receiver\",\"short_names\":[\"telephone_receiver\"],\"text\":null},{\"name\":\"PAGER\",\"unified\":\"1F4DF\",\"docomo\":\"E65A\",\"au\":\"E59B\",\"softbank\":\"\",\"google\":\"FE522\",\"image\":\"1f4df.png\",\"sheet_x\":15,\"sheet_y\":13,\"short_name\":\"pager\",\"short_names\":[\"pager\"],\"text\":null},{\"name\":\"FAX MACHINE\",\"unified\":\"1F4E0\",\"docomo\":\"E6D0\",\"au\":\"E520\",\"softbank\":\"E00B\",\"google\":\"FE528\",\"image\":\"1f4e0.png\",\"sheet_x\":15,\"sheet_y\":14,\"short_name\":\"fax\",\"short_names\":[\"fax\"],\"text\":null},{\"name\":\"SATELLITE ANTENNA\",\"unified\":\"1F4E1\",\"docomo\":\"\",\"au\":\"E4A8\",\"softbank\":\"E14B\",\"google\":\"FE531\",\"image\":\"1f4e1.png\",\"sheet_x\":15,\"sheet_y\":15,\"short_name\":\"satellite\",\"short_names\":[\"satellite\"],\"text\":null},{\"name\":\"PUBLIC ADDRESS LOUDSPEAKER\",\"unified\":\"1F4E2\",\"docomo\":\"\",\"au\":\"E511\",\"softbank\":\"E142\",\"google\":\"FE52F\",\"image\":\"1f4e2.png\",\"sheet_x\":15,\"sheet_y\":16,\"short_name\":\"loudspeaker\",\"short_names\":[\"loudspeaker\"],\"text\":null},{\"name\":\"CHEERING MEGAPHONE\",\"unified\":\"1F4E3\",\"docomo\":\"\",\"au\":\"E511\",\"softbank\":\"E317\",\"google\":\"FE530\",\"image\":\"1f4e3.png\",\"sheet_x\":15,\"sheet_y\":17,\"short_name\":\"mega\",\"short_names\":[\"mega\"],\"text\":null},{\"name\":\"OUTBOX TRAY\",\"unified\":\"1F4E4\",\"docomo\":\"\",\"au\":\"E592\",\"softbank\":\"\",\"google\":\"FE533\",\"image\":\"1f4e4.png\",\"sheet_x\":15,\"sheet_y\":18,\"short_name\":\"outbox_tray\",\"short_names\":[\"outbox_tray\"],\"text\":null},{\"name\":\"INBOX TRAY\",\"unified\":\"1F4E5\",\"docomo\":\"\",\"au\":\"E593\",\"softbank\":\"\",\"google\":\"FE534\",\"image\":\"1f4e5.png\",\"sheet_x\":15,\"sheet_y\":19,\"short_name\":\"inbox_tray\",\"short_names\":[\"inbox_tray\"],\"text\":null},{\"name\":\"PACKAGE\",\"unified\":\"1F4E6\",\"docomo\":\"E685\",\"au\":\"E51F\",\"softbank\":\"E112\",\"google\":\"FE535\",\"image\":\"1f4e6.png\",\"sheet_x\":15,\"sheet_y\":20,\"short_name\":\"package\",\"short_names\":[\"package\"],\"text\":null},{\"name\":\"E-MAIL SYMBOL\",\"unified\":\"1F4E7\",\"docomo\":\"E6D3\",\"au\":\"EB71\",\"softbank\":\"E103\",\"google\":\"FEB92\",\"image\":\"1f4e7.png\",\"sheet_x\":15,\"sheet_y\":21,\"short_name\":\"e-mail\",\"short_names\":[\"e-mail\"],\"text\":null},{\"name\":\"INCOMING ENVELOPE\",\"unified\":\"1F4E8\",\"docomo\":\"E6CF\",\"au\":\"E591\",\"softbank\":\"E103\",\"google\":\"FE52A\",\"image\":\"1f4e8.png\",\"sheet_x\":15,\"sheet_y\":22,\"short_name\":\"incoming_envelope\",\"short_names\":[\"incoming_envelope\"],\"text\":null},{\"name\":\"ENVELOPE WITH DOWNWARDS ARROW ABOVE\",\"unified\":\"1F4E9\",\"docomo\":\"E6CF\",\"au\":\"EB62\",\"softbank\":\"E103\",\"google\":\"FE52B\",\"image\":\"1f4e9.png\",\"sheet_x\":15,\"sheet_y\":23,\"short_name\":\"envelope_with_arrow\",\"short_names\":[\"envelope_with_arrow\"],\"text\":null},{\"name\":\"CLOSED MAILBOX WITH LOWERED FLAG\",\"unified\":\"1F4EA\",\"docomo\":\"E665\",\"au\":\"E51B\",\"softbank\":\"E101\",\"google\":\"FE52C\",\"image\":\"1f4ea.png\",\"sheet_x\":15,\"sheet_y\":24,\"short_name\":\"mailbox_closed\",\"short_names\":[\"mailbox_closed\"],\"text\":null},{\"name\":\"CLOSED MAILBOX WITH RAISED FLAG\",\"unified\":\"1F4EB\",\"docomo\":\"E665\",\"au\":\"EB0A\",\"softbank\":\"E101\",\"google\":\"FE52D\",\"image\":\"1f4eb.png\",\"sheet_x\":15,\"sheet_y\":25,\"short_name\":\"mailbox\",\"short_names\":[\"mailbox\"],\"text\":null},{\"name\":\"OPEN MAILBOX WITH RAISED FLAG\",\"unified\":\"1F4EC\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f4ec.png\",\"sheet_x\":15,\"sheet_y\":26,\"short_name\":\"mailbox_with_mail\",\"short_names\":[\"mailbox_with_mail\"],\"text\":null},{\"name\":\"OPEN MAILBOX WITH LOWERED FLAG\",\"unified\":\"1F4ED\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f4ed.png\",\"sheet_x\":15,\"sheet_y\":27,\"short_name\":\"mailbox_with_no_mail\",\"short_names\":[\"mailbox_with_no_mail\"],\"text\":null},{\"name\":\"POSTBOX\",\"unified\":\"1F4EE\",\"docomo\":\"E665\",\"au\":\"E51B\",\"softbank\":\"E102\",\"google\":\"FE52E\",\"image\":\"1f4ee.png\",\"sheet_x\":15,\"sheet_y\":28,\"short_name\":\"postbox\",\"short_names\":[\"postbox\"],\"text\":null},{\"name\":\"POSTAL HORN\",\"unified\":\"1F4EF\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f4ef.png\",\"sheet_x\":15,\"sheet_y\":29,\"short_name\":\"postal_horn\",\"short_names\":[\"postal_horn\"],\"text\":null},{\"name\":\"NEWSPAPER\",\"unified\":\"1F4F0\",\"docomo\":\"\",\"au\":\"E58B\",\"softbank\":\"\",\"google\":\"FE822\",\"image\":\"1f4f0.png\",\"sheet_x\":16,\"sheet_y\":0,\"short_name\":\"newspaper\",\"short_names\":[\"newspaper\"],\"text\":null},{\"name\":\"MOBILE PHONE\",\"unified\":\"1F4F1\",\"docomo\":\"E688\",\"au\":\"E588\",\"softbank\":\"E00A\",\"google\":\"FE525\",\"image\":\"1f4f1.png\",\"sheet_x\":16,\"sheet_y\":1,\"short_name\":\"iphone\",\"short_names\":[\"iphone\"],\"text\":null},{\"name\":\"MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT\",\"unified\":\"1F4F2\",\"docomo\":\"E6CE\",\"au\":\"EB08\",\"softbank\":\"E104\",\"google\":\"FE526\",\"image\":\"1f4f2.png\",\"sheet_x\":16,\"sheet_y\":2,\"short_name\":\"calling\",\"short_names\":[\"calling\"],\"text\":null},{\"name\":\"VIBRATION MODE\",\"unified\":\"1F4F3\",\"docomo\":\"\",\"au\":\"EA90\",\"softbank\":\"E250\",\"google\":\"FE839\",\"image\":\"1f4f3.png\",\"sheet_x\":16,\"sheet_y\":3,\"short_name\":\"vibration_mode\",\"short_names\":[\"vibration_mode\"],\"text\":null},{\"name\":\"MOBILE PHONE OFF\",\"unified\":\"1F4F4\",\"docomo\":\"\",\"au\":\"EA91\",\"softbank\":\"E251\",\"google\":\"FE83A\",\"image\":\"1f4f4.png\",\"sheet_x\":16,\"sheet_y\":4,\"short_name\":\"mobile_phone_off\",\"short_names\":[\"mobile_phone_off\"],\"text\":null},{\"name\":\"NO MOBILE PHONES\",\"unified\":\"1F4F5\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f4f5.png\",\"sheet_x\":16,\"sheet_y\":5,\"short_name\":\"no_mobile_phones\",\"short_names\":[\"no_mobile_phones\"],\"text\":null},{\"name\":\"ANTENNA WITH BARS\",\"unified\":\"1F4F6\",\"docomo\":\"\",\"au\":\"EA84\",\"softbank\":\"E20B\",\"google\":\"FE838\",\"image\":\"1f4f6.png\",\"sheet_x\":16,\"sheet_y\":6,\"short_name\":\"signal_strength\",\"short_names\":[\"signal_strength\"],\"text\":null},{\"name\":\"CAMERA\",\"unified\":\"1F4F7\",\"docomo\":\"E681\",\"au\":\"E515\",\"softbank\":\"E008\",\"google\":\"FE4EF\",\"image\":\"1f4f7.png\",\"sheet_x\":16,\"sheet_y\":7,\"short_name\":\"camera\",\"short_names\":[\"camera\"],\"text\":null},{\"name\":\"VIDEO CAMERA\",\"unified\":\"1F4F9\",\"docomo\":\"E677\",\"au\":\"E57E\",\"softbank\":\"E03D\",\"google\":\"FE4F9\",\"image\":\"1f4f9.png\",\"sheet_x\":16,\"sheet_y\":8,\"short_name\":\"video_camera\",\"short_names\":[\"video_camera\"],\"text\":null},{\"name\":\"TELEVISION\",\"unified\":\"1F4FA\",\"docomo\":\"E68A\",\"au\":\"E502\",\"softbank\":\"E12A\",\"google\":\"FE81C\",\"image\":\"1f4fa.png\",\"sheet_x\":16,\"sheet_y\":9,\"short_name\":\"tv\",\"short_names\":[\"tv\"],\"text\":null},{\"name\":\"RADIO\",\"unified\":\"1F4FB\",\"docomo\":\"\",\"au\":\"E5B9\",\"softbank\":\"E128\",\"google\":\"FE81F\",\"image\":\"1f4fb.png\",\"sheet_x\":16,\"sheet_y\":10,\"short_name\":\"radio\",\"short_names\":[\"radio\"],\"text\":null},{\"name\":\"VIDEOCASSETTE\",\"unified\":\"1F4FC\",\"docomo\":\"\",\"au\":\"E580\",\"softbank\":\"E129\",\"google\":\"FE820\",\"image\":\"1f4fc.png\",\"sheet_x\":16,\"sheet_y\":11,\"short_name\":\"vhs\",\"short_names\":[\"vhs\"],\"text\":null},{\"name\":\"TWISTED RIGHTWARDS ARROWS\",\"unified\":\"1F500\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f500.png\",\"sheet_x\":16,\"sheet_y\":12,\"short_name\":\"twisted_rightwards_arrows\",\"short_names\":[\"twisted_rightwards_arrows\"],\"text\":null},{\"name\":\"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS\",\"unified\":\"1F501\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f501.png\",\"sheet_x\":16,\"sheet_y\":13,\"short_name\":\"repeat\",\"short_names\":[\"repeat\"],\"text\":null},{\"name\":\"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY\",\"unified\":\"1F502\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f502.png\",\"sheet_x\":16,\"sheet_y\":14,\"short_name\":\"repeat_one\",\"short_names\":[\"repeat_one\"],\"text\":null},{\"name\":\"CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS\",\"unified\":\"1F503\",\"docomo\":\"E735\",\"au\":\"EB0D\",\"softbank\":\"\",\"google\":\"FEB91\",\"image\":\"1f503.png\",\"sheet_x\":16,\"sheet_y\":15,\"short_name\":\"arrows_clockwise\",\"short_names\":[\"arrows_clockwise\"],\"text\":null},{\"name\":\"ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS\",\"unified\":\"1F504\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f504.png\",\"sheet_x\":16,\"sheet_y\":16,\"short_name\":\"arrows_counterclockwise\",\"short_names\":[\"arrows_counterclockwise\"],\"text\":null},{\"name\":\"LOW BRIGHTNESS SYMBOL\",\"unified\":\"1F505\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f505.png\",\"sheet_x\":16,\"sheet_y\":17,\"short_name\":\"low_brightness\",\"short_names\":[\"low_brightness\"],\"text\":null},{\"name\":\"HIGH BRIGHTNESS SYMBOL\",\"unified\":\"1F506\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f506.png\",\"sheet_x\":16,\"sheet_y\":18,\"short_name\":\"high_brightness\",\"short_names\":[\"high_brightness\"],\"text\":null},{\"name\":\"SPEAKER WITH CANCELLATION STROKE\",\"unified\":\"1F507\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f507.png\",\"sheet_x\":16,\"sheet_y\":19,\"short_name\":\"mute\",\"short_names\":[\"mute\"],\"text\":null},{\"name\":\"SPEAKER WITH ONE SOUND WAVE\",\"unified\":\"1F509\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f509.png\",\"sheet_x\":16,\"sheet_y\":20,\"short_name\":\"sound\",\"short_names\":[\"sound\"],\"text\":null},{\"name\":\"SPEAKER WITH THREE SOUND WAVES\",\"unified\":\"1F50A\",\"docomo\":\"\",\"au\":\"E511\",\"softbank\":\"E141\",\"google\":\"FE821\",\"image\":\"1f50a.png\",\"sheet_x\":16,\"sheet_y\":21,\"short_name\":\"speaker\",\"short_names\":[\"speaker\"],\"text\":null},{\"name\":\"BATTERY\",\"unified\":\"1F50B\",\"docomo\":\"\",\"au\":\"E584\",\"softbank\":\"\",\"google\":\"FE4FC\",\"image\":\"1f50b.png\",\"sheet_x\":16,\"sheet_y\":22,\"short_name\":\"battery\",\"short_names\":[\"battery\"],\"text\":null},{\"name\":\"ELECTRIC PLUG\",\"unified\":\"1F50C\",\"docomo\":\"\",\"au\":\"E589\",\"softbank\":\"\",\"google\":\"FE4FE\",\"image\":\"1f50c.png\",\"sheet_x\":16,\"sheet_y\":23,\"short_name\":\"electric_plug\",\"short_names\":[\"electric_plug\"],\"text\":null},{\"name\":\"LEFT-POINTING MAGNIFYING GLASS\",\"unified\":\"1F50D\",\"docomo\":\"E6DC\",\"au\":\"E518\",\"softbank\":\"E114\",\"google\":\"FEB85\",\"image\":\"1f50d.png\",\"sheet_x\":16,\"sheet_y\":24,\"short_name\":\"mag\",\"short_names\":[\"mag\"],\"text\":null},{\"name\":\"RIGHT-POINTING MAGNIFYING GLASS\",\"unified\":\"1F50E\",\"docomo\":\"E6DC\",\"au\":\"EB05\",\"softbank\":\"E114\",\"google\":\"FEB8D\",\"image\":\"1f50e.png\",\"sheet_x\":16,\"sheet_y\":25,\"short_name\":\"mag_right\",\"short_names\":[\"mag_right\"],\"text\":null},{\"name\":\"LOCK WITH INK PEN\",\"unified\":\"1F50F\",\"docomo\":\"E6D9\",\"au\":\"EB0C\",\"softbank\":\"E144\",\"google\":\"FEB90\",\"image\":\"1f50f.png\",\"sheet_x\":16,\"sheet_y\":26,\"short_name\":\"lock_with_ink_pen\",\"short_names\":[\"lock_with_ink_pen\"],\"text\":null},{\"name\":\"CLOSED LOCK WITH KEY\",\"unified\":\"1F510\",\"docomo\":\"E6D9\",\"au\":\"EAFC\",\"softbank\":\"E144\",\"google\":\"FEB8A\",\"image\":\"1f510.png\",\"sheet_x\":16,\"sheet_y\":27,\"short_name\":\"closed_lock_with_key\",\"short_names\":[\"closed_lock_with_key\"],\"text\":null},{\"name\":\"KEY\",\"unified\":\"1F511\",\"docomo\":\"E6D9\",\"au\":\"E519\",\"softbank\":\"E03F\",\"google\":\"FEB82\",\"image\":\"1f511.png\",\"sheet_x\":16,\"sheet_y\":28,\"short_name\":\"key\",\"short_names\":[\"key\"],\"text\":null},{\"name\":\"LOCK\",\"unified\":\"1F512\",\"docomo\":\"E6D9\",\"au\":\"E51C\",\"softbank\":\"E144\",\"google\":\"FEB86\",\"image\":\"1f512.png\",\"sheet_x\":16,\"sheet_y\":29,\"short_name\":\"lock\",\"short_names\":[\"lock\"],\"text\":null},{\"name\":\"OPEN LOCK\",\"unified\":\"1F513\",\"docomo\":\"E6D9\",\"au\":\"E51C\",\"softbank\":\"E145\",\"google\":\"FEB87\",\"image\":\"1f513.png\",\"sheet_x\":17,\"sheet_y\":0,\"short_name\":\"unlock\",\"short_names\":[\"unlock\"],\"text\":null},{\"name\":\"BELL\",\"unified\":\"1F514\",\"docomo\":\"E713\",\"au\":\"E512\",\"softbank\":\"E325\",\"google\":\"FE4F2\",\"image\":\"1f514.png\",\"sheet_x\":17,\"sheet_y\":1,\"short_name\":\"bell\",\"short_names\":[\"bell\"],\"text\":null},{\"name\":\"BELL WITH CANCELLATION STROKE\",\"unified\":\"1F515\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f515.png\",\"sheet_x\":17,\"sheet_y\":2,\"short_name\":\"no_bell\",\"short_names\":[\"no_bell\"],\"text\":null},{\"name\":\"BOOKMARK\",\"unified\":\"1F516\",\"docomo\":\"\",\"au\":\"EB07\",\"softbank\":\"\",\"google\":\"FEB8F\",\"image\":\"1f516.png\",\"sheet_x\":17,\"sheet_y\":3,\"short_name\":\"bookmark\",\"short_names\":[\"bookmark\"],\"text\":null},{\"name\":\"LINK SYMBOL\",\"unified\":\"1F517\",\"docomo\":\"\",\"au\":\"E58A\",\"softbank\":\"\",\"google\":\"FEB4B\",\"image\":\"1f517.png\",\"sheet_x\":17,\"sheet_y\":4,\"short_name\":\"link\",\"short_names\":[\"link\"],\"text\":null},{\"name\":\"RADIO BUTTON\",\"unified\":\"1F518\",\"docomo\":\"\",\"au\":\"EB04\",\"softbank\":\"\",\"google\":\"FEB8C\",\"image\":\"1f518.png\",\"sheet_x\":17,\"sheet_y\":5,\"short_name\":\"radio_button\",\"short_names\":[\"radio_button\"],\"text\":null},{\"name\":\"BACK WITH LEFTWARDS ARROW ABOVE\",\"unified\":\"1F519\",\"docomo\":\"\",\"au\":\"EB06\",\"softbank\":\"E235\",\"google\":\"FEB8E\",\"image\":\"1f519.png\",\"sheet_x\":17,\"sheet_y\":6,\"short_name\":\"back\",\"short_names\":[\"back\"],\"text\":null},{\"name\":\"END WITH LEFTWARDS ARROW ABOVE\",\"unified\":\"1F51A\",\"docomo\":\"E6B9\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE01A\",\"image\":\"1f51a.png\",\"sheet_x\":17,\"sheet_y\":7,\"short_name\":\"end\",\"short_names\":[\"end\"],\"text\":null},{\"name\":\"ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE\",\"unified\":\"1F51B\",\"docomo\":\"E6B8\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE019\",\"image\":\"1f51b.png\",\"sheet_x\":17,\"sheet_y\":8,\"short_name\":\"on\",\"short_names\":[\"on\"],\"text\":null},{\"name\":\"SOON WITH RIGHTWARDS ARROW ABOVE\",\"unified\":\"1F51C\",\"docomo\":\"E6B7\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE018\",\"image\":\"1f51c.png\",\"sheet_x\":17,\"sheet_y\":9,\"short_name\":\"soon\",\"short_names\":[\"soon\"],\"text\":null},{\"name\":\"TOP WITH UPWARDS ARROW ABOVE\",\"unified\":\"1F51D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E24C\",\"google\":\"FEB42\",\"image\":\"1f51d.png\",\"sheet_x\":17,\"sheet_y\":10,\"short_name\":\"top\",\"short_names\":[\"top\"],\"text\":null},{\"name\":\"NO ONE UNDER EIGHTEEN SYMBOL\",\"unified\":\"1F51E\",\"docomo\":\"\",\"au\":\"EA83\",\"softbank\":\"E207\",\"google\":\"FEB25\",\"image\":\"1f51e.png\",\"sheet_x\":17,\"sheet_y\":11,\"short_name\":\"underage\",\"short_names\":[\"underage\"],\"text\":null},{\"name\":\"KEYCAP TEN\",\"unified\":\"1F51F\",\"docomo\":\"\",\"au\":\"E52B\",\"softbank\":\"\",\"google\":\"FE83B\",\"image\":\"1f51f.png\",\"sheet_x\":17,\"sheet_y\":12,\"short_name\":\"keycap_ten\",\"short_names\":[\"keycap_ten\"],\"text\":null},{\"name\":\"INPUT SYMBOL FOR LATIN CAPITAL LETTERS\",\"unified\":\"1F520\",\"docomo\":\"\",\"au\":\"EAFD\",\"softbank\":\"\",\"google\":\"FEB7C\",\"image\":\"1f520.png\",\"sheet_x\":17,\"sheet_y\":13,\"short_name\":\"capital_abcd\",\"short_names\":[\"capital_abcd\"],\"text\":null},{\"name\":\"INPUT SYMBOL FOR LATIN SMALL LETTERS\",\"unified\":\"1F521\",\"docomo\":\"\",\"au\":\"EAFE\",\"softbank\":\"\",\"google\":\"FEB7D\",\"image\":\"1f521.png\",\"sheet_x\":17,\"sheet_y\":14,\"short_name\":\"abcd\",\"short_names\":[\"abcd\"],\"text\":null},{\"name\":\"INPUT SYMBOL FOR NUMBERS\",\"unified\":\"1F522\",\"docomo\":\"\",\"au\":\"EAFF\",\"softbank\":\"\",\"google\":\"FEB7E\",\"image\":\"1f522.png\",\"sheet_x\":17,\"sheet_y\":15,\"short_name\":\"1234\",\"short_names\":[\"1234\"],\"text\":null},{\"name\":\"INPUT SYMBOL FOR SYMBOLS\",\"unified\":\"1F523\",\"docomo\":\"\",\"au\":\"EB00\",\"softbank\":\"\",\"google\":\"FEB7F\",\"image\":\"1f523.png\",\"sheet_x\":17,\"sheet_y\":16,\"short_name\":\"symbols\",\"short_names\":[\"symbols\"],\"text\":null},{\"name\":\"INPUT SYMBOL FOR LATIN LETTERS\",\"unified\":\"1F524\",\"docomo\":\"\",\"au\":\"EB55\",\"softbank\":\"\",\"google\":\"FEB80\",\"image\":\"1f524.png\",\"sheet_x\":17,\"sheet_y\":17,\"short_name\":\"abc\",\"short_names\":[\"abc\"],\"text\":null},{\"name\":\"FIRE\",\"unified\":\"1F525\",\"docomo\":\"\",\"au\":\"E47B\",\"softbank\":\"E11D\",\"google\":\"FE4F6\",\"image\":\"1f525.png\",\"sheet_x\":17,\"sheet_y\":18,\"short_name\":\"fire\",\"short_names\":[\"fire\"],\"text\":null},{\"name\":\"ELECTRIC TORCH\",\"unified\":\"1F526\",\"docomo\":\"E6FB\",\"au\":\"E583\",\"softbank\":\"\",\"google\":\"FE4FB\",\"image\":\"1f526.png\",\"sheet_x\":17,\"sheet_y\":19,\"short_name\":\"flashlight\",\"short_names\":[\"flashlight\"],\"text\":null},{\"name\":\"WRENCH\",\"unified\":\"1F527\",\"docomo\":\"E718\",\"au\":\"E587\",\"softbank\":\"\",\"google\":\"FE4C9\",\"image\":\"1f527.png\",\"sheet_x\":17,\"sheet_y\":20,\"short_name\":\"wrench\",\"short_names\":[\"wrench\"],\"text\":null},{\"name\":\"HAMMER\",\"unified\":\"1F528\",\"docomo\":\"\",\"au\":\"E5CB\",\"softbank\":\"E116\",\"google\":\"FE4CA\",\"image\":\"1f528.png\",\"sheet_x\":17,\"sheet_y\":21,\"short_name\":\"hammer\",\"short_names\":[\"hammer\"],\"text\":null},{\"name\":\"NUT AND BOLT\",\"unified\":\"1F529\",\"docomo\":\"\",\"au\":\"E581\",\"softbank\":\"\",\"google\":\"FE4CB\",\"image\":\"1f529.png\",\"sheet_x\":17,\"sheet_y\":22,\"short_name\":\"nut_and_bolt\",\"short_names\":[\"nut_and_bolt\"],\"text\":null},{\"name\":\"HOCHO\",\"unified\":\"1F52A\",\"docomo\":\"\",\"au\":\"E57F\",\"softbank\":\"\",\"google\":\"FE4FA\",\"image\":\"1f52a.png\",\"sheet_x\":17,\"sheet_y\":23,\"short_name\":\"hocho\",\"short_names\":[\"hocho\"],\"text\":null},{\"name\":\"PISTOL\",\"unified\":\"1F52B\",\"docomo\":\"\",\"au\":\"E50A\",\"softbank\":\"E113\",\"google\":\"FE4F5\",\"image\":\"1f52b.png\",\"sheet_x\":17,\"sheet_y\":24,\"short_name\":\"gun\",\"short_names\":[\"gun\"],\"text\":null},{\"name\":\"MICROSCOPE\",\"unified\":\"1F52C\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f52c.png\",\"sheet_x\":17,\"sheet_y\":25,\"short_name\":\"microscope\",\"short_names\":[\"microscope\"],\"text\":null},{\"name\":\"TELESCOPE\",\"unified\":\"1F52D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f52d.png\",\"sheet_x\":17,\"sheet_y\":26,\"short_name\":\"telescope\",\"short_names\":[\"telescope\"],\"text\":null},{\"name\":\"CRYSTAL BALL\",\"unified\":\"1F52E\",\"docomo\":\"\",\"au\":\"EA8F\",\"softbank\":\"E23E\",\"google\":\"FE4F7\",\"image\":\"1f52e.png\",\"sheet_x\":17,\"sheet_y\":27,\"short_name\":\"crystal_ball\",\"short_names\":[\"crystal_ball\"],\"text\":null},{\"name\":\"SIX POINTED STAR WITH MIDDLE DOT\",\"unified\":\"1F52F\",\"docomo\":\"\",\"au\":\"EA8F\",\"softbank\":\"E23E\",\"google\":\"FE4F8\",\"image\":\"1f52f.png\",\"sheet_x\":17,\"sheet_y\":28,\"short_name\":\"six_pointed_star\",\"short_names\":[\"six_pointed_star\"],\"text\":null},{\"name\":\"JAPANESE SYMBOL FOR BEGINNER\",\"unified\":\"1F530\",\"docomo\":\"\",\"au\":\"E480\",\"softbank\":\"E209\",\"google\":\"FE044\",\"image\":\"1f530.png\",\"sheet_x\":17,\"sheet_y\":29,\"short_name\":\"beginner\",\"short_names\":[\"beginner\"],\"text\":null},{\"name\":\"TRIDENT EMBLEM\",\"unified\":\"1F531\",\"docomo\":\"E71A\",\"au\":\"E5C9\",\"softbank\":\"E031\",\"google\":\"FE4D2\",\"image\":\"1f531.png\",\"sheet_x\":18,\"sheet_y\":0,\"short_name\":\"trident\",\"short_names\":[\"trident\"],\"text\":null},{\"name\":\"BLACK SQUARE BUTTON\",\"unified\":\"1F532\",\"docomo\":\"E69C\",\"au\":\"E54B\",\"softbank\":\"E21A\",\"google\":\"FEB64\",\"image\":\"1f532.png\",\"sheet_x\":18,\"sheet_y\":1,\"short_name\":\"black_square_button\",\"short_names\":[\"black_square_button\"],\"text\":null},{\"name\":\"WHITE SQUARE BUTTON\",\"unified\":\"1F533\",\"docomo\":\"E69C\",\"au\":\"E54B\",\"softbank\":\"E21B\",\"google\":\"FEB67\",\"image\":\"1f533.png\",\"sheet_x\":18,\"sheet_y\":2,\"short_name\":\"white_square_button\",\"short_names\":[\"white_square_button\"],\"text\":null},{\"name\":\"LARGE RED CIRCLE\",\"unified\":\"1F534\",\"docomo\":\"E69C\",\"au\":\"E54A\",\"softbank\":\"E219\",\"google\":\"FEB63\",\"image\":\"1f534.png\",\"sheet_x\":18,\"sheet_y\":3,\"short_name\":\"red_circle\",\"short_names\":[\"red_circle\"],\"text\":null},{\"name\":\"LARGE BLUE CIRCLE\",\"unified\":\"1F535\",\"docomo\":\"E69C\",\"au\":\"E54B\",\"softbank\":\"E21A\",\"google\":\"FEB64\",\"image\":\"1f535.png\",\"sheet_x\":18,\"sheet_y\":4,\"short_name\":\"large_blue_circle\",\"short_names\":[\"large_blue_circle\"],\"text\":null},{\"name\":\"LARGE ORANGE DIAMOND\",\"unified\":\"1F536\",\"docomo\":\"\",\"au\":\"E546\",\"softbank\":\"E21B\",\"google\":\"FEB73\",\"image\":\"1f536.png\",\"sheet_x\":18,\"sheet_y\":5,\"short_name\":\"large_orange_diamond\",\"short_names\":[\"large_orange_diamond\"],\"text\":null},{\"name\":\"LARGE BLUE DIAMOND\",\"unified\":\"1F537\",\"docomo\":\"\",\"au\":\"E547\",\"softbank\":\"E21B\",\"google\":\"FEB74\",\"image\":\"1f537.png\",\"sheet_x\":18,\"sheet_y\":6,\"short_name\":\"large_blue_diamond\",\"short_names\":[\"large_blue_diamond\"],\"text\":null},{\"name\":\"SMALL ORANGE DIAMOND\",\"unified\":\"1F538\",\"docomo\":\"\",\"au\":\"E536\",\"softbank\":\"E21B\",\"google\":\"FEB75\",\"image\":\"1f538.png\",\"sheet_x\":18,\"sheet_y\":7,\"short_name\":\"small_orange_diamond\",\"short_names\":[\"small_orange_diamond\"],\"text\":null},{\"name\":\"SMALL BLUE DIAMOND\",\"unified\":\"1F539\",\"docomo\":\"\",\"au\":\"E537\",\"softbank\":\"E21B\",\"google\":\"FEB76\",\"image\":\"1f539.png\",\"sheet_x\":18,\"sheet_y\":8,\"short_name\":\"small_blue_diamond\",\"short_names\":[\"small_blue_diamond\"],\"text\":null},{\"name\":\"UP-POINTING RED TRIANGLE\",\"unified\":\"1F53A\",\"docomo\":\"\",\"au\":\"E55A\",\"softbank\":\"\",\"google\":\"FEB78\",\"image\":\"1f53a.png\",\"sheet_x\":18,\"sheet_y\":9,\"short_name\":\"small_red_triangle\",\"short_names\":[\"small_red_triangle\"],\"text\":null},{\"name\":\"DOWN-POINTING RED TRIANGLE\",\"unified\":\"1F53B\",\"docomo\":\"\",\"au\":\"E55B\",\"softbank\":\"\",\"google\":\"FEB79\",\"image\":\"1f53b.png\",\"sheet_x\":18,\"sheet_y\":10,\"short_name\":\"small_red_triangle_down\",\"short_names\":[\"small_red_triangle_down\"],\"text\":null},{\"name\":\"UP-POINTING SMALL RED TRIANGLE\",\"unified\":\"1F53C\",\"docomo\":\"\",\"au\":\"E543\",\"softbank\":\"\",\"google\":\"FEB01\",\"image\":\"1f53c.png\",\"sheet_x\":18,\"sheet_y\":11,\"short_name\":\"arrow_up_small\",\"short_names\":[\"arrow_up_small\"],\"text\":null},{\"name\":\"DOWN-POINTING SMALL RED TRIANGLE\",\"unified\":\"1F53D\",\"docomo\":\"\",\"au\":\"E542\",\"softbank\":\"\",\"google\":\"FEB00\",\"image\":\"1f53d.png\",\"sheet_x\":18,\"sheet_y\":12,\"short_name\":\"arrow_down_small\",\"short_names\":[\"arrow_down_small\"],\"text\":null},{\"name\":\"CLOCK FACE ONE OCLOCK\",\"unified\":\"1F550\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E024\",\"google\":\"FE01E\",\"image\":\"1f550.png\",\"sheet_x\":18,\"sheet_y\":13,\"short_name\":\"clock1\",\"short_names\":[\"clock1\"],\"text\":null},{\"name\":\"CLOCK FACE TWO OCLOCK\",\"unified\":\"1F551\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E025\",\"google\":\"FE01F\",\"image\":\"1f551.png\",\"sheet_x\":18,\"sheet_y\":14,\"short_name\":\"clock2\",\"short_names\":[\"clock2\"],\"text\":null},{\"name\":\"CLOCK FACE THREE OCLOCK\",\"unified\":\"1F552\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E026\",\"google\":\"FE020\",\"image\":\"1f552.png\",\"sheet_x\":18,\"sheet_y\":15,\"short_name\":\"clock3\",\"short_names\":[\"clock3\"],\"text\":null},{\"name\":\"CLOCK FACE FOUR OCLOCK\",\"unified\":\"1F553\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E027\",\"google\":\"FE021\",\"image\":\"1f553.png\",\"sheet_x\":18,\"sheet_y\":16,\"short_name\":\"clock4\",\"short_names\":[\"clock4\"],\"text\":null},{\"name\":\"CLOCK FACE FIVE OCLOCK\",\"unified\":\"1F554\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E028\",\"google\":\"FE022\",\"image\":\"1f554.png\",\"sheet_x\":18,\"sheet_y\":17,\"short_name\":\"clock5\",\"short_names\":[\"clock5\"],\"text\":null},{\"name\":\"CLOCK FACE SIX OCLOCK\",\"unified\":\"1F555\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E029\",\"google\":\"FE023\",\"image\":\"1f555.png\",\"sheet_x\":18,\"sheet_y\":18,\"short_name\":\"clock6\",\"short_names\":[\"clock6\"],\"text\":null},{\"name\":\"CLOCK FACE SEVEN OCLOCK\",\"unified\":\"1F556\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E02A\",\"google\":\"FE024\",\"image\":\"1f556.png\",\"sheet_x\":18,\"sheet_y\":19,\"short_name\":\"clock7\",\"short_names\":[\"clock7\"],\"text\":null},{\"name\":\"CLOCK FACE EIGHT OCLOCK\",\"unified\":\"1F557\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E02B\",\"google\":\"FE025\",\"image\":\"1f557.png\",\"sheet_x\":18,\"sheet_y\":20,\"short_name\":\"clock8\",\"short_names\":[\"clock8\"],\"text\":null},{\"name\":\"CLOCK FACE NINE OCLOCK\",\"unified\":\"1F558\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E02C\",\"google\":\"FE026\",\"image\":\"1f558.png\",\"sheet_x\":18,\"sheet_y\":21,\"short_name\":\"clock9\",\"short_names\":[\"clock9\"],\"text\":null},{\"name\":\"CLOCK FACE TEN OCLOCK\",\"unified\":\"1F559\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E02D\",\"google\":\"FE027\",\"image\":\"1f559.png\",\"sheet_x\":18,\"sheet_y\":22,\"short_name\":\"clock10\",\"short_names\":[\"clock10\"],\"text\":null},{\"name\":\"CLOCK FACE ELEVEN OCLOCK\",\"unified\":\"1F55A\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E02E\",\"google\":\"FE028\",\"image\":\"1f55a.png\",\"sheet_x\":18,\"sheet_y\":23,\"short_name\":\"clock11\",\"short_names\":[\"clock11\"],\"text\":null},{\"name\":\"CLOCK FACE TWELVE OCLOCK\",\"unified\":\"1F55B\",\"docomo\":\"E6BA\",\"au\":\"E594\",\"softbank\":\"E02F\",\"google\":\"FE029\",\"image\":\"1f55b.png\",\"sheet_x\":18,\"sheet_y\":24,\"short_name\":\"clock12\",\"short_names\":[\"clock12\"],\"text\":null},{\"name\":\"CLOCK FACE ONE-THIRTY\",\"unified\":\"1F55C\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f55c.png\",\"sheet_x\":18,\"sheet_y\":25,\"short_name\":\"clock130\",\"short_names\":[\"clock130\"],\"text\":null},{\"name\":\"CLOCK FACE TWO-THIRTY\",\"unified\":\"1F55D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f55d.png\",\"sheet_x\":18,\"sheet_y\":26,\"short_name\":\"clock230\",\"short_names\":[\"clock230\"],\"text\":null},{\"name\":\"CLOCK FACE THREE-THIRTY\",\"unified\":\"1F55E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f55e.png\",\"sheet_x\":18,\"sheet_y\":27,\"short_name\":\"clock330\",\"short_names\":[\"clock330\"],\"text\":null},{\"name\":\"CLOCK FACE FOUR-THIRTY\",\"unified\":\"1F55F\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f55f.png\",\"sheet_x\":18,\"sheet_y\":28,\"short_name\":\"clock430\",\"short_names\":[\"clock430\"],\"text\":null},{\"name\":\"CLOCK FACE FIVE-THIRTY\",\"unified\":\"1F560\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f560.png\",\"sheet_x\":18,\"sheet_y\":29,\"short_name\":\"clock530\",\"short_names\":[\"clock530\"],\"text\":null},{\"name\":\"CLOCK FACE SIX-THIRTY\",\"unified\":\"1F561\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f561.png\",\"sheet_x\":19,\"sheet_y\":0,\"short_name\":\"clock630\",\"short_names\":[\"clock630\"],\"text\":null},{\"name\":\"CLOCK FACE SEVEN-THIRTY\",\"unified\":\"1F562\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f562.png\",\"sheet_x\":19,\"sheet_y\":1,\"short_name\":\"clock730\",\"short_names\":[\"clock730\"],\"text\":null},{\"name\":\"CLOCK FACE EIGHT-THIRTY\",\"unified\":\"1F563\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f563.png\",\"sheet_x\":19,\"sheet_y\":2,\"short_name\":\"clock830\",\"short_names\":[\"clock830\"],\"text\":null},{\"name\":\"CLOCK FACE NINE-THIRTY\",\"unified\":\"1F564\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f564.png\",\"sheet_x\":19,\"sheet_y\":3,\"short_name\":\"clock930\",\"short_names\":[\"clock930\"],\"text\":null},{\"name\":\"CLOCK FACE TEN-THIRTY\",\"unified\":\"1F565\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f565.png\",\"sheet_x\":19,\"sheet_y\":4,\"short_name\":\"clock1030\",\"short_names\":[\"clock1030\"],\"text\":null},{\"name\":\"CLOCK FACE ELEVEN-THIRTY\",\"unified\":\"1F566\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f566.png\",\"sheet_x\":19,\"sheet_y\":5,\"short_name\":\"clock1130\",\"short_names\":[\"clock1130\"],\"text\":null},{\"name\":\"CLOCK FACE TWELVE-THIRTY\",\"unified\":\"1F567\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f567.png\",\"sheet_x\":19,\"sheet_y\":6,\"short_name\":\"clock1230\",\"short_names\":[\"clock1230\"],\"text\":null},{\"name\":\"MOUNT FUJI\",\"unified\":\"1F5FB\",\"docomo\":\"E740\",\"au\":\"E5BD\",\"softbank\":\"E03B\",\"google\":\"FE4C3\",\"image\":\"1f5fb.png\",\"sheet_x\":19,\"sheet_y\":7,\"short_name\":\"mount_fuji\",\"short_names\":[\"mount_fuji\"],\"text\":null},{\"name\":\"TOKYO TOWER\",\"unified\":\"1F5FC\",\"docomo\":\"\",\"au\":\"E4C0\",\"softbank\":\"E509\",\"google\":\"FE4C4\",\"image\":\"1f5fc.png\",\"sheet_x\":19,\"sheet_y\":8,\"short_name\":\"tokyo_tower\",\"short_names\":[\"tokyo_tower\"],\"text\":null},{\"name\":\"STATUE OF LIBERTY\",\"unified\":\"1F5FD\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E51D\",\"google\":\"FE4C6\",\"image\":\"1f5fd.png\",\"sheet_x\":19,\"sheet_y\":9,\"short_name\":\"statue_of_liberty\",\"short_names\":[\"statue_of_liberty\"],\"text\":null},{\"name\":\"SILHOUETTE OF JAPAN\",\"unified\":\"1F5FE\",\"docomo\":\"\",\"au\":\"E572\",\"softbank\":\"\",\"google\":\"FE4C7\",\"image\":\"1f5fe.png\",\"sheet_x\":19,\"sheet_y\":10,\"short_name\":\"japan\",\"short_names\":[\"japan\"],\"text\":null},{\"name\":\"MOYAI\",\"unified\":\"1F5FF\",\"docomo\":\"\",\"au\":\"EB6C\",\"softbank\":\"\",\"google\":\"FE4C8\",\"image\":\"1f5ff.png\",\"sheet_x\":19,\"sheet_y\":11,\"short_name\":\"moyai\",\"short_names\":[\"moyai\"],\"text\":null},{\"name\":\"GRINNING FACE\",\"unified\":\"1F600\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f600.png\",\"sheet_x\":19,\"sheet_y\":12,\"short_name\":\"grinning\",\"short_names\":[\"grinning\"],\"text\":null},{\"name\":\"GRINNING FACE WITH SMILING EYES\",\"unified\":\"1F601\",\"docomo\":\"E753\",\"au\":\"EB80\",\"softbank\":\"E404\",\"google\":\"FE333\",\"image\":\"1f601.png\",\"sheet_x\":19,\"sheet_y\":13,\"short_name\":\"grin\",\"short_names\":[\"grin\"],\"text\":null},{\"name\":\"FACE WITH TEARS OF JOY\",\"unified\":\"1F602\",\"docomo\":\"E72A\",\"au\":\"EB64\",\"softbank\":\"E412\",\"google\":\"FE334\",\"image\":\"1f602.png\",\"sheet_x\":19,\"sheet_y\":14,\"short_name\":\"joy\",\"short_names\":[\"joy\"],\"text\":null},{\"name\":\"SMILING FACE WITH OPEN MOUTH\",\"unified\":\"1F603\",\"docomo\":\"E6F0\",\"au\":\"E471\",\"softbank\":\"E057\",\"google\":\"FE330\",\"image\":\"1f603.png\",\"sheet_x\":19,\"sheet_y\":15,\"short_name\":\"smiley\",\"short_names\":[\"smiley\"],\"text\":\":)\"},{\"name\":\"SMILING FACE WITH OPEN MOUTH AND SMILING EYES\",\"unified\":\"1F604\",\"docomo\":\"E6F0\",\"au\":\"E471\",\"softbank\":\"E415\",\"google\":\"FE338\",\"image\":\"1f604.png\",\"sheet_x\":19,\"sheet_y\":16,\"short_name\":\"smile\",\"short_names\":[\"smile\"],\"text\":\":)\"},{\"name\":\"SMILING FACE WITH OPEN MOUTH AND COLD SWEAT\",\"unified\":\"1F605\",\"docomo\":\"E722\",\"au\":\"E471-E5B1\",\"softbank\":\"E415-E331\",\"google\":\"FE331\",\"image\":\"1f605.png\",\"sheet_x\":19,\"sheet_y\":17,\"short_name\":\"sweat_smile\",\"short_names\":[\"sweat_smile\"],\"text\":null},{\"name\":\"SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES\",\"unified\":\"1F606\",\"docomo\":\"E72A\",\"au\":\"EAC5\",\"softbank\":\"E40A\",\"google\":\"FE332\",\"image\":\"1f606.png\",\"sheet_x\":19,\"sheet_y\":18,\"short_name\":\"laughing\",\"short_names\":[\"laughing\",\"satisfied\"],\"text\":null},{\"name\":\"SMILING FACE WITH HALO\",\"unified\":\"1F607\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f607.png\",\"sheet_x\":19,\"sheet_y\":19,\"short_name\":\"innocent\",\"short_names\":[\"innocent\"],\"text\":null},{\"name\":\"SMILING FACE WITH HORNS\",\"unified\":\"1F608\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f608.png\",\"sheet_x\":19,\"sheet_y\":20,\"short_name\":\"smiling_imp\",\"short_names\":[\"smiling_imp\"],\"text\":null},{\"name\":\"WINKING FACE\",\"unified\":\"1F609\",\"docomo\":\"E729\",\"au\":\"E5C3\",\"softbank\":\"E405\",\"google\":\"FE347\",\"image\":\"1f609.png\",\"sheet_x\":19,\"sheet_y\":21,\"short_name\":\"wink\",\"short_names\":[\"wink\"],\"text\":\";)\"},{\"name\":\"SMILING FACE WITH SMILING EYES\",\"unified\":\"1F60A\",\"docomo\":\"E6F0\",\"au\":\"EACD\",\"softbank\":\"E056\",\"google\":\"FE335\",\"image\":\"1f60a.png\",\"sheet_x\":19,\"sheet_y\":22,\"short_name\":\"blush\",\"short_names\":[\"blush\"],\"text\":null},{\"name\":\"FACE SAVOURING DELICIOUS FOOD\",\"unified\":\"1F60B\",\"docomo\":\"E752\",\"au\":\"EACD\",\"softbank\":\"E056\",\"google\":\"FE32B\",\"image\":\"1f60b.png\",\"sheet_x\":19,\"sheet_y\":23,\"short_name\":\"yum\",\"short_names\":[\"yum\"],\"text\":null},{\"name\":\"RELIEVED FACE\",\"unified\":\"1F60C\",\"docomo\":\"E721\",\"au\":\"EAC5\",\"softbank\":\"E40A\",\"google\":\"FE33E\",\"image\":\"1f60c.png\",\"sheet_x\":19,\"sheet_y\":24,\"short_name\":\"relieved\",\"short_names\":[\"relieved\"],\"text\":null},{\"name\":\"SMILING FACE WITH HEART-SHAPED EYES\",\"unified\":\"1F60D\",\"docomo\":\"E726\",\"au\":\"E5C4\",\"softbank\":\"E106\",\"google\":\"FE327\",\"image\":\"1f60d.png\",\"sheet_x\":19,\"sheet_y\":25,\"short_name\":\"heart_eyes\",\"short_names\":[\"heart_eyes\"],\"text\":null},{\"name\":\"SMILING FACE WITH SUNGLASSES\",\"unified\":\"1F60E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f60e.png\",\"sheet_x\":19,\"sheet_y\":26,\"short_name\":\"sunglasses\",\"short_names\":[\"sunglasses\"],\"text\":null},{\"name\":\"SMIRKING FACE\",\"unified\":\"1F60F\",\"docomo\":\"E72C\",\"au\":\"EABF\",\"softbank\":\"E402\",\"google\":\"FE343\",\"image\":\"1f60f.png\",\"sheet_x\":19,\"sheet_y\":27,\"short_name\":\"smirk\",\"short_names\":[\"smirk\"],\"text\":null},{\"name\":\"NEUTRAL FACE\",\"unified\":\"1F610\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f610.png\",\"sheet_x\":19,\"sheet_y\":28,\"short_name\":\"neutral_face\",\"short_names\":[\"neutral_face\"],\"text\":null},{\"name\":\"EXPRESSIONLESS FACE\",\"unified\":\"1F611\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f611.png\",\"sheet_x\":19,\"sheet_y\":29,\"short_name\":\"expressionless\",\"short_names\":[\"expressionless\"],\"text\":null},{\"name\":\"UNAMUSED FACE\",\"unified\":\"1F612\",\"docomo\":\"E725\",\"au\":\"EAC9\",\"softbank\":\"E40E\",\"google\":\"FE326\",\"image\":\"1f612.png\",\"sheet_x\":20,\"sheet_y\":0,\"short_name\":\"unamused\",\"short_names\":[\"unamused\"],\"text\":null},{\"name\":\"FACE WITH COLD SWEAT\",\"unified\":\"1F613\",\"docomo\":\"E723\",\"au\":\"E5C6\",\"softbank\":\"E108\",\"google\":\"FE344\",\"image\":\"1f613.png\",\"sheet_x\":20,\"sheet_y\":1,\"short_name\":\"sweat\",\"short_names\":[\"sweat\"],\"text\":null},{\"name\":\"PENSIVE FACE\",\"unified\":\"1F614\",\"docomo\":\"E720\",\"au\":\"EAC0\",\"softbank\":\"E403\",\"google\":\"FE340\",\"image\":\"1f614.png\",\"sheet_x\":20,\"sheet_y\":2,\"short_name\":\"pensive\",\"short_names\":[\"pensive\"],\"text\":null},{\"name\":\"CONFUSED FACE\",\"unified\":\"1F615\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f615.png\",\"sheet_x\":20,\"sheet_y\":3,\"short_name\":\"confused\",\"short_names\":[\"confused\"],\"text\":null},{\"name\":\"CONFOUNDED FACE\",\"unified\":\"1F616\",\"docomo\":\"E6F3\",\"au\":\"EAC3\",\"softbank\":\"E407\",\"google\":\"FE33F\",\"image\":\"1f616.png\",\"sheet_x\":20,\"sheet_y\":4,\"short_name\":\"confounded\",\"short_names\":[\"confounded\"],\"text\":null},{\"name\":\"KISSING FACE\",\"unified\":\"1F617\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f617.png\",\"sheet_x\":20,\"sheet_y\":5,\"short_name\":\"kissing\",\"short_names\":[\"kissing\"],\"text\":null},{\"name\":\"FACE THROWING A KISS\",\"unified\":\"1F618\",\"docomo\":\"E726\",\"au\":\"EACF\",\"softbank\":\"E418\",\"google\":\"FE32C\",\"image\":\"1f618.png\",\"sheet_x\":20,\"sheet_y\":6,\"short_name\":\"kissing_heart\",\"short_names\":[\"kissing_heart\"],\"text\":null},{\"name\":\"KISSING FACE WITH SMILING EYES\",\"unified\":\"1F619\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f619.png\",\"sheet_x\":20,\"sheet_y\":7,\"short_name\":\"kissing_smiling_eyes\",\"short_names\":[\"kissing_smiling_eyes\"],\"text\":null},{\"name\":\"KISSING FACE WITH CLOSED EYES\",\"unified\":\"1F61A\",\"docomo\":\"E726\",\"au\":\"EACE\",\"softbank\":\"E417\",\"google\":\"FE32D\",\"image\":\"1f61a.png\",\"sheet_x\":20,\"sheet_y\":8,\"short_name\":\"kissing_closed_eyes\",\"short_names\":[\"kissing_closed_eyes\"],\"text\":null},{\"name\":\"FACE WITH STUCK-OUT TONGUE\",\"unified\":\"1F61B\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f61b.png\",\"sheet_x\":20,\"sheet_y\":9,\"short_name\":\"stuck_out_tongue\",\"short_names\":[\"stuck_out_tongue\"],\"text\":null},{\"name\":\"FACE WITH STUCK-OUT TONGUE AND WINKING EYE\",\"unified\":\"1F61C\",\"docomo\":\"E728\",\"au\":\"E4E7\",\"softbank\":\"E105\",\"google\":\"FE329\",\"image\":\"1f61c.png\",\"sheet_x\":20,\"sheet_y\":10,\"short_name\":\"stuck_out_tongue_winking_eye\",\"short_names\":[\"stuck_out_tongue_winking_eye\"],\"text\":\";p\"},{\"name\":\"FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES\",\"unified\":\"1F61D\",\"docomo\":\"E728\",\"au\":\"E4E7\",\"softbank\":\"E409\",\"google\":\"FE32A\",\"image\":\"1f61d.png\",\"sheet_x\":20,\"sheet_y\":11,\"short_name\":\"stuck_out_tongue_closed_eyes\",\"short_names\":[\"stuck_out_tongue_closed_eyes\"],\"text\":null},{\"name\":\"DISAPPOINTED FACE\",\"unified\":\"1F61E\",\"docomo\":\"E6F2\",\"au\":\"EAC0\",\"softbank\":\"E058\",\"google\":\"FE323\",\"image\":\"1f61e.png\",\"sheet_x\":20,\"sheet_y\":12,\"short_name\":\"disappointed\",\"short_names\":[\"disappointed\"],\"text\":\":(\"},{\"name\":\"WORRIED FACE\",\"unified\":\"1F61F\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f61f.png\",\"sheet_x\":20,\"sheet_y\":13,\"short_name\":\"worried\",\"short_names\":[\"worried\"],\"text\":null},{\"name\":\"ANGRY FACE\",\"unified\":\"1F620\",\"docomo\":\"E6F1\",\"au\":\"E472\",\"softbank\":\"E059\",\"google\":\"FE320\",\"image\":\"1f620.png\",\"sheet_x\":20,\"sheet_y\":14,\"short_name\":\"angry\",\"short_names\":[\"angry\"],\"text\":null},{\"name\":\"POUTING FACE\",\"unified\":\"1F621\",\"docomo\":\"E724\",\"au\":\"EB5D\",\"softbank\":\"E416\",\"google\":\"FE33D\",\"image\":\"1f621.png\",\"sheet_x\":20,\"sheet_y\":15,\"short_name\":\"rage\",\"short_names\":[\"rage\"],\"text\":null},{\"name\":\"CRYING FACE\",\"unified\":\"1F622\",\"docomo\":\"E72E\",\"au\":\"EB69\",\"softbank\":\"E413\",\"google\":\"FE339\",\"image\":\"1f622.png\",\"sheet_x\":20,\"sheet_y\":16,\"short_name\":\"cry\",\"short_names\":[\"cry\"],\"text\":\":'(\"},{\"name\":\"PERSEVERING FACE\",\"unified\":\"1F623\",\"docomo\":\"E72B\",\"au\":\"EAC2\",\"softbank\":\"E406\",\"google\":\"FE33C\",\"image\":\"1f623.png\",\"sheet_x\":20,\"sheet_y\":17,\"short_name\":\"persevere\",\"short_names\":[\"persevere\"],\"text\":null},{\"name\":\"FACE WITH LOOK OF TRIUMPH\",\"unified\":\"1F624\",\"docomo\":\"E753\",\"au\":\"EAC1\",\"softbank\":\"E404\",\"google\":\"FE328\",\"image\":\"1f624.png\",\"sheet_x\":20,\"sheet_y\":18,\"short_name\":\"triumph\",\"short_names\":[\"triumph\"],\"text\":null},{\"name\":\"DISAPPOINTED BUT RELIEVED FACE\",\"unified\":\"1F625\",\"docomo\":\"E723\",\"au\":\"E5C6\",\"softbank\":\"E401\",\"google\":\"FE345\",\"image\":\"1f625.png\",\"sheet_x\":20,\"sheet_y\":19,\"short_name\":\"disappointed_relieved\",\"short_names\":[\"disappointed_relieved\"],\"text\":null},{\"name\":\"FROWNING FACE WITH OPEN MOUTH\",\"unified\":\"1F626\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f626.png\",\"sheet_x\":20,\"sheet_y\":20,\"short_name\":\"frowning\",\"short_names\":[\"frowning\"],\"text\":null},{\"name\":\"ANGUISHED FACE\",\"unified\":\"1F627\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f627.png\",\"sheet_x\":20,\"sheet_y\":21,\"short_name\":\"anguished\",\"short_names\":[\"anguished\"],\"text\":null},{\"name\":\"FEARFUL FACE\",\"unified\":\"1F628\",\"docomo\":\"E757\",\"au\":\"EAC6\",\"softbank\":\"E40B\",\"google\":\"FE33B\",\"image\":\"1f628.png\",\"sheet_x\":20,\"sheet_y\":22,\"short_name\":\"fearful\",\"short_names\":[\"fearful\"],\"text\":null},{\"name\":\"WEARY FACE\",\"unified\":\"1F629\",\"docomo\":\"E6F3\",\"au\":\"EB67\",\"softbank\":\"E403\",\"google\":\"FE321\",\"image\":\"1f629.png\",\"sheet_x\":20,\"sheet_y\":23,\"short_name\":\"weary\",\"short_names\":[\"weary\"],\"text\":null},{\"name\":\"SLEEPY FACE\",\"unified\":\"1F62A\",\"docomo\":\"E701\",\"au\":\"EAC4\",\"softbank\":\"E408\",\"google\":\"FE342\",\"image\":\"1f62a.png\",\"sheet_x\":20,\"sheet_y\":24,\"short_name\":\"sleepy\",\"short_names\":[\"sleepy\"],\"text\":null},{\"name\":\"TIRED FACE\",\"unified\":\"1F62B\",\"docomo\":\"E72B\",\"au\":\"E474\",\"softbank\":\"E406\",\"google\":\"FE346\",\"image\":\"1f62b.png\",\"sheet_x\":20,\"sheet_y\":25,\"short_name\":\"tired_face\",\"short_names\":[\"tired_face\"],\"text\":null},{\"name\":\"GRIMACING FACE\",\"unified\":\"1F62C\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f62c.png\",\"sheet_x\":20,\"sheet_y\":26,\"short_name\":\"grimacing\",\"short_names\":[\"grimacing\"],\"text\":null},{\"name\":\"LOUDLY CRYING FACE\",\"unified\":\"1F62D\",\"docomo\":\"E72D\",\"au\":\"E473\",\"softbank\":\"E411\",\"google\":\"FE33A\",\"image\":\"1f62d.png\",\"sheet_x\":20,\"sheet_y\":27,\"short_name\":\"sob\",\"short_names\":[\"sob\"],\"text\":\":'(\"},{\"name\":\"FACE WITH OPEN MOUTH\",\"unified\":\"1F62E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f62e.png\",\"sheet_x\":20,\"sheet_y\":28,\"short_name\":\"open_mouth\",\"short_names\":[\"open_mouth\"],\"text\":null},{\"name\":\"HUSHED FACE\",\"unified\":\"1F62F\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f62f.png\",\"sheet_x\":20,\"sheet_y\":29,\"short_name\":\"hushed\",\"short_names\":[\"hushed\"],\"text\":null},{\"name\":\"FACE WITH OPEN MOUTH AND COLD SWEAT\",\"unified\":\"1F630\",\"docomo\":\"E723\",\"au\":\"EACB\",\"softbank\":\"E40F\",\"google\":\"FE325\",\"image\":\"1f630.png\",\"sheet_x\":21,\"sheet_y\":0,\"short_name\":\"cold_sweat\",\"short_names\":[\"cold_sweat\"],\"text\":null},{\"name\":\"FACE SCREAMING IN FEAR\",\"unified\":\"1F631\",\"docomo\":\"E757\",\"au\":\"E5C5\",\"softbank\":\"E107\",\"google\":\"FE341\",\"image\":\"1f631.png\",\"sheet_x\":21,\"sheet_y\":1,\"short_name\":\"scream\",\"short_names\":[\"scream\"],\"text\":null},{\"name\":\"ASTONISHED FACE\",\"unified\":\"1F632\",\"docomo\":\"E6F4\",\"au\":\"EACA\",\"softbank\":\"E410\",\"google\":\"FE322\",\"image\":\"1f632.png\",\"sheet_x\":21,\"sheet_y\":2,\"short_name\":\"astonished\",\"short_names\":[\"astonished\"],\"text\":null},{\"name\":\"FLUSHED FACE\",\"unified\":\"1F633\",\"docomo\":\"E72A\",\"au\":\"EAC8\",\"softbank\":\"E40D\",\"google\":\"FE32F\",\"image\":\"1f633.png\",\"sheet_x\":21,\"sheet_y\":3,\"short_name\":\"flushed\",\"short_names\":[\"flushed\"],\"text\":null},{\"name\":\"SLEEPING FACE\",\"unified\":\"1F634\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f634.png\",\"sheet_x\":21,\"sheet_y\":4,\"short_name\":\"sleeping\",\"short_names\":[\"sleeping\"],\"text\":null},{\"name\":\"DIZZY FACE\",\"unified\":\"1F635\",\"docomo\":\"E6F4\",\"au\":\"E5AE\",\"softbank\":\"E406\",\"google\":\"FE324\",\"image\":\"1f635.png\",\"sheet_x\":21,\"sheet_y\":5,\"short_name\":\"dizzy_face\",\"short_names\":[\"dizzy_face\"],\"text\":null},{\"name\":\"FACE WITHOUT MOUTH\",\"unified\":\"1F636\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f636.png\",\"sheet_x\":21,\"sheet_y\":6,\"short_name\":\"no_mouth\",\"short_names\":[\"no_mouth\"],\"text\":null},{\"name\":\"FACE WITH MEDICAL MASK\",\"unified\":\"1F637\",\"docomo\":\"\",\"au\":\"EAC7\",\"softbank\":\"E40C\",\"google\":\"FE32E\",\"image\":\"1f637.png\",\"sheet_x\":21,\"sheet_y\":7,\"short_name\":\"mask\",\"short_names\":[\"mask\"],\"text\":null},{\"name\":\"GRINNING CAT FACE WITH SMILING EYES\",\"unified\":\"1F638\",\"docomo\":\"E753\",\"au\":\"EB7F\",\"softbank\":\"E404\",\"google\":\"FE349\",\"image\":\"1f638.png\",\"sheet_x\":21,\"sheet_y\":8,\"short_name\":\"smile_cat\",\"short_names\":[\"smile_cat\"],\"text\":null},{\"name\":\"CAT FACE WITH TEARS OF JOY\",\"unified\":\"1F639\",\"docomo\":\"E72A\",\"au\":\"EB63\",\"softbank\":\"E412\",\"google\":\"FE34A\",\"image\":\"1f639.png\",\"sheet_x\":21,\"sheet_y\":9,\"short_name\":\"joy_cat\",\"short_names\":[\"joy_cat\"],\"text\":null},{\"name\":\"SMILING CAT FACE WITH OPEN MOUTH\",\"unified\":\"1F63A\",\"docomo\":\"E6F0\",\"au\":\"EB61\",\"softbank\":\"E057\",\"google\":\"FE348\",\"image\":\"1f63a.png\",\"sheet_x\":21,\"sheet_y\":10,\"short_name\":\"smiley_cat\",\"short_names\":[\"smiley_cat\"],\"text\":null},{\"name\":\"SMILING CAT FACE WITH HEART-SHAPED EYES\",\"unified\":\"1F63B\",\"docomo\":\"E726\",\"au\":\"EB65\",\"softbank\":\"E106\",\"google\":\"FE34C\",\"image\":\"1f63b.png\",\"sheet_x\":21,\"sheet_y\":11,\"short_name\":\"heart_eyes_cat\",\"short_names\":[\"heart_eyes_cat\"],\"text\":null},{\"name\":\"CAT FACE WITH WRY SMILE\",\"unified\":\"1F63C\",\"docomo\":\"E753\",\"au\":\"EB6A\",\"softbank\":\"E404\",\"google\":\"FE34F\",\"image\":\"1f63c.png\",\"sheet_x\":21,\"sheet_y\":12,\"short_name\":\"smirk_cat\",\"short_names\":[\"smirk_cat\"],\"text\":null},{\"name\":\"KISSING CAT FACE WITH CLOSED EYES\",\"unified\":\"1F63D\",\"docomo\":\"E726\",\"au\":\"EB60\",\"softbank\":\"E418\",\"google\":\"FE34B\",\"image\":\"1f63d.png\",\"sheet_x\":21,\"sheet_y\":13,\"short_name\":\"kissing_cat\",\"short_names\":[\"kissing_cat\"],\"text\":null},{\"name\":\"POUTING CAT FACE\",\"unified\":\"1F63E\",\"docomo\":\"E724\",\"au\":\"EB5E\",\"softbank\":\"E416\",\"google\":\"FE34E\",\"image\":\"1f63e.png\",\"sheet_x\":21,\"sheet_y\":14,\"short_name\":\"pouting_cat\",\"short_names\":[\"pouting_cat\"],\"text\":null},{\"name\":\"CRYING CAT FACE\",\"unified\":\"1F63F\",\"docomo\":\"E72E\",\"au\":\"EB68\",\"softbank\":\"E413\",\"google\":\"FE34D\",\"image\":\"1f63f.png\",\"sheet_x\":21,\"sheet_y\":15,\"short_name\":\"crying_cat_face\",\"short_names\":[\"crying_cat_face\"],\"text\":null},{\"name\":\"WEARY CAT FACE\",\"unified\":\"1F640\",\"docomo\":\"E6F3\",\"au\":\"EB66\",\"softbank\":\"E403\",\"google\":\"FE350\",\"image\":\"1f640.png\",\"sheet_x\":21,\"sheet_y\":16,\"short_name\":\"scream_cat\",\"short_names\":[\"scream_cat\"],\"text\":null},{\"name\":\"FACE WITH NO GOOD GESTURE\",\"unified\":\"1F645\",\"docomo\":\"E72F\",\"au\":\"EAD7\",\"softbank\":\"E423\",\"google\":\"FE351\",\"image\":\"1f645.png\",\"sheet_x\":21,\"sheet_y\":17,\"short_name\":\"no_good\",\"short_names\":[\"no_good\"],\"text\":null},{\"name\":\"FACE WITH OK GESTURE\",\"unified\":\"1F646\",\"docomo\":\"E70B\",\"au\":\"EAD8\",\"softbank\":\"E424\",\"google\":\"FE352\",\"image\":\"1f646.png\",\"sheet_x\":21,\"sheet_y\":18,\"short_name\":\"ok_woman\",\"short_names\":[\"ok_woman\"],\"text\":null},{\"name\":\"PERSON BOWING DEEPLY\",\"unified\":\"1F647\",\"docomo\":\"\",\"au\":\"EAD9\",\"softbank\":\"E426\",\"google\":\"FE353\",\"image\":\"1f647.png\",\"sheet_x\":21,\"sheet_y\":19,\"short_name\":\"bow\",\"short_names\":[\"bow\"],\"text\":null},{\"name\":\"SEE-NO-EVIL MONKEY\",\"unified\":\"1F648\",\"docomo\":\"\",\"au\":\"EB50\",\"softbank\":\"\",\"google\":\"FE354\",\"image\":\"1f648.png\",\"sheet_x\":21,\"sheet_y\":20,\"short_name\":\"see_no_evil\",\"short_names\":[\"see_no_evil\"],\"text\":null},{\"name\":\"HEAR-NO-EVIL MONKEY\",\"unified\":\"1F649\",\"docomo\":\"\",\"au\":\"EB52\",\"softbank\":\"\",\"google\":\"FE356\",\"image\":\"1f649.png\",\"sheet_x\":21,\"sheet_y\":21,\"short_name\":\"hear_no_evil\",\"short_names\":[\"hear_no_evil\"],\"text\":null},{\"name\":\"SPEAK-NO-EVIL MONKEY\",\"unified\":\"1F64A\",\"docomo\":\"\",\"au\":\"EB51\",\"softbank\":\"\",\"google\":\"FE355\",\"image\":\"1f64a.png\",\"sheet_x\":21,\"sheet_y\":22,\"short_name\":\"speak_no_evil\",\"short_names\":[\"speak_no_evil\"],\"text\":null},{\"name\":\"HAPPY PERSON RAISING ONE HAND\",\"unified\":\"1F64B\",\"docomo\":\"\",\"au\":\"EB85\",\"softbank\":\"E012\",\"google\":\"FE357\",\"image\":\"1f64b.png\",\"sheet_x\":21,\"sheet_y\":23,\"short_name\":\"raising_hand\",\"short_names\":[\"raising_hand\"],\"text\":null},{\"name\":\"PERSON RAISING BOTH HANDS IN CELEBRATION\",\"unified\":\"1F64C\",\"docomo\":\"\",\"au\":\"EB86\",\"softbank\":\"E427\",\"google\":\"FE358\",\"image\":\"1f64c.png\",\"sheet_x\":21,\"sheet_y\":24,\"short_name\":\"raised_hands\",\"short_names\":[\"raised_hands\"],\"text\":null},{\"name\":\"PERSON FROWNING\",\"unified\":\"1F64D\",\"docomo\":\"E6F3\",\"au\":\"EB87\",\"softbank\":\"E403\",\"google\":\"FE359\",\"image\":\"1f64d.png\",\"sheet_x\":21,\"sheet_y\":25,\"short_name\":\"person_frowning\",\"short_names\":[\"person_frowning\"],\"text\":null},{\"name\":\"PERSON WITH POUTING FACE\",\"unified\":\"1F64E\",\"docomo\":\"E6F1\",\"au\":\"EB88\",\"softbank\":\"E416\",\"google\":\"FE35A\",\"image\":\"1f64e.png\",\"sheet_x\":21,\"sheet_y\":26,\"short_name\":\"person_with_pouting_face\",\"short_names\":[\"person_with_pouting_face\"],\"text\":null},{\"name\":\"PERSON WITH FOLDED HANDS\",\"unified\":\"1F64F\",\"docomo\":\"\",\"au\":\"EAD2\",\"softbank\":\"E41D\",\"google\":\"FE35B\",\"image\":\"1f64f.png\",\"sheet_x\":21,\"sheet_y\":27,\"short_name\":\"pray\",\"short_names\":[\"pray\"],\"text\":null},{\"name\":\"ROCKET\",\"unified\":\"1F680\",\"docomo\":\"\",\"au\":\"E5C8\",\"softbank\":\"E10D\",\"google\":\"FE7ED\",\"image\":\"1f680.png\",\"sheet_x\":21,\"sheet_y\":28,\"short_name\":\"rocket\",\"short_names\":[\"rocket\"],\"text\":null},{\"name\":\"HELICOPTER\",\"unified\":\"1F681\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f681.png\",\"sheet_x\":21,\"sheet_y\":29,\"short_name\":\"helicopter\",\"short_names\":[\"helicopter\"],\"text\":null},{\"name\":\"STEAM LOCOMOTIVE\",\"unified\":\"1F682\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f682.png\",\"sheet_x\":22,\"sheet_y\":0,\"short_name\":\"steam_locomotive\",\"short_names\":[\"steam_locomotive\"],\"text\":null},{\"name\":\"RAILWAY CAR\",\"unified\":\"1F683\",\"docomo\":\"E65B\",\"au\":\"E4B5\",\"softbank\":\"E01E\",\"google\":\"FE7DF\",\"image\":\"1f683.png\",\"sheet_x\":22,\"sheet_y\":1,\"short_name\":\"railway_car\",\"short_names\":[\"railway_car\",\"train\"],\"text\":null},{\"name\":\"HIGH-SPEED TRAIN\",\"unified\":\"1F684\",\"docomo\":\"E65D\",\"au\":\"E4B0\",\"softbank\":\"E435\",\"google\":\"FE7E2\",\"image\":\"1f684.png\",\"sheet_x\":22,\"sheet_y\":2,\"short_name\":\"bullettrain_side\",\"short_names\":[\"bullettrain_side\"],\"text\":null},{\"name\":\"HIGH-SPEED TRAIN WITH BULLET NOSE\",\"unified\":\"1F685\",\"docomo\":\"E65D\",\"au\":\"E4B0\",\"softbank\":\"E01F\",\"google\":\"FE7E3\",\"image\":\"1f685.png\",\"sheet_x\":22,\"sheet_y\":3,\"short_name\":\"bullettrain_front\",\"short_names\":[\"bullettrain_front\"],\"text\":null},{\"name\":\"TRAIN\",\"unified\":\"1F686\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f686.png\",\"sheet_x\":22,\"sheet_y\":4,\"short_name\":\"train2\",\"short_names\":[\"train2\"],\"text\":null},{\"name\":\"METRO\",\"unified\":\"1F687\",\"docomo\":\"E65C\",\"au\":\"E5BC\",\"softbank\":\"E434\",\"google\":\"FE7E0\",\"image\":\"1f687.png\",\"sheet_x\":22,\"sheet_y\":5,\"short_name\":\"metro\",\"short_names\":[\"metro\"],\"text\":null},{\"name\":\"LIGHT RAIL\",\"unified\":\"1F688\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f688.png\",\"sheet_x\":22,\"sheet_y\":6,\"short_name\":\"light_rail\",\"short_names\":[\"light_rail\"],\"text\":null},{\"name\":\"STATION\",\"unified\":\"1F689\",\"docomo\":\"\",\"au\":\"EB6D\",\"softbank\":\"E039\",\"google\":\"FE7EC\",\"image\":\"1f689.png\",\"sheet_x\":22,\"sheet_y\":7,\"short_name\":\"station\",\"short_names\":[\"station\"],\"text\":null},{\"name\":\"TRAM\",\"unified\":\"1F68A\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f68a.png\",\"sheet_x\":22,\"sheet_y\":8,\"short_name\":\"tram\",\"short_names\":[\"tram\"],\"text\":null},{\"name\":\"BUS\",\"unified\":\"1F68C\",\"docomo\":\"E660\",\"au\":\"E4AF\",\"softbank\":\"E159\",\"google\":\"FE7E6\",\"image\":\"1f68c.png\",\"sheet_x\":22,\"sheet_y\":9,\"short_name\":\"bus\",\"short_names\":[\"bus\"],\"text\":null},{\"name\":\"ONCOMING BUS\",\"unified\":\"1F68D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f68d.png\",\"sheet_x\":22,\"sheet_y\":10,\"short_name\":\"oncoming_bus\",\"short_names\":[\"oncoming_bus\"],\"text\":null},{\"name\":\"TROLLEYBUS\",\"unified\":\"1F68E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f68e.png\",\"sheet_x\":22,\"sheet_y\":11,\"short_name\":\"trolleybus\",\"short_names\":[\"trolleybus\"],\"text\":null},{\"name\":\"BUS STOP\",\"unified\":\"1F68F\",\"docomo\":\"\",\"au\":\"E4A7\",\"softbank\":\"E150\",\"google\":\"FE7E7\",\"image\":\"1f68f.png\",\"sheet_x\":22,\"sheet_y\":12,\"short_name\":\"busstop\",\"short_names\":[\"busstop\"],\"text\":null},{\"name\":\"MINIBUS\",\"unified\":\"1F690\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f690.png\",\"sheet_x\":22,\"sheet_y\":13,\"short_name\":\"minibus\",\"short_names\":[\"minibus\"],\"text\":null},{\"name\":\"AMBULANCE\",\"unified\":\"1F691\",\"docomo\":\"\",\"au\":\"EAE0\",\"softbank\":\"E431\",\"google\":\"FE7F3\",\"image\":\"1f691.png\",\"sheet_x\":22,\"sheet_y\":14,\"short_name\":\"ambulance\",\"short_names\":[\"ambulance\"],\"text\":null},{\"name\":\"FIRE ENGINE\",\"unified\":\"1F692\",\"docomo\":\"\",\"au\":\"EADF\",\"softbank\":\"E430\",\"google\":\"FE7F2\",\"image\":\"1f692.png\",\"sheet_x\":22,\"sheet_y\":15,\"short_name\":\"fire_engine\",\"short_names\":[\"fire_engine\"],\"text\":null},{\"name\":\"POLICE CAR\",\"unified\":\"1F693\",\"docomo\":\"\",\"au\":\"EAE1\",\"softbank\":\"E432\",\"google\":\"FE7F4\",\"image\":\"1f693.png\",\"sheet_x\":22,\"sheet_y\":16,\"short_name\":\"police_car\",\"short_names\":[\"police_car\"],\"text\":null},{\"name\":\"ONCOMING POLICE CAR\",\"unified\":\"1F694\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f694.png\",\"sheet_x\":22,\"sheet_y\":17,\"short_name\":\"oncoming_police_car\",\"short_names\":[\"oncoming_police_car\"],\"text\":null},{\"name\":\"TAXI\",\"unified\":\"1F695\",\"docomo\":\"E65E\",\"au\":\"E4B1\",\"softbank\":\"E15A\",\"google\":\"FE7EF\",\"image\":\"1f695.png\",\"sheet_x\":22,\"sheet_y\":18,\"short_name\":\"taxi\",\"short_names\":[\"taxi\"],\"text\":null},{\"name\":\"ONCOMING TAXI\",\"unified\":\"1F696\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f696.png\",\"sheet_x\":22,\"sheet_y\":19,\"short_name\":\"oncoming_taxi\",\"short_names\":[\"oncoming_taxi\"],\"text\":null},{\"name\":\"AUTOMOBILE\",\"unified\":\"1F697\",\"docomo\":\"E65E\",\"au\":\"E4B1\",\"softbank\":\"E01B\",\"google\":\"FE7E4\",\"image\":\"1f697.png\",\"sheet_x\":22,\"sheet_y\":20,\"short_name\":\"car\",\"short_names\":[\"car\",\"red_car\"],\"text\":null},{\"name\":\"ONCOMING AUTOMOBILE\",\"unified\":\"1F698\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f698.png\",\"sheet_x\":22,\"sheet_y\":21,\"short_name\":\"oncoming_automobile\",\"short_names\":[\"oncoming_automobile\"],\"text\":null},{\"name\":\"RECREATIONAL VEHICLE\",\"unified\":\"1F699\",\"docomo\":\"E65F\",\"au\":\"E4B1\",\"softbank\":\"E42E\",\"google\":\"FE7E5\",\"image\":\"1f699.png\",\"sheet_x\":22,\"sheet_y\":22,\"short_name\":\"blue_car\",\"short_names\":[\"blue_car\"],\"text\":null},{\"name\":\"DELIVERY TRUCK\",\"unified\":\"1F69A\",\"docomo\":\"\",\"au\":\"E4B2\",\"softbank\":\"E42F\",\"google\":\"FE7F1\",\"image\":\"1f69a.png\",\"sheet_x\":22,\"sheet_y\":23,\"short_name\":\"truck\",\"short_names\":[\"truck\"],\"text\":null},{\"name\":\"ARTICULATED LORRY\",\"unified\":\"1F69B\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f69b.png\",\"sheet_x\":22,\"sheet_y\":24,\"short_name\":\"articulated_lorry\",\"short_names\":[\"articulated_lorry\"],\"text\":null},{\"name\":\"TRACTOR\",\"unified\":\"1F69C\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f69c.png\",\"sheet_x\":22,\"sheet_y\":25,\"short_name\":\"tractor\",\"short_names\":[\"tractor\"],\"text\":null},{\"name\":\"MONORAIL\",\"unified\":\"1F69D\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f69d.png\",\"sheet_x\":22,\"sheet_y\":26,\"short_name\":\"monorail\",\"short_names\":[\"monorail\"],\"text\":null},{\"name\":\"MOUNTAIN RAILWAY\",\"unified\":\"1F69E\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f69e.png\",\"sheet_x\":22,\"sheet_y\":27,\"short_name\":\"mountain_railway\",\"short_names\":[\"mountain_railway\"],\"text\":null},{\"name\":\"SUSPENSION RAILWAY\",\"unified\":\"1F69F\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f69f.png\",\"sheet_x\":22,\"sheet_y\":28,\"short_name\":\"suspension_railway\",\"short_names\":[\"suspension_railway\"],\"text\":null},{\"name\":\"MOUNTAIN CABLEWAY\",\"unified\":\"1F6A0\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6a0.png\",\"sheet_x\":22,\"sheet_y\":29,\"short_name\":\"mountain_cableway\",\"short_names\":[\"mountain_cableway\"],\"text\":null},{\"name\":\"AERIAL TRAMWAY\",\"unified\":\"1F6A1\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6a1.png\",\"sheet_x\":23,\"sheet_y\":0,\"short_name\":\"aerial_tramway\",\"short_names\":[\"aerial_tramway\"],\"text\":null},{\"name\":\"SHIP\",\"unified\":\"1F6A2\",\"docomo\":\"E661\",\"au\":\"EA82\",\"softbank\":\"E202\",\"google\":\"FE7E8\",\"image\":\"1f6a2.png\",\"sheet_x\":23,\"sheet_y\":1,\"short_name\":\"ship\",\"short_names\":[\"ship\"],\"text\":null},{\"name\":\"ROWBOAT\",\"unified\":\"1F6A3\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6a3.png\",\"sheet_x\":23,\"sheet_y\":2,\"short_name\":\"rowboat\",\"short_names\":[\"rowboat\"],\"text\":null},{\"name\":\"SPEEDBOAT\",\"unified\":\"1F6A4\",\"docomo\":\"E6A3\",\"au\":\"E4B4\",\"softbank\":\"E135\",\"google\":\"FE7EE\",\"image\":\"1f6a4.png\",\"sheet_x\":23,\"sheet_y\":3,\"short_name\":\"speedboat\",\"short_names\":[\"speedboat\"],\"text\":null},{\"name\":\"HORIZONTAL TRAFFIC LIGHT\",\"unified\":\"1F6A5\",\"docomo\":\"E66D\",\"au\":\"E46A\",\"softbank\":\"E14E\",\"google\":\"FE7F7\",\"image\":\"1f6a5.png\",\"sheet_x\":23,\"sheet_y\":4,\"short_name\":\"traffic_light\",\"short_names\":[\"traffic_light\"],\"text\":null},{\"name\":\"VERTICAL TRAFFIC LIGHT\",\"unified\":\"1F6A6\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6a6.png\",\"sheet_x\":23,\"sheet_y\":5,\"short_name\":\"vertical_traffic_light\",\"short_names\":[\"vertical_traffic_light\"],\"text\":null},{\"name\":\"CONSTRUCTION SIGN\",\"unified\":\"1F6A7\",\"docomo\":\"\",\"au\":\"E5D7\",\"softbank\":\"E137\",\"google\":\"FE7F8\",\"image\":\"1f6a7.png\",\"sheet_x\":23,\"sheet_y\":6,\"short_name\":\"construction\",\"short_names\":[\"construction\"],\"text\":null},{\"name\":\"POLICE CARS REVOLVING LIGHT\",\"unified\":\"1F6A8\",\"docomo\":\"\",\"au\":\"EB73\",\"softbank\":\"E432\",\"google\":\"FE7F9\",\"image\":\"1f6a8.png\",\"sheet_x\":23,\"sheet_y\":7,\"short_name\":\"rotating_light\",\"short_names\":[\"rotating_light\"],\"text\":null},{\"name\":\"TRIANGULAR FLAG ON POST\",\"unified\":\"1F6A9\",\"docomo\":\"E6DE\",\"au\":\"EB2C\",\"softbank\":\"\",\"google\":\"FEB22\",\"image\":\"1f6a9.png\",\"sheet_x\":23,\"sheet_y\":8,\"short_name\":\"triangular_flag_on_post\",\"short_names\":[\"triangular_flag_on_post\"],\"text\":null},{\"name\":\"DOOR\",\"unified\":\"1F6AA\",\"docomo\":\"E714\",\"au\":\"\",\"softbank\":\"\",\"google\":\"FE4F3\",\"image\":\"1f6aa.png\",\"sheet_x\":23,\"sheet_y\":9,\"short_name\":\"door\",\"short_names\":[\"door\"],\"text\":null},{\"name\":\"NO ENTRY SIGN\",\"unified\":\"1F6AB\",\"docomo\":\"E738\",\"au\":\"E541\",\"softbank\":\"\",\"google\":\"FEB48\",\"image\":\"1f6ab.png\",\"sheet_x\":23,\"sheet_y\":10,\"short_name\":\"no_entry_sign\",\"short_names\":[\"no_entry_sign\"],\"text\":null},{\"name\":\"SMOKING SYMBOL\",\"unified\":\"1F6AC\",\"docomo\":\"E67F\",\"au\":\"E47D\",\"softbank\":\"E30E\",\"google\":\"FEB1E\",\"image\":\"1f6ac.png\",\"sheet_x\":23,\"sheet_y\":11,\"short_name\":\"smoking\",\"short_names\":[\"smoking\"],\"text\":null},{\"name\":\"NO SMOKING SYMBOL\",\"unified\":\"1F6AD\",\"docomo\":\"E680\",\"au\":\"E47E\",\"softbank\":\"E208\",\"google\":\"FEB1F\",\"image\":\"1f6ad.png\",\"sheet_x\":23,\"sheet_y\":12,\"short_name\":\"no_smoking\",\"short_names\":[\"no_smoking\"],\"text\":null},{\"name\":\"PUT LITTER IN ITS PLACE SYMBOL\",\"unified\":\"1F6AE\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6ae.png\",\"sheet_x\":23,\"sheet_y\":13,\"short_name\":\"put_litter_in_its_place\",\"short_names\":[\"put_litter_in_its_place\"],\"text\":null},{\"name\":\"DO NOT LITTER SYMBOL\",\"unified\":\"1F6AF\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6af.png\",\"sheet_x\":23,\"sheet_y\":14,\"short_name\":\"do_not_litter\",\"short_names\":[\"do_not_litter\"],\"text\":null},{\"name\":\"POTABLE WATER SYMBOL\",\"unified\":\"1F6B0\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6b0.png\",\"sheet_x\":23,\"sheet_y\":15,\"short_name\":\"potable_water\",\"short_names\":[\"potable_water\"],\"text\":null},{\"name\":\"NON-POTABLE WATER SYMBOL\",\"unified\":\"1F6B1\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6b1.png\",\"sheet_x\":23,\"sheet_y\":16,\"short_name\":\"non-potable_water\",\"short_names\":[\"non-potable_water\"],\"text\":null},{\"name\":\"BICYCLE\",\"unified\":\"1F6B2\",\"docomo\":\"E71D\",\"au\":\"E4AE\",\"softbank\":\"E136\",\"google\":\"FE7EB\",\"image\":\"1f6b2.png\",\"sheet_x\":23,\"sheet_y\":17,\"short_name\":\"bike\",\"short_names\":[\"bike\"],\"text\":null},{\"name\":\"NO BICYCLES\",\"unified\":\"1F6B3\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6b3.png\",\"sheet_x\":23,\"sheet_y\":18,\"short_name\":\"no_bicycles\",\"short_names\":[\"no_bicycles\"],\"text\":null},{\"name\":\"BICYCLIST\",\"unified\":\"1F6B4\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6b4.png\",\"sheet_x\":23,\"sheet_y\":19,\"short_name\":\"bicyclist\",\"short_names\":[\"bicyclist\"],\"text\":null},{\"name\":\"MOUNTAIN BICYCLIST\",\"unified\":\"1F6B5\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6b5.png\",\"sheet_x\":23,\"sheet_y\":20,\"short_name\":\"mountain_bicyclist\",\"short_names\":[\"mountain_bicyclist\"],\"text\":null},{\"name\":\"PEDESTRIAN\",\"unified\":\"1F6B6\",\"docomo\":\"E733\",\"au\":\"EB72\",\"softbank\":\"E201\",\"google\":\"FE7F0\",\"image\":\"1f6b6.png\",\"sheet_x\":23,\"sheet_y\":21,\"short_name\":\"walking\",\"short_names\":[\"walking\"],\"text\":null},{\"name\":\"NO PEDESTRIANS\",\"unified\":\"1F6B7\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6b7.png\",\"sheet_x\":23,\"sheet_y\":22,\"short_name\":\"no_pedestrians\",\"short_names\":[\"no_pedestrians\"],\"text\":null},{\"name\":\"CHILDREN CROSSING\",\"unified\":\"1F6B8\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6b8.png\",\"sheet_x\":23,\"sheet_y\":23,\"short_name\":\"children_crossing\",\"short_names\":[\"children_crossing\"],\"text\":null},{\"name\":\"MENS SYMBOL\",\"unified\":\"1F6B9\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E138\",\"google\":\"FEB33\",\"image\":\"1f6b9.png\",\"sheet_x\":23,\"sheet_y\":24,\"short_name\":\"mens\",\"short_names\":[\"mens\"],\"text\":null},{\"name\":\"WOMENS SYMBOL\",\"unified\":\"1F6BA\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"E139\",\"google\":\"FEB34\",\"image\":\"1f6ba.png\",\"sheet_x\":23,\"sheet_y\":25,\"short_name\":\"womens\",\"short_names\":[\"womens\"],\"text\":null},{\"name\":\"RESTROOM\",\"unified\":\"1F6BB\",\"docomo\":\"E66E\",\"au\":\"E4A5\",\"softbank\":\"E151\",\"google\":\"FE506\",\"image\":\"1f6bb.png\",\"sheet_x\":23,\"sheet_y\":26,\"short_name\":\"restroom\",\"short_names\":[\"restroom\"],\"text\":null},{\"name\":\"BABY SYMBOL\",\"unified\":\"1F6BC\",\"docomo\":\"\",\"au\":\"EB18\",\"softbank\":\"E13A\",\"google\":\"FEB35\",\"image\":\"1f6bc.png\",\"sheet_x\":23,\"sheet_y\":27,\"short_name\":\"baby_symbol\",\"short_names\":[\"baby_symbol\"],\"text\":null},{\"name\":\"TOILET\",\"unified\":\"1F6BD\",\"docomo\":\"E66E\",\"au\":\"E4A5\",\"softbank\":\"E140\",\"google\":\"FE507\",\"image\":\"1f6bd.png\",\"sheet_x\":23,\"sheet_y\":28,\"short_name\":\"toilet\",\"short_names\":[\"toilet\"],\"text\":null},{\"name\":\"WATER CLOSET\",\"unified\":\"1F6BE\",\"docomo\":\"E66E\",\"au\":\"E4A5\",\"softbank\":\"E309\",\"google\":\"FE508\",\"image\":\"1f6be.png\",\"sheet_x\":23,\"sheet_y\":29,\"short_name\":\"wc\",\"short_names\":[\"wc\"],\"text\":null},{\"name\":\"SHOWER\",\"unified\":\"1F6BF\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6bf.png\",\"sheet_x\":24,\"sheet_y\":0,\"short_name\":\"shower\",\"short_names\":[\"shower\"],\"text\":null},{\"name\":\"BATH\",\"unified\":\"1F6C0\",\"docomo\":\"E6F7\",\"au\":\"E5D8\",\"softbank\":\"E13F\",\"google\":\"FE505\",\"image\":\"1f6c0.png\",\"sheet_x\":24,\"sheet_y\":1,\"short_name\":\"bath\",\"short_names\":[\"bath\"],\"text\":null},{\"name\":\"BATHTUB\",\"unified\":\"1F6C1\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6c1.png\",\"sheet_x\":24,\"sheet_y\":2,\"short_name\":\"bathtub\",\"short_names\":[\"bathtub\"],\"text\":null},{\"name\":\"PASSPORT CONTROL\",\"unified\":\"1F6C2\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6c2.png\",\"sheet_x\":24,\"sheet_y\":3,\"short_name\":\"passport_control\",\"short_names\":[\"passport_control\"],\"text\":null},{\"name\":\"CUSTOMS\",\"unified\":\"1F6C3\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6c3.png\",\"sheet_x\":24,\"sheet_y\":4,\"short_name\":\"customs\",\"short_names\":[\"customs\"],\"text\":null},{\"name\":\"BAGGAGE CLAIM\",\"unified\":\"1F6C4\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6c4.png\",\"sheet_x\":24,\"sheet_y\":5,\"short_name\":\"baggage_claim\",\"short_names\":[\"baggage_claim\"],\"text\":null},{\"name\":\"LEFT LUGGAGE\",\"unified\":\"1F6C5\",\"docomo\":\"\",\"au\":\"\",\"softbank\":\"\",\"google\":\"\",\"image\":\"1f6c5.png\",\"sheet_x\":24,\"sheet_y\":6,\"short_name\":\"left_luggage\",\"short_names\":[\"left_luggage\"],\"text\":null},{\"name\":\"HASH KEY\",\"unified\":\"0023-20E3\",\"docomo\":\"E6E0\",\"au\":\"EB84\",\"softbank\":\"E210\",\"google\":\"FE82C\",\"image\":\"0023.png\",\"sheet_x\":0,\"sheet_y\":0,\"short_name\":\"hash\",\"short_names\":[\"hash\"],\"text\":null},{\"name\":\"KEYCAP 0\",\"unified\":\"0030-20E3\",\"docomo\":\"E6EB\",\"au\":\"E5AC\",\"softbank\":\"E225\",\"google\":\"FE837\",\"image\":\"0030.png\",\"sheet_x\":0,\"sheet_y\":1,\"short_name\":\"zero\",\"short_names\":[\"zero\"],\"text\":null},{\"name\":\"KEYCAP 1\",\"unified\":\"0031-20E3\",\"docomo\":\"E6E2\",\"au\":\"E522\",\"softbank\":\"E21C\",\"google\":\"FE82E\",\"image\":\"0031.png\",\"sheet_x\":0,\"sheet_y\":2,\"short_name\":\"one\",\"short_names\":[\"one\"],\"text\":null},{\"name\":\"KEYCAP 2\",\"unified\":\"0032-20E3\",\"docomo\":\"E6E3\",\"au\":\"E523\",\"softbank\":\"E21D\",\"google\":\"FE82F\",\"image\":\"0032.png\",\"sheet_x\":0,\"sheet_y\":3,\"short_name\":\"two\",\"short_names\":[\"two\"],\"text\":null},{\"name\":\"KEYCAP 3\",\"unified\":\"0033-20E3\",\"docomo\":\"E6E4\",\"au\":\"E524\",\"softbank\":\"E21E\",\"google\":\"FE830\",\"image\":\"0033.png\",\"sheet_x\":0,\"sheet_y\":4,\"short_name\":\"three\",\"short_names\":[\"three\"],\"text\":null},{\"name\":\"KEYCAP 4\",\"unified\":\"0034-20E3\",\"docomo\":\"E6E5\",\"au\":\"E525\",\"softbank\":\"E21F\",\"google\":\"FE831\",\"image\":\"0034.png\",\"sheet_x\":0,\"sheet_y\":5,\"short_name\":\"four\",\"short_names\":[\"four\"],\"text\":null},{\"name\":\"KEYCAP 5\",\"unified\":\"0035-20E3\",\"docomo\":\"E6E6\",\"au\":\"E526\",\"softbank\":\"E220\",\"google\":\"FE832\",\"image\":\"0035.png\",\"sheet_x\":0,\"sheet_y\":6,\"short_name\":\"five\",\"short_names\":[\"five\"],\"text\":null},{\"name\":\"KEYCAP 6\",\"unified\":\"0036-20E3\",\"docomo\":\"E6E7\",\"au\":\"E527\",\"softbank\":\"E221\",\"google\":\"FE833\",\"image\":\"0036.png\",\"sheet_x\":0,\"sheet_y\":7,\"short_name\":\"six\",\"short_names\":[\"six\"],\"text\":null},{\"name\":\"KEYCAP 7\",\"unified\":\"0037-20E3\",\"docomo\":\"E6E8\",\"au\":\"E528\",\"softbank\":\"E222\",\"google\":\"FE834\",\"image\":\"0037.png\",\"sheet_x\":0,\"sheet_y\":8,\"short_name\":\"seven\",\"short_names\":[\"seven\"],\"text\":null},{\"name\":\"KEYCAP 8\",\"unified\":\"0038-20E3\",\"docomo\":\"E6E9\",\"au\":\"E529\",\"softbank\":\"E223\",\"google\":\"FE835\",\"image\":\"0038.png\",\"sheet_x\":0,\"sheet_y\":9,\"short_name\":\"eight\",\"short_names\":[\"eight\"],\"text\":null},{\"name\":\"KEYCAP 9\",\"unified\":\"0039-20E3\",\"docomo\":\"E6EA\",\"au\":\"E52A\",\"softbank\":\"E224\",\"google\":\"FE836\",\"image\":\"0039.png\",\"sheet_x\":0,\"sheet_y\":10,\"short_name\":\"nine\",\"short_names\":[\"nine\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS CN\",\"unified\":\"1F1E8-1F1F3\",\"docomo\":\"\",\"au\":\"EB11\",\"softbank\":\"E513\",\"google\":\"FE4ED\",\"image\":\"1f1e8-1f1f3.png\",\"sheet_x\":1,\"sheet_y\":0,\"short_name\":\"cn\",\"short_names\":[\"cn\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS DE\",\"unified\":\"1F1E9-1F1EA\",\"docomo\":\"\",\"au\":\"EB0E\",\"softbank\":\"E50E\",\"google\":\"FE4E8\",\"image\":\"1f1e9-1f1ea.png\",\"sheet_x\":1,\"sheet_y\":1,\"short_name\":\"de\",\"short_names\":[\"de\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS ES\",\"unified\":\"1F1EA-1F1F8\",\"docomo\":\"\",\"au\":\"E5D5\",\"softbank\":\"E511\",\"google\":\"FE4EB\",\"image\":\"1f1ea-1f1f8.png\",\"sheet_x\":1,\"sheet_y\":2,\"short_name\":\"es\",\"short_names\":[\"es\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS FR\",\"unified\":\"1F1EB-1F1F7\",\"docomo\":\"\",\"au\":\"EAFA\",\"softbank\":\"E50D\",\"google\":\"FE4E7\",\"image\":\"1f1eb-1f1f7.png\",\"sheet_x\":1,\"sheet_y\":3,\"short_name\":\"fr\",\"short_names\":[\"fr\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS GB\",\"unified\":\"1F1EC-1F1E7\",\"docomo\":\"\",\"au\":\"EB10\",\"softbank\":\"E510\",\"google\":\"FE4EA\",\"image\":\"1f1ec-1f1e7.png\",\"sheet_x\":1,\"sheet_y\":4,\"short_name\":\"gb\",\"short_names\":[\"gb\",\"uk\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS IT\",\"unified\":\"1F1EE-1F1F9\",\"docomo\":\"\",\"au\":\"EB0F\",\"softbank\":\"E50F\",\"google\":\"FE4E9\",\"image\":\"1f1ee-1f1f9.png\",\"sheet_x\":1,\"sheet_y\":5,\"short_name\":\"it\",\"short_names\":[\"it\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS JP\",\"unified\":\"1F1EF-1F1F5\",\"docomo\":\"\",\"au\":\"E4CC\",\"softbank\":\"E50B\",\"google\":\"FE4E5\",\"image\":\"1f1ef-1f1f5.png\",\"sheet_x\":1,\"sheet_y\":6,\"short_name\":\"jp\",\"short_names\":[\"jp\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS KR\",\"unified\":\"1F1F0-1F1F7\",\"docomo\":\"\",\"au\":\"EB12\",\"softbank\":\"E514\",\"google\":\"FE4EE\",\"image\":\"1f1f0-1f1f7.png\",\"sheet_x\":1,\"sheet_y\":7,\"short_name\":\"kr\",\"short_names\":[\"kr\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS RU\",\"unified\":\"1F1F7-1F1FA\",\"docomo\":\"\",\"au\":\"E5D6\",\"softbank\":\"E512\",\"google\":\"FE4EC\",\"image\":\"1f1f7-1f1fa.png\",\"sheet_x\":1,\"sheet_y\":8,\"short_name\":\"ru\",\"short_names\":[\"ru\"],\"text\":null},{\"name\":\"REGIONAL INDICATOR SYMBOL LETTERS US\",\"unified\":\"1F1FA-1F1F8\",\"docomo\":\"\",\"au\":\"E573\",\"softbank\":\"E50C\",\"google\":\"FE4E6\",\"image\":\"1f1fa-1f1f8.png\",\"sheet_x\":1,\"sheet_y\":9,\"short_name\":\"us\",\"short_names\":[\"us\"],\"text\":null}]"
  },
  {
    "path": "scripts/google_fonts_download.sh",
    "content": "#!/usr/bin/env bash\n# vim:noet:sts=4:ts=4:sw=4:tw=120\n\n#=======================================================================================================================\n# (c) 2014 Clemens Lang, neverpanic.de\n# See https://neverpanic.de/blog/2014/03/19/downloading-google-web-fonts-for-local-hosting/ for details.\n#\n# With modifications by\n#  - Chris Jung, campino2k.de, and\n#  - Robert, github.com/rotx.\n#\n# Changelog:\n#   Version 1.1, 2014-06-21\n#     - Remove colons and spaces from file names for Windows compatibility\n#     - Add check for Bash version, 4.x is required\n#     - Correctly handle fonts without a local PostScript name\n#     - Change format('ttf') to format('truetype') in CSS output\n#     - Add license header and comments\n#     - Added sed extended regex flag detection\n#   Version 1.0, 2014-03-19\n#\n# License:\n#   Copyright (c) 2014, Clemens Lang\n#   All rights reserved.\n#\n#   Redistribution and use in source and binary forms, with or without modification, are permitted provided that the\n#   following conditions are met:\n#\n#   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following\n#      disclaimer.\n#\n#   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the\n#      following disclaimer in the documentation and/or other materials provided with the distribution.\n#\n#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n#   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n#   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n#   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n#   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#=======================================================================================================================\n\n#=======================================================================================================================\n# Place this script in the directory where you want the font files to be downloaded and a font.css file using the fonts\n# to be created. Adjust the list of fonts in the $families variable below with the names of the Google fonts you want to\n# use. If you like, you can adjust the $css variable to write the generated CSS to a different file. Not that this file\n# will be created and overwritten if it exists.\n#=======================================================================================================================\n\ndeclare -a families\nfamilies+=('Open+Sans:400')\nfamilies+=('Open+Sans:600')\n\n# Adjust this is you want the created file to have a different name. Note that this file will be overwritten!\ncss=\"font.css\"\nurl=\"http://fonts.googleapis.com/css?family=Open+Sans:400,600\"\n\n#=======================================================================================================================\n# No user-serviceable parts below this line. If you just want to use this script, you can stop reading here.\n#\n# If you made modifications you'd like to see merged into this script, please mail me a patch to 'cl' at 'clang' dot\n# 'name' or leave a comment at https://neverpanic.de/blog/2014/03/19/downloading-google-web-fonts-for-local-hosting/.\n#=======================================================================================================================\n\n# Ensure the bash version is new enough. If it isn't error out with a helpful error message rather than crashing later.\n# if [ ${BASH_VERSINFO[0]} -lt 4 ]; then\n#   echo \"Error: This script needs Bash 4.x to run.\" >&2\n#   exit 1\n# fi\n\n# Check whether sed is GNU or BSD sed, or rather, which parameter enables extended regex support. Note that GNU sed does\n# have -E as an undocumented compatibility option on some systems.\nif [ \"$(echo \"test\" | sed -E 's/([st]+)$/xx\\1/' 2>/dev/null)\" == \"texxst\" ]; then\n  ESED=\"sed -E\"\nelif [ \"$(echo \"test\" | sed -r 's/([st]+)$/xx\\1/' 2>/dev/null)\" == \"texxst\" ]; then\n  ESED=\"sed -r\"\nelse\n  echo \"Error: $(which sed) seems to lack extended regex support with -E or -r.\" >&2\n  exit 2\nfi\n\n# Store the useragents we're going to use to trick Google's servers into serving us the correct CSS file.\ndeclare -A useragent\nuseragent[eot]='Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'\nuseragent[woff]='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0'\nuseragent[svg]='Mozilla/4.0 (iPad; CPU OS 4_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/4.1 Mobile/9A405 Safari/7534.48.3'\nuseragent[ttf]='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.54.16 (KHTML, like Gecko) Version/5.1.4 Safari/534.54.16'\n\n# Clear the output file\n>\"$css\"\n\n# Loop over the fonts, and download them one-by-one\nfor family in \"${families[@]}\"; do\n  echo -n \"Downloading ${family}... \"\n  printf \"@font-face {\\n\" >>\"$css\"\n\n  # Extract name, Windows-safe filename, font style and font weight from the font family name\n  fontname=$(echo \"$family\" | awk -F : '{print $1}')\n  fontnameescaped=$(echo \"$family\" | $ESED 's/( |:)/_/g')\n  fontstyle=$(echo \"$family\" | awk -F : '{print $2}')\n  fontweight=$(echo \"$fontstyle\" | $ESED 's/italic$//g')\n\n  printf \"\\tfont-family: '%s';\\n\" \"$fontname\" >>\"$css\"\n\n  # $fontstyle could be bolditalic, bold, italic, normal, or nothing.\n  case \"$fontstyle\" in\n      *italic)\n          printf \"\\tfont-style: italic;\\n\" >>\"$css\"\n          ;;\n      *)\n          printf \"\\tfont-style: normal;\\n\" >>\"$css\"\n          ;;\n  esac\n\n  # Either bold, a number, or empty. If empty, default to \"normal\".\n  printf \"\\tfont-weight: %s;\\n\" \"${fontweight:-normal}\" >>\"$css\"\n\n  printf \"\\tsrc:\\n\" >>\"$css\"\n\n  # Determine the local names for the given fonts so we can use a locally-installed font if available.\n  local_name=$(curl -sf --get --data-urlencode \"family=$family\" \"$url\" | grep -E \"src:\" | $ESED \"s/^.*src: local\\\\('([^']+)'\\\\),.*$/\\\\1/g\")\n  local_postscript_name=$(curl -sf --get --data-urlencode \"family=$family\" \"$url\" | grep -E \"src:\" | $ESED \"s/^.*, local\\\\('([^']+)'\\\\),.*$/\\\\1/g\")\n\n  # Some fonts don't have a local PostScript name.\n  printf \"\\t\\tlocal('%s'),\\n\" \"$local_name\" >>\"$css\"\n  if [ -n \"$local_postscript_name\" ]; then\n      printf \"\\t\\tlocal('%s'),\\n\" \"$local_postscript_name\" >>\"$css\"\n  fi\n\n  # For each font format, download the font file and print the corresponding CSS statements.\n  for uakey in eot woff ttf svg; do\n      echo -n \"$uakey \"\n\n      # Download Google's CSS and throw some regex at it to find the font's URL\n      if [ \"$uakey\" != \"svg\" ]; then\n          pattern=\"http:\\\\/\\\\/[^\\\\)]+\\\\.$uakey\"\n      else\n          pattern=\"http:\\\\/\\\\/[^\\\\)]+\"\n      fi\n      file=$(curl -sf -A \"${useragent[$uakey]}\" --get --data-urlencode \"family=$family\" \"$url\" | grep -Eo \"$pattern\" | sort -u)\n      printf \"\\t\\t/* from %s */\\n\" \"$file\" >>\"$css\"\n      if [ \"$uakey\" == \"svg\" ]; then\n          # SVG fonts need the font after a hash symbol, so extract the correct name from Google's CSS\n          svgname=$(echo \"$file\" | $ESED 's/^[^#]+#(.*)$/\\1/g')\n      fi\n      # Actually download the font file\n      curl -sfL \"$file\" -o \"${fontnameescaped}.$uakey\"\n\n      # Generate the CSS statements required to include the downloaded file.\n      case \"$uakey\" in\n          eot)\n              printf \"\\t\\turl('%s?#iefix') format('embedded-opentype'),\\n\" \"${fontnameescaped}.$uakey\" >>\"$css\"\n              ;;\n          woff)\n              printf \"\\t\\turl('%s') format('woff'),\\n\" \"${fontnameescaped}.$uakey\" >>\"$css\"\n              ;;\n          ttf)\n              printf \"\\t\\turl('%s') format('truetype'),\\n\" \"${fontnameescaped}.$uakey\" >>\"$css\"\n              ;;\n          svg)\n              printf \"\\t\\turl('%s#%s') format('svg');\\n\" \"${fontnameescaped}.${uakey}\" \"$svgname\" >>\"$css\"\n              ;;\n      esac\n  done\n\n  printf \"}\\n\" >>\"$css\"\n  echo\ndone"
  },
  {
    "path": "scripts/ua_handler.js",
    "content": "var fs = require('fs'), path = require('path');\nvar uaList = fs.readFileSync(path.join(__dirname, 'ua.txt'));\n\n\nuaList = uaList.toString().split('\\n');\n\n\nvar OSs = {};\nvar browsers = {};\nvar browserVersions = {};\nvar unknown = [];\n\nvar osMatch = {\n\tios: /iOS|iPhone OS/i,\n\tandroid: /Android/i,\n\tlinux: /Linux/i,\n\twin: /Windows/i,\n\tosx: /Mac|OS X/i,\n\tblackberry: /BlackBerry|BB10/i,\n\tseries60: /Series 60|Series60/i,\n\tseries40: /Series 40|Series40/i,\n\tj2me: /J2ME|MIDP/i\n};\n\nvar browserMatch = {\n\topera: /opera/i,\n\tie: /msie|trident\\//i,\n\tchrome: /chrome/i,\n\tchromium: /chromium/i,\n\tsafari: /safari|AppleWebKit/i,\n\tfirefox: /firefox/i,\n\tblackberry: /BlackBerry/i\n};\n\nvar featureMatch = {\n\tipad: /ipad/i,\n\topera_mobile: /opera mini|opera mobi/i,\n  opera_mini: /opera mini/i,\n  blackberry: /blackberry/i\n};\n\nuaList.forEach(function (uaName) {\n\tvar os = 'unknown';\n\tfor (var curOs in osMatch) {\n\t\tif (uaName.match(osMatch[curOs])) {\n\t\t\tos = curOs;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tvar browser = 'unknown';\n\tfor (var curBrowser in browserMatch) {\n\t\tif (uaName.match(browserMatch[curBrowser])) {\n\t\t\tbrowser = curBrowser;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tvar version = (\n\t\tuaName.match(/MSIE ([\\d.]+)/) ||\n\t\tuaName.match( /.+(?:me|ox|on|rv|it|era|opr|ie)[\\/: ]([\\d.]+)/) ||\n\t\t[0,'0']\n\t)[1];\n\n\tif (!OSs[os]) {\n\t\tOSs[os] = 1;\n\t} else {\n\t\tOSs[os]++;\n\t}\n\n\tif (!browsers[os + ' ' + browser]) {\n\t\tbrowsers[os + ' ' + browser] = 1;\n\t} else {\n\t\tbrowsers[os + ' ' + browser]++;\n\t}\n\n\tif (os == 'unknown' || browser == 'unknown') {\n\t\tunknown.push(uaName);\n\t}\n\n\tif (!browserVersions[os + ' ' + browser + ' ' + version]) {\n\t\tbrowserVersions[os + ' ' + browser + ' ' + version] = 1;\n\t} else {\n\t\tbrowserVersions[os + ' ' + browser + ' ' + version]++;\n\t}\n\n})\n\n\nconsole.log(OSs);\nconsole.log(browsers);\nconsole.log(browserVersions);\n// console.log(unknown);\n\n"
  },
  {
    "path": "test/test-init.js",
    "content": "'use strict'\n/* global ConfigStorage, Config */\n\n;(function initTestApplication () {\n  ConfigStorage.get('layout_selected', 'i18n_locale', function (params) {\n    var locale = params[1]\n    var defaultLocale = 'en-us'\n    var bootReady = {\n      dom: false,\n      i18n_ng: false,\n      i18n_messages: false,\n      i18n_fallback: false\n    }\n\n    if (!locale) {\n      locale = (navigator.language || '').toLowerCase()\n      locale = Config.I18n.aliases[locale] || locale\n    }\n    for (var i = 0; i < Config.I18n.supported.length; i++) {\n      if (Config.I18n.supported[i] === locale) {\n        Config.I18n.locale = locale\n        break\n      }\n    }\n    bootReady.i18n_ng = Config.I18n.locale === defaultLocale // Already included\n\n    $.getJSON('base/js/locales/' + Config.I18n.locale + '.json').success(function (json) {\n      Config.I18n.messages = json\n      bootReady.i18n_messages = true\n      if (Config.I18n.locale === defaultLocale) { // No fallback, leave empty object\n        bootReady.i18n_fallback = true\n      }\n    })\n\n    if (Config.I18n.locale !== defaultLocale) {\n      $.getJSON('base/js/locales/' + defaultLocale + '.json').success(function (json) {\n        Config.I18n.fallback_messages = json\n        bootReady.i18n_fallback = true\n      })\n    }\n  })\n})()\n"
  },
  {
    "path": "test/unit/controllers/AppFooterControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('AppFooterController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.LayoutSwitchService = {\n      serviceFlag: false,\n      switchLayout: function (parameter) {\n        this.serviceFlag = true\n      }\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$controller = _$controller_\n\n      this.$scope = _$rootScope_.$new()\n      this.$controller('AppFooterController', {\n        $scope: this.$scope,\n        LayoutSwitchService: this.LayoutSwitchService\n      })\n    })\n  })\n\n  // define tests\n  it('calls the right function', function (done) {\n    expect(this.LayoutSwitchService.serviceFlag).toBe(false)\n    this.$scope.switchLayout(true)\n    expect(this.LayoutSwitchService.serviceFlag).toBe(true)\n    done()\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/AppImPanelControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine */\n\ndescribe('AppImPanelController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    inject(function (_$controller_, _$rootScope_) {\n      this.$scope = _$rootScope_.$new()\n      this.$scope.$on = jasmine.createSpy('$on')\n      _$controller_('AppImPanelController', { $scope: this.$scope })\n    })\n  })\n\n  // define tests\n  it('sets $on(user_update) to no-operation function', function (done) {\n    expect(this.$scope.$on).toHaveBeenCalledWith('user_update', angular.noop)\n    done()\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/AppLangSelectControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, xit */\n\ndescribe('AppLangSelectController', function () {\n  beforeEach(module('ui.bootstrap'))\n  beforeEach(module('myApp.services'))\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    inject(function (_$controller_, _$rootScope_, _, Storage, ErrorService, AppRuntimeManager) {\n      this.$controller = _$controller_\n      this.$scope = _$rootScope_.$new()\n\n      this.$controller('AppLangSelectController', {\n        $scope: this.$scope,\n        _: _,\n        Storage: Storage,\n        ErrorService: ErrorService,\n        AppRuntimeManager: AppRuntimeManager\n      })\n    })\n  })\n\n  it('holds the supportedLocales', function () {\n    expect(this.$scope.supportedLocales).toBeDefined()\n  })\n\n  it('holds langNames', function () {\n    expect(this.$scope.langNames).toBeDefined()\n  })\n\n  it('holds the current locale', function () {\n    expect(this.$scope.curLocale).toBeDefined()\n  })\n\n  it('has a locale form', function () {\n    expect(this.$scope.form).toBeDefined()\n    expect(this.$scope.form.locale).toBeDefined()\n  })\n\n  it('allows to select a locale', function () {\n    expect(this.$scope.localeSelect).toBeDefined()\n  })\n\n  describe('when the user switches the locale', function () {\n    describe('and confirms the dialogue', function () {\n      xit('reloads the app', function (done) {\n        done()\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/AppWelcomeControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('AppWelcomeController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.ChangelogNotifyService = {\n      checkUpdate: function () {}\n    }\n\n    this.LayoutSwitchService = {\n      start: function () {}\n    }\n\n    this.MtpApiManager = {\n      getUserID: function () {\n        return {\n          then: function () {}\n        }\n      }\n    }\n\n    inject(function (_$controller_, _$rootScope_, _$location_) {\n      this.$controller = _$controller_\n      this.$rootScope = _$rootScope_\n      this.$location = _$location_\n      this.$scope = _$rootScope_.$new()\n\n      this.$controller('AppWelcomeController', {\n        $scope: this.$scope,\n        $location: this.$location,\n        MtpApiManager: this.MtpApiManager,\n        ErrorService: this.ErrorService,\n        ChangelogNotifyService: this.ChangelogNotifyService,\n        LayoutSwitchService: this.LayoutSwitchService\n      })\n    })\n  })\n\n  // https://stackoverflow.com/a/36460924\n  it('executes a dummy spec', function (done) {\n    expect(true).toBe(true)\n    done()\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/ChangelogModalControlelerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, Config */\n\ndescribe('ChangeLogModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.modal = {\n      modalFlag: false,\n      open: function (data) {\n        this.modalFlag = true\n      }\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$controller = _$controller_\n\n      this.$scope = _$rootScope_.$new()\n\n      this.$controller('ChangelogModalController', {\n        $scope: this.$scope,\n        $modal: this.modal\n      })\n    })\n  })\n\n  // define tests\n  it('will have standard data when no function is called', function (done) {\n    expect(this.$scope.changelogHidden).toBe(false)\n    expect(this.$scope.changelogShown).toBe(false)\n    expect(this.$scope.currentVersion).toBe(Config.App.version)\n    done()\n  })\n\n  it('will show the changelog', function (done) {\n    this.$scope.showAllVersions()\n    expect(this.$scope.changelogHidden).toBe(false)\n    expect(this.$scope.changelogShown).toBe(true)\n    done()\n  })\n\n  it('will allow to show any version when \"changelogShown\" is true', function (done) {\n    this.$scope.changelogShown = true\n    expect(this.$scope.canShowVersion(null)).toBe(true)\n    expect(this.$scope.canShowVersion('0.0.1')).toBe(true)\n    expect(this.$scope.canShowVersion('0.1.0')).toBe(true)\n    expect(this.$scope.canShowVersion('1.0.0')).toBe(true)\n    done()\n  })\n\n  it('will allow the version to be shown when the current verion is bigger than the last function', function (done) {\n    expect(this.$scope.canShowVersion('100.100.100')).toBe(true)\n    done()\n  })\n\n  it('won\\'t allow the version to be shown when it is smaller than the current version', function (done) {\n    expect(this.$scope.changelogHidden).toBe(false)\n    expect(this.$scope.canShowVersion('0.0.0')).toBe(false)\n    expect(this.$scope.changelogHidden).toBe(true)\n    done()\n  })\n\n  it('will call modal when the changeUsername function is called', function (done) {\n    expect(this.modal.modalFlag).toBe(false)\n    this.$scope.changeUsername()\n    expect(this.modal.modalFlag).toBe(true)\n    done()\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/CountrySelectModalControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, afterEach, spyOn, jasmine, Config, SearchIndexManager */\n\ndescribe('CountrySelectModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(inject(function (_$controller_, _$rootScope_, ___) {\n    this.$controller = _$controller_\n    this.$rootScope = _$rootScope_\n    this._ = ___\n\n    this.$scope = _$rootScope_.$new()\n    this.createController = function () {\n      this.$controller('CountrySelectModalController', {\n        $scope: this.$scope,\n        $modalInstance: {},\n        $rootScope: this.$rootScope,\n        _: this._\n      })\n    }\n\n    spyOn(SearchIndexManager, 'indexObject').and.callThrough()\n  }))\n\n  beforeEach(function () {\n    this.ConfigCountryCodes = Config.CountryCodes\n    this.testData = {\n      singleCode: {\n        countryCode: ['NL', 'country_select_modal_country_nl', '+31'],\n        countryCode_full: 'NL Netherlands +31',\n        countryPhoneSets: [{ name: 'Netherlands', code: '+31' }]\n      },\n      multipleCode: {\n        countryCode: ['VA', 'country_select_modal_country_va', '+39 06 698', '+379'],\n        countryCode_full: 'VA Vatican City +39 06 698 +379',\n        countryPhoneSets: [{ name: 'Vatican City', code: '+39 06 698' }, { name: 'Vatican City', code: '+379' }]\n      },\n      multipleCode2: {\n        countryCode: ['AB', 'country_select_modal_country_ab', '+7 840', '+7 940', '+995 44'],\n        countryCode_full: 'AB Abkhazia +7 840 +7 940 +995 44',\n        countryPhoneSets: [{ name: 'Abkhazia', code: '+7 840' }, { name: 'Abkhazia', code: '+7 940' }, { name: 'Abkhazia', code: '+995 44' }]\n      },\n      allSetsSorted: function () {\n        return [].concat(this.multipleCode2.countryPhoneSets, this.singleCode.countryPhoneSets, this.multipleCode.countryPhoneSets)\n      },\n      allSetsUnsorted: function () {\n        return [].concat(this.singleCode.countryPhoneSets, this.multipleCode2.countryPhoneSets, this.multipleCode.countryPhoneSets)\n      }\n    }\n  })\n\n  afterEach(function () {\n    Config.CountryCodes = this.ConfigCountryCodes\n  })\n\n  // The tests before controller initiation.\n  // In order to mock Config data\n\n  it('initiates Country to select', function (done) {\n    Config.CountryCodes = [this.testData.singleCode.countryCode]\n    var expected = this.testData.singleCode.countryCode_full\n\n    this.createController()\n\n    expect(SearchIndexManager.indexObject).toHaveBeenCalledWith(0, expected, jasmine.any(Object))\n    done()\n  })\n\n  it('initiates Countriy to select with 2 (or more) country codes', function (done) {\n    Config.CountryCodes = [this.testData.multipleCode.countryCode]\n    var expected = this.testData.multipleCode.countryCode_full\n\n    this.createController()\n\n    expect(SearchIndexManager.indexObject).toHaveBeenCalledWith(0, expected, jasmine.any(Object))\n    done()\n  })\n\n  it('initiates Countries to select', function (done) {\n    Config.CountryCodes = [this.testData.singleCode.countryCode, this.testData.multipleCode.countryCode]\n    var expected1 = this.testData.singleCode.countryCode_full\n    var expected2 = this.testData.multipleCode.countryCode_full\n\n    this.createController()\n\n    expect(SearchIndexManager.indexObject).toHaveBeenCalledWith(0, expected1, jasmine.any(Object))\n    expect(SearchIndexManager.indexObject).toHaveBeenCalledWith(1, expected2, jasmine.any(Object))\n    done()\n  })\n\n  describe('(after initiation)', function () {\n    beforeEach(function () {\n      Config.CountryCodes = [this.testData.singleCode.countryCode, this.testData.multipleCode2.countryCode, this.testData.multipleCode.countryCode]\n      this.createController()\n    })\n\n    it('initiates the right values', function (done) {\n      expect(this.$scope.search).toEqual({})\n      expect(this.$scope.slice).toEqual({limit: 20, limitDelta: 20})\n      done()\n    })\n\n    it('creates a sorted list of all selectable countries', function (done) {\n      this.$rootScope.$digest()\n      var expected = this.testData.allSetsSorted()\n\n      expect(this.$scope.countries).toEqual(expected)\n      done()\n    })\n\n    it('creates a sorted list of all selectable countries for an empty string-input', function (done) {\n      this.$rootScope.$digest()\n      this.$scope.search.query = ''\n      this.$rootScope.$digest()\n      var expected = this.testData.allSetsSorted()\n\n      expect(this.$scope.countries).toEqual(expected)\n      done()\n    })\n\n    describe(', when an input is given,', function () {\n      beforeEach(function () {\n        this.$rootScope.$digest()\n        this.$scope.search.query = 'A'\n      })\n\n      it('creates a sorted list of all countries containing the input', function (done) {\n        var expected = this.testData.allSetsSorted()\n\n        expect(this.$scope.countries).toEqual(expected)\n\n        this.$rootScope.$digest()\n        expected = this.testData.multipleCode2.countryPhoneSets\n\n        expect(this.$scope.countries).toEqual(expected)\n        done()\n      })\n\n      it('restore the original list when the input is deleted', function (done) {\n        this.$rootScope.$digest()\n        this.$scope.search.query = ''\n        this.$rootScope.$digest()\n\n        var expected = this.testData.allSetsSorted()\n\n        expect(this.$scope.countries).toEqual(expected)\n        done()\n      })\n\n      it('restore the original list when the input is changed', function (done) {\n        this.$rootScope.$digest()\n        this.$scope.search.query = 'Ne'\n        this.$rootScope.$digest()\n\n        var expected = this.testData.singleCode.countryPhoneSets\n\n        expect(this.$scope.countries).toEqual(expected)\n        done()\n      })\n    })\n\n    describe(', when no sorting is available,', function () {\n      beforeEach(function () {\n        this.StringCompare = String.prototype.localeCompare\n        String.prototype.localeCompare = null\n      })\n\n      afterEach(function () {\n        String.prototype.localeCompare = this.StringCompare\n      })\n\n      it('creates a list of all selectable countries', function (done) {\n        this.$rootScope.$digest()\n        var expected = this.testData.allSetsUnsorted()\n\n        expect(this.$scope.countries).toEqual(expected)\n        done()\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/DocumentModalControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine, spyOn */\n\ndescribe('DocumentModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.AppDocsManager = {\n      wrapForHistory: jasmine.createSpy('wrapForHistory'),\n      saveDocFile: jasmine.createSpy('saveDocFile')\n    }\n\n    this.ErrorService = {\n      $input: {},\n      confirm: function (message) {\n        this.$input = message\n        return {\n          then: function (f) {\n            f()\n          }\n        }\n      }\n    }\n\n    this.PeersSelectService = {\n      $input: {},\n      selectPeer: function (options) {\n        this.$input = options\n        return {\n          then: function (f) {\n            f('Peerselected')\n          }\n        }\n      }\n    }\n\n    this.AppMessagesManager = {\n      deleteMessages: jasmine.createSpy('deleteMessages')\n    }\n\n    this.$modalInstance = {\n      dismiss: jasmine.createSpy('dismissModal')\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$rootScope = _$rootScope_\n      this.$scope = this.$rootScope.$new()\n      this.$scope.docID = 'randomdoc'\n\n      this.$controller = _$controller_\n\n      spyOn(this.$rootScope, '$broadcast').and.callThrough()\n      spyOn(this.$scope, '$on').and.callThrough()\n\n      this.$controller('DocumentModalController', {\n        $scope: this.$scope,\n        $rootScope: this.$rootScope,\n        $modalInstance: this.$modalInstance,\n        PeersSelectService: this.PeersSelectService,\n        AppMessagesManager: this.AppMessagesManager,\n        AppDocsManager: this.AppDocsManager,\n        AppPeersManager: {},\n        ErrorService: this.ErrorService\n      })\n    })\n  })\n\n  // define tests\n  it('sets the document in the scope', function (done) {\n    expect(this.AppDocsManager.wrapForHistory).toHaveBeenCalledWith(this.$scope.docID)\n    done()\n  })\n\n  it('forwards a message with a document', function (done) {\n    this.$scope.messageID = 'id039'\n    var messageID = this.$scope.messageID\n\n    this.$scope.forward()\n    expect(this.PeersSelectService.$input).toEqual({canSend: true})\n    expect(this.$scope.$broadcast).toHaveBeenCalledWith('history_focus', {\n      peerString: 'Peerselected',\n      attachment: {\n        _: 'fwd_messages',\n        id: [messageID]\n      }\n    })\n    done()\n  })\n\n  it('deletes a message with a document', function (done) {\n    this.$scope.messageID = 'id123'\n\n    this.$scope.delete()\n    expect(this.ErrorService.$input).toEqual({type: 'MESSAGE_DELETE'})\n    expect(this.AppMessagesManager.deleteMessages).toHaveBeenCalledWith([this.$scope.messageID])\n    done()\n  })\n\n  it('downloads the document', function (done) {\n    this.$scope.download()\n    expect(this.AppDocsManager.saveDocFile).toHaveBeenCalledWith(this.$scope.docID)\n    done()\n  })\n\n  it('can not delete a document not linked to a message', function (done) {\n    this.$scope.messageID = 'id42'\n\n    var historyUpdate = {}\n    this.$rootScope.$broadcast('history_delete', historyUpdate)\n    expect(this.$scope.$on).toHaveBeenCalledWith('history_delete', jasmine.any(Function))\n    expect(this.$modalInstance.dismiss).not.toHaveBeenCalled()\n\n    historyUpdate.msgs = {}\n    this.$rootScope.$broadcast('history_delete', historyUpdate)\n    expect(this.$scope.$on).toHaveBeenCalledWith('history_delete', jasmine.any(Function))\n    expect(this.$modalInstance.dismiss).not.toHaveBeenCalled()\n    done()\n  })\n\n  describe('when the document is related to the message', function () {\n    beforeEach(function () {\n      this.historyUpdate = {\n        msgs: {}\n      }\n    })\n    it('delete that document', function (done) {\n      this.$scope.messageID = 'id33'\n      this.historyUpdate.msgs[this.$scope.messageID] = 'an update for id33'\n\n      this.$rootScope.$broadcast('history_delete', this.historyUpdate)\n      expect(this.$scope.$on).toHaveBeenCalledWith('history_delete', jasmine.any(Function))\n      expect(this.$modalInstance.dismiss).toHaveBeenCalled()\n      done()\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/EmbedModalController.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine */\n\ndescribe('EmbedModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.AppWebPagesManager = {\n      wrapForFull: jasmine.createSpy('wrapForFull')\n    }\n\n    this.ErrorService = {\n      input: {},\n      confirm: function (message) {\n        this.input = message\n        return {\n          then: function (f) {\n            f()\n          }\n        }\n      }\n    }\n\n    this.PeersSelectService = {\n      input: {},\n      selectPeer: function (options) {\n        this.input = options\n        return {\n          then: function (f) {\n            f('Peerselected')\n          }\n        }\n      }\n    }\n\n    this.AppMessagesManager = {\n      deleteMessages: jasmine.createSpy('deleteMessages')\n    }\n\n    this.$modalInstance = {\n      dismiss: jasmine.createSpy('dismissModal')\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$rootScope = _$rootScope_\n      this.$rootScope.$broadcast = jasmine.createSpy('$broadcast')\n      this.$scope = this.$rootScope.$new()\n      this.$scope.webpageID = 'www.notRelevant.com'\n\n      _$controller_('EmbedModalController', {\n        $q: {},\n        $scope: this.$scope,\n        $rootScope: this.$rootScope,\n        $modalInstance: this.$modalInstance,\n        PeersSelectService: this.PeersSelectService,\n        AppMessagesManager: this.AppMessagesManager,\n        AppPeersManager: {},\n        AppPhotosManager: {},\n        AppWebPagesManager: this.AppWebPagesManager,\n        ErrorService: this.ErrorService\n      })\n    })\n  })\n\n  // define tests\n  it('sets the embeded webpage in the scope', function (done) {\n    expect(this.$scope.nav).toEqual({})\n    expect(this.AppWebPagesManager.wrapForFull).toHaveBeenCalledWith(this.$scope.webpageID)\n    done()\n  })\n\n  it('forwards a message with an embeded link', function (done) {\n    this.$scope.messageID = 'id1234234'\n    var messageID = this.$scope.messageID\n\n    this.$scope.forward()\n    expect(this.PeersSelectService.input).toEqual({canSend: true})\n    expect(this.$scope.$broadcast).toHaveBeenCalledWith('history_focus', {\n      peerString: 'Peerselected',\n      attachment: {\n        _: 'fwd_messages',\n        id: [messageID]\n      }\n    })\n    done()\n  })\n\n  it('deletes a message with an embeded link', function (done) {\n    this.$scope.messageID = 'id979565673'\n\n    this.$scope.delete()\n    expect(this.ErrorService.input).toEqual({type: 'MESSAGE_DELETE'})\n    expect(this.AppMessagesManager.deleteMessages).toHaveBeenCalledWith([this.$scope.messageID])\n    done()\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/ImportContactModalControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine */\n\ndescribe('ImportContactModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.modalInstance = {\n      close: jasmine.createSpy('close'),\n      dismiss: jasmine.createSpy('dismiss')\n    }\n\n    this.randomID = 123456852\n\n    function thenFinallyFactory (input) {\n      return {\n        then: function (callback) {\n          callback(input)\n          return {\n            finally: function (callback) {\n              callback()\n            }\n          }\n        }\n      }\n    }\n\n    this.AppUsersManager = {\n      thenValue: null,\n      importContact: function (phone, first, last) {\n        this.input = {\n          phone: phone,\n          first: first,\n          last: last\n        }\n        return thenFinallyFactory(this.thenValue)\n      }\n    }\n\n    this.ErrorService = {\n      show: jasmine.createSpy('show')\n    }\n\n    this.PhonebookContactsService = {\n      thenValue: false,\n      isAvailable: function () {\n        return false\n      },\n      openPhonebookImport: function () {\n        var then = thenFinallyFactory(this.thenValue)\n        return {\n          result: then\n        }\n      }\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$controller = _$controller_\n      this.$rootScope = _$rootScope_\n\n      this.$scope = _$rootScope_.$new()\n      this.createController = function () {\n        this.$controller('ImportContactModalController', {\n          $scope: this.$scope,\n          $modalInstance: this.modalInstance,\n          $rootScope: this.$rootScope,\n          AppUsersManager: this.AppUsersManager,\n          ErrorService: this.ErrorService,\n          PhonebookContactsService: this.PhonebookContactsService\n        })\n      }\n    })\n  })\n\n  it('can create a controller when no imported contacts are defined', function (done) {\n    this.createController()\n\n    expect(this.$scope.importContact).toEqual({})\n    done()\n  })\n\n  it('can create a controller when imported contacts are defined', function (done) {\n    this.$scope.importContact = { non_empty: true }\n    this.createController()\n    var expected = { non_empty: true }\n\n    expect(this.$scope.importContact).toEqual(expected)\n    done()\n  })\n\n  describe('(when the controller is created), ', function () {\n    beforeEach(function () {\n      this.createController()\n    })\n\n    it('does nothing when no phonenumber was entered', function (done) {\n      this.$scope.doImport()\n\n      expect(this.$scope.progress).not.toBeDefined()\n\n      this.$scope.importContact = {\n        first_name: 'bob'\n      }\n      expect(this.$scope.progress).not.toBeDefined()\n      done()\n    })\n\n    describe('when contact-information is added, it', function () {\n      beforeEach(function () {\n        this.$scope.importContact = {\n          phone: '+316132465798'\n        }\n      })\n\n      it('can handle phoneNumber that are not telegram users', function (done) {\n        this.$scope.doImport()\n\n        expect(this.ErrorService.show).toHaveBeenCalledWith({ error: {code: 404, type: 'USER_NOT_USING_TELEGRAM'} })\n        expect(this.modalInstance.close).toHaveBeenCalledWith(null)\n        expect(this.$scope.progress.enabled).not.toBeDefined()\n        done()\n      })\n\n      it('can import contacts that are telegram users', function (done) {\n        this.AppUsersManager.thenValue = this.randomID\n        this.$scope.doImport()\n\n        expect(this.ErrorService.show).not.toHaveBeenCalled()\n        expect(this.modalInstance.close).toHaveBeenCalledWith(this.randomID)\n        expect(this.$scope.progress.enabled).not.toBeDefined()\n        expect(this.AppUsersManager.input).toEqual({phone: '+316132465798', first: '', last: ''})\n        done()\n      })\n\n      it('can handle contacts with first and last name', function (done) {\n        this.$scope.importContact.first_name = 'jan'\n        this.$scope.importContact.last_name = 'wandelaar'\n        this.$scope.doImport()\n\n        expect(this.AppUsersManager.input).toEqual({phone: '+316132465798', first: 'jan', last: 'wandelaar'})\n        done()\n      })\n    })\n\n    it('can not import contacts from a phonebook if none were found', function (done) {\n      this.$scope.importPhonebook()\n\n      expect(this.modalInstance.dismiss).toHaveBeenCalled()\n      done()\n    })\n\n    it('can import contacts from a phonebook', function (done) {\n      this.PhonebookContactsService.thenValue = {0: 'dummy'}\n      this.$scope.importPhonebook()\n\n      expect(this.modalInstance.close).toHaveBeenCalledWith('dummy')\n      done()\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/PasswordRecoveryModalControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine */\n\ndescribe('PasswordRecoveryModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.PasswordManager = {\n      errorField: null,\n      recover: function () {\n        return this\n      },\n      then: function (callback, error) {\n        if (!this.errorField) {\n          callback({})\n        } else {\n          error(this.errorField)\n        }\n        return {\n          finally: function (final) {\n            final()\n          }\n        }\n      }\n    }\n\n    this.ErrorService = { alert: jasmine.createSpy('alert') }\n    this.modalInstance = {\n      close: jasmine.createSpy('close'),\n      dismiss: jasmine.createSpy('dismiss')\n    }\n\n    inject(function (_$controller_, _$rootScope_, ___) {\n      this.$controller = _$controller_\n      this.$scope = _$rootScope_.$new()\n      this.$scope.recovery = {}\n\n      this.$controller('PasswordRecoveryModalController', {\n        $scope: this.$scope,\n        $q: {},\n        _: ___,\n        PasswordManager: this.PasswordManager,\n        MtpApiManager: {},\n        ErrorService: this.ErrorService,\n        $modalInstance: this.modalInstance\n      })\n    })\n  })\n\n  it('can handle a successful password change', function (done) {\n    this.$scope.checkCode()\n\n    expect(this.$scope.recovery.updating).toBe(true)\n    expect(this.ErrorService.alert).toHaveBeenCalledWith('Password deactivated', 'You have disabled Two-Step Verification.')\n    expect(this.modalInstance.close).toHaveBeenCalled()\n    done()\n  })\n\n  describe('when an error occurs', function () {\n    beforeEach(function () {\n      this.PasswordManager.errorField = {}\n    })\n\n    it('cancels the recovery', function (done) {\n      this.$scope.checkCode()\n\n      expect(this.$scope.recovery.updating).not.toBeDefined()\n      expect(this.ErrorService.alert).not.toHaveBeenCalled()\n      expect(this.modalInstance.close).not.toHaveBeenCalled()\n      done()\n    })\n\n    it('can handle the error for an empty code', function (done) {\n      this.PasswordManager.errorField.type = 'CODE_EMPTY'\n      this.$scope.checkCode()\n\n      expect(this.$scope.recovery.error_field).toEqual('code')\n      done()\n    })\n\n    it('can handle the error for an invalid code', function (done) {\n      this.PasswordManager.errorField.type = 'CODE_INVALID'\n      this.$scope.checkCode()\n\n      expect(this.$scope.recovery.error_field).toEqual('code')\n      done()\n    })\n\n    it('can handle the error for an empty password', function (done) {\n      this.PasswordManager.errorField.type = 'PASSWORD_EMPTY'\n      this.$scope.checkCode()\n\n      expect(this.modalInstance.dismiss).toHaveBeenCalled()\n      done()\n    })\n\n    it('can handle the error for the unavailability of the recovery', function (done) {\n      this.PasswordManager.errorField.type = 'PASSWORD_RECOVERY_NA'\n      this.$scope.checkCode()\n\n      expect(this.modalInstance.dismiss).toHaveBeenCalled()\n      done()\n    })\n\n    it('can handle the error for an expired recovery', function (done) {\n      this.PasswordManager.errorField.type = 'PASSWORD_RECOVERY_EXPIRED'\n      this.$scope.checkCode()\n\n      expect(this.modalInstance.dismiss).toHaveBeenCalled()\n      done()\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/PeerSelectControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('PeerSelectController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    // The modalInstance will propably usually give a boolean as return.\n    // However, for testing purposes it is important to gain knowledge about the input of the function\n    this.$modalInstance = {\n      close: function (arr) {\n        return arr\n      }\n    }\n\n    this.oneSecond = 1000\n\n    this.AppPeersManager = {\n      getPeerString: function (str) {\n        return 'P'.concat(str)\n      },\n      getPeerID: function (str) {\n        return str.slice(-1)\n      },\n      getPeer: function (id) {\n        return id.concat('peer')\n      }\n    }\n\n    this.promise = {\n      promiseFlag: false,\n      then: function (f) {\n        this.$promiseFlag = true\n        f()\n      }\n    }\n\n    var promise = this.promise\n\n    this.$q = {\n      when: function () {\n        return promise\n      }\n    }\n\n    this.ErrorService = {\n      $promiseData: {},\n      confirm: function (data) {\n        this.$promiseData = data\n        return promise\n      }\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$controller = _$controller_\n      this.$scope = _$rootScope_.$new()\n\n      // The controller is created in the test in order to test different initial content of scope variables.\n      this.createController = function () {\n        this.$controller('PeerSelectController', {\n          $scope: this.$scope,\n          $modalInstance: this.$modalInstance,\n          $q: this.$q,\n          AppPeersManager: this.AppPeersManager,\n          ErrorService: this.ErrorService\n        })\n      }\n    })\n  })\n\n  it('initialises properties', function (done) {\n    this.createController()\n\n    // Set timer to give the controller time to resolve.\n    setTimeout(function () {\n      expect(this.$scope.selectedPeers).toBeDefined()\n      expect(this.$scope.selectedPeersIDs).toBeDefined()\n      expect(this.$scope.selectedCount).toBeDefined()\n    }, this.oneSecond)\n\n    done()\n  })\n\n  it('compiles with a shareLinkPromise that resolves', function (done) {\n    var expected = 'testURL'\n    var oneSecond = this.oneSecond\n    this.$scope.shareLinkPromise = {\n      then: function (resolve, reject) {\n        setTimeout(resolve(expected), oneSecond)\n      }\n    }\n    this.createController()\n\n    function afterLoad () {\n      expect(this.$scope.shareLink.url).toBe(expected)\n    }\n\n    function duringLoad () {\n      expect(this.$scope.shareLink.loading).toBe(true)\n      expect(this.$scope.shareLink.url).not.toBeDefined()\n      setTimeout(afterLoad, oneSecond)\n    }\n\n    setTimeout(duringLoad, oneSecond)\n    done()\n  })\n\n  it('compiles with a shareLinkPromise that doesn\\'t resolve', function (done) {\n    var oneSecond = this.oneSecond\n    this.$scope.shareLinkPromise = {\n      then: function (resolve, reject) {\n        setTimeout(reject(), oneSecond)\n      }\n    }\n    this.createController()\n\n    function afterLoad () {\n      expect(this.$scope.shareLink).not.toBeDefined()\n    }\n\n    function duringLoad () {\n      expect(this.$scope.shareLink.loading).toBe(true)\n      setTimeout(afterLoad, oneSecond)\n    }\n\n    setTimeout(duringLoad, oneSecond)\n    done()\n  })\n\n  describe('after initialisation', function () {\n    beforeEach(function () {\n      this.createController()\n    })\n\n    it('can select and submit a single dialog without confirmed type', function (done) {\n      this.$scope.dialogSelect('dialogX')\n\n      expect(this.ErrorService.$promiseData).toEqual({})\n      expect(this.promise.$promiseFlag).toBe(true)\n\n      done()\n    })\n\n    it('can select and submit a single dialog with confirmed type', function (done) {\n      this.$scope.confirm_type = 'INVITE_TO_GROUP'\n      this.$scope.dialogSelect('dialogX')\n\n      var peerId = 'X'\n      var expected = {\n        type: 'INVITE_TO_GROUP',\n        peer_id: peerId,\n        peer_data: this.AppPeersManager.getPeer(peerId)\n      }\n\n      expect(this.ErrorService.$promiseData).toEqual(expected)\n      expect(this.promise.$promiseFlag).toBe(true)\n\n      done()\n    })\n\n    it('can select a dialog', function (done) {\n      this.$scope.multiSelect = true\n      this.$scope.dialogSelect('dialogX')\n\n      var expected = {\n        selectedPeers: 'Xpeer',\n        selectedPeerIDs: ['X']\n      }\n\n      expect(this.$scope.selectedPeers['X']).toBe(expected.selectedPeers)\n      expect(this.$scope.selectedCount).toBe(1)\n      expect(this.$scope.selectedPeerIDs).toEqual(expected.selectedPeerIDs)\n\n      done()\n    })\n\n    it('can select multiple dialogs', function (done) {\n      this.$scope.multiSelect = true\n      this.$scope.dialogSelect('dialogX')\n      this.$scope.dialogSelect('dialogZ')\n      this.$scope.dialogSelect('dialogY')\n\n      var expected = ['Y', 'Z', 'X']\n\n      expect(this.$scope.selectedCount).toBe(3)\n      expect(this.$scope.selectedPeerIDs).toEqual(expected)\n\n      done()\n    })\n\n    it('can unselect a dialog', function (done) {\n      this.$scope.multiSelect = true\n      this.$scope.selectedCount = 1\n      this.$scope.selectedPeers['Y'] = 'aYPeer'\n      this.$scope.selectedPeerIDs.unshift('Y')\n\n      this.$scope.dialogSelect('dialogY')\n\n      var expected = []\n\n      expect(this.$scope.selectedPeers['Y']).not.toBeDefined()\n      expect(this.$scope.selectedCount).toBe(0)\n      expect(this.$scope.selectedPeerIDs).toEqual(expected)\n\n      done()\n    })\n\n    it('can select multiple dialogs', function (done) {\n      this.$scope.multiSelect = true\n      this.$scope.dialogSelect('dialogX')\n      this.$scope.dialogSelect('dialogZ')\n      this.$scope.dialogSelect('dialogY')\n      this.$scope.dialogSelect('dialogZ')\n\n      var expected = ['Y', 'X']\n\n      expect(this.$scope.selectedCount).toBe(2)\n      expect(this.$scope.selectedPeerIDs).toEqual(expected)\n\n      done()\n    })\n\n    it('can\\'t submit a empty set of dialogs', function (done) {\n      expect(this.$scope.submitSelected()).not.toBeDefined()\n\n      done()\n    })\n\n    it('can submit one dialog', function (done) {\n      this.$scope.selectedCount = 1\n      this.$scope.selectedPeers['test'] = 'peer'\n      var expected = ['Ptest']\n      expect(this.$scope.submitSelected()).toEqual(expected)\n\n      done()\n    })\n\n    it('can submit multiple dialogs', function (done) {\n      this.$scope.selectedCount = 3\n      this.$scope.selectedPeers['test1'] = this.$scope.selectedPeers['test2'] = this.$scope.selectedPeers['test4'] = 'peer'\n\n      var expected = ['Ptest4', 'Ptest2', 'Ptest1']\n      expect(this.$scope.submitSelected()).toEqual(expected)\n\n      done()\n    })\n\n    it('can toggle', function (done) {\n      var broadcastFlag = ''\n      this.$scope.$broadcast = function (input) { broadcastFlag = input }\n\n      this.$scope.toggleSearch()\n      expect(broadcastFlag).toBe('dialogs_search_toggle')\n\n      done()\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/ProfileEditModalControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine */\n\ndescribe('ProfileEditModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    var id = 42\n    this.randomID = id\n\n    this.MtpApiManager = {\n      errorField: null,\n      getUserID: function () {\n        return {\n          then: function (callback) {\n            callback(id)\n          }\n        }\n      },\n      invokeApi: function (action, params) {\n        return this\n      },\n      then: function (callback, error) {\n        if (!this.errorField) {\n          callback({})\n        } else {\n          error(this.errorField)\n        }\n        return {\n          finally: function (final) {\n            final()\n          }\n        }\n      }\n    }\n\n    this.AppUsersManager = {\n      getUser: function (userId) {\n        return {\n          first_name: 'John',\n          last_name: 'Doe'\n        }\n      },\n      saveApiUser: jasmine.createSpy('saveApiUser')\n    }\n    this.$modalInstance = { close: jasmine.createSpy('close') }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$controller = _$controller_\n      this.$scope = _$rootScope_.$new()\n\n      this.$controller('ProfileEditModalController', {\n        $scope: this.$scope,\n        $modalInstance: this.$modalInstance,\n        AppUsersManager: this.AppUsersManager,\n        MtpApiManager: this.MtpApiManager\n      })\n    })\n  })\n\n  it('should initiate the right scope', function (done) {\n    expect(this.$scope.profile).toEqual({first_name: 'John', last_name: 'Doe'})\n    expect(this.$scope.error).toEqual({})\n    done()\n  })\n\n  it('can send a successful profile update request', function (done) {\n    this.$scope.updateProfile()\n\n    expect(this.AppUsersManager.saveApiUser).toHaveBeenCalled()\n    expect(this.$modalInstance.close).toHaveBeenCalled()\n    done()\n  })\n\n  it('can handle empty name/surname', function (done) {\n    delete this.$scope.profile.first_name\n    delete this.$scope.profile.last_name\n    this.$scope.updateProfile()\n\n    expect(this.AppUsersManager.saveApiUser).toHaveBeenCalled()\n    expect(this.$modalInstance.close).toHaveBeenCalled()\n    done()\n  })\n\n  it('can handle an invalid first name error', function (done) {\n    this.MtpApiManager.errorField = {type: 'FIRSTNAME_INVALID'}\n    this.$scope.updateProfile()\n\n    expect(this.$scope.error.field).toEqual('first_name')\n    done()\n  })\n\n  it('can handle an invalid last name error', function (done) {\n    this.MtpApiManager.errorField = {type: 'LASTNAME_INVALID'}\n    this.$scope.updateProfile()\n\n    expect(this.$scope.error.field).toEqual('last_name')\n    done()\n  })\n\n  it('can handle an unmodified name error', function (done) {\n    this.MtpApiManager.errorField = {type: 'NAME_NOT_MODIFIED'}\n    this.$scope.updateProfile()\n\n    expect(this.$modalInstance.close).toHaveBeenCalled()\n    done()\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/UsernameEditModalControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine */\n\ndescribe('UsernameEditModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.MtpApiManager = {\n      errorField: false,\n      isValid: true,\n      invokeApi: function () {\n        return this\n      },\n      getUserID: function () {\n        return this\n      },\n      then: function (callback, error) {\n        if (!this.errorField) {\n          callback(this.isValid)\n        } else {\n          error(this.errorField)\n        }\n        return {\n          finally: function (final) {\n            final()\n          }\n        }\n      }\n    }\n\n    this.AppUsersManager = {\n      saveApiUser: jasmine.createSpy('saveApiUser'),\n      getUser: function (id) {\n        return { username: 'bob' }\n      }\n    }\n\n    this.modalInstance = {\n      close: jasmine.createSpy('close')\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$controller = _$controller_\n      this.$scope = _$rootScope_.$new()\n\n      this.$controller('UsernameEditModalController', {\n        $scope: this.$scope,\n        $modalInstance: this.modalInstance,\n        AppUsersManager: this.AppUsersManager,\n        MtpApiManager: this.MtpApiManager\n      })\n    })\n  })\n\n  it('constructs the information for the modal', function (done) {\n    var expected = {\n      username: 'bob'\n    }\n    expect(this.$scope.profile).toEqual(expected)\n    expect(this.$scope.error).toEqual({})\n    done()\n  })\n\n  it('can handle a successful update of the username', function (done) {\n    this.$scope.updateUsername()\n\n    expect(this.$scope.checked).toEqual({})\n    expect(this.AppUsersManager.saveApiUser).toHaveBeenCalled()\n    expect(this.modalInstance.close).toHaveBeenCalled()\n    done()\n  })\n\n  it('can handle a successful update of an empty/undefined username', function (done) {\n    delete this.$scope.profile.username\n    this.$scope.updateUsername()\n\n    expect(this.$scope.checked).toEqual({})\n    expect(this.AppUsersManager.saveApiUser).toHaveBeenCalled()\n    expect(this.modalInstance.close).toHaveBeenCalled()\n    done()\n  })\n\n  it('can handle an unsuccessful update of an unmodified username', function (done) {\n    this.MtpApiManager.errorField = { type: 'USERNAME_NOT_MODIFIED' }\n    this.$scope.updateUsername()\n\n    expect(this.$scope.checked).not.toBeDefined()\n    expect(this.AppUsersManager.saveApiUser).not.toHaveBeenCalled()\n    expect(this.modalInstance.close).toHaveBeenCalled()\n    done()\n  })\n\n  it('can check an empty username on change', function (done) {\n    this.$scope.profile.username = {}\n    var expected = {}\n\n    this.$scope.$digest()\n    expect(this.$scope.checked).toEqual(expected)\n    done()\n  })\n\n  it('can check an empty string as username', function (done) {\n    this.$scope.profile.username = ''\n    var expected = {}\n\n    this.$scope.$digest()\n    expect(this.$scope.checked).toEqual(expected)\n    done()\n  })\n\n  it('can check the initial username', function (done) {\n    // Previous username is expected to be valid\n    this.$scope.$digest()\n    var expected = true\n\n    expect(this.$scope.checked.success).toBe(expected)\n    done()\n  })\n\n  it('does not check anything when the name is not changed', function (done) {\n    this.$scope.$digest()\n    delete this.$scope.checked.success\n    this.$scope.$digest()\n\n    expect(this.$scope.checked.success).not.toBeDefined()\n    done()\n  })\n\n  it('can check an invalid username submission', function (done) {\n    this.MtpApiManager.isValid = false\n    this.$scope.$digest()\n    var expected = true\n\n    expect(this.$scope.checked.error).toBe(expected)\n    done()\n  })\n\n  it('can check an invalid username submission 2', function (done) {\n    this.MtpApiManager.errorField = { type: 'USERNAME_INVALID' }\n    this.$scope.$digest()\n    var expected = true\n\n    expect(this.$scope.checked.error).toBe(expected)\n    done()\n  })\n})\n"
  },
  {
    "path": "test/unit/controllers/VideoModalControllerSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine, spyOn */\n\ndescribe('VideoModalController', function () {\n  beforeEach(module('myApp.controllers'))\n\n  beforeEach(function () {\n    this.AppDocsManager = {\n      wrapVideoForFull: jasmine.createSpy('wrapVideoForFull'),\n      saveDocFile: jasmine.createSpy('saveDocFile')\n    }\n\n    this.ErrorService = {\n      input: {},\n      confirm: function (message) {\n        this.input = message\n        return {\n          then: function (f) {\n            f()\n          }\n        }\n      }\n    }\n\n    this.PeersSelectService = {\n      input: {},\n      selectPeer: function (options) {\n        this.input = options\n        return {\n          then: function (f) {\n            f('Peerselected')\n          }\n        }\n      }\n    }\n\n    this.AppMessagesManager = {\n      deleteMessages: jasmine.createSpy('deleteMessages')\n    }\n\n    this.$modalInstance = {\n      dismiss: jasmine.createSpy('dismissModal')\n    }\n\n    inject(function (_$controller_, _$rootScope_) {\n      this.$rootScope = _$rootScope_\n      this.$scope = this.$rootScope.$new()\n      this.$scope.docID = 'randomvideo'\n\n      this.$controller = _$controller_\n\n      spyOn(this.$rootScope, '$broadcast').and.callThrough()\n      spyOn(this.$scope, '$on').and.callThrough()\n\n      this.$controller('VideoModalController', {\n        $scope: this.$scope,\n        $rootScope: this.$rootScope,\n        $modalInstance: this.$modalInstance,\n        PeersSelectService: this.PeersSelectService,\n        AppMessagesManager: this.AppMessagesManager,\n        AppDocsManager: this.AppDocsManager,\n        AppPeersManager: {},\n        ErrorService: this.ErrorService\n      })\n    })\n  })\n\n  // define tests\n  it('sets the video in the scope', function (done) {\n    expect(this.$scope.progress).toEqual({enabled: false})\n    expect(this.$scope.player).toEqual({})\n    expect(this.AppDocsManager.wrapVideoForFull).toHaveBeenCalledWith(this.$scope.docID)\n    done()\n  })\n\n  it('forwards a message with a video', function (done) {\n    this.$scope.messageID = 'id68567'\n    var messageID = this.$scope.messageID\n\n    this.$scope.forward()\n    expect(this.PeersSelectService.input).toEqual({canSend: true})\n    expect(this.$scope.$broadcast).toHaveBeenCalledWith('history_focus', {\n      peerString: 'Peerselected',\n      attachment: {\n        _: 'fwd_messages',\n        id: [messageID]\n      }\n    })\n    done()\n  })\n\n  it('deletes a message with a video', function (done) {\n    this.$scope.messageID = 'id235235'\n\n    this.$scope.delete()\n    expect(this.ErrorService.input).toEqual({type: 'MESSAGE_DELETE'})\n    expect(this.AppMessagesManager.deleteMessages).toHaveBeenCalledWith([this.$scope.messageID])\n    done()\n  })\n\n  it('downloads the document (video)', function (done) {\n    this.$scope.download()\n    expect(this.AppDocsManager.saveDocFile).toHaveBeenCalledWith(this.$scope.docID)\n    done()\n  })\n\n  it('delete a video linked to a message', function (done) {\n    this.$scope.messageID = 'id2352'\n\n    this.$rootScope.$broadcast('history_delete')\n    expect(this.$scope.$on).toHaveBeenCalledWith('history_delete', jasmine.any(Function))\n    expect(this.$modalInstance.dismiss).not.toHaveBeenCalled()\n    done()\n  })\n\n  it('can not delete a video not linked to a message', function (done) {\n    this.$scope.messageID = 'id42'\n\n    var historyUpdate = {}\n    this.$rootScope.$broadcast('history_delete', historyUpdate)\n    expect(this.$scope.$on).toHaveBeenCalledWith('history_delete', jasmine.any(Function))\n    expect(this.$modalInstance.dismiss).not.toHaveBeenCalled()\n\n    historyUpdate.msgs = {}\n    this.$rootScope.$broadcast('history_delete', historyUpdate)\n    expect(this.$scope.$on).toHaveBeenCalledWith('history_delete', jasmine.any(Function))\n    expect(this.$modalInstance.dismiss).not.toHaveBeenCalled()\n    done()\n  })\n\n  describe('when the video is related to the message', function () {\n    beforeEach(function () {\n      this.historyUpdate = {\n        msgs: {}\n      }\n    })\n    it('delete that video', function (done) {\n      this.$scope.messageID = 'id33'\n      this.historyUpdate.msgs[this.$scope.messageID] = 'an update for id33'\n\n      this.$rootScope.$broadcast('history_delete', this.historyUpdate)\n      expect(this.$scope.$on).toHaveBeenCalledWith('history_delete', jasmine.any(Function))\n      expect(this.$modalInstance.dismiss).toHaveBeenCalled()\n      done()\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/directives/myHeadDirective.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('myHead directive', function () {\n  beforeEach(module('myApp.templates'))\n  beforeEach(module('myApp.directives'))\n\n  beforeEach(inject(function (_$compile_, _$rootScope_) {\n    this.$compile = _$compile_\n    this.$rootScope = _$rootScope_\n  }))\n\n  it('compiles a my-head attribute', function () {\n    var compiledElement = this.$compile('<div my-head></div>')(this.$rootScope)\n    this.$rootScope.$digest()\n    expect(compiledElement.html()).toContain('tg_page_head')\n  })\n\n  it('compiles a my-head element', function () {\n    var compiledElement = this.$compile('<my-head></my-head>')(this.$rootScope)\n    this.$rootScope.$digest()\n    expect(compiledElement.html()).toContain('tg_page_head')\n  })\n})\n"
  },
  {
    "path": "test/unit/directives/myLangFooterDirective.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('myLangFooter directive', function () {\n  beforeEach(module('ui.bootstrap'))\n  beforeEach(module('myApp.templates'))\n  // ErrorServiceProvider in myApp.services is needed by\n  // AppLangSelectController in myApp.controllers\n  beforeEach(module('myApp.services'))\n  beforeEach(module('myApp.controllers'))\n  beforeEach(module('myApp.directives'))\n\n  beforeEach(inject(function (_$compile_, _$rootScope_) {\n    this.$compile = _$compile_\n    this.$rootScope = _$rootScope_\n  }))\n\n  it('compiles a my-lang-footer attribute', function () {\n    var compiledElement = this.$compile('<div my-lang-footer></div>')(this.$rootScope)\n    this.$rootScope.$digest()\n    expect(compiledElement.html()).toContain('footer_lang_link')\n    expect(compiledElement.html()).toContain('AppLangSelectController')\n  })\n\n  it('compiles a my-lang-footer element', function () {\n    var compiledElement = this.$compile('<my-lang-footer></my-lang-footer>')(this.$rootScope)\n    this.$rootScope.$digest()\n    expect(compiledElement.html()).toContain('footer_lang_link')\n    expect(compiledElement.html()).toContain('AppLangSelectController')\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/chatTitleFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('chatTitle filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_, ___) {\n    this.$filter = _$filter_\n    this._ = ___\n  }))\n\n  beforeEach(function () {\n    this.chatTitleFilter = this.$filter('chatTitle')\n  })\n\n  it('displays chat title deleted', function () {\n    var expected = this._('chat_title_deleted')\n    var actual = this.chatTitleFilter(null)\n\n    expect(actual).toEqual(expected)\n  })\n\n  it('displays the chat title', function () {\n    var chat = {\n      title: 'Telegraph is hot!'\n    }\n    var expected = chat.title\n    var actual = this.chatTitleFilter(chat)\n\n    expect(actual).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/dateOrTimeFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, tsNow*/\n\ndescribe('dateOrTime filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.dateOrTimeFilter = this.$filter('dateOrTime')\n\n    // https://stackoverflow.com/questions/4676195/why-do-i-need-to-multiply-unix-timestamps-by-1000-in-javascript\n    this.miliSecondsToSeconds = 1000\n    this.sevenDaysAgo = -3600 * 24 * 7\n    this.thirteenHoursAgo = -3600 * 13\n  })\n\n  it('can handle \"zero\"-values', function () {\n    var input = 0\n    var expected = ''\n    var result = this.dateOrTimeFilter(input, false)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can display the time based on timestamp', function () {\n    var input = tsNow(true)\n    // Outcome format expected: HH:MM AM/PM\n    var expected = this.$filter('date')(input * this.miliSecondsToSeconds, 'shortTime')\n    var result = this.dateOrTimeFilter(input, false)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can display the short date based on timestamp', function () {\n    var input = tsNow(true)\n    // Outcome format expected: (M or MM)/(D or DD)/YY\n    var expected = this.$filter('date')((input + this.sevenDaysAgo) * this.miliSecondsToSeconds, 'shortDate')\n    var result = this.dateOrTimeFilter(input + this.sevenDaysAgo, false)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can display the medium-size date based on timestamp', function () {\n    var input = tsNow(true)\n    // Outcome format expected: Month(3 letters) Day, Year\n    var expected = this.$filter('date')((input + this.sevenDaysAgo) * this.miliSecondsToSeconds, 'mediumDate')\n    var result = this.dateOrTimeFilter(input + this.sevenDaysAgo, true)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can display the day of the week (in short) based on timestamp', function () {\n    var input = tsNow(true)\n    // Outcome format expcected: Day of week in three letters (Mon, Tue, etc.)\n    var expected = this.$filter('date')((input + this.thirteenHoursAgo) * this.miliSecondsToSeconds, 'EEE')\n    var result = this.dateOrTimeFilter(input + this.thirteenHoursAgo, false)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can display the day of the week based on timestamp', function () {\n    var input = tsNow(true)\n    // Outcome format expcected: Day of week (Monday, Tuesday, etc.)\n    var expected = this.$filter('date')((input + this.thirteenHoursAgo) * this.miliSecondsToSeconds, 'EEEE')\n    var result = this.dateOrTimeFilter(input + this.thirteenHoursAgo, true)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/durationFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('duration filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.durationFilter = this.$filter('duration')\n  })\n\n  it('converts duration in seconds to a readable string', function () {\n    var input = 55\n    var expected = '0:55'\n    var result = this.durationFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 147\n    expected = '2:27'\n    result = this.durationFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts hours in seconds to readable string', function () {\n    var input = 7282\n    var expected = '2:01:22'\n    var result = this.durationFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 4201\n    expected = '1:10:01'\n    result = this.durationFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('returns \"zero\" when not a valid input was given', function () {\n    var input = 'not a number'\n    var expected = '0:00'\n    var result = this.durationFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = {}\n    result = this.durationFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = []\n    result = this.durationFilter(input)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/durationRemainsFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('durationRemains filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.durationRemainsFilter = this.$filter('durationRemains')\n  })\n\n  it('creates a readable string based on time and total time', function () {\n    var totalTime = 120  // two minutes\n    var currentTime = 100\n    var expected = '-0:20'\n    var result = this.durationRemainsFilter(currentTime, totalTime)\n\n    expect(result).toBe(expected)\n  })\n\n  // Other behaviour is tested in durationFilterSpec.js\n})\n"
  },
  {
    "path": "test/unit/filters/formatShortNumberFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('formatShortNumber filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.formatShortNumberFilter = this.$filter('formatShortNumber')\n  })\n\n  it('converts zero or undefined', function () {\n    var input = 0\n    var expected = '0'\n    var result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = undefined\n    result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts numbers below 1000 to string with same value', function () {\n    var input = 127\n    var expected = '127'\n    var result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 999\n    expected = '999'\n    result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts numbers between 1000 and 900000 to string with shortened value', function () {\n    var input = 1276\n    var expected = '1.3K'\n    var result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 35444\n    expected = '35K'\n    result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 899999\n    expected = '900K'\n    result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts numbers above 900000 to string with shortened value', function () {\n    var input = 900000\n    var expected = '0.9M'\n    var result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 76785646867\n    expected = '76786M'\n    result = this.formatShortNumberFilter(input)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/formatSizeFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('formatSize filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.formatSizeFilter = this.$filter('formatSize')\n  })\n\n  it('converts zero', function () {\n    var input = 0\n    var expected = '0'\n    var result = this.formatSizeFilter(input, false)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts sizes below 1024 to byte', function () {\n    var input = 234\n    var expected = '234 b'\n    var result = this.formatSizeFilter(input, false)\n\n    expect(result).toBe(expected)\n\n    input = 1023\n    expected = '1023 b'\n    result = this.formatSizeFilter(input, false)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts sizes between 1024 and 1048576 to KB', function () {\n    var input = 238994\n    var expected = '233 KB'\n    var result = this.formatSizeFilter(input, false)\n\n    expect(result).toBe(expected)\n\n    input = 1048575\n    expected = '1024 KB'\n    result = this.formatSizeFilter(input, false)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts sizes above 1048576 to MB', function () {\n    var input = 10485726\n    var expected = '10 MB'\n    var result = this.formatSizeFilter(input, false)\n\n    expect(result).toBe(expected)\n\n    input = 1048572676967876\n    expected = '999996830.9 MB'\n    result = this.formatSizeFilter(input, false)\n\n    expect(result).toBe(expected)\n\n    input = 10485726\n    expected = '10.0 MB'\n    result = this.formatSizeFilter(input, true)\n\n    expect(result).toBe(expected)\n\n    input = 1048572676967876\n    expected = '999996830.9 MB'\n    result = this.formatSizeFilter(input, true)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/formatSizeProgressFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('formatSizeProgress filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_, ___) {\n    this.$filter = _$filter_\n    this._ = ___\n  }))\n\n  beforeEach(function () {\n    this.formatSizeProgressFilter = this.$filter('formatSizeProgress')\n  })\n\n  it('can handle \"zero\"-input', function () {\n    var input = { total: 0 }\n    var expected = ''\n    var result = this.formatSizeProgressFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can format progress with different scale of magnitude', function () {\n    var input = { total: 1024, done: 1023 }\n    var expected = this._('format_size_progress', {done: '1023 b', total: '1 KB'})\n    var result = this.formatSizeProgressFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can format progress with the same scale of size', function () {\n    var input = { total: 2048, done: 1024 }\n    var expected = this._('format_size_progress_mulitple', {done: '1', total: '2', parts: 'KB'})\n    var result = this.formatSizeProgressFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  // Further testing for options is done in formatSizeFilterSpec.js\n})\n"
  },
  {
    "path": "test/unit/filters/myDateFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('myDate filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.myDateFilter = this.$filter('myDate')\n\n    // https://stackoverflow.com/questions/4676195/why-do-i-need-to-multiply-unix-timestamps-by-1000-in-javascript\n    this.miliSecondsToSeconds = 1000\n    this.dateFilter = this.$filter('date')\n  })\n\n  it('can create a date based on timestamp', function () {\n    var input = 1222222222\n    var expected = this.dateFilter(input * this.miliSecondsToSeconds, 'fullDate') // For CEST: 'Wednesday, September 24, 2008'\n    var result = this.myDateFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can recollect a date based on timestamp', function () {\n    var input = 12111114111\n    var expected = this.dateFilter(input * this.miliSecondsToSeconds, 'fullDate') // For CEST: 'Thursday, October 15, 2353'\n    var result1 = this.myDateFilter(input)\n\n    expect(result1).toBe(expected)\n\n    var result2 = this.myDateFilter(input)\n\n    expect(result2).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/nl2brFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('nl2br filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_, ___) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.nl2brFilter = this.$filter('nl2br')\n  })\n\n  it('replaces an enter by a break-tag', function () {\n    var input = 'Line one \\n Line 2'\n    var expected = 'Line one <br/> Line 2'\n    var result = this.nl2brFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('replaces enters by break-tags', function () {\n    var input = 'Line one \\n Line 2 \\n Line 3'\n    var expected = 'Line one <br/> Line 2 <br/> Line 3'\n    var result = this.nl2brFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('does not change the text if no enter is present', function () {\n    var input, expected\n    input = expected = 'Some random line with no enters'\n    var result = this.nl2brFilter(input)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/phoneNumberFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('phoneNumber filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.phoneNumberFilter = this.$filter('phoneNumber')\n  })\n\n  it('can handle \"zero\" values', function () {\n    var input\n    var expected = '+'\n    var result = this.phoneNumberFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = null\n    result = this.phoneNumberFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 0\n    result = this.phoneNumberFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('removes all non-digits from a phoneNumber', function () {\n    var input = '123nonnumber333333e3'\n    var expected = '+1233333333'\n    var result = this.phoneNumberFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('converts phone number to a readable phone number (for Russia)', function () {\n    // 7 is for russian Country calling code (https://en.wikipedia.org/wiki/Telephone_numbers_in_Europe)\n    var input = '71234567890'\n    var expected = '+7 (123) 456-78-90'\n    var result = this.phoneNumberFilter(input)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/realtiveTimeFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine, tsNow*/\n\ndescribe('relativeTime filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_, ___) {\n    this.$filter = _$filter_\n    this._ = ___\n  }))\n\n  beforeEach(function () {\n    this.minuteSpy = jasmine.createSpy()\n    this.hourSpy = jasmine.createSpy()\n    // local vars are used to prevent scoping problems\n    var ms = this.minuteSpy\n    var hs = this.hourSpy\n    this._.pluralize = function (msgid) {\n      if (msgid === 'relative_time_pluralize_minutes_ago') {\n        return ms\n      } else if (msgid === 'relative_time_pluralize_hours_ago') {\n        return hs\n      }\n    }\n\n    this.relativeTimeFilter = this.$filter('relativeTime', {$filter: this.$filter, _: this._})\n  })\n\n  it('can mark time as \"just now\"', function () {\n    var input = tsNow(true)\n    var expected = this._('relative_time_just_now')\n    var result = this.relativeTimeFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  // because the exact of tsNow in hard to estimate, a Spy is used instead of checking the return value\n  it('can convert time that is max. 1 hour away', function () {\n    var input = tsNow(true) - 3500\n    this.relativeTimeFilter(input)\n\n    expect(this.minuteSpy).toHaveBeenCalled()\n  })\n\n  // because the exact of tsNow in hard to estimate, a Spy is used instead of checking the return value\n  it('can convert time that is max. 24 hours away', function () {\n    var input = tsNow(true) - 86000\n    this.relativeTimeFilter(input)\n\n    expect(this.hourSpy).toHaveBeenCalled()\n  })\n\n  it('can convert time after 24 hours based on timestamp', function () {\n    var input = tsNow(true) - 1000000\n    var expected = this.$filter('dateOrTime')(input, true)\n    var result = this.relativeTimeFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  // Further testing on the dateOrTimeFilter is present in dateOrTimeFilterSpec.js\n})\n"
  },
  {
    "path": "test/unit/filters/richTextFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('richText filter', function () {\n  beforeEach(module('myApp.filters'))\n  beforeEach(module('ngSanitize')) // necessary for linky filter\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.richTextFilter = this.$filter('richText')\n  })\n\n  it('changes url to actual link', function () {\n    var input = 'a text that links to https://www.github.com'\n    var expected = 'a text that links to <a target=\"_blank\" href=\"https://www.github.com\">https://www.github.com</a>'\n    var result = this.richTextFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('changes urls to actual links', function () {\n    var input = 'a text that links to https://www.github.com and https://www.github.com/zhukov/webogram'\n    var expected = 'a text that links to <a target=\"_blank\" href=\"https://www.github.com\">https://www.github.com</a> and <a target=\"_blank\" href=\"https://www.github.com/zhukov/webogram\">https://www.github.com/zhukov/webogram</a>'\n    var result = this.richTextFilter(input)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/shortUrlFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('shortUrl filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    this.shortUrlFilter = this.$filter('shortUrl')\n  })\n\n  it('does not do anything if the input is not a string', function () {\n    var input = {}\n    var expected = input\n    var result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = []\n    expected = input\n    result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 11\n    expected = input\n    result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('removes \"http(s)\" from a Url', function () {\n    var input = 'https://github.com'\n    var expected = 'github.com'\n    var result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = 'http://github.com'\n    result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('does not remove other protocols from a Url', function () {\n    var input, expected\n    input = expected = 'ftp://github.com'\n    var result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = expected = 'irc://github.com'\n    result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n\n    input = expected = 'tg://github.com'\n    result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('removes \"www.\" from a Url', function () {\n    var input = 'www.github.com'\n    var expected = 'github.com'\n    var result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('removes \"https://\" and \"www.\" from a Url', function () {\n    var input = 'https://www.github.com'\n    var expected = 'github.com'\n    var result = this.shortUrlFilter(input)\n\n    expect(result).toBe(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/timeFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, Config */\n\ndescribe('time filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_) {\n    this.$filter = _$filter_\n  }))\n\n  beforeEach(function () {\n    // https://stackoverflow.com/questions/4676195/why-do-i-need-to-multiply-unix-timestamps-by-1000-in-javascript\n    this.miliSecondsToSeconds = 1000\n    this.dateFilter = this.$filter('date')\n  })\n\n  describe('on the mobile website', function () {\n    beforeEach(function () {\n      Config.Mobile = true\n      this.timeFilter = this.$filter('time')\n    })\n\n    it('can create a short time based on timestamp', function () {\n      var input = 1222\n      var expected = this.dateFilter(input * this.miliSecondsToSeconds, 'shortTime') // For CEST: '1:20 AM'\n      var result = this.timeFilter(input)\n\n      expect(result).toBe(expected)\n    })\n\n    it('can recollect a short time based on timestamp', function () {\n      var input = 121155\n      var expected = this.dateFilter(input * this.miliSecondsToSeconds, 'shortTime') // For CEST: '10:39 AM'\n      var result1 = this.timeFilter(input)\n\n      expect(result1).toBe(expected)\n\n      var result2 = this.timeFilter(input)\n\n      expect(result2).toBe(expected)\n    })\n  })\n\n  describe('on the desktop website', function () {\n    beforeEach(function () {\n      Config.Mobile = false\n      this.timeFilter = this.$filter('time')\n    })\n\n    it('can create a medium-size time based on timestamp', function () {\n      var input = 1222\n      var expected = this.dateFilter(input * this.miliSecondsToSeconds, 'mediumTime') // For CEST: '1:20:22 AM'\n      var result = this.timeFilter(input)\n\n      expect(result).toBe(expected)\n    })\n\n    it('can recollect a medium-size time on timestamp', function () {\n      var input = 121155\n      var expected = this.dateFilter(input * this.miliSecondsToSeconds, 'mediumTime') // For CEST: '10:39:15 AM'\n      var result1 = this.timeFilter(input)\n\n      expect(result1).toBe(expected)\n\n      var result2 = this.timeFilter(input)\n\n      expect(result2).toBe(expected)\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/userFirstNameFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('userFirstName filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_, ___) {\n    this.$filter = _$filter_\n    this._ = ___\n  }))\n\n  beforeEach(function () {\n    this.userFirstNameFilter = this.$filter('userFirstName')\n  })\n\n  it('displays user first name deleted', function () {\n    var expected = this._('user_first_name_deleted')\n    var actual = this.userFirstNameFilter(null)\n\n    expect(actual).toEqual(expected)\n  })\n\n  it('displays the first name', function () {\n    var user = {\n      first_name: 'John'\n    }\n    var expected = user.first_name\n    var actual = this.userFirstNameFilter(user)\n\n    expect(actual).toEqual(expected)\n  })\n\n  it('displays the last name alternatively', function () {\n    var user = {\n      last_name: 'Doe'\n    }\n    var expected = user.last_name\n    var actual = this.userFirstNameFilter(user)\n\n    expect(actual).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/userNameFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach */\n\ndescribe('userName filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_, ___) {\n    this.$filter = _$filter_\n    this._ = ___\n  }))\n\n  beforeEach(function () {\n    this.userNameFilter = this.$filter('userName')\n  })\n\n  it('displays user name deleted', function () {\n    var expected = this._('user_name_deleted')\n    var actual = this.userNameFilter(null)\n\n    expect(actual).toEqual(expected)\n  })\n\n  it('displays the first name', function () {\n    var user = {\n      first_name: 'John'\n    }\n    var expected = user.first_name\n    var actual = this.userNameFilter(user)\n\n    expect(actual).toEqual(expected)\n  })\n\n  it('displays the last name', function () {\n    var user = {\n      last_name: 'Doe'\n    }\n    var expected = user.last_name\n    var actual = this.userNameFilter(user)\n\n    expect(actual).toEqual(expected)\n  })\n\n  it('displays both, the first and the last name', function () {\n    var user = {\n      first_name: 'John',\n      last_name: 'Doe'\n    }\n    var expected = user.first_name + ' ' + user.last_name\n    var actual = this.userNameFilter(user)\n\n    expect(actual).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "test/unit/filters/userStatusFilterSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach , tsNow*/\n\ndescribe('userStatus filter', function () {\n  beforeEach(module('myApp.filters'))\n\n  beforeEach(inject(function (_$filter_, ___) {\n    this.$filter = _$filter_\n    this._ = ___\n  }))\n\n  beforeEach(function () {\n    this.userStatusFilter = this.$filter('userStatus')\n  })\n\n  it('can recognize support users', function () {\n    var input = { id: 1000 }\n    var expected = this._('user_status_support')\n    var result = this.userStatusFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  it('can recognize service notifications', function () {\n    // id 777000 is the id of the service notifications channel\n    var input = { id: 777000 }\n    var expected = this._('user_status_service_notifications')\n    var result = this.userStatusFilter(input)\n\n    expect(result).toBe(expected)\n  })\n\n  describe('when the user is not a bot, it', function () {\n    it('can handle empty user statuses', function () {\n      var input = null\n      var expected = this._('user_status_long_ago')\n      var result = this.userStatusFilter(input)\n\n      expect(result).toBe(expected)\n\n      input = { id: 12321 }\n      result = this.userStatusFilter(input)\n      expect(result).toBe(expected)\n\n      input = { id: 12321, status: {} }\n      result = this.userStatusFilter(input)\n      expect(result).toBe(expected)\n\n      input = { id: 12321, status: {_: null} }\n      result = this.userStatusFilter(input)\n      expect(result).toBe(expected)\n\n      input = { id: 12321, status: {_: null}, pFlag: {} }\n      result = this.userStatusFilter(input)\n      expect(result).toBe(expected)\n\n      input = { id: 12321, status: {_: null}, pFlags: {bot: false} }\n      result = this.userStatusFilter(input)\n      expect(result).toBe(expected)\n    })\n\n    it('can display an online status', function () {\n      var input = { id: 12321, status: {_: 'userStatusOnline'} }\n      var expected = this._('user_status_online')\n      var result = this.userStatusFilter(input)\n\n      expect(result).toBe(expected)\n    })\n\n    it('can display that the user was recently online', function () {\n      var input = { id: 12321, status: {_: 'userStatusRecently'} }\n      var expected = this._('user_status_recently')\n      var result = this.userStatusFilter(input)\n\n      expect(result).toBe(expected)\n    })\n\n    it('can display that the user was offline since a certain time', function () {\n      var time = tsNow(true) - 360000 // 100 hours ago\n      var relativeTimeFilter = this.$filter('relativeTime')\n      var input = { id: 12321, status: {_: 'userStatusOffline', was_online: time} }\n      var expected = this._('user_status_last_seen', relativeTimeFilter(time))\n      var result = this.userStatusFilter(input)\n\n      expect(result).toBe(expected)\n    })\n\n    // Further testing of relativeTimeFilter is done in relativeTimeFilterSpec.js\n\n    it('can display that the user was online last week', function () {\n      var input = { id: 12321, status: {_: 'userStatusLastWeek'} }\n      var expected = this._('user_status_last_week')\n      var result = this.userStatusFilter(input)\n\n      expect(result).toBe(expected)\n    })\n\n    it('can display that the user was online last month', function () {\n      var input = { id: 12321, status: {_: 'userStatusLastMonth'} }\n      var expected = this._('user_status_last_month')\n      var result = this.userStatusFilter(input)\n\n      expect(result).toBe(expected)\n    })\n  })\n\n  describe('when the user is a bot', function () {\n    beforeEach(function () {\n      this.input = { id: 12321, status: {_: null}, pFlags: {bot: true} }\n    })\n\n    it('it can tell that the user is a bot', function () {\n      var expected = this._('user_status_bot')\n      var result = this.userStatusFilter(this.input)\n\n      expect(result).toBe(expected)\n    })\n\n    describe('and the bot has privacy settings', function () {\n      beforeEach(function () {\n        this.privacySettings = true\n      })\n\n      it('it can tell that it is a bot with no acces to messages', function () {\n        var expected = this._('user_status_bot_privacy')\n        var result = this.userStatusFilter(this.input, this.privacySettings)\n\n        expect(result).toBe(expected)\n      })\n\n      it('it can tell that it is a bot with acces to messages', function () {\n        // Flags indicate true/false\n        this.input.pFlags.bot_chat_history = true\n        var expected = this._('user_status_bot_noprivacy')\n        var result = this.userStatusFilter(this.input, this.privacySettings)\n\n        expect(result).toBe(expected)\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "test/unit/services/PhonebookContactsServiceSpec.js",
    "content": "'use strict'\n/* global describe, it, inject, expect, beforeEach, jasmine, xit */\n\ndescribe('PhonebookContactsService', function () {\n  beforeEach(module('ui.bootstrap'))\n  beforeEach(module('myApp.services'))\n\n  beforeEach(inject(function (_PhonebookContactsService_) {\n    this.PhonebookContactsService = _PhonebookContactsService_\n  }))\n\n  describe('Public API:', function () {\n    it('checks availability', function () {\n      expect(this.PhonebookContactsService.isAvailable).toBeDefined()\n    })\n\n    it('open the phonebook for import', function () {\n      expect(this.PhonebookContactsService.openPhonebookImport).toBeDefined()\n    })\n\n    it('get phonebook contacts', function () {\n      expect(this.PhonebookContactsService.getPhonebookContacts).toBeDefined()\n    })\n\n    describe('usage', function () {\n      describe('of isAvailable()', function () {\n        it('returns false in most cases', function (done) {\n          expect(this.PhonebookContactsService.isAvailable()).toBe(false)\n          done()\n        })\n      })\n\n      describe('of openPhonebookImport()', function () {\n        beforeEach(function () {\n          this.$modal = {\n            open: jasmine.createSpy('open')\n          }\n        })\n\n        xit('opens a modal', function () {\n          this.PhonebookContactsService.openPhonebookImport()\n          expect(this.$modal.open).toHaveBeenCalled()\n        })\n      })\n\n      describe('of getPhonebookContacts()', function () {\n        xit('will get rejected in most cases', function (done) {\n          var promise = this.PhonebookContactsService.getPhonebookContacts()\n          promise.finally(function () {\n            expect(promise.isFullfilled()).toBe(true)\n            done()\n          })\n        })\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "update-angular.sh",
    "content": "#! /bin/sh\nif [ -n \"$1\" ]; then\n  mkdir tmp\n  curl http://code.angularjs.org/$1/angular-$1.zip -L -o tmp/angular.zip\n  rm -fr app/vendor/angular\n  unzip tmp/angular.zip -d app/vendor\n  mv app/vendor/angular-$1 app/vendor/angular\n  rm -fr app/vendor/angular/docs tmp\nelse\n  echo \"Usage: update-angular <version>\"\nfi\n"
  },
  {
    "path": "webogram.sublime-project",
    "content": "{\n\t\"folders\":\n\t[\n\t\t{\n\t\t\t\"follow_symlinks\": true,\n\t\t\t\"path\": \".\",\n\t\t\t\"folder_exclude_patterns\": [\"*dist*\", \".publish\", \"node_modules\", \"releases\", \".tx\", \"css\"],\n\t\t\t\"file_exclude_patterns\": [\"*.zip\", \"templates.js\"]\n\t\t}\n\t]\n}\n"
  }
]